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 *
7*1a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+
8f517afd5SLaurence Withers */
9f517afd5SLaurence Withers
10f517afd5SLaurence Withers #include <common.h>
11f517afd5SLaurence Withers #include <asm/io.h>
12f517afd5SLaurence Withers #include <asm/gpio.h>
13f517afd5SLaurence Withers #include <asm/arch/hardware.h>
14f517afd5SLaurence Withers #include <asm/arch/davinci_misc.h>
15f517afd5SLaurence Withers
16f517afd5SLaurence Withers static struct gpio_registry {
17f517afd5SLaurence Withers int is_registered;
18f517afd5SLaurence Withers char name[GPIO_NAME_SIZE];
19f517afd5SLaurence Withers } gpio_registry[MAX_NUM_GPIOS];
20f517afd5SLaurence Withers
2103414ac4SHolger Hans Peter Freyther #if defined(CONFIG_SOC_DA8XX)
22f517afd5SLaurence Withers #define pinmux(x) (&davinci_syscfg_regs->pinmux[x])
23f517afd5SLaurence Withers
24b9f56698STomas Novotny #if defined(CONFIG_SOC_DA8XX) && !defined(CONFIG_SOC_DA850)
25b9f56698STomas Novotny static const struct pinmux_config gpio_pinmux[] = {
26b9f56698STomas Novotny { pinmux(13), 8, 6 }, /* GP0[0] */
27b9f56698STomas Novotny { pinmux(13), 8, 7 },
28b9f56698STomas Novotny { pinmux(14), 8, 0 },
29b9f56698STomas Novotny { pinmux(14), 8, 1 },
30b9f56698STomas Novotny { pinmux(14), 8, 2 },
31b9f56698STomas Novotny { pinmux(14), 8, 3 },
32b9f56698STomas Novotny { pinmux(14), 8, 4 },
33b9f56698STomas Novotny { pinmux(14), 8, 5 },
34b9f56698STomas Novotny { pinmux(14), 8, 6 },
35b9f56698STomas Novotny { pinmux(14), 8, 7 },
36b9f56698STomas Novotny { pinmux(15), 8, 0 },
37b9f56698STomas Novotny { pinmux(15), 8, 1 },
38b9f56698STomas Novotny { pinmux(15), 8, 2 },
39b9f56698STomas Novotny { pinmux(15), 8, 3 },
40b9f56698STomas Novotny { pinmux(15), 8, 4 },
41b9f56698STomas Novotny { pinmux(15), 8, 5 },
42b9f56698STomas Novotny { pinmux(15), 8, 6 }, /* GP1[0] */
43b9f56698STomas Novotny { pinmux(15), 8, 7 },
44b9f56698STomas Novotny { pinmux(16), 8, 0 },
45b9f56698STomas Novotny { pinmux(16), 8, 1 },
46b9f56698STomas Novotny { pinmux(16), 8, 2 },
47b9f56698STomas Novotny { pinmux(16), 8, 3 },
48b9f56698STomas Novotny { pinmux(16), 8, 4 },
49b9f56698STomas Novotny { pinmux(16), 8, 5 },
50b9f56698STomas Novotny { pinmux(16), 8, 6 },
51b9f56698STomas Novotny { pinmux(16), 8, 7 },
52b9f56698STomas Novotny { pinmux(17), 8, 0 },
53b9f56698STomas Novotny { pinmux(17), 8, 1 },
54b9f56698STomas Novotny { pinmux(17), 8, 2 },
55b9f56698STomas Novotny { pinmux(17), 8, 3 },
56b9f56698STomas Novotny { pinmux(17), 8, 4 },
57b9f56698STomas Novotny { pinmux(17), 8, 5 },
58b9f56698STomas Novotny { pinmux(17), 8, 6 }, /* GP2[0] */
59b9f56698STomas Novotny { pinmux(17), 8, 7 },
60b9f56698STomas Novotny { pinmux(18), 8, 0 },
61b9f56698STomas Novotny { pinmux(18), 8, 1 },
62b9f56698STomas Novotny { pinmux(18), 8, 2 },
63b9f56698STomas Novotny { pinmux(18), 8, 3 },
64b9f56698STomas Novotny { pinmux(18), 8, 4 },
65b9f56698STomas Novotny { pinmux(18), 8, 5 },
66b9f56698STomas Novotny { pinmux(18), 8, 6 },
67b9f56698STomas Novotny { pinmux(18), 8, 7 },
68b9f56698STomas Novotny { pinmux(19), 8, 0 },
69b9f56698STomas Novotny { pinmux(9), 8, 2 },
70b9f56698STomas Novotny { pinmux(9), 8, 3 },
71b9f56698STomas Novotny { pinmux(9), 8, 4 },
72b9f56698STomas Novotny { pinmux(9), 8, 5 },
73b9f56698STomas Novotny { pinmux(9), 8, 6 },
74b9f56698STomas Novotny { pinmux(10), 8, 1 }, /* GP3[0] */
75b9f56698STomas Novotny { pinmux(10), 8, 2 },
76b9f56698STomas Novotny { pinmux(10), 8, 3 },
77b9f56698STomas Novotny { pinmux(10), 8, 4 },
78b9f56698STomas Novotny { pinmux(10), 8, 5 },
79b9f56698STomas Novotny { pinmux(10), 8, 6 },
80b9f56698STomas Novotny { pinmux(10), 8, 7 },
81b9f56698STomas Novotny { pinmux(11), 8, 0 },
82b9f56698STomas Novotny { pinmux(11), 8, 1 },
83b9f56698STomas Novotny { pinmux(11), 8, 2 },
84b9f56698STomas Novotny { pinmux(11), 8, 3 },
85b9f56698STomas Novotny { pinmux(11), 8, 4 },
86b9f56698STomas Novotny { pinmux(9), 8, 7 },
87b9f56698STomas Novotny { pinmux(2), 8, 6 },
88b9f56698STomas Novotny { pinmux(11), 8, 5 },
89b9f56698STomas Novotny { pinmux(11), 8, 6 },
90b9f56698STomas Novotny { pinmux(12), 8, 4 }, /* GP4[0] */
91b9f56698STomas Novotny { pinmux(12), 8, 5 },
92b9f56698STomas Novotny { pinmux(12), 8, 6 },
93b9f56698STomas Novotny { pinmux(12), 8, 7 },
94b9f56698STomas Novotny { pinmux(13), 8, 0 },
95b9f56698STomas Novotny { pinmux(13), 8, 1 },
96b9f56698STomas Novotny { pinmux(13), 8, 2 },
97b9f56698STomas Novotny { pinmux(13), 8, 3 },
98b9f56698STomas Novotny { pinmux(13), 8, 4 },
99b9f56698STomas Novotny { pinmux(13), 8, 5 },
100b9f56698STomas Novotny { pinmux(11), 8, 7 },
101b9f56698STomas Novotny { pinmux(12), 8, 0 },
102b9f56698STomas Novotny { pinmux(12), 8, 1 },
103b9f56698STomas Novotny { pinmux(12), 8, 2 },
104b9f56698STomas Novotny { pinmux(12), 8, 3 },
105b9f56698STomas Novotny { pinmux(9), 8, 1 },
106b9f56698STomas Novotny { pinmux(7), 8, 3 }, /* GP5[0] */
107b9f56698STomas Novotny { pinmux(7), 8, 4 },
108b9f56698STomas Novotny { pinmux(7), 8, 5 },
109b9f56698STomas Novotny { pinmux(7), 8, 6 },
110b9f56698STomas Novotny { pinmux(7), 8, 7 },
111b9f56698STomas Novotny { pinmux(8), 8, 0 },
112b9f56698STomas Novotny { pinmux(8), 8, 1 },
113b9f56698STomas Novotny { pinmux(8), 8, 2 },
114b9f56698STomas Novotny { pinmux(8), 8, 3 },
115b9f56698STomas Novotny { pinmux(8), 8, 4 },
116b9f56698STomas Novotny { pinmux(8), 8, 5 },
117b9f56698STomas Novotny { pinmux(8), 8, 6 },
118b9f56698STomas Novotny { pinmux(8), 8, 7 },
119b9f56698STomas Novotny { pinmux(9), 8, 0 },
120b9f56698STomas Novotny { pinmux(7), 8, 1 },
121b9f56698STomas Novotny { pinmux(7), 8, 2 },
122b9f56698STomas Novotny { pinmux(5), 8, 1 }, /* GP6[0] */
123b9f56698STomas Novotny { pinmux(5), 8, 2 },
124b9f56698STomas Novotny { pinmux(5), 8, 3 },
125b9f56698STomas Novotny { pinmux(5), 8, 4 },
126b9f56698STomas Novotny { pinmux(5), 8, 5 },
127b9f56698STomas Novotny { pinmux(5), 8, 6 },
128b9f56698STomas Novotny { pinmux(5), 8, 7 },
129b9f56698STomas Novotny { pinmux(6), 8, 0 },
130b9f56698STomas Novotny { pinmux(6), 8, 1 },
131b9f56698STomas Novotny { pinmux(6), 8, 2 },
132b9f56698STomas Novotny { pinmux(6), 8, 3 },
133b9f56698STomas Novotny { pinmux(6), 8, 4 },
134b9f56698STomas Novotny { pinmux(6), 8, 5 },
135b9f56698STomas Novotny { pinmux(6), 8, 6 },
136b9f56698STomas Novotny { pinmux(6), 8, 7 },
137b9f56698STomas Novotny { pinmux(7), 8, 0 },
138b9f56698STomas Novotny { pinmux(1), 8, 0 }, /* GP7[0] */
139b9f56698STomas Novotny { pinmux(1), 8, 1 },
140b9f56698STomas Novotny { pinmux(1), 8, 2 },
141b9f56698STomas Novotny { pinmux(1), 8, 3 },
142b9f56698STomas Novotny { pinmux(1), 8, 4 },
143b9f56698STomas Novotny { pinmux(1), 8, 5 },
144b9f56698STomas Novotny { pinmux(1), 8, 6 },
145b9f56698STomas Novotny { pinmux(1), 8, 7 },
146b9f56698STomas Novotny { pinmux(2), 8, 0 },
147b9f56698STomas Novotny { pinmux(2), 8, 1 },
148b9f56698STomas Novotny { pinmux(2), 8, 2 },
149b9f56698STomas Novotny { pinmux(2), 8, 3 },
150b9f56698STomas Novotny { pinmux(2), 8, 4 },
151b9f56698STomas Novotny { pinmux(2), 8, 5 },
152b9f56698STomas Novotny { pinmux(0), 1, 0 },
153b9f56698STomas Novotny { pinmux(0), 1, 1 },
154b9f56698STomas Novotny };
15576b40ab4STom Rini #else /* CONFIG_SOC_DA8XX && CONFIG_SOC_DA850 */
156f517afd5SLaurence Withers static const struct pinmux_config gpio_pinmux[] = {
157f517afd5SLaurence Withers { pinmux(1), 8, 7 }, /* GP0[0] */
158f517afd5SLaurence Withers { pinmux(1), 8, 6 },
159f517afd5SLaurence Withers { pinmux(1), 8, 5 },
160f517afd5SLaurence Withers { pinmux(1), 8, 4 },
161f517afd5SLaurence Withers { pinmux(1), 8, 3 },
162f517afd5SLaurence Withers { pinmux(1), 8, 2 },
163f517afd5SLaurence Withers { pinmux(1), 8, 1 },
164f517afd5SLaurence Withers { pinmux(1), 8, 0 },
165f517afd5SLaurence Withers { pinmux(0), 8, 7 },
166f517afd5SLaurence Withers { pinmux(0), 8, 6 },
167f517afd5SLaurence Withers { pinmux(0), 8, 5 },
168f517afd5SLaurence Withers { pinmux(0), 8, 4 },
169f517afd5SLaurence Withers { pinmux(0), 8, 3 },
170f517afd5SLaurence Withers { pinmux(0), 8, 2 },
171f517afd5SLaurence Withers { pinmux(0), 8, 1 },
172f517afd5SLaurence Withers { pinmux(0), 8, 0 },
173f517afd5SLaurence Withers { pinmux(4), 8, 7 }, /* GP1[0] */
174f517afd5SLaurence Withers { pinmux(4), 8, 6 },
175f517afd5SLaurence Withers { pinmux(4), 8, 5 },
176f517afd5SLaurence Withers { pinmux(4), 8, 4 },
177f517afd5SLaurence Withers { pinmux(4), 8, 3 },
178f517afd5SLaurence Withers { pinmux(4), 8, 2 },
179f517afd5SLaurence Withers { pinmux(4), 4, 1 },
180f517afd5SLaurence Withers { pinmux(4), 4, 0 },
181f517afd5SLaurence Withers { pinmux(3), 4, 0 },
182f517afd5SLaurence Withers { pinmux(2), 4, 6 },
183f517afd5SLaurence Withers { pinmux(2), 4, 5 },
184f517afd5SLaurence Withers { pinmux(2), 4, 4 },
185f517afd5SLaurence Withers { pinmux(2), 4, 3 },
186f517afd5SLaurence Withers { pinmux(2), 4, 2 },
187f517afd5SLaurence Withers { pinmux(2), 4, 1 },
188f517afd5SLaurence Withers { pinmux(2), 8, 0 },
189f517afd5SLaurence Withers { pinmux(6), 8, 7 }, /* GP2[0] */
190f517afd5SLaurence Withers { pinmux(6), 8, 6 },
191f517afd5SLaurence Withers { pinmux(6), 8, 5 },
192f517afd5SLaurence Withers { pinmux(6), 8, 4 },
193f517afd5SLaurence Withers { pinmux(6), 8, 3 },
194f517afd5SLaurence Withers { pinmux(6), 8, 2 },
195f517afd5SLaurence Withers { pinmux(6), 8, 1 },
196f517afd5SLaurence Withers { pinmux(6), 8, 0 },
197f517afd5SLaurence Withers { pinmux(5), 8, 7 },
198f517afd5SLaurence Withers { pinmux(5), 8, 6 },
199f517afd5SLaurence Withers { pinmux(5), 8, 5 },
200f517afd5SLaurence Withers { pinmux(5), 8, 4 },
201f517afd5SLaurence Withers { pinmux(5), 8, 3 },
202f517afd5SLaurence Withers { pinmux(5), 8, 2 },
203f517afd5SLaurence Withers { pinmux(5), 8, 1 },
204f517afd5SLaurence Withers { pinmux(5), 8, 0 },
205f517afd5SLaurence Withers { pinmux(8), 8, 7 }, /* GP3[0] */
206f517afd5SLaurence Withers { pinmux(8), 8, 6 },
207f517afd5SLaurence Withers { pinmux(8), 8, 5 },
208f517afd5SLaurence Withers { pinmux(8), 8, 4 },
209f517afd5SLaurence Withers { pinmux(8), 8, 3 },
210f517afd5SLaurence Withers { pinmux(8), 8, 2 },
211f517afd5SLaurence Withers { pinmux(8), 8, 1 },
212f517afd5SLaurence Withers { pinmux(8), 8, 0 },
213f517afd5SLaurence Withers { pinmux(7), 8, 7 },
214f517afd5SLaurence Withers { pinmux(7), 8, 6 },
215f517afd5SLaurence Withers { pinmux(7), 8, 5 },
216f517afd5SLaurence Withers { pinmux(7), 8, 4 },
217f517afd5SLaurence Withers { pinmux(7), 8, 3 },
218f517afd5SLaurence Withers { pinmux(7), 8, 2 },
219f517afd5SLaurence Withers { pinmux(7), 8, 1 },
220f517afd5SLaurence Withers { pinmux(7), 8, 0 },
221f517afd5SLaurence Withers { pinmux(10), 8, 7 }, /* GP4[0] */
222f517afd5SLaurence Withers { pinmux(10), 8, 6 },
223f517afd5SLaurence Withers { pinmux(10), 8, 5 },
224f517afd5SLaurence Withers { pinmux(10), 8, 4 },
225f517afd5SLaurence Withers { pinmux(10), 8, 3 },
226f517afd5SLaurence Withers { pinmux(10), 8, 2 },
227f517afd5SLaurence Withers { pinmux(10), 8, 1 },
228f517afd5SLaurence Withers { pinmux(10), 8, 0 },
229f517afd5SLaurence Withers { pinmux(9), 8, 7 },
230f517afd5SLaurence Withers { pinmux(9), 8, 6 },
231f517afd5SLaurence Withers { pinmux(9), 8, 5 },
232f517afd5SLaurence Withers { pinmux(9), 8, 4 },
233f517afd5SLaurence Withers { pinmux(9), 8, 3 },
234f517afd5SLaurence Withers { pinmux(9), 8, 2 },
235f517afd5SLaurence Withers { pinmux(9), 8, 1 },
236f517afd5SLaurence Withers { pinmux(9), 8, 0 },
237f517afd5SLaurence Withers { pinmux(12), 8, 7 }, /* GP5[0] */
238f517afd5SLaurence Withers { pinmux(12), 8, 6 },
239f517afd5SLaurence Withers { pinmux(12), 8, 5 },
240f517afd5SLaurence Withers { pinmux(12), 8, 4 },
241f517afd5SLaurence Withers { pinmux(12), 8, 3 },
242f517afd5SLaurence Withers { pinmux(12), 8, 2 },
243f517afd5SLaurence Withers { pinmux(12), 8, 1 },
244f517afd5SLaurence Withers { pinmux(12), 8, 0 },
245f517afd5SLaurence Withers { pinmux(11), 8, 7 },
246f517afd5SLaurence Withers { pinmux(11), 8, 6 },
247f517afd5SLaurence Withers { pinmux(11), 8, 5 },
248f517afd5SLaurence Withers { pinmux(11), 8, 4 },
249f517afd5SLaurence Withers { pinmux(11), 8, 3 },
250f517afd5SLaurence Withers { pinmux(11), 8, 2 },
251f517afd5SLaurence Withers { pinmux(11), 8, 1 },
252f517afd5SLaurence Withers { pinmux(11), 8, 0 },
253f517afd5SLaurence Withers { pinmux(19), 8, 6 }, /* GP6[0] */
254f517afd5SLaurence Withers { pinmux(19), 8, 5 },
255f517afd5SLaurence Withers { pinmux(19), 8, 4 },
256f517afd5SLaurence Withers { pinmux(19), 8, 3 },
257f517afd5SLaurence Withers { pinmux(19), 8, 2 },
258f517afd5SLaurence Withers { pinmux(16), 8, 1 },
259f517afd5SLaurence Withers { pinmux(14), 8, 1 },
260f517afd5SLaurence Withers { pinmux(14), 8, 0 },
261f517afd5SLaurence Withers { pinmux(13), 8, 7 },
262f517afd5SLaurence Withers { pinmux(13), 8, 6 },
263f517afd5SLaurence Withers { pinmux(13), 8, 5 },
264f517afd5SLaurence Withers { pinmux(13), 8, 4 },
265f517afd5SLaurence Withers { pinmux(13), 8, 3 },
266f517afd5SLaurence Withers { pinmux(13), 8, 2 },
267f517afd5SLaurence Withers { pinmux(13), 8, 1 },
268f517afd5SLaurence Withers { pinmux(13), 8, 0 },
269f517afd5SLaurence Withers { pinmux(18), 8, 1 }, /* GP7[0] */
270f517afd5SLaurence Withers { pinmux(18), 8, 0 },
271f517afd5SLaurence Withers { pinmux(17), 8, 7 },
272f517afd5SLaurence Withers { pinmux(17), 8, 6 },
273f517afd5SLaurence Withers { pinmux(17), 8, 5 },
274f517afd5SLaurence Withers { pinmux(17), 8, 4 },
275f517afd5SLaurence Withers { pinmux(17), 8, 3 },
276f517afd5SLaurence Withers { pinmux(17), 8, 2 },
277f517afd5SLaurence Withers { pinmux(17), 8, 1 },
278f517afd5SLaurence Withers { pinmux(17), 8, 0 },
279f517afd5SLaurence Withers { pinmux(16), 8, 7 },
280f517afd5SLaurence Withers { pinmux(16), 8, 6 },
281f517afd5SLaurence Withers { pinmux(16), 8, 5 },
282f517afd5SLaurence Withers { pinmux(16), 8, 4 },
283f517afd5SLaurence Withers { pinmux(16), 8, 3 },
284f517afd5SLaurence Withers { pinmux(16), 8, 2 },
285f517afd5SLaurence Withers { pinmux(19), 8, 0 }, /* GP8[0] */
286f517afd5SLaurence Withers { pinmux(3), 4, 7 },
287f517afd5SLaurence Withers { pinmux(3), 4, 6 },
288f517afd5SLaurence Withers { pinmux(3), 4, 5 },
289f517afd5SLaurence Withers { pinmux(3), 4, 4 },
290f517afd5SLaurence Withers { pinmux(3), 4, 3 },
291f517afd5SLaurence Withers { pinmux(3), 4, 2 },
292f517afd5SLaurence Withers { pinmux(2), 4, 7 },
293f517afd5SLaurence Withers { pinmux(19), 8, 1 },
294f517afd5SLaurence Withers { pinmux(19), 8, 0 },
295f517afd5SLaurence Withers { pinmux(18), 8, 7 },
296f517afd5SLaurence Withers { pinmux(18), 8, 6 },
297f517afd5SLaurence Withers { pinmux(18), 8, 5 },
298f517afd5SLaurence Withers { pinmux(18), 8, 4 },
299f517afd5SLaurence Withers { pinmux(18), 8, 3 },
300f517afd5SLaurence Withers { pinmux(18), 8, 2 },
301f517afd5SLaurence Withers };
30276b40ab4STom Rini #endif /* CONFIG_SOC_DA8XX && !CONFIG_SOC_DA850 */
30376b40ab4STom Rini #else /* !CONFIG_SOC_DA8XX */
30403414ac4SHolger Hans Peter Freyther #define davinci_configure_pin_mux(a, b)
30576b40ab4STom Rini #endif /* CONFIG_SOC_DA8XX */
306f517afd5SLaurence Withers
gpio_request(unsigned gpio,const char * label)307365d6070SJoe Hershberger int gpio_request(unsigned gpio, const char *label)
308f517afd5SLaurence Withers {
309365d6070SJoe Hershberger if (gpio >= MAX_NUM_GPIOS)
310f517afd5SLaurence Withers return -1;
311f517afd5SLaurence Withers
312365d6070SJoe Hershberger if (gpio_registry[gpio].is_registered)
313f517afd5SLaurence Withers return -1;
314f517afd5SLaurence Withers
315365d6070SJoe Hershberger gpio_registry[gpio].is_registered = 1;
316365d6070SJoe Hershberger strncpy(gpio_registry[gpio].name, label, GPIO_NAME_SIZE);
317365d6070SJoe Hershberger gpio_registry[gpio].name[GPIO_NAME_SIZE - 1] = 0;
318f517afd5SLaurence Withers
319365d6070SJoe Hershberger davinci_configure_pin_mux(&gpio_pinmux[gpio], 1);
320f517afd5SLaurence Withers
321f517afd5SLaurence Withers return 0;
322f517afd5SLaurence Withers }
323f517afd5SLaurence Withers
gpio_free(unsigned gpio)324365d6070SJoe Hershberger int gpio_free(unsigned gpio)
325f517afd5SLaurence Withers {
326365d6070SJoe Hershberger if (gpio >= MAX_NUM_GPIOS)
327365d6070SJoe Hershberger return -1;
328365d6070SJoe Hershberger
329365d6070SJoe Hershberger if (!gpio_registry[gpio].is_registered)
330365d6070SJoe Hershberger return -1;
331365d6070SJoe Hershberger
332365d6070SJoe Hershberger gpio_registry[gpio].is_registered = 0;
333365d6070SJoe Hershberger gpio_registry[gpio].name[0] = '\0';
334365d6070SJoe Hershberger /* Do not configure as input or change pin mux here */
335365d6070SJoe Hershberger return 0;
336f517afd5SLaurence Withers }
337f517afd5SLaurence Withers
gpio_direction_input(unsigned gpio)338365d6070SJoe Hershberger int gpio_direction_input(unsigned gpio)
339f517afd5SLaurence Withers {
340f517afd5SLaurence Withers struct davinci_gpio *bank;
341f517afd5SLaurence Withers
342365d6070SJoe Hershberger bank = GPIO_BANK(gpio);
343365d6070SJoe Hershberger setbits_le32(&bank->dir, 1U << GPIO_BIT(gpio));
344f517afd5SLaurence Withers return 0;
345f517afd5SLaurence Withers }
346f517afd5SLaurence Withers
gpio_direction_output(unsigned gpio,int value)347365d6070SJoe Hershberger int gpio_direction_output(unsigned gpio, int value)
348f517afd5SLaurence Withers {
349f517afd5SLaurence Withers struct davinci_gpio *bank;
350f517afd5SLaurence Withers
351365d6070SJoe Hershberger bank = GPIO_BANK(gpio);
352365d6070SJoe Hershberger clrbits_le32(&bank->dir, 1U << GPIO_BIT(gpio));
353365d6070SJoe Hershberger gpio_set_value(gpio, value);
354f517afd5SLaurence Withers return 0;
355f517afd5SLaurence Withers }
356f517afd5SLaurence Withers
gpio_get_value(unsigned gpio)357365d6070SJoe Hershberger int gpio_get_value(unsigned gpio)
358f517afd5SLaurence Withers {
359f517afd5SLaurence Withers struct davinci_gpio *bank;
360f517afd5SLaurence Withers unsigned int ip;
361f517afd5SLaurence Withers
362365d6070SJoe Hershberger bank = GPIO_BANK(gpio);
363365d6070SJoe Hershberger ip = in_le32(&bank->in_data) & (1U << GPIO_BIT(gpio));
364f517afd5SLaurence Withers return ip ? 1 : 0;
365f517afd5SLaurence Withers }
366f517afd5SLaurence Withers
gpio_set_value(unsigned gpio,int value)367365d6070SJoe Hershberger int gpio_set_value(unsigned gpio, int value)
368f517afd5SLaurence Withers {
369f517afd5SLaurence Withers struct davinci_gpio *bank;
370f517afd5SLaurence Withers
371365d6070SJoe Hershberger bank = GPIO_BANK(gpio);
372f517afd5SLaurence Withers
373f517afd5SLaurence Withers if (value)
374365d6070SJoe Hershberger bank->set_data = 1U << GPIO_BIT(gpio);
375f517afd5SLaurence Withers else
376365d6070SJoe Hershberger bank->clr_data = 1U << GPIO_BIT(gpio);
377365d6070SJoe Hershberger
378365d6070SJoe Hershberger return 0;
379f517afd5SLaurence Withers }
380f517afd5SLaurence Withers
gpio_info(void)381f517afd5SLaurence Withers void gpio_info(void)
382f517afd5SLaurence Withers {
383365d6070SJoe Hershberger unsigned gpio, dir, val;
384f517afd5SLaurence Withers struct davinci_gpio *bank;
385f517afd5SLaurence Withers
386365d6070SJoe Hershberger for (gpio = 0; gpio < MAX_NUM_GPIOS; ++gpio) {
387365d6070SJoe Hershberger bank = GPIO_BANK(gpio);
388365d6070SJoe Hershberger dir = in_le32(&bank->dir) & (1U << GPIO_BIT(gpio));
389365d6070SJoe Hershberger val = gpio_get_value(gpio);
390f517afd5SLaurence Withers
391f517afd5SLaurence Withers printf("% 4d: %s: %d [%c] %s\n",
392365d6070SJoe Hershberger gpio, dir ? " in" : "out", val,
393365d6070SJoe Hershberger gpio_registry[gpio].is_registered ? 'x' : ' ',
394365d6070SJoe Hershberger gpio_registry[gpio].name);
395f517afd5SLaurence Withers }
396f517afd5SLaurence Withers }
397