Deleted Added
full compact
ti_gpio.c (273799) ti_gpio.c (274670)
1/*-
2 * Copyright (c) 2011
3 * Ben Gray <ben.r.gray@gmail.com>.
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 *
15 * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25 * SUCH DAMAGE.
26 */
27
28/**
29 * Very simple GPIO (general purpose IO) driver module for TI OMAP SoC's.
30 *
31 * Currently this driver only does the basics, get a value on a pin & set a
32 * value on a pin. Hopefully over time I'll expand this to be a bit more generic
33 * and support interrupts and other various bits on the SoC can do ... in the
34 * meantime this is all you get.
35 *
36 * Beware the OMA datasheet(s) lists GPIO banks 1-6, whereas I've used 0-5 here
37 * in the code.
38 *
39 *
40 */
41
42#include <sys/cdefs.h>
1/*-
2 * Copyright (c) 2011
3 * Ben Gray <ben.r.gray@gmail.com>.
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 *
15 * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25 * SUCH DAMAGE.
26 */
27
28/**
29 * Very simple GPIO (general purpose IO) driver module for TI OMAP SoC's.
30 *
31 * Currently this driver only does the basics, get a value on a pin & set a
32 * value on a pin. Hopefully over time I'll expand this to be a bit more generic
33 * and support interrupts and other various bits on the SoC can do ... in the
34 * meantime this is all you get.
35 *
36 * Beware the OMA datasheet(s) lists GPIO banks 1-6, whereas I've used 0-5 here
37 * in the code.
38 *
39 *
40 */
41
42#include <sys/cdefs.h>
43__FBSDID("$FreeBSD: head/sys/arm/ti/ti_gpio.c 273799 2014-10-28 18:33:59Z loos $");
43__FBSDID("$FreeBSD: head/sys/arm/ti/ti_gpio.c 274670 2014-11-18 17:22:08Z loos $");
44
45#include <sys/param.h>
46#include <sys/systm.h>
47#include <sys/bus.h>
48
49#include <sys/kernel.h>
50#include <sys/module.h>
51#include <sys/rman.h>
52#include <sys/lock.h>
53#include <sys/mutex.h>
54#include <sys/gpio.h>
55
56#include <machine/bus.h>
57#include <machine/resource.h>
58
59#include <arm/ti/ti_cpuid.h>
60#include <arm/ti/ti_gpio.h>
61#include <arm/ti/ti_scm.h>
62#include <arm/ti/ti_prcm.h>
63
64#include <dev/fdt/fdt_common.h>
65#include <dev/ofw/openfirm.h>
66#include <dev/ofw/ofw_bus.h>
67#include <dev/ofw/ofw_bus_subr.h>
68
69#include "gpio_if.h"
70#include "ti_gpio_if.h"
71
72/* Register definitions */
73#define TI_GPIO_REVISION 0x0000
74#define TI_GPIO_SYSCONFIG 0x0010
75#if defined(SOC_OMAP4) || defined(SOC_TI_AM335X)
76#define TI_GPIO_IRQSTATUS_RAW_0 0x0024
77#define TI_GPIO_IRQSTATUS_RAW_1 0x0028
78#define TI_GPIO_IRQSTATUS_0 0x002C
79#define TI_GPIO_IRQSTATUS_1 0x0030
80#define TI_GPIO_IRQSTATUS_SET_0 0x0034
81#define TI_GPIO_IRQSTATUS_SET_1 0x0038
82#define TI_GPIO_IRQSTATUS_CLR_0 0x003C
83#define TI_GPIO_IRQSTATUS_CLR_1 0x0040
84#define TI_GPIO_IRQWAKEN_0 0x0044
85#define TI_GPIO_IRQWAKEN_1 0x0048
86#define TI_GPIO_SYSSTATUS 0x0114
87#define TI_GPIO_IRQSTATUS1 0x0118
88#define TI_GPIO_IRQENABLE1 0x011C
89#define TI_GPIO_WAKEUPENABLE 0x0120
90#define TI_GPIO_IRQSTATUS2 0x0128
91#define TI_GPIO_IRQENABLE2 0x012C
92#define TI_GPIO_CTRL 0x0130
93#define TI_GPIO_OE 0x0134
94#define TI_GPIO_DATAIN 0x0138
95#define TI_GPIO_DATAOUT 0x013C
96#define TI_GPIO_LEVELDETECT0 0x0140
97#define TI_GPIO_LEVELDETECT1 0x0144
98#define TI_GPIO_RISINGDETECT 0x0148
99#define TI_GPIO_FALLINGDETECT 0x014C
100#define TI_GPIO_DEBOUNCENABLE 0x0150
101#define TI_GPIO_DEBOUNCINGTIME 0x0154
102#define TI_GPIO_CLEARWKUPENA 0x0180
103#define TI_GPIO_SETWKUENA 0x0184
104#define TI_GPIO_CLEARDATAOUT 0x0190
105#define TI_GPIO_SETDATAOUT 0x0194
106#else
107#error "Unknown SoC"
108#endif
109
110/* Other SoC Specific definitions */
111#define OMAP4_MAX_GPIO_BANKS 6
112#define OMAP4_FIRST_GPIO_BANK 1
113#define OMAP4_INTR_PER_BANK 1
114#define OMAP4_GPIO_REV 0x50600801
115#define AM335X_MAX_GPIO_BANKS 4
116#define AM335X_FIRST_GPIO_BANK 0
117#define AM335X_INTR_PER_BANK 2
118#define AM335X_GPIO_REV 0x50600801
119#define PINS_PER_BANK 32
120
121static u_int
122ti_max_gpio_banks(void)
123{
124 switch(ti_chip()) {
125#ifdef SOC_OMAP4
126 case CHIP_OMAP_4:
127 return (OMAP4_MAX_GPIO_BANKS);
128#endif
129#ifdef SOC_TI_AM335X
130 case CHIP_AM335X:
131 return (AM335X_MAX_GPIO_BANKS);
132#endif
133 }
134 return (0);
135}
136
137static u_int
138ti_max_gpio_intrs(void)
139{
140 switch(ti_chip()) {
141#ifdef SOC_OMAP4
142 case CHIP_OMAP_4:
143 return (OMAP4_MAX_GPIO_BANKS * OMAP4_INTR_PER_BANK);
144#endif
145#ifdef SOC_TI_AM335X
146 case CHIP_AM335X:
147 return (AM335X_MAX_GPIO_BANKS * AM335X_INTR_PER_BANK);
148#endif
149 }
150 return (0);
151}
152
153static u_int
154ti_first_gpio_bank(void)
155{
156 switch(ti_chip()) {
157#ifdef SOC_OMAP4
158 case CHIP_OMAP_4:
159 return (OMAP4_FIRST_GPIO_BANK);
160#endif
161#ifdef SOC_TI_AM335X
162 case CHIP_AM335X:
163 return (AM335X_FIRST_GPIO_BANK);
164#endif
165 }
166 return (0);
167}
168
169static uint32_t
170ti_gpio_rev(void)
171{
172 switch(ti_chip()) {
173#ifdef SOC_OMAP4
174 case CHIP_OMAP_4:
175 return (OMAP4_GPIO_REV);
176#endif
177#ifdef SOC_TI_AM335X
178 case CHIP_AM335X:
179 return (AM335X_GPIO_REV);
180#endif
181 }
182 return (0);
183}
184
185/**
186 * ti_gpio_mem_spec - Resource specification used when allocating resources
187 * ti_gpio_irq_spec - Resource specification used when allocating resources
188 *
189 * This driver module can have up to six independent memory regions, each
190 * region typically controls 32 GPIO pins.
191 *
192 * On OMAP3 and OMAP4 there is only one physical interrupt line per bank,
193 * but there are two set of registers which control the interrupt delivery
194 * to internal subsystems. The first set of registers control the
195 * interrupts delivery to the MPU and the second set control the
196 * interrupts delivery to the DSP.
197 *
198 * On AM335x there are two physical interrupt lines for each GPIO module.
199 * Each interrupt line is controlled by a set of registers.
200 */
201static struct resource_spec ti_gpio_mem_spec[] = {
202 { SYS_RES_MEMORY, 0, RF_ACTIVE },
203 { SYS_RES_MEMORY, 1, RF_ACTIVE | RF_OPTIONAL },
204 { SYS_RES_MEMORY, 2, RF_ACTIVE | RF_OPTIONAL },
205 { SYS_RES_MEMORY, 3, RF_ACTIVE | RF_OPTIONAL },
206#if !defined(SOC_TI_AM335X)
207 { SYS_RES_MEMORY, 4, RF_ACTIVE | RF_OPTIONAL },
208 { SYS_RES_MEMORY, 5, RF_ACTIVE | RF_OPTIONAL },
209#endif
210 { -1, 0, 0 }
211};
212static struct resource_spec ti_gpio_irq_spec[] = {
213 { SYS_RES_IRQ, 0, RF_ACTIVE },
214 { SYS_RES_IRQ, 1, RF_ACTIVE | RF_OPTIONAL },
215 { SYS_RES_IRQ, 2, RF_ACTIVE | RF_OPTIONAL },
216 { SYS_RES_IRQ, 3, RF_ACTIVE | RF_OPTIONAL },
217 { SYS_RES_IRQ, 4, RF_ACTIVE | RF_OPTIONAL },
218 { SYS_RES_IRQ, 5, RF_ACTIVE | RF_OPTIONAL },
219#if defined(SOC_TI_AM335X)
220 { SYS_RES_IRQ, 6, RF_ACTIVE | RF_OPTIONAL },
221 { SYS_RES_IRQ, 7, RF_ACTIVE | RF_OPTIONAL },
222#endif
223 { -1, 0, 0 }
224};
225
226/**
227 * Macros for driver mutex locking
228 */
229#define TI_GPIO_LOCK(_sc) mtx_lock(&(_sc)->sc_mtx)
230#define TI_GPIO_UNLOCK(_sc) mtx_unlock(&(_sc)->sc_mtx)
231#define TI_GPIO_LOCK_INIT(_sc) \
232 mtx_init(&_sc->sc_mtx, device_get_nameunit(_sc->sc_dev), \
233 "ti_gpio", MTX_DEF)
234#define TI_GPIO_LOCK_DESTROY(_sc) mtx_destroy(&_sc->sc_mtx)
235#define TI_GPIO_ASSERT_LOCKED(_sc) mtx_assert(&_sc->sc_mtx, MA_OWNED)
236#define TI_GPIO_ASSERT_UNLOCKED(_sc) mtx_assert(&_sc->sc_mtx, MA_NOTOWNED)
237
238/**
239 * ti_gpio_read_4 - reads a 16-bit value from one of the PADCONFS registers
240 * @sc: GPIO device context
241 * @bank: The bank to read from
242 * @off: The offset of a register from the GPIO register address range
243 *
244 *
245 * RETURNS:
246 * 32-bit value read from the register.
247 */
248static inline uint32_t
249ti_gpio_read_4(struct ti_gpio_softc *sc, unsigned int bank, bus_size_t off)
250{
251 return (bus_read_4(sc->sc_mem_res[bank], off));
252}
253
254/**
255 * ti_gpio_write_4 - writes a 32-bit value to one of the PADCONFS registers
256 * @sc: GPIO device context
257 * @bank: The bank to write to
258 * @off: The offset of a register from the GPIO register address range
259 * @val: The value to write into the register
260 *
261 * RETURNS:
262 * nothing
263 */
264static inline void
265ti_gpio_write_4(struct ti_gpio_softc *sc, unsigned int bank, bus_size_t off,
266 uint32_t val)
267{
268 bus_write_4(sc->sc_mem_res[bank], off, val);
269}
270
271static inline void
272ti_gpio_intr_clr(struct ti_gpio_softc *sc, unsigned int bank, uint32_t mask)
273{
274
275 /* We clear both set of registers. */
276#if defined(SOC_OMAP4) || defined(SOC_TI_AM335X)
277 ti_gpio_write_4(sc, bank, TI_GPIO_IRQSTATUS_CLR_0, mask);
278 ti_gpio_write_4(sc, bank, TI_GPIO_IRQSTATUS_CLR_1, mask);
279#else
280 ti_gpio_write_4(sc, bank, TI_GPIO_CLEARIRQENABLE1, mask);
281 ti_gpio_write_4(sc, bank, TI_GPIO_CLEARIRQENABLE2, mask);
282#endif
283}
284
285/**
286 * ti_gpio_pin_max - Returns the maximum number of GPIO pins
287 * @dev: gpio device handle
288 * @maxpin: pointer to a value that upon return will contain the maximum number
289 * of pins in the device.
290 *
291 *
292 * LOCKING:
293 * Internally locks the context
294 *
295 * RETURNS:
296 * Returns 0 on success otherwise an error code
297 */
298static int
299ti_gpio_pin_max(device_t dev, int *maxpin)
300{
301 struct ti_gpio_softc *sc = device_get_softc(dev);
302 unsigned int i;
303 unsigned int banks = 0;
304
305 TI_GPIO_LOCK(sc);
306
307 /* Calculate how many valid banks we have and then multiply that by 32 to
308 * give use the total number of pins.
309 */
310 for (i = 0; i < ti_max_gpio_banks(); i++) {
311 if (sc->sc_mem_res[i] != NULL)
312 banks++;
313 }
314
315 *maxpin = (banks * PINS_PER_BANK) - 1;
316
317 TI_GPIO_UNLOCK(sc);
318
319 return (0);
320}
321
322/**
323 * ti_gpio_pin_getcaps - Gets the capabilties of a given pin
324 * @dev: gpio device handle
325 * @pin: the number of the pin
326 * @caps: pointer to a value that upon return will contain the capabilities
327 *
328 * Currently all pins have the same capability, notably:
329 * - GPIO_PIN_INPUT
330 * - GPIO_PIN_OUTPUT
331 * - GPIO_PIN_PULLUP
332 * - GPIO_PIN_PULLDOWN
333 *
334 * LOCKING:
335 * Internally locks the context
336 *
337 * RETURNS:
338 * Returns 0 on success otherwise an error code
339 */
340static int
341ti_gpio_pin_getcaps(device_t dev, uint32_t pin, uint32_t *caps)
342{
343 struct ti_gpio_softc *sc = device_get_softc(dev);
344 uint32_t bank = (pin / PINS_PER_BANK);
345
346 TI_GPIO_LOCK(sc);
347
348 /* Sanity check the pin number is valid */
349 if ((bank >= ti_max_gpio_banks()) || (sc->sc_mem_res[bank] == NULL)) {
350 TI_GPIO_UNLOCK(sc);
351 return (EINVAL);
352 }
353
354 *caps = (GPIO_PIN_INPUT | GPIO_PIN_OUTPUT |GPIO_PIN_PULLUP |
355 GPIO_PIN_PULLDOWN);
356
357 TI_GPIO_UNLOCK(sc);
358
359 return (0);
360}
361
362/**
363 * ti_gpio_pin_getflags - Gets the current flags of a given pin
364 * @dev: gpio device handle
365 * @pin: the number of the pin
366 * @flags: upon return will contain the current flags of the pin
367 *
368 * Reads the current flags of a given pin, here we actually read the H/W
369 * registers to determine the flags, rather than storing the value in the
370 * setflags call.
371 *
372 * LOCKING:
373 * Internally locks the context
374 *
375 * RETURNS:
376 * Returns 0 on success otherwise an error code
377 */
378static int
379ti_gpio_pin_getflags(device_t dev, uint32_t pin, uint32_t *flags)
380{
381 struct ti_gpio_softc *sc = device_get_softc(dev);
382 uint32_t bank = (pin / PINS_PER_BANK);
383
384 TI_GPIO_LOCK(sc);
385
386 /* Sanity check the pin number is valid */
387 if ((bank >= ti_max_gpio_banks()) || (sc->sc_mem_res[bank] == NULL)) {
388 TI_GPIO_UNLOCK(sc);
389 return (EINVAL);
390 }
391
392 /* Get the current pin state */
393 TI_GPIO_GET_FLAGS(dev, pin, flags);
394
395 TI_GPIO_UNLOCK(sc);
396
397 return (0);
398}
399
400/**
401 * ti_gpio_pin_getname - Gets the name of a given pin
402 * @dev: gpio device handle
403 * @pin: the number of the pin
404 * @name: buffer to put the name in
405 *
406 * The driver simply calls the pins gpio_n, where 'n' is obviously the number
407 * of the pin.
408 *
409 * LOCKING:
410 * Internally locks the context
411 *
412 * RETURNS:
413 * Returns 0 on success otherwise an error code
414 */
415static int
416ti_gpio_pin_getname(device_t dev, uint32_t pin, char *name)
417{
418 struct ti_gpio_softc *sc = device_get_softc(dev);
419 uint32_t bank = (pin / PINS_PER_BANK);
420
421 TI_GPIO_LOCK(sc);
422
423 /* Sanity check the pin number is valid */
424 if ((bank >= ti_max_gpio_banks()) || (sc->sc_mem_res[bank] == NULL)) {
425 TI_GPIO_UNLOCK(sc);
426 return (EINVAL);
427 }
428
429 /* Set a very simple name */
430 snprintf(name, GPIOMAXNAME, "gpio_%u", pin);
431 name[GPIOMAXNAME - 1] = '\0';
432
433 TI_GPIO_UNLOCK(sc);
434
435 return (0);
436}
437
438/**
439 * ti_gpio_pin_setflags - Sets the flags for a given pin
440 * @dev: gpio device handle
441 * @pin: the number of the pin
442 * @flags: the flags to set
443 *
444 * The flags of the pin correspond to things like input/output mode, pull-ups,
445 * pull-downs, etc. This driver doesn't support all flags, only the following:
446 * - GPIO_PIN_INPUT
447 * - GPIO_PIN_OUTPUT
448 * - GPIO_PIN_PULLUP
449 * - GPIO_PIN_PULLDOWN
450 *
451 * LOCKING:
452 * Internally locks the context
453 *
454 * RETURNS:
455 * Returns 0 on success otherwise an error code
456 */
457static int
458ti_gpio_pin_setflags(device_t dev, uint32_t pin, uint32_t flags)
459{
460 struct ti_gpio_softc *sc = device_get_softc(dev);
461 uint32_t bank = (pin / PINS_PER_BANK);
462 uint32_t mask = (1UL << (pin % PINS_PER_BANK));
463 uint32_t reg_val;
464
44
45#include <sys/param.h>
46#include <sys/systm.h>
47#include <sys/bus.h>
48
49#include <sys/kernel.h>
50#include <sys/module.h>
51#include <sys/rman.h>
52#include <sys/lock.h>
53#include <sys/mutex.h>
54#include <sys/gpio.h>
55
56#include <machine/bus.h>
57#include <machine/resource.h>
58
59#include <arm/ti/ti_cpuid.h>
60#include <arm/ti/ti_gpio.h>
61#include <arm/ti/ti_scm.h>
62#include <arm/ti/ti_prcm.h>
63
64#include <dev/fdt/fdt_common.h>
65#include <dev/ofw/openfirm.h>
66#include <dev/ofw/ofw_bus.h>
67#include <dev/ofw/ofw_bus_subr.h>
68
69#include "gpio_if.h"
70#include "ti_gpio_if.h"
71
72/* Register definitions */
73#define TI_GPIO_REVISION 0x0000
74#define TI_GPIO_SYSCONFIG 0x0010
75#if defined(SOC_OMAP4) || defined(SOC_TI_AM335X)
76#define TI_GPIO_IRQSTATUS_RAW_0 0x0024
77#define TI_GPIO_IRQSTATUS_RAW_1 0x0028
78#define TI_GPIO_IRQSTATUS_0 0x002C
79#define TI_GPIO_IRQSTATUS_1 0x0030
80#define TI_GPIO_IRQSTATUS_SET_0 0x0034
81#define TI_GPIO_IRQSTATUS_SET_1 0x0038
82#define TI_GPIO_IRQSTATUS_CLR_0 0x003C
83#define TI_GPIO_IRQSTATUS_CLR_1 0x0040
84#define TI_GPIO_IRQWAKEN_0 0x0044
85#define TI_GPIO_IRQWAKEN_1 0x0048
86#define TI_GPIO_SYSSTATUS 0x0114
87#define TI_GPIO_IRQSTATUS1 0x0118
88#define TI_GPIO_IRQENABLE1 0x011C
89#define TI_GPIO_WAKEUPENABLE 0x0120
90#define TI_GPIO_IRQSTATUS2 0x0128
91#define TI_GPIO_IRQENABLE2 0x012C
92#define TI_GPIO_CTRL 0x0130
93#define TI_GPIO_OE 0x0134
94#define TI_GPIO_DATAIN 0x0138
95#define TI_GPIO_DATAOUT 0x013C
96#define TI_GPIO_LEVELDETECT0 0x0140
97#define TI_GPIO_LEVELDETECT1 0x0144
98#define TI_GPIO_RISINGDETECT 0x0148
99#define TI_GPIO_FALLINGDETECT 0x014C
100#define TI_GPIO_DEBOUNCENABLE 0x0150
101#define TI_GPIO_DEBOUNCINGTIME 0x0154
102#define TI_GPIO_CLEARWKUPENA 0x0180
103#define TI_GPIO_SETWKUENA 0x0184
104#define TI_GPIO_CLEARDATAOUT 0x0190
105#define TI_GPIO_SETDATAOUT 0x0194
106#else
107#error "Unknown SoC"
108#endif
109
110/* Other SoC Specific definitions */
111#define OMAP4_MAX_GPIO_BANKS 6
112#define OMAP4_FIRST_GPIO_BANK 1
113#define OMAP4_INTR_PER_BANK 1
114#define OMAP4_GPIO_REV 0x50600801
115#define AM335X_MAX_GPIO_BANKS 4
116#define AM335X_FIRST_GPIO_BANK 0
117#define AM335X_INTR_PER_BANK 2
118#define AM335X_GPIO_REV 0x50600801
119#define PINS_PER_BANK 32
120
121static u_int
122ti_max_gpio_banks(void)
123{
124 switch(ti_chip()) {
125#ifdef SOC_OMAP4
126 case CHIP_OMAP_4:
127 return (OMAP4_MAX_GPIO_BANKS);
128#endif
129#ifdef SOC_TI_AM335X
130 case CHIP_AM335X:
131 return (AM335X_MAX_GPIO_BANKS);
132#endif
133 }
134 return (0);
135}
136
137static u_int
138ti_max_gpio_intrs(void)
139{
140 switch(ti_chip()) {
141#ifdef SOC_OMAP4
142 case CHIP_OMAP_4:
143 return (OMAP4_MAX_GPIO_BANKS * OMAP4_INTR_PER_BANK);
144#endif
145#ifdef SOC_TI_AM335X
146 case CHIP_AM335X:
147 return (AM335X_MAX_GPIO_BANKS * AM335X_INTR_PER_BANK);
148#endif
149 }
150 return (0);
151}
152
153static u_int
154ti_first_gpio_bank(void)
155{
156 switch(ti_chip()) {
157#ifdef SOC_OMAP4
158 case CHIP_OMAP_4:
159 return (OMAP4_FIRST_GPIO_BANK);
160#endif
161#ifdef SOC_TI_AM335X
162 case CHIP_AM335X:
163 return (AM335X_FIRST_GPIO_BANK);
164#endif
165 }
166 return (0);
167}
168
169static uint32_t
170ti_gpio_rev(void)
171{
172 switch(ti_chip()) {
173#ifdef SOC_OMAP4
174 case CHIP_OMAP_4:
175 return (OMAP4_GPIO_REV);
176#endif
177#ifdef SOC_TI_AM335X
178 case CHIP_AM335X:
179 return (AM335X_GPIO_REV);
180#endif
181 }
182 return (0);
183}
184
185/**
186 * ti_gpio_mem_spec - Resource specification used when allocating resources
187 * ti_gpio_irq_spec - Resource specification used when allocating resources
188 *
189 * This driver module can have up to six independent memory regions, each
190 * region typically controls 32 GPIO pins.
191 *
192 * On OMAP3 and OMAP4 there is only one physical interrupt line per bank,
193 * but there are two set of registers which control the interrupt delivery
194 * to internal subsystems. The first set of registers control the
195 * interrupts delivery to the MPU and the second set control the
196 * interrupts delivery to the DSP.
197 *
198 * On AM335x there are two physical interrupt lines for each GPIO module.
199 * Each interrupt line is controlled by a set of registers.
200 */
201static struct resource_spec ti_gpio_mem_spec[] = {
202 { SYS_RES_MEMORY, 0, RF_ACTIVE },
203 { SYS_RES_MEMORY, 1, RF_ACTIVE | RF_OPTIONAL },
204 { SYS_RES_MEMORY, 2, RF_ACTIVE | RF_OPTIONAL },
205 { SYS_RES_MEMORY, 3, RF_ACTIVE | RF_OPTIONAL },
206#if !defined(SOC_TI_AM335X)
207 { SYS_RES_MEMORY, 4, RF_ACTIVE | RF_OPTIONAL },
208 { SYS_RES_MEMORY, 5, RF_ACTIVE | RF_OPTIONAL },
209#endif
210 { -1, 0, 0 }
211};
212static struct resource_spec ti_gpio_irq_spec[] = {
213 { SYS_RES_IRQ, 0, RF_ACTIVE },
214 { SYS_RES_IRQ, 1, RF_ACTIVE | RF_OPTIONAL },
215 { SYS_RES_IRQ, 2, RF_ACTIVE | RF_OPTIONAL },
216 { SYS_RES_IRQ, 3, RF_ACTIVE | RF_OPTIONAL },
217 { SYS_RES_IRQ, 4, RF_ACTIVE | RF_OPTIONAL },
218 { SYS_RES_IRQ, 5, RF_ACTIVE | RF_OPTIONAL },
219#if defined(SOC_TI_AM335X)
220 { SYS_RES_IRQ, 6, RF_ACTIVE | RF_OPTIONAL },
221 { SYS_RES_IRQ, 7, RF_ACTIVE | RF_OPTIONAL },
222#endif
223 { -1, 0, 0 }
224};
225
226/**
227 * Macros for driver mutex locking
228 */
229#define TI_GPIO_LOCK(_sc) mtx_lock(&(_sc)->sc_mtx)
230#define TI_GPIO_UNLOCK(_sc) mtx_unlock(&(_sc)->sc_mtx)
231#define TI_GPIO_LOCK_INIT(_sc) \
232 mtx_init(&_sc->sc_mtx, device_get_nameunit(_sc->sc_dev), \
233 "ti_gpio", MTX_DEF)
234#define TI_GPIO_LOCK_DESTROY(_sc) mtx_destroy(&_sc->sc_mtx)
235#define TI_GPIO_ASSERT_LOCKED(_sc) mtx_assert(&_sc->sc_mtx, MA_OWNED)
236#define TI_GPIO_ASSERT_UNLOCKED(_sc) mtx_assert(&_sc->sc_mtx, MA_NOTOWNED)
237
238/**
239 * ti_gpio_read_4 - reads a 16-bit value from one of the PADCONFS registers
240 * @sc: GPIO device context
241 * @bank: The bank to read from
242 * @off: The offset of a register from the GPIO register address range
243 *
244 *
245 * RETURNS:
246 * 32-bit value read from the register.
247 */
248static inline uint32_t
249ti_gpio_read_4(struct ti_gpio_softc *sc, unsigned int bank, bus_size_t off)
250{
251 return (bus_read_4(sc->sc_mem_res[bank], off));
252}
253
254/**
255 * ti_gpio_write_4 - writes a 32-bit value to one of the PADCONFS registers
256 * @sc: GPIO device context
257 * @bank: The bank to write to
258 * @off: The offset of a register from the GPIO register address range
259 * @val: The value to write into the register
260 *
261 * RETURNS:
262 * nothing
263 */
264static inline void
265ti_gpio_write_4(struct ti_gpio_softc *sc, unsigned int bank, bus_size_t off,
266 uint32_t val)
267{
268 bus_write_4(sc->sc_mem_res[bank], off, val);
269}
270
271static inline void
272ti_gpio_intr_clr(struct ti_gpio_softc *sc, unsigned int bank, uint32_t mask)
273{
274
275 /* We clear both set of registers. */
276#if defined(SOC_OMAP4) || defined(SOC_TI_AM335X)
277 ti_gpio_write_4(sc, bank, TI_GPIO_IRQSTATUS_CLR_0, mask);
278 ti_gpio_write_4(sc, bank, TI_GPIO_IRQSTATUS_CLR_1, mask);
279#else
280 ti_gpio_write_4(sc, bank, TI_GPIO_CLEARIRQENABLE1, mask);
281 ti_gpio_write_4(sc, bank, TI_GPIO_CLEARIRQENABLE2, mask);
282#endif
283}
284
285/**
286 * ti_gpio_pin_max - Returns the maximum number of GPIO pins
287 * @dev: gpio device handle
288 * @maxpin: pointer to a value that upon return will contain the maximum number
289 * of pins in the device.
290 *
291 *
292 * LOCKING:
293 * Internally locks the context
294 *
295 * RETURNS:
296 * Returns 0 on success otherwise an error code
297 */
298static int
299ti_gpio_pin_max(device_t dev, int *maxpin)
300{
301 struct ti_gpio_softc *sc = device_get_softc(dev);
302 unsigned int i;
303 unsigned int banks = 0;
304
305 TI_GPIO_LOCK(sc);
306
307 /* Calculate how many valid banks we have and then multiply that by 32 to
308 * give use the total number of pins.
309 */
310 for (i = 0; i < ti_max_gpio_banks(); i++) {
311 if (sc->sc_mem_res[i] != NULL)
312 banks++;
313 }
314
315 *maxpin = (banks * PINS_PER_BANK) - 1;
316
317 TI_GPIO_UNLOCK(sc);
318
319 return (0);
320}
321
322/**
323 * ti_gpio_pin_getcaps - Gets the capabilties of a given pin
324 * @dev: gpio device handle
325 * @pin: the number of the pin
326 * @caps: pointer to a value that upon return will contain the capabilities
327 *
328 * Currently all pins have the same capability, notably:
329 * - GPIO_PIN_INPUT
330 * - GPIO_PIN_OUTPUT
331 * - GPIO_PIN_PULLUP
332 * - GPIO_PIN_PULLDOWN
333 *
334 * LOCKING:
335 * Internally locks the context
336 *
337 * RETURNS:
338 * Returns 0 on success otherwise an error code
339 */
340static int
341ti_gpio_pin_getcaps(device_t dev, uint32_t pin, uint32_t *caps)
342{
343 struct ti_gpio_softc *sc = device_get_softc(dev);
344 uint32_t bank = (pin / PINS_PER_BANK);
345
346 TI_GPIO_LOCK(sc);
347
348 /* Sanity check the pin number is valid */
349 if ((bank >= ti_max_gpio_banks()) || (sc->sc_mem_res[bank] == NULL)) {
350 TI_GPIO_UNLOCK(sc);
351 return (EINVAL);
352 }
353
354 *caps = (GPIO_PIN_INPUT | GPIO_PIN_OUTPUT |GPIO_PIN_PULLUP |
355 GPIO_PIN_PULLDOWN);
356
357 TI_GPIO_UNLOCK(sc);
358
359 return (0);
360}
361
362/**
363 * ti_gpio_pin_getflags - Gets the current flags of a given pin
364 * @dev: gpio device handle
365 * @pin: the number of the pin
366 * @flags: upon return will contain the current flags of the pin
367 *
368 * Reads the current flags of a given pin, here we actually read the H/W
369 * registers to determine the flags, rather than storing the value in the
370 * setflags call.
371 *
372 * LOCKING:
373 * Internally locks the context
374 *
375 * RETURNS:
376 * Returns 0 on success otherwise an error code
377 */
378static int
379ti_gpio_pin_getflags(device_t dev, uint32_t pin, uint32_t *flags)
380{
381 struct ti_gpio_softc *sc = device_get_softc(dev);
382 uint32_t bank = (pin / PINS_PER_BANK);
383
384 TI_GPIO_LOCK(sc);
385
386 /* Sanity check the pin number is valid */
387 if ((bank >= ti_max_gpio_banks()) || (sc->sc_mem_res[bank] == NULL)) {
388 TI_GPIO_UNLOCK(sc);
389 return (EINVAL);
390 }
391
392 /* Get the current pin state */
393 TI_GPIO_GET_FLAGS(dev, pin, flags);
394
395 TI_GPIO_UNLOCK(sc);
396
397 return (0);
398}
399
400/**
401 * ti_gpio_pin_getname - Gets the name of a given pin
402 * @dev: gpio device handle
403 * @pin: the number of the pin
404 * @name: buffer to put the name in
405 *
406 * The driver simply calls the pins gpio_n, where 'n' is obviously the number
407 * of the pin.
408 *
409 * LOCKING:
410 * Internally locks the context
411 *
412 * RETURNS:
413 * Returns 0 on success otherwise an error code
414 */
415static int
416ti_gpio_pin_getname(device_t dev, uint32_t pin, char *name)
417{
418 struct ti_gpio_softc *sc = device_get_softc(dev);
419 uint32_t bank = (pin / PINS_PER_BANK);
420
421 TI_GPIO_LOCK(sc);
422
423 /* Sanity check the pin number is valid */
424 if ((bank >= ti_max_gpio_banks()) || (sc->sc_mem_res[bank] == NULL)) {
425 TI_GPIO_UNLOCK(sc);
426 return (EINVAL);
427 }
428
429 /* Set a very simple name */
430 snprintf(name, GPIOMAXNAME, "gpio_%u", pin);
431 name[GPIOMAXNAME - 1] = '\0';
432
433 TI_GPIO_UNLOCK(sc);
434
435 return (0);
436}
437
438/**
439 * ti_gpio_pin_setflags - Sets the flags for a given pin
440 * @dev: gpio device handle
441 * @pin: the number of the pin
442 * @flags: the flags to set
443 *
444 * The flags of the pin correspond to things like input/output mode, pull-ups,
445 * pull-downs, etc. This driver doesn't support all flags, only the following:
446 * - GPIO_PIN_INPUT
447 * - GPIO_PIN_OUTPUT
448 * - GPIO_PIN_PULLUP
449 * - GPIO_PIN_PULLDOWN
450 *
451 * LOCKING:
452 * Internally locks the context
453 *
454 * RETURNS:
455 * Returns 0 on success otherwise an error code
456 */
457static int
458ti_gpio_pin_setflags(device_t dev, uint32_t pin, uint32_t flags)
459{
460 struct ti_gpio_softc *sc = device_get_softc(dev);
461 uint32_t bank = (pin / PINS_PER_BANK);
462 uint32_t mask = (1UL << (pin % PINS_PER_BANK));
463 uint32_t reg_val;
464
465 /* Sanity check the flags supplied are valid, i.e. not input and output */
466 if ((flags & (GPIO_PIN_INPUT|GPIO_PIN_OUTPUT)) == 0x0000)
467 return (EINVAL);
468 if ((flags & (GPIO_PIN_INPUT|GPIO_PIN_OUTPUT)) ==
469 (GPIO_PIN_INPUT|GPIO_PIN_OUTPUT))
470 return (EINVAL);
471 if ((flags & (GPIO_PIN_PULLUP|GPIO_PIN_PULLDOWN)) ==
472 (GPIO_PIN_PULLUP|GPIO_PIN_PULLDOWN))
473 return (EINVAL);
474
475 TI_GPIO_LOCK(sc);
476
477 /* Sanity check the pin number is valid */
478 if ((bank >= ti_max_gpio_banks()) || (sc->sc_mem_res[bank] == NULL)) {
479 TI_GPIO_UNLOCK(sc);
480 return (EINVAL);
481 }
482
483 /* Set the GPIO mode and state */
484 if (TI_GPIO_SET_FLAGS(dev, pin, flags) != 0) {
485 TI_GPIO_UNLOCK(sc);
486 return (EINVAL);
487 }
488
489 /* If configuring as an output set the "output enable" bit */
490 reg_val = ti_gpio_read_4(sc, bank, TI_GPIO_OE);
491 if (flags & GPIO_PIN_INPUT)
492 reg_val |= mask;
493 else
494 reg_val &= ~mask;
495 ti_gpio_write_4(sc, bank, TI_GPIO_OE, reg_val);
496
497 TI_GPIO_UNLOCK(sc);
498
499 return (0);
500}
501
502/**
503 * ti_gpio_pin_set - Sets the current level on a GPIO pin
504 * @dev: gpio device handle
505 * @pin: the number of the pin
506 * @value: non-zero value will drive the pin high, otherwise the pin is
507 * driven low.
508 *
509 *
510 * LOCKING:
511 * Internally locks the context
512 *
513 * RETURNS:
514 * Returns 0 on success otherwise a error code
515 */
516static int
517ti_gpio_pin_set(device_t dev, uint32_t pin, unsigned int value)
518{
519 struct ti_gpio_softc *sc = device_get_softc(dev);
520 uint32_t bank = (pin / PINS_PER_BANK);
521 uint32_t mask = (1UL << (pin % PINS_PER_BANK));
522
523 TI_GPIO_LOCK(sc);
524
525 /* Sanity check the pin number is valid */
526 if ((bank >= ti_max_gpio_banks()) || (sc->sc_mem_res[bank] == NULL)) {
527 TI_GPIO_UNLOCK(sc);
528 return (EINVAL);
529 }
530
531 ti_gpio_write_4(sc, bank, (value == GPIO_PIN_LOW) ? TI_GPIO_CLEARDATAOUT
532 : TI_GPIO_SETDATAOUT, mask);
533
534 TI_GPIO_UNLOCK(sc);
535
536 return (0);
537}
538
539/**
540 * ti_gpio_pin_get - Gets the current level on a GPIO pin
541 * @dev: gpio device handle
542 * @pin: the number of the pin
543 * @value: pointer to a value that upond return will contain the pin value
544 *
545 * The pin must be configured as an input pin beforehand, otherwise this
546 * function will fail.
547 *
548 * LOCKING:
549 * Internally locks the context
550 *
551 * RETURNS:
552 * Returns 0 on success otherwise a error code
553 */
554static int
555ti_gpio_pin_get(device_t dev, uint32_t pin, unsigned int *value)
556{
557 struct ti_gpio_softc *sc = device_get_softc(dev);
558 uint32_t bank = (pin / PINS_PER_BANK);
559 uint32_t mask = (1UL << (pin % PINS_PER_BANK));
560 uint32_t val = 0;
561
562 TI_GPIO_LOCK(sc);
563
564 /* Sanity check the pin number is valid */
565 if ((bank >= ti_max_gpio_banks()) || (sc->sc_mem_res[bank] == NULL)) {
566 TI_GPIO_UNLOCK(sc);
567 return (EINVAL);
568 }
569
570 /* Sanity check the pin is not configured as an output */
571 val = ti_gpio_read_4(sc, bank, TI_GPIO_OE);
572
573 /* Read the value on the pin */
574 if (val & mask)
575 *value = (ti_gpio_read_4(sc, bank, TI_GPIO_DATAIN) & mask) ? 1 : 0;
576 else
577 *value = (ti_gpio_read_4(sc, bank, TI_GPIO_DATAOUT) & mask) ? 1 : 0;
578
579 TI_GPIO_UNLOCK(sc);
580
581 return (0);
582}
583
584/**
585 * ti_gpio_pin_toggle - Toggles a given GPIO pin
586 * @dev: gpio device handle
587 * @pin: the number of the pin
588 *
589 *
590 * LOCKING:
591 * Internally locks the context
592 *
593 * RETURNS:
594 * Returns 0 on success otherwise a error code
595 */
596static int
597ti_gpio_pin_toggle(device_t dev, uint32_t pin)
598{
599 struct ti_gpio_softc *sc = device_get_softc(dev);
600 uint32_t bank = (pin / PINS_PER_BANK);
601 uint32_t mask = (1UL << (pin % PINS_PER_BANK));
602 uint32_t val;
603
604 TI_GPIO_LOCK(sc);
605
606 /* Sanity check the pin number is valid */
607 if ((bank >= ti_max_gpio_banks()) || (sc->sc_mem_res[bank] == NULL)) {
608 TI_GPIO_UNLOCK(sc);
609 return (EINVAL);
610 }
611
612 /* Toggle the pin */
613 val = ti_gpio_read_4(sc, bank, TI_GPIO_DATAOUT);
614 if (val & mask)
615 ti_gpio_write_4(sc, bank, TI_GPIO_CLEARDATAOUT, mask);
616 else
617 ti_gpio_write_4(sc, bank, TI_GPIO_SETDATAOUT, mask);
618
619 TI_GPIO_UNLOCK(sc);
620
621 return (0);
622}
623
624/**
625 * ti_gpio_intr - ISR for all GPIO modules
626 * @arg: the soft context pointer
627 *
628 * Unsused
629 *
630 * LOCKING:
631 * Internally locks the context
632 *
633 */
634static void
635ti_gpio_intr(void *arg)
636{
637 struct ti_gpio_softc *sc = arg;
638
639 TI_GPIO_LOCK(sc);
640 /* TODO: something useful */
641 TI_GPIO_UNLOCK(sc);
642}
643
644static int
645ti_gpio_attach_intr(device_t dev)
646{
647 int i;
648 struct ti_gpio_softc *sc;
649
650 sc = device_get_softc(dev);
651 for (i = 0; i < ti_max_gpio_intrs(); i++) {
652 if (sc->sc_irq_res[i] == NULL)
653 break;
654
655 /*
656 * Register our interrupt handler for each of the IRQ resources.
657 */
658 if (bus_setup_intr(dev, sc->sc_irq_res[i],
659 INTR_TYPE_MISC | INTR_MPSAFE, NULL, ti_gpio_intr, sc,
660 &sc->sc_irq_hdl[i]) != 0) {
661 device_printf(dev,
662 "WARNING: unable to register interrupt handler\n");
663 return (-1);
664 }
665 }
666
667 return (0);
668}
669
670static int
671ti_gpio_detach_intr(device_t dev)
672{
673 int i;
674 struct ti_gpio_softc *sc;
675
676 /* Teardown our interrupt handlers. */
677 sc = device_get_softc(dev);
678 for (i = 0; i < ti_max_gpio_intrs(); i++) {
679 if (sc->sc_irq_res[i] == NULL)
680 break;
681
682 if (sc->sc_irq_hdl[i]) {
683 bus_teardown_intr(dev, sc->sc_irq_res[i],
684 sc->sc_irq_hdl[i]);
685 }
686 }
687
688 return (0);
689}
690
691static int
692ti_gpio_bank_init(device_t dev, int bank)
693{
694 int pin;
695 struct ti_gpio_softc *sc;
696 uint32_t flags, reg_oe;
697
698 sc = device_get_softc(dev);
699
700 /* Enable the interface and functional clocks for the module. */
701 ti_prcm_clk_enable(GPIO0_CLK + ti_first_gpio_bank() + bank);
702
703 /*
704 * Read the revision number of the module. TI don't publish the
705 * actual revision numbers, so instead the values have been
706 * determined by experimentation.
707 */
708 sc->sc_revision[bank] = ti_gpio_read_4(sc, bank, TI_GPIO_REVISION);
709
710 /* Check the revision. */
711 if (sc->sc_revision[bank] != ti_gpio_rev()) {
712 device_printf(dev, "Warning: could not determine the revision "
713 "of %u GPIO module (revision:0x%08x)\n",
714 bank, sc->sc_revision[bank]);
715 return (EINVAL);
716 }
717
718 /* Disable interrupts for all pins. */
719 ti_gpio_intr_clr(sc, bank, 0xffffffff);
720
721 /* Init OE register based on pads configuration. */
722 reg_oe = 0xffffffff;
723 for (pin = 0; pin < PINS_PER_BANK; pin++) {
724 TI_GPIO_GET_FLAGS(dev, PINS_PER_BANK * bank + pin, &flags);
725 if (flags & GPIO_PIN_OUTPUT)
726 reg_oe &= ~(1UL << pin);
727 }
728 ti_gpio_write_4(sc, bank, TI_GPIO_OE, reg_oe);
729
730 return (0);
731}
732
733/**
734 * ti_gpio_attach - attach function for the driver
735 * @dev: gpio device handle
736 *
737 * Allocates and sets up the driver context for all GPIO banks. This function
738 * expects the memory ranges and IRQs to already be allocated to the driver.
739 *
740 * LOCKING:
741 * None
742 *
743 * RETURNS:
744 * Always returns 0
745 */
746static int
747ti_gpio_attach(device_t dev)
748{
749 struct ti_gpio_softc *sc;
750 unsigned int i;
751 int err;
752
753 sc = device_get_softc(dev);
754 sc->sc_dev = dev;
755
756 TI_GPIO_LOCK_INIT(sc);
757
758 /* There are up to 6 different GPIO register sets located in different
759 * memory areas on the chip. The memory range should have been set for
760 * the driver when it was added as a child.
761 */
762 if (bus_alloc_resources(dev, ti_gpio_mem_spec, sc->sc_mem_res) != 0) {
763 device_printf(dev, "Error: could not allocate mem resources\n");
764 return (ENXIO);
765 }
766
767 /* Request the IRQ resources */
768 if (bus_alloc_resources(dev, ti_gpio_irq_spec, sc->sc_irq_res) != 0) {
769 bus_release_resources(dev, ti_gpio_mem_spec, sc->sc_mem_res);
770 device_printf(dev, "Error: could not allocate irq resources\n");
771 return (ENXIO);
772 }
773
774 /* Setup the IRQ resources */
775 if (ti_gpio_attach_intr(dev) != 0) {
776 ti_gpio_detach_intr(dev);
777 bus_release_resources(dev, ti_gpio_irq_spec, sc->sc_irq_res);
778 bus_release_resources(dev, ti_gpio_mem_spec, sc->sc_mem_res);
779 return (ENXIO);
780 }
781
782 /* We need to go through each block and ensure the clocks are running and
783 * the module is enabled. It might be better to do this only when the
784 * pins are configured which would result in less power used if the GPIO
785 * pins weren't used ...
786 */
787 for (i = 0; i < ti_max_gpio_banks(); i++) {
788 if (sc->sc_mem_res[i] != NULL) {
789 /* Initialize the GPIO module. */
790 err = ti_gpio_bank_init(dev, i);
791 if (err != 0) {
792 ti_gpio_detach_intr(dev);
793 bus_release_resources(dev, ti_gpio_irq_spec,
794 sc->sc_irq_res);
795 bus_release_resources(dev, ti_gpio_mem_spec,
796 sc->sc_mem_res);
797 return (err);
798 }
799 }
800 }
801
802 /* Finish of the probe call */
803 device_add_child(dev, "gpioc", -1);
804 device_add_child(dev, "gpiobus", -1);
805
806 return (bus_generic_attach(dev));
807}
808
809/**
810 * ti_gpio_detach - detach function for the driver
811 * @dev: scm device handle
812 *
813 * Allocates and sets up the driver context, this simply entails creating a
814 * bus mappings for the SCM register set.
815 *
816 * LOCKING:
817 * None
818 *
819 * RETURNS:
820 * Always returns 0
821 */
822static int
823ti_gpio_detach(device_t dev)
824{
825 struct ti_gpio_softc *sc = device_get_softc(dev);
826 unsigned int i;
827
828 KASSERT(mtx_initialized(&sc->sc_mtx), ("gpio mutex not initialized"));
829
830 /* Disable all interrupts */
831 for (i = 0; i < ti_max_gpio_banks(); i++) {
832 if (sc->sc_mem_res[i] != NULL)
833 ti_gpio_intr_clr(sc, i, 0xffffffff);
834 }
835
836 bus_generic_detach(dev);
837
838 /* Release the memory and IRQ resources. */
839 ti_gpio_detach_intr(dev);
840 bus_release_resources(dev, ti_gpio_irq_spec, sc->sc_irq_res);
841 bus_release_resources(dev, ti_gpio_mem_spec, sc->sc_mem_res);
842
843 TI_GPIO_LOCK_DESTROY(sc);
844
845 return (0);
846}
847
848static phandle_t
849ti_gpio_get_node(device_t bus, device_t dev)
850{
851
852 /* We only have one child, the GPIO bus, which needs our own node. */
853 return (ofw_bus_get_node(bus));
854}
855
856static device_method_t ti_gpio_methods[] = {
857 DEVMETHOD(device_attach, ti_gpio_attach),
858 DEVMETHOD(device_detach, ti_gpio_detach),
859
860 /* GPIO protocol */
861 DEVMETHOD(gpio_pin_max, ti_gpio_pin_max),
862 DEVMETHOD(gpio_pin_getname, ti_gpio_pin_getname),
863 DEVMETHOD(gpio_pin_getflags, ti_gpio_pin_getflags),
864 DEVMETHOD(gpio_pin_getcaps, ti_gpio_pin_getcaps),
865 DEVMETHOD(gpio_pin_setflags, ti_gpio_pin_setflags),
866 DEVMETHOD(gpio_pin_get, ti_gpio_pin_get),
867 DEVMETHOD(gpio_pin_set, ti_gpio_pin_set),
868 DEVMETHOD(gpio_pin_toggle, ti_gpio_pin_toggle),
869
870 /* ofw_bus interface */
871 DEVMETHOD(ofw_bus_get_node, ti_gpio_get_node),
872
873 {0, 0},
874};
875
876driver_t ti_gpio_driver = {
877 "gpio",
878 ti_gpio_methods,
879 sizeof(struct ti_gpio_softc),
880};
465 TI_GPIO_LOCK(sc);
466
467 /* Sanity check the pin number is valid */
468 if ((bank >= ti_max_gpio_banks()) || (sc->sc_mem_res[bank] == NULL)) {
469 TI_GPIO_UNLOCK(sc);
470 return (EINVAL);
471 }
472
473 /* Set the GPIO mode and state */
474 if (TI_GPIO_SET_FLAGS(dev, pin, flags) != 0) {
475 TI_GPIO_UNLOCK(sc);
476 return (EINVAL);
477 }
478
479 /* If configuring as an output set the "output enable" bit */
480 reg_val = ti_gpio_read_4(sc, bank, TI_GPIO_OE);
481 if (flags & GPIO_PIN_INPUT)
482 reg_val |= mask;
483 else
484 reg_val &= ~mask;
485 ti_gpio_write_4(sc, bank, TI_GPIO_OE, reg_val);
486
487 TI_GPIO_UNLOCK(sc);
488
489 return (0);
490}
491
492/**
493 * ti_gpio_pin_set - Sets the current level on a GPIO pin
494 * @dev: gpio device handle
495 * @pin: the number of the pin
496 * @value: non-zero value will drive the pin high, otherwise the pin is
497 * driven low.
498 *
499 *
500 * LOCKING:
501 * Internally locks the context
502 *
503 * RETURNS:
504 * Returns 0 on success otherwise a error code
505 */
506static int
507ti_gpio_pin_set(device_t dev, uint32_t pin, unsigned int value)
508{
509 struct ti_gpio_softc *sc = device_get_softc(dev);
510 uint32_t bank = (pin / PINS_PER_BANK);
511 uint32_t mask = (1UL << (pin % PINS_PER_BANK));
512
513 TI_GPIO_LOCK(sc);
514
515 /* Sanity check the pin number is valid */
516 if ((bank >= ti_max_gpio_banks()) || (sc->sc_mem_res[bank] == NULL)) {
517 TI_GPIO_UNLOCK(sc);
518 return (EINVAL);
519 }
520
521 ti_gpio_write_4(sc, bank, (value == GPIO_PIN_LOW) ? TI_GPIO_CLEARDATAOUT
522 : TI_GPIO_SETDATAOUT, mask);
523
524 TI_GPIO_UNLOCK(sc);
525
526 return (0);
527}
528
529/**
530 * ti_gpio_pin_get - Gets the current level on a GPIO pin
531 * @dev: gpio device handle
532 * @pin: the number of the pin
533 * @value: pointer to a value that upond return will contain the pin value
534 *
535 * The pin must be configured as an input pin beforehand, otherwise this
536 * function will fail.
537 *
538 * LOCKING:
539 * Internally locks the context
540 *
541 * RETURNS:
542 * Returns 0 on success otherwise a error code
543 */
544static int
545ti_gpio_pin_get(device_t dev, uint32_t pin, unsigned int *value)
546{
547 struct ti_gpio_softc *sc = device_get_softc(dev);
548 uint32_t bank = (pin / PINS_PER_BANK);
549 uint32_t mask = (1UL << (pin % PINS_PER_BANK));
550 uint32_t val = 0;
551
552 TI_GPIO_LOCK(sc);
553
554 /* Sanity check the pin number is valid */
555 if ((bank >= ti_max_gpio_banks()) || (sc->sc_mem_res[bank] == NULL)) {
556 TI_GPIO_UNLOCK(sc);
557 return (EINVAL);
558 }
559
560 /* Sanity check the pin is not configured as an output */
561 val = ti_gpio_read_4(sc, bank, TI_GPIO_OE);
562
563 /* Read the value on the pin */
564 if (val & mask)
565 *value = (ti_gpio_read_4(sc, bank, TI_GPIO_DATAIN) & mask) ? 1 : 0;
566 else
567 *value = (ti_gpio_read_4(sc, bank, TI_GPIO_DATAOUT) & mask) ? 1 : 0;
568
569 TI_GPIO_UNLOCK(sc);
570
571 return (0);
572}
573
574/**
575 * ti_gpio_pin_toggle - Toggles a given GPIO pin
576 * @dev: gpio device handle
577 * @pin: the number of the pin
578 *
579 *
580 * LOCKING:
581 * Internally locks the context
582 *
583 * RETURNS:
584 * Returns 0 on success otherwise a error code
585 */
586static int
587ti_gpio_pin_toggle(device_t dev, uint32_t pin)
588{
589 struct ti_gpio_softc *sc = device_get_softc(dev);
590 uint32_t bank = (pin / PINS_PER_BANK);
591 uint32_t mask = (1UL << (pin % PINS_PER_BANK));
592 uint32_t val;
593
594 TI_GPIO_LOCK(sc);
595
596 /* Sanity check the pin number is valid */
597 if ((bank >= ti_max_gpio_banks()) || (sc->sc_mem_res[bank] == NULL)) {
598 TI_GPIO_UNLOCK(sc);
599 return (EINVAL);
600 }
601
602 /* Toggle the pin */
603 val = ti_gpio_read_4(sc, bank, TI_GPIO_DATAOUT);
604 if (val & mask)
605 ti_gpio_write_4(sc, bank, TI_GPIO_CLEARDATAOUT, mask);
606 else
607 ti_gpio_write_4(sc, bank, TI_GPIO_SETDATAOUT, mask);
608
609 TI_GPIO_UNLOCK(sc);
610
611 return (0);
612}
613
614/**
615 * ti_gpio_intr - ISR for all GPIO modules
616 * @arg: the soft context pointer
617 *
618 * Unsused
619 *
620 * LOCKING:
621 * Internally locks the context
622 *
623 */
624static void
625ti_gpio_intr(void *arg)
626{
627 struct ti_gpio_softc *sc = arg;
628
629 TI_GPIO_LOCK(sc);
630 /* TODO: something useful */
631 TI_GPIO_UNLOCK(sc);
632}
633
634static int
635ti_gpio_attach_intr(device_t dev)
636{
637 int i;
638 struct ti_gpio_softc *sc;
639
640 sc = device_get_softc(dev);
641 for (i = 0; i < ti_max_gpio_intrs(); i++) {
642 if (sc->sc_irq_res[i] == NULL)
643 break;
644
645 /*
646 * Register our interrupt handler for each of the IRQ resources.
647 */
648 if (bus_setup_intr(dev, sc->sc_irq_res[i],
649 INTR_TYPE_MISC | INTR_MPSAFE, NULL, ti_gpio_intr, sc,
650 &sc->sc_irq_hdl[i]) != 0) {
651 device_printf(dev,
652 "WARNING: unable to register interrupt handler\n");
653 return (-1);
654 }
655 }
656
657 return (0);
658}
659
660static int
661ti_gpio_detach_intr(device_t dev)
662{
663 int i;
664 struct ti_gpio_softc *sc;
665
666 /* Teardown our interrupt handlers. */
667 sc = device_get_softc(dev);
668 for (i = 0; i < ti_max_gpio_intrs(); i++) {
669 if (sc->sc_irq_res[i] == NULL)
670 break;
671
672 if (sc->sc_irq_hdl[i]) {
673 bus_teardown_intr(dev, sc->sc_irq_res[i],
674 sc->sc_irq_hdl[i]);
675 }
676 }
677
678 return (0);
679}
680
681static int
682ti_gpio_bank_init(device_t dev, int bank)
683{
684 int pin;
685 struct ti_gpio_softc *sc;
686 uint32_t flags, reg_oe;
687
688 sc = device_get_softc(dev);
689
690 /* Enable the interface and functional clocks for the module. */
691 ti_prcm_clk_enable(GPIO0_CLK + ti_first_gpio_bank() + bank);
692
693 /*
694 * Read the revision number of the module. TI don't publish the
695 * actual revision numbers, so instead the values have been
696 * determined by experimentation.
697 */
698 sc->sc_revision[bank] = ti_gpio_read_4(sc, bank, TI_GPIO_REVISION);
699
700 /* Check the revision. */
701 if (sc->sc_revision[bank] != ti_gpio_rev()) {
702 device_printf(dev, "Warning: could not determine the revision "
703 "of %u GPIO module (revision:0x%08x)\n",
704 bank, sc->sc_revision[bank]);
705 return (EINVAL);
706 }
707
708 /* Disable interrupts for all pins. */
709 ti_gpio_intr_clr(sc, bank, 0xffffffff);
710
711 /* Init OE register based on pads configuration. */
712 reg_oe = 0xffffffff;
713 for (pin = 0; pin < PINS_PER_BANK; pin++) {
714 TI_GPIO_GET_FLAGS(dev, PINS_PER_BANK * bank + pin, &flags);
715 if (flags & GPIO_PIN_OUTPUT)
716 reg_oe &= ~(1UL << pin);
717 }
718 ti_gpio_write_4(sc, bank, TI_GPIO_OE, reg_oe);
719
720 return (0);
721}
722
723/**
724 * ti_gpio_attach - attach function for the driver
725 * @dev: gpio device handle
726 *
727 * Allocates and sets up the driver context for all GPIO banks. This function
728 * expects the memory ranges and IRQs to already be allocated to the driver.
729 *
730 * LOCKING:
731 * None
732 *
733 * RETURNS:
734 * Always returns 0
735 */
736static int
737ti_gpio_attach(device_t dev)
738{
739 struct ti_gpio_softc *sc;
740 unsigned int i;
741 int err;
742
743 sc = device_get_softc(dev);
744 sc->sc_dev = dev;
745
746 TI_GPIO_LOCK_INIT(sc);
747
748 /* There are up to 6 different GPIO register sets located in different
749 * memory areas on the chip. The memory range should have been set for
750 * the driver when it was added as a child.
751 */
752 if (bus_alloc_resources(dev, ti_gpio_mem_spec, sc->sc_mem_res) != 0) {
753 device_printf(dev, "Error: could not allocate mem resources\n");
754 return (ENXIO);
755 }
756
757 /* Request the IRQ resources */
758 if (bus_alloc_resources(dev, ti_gpio_irq_spec, sc->sc_irq_res) != 0) {
759 bus_release_resources(dev, ti_gpio_mem_spec, sc->sc_mem_res);
760 device_printf(dev, "Error: could not allocate irq resources\n");
761 return (ENXIO);
762 }
763
764 /* Setup the IRQ resources */
765 if (ti_gpio_attach_intr(dev) != 0) {
766 ti_gpio_detach_intr(dev);
767 bus_release_resources(dev, ti_gpio_irq_spec, sc->sc_irq_res);
768 bus_release_resources(dev, ti_gpio_mem_spec, sc->sc_mem_res);
769 return (ENXIO);
770 }
771
772 /* We need to go through each block and ensure the clocks are running and
773 * the module is enabled. It might be better to do this only when the
774 * pins are configured which would result in less power used if the GPIO
775 * pins weren't used ...
776 */
777 for (i = 0; i < ti_max_gpio_banks(); i++) {
778 if (sc->sc_mem_res[i] != NULL) {
779 /* Initialize the GPIO module. */
780 err = ti_gpio_bank_init(dev, i);
781 if (err != 0) {
782 ti_gpio_detach_intr(dev);
783 bus_release_resources(dev, ti_gpio_irq_spec,
784 sc->sc_irq_res);
785 bus_release_resources(dev, ti_gpio_mem_spec,
786 sc->sc_mem_res);
787 return (err);
788 }
789 }
790 }
791
792 /* Finish of the probe call */
793 device_add_child(dev, "gpioc", -1);
794 device_add_child(dev, "gpiobus", -1);
795
796 return (bus_generic_attach(dev));
797}
798
799/**
800 * ti_gpio_detach - detach function for the driver
801 * @dev: scm device handle
802 *
803 * Allocates and sets up the driver context, this simply entails creating a
804 * bus mappings for the SCM register set.
805 *
806 * LOCKING:
807 * None
808 *
809 * RETURNS:
810 * Always returns 0
811 */
812static int
813ti_gpio_detach(device_t dev)
814{
815 struct ti_gpio_softc *sc = device_get_softc(dev);
816 unsigned int i;
817
818 KASSERT(mtx_initialized(&sc->sc_mtx), ("gpio mutex not initialized"));
819
820 /* Disable all interrupts */
821 for (i = 0; i < ti_max_gpio_banks(); i++) {
822 if (sc->sc_mem_res[i] != NULL)
823 ti_gpio_intr_clr(sc, i, 0xffffffff);
824 }
825
826 bus_generic_detach(dev);
827
828 /* Release the memory and IRQ resources. */
829 ti_gpio_detach_intr(dev);
830 bus_release_resources(dev, ti_gpio_irq_spec, sc->sc_irq_res);
831 bus_release_resources(dev, ti_gpio_mem_spec, sc->sc_mem_res);
832
833 TI_GPIO_LOCK_DESTROY(sc);
834
835 return (0);
836}
837
838static phandle_t
839ti_gpio_get_node(device_t bus, device_t dev)
840{
841
842 /* We only have one child, the GPIO bus, which needs our own node. */
843 return (ofw_bus_get_node(bus));
844}
845
846static device_method_t ti_gpio_methods[] = {
847 DEVMETHOD(device_attach, ti_gpio_attach),
848 DEVMETHOD(device_detach, ti_gpio_detach),
849
850 /* GPIO protocol */
851 DEVMETHOD(gpio_pin_max, ti_gpio_pin_max),
852 DEVMETHOD(gpio_pin_getname, ti_gpio_pin_getname),
853 DEVMETHOD(gpio_pin_getflags, ti_gpio_pin_getflags),
854 DEVMETHOD(gpio_pin_getcaps, ti_gpio_pin_getcaps),
855 DEVMETHOD(gpio_pin_setflags, ti_gpio_pin_setflags),
856 DEVMETHOD(gpio_pin_get, ti_gpio_pin_get),
857 DEVMETHOD(gpio_pin_set, ti_gpio_pin_set),
858 DEVMETHOD(gpio_pin_toggle, ti_gpio_pin_toggle),
859
860 /* ofw_bus interface */
861 DEVMETHOD(ofw_bus_get_node, ti_gpio_get_node),
862
863 {0, 0},
864};
865
866driver_t ti_gpio_driver = {
867 "gpio",
868 ti_gpio_methods,
869 sizeof(struct ti_gpio_softc),
870};