]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/arm/ti/ti_gpio.c
contrib/bc: update to version 4.0.2
[FreeBSD/FreeBSD.git] / sys / arm / ti / ti_gpio.c
1 /*-
2  * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3  *
4  * Copyright (c) 2011 Ben Gray <ben.r.gray@gmail.com>.
5  * Copyright (c) 2014 Luiz Otavio O Souza <loos@FreeBSD.org>.
6  * All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  *
17  * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20  * ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
21  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27  * SUCH DAMAGE.
28  */
29
30 /**
31  * Beware that the OMAP4 datasheet(s) lists GPIO banks 1-6, whereas the code
32  * here uses 0-5.
33  */
34
35 #include <sys/cdefs.h>
36 __FBSDID("$FreeBSD$");
37
38 #include "opt_platform.h"
39
40 #include <sys/param.h>
41 #include <sys/systm.h>
42 #include <sys/bus.h>
43
44 #include <sys/kernel.h>
45 #include <sys/module.h>
46 #include <sys/proc.h>
47 #include <sys/rman.h>
48 #include <sys/lock.h>
49 #include <sys/mutex.h>
50 #include <sys/gpio.h>
51 #include <sys/interrupt.h>
52
53 #include <machine/bus.h>
54 #include <machine/intr.h>
55 #include <machine/resource.h>
56
57 #include <arm/ti/ti_cpuid.h>
58 #include <arm/ti/ti_gpio.h>
59 #include <arm/ti/ti_scm.h>
60 #include <arm/ti/ti_sysc.h>
61
62 #include <dev/gpio/gpiobusvar.h>
63 #include <dev/ofw/openfirm.h>
64 #include <dev/ofw/ofw_bus.h>
65 #include <dev/ofw/ofw_bus_subr.h>
66
67 #include "gpio_if.h"
68 #include "ti_gpio_if.h"
69 #include "pic_if.h"
70
71 #if !defined(SOC_OMAP4) && !defined(SOC_TI_AM335X)
72 #error "Unknown SoC"
73 #endif
74
75 /* Register definitions */
76 #define TI_GPIO_REVISION                0x0000
77 #define TI_GPIO_SYSCONFIG               0x0010
78 #define TI_GPIO_IRQSTATUS_RAW_0         0x0024
79 #define TI_GPIO_IRQSTATUS_RAW_1         0x0028
80 #define TI_GPIO_IRQSTATUS_0             0x002C  /* writing a 0 has no effect */
81 #define TI_GPIO_IRQSTATUS_1             0x0030  /* writing a 0 has no effect */
82 #define TI_GPIO_IRQSTATUS_SET_0         0x0034  /* writing a 0 has no effect */
83 #define TI_GPIO_IRQSTATUS_SET_1         0x0038  /* writing a 0 has no effect */
84 #define TI_GPIO_IRQSTATUS_CLR_0         0x003C  /* writing a 0 has no effect */
85 #define TI_GPIO_IRQSTATUS_CLR_1         0x0040  /* writing a 0 has no effect */
86 #define TI_GPIO_IRQWAKEN_0              0x0044
87 #define TI_GPIO_IRQWAKEN_1              0x0048
88 #define TI_GPIO_SYSSTATUS               0x0114
89 #define TI_GPIO_IRQSTATUS1              0x0118
90 #define TI_GPIO_IRQENABLE1              0x011C
91 #define TI_GPIO_WAKEUPENABLE            0x0120
92 #define TI_GPIO_IRQSTATUS2              0x0128
93 #define TI_GPIO_IRQENABLE2              0x012C
94 #define TI_GPIO_CTRL                    0x0130
95 #define TI_GPIO_OE                      0x0134
96 #define TI_GPIO_DATAIN                  0x0138
97 #define TI_GPIO_DATAOUT                 0x013C
98 #define TI_GPIO_LEVELDETECT0            0x0140  /* RW register */
99 #define TI_GPIO_LEVELDETECT1            0x0144  /* RW register */
100 #define TI_GPIO_RISINGDETECT            0x0148  /* RW register */
101 #define TI_GPIO_FALLINGDETECT           0x014C  /* RW register */
102 #define TI_GPIO_DEBOUNCENABLE           0x0150
103 #define TI_GPIO_DEBOUNCINGTIME          0x0154
104 #define TI_GPIO_CLEARWKUPENA            0x0180
105 #define TI_GPIO_SETWKUENA               0x0184
106 #define TI_GPIO_CLEARDATAOUT            0x0190
107 #define TI_GPIO_SETDATAOUT              0x0194
108
109 /* Other SoC Specific definitions */
110 #define OMAP4_FIRST_GPIO_BANK           1
111 #define OMAP4_INTR_PER_BANK             1
112 #define OMAP4_GPIO_REV                  0x50600801
113 #define AM335X_FIRST_GPIO_BANK          0
114 #define AM335X_INTR_PER_BANK            2
115 #define AM335X_GPIO_REV                 0x50600801
116 #define PINS_PER_BANK                   32
117 #define TI_GPIO_MASK(p)                 (1U << ((p) % PINS_PER_BANK))
118
119 #define OMAP4_GPIO1_REV                 0x00000
120 #define OMAP4_GPIO2_REV                 0x55000
121 #define OMAP4_GPIO3_REV                 0x57000
122 #define OMAP4_GPIO4_REV                 0x59000
123 #define OMAP4_GPIO5_REV                 0x5b000
124 #define OMAP4_GPIO6_REV                 0x5d000
125
126 #define AM335X_GPIO0_REV                0x07000
127 #define AM335X_GPIO1_REV                0x4C000
128 #define AM335X_GPIO2_REV                0xAC000
129 #define AM335X_GPIO3_REV                0xAE000
130
131 static int ti_gpio_intr(void *arg);
132 static int ti_gpio_detach(device_t);
133
134 static int ti_gpio_pic_attach(struct ti_gpio_softc *sc);
135 static int ti_gpio_pic_detach(struct ti_gpio_softc *sc);
136
137 static uint32_t
138 ti_gpio_rev(void)
139 {
140         switch(ti_chip()) {
141 #ifdef SOC_OMAP4
142         case CHIP_OMAP_4:
143                 return (OMAP4_GPIO_REV);
144 #endif
145 #ifdef SOC_TI_AM335X
146         case CHIP_AM335X:
147                 return (AM335X_GPIO_REV);
148 #endif
149         }
150         return (0);
151 }
152
153 /**
154  *      Macros for driver mutex locking
155  */
156 #define TI_GPIO_LOCK(_sc)               mtx_lock_spin(&(_sc)->sc_mtx)
157 #define TI_GPIO_UNLOCK(_sc)             mtx_unlock_spin(&(_sc)->sc_mtx)
158 #define TI_GPIO_LOCK_INIT(_sc)          \
159         mtx_init(&_sc->sc_mtx, device_get_nameunit((_sc)->sc_dev), \
160             "ti_gpio", MTX_SPIN)
161 #define TI_GPIO_LOCK_DESTROY(_sc)       mtx_destroy(&(_sc)->sc_mtx)
162 #define TI_GPIO_ASSERT_LOCKED(_sc)      mtx_assert(&(_sc)->sc_mtx, MA_OWNED)
163 #define TI_GPIO_ASSERT_UNLOCKED(_sc)    mtx_assert(&(_sc)->sc_mtx, MA_NOTOWNED)
164
165 /**
166  *      ti_gpio_read_4 - reads a 32-bit value from one of the GPIO registers
167  *      @sc: GPIO device context
168  *      @bank: The bank to read from
169  *      @off: The offset of a register from the GPIO register address range
170  *
171  *
172  *      RETURNS:
173  *      32-bit value read from the register.
174  */
175 static inline uint32_t
176 ti_gpio_read_4(struct ti_gpio_softc *sc, bus_size_t off)
177 {
178         return (bus_read_4(sc->sc_mem_res, off));
179 }
180
181 /**
182  *      ti_gpio_write_4 - writes a 32-bit value to one of the GPIO registers
183  *      @sc: GPIO device context
184  *      @bank: The bank to write to
185  *      @off: The offset of a register from the GPIO register address range
186  *      @val: The value to write into the register
187  *
188  *      RETURNS:
189  *      nothing
190  */
191 static inline void
192 ti_gpio_write_4(struct ti_gpio_softc *sc, bus_size_t off,
193                  uint32_t val)
194 {
195         bus_write_4(sc->sc_mem_res, off, val);
196 }
197
198 static inline void
199 ti_gpio_intr_clr(struct ti_gpio_softc *sc, uint32_t mask)
200 {
201
202         /* We clear both set of registers. */
203         ti_gpio_write_4(sc, TI_GPIO_IRQSTATUS_CLR_0, mask);
204         ti_gpio_write_4(sc, TI_GPIO_IRQSTATUS_CLR_1, mask);
205 }
206
207 static inline void
208 ti_gpio_intr_set(struct ti_gpio_softc *sc, uint32_t mask)
209 {
210
211         /*
212          * On OMAP4 we unmask only the MPU interrupt and on AM335x we
213          * also activate only the first interrupt.
214          */
215         ti_gpio_write_4(sc, TI_GPIO_IRQSTATUS_SET_0, mask);
216 }
217
218 static inline void
219 ti_gpio_intr_ack(struct ti_gpio_softc *sc, uint32_t mask)
220 {
221
222         /*
223          * Acknowledge the interrupt on both registers even if we use only
224          * the first one.
225          */
226         ti_gpio_write_4(sc, TI_GPIO_IRQSTATUS_0, mask);
227         ti_gpio_write_4(sc, TI_GPIO_IRQSTATUS_1, mask);
228 }
229
230 static inline uint32_t
231 ti_gpio_intr_status(struct ti_gpio_softc *sc)
232 {
233         uint32_t reg;
234
235         /* Get the status from both registers. */
236         reg = ti_gpio_read_4(sc, TI_GPIO_IRQSTATUS_0);
237         reg |= ti_gpio_read_4(sc, TI_GPIO_IRQSTATUS_1);
238
239         return (reg);
240 }
241
242 static device_t
243 ti_gpio_get_bus(device_t dev)
244 {
245         struct ti_gpio_softc *sc;
246
247         sc = device_get_softc(dev);
248
249         return (sc->sc_busdev);
250 }
251
252 /**
253  *      ti_gpio_pin_max - Returns the maximum number of GPIO pins
254  *      @dev: gpio device handle
255  *      @maxpin: pointer to a value that upon return will contain the maximum number
256  *               of pins in the device.
257  *
258  *
259  *      LOCKING:
260  *      No locking required, returns static data.
261  *
262  *      RETURNS:
263  *      Returns 0 on success otherwise an error code
264  */
265 static int
266 ti_gpio_pin_max(device_t dev, int *maxpin)
267 {
268
269         *maxpin = PINS_PER_BANK - 1;
270
271         return (0);
272 }
273
274 static int
275 ti_gpio_valid_pin(struct ti_gpio_softc *sc, int pin)
276 {
277
278         if (pin >= sc->sc_maxpin || sc->sc_mem_res == NULL)
279                 return (EINVAL);
280
281         return (0);
282 }
283
284 /**
285  *      ti_gpio_pin_getcaps - Gets the capabilities of a given pin
286  *      @dev: gpio device handle
287  *      @pin: the number of the pin
288  *      @caps: pointer to a value that upon return will contain the capabilities
289  *
290  *      Currently all pins have the same capability, notably:
291  *        - GPIO_PIN_INPUT
292  *        - GPIO_PIN_OUTPUT
293  *        - GPIO_PIN_PULLUP
294  *        - GPIO_PIN_PULLDOWN
295  *        - GPIO_INTR_LEVEL_LOW
296  *        - GPIO_INTR_LEVEL_HIGH
297  *        - GPIO_INTR_EDGE_RISING
298  *        - GPIO_INTR_EDGE_FALLING
299  *        - GPIO_INTR_EDGE_BOTH
300  *
301  *      LOCKING:
302  *      No locking required, returns static data.
303  *
304  *      RETURNS:
305  *      Returns 0 on success otherwise an error code
306  */
307 static int
308 ti_gpio_pin_getcaps(device_t dev, uint32_t pin, uint32_t *caps)
309 {
310         struct ti_gpio_softc *sc;
311
312         sc = device_get_softc(dev);
313         if (ti_gpio_valid_pin(sc, pin) != 0)
314                 return (EINVAL);
315
316         *caps = (GPIO_PIN_INPUT | GPIO_PIN_OUTPUT | GPIO_PIN_PULLUP |
317             GPIO_PIN_PULLDOWN | GPIO_INTR_LEVEL_LOW | GPIO_INTR_LEVEL_HIGH |
318             GPIO_INTR_EDGE_RISING | GPIO_INTR_EDGE_FALLING |
319             GPIO_INTR_EDGE_BOTH);
320
321         return (0);
322 }
323
324 /**
325  *      ti_gpio_pin_getflags - Gets the current flags of a given pin
326  *      @dev: gpio device handle
327  *      @pin: the number of the pin
328  *      @flags: upon return will contain the current flags of the pin
329  *
330  *      Reads the current flags of a given pin, here we actually read the H/W
331  *      registers to determine the flags, rather than storing the value in the
332  *      setflags call.
333  *
334  *      LOCKING:
335  *      Internally locks the context
336  *
337  *      RETURNS:
338  *      Returns 0 on success otherwise an error code
339  */
340 static int
341 ti_gpio_pin_getflags(device_t dev, uint32_t pin, uint32_t *flags)
342 {
343         struct ti_gpio_softc *sc;
344
345         sc = device_get_softc(dev);
346         if (ti_gpio_valid_pin(sc, pin) != 0)
347                 return (EINVAL);
348
349         /* Get the current pin state */
350         TI_GPIO_LOCK(sc);
351         TI_GPIO_GET_FLAGS(dev, pin, flags);
352         TI_GPIO_UNLOCK(sc);
353
354         return (0);
355 }
356
357 /**
358  *      ti_gpio_pin_getname - Gets the name of a given pin
359  *      @dev: gpio device handle
360  *      @pin: the number of the pin
361  *      @name: buffer to put the name in
362  *
363  *      The driver simply calls the pins gpio_n, where 'n' is obviously the number
364  *      of the pin.
365  *
366  *      LOCKING:
367  *      No locking required, returns static data.
368  *
369  *      RETURNS:
370  *      Returns 0 on success otherwise an error code
371  */
372 static int
373 ti_gpio_pin_getname(device_t dev, uint32_t pin, char *name)
374 {
375         struct ti_gpio_softc *sc;
376
377         sc = device_get_softc(dev);
378         if (ti_gpio_valid_pin(sc, pin) != 0)
379                 return (EINVAL);
380
381         /* Set a very simple name */
382         snprintf(name, GPIOMAXNAME, "gpio_%u", pin);
383         name[GPIOMAXNAME - 1] = '\0';
384
385         return (0);
386 }
387
388 /**
389  *      ti_gpio_pin_setflags - Sets the flags for a given pin
390  *      @dev: gpio device handle
391  *      @pin: the number of the pin
392  *      @flags: the flags to set
393  *
394  *      The flags of the pin correspond to things like input/output mode, pull-ups,
395  *      pull-downs, etc.  This driver doesn't support all flags, only the following:
396  *        - GPIO_PIN_INPUT
397  *        - GPIO_PIN_OUTPUT
398  *        - GPIO_PIN_PULLUP
399  *        - GPIO_PIN_PULLDOWN
400  *
401  *      LOCKING:
402  *      Internally locks the context
403  *
404  *      RETURNS:
405  *      Returns 0 on success otherwise an error code
406  */
407 static int
408 ti_gpio_pin_setflags(device_t dev, uint32_t pin, uint32_t flags)
409 {
410         struct ti_gpio_softc *sc;
411         uint32_t oe;
412
413         sc = device_get_softc(dev);
414         if (ti_gpio_valid_pin(sc, pin) != 0)
415                 return (EINVAL);
416
417         /* Set the GPIO mode and state */
418         TI_GPIO_LOCK(sc);
419         if (TI_GPIO_SET_FLAGS(dev, pin, flags) != 0) {
420                 TI_GPIO_UNLOCK(sc);
421                 return (EINVAL);
422         }
423
424         /* If configuring as an output set the "output enable" bit */
425         oe = ti_gpio_read_4(sc, TI_GPIO_OE);
426         if (flags & GPIO_PIN_INPUT)
427                 oe |= TI_GPIO_MASK(pin);
428         else
429                 oe &= ~TI_GPIO_MASK(pin);
430         ti_gpio_write_4(sc, TI_GPIO_OE, oe);
431         TI_GPIO_UNLOCK(sc);
432
433         return (0);
434 }
435
436 /**
437  *      ti_gpio_pin_set - Sets the current level on a GPIO pin
438  *      @dev: gpio device handle
439  *      @pin: the number of the pin
440  *      @value: non-zero value will drive the pin high, otherwise the pin is
441  *              driven low.
442  *
443  *
444  *      LOCKING:
445  *      Internally locks the context
446  *
447  *      RETURNS:
448  *      Returns 0 on success otherwise a error code
449  */
450 static int
451 ti_gpio_pin_set(device_t dev, uint32_t pin, unsigned int value)
452 {
453         struct ti_gpio_softc *sc;
454         uint32_t reg;
455
456         sc = device_get_softc(dev);
457         if (ti_gpio_valid_pin(sc, pin) != 0)
458                 return (EINVAL);
459
460         TI_GPIO_LOCK(sc);
461         if (value == GPIO_PIN_LOW)
462                 reg = TI_GPIO_CLEARDATAOUT;
463         else
464                 reg = TI_GPIO_SETDATAOUT;
465         ti_gpio_write_4(sc, reg, TI_GPIO_MASK(pin));
466         TI_GPIO_UNLOCK(sc);
467
468         return (0);
469 }
470
471 /**
472  *      ti_gpio_pin_get - Gets the current level on a GPIO pin
473  *      @dev: gpio device handle
474  *      @pin: the number of the pin
475  *      @value: pointer to a value that upond return will contain the pin value
476  *
477  *      The pin must be configured as an input pin beforehand, otherwise this
478  *      function will fail.
479  *
480  *      LOCKING:
481  *      Internally locks the context
482  *
483  *      RETURNS:
484  *      Returns 0 on success otherwise a error code
485  */
486 static int
487 ti_gpio_pin_get(device_t dev, uint32_t pin, unsigned int *value)
488 {
489         struct ti_gpio_softc *sc;
490         uint32_t oe, reg, val;
491
492         sc = device_get_softc(dev);
493         if (ti_gpio_valid_pin(sc, pin) != 0)
494                 return (EINVAL);
495
496         /*
497          * Return data from output latch when set as output and from the
498          * input register otherwise.
499          */
500         TI_GPIO_LOCK(sc);
501         oe = ti_gpio_read_4(sc, TI_GPIO_OE);
502         if (oe & TI_GPIO_MASK(pin))
503                 reg = TI_GPIO_DATAIN;
504         else
505                 reg = TI_GPIO_DATAOUT;
506         val = ti_gpio_read_4(sc, reg);
507         *value = (val & TI_GPIO_MASK(pin)) ? 1 : 0;
508         TI_GPIO_UNLOCK(sc);
509
510         return (0);
511 }
512
513 /**
514  *      ti_gpio_pin_toggle - Toggles a given GPIO pin
515  *      @dev: gpio device handle
516  *      @pin: the number of the pin
517  *
518  *
519  *      LOCKING:
520  *      Internally locks the context
521  *
522  *      RETURNS:
523  *      Returns 0 on success otherwise a error code
524  */
525 static int
526 ti_gpio_pin_toggle(device_t dev, uint32_t pin)
527 {
528         struct ti_gpio_softc *sc;
529         uint32_t reg, val;
530
531         sc = device_get_softc(dev);
532         if (ti_gpio_valid_pin(sc, pin) != 0)
533                 return (EINVAL);
534
535         /* Toggle the pin */
536         TI_GPIO_LOCK(sc);
537         val = ti_gpio_read_4(sc, TI_GPIO_DATAOUT);
538         if (val & TI_GPIO_MASK(pin))
539                 reg = TI_GPIO_CLEARDATAOUT;
540         else
541                 reg = TI_GPIO_SETDATAOUT;
542         ti_gpio_write_4(sc, reg, TI_GPIO_MASK(pin));
543         TI_GPIO_UNLOCK(sc);
544
545         return (0);
546 }
547
548 static int
549 ti_gpio_bank_init(device_t dev)
550 {
551         int pin, err;
552         struct ti_gpio_softc *sc;
553         uint32_t flags, reg_oe, reg_set, rev;
554         uint64_t rev_address;
555
556         sc = device_get_softc(dev);
557
558         /* Enable the interface and functional clocks for the module. */
559         rev_address = ti_sysc_get_rev_address(device_get_parent(dev));
560         /* AM335x
561          * sc->sc_bank used in am335x/am335x_gpio.c and omap4/omap4_gpio.c */
562         switch(ti_chip()) {
563 #ifdef SOC_OMAP4
564         case CHIP_OMAP_4:
565                 switch (rev_address) {
566                         case OMAP4_GPIO1_REV:
567                                 sc->sc_bank = 0;
568                                 break;
569                         case OMAP4_GPIO2_REV:
570                                 sc->sc_bank = 1;
571                                 break;
572                         case OMAP4_GPIO3_REV:
573                                 sc->sc_bank = 2;
574                                 break;
575                         case OMAP4_GPIO4_REV:
576                                 sc->sc_bank = 3;
577                                 break;
578                         case OMAP4_GPIO5_REV:
579                                 sc->sc_bank = 4;
580                                 break;
581                         case OMAP4_GPIO6_REV:
582                                 sc->sc_bank = 5;
583                                 break;
584                 }
585 #endif
586 #ifdef SOC_TI_AM335X
587         case CHIP_AM335X:
588                 switch (rev_address) {
589                         case AM335X_GPIO0_REV:
590                                 sc->sc_bank = 0;
591                                 break;
592                         case AM335X_GPIO1_REV:
593                                 sc->sc_bank = 1;
594                                 break;
595                         case AM335X_GPIO2_REV:
596                                 sc->sc_bank = 2;
597                                 break;
598                         case AM335X_GPIO3_REV:
599                                 sc->sc_bank = 3;
600                                 break;
601                 }
602 #endif
603         }
604         err = ti_sysc_clock_enable(device_get_parent(dev));
605         if (err) {
606                 device_printf(dev, "Failed to enable clock\n");
607                 return (EINVAL);
608         }
609
610         /*
611          * Read the revision number of the module.  TI don't publish the
612          * actual revision numbers, so instead the values have been
613          * determined by experimentation.
614          */
615         rev = ti_gpio_read_4(sc,
616             ti_sysc_get_rev_address_offset_host(device_get_parent(dev)));
617
618         /* Check the revision. */
619         if (rev != ti_gpio_rev()) {
620                 device_printf(dev, "Warning: could not determine the revision "
621                     "of GPIO module (revision:0x%08x)\n", rev);
622                 return (EINVAL);
623         }
624
625         /* Disable interrupts for all pins. */
626         ti_gpio_intr_clr(sc, 0xffffffff);
627
628         /* Init OE register based on pads configuration. */
629         reg_oe = 0xffffffff;
630         reg_set = 0;
631         for (pin = 0; pin < PINS_PER_BANK; pin++) {
632                 TI_GPIO_GET_FLAGS(dev, pin, &flags);
633                 if (flags & GPIO_PIN_OUTPUT) {
634                         reg_oe &= ~(1UL << pin);
635                         if (flags & GPIO_PIN_PULLUP)
636                                 reg_set |= (1UL << pin);
637                 }
638         }
639         ti_gpio_write_4(sc, TI_GPIO_OE, reg_oe);
640         if (reg_set)
641                 ti_gpio_write_4(sc, TI_GPIO_SETDATAOUT, reg_set);
642
643         return (0);
644 }
645
646 /**
647  *      ti_gpio_attach - attach function for the driver
648  *      @dev: gpio device handle
649  *
650  *      Allocates and sets up the driver context for all GPIO banks.  This function
651  *      expects the memory ranges and IRQs to already be allocated to the driver.
652  *
653  *      LOCKING:
654  *      None
655  *
656  *      RETURNS:
657  *      Always returns 0
658  */
659 static int
660 ti_gpio_attach(device_t dev)
661 {
662         struct ti_gpio_softc *sc;
663         int err;
664
665         sc = device_get_softc(dev);
666         sc->sc_dev = dev;
667         TI_GPIO_LOCK_INIT(sc);
668         ti_gpio_pin_max(dev, &sc->sc_maxpin);
669         sc->sc_maxpin++;
670
671         sc->sc_mem_rid = 0;
672         sc->sc_mem_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY,
673             &sc->sc_mem_rid, RF_ACTIVE);
674         if (!sc->sc_mem_res) {
675                 device_printf(dev, "Error: could not allocate mem resources\n");
676                 ti_gpio_detach(dev);
677                 return (ENXIO);
678         }
679
680         sc->sc_irq_rid = 0;
681         sc->sc_irq_res = bus_alloc_resource_any(dev, SYS_RES_IRQ,
682             &sc->sc_irq_rid, RF_ACTIVE);
683         if (!sc->sc_irq_res) {
684                 device_printf(dev, "Error: could not allocate irq resources\n");
685                 ti_gpio_detach(dev);
686                 return (ENXIO);
687         }
688
689         /*
690          * Register our interrupt filter for each of the IRQ resources.
691          */
692         if (bus_setup_intr(dev, sc->sc_irq_res,
693             INTR_TYPE_MISC | INTR_MPSAFE, ti_gpio_intr, NULL, sc,
694             &sc->sc_irq_hdl) != 0) {
695                 device_printf(dev,
696                     "WARNING: unable to register interrupt filter\n");
697                 ti_gpio_detach(dev);
698                 return (ENXIO);
699         }
700
701         if (ti_gpio_pic_attach(sc) != 0) {
702                 device_printf(dev, "WARNING: unable to attach PIC\n");
703                 ti_gpio_detach(dev);
704                 return (ENXIO);
705         }
706
707         /* We need to go through each block and ensure the clocks are running and
708          * the module is enabled.  It might be better to do this only when the
709          * pins are configured which would result in less power used if the GPIO
710          * pins weren't used ...
711          */
712         if (sc->sc_mem_res != NULL) {
713                 /* Initialize the GPIO module. */
714                 err = ti_gpio_bank_init(dev);
715                 if (err != 0) {
716                         ti_gpio_detach(dev);
717                         return (err);
718                 }
719         }
720
721         sc->sc_busdev = gpiobus_attach_bus(dev);
722         if (sc->sc_busdev == NULL) {
723                 ti_gpio_detach(dev);
724                 return (ENXIO);
725         }
726
727         return (0);
728 }
729
730 /**
731  *      ti_gpio_detach - detach function for the driver
732  *      @dev: scm device handle
733  *
734  *      Allocates and sets up the driver context, this simply entails creating a
735  *      bus mappings for the SCM register set.
736  *
737  *      LOCKING:
738  *      None
739  *
740  *      RETURNS:
741  *      Always returns 0
742  */
743 static int
744 ti_gpio_detach(device_t dev)
745 {
746         struct ti_gpio_softc *sc = device_get_softc(dev);
747
748         KASSERT(mtx_initialized(&sc->sc_mtx), ("gpio mutex not initialized"));
749
750         /* Disable all interrupts */
751         if (sc->sc_mem_res != NULL)
752                 ti_gpio_intr_clr(sc, 0xffffffff);
753         if (sc->sc_busdev != NULL)
754                 gpiobus_detach_bus(dev);
755         if (sc->sc_isrcs != NULL)
756                 ti_gpio_pic_detach(sc);
757         /* Release the memory and IRQ resources. */
758         if (sc->sc_irq_hdl) {
759                 bus_teardown_intr(dev, sc->sc_irq_res,
760                     sc->sc_irq_hdl);
761         }
762         if (sc->sc_irq_res)
763                 bus_release_resource(dev, SYS_RES_IRQ, sc->sc_irq_rid,
764                     sc->sc_irq_res);
765         if (sc->sc_mem_res)
766                 bus_release_resource(dev, SYS_RES_MEMORY, sc->sc_mem_rid,
767                     sc->sc_mem_res);
768         TI_GPIO_LOCK_DESTROY(sc);
769
770         return (0);
771 }
772
773 static inline void
774 ti_gpio_rwreg_modify(struct ti_gpio_softc *sc, uint32_t reg, uint32_t mask,
775     bool set_bits)
776 {
777         uint32_t value;
778
779         value = ti_gpio_read_4(sc, reg);
780         ti_gpio_write_4(sc, reg, set_bits ? value | mask : value & ~mask);
781 }
782
783 static inline void
784 ti_gpio_isrc_mask(struct ti_gpio_softc *sc, struct ti_gpio_irqsrc *tgi)
785 {
786
787         /* Writing a 0 has no effect. */
788         ti_gpio_intr_clr(sc, tgi->tgi_mask);
789 }
790
791 static inline void
792 ti_gpio_isrc_unmask(struct ti_gpio_softc *sc, struct ti_gpio_irqsrc *tgi)
793 {
794
795         /* Writing a 0 has no effect. */
796         ti_gpio_intr_set(sc, tgi->tgi_mask);
797 }
798
799 static inline void
800 ti_gpio_isrc_eoi(struct ti_gpio_softc *sc, struct ti_gpio_irqsrc *tgi)
801 {
802
803         /* Writing a 0 has no effect. */
804         ti_gpio_intr_ack(sc, tgi->tgi_mask);
805 }
806
807 static inline bool
808 ti_gpio_isrc_is_level(struct ti_gpio_irqsrc *tgi)
809 {
810
811         return (tgi->tgi_mode == GPIO_INTR_LEVEL_LOW ||
812             tgi->tgi_mode == GPIO_INTR_LEVEL_HIGH);
813 }
814
815 static int
816 ti_gpio_intr(void *arg)
817 {
818         u_int irq;
819         uint32_t reg;
820         struct ti_gpio_softc *sc;
821         struct trapframe *tf;
822         struct ti_gpio_irqsrc *tgi;
823
824         sc = (struct ti_gpio_softc *)arg;
825         tf = curthread->td_intr_frame;
826
827         reg = ti_gpio_intr_status(sc);
828         for (irq = 0; irq < sc->sc_maxpin; irq++) {
829                 tgi = &sc->sc_isrcs[irq];
830                 if ((reg & tgi->tgi_mask) == 0)
831                         continue;
832                 if (!ti_gpio_isrc_is_level(tgi))
833                         ti_gpio_isrc_eoi(sc, tgi);
834                 if (intr_isrc_dispatch(&tgi->tgi_isrc, tf) != 0) {
835                         ti_gpio_isrc_mask(sc, tgi);
836                         if (ti_gpio_isrc_is_level(tgi))
837                                 ti_gpio_isrc_eoi(sc, tgi);
838                         device_printf(sc->sc_dev, "Stray irq %u disabled\n",
839                             irq);
840                 }
841         }
842         return (FILTER_HANDLED);
843 }
844
845 static int
846 ti_gpio_pic_attach(struct ti_gpio_softc *sc)
847 {
848         int error;
849         uint32_t irq;
850         const char *name;
851
852         sc->sc_isrcs = malloc(sizeof(*sc->sc_isrcs) * sc->sc_maxpin, M_DEVBUF,
853             M_WAITOK | M_ZERO);
854
855         name = device_get_nameunit(sc->sc_dev);
856         for (irq = 0; irq < sc->sc_maxpin; irq++) {
857                 sc->sc_isrcs[irq].tgi_irq = irq;
858                 sc->sc_isrcs[irq].tgi_mask = TI_GPIO_MASK(irq);
859                 sc->sc_isrcs[irq].tgi_mode = GPIO_INTR_CONFORM;
860
861                 error = intr_isrc_register(&sc->sc_isrcs[irq].tgi_isrc,
862                     sc->sc_dev, 0, "%s,%u", name, irq);
863                 if (error != 0)
864                         return (error); /* XXX deregister ISRCs */
865         }
866         if (intr_pic_register(sc->sc_dev,
867             OF_xref_from_node(ofw_bus_get_node(sc->sc_dev))) == NULL)
868                 return (ENXIO);
869
870         return (0);
871 }
872
873 static int
874 ti_gpio_pic_detach(struct ti_gpio_softc *sc)
875 {
876
877         /*
878          *  There has not been established any procedure yet
879          *  how to detach PIC from living system correctly.
880          */
881         device_printf(sc->sc_dev, "%s: not implemented yet\n", __func__);
882         return (EBUSY);
883 }
884
885 static void
886 ti_gpio_pic_config_intr(struct ti_gpio_softc *sc, struct ti_gpio_irqsrc *tgi,
887     uint32_t mode)
888 {
889
890         TI_GPIO_LOCK(sc);
891         ti_gpio_rwreg_modify(sc, TI_GPIO_RISINGDETECT, tgi->tgi_mask,
892             mode == GPIO_INTR_EDGE_RISING || mode == GPIO_INTR_EDGE_BOTH);
893         ti_gpio_rwreg_modify(sc, TI_GPIO_FALLINGDETECT, tgi->tgi_mask,
894             mode == GPIO_INTR_EDGE_FALLING || mode == GPIO_INTR_EDGE_BOTH);
895         ti_gpio_rwreg_modify(sc, TI_GPIO_LEVELDETECT1, tgi->tgi_mask,
896             mode == GPIO_INTR_LEVEL_HIGH);
897         ti_gpio_rwreg_modify(sc, TI_GPIO_LEVELDETECT0, tgi->tgi_mask,
898             mode == GPIO_INTR_LEVEL_LOW);
899         tgi->tgi_mode = mode;
900         TI_GPIO_UNLOCK(sc);
901 }
902
903 static void
904 ti_gpio_pic_disable_intr(device_t dev, struct intr_irqsrc *isrc)
905 {
906         struct ti_gpio_softc *sc = device_get_softc(dev);
907         struct ti_gpio_irqsrc *tgi = (struct ti_gpio_irqsrc *)isrc;
908
909         ti_gpio_isrc_mask(sc, tgi);
910 }
911
912 static void
913 ti_gpio_pic_enable_intr(device_t dev, struct intr_irqsrc *isrc)
914 {
915         struct ti_gpio_softc *sc = device_get_softc(dev);
916         struct ti_gpio_irqsrc *tgi = (struct ti_gpio_irqsrc *)isrc;
917
918         arm_irq_memory_barrier(tgi->tgi_irq);
919         ti_gpio_isrc_unmask(sc, tgi);
920 }
921
922 static int
923 ti_gpio_pic_map_fdt(struct ti_gpio_softc *sc, struct intr_map_data_fdt *daf,
924     u_int *irqp, uint32_t *modep)
925 {
926         uint32_t mode;
927
928         /*
929          * The first cell is the interrupt number.
930          * The second cell is used to specify flags:
931          *      bits[3:0] trigger type and level flags:
932          *              1 = low-to-high edge triggered.
933          *              2 = high-to-low edge triggered.
934          *              4 = active high level-sensitive.
935          *              8 = active low level-sensitive.
936          */
937         if (daf->ncells != 2 || daf->cells[0] >= sc->sc_maxpin)
938                 return (EINVAL);
939
940         /* Only reasonable modes are supported. */
941         if (daf->cells[1] == 1)
942                 mode = GPIO_INTR_EDGE_RISING;
943         else if (daf->cells[1] == 2)
944                 mode = GPIO_INTR_EDGE_FALLING;
945         else if (daf->cells[1] == 3)
946                 mode = GPIO_INTR_EDGE_BOTH;
947         else if (daf->cells[1] == 4)
948                 mode = GPIO_INTR_LEVEL_HIGH;
949         else if (daf->cells[1] == 8)
950                 mode = GPIO_INTR_LEVEL_LOW;
951         else
952                 return (EINVAL);
953
954         *irqp = daf->cells[0];
955         if (modep != NULL)
956                 *modep = mode;
957         return (0);
958 }
959
960 static int
961 ti_gpio_pic_map_gpio(struct ti_gpio_softc *sc, struct intr_map_data_gpio *dag,
962     u_int *irqp, uint32_t *modep)
963 {
964         uint32_t mode;
965
966         if (dag->gpio_pin_num >= sc->sc_maxpin)
967                 return (EINVAL);
968
969         mode = dag->gpio_intr_mode;
970         if (mode != GPIO_INTR_LEVEL_LOW && mode != GPIO_INTR_LEVEL_HIGH &&
971             mode != GPIO_INTR_EDGE_RISING && mode != GPIO_INTR_EDGE_FALLING &&
972             mode != GPIO_INTR_EDGE_BOTH)
973                 return (EINVAL);
974
975         *irqp = dag->gpio_pin_num;
976         if (modep != NULL)
977                 *modep = mode;
978         return (0);
979 }
980
981 static int
982 ti_gpio_pic_map(struct ti_gpio_softc *sc, struct intr_map_data *data,
983     u_int *irqp, uint32_t *modep)
984 {
985
986         switch (data->type) {
987         case INTR_MAP_DATA_FDT:
988                 return (ti_gpio_pic_map_fdt(sc,
989                     (struct intr_map_data_fdt *)data, irqp, modep));
990         case INTR_MAP_DATA_GPIO:
991                 return (ti_gpio_pic_map_gpio(sc,
992                     (struct intr_map_data_gpio *)data, irqp, modep));
993         default:
994                 return (ENOTSUP);
995         }
996 }
997
998 static int
999 ti_gpio_pic_map_intr(device_t dev, struct intr_map_data *data,
1000     struct intr_irqsrc **isrcp)
1001 {
1002         int error;
1003         u_int irq;
1004         struct ti_gpio_softc *sc = device_get_softc(dev);
1005
1006         error = ti_gpio_pic_map(sc, data, &irq, NULL);
1007         if (error == 0)
1008                 *isrcp = &sc->sc_isrcs[irq].tgi_isrc;
1009         return (error);
1010 }
1011
1012 static void
1013 ti_gpio_pic_post_filter(device_t dev, struct intr_irqsrc *isrc)
1014 {
1015         struct ti_gpio_softc *sc = device_get_softc(dev);
1016         struct ti_gpio_irqsrc *tgi = (struct ti_gpio_irqsrc *)isrc;
1017
1018         if (ti_gpio_isrc_is_level(tgi))
1019                 ti_gpio_isrc_eoi(sc, tgi);
1020 }
1021
1022 static void
1023 ti_gpio_pic_post_ithread(device_t dev, struct intr_irqsrc *isrc)
1024 {
1025
1026         ti_gpio_pic_enable_intr(dev, isrc);
1027 }
1028
1029 static void
1030 ti_gpio_pic_pre_ithread(device_t dev, struct intr_irqsrc *isrc)
1031 {
1032         struct ti_gpio_softc *sc = device_get_softc(dev);
1033         struct ti_gpio_irqsrc *tgi = (struct ti_gpio_irqsrc *)isrc;
1034
1035         ti_gpio_isrc_mask(sc, tgi);
1036         if (ti_gpio_isrc_is_level(tgi))
1037                 ti_gpio_isrc_eoi(sc, tgi);
1038 }
1039
1040 static int
1041 ti_gpio_pic_setup_intr(device_t dev, struct intr_irqsrc *isrc,
1042     struct resource *res, struct intr_map_data *data)
1043 {
1044         u_int irq;
1045         uint32_t mode;
1046         struct ti_gpio_softc *sc;
1047         struct ti_gpio_irqsrc *tgi;
1048
1049         if (data == NULL)
1050                 return (ENOTSUP);
1051
1052         sc = device_get_softc(dev);
1053         tgi = (struct ti_gpio_irqsrc *)isrc;
1054
1055         /* Get and check config for an interrupt. */
1056         if (ti_gpio_pic_map(sc, data, &irq, &mode) != 0 || tgi->tgi_irq != irq)
1057                 return (EINVAL);
1058
1059         /*
1060          * If this is a setup for another handler,
1061          * only check that its configuration match.
1062          */
1063         if (isrc->isrc_handlers != 0)
1064                 return (tgi->tgi_mode == mode ? 0 : EINVAL);
1065
1066         ti_gpio_pic_config_intr(sc, tgi, mode);
1067         return (0);
1068 }
1069
1070 static int
1071 ti_gpio_pic_teardown_intr(device_t dev, struct intr_irqsrc *isrc,
1072     struct resource *res, struct intr_map_data *data)
1073 {
1074         struct ti_gpio_softc *sc = device_get_softc(dev);
1075         struct ti_gpio_irqsrc *tgi = (struct ti_gpio_irqsrc *)isrc;
1076
1077         if (isrc->isrc_handlers == 0)
1078                 ti_gpio_pic_config_intr(sc, tgi, GPIO_INTR_CONFORM);
1079         return (0);
1080 }
1081
1082 static phandle_t
1083 ti_gpio_get_node(device_t bus, device_t dev)
1084 {
1085
1086         /* We only have one child, the GPIO bus, which needs our own node. */
1087         return (ofw_bus_get_node(bus));
1088 }
1089
1090 static device_method_t ti_gpio_methods[] = {
1091         DEVMETHOD(device_attach, ti_gpio_attach),
1092         DEVMETHOD(device_detach, ti_gpio_detach),
1093
1094         /* GPIO protocol */
1095         DEVMETHOD(gpio_get_bus, ti_gpio_get_bus),
1096         DEVMETHOD(gpio_pin_max, ti_gpio_pin_max),
1097         DEVMETHOD(gpio_pin_getname, ti_gpio_pin_getname),
1098         DEVMETHOD(gpio_pin_getflags, ti_gpio_pin_getflags),
1099         DEVMETHOD(gpio_pin_getcaps, ti_gpio_pin_getcaps),
1100         DEVMETHOD(gpio_pin_setflags, ti_gpio_pin_setflags),
1101         DEVMETHOD(gpio_pin_get, ti_gpio_pin_get),
1102         DEVMETHOD(gpio_pin_set, ti_gpio_pin_set),
1103         DEVMETHOD(gpio_pin_toggle, ti_gpio_pin_toggle),
1104
1105         /* Interrupt controller interface */
1106         DEVMETHOD(pic_disable_intr,     ti_gpio_pic_disable_intr),
1107         DEVMETHOD(pic_enable_intr,      ti_gpio_pic_enable_intr),
1108         DEVMETHOD(pic_map_intr,         ti_gpio_pic_map_intr),
1109         DEVMETHOD(pic_setup_intr,       ti_gpio_pic_setup_intr),
1110         DEVMETHOD(pic_teardown_intr,    ti_gpio_pic_teardown_intr),
1111         DEVMETHOD(pic_post_filter,      ti_gpio_pic_post_filter),
1112         DEVMETHOD(pic_post_ithread,     ti_gpio_pic_post_ithread),
1113         DEVMETHOD(pic_pre_ithread,      ti_gpio_pic_pre_ithread),
1114
1115         /* ofw_bus interface */
1116         DEVMETHOD(ofw_bus_get_node, ti_gpio_get_node),
1117
1118         {0, 0},
1119 };
1120
1121 driver_t ti_gpio_driver = {
1122         "gpio",
1123         ti_gpio_methods,
1124         sizeof(struct ti_gpio_softc),
1125 };