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: ad7476: Simplify chip type detection

The ad7476 driver uses a table of structures for defining the IC variant
specific data. Table is indexed using enum values, which are picked by
SPI ID.

Having the table and an enum adds extra complexity and may encourage
adding IC specific quircks in the code, instead of centralizing the IC
differences in one place, the chip-info.

Simplify this by dropping the table and using individual structures for
the IC specific data, and storing the IC specific structure's address
directly in the SPI ID data. Finally, switch to the
spi_get_device_match_data() and add a check for the return value.

Signed-off-by: Matti Vaittinen <mazziesaccount@gmail.com>
Reviewed-by: Nuno Sá <nuno.sa@analog.com>
Reviewed-by: Andy Shevchenko <andy@kernel.org>
Link: https://patch.msgid.link/9e179bb3ba52303448ae4a559c1f011acd3f2fa6.1754901948.git.mazziesaccount@gmail.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>

authored by

Matti Vaittinen and committed by
Jonathan Cameron
79ca9bf9 c1d7b8fe

+146 -150
+146 -150
drivers/iio/adc/ad7476.c
··· 52 52 unsigned char data[ALIGN(2, sizeof(s64)) + sizeof(s64)] __aligned(IIO_DMA_MINALIGN); 53 53 }; 54 54 55 - enum ad7476_supported_device_ids { 56 - ID_AD7091, 57 - ID_AD7091R, 58 - ID_AD7273, 59 - ID_AD7274, 60 - ID_AD7276, 61 - ID_AD7277, 62 - ID_AD7278, 63 - ID_AD7466, 64 - ID_AD7467, 65 - ID_AD7468, 66 - ID_AD7475, 67 - ID_AD7495, 68 - ID_AD7940, 69 - ID_ADC081S, 70 - ID_ADC101S, 71 - ID_ADC121S, 72 - ID_ADS7866, 73 - ID_ADS7867, 74 - ID_ADS7868, 75 - ID_LTC2314_14, 76 - }; 77 - 78 55 static void ad7091_convst(struct ad7476_state *st) 79 56 { 80 57 if (!st->convst_gpio) ··· 167 190 #define ADS786X_CHAN(bits) _AD7476_CHAN((bits), 12 - (bits), \ 168 191 BIT(IIO_CHAN_INFO_RAW)) 169 192 170 - static const struct ad7476_chip_info ad7476_chip_info_tbl[] = { 171 - [ID_AD7091] = { 172 - .channel[0] = AD7091R_CHAN(12), 173 - .channel[1] = IIO_CHAN_SOFT_TIMESTAMP(1), 174 - .convst_channel[0] = AD7091R_CONVST_CHAN(12), 175 - .convst_channel[1] = IIO_CHAN_SOFT_TIMESTAMP(1), 176 - .reset = ad7091_reset, 177 - }, 178 - [ID_AD7091R] = { 179 - .channel[0] = AD7091R_CHAN(12), 180 - .channel[1] = IIO_CHAN_SOFT_TIMESTAMP(1), 181 - .convst_channel[0] = AD7091R_CONVST_CHAN(12), 182 - .convst_channel[1] = IIO_CHAN_SOFT_TIMESTAMP(1), 183 - .int_vref_uv = 2500000, 184 - .has_vref = true, 185 - .reset = ad7091_reset, 186 - }, 187 - [ID_AD7273] = { 188 - .channel[0] = AD7940_CHAN(10), 189 - .channel[1] = IIO_CHAN_SOFT_TIMESTAMP(1), 190 - .has_vref = true, 191 - }, 192 - [ID_AD7274] = { 193 - .channel[0] = AD7940_CHAN(12), 194 - .channel[1] = IIO_CHAN_SOFT_TIMESTAMP(1), 195 - .has_vref = true, 196 - }, 197 - [ID_AD7276] = { 198 - .channel[0] = AD7940_CHAN(12), 199 - .channel[1] = IIO_CHAN_SOFT_TIMESTAMP(1), 200 - }, 201 - [ID_AD7277] = { 202 - .channel[0] = AD7940_CHAN(10), 203 - .channel[1] = IIO_CHAN_SOFT_TIMESTAMP(1), 204 - }, 205 - [ID_AD7278] = { 206 - .channel[0] = AD7940_CHAN(8), 207 - .channel[1] = IIO_CHAN_SOFT_TIMESTAMP(1), 208 - }, 209 - [ID_AD7466] = { 210 - .channel[0] = AD7476_CHAN(12), 211 - .channel[1] = IIO_CHAN_SOFT_TIMESTAMP(1), 212 - }, 213 - [ID_AD7467] = { 214 - .channel[0] = AD7476_CHAN(10), 215 - .channel[1] = IIO_CHAN_SOFT_TIMESTAMP(1), 216 - }, 217 - [ID_AD7468] = { 218 - .channel[0] = AD7476_CHAN(8), 219 - .channel[1] = IIO_CHAN_SOFT_TIMESTAMP(1), 220 - }, 221 - [ID_AD7475] = { 222 - .channel[0] = AD7476_CHAN(12), 223 - .channel[1] = IIO_CHAN_SOFT_TIMESTAMP(1), 224 - .has_vref = true, 225 - .has_vdrive = true, 226 - }, 227 - [ID_AD7495] = { 228 - .channel[0] = AD7476_CHAN(12), 229 - .channel[1] = IIO_CHAN_SOFT_TIMESTAMP(1), 230 - .int_vref_uv = 2500000, 231 - .has_vdrive = true, 232 - }, 233 - [ID_AD7940] = { 234 - .channel[0] = AD7940_CHAN(14), 235 - .channel[1] = IIO_CHAN_SOFT_TIMESTAMP(1), 236 - }, 237 - [ID_ADC081S] = { 238 - .channel[0] = ADC081S_CHAN(8), 239 - .channel[1] = IIO_CHAN_SOFT_TIMESTAMP(1), 240 - }, 241 - [ID_ADC101S] = { 242 - .channel[0] = ADC081S_CHAN(10), 243 - .channel[1] = IIO_CHAN_SOFT_TIMESTAMP(1), 244 - }, 245 - [ID_ADC121S] = { 246 - .channel[0] = ADC081S_CHAN(12), 247 - .channel[1] = IIO_CHAN_SOFT_TIMESTAMP(1), 248 - }, 249 - [ID_ADS7866] = { 250 - .channel[0] = ADS786X_CHAN(12), 251 - .channel[1] = IIO_CHAN_SOFT_TIMESTAMP(1), 252 - }, 253 - [ID_ADS7867] = { 254 - .channel[0] = ADS786X_CHAN(10), 255 - .channel[1] = IIO_CHAN_SOFT_TIMESTAMP(1), 256 - }, 257 - [ID_ADS7868] = { 258 - .channel[0] = ADS786X_CHAN(8), 259 - .channel[1] = IIO_CHAN_SOFT_TIMESTAMP(1), 260 - }, 261 - [ID_LTC2314_14] = { 262 - .channel[0] = AD7940_CHAN(14), 263 - .channel[1] = IIO_CHAN_SOFT_TIMESTAMP(1), 264 - .has_vref = true, 265 - }, 193 + static const struct ad7476_chip_info ad7091_chip_info = { 194 + .channel[0] = AD7091R_CHAN(12), 195 + .channel[1] = IIO_CHAN_SOFT_TIMESTAMP(1), 196 + .convst_channel[0] = AD7091R_CONVST_CHAN(12), 197 + .convst_channel[1] = IIO_CHAN_SOFT_TIMESTAMP(1), 198 + .reset = ad7091_reset, 199 + }; 200 + 201 + static const struct ad7476_chip_info ad7091r_chip_info = { 202 + .channel[0] = AD7091R_CHAN(12), 203 + .channel[1] = IIO_CHAN_SOFT_TIMESTAMP(1), 204 + .convst_channel[0] = AD7091R_CONVST_CHAN(12), 205 + .convst_channel[1] = IIO_CHAN_SOFT_TIMESTAMP(1), 206 + .int_vref_uv = 2500000, 207 + .has_vref = true, 208 + .reset = ad7091_reset, 209 + }; 210 + 211 + static const struct ad7476_chip_info ad7273_chip_info = { 212 + .channel[0] = AD7940_CHAN(10), 213 + .channel[1] = IIO_CHAN_SOFT_TIMESTAMP(1), 214 + .has_vref = true, 215 + }; 216 + 217 + static const struct ad7476_chip_info ad7274_chip_info = { 218 + .channel[0] = AD7940_CHAN(12), 219 + .channel[1] = IIO_CHAN_SOFT_TIMESTAMP(1), 220 + .has_vref = true, 221 + }; 222 + 223 + static const struct ad7476_chip_info ad7276_chip_info = { 224 + .channel[0] = AD7940_CHAN(12), 225 + .channel[1] = IIO_CHAN_SOFT_TIMESTAMP(1), 226 + }; 227 + 228 + static const struct ad7476_chip_info ad7277_chip_info = { 229 + .channel[0] = AD7940_CHAN(10), 230 + .channel[1] = IIO_CHAN_SOFT_TIMESTAMP(1), 231 + }; 232 + 233 + static const struct ad7476_chip_info ad7278_chip_info = { 234 + .channel[0] = AD7940_CHAN(8), 235 + .channel[1] = IIO_CHAN_SOFT_TIMESTAMP(1), 236 + }; 237 + 238 + static const struct ad7476_chip_info ad7466_chip_info = { 239 + .channel[0] = AD7476_CHAN(12), 240 + .channel[1] = IIO_CHAN_SOFT_TIMESTAMP(1), 241 + }; 242 + 243 + static const struct ad7476_chip_info ad7467_chip_info = { 244 + .channel[0] = AD7476_CHAN(10), 245 + .channel[1] = IIO_CHAN_SOFT_TIMESTAMP(1), 246 + }; 247 + 248 + static const struct ad7476_chip_info ad7468_chip_info = { 249 + .channel[0] = AD7476_CHAN(8), 250 + .channel[1] = IIO_CHAN_SOFT_TIMESTAMP(1), 251 + }; 252 + 253 + static const struct ad7476_chip_info ad7475_chip_info = { 254 + .channel[0] = AD7476_CHAN(12), 255 + .channel[1] = IIO_CHAN_SOFT_TIMESTAMP(1), 256 + .has_vref = true, 257 + .has_vdrive = true, 258 + }; 259 + 260 + static const struct ad7476_chip_info ad7495_chip_info = { 261 + .channel[0] = AD7476_CHAN(12), 262 + .channel[1] = IIO_CHAN_SOFT_TIMESTAMP(1), 263 + .int_vref_uv = 2500000, 264 + .has_vdrive = true, 265 + }; 266 + 267 + static const struct ad7476_chip_info ad7940_chip_info = { 268 + .channel[0] = AD7940_CHAN(14), 269 + .channel[1] = IIO_CHAN_SOFT_TIMESTAMP(1), 270 + }; 271 + 272 + static const struct ad7476_chip_info adc081s_chip_info = { 273 + .channel[0] = ADC081S_CHAN(8), 274 + .channel[1] = IIO_CHAN_SOFT_TIMESTAMP(1), 275 + }; 276 + 277 + static const struct ad7476_chip_info adc101s_chip_info = { 278 + .channel[0] = ADC081S_CHAN(10), 279 + .channel[1] = IIO_CHAN_SOFT_TIMESTAMP(1), 280 + }; 281 + 282 + static const struct ad7476_chip_info adc121s_chip_info = { 283 + .channel[0] = ADC081S_CHAN(12), 284 + .channel[1] = IIO_CHAN_SOFT_TIMESTAMP(1), 285 + }; 286 + 287 + static const struct ad7476_chip_info ads7866_chip_info = { 288 + .channel[0] = ADS786X_CHAN(12), 289 + .channel[1] = IIO_CHAN_SOFT_TIMESTAMP(1), 290 + }; 291 + 292 + static const struct ad7476_chip_info ads7867_chip_info = { 293 + .channel[0] = ADS786X_CHAN(10), 294 + .channel[1] = IIO_CHAN_SOFT_TIMESTAMP(1), 295 + }; 296 + 297 + static const struct ad7476_chip_info ads7868_chip_info = { 298 + .channel[0] = ADS786X_CHAN(8), 299 + .channel[1] = IIO_CHAN_SOFT_TIMESTAMP(1), 300 + }; 301 + 302 + static const struct ad7476_chip_info ltc2314_14_chip_info = { 303 + .channel[0] = AD7940_CHAN(14), 304 + .channel[1] = IIO_CHAN_SOFT_TIMESTAMP(1), 305 + .has_vref = true, 266 306 }; 267 307 268 308 static const struct iio_info ad7476_info = { ··· 305 311 return -ENOMEM; 306 312 307 313 st = iio_priv(indio_dev); 308 - st->chip_info = 309 - &ad7476_chip_info_tbl[spi_get_device_id(spi)->driver_data]; 314 + 315 + st->chip_info = spi_get_device_match_data(spi); 316 + if (!st->chip_info) 317 + return -ENODEV; 310 318 311 319 reg = devm_regulator_get(&spi->dev, "vcc"); 312 320 if (IS_ERR(reg)) ··· 404 408 } 405 409 406 410 static const struct spi_device_id ad7476_id[] = { 407 - { "ad7091", ID_AD7091 }, 408 - { "ad7091r", ID_AD7091R }, 409 - { "ad7273", ID_AD7273 }, 410 - { "ad7274", ID_AD7274 }, 411 - { "ad7276", ID_AD7276}, 412 - { "ad7277", ID_AD7277 }, 413 - { "ad7278", ID_AD7278 }, 414 - { "ad7466", ID_AD7466 }, 415 - { "ad7467", ID_AD7467 }, 416 - { "ad7468", ID_AD7468 }, 417 - { "ad7475", ID_AD7475 }, 418 - { "ad7476", ID_AD7466 }, 419 - { "ad7476a", ID_AD7466 }, 420 - { "ad7477", ID_AD7467 }, 421 - { "ad7477a", ID_AD7467 }, 422 - { "ad7478", ID_AD7468 }, 423 - { "ad7478a", ID_AD7468 }, 424 - { "ad7495", ID_AD7495 }, 425 - { "ad7910", ID_AD7467 }, 426 - { "ad7920", ID_AD7466 }, 427 - { "ad7940", ID_AD7940 }, 428 - { "adc081s", ID_ADC081S }, 429 - { "adc101s", ID_ADC101S }, 430 - { "adc121s", ID_ADC121S }, 431 - { "ads7866", ID_ADS7866 }, 432 - { "ads7867", ID_ADS7867 }, 433 - { "ads7868", ID_ADS7868 }, 411 + { "ad7091", (kernel_ulong_t)&ad7091_chip_info }, 412 + { "ad7091r", (kernel_ulong_t)&ad7091r_chip_info }, 413 + { "ad7273", (kernel_ulong_t)&ad7273_chip_info }, 414 + { "ad7274", (kernel_ulong_t)&ad7274_chip_info }, 415 + { "ad7276", (kernel_ulong_t)&ad7276_chip_info }, 416 + { "ad7277", (kernel_ulong_t)&ad7277_chip_info }, 417 + { "ad7278", (kernel_ulong_t)&ad7278_chip_info }, 418 + { "ad7466", (kernel_ulong_t)&ad7466_chip_info }, 419 + { "ad7467", (kernel_ulong_t)&ad7467_chip_info }, 420 + { "ad7468", (kernel_ulong_t)&ad7468_chip_info }, 421 + { "ad7475", (kernel_ulong_t)&ad7475_chip_info }, 422 + { "ad7476", (kernel_ulong_t)&ad7466_chip_info }, 423 + { "ad7476a", (kernel_ulong_t)&ad7466_chip_info }, 424 + { "ad7477", (kernel_ulong_t)&ad7467_chip_info }, 425 + { "ad7477a", (kernel_ulong_t)&ad7467_chip_info }, 426 + { "ad7478", (kernel_ulong_t)&ad7468_chip_info }, 427 + { "ad7478a", (kernel_ulong_t)&ad7468_chip_info }, 428 + { "ad7495", (kernel_ulong_t)&ad7495_chip_info }, 429 + { "ad7910", (kernel_ulong_t)&ad7467_chip_info }, 430 + { "ad7920", (kernel_ulong_t)&ad7466_chip_info }, 431 + { "ad7940", (kernel_ulong_t)&ad7940_chip_info }, 432 + { "adc081s", (kernel_ulong_t)&adc081s_chip_info }, 433 + { "adc101s", (kernel_ulong_t)&adc101s_chip_info }, 434 + { "adc121s", (kernel_ulong_t)&adc121s_chip_info }, 435 + { "ads7866", (kernel_ulong_t)&ads7866_chip_info }, 436 + { "ads7867", (kernel_ulong_t)&ads7867_chip_info }, 437 + { "ads7868", (kernel_ulong_t)&ads7868_chip_info }, 434 438 /* 435 439 * The ROHM BU79100G is identical to the TI's ADS7866 from the software 436 440 * point of view. The binding document mandates the ADS7866 to be 437 441 * marked as a fallback for the BU79100G, but we still need the SPI ID 438 442 * here to make the module loading work. 439 443 */ 440 - { "bu79100g", ID_ADS7866 }, 441 - { "ltc2314-14", ID_LTC2314_14 }, 444 + { "bu79100g", (kernel_ulong_t)&ads7866_chip_info }, 445 + { "ltc2314-14", (kernel_ulong_t)&ltc2314_14_chip_info }, 442 446 { } 443 447 }; 444 448 MODULE_DEVICE_TABLE(spi, ad7476_id);