Lines Matching +full:pin +full:- +full:val
1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
62 #define TCA64XX_BIT_FROM_PIN(pin) (pin % TCA64XX_PINS_PER_REG) argument
63 #define TCA64XX_REG_ADDR(pin, baseaddr) (baseaddr | (pin / \ argument
173 msgs[0].slave = sc->addr; in tca64xx_read()
178 msgs[1].slave = sc->addr; in tca64xx_read()
188 tca64xx_write(device_t dev, uint8_t reg, uint8_t val) in tca64xx_write() argument
193 uint8_t buffer[2] = {reg, val}; in tca64xx_write()
197 msg.slave = sc->addr; in tca64xx_write()
216 switch (compat_ptr->ocd_data) { in tca64xx_probe()
239 switch (compat_ptr->ocd_data) { in tca64xx_attach()
241 sc->in_port_reg = TCA6416_IN_PORT_REG; in tca64xx_attach()
242 sc->out_port_reg = TCA6416_OUT_PORT_REG; in tca64xx_attach()
243 sc->polarity_inv_reg = TCA6416_POLARITY_INV_REG; in tca64xx_attach()
244 sc->conf_reg = TCA6416_CONF_REG; in tca64xx_attach()
245 sc->num_pins = TCA6416_NUM_PINS; in tca64xx_attach()
248 sc->in_port_reg = TCA6408_IN_PORT_REG; in tca64xx_attach()
249 sc->out_port_reg = TCA6408_OUT_PORT_REG; in tca64xx_attach()
250 sc->polarity_inv_reg = TCA6408_POLARITY_INV_REG; in tca64xx_attach()
251 sc->conf_reg = TCA6408_CONF_REG; in tca64xx_attach()
252 sc->num_pins = TCA6408_NUM_PINS; in tca64xx_attach()
258 sc->pin_caps = TCA64XX_PIN_CAPS; in tca64xx_attach()
259 sc->chip = compat_ptr->ocd_data; in tca64xx_attach()
260 sc->dev = dev; in tca64xx_attach()
261 sc->addr = iicbus_get_addr(dev); in tca64xx_attach()
263 mtx_init(&sc->mtx, "tca64xx gpio", "gpio", MTX_DEF); in tca64xx_attach()
264 sc->busdev = gpiobus_attach_bus(dev); in tca64xx_attach()
265 if (sc->busdev == NULL) { in tca64xx_attach()
273 switch (sc->chip) { in tca64xx_attach()
295 if (sc->busdev != NULL) in tca64xx_detach()
296 gpiobus_detach_bus(sc->busdev); in tca64xx_detach()
298 mtx_destroy(&sc->mtx); in tca64xx_detach()
310 return (sc->busdev); in tca64xx_get_bus()
323 *maxpin = sc->num_pins-1; in tca64xx_pin_max()
329 tca64xx_pin_getcaps(device_t dev, uint32_t pin, uint32_t *caps) in tca64xx_pin_getcaps() argument
335 if (pin >= sc->num_pins || caps == NULL) in tca64xx_pin_getcaps()
337 *caps = sc->pin_caps; in tca64xx_pin_getcaps()
343 tca64xx_pin_getflags(device_t dev, uint32_t pin, uint32_t *pflags) in tca64xx_pin_getflags() argument
346 uint8_t bit, val, addr; in tca64xx_pin_getflags() local
351 bit = TCA64XX_BIT_FROM_PIN(pin); in tca64xx_pin_getflags()
353 if (pin >= sc->num_pins || pflags == NULL) in tca64xx_pin_getflags()
356 addr = TCA64XX_REG_ADDR(pin, sc->conf_reg); in tca64xx_pin_getflags()
357 error = tca64xx_read(dev, addr, &val); in tca64xx_pin_getflags()
361 *pflags = (val & (1 << bit)) ? GPIO_PIN_INPUT : GPIO_PIN_OUTPUT; in tca64xx_pin_getflags()
363 addr = TCA64XX_REG_ADDR(pin, sc->polarity_inv_reg); in tca64xx_pin_getflags()
364 error = tca64xx_read(dev, addr, &val); in tca64xx_pin_getflags()
368 if (val & (1 << bit)) in tca64xx_pin_getflags()
375 tca64xx_pin_setflags(device_t dev, uint32_t pin, uint32_t flags) in tca64xx_pin_setflags() argument
377 uint8_t bit, val, addr, pins, inv_val; in tca64xx_pin_setflags() local
383 pins = sc->num_pins; in tca64xx_pin_setflags()
384 bit = TCA64XX_BIT_FROM_PIN(pin); in tca64xx_pin_setflags()
386 if (pin >= pins) in tca64xx_pin_setflags()
388 mtx_lock(&sc->mtx); in tca64xx_pin_setflags()
390 addr = TCA64XX_REG_ADDR(pin, sc->conf_reg); in tca64xx_pin_setflags()
391 error = tca64xx_read(dev, addr, &val); in tca64xx_pin_setflags()
395 addr = TCA64XX_REG_ADDR(pin, sc->polarity_inv_reg); in tca64xx_pin_setflags()
401 val |= (1 << bit); in tca64xx_pin_setflags()
403 val &= ~(1 << bit); in tca64xx_pin_setflags()
410 addr = TCA64XX_REG_ADDR(pin, sc->conf_reg); in tca64xx_pin_setflags()
411 error = tca64xx_write(dev, addr, val); in tca64xx_pin_setflags()
415 addr = TCA64XX_REG_ADDR(pin, sc->polarity_inv_reg); in tca64xx_pin_setflags()
419 mtx_unlock(&sc->mtx); in tca64xx_pin_setflags()
424 tca64xx_pin_getname(device_t dev, uint32_t pin, char *name) in tca64xx_pin_getname() argument
430 if (pin >= sc->num_pins || name == NULL) in tca64xx_pin_getname()
433 snprintf(name, GPIOMAXNAME, "gpio_P%d%d", pin / TCA64XX_PINS_PER_REG, in tca64xx_pin_getname()
434 pin % TCA64XX_PINS_PER_REG); in tca64xx_pin_getname()
440 tca64xx_pin_get(device_t dev, uint32_t pin, unsigned int *pval) in tca64xx_pin_get() argument
448 pins = sc->num_pins; in tca64xx_pin_get()
449 addr = TCA64XX_REG_ADDR(pin, sc->in_port_reg); in tca64xx_pin_get()
450 bit = TCA64XX_BIT_FROM_PIN(pin); in tca64xx_pin_get()
452 if (pin >= pins || pval == NULL) in tca64xx_pin_get()
455 dbg_dev_printf(dev, "Reading pin %u pvalue.", pin); in tca64xx_pin_get()
466 tca64xx_pin_set(device_t dev, uint32_t pin, unsigned int val) in tca64xx_pin_set() argument
474 pins = sc->num_pins; in tca64xx_pin_set()
475 addr = TCA64XX_REG_ADDR(pin, sc->out_port_reg); in tca64xx_pin_set()
476 bit = TCA64XX_BIT_FROM_PIN(pin); in tca64xx_pin_set()
478 if (pin >= pins) in tca64xx_pin_set()
481 dbg_dev_printf(dev, "Setting pin: %u to %u\n", pin, val); in tca64xx_pin_set()
483 mtx_lock(&sc->mtx); in tca64xx_pin_set()
487 mtx_unlock(&sc->mtx); in tca64xx_pin_set()
492 if (val != 0) in tca64xx_pin_set()
499 mtx_unlock(&sc->mtx); in tca64xx_pin_set()
504 mtx_unlock(&sc->mtx); in tca64xx_pin_set()
510 tca64xx_pin_toggle(device_t dev, uint32_t pin) in tca64xx_pin_toggle() argument
518 pins = sc->num_pins; in tca64xx_pin_toggle()
519 addr = TCA64XX_REG_ADDR(pin, sc->out_port_reg); in tca64xx_pin_toggle()
520 bit = TCA64XX_BIT_FROM_PIN(pin); in tca64xx_pin_toggle()
522 if (pin >= pins) in tca64xx_pin_toggle()
525 dbg_dev_printf(dev, "Toggling pin: %d\n", pin); in tca64xx_pin_toggle()
527 mtx_lock(&sc->mtx); in tca64xx_pin_toggle()
531 mtx_unlock(&sc->mtx); in tca64xx_pin_toggle()
540 mtx_unlock(&sc->mtx); in tca64xx_pin_toggle()
545 mtx_unlock(&sc->mtx); in tca64xx_pin_toggle()