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
,
36 .pddr
= (void __iomem
*) MCFEPORT_EPDDR
,
37 .podr
= (void __iomem
*) MCFEPORT_EPDR
,
38 .ppdr
= (void __iomem
*) MCFEPORT_EPPDR
,
43 .request
= mcf_gpio_request
,
44 .free
= mcf_gpio_free
,
45 .direction_input
= mcf_gpio_direction_input
,
46 .direction_output
= mcf_gpio_direction_output
,
47 .get
= mcf_gpio_get_value
,
48 .set
= mcf_gpio_set_value_fast
,
52 .pddr
= (void __iomem
*) MCFGPIO_PDDR_ADDR
,
53 .podr
= (void __iomem
*) MCFGPIO_PODR_ADDR
,
54 .ppdr
= (void __iomem
*) MCFGPIO_PPDSDR_ADDR
,
55 .setr
= (void __iomem
*) MCFGPIO_PPDSDR_ADDR
,
56 .clrr
= (void __iomem
*) MCFGPIO_PCLRR_ADDR
,
61 .request
= mcf_gpio_request
,
62 .free
= mcf_gpio_free
,
63 .direction_input
= mcf_gpio_direction_input
,
64 .direction_output
= mcf_gpio_direction_output
,
65 .get
= mcf_gpio_get_value
,
66 .set
= mcf_gpio_set_value_fast
,
70 .pddr
= (void __iomem
*) MCFGPIO_PDDR_DATAH
,
71 .podr
= (void __iomem
*) MCFGPIO_PODR_DATAH
,
72 .ppdr
= (void __iomem
*) MCFGPIO_PPDSDR_DATAH
,
73 .setr
= (void __iomem
*) MCFGPIO_PPDSDR_DATAH
,
74 .clrr
= (void __iomem
*) MCFGPIO_PCLRR_DATAH
,
79 .request
= mcf_gpio_request
,
80 .free
= mcf_gpio_free
,
81 .direction_input
= mcf_gpio_direction_input
,
82 .direction_output
= mcf_gpio_direction_output
,
83 .get
= mcf_gpio_get_value
,
84 .set
= mcf_gpio_set_value_fast
,
88 .pddr
= (void __iomem
*) MCFGPIO_PDDR_DATAL
,
89 .podr
= (void __iomem
*) MCFGPIO_PODR_DATAL
,
90 .ppdr
= (void __iomem
*) MCFGPIO_PPDSDR_DATAL
,
91 .setr
= (void __iomem
*) MCFGPIO_PPDSDR_DATAL
,
92 .clrr
= (void __iomem
*) MCFGPIO_PCLRR_DATAL
,
97 .request
= mcf_gpio_request
,
98 .free
= mcf_gpio_free
,
99 .direction_input
= mcf_gpio_direction_input
,
100 .direction_output
= mcf_gpio_direction_output
,
101 .get
= mcf_gpio_get_value
,
102 .set
= mcf_gpio_set_value_fast
,
106 .pddr
= (void __iomem
*) MCFGPIO_PDDR_BUSCTL
,
107 .podr
= (void __iomem
*) MCFGPIO_PODR_BUSCTL
,
108 .ppdr
= (void __iomem
*) MCFGPIO_PPDSDR_BUSCTL
,
109 .setr
= (void __iomem
*) MCFGPIO_PPDSDR_BUSCTL
,
110 .clrr
= (void __iomem
*) MCFGPIO_PCLRR_BUSCTL
,
115 .request
= mcf_gpio_request
,
116 .free
= mcf_gpio_free
,
117 .direction_input
= mcf_gpio_direction_input
,
118 .direction_output
= mcf_gpio_direction_output
,
119 .get
= mcf_gpio_get_value
,
120 .set
= mcf_gpio_set_value_fast
,
124 .pddr
= (void __iomem
*) MCFGPIO_PDDR_BS
,
125 .podr
= (void __iomem
*) MCFGPIO_PODR_BS
,
126 .ppdr
= (void __iomem
*) MCFGPIO_PPDSDR_BS
,
127 .setr
= (void __iomem
*) MCFGPIO_PPDSDR_BS
,
128 .clrr
= (void __iomem
*) MCFGPIO_PCLRR_BS
,
133 .request
= mcf_gpio_request
,
134 .free
= mcf_gpio_free
,
135 .direction_input
= mcf_gpio_direction_input
,
136 .direction_output
= mcf_gpio_direction_output
,
137 .get
= mcf_gpio_get_value
,
138 .set
= mcf_gpio_set_value_fast
,
142 .pddr
= (void __iomem
*) MCFGPIO_PDDR_CS
,
143 .podr
= (void __iomem
*) MCFGPIO_PODR_CS
,
144 .ppdr
= (void __iomem
*) MCFGPIO_PPDSDR_CS
,
145 .setr
= (void __iomem
*) MCFGPIO_PPDSDR_CS
,
146 .clrr
= (void __iomem
*) MCFGPIO_PCLRR_CS
,
151 .request
= mcf_gpio_request
,
152 .free
= mcf_gpio_free
,
153 .direction_input
= mcf_gpio_direction_input
,
154 .direction_output
= mcf_gpio_direction_output
,
155 .get
= mcf_gpio_get_value
,
156 .set
= mcf_gpio_set_value_fast
,
160 .pddr
= (void __iomem
*) MCFGPIO_PDDR_SDRAM
,
161 .podr
= (void __iomem
*) MCFGPIO_PODR_SDRAM
,
162 .ppdr
= (void __iomem
*) MCFGPIO_PPDSDR_SDRAM
,
163 .setr
= (void __iomem
*) MCFGPIO_PPDSDR_SDRAM
,
164 .clrr
= (void __iomem
*) MCFGPIO_PCLRR_SDRAM
,
169 .request
= mcf_gpio_request
,
170 .free
= mcf_gpio_free
,
171 .direction_input
= mcf_gpio_direction_input
,
172 .direction_output
= mcf_gpio_direction_output
,
173 .get
= mcf_gpio_get_value
,
174 .set
= mcf_gpio_set_value_fast
,
178 .pddr
= (void __iomem
*) MCFGPIO_PDDR_FECI2C
,
179 .podr
= (void __iomem
*) MCFGPIO_PODR_FECI2C
,
180 .ppdr
= (void __iomem
*) MCFGPIO_PPDSDR_FECI2C
,
181 .setr
= (void __iomem
*) MCFGPIO_PPDSDR_FECI2C
,
182 .clrr
= (void __iomem
*) MCFGPIO_PCLRR_FECI2C
,
187 .request
= mcf_gpio_request
,
188 .free
= mcf_gpio_free
,
189 .direction_input
= mcf_gpio_direction_input
,
190 .direction_output
= mcf_gpio_direction_output
,
191 .get
= mcf_gpio_get_value
,
192 .set
= mcf_gpio_set_value_fast
,
196 .pddr
= (void __iomem
*) MCFGPIO_PDDR_UARTH
,
197 .podr
= (void __iomem
*) MCFGPIO_PODR_UARTH
,
198 .ppdr
= (void __iomem
*) MCFGPIO_PPDSDR_UARTH
,
199 .setr
= (void __iomem
*) MCFGPIO_PPDSDR_UARTH
,
200 .clrr
= (void __iomem
*) MCFGPIO_PCLRR_UARTH
,
205 .request
= mcf_gpio_request
,
206 .free
= mcf_gpio_free
,
207 .direction_input
= mcf_gpio_direction_input
,
208 .direction_output
= mcf_gpio_direction_output
,
209 .get
= mcf_gpio_get_value
,
210 .set
= mcf_gpio_set_value_fast
,
214 .pddr
= (void __iomem
*) MCFGPIO_PDDR_UARTL
,
215 .podr
= (void __iomem
*) MCFGPIO_PODR_UARTL
,
216 .ppdr
= (void __iomem
*) MCFGPIO_PPDSDR_UARTL
,
217 .setr
= (void __iomem
*) MCFGPIO_PPDSDR_UARTL
,
218 .clrr
= (void __iomem
*) MCFGPIO_PCLRR_UARTL
,
223 .request
= mcf_gpio_request
,
224 .free
= mcf_gpio_free
,
225 .direction_input
= mcf_gpio_direction_input
,
226 .direction_output
= mcf_gpio_direction_output
,
227 .get
= mcf_gpio_get_value
,
228 .set
= mcf_gpio_set_value_fast
,
232 .pddr
= (void __iomem
*) MCFGPIO_PDDR_QSPI
,
233 .podr
= (void __iomem
*) MCFGPIO_PODR_QSPI
,
234 .ppdr
= (void __iomem
*) MCFGPIO_PPDSDR_QSPI
,
235 .setr
= (void __iomem
*) MCFGPIO_PPDSDR_QSPI
,
236 .clrr
= (void __iomem
*) MCFGPIO_PCLRR_QSPI
,
241 .request
= mcf_gpio_request
,
242 .free
= mcf_gpio_free
,
243 .direction_input
= mcf_gpio_direction_input
,
244 .direction_output
= mcf_gpio_direction_output
,
245 .get
= mcf_gpio_get_value
,
246 .set
= mcf_gpio_set_value_fast
,
250 .pddr
= (void __iomem
*) MCFGPIO_PDDR_TIMER
,
251 .podr
= (void __iomem
*) MCFGPIO_PODR_TIMER
,
252 .ppdr
= (void __iomem
*) MCFGPIO_PPDSDR_TIMER
,
253 .setr
= (void __iomem
*) MCFGPIO_PPDSDR_TIMER
,
254 .clrr
= (void __iomem
*) MCFGPIO_PCLRR_TIMER
,
259 .request
= mcf_gpio_request
,
260 .free
= mcf_gpio_free
,
261 .direction_input
= mcf_gpio_direction_input
,
262 .direction_output
= mcf_gpio_direction_output
,
263 .get
= mcf_gpio_get_value
,
264 .set
= mcf_gpio_set_value_fast
,
268 .pddr
= (void __iomem
*) MCFGPIO_PDDR_ETPU
,
269 .podr
= (void __iomem
*) MCFGPIO_PODR_ETPU
,
270 .ppdr
= (void __iomem
*) MCFGPIO_PPDSDR_ETPU
,
271 .setr
= (void __iomem
*) MCFGPIO_PPDSDR_ETPU
,
272 .clrr
= (void __iomem
*) MCFGPIO_PCLRR_ETPU
,
276 static int __init
mcf_gpio_init(void)
279 while (i
< ARRAY_SIZE(mcf_gpio_chips
))
280 (void)gpiochip_add((struct gpio_chip
*)&mcf_gpio_chips
[i
++]);
284 core_initcall(mcf_gpio_init
);