aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJonathan Cameron <jic23@cam.ac.uk>2010-05-04 09:42:58 -0400
committerGreg Kroah-Hartman <gregkh@suse.de>2010-05-11 14:36:05 -0400
commitf3fb001191a38a81bbc3cb363af2c279609ecc7c (patch)
treed2d17c61c682131e2c02deb536db2f35afa0169f
parentff7723e203349c18d7149e7cf2a4ae928bb9da69 (diff)
iio:staging:accelerometers move towards the new abi
Signed-off-by: Jonathan Cameron <jic23@cam.ac.uk> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-rw-r--r--drivers/staging/iio/accel/accel.h8
-rw-r--r--drivers/staging/iio/accel/kxsd9.c88
-rw-r--r--drivers/staging/iio/accel/lis3l02dq.h4
-rw-r--r--drivers/staging/iio/accel/lis3l02dq_core.c175
-rw-r--r--drivers/staging/iio/accel/lis3l02dq_ring.c8
-rw-r--r--drivers/staging/iio/accel/sca3000.h2
-rw-r--r--drivers/staging/iio/accel/sca3000_core.c172
-rw-r--r--drivers/staging/iio/accel/sca3000_ring.c33
-rw-r--r--drivers/staging/iio/ring_generic.h4
9 files changed, 262 insertions, 232 deletions
diff --git a/drivers/staging/iio/accel/accel.h b/drivers/staging/iio/accel/accel.h
index d7fc7f98348..059209c9e33 100644
--- a/drivers/staging/iio/accel/accel.h
+++ b/drivers/staging/iio/accel/accel.h
@@ -2,7 +2,6 @@
2#include "../sysfs.h" 2#include "../sysfs.h"
3 3
4/* Accelerometer types of attribute */ 4/* Accelerometer types of attribute */
5
6#define IIO_DEV_ATTR_ACCEL_X_OFFSET(_mode, _show, _store, _addr) \ 5#define IIO_DEV_ATTR_ACCEL_X_OFFSET(_mode, _show, _store, _addr) \
7 IIO_DEVICE_ATTR(accel_x_offset, _mode, _show, _store, _addr) 6 IIO_DEVICE_ATTR(accel_x_offset, _mode, _show, _store, _addr)
8 7
@@ -22,13 +21,13 @@
22 IIO_DEVICE_ATTR(accel_z_gain, _mode, _show, _store, _addr) 21 IIO_DEVICE_ATTR(accel_z_gain, _mode, _show, _store, _addr)
23 22
24#define IIO_DEV_ATTR_ACCEL_X(_show, _addr) \ 23#define IIO_DEV_ATTR_ACCEL_X(_show, _addr) \
25 IIO_DEVICE_ATTR(accel_x, S_IRUGO, _show, NULL, _addr) 24 IIO_DEVICE_ATTR(accel_x_raw, S_IRUGO, _show, NULL, _addr)
26 25
27#define IIO_DEV_ATTR_ACCEL_Y(_show, _addr) \ 26#define IIO_DEV_ATTR_ACCEL_Y(_show, _addr) \
28 IIO_DEVICE_ATTR(accel_y, S_IRUGO, _show, NULL, _addr) 27 IIO_DEVICE_ATTR(accel_y_raw, S_IRUGO, _show, NULL, _addr)
29 28
30#define IIO_DEV_ATTR_ACCEL_Z(_show, _addr) \ 29#define IIO_DEV_ATTR_ACCEL_Z(_show, _addr) \
31 IIO_DEVICE_ATTR(accel_z, S_IRUGO, _show, NULL, _addr) 30 IIO_DEVICE_ATTR(accel_z_raw, S_IRUGO, _show, NULL, _addr)
32 31
33/* Thresholds are somewhat chip dependent - may need quite a few defs here */ 32/* Thresholds are somewhat chip dependent - may need quite a few defs here */
34/* For unified thresholds (shared across all directions */ 33/* For unified thresholds (shared across all directions */
@@ -61,7 +60,6 @@
61#define IIO_DEV_ATTR_ACCEL_THRESH_Z(_mode, _show, _store, _addr) \ 60#define IIO_DEV_ATTR_ACCEL_THRESH_Z(_mode, _show, _store, _addr) \
62 IIO_DEVICE_ATTR(thresh_accel_z, _mode, _show, _store, _addr) 61 IIO_DEVICE_ATTR(thresh_accel_z, _mode, _show, _store, _addr)
63 62
64
65/** 63/**
66 * IIO_EVENT_ATTR_ACCEL_X_HIGH: threshold event, x acceleration 64 * IIO_EVENT_ATTR_ACCEL_X_HIGH: threshold event, x acceleration
67 * @_show: read x acceleration high threshold 65 * @_show: read x acceleration high threshold
diff --git a/drivers/staging/iio/accel/kxsd9.c b/drivers/staging/iio/accel/kxsd9.c
index db2dd537ffb..ae7ffe114fc 100644
--- a/drivers/staging/iio/accel/kxsd9.c
+++ b/drivers/staging/iio/accel/kxsd9.c
@@ -26,6 +26,7 @@
26#include <linux/rtc.h> 26#include <linux/rtc.h>
27#include <linux/delay.h> 27#include <linux/delay.h>
28#include <linux/slab.h> 28#include <linux/slab.h>
29#include <linux/string.h>
29 30
30#include "../iio.h" 31#include "../iio.h"
31#include "../sysfs.h" 32#include "../sysfs.h"
@@ -51,8 +52,10 @@
51#define KXSD9_READ(a) (0x80 | (a)) 52#define KXSD9_READ(a) (0x80 | (a))
52#define KXSD9_WRITE(a) (a) 53#define KXSD9_WRITE(a) (a)
53 54
54#define IIO_DEV_ATTR_ACCEL_SET_RANGE(_mode, _show, _store) \ 55#define KXSD9_SCALE_2G "0.011978"
55 IIO_DEVICE_ATTR(accel_range, _mode, _show, _store, 0) 56#define KXSD9_SCALE_4G "0.023927"
57#define KXSD9_SCALE_6G "0.035934"
58#define KXSD9_SCALE_8G "0.047853"
56 59
57#define KXSD9_STATE_RX_SIZE 2 60#define KXSD9_STATE_RX_SIZE 2
58#define KXSD9_STATE_TX_SIZE 4 61#define KXSD9_STATE_TX_SIZE 4
@@ -73,9 +76,9 @@ struct kxsd9_state {
73}; 76};
74 77
75/* This may want to move to mili g to allow for non integer ranges */ 78/* This may want to move to mili g to allow for non integer ranges */
76static ssize_t kxsd9_read_accel_range(struct device *dev, 79static ssize_t kxsd9_read_scale(struct device *dev,
77 struct device_attribute *attr, 80 struct device_attribute *attr,
78 char *buf) 81 char *buf)
79{ 82{
80 int ret; 83 int ret;
81 ssize_t len = 0; 84 ssize_t len = 0;
@@ -101,16 +104,16 @@ static ssize_t kxsd9_read_accel_range(struct device *dev,
101 104
102 switch (st->rx[1] & KXSD9_FS_MASK) { 105 switch (st->rx[1] & KXSD9_FS_MASK) {
103 case KXSD9_FS_8: 106 case KXSD9_FS_8:
104 len += sprintf(buf, "8\n"); 107 len += sprintf(buf, "%s\n", KXSD9_SCALE_8G);
105 break; 108 break;
106 case KXSD9_FS_6: 109 case KXSD9_FS_6:
107 len += sprintf(buf, "6\n"); 110 len += sprintf(buf, "%s\n", KXSD9_SCALE_6G);
108 break; 111 break;
109 case KXSD9_FS_4: 112 case KXSD9_FS_4:
110 len += sprintf(buf, "4\n"); 113 len += sprintf(buf, "%s\n", KXSD9_SCALE_4G);
111 break; 114 break;
112 case KXSD9_FS_2: 115 case KXSD9_FS_2:
113 len += sprintf(buf, "2\n"); 116 len += sprintf(buf, "%s\n", KXSD9_SCALE_2G);
114 break; 117 break;
115 } 118 }
116 119
@@ -119,12 +122,12 @@ error_ret:
119 122
120 return ret ? ret : len; 123 return ret ? ret : len;
121} 124}
122static ssize_t kxsd9_write_accel_range(struct device *dev, 125static ssize_t kxsd9_write_scale(struct device *dev,
123 struct device_attribute *attr, 126 struct device_attribute *attr,
124 const char *buf, 127 const char *buf,
125 size_t len) 128 size_t len)
126{ 129{
127 long readin; 130
128 struct spi_message msg; 131 struct spi_message msg;
129 int ret; 132 int ret;
130 struct iio_dev *indio_dev = dev_get_drvdata(dev); 133 struct iio_dev *indio_dev = dev_get_drvdata(dev);
@@ -145,25 +148,25 @@ static ssize_t kxsd9_write_accel_range(struct device *dev,
145 }, 148 },
146 }; 149 };
147 150
148 ret = strict_strtol(buf, 10, &readin); 151 if (!strncmp(buf, KXSD9_SCALE_8G,
149 if (ret) 152 strlen(buf) < strlen(KXSD9_SCALE_8G)
150 return ret; 153 ? strlen(buf) : strlen(KXSD9_SCALE_8G)))
151 switch (readin) {
152 case 8:
153 val = KXSD9_FS_8; 154 val = KXSD9_FS_8;
154 break; 155 else if (!strncmp(buf, KXSD9_SCALE_6G,
155 case 6: 156 strlen(buf) < strlen(KXSD9_SCALE_6G)
157 ? strlen(buf) : strlen(KXSD9_SCALE_6G)))
156 val = KXSD9_FS_6; 158 val = KXSD9_FS_6;
157 break; 159 else if (!strncmp(buf, KXSD9_SCALE_4G,
158 case 4: 160 strlen(buf) < strlen(KXSD9_SCALE_4G)
161 ? strlen(buf) : strlen(KXSD9_SCALE_4G)))
159 val = KXSD9_FS_4; 162 val = KXSD9_FS_4;
160 break; 163 else if (!strncmp(buf, KXSD9_SCALE_2G,
161 case 2: 164 strlen(buf) < strlen(KXSD9_SCALE_2G)
165 ? strlen(buf) : strlen(KXSD9_SCALE_2G)))
162 val = KXSD9_FS_2; 166 val = KXSD9_FS_2;
163 break; 167 else
164 default:
165 return -EINVAL; 168 return -EINVAL;
166 } 169
167 mutex_lock(&st->buf_lock); 170 mutex_lock(&st->buf_lock);
168 st->tx[0] = KXSD9_READ(KXSD9_REG_CTRL_C); 171 st->tx[0] = KXSD9_READ(KXSD9_REG_CTRL_C);
169 st->tx[1] = 0; 172 st->tx[1] = 0;
@@ -182,6 +185,7 @@ error_ret:
182 mutex_unlock(&st->buf_lock); 185 mutex_unlock(&st->buf_lock);
183 return ret ? ret : len; 186 return ret ? ret : len;
184} 187}
188
185static ssize_t kxsd9_read_accel(struct device *dev, 189static ssize_t kxsd9_read_accel(struct device *dev,
186 struct device_attribute *attr, 190 struct device_attribute *attr,
187 char *buf) 191 char *buf)
@@ -227,17 +231,27 @@ error_ret:
227static IIO_DEV_ATTR_ACCEL_X(kxsd9_read_accel, KXSD9_REG_X); 231static IIO_DEV_ATTR_ACCEL_X(kxsd9_read_accel, KXSD9_REG_X);
228static IIO_DEV_ATTR_ACCEL_Y(kxsd9_read_accel, KXSD9_REG_Y); 232static IIO_DEV_ATTR_ACCEL_Y(kxsd9_read_accel, KXSD9_REG_Y);
229static IIO_DEV_ATTR_ACCEL_Z(kxsd9_read_accel, KXSD9_REG_Z); 233static IIO_DEV_ATTR_ACCEL_Z(kxsd9_read_accel, KXSD9_REG_Z);
230static IIO_DEV_ATTR_ADC(0, kxsd9_read_accel, KXSD9_REG_AUX); 234static IIO_DEV_ATTR_IN_RAW(0, kxsd9_read_accel, KXSD9_REG_AUX);
231static IIO_DEV_ATTR_ACCEL_SET_RANGE(S_IRUGO | S_IWUSR, 235
232 kxsd9_read_accel_range, 236static IIO_DEVICE_ATTR(accel_scale,
233 kxsd9_write_accel_range); 237 S_IRUGO | S_IWUSR,
238 kxsd9_read_scale,
239 kxsd9_write_scale,
240 0);
241
242static IIO_CONST_ATTR(accel_scale_available,
243 KXSD9_SCALE_2G " "
244 KXSD9_SCALE_4G " "
245 KXSD9_SCALE_6G " "
246 KXSD9_SCALE_8G);
234 247
235static struct attribute *kxsd9_attributes[] = { 248static struct attribute *kxsd9_attributes[] = {
236 &iio_dev_attr_accel_x.dev_attr.attr, 249 &iio_dev_attr_accel_x_raw.dev_attr.attr,
237 &iio_dev_attr_accel_y.dev_attr.attr, 250 &iio_dev_attr_accel_y_raw.dev_attr.attr,
238 &iio_dev_attr_accel_z.dev_attr.attr, 251 &iio_dev_attr_accel_z_raw.dev_attr.attr,
239 &iio_dev_attr_adc_0.dev_attr.attr, 252 &iio_dev_attr_in0_raw.dev_attr.attr,
240 &iio_dev_attr_accel_range.dev_attr.attr, 253 &iio_dev_attr_accel_scale.dev_attr.attr,
254 &iio_const_attr_accel_scale_available.dev_attr.attr,
241 NULL, 255 NULL,
242}; 256};
243 257
diff --git a/drivers/staging/iio/accel/lis3l02dq.h b/drivers/staging/iio/accel/lis3l02dq.h
index 91a5375408c..e76a97937a3 100644
--- a/drivers/staging/iio/accel/lis3l02dq.h
+++ b/drivers/staging/iio/accel/lis3l02dq.h
@@ -179,10 +179,6 @@ int lis3l02dq_spi_read_reg_8(struct device *dev,
179int lis3l02dq_spi_write_reg_8(struct device *dev, 179int lis3l02dq_spi_write_reg_8(struct device *dev,
180 u8 reg_address, 180 u8 reg_address,
181 u8 *val); 181 u8 *val);
182#define LIS3L02DQ_SCAN_ACC_X 0
183#define LIS3L02DQ_SCAN_ACC_Y 1
184#define LIS3L02DQ_SCAN_ACC_Z 2
185
186 182
187#ifdef CONFIG_IIO_RING_BUFFER 183#ifdef CONFIG_IIO_RING_BUFFER
188/* At the moment triggers are only used for ring buffer 184/* At the moment triggers are only used for ring buffer
diff --git a/drivers/staging/iio/accel/lis3l02dq_core.c b/drivers/staging/iio/accel/lis3l02dq_core.c
index ea76902797b..6b5577d7d8d 100644
--- a/drivers/staging/iio/accel/lis3l02dq_core.c
+++ b/drivers/staging/iio/accel/lis3l02dq_core.c
@@ -458,41 +458,39 @@ err_ret:
458 return ret; 458 return ret;
459} 459}
460 460
461static IIO_DEV_ATTR_ACCEL_X_OFFSET(S_IWUSR | S_IRUGO, 461#define LIS3L02DQ_SIGNED_ATTR(name, reg) \
462 lis3l02dq_read_signed, 462 IIO_DEVICE_ATTR(name, \
463 lis3l02dq_write_signed, 463 S_IWUSR | S_IRUGO, \
464 LIS3L02DQ_REG_OFFSET_X_ADDR); 464 lis3l02dq_read_signed, \
465 465 lis3l02dq_write_signed, \
466static IIO_DEV_ATTR_ACCEL_Y_OFFSET(S_IWUSR | S_IRUGO, 466 reg);
467 lis3l02dq_read_signed, 467
468 lis3l02dq_write_signed, 468#define LIS3L02DQ_UNSIGNED_ATTR(name, reg) \
469 LIS3L02DQ_REG_OFFSET_Y_ADDR); 469 IIO_DEVICE_ATTR(name, \
470 470 S_IWUSR | S_IRUGO, \
471static IIO_DEV_ATTR_ACCEL_Z_OFFSET(S_IWUSR | S_IRUGO, 471 lis3l02dq_read_unsigned, \
472 lis3l02dq_read_signed, 472 lis3l02dq_write_unsigned, \
473 lis3l02dq_write_signed, 473 reg);
474 LIS3L02DQ_REG_OFFSET_Z_ADDR); 474
475 475static LIS3L02DQ_SIGNED_ATTR(accel_x_calibbias,
476static IIO_DEV_ATTR_ACCEL_X_GAIN(S_IWUSR | S_IRUGO, 476 LIS3L02DQ_REG_OFFSET_X_ADDR);
477 lis3l02dq_read_unsigned, 477static LIS3L02DQ_SIGNED_ATTR(accel_y_calibbias,
478 lis3l02dq_write_unsigned, 478 LIS3L02DQ_REG_OFFSET_Y_ADDR);
479 LIS3L02DQ_REG_GAIN_X_ADDR); 479static LIS3L02DQ_SIGNED_ATTR(accel_z_calibbias,
480 480 LIS3L02DQ_REG_OFFSET_Z_ADDR);
481static IIO_DEV_ATTR_ACCEL_Y_GAIN(S_IWUSR | S_IRUGO, 481
482 lis3l02dq_read_unsigned, 482static LIS3L02DQ_UNSIGNED_ATTR(accel_x_calibscale,
483 lis3l02dq_write_unsigned, 483 LIS3L02DQ_REG_GAIN_X_ADDR);
484 LIS3L02DQ_REG_GAIN_Y_ADDR); 484static LIS3L02DQ_UNSIGNED_ATTR(accel_y_calibscale,
485 485 LIS3L02DQ_REG_GAIN_Y_ADDR);
486static IIO_DEV_ATTR_ACCEL_Z_GAIN(S_IWUSR | S_IRUGO, 486static LIS3L02DQ_UNSIGNED_ATTR(accel_z_calibscale,
487 lis3l02dq_read_unsigned, 487 LIS3L02DQ_REG_GAIN_Z_ADDR);
488 lis3l02dq_write_unsigned, 488
489 LIS3L02DQ_REG_GAIN_Z_ADDR); 489static IIO_DEVICE_ATTR(accel_mag_either_rising_value,
490 490 S_IWUSR | S_IRUGO,
491static IIO_DEV_ATTR_ACCEL_THRESH(S_IWUSR | S_IRUGO, 491 lis3l02dq_read_16bit_signed,
492 lis3l02dq_read_16bit_signed, 492 lis3l02dq_write_16bit_signed,
493 lis3l02dq_write_16bit_signed, 493 LIS3L02DQ_REG_THS_L_ADDR);
494 LIS3L02DQ_REG_THS_L_ADDR);
495
496/* RFC The reading method for these will change depending on whether 494/* RFC The reading method for these will change depending on whether
497 * ring buffer capture is in use. Is it worth making these take two 495 * ring buffer capture is in use. Is it worth making these take two
498 * functions and let the core handle which to call, or leave as in this 496 * functions and let the core handle which to call, or leave as in this
@@ -512,7 +510,7 @@ static IIO_DEV_ATTR_SAMP_FREQ(S_IWUSR | S_IRUGO,
512 lis3l02dq_read_frequency, 510 lis3l02dq_read_frequency,
513 lis3l02dq_write_frequency); 511 lis3l02dq_write_frequency);
514 512
515static IIO_CONST_ATTR_AVAIL_SAMP_FREQ("280 560 1120 4480"); 513static IIO_CONST_ATTR_SAMP_FREQ_AVAIL("280 560 1120 4480");
516 514
517static ssize_t lis3l02dq_read_interrupt_config(struct device *dev, 515static ssize_t lis3l02dq_read_interrupt_config(struct device *dev,
518 struct device_attribute *attr, 516 struct device_attribute *attr,
@@ -522,7 +520,7 @@ static ssize_t lis3l02dq_read_interrupt_config(struct device *dev,
522 s8 val; 520 s8 val;
523 struct iio_event_attr *this_attr = to_iio_event_attr(attr); 521 struct iio_event_attr *this_attr = to_iio_event_attr(attr);
524 522
525 ret = lis3l02dq_spi_read_reg_8(dev, 523 ret = lis3l02dq_spi_read_reg_8(dev->parent,
526 LIS3L02DQ_REG_WAKE_UP_CFG_ADDR, 524 LIS3L02DQ_REG_WAKE_UP_CFG_ADDR,
527 (u8 *)&val); 525 (u8 *)&val);
528 526
@@ -545,7 +543,7 @@ static ssize_t lis3l02dq_write_interrupt_config(struct device *dev,
545 543
546 mutex_lock(&indio_dev->mlock); 544 mutex_lock(&indio_dev->mlock);
547 /* read current value */ 545 /* read current value */
548 ret = lis3l02dq_spi_read_reg_8(dev, 546 ret = lis3l02dq_spi_read_reg_8(dev->parent,
549 LIS3L02DQ_REG_WAKE_UP_CFG_ADDR, 547 LIS3L02DQ_REG_WAKE_UP_CFG_ADDR,
550 &valold); 548 &valold);
551 if (ret) 549 if (ret)
@@ -618,7 +616,7 @@ static int lis3l02dq_thresh_handler_th(struct iio_dev *dev_info,
618static void lis3l02dq_thresh_handler_bh_no_check(struct work_struct *work_s) 616static void lis3l02dq_thresh_handler_bh_no_check(struct work_struct *work_s)
619{ 617{
620 struct iio_work_cont *wc 618 struct iio_work_cont *wc
621 = container_of(work_s, struct iio_work_cont, ws_nocheck); 619 = container_of(work_s, struct iio_work_cont, ws);
622 struct lis3l02dq_state *st = wc->st; 620 struct lis3l02dq_state *st = wc->st;
623 u8 t; 621 u8 t;
624 622
@@ -668,43 +666,51 @@ static void lis3l02dq_thresh_handler_bh_no_check(struct work_struct *work_s)
668/* A shared handler for a number of threshold types */ 666/* A shared handler for a number of threshold types */
669IIO_EVENT_SH(threshold, &lis3l02dq_thresh_handler_th); 667IIO_EVENT_SH(threshold, &lis3l02dq_thresh_handler_th);
670 668
671IIO_EVENT_ATTR_ACCEL_X_HIGH_SH(iio_event_threshold, 669IIO_EVENT_ATTR_SH(accel_x_mag_pos_rising_en,
672 lis3l02dq_read_interrupt_config, 670 iio_event_threshold,
673 lis3l02dq_write_interrupt_config, 671 lis3l02dq_read_interrupt_config,
674 LIS3L02DQ_REG_WAKE_UP_CFG_INTERRUPT_X_HIGH); 672 lis3l02dq_write_interrupt_config,
675 673 LIS3L02DQ_REG_WAKE_UP_CFG_INTERRUPT_X_HIGH);
676IIO_EVENT_ATTR_ACCEL_Y_HIGH_SH(iio_event_threshold, 674
677 lis3l02dq_read_interrupt_config, 675IIO_EVENT_ATTR_SH(accel_y_mag_pos_rising_en,
678 lis3l02dq_write_interrupt_config, 676 iio_event_threshold,
679 LIS3L02DQ_REG_WAKE_UP_CFG_INTERRUPT_Y_HIGH); 677 lis3l02dq_read_interrupt_config,
680 678 lis3l02dq_write_interrupt_config,
681IIO_EVENT_ATTR_ACCEL_Z_HIGH_SH(iio_event_threshold, 679 LIS3L02DQ_REG_WAKE_UP_CFG_INTERRUPT_Y_HIGH);
682 lis3l02dq_read_interrupt_config, 680
683 lis3l02dq_write_interrupt_config, 681IIO_EVENT_ATTR_SH(accel_z_mag_pos_rising_en,
684 LIS3L02DQ_REG_WAKE_UP_CFG_INTERRUPT_Z_HIGH); 682 iio_event_threshold,
685 683 lis3l02dq_read_interrupt_config,
686IIO_EVENT_ATTR_ACCEL_X_LOW_SH(iio_event_threshold, 684 lis3l02dq_write_interrupt_config,
687 lis3l02dq_read_interrupt_config, 685 LIS3L02DQ_REG_WAKE_UP_CFG_INTERRUPT_Z_HIGH);
688 lis3l02dq_write_interrupt_config, 686
689 LIS3L02DQ_REG_WAKE_UP_CFG_INTERRUPT_X_LOW); 687IIO_EVENT_ATTR_SH(accel_x_mag_neg_rising_en,
690 688 iio_event_threshold,
691IIO_EVENT_ATTR_ACCEL_Y_LOW_SH(iio_event_threshold, 689 lis3l02dq_read_interrupt_config,
692 lis3l02dq_read_interrupt_config, 690 lis3l02dq_write_interrupt_config,
693 lis3l02dq_write_interrupt_config, 691 LIS3L02DQ_REG_WAKE_UP_CFG_INTERRUPT_X_LOW);
694 LIS3L02DQ_REG_WAKE_UP_CFG_INTERRUPT_Y_LOW); 692
693IIO_EVENT_ATTR_SH(accel_y_mag_neg_rising_en,
694 iio_event_threshold,
695 lis3l02dq_read_interrupt_config,
696 lis3l02dq_write_interrupt_config,
697 LIS3L02DQ_REG_WAKE_UP_CFG_INTERRUPT_Y_LOW);
698
699IIO_EVENT_ATTR_SH(accel_z_mag_neg_rising_en,
700 iio_event_threshold,
701 lis3l02dq_read_interrupt_config,
702 lis3l02dq_write_interrupt_config,
703 LIS3L02DQ_REG_WAKE_UP_CFG_INTERRUPT_Z_LOW);
695 704
696IIO_EVENT_ATTR_ACCEL_Z_LOW_SH(iio_event_threshold,
697 lis3l02dq_read_interrupt_config,
698 lis3l02dq_write_interrupt_config,
699 LIS3L02DQ_REG_WAKE_UP_CFG_INTERRUPT_Z_LOW);
700 705
701static struct attribute *lis3l02dq_event_attributes[] = { 706static struct attribute *lis3l02dq_event_attributes[] = {
702 &iio_event_attr_accel_x_high.dev_attr.attr, 707 &iio_event_attr_accel_x_mag_pos_rising_en.dev_attr.attr,
703 &iio_event_attr_accel_y_high.dev_attr.attr, 708 &iio_event_attr_accel_y_mag_pos_rising_en.dev_attr.attr,
704 &iio_event_attr_accel_z_high.dev_attr.attr, 709 &iio_event_attr_accel_z_mag_pos_rising_en.dev_attr.attr,
705 &iio_event_attr_accel_x_low.dev_attr.attr, 710 &iio_event_attr_accel_x_mag_neg_rising_en.dev_attr.attr,
706 &iio_event_attr_accel_y_low.dev_attr.attr, 711 &iio_event_attr_accel_y_mag_neg_rising_en.dev_attr.attr,
707 &iio_event_attr_accel_z_low.dev_attr.attr, 712 &iio_event_attr_accel_z_mag_neg_rising_en.dev_attr.attr,
713 &iio_dev_attr_accel_mag_either_rising_value.dev_attr.attr,
708 NULL 714 NULL
709}; 715};
710 716
@@ -713,20 +719,21 @@ static struct attribute_group lis3l02dq_event_attribute_group = {
713}; 719};
714 720
715static IIO_CONST_ATTR(name, "lis3l02dq"); 721static IIO_CONST_ATTR(name, "lis3l02dq");
722static IIO_CONST_ATTR(accel_scale, "0.00958");
716 723
717static struct attribute *lis3l02dq_attributes[] = { 724static struct attribute *lis3l02dq_attributes[] = {
718 &iio_dev_attr_accel_x_offset.dev_attr.attr, 725 &iio_dev_attr_accel_x_calibbias.dev_attr.attr,
719 &iio_dev_attr_accel_y_offset.dev_attr.attr, 726 &iio_dev_attr_accel_y_calibbias.dev_attr.attr,
720 &iio_dev_attr_accel_z_offset.dev_attr.attr, 727 &iio_dev_attr_accel_z_calibbias.dev_attr.attr,
721 &iio_dev_attr_accel_x_gain.dev_attr.attr, 728 &iio_dev_attr_accel_x_calibscale.dev_attr.attr,
722 &iio_dev_attr_accel_y_gain.dev_attr.attr, 729 &iio_dev_attr_accel_y_calibscale.dev_attr.attr,
723 &iio_dev_attr_accel_z_gain.dev_attr.attr, 730 &iio_dev_attr_accel_z_calibscale.dev_attr.attr,
724 &iio_dev_attr_thresh.dev_attr.attr, 731 &iio_const_attr_accel_scale.dev_attr.attr,
725 &iio_dev_attr_accel_x.dev_attr.attr, 732 &iio_dev_attr_accel_x_raw.dev_attr.attr,
726 &iio_dev_attr_accel_y.dev_attr.attr, 733 &iio_dev_attr_accel_y_raw.dev_attr.attr,
727 &iio_dev_attr_accel_z.dev_attr.attr, 734 &iio_dev_attr_accel_z_raw.dev_attr.attr,
728 &iio_dev_attr_sampling_frequency.dev_attr.attr, 735 &iio_dev_attr_sampling_frequency.dev_attr.attr,
729 &iio_const_attr_available_sampling_frequency.dev_attr.attr, 736 &iio_const_attr_sampling_frequency_available.dev_attr.attr,
730 &iio_const_attr_name.dev_attr.attr, 737 &iio_const_attr_name.dev_attr.attr,
731 NULL 738 NULL
732}; 739};
diff --git a/drivers/staging/iio/accel/lis3l02dq_ring.c b/drivers/staging/iio/accel/lis3l02dq_ring.c
index 93712430e57..bba4b0925ac 100644
--- a/drivers/staging/iio/accel/lis3l02dq_ring.c
+++ b/drivers/staging/iio/accel/lis3l02dq_ring.c
@@ -75,16 +75,16 @@ error_ret:
75 return ret; 75 return ret;
76 76
77} 77}
78static IIO_SCAN_EL_C(accel_x, LIS3L02DQ_SCAN_ACC_X, IIO_SIGNED(16), 78static IIO_SCAN_EL_C(accel_x, 0, IIO_SIGNED(16),
79 LIS3L02DQ_REG_OUT_X_L_ADDR, 79 LIS3L02DQ_REG_OUT_X_L_ADDR,
80 &lis3l02dq_scan_el_set_state); 80 &lis3l02dq_scan_el_set_state);
81static IIO_SCAN_EL_C(accel_y, LIS3L02DQ_SCAN_ACC_Y, IIO_SIGNED(16), 81static IIO_SCAN_EL_C(accel_y, 1, IIO_SIGNED(16),
82 LIS3L02DQ_REG_OUT_Y_L_ADDR, 82 LIS3L02DQ_REG_OUT_Y_L_ADDR,
83 &lis3l02dq_scan_el_set_state); 83 &lis3l02dq_scan_el_set_state);
84static IIO_SCAN_EL_C(accel_z, LIS3L02DQ_SCAN_ACC_Z, IIO_SIGNED(16), 84static IIO_SCAN_EL_C(accel_z, 2, IIO_SIGNED(16),
85 LIS3L02DQ_REG_OUT_Z_L_ADDR, 85 LIS3L02DQ_REG_OUT_Z_L_ADDR,
86 &lis3l02dq_scan_el_set_state); 86 &lis3l02dq_scan_el_set_state);
87static IIO_SCAN_EL_TIMESTAMP; 87static IIO_SCAN_EL_TIMESTAMP(3);
88 88
89static struct attribute *lis3l02dq_scan_el_attrs[] = { 89static struct attribute *lis3l02dq_scan_el_attrs[] = {
90 &iio_scan_el_accel_x.dev_attr.attr, 90 &iio_scan_el_accel_x.dev_attr.attr,
diff --git a/drivers/staging/iio/accel/sca3000.h b/drivers/staging/iio/accel/sca3000.h
index da7d3cb5ae7..e5321999b26 100644
--- a/drivers/staging/iio/accel/sca3000.h
+++ b/drivers/staging/iio/accel/sca3000.h
@@ -187,6 +187,7 @@ struct sca3000_state {
187/** 187/**
188 * struct sca3000_chip_info - model dependant parameters 188 * struct sca3000_chip_info - model dependant parameters
189 * @name: model identification 189 * @name: model identification
190 * @scale: string containing floating point scale factor
190 * @temp_output: some devices have temperature sensors. 191 * @temp_output: some devices have temperature sensors.
191 * @measurement_mode_freq: normal mode sampling frequency 192 * @measurement_mode_freq: normal mode sampling frequency
192 * @option_mode_1: first optional mode. Not all models have one 193 * @option_mode_1: first optional mode. Not all models have one
@@ -199,6 +200,7 @@ struct sca3000_state {
199 **/ 200 **/
200struct sca3000_chip_info { 201struct sca3000_chip_info {
201 const char *name; 202 const char *name;
203 const char *scale;
202 bool temp_output; 204 bool temp_output;
203 int measurement_mode_freq; 205 int measurement_mode_freq;
204 int option_mode_1; 206 int option_mode_1;
diff --git a/drivers/staging/iio/accel/sca3000_core.c b/drivers/staging/iio/accel/sca3000_core.c
index 1c229869a22..45e47776d91 100644
--- a/drivers/staging/iio/accel/sca3000_core.c
+++ b/drivers/staging/iio/accel/sca3000_core.c
@@ -27,11 +27,9 @@
27 27
28enum sca3000_variant { 28enum sca3000_variant {
29 d01, 29 d01,
30 d03,
31 e02, 30 e02,
32 e04, 31 e04,
33 e05, 32 e05,
34 l01,
35}; 33};
36 34
37/* Note where option modes are not defined, the chip simply does not 35/* Note where option modes are not defined, the chip simply does not
@@ -44,21 +42,20 @@ enum sca3000_variant {
44static const struct sca3000_chip_info sca3000_spi_chip_info_tbl[] = { 42static const struct sca3000_chip_info sca3000_spi_chip_info_tbl[] = {
45 { 43 {
46 .name = "sca3000-d01", 44 .name = "sca3000-d01",
45 .scale = " 0.0073575",
47 .temp_output = true, 46 .temp_output = true,
48 .measurement_mode_freq = 250, 47 .measurement_mode_freq = 250,
49 .option_mode_1 = SCA3000_OP_MODE_BYPASS, 48 .option_mode_1 = SCA3000_OP_MODE_BYPASS,
50 .option_mode_1_freq = 250, 49 .option_mode_1_freq = 250,
51 }, { 50 }, {
52 /* No data sheet available - may be the same as the 3100-d03?*/
53 .name = "sca3000-d03",
54 .temp_output = true,
55 }, {
56 .name = "sca3000-e02", 51 .name = "sca3000-e02",
52 .scale = "0.00981",
57 .measurement_mode_freq = 125, 53 .measurement_mode_freq = 125,
58 .option_mode_1 = SCA3000_OP_MODE_NARROW, 54 .option_mode_1 = SCA3000_OP_MODE_NARROW,
59 .option_mode_1_freq = 63, 55 .option_mode_1_freq = 63,
60 }, { 56 }, {
61 .name = "sca3000-e04", 57 .name = "sca3000-e04",
58 .scale = "0.01962",
62 .measurement_mode_freq = 100, 59 .measurement_mode_freq = 100,
63 .option_mode_1 = SCA3000_OP_MODE_NARROW, 60 .option_mode_1 = SCA3000_OP_MODE_NARROW,
64 .option_mode_1_freq = 50, 61 .option_mode_1_freq = 50,
@@ -66,18 +63,12 @@ static const struct sca3000_chip_info sca3000_spi_chip_info_tbl[] = {
66 .option_mode_2_freq = 400, 63 .option_mode_2_freq = 400,
67 }, { 64 }, {
68 .name = "sca3000-e05", 65 .name = "sca3000-e05",
66 .scale = "0.0613125",
69 .measurement_mode_freq = 200, 67 .measurement_mode_freq = 200,
70 .option_mode_1 = SCA3000_OP_MODE_NARROW, 68 .option_mode_1 = SCA3000_OP_MODE_NARROW,
71 .option_mode_1_freq = 50, 69 .option_mode_1_freq = 50,
72 .option_mode_2 = SCA3000_OP_MODE_WIDE, 70 .option_mode_2 = SCA3000_OP_MODE_WIDE,
73 .option_mode_2_freq = 400, 71 .option_mode_2_freq = 400,
74 }, {
75 /* No data sheet available.
76 * Frequencies are unknown.
77 */
78 .name = "sca3000-l01",
79 .temp_output = true,
80 .option_mode_1 = SCA3000_OP_MODE_BYPASS,
81 }, 72 },
82}; 73};
83 74
@@ -327,6 +318,14 @@ error_ret:
327 return ret ? ret : len; 318 return ret ? ret : len;
328} 319}
329 320
321static ssize_t sca3000_show_scale(struct device *dev,
322 struct device_attribute *attr,
323 char *buf)
324{
325 struct iio_dev *dev_info = dev_get_drvdata(dev);
326 struct sca3000_state *st = dev_info->dev_data;
327 return sprintf(buf, "%s\n", st->info->scale);
328}
330 329
331static ssize_t sca3000_show_name(struct device *dev, 330static ssize_t sca3000_show_name(struct device *dev,
332 struct device_attribute *attr, 331 struct device_attribute *attr,
@@ -495,7 +494,7 @@ error_ret:
495/* Not even vaguely standard attributes so defined here rather than 494/* Not even vaguely standard attributes so defined here rather than
496 * in the relevant IIO core headers 495 * in the relevant IIO core headers
497 */ 496 */
498static IIO_DEVICE_ATTR(available_measurement_modes, S_IRUGO, 497static IIO_DEVICE_ATTR(measurement_mode_available, S_IRUGO,
499 sca3000_show_available_measurement_modes, 498 sca3000_show_available_measurement_modes,
500 NULL, 0); 499 NULL, 0);
501 500
@@ -508,6 +507,8 @@ static IIO_DEVICE_ATTR(measurement_mode, S_IRUGO | S_IWUSR,
508 507
509static IIO_DEV_ATTR_NAME(sca3000_show_name); 508static IIO_DEV_ATTR_NAME(sca3000_show_name);
510static IIO_DEV_ATTR_REV(sca3000_show_rev); 509static IIO_DEV_ATTR_REV(sca3000_show_rev);
510static IIO_DEVICE_ATTR(accel_scale, S_IRUGO, sca3000_show_scale,
511 NULL, 0);
511 512
512static IIO_DEV_ATTR_ACCEL_X(sca3000_read_13bit_signed, 513static IIO_DEV_ATTR_ACCEL_X(sca3000_read_13bit_signed,
513 SCA3000_REG_ADDR_X_MSB); 514 SCA3000_REG_ADDR_X_MSB);
@@ -683,7 +684,7 @@ error_free_lock:
683/* Should only really be registered if ring buffer support is compiled in. 684/* Should only really be registered if ring buffer support is compiled in.
684 * Does no harm however and doing it right would add a fair bit of complexity 685 * Does no harm however and doing it right would add a fair bit of complexity
685 */ 686 */
686static IIO_DEV_ATTR_AVAIL_SAMP_FREQ(sca3000_read_av_freq); 687static IIO_DEV_ATTR_SAMP_FREQ_AVAIL(sca3000_read_av_freq);
687 688
688static IIO_DEV_ATTR_SAMP_FREQ(S_IWUSR | S_IRUGO, 689static IIO_DEV_ATTR_SAMP_FREQ(S_IWUSR | S_IRUGO,
689 sca3000_read_frequency, 690 sca3000_read_frequency,
@@ -718,7 +719,10 @@ static ssize_t sca3000_read_temp(struct device *dev,
718error_ret: 719error_ret:
719 return ret; 720 return ret;
720} 721}
721static IIO_DEV_ATTR_TEMP(sca3000_read_temp); 722static IIO_DEV_ATTR_TEMP_RAW(sca3000_read_temp);
723
724static IIO_CONST_ATTR(temp_scale, "0.555556");
725static IIO_CONST_ATTR(temp_offset, "-214.6");
722 726
723/** 727/**
724 * sca3000_show_thresh() sysfs query of a threshold 728 * sca3000_show_thresh() sysfs query of a threshold
@@ -770,31 +774,34 @@ static ssize_t sca3000_write_thresh(struct device *dev,
770 return ret ? ret : len; 774 return ret ? ret : len;
771} 775}
772 776
773static IIO_DEV_ATTR_ACCEL_THRESH_X(S_IRUGO | S_IWUSR, 777static IIO_DEVICE_ATTR(accel_x_mag_either_rising_value,
774 sca3000_show_thresh, 778 S_IRUGO | S_IWUSR,
775 sca3000_write_thresh, 779 sca3000_show_thresh,
776 SCA3000_REG_CTRL_SEL_MD_X_TH); 780 sca3000_write_thresh,
777static IIO_DEV_ATTR_ACCEL_THRESH_Y(S_IRUGO | S_IWUSR, 781 SCA3000_REG_CTRL_SEL_MD_X_TH);
778 sca3000_show_thresh, 782
779 sca3000_write_thresh, 783static IIO_DEVICE_ATTR(accel_y_mag_either_rising_value,
780 SCA3000_REG_CTRL_SEL_MD_Y_TH); 784 S_IRUGO | S_IWUSR,
781static IIO_DEV_ATTR_ACCEL_THRESH_Z(S_IRUGO | S_IWUSR, 785 sca3000_show_thresh,
782 sca3000_show_thresh, 786 sca3000_write_thresh,
783 sca3000_write_thresh, 787 SCA3000_REG_CTRL_SEL_MD_Y_TH);
784 SCA3000_REG_CTRL_SEL_MD_Z_TH); 788
789static IIO_DEVICE_ATTR(accel_z_mag_either_rising_value,
790 S_IRUGO | S_IWUSR,
791 sca3000_show_thresh,
792 sca3000_write_thresh,
793 SCA3000_REG_CTRL_SEL_MD_Z_TH);
785 794
786static struct attribute *sca3000_attributes[] = { 795static struct attribute *sca3000_attributes[] = {
787 &iio_dev_attr_name.dev_attr.attr, 796 &iio_dev_attr_name.dev_attr.attr,
788 &iio_dev_attr_revision.dev_attr.attr, 797 &iio_dev_attr_revision.dev_attr.attr,
789 &iio_dev_attr_accel_x.dev_attr.attr, 798 &iio_dev_attr_accel_scale.dev_attr.attr,
790 &iio_dev_attr_accel_y.dev_attr.attr, 799 &iio_dev_attr_accel_x_raw.dev_attr.attr,
791 &iio_dev_attr_accel_z.dev_attr.attr, 800 &iio_dev_attr_accel_y_raw.dev_attr.attr,
792 &iio_dev_attr_thresh_accel_x.dev_attr.attr, 801 &iio_dev_attr_accel_z_raw.dev_attr.attr,
793 &iio_dev_attr_thresh_accel_y.dev_attr.attr, 802 &iio_dev_attr_measurement_mode_available.dev_attr.attr,
794 &iio_dev_attr_thresh_accel_z.dev_attr.attr,
795 &iio_dev_attr_available_measurement_modes.dev_attr.attr,
796 &iio_dev_attr_measurement_mode.dev_attr.attr, 803 &iio_dev_attr_measurement_mode.dev_attr.attr,
797 &iio_dev_attr_available_sampling_frequency.dev_attr.attr, 804 &iio_dev_attr_sampling_frequency_available.dev_attr.attr,
798 &iio_dev_attr_sampling_frequency.dev_attr.attr, 805 &iio_dev_attr_sampling_frequency.dev_attr.attr,
799 NULL, 806 NULL,
800}; 807};
@@ -802,18 +809,18 @@ static struct attribute *sca3000_attributes[] = {
802static struct attribute *sca3000_attributes_with_temp[] = { 809static struct attribute *sca3000_attributes_with_temp[] = {
803 &iio_dev_attr_name.dev_attr.attr, 810 &iio_dev_attr_name.dev_attr.attr,
804 &iio_dev_attr_revision.dev_attr.attr, 811 &iio_dev_attr_revision.dev_attr.attr,
805 &iio_dev_attr_accel_x.dev_attr.attr, 812 &iio_dev_attr_accel_scale.dev_attr.attr,
806 &iio_dev_attr_accel_y.dev_attr.attr, 813 &iio_dev_attr_accel_x_raw.dev_attr.attr,
807 &iio_dev_attr_accel_z.dev_attr.attr, 814 &iio_dev_attr_accel_y_raw.dev_attr.attr,
808 &iio_dev_attr_thresh_accel_x.dev_attr.attr, 815 &iio_dev_attr_accel_z_raw.dev_attr.attr,
809 &iio_dev_attr_thresh_accel_y.dev_attr.attr, 816 &iio_dev_attr_measurement_mode_available.dev_attr.attr,
810 &iio_dev_attr_thresh_accel_z.dev_attr.attr,
811 &iio_dev_attr_available_measurement_modes.dev_attr.attr,
812 &iio_dev_attr_measurement_mode.dev_attr.attr, 817 &iio_dev_attr_measurement_mode.dev_attr.attr,
813 &iio_dev_attr_available_sampling_frequency.dev_attr.attr, 818 &iio_dev_attr_sampling_frequency_available.dev_attr.attr,
814 &iio_dev_attr_sampling_frequency.dev_attr.attr, 819 &iio_dev_attr_sampling_frequency.dev_attr.attr,
815 /* Only present if temp sensor is */ 820 /* Only present if temp sensor is */
816 &iio_dev_attr_temp.dev_attr.attr, 821 &iio_dev_attr_temp_raw.dev_attr.attr,
822 &iio_const_attr_temp_offset.dev_attr.attr,
823 &iio_const_attr_temp_scale.dev_attr.attr,
817 NULL, 824 NULL,
818}; 825};
819 826
@@ -910,7 +917,7 @@ static ssize_t sca3000_query_mo_det(struct device *dev,
910 struct device_attribute *attr, 917 struct device_attribute *attr,
911 char *buf) 918 char *buf)
912{ 919{
913 struct iio_dev *indio_dev = dev_get_drvdata(dev); 920 struct iio_dev *indio_dev = dev_get_drvdata(dev->parent);
914 struct sca3000_state *st = indio_dev->dev_data; 921 struct sca3000_state *st = indio_dev->dev_data;
915 struct iio_event_attr *this_attr = to_iio_event_attr(attr); 922 struct iio_event_attr *this_attr = to_iio_event_attr(attr);
916 int ret, len = 0; 923 int ret, len = 0;
@@ -975,7 +982,7 @@ static ssize_t sca3000_query_ring_int(struct device *dev,
975 struct iio_event_attr *this_attr = to_iio_event_attr(attr); 982 struct iio_event_attr *this_attr = to_iio_event_attr(attr);
976 int ret, len; 983 int ret, len;
977 u8 *rx; 984 u8 *rx;
978 struct iio_dev *indio_dev = dev_get_drvdata(dev); 985 struct iio_dev *indio_dev = dev_get_drvdata(dev->parent);
979 struct sca3000_state *st = indio_dev->dev_data; 986 struct sca3000_state *st = indio_dev->dev_data;
980 mutex_lock(&st->lock); 987 mutex_lock(&st->lock);
981 ret = sca3000_read_data(st, SCA3000_REG_ADDR_INT_MASK, &rx, 1); 988 ret = sca3000_read_data(st, SCA3000_REG_ADDR_INT_MASK, &rx, 1);
@@ -995,7 +1002,7 @@ static ssize_t sca3000_set_ring_int(struct device *dev,
995 const char *buf, 1002 const char *buf,
996 size_t len) 1003 size_t len)
997{ 1004{
998 struct iio_dev *indio_dev = dev_get_drvdata(dev); 1005 struct iio_dev *indio_dev = dev_get_drvdata(dev->parent);
999 struct sca3000_state *st = indio_dev->dev_data; 1006 struct sca3000_state *st = indio_dev->dev_data;
1000 struct iio_event_attr *this_attr = to_iio_event_attr(attr); 1007 struct iio_event_attr *this_attr = to_iio_event_attr(attr);
1001 1008
@@ -1085,7 +1092,7 @@ static ssize_t sca3000_set_mo_det(struct device *dev,
1085 const char *buf, 1092 const char *buf,
1086 size_t len) 1093 size_t len)
1087{ 1094{
1088 struct iio_dev *indio_dev = dev_get_drvdata(dev); 1095 struct iio_dev *indio_dev = dev_get_drvdata(dev->parent);
1089 struct sca3000_state *st = indio_dev->dev_data; 1096 struct sca3000_state *st = indio_dev->dev_data;
1090 struct iio_event_attr *this_attr = to_iio_event_attr(attr); 1097 struct iio_event_attr *this_attr = to_iio_event_attr(attr);
1091 long val; 1098 long val;
@@ -1155,20 +1162,23 @@ IIO_EVENT_ATTR_FREE_FALL_DETECT_SH(iio_event_all,
1155 0) 1162 0)
1156 1163
1157/* Motion detector related event attributes */ 1164/* Motion detector related event attributes */
1158IIO_EVENT_ATTR_ACCEL_X_HIGH_SH(iio_event_all, 1165IIO_EVENT_ATTR_SH(accel_x_mag_either_rising_en,
1159 sca3000_query_mo_det, 1166 iio_event_all,
1160 sca3000_set_mo_det, 1167 sca3000_query_mo_det,
1161 SCA3000_MD_CTRL_OR_X); 1168 sca3000_set_mo_det,
1162 1169 SCA3000_MD_CTRL_OR_X);
1163IIO_EVENT_ATTR_ACCEL_Y_HIGH_SH(iio_event_all, 1170
1164 sca3000_query_mo_det, 1171IIO_EVENT_ATTR_SH(accel_y_mag_either_rising_en,
1165 sca3000_set_mo_det, 1172 iio_event_all,
1166 SCA3000_MD_CTRL_OR_Y); 1173 sca3000_query_mo_det,
1167 1174 sca3000_set_mo_det,
1168IIO_EVENT_ATTR_ACCEL_Z_HIGH_SH(iio_event_all, 1175 SCA3000_MD_CTRL_OR_Y);
1169 sca3000_query_mo_det, 1176
1170 sca3000_set_mo_det, 1177IIO_EVENT_ATTR_SH(accel_z_mag_either_rising_en,
1171 SCA3000_MD_CTRL_OR_Z); 1178 iio_event_all,
1179 sca3000_query_mo_det,
1180 sca3000_set_mo_det,
1181 SCA3000_MD_CTRL_OR_Z);
1172 1182
1173/* Hardware ring buffer related event attributes */ 1183/* Hardware ring buffer related event attributes */
1174IIO_EVENT_ATTR_RING_50_FULL_SH(iio_event_all, 1184IIO_EVENT_ATTR_RING_50_FULL_SH(iio_event_all,
@@ -1183,11 +1193,14 @@ IIO_EVENT_ATTR_RING_75_FULL_SH(iio_event_all,
1183 1193
1184static struct attribute *sca3000_event_attributes[] = { 1194static struct attribute *sca3000_event_attributes[] = {
1185 &iio_event_attr_free_fall.dev_attr.attr, 1195 &iio_event_attr_free_fall.dev_attr.attr,
1186 &iio_event_attr_accel_x_high.dev_attr.attr, 1196 &iio_event_attr_accel_x_mag_either_rising_en.dev_attr.attr,
1187 &iio_event_attr_accel_y_high.dev_attr.attr, 1197 &iio_event_attr_accel_y_mag_either_rising_en.dev_attr.attr,
1188 &iio_event_attr_accel_z_high.dev_attr.attr, 1198 &iio_event_attr_accel_z_mag_either_rising_en.dev_attr.attr,
1189 &iio_event_attr_ring_50_full.dev_attr.attr, 1199 &iio_event_attr_ring_50_full.dev_attr.attr,
1190 &iio_event_attr_ring_75_full.dev_attr.attr, 1200 &iio_event_attr_ring_75_full.dev_attr.attr,
1201 &iio_dev_attr_accel_x_mag_either_rising_value.dev_attr.attr,
1202 &iio_dev_attr_accel_y_mag_either_rising_value.dev_attr.attr,
1203 &iio_dev_attr_accel_z_mag_either_rising_value.dev_attr.attr,
1191 NULL, 1204 NULL,
1192}; 1205};
1193 1206
@@ -1344,9 +1357,10 @@ static int __devinit __sca3000_probe(struct spi_device *spi,
1344 * is overkill. At very least a simpler registration method 1357 * is overkill. At very least a simpler registration method
1345 * might be worthwhile. 1358 * might be worthwhile.
1346 */ 1359 */
1347 iio_add_event_to_list(iio_event_attr_accel_z_high.listel, 1360 iio_add_event_to_list(
1348 &st->indio_dev 1361 iio_event_attr_accel_z_mag_either_rising_en.listel,
1349 ->interrupts[0]->ev_list); 1362 &st->indio_dev
1363 ->interrupts[0]->ev_list);
1350 } 1364 }
1351 sca3000_register_ring_funcs(st->indio_dev); 1365 sca3000_register_ring_funcs(st->indio_dev);
1352 ret = sca3000_clean_setup(st); 1366 ret = sca3000_clean_setup(st);
@@ -1437,9 +1451,6 @@ static int sca3000_remove(struct spi_device *spi)
1437SCA3000_VARIANT_PROBE(d01); 1451SCA3000_VARIANT_PROBE(d01);
1438static SCA3000_VARIANT_SPI_DRIVER(d01); 1452static SCA3000_VARIANT_SPI_DRIVER(d01);
1439 1453
1440SCA3000_VARIANT_PROBE(d03);
1441static SCA3000_VARIANT_SPI_DRIVER(d03);
1442
1443SCA3000_VARIANT_PROBE(e02); 1454SCA3000_VARIANT_PROBE(e02);
1444static SCA3000_VARIANT_SPI_DRIVER(e02); 1455static SCA3000_VARIANT_SPI_DRIVER(e02);
1445 1456
@@ -1449,9 +1460,6 @@ static SCA3000_VARIANT_SPI_DRIVER(e04);
1449SCA3000_VARIANT_PROBE(e05); 1460SCA3000_VARIANT_PROBE(e05);
1450static SCA3000_VARIANT_SPI_DRIVER(e05); 1461static SCA3000_VARIANT_SPI_DRIVER(e05);
1451 1462
1452SCA3000_VARIANT_PROBE(l01);
1453static SCA3000_VARIANT_SPI_DRIVER(l01);
1454
1455static __init int sca3000_init(void) 1463static __init int sca3000_init(void)
1456{ 1464{
1457 int ret; 1465 int ret;
@@ -1459,32 +1467,22 @@ static __init int sca3000_init(void)
1459 ret = spi_register_driver(&sca3000_d01_driver); 1467 ret = spi_register_driver(&sca3000_d01_driver);
1460 if (ret) 1468 if (ret)
1461 goto error_ret; 1469 goto error_ret;
1462 ret = spi_register_driver(&sca3000_d03_driver);
1463 if (ret)
1464 goto error_unreg_d01;
1465 ret = spi_register_driver(&sca3000_e02_driver); 1470 ret = spi_register_driver(&sca3000_e02_driver);
1466 if (ret) 1471 if (ret)
1467 goto error_unreg_d03; 1472 goto error_unreg_d01;
1468 ret = spi_register_driver(&sca3000_e04_driver); 1473 ret = spi_register_driver(&sca3000_e04_driver);
1469 if (ret) 1474 if (ret)
1470 goto error_unreg_e02; 1475 goto error_unreg_e02;
1471 ret = spi_register_driver(&sca3000_e05_driver); 1476 ret = spi_register_driver(&sca3000_e05_driver);
1472 if (ret) 1477 if (ret)
1473 goto error_unreg_e04; 1478 goto error_unreg_e04;
1474 ret = spi_register_driver(&sca3000_l01_driver);
1475 if (ret)
1476 goto error_unreg_e05;
1477 1479
1478 return 0; 1480 return 0;
1479 1481
1480error_unreg_e05:
1481 spi_unregister_driver(&sca3000_e05_driver);
1482error_unreg_e04: 1482error_unreg_e04:
1483 spi_unregister_driver(&sca3000_e04_driver); 1483 spi_unregister_driver(&sca3000_e04_driver);
1484error_unreg_e02: 1484error_unreg_e02:
1485 spi_unregister_driver(&sca3000_e02_driver); 1485 spi_unregister_driver(&sca3000_e02_driver);
1486error_unreg_d03:
1487 spi_unregister_driver(&sca3000_d03_driver);
1488error_unreg_d01: 1486error_unreg_d01:
1489 spi_unregister_driver(&sca3000_d01_driver); 1487 spi_unregister_driver(&sca3000_d01_driver);
1490error_ret: 1488error_ret:
@@ -1494,11 +1492,9 @@ error_ret:
1494 1492
1495static __exit void sca3000_exit(void) 1493static __exit void sca3000_exit(void)
1496{ 1494{
1497 spi_unregister_driver(&sca3000_l01_driver);
1498 spi_unregister_driver(&sca3000_e05_driver); 1495 spi_unregister_driver(&sca3000_e05_driver);
1499 spi_unregister_driver(&sca3000_e04_driver); 1496 spi_unregister_driver(&sca3000_e04_driver);
1500 spi_unregister_driver(&sca3000_e02_driver); 1497 spi_unregister_driver(&sca3000_e02_driver);
1501 spi_unregister_driver(&sca3000_d03_driver);
1502 spi_unregister_driver(&sca3000_d01_driver); 1498 spi_unregister_driver(&sca3000_d01_driver);
1503} 1499}
1504 1500
diff --git a/drivers/staging/iio/accel/sca3000_ring.c b/drivers/staging/iio/accel/sca3000_ring.c
index 40cbab2a659..2b39e6f6c26 100644
--- a/drivers/staging/iio/accel/sca3000_ring.c
+++ b/drivers/staging/iio/accel/sca3000_ring.c
@@ -186,11 +186,29 @@ static ssize_t sca3000_store_ring_bpse(struct device *dev,
186 return ret ? ret : len; 186 return ret ? ret : len;
187} 187}
188 188
189static IIO_CONST_ATTR(bpse_available, "8 11"); 189static IIO_SCAN_EL_C(accel_x, 0, 0, 0, 0);
190static IIO_SCAN_EL_C(accel_y, 1, 0, 0, 0);
191static IIO_SCAN_EL_C(accel_z, 2, 0, 0, 0);
192static IIO_CONST_ATTR(accel_precision_available, "8 11");
193static IIO_DEVICE_ATTR(accel_precision,
194 S_IRUGO | S_IWUSR,
195 sca3000_show_ring_bpse,
196 sca3000_store_ring_bpse,
197 0);
198
199static struct attribute *sca3000_scan_el_attrs[] = {
200 &iio_scan_el_accel_x.dev_attr.attr,
201 &iio_scan_el_accel_y.dev_attr.attr,
202 &iio_scan_el_accel_z.dev_attr.attr,
203 &iio_const_attr_accel_precision_available.dev_attr.attr,
204 &iio_dev_attr_accel_precision.dev_attr.attr,
205 NULL
206};
190 207
191static IIO_DEV_ATTR_BPSE(S_IRUGO | S_IWUSR, 208static struct attribute_group sca3000_scan_el_group = {
192 sca3000_show_ring_bpse, 209 .attrs = sca3000_scan_el_attrs,
193 sca3000_store_ring_bpse); 210 .name = "scan_elements",
211};
194 212
195/* 213/*
196 * Ring buffer attributes 214 * Ring buffer attributes
@@ -198,17 +216,15 @@ static IIO_DEV_ATTR_BPSE(S_IRUGO | S_IWUSR,
198 * only apply to the ring buffer. At all times full rate and accuracy 216 * only apply to the ring buffer. At all times full rate and accuracy
199 * is available via direct reading from registers. 217 * is available via direct reading from registers.
200 */ 218 */
201static struct attribute *iio_ring_attributes[] = { 219static struct attribute *sca3000_ring_attributes[] = {
202 &dev_attr_length.attr, 220 &dev_attr_length.attr,
203 &dev_attr_bps.attr, 221 &dev_attr_bps.attr,
204 &dev_attr_ring_enable.attr, 222 &dev_attr_ring_enable.attr,
205 &iio_dev_attr_bpse.dev_attr.attr,
206 &iio_const_attr_bpse_available.dev_attr.attr,
207 NULL, 223 NULL,
208}; 224};
209 225
210static struct attribute_group sca3000_ring_attr = { 226static struct attribute_group sca3000_ring_attr = {
211 .attrs = iio_ring_attributes, 227 .attrs = sca3000_ring_attributes,
212}; 228};
213 229
214static const struct attribute_group *sca3000_ring_attr_groups[] = { 230static const struct attribute_group *sca3000_ring_attr_groups[] = {
@@ -248,6 +264,7 @@ static inline void sca3000_rb_free(struct iio_ring_buffer *r)
248 264
249int sca3000_configure_ring(struct iio_dev *indio_dev) 265int sca3000_configure_ring(struct iio_dev *indio_dev)
250{ 266{
267 indio_dev->scan_el_attrs = &sca3000_scan_el_group;
251 indio_dev->ring = sca3000_rb_allocate(indio_dev); 268 indio_dev->ring = sca3000_rb_allocate(indio_dev);
252 if (indio_dev->ring == NULL) 269 if (indio_dev->ring == NULL)
253 return -ENOMEM; 270 return -ENOMEM;
diff --git a/drivers/staging/iio/ring_generic.h b/drivers/staging/iio/ring_generic.h
index 75e0fc078d6..c482074dead 100644
--- a/drivers/staging/iio/ring_generic.h
+++ b/drivers/staging/iio/ring_generic.h
@@ -248,9 +248,9 @@ ssize_t iio_scan_el_ts_show(struct device *dev, struct device_attribute *attr,
248 * 248 *
249 * Odd one out. Handled slightly differently from other scan elements. 249 * Odd one out. Handled slightly differently from other scan elements.
250 **/ 250 **/
251#define IIO_SCAN_EL_TIMESTAMP \ 251#define IIO_SCAN_EL_TIMESTAMP(number) \
252 struct iio_scan_el iio_scan_el_timestamp = { \ 252 struct iio_scan_el iio_scan_el_timestamp = { \
253 .dev_attr = __ATTR(scan_en_timestamp, \ 253 .dev_attr = __ATTR(number##_timestamp_en, \
254 S_IRUGO | S_IWUSR, \ 254 S_IRUGO | S_IWUSR, \
255 iio_scan_el_ts_show, \ 255 iio_scan_el_ts_show, \
256 iio_scan_el_ts_store), \ 256 iio_scan_el_ts_store), \