Lines Matching +full:clear +full:- +full:gpios

1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
158 #define MV_GPIO_LOCK() mtx_lock_spin(&sc->mutex)
159 #define MV_GPIO_UNLOCK() mtx_unlock_spin(&sc->mutex)
160 #define MV_GPIO_ASSERT_LOCKED() mtx_assert(&sc->mutex, MA_OWNED)
192 { "marvell,orion-gpio", 1 },
202 if (ofw_bus_search_compatible(dev, compat_data)->ocd_data == 0) in mv_gpio_probe()
219 device_printf(sc->dev, "No interrupt-parrent found. " in mv_gpio_setup_interrupts()
223 /* While at parent - store interrupt cells prop */ in mv_gpio_setup_interrupts()
225 "#interrupt-cells", &irq_cells, sizeof(irq_cells)) == -1) { in mv_gpio_setup_interrupts()
226 device_printf(sc->dev, "DTB: Missing #interrupt-cells " in mv_gpio_setup_interrupts()
233 if (size != -1) { in mv_gpio_setup_interrupts()
236 sc->irq_num = size; in mv_gpio_setup_interrupts()
237 device_printf(sc->dev, "%d IRQs available\n", sc->irq_num); in mv_gpio_setup_interrupts()
239 device_printf(sc->dev, "ERROR: no interrupts entry found!\n"); in mv_gpio_setup_interrupts()
243 for (i = 0; i < sc->irq_num; i++) { in mv_gpio_setup_interrupts()
244 sc->irq_rid[i] = i; in mv_gpio_setup_interrupts()
245 sc->irq_res[i] = bus_alloc_resource_any(sc->dev, SYS_RES_IRQ, in mv_gpio_setup_interrupts()
246 &sc->irq_rid[i], RF_ACTIVE); in mv_gpio_setup_interrupts()
247 if (!sc->irq_res[i]) { in mv_gpio_setup_interrupts()
248 mtx_destroy(&sc->mutex); in mv_gpio_setup_interrupts()
249 device_printf(sc->dev, in mv_gpio_setup_interrupts()
255 device_printf(sc->dev, "Disable interrupts (offset = %x + EDGE(0x18)\n", sc->offset); in mv_gpio_setup_interrupts()
257 bus_space_write_4(sc->bst, sc->bsh, sc->offset + GPIO_INT_EDGE_MASK, 0); in mv_gpio_setup_interrupts()
258 device_printf(sc->dev, "Disable interrupts (offset = %x + LEV(0x1C))\n", sc->offset); in mv_gpio_setup_interrupts()
259 bus_space_write_4(sc->bst, sc->bsh, sc->offset + GPIO_INT_LEV_MASK, 0); in mv_gpio_setup_interrupts()
261 for (i = 0; i < sc->irq_num; i++) { in mv_gpio_setup_interrupts()
262 device_printf(sc->dev, "Setup intr %d\n", i); in mv_gpio_setup_interrupts()
263 if (bus_setup_intr(sc->dev, sc->irq_res[i], in mv_gpio_setup_interrupts()
266 sc, &sc->ih_cookie[i]) != 0) { in mv_gpio_setup_interrupts()
267 mtx_destroy(&sc->mutex); in mv_gpio_setup_interrupts()
268 bus_release_resource(sc->dev, SYS_RES_IRQ, in mv_gpio_setup_interrupts()
269 sc->irq_rid[i], sc->irq_res[i]); in mv_gpio_setup_interrupts()
270 device_printf(sc->dev, "could not set up intr %d\n", i); in mv_gpio_setup_interrupts()
275 /* Clear interrupt status. */ in mv_gpio_setup_interrupts()
276 device_printf(sc->dev, "Clear int status (offset = %x)\n", sc->offset); in mv_gpio_setup_interrupts()
277 bus_space_write_4(sc->bst, sc->bsh, sc->offset + GPIO_INT_CAUSE, 0); in mv_gpio_setup_interrupts()
279 sc->debounce_callouts = (struct callout **)malloc(sc->pin_num * in mv_gpio_setup_interrupts()
281 if (sc->debounce_callouts == NULL) in mv_gpio_setup_interrupts()
284 sc->debounce_counters = (int *)malloc(sc->pin_num * sizeof(int), in mv_gpio_setup_interrupts()
286 if (sc->debounce_counters == NULL) in mv_gpio_setup_interrupts()
305 sc->dev = dev; in mv_gpio_attach()
307 if (OF_getencprop(node, "pin-count", &pincnt, sizeof(pcell_t)) >= 0 || in mv_gpio_attach()
309 sc->pin_num = MIN(pincnt, MV_GPIO_MAX_NPINS); in mv_gpio_attach()
311 device_printf(dev, "%d pins available\n", sc->pin_num); in mv_gpio_attach()
313 device_printf(dev, "ERROR: no pin-count or ngpios entry found!\n"); in mv_gpio_attach()
317 if (OF_getencprop(node, "offset", &sc->offset, sizeof(sc->offset)) == -1) in mv_gpio_attach()
318 sc->offset = 0; in mv_gpio_attach()
321 for(i = 0; i < sc->pin_num; i++) in mv_gpio_attach()
322 sc->gpio_setup[i].gp_caps = GPIO_GENERIC_CAP; in mv_gpio_attach()
324 mtx_init(&sc->mutex, device_get_nameunit(dev), NULL, MTX_SPIN); in mv_gpio_attach()
326 sc->mem_rid = 0; in mv_gpio_attach()
327 sc->mem_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &sc->mem_rid, in mv_gpio_attach()
330 if (!sc->mem_res) { in mv_gpio_attach()
331 mtx_destroy(&sc->mutex); in mv_gpio_attach()
336 sc->bst = rman_get_bustag(sc->mem_res); in mv_gpio_attach()
337 sc->bsh = rman_get_bushandle(sc->mem_res); in mv_gpio_attach()
343 sc->sc_busdev = gpiobus_add_bus(dev); in mv_gpio_attach()
344 if (sc->sc_busdev == NULL) { in mv_gpio_attach()
345 mtx_destroy(&sc->mutex); in mv_gpio_attach()
347 sc->irq_rid[i], sc->irq_res[i]); in mv_gpio_attach()
415 if (pin < 0 || pin >= sc->pin_num) in mv_gpio_setup_intrhandler()
417 event = sc->gpio_events[pin]; in mv_gpio_setup_intrhandler()
420 if (sc->gpio_setup[pin].gp_flags & MV_GPIO_IN_DEBOUNCE) { in mv_gpio_setup_intrhandler()
426 } else if (sc->gpio_setup[pin].gp_flags & MV_GPIO_IN_IRQ_DOUBLE_EDGE) in mv_gpio_setup_intrhandler()
437 sc->gpio_events[pin] = event; in mv_gpio_setup_intrhandler()
449 sc = (struct mv_gpio_softc *)device_get_softc(s->dev); in mv_gpio_intr_mask()
451 if (s->pin >= sc->pin_num) in mv_gpio_intr_mask()
456 if (sc->gpio_setup[s->pin].gp_flags & (MV_GPIO_IN_IRQ_EDGE | in mv_gpio_intr_mask()
458 mv_gpio_edge(s->dev, s->pin, 0); in mv_gpio_intr_mask()
460 mv_gpio_level(s->dev, s->pin, 0); in mv_gpio_intr_mask()
479 sc = (struct mv_gpio_softc *)device_get_softc(s->dev); in mv_gpio_intr_unmask()
481 if (s->pin >= sc->pin_num) in mv_gpio_intr_unmask()
486 if (sc->gpio_setup[s->pin].gp_flags & (MV_GPIO_IN_IRQ_EDGE | in mv_gpio_intr_unmask()
488 mv_gpio_edge(s->dev, s->pin, 1); in mv_gpio_intr_unmask()
490 mv_gpio_level(s->dev, s->pin, 1); in mv_gpio_intr_unmask()
510 if (sc->gpio_setup[pin].gp_flags & MV_GPIO_IN_DEBOUNCE) in mv_gpio_exec_intr_handlers()
512 else if (sc->gpio_setup[pin].gp_flags & MV_GPIO_IN_IRQ_DOUBLE_EDGE) { in mv_gpio_exec_intr_handlers()
535 isrc.isrc_event = sc->gpio_events[pin]; in mv_gpio_intr_handler()
538 CK_SLIST_EMPTY(&isrc.isrc_event->ie_handlers)) in mv_gpio_intr_handler()
552 if (pin >= sc->pin_num) in mv_gpio_configure()
561 if (sc->irq_num == 0) in mv_gpio_configure()
592 sc->gpio_setup[pin].gp_flags &= ~(mask); in mv_gpio_configure()
593 sc->gpio_setup[pin].gp_flags |= (flags & mask); in mv_gpio_configure()
627 c = sc->debounce_callouts[pin]; in mv_gpio_debounce_setup()
647 c = sc->debounce_callouts[pin]; in mv_gpio_debounce_prepare()
651 sc->debounce_callouts[pin] = c; in mv_gpio_debounce_prepare()
671 cnt = &sc->debounce_counters[pin]; in mv_gpio_debounce_init()
697 c = sc->debounce_callouts[pin]; in mv_gpio_debounce_start()
714 sd->pin = pin; in mv_gpio_debounce_start()
715 sd->dev = dev; in mv_gpio_debounce_start()
731 dev = s->dev; in mv_gpio_debounce()
732 pin = s->pin; in mv_gpio_debounce()
739 debounce_counter = &sc->debounce_counters[pin]; in mv_gpio_debounce()
749 callout_reset(sc->debounce_callouts[pin], in mv_gpio_debounce()
752 *debounce_counter = *debounce_counter - 1; in mv_gpio_debounce()
754 callout_reset(sc->debounce_callouts[pin], in mv_gpio_debounce()
766 if (((sc->gpio_setup[pin].gp_flags & MV_GPIO_IN_POL_LOW) && in mv_gpio_debounce()
768 (((sc->gpio_setup[pin].gp_flags & MV_GPIO_IN_POL_LOW) == 0) && in mv_gpio_debounce()
770 (sc->gpio_setup[pin].gp_flags & MV_GPIO_IN_IRQ_DOUBLE_EDGE)) in mv_gpio_debounce()
777 callout_deactivate(sc->debounce_callouts[pin]); in mv_gpio_debounce()
794 old_state = &sc->debounced_state_hi; in mv_gpio_debounced_state_set()
795 pin -= GPIO_PINS_PER_REG; in mv_gpio_debounced_state_set()
797 old_state = &sc->debounced_state_lo; in mv_gpio_debounced_state_set()
815 state = &sc->debounced_state_hi; in mv_gpio_debounced_state_get()
816 pin -= GPIO_PINS_PER_REG; in mv_gpio_debounced_state_get()
818 state = &sc->debounced_state_lo; in mv_gpio_debounced_state_get()
846 if (sc->gpio_setup[pin].gp_flags & MV_GPIO_IN_DEBOUNCE) { in mv_gpio_in()
847 if (sc->gpio_setup[pin].gp_flags & MV_GPIO_IN_POL_LOW) in mv_gpio_in()
851 } else if (sc->gpio_setup[pin].gp_flags & MV_GPIO_IN_IRQ_DOUBLE_EDGE) { in mv_gpio_in()
852 if (sc->gpio_setup[pin].gp_flags & MV_GPIO_IN_POL_LOW) in mv_gpio_in()
868 return (bus_space_read_4(sc->bst, sc->bsh, sc->offset + reg)); in mv_gpio_reg_read()
877 bus_space_write_4(sc->bst, sc->bsh, sc->offset + reg, val); in mv_gpio_reg_write()
907 if (pin >= sc->pin_num) in mv_gpio_out_en()
925 if (pin >= sc->pin_num) in mv_gpio_blink()
943 if (pin >= sc->pin_num) in mv_gpio_polarity()
967 if (pin >= sc->pin_num) in mv_gpio_level()
985 if (pin >= sc->pin_num) in mv_gpio_edge()
1001 sc = (struct mv_gpio_softc *)device_get_softc(s->dev); in mv_gpio_int_ack()
1002 pin = s->pin; in mv_gpio_int_ack()
1004 if (pin >= sc->pin_num) in mv_gpio_int_ack()
1009 mv_gpio_reg_clear(s->dev, reg, pin); in mv_gpio_int_ack()
1019 if (pin >= sc->pin_num) in mv_gpio_value_get()
1043 if (pin >= sc->pin_num) in mv_gpio_value_set()
1066 *maxpin = sc->pin_num; in mv_gpio_pin_max()
1078 if (pin >= sc->pin_num) in mv_gpio_pin_getcaps()
1082 *caps = sc->gpio_setup[pin].gp_caps; in mv_gpio_pin_getcaps()
1095 if (pin >= sc->pin_num) in mv_gpio_pin_getflags()
1099 *flags = sc->gpio_setup[pin].gp_flags; in mv_gpio_pin_getflags()
1112 if (pin >= sc->pin_num) in mv_gpio_pin_getname()
1116 memcpy(name, sc->gpio_setup[pin].gp_name, GPIOMAXNAME); in mv_gpio_pin_getname()
1127 if (pin >= sc->pin_num) in mv_gpio_pin_setflags()
1131 if ((flags & sc->gpio_setup[pin].gp_caps) != flags) in mv_gpio_pin_setflags()
1143 if (pin >= sc->pin_num) in mv_gpio_pin_set()
1160 if (pin >= sc->pin_num) in mv_gpio_pin_get()
1175 if (pin >= sc->pin_num) in mv_gpio_pin_toggle()
1192 return (sc->sc_busdev); in mv_gpio_get_bus()
1197 pcell_t *gpios, uint32_t *pin, uint32_t *flags) in mv_gpio_map_gpios() argument
1201 if (gpios[0] >= sc->pin_num) in mv_gpio_map_gpios()
1204 *pin = gpios[0]; in mv_gpio_map_gpios()
1205 *flags = gpios[1]; in mv_gpio_map_gpios()