diff options
author | Daniel Mack <daniel@caiaq.de> | 2009-06-16 18:34:17 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-06-16 22:47:57 -0400 |
commit | 8f3128e714ded7cf1e8c786c204a4f253b5d8ff4 (patch) | |
tree | cb3c1e9df2da5e4817acfeb75284e8d7b92eae33 /drivers/hwmon | |
parent | 0093716e6dd18dad554bef81cc788a4c50d32a09 (diff) |
lis3: add click function
The LIS302DL accelerometer chip has a 'click' feature which can be used to
detect sudden motion on any of the three axis. Configuration data is
passed via spi platform_data and no action is taken if that's not
specified, so it won't harm any existing platform.
To make the configuration effective, the IRQ lines need to be set up
appropriately. This patch also adds a way to do that from board support
code.
The DD_* definitions were factored out to an own enum because they are
specific to LIS3LV02D devices.
Signed-off-by: Daniel Mack <daniel@caiaq.de>
Acked-by: Pavel Machek <pavel@ucw.cz>
Acked-by: Eric Piel <eric.piel@tremplin-utc.net>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers/hwmon')
-rw-r--r-- | drivers/hwmon/lis3lv02d.c | 20 | ||||
-rw-r--r-- | drivers/hwmon/lis3lv02d.h | 19 | ||||
-rw-r--r-- | drivers/hwmon/lis3lv02d_spi.c | 1 |
3 files changed, 39 insertions, 1 deletions
diff --git a/drivers/hwmon/lis3lv02d.c b/drivers/hwmon/lis3lv02d.c index 366190609c73..271338bdb6be 100644 --- a/drivers/hwmon/lis3lv02d.c +++ b/drivers/hwmon/lis3lv02d.c | |||
@@ -438,6 +438,26 @@ int lis3lv02d_init_device(struct lis3lv02d *dev) | |||
438 | if (lis3lv02d_joystick_enable()) | 438 | if (lis3lv02d_joystick_enable()) |
439 | printk(KERN_ERR DRIVER_NAME ": joystick initialization failed\n"); | 439 | printk(KERN_ERR DRIVER_NAME ": joystick initialization failed\n"); |
440 | 440 | ||
441 | /* passing in platform specific data is purely optional and only | ||
442 | * used by the SPI transport layer at the moment */ | ||
443 | if (dev->pdata) { | ||
444 | struct lis3lv02d_platform_data *p = dev->pdata; | ||
445 | |||
446 | if (p->click_flags && (dev->whoami == LIS_SINGLE_ID)) { | ||
447 | dev->write(dev, CLICK_CFG, p->click_flags); | ||
448 | dev->write(dev, CLICK_TIMELIMIT, p->click_time_limit); | ||
449 | dev->write(dev, CLICK_LATENCY, p->click_latency); | ||
450 | dev->write(dev, CLICK_WINDOW, p->click_window); | ||
451 | dev->write(dev, CLICK_THSZ, p->click_thresh_z & 0xf); | ||
452 | dev->write(dev, CLICK_THSY_X, | ||
453 | (p->click_thresh_x & 0xf) | | ||
454 | (p->click_thresh_y << 4)); | ||
455 | } | ||
456 | |||
457 | if (p->irq_cfg) | ||
458 | dev->write(dev, CTRL_REG3, p->irq_cfg); | ||
459 | } | ||
460 | |||
441 | /* bail if we did not get an IRQ from the bus layer */ | 461 | /* bail if we did not get an IRQ from the bus layer */ |
442 | if (!dev->irq) { | 462 | if (!dev->irq) { |
443 | printk(KERN_ERR DRIVER_NAME | 463 | printk(KERN_ERR DRIVER_NAME |
diff --git a/drivers/hwmon/lis3lv02d.h b/drivers/hwmon/lis3lv02d.h index 5a5a196e6a66..e320e2f511f1 100644 --- a/drivers/hwmon/lis3lv02d.h +++ b/drivers/hwmon/lis3lv02d.h | |||
@@ -29,12 +29,14 @@ | |||
29 | * They can also be connected via I²C. | 29 | * They can also be connected via I²C. |
30 | */ | 30 | */ |
31 | 31 | ||
32 | #include <linux/lis3lv02d.h> | ||
33 | |||
32 | /* 2-byte registers */ | 34 | /* 2-byte registers */ |
33 | #define LIS_DOUBLE_ID 0x3A /* LIS3LV02D[LQ] */ | 35 | #define LIS_DOUBLE_ID 0x3A /* LIS3LV02D[LQ] */ |
34 | /* 1-byte registers */ | 36 | /* 1-byte registers */ |
35 | #define LIS_SINGLE_ID 0x3B /* LIS[32]02DL and others */ | 37 | #define LIS_SINGLE_ID 0x3B /* LIS[32]02DL and others */ |
36 | 38 | ||
37 | enum lis3lv02d_reg { | 39 | enum lis3_reg { |
38 | WHO_AM_I = 0x0F, | 40 | WHO_AM_I = 0x0F, |
39 | OFFSET_X = 0x16, | 41 | OFFSET_X = 0x16, |
40 | OFFSET_Y = 0x17, | 42 | OFFSET_Y = 0x17, |
@@ -62,6 +64,19 @@ enum lis3lv02d_reg { | |||
62 | FF_WU_THS_L = 0x34, | 64 | FF_WU_THS_L = 0x34, |
63 | FF_WU_THS_H = 0x35, | 65 | FF_WU_THS_H = 0x35, |
64 | FF_WU_DURATION = 0x36, | 66 | FF_WU_DURATION = 0x36, |
67 | }; | ||
68 | |||
69 | enum lis302d_reg { | ||
70 | CLICK_CFG = 0x38, | ||
71 | CLICK_SRC = 0x39, | ||
72 | CLICK_THSY_X = 0x3B, | ||
73 | CLICK_THSZ = 0x3C, | ||
74 | CLICK_TIMELIMIT = 0x3D, | ||
75 | CLICK_LATENCY = 0x3E, | ||
76 | CLICK_WINDOW = 0x3F, | ||
77 | }; | ||
78 | |||
79 | enum lis3lv02d_reg { | ||
65 | DD_CFG = 0x38, | 80 | DD_CFG = 0x38, |
66 | DD_SRC = 0x39, | 81 | DD_SRC = 0x39, |
67 | DD_ACK = 0x3A, | 82 | DD_ACK = 0x3A, |
@@ -183,6 +198,8 @@ struct lis3lv02d { | |||
183 | struct fasync_struct *async_queue; /* queue for the misc device */ | 198 | struct fasync_struct *async_queue; /* queue for the misc device */ |
184 | wait_queue_head_t misc_wait; /* Wait queue for the misc device */ | 199 | wait_queue_head_t misc_wait; /* Wait queue for the misc device */ |
185 | unsigned long misc_opened; /* bit0: whether the device is open */ | 200 | unsigned long misc_opened; /* bit0: whether the device is open */ |
201 | |||
202 | struct lis3lv02d_platform_data *pdata; /* for passing board config */ | ||
186 | }; | 203 | }; |
187 | 204 | ||
188 | int lis3lv02d_init_device(struct lis3lv02d *lis3); | 205 | int lis3lv02d_init_device(struct lis3lv02d *lis3); |
diff --git a/drivers/hwmon/lis3lv02d_spi.c b/drivers/hwmon/lis3lv02d_spi.c index 07ae74b0e191..3827ff04485f 100644 --- a/drivers/hwmon/lis3lv02d_spi.c +++ b/drivers/hwmon/lis3lv02d_spi.c | |||
@@ -72,6 +72,7 @@ static int __devinit lis302dl_spi_probe(struct spi_device *spi) | |||
72 | lis3_dev.write = lis3_spi_write; | 72 | lis3_dev.write = lis3_spi_write; |
73 | lis3_dev.irq = spi->irq; | 73 | lis3_dev.irq = spi->irq; |
74 | lis3_dev.ac = lis3lv02d_axis_normal; | 74 | lis3_dev.ac = lis3lv02d_axis_normal; |
75 | lis3_dev.pdata = spi->dev.platform_data; | ||
75 | spi_set_drvdata(spi, &lis3_dev); | 76 | spi_set_drvdata(spi, &lis3_dev); |
76 | 77 | ||
77 | ret = lis3lv02d_init_device(&lis3_dev); | 78 | ret = lis3lv02d_init_device(&lis3_dev); |