diff options
-rw-r--r-- | drivers/hwmon/lis3lv02d.c | 21 | ||||
-rw-r--r-- | include/linux/lis3lv02d.h | 6 |
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 */ |