generic GPIO support for the Freescale Coldfire 523x.
[linux-2.6.git] / arch / m68knommu / platform / 523x / gpio.c
1 /*
2  * Coldfire generic GPIO support
3  *
4  * (C) Copyright 2009, Steven King <sfking@fdwdc.com>
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 as published by
8  * the Free Software Foundation; version 2 of the License.
9  *
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.
14 */
15
16 #include <linux/kernel.h>
17 #include <linux/init.h>
18
19 #include <asm/coldfire.h>
20 #include <asm/mcfsim.h>
21 #include <asm/mcfgpio.h>
22
23 static struct mcf_gpio_chip mcf_gpio_chips[] = {
24         {
25                 .gpio_chip                      = {
26                         .label                  = "PIRQ",
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,
33                         .ngpio                  = 8,
34                 },
35                 .pddr                           = MCFEPORT_EPDDR,
36                 .podr                           = MCFEPORT_EPDR,
37                 .ppdr                           = MCFEPORT_EPPDR,
38         },
39         {
40                 .gpio_chip                      = {
41                         .label                  = "ADDR",
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,
48                         .base                   = 13,
49                         .ngpio                  = 3,
50                 },
51                 .pddr                           = MCFGPIO_PDDR_ADDR,
52                 .podr                           = MCFGPIO_PODR_ADDR,
53                 .ppdr                           = MCFGPIO_PPDSDR_ADDR,
54                 .setr                           = MCFGPIO_PPDSDR_ADDR,
55                 .clrr                           = MCFGPIO_PCLRR_ADDR,
56         },
57         {
58                 .gpio_chip                      = {
59                         .label                  = "DATAH",
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,
66                         .base                   = 16,
67                         .ngpio                  = 8,
68                 },
69                 .pddr                           = MCFGPIO_PDDR_DATAH,
70                 .podr                           = MCFGPIO_PODR_DATAH,
71                 .ppdr                           = MCFGPIO_PPDSDR_DATAH,
72                 .setr                           = MCFGPIO_PPDSDR_DATAH,
73                 .clrr                           = MCFGPIO_PCLRR_DATAH,
74         },
75         {
76                 .gpio_chip                      = {
77                         .label                  = "DATAL",
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,
84                         .base                   = 24,
85                         .ngpio                  = 8,
86                 },
87                 .pddr                           = MCFGPIO_PDDR_DATAL,
88                 .podr                           = MCFGPIO_PODR_DATAL,
89                 .ppdr                           = MCFGPIO_PPDSDR_DATAL,
90                 .setr                           = MCFGPIO_PPDSDR_DATAL,
91                 .clrr                           = MCFGPIO_PCLRR_DATAL,
92         },
93         {
94                 .gpio_chip                      = {
95                         .label                  = "BUSCTL",
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,
102                         .base                   = 32,
103                         .ngpio                  = 8,
104                 },
105                 .pddr                           = MCFGPIO_PDDR_BUSCTL,
106                 .podr                           = MCFGPIO_PODR_BUSCTL,
107                 .ppdr                           = MCFGPIO_PPDSDR_BUSCTL,
108                 .setr                           = MCFGPIO_PPDSDR_BUSCTL,
109                 .clrr                           = MCFGPIO_PCLRR_BUSCTL,
110         },
111         {
112                 .gpio_chip                      = {
113                         .label                  = "BS",
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,
120                         .base                   = 40,
121                         .ngpio                  = 4,
122                 },
123                 .pddr                           = MCFGPIO_PDDR_BS,
124                 .podr                           = MCFGPIO_PODR_BS,
125                 .ppdr                           = MCFGPIO_PPDSDR_BS,
126                 .setr                           = MCFGPIO_PPDSDR_BS,
127                 .clrr                           = MCFGPIO_PCLRR_BS,
128         },
129         {
130                 .gpio_chip                      = {
131                         .label                  = "CS",
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,
138                         .base                   = 49,
139                         .ngpio                  = 7,
140                 },
141                 .pddr                           = MCFGPIO_PDDR_CS,
142                 .podr                           = MCFGPIO_PODR_CS,
143                 .ppdr                           = MCFGPIO_PPDSDR_CS,
144                 .setr                           = MCFGPIO_PPDSDR_CS,
145                 .clrr                           = MCFGPIO_PCLRR_CS,
146         },
147         {
148                 .gpio_chip                      = {
149                         .label                  = "SDRAM",
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,
156                         .base                   = 56,
157                         .ngpio                  = 6,
158                 },
159                 .pddr                           = MCFGPIO_PDDR_SDRAM,
160                 .podr                           = MCFGPIO_PODR_SDRAM,
161                 .ppdr                           = MCFGPIO_PPDSDR_SDRAM,
162                 .setr                           = MCFGPIO_PPDSDR_SDRAM,
163                 .clrr                           = MCFGPIO_PCLRR_SDRAM,
164         },
165         {
166                 .gpio_chip                      = {
167                         .label                  = "FECI2C",
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,
174                         .base                   = 64,
175                         .ngpio                  = 4,
176                 },
177                 .pddr                           = MCFGPIO_PDDR_FECI2C,
178                 .podr                           = MCFGPIO_PODR_FECI2C,
179                 .ppdr                           = MCFGPIO_PPDSDR_FECI2C,
180                 .setr                           = MCFGPIO_PPDSDR_FECI2C,
181                 .clrr                           = MCFGPIO_PCLRR_FECI2C,
182         },
183         {
184                 .gpio_chip                      = {
185                         .label                  = "UARTH",
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,
192                         .base                   = 72,
193                         .ngpio                  = 2,
194                 },
195                 .pddr                           = MCFGPIO_PDDR_UARTH,
196                 .podr                           = MCFGPIO_PODR_UARTH,
197                 .ppdr                           = MCFGPIO_PPDSDR_UARTH,
198                 .setr                           = MCFGPIO_PPDSDR_UARTH,
199                 .clrr                           = MCFGPIO_PCLRR_UARTH,
200         },
201         {
202                 .gpio_chip                      = {
203                         .label                  = "UARTL",
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,
210                         .base                   = 80,
211                         .ngpio                  = 8,
212                 },
213                 .pddr                           = MCFGPIO_PDDR_UARTL,
214                 .podr                           = MCFGPIO_PODR_UARTL,
215                 .ppdr                           = MCFGPIO_PPDSDR_UARTL,
216                 .setr                           = MCFGPIO_PPDSDR_UARTL,
217                 .clrr                           = MCFGPIO_PCLRR_UARTL,
218         },
219         {
220                 .gpio_chip                      = {
221                         .label                  = "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,
228                         .base                   = 88,
229                         .ngpio                  = 5,
230                 },
231                 .pddr                           = MCFGPIO_PDDR_QSPI,
232                 .podr                           = MCFGPIO_PODR_QSPI,
233                 .ppdr                           = MCFGPIO_PPDSDR_QSPI,
234                 .setr                           = MCFGPIO_PPDSDR_QSPI,
235                 .clrr                           = MCFGPIO_PCLRR_QSPI,
236         },
237         {
238                 .gpio_chip                      = {
239                         .label                  = "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,
246                         .base                   = 96,
247                         .ngpio                  = 4,
248                 },
249                 .pddr                           = MCFGPIO_PDDR_TIMER,
250                 .podr                           = MCFGPIO_PODR_TIMER,
251                 .ppdr                           = MCFGPIO_PPDSDR_TIMER,
252                 .setr                           = MCFGPIO_PPDSDR_TIMER,
253                 .clrr                           = MCFGPIO_PCLRR_TIMER,
254         },
255         {
256                 .gpio_chip                      = {
257                         .label                  = "ETPU",
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,
264                         .base                   = 104,
265                         .ngpio                  = 3,
266                 },
267                 .pddr                           = MCFGPIO_PDDR_ETPU,
268                 .podr                           = MCFGPIO_PODR_ETPU,
269                 .ppdr                           = MCFGPIO_PPDSDR_ETPU,
270                 .setr                           = MCFGPIO_PPDSDR_ETPU,
271                 .clrr                           = MCFGPIO_PCLRR_ETPU,
272         },
273 };
274
275 static int __init mcf_gpio_init(void)
276 {
277         unsigned i = 0;
278         while (i < ARRAY_SIZE(mcf_gpio_chips))
279                 (void)gpiochip_add((struct gpio_chip *)&mcf_gpio_chips[i++]);
280         return 0;
281 }
282
283 core_initcall(mcf_gpio_init);