Lines Matching +full:gpio +full:- +full:config
2 * gpio-regulator.c
13 * Roger Quadros <ext-roger.quadros@nokia.com>
21 * non-controllable regulators, as well as for allowing testing on
32 #include <linux/regulator/gpio-regulator.h>
33 #include <linux/gpio.h>
42 struct gpio *gpios;
56 for (ptr = 0; ptr < data->nr_states; ptr++) in gpio_regulator_get_value()
57 if (data->states[ptr].gpios == data->state) in gpio_regulator_get_value()
58 return data->states[ptr].value; in gpio_regulator_get_value()
60 return -EINVAL; in gpio_regulator_get_value()
70 for (ptr = 0; ptr < data->nr_states; ptr++) in gpio_regulator_set_voltage()
71 if (data->states[ptr].value < best_val && in gpio_regulator_set_voltage()
72 data->states[ptr].value >= min_uV && in gpio_regulator_set_voltage()
73 data->states[ptr].value <= max_uV) { in gpio_regulator_set_voltage()
74 target = data->states[ptr].gpios; in gpio_regulator_set_voltage()
75 best_val = data->states[ptr].value; in gpio_regulator_set_voltage()
81 return -EINVAL; in gpio_regulator_set_voltage()
83 for (ptr = 0; ptr < data->nr_gpios; ptr++) { in gpio_regulator_set_voltage()
85 gpio_set_value_cansleep(data->gpios[ptr].gpio, state); in gpio_regulator_set_voltage()
87 data->state = target; in gpio_regulator_set_voltage()
97 if (selector >= data->nr_states) in gpio_regulator_list_voltage()
98 return -EINVAL; in gpio_regulator_list_voltage()
100 return data->states[selector].value; in gpio_regulator_list_voltage()
109 for (ptr = 0; ptr < data->nr_states; ptr++) in gpio_regulator_set_current_limit()
110 if (data->states[ptr].value > best_val && in gpio_regulator_set_current_limit()
111 data->states[ptr].value >= min_uA && in gpio_regulator_set_current_limit()
112 data->states[ptr].value <= max_uA) { in gpio_regulator_set_current_limit()
113 target = data->states[ptr].gpios; in gpio_regulator_set_current_limit()
114 best_val = data->states[ptr].value; in gpio_regulator_set_current_limit()
118 return -EINVAL; in gpio_regulator_set_current_limit()
120 for (ptr = 0; ptr < data->nr_gpios; ptr++) { in gpio_regulator_set_current_limit()
122 gpio_set_value_cansleep(data->gpios[ptr].gpio, state); in gpio_regulator_set_current_limit()
124 data->state = target; in gpio_regulator_set_current_limit()
139 struct gpio_regulator_config *config; in of_get_gpio_regulator_config() local
141 int proplen, gpio, i; in of_get_gpio_regulator_config() local
144 config = devm_kzalloc(dev, in of_get_gpio_regulator_config()
147 if (!config) in of_get_gpio_regulator_config()
148 return ERR_PTR(-ENOMEM); in of_get_gpio_regulator_config()
150 config->init_data = of_get_regulator_init_data(dev, np, desc); in of_get_gpio_regulator_config()
151 if (!config->init_data) in of_get_gpio_regulator_config()
152 return ERR_PTR(-EINVAL); in of_get_gpio_regulator_config()
154 config->supply_name = config->init_data->constraints.name; in of_get_gpio_regulator_config()
156 if (of_property_read_bool(np, "enable-active-high")) in of_get_gpio_regulator_config()
157 config->enable_high = true; in of_get_gpio_regulator_config()
159 if (of_property_read_bool(np, "enable-at-boot")) in of_get_gpio_regulator_config()
160 config->enabled_at_boot = true; in of_get_gpio_regulator_config()
162 of_property_read_u32(np, "startup-delay-us", &config->startup_delay); in of_get_gpio_regulator_config()
164 config->enable_gpio = of_get_named_gpio(np, "enable-gpio", 0); in of_get_gpio_regulator_config()
165 if (config->enable_gpio < 0 && config->enable_gpio != -ENOENT) in of_get_gpio_regulator_config()
166 return ERR_PTR(config->enable_gpio); in of_get_gpio_regulator_config()
168 /* Fetch GPIOs. - optional property*/ in of_get_gpio_regulator_config()
170 if ((ret < 0) && (ret != -ENOENT)) in of_get_gpio_regulator_config()
174 config->nr_gpios = ret; in of_get_gpio_regulator_config()
175 config->gpios = devm_kcalloc(dev, in of_get_gpio_regulator_config()
176 config->nr_gpios, sizeof(struct gpio), in of_get_gpio_regulator_config()
178 if (!config->gpios) in of_get_gpio_regulator_config()
179 return ERR_PTR(-ENOMEM); in of_get_gpio_regulator_config()
181 proplen = of_property_count_u32_elems(np, "gpios-states"); in of_get_gpio_regulator_config()
186 if (proplen > 0 && proplen != config->nr_gpios) { in of_get_gpio_regulator_config()
187 dev_warn(dev, "gpios <-> gpios-states mismatch\n"); in of_get_gpio_regulator_config()
191 for (i = 0; i < config->nr_gpios; i++) { in of_get_gpio_regulator_config()
192 gpio = of_get_named_gpio(np, "gpios", i); in of_get_gpio_regulator_config()
193 if (gpio < 0) { in of_get_gpio_regulator_config()
194 if (gpio != -ENOENT) in of_get_gpio_regulator_config()
195 return ERR_PTR(gpio); in of_get_gpio_regulator_config()
198 config->gpios[i].gpio = gpio; in of_get_gpio_regulator_config()
199 config->gpios[i].label = config->supply_name; in of_get_gpio_regulator_config()
201 of_property_read_u32_index(np, "gpios-states", in of_get_gpio_regulator_config()
204 config->gpios[i].flags = in of_get_gpio_regulator_config()
214 return ERR_PTR(-EINVAL); in of_get_gpio_regulator_config()
217 config->states = devm_kcalloc(dev, in of_get_gpio_regulator_config()
221 if (!config->states) in of_get_gpio_regulator_config()
222 return ERR_PTR(-ENOMEM); in of_get_gpio_regulator_config()
226 &config->states[i].value); in of_get_gpio_regulator_config()
228 &config->states[i].gpios); in of_get_gpio_regulator_config()
230 config->nr_states = i; in of_get_gpio_regulator_config()
232 config->type = REGULATOR_VOLTAGE; in of_get_gpio_regulator_config()
233 ret = of_property_read_string(np, "regulator-type", ®type); in of_get_gpio_regulator_config()
236 config->type = REGULATOR_VOLTAGE; in of_get_gpio_regulator_config()
238 config->type = REGULATOR_CURRENT; in of_get_gpio_regulator_config()
240 dev_warn(dev, "Unknown regulator-type '%s'\n", in of_get_gpio_regulator_config()
244 return config; in of_get_gpio_regulator_config()
254 struct gpio_regulator_config *config = dev_get_platdata(&pdev->dev); in gpio_regulator_probe() local
255 struct device_node *np = pdev->dev.of_node; in gpio_regulator_probe()
260 drvdata = devm_kzalloc(&pdev->dev, sizeof(struct gpio_regulator_data), in gpio_regulator_probe()
263 return -ENOMEM; in gpio_regulator_probe()
266 config = of_get_gpio_regulator_config(&pdev->dev, np, in gpio_regulator_probe()
267 &drvdata->desc); in gpio_regulator_probe()
268 if (IS_ERR(config)) in gpio_regulator_probe()
269 return PTR_ERR(config); in gpio_regulator_probe()
272 drvdata->desc.name = kstrdup(config->supply_name, GFP_KERNEL); in gpio_regulator_probe()
273 if (drvdata->desc.name == NULL) { in gpio_regulator_probe()
274 dev_err(&pdev->dev, "Failed to allocate supply name\n"); in gpio_regulator_probe()
275 return -ENOMEM; in gpio_regulator_probe()
278 if (config->nr_gpios != 0) { in gpio_regulator_probe()
279 drvdata->gpios = kmemdup(config->gpios, in gpio_regulator_probe()
280 config->nr_gpios * sizeof(struct gpio), in gpio_regulator_probe()
282 if (drvdata->gpios == NULL) { in gpio_regulator_probe()
283 dev_err(&pdev->dev, "Failed to allocate gpio data\n"); in gpio_regulator_probe()
284 ret = -ENOMEM; in gpio_regulator_probe()
288 drvdata->nr_gpios = config->nr_gpios; in gpio_regulator_probe()
289 ret = gpio_request_array(drvdata->gpios, drvdata->nr_gpios); in gpio_regulator_probe()
291 if (ret != -EPROBE_DEFER) in gpio_regulator_probe()
292 dev_err(&pdev->dev, in gpio_regulator_probe()
299 drvdata->states = kmemdup(config->states, in gpio_regulator_probe()
300 config->nr_states * in gpio_regulator_probe()
303 if (drvdata->states == NULL) { in gpio_regulator_probe()
304 dev_err(&pdev->dev, "Failed to allocate state data\n"); in gpio_regulator_probe()
305 ret = -ENOMEM; in gpio_regulator_probe()
308 drvdata->nr_states = config->nr_states; in gpio_regulator_probe()
310 drvdata->desc.owner = THIS_MODULE; in gpio_regulator_probe()
311 drvdata->desc.enable_time = config->startup_delay; in gpio_regulator_probe()
314 switch (config->type) { in gpio_regulator_probe()
316 drvdata->desc.type = REGULATOR_VOLTAGE; in gpio_regulator_probe()
317 drvdata->desc.ops = &gpio_regulator_voltage_ops; in gpio_regulator_probe()
318 drvdata->desc.n_voltages = config->nr_states; in gpio_regulator_probe()
321 drvdata->desc.type = REGULATOR_CURRENT; in gpio_regulator_probe()
322 drvdata->desc.ops = &gpio_regulator_current_ops; in gpio_regulator_probe()
325 dev_err(&pdev->dev, "No regulator type set\n"); in gpio_regulator_probe()
326 ret = -EINVAL; in gpio_regulator_probe()
330 /* build initial state from gpio init data. */ in gpio_regulator_probe()
332 for (ptr = 0; ptr < drvdata->nr_gpios; ptr++) { in gpio_regulator_probe()
333 if (config->gpios[ptr].flags & GPIOF_OUT_INIT_HIGH) in gpio_regulator_probe()
336 drvdata->state = state; in gpio_regulator_probe()
338 cfg.dev = &pdev->dev; in gpio_regulator_probe()
339 cfg.init_data = config->init_data; in gpio_regulator_probe()
343 if (gpio_is_valid(config->enable_gpio)) { in gpio_regulator_probe()
344 cfg.ena_gpio = config->enable_gpio; in gpio_regulator_probe()
347 cfg.ena_gpio_invert = !config->enable_high; in gpio_regulator_probe()
348 if (config->enabled_at_boot) { in gpio_regulator_probe()
349 if (config->enable_high) in gpio_regulator_probe()
354 if (config->enable_high) in gpio_regulator_probe()
360 drvdata->dev = regulator_register(&drvdata->desc, &cfg); in gpio_regulator_probe()
361 if (IS_ERR(drvdata->dev)) { in gpio_regulator_probe()
362 ret = PTR_ERR(drvdata->dev); in gpio_regulator_probe()
363 dev_err(&pdev->dev, "Failed to register regulator: %d\n", ret); in gpio_regulator_probe()
372 kfree(drvdata->states); in gpio_regulator_probe()
374 gpio_free_array(drvdata->gpios, drvdata->nr_gpios); in gpio_regulator_probe()
376 kfree(drvdata->gpios); in gpio_regulator_probe()
378 kfree(drvdata->desc.name); in gpio_regulator_probe()
386 regulator_unregister(drvdata->dev); in gpio_regulator_remove()
388 gpio_free_array(drvdata->gpios, drvdata->nr_gpios); in gpio_regulator_remove()
390 kfree(drvdata->states); in gpio_regulator_remove()
391 kfree(drvdata->gpios); in gpio_regulator_remove()
393 kfree(drvdata->desc.name); in gpio_regulator_remove()
400 { .compatible = "regulator-gpio", },
410 .name = "gpio-regulator",
428 MODULE_DESCRIPTION("gpio voltage regulator");
430 MODULE_ALIAS("platform:gpio-regulator");