int gpioiic_match(device_t parent, cfdata_t cf, void *aux) { struct gpio_attach_args *ga = aux; if (strcmp(ga->ga_dvname, cf->cf_name)) return 0; if (ga->ga_offset == -1) return 0; /* Check that we have enough pins */ if (gpio_npins(ga->ga_mask) != GPIOIIC_NPINS) { aprint_debug("%s: invalid pin mask 0x%02x\n", cf->cf_name, ga->ga_mask); return 0; } return 1; }
int gpiopwm_match(device_t parent, cfdata_t cf, void *aux) { struct gpio_attach_args *ga = aux; if (strcmp(ga->ga_dvname, cf->cf_name)) return 0; if (ga->ga_offset == -1) return 0; /* Check number of pins, must be 1 */ if (gpio_npins(ga->ga_mask) != GPIOPWM_NPINS) { aprint_debug("%s: invalid pin mask 0x%02x\n", cf->cf_name, ga->ga_mask); return 0; } return 1; }
void gpioow_attach(struct device *parent, struct device *self, void *aux) { struct gpioow_softc *sc = (struct gpioow_softc *)self; struct gpio_attach_args *ga = aux; struct onewirebus_attach_args oba; int caps; /* Check that we have enough pins */ if (gpio_npins(ga->ga_mask) != GPIOOW_NPINS) { printf(": invalid pin mask\n"); return; } /* Map pins */ sc->sc_gpio = ga->ga_gpio; sc->sc_map.pm_map = sc->__map; if (gpio_pin_map(sc->sc_gpio, ga->ga_offset, ga->ga_mask, &sc->sc_map)) { printf(": can't map pins\n"); return; } /* Configure data pin */ caps = gpio_pin_caps(sc->sc_gpio, &sc->sc_map, GPIOOW_PIN_DATA); if (!(caps & GPIO_PIN_OUTPUT)) { printf(": data pin is unable to drive output\n"); goto fail; } if (!(caps & GPIO_PIN_INPUT)) { printf(": data pin is unable to read input\n"); goto fail; } printf(": DATA[%d]", sc->sc_map.pm_map[GPIOOW_PIN_DATA]); sc->sc_data = GPIO_PIN_OUTPUT; if (caps & GPIO_PIN_OPENDRAIN) { printf(" open-drain"); sc->sc_data |= GPIO_PIN_OPENDRAIN; } else if ((caps & GPIO_PIN_PUSHPULL) && (caps & GPIO_PIN_TRISTATE)) { printf(" push-pull tri-state"); sc->sc_data |= GPIO_PIN_PUSHPULL; } if (caps & GPIO_PIN_PULLUP) { printf(" pull-up"); sc->sc_data |= GPIO_PIN_PULLUP; } gpio_pin_ctl(sc->sc_gpio, &sc->sc_map, GPIOOW_PIN_DATA, sc->sc_data); printf("\n"); /* Attach 1-Wire bus */ sc->sc_ow_bus.bus_cookie = sc; sc->sc_ow_bus.bus_reset = gpioow_ow_reset; sc->sc_ow_bus.bus_bit = gpioow_ow_bit; bzero(&oba, sizeof(oba)); oba.oba_bus = &sc->sc_ow_bus; sc->sc_ow_dev = config_found(self, &oba, onewirebus_print); return; fail: gpio_pin_unmap(sc->sc_gpio, &sc->sc_map); }