Re: [PATCH 12/15] [POWERPC] Add mpc52xx_restart(), mpc52xx_halt(), mpc52xx_power_off().

2007-10-08 Thread Grant Likely
On 10/7/07, Marian Balakowicz [EMAIL PROTECTED] wrote:

 Add common MPC5200 helper routines: mpc52xx_restart(), mpc52xx_halt(),
 mpc52xx_power_off().

 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|7 
  2 files changed, 52 insertions(+)

 diff --git a/arch/powerpc/platforms/52xx/mpc52xx_common.c 
 b/arch/powerpc/platforms/52xx/mpc52xx_common.c
 index b1cd7b0..e7087d7 100644
 --- a/arch/powerpc/platforms/52xx/mpc52xx_common.c
 +++ b/arch/powerpc/platforms/52xx/mpc52xx_common.c
 @@ -88,6 +88,14 @@ mpc52xx_find_ipb_freq(struct device_node *node)
  }
  EXPORT_SYMBOL(mpc52xx_find_ipb_freq);

 +/*
 + * This variable is mapped in mpc52xx_setup_cpu() by a call to
 + * mpc52xx_find_and_map(), and used in mpc52xx_restart(). This is because
 + * mpc52xx_restart() can be called from interrupt context (e.g., watchdog
 + * interrupt handler), and mpc52xx_find_and_map() (ioremap() to be exact)
 + * can't be called from interrupt context.
 + */
 +volatile struct mpc52xx_gpt *mpc52xx_gpt0 = NULL;

  void __init
  mpc52xx_setup_cpu(void)
 @@ -95,6 +103,9 @@ mpc52xx_setup_cpu(void)
 struct mpc52xx_cdm  __iomem *cdm;
 struct mpc52xx_xlb  __iomem *xlb;

 +   /* mpc52xx_gpt0 is mapped here and used in mpc52xx_restart */
 +   mpc52xx_gpt0 = mpc52xx_find_and_map(mpc5200-gpt);
 +
 /* Map zones */
 cdm = mpc52xx_find_and_map(mpc5200-cdm);
 xlb = mpc52xx_find_and_map(mpc5200-xlb);
 @@ -138,3 +149,37 @@ mpc52xx_declare_of_platform_devices(void)
 Error while probing of_platform bus\n);
  }

 +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_gpt0) {
 +   out_be32(mpc52xx_gpt0-mode, 0x);
 +   out_be32(mpc52xx_gpt0-count, 0x00ff);
 +   out_be32(mpc52xx_gpt0-mode, 0x9004);
 +   } else
 +   printk(mpc52xx_restart: Can't access gpt. 
 +   Restart impossible, system halted\n);
 +
 +   while (1);
 +}
 +
 +void
 +mpc52xx_halt(void)
 +{
 +   local_irq_disable();
 +
 +   while (1);
 +}
 +
 +void
 +mpc52xx_power_off(void)
 +{
 +   /* By default we don't have any way of shut down.
 +  If a specific board wants to, it can set the power down
 +  code to any hardware implementation dependent code */
 +   mpc52xx_halt();
 +}
 diff --git a/include/asm-powerpc/mpc52xx.h b/include/asm-powerpc/mpc52xx.h
 index a431798..8dfb4de 100644
 --- a/include/asm-powerpc/mpc52xx.h
 +++ b/include/asm-powerpc/mpc52xx.h
 @@ -104,6 +104,9 @@ struct mpc52xx_gpt {
 u32 status; /* GPTx + 0X0c */
  };

 +/* Static instance of GPT0 */
 +extern volatile struct mpc52xx_gpt *mpc52xx_gpt0;
 +

