lkml.org 
[lkml]   [2018]   [Sep]   [3]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.18 023/123] regulator: arizona-ldo1: Use correct device to get enable GPIO
    Date
    4.18-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Charles Keepax <ckeepax@opensource.cirrus.com>

    commit a9191579ba1086d91842199263e6fe6bb5eec1ba upstream.

    Currently the enable GPIO is being looked up on the regulator
    device itself but that does not have its own DT node, this causes
    the lookup to fail and the regulator not to get its GPIO. The DT
    node is shared across the whole MFD and as such the lookup needs
    to happen on that parent device. Moving the lookup to the parent
    device also means devres can no longer be used as the life time
    would attach to the wrong device.

    Additionally, the enable GPIO is active high so we should be passing
    GPIOD_OUT_LOW to ensure the regulator starts in its off state allowing
    the driver to enable it when it is ready.

    Fixes: e1739e86f0cb ("regulator: arizona-ldo1: Look up a descriptor and pass to the core")
    Reported-by: Matthias Reichl <hias@horus.com>
    Signed-off-by: Charles Keepax <ckeepax@opensource.cirrus.com>
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    From: Matthias Reichl <hias@horus.com>

    ---
    drivers/regulator/arizona-ldo1.c | 27 ++++++++++++++++++++++++---
    1 file changed, 24 insertions(+), 3 deletions(-)

    --- a/drivers/regulator/arizona-ldo1.c
    +++ b/drivers/regulator/arizona-ldo1.c
    @@ -36,6 +36,8 @@ struct arizona_ldo1 {

    struct regulator_consumer_supply supply;
    struct regulator_init_data init_data;
    +
    + struct gpio_desc *ena_gpiod;
    };

    static int arizona_ldo1_hc_list_voltage(struct regulator_dev *rdev,
    @@ -253,12 +255,17 @@ static int arizona_ldo1_common_init(stru
    }
    }

    - /* We assume that high output = regulator off */
    - config.ena_gpiod = devm_gpiod_get_optional(&pdev->dev, "wlf,ldoena",
    - GPIOD_OUT_HIGH);
    + /* We assume that high output = regulator off
    + * Don't use devm, since we need to get against the parent device
    + * so clean up would happen at the wrong time
    + */
    + config.ena_gpiod = gpiod_get_optional(parent_dev, "wlf,ldoena",
    + GPIOD_OUT_LOW);
    if (IS_ERR(config.ena_gpiod))
    return PTR_ERR(config.ena_gpiod);

    + ldo1->ena_gpiod = config.ena_gpiod;
    +
    if (pdata->init_data)
    config.init_data = pdata->init_data;
    else
    @@ -276,6 +283,9 @@ static int arizona_ldo1_common_init(stru
    of_node_put(config.of_node);

    if (IS_ERR(ldo1->regulator)) {
    + if (config.ena_gpiod)
    + gpiod_put(config.ena_gpiod);
    +
    ret = PTR_ERR(ldo1->regulator);
    dev_err(&pdev->dev, "Failed to register LDO1 supply: %d\n",
    ret);
    @@ -334,8 +344,19 @@ static int arizona_ldo1_probe(struct pla
    return ret;
    }

    +static int arizona_ldo1_remove(struct platform_device *pdev)
    +{
    + struct arizona_ldo1 *ldo1 = platform_get_drvdata(pdev);
    +
    + if (ldo1->ena_gpiod)
    + gpiod_put(ldo1->ena_gpiod);
    +
    + return 0;
    +}
    +
    static struct platform_driver arizona_ldo1_driver = {
    .probe = arizona_ldo1_probe,
    + .remove = arizona_ldo1_remove,
    .driver = {
    .name = "arizona-ldo1",
    },

    \
     
     \ /
      Last update: 2018-09-03 19:33    [W:3.473 / U:0.028 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site