[PATCH 2/2] clk: imx: add mux ops for i.MX8M composite clk

Michael Nazzareno Trimarchi michael at amarulasolutions.com
Wed Jul 3 16:38:26 CEST 2024


Hi Fabio

On Wed, Jul 3, 2024 at 3:44 PM Fabio Estevam <festevam at gmail.com> wrote:
>
> Hi Michael,
>
> On Wed, Jul 3, 2024 at 6:15 AM Michael Trimarchi
> <michael at amarulasolutions.com> wrote:
> >
> > Upstream Linux commit f90b68d6c8b0.
> ....
>
> > The CORE/BUS root slice has following design, simplied graph:
> > The difference is core not have pre_div block.
> > A composite core/bus clk has 8 inputs for mux to select, saying clk[0-7].
> >
> > It support target(smart) interface and normal interface. Target interface
> > is exported for programmer easy to configure ccm root. Normal interface
> > is also exported, but we not use it in our driver, because it will
> > introduce more complexity compared with target interface.
> >
> > The normal interface simplified as below:
> >             SEL_A  GA
> >             +--+  +-+
> >             |  +->+ +------+
> > CLK[0-7]--->+  |  +-+      |
> >        |    |  |      +----v---+    +----+
> >        |    +--+      |pre_diva+---->    |  +---------+
> >        |              +--------+    |mux +--+post_div |
> >        |    +--+      |pre_divb+--->+    |  +---------+
> >        |    |  |      +----^---+    +----+
> >        +--->+  |  +-+      |
> >             |  +->+ +------+
> >             +--+  +-+
> >             SEL_B  GB
> >
> > The mux in the upper pic is not the target interface MUX, target
> > interface MUX is hiding SEL_A and SEL_B. When you choose clk[0-7],
> > you are actually writing SEL_A or SEL_B depends on the internal
> > counter which will also control the internal "mux".
> >
> > The target interface simplified as below which is used by Linux Kernel:
> > CLK[0-7]--->MUX-->Gate-->pre_div-->post_div
> >
> > A requirement of the Target Interface's software is that the
> > target clock source is active, it means when setting SEL_A, the
> > current input clk to SEL_A must be active, same to SEL_B.
> >
> > We touch target interface, but hardware logic actually also need
> > configure normal interface.
> >
> > There will be system hang, when doing the following steps:
> > The initial state:
> > SEL_A/SEL_B are both sourcing from clk0, the internal counter
> > choose SEL_A.
> > 1. switch mux from clk0 to clk1
> >    The hardware logic will choose SEL_B and configure SEL_B to clk1.
> >    SEL_A no changed.
> > 2. gate off clk0
> >    Disable clk0, then the input to SEL_A is off.
> > 3. switch from clk1 to clk2
> >    The hardware logic will choose SEL_A and configure SEL_A to clk2,
> >    however the current SEL_A input clk0 is off, the system hang.
> >
> > The solution to fix the issue is in step 1, write twice to
> > target interface MUX, it will make SEL_A/SEL_B both sources
> > from clk1, then no need to care about the state of clk0. And
> > finally system performs well.
>
> Shouldn't this also contain the original kernel commit author's Signed-off-by?
>
> > Signed-off-by: Michael Trimarchi <michael at amarulasolutions.com>

Fine to me to add. I made a mistake. Let's wait on other reviews

Michael


More information about the U-Boot mailing list