diff options
Diffstat (limited to 'drivers')
41 files changed, 1304 insertions, 465 deletions
diff --git a/drivers/iio/accel/mma8452.c b/drivers/iio/accel/mma8452.c index 17aeea170566..9231f8a65e79 100644 --- a/drivers/iio/accel/mma8452.c +++ b/drivers/iio/accel/mma8452.c | |||
@@ -423,9 +423,15 @@ static const struct i2c_device_id mma8452_id[] = { | |||
423 | }; | 423 | }; |
424 | MODULE_DEVICE_TABLE(i2c, mma8452_id); | 424 | MODULE_DEVICE_TABLE(i2c, mma8452_id); |
425 | 425 | ||
426 | static const struct of_device_id mma8452_dt_ids[] = { | ||
427 | { .compatible = "fsl,mma8452" }, | ||
428 | { } | ||
429 | }; | ||
430 | |||
426 | static struct i2c_driver mma8452_driver = { | 431 | static struct i2c_driver mma8452_driver = { |
427 | .driver = { | 432 | .driver = { |
428 | .name = "mma8452", | 433 | .name = "mma8452", |
434 | .of_match_table = of_match_ptr(mma8452_dt_ids), | ||
429 | .pm = MMA8452_PM_OPS, | 435 | .pm = MMA8452_PM_OPS, |
430 | }, | 436 | }, |
431 | .probe = mma8452_probe, | 437 | .probe = mma8452_probe, |
diff --git a/drivers/iio/accel/st_accel_core.c b/drivers/iio/accel/st_accel_core.c index a2abf7c2ce3b..087864854c61 100644 --- a/drivers/iio/accel/st_accel_core.c +++ b/drivers/iio/accel/st_accel_core.c | |||
@@ -393,6 +393,9 @@ static int st_accel_read_raw(struct iio_dev *indio_dev, | |||
393 | *val = 0; | 393 | *val = 0; |
394 | *val2 = adata->current_fullscale->gain; | 394 | *val2 = adata->current_fullscale->gain; |
395 | return IIO_VAL_INT_PLUS_MICRO; | 395 | return IIO_VAL_INT_PLUS_MICRO; |
396 | case IIO_CHAN_INFO_SAMP_FREQ: | ||
397 | *val = adata->odr; | ||
398 | return IIO_VAL_INT; | ||
396 | default: | 399 | default: |
397 | return -EINVAL; | 400 | return -EINVAL; |
398 | } | 401 | } |
@@ -410,6 +413,13 @@ static int st_accel_write_raw(struct iio_dev *indio_dev, | |||
410 | case IIO_CHAN_INFO_SCALE: | 413 | case IIO_CHAN_INFO_SCALE: |
411 | err = st_sensors_set_fullscale_by_gain(indio_dev, val2); | 414 | err = st_sensors_set_fullscale_by_gain(indio_dev, val2); |
412 | break; | 415 | break; |
416 | case IIO_CHAN_INFO_SAMP_FREQ: | ||
417 | if (val2) | ||
418 | return -EINVAL; | ||
419 | mutex_lock(&indio_dev->mlock); | ||
420 | err = st_sensors_set_odr(indio_dev, val); | ||
421 | mutex_unlock(&indio_dev->mlock); | ||
422 | return err; | ||
413 | default: | 423 | default: |
414 | return -EINVAL; | 424 | return -EINVAL; |
415 | } | 425 | } |
@@ -417,14 +427,12 @@ static int st_accel_write_raw(struct iio_dev *indio_dev, | |||
417 | return err; | 427 | return err; |
418 | } | 428 | } |
419 | 429 | ||
420 | static ST_SENSOR_DEV_ATTR_SAMP_FREQ(); | ||
421 | static ST_SENSORS_DEV_ATTR_SAMP_FREQ_AVAIL(); | 430 | static ST_SENSORS_DEV_ATTR_SAMP_FREQ_AVAIL(); |
422 | static ST_SENSORS_DEV_ATTR_SCALE_AVAIL(in_accel_scale_available); | 431 | static ST_SENSORS_DEV_ATTR_SCALE_AVAIL(in_accel_scale_available); |
423 | 432 | ||
424 | static struct attribute *st_accel_attributes[] = { | 433 | static struct attribute *st_accel_attributes[] = { |
425 | &iio_dev_attr_sampling_frequency_available.dev_attr.attr, | 434 | &iio_dev_attr_sampling_frequency_available.dev_attr.attr, |
426 | &iio_dev_attr_in_accel_scale_available.dev_attr.attr, | 435 | &iio_dev_attr_in_accel_scale_available.dev_attr.attr, |
427 | &iio_dev_attr_sampling_frequency.dev_attr.attr, | ||
428 | NULL, | 436 | NULL, |
429 | }; | 437 | }; |
430 | 438 | ||
diff --git a/drivers/iio/accel/st_accel_i2c.c b/drivers/iio/accel/st_accel_i2c.c index d7bedbdfc81d..7164aeff3ab1 100644 --- a/drivers/iio/accel/st_accel_i2c.c +++ b/drivers/iio/accel/st_accel_i2c.c | |||
@@ -18,6 +18,55 @@ | |||
18 | #include <linux/iio/common/st_sensors_i2c.h> | 18 | #include <linux/iio/common/st_sensors_i2c.h> |
19 | #include "st_accel.h" | 19 | #include "st_accel.h" |
20 | 20 | ||
21 | #ifdef CONFIG_OF | ||
22 | static const struct of_device_id st_accel_of_match[] = { | ||
23 | { | ||
24 | .compatible = "st,lsm303dlh-accel", | ||
25 | .data = LSM303DLH_ACCEL_DEV_NAME, | ||
26 | }, | ||
27 | { | ||
28 | .compatible = "st,lsm303dlhc-accel", | ||
29 | .data = LSM303DLHC_ACCEL_DEV_NAME, | ||
30 | }, | ||
31 | { | ||
32 | .compatible = "st,lis3dh-accel", | ||
33 | .data = LIS3DH_ACCEL_DEV_NAME, | ||
34 | }, | ||
35 | { | ||
36 | .compatible = "st,lsm330d-accel", | ||
37 | .data = LSM330D_ACCEL_DEV_NAME, | ||
38 | }, | ||
39 | { | ||
40 | .compatible = "st,lsm330dl-accel", | ||
41 | .data = LSM330DL_ACCEL_DEV_NAME, | ||
42 | }, | ||
43 | { | ||
44 | .compatible = "st,lsm330dlc-accel", | ||
45 | .data = LSM330DLC_ACCEL_DEV_NAME, | ||
46 | }, | ||
47 | { | ||
48 | .compatible = "st,lis331dlh-accel", | ||
49 | .data = LIS331DLH_ACCEL_DEV_NAME, | ||
50 | }, | ||
51 | { | ||
52 | .compatible = "st,lsm303dl-accel", | ||
53 | .data = LSM303DL_ACCEL_DEV_NAME, | ||
54 | }, | ||
55 | { | ||
56 | .compatible = "st,lsm303dlm-accel", | ||
57 | .data = LSM303DLM_ACCEL_DEV_NAME, | ||
58 | }, | ||
59 | { | ||
60 | .compatible = "st,lsm330-accel", | ||
61 | .data = LSM330_ACCEL_DEV_NAME, | ||
62 | }, | ||
63 | {}, | ||
64 | }; | ||
65 | MODULE_DEVICE_TABLE(of, st_accel_of_match); | ||
66 | #else | ||
67 | #define st_accel_of_match NULL | ||
68 | #endif | ||
69 | |||
21 | static int st_accel_i2c_probe(struct i2c_client *client, | 70 | static int st_accel_i2c_probe(struct i2c_client *client, |
22 | const struct i2c_device_id *id) | 71 | const struct i2c_device_id *id) |
23 | { | 72 | { |
@@ -31,6 +80,7 @@ static int st_accel_i2c_probe(struct i2c_client *client, | |||
31 | 80 | ||
32 | adata = iio_priv(indio_dev); | 81 | adata = iio_priv(indio_dev); |
33 | adata->dev = &client->dev; | 82 | adata->dev = &client->dev; |
83 | st_sensors_of_i2c_probe(client, st_accel_of_match); | ||
34 | 84 | ||
35 | st_sensors_i2c_configure(indio_dev, client, adata); | 85 | st_sensors_i2c_configure(indio_dev, client, adata); |
36 | 86 | ||
@@ -67,6 +117,7 @@ static struct i2c_driver st_accel_driver = { | |||
67 | .driver = { | 117 | .driver = { |
68 | .owner = THIS_MODULE, | 118 | .owner = THIS_MODULE, |
69 | .name = "st-accel-i2c", | 119 | .name = "st-accel-i2c", |
120 | .of_match_table = of_match_ptr(st_accel_of_match), | ||
70 | }, | 121 | }, |
71 | .probe = st_accel_i2c_probe, | 122 | .probe = st_accel_i2c_probe, |
72 | .remove = st_accel_i2c_remove, | 123 | .remove = st_accel_i2c_remove, |
diff --git a/drivers/iio/adc/Kconfig b/drivers/iio/adc/Kconfig index 20a7073f1dd6..11b048a59fde 100644 --- a/drivers/iio/adc/Kconfig +++ b/drivers/iio/adc/Kconfig | |||
@@ -20,6 +20,16 @@ config AD7266 | |||
20 | Say yes here to build support for Analog Devices AD7265 and AD7266 | 20 | Say yes here to build support for Analog Devices AD7265 and AD7266 |
21 | ADCs. | 21 | ADCs. |
22 | 22 | ||
23 | config AD7291 | ||
24 | tristate "Analog Devices AD7291 ADC driver" | ||
25 | depends on I2C | ||
26 | help | ||
27 | Say yes here to build support for Analog Devices AD7291 | ||
28 | 8 Channel ADC with temperature sensor. | ||
29 | |||
30 | To compile this driver as a module, choose M here: the | ||
31 | module will be called ad7291. | ||
32 | |||
23 | config AD7298 | 33 | config AD7298 |
24 | tristate "Analog Devices AD7298 ADC driver" | 34 | tristate "Analog Devices AD7298 ADC driver" |
25 | depends on SPI | 35 | depends on SPI |
diff --git a/drivers/iio/adc/Makefile b/drivers/iio/adc/Makefile index 38cf5c3f5631..ad81b512aa3d 100644 --- a/drivers/iio/adc/Makefile +++ b/drivers/iio/adc/Makefile | |||
@@ -5,6 +5,7 @@ | |||
5 | # When adding new entries keep the list in alphabetical order | 5 | # When adding new entries keep the list in alphabetical order |
6 | obj-$(CONFIG_AD_SIGMA_DELTA) += ad_sigma_delta.o | 6 | obj-$(CONFIG_AD_SIGMA_DELTA) += ad_sigma_delta.o |
7 | obj-$(CONFIG_AD7266) += ad7266.o | 7 | obj-$(CONFIG_AD7266) += ad7266.o |
8 | obj-$(CONFIG_AD7291) += ad7291.o | ||
8 | obj-$(CONFIG_AD7298) += ad7298.o | 9 | obj-$(CONFIG_AD7298) += ad7298.o |
9 | obj-$(CONFIG_AD7923) += ad7923.o | 10 | obj-$(CONFIG_AD7923) += ad7923.o |
10 | obj-$(CONFIG_AD7476) += ad7476.o | 11 | obj-$(CONFIG_AD7476) += ad7476.o |
diff --git a/drivers/staging/iio/adc/ad7291.c b/drivers/iio/adc/ad7291.c index 7194bd138762..c0eabf156702 100644 --- a/drivers/staging/iio/adc/ad7291.c +++ b/drivers/iio/adc/ad7291.c | |||
@@ -6,22 +6,22 @@ | |||
6 | * Licensed under the GPL-2 or later. | 6 | * Licensed under the GPL-2 or later. |
7 | */ | 7 | */ |
8 | 8 | ||
9 | #include <linux/interrupt.h> | ||
10 | #include <linux/device.h> | 9 | #include <linux/device.h> |
11 | #include <linux/kernel.h> | 10 | #include <linux/err.h> |
12 | #include <linux/slab.h> | ||
13 | #include <linux/sysfs.h> | ||
14 | #include <linux/i2c.h> | 11 | #include <linux/i2c.h> |
12 | #include <linux/interrupt.h> | ||
13 | #include <linux/kernel.h> | ||
15 | #include <linux/module.h> | 14 | #include <linux/module.h> |
16 | #include <linux/mutex.h> | 15 | #include <linux/mutex.h> |
17 | #include <linux/regulator/consumer.h> | 16 | #include <linux/regulator/consumer.h> |
18 | #include <linux/err.h> | 17 | #include <linux/slab.h> |
18 | #include <linux/sysfs.h> | ||
19 | 19 | ||
20 | #include <linux/iio/iio.h> | 20 | #include <linux/iio/iio.h> |
21 | #include <linux/iio/sysfs.h> | 21 | #include <linux/iio/sysfs.h> |
22 | #include <linux/iio/events.h> | 22 | #include <linux/iio/events.h> |
23 | 23 | ||
24 | #include "ad7291.h" | 24 | #include <linux/platform_data/ad7291.h> |
25 | 25 | ||
26 | /* | 26 | /* |
27 | * Simplified handling | 27 | * Simplified handling |
@@ -31,7 +31,6 @@ | |||
31 | * is in the read mask. | 31 | * is in the read mask. |
32 | * | 32 | * |
33 | * The noise-delayed bit as per datasheet suggestion is always enabled. | 33 | * The noise-delayed bit as per datasheet suggestion is always enabled. |
34 | * | ||
35 | */ | 34 | */ |
36 | 35 | ||
37 | /* | 36 | /* |
@@ -47,33 +46,38 @@ | |||
47 | #define AD7291_VOLTAGE_ALERT_STATUS 0x1F | 46 | #define AD7291_VOLTAGE_ALERT_STATUS 0x1F |
48 | #define AD7291_T_ALERT_STATUS 0x20 | 47 | #define AD7291_T_ALERT_STATUS 0x20 |
49 | 48 | ||
49 | #define AD7291_BITS 12 | ||
50 | #define AD7291_VOLTAGE_LIMIT_COUNT 8 | 50 | #define AD7291_VOLTAGE_LIMIT_COUNT 8 |
51 | 51 | ||
52 | 52 | ||
53 | /* | 53 | /* |
54 | * AD7291 command | 54 | * AD7291 command |
55 | */ | 55 | */ |
56 | #define AD7291_AUTOCYCLE (1 << 0) | 56 | #define AD7291_AUTOCYCLE BIT(0) |
57 | #define AD7291_RESET (1 << 1) | 57 | #define AD7291_RESET BIT(1) |
58 | #define AD7291_ALERT_CLEAR (1 << 2) | 58 | #define AD7291_ALERT_CLEAR BIT(2) |
59 | #define AD7291_ALERT_POLARITY (1 << 3) | 59 | #define AD7291_ALERT_POLARITY BIT(3) |
60 | #define AD7291_EXT_REF (1 << 4) | 60 | #define AD7291_EXT_REF BIT(4) |
61 | #define AD7291_NOISE_DELAY (1 << 5) | 61 | #define AD7291_NOISE_DELAY BIT(5) |
62 | #define AD7291_T_SENSE_MASK (1 << 7) | 62 | #define AD7291_T_SENSE_MASK BIT(7) |
63 | #define AD7291_VOLTAGE_MASK 0xFF00 | 63 | #define AD7291_VOLTAGE_MASK GENMASK(15, 8) |
64 | #define AD7291_VOLTAGE_OFFSET 0x8 | 64 | #define AD7291_VOLTAGE_OFFSET 8 |
65 | 65 | ||
66 | /* | 66 | /* |
67 | * AD7291 value masks | 67 | * AD7291 value masks |
68 | */ | 68 | */ |
69 | #define AD7291_CHANNEL_MASK 0xF000 | 69 | #define AD7291_VALUE_MASK GENMASK(11, 0) |
70 | #define AD7291_BITS 12 | 70 | |
71 | #define AD7291_VALUE_MASK 0xFFF | 71 | /* |
72 | #define AD7291_T_VALUE_SIGN 0x400 | 72 | * AD7291 alert register bits |
73 | #define AD7291_T_VALUE_FLOAT_OFFSET 2 | 73 | */ |
74 | #define AD7291_T_VALUE_FLOAT_MASK 0x2 | 74 | #define AD7291_T_LOW BIT(0) |
75 | #define AD7291_T_HIGH BIT(1) | ||
76 | #define AD7291_T_AVG_LOW BIT(2) | ||
77 | #define AD7291_T_AVG_HIGH BIT(3) | ||
78 | #define AD7291_V_LOW(x) BIT((x) * 2) | ||
79 | #define AD7291_V_HIGH(x) BIT((x) * 2 + 1) | ||
75 | 80 | ||
76 | #define AD7291_BITS 12 | ||
77 | 81 | ||
78 | struct ad7291_chip_info { | 82 | struct ad7291_chip_info { |
79 | struct i2c_client *client; | 83 | struct i2c_client *client; |
@@ -129,14 +133,14 @@ static irqreturn_t ad7291_event_handler(int irq, void *private) | |||
129 | ad7291_i2c_write(chip, AD7291_COMMAND, command); | 133 | ad7291_i2c_write(chip, AD7291_COMMAND, command); |
130 | 134 | ||
131 | /* For now treat t_sense and t_sense_average the same */ | 135 | /* For now treat t_sense and t_sense_average the same */ |
132 | if ((t_status & (1 << 0)) || (t_status & (1 << 2))) | 136 | if ((t_status & AD7291_T_LOW) || (t_status & AD7291_T_AVG_LOW)) |
133 | iio_push_event(indio_dev, | 137 | iio_push_event(indio_dev, |
134 | IIO_UNMOD_EVENT_CODE(IIO_TEMP, | 138 | IIO_UNMOD_EVENT_CODE(IIO_TEMP, |
135 | 0, | 139 | 0, |
136 | IIO_EV_TYPE_THRESH, | 140 | IIO_EV_TYPE_THRESH, |
137 | IIO_EV_DIR_FALLING), | 141 | IIO_EV_DIR_FALLING), |
138 | timestamp); | 142 | timestamp); |
139 | if ((t_status & (1 << 1)) || (t_status & (1 << 3))) | 143 | if ((t_status & AD7291_T_HIGH) || (t_status & AD7291_T_AVG_HIGH)) |
140 | iio_push_event(indio_dev, | 144 | iio_push_event(indio_dev, |
141 | IIO_UNMOD_EVENT_CODE(IIO_TEMP, | 145 | IIO_UNMOD_EVENT_CODE(IIO_TEMP, |
142 | 0, | 146 | 0, |
@@ -144,18 +148,18 @@ static irqreturn_t ad7291_event_handler(int irq, void *private) | |||
144 | IIO_EV_DIR_RISING), | 148 | IIO_EV_DIR_RISING), |
145 | timestamp); | 149 | timestamp); |
146 | 150 | ||
147 | for (i = 0; i < AD7291_VOLTAGE_LIMIT_COUNT*2; i += 2) { | 151 | for (i = 0; i < AD7291_VOLTAGE_LIMIT_COUNT; i++) { |
148 | if (v_status & (1 << i)) | 152 | if (v_status & AD7291_V_LOW(i)) |
149 | iio_push_event(indio_dev, | 153 | iio_push_event(indio_dev, |
150 | IIO_UNMOD_EVENT_CODE(IIO_VOLTAGE, | 154 | IIO_UNMOD_EVENT_CODE(IIO_VOLTAGE, |
151 | i/2, | 155 | i, |
152 | IIO_EV_TYPE_THRESH, | 156 | IIO_EV_TYPE_THRESH, |
153 | IIO_EV_DIR_FALLING), | 157 | IIO_EV_DIR_FALLING), |
154 | timestamp); | 158 | timestamp); |
155 | if (v_status & (1 << (i + 1))) | 159 | if (v_status & AD7291_V_HIGH(i)) |
156 | iio_push_event(indio_dev, | 160 | iio_push_event(indio_dev, |
157 | IIO_UNMOD_EVENT_CODE(IIO_VOLTAGE, | 161 | IIO_UNMOD_EVENT_CODE(IIO_VOLTAGE, |
158 | i/2, | 162 | i, |
159 | IIO_EV_TYPE_THRESH, | 163 | IIO_EV_TYPE_THRESH, |
160 | IIO_EV_DIR_RISING), | 164 | IIO_EV_DIR_RISING), |
161 | timestamp); | 165 | timestamp); |
@@ -165,7 +169,8 @@ static irqreturn_t ad7291_event_handler(int irq, void *private) | |||
165 | } | 169 | } |
166 | 170 | ||
167 | static unsigned int ad7291_threshold_reg(const struct iio_chan_spec *chan, | 171 | static unsigned int ad7291_threshold_reg(const struct iio_chan_spec *chan, |
168 | enum iio_event_direction dir, enum iio_event_info info) | 172 | enum iio_event_direction dir, |
173 | enum iio_event_info info) | ||
169 | { | 174 | { |
170 | unsigned int offset; | 175 | unsigned int offset; |
171 | 176 | ||
@@ -174,7 +179,7 @@ static unsigned int ad7291_threshold_reg(const struct iio_chan_spec *chan, | |||
174 | offset = chan->channel; | 179 | offset = chan->channel; |
175 | break; | 180 | break; |
176 | case IIO_TEMP: | 181 | case IIO_TEMP: |
177 | offset = 8; | 182 | offset = AD7291_VOLTAGE_OFFSET; |
178 | break; | 183 | break; |
179 | default: | 184 | default: |
180 | return 0; | 185 | return 0; |
@@ -182,14 +187,14 @@ static unsigned int ad7291_threshold_reg(const struct iio_chan_spec *chan, | |||
182 | 187 | ||
183 | switch (info) { | 188 | switch (info) { |
184 | case IIO_EV_INFO_VALUE: | 189 | case IIO_EV_INFO_VALUE: |
185 | if (dir == IIO_EV_DIR_FALLING) | 190 | if (dir == IIO_EV_DIR_FALLING) |
186 | return AD7291_DATA_HIGH(offset); | 191 | return AD7291_DATA_HIGH(offset); |
187 | else | 192 | else |
188 | return AD7291_DATA_LOW(offset); | 193 | return AD7291_DATA_LOW(offset); |
189 | case IIO_EV_INFO_HYSTERESIS: | 194 | case IIO_EV_INFO_HYSTERESIS: |
190 | return AD7291_HYST(offset); | 195 | return AD7291_HYST(offset); |
191 | default: | 196 | default: |
192 | break; | 197 | break; |
193 | } | 198 | } |
194 | return 0; | 199 | return 0; |
195 | } | 200 | } |
@@ -206,7 +211,7 @@ static int ad7291_read_event_value(struct iio_dev *indio_dev, | |||
206 | u16 uval; | 211 | u16 uval; |
207 | 212 | ||
208 | ret = ad7291_i2c_read(chip, ad7291_threshold_reg(chan, dir, info), | 213 | ret = ad7291_i2c_read(chip, ad7291_threshold_reg(chan, dir, info), |
209 | &uval); | 214 | &uval); |
210 | if (ret < 0) | 215 | if (ret < 0) |
211 | return ret; | 216 | return ret; |
212 | 217 | ||
@@ -237,7 +242,7 @@ static int ad7291_write_event_value(struct iio_dev *indio_dev, | |||
237 | } | 242 | } |
238 | 243 | ||
239 | return ad7291_i2c_write(chip, ad7291_threshold_reg(chan, dir, info), | 244 | return ad7291_i2c_write(chip, ad7291_threshold_reg(chan, dir, info), |
240 | val); | 245 | val); |
241 | } | 246 | } |
242 | 247 | ||
243 | static int ad7291_read_event_config(struct iio_dev *indio_dev, | 248 | static int ad7291_read_event_config(struct iio_dev *indio_dev, |
@@ -246,15 +251,14 @@ static int ad7291_read_event_config(struct iio_dev *indio_dev, | |||
246 | enum iio_event_direction dir) | 251 | enum iio_event_direction dir) |
247 | { | 252 | { |
248 | struct ad7291_chip_info *chip = iio_priv(indio_dev); | 253 | struct ad7291_chip_info *chip = iio_priv(indio_dev); |
249 | /* To be enabled the channel must simply be on. If any are enabled | 254 | /* |
250 | we are in continuous sampling mode */ | 255 | * To be enabled the channel must simply be on. If any are enabled |
256 | * we are in continuous sampling mode | ||
257 | */ | ||
251 | 258 | ||
252 | switch (chan->type) { | 259 | switch (chan->type) { |
253 | case IIO_VOLTAGE: | 260 | case IIO_VOLTAGE: |
254 | if (chip->c_mask & (1 << (15 - chan->channel))) | 261 | return !!(chip->c_mask & BIT(15 - chan->channel)); |
255 | return 1; | ||
256 | else | ||
257 | return 0; | ||
258 | case IIO_TEMP: | 262 | case IIO_TEMP: |
259 | /* always on */ | 263 | /* always on */ |
260 | return 1; | 264 | return 1; |
@@ -336,7 +340,7 @@ static int ad7291_read_raw(struct iio_dev *indio_dev, | |||
336 | } | 340 | } |
337 | /* Enable this channel alone */ | 341 | /* Enable this channel alone */ |
338 | regval = chip->command & (~AD7291_VOLTAGE_MASK); | 342 | regval = chip->command & (~AD7291_VOLTAGE_MASK); |
339 | regval |= 1 << (15 - chan->channel); | 343 | regval |= BIT(15 - chan->channel); |
340 | ret = ad7291_i2c_write(chip, AD7291_COMMAND, regval); | 344 | ret = ad7291_i2c_write(chip, AD7291_COMMAND, regval); |
341 | if (ret < 0) { | 345 | if (ret < 0) { |
342 | mutex_unlock(&chip->state_lock); | 346 | mutex_unlock(&chip->state_lock); |
@@ -344,7 +348,7 @@ static int ad7291_read_raw(struct iio_dev *indio_dev, | |||
344 | } | 348 | } |
345 | /* Read voltage */ | 349 | /* Read voltage */ |
346 | ret = i2c_smbus_read_word_swapped(chip->client, | 350 | ret = i2c_smbus_read_word_swapped(chip->client, |
347 | AD7291_VOLTAGE); | 351 | AD7291_VOLTAGE); |
348 | if (ret < 0) { | 352 | if (ret < 0) { |
349 | mutex_unlock(&chip->state_lock); | 353 | mutex_unlock(&chip->state_lock); |
350 | return ret; | 354 | return ret; |
@@ -355,7 +359,7 @@ static int ad7291_read_raw(struct iio_dev *indio_dev, | |||
355 | case IIO_TEMP: | 359 | case IIO_TEMP: |
356 | /* Assumes tsense bit of command register always set */ | 360 | /* Assumes tsense bit of command register always set */ |
357 | ret = i2c_smbus_read_word_swapped(chip->client, | 361 | ret = i2c_smbus_read_word_swapped(chip->client, |
358 | AD7291_T_SENSE); | 362 | AD7291_T_SENSE); |
359 | if (ret < 0) | 363 | if (ret < 0) |
360 | return ret; | 364 | return ret; |
361 | *val = sign_extend32(ret, 11); | 365 | *val = sign_extend32(ret, 11); |
@@ -365,7 +369,7 @@ static int ad7291_read_raw(struct iio_dev *indio_dev, | |||
365 | } | 369 | } |
366 | case IIO_CHAN_INFO_AVERAGE_RAW: | 370 | case IIO_CHAN_INFO_AVERAGE_RAW: |
367 | ret = i2c_smbus_read_word_swapped(chip->client, | 371 | ret = i2c_smbus_read_word_swapped(chip->client, |
368 | AD7291_T_AVERAGE); | 372 | AD7291_T_AVERAGE); |
369 | if (ret < 0) | 373 | if (ret < 0) |
370 | return ret; | 374 | return ret; |
371 | *val = sign_extend32(ret, 11); | 375 | *val = sign_extend32(ret, 11); |
@@ -375,6 +379,7 @@ static int ad7291_read_raw(struct iio_dev *indio_dev, | |||
375 | case IIO_VOLTAGE: | 379 | case IIO_VOLTAGE: |
376 | if (chip->reg) { | 380 | if (chip->reg) { |
377 | int vref; | 381 | int vref; |
382 | |||
378 | vref = regulator_get_voltage(chip->reg); | 383 | vref = regulator_get_voltage(chip->reg); |
379 | if (vref < 0) | 384 | if (vref < 0) |
380 | return vref; | 385 | return vref; |
@@ -460,7 +465,7 @@ static const struct iio_info ad7291_info = { | |||
460 | }; | 465 | }; |
461 | 466 | ||
462 | static int ad7291_probe(struct i2c_client *client, | 467 | static int ad7291_probe(struct i2c_client *client, |
463 | const struct i2c_device_id *id) | 468 | const struct i2c_device_id *id) |
464 | { | 469 | { |
465 | struct ad7291_platform_data *pdata = client->dev.platform_data; | 470 | struct ad7291_platform_data *pdata = client->dev.platform_data; |
466 | struct ad7291_chip_info *chip; | 471 | struct ad7291_chip_info *chip; |
diff --git a/drivers/iio/adc/xilinx-xadc-events.c b/drivers/iio/adc/xilinx-xadc-events.c index 3e7f0d7a80c3..edcf3aabd70d 100644 --- a/drivers/iio/adc/xilinx-xadc-events.c +++ b/drivers/iio/adc/xilinx-xadc-events.c | |||
@@ -31,17 +31,11 @@ static const struct iio_chan_spec *xadc_event_to_channel( | |||
31 | static void xadc_handle_event(struct iio_dev *indio_dev, unsigned int event) | 31 | static void xadc_handle_event(struct iio_dev *indio_dev, unsigned int event) |
32 | { | 32 | { |
33 | const struct iio_chan_spec *chan; | 33 | const struct iio_chan_spec *chan; |
34 | unsigned int offset; | ||
35 | 34 | ||
36 | /* Temperature threshold error, we don't handle this yet */ | 35 | /* Temperature threshold error, we don't handle this yet */ |
37 | if (event == 0) | 36 | if (event == 0) |
38 | return; | 37 | return; |
39 | 38 | ||
40 | if (event < 4) | ||
41 | offset = event; | ||
42 | else | ||
43 | offset = event + 4; | ||
44 | |||
45 | chan = xadc_event_to_channel(indio_dev, event); | 39 | chan = xadc_event_to_channel(indio_dev, event); |
46 | 40 | ||
47 | if (chan->type == IIO_TEMP) { | 41 | if (chan->type == IIO_TEMP) { |
diff --git a/drivers/iio/common/hid-sensors/hid-sensor-attributes.c b/drivers/iio/common/hid-sensors/hid-sensor-attributes.c index 403dd3d8986e..25b01e156d82 100644 --- a/drivers/iio/common/hid-sensors/hid-sensor-attributes.c +++ b/drivers/iio/common/hid-sensors/hid-sensor-attributes.c | |||
@@ -26,12 +26,12 @@ | |||
26 | #include <linux/iio/iio.h> | 26 | #include <linux/iio/iio.h> |
27 | #include <linux/iio/sysfs.h> | 27 | #include <linux/iio/sysfs.h> |
28 | 28 | ||
29 | struct { | 29 | static struct { |
30 | u32 usage_id; | 30 | u32 usage_id; |
31 | int unit; /* 0 for default others from HID sensor spec */ | 31 | int unit; /* 0 for default others from HID sensor spec */ |
32 | int scale_val0; /* scale, whole number */ | 32 | int scale_val0; /* scale, whole number */ |
33 | int scale_val1; /* scale, fraction in micros */ | 33 | int scale_val1; /* scale, fraction in micros */ |
34 | } static unit_conversion[] = { | 34 | } unit_conversion[] = { |
35 | {HID_USAGE_SENSOR_ACCEL_3D, 0, 9, 806650}, | 35 | {HID_USAGE_SENSOR_ACCEL_3D, 0, 9, 806650}, |
36 | {HID_USAGE_SENSOR_ACCEL_3D, | 36 | {HID_USAGE_SENSOR_ACCEL_3D, |
37 | HID_USAGE_SENSOR_UNITS_METERS_PER_SEC_SQRD, 1, 0}, | 37 | HID_USAGE_SENSOR_UNITS_METERS_PER_SEC_SQRD, 1, 0}, |
@@ -343,6 +343,7 @@ int hid_sensor_format_scale(u32 usage_id, | |||
343 | } | 343 | } |
344 | EXPORT_SYMBOL(hid_sensor_format_scale); | 344 | EXPORT_SYMBOL(hid_sensor_format_scale); |
345 | 345 | ||
346 | static | ||
346 | int hid_sensor_get_reporting_interval(struct hid_sensor_hub_device *hsdev, | 347 | int hid_sensor_get_reporting_interval(struct hid_sensor_hub_device *hsdev, |
347 | u32 usage_id, | 348 | u32 usage_id, |
348 | struct hid_sensor_common *st) | 349 | struct hid_sensor_common *st) |
diff --git a/drivers/iio/common/st_sensors/st_sensors_core.c b/drivers/iio/common/st_sensors/st_sensors_core.c index e8b932fed70e..8a4ec00a91a0 100644 --- a/drivers/iio/common/st_sensors/st_sensors_core.c +++ b/drivers/iio/common/st_sensors/st_sensors_core.c | |||
@@ -14,8 +14,8 @@ | |||
14 | #include <linux/delay.h> | 14 | #include <linux/delay.h> |
15 | #include <linux/iio/iio.h> | 15 | #include <linux/iio/iio.h> |
16 | #include <linux/regulator/consumer.h> | 16 | #include <linux/regulator/consumer.h> |
17 | #include <linux/of.h> | ||
17 | #include <asm/unaligned.h> | 18 | #include <asm/unaligned.h> |
18 | |||
19 | #include <linux/iio/common/st_sensors.h> | 19 | #include <linux/iio/common/st_sensors.h> |
20 | 20 | ||
21 | 21 | ||
@@ -265,14 +265,47 @@ static int st_sensors_set_drdy_int_pin(struct iio_dev *indio_dev, | |||
265 | return 0; | 265 | return 0; |
266 | } | 266 | } |
267 | 267 | ||
268 | #ifdef CONFIG_OF | ||
269 | static struct st_sensors_platform_data *st_sensors_of_probe(struct device *dev, | ||
270 | struct st_sensors_platform_data *defdata) | ||
271 | { | ||
272 | struct st_sensors_platform_data *pdata; | ||
273 | struct device_node *np = dev->of_node; | ||
274 | u32 val; | ||
275 | |||
276 | if (!np) | ||
277 | return NULL; | ||
278 | |||
279 | pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL); | ||
280 | if (!of_property_read_u32(np, "st,drdy-int-pin", &val) && (val <= 2)) | ||
281 | pdata->drdy_int_pin = (u8) val; | ||
282 | else | ||
283 | pdata->drdy_int_pin = defdata ? defdata->drdy_int_pin : 1; | ||
284 | |||
285 | return pdata; | ||
286 | } | ||
287 | #else | ||
288 | static struct st_sensors_platform_data *st_sensors_of_probe(struct device *dev, | ||
289 | struct st_sensors_platform_data *defdata) | ||
290 | { | ||
291 | return NULL; | ||
292 | } | ||
293 | #endif | ||
294 | |||
268 | int st_sensors_init_sensor(struct iio_dev *indio_dev, | 295 | int st_sensors_init_sensor(struct iio_dev *indio_dev, |
269 | struct st_sensors_platform_data *pdata) | 296 | struct st_sensors_platform_data *pdata) |
270 | { | 297 | { |
271 | struct st_sensor_data *sdata = iio_priv(indio_dev); | 298 | struct st_sensor_data *sdata = iio_priv(indio_dev); |
299 | struct st_sensors_platform_data *of_pdata; | ||
272 | int err = 0; | 300 | int err = 0; |
273 | 301 | ||
274 | mutex_init(&sdata->tb.buf_lock); | 302 | mutex_init(&sdata->tb.buf_lock); |
275 | 303 | ||
304 | /* If OF/DT pdata exists, it will take precedence of anything else */ | ||
305 | of_pdata = st_sensors_of_probe(indio_dev->dev.parent, pdata); | ||
306 | if (of_pdata) | ||
307 | pdata = of_pdata; | ||
308 | |||
276 | if (pdata) | 309 | if (pdata) |
277 | err = st_sensors_set_drdy_int_pin(indio_dev, pdata); | 310 | err = st_sensors_set_drdy_int_pin(indio_dev, pdata); |
278 | 311 | ||
@@ -463,35 +496,6 @@ read_wai_error: | |||
463 | } | 496 | } |
464 | EXPORT_SYMBOL(st_sensors_check_device_support); | 497 | EXPORT_SYMBOL(st_sensors_check_device_support); |
465 | 498 | ||
466 | ssize_t st_sensors_sysfs_get_sampling_frequency(struct device *dev, | ||
467 | struct device_attribute *attr, char *buf) | ||
468 | { | ||
469 | struct st_sensor_data *adata = iio_priv(dev_get_drvdata(dev)); | ||
470 | |||
471 | return sprintf(buf, "%d\n", adata->odr); | ||
472 | } | ||
473 | EXPORT_SYMBOL(st_sensors_sysfs_get_sampling_frequency); | ||
474 | |||
475 | ssize_t st_sensors_sysfs_set_sampling_frequency(struct device *dev, | ||
476 | struct device_attribute *attr, const char *buf, size_t size) | ||
477 | { | ||
478 | int err; | ||
479 | unsigned int odr; | ||
480 | struct iio_dev *indio_dev = dev_get_drvdata(dev); | ||
481 | |||
482 | err = kstrtoint(buf, 10, &odr); | ||
483 | if (err < 0) | ||
484 | goto conversion_error; | ||
485 | |||
486 | mutex_lock(&indio_dev->mlock); | ||
487 | err = st_sensors_set_odr(indio_dev, odr); | ||
488 | mutex_unlock(&indio_dev->mlock); | ||
489 | |||
490 | conversion_error: | ||
491 | return err < 0 ? err : size; | ||
492 | } | ||
493 | EXPORT_SYMBOL(st_sensors_sysfs_set_sampling_frequency); | ||
494 | |||
495 | ssize_t st_sensors_sysfs_sampling_frequency_avail(struct device *dev, | 499 | ssize_t st_sensors_sysfs_sampling_frequency_avail(struct device *dev, |
496 | struct device_attribute *attr, char *buf) | 500 | struct device_attribute *attr, char *buf) |
497 | { | 501 | { |
diff --git a/drivers/iio/common/st_sensors/st_sensors_i2c.c b/drivers/iio/common/st_sensors/st_sensors_i2c.c index 38af9440c103..bb6f3085f57b 100644 --- a/drivers/iio/common/st_sensors/st_sensors_i2c.c +++ b/drivers/iio/common/st_sensors/st_sensors_i2c.c | |||
@@ -12,6 +12,7 @@ | |||
12 | #include <linux/module.h> | 12 | #include <linux/module.h> |
13 | #include <linux/slab.h> | 13 | #include <linux/slab.h> |
14 | #include <linux/iio/iio.h> | 14 | #include <linux/iio/iio.h> |
15 | #include <linux/of_device.h> | ||
15 | 16 | ||
16 | #include <linux/iio/common/st_sensors_i2c.h> | 17 | #include <linux/iio/common/st_sensors_i2c.h> |
17 | 18 | ||
@@ -76,6 +77,35 @@ void st_sensors_i2c_configure(struct iio_dev *indio_dev, | |||
76 | } | 77 | } |
77 | EXPORT_SYMBOL(st_sensors_i2c_configure); | 78 | EXPORT_SYMBOL(st_sensors_i2c_configure); |
78 | 79 | ||
80 | #ifdef CONFIG_OF | ||
81 | /** | ||
82 | * st_sensors_of_i2c_probe() - device tree probe for ST I2C sensors | ||
83 | * @client: the I2C client device for the sensor | ||
84 | * @match: the OF match table for the device, containing compatible strings | ||
85 | * but also a .data field with the corresponding internal kernel name | ||
86 | * used by this sensor. | ||
87 | * | ||
88 | * In effect this function matches a compatible string to an internal kernel | ||
89 | * name for a certain sensor device, so that the rest of the autodetection can | ||
90 | * rely on that name from this point on. I2C client devices will be renamed | ||
91 | * to match the internal kernel convention. | ||
92 | */ | ||
93 | void st_sensors_of_i2c_probe(struct i2c_client *client, | ||
94 | const struct of_device_id *match) | ||
95 | { | ||
96 | const struct of_device_id *of_id; | ||
97 | |||
98 | of_id = of_match_device(match, &client->dev); | ||
99 | if (!of_id) | ||
100 | return; | ||
101 | |||
102 | /* The name from the OF match takes precedence if present */ | ||
103 | strncpy(client->name, of_id->data, sizeof(client->name)); | ||
104 | client->name[sizeof(client->name) - 1] = '\0'; | ||
105 | } | ||
106 | EXPORT_SYMBOL(st_sensors_of_i2c_probe); | ||
107 | #endif | ||
108 | |||
79 | MODULE_AUTHOR("Denis Ciocca <denis.ciocca@st.com>"); | 109 | MODULE_AUTHOR("Denis Ciocca <denis.ciocca@st.com>"); |
80 | MODULE_DESCRIPTION("STMicroelectronics ST-sensors i2c driver"); | 110 | MODULE_DESCRIPTION("STMicroelectronics ST-sensors i2c driver"); |
81 | MODULE_LICENSE("GPL v2"); | 111 | MODULE_LICENSE("GPL v2"); |
diff --git a/drivers/iio/dac/ad5504.c b/drivers/iio/dac/ad5504.c index c917dd24090a..581ec141de3d 100644 --- a/drivers/iio/dac/ad5504.c +++ b/drivers/iio/dac/ad5504.c | |||
@@ -125,7 +125,6 @@ static int ad5504_write_raw(struct iio_dev *indio_dev, | |||
125 | long mask) | 125 | long mask) |
126 | { | 126 | { |
127 | struct ad5504_state *st = iio_priv(indio_dev); | 127 | struct ad5504_state *st = iio_priv(indio_dev); |
128 | int ret; | ||
129 | 128 | ||
130 | switch (mask) { | 129 | switch (mask) { |
131 | case IIO_CHAN_INFO_RAW: | 130 | case IIO_CHAN_INFO_RAW: |
@@ -134,10 +133,8 @@ static int ad5504_write_raw(struct iio_dev *indio_dev, | |||
134 | 133 | ||
135 | return ad5504_spi_write(st, chan->address, val); | 134 | return ad5504_spi_write(st, chan->address, val); |
136 | default: | 135 | default: |
137 | ret = -EINVAL; | 136 | return -EINVAL; |
138 | } | 137 | } |
139 | |||
140 | return -EINVAL; | ||
141 | } | 138 | } |
142 | 139 | ||
143 | static const char * const ad5504_powerdown_modes[] = { | 140 | static const char * const ad5504_powerdown_modes[] = { |
diff --git a/drivers/iio/dac/ad5624r_spi.c b/drivers/iio/dac/ad5624r_spi.c index e8199cce2aea..61bb9d4239ea 100644 --- a/drivers/iio/dac/ad5624r_spi.c +++ b/drivers/iio/dac/ad5624r_spi.c | |||
@@ -67,7 +67,6 @@ static int ad5624r_write_raw(struct iio_dev *indio_dev, | |||
67 | long mask) | 67 | long mask) |
68 | { | 68 | { |
69 | struct ad5624r_state *st = iio_priv(indio_dev); | 69 | struct ad5624r_state *st = iio_priv(indio_dev); |
70 | int ret; | ||
71 | 70 | ||
72 | switch (mask) { | 71 | switch (mask) { |
73 | case IIO_CHAN_INFO_RAW: | 72 | case IIO_CHAN_INFO_RAW: |
@@ -79,10 +78,8 @@ static int ad5624r_write_raw(struct iio_dev *indio_dev, | |||
79 | chan->address, val, | 78 | chan->address, val, |
80 | chan->scan_type.shift); | 79 | chan->scan_type.shift); |
81 | default: | 80 | default: |
82 | ret = -EINVAL; | 81 | return -EINVAL; |
83 | } | 82 | } |
84 | |||
85 | return -EINVAL; | ||
86 | } | 83 | } |
87 | 84 | ||
88 | static const char * const ad5624r_powerdown_modes[] = { | 85 | static const char * const ad5624r_powerdown_modes[] = { |
diff --git a/drivers/iio/dac/ad5686.c b/drivers/iio/dac/ad5686.c index 17aca4d9bd06..f57562aa396f 100644 --- a/drivers/iio/dac/ad5686.c +++ b/drivers/iio/dac/ad5686.c | |||
@@ -313,7 +313,7 @@ static int ad5686_probe(struct spi_device *spi) | |||
313 | { | 313 | { |
314 | struct ad5686_state *st; | 314 | struct ad5686_state *st; |
315 | struct iio_dev *indio_dev; | 315 | struct iio_dev *indio_dev; |
316 | int ret, regdone = 0, voltage_uv = 0; | 316 | int ret, voltage_uv = 0; |
317 | 317 | ||
318 | indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st)); | 318 | indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st)); |
319 | if (indio_dev == NULL) | 319 | if (indio_dev == NULL) |
@@ -355,7 +355,6 @@ static int ad5686_probe(struct spi_device *spi) | |||
355 | indio_dev->channels = st->chip_info->channel; | 355 | indio_dev->channels = st->chip_info->channel; |
356 | indio_dev->num_channels = AD5686_DAC_CHANNELS; | 356 | indio_dev->num_channels = AD5686_DAC_CHANNELS; |
357 | 357 | ||
358 | regdone = 1; | ||
359 | ret = ad5686_spi_write(st, AD5686_CMD_INTERNAL_REFER_SETUP, 0, | 358 | ret = ad5686_spi_write(st, AD5686_CMD_INTERNAL_REFER_SETUP, 0, |
360 | !!voltage_uv, 0); | 359 | !!voltage_uv, 0); |
361 | if (ret) | 360 | if (ret) |
diff --git a/drivers/iio/gyro/adis16260.c b/drivers/iio/gyro/adis16260.c index 22b6fb80fa1a..75fe0edd3d0f 100644 --- a/drivers/iio/gyro/adis16260.c +++ b/drivers/iio/gyro/adis16260.c | |||
@@ -101,65 +101,6 @@ | |||
101 | #define ADIS16260_SCAN_TEMP 3 | 101 | #define ADIS16260_SCAN_TEMP 3 |
102 | #define ADIS16260_SCAN_ANGL 4 | 102 | #define ADIS16260_SCAN_ANGL 4 |
103 | 103 | ||
104 | static ssize_t adis16260_read_frequency(struct device *dev, | ||
105 | struct device_attribute *attr, | ||
106 | char *buf) | ||
107 | { | ||
108 | struct iio_dev *indio_dev = dev_to_iio_dev(dev); | ||
109 | struct adis *adis = iio_priv(indio_dev); | ||
110 | int ret, len = 0; | ||
111 | u16 t; | ||
112 | int sps; | ||
113 | ret = adis_read_reg_16(adis, ADIS16260_SMPL_PRD, &t); | ||
114 | if (ret) | ||
115 | return ret; | ||
116 | |||
117 | if (spi_get_device_id(adis->spi)->driver_data) /* If an adis16251 */ | ||
118 | sps = (t & ADIS16260_SMPL_PRD_TIME_BASE) ? 8 : 256; | ||
119 | else | ||
120 | sps = (t & ADIS16260_SMPL_PRD_TIME_BASE) ? 66 : 2048; | ||
121 | sps /= (t & ADIS16260_SMPL_PRD_DIV_MASK) + 1; | ||
122 | len = sprintf(buf, "%d\n", sps); | ||
123 | return len; | ||
124 | } | ||
125 | |||
126 | static ssize_t adis16260_write_frequency(struct device *dev, | ||
127 | struct device_attribute *attr, | ||
128 | const char *buf, | ||
129 | size_t len) | ||
130 | { | ||
131 | struct iio_dev *indio_dev = dev_to_iio_dev(dev); | ||
132 | struct adis *adis = iio_priv(indio_dev); | ||
133 | unsigned int val; | ||
134 | int ret; | ||
135 | u8 t; | ||
136 | |||
137 | ret = kstrtouint(buf, 10, &val); | ||
138 | if (ret) | ||
139 | return ret; | ||
140 | |||
141 | mutex_lock(&indio_dev->mlock); | ||
142 | if (spi_get_device_id(adis->spi)->driver_data) | ||
143 | t = 256 / val; | ||
144 | else | ||
145 | t = 2048 / val; | ||
146 | |||
147 | if (t > ADIS16260_SMPL_PRD_DIV_MASK) | ||
148 | t = ADIS16260_SMPL_PRD_DIV_MASK; | ||
149 | else if (t > 0) | ||
150 | t--; | ||
151 | |||
152 | if (t >= 0x0A) | ||
153 | adis->spi->max_speed_hz = ADIS16260_SPI_SLOW; | ||
154 | else | ||
155 | adis->spi->max_speed_hz = ADIS16260_SPI_FAST; | ||
156 | ret = adis_write_reg_8(adis, ADIS16260_SMPL_PRD, t); | ||
157 | |||
158 | mutex_unlock(&indio_dev->mlock); | ||
159 | |||
160 | return ret ? ret : len; | ||
161 | } | ||
162 | |||
163 | /* Power down the device */ | 104 | /* Power down the device */ |
164 | static int adis16260_stop_device(struct iio_dev *indio_dev) | 105 | static int adis16260_stop_device(struct iio_dev *indio_dev) |
165 | { | 106 | { |
@@ -174,18 +115,19 @@ static int adis16260_stop_device(struct iio_dev *indio_dev) | |||
174 | return ret; | 115 | return ret; |
175 | } | 116 | } |
176 | 117 | ||
177 | static IIO_DEV_ATTR_SAMP_FREQ(S_IWUSR | S_IRUGO, | ||
178 | adis16260_read_frequency, | ||
179 | adis16260_write_frequency); | ||
180 | |||
181 | static const struct iio_chan_spec adis16260_channels[] = { | 118 | static const struct iio_chan_spec adis16260_channels[] = { |
182 | ADIS_GYRO_CHAN(X, ADIS16260_GYRO_OUT, ADIS16260_SCAN_GYRO, | 119 | ADIS_GYRO_CHAN(X, ADIS16260_GYRO_OUT, ADIS16260_SCAN_GYRO, |
183 | BIT(IIO_CHAN_INFO_CALIBBIAS) | | 120 | BIT(IIO_CHAN_INFO_CALIBBIAS) | |
184 | BIT(IIO_CHAN_INFO_CALIBSCALE), 14), | 121 | BIT(IIO_CHAN_INFO_CALIBSCALE), |
185 | ADIS_INCLI_CHAN(X, ADIS16260_ANGL_OUT, ADIS16260_SCAN_ANGL, 0, 14), | 122 | BIT(IIO_CHAN_INFO_SAMP_FREQ), 14), |
186 | ADIS_TEMP_CHAN(ADIS16260_TEMP_OUT, ADIS16260_SCAN_TEMP, 12), | 123 | ADIS_INCLI_CHAN(X, ADIS16260_ANGL_OUT, ADIS16260_SCAN_ANGL, 0, |
187 | ADIS_SUPPLY_CHAN(ADIS16260_SUPPLY_OUT, ADIS16260_SCAN_SUPPLY, 12), | 124 | BIT(IIO_CHAN_INFO_SAMP_FREQ), 14), |
188 | ADIS_AUX_ADC_CHAN(ADIS16260_AUX_ADC, ADIS16260_SCAN_AUX_ADC, 12), | 125 | ADIS_TEMP_CHAN(ADIS16260_TEMP_OUT, ADIS16260_SCAN_TEMP, |
126 | BIT(IIO_CHAN_INFO_SAMP_FREQ), 12), | ||
127 | ADIS_SUPPLY_CHAN(ADIS16260_SUPPLY_OUT, ADIS16260_SCAN_SUPPLY, | ||
128 | BIT(IIO_CHAN_INFO_SAMP_FREQ), 12), | ||
129 | ADIS_AUX_ADC_CHAN(ADIS16260_AUX_ADC, ADIS16260_SCAN_AUX_ADC, | ||
130 | BIT(IIO_CHAN_INFO_SAMP_FREQ), 12), | ||
189 | IIO_CHAN_SOFT_TIMESTAMP(5), | 131 | IIO_CHAN_SOFT_TIMESTAMP(5), |
190 | }; | 132 | }; |
191 | 133 | ||
@@ -258,6 +200,20 @@ static int adis16260_read_raw(struct iio_dev *indio_dev, | |||
258 | 200 | ||
259 | *val = val16; | 201 | *val = val16; |
260 | return IIO_VAL_INT; | 202 | return IIO_VAL_INT; |
203 | case IIO_CHAN_INFO_SAMP_FREQ: | ||
204 | ret = adis_read_reg_16(adis, ADIS16260_SMPL_PRD, &val16); | ||
205 | if (ret) | ||
206 | return ret; | ||
207 | |||
208 | if (spi_get_device_id(adis->spi)->driver_data) | ||
209 | /* If an adis16251 */ | ||
210 | *val = (val16 & ADIS16260_SMPL_PRD_TIME_BASE) ? | ||
211 | 8 : 256; | ||
212 | else | ||
213 | *val = (val16 & ADIS16260_SMPL_PRD_TIME_BASE) ? | ||
214 | 66 : 2048; | ||
215 | *val /= (val16 & ADIS16260_SMPL_PRD_DIV_MASK) + 1; | ||
216 | return IIO_VAL_INT; | ||
261 | } | 217 | } |
262 | return -EINVAL; | 218 | return -EINVAL; |
263 | } | 219 | } |
@@ -269,7 +225,9 @@ static int adis16260_write_raw(struct iio_dev *indio_dev, | |||
269 | long mask) | 225 | long mask) |
270 | { | 226 | { |
271 | struct adis *adis = iio_priv(indio_dev); | 227 | struct adis *adis = iio_priv(indio_dev); |
228 | int ret; | ||
272 | u8 addr; | 229 | u8 addr; |
230 | u8 t; | ||
273 | 231 | ||
274 | switch (mask) { | 232 | switch (mask) { |
275 | case IIO_CHAN_INFO_CALIBBIAS: | 233 | case IIO_CHAN_INFO_CALIBBIAS: |
@@ -284,21 +242,31 @@ static int adis16260_write_raw(struct iio_dev *indio_dev, | |||
284 | 242 | ||
285 | addr = adis16260_addresses[chan->scan_index][1]; | 243 | addr = adis16260_addresses[chan->scan_index][1]; |
286 | return adis_write_reg_16(adis, addr, val); | 244 | return adis_write_reg_16(adis, addr, val); |
245 | case IIO_CHAN_INFO_SAMP_FREQ: | ||
246 | mutex_lock(&indio_dev->mlock); | ||
247 | if (spi_get_device_id(adis->spi)->driver_data) | ||
248 | t = 256 / val; | ||
249 | else | ||
250 | t = 2048 / val; | ||
251 | |||
252 | if (t > ADIS16260_SMPL_PRD_DIV_MASK) | ||
253 | t = ADIS16260_SMPL_PRD_DIV_MASK; | ||
254 | else if (t > 0) | ||
255 | t--; | ||
256 | |||
257 | if (t >= 0x0A) | ||
258 | adis->spi->max_speed_hz = ADIS16260_SPI_SLOW; | ||
259 | else | ||
260 | adis->spi->max_speed_hz = ADIS16260_SPI_FAST; | ||
261 | ret = adis_write_reg_8(adis, ADIS16260_SMPL_PRD, t); | ||
262 | |||
263 | mutex_unlock(&indio_dev->mlock); | ||
264 | return ret; | ||
287 | } | 265 | } |
288 | return -EINVAL; | 266 | return -EINVAL; |
289 | } | 267 | } |
290 | 268 | ||
291 | static struct attribute *adis16260_attributes[] = { | ||
292 | &iio_dev_attr_sampling_frequency.dev_attr.attr, | ||
293 | NULL | ||
294 | }; | ||
295 | |||
296 | static const struct attribute_group adis16260_attribute_group = { | ||
297 | .attrs = adis16260_attributes, | ||
298 | }; | ||
299 | |||
300 | static const struct iio_info adis16260_info = { | 269 | static const struct iio_info adis16260_info = { |
301 | .attrs = &adis16260_attribute_group, | ||
302 | .read_raw = &adis16260_read_raw, | 270 | .read_raw = &adis16260_read_raw, |
303 | .write_raw = &adis16260_write_raw, | 271 | .write_raw = &adis16260_write_raw, |
304 | .update_scan_mode = adis_update_scan_mode, | 272 | .update_scan_mode = adis_update_scan_mode, |
diff --git a/drivers/iio/gyro/itg3200_core.c b/drivers/iio/gyro/itg3200_core.c index 8295e318399f..6a8020d48140 100644 --- a/drivers/iio/gyro/itg3200_core.c +++ b/drivers/iio/gyro/itg3200_core.c | |||
@@ -90,6 +90,7 @@ static int itg3200_read_raw(struct iio_dev *indio_dev, | |||
90 | { | 90 | { |
91 | int ret = 0; | 91 | int ret = 0; |
92 | u8 reg; | 92 | u8 reg; |
93 | u8 regval; | ||
93 | 94 | ||
94 | switch (info) { | 95 | switch (info) { |
95 | case IIO_CHAN_INFO_RAW: | 96 | case IIO_CHAN_INFO_RAW: |
@@ -107,65 +108,60 @@ static int itg3200_read_raw(struct iio_dev *indio_dev, | |||
107 | /* Only the temperature channel has an offset */ | 108 | /* Only the temperature channel has an offset */ |
108 | *val = 23000; | 109 | *val = 23000; |
109 | return IIO_VAL_INT; | 110 | return IIO_VAL_INT; |
110 | default: | 111 | case IIO_CHAN_INFO_SAMP_FREQ: |
111 | return -EINVAL; | 112 | ret = itg3200_read_reg_8(indio_dev, ITG3200_REG_DLPF, ®val); |
112 | } | 113 | if (ret) |
113 | } | 114 | return ret; |
114 | |||
115 | static ssize_t itg3200_read_frequency(struct device *dev, | ||
116 | struct device_attribute *attr, char *buf) | ||
117 | { | ||
118 | struct iio_dev *indio_dev = dev_to_iio_dev(dev); | ||
119 | int ret, sps; | ||
120 | u8 val; | ||
121 | |||
122 | ret = itg3200_read_reg_8(indio_dev, ITG3200_REG_DLPF, &val); | ||
123 | if (ret) | ||
124 | return ret; | ||
125 | 115 | ||
126 | sps = (val & ITG3200_DLPF_CFG_MASK) ? 1000 : 8000; | 116 | *val = (regval & ITG3200_DLPF_CFG_MASK) ? 1000 : 8000; |
127 | 117 | ||
128 | ret = itg3200_read_reg_8(indio_dev, ITG3200_REG_SAMPLE_RATE_DIV, &val); | 118 | ret = itg3200_read_reg_8(indio_dev, |
129 | if (ret) | 119 | ITG3200_REG_SAMPLE_RATE_DIV, |
130 | return ret; | 120 | ®val); |
121 | if (ret) | ||
122 | return ret; | ||
131 | 123 | ||
132 | sps /= val + 1; | 124 | *val /= regval + 1; |
125 | return IIO_VAL_INT; | ||
133 | 126 | ||
134 | return sprintf(buf, "%d\n", sps); | 127 | default: |
128 | return -EINVAL; | ||
129 | } | ||
135 | } | 130 | } |
136 | 131 | ||
137 | static ssize_t itg3200_write_frequency(struct device *dev, | 132 | static int itg3200_write_raw(struct iio_dev *indio_dev, |
138 | struct device_attribute *attr, | 133 | struct iio_chan_spec const *chan, |
139 | const char *buf, | 134 | int val, |
140 | size_t len) | 135 | int val2, |
136 | long mask) | ||
141 | { | 137 | { |
142 | struct iio_dev *indio_dev = dev_to_iio_dev(dev); | ||
143 | unsigned val; | ||
144 | int ret; | 138 | int ret; |
145 | u8 t; | 139 | u8 t; |
146 | 140 | ||
147 | ret = kstrtouint(buf, 10, &val); | 141 | switch (mask) { |
148 | if (ret) | 142 | case IIO_CHAN_INFO_SAMP_FREQ: |
149 | return ret; | 143 | if (val == 0 || val2 != 0) |
144 | return -EINVAL; | ||
150 | 145 | ||
151 | mutex_lock(&indio_dev->mlock); | 146 | mutex_lock(&indio_dev->mlock); |
152 | 147 | ||
153 | ret = itg3200_read_reg_8(indio_dev, ITG3200_REG_DLPF, &t); | 148 | ret = itg3200_read_reg_8(indio_dev, ITG3200_REG_DLPF, &t); |
154 | if (ret) | 149 | if (ret) { |
155 | goto err_ret; | 150 | mutex_unlock(&indio_dev->mlock); |
151 | return ret; | ||
152 | } | ||
153 | t = ((t & ITG3200_DLPF_CFG_MASK) ? 1000u : 8000u) / val - 1; | ||
156 | 154 | ||
157 | if (val == 0) { | 155 | ret = itg3200_write_reg_8(indio_dev, |
158 | ret = -EINVAL; | 156 | ITG3200_REG_SAMPLE_RATE_DIV, |
159 | goto err_ret; | 157 | t); |
160 | } | ||
161 | t = ((t & ITG3200_DLPF_CFG_MASK) ? 1000u : 8000u) / val - 1; | ||
162 | 158 | ||
163 | ret = itg3200_write_reg_8(indio_dev, ITG3200_REG_SAMPLE_RATE_DIV, t); | 159 | mutex_unlock(&indio_dev->mlock); |
164 | 160 | return ret; | |
165 | err_ret: | ||
166 | mutex_unlock(&indio_dev->mlock); | ||
167 | 161 | ||
168 | return ret ? ret : len; | 162 | default: |
163 | return -EINVAL; | ||
164 | } | ||
169 | } | 165 | } |
170 | 166 | ||
171 | /* | 167 | /* |
@@ -255,6 +251,7 @@ err_ret: | |||
255 | .channel2 = IIO_MOD_ ## _mod, \ | 251 | .channel2 = IIO_MOD_ ## _mod, \ |
256 | .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \ | 252 | .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \ |
257 | .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), \ | 253 | .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), \ |
254 | .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \ | ||
258 | .address = ITG3200_REG_GYRO_ ## _mod ## OUT_H, \ | 255 | .address = ITG3200_REG_GYRO_ ## _mod ## OUT_H, \ |
259 | .scan_index = ITG3200_SCAN_GYRO_ ## _mod, \ | 256 | .scan_index = ITG3200_SCAN_GYRO_ ## _mod, \ |
260 | .scan_type = ITG3200_ST, \ | 257 | .scan_type = ITG3200_ST, \ |
@@ -267,6 +264,7 @@ static const struct iio_chan_spec itg3200_channels[] = { | |||
267 | .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), | 264 | .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), |
268 | .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_OFFSET) | | 265 | .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_OFFSET) | |
269 | BIT(IIO_CHAN_INFO_SCALE), | 266 | BIT(IIO_CHAN_INFO_SCALE), |
267 | .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), | ||
270 | .address = ITG3200_REG_TEMP_OUT_H, | 268 | .address = ITG3200_REG_TEMP_OUT_H, |
271 | .scan_index = ITG3200_SCAN_TEMP, | 269 | .scan_index = ITG3200_SCAN_TEMP, |
272 | .scan_type = ITG3200_ST, | 270 | .scan_type = ITG3200_ST, |
@@ -277,22 +275,9 @@ static const struct iio_chan_spec itg3200_channels[] = { | |||
277 | IIO_CHAN_SOFT_TIMESTAMP(ITG3200_SCAN_ELEMENTS), | 275 | IIO_CHAN_SOFT_TIMESTAMP(ITG3200_SCAN_ELEMENTS), |
278 | }; | 276 | }; |
279 | 277 | ||
280 | /* IIO device attributes */ | ||
281 | static IIO_DEV_ATTR_SAMP_FREQ(S_IWUSR | S_IRUGO, itg3200_read_frequency, | ||
282 | itg3200_write_frequency); | ||
283 | |||
284 | static struct attribute *itg3200_attributes[] = { | ||
285 | &iio_dev_attr_sampling_frequency.dev_attr.attr, | ||
286 | NULL | ||
287 | }; | ||
288 | |||
289 | static const struct attribute_group itg3200_attribute_group = { | ||
290 | .attrs = itg3200_attributes, | ||
291 | }; | ||
292 | |||
293 | static const struct iio_info itg3200_info = { | 278 | static const struct iio_info itg3200_info = { |
294 | .attrs = &itg3200_attribute_group, | ||
295 | .read_raw = &itg3200_read_raw, | 279 | .read_raw = &itg3200_read_raw, |
280 | .write_raw = &itg3200_write_raw, | ||
296 | .driver_module = THIS_MODULE, | 281 | .driver_module = THIS_MODULE, |
297 | }; | 282 | }; |
298 | 283 | ||
diff --git a/drivers/iio/gyro/st_gyro_core.c b/drivers/iio/gyro/st_gyro_core.c index ed74a9069989..f156fc6c5c6c 100644 --- a/drivers/iio/gyro/st_gyro_core.c +++ b/drivers/iio/gyro/st_gyro_core.c | |||
@@ -245,6 +245,9 @@ static int st_gyro_read_raw(struct iio_dev *indio_dev, | |||
245 | *val = 0; | 245 | *val = 0; |
246 | *val2 = gdata->current_fullscale->gain; | 246 | *val2 = gdata->current_fullscale->gain; |
247 | return IIO_VAL_INT_PLUS_MICRO; | 247 | return IIO_VAL_INT_PLUS_MICRO; |
248 | case IIO_CHAN_INFO_SAMP_FREQ: | ||
249 | *val = gdata->odr; | ||
250 | return IIO_VAL_INT; | ||
248 | default: | 251 | default: |
249 | return -EINVAL; | 252 | return -EINVAL; |
250 | } | 253 | } |
@@ -262,6 +265,13 @@ static int st_gyro_write_raw(struct iio_dev *indio_dev, | |||
262 | case IIO_CHAN_INFO_SCALE: | 265 | case IIO_CHAN_INFO_SCALE: |
263 | err = st_sensors_set_fullscale_by_gain(indio_dev, val2); | 266 | err = st_sensors_set_fullscale_by_gain(indio_dev, val2); |
264 | break; | 267 | break; |
268 | case IIO_CHAN_INFO_SAMP_FREQ: | ||
269 | if (val2) | ||
270 | return -EINVAL; | ||
271 | mutex_lock(&indio_dev->mlock); | ||
272 | err = st_sensors_set_odr(indio_dev, val); | ||
273 | mutex_unlock(&indio_dev->mlock); | ||
274 | return err; | ||
265 | default: | 275 | default: |
266 | err = -EINVAL; | 276 | err = -EINVAL; |
267 | } | 277 | } |
@@ -269,14 +279,12 @@ static int st_gyro_write_raw(struct iio_dev *indio_dev, | |||
269 | return err; | 279 | return err; |
270 | } | 280 | } |
271 | 281 | ||
272 | static ST_SENSOR_DEV_ATTR_SAMP_FREQ(); | ||
273 | static ST_SENSORS_DEV_ATTR_SAMP_FREQ_AVAIL(); | 282 | static ST_SENSORS_DEV_ATTR_SAMP_FREQ_AVAIL(); |
274 | static ST_SENSORS_DEV_ATTR_SCALE_AVAIL(in_anglvel_scale_available); | 283 | static ST_SENSORS_DEV_ATTR_SCALE_AVAIL(in_anglvel_scale_available); |
275 | 284 | ||
276 | static struct attribute *st_gyro_attributes[] = { | 285 | static struct attribute *st_gyro_attributes[] = { |
277 | &iio_dev_attr_sampling_frequency_available.dev_attr.attr, | 286 | &iio_dev_attr_sampling_frequency_available.dev_attr.attr, |
278 | &iio_dev_attr_in_anglvel_scale_available.dev_attr.attr, | 287 | &iio_dev_attr_in_anglvel_scale_available.dev_attr.attr, |
279 | &iio_dev_attr_sampling_frequency.dev_attr.attr, | ||
280 | NULL, | 288 | NULL, |
281 | }; | 289 | }; |
282 | 290 | ||
diff --git a/drivers/iio/gyro/st_gyro_i2c.c b/drivers/iio/gyro/st_gyro_i2c.c index 23c12f361b05..8fa0ad2ef4ef 100644 --- a/drivers/iio/gyro/st_gyro_i2c.c +++ b/drivers/iio/gyro/st_gyro_i2c.c | |||
@@ -18,6 +18,43 @@ | |||
18 | #include <linux/iio/common/st_sensors_i2c.h> | 18 | #include <linux/iio/common/st_sensors_i2c.h> |
19 | #include "st_gyro.h" | 19 | #include "st_gyro.h" |
20 | 20 | ||
21 | #ifdef CONFIG_OF | ||
22 | static const struct of_device_id st_gyro_of_match[] = { | ||
23 | { | ||
24 | .compatible = "st,l3g4200d-gyro", | ||
25 | .data = L3G4200D_GYRO_DEV_NAME, | ||
26 | }, | ||
27 | { | ||
28 | .compatible = "st,lsm330d-gyro", | ||
29 | .data = LSM330D_GYRO_DEV_NAME, | ||
30 | }, | ||
31 | { | ||
32 | .compatible = "st,lsm330dl-gyro", | ||
33 | .data = LSM330DL_GYRO_DEV_NAME, | ||
34 | }, | ||
35 | { | ||
36 | .compatible = "st,lsm330dlc-gyro", | ||
37 | .data = LSM330DLC_GYRO_DEV_NAME, | ||
38 | }, | ||
39 | { | ||
40 | .compatible = "st,l3gd20-gyro", | ||
41 | .data = L3GD20_GYRO_DEV_NAME, | ||
42 | }, | ||
43 | { | ||
44 | .compatible = "st,l3g4is-gyro", | ||
45 | .data = L3G4IS_GYRO_DEV_NAME, | ||
46 | }, | ||
47 | { | ||
48 | .compatible = "st,lsm330-gyro", | ||
49 | .data = LSM330_GYRO_DEV_NAME, | ||
50 | }, | ||
51 | {}, | ||
52 | }; | ||
53 | MODULE_DEVICE_TABLE(of, st_gyro_of_match); | ||
54 | #else | ||
55 | #define st_gyro_of_match NULL | ||
56 | #endif | ||
57 | |||
21 | static int st_gyro_i2c_probe(struct i2c_client *client, | 58 | static int st_gyro_i2c_probe(struct i2c_client *client, |
22 | const struct i2c_device_id *id) | 59 | const struct i2c_device_id *id) |
23 | { | 60 | { |
@@ -31,6 +68,7 @@ static int st_gyro_i2c_probe(struct i2c_client *client, | |||
31 | 68 | ||
32 | gdata = iio_priv(indio_dev); | 69 | gdata = iio_priv(indio_dev); |
33 | gdata->dev = &client->dev; | 70 | gdata->dev = &client->dev; |
71 | st_sensors_of_i2c_probe(client, st_gyro_of_match); | ||
34 | 72 | ||
35 | st_sensors_i2c_configure(indio_dev, client, gdata); | 73 | st_sensors_i2c_configure(indio_dev, client, gdata); |
36 | 74 | ||
@@ -65,6 +103,7 @@ static struct i2c_driver st_gyro_driver = { | |||
65 | .driver = { | 103 | .driver = { |
66 | .owner = THIS_MODULE, | 104 | .owner = THIS_MODULE, |
67 | .name = "st-gyro-i2c", | 105 | .name = "st-gyro-i2c", |
106 | .of_match_table = of_match_ptr(st_gyro_of_match), | ||
68 | }, | 107 | }, |
69 | .probe = st_gyro_i2c_probe, | 108 | .probe = st_gyro_i2c_probe, |
70 | .remove = st_gyro_i2c_remove, | 109 | .remove = st_gyro_i2c_remove, |
diff --git a/drivers/iio/imu/adis16400_buffer.c b/drivers/iio/imu/adis16400_buffer.c index f2cf829e5df1..6e727ffe5262 100644 --- a/drivers/iio/imu/adis16400_buffer.c +++ b/drivers/iio/imu/adis16400_buffer.c | |||
@@ -18,7 +18,7 @@ int adis16400_update_scan_mode(struct iio_dev *indio_dev, | |||
18 | { | 18 | { |
19 | struct adis16400_state *st = iio_priv(indio_dev); | 19 | struct adis16400_state *st = iio_priv(indio_dev); |
20 | struct adis *adis = &st->adis; | 20 | struct adis *adis = &st->adis; |
21 | uint16_t *tx, *rx; | 21 | uint16_t *tx; |
22 | 22 | ||
23 | if (st->variant->flags & ADIS16400_NO_BURST) | 23 | if (st->variant->flags & ADIS16400_NO_BURST) |
24 | return adis_update_scan_mode(indio_dev, scan_mask); | 24 | return adis_update_scan_mode(indio_dev, scan_mask); |
@@ -35,7 +35,6 @@ int adis16400_update_scan_mode(struct iio_dev *indio_dev, | |||
35 | if (!adis->buffer) | 35 | if (!adis->buffer) |
36 | return -ENOMEM; | 36 | return -ENOMEM; |
37 | 37 | ||
38 | rx = adis->buffer; | ||
39 | tx = adis->buffer + indio_dev->scan_bytes; | 38 | tx = adis->buffer + indio_dev->scan_bytes; |
40 | 39 | ||
41 | tx[0] = ADIS_READ_REG(ADIS16400_GLOB_CMD); | 40 | tx[0] = ADIS_READ_REG(ADIS16400_GLOB_CMD); |
diff --git a/drivers/iio/imu/adis16400_core.c b/drivers/iio/imu/adis16400_core.c index 433583b6f800..b70873de04ea 100644 --- a/drivers/iio/imu/adis16400_core.c +++ b/drivers/iio/imu/adis16400_core.c | |||
@@ -214,21 +214,6 @@ static int adis16400_set_freq(struct adis16400_state *st, unsigned int freq) | |||
214 | return adis_write_reg_8(&st->adis, ADIS16400_SMPL_PRD, val); | 214 | return adis_write_reg_8(&st->adis, ADIS16400_SMPL_PRD, val); |
215 | } | 215 | } |
216 | 216 | ||
217 | static ssize_t adis16400_read_frequency(struct device *dev, | ||
218 | struct device_attribute *attr, | ||
219 | char *buf) | ||
220 | { | ||
221 | struct iio_dev *indio_dev = dev_to_iio_dev(dev); | ||
222 | struct adis16400_state *st = iio_priv(indio_dev); | ||
223 | int ret; | ||
224 | |||
225 | ret = st->variant->get_freq(st); | ||
226 | if (ret < 0) | ||
227 | return ret; | ||
228 | |||
229 | return sprintf(buf, "%d.%.3d\n", ret / 1000, ret % 1000); | ||
230 | } | ||
231 | |||
232 | static const unsigned adis16400_3db_divisors[] = { | 217 | static const unsigned adis16400_3db_divisors[] = { |
233 | [0] = 2, /* Special case */ | 218 | [0] = 2, /* Special case */ |
234 | [1] = 6, | 219 | [1] = 6, |
@@ -260,30 +245,6 @@ static int adis16400_set_filter(struct iio_dev *indio_dev, int sps, int val) | |||
260 | return ret; | 245 | return ret; |
261 | } | 246 | } |
262 | 247 | ||
263 | static ssize_t adis16400_write_frequency(struct device *dev, | ||
264 | struct device_attribute *attr, const char *buf, size_t len) | ||
265 | { | ||
266 | struct iio_dev *indio_dev = dev_to_iio_dev(dev); | ||
267 | struct adis16400_state *st = iio_priv(indio_dev); | ||
268 | int i, f, val; | ||
269 | int ret; | ||
270 | |||
271 | ret = iio_str_to_fixpoint(buf, 100, &i, &f); | ||
272 | if (ret) | ||
273 | return ret; | ||
274 | |||
275 | val = i * 1000 + f; | ||
276 | |||
277 | if (val <= 0) | ||
278 | return -EINVAL; | ||
279 | |||
280 | mutex_lock(&indio_dev->mlock); | ||
281 | st->variant->set_freq(st, val); | ||
282 | mutex_unlock(&indio_dev->mlock); | ||
283 | |||
284 | return len; | ||
285 | } | ||
286 | |||
287 | /* Power down the device */ | 248 | /* Power down the device */ |
288 | static int adis16400_stop_device(struct iio_dev *indio_dev) | 249 | static int adis16400_stop_device(struct iio_dev *indio_dev) |
289 | { | 250 | { |
@@ -350,10 +311,6 @@ err_ret: | |||
350 | return ret; | 311 | return ret; |
351 | } | 312 | } |
352 | 313 | ||
353 | static IIO_DEV_ATTR_SAMP_FREQ(S_IWUSR | S_IRUGO, | ||
354 | adis16400_read_frequency, | ||
355 | adis16400_write_frequency); | ||
356 | |||
357 | static const uint8_t adis16400_addresses[] = { | 314 | static const uint8_t adis16400_addresses[] = { |
358 | [ADIS16400_SCAN_GYRO_X] = ADIS16400_XGYRO_OFF, | 315 | [ADIS16400_SCAN_GYRO_X] = ADIS16400_XGYRO_OFF, |
359 | [ADIS16400_SCAN_GYRO_Y] = ADIS16400_YGYRO_OFF, | 316 | [ADIS16400_SCAN_GYRO_Y] = ADIS16400_YGYRO_OFF, |
@@ -394,6 +351,16 @@ static int adis16400_write_raw(struct iio_dev *indio_dev, | |||
394 | val * 1000 + val2 / 1000); | 351 | val * 1000 + val2 / 1000); |
395 | mutex_unlock(&indio_dev->mlock); | 352 | mutex_unlock(&indio_dev->mlock); |
396 | return ret; | 353 | return ret; |
354 | case IIO_CHAN_INFO_SAMP_FREQ: | ||
355 | sps = val * 1000 + val2 / 1000; | ||
356 | |||
357 | if (sps <= 0) | ||
358 | return -EINVAL; | ||
359 | |||
360 | mutex_lock(&indio_dev->mlock); | ||
361 | ret = st->variant->set_freq(st, sps); | ||
362 | mutex_unlock(&indio_dev->mlock); | ||
363 | return ret; | ||
397 | default: | 364 | default: |
398 | return -EINVAL; | 365 | return -EINVAL; |
399 | } | 366 | } |
@@ -474,6 +441,13 @@ static int adis16400_read_raw(struct iio_dev *indio_dev, | |||
474 | if (ret < 0) | 441 | if (ret < 0) |
475 | return ret; | 442 | return ret; |
476 | return IIO_VAL_INT_PLUS_MICRO; | 443 | return IIO_VAL_INT_PLUS_MICRO; |
444 | case IIO_CHAN_INFO_SAMP_FREQ: | ||
445 | ret = st->variant->get_freq(st); | ||
446 | if (ret < 0) | ||
447 | return ret; | ||
448 | *val = ret / 1000; | ||
449 | *val2 = (ret % 1000) * 1000; | ||
450 | return IIO_VAL_INT_PLUS_MICRO; | ||
477 | default: | 451 | default: |
478 | return -EINVAL; | 452 | return -EINVAL; |
479 | } | 453 | } |
@@ -486,6 +460,7 @@ static int adis16400_read_raw(struct iio_dev *indio_dev, | |||
486 | .extend_name = name, \ | 460 | .extend_name = name, \ |
487 | .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \ | 461 | .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \ |
488 | BIT(IIO_CHAN_INFO_SCALE), \ | 462 | BIT(IIO_CHAN_INFO_SCALE), \ |
463 | .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \ | ||
489 | .address = (addr), \ | 464 | .address = (addr), \ |
490 | .scan_index = (si), \ | 465 | .scan_index = (si), \ |
491 | .scan_type = { \ | 466 | .scan_type = { \ |
@@ -511,6 +486,7 @@ static int adis16400_read_raw(struct iio_dev *indio_dev, | |||
511 | BIT(IIO_CHAN_INFO_CALIBBIAS), \ | 486 | BIT(IIO_CHAN_INFO_CALIBBIAS), \ |
512 | .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) | \ | 487 | .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) | \ |
513 | BIT(IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY), \ | 488 | BIT(IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY), \ |
489 | .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \ | ||
514 | .address = addr, \ | 490 | .address = addr, \ |
515 | .scan_index = ADIS16400_SCAN_GYRO_ ## mod, \ | 491 | .scan_index = ADIS16400_SCAN_GYRO_ ## mod, \ |
516 | .scan_type = { \ | 492 | .scan_type = { \ |
@@ -530,6 +506,7 @@ static int adis16400_read_raw(struct iio_dev *indio_dev, | |||
530 | BIT(IIO_CHAN_INFO_CALIBBIAS), \ | 506 | BIT(IIO_CHAN_INFO_CALIBBIAS), \ |
531 | .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) | \ | 507 | .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) | \ |
532 | BIT(IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY), \ | 508 | BIT(IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY), \ |
509 | .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \ | ||
533 | .address = (addr), \ | 510 | .address = (addr), \ |
534 | .scan_index = ADIS16400_SCAN_ACC_ ## mod, \ | 511 | .scan_index = ADIS16400_SCAN_ACC_ ## mod, \ |
535 | .scan_type = { \ | 512 | .scan_type = { \ |
@@ -548,6 +525,7 @@ static int adis16400_read_raw(struct iio_dev *indio_dev, | |||
548 | .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \ | 525 | .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \ |
549 | .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) | \ | 526 | .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) | \ |
550 | BIT(IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY), \ | 527 | BIT(IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY), \ |
528 | .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \ | ||
551 | .address = (addr), \ | 529 | .address = (addr), \ |
552 | .scan_index = ADIS16400_SCAN_MAGN_ ## mod, \ | 530 | .scan_index = ADIS16400_SCAN_MAGN_ ## mod, \ |
553 | .scan_type = { \ | 531 | .scan_type = { \ |
@@ -573,6 +551,7 @@ static int adis16400_read_raw(struct iio_dev *indio_dev, | |||
573 | BIT(IIO_CHAN_INFO_SCALE), \ | 551 | BIT(IIO_CHAN_INFO_SCALE), \ |
574 | .info_mask_shared_by_type = \ | 552 | .info_mask_shared_by_type = \ |
575 | BIT(IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY), \ | 553 | BIT(IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY), \ |
554 | .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \ | ||
576 | .address = (addr), \ | 555 | .address = (addr), \ |
577 | .scan_index = ADIS16350_SCAN_TEMP_ ## mod, \ | 556 | .scan_index = ADIS16350_SCAN_TEMP_ ## mod, \ |
578 | .scan_type = { \ | 557 | .scan_type = { \ |
@@ -591,6 +570,7 @@ static int adis16400_read_raw(struct iio_dev *indio_dev, | |||
591 | .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \ | 570 | .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \ |
592 | BIT(IIO_CHAN_INFO_OFFSET) | \ | 571 | BIT(IIO_CHAN_INFO_OFFSET) | \ |
593 | BIT(IIO_CHAN_INFO_SCALE), \ | 572 | BIT(IIO_CHAN_INFO_SCALE), \ |
573 | .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \ | ||
594 | .address = (addr), \ | 574 | .address = (addr), \ |
595 | .scan_index = ADIS16350_SCAN_TEMP_X, \ | 575 | .scan_index = ADIS16350_SCAN_TEMP_X, \ |
596 | .scan_type = { \ | 576 | .scan_type = { \ |
@@ -608,6 +588,7 @@ static int adis16400_read_raw(struct iio_dev *indio_dev, | |||
608 | .channel2 = IIO_MOD_ ## mod, \ | 588 | .channel2 = IIO_MOD_ ## mod, \ |
609 | .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \ | 589 | .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \ |
610 | .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), \ | 590 | .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), \ |
591 | .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \ | ||
611 | .address = (addr), \ | 592 | .address = (addr), \ |
612 | .scan_index = ADIS16300_SCAN_INCLI_ ## mod, \ | 593 | .scan_index = ADIS16300_SCAN_INCLI_ ## mod, \ |
613 | .scan_type = { \ | 594 | .scan_type = { \ |
@@ -649,6 +630,7 @@ static const struct iio_chan_spec adis16448_channels[] = { | |||
649 | .type = IIO_PRESSURE, | 630 | .type = IIO_PRESSURE, |
650 | .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), | 631 | .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), |
651 | .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), | 632 | .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), |
633 | .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), | ||
652 | .address = ADIS16448_BARO_OUT, | 634 | .address = ADIS16448_BARO_OUT, |
653 | .scan_index = ADIS16400_SCAN_BARO, | 635 | .scan_index = ADIS16400_SCAN_BARO, |
654 | .scan_type = { | 636 | .scan_type = { |
@@ -704,15 +686,6 @@ static const struct iio_chan_spec adis16334_channels[] = { | |||
704 | IIO_CHAN_SOFT_TIMESTAMP(ADIS16400_SCAN_TIMESTAMP), | 686 | IIO_CHAN_SOFT_TIMESTAMP(ADIS16400_SCAN_TIMESTAMP), |
705 | }; | 687 | }; |
706 | 688 | ||
707 | static struct attribute *adis16400_attributes[] = { | ||
708 | &iio_dev_attr_sampling_frequency.dev_attr.attr, | ||
709 | NULL | ||
710 | }; | ||
711 | |||
712 | static const struct attribute_group adis16400_attribute_group = { | ||
713 | .attrs = adis16400_attributes, | ||
714 | }; | ||
715 | |||
716 | static struct adis16400_chip_info adis16400_chips[] = { | 689 | static struct adis16400_chip_info adis16400_chips[] = { |
717 | [ADIS16300] = { | 690 | [ADIS16300] = { |
718 | .channels = adis16300_channels, | 691 | .channels = adis16300_channels, |
@@ -813,7 +786,6 @@ static const struct iio_info adis16400_info = { | |||
813 | .driver_module = THIS_MODULE, | 786 | .driver_module = THIS_MODULE, |
814 | .read_raw = &adis16400_read_raw, | 787 | .read_raw = &adis16400_read_raw, |
815 | .write_raw = &adis16400_write_raw, | 788 | .write_raw = &adis16400_write_raw, |
816 | .attrs = &adis16400_attribute_group, | ||
817 | .update_scan_mode = adis16400_update_scan_mode, | 789 | .update_scan_mode = adis16400_update_scan_mode, |
818 | .debugfs_reg_access = adis_debugfs_reg_access, | 790 | .debugfs_reg_access = adis_debugfs_reg_access, |
819 | }; | 791 | }; |
diff --git a/drivers/iio/imu/adis16480.c b/drivers/iio/imu/adis16480.c index dd4206cac62d..989605dd6f78 100644 --- a/drivers/iio/imu/adis16480.c +++ b/drivers/iio/imu/adis16480.c | |||
@@ -257,11 +257,16 @@ static int adis16480_debugfs_init(struct iio_dev *indio_dev) | |||
257 | 257 | ||
258 | #endif | 258 | #endif |
259 | 259 | ||
260 | static int adis16480_set_freq(struct adis16480 *st, unsigned int freq) | 260 | static int adis16480_set_freq(struct iio_dev *indio_dev, int val, int val2) |
261 | { | 261 | { |
262 | struct adis16480 *st = iio_priv(indio_dev); | ||
262 | unsigned int t; | 263 | unsigned int t; |
263 | 264 | ||
264 | t = 2460000 / freq; | 265 | t = val * 1000 + val2 / 1000; |
266 | if (t <= 0) | ||
267 | return -EINVAL; | ||
268 | |||
269 | t = 2460000 / t; | ||
265 | if (t > 2048) | 270 | if (t > 2048) |
266 | t = 2048; | 271 | t = 2048; |
267 | 272 | ||
@@ -271,65 +276,24 @@ static int adis16480_set_freq(struct adis16480 *st, unsigned int freq) | |||
271 | return adis_write_reg_16(&st->adis, ADIS16480_REG_DEC_RATE, t); | 276 | return adis_write_reg_16(&st->adis, ADIS16480_REG_DEC_RATE, t); |
272 | } | 277 | } |
273 | 278 | ||
274 | static int adis16480_get_freq(struct adis16480 *st, unsigned int *freq) | 279 | static int adis16480_get_freq(struct iio_dev *indio_dev, int *val, int *val2) |
275 | { | 280 | { |
281 | struct adis16480 *st = iio_priv(indio_dev); | ||
276 | uint16_t t; | 282 | uint16_t t; |
277 | int ret; | 283 | int ret; |
284 | unsigned freq; | ||
278 | 285 | ||
279 | ret = adis_read_reg_16(&st->adis, ADIS16480_REG_DEC_RATE, &t); | 286 | ret = adis_read_reg_16(&st->adis, ADIS16480_REG_DEC_RATE, &t); |
280 | if (ret < 0) | 287 | if (ret < 0) |
281 | return ret; | 288 | return ret; |
282 | 289 | ||
283 | *freq = 2460000 / (t + 1); | 290 | freq = 2460000 / (t + 1); |
291 | *val = freq / 1000; | ||
292 | *val2 = (freq % 1000) * 1000; | ||
284 | 293 | ||
285 | return 0; | 294 | return IIO_VAL_INT_PLUS_MICRO; |
286 | } | 295 | } |
287 | 296 | ||
288 | static ssize_t adis16480_read_frequency(struct device *dev, | ||
289 | struct device_attribute *attr, | ||
290 | char *buf) | ||
291 | { | ||
292 | struct iio_dev *indio_dev = dev_to_iio_dev(dev); | ||
293 | struct adis16480 *st = iio_priv(indio_dev); | ||
294 | unsigned int freq; | ||
295 | int ret; | ||
296 | |||
297 | ret = adis16480_get_freq(st, &freq); | ||
298 | if (ret < 0) | ||
299 | return ret; | ||
300 | |||
301 | return sprintf(buf, "%d.%.3d\n", freq / 1000, freq % 1000); | ||
302 | } | ||
303 | |||
304 | static ssize_t adis16480_write_frequency(struct device *dev, | ||
305 | struct device_attribute *attr, | ||
306 | const char *buf, | ||
307 | size_t len) | ||
308 | { | ||
309 | struct iio_dev *indio_dev = dev_to_iio_dev(dev); | ||
310 | struct adis16480 *st = iio_priv(indio_dev); | ||
311 | int freq_int, freq_fract; | ||
312 | long val; | ||
313 | int ret; | ||
314 | |||
315 | ret = iio_str_to_fixpoint(buf, 100, &freq_int, &freq_fract); | ||
316 | if (ret) | ||
317 | return ret; | ||
318 | |||
319 | val = freq_int * 1000 + freq_fract; | ||
320 | |||
321 | if (val <= 0) | ||
322 | return -EINVAL; | ||
323 | |||
324 | ret = adis16480_set_freq(st, val); | ||
325 | |||
326 | return ret ? ret : len; | ||
327 | } | ||
328 | |||
329 | static IIO_DEV_ATTR_SAMP_FREQ(S_IWUSR | S_IRUGO, | ||
330 | adis16480_read_frequency, | ||
331 | adis16480_write_frequency); | ||
332 | |||
333 | enum { | 297 | enum { |
334 | ADIS16480_SCAN_GYRO_X, | 298 | ADIS16480_SCAN_GYRO_X, |
335 | ADIS16480_SCAN_GYRO_Y, | 299 | ADIS16480_SCAN_GYRO_Y, |
@@ -571,6 +535,8 @@ static int adis16480_read_raw(struct iio_dev *indio_dev, | |||
571 | return adis16480_get_calibscale(indio_dev, chan, val); | 535 | return adis16480_get_calibscale(indio_dev, chan, val); |
572 | case IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY: | 536 | case IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY: |
573 | return adis16480_get_filter_freq(indio_dev, chan, val); | 537 | return adis16480_get_filter_freq(indio_dev, chan, val); |
538 | case IIO_CHAN_INFO_SAMP_FREQ: | ||
539 | return adis16480_get_freq(indio_dev, val, val2); | ||
574 | default: | 540 | default: |
575 | return -EINVAL; | 541 | return -EINVAL; |
576 | } | 542 | } |
@@ -586,6 +552,9 @@ static int adis16480_write_raw(struct iio_dev *indio_dev, | |||
586 | return adis16480_set_calibscale(indio_dev, chan, val); | 552 | return adis16480_set_calibscale(indio_dev, chan, val); |
587 | case IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY: | 553 | case IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY: |
588 | return adis16480_set_filter_freq(indio_dev, chan, val); | 554 | return adis16480_set_filter_freq(indio_dev, chan, val); |
555 | case IIO_CHAN_INFO_SAMP_FREQ: | ||
556 | return adis16480_set_freq(indio_dev, val, val2); | ||
557 | |||
589 | default: | 558 | default: |
590 | return -EINVAL; | 559 | return -EINVAL; |
591 | } | 560 | } |
@@ -600,6 +569,7 @@ static int adis16480_write_raw(struct iio_dev *indio_dev, | |||
600 | BIT(IIO_CHAN_INFO_CALIBBIAS) | \ | 569 | BIT(IIO_CHAN_INFO_CALIBBIAS) | \ |
601 | _info_sep, \ | 570 | _info_sep, \ |
602 | .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), \ | 571 | .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), \ |
572 | .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \ | ||
603 | .address = (_address), \ | 573 | .address = (_address), \ |
604 | .scan_index = (_si), \ | 574 | .scan_index = (_si), \ |
605 | .scan_type = { \ | 575 | .scan_type = { \ |
@@ -638,6 +608,7 @@ static int adis16480_write_raw(struct iio_dev *indio_dev, | |||
638 | .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \ | 608 | .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \ |
639 | BIT(IIO_CHAN_INFO_CALIBBIAS) | \ | 609 | BIT(IIO_CHAN_INFO_CALIBBIAS) | \ |
640 | BIT(IIO_CHAN_INFO_SCALE), \ | 610 | BIT(IIO_CHAN_INFO_SCALE), \ |
611 | .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \ | ||
641 | .address = ADIS16480_REG_BAROM_OUT, \ | 612 | .address = ADIS16480_REG_BAROM_OUT, \ |
642 | .scan_index = ADIS16480_SCAN_BARO, \ | 613 | .scan_index = ADIS16480_SCAN_BARO, \ |
643 | .scan_type = { \ | 614 | .scan_type = { \ |
@@ -655,6 +626,7 @@ static int adis16480_write_raw(struct iio_dev *indio_dev, | |||
655 | .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \ | 626 | .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \ |
656 | BIT(IIO_CHAN_INFO_SCALE) | \ | 627 | BIT(IIO_CHAN_INFO_SCALE) | \ |
657 | BIT(IIO_CHAN_INFO_OFFSET), \ | 628 | BIT(IIO_CHAN_INFO_OFFSET), \ |
629 | .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \ | ||
658 | .address = ADIS16480_REG_TEMP_OUT, \ | 630 | .address = ADIS16480_REG_TEMP_OUT, \ |
659 | .scan_index = ADIS16480_SCAN_TEMP, \ | 631 | .scan_index = ADIS16480_SCAN_TEMP, \ |
660 | .scan_type = { \ | 632 | .scan_type = { \ |
@@ -717,17 +689,7 @@ static const struct adis16480_chip_info adis16480_chip_info[] = { | |||
717 | }, | 689 | }, |
718 | }; | 690 | }; |
719 | 691 | ||
720 | static struct attribute *adis16480_attributes[] = { | ||
721 | &iio_dev_attr_sampling_frequency.dev_attr.attr, | ||
722 | NULL | ||
723 | }; | ||
724 | |||
725 | static const struct attribute_group adis16480_attribute_group = { | ||
726 | .attrs = adis16480_attributes, | ||
727 | }; | ||
728 | |||
729 | static const struct iio_info adis16480_info = { | 692 | static const struct iio_info adis16480_info = { |
730 | .attrs = &adis16480_attribute_group, | ||
731 | .read_raw = &adis16480_read_raw, | 693 | .read_raw = &adis16480_read_raw, |
732 | .write_raw = &adis16480_write_raw, | 694 | .write_raw = &adis16480_write_raw, |
733 | .update_scan_mode = adis_update_scan_mode, | 695 | .update_scan_mode = adis_update_scan_mode, |
diff --git a/drivers/iio/industrialio-event.c b/drivers/iio/industrialio-event.c index 258a973a1fb8..35a5b0311dae 100644 --- a/drivers/iio/industrialio-event.c +++ b/drivers/iio/industrialio-event.c | |||
@@ -209,6 +209,7 @@ static const char * const iio_ev_info_text[] = { | |||
209 | [IIO_EV_INFO_ENABLE] = "en", | 209 | [IIO_EV_INFO_ENABLE] = "en", |
210 | [IIO_EV_INFO_VALUE] = "value", | 210 | [IIO_EV_INFO_VALUE] = "value", |
211 | [IIO_EV_INFO_HYSTERESIS] = "hysteresis", | 211 | [IIO_EV_INFO_HYSTERESIS] = "hysteresis", |
212 | [IIO_EV_INFO_PERIOD] = "period", | ||
212 | }; | 213 | }; |
213 | 214 | ||
214 | static enum iio_event_direction iio_ev_attr_dir(struct iio_dev_attr *attr) | 215 | static enum iio_event_direction iio_ev_attr_dir(struct iio_dev_attr *attr) |
diff --git a/drivers/iio/light/Kconfig b/drivers/iio/light/Kconfig index c89740d4748f..bf05ca5b0a57 100644 --- a/drivers/iio/light/Kconfig +++ b/drivers/iio/light/Kconfig | |||
@@ -62,6 +62,18 @@ config GP2AP020A00F | |||
62 | To compile this driver as a module, choose M here: the | 62 | To compile this driver as a module, choose M here: the |
63 | module will be called gp2ap020a00f. | 63 | module will be called gp2ap020a00f. |
64 | 64 | ||
65 | config ISL29125 | ||
66 | tristate "Intersil ISL29125 digital color light sensor" | ||
67 | depends on I2C | ||
68 | select IIO_BUFFER | ||
69 | select IIO_TRIGGERED_BUFFER | ||
70 | help | ||
71 | Say Y here if you want to build a driver for the Intersil ISL29125 | ||
72 | RGB light sensor for I2C. | ||
73 | |||
74 | To compile this driver as a module, choose M here: the module will be | ||
75 | called isl29125. | ||
76 | |||
65 | config HID_SENSOR_ALS | 77 | config HID_SENSOR_ALS |
66 | depends on HID_SENSOR_HUB | 78 | depends on HID_SENSOR_HUB |
67 | select IIO_BUFFER | 79 | select IIO_BUFFER |
@@ -116,6 +128,18 @@ config LTR501 | |||
116 | This driver can also be built as a module. If so, the module | 128 | This driver can also be built as a module. If so, the module |
117 | will be called ltr501. | 129 | will be called ltr501. |
118 | 130 | ||
131 | config TCS3414 | ||
132 | tristate "TAOS TCS3414 digital color sensor" | ||
133 | depends on I2C | ||
134 | select IIO_BUFFER | ||
135 | select IIO_TRIGGERED_BUFFER | ||
136 | help | ||
137 | If you say yes here you get support for the TAOS TCS3414 | ||
138 | family of digital color sensors. | ||
139 | |||
140 | This driver can also be built as a module. If so, the module | ||
141 | will be called tcs3414. | ||
142 | |||
119 | config TCS3472 | 143 | config TCS3472 |
120 | tristate "TAOS TCS3472 color light-to-digital converter" | 144 | tristate "TAOS TCS3472 color light-to-digital converter" |
121 | depends on I2C | 145 | depends on I2C |
diff --git a/drivers/iio/light/Makefile b/drivers/iio/light/Makefile index 3eb36e5151fa..8b8c09f9c1f8 100644 --- a/drivers/iio/light/Makefile +++ b/drivers/iio/light/Makefile | |||
@@ -10,9 +10,11 @@ obj-$(CONFIG_CM36651) += cm36651.o | |||
10 | obj-$(CONFIG_GP2AP020A00F) += gp2ap020a00f.o | 10 | obj-$(CONFIG_GP2AP020A00F) += gp2ap020a00f.o |
11 | obj-$(CONFIG_HID_SENSOR_ALS) += hid-sensor-als.o | 11 | obj-$(CONFIG_HID_SENSOR_ALS) += hid-sensor-als.o |
12 | obj-$(CONFIG_HID_SENSOR_PROX) += hid-sensor-prox.o | 12 | obj-$(CONFIG_HID_SENSOR_PROX) += hid-sensor-prox.o |
13 | obj-$(CONFIG_ISL29125) += isl29125.o | ||
13 | obj-$(CONFIG_SENSORS_LM3533) += lm3533-als.o | 14 | obj-$(CONFIG_SENSORS_LM3533) += lm3533-als.o |
14 | obj-$(CONFIG_LTR501) += ltr501.o | 15 | obj-$(CONFIG_LTR501) += ltr501.o |
15 | obj-$(CONFIG_SENSORS_TSL2563) += tsl2563.o | 16 | obj-$(CONFIG_SENSORS_TSL2563) += tsl2563.o |
17 | obj-$(CONFIG_TCS3414) += tcs3414.o | ||
16 | obj-$(CONFIG_TCS3472) += tcs3472.o | 18 | obj-$(CONFIG_TCS3472) += tcs3472.o |
17 | obj-$(CONFIG_TSL4531) += tsl4531.o | 19 | obj-$(CONFIG_TSL4531) += tsl4531.o |
18 | obj-$(CONFIG_VCNL4000) += vcnl4000.o | 20 | obj-$(CONFIG_VCNL4000) += vcnl4000.o |
diff --git a/drivers/iio/light/isl29125.c b/drivers/iio/light/isl29125.c new file mode 100644 index 000000000000..c82f4a6f8464 --- /dev/null +++ b/drivers/iio/light/isl29125.c | |||
@@ -0,0 +1,347 @@ | |||
1 | /* | ||
2 | * isl29125.c - Support for Intersil ISL29125 RGB light sensor | ||
3 | * | ||
4 | * Copyright (c) 2014 Peter Meerwald <pmeerw@pmeerw.net> | ||
5 | * | ||
6 | * This file is subject to the terms and conditions of version 2 of | ||
7 | * the GNU General Public License. See the file COPYING in the main | ||
8 | * directory of this archive for more details. | ||
9 | * | ||
10 | * RGB light sensor with 16-bit channels for red, green, blue); | ||
11 | * 7-bit I2C slave address 0x44 | ||
12 | * | ||
13 | * TODO: interrupt support, IR compensation, thresholds, 12bit | ||
14 | */ | ||
15 | |||
16 | #include <linux/module.h> | ||
17 | #include <linux/i2c.h> | ||
18 | #include <linux/delay.h> | ||
19 | #include <linux/pm.h> | ||
20 | |||
21 | #include <linux/iio/iio.h> | ||
22 | #include <linux/iio/sysfs.h> | ||
23 | #include <linux/iio/trigger_consumer.h> | ||
24 | #include <linux/iio/buffer.h> | ||
25 | #include <linux/iio/triggered_buffer.h> | ||
26 | |||
27 | #define ISL29125_DRV_NAME "isl29125" | ||
28 | |||
29 | #define ISL29125_DEVICE_ID 0x00 | ||
30 | #define ISL29125_CONF1 0x01 | ||
31 | #define ISL29125_CONF2 0x02 | ||
32 | #define ISL29125_CONF3 0x03 | ||
33 | #define ISL29125_STATUS 0x08 | ||
34 | #define ISL29125_GREEN_DATA 0x09 | ||
35 | #define ISL29125_RED_DATA 0x0b | ||
36 | #define ISL29125_BLUE_DATA 0x0d | ||
37 | |||
38 | #define ISL29125_ID 0x7d | ||
39 | |||
40 | #define ISL29125_MODE_MASK GENMASK(2, 0) | ||
41 | #define ISL29125_MODE_PD 0x0 | ||
42 | #define ISL29125_MODE_G 0x1 | ||
43 | #define ISL29125_MODE_R 0x2 | ||
44 | #define ISL29125_MODE_B 0x3 | ||
45 | #define ISL29125_MODE_RGB 0x5 | ||
46 | |||
47 | #define ISL29125_MODE_RANGE BIT(3) | ||
48 | |||
49 | #define ISL29125_STATUS_CONV BIT(1) | ||
50 | |||
51 | struct isl29125_data { | ||
52 | struct i2c_client *client; | ||
53 | struct mutex lock; | ||
54 | u8 conf1; | ||
55 | u16 buffer[8]; /* 3x 16-bit, padding, 8 bytes timestamp */ | ||
56 | }; | ||
57 | |||
58 | #define ISL29125_CHANNEL(_color, _si) { \ | ||
59 | .type = IIO_INTENSITY, \ | ||
60 | .modified = 1, \ | ||
61 | .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \ | ||
62 | .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), \ | ||
63 | .channel2 = IIO_MOD_LIGHT_##_color, \ | ||
64 | .scan_index = _si, \ | ||
65 | .scan_type = { \ | ||
66 | .sign = 'u', \ | ||
67 | .realbits = 16, \ | ||
68 | .storagebits = 16, \ | ||
69 | .endianness = IIO_CPU, \ | ||
70 | }, \ | ||
71 | } | ||
72 | |||
73 | static const struct iio_chan_spec isl29125_channels[] = { | ||
74 | ISL29125_CHANNEL(GREEN, 0), | ||
75 | ISL29125_CHANNEL(RED, 1), | ||
76 | ISL29125_CHANNEL(BLUE, 2), | ||
77 | IIO_CHAN_SOFT_TIMESTAMP(3), | ||
78 | }; | ||
79 | |||
80 | static const struct { | ||
81 | u8 mode, data; | ||
82 | } isl29125_regs[] = { | ||
83 | {ISL29125_MODE_G, ISL29125_GREEN_DATA}, | ||
84 | {ISL29125_MODE_R, ISL29125_RED_DATA}, | ||
85 | {ISL29125_MODE_B, ISL29125_BLUE_DATA}, | ||
86 | }; | ||
87 | |||
88 | static int isl29125_read_data(struct isl29125_data *data, int si) | ||
89 | { | ||
90 | int tries = 5; | ||
91 | int ret; | ||
92 | |||
93 | ret = i2c_smbus_write_byte_data(data->client, ISL29125_CONF1, | ||
94 | data->conf1 | isl29125_regs[si].mode); | ||
95 | if (ret < 0) | ||
96 | return ret; | ||
97 | |||
98 | msleep(101); | ||
99 | |||
100 | while (tries--) { | ||
101 | ret = i2c_smbus_read_byte_data(data->client, ISL29125_STATUS); | ||
102 | if (ret < 0) | ||
103 | goto fail; | ||
104 | if (ret & ISL29125_STATUS_CONV) | ||
105 | break; | ||
106 | msleep(20); | ||
107 | } | ||
108 | |||
109 | if (tries < 0) { | ||
110 | dev_err(&data->client->dev, "data not ready\n"); | ||
111 | ret = -EIO; | ||
112 | goto fail; | ||
113 | } | ||
114 | |||
115 | ret = i2c_smbus_read_word_data(data->client, isl29125_regs[si].data); | ||
116 | |||
117 | fail: | ||
118 | i2c_smbus_write_byte_data(data->client, ISL29125_CONF1, data->conf1); | ||
119 | return ret; | ||
120 | } | ||
121 | |||
122 | static int isl29125_read_raw(struct iio_dev *indio_dev, | ||
123 | struct iio_chan_spec const *chan, | ||
124 | int *val, int *val2, long mask) | ||
125 | { | ||
126 | struct isl29125_data *data = iio_priv(indio_dev); | ||
127 | int ret; | ||
128 | |||
129 | switch (mask) { | ||
130 | case IIO_CHAN_INFO_RAW: | ||
131 | if (iio_buffer_enabled(indio_dev)) | ||
132 | return -EBUSY; | ||
133 | mutex_lock(&data->lock); | ||
134 | ret = isl29125_read_data(data, chan->scan_index); | ||
135 | mutex_unlock(&data->lock); | ||
136 | if (ret < 0) | ||
137 | return ret; | ||
138 | *val = ret; | ||
139 | return IIO_VAL_INT; | ||
140 | case IIO_CHAN_INFO_SCALE: | ||
141 | *val = 0; | ||
142 | if (data->conf1 & ISL29125_MODE_RANGE) | ||
143 | *val2 = 152590; /* 10k lux full range */ | ||
144 | else | ||
145 | *val2 = 5722; /* 375 lux full range */ | ||
146 | return IIO_VAL_INT_PLUS_MICRO; | ||
147 | } | ||
148 | return -EINVAL; | ||
149 | } | ||
150 | |||
151 | static int isl29125_write_raw(struct iio_dev *indio_dev, | ||
152 | struct iio_chan_spec const *chan, | ||
153 | int val, int val2, long mask) | ||
154 | { | ||
155 | struct isl29125_data *data = iio_priv(indio_dev); | ||
156 | |||
157 | switch (mask) { | ||
158 | case IIO_CHAN_INFO_SCALE: | ||
159 | if (val != 0) | ||
160 | return -EINVAL; | ||
161 | if (val2 == 152590) | ||
162 | data->conf1 |= ISL29125_MODE_RANGE; | ||
163 | else if (val2 == 5722) | ||
164 | data->conf1 &= ~ISL29125_MODE_RANGE; | ||
165 | else | ||
166 | return -EINVAL; | ||
167 | return i2c_smbus_write_byte_data(data->client, ISL29125_CONF1, | ||
168 | data->conf1); | ||
169 | default: | ||
170 | return -EINVAL; | ||
171 | } | ||
172 | } | ||
173 | |||
174 | static irqreturn_t isl29125_trigger_handler(int irq, void *p) | ||
175 | { | ||
176 | struct iio_poll_func *pf = p; | ||
177 | struct iio_dev *indio_dev = pf->indio_dev; | ||
178 | struct isl29125_data *data = iio_priv(indio_dev); | ||
179 | int i, j = 0; | ||
180 | |||
181 | for_each_set_bit(i, indio_dev->active_scan_mask, | ||
182 | indio_dev->masklength) { | ||
183 | int ret = i2c_smbus_read_word_data(data->client, | ||
184 | isl29125_regs[i].data); | ||
185 | if (ret < 0) | ||
186 | goto done; | ||
187 | |||
188 | data->buffer[j++] = ret; | ||
189 | } | ||
190 | |||
191 | iio_push_to_buffers_with_timestamp(indio_dev, data->buffer, | ||
192 | iio_get_time_ns()); | ||
193 | |||
194 | done: | ||
195 | iio_trigger_notify_done(indio_dev->trig); | ||
196 | |||
197 | return IRQ_HANDLED; | ||
198 | } | ||
199 | |||
200 | static const struct iio_info isl29125_info = { | ||
201 | .read_raw = isl29125_read_raw, | ||
202 | .write_raw = isl29125_write_raw, | ||
203 | .driver_module = THIS_MODULE, | ||
204 | }; | ||
205 | |||
206 | static int isl29125_buffer_preenable(struct iio_dev *indio_dev) | ||
207 | { | ||
208 | struct isl29125_data *data = iio_priv(indio_dev); | ||
209 | |||
210 | data->conf1 |= ISL29125_MODE_RGB; | ||
211 | return i2c_smbus_write_byte_data(data->client, ISL29125_CONF1, | ||
212 | data->conf1); | ||
213 | } | ||
214 | |||
215 | static int isl29125_buffer_predisable(struct iio_dev *indio_dev) | ||
216 | { | ||
217 | struct isl29125_data *data = iio_priv(indio_dev); | ||
218 | int ret; | ||
219 | |||
220 | ret = iio_triggered_buffer_predisable(indio_dev); | ||
221 | if (ret < 0) | ||
222 | return ret; | ||
223 | |||
224 | data->conf1 &= ~ISL29125_MODE_MASK; | ||
225 | data->conf1 |= ISL29125_MODE_PD; | ||
226 | return i2c_smbus_write_byte_data(data->client, ISL29125_CONF1, | ||
227 | data->conf1); | ||
228 | } | ||
229 | |||
230 | static const struct iio_buffer_setup_ops isl29125_buffer_setup_ops = { | ||
231 | .preenable = isl29125_buffer_preenable, | ||
232 | .postenable = &iio_triggered_buffer_postenable, | ||
233 | .predisable = isl29125_buffer_predisable, | ||
234 | }; | ||
235 | |||
236 | static int isl29125_probe(struct i2c_client *client, | ||
237 | const struct i2c_device_id *id) | ||
238 | { | ||
239 | struct isl29125_data *data; | ||
240 | struct iio_dev *indio_dev; | ||
241 | int ret; | ||
242 | |||
243 | indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data)); | ||
244 | if (indio_dev == NULL) | ||
245 | return -ENOMEM; | ||
246 | |||
247 | data = iio_priv(indio_dev); | ||
248 | i2c_set_clientdata(client, indio_dev); | ||
249 | data->client = client; | ||
250 | mutex_init(&data->lock); | ||
251 | |||
252 | indio_dev->dev.parent = &client->dev; | ||
253 | indio_dev->info = &isl29125_info; | ||
254 | indio_dev->name = ISL29125_DRV_NAME; | ||
255 | indio_dev->channels = isl29125_channels; | ||
256 | indio_dev->num_channels = ARRAY_SIZE(isl29125_channels); | ||
257 | indio_dev->modes = INDIO_DIRECT_MODE; | ||
258 | |||
259 | ret = i2c_smbus_read_byte_data(data->client, ISL29125_DEVICE_ID); | ||
260 | if (ret < 0) | ||
261 | return ret; | ||
262 | if (ret != ISL29125_ID) | ||
263 | return -ENODEV; | ||
264 | |||
265 | data->conf1 = ISL29125_MODE_PD | ISL29125_MODE_RANGE; | ||
266 | ret = i2c_smbus_write_byte_data(data->client, ISL29125_CONF1, | ||
267 | data->conf1); | ||
268 | if (ret < 0) | ||
269 | return ret; | ||
270 | |||
271 | ret = i2c_smbus_write_byte_data(data->client, ISL29125_STATUS, 0); | ||
272 | if (ret < 0) | ||
273 | return ret; | ||
274 | |||
275 | ret = iio_triggered_buffer_setup(indio_dev, NULL, | ||
276 | isl29125_trigger_handler, &isl29125_buffer_setup_ops); | ||
277 | if (ret < 0) | ||
278 | return ret; | ||
279 | |||
280 | ret = iio_device_register(indio_dev); | ||
281 | if (ret < 0) | ||
282 | goto buffer_cleanup; | ||
283 | |||
284 | return 0; | ||
285 | |||
286 | buffer_cleanup: | ||
287 | iio_triggered_buffer_cleanup(indio_dev); | ||
288 | return ret; | ||
289 | } | ||
290 | |||
291 | static int isl29125_powerdown(struct isl29125_data *data) | ||
292 | { | ||
293 | return i2c_smbus_write_byte_data(data->client, ISL29125_CONF1, | ||
294 | (data->conf1 & ~ISL29125_MODE_MASK) | ISL29125_MODE_PD); | ||
295 | } | ||
296 | |||
297 | static int isl29125_remove(struct i2c_client *client) | ||
298 | { | ||
299 | struct iio_dev *indio_dev = i2c_get_clientdata(client); | ||
300 | |||
301 | iio_device_unregister(indio_dev); | ||
302 | iio_triggered_buffer_cleanup(indio_dev); | ||
303 | isl29125_powerdown(iio_priv(indio_dev)); | ||
304 | |||
305 | return 0; | ||
306 | } | ||
307 | |||
308 | #ifdef CONFIG_PM_SLEEP | ||
309 | static int isl29125_suspend(struct device *dev) | ||
310 | { | ||
311 | struct isl29125_data *data = iio_priv(i2c_get_clientdata( | ||
312 | to_i2c_client(dev))); | ||
313 | return isl29125_powerdown(data); | ||
314 | } | ||
315 | |||
316 | static int isl29125_resume(struct device *dev) | ||
317 | { | ||
318 | struct isl29125_data *data = iio_priv(i2c_get_clientdata( | ||
319 | to_i2c_client(dev))); | ||
320 | return i2c_smbus_write_byte_data(data->client, ISL29125_CONF1, | ||
321 | data->conf1); | ||
322 | } | ||
323 | #endif | ||
324 | |||
325 | static SIMPLE_DEV_PM_OPS(isl29125_pm_ops, isl29125_suspend, isl29125_resume); | ||
326 | |||
327 | static const struct i2c_device_id isl29125_id[] = { | ||
328 | { "isl29125", 0 }, | ||
329 | { } | ||
330 | }; | ||
331 | MODULE_DEVICE_TABLE(i2c, isl29125_id); | ||
332 | |||
333 | static struct i2c_driver isl29125_driver = { | ||
334 | .driver = { | ||
335 | .name = ISL29125_DRV_NAME, | ||
336 | .pm = &isl29125_pm_ops, | ||
337 | .owner = THIS_MODULE, | ||
338 | }, | ||
339 | .probe = isl29125_probe, | ||
340 | .remove = isl29125_remove, | ||
341 | .id_table = isl29125_id, | ||
342 | }; | ||
343 | module_i2c_driver(isl29125_driver); | ||
344 | |||
345 | MODULE_AUTHOR("Peter Meerwald <pmeerw@pmeerw.net>"); | ||
346 | MODULE_DESCRIPTION("ISL29125 RGB light sensor driver"); | ||
347 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/iio/light/tcs3414.c b/drivers/iio/light/tcs3414.c new file mode 100644 index 000000000000..a9e449b0be0c --- /dev/null +++ b/drivers/iio/light/tcs3414.c | |||
@@ -0,0 +1,405 @@ | |||
1 | /* | ||
2 | * tcs3414.c - Support for TAOS TCS3414 digital color sensor | ||
3 | * | ||
4 | * Copyright (c) 2014 Peter Meerwald <pmeerw@pmeerw.net> | ||
5 | * | ||
6 | * This file is subject to the terms and conditions of version 2 of | ||
7 | * the GNU General Public License. See the file COPYING in the main | ||
8 | * directory of this archive for more details. | ||
9 | * | ||
10 | * Digital color sensor with 16-bit channels for red, green, blue, clear); | ||
11 | * 7-bit I2C slave address 0x39 (TCS3414) or 0x29, 0x49, 0x59 (TCS3413, | ||
12 | * TCS3415, TCS3416, resp.) | ||
13 | * | ||
14 | * TODO: sync, interrupt support, thresholds, prescaler | ||
15 | */ | ||
16 | |||
17 | #include <linux/module.h> | ||
18 | #include <linux/i2c.h> | ||
19 | #include <linux/delay.h> | ||
20 | #include <linux/pm.h> | ||
21 | |||
22 | #include <linux/iio/iio.h> | ||
23 | #include <linux/iio/sysfs.h> | ||
24 | #include <linux/iio/trigger_consumer.h> | ||
25 | #include <linux/iio/buffer.h> | ||
26 | #include <linux/iio/triggered_buffer.h> | ||
27 | |||
28 | #define TCS3414_DRV_NAME "tcs3414" | ||
29 | |||
30 | #define TCS3414_COMMAND BIT(7) | ||
31 | #define TCS3414_COMMAND_WORD (TCS3414_COMMAND | BIT(5)) | ||
32 | |||
33 | #define TCS3414_CONTROL (TCS3414_COMMAND | 0x00) | ||
34 | #define TCS3414_TIMING (TCS3414_COMMAND | 0x01) | ||
35 | #define TCS3414_ID (TCS3414_COMMAND | 0x04) | ||
36 | #define TCS3414_GAIN (TCS3414_COMMAND | 0x07) | ||
37 | #define TCS3414_DATA_GREEN (TCS3414_COMMAND_WORD | 0x10) | ||
38 | #define TCS3414_DATA_RED (TCS3414_COMMAND_WORD | 0x12) | ||
39 | #define TCS3414_DATA_BLUE (TCS3414_COMMAND_WORD | 0x14) | ||
40 | #define TCS3414_DATA_CLEAR (TCS3414_COMMAND_WORD | 0x16) | ||
41 | |||
42 | #define TCS3414_CONTROL_ADC_VALID BIT(4) | ||
43 | #define TCS3414_CONTROL_ADC_EN BIT(1) | ||
44 | #define TCS3414_CONTROL_POWER BIT(0) | ||
45 | |||
46 | #define TCS3414_INTEG_MASK GENMASK(1, 0) | ||
47 | #define TCS3414_INTEG_12MS 0x0 | ||
48 | #define TCS3414_INTEG_100MS 0x1 | ||
49 | #define TCS3414_INTEG_400MS 0x2 | ||
50 | |||
51 | #define TCS3414_GAIN_MASK GENMASK(5, 4) | ||
52 | #define TCS3414_GAIN_SHIFT 4 | ||
53 | |||
54 | struct tcs3414_data { | ||
55 | struct i2c_client *client; | ||
56 | struct mutex lock; | ||
57 | u8 control; | ||
58 | u8 gain; | ||
59 | u8 timing; | ||
60 | u16 buffer[8]; /* 4x 16-bit + 8 bytes timestamp */ | ||
61 | }; | ||
62 | |||
63 | #define TCS3414_CHANNEL(_color, _si, _addr) { \ | ||
64 | .type = IIO_INTENSITY, \ | ||
65 | .modified = 1, \ | ||
66 | .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \ | ||
67 | .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) | \ | ||
68 | BIT(IIO_CHAN_INFO_INT_TIME), \ | ||
69 | .channel2 = IIO_MOD_LIGHT_##_color, \ | ||
70 | .address = _addr, \ | ||
71 | .scan_index = _si, \ | ||
72 | .scan_type = { \ | ||
73 | .sign = 'u', \ | ||
74 | .realbits = 16, \ | ||
75 | .storagebits = 16, \ | ||
76 | .endianness = IIO_CPU, \ | ||
77 | }, \ | ||
78 | } | ||
79 | |||
80 | /* scale factors: 1/gain */ | ||
81 | static const int tcs3414_scales[][2] = { | ||
82 | {1, 0}, {0, 250000}, {0, 62500}, {0, 15625} | ||
83 | }; | ||
84 | |||
85 | /* integration time in ms */ | ||
86 | static const int tcs3414_times[] = { 12, 100, 400 }; | ||
87 | |||
88 | static const struct iio_chan_spec tcs3414_channels[] = { | ||
89 | TCS3414_CHANNEL(GREEN, 0, TCS3414_DATA_GREEN), | ||
90 | TCS3414_CHANNEL(RED, 1, TCS3414_DATA_RED), | ||
91 | TCS3414_CHANNEL(BLUE, 2, TCS3414_DATA_BLUE), | ||
92 | TCS3414_CHANNEL(CLEAR, 3, TCS3414_DATA_CLEAR), | ||
93 | IIO_CHAN_SOFT_TIMESTAMP(4), | ||
94 | }; | ||
95 | |||
96 | static int tcs3414_req_data(struct tcs3414_data *data) | ||
97 | { | ||
98 | int tries = 25; | ||
99 | int ret; | ||
100 | |||
101 | ret = i2c_smbus_write_byte_data(data->client, TCS3414_CONTROL, | ||
102 | data->control | TCS3414_CONTROL_ADC_EN); | ||
103 | if (ret < 0) | ||
104 | return ret; | ||
105 | |||
106 | while (tries--) { | ||
107 | ret = i2c_smbus_read_byte_data(data->client, TCS3414_CONTROL); | ||
108 | if (ret < 0) | ||
109 | return ret; | ||
110 | if (ret & TCS3414_CONTROL_ADC_VALID) | ||
111 | break; | ||
112 | msleep(20); | ||
113 | } | ||
114 | |||
115 | ret = i2c_smbus_write_byte_data(data->client, TCS3414_CONTROL, | ||
116 | data->control); | ||
117 | if (ret < 0) | ||
118 | return ret; | ||
119 | |||
120 | if (tries < 0) { | ||
121 | dev_err(&data->client->dev, "data not ready\n"); | ||
122 | return -EIO; | ||
123 | } | ||
124 | |||
125 | return 0; | ||
126 | } | ||
127 | |||
128 | static int tcs3414_read_raw(struct iio_dev *indio_dev, | ||
129 | struct iio_chan_spec const *chan, | ||
130 | int *val, int *val2, long mask) | ||
131 | { | ||
132 | struct tcs3414_data *data = iio_priv(indio_dev); | ||
133 | int i, ret; | ||
134 | |||
135 | switch (mask) { | ||
136 | case IIO_CHAN_INFO_RAW: | ||
137 | if (iio_buffer_enabled(indio_dev)) | ||
138 | return -EBUSY; | ||
139 | mutex_lock(&data->lock); | ||
140 | ret = tcs3414_req_data(data); | ||
141 | if (ret < 0) { | ||
142 | mutex_unlock(&data->lock); | ||
143 | return ret; | ||
144 | } | ||
145 | ret = i2c_smbus_read_word_data(data->client, chan->address); | ||
146 | mutex_unlock(&data->lock); | ||
147 | if (ret < 0) | ||
148 | return ret; | ||
149 | *val = ret; | ||
150 | return IIO_VAL_INT; | ||
151 | case IIO_CHAN_INFO_SCALE: | ||
152 | i = (data->gain & TCS3414_GAIN_MASK) >> TCS3414_GAIN_SHIFT; | ||
153 | *val = tcs3414_scales[i][0]; | ||
154 | *val2 = tcs3414_scales[i][1]; | ||
155 | return IIO_VAL_INT_PLUS_MICRO; | ||
156 | case IIO_CHAN_INFO_INT_TIME: | ||
157 | *val = 0; | ||
158 | *val2 = tcs3414_times[data->timing & TCS3414_INTEG_MASK] * 1000; | ||
159 | return IIO_VAL_INT_PLUS_MICRO; | ||
160 | } | ||
161 | return -EINVAL; | ||
162 | } | ||
163 | |||
164 | static int tcs3414_write_raw(struct iio_dev *indio_dev, | ||
165 | struct iio_chan_spec const *chan, | ||
166 | int val, int val2, long mask) | ||
167 | { | ||
168 | struct tcs3414_data *data = iio_priv(indio_dev); | ||
169 | int i; | ||
170 | |||
171 | switch (mask) { | ||
172 | case IIO_CHAN_INFO_SCALE: | ||
173 | for (i = 0; i < ARRAY_SIZE(tcs3414_scales); i++) { | ||
174 | if (val == tcs3414_scales[i][0] && | ||
175 | val2 == tcs3414_scales[i][1]) { | ||
176 | data->gain &= ~TCS3414_GAIN_MASK; | ||
177 | data->gain |= i << TCS3414_GAIN_SHIFT; | ||
178 | return i2c_smbus_write_byte_data( | ||
179 | data->client, TCS3414_GAIN, | ||
180 | data->gain); | ||
181 | } | ||
182 | } | ||
183 | return -EINVAL; | ||
184 | case IIO_CHAN_INFO_INT_TIME: | ||
185 | if (val != 0) | ||
186 | return -EINVAL; | ||
187 | for (i = 0; i < ARRAY_SIZE(tcs3414_times); i++) { | ||
188 | if (val == tcs3414_times[i] * 1000) { | ||
189 | data->timing &= ~TCS3414_INTEG_MASK; | ||
190 | data->timing |= i; | ||
191 | return i2c_smbus_write_byte_data( | ||
192 | data->client, TCS3414_TIMING, | ||
193 | data->timing); | ||
194 | } | ||
195 | } | ||
196 | return -EINVAL; | ||
197 | default: | ||
198 | return -EINVAL; | ||
199 | } | ||
200 | } | ||
201 | |||
202 | static irqreturn_t tcs3414_trigger_handler(int irq, void *p) | ||
203 | { | ||
204 | struct iio_poll_func *pf = p; | ||
205 | struct iio_dev *indio_dev = pf->indio_dev; | ||
206 | struct tcs3414_data *data = iio_priv(indio_dev); | ||
207 | int i, j = 0; | ||
208 | |||
209 | for_each_set_bit(i, indio_dev->active_scan_mask, | ||
210 | indio_dev->masklength) { | ||
211 | int ret = i2c_smbus_read_word_data(data->client, | ||
212 | TCS3414_DATA_GREEN + 2*i); | ||
213 | if (ret < 0) | ||
214 | goto done; | ||
215 | |||
216 | data->buffer[j++] = ret; | ||
217 | } | ||
218 | |||
219 | iio_push_to_buffers_with_timestamp(indio_dev, data->buffer, | ||
220 | iio_get_time_ns()); | ||
221 | |||
222 | done: | ||
223 | iio_trigger_notify_done(indio_dev->trig); | ||
224 | |||
225 | return IRQ_HANDLED; | ||
226 | } | ||
227 | |||
228 | static IIO_CONST_ATTR(scale_available, "1 0.25 0.0625 0.015625"); | ||
229 | static IIO_CONST_ATTR_INT_TIME_AVAIL("0.012 0.1 0.4"); | ||
230 | |||
231 | static struct attribute *tcs3414_attributes[] = { | ||
232 | &iio_const_attr_scale_available.dev_attr.attr, | ||
233 | &iio_const_attr_integration_time_available.dev_attr.attr, | ||
234 | NULL | ||
235 | }; | ||
236 | |||
237 | static const struct attribute_group tcs3414_attribute_group = { | ||
238 | .attrs = tcs3414_attributes, | ||
239 | }; | ||
240 | |||
241 | static const struct iio_info tcs3414_info = { | ||
242 | .read_raw = tcs3414_read_raw, | ||
243 | .write_raw = tcs3414_write_raw, | ||
244 | .attrs = &tcs3414_attribute_group, | ||
245 | .driver_module = THIS_MODULE, | ||
246 | }; | ||
247 | |||
248 | static int tcs3414_buffer_preenable(struct iio_dev *indio_dev) | ||
249 | { | ||
250 | struct tcs3414_data *data = iio_priv(indio_dev); | ||
251 | |||
252 | data->control |= TCS3414_CONTROL_ADC_EN; | ||
253 | return i2c_smbus_write_byte_data(data->client, TCS3414_CONTROL, | ||
254 | data->control); | ||
255 | } | ||
256 | |||
257 | static int tcs3414_buffer_predisable(struct iio_dev *indio_dev) | ||
258 | { | ||
259 | struct tcs3414_data *data = iio_priv(indio_dev); | ||
260 | int ret; | ||
261 | |||
262 | ret = iio_triggered_buffer_predisable(indio_dev); | ||
263 | if (ret < 0) | ||
264 | return ret; | ||
265 | |||
266 | data->control &= ~TCS3414_CONTROL_ADC_EN; | ||
267 | return i2c_smbus_write_byte_data(data->client, TCS3414_CONTROL, | ||
268 | data->control); | ||
269 | } | ||
270 | |||
271 | static const struct iio_buffer_setup_ops tcs3414_buffer_setup_ops = { | ||
272 | .preenable = tcs3414_buffer_preenable, | ||
273 | .postenable = &iio_triggered_buffer_postenable, | ||
274 | .predisable = tcs3414_buffer_predisable, | ||
275 | }; | ||
276 | |||
277 | static int tcs3414_probe(struct i2c_client *client, | ||
278 | const struct i2c_device_id *id) | ||
279 | { | ||
280 | struct tcs3414_data *data; | ||
281 | struct iio_dev *indio_dev; | ||
282 | int ret; | ||
283 | |||
284 | indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data)); | ||
285 | if (indio_dev == NULL) | ||
286 | return -ENOMEM; | ||
287 | |||
288 | data = iio_priv(indio_dev); | ||
289 | i2c_set_clientdata(client, indio_dev); | ||
290 | data->client = client; | ||
291 | mutex_init(&data->lock); | ||
292 | |||
293 | indio_dev->dev.parent = &client->dev; | ||
294 | indio_dev->info = &tcs3414_info; | ||
295 | indio_dev->name = TCS3414_DRV_NAME; | ||
296 | indio_dev->channels = tcs3414_channels; | ||
297 | indio_dev->num_channels = ARRAY_SIZE(tcs3414_channels); | ||
298 | indio_dev->modes = INDIO_DIRECT_MODE; | ||
299 | |||
300 | ret = i2c_smbus_read_byte_data(data->client, TCS3414_ID); | ||
301 | if (ret < 0) | ||
302 | return ret; | ||
303 | |||
304 | switch (ret & 0xf0) { | ||
305 | case 0x00: | ||
306 | dev_info(&client->dev, "TCS3404 found\n"); | ||
307 | break; | ||
308 | case 0x10: | ||
309 | dev_info(&client->dev, "TCS3413/14/15/16 found\n"); | ||
310 | break; | ||
311 | default: | ||
312 | return -ENODEV; | ||
313 | } | ||
314 | |||
315 | data->control = TCS3414_CONTROL_POWER; | ||
316 | ret = i2c_smbus_write_byte_data(data->client, TCS3414_CONTROL, | ||
317 | data->control); | ||
318 | if (ret < 0) | ||
319 | return ret; | ||
320 | |||
321 | data->timing = TCS3414_INTEG_12MS; /* free running */ | ||
322 | ret = i2c_smbus_write_byte_data(data->client, TCS3414_TIMING, | ||
323 | data->timing); | ||
324 | if (ret < 0) | ||
325 | return ret; | ||
326 | |||
327 | ret = i2c_smbus_read_byte_data(data->client, TCS3414_GAIN); | ||
328 | if (ret < 0) | ||
329 | return ret; | ||
330 | data->gain = ret; | ||
331 | |||
332 | ret = iio_triggered_buffer_setup(indio_dev, NULL, | ||
333 | tcs3414_trigger_handler, &tcs3414_buffer_setup_ops); | ||
334 | if (ret < 0) | ||
335 | return ret; | ||
336 | |||
337 | ret = iio_device_register(indio_dev); | ||
338 | if (ret < 0) | ||
339 | goto buffer_cleanup; | ||
340 | |||
341 | return 0; | ||
342 | |||
343 | buffer_cleanup: | ||
344 | iio_triggered_buffer_cleanup(indio_dev); | ||
345 | return ret; | ||
346 | } | ||
347 | |||
348 | static int tcs3414_powerdown(struct tcs3414_data *data) | ||
349 | { | ||
350 | return i2c_smbus_write_byte_data(data->client, TCS3414_CONTROL, | ||
351 | data->control & ~(TCS3414_CONTROL_POWER | | ||
352 | TCS3414_CONTROL_ADC_EN)); | ||
353 | } | ||
354 | |||
355 | static int tcs3414_remove(struct i2c_client *client) | ||
356 | { | ||
357 | struct iio_dev *indio_dev = i2c_get_clientdata(client); | ||
358 | |||
359 | iio_device_unregister(indio_dev); | ||
360 | iio_triggered_buffer_cleanup(indio_dev); | ||
361 | tcs3414_powerdown(iio_priv(indio_dev)); | ||
362 | |||
363 | return 0; | ||
364 | } | ||
365 | |||
366 | #ifdef CONFIG_PM_SLEEP | ||
367 | static int tcs3414_suspend(struct device *dev) | ||
368 | { | ||
369 | struct tcs3414_data *data = iio_priv(i2c_get_clientdata( | ||
370 | to_i2c_client(dev))); | ||
371 | return tcs3414_powerdown(data); | ||
372 | } | ||
373 | |||
374 | static int tcs3414_resume(struct device *dev) | ||
375 | { | ||
376 | struct tcs3414_data *data = iio_priv(i2c_get_clientdata( | ||
377 | to_i2c_client(dev))); | ||
378 | return i2c_smbus_write_byte_data(data->client, TCS3414_CONTROL, | ||
379 | data->control); | ||
380 | } | ||
381 | #endif | ||
382 | |||
383 | static SIMPLE_DEV_PM_OPS(tcs3414_pm_ops, tcs3414_suspend, tcs3414_resume); | ||
384 | |||
385 | static const struct i2c_device_id tcs3414_id[] = { | ||
386 | { "tcs3414", 0 }, | ||
387 | { } | ||
388 | }; | ||
389 | MODULE_DEVICE_TABLE(i2c, tcs3414_id); | ||
390 | |||
391 | static struct i2c_driver tcs3414_driver = { | ||
392 | .driver = { | ||
393 | .name = TCS3414_DRV_NAME, | ||
394 | .pm = &tcs3414_pm_ops, | ||
395 | .owner = THIS_MODULE, | ||
396 | }, | ||
397 | .probe = tcs3414_probe, | ||
398 | .remove = tcs3414_remove, | ||
399 | .id_table = tcs3414_id, | ||
400 | }; | ||
401 | module_i2c_driver(tcs3414_driver); | ||
402 | |||
403 | MODULE_AUTHOR("Peter Meerwald <pmeerw@pmeerw.net>"); | ||
404 | MODULE_DESCRIPTION("TCS3414 digital color sensors driver"); | ||
405 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/iio/magnetometer/st_magn_core.c b/drivers/iio/magnetometer/st_magn_core.c index 240a21dd0c61..a4b64130ac2f 100644 --- a/drivers/iio/magnetometer/st_magn_core.c +++ b/drivers/iio/magnetometer/st_magn_core.c | |||
@@ -299,6 +299,9 @@ static int st_magn_read_raw(struct iio_dev *indio_dev, | |||
299 | else | 299 | else |
300 | *val2 = mdata->current_fullscale->gain; | 300 | *val2 = mdata->current_fullscale->gain; |
301 | return IIO_VAL_INT_PLUS_MICRO; | 301 | return IIO_VAL_INT_PLUS_MICRO; |
302 | case IIO_CHAN_INFO_SAMP_FREQ: | ||
303 | *val = mdata->odr; | ||
304 | return IIO_VAL_INT; | ||
302 | default: | 305 | default: |
303 | return -EINVAL; | 306 | return -EINVAL; |
304 | } | 307 | } |
@@ -316,6 +319,13 @@ static int st_magn_write_raw(struct iio_dev *indio_dev, | |||
316 | case IIO_CHAN_INFO_SCALE: | 319 | case IIO_CHAN_INFO_SCALE: |
317 | err = st_sensors_set_fullscale_by_gain(indio_dev, val2); | 320 | err = st_sensors_set_fullscale_by_gain(indio_dev, val2); |
318 | break; | 321 | break; |
322 | case IIO_CHAN_INFO_SAMP_FREQ: | ||
323 | if (val2) | ||
324 | return -EINVAL; | ||
325 | mutex_lock(&indio_dev->mlock); | ||
326 | err = st_sensors_set_odr(indio_dev, val); | ||
327 | mutex_unlock(&indio_dev->mlock); | ||
328 | return err; | ||
319 | default: | 329 | default: |
320 | err = -EINVAL; | 330 | err = -EINVAL; |
321 | } | 331 | } |
@@ -323,14 +333,12 @@ static int st_magn_write_raw(struct iio_dev *indio_dev, | |||
323 | return err; | 333 | return err; |
324 | } | 334 | } |
325 | 335 | ||
326 | static ST_SENSOR_DEV_ATTR_SAMP_FREQ(); | ||
327 | static ST_SENSORS_DEV_ATTR_SAMP_FREQ_AVAIL(); | 336 | static ST_SENSORS_DEV_ATTR_SAMP_FREQ_AVAIL(); |
328 | static ST_SENSORS_DEV_ATTR_SCALE_AVAIL(in_magn_scale_available); | 337 | static ST_SENSORS_DEV_ATTR_SCALE_AVAIL(in_magn_scale_available); |
329 | 338 | ||
330 | static struct attribute *st_magn_attributes[] = { | 339 | static struct attribute *st_magn_attributes[] = { |
331 | &iio_dev_attr_sampling_frequency_available.dev_attr.attr, | 340 | &iio_dev_attr_sampling_frequency_available.dev_attr.attr, |
332 | &iio_dev_attr_in_magn_scale_available.dev_attr.attr, | 341 | &iio_dev_attr_in_magn_scale_available.dev_attr.attr, |
333 | &iio_dev_attr_sampling_frequency.dev_attr.attr, | ||
334 | NULL, | 342 | NULL, |
335 | }; | 343 | }; |
336 | 344 | ||
diff --git a/drivers/iio/magnetometer/st_magn_i2c.c b/drivers/iio/magnetometer/st_magn_i2c.c index 892e0feeb5c1..689250058442 100644 --- a/drivers/iio/magnetometer/st_magn_i2c.c +++ b/drivers/iio/magnetometer/st_magn_i2c.c | |||
@@ -18,6 +18,27 @@ | |||
18 | #include <linux/iio/common/st_sensors_i2c.h> | 18 | #include <linux/iio/common/st_sensors_i2c.h> |
19 | #include "st_magn.h" | 19 | #include "st_magn.h" |
20 | 20 | ||
21 | #ifdef CONFIG_OF | ||
22 | static const struct of_device_id st_magn_of_match[] = { | ||
23 | { | ||
24 | .compatible = "st,lsm303dlhc-magn", | ||
25 | .data = LSM303DLHC_MAGN_DEV_NAME, | ||
26 | }, | ||
27 | { | ||
28 | .compatible = "st,lsm303dlm-magn", | ||
29 | .data = LSM303DLM_MAGN_DEV_NAME, | ||
30 | }, | ||
31 | { | ||
32 | .compatible = "st,lis3mdl-magn", | ||
33 | .data = LIS3MDL_MAGN_DEV_NAME, | ||
34 | }, | ||
35 | {}, | ||
36 | }; | ||
37 | MODULE_DEVICE_TABLE(of, st_magn_of_match); | ||
38 | #else | ||
39 | #define st_magn_of_match NULL | ||
40 | #endif | ||
41 | |||
21 | static int st_magn_i2c_probe(struct i2c_client *client, | 42 | static int st_magn_i2c_probe(struct i2c_client *client, |
22 | const struct i2c_device_id *id) | 43 | const struct i2c_device_id *id) |
23 | { | 44 | { |
@@ -31,6 +52,7 @@ static int st_magn_i2c_probe(struct i2c_client *client, | |||
31 | 52 | ||
32 | mdata = iio_priv(indio_dev); | 53 | mdata = iio_priv(indio_dev); |
33 | mdata->dev = &client->dev; | 54 | mdata->dev = &client->dev; |
55 | st_sensors_of_i2c_probe(client, st_magn_of_match); | ||
34 | 56 | ||
35 | st_sensors_i2c_configure(indio_dev, client, mdata); | 57 | st_sensors_i2c_configure(indio_dev, client, mdata); |
36 | 58 | ||
@@ -61,6 +83,7 @@ static struct i2c_driver st_magn_driver = { | |||
61 | .driver = { | 83 | .driver = { |
62 | .owner = THIS_MODULE, | 84 | .owner = THIS_MODULE, |
63 | .name = "st-magn-i2c", | 85 | .name = "st-magn-i2c", |
86 | .of_match_table = of_match_ptr(st_magn_of_match), | ||
64 | }, | 87 | }, |
65 | .probe = st_magn_i2c_probe, | 88 | .probe = st_magn_i2c_probe, |
66 | .remove = st_magn_i2c_remove, | 89 | .remove = st_magn_i2c_remove, |
diff --git a/drivers/iio/pressure/st_pressure_core.c b/drivers/iio/pressure/st_pressure_core.c index cd7e01f3a93b..473d914ef470 100644 --- a/drivers/iio/pressure/st_pressure_core.c +++ b/drivers/iio/pressure/st_pressure_core.c | |||
@@ -307,6 +307,27 @@ static const struct st_sensors st_press_sensors[] = { | |||
307 | }, | 307 | }, |
308 | }; | 308 | }; |
309 | 309 | ||
310 | static int st_press_write_raw(struct iio_dev *indio_dev, | ||
311 | struct iio_chan_spec const *ch, | ||
312 | int val, | ||
313 | int val2, | ||
314 | long mask) | ||
315 | { | ||
316 | int err; | ||
317 | |||
318 | switch (mask) { | ||
319 | case IIO_CHAN_INFO_SAMP_FREQ: | ||
320 | if (val2) | ||
321 | return -EINVAL; | ||
322 | mutex_lock(&indio_dev->mlock); | ||
323 | err = st_sensors_set_odr(indio_dev, val); | ||
324 | mutex_unlock(&indio_dev->mlock); | ||
325 | return err; | ||
326 | default: | ||
327 | return -EINVAL; | ||
328 | } | ||
329 | } | ||
330 | |||
310 | static int st_press_read_raw(struct iio_dev *indio_dev, | 331 | static int st_press_read_raw(struct iio_dev *indio_dev, |
311 | struct iio_chan_spec const *ch, int *val, | 332 | struct iio_chan_spec const *ch, int *val, |
312 | int *val2, long mask) | 333 | int *val2, long mask) |
@@ -349,6 +370,9 @@ static int st_press_read_raw(struct iio_dev *indio_dev, | |||
349 | } | 370 | } |
350 | 371 | ||
351 | return IIO_VAL_FRACTIONAL; | 372 | return IIO_VAL_FRACTIONAL; |
373 | case IIO_CHAN_INFO_SAMP_FREQ: | ||
374 | *val = pdata->odr; | ||
375 | return IIO_VAL_INT; | ||
352 | default: | 376 | default: |
353 | return -EINVAL; | 377 | return -EINVAL; |
354 | } | 378 | } |
@@ -357,12 +381,10 @@ read_error: | |||
357 | return err; | 381 | return err; |
358 | } | 382 | } |
359 | 383 | ||
360 | static ST_SENSOR_DEV_ATTR_SAMP_FREQ(); | ||
361 | static ST_SENSORS_DEV_ATTR_SAMP_FREQ_AVAIL(); | 384 | static ST_SENSORS_DEV_ATTR_SAMP_FREQ_AVAIL(); |
362 | 385 | ||
363 | static struct attribute *st_press_attributes[] = { | 386 | static struct attribute *st_press_attributes[] = { |
364 | &iio_dev_attr_sampling_frequency_available.dev_attr.attr, | 387 | &iio_dev_attr_sampling_frequency_available.dev_attr.attr, |
365 | &iio_dev_attr_sampling_frequency.dev_attr.attr, | ||
366 | NULL, | 388 | NULL, |
367 | }; | 389 | }; |
368 | 390 | ||
@@ -374,6 +396,7 @@ static const struct iio_info press_info = { | |||
374 | .driver_module = THIS_MODULE, | 396 | .driver_module = THIS_MODULE, |
375 | .attrs = &st_press_attribute_group, | 397 | .attrs = &st_press_attribute_group, |
376 | .read_raw = &st_press_read_raw, | 398 | .read_raw = &st_press_read_raw, |
399 | .write_raw = &st_press_write_raw, | ||
377 | }; | 400 | }; |
378 | 401 | ||
379 | #ifdef CONFIG_IIO_TRIGGER | 402 | #ifdef CONFIG_IIO_TRIGGER |
diff --git a/drivers/iio/pressure/st_pressure_i2c.c b/drivers/iio/pressure/st_pressure_i2c.c index 3cd73e39b840..acaf165260bb 100644 --- a/drivers/iio/pressure/st_pressure_i2c.c +++ b/drivers/iio/pressure/st_pressure_i2c.c | |||
@@ -18,6 +18,27 @@ | |||
18 | #include <linux/iio/common/st_sensors_i2c.h> | 18 | #include <linux/iio/common/st_sensors_i2c.h> |
19 | #include "st_pressure.h" | 19 | #include "st_pressure.h" |
20 | 20 | ||
21 | #ifdef CONFIG_OF | ||
22 | static const struct of_device_id st_press_of_match[] = { | ||
23 | { | ||
24 | .compatible = "st,lps001wp-press", | ||
25 | .data = LPS001WP_PRESS_DEV_NAME, | ||
26 | }, | ||
27 | { | ||
28 | .compatible = "st,lps25h-press", | ||
29 | .data = LPS25H_PRESS_DEV_NAME, | ||
30 | }, | ||
31 | { | ||
32 | .compatible = "st,lps331ap-press", | ||
33 | .data = LPS331AP_PRESS_DEV_NAME, | ||
34 | }, | ||
35 | {}, | ||
36 | }; | ||
37 | MODULE_DEVICE_TABLE(of, st_press_of_match); | ||
38 | #else | ||
39 | #define st_press_of_match NULL | ||
40 | #endif | ||
41 | |||
21 | static int st_press_i2c_probe(struct i2c_client *client, | 42 | static int st_press_i2c_probe(struct i2c_client *client, |
22 | const struct i2c_device_id *id) | 43 | const struct i2c_device_id *id) |
23 | { | 44 | { |
@@ -31,6 +52,7 @@ static int st_press_i2c_probe(struct i2c_client *client, | |||
31 | 52 | ||
32 | pdata = iio_priv(indio_dev); | 53 | pdata = iio_priv(indio_dev); |
33 | pdata->dev = &client->dev; | 54 | pdata->dev = &client->dev; |
55 | st_sensors_of_i2c_probe(client, st_press_of_match); | ||
34 | 56 | ||
35 | st_sensors_i2c_configure(indio_dev, client, pdata); | 57 | st_sensors_i2c_configure(indio_dev, client, pdata); |
36 | 58 | ||
@@ -60,6 +82,7 @@ static struct i2c_driver st_press_driver = { | |||
60 | .driver = { | 82 | .driver = { |
61 | .owner = THIS_MODULE, | 83 | .owner = THIS_MODULE, |
62 | .name = "st-press-i2c", | 84 | .name = "st-press-i2c", |
85 | .of_match_table = of_match_ptr(st_press_of_match), | ||
63 | }, | 86 | }, |
64 | .probe = st_press_i2c_probe, | 87 | .probe = st_press_i2c_probe, |
65 | .remove = st_press_i2c_remove, | 88 | .remove = st_press_i2c_remove, |
diff --git a/drivers/staging/iio/Documentation/iio_event_monitor.c b/drivers/staging/iio/Documentation/iio_event_monitor.c index cb35a97f00c3..569d6f8face5 100644 --- a/drivers/staging/iio/Documentation/iio_event_monitor.c +++ b/drivers/staging/iio/Documentation/iio_event_monitor.c | |||
@@ -122,8 +122,6 @@ static bool event_is_known(struct iio_event_data *event) | |||
122 | case IIO_MOD_LIGHT_IR: | 122 | case IIO_MOD_LIGHT_IR: |
123 | case IIO_MOD_ROOT_SUM_SQUARED_X_Y: | 123 | case IIO_MOD_ROOT_SUM_SQUARED_X_Y: |
124 | case IIO_MOD_SUM_SQUARED_X_Y_Z: | 124 | case IIO_MOD_SUM_SQUARED_X_Y_Z: |
125 | case IIO_MOD_LIGHT_BOTH: | ||
126 | case IIO_MOD_LIGHT_IR: | ||
127 | case IIO_MOD_LIGHT_CLEAR: | 125 | case IIO_MOD_LIGHT_CLEAR: |
128 | case IIO_MOD_LIGHT_RED: | 126 | case IIO_MOD_LIGHT_RED: |
129 | case IIO_MOD_LIGHT_GREEN: | 127 | case IIO_MOD_LIGHT_GREEN: |
diff --git a/drivers/staging/iio/accel/adis16201_core.c b/drivers/staging/iio/accel/adis16201_core.c index 2105576fa77c..50ba1fa7f98a 100644 --- a/drivers/staging/iio/accel/adis16201_core.c +++ b/drivers/staging/iio/accel/adis16201_core.c | |||
@@ -131,17 +131,17 @@ static int adis16201_write_raw(struct iio_dev *indio_dev, | |||
131 | } | 131 | } |
132 | 132 | ||
133 | static const struct iio_chan_spec adis16201_channels[] = { | 133 | static const struct iio_chan_spec adis16201_channels[] = { |
134 | ADIS_SUPPLY_CHAN(ADIS16201_SUPPLY_OUT, ADIS16201_SCAN_SUPPLY, 12), | 134 | ADIS_SUPPLY_CHAN(ADIS16201_SUPPLY_OUT, ADIS16201_SCAN_SUPPLY, 0, 12), |
135 | ADIS_TEMP_CHAN(ADIS16201_TEMP_OUT, ADIS16201_SCAN_TEMP, 12), | 135 | ADIS_TEMP_CHAN(ADIS16201_TEMP_OUT, ADIS16201_SCAN_TEMP, 0, 12), |
136 | ADIS_ACCEL_CHAN(X, ADIS16201_XACCL_OUT, ADIS16201_SCAN_ACC_X, | 136 | ADIS_ACCEL_CHAN(X, ADIS16201_XACCL_OUT, ADIS16201_SCAN_ACC_X, |
137 | BIT(IIO_CHAN_INFO_CALIBBIAS), 14), | 137 | BIT(IIO_CHAN_INFO_CALIBBIAS), 0, 14), |
138 | ADIS_ACCEL_CHAN(Y, ADIS16201_YACCL_OUT, ADIS16201_SCAN_ACC_Y, | 138 | ADIS_ACCEL_CHAN(Y, ADIS16201_YACCL_OUT, ADIS16201_SCAN_ACC_Y, |
139 | BIT(IIO_CHAN_INFO_CALIBBIAS), 14), | 139 | BIT(IIO_CHAN_INFO_CALIBBIAS), 0, 14), |
140 | ADIS_AUX_ADC_CHAN(ADIS16201_AUX_ADC, ADIS16201_SCAN_AUX_ADC, 12), | 140 | ADIS_AUX_ADC_CHAN(ADIS16201_AUX_ADC, ADIS16201_SCAN_AUX_ADC, 0, 12), |
141 | ADIS_INCLI_CHAN(X, ADIS16201_XINCL_OUT, ADIS16201_SCAN_INCLI_X, | 141 | ADIS_INCLI_CHAN(X, ADIS16201_XINCL_OUT, ADIS16201_SCAN_INCLI_X, |
142 | BIT(IIO_CHAN_INFO_CALIBBIAS), 14), | 142 | BIT(IIO_CHAN_INFO_CALIBBIAS), 0, 14), |
143 | ADIS_INCLI_CHAN(X, ADIS16201_YINCL_OUT, ADIS16201_SCAN_INCLI_Y, | 143 | ADIS_INCLI_CHAN(X, ADIS16201_YINCL_OUT, ADIS16201_SCAN_INCLI_Y, |
144 | BIT(IIO_CHAN_INFO_CALIBBIAS), 14), | 144 | BIT(IIO_CHAN_INFO_CALIBBIAS), 0, 14), |
145 | IIO_CHAN_SOFT_TIMESTAMP(7) | 145 | IIO_CHAN_SOFT_TIMESTAMP(7) |
146 | }; | 146 | }; |
147 | 147 | ||
diff --git a/drivers/staging/iio/accel/adis16203_core.c b/drivers/staging/iio/accel/adis16203_core.c index 409a28ed9043..f472137b0069 100644 --- a/drivers/staging/iio/accel/adis16203_core.c +++ b/drivers/staging/iio/accel/adis16203_core.c | |||
@@ -99,13 +99,14 @@ static int adis16203_read_raw(struct iio_dev *indio_dev, | |||
99 | } | 99 | } |
100 | 100 | ||
101 | static const struct iio_chan_spec adis16203_channels[] = { | 101 | static const struct iio_chan_spec adis16203_channels[] = { |
102 | ADIS_SUPPLY_CHAN(ADIS16203_SUPPLY_OUT, ADIS16203_SCAN_SUPPLY, 12), | 102 | ADIS_SUPPLY_CHAN(ADIS16203_SUPPLY_OUT, ADIS16203_SCAN_SUPPLY, 0, 12), |
103 | ADIS_AUX_ADC_CHAN(ADIS16203_AUX_ADC, ADIS16203_SCAN_AUX_ADC, 12), | 103 | ADIS_AUX_ADC_CHAN(ADIS16203_AUX_ADC, ADIS16203_SCAN_AUX_ADC, 0, 12), |
104 | ADIS_INCLI_CHAN(X, ADIS16203_XINCL_OUT, ADIS16203_SCAN_INCLI_X, | 104 | ADIS_INCLI_CHAN(X, ADIS16203_XINCL_OUT, ADIS16203_SCAN_INCLI_X, |
105 | BIT(IIO_CHAN_INFO_CALIBBIAS), 14), | 105 | BIT(IIO_CHAN_INFO_CALIBBIAS), 0, 14), |
106 | /* Fixme: Not what it appears to be - see data sheet */ | 106 | /* Fixme: Not what it appears to be - see data sheet */ |
107 | ADIS_INCLI_CHAN(Y, ADIS16203_YINCL_OUT, ADIS16203_SCAN_INCLI_Y, 0, 14), | 107 | ADIS_INCLI_CHAN(Y, ADIS16203_YINCL_OUT, ADIS16203_SCAN_INCLI_Y, |
108 | ADIS_TEMP_CHAN(ADIS16203_TEMP_OUT, ADIS16203_SCAN_TEMP, 12), | 108 | 0, 0, 14), |
109 | ADIS_TEMP_CHAN(ADIS16203_TEMP_OUT, ADIS16203_SCAN_TEMP, 0, 12), | ||
109 | IIO_CHAN_SOFT_TIMESTAMP(5), | 110 | IIO_CHAN_SOFT_TIMESTAMP(5), |
110 | }; | 111 | }; |
111 | 112 | ||
diff --git a/drivers/staging/iio/accel/adis16204_core.c b/drivers/staging/iio/accel/adis16204_core.c index b8ea76857cd6..19eaebc77d7a 100644 --- a/drivers/staging/iio/accel/adis16204_core.c +++ b/drivers/staging/iio/accel/adis16204_core.c | |||
@@ -136,15 +136,15 @@ static int adis16204_write_raw(struct iio_dev *indio_dev, | |||
136 | } | 136 | } |
137 | 137 | ||
138 | static const struct iio_chan_spec adis16204_channels[] = { | 138 | static const struct iio_chan_spec adis16204_channels[] = { |
139 | ADIS_SUPPLY_CHAN(ADIS16204_SUPPLY_OUT, ADIS16204_SCAN_SUPPLY, 12), | 139 | ADIS_SUPPLY_CHAN(ADIS16204_SUPPLY_OUT, ADIS16204_SCAN_SUPPLY, 0, 12), |
140 | ADIS_AUX_ADC_CHAN(ADIS16204_AUX_ADC, ADIS16204_SCAN_AUX_ADC, 12), | 140 | ADIS_AUX_ADC_CHAN(ADIS16204_AUX_ADC, ADIS16204_SCAN_AUX_ADC, 0, 12), |
141 | ADIS_TEMP_CHAN(ADIS16204_TEMP_OUT, ADIS16204_SCAN_TEMP, 12), | 141 | ADIS_TEMP_CHAN(ADIS16204_TEMP_OUT, ADIS16204_SCAN_TEMP, 0, 12), |
142 | ADIS_ACCEL_CHAN(X, ADIS16204_XACCL_OUT, ADIS16204_SCAN_ACC_X, | 142 | ADIS_ACCEL_CHAN(X, ADIS16204_XACCL_OUT, ADIS16204_SCAN_ACC_X, |
143 | BIT(IIO_CHAN_INFO_CALIBBIAS) | BIT(IIO_CHAN_INFO_PEAK), 14), | 143 | BIT(IIO_CHAN_INFO_CALIBBIAS) | BIT(IIO_CHAN_INFO_PEAK), 0, 14), |
144 | ADIS_ACCEL_CHAN(Y, ADIS16204_YACCL_OUT, ADIS16204_SCAN_ACC_Y, | 144 | ADIS_ACCEL_CHAN(Y, ADIS16204_YACCL_OUT, ADIS16204_SCAN_ACC_Y, |
145 | BIT(IIO_CHAN_INFO_CALIBBIAS) | BIT(IIO_CHAN_INFO_PEAK), 14), | 145 | BIT(IIO_CHAN_INFO_CALIBBIAS) | BIT(IIO_CHAN_INFO_PEAK), 0, 14), |
146 | ADIS_ACCEL_CHAN(ROOT_SUM_SQUARED_X_Y, ADIS16204_XY_RSS_OUT, | 146 | ADIS_ACCEL_CHAN(ROOT_SUM_SQUARED_X_Y, ADIS16204_XY_RSS_OUT, |
147 | ADIS16204_SCAN_ACC_XY, BIT(IIO_CHAN_INFO_PEAK), 14), | 147 | ADIS16204_SCAN_ACC_XY, BIT(IIO_CHAN_INFO_PEAK), 0, 14), |
148 | IIO_CHAN_SOFT_TIMESTAMP(5), | 148 | IIO_CHAN_SOFT_TIMESTAMP(5), |
149 | }; | 149 | }; |
150 | 150 | ||
diff --git a/drivers/staging/iio/accel/adis16209_core.c b/drivers/staging/iio/accel/adis16209_core.c index 4492e51d8886..374dc6edbcf5 100644 --- a/drivers/staging/iio/accel/adis16209_core.c +++ b/drivers/staging/iio/accel/adis16209_core.c | |||
@@ -130,16 +130,18 @@ static int adis16209_read_raw(struct iio_dev *indio_dev, | |||
130 | } | 130 | } |
131 | 131 | ||
132 | static const struct iio_chan_spec adis16209_channels[] = { | 132 | static const struct iio_chan_spec adis16209_channels[] = { |
133 | ADIS_SUPPLY_CHAN(ADIS16209_SUPPLY_OUT, ADIS16209_SCAN_SUPPLY, 14), | 133 | ADIS_SUPPLY_CHAN(ADIS16209_SUPPLY_OUT, ADIS16209_SCAN_SUPPLY, 0, 14), |
134 | ADIS_TEMP_CHAN(ADIS16209_TEMP_OUT, ADIS16209_SCAN_TEMP, 12), | 134 | ADIS_TEMP_CHAN(ADIS16209_TEMP_OUT, ADIS16209_SCAN_TEMP, 0, 12), |
135 | ADIS_ACCEL_CHAN(X, ADIS16209_XACCL_OUT, ADIS16209_SCAN_ACC_X, | 135 | ADIS_ACCEL_CHAN(X, ADIS16209_XACCL_OUT, ADIS16209_SCAN_ACC_X, |
136 | BIT(IIO_CHAN_INFO_CALIBBIAS), 14), | 136 | BIT(IIO_CHAN_INFO_CALIBBIAS), 0, 14), |
137 | ADIS_ACCEL_CHAN(Y, ADIS16209_YACCL_OUT, ADIS16209_SCAN_ACC_Y, | 137 | ADIS_ACCEL_CHAN(Y, ADIS16209_YACCL_OUT, ADIS16209_SCAN_ACC_Y, |
138 | BIT(IIO_CHAN_INFO_CALIBBIAS), 14), | 138 | BIT(IIO_CHAN_INFO_CALIBBIAS), 0, 14), |
139 | ADIS_AUX_ADC_CHAN(ADIS16209_AUX_ADC, ADIS16209_SCAN_AUX_ADC, 12), | 139 | ADIS_AUX_ADC_CHAN(ADIS16209_AUX_ADC, ADIS16209_SCAN_AUX_ADC, 0, 12), |
140 | ADIS_INCLI_CHAN(X, ADIS16209_XINCL_OUT, ADIS16209_SCAN_INCLI_X, 0, 14), | 140 | ADIS_INCLI_CHAN(X, ADIS16209_XINCL_OUT, ADIS16209_SCAN_INCLI_X, |
141 | ADIS_INCLI_CHAN(Y, ADIS16209_YINCL_OUT, ADIS16209_SCAN_INCLI_Y, 0, 14), | 141 | 0, 0, 14), |
142 | ADIS_ROT_CHAN(X, ADIS16209_ROT_OUT, ADIS16209_SCAN_ROT, 0, 14), | 142 | ADIS_INCLI_CHAN(Y, ADIS16209_YINCL_OUT, ADIS16209_SCAN_INCLI_Y, |
143 | 0, 0, 14), | ||
144 | ADIS_ROT_CHAN(X, ADIS16209_ROT_OUT, ADIS16209_SCAN_ROT, 0, 0, 14), | ||
143 | IIO_CHAN_SOFT_TIMESTAMP(8) | 145 | IIO_CHAN_SOFT_TIMESTAMP(8) |
144 | }; | 146 | }; |
145 | 147 | ||
diff --git a/drivers/staging/iio/accel/adis16240_core.c b/drivers/staging/iio/accel/adis16240_core.c index 3a303a03d028..74ace2a8769d 100644 --- a/drivers/staging/iio/accel/adis16240_core.c +++ b/drivers/staging/iio/accel/adis16240_core.c | |||
@@ -173,15 +173,15 @@ static int adis16240_write_raw(struct iio_dev *indio_dev, | |||
173 | } | 173 | } |
174 | 174 | ||
175 | static const struct iio_chan_spec adis16240_channels[] = { | 175 | static const struct iio_chan_spec adis16240_channels[] = { |
176 | ADIS_SUPPLY_CHAN(ADIS16240_SUPPLY_OUT, ADIS16240_SCAN_SUPPLY, 10), | 176 | ADIS_SUPPLY_CHAN(ADIS16240_SUPPLY_OUT, ADIS16240_SCAN_SUPPLY, 0, 10), |
177 | ADIS_AUX_ADC_CHAN(ADIS16240_AUX_ADC, ADIS16240_SCAN_AUX_ADC, 10), | 177 | ADIS_AUX_ADC_CHAN(ADIS16240_AUX_ADC, ADIS16240_SCAN_AUX_ADC, 0, 10), |
178 | ADIS_ACCEL_CHAN(X, ADIS16240_XACCL_OUT, ADIS16240_SCAN_ACC_X, | 178 | ADIS_ACCEL_CHAN(X, ADIS16240_XACCL_OUT, ADIS16240_SCAN_ACC_X, |
179 | BIT(IIO_CHAN_INFO_CALIBBIAS) | BIT(IIO_CHAN_INFO_PEAK), 10), | 179 | BIT(IIO_CHAN_INFO_CALIBBIAS) | BIT(IIO_CHAN_INFO_PEAK), 0, 10), |
180 | ADIS_ACCEL_CHAN(Y, ADIS16240_YACCL_OUT, ADIS16240_SCAN_ACC_Y, | 180 | ADIS_ACCEL_CHAN(Y, ADIS16240_YACCL_OUT, ADIS16240_SCAN_ACC_Y, |
181 | BIT(IIO_CHAN_INFO_CALIBBIAS) | BIT(IIO_CHAN_INFO_PEAK), 10), | 181 | BIT(IIO_CHAN_INFO_CALIBBIAS) | BIT(IIO_CHAN_INFO_PEAK), 0, 10), |
182 | ADIS_ACCEL_CHAN(Z, ADIS16240_ZACCL_OUT, ADIS16240_SCAN_ACC_Z, | 182 | ADIS_ACCEL_CHAN(Z, ADIS16240_ZACCL_OUT, ADIS16240_SCAN_ACC_Z, |
183 | BIT(IIO_CHAN_INFO_CALIBBIAS) | BIT(IIO_CHAN_INFO_PEAK), 10), | 183 | BIT(IIO_CHAN_INFO_CALIBBIAS) | BIT(IIO_CHAN_INFO_PEAK), 0, 10), |
184 | ADIS_TEMP_CHAN(ADIS16240_TEMP_OUT, ADIS16240_SCAN_TEMP, 10), | 184 | ADIS_TEMP_CHAN(ADIS16240_TEMP_OUT, ADIS16240_SCAN_TEMP, 0, 10), |
185 | IIO_CHAN_SOFT_TIMESTAMP(6) | 185 | IIO_CHAN_SOFT_TIMESTAMP(6) |
186 | }; | 186 | }; |
187 | 187 | ||
diff --git a/drivers/staging/iio/adc/Kconfig b/drivers/staging/iio/adc/Kconfig index b87e382ad768..d01c7076a342 100644 --- a/drivers/staging/iio/adc/Kconfig +++ b/drivers/staging/iio/adc/Kconfig | |||
@@ -3,13 +3,6 @@ | |||
3 | # | 3 | # |
4 | menu "Analog to digital converters" | 4 | menu "Analog to digital converters" |
5 | 5 | ||
6 | config AD7291 | ||
7 | tristate "Analog Devices AD7291 ADC driver" | ||
8 | depends on I2C | ||
9 | help | ||
10 | Say yes here to build support for Analog Devices AD7291 | ||
11 | 8 Channel ADC with temperature sensor. | ||
12 | |||
13 | config AD7606 | 6 | config AD7606 |
14 | tristate "Analog Devices AD7606 ADC driver" | 7 | tristate "Analog Devices AD7606 ADC driver" |
15 | depends on GPIOLIB | 8 | depends on GPIOLIB |
@@ -94,7 +87,7 @@ config LPC32XX_ADC | |||
94 | 87 | ||
95 | config MXS_LRADC | 88 | config MXS_LRADC |
96 | tristate "Freescale i.MX23/i.MX28 LRADC" | 89 | tristate "Freescale i.MX23/i.MX28 LRADC" |
97 | depends on ARCH_MXS || COMPILE_TEST | 90 | depends on (ARCH_MXS || COMPILE_TEST) && HAS_IOMEM |
98 | depends on INPUT | 91 | depends on INPUT |
99 | select STMP_DEVICE | 92 | select STMP_DEVICE |
100 | select IIO_BUFFER | 93 | select IIO_BUFFER |
diff --git a/drivers/staging/iio/adc/Makefile b/drivers/staging/iio/adc/Makefile index afdcd1ff08ff..1c4277dbd318 100644 --- a/drivers/staging/iio/adc/Makefile +++ b/drivers/staging/iio/adc/Makefile | |||
@@ -8,7 +8,6 @@ ad7606-$(CONFIG_AD7606_IFACE_PARALLEL) += ad7606_par.o | |||
8 | ad7606-$(CONFIG_AD7606_IFACE_SPI) += ad7606_spi.o | 8 | ad7606-$(CONFIG_AD7606_IFACE_SPI) += ad7606_spi.o |
9 | obj-$(CONFIG_AD7606) += ad7606.o | 9 | obj-$(CONFIG_AD7606) += ad7606.o |
10 | 10 | ||
11 | obj-$(CONFIG_AD7291) += ad7291.o | ||
12 | obj-$(CONFIG_AD7780) += ad7780.o | 11 | obj-$(CONFIG_AD7780) += ad7780.o |
13 | obj-$(CONFIG_AD7816) += ad7816.o | 12 | obj-$(CONFIG_AD7816) += ad7816.o |
14 | obj-$(CONFIG_AD7192) += ad7192.o | 13 | obj-$(CONFIG_AD7192) += ad7192.o |
diff --git a/drivers/staging/iio/adc/ad7291.h b/drivers/staging/iio/adc/ad7291.h deleted file mode 100644 index bbd89fa51188..000000000000 --- a/drivers/staging/iio/adc/ad7291.h +++ /dev/null | |||
@@ -1,12 +0,0 @@ | |||
1 | #ifndef __IIO_AD7291_H__ | ||
2 | #define __IIO_AD7291_H__ | ||
3 | |||
4 | /** | ||
5 | * struct ad7291_platform_data - AD7291 platform data | ||
6 | * @use_external_ref: Whether to use an external or internal reference voltage | ||
7 | */ | ||
8 | struct ad7291_platform_data { | ||
9 | bool use_external_ref; | ||
10 | }; | ||
11 | |||
12 | #endif | ||
diff --git a/drivers/staging/iio/adc/ad7606_par.c b/drivers/staging/iio/adc/ad7606_par.c index 8a48d18de788..7511839ba94e 100644 --- a/drivers/staging/iio/adc/ad7606_par.c +++ b/drivers/staging/iio/adc/ad7606_par.c | |||
@@ -53,7 +53,7 @@ static int ad7606_par_probe(struct platform_device *pdev) | |||
53 | struct iio_dev *indio_dev; | 53 | struct iio_dev *indio_dev; |
54 | void __iomem *addr; | 54 | void __iomem *addr; |
55 | resource_size_t remap_size; | 55 | resource_size_t remap_size; |
56 | int ret, irq; | 56 | int irq; |
57 | 57 | ||
58 | irq = platform_get_irq(pdev, 0); | 58 | irq = platform_get_irq(pdev, 0); |
59 | if (irq < 0) { | 59 | if (irq < 0) { |
@@ -62,56 +62,31 @@ static int ad7606_par_probe(struct platform_device *pdev) | |||
62 | } | 62 | } |
63 | 63 | ||
64 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 64 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
65 | if (!res) | 65 | addr = devm_ioremap_resource(&pdev->dev, res); |
66 | return -ENODEV; | 66 | if (IS_ERR(addr)) |
67 | return PTR_ERR(addr); | ||
67 | 68 | ||
68 | remap_size = resource_size(res); | 69 | remap_size = resource_size(res); |
69 | 70 | ||
70 | /* Request the regions */ | ||
71 | if (!request_mem_region(res->start, remap_size, "iio-ad7606")) { | ||
72 | ret = -EBUSY; | ||
73 | goto out1; | ||
74 | } | ||
75 | addr = ioremap(res->start, remap_size); | ||
76 | if (!addr) { | ||
77 | ret = -ENOMEM; | ||
78 | goto out1; | ||
79 | } | ||
80 | |||
81 | indio_dev = ad7606_probe(&pdev->dev, irq, addr, | 71 | indio_dev = ad7606_probe(&pdev->dev, irq, addr, |
82 | platform_get_device_id(pdev)->driver_data, | 72 | platform_get_device_id(pdev)->driver_data, |
83 | remap_size > 1 ? &ad7606_par16_bops : | 73 | remap_size > 1 ? &ad7606_par16_bops : |
84 | &ad7606_par8_bops); | 74 | &ad7606_par8_bops); |
85 | 75 | ||
86 | if (IS_ERR(indio_dev)) { | 76 | if (IS_ERR(indio_dev)) |
87 | ret = PTR_ERR(indio_dev); | 77 | return PTR_ERR(indio_dev); |
88 | goto out2; | ||
89 | } | ||
90 | 78 | ||
91 | platform_set_drvdata(pdev, indio_dev); | 79 | platform_set_drvdata(pdev, indio_dev); |
92 | 80 | ||
93 | return 0; | 81 | return 0; |
94 | |||
95 | out2: | ||
96 | iounmap(addr); | ||
97 | out1: | ||
98 | release_mem_region(res->start, remap_size); | ||
99 | |||
100 | return ret; | ||
101 | } | 82 | } |
102 | 83 | ||
103 | static int ad7606_par_remove(struct platform_device *pdev) | 84 | static int ad7606_par_remove(struct platform_device *pdev) |
104 | { | 85 | { |
105 | struct iio_dev *indio_dev = platform_get_drvdata(pdev); | 86 | struct iio_dev *indio_dev = platform_get_drvdata(pdev); |
106 | struct resource *res; | ||
107 | struct ad7606_state *st = iio_priv(indio_dev); | ||
108 | 87 | ||
109 | ad7606_remove(indio_dev, platform_get_irq(pdev, 0)); | 88 | ad7606_remove(indio_dev, platform_get_irq(pdev, 0)); |
110 | 89 | ||
111 | iounmap(st->base_address); | ||
112 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
113 | release_mem_region(res->start, resource_size(res)); | ||
114 | |||
115 | return 0; | 90 | return 0; |
116 | } | 91 | } |
117 | 92 | ||
diff --git a/drivers/staging/iio/frequency/ad9832.c b/drivers/staging/iio/frequency/ad9832.c index b7c8351ce2ff..cf68159a5848 100644 --- a/drivers/staging/iio/frequency/ad9832.c +++ b/drivers/staging/iio/frequency/ad9832.c | |||
@@ -120,7 +120,7 @@ static ssize_t ad9832_write(struct device *dev, struct device_attribute *attr, | |||
120 | ret = spi_sync(st->spi, &st->msg); | 120 | ret = spi_sync(st->spi, &st->msg); |
121 | break; | 121 | break; |
122 | case AD9832_PHASE_SYM: | 122 | case AD9832_PHASE_SYM: |
123 | if (val < 0 || val > 3) { | 123 | if (val > 3) { |
124 | ret = -EINVAL; | 124 | ret = -EINVAL; |
125 | break; | 125 | break; |
126 | } | 126 | } |
diff --git a/drivers/staging/iio/trigger/iio-trig-bfin-timer.c b/drivers/staging/iio/trigger/iio-trig-bfin-timer.c index 16f1a06bcd89..a21b7c514776 100644 --- a/drivers/staging/iio/trigger/iio-trig-bfin-timer.c +++ b/drivers/staging/iio/trigger/iio-trig-bfin-timer.c | |||
@@ -182,45 +182,40 @@ static int iio_bfin_tmr_trigger_probe(struct platform_device *pdev) | |||
182 | unsigned int config; | 182 | unsigned int config; |
183 | int ret; | 183 | int ret; |
184 | 184 | ||
185 | st = kzalloc(sizeof(*st), GFP_KERNEL); | 185 | st = devm_kzalloc(&pdev->dev, sizeof(*st), GFP_KERNEL); |
186 | if (st == NULL) { | 186 | if (st == NULL) |
187 | ret = -ENOMEM; | 187 | return -ENOMEM; |
188 | goto out; | ||
189 | } | ||
190 | 188 | ||
191 | st->irq = platform_get_irq(pdev, 0); | 189 | st->irq = platform_get_irq(pdev, 0); |
192 | if (!st->irq) { | 190 | if (!st->irq) { |
193 | dev_err(&pdev->dev, "No IRQs specified"); | 191 | dev_err(&pdev->dev, "No IRQs specified"); |
194 | ret = -ENODEV; | 192 | return -ENODEV; |
195 | goto out1; | ||
196 | } | 193 | } |
197 | 194 | ||
198 | ret = iio_bfin_tmr_get_number(st->irq); | 195 | ret = iio_bfin_tmr_get_number(st->irq); |
199 | if (ret < 0) | 196 | if (ret < 0) |
200 | goto out1; | 197 | return ret; |
201 | 198 | ||
202 | st->timer_num = ret; | 199 | st->timer_num = ret; |
203 | st->t = &iio_bfin_timer_code[st->timer_num]; | 200 | st->t = &iio_bfin_timer_code[st->timer_num]; |
204 | 201 | ||
205 | st->trig = iio_trigger_alloc("bfintmr%d", st->timer_num); | 202 | st->trig = iio_trigger_alloc("bfintmr%d", st->timer_num); |
206 | if (!st->trig) { | 203 | if (!st->trig) |
207 | ret = -ENOMEM; | 204 | return -ENOMEM; |
208 | goto out1; | ||
209 | } | ||
210 | 205 | ||
211 | st->trig->ops = &iio_bfin_tmr_trigger_ops; | 206 | st->trig->ops = &iio_bfin_tmr_trigger_ops; |
212 | st->trig->dev.groups = iio_bfin_tmr_trigger_attr_groups; | 207 | st->trig->dev.groups = iio_bfin_tmr_trigger_attr_groups; |
213 | iio_trigger_set_drvdata(st->trig, st); | 208 | iio_trigger_set_drvdata(st->trig, st); |
214 | ret = iio_trigger_register(st->trig); | 209 | ret = iio_trigger_register(st->trig); |
215 | if (ret) | 210 | if (ret) |
216 | goto out2; | 211 | goto out; |
217 | 212 | ||
218 | ret = request_irq(st->irq, iio_bfin_tmr_trigger_isr, | 213 | ret = request_irq(st->irq, iio_bfin_tmr_trigger_isr, |
219 | 0, st->trig->name, st); | 214 | 0, st->trig->name, st); |
220 | if (ret) { | 215 | if (ret) { |
221 | dev_err(&pdev->dev, | 216 | dev_err(&pdev->dev, |
222 | "request IRQ-%d failed", st->irq); | 217 | "request IRQ-%d failed", st->irq); |
223 | goto out4; | 218 | goto out1; |
224 | } | 219 | } |
225 | 220 | ||
226 | config = PWM_OUT | PERIOD_CNT | IRQ_ENA; | 221 | config = PWM_OUT | PERIOD_CNT | IRQ_ENA; |
@@ -260,13 +255,10 @@ static int iio_bfin_tmr_trigger_probe(struct platform_device *pdev) | |||
260 | return 0; | 255 | return 0; |
261 | out_free_irq: | 256 | out_free_irq: |
262 | free_irq(st->irq, st); | 257 | free_irq(st->irq, st); |
263 | out4: | ||
264 | iio_trigger_unregister(st->trig); | ||
265 | out2: | ||
266 | iio_trigger_put(st->trig); | ||
267 | out1: | 258 | out1: |
268 | kfree(st); | 259 | iio_trigger_unregister(st->trig); |
269 | out: | 260 | out: |
261 | iio_trigger_put(st->trig); | ||
270 | return ret; | 262 | return ret; |
271 | } | 263 | } |
272 | 264 | ||
@@ -280,7 +272,6 @@ static int iio_bfin_tmr_trigger_remove(struct platform_device *pdev) | |||
280 | free_irq(st->irq, st); | 272 | free_irq(st->irq, st); |
281 | iio_trigger_unregister(st->trig); | 273 | iio_trigger_unregister(st->trig); |
282 | iio_trigger_put(st->trig); | 274 | iio_trigger_put(st->trig); |
283 | kfree(st); | ||
284 | 275 | ||
285 | return 0; | 276 | return 0; |
286 | } | 277 | } |