xref: /openbmc/u-boot/drivers/gpio/da8xx_gpio.c (revision b9f56698)
1f517afd5SLaurence Withers /*
2f517afd5SLaurence Withers  * GPIO driver for TI DaVinci DA8xx SOCs.
3f517afd5SLaurence Withers  *
4f517afd5SLaurence Withers  * (C) Copyright 2011 Guralp Systems Ltd.
5f517afd5SLaurence Withers  * Laurence Withers <lwithers@guralp.com>
6f517afd5SLaurence Withers  *
7f517afd5SLaurence Withers  * This program is free software; you can redistribute it and/or
8f517afd5SLaurence Withers  * modify it under the terms of the GNU General Public License as
9f517afd5SLaurence Withers  * published by the Free Software Foundation; either version 2 of
10f517afd5SLaurence Withers  * the License, or (at your option) any later version.
11f517afd5SLaurence Withers  *
12f517afd5SLaurence Withers  * This program is distributed in the hope that it will be useful,
13f517afd5SLaurence Withers  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14f517afd5SLaurence Withers  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15f517afd5SLaurence Withers  * GNU General Public License for more details.
16f517afd5SLaurence Withers  *
17f517afd5SLaurence Withers  * You should have received a copy of the GNU General Public License
18f517afd5SLaurence Withers  * along with this program; if not, write to the Free Software
19f517afd5SLaurence Withers  * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
20f517afd5SLaurence Withers  * MA 02111-1307 USA
21f517afd5SLaurence Withers  */
22f517afd5SLaurence Withers 
23f517afd5SLaurence Withers #include <common.h>
24f517afd5SLaurence Withers #include <asm/io.h>
25f517afd5SLaurence Withers #include <asm/gpio.h>
26f517afd5SLaurence Withers #include <asm/arch/hardware.h>
27f517afd5SLaurence Withers #include <asm/arch/davinci_misc.h>
28f517afd5SLaurence Withers 
29f517afd5SLaurence Withers static struct gpio_registry {
30f517afd5SLaurence Withers 	int is_registered;
31f517afd5SLaurence Withers 	char name[GPIO_NAME_SIZE];
32f517afd5SLaurence Withers } gpio_registry[MAX_NUM_GPIOS];
33f517afd5SLaurence Withers 
34f517afd5SLaurence Withers #define pinmux(x)       (&davinci_syscfg_regs->pinmux[x])
35f517afd5SLaurence Withers 
36*b9f56698STomas Novotny #if defined(CONFIG_SOC_DA8XX) && !defined(CONFIG_SOC_DA850)
37*b9f56698STomas Novotny static const struct pinmux_config gpio_pinmux[] = {
38*b9f56698STomas Novotny 	{ pinmux(13), 8, 6 },	/* GP0[0] */
39*b9f56698STomas Novotny 	{ pinmux(13), 8, 7 },
40*b9f56698STomas Novotny 	{ pinmux(14), 8, 0 },
41*b9f56698STomas Novotny 	{ pinmux(14), 8, 1 },
42*b9f56698STomas Novotny 	{ pinmux(14), 8, 2 },
43*b9f56698STomas Novotny 	{ pinmux(14), 8, 3 },
44*b9f56698STomas Novotny 	{ pinmux(14), 8, 4 },
45*b9f56698STomas Novotny 	{ pinmux(14), 8, 5 },
46*b9f56698STomas Novotny 	{ pinmux(14), 8, 6 },
47*b9f56698STomas Novotny 	{ pinmux(14), 8, 7 },
48*b9f56698STomas Novotny 	{ pinmux(15), 8, 0 },
49*b9f56698STomas Novotny 	{ pinmux(15), 8, 1 },
50*b9f56698STomas Novotny 	{ pinmux(15), 8, 2 },
51*b9f56698STomas Novotny 	{ pinmux(15), 8, 3 },
52*b9f56698STomas Novotny 	{ pinmux(15), 8, 4 },
53*b9f56698STomas Novotny 	{ pinmux(15), 8, 5 },
54*b9f56698STomas Novotny 	{ pinmux(15), 8, 6 },	/* GP1[0] */
55*b9f56698STomas Novotny 	{ pinmux(15), 8, 7 },
56*b9f56698STomas Novotny 	{ pinmux(16), 8, 0 },
57*b9f56698STomas Novotny 	{ pinmux(16), 8, 1 },
58*b9f56698STomas Novotny 	{ pinmux(16), 8, 2 },
59*b9f56698STomas Novotny 	{ pinmux(16), 8, 3 },
60*b9f56698STomas Novotny 	{ pinmux(16), 8, 4 },
61*b9f56698STomas Novotny 	{ pinmux(16), 8, 5 },
62*b9f56698STomas Novotny 	{ pinmux(16), 8, 6 },
63*b9f56698STomas Novotny 	{ pinmux(16), 8, 7 },
64*b9f56698STomas Novotny 	{ pinmux(17), 8, 0 },
65*b9f56698STomas Novotny 	{ pinmux(17), 8, 1 },
66*b9f56698STomas Novotny 	{ pinmux(17), 8, 2 },
67*b9f56698STomas Novotny 	{ pinmux(17), 8, 3 },
68*b9f56698STomas Novotny 	{ pinmux(17), 8, 4 },
69*b9f56698STomas Novotny 	{ pinmux(17), 8, 5 },
70*b9f56698STomas Novotny 	{ pinmux(17), 8, 6 },	/* GP2[0] */
71*b9f56698STomas Novotny 	{ pinmux(17), 8, 7 },
72*b9f56698STomas Novotny 	{ pinmux(18), 8, 0 },
73*b9f56698STomas Novotny 	{ pinmux(18), 8, 1 },
74*b9f56698STomas Novotny 	{ pinmux(18), 8, 2 },
75*b9f56698STomas Novotny 	{ pinmux(18), 8, 3 },
76*b9f56698STomas Novotny 	{ pinmux(18), 8, 4 },
77*b9f56698STomas Novotny 	{ pinmux(18), 8, 5 },
78*b9f56698STomas Novotny 	{ pinmux(18), 8, 6 },
79*b9f56698STomas Novotny 	{ pinmux(18), 8, 7 },
80*b9f56698STomas Novotny 	{ pinmux(19), 8, 0 },
81*b9f56698STomas Novotny 	{ pinmux(9), 8, 2 },
82*b9f56698STomas Novotny 	{ pinmux(9), 8, 3 },
83*b9f56698STomas Novotny 	{ pinmux(9), 8, 4 },
84*b9f56698STomas Novotny 	{ pinmux(9), 8, 5 },
85*b9f56698STomas Novotny 	{ pinmux(9), 8, 6 },
86*b9f56698STomas Novotny 	{ pinmux(10), 8, 1 },	/* GP3[0] */
87*b9f56698STomas Novotny 	{ pinmux(10), 8, 2 },
88*b9f56698STomas Novotny 	{ pinmux(10), 8, 3 },
89*b9f56698STomas Novotny 	{ pinmux(10), 8, 4 },
90*b9f56698STomas Novotny 	{ pinmux(10), 8, 5 },
91*b9f56698STomas Novotny 	{ pinmux(10), 8, 6 },
92*b9f56698STomas Novotny 	{ pinmux(10), 8, 7 },
93*b9f56698STomas Novotny 	{ pinmux(11), 8, 0 },
94*b9f56698STomas Novotny 	{ pinmux(11), 8, 1 },
95*b9f56698STomas Novotny 	{ pinmux(11), 8, 2 },
96*b9f56698STomas Novotny 	{ pinmux(11), 8, 3 },
97*b9f56698STomas Novotny 	{ pinmux(11), 8, 4 },
98*b9f56698STomas Novotny 	{ pinmux(9), 8, 7 },
99*b9f56698STomas Novotny 	{ pinmux(2), 8, 6 },
100*b9f56698STomas Novotny 	{ pinmux(11), 8, 5 },
101*b9f56698STomas Novotny 	{ pinmux(11), 8, 6 },
102*b9f56698STomas Novotny 	{ pinmux(12), 8, 4 },	/* GP4[0] */
103*b9f56698STomas Novotny 	{ pinmux(12), 8, 5 },
104*b9f56698STomas Novotny 	{ pinmux(12), 8, 6 },
105*b9f56698STomas Novotny 	{ pinmux(12), 8, 7 },
106*b9f56698STomas Novotny 	{ pinmux(13), 8, 0 },
107*b9f56698STomas Novotny 	{ pinmux(13), 8, 1 },
108*b9f56698STomas Novotny 	{ pinmux(13), 8, 2 },
109*b9f56698STomas Novotny 	{ pinmux(13), 8, 3 },
110*b9f56698STomas Novotny 	{ pinmux(13), 8, 4 },
111*b9f56698STomas Novotny 	{ pinmux(13), 8, 5 },
112*b9f56698STomas Novotny 	{ pinmux(11), 8, 7 },
113*b9f56698STomas Novotny 	{ pinmux(12), 8, 0 },
114*b9f56698STomas Novotny 	{ pinmux(12), 8, 1 },
115*b9f56698STomas Novotny 	{ pinmux(12), 8, 2 },
116*b9f56698STomas Novotny 	{ pinmux(12), 8, 3 },
117*b9f56698STomas Novotny 	{ pinmux(9), 8, 1 },
118*b9f56698STomas Novotny 	{ pinmux(7), 8, 3 },	/* GP5[0] */
119*b9f56698STomas Novotny 	{ pinmux(7), 8, 4 },
120*b9f56698STomas Novotny 	{ pinmux(7), 8, 5 },
121*b9f56698STomas Novotny 	{ pinmux(7), 8, 6 },
122*b9f56698STomas Novotny 	{ pinmux(7), 8, 7 },
123*b9f56698STomas Novotny 	{ pinmux(8), 8, 0 },
124*b9f56698STomas Novotny 	{ pinmux(8), 8, 1 },
125*b9f56698STomas Novotny 	{ pinmux(8), 8, 2 },
126*b9f56698STomas Novotny 	{ pinmux(8), 8, 3 },
127*b9f56698STomas Novotny 	{ pinmux(8), 8, 4 },
128*b9f56698STomas Novotny 	{ pinmux(8), 8, 5 },
129*b9f56698STomas Novotny 	{ pinmux(8), 8, 6 },
130*b9f56698STomas Novotny 	{ pinmux(8), 8, 7 },
131*b9f56698STomas Novotny 	{ pinmux(9), 8, 0 },
132*b9f56698STomas Novotny 	{ pinmux(7), 8, 1 },
133*b9f56698STomas Novotny 	{ pinmux(7), 8, 2 },
134*b9f56698STomas Novotny 	{ pinmux(5), 8, 1 },	/* GP6[0] */
135*b9f56698STomas Novotny 	{ pinmux(5), 8, 2 },
136*b9f56698STomas Novotny 	{ pinmux(5), 8, 3 },
137*b9f56698STomas Novotny 	{ pinmux(5), 8, 4 },
138*b9f56698STomas Novotny 	{ pinmux(5), 8, 5 },
139*b9f56698STomas Novotny 	{ pinmux(5), 8, 6 },
140*b9f56698STomas Novotny 	{ pinmux(5), 8, 7 },
141*b9f56698STomas Novotny 	{ pinmux(6), 8, 0 },
142*b9f56698STomas Novotny 	{ pinmux(6), 8, 1 },
143*b9f56698STomas Novotny 	{ pinmux(6), 8, 2 },
144*b9f56698STomas Novotny 	{ pinmux(6), 8, 3 },
145*b9f56698STomas Novotny 	{ pinmux(6), 8, 4 },
146*b9f56698STomas Novotny 	{ pinmux(6), 8, 5 },
147*b9f56698STomas Novotny 	{ pinmux(6), 8, 6 },
148*b9f56698STomas Novotny 	{ pinmux(6), 8, 7 },
149*b9f56698STomas Novotny 	{ pinmux(7), 8, 0 },
150*b9f56698STomas Novotny 	{ pinmux(1), 8, 0 },	/* GP7[0] */
151*b9f56698STomas Novotny 	{ pinmux(1), 8, 1 },
152*b9f56698STomas Novotny 	{ pinmux(1), 8, 2 },
153*b9f56698STomas Novotny 	{ pinmux(1), 8, 3 },
154*b9f56698STomas Novotny 	{ pinmux(1), 8, 4 },
155*b9f56698STomas Novotny 	{ pinmux(1), 8, 5 },
156*b9f56698STomas Novotny 	{ pinmux(1), 8, 6 },
157*b9f56698STomas Novotny 	{ pinmux(1), 8, 7 },
158*b9f56698STomas Novotny 	{ pinmux(2), 8, 0 },
159*b9f56698STomas Novotny 	{ pinmux(2), 8, 1 },
160*b9f56698STomas Novotny 	{ pinmux(2), 8, 2 },
161*b9f56698STomas Novotny 	{ pinmux(2), 8, 3 },
162*b9f56698STomas Novotny 	{ pinmux(2), 8, 4 },
163*b9f56698STomas Novotny 	{ pinmux(2), 8, 5 },
164*b9f56698STomas Novotny 	{ pinmux(0), 1, 0 },
165*b9f56698STomas Novotny 	{ pinmux(0), 1, 1 },
166*b9f56698STomas Novotny };
167*b9f56698STomas Novotny #else
168f517afd5SLaurence Withers static const struct pinmux_config gpio_pinmux[] = {
169f517afd5SLaurence Withers 	{ pinmux(1), 8, 7 },	/* GP0[0] */
170f517afd5SLaurence Withers 	{ pinmux(1), 8, 6 },
171f517afd5SLaurence Withers 	{ pinmux(1), 8, 5 },
172f517afd5SLaurence Withers 	{ pinmux(1), 8, 4 },
173f517afd5SLaurence Withers 	{ pinmux(1), 8, 3 },
174f517afd5SLaurence Withers 	{ pinmux(1), 8, 2 },
175f517afd5SLaurence Withers 	{ pinmux(1), 8, 1 },
176f517afd5SLaurence Withers 	{ pinmux(1), 8, 0 },
177f517afd5SLaurence Withers 	{ pinmux(0), 8, 7 },
178f517afd5SLaurence Withers 	{ pinmux(0), 8, 6 },
179f517afd5SLaurence Withers 	{ pinmux(0), 8, 5 },
180f517afd5SLaurence Withers 	{ pinmux(0), 8, 4 },
181f517afd5SLaurence Withers 	{ pinmux(0), 8, 3 },
182f517afd5SLaurence Withers 	{ pinmux(0), 8, 2 },
183f517afd5SLaurence Withers 	{ pinmux(0), 8, 1 },
184f517afd5SLaurence Withers 	{ pinmux(0), 8, 0 },
185f517afd5SLaurence Withers 	{ pinmux(4), 8, 7 },	/* GP1[0] */
186f517afd5SLaurence Withers 	{ pinmux(4), 8, 6 },
187f517afd5SLaurence Withers 	{ pinmux(4), 8, 5 },
188f517afd5SLaurence Withers 	{ pinmux(4), 8, 4 },
189f517afd5SLaurence Withers 	{ pinmux(4), 8, 3 },
190f517afd5SLaurence Withers 	{ pinmux(4), 8, 2 },
191f517afd5SLaurence Withers 	{ pinmux(4), 4, 1 },
192f517afd5SLaurence Withers 	{ pinmux(4), 4, 0 },
193f517afd5SLaurence Withers 	{ pinmux(3), 4, 0 },
194f517afd5SLaurence Withers 	{ pinmux(2), 4, 6 },
195f517afd5SLaurence Withers 	{ pinmux(2), 4, 5 },
196f517afd5SLaurence Withers 	{ pinmux(2), 4, 4 },
197f517afd5SLaurence Withers 	{ pinmux(2), 4, 3 },
198f517afd5SLaurence Withers 	{ pinmux(2), 4, 2 },
199f517afd5SLaurence Withers 	{ pinmux(2), 4, 1 },
200f517afd5SLaurence Withers 	{ pinmux(2), 8, 0 },
201f517afd5SLaurence Withers 	{ pinmux(6), 8, 7 },	/* GP2[0] */
202f517afd5SLaurence Withers 	{ pinmux(6), 8, 6 },
203f517afd5SLaurence Withers 	{ pinmux(6), 8, 5 },
204f517afd5SLaurence Withers 	{ pinmux(6), 8, 4 },
205f517afd5SLaurence Withers 	{ pinmux(6), 8, 3 },
206f517afd5SLaurence Withers 	{ pinmux(6), 8, 2 },
207f517afd5SLaurence Withers 	{ pinmux(6), 8, 1 },
208f517afd5SLaurence Withers 	{ pinmux(6), 8, 0 },
209f517afd5SLaurence Withers 	{ pinmux(5), 8, 7 },
210f517afd5SLaurence Withers 	{ pinmux(5), 8, 6 },
211f517afd5SLaurence Withers 	{ pinmux(5), 8, 5 },
212f517afd5SLaurence Withers 	{ pinmux(5), 8, 4 },
213f517afd5SLaurence Withers 	{ pinmux(5), 8, 3 },
214f517afd5SLaurence Withers 	{ pinmux(5), 8, 2 },
215f517afd5SLaurence Withers 	{ pinmux(5), 8, 1 },
216f517afd5SLaurence Withers 	{ pinmux(5), 8, 0 },
217f517afd5SLaurence Withers 	{ pinmux(8), 8, 7 },	/* GP3[0] */
218f517afd5SLaurence Withers 	{ pinmux(8), 8, 6 },
219f517afd5SLaurence Withers 	{ pinmux(8), 8, 5 },
220f517afd5SLaurence Withers 	{ pinmux(8), 8, 4 },
221f517afd5SLaurence Withers 	{ pinmux(8), 8, 3 },
222f517afd5SLaurence Withers 	{ pinmux(8), 8, 2 },
223f517afd5SLaurence Withers 	{ pinmux(8), 8, 1 },
224f517afd5SLaurence Withers 	{ pinmux(8), 8, 0 },
225f517afd5SLaurence Withers 	{ pinmux(7), 8, 7 },
226f517afd5SLaurence Withers 	{ pinmux(7), 8, 6 },
227f517afd5SLaurence Withers 	{ pinmux(7), 8, 5 },
228f517afd5SLaurence Withers 	{ pinmux(7), 8, 4 },
229f517afd5SLaurence Withers 	{ pinmux(7), 8, 3 },
230f517afd5SLaurence Withers 	{ pinmux(7), 8, 2 },
231f517afd5SLaurence Withers 	{ pinmux(7), 8, 1 },
232f517afd5SLaurence Withers 	{ pinmux(7), 8, 0 },
233f517afd5SLaurence Withers 	{ pinmux(10), 8, 7 },	/* GP4[0] */
234f517afd5SLaurence Withers 	{ pinmux(10), 8, 6 },
235f517afd5SLaurence Withers 	{ pinmux(10), 8, 5 },
236f517afd5SLaurence Withers 	{ pinmux(10), 8, 4 },
237f517afd5SLaurence Withers 	{ pinmux(10), 8, 3 },
238f517afd5SLaurence Withers 	{ pinmux(10), 8, 2 },
239f517afd5SLaurence Withers 	{ pinmux(10), 8, 1 },
240f517afd5SLaurence Withers 	{ pinmux(10), 8, 0 },
241f517afd5SLaurence Withers 	{ pinmux(9), 8, 7 },
242f517afd5SLaurence Withers 	{ pinmux(9), 8, 6 },
243f517afd5SLaurence Withers 	{ pinmux(9), 8, 5 },
244f517afd5SLaurence Withers 	{ pinmux(9), 8, 4 },
245f517afd5SLaurence Withers 	{ pinmux(9), 8, 3 },
246f517afd5SLaurence Withers 	{ pinmux(9), 8, 2 },
247f517afd5SLaurence Withers 	{ pinmux(9), 8, 1 },
248f517afd5SLaurence Withers 	{ pinmux(9), 8, 0 },
249f517afd5SLaurence Withers 	{ pinmux(12), 8, 7 },	/* GP5[0] */
250f517afd5SLaurence Withers 	{ pinmux(12), 8, 6 },
251f517afd5SLaurence Withers 	{ pinmux(12), 8, 5 },
252f517afd5SLaurence Withers 	{ pinmux(12), 8, 4 },
253f517afd5SLaurence Withers 	{ pinmux(12), 8, 3 },
254f517afd5SLaurence Withers 	{ pinmux(12), 8, 2 },
255f517afd5SLaurence Withers 	{ pinmux(12), 8, 1 },
256f517afd5SLaurence Withers 	{ pinmux(12), 8, 0 },
257f517afd5SLaurence Withers 	{ pinmux(11), 8, 7 },
258f517afd5SLaurence Withers 	{ pinmux(11), 8, 6 },
259f517afd5SLaurence Withers 	{ pinmux(11), 8, 5 },
260f517afd5SLaurence Withers 	{ pinmux(11), 8, 4 },
261f517afd5SLaurence Withers 	{ pinmux(11), 8, 3 },
262f517afd5SLaurence Withers 	{ pinmux(11), 8, 2 },
263f517afd5SLaurence Withers 	{ pinmux(11), 8, 1 },
264f517afd5SLaurence Withers 	{ pinmux(11), 8, 0 },
265f517afd5SLaurence Withers 	{ pinmux(19), 8, 6 },	/* GP6[0] */
266f517afd5SLaurence Withers 	{ pinmux(19), 8, 5 },
267f517afd5SLaurence Withers 	{ pinmux(19), 8, 4 },
268f517afd5SLaurence Withers 	{ pinmux(19), 8, 3 },
269f517afd5SLaurence Withers 	{ pinmux(19), 8, 2 },
270f517afd5SLaurence Withers 	{ pinmux(16), 8, 1 },
271f517afd5SLaurence Withers 	{ pinmux(14), 8, 1 },
272f517afd5SLaurence Withers 	{ pinmux(14), 8, 0 },
273f517afd5SLaurence Withers 	{ pinmux(13), 8, 7 },
274f517afd5SLaurence Withers 	{ pinmux(13), 8, 6 },
275f517afd5SLaurence Withers 	{ pinmux(13), 8, 5 },
276f517afd5SLaurence Withers 	{ pinmux(13), 8, 4 },
277f517afd5SLaurence Withers 	{ pinmux(13), 8, 3 },
278f517afd5SLaurence Withers 	{ pinmux(13), 8, 2 },
279f517afd5SLaurence Withers 	{ pinmux(13), 8, 1 },
280f517afd5SLaurence Withers 	{ pinmux(13), 8, 0 },
281f517afd5SLaurence Withers 	{ pinmux(18), 8, 1 },	/* GP7[0] */
282f517afd5SLaurence Withers 	{ pinmux(18), 8, 0 },
283f517afd5SLaurence Withers 	{ pinmux(17), 8, 7 },
284f517afd5SLaurence Withers 	{ pinmux(17), 8, 6 },
285f517afd5SLaurence Withers 	{ pinmux(17), 8, 5 },
286f517afd5SLaurence Withers 	{ pinmux(17), 8, 4 },
287f517afd5SLaurence Withers 	{ pinmux(17), 8, 3 },
288f517afd5SLaurence Withers 	{ pinmux(17), 8, 2 },
289f517afd5SLaurence Withers 	{ pinmux(17), 8, 1 },
290f517afd5SLaurence Withers 	{ pinmux(17), 8, 0 },
291f517afd5SLaurence Withers 	{ pinmux(16), 8, 7 },
292f517afd5SLaurence Withers 	{ pinmux(16), 8, 6 },
293f517afd5SLaurence Withers 	{ pinmux(16), 8, 5 },
294f517afd5SLaurence Withers 	{ pinmux(16), 8, 4 },
295f517afd5SLaurence Withers 	{ pinmux(16), 8, 3 },
296f517afd5SLaurence Withers 	{ pinmux(16), 8, 2 },
297f517afd5SLaurence Withers 	{ pinmux(19), 8, 0 },	/* GP8[0] */
298f517afd5SLaurence Withers 	{ pinmux(3), 4, 7 },
299f517afd5SLaurence Withers 	{ pinmux(3), 4, 6 },
300f517afd5SLaurence Withers 	{ pinmux(3), 4, 5 },
301f517afd5SLaurence Withers 	{ pinmux(3), 4, 4 },
302f517afd5SLaurence Withers 	{ pinmux(3), 4, 3 },
303f517afd5SLaurence Withers 	{ pinmux(3), 4, 2 },
304f517afd5SLaurence Withers 	{ pinmux(2), 4, 7 },
305f517afd5SLaurence Withers 	{ pinmux(19), 8, 1 },
306f517afd5SLaurence Withers 	{ pinmux(19), 8, 0 },
307f517afd5SLaurence Withers 	{ pinmux(18), 8, 7 },
308f517afd5SLaurence Withers 	{ pinmux(18), 8, 6 },
309f517afd5SLaurence Withers 	{ pinmux(18), 8, 5 },
310f517afd5SLaurence Withers 	{ pinmux(18), 8, 4 },
311f517afd5SLaurence Withers 	{ pinmux(18), 8, 3 },
312f517afd5SLaurence Withers 	{ pinmux(18), 8, 2 },
313f517afd5SLaurence Withers };
314*b9f56698STomas Novotny #endif
315f517afd5SLaurence Withers 
316365d6070SJoe Hershberger int gpio_request(unsigned gpio, const char *label)
317f517afd5SLaurence Withers {
318365d6070SJoe Hershberger 	if (gpio >= MAX_NUM_GPIOS)
319f517afd5SLaurence Withers 		return -1;
320f517afd5SLaurence Withers 
321365d6070SJoe Hershberger 	if (gpio_registry[gpio].is_registered)
322f517afd5SLaurence Withers 		return -1;
323f517afd5SLaurence Withers 
324365d6070SJoe Hershberger 	gpio_registry[gpio].is_registered = 1;
325365d6070SJoe Hershberger 	strncpy(gpio_registry[gpio].name, label, GPIO_NAME_SIZE);
326365d6070SJoe Hershberger 	gpio_registry[gpio].name[GPIO_NAME_SIZE - 1] = 0;
327f517afd5SLaurence Withers 
328365d6070SJoe Hershberger 	davinci_configure_pin_mux(&gpio_pinmux[gpio], 1);
329f517afd5SLaurence Withers 
330f517afd5SLaurence Withers 	return 0;
331f517afd5SLaurence Withers }
332f517afd5SLaurence Withers 
333365d6070SJoe Hershberger int gpio_free(unsigned gpio)
334f517afd5SLaurence Withers {
335365d6070SJoe Hershberger 	if (gpio >= MAX_NUM_GPIOS)
336365d6070SJoe Hershberger 		return -1;
337365d6070SJoe Hershberger 
338365d6070SJoe Hershberger 	if (!gpio_registry[gpio].is_registered)
339365d6070SJoe Hershberger 		return -1;
340365d6070SJoe Hershberger 
341365d6070SJoe Hershberger 	gpio_registry[gpio].is_registered = 0;
342365d6070SJoe Hershberger 	gpio_registry[gpio].name[0] = '\0';
343365d6070SJoe Hershberger 	/* Do not configure as input or change pin mux here */
344365d6070SJoe Hershberger 	return 0;
345f517afd5SLaurence Withers }
346f517afd5SLaurence Withers 
347365d6070SJoe Hershberger int gpio_direction_input(unsigned gpio)
348f517afd5SLaurence Withers {
349f517afd5SLaurence Withers 	struct davinci_gpio *bank;
350f517afd5SLaurence Withers 
351365d6070SJoe Hershberger 	bank = GPIO_BANK(gpio);
352365d6070SJoe Hershberger 	setbits_le32(&bank->dir, 1U << GPIO_BIT(gpio));
353f517afd5SLaurence Withers 	return 0;
354f517afd5SLaurence Withers }
355f517afd5SLaurence Withers 
356365d6070SJoe Hershberger int gpio_direction_output(unsigned gpio, int value)
357f517afd5SLaurence Withers {
358f517afd5SLaurence Withers 	struct davinci_gpio *bank;
359f517afd5SLaurence Withers 
360365d6070SJoe Hershberger 	bank = GPIO_BANK(gpio);
361365d6070SJoe Hershberger 	clrbits_le32(&bank->dir, 1U << GPIO_BIT(gpio));
362365d6070SJoe Hershberger 	gpio_set_value(gpio, value);
363f517afd5SLaurence Withers 	return 0;
364f517afd5SLaurence Withers }
365f517afd5SLaurence Withers 
366365d6070SJoe Hershberger int gpio_get_value(unsigned gpio)
367f517afd5SLaurence Withers {
368f517afd5SLaurence Withers 	struct davinci_gpio *bank;
369f517afd5SLaurence Withers 	unsigned int ip;
370f517afd5SLaurence Withers 
371365d6070SJoe Hershberger 	bank = GPIO_BANK(gpio);
372365d6070SJoe Hershberger 	ip = in_le32(&bank->in_data) & (1U << GPIO_BIT(gpio));
373f517afd5SLaurence Withers 	return ip ? 1 : 0;
374f517afd5SLaurence Withers }
375f517afd5SLaurence Withers 
376365d6070SJoe Hershberger int gpio_set_value(unsigned gpio, int value)
377f517afd5SLaurence Withers {
378f517afd5SLaurence Withers 	struct davinci_gpio *bank;
379f517afd5SLaurence Withers 
380365d6070SJoe Hershberger 	bank = GPIO_BANK(gpio);
381f517afd5SLaurence Withers 
382f517afd5SLaurence Withers 	if (value)
383365d6070SJoe Hershberger 		bank->set_data = 1U << GPIO_BIT(gpio);
384f517afd5SLaurence Withers 	else
385365d6070SJoe Hershberger 		bank->clr_data = 1U << GPIO_BIT(gpio);
386365d6070SJoe Hershberger 
387365d6070SJoe Hershberger 	return 0;
388f517afd5SLaurence Withers }
389f517afd5SLaurence Withers 
390f517afd5SLaurence Withers void gpio_info(void)
391f517afd5SLaurence Withers {
392365d6070SJoe Hershberger 	unsigned gpio, dir, val;
393f517afd5SLaurence Withers 	struct davinci_gpio *bank;
394f517afd5SLaurence Withers 
395365d6070SJoe Hershberger 	for (gpio = 0; gpio < MAX_NUM_GPIOS; ++gpio) {
396365d6070SJoe Hershberger 		bank = GPIO_BANK(gpio);
397365d6070SJoe Hershberger 		dir = in_le32(&bank->dir) & (1U << GPIO_BIT(gpio));
398365d6070SJoe Hershberger 		val = gpio_get_value(gpio);
399f517afd5SLaurence Withers 
400f517afd5SLaurence Withers 		printf("% 4d: %s: %d [%c] %s\n",
401365d6070SJoe Hershberger 			gpio, dir ? " in" : "out", val,
402365d6070SJoe Hershberger 			gpio_registry[gpio].is_registered ? 'x' : ' ',
403365d6070SJoe Hershberger 			gpio_registry[gpio].name);
404f517afd5SLaurence Withers 	}
405f517afd5SLaurence Withers }
406