diff options
Diffstat (limited to 'drivers/iio/adc/stm32-adc.c')
| -rw-r--r-- | drivers/iio/adc/stm32-adc.c | 61 | 
1 files changed, 32 insertions, 29 deletions
diff --git a/drivers/iio/adc/stm32-adc.c b/drivers/iio/adc/stm32-adc.c index 1aadb2ad2cab..bd7e2408bf28 100644 --- a/drivers/iio/adc/stm32-adc.c +++ b/drivers/iio/adc/stm32-adc.c @@ -2006,16 +2006,15 @@ static int stm32_adc_get_legacy_chan_count(struct iio_dev *indio_dev, struct stm  	 * to get the *real* number of channels.  	 */  	ret = device_property_count_u32(dev, "st,adc-diff-channels"); -	if (ret < 0) -		return ret; - -	ret /= (int)(sizeof(struct stm32_adc_diff_channel) / sizeof(u32)); -	if (ret > adc_info->max_channels) { -		dev_err(&indio_dev->dev, "Bad st,adc-diff-channels?\n"); -		return -EINVAL; -	} else if (ret > 0) { -		adc->num_diff = ret; -		num_channels += ret; +	if (ret > 0) { +		ret /= (int)(sizeof(struct stm32_adc_diff_channel) / sizeof(u32)); +		if (ret > adc_info->max_channels) { +			dev_err(&indio_dev->dev, "Bad st,adc-diff-channels?\n"); +			return -EINVAL; +		} else if (ret > 0) { +			adc->num_diff = ret; +			num_channels += ret; +		}  	}  	/* Optional sample time is provided either for each, or all channels */ @@ -2037,6 +2036,7 @@ static int stm32_adc_legacy_chan_init(struct iio_dev *indio_dev,  	struct stm32_adc_diff_channel diff[STM32_ADC_CH_MAX];  	struct device *dev = &indio_dev->dev;  	u32 num_diff = adc->num_diff; +	int num_se = nchans - num_diff;  	int size = num_diff * sizeof(*diff) / sizeof(u32);  	int scan_index = 0, ret, i, c;  	u32 smp = 0, smps[STM32_ADC_CH_MAX], chans[STM32_ADC_CH_MAX]; @@ -2063,29 +2063,32 @@ static int stm32_adc_legacy_chan_init(struct iio_dev *indio_dev,  			scan_index++;  		}  	} - -	ret = device_property_read_u32_array(dev, "st,adc-channels", chans, -					     nchans); -	if (ret) -		return ret; - -	for (c = 0; c < nchans; c++) { -		if (chans[c] >= adc_info->max_channels) { -			dev_err(&indio_dev->dev, "Invalid channel %d\n", -				chans[c]); -			return -EINVAL; +	if (num_se > 0) { +		ret = device_property_read_u32_array(dev, "st,adc-channels", chans, num_se); +		if (ret) { +			dev_err(&indio_dev->dev, "Failed to get st,adc-channels %d\n", ret); +			return ret;  		} -		/* Channel can't be configured both as single-ended & diff */ -		for (i = 0; i < num_diff; i++) { -			if (chans[c] == diff[i].vinp) { -				dev_err(&indio_dev->dev, "channel %d misconfigured\n",	chans[c]); +		for (c = 0; c < num_se; c++) { +			if (chans[c] >= adc_info->max_channels) { +				dev_err(&indio_dev->dev, "Invalid channel %d\n", +					chans[c]);  				return -EINVAL;  			} + +			/* Channel can't be configured both as single-ended & diff */ +			for (i = 0; i < num_diff; i++) { +				if (chans[c] == diff[i].vinp) { +					dev_err(&indio_dev->dev, "channel %d misconfigured\n", +						chans[c]); +					return -EINVAL; +				} +			} +			stm32_adc_chan_init_one(indio_dev, &channels[scan_index], +						chans[c], 0, scan_index, false); +			scan_index++;  		} -		stm32_adc_chan_init_one(indio_dev, &channels[scan_index], -					chans[c], 0, scan_index, false); -		scan_index++;  	}  	if (adc->nsmps > 0) { @@ -2306,7 +2309,7 @@ static int stm32_adc_chan_fw_init(struct iio_dev *indio_dev, bool timestamping)  	if (legacy)  		ret = stm32_adc_legacy_chan_init(indio_dev, adc, channels, -						 num_channels); +						 timestamping ? num_channels - 1 : num_channels);  	else  		ret = stm32_adc_generic_chan_init(indio_dev, adc, channels);  	if (ret < 0)  | 
