|
@@ -150,6 +150,7 @@ struct mv64xxx_i2c_data {
|
|
|
/* 5us delay in order to avoid repeated start timing violation */
|
|
|
bool errata_delay;
|
|
|
struct reset_control *rstc;
|
|
|
+ bool irq_clear_inverted;
|
|
|
};
|
|
|
|
|
|
static struct mv64xxx_i2c_regs mv64xxx_i2c_regs_mv64xxx = {
|
|
@@ -568,6 +569,11 @@ mv64xxx_i2c_intr(int irq, void *dev_id)
|
|
|
status = readl(drv_data->reg_base + drv_data->reg_offsets.status);
|
|
|
mv64xxx_i2c_fsm(drv_data, status);
|
|
|
mv64xxx_i2c_do_action(drv_data);
|
|
|
+
|
|
|
+ if (drv_data->irq_clear_inverted)
|
|
|
+ writel(drv_data->cntl_bits | MV64XXX_I2C_REG_CONTROL_IFLG,
|
|
|
+ drv_data->reg_base + drv_data->reg_offsets.control);
|
|
|
+
|
|
|
rc = IRQ_HANDLED;
|
|
|
}
|
|
|
spin_unlock_irqrestore(&drv_data->lock, flags);
|
|
@@ -687,6 +693,7 @@ static const struct i2c_algorithm mv64xxx_i2c_algo = {
|
|
|
*/
|
|
|
static const struct of_device_id mv64xxx_i2c_of_match_table[] = {
|
|
|
{ .compatible = "allwinner,sun4i-i2c", .data = &mv64xxx_i2c_regs_sun4i},
|
|
|
+ { .compatible = "allwinner,sun6i-a31-i2c", .data = &mv64xxx_i2c_regs_sun4i},
|
|
|
{ .compatible = "marvell,mv64xxx-i2c", .data = &mv64xxx_i2c_regs_mv64xxx},
|
|
|
{ .compatible = "marvell,mv78230-i2c", .data = &mv64xxx_i2c_regs_mv64xxx},
|
|
|
{ .compatible = "marvell,mv78230-a0-i2c", .data = &mv64xxx_i2c_regs_mv64xxx},
|
|
@@ -795,6 +802,10 @@ mv64xxx_of_config(struct mv64xxx_i2c_data *drv_data,
|
|
|
drv_data->offload_enabled = false;
|
|
|
drv_data->errata_delay = true;
|
|
|
}
|
|
|
+
|
|
|
+ if (of_device_is_compatible(np, "allwinner,sun6i-a31-i2c"))
|
|
|
+ drv_data->irq_clear_inverted = true;
|
|
|
+
|
|
|
out:
|
|
|
return rc;
|
|
|
#endif
|