@@ -374,7 +374,15 @@ static void i2c_dw_configure_mode(struct dw_i2c_dev *dev, int mode)
regmap_write(dev->map, DW_IC_CON, dev->slave_cfg);
regmap_write(dev->map, DW_IC_SAR, dev->slave->addr);
regmap_write(dev->map, DW_IC_INTR_MASK, DW_IC_INTR_SLAVE_MASK);
- __i2c_dw_enable(dev);
+ /*
+ * Per the Synopsys DW_apb_i2c DataBook v2.03a (Multiple SAR
+ * feature), controllers synthesised with multiple SARs only
+ * acknowledge traffic to IC_SAR when IC_ENABLE.SAR_EN is set;
+ * a plain enable is not enough. The bit is reserved (ignored) on
+ * single-SAR controllers.
+ */
+ regmap_write(dev->map, DW_IC_ENABLE,
+ DW_IC_ENABLE_ENABLE | DW_IC_ENABLE_SAR_EN);
break;
default:
WARN(1, "Invalid mode %d\n", mode);
@@ -125,6 +125,7 @@
#define DW_IC_ENABLE_ENABLE BIT(0)
#define DW_IC_ENABLE_ABORT BIT(1)
+#define DW_IC_ENABLE_SAR_EN BIT(19)
#define DW_IC_STATUS_ACTIVITY BIT(0)
#define DW_IC_STATUS_TFE BIT(2)