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

clk: qcom: smd-rpm: conditionally enable scaling before doing handover

On older platforms like msm8226, msm8974 and msm8916 the driver in the
downstream kernel enables scaling first before doing the handover of the
clocks.

While this normally doesn't seem to cause noticeable problems, on
apq8026-asus-sparrow this causes the device to immediately reboot,
perhaps due to older rpm firmware that becomes unhappy.

On newer platforms the order has swapped and enabling scaling is done
after the handover, so let's introduce this behavior only conditionally
for msm8226 and msm8974 for now.

Signed-off-by: Luca Weiss <luca@z3ntu.xyz>
Reviewed-by: Konrad Dybcio <konrad.dybcio@linaro.org>
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
Link: https://lore.kernel.org/r/20230506-rpmcc-scaling-handover-v1-1-374338a8dfd9@z3ntu.xyz

authored by

Luca Weiss and committed by
Bjorn Andersson
e9a2db5c bbd899f5

+13 -3
+13 -3
drivers/clk/qcom/clk-smd-rpm.c
··· 180 180 struct rpm_smd_clk_desc { 181 181 struct clk_smd_rpm **clks; 182 182 size_t num_clks; 183 + bool scaling_before_handover; 183 184 }; 184 185 185 186 static DEFINE_MUTEX(rpm_smd_clk_lock); ··· 697 696 static const struct rpm_smd_clk_desc rpm_clk_msm8974 = { 698 697 .clks = msm8974_clks, 699 698 .num_clks = ARRAY_SIZE(msm8974_clks), 699 + .scaling_before_handover = true, 700 700 }; 701 701 702 702 static struct clk_smd_rpm *msm8976_clks[] = { ··· 1322 1320 rpm_smd_clks = desc->clks; 1323 1321 num_clks = desc->num_clks; 1324 1322 1323 + if (desc->scaling_before_handover) { 1324 + ret = clk_smd_rpm_enable_scaling(); 1325 + if (ret) 1326 + goto err; 1327 + } 1328 + 1325 1329 for (i = 0; i < num_clks; i++) { 1326 1330 if (!rpm_smd_clks[i]) 1327 1331 continue; ··· 1337 1329 goto err; 1338 1330 } 1339 1331 1340 - ret = clk_smd_rpm_enable_scaling(); 1341 - if (ret) 1342 - goto err; 1332 + if (!desc->scaling_before_handover) { 1333 + ret = clk_smd_rpm_enable_scaling(); 1334 + if (ret) 1335 + goto err; 1336 + } 1343 1337 1344 1338 for (i = 0; i < num_clks; i++) { 1345 1339 if (!rpm_smd_clks[i])