xref: /openbmc/u-boot/drivers/gpio/da8xx_gpio.c (revision 83d290c5)
1*83d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+
2f517afd5SLaurence Withers /*
3f517afd5SLaurence Withers  * GPIO driver for TI DaVinci DA8xx SOCs.
4f517afd5SLaurence Withers  *
5f517afd5SLaurence Withers  * (C) Copyright 2011 Guralp Systems Ltd.
6f517afd5SLaurence Withers  * Laurence Withers <lwithers@guralp.com>
7f517afd5SLaurence Withers  */
8f517afd5SLaurence Withers 
9f517afd5SLaurence Withers #include <common.h>
10f517afd5SLaurence Withers #include <asm/io.h>
11f517afd5SLaurence Withers #include <asm/gpio.h>
12f517afd5SLaurence Withers #include <asm/arch/hardware.h>
13f517afd5SLaurence Withers #include <asm/arch/davinci_misc.h>
14f517afd5SLaurence Withers 
15f517afd5SLaurence Withers static struct gpio_registry {
16f517afd5SLaurence Withers 	int is_registered;
17f517afd5SLaurence Withers 	char name[GPIO_NAME_SIZE];
18f517afd5SLaurence Withers } gpio_registry[MAX_NUM_GPIOS];
19f517afd5SLaurence Withers 
2003414ac4SHolger Hans Peter Freyther #if defined(CONFIG_SOC_DA8XX)
21f517afd5SLaurence Withers #define pinmux(x)       (&davinci_syscfg_regs->pinmux[x])
22f517afd5SLaurence Withers 
23b9f56698STomas Novotny #if defined(CONFIG_SOC_DA8XX) && !defined(CONFIG_SOC_DA850)
24b9f56698STomas Novotny static const struct pinmux_config gpio_pinmux[] = {
25b9f56698STomas Novotny 	{ pinmux(13), 8, 6 },	/* GP0[0] */
26b9f56698STomas Novotny 	{ pinmux(13), 8, 7 },
27b9f56698STomas Novotny 	{ pinmux(14), 8, 0 },
28b9f56698STomas Novotny 	{ pinmux(14), 8, 1 },
29b9f56698STomas Novotny 	{ pinmux(14), 8, 2 },
30b9f56698STomas Novotny 	{ pinmux(14), 8, 3 },
31b9f56698STomas Novotny 	{ pinmux(14), 8, 4 },
32b9f56698STomas Novotny 	{ pinmux(14), 8, 5 },
33b9f56698STomas Novotny 	{ pinmux(14), 8, 6 },
34b9f56698STomas Novotny 	{ pinmux(14), 8, 7 },
35b9f56698STomas Novotny 	{ pinmux(15), 8, 0 },
36b9f56698STomas Novotny 	{ pinmux(15), 8, 1 },
37b9f56698STomas Novotny 	{ pinmux(15), 8, 2 },
38b9f56698STomas Novotny 	{ pinmux(15), 8, 3 },
39b9f56698STomas Novotny 	{ pinmux(15), 8, 4 },
40b9f56698STomas Novotny 	{ pinmux(15), 8, 5 },
41b9f56698STomas Novotny 	{ pinmux(15), 8, 6 },	/* GP1[0] */
42b9f56698STomas Novotny 	{ pinmux(15), 8, 7 },
43b9f56698STomas Novotny 	{ pinmux(16), 8, 0 },
44b9f56698STomas Novotny 	{ pinmux(16), 8, 1 },
45b9f56698STomas Novotny 	{ pinmux(16), 8, 2 },
46b9f56698STomas Novotny 	{ pinmux(16), 8, 3 },
47b9f56698STomas Novotny 	{ pinmux(16), 8, 4 },
48b9f56698STomas Novotny 	{ pinmux(16), 8, 5 },
49b9f56698STomas Novotny 	{ pinmux(16), 8, 6 },
50b9f56698STomas Novotny 	{ pinmux(16), 8, 7 },
51b9f56698STomas Novotny 	{ pinmux(17), 8, 0 },
52b9f56698STomas Novotny 	{ pinmux(17), 8, 1 },
53b9f56698STomas Novotny 	{ pinmux(17), 8, 2 },
54b9f56698STomas Novotny 	{ pinmux(17), 8, 3 },
55b9f56698STomas Novotny 	{ pinmux(17), 8, 4 },
56b9f56698STomas Novotny 	{ pinmux(17), 8, 5 },
57b9f56698STomas Novotny 	{ pinmux(17), 8, 6 },	/* GP2[0] */
58b9f56698STomas Novotny 	{ pinmux(17), 8, 7 },
59b9f56698STomas Novotny 	{ pinmux(18), 8, 0 },
60b9f56698STomas Novotny 	{ pinmux(18), 8, 1 },
61b9f56698STomas Novotny 	{ pinmux(18), 8, 2 },
62b9f56698STomas Novotny 	{ pinmux(18), 8, 3 },
63b9f56698STomas Novotny 	{ pinmux(18), 8, 4 },
64b9f56698STomas Novotny 	{ pinmux(18), 8, 5 },
65b9f56698STomas Novotny 	{ pinmux(18), 8, 6 },
66b9f56698STomas Novotny 	{ pinmux(18), 8, 7 },
67b9f56698STomas Novotny 	{ pinmux(19), 8, 0 },
68b9f56698STomas Novotny 	{ pinmux(9), 8, 2 },
69b9f56698STomas Novotny 	{ pinmux(9), 8, 3 },
70b9f56698STomas Novotny 	{ pinmux(9), 8, 4 },
71b9f56698STomas Novotny 	{ pinmux(9), 8, 5 },
72b9f56698STomas Novotny 	{ pinmux(9), 8, 6 },
73b9f56698STomas Novotny 	{ pinmux(10), 8, 1 },	/* GP3[0] */
74b9f56698STomas Novotny 	{ pinmux(10), 8, 2 },
75b9f56698STomas Novotny 	{ pinmux(10), 8, 3 },
76b9f56698STomas Novotny 	{ pinmux(10), 8, 4 },
77b9f56698STomas Novotny 	{ pinmux(10), 8, 5 },
78b9f56698STomas Novotny 	{ pinmux(10), 8, 6 },
79b9f56698STomas Novotny 	{ pinmux(10), 8, 7 },
80b9f56698STomas Novotny 	{ pinmux(11), 8, 0 },
81b9f56698STomas Novotny 	{ pinmux(11), 8, 1 },
82b9f56698STomas Novotny 	{ pinmux(11), 8, 2 },
83b9f56698STomas Novotny 	{ pinmux(11), 8, 3 },
84b9f56698STomas Novotny 	{ pinmux(11), 8, 4 },
85b9f56698STomas Novotny 	{ pinmux(9), 8, 7 },
86b9f56698STomas Novotny 	{ pinmux(2), 8, 6 },
87b9f56698STomas Novotny 	{ pinmux(11), 8, 5 },
88b9f56698STomas Novotny 	{ pinmux(11), 8, 6 },
89b9f56698STomas Novotny 	{ pinmux(12), 8, 4 },	/* GP4[0] */
90b9f56698STomas Novotny 	{ pinmux(12), 8, 5 },
91b9f56698STomas Novotny 	{ pinmux(12), 8, 6 },
92b9f56698STomas Novotny 	{ pinmux(12), 8, 7 },
93b9f56698STomas Novotny 	{ pinmux(13), 8, 0 },
94b9f56698STomas Novotny 	{ pinmux(13), 8, 1 },
95b9f56698STomas Novotny 	{ pinmux(13), 8, 2 },
96b9f56698STomas Novotny 	{ pinmux(13), 8, 3 },
97b9f56698STomas Novotny 	{ pinmux(13), 8, 4 },
98b9f56698STomas Novotny 	{ pinmux(13), 8, 5 },
99b9f56698STomas Novotny 	{ pinmux(11), 8, 7 },
100b9f56698STomas Novotny 	{ pinmux(12), 8, 0 },
101b9f56698STomas Novotny 	{ pinmux(12), 8, 1 },
102b9f56698STomas Novotny 	{ pinmux(12), 8, 2 },
103b9f56698STomas Novotny 	{ pinmux(12), 8, 3 },
104b9f56698STomas Novotny 	{ pinmux(9), 8, 1 },
105b9f56698STomas Novotny 	{ pinmux(7), 8, 3 },	/* GP5[0] */
106b9f56698STomas Novotny 	{ pinmux(7), 8, 4 },
107b9f56698STomas Novotny 	{ pinmux(7), 8, 5 },
108b9f56698STomas Novotny 	{ pinmux(7), 8, 6 },
109b9f56698STomas Novotny 	{ pinmux(7), 8, 7 },
110b9f56698STomas Novotny 	{ pinmux(8), 8, 0 },
111b9f56698STomas Novotny 	{ pinmux(8), 8, 1 },
112b9f56698STomas Novotny 	{ pinmux(8), 8, 2 },
113b9f56698STomas Novotny 	{ pinmux(8), 8, 3 },
114b9f56698STomas Novotny 	{ pinmux(8), 8, 4 },
115b9f56698STomas Novotny 	{ pinmux(8), 8, 5 },
116b9f56698STomas Novotny 	{ pinmux(8), 8, 6 },
117b9f56698STomas Novotny 	{ pinmux(8), 8, 7 },
118b9f56698STomas Novotny 	{ pinmux(9), 8, 0 },
119b9f56698STomas Novotny 	{ pinmux(7), 8, 1 },
120b9f56698STomas Novotny 	{ pinmux(7), 8, 2 },
121b9f56698STomas Novotny 	{ pinmux(5), 8, 1 },	/* GP6[0] */
122b9f56698STomas Novotny 	{ pinmux(5), 8, 2 },
123b9f56698STomas Novotny 	{ pinmux(5), 8, 3 },
124b9f56698STomas Novotny 	{ pinmux(5), 8, 4 },
125b9f56698STomas Novotny 	{ pinmux(5), 8, 5 },
126b9f56698STomas Novotny 	{ pinmux(5), 8, 6 },
127b9f56698STomas Novotny 	{ pinmux(5), 8, 7 },
128b9f56698STomas Novotny 	{ pinmux(6), 8, 0 },
129b9f56698STomas Novotny 	{ pinmux(6), 8, 1 },
130b9f56698STomas Novotny 	{ pinmux(6), 8, 2 },
131b9f56698STomas Novotny 	{ pinmux(6), 8, 3 },
132b9f56698STomas Novotny 	{ pinmux(6), 8, 4 },
133b9f56698STomas Novotny 	{ pinmux(6), 8, 5 },
134b9f56698STomas Novotny 	{ pinmux(6), 8, 6 },
135b9f56698STomas Novotny 	{ pinmux(6), 8, 7 },
136b9f56698STomas Novotny 	{ pinmux(7), 8, 0 },
137b9f56698STomas Novotny 	{ pinmux(1), 8, 0 },	/* GP7[0] */
138b9f56698STomas Novotny 	{ pinmux(1), 8, 1 },
139b9f56698STomas Novotny 	{ pinmux(1), 8, 2 },
140b9f56698STomas Novotny 	{ pinmux(1), 8, 3 },
141b9f56698STomas Novotny 	{ pinmux(1), 8, 4 },
142b9f56698STomas Novotny 	{ pinmux(1), 8, 5 },
143b9f56698STomas Novotny 	{ pinmux(1), 8, 6 },
144b9f56698STomas Novotny 	{ pinmux(1), 8, 7 },
145b9f56698STomas Novotny 	{ pinmux(2), 8, 0 },
146b9f56698STomas Novotny 	{ pinmux(2), 8, 1 },
147b9f56698STomas Novotny 	{ pinmux(2), 8, 2 },
148b9f56698STomas Novotny 	{ pinmux(2), 8, 3 },
149b9f56698STomas Novotny 	{ pinmux(2), 8, 4 },
150b9f56698STomas Novotny 	{ pinmux(2), 8, 5 },
151b9f56698STomas Novotny 	{ pinmux(0), 1, 0 },
152b9f56698STomas Novotny 	{ pinmux(0), 1, 1 },
153b9f56698STomas Novotny };
15476b40ab4STom Rini #else /* CONFIG_SOC_DA8XX && CONFIG_SOC_DA850 */
155f517afd5SLaurence Withers static const struct pinmux_config gpio_pinmux[] = {
156f517afd5SLaurence Withers 	{ pinmux(1), 8, 7 },	/* GP0[0] */
157f517afd5SLaurence Withers 	{ pinmux(1), 8, 6 },
158f517afd5SLaurence Withers 	{ pinmux(1), 8, 5 },
159f517afd5SLaurence Withers 	{ pinmux(1), 8, 4 },
160f517afd5SLaurence Withers 	{ pinmux(1), 8, 3 },
161f517afd5SLaurence Withers 	{ pinmux(1), 8, 2 },
162f517afd5SLaurence Withers 	{ pinmux(1), 8, 1 },
163f517afd5SLaurence Withers 	{ pinmux(1), 8, 0 },
164f517afd5SLaurence Withers 	{ pinmux(0), 8, 7 },
165f517afd5SLaurence Withers 	{ pinmux(0), 8, 6 },
166f517afd5SLaurence Withers 	{ pinmux(0), 8, 5 },
167f517afd5SLaurence Withers 	{ pinmux(0), 8, 4 },
168f517afd5SLaurence Withers 	{ pinmux(0), 8, 3 },
169f517afd5SLaurence Withers 	{ pinmux(0), 8, 2 },
170f517afd5SLaurence Withers 	{ pinmux(0), 8, 1 },
171f517afd5SLaurence Withers 	{ pinmux(0), 8, 0 },
172f517afd5SLaurence Withers 	{ pinmux(4), 8, 7 },	/* GP1[0] */
173f517afd5SLaurence Withers 	{ pinmux(4), 8, 6 },
174f517afd5SLaurence Withers 	{ pinmux(4), 8, 5 },
175f517afd5SLaurence Withers 	{ pinmux(4), 8, 4 },
176f517afd5SLaurence Withers 	{ pinmux(4), 8, 3 },
177f517afd5SLaurence Withers 	{ pinmux(4), 8, 2 },
178f517afd5SLaurence Withers 	{ pinmux(4), 4, 1 },
179f517afd5SLaurence Withers 	{ pinmux(4), 4, 0 },
180f517afd5SLaurence Withers 	{ pinmux(3), 4, 0 },
181f517afd5SLaurence Withers 	{ pinmux(2), 4, 6 },
182f517afd5SLaurence Withers 	{ pinmux(2), 4, 5 },
183f517afd5SLaurence Withers 	{ pinmux(2), 4, 4 },
184f517afd5SLaurence Withers 	{ pinmux(2), 4, 3 },
185f517afd5SLaurence Withers 	{ pinmux(2), 4, 2 },
186f517afd5SLaurence Withers 	{ pinmux(2), 4, 1 },
187f517afd5SLaurence Withers 	{ pinmux(2), 8, 0 },
188f517afd5SLaurence Withers 	{ pinmux(6), 8, 7 },	/* GP2[0] */
189f517afd5SLaurence Withers 	{ pinmux(6), 8, 6 },
190f517afd5SLaurence Withers 	{ pinmux(6), 8, 5 },
191f517afd5SLaurence Withers 	{ pinmux(6), 8, 4 },
192f517afd5SLaurence Withers 	{ pinmux(6), 8, 3 },
193f517afd5SLaurence Withers 	{ pinmux(6), 8, 2 },
194f517afd5SLaurence Withers 	{ pinmux(6), 8, 1 },
195f517afd5SLaurence Withers 	{ pinmux(6), 8, 0 },
196f517afd5SLaurence Withers 	{ pinmux(5), 8, 7 },
197f517afd5SLaurence Withers 	{ pinmux(5), 8, 6 },
198f517afd5SLaurence Withers 	{ pinmux(5), 8, 5 },
199f517afd5SLaurence Withers 	{ pinmux(5), 8, 4 },
200f517afd5SLaurence Withers 	{ pinmux(5), 8, 3 },
201f517afd5SLaurence Withers 	{ pinmux(5), 8, 2 },
202f517afd5SLaurence Withers 	{ pinmux(5), 8, 1 },
203f517afd5SLaurence Withers 	{ pinmux(5), 8, 0 },
204f517afd5SLaurence Withers 	{ pinmux(8), 8, 7 },	/* GP3[0] */
205f517afd5SLaurence Withers 	{ pinmux(8), 8, 6 },
206f517afd5SLaurence Withers 	{ pinmux(8), 8, 5 },
207f517afd5SLaurence Withers 	{ pinmux(8), 8, 4 },
208f517afd5SLaurence Withers 	{ pinmux(8), 8, 3 },
209f517afd5SLaurence Withers 	{ pinmux(8), 8, 2 },
210f517afd5SLaurence Withers 	{ pinmux(8), 8, 1 },
211f517afd5SLaurence Withers 	{ pinmux(8), 8, 0 },
212f517afd5SLaurence Withers 	{ pinmux(7), 8, 7 },
213f517afd5SLaurence Withers 	{ pinmux(7), 8, 6 },
214f517afd5SLaurence Withers 	{ pinmux(7), 8, 5 },
215f517afd5SLaurence Withers 	{ pinmux(7), 8, 4 },
216f517afd5SLaurence Withers 	{ pinmux(7), 8, 3 },
217f517afd5SLaurence Withers 	{ pinmux(7), 8, 2 },
218f517afd5SLaurence Withers 	{ pinmux(7), 8, 1 },
219f517afd5SLaurence Withers 	{ pinmux(7), 8, 0 },
220f517afd5SLaurence Withers 	{ pinmux(10), 8, 7 },	/* GP4[0] */
221f517afd5SLaurence Withers 	{ pinmux(10), 8, 6 },
222f517afd5SLaurence Withers 	{ pinmux(10), 8, 5 },
223f517afd5SLaurence Withers 	{ pinmux(10), 8, 4 },
224f517afd5SLaurence Withers 	{ pinmux(10), 8, 3 },
225f517afd5SLaurence Withers 	{ pinmux(10), 8, 2 },
226f517afd5SLaurence Withers 	{ pinmux(10), 8, 1 },
227f517afd5SLaurence Withers 	{ pinmux(10), 8, 0 },
228f517afd5SLaurence Withers 	{ pinmux(9), 8, 7 },
229f517afd5SLaurence Withers 	{ pinmux(9), 8, 6 },
230f517afd5SLaurence Withers 	{ pinmux(9), 8, 5 },
231f517afd5SLaurence Withers 	{ pinmux(9), 8, 4 },
232f517afd5SLaurence Withers 	{ pinmux(9), 8, 3 },
233f517afd5SLaurence Withers 	{ pinmux(9), 8, 2 },
234f517afd5SLaurence Withers 	{ pinmux(9), 8, 1 },
235f517afd5SLaurence Withers 	{ pinmux(9), 8, 0 },
236f517afd5SLaurence Withers 	{ pinmux(12), 8, 7 },	/* GP5[0] */
237f517afd5SLaurence Withers 	{ pinmux(12), 8, 6 },
238f517afd5SLaurence Withers 	{ pinmux(12), 8, 5 },
239f517afd5SLaurence Withers 	{ pinmux(12), 8, 4 },
240f517afd5SLaurence Withers 	{ pinmux(12), 8, 3 },
241f517afd5SLaurence Withers 	{ pinmux(12), 8, 2 },
242f517afd5SLaurence Withers 	{ pinmux(12), 8, 1 },
243f517afd5SLaurence Withers 	{ pinmux(12), 8, 0 },
244f517afd5SLaurence Withers 	{ pinmux(11), 8, 7 },
245f517afd5SLaurence Withers 	{ pinmux(11), 8, 6 },
246f517afd5SLaurence Withers 	{ pinmux(11), 8, 5 },
247f517afd5SLaurence Withers 	{ pinmux(11), 8, 4 },
248f517afd5SLaurence Withers 	{ pinmux(11), 8, 3 },
249f517afd5SLaurence Withers 	{ pinmux(11), 8, 2 },
250f517afd5SLaurence Withers 	{ pinmux(11), 8, 1 },
251f517afd5SLaurence Withers 	{ pinmux(11), 8, 0 },
252f517afd5SLaurence Withers 	{ pinmux(19), 8, 6 },	/* GP6[0] */
253f517afd5SLaurence Withers 	{ pinmux(19), 8, 5 },
254f517afd5SLaurence Withers 	{ pinmux(19), 8, 4 },
255f517afd5SLaurence Withers 	{ pinmux(19), 8, 3 },
256f517afd5SLaurence Withers 	{ pinmux(19), 8, 2 },
257f517afd5SLaurence Withers 	{ pinmux(16), 8, 1 },
258f517afd5SLaurence Withers 	{ pinmux(14), 8, 1 },
259f517afd5SLaurence Withers 	{ pinmux(14), 8, 0 },
260f517afd5SLaurence Withers 	{ pinmux(13), 8, 7 },
261f517afd5SLaurence Withers 	{ pinmux(13), 8, 6 },
262f517afd5SLaurence Withers 	{ pinmux(13), 8, 5 },
263f517afd5SLaurence Withers 	{ pinmux(13), 8, 4 },
264f517afd5SLaurence Withers 	{ pinmux(13), 8, 3 },
265f517afd5SLaurence Withers 	{ pinmux(13), 8, 2 },
266f517afd5SLaurence Withers 	{ pinmux(13), 8, 1 },
267f517afd5SLaurence Withers 	{ pinmux(13), 8, 0 },
268f517afd5SLaurence Withers 	{ pinmux(18), 8, 1 },	/* GP7[0] */
269f517afd5SLaurence Withers 	{ pinmux(18), 8, 0 },
270f517afd5SLaurence Withers 	{ pinmux(17), 8, 7 },
271f517afd5SLaurence Withers 	{ pinmux(17), 8, 6 },
272f517afd5SLaurence Withers 	{ pinmux(17), 8, 5 },
273f517afd5SLaurence Withers 	{ pinmux(17), 8, 4 },
274f517afd5SLaurence Withers 	{ pinmux(17), 8, 3 },
275f517afd5SLaurence Withers 	{ pinmux(17), 8, 2 },
276f517afd5SLaurence Withers 	{ pinmux(17), 8, 1 },
277f517afd5SLaurence Withers 	{ pinmux(17), 8, 0 },
278f517afd5SLaurence Withers 	{ pinmux(16), 8, 7 },
279f517afd5SLaurence Withers 	{ pinmux(16), 8, 6 },
280f517afd5SLaurence Withers 	{ pinmux(16), 8, 5 },
281f517afd5SLaurence Withers 	{ pinmux(16), 8, 4 },
282f517afd5SLaurence Withers 	{ pinmux(16), 8, 3 },
283f517afd5SLaurence Withers 	{ pinmux(16), 8, 2 },
284f517afd5SLaurence Withers 	{ pinmux(19), 8, 0 },	/* GP8[0] */
285f517afd5SLaurence Withers 	{ pinmux(3), 4, 7 },
286f517afd5SLaurence Withers 	{ pinmux(3), 4, 6 },
287f517afd5SLaurence Withers 	{ pinmux(3), 4, 5 },
288f517afd5SLaurence Withers 	{ pinmux(3), 4, 4 },
289f517afd5SLaurence Withers 	{ pinmux(3), 4, 3 },
290f517afd5SLaurence Withers 	{ pinmux(3), 4, 2 },
291f517afd5SLaurence Withers 	{ pinmux(2), 4, 7 },
292f517afd5SLaurence Withers 	{ pinmux(19), 8, 1 },
293f517afd5SLaurence Withers 	{ pinmux(19), 8, 0 },
294f517afd5SLaurence Withers 	{ pinmux(18), 8, 7 },
295f517afd5SLaurence Withers 	{ pinmux(18), 8, 6 },
296f517afd5SLaurence Withers 	{ pinmux(18), 8, 5 },
297f517afd5SLaurence Withers 	{ pinmux(18), 8, 4 },
298f517afd5SLaurence Withers 	{ pinmux(18), 8, 3 },
299f517afd5SLaurence Withers 	{ pinmux(18), 8, 2 },
300f517afd5SLaurence Withers };
30176b40ab4STom Rini #endif /* CONFIG_SOC_DA8XX && !CONFIG_SOC_DA850 */
30276b40ab4STom Rini #else /* !CONFIG_SOC_DA8XX */
30303414ac4SHolger Hans Peter Freyther #define davinci_configure_pin_mux(a, b)
30476b40ab4STom Rini #endif /* CONFIG_SOC_DA8XX */
305f517afd5SLaurence Withers 
306365d6070SJoe Hershberger int gpio_request(unsigned gpio, const char *label)
307f517afd5SLaurence Withers {
308365d6070SJoe Hershberger 	if (gpio >= MAX_NUM_GPIOS)
309f517afd5SLaurence Withers 		return -1;
310f517afd5SLaurence Withers 
311365d6070SJoe Hershberger 	if (gpio_registry[gpio].is_registered)
312f517afd5SLaurence Withers 		return -1;
313f517afd5SLaurence Withers 
314365d6070SJoe Hershberger 	gpio_registry[gpio].is_registered = 1;
315365d6070SJoe Hershberger 	strncpy(gpio_registry[gpio].name, label, GPIO_NAME_SIZE);
316365d6070SJoe Hershberger 	gpio_registry[gpio].name[GPIO_NAME_SIZE - 1] = 0;
317f517afd5SLaurence Withers 
318365d6070SJoe Hershberger 	davinci_configure_pin_mux(&gpio_pinmux[gpio], 1);
319f517afd5SLaurence Withers 
320f517afd5SLaurence Withers 	return 0;
321f517afd5SLaurence Withers }
322f517afd5SLaurence Withers 
323365d6070SJoe Hershberger int gpio_free(unsigned gpio)
324f517afd5SLaurence Withers {
325365d6070SJoe Hershberger 	if (gpio >= MAX_NUM_GPIOS)
326365d6070SJoe Hershberger 		return -1;
327365d6070SJoe Hershberger 
328365d6070SJoe Hershberger 	if (!gpio_registry[gpio].is_registered)
329365d6070SJoe Hershberger 		return -1;
330365d6070SJoe Hershberger 
331365d6070SJoe Hershberger 	gpio_registry[gpio].is_registered = 0;
332365d6070SJoe Hershberger 	gpio_registry[gpio].name[0] = '\0';
333365d6070SJoe Hershberger 	/* Do not configure as input or change pin mux here */
334365d6070SJoe Hershberger 	return 0;
335f517afd5SLaurence Withers }
336f517afd5SLaurence Withers 
337365d6070SJoe Hershberger int gpio_direction_input(unsigned gpio)
338f517afd5SLaurence Withers {
339f517afd5SLaurence Withers 	struct davinci_gpio *bank;
340f517afd5SLaurence Withers 
341365d6070SJoe Hershberger 	bank = GPIO_BANK(gpio);
342365d6070SJoe Hershberger 	setbits_le32(&bank->dir, 1U << GPIO_BIT(gpio));
343f517afd5SLaurence Withers 	return 0;
344f517afd5SLaurence Withers }
345f517afd5SLaurence Withers 
346365d6070SJoe Hershberger int gpio_direction_output(unsigned gpio, int value)
347f517afd5SLaurence Withers {
348f517afd5SLaurence Withers 	struct davinci_gpio *bank;
349f517afd5SLaurence Withers 
350365d6070SJoe Hershberger 	bank = GPIO_BANK(gpio);
351365d6070SJoe Hershberger 	clrbits_le32(&bank->dir, 1U << GPIO_BIT(gpio));
352365d6070SJoe Hershberger 	gpio_set_value(gpio, value);
353f517afd5SLaurence Withers 	return 0;
354f517afd5SLaurence Withers }
355f517afd5SLaurence Withers 
356365d6070SJoe Hershberger int gpio_get_value(unsigned gpio)
357f517afd5SLaurence Withers {
358f517afd5SLaurence Withers 	struct davinci_gpio *bank;
359f517afd5SLaurence Withers 	unsigned int ip;
360f517afd5SLaurence Withers 
361365d6070SJoe Hershberger 	bank = GPIO_BANK(gpio);
362365d6070SJoe Hershberger 	ip = in_le32(&bank->in_data) & (1U << GPIO_BIT(gpio));
363f517afd5SLaurence Withers 	return ip ? 1 : 0;
364f517afd5SLaurence Withers }
365f517afd5SLaurence Withers 
366365d6070SJoe Hershberger int gpio_set_value(unsigned gpio, int value)
367f517afd5SLaurence Withers {
368f517afd5SLaurence Withers 	struct davinci_gpio *bank;
369f517afd5SLaurence Withers 
370365d6070SJoe Hershberger 	bank = GPIO_BANK(gpio);
371f517afd5SLaurence Withers 
372f517afd5SLaurence Withers 	if (value)
373365d6070SJoe Hershberger 		bank->set_data = 1U << GPIO_BIT(gpio);
374f517afd5SLaurence Withers 	else
375365d6070SJoe Hershberger 		bank->clr_data = 1U << GPIO_BIT(gpio);
376365d6070SJoe Hershberger 
377365d6070SJoe Hershberger 	return 0;
378f517afd5SLaurence Withers }
379f517afd5SLaurence Withers 
380f517afd5SLaurence Withers void gpio_info(void)
381f517afd5SLaurence Withers {
382365d6070SJoe Hershberger 	unsigned gpio, dir, val;
383f517afd5SLaurence Withers 	struct davinci_gpio *bank;
384f517afd5SLaurence Withers 
385365d6070SJoe Hershberger 	for (gpio = 0; gpio < MAX_NUM_GPIOS; ++gpio) {
386365d6070SJoe Hershberger 		bank = GPIO_BANK(gpio);
387365d6070SJoe Hershberger 		dir = in_le32(&bank->dir) & (1U << GPIO_BIT(gpio));
388365d6070SJoe Hershberger 		val = gpio_get_value(gpio);
389f517afd5SLaurence Withers 
390f517afd5SLaurence Withers 		printf("% 4d: %s: %d [%c] %s\n",
391365d6070SJoe Hershberger 			gpio, dir ? " in" : "out", val,
392365d6070SJoe Hershberger 			gpio_registry[gpio].is_registered ? 'x' : ' ',
393365d6070SJoe Hershberger 			gpio_registry[gpio].name);
394f517afd5SLaurence Withers 	}
395f517afd5SLaurence Withers }
396