Commit 90e96fdd authored by Linus Walleij's avatar Linus Walleij Committed by Jonathan Cameron

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: default avatarLinus Walleij <linus.walleij@linaro.org>
Signed-off-by: default avatarJonathan Cameron <jic23@kernel.org>
parent c5842b47
...@@ -389,17 +389,16 @@ static int ak8975_power_on(struct i2c_client *client) ...@@ -389,17 +389,16 @@ static int ak8975_power_on(struct i2c_client *client)
int ret; int ret;
data->vdd = devm_regulator_get(&client->dev, "vdd"); 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); ret = PTR_ERR(data->vdd);
if (ret == -ENODEV)
ret = 0;
} else { } else {
ret = regulator_enable(data->vdd); ret = regulator_enable(data->vdd);
} }
if (ret) {
if (ret) dev_warn(&client->dev,
dev_err(&client->dev, "failed to enable Vdd supply: %d\n", ret); "Failed to enable specified Vdd supply\n");
return ret; return ret;
}
} }
/* Disable attached power regulator if any. */ /* Disable attached power regulator if any. */
...@@ -408,7 +407,6 @@ static void ak8975_power_off(const struct i2c_client *client) ...@@ -408,7 +407,6 @@ static void ak8975_power_off(const struct i2c_client *client)
const struct iio_dev *indio_dev = i2c_get_clientdata(client); const struct iio_dev *indio_dev = i2c_get_clientdata(client);
const struct ak8975_data *data = iio_priv(indio_dev); const struct ak8975_data *data = iio_priv(indio_dev);
if (!IS_ERR_OR_NULL(data->vdd))
regulator_disable(data->vdd); regulator_disable(data->vdd);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment