diff options
author | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2018-02-20 04:03:22 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2018-02-20 04:03:22 -0500 |
commit | c6754712e05317923e3f67ac01d45c7d5ec6f79f (patch) | |
tree | e8ca596b9a911221b2afd845bb5d66318fe2b0b3 | |
parent | 6d79bd5bb6c79a9dba4842040c9adf39e7806330 (diff) | |
parent | 4cd140bda6494543f1c1b0ccceceaa44b676eef6 (diff) |
Merge tag 'iio-fixes-for-4.16a' 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.16 cycle.
One nasty very old crash around polling for buffers that aren't there
- though that can only cause effects on drivers that support events
but not buffers.
* buffer / kfifo handling in the core.
- Check there is a buffer and return 0 from poll directly if there
isn't. Poll doesn't make sense in this circumstances, but best to close
the hole.
* ad5933
- Change the marked buffer mode to a software buffer as the meaning of
the hardware buffer label has long since changed and this uses a front
end software buffer anyway.
* ad7192
- Fix the fact the external clock frequency was only set when using the
internal clock which was less than helpful.
* adis_lib
- Initialize the trigger before requesting the interrupt. Some newer
parts can power up with interrupt generation enabled so ordering now
matters.
* aspeed-adc
- Fix an errror handling path as labels and general ordering were wrong.
* srf08
- Fix a link error due to undefined devm_iio_triggered_buffer_setup.
* stm32-adc
- Fix error handling unwind squence in stm32h7_adc_enable.
-rw-r--r-- | drivers/iio/adc/aspeed_adc.c | 7 | ||||
-rw-r--r-- | drivers/iio/adc/stm32-adc.c | 7 | ||||
-rw-r--r-- | drivers/iio/imu/adis_trigger.c | 7 | ||||
-rw-r--r-- | drivers/iio/industrialio-buffer.c | 2 | ||||
-rw-r--r-- | drivers/iio/proximity/Kconfig | 2 | ||||
-rw-r--r-- | drivers/staging/iio/adc/ad7192.c | 27 | ||||
-rw-r--r-- | drivers/staging/iio/impedance-analyzer/ad5933.c | 4 |
7 files changed, 35 insertions, 21 deletions
diff --git a/drivers/iio/adc/aspeed_adc.c b/drivers/iio/adc/aspeed_adc.c index 327a49ba1991..9515ca165dfd 100644 --- a/drivers/iio/adc/aspeed_adc.c +++ b/drivers/iio/adc/aspeed_adc.c | |||
@@ -243,7 +243,7 @@ static int aspeed_adc_probe(struct platform_device *pdev) | |||
243 | ASPEED_ADC_INIT_POLLING_TIME, | 243 | ASPEED_ADC_INIT_POLLING_TIME, |
244 | ASPEED_ADC_INIT_TIMEOUT); | 244 | ASPEED_ADC_INIT_TIMEOUT); |
245 | if (ret) | 245 | if (ret) |
246 | goto scaler_error; | 246 | goto poll_timeout_error; |
247 | } | 247 | } |
248 | 248 | ||
249 | /* Start all channels in normal mode. */ | 249 | /* Start all channels in normal mode. */ |
@@ -274,9 +274,10 @@ iio_register_error: | |||
274 | writel(ASPEED_OPERATION_MODE_POWER_DOWN, | 274 | writel(ASPEED_OPERATION_MODE_POWER_DOWN, |
275 | data->base + ASPEED_REG_ENGINE_CONTROL); | 275 | data->base + ASPEED_REG_ENGINE_CONTROL); |
276 | clk_disable_unprepare(data->clk_scaler->clk); | 276 | clk_disable_unprepare(data->clk_scaler->clk); |
277 | reset_error: | ||
278 | reset_control_assert(data->rst); | ||
279 | clk_enable_error: | 277 | clk_enable_error: |
278 | poll_timeout_error: | ||
279 | reset_control_assert(data->rst); | ||
280 | reset_error: | ||
280 | clk_hw_unregister_divider(data->clk_scaler); | 281 | clk_hw_unregister_divider(data->clk_scaler); |
281 | scaler_error: | 282 | scaler_error: |
282 | clk_hw_unregister_divider(data->clk_prescaler); | 283 | clk_hw_unregister_divider(data->clk_prescaler); |
diff --git a/drivers/iio/adc/stm32-adc.c b/drivers/iio/adc/stm32-adc.c index 7f5def465340..9a2583caedaa 100644 --- a/drivers/iio/adc/stm32-adc.c +++ b/drivers/iio/adc/stm32-adc.c | |||
@@ -722,8 +722,6 @@ static int stm32h7_adc_enable(struct stm32_adc *adc) | |||
722 | int ret; | 722 | int ret; |
723 | u32 val; | 723 | u32 val; |
724 | 724 | ||
725 | /* Clear ADRDY by writing one, then enable ADC */ | ||
726 | stm32_adc_set_bits(adc, STM32H7_ADC_ISR, STM32H7_ADRDY); | ||
727 | stm32_adc_set_bits(adc, STM32H7_ADC_CR, STM32H7_ADEN); | 725 | stm32_adc_set_bits(adc, STM32H7_ADC_CR, STM32H7_ADEN); |
728 | 726 | ||
729 | /* Poll for ADRDY to be set (after adc startup time) */ | 727 | /* Poll for ADRDY to be set (after adc startup time) */ |
@@ -731,8 +729,11 @@ static int stm32h7_adc_enable(struct stm32_adc *adc) | |||
731 | val & STM32H7_ADRDY, | 729 | val & STM32H7_ADRDY, |
732 | 100, STM32_ADC_TIMEOUT_US); | 730 | 100, STM32_ADC_TIMEOUT_US); |
733 | if (ret) { | 731 | if (ret) { |
734 | stm32_adc_clr_bits(adc, STM32H7_ADC_CR, STM32H7_ADEN); | 732 | stm32_adc_set_bits(adc, STM32H7_ADC_CR, STM32H7_ADDIS); |
735 | dev_err(&indio_dev->dev, "Failed to enable ADC\n"); | 733 | dev_err(&indio_dev->dev, "Failed to enable ADC\n"); |
734 | } else { | ||
735 | /* Clear ADRDY by writing one */ | ||
736 | stm32_adc_set_bits(adc, STM32H7_ADC_ISR, STM32H7_ADRDY); | ||
736 | } | 737 | } |
737 | 738 | ||
738 | return ret; | 739 | return ret; |
diff --git a/drivers/iio/imu/adis_trigger.c b/drivers/iio/imu/adis_trigger.c index 0dd5a381be64..457372f36791 100644 --- a/drivers/iio/imu/adis_trigger.c +++ b/drivers/iio/imu/adis_trigger.c | |||
@@ -46,6 +46,10 @@ int adis_probe_trigger(struct adis *adis, struct iio_dev *indio_dev) | |||
46 | if (adis->trig == NULL) | 46 | if (adis->trig == NULL) |
47 | return -ENOMEM; | 47 | return -ENOMEM; |
48 | 48 | ||
49 | adis->trig->dev.parent = &adis->spi->dev; | ||
50 | adis->trig->ops = &adis_trigger_ops; | ||
51 | iio_trigger_set_drvdata(adis->trig, adis); | ||
52 | |||
49 | ret = request_irq(adis->spi->irq, | 53 | ret = request_irq(adis->spi->irq, |
50 | &iio_trigger_generic_data_rdy_poll, | 54 | &iio_trigger_generic_data_rdy_poll, |
51 | IRQF_TRIGGER_RISING, | 55 | IRQF_TRIGGER_RISING, |
@@ -54,9 +58,6 @@ int adis_probe_trigger(struct adis *adis, struct iio_dev *indio_dev) | |||
54 | if (ret) | 58 | if (ret) |
55 | goto error_free_trig; | 59 | goto error_free_trig; |
56 | 60 | ||
57 | adis->trig->dev.parent = &adis->spi->dev; | ||
58 | adis->trig->ops = &adis_trigger_ops; | ||
59 | iio_trigger_set_drvdata(adis->trig, adis); | ||
60 | ret = iio_trigger_register(adis->trig); | 61 | ret = iio_trigger_register(adis->trig); |
61 | 62 | ||
62 | indio_dev->trig = iio_trigger_get(adis->trig); | 63 | indio_dev->trig = iio_trigger_get(adis->trig); |
diff --git a/drivers/iio/industrialio-buffer.c b/drivers/iio/industrialio-buffer.c index 79abf70a126d..cd5bfe39591b 100644 --- a/drivers/iio/industrialio-buffer.c +++ b/drivers/iio/industrialio-buffer.c | |||
@@ -175,7 +175,7 @@ __poll_t iio_buffer_poll(struct file *filp, | |||
175 | struct iio_dev *indio_dev = filp->private_data; | 175 | struct iio_dev *indio_dev = filp->private_data; |
176 | struct iio_buffer *rb = indio_dev->buffer; | 176 | struct iio_buffer *rb = indio_dev->buffer; |
177 | 177 | ||
178 | if (!indio_dev->info) | 178 | if (!indio_dev->info || rb == NULL) |
179 | return 0; | 179 | return 0; |
180 | 180 | ||
181 | poll_wait(filp, &rb->pollq, wait); | 181 | poll_wait(filp, &rb->pollq, wait); |
diff --git a/drivers/iio/proximity/Kconfig b/drivers/iio/proximity/Kconfig index fcb1c4ba5e41..f726f9427602 100644 --- a/drivers/iio/proximity/Kconfig +++ b/drivers/iio/proximity/Kconfig | |||
@@ -68,6 +68,8 @@ config SX9500 | |||
68 | 68 | ||
69 | config SRF08 | 69 | config SRF08 |
70 | tristate "Devantech SRF02/SRF08/SRF10 ultrasonic ranger sensor" | 70 | tristate "Devantech SRF02/SRF08/SRF10 ultrasonic ranger sensor" |
71 | select IIO_BUFFER | ||
72 | select IIO_TRIGGERED_BUFFER | ||
71 | depends on I2C | 73 | depends on I2C |
72 | help | 74 | help |
73 | Say Y here to build a driver for Devantech SRF02/SRF08/SRF10 | 75 | Say Y here to build a driver for Devantech SRF02/SRF08/SRF10 |
diff --git a/drivers/staging/iio/adc/ad7192.c b/drivers/staging/iio/adc/ad7192.c index f01595593ce2..425e8b82533b 100644 --- a/drivers/staging/iio/adc/ad7192.c +++ b/drivers/staging/iio/adc/ad7192.c | |||
@@ -141,6 +141,8 @@ | |||
141 | #define AD7192_GPOCON_P1DAT BIT(1) /* P1 state */ | 141 | #define AD7192_GPOCON_P1DAT BIT(1) /* P1 state */ |
142 | #define AD7192_GPOCON_P0DAT BIT(0) /* P0 state */ | 142 | #define AD7192_GPOCON_P0DAT BIT(0) /* P0 state */ |
143 | 143 | ||
144 | #define AD7192_EXT_FREQ_MHZ_MIN 2457600 | ||
145 | #define AD7192_EXT_FREQ_MHZ_MAX 5120000 | ||
144 | #define AD7192_INT_FREQ_MHZ 4915200 | 146 | #define AD7192_INT_FREQ_MHZ 4915200 |
145 | 147 | ||
146 | /* NOTE: | 148 | /* NOTE: |
@@ -218,6 +220,12 @@ static int ad7192_calibrate_all(struct ad7192_state *st) | |||
218 | ARRAY_SIZE(ad7192_calib_arr)); | 220 | ARRAY_SIZE(ad7192_calib_arr)); |
219 | } | 221 | } |
220 | 222 | ||
223 | static inline bool ad7192_valid_external_frequency(u32 freq) | ||
224 | { | ||
225 | return (freq >= AD7192_EXT_FREQ_MHZ_MIN && | ||
226 | freq <= AD7192_EXT_FREQ_MHZ_MAX); | ||
227 | } | ||
228 | |||
221 | static int ad7192_setup(struct ad7192_state *st, | 229 | static int ad7192_setup(struct ad7192_state *st, |
222 | const struct ad7192_platform_data *pdata) | 230 | const struct ad7192_platform_data *pdata) |
223 | { | 231 | { |
@@ -243,17 +251,20 @@ static int ad7192_setup(struct ad7192_state *st, | |||
243 | id); | 251 | id); |
244 | 252 | ||
245 | switch (pdata->clock_source_sel) { | 253 | switch (pdata->clock_source_sel) { |
246 | case AD7192_CLK_EXT_MCLK1_2: | ||
247 | case AD7192_CLK_EXT_MCLK2: | ||
248 | st->mclk = AD7192_INT_FREQ_MHZ; | ||
249 | break; | ||
250 | case AD7192_CLK_INT: | 254 | case AD7192_CLK_INT: |
251 | case AD7192_CLK_INT_CO: | 255 | case AD7192_CLK_INT_CO: |
252 | if (pdata->ext_clk_hz) | 256 | st->mclk = AD7192_INT_FREQ_MHZ; |
253 | st->mclk = pdata->ext_clk_hz; | ||
254 | else | ||
255 | st->mclk = AD7192_INT_FREQ_MHZ; | ||
256 | break; | 257 | break; |
258 | case AD7192_CLK_EXT_MCLK1_2: | ||
259 | case AD7192_CLK_EXT_MCLK2: | ||
260 | if (ad7192_valid_external_frequency(pdata->ext_clk_hz)) { | ||
261 | st->mclk = pdata->ext_clk_hz; | ||
262 | break; | ||
263 | } | ||
264 | dev_err(&st->sd.spi->dev, "Invalid frequency setting %u\n", | ||
265 | pdata->ext_clk_hz); | ||
266 | ret = -EINVAL; | ||
267 | goto out; | ||
257 | default: | 268 | default: |
258 | ret = -EINVAL; | 269 | ret = -EINVAL; |
259 | goto out; | 270 | goto out; |
diff --git a/drivers/staging/iio/impedance-analyzer/ad5933.c b/drivers/staging/iio/impedance-analyzer/ad5933.c index 2b28fb9c0048..3bcf49466361 100644 --- a/drivers/staging/iio/impedance-analyzer/ad5933.c +++ b/drivers/staging/iio/impedance-analyzer/ad5933.c | |||
@@ -648,8 +648,6 @@ static int ad5933_register_ring_funcs_and_init(struct iio_dev *indio_dev) | |||
648 | /* Ring buffer functions - here trigger setup related */ | 648 | /* Ring buffer functions - here trigger setup related */ |
649 | indio_dev->setup_ops = &ad5933_ring_setup_ops; | 649 | indio_dev->setup_ops = &ad5933_ring_setup_ops; |
650 | 650 | ||
651 | indio_dev->modes |= INDIO_BUFFER_HARDWARE; | ||
652 | |||
653 | return 0; | 651 | return 0; |
654 | } | 652 | } |
655 | 653 | ||
@@ -762,7 +760,7 @@ static int ad5933_probe(struct i2c_client *client, | |||
762 | indio_dev->dev.parent = &client->dev; | 760 | indio_dev->dev.parent = &client->dev; |
763 | indio_dev->info = &ad5933_info; | 761 | indio_dev->info = &ad5933_info; |
764 | indio_dev->name = id->name; | 762 | indio_dev->name = id->name; |
765 | indio_dev->modes = INDIO_DIRECT_MODE; | 763 | indio_dev->modes = (INDIO_BUFFER_SOFTWARE | INDIO_DIRECT_MODE); |
766 | indio_dev->channels = ad5933_channels; | 764 | indio_dev->channels = ad5933_channels; |
767 | indio_dev->num_channels = ARRAY_SIZE(ad5933_channels); | 765 | indio_dev->num_channels = ARRAY_SIZE(ad5933_channels); |
768 | 766 | ||