[PATCH 2/2] clk: imx: add mux ops for i.MX8M composite clk
Fabio Estevam
festevam at gmail.com
Wed Jul 3 15:44:10 CEST 2024
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>
More information about the U-Boot
mailing list