Merge branch 'master' of git://git.denx.de/u-boot-arm
[oweals/u-boot.git] / drivers / gpio / da8xx_gpio.c
1 /*
2  * GPIO driver for TI DaVinci DA8xx SOCs.
3  *
4  * (C) Copyright 2011 Guralp Systems Ltd.
5  * Laurence Withers <lwithers@guralp.com>
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License as
9  * published by the Free Software Foundation; either version 2 of
10  * the License, or (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
20  * MA 02111-1307 USA
21  */
22
23 #include <common.h>
24 #include <asm/io.h>
25 #include <asm/gpio.h>
26 #include <asm/arch/gpio.h>
27 #include <asm/arch/hardware.h>
28 #include <asm/arch/davinci_misc.h>
29
30
31 static struct gpio_registry {
32         int is_registered;
33         char name[GPIO_NAME_SIZE];
34 } gpio_registry[MAX_NUM_GPIOS];
35
36
37 #define pinmux(x)       (&davinci_syscfg_regs->pinmux[x])
38
39 static const struct pinmux_config gpio_pinmux[] = {
40         { pinmux(1), 8, 7 },    /* GP0[0] */
41         { pinmux(1), 8, 6 },
42         { pinmux(1), 8, 5 },
43         { pinmux(1), 8, 4 },
44         { pinmux(1), 8, 3 },
45         { pinmux(1), 8, 2 },
46         { pinmux(1), 8, 1 },
47         { pinmux(1), 8, 0 },
48         { pinmux(0), 8, 7 },
49         { pinmux(0), 8, 6 },
50         { pinmux(0), 8, 5 },
51         { pinmux(0), 8, 4 },
52         { pinmux(0), 8, 3 },
53         { pinmux(0), 8, 2 },
54         { pinmux(0), 8, 1 },
55         { pinmux(0), 8, 0 },
56         { pinmux(4), 8, 7 },    /* GP1[0] */
57         { pinmux(4), 8, 6 },
58         { pinmux(4), 8, 5 },
59         { pinmux(4), 8, 4 },
60         { pinmux(4), 8, 3 },
61         { pinmux(4), 8, 2 },
62         { pinmux(4), 4, 1 },
63         { pinmux(4), 4, 0 },
64         { pinmux(3), 4, 0 },
65         { pinmux(2), 4, 6 },
66         { pinmux(2), 4, 5 },
67         { pinmux(2), 4, 4 },
68         { pinmux(2), 4, 3 },
69         { pinmux(2), 4, 2 },
70         { pinmux(2), 4, 1 },
71         { pinmux(2), 8, 0 },
72         { pinmux(6), 8, 7 },    /* GP2[0] */
73         { pinmux(6), 8, 6 },
74         { pinmux(6), 8, 5 },
75         { pinmux(6), 8, 4 },
76         { pinmux(6), 8, 3 },
77         { pinmux(6), 8, 2 },
78         { pinmux(6), 8, 1 },
79         { pinmux(6), 8, 0 },
80         { pinmux(5), 8, 7 },
81         { pinmux(5), 8, 6 },
82         { pinmux(5), 8, 5 },
83         { pinmux(5), 8, 4 },
84         { pinmux(5), 8, 3 },
85         { pinmux(5), 8, 2 },
86         { pinmux(5), 8, 1 },
87         { pinmux(5), 8, 0 },
88         { pinmux(8), 8, 7 },    /* GP3[0] */
89         { pinmux(8), 8, 6 },
90         { pinmux(8), 8, 5 },
91         { pinmux(8), 8, 4 },
92         { pinmux(8), 8, 3 },
93         { pinmux(8), 8, 2 },
94         { pinmux(8), 8, 1 },
95         { pinmux(8), 8, 0 },
96         { pinmux(7), 8, 7 },
97         { pinmux(7), 8, 6 },
98         { pinmux(7), 8, 5 },
99         { pinmux(7), 8, 4 },
100         { pinmux(7), 8, 3 },
101         { pinmux(7), 8, 2 },
102         { pinmux(7), 8, 1 },
103         { pinmux(7), 8, 0 },
104         { pinmux(10), 8, 7 },   /* GP4[0] */
105         { pinmux(10), 8, 6 },
106         { pinmux(10), 8, 5 },
107         { pinmux(10), 8, 4 },
108         { pinmux(10), 8, 3 },
109         { pinmux(10), 8, 2 },
110         { pinmux(10), 8, 1 },
111         { pinmux(10), 8, 0 },
112         { pinmux(9), 8, 7 },
113         { pinmux(9), 8, 6 },
114         { pinmux(9), 8, 5 },
115         { pinmux(9), 8, 4 },
116         { pinmux(9), 8, 3 },
117         { pinmux(9), 8, 2 },
118         { pinmux(9), 8, 1 },
119         { pinmux(9), 8, 0 },
120         { pinmux(12), 8, 7 },   /* GP5[0] */
121         { pinmux(12), 8, 6 },
122         { pinmux(12), 8, 5 },
123         { pinmux(12), 8, 4 },
124         { pinmux(12), 8, 3 },
125         { pinmux(12), 8, 2 },
126         { pinmux(12), 8, 1 },
127         { pinmux(12), 8, 0 },
128         { pinmux(11), 8, 7 },
129         { pinmux(11), 8, 6 },
130         { pinmux(11), 8, 5 },
131         { pinmux(11), 8, 4 },
132         { pinmux(11), 8, 3 },
133         { pinmux(11), 8, 2 },
134         { pinmux(11), 8, 1 },
135         { pinmux(11), 8, 0 },
136         { pinmux(19), 8, 6 },   /* GP6[0] */
137         { pinmux(19), 8, 5 },
138         { pinmux(19), 8, 4 },
139         { pinmux(19), 8, 3 },
140         { pinmux(19), 8, 2 },
141         { pinmux(16), 8, 1 },
142         { pinmux(14), 8, 1 },
143         { pinmux(14), 8, 0 },
144         { pinmux(13), 8, 7 },
145         { pinmux(13), 8, 6 },
146         { pinmux(13), 8, 5 },
147         { pinmux(13), 8, 4 },
148         { pinmux(13), 8, 3 },
149         { pinmux(13), 8, 2 },
150         { pinmux(13), 8, 1 },
151         { pinmux(13), 8, 0 },
152         { pinmux(18), 8, 1 },   /* GP7[0] */
153         { pinmux(18), 8, 0 },
154         { pinmux(17), 8, 7 },
155         { pinmux(17), 8, 6 },
156         { pinmux(17), 8, 5 },
157         { pinmux(17), 8, 4 },
158         { pinmux(17), 8, 3 },
159         { pinmux(17), 8, 2 },
160         { pinmux(17), 8, 1 },
161         { pinmux(17), 8, 0 },
162         { pinmux(16), 8, 7 },
163         { pinmux(16), 8, 6 },
164         { pinmux(16), 8, 5 },
165         { pinmux(16), 8, 4 },
166         { pinmux(16), 8, 3 },
167         { pinmux(16), 8, 2 },
168         { pinmux(19), 8, 0 },   /* GP8[0] */
169         { pinmux(3), 4, 7 },
170         { pinmux(3), 4, 6 },
171         { pinmux(3), 4, 5 },
172         { pinmux(3), 4, 4 },
173         { pinmux(3), 4, 3 },
174         { pinmux(3), 4, 2 },
175         { pinmux(2), 4, 7 },
176         { pinmux(19), 8, 1 },
177         { pinmux(19), 8, 0 },
178         { pinmux(18), 8, 7 },
179         { pinmux(18), 8, 6 },
180         { pinmux(18), 8, 5 },
181         { pinmux(18), 8, 4 },
182         { pinmux(18), 8, 3 },
183         { pinmux(18), 8, 2 },
184 };
185
186
187
188 int gpio_request(int gp, const char *label)
189 {
190         if (gp >= MAX_NUM_GPIOS)
191                 return -1;
192
193         if (gpio_registry[gp].is_registered)
194                 return -1;
195
196         gpio_registry[gp].is_registered = 1;
197         strncpy(gpio_registry[gp].name, label, GPIO_NAME_SIZE);
198         gpio_registry[gp].name[GPIO_NAME_SIZE - 1] = 0;
199
200         davinci_configure_pin_mux(&gpio_pinmux[gp], 1);
201
202         return 0;
203 }
204
205
206 void gpio_free(int gp)
207 {
208         gpio_registry[gp].is_registered = 0;
209 }
210
211
212 void gpio_toggle_value(int gp)
213 {
214         struct davinci_gpio *bank;
215
216         bank = GPIO_BANK(gp);
217         gpio_set_value(gp, !gpio_get_value(gp));
218 }
219
220
221 int gpio_direction_input(int gp)
222 {
223         struct davinci_gpio *bank;
224
225         bank = GPIO_BANK(gp);
226         setbits_le32(&bank->dir, 1U << GPIO_BIT(gp));
227         return 0;
228 }
229
230
231 int gpio_direction_output(int gp, int value)
232 {
233         struct davinci_gpio *bank;
234
235         bank = GPIO_BANK(gp);
236         clrbits_le32(&bank->dir, 1U << GPIO_BIT(gp));
237         gpio_set_value(gp, value);
238         return 0;
239 }
240
241
242 int gpio_get_value(int gp)
243 {
244         struct davinci_gpio *bank;
245         unsigned int ip;
246
247         bank = GPIO_BANK(gp);
248         ip = in_le32(&bank->in_data) & (1U << GPIO_BIT(gp));
249         return ip ? 1 : 0;
250 }
251
252
253 void gpio_set_value(int gp, int value)
254 {
255         struct davinci_gpio *bank;
256
257         bank = GPIO_BANK(gp);
258
259         if (value)
260                 bank->set_data = 1U << GPIO_BIT(gp);
261         else
262                 bank->clr_data = 1U << GPIO_BIT(gp);
263 }
264
265
266 void gpio_info(void)
267 {
268         int gp, dir, val;
269         struct davinci_gpio *bank;
270
271         for (gp = 0; gp < MAX_NUM_GPIOS; ++gp) {
272                 bank = GPIO_BANK(gp);
273                 dir = in_le32(&bank->dir) & (1U << GPIO_BIT(gp));
274                 val = gpio_get_value(gp);
275
276                 printf("% 4d: %s: %d [%c] %s\n",
277                         gp, dir ? " in" : "out", val,
278                         gpio_registry[gp].is_registered ? 'x' : ' ',
279                         gpio_registry[gp].name);
280         }
281 }