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