static int sa_sync_cmd(struct aac_dev *dev, u32 command, u32 p1, u32 *ret) { unsigned long start; int ok; /* * Write the Command into Mailbox 0 */ sa_writel(dev, Mailbox0, cpu_to_le32(command)); /* * Write the parameters into Mailboxes 1 - 4 */ sa_writel(dev, Mailbox1, cpu_to_le32(p1)); sa_writel(dev, Mailbox2, 0); sa_writel(dev, Mailbox3, 0); sa_writel(dev, Mailbox4, 0); /* * Clear the synch command doorbell to start on a clean slate. */ sa_writew(dev, DoorbellClrReg_p, DOORBELL_0); /* * Signal that there is a new synch command */ sa_writew(dev, DoorbellReg_s, DOORBELL_0); ok = 0; start = jiffies; while(time_before(jiffies, start+30*HZ)) { /* * Delay 5uS so that the monitor gets access */ udelay(5); /* * Mon110 will set doorbell0 bit when it has * completed the command. */ if(sa_readw(dev, DoorbellReg_p) & DOORBELL_0) { ok = 1; break; } set_current_state(TASK_UNINTERRUPTIBLE); schedule_timeout(1); } if (ok != 1) return -ETIMEDOUT; /* * Clear the synch command doorbell. */ sa_writew(dev, DoorbellClrReg_p, DOORBELL_0); /* * Pull the synch status from Mailbox 0. */ *ret = le32_to_cpu(sa_readl(dev, Mailbox0)); return 0; }
static int sa_sync_cmd(struct aac_dev *dev, u32 command, u32 p1, u32 p2, u32 p3, u32 p4, u32 p5, u32 p6, u32 *ret, u32 *r1, u32 *r2, u32 *r3, u32 *r4) { unsigned long start; int ok; sa_writel(dev, Mailbox0, command); sa_writel(dev, Mailbox1, p1); sa_writel(dev, Mailbox2, p2); sa_writel(dev, Mailbox3, p3); sa_writel(dev, Mailbox4, p4); sa_writew(dev, DoorbellClrReg_p, DOORBELL_0); sa_writew(dev, DoorbellReg_s, DOORBELL_0); ok = 0; start = jiffies; while(time_before(jiffies, start+30*HZ)) { udelay(5); if(sa_readw(dev, DoorbellReg_p) & DOORBELL_0) { ok = 1; break; } msleep(1); } if (ok != 1) return -ETIMEDOUT; sa_writew(dev, DoorbellClrReg_p, DOORBELL_0); if (ret) *ret = sa_readl(dev, Mailbox0); if (r1) *r1 = sa_readl(dev, Mailbox1); if (r2) *r2 = sa_readl(dev, Mailbox2); if (r3) *r3 = sa_readl(dev, Mailbox3); if (r4) *r4 = sa_readl(dev, Mailbox4); return 0; }
static int sa_sync_cmd(struct aac_dev *dev, u32 command, u32 p1, u32 p2, u32 p3, u32 p4, u32 p5, u32 p6, u32 *ret, u32 *r1, u32 *r2, u32 *r3, u32 *r4) { unsigned long start; int ok; /* * Write the Command into Mailbox 0 */ sa_writel(dev, Mailbox0, command); /* * Write the parameters into Mailboxes 1 - 4 */ sa_writel(dev, Mailbox1, p1); sa_writel(dev, Mailbox2, p2); sa_writel(dev, Mailbox3, p3); sa_writel(dev, Mailbox4, p4); /* * Clear the synch command doorbell to start on a clean slate. */ sa_writew(dev, DoorbellClrReg_p, DOORBELL_0); /* * Signal that there is a new synch command */ sa_writew(dev, DoorbellReg_s, DOORBELL_0); ok = 0; start = jiffies; while(time_before(jiffies, start+30*HZ)) { /* * Delay 5uS so that the monitor gets access */ udelay(5); /* * Mon110 will set doorbell0 bit when it has * completed the command. */ if(sa_readw(dev, DoorbellReg_p) & DOORBELL_0) { ok = 1; break; } msleep(1); } if (ok != 1) return -ETIMEDOUT; /* * Clear the synch command doorbell. */ sa_writew(dev, DoorbellClrReg_p, DOORBELL_0); /* * Pull the synch status from Mailbox 0. */ if (ret) *ret = sa_readl(dev, Mailbox0); if (r1) *r1 = sa_readl(dev, Mailbox1); if (r2) *r2 = sa_readl(dev, Mailbox2); if (r3) *r3 = sa_readl(dev, Mailbox3); if (r4) *r4 = sa_readl(dev, Mailbox4); return 0; }