[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-ID: <s5hy5vx9zmr.wl%tiwai@suse.de>
Date: Thu, 03 Nov 2011 13:09:00 +0100
From: Takashi Iwai <tiwai@...e.de>
To: Eric Piel <eric.piel@...mplin-utc.net>
Cc: Andrew Morton <akpm@...ux-foundation.org>,
linux-kernel@...r.kernel.org
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@...nel.org>
Signed-off-by: Takashi Iwai <tiwai@...e.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, ®);
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
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists