Skip to contentSkip to conversation

i2c-designware: always clear interrupts before enabling them

PATCH Applied Mika Westerberg 2 participants 4 messages May 13, 2013 – May 17, 2013

Subsystems (3)
lore
Share & tools
lore

Mika Westerberg

author maintainer
#0 lore raw

PATCH 1/2 i2c-designware: always clear interrupts before enabling them

If the I2C bus is put to a low power state by an ACPI method it might pull the SDA line low (as its power is removed). Once the bus is put to full power state again, the SDA line is pulled back to high. This transition looks like a STOP condition from the controller point-of-view which sets STOP detected bit in its status register causing the driver to fail subsequent transfers.

Fix this by always clearing all interrupts before we start a transfer.

---
 drivers/i2c/busses/i2c-designware-core.c |    3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/i2c/busses/i2c-designware-core.c +2 -1
index 21fbb34..7a89ca5 100644
@@ -383,7 +383,8 @@ static void i2c_dw_xfer_init(struct dw_i2c_dev *dev)
 	/* Enable the adapter */
 	__i2c_dw_enable(dev, true);
 
-	/* Enable interrupts */
+	/* Clear and enable interrupts */
+	i2c_dw_clear_int(dev);
 	dw_writel(dev, DW_IC_INTR_DEFAULT_MASK, DW_IC_INTR_MASK);
 }
 
Signature · 1 line
1.7.10.4
author maintainer
#1 lore raw

PATCH 2/2 i2c-designware: add Intel BayTrail ACPI ID

This is the same controller as on Intel Lynxpoint but the ACPI ID is different (8086F41). Add support for this.

---
 drivers/i2c/busses/i2c-designware-platdrv.c |    1 +
 1 file changed, 1 insertion(+)
drivers/i2c/busses/i2c-designware-platdrv.c +1 -0
index 8ec9133..35b70a1 100644
@@ -69,6 +69,7 @@ static int dw_i2c_acpi_configure(struct platform_device *pdev)
 static const struct acpi_device_id dw_i2c_acpi_match[] = {
 	{ "INT33C2", 0 },
 	{ "INT33C3", 0 },
+	{ "80860F41", 0 },
 	{ }
 };
 MODULE_DEVICE_TABLE(acpi, dw_i2c_acpi_match);
Signature · 1 line
1.7.10.4
Applied
#2 lore raw

Re: [PATCH 2/2] i2c-designware: add Intel BayTrail ACPI ID

Quoted 4 lines · Mika Westerberg

This is the same controller as on Intel Lynxpoint but the ACPI ID is different (8086F41). Add support for this.

Applied to for-current, thanks!

Applied
#3 lore raw
In reply to Mika Westerberg
Quoted 10 lines · Mika Westerberg

If the I2C bus is put to a low power state by an ACPI method it might pull the SDA line low (as its power is removed). Once the bus is put to full power state again, the SDA line is pulled back to high. This transition looks like a STOP condition from the controller point-of-view which sets STOP detected bit in its status register causing the driver to fail subsequent transfers.

Fix this by always clearing all interrupts before we start a transfer.

Applied to for-current, thanks! Added stable, too.