diff options
Diffstat (limited to 'drivers/gpio/gpio-davinci.c')
-rw-r--r-- | drivers/gpio/gpio-davinci.c | 70 |
1 files changed, 42 insertions, 28 deletions
diff --git a/drivers/gpio/gpio-davinci.c b/drivers/gpio/gpio-davinci.c index 035a454eca43..a5ece8ea79bc 100644 --- a/drivers/gpio/gpio-davinci.c +++ b/drivers/gpio/gpio-davinci.c | |||
@@ -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, 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,6 +219,15 @@ 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 | ||
222 | for (i = 0; i < nirq; i++) { | ||
223 | chips->irqs[i] = platform_get_irq(pdev, i); | ||
224 | if (chips->irqs[i] < 0) { | ||
225 | dev_info(dev, "IRQ not populated, err = %d\n", | ||
226 | chips->irqs[i]); | ||
227 | return chips->irqs[i]; | ||
228 | } | ||
229 | } | ||
230 | |||
212 | snprintf(label, MAX_LABEL_SIZE, "davinci_gpio.%d", ctrl_num++); | 231 | snprintf(label, MAX_LABEL_SIZE, "davinci_gpio.%d", ctrl_num++); |
213 | chips->chip.label = devm_kstrdup(dev, label, GFP_KERNEL); | 232 | chips->chip.label = devm_kstrdup(dev, label, GFP_KERNEL); |
214 | if (!chips->chip.label) | 233 | if (!chips->chip.label) |
@@ -377,7 +396,7 @@ static int gpio_to_irq_unbanked(struct gpio_chip *chip, unsigned offset) | |||
377 | * can provide direct-mapped IRQs to AINTC (up to 32 GPIOs). | 396 | * can provide direct-mapped IRQs to AINTC (up to 32 GPIOs). |
378 | */ | 397 | */ |
379 | if (offset < d->gpio_unbanked) | 398 | if (offset < d->gpio_unbanked) |
380 | return d->base_irq + offset; | 399 | return d->irqs[offset]; |
381 | else | 400 | else |
382 | return -ENODEV; | 401 | return -ENODEV; |
383 | } | 402 | } |
@@ -386,11 +405,18 @@ static int gpio_irq_type_unbanked(struct irq_data *data, unsigned trigger) | |||
386 | { | 405 | { |
387 | struct davinci_gpio_controller *d; | 406 | struct davinci_gpio_controller *d; |
388 | struct davinci_gpio_regs __iomem *g; | 407 | struct davinci_gpio_regs __iomem *g; |
389 | u32 mask; | 408 | u32 mask, i; |
390 | 409 | ||
391 | 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); |
392 | g = (struct davinci_gpio_regs __iomem *)d->regs[0]; | 411 | g = (struct davinci_gpio_regs __iomem *)d->regs[0]; |
393 | 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); | ||
394 | 420 | ||
395 | if (trigger & ~(IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING)) | 421 | if (trigger & ~(IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING)) |
396 | return -EINVAL; | 422 | return -EINVAL; |
@@ -459,9 +485,8 @@ static int davinci_gpio_irq_setup(struct platform_device *pdev) | |||
459 | int ret; | 485 | int ret; |
460 | struct clk *clk; | 486 | struct clk *clk; |
461 | u32 binten = 0; | 487 | u32 binten = 0; |
462 | unsigned ngpio, bank_irq; | 488 | unsigned ngpio; |
463 | struct device *dev = &pdev->dev; | 489 | struct device *dev = &pdev->dev; |
464 | struct resource *res; | ||
465 | struct davinci_gpio_controller *chips = platform_get_drvdata(pdev); | 490 | struct davinci_gpio_controller *chips = platform_get_drvdata(pdev); |
466 | struct davinci_gpio_platform_data *pdata = dev->platform_data; | 491 | struct davinci_gpio_platform_data *pdata = dev->platform_data; |
467 | struct davinci_gpio_regs __iomem *g; | 492 | struct davinci_gpio_regs __iomem *g; |
@@ -481,24 +506,13 @@ static int davinci_gpio_irq_setup(struct platform_device *pdev) | |||
481 | gpio_get_irq_chip = (gpio_get_irq_chip_cb_t)match->data; | 506 | gpio_get_irq_chip = (gpio_get_irq_chip_cb_t)match->data; |
482 | 507 | ||
483 | ngpio = pdata->ngpio; | 508 | ngpio = pdata->ngpio; |
484 | res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); | ||
485 | if (!res) { | ||
486 | dev_err(dev, "Invalid IRQ resource\n"); | ||
487 | return -EBUSY; | ||
488 | } | ||
489 | |||
490 | bank_irq = res->start; | ||
491 | |||
492 | if (!bank_irq) { | ||
493 | dev_err(dev, "Invalid IRQ resource\n"); | ||
494 | return -ENODEV; | ||
495 | } | ||
496 | 509 | ||
497 | clk = devm_clk_get(dev, "gpio"); | 510 | clk = devm_clk_get(dev, "gpio"); |
498 | if (IS_ERR(clk)) { | 511 | if (IS_ERR(clk)) { |
499 | 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)); |
500 | return PTR_ERR(clk); | 513 | return PTR_ERR(clk); |
501 | } | 514 | } |
515 | |||
502 | ret = clk_prepare_enable(clk); | 516 | ret = clk_prepare_enable(clk); |
503 | if (ret) | 517 | if (ret) |
504 | return ret; | 518 | return ret; |
@@ -538,12 +552,11 @@ static int davinci_gpio_irq_setup(struct platform_device *pdev) | |||
538 | if (pdata->gpio_unbanked) { | 552 | if (pdata->gpio_unbanked) { |
539 | /* pass "bank 0" GPIO IRQs to AINTC */ | 553 | /* pass "bank 0" GPIO IRQs to AINTC */ |
540 | chips->chip.to_irq = gpio_to_irq_unbanked; | 554 | chips->chip.to_irq = gpio_to_irq_unbanked; |
541 | chips->base_irq = bank_irq; | ||
542 | chips->gpio_unbanked = pdata->gpio_unbanked; | 555 | chips->gpio_unbanked = pdata->gpio_unbanked; |
543 | binten = GENMASK(pdata->gpio_unbanked / 16, 0); | 556 | binten = GENMASK(pdata->gpio_unbanked / 16, 0); |
544 | 557 | ||
545 | /* AINTC handles mask/unmask; GPIO handles triggering */ | 558 | /* AINTC handles mask/unmask; GPIO handles triggering */ |
546 | irq = bank_irq; | 559 | irq = chips->irqs[0]; |
547 | irq_chip = gpio_get_irq_chip(irq); | 560 | irq_chip = gpio_get_irq_chip(irq); |
548 | irq_chip->name = "GPIO-AINTC"; | 561 | irq_chip->name = "GPIO-AINTC"; |
549 | irq_chip->irq_set_type = gpio_irq_type_unbanked; | 562 | irq_chip->irq_set_type = gpio_irq_type_unbanked; |
@@ -554,10 +567,11 @@ static int davinci_gpio_irq_setup(struct platform_device *pdev) | |||
554 | writel_relaxed(~0, &g->set_rising); | 567 | writel_relaxed(~0, &g->set_rising); |
555 | 568 | ||
556 | /* set the direct IRQs up to use that irqchip */ | 569 | /* set the direct IRQs up to use that irqchip */ |
557 | for (gpio = 0; gpio < pdata->gpio_unbanked; gpio++, irq++) { | 570 | for (gpio = 0; gpio < pdata->gpio_unbanked; gpio++) { |
558 | irq_set_chip(irq, irq_chip); | 571 | irq_set_chip(chips->irqs[gpio], irq_chip); |
559 | irq_set_handler_data(irq, chips); | 572 | irq_set_handler_data(chips->irqs[gpio], chips); |
560 | irq_set_status_flags(irq, IRQ_TYPE_EDGE_BOTH); | 573 | irq_set_status_flags(chips->irqs[gpio], |
574 | IRQ_TYPE_EDGE_BOTH); | ||
561 | } | 575 | } |
562 | 576 | ||
563 | goto done; | 577 | goto done; |
@@ -567,7 +581,7 @@ static int davinci_gpio_irq_setup(struct platform_device *pdev) | |||
567 | * 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 |
568 | * then chain through our own handler. | 582 | * then chain through our own handler. |
569 | */ | 583 | */ |
570 | for (gpio = 0, bank = 0; gpio < ngpio; bank++, bank_irq++, gpio += 16) { | 584 | for (gpio = 0, bank = 0; gpio < ngpio; bank++, gpio += 16) { |
571 | /* disabled by default, enabled only as needed | 585 | /* disabled by default, enabled only as needed |
572 | * There are register sets for 32 GPIOs. 2 banks of 16 | 586 | * There are register sets for 32 GPIOs. 2 banks of 16 |
573 | * 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 |
@@ -594,8 +608,8 @@ static int davinci_gpio_irq_setup(struct platform_device *pdev) | |||
594 | irqdata->bank_num = bank; | 608 | irqdata->bank_num = bank; |
595 | irqdata->chip = chips; | 609 | irqdata->chip = chips; |
596 | 610 | ||
597 | irq_set_chained_handler_and_data(bank_irq, gpio_irq_handler, | 611 | irq_set_chained_handler_and_data(chips->irqs[bank], |
598 | irqdata); | 612 | gpio_irq_handler, irqdata); |
599 | 613 | ||
600 | binten |= BIT(bank); | 614 | binten |= BIT(bank); |
601 | } | 615 | } |