Use a standard irq handler for irq demultiplexing instead of a chained handler.
Remove reimplementation of handle_level_irq and simplifies code.
---
 drivers/mfd/glamo-core.c |   59 +++++++++++++--------------------------------
 1 files changed, 17 insertions(+), 42 deletions(-)

diff --git a/drivers/mfd/glamo-core.c b/drivers/mfd/glamo-core.c
index b90146a..48f56fa 100644
--- a/drivers/mfd/glamo-core.c
+++ b/drivers/mfd/glamo-core.c
@@ -302,46 +302,18 @@ static struct irq_chip glamo_irq_chip = {
        .unmask = glamo_unmask_irq,
 };
 
-static void glamo_irq_demux_handler(unsigned int irq, struct irq_desc *desc)
+static irqreturn_t glamo_irq_demux_handler(int irq, void *data)
 {
-       struct glamo_core *glamo = get_irq_desc_data(desc);
-       desc->status &= ~(IRQ_REPLAY | IRQ_WAITING);
-
-       if (unlikely(desc->status & IRQ_INPROGRESS)) {
-               desc->status |= (IRQ_PENDING | IRQ_MASKED);
-               desc->chip->mask(irq);
-               desc->chip->ack(irq);
-               return;
+       struct glamo_core *glamo = data;
+       uint16_t irqstatus;
+       int i;
+       /* read IRQ status register */
+       irqstatus = __reg_read(glamo, GLAMO_REG_IRQ_STATUS);
+       for (i = 0; i < 9; ++i) {
+               if (irqstatus & BIT(i))
+                       generic_handle_irq(glamo->irq_base + i);
        }
-       kstat_incr_irqs_this_cpu(irq, desc);
-
-       desc->chip->ack(irq);
-       desc->status |= IRQ_INPROGRESS;
-
-       do {
-               uint16_t irqstatus;
-               int i;
-
-               if (unlikely((desc->status &
-                               (IRQ_PENDING | IRQ_MASKED | IRQ_DISABLED)) ==
-                               (IRQ_PENDING | IRQ_MASKED))) {
-                       /* dealing with pending IRQ, unmasking */
-                       desc->chip->unmask(irq);
-                       desc->status &= ~IRQ_MASKED;
-               }
-
-               desc->status &= ~IRQ_PENDING;
-
-               /* read IRQ status register */
-               irqstatus = __reg_read(glamo, GLAMO_REG_IRQ_STATUS);
-               for (i = 0; i < 9; ++i) {
-                       if (irqstatus & BIT(i))
-                               generic_handle_irq(glamo->irq_base + i);
-               }
-
-       } while ((desc->status & (IRQ_PENDING | IRQ_DISABLED)) == IRQ_PENDING);
-
-       desc->status &= ~IRQ_INPROGRESS;
+       return IRQ_HANDLED;
 }
 
 /*
@@ -985,10 +957,6 @@ static int __devinit glamo_probe(struct platform_device 
*pdev)
                                        handle_level_irq);
        }
 
-       set_irq_type(glamo->irq, IRQ_TYPE_EDGE_FALLING);
-       set_irq_data(glamo->irq, glamo);
-       set_irq_chained_handler(glamo->irq, glamo_irq_demux_handler);
-
        ret = mfd_add_devices(&pdev->dev, pdev->id, glamo_cells,
                                ARRAY_SIZE(glamo_cells), mem, glamo->irq_base);
 
@@ -997,6 +965,13 @@ static int __devinit glamo_probe(struct platform_device 
*pdev)
                goto err_free_irqs;
        }
 
+       ret = request_irq(glamo->irq, glamo_irq_demux_handler, 0,
+                         "glamo-core", glamo);
+       if (ret) {
+               dev_err(&pdev->dev, "Failed to grab irq%d: %d\n", glamo->irq, 
ret);
+               goto err_free_irqs;
+       }
+
        dev_info(&glamo->pdev->dev, "Glamo core PLL1: %uHz, PLL2: %uHz\n",
                 glamo_pll_rate(glamo, GLAMO_PLL1),
                 glamo_pll_rate(glamo, GLAMO_PLL2));
-- 
1.7.1


Reply via email to