aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKeerthy <j-keerthy@ti.com>2018-06-12 23:40:37 -0400
committerLinus Walleij <linus.walleij@linaro.org>2018-06-18 01:55:30 -0400
commiteb3744a2dd01cb07ce9f556d56d6fe451f0c313a (patch)
tree0c14eca065d5b66220dc97ffea58ea90e9644900
parentc1d013a70f557e0d6db29398c955b2ec87db1ff8 (diff)
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>
-rw-r--r--drivers/gpio/gpio-davinci.c63
-rw-r--r--include/linux/platform_data/gpio-davinci.h3
2 files changed, 44 insertions, 22 deletions
diff --git a/drivers/gpio/gpio-davinci.c b/drivers/gpio/gpio-davinci.c
index 423d37c95e6b..a5ece8ea79bc 100644
--- a/drivers/gpio/gpio-davinci.c
+++ b/drivers/gpio/gpio-davinci.c
@@ -55,7 +55,7 @@ static inline struct davinci_gpio_regs __iomem *irq2regs(struct irq_data *d)
55 return g; 55 return g;
56} 56}
57 57
58static int davinci_gpio_irq_setup(struct platform_device *pdev, int bank_irq); 58static int davinci_gpio_irq_setup(struct platform_device *pdev);
59 59
60/*--------------------------------------------------------------------------*/ 60/*--------------------------------------------------------------------------*/
61 61
@@ -167,8 +167,8 @@ of_err:
167static int davinci_gpio_probe(struct platform_device *pdev) 167static int davinci_gpio_probe(struct platform_device *pdev)
168{ 168{
169 static int ctrl_num, bank_base; 169 static int ctrl_num, bank_base;
170 int gpio, bank, bank_irq, ret = 0; 170 int gpio, bank, i, ret = 0;
171 unsigned ngpio, nbank; 171 unsigned int ngpio, nbank, nirq;
172 struct davinci_gpio_controller *chips; 172 struct davinci_gpio_controller *chips;
173 struct davinci_gpio_platform_data *pdata; 173 struct davinci_gpio_platform_data *pdata;
174 struct device *dev = &pdev->dev; 174 struct device *dev = &pdev->dev;
@@ -197,6 +197,16 @@ static int davinci_gpio_probe(struct platform_device *pdev)
197 if (WARN_ON(ARCH_NR_GPIOS < ngpio)) 197 if (WARN_ON(ARCH_NR_GPIOS < ngpio))
198 ngpio = ARCH_NR_GPIOS; 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 nbank = DIV_ROUND_UP(ngpio, 32); 210 nbank = DIV_ROUND_UP(ngpio, 32);
201 chips = devm_kcalloc(dev, 211 chips = devm_kcalloc(dev,
202 nbank, sizeof(struct davinci_gpio_controller), 212 nbank, sizeof(struct davinci_gpio_controller),
@@ -209,10 +219,13 @@ static int davinci_gpio_probe(struct platform_device *pdev)
209 if (IS_ERR(gpio_base)) 219 if (IS_ERR(gpio_base))
210 return PTR_ERR(gpio_base); 220 return PTR_ERR(gpio_base);
211 221
212 bank_irq = platform_get_irq(pdev, 0); 222 for (i = 0; i < nirq; i++) {
213 if (bank_irq < 0) { 223 chips->irqs[i] = platform_get_irq(pdev, i);
214 dev_dbg(dev, "IRQ not populated\n"); 224 if (chips->irqs[i] < 0) {
215 return bank_irq; 225 dev_info(dev, "IRQ not populated, err = %d\n",
226 chips->irqs[i]);
227 return chips->irqs[i];
228 }
216 } 229 }
217 230
218 snprintf(label, MAX_LABEL_SIZE, "davinci_gpio.%d", ctrl_num++); 231 snprintf(label, MAX_LABEL_SIZE, "davinci_gpio.%d", ctrl_num++);
@@ -249,7 +262,7 @@ static int davinci_gpio_probe(struct platform_device *pdev)
249 goto err; 262 goto err;
250 263
251 platform_set_drvdata(pdev, chips); 264 platform_set_drvdata(pdev, chips);
252 ret = davinci_gpio_irq_setup(pdev, bank_irq); 265 ret = davinci_gpio_irq_setup(pdev);
253 if (ret) 266 if (ret)
254 goto err; 267 goto err;
255 268
@@ -383,7 +396,7 @@ static int gpio_to_irq_unbanked(struct gpio_chip *chip, unsigned offset)
383 * can provide direct-mapped IRQs to AINTC (up to 32 GPIOs). 396 * can provide direct-mapped IRQs to AINTC (up to 32 GPIOs).
384 */ 397 */
385 if (offset < d->gpio_unbanked) 398 if (offset < d->gpio_unbanked)
386 return d->base_irq + offset; 399 return d->irqs[offset];
387 else 400 else
388 return -ENODEV; 401 return -ENODEV;
389} 402}
@@ -392,11 +405,18 @@ static int gpio_irq_type_unbanked(struct irq_data *data, unsigned trigger)
392{ 405{
393 struct davinci_gpio_controller *d; 406 struct davinci_gpio_controller *d;
394 struct davinci_gpio_regs __iomem *g; 407 struct davinci_gpio_regs __iomem *g;
395 u32 mask; 408 u32 mask, i;
396 409
397 d = (struct davinci_gpio_controller *)irq_data_get_irq_handler_data(data); 410 d = (struct davinci_gpio_controller *)irq_data_get_irq_handler_data(data);
398 g = (struct davinci_gpio_regs __iomem *)d->regs[0]; 411 g = (struct davinci_gpio_regs __iomem *)d->regs[0];
399 mask = __gpio_mask(data->irq - d->base_irq); 412 for (i = 0; i < MAX_INT_PER_BANK; i++)
413 if (data->irq == d->irqs[i])
414 break;
415
416 if (i == MAX_INT_PER_BANK)
417 return -EINVAL;
418
419 mask = __gpio_mask(i);
400 420
401 if (trigger & ~(IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING)) 421 if (trigger & ~(IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING))
402 return -EINVAL; 422 return -EINVAL;
@@ -458,7 +478,7 @@ static const struct of_device_id davinci_gpio_ids[];
458 * (dm6446) can be set appropriately for GPIOV33 pins. 478 * (dm6446) can be set appropriately for GPIOV33 pins.
459 */ 479 */
460 480
461static int davinci_gpio_irq_setup(struct platform_device *pdev, int bank_irq) 481static int davinci_gpio_irq_setup(struct platform_device *pdev)
462{ 482{
463 unsigned gpio, bank; 483 unsigned gpio, bank;
464 int irq; 484 int irq;
@@ -492,6 +512,7 @@ static int davinci_gpio_irq_setup(struct platform_device *pdev, int bank_irq)
492 dev_err(dev, "Error %ld getting gpio clock\n", PTR_ERR(clk)); 512 dev_err(dev, "Error %ld getting gpio clock\n", PTR_ERR(clk));
493 return PTR_ERR(clk); 513 return PTR_ERR(clk);
494 } 514 }
515
495 ret = clk_prepare_enable(clk); 516 ret = clk_prepare_enable(clk);
496 if (ret) 517 if (ret)
497 return ret; 518 return ret;
@@ -531,12 +552,11 @@ static int davinci_gpio_irq_setup(struct platform_device *pdev, int bank_irq)
531 if (pdata->gpio_unbanked) { 552 if (pdata->gpio_unbanked) {
532 /* pass "bank 0" GPIO IRQs to AINTC */ 553 /* pass "bank 0" GPIO IRQs to AINTC */
533 chips->chip.to_irq = gpio_to_irq_unbanked; 554 chips->chip.to_irq = gpio_to_irq_unbanked;
534 chips->base_irq = bank_irq;
535 chips->gpio_unbanked = pdata->gpio_unbanked; 555 chips->gpio_unbanked = pdata->gpio_unbanked;
536 binten = GENMASK(pdata->gpio_unbanked / 16, 0); 556 binten = GENMASK(pdata->gpio_unbanked / 16, 0);
537 557
538 /* AINTC handles mask/unmask; GPIO handles triggering */ 558 /* AINTC handles mask/unmask; GPIO handles triggering */
539 irq = bank_irq; 559 irq = chips->irqs[0];
540 irq_chip = gpio_get_irq_chip(irq); 560 irq_chip = gpio_get_irq_chip(irq);
541 irq_chip->name = "GPIO-AINTC"; 561 irq_chip->name = "GPIO-AINTC";
542 irq_chip->irq_set_type = gpio_irq_type_unbanked; 562 irq_chip->irq_set_type = gpio_irq_type_unbanked;
@@ -547,10 +567,11 @@ static int davinci_gpio_irq_setup(struct platform_device *pdev, int bank_irq)
547 writel_relaxed(~0, &g->set_rising); 567 writel_relaxed(~0, &g->set_rising);
548 568
549 /* set the direct IRQs up to use that irqchip */ 569 /* set the direct IRQs up to use that irqchip */
550 for (gpio = 0; gpio < pdata->gpio_unbanked; gpio++, irq++) { 570 for (gpio = 0; gpio < pdata->gpio_unbanked; gpio++) {
551 irq_set_chip(irq, irq_chip); 571 irq_set_chip(chips->irqs[gpio], irq_chip);
552 irq_set_handler_data(irq, chips); 572 irq_set_handler_data(chips->irqs[gpio], chips);
553 irq_set_status_flags(irq, IRQ_TYPE_EDGE_BOTH); 573 irq_set_status_flags(chips->irqs[gpio],
574 IRQ_TYPE_EDGE_BOTH);
554 } 575 }
555 576
556 goto done; 577 goto done;
@@ -560,7 +581,7 @@ static int davinci_gpio_irq_setup(struct platform_device *pdev, int bank_irq)
560 * Or, AINTC can handle IRQs for banks of 16 GPIO IRQs, which we 581 * Or, AINTC can handle IRQs for banks of 16 GPIO IRQs, which we
561 * then chain through our own handler. 582 * then chain through our own handler.
562 */ 583 */
563 for (gpio = 0, bank = 0; gpio < ngpio; bank++, bank_irq++, gpio += 16) { 584 for (gpio = 0, bank = 0; gpio < ngpio; bank++, gpio += 16) {
564 /* disabled by default, enabled only as needed 585 /* disabled by default, enabled only as needed
565 * There are register sets for 32 GPIOs. 2 banks of 16 586 * There are register sets for 32 GPIOs. 2 banks of 16
566 * GPIOs are covered by each set of registers hence divide by 2 587 * GPIOs are covered by each set of registers hence divide by 2
@@ -587,8 +608,8 @@ static int davinci_gpio_irq_setup(struct platform_device *pdev, int bank_irq)
587 irqdata->bank_num = bank; 608 irqdata->bank_num = bank;
588 irqdata->chip = chips; 609 irqdata->chip = chips;
589 610
590 irq_set_chained_handler_and_data(bank_irq, gpio_irq_handler, 611 irq_set_chained_handler_and_data(chips->irqs[bank],
591 irqdata); 612 gpio_irq_handler, irqdata);
592 613
593 binten |= BIT(bank); 614 binten |= BIT(bank);
594 } 615 }
diff --git a/include/linux/platform_data/gpio-davinci.h b/include/linux/platform_data/gpio-davinci.h
index 90ae19ca828f..57a5a35e0073 100644
--- a/include/linux/platform_data/gpio-davinci.h
+++ b/include/linux/platform_data/gpio-davinci.h
@@ -22,6 +22,7 @@
22#include <asm-generic/gpio.h> 22#include <asm-generic/gpio.h>
23 23
24#define MAX_REGS_BANKS 5 24#define MAX_REGS_BANKS 5
25#define MAX_INT_PER_BANK 32
25 26
26struct davinci_gpio_platform_data { 27struct davinci_gpio_platform_data {
27 u32 ngpio; 28 u32 ngpio;
@@ -41,7 +42,7 @@ struct davinci_gpio_controller {
41 spinlock_t lock; 42 spinlock_t lock;
42 void __iomem *regs[MAX_REGS_BANKS]; 43 void __iomem *regs[MAX_REGS_BANKS];
43 int gpio_unbanked; 44 int gpio_unbanked;
44 unsigned int base_irq; 45 int irqs[MAX_INT_PER_BANK];
45 unsigned int base; 46 unsigned int base;
46}; 47};
47 48