diff options
author | Samu Onkalo <samu.p.onkalo@nokia.com> | 2010-10-22 07:57:31 -0400 |
---|---|---|
committer | Guenter Roeck <guenter.roeck@ericsson.com> | 2010-10-25 17:11:39 -0400 |
commit | f10a5407b58603fb3b084d7fbdbd50f47d010c82 (patch) | |
tree | 121a730685dab830c412f7c09027b0b04917d307 /drivers/hwmon/lis3lv02d.c | |
parent | 477bc918c2323a51f577cd892ca49376f6feb5d5 (diff) |
hwmon: lis3: use block read to access data registers
Add optional blockread function to interface driver. If available
the chip driver uses it for data register access. For 12 bit device
it reads 6 bytes to get 3*16bit data. For 8 bit device it reads out
5 bytes since every second byte is dummy.
This optimizes bus usage and reduces number of operations and
interrupts needed for one data update.
Signed-off-by: Samu Onkalo <samu.p.onkalo@nokia.com>
Acked-by: Jonathan Cameron <jic23@cam.ac.uk>
Acked-by: Eric Piel <eric.piel@tremplin-utc.net>
Signed-off-by: Guenter Roeck <guenter.roeck@ericsson.com>
Diffstat (limited to 'drivers/hwmon/lis3lv02d.c')
-rw-r--r-- | drivers/hwmon/lis3lv02d.c | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/drivers/hwmon/lis3lv02d.c b/drivers/hwmon/lis3lv02d.c index a4929b72506e..0780de0550df 100644 --- a/drivers/hwmon/lis3lv02d.c +++ b/drivers/hwmon/lis3lv02d.c | |||
@@ -154,9 +154,24 @@ static void lis3lv02d_get_xyz(struct lis3lv02d *lis3, int *x, int *y, int *z) | |||
154 | int position[3]; | 154 | int position[3]; |
155 | int i; | 155 | int i; |
156 | 156 | ||
157 | position[0] = lis3->read_data(lis3, OUTX); | 157 | if (lis3->blkread) { |
158 | position[1] = lis3->read_data(lis3, OUTY); | 158 | if (lis3_dev.whoami == WAI_12B) { |
159 | position[2] = lis3->read_data(lis3, OUTZ); | 159 | u16 data[3]; |
160 | lis3->blkread(lis3, OUTX_L, 6, (u8 *)data); | ||
161 | for (i = 0; i < 3; i++) | ||
162 | position[i] = (s16)le16_to_cpu(data[i]); | ||
163 | } else { | ||
164 | u8 data[5]; | ||
165 | /* Data: x, dummy, y, dummy, z */ | ||
166 | lis3->blkread(lis3, OUTX, 5, data); | ||
167 | for (i = 0; i < 3; i++) | ||
168 | position[i] = (s8)data[i * 2]; | ||
169 | } | ||
170 | } else { | ||
171 | position[0] = lis3->read_data(lis3, OUTX); | ||
172 | position[1] = lis3->read_data(lis3, OUTY); | ||
173 | position[2] = lis3->read_data(lis3, OUTZ); | ||
174 | } | ||
160 | 175 | ||
161 | for (i = 0; i < 3; i++) | 176 | for (i = 0; i < 3; i++) |
162 | position[i] = (position[i] * lis3->scale) / LIS3_ACCURACY; | 177 | position[i] = (position[i] * lis3->scale) / LIS3_ACCURACY; |