iio: st_sensors: core and lsm9ds0 switch to devm_regulator_bulk_get_enable()
These drivers only turns the power on at probe and off via a custom devm_add_action_or_reset() callback. The two regulators were handled separately so also switch to bulk registration. The new devm_regulator_bulk_get_enable() replaces all this boilerplate code. Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com> Cc: Linus Walleij <linus.walleij@linaro.org> Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com> Reviewed-by: Matti Vaittinen <mazziesaccount@gmail.com> Reviewed-by: Nuno Sá <nuno.sa@analog.com> Link: https://lore.kernel.org/r/20221016163409.320197-8-jic23@kernel.org
This commit is contained in:
Родитель
72ce527c7b
Коммит
9e855d77b1
|
@ -219,47 +219,22 @@ int st_sensors_set_axis_enable(struct iio_dev *indio_dev, u8 axis_enable)
|
|||
}
|
||||
EXPORT_SYMBOL_NS(st_sensors_set_axis_enable, IIO_ST_SENSORS);
|
||||
|
||||
static void st_reg_disable(void *reg)
|
||||
{
|
||||
regulator_disable(reg);
|
||||
}
|
||||
|
||||
int st_sensors_power_enable(struct iio_dev *indio_dev)
|
||||
{
|
||||
struct st_sensor_data *pdata = iio_priv(indio_dev);
|
||||
static const char * const regulator_names[] = { "vdd", "vddio" };
|
||||
struct device *parent = indio_dev->dev.parent;
|
||||
int err;
|
||||
|
||||
/* Regulators not mandatory, but if requested we should enable them. */
|
||||
pdata->vdd = devm_regulator_get(parent, "vdd");
|
||||
if (IS_ERR(pdata->vdd))
|
||||
return dev_err_probe(&indio_dev->dev, PTR_ERR(pdata->vdd),
|
||||
"unable to get Vdd supply\n");
|
||||
|
||||
err = regulator_enable(pdata->vdd);
|
||||
if (err != 0) {
|
||||
dev_warn(&indio_dev->dev,
|
||||
"Failed to enable specified Vdd supply\n");
|
||||
return err;
|
||||
}
|
||||
|
||||
err = devm_add_action_or_reset(parent, st_reg_disable, pdata->vdd);
|
||||
err = devm_regulator_bulk_get_enable(parent,
|
||||
ARRAY_SIZE(regulator_names),
|
||||
regulator_names);
|
||||
if (err)
|
||||
return err;
|
||||
return dev_err_probe(&indio_dev->dev, err,
|
||||
"unable to enable supplies\n");
|
||||
|
||||
pdata->vdd_io = devm_regulator_get(parent, "vddio");
|
||||
if (IS_ERR(pdata->vdd_io))
|
||||
return dev_err_probe(&indio_dev->dev, PTR_ERR(pdata->vdd_io),
|
||||
"unable to get Vdd_IO supply\n");
|
||||
|
||||
err = regulator_enable(pdata->vdd_io);
|
||||
if (err != 0) {
|
||||
dev_warn(&indio_dev->dev,
|
||||
"Failed to enable specified Vdd_IO supply\n");
|
||||
return err;
|
||||
}
|
||||
|
||||
return devm_add_action_or_reset(parent, st_reg_disable, pdata->vdd_io);
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_NS(st_sensors_power_enable, IIO_ST_SENSORS);
|
||||
|
||||
|
|
|
@ -18,58 +18,6 @@
|
|||
|
||||
#include "st_lsm9ds0.h"
|
||||
|
||||
static int st_lsm9ds0_power_enable(struct device *dev, struct st_lsm9ds0 *lsm9ds0)
|
||||
{
|
||||
int ret;
|
||||
|
||||
/* Regulators not mandatory, but if requested we should enable them. */
|
||||
lsm9ds0->vdd = devm_regulator_get(dev, "vdd");
|
||||
if (IS_ERR(lsm9ds0->vdd))
|
||||
return dev_err_probe(dev, PTR_ERR(lsm9ds0->vdd),
|
||||
"unable to get Vdd supply\n");
|
||||
|
||||
ret = regulator_enable(lsm9ds0->vdd);
|
||||
if (ret) {
|
||||
dev_warn(dev, "Failed to enable specified Vdd supply\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
lsm9ds0->vdd_io = devm_regulator_get(dev, "vddio");
|
||||
if (IS_ERR(lsm9ds0->vdd_io)) {
|
||||
regulator_disable(lsm9ds0->vdd);
|
||||
return dev_err_probe(dev, PTR_ERR(lsm9ds0->vdd_io),
|
||||
"unable to get Vdd_IO supply\n");
|
||||
}
|
||||
ret = regulator_enable(lsm9ds0->vdd_io);
|
||||
if (ret) {
|
||||
dev_warn(dev, "Failed to enable specified Vdd_IO supply\n");
|
||||
regulator_disable(lsm9ds0->vdd);
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void st_lsm9ds0_power_disable(void *data)
|
||||
{
|
||||
struct st_lsm9ds0 *lsm9ds0 = data;
|
||||
|
||||
regulator_disable(lsm9ds0->vdd_io);
|
||||
regulator_disable(lsm9ds0->vdd);
|
||||
}
|
||||
|
||||
static int devm_st_lsm9ds0_power_enable(struct st_lsm9ds0 *lsm9ds0)
|
||||
{
|
||||
struct device *dev = lsm9ds0->dev;
|
||||
int ret;
|
||||
|
||||
ret = st_lsm9ds0_power_enable(dev, lsm9ds0);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
return devm_add_action_or_reset(dev, st_lsm9ds0_power_disable, lsm9ds0);
|
||||
}
|
||||
|
||||
static int st_lsm9ds0_probe_accel(struct st_lsm9ds0 *lsm9ds0, struct regmap *regmap)
|
||||
{
|
||||
const struct st_sensor_settings *settings;
|
||||
|
@ -92,8 +40,6 @@ static int st_lsm9ds0_probe_accel(struct st_lsm9ds0 *lsm9ds0, struct regmap *reg
|
|||
data->sensor_settings = (struct st_sensor_settings *)settings;
|
||||
data->irq = lsm9ds0->irq;
|
||||
data->regmap = regmap;
|
||||
data->vdd = lsm9ds0->vdd;
|
||||
data->vdd_io = lsm9ds0->vdd_io;
|
||||
|
||||
return st_accel_common_probe(lsm9ds0->accel);
|
||||
}
|
||||
|
@ -120,19 +66,22 @@ static int st_lsm9ds0_probe_magn(struct st_lsm9ds0 *lsm9ds0, struct regmap *regm
|
|||
data->sensor_settings = (struct st_sensor_settings *)settings;
|
||||
data->irq = lsm9ds0->irq;
|
||||
data->regmap = regmap;
|
||||
data->vdd = lsm9ds0->vdd;
|
||||
data->vdd_io = lsm9ds0->vdd_io;
|
||||
|
||||
return st_magn_common_probe(lsm9ds0->magn);
|
||||
}
|
||||
|
||||
int st_lsm9ds0_probe(struct st_lsm9ds0 *lsm9ds0, struct regmap *regmap)
|
||||
{
|
||||
struct device *dev = lsm9ds0->dev;
|
||||
static const char * const regulator_names[] = { "vdd", "vddio" };
|
||||
int ret;
|
||||
|
||||
ret = devm_st_lsm9ds0_power_enable(lsm9ds0);
|
||||
/* Regulators not mandatory, but if requested we should enable them. */
|
||||
ret = devm_regulator_bulk_get_enable(dev, ARRAY_SIZE(regulator_names),
|
||||
regulator_names);
|
||||
if (ret)
|
||||
return ret;
|
||||
return dev_err_probe(dev, ret,
|
||||
"unable to enable Vdd supply\n");
|
||||
|
||||
/* Setup accelerometer device */
|
||||
ret = st_lsm9ds0_probe_accel(lsm9ds0, regmap);
|
||||
|
|
|
@ -224,8 +224,6 @@ struct st_sensor_settings {
|
|||
* @mount_matrix: The mounting matrix of the sensor.
|
||||
* @sensor_settings: Pointer to the specific sensor settings in use.
|
||||
* @current_fullscale: Maximum range of measure by the sensor.
|
||||
* @vdd: Pointer to sensor's Vdd power supply
|
||||
* @vdd_io: Pointer to sensor's Vdd-IO power supply
|
||||
* @regmap: Pointer to specific sensor regmap configuration.
|
||||
* @enabled: Status of the sensor (false->off, true->on).
|
||||
* @odr: Output data rate of the sensor [Hz].
|
||||
|
@ -244,8 +242,6 @@ struct st_sensor_data {
|
|||
struct iio_mount_matrix mount_matrix;
|
||||
struct st_sensor_settings *sensor_settings;
|
||||
struct st_sensor_fullscale_avl *current_fullscale;
|
||||
struct regulator *vdd;
|
||||
struct regulator *vdd_io;
|
||||
struct regmap *regmap;
|
||||
|
||||
bool enabled;
|
||||
|
|
Загрузка…
Ссылка в новой задаче