diff mbox

i2c: designware-platdrv: get fast/std speed scl high/low count from DT

Message ID 1459927680-5480-1-git-send-email-jszhang@marvell.com (mailing list archive)
State New, archived
Headers show

Commit Message

Jisheng Zhang April 6, 2016, 7:28 a.m. UTC
Sometimes, it's convenient to define the scl's high/low count directly,
e.g HW people would do some measurement then directly give out the
optimum counts. Previously, we solved the sda falling time and scl
falling time by i2c_dw_scl_hcnt() and i2c_dw_scl_lcnt(), then put them
into dt, but what we really care isn't the sda/scl falling time.

From another side, the dw_i2c_acpi_configure() on ACPI platform also
get hcnt/lcnt values rather than the sda/scl falling time from ACPI
method, we want similar feature for DT platforms.

Signed-off-by: Jisheng Zhang <jszhang@marvell.com>
---
 Documentation/devicetree/bindings/i2c/i2c-designware.txt | 16 ++++++++++++++++
 drivers/i2c/busses/i2c-designware-platdrv.c              |  8 ++++++++
 2 files changed, 24 insertions(+)

Comments

Rob Herring (Arm) April 7, 2016, 5:57 p.m. UTC | #1
On Wed, Apr 06, 2016 at 03:28:00PM +0800, Jisheng Zhang wrote:
> Sometimes, it's convenient to define the scl's high/low count directly,
> e.g HW people would do some measurement then directly give out the
> optimum counts. Previously, we solved the sda falling time and scl
> falling time by i2c_dw_scl_hcnt() and i2c_dw_scl_lcnt(), then put them
> into dt, but what we really care isn't the sda/scl falling time.

This is just so you can put specific clock count instead of converting 
from nanoseconds with standard properties or you gain some additional 
control of the timing. If only the former, then I prefer we stick with 
the common properties.

> From another side, the dw_i2c_acpi_configure() on ACPI platform also
> get hcnt/lcnt values rather than the sda/scl falling time from ACPI
> method, we want similar feature for DT platforms.

That's nice, but not really a reason IMO.

> 
> Signed-off-by: Jisheng Zhang <jszhang@marvell.com>
> ---
>  Documentation/devicetree/bindings/i2c/i2c-designware.txt | 16 ++++++++++++++++
>  drivers/i2c/busses/i2c-designware-platdrv.c              |  8 ++++++++
>  2 files changed, 24 insertions(+)
Andy Shevchenko April 7, 2016, 6:05 p.m. UTC | #2
On Wed, Apr 6, 2016 at 10:28 AM, Jisheng Zhang <jszhang@marvell.com> wrote:
> Sometimes, it's convenient to define the scl's high/low count directly,
> e.g HW people would do some measurement then directly give out the
> optimum counts. Previously, we solved the sda falling time and scl
> falling time by i2c_dw_scl_hcnt() and i2c_dw_scl_lcnt(), then put them
> into dt, but what we really care isn't the sda/scl falling time.
>
> From another side, the dw_i2c_acpi_configure() on ACPI platform also
> get hcnt/lcnt values rather than the sda/scl falling time from ACPI
> method, we want similar feature for DT platforms.
>

Instead of duplicating some words maybe better to explicitly define
two groups of parameters and one which supersedes the other.

