From 94f60f500c05052b064a96a733b0f36749e2dccc Mon Sep 17 00:00:00 2001 From: Laxminath Kasam Date: Mon, 27 Jul 2020 12:35:12 +0530 Subject: [PATCH] regmap: irq: Add support to clear ack registers WCD937x codec requires clear registers to be written '1' and '0' for clearing interrupts. Add this support in regmap irq inorder to clear ack registers. Change-Id: I399592fc0ee7f3a01a32267684a9be340076ffb1 Signed-off-by: Laxminath Kasam --- drivers/base/regmap/regmap-irq.c | 15 +++++++++++++++ include/linux/regmap.h | 3 +++ 2 files changed, 18 insertions(+) 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;