regulator: gpio: Get enable GPIO using GPIO descriptor
We augment the GPIO regulator to get the *enable* regulator GPIO line (not the other lines) using a descriptor rather than a global number. We then pass this into the regulator core which has been prepared to hande enable descriptors in a separate patch. Switch over the two boardfiles using this facility and clean up so we only pass descriptors around. Cc: Philipp Zabel <philipp.zabel@gmail.com> # HX4700/Magician maintainer Signed-off-by: Linus Walleij <linus.walleij@linaro.org> Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
6059577cb2
commit
37bed97f00
|
@ -20,6 +20,7 @@
|
||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
#include <linux/fb.h>
|
#include <linux/fb.h>
|
||||||
#include <linux/gpio.h>
|
#include <linux/gpio.h>
|
||||||
|
#include <linux/gpio/machine.h>
|
||||||
#include <linux/gpio_keys.h>
|
#include <linux/gpio_keys.h>
|
||||||
#include <linux/input.h>
|
#include <linux/input.h>
|
||||||
#include <linux/input/navpoint.h>
|
#include <linux/input/navpoint.h>
|
||||||
|
@ -711,7 +712,6 @@ static struct gpio_regulator_state bq24022_states[] = {
|
||||||
static struct gpio_regulator_config bq24022_info = {
|
static struct gpio_regulator_config bq24022_info = {
|
||||||
.supply_name = "bq24022",
|
.supply_name = "bq24022",
|
||||||
|
|
||||||
.enable_gpio = GPIO72_HX4700_BQ24022_nCHARGE_EN,
|
|
||||||
.enable_high = 0,
|
.enable_high = 0,
|
||||||
.enabled_at_boot = 0,
|
.enabled_at_boot = 0,
|
||||||
|
|
||||||
|
@ -733,6 +733,15 @@ static struct platform_device bq24022 = {
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct gpiod_lookup_table bq24022_gpiod_table = {
|
||||||
|
.dev_id = "gpio-regulator",
|
||||||
|
.table = {
|
||||||
|
GPIO_LOOKUP("gpio-pxa", GPIO72_HX4700_BQ24022_nCHARGE_EN,
|
||||||
|
"enable", GPIO_ACTIVE_HIGH),
|
||||||
|
{ },
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* StrataFlash
|
* StrataFlash
|
||||||
*/
|
*/
|
||||||
|
@ -875,6 +884,7 @@ static void __init hx4700_init(void)
|
||||||
pxa_set_btuart_info(NULL);
|
pxa_set_btuart_info(NULL);
|
||||||
pxa_set_stuart_info(NULL);
|
pxa_set_stuart_info(NULL);
|
||||||
|
|
||||||
|
gpiod_add_lookup_table(&bq24022_gpiod_table);
|
||||||
platform_add_devices(devices, ARRAY_SIZE(devices));
|
platform_add_devices(devices, ARRAY_SIZE(devices));
|
||||||
pwm_add_table(hx4700_pwm_lookup, ARRAY_SIZE(hx4700_pwm_lookup));
|
pwm_add_table(hx4700_pwm_lookup, ARRAY_SIZE(hx4700_pwm_lookup));
|
||||||
|
|
||||||
|
|
|
@ -657,7 +657,6 @@ static struct gpio_regulator_state bq24022_states[] = {
|
||||||
static struct gpio_regulator_config bq24022_info = {
|
static struct gpio_regulator_config bq24022_info = {
|
||||||
.supply_name = "bq24022",
|
.supply_name = "bq24022",
|
||||||
|
|
||||||
.enable_gpio = GPIO30_MAGICIAN_BQ24022_nCHARGE_EN,
|
|
||||||
.enable_high = 0,
|
.enable_high = 0,
|
||||||
.enabled_at_boot = 1,
|
.enabled_at_boot = 1,
|
||||||
|
|
||||||
|
@ -679,6 +678,15 @@ static struct platform_device bq24022 = {
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct gpiod_lookup_table bq24022_gpiod_table = {
|
||||||
|
.dev_id = "gpio-regulator",
|
||||||
|
.table = {
|
||||||
|
GPIO_LOOKUP("gpio-pxa", GPIO30_MAGICIAN_BQ24022_nCHARGE_EN,
|
||||||
|
"enable", GPIO_ACTIVE_HIGH),
|
||||||
|
{ },
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* fixed regulator for ads7846
|
* fixed regulator for ads7846
|
||||||
*/
|
*/
|
||||||
|
@ -1007,6 +1015,7 @@ static void __init magician_init(void)
|
||||||
regulator_register_always_on(0, "power", pwm_backlight_supply,
|
regulator_register_always_on(0, "power", pwm_backlight_supply,
|
||||||
ARRAY_SIZE(pwm_backlight_supply), 5000000);
|
ARRAY_SIZE(pwm_backlight_supply), 5000000);
|
||||||
|
|
||||||
|
gpiod_add_lookup_table(&bq24022_gpiod_table);
|
||||||
platform_add_devices(ARRAY_AND_SIZE(devices));
|
platform_add_devices(ARRAY_AND_SIZE(devices));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -31,6 +31,7 @@
|
||||||
#include <linux/regulator/of_regulator.h>
|
#include <linux/regulator/of_regulator.h>
|
||||||
#include <linux/regulator/gpio-regulator.h>
|
#include <linux/regulator/gpio-regulator.h>
|
||||||
#include <linux/gpio.h>
|
#include <linux/gpio.h>
|
||||||
|
#include <linux/gpio/consumer.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/of.h>
|
#include <linux/of.h>
|
||||||
#include <linux/of_gpio.h>
|
#include <linux/of_gpio.h>
|
||||||
|
@ -161,10 +162,6 @@ of_get_gpio_regulator_config(struct device *dev, struct device_node *np,
|
||||||
|
|
||||||
of_property_read_u32(np, "startup-delay-us", &config->startup_delay);
|
of_property_read_u32(np, "startup-delay-us", &config->startup_delay);
|
||||||
|
|
||||||
config->enable_gpio = of_get_named_gpio(np, "enable-gpio", 0);
|
|
||||||
if (config->enable_gpio < 0 && config->enable_gpio != -ENOENT)
|
|
||||||
return ERR_PTR(config->enable_gpio);
|
|
||||||
|
|
||||||
/* Fetch GPIOs. - optional property*/
|
/* Fetch GPIOs. - optional property*/
|
||||||
ret = of_gpio_count(np);
|
ret = of_gpio_count(np);
|
||||||
if ((ret < 0) && (ret != -ENOENT))
|
if ((ret < 0) && (ret != -ENOENT))
|
||||||
|
@ -255,6 +252,7 @@ static int gpio_regulator_probe(struct platform_device *pdev)
|
||||||
struct device_node *np = pdev->dev.of_node;
|
struct device_node *np = pdev->dev.of_node;
|
||||||
struct gpio_regulator_data *drvdata;
|
struct gpio_regulator_data *drvdata;
|
||||||
struct regulator_config cfg = { };
|
struct regulator_config cfg = { };
|
||||||
|
enum gpiod_flags gflags;
|
||||||
int ptr, ret, state;
|
int ptr, ret, state;
|
||||||
|
|
||||||
drvdata = devm_kzalloc(&pdev->dev, sizeof(struct gpio_regulator_data),
|
drvdata = devm_kzalloc(&pdev->dev, sizeof(struct gpio_regulator_data),
|
||||||
|
@ -340,21 +338,22 @@ static int gpio_regulator_probe(struct platform_device *pdev)
|
||||||
cfg.driver_data = drvdata;
|
cfg.driver_data = drvdata;
|
||||||
cfg.of_node = np;
|
cfg.of_node = np;
|
||||||
|
|
||||||
if (gpio_is_valid(config->enable_gpio)) {
|
|
||||||
cfg.ena_gpio = config->enable_gpio;
|
|
||||||
cfg.ena_gpio_initialized = true;
|
|
||||||
}
|
|
||||||
cfg.ena_gpio_invert = !config->enable_high;
|
cfg.ena_gpio_invert = !config->enable_high;
|
||||||
if (config->enabled_at_boot) {
|
if (config->enabled_at_boot) {
|
||||||
if (config->enable_high)
|
if (config->enable_high)
|
||||||
cfg.ena_gpio_flags |= GPIOF_OUT_INIT_HIGH;
|
gflags = GPIOD_OUT_HIGH;
|
||||||
else
|
else
|
||||||
cfg.ena_gpio_flags |= GPIOF_OUT_INIT_LOW;
|
gflags = GPIOD_OUT_LOW;
|
||||||
} else {
|
} else {
|
||||||
if (config->enable_high)
|
if (config->enable_high)
|
||||||
cfg.ena_gpio_flags |= GPIOF_OUT_INIT_LOW;
|
gflags = GPIOD_OUT_LOW;
|
||||||
else
|
else
|
||||||
cfg.ena_gpio_flags |= GPIOF_OUT_INIT_HIGH;
|
gflags = GPIOD_OUT_HIGH;
|
||||||
|
}
|
||||||
|
cfg.ena_gpiod = devm_gpiod_get_optional(&pdev->dev, "enable", gflags);
|
||||||
|
if (IS_ERR(cfg.ena_gpiod)) {
|
||||||
|
ret = PTR_ERR(cfg.ena_gpiod);
|
||||||
|
goto err_stategpio;
|
||||||
}
|
}
|
||||||
|
|
||||||
drvdata->dev = regulator_register(&drvdata->desc, &cfg);
|
drvdata->dev = regulator_register(&drvdata->desc, &cfg);
|
||||||
|
|
|
@ -44,8 +44,6 @@ struct gpio_regulator_state {
|
||||||
/**
|
/**
|
||||||
* struct gpio_regulator_config - config structure
|
* struct gpio_regulator_config - config structure
|
||||||
* @supply_name: Name of the regulator supply
|
* @supply_name: Name of the regulator supply
|
||||||
* @enable_gpio: GPIO to use for enable control
|
|
||||||
* set to -EINVAL if not used
|
|
||||||
* @enable_high: Polarity of enable GPIO
|
* @enable_high: Polarity of enable GPIO
|
||||||
* 1 = Active high, 0 = Active low
|
* 1 = Active high, 0 = Active low
|
||||||
* @enabled_at_boot: Whether regulator has been enabled at
|
* @enabled_at_boot: Whether regulator has been enabled at
|
||||||
|
@ -69,7 +67,6 @@ struct gpio_regulator_state {
|
||||||
struct gpio_regulator_config {
|
struct gpio_regulator_config {
|
||||||
const char *supply_name;
|
const char *supply_name;
|
||||||
|
|
||||||
int enable_gpio;
|
|
||||||
unsigned enable_high:1;
|
unsigned enable_high:1;
|
||||||
unsigned enabled_at_boot:1;
|
unsigned enabled_at_boot:1;
|
||||||
unsigned startup_delay;
|
unsigned startup_delay;
|
||||||
|
|
Loading…
Reference in New Issue