Lines Matching +full:pin +full:- +full:group

1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
4 * Copyright (c) 2016-2023 Stormshield
48 #define GPIO_LOCK_INIT(_sc) mtx_init(&(_sc)->mtx, \
50 #define GPIO_LOCK_DESTROY(_sc) mtx_destroy(&(_sc)->mtx)
51 #define GPIO_LOCK(_sc) mtx_lock(&(_sc)->mtx)
52 #define GPIO_UNLOCK(_sc) mtx_unlock(&(_sc)->mtx)
53 #define GPIO_ASSERT_LOCKED(_sc) mtx_assert(&(_sc)->mtx, MA_OWNED)
54 #define GPIO_ASSERT_UNLOCKED(_sc) mtx_assert(&(_sc)->mtx, MA_NOTOWNED)
118 ftgpio_group_get_ioreg(struct ftgpio_softc *sc, uint8_t reg, unsigned group) in ftgpio_group_get_ioreg() argument
122 KASSERT((group == 0 && REG_OUTPUT_DATA <= reg && reg <= REG_INTERRUPT_STATUS) || \ in ftgpio_group_get_ioreg()
123 (group >= 1 && reg <= REG_DRIVE_ENABLE), in ftgpio_group_get_ioreg()
124 ("%s: invalid register %u for group %u", __func__, reg, group)); in ftgpio_group_get_ioreg()
125 ioreg = (((0xf - group) << 4) + reg); in ftgpio_group_get_ioreg()
130 ftgpio_group_get_output(struct ftgpio_softc *sc, unsigned group) in ftgpio_group_get_output() argument
134 ioreg = ftgpio_group_get_ioreg(sc, REG_OUTPUT_DATA, group); in ftgpio_group_get_output()
135 val = superio_read(sc->dev, ioreg); in ftgpio_group_get_output()
136 FTGPIO_VERBOSE_PRINTF(sc->dev, "group GPIO%u output is 0x%x (ioreg=0x%x)\n", in ftgpio_group_get_output()
137 group, val, ioreg); in ftgpio_group_get_output()
142 ftgpio_group_set_output(struct ftgpio_softc *sc, unsigned group, uint8_t group_value) in ftgpio_group_set_output() argument
146 ioreg = ftgpio_group_get_ioreg(sc, REG_OUTPUT_DATA, group); in ftgpio_group_set_output()
147 superio_write(sc->dev, ioreg, group_value); in ftgpio_group_set_output()
148 FTGPIO_VERBOSE_PRINTF(sc->dev, "set group GPIO%u output to 0x%x (ioreg=0x%x)\n", in ftgpio_group_set_output()
149 group, group_value, ioreg); in ftgpio_group_set_output()
153 ftgpio_group_get_status(struct ftgpio_softc *sc, unsigned group) in ftgpio_group_get_status() argument
157 ioreg = ftgpio_group_get_ioreg(sc, REG_PIN_STATUS, group); in ftgpio_group_get_status()
158 return (superio_read(sc->dev, ioreg)); in ftgpio_group_get_status()
166 unsigned group, index; in ftgpio_pin_write() local
170 group = FTGPIO_PIN_GETGROUP(pin_num); in ftgpio_pin_write()
171 pin_flags = sc->pins[pin_num].gp_flags; in ftgpio_pin_write()
173 FTGPIO_VERBOSE_PRINTF(sc->dev, "pin %u<GPIO%u%u> is not configured for output\n", in ftgpio_pin_write()
174 pin_num, group, index); in ftgpio_pin_write()
178 FTGPIO_VERBOSE_PRINTF(sc->dev, "set pin %u<GPIO%u%u> to %s\n", in ftgpio_pin_write()
179 pin_num, group, index, (pin_value ? "on" : "off")); in ftgpio_pin_write()
181 val = ftgpio_group_get_output(sc, group); in ftgpio_pin_write()
186 ftgpio_group_set_output(sc, group, val); in ftgpio_pin_write()
193 unsigned group, index; in ftgpio_pin_read() local
198 group = FTGPIO_PIN_GETGROUP(pin_num); in ftgpio_pin_read()
200 pin_flags = sc->pins[pin_num].gp_flags; in ftgpio_pin_read()
202 FTGPIO_VERBOSE_PRINTF(sc->dev, "pin %u<GPIO%u%u> is not configured for input or output\n", in ftgpio_pin_read()
203 pin_num, group, index); in ftgpio_pin_read()
208 val = ftgpio_group_get_output(sc, group); in ftgpio_pin_read()
210 val = ftgpio_group_get_status(sc, group); in ftgpio_pin_read()
216 FTGPIO_VERBOSE_PRINTF(sc->dev, "pin %u<GPIO%u%u> is %s\n", in ftgpio_pin_read()
217 pin_num, group, index, (pin_value ? "on" : "off")); in ftgpio_pin_read()
225 unsigned group, index; in ftgpio_pin_set_drive() local
229 group = FTGPIO_PIN_GETGROUP(pin_num); in ftgpio_pin_set_drive()
230 ioreg = ftgpio_group_get_ioreg(sc, REG_DRIVE_ENABLE, group); in ftgpio_pin_set_drive()
231 group_drive = superio_read(sc->dev, ioreg); in ftgpio_pin_set_drive()
232 FTGPIO_VERBOSE_PRINTF(sc->dev, "group GPIO%u drive is 0x%x (ioreg=0x%x)\n", in ftgpio_pin_set_drive()
233 group, group_drive, ioreg); in ftgpio_pin_set_drive()
239 superio_write(sc->dev, ioreg, group_drive); in ftgpio_pin_set_drive()
245 unsigned group, index; in ftgpio_pin_is_pushpull() local
250 group = FTGPIO_PIN_GETGROUP(pin_num); in ftgpio_pin_is_pushpull()
252 ioreg = ftgpio_group_get_ioreg(sc, REG_DRIVE_ENABLE, group); in ftgpio_pin_is_pushpull()
253 group_drive = superio_read(sc->dev, ioreg); in ftgpio_pin_is_pushpull()
254 FTGPIO_VERBOSE_PRINTF(sc->dev, "group GPIO%u drive is 0x%x (ioreg=0x%x)\n", in ftgpio_pin_is_pushpull()
255 group, group_drive, ioreg); in ftgpio_pin_is_pushpull()
258 FTGPIO_VERBOSE_PRINTF(sc->dev, "pin %u<GPIO%u%u> drive is %s\n", in ftgpio_pin_is_pushpull()
259 pin_num, group, index, (is_pushpull ? "pushpull" : "opendrain")); in ftgpio_pin_is_pushpull()
267 unsigned group, index; in ftgpio_pin_set_io() local
271 group = FTGPIO_PIN_GETGROUP(pin_num); in ftgpio_pin_set_io()
272 FTGPIO_VERBOSE_PRINTF(sc->dev, "set pin %u<GPIO%u%u> io to %s\n", in ftgpio_pin_set_io()
273 pin_num, group, index, (pin_io ? "output" : "input")); in ftgpio_pin_set_io()
275 ioreg = ftgpio_group_get_ioreg(sc, REG_OUTPUT_ENABLE, group); in ftgpio_pin_set_io()
276 group_io = superio_read(sc->dev, ioreg); in ftgpio_pin_set_io()
277 FTGPIO_VERBOSE_PRINTF(sc->dev, "group GPIO%u io is 0x%x (ioreg=0x%x)\n", in ftgpio_pin_set_io()
278 group, group_io, ioreg); in ftgpio_pin_set_io()
283 superio_write(sc->dev, ioreg, group_io); in ftgpio_pin_set_io()
284 FTGPIO_VERBOSE_PRINTF(sc->dev, "set group GPIO%u io to 0x%x (ioreg=0x%x)\n", in ftgpio_pin_set_io()
285 group, group_io, ioreg); in ftgpio_pin_set_io()
291 unsigned group, index; in ftgpio_pin_is_output() local
295 group = FTGPIO_PIN_GETGROUP(pin_num); in ftgpio_pin_is_output()
297 is_output = ftgpio_group_get_status(sc, group) & (1 << index); in ftgpio_pin_is_output()
298 FTGPIO_VERBOSE_PRINTF(sc->dev, "pin %u<GPIO%u%u> io is %s\n", in ftgpio_pin_is_output()
299 pin_num, group, index, (is_output ? "output" : "input")); in ftgpio_pin_is_output()
325 sc->pins[pin_num].gp_flags = pin_flags; in ftgpio_pin_setflags()
365 sc->dev = dev; in ftgpio_attach()
371 struct gpio_pin *pin; in ftgpio_attach() local
373 pin = &sc->pins[i]; in ftgpio_attach()
374 pin->gp_pin = i; in ftgpio_attach()
375 pin->gp_caps = FTGPIO_GPIO_CAPS; in ftgpio_attach()
376 pin->gp_flags = 0; in ftgpio_attach()
379 pin->gp_flags |= GPIO_PIN_OUTPUT; in ftgpio_attach()
381 pin->gp_flags |= GPIO_PIN_INPUT; in ftgpio_attach()
384 pin->gp_flags |= GPIO_PIN_PUSHPULL; in ftgpio_attach()
386 pin->gp_flags |= GPIO_PIN_OPENDRAIN; in ftgpio_attach()
388 snprintf(pin->gp_name, GPIOMAXNAME, "GPIO%u%u", in ftgpio_attach()
393 superio_write(sc->dev, GPIO1_ENABLE, 0xFF); in ftgpio_attach()
394 superio_write(sc->dev, GPIO2_ENABLE, 0xFF); in ftgpio_attach()
395 superio_write(sc->dev, GPIO3_ENABLE, 0xFF); in ftgpio_attach()
396 superio_write(sc->dev, GPIO4_ENABLE, 0xFF); in ftgpio_attach()
397 superio_write(sc->dev, FULL_UR5_UR6, 0x0A); in ftgpio_attach()
398 FTGPIO_VERBOSE_PRINTF(sc->dev, "groups GPIO1..GPIO6 enabled\n"); in ftgpio_attach()
401 sc->busdev = gpiobus_attach_bus(dev); in ftgpio_attach()
402 if (sc->busdev == NULL) { in ftgpio_attach()
430 return (sc->busdev); in ftgpio_gpio_get_bus()
450 if ((sc->pins[pin_num].gp_flags & GPIO_PIN_OUTPUT) == 0) { in ftgpio_gpio_pin_set()
509 strlcpy(pin_name, sc->pins[pin_num].gp_name, GPIOMAXNAME); in ftgpio_gpio_pin_getname()
526 *pin_caps = sc->pins[pin_num].gp_caps; in ftgpio_gpio_pin_getcaps()
543 *pin_flags = sc->pins[pin_num].gp_flags; in ftgpio_gpio_pin_getflags()
555 FTGPIO_VERBOSE_PRINTF(dev, "invalid pin number: %u\n", pin_num); in ftgpio_gpio_pin_setflags()
562 if ((pin_flags & sc->pins[pin_num].gp_caps) != pin_flags) { in ftgpio_gpio_pin_setflags()
563 FTGPIO_VERBOSE_PRINTF(dev, "invalid pin flags 0x%x, vs caps 0x%x\n", in ftgpio_gpio_pin_setflags()
564 pin_flags, sc->pins[pin_num].gp_caps); in ftgpio_gpio_pin_setflags()