The patch titled gpio-driver-for-primecell-pl061-gpio-controller v6 has been added to the -mm tree. Its filename is gpio-driver-for-primecell-pl061-gpio-controller-v6.patch Before you just go and hit "reply", please: a) Consider who else should be cc'ed b) Prefer to cc a suitable mailing list as well c) Ideally: find the original patch on the mailing list and do a reply-to-all to that, adding suitable additional cc's *** Remember to use Documentation/SubmitChecklist when testing your code *** See http://userweb.kernel.org/~akpm/stuff/added-to-mm.txt to find out what to do about this The current -mm tree may be found at http://userweb.kernel.org/~akpm/mmotm/ ------------------------------------------------------ Subject: gpio-driver-for-primecell-pl061-gpio-controller v6 From: Baruch Siach <baruch@xxxxxxxxxx> - Address the comments of David Brownell: * remove gpio_request() from the IRQ code * remove irq_to_gpio() from the IRQ code - Use a bitmap to track initialized trigger IRQ Cc: David Brownell <david-b@xxxxxxxxxxx> Cc: Russell King <rmk@xxxxxxxxxxxxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> --- drivers/gpio/pl061.c | 39 +++++++++++++++-------------------- include/linux/amba/pl061.h | 14 +++++------- 2 files changed, 23 insertions(+), 30 deletions(-) diff -puN drivers/gpio/pl061.c~gpio-driver-for-primecell-pl061-gpio-controller-v6 drivers/gpio/pl061.c --- a/drivers/gpio/pl061.c~gpio-driver-for-primecell-pl061-gpio-controller-v6 +++ a/drivers/gpio/pl061.c @@ -53,6 +53,7 @@ struct pl061_gpio { spinlock_t irq_lock; /* IRQ registers */ void __iomem *base; + unsigned irq_base; struct gpio_chip gc; }; @@ -114,7 +115,7 @@ static void pl061_set_value(struct gpio_ static void pl061_irq_disable(unsigned irq) { struct pl061_gpio *chip = get_irq_chip_data(irq); - int offset = irq_to_gpio(irq) - chip->gc.base; + int offset = irq - chip->irq_base; unsigned long flags; u8 gpioie; @@ -128,7 +129,7 @@ static void pl061_irq_disable(unsigned i static void pl061_irq_enable(unsigned irq) { struct pl061_gpio *chip = get_irq_chip_data(irq); - int offset = irq_to_gpio(irq) - chip->gc.base; + int offset = irq - chip->irq_base; unsigned long flags; u8 gpioie; @@ -139,25 +140,14 @@ static void pl061_irq_enable(unsigned ir spin_unlock_irqrestore(&chip->irq_lock, flags); } -static unsigned int pl061_irq_startup(unsigned irq) -{ - if (gpio_request(irq_to_gpio(irq), "IRQ") == 0) - pr_warning("%s: warning: GPIO%d has not been requested\n", - __func__, irq_to_gpio(irq)); - - pl061_irq_enable(irq); - - return 0; -} - static int pl061_irq_type(unsigned irq, unsigned trigger) { struct pl061_gpio *chip = get_irq_chip_data(irq); - int offset = irq_to_gpio(irq) - chip->gc.base; + int offset = irq - chip->irq_base; unsigned long flags; u8 gpiois, gpioibe, gpioiev; - if (irq_to_gpio(irq) < 0) + if (offset < 0 || offset > PL061_GPIO_NR) return -EINVAL; spin_lock_irqsave(&chip->irq_lock, flags); @@ -196,7 +186,6 @@ static int pl061_irq_type(unsigned irq, static struct irq_chip pl061_irqchip = { .name = "GPIO", - .startup = pl061_irq_startup, .enable = pl061_irq_enable, .disable = pl061_irq_disable, .set_type = pl061_irq_type, @@ -232,6 +221,7 @@ static int __init pl061_probe(struct amb struct pl061_gpio *chip; struct list_head *chip_list; int ret, irq, i; + static unsigned long init_irq[BITS_TO_LONGS(NR_IRQS)]; pdata = dev->dev.platform_data; if (pdata == NULL) @@ -267,6 +257,8 @@ static int __init pl061_probe(struct amb chip->gc.dev = &dev->dev; chip->gc.owner = THIS_MODULE; + chip->irq_base = pdata->irq_base; + ret = gpiochip_add(&chip->gc); if (ret) goto iounmap; @@ -274,6 +266,10 @@ static int __init pl061_probe(struct amb /* * irq_chip support */ + + if (chip->irq_base == (unsigned) -1) + return 0; + writeb(0, chip->base + GPIOIE); /* disable irqs */ irq = dev->irq[0]; if (irq < 0) { @@ -281,7 +277,7 @@ static int __init pl061_probe(struct amb goto iounmap; } set_irq_chained_handler(irq, pl061_irq_handler); - if (!pdata->is_irq_initialized || !pdata->is_irq_initialized(irq)) { + if (!test_and_set_bit(irq, init_irq)) { /* list initialized? */ chip_list = kmalloc(sizeof(*chip_list), GFP_KERNEL); if (chip_list == NULL) { ret = -ENOMEM; @@ -300,11 +296,10 @@ static int __init pl061_probe(struct amb else pl061_direction_input(&chip->gc, i); - set_irq_chip(gpio_to_irq(i+pdata->gpio_base), &pl061_irqchip); - set_irq_handler(gpio_to_irq(i+pdata->gpio_base), - handle_simple_irq); - set_irq_flags(gpio_to_irq(i+pdata->gpio_base), IRQF_VALID); - set_irq_chip_data(gpio_to_irq(i+pdata->gpio_base), chip); + set_irq_chip(i+chip->irq_base, &pl061_irqchip); + set_irq_handler(i+chip->irq_base, handle_simple_irq); + set_irq_flags(i+chip->irq_base, IRQF_VALID); + set_irq_chip_data(i+chip->irq_base, chip); } return 0; diff -puN include/linux/amba/pl061.h~gpio-driver-for-primecell-pl061-gpio-controller-v6 include/linux/amba/pl061.h --- a/include/linux/amba/pl061.h~gpio-driver-for-primecell-pl061-gpio-controller-v6 +++ a/include/linux/amba/pl061.h @@ -4,14 +4,12 @@ struct pl061_platform_data { /* number of the first GPIO */ unsigned gpio_base; + /* number of the first IRQ. + * If the IRQ functionality in not desired this must be set to + * (unsigned) -1. + */ + unsigned irq_base; + u8 directions; /* startup directions, 1: out, 0: in */ u8 values; /* startup values */ - - /* This callback may be used when you have more than one PL061 - * connected to the same IRQ trigger. This callback must return 0 on - * the first time it is called for each irq, and 1 on any other call. - * In case you are not unfortunate enough to have this setup, this - * pointer must be set to NULL. - */ - int (*is_irq_initialized)(int irq); }; _ Patches currently in -mm which might be from baruch@xxxxxxxxxx are origin.patch gpio-driver-for-primecell-pl061-gpio-controller.patch gpio-driver-for-primecell-pl061-gpio-controller-v6.patch -- To unsubscribe from this list: send the line "unsubscribe mm-commits" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html