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

staging: iio: ad9832: convert probe to device-managed

This change does a conversion of the driver to use device-managed init
functions. The 2 regulators and the clock inits are converted to use
devm_add_action_or_reset() callbacks for de-initializing them when the
driver unloads.

And finally the devm_iio_device_register() function can be use to register
the device.

The remove hook can finally be removed and the spi_set_drvdata() call can
also be removed as the private data is no longer used.

Signed-off-by: Alexandru Ardelean <aardelean@deviqon.com>
Link: https://lore.kernel.org/r/20210913115209.300665-1-aardelean@deviqon.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>

authored by

Alexandru Ardelean and committed by
Jonathan Cameron
96788444 8a16c76e

+36 -46
+36 -46
drivers/staging/iio/frequency/ad9832.c
··· 294 294 .attrs = &ad9832_attribute_group, 295 295 }; 296 296 297 + static void ad9832_reg_disable(void *reg) 298 + { 299 + regulator_disable(reg); 300 + } 301 + 302 + static void ad9832_clk_disable(void *clk) 303 + { 304 + clk_disable_unprepare(clk); 305 + } 306 + 297 307 static int ad9832_probe(struct spi_device *spi) 298 308 { 299 309 struct ad9832_platform_data *pdata = dev_get_platdata(&spi->dev); ··· 320 310 if (!indio_dev) 321 311 return -ENOMEM; 322 312 323 - spi_set_drvdata(spi, indio_dev); 324 313 st = iio_priv(indio_dev); 325 314 326 315 st->avdd = devm_regulator_get(&spi->dev, "avdd"); ··· 332 323 return ret; 333 324 } 334 325 326 + ret = devm_add_action_or_reset(&spi->dev, ad9832_reg_disable, st->avdd); 327 + if (ret) 328 + return ret; 329 + 335 330 st->dvdd = devm_regulator_get(&spi->dev, "dvdd"); 336 - if (IS_ERR(st->dvdd)) { 337 - ret = PTR_ERR(st->dvdd); 338 - goto error_disable_avdd; 339 - } 331 + if (IS_ERR(st->dvdd)) 332 + return PTR_ERR(st->dvdd); 340 333 341 334 ret = regulator_enable(st->dvdd); 342 335 if (ret) { 343 336 dev_err(&spi->dev, "Failed to enable specified DVDD supply\n"); 344 - goto error_disable_avdd; 337 + return ret; 345 338 } 346 339 340 + ret = devm_add_action_or_reset(&spi->dev, ad9832_reg_disable, st->dvdd); 341 + if (ret) 342 + return ret; 343 + 347 344 st->mclk = devm_clk_get(&spi->dev, "mclk"); 348 - if (IS_ERR(st->mclk)) { 349 - ret = PTR_ERR(st->mclk); 350 - goto error_disable_dvdd; 351 - } 345 + if (IS_ERR(st->mclk)) 346 + return PTR_ERR(st->mclk); 352 347 353 348 ret = clk_prepare_enable(st->mclk); 354 349 if (ret < 0) 355 - goto error_disable_dvdd; 350 + return ret; 351 + 352 + ret = devm_add_action_or_reset(&spi->dev, ad9832_clk_disable, st->mclk); 353 + if (ret) 354 + return ret; 356 355 357 356 st->spi = spi; 358 357 mutex_init(&st->lock); ··· 411 394 ret = spi_sync(st->spi, &st->msg); 412 395 if (ret) { 413 396 dev_err(&spi->dev, "device init failed\n"); 414 - goto error_unprepare_mclk; 397 + return ret; 415 398 } 416 399 417 400 ret = ad9832_write_frequency(st, AD9832_FREQ0HM, pdata->freq0); 418 401 if (ret) 419 - goto error_unprepare_mclk; 402 + return ret; 420 403 421 404 ret = ad9832_write_frequency(st, AD9832_FREQ1HM, pdata->freq1); 422 405 if (ret) 423 - goto error_unprepare_mclk; 406 + return ret; 424 407 425 408 ret = ad9832_write_phase(st, AD9832_PHASE0H, pdata->phase0); 426 409 if (ret) 427 - goto error_unprepare_mclk; 410 + return ret; 428 411 429 412 ret = ad9832_write_phase(st, AD9832_PHASE1H, pdata->phase1); 430 413 if (ret) 431 - goto error_unprepare_mclk; 414 + return ret; 432 415 433 416 ret = ad9832_write_phase(st, AD9832_PHASE2H, pdata->phase2); 434 417 if (ret) 435 - goto error_unprepare_mclk; 418 + return ret; 436 419 437 420 ret = ad9832_write_phase(st, AD9832_PHASE3H, pdata->phase3); 438 421 if (ret) 439 - goto error_unprepare_mclk; 422 + return ret; 440 423 441 - ret = iio_device_register(indio_dev); 442 - if (ret) 443 - goto error_unprepare_mclk; 444 - 445 - return 0; 446 - 447 - error_unprepare_mclk: 448 - clk_disable_unprepare(st->mclk); 449 - error_disable_dvdd: 450 - regulator_disable(st->dvdd); 451 - error_disable_avdd: 452 - regulator_disable(st->avdd); 453 - 454 - return ret; 455 - } 456 - 457 - static int ad9832_remove(struct spi_device *spi) 458 - { 459 - struct iio_dev *indio_dev = spi_get_drvdata(spi); 460 - struct ad9832_state *st = iio_priv(indio_dev); 461 - 462 - iio_device_unregister(indio_dev); 463 - clk_disable_unprepare(st->mclk); 464 - regulator_disable(st->dvdd); 465 - regulator_disable(st->avdd); 466 - 467 - return 0; 424 + return devm_iio_device_register(&spi->dev, indio_dev); 468 425 } 469 426 470 427 static const struct spi_device_id ad9832_id[] = { ··· 453 462 .name = "ad9832", 454 463 }, 455 464 .probe = ad9832_probe, 456 - .remove = ad9832_remove, 457 465 .id_table = ad9832_id, 458 466 }; 459 467 module_spi_driver(ad9832_driver);