diff options
author | Laxman Dewangan <ldewangan@nvidia.com> | 2011-07-08 14:03:14 +0530 |
---|---|---|
committer | Dan Willemsen <dwillemsen@nvidia.com> | 2011-11-30 21:47:27 -0800 |
commit | 2e577cec79513067b815fe8cfdc500682db53f49 (patch) | |
tree | e3b9691577e7bc0c4747dd842a93b9dadfdca763 /drivers/misc | |
parent | e77321bf7fb2e7ea74cd21ae82ef7f8d3622c32e (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.c | 35 |
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; |