aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/hwmon/lis3lv02d.c21
-rw-r--r--include/linux/lis3lv02d.h6
2 files changed, 19 insertions, 8 deletions
diff --git a/drivers/hwmon/lis3lv02d.c b/drivers/hwmon/lis3lv02d.c
index 7448411f51ea..3109eb8648ce 100644
--- a/drivers/hwmon/lis3lv02d.c
+++ b/drivers/hwmon/lis3lv02d.c
@@ -740,16 +740,16 @@ static void lis3lv02d_8b_configure(struct lis3lv02d *dev,
740 if (p->wakeup_flags) { 740 if (p->wakeup_flags) {
741 dev->write(dev, FF_WU_CFG_1, p->wakeup_flags); 741 dev->write(dev, FF_WU_CFG_1, p->wakeup_flags);
742 dev->write(dev, FF_WU_THS_1, p->wakeup_thresh & 0x7f); 742 dev->write(dev, FF_WU_THS_1, p->wakeup_thresh & 0x7f);
743 /* default to 2.5ms for now */ 743 /* pdata value + 1 to keep this backward compatible*/
744 dev->write(dev, FF_WU_DURATION_1, 1); 744 dev->write(dev, FF_WU_DURATION_1, p->duration1 + 1);
745 ctrl2 ^= HP_FF_WU1; /* Xor to keep compatible with old pdata*/ 745 ctrl2 ^= HP_FF_WU1; /* Xor to keep compatible with old pdata*/
746 } 746 }
747 747
748 if (p->wakeup_flags2) { 748 if (p->wakeup_flags2) {
749 dev->write(dev, FF_WU_CFG_2, p->wakeup_flags2); 749 dev->write(dev, FF_WU_CFG_2, p->wakeup_flags2);
750 dev->write(dev, FF_WU_THS_2, p->wakeup_thresh2 & 0x7f); 750 dev->write(dev, FF_WU_THS_2, p->wakeup_thresh2 & 0x7f);
751 /* default to 2.5ms for now */ 751 /* pdata value + 1 to keep this backward compatible*/
752 dev->write(dev, FF_WU_DURATION_2, 1); 752 dev->write(dev, FF_WU_DURATION_2, p->duration2 + 1);
753 ctrl2 ^= HP_FF_WU2; /* Xor to keep compatible with old pdata*/ 753 ctrl2 ^= HP_FF_WU2; /* Xor to keep compatible with old pdata*/
754 } 754 }
755 /* Configure hipass filters */ 755 /* Configure hipass filters */
@@ -759,8 +759,8 @@ static void lis3lv02d_8b_configure(struct lis3lv02d *dev,
759 err = request_threaded_irq(p->irq2, 759 err = request_threaded_irq(p->irq2,
760 NULL, 760 NULL,
761 lis302dl_interrupt_thread2_8b, 761 lis302dl_interrupt_thread2_8b,
762 IRQF_TRIGGER_RISING | 762 IRQF_TRIGGER_RISING | IRQF_ONESHOT |
763 IRQF_ONESHOT, 763 (p->irq_flags2 & IRQF_TRIGGER_MASK),
764 DRIVER_NAME, &lis3_dev); 764 DRIVER_NAME, &lis3_dev);
765 if (err < 0) 765 if (err < 0)
766 printk(KERN_ERR DRIVER_NAME 766 printk(KERN_ERR DRIVER_NAME
@@ -776,6 +776,7 @@ int lis3lv02d_init_device(struct lis3lv02d *dev)
776{ 776{
777 int err; 777 int err;
778 irq_handler_t thread_fn; 778 irq_handler_t thread_fn;
779 int irq_flags = 0;
779 780
780 dev->whoami = lis3lv02d_read_8(dev, WHO_AM_I); 781 dev->whoami = lis3lv02d_read_8(dev, WHO_AM_I);
781 782
@@ -847,9 +848,14 @@ int lis3lv02d_init_device(struct lis3lv02d *dev)
847 if (dev->whoami == WAI_8B) 848 if (dev->whoami == WAI_8B)
848 lis3lv02d_8b_configure(dev, p); 849 lis3lv02d_8b_configure(dev, p);
849 850
851 irq_flags = p->irq_flags1 & IRQF_TRIGGER_MASK;
852
850 dev->irq_cfg = p->irq_cfg; 853 dev->irq_cfg = p->irq_cfg;
851 if (p->irq_cfg) 854 if (p->irq_cfg)
852 dev->write(dev, CTRL_REG3, p->irq_cfg); 855 dev->write(dev, CTRL_REG3, p->irq_cfg);
856
857 if (p->default_rate)
858 lis3lv02d_set_odr(p->default_rate);
853 } 859 }
854 860
855 /* bail if we did not get an IRQ from the bus layer */ 861 /* bail if we did not get an IRQ from the bus layer */
@@ -877,7 +883,8 @@ int lis3lv02d_init_device(struct lis3lv02d *dev)
877 883
878 err = request_threaded_irq(dev->irq, lis302dl_interrupt, 884 err = request_threaded_irq(dev->irq, lis302dl_interrupt,
879 thread_fn, 885 thread_fn,
880 IRQF_TRIGGER_RISING | IRQF_ONESHOT, 886 IRQF_TRIGGER_RISING | IRQF_ONESHOT |
887 irq_flags,
881 DRIVER_NAME, &lis3_dev); 888 DRIVER_NAME, &lis3_dev);
882 889
883 if (err < 0) { 890 if (err < 0) {
diff --git a/include/linux/lis3lv02d.h b/include/linux/lis3lv02d.h
index c4a4a52c1de7..18d578f08120 100644
--- a/include/linux/lis3lv02d.h
+++ b/include/linux/lis3lv02d.h
@@ -36,7 +36,10 @@ struct lis3lv02d_platform_data {
36#define LIS3_IRQ_OPEN_DRAIN (1 << 6) 36#define LIS3_IRQ_OPEN_DRAIN (1 << 6)
37#define LIS3_IRQ_ACTIVE_LOW (1 << 7) 37#define LIS3_IRQ_ACTIVE_LOW (1 << 7)
38 unsigned char irq_cfg; 38 unsigned char irq_cfg;
39 39 unsigned char irq_flags1; /* Additional irq edge / level flags */
40 unsigned char irq_flags2; /* Additional irq edge / level flags */
41 unsigned char duration1;
42 unsigned char duration2;
40#define LIS3_WAKEUP_X_LO (1 << 0) 43#define LIS3_WAKEUP_X_LO (1 << 0)
41#define LIS3_WAKEUP_X_HI (1 << 1) 44#define LIS3_WAKEUP_X_HI (1 << 1)
42#define LIS3_WAKEUP_Y_LO (1 << 2) 45#define LIS3_WAKEUP_Y_LO (1 << 2)
@@ -66,6 +69,7 @@ struct lis3lv02d_platform_data {
66 s8 axis_z; 69 s8 axis_z;
67#define LIS3_USE_REGULATOR_CTRL 0x01 70#define LIS3_USE_REGULATOR_CTRL 0x01
68 u16 driver_features; 71 u16 driver_features;
72 int default_rate;
69 int (*setup_resources)(void); 73 int (*setup_resources)(void);
70 int (*release_resources)(void); 74 int (*release_resources)(void);
71 /* Limits for selftest are specified in chip data sheet */ 75 /* Limits for selftest are specified in chip data sheet */