On Tue, Oct 01, 2019 at 03:13:43PM -0600, Stephen Warren wrote: > From: Stephen Warren > > For a little over a year, U-Boot has configured the flow controller to > perform automatic RAM re-repair on off->on power transitions of the CPU > rail1]. This is mandatory for correct operation of Tegra124. However, RAM > re-repair relies on certain clocks, which the kernel must enable and > leave running. The fuse clock is one of those clocks. Enable this clock > so that LP1 power mode (system suspend) operates correctly. > > [1] 3cc7942a4ae5 ARM: tegra: implement RAM repair > > Reported-by: Jonathan Hunter > Cc: stable@vger.kernel.org > Signed-off-by: Stephen Warren > --- > drivers/clk/tegra/clk-tegra124.c | 1 + > 1 file changed, 1 insertion(+) > > diff --git a/drivers/clk/tegra/clk-tegra124.c b/drivers/clk/tegra/clk-tegra124.c > index 0224fdc4766f..f53f6315c646 100644 > --- a/drivers/clk/tegra/clk-tegra124.c > +++ b/drivers/clk/tegra/clk-tegra124.c > @@ -1291,6 +1291,7 @@ static struct tegra_clk_init_table common_init_table[] __initdata = { > }; > > static struct tegra_clk_init_table tegra124_init_table[] __initdata = { > + { TEGRA124_CLK_FUSE, -1, 0, 1 }, I think the correct way to do this these days is to mark the clock as CRITICAL. Not sure if there's an easy way to do that given that the clock init table doesn't allow storing flags. Do you have any good ideas on how to achieve this with the critical flag instead of forcing the refcount to 1? Perhaps something like the below would work? Thierry --- >8 --- diff --git a/drivers/clk/tegra/clk-tegra124.c b/drivers/clk/tegra/clk-tegra124.c index 0224fdc4766f..bba12d8308d3 100644 --- a/drivers/clk/tegra/clk-tegra124.c +++ b/drivers/clk/tegra/clk-tegra124.c @@ -838,7 +838,7 @@ static struct tegra_clk tegra124_clks[tegra_clk_max] __initdata = { [tegra_clk_spdif_out] = { .dt_id = TEGRA124_CLK_SPDIF_OUT, .present = true }, [tegra_clk_vi_9] = { .dt_id = TEGRA124_CLK_VI, .present = true }, [tegra_clk_vi_sensor_8] = { .dt_id = TEGRA124_CLK_VI_SENSOR, .present = true }, - [tegra_clk_fuse] = { .dt_id = TEGRA124_CLK_FUSE, .present = true }, + [tegra_clk_fuse] = { .dt_id = TEGRA124_CLK_FUSE, .present = false }, [tegra_clk_fuse_burn] = { .dt_id = TEGRA124_CLK_FUSE_BURN, .present = true }, [tegra_clk_clk_32k] = { .dt_id = TEGRA124_CLK_CLK_32K, .present = true }, [tegra_clk_clk_m] = { .dt_id = TEGRA124_CLK_CLK_M, .present = true }, @@ -1033,6 +1033,12 @@ static __init void tegra124_periph_clk_init(void __iomem *clk_base, clk_register_clkdev(clk, "cml1", NULL); clks[TEGRA124_CLK_CML1] = clk; + clk = tegra_clk_register_periph_gate("fuse", "clk_m", + TEGRA_PERIPH_ON_APB, clk_base, + CLK_IS_CRITICAL, 39, + periph_clk_enb_refcnt); + clks[TEGRA124_CLK_FUSE] = clk; + tegra_periph_clk_init(clk_base, pmc_base, tegra124_clks, &pll_p_params); }