Lines Matching refs:dbri
570 #define DBRI_STREAM(dbri, substream) \ argument
571 &dbri->stream_info[DBRI_STREAMNO(substream)]
634 static void dbri_cmdwait(struct snd_dbri *dbri) in dbri_cmdwait() argument
640 spin_lock_irqsave(&dbri->lock, flags); in dbri_cmdwait()
641 while ((--maxloops) > 0 && (sbus_readl(dbri->regs + REG0) & D_P)) { in dbri_cmdwait()
642 spin_unlock_irqrestore(&dbri->lock, flags); in dbri_cmdwait()
644 spin_lock_irqsave(&dbri->lock, flags); in dbri_cmdwait()
646 spin_unlock_irqrestore(&dbri->lock, flags); in dbri_cmdwait()
658 static s32 *dbri_cmdlock(struct snd_dbri *dbri, int len) in dbri_cmdlock() argument
662 spin_lock(&dbri->cmdlock); in dbri_cmdlock()
663 if (dbri->cmdptr - dbri->dma->cmd + len < DBRI_NO_CMDS - 2) in dbri_cmdlock()
664 return dbri->cmdptr + 2; in dbri_cmdlock()
665 else if (len < sbus_readl(dbri->regs + REG8) - dbri->dma_dvma) in dbri_cmdlock()
666 return dbri->dma->cmd; in dbri_cmdlock()
681 static void dbri_cmdsend(struct snd_dbri *dbri, s32 *cmd, int len) in dbri_cmdsend() argument
692 addr = dbri->dma_dvma + (cmd - len - dbri->dma->cmd) * sizeof(s32); in dbri_cmdsend()
693 *(dbri->cmdptr+1) = addr; in dbri_cmdsend()
694 *(dbri->cmdptr) = DBRI_CMD(D_JUMP, 0, 0); in dbri_cmdsend()
697 if (cmd > dbri->cmdptr) { in dbri_cmdsend()
700 for (ptr = dbri->cmdptr; ptr < cmd+2; ptr++) in dbri_cmdsend()
704 s32 *ptr = dbri->cmdptr; in dbri_cmdsend()
709 for (ptr = dbri->dma->cmd; ptr < cmd+2; ptr++) in dbri_cmdsend()
716 tmp = sbus_readl(dbri->regs + REG0); in dbri_cmdsend()
718 sbus_writel(tmp, dbri->regs + REG0); in dbri_cmdsend()
720 dbri->cmdptr = cmd; in dbri_cmdsend()
721 spin_unlock(&dbri->cmdlock); in dbri_cmdsend()
725 static void dbri_reset(struct snd_dbri *dbri) in dbri_reset() argument
731 sbus_readl(dbri->regs + REG0), in dbri_reset()
732 sbus_readl(dbri->regs + REG2), in dbri_reset()
733 sbus_readl(dbri->regs + REG8), sbus_readl(dbri->regs + REG9)); in dbri_reset()
735 sbus_writel(D_R, dbri->regs + REG0); /* Soft Reset */ in dbri_reset()
736 for (i = 0; (sbus_readl(dbri->regs + REG0) & D_R) && i < 64; i++) in dbri_reset()
741 tmp = sbus_readl(dbri->regs + REG0); in dbri_reset()
744 sbus_writel(tmp, dbri->regs + REG0); in dbri_reset()
748 static void dbri_initialize(struct snd_dbri *dbri) in dbri_initialize() argument
755 spin_lock_irqsave(&dbri->lock, flags); in dbri_initialize()
757 dbri_reset(dbri); in dbri_initialize()
761 dbri->pipes[n].desc = dbri->pipes[n].first_desc = -1; in dbri_initialize()
763 spin_lock_init(&dbri->cmdlock); in dbri_initialize()
767 dma_addr = dbri->dma_dvma + dbri_dma_off(intr, 0); in dbri_initialize()
768 dbri->dma->intr[0] = dma_addr; in dbri_initialize()
769 dbri->dbri_irqp = 1; in dbri_initialize()
773 spin_lock(&dbri->cmdlock); in dbri_initialize()
774 cmd = dbri->cmdptr = dbri->dma->cmd; in dbri_initialize()
778 dbri->cmdptr = cmd; in dbri_initialize()
781 dma_addr = dbri->dma_dvma + dbri_dma_off(cmd, 0); in dbri_initialize()
782 sbus_writel(dma_addr, dbri->regs + REG8); in dbri_initialize()
783 spin_unlock(&dbri->cmdlock); in dbri_initialize()
785 spin_unlock_irqrestore(&dbri->lock, flags); in dbri_initialize()
786 dbri_cmdwait(dbri); in dbri_initialize()
803 static inline int pipe_active(struct snd_dbri *dbri, int pipe) in pipe_active() argument
805 return ((pipe >= 0) && (dbri->pipes[pipe].desc != -1)); in pipe_active()
813 static void reset_pipe(struct snd_dbri *dbri, int pipe) in reset_pipe() argument
825 sdp = dbri->pipes[pipe].sdp; in reset_pipe()
832 cmd = dbri_cmdlock(dbri, 3); in reset_pipe()
836 dbri_cmdsend(dbri, cmd, 3); in reset_pipe()
838 desc = dbri->pipes[pipe].first_desc; in reset_pipe()
841 dbri->dma->desc[desc].ba = 0; in reset_pipe()
842 dbri->dma->desc[desc].nda = 0; in reset_pipe()
843 desc = dbri->next_desc[desc]; in reset_pipe()
844 } while (desc != -1 && desc != dbri->pipes[pipe].first_desc); in reset_pipe()
846 dbri->pipes[pipe].desc = -1; in reset_pipe()
847 dbri->pipes[pipe].first_desc = -1; in reset_pipe()
853 static void setup_pipe(struct snd_dbri *dbri, int pipe, int sdp) in setup_pipe() argument
874 dbri->pipes[pipe].sdp = sdp; in setup_pipe()
875 dbri->pipes[pipe].desc = -1; in setup_pipe()
876 dbri->pipes[pipe].first_desc = -1; in setup_pipe()
878 reset_pipe(dbri, pipe); in setup_pipe()
884 static void link_time_slot(struct snd_dbri *dbri, int pipe, in link_time_slot() argument
899 if (dbri->pipes[pipe].sdp == 0 in link_time_slot()
900 || dbri->pipes[prevpipe].sdp == 0 in link_time_slot()
901 || dbri->pipes[nextpipe].sdp == 0) { in link_time_slot()
907 dbri->pipes[prevpipe].nextpipe = pipe; in link_time_slot()
908 dbri->pipes[pipe].nextpipe = nextpipe; in link_time_slot()
909 dbri->pipes[pipe].length = length; in link_time_slot()
911 cmd = dbri_cmdlock(dbri, 4); in link_time_slot()
913 if (dbri->pipes[pipe].sdp & D_SDP_TO_SER) { in link_time_slot()
920 cycle = dbri->chi_bpf; in link_time_slot()
936 dbri_cmdsend(dbri, cmd, 4); in link_time_slot()
943 static void unlink_time_slot(struct snd_dbri *dbri, int pipe,
958 cmd = dbri_cmdlock(dbri, 4);
973 dbri_cmdsend(dbri, cmd, 4);
993 static void xmit_fixed(struct snd_dbri *dbri, int pipe, unsigned int data) in xmit_fixed() argument
1003 if (D_SDP_MODE(dbri->pipes[pipe].sdp) == 0) { in xmit_fixed()
1009 if (D_SDP_MODE(dbri->pipes[pipe].sdp) != D_SDP_FIXED) { in xmit_fixed()
1014 if (!(dbri->pipes[pipe].sdp & D_SDP_TO_SER)) { in xmit_fixed()
1022 if (dbri->pipes[pipe].sdp & D_SDP_MSB) in xmit_fixed()
1023 data = reverse_bytes(data, dbri->pipes[pipe].length); in xmit_fixed()
1025 cmd = dbri_cmdlock(dbri, 3); in xmit_fixed()
1031 spin_lock_irqsave(&dbri->lock, flags); in xmit_fixed()
1032 dbri_cmdsend(dbri, cmd, 3); in xmit_fixed()
1033 spin_unlock_irqrestore(&dbri->lock, flags); in xmit_fixed()
1034 dbri_cmdwait(dbri); in xmit_fixed()
1038 static void recv_fixed(struct snd_dbri *dbri, int pipe, volatile __u32 *ptr) in recv_fixed() argument
1046 if (D_SDP_MODE(dbri->pipes[pipe].sdp) != D_SDP_FIXED) { in recv_fixed()
1052 if (dbri->pipes[pipe].sdp & D_SDP_TO_SER) { in recv_fixed()
1058 dbri->pipes[pipe].recv_fixed_ptr = ptr; in recv_fixed()
1077 static int setup_descs(struct snd_dbri *dbri, int streamno, unsigned int period) in setup_descs() argument
1079 struct dbri_streaminfo *info = &dbri->stream_info[streamno]; in setup_descs()
1091 if (dbri->pipes[info->pipe].sdp == 0) { in setup_descs()
1101 if (!(dbri->pipes[info->pipe].sdp & D_SDP_TO_SER)) { in setup_descs()
1107 if (dbri->pipes[info->pipe].sdp & D_SDP_TO_SER) { in setup_descs()
1116 if (pipe_active(dbri, info->pipe)) { in setup_descs()
1127 desc = dbri->pipes[info->pipe].first_desc; in setup_descs()
1130 dbri->dma->desc[desc].ba = 0; in setup_descs()
1131 dbri->dma->desc[desc].nda = 0; in setup_descs()
1132 desc = dbri->next_desc[desc]; in setup_descs()
1134 desc != dbri->pipes[info->pipe].first_desc); in setup_descs()
1136 dbri->pipes[info->pipe].desc = -1; in setup_descs()
1137 dbri->pipes[info->pipe].first_desc = -1; in setup_descs()
1144 if (!dbri->dma->desc[desc].ba) in setup_descs()
1161 dbri->next_desc[desc] = -1; in setup_descs()
1162 dbri->dma->desc[desc].ba = dvma_buffer; in setup_descs()
1163 dbri->dma->desc[desc].nda = 0; in setup_descs()
1166 dbri->dma->desc[desc].word1 = DBRI_TD_CNT(mylen); in setup_descs()
1167 dbri->dma->desc[desc].word4 = 0; in setup_descs()
1168 dbri->dma->desc[desc].word1 |= DBRI_TD_F | DBRI_TD_B; in setup_descs()
1170 dbri->dma->desc[desc].word1 = 0; in setup_descs()
1171 dbri->dma->desc[desc].word4 = in setup_descs()
1178 dbri->next_desc[last_desc] = desc; in setup_descs()
1179 dbri->dma->desc[last_desc].nda = in setup_descs()
1180 dbri->dma_dvma + dbri_dma_off(desc, desc); in setup_descs()
1194 dbri->dma->desc[last_desc].nda = in setup_descs()
1195 dbri->dma_dvma + dbri_dma_off(desc, first_desc); in setup_descs()
1196 dbri->next_desc[last_desc] = first_desc; in setup_descs()
1197 dbri->pipes[info->pipe].first_desc = first_desc; in setup_descs()
1198 dbri->pipes[info->pipe].desc = first_desc; in setup_descs()
1204 dbri->dma->desc[desc].word1, in setup_descs()
1205 dbri->dma->desc[desc].ba, in setup_descs()
1206 dbri->dma->desc[desc].nda, dbri->dma->desc[desc].word4); in setup_descs()
1207 desc = dbri->next_desc[desc]; in setup_descs()
1231 static void reset_chi(struct snd_dbri *dbri, in reset_chi() argument
1240 cmd = dbri_cmdlock(dbri, 4); in reset_chi()
1247 dbri_cmdsend(dbri, cmd, 4); in reset_chi()
1249 dbri->pipes[16].sdp = 1; in reset_chi()
1250 dbri->pipes[16].nextpipe = 16; in reset_chi()
1252 cmd = dbri_cmdlock(dbri, 4); in reset_chi()
1280 dbri->chi_bpf = bits_per_frame; in reset_chi()
1294 dbri_cmdsend(dbri, cmd, 4); in reset_chi()
1308 static void cs4215_setup_pipes(struct snd_dbri *dbri) in cs4215_setup_pipes() argument
1312 spin_lock_irqsave(&dbri->lock, flags); in cs4215_setup_pipes()
1328 setup_pipe(dbri, 4, D_SDP_MEM | D_SDP_TO_SER | D_SDP_MSB); in cs4215_setup_pipes()
1329 setup_pipe(dbri, 20, D_SDP_FIXED | D_SDP_TO_SER | D_SDP_MSB); in cs4215_setup_pipes()
1330 setup_pipe(dbri, 6, D_SDP_MEM | D_SDP_FROM_SER | D_SDP_MSB); in cs4215_setup_pipes()
1331 setup_pipe(dbri, 21, D_SDP_FIXED | D_SDP_FROM_SER | D_SDP_MSB); in cs4215_setup_pipes()
1333 setup_pipe(dbri, 17, D_SDP_FIXED | D_SDP_TO_SER | D_SDP_MSB); in cs4215_setup_pipes()
1334 setup_pipe(dbri, 18, D_SDP_FIXED | D_SDP_FROM_SER | D_SDP_MSB); in cs4215_setup_pipes()
1335 setup_pipe(dbri, 19, D_SDP_FIXED | D_SDP_FROM_SER | D_SDP_MSB); in cs4215_setup_pipes()
1336 spin_unlock_irqrestore(&dbri->lock, flags); in cs4215_setup_pipes()
1338 dbri_cmdwait(dbri); in cs4215_setup_pipes()
1375 static void cs4215_setdata(struct snd_dbri *dbri, int muted) in cs4215_setdata() argument
1378 dbri->mm.data[0] |= 63; in cs4215_setdata()
1379 dbri->mm.data[1] |= 63; in cs4215_setdata()
1380 dbri->mm.data[2] &= ~15; in cs4215_setdata()
1381 dbri->mm.data[3] &= ~15; in cs4215_setdata()
1384 struct dbri_streaminfo *info = &dbri->stream_info[DBRI_PLAY]; in cs4215_setdata()
1388 dbri->mm.data[0] &= ~0x3f; /* Reset the volume bits */ in cs4215_setdata()
1389 dbri->mm.data[1] &= ~0x3f; in cs4215_setdata()
1390 dbri->mm.data[0] |= (DBRI_MAX_VOLUME - left_gain); in cs4215_setdata()
1391 dbri->mm.data[1] |= (DBRI_MAX_VOLUME - right_gain); in cs4215_setdata()
1394 info = &dbri->stream_info[DBRI_REC]; in cs4215_setdata()
1397 dbri->mm.data[2] |= CS4215_LG(left_gain); in cs4215_setdata()
1398 dbri->mm.data[3] |= CS4215_RG(right_gain); in cs4215_setdata()
1401 xmit_fixed(dbri, 20, *(int *)dbri->mm.data); in cs4215_setdata()
1407 static void cs4215_open(struct snd_dbri *dbri) in cs4215_open() argument
1414 dbri->mm.channels, dbri->mm.precision); in cs4215_open()
1420 cs4215_setdata(dbri, 1); in cs4215_open()
1436 spin_lock_irqsave(&dbri->lock, flags); in cs4215_open()
1437 tmp = sbus_readl(dbri->regs + REG0); in cs4215_open()
1439 sbus_writel(tmp, dbri->regs + REG0); in cs4215_open()
1443 (dbri->mm.onboard ? D_PIO0 : D_PIO2), dbri->regs + REG2); in cs4215_open()
1445 reset_chi(dbri, CHIslave, 128); in cs4215_open()
1453 data_width = dbri->mm.channels * dbri->mm.precision; in cs4215_open()
1455 link_time_slot(dbri, 4, 16, 16, data_width, dbri->mm.offset); in cs4215_open()
1456 link_time_slot(dbri, 20, 4, 16, 32, dbri->mm.offset + 32); in cs4215_open()
1457 link_time_slot(dbri, 6, 16, 16, data_width, dbri->mm.offset); in cs4215_open()
1458 link_time_slot(dbri, 21, 6, 16, 16, dbri->mm.offset + 40); in cs4215_open()
1461 tmp = sbus_readl(dbri->regs + REG0); in cs4215_open()
1463 sbus_writel(tmp, dbri->regs + REG0); in cs4215_open()
1464 spin_unlock_irqrestore(&dbri->lock, flags); in cs4215_open()
1466 cs4215_setdata(dbri, 0); in cs4215_open()
1472 static int cs4215_setctrl(struct snd_dbri *dbri) in cs4215_setctrl() argument
1483 cs4215_setdata(dbri, 1); in cs4215_setctrl()
1490 val = D_ENPIO | D_PIO1 | (dbri->mm.onboard ? D_PIO0 : D_PIO2); in cs4215_setctrl()
1491 sbus_writel(val, dbri->regs + REG2); in cs4215_setctrl()
1513 spin_lock_irqsave(&dbri->lock, flags); in cs4215_setctrl()
1514 tmp = sbus_readl(dbri->regs + REG0); in cs4215_setctrl()
1516 sbus_writel(tmp, dbri->regs + REG0); in cs4215_setctrl()
1518 reset_chi(dbri, CHImaster, 128); in cs4215_setctrl()
1527 link_time_slot(dbri, 17, 16, 16, 32, dbri->mm.offset); in cs4215_setctrl()
1528 link_time_slot(dbri, 18, 16, 16, 8, dbri->mm.offset); in cs4215_setctrl()
1529 link_time_slot(dbri, 19, 18, 16, 8, dbri->mm.offset + 48); in cs4215_setctrl()
1530 spin_unlock_irqrestore(&dbri->lock, flags); in cs4215_setctrl()
1533 dbri->mm.ctrl[0] &= ~CS4215_CLB; in cs4215_setctrl()
1534 xmit_fixed(dbri, 17, *(int *)dbri->mm.ctrl); in cs4215_setctrl()
1536 spin_lock_irqsave(&dbri->lock, flags); in cs4215_setctrl()
1537 tmp = sbus_readl(dbri->regs + REG0); in cs4215_setctrl()
1539 sbus_writel(tmp, dbri->regs + REG0); in cs4215_setctrl()
1540 spin_unlock_irqrestore(&dbri->lock, flags); in cs4215_setctrl()
1542 for (i = 10; ((dbri->mm.status & 0xe4) != 0x20); --i) in cs4215_setctrl()
1547 dbri->mm.status); in cs4215_setctrl()
1554 recv_fixed(dbri, 19, NULL); in cs4215_setctrl()
1559 dbri->mm.ctrl[0] |= CS4215_CLB; in cs4215_setctrl()
1560 xmit_fixed(dbri, 17, *(int *)dbri->mm.ctrl); in cs4215_setctrl()
1565 cs4215_setdata(dbri, 0); in cs4215_setctrl()
1576 static int cs4215_prepare(struct snd_dbri *dbri, unsigned int rate, in cs4215_prepare() argument
1594 dbri->mm.ctrl[1] = CS4215_DFR_ULAW; in cs4215_prepare()
1595 dbri->mm.precision = 8; in cs4215_prepare()
1598 dbri->mm.ctrl[1] = CS4215_DFR_ALAW; in cs4215_prepare()
1599 dbri->mm.precision = 8; in cs4215_prepare()
1602 dbri->mm.ctrl[1] = CS4215_DFR_LINEAR8; in cs4215_prepare()
1603 dbri->mm.precision = 8; in cs4215_prepare()
1606 dbri->mm.ctrl[1] = CS4215_DFR_LINEAR16; in cs4215_prepare()
1607 dbri->mm.precision = 16; in cs4215_prepare()
1615 dbri->mm.ctrl[1] |= CS4215_FREQ[freq_idx].csval; in cs4215_prepare()
1616 dbri->mm.ctrl[2] = CS4215_XCLK | in cs4215_prepare()
1619 dbri->mm.channels = channels; in cs4215_prepare()
1621 dbri->mm.ctrl[1] |= CS4215_DFR_STEREO; in cs4215_prepare()
1623 ret = cs4215_setctrl(dbri); in cs4215_prepare()
1625 cs4215_open(dbri); /* set codec to data mode */ in cs4215_prepare()
1633 static int cs4215_init(struct snd_dbri *dbri) in cs4215_init() argument
1635 u32 reg2 = sbus_readl(dbri->regs + REG2); in cs4215_init()
1641 dbri->mm.onboard = 1; in cs4215_init()
1645 dbri->mm.onboard = 0; in cs4215_init()
1650 sbus_writel(D_ENPIO2, dbri->regs + REG2); in cs4215_init()
1659 cs4215_setup_pipes(dbri); in cs4215_init()
1660 cs4215_init_data(&dbri->mm); in cs4215_init()
1663 recv_fixed(dbri, 18, &dbri->mm.status); in cs4215_init()
1664 recv_fixed(dbri, 19, &dbri->mm.version); in cs4215_init()
1666 dbri->mm.offset = dbri->mm.onboard ? 0 : 8; in cs4215_init()
1667 if (cs4215_setctrl(dbri) == -1 || dbri->mm.version == 0xff) { in cs4215_init()
1669 dbri->mm.offset); in cs4215_init()
1672 dprintk(D_MM, "Found CS4215 at offset %d\n", dbri->mm.offset); in cs4215_init()
1697 static void xmit_descs(struct snd_dbri *dbri) in xmit_descs() argument
1704 if (dbri == NULL) in xmit_descs()
1707 info = &dbri->stream_info[DBRI_REC]; in xmit_descs()
1708 spin_lock_irqsave(&dbri->lock, flags); in xmit_descs()
1711 first_td = dbri->pipes[info->pipe].first_desc; in xmit_descs()
1717 cmd = dbri_cmdlock(dbri, 2); in xmit_descs()
1719 dbri->pipes[info->pipe].sdp in xmit_descs()
1721 *(cmd++) = dbri->dma_dvma + in xmit_descs()
1723 dbri_cmdsend(dbri, cmd, 2); in xmit_descs()
1726 dbri->pipes[info->pipe].desc = first_td; in xmit_descs()
1730 info = &dbri->stream_info[DBRI_PLAY]; in xmit_descs()
1733 first_td = dbri->pipes[info->pipe].first_desc; in xmit_descs()
1739 cmd = dbri_cmdlock(dbri, 2); in xmit_descs()
1741 dbri->pipes[info->pipe].sdp in xmit_descs()
1743 *(cmd++) = dbri->dma_dvma + in xmit_descs()
1745 dbri_cmdsend(dbri, cmd, 2); in xmit_descs()
1748 dbri->pipes[info->pipe].desc = first_td; in xmit_descs()
1752 spin_unlock_irqrestore(&dbri->lock, flags); in xmit_descs()
1769 static void transmission_complete_intr(struct snd_dbri *dbri, int pipe) in transmission_complete_intr() argument
1771 struct dbri_streaminfo *info = &dbri->stream_info[DBRI_PLAY]; in transmission_complete_intr()
1772 int td = dbri->pipes[pipe].desc; in transmission_complete_intr()
1781 status = DBRI_TD_STATUS(dbri->dma->desc[td].word4); in transmission_complete_intr()
1787 dbri->dma->desc[td].word4 = 0; /* Reset it for next time. */ in transmission_complete_intr()
1788 info->offset += DBRI_RD_CNT(dbri->dma->desc[td].word1); in transmission_complete_intr()
1790 td = dbri->next_desc[td]; in transmission_complete_intr()
1791 dbri->pipes[pipe].desc = td; in transmission_complete_intr()
1795 spin_unlock(&dbri->lock); in transmission_complete_intr()
1797 spin_lock(&dbri->lock); in transmission_complete_intr()
1800 static void reception_complete_intr(struct snd_dbri *dbri, int pipe) in reception_complete_intr() argument
1803 int rd = dbri->pipes[pipe].desc; in reception_complete_intr()
1811 dbri->pipes[pipe].desc = dbri->next_desc[rd]; in reception_complete_intr()
1812 status = dbri->dma->desc[rd].word1; in reception_complete_intr()
1813 dbri->dma->desc[rd].word1 = 0; /* Reset it for next time. */ in reception_complete_intr()
1815 info = &dbri->stream_info[DBRI_REC]; in reception_complete_intr()
1824 spin_unlock(&dbri->lock); in reception_complete_intr()
1826 spin_lock(&dbri->lock); in reception_complete_intr()
1829 static void dbri_process_one_interrupt(struct snd_dbri *dbri, int x) in dbri_process_one_interrupt() argument
1853 reception_complete_intr(dbri, channel); in dbri_process_one_interrupt()
1857 transmission_complete_intr(dbri, channel); in dbri_process_one_interrupt()
1869 int td = dbri->pipes[pipe].desc; in dbri_process_one_interrupt()
1871 dbri->dma->desc[td].word4 = 0; in dbri_process_one_interrupt()
1872 cmd = dbri_cmdlock(dbri, NoGetLock); in dbri_process_one_interrupt()
1874 dbri->pipes[pipe].sdp in dbri_process_one_interrupt()
1876 *(cmd++) = dbri->dma_dvma + dbri_dma_off(desc, td); in dbri_process_one_interrupt()
1877 dbri_cmdsend(dbri, cmd); in dbri_process_one_interrupt()
1883 if (dbri->pipes[channel].sdp & D_SDP_MSB) in dbri_process_one_interrupt()
1884 val = reverse_bytes(val, dbri->pipes[channel].length); in dbri_process_one_interrupt()
1886 if (dbri->pipes[channel].recv_fixed_ptr) in dbri_process_one_interrupt()
1887 *(dbri->pipes[channel].recv_fixed_ptr) = val; in dbri_process_one_interrupt()
1901 static void dbri_process_interrupt_buffer(struct snd_dbri *dbri) in dbri_process_interrupt_buffer() argument
1905 while ((x = dbri->dma->intr[dbri->dbri_irqp]) != 0) { in dbri_process_interrupt_buffer()
1906 dbri->dma->intr[dbri->dbri_irqp] = 0; in dbri_process_interrupt_buffer()
1907 dbri->dbri_irqp++; in dbri_process_interrupt_buffer()
1908 if (dbri->dbri_irqp == DBRI_INT_BLK) in dbri_process_interrupt_buffer()
1909 dbri->dbri_irqp = 1; in dbri_process_interrupt_buffer()
1911 dbri_process_one_interrupt(dbri, x); in dbri_process_interrupt_buffer()
1917 struct snd_dbri *dbri = dev_id; in snd_dbri_interrupt() local
1921 if (dbri == NULL) in snd_dbri_interrupt()
1923 spin_lock(&dbri->lock); in snd_dbri_interrupt()
1928 x = sbus_readl(dbri->regs + REG1); in snd_dbri_interrupt()
1958 dbri_reset(dbri); in snd_dbri_interrupt()
1960 tmp = sbus_readl(dbri->regs + REG0); in snd_dbri_interrupt()
1962 sbus_writel(tmp, dbri->regs + REG0); in snd_dbri_interrupt()
1966 dbri_process_interrupt_buffer(dbri); in snd_dbri_interrupt()
1968 spin_unlock(&dbri->lock); in snd_dbri_interrupt()
2034 struct snd_dbri *dbri = snd_pcm_substream_chip(substream); in snd_dbri_open() local
2036 struct dbri_streaminfo *info = DBRI_STREAM(dbri, substream); in snd_dbri_open()
2042 spin_lock_irqsave(&dbri->lock, flags); in snd_dbri_open()
2047 spin_unlock_irqrestore(&dbri->lock, flags); in snd_dbri_open()
2057 cs4215_open(dbri); in snd_dbri_open()
2064 struct snd_dbri *dbri = snd_pcm_substream_chip(substream); in snd_dbri_close() local
2065 struct dbri_streaminfo *info = DBRI_STREAM(dbri, substream); in snd_dbri_close()
2078 struct snd_dbri *dbri = snd_pcm_substream_chip(substream); in snd_dbri_hw_params() local
2079 struct dbri_streaminfo *info = DBRI_STREAM(dbri, substream); in snd_dbri_hw_params()
2084 ret = cs4215_prepare(dbri, params_rate(hw_params), in snd_dbri_hw_params()
2105 dma_map_single(&dbri->op->dev, in snd_dbri_hw_params()
2119 struct snd_dbri *dbri = snd_pcm_substream_chip(substream); in snd_dbri_hw_free() local
2120 struct dbri_streaminfo *info = DBRI_STREAM(dbri, substream); in snd_dbri_hw_free()
2133 dma_unmap_single(&dbri->op->dev, info->dvma_buffer, in snd_dbri_hw_free()
2138 reset_pipe(dbri, info->pipe); in snd_dbri_hw_free()
2147 struct snd_dbri *dbri = snd_pcm_substream_chip(substream); in snd_dbri_prepare() local
2148 struct dbri_streaminfo *info = DBRI_STREAM(dbri, substream); in snd_dbri_prepare()
2157 spin_lock_irq(&dbri->lock); in snd_dbri_prepare()
2163 ret = setup_descs(dbri, DBRI_STREAMNO(substream), in snd_dbri_prepare()
2166 spin_unlock_irq(&dbri->lock); in snd_dbri_prepare()
2174 struct snd_dbri *dbri = snd_pcm_substream_chip(substream); in snd_dbri_trigger() local
2175 struct dbri_streaminfo *info = DBRI_STREAM(dbri, substream); in snd_dbri_trigger()
2183 xmit_descs(dbri); in snd_dbri_trigger()
2187 reset_pipe(dbri, info->pipe); in snd_dbri_trigger()
2198 struct snd_dbri *dbri = snd_pcm_substream_chip(substream); in snd_dbri_pointer() local
2199 struct dbri_streaminfo *info = DBRI_STREAM(dbri, substream); in snd_dbri_pointer()
2268 struct snd_dbri *dbri = snd_kcontrol_chip(kcontrol); in snd_cs4215_get_volume() local
2271 if (snd_BUG_ON(!dbri)) in snd_cs4215_get_volume()
2273 info = &dbri->stream_info[kcontrol->private_value]; in snd_cs4215_get_volume()
2283 struct snd_dbri *dbri = snd_kcontrol_chip(kcontrol); in snd_cs4215_put_volume() local
2285 &dbri->stream_info[kcontrol->private_value]; in snd_cs4215_put_volume()
2311 cs4215_setdata(dbri, 1); in snd_cs4215_put_volume()
2313 cs4215_setdata(dbri, 0); in snd_cs4215_put_volume()
2334 struct snd_dbri *dbri = snd_kcontrol_chip(kcontrol); in snd_cs4215_get_single() local
2340 if (snd_BUG_ON(!dbri)) in snd_cs4215_get_single()
2345 (dbri->mm.data[elem] >> shift) & mask; in snd_cs4215_get_single()
2348 (dbri->mm.ctrl[elem - 4] >> shift) & mask; in snd_cs4215_get_single()
2359 struct snd_dbri *dbri = snd_kcontrol_chip(kcontrol); in snd_cs4215_put_single() local
2367 if (snd_BUG_ON(!dbri)) in snd_cs4215_put_single()
2376 dbri->mm.data[elem] = (dbri->mm.data[elem] & in snd_cs4215_put_single()
2378 changed = (val != dbri->mm.data[elem]); in snd_cs4215_put_single()
2380 dbri->mm.ctrl[elem - 4] = (dbri->mm.ctrl[elem - 4] & in snd_cs4215_put_single()
2382 changed = (val != dbri->mm.ctrl[elem - 4]); in snd_cs4215_put_single()
2388 dbri->mm.data[elem & 3]); in snd_cs4215_put_single()
2394 cs4215_setdata(dbri, 1); in snd_cs4215_put_single()
2396 cs4215_setdata(dbri, 0); in snd_cs4215_put_single()
2442 struct snd_dbri *dbri; in snd_dbri_mixer() local
2446 dbri = card->private_data; in snd_dbri_mixer()
2452 snd_ctl_new1(&dbri_controls[idx], dbri)); in snd_dbri_mixer()
2458 dbri->stream_info[idx].left_gain = 0; in snd_dbri_mixer()
2459 dbri->stream_info[idx].right_gain = 0; in snd_dbri_mixer()
2471 struct snd_dbri *dbri = entry->private_data; in dbri_regs_read() local
2473 snd_iprintf(buffer, "REG0: 0x%x\n", sbus_readl(dbri->regs + REG0)); in dbri_regs_read()
2474 snd_iprintf(buffer, "REG2: 0x%x\n", sbus_readl(dbri->regs + REG2)); in dbri_regs_read()
2475 snd_iprintf(buffer, "REG8: 0x%x\n", sbus_readl(dbri->regs + REG8)); in dbri_regs_read()
2476 snd_iprintf(buffer, "REG9: 0x%x\n", sbus_readl(dbri->regs + REG9)); in dbri_regs_read()
2483 struct snd_dbri *dbri = entry->private_data; in dbri_debug_read() local
2488 if (pipe_active(dbri, pipe)) { in dbri_debug_read()
2489 struct dbri_pipe *pptr = &dbri->pipes[pipe]; in dbri_debug_read()
2505 struct snd_dbri *dbri = card->private_data; in snd_dbri_proc() local
2509 snd_info_set_text_ops(entry, dbri, dbri_regs_read); in snd_dbri_proc()
2513 snd_info_set_text_ops(entry, dbri, dbri_debug_read); in snd_dbri_proc()
2524 static void snd_dbri_free(struct snd_dbri *dbri);
2530 struct snd_dbri *dbri = card->private_data; in snd_dbri_create() local
2533 spin_lock_init(&dbri->lock); in snd_dbri_create()
2534 dbri->op = op; in snd_dbri_create()
2535 dbri->irq = irq; in snd_dbri_create()
2537 dbri->dma = dma_zalloc_coherent(&op->dev, sizeof(struct dbri_dma), in snd_dbri_create()
2538 &dbri->dma_dvma, GFP_ATOMIC); in snd_dbri_create()
2539 if (!dbri->dma) in snd_dbri_create()
2543 dbri->dma, dbri->dma_dvma); in snd_dbri_create()
2546 dbri->regs_size = resource_size(&op->resource[0]); in snd_dbri_create()
2547 dbri->regs = of_ioremap(&op->resource[0], 0, in snd_dbri_create()
2548 dbri->regs_size, "DBRI Registers"); in snd_dbri_create()
2549 if (!dbri->regs) { in snd_dbri_create()
2552 (void *)dbri->dma, dbri->dma_dvma); in snd_dbri_create()
2556 err = request_irq(dbri->irq, snd_dbri_interrupt, IRQF_SHARED, in snd_dbri_create()
2557 "DBRI audio", dbri); in snd_dbri_create()
2559 printk(KERN_ERR "DBRI: Can't get irq %d\n", dbri->irq); in snd_dbri_create()
2560 of_iounmap(&op->resource[0], dbri->regs, dbri->regs_size); in snd_dbri_create()
2562 (void *)dbri->dma, dbri->dma_dvma); in snd_dbri_create()
2567 dbri_initialize(dbri); in snd_dbri_create()
2568 err = cs4215_init(dbri); in snd_dbri_create()
2570 snd_dbri_free(dbri); in snd_dbri_create()
2577 static void snd_dbri_free(struct snd_dbri *dbri) in snd_dbri_free() argument
2580 dbri_reset(dbri); in snd_dbri_free()
2582 if (dbri->irq) in snd_dbri_free()
2583 free_irq(dbri->irq, dbri); in snd_dbri_free()
2585 if (dbri->regs) in snd_dbri_free()
2586 of_iounmap(&dbri->op->resource[0], dbri->regs, dbri->regs_size); in snd_dbri_free()
2588 if (dbri->dma) in snd_dbri_free()
2589 dma_free_coherent(&dbri->op->dev, in snd_dbri_free()
2591 (void *)dbri->dma, dbri->dma_dvma); in snd_dbri_free()
2596 struct snd_dbri *dbri; in dbri_probe() local
2634 dbri = card->private_data; in dbri_probe()
2652 dev, dbri->regs, in dbri_probe()
2653 dbri->irq, op->dev.of_node->name[9], dbri->mm.version); in dbri_probe()
2659 snd_dbri_free(dbri); in dbri_probe()