| >From 56fb161a9ca0129f8e266e4dbe79346552ff8089 Mon Sep 17 00:00:00 2001 |
| From: =?UTF-8?q?=C3=89ric=20Piel?= <eric.piel@tremplin-utc.net> |
| Date: Thu, 3 Nov 2011 16:22:40 +0100 |
| Subject: [PATCH] lis3: Improve handling of null rate |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| When obtaining a rate of 0, we would disable the device supposely |
| because it seems to behave incorectly. It actually only comes from the |
| fact that the device is off and on lis3dc it's reflected in the rate. |
| So handle this nicely by just waiting a safe time, and then using the |
| device as normally. |
| |
| Signed-off-by: ??ric Piel <eric.piel@tremplin-utc.net> |
| |
| drivers/misc/lis3lv02d/lis3lv02d.c | 16 ++++++++-------- |
| 1 files changed, 8 insertions(+), 8 deletions(-) |
| |
| diff --git a/drivers/misc/lis3lv02d/lis3lv02d.c b/drivers/misc/lis3lv02d/lis3lv02d.c |
| index 35c67e0..42dce2a 100644 |
| |
| |
| @@ -188,7 +188,8 @@ static void lis3lv02d_get_xyz(struct lis3lv02d *lis3, int *x, int *y, int *z) |
| /* conversion btw sampling rate and the register values */ |
| static int lis3_12_rates[4] = {40, 160, 640, 2560}; |
| static int lis3_8_rates[2] = {100, 400}; |
| -static int lis3_3dc_rates[16] = {0, 1, 10, 25, 50, 100, 200, 400, 1600, 5000}; |
| +/* LIS3DC: 0 = power off, above 9 = undefined */ |
| +static int lis3_3dc_rates[16] = {0, 1, 10, 25, 50, 100, 200, 400, 1600, 5000, -1, -1, -1, -1, -1, -1}; |
| |
| /* ODR is Output Data Rate */ |
| static int lis3lv02d_get_odr(struct lis3lv02d *lis3) |
| @@ -202,12 +203,11 @@ static int lis3lv02d_get_odr(struct lis3lv02d *lis3) |
| return lis3->odrs[(ctrl >> shift)]; |
| } |
| |
| -static int lis3lv02d_get_pwron_wait(struct lis3lv02d *lis3) |
| +static int lis3lv02d_wait_pwron(struct lis3lv02d *lis3) |
| { |
| int div = lis3lv02d_get_odr(lis3); |
| - |
| - if (WARN_ONCE(div == 0, "device returned spurious data")) |
| - return -ENXIO; |
| + if (div <= 0) |
| + div = 1; /* maximum delay */ |
| |
| /* LIS3 power on delay is quite long */ |
| msleep(lis3->pwron_delay / div); |
| @@ -274,7 +274,7 @@ static int lis3lv02d_selftest(struct lis3lv02d *lis3, s16 results[3]) |
| |
| lis3->read(lis3, ctlreg, ®); |
| lis3->write(lis3, ctlreg, (reg | selftest)); |
| - ret = lis3lv02d_get_pwron_wait(lis3); |
| + ret = lis3lv02d_wait_pwron(lis3); |
| if (ret) |
| goto fail; |
| |
| @@ -285,7 +285,7 @@ static int lis3lv02d_selftest(struct lis3lv02d *lis3, s16 results[3]) |
| |
| /* back to normal settings */ |
| lis3->write(lis3, ctlreg, reg); |
| - ret = lis3lv02d_get_pwron_wait(lis3); |
| + ret = lis3lv02d_wait_pwron(lis3); |
| if (ret) |
| goto fail; |
| |
| @@ -397,7 +397,7 @@ int lis3lv02d_poweron(struct lis3lv02d *lis3) |
| lis3->write(lis3, CTRL_REG2, reg); |
| } |
| |
| - err = lis3lv02d_get_pwron_wait(lis3); |
| + err = lis3lv02d_wait_pwron(lis3); |
| if (err) |
| return err; |
| |
| -- |
| 1.7.7.1 |
| |