> Signed-off-by: Jisheng Zhang <jszhang@marvell.com>
> ---
>  Documentation/devicetree/bindings/i2c/i2c-designware.txt | 16 ++++++++++++++++
>  drivers/i2c/busses/i2c-designware-platdrv.c              |  8 ++++++++
>  2 files changed, 24 insertions(+)
>
> diff --git a/Documentation/devicetree/bindings/i2c/i2c-designware.txt b/Documentation/devicetree/bindings/i2c/i2c-designware.txt
> index fee26dc..05176fbf 100644
> --- a/Documentation/devicetree/bindings/i2c/i2c-designware.txt
> +++ b/Documentation/devicetree/bindings/i2c/i2c-designware.txt
> @@ -20,6 +20,22 @@ Optional properties :
>   - i2c-sda-falling-time-ns : should contain the SDA falling time in nanoseconds.
>     This value which is by default 300ns is used to compute the tHIGH period.
>
> + - i2c-ss-scl-high-count : should contain the standard speed i2c clock SCL high
> +   count. If defined, the i2c-scl-falling-time-ns and i2c-sda-falling-time-ns
> +   will be ignored.
> +
> + - i2c-ss-scl-low-count : should contain the standard speed i2c clock SCL low
> +   count. If defined, the i2c-scl-falling-time-ns and i2c-sda-falling-time-ns
> +   will be ignored.
> +
> + - i2c-fs-scl-high-count : should contain the fast speed i2c clock SCL high
> +   count. If defined, the i2c-scl-falling-time-ns and i2c-sda-falling-time-ns
> +   will be ignored.
> +
> + - i2c-fs-scl-low-count : should contain the fast speed i2c clock SCL low
> +   count. If defined, the i2c-scl-falling-time-ns and i2c-sda-falling-time-ns
> +   will be ignored.
> +
>  Example :
>
>         i2c@f0000 {
> diff --git a/drivers/i2c/busses/i2c-designware-platdrv.c b/drivers/i2c/busses/i2c-designware-platdrv.c
> index d656657..8739a60 100644
> --- a/drivers/i2c/busses/i2c-designware-platdrv.c
> +++ b/drivers/i2c/busses/i2c-designware-platdrv.c
> @@ -188,6 +188,14 @@ static int dw_i2c_plat_probe(struct platform_device *pdev)
>                                          &dev->scl_falling_time);
>                 device_property_read_u32(&pdev->dev, "clock-frequency",
>                                          &clk_freq);
> +               device_property_read_u16(&pdev->dev, "i2c-ss-scl-high-count",
> +                                        &dev->ss_hcnt);
> +               device_property_read_u16(&pdev->dev, "i2c-ss-scl-low-count",
> +                                        &dev->ss_lcnt);
> +               device_property_read_u16(&pdev->dev, "i2c-fs-scl-high-count",
> +                                        &dev->fs_hcnt);
> +               device_property_read_u16(&pdev->dev, "i2c-fs-scl-low-count",
> +                                        &dev->fs_lcnt);
>         }
>
>         if (has_acpi_companion(&pdev->dev))
> --
> 2.8.0.rc3
>
Jisheng Zhang April 13, 2016, 12:11 p.m. UTC | #3
Dear Rob,

On Thu, 7 Apr 2016 12:57:59 -0500 Rob Herring wrote:

> On Wed, Apr 06, 2016 at 03:28:00PM +0800, Jisheng Zhang wrote:
> > Sometimes, it's convenient to define the scl's high/low count directly,
> > e.g HW people would do some measurement then directly give out the
> > optimum counts. Previously, we solved the sda falling time and scl
> > falling time by i2c_dw_scl_hcnt() and i2c_dw_scl_lcnt(), then put them
> > into dt, but what we really care isn't the sda/scl falling time.  
> 
> This is just so you can put specific clock count instead of converting 
> from nanoseconds with standard properties or you gain some additional 
> control of the timing. If only the former, then I prefer we stick with 
> the common properties.

To be honest, both. Let me show how I gain additional control of the timing
with this patch while I can't do this w/o it.

I want the similar high percent of SCL high for both standard-mode and
fast-mode. Before this patch, this is not achievable because the parameters
to cal the hcnt/lcnt via i2c_dw_scl_hcnt() and i2c_dw_scl_lcnt() are different
for standard-mode and fast-mode.

Thanks,
Jisheng



> 
> > From another side, the dw_i2c_acpi_configure() on ACPI platform also
> > get hcnt/lcnt values rather than the sda/scl falling time from ACPI
> > method, we want similar feature for DT platforms.  
> 
> That's nice, but not really a reason IMO.
> 
> > 
> > Signed-off-by: Jisheng Zhang <jszhang@marvell.com>
> > ---
> >  Documentation/devicetree/bindings/i2c/i2c-designware.txt | 16 ++++++++++++++++
> >  drivers/i2c/busses/i2c-designware-platdrv.c              |  8 ++++++++
> >  2 files changed, 24 insertions(+)
Jisheng Zhang April 13, 2016, 12:16 p.m. UTC | #4
Dear Andy,

On Thu, 7 Apr 2016 21:05:35 +0300 Andy Shevchenko  wrote:

