Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

iio: adc: ad7606: add 'bits' parameter to channels macros

There are some newer additions to the AD7606 family, which support 18 bit
precision. Up until now, all chips were 16 bit.

This change adds a 'bits' parameter to the AD760X_CHANNEL macro and renames
'ad7606_channels' -> 'ad7606_channels_16bit' for the current devices.

The AD7606_SW_CHANNEL() macro is also introduced, as a short-hand for IIO
channels in SW mode.

Signed-off-by: Alexandru Ardelean <aardelean@baylibre.com>
Reviewed-by: David Lechner <dlechner@baylibre.com>
Link: https://patch.msgid.link/20240919130444.2100447-2-aardelean@baylibre.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>

authored by

Alexandru Ardelean and committed by
Jonathan Cameron
300a90a6 76729a03

+47 -45
+29 -29
drivers/iio/adc/ad7606.c
··· 309 309 AD7605_CHANNEL(3), 310 310 }; 311 311 312 - static const struct iio_chan_spec ad7606_channels[] = { 312 + static const struct iio_chan_spec ad7606_channels_16bit[] = { 313 313 IIO_CHAN_SOFT_TIMESTAMP(8), 314 - AD7606_CHANNEL(0), 315 - AD7606_CHANNEL(1), 316 - AD7606_CHANNEL(2), 317 - AD7606_CHANNEL(3), 318 - AD7606_CHANNEL(4), 319 - AD7606_CHANNEL(5), 320 - AD7606_CHANNEL(6), 321 - AD7606_CHANNEL(7), 314 + AD7606_CHANNEL(0, 16), 315 + AD7606_CHANNEL(1, 16), 316 + AD7606_CHANNEL(2, 16), 317 + AD7606_CHANNEL(3, 16), 318 + AD7606_CHANNEL(4, 16), 319 + AD7606_CHANNEL(5, 16), 320 + AD7606_CHANNEL(6, 16), 321 + AD7606_CHANNEL(7, 16), 322 322 }; 323 323 324 324 /* ··· 333 333 */ 334 334 static const struct iio_chan_spec ad7616_channels[] = { 335 335 IIO_CHAN_SOFT_TIMESTAMP(16), 336 - AD7606_CHANNEL(0), 337 - AD7606_CHANNEL(1), 338 - AD7606_CHANNEL(2), 339 - AD7606_CHANNEL(3), 340 - AD7606_CHANNEL(4), 341 - AD7606_CHANNEL(5), 342 - AD7606_CHANNEL(6), 343 - AD7606_CHANNEL(7), 344 - AD7606_CHANNEL(8), 345 - AD7606_CHANNEL(9), 346 - AD7606_CHANNEL(10), 347 - AD7606_CHANNEL(11), 348 - AD7606_CHANNEL(12), 349 - AD7606_CHANNEL(13), 350 - AD7606_CHANNEL(14), 351 - AD7606_CHANNEL(15), 336 + AD7606_CHANNEL(0, 16), 337 + AD7606_CHANNEL(1, 16), 338 + AD7606_CHANNEL(2, 16), 339 + AD7606_CHANNEL(3, 16), 340 + AD7606_CHANNEL(4, 16), 341 + AD7606_CHANNEL(5, 16), 342 + AD7606_CHANNEL(6, 16), 343 + AD7606_CHANNEL(7, 16), 344 + AD7606_CHANNEL(8, 16), 345 + AD7606_CHANNEL(9, 16), 346 + AD7606_CHANNEL(10, 16), 347 + AD7606_CHANNEL(11, 16), 348 + AD7606_CHANNEL(12, 16), 349 + AD7606_CHANNEL(13, 16), 350 + AD7606_CHANNEL(14, 16), 351 + AD7606_CHANNEL(15, 16), 352 352 }; 353 353 354 354 static const struct ad7606_chip_info ad7606_chip_info_tbl[] = { ··· 358 358 .num_channels = 5, 359 359 }, 360 360 [ID_AD7606_8] = { 361 - .channels = ad7606_channels, 361 + .channels = ad7606_channels_16bit, 362 362 .num_channels = 9, 363 363 .oversampling_avail = ad7606_oversampling_avail, 364 364 .oversampling_num = ARRAY_SIZE(ad7606_oversampling_avail), 365 365 }, 366 366 [ID_AD7606_6] = { 367 - .channels = ad7606_channels, 367 + .channels = ad7606_channels_16bit, 368 368 .num_channels = 7, 369 369 .oversampling_avail = ad7606_oversampling_avail, 370 370 .oversampling_num = ARRAY_SIZE(ad7606_oversampling_avail), 371 371 }, 372 372 [ID_AD7606_4] = { 373 - .channels = ad7606_channels, 373 + .channels = ad7606_channels_16bit, 374 374 .num_channels = 5, 375 375 .oversampling_avail = ad7606_oversampling_avail, 376 376 .oversampling_num = ARRAY_SIZE(ad7606_oversampling_avail), 377 377 }, 378 378 [ID_AD7606B] = { 379 - .channels = ad7606_channels, 379 + .channels = ad7606_channels_16bit, 380 380 .num_channels = 9, 381 381 .oversampling_avail = ad7606_oversampling_avail, 382 382 .oversampling_num = ARRAY_SIZE(ad7606_oversampling_avail),
+10 -8
drivers/iio/adc/ad7606.h
··· 8 8 #ifndef IIO_ADC_AD7606_H_ 9 9 #define IIO_ADC_AD7606_H_ 10 10 11 - #define AD760X_CHANNEL(num, mask_sep, mask_type, mask_all) { \ 11 + #define AD760X_CHANNEL(num, mask_sep, mask_type, mask_all, bits) { \ 12 12 .type = IIO_VOLTAGE, \ 13 13 .indexed = 1, \ 14 14 .channel = num, \ ··· 19 19 .scan_index = num, \ 20 20 .scan_type = { \ 21 21 .sign = 's', \ 22 - .realbits = 16, \ 23 - .storagebits = 16, \ 22 + .realbits = (bits), \ 23 + .storagebits = (bits) > 16 ? 32 : 16, \ 24 24 .endianness = IIO_CPU, \ 25 25 }, \ 26 26 } 27 27 28 28 #define AD7605_CHANNEL(num) \ 29 29 AD760X_CHANNEL(num, BIT(IIO_CHAN_INFO_RAW), \ 30 - BIT(IIO_CHAN_INFO_SCALE), 0) 30 + BIT(IIO_CHAN_INFO_SCALE), 0, 16) 31 31 32 - #define AD7606_CHANNEL(num) \ 32 + #define AD7606_CHANNEL(num, bits) \ 33 33 AD760X_CHANNEL(num, BIT(IIO_CHAN_INFO_RAW), \ 34 34 BIT(IIO_CHAN_INFO_SCALE), \ 35 - BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO)) 35 + BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO), bits) 36 36 37 - #define AD7616_CHANNEL(num) \ 37 + #define AD7606_SW_CHANNEL(num, bits) \ 38 38 AD760X_CHANNEL(num, BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),\ 39 - 0, BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO)) 39 + 0, BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO), bits) 40 + 41 + #define AD7616_CHANNEL(num) AD7606_SW_CHANNEL(num, 16) 40 42 41 43 /** 42 44 * struct ad7606_chip_info - chip specific information
+8 -8
drivers/iio/adc/ad7606_spi.c
··· 67 67 68 68 static const struct iio_chan_spec ad7606b_sw_channels[] = { 69 69 IIO_CHAN_SOFT_TIMESTAMP(8), 70 - AD7616_CHANNEL(0), 71 - AD7616_CHANNEL(1), 72 - AD7616_CHANNEL(2), 73 - AD7616_CHANNEL(3), 74 - AD7616_CHANNEL(4), 75 - AD7616_CHANNEL(5), 76 - AD7616_CHANNEL(6), 77 - AD7616_CHANNEL(7), 70 + AD7606_SW_CHANNEL(0, 16), 71 + AD7606_SW_CHANNEL(1, 16), 72 + AD7606_SW_CHANNEL(2, 16), 73 + AD7606_SW_CHANNEL(3, 16), 74 + AD7606_SW_CHANNEL(4, 16), 75 + AD7606_SW_CHANNEL(5, 16), 76 + AD7606_SW_CHANNEL(6, 16), 77 + AD7606_SW_CHANNEL(7, 16), 78 78 }; 79 79 80 80 static const unsigned int ad7606B_oversampling_avail[9] = {