aboutsummaryrefslogtreecommitdiff
path: root/drivers/hwmon
diff options
context:
space:
mode:
authorChethan Krishna N <chethan.krishna@stericsson.com>2011-01-31 14:39:10 +0530
committerSrinidhi KASAGAR <srinidhi.kasagar@stericsson.com>2011-01-31 12:49:10 +0100
commit39a220d3e58b8a54a26d44e7eb0eebd120017fcd (patch)
tree8bf5975438cb048647c974b8957c294f80e5ea08 /drivers/hwmon
parent15d34434e0d461109ee1cb1d2fa41326d434f4d4 (diff)
[ANDROID]:LSM303DLH: Balancing regulator enable/disable calls
Regulator enable/disable calls are balanced in early_suspend and late_resume functionality. ST-Ericsson ID: ER321610 Signed-off-by: Chethan Krishna N <chethan.krishna@stericsson.com> Change-Id: I1171db9b48dbcf6206a4cfbf4fed0fc07f96901b Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/13920 Reviewed-by: Preetham Rao K <preetham.rao@stericsson.com> Tested-by: Preetham Rao K <preetham.rao@stericsson.com> Reviewed-by: QATOOLS Reviewed-by: Srinidhi KASAGAR <srinidhi.kasagar@stericsson.com>
Diffstat (limited to 'drivers/hwmon')
-rw-r--r--drivers/hwmon/lsm303dlh_a.c22
1 files changed, 21 insertions, 1 deletions
diff --git a/drivers/hwmon/lsm303dlh_a.c b/drivers/hwmon/lsm303dlh_a.c
index 2ff1e7d23a8..456c75697fe 100644
--- a/drivers/hwmon/lsm303dlh_a.c
+++ b/drivers/hwmon/lsm303dlh_a.c
@@ -76,6 +76,7 @@
#define LSM303DLH_A_CR1_DR_MASK (0x3 << LSM303DLH_A_CR1_DR_BIT)
#define LSM303DLH_A_CR1_EN_BIT 0
#define LSM303DLH_A_CR1_EN_MASK (0x7 << LSM303DLH_A_CR1_EN_BIT)
+ #define LSM303DLH_A_CR1_AXIS_ENABLE 7
/* Control register 2 */
#define LSM303DLH_A_CR4_ST_BIT 1
@@ -174,6 +175,7 @@ struct lsm303dlh_a_data {
unsigned char interrupt_duration[2];
unsigned char interrupt_threshold[2];
struct early_suspend early_suspend;
+ bool device_enable;
};
#ifdef CONFIG_HAS_EARLYSUSPEND
@@ -205,6 +207,8 @@ static int lsm303dlh_a_read(struct lsm303dlh_a_data *ddata, u8 reg, char *msg)
static int lsm303dlh_a_do_suspend(struct lsm303dlh_a_data *ddata)
{
int ret;
+
+ ret = lsm303dlh_a_read(ddata, CTRL_REG1, "CTRL_REG1");
if (ddata->mode == LSM303DLH_A_MODE_OFF)
return 0;
@@ -216,6 +220,8 @@ static int lsm303dlh_a_do_suspend(struct lsm303dlh_a_data *ddata)
ret = lsm303dlh_a_write(ddata, CTRL_REG1,
LSM303DLH_A_MODE_OFF, "CONTROL");
+ ret = lsm303dlh_a_read(ddata, CTRL_REG1, "CTRL_REG1");
+
if (ddata->regulator)
regulator_disable(ddata->regulator);
return ret;
@@ -244,6 +250,7 @@ static int lsm303dlh_a_restore(struct lsm303dlh_a_data *ddata)
/* BDU should be enabled by default/recommened */
reg = ddata->range;
reg |= LSM303DLH_A_CR4_BDU_MASK;
+ context |= LSM303DLH_A_CR1_AXIS_ENABLE;
ret = lsm303dlh_a_write(ddata, CTRL_REG1, context,
"CTRL_REG1");
@@ -737,6 +744,11 @@ static ssize_t lsm303dlh_a_store_mode(struct device *dev,
if (ddata->mode == val)
return 0;
+ if (!ddata->device_enable && (val == 0)) {
+ ddata->mode = val;
+ return 0;
+ }
+
/* turn on the supplies if already off */
if (ddata->regulator && ddata->mode == LSM303DLH_A_MODE_OFF) {
regulator_enable(ddata->regulator);
@@ -764,6 +776,8 @@ static ssize_t lsm303dlh_a_store_mode(struct device *dev,
return error;
}
+ if (val)
+ ddata->device_enable = true;
mutex_unlock(&ddata->lock);
if (val == LSM303DLH_A_MODE_OFF) {
@@ -779,10 +793,10 @@ static ssize_t lsm303dlh_a_store_mode(struct device *dev,
ddata->rate = LSM303DLH_A_RATE_50;
ddata->range = LSM303DLH_A_RANGE_2G;
ddata->shift_adjust = SHIFT_ADJ_2G;
+ ddata->device_enable = false;
if (ddata->regulator)
regulator_disable(ddata->regulator);
-
}
return count;
@@ -1059,6 +1073,8 @@ static int __devinit lsm303dlh_a_probe(struct i2c_client *client,
disable_irq(gpio_to_irq(ddata->pdata.irq_a1));
disable_irq(gpio_to_irq(ddata->pdata.irq_a2));
+ /* set device_enable flag to false by default*/
+ ddata->device_enable = false;
#endif
#ifdef CONFIG_HAS_EARLYSUSPEND
@@ -1160,6 +1176,8 @@ static void lsm303dlh_a_early_suspend(struct early_suspend *data)
int ret;
ret = lsm303dlh_a_do_suspend(ddata);
+
+ ddata->device_enable = false;
}
static void lsm303dlh_a_late_resume(struct early_suspend *data)
@@ -1172,6 +1190,8 @@ static void lsm303dlh_a_late_resume(struct early_suspend *data)
if (ret < 0)
dev_err(&ddata->client->dev,
"lsm303dlh_a late resume failed\n");
+
+ ddata->device_enable = true;
}
#endif /* CONFIG_PM */