diff options
author | Daniel Silverstone <dsilvers@simtec.co.uk> | 2008-12-13 15:44:12 -0500 |
---|---|---|
committer | Ben Dooks <ben-linux@fluff.org> | 2008-12-14 06:34:47 -0500 |
commit | 72880ad866c21badace4d8026c1e58f2fde087fb (patch) | |
tree | 83a2a5a7f46ef890426ee83c931c14ac325724be | |
parent | fbd627100bc4a9ebce8c7617df499ee5db763780 (diff) |
[ARM] KS8695: Fixup the KS8695 GPIO to be GPIOLIB
This patch is as small a change as possible to the KS8695 GPIO layer
to use GPIOLIB to allow the generic GPIO expanders and the like to
be compiled.
As a side-effect, we also remove __init_or_module from several
functions which could be called by drivers such as i2c-gpio which
could plausibly be compiled into a non-modular kernel.
Signed-off-by: Daniel Silverstone <dsilvers@simtec.co.uk>
Signed-off-by: Vincent Sanders <vince@simtec.co.uk>
Signed-off-by: Ben Dooks <ben-linux@fluff.org>
-rw-r--r-- | arch/arm/Kconfig | 1 | ||||
-rw-r--r-- | arch/arm/mach-ks8695/board-micrel.c | 3 | ||||
-rw-r--r-- | arch/arm/mach-ks8695/gpio.c | 39 | ||||
-rw-r--r-- | arch/arm/mach-ks8695/include/mach/gpio.h | 45 |
4 files changed, 45 insertions, 43 deletions
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 4546f8b2ce8c..d953ed95701e 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig | |||
@@ -397,6 +397,7 @@ config ARCH_KS8695 | |||
397 | bool "Micrel/Kendin KS8695" | 397 | bool "Micrel/Kendin KS8695" |
398 | select CPU_ARM922T | 398 | select CPU_ARM922T |
399 | select GENERIC_GPIO | 399 | select GENERIC_GPIO |
400 | select ARCH_REQUIRE_GPIOLIB | ||
400 | help | 401 | help |
401 | Support for Micrel/Kendin KS8695 "Centaur" (ARM922T) based | 402 | Support for Micrel/Kendin KS8695 "Centaur" (ARM922T) based |
402 | System-on-Chip devices. | 403 | System-on-Chip devices. |
diff --git a/arch/arm/mach-ks8695/board-micrel.c b/arch/arm/mach-ks8695/board-micrel.c index 0468e93b7d3b..8ceaf5ac6e2c 100644 --- a/arch/arm/mach-ks8695/board-micrel.c +++ b/arch/arm/mach-ks8695/board-micrel.c | |||
@@ -18,6 +18,7 @@ | |||
18 | #include <asm/mach/map.h> | 18 | #include <asm/mach/map.h> |
19 | #include <asm/mach/irq.h> | 19 | #include <asm/mach/irq.h> |
20 | 20 | ||
21 | #include <mach/gpio.h> | ||
21 | #include <mach/devices.h> | 22 | #include <mach/devices.h> |
22 | 23 | ||
23 | #include "generic.h" | 24 | #include "generic.h" |
@@ -39,6 +40,8 @@ static void __init micrel_init(void) | |||
39 | { | 40 | { |
40 | printk(KERN_INFO "Micrel KS8695 Development Board initializing\n"); | 41 | printk(KERN_INFO "Micrel KS8695 Development Board initializing\n"); |
41 | 42 | ||
43 | ks8695_register_gpios(); | ||
44 | |||
42 | #ifdef CONFIG_PCI | 45 | #ifdef CONFIG_PCI |
43 | ks8695_init_pci(&micrel_pci); | 46 | ks8695_init_pci(&micrel_pci); |
44 | #endif | 47 | #endif |
diff --git a/arch/arm/mach-ks8695/gpio.c b/arch/arm/mach-ks8695/gpio.c index 9aecf0c4b8b1..26d6346f38f1 100644 --- a/arch/arm/mach-ks8695/gpio.c +++ b/arch/arm/mach-ks8695/gpio.c | |||
@@ -2,6 +2,8 @@ | |||
2 | * arch/arm/mach-ks8695/gpio.c | 2 | * arch/arm/mach-ks8695/gpio.c |
3 | * | 3 | * |
4 | * Copyright (C) 2006 Andrew Victor | 4 | * Copyright (C) 2006 Andrew Victor |
5 | * Updated to GPIOLIB, Copyright 2008 Simtec Electronics | ||
6 | * Daniel Silverstone <dsilvers@simtec.co.uk> | ||
5 | * | 7 | * |
6 | * This program is free software; you can redistribute it and/or modify | 8 | * 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 | 9 | * it under the terms of the GNU General Public License version 2 as |
@@ -35,7 +37,7 @@ | |||
35 | * Configure a GPIO line for either GPIO function, or its internal | 37 | * Configure a GPIO line for either GPIO function, or its internal |
36 | * function (Interrupt, Timer, etc). | 38 | * function (Interrupt, Timer, etc). |
37 | */ | 39 | */ |
38 | static void __init_or_module ks8695_gpio_mode(unsigned int pin, short gpio) | 40 | static void ks8695_gpio_mode(unsigned int pin, short gpio) |
39 | { | 41 | { |
40 | unsigned int enable[] = { IOPC_IOEINT0EN, IOPC_IOEINT1EN, IOPC_IOEINT2EN, IOPC_IOEINT3EN, IOPC_IOTIM0EN, IOPC_IOTIM1EN }; | 42 | unsigned int enable[] = { IOPC_IOEINT0EN, IOPC_IOEINT1EN, IOPC_IOEINT2EN, IOPC_IOEINT3EN, IOPC_IOTIM0EN, IOPC_IOTIM1EN }; |
41 | unsigned long x, flags; | 43 | unsigned long x, flags; |
@@ -61,7 +63,7 @@ static unsigned short gpio_irq[] = { KS8695_IRQ_EXTERN0, KS8695_IRQ_EXTERN1, KS8 | |||
61 | /* | 63 | /* |
62 | * Configure GPIO pin as external interrupt source. | 64 | * Configure GPIO pin as external interrupt source. |
63 | */ | 65 | */ |
64 | int __init_or_module ks8695_gpio_interrupt(unsigned int pin, unsigned int type) | 66 | int ks8695_gpio_interrupt(unsigned int pin, unsigned int type) |
65 | { | 67 | { |
66 | unsigned long x, flags; | 68 | unsigned long x, flags; |
67 | 69 | ||
@@ -94,7 +96,7 @@ EXPORT_SYMBOL(ks8695_gpio_interrupt); | |||
94 | /* | 96 | /* |
95 | * Configure the GPIO line as an input. | 97 | * Configure the GPIO line as an input. |
96 | */ | 98 | */ |
97 | int __init_or_module gpio_direction_input(unsigned int pin) | 99 | static int ks8695_gpio_direction_input(struct gpio_chip *gc, unsigned int pin) |
98 | { | 100 | { |
99 | unsigned long x, flags; | 101 | unsigned long x, flags; |
100 | 102 | ||
@@ -115,13 +117,13 @@ int __init_or_module gpio_direction_input(unsigned int pin) | |||
115 | 117 | ||
116 | return 0; | 118 | return 0; |
117 | } | 119 | } |
118 | EXPORT_SYMBOL(gpio_direction_input); | ||
119 | 120 | ||
120 | 121 | ||
121 | /* | 122 | /* |
122 | * Configure the GPIO line as an output, with default state. | 123 | * Configure the GPIO line as an output, with default state. |
123 | */ | 124 | */ |
124 | int __init_or_module gpio_direction_output(unsigned int pin, unsigned int state) | 125 | static int ks8695_gpio_direction_output(struct gpio_chip *gc, |
126 | unsigned int pin, int state) | ||
125 | { | 127 | { |
126 | unsigned long x, flags; | 128 | unsigned long x, flags; |
127 | 129 | ||
@@ -150,13 +152,13 @@ int __init_or_module gpio_direction_output(unsigned int pin, unsigned int state) | |||
150 | 152 | ||
151 | return 0; | 153 | return 0; |
152 | } | 154 | } |
153 | EXPORT_SYMBOL(gpio_direction_output); | ||
154 | 155 | ||
155 | 156 | ||
156 | /* | 157 | /* |
157 | * Set the state of an output GPIO line. | 158 | * Set the state of an output GPIO line. |
158 | */ | 159 | */ |
159 | void gpio_set_value(unsigned int pin, unsigned int state) | 160 | static void ks8695_gpio_set_value(struct gpio_chip *gc, |
161 | unsigned int pin, int state) | ||
160 | { | 162 | { |
161 | unsigned long x, flags; | 163 | unsigned long x, flags; |
162 | 164 | ||
@@ -175,13 +177,12 @@ void gpio_set_value(unsigned int pin, unsigned int state) | |||
175 | 177 | ||
176 | local_irq_restore(flags); | 178 | local_irq_restore(flags); |
177 | } | 179 | } |
178 | EXPORT_SYMBOL(gpio_set_value); | ||
179 | 180 | ||
180 | 181 | ||
181 | /* | 182 | /* |
182 | * Read the state of a GPIO line. | 183 | * Read the state of a GPIO line. |
183 | */ | 184 | */ |
184 | int gpio_get_value(unsigned int pin) | 185 | static int ks8695_gpio_get_value(struct gpio_chip *gc, unsigned int pin) |
185 | { | 186 | { |
186 | unsigned long x; | 187 | unsigned long x; |
187 | 188 | ||
@@ -191,7 +192,6 @@ int gpio_get_value(unsigned int pin) | |||
191 | x = __raw_readl(KS8695_GPIO_VA + KS8695_IOPD); | 192 | x = __raw_readl(KS8695_GPIO_VA + KS8695_IOPD); |
192 | return (x & IOPD(pin)) != 0; | 193 | return (x & IOPD(pin)) != 0; |
193 | } | 194 | } |
194 | EXPORT_SYMBOL(gpio_get_value); | ||
195 | 195 | ||
196 | 196 | ||
197 | /* | 197 | /* |
@@ -219,6 +219,25 @@ int irq_to_gpio(unsigned int irq) | |||
219 | } | 219 | } |
220 | EXPORT_SYMBOL(irq_to_gpio); | 220 | EXPORT_SYMBOL(irq_to_gpio); |
221 | 221 | ||
222 | /* GPIOLIB interface */ | ||
223 | |||
224 | static struct gpio_chip ks8695_gpio_chip = { | ||
225 | .label = "KS8695", | ||
226 | .direction_input = ks8695_gpio_direction_input, | ||
227 | .direction_output = ks8695_gpio_direction_output, | ||
228 | .get = ks8695_gpio_get_value, | ||
229 | .set = ks8695_gpio_set_value, | ||
230 | .base = 0, | ||
231 | .ngpio = 16, | ||
232 | .can_sleep = 0, | ||
233 | }; | ||
234 | |||
235 | /* Register the GPIOs */ | ||
236 | void ks8695_register_gpios(void) | ||
237 | { | ||
238 | if (gpiochip_add(&ks8695_gpio_chip)) | ||
239 | printk(KERN_ERR "Unable to register core GPIOs\n"); | ||
240 | } | ||
222 | 241 | ||
223 | /* .... Debug interface ..................................................... */ | 242 | /* .... Debug interface ..................................................... */ |
224 | 243 | ||
diff --git a/arch/arm/mach-ks8695/include/mach/gpio.h b/arch/arm/mach-ks8695/include/mach/gpio.h index d4af5c335f16..6379f2fe843d 100644 --- a/arch/arm/mach-ks8695/include/mach/gpio.h +++ b/arch/arm/mach-ks8695/include/mach/gpio.h | |||
@@ -30,53 +30,32 @@ | |||
30 | #define KS8695_GPIO_14 14 | 30 | #define KS8695_GPIO_14 14 |
31 | #define KS8695_GPIO_15 15 | 31 | #define KS8695_GPIO_15 15 |
32 | 32 | ||
33 | |||
34 | /* | 33 | /* |
35 | * Configure GPIO pin as external interrupt source. | 34 | * Configure GPIO pin as external interrupt source. |
36 | */ | 35 | */ |
37 | int __init_or_module ks8695_gpio_interrupt(unsigned int pin, unsigned int type); | 36 | extern int ks8695_gpio_interrupt(unsigned int pin, unsigned int type); |
38 | |||
39 | /* | ||
40 | * Configure the GPIO line as an input. | ||
41 | */ | ||
42 | int __init_or_module gpio_direction_input(unsigned int pin); | ||
43 | |||
44 | /* | ||
45 | * Configure the GPIO line as an output, with default state. | ||
46 | */ | ||
47 | int __init_or_module gpio_direction_output(unsigned int pin, unsigned int state); | ||
48 | |||
49 | /* | ||
50 | * Set the state of an output GPIO line. | ||
51 | */ | ||
52 | void gpio_set_value(unsigned int pin, unsigned int state); | ||
53 | |||
54 | /* | ||
55 | * Read the state of a GPIO line. | ||
56 | */ | ||
57 | int gpio_get_value(unsigned int pin); | ||
58 | 37 | ||
59 | /* | 38 | /* |
60 | * Map GPIO line to IRQ number. | 39 | * Map GPIO line to IRQ number. |
61 | */ | 40 | */ |
62 | int gpio_to_irq(unsigned int pin); | 41 | extern int gpio_to_irq(unsigned int pin); |
63 | 42 | ||
64 | /* | 43 | /* |
65 | * Map IRQ number to GPIO line. | 44 | * Map IRQ number to GPIO line. |
66 | */ | 45 | */ |
67 | int irq_to_gpio(unsigned int irq); | 46 | extern int irq_to_gpio(unsigned int irq); |
68 | |||
69 | 47 | ||
70 | #include <asm-generic/gpio.h> | 48 | #include <asm-generic/gpio.h> |
71 | 49 | ||
72 | static inline int gpio_request(unsigned int pin, const char *label) | 50 | /* If it turns out that we need to optimise GPIO access for the |
73 | { | 51 | * Micrel's GPIOs, then these can be changed to check their argument |
74 | return 0; | 52 | * directly as static inlines. However for now it's probably not |
75 | } | 53 | * worthwhile. |
54 | */ | ||
55 | #define gpio_get_value __gpio_get_value | ||
56 | #define gpio_set_value __gpio_set_value | ||
76 | 57 | ||
77 | static inline void gpio_free(unsigned int pin) | 58 | /* Register the GPIOs */ |
78 | { | 59 | extern void ks8695_register_gpios(void); |
79 | might_sleep(); | ||
80 | } | ||
81 | 60 | ||
82 | #endif | 61 | #endif |