<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
<META NAME="Generator" CONTENT="MS Exchange Server version 6.5.7654.12">
<TITLE>RE: [PATCH 1/5] powerpc/qe: Make qe_reset() code path safe for repeated invocation</TITLE>
</HEAD>
<BODY>
<!-- Converted from text/plain format -->

<P><FONT SIZE=2>Is the need to reinitialize the QE after resume something that is unique to the 8569, or would it apply to the 8360 and 8323 also?<BR>
<BR>
<BR>
-----Original Message-----<BR>
From: Anton Vorontsov [<A HREF="mailto:avorontsov@ru.mvista.com">mailto:avorontsov@ru.mvista.com</A>]<BR>
Sent: Sun 8/30/2009 2:37 PM<BR>
To: Kumar Gala<BR>
Cc: Tabi Timur-B04825; Wood Scott-B07421; linuxppc-dev@ozlabs.org<BR>
Subject: [PATCH 1/5] powerpc/qe: Make qe_reset() code path safe for repeated invocation<BR>
<BR>
For MPC8569 CPUs we'll need to reset QE after each suspend, so make<BR>
qe_reset() code path suitable for repeated invocation, that is:<BR>
<BR>
- Don't initialize rheap structures if already initialized;<BR>
- Don't allocate muram for SDMA if already allocated, just reinitialize<BR>
&nbsp; registers with previously allocated muram offset;<BR>
- Remove __init attributes from qe_reset() and cpm_muram_init();<BR>
<BR>
Signed-off-by: Anton Vorontsov &lt;avorontsov@ru.mvista.com&gt;<BR>
---<BR>
&nbsp;arch/powerpc/include/asm/qe.h&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp; 2 +-<BR>
&nbsp;arch/powerpc/sysdev/cpm_common.c |&nbsp;&nbsp;&nbsp; 5 ++++-<BR>
&nbsp;arch/powerpc/sysdev/qe_lib/qe.c&nbsp; |&nbsp;&nbsp; 12 +++++++-----<BR>
&nbsp;3 files changed, 12 insertions(+), 7 deletions(-)<BR>
<BR>
diff --git a/arch/powerpc/include/asm/qe.h b/arch/powerpc/include/asm/qe.h<BR>
index e8232bb..2f44754 100644<BR>
--- a/arch/powerpc/include/asm/qe.h<BR>
+++ b/arch/powerpc/include/asm/qe.h<BR>
@@ -87,7 +87,7 @@ extern spinlock_t cmxgcr_lock;<BR>
<BR>
&nbsp;/* Export QE common operations */<BR>
&nbsp;#ifdef CONFIG_QUICC_ENGINE<BR>
-extern void __init qe_reset(void);<BR>
+extern void qe_reset(void);<BR>
&nbsp;#else<BR>
&nbsp;static inline void qe_reset(void) {}<BR>
&nbsp;#endif<BR>
diff --git a/arch/powerpc/sysdev/cpm_common.c b/arch/powerpc/sysdev/cpm_common.c<BR>
index e4b6d66..9de72c9 100644<BR>
--- a/arch/powerpc/sysdev/cpm_common.c<BR>
+++ b/arch/powerpc/sysdev/cpm_common.c<BR>
@@ -72,7 +72,7 @@ static phys_addr_t muram_pbase;<BR>
&nbsp;/* Max address size we deal with */<BR>
&nbsp;#define OF_MAX_ADDR_CELLS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4<BR>
<BR>
-int __init cpm_muram_init(void)<BR>
+int cpm_muram_init(void)<BR>
&nbsp;{<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; struct device_node *np;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; struct resource r;<BR>
@@ -81,6 +81,9 @@ int __init cpm_muram_init(void)<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int i = 0;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int ret = 0;<BR>
<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (muram_pbase)<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;<BR>
+<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; spin_lock_init(&amp;cpm_muram_lock);<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* initialize the info header */<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rh_init(&amp;cpm_muram_info, 1,<BR>
diff --git a/arch/powerpc/sysdev/qe_lib/qe.c b/arch/powerpc/sysdev/qe_lib/qe.c<BR>
index b06564f..4eaf2a9 100644<BR>
--- a/arch/powerpc/sysdev/qe_lib/qe.c<BR>
+++ b/arch/powerpc/sysdev/qe_lib/qe.c<BR>
@@ -91,7 +91,7 @@ phys_addr_t get_qe_base(void)<BR>
<BR>
&nbsp;EXPORT_SYMBOL(get_qe_base);<BR>
<BR>
-void __init qe_reset(void)<BR>
+void qe_reset(void)<BR>
&nbsp;{<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (qe_immr == NULL)<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; qe_immr = ioremap(get_qe_base(), QE_IMMAP_SIZE);<BR>
@@ -317,16 +317,18 @@ EXPORT_SYMBOL(qe_put_snum);<BR>
&nbsp;static int qe_sdma_init(void)<BR>
&nbsp;{<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; struct sdma __iomem *sdma = &amp;qe_immr-&gt;sdma;<BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unsigned long sdma_buf_offset;<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; static unsigned long sdma_buf_offset = (unsigned long)-ENOMEM;<BR>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!sdma)<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -ENODEV;<BR>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* allocate 2 internal temporary buffers (512 bytes size each) for<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * the SDMA */<BR>
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sdma_buf_offset = qe_muram_alloc(512 * 2, 4096);<BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (IS_ERR_VALUE(sdma_buf_offset))<BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -ENOMEM;<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (IS_ERR_VALUE(sdma_buf_offset)) {<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sdma_buf_offset = qe_muram_alloc(512 * 2, 4096);<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (IS_ERR_VALUE(sdma_buf_offset))<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -ENOMEM;<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out_be32(&amp;sdma-&gt;sdebcr, (u32) sdma_buf_offset &amp; QE_SDEBCR_BA_MASK);<BR>
&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out_be32(&amp;sdma-&gt;sdmr, (QE_SDMR_GLB_1_MSK |<BR>
--<BR>
1.6.3.3<BR>
<BR>
<BR>
<BR>
</FONT>
</P>

</BODY>
</HTML>