From de01e99e81745c11d3b138e0d0c2c9201b0d8443 Mon Sep 17 00:00:00 2001 From: Bryan Freed Date: Fri, 2 Dec 2011 14:19:30 -0800 Subject: [PATCH] --- yaml --- r: 281236 b: refs/heads/master c: 014fcb1db5d8fd1dde1e3b777389edcd8d85a2e2 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/drivers/staging/iio/light/tsl2583.c | 17 ++++++++++++++--- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/[refs] b/[refs] index 5592cce49483..84e28b244a42 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: d666c0d490d85d35fe6d6d45ba029cf16046dc82 +refs/heads/master: 014fcb1db5d8fd1dde1e3b777389edcd8d85a2e2 diff --git a/trunk/drivers/staging/iio/light/tsl2583.c b/trunk/drivers/staging/iio/light/tsl2583.c index 80f77cf8e9c2..25f4c1dd5bf2 100644 --- a/trunk/drivers/staging/iio/light/tsl2583.c +++ b/trunk/drivers/staging/iio/light/tsl2583.c @@ -194,6 +194,7 @@ static int taos_get_lux(struct iio_dev *indio_dev) { u16 ch0, ch1; /* separated ch0/ch1 data from device */ u32 lux; /* raw lux calculated from device data */ + u64 lux64; u32 ratio; u8 buf[5]; struct taos_lux *p; @@ -297,9 +298,19 @@ static int taos_get_lux(struct iio_dev *indio_dev) lux = (lux + (chip->als_time_scale >> 1)) / chip->als_time_scale; - /* adjust for active gain scale */ - lux >>= 13; /* tables have factor of 8192 builtin for accuracy */ - lux = (lux * chip->taos_settings.als_gain_trim + 500) / 1000; + /* Adjust for active gain scale. + * The taos_device_lux tables above have a factor of 8192 built in, + * so we need to shift right. + * User-specified gain provides a multiplier. + * Apply user-specified gain before shifting right to retain precision. + * Use 64 bits to avoid overflow on multiplication. + * Then go back to 32 bits before division to avoid using div_u64(). + */ + lux64 = lux; + lux64 = lux64 * chip->taos_settings.als_gain_trim; + lux64 >>= 13; + lux = lux64; + lux = (lux + 500) / 1000; if (lux > TSL258X_LUX_CALC_OVER_FLOW) { /* check for overflow */ return_max: lux = TSL258X_LUX_CALC_OVER_FLOW;