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

staging: iio: ad9834: convert to device-managed functions in probe

This change converts the driver to use device-managed functions in the
probe function. For the clock and regulator disable, some
devm_add_action_or_reset() calls are required, and then
devm_iio_device_register() function can be used register the IIO device.

The final aim here would be for IIO to export only the device-managed
functions of it's API. That's a long way to go and this a small step in
that direction.

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

authored by

Alexandru Ardelean and committed by
Jonathan Cameron
b627e3b5 70da6415

+31 -36
+31 -36
drivers/staging/iio/frequency/ad9834.c
··· 56 56 /** 57 57 * struct ad9834_state - driver instance specific data 58 58 * @spi: spi_device 59 - * @reg: supply regulator 60 59 * @mclk: external master clock 61 60 * @control: cached control word 62 61 * @xfer: default spi transfer ··· 69 70 70 71 struct ad9834_state { 71 72 struct spi_device *spi; 72 - struct regulator *reg; 73 73 struct clk *mclk; 74 74 unsigned short control; 75 75 unsigned short devid; ··· 388 390 .attrs = &ad9833_attribute_group, 389 391 }; 390 392 393 + static void ad9834_disable_reg(void *data) 394 + { 395 + struct regulator *reg = data; 396 + 397 + regulator_disable(reg); 398 + } 399 + 400 + static void ad9834_disable_clk(void *data) 401 + { 402 + struct clk *clk = data; 403 + 404 + clk_disable_unprepare(clk); 405 + } 406 + 391 407 static int ad9834_probe(struct spi_device *spi) 392 408 { 393 409 struct ad9834_state *st; ··· 419 407 return ret; 420 408 } 421 409 410 + ret = devm_add_action_or_reset(&spi->dev, ad9834_disable_reg, reg); 411 + if (ret) 412 + return ret; 413 + 422 414 indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st)); 423 415 if (!indio_dev) { 424 416 ret = -ENOMEM; 425 - goto error_disable_reg; 417 + return ret; 426 418 } 427 - spi_set_drvdata(spi, indio_dev); 428 419 st = iio_priv(indio_dev); 429 420 mutex_init(&st->lock); 430 421 st->mclk = devm_clk_get(&spi->dev, NULL); 431 422 if (IS_ERR(st->mclk)) { 432 423 ret = PTR_ERR(st->mclk); 433 - goto error_disable_reg; 424 + return ret; 434 425 } 435 426 436 427 ret = clk_prepare_enable(st->mclk); 437 428 if (ret) { 438 429 dev_err(&spi->dev, "Failed to enable master clock\n"); 439 - goto error_disable_reg; 430 + return ret; 440 431 } 432 + 433 + ret = devm_add_action_or_reset(&spi->dev, ad9834_disable_clk, st->mclk); 434 + if (ret) 435 + return ret; 441 436 442 437 st->spi = spi; 443 438 st->devid = spi_get_device_id(spi)->driver_data; 444 - st->reg = reg; 445 439 indio_dev->name = spi_get_device_id(spi)->name; 446 440 switch (st->devid) { 447 441 case ID_AD9833: ··· 488 470 ret = spi_sync(st->spi, &st->msg); 489 471 if (ret) { 490 472 dev_err(&spi->dev, "device init failed\n"); 491 - goto error_clock_unprepare; 473 + return ret; 492 474 } 493 475 494 476 ret = ad9834_write_frequency(st, AD9834_REG_FREQ0, 1000000); 495 477 if (ret) 496 - goto error_clock_unprepare; 478 + return ret; 497 479 498 480 ret = ad9834_write_frequency(st, AD9834_REG_FREQ1, 5000000); 499 481 if (ret) 500 - goto error_clock_unprepare; 482 + return ret; 501 483 502 484 ret = ad9834_write_phase(st, AD9834_REG_PHASE0, 512); 503 485 if (ret) 504 - goto error_clock_unprepare; 486 + return ret; 505 487 506 488 ret = ad9834_write_phase(st, AD9834_REG_PHASE1, 1024); 507 489 if (ret) 508 - goto error_clock_unprepare; 490 + return ret; 509 491 510 - ret = iio_device_register(indio_dev); 511 - if (ret) 512 - goto error_clock_unprepare; 513 - 514 - return 0; 515 - error_clock_unprepare: 516 - clk_disable_unprepare(st->mclk); 517 - error_disable_reg: 518 - regulator_disable(reg); 519 - 520 - return ret; 521 - } 522 - 523 - static int ad9834_remove(struct spi_device *spi) 524 - { 525 - struct iio_dev *indio_dev = spi_get_drvdata(spi); 526 - struct ad9834_state *st = iio_priv(indio_dev); 527 - 528 - iio_device_unregister(indio_dev); 529 - clk_disable_unprepare(st->mclk); 530 - regulator_disable(st->reg); 531 - 532 - return 0; 492 + return devm_iio_device_register(&spi->dev, indio_dev); 533 493 } 534 494 535 495 static const struct spi_device_id ad9834_id[] = { ··· 535 539 .of_match_table = ad9834_of_match 536 540 }, 537 541 .probe = ad9834_probe, 538 - .remove = ad9834_remove, 539 542 .id_table = ad9834_id, 540 543 }; 541 544 module_spi_driver(ad9834_driver);