Message ID | 20181115143028.19087-1-l.stach@pengutronix.de (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [v2,1/3] clk: imx6q: reset exclusive gates on init | expand |
Quoting Lucas Stach (2018-11-15 06:30:26) > The exclusive gates may be set up in the wrong way by software running > before the clock driver comes up. In that case the exclusive setup is > locked in its initial state, as the complementary function can't be > activated without disabling the initial setup first. > > To avoid this lock situation, reset the exclusive gates to the off > state and allow the kernel to provide the proper setup. > > Signed-off-by: Lucas Stach <l.stach@pengutronix.de> > Reviewed-by: Dong Aisheng <Aisheng.dong@nxp.com> > --- Applied to clk-next
diff --git a/drivers/clk/imx/clk-imx6q.c b/drivers/clk/imx/clk-imx6q.c index bbe0c60f4d09..59f6a3e087db 100644 --- a/drivers/clk/imx/clk-imx6q.c +++ b/drivers/clk/imx/clk-imx6q.c @@ -508,8 +508,12 @@ static void __init imx6q_clocks_init(struct device_node *ccm_node) * lvds1_gate and lvds2_gate are pseudo-gates. Both can be * independently configured as clock inputs or outputs. We treat * the "output_enable" bit as a gate, even though it's really just - * enabling clock output. + * enabling clock output. Initially the gate bits are cleared, as + * otherwise the exclusive configuration gets locked in the setup done + * by software running before the clock driver, with no way to change + * it. */ + writel(readl(base + 0x160) & ~0x3c00, base + 0x160); clk[IMX6QDL_CLK_LVDS1_GATE] = imx_clk_gate_exclusive("lvds1_gate", "lvds1_sel", base + 0x160, 10, BIT(12)); clk[IMX6QDL_CLK_LVDS2_GATE] = imx_clk_gate_exclusive("lvds2_gate", "lvds2_sel", base + 0x160, 11, BIT(13));