summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinus Walleij <linus.walleij@linaro.org>2016-06-29 15:08:33 +0300
committerJonathan Cameron <jic23@kernel.org>2016-06-30 22:39:43 +0300
commit90e96fdd012925871a1a21b5eaeab4b027682d6a (patch)
treec43b758c07579642dc67871bbc976ebae7f12cb4
parentc5842b47b2945d6db24b4db6b2c7364e94cbc78b (diff)
downloadlinux-90e96fdd012925871a1a21b5eaeab4b027682d6a.tar.xz
iio: magn: ak8975: fix regulator usage
IS_ERR_OR_NULL() should never be used with regulators because a NULL pointer may be a perfectly valid dummy regulator We should always succeed to fetch and enable a regulator, but it may be a dummy. That is fine, so bail out for any real errors or probe deferrals Include the error code in the warning print so we know what kind of problem we're dealing with (for example it is nice to see if it is a probe deferral). As we will bail out of probe if the regulator is erroneous, just issue regulator_disable() on the poweroff path: it will succeed. Cc: Mark Brown <broonie@kernel.org> Cc: Lars-Peter Clausen Lars-Peter Clausen <lars@metafoo.de> Signed-off-by: Linus Walleij <linus.walleij@linaro.org> Signed-off-by: Jonathan Cameron <jic23@kernel.org>
-rw-r--r--drivers/iio/magnetometer/ak8975.c16
1 files changed, 7 insertions, 9 deletions
diff --git a/drivers/iio/magnetometer/ak8975.c b/drivers/iio/magnetometer/ak8975.c
index 2121b50ab9b3..def693cf7c7a 100644
--- a/drivers/iio/magnetometer/ak8975.c
+++ b/drivers/iio/magnetometer/ak8975.c
@@ -389,17 +389,16 @@ static int ak8975_power_on(struct i2c_client *client)
int ret;
data->vdd = devm_regulator_get(&client->dev, "vdd");
- if (IS_ERR_OR_NULL(data->vdd)) {
+ if (IS_ERR(data->vdd)) {
ret = PTR_ERR(data->vdd);
- if (ret == -ENODEV)
- ret = 0;
} else {
ret = regulator_enable(data->vdd);
}
-
- if (ret)
- dev_err(&client->dev, "failed to enable Vdd supply: %d\n", ret);
- return ret;
+ if (ret) {
+ dev_warn(&client->dev,
+ "Failed to enable specified Vdd supply\n");
+ return ret;
+ }
}
/* Disable attached power regulator if any. */
@@ -408,8 +407,7 @@ static void ak8975_power_off(const struct i2c_client *client)
const struct iio_dev *indio_dev = i2c_get_clientdata(client);
const struct ak8975_data *data = iio_priv(indio_dev);
- if (!IS_ERR_OR_NULL(data->vdd))
- regulator_disable(data->vdd);
+ regulator_disable(data->vdd);
}
/*