Lines Matching +full:gpio +full:- +full:cfg

1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
5 * Copyright (c) 2012-2015 Luiz Otavio O Souza <loos@FreeBSD.org>
36 #include <sys/gpio.h>
43 #include <dev/gpio/gpiobusvar.h>
62 #define RPI_FW_GPIO_LOCK(_sc) sx_xlock(&(_sc)->sc_sx)
63 #define RPI_FW_GPIO_UNLOCK(_sc) sx_xunlock(&(_sc)->sc_sx)
66 {"raspberrypi,firmware-gpio", 1},
80 old_cfg.req.gpio = RPI_FW_GPIO_BASE + pin->gp_pin; in rpi_fw_gpio_pin_configure()
83 rv = bcm2835_firmware_property(sc->sc_firmware, in rpi_fw_gpio_pin_configure()
85 if (rv == 0 && old_cfg.resp.gpio != 0) in rpi_fw_gpio_pin_configure()
90 new_cfg.req.gpio = RPI_FW_GPIO_BASE + pin->gp_pin; in rpi_fw_gpio_pin_configure()
94 pin->gp_flags = GPIO_PIN_INPUT; in rpi_fw_gpio_pin_configure()
100 sc->sc_gpio_state |= (1 << pin->gp_pin); in rpi_fw_gpio_pin_configure()
103 sc->sc_gpio_state &= ~(1 << pin->gp_pin); in rpi_fw_gpio_pin_configure()
106 if ((sc->sc_gpio_state & (1 << pin->gp_pin)) != 0) { in rpi_fw_gpio_pin_configure()
112 pin->gp_flags = GPIO_PIN_OUTPUT; in rpi_fw_gpio_pin_configure()
116 if ((sc->sc_gpio_state & (1 << pin->gp_pin)) != 0) in rpi_fw_gpio_pin_configure()
125 rv = bcm2835_firmware_property(sc->sc_firmware, in rpi_fw_gpio_pin_configure()
141 return (sc->sc_busdev); in rpi_fw_gpio_get_bus()
148 *maxpin = RPI_FW_GPIO_PINS - 1; in rpi_fw_gpio_pin_max()
160 if (sc->sc_gpio_pins[i].gp_pin == pin) in rpi_fw_gpio_pin_getcaps()
178 if (sc->sc_gpio_pins[i].gp_pin == pin) in rpi_fw_gpio_pin_getflags()
186 *flags = sc->sc_gpio_pins[i].gp_flags; in rpi_fw_gpio_pin_getflags()
200 if (sc->sc_gpio_pins[i].gp_pin == pin) in rpi_fw_gpio_pin_getname()
208 memcpy(name, sc->sc_gpio_pins[i].gp_name, GPIOMAXNAME); in rpi_fw_gpio_pin_getname()
222 if (sc->sc_gpio_pins[i].gp_pin == pin) in rpi_fw_gpio_pin_setflags()
229 return (rpi_fw_gpio_pin_configure(sc, &sc->sc_gpio_pins[i], flags)); in rpi_fw_gpio_pin_setflags()
241 if (sc->sc_gpio_pins[i].gp_pin == pin) in rpi_fw_gpio_pin_set()
247 state.req.gpio = RPI_FW_GPIO_BASE + pin; in rpi_fw_gpio_pin_set()
251 rv = bcm2835_firmware_property(sc->sc_firmware, in rpi_fw_gpio_pin_set()
253 /* The firmware sets gpio to 0 on success */ in rpi_fw_gpio_pin_set()
254 if (rv == 0 && state.resp.gpio != 0) in rpi_fw_gpio_pin_set()
257 sc->sc_gpio_pins[i].gp_flags &= ~(GPIO_PIN_PRESET_HIGH | in rpi_fw_gpio_pin_set()
260 sc->sc_gpio_state |= (1 << i); in rpi_fw_gpio_pin_set()
262 sc->sc_gpio_state &= ~(1 << i); in rpi_fw_gpio_pin_set()
278 if (sc->sc_gpio_pins[i].gp_pin == pin) in rpi_fw_gpio_pin_get()
285 state.req.gpio = RPI_FW_GPIO_BASE + pin; in rpi_fw_gpio_pin_get()
288 rv = bcm2835_firmware_property(sc->sc_firmware, in rpi_fw_gpio_pin_get()
292 /* The firmware sets gpio to 0 on success */ in rpi_fw_gpio_pin_get()
293 if (rv == 0 && state.resp.gpio != 0) in rpi_fw_gpio_pin_get()
311 if (sc->sc_gpio_pins[i].gp_pin == pin) in rpi_fw_gpio_pin_toggle()
320 old_state.req.gpio = RPI_FW_GPIO_BASE + pin; in rpi_fw_gpio_pin_toggle()
321 new_state.req.gpio = RPI_FW_GPIO_BASE + pin; in rpi_fw_gpio_pin_toggle()
324 rv = bcm2835_firmware_property(sc->sc_firmware, in rpi_fw_gpio_pin_toggle()
326 /* The firmware sets gpio to 0 on success */ in rpi_fw_gpio_pin_toggle()
327 if (rv == 0 && old_state.resp.gpio == 0) { in rpi_fw_gpio_pin_toggle()
328 /* Set the new state to invert the GPIO */ in rpi_fw_gpio_pin_toggle()
330 rv = bcm2835_firmware_property(sc->sc_firmware, in rpi_fw_gpio_pin_toggle()
334 if (rv == 0 && (old_state.resp.gpio != 0 || new_state.resp.gpio != 0)) in rpi_fw_gpio_pin_toggle()
348 if (ofw_bus_search_compatible(dev, compat_data)->ocd_data == 0) in rpi_fw_gpio_probe()
351 device_set_desc(dev, "Raspberry Pi Firmware GPIO controller"); in rpi_fw_gpio_probe()
358 union msg_get_gpio_config cfg; in rpi_fw_gpio_attach() local
361 phandle_t gpio; in rpi_fw_gpio_attach() local
365 sc->sc_firmware = device_get_parent(dev); in rpi_fw_gpio_attach()
366 sx_init(&sc->sc_sx, "Raspberry Pi firmware gpio"); in rpi_fw_gpio_attach()
368 gpio = ofw_bus_get_node(dev); in rpi_fw_gpio_attach()
369 if (!OF_hasprop(gpio, "gpio-controller")) in rpi_fw_gpio_attach()
370 /* This is not a GPIO controller. */ in rpi_fw_gpio_attach()
373 nelems = OF_getprop_alloc(gpio, "gpio-line-names", (void **)&names); in rpi_fw_gpio_attach()
381 snprintf(sc->sc_gpio_pins[i].gp_name, GPIOMAXNAME, in rpi_fw_gpio_attach()
386 snprintf(sc->sc_gpio_pins[i].gp_name, GPIOMAXNAME, in rpi_fw_gpio_attach()
390 sc->sc_gpio_pins[i].gp_pin = i; in rpi_fw_gpio_attach()
391 sc->sc_gpio_pins[i].gp_caps = RPI_FW_GPIO_DEFAULT_CAPS; in rpi_fw_gpio_attach()
393 bzero(&cfg, sizeof(cfg)); in rpi_fw_gpio_attach()
394 cfg.req.gpio = RPI_FW_GPIO_BASE + i; in rpi_fw_gpio_attach()
395 rv = bcm2835_firmware_property(sc->sc_firmware, in rpi_fw_gpio_attach()
396 BCM2835_FIRMWARE_TAG_GET_GPIO_CONFIG, &cfg, sizeof(cfg)); in rpi_fw_gpio_attach()
397 if (rv == 0 && cfg.resp.gpio == 0) { in rpi_fw_gpio_attach()
398 if (cfg.resp.dir == BCM2835_FIRMWARE_GPIO_IN) in rpi_fw_gpio_attach()
399 sc->sc_gpio_pins[i].gp_flags = GPIO_PIN_INPUT; in rpi_fw_gpio_attach()
401 sc->sc_gpio_pins[i].gp_flags = GPIO_PIN_OUTPUT; in rpi_fw_gpio_attach()
403 sc->sc_gpio_pins[i].gp_flags = GPIO_PIN_INPUT; in rpi_fw_gpio_attach()
407 sc->sc_busdev = gpiobus_attach_bus(dev); in rpi_fw_gpio_attach()
408 if (sc->sc_busdev == NULL) in rpi_fw_gpio_attach()
414 sx_destroy(&sc->sc_sx); in rpi_fw_gpio_attach()
432 /* GPIO protocol */
447 "gpio",