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: ad7768-1: convert driver to use regmap

Convert the AD7768-1 driver to use the regmap API for register
access. This change simplifies and standardizes register interactions,
reducing code duplication and improving maintainability.

Create two regmap configurations, one for 8-bit register values and
other for 24-bit register values.

Since we are using regmap now, define the remaining registers from 0x32
to 0x34.

Reviewed-by: David Lechner <dlechner@baylibre.com>
Signed-off-by: Jonathan Santos <Jonathan.Santos@analog.com>
Link: https://patch.msgid.link/aec9e5452c1ac16d5379a80dfce97c00d85614a2.1744325346.git.Jonathan.Santos@analog.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>

authored by

Jonathan Santos and committed by
Jonathan Cameron
3f4bc0b1 e5cdb098

+110 -51
+1
drivers/iio/adc/Kconfig
··· 329 329 config AD7768_1 330 330 tristate "Analog Devices AD7768-1 ADC driver" 331 331 depends on SPI 332 + select REGMAP_SPI 332 333 select IIO_BUFFER 333 334 select IIO_TRIGGER 334 335 select IIO_TRIGGERED_BUFFER
+109 -51
drivers/iio/adc/ad7768-1.c
··· 12 12 #include <linux/gpio/consumer.h> 13 13 #include <linux/kernel.h> 14 14 #include <linux/module.h> 15 + #include <linux/regmap.h> 15 16 #include <linux/regulator/consumer.h> 16 17 #include <linux/sysfs.h> 17 18 #include <linux/spi/spi.h> ··· 54 53 #define AD7768_REG_SPI_DIAG_ENABLE 0x28 55 54 #define AD7768_REG_ADC_DIAG_ENABLE 0x29 56 55 #define AD7768_REG_DIG_DIAG_ENABLE 0x2A 57 - #define AD7768_REG_ADC_DATA 0x2C 56 + #define AD7768_REG24_ADC_DATA 0x2C 58 57 #define AD7768_REG_MASTER_STATUS 0x2D 59 58 #define AD7768_REG_SPI_DIAG_STATUS 0x2E 60 59 #define AD7768_REG_ADC_DIAG_STATUS 0x2F 61 60 #define AD7768_REG_DIG_DIAG_STATUS 0x30 62 61 #define AD7768_REG_MCLK_COUNTER 0x31 62 + #define AD7768_REG_COEFF_CONTROL 0x32 63 + #define AD7768_REG24_COEFF_DATA 0x33 64 + #define AD7768_REG_ACCESS_KEY 0x34 63 65 64 66 /* AD7768_REG_POWER_CLOCK */ 65 67 #define AD7768_PWR_MCLK_DIV_MSK GENMASK(5, 4) ··· 79 75 /* AD7768_REG_CONVERSION */ 80 76 #define AD7768_CONV_MODE_MSK GENMASK(2, 0) 81 77 #define AD7768_CONV_MODE(x) FIELD_PREP(AD7768_CONV_MODE_MSK, x) 82 - 83 - #define AD7768_RD_FLAG_MSK(x) (BIT(6) | ((x) & 0x3F)) 84 - #define AD7768_WR_FLAG_MSK(x) ((x) & 0x3F) 85 78 86 79 enum ad7768_conv_mode { 87 80 AD7768_CONTINUOUS, ··· 154 153 155 154 struct ad7768_state { 156 155 struct spi_device *spi; 156 + struct regmap *regmap; 157 + struct regmap *regmap24; 157 158 struct regulator *vref; 158 159 struct clk *mclk; 159 160 unsigned int mclk_freq; ··· 178 175 } data __aligned(IIO_DMA_MINALIGN); 179 176 }; 180 177 181 - static int ad7768_spi_reg_read(struct ad7768_state *st, unsigned int addr, 182 - unsigned int len) 183 - { 184 - unsigned int shift; 185 - int ret; 178 + static const struct regmap_range ad7768_regmap_rd_ranges[] = { 179 + regmap_reg_range(AD7768_REG_CHIP_TYPE, AD7768_REG_CHIP_GRADE), 180 + regmap_reg_range(AD7768_REG_SCRATCH_PAD, AD7768_REG_SCRATCH_PAD), 181 + regmap_reg_range(AD7768_REG_VENDOR_L, AD7768_REG_VENDOR_H), 182 + regmap_reg_range(AD7768_REG_INTERFACE_FORMAT, AD7768_REG_GAIN_LO), 183 + regmap_reg_range(AD7768_REG_SPI_DIAG_ENABLE, AD7768_REG_DIG_DIAG_ENABLE), 184 + regmap_reg_range(AD7768_REG_MASTER_STATUS, AD7768_REG_COEFF_CONTROL), 185 + regmap_reg_range(AD7768_REG_ACCESS_KEY, AD7768_REG_ACCESS_KEY), 186 + }; 186 187 187 - shift = 32 - (8 * len); 188 - st->data.d8[0] = AD7768_RD_FLAG_MSK(addr); 188 + static const struct regmap_access_table ad7768_regmap_rd_table = { 189 + .yes_ranges = ad7768_regmap_rd_ranges, 190 + .n_yes_ranges = ARRAY_SIZE(ad7768_regmap_rd_ranges), 191 + }; 189 192 190 - ret = spi_write_then_read(st->spi, st->data.d8, 1, 191 - &st->data.d32, len); 192 - if (ret < 0) 193 - return ret; 193 + static const struct regmap_range ad7768_regmap_wr_ranges[] = { 194 + regmap_reg_range(AD7768_REG_SCRATCH_PAD, AD7768_REG_SCRATCH_PAD), 195 + regmap_reg_range(AD7768_REG_INTERFACE_FORMAT, AD7768_REG_GPIO_WRITE), 196 + regmap_reg_range(AD7768_REG_OFFSET_HI, AD7768_REG_GAIN_LO), 197 + regmap_reg_range(AD7768_REG_SPI_DIAG_ENABLE, AD7768_REG_DIG_DIAG_ENABLE), 198 + regmap_reg_range(AD7768_REG_SPI_DIAG_STATUS, AD7768_REG_SPI_DIAG_STATUS), 199 + regmap_reg_range(AD7768_REG_COEFF_CONTROL, AD7768_REG_COEFF_CONTROL), 200 + regmap_reg_range(AD7768_REG_ACCESS_KEY, AD7768_REG_ACCESS_KEY), 201 + }; 194 202 195 - return (be32_to_cpu(st->data.d32) >> shift); 196 - } 203 + static const struct regmap_access_table ad7768_regmap_wr_table = { 204 + .yes_ranges = ad7768_regmap_wr_ranges, 205 + .n_yes_ranges = ARRAY_SIZE(ad7768_regmap_wr_ranges), 206 + }; 197 207 198 - static int ad7768_spi_reg_write(struct ad7768_state *st, 199 - unsigned int addr, 200 - unsigned int val) 201 - { 202 - st->data.d8[0] = AD7768_WR_FLAG_MSK(addr); 203 - st->data.d8[1] = val & 0xFF; 208 + static const struct regmap_config ad7768_regmap_config = { 209 + .name = "ad7768-1-8", 210 + .reg_bits = 8, 211 + .val_bits = 8, 212 + .read_flag_mask = BIT(6), 213 + .rd_table = &ad7768_regmap_rd_table, 214 + .wr_table = &ad7768_regmap_wr_table, 215 + .max_register = AD7768_REG_ACCESS_KEY, 216 + .use_single_write = true, 217 + .use_single_read = true, 218 + }; 204 219 205 - return spi_write(st->spi, st->data.d8, 2); 206 - } 220 + static const struct regmap_range ad7768_regmap24_rd_ranges[] = { 221 + regmap_reg_range(AD7768_REG24_ADC_DATA, AD7768_REG24_ADC_DATA), 222 + regmap_reg_range(AD7768_REG24_COEFF_DATA, AD7768_REG24_COEFF_DATA), 223 + }; 224 + 225 + static const struct regmap_access_table ad7768_regmap24_rd_table = { 226 + .yes_ranges = ad7768_regmap24_rd_ranges, 227 + .n_yes_ranges = ARRAY_SIZE(ad7768_regmap24_rd_ranges), 228 + }; 229 + 230 + static const struct regmap_range ad7768_regmap24_wr_ranges[] = { 231 + regmap_reg_range(AD7768_REG24_COEFF_DATA, AD7768_REG24_COEFF_DATA), 232 + }; 233 + 234 + static const struct regmap_access_table ad7768_regmap24_wr_table = { 235 + .yes_ranges = ad7768_regmap24_wr_ranges, 236 + .n_yes_ranges = ARRAY_SIZE(ad7768_regmap24_wr_ranges), 237 + }; 238 + 239 + static const struct regmap_config ad7768_regmap24_config = { 240 + .name = "ad7768-1-24", 241 + .reg_bits = 8, 242 + .val_bits = 24, 243 + .read_flag_mask = BIT(6), 244 + .rd_table = &ad7768_regmap24_rd_table, 245 + .wr_table = &ad7768_regmap24_wr_table, 246 + .max_register = AD7768_REG24_COEFF_DATA, 247 + }; 207 248 208 249 static int ad7768_set_mode(struct ad7768_state *st, 209 250 enum ad7768_conv_mode mode) 210 251 { 211 - int regval; 212 - 213 - regval = ad7768_spi_reg_read(st, AD7768_REG_CONVERSION, 1); 214 - if (regval < 0) 215 - return regval; 216 - 217 - regval &= ~AD7768_CONV_MODE_MSK; 218 - regval |= AD7768_CONV_MODE(mode); 219 - 220 - return ad7768_spi_reg_write(st, AD7768_REG_CONVERSION, regval); 252 + return regmap_update_bits(st->regmap, AD7768_REG_CONVERSION, 253 + AD7768_CONV_MODE_MSK, AD7768_CONV_MODE(mode)); 221 254 } 222 255 223 256 static int ad7768_scan_direct(struct iio_dev *indio_dev) ··· 272 233 if (!ret) 273 234 return -ETIMEDOUT; 274 235 275 - readval = ad7768_spi_reg_read(st, AD7768_REG_ADC_DATA, 3); 276 - if (readval < 0) 277 - return readval; 236 + ret = regmap_read(st->regmap24, AD7768_REG24_ADC_DATA, &readval); 237 + if (ret) 238 + return ret; 239 + 278 240 /* 279 241 * Any SPI configuration of the AD7768-1 can only be 280 242 * performed in continuous conversion mode. ··· 298 258 if (!iio_device_claim_direct(indio_dev)) 299 259 return -EBUSY; 300 260 261 + ret = -EINVAL; 301 262 if (readval) { 302 - ret = ad7768_spi_reg_read(st, reg, 1); 303 - if (ret < 0) 304 - goto err_release; 305 - *readval = ret; 306 - ret = 0; 263 + if (regmap_check_range_table(st->regmap, reg, &ad7768_regmap_rd_table)) 264 + ret = regmap_read(st->regmap, reg, readval); 265 + 266 + if (regmap_check_range_table(st->regmap24, reg, &ad7768_regmap24_rd_table)) 267 + ret = regmap_read(st->regmap24, reg, readval); 268 + 307 269 } else { 308 - ret = ad7768_spi_reg_write(st, reg, writeval); 270 + if (regmap_check_range_table(st->regmap, reg, &ad7768_regmap_wr_table)) 271 + ret = regmap_write(st->regmap, reg, writeval); 272 + 273 + if (regmap_check_range_table(st->regmap24, reg, &ad7768_regmap24_wr_table)) 274 + ret = regmap_write(st->regmap24, reg, writeval); 275 + 309 276 } 310 - err_release: 277 + 311 278 iio_device_release_direct(indio_dev); 312 279 313 280 return ret; ··· 331 284 else 332 285 mode = AD7768_DIG_FIL_DEC_RATE(dec_rate); 333 286 334 - ret = ad7768_spi_reg_write(st, AD7768_REG_DIGITAL_FILTER, mode); 287 + ret = regmap_write(st->regmap, AD7768_REG_DIGITAL_FILTER, mode); 335 288 if (ret < 0) 336 289 return ret; 337 290 ··· 368 321 */ 369 322 pwr_mode = AD7768_PWR_MCLK_DIV(ad7768_clk_config[idx].mclk_div) | 370 323 AD7768_PWR_PWRMODE(ad7768_clk_config[idx].pwrmode); 371 - ret = ad7768_spi_reg_write(st, AD7768_REG_POWER_CLOCK, pwr_mode); 324 + ret = regmap_write(st->regmap, AD7768_REG_POWER_CLOCK, pwr_mode); 372 325 if (ret < 0) 373 326 return ret; 374 327 ··· 493 446 * to 10. When the sequence is detected, the reset occurs. 494 447 * See the datasheet, page 70. 495 448 */ 496 - ret = ad7768_spi_reg_write(st, AD7768_REG_SYNC_RESET, 0x3); 449 + ret = regmap_write(st->regmap, AD7768_REG_SYNC_RESET, 0x3); 497 450 if (ret) 498 451 return ret; 499 452 500 - ret = ad7768_spi_reg_write(st, AD7768_REG_SYNC_RESET, 0x2); 453 + ret = regmap_write(st->regmap, AD7768_REG_SYNC_RESET, 0x2); 501 454 if (ret) 502 455 return ret; 503 456 ··· 552 505 * continuous read mode. Subsequent data reads do not require an 553 506 * initial 8-bit write to query the ADC_DATA register. 554 507 */ 555 - return ad7768_spi_reg_write(st, AD7768_REG_INTERFACE_FORMAT, 0x01); 508 + return regmap_write(st->regmap, AD7768_REG_INTERFACE_FORMAT, 0x01); 556 509 } 557 510 558 511 static int ad7768_buffer_predisable(struct iio_dev *indio_dev) 559 512 { 560 513 struct ad7768_state *st = iio_priv(indio_dev); 514 + unsigned int unused; 561 515 562 516 /* 563 517 * To exit continuous read mode, perform a single read of the ADC_DATA 564 518 * reg (0x2C), which allows further configuration of the device. 565 519 */ 566 - return ad7768_spi_reg_read(st, AD7768_REG_ADC_DATA, 3); 520 + return regmap_read(st->regmap24, AD7768_REG24_ADC_DATA, &unused); 567 521 } 568 522 569 523 static const struct iio_buffer_setup_ops ad7768_buffer_ops = { ··· 634 586 } 635 587 636 588 st->spi = spi; 589 + 590 + st->regmap = devm_regmap_init_spi(spi, &ad7768_regmap_config); 591 + if (IS_ERR(st->regmap)) 592 + return dev_err_probe(&spi->dev, PTR_ERR(st->regmap), 593 + "Failed to initialize regmap"); 594 + 595 + st->regmap24 = devm_regmap_init_spi(spi, &ad7768_regmap24_config); 596 + if (IS_ERR(st->regmap24)) 597 + return dev_err_probe(&spi->dev, PTR_ERR(st->regmap24), 598 + "Failed to initialize regmap24"); 637 599 638 600 st->vref = devm_regulator_get(&spi->dev, "vref"); 639 601 if (IS_ERR(st->vref))