regmap: irq: Add mask invert flag for enable register
Xiaofan Tian [Thu, 30 Aug 2012 09:03:35 +0000 (17:03 +0800)]
Currently, regmap will write 1 to mask_base to mask
an interrupt and write 0 to unmask it.

But some chips do not have an interrupt mask register,
and only have interrupt enable register.
Then we should write 0 to disable interrupt and 1 to enable.

So add an mask_invert flag to handle this.
If it is not set, behavior is same as previous.
If set it to 1, the mask value will be inverted
before written to mask_base

Change-Id: I1c6875de71e0b9b9a89a23c1669638df4dfe541e
Signed-off-by: Xiaofan Tian <tianxf@marvell.com>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Signed-off-by: Mallikarjun Kasoju <mkasoju@nvidia.com>
Reviewed-on: http://git-master/r/161554
Reviewed-by: Automatic_Commit_Validation_User
Reviewed-by: Laxman Dewangan <ldewangan@nvidia.com>
GVS: Gerrit_Virtual_Submit

drivers/base/regmap/regmap-irq.c
include/linux/regmap.h

index 6f8f0c1..5eeb32b 100644 (file)
@@ -70,7 +70,11 @@ static void regmap_irq_sync_unlock(struct irq_data *data)
        for (i = 0; i < d->chip->num_regs; i++) {
                reg = d->chip->mask_base +
                        (i * map->reg_stride * d->irq_reg_stride);
-               ret = regmap_update_bits(d->map, reg,
+               if (d->chip->mask_invert)
+                       ret = regmap_update_bits(d->map, reg,
+                                        d->mask_buf_def[i], ~d->mask_buf[i]);
+               else
+                       ret = regmap_update_bits(d->map, reg,
                                         d->mask_buf_def[i], d->mask_buf[i]);
                if (ret != 0)
                        dev_err(d->map->dev, "Failed to sync masks in %x\n",
@@ -313,7 +317,11 @@ int regmap_add_irq_chip(struct regmap *map, int irq, int irq_flags,
                d->mask_buf[i] = d->mask_buf_def[i];
                reg = chip->mask_base +
                        (i * map->reg_stride * d->irq_reg_stride);
-               ret = regmap_update_bits(map, reg,
+               if (chip->mask_invert)
+                       ret = regmap_update_bits(map, reg,
+                                        d->mask_buf[i], ~d->mask_buf[i]);
+               else
+                       ret = regmap_update_bits(map, reg,
                                         d->mask_buf[i], d->mask_buf[i]);
                if (ret != 0) {
                        dev_err(map->dev, "Failed to set masks in 0x%x: %d\n",
index da09499..c62e8c7 100644 (file)
@@ -231,6 +231,7 @@ struct regmap_irq_chip {
        unsigned int ack_base;
        unsigned int wake_base;
        unsigned int irq_reg_stride;
+       unsigned int mask_invert;
 
        int num_regs;