Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

gpio: davinci: Do not assume continuous IRQ numbering

Currently the driver assumes that the interrupts are continuous
and does platform_get_irq only once and assumes the rest are continuous,
instead call platform_get_irq for all the interrupts and store them
in an array for later use.

Signed-off-by: Keerthy <j-keerthy@ti.com>
Reviewed-by: Grygorii Strashko <grygorii.strashko@ti.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>

authored by

Keerthy and committed by
Linus Walleij
eb3744a2 c1d013a7

+44 -22
+42 -21
drivers/gpio/gpio-davinci.c
··· 55 55 return g; 56 56 } 57 57 58 - static int davinci_gpio_irq_setup(struct platform_device *pdev, int bank_irq); 58 + static int davinci_gpio_irq_setup(struct platform_device *pdev); 59 59 60 60 /*--------------------------------------------------------------------------*/ 61 61 ··· 167 167 static int davinci_gpio_probe(struct platform_device *pdev) 168 168 { 169 169 static int ctrl_num, bank_base; 170 - int gpio, bank, bank_irq, ret = 0; 171 - unsigned ngpio, nbank; 170 + int gpio, bank, i, ret = 0; 171 + unsigned int ngpio, nbank, nirq; 172 172 struct davinci_gpio_controller *chips; 173 173 struct davinci_gpio_platform_data *pdata; 174 174 struct device *dev = &pdev->dev; ··· 197 197 if (WARN_ON(ARCH_NR_GPIOS < ngpio)) 198 198 ngpio = ARCH_NR_GPIOS; 199 199 200 + /* 201 + * If there are unbanked interrupts then the number of 202 + * interrupts is equal to number of gpios else all are banked so 203 + * number of interrupts is equal to number of banks(each with 16 gpios) 204 + */ 205 + if (pdata->gpio_unbanked) 206 + nirq = pdata->gpio_unbanked; 207 + else 208 + nirq = DIV_ROUND_UP(ngpio, 16); 209 + 200 210 nbank = DIV_ROUND_UP(ngpio, 32); 201 211 chips = devm_kcalloc(dev, 202 212 nbank, sizeof(struct davinci_gpio_controller), ··· 219 209 if (IS_ERR(gpio_base)) 220 210 return PTR_ERR(gpio_base); 221 211 222 - bank_irq = platform_get_irq(pdev, 0); 223 - if (bank_irq < 0) { 224 - dev_dbg(dev, "IRQ not populated\n"); 225 - return bank_irq; 212 + for (i = 0; i < nirq; i++) { 213 + chips->irqs[i] = platform_get_irq(pdev, i); 214 + if (chips->irqs[i] < 0) { 215 + dev_info(dev, "IRQ not populated, err = %d\n", 216 + chips->irqs[i]); 217 + return chips->irqs[i]; 218 + } 226 219 } 227 220 228 221 snprintf(label, MAX_LABEL_SIZE, "davinci_gpio.%d", ctrl_num++); ··· 262 249 goto err; 263 250 264 251 platform_set_drvdata(pdev, chips); 265 - ret = davinci_gpio_irq_setup(pdev, bank_irq); 252 + ret = davinci_gpio_irq_setup(pdev); 266 253 if (ret) 267 254 goto err; 268 255 ··· 396 383 * can provide direct-mapped IRQs to AINTC (up to 32 GPIOs). 397 384 */ 398 385 if (offset < d->gpio_unbanked) 399 - return d->base_irq + offset; 386 + return d->irqs[offset]; 400 387 else 401 388 return -ENODEV; 402 389 } ··· 405 392 { 406 393 struct davinci_gpio_controller *d; 407 394 struct davinci_gpio_regs __iomem *g; 408 - u32 mask; 395 + u32 mask, i; 409 396 410 397 d = (struct davinci_gpio_controller *)irq_data_get_irq_handler_data(data); 411 398 g = (struct davinci_gpio_regs __iomem *)d->regs[0]; 412 - mask = __gpio_mask(data->irq - d->base_irq); 399 + for (i = 0; i < MAX_INT_PER_BANK; i++) 400 + if (data->irq == d->irqs[i]) 401 + break; 402 + 403 + if (i == MAX_INT_PER_BANK) 404 + return -EINVAL; 405 + 406 + mask = __gpio_mask(i); 413 407 414 408 if (trigger & ~(IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING)) 415 409 return -EINVAL; ··· 478 458 * (dm6446) can be set appropriately for GPIOV33 pins. 479 459 */ 480 460 481 - static int davinci_gpio_irq_setup(struct platform_device *pdev, int bank_irq) 461 + static int davinci_gpio_irq_setup(struct platform_device *pdev) 482 462 { 483 463 unsigned gpio, bank; 484 464 int irq; ··· 512 492 dev_err(dev, "Error %ld getting gpio clock\n", PTR_ERR(clk)); 513 493 return PTR_ERR(clk); 514 494 } 495 + 515 496 ret = clk_prepare_enable(clk); 516 497 if (ret) 517 498 return ret; ··· 552 531 if (pdata->gpio_unbanked) { 553 532 /* pass "bank 0" GPIO IRQs to AINTC */ 554 533 chips->chip.to_irq = gpio_to_irq_unbanked; 555 - chips->base_irq = bank_irq; 556 534 chips->gpio_unbanked = pdata->gpio_unbanked; 557 535 binten = GENMASK(pdata->gpio_unbanked / 16, 0); 558 536 559 537 /* AINTC handles mask/unmask; GPIO handles triggering */ 560 - irq = bank_irq; 538 + irq = chips->irqs[0]; 561 539 irq_chip = gpio_get_irq_chip(irq); 562 540 irq_chip->name = "GPIO-AINTC"; 563 541 irq_chip->irq_set_type = gpio_irq_type_unbanked; ··· 567 547 writel_relaxed(~0, &g->set_rising); 568 548 569 549 /* set the direct IRQs up to use that irqchip */ 570 - for (gpio = 0; gpio < pdata->gpio_unbanked; gpio++, irq++) { 571 - irq_set_chip(irq, irq_chip); 572 - irq_set_handler_data(irq, chips); 573 - irq_set_status_flags(irq, IRQ_TYPE_EDGE_BOTH); 550 + for (gpio = 0; gpio < pdata->gpio_unbanked; gpio++) { 551 + irq_set_chip(chips->irqs[gpio], irq_chip); 552 + irq_set_handler_data(chips->irqs[gpio], chips); 553 + irq_set_status_flags(chips->irqs[gpio], 554 + IRQ_TYPE_EDGE_BOTH); 574 555 } 575 556 576 557 goto done; ··· 581 560 * Or, AINTC can handle IRQs for banks of 16 GPIO IRQs, which we 582 561 * then chain through our own handler. 583 562 */ 584 - for (gpio = 0, bank = 0; gpio < ngpio; bank++, bank_irq++, gpio += 16) { 563 + for (gpio = 0, bank = 0; gpio < ngpio; bank++, gpio += 16) { 585 564 /* disabled by default, enabled only as needed 586 565 * There are register sets for 32 GPIOs. 2 banks of 16 587 566 * GPIOs are covered by each set of registers hence divide by 2 ··· 608 587 irqdata->bank_num = bank; 609 588 irqdata->chip = chips; 610 589 611 - irq_set_chained_handler_and_data(bank_irq, gpio_irq_handler, 612 - irqdata); 590 + irq_set_chained_handler_and_data(chips->irqs[bank], 591 + gpio_irq_handler, irqdata); 613 592 614 593 binten |= BIT(bank); 615 594 }
+2 -1
include/linux/platform_data/gpio-davinci.h
··· 22 22 #include <asm-generic/gpio.h> 23 23 24 24 #define MAX_REGS_BANKS 5 25 + #define MAX_INT_PER_BANK 32 25 26 26 27 struct davinci_gpio_platform_data { 27 28 u32 ngpio; ··· 42 41 spinlock_t lock; 43 42 void __iomem *regs[MAX_REGS_BANKS]; 44 43 int gpio_unbanked; 45 - unsigned int base_irq; 44 + int irqs[MAX_INT_PER_BANK]; 46 45 unsigned int base; 47 46 }; 48 47