MPC5200: update gpt binding, add restart support
Subsystems (5)
cover MPC5200: update gpt binding, add restart support
This is a reworked version of patches to MPC5200 common code that were send together with the TQM5200/CM5200/Motion-PRO board support chnages.
As there are some open issues in a board support code and to avoid additional respin I would like to have those reviewed first.
[PATCH 1/4] [POWERPC] Add mpc52xx_find_and_map_path(), refactor utility functions [PATCH 2/4] [POWERPC] Update device tree binding for mpc5200 gpt [PATCH 3/4] [POWERPC] Add restart support for mpc52xx based platforms [PATCH 4/4] [POWERPC] Enable restart support for lite5200 board
Cheers,
Marian Balakowicz
PATCH 1/4 Add mpc52xx_find_and_map_path(), refactor utility functions
Add helper routine mpc52xx_find_and_map_path(). Extract common code to mpc52xx_map_node() and refactor mpc52xx_find_and_map().
---
arch/powerpc/platforms/52xx/mpc52xx_common.c | 21 +++++++++++++++++---- include/asm-powerpc/mpc52xx.h | 1 + 2 files changed, 18 insertions(+), 4 deletions(-)
arch/powerpc/platforms/52xx/mpc52xx_common.c +17 -4
@@ -19,14 +19,12 @@ #include <asm/prom.h>#include <asm/mpc52xx.h> -void __iomem * -mpc52xx_find_and_map (const char *compatible) +static void __iomem * +mpc52xx_map_node (struct device_node *ofn) { -struct device_node *ofn;const u32 *regaddr_p;u64 regaddr64, size64; - ofn =of_find_compatible_node (NULL ,NULL , compatible);if (!ofn)return NULL ;
@@ -42,8 +40,23 @@ mpc52xx_find_and_map(const char *compatireturn ioremap ((u32 )regaddr64, (u32 )size64); } + +void __iomem * +mpc52xx_find_and_map (const char *compatible) +{ +return mpc52xx_map_node ( +of_find_compatible_node (NULL ,NULL , compatible)); +} +EXPORT_SYMBOL (mpc52xx_find_and_map); +void __iomem * +mpc52xx_find_and_map_path (const char *path) +{ +return mpc52xx_map_node (of_find_node_by_path (path)); +} + +EXPORT_SYMBOL (mpc52xx_find_and_map_path);/** * mpc52xx_find_ipb_freq - Find the IPB bus frequency for a device
include/asm-powerpc/mpc52xx.h +1 -0
@@ -242,6 +242,7 @@ #endif /* __ASSEMBLY__ */#ifndef __ASSEMBLY__extern void __iomem *mpc52xx_find_and_map (const char *); +extern void __iomem *mpc52xx_find_and_map_path (const char *path);extern unsigned int mpc52xx_find_ipb_freq (struct device_node *node);extern void mpc5200_setup_xlb_arbiter (void );extern void mpc52xx_declare_of_platform_devices (void );
Re: [PATCH 1/4] [POWERPC] Add mpc52xx_find_and_map_path(), refactor utility functions
Quoted 6 lines · Marian Balakowicz
Add helper routine
mpc52xx_find_and_map_path(). Extract common code tompc52xx_map_node()and refactormpc52xx_find_and_map().Signed-off-by Jan Wrobel <[email protected]>Reviewed-by Grant Likely <[email protected]>
Yeah, this is probably okay. Eventually these util functions should be refactored to be usable by any platform.
Cheers,
g.
Signature · 4 lines
Grant Likely, B.Sc., P.Eng. Secret Lab Technologies Ltd. [email protected] (403) 399-0195
PATCH 2/4 Update device tree binding for mpc5200 gpt
In reply to Marian BalakowiczAdd 'fsl,' prefix to 'compatible' property for gpt nodes. Add 'fsl,' prefix to empty, GPT0 specific 'has-wdt' property.
---
Documentation/powerpc/mpc52xx-device-tree-bindings.txt | 4 +- arch/powerpc/boot/dts/lite5200.dts | 26 +++++------------ arch/powerpc/boot/dts/lite5200b.dts | 26 +++++------------ drivers/char/watchdog/mpc5200_wdt.c | 4 +- 4 files changed, 22 insertions(+), 38 deletions(-)
Documentation/powerpc/mpc52xx-device-tree-bindings.txt +2 -2
@@ -185,7 +185,7 @@ bestcomm@<addr> dma-controller mpc5200- Recommended soc5200 child nodes; populate as needed for your board name device_type compatible Description ---- ----------- ---------- ----------- -gpt@<addr> gpt mpc5200-gpt General purpose timers +gpt@<addr> gpt fsl,mpc5200-gpt General purpose timers rtc@<addr> rtc mpc5200-rtc Real time clock mscan@<addr> mscan mpc5200-mscan CAN bus controller pci@<addr> pci mpc5200-pci PCI bridge
@@ -213,7 +213,7 @@ cell-index int When multiple devices ar 5) General Purpose Timer nodes (child of soc5200 node) On the mpc5200 and 5200b, GPT0 has a watchdog timer function. If the board design supports the internal wdt, then the device node for GPT0 should -include the empty property 'has-wdt'. +include the empty property 'fsl,has-wdt'. 6) PSC nodes (child of soc5200 node) PSC nodes can define the optional 'port-number' property to force assignment
arch/powerpc/boot/dts/lite5200.dts +9 -17
@@ -70,18 +70,16 @@ }; gpt@600 { // General Purpose Timer - compatible = "mpc5200-gpt"; - device_type = "gpt"; + compatible = "fsl,mpc5200-gpt"; cell-index = <0>; reg = <600 10>; interrupts = <1 9 0>; interrupt-parent = <&mpc5200_pic>; - has-wdt; + fsl,has-wdt; }; gpt@610 { // General Purpose Timer - compatible = "mpc5200-gpt"; - device_type = "gpt"; + compatible = "fsl,mpc5200-gpt"; cell-index = <1>; reg = <610 10>; interrupts = <1 a 0>;
@@ -89,8 +87,7 @@ }; gpt@620 { // General Purpose Timer - compatible = "mpc5200-gpt"; - device_type = "gpt"; + compatible = "fsl,mpc5200-gpt"; cell-index = <2>; reg = <620 10>; interrupts = <1 b 0>;
@@ -98,8 +95,7 @@ }; gpt@630 { // General Purpose Timer - compatible = "mpc5200-gpt"; - device_type = "gpt"; + compatible = "fsl,mpc5200-gpt"; cell-index = <3>; reg = <630 10>; interrupts = <1 c 0>;
@@ -107,8 +103,7 @@ }; gpt@640 { // General Purpose Timer - compatible = "mpc5200-gpt"; - device_type = "gpt"; + compatible = "fsl,mpc5200-gpt"; cell-index = <4>; reg = <640 10>; interrupts = <1 d 0>;
@@ -116,8 +111,7 @@ }; gpt@650 { // General Purpose Timer - compatible = "mpc5200-gpt"; - device_type = "gpt"; + compatible = "fsl,mpc5200-gpt"; cell-index = <5>; reg = <650 10>; interrupts = <1 e 0>;
@@ -125,8 +119,7 @@ }; gpt@660 { // General Purpose Timer - compatible = "mpc5200-gpt"; - device_type = "gpt"; + compatible = "fsl,mpc5200-gpt"; cell-index = <6>; reg = <660 10>; interrupts = <1 f 0>;
@@ -134,8 +127,7 @@ }; gpt@670 { // General Purpose Timer - compatible = "mpc5200-gpt"; - device_type = "gpt"; + compatible = "fsl,mpc5200-gpt"; cell-index = <7>; reg = <670 10>; interrupts = <1 10 0>;
arch/powerpc/boot/dts/lite5200b.dts +9 -17
@@ -70,18 +70,16 @@ }; gpt@600 { // General Purpose Timer - compatible = "mpc5200b-gpt","mpc5200-gpt"; - device_type = "gpt"; + compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; cell-index = <0>; reg = <600 10>; interrupts = <1 9 0>; interrupt-parent = <&mpc5200_pic>; - has-wdt; + fsl,has-wdt; }; gpt@610 { // General Purpose Timer - compatible = "mpc5200b-gpt","mpc5200-gpt"; - device_type = "gpt"; + compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; cell-index = <1>; reg = <610 10>; interrupts = <1 a 0>;
@@ -89,8 +87,7 @@ }; gpt@620 { // General Purpose Timer - compatible = "mpc5200b-gpt","mpc5200-gpt"; - device_type = "gpt"; + compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; cell-index = <2>; reg = <620 10>; interrupts = <1 b 0>;
@@ -98,8 +95,7 @@ }; gpt@630 { // General Purpose Timer - compatible = "mpc5200b-gpt","mpc5200-gpt"; - device_type = "gpt"; + compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; cell-index = <3>; reg = <630 10>; interrupts = <1 c 0>;
@@ -107,8 +103,7 @@ }; gpt@640 { // General Purpose Timer - compatible = "mpc5200b-gpt","mpc5200-gpt"; - device_type = "gpt"; + compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; cell-index = <4>; reg = <640 10>; interrupts = <1 d 0>;
@@ -116,8 +111,7 @@ }; gpt@650 { // General Purpose Timer - compatible = "mpc5200b-gpt","mpc5200-gpt"; - device_type = "gpt"; + compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; cell-index = <5>; reg = <650 10>; interrupts = <1 e 0>;
@@ -125,8 +119,7 @@ }; gpt@660 { // General Purpose Timer - compatible = "mpc5200b-gpt","mpc5200-gpt"; - device_type = "gpt"; + compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; cell-index = <6>; reg = <660 10>; interrupts = <1 f 0>;
@@ -134,8 +127,7 @@ }; gpt@670 { // General Purpose Timer - compatible = "mpc5200b-gpt","mpc5200-gpt"; - device_type = "gpt"; + compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; cell-index = <7>; reg = <670 10>; interrupts = <1 10 0>;
drivers/char/watchdog/mpc5200_wdt.c +2 -2
@@ -174,7 +174,7 @@ static int mpc5200_wdt_probe(struct of_dconst void *has_wdt;int size; - has_wdt =of_get_property (op->node,"has-wdt" ,NULL ); + has_wdt =of_get_property (op->node,"fsl,has-wdt" ,NULL );if (!has_wdt)return -ENODEV ;
@@ -253,7 +253,7 @@ static int mpc5200_wdt_shutdown(struct o }static struct of_device_id mpc5200_wdt_match[] = { - { .compatible ="mpc5200-gpt" , }, + { .compatible ="fsl,mpc5200-gpt" , }, {}, };static struct of_platform_driver mpc5200_wdt_driver = {
Re: [PATCH 2/4] [POWERPC] Update device tree binding for mpc5200 gpt
Quoted 9 lines · Marian Balakowicz
Add 'fsl,' prefix to 'compatible' property for gpt nodes. Add 'fsl,' prefix to empty, GPT0 specific 'has-wdt' property.
drivers/char/watchdog/mpc5200_wdt.c +0
-0
drivers/char/watchdog/mpc5200_wdt.c static int mpc5200_wdt_probe(struct of_d · line 179
Quoted 7 lines
drivers/char/watchdog/mpc5200_wdt.c +1
-1@@ -174,7 +174,7 @@ static int mpc5200_wdt_probe(struct of_dconst void *has_wdt;int size; - has_wdt =of_get_property (op->node,"has-wdt" ,NULL ); + has_wdt =of_get_property (op->node,"fsl,has-wdt" ,NULL );if (!has_wdt)return -ENODEV ;
Do this instead:
has_wdt = of_get_property(op->node, "has-wdt", NULL);
+ if (!has_wdt)
+ has_wdt = of_get_property(op->node, "fsl,has-wdt", NULL);
if (!has_wdt)
return -ENODEV;This will allow it to still work with older device trees.
drivers/char/watchdog/mpc5200_wdt.c static int mpc5200_wdt_shutdown(struct o · line 256
Quoted 7 lines
drivers/char/watchdog/mpc5200_wdt.c +1
-1@@ -253,7 +253,7 @@ static int mpc5200_wdt_shutdown(struct o }static struct of_device_id mpc5200_wdt_match[] = { - { .compatible ="mpc5200-gpt" , }, + { .compatible ="fsl,mpc5200-gpt" , },
Keep both the old and new in the match table for now for the same reason.
Otherwise, looks good. Thanks.
g.
Signature · 4 lines
Grant Likely, B.Sc., P.Eng. Secret Lab Technologies Ltd. [email protected] (403) 399-0195
PATCH 3/4 Add restart support for mpc52xx based platforms
In reply to Marian BalakowiczAdd common helper routines: mpc52xx_map_wdt() and mpc52xx_restart().
This patch relies on Sascha Hauer's patch published in:
http://patchwork.ozlabs.org/linuxppc/patch?id=8910.
---
arch/powerpc/platforms/52xx/mpc52xx_common.c | 45 +++++++++++++++++++++++++++ include/asm-powerpc/mpc52xx.h | 3 + 2 files changed, 48 insertions(+)
arch/powerpc/platforms/52xx/mpc52xx_common.c +45 -0
@@ -18,6 +18,13 @@ #include <asm/io.h>#include <asm/prom.h> #include <asm/mpc52xx.h> +/* +* This variable is mapped in mpc52xx_map_wdt() and used in mpc52xx_restart(). +* Permanent mapping is required because mpc52xx_restart() can be called +* from interrupt context while node mapping (which calls iorenmap()) +* cannot be used at such point. +*/ +static volatile struct mpc52xx_gpt *mpc52xx_wdt =NULL ;static void __iomem *mpc52xx_map_node (struct device_node *ofn)
@@ -126,3 +133,41 @@ mpc52xx_declare_of_platform_devices(void "Error while probing of_platform bus\n"); } +void __init +mpc52xx_map_wdt (void ) +{ +const void *has_wdt; +struct device_node *np; + +/* mpc52xx_wdt is mapped here and used in mpc52xx_restart, +* possibly from a interrupt context. */ + +for (np =NULL ; + (np =of_find_compatible_node (np,NULL ,"fsl,mpc5200-gpt" )) !=NULL ; + ) { +/* wdt is only implement on gpt0, check has-wdt property. */ + has_wdt =of_get_property (np,"fsl,has-wdt" ,NULL ); +if (has_wdt) { + mpc52xx_wdt =mpc52xx_map_node (np); +break ; + } + } +} + +void +mpc52xx_restart (char *cmd) +{ +local_irq_disable (); + +/* Turn on the watchdog and wait for it to expire. +* It effectively does a reset. */ +if (mpc52xx_wdt) { +out_be32 (&mpc52xx_wdt->mode,0x00000000 ); +out_be32 (&mpc52xx_wdt->count,0x000000ff ); +out_be32 (&mpc52xx_wdt->mode,0x00009004 ); + }else +printk ("mpc52xx_restart: Can't access wdt. " +"Restart impossible, system halted.\n" ); + +while (1 ); +}
include/asm-powerpc/mpc52xx.h +3 -0
@@ -252,6 +252,9 @@ extern unsigned int mpc52xx_get_irq(voidextern int __init mpc52xx_add_bridge (struct device_node *node); +extern void __init mpc52xx_map_wdt (void ); +extern void mpc52xx_restart (char *cmd); +#endif /* __ASSEMBLY__ */ #ifdef CONFIG_PM
Re: [PATCH 3/4] [POWERPC] Add restart support for mpc52xx based platforms
arch/powerpc/platforms/52xx/mpc52xx_common.c mpc52xx_declare_of_platform_devices(void · line 139
Quoted 5 lines · On Wed, 17 Oct 2007 15:01:28 +0200 Marian Balakowicz <[email protected]> wrote:
arch/powerpc/platforms/52xx/mpc52xx_common.c +4
-0+void __init +mpc52xx_map_wdt (void ) +{ +const void *has_wdt;
^^^^^^^^
white space damage
arch/powerpc/platforms/52xx/mpc52xx_common.c mpc52xx_declare_of_platform_devices(void · line 147
Quoted 8 lines
arch/powerpc/platforms/52xx/mpc52xx_common.c +8
-0+struct device_node *np; + +/* mpc52xx_wdt is mapped here and used in mpc52xx_restart, +* possibly from a interrupt context. */ + +for (np =NULL ; + (np =of_find_compatible_node (np,NULL ,"fsl,mpc5200-gpt" )) !=NULL ; + ) {
for_each_compatible_node(np, NULL, "fsl,mpc5200-gpt") {Signature · 3 lines
Cheers, Stephen Rothwell [email protected] http://www.canb.auug.org.au/~sfr/
Re: [PATCH 3/4] [POWERPC] Add restart support for mpc52xx based platforms
In reply to Marian BalakowiczQuoted 40 lines · Marian Balakowicz
Add common helper routines:
mpc52xx_map_wdt()andmpc52xx_restart().This patch relies on Sascha Hauer's patch published in:
http://patchwork.ozlabs.org/linuxppc/patch?id=8910.Signed-off-by Marian Balakowicz <[email protected]>Signed-off-by Sascha Hauer <[email protected]>---
arch/powerpc/platforms/52xx/mpc52xx_common.c | 45 +++++++++++++++++++++++++++ include/asm-powerpc/mpc52xx.h | 3 + 2 files changed, 48 insertions(+)arch/powerpc/platforms/52xx/mpc52xx_common.c +11
-0@@ -18,6 +18,13 @@ #include <asm/io.h>#include <asm/prom.h> #include <asm/mpc52xx.h> +/* +* This variable is mapped in mpc52xx_map_wdt() and used in mpc52xx_restart(). +* Permanent mapping is required because mpc52xx_restart() can be called +* from interrupt context while node mapping (which calls iorenmap()) +* cannot be used at such point. +*/ +static volatile struct mpc52xx_gpt *mpc52xx_wdt =NULL ;static void __iomem *mpc52xx_map_node (struct device_node *ofn)@@ -126,3 +133,41 @@ mpc52xx_declare_of_platform_devices(void "Error while probing of_platform bus\n"); } +void __init +mpc52xx_map_wdt (void ) +{ +const void *has_wdt;
arch/powerpc/platforms/52xx/mpc52xx_common.c mpc52xx_declare_of_platform_devices(void · line 149
Quoted 10 lines
arch/powerpc/platforms/52xx/mpc52xx_common.c +10
-0+struct device_node *np; + +/* mpc52xx_wdt is mapped here and used in mpc52xx_restart, +* possibly from a interrupt context. */ + +for (np =NULL ; + (np =of_find_compatible_node (np,NULL ,"fsl,mpc5200-gpt" )) !=NULL ; + ) { +/* wdt is only implement on gpt0, check has-wdt property. */ + has_wdt =of_get_property (np,"fsl,has-wdt" ,NULL );
Test for both "has-wdt" and "fsl,has-wdt" for now.
Otherwise, looks good.
Cheers,
g.
Signature · 4 lines
Grant Likely, B.Sc., P.Eng. Secret Lab Technologies Ltd. [email protected] (403) 399-0195
PATCH 4/4 Enable restart support for lite5200 board
In reply to Marian Balakowicz---
lite5200.c | 4 ++++ 1 file changed, 4 insertions(+)
arch/powerpc/platforms/52xx/lite5200.c +4 -0
@@ -143,6 +143,9 @@ #endif/* Some mpc5200 & mpc5200b related configuration */ mpc5200_setup_xlb_arbiter (); +/* Map wdt for mpc52xx_restart() */ +mpc52xx_map_wdt (); +#ifdef CONFIG_PM mpc52xx_suspend.board_suspend_prepare = lite5200_suspend_prepare; mpc52xx_suspend.board_resume_finish = lite5200_resume_finish;
@@ -193,5 +196,6 @@ define_machine(lite5200) { .init = mpc52xx_declare_of_platform_devices, .init_IRQ = mpc52xx_init_irq, .get_irq = mpc52xx_get_irq, + .restart = mpc52xx_restart, .calibrate_decr = generic_calibrate_decr, };
Re: [PATCH 4/4] [POWERPC] Enable restart support for lite5200 board
Quoted 2 lines · Marian Balakowicz
Signed-off-by Marian Balakowicz <[email protected]>
Looks good; I'll pick this one up when you respin the others.
Cheers,
g.
Signature · 4 lines
Grant Likely, B.Sc., P.Eng. Secret Lab Technologies Ltd. [email protected] (403) 399-0195