aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/sysdev/commproc.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/powerpc/sysdev/commproc.c')
-rw-r--r--arch/powerpc/sysdev/commproc.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/arch/powerpc/sysdev/commproc.c b/arch/powerpc/sysdev/commproc.c
index 74d937249348..621bc6c1d408 100644
--- a/arch/powerpc/sysdev/commproc.c
+++ b/arch/powerpc/sysdev/commproc.c
@@ -240,6 +240,34 @@ void __init cpm_reset(void)
240#endif 240#endif
241} 241}
242 242
243static DEFINE_SPINLOCK(cmd_lock);
244
245#define MAX_CR_CMD_LOOPS 10000
246
247int cpm_command(u32 command, u8 opcode)
248{
249 int i, ret;
250 unsigned long flags;
251
252 if (command & 0xffffff0f)
253 return -EINVAL;
254
255 spin_lock_irqsave(&cmd_lock, flags);
256
257 ret = 0;
258 out_be16(&cpmp->cp_cpcr, command | CPM_CR_FLG | (opcode << 8));
259 for (i = 0; i < MAX_CR_CMD_LOOPS; i++)
260 if ((in_be16(&cpmp->cp_cpcr) & CPM_CR_FLG) == 0)
261 goto out;
262
263 printk(KERN_ERR "%s(): Not able to issue CPM command\n", __FUNCTION__);
264 ret = -EIO;
265out:
266 spin_unlock_irqrestore(&cmd_lock, flags);
267 return ret;
268}
269EXPORT_SYMBOL(cpm_command);
270
243/* We used to do this earlier, but have to postpone as long as possible 271/* We used to do this earlier, but have to postpone as long as possible
244 * to ensure the kernel VM is now running. 272 * to ensure the kernel VM is now running.
245 */ 273 */