diff options
-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 | ||||
-rw-r--r-- | include/linux/lis3lv02d.h | 39 |
4 files changed, 78 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); |
diff --git a/include/linux/lis3lv02d.h b/include/linux/lis3lv02d.h new file mode 100644 index 000000000000..ad651f4e45ac --- /dev/null +++ b/include/linux/lis3lv02d.h | |||
@@ -0,0 +1,39 @@ | |||
1 | #ifndef __LIS3LV02D_H_ | ||
2 | #define __LIS3LV02D_H_ | ||
3 | |||
4 | struct lis3lv02d_platform_data { | ||
5 | /* please note: the 'click' feature is only supported for | ||
6 | * LIS[32]02DL variants of the chip and will be ignored for | ||
7 | * others */ | ||
8 | #define LIS3_CLICK_SINGLE_X (1 << 0) | ||
9 | #define LIS3_CLICK_DOUBLE_X (1 << 1) | ||
10 | #define LIS3_CLICK_SINGLE_Y (1 << 2) | ||
11 | #define LIS3_CLICK_DOUBLE_Y (1 << 3) | ||
12 | #define LIS3_CLICK_SINGLE_Z (1 << 4) | ||
13 | #define LIS3_CLICK_DOUBLE_Z (1 << 5) | ||
14 | unsigned char click_flags; | ||
15 | unsigned char click_thresh_x; | ||
16 | unsigned char click_thresh_y; | ||
17 | unsigned char click_thresh_z; | ||
18 | unsigned char click_time_limit; | ||
19 | unsigned char click_latency; | ||
20 | unsigned char click_window; | ||
21 | |||
22 | #define LIS3_IRQ1_DISABLE (0 << 0) | ||
23 | #define LIS3_IRQ1_FF_WU_1 (1 << 0) | ||
24 | #define LIS3_IRQ1_FF_WU_2 (2 << 0) | ||
25 | #define LIS3_IRQ1_FF_WU_12 (3 << 0) | ||
26 | #define LIS3_IRQ1_DATA_READY (4 << 0) | ||
27 | #define LIS3_IRQ1_CLICK (7 << 0) | ||
28 | #define LIS3_IRQ2_DISABLE (0 << 3) | ||
29 | #define LIS3_IRQ2_FF_WU_1 (1 << 3) | ||
30 | #define LIS3_IRQ2_FF_WU_2 (2 << 3) | ||
31 | #define LIS3_IRQ2_FF_WU_12 (3 << 3) | ||
32 | #define LIS3_IRQ2_DATA_READY (4 << 3) | ||
33 | #define LIS3_IRQ2_CLICK (7 << 3) | ||
34 | #define LIS3_IRQ_OPEN_DRAIN (1 << 6) | ||
35 | #define LIS3_IRQ_ACTIVE_HIGH (1 << 7) | ||
36 | unsigned char irq_cfg; | ||
37 | }; | ||
38 | |||
39 | #endif /* __LIS3LV02D_H_ */ | ||