No; don't make this a global symbol.  Restrict it to the
mpc52xx_common file.  Use a helper function if you need to too set the
value.

  /* GPIO */
  struct mpc52xx_gpio {
 u32 port_config;/* GPIO + 0x00 */
 @@ -257,6 +260,10 @@ extern unsigned int mpc52xx_get_irq(void);

  extern int __init mpc52xx_add_bridge(struct device_node *node);

 +extern void mpc52xx_restart(char *cmd);
 +extern void mpc52xx_halt(void);
 +extern void mpc52xx_power_off(void);
 +
  #endif /* __ASSEMBLY__ */

  #ifdef CONFIG_PM


 ___
 Linuxppc-dev mailing list
 Linuxppc-dev@ozlabs.org
 https://ozlabs.org/mailman/listinfo/linuxppc-dev



-- 
Grant Likely, B.Sc., P.Eng.
Secret Lab Technologies Ltd.
[EMAIL PROTECTED]
(403) 399-0195
___
Linuxppc-dev mailing list
Linuxppc-dev@ozlabs.org
https://ozlabs.org/mailman/listinfo/linuxppc-dev


[PATCH 12/15] [POWERPC] Add mpc52xx_restart(), mpc52xx_halt(), mpc52xx_power_off().

2007-10-07 Thread Marian Balakowicz

Add common MPC5200 helper routines: mpc52xx_restart(), mpc52xx_halt(),
mpc52xx_power_off().

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|7 
 2 files changed, 52 insertions(+)

diff --git a/arch/powerpc/platforms/52xx/mpc52xx_common.c 
b/arch/powerpc/platforms/52xx/mpc52xx_common.c
index b1cd7b0..e7087d7 100644
--- a/arch/powerpc/platforms/52xx/mpc52xx_common.c
+++ b/arch/powerpc/platforms/52xx/mpc52xx_common.c
@@ -88,6 +88,14 @@ mpc52xx_find_ipb_freq(struct device_node *node)
 }
 EXPORT_SYMBOL(mpc52xx_find_ipb_freq);
 
+/*
+ * This variable is mapped in mpc52xx_setup_cpu() by a call to
+ * mpc52xx_find_and_map(), and used in mpc52xx_restart(). This is because
+ * mpc52xx_restart() can be called from interrupt context (e.g., watchdog
+ * interrupt handler), and mpc52xx_find_and_map() (ioremap() to be exact)
+ * can't be called from interrupt context.
+ */
+volatile struct mpc52xx_gpt *mpc52xx_gpt0 = NULL;
 
 void __init
 mpc52xx_setup_cpu(void)
@@ -95,6 +103,9 @@ mpc52xx_setup_cpu(void)
struct mpc52xx_cdm  __iomem *cdm;
struct mpc52xx_xlb  __iomem *xlb;
 
+   /* mpc52xx_gpt0 is mapped here and used in mpc52xx_restart */
+   mpc52xx_gpt0 = mpc52xx_find_and_map(mpc5200-gpt);
+
/* Map zones */
cdm = mpc52xx_find_and_map(mpc5200-cdm);
xlb = mpc52xx_find_and_map(mpc5200-xlb);
@@ -138,3 +149,37 @@ mpc52xx_declare_of_platform_devices(void)
Error while probing of_platform bus\n);
 }
 
+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_gpt0) {
+   out_be32(mpc52xx_gpt0-mode, 0x);
+   out_be32(mpc52xx_gpt0-count, 0x00ff);
+   out_be32(mpc52xx_gpt0-mode, 0x9004);
+   } else
+   printk(mpc52xx_restart: Can't access gpt. 
+   Restart impossible, system halted\n);
+
+   while (1);
+}
+
+void
+mpc52xx_halt(void)
+{
+   local_irq_disable();
+
+   while (1);
+}
+
+void
+mpc52xx_power_off(void)
+{
+   /* By default we don't have any way of shut down.
+  If a specific board wants to, it can set the power down
+  code to any hardware implementation dependent code */
+   mpc52xx_halt();
+}
diff --git a/include/asm-powerpc/mpc52xx.h b/include/asm-powerpc/mpc52xx.h
index a431798..8dfb4de 100644
--- a/include/asm-powerpc/mpc52xx.h
+++ b/include/asm-powerpc/mpc52xx.h
@@ -104,6 +104,9 @@ struct mpc52xx_gpt {
u32 status; /* GPTx + 0X0c */
 };
 
+/* Static instance of GPT0 */
+extern volatile struct mpc52xx_gpt *mpc52xx_gpt0;
+
 /* GPIO */
 struct mpc52xx_gpio {
u32 port_config;/* GPIO + 0x00 */
@@ -257,6 +260,10 @@ extern unsigned int mpc52xx_get_irq(void);
 
 extern int __init mpc52xx_add_bridge(struct device_node *node);
 
+extern void mpc52xx_restart(char *cmd);
+extern void mpc52xx_halt(void);
+extern void mpc52xx_power_off(void);
+
 #endif /* __ASSEMBLY__ */
 
 #ifdef CONFIG_PM


___
Linuxppc-dev mailing list
Linuxppc-dev@ozlabs.org
https://ozlabs.org/mailman/listinfo/linuxppc-dev