> On Wed, Apr 6, 2016 at 10:28 AM, Jisheng Zhang <jszhang@marvell.com> wrote:
> > Sometimes, it's convenient to define the scl's high/low count directly,
> > e.g HW people would do some measurement then directly give out the
> > optimum counts. Previously, we solved the sda falling time and scl
> > falling time by i2c_dw_scl_hcnt() and i2c_dw_scl_lcnt(), then put them
> > into dt, but what we really care isn't the sda/scl falling time.
> >
> > From another side, the dw_i2c_acpi_configure() on ACPI platform also
> > get hcnt/lcnt values rather than the sda/scl falling time from ACPI
> > method, we want similar feature for DT platforms.
> >  
> 
> Instead of duplicating some words maybe better to explicitly define
> two groups of parameters and one which supersedes the other.

I'm sorry, I can't catch your meaning. Could you please kindly give more
details? Or examples of "two groups of parameters"

Thanks,
Jisheng

> 
> > Signed-off-by: Jisheng Zhang <jszhang@marvell.com>
> > ---
> >  Documentation/devicetree/bindings/i2c/i2c-designware.txt | 16 ++++++++++++++++
> >  drivers/i2c/busses/i2c-designware-platdrv.c              |  8 ++++++++
> >  2 files changed, 24 insertions(+)
> >
> > diff --git a/Documentation/devicetree/bindings/i2c/i2c-designware.txt b/Documentation/devicetree/bindings/i2c/i2c-designware.txt
> > index fee26dc..05176fbf 100644
> > --- a/Documentation/devicetree/bindings/i2c/i2c-designware.txt
> > +++ b/Documentation/devicetree/bindings/i2c/i2c-designware.txt
> > @@ -20,6 +20,22 @@ Optional properties :
> >   - i2c-sda-falling-time-ns : should contain the SDA falling time in nanoseconds.
> >     This value which is by default 300ns is used to compute the tHIGH period.
> >
> > + - i2c-ss-scl-high-count : should contain the standard speed i2c clock SCL high
> > +   count. If defined, the i2c-scl-falling-time-ns and i2c-sda-falling-time-ns
> > +   will be ignored.
> > +
> > + - i2c-ss-scl-low-count : should contain the standard speed i2c clock SCL low
> > +   count. If defined, the i2c-scl-falling-time-ns and i2c-sda-falling-time-ns
> > +   will be ignored.
> > +
> > + - i2c-fs-scl-high-count : should contain the fast speed i2c clock SCL high
> > +   count. If defined, the i2c-scl-falling-time-ns and i2c-sda-falling-time-ns
> > +   will be ignored.
> > +
> > + - i2c-fs-scl-low-count : should contain the fast speed i2c clock SCL low
> > +   count. If defined, the i2c-scl-falling-time-ns and i2c-sda-falling-time-ns
> > +   will be ignored.
> > +
> >  Example :
> >
> >         i2c@f0000 {
> > diff --git a/drivers/i2c/busses/i2c-designware-platdrv.c b/drivers/i2c/busses/i2c-designware-platdrv.c
> > index d656657..8739a60 100644
> > --- a/drivers/i2c/busses/i2c-designware-platdrv.c
> > +++ b/drivers/i2c/busses/i2c-designware-platdrv.c
> > @@ -188,6 +188,14 @@ static int dw_i2c_plat_probe(struct platform_device *pdev)
> >                                          &dev->scl_falling_time);
> >                 device_property_read_u32(&pdev->dev, "clock-frequency",
> >                                          &clk_freq);
> > +               device_property_read_u16(&pdev->dev, "i2c-ss-scl-high-count",
> > +                                        &dev->ss_hcnt);
> > +               device_property_read_u16(&pdev->dev, "i2c-ss-scl-low-count",
> > +                                        &dev->ss_lcnt);
> > +               device_property_read_u16(&pdev->dev, "i2c-fs-scl-high-count",
> > +                                        &dev->fs_hcnt);
> > +               device_property_read_u16(&pdev->dev, "i2c-fs-scl-low-count",
> > +                                        &dev->fs_lcnt);
> >         }
> >
> >         if (has_acpi_companion(&pdev->dev))
> > --
> > 2.8.0.rc3
> >  
> 
> 
>
Andy Shevchenko April 13, 2016, 1:23 p.m. UTC | #5
On Wed, 2016-04-13 at 20:16 +0800, Jisheng Zhang wrote:
> Dear Andy,
> 
> On Thu, 7 Apr 2016 21:05:35 +0300 Andy Shevchenko  wrote:
> 
> > 
> > On Wed, Apr 6, 2016 at 10:28 AM, Jisheng Zhang <jszhang@marvell.com>
> > wrote:
> > > 
> > > Sometimes, it's convenient to define the scl's high/low count
> > > directly,
> > > e.g HW people would do some measurement then directly give out the
> > > optimum counts. Previously, we solved the sda falling time and scl
> > > falling time by i2c_dw_scl_hcnt() and i2c_dw_scl_lcnt(), then put
> > > them
> > > into dt, but what we really care isn't the sda/scl falling time.
> > > 
> > > From another side, the dw_i2c_acpi_configure() on ACPI platform
> > > also
> > > get hcnt/lcnt values rather than the sda/scl falling time from
> > > ACPI
> > > method, we want similar feature for DT platforms.
> > >  
> > Instead of duplicating some words maybe better to explicitly define
> > two groups of parameters and one which supersedes the other.
> I'm sorry, I can't catch your meaning. Could you please kindly give
> more
> details? Or examples of "two groups of parameters"


