Message ID | 1443085614-101362-1-git-send-email-mika.westerberg@linux.intel.com |
---|---|
State | Accepted |
Headers | show |
On Thu, Sep 24, 2015 at 12:06:54PM +0300, Mika Westerberg wrote: > ACPI SSCN/FMCN methods were originally added because then the platform can > provide the most accurate HCNT/LCNT values to the driver. However, this > seems not to be true for Dell Inspiron 7348 where using these causes the > touchpad to fail in boot: > > i2c_hid i2c-DLL0675:00: failed to retrieve report from device. > i2c_designware INT3433:00: i2c_dw_handle_tx_abort: lost arbitration > i2c_hid i2c-DLL0675:00: failed to retrieve report from device. > i2c_designware INT3433:00: controller timed out > > The values received from ACPI are (in fast mode): > > HCNT: 72 > LCNT: 160 > > this translates to following timings (input clock is 100MHz on Broadwell): > > tHIGH: 720 ns (spec min 600 ns) > tLOW: 1600 ns (spec min 1300 ns) > Bus period: 2920 ns (assuming 300 ns tf and tr) > Bus speed: 342.5 kHz > > Both tHIGH and tLOW are within the I2C specification. > > The calculated values when ACPI parameters are not used are (in fast mode): > > HCNT: 87 > LCNT: 159 > > which translates to: > > tHIGH: 870 ns (spec min 600 ns) > tLOW: 1590 ns (spec min 1300 ns) > Bus period 3060 ns (assuming 300 ns tf and tr) > Bus speed 326.8 kHz > > These values are also within the I2C specification. > > Since both ACPI and calculated values meet the I2C specification timing > requirements it is hard to say why the touchpad does not function properly > with the ACPI values except that the bus speed is higher in this case (but > still well below the max 400kHz). > > Solve this by adding DMI quirk to the driver that disables using ACPI > parameters on this particulare machine. > > Reported-by: Pavel Roskin <plroskin@gmail.com> > Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com> Pavel, have you tested this patch?
Yes, I've tested the patch extensively. It's working fine for me. Pavel -- 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
On Thu, Sep 24, 2015 at 12:06:54PM +0300, Mika Westerberg wrote: > ACPI SSCN/FMCN methods were originally added because then the platform can > provide the most accurate HCNT/LCNT values to the driver. However, this > seems not to be true for Dell Inspiron 7348 where using these causes the > touchpad to fail in boot: > > i2c_hid i2c-DLL0675:00: failed to retrieve report from device. > i2c_designware INT3433:00: i2c_dw_handle_tx_abort: lost arbitration > i2c_hid i2c-DLL0675:00: failed to retrieve report from device. > i2c_designware INT3433:00: controller timed out > > The values received from ACPI are (in fast mode): > > HCNT: 72 > LCNT: 160 > > this translates to following timings (input clock is 100MHz on Broadwell): > > tHIGH: 720 ns (spec min 600 ns) > tLOW: 1600 ns (spec min 1300 ns) > Bus period: 2920 ns (assuming 300 ns tf and tr) > Bus speed: 342.5 kHz > > Both tHIGH and tLOW are within the I2C specification. > > The calculated values when ACPI parameters are not used are (in fast mode): > > HCNT: 87 > LCNT: 159 > > which translates to: > > tHIGH: 870 ns (spec min 600 ns) > tLOW: 1590 ns (spec min 1300 ns) > Bus period 3060 ns (assuming 300 ns tf and tr) > Bus speed 326.8 kHz > > These values are also within the I2C specification. > > Since both ACPI and calculated values meet the I2C specification timing > requirements it is hard to say why the touchpad does not function properly > with the ACPI values except that the bus speed is higher in this case (but > still well below the max 400kHz). > > Solve this by adding DMI quirk to the driver that disables using ACPI > parameters on this particulare machine. > > Reported-by: Pavel Roskin <plroskin@gmail.com> > Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com> Applied to for-current with Pavel's Tested-by:, thanks!
diff --git a/drivers/i2c/busses/i2c-designware-platdrv.c b/drivers/i2c/busses/i2c-designware-platdrv.c index 3dd2de31a2f8..e76514ff440c 100644 --- a/drivers/i2c/busses/i2c-designware-platdrv.c +++ b/drivers/i2c/busses/i2c-designware-platdrv.c @@ -24,6 +24,7 @@ #include <linux/kernel.h> #include <linux/module.h> #include <linux/delay.h> +#include <linux/dmi.h> #include <linux/i2c.h> #include <linux/clk.h> #include <linux/clk-provider.h> @@ -51,6 +52,22 @@ static u32 i2c_dw_get_clk_rate_khz(struct dw_i2c_dev *dev) } #ifdef CONFIG_ACPI +/* + * The HCNT/LCNT information coming from ACPI should be the most accurate + * for given platform. However, some systems get it wrong. On such systems + * we get better results by calculating those based on the input clock. + */ +static const struct dmi_system_id dw_i2c_no_acpi_params[] = { + { + .ident = "Dell Inspiron 7348", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), + DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron 7348"), + }, + }, + { } +}; + static void dw_i2c_acpi_params(struct platform_device *pdev, char method[], u16 *hcnt, u16 *lcnt, u32 *sda_hold) { @@ -58,6 +75,9 @@ static void dw_i2c_acpi_params(struct platform_device *pdev, char method[], acpi_handle handle = ACPI_HANDLE(&pdev->dev); union acpi_object *obj; + if (dmi_check_system(dw_i2c_no_acpi_params)) + return; + if (ACPI_FAILURE(acpi_evaluate_object(handle, method, NULL, &buf))) return;
ACPI SSCN/FMCN methods were originally added because then the platform can provide the most accurate HCNT/LCNT values to the driver. However, this seems not to be true for Dell Inspiron 7348 where using these causes the touchpad to fail in boot: i2c_hid i2c-DLL0675:00: failed to retrieve report from device. i2c_designware INT3433:00: i2c_dw_handle_tx_abort: lost arbitration i2c_hid i2c-DLL0675:00: failed to retrieve report from device. i2c_designware INT3433:00: controller timed out The values received from ACPI are (in fast mode): HCNT: 72 LCNT: 160 this translates to following timings (input clock is 100MHz on Broadwell): tHIGH: 720 ns (spec min 600 ns) tLOW: 1600 ns (spec min 1300 ns) Bus period: 2920 ns (assuming 300 ns tf and tr) Bus speed: 342.5 kHz Both tHIGH and tLOW are within the I2C specification. The calculated values when ACPI parameters are not used are (in fast mode): HCNT: 87 LCNT: 159 which translates to: tHIGH: 870 ns (spec min 600 ns) tLOW: 1590 ns (spec min 1300 ns) Bus period 3060 ns (assuming 300 ns tf and tr) Bus speed 326.8 kHz These values are also within the I2C specification. Since both ACPI and calculated values meet the I2C specification timing requirements it is hard to say why the touchpad does not function properly with the ACPI values except that the bus speed is higher in this case (but still well below the max 400kHz). Solve this by adding DMI quirk to the driver that disables using ACPI parameters on this particulare machine. Reported-by: Pavel Roskin <plroskin@gmail.com> Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com> --- drivers/i2c/busses/i2c-designware-platdrv.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+)