aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>2017-09-25 04:58:22 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2017-09-25 04:58:22 -0400
commitb2e312061c5e9f533c44487862dc405094bf250a (patch)
tree6e6d1fdfd04a926118a98bd0e366d54b2a2b5a28
parentec14121931a24f8d3678b8a9c408adee3b21d465 (diff)
parentf790923f146140a261ad211e5baf75d169f16fb2 (diff)
Merge tag 'iio-fixes-for-4.14a' of git://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio into staging-linus
Jonathan writes: First round of IIO fixes for the 4.14 cycle Note this includes fixes from recent merge window. As such the tree is based on top of a prior staging/staging-next tree. * iio core - return and error for a failed read_reg debugfs call rather than eating the error. * ad7192 - Use the dedicated reset function in the ad_sigma_delta library instead of an spi transfer with the data on the stack which could cause problems with DMA. * ad7793 - Implement a dedicate reset function in the ad_sigma_delta library and use it to correctly reset this part. * bme280 - ctrl_reg write must occur after any register writes for updates to take effect. * mcp320x - negative voltage readout was broken. - Fix an oops on module unload due to spi_set_drvdata not being called in probe. * st_magn - Fix the data ready line configuration for the lis3mdl. It is not configurable so the st_magn core was assuming it didn't exist and so wasn't consuming interrupts resulting in an unhandled interrupt. * stm32-adc - off by one error on max channels checking. * stm32-timer - preset should not be buffered - reorganising register writes avoids this. - fix a corner case in which write preset goes wrong when a timer is used first as a trigger then as a counter with preset. Odd case but you never know. * ti-ads1015 - Fix setting of comparator polarity by fixing bitfield definition. * twl4030 - Error path handling fix to cleanup in event of regulator registration failure. - Disable the vusb3v1 regulator correctly in error handling - Don't paper over a regulator enable failure.
-rw-r--r--drivers/iio/adc/ad7793.c4
-rw-r--r--drivers/iio/adc/ad_sigma_delta.c28
-rw-r--r--drivers/iio/adc/mcp320x.c25
-rw-r--r--drivers/iio/adc/stm32-adc.c2
-rw-r--r--drivers/iio/adc/ti-ads1015.c8
-rw-r--r--drivers/iio/adc/twl4030-madc.c14
-rw-r--r--drivers/iio/common/st_sensors/st_sensors_core.c11
-rw-r--r--drivers/iio/industrialio-core.c4
-rw-r--r--drivers/iio/magnetometer/st_magn_core.c4
-rw-r--r--drivers/iio/pressure/bmp280-core.c2
-rw-r--r--drivers/iio/trigger/stm32-timer-trigger.c4
-rw-r--r--drivers/staging/iio/adc/ad7192.c4
-rw-r--r--include/linux/iio/adc/ad_sigma_delta.h3
13 files changed, 87 insertions, 26 deletions
diff --git a/drivers/iio/adc/ad7793.c b/drivers/iio/adc/ad7793.c
index e6706a09e100..47c3d7f32900 100644
--- a/drivers/iio/adc/ad7793.c
+++ b/drivers/iio/adc/ad7793.c
@@ -257,7 +257,7 @@ static int ad7793_setup(struct iio_dev *indio_dev,
257 unsigned int vref_mv) 257 unsigned int vref_mv)
258{ 258{
259 struct ad7793_state *st = iio_priv(indio_dev); 259 struct ad7793_state *st = iio_priv(indio_dev);
260 int i, ret = -1; 260 int i, ret;
261 unsigned long long scale_uv; 261 unsigned long long scale_uv;
262 u32 id; 262 u32 id;
263 263
@@ -266,7 +266,7 @@ static int ad7793_setup(struct iio_dev *indio_dev,
266 return ret; 266 return ret;
267 267
268 /* reset the serial interface */ 268 /* reset the serial interface */
269 ret = spi_write(st->sd.spi, (u8 *)&ret, sizeof(ret)); 269 ret = ad_sd_reset(&st->sd, 32);
270 if (ret < 0) 270 if (ret < 0)
271 goto out; 271 goto out;
272 usleep_range(500, 2000); /* Wait for at least 500us */ 272 usleep_range(500, 2000); /* Wait for at least 500us */
diff --git a/drivers/iio/adc/ad_sigma_delta.c b/drivers/iio/adc/ad_sigma_delta.c
index d10bd0c97233..22c4c17cd996 100644
--- a/drivers/iio/adc/ad_sigma_delta.c
+++ b/drivers/iio/adc/ad_sigma_delta.c
@@ -177,6 +177,34 @@ out:
177} 177}
178EXPORT_SYMBOL_GPL(ad_sd_read_reg); 178EXPORT_SYMBOL_GPL(ad_sd_read_reg);
179 179
180/**
181 * ad_sd_reset() - Reset the serial interface
182 *
183 * @sigma_delta: The sigma delta device
184 * @reset_length: Number of SCLKs with DIN = 1
185 *
186 * Returns 0 on success, an error code otherwise.
187 **/
188int ad_sd_reset(struct ad_sigma_delta *sigma_delta,
189 unsigned int reset_length)
190{
191 uint8_t *buf;
192 unsigned int size;
193 int ret;
194
195 size = DIV_ROUND_UP(reset_length, 8);
196 buf = kcalloc(size, sizeof(*buf), GFP_KERNEL);
197 if (!buf)
198 return -ENOMEM;
199
200 memset(buf, 0xff, size);
201 ret = spi_write(sigma_delta->spi, buf, size);
202 kfree(buf);
203
204 return ret;
205}
206EXPORT_SYMBOL_GPL(ad_sd_reset);
207
180static int ad_sd_calibrate(struct ad_sigma_delta *sigma_delta, 208static int ad_sd_calibrate(struct ad_sigma_delta *sigma_delta,
181 unsigned int mode, unsigned int channel) 209 unsigned int mode, unsigned int channel)
182{ 210{
diff --git a/drivers/iio/adc/mcp320x.c b/drivers/iio/adc/mcp320x.c
index 634717ae12f3..071dd23a33d9 100644
--- a/drivers/iio/adc/mcp320x.c
+++ b/drivers/iio/adc/mcp320x.c
@@ -17,6 +17,8 @@
17 * MCP3204 17 * MCP3204
18 * MCP3208 18 * MCP3208
19 * ------------ 19 * ------------
20 * 13 bit converter
21 * MCP3301
20 * 22 *
21 * Datasheet can be found here: 23 * Datasheet can be found here:
22 * http://ww1.microchip.com/downloads/en/DeviceDoc/21293C.pdf mcp3001 24 * http://ww1.microchip.com/downloads/en/DeviceDoc/21293C.pdf mcp3001
@@ -96,7 +98,7 @@ static int mcp320x_channel_to_tx_data(int device_index,
96} 98}
97 99
98static int mcp320x_adc_conversion(struct mcp320x *adc, u8 channel, 100static int mcp320x_adc_conversion(struct mcp320x *adc, u8 channel,
99 bool differential, int device_index) 101 bool differential, int device_index, int *val)
100{ 102{
101 int ret; 103 int ret;
102 104
@@ -117,19 +119,25 @@ static int mcp320x_adc_conversion(struct mcp320x *adc, u8 channel,
117 119
118 switch (device_index) { 120 switch (device_index) {
119 case mcp3001: 121 case mcp3001:
120 return (adc->rx_buf[0] << 5 | adc->rx_buf[1] >> 3); 122 *val = (adc->rx_buf[0] << 5 | adc->rx_buf[1] >> 3);
123 return 0;
121 case mcp3002: 124 case mcp3002:
122 case mcp3004: 125 case mcp3004:
123 case mcp3008: 126 case mcp3008:
124 return (adc->rx_buf[0] << 2 | adc->rx_buf[1] >> 6); 127 *val = (adc->rx_buf[0] << 2 | adc->rx_buf[1] >> 6);
128 return 0;
125 case mcp3201: 129 case mcp3201:
126 return (adc->rx_buf[0] << 7 | adc->rx_buf[1] >> 1); 130 *val = (adc->rx_buf[0] << 7 | adc->rx_buf[1] >> 1);
131 return 0;
127 case mcp3202: 132 case mcp3202:
128 case mcp3204: 133 case mcp3204:
129 case mcp3208: 134 case mcp3208:
130 return (adc->rx_buf[0] << 4 | adc->rx_buf[1] >> 4); 135 *val = (adc->rx_buf[0] << 4 | adc->rx_buf[1] >> 4);
136 return 0;
131 case mcp3301: 137 case mcp3301:
132 return sign_extend32((adc->rx_buf[0] & 0x1f) << 8 | adc->rx_buf[1], 12); 138 *val = sign_extend32((adc->rx_buf[0] & 0x1f) << 8
139 | adc->rx_buf[1], 12);
140 return 0;
133 default: 141 default:
134 return -EINVAL; 142 return -EINVAL;
135 } 143 }
@@ -150,12 +158,10 @@ static int mcp320x_read_raw(struct iio_dev *indio_dev,
150 switch (mask) { 158 switch (mask) {
151 case IIO_CHAN_INFO_RAW: 159 case IIO_CHAN_INFO_RAW:
152 ret = mcp320x_adc_conversion(adc, channel->address, 160 ret = mcp320x_adc_conversion(adc, channel->address,
153 channel->differential, device_index); 161 channel->differential, device_index, val);
154
155 if (ret < 0) 162 if (ret < 0)
156 goto out; 163 goto out;
157 164
158 *val = ret;
159 ret = IIO_VAL_INT; 165 ret = IIO_VAL_INT;
160 break; 166 break;
161 167
@@ -312,6 +318,7 @@ static int mcp320x_probe(struct spi_device *spi)
312 indio_dev->name = spi_get_device_id(spi)->name; 318 indio_dev->name = spi_get_device_id(spi)->name;
313 indio_dev->modes = INDIO_DIRECT_MODE; 319 indio_dev->modes = INDIO_DIRECT_MODE;
314 indio_dev->info = &mcp320x_info; 320 indio_dev->info = &mcp320x_info;
321 spi_set_drvdata(spi, indio_dev);
315 322
316 chip_info = &mcp320x_chip_infos[spi_get_device_id(spi)->driver_data]; 323 chip_info = &mcp320x_chip_infos[spi_get_device_id(spi)->driver_data];
317 indio_dev->channels = chip_info->channels; 324 indio_dev->channels = chip_info->channels;
diff --git a/drivers/iio/adc/stm32-adc.c b/drivers/iio/adc/stm32-adc.c
index e3c15f88075f..4df32cf1650e 100644
--- a/drivers/iio/adc/stm32-adc.c
+++ b/drivers/iio/adc/stm32-adc.c
@@ -1666,7 +1666,7 @@ static int stm32_adc_chan_of_init(struct iio_dev *indio_dev)
1666 1666
1667 num_channels = of_property_count_u32_elems(node, "st,adc-channels"); 1667 num_channels = of_property_count_u32_elems(node, "st,adc-channels");
1668 if (num_channels < 0 || 1668 if (num_channels < 0 ||
1669 num_channels >= adc_info->max_channels) { 1669 num_channels > adc_info->max_channels) {
1670 dev_err(&indio_dev->dev, "Bad st,adc-channels?\n"); 1670 dev_err(&indio_dev->dev, "Bad st,adc-channels?\n");
1671 return num_channels < 0 ? num_channels : -EINVAL; 1671 return num_channels < 0 ? num_channels : -EINVAL;
1672 } 1672 }
diff --git a/drivers/iio/adc/ti-ads1015.c b/drivers/iio/adc/ti-ads1015.c
index d1210024f6bc..e0dc20488335 100644
--- a/drivers/iio/adc/ti-ads1015.c
+++ b/drivers/iio/adc/ti-ads1015.c
@@ -52,7 +52,7 @@
52 52
53#define ADS1015_CFG_COMP_QUE_MASK GENMASK(1, 0) 53#define ADS1015_CFG_COMP_QUE_MASK GENMASK(1, 0)
54#define ADS1015_CFG_COMP_LAT_MASK BIT(2) 54#define ADS1015_CFG_COMP_LAT_MASK BIT(2)
55#define ADS1015_CFG_COMP_POL_MASK BIT(2) 55#define ADS1015_CFG_COMP_POL_MASK BIT(3)
56#define ADS1015_CFG_COMP_MODE_MASK BIT(4) 56#define ADS1015_CFG_COMP_MODE_MASK BIT(4)
57#define ADS1015_CFG_DR_MASK GENMASK(7, 5) 57#define ADS1015_CFG_DR_MASK GENMASK(7, 5)
58#define ADS1015_CFG_MOD_MASK BIT(8) 58#define ADS1015_CFG_MOD_MASK BIT(8)
@@ -1017,10 +1017,12 @@ static int ads1015_probe(struct i2c_client *client,
1017 1017
1018 switch (irq_trig) { 1018 switch (irq_trig) {
1019 case IRQF_TRIGGER_LOW: 1019 case IRQF_TRIGGER_LOW:
1020 cfg_comp |= ADS1015_CFG_COMP_POL_LOW; 1020 cfg_comp |= ADS1015_CFG_COMP_POL_LOW <<
1021 ADS1015_CFG_COMP_POL_SHIFT;
1021 break; 1022 break;
1022 case IRQF_TRIGGER_HIGH: 1023 case IRQF_TRIGGER_HIGH:
1023 cfg_comp |= ADS1015_CFG_COMP_POL_HIGH; 1024 cfg_comp |= ADS1015_CFG_COMP_POL_HIGH <<
1025 ADS1015_CFG_COMP_POL_SHIFT;
1024 break; 1026 break;
1025 default: 1027 default:
1026 return -EINVAL; 1028 return -EINVAL;
diff --git a/drivers/iio/adc/twl4030-madc.c b/drivers/iio/adc/twl4030-madc.c
index 1edd99f0c5e5..e3cfb91bffc6 100644
--- a/drivers/iio/adc/twl4030-madc.c
+++ b/drivers/iio/adc/twl4030-madc.c
@@ -887,21 +887,27 @@ static int twl4030_madc_probe(struct platform_device *pdev)
887 887
888 /* Enable 3v1 bias regulator for MADC[3:6] */ 888 /* Enable 3v1 bias regulator for MADC[3:6] */
889 madc->usb3v1 = devm_regulator_get(madc->dev, "vusb3v1"); 889 madc->usb3v1 = devm_regulator_get(madc->dev, "vusb3v1");
890 if (IS_ERR(madc->usb3v1)) 890 if (IS_ERR(madc->usb3v1)) {
891 return -ENODEV; 891 ret = -ENODEV;
892 goto err_i2c;
893 }
892 894
893 ret = regulator_enable(madc->usb3v1); 895 ret = regulator_enable(madc->usb3v1);
894 if (ret) 896 if (ret) {
895 dev_err(madc->dev, "could not enable 3v1 bias regulator\n"); 897 dev_err(madc->dev, "could not enable 3v1 bias regulator\n");
898 goto err_i2c;
899 }
896 900
897 ret = iio_device_register(iio_dev); 901 ret = iio_device_register(iio_dev);
898 if (ret) { 902 if (ret) {
899 dev_err(&pdev->dev, "could not register iio device\n"); 903 dev_err(&pdev->dev, "could not register iio device\n");
900 goto err_i2c; 904 goto err_usb3v1;
901 } 905 }
902 906
903 return 0; 907 return 0;
904 908
909err_usb3v1:
910 regulator_disable(madc->usb3v1);
905err_i2c: 911err_i2c:
906 twl4030_madc_set_current_generator(madc, 0, 0); 912 twl4030_madc_set_current_generator(madc, 0, 0);
907err_current_generator: 913err_current_generator:
diff --git a/drivers/iio/common/st_sensors/st_sensors_core.c b/drivers/iio/common/st_sensors/st_sensors_core.c
index d99bb1460fe2..02e833b14db0 100644
--- a/drivers/iio/common/st_sensors/st_sensors_core.c
+++ b/drivers/iio/common/st_sensors/st_sensors_core.c
@@ -463,8 +463,17 @@ int st_sensors_set_dataready_irq(struct iio_dev *indio_dev, bool enable)
463 u8 drdy_mask; 463 u8 drdy_mask;
464 struct st_sensor_data *sdata = iio_priv(indio_dev); 464 struct st_sensor_data *sdata = iio_priv(indio_dev);
465 465
466 if (!sdata->sensor_settings->drdy_irq.addr) 466 if (!sdata->sensor_settings->drdy_irq.addr) {
467 /*
468 * there are some devices (e.g. LIS3MDL) where drdy line is
469 * routed to a given pin and it is not possible to select a
470 * different one. Take into account irq status register
471 * to understand if irq trigger can be properly supported
472 */
473 if (sdata->sensor_settings->drdy_irq.addr_stat_drdy)
474 sdata->hw_irq_trigger = enable;
467 return 0; 475 return 0;
476 }
468 477
469 /* Enable/Disable the interrupt generator 1. */ 478 /* Enable/Disable the interrupt generator 1. */
470 if (sdata->sensor_settings->drdy_irq.ig1.en_addr > 0) { 479 if (sdata->sensor_settings->drdy_irq.ig1.en_addr > 0) {
diff --git a/drivers/iio/industrialio-core.c b/drivers/iio/industrialio-core.c
index 17ec4cee51dc..a47428b4d31b 100644
--- a/drivers/iio/industrialio-core.c
+++ b/drivers/iio/industrialio-core.c
@@ -310,8 +310,10 @@ static ssize_t iio_debugfs_read_reg(struct file *file, char __user *userbuf,
310 ret = indio_dev->info->debugfs_reg_access(indio_dev, 310 ret = indio_dev->info->debugfs_reg_access(indio_dev,
311 indio_dev->cached_reg_addr, 311 indio_dev->cached_reg_addr,
312 0, &val); 312 0, &val);
313 if (ret) 313 if (ret) {
314 dev_err(indio_dev->dev.parent, "%s: read failed\n", __func__); 314 dev_err(indio_dev->dev.parent, "%s: read failed\n", __func__);
315 return ret;
316 }
315 317
316 len = snprintf(buf, sizeof(buf), "0x%X\n", val); 318 len = snprintf(buf, sizeof(buf), "0x%X\n", val);
317 319
diff --git a/drivers/iio/magnetometer/st_magn_core.c b/drivers/iio/magnetometer/st_magn_core.c
index e68368b5b2a3..08aafba4481c 100644
--- a/drivers/iio/magnetometer/st_magn_core.c
+++ b/drivers/iio/magnetometer/st_magn_core.c
@@ -315,6 +315,10 @@ static const struct st_sensor_settings st_magn_sensors_settings[] = {
315 }, 315 },
316 }, 316 },
317 }, 317 },
318 .drdy_irq = {
319 /* drdy line is routed drdy pin */
320 .addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
321 },
318 .multi_read_bit = true, 322 .multi_read_bit = true,
319 .bootime = 2, 323 .bootime = 2,
320 }, 324 },
diff --git a/drivers/iio/pressure/bmp280-core.c b/drivers/iio/pressure/bmp280-core.c
index 0d2ea3ee371b..8f26428804a2 100644
--- a/drivers/iio/pressure/bmp280-core.c
+++ b/drivers/iio/pressure/bmp280-core.c
@@ -573,7 +573,7 @@ static int bmp280_chip_config(struct bmp280_data *data)
573 u8 osrs = BMP280_OSRS_TEMP_X(data->oversampling_temp + 1) | 573 u8 osrs = BMP280_OSRS_TEMP_X(data->oversampling_temp + 1) |
574 BMP280_OSRS_PRESS_X(data->oversampling_press + 1); 574 BMP280_OSRS_PRESS_X(data->oversampling_press + 1);
575 575
576 ret = regmap_update_bits(data->regmap, BMP280_REG_CTRL_MEAS, 576 ret = regmap_write_bits(data->regmap, BMP280_REG_CTRL_MEAS,
577 BMP280_OSRS_TEMP_MASK | 577 BMP280_OSRS_TEMP_MASK |
578 BMP280_OSRS_PRESS_MASK | 578 BMP280_OSRS_PRESS_MASK |
579 BMP280_MODE_MASK, 579 BMP280_MODE_MASK,
diff --git a/drivers/iio/trigger/stm32-timer-trigger.c b/drivers/iio/trigger/stm32-timer-trigger.c
index 9b9053494daf..eb212f8c8879 100644
--- a/drivers/iio/trigger/stm32-timer-trigger.c
+++ b/drivers/iio/trigger/stm32-timer-trigger.c
@@ -174,6 +174,7 @@ static void stm32_timer_stop(struct stm32_timer_trigger *priv)
174 clk_disable(priv->clk); 174 clk_disable(priv->clk);
175 175
176 /* Stop timer */ 176 /* Stop timer */
177 regmap_update_bits(priv->regmap, TIM_CR1, TIM_CR1_ARPE, 0);
177 regmap_update_bits(priv->regmap, TIM_CR1, TIM_CR1_CEN, 0); 178 regmap_update_bits(priv->regmap, TIM_CR1, TIM_CR1_CEN, 0);
178 regmap_write(priv->regmap, TIM_PSC, 0); 179 regmap_write(priv->regmap, TIM_PSC, 0);
179 regmap_write(priv->regmap, TIM_ARR, 0); 180 regmap_write(priv->regmap, TIM_ARR, 0);
@@ -715,8 +716,9 @@ static ssize_t stm32_count_set_preset(struct iio_dev *indio_dev,
715 if (ret) 716 if (ret)
716 return ret; 717 return ret;
717 718
719 /* TIMx_ARR register shouldn't be buffered (ARPE=0) */
720 regmap_update_bits(priv->regmap, TIM_CR1, TIM_CR1_ARPE, 0);
718 regmap_write(priv->regmap, TIM_ARR, preset); 721 regmap_write(priv->regmap, TIM_ARR, preset);
719 regmap_update_bits(priv->regmap, TIM_CR1, TIM_CR1_ARPE, TIM_CR1_ARPE);
720 722
721 return len; 723 return len;
722} 724}
diff --git a/drivers/staging/iio/adc/ad7192.c b/drivers/staging/iio/adc/ad7192.c
index d11c6de9c777..6150d2780e22 100644
--- a/drivers/staging/iio/adc/ad7192.c
+++ b/drivers/staging/iio/adc/ad7192.c
@@ -223,11 +223,9 @@ static int ad7192_setup(struct ad7192_state *st,
223 struct iio_dev *indio_dev = spi_get_drvdata(st->sd.spi); 223 struct iio_dev *indio_dev = spi_get_drvdata(st->sd.spi);
224 unsigned long long scale_uv; 224 unsigned long long scale_uv;
225 int i, ret, id; 225 int i, ret, id;
226 u8 ones[6];
227 226
228 /* reset the serial interface */ 227 /* reset the serial interface */
229 memset(&ones, 0xFF, 6); 228 ret = ad_sd_reset(&st->sd, 48);
230 ret = spi_write(st->sd.spi, &ones, 6);
231 if (ret < 0) 229 if (ret < 0)
232 goto out; 230 goto out;
233 usleep_range(500, 1000); /* Wait for at least 500us */ 231 usleep_range(500, 1000); /* Wait for at least 500us */
diff --git a/include/linux/iio/adc/ad_sigma_delta.h b/include/linux/iio/adc/ad_sigma_delta.h
index 5ba430cc9a87..1fc7abd28b0b 100644
--- a/include/linux/iio/adc/ad_sigma_delta.h
+++ b/include/linux/iio/adc/ad_sigma_delta.h
@@ -111,6 +111,9 @@ int ad_sd_write_reg(struct ad_sigma_delta *sigma_delta, unsigned int reg,
111int ad_sd_read_reg(struct ad_sigma_delta *sigma_delta, unsigned int reg, 111int ad_sd_read_reg(struct ad_sigma_delta *sigma_delta, unsigned int reg,
112 unsigned int size, unsigned int *val); 112 unsigned int size, unsigned int *val);
113 113
114int ad_sd_reset(struct ad_sigma_delta *sigma_delta,
115 unsigned int reset_length);
116
114int ad_sigma_delta_single_conversion(struct iio_dev *indio_dev, 117int ad_sigma_delta_single_conversion(struct iio_dev *indio_dev,
115 const struct iio_chan_spec *chan, int *val); 118 const struct iio_chan_spec *chan, int *val);
116int ad_sd_calibrate_all(struct ad_sigma_delta *sigma_delta, 119int ad_sd_calibrate_all(struct ad_sigma_delta *sigma_delta,