diff mbox

i2c: designware: Get selected speed mode sda-hold-time via ACPI

Message ID 1486726118-19447-2-git-send-email-chin.yew.tan@intel.com
State Superseded
Headers show

Commit Message

chin.yew.tan@intel.com Feb. 10, 2017, 11:28 a.m. UTC
From: Tan Chin Yew <chin.yew.tan@intel.com>

Sda-hold-time is an important parameter for tuning i2c to meet the
electrical specification especially for high speed. I2C with incorrect
sda-hold-time may cause lost arbitration error. Now, the driver is able to
get sda-hold-time for all the speed supported.

Signed-off-by: Tan Chin Yew <chin.yew.tan@intel.com>
---
 drivers/i2c/busses/i2c-designware-platdrv.c | 27 ++++++++++++++++++++-------
 1 file changed, 20 insertions(+), 7 deletions(-)

Comments

Jarkko Nikula Feb. 10, 2017, 12:28 p.m. UTC | #1
On 10.02.2017 13:28, chin.yew.tan@intel.com wrote:
> From: Tan Chin Yew <chin.yew.tan@intel.com>
>
> Sda-hold-time is an important parameter for tuning i2c to meet the
> electrical specification especially for high speed. I2C with incorrect
> sda-hold-time may cause lost arbitration error. Now, the driver is able to
> get sda-hold-time for all the speed supported.
>
> Signed-off-by: Tan Chin Yew <chin.yew.tan@intel.com>
> ---
>  drivers/i2c/busses/i2c-designware-platdrv.c | 27 ++++++++++++++++++++-------
>  1 file changed, 20 insertions(+), 7 deletions(-)
>
Acked-by: Jarkko Nikula <jarkko.nikula@linux.intel.com>
--
To unsubscribe from this list: send the line "unsubscribe linux-i2c" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Andy Shevchenko Feb. 10, 2017, 12:31 p.m. UTC | #2
On Fri, 2017-02-10 at 19:28 +0800, chin.yew.tan@intel.com wrote:
> From: Tan Chin Yew <chin.yew.tan@intel.com>
> 
> Sda-hold-time is an important parameter for tuning i2c to meet the
> electrical specification especially for high speed. I2C with incorrect
> sda-hold-time may cause lost arbitration error. Now, the driver is
> able to
> get sda-hold-time for all the speed supported.
> 

Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>

Couple of nitpicks below.

