aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>2014-02-08 16:29:18 -0500
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2014-02-08 16:29:18 -0500
commita0f452520211385522aad5bd12d90aa59f17e094 (patch)
treeb273b91937b2ecede65e07dc9ceae926c21a3c4e
parent6b89db36b3ab7c4b99027873e1de4be8d07387d4 (diff)
parent55b40d37311807a6bb2acdae0df904f54a0da3ae (diff)
Merge tag 'iio-fixes-for-3.14b' of git://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio into staging-linus
Jonathan writes: Second round of IIO fixes for the 3.14 cycle. Another mixed bag, including some that were not in round 1 because they applied to elements that went in during the merge window whereas round 1 predated that. I have been effectively out of action for 3 weeks so will take a little while to catch up with my backlog. * mag3110 - report busy in read_raw / write_raw when buffered capture is underway to avoid either changing the characteristics of the capture or causing capture issues by reading data destined for the buffer. * mag3110 - fix a failure to specify leading zeros when formatting a decimal number. * lradc - fix a buffer overflow and incorrect reporting of scale for voltage channel 15 * lradc - drop some scale_available attributes for elements that don't actually exist. These could otherwise cause some interesting issues for userspace. * ad799x - a typo in the events information mask resulted in some nasty crashes on failed probes. * ak8975 - fix scale attribute output to avoid incorrect intepretation of readings in userspace. * adis16400 - make sure the timestamp is the last element in all channel_spec arrays as this assumption is made by the buffer filling code, but was not true previously. * bma180 - correctly use modifiers to distinguish the channels rather than indexes. This brings the abi inline with the standard option for 3 axis accelerometers. * max1363 - use devm_regulator_get_optional instead of the non optional case to allow the device to successfully probe when a regulator is not specified.
-rw-r--r--drivers/iio/accel/bma180.c16
-rw-r--r--drivers/iio/adc/max1363.c2
-rw-r--r--drivers/iio/imu/adis16400.h1
-rw-r--r--drivers/iio/imu/adis16400_core.c10
-rw-r--r--drivers/iio/magnetometer/ak8975.c16
-rw-r--r--drivers/iio/magnetometer/mag3110.c8
-rw-r--r--drivers/staging/iio/adc/ad799x_core.c2
-rw-r--r--drivers/staging/iio/adc/mxs-lradc.c6
8 files changed, 33 insertions, 28 deletions
diff --git a/drivers/iio/accel/bma180.c b/drivers/iio/accel/bma180.c
index 3bec9220df04..bfec313492b3 100644
--- a/drivers/iio/accel/bma180.c
+++ b/drivers/iio/accel/bma180.c
@@ -447,14 +447,14 @@ static const struct iio_chan_spec_ext_info bma180_ext_info[] = {
447 { }, 447 { },
448}; 448};
449 449
450#define BMA180_CHANNEL(_index) { \ 450#define BMA180_CHANNEL(_axis) { \
451 .type = IIO_ACCEL, \ 451 .type = IIO_ACCEL, \
452 .indexed = 1, \ 452 .modified = 1, \
453 .channel = (_index), \ 453 .channel2 = IIO_MOD_##_axis, \
454 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \ 454 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \
455 BIT(IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY), \ 455 BIT(IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY), \
456 .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), \ 456 .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), \
457 .scan_index = (_index), \ 457 .scan_index = AXIS_##_axis, \
458 .scan_type = { \ 458 .scan_type = { \
459 .sign = 's', \ 459 .sign = 's', \
460 .realbits = 14, \ 460 .realbits = 14, \
@@ -465,10 +465,10 @@ static const struct iio_chan_spec_ext_info bma180_ext_info[] = {
465} 465}
466 466
467static const struct iio_chan_spec bma180_channels[] = { 467static const struct iio_chan_spec bma180_channels[] = {
468 BMA180_CHANNEL(AXIS_X), 468 BMA180_CHANNEL(X),
469 BMA180_CHANNEL(AXIS_Y), 469 BMA180_CHANNEL(Y),
470 BMA180_CHANNEL(AXIS_Z), 470 BMA180_CHANNEL(Z),
471 IIO_CHAN_SOFT_TIMESTAMP(4), 471 IIO_CHAN_SOFT_TIMESTAMP(3),
472}; 472};
473 473
474static irqreturn_t bma180_trigger_handler(int irq, void *p) 474static irqreturn_t bma180_trigger_handler(int irq, void *p)
diff --git a/drivers/iio/adc/max1363.c b/drivers/iio/adc/max1363.c
index e283f2f2ee2f..360259266d4f 100644
--- a/drivers/iio/adc/max1363.c
+++ b/drivers/iio/adc/max1363.c
@@ -1560,7 +1560,7 @@ static int max1363_probe(struct i2c_client *client,
1560 st->client = client; 1560 st->client = client;
1561 1561
1562 st->vref_uv = st->chip_info->int_vref_mv * 1000; 1562 st->vref_uv = st->chip_info->int_vref_mv * 1000;
1563 vref = devm_regulator_get(&client->dev, "vref"); 1563 vref = devm_regulator_get_optional(&client->dev, "vref");
1564 if (!IS_ERR(vref)) { 1564 if (!IS_ERR(vref)) {
1565 int vref_uv; 1565 int vref_uv;
1566 1566
diff --git a/drivers/iio/imu/adis16400.h b/drivers/iio/imu/adis16400.h
index 2f8f9d632386..0916bf6b6c31 100644
--- a/drivers/iio/imu/adis16400.h
+++ b/drivers/iio/imu/adis16400.h
@@ -189,6 +189,7 @@ enum {
189 ADIS16300_SCAN_INCLI_X, 189 ADIS16300_SCAN_INCLI_X,
190 ADIS16300_SCAN_INCLI_Y, 190 ADIS16300_SCAN_INCLI_Y,
191 ADIS16400_SCAN_ADC, 191 ADIS16400_SCAN_ADC,
192 ADIS16400_SCAN_TIMESTAMP,
192}; 193};
193 194
194#ifdef CONFIG_IIO_BUFFER 195#ifdef CONFIG_IIO_BUFFER
diff --git a/drivers/iio/imu/adis16400_core.c b/drivers/iio/imu/adis16400_core.c
index 368660dfe135..7c582f7ae34e 100644
--- a/drivers/iio/imu/adis16400_core.c
+++ b/drivers/iio/imu/adis16400_core.c
@@ -632,7 +632,7 @@ static const struct iio_chan_spec adis16400_channels[] = {
632 ADIS16400_MAGN_CHAN(Z, ADIS16400_ZMAGN_OUT, 14), 632 ADIS16400_MAGN_CHAN(Z, ADIS16400_ZMAGN_OUT, 14),
633 ADIS16400_TEMP_CHAN(ADIS16400_TEMP_OUT, 12), 633 ADIS16400_TEMP_CHAN(ADIS16400_TEMP_OUT, 12),
634 ADIS16400_AUX_ADC_CHAN(ADIS16400_AUX_ADC, 12), 634 ADIS16400_AUX_ADC_CHAN(ADIS16400_AUX_ADC, 12),
635 IIO_CHAN_SOFT_TIMESTAMP(12) 635 IIO_CHAN_SOFT_TIMESTAMP(ADIS16400_SCAN_TIMESTAMP),
636}; 636};
637 637
638static const struct iio_chan_spec adis16448_channels[] = { 638static const struct iio_chan_spec adis16448_channels[] = {
@@ -659,7 +659,7 @@ static const struct iio_chan_spec adis16448_channels[] = {
659 }, 659 },
660 }, 660 },
661 ADIS16400_TEMP_CHAN(ADIS16448_TEMP_OUT, 12), 661 ADIS16400_TEMP_CHAN(ADIS16448_TEMP_OUT, 12),
662 IIO_CHAN_SOFT_TIMESTAMP(11) 662 IIO_CHAN_SOFT_TIMESTAMP(ADIS16400_SCAN_TIMESTAMP),
663}; 663};
664 664
665static const struct iio_chan_spec adis16350_channels[] = { 665static const struct iio_chan_spec adis16350_channels[] = {
@@ -677,7 +677,7 @@ static const struct iio_chan_spec adis16350_channels[] = {
677 ADIS16400_MOD_TEMP_CHAN(X, ADIS16350_XTEMP_OUT, 12), 677 ADIS16400_MOD_TEMP_CHAN(X, ADIS16350_XTEMP_OUT, 12),
678 ADIS16400_MOD_TEMP_CHAN(Y, ADIS16350_YTEMP_OUT, 12), 678 ADIS16400_MOD_TEMP_CHAN(Y, ADIS16350_YTEMP_OUT, 12),
679 ADIS16400_MOD_TEMP_CHAN(Z, ADIS16350_ZTEMP_OUT, 12), 679 ADIS16400_MOD_TEMP_CHAN(Z, ADIS16350_ZTEMP_OUT, 12),
680 IIO_CHAN_SOFT_TIMESTAMP(11) 680 IIO_CHAN_SOFT_TIMESTAMP(ADIS16400_SCAN_TIMESTAMP),
681}; 681};
682 682
683static const struct iio_chan_spec adis16300_channels[] = { 683static const struct iio_chan_spec adis16300_channels[] = {
@@ -690,7 +690,7 @@ static const struct iio_chan_spec adis16300_channels[] = {
690 ADIS16400_AUX_ADC_CHAN(ADIS16300_AUX_ADC, 12), 690 ADIS16400_AUX_ADC_CHAN(ADIS16300_AUX_ADC, 12),
691 ADIS16400_INCLI_CHAN(X, ADIS16300_PITCH_OUT, 13), 691 ADIS16400_INCLI_CHAN(X, ADIS16300_PITCH_OUT, 13),
692 ADIS16400_INCLI_CHAN(Y, ADIS16300_ROLL_OUT, 13), 692 ADIS16400_INCLI_CHAN(Y, ADIS16300_ROLL_OUT, 13),
693 IIO_CHAN_SOFT_TIMESTAMP(14) 693 IIO_CHAN_SOFT_TIMESTAMP(ADIS16400_SCAN_TIMESTAMP),
694}; 694};
695 695
696static const struct iio_chan_spec adis16334_channels[] = { 696static const struct iio_chan_spec adis16334_channels[] = {
@@ -701,7 +701,7 @@ static const struct iio_chan_spec adis16334_channels[] = {
701 ADIS16400_ACCEL_CHAN(Y, ADIS16400_YACCL_OUT, 14), 701 ADIS16400_ACCEL_CHAN(Y, ADIS16400_YACCL_OUT, 14),
702 ADIS16400_ACCEL_CHAN(Z, ADIS16400_ZACCL_OUT, 14), 702 ADIS16400_ACCEL_CHAN(Z, ADIS16400_ZACCL_OUT, 14),
703 ADIS16400_TEMP_CHAN(ADIS16350_XTEMP_OUT, 12), 703 ADIS16400_TEMP_CHAN(ADIS16350_XTEMP_OUT, 12),
704 IIO_CHAN_SOFT_TIMESTAMP(8) 704 IIO_CHAN_SOFT_TIMESTAMP(ADIS16400_SCAN_TIMESTAMP),
705}; 705};
706 706
707static struct attribute *adis16400_attributes[] = { 707static struct attribute *adis16400_attributes[] = {
diff --git a/drivers/iio/magnetometer/ak8975.c b/drivers/iio/magnetometer/ak8975.c
index ff284e5afd95..05423543f89d 100644
--- a/drivers/iio/magnetometer/ak8975.c
+++ b/drivers/iio/magnetometer/ak8975.c
@@ -85,6 +85,7 @@
85#define AK8975_MAX_CONVERSION_TIMEOUT 500 85#define AK8975_MAX_CONVERSION_TIMEOUT 500
86#define AK8975_CONVERSION_DONE_POLL_TIME 10 86#define AK8975_CONVERSION_DONE_POLL_TIME 10
87#define AK8975_DATA_READY_TIMEOUT ((100*HZ)/1000) 87#define AK8975_DATA_READY_TIMEOUT ((100*HZ)/1000)
88#define RAW_TO_GAUSS(asa) ((((asa) + 128) * 3000) / 256)
88 89
89/* 90/*
90 * Per-instance context data for the device. 91 * Per-instance context data for the device.
@@ -265,15 +266,15 @@ static int ak8975_setup(struct i2c_client *client)
265 * 266 *
266 * Since 1uT = 0.01 gauss, our final scale factor becomes: 267 * Since 1uT = 0.01 gauss, our final scale factor becomes:
267 * 268 *
268 * Hadj = H * ((ASA + 128) / 256) * 3/10 * 100 269 * Hadj = H * ((ASA + 128) / 256) * 3/10 * 1/100
269 * Hadj = H * ((ASA + 128) * 30 / 256 270 * Hadj = H * ((ASA + 128) * 0.003) / 256
270 * 271 *
271 * Since ASA doesn't change, we cache the resultant scale factor into the 272 * Since ASA doesn't change, we cache the resultant scale factor into the
272 * device context in ak8975_setup(). 273 * device context in ak8975_setup().
273 */ 274 */
274 data->raw_to_gauss[0] = ((data->asa[0] + 128) * 30) >> 8; 275 data->raw_to_gauss[0] = RAW_TO_GAUSS(data->asa[0]);
275 data->raw_to_gauss[1] = ((data->asa[1] + 128) * 30) >> 8; 276 data->raw_to_gauss[1] = RAW_TO_GAUSS(data->asa[1]);
276 data->raw_to_gauss[2] = ((data->asa[2] + 128) * 30) >> 8; 277 data->raw_to_gauss[2] = RAW_TO_GAUSS(data->asa[2]);
277 278
278 return 0; 279 return 0;
279} 280}
@@ -428,8 +429,9 @@ static int ak8975_read_raw(struct iio_dev *indio_dev,
428 case IIO_CHAN_INFO_RAW: 429 case IIO_CHAN_INFO_RAW:
429 return ak8975_read_axis(indio_dev, chan->address, val); 430 return ak8975_read_axis(indio_dev, chan->address, val);
430 case IIO_CHAN_INFO_SCALE: 431 case IIO_CHAN_INFO_SCALE:
431 *val = data->raw_to_gauss[chan->address]; 432 *val = 0;
432 return IIO_VAL_INT; 433 *val2 = data->raw_to_gauss[chan->address];
434 return IIO_VAL_INT_PLUS_MICRO;
433 } 435 }
434 return -EINVAL; 436 return -EINVAL;
435} 437}
diff --git a/drivers/iio/magnetometer/mag3110.c b/drivers/iio/magnetometer/mag3110.c
index 4b65b6d3bdb1..f66955fb3509 100644
--- a/drivers/iio/magnetometer/mag3110.c
+++ b/drivers/iio/magnetometer/mag3110.c
@@ -106,7 +106,7 @@ static ssize_t mag3110_show_int_plus_micros(char *buf,
106 106
107 while (n-- > 0) 107 while (n-- > 0)
108 len += scnprintf(buf + len, PAGE_SIZE - len, 108 len += scnprintf(buf + len, PAGE_SIZE - len,
109 "%d.%d ", vals[n][0], vals[n][1]); 109 "%d.%06d ", vals[n][0], vals[n][1]);
110 110
111 /* replace trailing space by newline */ 111 /* replace trailing space by newline */
112 buf[len - 1] = '\n'; 112 buf[len - 1] = '\n';
@@ -154,6 +154,9 @@ static int mag3110_read_raw(struct iio_dev *indio_dev,
154 154
155 switch (mask) { 155 switch (mask) {
156 case IIO_CHAN_INFO_RAW: 156 case IIO_CHAN_INFO_RAW:
157 if (iio_buffer_enabled(indio_dev))
158 return -EBUSY;
159
157 switch (chan->type) { 160 switch (chan->type) {
158 case IIO_MAGN: /* in 0.1 uT / LSB */ 161 case IIO_MAGN: /* in 0.1 uT / LSB */
159 ret = mag3110_read(data, buffer); 162 ret = mag3110_read(data, buffer);
@@ -199,6 +202,9 @@ static int mag3110_write_raw(struct iio_dev *indio_dev,
199 struct mag3110_data *data = iio_priv(indio_dev); 202 struct mag3110_data *data = iio_priv(indio_dev);
200 int rate; 203 int rate;
201 204
205 if (iio_buffer_enabled(indio_dev))
206 return -EBUSY;
207
202 switch (mask) { 208 switch (mask) {
203 case IIO_CHAN_INFO_SAMP_FREQ: 209 case IIO_CHAN_INFO_SAMP_FREQ:
204 rate = mag3110_get_samp_freq_index(data, val, val2); 210 rate = mag3110_get_samp_freq_index(data, val, val2);
diff --git a/drivers/staging/iio/adc/ad799x_core.c b/drivers/staging/iio/adc/ad799x_core.c
index 31a2be688060..5708ffc62aec 100644
--- a/drivers/staging/iio/adc/ad799x_core.c
+++ b/drivers/staging/iio/adc/ad799x_core.c
@@ -393,7 +393,7 @@ static const struct iio_event_spec ad799x_events[] = {
393 }, { 393 }, {
394 .type = IIO_EV_TYPE_THRESH, 394 .type = IIO_EV_TYPE_THRESH,
395 .dir = IIO_EV_DIR_FALLING, 395 .dir = IIO_EV_DIR_FALLING,
396 .mask_separate = BIT(IIO_EV_INFO_VALUE), 396 .mask_separate = BIT(IIO_EV_INFO_VALUE) |
397 BIT(IIO_EV_INFO_ENABLE), 397 BIT(IIO_EV_INFO_ENABLE),
398 }, { 398 }, {
399 .type = IIO_EV_TYPE_THRESH, 399 .type = IIO_EV_TYPE_THRESH,
diff --git a/drivers/staging/iio/adc/mxs-lradc.c b/drivers/staging/iio/adc/mxs-lradc.c
index df71669bb60e..7fc66a6a6e36 100644
--- a/drivers/staging/iio/adc/mxs-lradc.c
+++ b/drivers/staging/iio/adc/mxs-lradc.c
@@ -1035,8 +1035,6 @@ SHOW_SCALE_AVAILABLE_ATTR(4);
1035SHOW_SCALE_AVAILABLE_ATTR(5); 1035SHOW_SCALE_AVAILABLE_ATTR(5);
1036SHOW_SCALE_AVAILABLE_ATTR(6); 1036SHOW_SCALE_AVAILABLE_ATTR(6);
1037SHOW_SCALE_AVAILABLE_ATTR(7); 1037SHOW_SCALE_AVAILABLE_ATTR(7);
1038SHOW_SCALE_AVAILABLE_ATTR(8);
1039SHOW_SCALE_AVAILABLE_ATTR(9);
1040SHOW_SCALE_AVAILABLE_ATTR(10); 1038SHOW_SCALE_AVAILABLE_ATTR(10);
1041SHOW_SCALE_AVAILABLE_ATTR(11); 1039SHOW_SCALE_AVAILABLE_ATTR(11);
1042SHOW_SCALE_AVAILABLE_ATTR(12); 1040SHOW_SCALE_AVAILABLE_ATTR(12);
@@ -1053,8 +1051,6 @@ static struct attribute *mxs_lradc_attributes[] = {
1053 &iio_dev_attr_in_voltage5_scale_available.dev_attr.attr, 1051 &iio_dev_attr_in_voltage5_scale_available.dev_attr.attr,
1054 &iio_dev_attr_in_voltage6_scale_available.dev_attr.attr, 1052 &iio_dev_attr_in_voltage6_scale_available.dev_attr.attr,
1055 &iio_dev_attr_in_voltage7_scale_available.dev_attr.attr, 1053 &iio_dev_attr_in_voltage7_scale_available.dev_attr.attr,
1056 &iio_dev_attr_in_voltage8_scale_available.dev_attr.attr,
1057 &iio_dev_attr_in_voltage9_scale_available.dev_attr.attr,
1058 &iio_dev_attr_in_voltage10_scale_available.dev_attr.attr, 1054 &iio_dev_attr_in_voltage10_scale_available.dev_attr.attr,
1059 &iio_dev_attr_in_voltage11_scale_available.dev_attr.attr, 1055 &iio_dev_attr_in_voltage11_scale_available.dev_attr.attr,
1060 &iio_dev_attr_in_voltage12_scale_available.dev_attr.attr, 1056 &iio_dev_attr_in_voltage12_scale_available.dev_attr.attr,
@@ -1613,7 +1609,7 @@ static int mxs_lradc_probe(struct platform_device *pdev)
1613 * of the array. 1609 * of the array.
1614 */ 1610 */
1615 scale_uv = ((u64)lradc->vref_mv[i] * 100000000) >> 1611 scale_uv = ((u64)lradc->vref_mv[i] * 100000000) >>
1616 (iio->channels[i].scan_type.realbits - s); 1612 (LRADC_RESOLUTION - s);
1617 lradc->scale_avail[i][s].nano = 1613 lradc->scale_avail[i][s].nano =
1618 do_div(scale_uv, 100000000) * 10; 1614 do_div(scale_uv, 100000000) * 10;
1619 lradc->scale_avail[i][s].integer = scale_uv; 1615 lradc->scale_avail[i][s].integer = scale_uv;