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 to clear ack registers. Change-Id: I399592fc0ee7f3a01a32267684a9be340076ffb1 Signed-off-by: Ramprasad Katkam <katkam@codeaurora.org>
This commit is contained in:
parent
eac6c82e38
commit
25401ed921
@ -154,6 +154,9 @@ 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]);
|
||||
/* some chips needs to clear ack reg after ack */
|
||||
if (d->chip->clear_ack)
|
||||
ret = regmap_write(map, reg, 0x0);
|
||||
if (ret != 0)
|
||||
dev_err(d->map->dev, "Failed to ack 0x%x: %d\n",
|
||||
reg, ret);
|
||||
@ -364,6 +367,9 @@ 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]);
|
||||
/* some chips needs to clear ack reg after ack */
|
||||
if (chip->clear_ack)
|
||||
ret = regmap_write(map, reg, 0x0);
|
||||
if (ret != 0)
|
||||
dev_err(map->dev, "Failed to ack 0x%x: %d\n",
|
||||
reg, ret);
|
||||
@ -575,6 +581,9 @@ 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]);
|
||||
/* some chips needs to clear ack reg after ack */
|
||||
if (chip->clear_ack)
|
||||
ret = regmap_write(map, reg, 0x0);
|
||||
if (ret != 0) {
|
||||
dev_err(map->dev, "Failed to ack 0x%x: %d\n",
|
||||
reg, ret);
|
||||
|
@ -1176,6 +1176,7 @@ struct regmap_irq_chip {
|
||||
unsigned int wake_base;
|
||||
unsigned int type_base;
|
||||
unsigned int irq_reg_stride;
|
||||
unsigned int clear_ack;
|
||||
bool mask_writeonly:1;
|
||||
bool init_ack_masked:1;
|
||||
bool mask_invert:1;
|
||||
|
Loading…
Reference in New Issue
Block a user