| .. | .. |
|---|
| 19 | 19 | #include <linux/io.h> |
|---|
| 20 | 20 | #include <linux/gpio/driver.h> |
|---|
| 21 | 21 | #include <linux/of_device.h> |
|---|
| 22 | | -#include <linux/of_irq.h> |
|---|
| 23 | 22 | #include <linux/init.h> |
|---|
| 24 | 23 | #include <linux/irqdomain.h> |
|---|
| 25 | 24 | #include <linux/irqchip/chained_irq.h> |
|---|
| .. | .. |
|---|
| 127 | 126 | u32 val; |
|---|
| 128 | 127 | |
|---|
| 129 | 128 | val = readl(reg_base + GPIO_CONTROL(gpio)) & GPIO_GPCTR0_IOTR_MASK; |
|---|
| 130 | | - return !!val; |
|---|
| 129 | + return val ? GPIO_LINE_DIRECTION_IN : GPIO_LINE_DIRECTION_OUT; |
|---|
| 131 | 130 | } |
|---|
| 132 | 131 | |
|---|
| 133 | 132 | static void bcm_kona_gpio_set(struct gpio_chip *chip, unsigned gpio, int value) |
|---|
| .. | .. |
|---|
| 144 | 143 | raw_spin_lock_irqsave(&kona_gpio->lock, flags); |
|---|
| 145 | 144 | |
|---|
| 146 | 145 | /* this function only applies to output pin */ |
|---|
| 147 | | - if (bcm_kona_gpio_get_dir(chip, gpio) == 1) |
|---|
| 146 | + if (bcm_kona_gpio_get_dir(chip, gpio) == GPIO_LINE_DIRECTION_IN) |
|---|
| 148 | 147 | goto out; |
|---|
| 149 | 148 | |
|---|
| 150 | 149 | reg_offset = value ? GPIO_OUT_SET(bank_id) : GPIO_OUT_CLEAR(bank_id); |
|---|
| .. | .. |
|---|
| 170 | 169 | reg_base = kona_gpio->reg_base; |
|---|
| 171 | 170 | raw_spin_lock_irqsave(&kona_gpio->lock, flags); |
|---|
| 172 | 171 | |
|---|
| 173 | | - if (bcm_kona_gpio_get_dir(chip, gpio) == 1) |
|---|
| 172 | + if (bcm_kona_gpio_get_dir(chip, gpio) == GPIO_LINE_DIRECTION_IN) |
|---|
| 174 | 173 | reg_offset = GPIO_IN_STATUS(bank_id); |
|---|
| 175 | 174 | else |
|---|
| 176 | 175 | reg_offset = GPIO_OUT_STATUS(bank_id); |
|---|
| .. | .. |
|---|
| 373 | 372 | val = readl(reg_base + GPIO_INT_MASK(bank_id)); |
|---|
| 374 | 373 | val |= BIT(bit); |
|---|
| 375 | 374 | writel(val, reg_base + GPIO_INT_MASK(bank_id)); |
|---|
| 375 | + gpiochip_disable_irq(&kona_gpio->gpio_chip, gpio); |
|---|
| 376 | 376 | |
|---|
| 377 | 377 | raw_spin_unlock_irqrestore(&kona_gpio->lock, flags); |
|---|
| 378 | 378 | } |
|---|
| .. | .. |
|---|
| 394 | 394 | val = readl(reg_base + GPIO_INT_MSKCLR(bank_id)); |
|---|
| 395 | 395 | val |= BIT(bit); |
|---|
| 396 | 396 | writel(val, reg_base + GPIO_INT_MSKCLR(bank_id)); |
|---|
| 397 | + gpiochip_enable_irq(&kona_gpio->gpio_chip, gpio); |
|---|
| 397 | 398 | |
|---|
| 398 | 399 | raw_spin_unlock_irqrestore(&kona_gpio->lock, flags); |
|---|
| 399 | 400 | } |
|---|
| .. | .. |
|---|
| 485 | 486 | static int bcm_kona_gpio_irq_reqres(struct irq_data *d) |
|---|
| 486 | 487 | { |
|---|
| 487 | 488 | struct bcm_kona_gpio *kona_gpio = irq_data_get_irq_chip_data(d); |
|---|
| 488 | | - int ret; |
|---|
| 489 | 489 | |
|---|
| 490 | | - ret = gpiochip_lock_as_irq(&kona_gpio->gpio_chip, d->hwirq); |
|---|
| 491 | | - if (ret) { |
|---|
| 492 | | - dev_err(kona_gpio->gpio_chip.parent, |
|---|
| 493 | | - "unable to lock HW IRQ %lu for IRQ\n", |
|---|
| 494 | | - d->hwirq); |
|---|
| 495 | | - return ret; |
|---|
| 496 | | - } |
|---|
| 497 | | - return 0; |
|---|
| 490 | + return gpiochip_reqres_irq(&kona_gpio->gpio_chip, d->hwirq); |
|---|
| 498 | 491 | } |
|---|
| 499 | 492 | |
|---|
| 500 | 493 | static void bcm_kona_gpio_irq_relres(struct irq_data *d) |
|---|
| 501 | 494 | { |
|---|
| 502 | 495 | struct bcm_kona_gpio *kona_gpio = irq_data_get_irq_chip_data(d); |
|---|
| 503 | 496 | |
|---|
| 504 | | - gpiochip_unlock_as_irq(&kona_gpio->gpio_chip, d->hwirq); |
|---|
| 497 | + gpiochip_relres_irq(&kona_gpio->gpio_chip, d->hwirq); |
|---|
| 505 | 498 | } |
|---|
| 506 | 499 | |
|---|
| 507 | 500 | static struct irq_chip bcm_gpio_irq_chip = { |
|---|
| .. | .. |
|---|
| 574 | 567 | { |
|---|
| 575 | 568 | struct device *dev = &pdev->dev; |
|---|
| 576 | 569 | const struct of_device_id *match; |
|---|
| 577 | | - struct resource *res; |
|---|
| 578 | 570 | struct bcm_kona_gpio_bank *bank; |
|---|
| 579 | 571 | struct bcm_kona_gpio *kona_gpio; |
|---|
| 580 | 572 | struct gpio_chip *chip; |
|---|
| .. | .. |
|---|
| 593 | 585 | |
|---|
| 594 | 586 | kona_gpio->gpio_chip = template_chip; |
|---|
| 595 | 587 | chip = &kona_gpio->gpio_chip; |
|---|
| 596 | | - kona_gpio->num_bank = of_irq_count(dev->of_node); |
|---|
| 597 | | - if (kona_gpio->num_bank == 0) { |
|---|
| 588 | + ret = platform_irq_count(pdev); |
|---|
| 589 | + if (!ret) { |
|---|
| 598 | 590 | dev_err(dev, "Couldn't determine # GPIO banks\n"); |
|---|
| 599 | 591 | return -ENOENT; |
|---|
| 592 | + } else if (ret < 0) { |
|---|
| 593 | + return dev_err_probe(dev, ret, "Couldn't determine GPIO banks\n"); |
|---|
| 600 | 594 | } |
|---|
| 595 | + kona_gpio->num_bank = ret; |
|---|
| 596 | + |
|---|
| 601 | 597 | if (kona_gpio->num_bank > GPIO_MAX_BANK_NUM) { |
|---|
| 602 | 598 | dev_err(dev, "Too many GPIO banks configured (max=%d)\n", |
|---|
| 603 | 599 | GPIO_MAX_BANK_NUM); |
|---|
| .. | .. |
|---|
| 624 | 620 | return -ENXIO; |
|---|
| 625 | 621 | } |
|---|
| 626 | 622 | |
|---|
| 627 | | - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
|---|
| 628 | | - kona_gpio->reg_base = devm_ioremap_resource(dev, res); |
|---|
| 623 | + kona_gpio->reg_base = devm_platform_ioremap_resource(pdev, 0); |
|---|
| 629 | 624 | if (IS_ERR(kona_gpio->reg_base)) { |
|---|
| 630 | | - ret = -ENXIO; |
|---|
| 625 | + ret = PTR_ERR(kona_gpio->reg_base); |
|---|
| 631 | 626 | goto err_irq_domain; |
|---|
| 632 | 627 | } |
|---|
| 633 | 628 | |
|---|