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: rzg2l_adc: Simplify the runtime PM code

All Renesas SoCs using the rzg2l_adc driver manage ADC clocks through PM
domains. Calling pm_runtime_{resume_and_get, put_sync}() implicitly sets
the state of the clocks. As a result, the code in the rzg2l_adc driver that
explicitly manages ADC clocks can be removed, leading to simpler and
cleaner implementation.

Additionally, replace the use of rzg2l_adc_set_power() with direct PM
runtime API calls to further simplify and clean up the code.

Signed-off-by: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
Reviewed-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
Link: https://patch.msgid.link/20241206111337.726244-5-claudiu.beznea.uj@bp.renesas.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>

authored by

Claudiu Beznea and committed by
Jonathan Cameron
89ee8174 b010b104

+20 -78
+20 -78
drivers/iio/adc/rzg2l_adc.c
··· 8 8 */ 9 9 10 10 #include <linux/bitfield.h> 11 - #include <linux/clk.h> 12 11 #include <linux/completion.h> 13 12 #include <linux/delay.h> 14 13 #include <linux/iio/iio.h> ··· 68 69 69 70 struct rzg2l_adc { 70 71 void __iomem *base; 71 - struct clk *pclk; 72 - struct clk *adclk; 73 72 struct reset_control *presetn; 74 73 struct reset_control *adrstn; 75 74 struct completion completion; ··· 185 188 return 0; 186 189 } 187 190 188 - static int rzg2l_adc_set_power(struct iio_dev *indio_dev, bool on) 189 - { 190 - struct device *dev = indio_dev->dev.parent; 191 - 192 - if (on) 193 - return pm_runtime_resume_and_get(dev); 194 - 195 - return pm_runtime_put_sync(dev); 196 - } 197 - 198 191 static int rzg2l_adc_conversion(struct iio_dev *indio_dev, struct rzg2l_adc *adc, u8 ch) 199 192 { 193 + struct device *dev = indio_dev->dev.parent; 200 194 int ret; 201 195 202 - ret = rzg2l_adc_set_power(indio_dev, true); 196 + ret = pm_runtime_resume_and_get(dev); 203 197 if (ret) 204 198 return ret; 205 199 206 200 ret = rzg2l_adc_conversion_setup(adc, ch); 207 - if (ret) { 208 - rzg2l_adc_set_power(indio_dev, false); 209 - return ret; 210 - } 201 + if (ret) 202 + goto rpm_put; 211 203 212 204 reinit_completion(&adc->completion); 213 205 ··· 205 219 if (!wait_for_completion_timeout(&adc->completion, RZG2L_ADC_TIMEOUT)) { 206 220 rzg2l_adc_writel(adc, RZG2L_ADINT, 207 221 rzg2l_adc_readl(adc, RZG2L_ADINT) & ~RZG2L_ADINT_INTEN_MASK); 208 - rzg2l_adc_start_stop(adc, false); 209 - rzg2l_adc_set_power(indio_dev, false); 210 - return -ETIMEDOUT; 222 + ret = -ETIMEDOUT; 211 223 } 212 224 213 - return rzg2l_adc_set_power(indio_dev, false); 225 + rzg2l_adc_start_stop(adc, false); 226 + 227 + rpm_put: 228 + pm_runtime_put_sync(dev); 229 + return ret; 214 230 } 215 231 216 232 static int rzg2l_adc_read_raw(struct iio_dev *indio_dev, ··· 337 349 return 0; 338 350 } 339 351 340 - static int rzg2l_adc_hw_init(struct rzg2l_adc *adc) 352 + static int rzg2l_adc_hw_init(struct device *dev, struct rzg2l_adc *adc) 341 353 { 342 354 int timeout = 5; 343 355 u32 reg; 344 356 int ret; 345 357 346 - ret = clk_prepare_enable(adc->pclk); 358 + ret = pm_runtime_resume_and_get(dev); 347 359 if (ret) 348 360 return ret; 349 361 ··· 381 393 rzg2l_adc_writel(adc, RZG2L_ADM(3), reg); 382 394 383 395 exit_hw_init: 384 - clk_disable_unprepare(adc->pclk); 385 - 396 + pm_runtime_put_sync(dev); 386 397 return ret; 387 - } 388 - 389 - static void rzg2l_adc_pm_runtime_disable(void *data) 390 - { 391 - struct device *dev = data; 392 - 393 - pm_runtime_disable(dev->parent); 394 - } 395 - 396 - static void rzg2l_adc_pm_runtime_set_suspended(void *data) 397 - { 398 - struct device *dev = data; 399 - 400 - pm_runtime_set_suspended(dev->parent); 401 398 } 402 399 403 400 static int rzg2l_adc_probe(struct platform_device *pdev) ··· 409 436 if (IS_ERR(adc->base)) 410 437 return PTR_ERR(adc->base); 411 438 412 - adc->pclk = devm_clk_get(dev, "pclk"); 413 - if (IS_ERR(adc->pclk)) 414 - return dev_err_probe(dev, PTR_ERR(adc->pclk), 415 - "Failed to get pclk"); 416 - 417 - adc->adclk = devm_clk_get(dev, "adclk"); 418 - if (IS_ERR(adc->adclk)) 419 - return dev_err_probe(dev, PTR_ERR(adc->adclk), 420 - "Failed to get adclk"); 421 - 422 439 adc->adrstn = devm_reset_control_get_exclusive_deasserted(dev, "adrst-n"); 423 440 if (IS_ERR(adc->adrstn)) 424 441 return dev_err_probe(dev, PTR_ERR(adc->adrstn), ··· 419 456 return dev_err_probe(dev, PTR_ERR(adc->presetn), 420 457 "failed to get/deassert presetn\n"); 421 458 422 - ret = rzg2l_adc_hw_init(adc); 459 + ret = devm_pm_runtime_enable(dev); 460 + if (ret) 461 + return ret; 462 + 463 + platform_set_drvdata(pdev, indio_dev); 464 + 465 + ret = rzg2l_adc_hw_init(dev, adc); 423 466 if (ret) 424 467 return dev_err_probe(&pdev->dev, ret, 425 468 "failed to initialize ADC HW\n"); ··· 441 472 442 473 init_completion(&adc->completion); 443 474 444 - platform_set_drvdata(pdev, indio_dev); 445 - 446 475 indio_dev->name = DRIVER_NAME; 447 476 indio_dev->info = &rzg2l_adc_iio_info; 448 477 indio_dev->modes = INDIO_DIRECT_MODE; 449 478 indio_dev->channels = adc->data->channels; 450 479 indio_dev->num_channels = adc->data->num_channels; 451 - 452 - pm_runtime_set_suspended(dev); 453 - ret = devm_add_action_or_reset(&pdev->dev, 454 - rzg2l_adc_pm_runtime_set_suspended, &indio_dev->dev); 455 - if (ret) 456 - return ret; 457 - 458 - pm_runtime_enable(dev); 459 - ret = devm_add_action_or_reset(&pdev->dev, 460 - rzg2l_adc_pm_runtime_disable, &indio_dev->dev); 461 - if (ret) 462 - return ret; 463 480 464 481 return devm_iio_device_register(dev, indio_dev); 465 482 } ··· 462 507 struct rzg2l_adc *adc = iio_priv(indio_dev); 463 508 464 509 rzg2l_adc_pwr(adc, false); 465 - clk_disable_unprepare(adc->adclk); 466 - clk_disable_unprepare(adc->pclk); 467 510 468 511 return 0; 469 512 } ··· 470 517 { 471 518 struct iio_dev *indio_dev = dev_get_drvdata(dev); 472 519 struct rzg2l_adc *adc = iio_priv(indio_dev); 473 - int ret; 474 - 475 - ret = clk_prepare_enable(adc->pclk); 476 - if (ret) 477 - return ret; 478 - 479 - ret = clk_prepare_enable(adc->adclk); 480 - if (ret) { 481 - clk_disable_unprepare(adc->pclk); 482 - return ret; 483 - } 484 520 485 521 rzg2l_adc_pwr(adc, true); 486 522