lkml.org 
[lkml]   [2011]   [Mar]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    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->chip.dev, "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 <sfr@canb.auug.org.au>
    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Cc: Feng Tang <feng.tang@intel.com>
    Cc: Alek Du <alek.du@intel.com>
    Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
    Cc: Andrew Morton <akpm@linux-foundation.org>
    ---
    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->chip.dev, "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.043 / U:0.068 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site