summaryrefslogtreecommitdiff
path: root/drivers/misc
diff options
context:
space:
mode:
authorLaxman Dewangan <ldewangan@nvidia.com>2011-07-08 14:03:14 +0530
committerDan Willemsen <dwillemsen@nvidia.com>2011-11-30 21:47:27 -0800
commit2e577cec79513067b815fe8cfdc500682db53f49 (patch)
treee3b9691577e7bc0c4747dd842a93b9dadfdca763 /drivers/misc
parente77321bf7fb2e7ea74cd21ae82ef7f8d3622c32e (diff)
misc: nct1008: Power control for nct1008
Adding the power control support for device nct1008 to make sure that power is enable on device before accessing the device. bug 849307 Original-Change-Id: I84d7abc142814014bfc568b3a4b0ae0d5329f41e Reviewed-on: http://git-master/r/40160 Reviewed-by: Laxman Dewangan <ldewangan@nvidia.com> Tested-by: Laxman Dewangan <ldewangan@nvidia.com> Reviewed-by: Bitan Biswas <bbiswas@nvidia.com> Tested-by: Bitan Biswas <bbiswas@nvidia.com> Rebase-Id: R49d4709c030086c9596e3a81664b46967de8f029
Diffstat (limited to 'drivers/misc')
-rw-r--r--drivers/misc/nct1008.c35
1 files changed, 35 insertions, 0 deletions
diff --git a/drivers/misc/nct1008.c b/drivers/misc/nct1008.c
index 034fa59ae489..d4a8c1cfa3f9 100644
--- a/drivers/misc/nct1008.c
+++ b/drivers/misc/nct1008.c
@@ -31,6 +31,7 @@
#include <linux/device.h>
#include <linux/nct1008.h>
#include <linux/delay.h>
+#include <linux/regulator/consumer.h>
#define DRIVER_NAME "nct1008"
@@ -83,6 +84,7 @@ struct nct1008_data {
u8 *limits;
u8 limits_sz;
void (*alarm_fn)(bool raised);
+ struct regulator *nct_reg;
};
static inline u8 value_to_temperature(bool extended, u8 value)
@@ -535,6 +537,32 @@ static irqreturn_t nct1008_irq(int irq, void *dev_id)
return IRQ_HANDLED;
}
+static void nct1008_power_control(struct nct1008_data* data, bool is_enable)
+{
+ int ret;
+ if (!data->nct_reg) {
+ data->nct_reg = regulator_get(NULL, "vdd_nct1008");
+ if (IS_ERR_OR_NULL(data->nct_reg)) {
+ dev_warn(&data->client->dev, "Error in getting the "
+ "regulator handle for vdd_nct1008\n");
+ data->nct_reg = NULL;
+ return;
+ }
+ }
+ if (is_enable)
+ ret = regulator_enable(data->nct_reg);
+ else
+ ret = regulator_disable(data->nct_reg);
+
+ if (ret < 0)
+ dev_err(&data->client->dev, "Error in %s rail vdd_nct1008, "
+ "error %d\n", (is_enable) ? "enabling" : "disabling",
+ ret);
+ else
+ dev_info(&data->client->dev, "success in %s rail vdd_nct1008\n",
+ (is_enable) ? "enabling" : "disabling");
+}
+
static int __devinit nct1008_configure_sensor(struct nct1008_data* data)
{
struct i2c_client *client = data->client;
@@ -694,6 +722,7 @@ static int __devinit nct1008_probe(struct i2c_client *client,
i2c_set_clientdata(client, data);
mutex_init(&data->mutex);
+ nct1008_power_control(data, true);
err = nct1008_configure_sensor(data); /* sensor is in standby */
if (err < 0) {
dev_err(&client->dev, "\n error file: %s : %s(), line=%d ",
@@ -722,6 +751,9 @@ static int __devinit nct1008_probe(struct i2c_client *client,
error:
dev_err(&client->dev, "\n exit %s, err=%d ", __func__, err);
+ nct1008_power_control(data, false);
+ if (data->nct_reg)
+ regulator_put(data->nct_reg);
kfree(data);
return err;
}
@@ -733,6 +765,9 @@ static int __devexit nct1008_remove(struct i2c_client *client)
free_irq(data->client->irq, data);
cancel_work_sync(&data->work);
sysfs_remove_group(&client->dev.kobj, &nct1008_attr_group);
+ nct1008_power_control(data, false);
+ if (data->nct_reg)
+ regulator_put(data->nct_reg);
kfree(data);
return 0;