static void gpioleds_attach_led(struct gpioleds_softc *sc, phandle_t node, struct gpioled *led) { char *name; int state, err; char *default_state; led->parent_sc = sc; state = 0; if (OF_getprop_alloc(node, "default-state", sizeof(char), (void **)&default_state) != -1) { if (strcasecmp(default_state, "on") == 0) state = 1; else if (strcasecmp(default_state, "off") == 0) state = 0; else if (strcasecmp(default_state, "keep") == 0) state = -1; else { state = -1; device_printf(sc->sc_dev, "unknown value for default-state in FDT\n"); } OF_prop_free(default_state); } name = NULL; if (OF_getprop_alloc(node, "label", 1, (void **)&name) == -1) OF_getprop_alloc(node, "name", 1, (void **)&name); if (name == NULL) { device_printf(sc->sc_dev, "no name provided for gpio LED, skipping\n"); return; } err = gpio_pin_get_by_ofw_idx(sc->sc_dev, node, 0, &led->pin); if (err) { device_printf(sc->sc_dev, "<%s> failed to map pin\n", name); if (name) OF_prop_free(name); return; } gpio_pin_setflags(led->pin, GPIO_PIN_OUTPUT); led->leddev = led_create_state(gpioled_control, led, name, state); if (name != NULL) OF_prop_free(name); }
int gpio_pin_get_by_ofw_name(device_t consumer, phandle_t node, char *name, gpio_pin_t *pin) { int rv, idx; KASSERT(consumer != NULL && node > 0, ("both consumer and node required")); rv = ofw_bus_find_string_index(node, "gpio-names", name, &idx); if (rv != 0) return (rv); return (gpio_pin_get_by_ofw_idx(consumer, node, idx, pin)); }
static int gpiobacklight_attach(device_t dev) { struct gpiobacklight_softc *sc; struct sysctl_ctx_list *ctx; struct sysctl_oid *tree; phandle_t node; sc = device_get_softc(dev); if ((node = ofw_bus_get_node(dev)) == -1) return (ENXIO); if (OF_hasprop(node, "default-on")) sc->sc_brightness = true; else sc->sc_brightness = false; gpio_pin_get_by_ofw_idx(dev, node, 0, &sc->sc_pin); if (sc->sc_pin == NULL) { device_printf(dev, "failed to map GPIO pin\n"); return (ENXIO); } gpio_pin_setflags(sc->sc_pin, GPIO_PIN_OUTPUT); gpiobacklight_update_brightness(sc); /* Init backlight interface */ ctx = device_get_sysctl_ctx(dev); tree = device_get_sysctl_tree(dev); sc->sc_oid = SYSCTL_ADD_PROC(ctx, SYSCTL_CHILDREN(tree), OID_AUTO, "brightness", CTLTYPE_INT | CTLFLAG_RW, sc, 0, gpiobacklight_sysctl, "I", "backlight brightness"); return (0); }