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_ */ | ||
