xref: /openbmc/u-boot/drivers/gpio/da8xx_gpio.c (revision 76b40ab4)
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 
3403414ac4SHolger Hans Peter Freyther #if defined(CONFIG_SOC_DA8XX)
35f517afd5SLaurence Withers #define pinmux(x)       (&davinci_syscfg_regs->pinmux[x])
36f517afd5SLaurence Withers 
37b9f56698STomas Novotny #if defined(CONFIG_SOC_DA8XX) && !defined(CONFIG_SOC_DA850)
38b9f56698STomas Novotny static const struct pinmux_config gpio_pinmux[] = {
39b9f56698STomas Novotny 	{ pinmux(13), 8, 6 },	/* GP0[0] */
40b9f56698STomas Novotny 	{ pinmux(13), 8, 7 },
41b9f56698STomas Novotny 	{ pinmux(14), 8, 0 },
42b9f56698STomas Novotny 	{ pinmux(14), 8, 1 },
43b9f56698STomas Novotny 	{ pinmux(14), 8, 2 },
44b9f56698STomas Novotny 	{ pinmux(14), 8, 3 },
45b9f56698STomas Novotny 	{ pinmux(14), 8, 4 },
46b9f56698STomas Novotny 	{ pinmux(14), 8, 5 },
47b9f56698STomas Novotny 	{ pinmux(14), 8, 6 },
48b9f56698STomas Novotny 	{ pinmux(14), 8, 7 },
49b9f56698STomas Novotny 	{ pinmux(15), 8, 0 },
50b9f56698STomas Novotny 	{ pinmux(15), 8, 1 },
51b9f56698STomas Novotny 	{ pinmux(15), 8, 2 },
52b9f56698STomas Novotny 	{ pinmux(15), 8, 3 },
53b9f56698STomas Novotny 	{ pinmux(15), 8, 4 },
54b9f56698STomas Novotny 	{ pinmux(15), 8, 5 },
55b9f56698STomas Novotny 	{ pinmux(15), 8, 6 },	/* GP1[0] */
56b9f56698STomas Novotny 	{ pinmux(15), 8, 7 },
57b9f56698STomas Novotny 	{ pinmux(16), 8, 0 },
58b9f56698STomas Novotny 	{ pinmux(16), 8, 1 },
59b9f56698STomas Novotny 	{ pinmux(16), 8, 2 },
60b9f56698STomas Novotny 	{ pinmux(16), 8, 3 },
61b9f56698STomas Novotny 	{ pinmux(16), 8, 4 },
62b9f56698STomas Novotny 	{ pinmux(16), 8, 5 },
63b9f56698STomas Novotny 	{ pinmux(16), 8, 6 },
64b9f56698STomas Novotny 	{ pinmux(16), 8, 7 },
65b9f56698STomas Novotny 	{ pinmux(17), 8, 0 },
66b9f56698STomas Novotny 	{ pinmux(17), 8, 1 },
67b9f56698STomas Novotny 	{ pinmux(17), 8, 2 },
68b9f56698STomas Novotny 	{ pinmux(17), 8, 3 },
69b9f56698STomas Novotny 	{ pinmux(17), 8, 4 },
70b9f56698STomas Novotny 	{ pinmux(17), 8, 5 },
71b9f56698STomas Novotny 	{ pinmux(17), 8, 6 },	/* GP2[0] */
72b9f56698STomas Novotny 	{ pinmux(17), 8, 7 },
73b9f56698STomas Novotny 	{ pinmux(18), 8, 0 },
74b9f56698STomas Novotny 	{ pinmux(18), 8, 1 },
75b9f56698STomas Novotny 	{ pinmux(18), 8, 2 },
76b9f56698STomas Novotny 	{ pinmux(18), 8, 3 },
77b9f56698STomas Novotny 	{ pinmux(18), 8, 4 },
78b9f56698STomas Novotny 	{ pinmux(18), 8, 5 },
79b9f56698STomas Novotny 	{ pinmux(18), 8, 6 },
80b9f56698STomas Novotny 	{ pinmux(18), 8, 7 },
81b9f56698STomas Novotny 	{ pinmux(19), 8, 0 },
82b9f56698STomas Novotny 	{ pinmux(9), 8, 2 },
83b9f56698STomas Novotny 	{ pinmux(9), 8, 3 },
84b9f56698STomas Novotny 	{ pinmux(9), 8, 4 },
85b9f56698STomas Novotny 	{ pinmux(9), 8, 5 },
86b9f56698STomas Novotny 	{ pinmux(9), 8, 6 },
87b9f56698STomas Novotny 	{ pinmux(10), 8, 1 },	/* GP3[0] */
88b9f56698STomas Novotny 	{ pinmux(10), 8, 2 },
89b9f56698STomas Novotny 	{ pinmux(10), 8, 3 },
90b9f56698STomas Novotny 	{ pinmux(10), 8, 4 },
91b9f56698STomas Novotny 	{ pinmux(10), 8, 5 },
92b9f56698STomas Novotny 	{ pinmux(10), 8, 6 },
93b9f56698STomas Novotny 	{ pinmux(10), 8, 7 },
94b9f56698STomas Novotny 	{ pinmux(11), 8, 0 },
95b9f56698STomas Novotny 	{ pinmux(11), 8, 1 },
96b9f56698STomas Novotny 	{ pinmux(11), 8, 2 },
97b9f56698STomas Novotny 	{ pinmux(11), 8, 3 },
98b9f56698STomas Novotny 	{ pinmux(11), 8, 4 },
99b9f56698STomas Novotny 	{ pinmux(9), 8, 7 },
100b9f56698STomas Novotny 	{ pinmux(2), 8, 6 },
101b9f56698STomas Novotny 	{ pinmux(11), 8, 5 },
102b9f56698STomas Novotny 	{ pinmux(11), 8, 6 },
103b9f56698STomas Novotny 	{ pinmux(12), 8, 4 },	/* GP4[0] */
104b9f56698STomas Novotny 	{ pinmux(12), 8, 5 },
105b9f56698STomas Novotny 	{ pinmux(12), 8, 6 },
106b9f56698STomas Novotny 	{ pinmux(12), 8, 7 },
107b9f56698STomas Novotny 	{ pinmux(13), 8, 0 },
108b9f56698STomas Novotny 	{ pinmux(13), 8, 1 },
109b9f56698STomas Novotny 	{ pinmux(13), 8, 2 },
110b9f56698STomas Novotny 	{ pinmux(13), 8, 3 },
111b9f56698STomas Novotny 	{ pinmux(13), 8, 4 },
112b9f56698STomas Novotny 	{ pinmux(13), 8, 5 },
113b9f56698STomas Novotny 	{ pinmux(11), 8, 7 },
114b9f56698STomas Novotny 	{ pinmux(12), 8, 0 },
115b9f56698STomas Novotny 	{ pinmux(12), 8, 1 },
116b9f56698STomas Novotny 	{ pinmux(12), 8, 2 },
117b9f56698STomas Novotny 	{ pinmux(12), 8, 3 },
118b9f56698STomas Novotny 	{ pinmux(9), 8, 1 },
119b9f56698STomas Novotny 	{ pinmux(7), 8, 3 },	/* GP5[0] */
120b9f56698STomas Novotny 	{ pinmux(7), 8, 4 },
121b9f56698STomas Novotny 	{ pinmux(7), 8, 5 },
122b9f56698STomas Novotny 	{ pinmux(7), 8, 6 },
123b9f56698STomas Novotny 	{ pinmux(7), 8, 7 },
124b9f56698STomas Novotny 	{ pinmux(8), 8, 0 },
125b9f56698STomas Novotny 	{ pinmux(8), 8, 1 },
126b9f56698STomas Novotny 	{ pinmux(8), 8, 2 },
127b9f56698STomas Novotny 	{ pinmux(8), 8, 3 },
128b9f56698STomas Novotny 	{ pinmux(8), 8, 4 },
129b9f56698STomas Novotny 	{ pinmux(8), 8, 5 },
130b9f56698STomas Novotny 	{ pinmux(8), 8, 6 },
131b9f56698STomas Novotny 	{ pinmux(8), 8, 7 },
132b9f56698STomas Novotny 	{ pinmux(9), 8, 0 },
133b9f56698STomas Novotny 	{ pinmux(7), 8, 1 },
134b9f56698STomas Novotny 	{ pinmux(7), 8, 2 },
135b9f56698STomas Novotny 	{ pinmux(5), 8, 1 },	/* GP6[0] */
136b9f56698STomas Novotny 	{ pinmux(5), 8, 2 },
137b9f56698STomas Novotny 	{ pinmux(5), 8, 3 },
138b9f56698STomas Novotny 	{ pinmux(5), 8, 4 },
139b9f56698STomas Novotny 	{ pinmux(5), 8, 5 },
140b9f56698STomas Novotny 	{ pinmux(5), 8, 6 },
141b9f56698STomas Novotny 	{ pinmux(5), 8, 7 },
142b9f56698STomas Novotny 	{ pinmux(6), 8, 0 },
143b9f56698STomas Novotny 	{ pinmux(6), 8, 1 },
144b9f56698STomas Novotny 	{ pinmux(6), 8, 2 },
145b9f56698STomas Novotny 	{ pinmux(6), 8, 3 },
146b9f56698STomas Novotny 	{ pinmux(6), 8, 4 },
147b9f56698STomas Novotny 	{ pinmux(6), 8, 5 },
148b9f56698STomas Novotny 	{ pinmux(6), 8, 6 },
149b9f56698STomas Novotny 	{ pinmux(6), 8, 7 },
150b9f56698STomas Novotny 	{ pinmux(7), 8, 0 },
151b9f56698STomas Novotny 	{ pinmux(1), 8, 0 },	/* GP7[0] */
152b9f56698STomas Novotny 	{ pinmux(1), 8, 1 },
153b9f56698STomas Novotny 	{ pinmux(1), 8, 2 },
154b9f56698STomas Novotny 	{ pinmux(1), 8, 3 },
155b9f56698STomas Novotny 	{ pinmux(1), 8, 4 },
156b9f56698STomas Novotny 	{ pinmux(1), 8, 5 },
157b9f56698STomas Novotny 	{ pinmux(1), 8, 6 },
158b9f56698STomas Novotny 	{ pinmux(1), 8, 7 },
159b9f56698STomas Novotny 	{ pinmux(2), 8, 0 },
160b9f56698STomas Novotny 	{ pinmux(2), 8, 1 },
161b9f56698STomas Novotny 	{ pinmux(2), 8, 2 },
162b9f56698STomas Novotny 	{ pinmux(2), 8, 3 },
163b9f56698STomas Novotny 	{ pinmux(2), 8, 4 },
164b9f56698STomas Novotny 	{ pinmux(2), 8, 5 },
165b9f56698STomas Novotny 	{ pinmux(0), 1, 0 },
166b9f56698STomas Novotny 	{ pinmux(0), 1, 1 },
167b9f56698STomas Novotny };
168*76b40ab4STom Rini #else /* CONFIG_SOC_DA8XX && CONFIG_SOC_DA850 */
169f517afd5SLaurence Withers static const struct pinmux_config gpio_pinmux[] = {
170f517afd5SLaurence Withers 	{ pinmux(1), 8, 7 },	/* GP0[0] */
171f517afd5SLaurence Withers 	{ pinmux(1), 8, 6 },
172f517afd5SLaurence Withers 	{ pinmux(1), 8, 5 },
173f517afd5SLaurence Withers 	{ pinmux(1), 8, 4 },
174f517afd5SLaurence Withers 	{ pinmux(1), 8, 3 },
175f517afd5SLaurence Withers 	{ pinmux(1), 8, 2 },
176f517afd5SLaurence Withers 	{ pinmux(1), 8, 1 },
177f517afd5SLaurence Withers 	{ pinmux(1), 8, 0 },
178f517afd5SLaurence Withers 	{ pinmux(0), 8, 7 },
179f517afd5SLaurence Withers 	{ pinmux(0), 8, 6 },
180f517afd5SLaurence Withers 	{ pinmux(0), 8, 5 },
181f517afd5SLaurence Withers 	{ pinmux(0), 8, 4 },
182f517afd5SLaurence Withers 	{ pinmux(0), 8, 3 },
183f517afd5SLaurence Withers 	{ pinmux(0), 8, 2 },
184f517afd5SLaurence Withers 	{ pinmux(0), 8, 1 },
185f517afd5SLaurence Withers 	{ pinmux(0), 8, 0 },
186f517afd5SLaurence Withers 	{ pinmux(4), 8, 7 },	/* GP1[0] */
187f517afd5SLaurence Withers 	{ pinmux(4), 8, 6 },
188f517afd5SLaurence Withers 	{ pinmux(4), 8, 5 },
189f517afd5SLaurence Withers 	{ pinmux(4), 8, 4 },
190f517afd5SLaurence Withers 	{ pinmux(4), 8, 3 },
191f517afd5SLaurence Withers 	{ pinmux(4), 8, 2 },
192f517afd5SLaurence Withers 	{ pinmux(4), 4, 1 },
193f517afd5SLaurence Withers 	{ pinmux(4), 4, 0 },
194f517afd5SLaurence Withers 	{ pinmux(3), 4, 0 },
195f517afd5SLaurence Withers 	{ pinmux(2), 4, 6 },
196f517afd5SLaurence Withers 	{ pinmux(2), 4, 5 },
197f517afd5SLaurence Withers 	{ pinmux(2), 4, 4 },
198f517afd5SLaurence Withers 	{ pinmux(2), 4, 3 },
199f517afd5SLaurence Withers 	{ pinmux(2), 4, 2 },
200f517afd5SLaurence Withers 	{ pinmux(2), 4, 1 },
201f517afd5SLaurence Withers 	{ pinmux(2), 8, 0 },
202f517afd5SLaurence Withers 	{ pinmux(6), 8, 7 },	/* GP2[0] */
203f517afd5SLaurence Withers 	{ pinmux(6), 8, 6 },
204f517afd5SLaurence Withers 	{ pinmux(6), 8, 5 },
205f517afd5SLaurence Withers 	{ pinmux(6), 8, 4 },
206f517afd5SLaurence Withers 	{ pinmux(6), 8, 3 },
207f517afd5SLaurence Withers 	{ pinmux(6), 8, 2 },
208f517afd5SLaurence Withers 	{ pinmux(6), 8, 1 },
209f517afd5SLaurence Withers 	{ pinmux(6), 8, 0 },
210f517afd5SLaurence Withers 	{ pinmux(5), 8, 7 },
211f517afd5SLaurence Withers 	{ pinmux(5), 8, 6 },
212f517afd5SLaurence Withers 	{ pinmux(5), 8, 5 },
213f517afd5SLaurence Withers 	{ pinmux(5), 8, 4 },
214f517afd5SLaurence Withers 	{ pinmux(5), 8, 3 },
215f517afd5SLaurence Withers 	{ pinmux(5), 8, 2 },
216f517afd5SLaurence Withers 	{ pinmux(5), 8, 1 },
217f517afd5SLaurence Withers 	{ pinmux(5), 8, 0 },
218f517afd5SLaurence Withers 	{ pinmux(8), 8, 7 },	/* GP3[0] */
219f517afd5SLaurence Withers 	{ pinmux(8), 8, 6 },
220f517afd5SLaurence Withers 	{ pinmux(8), 8, 5 },
221f517afd5SLaurence Withers 	{ pinmux(8), 8, 4 },
222f517afd5SLaurence Withers 	{ pinmux(8), 8, 3 },
223f517afd5SLaurence Withers 	{ pinmux(8), 8, 2 },
224f517afd5SLaurence Withers 	{ pinmux(8), 8, 1 },
225f517afd5SLaurence Withers 	{ pinmux(8), 8, 0 },
226f517afd5SLaurence Withers 	{ pinmux(7), 8, 7 },
227f517afd5SLaurence Withers 	{ pinmux(7), 8, 6 },
228f517afd5SLaurence Withers 	{ pinmux(7), 8, 5 },
229f517afd5SLaurence Withers 	{ pinmux(7), 8, 4 },
230f517afd5SLaurence Withers 	{ pinmux(7), 8, 3 },
231f517afd5SLaurence Withers 	{ pinmux(7), 8, 2 },
232f517afd5SLaurence Withers 	{ pinmux(7), 8, 1 },
233f517afd5SLaurence Withers 	{ pinmux(7), 8, 0 },
234f517afd5SLaurence Withers 	{ pinmux(10), 8, 7 },	/* GP4[0] */
235f517afd5SLaurence Withers 	{ pinmux(10), 8, 6 },
236f517afd5SLaurence Withers 	{ pinmux(10), 8, 5 },
237f517afd5SLaurence Withers 	{ pinmux(10), 8, 4 },
238f517afd5SLaurence Withers 	{ pinmux(10), 8, 3 },
239f517afd5SLaurence Withers 	{ pinmux(10), 8, 2 },
240f517afd5SLaurence Withers 	{ pinmux(10), 8, 1 },
241f517afd5SLaurence Withers 	{ pinmux(10), 8, 0 },
242f517afd5SLaurence Withers 	{ pinmux(9), 8, 7 },
243f517afd5SLaurence Withers 	{ pinmux(9), 8, 6 },
244f517afd5SLaurence Withers 	{ pinmux(9), 8, 5 },
245f517afd5SLaurence Withers 	{ pinmux(9), 8, 4 },
246f517afd5SLaurence Withers 	{ pinmux(9), 8, 3 },
247f517afd5SLaurence Withers 	{ pinmux(9), 8, 2 },
248f517afd5SLaurence Withers 	{ pinmux(9), 8, 1 },
249f517afd5SLaurence Withers 	{ pinmux(9), 8, 0 },
250f517afd5SLaurence Withers 	{ pinmux(12), 8, 7 },	/* GP5[0] */
251f517afd5SLaurence Withers 	{ pinmux(12), 8, 6 },
252f517afd5SLaurence Withers 	{ pinmux(12), 8, 5 },
253f517afd5SLaurence Withers 	{ pinmux(12), 8, 4 },
254f517afd5SLaurence Withers 	{ pinmux(12), 8, 3 },
255f517afd5SLaurence Withers 	{ pinmux(12), 8, 2 },
256f517afd5SLaurence Withers 	{ pinmux(12), 8, 1 },
257f517afd5SLaurence Withers 	{ pinmux(12), 8, 0 },
258f517afd5SLaurence Withers 	{ pinmux(11), 8, 7 },
259f517afd5SLaurence Withers 	{ pinmux(11), 8, 6 },
260f517afd5SLaurence Withers 	{ pinmux(11), 8, 5 },
261f517afd5SLaurence Withers 	{ pinmux(11), 8, 4 },
262f517afd5SLaurence Withers 	{ pinmux(11), 8, 3 },
263f517afd5SLaurence Withers 	{ pinmux(11), 8, 2 },
264f517afd5SLaurence Withers 	{ pinmux(11), 8, 1 },
265f517afd5SLaurence Withers 	{ pinmux(11), 8, 0 },
266f517afd5SLaurence Withers 	{ pinmux(19), 8, 6 },	/* GP6[0] */
267f517afd5SLaurence Withers 	{ pinmux(19), 8, 5 },
268f517afd5SLaurence Withers 	{ pinmux(19), 8, 4 },
269f517afd5SLaurence Withers 	{ pinmux(19), 8, 3 },
270f517afd5SLaurence Withers 	{ pinmux(19), 8, 2 },
271f517afd5SLaurence Withers 	{ pinmux(16), 8, 1 },
272f517afd5SLaurence Withers 	{ pinmux(14), 8, 1 },
273f517afd5SLaurence Withers 	{ pinmux(14), 8, 0 },
274f517afd5SLaurence Withers 	{ pinmux(13), 8, 7 },
275f517afd5SLaurence Withers 	{ pinmux(13), 8, 6 },
276f517afd5SLaurence Withers 	{ pinmux(13), 8, 5 },
277f517afd5SLaurence Withers 	{ pinmux(13), 8, 4 },
278f517afd5SLaurence Withers 	{ pinmux(13), 8, 3 },
279f517afd5SLaurence Withers 	{ pinmux(13), 8, 2 },
280f517afd5SLaurence Withers 	{ pinmux(13), 8, 1 },
281f517afd5SLaurence Withers 	{ pinmux(13), 8, 0 },
282f517afd5SLaurence Withers 	{ pinmux(18), 8, 1 },	/* GP7[0] */
283f517afd5SLaurence Withers 	{ pinmux(18), 8, 0 },
284f517afd5SLaurence Withers 	{ pinmux(17), 8, 7 },
285f517afd5SLaurence Withers 	{ pinmux(17), 8, 6 },
286f517afd5SLaurence Withers 	{ pinmux(17), 8, 5 },
287f517afd5SLaurence Withers 	{ pinmux(17), 8, 4 },
288f517afd5SLaurence Withers 	{ pinmux(17), 8, 3 },
289f517afd5SLaurence Withers 	{ pinmux(17), 8, 2 },
290f517afd5SLaurence Withers 	{ pinmux(17), 8, 1 },
291f517afd5SLaurence Withers 	{ pinmux(17), 8, 0 },
292f517afd5SLaurence Withers 	{ pinmux(16), 8, 7 },
293f517afd5SLaurence Withers 	{ pinmux(16), 8, 6 },
294f517afd5SLaurence Withers 	{ pinmux(16), 8, 5 },
295f517afd5SLaurence Withers 	{ pinmux(16), 8, 4 },
296f517afd5SLaurence Withers 	{ pinmux(16), 8, 3 },
297f517afd5SLaurence Withers 	{ pinmux(16), 8, 2 },
298f517afd5SLaurence Withers 	{ pinmux(19), 8, 0 },	/* GP8[0] */
299f517afd5SLaurence Withers 	{ pinmux(3), 4, 7 },
300f517afd5SLaurence Withers 	{ pinmux(3), 4, 6 },
301f517afd5SLaurence Withers 	{ pinmux(3), 4, 5 },
302f517afd5SLaurence Withers 	{ pinmux(3), 4, 4 },
303f517afd5SLaurence Withers 	{ pinmux(3), 4, 3 },
304f517afd5SLaurence Withers 	{ pinmux(3), 4, 2 },
305f517afd5SLaurence Withers 	{ pinmux(2), 4, 7 },
306f517afd5SLaurence Withers 	{ pinmux(19), 8, 1 },
307f517afd5SLaurence Withers 	{ pinmux(19), 8, 0 },
308f517afd5SLaurence Withers 	{ pinmux(18), 8, 7 },
309f517afd5SLaurence Withers 	{ pinmux(18), 8, 6 },
310f517afd5SLaurence Withers 	{ pinmux(18), 8, 5 },
311f517afd5SLaurence Withers 	{ pinmux(18), 8, 4 },
312f517afd5SLaurence Withers 	{ pinmux(18), 8, 3 },
313f517afd5SLaurence Withers 	{ pinmux(18), 8, 2 },
314f517afd5SLaurence Withers };
315*76b40ab4STom Rini #endif /* CONFIG_SOC_DA8XX && !CONFIG_SOC_DA850 */
316*76b40ab4STom Rini #else /* !CONFIG_SOC_DA8XX */
31703414ac4SHolger Hans Peter Freyther #define davinci_configure_pin_mux(a, b)
318*76b40ab4STom Rini #endif /* CONFIG_SOC_DA8XX */
319f517afd5SLaurence Withers 
320365d6070SJoe Hershberger int gpio_request(unsigned gpio, const char *label)
321f517afd5SLaurence Withers {
322365d6070SJoe Hershberger 	if (gpio >= MAX_NUM_GPIOS)
323f517afd5SLaurence Withers 		return -1;
324f517afd5SLaurence Withers 
325365d6070SJoe Hershberger 	if (gpio_registry[gpio].is_registered)
326f517afd5SLaurence Withers 		return -1;
327f517afd5SLaurence Withers 
328365d6070SJoe Hershberger 	gpio_registry[gpio].is_registered = 1;
329365d6070SJoe Hershberger 	strncpy(gpio_registry[gpio].name, label, GPIO_NAME_SIZE);
330365d6070SJoe Hershberger 	gpio_registry[gpio].name[GPIO_NAME_SIZE - 1] = 0;
331f517afd5SLaurence Withers 
332365d6070SJoe Hershberger 	davinci_configure_pin_mux(&gpio_pinmux[gpio], 1);
333f517afd5SLaurence Withers 
334f517afd5SLaurence Withers 	return 0;
335f517afd5SLaurence Withers }
336f517afd5SLaurence Withers 
337365d6070SJoe Hershberger int gpio_free(unsigned gpio)
338f517afd5SLaurence Withers {
339365d6070SJoe Hershberger 	if (gpio >= MAX_NUM_GPIOS)
340365d6070SJoe Hershberger 		return -1;
341365d6070SJoe Hershberger 
342365d6070SJoe Hershberger 	if (!gpio_registry[gpio].is_registered)
343365d6070SJoe Hershberger 		return -1;
344365d6070SJoe Hershberger 
345365d6070SJoe Hershberger 	gpio_registry[gpio].is_registered = 0;
346365d6070SJoe Hershberger 	gpio_registry[gpio].name[0] = '\0';
347365d6070SJoe Hershberger 	/* Do not configure as input or change pin mux here */
348365d6070SJoe Hershberger 	return 0;
349f517afd5SLaurence Withers }
350f517afd5SLaurence Withers 
351365d6070SJoe Hershberger int gpio_direction_input(unsigned gpio)
352f517afd5SLaurence Withers {
353f517afd5SLaurence Withers 	struct davinci_gpio *bank;
354f517afd5SLaurence Withers 
355365d6070SJoe Hershberger 	bank = GPIO_BANK(gpio);
356365d6070SJoe Hershberger 	setbits_le32(&bank->dir, 1U << GPIO_BIT(gpio));
357f517afd5SLaurence Withers 	return 0;
358f517afd5SLaurence Withers }
359f517afd5SLaurence Withers 
360365d6070SJoe Hershberger int gpio_direction_output(unsigned gpio, int value)
361f517afd5SLaurence Withers {
362f517afd5SLaurence Withers 	struct davinci_gpio *bank;
363f517afd5SLaurence Withers 
364365d6070SJoe Hershberger 	bank = GPIO_BANK(gpio);
365365d6070SJoe Hershberger 	clrbits_le32(&bank->dir, 1U << GPIO_BIT(gpio));
366365d6070SJoe Hershberger 	gpio_set_value(gpio, value);
367f517afd5SLaurence Withers 	return 0;
368f517afd5SLaurence Withers }
369f517afd5SLaurence Withers 
370365d6070SJoe Hershberger int gpio_get_value(unsigned gpio)
371f517afd5SLaurence Withers {
372f517afd5SLaurence Withers 	struct davinci_gpio *bank;
373f517afd5SLaurence Withers 	unsigned int ip;
374f517afd5SLaurence Withers 
375365d6070SJoe Hershberger 	bank = GPIO_BANK(gpio);
376365d6070SJoe Hershberger 	ip = in_le32(&bank->in_data) & (1U << GPIO_BIT(gpio));
377f517afd5SLaurence Withers 	return ip ? 1 : 0;
378f517afd5SLaurence Withers }
379f517afd5SLaurence Withers 
380365d6070SJoe Hershberger int gpio_set_value(unsigned gpio, int value)
381f517afd5SLaurence Withers {
382f517afd5SLaurence Withers 	struct davinci_gpio *bank;
383f517afd5SLaurence Withers 
384365d6070SJoe Hershberger 	bank = GPIO_BANK(gpio);
385f517afd5SLaurence Withers 
386f517afd5SLaurence Withers 	if (value)
387365d6070SJoe Hershberger 		bank->set_data = 1U << GPIO_BIT(gpio);
388f517afd5SLaurence Withers 	else
389365d6070SJoe Hershberger 		bank->clr_data = 1U << GPIO_BIT(gpio);
390365d6070SJoe Hershberger 
391365d6070SJoe Hershberger 	return 0;
392f517afd5SLaurence Withers }
393f517afd5SLaurence Withers 
394f517afd5SLaurence Withers void gpio_info(void)
395f517afd5SLaurence Withers {
396365d6070SJoe Hershberger 	unsigned gpio, dir, val;
397f517afd5SLaurence Withers 	struct davinci_gpio *bank;
398f517afd5SLaurence Withers 
399365d6070SJoe Hershberger 	for (gpio = 0; gpio < MAX_NUM_GPIOS; ++gpio) {
400365d6070SJoe Hershberger 		bank = GPIO_BANK(gpio);
401365d6070SJoe Hershberger 		dir = in_le32(&bank->dir) & (1U << GPIO_BIT(gpio));
402365d6070SJoe Hershberger 		val = gpio_get_value(gpio);
403f517afd5SLaurence Withers 
404f517afd5SLaurence Withers 		printf("% 4d: %s: %d [%c] %s\n",
405365d6070SJoe Hershberger 			gpio, dir ? " in" : "out", val,
406365d6070SJoe Hershberger 			gpio_registry[gpio].is_registered ? 'x' : ' ',
407365d6070SJoe Hershberger 			gpio_registry[gpio].name);
408f517afd5SLaurence Withers 	}
409f517afd5SLaurence Withers }
410