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.

clk: qcom: common: Handle runtime power management in qcom_cc_really_probe

Add support for runtime power management in qcom_cc_really_probe() to
commonize it across all the clock controllers. The runtime power management
is not required for all clock controllers, hence handle the rpm based on
use_rpm flag in clock controller descriptor.

Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
Reviewed-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
Signed-off-by: Jagadeesh Kona <quic_jkona@quicinc.com>
Link: https://lore.kernel.org/r/20250530-videocc-pll-multi-pd-voting-v5-5-02303b3a582d@quicinc.com
Signed-off-by: Bjorn Andersson <andersson@kernel.org>

authored by

Jagadeesh Kona and committed by
Bjorn Andersson
c0b66273 0f698c16

+29 -9
+28 -9
drivers/clk/qcom/common.c
··· 9 9 #include <linux/platform_device.h> 10 10 #include <linux/clk-provider.h> 11 11 #include <linux/interconnect-clk.h> 12 + #include <linux/pm_runtime.h> 12 13 #include <linux/reset-controller.h> 13 14 #include <linux/of.h> 14 15 ··· 305 304 if (ret < 0 && ret != -EEXIST) 306 305 return ret; 307 306 307 + if (desc->use_rpm) { 308 + ret = devm_pm_runtime_enable(dev); 309 + if (ret) 310 + return ret; 311 + 312 + ret = pm_runtime_resume_and_get(dev); 313 + if (ret) 314 + return ret; 315 + } 316 + 308 317 reset = &cc->reset; 309 318 reset->rcdev.of_node = dev->of_node; 310 319 reset->rcdev.ops = &qcom_reset_ops; ··· 325 314 326 315 ret = devm_reset_controller_register(dev, &reset->rcdev); 327 316 if (ret) 328 - return ret; 317 + goto put_rpm; 329 318 330 319 if (desc->gdscs && desc->num_gdscs) { 331 320 scd = devm_kzalloc(dev, sizeof(*scd), GFP_KERNEL); 332 - if (!scd) 333 - return -ENOMEM; 321 + if (!scd) { 322 + ret = -ENOMEM; 323 + goto put_rpm; 324 + } 334 325 scd->dev = dev; 335 326 scd->scs = desc->gdscs; 336 327 scd->num = desc->num_gdscs; 337 328 scd->pd_list = cc->pd_list; 338 329 ret = gdsc_register(scd, &reset->rcdev, regmap); 339 330 if (ret) 340 - return ret; 331 + goto put_rpm; 341 332 ret = devm_add_action_or_reset(dev, qcom_cc_gdsc_unregister, 342 333 scd); 343 334 if (ret) 344 - return ret; 335 + goto put_rpm; 345 336 } 346 337 347 338 cc->rclks = rclks; ··· 354 341 for (i = 0; i < num_clk_hws; i++) { 355 342 ret = devm_clk_hw_register(dev, clk_hws[i]); 356 343 if (ret) 357 - return ret; 344 + goto put_rpm; 358 345 } 359 346 360 347 for (i = 0; i < num_clks; i++) { ··· 363 350 364 351 ret = devm_clk_register_regmap(dev, rclks[i]); 365 352 if (ret) 366 - return ret; 353 + goto put_rpm; 367 354 } 368 355 369 356 ret = devm_of_clk_add_hw_provider(dev, qcom_cc_clk_hw_get, cc); 370 357 if (ret) 371 - return ret; 358 + goto put_rpm; 372 359 373 - return qcom_cc_icc_register(dev, desc); 360 + ret = qcom_cc_icc_register(dev, desc); 361 + 362 + put_rpm: 363 + if (desc->use_rpm) 364 + pm_runtime_put(dev); 365 + 366 + return ret; 374 367 } 375 368 EXPORT_SYMBOL_GPL(qcom_cc_really_probe); 376 369
+1
drivers/clk/qcom/common.h
··· 38 38 const struct qcom_icc_hws_data *icc_hws; 39 39 size_t num_icc_hws; 40 40 unsigned int icc_first_node_id; 41 + bool use_rpm; 41 42 }; 42 43 43 44 /**