> --- + - i2c-ss-scl-high-count : should contain the standard speed i2c
> > > clock SCL high
> > > +   count. 


> > > If defined, the i2c-scl-falling-time-ns and i2c-sda-falling-time-
> > > ns
> > > +   will be ignored.

I'm referring to the above sentence. Something like

There are two groups of values identifying i2c timings:

1. i2c-scl-falling-time-ns and i2c-sda-falling-time-ns
2. *-[hl]cnt

The second group of parameters supersedes the first one.


> > > +
> > > + - i2c-ss-scl-low-count : should contain the standard speed i2c
> > > clock SCL low
> > > +   count. If defined, the i2c-scl-falling-time-ns and i2c-sda-
> > > falling-time-ns
> > > +   will be ignored.
> > > +
> > > + - i2c-fs-scl-high-count : should contain the fast speed i2c
> > > clock SCL high
> > > +   count. If defined, the i2c-scl-falling-time-ns and i2c-sda-
> > > falling-time-ns
> > > +   will be ignored.
> > > +
> > > + - i2c-fs-scl-low-count : should contain the fast speed i2c clock
> > > SCL low
> > > +   count. If defined, the i2c-scl-falling-time-ns and i2c-sda-
> > > falling-time-ns
> > > +   will be ignored.
> > > +
> > >  Example :
> > > 
> > >         i2c@f0000 {
> > > diff --git a/drivers/i2c/busses/i2c-designware-platdrv.c
> > > b/drivers/i2c/busses/i2c-designware-platdrv.c
> > > index d656657..8739a60 100644
> > > --- a/drivers/i2c/busses/i2c-designware-platdrv.c
> > > +++ b/drivers/i2c/busses/i2c-designware-platdrv.c
> > > @@ -188,6 +188,14 @@ static int dw_i2c_plat_probe(struct
> > > platform_device *pdev)
> > >                                          &dev->scl_falling_time);
> > >                 device_property_read_u32(&pdev->dev, "clock-
> > > frequency",
> > >                                          &clk_freq);
> > > +               device_property_read_u16(&pdev->dev, "i2c-ss-scl-
> > > high-count",
> > > +                                        &dev->ss_hcnt);
> > > +               device_property_read_u16(&pdev->dev, "i2c-ss-scl-
> > > low-count",
> > > +                                        &dev->ss_lcnt);
> > > +               device_property_read_u16(&pdev->dev, "i2c-fs-scl-
> > > high-count",
> > > +                                        &dev->fs_hcnt);
> > > +               device_property_read_u16(&pdev->dev, "i2c-fs-scl-
> > > low-count",
> > > +                                        &dev->fs_lcnt);
> > >         }
> > > 
> > >         if (has_acpi_companion(&pdev->dev))
> > > --
> > > 2.8.0.rc3
> > >  
> > 
> >
Wolfram Sang April 24, 2016, 8:39 p.m. UTC | #6
On Wed, Apr 13, 2016 at 08:11:47PM +0800, Jisheng Zhang wrote:
> Dear Rob,
> 
> On Thu, 7 Apr 2016 12:57:59 -0500 Rob Herring wrote:
> 
> > On Wed, Apr 06, 2016 at 03:28:00PM +0800, Jisheng Zhang wrote:
> > > Sometimes, it's convenient to define the scl's high/low count directly,
> > > e.g HW people would do some measurement then directly give out the
> > > optimum counts. Previously, we solved the sda falling time and scl
> > > falling time by i2c_dw_scl_hcnt() and i2c_dw_scl_lcnt(), then put them
> > > into dt, but what we really care isn't the sda/scl falling time.  
> > 
> > This is just so you can put specific clock count instead of converting 
> > from nanoseconds with standard properties or you gain some additional 
> > control of the timing. If only the former, then I prefer we stick with 
> > the common properties.
> 
> To be honest, both. Let me show how I gain additional control of the timing
> with this patch while I can't do this w/o it.
> 
> I want the similar high percent of SCL high for both standard-mode and
> fast-mode. Before this patch, this is not achievable because the parameters
> to cal the hcnt/lcnt via i2c_dw_scl_hcnt() and i2c_dw_scl_lcnt() are different
> for standard-mode and fast-mode.

