]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
mfd: Allocate twl6040 IRQ numbers dynamically
authorPeter Ujfalusi <peter.ujfalusi@ti.com>
Wed, 16 May 2012 11:11:56 +0000 (14:11 +0300)
committerSamuel Ortiz <sameo@linux.intel.com>
Sun, 20 May 2012 15:27:12 +0000 (17:27 +0200)
Use irq_alloc_descs() to get the IRQ number range dynamically instead of
the hardwired use if pdata->irq_base.
The twl6040 only provides interrupts for it's internal components which
means that it is not working as an IRQ expander type of device.
The client drivers will receive their interrupt numbers as resource which
is configured based on the received IRQ range we got from irq_alloc_descs()

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

index 7a92d95bfb60d603f26a5b3cdc1ced309712a332..c50fba7be778488dd2964dc3953299402c1ab078 100644 (file)
@@ -515,7 +515,7 @@ static int __devinit twl6040_probe(struct i2c_client *client,
        }
 
        /* In order to operate correctly we need valid interrupt config */
-       if (!client->irq || !pdata->irq_base) {
+       if (!client->irq) {
                dev_err(&client->dev, "Invalid IRQ configuration\n");
                return -EINVAL;
        }
@@ -552,7 +552,6 @@ static int __devinit twl6040_probe(struct i2c_client *client,
 
        twl6040->dev = &client->dev;
        twl6040->irq = client->irq;
-       twl6040->irq_base = pdata->irq_base;
 
        mutex_init(&twl6040->mutex);
        mutex_init(&twl6040->io_mutex);
index 008022cdb06d2ef8bc6e3d1349779aadf9bd0ab9..914978e1b62e6aac971e4ec7b8f97b1b0417d8a6 100644 (file)
@@ -23,6 +23,7 @@
 
 #include <linux/kernel.h>
 #include <linux/module.h>
+#include <linux/err.h>
 #include <linux/irq.h>
 #include <linux/interrupt.h>
 #include <linux/mfd/core.h>
@@ -138,7 +139,7 @@ static irqreturn_t twl6040_irq_thread(int irq, void *data)
 
 int twl6040_irq_init(struct twl6040 *twl6040)
 {
-       int i, nr_irqs, ret;
+       int i, nr_irqs, irq_base, ret;
        u8 val;
 
        mutex_init(&twl6040->irq_mutex);
@@ -149,8 +150,16 @@ int twl6040_irq_init(struct twl6040 *twl6040)
        twl6040_reg_write(twl6040, TWL6040_REG_INTMR, TWL6040_ALLINT_MSK);
 
        nr_irqs = ARRAY_SIZE(twl6040_irqs);
+
+       irq_base = irq_alloc_descs(-1, 0, nr_irqs, 0);
+       if (IS_ERR_VALUE(irq_base)) {
+               dev_err(twl6040->dev, "Fail to allocate IRQ descs\n");
+               return irq_base;
+       }
+       twl6040->irq_base = irq_base;
+
        /* Register them with genirq */
-       for (i = twl6040->irq_base; i < twl6040->irq_base + nr_irqs; i++) {
+       for (i = irq_base; i < irq_base + nr_irqs; i++) {
                irq_set_chip_data(i, twl6040);
                irq_set_chip_and_handler(i, &twl6040_irq_chip,
                                         handle_level_irq);