e336be
From: =?UTF-8?q?=C3=89ric=20Piel?= <eric.piel@tremplin-utc.net>
e336be
Date: Thu, 3 Nov 2011 16:22:40 +0100
e336be
Subject: [PATCH] lis3: improve handling of null rate
e336be
e336be
When obtaining a rate of 0, we would disable the device supposely
e336be
because it seems to behave incorectly. It actually only comes from the
e336be
fact that the device is off and on lis3dc it's reflected in the rate.
e336be
So handle this nicely by just waiting a safe time, and then using the
e336be
device as normally.
e336be
e336be
Bugzilla: 785814
e336be
Upstream-status: ??
e336be
e336be
Signed-off-by: ??ric Piel <eric.piel@tremplin-utc.net>
e336be
---
e336be
 drivers/misc/lis3lv02d/lis3lv02d.c | 16 ++++++++--------
e336be
 1 file changed, 8 insertions(+), 8 deletions(-)
e336be
e336be
diff --git a/drivers/misc/lis3lv02d/lis3lv02d.c b/drivers/misc/lis3lv02d/lis3lv02d.c
e336be
index fb8705fc3aca..50c2b93c1273 100644
e336be
--- a/drivers/misc/lis3lv02d/lis3lv02d.c
e336be
+++ b/drivers/misc/lis3lv02d/lis3lv02d.c
e336be
@@ -216,7 +216,8 @@ static void lis3lv02d_get_xyz(struct lis3lv02d *lis3, int *x, int *y, int *z)
e336be
 /* conversion btw sampling rate and the register values */
e336be
 static int lis3_12_rates[4] = {40, 160, 640, 2560};
e336be
 static int lis3_8_rates[2] = {100, 400};
e336be
-static int lis3_3dc_rates[16] = {0, 1, 10, 25, 50, 100, 200, 400, 1600, 5000};
e336be
+/* LIS3DC: 0 = power off, above 9 = undefined */
e336be
+static int lis3_3dc_rates[16] = {0, 1, 10, 25, 50, 100, 200, 400, 1600, 5000, -1, -1, -1, -1, -1, -1};
e336be
 static int lis3_3dlh_rates[4] = {50, 100, 400, 1000};
e336be
 
e336be
 /* ODR is Output Data Rate */
e336be
@@ -231,12 +232,11 @@ static int lis3lv02d_get_odr(struct lis3lv02d *lis3)
e336be
 	return lis3->odrs[(ctrl >> shift)];
e336be
 }
e336be
 
e336be
-static int lis3lv02d_get_pwron_wait(struct lis3lv02d *lis3)
e336be
+static int lis3lv02d_wait_pwron(struct lis3lv02d *lis3)
e336be
 {
e336be
 	int div = lis3lv02d_get_odr(lis3);
e336be
-
e336be
-	if (WARN_ONCE(div == 0, "device returned spurious data"))
e336be
-		return -ENXIO;
e336be
+	if (div <= 0)
e336be
+		div = 1; /* maximum delay */
e336be
 
e336be
 	/* LIS3 power on delay is quite long */
e336be
 	msleep(lis3->pwron_delay / div);
e336be
@@ -303,7 +303,7 @@ static int lis3lv02d_selftest(struct lis3lv02d *lis3, s16 results[3])
e336be
 
e336be
 	lis3->read(lis3, ctlreg, ®);
e336be
 	lis3->write(lis3, ctlreg, (reg | selftest));
e336be
-	ret = lis3lv02d_get_pwron_wait(lis3);
e336be
+	ret = lis3lv02d_wait_pwron(lis3);
e336be
 	if (ret)
e336be
 		goto fail;
e336be
 
e336be
@@ -314,7 +314,7 @@ static int lis3lv02d_selftest(struct lis3lv02d *lis3, s16 results[3])
e336be
 
e336be
 	/* back to normal settings */
e336be
 	lis3->write(lis3, ctlreg, reg);
e336be
-	ret = lis3lv02d_get_pwron_wait(lis3);
e336be
+	ret = lis3lv02d_wait_pwron(lis3);
e336be
 	if (ret)
e336be
 		goto fail;
e336be
 
e336be
@@ -434,7 +434,7 @@ int lis3lv02d_poweron(struct lis3lv02d *lis3)
e336be
 		}
e336be
 	}
e336be
 
e336be
-	err = lis3lv02d_get_pwron_wait(lis3);
e336be
+	err = lis3lv02d_wait_pwron(lis3);
e336be
 	if (err)
e336be
 		return err;
e336be