Skip to content

Commit

Permalink
regulator: rk808: make better use of the gpiod API
Browse files Browse the repository at this point in the history
The gpiod functions include variants for managed gpiod resources. Use it
to simplify the remove function.

As the driver handles a device node without a specification of dvs gpios
just fine, additionally use the variant of gpiod_get exactly for this
use case. This makes error checking more strict.

As a third benefit this patch makes the driver use the flags parameter
of gpiod_get* which will not be optional any more after 4.2 and so
prevents a build failure when the respective gpiod commit is merged.

Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Signed-off-by: Mark Brown <broonie@kernel.org>
  • Loading branch information
Uwe Kleine-König authored and Mark Brown committed Jul 21, 2015
1 parent 604d499 commit a13eaf0
Showing 1 changed file with 12 additions and 20 deletions.
32 changes: 12 additions & 20 deletions drivers/regulator/rk808-regulator.c
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ static int rk808_buck1_2_get_voltage_sel_regmap(struct regulator_dev *rdev)
unsigned int val;
int ret;

if (IS_ERR(gpio) || gpiod_get_value(gpio) == 0)
if (!gpio || gpiod_get_value(gpio) == 0)
return regulator_get_voltage_sel_regmap(rdev);

ret = regmap_read(rdev->regmap,
Expand Down Expand Up @@ -169,7 +169,7 @@ static int rk808_buck1_2_set_voltage_sel(struct regulator_dev *rdev,
unsigned old_sel;
int ret, gpio_level;

if (IS_ERR(gpio))
if (!gpio)
return rk808_buck1_2_i2c_set_voltage_sel(rdev, sel);

gpio_level = gpiod_get_value(gpio);
Expand Down Expand Up @@ -206,7 +206,7 @@ static int rk808_buck1_2_set_voltage_time_sel(struct regulator_dev *rdev,
struct gpio_desc *gpio = pdata->dvs_gpio[id];

/* if there is no dvs1/2 pin, we don't need wait extra time here. */
if (IS_ERR(gpio))
if (!gpio)
return 0;

return regulator_set_voltage_time_sel(rdev, old_selector, new_selector);
Expand Down Expand Up @@ -541,14 +541,20 @@ static int rk808_regulator_dt_parse_pdata(struct device *dev,
goto dt_parse_end;

for (i = 0; i < ARRAY_SIZE(pdata->dvs_gpio); i++) {
pdata->dvs_gpio[i] = gpiod_get_index(client_dev, "dvs", i);
pdata->dvs_gpio[i] =
devm_gpiod_get_index_optional(client_dev, "dvs", i,
GPIOD_OUT_LOW);
if (IS_ERR(pdata->dvs_gpio[i])) {
ret = PTR_ERR(pdata->dvs_gpio[i]);
dev_err(dev, "failed to get dvs%d gpio (%d)\n", i, ret);
goto dt_parse_end;
}

if (!pdata->dvs_gpio[i]) {
dev_warn(dev, "there is no dvs%d gpio\n", i);
continue;
}

gpiod_direction_output(pdata->dvs_gpio[i], 0);

tmp = i ? RK808_DVS2_POL : RK808_DVS1_POL;
ret = regmap_update_bits(map, RK808_IO_POL_REG, tmp,
gpiod_is_active_low(pdata->dvs_gpio[i]) ?
Expand All @@ -560,19 +566,6 @@ static int rk808_regulator_dt_parse_pdata(struct device *dev,
return ret;
}

static int rk808_regulator_remove(struct platform_device *pdev)
{
struct rk808_regulator_data *pdata = platform_get_drvdata(pdev);
int i;

for (i = 0; i < ARRAY_SIZE(pdata->dvs_gpio); i++) {
if (!IS_ERR(pdata->dvs_gpio[i]))
gpiod_put(pdata->dvs_gpio[i]);
}

return 0;
}

static int rk808_regulator_probe(struct platform_device *pdev)
{
struct rk808 *rk808 = dev_get_drvdata(pdev->dev.parent);
Expand Down Expand Up @@ -619,7 +612,6 @@ static int rk808_regulator_probe(struct platform_device *pdev)

static struct platform_driver rk808_regulator_driver = {
.probe = rk808_regulator_probe,
.remove = rk808_regulator_remove,
.driver = {
.name = "rk808-regulator",
.owner = THIS_MODULE,
Expand Down

0 comments on commit a13eaf0

Please sign in to comment.