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

ARM: imx: move clk_prepare() out from mxc_restart()

It's inappropriate to call clk_prepare() in mxc_restart(), because the
restart routine could be called in atomic context. Move clk_get() and
clk_prepare() into mxc_arch_reset_init() and only have the atomic part
clk_enable() be called in mxc_restart().

As a result, mxc_arch_reset_init() needs to be called after clk gets
initialized.

While there, it also changes printk(KERN_ERR ...) to pr_err() and adds
__init annotation for mxc_arch_reset_init().

Signed-off-by: Shawn Guo <shawn.guo@linaro.org>

Shawn Guo 18cb680f 24a83fe4

+39 -18
+3
arch/arm/mach-imx/imx25-dt.c
··· 15 15 #include <asm/mach/arch.h> 16 16 #include <asm/mach/time.h> 17 17 #include "common.h" 18 + #include "hardware.h" 18 19 #include "mx25.h" 19 20 20 21 static void __init imx25_dt_init(void) 21 22 { 23 + mxc_arch_reset_init(MX25_IO_ADDRESS(MX25_WDOG_BASE_ADDR)); 24 + 22 25 of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); 23 26 } 24 27
+3
arch/arm/mach-imx/imx27-dt.c
··· 16 16 #include <asm/mach/time.h> 17 17 18 18 #include "common.h" 19 + #include "hardware.h" 19 20 #include "mx27.h" 20 21 21 22 static void __init imx27_dt_init(void) 22 23 { 23 24 struct platform_device_info devinfo = { .name = "cpufreq-cpu0", }; 25 + 26 + mxc_arch_reset_init(MX27_IO_ADDRESS(MX27_WDOG_BASE_ADDR)); 24 27 25 28 of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); 26 29
+3
arch/arm/mach-imx/imx31-dt.c
··· 16 16 #include <asm/mach/time.h> 17 17 18 18 #include "common.h" 19 + #include "hardware.h" 19 20 #include "mx31.h" 20 21 21 22 static void __init imx31_dt_init(void) 22 23 { 24 + mxc_arch_reset_init(MX31_IO_ADDRESS(MX31_WDOG_BASE_ADDR)); 25 + 23 26 of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); 24 27 } 25 28
+3
arch/arm/mach-imx/imx51-dt.c
··· 17 17 #include <asm/mach/time.h> 18 18 19 19 #include "common.h" 20 + #include "hardware.h" 20 21 #include "mx51.h" 21 22 22 23 static void __init imx51_dt_init(void) 23 24 { 24 25 struct platform_device_info devinfo = { .name = "cpufreq-cpu0", }; 26 + 27 + mxc_arch_reset_init(MX51_IO_ADDRESS(MX51_WDOG1_BASE_ADDR)); 25 28 26 29 of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); 27 30 platform_device_register_full(&devinfo);
+3
arch/arm/mach-imx/mach-imx53.c
··· 21 21 #include <asm/mach/time.h> 22 22 23 23 #include "common.h" 24 + #include "hardware.h" 24 25 #include "mx53.h" 25 26 26 27 static void __init imx53_qsb_init(void) ··· 39 38 40 39 static void __init imx53_dt_init(void) 41 40 { 41 + mxc_arch_reset_init(MX53_IO_ADDRESS(MX53_WDOG1_BASE_ADDR)); 42 + 42 43 if (of_machine_is_compatible("fsl,imx53-qsb")) 43 44 imx53_qsb_init(); 44 45
+1 -1
arch/arm/mach-imx/mm-imx1.c
··· 39 39 void __init imx1_init_early(void) 40 40 { 41 41 mxc_set_cpu_type(MXC_CPU_MX1); 42 - mxc_arch_reset_init(MX1_IO_ADDRESS(MX1_WDT_BASE_ADDR)); 43 42 imx_iomuxv1_init(MX1_IO_ADDRESS(MX1_GPIO_BASE_ADDR), 44 43 MX1_NUM_GPIO_PORT); 45 44 } ··· 50 51 51 52 void __init imx1_soc_init(void) 52 53 { 54 + mxc_arch_reset_init(MX1_IO_ADDRESS(MX1_WDT_BASE_ADDR)); 53 55 mxc_device_init(); 54 56 55 57 mxc_register_gpio("imx1-gpio", 0, MX1_GPIO1_BASE_ADDR, SZ_256,
+1 -1
arch/arm/mach-imx/mm-imx21.c
··· 66 66 void __init imx21_init_early(void) 67 67 { 68 68 mxc_set_cpu_type(MXC_CPU_MX21); 69 - mxc_arch_reset_init(MX21_IO_ADDRESS(MX21_WDOG_BASE_ADDR)); 70 69 imx_iomuxv1_init(MX21_IO_ADDRESS(MX21_GPIO_BASE_ADDR), 71 70 MX21_NUM_GPIO_PORT); 72 71 } ··· 81 82 82 83 void __init imx21_soc_init(void) 83 84 { 85 + mxc_arch_reset_init(MX21_IO_ADDRESS(MX21_WDOG_BASE_ADDR)); 84 86 mxc_device_init(); 85 87 86 88 mxc_register_gpio("imx21-gpio", 0, MX21_GPIO1_BASE_ADDR, SZ_256, MX21_INT_GPIO, 0);
+1 -1
arch/arm/mach-imx/mm-imx25.c
··· 54 54 { 55 55 mxc_set_cpu_type(MXC_CPU_MX25); 56 56 mxc_iomux_v3_init(MX25_IO_ADDRESS(MX25_IOMUXC_BASE_ADDR)); 57 - mxc_arch_reset_init(MX25_IO_ADDRESS(MX25_WDOG_BASE_ADDR)); 58 57 } 59 58 60 59 void __init mx25_init_irq(void) ··· 88 89 89 90 void __init imx25_soc_init(void) 90 91 { 92 + mxc_arch_reset_init(MX25_IO_ADDRESS(MX25_WDOG_BASE_ADDR)); 91 93 mxc_device_init(); 92 94 93 95 /* i.mx25 has the i.mx35 type gpio */
+1 -1
arch/arm/mach-imx/mm-imx27.c
··· 66 66 void __init imx27_init_early(void) 67 67 { 68 68 mxc_set_cpu_type(MXC_CPU_MX27); 69 - mxc_arch_reset_init(MX27_IO_ADDRESS(MX27_WDOG_BASE_ADDR)); 70 69 imx_iomuxv1_init(MX27_IO_ADDRESS(MX27_GPIO_BASE_ADDR), 71 70 MX27_NUM_GPIO_PORT); 72 71 } ··· 81 82 82 83 void __init imx27_soc_init(void) 83 84 { 85 + mxc_arch_reset_init(MX27_IO_ADDRESS(MX27_WDOG_BASE_ADDR)); 84 86 mxc_device_init(); 85 87 86 88 /* i.mx27 has the i.mx21 type gpio */
+2 -2
arch/arm/mach-imx/mm-imx3.c
··· 138 138 void __init imx31_init_early(void) 139 139 { 140 140 mxc_set_cpu_type(MXC_CPU_MX31); 141 - mxc_arch_reset_init(MX31_IO_ADDRESS(MX31_WDOG_BASE_ADDR)); 142 141 arch_ioremap_caller = imx3_ioremap_caller; 143 142 arm_pm_idle = imx3_idle; 144 143 mx3_ccm_base = MX31_IO_ADDRESS(MX31_CCM_BASE_ADDR); ··· 173 174 174 175 imx3_init_l2x0(); 175 176 177 + mxc_arch_reset_init(MX31_IO_ADDRESS(MX31_WDOG_BASE_ADDR)); 176 178 mxc_device_init(); 177 179 178 180 mxc_register_gpio("imx31-gpio", 0, MX31_GPIO1_BASE_ADDR, SZ_16K, MX31_INT_GPIO1, 0); ··· 216 216 { 217 217 mxc_set_cpu_type(MXC_CPU_MX35); 218 218 mxc_iomux_v3_init(MX35_IO_ADDRESS(MX35_IOMUXC_BASE_ADDR)); 219 - mxc_arch_reset_init(MX35_IO_ADDRESS(MX35_WDOG_BASE_ADDR)); 220 219 arm_pm_idle = imx3_idle; 221 220 arch_ioremap_caller = imx3_ioremap_caller; 222 221 mx3_ccm_base = MX35_IO_ADDRESS(MX35_CCM_BASE_ADDR); ··· 271 272 272 273 imx3_init_l2x0(); 273 274 275 + mxc_arch_reset_init(MX35_IO_ADDRESS(MX35_WDOG_BASE_ADDR)); 274 276 mxc_device_init(); 275 277 276 278 mxc_register_gpio("imx35-gpio", 0, MX35_GPIO1_BASE_ADDR, SZ_16K, MX35_INT_GPIO1, 0);
+1 -2
arch/arm/mach-imx/mm-imx5.c
··· 83 83 imx51_ipu_mipi_setup(); 84 84 mxc_set_cpu_type(MXC_CPU_MX51); 85 85 mxc_iomux_v3_init(MX51_IO_ADDRESS(MX51_IOMUXC_BASE_ADDR)); 86 - mxc_arch_reset_init(MX51_IO_ADDRESS(MX51_WDOG1_BASE_ADDR)); 87 86 imx_src_init(); 88 87 } 89 88 ··· 90 91 { 91 92 mxc_set_cpu_type(MXC_CPU_MX53); 92 93 mxc_iomux_v3_init(MX53_IO_ADDRESS(MX53_IOMUXC_BASE_ADDR)); 93 - mxc_arch_reset_init(MX53_IO_ADDRESS(MX53_WDOG1_BASE_ADDR)); 94 94 imx_src_init(); 95 95 } 96 96 ··· 127 129 128 130 void __init imx51_soc_init(void) 129 131 { 132 + mxc_arch_reset_init(MX51_IO_ADDRESS(MX51_WDOG1_BASE_ADDR)); 130 133 mxc_device_init(); 131 134 132 135 /* i.mx51 has the i.mx35 type gpio */
+17 -10
arch/arm/mach-imx/system.c
··· 30 30 #include "hardware.h" 31 31 32 32 static void __iomem *wdog_base; 33 + static struct clk *wdog_clk; 33 34 34 35 /* 35 36 * Reset the system. It is called by machine_restart(). ··· 39 38 { 40 39 unsigned int wcr_enable; 41 40 42 - if (cpu_is_mx1()) { 43 - wcr_enable = (1 << 0); 44 - } else { 45 - struct clk *clk; 41 + if (wdog_clk) 42 + clk_enable(wdog_clk); 46 43 47 - clk = clk_get_sys("imx2-wdt.0", NULL); 48 - if (!IS_ERR(clk)) 49 - clk_prepare_enable(clk); 44 + if (cpu_is_mx1()) 45 + wcr_enable = (1 << 0); 46 + else 50 47 wcr_enable = (1 << 2); 51 - } 52 48 53 49 /* Assert SRS signal */ 54 50 __raw_writew(wcr_enable, wdog_base); ··· 53 55 /* wait for reset to assert... */ 54 56 mdelay(500); 55 57 56 - printk(KERN_ERR "Watchdog reset failed to assert reset\n"); 58 + pr_err("%s: Watchdog reset failed to assert reset\n", __func__); 57 59 58 60 /* delay to allow the serial port to show the message */ 59 61 mdelay(50); ··· 62 64 soft_restart(0); 63 65 } 64 66 65 - void mxc_arch_reset_init(void __iomem *base) 67 + void __init mxc_arch_reset_init(void __iomem *base) 66 68 { 67 69 wdog_base = base; 70 + 71 + wdog_clk = clk_get_sys("imx2-wdt.0", NULL); 72 + if (IS_ERR(wdog_clk)) { 73 + pr_warn("%s: failed to get wdog clock\n", __func__); 74 + wdog_clk = NULL; 75 + return; 76 + } 77 + 78 + clk_prepare(wdog_clk); 68 79 }