示例#1
0
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);
}
示例#2
0
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));
}
示例#3
0
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);
}