lkml.org 
[lkml]   [2018]   [Apr]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 18/18 v2] regulator: gpio: Simplify probe path
    Date
    Use devm_* managed device resources and create a local
    struct device *dev variable to simplify the code inside
    probe().

    Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
    ---
    ChangeLog v1->v2:
    - Rebase the patch on the other changes.
    ---
    drivers/regulator/gpio-regulator.c | 56 ++++++++++++++++----------------------
    1 file changed, 23 insertions(+), 33 deletions(-)

    diff --git a/drivers/regulator/gpio-regulator.c b/drivers/regulator/gpio-regulator.c
    index 756b7b50ffba..e4b573bf8b99 100644
    --- a/drivers/regulator/gpio-regulator.c
    +++ b/drivers/regulator/gpio-regulator.c
    @@ -228,27 +228,28 @@ static struct regulator_ops gpio_regulator_current_ops = {

    static int gpio_regulator_probe(struct platform_device *pdev)
    {
    - struct gpio_regulator_config *config = dev_get_platdata(&pdev->dev);
    - struct device_node *np = pdev->dev.of_node;
    + struct device *dev = &pdev->dev;
    + struct gpio_regulator_config *config = dev_get_platdata(dev);
    + struct device_node *np = dev->of_node;
    struct gpio_regulator_data *drvdata;
    struct regulator_config cfg = { };
    enum gpiod_flags gflags;
    int ptr, ret, state, i;

    - drvdata = devm_kzalloc(&pdev->dev, sizeof(struct gpio_regulator_data),
    + drvdata = devm_kzalloc(dev, sizeof(struct gpio_regulator_data),
    GFP_KERNEL);
    if (drvdata == NULL)
    return -ENOMEM;

    if (np) {
    - config = of_get_gpio_regulator_config(&pdev->dev, np,
    + config = of_get_gpio_regulator_config(dev, np,
    &drvdata->desc);
    if (IS_ERR(config))
    return PTR_ERR(config);
    }

    for (i = 0; i < config->ngpios; i++) {
    - drvdata->gpiods[i] = devm_gpiod_get_index(&pdev->dev,
    + drvdata->gpiods[i] = devm_gpiod_get_index(dev,
    config->supply_name,
    i,
    config->gflags[i]);
    @@ -257,20 +258,20 @@ static int gpio_regulator_probe(struct platform_device *pdev)
    }
    drvdata->nr_gpios = config->ngpios;

    - drvdata->desc.name = kstrdup(config->supply_name, GFP_KERNEL);
    + drvdata->desc.name = devm_kstrdup(dev, config->supply_name, GFP_KERNEL);
    if (drvdata->desc.name == NULL) {
    - dev_err(&pdev->dev, "Failed to allocate supply name\n");
    + dev_err(dev, "Failed to allocate supply name\n");
    return -ENOMEM;
    }

    - drvdata->states = kmemdup(config->states,
    - config->nr_states *
    - sizeof(struct gpio_regulator_state),
    - GFP_KERNEL);
    + drvdata->states = devm_kmemdup(dev,
    + config->states,
    + config->nr_states *
    + sizeof(struct gpio_regulator_state),
    + GFP_KERNEL);
    if (drvdata->states == NULL) {
    - dev_err(&pdev->dev, "Failed to allocate state data\n");
    - ret = -ENOMEM;
    - goto err_name;
    + dev_err(dev, "Failed to allocate state data\n");
    + return -ENOMEM;
    }
    drvdata->nr_states = config->nr_states;

    @@ -289,9 +290,8 @@ static int gpio_regulator_probe(struct platform_device *pdev)
    drvdata->desc.ops = &gpio_regulator_current_ops;
    break;
    default:
    - dev_err(&pdev->dev, "No regulator type set\n");
    - ret = -EINVAL;
    - goto err_memstate;
    + dev_err(dev, "No regulator type set\n");
    + return -EINVAL;
    }

    /* build initial state from gpio init data. */
    @@ -302,7 +302,7 @@ static int gpio_regulator_probe(struct platform_device *pdev)
    }
    drvdata->state = state;

    - cfg.dev = &pdev->dev;
    + cfg.dev = dev;
    cfg.init_data = config->init_data;
    cfg.driver_data = drvdata;
    cfg.of_node = np;
    @@ -316,28 +316,20 @@ static int gpio_regulator_probe(struct platform_device *pdev)
    else
    gflags = GPIOD_OUT_LOW;

    - 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_memstate;
    - }
    + cfg.ena_gpiod = devm_gpiod_get_optional(dev, "enable", gflags);
    + if (IS_ERR(cfg.ena_gpiod))
    + return PTR_ERR(cfg.ena_gpiod);

    drvdata->dev = regulator_register(&drvdata->desc, &cfg);
    if (IS_ERR(drvdata->dev)) {
    ret = PTR_ERR(drvdata->dev);
    - dev_err(&pdev->dev, "Failed to register regulator: %d\n", ret);
    - goto err_memstate;
    + dev_err(dev, "Failed to register regulator: %d\n", ret);
    + return ret;
    }

    platform_set_drvdata(pdev, drvdata);

    return 0;
    -
    -err_memstate:
    - kfree(drvdata->states);
    -err_name:
    - kfree(drvdata->desc.name);
    - return ret;
    }

    static int gpio_regulator_remove(struct platform_device *pdev)
    @@ -345,8 +337,6 @@ static int gpio_regulator_remove(struct platform_device *pdev)
    struct gpio_regulator_data *drvdata = platform_get_drvdata(pdev);

    regulator_unregister(drvdata->dev);
    - kfree(drvdata->states);
    - kfree(drvdata->desc.name);

    return 0;
    }
    --
    2.14.3
    \
     
     \ /
      Last update: 2018-04-23 01:11    [W:4.213 / U:0.180 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site