Replace the device_index switch with a TX value computation based on the number of channels in the chip_info structure, so that the latter has all the information needed to handle the variants. Signed-off-by: Vincent Whitchurch <vincent.whitchurch@xxxxxxxx> --- drivers/iio/adc/mcp320x.c | 46 +++++++++++++++++++-------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/drivers/iio/adc/mcp320x.c b/drivers/iio/adc/mcp320x.c index c71d90babb39..77fb4522a378 100644 --- a/drivers/iio/adc/mcp320x.c +++ b/drivers/iio/adc/mcp320x.c @@ -147,29 +147,34 @@ static int mcp3550_convert_rx(struct mcp320x *adc) return (s32)raw; } -static int mcp320x_channel_to_tx_data(int device_index, - const unsigned int channel, bool differential) +static int mcp320x_channel_to_tx_data(const struct mcp320x_chip_info *info, + const struct iio_chan_spec *channel) { int start_bit = 1; + bool differential = channel->differential; + u8 address = channel->address; + /* + * This happens to be the same as the last number of the model name for + * multi-channel MCP300X and MCP320X. + */ + unsigned int num_nondiff_channels = info->num_channels / 2; - switch (device_index) { - case mcp3002: - case mcp3202: + switch (num_nondiff_channels) { + case 2: return ((start_bit << 4) | (!differential << 3) | - (channel << 2)); - case mcp3004: - case mcp3204: - case mcp3008: - case mcp3208: + (address << 2)); + case 4: + case 8: return ((start_bit << 6) | (!differential << 5) | - (channel << 2)); + (address << 2)); default: - return -EINVAL; + return 0; } } -static int mcp320x_adc_conversion(struct mcp320x *adc, u8 channel, - bool differential, int device_index, int *val) +static int mcp320x_adc_conversion(struct mcp320x *adc, + const struct iio_chan_spec *channel, + int *val) { const struct mcp320x_chip_info *info = adc->chip_info; int ret; @@ -185,8 +190,7 @@ static int mcp320x_adc_conversion(struct mcp320x *adc, u8 channel, memset(&adc->rx_buf, 0, sizeof(adc->rx_buf)); if (adc->chip_info->num_channels > 1) - adc->tx_buf = mcp320x_channel_to_tx_data(device_index, channel, - differential); + adc->tx_buf = mcp320x_channel_to_tx_data(info, channel); ret = spi_sync(adc->spi, &adc->msg); if (ret < 0) @@ -203,16 +207,12 @@ static int mcp320x_read_raw(struct iio_dev *indio_dev, { struct mcp320x *adc = iio_priv(indio_dev); int ret = -EINVAL; - int device_index = 0; mutex_lock(&adc->lock); - device_index = spi_get_device_id(adc->spi)->driver_data; - switch (mask) { case IIO_CHAN_INFO_RAW: - ret = mcp320x_adc_conversion(adc, channel->address, - channel->differential, device_index, val); + ret = mcp320x_adc_conversion(adc, channel, val); if (ret < 0) goto out; @@ -452,8 +452,8 @@ static int mcp320x_probe(struct spi_device *spi) * conversions without delay between them resets the chip * and ensures all subsequent conversions succeed. */ - mcp320x_adc_conversion(adc, 0, 1, device_index, &ret); - mcp320x_adc_conversion(adc, 0, 1, device_index, &ret); + mcp320x_adc_conversion(adc, &chip_info->channels[0], &ret); + mcp320x_adc_conversion(adc, &chip_info->channels[0], &ret); } adc->reg = devm_regulator_get(&spi->dev, "vref"); -- 2.34.1