diff options
author | Giuseppe Bilotta <giuseppe.bilotta@gmail.com> | 2009-02-18 17:48:24 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-02-18 18:37:54 -0500 |
commit | 137bad32342a613586347341d1307c2b9812ef44 (patch) | |
tree | 3ed900e263388a72f92930a8d91a9d2eb7f0a39b /drivers/hwmon/lis3lv02d.c | |
parent | ef2cfc790bf5f0ff189b01eabc0f4feb5e8524df (diff) |
lis3lv02d: support both one- and two-byte sensors
Sensors responding with 0x3B to WHO_AM_I only have one data register per
direction, thus returning a signed byte from the position which is
occupied by the MSB in sensors responding with 0x3A.
Since multiple sensors share the reply to WHO_AM_I, we rename the defines
to better indicate what they identify (family of single and double
precision sensors).
We support both kind of sensors by checking for the sensor type on init
and defining appropriate data-access routines and sensor limits (for the
joystick) depending on what we find.
[akpm@linux-foundation.org: coding-style fixes]
Signed-off-by: Giuseppe Bilotta <giuseppe.bilotta@gmail.com>
Acked-by: Eric Piel <Eric.Piel@tremplin-utc.net>
Cc: Pavel Machek <pavel@suse.cz>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers/hwmon/lis3lv02d.c')
-rw-r--r-- | drivers/hwmon/lis3lv02d.c | 25 |
1 files changed, 6 insertions, 19 deletions
diff --git a/drivers/hwmon/lis3lv02d.c b/drivers/hwmon/lis3lv02d.c index 3afa3afc77f3..8bb2158f0453 100644 --- a/drivers/hwmon/lis3lv02d.c +++ b/drivers/hwmon/lis3lv02d.c | |||
@@ -53,9 +53,6 @@ | |||
53 | * joystick. | 53 | * joystick. |
54 | */ | 54 | */ |
55 | 55 | ||
56 | /* Maximum value our axis may get for the input device (signed 12 bits) */ | ||
57 | #define MDPS_MAX_VAL 2048 | ||
58 | |||
59 | struct acpi_lis3lv02d adev = { | 56 | struct acpi_lis3lv02d adev = { |
60 | .misc_wait = __WAIT_QUEUE_HEAD_INITIALIZER(adev.misc_wait), | 57 | .misc_wait = __WAIT_QUEUE_HEAD_INITIALIZER(adev.misc_wait), |
61 | }; | 58 | }; |
@@ -64,16 +61,6 @@ EXPORT_SYMBOL_GPL(adev); | |||
64 | 61 | ||
65 | static int lis3lv02d_add_fs(struct acpi_device *device); | 62 | static int lis3lv02d_add_fs(struct acpi_device *device); |
66 | 63 | ||
67 | static s16 lis3lv02d_read_16(acpi_handle handle, int reg) | ||
68 | { | ||
69 | u8 lo, hi; | ||
70 | |||
71 | adev.read(handle, reg, &lo); | ||
72 | adev.read(handle, reg + 1, &hi); | ||
73 | /* In "12 bit right justified" mode, bit 6, bit 7, bit 8 = bit 5 */ | ||
74 | return (s16)((hi << 8) | lo); | ||
75 | } | ||
76 | |||
77 | /** | 64 | /** |
78 | * lis3lv02d_get_axis - For the given axis, give the value converted | 65 | * lis3lv02d_get_axis - For the given axis, give the value converted |
79 | * @axis: 1,2,3 - can also be negative | 66 | * @axis: 1,2,3 - can also be negative |
@@ -102,9 +89,9 @@ static void lis3lv02d_get_xyz(acpi_handle handle, int *x, int *y, int *z) | |||
102 | { | 89 | { |
103 | int position[3]; | 90 | int position[3]; |
104 | 91 | ||
105 | position[0] = lis3lv02d_read_16(handle, OUTX_L); | 92 | position[0] = adev.read_data(handle, OUTX); |
106 | position[1] = lis3lv02d_read_16(handle, OUTY_L); | 93 | position[1] = adev.read_data(handle, OUTY); |
107 | position[2] = lis3lv02d_read_16(handle, OUTZ_L); | 94 | position[2] = adev.read_data(handle, OUTZ); |
108 | 95 | ||
109 | *x = lis3lv02d_get_axis(adev.ac.x, position); | 96 | *x = lis3lv02d_get_axis(adev.ac.x, position); |
110 | *y = lis3lv02d_get_axis(adev.ac.y, position); | 97 | *y = lis3lv02d_get_axis(adev.ac.y, position); |
@@ -355,9 +342,9 @@ int lis3lv02d_joystick_enable(void) | |||
355 | adev.idev->close = lis3lv02d_joystick_close; | 342 | adev.idev->close = lis3lv02d_joystick_close; |
356 | 343 | ||
357 | set_bit(EV_ABS, adev.idev->evbit); | 344 | set_bit(EV_ABS, adev.idev->evbit); |
358 | input_set_abs_params(adev.idev, ABS_X, -MDPS_MAX_VAL, MDPS_MAX_VAL, 3, 3); | 345 | input_set_abs_params(adev.idev, ABS_X, -adev.mdps_max_val, adev.mdps_max_val, 3, 3); |
359 | input_set_abs_params(adev.idev, ABS_Y, -MDPS_MAX_VAL, MDPS_MAX_VAL, 3, 3); | 346 | input_set_abs_params(adev.idev, ABS_Y, -adev.mdps_max_val, adev.mdps_max_val, 3, 3); |
360 | input_set_abs_params(adev.idev, ABS_Z, -MDPS_MAX_VAL, MDPS_MAX_VAL, 3, 3); | 347 | input_set_abs_params(adev.idev, ABS_Z, -adev.mdps_max_val, adev.mdps_max_val, 3, 3); |
361 | 348 | ||
362 | err = input_register_device(adev.idev); | 349 | err = input_register_device(adev.idev); |
363 | if (err) { | 350 | if (err) { |