mfd: max77663: Update the driver to the new irq APIs
[linux-2.6.git] / drivers / mfd / max77663-core.c
index cce2b32..349e5f5 100644 (file)
@@ -57,9 +57,6 @@
 #define MAX77663_REG_GPIO_PD           0x3F
 #define MAX77663_REG_GPIO_ALT          0x40
 
-#define MAX77663_REG_RTC_IRQ           0x00
-#define MAX77663_REG_RTC_IRQ_MASK      0x01
-
 #define IRQ_TOP_GLBL_MASK              (1 << 7)
 #define IRQ_TOP_GLBL_SHIFT             7
 #define IRQ_TOP_SD_MASK                        (1 << 6)
@@ -85,9 +82,6 @@
 #define IRQ_GPIO_BASE                  MAX77663_IRQ_GPIO0
 #define IRQ_GPIO_END                   MAX77663_IRQ_GPIO7
 
-#define IRQ_RTC_BASE                   MAX77663_IRQ_RTC_1SEC
-#define IRQ_RTC_END                    MAX77663_IRQ_RTC_SMPL
-
 #define IRQ_ONOFF_BASE                 MAX77663_IRQ_ONOFF_HRDPOWRN
 #define IRQ_ONOFF_END                  MAX77663_IRQ_ONOFF_ACOK_RISING
 
@@ -120,7 +114,6 @@ enum {
        CACHE_IRQ_LBT,
        CACHE_IRQ_SD,
        CACHE_IRQ_LDO,
-       CACHE_IRQ_RTC,
        CACHE_IRQ_ONOFF,
        CACHE_IRQ_NR,
 };
@@ -178,16 +171,6 @@ struct max77663_chip *max77663_chip;
                .cache_idx = -1,                        \
        }
 
