]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/arm/mv/gpio.c
MFC r342008, r342010-r342020
[FreeBSD/FreeBSD.git] / sys / arm / mv / gpio.c
1 /*-
2  * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3  *
4  * Copyright (c) 2006 Benno Rice.
5  * Copyright (C) 2008 MARVELL INTERNATIONAL LTD.
6  * Copyright (c) 2017 Semihalf.
7  * All rights reserved.
8  *
9  * Adapted and extended for Marvell SoCs by Semihalf.
10  *
11  * Redistribution and use in source and binary forms, with or without
12  * modification, are permitted provided that the following conditions
13  * are met:
14  * 1. Redistributions of source code must retain the above copyright
15  *    notice, this list of conditions and the following disclaimer.
16  * 2. Redistributions in binary form must reproduce the above copyright
17  *    notice, this list of conditions and the following disclaimer in the
18  *    documentation and/or other materials provided with the distribution.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
21  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
22  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
23  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
24  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
25  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
29  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30  *
31  * from: FreeBSD: //depot/projects/arm/src/sys/arm/xscale/pxa2x0/pxa2x0_gpio.c, rev 1
32  */
33
34 #include <sys/cdefs.h>
35 __FBSDID("$FreeBSD$");
36
37 #include <sys/param.h>
38 #include <sys/systm.h>
39 #include <sys/bus.h>
40 #include <sys/kernel.h>
41 #include <sys/lock.h>
42 #include <sys/interrupt.h>
43 #include <sys/module.h>
44 #include <sys/malloc.h>
45 #include <sys/mutex.h>
46 #include <sys/rman.h>
47 #include <sys/queue.h>
48 #include <sys/timetc.h>
49 #include <sys/callout.h>
50 #include <sys/gpio.h>
51 #include <machine/bus.h>
52 #include <machine/intr.h>
53
54 #include <dev/gpio/gpiobusvar.h>
55 #include <dev/ofw/ofw_bus.h>
56 #include <dev/ofw/ofw_bus_subr.h>
57
58 #include <arm/mv/mvvar.h>
59 #include <arm/mv/mvreg.h>
60
61 #include "gpio_if.h"
62
63 #ifdef __aarch64__
64 #include "opt_soc.h"
65 #endif
66
67 #define GPIO_MAX_INTR_COUNT     8
68 #define GPIO_PINS_PER_REG       32
69 #define GPIO_GENERIC_CAP        (GPIO_PIN_INPUT | GPIO_PIN_OUTPUT |             \
70                                 GPIO_PIN_OPENDRAIN | GPIO_PIN_PUSHPULL |        \
71                                 GPIO_PIN_TRISTATE | GPIO_PIN_PULLUP |           \
72                                 GPIO_PIN_PULLDOWN | GPIO_PIN_INVIN |            \
73                                 GPIO_PIN_INVOUT)
74
75 #define DEBOUNCE_CHECK_MS       1
76 #define DEBOUNCE_LO_HI_MS       2
77 #define DEBOUNCE_HI_LO_MS       2
78 #define DEBOUNCE_CHECK_TICKS    ((hz / 1000) * DEBOUNCE_CHECK_MS)
79
80 struct mv_gpio_softc {
81         device_t                dev;
82         device_t                sc_busdev;
83         struct resource *       mem_res;
84         int                     mem_rid;
85         struct resource *       irq_res[GPIO_MAX_INTR_COUNT];
86         int                     irq_rid[GPIO_MAX_INTR_COUNT];
87         struct intr_event *     gpio_events[MV_GPIO_MAX_NPINS];
88         void                    *ih_cookie[GPIO_MAX_INTR_COUNT];
89         bus_space_tag_t         bst;
90         bus_space_handle_t      bsh;
91         uint32_t                offset;
92         struct mtx              mutex;
93         uint8_t                 pin_num;        /* number of GPIO pins */
94         uint8_t                 irq_num;        /* number of real IRQs occupied by GPIO controller */
95         struct gpio_pin         gpio_setup[MV_GPIO_MAX_NPINS];
96
97         /* Used for debouncing. */
98         uint32_t                debounced_state_lo;
99         uint32_t                debounced_state_hi;
100         struct callout          **debounce_callouts;
101         int                     *debounce_counters;
102 };
103
104 struct mv_gpio_pindev {
105         device_t dev;
106         int pin;
107 };
108
109 static int      mv_gpio_probe(device_t);
110 static int      mv_gpio_attach(device_t);
111 static int      mv_gpio_intr(device_t, void *);
112
113 static void     mv_gpio_double_edge_init(device_t, int);
114
115 static int      mv_gpio_debounce_setup(device_t, int);
116 static int      mv_gpio_debounce_prepare(device_t, int);
117 static int      mv_gpio_debounce_init(device_t, int);
118 static void     mv_gpio_debounce_start(device_t, int);
119 static void     mv_gpio_debounce(void *);
120 static void     mv_gpio_debounced_state_set(device_t, int, uint8_t);
121 static uint32_t mv_gpio_debounced_state_get(device_t, int);
122
123 static void     mv_gpio_exec_intr_handlers(device_t, uint32_t, int);
124 static void     mv_gpio_intr_handler(device_t, int);
125 static uint32_t mv_gpio_reg_read(device_t, uint32_t);
126 static void     mv_gpio_reg_write(device_t, uint32_t, uint32_t);
127 static void     mv_gpio_reg_set(device_t, uint32_t, uint32_t);
128 static void     mv_gpio_reg_clear(device_t, uint32_t, uint32_t);
129
130 static void     mv_gpio_blink(device_t, uint32_t, uint8_t);
131 static void     mv_gpio_polarity(device_t, uint32_t, uint8_t, uint8_t);
132 static void     mv_gpio_level(device_t, uint32_t, uint8_t);
133 static void     mv_gpio_edge(device_t, uint32_t, uint8_t);
134 static void     mv_gpio_out_en(device_t, uint32_t, uint8_t);
135 static void     mv_gpio_int_ack(struct mv_gpio_pindev *);
136 static void     mv_gpio_value_set(device_t, uint32_t, uint8_t);
137 static uint32_t mv_gpio_value_get(device_t, uint32_t, uint8_t);
138
139 static void     mv_gpio_intr_mask(struct mv_gpio_pindev *);
140 static void     mv_gpio_intr_unmask(struct mv_gpio_pindev *);
141
142 void mv_gpio_finish_intrhandler(struct mv_gpio_pindev *);
143 int mv_gpio_setup_intrhandler(device_t, const char *,
144     driver_filter_t *, void (*)(void *), void *,
145     int, int, void **);
146 int mv_gpio_configure(device_t, uint32_t, uint32_t, uint32_t);
147 void mv_gpio_out(device_t, uint32_t, uint8_t, uint8_t);
148 uint8_t mv_gpio_in(device_t, uint32_t);
149
150 /*
151  * GPIO interface
152  */
153 static device_t mv_gpio_get_bus(device_t);
154 static int mv_gpio_pin_max(device_t, int *);
155 static int mv_gpio_pin_getcaps(device_t, uint32_t, uint32_t *);
156 static int mv_gpio_pin_getflags(device_t, uint32_t, uint32_t *);
157 static int mv_gpio_pin_getname(device_t, uint32_t, char *);
158 static int mv_gpio_pin_setflags(device_t, uint32_t, uint32_t);
159 static int mv_gpio_pin_set(device_t, uint32_t, unsigned int);
160 static int mv_gpio_pin_get(device_t, uint32_t, unsigned int *);
161 static int mv_gpio_pin_toggle(device_t, uint32_t);
162 static int mv_gpio_map_gpios(device_t, phandle_t, phandle_t,
163     int, pcell_t *, uint32_t *, uint32_t *);
164
165 #define MV_GPIO_LOCK()          mtx_lock_spin(&sc->mutex)
166 #define MV_GPIO_UNLOCK()        mtx_unlock_spin(&sc->mutex)
167 #define MV_GPIO_ASSERT_LOCKED() mtx_assert(&sc->mutex, MA_OWNED)
168
169 static device_method_t mv_gpio_methods[] = {
170         DEVMETHOD(device_probe,         mv_gpio_probe),
171         DEVMETHOD(device_attach,        mv_gpio_attach),
172
173         /* GPIO protocol */
174         DEVMETHOD(gpio_get_bus,         mv_gpio_get_bus),
175         DEVMETHOD(gpio_pin_max,         mv_gpio_pin_max),
176         DEVMETHOD(gpio_pin_getname,     mv_gpio_pin_getname),
177         DEVMETHOD(gpio_pin_getflags,    mv_gpio_pin_getflags),
178         DEVMETHOD(gpio_pin_getcaps,     mv_gpio_pin_getcaps),
179         DEVMETHOD(gpio_pin_setflags,    mv_gpio_pin_setflags),
180         DEVMETHOD(gpio_pin_get,         mv_gpio_pin_get),
181         DEVMETHOD(gpio_pin_set,         mv_gpio_pin_set),
182         DEVMETHOD(gpio_pin_toggle,      mv_gpio_pin_toggle),
183         DEVMETHOD(gpio_map_gpios,       mv_gpio_map_gpios),
184
185         DEVMETHOD_END
186 };
187
188 static driver_t mv_gpio_driver = {
189         "gpio",
190         mv_gpio_methods,
191         sizeof(struct mv_gpio_softc),
192 };
193
194 static devclass_t mv_gpio_devclass;
195
196 EARLY_DRIVER_MODULE(mv_gpio, simplebus, mv_gpio_driver, mv_gpio_devclass, 0, 0,
197     BUS_PASS_INTERRUPT + BUS_PASS_ORDER_LAST);
198
199 struct ofw_compat_data compat_data[] = {
200         { "mrvl,gpio", 1 },
201         { "marvell,orion-gpio", 1 },
202 #ifdef SOC_MARVELL_8K
203         { "marvell,armada-8k-gpio", 1 },
204 #endif
205         { NULL, 0 }
206 };
207
208 static int
209 mv_gpio_probe(device_t dev)
210 {
211         if (!ofw_bus_status_okay(dev))
212                 return (ENXIO);
213
214         if (ofw_bus_search_compatible(dev, compat_data)->ocd_data == 0)
215                 return (ENXIO);
216
217         device_set_desc(dev, "Marvell Integrated GPIO Controller");
218         return (0);
219 }
220
221 static int
222 mv_gpio_setup_interrupts(struct mv_gpio_softc *sc, phandle_t node)
223 {
224         phandle_t iparent;
225         pcell_t irq_cells;
226         int i, size;
227
228         /* Find root interrupt controller */
229         iparent = ofw_bus_find_iparent(node);
230         if (iparent == 0) {
231                 device_printf(sc->dev, "No interrupt-parrent found. "
232                                 "Error in DTB\n");
233                 return (ENXIO);
234         } else {
235                 /* While at parent - store interrupt cells prop */
236                 if (OF_searchencprop(OF_node_from_xref(iparent),
237                     "#interrupt-cells", &irq_cells, sizeof(irq_cells)) == -1) {
238                         device_printf(sc->dev, "DTB: Missing #interrupt-cells "
239                             "property in interrupt parent node\n");
240                         return (ENXIO);
241                 }
242         }
243
244         size = OF_getproplen(node, "interrupts");
245         if (size != -1) {
246                 size = size / sizeof(pcell_t);
247                 size = size / irq_cells;
248                 sc->irq_num = size;
249                 device_printf(sc->dev, "%d IRQs available\n", sc->irq_num);
250         } else {
251                 device_printf(sc->dev, "ERROR: no interrupts entry found!\n");
252                 return (ENXIO);
253         }
254
255         for (i = 0; i < sc->irq_num; i++) {
256                 sc->irq_rid[i] = i;
257                 sc->irq_res[i] = bus_alloc_resource_any(sc->dev, SYS_RES_IRQ,
258                         &sc->irq_rid[i], RF_ACTIVE);
259                 if (!sc->irq_res[i]) {
260                         mtx_destroy(&sc->mutex);
261                         device_printf(sc->dev,
262                             "could not allocate gpio%d interrupt\n", i+1);
263                         return (ENXIO);
264                 }
265         }
266
267         device_printf(sc->dev, "Disable interrupts (offset = %x + EDGE(0x18)\n", sc->offset);
268         /* Disable all interrupts */
269         bus_space_write_4(sc->bst, sc->bsh, sc->offset + GPIO_INT_EDGE_MASK, 0);
270         device_printf(sc->dev, "Disable interrupts (offset = %x + LEV(0x1C))\n", sc->offset);
271         bus_space_write_4(sc->bst, sc->bsh, sc->offset + GPIO_INT_LEV_MASK, 0);
272
273         for (i = 0; i < sc->irq_num; i++) {
274                 device_printf(sc->dev, "Setup intr %d\n", i);
275                 if (bus_setup_intr(sc->dev, sc->irq_res[i],
276                     INTR_TYPE_MISC,
277                     (driver_filter_t *)mv_gpio_intr, NULL,
278                     sc, &sc->ih_cookie[i]) != 0) {
279                         mtx_destroy(&sc->mutex);
280                         bus_release_resource(sc->dev, SYS_RES_IRQ,
281                                 sc->irq_rid[i], sc->irq_res[i]);
282                         device_printf(sc->dev, "could not set up intr %d\n", i);
283                         return (ENXIO);
284                 }
285         }
286
287         /* Clear interrupt status. */
288         device_printf(sc->dev, "Clear int status (offset = %x)\n", sc->offset);
289         bus_space_write_4(sc->bst, sc->bsh, sc->offset + GPIO_INT_CAUSE, 0);
290
291         sc->debounce_callouts = (struct callout **)malloc(sc->pin_num *
292             sizeof(struct callout *), M_DEVBUF, M_WAITOK | M_ZERO);
293         if (sc->debounce_callouts == NULL)
294                 return (ENOMEM);
295
296         sc->debounce_counters = (int *)malloc(sc->pin_num * sizeof(int),
297             M_DEVBUF, M_WAITOK);
298         if (sc->debounce_counters == NULL)
299                 return (ENOMEM);
300
301         return (0);
302 }
303
304 static int
305 mv_gpio_attach(device_t dev)
306 {
307         int i, rv;
308         struct mv_gpio_softc *sc;
309         phandle_t node;
310         pcell_t pincnt = 0;
311
312         sc = (struct mv_gpio_softc *)device_get_softc(dev);
313         if (sc == NULL)
314                 return (ENXIO);
315
316         node = ofw_bus_get_node(dev);
317         sc->dev = dev;
318
319         if (OF_getencprop(node, "pin-count", &pincnt, sizeof(pcell_t)) >= 0 ||
320             OF_getencprop(node, "ngpios", &pincnt, sizeof(pcell_t)) >= 0) {
321                 sc->pin_num = MIN(pincnt, MV_GPIO_MAX_NPINS);
322                 if (bootverbose)
323                         device_printf(dev, "%d pins available\n", sc->pin_num);
324         } else {
325                 device_printf(dev, "ERROR: no pin-count or ngpios entry found!\n");
326                 return (ENXIO);
327         }
328
329         if (OF_getencprop(node, "offset", &sc->offset, sizeof(sc->offset)) == -1)
330                 sc->offset = 0;
331
332         /* Assign generic capabilities to every gpio pin */
333         for(i = 0; i < sc->pin_num; i++)
334                 sc->gpio_setup[i].gp_caps = GPIO_GENERIC_CAP;
335
336         mtx_init(&sc->mutex, device_get_nameunit(dev), NULL, MTX_SPIN);
337
338         sc->mem_rid = 0;
339         sc->mem_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &sc->mem_rid,
340                  RF_ACTIVE | RF_SHAREABLE );
341
342         if (!sc->mem_res) {
343                 mtx_destroy(&sc->mutex);
344                 device_printf(dev, "could not allocate memory window\n");
345                 return (ENXIO);
346         }
347
348         sc->bst = rman_get_bustag(sc->mem_res);
349         sc->bsh = rman_get_bushandle(sc->mem_res);
350
351         rv = mv_gpio_setup_interrupts(sc, node);
352         if (rv != 0)
353                 return (rv);
354
355         sc->sc_busdev = gpiobus_attach_bus(dev);
356         if (sc->sc_busdev == NULL) {
357                 mtx_destroy(&sc->mutex);
358                 bus_release_resource(dev, SYS_RES_IRQ,
359                         sc->irq_rid[i], sc->irq_res[i]);
360                 return (ENXIO);
361         }
362
363         return (0);
364 }
365
366 static int
367 mv_gpio_intr(device_t dev, void *arg)
368 {
369         uint32_t int_cause, gpio_val;
370         struct mv_gpio_softc *sc;
371         sc = (struct mv_gpio_softc *)device_get_softc(dev);
372
373         MV_GPIO_LOCK();
374
375         /*
376          * According to documentation, edge sensitive interrupts are asserted
377          * when unmasked GPIO_INT_CAUSE register bits are set.
378          */
379         int_cause = mv_gpio_reg_read(dev, GPIO_INT_CAUSE);
380         int_cause &= mv_gpio_reg_read(dev, GPIO_INT_EDGE_MASK);
381
382         /*
383          * Level sensitive interrupts are asserted when unmasked GPIO_DATA_IN
384          * register bits are set.
385          */
386         gpio_val = mv_gpio_reg_read(dev, GPIO_DATA_IN);
387         gpio_val &= mv_gpio_reg_read(dev, GPIO_INT_LEV_MASK);
388
389         mv_gpio_exec_intr_handlers(dev, int_cause | gpio_val, 0);
390
391         MV_GPIO_UNLOCK();
392
393         return (FILTER_HANDLED);
394 }
395
396 /*
397  * GPIO interrupt handling
398  */
399
400 void
401 mv_gpio_finish_intrhandler(struct mv_gpio_pindev *s)
402 {
403         /* When we acheive full interrupt support
404          * This function will be opposite to
405          * mv_gpio_setup_intrhandler
406          */
407
408         /* Now it exists only to remind that
409          * there should be place to free mv_gpio_pindev
410          * allocated by mv_gpio_setup_intrhandler
411          */
412         free(s, M_DEVBUF);
413 }
414
415 int
416 mv_gpio_setup_intrhandler(device_t dev, const char *name, driver_filter_t *filt,
417     void (*hand)(void *), void *arg, int pin, int flags, void **cookiep)
418 {
419         struct  intr_event *event;
420         int     error;
421         struct mv_gpio_pindev *s;
422         struct mv_gpio_softc *sc;
423         sc = (struct mv_gpio_softc *)device_get_softc(dev);
424         s = malloc(sizeof(struct mv_gpio_pindev), M_DEVBUF, M_NOWAIT | M_ZERO);
425
426         if (pin < 0 || pin >= sc->pin_num)
427                 return (ENXIO);
428         event = sc->gpio_events[pin];
429         if (event == NULL) {
430                 MV_GPIO_LOCK();
431                 if (sc->gpio_setup[pin].gp_flags & MV_GPIO_IN_DEBOUNCE) {
432                         error = mv_gpio_debounce_init(dev, pin);
433                         if (error != 0) {
434                                 MV_GPIO_UNLOCK();
435                                 return (error);
436                         }
437                 } else if (sc->gpio_setup[pin].gp_flags & MV_GPIO_IN_IRQ_DOUBLE_EDGE)
438                         mv_gpio_double_edge_init(dev, pin);
439                 MV_GPIO_UNLOCK();
440                 error = intr_event_create(&event, (void *)s, 0, pin,
441                     (void (*)(void *))mv_gpio_intr_mask,
442                     (void (*)(void *))mv_gpio_intr_unmask,
443                     (void (*)(void *))mv_gpio_int_ack,
444                     NULL,
445                     "gpio%d:", pin);
446                 if (error != 0)
447                         return (error);
448                 sc->gpio_events[pin] = event;
449         }
450
451         intr_event_add_handler(event, name, filt, hand, arg,
452             intr_priority(flags), flags, cookiep);
453         return (0);
454 }
455
456 static void
457 mv_gpio_intr_mask(struct mv_gpio_pindev *s)
458 {
459         struct mv_gpio_softc *sc;
460         sc = (struct mv_gpio_softc *)device_get_softc(s->dev);
461
462         if (s->pin >= sc->pin_num)
463                 return;
464
465         MV_GPIO_LOCK();
466
467         if (sc->gpio_setup[s->pin].gp_flags & (MV_GPIO_IN_IRQ_EDGE |
468             MV_GPIO_IN_IRQ_DOUBLE_EDGE))
469                 mv_gpio_edge(s->dev, s->pin, 0);
470         else
471                 mv_gpio_level(s->dev, s->pin, 0);
472
473         /*
474          * The interrupt has to be acknowledged before scheduling an interrupt
475          * thread. This way we allow for interrupt source to trigger again
476          * (which can happen with shared IRQs e.g. PCI) while processing the
477          * current event.
478          */
479         mv_gpio_int_ack(s);
480
481         MV_GPIO_UNLOCK();
482
483         return;
484 }
485
486 static void
487 mv_gpio_intr_unmask(struct mv_gpio_pindev *s)
488 {
489         struct mv_gpio_softc *sc;
490         sc = (struct mv_gpio_softc *)device_get_softc(s->dev);
491
492         if (s->pin >= sc->pin_num)
493                 return;
494
495         MV_GPIO_LOCK();
496
497         if (sc->gpio_setup[s->pin].gp_flags & (MV_GPIO_IN_IRQ_EDGE |
498             MV_GPIO_IN_IRQ_DOUBLE_EDGE))
499                 mv_gpio_edge(s->dev, s->pin, 1);
500         else
501                 mv_gpio_level(s->dev, s->pin, 1);
502
503         MV_GPIO_UNLOCK();
504
505         return;
506 }
507
508 static void
509 mv_gpio_exec_intr_handlers(device_t dev, uint32_t status, int high)
510 {
511         int i, pin;
512         struct mv_gpio_softc *sc;
513         sc = (struct mv_gpio_softc *)device_get_softc(dev);
514
515         MV_GPIO_ASSERT_LOCKED();
516
517         i = 0;
518         while (status != 0) {
519                 if (status & 1) {
520                         pin = (high ? (i + GPIO_PINS_PER_REG) : i);
521                         if (sc->gpio_setup[pin].gp_flags & MV_GPIO_IN_DEBOUNCE)
522                                 mv_gpio_debounce_start(dev, pin);
523                         else if (sc->gpio_setup[pin].gp_flags & MV_GPIO_IN_IRQ_DOUBLE_EDGE) {
524                                 mv_gpio_polarity(dev, pin, 0, 1);
525                                 mv_gpio_intr_handler(dev, pin);
526                         } else
527                                 mv_gpio_intr_handler(dev, pin);
528                 }
529                 status >>= 1;
530                 i++;
531         }
532 }
533
534 static void
535 mv_gpio_intr_handler(device_t dev, int pin)
536 {
537 #ifdef INTRNG
538         struct intr_irqsrc isrc;
539         struct mv_gpio_softc *sc;
540         sc = (struct mv_gpio_softc *)device_get_softc(dev);
541
542         MV_GPIO_ASSERT_LOCKED();
543
544 #ifdef INTR_SOLO
545         isrc.isrc_filter = NULL;
546 #endif
547         isrc.isrc_event = sc->gpio_events[pin];
548
549         if (isrc.isrc_event == NULL ||
550             CK_SLIST_EMPTY(&isrc.isrc_event->ie_handlers))
551                 return;
552
553         intr_isrc_dispatch(&isrc, NULL);
554 #endif
555 }
556
557 int
558 mv_gpio_configure(device_t dev, uint32_t pin, uint32_t flags, uint32_t mask)
559 {
560         int error;
561         struct mv_gpio_softc *sc;
562         sc = (struct mv_gpio_softc *)device_get_softc(dev);
563         error = 0;
564
565         if (pin >= sc->pin_num)
566                 return (EINVAL);
567
568         /* check flags consistency */
569         if (((flags & mask) & (GPIO_PIN_INPUT | GPIO_PIN_OUTPUT)) ==
570             (GPIO_PIN_INPUT | GPIO_PIN_OUTPUT))
571                 return (EINVAL);
572
573         if (mask & MV_GPIO_IN_DEBOUNCE) {
574                 if (sc->irq_num == 0)
575                         return (EINVAL);
576                 error = mv_gpio_debounce_prepare(dev, pin);
577                 if (error != 0)
578                         return (error);
579         }
580
581         MV_GPIO_LOCK();
582
583         if ((mask & flags) & GPIO_PIN_INPUT)
584                 mv_gpio_out_en(dev, pin, 0);
585         if ((mask & flags) & GPIO_PIN_OUTPUT) {
586                 if ((flags & mask) & GPIO_PIN_OPENDRAIN)
587                         mv_gpio_value_set(dev, pin, 0);
588                 else
589                         mv_gpio_value_set(dev, pin, 1);
590                 mv_gpio_out_en(dev, pin, 1);
591         }
592
593         if (mask & MV_GPIO_OUT_BLINK)
594                 mv_gpio_blink(dev, pin, flags & MV_GPIO_OUT_BLINK);
595         if (mask & MV_GPIO_IN_POL_LOW)
596                 mv_gpio_polarity(dev, pin, flags & MV_GPIO_IN_POL_LOW, 0);
597         if (mask & MV_GPIO_IN_DEBOUNCE) {
598                 error = mv_gpio_debounce_setup(dev, pin);
599                 if (error) {
600                         MV_GPIO_UNLOCK();
601                         return (error);
602                 }
603         }
604
605         sc->gpio_setup[pin].gp_flags &= ~(mask);
606         sc->gpio_setup[pin].gp_flags |= (flags & mask);
607
608         MV_GPIO_UNLOCK();
609
610         return (0);
611 }
612
613 static void
614 mv_gpio_double_edge_init(device_t dev, int pin)
615 {
616         uint8_t raw_read;
617         struct mv_gpio_softc *sc;
618         sc = (struct mv_gpio_softc *)device_get_softc(dev);
619
620         MV_GPIO_ASSERT_LOCKED();
621
622         raw_read = (mv_gpio_value_get(dev, pin, 1) ? 1 : 0);
623
624         if (raw_read)
625                 mv_gpio_polarity(dev, pin, 1, 0);
626         else
627                 mv_gpio_polarity(dev, pin, 0, 0);
628 }
629
630 static int
631 mv_gpio_debounce_setup(device_t dev, int pin)
632 {
633         struct callout *c;
634         struct mv_gpio_softc *sc;
635
636         sc = (struct mv_gpio_softc *)device_get_softc(dev);
637
638         MV_GPIO_ASSERT_LOCKED();
639
640         c = sc->debounce_callouts[pin];
641         if (c == NULL)
642                 return (ENXIO);
643
644         if (callout_active(c))
645                 callout_deactivate(c);
646
647         callout_stop(c);
648
649         return (0);
650 }
651
652 static int
653 mv_gpio_debounce_prepare(device_t dev, int pin)
654 {
655         struct callout *c;
656         struct mv_gpio_softc *sc;
657
658         sc = (struct mv_gpio_softc *)device_get_softc(dev);
659
660         c = sc->debounce_callouts[pin];
661         if (c == NULL) {
662                 c = (struct callout *)malloc(sizeof(struct callout),
663                     M_DEVBUF, M_WAITOK);
664                 sc->debounce_callouts[pin] = c;
665                 if (c == NULL)
666                         return (ENOMEM);
667                 callout_init(c, 1);
668         }
669
670         return (0);
671 }
672
673 static int
674 mv_gpio_debounce_init(device_t dev, int pin)
675 {
676         uint8_t raw_read;
677         int *cnt;
678         struct mv_gpio_softc *sc;
679
680         sc = (struct mv_gpio_softc *)device_get_softc(dev);
681
682         MV_GPIO_ASSERT_LOCKED();
683
684         cnt = &sc->debounce_counters[pin];
685         raw_read = (mv_gpio_value_get(dev, pin, 1) ? 1 : 0);
686         if (raw_read) {
687                 mv_gpio_polarity(dev, pin, 1, 0);
688                 *cnt = DEBOUNCE_HI_LO_MS / DEBOUNCE_CHECK_MS;
689         } else {
690                 mv_gpio_polarity(dev, pin, 0, 0);
691                 *cnt = DEBOUNCE_LO_HI_MS / DEBOUNCE_CHECK_MS;
692         }
693
694         mv_gpio_debounced_state_set(dev, pin, raw_read);
695
696         return (0);
697 }
698
699 static void
700 mv_gpio_debounce_start(device_t dev, int pin)
701 {
702         struct callout *c;
703         struct mv_gpio_pindev s = {dev, pin};
704         struct mv_gpio_pindev *sd;
705         struct mv_gpio_softc *sc;
706         sc = (struct mv_gpio_softc *)device_get_softc(dev);
707
708         MV_GPIO_ASSERT_LOCKED();
709
710         c = sc->debounce_callouts[pin];
711         if (c == NULL) {
712                 mv_gpio_int_ack(&s);
713                 return;
714         }
715
716         if (callout_pending(c) || callout_active(c)) {
717                 mv_gpio_int_ack(&s);
718                 return;
719         }
720
721         sd = (struct mv_gpio_pindev *)malloc(sizeof(struct mv_gpio_pindev),
722             M_DEVBUF, M_WAITOK);
723         if (sd == NULL) {
724                 mv_gpio_int_ack(&s);
725                 return;
726         }
727         sd->pin = pin;
728         sd->dev = dev;
729
730         callout_reset(c, DEBOUNCE_CHECK_TICKS, mv_gpio_debounce, sd);
731 }
732
733 static void
734 mv_gpio_debounce(void *arg)
735 {
736         uint8_t raw_read, last_state;
737         int pin;
738         device_t dev;
739         int *debounce_counter;
740         struct mv_gpio_softc *sc;
741         struct mv_gpio_pindev *s;
742
743         s = (struct mv_gpio_pindev *)arg;
744         dev = s->dev;
745         pin = s->pin;
746         sc = (struct mv_gpio_softc *)device_get_softc(dev);
747
748         MV_GPIO_LOCK();
749
750         raw_read = (mv_gpio_value_get(dev, pin, 1) ? 1 : 0);
751         last_state = (mv_gpio_debounced_state_get(dev, pin) ? 1 : 0);
752         debounce_counter = &sc->debounce_counters[pin];
753
754         if (raw_read == last_state) {
755                 if (last_state)
756                         *debounce_counter = DEBOUNCE_HI_LO_MS /
757                             DEBOUNCE_CHECK_MS;
758                 else
759                         *debounce_counter = DEBOUNCE_LO_HI_MS /
760                             DEBOUNCE_CHECK_MS;
761
762                 callout_reset(sc->debounce_callouts[pin],
763                     DEBOUNCE_CHECK_TICKS, mv_gpio_debounce, arg);
764         } else {
765                 *debounce_counter = *debounce_counter - 1;
766                 if (*debounce_counter != 0)
767                         callout_reset(sc->debounce_callouts[pin],
768                             DEBOUNCE_CHECK_TICKS, mv_gpio_debounce, arg);
769                 else {
770                         mv_gpio_debounced_state_set(dev, pin, raw_read);
771
772                         if (last_state)
773                                 *debounce_counter = DEBOUNCE_HI_LO_MS /
774                                     DEBOUNCE_CHECK_MS;
775                         else
776                                 *debounce_counter = DEBOUNCE_LO_HI_MS /
777                                     DEBOUNCE_CHECK_MS;
778
779                         if (((sc->gpio_setup[pin].gp_flags & MV_GPIO_IN_POL_LOW) &&
780                             (raw_read == 0)) ||
781                             (((sc->gpio_setup[pin].gp_flags & MV_GPIO_IN_POL_LOW) == 0) &&
782                             raw_read) ||
783                             (sc->gpio_setup[pin].gp_flags & MV_GPIO_IN_IRQ_DOUBLE_EDGE))
784                                 mv_gpio_intr_handler(dev, pin);
785
786                         /* Toggle polarity for next edge. */
787                         mv_gpio_polarity(dev, pin, 0, 1);
788
789                         free(arg, M_DEVBUF);
790                         callout_deactivate(sc->debounce_callouts[pin]);
791                 }
792         }
793
794         MV_GPIO_UNLOCK();
795 }
796
797 static void
798 mv_gpio_debounced_state_set(device_t dev, int pin, uint8_t new_state)
799 {
800         uint32_t *old_state;
801         struct mv_gpio_softc *sc;
802         sc = (struct mv_gpio_softc *)device_get_softc(dev);
803
804         MV_GPIO_ASSERT_LOCKED();
805
806         if (pin >= GPIO_PINS_PER_REG) {
807                 old_state = &sc->debounced_state_hi;
808                 pin -= GPIO_PINS_PER_REG;
809         } else
810                 old_state = &sc->debounced_state_lo;
811
812         if (new_state)
813                 *old_state |= (1 << pin);
814         else
815                 *old_state &= ~(1 << pin);
816 }
817
818 static uint32_t
819 mv_gpio_debounced_state_get(device_t dev, int pin)
820 {
821         uint32_t *state;
822         struct mv_gpio_softc *sc;
823         sc = (struct mv_gpio_softc *)device_get_softc(dev);
824
825         MV_GPIO_ASSERT_LOCKED();
826
827         if (pin >= GPIO_PINS_PER_REG) {
828                 state = &sc->debounced_state_hi;
829                 pin -= GPIO_PINS_PER_REG;
830         } else
831                 state = &sc->debounced_state_lo;
832
833         return (*state & (1 << pin));
834 }
835
836 void
837 mv_gpio_out(device_t dev, uint32_t pin, uint8_t val, uint8_t enable)
838 {
839         struct mv_gpio_softc *sc;
840         sc = (struct mv_gpio_softc *)device_get_softc(dev);
841
842         MV_GPIO_LOCK();
843
844         mv_gpio_value_set(dev, pin, val);
845         mv_gpio_out_en(dev, pin, enable);
846
847         MV_GPIO_UNLOCK();
848 }
849
850 uint8_t
851 mv_gpio_in(device_t dev, uint32_t pin)
852 {
853         uint8_t state;
854         struct mv_gpio_softc *sc;
855         sc = (struct mv_gpio_softc *)device_get_softc(dev);
856
857         MV_GPIO_ASSERT_LOCKED();
858
859         if (sc->gpio_setup[pin].gp_flags & MV_GPIO_IN_DEBOUNCE) {
860                 if (sc->gpio_setup[pin].gp_flags & MV_GPIO_IN_POL_LOW)
861                         state = (mv_gpio_debounced_state_get(dev, pin) ? 0 : 1);
862                 else
863                         state = (mv_gpio_debounced_state_get(dev, pin) ? 1 : 0);
864         } else if (sc->gpio_setup[pin].gp_flags & MV_GPIO_IN_IRQ_DOUBLE_EDGE) {
865                 if (sc->gpio_setup[pin].gp_flags & MV_GPIO_IN_POL_LOW)
866                         state = (mv_gpio_value_get(dev, pin, 1) ? 0 : 1);
867                 else
868                         state = (mv_gpio_value_get(dev, pin, 1) ? 1 : 0);
869         } else
870                 state = (mv_gpio_value_get(dev, pin, 0) ? 1 : 0);
871
872         return (state);
873 }
874
875 static uint32_t
876 mv_gpio_reg_read(device_t dev, uint32_t reg)
877 {
878         struct mv_gpio_softc *sc;
879         sc = (struct mv_gpio_softc *)device_get_softc(dev);
880
881         return (bus_space_read_4(sc->bst, sc->bsh, sc->offset + reg));
882 }
883
884 static void
885 mv_gpio_reg_write(device_t dev, uint32_t reg, uint32_t val)
886 {
887         struct mv_gpio_softc *sc;
888         sc = (struct mv_gpio_softc *)device_get_softc(dev);
889
890         bus_space_write_4(sc->bst, sc->bsh, sc->offset + reg, val);
891 }
892
893 static void
894 mv_gpio_reg_set(device_t dev, uint32_t reg, uint32_t pin)
895 {
896         uint32_t reg_val;
897
898         reg_val = mv_gpio_reg_read(dev, reg);
899         reg_val |= GPIO(pin);
900         mv_gpio_reg_write(dev, reg, reg_val);
901 }
902
903 static void
904 mv_gpio_reg_clear(device_t dev, uint32_t reg, uint32_t pin)
905 {
906         uint32_t reg_val;
907
908         reg_val = mv_gpio_reg_read(dev, reg);
909         reg_val &= ~(GPIO(pin));
910         mv_gpio_reg_write(dev, reg, reg_val);
911 }
912
913 static void
914 mv_gpio_out_en(device_t dev, uint32_t pin, uint8_t enable)
915 {
916         uint32_t reg;
917         struct mv_gpio_softc *sc;
918         sc = (struct mv_gpio_softc *)device_get_softc(dev);
919
920         if (pin >= sc->pin_num)
921                 return;
922
923         reg = GPIO_DATA_OUT_EN_CTRL;
924
925         if (enable)
926                 mv_gpio_reg_clear(dev, reg, pin);
927         else
928                 mv_gpio_reg_set(dev, reg, pin);
929 }
930
931 static void
932 mv_gpio_blink(device_t dev, uint32_t pin, uint8_t enable)
933 {
934         uint32_t reg;
935         struct mv_gpio_softc *sc;
936         sc = (struct mv_gpio_softc *)device_get_softc(dev);
937
938         if (pin >= sc->pin_num)
939                 return;
940
941         reg = GPIO_BLINK_EN;
942
943         if (enable)
944                 mv_gpio_reg_set(dev, reg, pin);
945         else
946                 mv_gpio_reg_clear(dev, reg, pin);
947 }
948
949 static void
950 mv_gpio_polarity(device_t dev, uint32_t pin, uint8_t enable, uint8_t toggle)
951 {
952         uint32_t reg, reg_val;
953         struct mv_gpio_softc *sc;
954         sc = (struct mv_gpio_softc *)device_get_softc(dev);
955
956         if (pin >= sc->pin_num)
957                 return;
958
959         reg = GPIO_DATA_IN_POLAR;
960
961         if (toggle) {
962                 reg_val = mv_gpio_reg_read(dev, reg) & GPIO(pin);
963                 if (reg_val)
964                         mv_gpio_reg_clear(dev, reg, pin);
965                 else
966                         mv_gpio_reg_set(dev, reg, pin);
967         } else if (enable)
968                 mv_gpio_reg_set(dev, reg, pin);
969         else
970                 mv_gpio_reg_clear(dev, reg, pin);
971 }
972
973 static void
974 mv_gpio_level(device_t dev, uint32_t pin, uint8_t enable)
975 {
976         uint32_t reg;
977         struct mv_gpio_softc *sc;
978         sc = (struct mv_gpio_softc *)device_get_softc(dev);
979
980         if (pin >= sc->pin_num)
981                 return;
982
983         reg = GPIO_INT_LEV_MASK;
984
985         if (enable)
986                 mv_gpio_reg_set(dev, reg, pin);
987         else
988                 mv_gpio_reg_clear(dev, reg, pin);
989 }
990
991 static void
992 mv_gpio_edge(device_t dev, uint32_t pin, uint8_t enable)
993 {
994         uint32_t reg;
995         struct mv_gpio_softc *sc;
996         sc = (struct mv_gpio_softc *)device_get_softc(dev);
997
998         if (pin >= sc->pin_num)
999                 return;
1000
1001         reg = GPIO_INT_EDGE_MASK;
1002
1003         if (enable)
1004                 mv_gpio_reg_set(dev, reg, pin);
1005         else
1006                 mv_gpio_reg_clear(dev, reg, pin);
1007 }
1008
1009 static void
1010 mv_gpio_int_ack(struct mv_gpio_pindev *s)
1011 {
1012         uint32_t reg, pin;
1013         struct mv_gpio_softc *sc;
1014         sc = (struct mv_gpio_softc *)device_get_softc(s->dev);
1015         pin = s->pin;
1016
1017         if (pin >= sc->pin_num)
1018                 return;
1019
1020         reg = GPIO_INT_CAUSE;
1021
1022         mv_gpio_reg_clear(s->dev, reg, pin);
1023 }
1024
1025 static uint32_t
1026 mv_gpio_value_get(device_t dev, uint32_t pin, uint8_t exclude_polar)
1027 {
1028         uint32_t reg, polar_reg, reg_val, polar_reg_val;
1029         struct mv_gpio_softc *sc;
1030         sc = (struct mv_gpio_softc *)device_get_softc(dev);
1031
1032         if (pin >= sc->pin_num)
1033                 return (0);
1034
1035         reg = GPIO_DATA_IN;
1036         polar_reg = GPIO_DATA_IN_POLAR;
1037
1038         reg_val = mv_gpio_reg_read(dev, reg);
1039
1040         if (exclude_polar) {
1041                 polar_reg_val = mv_gpio_reg_read(dev, polar_reg);
1042                 return ((reg_val & GPIO(pin)) ^ (polar_reg_val & GPIO(pin)));
1043         } else
1044                 return (reg_val & GPIO(pin));
1045 }
1046
1047 static void
1048 mv_gpio_value_set(device_t dev, uint32_t pin, uint8_t val)
1049 {
1050         uint32_t reg;
1051         struct mv_gpio_softc *sc;
1052         sc = (struct mv_gpio_softc *)device_get_softc(dev);
1053
1054         MV_GPIO_ASSERT_LOCKED();
1055
1056         if (pin >= sc->pin_num)
1057                 return;
1058
1059         reg = GPIO_DATA_OUT;
1060
1061         if (val)
1062                 mv_gpio_reg_set(dev, reg, pin);
1063         else
1064                 mv_gpio_reg_clear(dev, reg, pin);
1065 }
1066
1067 /*
1068  * GPIO interface methods
1069  */
1070
1071 static int
1072 mv_gpio_pin_max(device_t dev, int *maxpin)
1073 {
1074         struct mv_gpio_softc *sc;
1075         if (maxpin == NULL)
1076                 return (EINVAL);
1077
1078         sc = device_get_softc(dev);
1079         *maxpin = sc->pin_num;
1080
1081         return (0);
1082 }
1083
1084 static int
1085 mv_gpio_pin_getcaps(device_t dev, uint32_t pin, uint32_t *caps)
1086 {
1087         struct mv_gpio_softc *sc = device_get_softc(dev);
1088         if (caps == NULL)
1089                 return (EINVAL);
1090
1091         if (pin >= sc->pin_num)
1092                 return (EINVAL);
1093
1094         MV_GPIO_LOCK();
1095         *caps = sc->gpio_setup[pin].gp_caps;
1096         MV_GPIO_UNLOCK();
1097
1098         return (0);
1099 }
1100
1101 static int
1102 mv_gpio_pin_getflags(device_t dev, uint32_t pin, uint32_t *flags)
1103 {
1104         struct mv_gpio_softc *sc = device_get_softc(dev);
1105         if (flags == NULL)
1106                 return (EINVAL);
1107
1108         if (pin >= sc->pin_num)
1109                 return (EINVAL);
1110
1111         MV_GPIO_LOCK();
1112         *flags = sc->gpio_setup[pin].gp_flags;
1113         MV_GPIO_UNLOCK();
1114
1115         return (0);
1116 }
1117
1118 static int
1119 mv_gpio_pin_getname(device_t dev, uint32_t pin, char *name)
1120 {
1121         struct mv_gpio_softc *sc = device_get_softc(dev);
1122         if (name == NULL)
1123                 return (EINVAL);
1124
1125         if (pin >= sc->pin_num)
1126                 return (EINVAL);
1127
1128         MV_GPIO_LOCK();
1129         memcpy(name, sc->gpio_setup[pin].gp_name, GPIOMAXNAME);
1130         MV_GPIO_UNLOCK();
1131
1132         return (0);
1133 }
1134
1135 static int
1136 mv_gpio_pin_setflags(device_t dev, uint32_t pin, uint32_t flags)
1137 {
1138         int ret;
1139         struct mv_gpio_softc *sc = device_get_softc(dev);
1140         if (pin >= sc->pin_num)
1141                 return (EINVAL);
1142
1143         /* Check for unwanted flags. */
1144         if ((flags & sc->gpio_setup[pin].gp_caps) != flags)
1145                 return (EINVAL);
1146
1147         ret = mv_gpio_configure(dev, pin, flags, ~0);
1148
1149         return (ret);
1150 }
1151
1152 static int
1153 mv_gpio_pin_set(device_t dev, uint32_t pin, unsigned int value)
1154 {
1155         struct mv_gpio_softc *sc = device_get_softc(dev);
1156         if (pin >= sc->pin_num)
1157                 return (EINVAL);
1158
1159         MV_GPIO_LOCK();
1160         mv_gpio_value_set(dev, pin, value);
1161         MV_GPIO_UNLOCK();
1162
1163         return (0);
1164 }
1165
1166 static int
1167 mv_gpio_pin_get(device_t dev, uint32_t pin, unsigned int *value)
1168 {
1169         struct mv_gpio_softc *sc = device_get_softc(dev);
1170         if (value == NULL)
1171                 return (EINVAL);
1172
1173         if (pin >= sc->pin_num)
1174                 return (EINVAL);
1175
1176         MV_GPIO_LOCK();
1177         *value = mv_gpio_in(dev, pin);
1178         MV_GPIO_UNLOCK();
1179
1180         return (0);
1181 }
1182
1183 static int
1184 mv_gpio_pin_toggle(device_t dev, uint32_t pin)
1185 {
1186         struct mv_gpio_softc *sc = device_get_softc(dev);
1187         uint32_t value;
1188         if (pin >= sc->pin_num)
1189                 return (EINVAL);
1190
1191         MV_GPIO_LOCK();
1192         value = mv_gpio_in(dev, pin);
1193         value = (~value) & 1;
1194         mv_gpio_value_set(dev, pin, value);
1195         MV_GPIO_UNLOCK();
1196
1197         return (0);
1198 }
1199
1200 static device_t
1201 mv_gpio_get_bus(device_t dev)
1202 {
1203         struct mv_gpio_softc *sc = device_get_softc(dev);
1204
1205         return (sc->sc_busdev);
1206 }
1207
1208 static int
1209 mv_gpio_map_gpios(device_t bus, phandle_t dev, phandle_t gparent, int gcells,
1210     pcell_t *gpios, uint32_t *pin, uint32_t *flags)
1211 {
1212         struct mv_gpio_softc *sc = device_get_softc(bus);
1213
1214         if (gpios[0] >= sc->pin_num)
1215                 return (EINVAL);
1216
1217         *pin = gpios[0];
1218         *flags = gpios[1];
1219         mv_gpio_configure(bus, *pin, *flags, ~0);
1220
1221         return (0);
1222 }