Преглед на файлове

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
Linus Torvalds преди 7 години
родител
ревизия
77f892eb46

+ 4 - 3
drivers/iio/adc/aspeed_adc.c

@@ -243,7 +243,7 @@ static int aspeed_adc_probe(struct platform_device *pdev)
 					 ASPEED_ADC_INIT_POLLING_TIME,
 					 ASPEED_ADC_INIT_POLLING_TIME,
 					 ASPEED_ADC_INIT_TIMEOUT);
 					 ASPEED_ADC_INIT_TIMEOUT);
 		if (ret)
 		if (ret)
-			goto scaler_error;
+			goto poll_timeout_error;
 	}
 	}
 
 
 	/* Start all channels in normal mode. */
 	/* Start all channels in normal mode. */
@@ -274,9 +274,10 @@ iio_register_error:
 	writel(ASPEED_OPERATION_MODE_POWER_DOWN,
 	writel(ASPEED_OPERATION_MODE_POWER_DOWN,
 		data->base + ASPEED_REG_ENGINE_CONTROL);
 		data->base + ASPEED_REG_ENGINE_CONTROL);
 	clk_disable_unprepare(data->clk_scaler->clk);
 	clk_disable_unprepare(data->clk_scaler->clk);
-reset_error:
-	reset_control_assert(data->rst);
 clk_enable_error:
 clk_enable_error:
+poll_timeout_error:
+	reset_control_assert(data->rst);
+reset_error:
 	clk_hw_unregister_divider(data->clk_scaler);
 	clk_hw_unregister_divider(data->clk_scaler);
 scaler_error:
 scaler_error:
 	clk_hw_unregister_divider(data->clk_prescaler);
 	clk_hw_unregister_divider(data->clk_prescaler);

+ 4 - 3
drivers/iio/adc/stm32-adc.c

@@ -722,8 +722,6 @@ static int stm32h7_adc_enable(struct stm32_adc *adc)
 	int ret;
 	int ret;
 	u32 val;
 	u32 val;
 
 
-	/* Clear ADRDY by writing one, then enable ADC */
-	stm32_adc_set_bits(adc, STM32H7_ADC_ISR, STM32H7_ADRDY);
 	stm32_adc_set_bits(adc, STM32H7_ADC_CR, STM32H7_ADEN);
 	stm32_adc_set_bits(adc, STM32H7_ADC_CR, STM32H7_ADEN);
 
 
 	/* Poll for ADRDY to be set (after adc startup time) */
 	/* Poll for ADRDY to be set (after adc startup time) */
@@ -731,8 +729,11 @@ static int stm32h7_adc_enable(struct stm32_adc *adc)
 					   val & STM32H7_ADRDY,
 					   val & STM32H7_ADRDY,
 					   100, STM32_ADC_TIMEOUT_US);
 					   100, STM32_ADC_TIMEOUT_US);
 	if (ret) {
 	if (ret) {
-		stm32_adc_clr_bits(adc, STM32H7_ADC_CR, STM32H7_ADEN);
+		stm32_adc_set_bits(adc, STM32H7_ADC_CR, STM32H7_ADDIS);
 		dev_err(&indio_dev->dev, "Failed to enable ADC\n");
 		dev_err(&indio_dev->dev, "Failed to enable ADC\n");
+	} else {
+		/* Clear ADRDY by writing one */
+		stm32_adc_set_bits(adc, STM32H7_ADC_ISR, STM32H7_ADRDY);
 	}
 	}
 
 
 	return ret;
 	return ret;

+ 4 - 3
drivers/iio/imu/adis_trigger.c

@@ -46,6 +46,10 @@ int adis_probe_trigger(struct adis *adis, struct iio_dev *indio_dev)
 	if (adis->trig == NULL)
 	if (adis->trig == NULL)
 		return -ENOMEM;
 		return -ENOMEM;
 
 
