Message ID | 20230303-topic-rpmcc_sleep-v1-1-d9cfaf9b27a7@linaro.org |
---|---|
State | Superseded |
Headers | show |
Series | SMD RPMCC sleep preparations | expand |
On Sat, 4 Mar 2023 at 15:27, Konrad Dybcio <konrad.dybcio@linaro.org> wrote: > > From: Shawn Guo <shawn.guo@linaro.org> > > The RPM clock enabling state can be found with 'enabled' in struct > clk_smd_rpm. Add .is_enabled hook so that clk_summary in debugfs can > show a correct enabling state for RPM clocks. There is a small problem with this patch: now if the bootloader leaves a clock enabled for some reason and there are no Linux users for that clock, clk_disable_unused_subtree() will consider this clock disabled and will not disable the clock on its own. And at this stage of smd-rpm platforms support I think we better off finding missing clock consumers rather than depending on the bootloader for some of the setup. > > Signed-off-by: Shawn Guo <shawn.guo@linaro.org> > [Konrad: rebase] > Signed-off-by: Konrad Dybcio <konrad.dybcio@linaro.org> > --- > drivers/clk/qcom/clk-smd-rpm.c | 9 +++++++++ > 1 file changed, 9 insertions(+) > > diff --git a/drivers/clk/qcom/clk-smd-rpm.c b/drivers/clk/qcom/clk-smd-rpm.c > index 198886c1b6c8..ecacfbc4a16c 100644 > --- a/drivers/clk/qcom/clk-smd-rpm.c > +++ b/drivers/clk/qcom/clk-smd-rpm.c > @@ -424,18 +424,27 @@ static int clk_smd_rpm_enable_scaling(struct qcom_smd_rpm *rpm) > return 0; > } > > +static int clk_smd_rpm_is_enabled(struct clk_hw *hw) > +{ > + struct clk_smd_rpm *r = to_clk_smd_rpm(hw); > + > + return r->enabled; > +} > + > static const struct clk_ops clk_smd_rpm_ops = { > .prepare = clk_smd_rpm_prepare, > .unprepare = clk_smd_rpm_unprepare, > .set_rate = clk_smd_rpm_set_rate, > .round_rate = clk_smd_rpm_round_rate, > .recalc_rate = clk_smd_rpm_recalc_rate, > + .is_enabled = clk_smd_rpm_is_enabled, > }; > > static const struct clk_ops clk_smd_rpm_branch_ops = { > .prepare = clk_smd_rpm_prepare, > .unprepare = clk_smd_rpm_unprepare, > .recalc_rate = clk_smd_rpm_recalc_rate, > + .is_enabled = clk_smd_rpm_is_enabled, > }; > > DEFINE_CLK_SMD_RPM_BRANCH_A(bi_tcxo, QCOM_SMD_RPM_MISC_CLK, 0, 19200000); > > -- > 2.39.2 >
On 06/03/2023 02:21, Dmitry Baryshkov wrote: > On Sat, 4 Mar 2023 at 15:27, Konrad Dybcio <konrad.dybcio@linaro.org> wrote: >> >> From: Shawn Guo <shawn.guo@linaro.org> >> >> The RPM clock enabling state can be found with 'enabled' in struct >> clk_smd_rpm. Add .is_enabled hook so that clk_summary in debugfs can >> show a correct enabling state for RPM clocks. > > There is a small problem with this patch: now if the bootloader leaves > a clock enabled for some reason and there are no Linux users for that > clock, clk_disable_unused_subtree() will consider this clock disabled > and will not disable the clock on its own. > And at this stage of smd-rpm platforms support I think we better off > finding missing clock consumers rather than depending on the > bootloader for some of the setup. Argh. And then I understood that without the patch clk_core_is_enabled will shortcut to core->enable_count, which also means that the clock will be skipped. But now I have another question: since r->enabled follows core->enabled_count, can we get rid of r->enabled and switch to core->enable_count? This might mean adding clk_software_is_enabled() function for your patch.
diff --git a/drivers/clk/qcom/clk-smd-rpm.c b/drivers/clk/qcom/clk-smd-rpm.c index 198886c1b6c8..ecacfbc4a16c 100644 --- a/drivers/clk/qcom/clk-smd-rpm.c +++ b/drivers/clk/qcom/clk-smd-rpm.c @@ -424,18 +424,27 @@ static int clk_smd_rpm_enable_scaling(struct qcom_smd_rpm *rpm) return 0; } +static int clk_smd_rpm_is_enabled(struct clk_hw *hw) +{ + struct clk_smd_rpm *r = to_clk_smd_rpm(hw); + + return r->enabled; +} + static const struct clk_ops clk_smd_rpm_ops = { .prepare = clk_smd_rpm_prepare, .unprepare = clk_smd_rpm_unprepare, .set_rate = clk_smd_rpm_set_rate, .round_rate = clk_smd_rpm_round_rate, .recalc_rate = clk_smd_rpm_recalc_rate, + .is_enabled = clk_smd_rpm_is_enabled, }; static const struct clk_ops clk_smd_rpm_branch_ops = { .prepare = clk_smd_rpm_prepare, .unprepare = clk_smd_rpm_unprepare, .recalc_rate = clk_smd_rpm_recalc_rate, + .is_enabled = clk_smd_rpm_is_enabled, }; DEFINE_CLK_SMD_RPM_BRANCH_A(bi_tcxo, QCOM_SMD_RPM_MISC_CLK, 0, 19200000);