diff options
-rw-r--r-- | arch/arm/Kconfig | 1 | ||||
-rw-r--r-- | arch/arm/mach-sa1100/Makefile | 2 | ||||
-rw-r--r-- | arch/arm/mach-sa1100/generic.c | 31 | ||||
-rw-r--r-- | arch/arm/mach-sa1100/generic.h | 1 | ||||
-rw-r--r-- | arch/arm/mach-sa1100/gpio.c | 65 | ||||
-rw-r--r-- | arch/arm/mach-sa1100/irq.c | 2 | ||||
-rw-r--r-- | include/asm-arm/arch-sa1100/gpio.h | 31 |
7 files changed, 82 insertions, 51 deletions
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 4039a133006e..1f7c728f5ce5 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig | |||
@@ -426,6 +426,7 @@ config ARCH_SA1100 | |||
426 | select GENERIC_GPIO | 426 | select GENERIC_GPIO |
427 | select GENERIC_TIME | 427 | select GENERIC_TIME |
428 | select HAVE_IDE | 428 | select HAVE_IDE |
429 | select HAVE_GPIO_LIB | ||
429 | help | 430 | help |
430 | Support for StrongARM 11x0 based boards. | 431 | Support for StrongARM 11x0 based boards. |
431 | 432 | ||
diff --git a/arch/arm/mach-sa1100/Makefile b/arch/arm/mach-sa1100/Makefile index 7a61e8d33ab7..8e0244631d65 100644 --- a/arch/arm/mach-sa1100/Makefile +++ b/arch/arm/mach-sa1100/Makefile | |||
@@ -3,7 +3,7 @@ | |||
3 | # | 3 | # |
4 | 4 | ||
5 | # Common support | 5 | # Common support |
6 | obj-y := clock.o generic.o irq.o dma.o time.o #nmi-oopser.o | 6 | obj-y := clock.o generic.o gpio.o irq.o dma.o time.o #nmi-oopser.o |
7 | obj-m := | 7 | obj-m := |
8 | obj-n := | 8 | obj-n := |
9 | obj- := | 9 | obj- := |
diff --git a/arch/arm/mach-sa1100/generic.c b/arch/arm/mach-sa1100/generic.c index 5c84c604ed86..0c2fa1c4fb4c 100644 --- a/arch/arm/mach-sa1100/generic.c +++ b/arch/arm/mach-sa1100/generic.c | |||
@@ -139,37 +139,6 @@ unsigned long long sched_clock(void) | |||
139 | return v; | 139 | return v; |
140 | } | 140 | } |
141 | 141 | ||
142 | int gpio_direction_input(unsigned gpio) | ||
143 | { | ||
144 | unsigned long flags; | ||
145 | |||
146 | if (gpio > GPIO_MAX) | ||
147 | return -EINVAL; | ||
148 | |||
149 | local_irq_save(flags); | ||
150 | GPDR &= ~GPIO_GPIO(gpio); | ||
151 | local_irq_restore(flags); | ||
152 | return 0; | ||
153 | } | ||
154 | |||
155 | EXPORT_SYMBOL(gpio_direction_input); | ||
156 | |||
157 | int gpio_direction_output(unsigned gpio, int value) | ||
158 | { | ||
159 | unsigned long flags; | ||
160 | |||
161 | if (gpio > GPIO_MAX) | ||
162 | return -EINVAL; | ||
163 | |||
164 | local_irq_save(flags); | ||
165 | gpio_set_value(gpio, value); | ||
166 | GPDR |= GPIO_GPIO(gpio); | ||
167 | local_irq_restore(flags); | ||
168 | return 0; | ||
169 | } | ||
170 | |||
171 | EXPORT_SYMBOL(gpio_direction_output); | ||
172 | |||
173 | /* | 142 | /* |
174 | * Default power-off for SA1100 | 143 | * Default power-off for SA1100 |
175 | */ | 144 | */ |
diff --git a/arch/arm/mach-sa1100/generic.h b/arch/arm/mach-sa1100/generic.h index f085d68e568e..793c2e6c991f 100644 --- a/arch/arm/mach-sa1100/generic.h +++ b/arch/arm/mach-sa1100/generic.h | |||
@@ -9,6 +9,7 @@ struct sys_timer; | |||
9 | extern struct sys_timer sa1100_timer; | 9 | extern struct sys_timer sa1100_timer; |
10 | extern void __init sa1100_map_io(void); | 10 | extern void __init sa1100_map_io(void); |
11 | extern void __init sa1100_init_irq(void); | 11 | extern void __init sa1100_init_irq(void); |
12 | extern void __init sa1100_init_gpio(void); | ||
12 | 13 | ||
13 | #define SET_BANK(__nr,__start,__size) \ | 14 | #define SET_BANK(__nr,__start,__size) \ |
14 | mi->bank[__nr].start = (__start), \ | 15 | mi->bank[__nr].start = (__start), \ |
diff --git a/arch/arm/mach-sa1100/gpio.c b/arch/arm/mach-sa1100/gpio.c new file mode 100644 index 000000000000..372f1f4f54a1 --- /dev/null +++ b/arch/arm/mach-sa1100/gpio.c | |||
@@ -0,0 +1,65 @@ | |||
1 | /* | ||
2 | * linux/arch/arm/mach-sa1100/gpio.c | ||
3 | * | ||
4 | * Generic SA-1100 GPIO handling | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License version 2 as | ||
8 | * published by the Free Software Foundation. | ||
9 | */ | ||
10 | |||
11 | #include <linux/init.h> | ||
12 | #include <linux/module.h> | ||
13 | |||
14 | #include <asm/gpio.h> | ||
15 | #include <asm/hardware.h> | ||
16 | #include "generic.h" | ||
17 | |||
18 | static int sa1100_gpio_get(struct gpio_chip *chip, unsigned offset) | ||
19 | { | ||
20 | return GPLR & GPIO_GPIO(offset); | ||
21 | } | ||
22 | |||
23 | static void sa1100_gpio_set(struct gpio_chip *chip, unsigned offset, int value) | ||
24 | { | ||
25 | if (value) | ||
26 | GPSR = GPIO_GPIO(offset); | ||
27 | else | ||
28 | GPCR = GPIO_GPIO(offset); | ||
29 | } | ||
30 | |||
31 | static int sa1100_direction_input(struct gpio_chip *chip, unsigned offset) | ||
32 | { | ||
33 | unsigned long flags; | ||
34 | |||
35 | local_irq_save(flags); | ||
36 | GPDR &= ~GPIO_GPIO(offset); | ||
37 | local_irq_restore(flags); | ||
38 | return 0; | ||
39 | } | ||
40 | |||
41 | static int sa1100_direction_output(struct gpio_chip *chip, unsigned offset, int value) | ||
42 | { | ||
43 | unsigned long flags; | ||
44 | |||
45 | local_irq_save(flags); | ||
46 | sa1100_gpio_set(chip, offset, value); | ||
47 | GPDR |= GPIO_GPIO(offset); | ||
48 | local_irq_restore(flags); | ||
49 | return 0; | ||
50 | } | ||
51 | |||
52 | static struct gpio_chip sa1100_gpio_chip = { | ||
53 | .label = "gpio", | ||
54 | .direction_input = sa1100_direction_input, | ||
55 | .direction_output = sa1100_direction_output, | ||
56 | .set = sa1100_gpio_set, | ||
57 | .get = sa1100_gpio_get, | ||
58 | .base = 0, | ||
59 | .ngpio = GPIO_MAX + 1, | ||
60 | }; | ||
61 | |||
62 | void __init sa1100_init_gpio(void) | ||
63 | { | ||
64 | gpiochip_add(&sa1100_gpio_chip); | ||
65 | } | ||
diff --git a/arch/arm/mach-sa1100/irq.c b/arch/arm/mach-sa1100/irq.c index 3dc17d7bf38e..fa0403af7eec 100644 --- a/arch/arm/mach-sa1100/irq.c +++ b/arch/arm/mach-sa1100/irq.c | |||
@@ -347,4 +347,6 @@ void __init sa1100_init_irq(void) | |||
347 | */ | 347 | */ |
348 | set_irq_chip(IRQ_GPIO11_27, &sa1100_normal_chip); | 348 | set_irq_chip(IRQ_GPIO11_27, &sa1100_normal_chip); |
349 | set_irq_chained_handler(IRQ_GPIO11_27, sa1100_high_gpio_handler); | 349 | set_irq_chained_handler(IRQ_GPIO11_27, sa1100_high_gpio_handler); |
350 | |||
351 | sa1100_init_gpio(); | ||
350 | } | 352 | } |
diff --git a/include/asm-arm/arch-sa1100/gpio.h b/include/asm-arm/arch-sa1100/gpio.h index e7a9d26e22a8..93d3395b102d 100644 --- a/include/asm-arm/arch-sa1100/gpio.h +++ b/include/asm-arm/arch-sa1100/gpio.h | |||
@@ -26,35 +26,28 @@ | |||
26 | 26 | ||
27 | #include <asm/hardware.h> | 27 | #include <asm/hardware.h> |
28 | #include <asm/irq.h> | 28 | #include <asm/irq.h> |
29 | 29 | #include <asm-generic/gpio.h> | |
30 | static inline int gpio_request(unsigned gpio, const char *label) | ||
31 | { | ||
32 | return 0; | ||
33 | } | ||
34 | |||
35 | static inline void gpio_free(unsigned gpio) | ||
36 | { | ||
37 | return; | ||
38 | } | ||
39 | |||
40 | extern int gpio_direction_input(unsigned gpio); | ||
41 | extern int gpio_direction_output(unsigned gpio, int value); | ||
42 | |||
43 | 30 | ||
44 | static inline int gpio_get_value(unsigned gpio) | 31 | static inline int gpio_get_value(unsigned gpio) |
45 | { | 32 | { |
46 | return GPLR & GPIO_GPIO(gpio); | 33 | if (__builtin_constant_p(gpio) && (gpio <= GPIO_MAX)) |
34 | return GPLR & GPIO_GPIO(gpio); | ||
35 | else | ||
36 | return __gpio_get_value(gpio); | ||
47 | } | 37 | } |
48 | 38 | ||
49 | static inline void gpio_set_value(unsigned gpio, int value) | 39 | static inline void gpio_set_value(unsigned gpio, int value) |
50 | { | 40 | { |
51 | if (value) | 41 | if (__builtin_constant_p(gpio) && (gpio <= GPIO_MAX)) |
52 | GPSR = GPIO_GPIO(gpio); | 42 | if (value) |
43 | GPSR = GPIO_GPIO(gpio); | ||
44 | else | ||
45 | GPCR = GPIO_GPIO(gpio); | ||
53 | else | 46 | else |
54 | GPCR = GPIO_GPIO(gpio); | 47 | __gpio_set_value(gpio, value); |
55 | } | 48 | } |
56 | 49 | ||
57 | #include <asm-generic/gpio.h> /* cansleep wrappers */ | 50 | #define gpio_cansleep __gpio_cansleep |
58 | 51 | ||
59 | static inline unsigned gpio_to_irq(unsigned gpio) | 52 | static inline unsigned gpio_to_irq(unsigned gpio) |
60 | { | 53 | { |