diff options
Diffstat (limited to 'drivers/gpio/gpio-davinci.c')
-rw-r--r-- | drivers/gpio/gpio-davinci.c | 63 |
1 files changed, 42 insertions, 21 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 | ||
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,8 +167,8 @@ of_err: | |||
167 | static int davinci_gpio_probe(struct platform_device *pdev) | 167 | static 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 | ||
461 | static int davinci_gpio_irq_setup(struct platform_device *pdev, int bank_irq) | 481 | static 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 | } |