* [PATCHv2] lis3lv02d: support both one- and two-byte sensors
@ 2009-02-10 23:40 Giuseppe Bilotta
2009-02-10 23:46 ` Éric Piel
0 siblings, 1 reply; 4+ messages in thread
From: Giuseppe Bilotta @ 2009-02-10 23:40 UTC (permalink / raw)
To: git; +Cc: Éric Piel, Pavel Machek, Giuseppe Bilotta
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.
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.
Signed-off-by: Giuseppe Bilotta <giuseppe.bilotta@gmail.com>
---
This is the other version of the patch, and it changes access to use the
base address from the 8-bit, so the 16-bit routine is changed to access
the PREVIOUS byte for the LSB.
Choose whichever of the patches is deemed more correct 8-)
Note that both patches are based off Linus tree, so I don't know how
they cope with Pavel's "don't touch too much on init" one. I'll try to
work out a patch on top of that too.
drivers/hwmon/lis3lv02d.c | 42 ++++++++++++++++++++++++++++++------------
drivers/hwmon/lis3lv02d.h | 12 +++++++++++-
2 files changed, 41 insertions(+), 13 deletions(-)
diff --git a/drivers/hwmon/lis3lv02d.c b/drivers/hwmon/lis3lv02d.c
index 219d2d0..b6b2d4a 100644
--- a/drivers/hwmon/lis3lv02d.c
+++ b/drivers/hwmon/lis3lv02d.c
@@ -52,9 +52,6 @@
* joystick.
*/
-/* Maximum value our axis may get for the input device (signed 12 bits) */
-#define MDPS_MAX_VAL 2048
-
struct acpi_lis3lv02d adev;
EXPORT_SYMBOL_GPL(adev);
@@ -64,12 +61,19 @@ static s16 lis3lv02d_read_16(acpi_handle handle, int reg)
{
u8 lo, hi;
- adev.read(handle, reg, &lo);
- adev.read(handle, reg + 1, &hi);
+ adev.read(handle, reg - 1, &lo);
+ adev.read(handle, reg, &hi);
/* In "12 bit right justified" mode, bit 6, bit 7, bit 8 = bit 5 */
return (s16)((hi << 8) | lo);
}
+static s16 lis3lv02d_read_8(acpi_handle handle, int reg)
+{
+ u8 lo;
+ adev.read(handle, reg, &lo);
+ return *((s8*)(&lo));
+}
+
/**
* lis3lv02d_get_axis - For the given axis, give the value converted
* @axis: 1,2,3 - can also be negative
@@ -98,9 +102,9 @@ static void lis3lv02d_get_xyz(acpi_handle handle, int *x, int *y, int *z)
{
int position[3];
- position[0] = lis3lv02d_read_16(handle, OUTX_L);
- position[1] = lis3lv02d_read_16(handle, OUTY_L);
- position[2] = lis3lv02d_read_16(handle, OUTZ_L);
+ position[0] = adev.lis3lv02d_read(handle, OUTX);
+ position[1] = adev.lis3lv02d_read(handle, OUTY);
+ position[2] = adev.lis3lv02d_read(handle, OUTZ);
*x = lis3lv02d_get_axis(adev.ac.x, position);
*y = lis3lv02d_get_axis(adev.ac.y, position);
@@ -121,7 +125,21 @@ void lis3lv02d_poweron(acpi_handle handle)
adev.is_on = 1;
adev.init(handle);
- adev.write(handle, FF_WU_CFG, 0);
+ adev.read(handle, WHO_AM_I, &adev.whoami);
+ /* Tell apart LISxLV02Dy from LISx02Dy family by checking the LSB
+ * (0x3A vs 0x3B). TODO More sophisticated checks on other registers
+ * could be implemented, for example to see if we have 2 or 3 axes, and
+ * configure the joystick accordingly.
+ */
+ if (adev.whoami & 1) {
+ printk(KERN_INFO DRIVER_NAME ": 1-byte sensor found\n");
+ adev.lis3lv02d_read = lis3lv02d_read_8;
+ adev.mdps_max_val = 128;
+ } else {
+ printk(KERN_INFO DRIVER_NAME ": 2-byte sensor found\n");
+ adev.lis3lv02d_read = lis3lv02d_read_16;
+ adev.mdps_max_val = 2048;
+ }
/*
* BDU: LSB and MSB values are not updated until both have been read.
* So the value read will always be correct.
@@ -231,9 +249,9 @@ int lis3lv02d_joystick_enable(void)
adev.idev->close = lis3lv02d_joystick_close;
set_bit(EV_ABS, adev.idev->evbit);
- input_set_abs_params(adev.idev, ABS_X, -MDPS_MAX_VAL, MDPS_MAX_VAL, 3, 3);
- input_set_abs_params(adev.idev, ABS_Y, -MDPS_MAX_VAL, MDPS_MAX_VAL, 3, 3);
- input_set_abs_params(adev.idev, ABS_Z, -MDPS_MAX_VAL, MDPS_MAX_VAL, 3, 3);
+ input_set_abs_params(adev.idev, ABS_X, -adev.mdps_max_val, adev.mdps_max_val, 3, 3);
+ input_set_abs_params(adev.idev, ABS_Y, -adev.mdps_max_val, adev.mdps_max_val, 3, 3);
+ input_set_abs_params(adev.idev, ABS_Z, -adev.mdps_max_val, adev.mdps_max_val, 3, 3);
err = input_register_device(adev.idev);
if (err) {
diff --git a/drivers/hwmon/lis3lv02d.h b/drivers/hwmon/lis3lv02d.h
index 223f1c0..9d7d4a8 100644
--- a/drivers/hwmon/lis3lv02d.h
+++ b/drivers/hwmon/lis3lv02d.h
@@ -22,11 +22,14 @@
/*
* The actual chip is STMicroelectronics LIS3LV02DL or LIS3LV02DQ that seems to
* be connected via SPI. There exists also several similar chips (such as LIS302DL or
- * LIS3L02DQ) but not in the HP laptops and they have slightly different registers.
+ * LIS3L02DQ) and they have slightly different registers, but we can provide a
+ * common interface for all of them.
* They can also be connected via I²C.
*/
+/* 2-byte registers */
#define LIS3LV02DL_ID 0x3A /* Also the LIS3LV02DQ */
+/* 1-byte registers */
#define LIS302DL_ID 0x3B /* Also the LIS202DL! */
enum lis3lv02d_reg {
@@ -44,10 +47,13 @@ enum lis3lv02d_reg {
STATUS_REG = 0x27,
OUTX_L = 0x28,
OUTX_H = 0x29,
+ OUTX = 0x29,
OUTY_L = 0x2A,
OUTY_H = 0x2B,
+ OUTY = 0x2B,
OUTZ_L = 0x2C,
OUTZ_H = 0x2D,
+ OUTZ = 0x2D,
FF_WU_CFG = 0x30,
FF_WU_SRC = 0x31,
FF_WU_ACK = 0x32,
@@ -159,6 +165,10 @@ struct acpi_lis3lv02d {
acpi_status (*write) (acpi_handle handle, int reg, u8 val);
acpi_status (*read) (acpi_handle handle, int reg, u8 *ret);
+ u8 whoami; /* 3Ah: 2-byte registries, 3Bh: 1-byte registries */
+ s16 (*lis3lv02d_read) (acpi_handle handle, int reg);
+ int mdps_max_val;
+
struct input_dev *idev; /* input device */
struct task_struct *kthread; /* kthread for input */
struct mutex lock;
--
1.6.2.rc0.173.g5e148
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCHv2] lis3lv02d: support both one- and two-byte sensors
2009-02-10 23:40 [PATCHv2] lis3lv02d: support both one- and two-byte sensors Giuseppe Bilotta
@ 2009-02-10 23:46 ` Éric Piel
2009-02-10 23:51 ` Giuseppe Bilotta
0 siblings, 1 reply; 4+ messages in thread
From: Éric Piel @ 2009-02-10 23:46 UTC (permalink / raw)
To: Giuseppe Bilotta; +Cc: git, Pavel Machek, Linux Kernel Mailing List
Giuseppe Bilotta schreef:
> 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.
>
> 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.
>
> Signed-off-by: Giuseppe Bilotta <giuseppe.bilotta@gmail.com>
> ---
>
> This is the other version of the patch, and it changes access to use the
> base address from the 8-bit, so the 16-bit routine is changed to access
> the PREVIOUS byte for the LSB.
>
> Choose whichever of the patches is deemed more correct 8-)
>
> Note that both patches are based off Linus tree, so I don't know how
> they cope with Pavel's "don't touch too much on init" one. I'll try to
> work out a patch on top of that too.
Yes, great, and this one looks even better than v1 :-)
However I'm not sure about the conversion between s8 and s16:
> +static s16 lis3lv02d_read_8(acpi_handle handle, int reg)
> +{
> + u8 lo;
> + adev.read(handle, reg, &lo);
> + return *((s8*)(&lo));
> +}
Does it really extend the sign to 16 bits? I would have written it this way:
+static s16 lis3lv02d_read_8(acpi_handle handle, int reg)
+{
+ s8 lo;
+ adev.read(handle, reg, &lo);
+ return (s16)lo;
+}
Doesn't it work better?
Eric
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCHv2] lis3lv02d: support both one- and two-byte sensors
2009-02-10 23:46 ` Éric Piel
@ 2009-02-10 23:51 ` Giuseppe Bilotta
2009-02-10 23:54 ` Éric Piel
0 siblings, 1 reply; 4+ messages in thread
From: Giuseppe Bilotta @ 2009-02-10 23:51 UTC (permalink / raw)
To: Éric Piel; +Cc: git, Pavel Machek, Linux Kernel Mailing List
On Wed, Feb 11, 2009 at 12:46 AM, Éric Piel <Eric.Piel@tremplin-utc.net> wrote:
> Giuseppe Bilotta schreef:
>>
>> 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.
>>
>> 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.
>>
>> Signed-off-by: Giuseppe Bilotta <giuseppe.bilotta@gmail.com>
>> ---
>>
>> This is the other version of the patch, and it changes access to use the
>> base address from the 8-bit, so the 16-bit routine is changed to access
>> the PREVIOUS byte for the LSB.
>>
>> Choose whichever of the patches is deemed more correct 8-)
>>
>> Note that both patches are based off Linus tree, so I don't know how
>> they cope with Pavel's "don't touch too much on init" one. I'll try to
>> work out a patch on top of that too.
>
> Yes, great, and this one looks even better than v1 :-)
And don't forget about the v3 for -mm ;-)
> However I'm not sure about the conversion between s8 and s16:
>
>> +static s16 lis3lv02d_read_8(acpi_handle handle, int reg)
>> +{
>> + u8 lo;
>> + adev.read(handle, reg, &lo);
>> + return *((s8*)(&lo));
>> +}
>
> Does it really extend the sign to 16 bits? I would have written it this way:
> +static s16 lis3lv02d_read_8(acpi_handle handle, int reg)
> +{
> + s8 lo;
> + adev.read(handle, reg, &lo);
> + return (s16)lo;
> +}
> Doesn't it work better?
Well, the previous one works, but I admit it's horribly convoluted.
I'll double check with this one and resubmit (I'll only resubmit the
one based on Pavel's "don't touch anything on init" probably though,
hope it's ok)
--
Giuseppe "Oblomov" Bilotta
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCHv2] lis3lv02d: support both one- and two-byte sensors
2009-02-10 23:51 ` Giuseppe Bilotta
@ 2009-02-10 23:54 ` Éric Piel
0 siblings, 0 replies; 4+ messages in thread
From: Éric Piel @ 2009-02-10 23:54 UTC (permalink / raw)
To: Giuseppe Bilotta; +Cc: git, Pavel Machek, Linux Kernel Mailing List
Giuseppe Bilotta schreef:
> Well, the previous one works, but I admit it's horribly convoluted.
> I'll double check with this one and resubmit (I'll only resubmit the
> one based on Pavel's "don't touch anything on init" probably though,
> hope it's ok)
Sure, only modified v3 is ok.
BTW, now that this is working. Could you double check the correct axes
set up. In particular, is it x_inverted or y_inverted, and what about z
axis...
Thanks,
Eric
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2009-02-10 23:56 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-02-10 23:40 [PATCHv2] lis3lv02d: support both one- and two-byte sensors Giuseppe Bilotta
2009-02-10 23:46 ` Éric Piel
2009-02-10 23:51 ` Giuseppe Bilotta
2009-02-10 23:54 ` Éric Piel
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).