Message ID | 20180212131717.27193-15-linus.walleij@linaro.org |
---|---|
State | Superseded |
Headers | show |
Series | regulator: switch core to GPIO descriptors | expand |
On Mon, 12 Feb 2018, Linus Walleij wrote: > Instead of passing a global GPIO number for the enable GPIO, pass > a descriptor looked up from the device tree node for the > regulator. > > This regulator supports passing platform data, but enable/sleep > regulators are looked up from the device tree exclusively, so > we can need not touch other files. > > Cc: Lee Jones <lee.jones@linaro.org> > Signed-off-by: Linus Walleij <linus.walleij@linaro.org> > --- > Lee: would be nice if you could ACK this smallish patch to > the MFD header. Fine, but any sign of a conflict and I'll need a PR. Acked-by: Lee Jones <lee.jones@linaro.org> > --- > drivers/regulator/s5m8767.c | 26 +++++++++++++++----------- > include/linux/mfd/samsung/core.h | 4 +++- > 2 files changed, 18 insertions(+), 12 deletions(-) > > diff --git a/drivers/regulator/s5m8767.c b/drivers/regulator/s5m8767.c > index 4836947e1521..b8443a360646 100644 > --- a/drivers/regulator/s5m8767.c > +++ b/drivers/regulator/s5m8767.c > @@ -13,6 +13,7 @@ > > #include <linux/err.h> > #include <linux/of_gpio.h> > +#include <linux/gpio/consumer.h> > #include <linux/module.h> > #include <linux/platform_device.h> > #include <linux/regulator/driver.h> > @@ -459,15 +460,14 @@ static void s5m8767_regulator_config_ext_control(struct s5m8767_info *s5m8767, > return; > } > > - if (!gpio_is_valid(rdata->ext_control_gpio)) { > + if (!rdata->ext_control_gpiod) { > dev_warn(s5m8767->dev, > "ext-control for %s: GPIO not valid, ignoring\n", > - rdata->reg_node->name); > + rdata->reg_node->name); > return; > } > > - config->ena_gpio = rdata->ext_control_gpio; > - config->ena_gpio_flags = GPIOF_OUT_INIT_HIGH; > + config->ena_gpiod = rdata->ext_control_gpiod; > } > > /* > @@ -577,8 +577,14 @@ static int s5m8767_pmic_dt_parse_pdata(struct platform_device *pdev, > continue; > } > > - rdata->ext_control_gpio = of_get_named_gpio(reg_np, > - "s5m8767,pmic-ext-control-gpios", 0); > + rdata->ext_control_gpiod = devm_gpiod_get_from_of_node(&pdev->dev, > + reg_np, > + "s5m8767,pmic-ext-control-gpios", > + 0, > + GPIOD_OUT_HIGH, > + "s5m8767"); > + if (IS_ERR(rdata->ext_control_gpiod)) > + return PTR_ERR(rdata->ext_control_gpiod); > > rdata->id = i; > rdata->initdata = of_get_regulator_init_data( > @@ -954,10 +960,8 @@ static int s5m8767_pmic_probe(struct platform_device *pdev) > config.driver_data = s5m8767; > config.regmap = iodev->regmap_pmic; > config.of_node = pdata->regulators[i].reg_node; > - config.ena_gpio = -EINVAL; > - config.ena_gpio_flags = 0; > - config.ena_gpio_initialized = true; > - if (gpio_is_valid(pdata->regulators[i].ext_control_gpio)) > + config.ena_gpiod = NULL; > + if (pdata->regulators[i].ext_control_gpiod) > s5m8767_regulator_config_ext_control(s5m8767, > &pdata->regulators[i], &config); > > @@ -970,7 +974,7 @@ static int s5m8767_pmic_probe(struct platform_device *pdev) > return ret; > } > > - if (gpio_is_valid(pdata->regulators[i].ext_control_gpio)) { > + if (pdata->regulators[i].ext_control_gpiod) { > ret = s5m8767_enable_ext_control(s5m8767, rdev); > if (ret < 0) { > dev_err(s5m8767->dev, > diff --git a/include/linux/mfd/samsung/core.h b/include/linux/mfd/samsung/core.h > index 5a23dd4df432..28f4ae76271d 100644 > --- a/include/linux/mfd/samsung/core.h > +++ b/include/linux/mfd/samsung/core.h > @@ -39,6 +39,8 @@ > #define STEP_12_5_MV 12500 > #define STEP_6_25_MV 6250 > > +struct gpio_desc; > + > enum sec_device_type { > S5M8751X, > S5M8763X, > @@ -151,7 +153,7 @@ struct sec_regulator_data { > int id; > struct regulator_init_data *initdata; > struct device_node *reg_node; > - int ext_control_gpio; > + struct gpio_desc *ext_control_gpiod; > }; > > /* -- Lee Jones Linaro Services Technical Lead Linaro.org │ Open source software for ARM SoCs Follow Linaro: Facebook | Twitter | Blog
diff --git a/drivers/regulator/s5m8767.c b/drivers/regulator/s5m8767.c index 4836947e1521..b8443a360646 100644 --- a/drivers/regulator/s5m8767.c +++ b/drivers/regulator/s5m8767.c @@ -13,6 +13,7 @@ #include <linux/err.h> #include <linux/of_gpio.h> +#include <linux/gpio/consumer.h> #include <linux/module.h> #include <linux/platform_device.h> #include <linux/regulator/driver.h> @@ -459,15 +460,14 @@ static void s5m8767_regulator_config_ext_control(struct s5m8767_info *s5m8767, return; } - if (!gpio_is_valid(rdata->ext_control_gpio)) { + if (!rdata->ext_control_gpiod) { dev_warn(s5m8767->dev, "ext-control for %s: GPIO not valid, ignoring\n", - rdata->reg_node->name); + rdata->reg_node->name); return; } - config->ena_gpio = rdata->ext_control_gpio; - config->ena_gpio_flags = GPIOF_OUT_INIT_HIGH; + config->ena_gpiod = rdata->ext_control_gpiod; } /* @@ -577,8 +577,14 @@ static int s5m8767_pmic_dt_parse_pdata(struct platform_device *pdev, continue; } - rdata->ext_control_gpio = of_get_named_gpio(reg_np, - "s5m8767,pmic-ext-control-gpios", 0); + rdata->ext_control_gpiod = devm_gpiod_get_from_of_node(&pdev->dev, + reg_np, + "s5m8767,pmic-ext-control-gpios", + 0, + GPIOD_OUT_HIGH, + "s5m8767"); + if (IS_ERR(rdata->ext_control_gpiod)) + return PTR_ERR(rdata->ext_control_gpiod); rdata->id = i; rdata->initdata = of_get_regulator_init_data( @@ -954,10 +960,8 @@ static int s5m8767_pmic_probe(struct platform_device *pdev) config.driver_data = s5m8767; config.regmap = iodev->regmap_pmic; config.of_node = pdata->regulators[i].reg_node; - config.ena_gpio = -EINVAL; - config.ena_gpio_flags = 0; - config.ena_gpio_initialized = true; - if (gpio_is_valid(pdata->regulators[i].ext_control_gpio)) + config.ena_gpiod = NULL; + if (pdata->regulators[i].ext_control_gpiod) s5m8767_regulator_config_ext_control(s5m8767, &pdata->regulators[i], &config); @@ -970,7 +974,7 @@ static int s5m8767_pmic_probe(struct platform_device *pdev) return ret; } - if (gpio_is_valid(pdata->regulators[i].ext_control_gpio)) { + if (pdata->regulators[i].ext_control_gpiod) { ret = s5m8767_enable_ext_control(s5m8767, rdev); if (ret < 0) { dev_err(s5m8767->dev, diff --git a/include/linux/mfd/samsung/core.h b/include/linux/mfd/samsung/core.h index 5a23dd4df432..28f4ae76271d 100644 --- a/include/linux/mfd/samsung/core.h +++ b/include/linux/mfd/samsung/core.h @@ -39,6 +39,8 @@ #define STEP_12_5_MV 12500 #define STEP_6_25_MV 6250 +struct gpio_desc; + enum sec_device_type { S5M8751X, S5M8763X, @@ -151,7 +153,7 @@ struct sec_regulator_data { int id; struct regulator_init_data *initdata; struct device_node *reg_node; - int ext_control_gpio; + struct gpio_desc *ext_control_gpiod; }; /*
Instead of passing a global GPIO number for the enable GPIO, pass a descriptor looked up from the device tree node for the regulator. This regulator supports passing platform data, but enable/sleep regulators are looked up from the device tree exclusively, so we can need not touch other files. Cc: Lee Jones <lee.jones@linaro.org> Signed-off-by: Linus Walleij <linus.walleij@linaro.org> --- Lee: would be nice if you could ACK this smallish patch to the MFD header. --- drivers/regulator/s5m8767.c | 26 +++++++++++++++----------- include/linux/mfd/samsung/core.h | 4 +++- 2 files changed, 18 insertions(+), 12 deletions(-) -- 2.14.3