diff --git a/drivers/base/regmap/regmap-irq.c b/drivers/base/regmap/regmap-irq.c index 3d64c9331a82..be6d4701d0f9 100644 --- a/drivers/base/regmap/regmap-irq.c +++ b/drivers/base/regmap/regmap-irq.c @@ -168,6 +168,11 @@ static void regmap_irq_sync_unlock(struct irq_data *data) ret = regmap_write(map, reg, ~d->mask_buf[i]); else ret = regmap_write(map, reg, d->mask_buf[i]); +#ifdef CONFIG_AUDIO_QGKI + /* some chips needs to clear ack reg after ack */ + if (d->chip->clear_ack) + ret = regmap_write(map, reg, 0x0); +#endif if (ret != 0) dev_err(d->map->dev, "Failed to ack 0x%x: %d\n", reg, ret); @@ -494,6 +499,11 @@ static irqreturn_t regmap_irq_thread(int irq, void *d) reg = chip->ack_base + (i * map->reg_stride * data->irq_reg_stride); ret = regmap_write(map, reg, data->status_buf[i]); +#ifdef CONFIG_AUDIO_QGKI + /* some chips needs to clear ack reg after ack */ + if (chip->clear_ack) + ret = regmap_write(map, reg, 0x0); +#endif if (ret != 0) dev_err(map->dev, "Failed to ack 0x%x: %d\n", reg, ret); @@ -719,6 +729,11 @@ int regmap_add_irq_chip(struct regmap *map, int irq, int irq_flags, else ret = regmap_write(map, reg, d->status_buf[i] & d->mask_buf[i]); +#ifdef CONFIG_AUDIO_QGKI + /* some chips needs to clear ack reg after ack */ + if (chip->clear_ack) + ret = regmap_write(map, reg, 0x0); +#endif if (ret != 0) { dev_err(map->dev, "Failed to ack 0x%x: %d\n", reg, ret); diff --git a/include/linux/regmap.h b/include/linux/regmap.h index dfe493ac692d..124a8732f0aa 100644 --- a/include/linux/regmap.h +++ b/include/linux/regmap.h @@ -1241,6 +1241,9 @@ struct regmap_irq_chip { bool mask_invert:1; bool use_ack:1; bool ack_invert:1; +#ifdef CONFIG_AUDIO_QGKI + bool clear_ack:1; +#endif bool wake_invert:1; bool runtime_pm:1; bool type_invert:1;