aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/iio
diff options
context:
space:
mode:
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>2014-06-18 13:41:08 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2014-06-18 13:41:08 -0400
commite28642c04a19b934e6832a218ccc9e54977f0213 (patch)
treebc4d09fc852cbc57bcaba4ba2c6f34f075853d7a /drivers/iio
parentc44b33b72133aeb6c3972847444cc45f18642259 (diff)
parente94f62e79f7f63a68574ee5e76c19837ec12f3db (diff)
Merge tag 'iio-fixes-for-3.16a' of git://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio into staging-linus
Jonathan writes: First set of IIO fixes for the 3.16 cycle. A mixed bag of fixes, many of which feel just to late for 3.15. * hid sensors - some devices need a feature report request in order to change power state. This isn't part of the spec, but has been observed on several devices and does no harm to others. * mpl3115 has had two errors in the buffer description fixed. The presure is signed, not unsigned and the temperature has 12 bits rather than 16. These could lead to incorrect interpretation of the data in userspace. * tsl2x7x - the high byte of the proximity thresholds should be written along with the low byte (which was). This could lead to interesting results with large thresholds. * twl4030 - a flag to specify processed values were required was not set when initializing a reading. As such values returned were in an unknown state. Fixed by simply initializing it appropriately. * IIO_SIMPLE_DUMMY_BUFFER did not select IIO_BUFFER leading to randconfig build errors. * ak8975 was applying an unwanted le16_to_cpu conversion as the i2c framework already performs one. As such for big endian systems, the bytes would be in the wrong order in the magnetic field measurements reported. * mxs-lradc - the controllable voltage dividers were not enabled / disabled for later channels than the first one during conversion. * at91_adc error handling returned -ENOMEM in a u8. Return value of at91_adc_get_trigger_value_by_name changed to int thus allowing -ENOMEM and also original values to be returned. * mcb - mcb_request_mem returns and ERR_PTR but the caller was checking for NULL to detect an error.
Diffstat (limited to 'drivers/iio')
-rw-r--r--drivers/iio/adc/at91_adc.c16
-rw-r--r--drivers/iio/adc/men_z188_adc.c4
-rw-r--r--drivers/iio/adc/twl4030-madc.c1
-rw-r--r--drivers/iio/common/hid-sensors/hid-sensor-trigger.c3
-rw-r--r--drivers/iio/magnetometer/ak8975.c9
-rw-r--r--drivers/iio/pressure/mpl3115.c6
6 files changed, 18 insertions, 21 deletions
diff --git a/drivers/iio/adc/at91_adc.c b/drivers/iio/adc/at91_adc.c
index 3b5bacd4d8da..2b6a9ce9927c 100644
--- a/drivers/iio/adc/at91_adc.c
+++ b/drivers/iio/adc/at91_adc.c
@@ -510,12 +510,11 @@ static int at91_adc_channel_init(struct iio_dev *idev)
510 return idev->num_channels; 510 return idev->num_channels;
511} 511}
512 512
513static u8 at91_adc_get_trigger_value_by_name(struct iio_dev *idev, 513static int at91_adc_get_trigger_value_by_name(struct iio_dev *idev,
514 struct at91_adc_trigger *triggers, 514 struct at91_adc_trigger *triggers,
515 const char *trigger_name) 515 const char *trigger_name)
516{ 516{
517 struct at91_adc_state *st = iio_priv(idev); 517 struct at91_adc_state *st = iio_priv(idev);
518 u8 value = 0;
519 int i; 518 int i;
520 519
521 for (i = 0; i < st->trigger_number; i++) { 520 for (i = 0; i < st->trigger_number; i++) {
@@ -528,15 +527,16 @@ static u8 at91_adc_get_trigger_value_by_name(struct iio_dev *idev,
528 return -ENOMEM; 527 return -ENOMEM;
529 528
530 if (strcmp(trigger_name, name) == 0) { 529 if (strcmp(trigger_name, name) == 0) {
531 value = triggers[i].value;
532 kfree(name); 530 kfree(name);
533 break; 531 if (triggers[i].value == 0)
532 return -EINVAL;
533 return triggers[i].value;
534 } 534 }
535 535
536 kfree(name); 536 kfree(name);
537 } 537 }
538 538
539 return value; 539 return -EINVAL;
540} 540}
541 541
542static int at91_adc_configure_trigger(struct iio_trigger *trig, bool state) 542static int at91_adc_configure_trigger(struct iio_trigger *trig, bool state)
@@ -546,14 +546,14 @@ static int at91_adc_configure_trigger(struct iio_trigger *trig, bool state)
546 struct iio_buffer *buffer = idev->buffer; 546 struct iio_buffer *buffer = idev->buffer;
547 struct at91_adc_reg_desc *reg = st->registers; 547 struct at91_adc_reg_desc *reg = st->registers;
548 u32 status = at91_adc_readl(st, reg->trigger_register); 548 u32 status = at91_adc_readl(st, reg->trigger_register);
549 u8 value; 549 int value;
550 u8 bit; 550 u8 bit;
551 551
552 value = at91_adc_get_trigger_value_by_name(idev, 552 value = at91_adc_get_trigger_value_by_name(idev,
553 st->trigger_list, 553 st->trigger_list,
554 idev->trig->name); 554 idev->trig->name);
555 if (value == 0) 555 if (value < 0)
556 return -EINVAL; 556 return value;
557 557
558 if (state) { 558 if (state) {
559 st->buffer = kmalloc(idev->scan_bytes, GFP_KERNEL); 559 st->buffer = kmalloc(idev->scan_bytes, GFP_KERNEL);
diff --git a/drivers/iio/adc/men_z188_adc.c b/drivers/iio/adc/men_z188_adc.c
index 6989c16aec2b..b58d6302521f 100644
--- a/drivers/iio/adc/men_z188_adc.c
+++ b/drivers/iio/adc/men_z188_adc.c
@@ -121,8 +121,8 @@ static int men_z188_probe(struct mcb_device *dev,
121 indio_dev->num_channels = ARRAY_SIZE(z188_adc_iio_channels); 121 indio_dev->num_channels = ARRAY_SIZE(z188_adc_iio_channels);
122 122
123 mem = mcb_request_mem(dev, "z188-adc"); 123 mem = mcb_request_mem(dev, "z188-adc");
124 if (!mem) 124 if (IS_ERR(mem))
125 return -ENOMEM; 125 return PTR_ERR(mem);
126 126
127 adc->base = ioremap(mem->start, resource_size(mem)); 127 adc->base = ioremap(mem->start, resource_size(mem));
128 if (adc->base == NULL) 128 if (adc->base == NULL)
diff --git a/drivers/iio/adc/twl4030-madc.c b/drivers/iio/adc/twl4030-madc.c
index 7de1c4c87942..eb86786e698e 100644
--- a/drivers/iio/adc/twl4030-madc.c
+++ b/drivers/iio/adc/twl4030-madc.c
@@ -645,6 +645,7 @@ int twl4030_get_madc_conversion(int channel_no)
645 req.channels = (1 << channel_no); 645 req.channels = (1 << channel_no);
646 req.method = TWL4030_MADC_SW2; 646 req.method = TWL4030_MADC_SW2;
647 req.active = 0; 647 req.active = 0;
648 req.raw = 0;
648 req.func_cb = NULL; 649 req.func_cb = NULL;
649 ret = twl4030_madc_conversion(&req); 650 ret = twl4030_madc_conversion(&req);
650 if (ret < 0) 651 if (ret < 0)
diff --git a/drivers/iio/common/hid-sensors/hid-sensor-trigger.c b/drivers/iio/common/hid-sensors/hid-sensor-trigger.c
index 73282cee0c81..a3109a6f4d86 100644
--- a/drivers/iio/common/hid-sensors/hid-sensor-trigger.c
+++ b/drivers/iio/common/hid-sensors/hid-sensor-trigger.c
@@ -75,6 +75,9 @@ int hid_sensor_power_state(struct hid_sensor_common *st, bool state)
75 (s32)report_val); 75 (s32)report_val);
76 } 76 }
77 77
78 sensor_hub_get_feature(st->hsdev, st->power_state.report_id,
79 st->power_state.index,
80 &state_val);
78 return 0; 81 return 0;
79} 82}
80EXPORT_SYMBOL(hid_sensor_power_state); 83EXPORT_SYMBOL(hid_sensor_power_state);
diff --git a/drivers/iio/magnetometer/ak8975.c b/drivers/iio/magnetometer/ak8975.c
index 09ea5c481f4c..ea08313af0d2 100644
--- a/drivers/iio/magnetometer/ak8975.c
+++ b/drivers/iio/magnetometer/ak8975.c
@@ -373,8 +373,6 @@ static int ak8975_read_axis(struct iio_dev *indio_dev, int index, int *val)
373{ 373{
374 struct ak8975_data *data = iio_priv(indio_dev); 374 struct ak8975_data *data = iio_priv(indio_dev);
375 struct i2c_client *client = data->client; 375 struct i2c_client *client = data->client;
376 u16 meas_reg;
377 s16 raw;
378 int ret; 376 int ret;
379 377
380 mutex_lock(&data->lock); 378 mutex_lock(&data->lock);
@@ -422,16 +420,11 @@ static int ak8975_read_axis(struct iio_dev *indio_dev, int index, int *val)
422 dev_err(&client->dev, "Read axis data fails\n"); 420 dev_err(&client->dev, "Read axis data fails\n");
423 goto exit; 421 goto exit;
424 } 422 }
425 meas_reg = ret;
426 423
427 mutex_unlock(&data->lock); 424 mutex_unlock(&data->lock);
428 425
429 /* Endian conversion of the measured values. */
430 raw = (s16) (le16_to_cpu(meas_reg));
431
432 /* Clamp to valid range. */ 426 /* Clamp to valid range. */
433 raw = clamp_t(s16, raw, -4096, 4095); 427 *val = clamp_t(s16, ret, -4096, 4095);
434 *val = raw;
435 return IIO_VAL_INT; 428 return IIO_VAL_INT;
436 429
437exit: 430exit:
diff --git a/drivers/iio/pressure/mpl3115.c b/drivers/iio/pressure/mpl3115.c
index ba6d0c520e63..01b2e0b18878 100644
--- a/drivers/iio/pressure/mpl3115.c
+++ b/drivers/iio/pressure/mpl3115.c
@@ -98,7 +98,7 @@ static int mpl3115_read_raw(struct iio_dev *indio_dev,
98 mutex_unlock(&data->lock); 98 mutex_unlock(&data->lock);
99 if (ret < 0) 99 if (ret < 0)
100 return ret; 100 return ret;
101 *val = sign_extend32(be32_to_cpu(tmp) >> 12, 23); 101 *val = be32_to_cpu(tmp) >> 12;
102 return IIO_VAL_INT; 102 return IIO_VAL_INT;
103 case IIO_TEMP: /* in 0.0625 celsius / LSB */ 103 case IIO_TEMP: /* in 0.0625 celsius / LSB */
104 mutex_lock(&data->lock); 104 mutex_lock(&data->lock);
@@ -112,7 +112,7 @@ static int mpl3115_read_raw(struct iio_dev *indio_dev,
112 mutex_unlock(&data->lock); 112 mutex_unlock(&data->lock);
113 if (ret < 0) 113 if (ret < 0)
114 return ret; 114 return ret;
115 *val = sign_extend32(be32_to_cpu(tmp) >> 20, 15); 115 *val = sign_extend32(be32_to_cpu(tmp) >> 20, 11);
116 return IIO_VAL_INT; 116 return IIO_VAL_INT;
117 default: 117 default:
118 return -EINVAL; 118 return -EINVAL;
@@ -185,7 +185,7 @@ static const struct iio_chan_spec mpl3115_channels[] = {
185 BIT(IIO_CHAN_INFO_SCALE), 185 BIT(IIO_CHAN_INFO_SCALE),
186 .scan_index = 0, 186 .scan_index = 0,
187 .scan_type = { 187 .scan_type = {
188 .sign = 's', 188 .sign = 'u',
189 .realbits = 20, 189 .realbits = 20,
190 .storagebits = 32, 190 .storagebits = 32,
191 .shift = 12, 191 .shift = 12,