+	adis->trig->dev.parent = &adis->spi->dev;
+	adis->trig->ops = &adis_trigger_ops;
+	iio_trigger_set_drvdata(adis->trig, adis);
+
 	ret = request_irq(adis->spi->irq,
 	ret = request_irq(adis->spi->irq,
 			  &iio_trigger_generic_data_rdy_poll,
 			  &iio_trigger_generic_data_rdy_poll,
 			  IRQF_TRIGGER_RISING,
 			  IRQF_TRIGGER_RISING,
@@ -54,9 +58,6 @@ int adis_probe_trigger(struct adis *adis, struct iio_dev *indio_dev)
 	if (ret)
 	if (ret)
 		goto error_free_trig;
 		goto error_free_trig;
 
 
-	adis->trig->dev.parent = &adis->spi->dev;
-	adis->trig->ops = &adis_trigger_ops;
-	iio_trigger_set_drvdata(adis->trig, adis);
 	ret = iio_trigger_register(adis->trig);
 	ret = iio_trigger_register(adis->trig);
 
 
 	indio_dev->trig = iio_trigger_get(adis->trig);
 	indio_dev->trig = iio_trigger_get(adis->trig);

+ 1 - 1
drivers/iio/industrialio-buffer.c

@@ -175,7 +175,7 @@ __poll_t iio_buffer_poll(struct file *filp,
 	struct iio_dev *indio_dev = filp->private_data;
 	struct iio_dev *indio_dev = filp->private_data;
 	struct iio_buffer *rb = indio_dev->buffer;
 	struct iio_buffer *rb = indio_dev->buffer;
 
 
-	if (!indio_dev->info)
+	if (!indio_dev->info || rb == NULL)
 		return 0;
 		return 0;
 
 
 	poll_wait(filp, &rb->pollq, wait);
 	poll_wait(filp, &rb->pollq, wait);

+ 2 - 0
drivers/iio/proximity/Kconfig

@@ -68,6 +68,8 @@ config SX9500
 
 
 config SRF08
 config SRF08
 	tristate "Devantech SRF02/SRF08/SRF10 ultrasonic ranger sensor"
 	tristate "Devantech SRF02/SRF08/SRF10 ultrasonic ranger sensor"
+	select IIO_BUFFER
+	select IIO_TRIGGERED_BUFFER
 	depends on I2C
 	depends on I2C
 	help
 	help
 	  Say Y here to build a driver for Devantech SRF02/SRF08/SRF10
 	  Say Y here to build a driver for Devantech SRF02/SRF08/SRF10

+ 11 - 8
drivers/staging/android/ashmem.c

@@ -702,30 +702,32 @@ static int ashmem_pin_unpin(struct ashmem_area *asma, unsigned long cmd,
 	size_t pgstart, pgend;
 	size_t pgstart, pgend;
 	int ret = -EINVAL;
 	int ret = -EINVAL;
 
 
+	mutex_lock(&ashmem_mutex);
+
 	if (unlikely(!asma->file))
 	if (unlikely(!asma->file))
-		return -EINVAL;
+		goto out_unlock;
 
 
-	if (unlikely(copy_from_user(&pin, p, sizeof(pin))))
-		return -EFAULT;
+	if (unlikely(copy_from_user(&pin, p, sizeof(pin)))) {
+		ret = -EFAULT;
+		goto out_unlock;
+	}
 
 
 	/* per custom, you can pass zero for len to mean "everything onward" */
 	/* per custom, you can pass zero for len to mean "everything onward" */
 	if (!pin.len)
 	if (!pin.len)
 		pin.len = PAGE_ALIGN(asma->size) - pin.offset;
 		pin.len = PAGE_ALIGN(asma->size) - pin.offset;
 
 
 	if (unlikely((pin.offset | pin.len) & ~PAGE_MASK))
 	if (unlikely((pin.offset | pin.len) & ~PAGE_MASK))
-		return -EINVAL;
+		goto out_unlock;
 
 
 	if (unlikely(((__u32)-1) - pin.offset < pin.len))
 	if (unlikely(((__u32)-1) - pin.offset < pin.len))
-		return -EINVAL;
+		goto out_unlock;
 
 
 	if (unlikely(PAGE_ALIGN(asma->size) < pin.offset + pin.len))
 	if (unlikely(PAGE_ALIGN(asma->size) < pin.offset + pin.len))
-		return -EINVAL;
+		goto out_unlock;
 
 
 	pgstart = pin.offset / PAGE_SIZE;
 	pgstart = pin.offset / PAGE_SIZE;
 	pgend = pgstart + (pin.len / PAGE_SIZE) - 1;
 	pgend = pgstart + (pin.len / PAGE_SIZE) - 1;
 
 
-	mutex_lock(&ashmem_mutex);
-
 	switch (cmd) {
 	switch (cmd) {
 	case ASHMEM_PIN:
 	case ASHMEM_PIN:
 		ret = ashmem_pin(asma, pgstart, pgend);
 		ret = ashmem_pin(asma, pgstart, pgend);
@@ -738,6 +740,7 @@ static int ashmem_pin_unpin(struct ashmem_area *asma, unsigned long cmd,
 		break;
 		break;
 	}
 	}
 
 
+out_unlock:
 	mutex_unlock(&ashmem_mutex);
 	mutex_unlock(&ashmem_mutex);
 
 
 	return ret;
 	return ret;

+ 17 - 0
drivers/staging/android/ion/ion_cma_heap.c

@@ -12,6 +12,7 @@
 #include <linux/err.h>
 #include <linux/err.h>
 #include <linux/cma.h>
 #include <linux/cma.h>
 #include <linux/scatterlist.h>
 #include <linux/scatterlist.h>
+#include <linux/highmem.h>
 
 
 #include "ion.h"
 #include "ion.h"
 
 
@@ -42,6 +43,22 @@ static int ion_cma_allocate(struct ion_heap *heap, struct ion_buffer *buffer,
 	if (!pages)
 	if (!pages)
 		return -ENOMEM;
 		return -ENOMEM;
 
 
+	if (PageHighMem(pages)) {
+		unsigned long nr_clear_pages = nr_pages;
+		struct page *page = pages;
+
+		while (nr_clear_pages > 0) {
+			void *vaddr = kmap_atomic(page);
+
+			memset(vaddr, 0, PAGE_SIZE);
+			kunmap_atomic(vaddr);
+			page++;
+			nr_clear_pages--;
+		}
+	} else {
+		memset(page_address(pages), 0, size);
+	}
+
 	table = kmalloc(sizeof(*table), GFP_KERNEL);
 	table = kmalloc(sizeof(*table), GFP_KERNEL);
 	if (!table)
 	if (!table)
 		goto err;
 		goto err;

+ 1 - 1
drivers/staging/fsl-mc/bus/Kconfig

@@ -7,7 +7,7 @@
 
 
 config FSL_MC_BUS
 config FSL_MC_BUS
 	bool "QorIQ DPAA2 fsl-mc bus driver"
 	bool "QorIQ DPAA2 fsl-mc bus driver"
-	depends on OF && (ARCH_LAYERSCAPE || (COMPILE_TEST && (ARM || ARM64 || X86 || PPC)))
+	depends on OF && (ARCH_LAYERSCAPE || (COMPILE_TEST && (ARM || ARM64 || X86_LOCAL_APIC || PPC)))
 	select GENERIC_MSI_IRQ_DOMAIN
 	select GENERIC_MSI_IRQ_DOMAIN
 	help
 	help
 	  Driver to enable the bus infrastructure for the QorIQ DPAA2
 	  Driver to enable the bus infrastructure for the QorIQ DPAA2

+ 19 - 8
drivers/staging/iio/adc/ad7192.c

@@ -141,6 +141,8 @@
 #define AD7192_GPOCON_P1DAT	BIT(1) /* P1 state */
 #define AD7192_GPOCON_P1DAT	BIT(1) /* P1 state */
 #define AD7192_GPOCON_P0DAT	BIT(0) /* P0 state */
 #define AD7192_GPOCON_P0DAT	BIT(0) /* P0 state */
 
 
+#define AD7192_EXT_FREQ_MHZ_MIN	2457600
+#define AD7192_EXT_FREQ_MHZ_MAX	5120000
 #define AD7192_INT_FREQ_MHZ	4915200
 #define AD7192_INT_FREQ_MHZ	4915200
 
 
 /* NOTE:
 /* NOTE:
@@ -218,6 +220,12 @@ static int ad7192_calibrate_all(struct ad7192_state *st)
 				ARRAY_SIZE(ad7192_calib_arr));
 				ARRAY_SIZE(ad7192_calib_arr));
 }
 }
 
 
+static inline bool ad7192_valid_external_frequency(u32 freq)
+{
+	return (freq >= AD7192_EXT_FREQ_MHZ_MIN &&
+		freq <= AD7192_EXT_FREQ_MHZ_MAX);
+}
+
 static int ad7192_setup(struct ad7192_state *st,
 static int ad7192_setup(struct ad7192_state *st,
 			const struct ad7192_platform_data *pdata)
 			const struct ad7192_platform_data *pdata)
 {
 {
@@ -243,17 +251,20 @@ static int ad7192_setup(struct ad7192_state *st,
 			 id);
 			 id);
 
 
 	switch (pdata->clock_source_sel) {
 	switch (pdata->clock_source_sel) {
-	case AD7192_CLK_EXT_MCLK1_2:
-	case AD7192_CLK_EXT_MCLK2:
-		st->mclk = AD7192_INT_FREQ_MHZ;
-		break;
 	case AD7192_CLK_INT:
 	case AD7192_CLK_INT:
 	case AD7192_CLK_INT_CO:
 	case AD7192_CLK_INT_CO:
-		if (pdata->ext_clk_hz)
-			st->mclk = pdata->ext_clk_hz;
-		else
-			st->mclk = AD7192_INT_FREQ_MHZ;
+		st->mclk = AD7192_INT_FREQ_MHZ;
 		break;
 		break;
+	case AD7192_CLK_EXT_MCLK1_2:
+	case AD7192_CLK_EXT_MCLK2:
+		if (ad7192_valid_external_frequency(pdata->ext_clk_hz)) {
+			st->mclk = pdata->ext_clk_hz;
+			break;
+		}
+		dev_err(&st->sd.spi->dev, "Invalid frequency setting %u\n",
+			pdata->ext_clk_hz);
+		ret = -EINVAL;
+		goto out;
 	default:
 	default:
 		ret = -EINVAL;
 		ret = -EINVAL;
 		goto out;
 		goto out;

+ 1 - 3
drivers/staging/iio/impedance-analyzer/ad5933.c

@@ -648,8 +648,6 @@ static int ad5933_register_ring_funcs_and_init(struct iio_dev *indio_dev)
 	/* Ring buffer functions - here trigger setup related */
 	/* Ring buffer functions - here trigger setup related */
 	indio_dev->setup_ops = &ad5933_ring_setup_ops;
 	indio_dev->setup_ops = &ad5933_ring_setup_ops;
 
 
-	indio_dev->modes |= INDIO_BUFFER_HARDWARE;
-
 	return 0;
 	return 0;
 }
 }
 
 
@@ -762,7 +760,7 @@ static int ad5933_probe(struct i2c_client *client,
 	indio_dev->dev.parent = &client->dev;
 	indio_dev->dev.parent = &client->dev;
 	indio_dev->info = &ad5933_info;
 	indio_dev->info = &ad5933_info;
 	indio_dev->name = id->name;
 	indio_dev->name = id->name;
-	indio_dev->modes = INDIO_DIRECT_MODE;
+	indio_dev->modes = (INDIO_BUFFER_SOFTWARE | INDIO_DIRECT_MODE);
 	indio_dev->channels = ad5933_channels;
 	indio_dev->channels = ad5933_channels;
 	indio_dev->num_channels = ARRAY_SIZE(ad5933_channels);
 	indio_dev->num_channels = ARRAY_SIZE(ad5933_channels);