Lines Matching refs:dbri

571 #define DBRI_STREAM(dbri, substream)	\  argument
572 &dbri->stream_info[DBRI_STREAMNO(substream)]
639 static void dbri_cmdwait(struct snd_dbri *dbri) in dbri_cmdwait() argument
645 spin_lock_irqsave(&dbri->lock, flags); in dbri_cmdwait()
646 while ((--maxloops) > 0 && (sbus_readl(dbri->regs + REG0) & D_P)) { in dbri_cmdwait()
647 spin_unlock_irqrestore(&dbri->lock, flags); in dbri_cmdwait()
649 spin_lock_irqsave(&dbri->lock, flags); in dbri_cmdwait()
651 spin_unlock_irqrestore(&dbri->lock, flags); in dbri_cmdwait()
663 static s32 *dbri_cmdlock(struct snd_dbri *dbri, int len) in dbri_cmdlock() argument
665 u32 dvma_addr = (u32)dbri->dma_dvma; in dbri_cmdlock()
669 spin_lock(&dbri->cmdlock); in dbri_cmdlock()
670 if (dbri->cmdptr - dbri->dma->cmd + len < DBRI_NO_CMDS - 2) in dbri_cmdlock()
671 return dbri->cmdptr + 2; in dbri_cmdlock()
672 else if (len < sbus_readl(dbri->regs + REG8) - dvma_addr) in dbri_cmdlock()
673 return dbri->dma->cmd; in dbri_cmdlock()
688 static void dbri_cmdsend(struct snd_dbri *dbri, s32 *cmd, int len) in dbri_cmdsend() argument
690 u32 dvma_addr = (u32)dbri->dma_dvma; in dbri_cmdsend()
700 addr = dvma_addr + (cmd - len - dbri->dma->cmd) * sizeof(s32); in dbri_cmdsend()
701 *(dbri->cmdptr+1) = addr; in dbri_cmdsend()
702 *(dbri->cmdptr) = DBRI_CMD(D_JUMP, 0, 0); in dbri_cmdsend()
705 if (cmd > dbri->cmdptr) { in dbri_cmdsend()
708 for (ptr = dbri->cmdptr; ptr < cmd+2; ptr++) in dbri_cmdsend()
712 s32 *ptr = dbri->cmdptr; in dbri_cmdsend()
717 for (ptr = dbri->dma->cmd; ptr < cmd+2; ptr++) in dbri_cmdsend()
724 tmp = sbus_readl(dbri->regs + REG0); in dbri_cmdsend()
726 sbus_writel(tmp, dbri->regs + REG0); in dbri_cmdsend()
728 dbri->cmdptr = cmd; in dbri_cmdsend()
729 spin_unlock(&dbri->cmdlock); in dbri_cmdsend()
733 static void dbri_reset(struct snd_dbri *dbri) in dbri_reset() argument
739 sbus_readl(dbri->regs + REG0), in dbri_reset()
740 sbus_readl(dbri->regs + REG2), in dbri_reset()
741 sbus_readl(dbri->regs + REG8), sbus_readl(dbri->regs + REG9)); in dbri_reset()
743 sbus_writel(D_R, dbri->regs + REG0); /* Soft Reset */ in dbri_reset()
744 for (i = 0; (sbus_readl(dbri->regs + REG0) & D_R) && i < 64; i++) in dbri_reset()
749 tmp = sbus_readl(dbri->regs + REG0); in dbri_reset()
752 sbus_writel(tmp, dbri->regs + REG0); in dbri_reset()
756 static void dbri_initialize(struct snd_dbri *dbri) in dbri_initialize() argument
758 u32 dvma_addr = (u32)dbri->dma_dvma; in dbri_initialize()
764 spin_lock_irqsave(&dbri->lock, flags); in dbri_initialize()
766 dbri_reset(dbri); in dbri_initialize()
770 dbri->pipes[n].desc = dbri->pipes[n].first_desc = -1; in dbri_initialize()
772 spin_lock_init(&dbri->cmdlock); in dbri_initialize()
777 dbri->dma->intr[0] = dma_addr; in dbri_initialize()
778 dbri->dbri_irqp = 1; in dbri_initialize()
782 spin_lock(&dbri->cmdlock); in dbri_initialize()
783 cmd = dbri->cmdptr = dbri->dma->cmd; in dbri_initialize()
787 dbri->cmdptr = cmd; in dbri_initialize()
791 sbus_writel(dma_addr, dbri->regs + REG8); in dbri_initialize()
792 spin_unlock(&dbri->cmdlock); in dbri_initialize()
794 spin_unlock_irqrestore(&dbri->lock, flags); in dbri_initialize()
795 dbri_cmdwait(dbri); in dbri_initialize()
812 static inline int pipe_active(struct snd_dbri *dbri, int pipe) in pipe_active() argument
814 return ((pipe >= 0) && (dbri->pipes[pipe].desc != -1)); in pipe_active()
822 static void reset_pipe(struct snd_dbri *dbri, int pipe) in reset_pipe() argument
834 sdp = dbri->pipes[pipe].sdp; in reset_pipe()
841 cmd = dbri_cmdlock(dbri, 3); in reset_pipe()
845 dbri_cmdsend(dbri, cmd, 3); in reset_pipe()
847 desc = dbri->pipes[pipe].first_desc; in reset_pipe()
850 dbri->dma->desc[desc].ba = 0; in reset_pipe()
851 dbri->dma->desc[desc].nda = 0; in reset_pipe()
852 desc = dbri->next_desc[desc]; in reset_pipe()
853 } while (desc != -1 && desc != dbri->pipes[pipe].first_desc); in reset_pipe()
855 dbri->pipes[pipe].desc = -1; in reset_pipe()
856 dbri->pipes[pipe].first_desc = -1; in reset_pipe()
862 static void setup_pipe(struct snd_dbri *dbri, int pipe, int sdp) in setup_pipe() argument
883 dbri->pipes[pipe].sdp = sdp; in setup_pipe()
884 dbri->pipes[pipe].desc = -1; in setup_pipe()
885 dbri->pipes[pipe].first_desc = -1; in setup_pipe()
887 reset_pipe(dbri, pipe); in setup_pipe()
893 static void link_time_slot(struct snd_dbri *dbri, int pipe, in link_time_slot() argument
908 if (dbri->pipes[pipe].sdp == 0 in link_time_slot()
909 || dbri->pipes[prevpipe].sdp == 0 in link_time_slot()
910 || dbri->pipes[nextpipe].sdp == 0) { in link_time_slot()
916 dbri->pipes[prevpipe].nextpipe = pipe; in link_time_slot()
917 dbri->pipes[pipe].nextpipe = nextpipe; in link_time_slot()
918 dbri->pipes[pipe].length = length; in link_time_slot()
920 cmd = dbri_cmdlock(dbri, 4); in link_time_slot()
922 if (dbri->pipes[pipe].sdp & D_SDP_TO_SER) { in link_time_slot()
929 cycle = dbri->chi_bpf; in link_time_slot()
945 dbri_cmdsend(dbri, cmd, 4); in link_time_slot()
952 static void unlink_time_slot(struct snd_dbri *dbri, int pipe,
967 cmd = dbri_cmdlock(dbri, 4);
982 dbri_cmdsend(dbri, cmd, 4);
1002 static void xmit_fixed(struct snd_dbri *dbri, int pipe, unsigned int data) in xmit_fixed() argument
1012 if (D_SDP_MODE(dbri->pipes[pipe].sdp) == 0) { in xmit_fixed()
1018 if (D_SDP_MODE(dbri->pipes[pipe].sdp) != D_SDP_FIXED) { in xmit_fixed()
1023 if (!(dbri->pipes[pipe].sdp & D_SDP_TO_SER)) { in xmit_fixed()
1031 if (dbri->pipes[pipe].sdp & D_SDP_MSB) in xmit_fixed()
1032 data = reverse_bytes(data, dbri->pipes[pipe].length); in xmit_fixed()
1034 cmd = dbri_cmdlock(dbri, 3); in xmit_fixed()
1040 spin_lock_irqsave(&dbri->lock, flags); in xmit_fixed()
1041 dbri_cmdsend(dbri, cmd, 3); in xmit_fixed()
1042 spin_unlock_irqrestore(&dbri->lock, flags); in xmit_fixed()
1043 dbri_cmdwait(dbri); in xmit_fixed()
1047 static void recv_fixed(struct snd_dbri *dbri, int pipe, volatile __u32 *ptr) in recv_fixed() argument
1055 if (D_SDP_MODE(dbri->pipes[pipe].sdp) != D_SDP_FIXED) { in recv_fixed()
1061 if (dbri->pipes[pipe].sdp & D_SDP_TO_SER) { in recv_fixed()
1067 dbri->pipes[pipe].recv_fixed_ptr = ptr; in recv_fixed()
1086 static int setup_descs(struct snd_dbri *dbri, int streamno, unsigned int period) in setup_descs() argument
1088 struct dbri_streaminfo *info = &dbri->stream_info[streamno]; in setup_descs()
1089 u32 dvma_addr = (u32)dbri->dma_dvma; in setup_descs()
1101 if (dbri->pipes[info->pipe].sdp == 0) { in setup_descs()
1111 if (!(dbri->pipes[info->pipe].sdp & D_SDP_TO_SER)) { in setup_descs()
1117 if (dbri->pipes[info->pipe].sdp & D_SDP_TO_SER) { in setup_descs()
1126 if (pipe_active(dbri, info->pipe)) { in setup_descs()
1137 desc = dbri->pipes[info->pipe].first_desc; in setup_descs()
1140 dbri->dma->desc[desc].ba = 0; in setup_descs()
1141 dbri->dma->desc[desc].nda = 0; in setup_descs()
1142 desc = dbri->next_desc[desc]; in setup_descs()
1144 desc != dbri->pipes[info->pipe].first_desc); in setup_descs()
1146 dbri->pipes[info->pipe].desc = -1; in setup_descs()
1147 dbri->pipes[info->pipe].first_desc = -1; in setup_descs()
1154 if (!dbri->dma->desc[desc].ba) in setup_descs()
1171 dbri->next_desc[desc] = -1; in setup_descs()
1172 dbri->dma->desc[desc].ba = dvma_buffer; in setup_descs()
1173 dbri->dma->desc[desc].nda = 0; in setup_descs()
1176 dbri->dma->desc[desc].word1 = DBRI_TD_CNT(mylen); in setup_descs()
1177 dbri->dma->desc[desc].word4 = 0; in setup_descs()
1178 dbri->dma->desc[desc].word1 |= DBRI_TD_F | DBRI_TD_B; in setup_descs()
1180 dbri->dma->desc[desc].word1 = 0; in setup_descs()
1181 dbri->dma->desc[desc].word4 = in setup_descs()
1188 dbri->next_desc[last_desc] = desc; in setup_descs()
1189 dbri->dma->desc[last_desc].nda = in setup_descs()
1204 dbri->dma->desc[last_desc].nda = in setup_descs()
1206 dbri->next_desc[last_desc] = first_desc; in setup_descs()
1207 dbri->pipes[info->pipe].first_desc = first_desc; in setup_descs()
1208 dbri->pipes[info->pipe].desc = first_desc; in setup_descs()
1214 dbri->dma->desc[desc].word1, in setup_descs()
1215 dbri->dma->desc[desc].ba, in setup_descs()
1216 dbri->dma->desc[desc].nda, dbri->dma->desc[desc].word4); in setup_descs()
1217 desc = dbri->next_desc[desc]; in setup_descs()
1241 static void reset_chi(struct snd_dbri *dbri, in reset_chi() argument
1250 cmd = dbri_cmdlock(dbri, 4); in reset_chi()
1257 dbri_cmdsend(dbri, cmd, 4); in reset_chi()
1259 dbri->pipes[16].sdp = 1; in reset_chi()
1260 dbri->pipes[16].nextpipe = 16; in reset_chi()
1262 cmd = dbri_cmdlock(dbri, 4); in reset_chi()
1290 dbri->chi_bpf = bits_per_frame; in reset_chi()
1304 dbri_cmdsend(dbri, cmd, 4); in reset_chi()
1318 static void cs4215_setup_pipes(struct snd_dbri *dbri) in cs4215_setup_pipes() argument
1322 spin_lock_irqsave(&dbri->lock, flags); in cs4215_setup_pipes()
1338 setup_pipe(dbri, 4, D_SDP_MEM | D_SDP_TO_SER | D_SDP_MSB); in cs4215_setup_pipes()
1339 setup_pipe(dbri, 20, D_SDP_FIXED | D_SDP_TO_SER | D_SDP_MSB); in cs4215_setup_pipes()
1340 setup_pipe(dbri, 6, D_SDP_MEM | D_SDP_FROM_SER | D_SDP_MSB); in cs4215_setup_pipes()
1341 setup_pipe(dbri, 21, D_SDP_FIXED | D_SDP_FROM_SER | D_SDP_MSB); in cs4215_setup_pipes()
1343 setup_pipe(dbri, 17, D_SDP_FIXED | D_SDP_TO_SER | D_SDP_MSB); in cs4215_setup_pipes()
1344 setup_pipe(dbri, 18, D_SDP_FIXED | D_SDP_FROM_SER | D_SDP_MSB); in cs4215_setup_pipes()
1345 setup_pipe(dbri, 19, D_SDP_FIXED | D_SDP_FROM_SER | D_SDP_MSB); in cs4215_setup_pipes()
1346 spin_unlock_irqrestore(&dbri->lock, flags); in cs4215_setup_pipes()
1348 dbri_cmdwait(dbri); in cs4215_setup_pipes()
1385 static void cs4215_setdata(struct snd_dbri *dbri, int muted) in cs4215_setdata() argument
1388 dbri->mm.data[0] |= 63; in cs4215_setdata()
1389 dbri->mm.data[1] |= 63; in cs4215_setdata()
1390 dbri->mm.data[2] &= ~15; in cs4215_setdata()
1391 dbri->mm.data[3] &= ~15; in cs4215_setdata()
1394 struct dbri_streaminfo *info = &dbri->stream_info[DBRI_PLAY]; in cs4215_setdata()
1398 dbri->mm.data[0] &= ~0x3f; /* Reset the volume bits */ in cs4215_setdata()
1399 dbri->mm.data[1] &= ~0x3f; in cs4215_setdata()
1400 dbri->mm.data[0] |= (DBRI_MAX_VOLUME - left_gain); in cs4215_setdata()
1401 dbri->mm.data[1] |= (DBRI_MAX_VOLUME - right_gain); in cs4215_setdata()
1404 info = &dbri->stream_info[DBRI_REC]; in cs4215_setdata()
1407 dbri->mm.data[2] |= CS4215_LG(left_gain); in cs4215_setdata()
1408 dbri->mm.data[3] |= CS4215_RG(right_gain); in cs4215_setdata()
1411 xmit_fixed(dbri, 20, *(int *)dbri->mm.data); in cs4215_setdata()
1417 static void cs4215_open(struct snd_dbri *dbri) in cs4215_open() argument
1424 dbri->mm.channels, dbri->mm.precision); in cs4215_open()
1430 cs4215_setdata(dbri, 1); in cs4215_open()
1446 spin_lock_irqsave(&dbri->lock, flags); in cs4215_open()
1447 tmp = sbus_readl(dbri->regs + REG0); in cs4215_open()
1449 sbus_writel(tmp, dbri->regs + REG0); in cs4215_open()
1453 (dbri->mm.onboard ? D_PIO0 : D_PIO2), dbri->regs + REG2); in cs4215_open()
1455 reset_chi(dbri, CHIslave, 128); in cs4215_open()
1463 data_width = dbri->mm.channels * dbri->mm.precision; in cs4215_open()
1465 link_time_slot(dbri, 4, 16, 16, data_width, dbri->mm.offset); in cs4215_open()
1466 link_time_slot(dbri, 20, 4, 16, 32, dbri->mm.offset + 32); in cs4215_open()
1467 link_time_slot(dbri, 6, 16, 16, data_width, dbri->mm.offset); in cs4215_open()
1468 link_time_slot(dbri, 21, 6, 16, 16, dbri->mm.offset + 40); in cs4215_open()
1471 tmp = sbus_readl(dbri->regs + REG0); in cs4215_open()
1473 sbus_writel(tmp, dbri->regs + REG0); in cs4215_open()
1474 spin_unlock_irqrestore(&dbri->lock, flags); in cs4215_open()
1476 cs4215_setdata(dbri, 0); in cs4215_open()
1482 static int cs4215_setctrl(struct snd_dbri *dbri) in cs4215_setctrl() argument
1493 cs4215_setdata(dbri, 1); in cs4215_setctrl()
1500 val = D_ENPIO | D_PIO1 | (dbri->mm.onboard ? D_PIO0 : D_PIO2); in cs4215_setctrl()
1501 sbus_writel(val, dbri->regs + REG2); in cs4215_setctrl()
1523 spin_lock_irqsave(&dbri->lock, flags); in cs4215_setctrl()
1524 tmp = sbus_readl(dbri->regs + REG0); in cs4215_setctrl()
1526 sbus_writel(tmp, dbri->regs + REG0); in cs4215_setctrl()
1528 reset_chi(dbri, CHImaster, 128); in cs4215_setctrl()
1537 link_time_slot(dbri, 17, 16, 16, 32, dbri->mm.offset); in cs4215_setctrl()
1538 link_time_slot(dbri, 18, 16, 16, 8, dbri->mm.offset); in cs4215_setctrl()
1539 link_time_slot(dbri, 19, 18, 16, 8, dbri->mm.offset + 48); in cs4215_setctrl()
1540 spin_unlock_irqrestore(&dbri->lock, flags); in cs4215_setctrl()
1543 dbri->mm.ctrl[0] &= ~CS4215_CLB; in cs4215_setctrl()
1544 xmit_fixed(dbri, 17, *(int *)dbri->mm.ctrl); in cs4215_setctrl()
1546 spin_lock_irqsave(&dbri->lock, flags); in cs4215_setctrl()
1547 tmp = sbus_readl(dbri->regs + REG0); in cs4215_setctrl()
1549 sbus_writel(tmp, dbri->regs + REG0); in cs4215_setctrl()
1550 spin_unlock_irqrestore(&dbri->lock, flags); in cs4215_setctrl()
1552 for (i = 10; ((dbri->mm.status & 0xe4) != 0x20); --i) in cs4215_setctrl()
1557 dbri->mm.status); in cs4215_setctrl()
1564 recv_fixed(dbri, 19, NULL); in cs4215_setctrl()
1569 dbri->mm.ctrl[0] |= CS4215_CLB; in cs4215_setctrl()
1570 xmit_fixed(dbri, 17, *(int *)dbri->mm.ctrl); in cs4215_setctrl()
1575 cs4215_setdata(dbri, 0); in cs4215_setctrl()
1586 static int cs4215_prepare(struct snd_dbri *dbri, unsigned int rate, in cs4215_prepare() argument
1604 dbri->mm.ctrl[1] = CS4215_DFR_ULAW; in cs4215_prepare()
1605 dbri->mm.precision = 8; in cs4215_prepare()
1608 dbri->mm.ctrl[1] = CS4215_DFR_ALAW; in cs4215_prepare()
1609 dbri->mm.precision = 8; in cs4215_prepare()
1612 dbri->mm.ctrl[1] = CS4215_DFR_LINEAR8; in cs4215_prepare()
1613 dbri->mm.precision = 8; in cs4215_prepare()
1616 dbri->mm.ctrl[1] = CS4215_DFR_LINEAR16; in cs4215_prepare()
1617 dbri->mm.precision = 16; in cs4215_prepare()
1625 dbri->mm.ctrl[1] |= CS4215_FREQ[freq_idx].csval; in cs4215_prepare()
1626 dbri->mm.ctrl[2] = CS4215_XCLK | in cs4215_prepare()
1629 dbri->mm.channels = channels; in cs4215_prepare()
1631 dbri->mm.ctrl[1] |= CS4215_DFR_STEREO; in cs4215_prepare()
1633 ret = cs4215_setctrl(dbri); in cs4215_prepare()
1635 cs4215_open(dbri); /* set codec to data mode */ in cs4215_prepare()
1643 static int cs4215_init(struct snd_dbri *dbri) in cs4215_init() argument
1645 u32 reg2 = sbus_readl(dbri->regs + REG2); in cs4215_init()
1651 dbri->mm.onboard = 1; in cs4215_init()
1655 dbri->mm.onboard = 0; in cs4215_init()
1660 sbus_writel(D_ENPIO2, dbri->regs + REG2); in cs4215_init()
1669 cs4215_setup_pipes(dbri); in cs4215_init()
1670 cs4215_init_data(&dbri->mm); in cs4215_init()
1673 recv_fixed(dbri, 18, &dbri->mm.status); in cs4215_init()
1674 recv_fixed(dbri, 19, &dbri->mm.version); in cs4215_init()
1676 dbri->mm.offset = dbri->mm.onboard ? 0 : 8; in cs4215_init()
1677 if (cs4215_setctrl(dbri) == -1 || dbri->mm.version == 0xff) { in cs4215_init()
1679 dbri->mm.offset); in cs4215_init()
1682 dprintk(D_MM, "Found CS4215 at offset %d\n", dbri->mm.offset); in cs4215_init()
1707 static void xmit_descs(struct snd_dbri *dbri) in xmit_descs() argument
1715 if (dbri == NULL) in xmit_descs()
1718 dvma_addr = (u32)dbri->dma_dvma; in xmit_descs()
1719 info = &dbri->stream_info[DBRI_REC]; in xmit_descs()
1720 spin_lock_irqsave(&dbri->lock, flags); in xmit_descs()
1723 first_td = dbri->pipes[info->pipe].first_desc; in xmit_descs()
1729 cmd = dbri_cmdlock(dbri, 2); in xmit_descs()
1731 dbri->pipes[info->pipe].sdp in xmit_descs()
1735 dbri_cmdsend(dbri, cmd, 2); in xmit_descs()
1738 dbri->pipes[info->pipe].desc = first_td; in xmit_descs()
1742 info = &dbri->stream_info[DBRI_PLAY]; in xmit_descs()
1745 first_td = dbri->pipes[info->pipe].first_desc; in xmit_descs()
1751 cmd = dbri_cmdlock(dbri, 2); in xmit_descs()
1753 dbri->pipes[info->pipe].sdp in xmit_descs()
1757 dbri_cmdsend(dbri, cmd, 2); in xmit_descs()
1760 dbri->pipes[info->pipe].desc = first_td; in xmit_descs()
1764 spin_unlock_irqrestore(&dbri->lock, flags); in xmit_descs()
1781 static void transmission_complete_intr(struct snd_dbri *dbri, int pipe) in transmission_complete_intr() argument
1783 struct dbri_streaminfo *info = &dbri->stream_info[DBRI_PLAY]; in transmission_complete_intr()
1784 int td = dbri->pipes[pipe].desc; in transmission_complete_intr()
1793 status = DBRI_TD_STATUS(dbri->dma->desc[td].word4); in transmission_complete_intr()
1799 dbri->dma->desc[td].word4 = 0; /* Reset it for next time. */ in transmission_complete_intr()
1800 info->offset += DBRI_RD_CNT(dbri->dma->desc[td].word1); in transmission_complete_intr()
1802 td = dbri->next_desc[td]; in transmission_complete_intr()
1803 dbri->pipes[pipe].desc = td; in transmission_complete_intr()
1807 spin_unlock(&dbri->lock); in transmission_complete_intr()
1809 spin_lock(&dbri->lock); in transmission_complete_intr()
1812 static void reception_complete_intr(struct snd_dbri *dbri, int pipe) in reception_complete_intr() argument
1815 int rd = dbri->pipes[pipe].desc; in reception_complete_intr()
1823 dbri->pipes[pipe].desc = dbri->next_desc[rd]; in reception_complete_intr()
1824 status = dbri->dma->desc[rd].word1; in reception_complete_intr()
1825 dbri->dma->desc[rd].word1 = 0; /* Reset it for next time. */ in reception_complete_intr()
1827 info = &dbri->stream_info[DBRI_REC]; in reception_complete_intr()
1836 spin_unlock(&dbri->lock); in reception_complete_intr()
1838 spin_lock(&dbri->lock); in reception_complete_intr()
1841 static void dbri_process_one_interrupt(struct snd_dbri *dbri, int x) in dbri_process_one_interrupt() argument
1865 reception_complete_intr(dbri, channel); in dbri_process_one_interrupt()
1869 transmission_complete_intr(dbri, channel); in dbri_process_one_interrupt()
1881 int td = dbri->pipes[pipe].desc; in dbri_process_one_interrupt()
1883 dbri->dma->desc[td].word4 = 0; in dbri_process_one_interrupt()
1884 cmd = dbri_cmdlock(dbri, NoGetLock); in dbri_process_one_interrupt()
1886 dbri->pipes[pipe].sdp in dbri_process_one_interrupt()
1888 *(cmd++) = dbri->dma_dvma + dbri_dma_off(desc, td); in dbri_process_one_interrupt()
1889 dbri_cmdsend(dbri, cmd); in dbri_process_one_interrupt()
1895 if (dbri->pipes[channel].sdp & D_SDP_MSB) in dbri_process_one_interrupt()
1896 val = reverse_bytes(val, dbri->pipes[channel].length); in dbri_process_one_interrupt()
1898 if (dbri->pipes[channel].recv_fixed_ptr) in dbri_process_one_interrupt()
1899 *(dbri->pipes[channel].recv_fixed_ptr) = val; in dbri_process_one_interrupt()
1913 static void dbri_process_interrupt_buffer(struct snd_dbri *dbri) in dbri_process_interrupt_buffer() argument
1917 while ((x = dbri->dma->intr[dbri->dbri_irqp]) != 0) { in dbri_process_interrupt_buffer()
1918 dbri->dma->intr[dbri->dbri_irqp] = 0; in dbri_process_interrupt_buffer()
1919 dbri->dbri_irqp++; in dbri_process_interrupt_buffer()
1920 if (dbri->dbri_irqp == DBRI_INT_BLK) in dbri_process_interrupt_buffer()
1921 dbri->dbri_irqp = 1; in dbri_process_interrupt_buffer()
1923 dbri_process_one_interrupt(dbri, x); in dbri_process_interrupt_buffer()
1929 struct snd_dbri *dbri = dev_id; in snd_dbri_interrupt() local
1933 if (dbri == NULL) in snd_dbri_interrupt()
1935 spin_lock(&dbri->lock); in snd_dbri_interrupt()
1940 x = sbus_readl(dbri->regs + REG1); in snd_dbri_interrupt()
1970 dbri_reset(dbri); in snd_dbri_interrupt()
1972 tmp = sbus_readl(dbri->regs + REG0); in snd_dbri_interrupt()
1974 sbus_writel(tmp, dbri->regs + REG0); in snd_dbri_interrupt()
1978 dbri_process_interrupt_buffer(dbri); in snd_dbri_interrupt()
1980 spin_unlock(&dbri->lock); in snd_dbri_interrupt()
2046 struct snd_dbri *dbri = snd_pcm_substream_chip(substream); in snd_dbri_open() local
2048 struct dbri_streaminfo *info = DBRI_STREAM(dbri, substream); in snd_dbri_open()
2054 spin_lock_irqsave(&dbri->lock, flags); in snd_dbri_open()
2059 spin_unlock_irqrestore(&dbri->lock, flags); in snd_dbri_open()
2069 cs4215_open(dbri); in snd_dbri_open()
2076 struct snd_dbri *dbri = snd_pcm_substream_chip(substream); in snd_dbri_close() local
2077 struct dbri_streaminfo *info = DBRI_STREAM(dbri, substream); in snd_dbri_close()
2090 struct snd_dbri *dbri = snd_pcm_substream_chip(substream); in snd_dbri_hw_params() local
2091 struct dbri_streaminfo *info = DBRI_STREAM(dbri, substream); in snd_dbri_hw_params()
2096 ret = cs4215_prepare(dbri, params_rate(hw_params), in snd_dbri_hw_params()
2111 dma_map_single(&dbri->op->dev, in snd_dbri_hw_params()
2125 struct snd_dbri *dbri = snd_pcm_substream_chip(substream); in snd_dbri_hw_free() local
2126 struct dbri_streaminfo *info = DBRI_STREAM(dbri, substream); in snd_dbri_hw_free()
2139 dma_unmap_single(&dbri->op->dev, info->dvma_buffer, in snd_dbri_hw_free()
2144 reset_pipe(dbri, info->pipe); in snd_dbri_hw_free()
2153 struct snd_dbri *dbri = snd_pcm_substream_chip(substream); in snd_dbri_prepare() local
2154 struct dbri_streaminfo *info = DBRI_STREAM(dbri, substream); in snd_dbri_prepare()
2163 spin_lock_irq(&dbri->lock); in snd_dbri_prepare()
2169 ret = setup_descs(dbri, DBRI_STREAMNO(substream), in snd_dbri_prepare()
2172 spin_unlock_irq(&dbri->lock); in snd_dbri_prepare()
2180 struct snd_dbri *dbri = snd_pcm_substream_chip(substream); in snd_dbri_trigger() local
2181 struct dbri_streaminfo *info = DBRI_STREAM(dbri, substream); in snd_dbri_trigger()
2189 xmit_descs(dbri); in snd_dbri_trigger()
2193 reset_pipe(dbri, info->pipe); in snd_dbri_trigger()
2204 struct snd_dbri *dbri = snd_pcm_substream_chip(substream); in snd_dbri_pointer() local
2205 struct dbri_streaminfo *info = DBRI_STREAM(dbri, substream); in snd_dbri_pointer()
2269 struct snd_dbri *dbri = snd_kcontrol_chip(kcontrol); in snd_cs4215_get_volume() local
2272 if (snd_BUG_ON(!dbri)) in snd_cs4215_get_volume()
2274 info = &dbri->stream_info[kcontrol->private_value]; in snd_cs4215_get_volume()
2284 struct snd_dbri *dbri = snd_kcontrol_chip(kcontrol); in snd_cs4215_put_volume() local
2286 &dbri->stream_info[kcontrol->private_value]; in snd_cs4215_put_volume()
2312 cs4215_setdata(dbri, 1); in snd_cs4215_put_volume()
2314 cs4215_setdata(dbri, 0); in snd_cs4215_put_volume()
2335 struct snd_dbri *dbri = snd_kcontrol_chip(kcontrol); in snd_cs4215_get_single() local
2341 if (snd_BUG_ON(!dbri)) in snd_cs4215_get_single()
2346 (dbri->mm.data[elem] >> shift) & mask; in snd_cs4215_get_single()
2349 (dbri->mm.ctrl[elem - 4] >> shift) & mask; in snd_cs4215_get_single()
2360 struct snd_dbri *dbri = snd_kcontrol_chip(kcontrol); in snd_cs4215_put_single() local
2368 if (snd_BUG_ON(!dbri)) in snd_cs4215_put_single()
2377 dbri->mm.data[elem] = (dbri->mm.data[elem] & in snd_cs4215_put_single()
2379 changed = (val != dbri->mm.data[elem]); in snd_cs4215_put_single()
2381 dbri->mm.ctrl[elem - 4] = (dbri->mm.ctrl[elem - 4] & in snd_cs4215_put_single()
2383 changed = (val != dbri->mm.ctrl[elem - 4]); in snd_cs4215_put_single()
2389 dbri->mm.data[elem & 3]); in snd_cs4215_put_single()
2395 cs4215_setdata(dbri, 1); in snd_cs4215_put_single()
2397 cs4215_setdata(dbri, 0); in snd_cs4215_put_single()
2443 struct snd_dbri *dbri; in snd_dbri_mixer() local
2447 dbri = card->private_data; in snd_dbri_mixer()
2453 snd_ctl_new1(&dbri_controls[idx], dbri)); in snd_dbri_mixer()
2459 dbri->stream_info[idx].left_gain = 0; in snd_dbri_mixer()
2460 dbri->stream_info[idx].right_gain = 0; in snd_dbri_mixer()
2472 struct snd_dbri *dbri = entry->private_data; in dbri_regs_read() local
2474 snd_iprintf(buffer, "REG0: 0x%x\n", sbus_readl(dbri->regs + REG0)); in dbri_regs_read()
2475 snd_iprintf(buffer, "REG2: 0x%x\n", sbus_readl(dbri->regs + REG2)); in dbri_regs_read()
2476 snd_iprintf(buffer, "REG8: 0x%x\n", sbus_readl(dbri->regs + REG8)); in dbri_regs_read()
2477 snd_iprintf(buffer, "REG9: 0x%x\n", sbus_readl(dbri->regs + REG9)); in dbri_regs_read()
2484 struct snd_dbri *dbri = entry->private_data; in dbri_debug_read() local
2489 if (pipe_active(dbri, pipe)) { in dbri_debug_read()
2490 struct dbri_pipe *pptr = &dbri->pipes[pipe]; in dbri_debug_read()
2506 struct snd_dbri *dbri = card->private_data; in snd_dbri_proc() local
2508 snd_card_ro_proc_new(card, "regs", dbri, dbri_regs_read); in snd_dbri_proc()
2510 snd_card_ro_proc_new(card, "debug", dbri, dbri_debug_read); in snd_dbri_proc()
2519 static void snd_dbri_free(struct snd_dbri *dbri);
2525 struct snd_dbri *dbri = card->private_data; in snd_dbri_create() local
2528 spin_lock_init(&dbri->lock); in snd_dbri_create()
2529 dbri->op = op; in snd_dbri_create()
2530 dbri->irq = irq; in snd_dbri_create()
2532 dbri->dma = dma_alloc_coherent(&op->dev, sizeof(struct dbri_dma), in snd_dbri_create()
2533 &dbri->dma_dvma, GFP_KERNEL); in snd_dbri_create()
2534 if (!dbri->dma) in snd_dbri_create()
2538 dbri->dma, dbri->dma_dvma); in snd_dbri_create()
2541 dbri->regs_size = resource_size(&op->resource[0]); in snd_dbri_create()
2542 dbri->regs = of_ioremap(&op->resource[0], 0, in snd_dbri_create()
2543 dbri->regs_size, "DBRI Registers"); in snd_dbri_create()
2544 if (!dbri->regs) { in snd_dbri_create()
2547 (void *)dbri->dma, dbri->dma_dvma); in snd_dbri_create()
2551 err = request_irq(dbri->irq, snd_dbri_interrupt, IRQF_SHARED, in snd_dbri_create()
2552 "DBRI audio", dbri); in snd_dbri_create()
2554 printk(KERN_ERR "DBRI: Can't get irq %d\n", dbri->irq); in snd_dbri_create()
2555 of_iounmap(&op->resource[0], dbri->regs, dbri->regs_size); in snd_dbri_create()
2557 (void *)dbri->dma, dbri->dma_dvma); in snd_dbri_create()
2562 dbri_initialize(dbri); in snd_dbri_create()
2563 err = cs4215_init(dbri); in snd_dbri_create()
2565 snd_dbri_free(dbri); in snd_dbri_create()
2572 static void snd_dbri_free(struct snd_dbri *dbri) in snd_dbri_free() argument
2575 dbri_reset(dbri); in snd_dbri_free()
2577 if (dbri->irq) in snd_dbri_free()
2578 free_irq(dbri->irq, dbri); in snd_dbri_free()
2580 if (dbri->regs) in snd_dbri_free()
2581 of_iounmap(&dbri->op->resource[0], dbri->regs, dbri->regs_size); in snd_dbri_free()
2583 if (dbri->dma) in snd_dbri_free()
2584 dma_free_coherent(&dbri->op->dev, in snd_dbri_free()
2586 (void *)dbri->dma, dbri->dma_dvma); in snd_dbri_free()
2591 struct snd_dbri *dbri; in dbri_probe() local
2629 dbri = card->private_data; in dbri_probe()
2647 dev, dbri->regs, in dbri_probe()
2648 dbri->irq, op->dev.of_node->name[9], dbri->mm.version); in dbri_probe()
2654 snd_dbri_free(dbri); in dbri_probe()