> Signed-off-by: Tan Chin Yew <chin.yew.tan@intel.com>
> ---
>  drivers/i2c/busses/i2c-designware-platdrv.c | 27
> ++++++++++++++++++++-------
>  1 file changed, 20 insertions(+), 7 deletions(-)
> 
> diff --git a/drivers/i2c/busses/i2c-designware-platdrv.c
> b/drivers/i2c/busses/i2c-designware-platdrv.c
> index 6ce4313..aa33088 100644
> --- a/drivers/i2c/busses/i2c-designware-platdrv.c
> +++ b/drivers/i2c/busses/i2c-designware-platdrv.c
> @@ -101,15 +101,28 @@ static int dw_i2c_acpi_configure(struct
> platform_device *pdev)
>  	dev->rx_fifo_depth = 32;
>  
>  	/*
> -	 * Try to get SDA hold time and *CNT values from an ACPI
> method if
> -	 * it exists for both supported speed modes.
> +	 * Try to get SDA hold time and *CNT values from an ACPI
> method for
> +	 * selected speed modes.
>  	 */
> -	dw_i2c_acpi_params(pdev, "SSCN", &dev->ss_hcnt, &dev-
> >ss_lcnt, NULL);
> -	dw_i2c_acpi_params(pdev, "FMCN", &dev->fs_hcnt, &dev-
> >fs_lcnt,
> +	switch (dev->clk_freq) {
> +	case 100000:
> +		dw_i2c_acpi_params(pdev, "SSCN", &dev->ss_hcnt, &dev-
> >ss_lcnt,

>  			   &dev->sda_hold_time);

This indentation should go in a way that & character in the same column
as p (in "p(s" context above).

> -	dw_i2c_acpi_params(pdev, "FPCN", &dev->fp_hcnt, &dev-
> >fp_lcnt, NULL);
> -	dw_i2c_acpi_params(pdev, "HSCN", &dev->hs_hcnt, &dev-
> >hs_lcnt, NULL);
> -
> +		break;
> +	case 1000000:
> +		dw_i2c_acpi_params(pdev, "FPCN", &dev->fp_hcnt, &dev-
> >fp_lcnt,
> +			   &dev->sda_hold_time);
> +		break;
> +	case 3400000:
> +		dw_i2c_acpi_params(pdev, "HSCN", &dev->hs_hcnt, &dev-
> >hs_lcnt,
> +			   &dev->sda_hold_time);
> +		break;

Can we prepend default with

case 400000:

here?

> +	default:


> +		dw_i2c_acpi_params(pdev, "FMCN", &dev->fs_hcnt, &dev-
> >fs_lcnt,
> +			   &dev->sda_hold_time);
> +		break;
> +	}
> +
>  	id = acpi_match_device(pdev->dev.driver->acpi_match_table,
> &pdev->dev);
>  	if (id && id->driver_data)
>  		dev->accessor_flags |= (u32)id->driver_data;
chin.yew.tan@intel.com Feb. 13, 2017, 8:41 a.m. UTC | #3
DQo+IE9uIEZyaSwgMjAxNy0wMi0xMCBhdCAxOToyOCArMDgwMCwgY2hpbi55ZXcudGFuQGludGVs
LmNvbSB3cm90ZToNCj4gPiBGcm9tOiBUYW4gQ2hpbiBZZXcgPGNoaW4ueWV3LnRhbkBpbnRlbC5j
b20+DQo+ID4NCj4gPiBTZGEtaG9sZC10aW1lIGlzIGFuIGltcG9ydGFudCBwYXJhbWV0ZXIgZm9y
IHR1bmluZyBpMmMgdG8gbWVldCB0aGUNCj4gPiBlbGVjdHJpY2FsIHNwZWNpZmljYXRpb24gZXNw
ZWNpYWxseSBmb3IgaGlnaCBzcGVlZC4gSTJDIHdpdGggaW5jb3JyZWN0DQo+ID4gc2RhLWhvbGQt
dGltZSBtYXkgY2F1c2UgbG9zdCBhcmJpdHJhdGlvbiBlcnJvci4gTm93LCB0aGUgZHJpdmVyIGlz
DQo+ID4gYWJsZSB0byBnZXQgc2RhLWhvbGQtdGltZSBmb3IgYWxsIHRoZSBzcGVlZCBzdXBwb3J0
ZWQuDQo+ID4NCj4gDQo+IFJldmlld2VkLWJ5OiBBbmR5IFNoZXZjaGVua28gPGFuZHJpeS5zaGV2
Y2hlbmtvQGxpbnV4LmludGVsLmNvbT4NCj4gDQo+IENvdXBsZSBvZiBuaXRwaWNrcyBiZWxvdy4N
Cj4gDQo+ID4gU2lnbmVkLW9mZi1ieTogVGFuIENoaW4gWWV3IDxjaGluLnlldy50YW5AaW50ZWwu
Y29tPg0KPiA+IC0tLQ0KPiA+IMKgZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1kZXNpZ253YXJlLXBs
YXRkcnYuYyB8IDI3DQo+ID4gKysrKysrKysrKysrKysrKysrKystLS0tLS0tDQo+ID4gwqAxIGZp
bGUgY2hhbmdlZCwgMjAgaW5zZXJ0aW9ucygrKSwgNyBkZWxldGlvbnMoLSkNCj4gPg0KPiA+IGRp
ZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWRlc2lnbndhcmUtcGxhdGRydi5jDQo+
ID4gYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWRlc2lnbndhcmUtcGxhdGRydi5jDQo+ID4gaW5k
ZXggNmNlNDMxMy4uYWEzMzA4OCAxMDA2NDQNCj4gPiAtLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMv
aTJjLWRlc2lnbndhcmUtcGxhdGRydi5jDQo+ID4gKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2ky
Yy1kZXNpZ253YXJlLXBsYXRkcnYuYw0KPiA+IEBAIC0xMDEsMTUgKzEwMSwyOCBAQCBzdGF0aWMg
aW50IGR3X2kyY19hY3BpX2NvbmZpZ3VyZShzdHJ1Y3QNCj4gPiBwbGF0Zm9ybV9kZXZpY2UgKnBk
ZXYpDQo+ID4gwqAJZGV2LT5yeF9maWZvX2RlcHRoID0gMzI7DQo+ID4NCj4gPiDCoAkvKg0KPiA+
IC0JwqAqIFRyeSB0byBnZXQgU0RBIGhvbGQgdGltZSBhbmQgKkNOVCB2YWx1ZXMgZnJvbSBhbiBB
Q1BJDQo+ID4gbWV0aG9kIGlmDQo+ID4gLQnCoCogaXQgZXhpc3RzIGZvciBib3RoIHN1cHBvcnRl
ZCBzcGVlZCBtb2Rlcy4NCj4gPiArCcKgKiBUcnkgdG8gZ2V0IFNEQSBob2xkIHRpbWUgYW5kICpD
TlQgdmFsdWVzIGZyb20gYW4gQUNQSQ0KPiA+IG1ldGhvZCBmb3INCj4gPiArCcKgKiBzZWxlY3Rl
ZCBzcGVlZCBtb2Rlcy4NCj4gPiDCoAnCoCovDQo+ID4gLQlkd19pMmNfYWNwaV9wYXJhbXMocGRl
diwgIlNTQ04iLCAmZGV2LT5zc19oY250LCAmZGV2LQ0KPiA+ID5zc19sY250LCBOVUxMKTsNCj4g
PiAtCWR3X2kyY19hY3BpX3BhcmFtcyhwZGV2LCAiRk1DTiIsICZkZXYtPmZzX2hjbnQsICZkZXYt
DQo+ID4gPmZzX2xjbnQsDQo+ID4gKwlzd2l0Y2ggKGRldi0+Y2xrX2ZyZXEpIHsNCj4gPiArCWNh
c2UgMTAwMDAwOg0KPiA+ICsJCWR3X2kyY19hY3BpX3BhcmFtcyhwZGV2LCAiU1NDTiIsICZkZXYt
PnNzX2hjbnQsICZkZXYtDQo+ID4gPnNzX2xjbnQsDQo+IA0KPiA+IMKgCQkJwqDCoMKgJmRldi0+
c2RhX2hvbGRfdGltZSk7DQo+IA0KPiBUaGlzIGluZGVudGF0aW9uIHNob3VsZCBnbyBpbiBhIHdh
eSB0aGF0ICYgY2hhcmFjdGVyIGluIHRoZSBzYW1lIGNvbHVtbiBhcyBwDQo+IChpbiAicChzIiBj
b250ZXh0IGFib3ZlKS4NCkkgd2lsbCByZWFsaWduIHRoZSBjb2RlIGFjY29yZGluZyB0byBzdWdn
ZXN0aW9uLg0KDQo+IA0KPiA+IC0JZHdfaTJjX2FjcGlfcGFyYW1zKHBkZXYsICJGUENOIiwgJmRl
di0+ZnBfaGNudCwgJmRldi0NCj4gPiA+ZnBfbGNudCwgTlVMTCk7DQo+ID4gLQlkd19pMmNfYWNw
aV9wYXJhbXMocGRldiwgIkhTQ04iLCAmZGV2LT5oc19oY250LCAmZGV2LQ0KPiA+ID5oc19sY250
LCBOVUxMKTsNCj4gPiAtDQo+ID4gKwkJYnJlYWs7DQo+ID4gKwljYXNlIDEwMDAwMDA6DQo+ID4g
KwkJZHdfaTJjX2FjcGlfcGFyYW1zKHBkZXYsICJGUENOIiwgJmRldi0+ZnBfaGNudCwgJmRldi0N
Cj4gPiA+ZnBfbGNudCwNCj4gPiArCQkJwqDCoMKgJmRldi0+c2RhX2hvbGRfdGltZSk7DQo+ID4g
KwkJYnJlYWs7DQo+ID4gKwljYXNlIDM0MDAwMDA6DQo+ID4gKwkJZHdfaTJjX2FjcGlfcGFyYW1z
KHBkZXYsICJIU0NOIiwgJmRldi0+aHNfaGNudCwgJmRldi0NCj4gPiA+aHNfbGNudCwNCj4gPiAr
CQkJwqDCoMKgJmRldi0+c2RhX2hvbGRfdGltZSk7DQo+ID4gKwkJYnJlYWs7DQo+IA0KPiBDYW4g
d2UgcHJlcGVuZCBkZWZhdWx0IHdpdGgNCj4gDQo+IGNhc2UgNDAwMDAwOg0KPiANCj4gaGVyZT8N
Cj4gDQpZZXMsIHlvdSBhcmUgcmlnaHQsIGl0IGlzIGJlc3Qgbm90IHRvIGxvYWQgc2V0dGluZ3Mg
Zm9yIHNwZWVkIG1vZGUgdGhhdCBpcyANCm5vdCBzdXBwb3J0ZWQuDQoNCj4gPiArCWRlZmF1bHQ6
DQo+IA0KPiANCj4gPiArCQlkd19pMmNfYWNwaV9wYXJhbXMocGRldiwgIkZNQ04iLCAmZGV2LT5m
c19oY250LCAmZGV2LQ0KPiA+ID5mc19sY250LA0KPiA+ICsJCQnCoMKgwqAmZGV2LT5zZGFfaG9s
ZF90aW1lKTsNCj4gPiArCQlicmVhazsNCj4gPiArCX0NCj4gPiArDQo+ID4gwqAJaWQgPSBhY3Bp
X21hdGNoX2RldmljZShwZGV2LT5kZXYuZHJpdmVyLT5hY3BpX21hdGNoX3RhYmxlLA0KPiA+ICZw
ZGV2LT5kZXYpOw0KPiA+IMKgCWlmIChpZCAmJiBpZC0+ZHJpdmVyX2RhdGEpDQo+ID4gwqAJCWRl
di0+YWNjZXNzb3JfZmxhZ3MgfD0gKHUzMilpZC0+ZHJpdmVyX2RhdGE7DQo+IA0KPiAtLQ0KPiBB
bmR5IFNoZXZjaGVua28gPGFuZHJpeS5zaGV2Y2hlbmtvQGxpbnV4LmludGVsLmNvbT4NCj4gSW50
ZWwgRmlubGFuZCBPeQ0K
--
To unsubscribe from this list: send the line "unsubscribe linux-i2c" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Jarkko Nikula Feb. 13, 2017, 9:33 a.m. UTC | #4
On 13.02.2017 10:41, Tan, Chin Yew wrote:
>
>> On Fri, 2017-02-10 at 19:28 +0800, chin.yew.tan@intel.com wrote:
>>> From: Tan Chin Yew <chin.yew.tan@intel.com>
>>>
>>> Sda-hold-time is an important parameter for tuning i2c to meet the
>>> electrical specification especially for high speed. I2C with incorrect
>>> sda-hold-time may cause lost arbitration error. Now, the driver is
>>> able to get sda-hold-time for all the speed supported.
>>>
>>
>> Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
>>
>> Couple of nitpicks below.
>>
>>> Signed-off-by: Tan Chin Yew <chin.yew.tan@intel.com>
>>> ---
>>>  drivers/i2c/busses/i2c-designware-platdrv.c | 27
>>> ++++++++++++++++++++-------
>>>  1 file changed, 20 insertions(+), 7 deletions(-)
>>>
>>> diff --git a/drivers/i2c/busses/i2c-designware-platdrv.c
>>> b/drivers/i2c/busses/i2c-designware-platdrv.c
>>> index 6ce4313..aa33088 100644
>>> --- a/drivers/i2c/busses/i2c-designware-platdrv.c
>>> +++ b/drivers/i2c/busses/i2c-designware-platdrv.c
>>> @@ -101,15 +101,28 @@ static int dw_i2c_acpi_configure(struct
>>> platform_device *pdev)
>>>  	dev->rx_fifo_depth = 32;
>>>
>>>  	/*
>>> -	 * Try to get SDA hold time and *CNT values from an ACPI
>>> method if
>>> -	 * it exists for both supported speed modes.
>>> +	 * Try to get SDA hold time and *CNT values from an ACPI
>>> method for
>>> +	 * selected speed modes.
>>>  	 */
>>> -	dw_i2c_acpi_params(pdev, "SSCN", &dev->ss_hcnt, &dev-
>>>> ss_lcnt, NULL);
>>> -	dw_i2c_acpi_params(pdev, "FMCN", &dev->fs_hcnt, &dev-
>>>> fs_lcnt,
>>> +	switch (dev->clk_freq) {
>>> +	case 100000:
>>> +		dw_i2c_acpi_params(pdev, "SSCN", &dev->ss_hcnt, &dev-
>>>> ss_lcnt,
>>
>>>  			   &dev->sda_hold_time);
>>
>> This indentation should go in a way that & character in the same column as p
>> (in "p(s" context above).
> I will realign the code according to suggestion.
>
>>
>>> -	dw_i2c_acpi_params(pdev, "FPCN", &dev->fp_hcnt, &dev-
>>>> fp_lcnt, NULL);
>>> -	dw_i2c_acpi_params(pdev, "HSCN", &dev->hs_hcnt, &dev-
>>>> hs_lcnt, NULL);
>>> -
>>> +		break;
>>> +	case 1000000:
>>> +		dw_i2c_acpi_params(pdev, "FPCN", &dev->fp_hcnt, &dev-
>>>> fp_lcnt,
>>> +			   &dev->sda_hold_time);
>>> +		break;
>>> +	case 3400000:
>>> +		dw_i2c_acpi_params(pdev, "HSCN", &dev->hs_hcnt, &dev-
>>>> hs_lcnt,
>>> +			   &dev->sda_hold_time);
>>> +		break;
>>
>> Can we prepend default with
>>
>> case 400000:
>>
>> here?
>>
> Yes, you are right, it is best not to load settings for speed mode that is
> not supported.
>
Andy: I guess you were looking for adding "case 400000:" for readability 
rather than removing the default case?

I think it's best to keep fall back to 400 kHz speed that has been the 
default in this driver in case we get some not supported speed from ACPI.
Andy Shevchenko Feb. 13, 2017, 10:56 a.m. UTC | #5
On Mon, 2017-02-13 at 11:33 +0200, Jarkko Nikula wrote:
> On 13.02.2017 10:41, Tan, Chin Yew wrote:
> > 
> > > On Fri, 2017-02-10 at 19:28 +0800, chin.yew.tan@intel.com wrote:
> > > > From: Tan Chin Yew <chin.yew.tan@intel.com>
> > > > 
> > > > Sda-hold-time is an important parameter for tuning i2c to meet
> > > > the
> > > > electrical specification especially for high speed. I2C with
> > > > incorrect
> > > > sda-hold-time may cause lost arbitration error. Now, the driver
> > > > is
> > > > able to get sda-hold-time for all the speed supported.

> > > > +	case 1000000:
> > > > +		dw_i2c_acpi_params(pdev, "FPCN", &dev->fp_hcnt, 
> > > > &dev-
> > > > > fp_lcnt,
> > > > 
> > > > +			   &dev->sda_hold_time);
> > > > +		break;
> > > > +	case 3400000:
> > > > +		dw_i2c_acpi_params(pdev, "HSCN", &dev->hs_hcnt, 
> > > > &dev-
> > > > > hs_lcnt,
> > > > 
> > > > +			   &dev->sda_hold_time);
> > > > +		break;
> > > 
> > > Can we prepend default with
> > > 
> > > case 400000:
> > > 
> > > here?
> > > 
> > 
> > Yes, you are right, it is best not to load settings for speed mode
> > that is
> > not supported.
> > 
> 
> Andy: I guess you were looking for adding "case 400000:" for
> readability 
> rather than removing the default case?

Correct. To explicitly show that default we rather assume 400000, but if
 it's not, still go that branch.

> 
> I think it's best to keep fall back to 400 kHz speed that has been
> the 
> default in this driver in case we get some not supported speed from
> ACPI.
diff mbox

Patch

diff --git a/drivers/i2c/busses/i2c-designware-platdrv.c b/drivers/i2c/busses/i2c-designware-platdrv.c
index 6ce4313..aa33088 100644
--- a/drivers/i2c/busses/i2c-designware-platdrv.c
+++ b/drivers/i2c/busses/i2c-designware-platdrv.c
@@ -101,15 +101,28 @@  static int dw_i2c_acpi_configure(struct platform_device *pdev)
 	dev->rx_fifo_depth = 32;
 
 	/*
-	 * Try to get SDA hold time and *CNT values from an ACPI method if
-	 * it exists for both supported speed modes.
+	 * Try to get SDA hold time and *CNT values from an ACPI method for
+	 * selected speed modes.
 	 */
-	dw_i2c_acpi_params(pdev, "SSCN", &dev->ss_hcnt, &dev->ss_lcnt, NULL);
-	dw_i2c_acpi_params(pdev, "FMCN", &dev->fs_hcnt, &dev->fs_lcnt,
+	switch (dev->clk_freq) {
+	case 100000:
+		dw_i2c_acpi_params(pdev, "SSCN", &dev->ss_hcnt, &dev->ss_lcnt,
 			   &dev->sda_hold_time);
-	dw_i2c_acpi_params(pdev, "FPCN", &dev->fp_hcnt, &dev->fp_lcnt, NULL);
-	dw_i2c_acpi_params(pdev, "HSCN", &dev->hs_hcnt, &dev->hs_lcnt, NULL);
-
+		break;
+	case 1000000:
+		dw_i2c_acpi_params(pdev, "FPCN", &dev->fp_hcnt, &dev->fp_lcnt,
+			   &dev->sda_hold_time);
+		break;
+	case 3400000:
+		dw_i2c_acpi_params(pdev, "HSCN", &dev->hs_hcnt, &dev->hs_lcnt,
+			   &dev->sda_hold_time);
+		break;
+	default:
+		dw_i2c_acpi_params(pdev, "FMCN", &dev->fs_hcnt, &dev->fs_lcnt,
+			   &dev->sda_hold_time);
+		break;
+	}
+
 	id = acpi_match_device(pdev->dev.driver->acpi_match_table, &pdev->dev);
 	if (id && id->driver_data)
 		dev->accessor_flags |= (u32)id->driver_data;