Lines Matching +full:c +full:- +full:states
1 /*-
2 * Copyright (c) 2016 Jared McNeill <jmcneill@invisible.ca>
58 struct gpioregulator_state *states; member
84 if (sc->def->enable_pin_valid == 1) { in gpioregulator_regnode_init()
85 error = gpio_pin_setflags(sc->def->enable_pin, GPIO_PIN_OUTPUT); in gpioregulator_regnode_init()
90 for (n = 0; n < sc->def->npins; n++) { in gpioregulator_regnode_init()
91 error = gpio_pin_setflags(sc->def->pins[n], GPIO_PIN_OUTPUT); in gpioregulator_regnode_init()
108 if (sc->def->enable_pin_valid == 1) { in gpioregulator_regnode_enable()
110 if (!sc->param->enable_active_high) in gpioregulator_regnode_enable()
112 error = gpio_pin_set_active(sc->def->enable_pin, active); in gpioregulator_regnode_enable()
117 *udelay = sc->def->startup_delay_us; in gpioregulator_regnode_enable()
133 for (n = 0; n < sc->def->nstates; n++) { in gpioregulator_regnode_set_voltage()
134 if (sc->def->states[n].val >= min_uvolt && in gpioregulator_regnode_set_voltage()
135 sc->def->states[n].val <= max_uvolt) { in gpioregulator_regnode_set_voltage()
136 state = &sc->def->states[n]; in gpioregulator_regnode_set_voltage()
143 for (n = 0; n < sc->def->npins; n++) { in gpioregulator_regnode_set_voltage()
144 error = gpio_pin_set_active(sc->def->pins[n], in gpioregulator_regnode_set_voltage()
145 (state->mask >> n) & 1); in gpioregulator_regnode_set_voltage()
150 *udelay = sc->def->startup_delay_us; in gpioregulator_regnode_set_voltage()
166 for (n = 0; n < sc->def->npins; n++) { in gpioregulator_regnode_get_voltage()
167 error = gpio_pin_is_active(sc->def->pins[n], &active); in gpioregulator_regnode_get_voltage()
173 for (n = 0; n < sc->def->nstates; n++) { in gpioregulator_regnode_get_voltage()
174 if (sc->def->states[n].mask == mask) { in gpioregulator_regnode_get_voltage()
175 *uvolt = sc->def->states[n].val; in gpioregulator_regnode_get_voltage()
203 node = ofw_bus_get_node(sc->dev); in gpioregulator_parse_fdt()
207 error = regulator_parse_ofw_stdparam(sc->dev, node, in gpioregulator_parse_fdt()
208 &sc->init_def.reg_init_def); in gpioregulator_parse_fdt()
212 /* "states" property (required) */ in gpioregulator_parse_fdt()
213 len = OF_getencprop_alloc_multi(node, "states", sizeof(*pstates), in gpioregulator_parse_fdt()
216 device_printf(sc->dev, "invalid 'states' property\n"); in gpioregulator_parse_fdt()
220 sc->init_def.nstates = len / 2; in gpioregulator_parse_fdt()
221 sc->init_def.states = malloc(sc->init_def.nstates * in gpioregulator_parse_fdt()
222 sizeof(*sc->init_def.states), M_DEVBUF, M_WAITOK); in gpioregulator_parse_fdt()
223 for (n = 0; n < sc->init_def.nstates; n++) { in gpioregulator_parse_fdt()
224 sc->init_def.states[n].val = pstates[n * 2 + 0]; in gpioregulator_parse_fdt()
225 sc->init_def.states[n].mask = pstates[n * 2 + 1]; in gpioregulator_parse_fdt()
226 mask |= sc->init_def.states[n].mask; in gpioregulator_parse_fdt()
229 /* "startup-delay-us" property (optional) */ in gpioregulator_parse_fdt()
230 len = OF_getencprop(node, "startup-delay-us", in gpioregulator_parse_fdt()
231 &sc->init_def.startup_delay_us, in gpioregulator_parse_fdt()
232 sizeof(sc->init_def.startup_delay_us)); in gpioregulator_parse_fdt()
234 sc->init_def.startup_delay_us = 0; in gpioregulator_parse_fdt()
236 /* "enable-gpio" property (optional) */ in gpioregulator_parse_fdt()
237 error = gpio_pin_get_by_ofw_property(sc->dev, node, "enable-gpio", in gpioregulator_parse_fdt()
238 &sc->init_def.enable_pin); in gpioregulator_parse_fdt()
240 sc->init_def.enable_pin_valid = 1; in gpioregulator_parse_fdt()
243 sc->init_def.npins = 32 - __builtin_clz(mask); in gpioregulator_parse_fdt()
244 sc->init_def.pins = malloc(sc->init_def.npins * in gpioregulator_parse_fdt()
245 sizeof(sc->init_def.pins), M_DEVBUF, M_WAITOK | M_ZERO); in gpioregulator_parse_fdt()
246 for (n = 0; n < sc->init_def.npins; n++) { in gpioregulator_parse_fdt()
247 error = gpio_pin_get_by_ofw_idx(sc->dev, node, n, in gpioregulator_parse_fdt()
248 &sc->init_def.pins[n]); in gpioregulator_parse_fdt()
250 device_printf(sc->dev, "cannot get pin %d\n", n); in gpioregulator_parse_fdt()
257 for (n = 0; n < sc->init_def.npins; n++) { in gpioregulator_parse_fdt()
258 if (sc->init_def.pins[n] != NULL) in gpioregulator_parse_fdt()
259 gpio_pin_release(sc->init_def.pins[n]); in gpioregulator_parse_fdt()
262 free(sc->init_def.states, M_DEVBUF); in gpioregulator_parse_fdt()
263 free(sc->init_def.pins, M_DEVBUF); in gpioregulator_parse_fdt()
275 if (!ofw_bus_is_compatible(dev, "regulator-gpio")) in gpioregulator_probe()
291 sc->dev = dev; in gpioregulator_attach()
299 sc->init_def.reg_init_def.id = 1; in gpioregulator_attach()
300 sc->init_def.reg_init_def.ofw_node = node; in gpioregulator_attach()
303 &sc->init_def.reg_init_def); in gpioregulator_attach()
309 sc->reg_sc = regnode_get_softc(regnode); in gpioregulator_attach()
310 sc->reg_sc->regnode = regnode; in gpioregulator_attach()
311 sc->reg_sc->base_dev = dev; in gpioregulator_attach()
312 sc->reg_sc->param = regnode_get_stdparam(regnode); in gpioregulator_attach()
313 sc->reg_sc->def = &sc->init_def; in gpioregulator_attach()