diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2018-02-22 15:05:43 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2018-02-22 15:05:43 -0500 |
commit | 77f892eb46aa2e8680fe6b3ba68b53c3ca2067d4 (patch) | |
tree | 6b2730ff763c02c7bd62d8d3b5aa3dc0e1b4d1e1 | |
parent | bb17186a3e6d113971d8819fc52afc578d12fa67 (diff) | |
parent | c6754712e05317923e3f67ac01d45c7d5ec6f79f (diff) |
Merge tag 'staging-4.16-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging
Pull staging/IIO fixes from Greg KH:
"Here are a small number of staging and iio driver fixes for 4.16-rc2.
The IIO fixes are all for reported things, and the android driver
fixes also resolve some reported problems. The remaining fsl-mc
Kconfig change resolves a build testing error that Arnd reported.
All of these have been in linux-next with no reported issues"
* tag 'staging-4.16-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging:
iio: buffer: check if a buffer has been set up when poll is called
iio: adis_lib: Initialize trigger before requesting interrupt
staging: android: ion: Zero CMA allocated memory
staging: android: ashmem: Fix a race condition in pin ioctls
staging: fsl-mc: fix build testing on x86
iio: srf08: fix link error "devm_iio_triggered_buffer_setup" undefined
staging: iio: ad5933: switch buffer mode to software
iio: adc: stm32: fix stm32h7_adc_enable error handling
staging: iio: adc: ad7192: fix external frequency setting
iio: adc: aspeed: Fix error handling path
-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/android/ashmem.c | 19 | ||||
-rw-r--r-- | drivers/staging/android/ion/ion_cma_heap.c | 17 | ||||
-rw-r--r-- | drivers/staging/fsl-mc/bus/Kconfig | 2 | ||||
-rw-r--r-- | drivers/staging/iio/adc/ad7192.c | 27 | ||||
-rw-r--r-- | drivers/staging/iio/impedance-analyzer/ad5933.c | 4 |
10 files changed, 64 insertions, 30 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/android/ashmem.c b/drivers/staging/android/ashmem.c index bbdc53b686dd..6dbba5aff191 100644 --- a/drivers/staging/android/ashmem.c +++ b/drivers/staging/android/ashmem.c | |||
@@ -702,30 +702,32 @@ static int ashmem_pin_unpin(struct ashmem_area *asma, unsigned long cmd, | |||
702 | size_t pgstart, pgend; | 702 | size_t pgstart, pgend; |
703 | int ret = -EINVAL; | 703 | int ret = -EINVAL; |
704 | 704 | ||
705 | mutex_lock(&ashmem_mutex); | ||
706 | |||
705 | if (unlikely(!asma->file)) | 707 | if (unlikely(!asma->file)) |
706 | return -EINVAL; | 708 | goto out_unlock; |
707 | 709 | ||
708 | if (unlikely(copy_from_user(&pin, p, sizeof(pin)))) | 710 | if (unlikely(copy_from_user(&pin, p, sizeof(pin)))) { |
709 | return -EFAULT; | 711 | ret = -EFAULT; |
712 | goto out_unlock; | ||
713 | } | ||
710 | 714 | ||
711 | /* per custom, you can pass zero for len to mean "everything onward" */ | 715 | /* per custom, you can pass zero for len to mean "everything onward" */ |
712 | if (!pin.len) | 716 | if (!pin.len) |
713 | pin.len = PAGE_ALIGN(asma->size) - pin.offset; | 717 | pin.len = PAGE_ALIGN(asma->size) - pin.offset; |
714 | 718 | ||
715 | if (unlikely((pin.offset | pin.len) & ~PAGE_MASK)) | 719 | if (unlikely((pin.offset | pin.len) & ~PAGE_MASK)) |
716 | return -EINVAL; | 720 | goto out_unlock; |
717 | 721 | ||
718 | if (unlikely(((__u32)-1) - pin.offset < pin.len)) | 722 | if (unlikely(((__u32)-1) - pin.offset < pin.len)) |
719 | return -EINVAL; | 723 | goto out_unlock; |
720 | 724 | ||
721 | if (unlikely(PAGE_ALIGN(asma->size) < pin.offset + pin.len)) | 725 | if (unlikely(PAGE_ALIGN(asma->size) < pin.offset + pin.len)) |
722 | return -EINVAL; | 726 | goto out_unlock; |
723 | 727 | ||
724 | pgstart = pin.offset / PAGE_SIZE; | 728 | pgstart = pin.offset / PAGE_SIZE; |
725 | pgend = pgstart + (pin.len / PAGE_SIZE) - 1; | 729 | pgend = pgstart + (pin.len / PAGE_SIZE) - 1; |
726 | 730 | ||
727 | mutex_lock(&ashmem_mutex); | ||
728 | |||
729 | switch (cmd) { | 731 | switch (cmd) { |
730 | case ASHMEM_PIN: | 732 | case ASHMEM_PIN: |
731 | ret = ashmem_pin(asma, pgstart, pgend); | 733 | ret = ashmem_pin(asma, pgstart, pgend); |
@@ -738,6 +740,7 @@ static int ashmem_pin_unpin(struct ashmem_area *asma, unsigned long cmd, | |||
738 | break; | 740 | break; |
739 | } | 741 | } |
740 | 742 | ||
743 | out_unlock: | ||
741 | mutex_unlock(&ashmem_mutex); | 744 | mutex_unlock(&ashmem_mutex); |
742 | 745 | ||
743 | return ret; | 746 | return ret; |
diff --git a/drivers/staging/android/ion/ion_cma_heap.c b/drivers/staging/android/ion/ion_cma_heap.c index 94e06925c712..49718c96bf9e 100644 --- a/drivers/staging/android/ion/ion_cma_heap.c +++ b/drivers/staging/android/ion/ion_cma_heap.c | |||
@@ -12,6 +12,7 @@ | |||
12 | #include <linux/err.h> | 12 | #include <linux/err.h> |
13 | #include <linux/cma.h> | 13 | #include <linux/cma.h> |
14 | #include <linux/scatterlist.h> | 14 | #include <linux/scatterlist.h> |
15 | #include <linux/highmem.h> | ||
15 | 16 | ||
16 | #include "ion.h" | 17 | #include "ion.h" |
17 | 18 | ||
@@ -42,6 +43,22 @@ static int ion_cma_allocate(struct ion_heap *heap, struct ion_buffer *buffer, | |||
42 | if (!pages) | 43 | if (!pages) |
43 | return -ENOMEM; | 44 | return -ENOMEM; |
44 | 45 | ||
46 | if (PageHighMem(pages)) { | ||
47 | unsigned long nr_clear_pages = nr_pages; | ||
48 | struct page *page = pages; | ||
49 | |||
50 | while (nr_clear_pages > 0) { | ||
51 | void *vaddr = kmap_atomic(page); | ||
52 | |||
53 | memset(vaddr, 0, PAGE_SIZE); | ||
54 | kunmap_atomic(vaddr); | ||
55 | page++; | ||
56 | nr_clear_pages--; | ||
57 | } | ||
58 | } else { | ||
59 | memset(page_address(pages), 0, size); | ||
60 | } | ||
61 | |||
45 | table = kmalloc(sizeof(*table), GFP_KERNEL); | 62 | table = kmalloc(sizeof(*table), GFP_KERNEL); |
46 | if (!table) | 63 | if (!table) |
47 | goto err; | 64 | goto err; |
diff --git a/drivers/staging/fsl-mc/bus/Kconfig b/drivers/staging/fsl-mc/bus/Kconfig index 1f9100049176..b35ef7ee6901 100644 --- a/drivers/staging/fsl-mc/bus/Kconfig +++ b/drivers/staging/fsl-mc/bus/Kconfig | |||
@@ -7,7 +7,7 @@ | |||
7 | 7 | ||
8 | config FSL_MC_BUS | 8 | config FSL_MC_BUS |
9 | bool "QorIQ DPAA2 fsl-mc bus driver" | 9 | bool "QorIQ DPAA2 fsl-mc bus driver" |
10 | depends on OF && (ARCH_LAYERSCAPE || (COMPILE_TEST && (ARM || ARM64 || X86 || PPC))) | 10 | depends on OF && (ARCH_LAYERSCAPE || (COMPILE_TEST && (ARM || ARM64 || X86_LOCAL_APIC || PPC))) |
11 | select GENERIC_MSI_IRQ_DOMAIN | 11 | select GENERIC_MSI_IRQ_DOMAIN |
12 | help | 12 | help |
13 | Driver to enable the bus infrastructure for the QorIQ DPAA2 | 13 | Driver to enable the bus infrastructure for the QorIQ DPAA2 |
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 | ||