2 * Coldfire generic GPIO support
4 * (C) Copyright 2009, Steven King <sfking@fdwdc.com>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; version 2 of the License.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
16 #include <linux/kernel.h>
17 #include <linux/init.h>
19 #include <asm/coldfire.h>
20 #include <asm/mcfsim.h>
21 #include <asm/mcfgpio.h>
23 static struct mcf_gpio_chip mcf_gpio_chips
[] = {
27 .request
= mcf_gpio_request
,
28 .free
= mcf_gpio_free
,
29 .direction_input
= mcf_gpio_direction_input
,
30 .direction_output
= mcf_gpio_direction_output
,
31 .get
= mcf_gpio_get_value
,
32 .set
= mcf_gpio_set_value
,
35 .pddr
= (void __iomem
*) MCFEPORT_EPDDR
,
36 .podr
= (void __iomem
*) MCFEPORT_EPDR
,
37 .ppdr
= (void __iomem
*) MCFEPORT_EPPDR
,
42 .request
= mcf_gpio_request
,
43 .free
= mcf_gpio_free
,
44 .direction_input
= mcf_gpio_direction_input
,
45 .direction_output
= mcf_gpio_direction_output
,
46 .get
= mcf_gpio_get_value
,
47 .set
= mcf_gpio_set_value_fast
,
51 .pddr
= (void __iomem
*) MCFGPIO_PDDR_FECH
,
52 .podr
= (void __iomem
*) MCFGPIO_PODR_FECH
,
53 .ppdr
= (void __iomem
*) MCFGPIO_PPDSDR_FECH
,
54 .setr
= (void __iomem
*) MCFGPIO_PPDSDR_FECH
,
55 .clrr
= (void __iomem
*) MCFGPIO_PCLRR_FECH
,
60 .request
= mcf_gpio_request
,
61 .free
= mcf_gpio_free
,
62 .direction_input
= mcf_gpio_direction_input
,
63 .direction_output
= mcf_gpio_direction_output
,
64 .get
= mcf_gpio_get_value
,
65 .set
= mcf_gpio_set_value_fast
,
69 .pddr
= (void __iomem
*) MCFGPIO_PDDR_FECL
,
70 .podr
= (void __iomem
*) MCFGPIO_PODR_FECL
,
71 .ppdr
= (void __iomem
*) MCFGPIO_PPDSDR_FECL
,
72 .setr
= (void __iomem
*) MCFGPIO_PPDSDR_FECL
,
73 .clrr
= (void __iomem
*) MCFGPIO_PCLRR_FECL
,
78 .request
= mcf_gpio_request
,
79 .free
= mcf_gpio_free
,
80 .direction_input
= mcf_gpio_direction_input
,
81 .direction_output
= mcf_gpio_direction_output
,
82 .get
= mcf_gpio_get_value
,
83 .set
= mcf_gpio_set_value_fast
,
87 .pddr
= (void __iomem
*) MCFGPIO_PDDR_SSI
,
88 .podr
= (void __iomem
*) MCFGPIO_PODR_SSI
,
89 .ppdr
= (void __iomem
*) MCFGPIO_PPDSDR_SSI
,
90 .setr
= (void __iomem
*) MCFGPIO_PPDSDR_SSI
,
91 .clrr
= (void __iomem
*) MCFGPIO_PCLRR_SSI
,
96 .request
= mcf_gpio_request
,
97 .free
= mcf_gpio_free
,
98 .direction_input
= mcf_gpio_direction_input
,
99 .direction_output
= mcf_gpio_direction_output
,
100 .get
= mcf_gpio_get_value
,
101 .set
= mcf_gpio_set_value_fast
,
105 .pddr
= (void __iomem
*) MCFGPIO_PDDR_BUSCTL
,
106 .podr
= (void __iomem
*) MCFGPIO_PODR_BUSCTL
,
107 .ppdr
= (void __iomem
*) MCFGPIO_PPDSDR_BUSCTL
,
108 .setr
= (void __iomem
*) MCFGPIO_PPDSDR_BUSCTL
,
109 .clrr
= (void __iomem
*) MCFGPIO_PCLRR_BUSCTL
,
114 .request
= mcf_gpio_request
,
115 .free
= mcf_gpio_free
,
116 .direction_input
= mcf_gpio_direction_input
,
117 .direction_output
= mcf_gpio_direction_output
,
118 .get
= mcf_gpio_get_value
,
119 .set
= mcf_gpio_set_value_fast
,
123 .pddr
= (void __iomem
*) MCFGPIO_PDDR_BE
,
124 .podr
= (void __iomem
*) MCFGPIO_PODR_BE
,
125 .ppdr
= (void __iomem
*) MCFGPIO_PPDSDR_BE
,
126 .setr
= (void __iomem
*) MCFGPIO_PPDSDR_BE
,
127 .clrr
= (void __iomem
*) MCFGPIO_PCLRR_BE
,
132 .request
= mcf_gpio_request
,
133 .free
= mcf_gpio_free
,
134 .direction_input
= mcf_gpio_direction_input
,
135 .direction_output
= mcf_gpio_direction_output
,
136 .get
= mcf_gpio_get_value
,
137 .set
= mcf_gpio_set_value_fast
,
141 .pddr
= (void __iomem
*) MCFGPIO_PDDR_CS
,
142 .podr
= (void __iomem
*) MCFGPIO_PODR_CS
,
143 .ppdr
= (void __iomem
*) MCFGPIO_PPDSDR_CS
,
144 .setr
= (void __iomem
*) MCFGPIO_PPDSDR_CS
,
145 .clrr
= (void __iomem
*) MCFGPIO_PCLRR_CS
,
150 .request
= mcf_gpio_request
,
151 .free
= mcf_gpio_free
,
152 .direction_input
= mcf_gpio_direction_input
,
153 .direction_output
= mcf_gpio_direction_output
,
154 .get
= mcf_gpio_get_value
,
155 .set
= mcf_gpio_set_value_fast
,
159 .pddr
= (void __iomem
*) MCFGPIO_PDDR_PWM
,
160 .podr
= (void __iomem
*) MCFGPIO_PODR_PWM
,
161 .ppdr
= (void __iomem
*) MCFGPIO_PPDSDR_PWM
,
162 .setr
= (void __iomem
*) MCFGPIO_PPDSDR_PWM
,
163 .clrr
= (void __iomem
*) MCFGPIO_PCLRR_PWM
,
168 .request
= mcf_gpio_request
,
169 .free
= mcf_gpio_free
,
170 .direction_input
= mcf_gpio_direction_input
,
171 .direction_output
= mcf_gpio_direction_output
,
172 .get
= mcf_gpio_get_value
,
173 .set
= mcf_gpio_set_value_fast
,
177 .pddr
= (void __iomem
*) MCFGPIO_PDDR_FECI2C
,
178 .podr
= (void __iomem
*) MCFGPIO_PODR_FECI2C
,
179 .ppdr
= (void __iomem
*) MCFGPIO_PPDSDR_FECI2C
,
180 .setr
= (void __iomem
*) MCFGPIO_PPDSDR_FECI2C
,
181 .clrr
= (void __iomem
*) MCFGPIO_PCLRR_FECI2C
,
186 .request
= mcf_gpio_request
,
187 .free
= mcf_gpio_free
,
188 .direction_input
= mcf_gpio_direction_input
,
189 .direction_output
= mcf_gpio_direction_output
,
190 .get
= mcf_gpio_get_value
,
191 .set
= mcf_gpio_set_value_fast
,
195 .pddr
= (void __iomem
*) MCFGPIO_PDDR_UART
,
196 .podr
= (void __iomem
*) MCFGPIO_PODR_UART
,
197 .ppdr
= (void __iomem
*) MCFGPIO_PPDSDR_UART
,
198 .setr
= (void __iomem
*) MCFGPIO_PPDSDR_UART
,
199 .clrr
= (void __iomem
*) MCFGPIO_PCLRR_UART
,
204 .request
= mcf_gpio_request
,
205 .free
= mcf_gpio_free
,
206 .direction_input
= mcf_gpio_direction_input
,
207 .direction_output
= mcf_gpio_direction_output
,
208 .get
= mcf_gpio_get_value
,
209 .set
= mcf_gpio_set_value_fast
,
213 .pddr
= (void __iomem
*) MCFGPIO_PDDR_QSPI
,
214 .podr
= (void __iomem
*) MCFGPIO_PODR_QSPI
,
215 .ppdr
= (void __iomem
*) MCFGPIO_PPDSDR_QSPI
,
216 .setr
= (void __iomem
*) MCFGPIO_PPDSDR_QSPI
,
217 .clrr
= (void __iomem
*) MCFGPIO_PCLRR_QSPI
,
222 .request
= mcf_gpio_request
,
223 .free
= mcf_gpio_free
,
224 .direction_input
= mcf_gpio_direction_input
,
225 .direction_output
= mcf_gpio_direction_output
,
226 .get
= mcf_gpio_get_value
,
227 .set
= mcf_gpio_set_value_fast
,
231 .pddr
= (void __iomem
*) MCFGPIO_PDDR_TIMER
,
232 .podr
= (void __iomem
*) MCFGPIO_PODR_TIMER
,
233 .ppdr
= (void __iomem
*) MCFGPIO_PPDSDR_TIMER
,
234 .setr
= (void __iomem
*) MCFGPIO_PPDSDR_TIMER
,
235 .clrr
= (void __iomem
*) MCFGPIO_PCLRR_TIMER
,
240 .request
= mcf_gpio_request
,
241 .free
= mcf_gpio_free
,
242 .direction_input
= mcf_gpio_direction_input
,
243 .direction_output
= mcf_gpio_direction_output
,
244 .get
= mcf_gpio_get_value
,
245 .set
= mcf_gpio_set_value_fast
,
249 .pddr
= (void __iomem
*) MCFGPIO_PDDR_LCDDATAH
,
250 .podr
= (void __iomem
*) MCFGPIO_PODR_LCDDATAH
,
251 .ppdr
= (void __iomem
*) MCFGPIO_PPDSDR_LCDDATAH
,
252 .setr
= (void __iomem
*) MCFGPIO_PPDSDR_LCDDATAH
,
253 .clrr
= (void __iomem
*) MCFGPIO_PCLRR_LCDDATAH
,
258 .request
= mcf_gpio_request
,
259 .free
= mcf_gpio_free
,
260 .direction_input
= mcf_gpio_direction_input
,
261 .direction_output
= mcf_gpio_direction_output
,
262 .get
= mcf_gpio_get_value
,
263 .set
= mcf_gpio_set_value_fast
,
267 .pddr
= (void __iomem
*) MCFGPIO_PDDR_LCDDATAM
,
268 .podr
= (void __iomem
*) MCFGPIO_PODR_LCDDATAM
,
269 .ppdr
= (void __iomem
*) MCFGPIO_PPDSDR_LCDDATAM
,
270 .setr
= (void __iomem
*) MCFGPIO_PPDSDR_LCDDATAM
,
271 .clrr
= (void __iomem
*) MCFGPIO_PCLRR_LCDDATAM
,
276 .request
= mcf_gpio_request
,
277 .free
= mcf_gpio_free
,
278 .direction_input
= mcf_gpio_direction_input
,
279 .direction_output
= mcf_gpio_direction_output
,
280 .get
= mcf_gpio_get_value
,
281 .set
= mcf_gpio_set_value_fast
,
285 .pddr
= (void __iomem
*) MCFGPIO_PDDR_LCDDATAL
,
286 .podr
= (void __iomem
*) MCFGPIO_PODR_LCDDATAL
,
287 .ppdr
= (void __iomem
*) MCFGPIO_PPDSDR_LCDDATAL
,
288 .setr
= (void __iomem
*) MCFGPIO_PPDSDR_LCDDATAL
,
289 .clrr
= (void __iomem
*) MCFGPIO_PCLRR_LCDDATAL
,
294 .request
= mcf_gpio_request
,
295 .free
= mcf_gpio_free
,
296 .direction_input
= mcf_gpio_direction_input
,
297 .direction_output
= mcf_gpio_direction_output
,
298 .get
= mcf_gpio_get_value
,
299 .set
= mcf_gpio_set_value_fast
,
303 .pddr
= (void __iomem
*) MCFGPIO_PDDR_LCDCTLH
,
304 .podr
= (void __iomem
*) MCFGPIO_PODR_LCDCTLH
,
305 .ppdr
= (void __iomem
*) MCFGPIO_PPDSDR_LCDCTLH
,
306 .setr
= (void __iomem
*) MCFGPIO_PPDSDR_LCDCTLH
,
307 .clrr
= (void __iomem
*) MCFGPIO_PCLRR_LCDCTLH
,
312 .request
= mcf_gpio_request
,
313 .free
= mcf_gpio_free
,
314 .direction_input
= mcf_gpio_direction_input
,
315 .direction_output
= mcf_gpio_direction_output
,
316 .get
= mcf_gpio_get_value
,
317 .set
= mcf_gpio_set_value_fast
,
321 .pddr
= (void __iomem
*) MCFGPIO_PDDR_LCDCTLL
,
322 .podr
= (void __iomem
*) MCFGPIO_PODR_LCDCTLL
,
323 .ppdr
= (void __iomem
*) MCFGPIO_PPDSDR_LCDCTLL
,
324 .setr
= (void __iomem
*) MCFGPIO_PPDSDR_LCDCTLL
,
325 .clrr
= (void __iomem
*) MCFGPIO_PCLRR_LCDCTLL
,
329 static int __init
mcf_gpio_init(void)
332 while (i
< ARRAY_SIZE(mcf_gpio_chips
))
333 (void)gpiochip_add((struct gpio_chip
*)&mcf_gpio_chips
[i
++]);
337 core_initcall(mcf_gpio_init
);