From 9e1a21273e1518c5603156d700c77b22cc32805e Mon Sep 17 00:00:00 2001 From: AceLan Kao Date: Thu, 20 Jun 2019 13:02:51 +0800 Subject: [PATCH v2 1/1][SRU][D][OEM-OSP1-B] UBUNTU: SAUCE: i2c: designware: Add disable runtime pm quirk BugLink: https://bugs.launchpad.net/bugs/1833484 Dell machines come with goodix touchpad IC suffer from the double click issue if the Designware I2C adapter enters runtime suspend. It's because the goodix re-assert the interrupt if host doesn't read the data within 100ms and desiginware takes a longer time to wake up from runtime suspend. In the case, it got a second interrupt during resuming, so it thinks it's a double click. There is no simple way to fix this, it's a firmware issue and goodix agrees to fix this in their firmware on next release, but this issue is still affects the machines that don't come with an updated firmware. So, add a quirk to mark those machines and avoid the designware to enter runtime suspend. Signed-off-by: AceLan Kao --- drivers/i2c/busses/i2c-designware-master.c | 44 +++++++++++++++++++++- 1 file changed, 42 insertions(+), 2 deletions(-) diff --git a/drivers/i2c/busses/i2c-designware-master.c b/drivers/i2c/busses/i2c-designware-master.c index bb8e3f149979..6ff73b20dc26 100644 --- a/drivers/i2c/busses/i2c-designware-master.c +++ b/drivers/i2c/busses/i2c-designware-master.c @@ -9,6 +9,7 @@ * Copyright (C) 2009 Provigent Ltd. */ #include +#include #include #include #include @@ -22,6 +23,39 @@ #include "i2c-designware-core.h" +static int no_runtime_pm; +static const struct dmi_system_id i2c_dw_no_runtime_pm[] = { + { + .ident = "Dell Inspiron 5390", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), + DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron 5390"), + }, + }, + { + .ident = "Dell Inspiron 5391", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), + DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron 5391"), + }, + }, + { + .ident = "Dell Vostro 5390", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), + DMI_MATCH(DMI_PRODUCT_NAME, "Vostro 5390"), + }, + }, + { + .ident = "Dell Vostro 5391", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), + DMI_MATCH(DMI_PRODUCT_NAME, "Vostro 5391"), + }, + }, + { } +}; + static void i2c_dw_configure_fifo_master(struct dw_i2c_dev *dev) { /* Configure Tx/Rx FIFO threshold levels */ @@ -424,7 +458,8 @@ i2c_dw_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num) dev_dbg(dev->dev, "%s: msgs: %d\n", __func__, num); - pm_runtime_get_sync(dev->dev); + if (!no_runtime_pm) + pm_runtime_get_sync(dev->dev); if (dev->suspended) { dev_err(dev->dev, "Error %s call while suspended\n", __func__); @@ -502,7 +537,8 @@ i2c_dw_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num) done_nolock: pm_runtime_mark_last_busy(dev->dev); - pm_runtime_put_autosuspend(dev->dev); + if (!no_runtime_pm) + pm_runtime_put_autosuspend(dev->dev); return ret; } @@ -734,6 +770,10 @@ int i2c_dw_probe(struct dw_i2c_dev *dev) if (ret) return ret; + no_runtime_pm = dmi_check_system(i2c_dw_no_runtime_pm); + if (no_runtime_pm) + __pm_runtime_disable(dev->dev, true); + /* * Increment PM usage count during adapter registration in order to * avoid possible spurious runtime suspend when adapter device is -- 2.17.1