clk: qcom: rpmh: make clkaN optional

On SM8650, clkaN are missing in cmd-db for some specific devices. This
caused a boot failure. Printing log during initramfs phase, I found

[    0.053281] clk-rpmh 17a00000.rsc:clock-controller: missing RPMh resource address for clka1

Adding the optional property to avoid probing failure which causes
countless deferred probe. In the downstream tree,similar workarounds
are introduced for SM7635, SM8550, SM8635, SM8650, SM8750.

Signed-off-by: Pengyu Luo <mitltlatltl@gmail.com>
Link: https://lore.kernel.org/r/20250413172205.175789-1-mitltlatltl@gmail.com
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
pull/1253/head
Pengyu Luo 2025-04-14 01:22:04 +08:00 committed by Bjorn Andersson
parent 1003cea3c7
commit 166e65bc6c
1 changed files with 11 additions and 0 deletions

View File

@ -66,6 +66,8 @@ struct clk_rpmh {
struct clk_rpmh_desc { struct clk_rpmh_desc {
struct clk_hw **clks; struct clk_hw **clks;
size_t num_clks; size_t num_clks;
/* RPMh clock clkaN are optional for this platform */
bool clka_optional;
}; };
static DEFINE_MUTEX(rpmh_clk_lock); static DEFINE_MUTEX(rpmh_clk_lock);
@ -648,6 +650,7 @@ static struct clk_hw *sm8550_rpmh_clocks[] = {
static const struct clk_rpmh_desc clk_rpmh_sm8550 = { static const struct clk_rpmh_desc clk_rpmh_sm8550 = {
.clks = sm8550_rpmh_clocks, .clks = sm8550_rpmh_clocks,
.num_clks = ARRAY_SIZE(sm8550_rpmh_clocks), .num_clks = ARRAY_SIZE(sm8550_rpmh_clocks),
.clka_optional = true,
}; };
static struct clk_hw *sm8650_rpmh_clocks[] = { static struct clk_hw *sm8650_rpmh_clocks[] = {
@ -679,6 +682,7 @@ static struct clk_hw *sm8650_rpmh_clocks[] = {
static const struct clk_rpmh_desc clk_rpmh_sm8650 = { static const struct clk_rpmh_desc clk_rpmh_sm8650 = {
.clks = sm8650_rpmh_clocks, .clks = sm8650_rpmh_clocks,
.num_clks = ARRAY_SIZE(sm8650_rpmh_clocks), .num_clks = ARRAY_SIZE(sm8650_rpmh_clocks),
.clka_optional = true,
}; };
static struct clk_hw *sc7280_rpmh_clocks[] = { static struct clk_hw *sc7280_rpmh_clocks[] = {
@ -847,6 +851,7 @@ static struct clk_hw *sm8750_rpmh_clocks[] = {
static const struct clk_rpmh_desc clk_rpmh_sm8750 = { static const struct clk_rpmh_desc clk_rpmh_sm8750 = {
.clks = sm8750_rpmh_clocks, .clks = sm8750_rpmh_clocks,
.num_clks = ARRAY_SIZE(sm8750_rpmh_clocks), .num_clks = ARRAY_SIZE(sm8750_rpmh_clocks),
.clka_optional = true,
}; };
static struct clk_hw *of_clk_rpmh_hw_get(struct of_phandle_args *clkspec, static struct clk_hw *of_clk_rpmh_hw_get(struct of_phandle_args *clkspec,
@ -890,6 +895,12 @@ static int clk_rpmh_probe(struct platform_device *pdev)
rpmh_clk = to_clk_rpmh(hw_clks[i]); rpmh_clk = to_clk_rpmh(hw_clks[i]);
res_addr = cmd_db_read_addr(rpmh_clk->res_name); res_addr = cmd_db_read_addr(rpmh_clk->res_name);
if (!res_addr) { if (!res_addr) {
hw_clks[i] = NULL;
if (desc->clka_optional &&
!strncmp(rpmh_clk->res_name, "clka", sizeof("clka") - 1))
continue;
dev_err(&pdev->dev, "missing RPMh resource address for %s\n", dev_err(&pdev->dev, "missing RPMh resource address for %s\n",
rpmh_clk->res_name); rpmh_clk->res_name);
return -ENODEV; return -ENODEV;