aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/hwmon
diff options
context:
space:
mode:
authorSamu Onkalo <samu.p.onkalo@nokia.com>2010-10-22 07:57:29 -0400
committerGuenter Roeck <guenter.roeck@ericsson.com>2010-10-25 17:11:38 -0400
commitcc23aa1ce2631b2fe1e3fba82ee444460f5ee3b7 (patch)
tree2503b877c18bf4ae72afd76b2c2da5fd548af167 /drivers/hwmon
parented37d7f619648bf1a3ac136e80d2d0d647734eb3 (diff)
hwmon: lis3: New parameters to platform data
Added default output data rate setting to platform data. If default rate is 0, reset default value is used. Added control for duration via platform data. Added possibility to configure interrupts to trig on both rising and falling edge. The lis3 WU unit can be configured quite many ways and with some configurations it is quite handy to get coordinate refresh when some event trigs and when it reason goes away. Signed-off-by: Samu Onkalo <samu.p.onkalo@nokia.com> Acked-by: Jonathan Cameron <jic23@cam.ac.uk> Acked-by: Eric Piel <eric.piel@tremplin-utc.net> Signed-off-by: Guenter Roeck <guenter.roeck@ericsson.com>
Diffstat (limited to 'drivers/hwmon')
-rw-r--r--drivers/hwmon/lis3lv02d.c21
1 files changed, 14 insertions, 7 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) {