Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3e0f964f authored by Wei Ni's avatar Wei Ni Committed by Jean Delvare
Browse files

hwmon: (lm90) Add power control



The device lm90 can be controlled by the vcc rail.
Adding the regulator support to power on/off the vcc rail.
Enable the "vcc" regulator before accessing the device.

[JD: Rename variables to avoid confusion with registers.]

Signed-off-by: default avatarWei Ni <wni@nvidia.com>
Signed-off-by: default avatarJean Delvare <khali@linux-fr.org>
parent 1daaceb2
Loading
Loading
Loading
Loading
+19 −0
Original line number Diff line number Diff line
@@ -95,6 +95,7 @@
#include <linux/mutex.h>
#include <linux/sysfs.h>
#include <linux/interrupt.h>
#include <linux/regulator/consumer.h>

/*
 * Addresses to scan
@@ -366,6 +367,7 @@ enum lm90_temp11_reg_index {
struct lm90_data {
	struct device *hwmon_dev;
	struct mutex update_lock;
	struct regulator *regulator;
	char valid; /* zero until following fields are valid */
	unsigned long last_updated; /* in jiffies */
	int kind;
@@ -1516,8 +1518,20 @@ static int lm90_probe(struct i2c_client *client,
	struct device *dev = &client->dev;
	struct i2c_adapter *adapter = to_i2c_adapter(dev->parent);
	struct lm90_data *data;
	struct regulator *regulator;
	int err;

	regulator = devm_regulator_get(dev, "vcc");
	if (IS_ERR(regulator))
		return PTR_ERR(regulator);

	err = regulator_enable(regulator);
	if (err < 0) {
		dev_err(&client->dev,
			"Failed to enable regulator: %d\n", err);
		return err;
	}

	data = devm_kzalloc(&client->dev, sizeof(struct lm90_data), GFP_KERNEL);
	if (!data)
		return -ENOMEM;
@@ -1525,6 +1539,8 @@ static int lm90_probe(struct i2c_client *client,
	i2c_set_clientdata(client, data);
	mutex_init(&data->update_lock);

	data->regulator = regulator;

	/* Set the device type */
	data->kind = id->driver_data;
	if (data->kind == adm1032) {
@@ -1604,6 +1620,8 @@ exit_remove_files:
	lm90_remove_files(client, data);
exit_restore:
	lm90_restore_conf(client, data);
	regulator_disable(data->regulator);

	return err;
}

@@ -1614,6 +1632,7 @@ static int lm90_remove(struct i2c_client *client)
	hwmon_device_unregister(data->hwmon_dev);
	lm90_remove_files(client, data);
	lm90_restore_conf(client, data);
	regulator_disable(data->regulator);

	return 0;
}