-#define IRQ_DATA_RTC(_name, _shift)                    \
-       [MAX77663_IRQ_RTC_##_name] = {                  \
-               .mask_reg = MAX77663_REG_RTC_IRQ_MASK,  \
-               .mask = (1 << _shift),                  \
-               .top_mask = IRQ_TOP_RTC_MASK,           \
-               .top_shift = IRQ_TOP_RTC_SHIFT,         \
-               .cache_idx = CACHE_IRQ_RTC,             \
-               .is_rtc = 1,                            \
-       }
-
 #define IRQ_DATA_ONOFF(_name, _shift)                  \
        [MAX77663_IRQ_ONOFF_##_name] = {                \
                .mask_reg = MAX77663_REG_ONOFF_IRQ_MASK,\
@@ -209,11 +192,6 @@ static struct max77663_irq_data max77663_irqs[MAX77663_IRQ_NR] = {
        IRQ_DATA_GPIO(5),
        IRQ_DATA_GPIO(6),
        IRQ_DATA_GPIO(7),
-       IRQ_DATA_RTC(1SEC,  4),
-       IRQ_DATA_RTC(60SEC, 0),
-       IRQ_DATA_RTC(ALRM1, 1),
-       IRQ_DATA_RTC(ALRM2, 2),
-       IRQ_DATA_RTC(SMPL,  3),
        IRQ_DATA_ONOFF(HRDPOWRN,     0),
        IRQ_DATA_ONOFF(EN0_1SEC,     1),
        IRQ_DATA_ONOFF(EN0_FALLING,  2),
@@ -222,6 +200,12 @@ static struct max77663_irq_data max77663_irqs[MAX77663_IRQ_NR] = {
        IRQ_DATA_ONOFF(LID_RISING,   5),
        IRQ_DATA_ONOFF(ACOK_FALLING, 6),
        IRQ_DATA_ONOFF(ACOK_RISING,  7),
+       [MAX77663_IRQ_RTC] = {
+               .top_mask = IRQ_TOP_RTC_MASK,
+               .top_shift = IRQ_TOP_RTC_SHIFT,
+               .cache_idx = -1,
+               .is_rtc = 1,
+       },
        [MAX77663_IRQ_SD_PF] = {
                .mask_reg = MAX77663_REG_SD_IRQ_MASK,
                .mask = 0xF8,
@@ -662,32 +646,32 @@ static void max77663_gpio_exit(struct max77663_chip *chip)
                dev_err(chip->dev, "gpio_exit: Failed to remove gpiochip\n");
 }
 
-static void max77663_irq_mask(unsigned int irq)
+static void max77663_irq_mask(struct irq_data *data)
 {
-       struct max77663_chip *chip = get_irq_chip_data(irq);
+       struct max77663_chip *chip = irq_data_get_irq_chip_data(data);
 
-       max77663_irqs[irq - chip->irq_base].is_unmask = 0;
+       max77663_irqs[data->irq - chip->irq_base].is_unmask = 0;
 }
 
-static void max77663_irq_unmask(unsigned int irq)
+static void max77663_irq_unmask(struct irq_data *data)
 {
-       struct max77663_chip *chip = get_irq_chip_data(irq);
+       struct max77663_chip *chip = irq_data_get_irq_chip_data(data);
 
-       max77663_irqs[irq - chip->irq_base].is_unmask = 1;
+       max77663_irqs[data->irq - chip->irq_base].is_unmask = 1;
 }
 
-static void max77663_irq_lock(unsigned int irq)
+static void max77663_irq_lock(struct irq_data *data)
 {
-       struct max77663_chip *chip = get_irq_chip_data(irq);
+       struct max77663_chip *chip = irq_data_get_irq_chip_data(data);
 
        mutex_lock(&chip->irq_lock);
 }
 
-static void max77663_irq_sync_unlock(unsigned int irq)
+static void max77663_irq_sync_unlock(struct irq_data *data)
 {
-       struct max77663_chip *chip = get_irq_chip_data(irq);
+       struct max77663_chip *chip = irq_data_get_irq_chip_data(data);
        struct max77663_irq_data *irq_data =
-                       &max77663_irqs[irq - chip->irq_base];
+                       &max77663_irqs[data->irq - chip->irq_base];
        int idx = irq_data->cache_idx;
        u8 irq_top_mask = chip->cache_irq_top_mask;
        u16 irq_mask = chip->cache_irq_mask[idx];
@@ -730,7 +714,7 @@ static void max77663_irq_sync_unlock(unsigned int irq)
 
                chip->cache_irq_mask[idx] = irq_mask;
        } else if ((idx == -1) && (irq_data->top_mask == IRQ_TOP_GPIO_MASK)) {
-               unsigned offset = irq - chip->irq_base - IRQ_GPIO_BASE;
+               unsigned offset = data->irq - chip->irq_base - IRQ_GPIO_BASE;
                u8 shift = GPIO_CTRL_REFE_IRQ_SHIFT;
 
                if (irq_data->is_unmask) {
@@ -762,12 +746,12 @@ out:
        mutex_unlock(&chip->irq_lock);
 }
 
-static int max77663_irq_gpio_set_type(unsigned int irq, unsigned int type)
+static int max77663_irq_gpio_set_type(struct irq_data *data, unsigned int type)
 {
-       struct max77663_chip *chip = get_irq_chip_data(irq);
+       struct max77663_chip *chip = irq_data_get_irq_chip_data(data);
        struct max77663_irq_data *irq_data =
-                       &max77663_irqs[irq - chip->irq_base];
-       unsigned offset = irq - chip->irq_base - IRQ_GPIO_BASE;
+                       &max77663_irqs[data->irq - chip->irq_base];
+       unsigned offset = data->irq - chip->irq_base - IRQ_GPIO_BASE;
        u8 shift = GPIO_CTRL_REFE_IRQ_SHIFT;
        u8 val;
 
@@ -802,15 +786,11 @@ static inline int max77663_do_irq(struct max77663_chip *chip, u8 addr,
        int irqs_to_handle[irq_end - irq_base + 1];
        int handled = 0;
        u16 val;
-       int is_rtc = 0;
        u32 len = 1;
        int i;
        int ret;
 
-       if (addr == MAX77663_REG_RTC_IRQ)
-               is_rtc = 1;
-
-       ret = max77663_read(chip->dev, addr, &val, len, is_rtc);
+       ret = max77663_read(chip->dev, addr, &val, len, 0);
        if (ret < 0)
                return ret;
 
@@ -854,13 +834,6 @@ static irqreturn_t max77663_irq(int irq, void *data)
                        return IRQ_NONE;
        }
 
-       if (irq_top & IRQ_TOP_RTC_MASK) {
-               ret = max77663_do_irq(chip, MAX77663_REG_RTC_IRQ, IRQ_RTC_BASE,
-                                     IRQ_RTC_END);
-               if (ret < 0)
-                       return IRQ_NONE;
-       }
-
        if (irq_top & IRQ_TOP_ONOFF_MASK) {
                ret = max77663_do_irq(chip, MAX77663_REG_ONOFF_IRQ,
                                      IRQ_ONOFF_BASE, IRQ_ONOFF_END);
@@ -868,6 +841,9 @@ static irqreturn_t max77663_irq(int irq, void *data)
                        return IRQ_NONE;
        }
 
+       if (irq_top & IRQ_TOP_RTC_MASK)
+               handle_nested_irq(MAX77663_IRQ_RTC + chip->irq_base);
+
        if (irq_top & IRQ_TOP_SD_MASK)
                handle_nested_irq(MAX77663_IRQ_SD_PF + chip->irq_base);
 
@@ -885,19 +861,19 @@ static irqreturn_t max77663_irq(int irq, void *data)
 
 static struct irq_chip max77663_irq_gpio_chip = {
        .name = "max77663-irq",
-       .mask = max77663_irq_mask,
-       .unmask = max77663_irq_unmask,
-       .set_type = max77663_irq_gpio_set_type,
-       .bus_lock = max77663_irq_lock,
-       .bus_sync_unlock = max77663_irq_sync_unlock,
+       .irq_mask = max77663_irq_mask,
+       .irq_unmask = max77663_irq_unmask,
+       .irq_set_type = max77663_irq_gpio_set_type,
+       .irq_bus_lock = max77663_irq_lock,
+       .irq_bus_sync_unlock = max77663_irq_sync_unlock,
 };
 
 static struct irq_chip max77663_irq_chip = {
        .name = "max77663-irq",
-       .mask = max77663_irq_mask,
-       .unmask = max77663_irq_unmask,
-       .bus_lock = max77663_irq_lock,
-       .bus_sync_unlock = max77663_irq_sync_unlock,
+       .irq_mask = max77663_irq_mask,
+       .irq_unmask = max77663_irq_unmask,
+       .irq_bus_lock = max77663_irq_lock,
+       .irq_bus_sync_unlock = max77663_irq_sync_unlock,
 };
 
 static int max77663_irq_init(struct max77663_chip *chip)
@@ -913,7 +889,6 @@ static int max77663_irq_init(struct max77663_chip *chip)
        chip->cache_irq_mask[CACHE_IRQ_LBT] = 0x0F;
        chip->cache_irq_mask[CACHE_IRQ_SD] = 0xFF;
        chip->cache_irq_mask[CACHE_IRQ_LDO] = 0xFFFF;
-       chip->cache_irq_mask[CACHE_IRQ_RTC] = 0xFF;
        chip->cache_irq_mask[CACHE_IRQ_ONOFF] = 0xFF;
 
        max77663_write(chip->dev, MAX77663_REG_IRQ_TOP_MASK,
@@ -924,8 +899,6 @@ static int max77663_irq_init(struct max77663_chip *chip)
                       &chip->cache_irq_mask[CACHE_IRQ_SD], 1, 0);
        max77663_write(chip->dev, MAX77663_REG_LDOX_IRQ_MASK,
                       &chip->cache_irq_mask[CACHE_IRQ_LDO], 2, 0);
-       max77663_write(chip->dev, MAX77663_REG_RTC_IRQ_MASK,
-                      &chip->cache_irq_mask[CACHE_IRQ_RTC], 1, 1);
        max77663_write(chip->dev, MAX77663_REG_ONOFF_IRQ_MASK,
                       &chip->cache_irq_mask[CACHE_IRQ_ONOFF], 1, 0);
 
@@ -934,7 +907,6 @@ static int max77663_irq_init(struct max77663_chip *chip)
        max77663_read(chip->dev, MAX77663_REG_SD_IRQ, &temp, 1, 0);
        max77663_read(chip->dev, MAX77663_REG_LDOX_IRQ, &temp, 2, 0);
        max77663_read(chip->dev, MAX77663_REG_GPIO_IRQ, &temp, 1, 0);
-       max77663_read(chip->dev, MAX77663_REG_RTC_IRQ, &temp, 1, 1);
        max77663_read(chip->dev, MAX77663_REG_ONOFF_IRQ, &temp, 1, 0);
 
        for (i = chip->irq_base; i < (MAX77663_IRQ_NR + chip->irq_base); i++) {
@@ -944,21 +916,21 @@ static int max77663_irq_init(struct max77663_chip *chip)
                        continue;
                }
 
-               set_irq_chip_data(i, chip);
+               irq_set_chip_data(i, chip);
 
                if ((IRQ_GPIO_BASE <= i - chip->irq_base) &&
                                (i - chip->irq_base <= IRQ_GPIO_END))
-                       set_irq_chip_and_handler(i, &max77663_irq_gpio_chip,
+                       irq_set_chip_and_handler(i, &max77663_irq_gpio_chip,
                                                 handle_edge_irq);
                else
-                       set_irq_chip_and_handler(i, &max77663_irq_chip,
+                       irq_set_chip_and_handler(i, &max77663_irq_chip,
                                                 handle_edge_irq);
 #ifdef CONFIG_ARM
                set_irq_flags(i, IRQF_VALID);
 #else
-               set_irq_noprobe(i);
+               irq_set_noprobe(i);
 #endif
-               set_irq_nested_thread(i, 1);
+               irq_set_nested_thread(i, 1);
        }
 
        ret = request_threaded_irq(chip->i2c_power->irq, NULL, max77663_irq,
@@ -969,6 +941,9 @@ static int max77663_irq_init(struct max77663_chip *chip)
                return ret;
        }
 
+       device_init_wakeup(chip->dev, 1);
+       enable_irq_wake(chip->i2c_power->irq);
+
        chip->cache_irq_top_mask &= ~IRQ_TOP_GLBL_MASK;
        max77663_write(chip->dev, MAX77663_REG_IRQ_TOP_MASK,
                       &chip->cache_irq_top_mask, 1, 0);
@@ -1132,7 +1107,7 @@ static int max77663_probe(struct i2c_client *client,
 {
        struct max77663_platform_data *pdata = client->dev.platform_data;
        struct max77663_chip *chip;
-       int i, ret = 0;
+       int ret = 0;
 
        if (pdata == NULL) {
                dev_err(&client->dev, "probe: Invalid platform_data\n");
@@ -1159,8 +1134,6 @@ static int max77663_probe(struct i2c_client *client,
        chip->irq_base = pdata->irq_base;
        chip->gpio_base = pdata->gpio_base;
        mutex_init(&chip->io_lock);
-       for (i = 0; i < pdata->num_subdevs; i++)
-               pdata->sub_devices[i].driver_data = chip;
 
        max77663_gpio_init(chip);
        max77663_irq_init(chip);