* [PATCH 0/3] ARM: imx: make mxs_restart() work for DT boot
@ 2013-05-13 1:32 Shawn Guo
2013-05-13 1:32 ` [PATCH 1/3] ARM: imx: include <asm/io.h> in hardware.h Shawn Guo
` (2 more replies)
0 siblings, 3 replies; 11+ messages in thread
From: Shawn Guo @ 2013-05-13 1:32 UTC (permalink / raw)
To: linux-arm-kernel
The mxs_restart() currently only works for non-DT platforms. And per
Russell's comment, it's not going to work reliably, because the restart
routine could be called in atomic context while mxs_restart() is calling
clk_prepare() there.
The series fixes above potential problem by moving clk_prepare() into
initialization function mxc_arch_reset_init() and only keeping atomic
part clk_enable() in mxs_restart().
Then a DT variant initialization function imx_arch_reset_init() is
added, so that DT platforms can use mxs_restart() as well after invoking
the initialization function.
Shawn Guo (3):
ARM: imx: include <asm/io.h> in hardware.h
ARM: imx: move clk_prepare() out from mxs_restart()
ARM: imx: create imx_arch_reset_init() for DT boot
arch/arm/mach-imx/common.h | 1 +
arch/arm/mach-imx/hardware.h | 1 +
arch/arm/mach-imx/imx25-dt.c | 2 ++
arch/arm/mach-imx/imx27-dt.c | 2 ++
arch/arm/mach-imx/imx31-dt.c | 2 ++
arch/arm/mach-imx/imx51-dt.c | 2 ++
arch/arm/mach-imx/mach-imx53.c | 3 +++
arch/arm/mach-imx/mm-imx1.c | 2 +-
arch/arm/mach-imx/mm-imx21.c | 2 +-
arch/arm/mach-imx/mm-imx25.c | 2 +-
arch/arm/mach-imx/mm-imx27.c | 2 +-
arch/arm/mach-imx/mm-imx3.c | 4 ++--
arch/arm/mach-imx/mm-imx5.c | 3 +--
arch/arm/mach-imx/system.c | 47 +++++++++++++++++++++++++++++++---------
14 files changed, 57 insertions(+), 18 deletions(-)
--
1.7.9.5
^ permalink raw reply [flat|nested] 11+ messages in thread* [PATCH 1/3] ARM: imx: include <asm/io.h> in hardware.h 2013-05-13 1:32 [PATCH 0/3] ARM: imx: make mxs_restart() work for DT boot Shawn Guo @ 2013-05-13 1:32 ` Shawn Guo 2013-05-13 1:32 ` [PATCH 2/3] ARM: imx: move clk_prepare() out from mxs_restart() Shawn Guo 2013-05-13 1:32 ` [PATCH 3/3] ARM: imx: create imx_arch_reset_init() for DT boot Shawn Guo 2 siblings, 0 replies; 11+ messages in thread From: Shawn Guo @ 2013-05-13 1:32 UTC (permalink / raw) To: linux-arm-kernel As IOMEM is referenced in hardware.h, <asm/io.h> should be included there. Signed-off-by: Shawn Guo <shawn.guo@linaro.org> --- arch/arm/mach-imx/hardware.h | 1 + 1 file changed, 1 insertion(+) diff --git a/arch/arm/mach-imx/hardware.h b/arch/arm/mach-imx/hardware.h index 356131f..a3b0b04 100644 --- a/arch/arm/mach-imx/hardware.h +++ b/arch/arm/mach-imx/hardware.h @@ -20,6 +20,7 @@ #ifndef __ASM_ARCH_MXC_HARDWARE_H__ #define __ASM_ARCH_MXC_HARDWARE_H__ +#include <asm/io.h> #include <asm/sizes.h> #define addr_in_module(addr, mod) \ -- 1.7.9.5 ^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH 2/3] ARM: imx: move clk_prepare() out from mxs_restart() 2013-05-13 1:32 [PATCH 0/3] ARM: imx: make mxs_restart() work for DT boot Shawn Guo 2013-05-13 1:32 ` [PATCH 1/3] ARM: imx: include <asm/io.h> in hardware.h Shawn Guo @ 2013-05-13 1:32 ` Shawn Guo 2013-05-13 8:25 ` Sascha Hauer 2013-05-13 1:32 ` [PATCH 3/3] ARM: imx: create imx_arch_reset_init() for DT boot Shawn Guo 2 siblings, 1 reply; 11+ messages in thread From: Shawn Guo @ 2013-05-13 1:32 UTC (permalink / raw) To: linux-arm-kernel It's inappropriate to call clk_prepare() in mxs_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 mxs_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> --- arch/arm/mach-imx/imx25-dt.c | 3 +++ arch/arm/mach-imx/imx27-dt.c | 3 +++ arch/arm/mach-imx/imx31-dt.c | 3 +++ arch/arm/mach-imx/imx51-dt.c | 3 +++ arch/arm/mach-imx/mach-imx53.c | 3 +++ arch/arm/mach-imx/mm-imx1.c | 2 +- arch/arm/mach-imx/mm-imx21.c | 2 +- arch/arm/mach-imx/mm-imx25.c | 2 +- arch/arm/mach-imx/mm-imx27.c | 2 +- arch/arm/mach-imx/mm-imx3.c | 4 ++-- arch/arm/mach-imx/mm-imx5.c | 3 +-- arch/arm/mach-imx/system.c | 27 +++++++++++++++++---------- 12 files changed, 39 insertions(+), 18 deletions(-) diff --git a/arch/arm/mach-imx/imx25-dt.c b/arch/arm/mach-imx/imx25-dt.c index 8234839..ec33991 100644 --- a/arch/arm/mach-imx/imx25-dt.c +++ b/arch/arm/mach-imx/imx25-dt.c @@ -15,10 +15,13 @@ #include <asm/mach/arch.h> #include <asm/mach/time.h> #include "common.h" +#include "hardware.h" #include "mx25.h" static void __init imx25_dt_init(void) { + mxc_arch_reset_init(MX25_IO_ADDRESS(MX25_WDOG_BASE_ADDR)); + of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); } diff --git a/arch/arm/mach-imx/imx27-dt.c b/arch/arm/mach-imx/imx27-dt.c index 4aaead0..93aef1a 100644 --- a/arch/arm/mach-imx/imx27-dt.c +++ b/arch/arm/mach-imx/imx27-dt.c @@ -16,12 +16,15 @@ #include <asm/mach/time.h> #include "common.h" +#include "hardware.h" #include "mx27.h" static void __init imx27_dt_init(void) { struct platform_device_info devinfo = { .name = "cpufreq-cpu0", }; + mxc_arch_reset_init(MX27_IO_ADDRESS(MX27_WDOG_BASE_ADDR)); + of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); platform_device_register_full(&devinfo); diff --git a/arch/arm/mach-imx/imx31-dt.c b/arch/arm/mach-imx/imx31-dt.c index 67de611..d8b3b22 100644 --- a/arch/arm/mach-imx/imx31-dt.c +++ b/arch/arm/mach-imx/imx31-dt.c @@ -16,10 +16,13 @@ #include <asm/mach/time.h> #include "common.h" +#include "hardware.h" #include "mx31.h" static void __init imx31_dt_init(void) { + mxc_arch_reset_init(MX31_IO_ADDRESS(MX31_WDOG_BASE_ADDR)); + of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); } diff --git a/arch/arm/mach-imx/imx51-dt.c b/arch/arm/mach-imx/imx51-dt.c index ab24cc3..55f47a0 100644 --- a/arch/arm/mach-imx/imx51-dt.c +++ b/arch/arm/mach-imx/imx51-dt.c @@ -17,12 +17,15 @@ #include <asm/mach/time.h> #include "common.h" +#include "hardware.h" #include "mx51.h" static void __init imx51_dt_init(void) { struct platform_device_info devinfo = { .name = "cpufreq-cpu0", }; + mxc_arch_reset_init(MX51_IO_ADDRESS(MX51_WDOG1_BASE_ADDR)); + of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); platform_device_register_full(&devinfo); } diff --git a/arch/arm/mach-imx/mach-imx53.c b/arch/arm/mach-imx/mach-imx53.c index f579c61..7a56561 100644 --- a/arch/arm/mach-imx/mach-imx53.c +++ b/arch/arm/mach-imx/mach-imx53.c @@ -21,6 +21,7 @@ #include <asm/mach/time.h> #include "common.h" +#include "hardware.h" #include "mx53.h" static void __init imx53_qsb_init(void) @@ -38,6 +39,8 @@ static void __init imx53_qsb_init(void) static void __init imx53_dt_init(void) { + mxc_arch_reset_init(MX53_IO_ADDRESS(MX53_WDOG1_BASE_ADDR)); + if (of_machine_is_compatible("fsl,imx53-qsb")) imx53_qsb_init(); diff --git a/arch/arm/mach-imx/mm-imx1.c b/arch/arm/mach-imx/mm-imx1.c index 3c609c5..e065fed 100644 --- a/arch/arm/mach-imx/mm-imx1.c +++ b/arch/arm/mach-imx/mm-imx1.c @@ -39,7 +39,6 @@ void __init mx1_map_io(void) void __init imx1_init_early(void) { mxc_set_cpu_type(MXC_CPU_MX1); - mxc_arch_reset_init(MX1_IO_ADDRESS(MX1_WDT_BASE_ADDR)); imx_iomuxv1_init(MX1_IO_ADDRESS(MX1_GPIO_BASE_ADDR), MX1_NUM_GPIO_PORT); } @@ -51,6 +50,7 @@ void __init mx1_init_irq(void) void __init imx1_soc_init(void) { + mxc_arch_reset_init(MX1_IO_ADDRESS(MX1_WDT_BASE_ADDR)); mxc_device_init(); mxc_register_gpio("imx1-gpio", 0, MX1_GPIO1_BASE_ADDR, SZ_256, diff --git a/arch/arm/mach-imx/mm-imx21.c b/arch/arm/mach-imx/mm-imx21.c index d8ccd3a..2e91ab2 100644 --- a/arch/arm/mach-imx/mm-imx21.c +++ b/arch/arm/mach-imx/mm-imx21.c @@ -66,7 +66,6 @@ void __init mx21_map_io(void) void __init imx21_init_early(void) { mxc_set_cpu_type(MXC_CPU_MX21); - mxc_arch_reset_init(MX21_IO_ADDRESS(MX21_WDOG_BASE_ADDR)); imx_iomuxv1_init(MX21_IO_ADDRESS(MX21_GPIO_BASE_ADDR), MX21_NUM_GPIO_PORT); } @@ -82,6 +81,7 @@ static const struct resource imx21_audmux_res[] __initconst = { void __init imx21_soc_init(void) { + mxc_arch_reset_init(MX21_IO_ADDRESS(MX21_WDOG_BASE_ADDR)); mxc_device_init(); mxc_register_gpio("imx21-gpio", 0, MX21_GPIO1_BASE_ADDR, SZ_256, MX21_INT_GPIO, 0); diff --git a/arch/arm/mach-imx/mm-imx25.c b/arch/arm/mach-imx/mm-imx25.c index 9357707..e065c11 100644 --- a/arch/arm/mach-imx/mm-imx25.c +++ b/arch/arm/mach-imx/mm-imx25.c @@ -54,7 +54,6 @@ void __init imx25_init_early(void) { mxc_set_cpu_type(MXC_CPU_MX25); mxc_iomux_v3_init(MX25_IO_ADDRESS(MX25_IOMUXC_BASE_ADDR)); - mxc_arch_reset_init(MX25_IO_ADDRESS(MX25_WDOG_BASE_ADDR)); } void __init mx25_init_irq(void) @@ -89,6 +88,7 @@ static const struct resource imx25_audmux_res[] __initconst = { void __init imx25_soc_init(void) { + mxc_arch_reset_init(MX25_IO_ADDRESS(MX25_WDOG_BASE_ADDR)); mxc_device_init(); /* i.mx25 has the i.mx35 type gpio */ diff --git a/arch/arm/mach-imx/mm-imx27.c b/arch/arm/mach-imx/mm-imx27.c index 4f1be65..7d82a5a 100644 --- a/arch/arm/mach-imx/mm-imx27.c +++ b/arch/arm/mach-imx/mm-imx27.c @@ -66,7 +66,6 @@ void __init mx27_map_io(void) void __init imx27_init_early(void) { mxc_set_cpu_type(MXC_CPU_MX27); - mxc_arch_reset_init(MX27_IO_ADDRESS(MX27_WDOG_BASE_ADDR)); imx_iomuxv1_init(MX27_IO_ADDRESS(MX27_GPIO_BASE_ADDR), MX27_NUM_GPIO_PORT); } @@ -82,6 +81,7 @@ static const struct resource imx27_audmux_res[] __initconst = { void __init imx27_soc_init(void) { + mxc_arch_reset_init(MX27_IO_ADDRESS(MX27_WDOG_BASE_ADDR)); mxc_device_init(); /* i.mx27 has the i.mx21 type gpio */ diff --git a/arch/arm/mach-imx/mm-imx3.c b/arch/arm/mach-imx/mm-imx3.c index e0e69a6..8f0f606 100644 --- a/arch/arm/mach-imx/mm-imx3.c +++ b/arch/arm/mach-imx/mm-imx3.c @@ -138,7 +138,6 @@ void __init mx31_map_io(void) void __init imx31_init_early(void) { mxc_set_cpu_type(MXC_CPU_MX31); - mxc_arch_reset_init(MX31_IO_ADDRESS(MX31_WDOG_BASE_ADDR)); arch_ioremap_caller = imx3_ioremap_caller; arm_pm_idle = imx3_idle; mx3_ccm_base = MX31_IO_ADDRESS(MX31_CCM_BASE_ADDR); @@ -174,6 +173,7 @@ void __init imx31_soc_init(void) imx3_init_l2x0(); + mxc_arch_reset_init(MX31_IO_ADDRESS(MX31_WDOG_BASE_ADDR)); mxc_device_init(); mxc_register_gpio("imx31-gpio", 0, MX31_GPIO1_BASE_ADDR, SZ_16K, MX31_INT_GPIO1, 0); @@ -216,7 +216,6 @@ void __init imx35_init_early(void) { mxc_set_cpu_type(MXC_CPU_MX35); mxc_iomux_v3_init(MX35_IO_ADDRESS(MX35_IOMUXC_BASE_ADDR)); - mxc_arch_reset_init(MX35_IO_ADDRESS(MX35_WDOG_BASE_ADDR)); arm_pm_idle = imx3_idle; arch_ioremap_caller = imx3_ioremap_caller; mx3_ccm_base = MX35_IO_ADDRESS(MX35_CCM_BASE_ADDR); @@ -272,6 +271,7 @@ void __init imx35_soc_init(void) imx3_init_l2x0(); + mxc_arch_reset_init(MX35_IO_ADDRESS(MX35_WDOG_BASE_ADDR)); mxc_device_init(); mxc_register_gpio("imx35-gpio", 0, MX35_GPIO1_BASE_ADDR, SZ_16K, MX35_INT_GPIO1, 0); diff --git a/arch/arm/mach-imx/mm-imx5.c b/arch/arm/mach-imx/mm-imx5.c index b7c4e70..cf193d8 100644 --- a/arch/arm/mach-imx/mm-imx5.c +++ b/arch/arm/mach-imx/mm-imx5.c @@ -83,7 +83,6 @@ void __init imx51_init_early(void) imx51_ipu_mipi_setup(); mxc_set_cpu_type(MXC_CPU_MX51); mxc_iomux_v3_init(MX51_IO_ADDRESS(MX51_IOMUXC_BASE_ADDR)); - mxc_arch_reset_init(MX51_IO_ADDRESS(MX51_WDOG1_BASE_ADDR)); imx_src_init(); } @@ -91,7 +90,6 @@ void __init imx53_init_early(void) { mxc_set_cpu_type(MXC_CPU_MX53); mxc_iomux_v3_init(MX53_IO_ADDRESS(MX53_IOMUXC_BASE_ADDR)); - mxc_arch_reset_init(MX53_IO_ADDRESS(MX53_WDOG1_BASE_ADDR)); imx_src_init(); } @@ -129,6 +127,7 @@ static const struct resource imx51_audmux_res[] __initconst = { void __init imx51_soc_init(void) { + mxc_arch_reset_init(MX51_IO_ADDRESS(MX51_WDOG1_BASE_ADDR)); mxc_device_init(); /* i.mx51 has the i.mx35 type gpio */ diff --git a/arch/arm/mach-imx/system.c b/arch/arm/mach-imx/system.c index 695e0d7..02cf449 100644 --- a/arch/arm/mach-imx/system.c +++ b/arch/arm/mach-imx/system.c @@ -30,6 +30,7 @@ #include "hardware.h" static void __iomem *wdog_base; +static struct clk *wdog_clk; /* * Reset the system. It is called by machine_restart(). @@ -38,16 +39,13 @@ void mxc_restart(char mode, const char *cmd) { unsigned int wcr_enable; - if (cpu_is_mx1()) { - wcr_enable = (1 << 0); - } else { - struct clk *clk; + if (wdog_clk) + clk_enable(wdog_clk); - clk = clk_get_sys("imx2-wdt.0", NULL); - if (!IS_ERR(clk)) - clk_prepare_enable(clk); + if (cpu_is_mx1()) + wcr_enable = (1 << 0); + else wcr_enable = (1 << 2); - } /* Assert SRS signal */ __raw_writew(wcr_enable, wdog_base); @@ -55,7 +53,7 @@ void mxc_restart(char mode, const char *cmd) /* wait for reset to assert... */ mdelay(500); - printk(KERN_ERR "Watchdog reset failed to assert reset\n"); + pr_err("%s: Watchdog reset failed to assert reset\n", __func__); /* delay to allow the serial port to show the message */ mdelay(50); @@ -64,7 +62,16 @@ void mxc_restart(char mode, const char *cmd) soft_restart(0); } -void mxc_arch_reset_init(void __iomem *base) +void __init mxc_arch_reset_init(void __iomem *base) { wdog_base = base; + + wdog_clk = clk_get_sys("imx2-wdt.0", NULL); + if (IS_ERR(wdog_clk)) { + pr_warn("%s: failed to get wdog clock\n", __func__); + wdog_clk = NULL; + return; + } + + clk_prepare(wdog_clk); } -- 1.7.9.5 ^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH 2/3] ARM: imx: move clk_prepare() out from mxs_restart() 2013-05-13 1:32 ` [PATCH 2/3] ARM: imx: move clk_prepare() out from mxs_restart() Shawn Guo @ 2013-05-13 8:25 ` Sascha Hauer 2013-05-13 12:51 ` Shawn Guo 0 siblings, 1 reply; 11+ messages in thread From: Sascha Hauer @ 2013-05-13 8:25 UTC (permalink / raw) To: linux-arm-kernel Hi Shawn, In the subject: s/mxs_restart/mxc_restart/ Sascha -- Pengutronix e.K. | | Industrial Linux Solutions | http://www.pengutronix.de/ | Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 | ^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH 2/3] ARM: imx: move clk_prepare() out from mxs_restart() 2013-05-13 8:25 ` Sascha Hauer @ 2013-05-13 12:51 ` Shawn Guo 0 siblings, 0 replies; 11+ messages in thread From: Shawn Guo @ 2013-05-13 12:51 UTC (permalink / raw) To: linux-arm-kernel On Mon, May 13, 2013 at 10:25:35AM +0200, Sascha Hauer wrote: > Hi Shawn, > > In the subject: > > s/mxs_restart/mxc_restart/ Thanks, Sascha. Fixed it and commit log as well. Shawn ^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH 3/3] ARM: imx: create imx_arch_reset_init() for DT boot 2013-05-13 1:32 [PATCH 0/3] ARM: imx: make mxs_restart() work for DT boot Shawn Guo 2013-05-13 1:32 ` [PATCH 1/3] ARM: imx: include <asm/io.h> in hardware.h Shawn Guo 2013-05-13 1:32 ` [PATCH 2/3] ARM: imx: move clk_prepare() out from mxs_restart() Shawn Guo @ 2013-05-13 1:32 ` Shawn Guo 2013-05-13 8:27 ` Sascha Hauer 2013-05-13 13:05 ` [PATCH v2 3/3] ARM: imx: create mxc_arch_reset_init_dt() " Shawn Guo 2 siblings, 2 replies; 11+ messages in thread From: Shawn Guo @ 2013-05-13 1:32 UTC (permalink / raw) To: linux-arm-kernel The mxc_arch_reset_init() uses static mapping and calls clk_get_sys() to get clock. It's suitable for non-DT boot but not for DT boot where dynamic mapping and of_clk_get() should be used instead. Create imx_arch_reset_init() as the DT variant of mxc_arch_reset_init(), and change DT platforms to use it. Signed-off-by: Shawn Guo <shawn.guo@linaro.org> --- arch/arm/mach-imx/common.h | 1 + arch/arm/mach-imx/imx25-dt.c | 3 +-- arch/arm/mach-imx/imx27-dt.c | 3 +-- arch/arm/mach-imx/imx31-dt.c | 3 +-- arch/arm/mach-imx/imx51-dt.c | 3 +-- arch/arm/mach-imx/mach-imx53.c | 2 +- arch/arm/mach-imx/system.c | 20 ++++++++++++++++++++ 7 files changed, 26 insertions(+), 9 deletions(-) diff --git a/arch/arm/mach-imx/common.h b/arch/arm/mach-imx/common.h index c08ae3f..3ef909b 100644 --- a/arch/arm/mach-imx/common.h +++ b/arch/arm/mach-imx/common.h @@ -74,6 +74,7 @@ extern struct platform_device *mxc_register_gpio(char *name, int id, extern void mxc_set_cpu_type(unsigned int type); extern void mxc_restart(char, const char *); extern void mxc_arch_reset_init(void __iomem *); +extern void imx_arch_reset_init(void); extern int mx53_revision(void); extern int imx6q_revision(void); extern int mx53_display_revision(void); diff --git a/arch/arm/mach-imx/imx25-dt.c b/arch/arm/mach-imx/imx25-dt.c index ec33991..a2575267 100644 --- a/arch/arm/mach-imx/imx25-dt.c +++ b/arch/arm/mach-imx/imx25-dt.c @@ -15,12 +15,11 @@ #include <asm/mach/arch.h> #include <asm/mach/time.h> #include "common.h" -#include "hardware.h" #include "mx25.h" static void __init imx25_dt_init(void) { - mxc_arch_reset_init(MX25_IO_ADDRESS(MX25_WDOG_BASE_ADDR)); + imx_arch_reset_init(); of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); } diff --git a/arch/arm/mach-imx/imx27-dt.c b/arch/arm/mach-imx/imx27-dt.c index 93aef1a..174e441 100644 --- a/arch/arm/mach-imx/imx27-dt.c +++ b/arch/arm/mach-imx/imx27-dt.c @@ -16,14 +16,13 @@ #include <asm/mach/time.h> #include "common.h" -#include "hardware.h" #include "mx27.h" static void __init imx27_dt_init(void) { struct platform_device_info devinfo = { .name = "cpufreq-cpu0", }; - mxc_arch_reset_init(MX27_IO_ADDRESS(MX27_WDOG_BASE_ADDR)); + imx_arch_reset_init(); of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); diff --git a/arch/arm/mach-imx/imx31-dt.c b/arch/arm/mach-imx/imx31-dt.c index d8b3b22..a07cdec 100644 --- a/arch/arm/mach-imx/imx31-dt.c +++ b/arch/arm/mach-imx/imx31-dt.c @@ -16,12 +16,11 @@ #include <asm/mach/time.h> #include "common.h" -#include "hardware.h" #include "mx31.h" static void __init imx31_dt_init(void) { - mxc_arch_reset_init(MX31_IO_ADDRESS(MX31_WDOG_BASE_ADDR)); + imx_arch_reset_init(); of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); } diff --git a/arch/arm/mach-imx/imx51-dt.c b/arch/arm/mach-imx/imx51-dt.c index 55f47a0..b2f5830 100644 --- a/arch/arm/mach-imx/imx51-dt.c +++ b/arch/arm/mach-imx/imx51-dt.c @@ -17,14 +17,13 @@ #include <asm/mach/time.h> #include "common.h" -#include "hardware.h" #include "mx51.h" static void __init imx51_dt_init(void) { struct platform_device_info devinfo = { .name = "cpufreq-cpu0", }; - mxc_arch_reset_init(MX51_IO_ADDRESS(MX51_WDOG1_BASE_ADDR)); + imx_arch_reset_init(); of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); platform_device_register_full(&devinfo); diff --git a/arch/arm/mach-imx/mach-imx53.c b/arch/arm/mach-imx/mach-imx53.c index 7a56561..e0da2cc 100644 --- a/arch/arm/mach-imx/mach-imx53.c +++ b/arch/arm/mach-imx/mach-imx53.c @@ -39,7 +39,7 @@ static void __init imx53_qsb_init(void) static void __init imx53_dt_init(void) { - mxc_arch_reset_init(MX53_IO_ADDRESS(MX53_WDOG1_BASE_ADDR)); + imx_arch_reset_init(); if (of_machine_is_compatible("fsl,imx53-qsb")) imx53_qsb_init(); diff --git a/arch/arm/mach-imx/system.c b/arch/arm/mach-imx/system.c index 02cf449..973f01d 100644 --- a/arch/arm/mach-imx/system.c +++ b/arch/arm/mach-imx/system.c @@ -21,6 +21,8 @@ #include <linux/io.h> #include <linux/err.h> #include <linux/delay.h> +#include <linux/of.h> +#include <linux/of_address.h> #include <asm/system_misc.h> #include <asm/proc-fns.h> @@ -75,3 +77,21 @@ void __init mxc_arch_reset_init(void __iomem *base) clk_prepare(wdog_clk); } + +void __init imx_arch_reset_init(void) +{ + struct device_node *np; + + np = of_find_compatible_node(NULL, NULL, "fsl,imx21-wdt"); + wdog_base = of_iomap(np, 0); + WARN_ON(!wdog_base); + + wdog_clk = of_clk_get(np, 0); + if (IS_ERR(wdog_clk)) { + pr_warn("%s: failed to get wdog clock\n", __func__); + wdog_clk = NULL; + return; + } + + clk_prepare(wdog_clk); +} -- 1.7.9.5 ^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH 3/3] ARM: imx: create imx_arch_reset_init() for DT boot 2013-05-13 1:32 ` [PATCH 3/3] ARM: imx: create imx_arch_reset_init() for DT boot Shawn Guo @ 2013-05-13 8:27 ` Sascha Hauer 2013-05-13 12:52 ` Shawn Guo 2013-05-13 13:05 ` [PATCH v2 3/3] ARM: imx: create mxc_arch_reset_init_dt() " Shawn Guo 1 sibling, 1 reply; 11+ messages in thread From: Sascha Hauer @ 2013-05-13 8:27 UTC (permalink / raw) To: linux-arm-kernel On Mon, May 13, 2013 at 09:32:08AM +0800, Shawn Guo wrote: > The mxc_arch_reset_init() uses static mapping and calls clk_get_sys() to > get clock. It's suitable for non-DT boot but not for DT boot where > dynamic mapping and of_clk_get() should be used instead. Create > imx_arch_reset_init() as the DT variant of mxc_arch_reset_init(), > and change DT platforms to use it. Having mxc_arch_reset_init for !dt and the same functionality for dt named imx_arch_reset_init is a bit confusing. Maybe add _dt_ to the function name? Sascha -- Pengutronix e.K. | | Industrial Linux Solutions | http://www.pengutronix.de/ | Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 | ^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH 3/3] ARM: imx: create imx_arch_reset_init() for DT boot 2013-05-13 8:27 ` Sascha Hauer @ 2013-05-13 12:52 ` Shawn Guo 2013-05-13 12:54 ` Sascha Hauer 0 siblings, 1 reply; 11+ messages in thread From: Shawn Guo @ 2013-05-13 12:52 UTC (permalink / raw) To: linux-arm-kernel On Mon, May 13, 2013 at 10:27:08AM +0200, Sascha Hauer wrote: > On Mon, May 13, 2013 at 09:32:08AM +0800, Shawn Guo wrote: > > The mxc_arch_reset_init() uses static mapping and calls clk_get_sys() to > > get clock. It's suitable for non-DT boot but not for DT boot where > > dynamic mapping and of_clk_get() should be used instead. Create > > imx_arch_reset_init() as the DT variant of mxc_arch_reset_init(), > > and change DT platforms to use it. > > Having mxc_arch_reset_init for !dt and the same functionality for dt > named imx_arch_reset_init is a bit confusing. Maybe add _dt_ to the > function name? Ok, will change it to mxc_arch_reset_init_dt() avoid the confusion. Shawn ^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH 3/3] ARM: imx: create imx_arch_reset_init() for DT boot 2013-05-13 12:52 ` Shawn Guo @ 2013-05-13 12:54 ` Sascha Hauer 0 siblings, 0 replies; 11+ messages in thread From: Sascha Hauer @ 2013-05-13 12:54 UTC (permalink / raw) To: linux-arm-kernel On Mon, May 13, 2013 at 08:52:17PM +0800, Shawn Guo wrote: > On Mon, May 13, 2013 at 10:27:08AM +0200, Sascha Hauer wrote: > > On Mon, May 13, 2013 at 09:32:08AM +0800, Shawn Guo wrote: > > > The mxc_arch_reset_init() uses static mapping and calls clk_get_sys() to > > > get clock. It's suitable for non-DT boot but not for DT boot where > > > dynamic mapping and of_clk_get() should be used instead. Create > > > imx_arch_reset_init() as the DT variant of mxc_arch_reset_init(), > > > and change DT platforms to use it. > > > > Having mxc_arch_reset_init for !dt and the same functionality for dt > > named imx_arch_reset_init is a bit confusing. Maybe add _dt_ to the > > function name? > > Ok, will change it to mxc_arch_reset_init_dt() avoid the confusion. I think we both prefer 'imx' over 'mxc', but maybe changing this is topic for another patch. Sascha -- Pengutronix e.K. | | Industrial Linux Solutions | http://www.pengutronix.de/ | Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 | ^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH v2 3/3] ARM: imx: create mxc_arch_reset_init_dt() for DT boot 2013-05-13 1:32 ` [PATCH 3/3] ARM: imx: create imx_arch_reset_init() for DT boot Shawn Guo 2013-05-13 8:27 ` Sascha Hauer @ 2013-05-13 13:05 ` Shawn Guo 2013-05-13 14:59 ` Sascha Hauer 1 sibling, 1 reply; 11+ messages in thread From: Shawn Guo @ 2013-05-13 13:05 UTC (permalink / raw) To: linux-arm-kernel The mxc_arch_reset_init() uses static mapping and calls clk_get_sys() to get clock. It's suitable for non-DT boot but not for DT boot where dynamic mapping and of_clk_get() should be used instead. Create mxc_arch_reset_init_dt() as the DT variant of mxc_arch_reset_init(), and change DT platforms to use it. Signed-off-by: Shawn Guo <shawn.guo@linaro.org> --- Changes since v1: * Rename the new function as mxc_arch_reset_init_dt() arch/arm/mach-imx/common.h | 1 + arch/arm/mach-imx/imx25-dt.c | 3 +-- arch/arm/mach-imx/imx27-dt.c | 3 +-- arch/arm/mach-imx/imx31-dt.c | 3 +-- arch/arm/mach-imx/imx51-dt.c | 3 +-- arch/arm/mach-imx/mach-imx53.c | 2 +- arch/arm/mach-imx/system.c | 20 ++++++++++++++++++++ 7 files changed, 26 insertions(+), 9 deletions(-) diff --git a/arch/arm/mach-imx/common.h b/arch/arm/mach-imx/common.h index c08ae3f..963971e1 100644 --- a/arch/arm/mach-imx/common.h +++ b/arch/arm/mach-imx/common.h @@ -74,6 +74,7 @@ extern struct platform_device *mxc_register_gpio(char *name, int id, extern void mxc_set_cpu_type(unsigned int type); extern void mxc_restart(char, const char *); extern void mxc_arch_reset_init(void __iomem *); +extern void mxc_arch_reset_init_dt(void); extern int mx53_revision(void); extern int imx6q_revision(void); extern int mx53_display_revision(void); diff --git a/arch/arm/mach-imx/imx25-dt.c b/arch/arm/mach-imx/imx25-dt.c index ec33991..3e1ec5f 100644 --- a/arch/arm/mach-imx/imx25-dt.c +++ b/arch/arm/mach-imx/imx25-dt.c @@ -15,12 +15,11 @@ #include <asm/mach/arch.h> #include <asm/mach/time.h> #include "common.h" -#include "hardware.h" #include "mx25.h" static void __init imx25_dt_init(void) { - mxc_arch_reset_init(MX25_IO_ADDRESS(MX25_WDOG_BASE_ADDR)); + mxc_arch_reset_init_dt(); of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); } diff --git a/arch/arm/mach-imx/imx27-dt.c b/arch/arm/mach-imx/imx27-dt.c index 93aef1a..4e235ec 100644 --- a/arch/arm/mach-imx/imx27-dt.c +++ b/arch/arm/mach-imx/imx27-dt.c @@ -16,14 +16,13 @@ #include <asm/mach/time.h> #include "common.h" -#include "hardware.h" #include "mx27.h" static void __init imx27_dt_init(void) { struct platform_device_info devinfo = { .name = "cpufreq-cpu0", }; - mxc_arch_reset_init(MX27_IO_ADDRESS(MX27_WDOG_BASE_ADDR)); + mxc_arch_reset_init_dt(); of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); diff --git a/arch/arm/mach-imx/imx31-dt.c b/arch/arm/mach-imx/imx31-dt.c index d8b3b22..818a1cc 100644 --- a/arch/arm/mach-imx/imx31-dt.c +++ b/arch/arm/mach-imx/imx31-dt.c @@ -16,12 +16,11 @@ #include <asm/mach/time.h> #include "common.h" -#include "hardware.h" #include "mx31.h" static void __init imx31_dt_init(void) { - mxc_arch_reset_init(MX31_IO_ADDRESS(MX31_WDOG_BASE_ADDR)); + mxc_arch_reset_init_dt(); of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); } diff --git a/arch/arm/mach-imx/imx51-dt.c b/arch/arm/mach-imx/imx51-dt.c index 55f47a0..53e43e5 100644 --- a/arch/arm/mach-imx/imx51-dt.c +++ b/arch/arm/mach-imx/imx51-dt.c @@ -17,14 +17,13 @@ #include <asm/mach/time.h> #include "common.h" -#include "hardware.h" #include "mx51.h" static void __init imx51_dt_init(void) { struct platform_device_info devinfo = { .name = "cpufreq-cpu0", }; - mxc_arch_reset_init(MX51_IO_ADDRESS(MX51_WDOG1_BASE_ADDR)); + mxc_arch_reset_init_dt(); of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); platform_device_register_full(&devinfo); diff --git a/arch/arm/mach-imx/mach-imx53.c b/arch/arm/mach-imx/mach-imx53.c index 7a56561..74e7b94c 100644 --- a/arch/arm/mach-imx/mach-imx53.c +++ b/arch/arm/mach-imx/mach-imx53.c @@ -39,7 +39,7 @@ static void __init imx53_qsb_init(void) static void __init imx53_dt_init(void) { - mxc_arch_reset_init(MX53_IO_ADDRESS(MX53_WDOG1_BASE_ADDR)); + mxc_arch_reset_init_dt(); if (of_machine_is_compatible("fsl,imx53-qsb")) imx53_qsb_init(); diff --git a/arch/arm/mach-imx/system.c b/arch/arm/mach-imx/system.c index 02cf449..7cdc79a 100644 --- a/arch/arm/mach-imx/system.c +++ b/arch/arm/mach-imx/system.c @@ -21,6 +21,8 @@ #include <linux/io.h> #include <linux/err.h> #include <linux/delay.h> +#include <linux/of.h> +#include <linux/of_address.h> #include <asm/system_misc.h> #include <asm/proc-fns.h> @@ -75,3 +77,21 @@ void __init mxc_arch_reset_init(void __iomem *base) clk_prepare(wdog_clk); } + +void __init mxc_arch_reset_init_dt(void) +{ + struct device_node *np; + + np = of_find_compatible_node(NULL, NULL, "fsl,imx21-wdt"); + wdog_base = of_iomap(np, 0); + WARN_ON(!wdog_base); + + wdog_clk = of_clk_get(np, 0); + if (IS_ERR(wdog_clk)) { + pr_warn("%s: failed to get wdog clock\n", __func__); + wdog_clk = NULL; + return; + } + + clk_prepare(wdog_clk); +} -- 1.7.9.5 ^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH v2 3/3] ARM: imx: create mxc_arch_reset_init_dt() for DT boot 2013-05-13 13:05 ` [PATCH v2 3/3] ARM: imx: create mxc_arch_reset_init_dt() " Shawn Guo @ 2013-05-13 14:59 ` Sascha Hauer 0 siblings, 0 replies; 11+ messages in thread From: Sascha Hauer @ 2013-05-13 14:59 UTC (permalink / raw) To: linux-arm-kernel On Mon, May 13, 2013 at 09:05:02PM +0800, Shawn Guo wrote: > The mxc_arch_reset_init() uses static mapping and calls clk_get_sys() to > get clock. It's suitable for non-DT boot but not for DT boot where > dynamic mapping and of_clk_get() should be used instead. Create > mxc_arch_reset_init_dt() as the DT variant of mxc_arch_reset_init(), > and change DT platforms to use it. > > Signed-off-by: Shawn Guo <shawn.guo@linaro.org> Acked-by: Sascha Hauer <s.hauer@pengutronix.de> (For the whole series) Sascha > --- > Changes since v1: > * Rename the new function as mxc_arch_reset_init_dt() > > arch/arm/mach-imx/common.h | 1 + > arch/arm/mach-imx/imx25-dt.c | 3 +-- > arch/arm/mach-imx/imx27-dt.c | 3 +-- > arch/arm/mach-imx/imx31-dt.c | 3 +-- > arch/arm/mach-imx/imx51-dt.c | 3 +-- > arch/arm/mach-imx/mach-imx53.c | 2 +- > arch/arm/mach-imx/system.c | 20 ++++++++++++++++++++ > 7 files changed, 26 insertions(+), 9 deletions(-) > > diff --git a/arch/arm/mach-imx/common.h b/arch/arm/mach-imx/common.h > index c08ae3f..963971e1 100644 > --- a/arch/arm/mach-imx/common.h > +++ b/arch/arm/mach-imx/common.h > @@ -74,6 +74,7 @@ extern struct platform_device *mxc_register_gpio(char *name, int id, > extern void mxc_set_cpu_type(unsigned int type); > extern void mxc_restart(char, const char *); > extern void mxc_arch_reset_init(void __iomem *); > +extern void mxc_arch_reset_init_dt(void); > extern int mx53_revision(void); > extern int imx6q_revision(void); > extern int mx53_display_revision(void); > diff --git a/arch/arm/mach-imx/imx25-dt.c b/arch/arm/mach-imx/imx25-dt.c > index ec33991..3e1ec5f 100644 > --- a/arch/arm/mach-imx/imx25-dt.c > +++ b/arch/arm/mach-imx/imx25-dt.c > @@ -15,12 +15,11 @@ > #include <asm/mach/arch.h> > #include <asm/mach/time.h> > #include "common.h" > -#include "hardware.h" > #include "mx25.h" > > static void __init imx25_dt_init(void) > { > - mxc_arch_reset_init(MX25_IO_ADDRESS(MX25_WDOG_BASE_ADDR)); > + mxc_arch_reset_init_dt(); > > of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); > } > diff --git a/arch/arm/mach-imx/imx27-dt.c b/arch/arm/mach-imx/imx27-dt.c > index 93aef1a..4e235ec 100644 > --- a/arch/arm/mach-imx/imx27-dt.c > +++ b/arch/arm/mach-imx/imx27-dt.c > @@ -16,14 +16,13 @@ > #include <asm/mach/time.h> > > #include "common.h" > -#include "hardware.h" > #include "mx27.h" > > static void __init imx27_dt_init(void) > { > struct platform_device_info devinfo = { .name = "cpufreq-cpu0", }; > > - mxc_arch_reset_init(MX27_IO_ADDRESS(MX27_WDOG_BASE_ADDR)); > + mxc_arch_reset_init_dt(); > > of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); > > diff --git a/arch/arm/mach-imx/imx31-dt.c b/arch/arm/mach-imx/imx31-dt.c > index d8b3b22..818a1cc 100644 > --- a/arch/arm/mach-imx/imx31-dt.c > +++ b/arch/arm/mach-imx/imx31-dt.c > @@ -16,12 +16,11 @@ > #include <asm/mach/time.h> > > #include "common.h" > -#include "hardware.h" > #include "mx31.h" > > static void __init imx31_dt_init(void) > { > - mxc_arch_reset_init(MX31_IO_ADDRESS(MX31_WDOG_BASE_ADDR)); > + mxc_arch_reset_init_dt(); > > of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); > } > diff --git a/arch/arm/mach-imx/imx51-dt.c b/arch/arm/mach-imx/imx51-dt.c > index 55f47a0..53e43e5 100644 > --- a/arch/arm/mach-imx/imx51-dt.c > +++ b/arch/arm/mach-imx/imx51-dt.c > @@ -17,14 +17,13 @@ > #include <asm/mach/time.h> > > #include "common.h" > -#include "hardware.h" > #include "mx51.h" > > static void __init imx51_dt_init(void) > { > struct platform_device_info devinfo = { .name = "cpufreq-cpu0", }; > > - mxc_arch_reset_init(MX51_IO_ADDRESS(MX51_WDOG1_BASE_ADDR)); > + mxc_arch_reset_init_dt(); > > of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); > platform_device_register_full(&devinfo); > diff --git a/arch/arm/mach-imx/mach-imx53.c b/arch/arm/mach-imx/mach-imx53.c > index 7a56561..74e7b94c 100644 > --- a/arch/arm/mach-imx/mach-imx53.c > +++ b/arch/arm/mach-imx/mach-imx53.c > @@ -39,7 +39,7 @@ static void __init imx53_qsb_init(void) > > static void __init imx53_dt_init(void) > { > - mxc_arch_reset_init(MX53_IO_ADDRESS(MX53_WDOG1_BASE_ADDR)); > + mxc_arch_reset_init_dt(); > > if (of_machine_is_compatible("fsl,imx53-qsb")) > imx53_qsb_init(); > diff --git a/arch/arm/mach-imx/system.c b/arch/arm/mach-imx/system.c > index 02cf449..7cdc79a 100644 > --- a/arch/arm/mach-imx/system.c > +++ b/arch/arm/mach-imx/system.c > @@ -21,6 +21,8 @@ > #include <linux/io.h> > #include <linux/err.h> > #include <linux/delay.h> > +#include <linux/of.h> > +#include <linux/of_address.h> > > #include <asm/system_misc.h> > #include <asm/proc-fns.h> > @@ -75,3 +77,21 @@ void __init mxc_arch_reset_init(void __iomem *base) > > clk_prepare(wdog_clk); > } > + > +void __init mxc_arch_reset_init_dt(void) > +{ > + struct device_node *np; > + > + np = of_find_compatible_node(NULL, NULL, "fsl,imx21-wdt"); > + wdog_base = of_iomap(np, 0); > + WARN_ON(!wdog_base); > + > + wdog_clk = of_clk_get(np, 0); > + if (IS_ERR(wdog_clk)) { > + pr_warn("%s: failed to get wdog clock\n", __func__); > + wdog_clk = NULL; > + return; > + } > + > + clk_prepare(wdog_clk); > +} > -- > 1.7.9.5 > > > -- Pengutronix e.K. | | Industrial Linux Solutions | http://www.pengutronix.de/ | Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 | ^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2013-05-13 14:59 UTC | newest] Thread overview: 11+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2013-05-13 1:32 [PATCH 0/3] ARM: imx: make mxs_restart() work for DT boot Shawn Guo 2013-05-13 1:32 ` [PATCH 1/3] ARM: imx: include <asm/io.h> in hardware.h Shawn Guo 2013-05-13 1:32 ` [PATCH 2/3] ARM: imx: move clk_prepare() out from mxs_restart() Shawn Guo 2013-05-13 8:25 ` Sascha Hauer 2013-05-13 12:51 ` Shawn Guo 2013-05-13 1:32 ` [PATCH 3/3] ARM: imx: create imx_arch_reset_init() for DT boot Shawn Guo 2013-05-13 8:27 ` Sascha Hauer 2013-05-13 12:52 ` Shawn Guo 2013-05-13 12:54 ` Sascha Hauer 2013-05-13 13:05 ` [PATCH v2 3/3] ARM: imx: create mxc_arch_reset_init_dt() " Shawn Guo 2013-05-13 14:59 ` Sascha Hauer
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).