If there is something you can't describe currently, then we can add
additional properties to allow you to do what you want. But they should
be generic bindings and not a plain value which is custom to this driver.
diff mbox

Patch

diff --git a/Documentation/devicetree/bindings/i2c/i2c-designware.txt b/Documentation/devicetree/bindings/i2c/i2c-designware.txt
index fee26dc..05176fbf 100644
--- a/Documentation/devicetree/bindings/i2c/i2c-designware.txt
+++ b/Documentation/devicetree/bindings/i2c/i2c-designware.txt
@@ -20,6 +20,22 @@  Optional properties :
  - i2c-sda-falling-time-ns : should contain the SDA falling time in nanoseconds.
    This value which is by default 300ns is used to compute the tHIGH period.
 
+ - i2c-ss-scl-high-count : should contain the standard speed i2c clock SCL high
+   count. If defined, the i2c-scl-falling-time-ns and i2c-sda-falling-time-ns
+   will be ignored.
+
+ - i2c-ss-scl-low-count : should contain the standard speed i2c clock SCL low
+   count. If defined, the i2c-scl-falling-time-ns and i2c-sda-falling-time-ns
+   will be ignored.
+
+ - i2c-fs-scl-high-count : should contain the fast speed i2c clock SCL high
+   count. If defined, the i2c-scl-falling-time-ns and i2c-sda-falling-time-ns
+   will be ignored.
+
+ - i2c-fs-scl-low-count : should contain the fast speed i2c clock SCL low
+   count. If defined, the i2c-scl-falling-time-ns and i2c-sda-falling-time-ns
+   will be ignored.
+
 Example :
 
 	i2c@f0000 {
diff --git a/drivers/i2c/busses/i2c-designware-platdrv.c b/drivers/i2c/busses/i2c-designware-platdrv.c
index d656657..8739a60 100644
--- a/drivers/i2c/busses/i2c-designware-platdrv.c
+++ b/drivers/i2c/busses/i2c-designware-platdrv.c
@@ -188,6 +188,14 @@  static int dw_i2c_plat_probe(struct platform_device *pdev)
 					 &dev->scl_falling_time);
 		device_property_read_u32(&pdev->dev, "clock-frequency",
 					 &clk_freq);
+		device_property_read_u16(&pdev->dev, "i2c-ss-scl-high-count",
+					 &dev->ss_hcnt);
+		device_property_read_u16(&pdev->dev, "i2c-ss-scl-low-count",
+					 &dev->ss_lcnt);
+		device_property_read_u16(&pdev->dev, "i2c-fs-scl-high-count",
+					 &dev->fs_hcnt);
+		device_property_read_u16(&pdev->dev, "i2c-fs-scl-low-count",
+					 &dev->fs_lcnt);
 	}
 
 	if (has_acpi_companion(&pdev->dev))