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