lkml.org 
[lkml]   [2018]   [May]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 12/19 v3] regulator: tps65090: Pass descriptor instead of GPIO number
    Date
    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.

    Acked-by: Lee Jones <lee.jones@linaro.org>
    Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
    ---
    ChangeLog v2->v3:
    - Resending.
    ChangeLog v1->v2:
    - Rebase the patch on the other changes.
    - Collect Lee's ACK.
    ---
    drivers/regulator/tps65090-regulator.c | 50 ++++++++++++--------------
    include/linux/mfd/tps65090.h | 8 +++--
    2 files changed, 28 insertions(+), 30 deletions(-)

    diff --git a/drivers/regulator/tps65090-regulator.c b/drivers/regulator/tps65090-regulator.c
    index 395f35dc8cdb..2d398fa3b720 100644
    --- a/drivers/regulator/tps65090-regulator.c
    +++ b/drivers/regulator/tps65090-regulator.c
    @@ -19,8 +19,8 @@
    #include <linux/module.h>
    #include <linux/delay.h>
    #include <linux/init.h>
    -#include <linux/gpio.h>
    -#include <linux/of_gpio.h>
    +#include <linux/of.h>
    +#include <linux/gpio/consumer.h>
    #include <linux/slab.h>
    #include <linux/err.h>
    #include <linux/platform_device.h>
    @@ -300,26 +300,6 @@ static int tps65090_regulator_disable_ext_control(
    return tps65090_config_ext_control(ri, false);
    }

    -static void tps65090_configure_regulator_config(
    - struct tps65090_regulator_plat_data *tps_pdata,
    - struct regulator_config *config)
    -{
    - if (gpio_is_valid(tps_pdata->gpio)) {
    - int gpio_flag = GPIOF_OUT_INIT_LOW;
    -
    - if (tps_pdata->reg_init_data->constraints.always_on ||
    - tps_pdata->reg_init_data->constraints.boot_on)
    - gpio_flag = GPIOF_OUT_INIT_HIGH;
    -
    - config->ena_gpio = tps_pdata->gpio;
    - config->ena_gpio_initialized = true;
    - config->ena_gpio_flags = gpio_flag;
    - } else {
    - config->ena_gpio = -EINVAL;
    - config->ena_gpio_initialized = false;
    - }
    -}
    -
    #ifdef CONFIG_OF
    static struct of_regulator_match tps65090_matches[] = {
    { .name = "dcdc1", },
    @@ -385,9 +365,26 @@ static struct tps65090_platform_data *tps65090_parse_dt_reg_data(
    rpdata->enable_ext_control = of_property_read_bool(
    tps65090_matches[idx].of_node,
    "ti,enable-ext-control");
    - if (rpdata->enable_ext_control)
    - rpdata->gpio = of_get_named_gpio(np,
    - "dcdc-ext-control-gpios", 0);
    + if (rpdata->enable_ext_control) {
    + enum gpiod_flags gflags;
    +
    + if (ri_data->constraints.always_on ||
    + ri_data->constraints.boot_on)
    + gflags = GPIOD_OUT_HIGH;
    + else
    + gflags = GPIOD_OUT_LOW;
    +
    + rpdata->gpiod = devm_gpiod_get_from_of_node(&pdev->dev,
    + tps65090_matches[idx].of_node,
    + "dcdc-ext-control-gpios", 0,
    + gflags,
    + "tps65090");
    + if (IS_ERR(rpdata->gpiod))
    + return ERR_CAST(rpdata->gpiod);
    + if (!rpdata->gpiod)
    + dev_err(&pdev->dev,
    + "could not find DCDC external control GPIO\n");
    + }

    if (of_property_read_u32(tps65090_matches[idx].of_node,
    "ti,overcurrent-wait",
    @@ -455,8 +452,7 @@ static int tps65090_regulator_probe(struct platform_device *pdev)
    */
    if (tps_pdata && is_dcdc(num) && tps_pdata->reg_init_data) {
    if (tps_pdata->enable_ext_control) {
    - tps65090_configure_regulator_config(
    - tps_pdata, &config);
    + config.ena_gpiod = tps_pdata->gpiod;
    ri->desc->ops = &tps65090_ext_control_ops;
    } else {
    ret = tps65090_regulator_disable_ext_control(
    diff --git a/include/linux/mfd/tps65090.h b/include/linux/mfd/tps65090.h
    index 67d144b3b8f9..f05bf4a146e2 100644
    --- a/include/linux/mfd/tps65090.h
    +++ b/include/linux/mfd/tps65090.h
    @@ -83,6 +83,8 @@ enum {
    #define TPS65090_MAX_REG TPS65090_REG_AD_OUT2
    #define TPS65090_NUM_REGS (TPS65090_MAX_REG + 1)

    +struct gpio_desc;
    +
    struct tps65090 {
    struct device *dev;
    struct regmap *rmap;
    @@ -95,8 +97,8 @@ struct tps65090 {
    * @reg_init_data: The regulator init data.
    * @enable_ext_control: Enable extrenal control or not. Only available for
    * DCDC1, DCDC2 and DCDC3.
    - * @gpio: Gpio number if external control is enabled and controlled through
    - * gpio.
    + * @gpiod: Gpio descriptor if external control is enabled and controlled through
    + * gpio
    * @overcurrent_wait_valid: True if the overcurrent_wait should be applied.
    * @overcurrent_wait: Value to set as the overcurrent wait time. This is the
    * actual bitfield value, not a time in ms (valid value are 0 - 3).
    @@ -104,7 +106,7 @@ struct tps65090 {
    struct tps65090_regulator_plat_data {
    struct regulator_init_data *reg_init_data;
    bool enable_ext_control;
    - int gpio;
    + struct gpio_desc *gpiod;
    bool overcurrent_wait_valid;
    int overcurrent_wait;
    };
    --
    2.17.0
    \
     
     \ /
      Last update: 2018-05-14 10:11    [W:4.043 / U:0.136 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site