Commit f6ec898c authored by Nikita Travkin's avatar Nikita Travkin Committed by Jonathan Cameron
Browse files

iio: light: ltr501: Add rudimentary regulator support



On some platforms the supply regulators must be enabled before the
sensor can work. Add vdd and vddio regulators for the sensor and IO bus
power respectively.

Signed-off-by: default avatarNikita Travkin <nikita@trvn.ru>
Link: https://lore.kernel.org/r/20211006163058.145842-3-nikita@trvn.ru


Signed-off-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
parent ec39f1ea
Loading
Loading
Loading
Loading
+28 −0
Original line number Original line Diff line number Diff line
@@ -15,6 +15,7 @@
#include <linux/delay.h>
#include <linux/delay.h>
#include <linux/regmap.h>
#include <linux/regmap.h>
#include <linux/acpi.h>
#include <linux/acpi.h>
#include <linux/regulator/consumer.h>


#include <linux/iio/iio.h>
#include <linux/iio/iio.h>
#include <linux/iio/events.h>
#include <linux/iio/events.h>
@@ -151,6 +152,7 @@ struct ltr501_chip_info {


struct ltr501_data {
struct ltr501_data {
	struct i2c_client *client;
	struct i2c_client *client;
	struct regulator_bulk_data regulators[2];
	struct mutex lock_als, lock_ps;
	struct mutex lock_als, lock_ps;
	const struct ltr501_chip_info *chip_info;
	const struct ltr501_chip_info *chip_info;
	u8 als_contr, ps_contr;
	u8 als_contr, ps_contr;
@@ -1379,6 +1381,13 @@ static const struct regmap_config ltr501_regmap_config = {
	.volatile_reg = ltr501_is_volatile_reg,
	.volatile_reg = ltr501_is_volatile_reg,
};
};


static void ltr501_disable_regulators(void *d)
{
	struct ltr501_data *data = d;

	regulator_bulk_disable(ARRAY_SIZE(data->regulators), data->regulators);
}

static int ltr501_powerdown(struct ltr501_data *data)
static int ltr501_powerdown(struct ltr501_data *data)
{
{
	return ltr501_write_contr(data, data->als_contr &
	return ltr501_write_contr(data, data->als_contr &
@@ -1423,6 +1432,25 @@ static int ltr501_probe(struct i2c_client *client,
	mutex_init(&data->lock_als);
	mutex_init(&data->lock_als);
	mutex_init(&data->lock_ps);
	mutex_init(&data->lock_ps);


	data->regulators[0].supply = "vdd";
	data->regulators[1].supply = "vddio";
	ret = devm_regulator_bulk_get(&client->dev,
				      ARRAY_SIZE(data->regulators),
				      data->regulators);
	if (ret)
		return dev_err_probe(&client->dev, ret,
				     "Failed to get regulators\n");

	ret = regulator_bulk_enable(ARRAY_SIZE(data->regulators),
				    data->regulators);
	if (ret)
		return ret;

	ret = devm_add_action_or_reset(&client->dev,
				       ltr501_disable_regulators, data);
	if (ret)
		return ret;

	data->reg_it = devm_regmap_field_alloc(&client->dev, regmap,
	data->reg_it = devm_regmap_field_alloc(&client->dev, regmap,
					       reg_field_it);
					       reg_field_it);
	if (IS_ERR(data->reg_it)) {
	if (IS_ERR(data->reg_it)) {