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

ARM: imx: clk-vf610: get input clocks from assigned clocks

With the clock assignment device tree changes, the clocks get
initialized properly but the search for those clocks fails with
errors:

[ 0.000000] i.MX clk 4: register failed with -17
[ 0.000000] i.MX clk 5: register failed with -17

This is because the module can't find those clocks anymore, and
tries to initialize fixed clocks with the same name.

Get the clock modules input clocks from the assigned clocks by
default by using of_clk_get_by_name(). If this function returns
not a valid clock, fall back to the old behaviour and search the
input clock from the device tree's /clocks/$name node.

Signed-off-by: Stefan Agner <stefan@agner.ch>
Signed-off-by: Shawn Guo <shawn.guo@linaro.org>

authored by

Stefan Agner and committed by
Shawn Guo
a41820d6 4e3fea4a

+16 -5
+16 -5
arch/arm/mach-imx/clk-vf610.c
··· 120 120 VF610_CLK_DDR_SEL, 121 121 }; 122 122 123 + static struct clk * __init vf610_get_fixed_clock( 124 + struct device_node *ccm_node, const char *name) 125 + { 126 + struct clk *clk = of_clk_get_by_name(ccm_node, name); 127 + 128 + /* Backward compatibility if device tree is missing clks assignments */ 129 + if (IS_ERR(clk)) 130 + clk = imx_obtain_fixed_clock(name, 0); 131 + return clk; 132 + }; 133 + 123 134 static void __init vf610_clocks_init(struct device_node *ccm_node) 124 135 { 125 136 struct device_node *np; ··· 141 130 clk[VF610_CLK_SIRC_32K] = imx_clk_fixed("sirc_32k", 32000); 142 131 clk[VF610_CLK_FIRC] = imx_clk_fixed("firc", 24000000); 143 132 144 - clk[VF610_CLK_SXOSC] = imx_obtain_fixed_clock("sxosc", 0); 145 - clk[VF610_CLK_FXOSC] = imx_obtain_fixed_clock("fxosc", 0); 146 - clk[VF610_CLK_AUDIO_EXT] = imx_obtain_fixed_clock("audio_ext", 0); 147 - clk[VF610_CLK_ENET_EXT] = imx_obtain_fixed_clock("enet_ext", 0); 133 + clk[VF610_CLK_SXOSC] = vf610_get_fixed_clock(ccm_node, "sxosc"); 134 + clk[VF610_CLK_FXOSC] = vf610_get_fixed_clock(ccm_node, "fxosc"); 135 + clk[VF610_CLK_AUDIO_EXT] = vf610_get_fixed_clock(ccm_node, "audio_ext"); 136 + clk[VF610_CLK_ENET_EXT] = vf610_get_fixed_clock(ccm_node, "enet_ext"); 148 137 149 138 /* Clock source from external clock via LVDs PAD */ 150 - clk[VF610_CLK_ANACLK1] = imx_obtain_fixed_clock("anaclk1", 0); 139 + clk[VF610_CLK_ANACLK1] = vf610_get_fixed_clock(ccm_node, "anaclk1"); 151 140 152 141 clk[VF610_CLK_FXOSC_HALF] = imx_clk_fixed_factor("fxosc_half", "fxosc", 1, 2); 153 142