[lkml]   [2011]   [Mar]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
Messages in this thread
    Patch in this message
    Subject[patch 2/5] gpio-langwell-fix-crap.patch
    commit 0766d20fd (langwell_gpio: modify EOI handling following change
    of kernel irq subsystem) changes

    - desc->chip->eoi(irq);
    + if (desc->chip->irq_eoi)
    + desc->chip->irq_eoi(irq_get_irq_data(irq));
    + else
    + dev_warn(pg->, "missing EOI handler for irq %d\n", irq);

    With the following explanation:

    "Latest kernel has many changes in IRQ subsystem and its interfaces,
    like adding irq_eoi" for struct irq_chip, this patch will make it
    support both the new and old interface."

    This is completely bogus.

    #1) The changelog does not match the patch at all

    #2) This driver relies on the assumption that it sits behind an eoi
    capable interrupt line. If the implementation of the underlying
    chip changes from eoi to irq_eoi then this driver has to follow
    that change and not add a total bogosity.

    #3) Just mechanically changing eoi to irq_eoi without checking the
    background of that change is sloppy at best.

    Remove the sillyness and retrieve the interrupt data from irq_desc
    directly. No need to go through a sparse irq lookup.

    Reported-by: Stephen Rothwell <>
    Signed-off-by: Thomas Gleixner <>
    Cc: Feng Tang <>
    Cc: Alek Du <>
    Cc: Alan Cox <>
    Cc: Andrew Morton <>
    drivers/gpio/langwell_gpio.c | 13 +++++--------
    1 file changed, 5 insertions(+), 8 deletions(-)

    Index: linux-2.6-tip/drivers/gpio/langwell_gpio.c
    --- linux-2.6-tip.orig/drivers/gpio/langwell_gpio.c
    +++ linux-2.6-tip/drivers/gpio/langwell_gpio.c
    @@ -187,10 +187,11 @@ MODULE_DEVICE_TABLE(pci, lnw_gpio_ids);

    static void lnw_irq_handler(unsigned irq, struct irq_desc *desc)
    - struct lnw_gpio *lnw = get_irq_data(irq);
    - u32 base, gpio;
    + struct irq_data *data = irq_desc_get_irq_data(desc);
    + struct lnw_gpio *lnw = irq_data_get_irq_handler_data(data);
    + struct irq_chip *chip = irq_data_get_irq_chip(data);
    + u32 base, gpio, gedr_v;
    void __iomem *gedr;
    - u32 gedr_v;

    /* check GPIO controller to check which pin triggered the interrupt */
    for (base = 0; base < lnw->chip.ngpio; base += 32) {
    @@ -207,11 +208,7 @@ static void lnw_irq_handler(unsigned irq
    writel(gedr_v, gedr);

    - if (desc->chip->irq_eoi)
    - desc->chip->irq_eoi(irq_get_irq_data(irq));
    - else
    - dev_warn(lnw->, "missing EOI handler for irq %d\n", irq);
    + chip->irq_eoi(data);

    static int __devinit lnw_gpio_probe(struct pci_dev *pdev,

     \ /
      Last update: 2011-03-17 20:37    [W:0.024 / U:3.148 seconds]
    ©2003-2017 Jasper Spaans. hosted at Digital OceanAdvertise on this site