Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

clk: tegra: Don't deassert reset on enabling clocks

The Tegra clock driver contains legacy code which deasserts hardware reset
when peripheral clocks are enabled. This behaviour comes from a pre-CCF
era of the Tegra drivers. This is unacceptable for modern kernel drivers
which use generic CCF and reset-control APIs because it breaks assumptions
of the drivers about clk/reset sequences and about reset-propagation
delays. Hence remove the awkward legacy behaviour from the clk driver.

In particular PMC driver assumes that hardware blocks remains in reset
while power domain is turning on, but the clk driver deasserts the reset
before power clamp is removed, hence breaking the driver's assumption.

Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
Signed-off-by: Thierry Reding <treding@nvidia.com>

authored by

Dmitry Osipenko and committed by
Thierry Reding
4782c0a5 5d0f1c8a

+1 -13
-8
drivers/clk/tegra/clk-periph-gate.c
··· 55 55 write_enb_set(periph_clk_to_bit(gate), gate); 56 56 udelay(2); 57 57 58 - if (!(gate->flags & TEGRA_PERIPH_NO_RESET) && 59 - !(gate->flags & TEGRA_PERIPH_MANUAL_RESET)) { 60 - if (read_rst(gate) & periph_clk_to_bit(gate)) { 61 - udelay(5); /* reset propogation delay */ 62 - write_rst_clr(periph_clk_to_bit(gate), gate); 63 - } 64 - } 65 - 66 58 if (gate->flags & TEGRA_PERIPH_WAR_1005168) { 67 59 writel_relaxed(0, gate->clk_base + LVL2_CLK_GATE_OVRE); 68 60 writel_relaxed(BIT(22), gate->clk_base + LVL2_CLK_GATE_OVRE);
+1 -1
drivers/clk/tegra/clk-tegra30.c
··· 1006 1006 TEGRA_INIT_DATA_MUX("dam0", mux_pllacp_clkm, CLK_SOURCE_DAM0, 108, 0, TEGRA30_CLK_DAM0), 1007 1007 TEGRA_INIT_DATA_MUX("dam1", mux_pllacp_clkm, CLK_SOURCE_DAM1, 109, 0, TEGRA30_CLK_DAM1), 1008 1008 TEGRA_INIT_DATA_MUX("dam2", mux_pllacp_clkm, CLK_SOURCE_DAM2, 110, 0, TEGRA30_CLK_DAM2), 1009 - TEGRA_INIT_DATA_INT("3d2", mux_pllmcpa, CLK_SOURCE_3D2, 98, TEGRA_PERIPH_MANUAL_RESET, TEGRA30_CLK_GR3D2), 1009 + TEGRA_INIT_DATA_INT("3d2", mux_pllmcpa, CLK_SOURCE_3D2, 98, 0, TEGRA30_CLK_GR3D2), 1010 1010 TEGRA_INIT_DATA_INT("se", mux_pllpcm_clkm, CLK_SOURCE_SE, 127, 0, TEGRA30_CLK_SE), 1011 1011 TEGRA_INIT_DATA_MUX8("hdmi", mux_pllpmdacd2_clkm, CLK_SOURCE_HDMI, 51, 0, TEGRA30_CLK_HDMI), 1012 1012 TEGRA_INIT_DATA("pwm", NULL, NULL, pwm_parents, CLK_SOURCE_PWM, 28, 2, 0, 0, 8, 1, 0, 17, TEGRA_PERIPH_ON_APB, TEGRA30_CLK_PWM),
-4
drivers/clk/tegra/clk.h
··· 553 553 * Flags: 554 554 * TEGRA_PERIPH_NO_RESET - This flag indicates that reset is not allowed 555 555 * for this module. 556 - * TEGRA_PERIPH_MANUAL_RESET - This flag indicates not to reset module 557 - * after clock enable and driver for the module is responsible for 558 - * doing reset. 559 556 * TEGRA_PERIPH_ON_APB - If peripheral is in the APB bus then read the 560 557 * bus to flush the write operation in apb bus. This flag indicates 561 558 * that this peripheral is in apb bus. ··· 574 577 #define TEGRA_CLK_PERIPH_GATE_MAGIC 0x17760309 575 578 576 579 #define TEGRA_PERIPH_NO_RESET BIT(0) 577 - #define TEGRA_PERIPH_MANUAL_RESET BIT(1) 578 580 #define TEGRA_PERIPH_ON_APB BIT(2) 579 581 #define TEGRA_PERIPH_WAR_1005168 BIT(3) 580 582 #define TEGRA_PERIPH_NO_DIV BIT(4)