lkml.org 
[lkml]   [2011]   [Nov]   [3]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
Subject[PATCH] lis3lv02d: Avoid zero-division
In some weird situation, HP DriveGuard chip can't read ODR value
correctly, and it results in a zero-division Oops in lis3lv02d driver.
This patch fixes the Oops by checking the value appopriately, and skips
if any weird value is read.

Cc: <stable@kernel.org>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
---
drivers/misc/lis3lv02d/lis3lv02d.c | 14 +++++++++++---
1 files changed, 11 insertions(+), 3 deletions(-)
diff --git a/drivers/misc/lis3lv02d/lis3lv02d.c b/drivers/misc/lis3lv02d/lis3lv02d.c
index 8b51cd6..c4eb2f3 100644
--- a/drivers/misc/lis3lv02d/lis3lv02d.c
+++ b/drivers/misc/lis3lv02d/lis3lv02d.c
@@ -228,6 +228,14 @@ static int lis3lv02d_set_odr(int rate)
return -EINVAL;
}

+static void lis3lv02d_power_delay(struct lis3lv02d *lis3)
+{
+ int odr = lis3lv02d_get_odr();
+ if (odr <= 0)
+ return;
+ msleep(lis3->pwron_delay / odr);
+}
+
static int lis3lv02d_selftest(struct lis3lv02d *lis3, s16 results[3])
{
u8 ctlreg, reg;
@@ -266,7 +274,7 @@ static int lis3lv02d_selftest(struct lis3lv02d *lis3, s16 results[3])

lis3->read(lis3, ctlreg, &reg);
lis3->write(lis3, ctlreg, (reg | selftest));
- msleep(lis3->pwron_delay / lis3lv02d_get_odr());
+ lis3lv02d_power_delay(lis3);

/* Read directly to avoid axis remap */
x = lis3->read_data(lis3, OUTX);
@@ -275,7 +283,7 @@ static int lis3lv02d_selftest(struct lis3lv02d *lis3, s16 results[3])

/* back to normal settings */
lis3->write(lis3, ctlreg, reg);
- msleep(lis3->pwron_delay / lis3lv02d_get_odr());
+ lis3lv02d_power_delay(lis3);

results[0] = x - lis3->read_data(lis3, OUTX);
results[1] = y - lis3->read_data(lis3, OUTY);
@@ -385,7 +393,7 @@ void lis3lv02d_poweron(struct lis3lv02d *lis3)
}

/* LIS3 power on delay is quite long */
- msleep(lis3->pwron_delay / lis3lv02d_get_odr());
+ lis3lv02d_power_delay(lis3);

if (lis3->reg_ctrl)
lis3_context_restore(lis3);
--
1.7.7


\
 
 \ /
  Last update: 2011-11-03 13:11    [from the cache]
©2003-2011 Jasper Spaans