diff options
author | Chethan Krishna N <chethan.krishna@stericsson.com> | 2011-01-31 14:39:10 +0530 |
---|---|---|
committer | Srinidhi KASAGAR <srinidhi.kasagar@stericsson.com> | 2011-01-31 12:49:10 +0100 |
commit | 39a220d3e58b8a54a26d44e7eb0eebd120017fcd (patch) | |
tree | 8bf5975438cb048647c974b8957c294f80e5ea08 /drivers/hwmon | |
parent | 15d34434e0d461109ee1cb1d2fa41326d434f4d4 (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.c | 22 |
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 */ |