Skip to content

Commit

Permalink
powerpc/qe: Make qe_reset() code path safe for repeated invocation
Browse files Browse the repository at this point in the history
For MPC8569 CPUs we'll need to reset QE after each suspend, so make
qe_reset() code path suitable for repeated invocation, that is:

- Don't initialize rheap structures if already initialized;
- Don't allocate muram for SDMA if already allocated, just reinitialize
  registers with previously allocated muram offset;
- Remove __init attributes from qe_reset() and cpm_muram_init();

Signed-off-by: Anton Vorontsov <avorontsov@ru.mvista.com>
Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
  • Loading branch information
Anton Vorontsov authored and Kumar Gala committed Nov 12, 2009
1 parent dc2e673 commit 0c7b87b
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 7 deletions.
2 changes: 1 addition & 1 deletion arch/powerpc/include/asm/qe.h
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ extern spinlock_t cmxgcr_lock;

/* Export QE common operations */
#ifdef CONFIG_QUICC_ENGINE
extern void __init qe_reset(void);
extern void qe_reset(void);
#else
static inline void qe_reset(void) {}
#endif
Expand Down
5 changes: 4 additions & 1 deletion arch/powerpc/sysdev/cpm_common.c
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ static phys_addr_t muram_pbase;
/* Max address size we deal with */
#define OF_MAX_ADDR_CELLS 4

int __init cpm_muram_init(void)
int cpm_muram_init(void)
{
struct device_node *np;
struct resource r;
Expand All @@ -81,6 +81,9 @@ int __init cpm_muram_init(void)
int i = 0;
int ret = 0;

if (muram_pbase)
return 0;

spin_lock_init(&cpm_muram_lock);
/* initialize the info header */
rh_init(&cpm_muram_info, 1,
Expand Down
12 changes: 7 additions & 5 deletions arch/powerpc/sysdev/qe_lib/qe.c
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ phys_addr_t get_qe_base(void)

EXPORT_SYMBOL(get_qe_base);

void __init qe_reset(void)
void qe_reset(void)
{
if (qe_immr == NULL)
qe_immr = ioremap(get_qe_base(), QE_IMMAP_SIZE);
Expand Down Expand Up @@ -330,16 +330,18 @@ EXPORT_SYMBOL(qe_put_snum);
static int qe_sdma_init(void)
{
struct sdma __iomem *sdma = &qe_immr->sdma;
unsigned long sdma_buf_offset;
static unsigned long sdma_buf_offset = (unsigned long)-ENOMEM;

if (!sdma)
return -ENODEV;

/* allocate 2 internal temporary buffers (512 bytes size each) for
* the SDMA */
sdma_buf_offset = qe_muram_alloc(512 * 2, 4096);
if (IS_ERR_VALUE(sdma_buf_offset))
return -ENOMEM;
if (IS_ERR_VALUE(sdma_buf_offset)) {
sdma_buf_offset = qe_muram_alloc(512 * 2, 4096);
if (IS_ERR_VALUE(sdma_buf_offset))
return -ENOMEM;
}

out_be32(&sdma->sdebcr, (u32) sdma_buf_offset & QE_SDEBCR_BA_MASK);
out_be32(&sdma->sdmr, (QE_SDMR_GLB_1_MSK |
Expand Down

0 comments on commit 0c7b87b

Please sign in to comment.