aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/sysdev/cpm2_common.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/powerpc/sysdev/cpm2_common.c')
-rw-r--r--arch/powerpc/sysdev/cpm2_common.c25
1 files changed, 25 insertions, 0 deletions
diff --git a/arch/powerpc/sysdev/cpm2_common.c b/arch/powerpc/sysdev/cpm2_common.c
index 859362fecb7c..0a7054579d98 100644
--- a/arch/powerpc/sysdev/cpm2_common.c
+++ b/arch/powerpc/sysdev/cpm2_common.c
@@ -83,6 +83,31 @@ cpm2_reset(void)
83 cpmp = &cpm2_immr->im_cpm; 83 cpmp = &cpm2_immr->im_cpm;
84} 84}
85 85
86static DEFINE_SPINLOCK(cmd_lock);
87
88#define MAX_CR_CMD_LOOPS 10000
89
90int cpm_command(u32 command, u8 opcode)
91{
92 int i, ret;
93 unsigned long flags;
94
95 spin_lock_irqsave(&cmd_lock, flags);
96
97 ret = 0;
98 out_be32(&cpmp->cp_cpcr, command | opcode | CPM_CR_FLG);
99 for (i = 0; i < MAX_CR_CMD_LOOPS; i++)
100 if ((in_be32(&cpmp->cp_cpcr) & CPM_CR_FLG) == 0)
101 goto out;
102
103 printk(KERN_ERR "%s(): Not able to issue CPM command\n", __FUNCTION__);
104 ret = -EIO;
105out:
106 spin_unlock_irqrestore(&cmd_lock, flags);
107 return ret;
108}
109EXPORT_SYMBOL(cpm_command);
110
86/* Set a baud rate generator. This needs lots of work. There are 111/* Set a baud rate generator. This needs lots of work. There are
87 * eight BRGs, which can be connected to the CPM channels or output 112 * eight BRGs, which can be connected to the CPM channels or output
88 * as clocks. The BRGs are in two different block of internal 113 * as clocks. The BRGs are in two different block of internal