]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
i2c: designware: Set IRQF_NO_SUSPEND flag for all BYT and CHT controllers
authorHans de Goede <hdegoede@redhat.com>
Sat, 6 Oct 2018 08:25:39 +0000 (10:25 +0200)
committerWolfram Sang <wsa@the-dreams.de>
Thu, 11 Oct 2018 21:05:09 +0000 (23:05 +0200)
On some Cherry Trail systems the GPU ACPI fwnode has power-resources which
point to the PMIC, which is connected over a LPSS I2C controller. The GPU
is a PCI device and PCI devices are powered-on at the resume_noirq resume
phase.

Since the GPU power-resources need the I2C controller, recent acpi_lpss.c
changes now also power-up the LPSS I2C controllers on BYT and CHT devices
in the resume_noirq resume phase. But during this phase the IRQ of the
controller is disabled leading to these errors:

 i2c_designware 808622C1:06: controller timed out
 ACPI Error: AE_ERROR, Returned by Handler for [UserDefinedRegion]
 ACPI Error: Method parse/execution failed \_SB.P18W._ON, AE_ERROR
 video LNXVIDEO:00: Failed to change power state to D0

This commit makes the i2c-designware controller set the IRQF_NO_SUSPEND
flag when requesting the interrupt on BYT and CHT devices, so that the IRQ
is left enabled during the noirq phase, fixing this.

Tested-by: Jarkko Nikula <jarkko.nikula@linux.intel.com>
Acked-by: Jarkko Nikula <jarkko.nikula@linux.intel.com>
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Reviewed-by: Mika Westerberg <mika.westerberg@linux.intel.com>
Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
drivers/i2c/busses/i2c-designware-core.h
drivers/i2c/busses/i2c-designware-master.c
drivers/i2c/busses/i2c-designware-platdrv.c

index fb40d76639da5e93a31d6e3e942e4baaeb67e014..9ec8394f47878e9058dc7b467ba0e044baef6394 100644 (file)
@@ -278,6 +278,7 @@ struct dw_i2c_dev {
 #define ACCESS_SWAP            0x00000001
 #define ACCESS_16BIT           0x00000002
 #define ACCESS_INTR_MASK       0x00000004
+#define ACCESS_NO_IRQ_SUSPEND  0x00000008
 
 #define MODEL_CHERRYTRAIL      0x00000100
 #define MODEL_MSCC_OCELOT      0x00000200
index 2ccb527735f961295f9f52e7c20ca6019a30ab92..2a630ac35ba2d32dfb92f442ecdb507a08988b48 100644 (file)
@@ -707,7 +707,7 @@ int i2c_dw_probe(struct dw_i2c_dev *dev)
        adap->dev.parent = dev->dev;
        i2c_set_adapdata(adap, dev);
 
-       if (dev->shared_with_punit) {
+       if (dev->flags & ACCESS_NO_IRQ_SUSPEND) {
                irq_flags = IRQF_NO_SUSPEND;
        } else {
                irq_flags = IRQF_SHARED | IRQF_COND_SUSPEND;
index 51cb17287c477ea9b212fd89310a09de7749799b..997bbb3d925f51da78f240d258468340e1d8ca50 100644 (file)
@@ -123,8 +123,8 @@ static const struct acpi_device_id dw_i2c_acpi_match[] = {
        { "INT33C3", 0 },
        { "INT3432", 0 },
        { "INT3433", 0 },
-       { "80860F41", 0 },
-       { "808622C1", MODEL_CHERRYTRAIL },
+       { "80860F41", ACCESS_NO_IRQ_SUSPEND },
+       { "808622C1", ACCESS_NO_IRQ_SUSPEND | MODEL_CHERRYTRAIL },
        { "AMD0010", ACCESS_INTR_MASK },
        { "AMDI0010", ACCESS_INTR_MASK },
        { "AMDI0510", 0 },