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