diff options
author | Jonathan Cameron <jic23@cam.ac.uk> | 2010-05-04 09:42:58 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2010-05-11 14:36:05 -0400 |
commit | f3fb001191a38a81bbc3cb363af2c279609ecc7c (patch) | |
tree | d2d17c61c682131e2c02deb536db2f35afa0169f | |
parent | ff7723e203349c18d7149e7cf2a4ae928bb9da69 (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.h | 8 | ||||
-rw-r--r-- | drivers/staging/iio/accel/kxsd9.c | 88 | ||||
-rw-r--r-- | drivers/staging/iio/accel/lis3l02dq.h | 4 | ||||
-rw-r--r-- | drivers/staging/iio/accel/lis3l02dq_core.c | 175 | ||||
-rw-r--r-- | drivers/staging/iio/accel/lis3l02dq_ring.c | 8 | ||||
-rw-r--r-- | drivers/staging/iio/accel/sca3000.h | 2 | ||||
-rw-r--r-- | drivers/staging/iio/accel/sca3000_core.c | 172 | ||||
-rw-r--r-- | drivers/staging/iio/accel/sca3000_ring.c | 33 | ||||
-rw-r--r-- | drivers/staging/iio/ring_generic.h | 4 |
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 */ |
76 | static ssize_t kxsd9_read_accel_range(struct device *dev, | 79 | static 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 | } |
122 | static ssize_t kxsd9_write_accel_range(struct device *dev, | 125 | static 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 | |||
185 | static ssize_t kxsd9_read_accel(struct device *dev, | 189 | static 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: | |||
227 | static IIO_DEV_ATTR_ACCEL_X(kxsd9_read_accel, KXSD9_REG_X); | 231 | static IIO_DEV_ATTR_ACCEL_X(kxsd9_read_accel, KXSD9_REG_X); |
228 | static IIO_DEV_ATTR_ACCEL_Y(kxsd9_read_accel, KXSD9_REG_Y); | 232 | static IIO_DEV_ATTR_ACCEL_Y(kxsd9_read_accel, KXSD9_REG_Y); |
229 | static IIO_DEV_ATTR_ACCEL_Z(kxsd9_read_accel, KXSD9_REG_Z); | 233 | static IIO_DEV_ATTR_ACCEL_Z(kxsd9_read_accel, KXSD9_REG_Z); |
230 | static IIO_DEV_ATTR_ADC(0, kxsd9_read_accel, KXSD9_REG_AUX); | 234 | static IIO_DEV_ATTR_IN_RAW(0, kxsd9_read_accel, KXSD9_REG_AUX); |
231 | static IIO_DEV_ATTR_ACCEL_SET_RANGE(S_IRUGO | S_IWUSR, | 235 | |
232 | kxsd9_read_accel_range, | 236 | static 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 | |||
242 | static IIO_CONST_ATTR(accel_scale_available, | ||
243 | KXSD9_SCALE_2G " " | ||
244 | KXSD9_SCALE_4G " " | ||
245 | KXSD9_SCALE_6G " " | ||
246 | KXSD9_SCALE_8G); | ||
234 | 247 | ||
235 | static struct attribute *kxsd9_attributes[] = { | 248 | static 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, | |||
179 | int lis3l02dq_spi_write_reg_8(struct device *dev, | 179 | int 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 | ||
461 | static 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, \ | |
466 | static 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, \ | |
471 | static 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 | 475 | static LIS3L02DQ_SIGNED_ATTR(accel_x_calibbias, | |
476 | static IIO_DEV_ATTR_ACCEL_X_GAIN(S_IWUSR | S_IRUGO, | 476 | LIS3L02DQ_REG_OFFSET_X_ADDR); |
477 | lis3l02dq_read_unsigned, | 477 | static LIS3L02DQ_SIGNED_ATTR(accel_y_calibbias, |
478 | lis3l02dq_write_unsigned, | 478 | LIS3L02DQ_REG_OFFSET_Y_ADDR); |
479 | LIS3L02DQ_REG_GAIN_X_ADDR); | 479 | static LIS3L02DQ_SIGNED_ATTR(accel_z_calibbias, |
480 | 480 | LIS3L02DQ_REG_OFFSET_Z_ADDR); | |
481 | static IIO_DEV_ATTR_ACCEL_Y_GAIN(S_IWUSR | S_IRUGO, | 481 | |
482 | lis3l02dq_read_unsigned, | 482 | static LIS3L02DQ_UNSIGNED_ATTR(accel_x_calibscale, |
483 | lis3l02dq_write_unsigned, | 483 | LIS3L02DQ_REG_GAIN_X_ADDR); |
484 | LIS3L02DQ_REG_GAIN_Y_ADDR); | 484 | static LIS3L02DQ_UNSIGNED_ATTR(accel_y_calibscale, |
485 | 485 | LIS3L02DQ_REG_GAIN_Y_ADDR); | |
486 | static IIO_DEV_ATTR_ACCEL_Z_GAIN(S_IWUSR | S_IRUGO, | 486 | static 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); | 489 | static IIO_DEVICE_ATTR(accel_mag_either_rising_value, |
490 | 490 | S_IWUSR | S_IRUGO, | |
491 | static 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 | ||
515 | static IIO_CONST_ATTR_AVAIL_SAMP_FREQ("280 560 1120 4480"); | 513 | static IIO_CONST_ATTR_SAMP_FREQ_AVAIL("280 560 1120 4480"); |
516 | 514 | ||
517 | static ssize_t lis3l02dq_read_interrupt_config(struct device *dev, | 515 | static 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, | |||
618 | static void lis3l02dq_thresh_handler_bh_no_check(struct work_struct *work_s) | 616 | static 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 */ |
669 | IIO_EVENT_SH(threshold, &lis3l02dq_thresh_handler_th); | 667 | IIO_EVENT_SH(threshold, &lis3l02dq_thresh_handler_th); |
670 | 668 | ||
671 | IIO_EVENT_ATTR_ACCEL_X_HIGH_SH(iio_event_threshold, | 669 | IIO_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); | |
676 | IIO_EVENT_ATTR_ACCEL_Y_HIGH_SH(iio_event_threshold, | 674 | |
677 | lis3l02dq_read_interrupt_config, | 675 | IIO_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, | |
681 | IIO_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, | 681 | IIO_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, | |
686 | IIO_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); | 687 | IIO_EVENT_ATTR_SH(accel_x_mag_neg_rising_en, |
690 | 688 | iio_event_threshold, | |
691 | IIO_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 | |
693 | IIO_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 | |||
699 | IIO_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 | ||
696 | IIO_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 | ||
701 | static struct attribute *lis3l02dq_event_attributes[] = { | 706 | static 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 | ||
715 | static IIO_CONST_ATTR(name, "lis3l02dq"); | 721 | static IIO_CONST_ATTR(name, "lis3l02dq"); |
722 | static IIO_CONST_ATTR(accel_scale, "0.00958"); | ||
716 | 723 | ||
717 | static struct attribute *lis3l02dq_attributes[] = { | 724 | static 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 | } |
78 | static IIO_SCAN_EL_C(accel_x, LIS3L02DQ_SCAN_ACC_X, IIO_SIGNED(16), | 78 | static 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); |
81 | static IIO_SCAN_EL_C(accel_y, LIS3L02DQ_SCAN_ACC_Y, IIO_SIGNED(16), | 81 | static 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); |
84 | static IIO_SCAN_EL_C(accel_z, LIS3L02DQ_SCAN_ACC_Z, IIO_SIGNED(16), | 84 | static 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); |
87 | static IIO_SCAN_EL_TIMESTAMP; | 87 | static IIO_SCAN_EL_TIMESTAMP(3); |
88 | 88 | ||
89 | static struct attribute *lis3l02dq_scan_el_attrs[] = { | 89 | static 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 | **/ |
200 | struct sca3000_chip_info { | 201 | struct 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 | ||
28 | enum sca3000_variant { | 28 | enum 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 { | |||
44 | static const struct sca3000_chip_info sca3000_spi_chip_info_tbl[] = { | 42 | static 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 | ||
321 | static 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 | ||
331 | static ssize_t sca3000_show_name(struct device *dev, | 330 | static 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 | */ |
498 | static IIO_DEVICE_ATTR(available_measurement_modes, S_IRUGO, | 497 | static 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 | ||
509 | static IIO_DEV_ATTR_NAME(sca3000_show_name); | 508 | static IIO_DEV_ATTR_NAME(sca3000_show_name); |
510 | static IIO_DEV_ATTR_REV(sca3000_show_rev); | 509 | static IIO_DEV_ATTR_REV(sca3000_show_rev); |
510 | static IIO_DEVICE_ATTR(accel_scale, S_IRUGO, sca3000_show_scale, | ||
511 | NULL, 0); | ||
511 | 512 | ||
512 | static IIO_DEV_ATTR_ACCEL_X(sca3000_read_13bit_signed, | 513 | static 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 | */ |
686 | static IIO_DEV_ATTR_AVAIL_SAMP_FREQ(sca3000_read_av_freq); | 687 | static IIO_DEV_ATTR_SAMP_FREQ_AVAIL(sca3000_read_av_freq); |
687 | 688 | ||
688 | static IIO_DEV_ATTR_SAMP_FREQ(S_IWUSR | S_IRUGO, | 689 | static 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, | |||
718 | error_ret: | 719 | error_ret: |
719 | return ret; | 720 | return ret; |
720 | } | 721 | } |
721 | static IIO_DEV_ATTR_TEMP(sca3000_read_temp); | 722 | static IIO_DEV_ATTR_TEMP_RAW(sca3000_read_temp); |
723 | |||
724 | static IIO_CONST_ATTR(temp_scale, "0.555556"); | ||
725 | static 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 | ||
773 | static IIO_DEV_ATTR_ACCEL_THRESH_X(S_IRUGO | S_IWUSR, | 777 | static 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, |
777 | static 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, | 783 | static IIO_DEVICE_ATTR(accel_y_mag_either_rising_value, |
780 | SCA3000_REG_CTRL_SEL_MD_Y_TH); | 784 | S_IRUGO | S_IWUSR, |
781 | static 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 | |
789 | static 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 | ||
786 | static struct attribute *sca3000_attributes[] = { | 795 | static 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[] = { | |||
802 | static struct attribute *sca3000_attributes_with_temp[] = { | 809 | static 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 */ |
1158 | IIO_EVENT_ATTR_ACCEL_X_HIGH_SH(iio_event_all, | 1165 | IIO_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); | |
1163 | IIO_EVENT_ATTR_ACCEL_Y_HIGH_SH(iio_event_all, | 1170 | |
1164 | sca3000_query_mo_det, | 1171 | IIO_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, | |
1168 | IIO_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, | 1177 | IIO_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 */ |
1174 | IIO_EVENT_ATTR_RING_50_FULL_SH(iio_event_all, | 1184 | IIO_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 | ||
1184 | static struct attribute *sca3000_event_attributes[] = { | 1194 | static 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) | |||
1437 | SCA3000_VARIANT_PROBE(d01); | 1451 | SCA3000_VARIANT_PROBE(d01); |
1438 | static SCA3000_VARIANT_SPI_DRIVER(d01); | 1452 | static SCA3000_VARIANT_SPI_DRIVER(d01); |
1439 | 1453 | ||
1440 | SCA3000_VARIANT_PROBE(d03); | ||
1441 | static SCA3000_VARIANT_SPI_DRIVER(d03); | ||
1442 | |||
1443 | SCA3000_VARIANT_PROBE(e02); | 1454 | SCA3000_VARIANT_PROBE(e02); |
1444 | static SCA3000_VARIANT_SPI_DRIVER(e02); | 1455 | static SCA3000_VARIANT_SPI_DRIVER(e02); |
1445 | 1456 | ||
@@ -1449,9 +1460,6 @@ static SCA3000_VARIANT_SPI_DRIVER(e04); | |||
1449 | SCA3000_VARIANT_PROBE(e05); | 1460 | SCA3000_VARIANT_PROBE(e05); |
1450 | static SCA3000_VARIANT_SPI_DRIVER(e05); | 1461 | static SCA3000_VARIANT_SPI_DRIVER(e05); |
1451 | 1462 | ||
1452 | SCA3000_VARIANT_PROBE(l01); | ||
1453 | static SCA3000_VARIANT_SPI_DRIVER(l01); | ||
1454 | |||
1455 | static __init int sca3000_init(void) | 1463 | static __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 | ||
1480 | error_unreg_e05: | ||
1481 | spi_unregister_driver(&sca3000_e05_driver); | ||
1482 | error_unreg_e04: | 1482 | error_unreg_e04: |
1483 | spi_unregister_driver(&sca3000_e04_driver); | 1483 | spi_unregister_driver(&sca3000_e04_driver); |
1484 | error_unreg_e02: | 1484 | error_unreg_e02: |
1485 | spi_unregister_driver(&sca3000_e02_driver); | 1485 | spi_unregister_driver(&sca3000_e02_driver); |
1486 | error_unreg_d03: | ||
1487 | spi_unregister_driver(&sca3000_d03_driver); | ||
1488 | error_unreg_d01: | 1486 | error_unreg_d01: |
1489 | spi_unregister_driver(&sca3000_d01_driver); | 1487 | spi_unregister_driver(&sca3000_d01_driver); |
1490 | error_ret: | 1488 | error_ret: |
@@ -1494,11 +1492,9 @@ error_ret: | |||
1494 | 1492 | ||
1495 | static __exit void sca3000_exit(void) | 1493 | static __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 | ||
189 | static IIO_CONST_ATTR(bpse_available, "8 11"); | 189 | static IIO_SCAN_EL_C(accel_x, 0, 0, 0, 0); |
190 | static IIO_SCAN_EL_C(accel_y, 1, 0, 0, 0); | ||
191 | static IIO_SCAN_EL_C(accel_z, 2, 0, 0, 0); | ||
192 | static IIO_CONST_ATTR(accel_precision_available, "8 11"); | ||
193 | static IIO_DEVICE_ATTR(accel_precision, | ||
194 | S_IRUGO | S_IWUSR, | ||
195 | sca3000_show_ring_bpse, | ||
196 | sca3000_store_ring_bpse, | ||
197 | 0); | ||
198 | |||
199 | static 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 | ||
191 | static IIO_DEV_ATTR_BPSE(S_IRUGO | S_IWUSR, | 208 | static 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 | */ |
201 | static struct attribute *iio_ring_attributes[] = { | 219 | static 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 | ||
210 | static struct attribute_group sca3000_ring_attr = { | 226 | static struct attribute_group sca3000_ring_attr = { |
211 | .attrs = iio_ring_attributes, | 227 | .attrs = sca3000_ring_attributes, |
212 | }; | 228 | }; |
213 | 229 | ||
214 | static const struct attribute_group *sca3000_ring_attr_groups[] = { | 230 | static 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 | ||
249 | int sca3000_configure_ring(struct iio_dev *indio_dev) | 265 | int 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), \ |