diff options
Diffstat (limited to 'drivers/iio/adc')
| -rw-r--r-- | drivers/iio/adc/Kconfig | 2 | ||||
| -rw-r--r-- | drivers/iio/adc/Makefile | 1 | ||||
| -rw-r--r-- | drivers/iio/adc/ad7793.c | 4 | ||||
| -rw-r--r-- | drivers/iio/adc/ad_sigma_delta.c | 28 | ||||
| -rw-r--r-- | drivers/iio/adc/at91-sama5d2_adc.c | 45 | ||||
| -rw-r--r-- | drivers/iio/adc/mcp320x.c | 25 | ||||
| -rw-r--r-- | drivers/iio/adc/qcom-vadc-common.c | 1 | ||||
| -rw-r--r-- | drivers/iio/adc/qcom-vadc-common.h | 1 | ||||
| -rw-r--r-- | drivers/iio/adc/stm32-adc.c | 2 | ||||
| -rw-r--r-- | drivers/iio/adc/ti-ads1015.c | 8 | ||||
| -rw-r--r-- | drivers/iio/adc/twl4030-madc.c | 14 | 
11 files changed, 96 insertions, 35 deletions
diff --git a/drivers/iio/adc/Kconfig b/drivers/iio/adc/Kconfig index 57625653fcb6..1d13bf03c758 100644 --- a/drivers/iio/adc/Kconfig +++ b/drivers/iio/adc/Kconfig @@ -243,6 +243,8 @@ config DA9150_GPADC  config DLN2_ADC  	tristate "Diolan DLN-2 ADC driver support"  	depends on MFD_DLN2 +	select IIO_BUFFER +	select IIO_TRIGGERED_BUFFER  	help  	  Say yes here to build support for Diolan DLN-2 ADC. diff --git a/drivers/iio/adc/Makefile b/drivers/iio/adc/Makefile index 9874e05f52d7..9572c1090f35 100644 --- a/drivers/iio/adc/Makefile +++ b/drivers/iio/adc/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  #  # Makefile for IIO ADC drivers  # 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,  	unsigned int vref_mv)  {  	struct ad7793_state *st = iio_priv(indio_dev); -	int i, ret = -1; +	int i, ret;  	unsigned long long scale_uv;  	u32 id; @@ -266,7 +266,7 @@ static int ad7793_setup(struct iio_dev *indio_dev,  		return ret;  	/* reset the serial interface */ -	ret = spi_write(st->sd.spi, (u8 *)&ret, sizeof(ret)); +	ret = ad_sd_reset(&st->sd, 32);  	if (ret < 0)  		goto out;  	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:  }  EXPORT_SYMBOL_GPL(ad_sd_read_reg); +/** + * ad_sd_reset() - Reset the serial interface + * + * @sigma_delta: The sigma delta device + * @reset_length: Number of SCLKs with DIN = 1 + * + * Returns 0 on success, an error code otherwise. + **/ +int ad_sd_reset(struct ad_sigma_delta *sigma_delta, +	unsigned int reset_length) +{ +	uint8_t *buf; +	unsigned int size; +	int ret; + +	size = DIV_ROUND_UP(reset_length, 8); +	buf = kcalloc(size, sizeof(*buf), GFP_KERNEL); +	if (!buf) +		return -ENOMEM; + +	memset(buf, 0xff, size); +	ret = spi_write(sigma_delta->spi, buf, size); +	kfree(buf); + +	return ret; +} +EXPORT_SYMBOL_GPL(ad_sd_reset); +  static int ad_sd_calibrate(struct ad_sigma_delta *sigma_delta,  	unsigned int mode, unsigned int channel)  { diff --git a/drivers/iio/adc/at91-sama5d2_adc.c b/drivers/iio/adc/at91-sama5d2_adc.c index bc5b38e3a147..a70ef7fec95f 100644 --- a/drivers/iio/adc/at91-sama5d2_adc.c +++ b/drivers/iio/adc/at91-sama5d2_adc.c @@ -225,6 +225,7 @@ struct at91_adc_trigger {  	char				*name;  	unsigned int			trgmod_value;  	unsigned int			edge_type; +	bool				hw_trig;  };  struct at91_adc_state { @@ -254,16 +255,25 @@ static const struct at91_adc_trigger at91_adc_trigger_list[] = {  		.name = "external_rising",  		.trgmod_value = AT91_SAMA5D2_TRGR_TRGMOD_EXT_TRIG_RISE,  		.edge_type = IRQ_TYPE_EDGE_RISING, +		.hw_trig = true,  	},  	{  		.name = "external_falling",  		.trgmod_value = AT91_SAMA5D2_TRGR_TRGMOD_EXT_TRIG_FALL,  		.edge_type = IRQ_TYPE_EDGE_FALLING, +		.hw_trig = true,  	},  	{  		.name = "external_any",  		.trgmod_value = AT91_SAMA5D2_TRGR_TRGMOD_EXT_TRIG_ANY,  		.edge_type = IRQ_TYPE_EDGE_BOTH, +		.hw_trig = true, +	}, +	{ +		.name = "software", +		.trgmod_value = AT91_SAMA5D2_TRGR_TRGMOD_NO_TRIGGER, +		.edge_type = IRQ_TYPE_NONE, +		.hw_trig = false,  	},  }; @@ -597,7 +607,7 @@ static int at91_adc_probe(struct platform_device *pdev)  	struct at91_adc_state *st;  	struct resource	*res;  	int ret, i; -	u32 edge_type; +	u32 edge_type = IRQ_TYPE_NONE;  	indio_dev = devm_iio_device_alloc(&pdev->dev, sizeof(*st));  	if (!indio_dev) @@ -641,14 +651,14 @@ static int at91_adc_probe(struct platform_device *pdev)  	ret = of_property_read_u32(pdev->dev.of_node,  				   "atmel,trigger-edge-type", &edge_type);  	if (ret) { -		dev_err(&pdev->dev, -			"invalid or missing value for atmel,trigger-edge-type\n"); -		return ret; +		dev_dbg(&pdev->dev, +			"atmel,trigger-edge-type not specified, only software trigger available\n");  	}  	st->selected_trig = NULL; -	for (i = 0; i < AT91_SAMA5D2_HW_TRIG_CNT; i++) +	/* find the right trigger, or no trigger at all */ +	for (i = 0; i < AT91_SAMA5D2_HW_TRIG_CNT + 1; i++)  		if (at91_adc_trigger_list[i].edge_type == edge_type) {  			st->selected_trig = &at91_adc_trigger_list[i];  			break; @@ -717,24 +727,27 @@ static int at91_adc_probe(struct platform_device *pdev)  	platform_set_drvdata(pdev, indio_dev); -	ret = at91_adc_buffer_init(indio_dev); -	if (ret < 0) { -		dev_err(&pdev->dev, "couldn't initialize the buffer.\n"); -		goto per_clk_disable_unprepare; -	} +	if (st->selected_trig->hw_trig) { +		ret = at91_adc_buffer_init(indio_dev); +		if (ret < 0) { +			dev_err(&pdev->dev, "couldn't initialize the buffer.\n"); +			goto per_clk_disable_unprepare; +		} -	ret = at91_adc_trigger_init(indio_dev); -	if (ret < 0) { -		dev_err(&pdev->dev, "couldn't setup the triggers.\n"); -		goto per_clk_disable_unprepare; +		ret = at91_adc_trigger_init(indio_dev); +		if (ret < 0) { +			dev_err(&pdev->dev, "couldn't setup the triggers.\n"); +			goto per_clk_disable_unprepare; +		}  	}  	ret = iio_device_register(indio_dev);  	if (ret < 0)  		goto per_clk_disable_unprepare; -	dev_info(&pdev->dev, "setting up trigger as %s\n", -		 st->selected_trig->name); +	if (st->selected_trig->hw_trig) +		dev_info(&pdev->dev, "setting up trigger as %s\n", +			 st->selected_trig->name);  	dev_info(&pdev->dev, "version: %x\n",  		 readl_relaxed(st->base + AT91_SAMA5D2_VERSION)); 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 @@   * MCP3204   * MCP3208   * ------------ + * 13 bit converter + * MCP3301   *   * Datasheet can be found here:   * http://ww1.microchip.com/downloads/en/DeviceDoc/21293C.pdf  mcp3001 @@ -96,7 +98,7 @@ static int mcp320x_channel_to_tx_data(int device_index,  }  static int mcp320x_adc_conversion(struct mcp320x *adc, u8 channel, -				  bool differential, int device_index) +				  bool differential, int device_index, int *val)  {  	int ret; @@ -117,19 +119,25 @@ static int mcp320x_adc_conversion(struct mcp320x *adc, u8 channel,  	switch (device_index) {  	case mcp3001: -		return (adc->rx_buf[0] << 5 | adc->rx_buf[1] >> 3); +		*val = (adc->rx_buf[0] << 5 | adc->rx_buf[1] >> 3); +		return 0;  	case mcp3002:  	case mcp3004:  	case mcp3008: -		return (adc->rx_buf[0] << 2 | adc->rx_buf[1] >> 6); +		*val = (adc->rx_buf[0] << 2 | adc->rx_buf[1] >> 6); +		return 0;  	case mcp3201: -		return (adc->rx_buf[0] << 7 | adc->rx_buf[1] >> 1); +		*val = (adc->rx_buf[0] << 7 | adc->rx_buf[1] >> 1); +		return 0;  	case mcp3202:  	case mcp3204:  	case mcp3208: -		return (adc->rx_buf[0] << 4 | adc->rx_buf[1] >> 4); +		*val = (adc->rx_buf[0] << 4 | adc->rx_buf[1] >> 4); +		return 0;  	case mcp3301: -		return sign_extend32((adc->rx_buf[0] & 0x1f) << 8 | adc->rx_buf[1], 12); +		*val = sign_extend32((adc->rx_buf[0] & 0x1f) << 8 +				    | adc->rx_buf[1], 12); +		return 0;  	default:  		return -EINVAL;  	} @@ -150,12 +158,10 @@ static int mcp320x_read_raw(struct iio_dev *indio_dev,  	switch (mask) {  	case IIO_CHAN_INFO_RAW:  		ret = mcp320x_adc_conversion(adc, channel->address, -			channel->differential, device_index); - +			channel->differential, device_index, val);  		if (ret < 0)  			goto out; -		*val = ret;  		ret = IIO_VAL_INT;  		break; @@ -312,6 +318,7 @@ static int mcp320x_probe(struct spi_device *spi)  	indio_dev->name = spi_get_device_id(spi)->name;  	indio_dev->modes = INDIO_DIRECT_MODE;  	indio_dev->info = &mcp320x_info; +	spi_set_drvdata(spi, indio_dev);  	chip_info = &mcp320x_chip_infos[spi_get_device_id(spi)->driver_data];  	indio_dev->channels = chip_info->channels; diff --git a/drivers/iio/adc/qcom-vadc-common.c b/drivers/iio/adc/qcom-vadc-common.c index 102fc51b10aa..47d24ae5462f 100644 --- a/drivers/iio/adc/qcom-vadc-common.c +++ b/drivers/iio/adc/qcom-vadc-common.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  #include <linux/bug.h>  #include <linux/kernel.h>  #include <linux/bitops.h> diff --git a/drivers/iio/adc/qcom-vadc-common.h b/drivers/iio/adc/qcom-vadc-common.h index 63c872a70adc..1d5354ff5c72 100644 --- a/drivers/iio/adc/qcom-vadc-common.h +++ b/drivers/iio/adc/qcom-vadc-common.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  /*   * Code shared between the different Qualcomm PMIC voltage ADCs   */ 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)  	num_channels = of_property_count_u32_elems(node, "st,adc-channels");  	if (num_channels < 0 || -	    num_channels >= adc_info->max_channels) { +	    num_channels > adc_info->max_channels) {  		dev_err(&indio_dev->dev, "Bad st,adc-channels?\n");  		return num_channels < 0 ? num_channels : -EINVAL;  	} 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 @@  #define ADS1015_CFG_COMP_QUE_MASK	GENMASK(1, 0)  #define ADS1015_CFG_COMP_LAT_MASK	BIT(2) -#define ADS1015_CFG_COMP_POL_MASK	BIT(2) +#define ADS1015_CFG_COMP_POL_MASK	BIT(3)  #define ADS1015_CFG_COMP_MODE_MASK	BIT(4)  #define ADS1015_CFG_DR_MASK	GENMASK(7, 5)  #define ADS1015_CFG_MOD_MASK	BIT(8) @@ -1017,10 +1017,12 @@ static int ads1015_probe(struct i2c_client *client,  		switch (irq_trig) {  		case IRQF_TRIGGER_LOW: -			cfg_comp |= ADS1015_CFG_COMP_POL_LOW; +			cfg_comp |= ADS1015_CFG_COMP_POL_LOW << +					ADS1015_CFG_COMP_POL_SHIFT;  			break;  		case IRQF_TRIGGER_HIGH: -			cfg_comp |= ADS1015_CFG_COMP_POL_HIGH; +			cfg_comp |= ADS1015_CFG_COMP_POL_HIGH << +					ADS1015_CFG_COMP_POL_SHIFT;  			break;  		default:  			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)  	/* Enable 3v1 bias regulator for MADC[3:6] */  	madc->usb3v1 = devm_regulator_get(madc->dev, "vusb3v1"); -	if (IS_ERR(madc->usb3v1)) -		return -ENODEV; +	if (IS_ERR(madc->usb3v1)) { +		ret = -ENODEV; +		goto err_i2c; +	}  	ret = regulator_enable(madc->usb3v1); -	if (ret) +	if (ret) {  		dev_err(madc->dev, "could not enable 3v1 bias regulator\n"); +		goto err_i2c; +	}  	ret = iio_device_register(iio_dev);  	if (ret) {  		dev_err(&pdev->dev, "could not register iio device\n"); -		goto err_i2c; +		goto err_usb3v1;  	}  	return 0; +err_usb3v1: +	regulator_disable(madc->usb3v1);  err_i2c:  	twl4030_madc_set_current_generator(madc, 0, 0);  err_current_generator:  |