diff options
author | Samu Onkalo <samu.p.onkalo@nokia.com> | 2010-10-22 07:57:29 -0400 |
---|---|---|
committer | Guenter Roeck <guenter.roeck@ericsson.com> | 2010-10-25 17:11:38 -0400 |
commit | cc23aa1ce2631b2fe1e3fba82ee444460f5ee3b7 (patch) | |
tree | 2503b877c18bf4ae72afd76b2c2da5fd548af167 /drivers/hwmon | |
parent | ed37d7f619648bf1a3ac136e80d2d0d647734eb3 (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.c | 21 |
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) { |