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

iio: adc: adi-axi-adc: convert to regmap

Use MMIO regmap interface. It makes things easier for manipulating bits.

Reviewed-by: David Lechner <dlechner@baylibre.com>
Signed-off-by: Nuno Sa <nuno.sa@analog.com>
Link: https://lore.kernel.org/r/20231207-iio-backend-prep-v2-8-a4a33bc4d70e@analog.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>

authored by

Nuno Sa and committed by
Jonathan Cameron
21aa971d 8bdfa4a2

+53 -34
+1 -1
drivers/iio/adc/Kconfig
··· 292 292 select IIO_BUFFER 293 293 select IIO_BUFFER_HW_CONSUMER 294 294 select IIO_BUFFER_DMAENGINE 295 - depends on HAS_IOMEM 295 + select REGMAP_MMIO 296 296 depends on OF 297 297 help 298 298 Say yes here to build support for Analog Devices Generic
+52 -33
drivers/iio/adc/adi-axi-adc.c
··· 14 14 #include <linux/of.h> 15 15 #include <linux/platform_device.h> 16 16 #include <linux/property.h> 17 + #include <linux/regmap.h> 17 18 #include <linux/slab.h> 18 19 19 20 #include <linux/iio/iio.h> ··· 63 62 struct mutex lock; 64 63 65 64 struct adi_axi_adc_client *client; 66 - void __iomem *regs; 65 + struct regmap *regmap; 67 66 }; 68 67 69 68 struct adi_axi_adc_client { ··· 90 89 IIO_DMA_MINALIGN); 91 90 } 92 91 EXPORT_SYMBOL_NS_GPL(adi_axi_adc_conv_priv, IIO_ADI_AXI); 93 - 94 - static void adi_axi_adc_write(struct adi_axi_adc_state *st, 95 - unsigned int reg, 96 - unsigned int val) 97 - { 98 - iowrite32(val, st->regs + reg); 99 - } 100 - 101 - static unsigned int adi_axi_adc_read(struct adi_axi_adc_state *st, 102 - unsigned int reg) 103 - { 104 - return ioread32(st->regs + reg); 105 - } 106 92 107 93 static int adi_axi_adc_config_dma_buffer(struct device *dev, 108 94 struct iio_dev *indio_dev) ··· 151 163 { 152 164 struct adi_axi_adc_state *st = iio_priv(indio_dev); 153 165 struct adi_axi_adc_conv *conv = &st->client->conv; 154 - unsigned int i, ctrl; 166 + unsigned int i; 167 + int ret; 155 168 156 169 for (i = 0; i < conv->chip_info->num_channels; i++) { 157 - ctrl = adi_axi_adc_read(st, ADI_AXI_REG_CHAN_CTRL(i)); 158 - 159 170 if (test_bit(i, scan_mask)) 160 - ctrl |= ADI_AXI_REG_CHAN_CTRL_ENABLE; 171 + ret = regmap_set_bits(st->regmap, 172 + ADI_AXI_REG_CHAN_CTRL(i), 173 + ADI_AXI_REG_CHAN_CTRL_ENABLE); 161 174 else 162 - ctrl &= ~ADI_AXI_REG_CHAN_CTRL_ENABLE; 163 - 164 - adi_axi_adc_write(st, ADI_AXI_REG_CHAN_CTRL(i), ctrl); 175 + ret = regmap_clear_bits(st->regmap, 176 + ADI_AXI_REG_CHAN_CTRL(i), 177 + ADI_AXI_REG_CHAN_CTRL_ENABLE); 178 + if (ret) 179 + return ret; 165 180 } 166 181 167 182 return 0; ··· 301 310 } 302 311 303 312 for (i = 0; i < conv->chip_info->num_channels; i++) { 304 - adi_axi_adc_write(st, ADI_AXI_REG_CHAN_CTRL(i), 305 - ADI_AXI_REG_CHAN_CTRL_DEFAULTS); 313 + ret = regmap_write(st->regmap, ADI_AXI_REG_CHAN_CTRL(i), 314 + ADI_AXI_REG_CHAN_CTRL_DEFAULTS); 315 + if (ret) 316 + return ret; 306 317 } 307 318 308 319 return 0; 309 320 } 310 321 311 - static void axi_adc_reset(struct adi_axi_adc_state *st) 322 + static int axi_adc_reset(struct adi_axi_adc_state *st) 312 323 { 313 - adi_axi_adc_write(st, ADI_AXI_REG_RSTN, 0); 324 + int ret; 325 + 326 + ret = regmap_write(st->regmap, ADI_AXI_REG_RSTN, 0); 327 + if (ret) 328 + return ret; 329 + 314 330 mdelay(10); 315 - adi_axi_adc_write(st, ADI_AXI_REG_RSTN, ADI_AXI_REG_RSTN_MMCM_RSTN); 331 + ret = regmap_write(st->regmap, ADI_AXI_REG_RSTN, 332 + ADI_AXI_REG_RSTN_MMCM_RSTN); 333 + if (ret) 334 + return ret; 335 + 316 336 mdelay(10); 317 - adi_axi_adc_write(st, ADI_AXI_REG_RSTN, 318 - ADI_AXI_REG_RSTN_RSTN | ADI_AXI_REG_RSTN_MMCM_RSTN); 337 + return regmap_write(st->regmap, ADI_AXI_REG_RSTN, 338 + ADI_AXI_REG_RSTN_RSTN | ADI_AXI_REG_RSTN_MMCM_RSTN); 319 339 } 320 340 321 341 static void adi_axi_adc_cleanup(void *data) ··· 337 335 module_put(cl->dev->driver->owner); 338 336 } 339 337 338 + static const struct regmap_config axi_adc_regmap_config = { 339 + .val_bits = 32, 340 + .reg_bits = 32, 341 + .reg_stride = 4, 342 + .max_register = 0x0800, 343 + }; 344 + 340 345 static int adi_axi_adc_probe(struct platform_device *pdev) 341 346 { 342 347 struct adi_axi_adc_conv *conv; 343 348 struct iio_dev *indio_dev; 344 349 struct adi_axi_adc_client *cl; 345 350 struct adi_axi_adc_state *st; 351 + void __iomem *base; 346 352 unsigned int ver; 347 353 int ret; 348 354 ··· 371 361 cl->state = st; 372 362 mutex_init(&st->lock); 373 363 374 - st->regs = devm_platform_ioremap_resource(pdev, 0); 375 - if (IS_ERR(st->regs)) 376 - return PTR_ERR(st->regs); 364 + base = devm_platform_ioremap_resource(pdev, 0); 365 + if (IS_ERR(base)) 366 + return PTR_ERR(base); 367 + 368 + st->regmap = devm_regmap_init_mmio(&pdev->dev, base, 369 + &axi_adc_regmap_config); 370 + if (IS_ERR(st->regmap)) 371 + return PTR_ERR(st->regmap); 377 372 378 373 conv = &st->client->conv; 379 374 380 - axi_adc_reset(st); 375 + ret = axi_adc_reset(st); 376 + if (ret) 377 + return ret; 381 378 382 - ver = adi_axi_adc_read(st, ADI_AXI_REG_VERSION); 379 + ret = regmap_read(st->regmap, ADI_AXI_REG_VERSION, &ver); 380 + if (ret) 381 + return ret; 383 382 384 383 if (cl->info->version > ver) { 385 384 dev_err(&pdev->dev,