[Linux-stm32] [PATCH v2 02/14] clk: stm32mp1: merge 'ck_hse_rtc' and 'ck_rtc' into one clock
Stephen Boyd
sboyd at kernel.org
Fri Feb 19 01:27:37 UTC 2021
Quoting gabriel.fernandez at foss.st.com (2021-02-12 00:08:40)
>
> On 2/9/21 9:00 AM, Stephen Boyd wrote:
> > Quoting gabriel.fernandez at foss.st.com (2021-01-26 01:01:08)
> >> From: Gabriel Fernandez <gabriel.fernandez at foss.st.com>
> >>
> >> 'ck_rtc' has multiple clocks as input (ck_hsi, ck_lsi, and ck_hse).
> >> A divider is available only on the specific rtc input for ck_hse.
> >> This Merge will facilitate to have a more coherent clock tree
> >> in no trusted / trusted world.
> >>
> >> Signed-off-by: Gabriel Fernandez <gabriel.fernandez at foss.st.com>
> >> ---
> >> drivers/clk/clk-stm32mp1.c | 49 +++++++++++++++++++++++++++++++++-----
> >> 1 file changed, 43 insertions(+), 6 deletions(-)
> >>
> >> diff --git a/drivers/clk/clk-stm32mp1.c b/drivers/clk/clk-stm32mp1.c
> >> index 35d5aee8f9b0..0e1d4427a8df 100644
> >> --- a/drivers/clk/clk-stm32mp1.c
> >> +++ b/drivers/clk/clk-stm32mp1.c
> >> @@ -245,7 +245,7 @@ static const char * const dsi_src[] = {
> >> };
> >>
> >> static const char * const rtc_src[] = {
> >> - "off", "ck_lse", "ck_lsi", "ck_hse_rtc"
> >> + "off", "ck_lse", "ck_lsi", "ck_hse"
> >> };
> >>
> >> static const char * const mco1_src[] = {
> >> @@ -1031,6 +1031,42 @@ static struct clk_hw *clk_register_cktim(struct device *dev, const char *name,
> >> return hw;
> >> }
> >>
> >> +/* The divider of RTC clock concerns only ck_hse clock */
> >> +#define HSE_RTC 3
> >> +
> >> +static unsigned long clk_divider_rtc_recalc_rate(struct clk_hw *hw,
> >> + unsigned long parent_rate)
> >> +{
> >> + if (clk_hw_get_parent(hw) == clk_hw_get_parent_by_index(hw, HSE_RTC))
> >> + return clk_divider_ops.recalc_rate(hw, parent_rate);
> >> +
> >> + return parent_rate;
> >> +}
> >> +
> >> +static long clk_divider_rtc_round_rate(struct clk_hw *hw, unsigned long rate,
> >> + unsigned long *prate)
> >> +{
> >> + if (clk_hw_get_parent(hw) == clk_hw_get_parent_by_index(hw, HSE_RTC))
> > This clk op can be called at basically any time. Maybe this should use
> > the determine rate op and then look to see what the parent is that comes
> > in via the rate request structure? Or is the intention to keep this
> > pinned to one particular parent? Looking at this right now it doesn't
> > really make much sense why the current parent state should play into
> > what rate the clk can round to, unless there is some more clk flags
> > going on that constrain the ability to change this clk's parent.
>
> Yes the intention is to keep this pinned for one particular parent.
>
> This divider is only applied on the 4th input of the MUX of the RTC and
>
> doesn't affect the HSE frequency for all the system.
>
>
> Oscillators
> -----
> | lse |----------------+----------------> ck_lse
> ----- |
> ----- |
> | lsi |------------+--------------------> ck_lsi
> ----- | |
> | |
> ----- | |
> | hse |----+-------|---|----------------> ck_hse
> ----- | | |
> | | | |\ mux
> | | | OFF -->| \
> | | | | \ gate
> | | --------->| | ---
> | | | |--->| |--> ck_rtc
> | ------------->| | ---
> | ----------- | |
> ----| % 1 to 64 |--->| /
> ----------- |/
> divider
>
> I manage the RTC with a clock composite with a gate a mux and a specific
> rate ops for hse input.
>
> That why i need to the parent state.
>
So would using determine_rate op instead of round_rate op help here? That
will provide the current parent rate and hw pointer in the rate request
structure.
More information about the Linux-stm32
mailing list