aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/plat-omap/gpio.c
diff options
context:
space:
mode:
authorJarkko Nikula <jarkko.nikula@nokia.com>2008-12-10 20:35:27 -0500
committerTony Lindgren <tony@atomide.com>2008-12-10 20:35:27 -0500
commit3ff164e15574191c69e8406794b0578c8d2a4e23 (patch)
tree66c338c6f8dc7893f7a0e44246191766499e83bf /arch/arm/plat-omap/gpio.c
parent15f74b0335962e8554c91e52d588dc9f8ee7098d (diff)
ARM: OMAP: make legacy gpio request/free calls superfluous
Clean up OMAP GPIO request/free functions - Rename and declare static OMAP specific GPIO request/free functions - Register them into gpiolib as chip-specific hooks - Add omap_request_gpio/omap_free_gpio wrappers for existing code not converted yet to use gpiolib Signed-off-by: Jarkko Nikula <jarkko.nikula@nokia.com> [ dbrownell@users.sourceforge.net: remove needless check_gpio() calls ] Signed-off-by: David Brownell <dbrownell@users.sourceforge.net> Signed-off-by: Tony Lindgren <tony@atomide.com>
Diffstat (limited to 'arch/arm/plat-omap/gpio.c')
-rw-r--r--arch/arm/plat-omap/gpio.c43
1 files changed, 11 insertions, 32 deletions
diff --git a/arch/arm/plat-omap/gpio.c b/arch/arm/plat-omap/gpio.c
index a6dbef476035..e8aae2ac2a00 100644
--- a/arch/arm/plat-omap/gpio.c
+++ b/arch/arm/plat-omap/gpio.c
@@ -886,26 +886,17 @@ static int gpio_wake_enable(unsigned int irq, unsigned int enable)
886 return retval; 886 return retval;
887} 887}
888 888
889int omap_request_gpio(int gpio) 889static int omap_gpio_request(struct gpio_chip *chip, unsigned offset)
890{ 890{
891 struct gpio_bank *bank; 891 struct gpio_bank *bank = container_of(chip, struct gpio_bank, chip);
892 unsigned long flags; 892 unsigned long flags;
893 int status;
894
895 if (check_gpio(gpio) < 0)
896 return -EINVAL;
897
898 status = gpio_request(gpio, NULL);
899 if (status < 0)
900 return status;
901 893
902 bank = get_gpio_bank(gpio);
903 spin_lock_irqsave(&bank->lock, flags); 894 spin_lock_irqsave(&bank->lock, flags);
904 895
905 /* Set trigger to none. You need to enable the desired trigger with 896 /* Set trigger to none. You need to enable the desired trigger with
906 * request_irq() or set_irq_type(). 897 * request_irq() or set_irq_type().
907 */ 898 */
908 _set_gpio_triggering(bank, get_gpio_index(gpio), IRQ_TYPE_NONE); 899 _set_gpio_triggering(bank, offset, IRQ_TYPE_NONE);
909 900
910#ifdef CONFIG_ARCH_OMAP15XX 901#ifdef CONFIG_ARCH_OMAP15XX
911 if (bank->method == METHOD_GPIO_1510) { 902 if (bank->method == METHOD_GPIO_1510) {
@@ -913,7 +904,7 @@ int omap_request_gpio(int gpio)
913 904
914 /* Claim the pin for MPU */ 905 /* Claim the pin for MPU */
915 reg = bank->base + OMAP1510_GPIO_PIN_CONTROL; 906 reg = bank->base + OMAP1510_GPIO_PIN_CONTROL;
916 __raw_writel(__raw_readl(reg) | (1 << get_gpio_index(gpio)), reg); 907 __raw_writel(__raw_readl(reg) | (1 << offset), reg);
917 } 908 }
918#endif 909#endif
919 spin_unlock_irqrestore(&bank->lock, flags); 910 spin_unlock_irqrestore(&bank->lock, flags);
@@ -921,39 +912,28 @@ int omap_request_gpio(int gpio)
921 return 0; 912 return 0;
922} 913}
923 914
924void omap_free_gpio(int gpio) 915static void omap_gpio_free(struct gpio_chip *chip, unsigned offset)
925{ 916{
926 struct gpio_bank *bank; 917 struct gpio_bank *bank = container_of(chip, struct gpio_bank, chip);
927 unsigned long flags; 918 unsigned long flags;
928 919
929 if (check_gpio(gpio) < 0)
930 return;
931 bank = get_gpio_bank(gpio);
932 spin_lock_irqsave(&bank->lock, flags); 920 spin_lock_irqsave(&bank->lock, flags);
933 if (unlikely(!gpiochip_is_requested(&bank->chip,
934 get_gpio_index(gpio)))) {
935 spin_unlock_irqrestore(&bank->lock, flags);
936 printk(KERN_ERR "omap-gpio: GPIO %d wasn't reserved!\n", gpio);
937 dump_stack();
938 return;
939 }
940#ifdef CONFIG_ARCH_OMAP16XX 921#ifdef CONFIG_ARCH_OMAP16XX
941 if (bank->method == METHOD_GPIO_1610) { 922 if (bank->method == METHOD_GPIO_1610) {
942 /* Disable wake-up during idle for dynamic tick */ 923 /* Disable wake-up during idle for dynamic tick */
943 void __iomem *reg = bank->base + OMAP1610_GPIO_CLEAR_WAKEUPENA; 924 void __iomem *reg = bank->base + OMAP1610_GPIO_CLEAR_WAKEUPENA;
944 __raw_writel(1 << get_gpio_index(gpio), reg); 925 __raw_writel(1 << offset, reg);
945 } 926 }
946#endif 927#endif
947#if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) 928#if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX)
948 if (bank->method == METHOD_GPIO_24XX) { 929 if (bank->method == METHOD_GPIO_24XX) {
949 /* Disable wake-up during idle for dynamic tick */ 930 /* Disable wake-up during idle for dynamic tick */
950 void __iomem *reg = bank->base + OMAP24XX_GPIO_CLEARWKUENA; 931 void __iomem *reg = bank->base + OMAP24XX_GPIO_CLEARWKUENA;
951 __raw_writel(1 << get_gpio_index(gpio), reg); 932 __raw_writel(1 << offset, reg);
952 } 933 }
953#endif 934#endif
954 _reset_gpio(bank, gpio); 935 _reset_gpio(bank, bank->chip.base + offset);
955 spin_unlock_irqrestore(&bank->lock, flags); 936 spin_unlock_irqrestore(&bank->lock, flags);
956 gpio_free(gpio);
957} 937}
958 938
959/* 939/*
@@ -1458,6 +1438,8 @@ static int __init _omap_gpio_init(void)
1458 /* REVISIT eventually switch from OMAP-specific gpio structs 1438 /* REVISIT eventually switch from OMAP-specific gpio structs
1459 * over to the generic ones 1439 * over to the generic ones
1460 */ 1440 */
1441 bank->chip.request = omap_gpio_request;
1442 bank->chip.free = omap_gpio_free;
1461 bank->chip.direction_input = gpio_input; 1443 bank->chip.direction_input = gpio_input;
1462 bank->chip.get = gpio_get; 1444 bank->chip.get = gpio_get;
1463 bank->chip.direction_output = gpio_output; 1445 bank->chip.direction_output = gpio_output;
@@ -1726,9 +1708,6 @@ static int __init omap_gpio_sysinit(void)
1726 return ret; 1708 return ret;
1727} 1709}
1728 1710
1729EXPORT_SYMBOL(omap_request_gpio);
1730EXPORT_SYMBOL(omap_free_gpio);
1731
1732arch_initcall(omap_gpio_sysinit); 1711arch_initcall(omap_gpio_sysinit);
1733 1712
1734 1713