mfd: twl6040: Correct Ready and Thermal interrupt handling
authorPeter Ujfalusi <peter.ujfalusi@ti.com>
Thu, 11 Oct 2012 11:55:31 +0000 (13:55 +0200)
committerSamuel Ortiz <sameo@linux.intel.com>
Tue, 13 Nov 2012 18:54:22 +0000 (19:54 +0100)
Create new irq handler for thermal events in order to be able to handle the
event and clean up the code regarding to interrupt handling:
Use proper function names for the irq handlers
No need to read the INTD register anymore.

Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com>
Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
drivers/mfd/twl6040-core.c

index 6d9db27..5817bc6 100644 (file)
@@ -193,27 +193,27 @@ static void twl6040_power_down_manual(struct twl6040 *twl6040)
        twl6040_reg_write(twl6040, TWL6040_REG_LDOCTL, ldoctl);
 }
 
-static irqreturn_t twl6040_naudint_handler(int irq, void *data)
+static irqreturn_t twl6040_readyint_handler(int irq, void *data)
 {
        struct twl6040 *twl6040 = data;
-       u8 intid, status;
 
-       intid = twl6040_reg_read(twl6040, TWL6040_REG_INTID);
+       complete(&twl6040->ready);
 
-       if (intid & TWL6040_READYINT)
-               complete(&twl6040->ready);
+       return IRQ_HANDLED;
+}
 
-       if (intid & TWL6040_THINT) {
-               status = twl6040_reg_read(twl6040, TWL6040_REG_STATUS);
-               if (status & TWL6040_TSHUTDET) {
-                       dev_warn(twl6040->dev,
-                                "Thermal shutdown, powering-off");
-                       twl6040_power(twl6040, 0);
-               } else {
-                       dev_warn(twl6040->dev,
-                                "Leaving thermal shutdown, powering-on");
-                       twl6040_power(twl6040, 1);
-               }
+static irqreturn_t twl6040_thint_handler(int irq, void *data)
+{
+       struct twl6040 *twl6040 = data;
+       u8 status;
+
+       status = twl6040_reg_read(twl6040, TWL6040_REG_STATUS);
+       if (status & TWL6040_TSHUTDET) {
+               dev_warn(twl6040->dev, "Thermal shutdown, powering-off");
+               twl6040_power(twl6040, 0);
+       } else {
+               dev_warn(twl6040->dev, "Leaving thermal shutdown, powering-on");
+               twl6040_power(twl6040, 1);
        }
 
        return IRQ_HANDLED;
@@ -580,12 +580,19 @@ static int __devinit twl6040_probe(struct i2c_client *client,
                goto irq_init_err;
 
        ret = request_threaded_irq(twl6040->irq_base + TWL6040_IRQ_READY,
-                                  NULL, twl6040_naudint_handler, IRQF_ONESHOT,
+                                  NULL, twl6040_readyint_handler, IRQF_ONESHOT,
                                   "twl6040_irq_ready", twl6040);
        if (ret) {
-               dev_err(twl6040->dev, "READY IRQ request failed: %d\n",
-                       ret);
-               goto irq_err;
+               dev_err(twl6040->dev, "READY IRQ request failed: %d\n", ret);
+               goto readyirq_err;
+       }
+
+       ret = request_threaded_irq(twl6040->irq_base + TWL6040_IRQ_TH,
+                                  NULL, twl6040_thint_handler, IRQF_ONESHOT,
+                                  "twl6040_irq_th", twl6040);
+       if (ret) {
+               dev_err(twl6040->dev, "Thermal IRQ request failed: %d\n", ret);
+               goto thirq_err;
        }
 
        /* dual-access registers controlled by I2C only */
@@ -650,8 +657,10 @@ static int __devinit twl6040_probe(struct i2c_client *client,
        return 0;
 
 mfd_err:
+       free_irq(twl6040->irq_base + TWL6040_IRQ_TH, twl6040);
+thirq_err:
        free_irq(twl6040->irq_base + TWL6040_IRQ_READY, twl6040);
-irq_err:
+readyirq_err:
        twl6040_irq_exit(twl6040);
 irq_init_err:
        if (gpio_is_valid(twl6040->audpwron))
@@ -677,6 +686,7 @@ static int __devexit twl6040_remove(struct i2c_client *client)
                gpio_free(twl6040->audpwron);
 
        free_irq(twl6040->irq_base + TWL6040_IRQ_READY, twl6040);
+       free_irq(twl6040->irq_base + TWL6040_IRQ_TH, twl6040);
        twl6040_irq_exit(twl6040);
 
        mfd_remove_devices(&client->dev);