Skip to content

Commit a080219

Browse files
ukleineknunojsa
authored andcommitted
iio: adc: ad7124: Refuse invalid input specifiers
The ad7124-4 has 8 analog inputs; the input select values 8 to 15 are reserved and not to be used. These are fine for ad7124-8. For both ad7124-4 and ad7124-8 values bigger than 15 are internal channels that might appear as inputs in the channels specified in the device description according to the description of commit f1794fd ("iio: adc: ad7124: Remove input number limitation"), values bigger than 31 don't fit into the respective register bit field and the driver masked them to smaller values. Check for these invalid input specifiers and fail to probe if one is found. Fixes: f1794fd ("iio: adc: ad7124: Remove input number limitation") Signed-off-by: Uwe Kleine-König <u.kleine-koenig@baylibre.com> Link: https://patch.msgid.link/80e3bd629d2b755ab5e061c8731dafa57d08698a.1733504533.git.u.kleine-koenig@baylibre.com Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com> Origin: next-20241216~37^2~24, commit:9ecad7f404b57d8a544c3211cf87a6284e49f4fd
1 parent a0ddebb commit a080219

File tree

1 file changed

+18
-0
lines changed

1 file changed

+18
-0
lines changed

drivers/iio/adc/ad7124.c

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -814,6 +814,19 @@ static int ad7124_check_chip_id(struct ad7124_state *st)
814814
return 0;
815815
}
816816

817+
/*
818+
* Input specifiers 8 - 15 are explicitly reserved for ad7124-4
819+
* while they are fine for ad7124-8. Values above 31 don't fit
820+
* into the register field and so are invalid for sure.
821+
*/
822+
static bool ad7124_valid_input_select(unsigned int ain, const struct ad7124_chip_info *info)
823+
{
824+
if (ain >= info->num_inputs && ain < 16)
825+
return false;
826+
827+
return ain <= FIELD_MAX(AD7124_CHANNEL_AINM_MSK);
828+
}
829+
817830
static int ad7124_of_parse_channel_config(struct iio_dev *indio_dev,
818831
struct device_node *np)
819832
{
@@ -872,6 +885,11 @@ static int ad7124_of_parse_channel_config(struct iio_dev *indio_dev,
872885
if (ret)
873886
goto err;
874887

888+
if (!ad7124_valid_input_select(ain[0], st->chip_info) ||
889+
!ad7124_valid_input_select(ain[1], st->chip_info))
890+
return dev_err_probe(indio_dev->dev.parent, -EINVAL,
891+
"diff-channels property of %pfwP contains invalid data\n", child);
892+
875893
st->channels[channel].nr = channel;
876894
st->channels[channel].ain = AD7124_CHANNEL_AINP(ain[0]) |
877895
AD7124_CHANNEL_AINM(ain[1]);

0 commit comments

Comments
 (0)