diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2015-04-18 08:22:10 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2015-04-18 08:22:10 -0400 |
commit | 510965dd4a0a59504ba38455f77339ea8b4c6a70 (patch) | |
tree | 36492629ac68de94457482562660154f28e9e039 /drivers/gpio/gpio-omap.c | |
parent | 40d7839879b4584f91522d841afb22ed401cf40f (diff) | |
parent | 03daa6f82f2b634019fe8261698f6af3c133497f (diff) |
Merge tag 'gpio-v4.1-1' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-gpio
Pull GPIO updates from Linus Walleij:
"This is the bulk of GPIO changes for the v4.1 development cycle:
- A new GPIO hogging mechanism has been added. This can be used on
boards that want to drive some GPIO line high, low, or set it as
input on boot and then never touch it again. For some embedded
systems this is bliss and simplifies things to a great extent.
- Some API cleanup and closure: gpiod_get_array() and
gpiod_put_array() has been added to get and put GPIOs in bulk as
was possible with the non-descriptor API.
- Encapsulate cross-calls to the pin control subsystem in
<linux/gpio/driver.h>. Now this should be the only header any GPIO
driver needs to include or something is wrong. Cleanups
restricting drivers to this include are welcomed if tested.
- Sort the GPIO Kconfig and split it into submenus, as it was
becoming and unstructured, illogical and unnavigatable mess. I
hope this is easier to follow. Menus that require a certain
subsystem like I2C can now be hidden nicely for example, still
working on others.
- New drivers:
- New driver for the Altera Soft GPIO.
- The F7188x driver now handles the F71869 and F71869A variants.
- The MIPS Loongson driver has been moved to drivers/gpio for
consolidation and cleanup.
- Cleanups:
- The MAX732x is converted to use the GPIOLIB_IRQCHIP
infrastructure.
- The PCF857x is converted to use the GPIOLIB_IRQCHIP
infrastructure.
- Radical cleanup of the OMAP driver.
- Misc:
- Enable the DWAPB GPIO for all architectures. This is a "hard
IP" block from Synopsys which has started to turn up in so
diverse architectures as X86 Quark, ARC and a slew of ARM
systems. So even though it's not an expander, it's generic
enough to be available for all.
- We add a mock GPIO on Crystalcove PMIC after a long discussion
with Daniel Vetter et al, tracing back to the shootout at the
kernel summit where DRM drivers and sub-componentization was
discussed. In this case a mock GPIO is assumed to be the best
compromise gaining some reuse of infrastructure without making
DRM drivers overly complex at the same time. Let's see"
* tag 'gpio-v4.1-1' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-gpio: (62 commits)
Revert "gpio: sch: use uapi/linux/pci_ids.h directly"
gpio: dwapb: remove dependencies
gpio: dwapb: enable for ARC
gpio: removing kfree remove functionality
gpio: mvebu: Fix mask/unmask managment per irq chip type
gpio: split GPIO drivers in submenus
gpio: move MFD GPIO drivers under their own comment
gpio: move BCM Kona Kconfig option
gpio: arrange SPI Kconfig symbols alphabetically
gpio: arrange PCI GPIO controllers alphabetically
gpio: arrange I2C Kconfig symbols alphabetically
gpio: arrange Kconfig symbols alphabetically
gpio: ich: Implement get_direction function
gpio: use (!foo) instead of (foo == NULL)
gpio: arizona: drop owner assignment from platform_drivers
gpio: max7300: remove 'ret' variable
gpio: use devm_kzalloc
gpio: sch: use uapi/linux/pci_ids.h directly
gpio: x-gene: fix devm_ioremap_resource() check
gpio: loongson: Add Loongson-3A/3B GPIO driver support
...
Diffstat (limited to 'drivers/gpio/gpio-omap.c')
-rw-r--r-- | drivers/gpio/gpio-omap.c | 131 |
1 files changed, 55 insertions, 76 deletions
diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c index f476ae2eb0b3..cd1d5bf48f36 100644 --- a/drivers/gpio/gpio-omap.c +++ b/drivers/gpio/gpio-omap.c | |||
@@ -75,14 +75,12 @@ struct gpio_bank { | |||
75 | int power_mode; | 75 | int power_mode; |
76 | bool workaround_enabled; | 76 | bool workaround_enabled; |
77 | 77 | ||
78 | void (*set_dataout)(struct gpio_bank *bank, int gpio, int enable); | 78 | void (*set_dataout)(struct gpio_bank *bank, unsigned gpio, int enable); |
79 | int (*get_context_loss_count)(struct device *dev); | 79 | int (*get_context_loss_count)(struct device *dev); |
80 | 80 | ||
81 | struct omap_gpio_reg_offs *regs; | 81 | struct omap_gpio_reg_offs *regs; |
82 | }; | 82 | }; |
83 | 83 | ||
84 | #define GPIO_INDEX(bank, gpio) (gpio % bank->width) | ||
85 | #define GPIO_BIT(bank, gpio) (BIT(GPIO_INDEX(bank, gpio))) | ||
86 | #define GPIO_MOD_CTRL_BIT BIT(0) | 84 | #define GPIO_MOD_CTRL_BIT BIT(0) |
87 | 85 | ||
88 | #define BANK_USED(bank) (bank->mod_usage || bank->irq_usage) | 86 | #define BANK_USED(bank) (bank->mod_usage || bank->irq_usage) |
@@ -90,11 +88,6 @@ struct gpio_bank { | |||
90 | 88 | ||
91 | static void omap_gpio_unmask_irq(struct irq_data *d); | 89 | static void omap_gpio_unmask_irq(struct irq_data *d); |
92 | 90 | ||
93 | static int omap_irq_to_gpio(struct gpio_bank *bank, unsigned int gpio_irq) | ||
94 | { | ||
95 | return bank->chip.base + gpio_irq; | ||
96 | } | ||
97 | |||
98 | static inline struct gpio_bank *omap_irq_data_get_bank(struct irq_data *d) | 91 | static inline struct gpio_bank *omap_irq_data_get_bank(struct irq_data *d) |
99 | { | 92 | { |
100 | struct gpio_chip *chip = irq_data_get_irq_chip_data(d); | 93 | struct gpio_chip *chip = irq_data_get_irq_chip_data(d); |
@@ -119,11 +112,11 @@ static void omap_set_gpio_direction(struct gpio_bank *bank, int gpio, | |||
119 | 112 | ||
120 | 113 | ||
121 | /* set data out value using dedicate set/clear register */ | 114 | /* set data out value using dedicate set/clear register */ |
122 | static void omap_set_gpio_dataout_reg(struct gpio_bank *bank, int gpio, | 115 | static void omap_set_gpio_dataout_reg(struct gpio_bank *bank, unsigned offset, |
123 | int enable) | 116 | int enable) |
124 | { | 117 | { |
125 | void __iomem *reg = bank->base; | 118 | void __iomem *reg = bank->base; |
126 | u32 l = GPIO_BIT(bank, gpio); | 119 | u32 l = BIT(offset); |
127 | 120 | ||
128 | if (enable) { | 121 | if (enable) { |
129 | reg += bank->regs->set_dataout; | 122 | reg += bank->regs->set_dataout; |
@@ -137,11 +130,11 @@ static void omap_set_gpio_dataout_reg(struct gpio_bank *bank, int gpio, | |||
137 | } | 130 | } |
138 | 131 | ||
139 | /* set data out value using mask register */ | 132 | /* set data out value using mask register */ |
140 | static void omap_set_gpio_dataout_mask(struct gpio_bank *bank, int gpio, | 133 | static void omap_set_gpio_dataout_mask(struct gpio_bank *bank, unsigned offset, |
141 | int enable) | 134 | int enable) |
142 | { | 135 | { |
143 | void __iomem *reg = bank->base + bank->regs->dataout; | 136 | void __iomem *reg = bank->base + bank->regs->dataout; |
144 | u32 gpio_bit = GPIO_BIT(bank, gpio); | 137 | u32 gpio_bit = BIT(offset); |
145 | u32 l; | 138 | u32 l; |
146 | 139 | ||
147 | l = readl_relaxed(reg); | 140 | l = readl_relaxed(reg); |
@@ -208,13 +201,13 @@ static inline void omap_gpio_dbck_disable(struct gpio_bank *bank) | |||
208 | /** | 201 | /** |
209 | * omap2_set_gpio_debounce - low level gpio debounce time | 202 | * omap2_set_gpio_debounce - low level gpio debounce time |
210 | * @bank: the gpio bank we're acting upon | 203 | * @bank: the gpio bank we're acting upon |
211 | * @gpio: the gpio number on this @gpio | 204 | * @offset: the gpio number on this @bank |
212 | * @debounce: debounce time to use | 205 | * @debounce: debounce time to use |
213 | * | 206 | * |
214 | * OMAP's debounce time is in 31us steps so we need | 207 | * OMAP's debounce time is in 31us steps so we need |
215 | * to convert and round up to the closest unit. | 208 | * to convert and round up to the closest unit. |
216 | */ | 209 | */ |
217 | static void omap2_set_gpio_debounce(struct gpio_bank *bank, unsigned gpio, | 210 | static void omap2_set_gpio_debounce(struct gpio_bank *bank, unsigned offset, |
218 | unsigned debounce) | 211 | unsigned debounce) |
219 | { | 212 | { |
220 | void __iomem *reg; | 213 | void __iomem *reg; |
@@ -231,7 +224,7 @@ static void omap2_set_gpio_debounce(struct gpio_bank *bank, unsigned gpio, | |||
231 | else | 224 | else |
232 | debounce = (debounce / 0x1f) - 1; | 225 | debounce = (debounce / 0x1f) - 1; |
233 | 226 | ||
234 | l = GPIO_BIT(bank, gpio); | 227 | l = BIT(offset); |
235 | 228 | ||
236 | clk_prepare_enable(bank->dbck); | 229 | clk_prepare_enable(bank->dbck); |
237 | reg = bank->base + bank->regs->debounce; | 230 | reg = bank->base + bank->regs->debounce; |
@@ -266,16 +259,16 @@ static void omap2_set_gpio_debounce(struct gpio_bank *bank, unsigned gpio, | |||
266 | /** | 259 | /** |
267 | * omap_clear_gpio_debounce - clear debounce settings for a gpio | 260 | * omap_clear_gpio_debounce - clear debounce settings for a gpio |
268 | * @bank: the gpio bank we're acting upon | 261 | * @bank: the gpio bank we're acting upon |
269 | * @gpio: the gpio number on this @gpio | 262 | * @offset: the gpio number on this @bank |
270 | * | 263 | * |
271 | * If a gpio is using debounce, then clear the debounce enable bit and if | 264 | * If a gpio is using debounce, then clear the debounce enable bit and if |
272 | * this is the only gpio in this bank using debounce, then clear the debounce | 265 | * this is the only gpio in this bank using debounce, then clear the debounce |
273 | * time too. The debounce clock will also be disabled when calling this function | 266 | * time too. The debounce clock will also be disabled when calling this function |
274 | * if this is the only gpio in the bank using debounce. | 267 | * if this is the only gpio in the bank using debounce. |
275 | */ | 268 | */ |
276 | static void omap_clear_gpio_debounce(struct gpio_bank *bank, unsigned gpio) | 269 | static void omap_clear_gpio_debounce(struct gpio_bank *bank, unsigned offset) |
277 | { | 270 | { |
278 | u32 gpio_bit = GPIO_BIT(bank, gpio); | 271 | u32 gpio_bit = BIT(offset); |
279 | 272 | ||
280 | if (!bank->dbck_flag) | 273 | if (!bank->dbck_flag) |
281 | return; | 274 | return; |
@@ -472,42 +465,32 @@ static void omap_disable_gpio_module(struct gpio_bank *bank, unsigned offset) | |||
472 | } | 465 | } |
473 | } | 466 | } |
474 | 467 | ||
475 | static int omap_gpio_is_input(struct gpio_bank *bank, int mask) | 468 | static int omap_gpio_is_input(struct gpio_bank *bank, unsigned offset) |
476 | { | 469 | { |
477 | void __iomem *reg = bank->base + bank->regs->direction; | 470 | void __iomem *reg = bank->base + bank->regs->direction; |
478 | 471 | ||
479 | return readl_relaxed(reg) & mask; | 472 | return readl_relaxed(reg) & BIT(offset); |
480 | } | 473 | } |
481 | 474 | ||
482 | static void omap_gpio_init_irq(struct gpio_bank *bank, unsigned gpio, | 475 | static void omap_gpio_init_irq(struct gpio_bank *bank, unsigned offset) |
483 | unsigned offset) | ||
484 | { | 476 | { |
485 | if (!LINE_USED(bank->mod_usage, offset)) { | 477 | if (!LINE_USED(bank->mod_usage, offset)) { |
486 | omap_enable_gpio_module(bank, offset); | 478 | omap_enable_gpio_module(bank, offset); |
487 | omap_set_gpio_direction(bank, offset, 1); | 479 | omap_set_gpio_direction(bank, offset, 1); |
488 | } | 480 | } |
489 | bank->irq_usage |= BIT(GPIO_INDEX(bank, gpio)); | 481 | bank->irq_usage |= BIT(offset); |
490 | } | 482 | } |
491 | 483 | ||
492 | static int omap_gpio_irq_type(struct irq_data *d, unsigned type) | 484 | static int omap_gpio_irq_type(struct irq_data *d, unsigned type) |
493 | { | 485 | { |
494 | struct gpio_bank *bank = omap_irq_data_get_bank(d); | 486 | struct gpio_bank *bank = omap_irq_data_get_bank(d); |
495 | unsigned gpio = 0; | ||
496 | int retval; | 487 | int retval; |
497 | unsigned long flags; | 488 | unsigned long flags; |
498 | unsigned offset; | 489 | unsigned offset = d->hwirq; |
499 | 490 | ||
500 | if (!BANK_USED(bank)) | 491 | if (!BANK_USED(bank)) |
501 | pm_runtime_get_sync(bank->dev); | 492 | pm_runtime_get_sync(bank->dev); |
502 | 493 | ||
503 | #ifdef CONFIG_ARCH_OMAP1 | ||
504 | if (d->irq > IH_MPUIO_BASE) | ||
505 | gpio = OMAP_MPUIO(d->irq - IH_MPUIO_BASE); | ||
506 | #endif | ||
507 | |||
508 | if (!gpio) | ||
509 | gpio = omap_irq_to_gpio(bank, d->hwirq); | ||
510 | |||
511 | if (type & ~IRQ_TYPE_SENSE_MASK) | 494 | if (type & ~IRQ_TYPE_SENSE_MASK) |
512 | return -EINVAL; | 495 | return -EINVAL; |
513 | 496 | ||
@@ -516,10 +499,9 @@ static int omap_gpio_irq_type(struct irq_data *d, unsigned type) | |||
516 | return -EINVAL; | 499 | return -EINVAL; |
517 | 500 | ||
518 | spin_lock_irqsave(&bank->lock, flags); | 501 | spin_lock_irqsave(&bank->lock, flags); |
519 | offset = GPIO_INDEX(bank, gpio); | ||
520 | retval = omap_set_gpio_triggering(bank, offset, type); | 502 | retval = omap_set_gpio_triggering(bank, offset, type); |
521 | omap_gpio_init_irq(bank, gpio, offset); | 503 | omap_gpio_init_irq(bank, offset); |
522 | if (!omap_gpio_is_input(bank, BIT(offset))) { | 504 | if (!omap_gpio_is_input(bank, offset)) { |
523 | spin_unlock_irqrestore(&bank->lock, flags); | 505 | spin_unlock_irqrestore(&bank->lock, flags); |
524 | return -EINVAL; | 506 | return -EINVAL; |
525 | } | 507 | } |
@@ -550,9 +532,10 @@ static void omap_clear_gpio_irqbank(struct gpio_bank *bank, int gpio_mask) | |||
550 | readl_relaxed(reg); | 532 | readl_relaxed(reg); |
551 | } | 533 | } |
552 | 534 | ||
553 | static inline void omap_clear_gpio_irqstatus(struct gpio_bank *bank, int gpio) | 535 | static inline void omap_clear_gpio_irqstatus(struct gpio_bank *bank, |
536 | unsigned offset) | ||
554 | { | 537 | { |
555 | omap_clear_gpio_irqbank(bank, GPIO_BIT(bank, gpio)); | 538 | omap_clear_gpio_irqbank(bank, BIT(offset)); |
556 | } | 539 | } |
557 | 540 | ||
558 | static u32 omap_get_gpio_irqbank_mask(struct gpio_bank *bank) | 541 | static u32 omap_get_gpio_irqbank_mask(struct gpio_bank *bank) |
@@ -613,13 +596,13 @@ static void omap_disable_gpio_irqbank(struct gpio_bank *bank, int gpio_mask) | |||
613 | writel_relaxed(l, reg); | 596 | writel_relaxed(l, reg); |
614 | } | 597 | } |
615 | 598 | ||
616 | static inline void omap_set_gpio_irqenable(struct gpio_bank *bank, int gpio, | 599 | static inline void omap_set_gpio_irqenable(struct gpio_bank *bank, |
617 | int enable) | 600 | unsigned offset, int enable) |
618 | { | 601 | { |
619 | if (enable) | 602 | if (enable) |
620 | omap_enable_gpio_irqbank(bank, GPIO_BIT(bank, gpio)); | 603 | omap_enable_gpio_irqbank(bank, BIT(offset)); |
621 | else | 604 | else |
622 | omap_disable_gpio_irqbank(bank, GPIO_BIT(bank, gpio)); | 605 | omap_disable_gpio_irqbank(bank, BIT(offset)); |
623 | } | 606 | } |
624 | 607 | ||
625 | /* | 608 | /* |
@@ -630,14 +613,16 @@ static inline void omap_set_gpio_irqenable(struct gpio_bank *bank, int gpio, | |||
630 | * enabled. When system is suspended, only selected GPIO interrupts need | 613 | * enabled. When system is suspended, only selected GPIO interrupts need |
631 | * to have wake-up enabled. | 614 | * to have wake-up enabled. |
632 | */ | 615 | */ |
633 | static int omap_set_gpio_wakeup(struct gpio_bank *bank, int gpio, int enable) | 616 | static int omap_set_gpio_wakeup(struct gpio_bank *bank, unsigned offset, |
617 | int enable) | ||
634 | { | 618 | { |
635 | u32 gpio_bit = GPIO_BIT(bank, gpio); | 619 | u32 gpio_bit = BIT(offset); |
636 | unsigned long flags; | 620 | unsigned long flags; |
637 | 621 | ||
638 | if (bank->non_wakeup_gpios & gpio_bit) { | 622 | if (bank->non_wakeup_gpios & gpio_bit) { |
639 | dev_err(bank->dev, | 623 | dev_err(bank->dev, |
640 | "Unable to modify wakeup on non-wakeup GPIO%d\n", gpio); | 624 | "Unable to modify wakeup on non-wakeup GPIO%d\n", |
625 | offset); | ||
641 | return -EINVAL; | 626 | return -EINVAL; |
642 | } | 627 | } |
643 | 628 | ||
@@ -653,22 +638,22 @@ static int omap_set_gpio_wakeup(struct gpio_bank *bank, int gpio, int enable) | |||
653 | return 0; | 638 | return 0; |
654 | } | 639 | } |
655 | 640 | ||
656 | static void omap_reset_gpio(struct gpio_bank *bank, int gpio) | 641 | static void omap_reset_gpio(struct gpio_bank *bank, unsigned offset) |
657 | { | 642 | { |
658 | omap_set_gpio_direction(bank, GPIO_INDEX(bank, gpio), 1); | 643 | omap_set_gpio_direction(bank, offset, 1); |
659 | omap_set_gpio_irqenable(bank, gpio, 0); | 644 | omap_set_gpio_irqenable(bank, offset, 0); |
660 | omap_clear_gpio_irqstatus(bank, gpio); | 645 | omap_clear_gpio_irqstatus(bank, offset); |
661 | omap_set_gpio_triggering(bank, GPIO_INDEX(bank, gpio), IRQ_TYPE_NONE); | 646 | omap_set_gpio_triggering(bank, offset, IRQ_TYPE_NONE); |
662 | omap_clear_gpio_debounce(bank, gpio); | 647 | omap_clear_gpio_debounce(bank, offset); |
663 | } | 648 | } |
664 | 649 | ||
665 | /* Use disable_irq_wake() and enable_irq_wake() functions from drivers */ | 650 | /* Use disable_irq_wake() and enable_irq_wake() functions from drivers */ |
666 | static int omap_gpio_wake_enable(struct irq_data *d, unsigned int enable) | 651 | static int omap_gpio_wake_enable(struct irq_data *d, unsigned int enable) |
667 | { | 652 | { |
668 | struct gpio_bank *bank = omap_irq_data_get_bank(d); | 653 | struct gpio_bank *bank = omap_irq_data_get_bank(d); |
669 | unsigned int gpio = omap_irq_to_gpio(bank, d->hwirq); | 654 | unsigned offset = d->hwirq; |
670 | 655 | ||
671 | return omap_set_gpio_wakeup(bank, gpio, enable); | 656 | return omap_set_gpio_wakeup(bank, offset, enable); |
672 | } | 657 | } |
673 | 658 | ||
674 | static int omap_gpio_request(struct gpio_chip *chip, unsigned offset) | 659 | static int omap_gpio_request(struct gpio_chip *chip, unsigned offset) |
@@ -706,7 +691,7 @@ static void omap_gpio_free(struct gpio_chip *chip, unsigned offset) | |||
706 | spin_lock_irqsave(&bank->lock, flags); | 691 | spin_lock_irqsave(&bank->lock, flags); |
707 | bank->mod_usage &= ~(BIT(offset)); | 692 | bank->mod_usage &= ~(BIT(offset)); |
708 | omap_disable_gpio_module(bank, offset); | 693 | omap_disable_gpio_module(bank, offset); |
709 | omap_reset_gpio(bank, bank->chip.base + offset); | 694 | omap_reset_gpio(bank, offset); |
710 | spin_unlock_irqrestore(&bank->lock, flags); | 695 | spin_unlock_irqrestore(&bank->lock, flags); |
711 | 696 | ||
712 | /* | 697 | /* |
@@ -803,15 +788,14 @@ exit: | |||
803 | static unsigned int omap_gpio_irq_startup(struct irq_data *d) | 788 | static unsigned int omap_gpio_irq_startup(struct irq_data *d) |
804 | { | 789 | { |
805 | struct gpio_bank *bank = omap_irq_data_get_bank(d); | 790 | struct gpio_bank *bank = omap_irq_data_get_bank(d); |
806 | unsigned int gpio = omap_irq_to_gpio(bank, d->hwirq); | ||
807 | unsigned long flags; | 791 | unsigned long flags; |
808 | unsigned offset = GPIO_INDEX(bank, gpio); | 792 | unsigned offset = d->hwirq; |
809 | 793 | ||
810 | if (!BANK_USED(bank)) | 794 | if (!BANK_USED(bank)) |
811 | pm_runtime_get_sync(bank->dev); | 795 | pm_runtime_get_sync(bank->dev); |
812 | 796 | ||
813 | spin_lock_irqsave(&bank->lock, flags); | 797 | spin_lock_irqsave(&bank->lock, flags); |
814 | omap_gpio_init_irq(bank, gpio, offset); | 798 | omap_gpio_init_irq(bank, offset); |
815 | spin_unlock_irqrestore(&bank->lock, flags); | 799 | spin_unlock_irqrestore(&bank->lock, flags); |
816 | omap_gpio_unmask_irq(d); | 800 | omap_gpio_unmask_irq(d); |
817 | 801 | ||
@@ -821,15 +805,13 @@ static unsigned int omap_gpio_irq_startup(struct irq_data *d) | |||
821 | static void omap_gpio_irq_shutdown(struct irq_data *d) | 805 | static void omap_gpio_irq_shutdown(struct irq_data *d) |
822 | { | 806 | { |
823 | struct gpio_bank *bank = omap_irq_data_get_bank(d); | 807 | struct gpio_bank *bank = omap_irq_data_get_bank(d); |
824 | unsigned int gpio = omap_irq_to_gpio(bank, d->hwirq); | ||
825 | unsigned long flags; | 808 | unsigned long flags; |
826 | unsigned offset = GPIO_INDEX(bank, gpio); | 809 | unsigned offset = d->hwirq; |
827 | 810 | ||
828 | spin_lock_irqsave(&bank->lock, flags); | 811 | spin_lock_irqsave(&bank->lock, flags); |
829 | gpiochip_unlock_as_irq(&bank->chip, offset); | ||
830 | bank->irq_usage &= ~(BIT(offset)); | 812 | bank->irq_usage &= ~(BIT(offset)); |
831 | omap_disable_gpio_module(bank, offset); | 813 | omap_disable_gpio_module(bank, offset); |
832 | omap_reset_gpio(bank, gpio); | 814 | omap_reset_gpio(bank, offset); |
833 | spin_unlock_irqrestore(&bank->lock, flags); | 815 | spin_unlock_irqrestore(&bank->lock, flags); |
834 | 816 | ||
835 | /* | 817 | /* |
@@ -843,43 +825,42 @@ static void omap_gpio_irq_shutdown(struct irq_data *d) | |||
843 | static void omap_gpio_ack_irq(struct irq_data *d) | 825 | static void omap_gpio_ack_irq(struct irq_data *d) |
844 | { | 826 | { |
845 | struct gpio_bank *bank = omap_irq_data_get_bank(d); | 827 | struct gpio_bank *bank = omap_irq_data_get_bank(d); |
846 | unsigned int gpio = omap_irq_to_gpio(bank, d->hwirq); | 828 | unsigned offset = d->hwirq; |
847 | 829 | ||
848 | omap_clear_gpio_irqstatus(bank, gpio); | 830 | omap_clear_gpio_irqstatus(bank, offset); |
849 | } | 831 | } |
850 | 832 | ||
851 | static void omap_gpio_mask_irq(struct irq_data *d) | 833 | static void omap_gpio_mask_irq(struct irq_data *d) |
852 | { | 834 | { |
853 | struct gpio_bank *bank = omap_irq_data_get_bank(d); | 835 | struct gpio_bank *bank = omap_irq_data_get_bank(d); |
854 | unsigned int gpio = omap_irq_to_gpio(bank, d->hwirq); | 836 | unsigned offset = d->hwirq; |
855 | unsigned long flags; | 837 | unsigned long flags; |
856 | 838 | ||
857 | spin_lock_irqsave(&bank->lock, flags); | 839 | spin_lock_irqsave(&bank->lock, flags); |
858 | omap_set_gpio_irqenable(bank, gpio, 0); | 840 | omap_set_gpio_irqenable(bank, offset, 0); |
859 | omap_set_gpio_triggering(bank, GPIO_INDEX(bank, gpio), IRQ_TYPE_NONE); | 841 | omap_set_gpio_triggering(bank, offset, IRQ_TYPE_NONE); |
860 | spin_unlock_irqrestore(&bank->lock, flags); | 842 | spin_unlock_irqrestore(&bank->lock, flags); |
861 | } | 843 | } |
862 | 844 | ||
863 | static void omap_gpio_unmask_irq(struct irq_data *d) | 845 | static void omap_gpio_unmask_irq(struct irq_data *d) |
864 | { | 846 | { |
865 | struct gpio_bank *bank = omap_irq_data_get_bank(d); | 847 | struct gpio_bank *bank = omap_irq_data_get_bank(d); |
866 | unsigned int gpio = omap_irq_to_gpio(bank, d->hwirq); | 848 | unsigned offset = d->hwirq; |
867 | unsigned int irq_mask = GPIO_BIT(bank, gpio); | ||
868 | u32 trigger = irqd_get_trigger_type(d); | 849 | u32 trigger = irqd_get_trigger_type(d); |
869 | unsigned long flags; | 850 | unsigned long flags; |
870 | 851 | ||
871 | spin_lock_irqsave(&bank->lock, flags); | 852 | spin_lock_irqsave(&bank->lock, flags); |
872 | if (trigger) | 853 | if (trigger) |
873 | omap_set_gpio_triggering(bank, GPIO_INDEX(bank, gpio), trigger); | 854 | omap_set_gpio_triggering(bank, offset, trigger); |
874 | 855 | ||
875 | /* For level-triggered GPIOs, the clearing must be done after | 856 | /* For level-triggered GPIOs, the clearing must be done after |
876 | * the HW source is cleared, thus after the handler has run */ | 857 | * the HW source is cleared, thus after the handler has run */ |
877 | if (bank->level_mask & irq_mask) { | 858 | if (bank->level_mask & BIT(offset)) { |
878 | omap_set_gpio_irqenable(bank, gpio, 0); | 859 | omap_set_gpio_irqenable(bank, offset, 0); |
879 | omap_clear_gpio_irqstatus(bank, gpio); | 860 | omap_clear_gpio_irqstatus(bank, offset); |
880 | } | 861 | } |
881 | 862 | ||
882 | omap_set_gpio_irqenable(bank, gpio, 1); | 863 | omap_set_gpio_irqenable(bank, offset, 1); |
883 | spin_unlock_irqrestore(&bank->lock, flags); | 864 | spin_unlock_irqrestore(&bank->lock, flags); |
884 | } | 865 | } |
885 | 866 | ||
@@ -977,12 +958,10 @@ static int omap_gpio_input(struct gpio_chip *chip, unsigned offset) | |||
977 | static int omap_gpio_get(struct gpio_chip *chip, unsigned offset) | 958 | static int omap_gpio_get(struct gpio_chip *chip, unsigned offset) |
978 | { | 959 | { |
979 | struct gpio_bank *bank; | 960 | struct gpio_bank *bank; |
980 | u32 mask; | ||
981 | 961 | ||
982 | bank = container_of(chip, struct gpio_bank, chip); | 962 | bank = container_of(chip, struct gpio_bank, chip); |
983 | mask = (BIT(offset)); | ||
984 | 963 | ||
985 | if (omap_gpio_is_input(bank, mask)) | 964 | if (omap_gpio_is_input(bank, offset)) |
986 | return omap_get_gpio_datain(bank, offset); | 965 | return omap_get_gpio_datain(bank, offset); |
987 | else | 966 | else |
988 | return omap_get_gpio_dataout(bank, offset); | 967 | return omap_get_gpio_dataout(bank, offset); |