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

ARM: imx6sl: add BYPASS support for PLL clocks

This is the same change for imx6sl clock driver as "ARM: imx6q: add BYPASS
support for PLL clocks" for imx6q. The difference is that only anaclk1
is available on imx6sl.

Signed-off-by: Shawn Guo <shawn.guo@freescale.com>

Shawn Guo e90f4199 b1f156db

+87 -9
+61 -8
arch/arm/mach-imx/clk-imx6sl.c
··· 57 57 static const char *audio_sels[] = { "pll4_audio_div", "pll3_pfd2", "pll3_pfd3", "pll3_usb_otg", }; 58 58 static const char *ecspi_sels[] = { "pll3_60m", "osc", }; 59 59 static const char *uart_sels[] = { "pll3_80m", "osc", }; 60 + static const char *lvds_sels[] = { 61 + "pll1_sys", "pll2_bus", "pll2_pfd0", "pll2_pfd1", "pll2_pfd2", "dummy", "pll4_audio", "pll5_video", 62 + "dummy", "enet_ref", "dummy", "dummy", "pll3_usb_otg", "pll7_usb_host", "pll3_pfd0", "pll3_pfd1", 63 + "pll3_pfd2", "pll3_pfd3", "osc", "dummy", "dummy", "dummy", "dummy", "dummy", 64 + "dummy", "dummy", "dummy", "dummy", "dummy", "dummy", "dummy", "dummy", 65 + }; 66 + static const char *pll_bypass_src_sels[] = { "osc", "lvds1_in", }; 67 + static const char *pll1_bypass_sels[] = { "pll1", "pll1_bypass_src", }; 68 + static const char *pll2_bypass_sels[] = { "pll2", "pll2_bypass_src", }; 69 + static const char *pll3_bypass_sels[] = { "pll3", "pll3_bypass_src", }; 70 + static const char *pll4_bypass_sels[] = { "pll4", "pll4_bypass_src", }; 71 + static const char *pll5_bypass_sels[] = { "pll5", "pll5_bypass_src", }; 72 + static const char *pll6_bypass_sels[] = { "pll6", "pll6_bypass_src", }; 73 + static const char *pll7_bypass_sels[] = { "pll7", "pll7_bypass_src", }; 60 74 61 75 static struct clk_div_table clk_enet_ref_table[] = { 62 76 { .val = 0, .div = 20, }, ··· 191 177 clks[IMX6SL_CLK_DUMMY] = imx_clk_fixed("dummy", 0); 192 178 clks[IMX6SL_CLK_CKIL] = imx_obtain_fixed_clock("ckil", 0); 193 179 clks[IMX6SL_CLK_OSC] = imx_obtain_fixed_clock("osc", 0); 180 + /* Clock source from external clock via CLK1 PAD */ 181 + clks[IMX6SL_CLK_ANACLK1] = imx_obtain_fixed_clock("anaclk1", 0); 194 182 195 183 np = of_find_compatible_node(NULL, NULL, "fsl,imx6sl-anatop"); 196 184 base = of_iomap(np, 0); 197 185 WARN_ON(!base); 198 186 anatop_base = base; 199 187 200 - /* type name parent base div_mask */ 201 - clks[IMX6SL_CLK_PLL1_SYS] = imx_clk_pllv3(IMX_PLLV3_SYS, "pll1_sys", "osc", base, 0x7f); 202 - clks[IMX6SL_CLK_PLL2_BUS] = imx_clk_pllv3(IMX_PLLV3_GENERIC, "pll2_bus", "osc", base + 0x30, 0x1); 203 - clks[IMX6SL_CLK_PLL3_USB_OTG] = imx_clk_pllv3(IMX_PLLV3_USB, "pll3_usb_otg", "osc", base + 0x10, 0x3); 204 - clks[IMX6SL_CLK_PLL4_AUDIO] = imx_clk_pllv3(IMX_PLLV3_AV, "pll4_audio", "osc", base + 0x70, 0x7f); 205 - clks[IMX6SL_CLK_PLL5_VIDEO] = imx_clk_pllv3(IMX_PLLV3_AV, "pll5_video", "osc", base + 0xa0, 0x7f); 206 - clks[IMX6SL_CLK_PLL6_ENET] = imx_clk_pllv3(IMX_PLLV3_ENET, "pll6_enet", "osc", base + 0xe0, 0x3); 207 - clks[IMX6SL_CLK_PLL7_USB_HOST] = imx_clk_pllv3(IMX_PLLV3_USB, "pll7_usb_host", "osc", base + 0x20, 0x3); 188 + clks[IMX6SL_PLL1_BYPASS_SRC] = imx_clk_mux("pll1_bypass_src", base + 0x00, 14, 1, pll_bypass_src_sels, ARRAY_SIZE(pll_bypass_src_sels)); 189 + clks[IMX6SL_PLL2_BYPASS_SRC] = imx_clk_mux("pll2_bypass_src", base + 0x30, 14, 1, pll_bypass_src_sels, ARRAY_SIZE(pll_bypass_src_sels)); 190 + clks[IMX6SL_PLL3_BYPASS_SRC] = imx_clk_mux("pll3_bypass_src", base + 0x10, 14, 1, pll_bypass_src_sels, ARRAY_SIZE(pll_bypass_src_sels)); 191 + clks[IMX6SL_PLL4_BYPASS_SRC] = imx_clk_mux("pll4_bypass_src", base + 0x70, 14, 1, pll_bypass_src_sels, ARRAY_SIZE(pll_bypass_src_sels)); 192 + clks[IMX6SL_PLL5_BYPASS_SRC] = imx_clk_mux("pll5_bypass_src", base + 0xa0, 14, 1, pll_bypass_src_sels, ARRAY_SIZE(pll_bypass_src_sels)); 193 + clks[IMX6SL_PLL6_BYPASS_SRC] = imx_clk_mux("pll6_bypass_src", base + 0xe0, 14, 1, pll_bypass_src_sels, ARRAY_SIZE(pll_bypass_src_sels)); 194 + clks[IMX6SL_PLL7_BYPASS_SRC] = imx_clk_mux("pll7_bypass_src", base + 0x20, 14, 1, pll_bypass_src_sels, ARRAY_SIZE(pll_bypass_src_sels)); 195 + 196 + /* type name parent_name base div_mask */ 197 + clks[IMX6SL_CLK_PLL1] = imx_clk_pllv3(IMX_PLLV3_SYS, "pll1", "pll1_bypass_src", base + 0x00, 0x7f); 198 + clks[IMX6SL_CLK_PLL2] = imx_clk_pllv3(IMX_PLLV3_GENERIC, "pll2", "pll2_bypass_src", base + 0x30, 0x1); 199 + clks[IMX6SL_CLK_PLL3] = imx_clk_pllv3(IMX_PLLV3_USB, "pll3", "pll3_bypass_src", base + 0x10, 0x3); 200 + clks[IMX6SL_CLK_PLL4] = imx_clk_pllv3(IMX_PLLV3_AV, "pll4", "pll4_bypass_src", base + 0x70, 0x7f); 201 + clks[IMX6SL_CLK_PLL5] = imx_clk_pllv3(IMX_PLLV3_AV, "pll5", "pll5_bypass_src", base + 0xa0, 0x7f); 202 + clks[IMX6SL_CLK_PLL6] = imx_clk_pllv3(IMX_PLLV3_ENET, "pll6", "pll6_bypass_src", base + 0xe0, 0x3); 203 + clks[IMX6SL_CLK_PLL7] = imx_clk_pllv3(IMX_PLLV3_USB, "pll7", "pll7_bypass_src", base + 0x20, 0x3); 204 + 205 + clks[IMX6SL_PLL1_BYPASS] = imx_clk_mux_flags("pll1_bypass", base + 0x00, 16, 1, pll1_bypass_sels, ARRAY_SIZE(pll1_bypass_sels), CLK_SET_RATE_PARENT); 206 + clks[IMX6SL_PLL2_BYPASS] = imx_clk_mux_flags("pll2_bypass", base + 0x30, 16, 1, pll2_bypass_sels, ARRAY_SIZE(pll2_bypass_sels), CLK_SET_RATE_PARENT); 207 + clks[IMX6SL_PLL3_BYPASS] = imx_clk_mux_flags("pll3_bypass", base + 0x10, 16, 1, pll3_bypass_sels, ARRAY_SIZE(pll3_bypass_sels), CLK_SET_RATE_PARENT); 208 + clks[IMX6SL_PLL4_BYPASS] = imx_clk_mux_flags("pll4_bypass", base + 0x70, 16, 1, pll4_bypass_sels, ARRAY_SIZE(pll4_bypass_sels), CLK_SET_RATE_PARENT); 209 + clks[IMX6SL_PLL5_BYPASS] = imx_clk_mux_flags("pll5_bypass", base + 0xa0, 16, 1, pll5_bypass_sels, ARRAY_SIZE(pll5_bypass_sels), CLK_SET_RATE_PARENT); 210 + clks[IMX6SL_PLL6_BYPASS] = imx_clk_mux_flags("pll6_bypass", base + 0xe0, 16, 1, pll6_bypass_sels, ARRAY_SIZE(pll6_bypass_sels), CLK_SET_RATE_PARENT); 211 + clks[IMX6SL_PLL7_BYPASS] = imx_clk_mux_flags("pll7_bypass", base + 0x20, 16, 1, pll7_bypass_sels, ARRAY_SIZE(pll7_bypass_sels), CLK_SET_RATE_PARENT); 212 + 213 + /* Do not bypass PLLs initially */ 214 + clk_set_parent(clks[IMX6SL_PLL1_BYPASS], clks[IMX6SL_CLK_PLL1]); 215 + clk_set_parent(clks[IMX6SL_PLL2_BYPASS], clks[IMX6SL_CLK_PLL2]); 216 + clk_set_parent(clks[IMX6SL_PLL3_BYPASS], clks[IMX6SL_CLK_PLL3]); 217 + clk_set_parent(clks[IMX6SL_PLL4_BYPASS], clks[IMX6SL_CLK_PLL4]); 218 + clk_set_parent(clks[IMX6SL_PLL5_BYPASS], clks[IMX6SL_CLK_PLL5]); 219 + clk_set_parent(clks[IMX6SL_PLL6_BYPASS], clks[IMX6SL_CLK_PLL6]); 220 + clk_set_parent(clks[IMX6SL_PLL7_BYPASS], clks[IMX6SL_CLK_PLL7]); 221 + 222 + clks[IMX6SL_CLK_PLL1_SYS] = imx_clk_gate("pll1_sys", "pll1_bypass", base + 0x00, 13); 223 + clks[IMX6SL_CLK_PLL2_BUS] = imx_clk_gate("pll2_bus", "pll2_bypass", base + 0x30, 13); 224 + clks[IMX6SL_CLK_PLL3_USB_OTG] = imx_clk_gate("pll3_usb_otg", "pll3_bypass", base + 0x10, 13); 225 + clks[IMX6SL_CLK_PLL4_AUDIO] = imx_clk_gate("pll4_audio", "pll4_bypass", base + 0x70, 13); 226 + clks[IMX6SL_CLK_PLL5_VIDEO] = imx_clk_gate("pll5_video", "pll5_bypass", base + 0xa0, 13); 227 + clks[IMX6SL_CLK_PLL6_ENET] = imx_clk_gate("pll6_enet", "pll6_bypass", base + 0xe0, 13); 228 + clks[IMX6SL_CLK_PLL7_USB_HOST] = imx_clk_gate("pll7_usb_host", "pll7_bypass", base + 0xe0, 13); 229 + 230 + clks[IMX6SL_CLK_LVDS1_SEL] = imx_clk_mux("lvds1_sel", base + 0x160, 0, 5, lvds_sels, ARRAY_SIZE(lvds_sels)); 231 + clks[IMX6SL_CLK_LVDS1_OUT] = imx_clk_gate_exclusive("lvds1_out", "lvds1_sel", base + 0x160, 10, BIT(12)); 232 + clks[IMX6SL_CLK_LVDS1_IN] = imx_clk_gate_exclusive("lvds1_in", "anaclk1", base + 0x160, 12, BIT(10)); 208 233 209 234 /* 210 235 * usbphy1 and usbphy2 are implemented as dummy gates using reserve
+26 -1
include/dt-bindings/clock/imx6sl-clock.h
··· 146 146 #define IMX6SL_CLK_PLL4_AUDIO_DIV 133 147 147 #define IMX6SL_CLK_SPBA 134 148 148 #define IMX6SL_CLK_ENET 135 149 - #define IMX6SL_CLK_END 136 149 + #define IMX6SL_CLK_LVDS1_SEL 136 150 + #define IMX6SL_CLK_LVDS1_OUT 137 151 + #define IMX6SL_CLK_LVDS1_IN 138 152 + #define IMX6SL_CLK_ANACLK1 139 153 + #define IMX6SL_PLL1_BYPASS_SRC 140 154 + #define IMX6SL_PLL2_BYPASS_SRC 141 155 + #define IMX6SL_PLL3_BYPASS_SRC 142 156 + #define IMX6SL_PLL4_BYPASS_SRC 143 157 + #define IMX6SL_PLL5_BYPASS_SRC 144 158 + #define IMX6SL_PLL6_BYPASS_SRC 145 159 + #define IMX6SL_PLL7_BYPASS_SRC 146 160 + #define IMX6SL_CLK_PLL1 147 161 + #define IMX6SL_CLK_PLL2 148 162 + #define IMX6SL_CLK_PLL3 149 163 + #define IMX6SL_CLK_PLL4 150 164 + #define IMX6SL_CLK_PLL5 151 165 + #define IMX6SL_CLK_PLL6 152 166 + #define IMX6SL_CLK_PLL7 153 167 + #define IMX6SL_PLL1_BYPASS 154 168 + #define IMX6SL_PLL2_BYPASS 155 169 + #define IMX6SL_PLL3_BYPASS 156 170 + #define IMX6SL_PLL4_BYPASS 157 171 + #define IMX6SL_PLL5_BYPASS 158 172 + #define IMX6SL_PLL6_BYPASS 159 173 + #define IMX6SL_PLL7_BYPASS 160 174 + #define IMX6SL_CLK_END 161 150 175 151 176 #endif /* __DT_BINDINGS_CLOCK_IMX6SL_H */