aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpio
diff options
context:
space:
mode:
authorGrygorii Strashko <grygorii.strashko@linaro.org>2015-03-23 08:18:27 -0400
committerLinus Walleij <linus.walleij@linaro.org>2015-03-27 06:06:22 -0400
commit9943f2611c33b9f651b23600d6c3f13478c7fb0d (patch)
tree0b8c431693e2f6ec00df6b454ca72ad03cea5505 /drivers/gpio
parent37e14ecfb1f461621d4dd0b2d83a790c176212a4 (diff)
gpio: omap: convert gpio irq functions to use GPIO offset
Convert GPIO IRQ functions to use GPIO offset instead of system GPIO numbers. This allows to drop unneeded conversations between system GPIO <-> GPIO offset which are done in many places and many times. It is safe to do now because: - gpiolib always passes GPIO offset to GPIO controller - OMAP GPIO driver converted to use IRQ domain, so struct irq_data->hwirq contains GPIO offset This is preparation step before removing: #define GPIO_INDEX(bank, gpio) #define GPIO_BIT(bank, gpio) int omap_irq_to_gpio() Tested-by: Tony Lindgren <tony@atomide.com> Tested-by: Aaro Koskinen <aaro.koskinen@iki.fi> Acked-by: Santosh Shilimkar <ssantosh@kernel.org> Acked-by: Javier Martinez Canillas <javier@dowhile0.org> Signed-off-by: Grygorii Strashko <grygorii.strashko@linaro.org> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Diffstat (limited to 'drivers/gpio')
-rw-r--r--drivers/gpio/gpio-omap.c67
1 files changed, 34 insertions, 33 deletions
diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c
index ff5d54dc9aee..628a1328e503 100644
--- a/drivers/gpio/gpio-omap.c
+++ b/drivers/gpio/gpio-omap.c
@@ -549,9 +549,10 @@ static void omap_clear_gpio_irqbank(struct gpio_bank *bank, int gpio_mask)
549 readl_relaxed(reg); 549 readl_relaxed(reg);
550} 550}
551 551
552static inline void omap_clear_gpio_irqstatus(struct gpio_bank *bank, int gpio) 552static inline void omap_clear_gpio_irqstatus(struct gpio_bank *bank,
553 unsigned offset)
553{ 554{
554 omap_clear_gpio_irqbank(bank, GPIO_BIT(bank, gpio)); 555 omap_clear_gpio_irqbank(bank, BIT(offset));
555} 556}
556 557
557static u32 omap_get_gpio_irqbank_mask(struct gpio_bank *bank) 558static u32 omap_get_gpio_irqbank_mask(struct gpio_bank *bank)
@@ -612,13 +613,13 @@ static void omap_disable_gpio_irqbank(struct gpio_bank *bank, int gpio_mask)
612 writel_relaxed(l, reg); 613 writel_relaxed(l, reg);
613} 614}
614 615
615static inline void omap_set_gpio_irqenable(struct gpio_bank *bank, int gpio, 616static inline void omap_set_gpio_irqenable(struct gpio_bank *bank,
616 int enable) 617 unsigned offset, int enable)
617{ 618{
618 if (enable) 619 if (enable)
619 omap_enable_gpio_irqbank(bank, GPIO_BIT(bank, gpio)); 620 omap_enable_gpio_irqbank(bank, BIT(offset));
620 else 621 else
621 omap_disable_gpio_irqbank(bank, GPIO_BIT(bank, gpio)); 622 omap_disable_gpio_irqbank(bank, BIT(offset));
622} 623}
623 624
624/* 625/*
@@ -629,14 +630,16 @@ static inline void omap_set_gpio_irqenable(struct gpio_bank *bank, int gpio,
629 * enabled. When system is suspended, only selected GPIO interrupts need 630 * enabled. When system is suspended, only selected GPIO interrupts need
630 * to have wake-up enabled. 631 * to have wake-up enabled.
631 */ 632 */
632static int omap_set_gpio_wakeup(struct gpio_bank *bank, int gpio, int enable) 633static int omap_set_gpio_wakeup(struct gpio_bank *bank, unsigned offset,
634 int enable)
633{ 635{
634 u32 gpio_bit = GPIO_BIT(bank, gpio); 636 u32 gpio_bit = BIT(offset);
635 unsigned long flags; 637 unsigned long flags;
636 638
637 if (bank->non_wakeup_gpios & gpio_bit) { 639 if (bank->non_wakeup_gpios & gpio_bit) {
638 dev_err(bank->dev, 640 dev_err(bank->dev,
639 "Unable to modify wakeup on non-wakeup GPIO%d\n", gpio); 641 "Unable to modify wakeup on non-wakeup GPIO%d\n",
642 offset);
640 return -EINVAL; 643 return -EINVAL;
641 } 644 }
642 645
@@ -652,22 +655,22 @@ static int omap_set_gpio_wakeup(struct gpio_bank *bank, int gpio, int enable)
652 return 0; 655 return 0;
653} 656}
654 657
655static void omap_reset_gpio(struct gpio_bank *bank, int gpio) 658static void omap_reset_gpio(struct gpio_bank *bank, unsigned offset)
656{ 659{
657 omap_set_gpio_direction(bank, GPIO_INDEX(bank, gpio), 1); 660 omap_set_gpio_direction(bank, offset, 1);
658 omap_set_gpio_irqenable(bank, gpio, 0); 661 omap_set_gpio_irqenable(bank, offset, 0);
659 omap_clear_gpio_irqstatus(bank, gpio); 662 omap_clear_gpio_irqstatus(bank, offset);
660 omap_set_gpio_triggering(bank, GPIO_INDEX(bank, gpio), IRQ_TYPE_NONE); 663 omap_set_gpio_triggering(bank, offset, IRQ_TYPE_NONE);
661 omap_clear_gpio_debounce(bank, GPIO_INDEX(bank, gpio)); 664 omap_clear_gpio_debounce(bank, offset);
662} 665}
663 666
664/* Use disable_irq_wake() and enable_irq_wake() functions from drivers */ 667/* Use disable_irq_wake() and enable_irq_wake() functions from drivers */
665static int omap_gpio_wake_enable(struct irq_data *d, unsigned int enable) 668static int omap_gpio_wake_enable(struct irq_data *d, unsigned int enable)
666{ 669{
667 struct gpio_bank *bank = omap_irq_data_get_bank(d); 670 struct gpio_bank *bank = omap_irq_data_get_bank(d);
668 unsigned int gpio = omap_irq_to_gpio(bank, d->hwirq); 671 unsigned offset = d->hwirq;
669 672
670 return omap_set_gpio_wakeup(bank, gpio, enable); 673 return omap_set_gpio_wakeup(bank, offset, enable);
671} 674}
672 675
673static int omap_gpio_request(struct gpio_chip *chip, unsigned offset) 676static int omap_gpio_request(struct gpio_chip *chip, unsigned offset)
@@ -705,7 +708,7 @@ static void omap_gpio_free(struct gpio_chip *chip, unsigned offset)
705 spin_lock_irqsave(&bank->lock, flags); 708 spin_lock_irqsave(&bank->lock, flags);
706 bank->mod_usage &= ~(BIT(offset)); 709 bank->mod_usage &= ~(BIT(offset));
707 omap_disable_gpio_module(bank, offset); 710 omap_disable_gpio_module(bank, offset);
708 omap_reset_gpio(bank, bank->chip.base + offset); 711 omap_reset_gpio(bank, offset);
709 spin_unlock_irqrestore(&bank->lock, flags); 712 spin_unlock_irqrestore(&bank->lock, flags);
710 713
711 /* 714 /*
@@ -819,14 +822,13 @@ static unsigned int omap_gpio_irq_startup(struct irq_data *d)
819static void omap_gpio_irq_shutdown(struct irq_data *d) 822static void omap_gpio_irq_shutdown(struct irq_data *d)
820{ 823{
821 struct gpio_bank *bank = omap_irq_data_get_bank(d); 824 struct gpio_bank *bank = omap_irq_data_get_bank(d);
822 unsigned int gpio = omap_irq_to_gpio(bank, d->hwirq);
823 unsigned long flags; 825 unsigned long flags;
824 unsigned offset = GPIO_INDEX(bank, gpio); 826 unsigned offset = d->hwirq;
825 827
826 spin_lock_irqsave(&bank->lock, flags); 828 spin_lock_irqsave(&bank->lock, flags);
827 bank->irq_usage &= ~(BIT(offset)); 829 bank->irq_usage &= ~(BIT(offset));
828 omap_disable_gpio_module(bank, offset); 830 omap_disable_gpio_module(bank, offset);
829 omap_reset_gpio(bank, gpio); 831 omap_reset_gpio(bank, offset);
830 spin_unlock_irqrestore(&bank->lock, flags); 832 spin_unlock_irqrestore(&bank->lock, flags);
831 833
832 /* 834 /*
@@ -840,43 +842,42 @@ static void omap_gpio_irq_shutdown(struct irq_data *d)
840static void omap_gpio_ack_irq(struct irq_data *d) 842static void omap_gpio_ack_irq(struct irq_data *d)
841{ 843{
842 struct gpio_bank *bank = omap_irq_data_get_bank(d); 844 struct gpio_bank *bank = omap_irq_data_get_bank(d);
843 unsigned int gpio = omap_irq_to_gpio(bank, d->hwirq); 845 unsigned offset = d->hwirq;
844 846
845 omap_clear_gpio_irqstatus(bank, gpio); 847 omap_clear_gpio_irqstatus(bank, offset);
846} 848}
847 849
848static void omap_gpio_mask_irq(struct irq_data *d) 850static void omap_gpio_mask_irq(struct irq_data *d)
849{ 851{
850 struct gpio_bank *bank = omap_irq_data_get_bank(d); 852 struct gpio_bank *bank = omap_irq_data_get_bank(d);
851 unsigned int gpio = omap_irq_to_gpio(bank, d->hwirq); 853 unsigned offset = d->hwirq;
852 unsigned long flags; 854 unsigned long flags;
853 855
854 spin_lock_irqsave(&bank->lock, flags); 856 spin_lock_irqsave(&bank->lock, flags);
855 omap_set_gpio_irqenable(bank, gpio, 0); 857 omap_set_gpio_irqenable(bank, offset, 0);
856 omap_set_gpio_triggering(bank, GPIO_INDEX(bank, gpio), IRQ_TYPE_NONE); 858 omap_set_gpio_triggering(bank, offset, IRQ_TYPE_NONE);
857 spin_unlock_irqrestore(&bank->lock, flags); 859 spin_unlock_irqrestore(&bank->lock, flags);
858} 860}
859 861
860static void omap_gpio_unmask_irq(struct irq_data *d) 862static void omap_gpio_unmask_irq(struct irq_data *d)
861{ 863{
862 struct gpio_bank *bank = omap_irq_data_get_bank(d); 864 struct gpio_bank *bank = omap_irq_data_get_bank(d);
863 unsigned int gpio = omap_irq_to_gpio(bank, d->hwirq); 865 unsigned offset = d->hwirq;
864 unsigned int irq_mask = GPIO_BIT(bank, gpio);
865 u32 trigger = irqd_get_trigger_type(d); 866 u32 trigger = irqd_get_trigger_type(d);
866 unsigned long flags; 867 unsigned long flags;
867 868
868 spin_lock_irqsave(&bank->lock, flags); 869 spin_lock_irqsave(&bank->lock, flags);
869 if (trigger) 870 if (trigger)
870 omap_set_gpio_triggering(bank, GPIO_INDEX(bank, gpio), trigger); 871 omap_set_gpio_triggering(bank, offset, trigger);
871 872
872 /* For level-triggered GPIOs, the clearing must be done after 873 /* For level-triggered GPIOs, the clearing must be done after
873 * the HW source is cleared, thus after the handler has run */ 874 * the HW source is cleared, thus after the handler has run */
874 if (bank->level_mask & irq_mask) { 875 if (bank->level_mask & BIT(offset)) {
875 omap_set_gpio_irqenable(bank, gpio, 0); 876 omap_set_gpio_irqenable(bank, offset, 0);
876 omap_clear_gpio_irqstatus(bank, gpio); 877 omap_clear_gpio_irqstatus(bank, offset);
877 } 878 }
878 879
879 omap_set_gpio_irqenable(bank, gpio, 1); 880 omap_set_gpio_irqenable(bank, offset, 1);
880 spin_unlock_irqrestore(&bank->lock, flags); 881 spin_unlock_irqrestore(&bank->lock, flags);
881} 882}
882 883