dbri.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:68k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /* $Id: dbri.c,v 1.27 2001/10/08 22:19:50 davem Exp $
  2.  * drivers/sbus/audio/dbri.c
  3.  *
  4.  * Copyright (C) 1997 Rudolf Koenig (rfkoenig@immd4.informatik.uni-erlangen.de)
  5.  * Copyright (C) 1998, 1999 Brent Baccala (baccala@freesoft.org)
  6.  *
  7.  * This is the lowlevel driver for the DBRI & MMCODEC duo used for ISDN & AUDIO
  8.  * on Sun SPARCstation 10, 20, LX and Voyager models.
  9.  *
  10.  * - DBRI: AT&T T5900FX Dual Basic Rates ISDN Interface. It is a 32 channel
  11.  *   data time multiplexer with ISDN support (aka T7259)
  12.  *   Interfaces: SBus,ISDN NT & TE, CHI, 4 bits parallel.
  13.  *   CHI: (spelled ki) Concentration Highway Interface (AT&T or Intel bus ?).
  14.  *   Documentation:
  15.  *   - "STP 4000SBus Dual Basic Rate ISDN (DBRI) Tranceiver" from
  16.  *     Sparc Technology Business (courtesy of Sun Support)
  17.  *   - Data sheet of the T7903, a newer but very similar ISA bus equivalent
  18.  *     available from the Lucent (formarly AT&T microelectronics) home
  19.  *     page.
  20.  *   - http://www.freesoft.org/Linux/DBRI/
  21.  * - MMCODEC: Crystal Semiconductor CS4215 16 bit Multimedia Audio Codec
  22.  *   Interfaces: CHI, Audio In & Out, 2 bits parallel
  23.  *   Documentation: from the Crystal Semiconductor home page.
  24.  *
  25.  * The DBRI is a 32 pipe machine, each pipe can transfer some bits between
  26.  * memory and a serial device (long pipes, nr 0-15) or between two serial
  27.  * devices (short pipes, nr 16-31), or simply send a fixed data to a serial
  28.  * device (short pipes).
  29.  * A timeslot defines the bit-offset and nr of bits read from a serial device.
  30.  * The timeslots are linked to 6 circular lists, one for each direction for
  31.  * each serial device (NT,TE,CHI). A timeslot is associated to 1 or 2 pipes
  32.  * (the second one is a monitor/tee pipe, valid only for serial input).
  33.  *
  34.  * The mmcodec is connected via the CHI bus and needs the data & some
  35.  * parameters (volume, balance, output selection) timemultiplexed in 8 byte
  36.  * chunks. It also has a control mode, which serves for audio format setting.
  37.  *
  38.  * Looking at the CS4215 data sheet it is easy to set up 2 or 4 codecs on
  39.  * the same CHI bus, so I thought perhaps it is possible to use the onboard
  40.  * & the speakerbox codec simultanously, giving 2 (not very independent :-)
  41.  * audio devices. But the SUN HW group decided against it, at least on my
  42.  * LX the speakerbox connector has at least 1 pin missing and 1 wrongly
  43.  * connected.
  44.  */
  45. #include <linux/module.h>
  46. #include <linux/kernel.h>
  47. #include <linux/sched.h>
  48. #include <linux/errno.h>
  49. #include <linux/interrupt.h>
  50. #include <linux/slab.h>
  51. #include <linux/version.h>
  52. #include <linux/delay.h>
  53. #include <asm/openprom.h>
  54. #include <asm/oplib.h>
  55. #include <asm/system.h>
  56. #include <asm/irq.h>
  57. #include <asm/io.h>
  58. #include <asm/sbus.h>
  59. #include <asm/pgtable.h>
  60. #include <asm/audioio.h>
  61. #include "dbri.h"
  62. #if defined(DBRI_ISDN)
  63. #include "../../isdn/hisax/hisax.h"
  64. #include "../../isdn/hisax/isdnl1.h"
  65. #include "../../isdn/hisax/foreign.h"
  66. #endif
  67. #define DBRI_DEBUG
  68. #ifdef DBRI_DEBUG
  69. #define dprintk(a, x) if(dbri_debug & a) printk x
  70. #define D_GEN (1<<0)
  71. #define D_INT (1<<1)
  72. #define D_CMD (1<<2)
  73. #define D_MM (1<<3)
  74. #define D_USR (1<<4)
  75. #define D_DESC (1<<5)
  76. static int dbri_debug = 0;
  77. MODULE_PARM(dbri_debug, "i");
  78. static int dbri_trace = 0;
  79. MODULE_PARM(dbri_trace, "i");
  80. #define tprintk(x) if(dbri_trace) printk x
  81. static char *cmds[] = { 
  82.   "WAIT", "PAUSE", "JUMP", "IIQ", "REX", "SDP", "CDP", "DTS",
  83.   "SSP", "CHI", "NT", "TE", "CDEC", "TEST", "CDM", "RESRV"
  84. };
  85. #define DBRI_CMD(cmd, intr, value) ((cmd << 28) | (1 << 27) | value)
  86. #else
  87. #define dprintk(a, x)
  88. #define DBRI_CMD(cmd, intr, value) ((cmd << 28) | (intr << 27) | value)
  89. #endif /* DBRI_DEBUG */
  90. #define MAX_DRIVERS 2 /* Increase this if need more than 2 DBRI's */
  91. static struct sparcaudio_driver drivers[MAX_DRIVERS];
  92. static int num_drivers = 0;
  93. /*
  94. ****************************************************************************
  95. ************** DBRI initialization and command synchronization *************
  96. ****************************************************************************
  97. Commands are sent to the DBRI by building a list of them in memory,
  98. then writing the address of the first list item to DBRI register 8.
  99. The list is terminated with a WAIT command, which can generate a
  100. CPU interrupt if required.
  101. Since the DBRI can run in parallel with the CPU, several means of
  102. synchronization present themselves.  The original scheme (Rudolf's)
  103. was to set a flag when we "cmdlock"ed the DBRI, clear the flag when
  104. an interrupt signaled completion, and wait on a wait_queue if a routine
  105. attempted to cmdlock while the flag was set.  The problems arose when
  106. we tried to cmdlock from inside an interrupt handler, which might
  107. cause scheduling in an interrupt (if we waited), etc, etc
  108. A more sophisticated scheme might involve a circular command buffer
  109. or an array of command buffers.  A routine could fill one with
  110. commands and link it onto a list.  When a interrupt signaled
  111. completion of the current command buffer, look on the list for
  112. the next one.
  113. I've decided to implement something much simpler - after each command,
  114. the CPU waits for the DBRI to finish the command by polling the P bit
  115. in DBRI register 0.  I've tried to implement this in such a way
  116. that might make implementing a more sophisticated scheme easier.
  117. Every time a routine wants to write commands to the DBRI, it must
  118. first call dbri_cmdlock() and get an initial pointer into dbri->dma->cmd
  119. in return.  After the commands have been writen, dbri_cmdsend() is
  120. called with the final pointer value.
  121. Something a little more clever is required if this code is ever run
  122. on an SMP machine.
  123. */
  124. static int dbri_locked = 0;
  125. static volatile s32 *dbri_cmdlock(struct dbri *dbri)
  126. {
  127.         if (dbri_locked)
  128.                 printk("DBRI: Command buffer locked! (bug in driver)n");
  129.         dbri_locked++;
  130.         return &dbri->dma->cmd[0];
  131. }
  132. static void dbri_process_interrupt_buffer(struct dbri *);
  133. static void dbri_cmdsend(struct dbri *dbri, volatile s32 *cmd)
  134. {
  135. int MAXLOOPS = 1000000;
  136. int maxloops = MAXLOOPS;
  137. unsigned long flags;
  138. volatile s32 *ptr;
  139. for (ptr = &dbri->dma->cmd[0]; ptr < cmd; ptr++) {
  140. dprintk(D_CMD, ("DBRI cmd: %lx:%08xn",
  141. (unsigned long) ptr, *ptr));
  142. }
  143. save_and_cli(flags);
  144.         dbri_locked--;
  145.         if (dbri_locked != 0) {
  146.                 printk("DBRI: Command buffer improperly locked! (bug in driver)n");
  147.         } else if ((cmd - &dbri->dma->cmd[0]) >= DBRI_NO_CMDS-1) {
  148.                 printk("DBRI: Command buffer overflow! (bug in driver)n");
  149.         } else {
  150.                 *(cmd++) = DBRI_CMD(D_PAUSE, 0, 0);
  151. *(cmd++) = DBRI_CMD(D_WAIT, 1, 0);
  152. dbri->wait_seen = 0;
  153.                 sbus_writel(dbri->dma_dvma, dbri->regs + REG8);
  154. while ((--maxloops) > 0 &&
  155.                        (sbus_readl(dbri->regs + REG0) & D_P))
  156.                         barrier();
  157. if (maxloops == 0) {
  158. printk("DBRI: Chip never completed command buffern");
  159. } else {
  160. while ((--maxloops) > 0 && (! dbri->wait_seen))
  161. dbri_process_interrupt_buffer(dbri);
  162. if (maxloops == 0) {
  163. printk("DBRI: Chip never acked WAITn");
  164. } else {
  165. dprintk(D_INT, ("DBRI: Chip completed command "
  166.                                                 "buffer (%d)n",
  167. MAXLOOPS - maxloops));
  168. }
  169. }
  170.         }
  171. restore_flags(flags);
  172. }
  173. static void dbri_reset(struct dbri *dbri)
  174. {
  175. int i;
  176. dprintk(D_GEN, ("DBRI: reset 0:%x 2:%x 8:%x 9:%xn",
  177.                         sbus_readl(dbri->regs + REG0),
  178.                         sbus_readl(dbri->regs + REG2),
  179.                         sbus_readl(dbri->regs + REG8),
  180.                         sbus_readl(dbri->regs + REG9)));
  181. sbus_writel(D_R, dbri->regs + REG0); /* Soft Reset */
  182. for(i = 0; (sbus_readl(dbri->regs + REG0) & D_R) && i < 64; i++)
  183. udelay(10);
  184. }
  185. static void dbri_detach(struct dbri *dbri)
  186. {
  187. dbri_reset(dbri);
  188.         free_irq(dbri->irq, dbri);
  189.         sbus_iounmap(dbri->regs, dbri->regs_size);
  190.         sbus_free_consistent(dbri->sdev, sizeof(struct dbri_dma),
  191.                              (void *)dbri->dma, dbri->dma_dvma);
  192.         kfree(dbri);
  193. }
  194. static void dbri_initialize(struct dbri *dbri)
  195. {
  196. volatile s32 *cmd;
  197.         u32 dma_addr, tmp;
  198.         int n;
  199.         dbri_reset(dbri);
  200. dprintk(D_GEN, ("DBRI: init: cmd: %p, int: %pn",
  201. &dbri->dma->cmd[0], &dbri->dma->intr[0]));
  202. /*
  203.  * Initialize the interrupt ringbuffer.
  204.  */
  205. for(n = 0; n < DBRI_NO_INTS-1; n++) {
  206.                 dma_addr = dbri->dma_dvma;
  207.                 dma_addr += dbri_dma_off(intr, ((n+1) & DBRI_INT_BLK));
  208. dbri->dma->intr[n * DBRI_INT_BLK] = dma_addr;
  209.         }
  210.         dma_addr = dbri->dma_dvma + dbri_dma_off(intr, 0);
  211. dbri->dma->intr[n * DBRI_INT_BLK] = dma_addr;
  212. dbri->dbri_irqp = 1;
  213.         /* We should query the openprom to see what burst sizes this
  214.          * SBus supports.  For now, just disable all SBus bursts */
  215.         tmp = sbus_readl(dbri->regs + REG0);
  216.         tmp &= ~(D_G | D_S | D_E);
  217.         sbus_writel(tmp, dbri->regs + REG0);
  218. /*
  219.  * Set up the interrupt queue
  220.  */
  221. cmd = dbri_cmdlock(dbri);
  222.         dma_addr = dbri->dma_dvma + dbri_dma_off(intr, 0);
  223. *(cmd++) = DBRI_CMD(D_IIQ, 0, 0);
  224. *(cmd++) = dma_addr;
  225.         dbri_cmdsend(dbri, cmd);
  226. }
  227. /*
  228. ****************************************************************************
  229. *************************** DBRI interrupt handler *************************
  230. ****************************************************************************
  231. The DBRI communicates with the CPU mainly via a circular interrupt
  232. buffer.  When an interrupt is signaled, the CPU walks through the
  233. buffer and calls dbri_process_one_interrupt() for each interrupt word.
  234. Complicated interrupts are handled by dedicated functions (which
  235. appear first in this file).  Any pending interrupts can be serviced by
  236. calling dbri_process_interrupt_buffer(), which works even if the CPU's
  237. interrupts are disabled.  This function is used by dbri_cmdsend()
  238. to make sure we're synced up with the chip after each command sequence,
  239. even if we're running cli'ed.
  240. */
  241. /*
  242.  * Short data pipes transmit LSB first. The CS4215 receives MSB first. Grrr.
  243.  * So we have to reverse the bits. Note: not all bit lengths are supported
  244.  */
  245. static __u32 reverse_bytes(__u32 b, int len)
  246. {
  247. switch(len) {
  248.         case 32:
  249.                 b = ((b & 0xffff0000) >> 16) | ((b & 0x0000ffff) << 16);
  250.         case 16:
  251.                 b = ((b & 0xff00ff00) >>  8) | ((b & 0x00ff00ff) <<  8);
  252.         case 8:
  253.                 b = ((b & 0xf0f0f0f0) >>  4) | ((b & 0x0f0f0f0f) <<  4);
  254.         case 4:
  255.                 b = ((b & 0xcccccccc) >>  2) | ((b & 0x33333333) <<  2);
  256.         case 2:
  257.                 b = ((b & 0xaaaaaaaa) >>  1) | ((b & 0x55555555) <<  1);
  258.         case 1:
  259. case 0:
  260.                 break;
  261.         default:
  262.                 printk("DBRI reverse_bytes: unsupported lengthn");
  263. };
  264. return b;
  265. }
  266. /* transmission_complete_intr()
  267.  *
  268.  * Called by main interrupt handler when DBRI signals transmission complete
  269.  * on a pipe (interrupt triggered by the B bit in a transmit descriptor).
  270.  *
  271.  * Walks through the pipe's list of transmit buffer descriptors, releasing
  272.  * each one's DMA buffer (if present), flagging the descriptor available,
  273.  * and signaling its callback routine (if present), before proceeding
  274.  * to the next one.  Stops when the first descriptor is found without
  275.  * TBC (Transmit Buffer Complete) set, or we've run through them all.
  276.  */
  277. static void transmission_complete_intr(struct dbri *dbri, int pipe)
  278. {
  279. int td;
  280.         int status;
  281.         void *buffer;
  282.         void (*callback)(void *, int);
  283. void *callback_arg;
  284. td = dbri->pipes[pipe].desc;
  285. while (td >= 0) {
  286.                 if (td >= DBRI_NO_DESCS) {
  287.                         printk("DBRI: invalid td on pipe %dn", pipe);
  288.                         return;
  289.                 }
  290. status = DBRI_TD_STATUS(dbri->dma->desc[td].word4);
  291. if (! (status & DBRI_TD_TBC)) {
  292. break;
  293. }
  294. dprintk(D_INT, ("DBRI: TD %d, status 0x%02xn", td, status));
  295.                 buffer = dbri->descs[td].buffer;
  296.                 if (buffer)
  297.                         sbus_unmap_single(dbri->sdev,
  298.                                           dbri->descs[td].buffer_dvma,
  299.                                           dbri->descs[td].len,
  300.                                           SBUS_DMA_TODEVICE);
  301.                 callback = dbri->descs[td].output_callback;
  302. callback_arg = dbri->descs[td].output_callback_arg;
  303.                 dbri->descs[td].inuse = 0;
  304. td = dbri->descs[td].next;
  305. dbri->pipes[pipe].desc = td;
  306. if (callback != NULL)
  307. callback(callback_arg, status & 0xe);
  308.         }
  309. }
  310. static void reception_complete_intr(struct dbri *dbri, int pipe)
  311. {
  312.         int rd = dbri->pipes[pipe].desc;
  313.         s32 status;
  314.         void *buffer;
  315.         void (*callback)(void *, int, unsigned int);
  316.         if (rd < 0 || rd >= DBRI_NO_DESCS) {
  317.                 printk("DBRI: invalid rd on pipe %dn", pipe);
  318.                 return;
  319.         }
  320.         dbri->descs[rd].inuse = 0;
  321. dbri->pipes[pipe].desc = dbri->descs[rd].next;
  322.         status = dbri->dma->desc[rd].word1;
  323.         buffer = dbri->descs[rd].buffer;
  324.         if (buffer)
  325.                 sbus_unmap_single(dbri->sdev,
  326.                                   dbri->descs[rd].buffer_dvma,
  327.                                   dbri->descs[rd].len,
  328.                                   SBUS_DMA_FROMDEVICE);
  329.         callback = dbri->descs[rd].input_callback;
  330.         if (callback != NULL)
  331.                 callback(dbri->descs[rd].input_callback_arg,
  332.                          DBRI_RD_STATUS(status),
  333.                          DBRI_RD_CNT(status)-2);
  334. dprintk(D_INT, ("DBRI: Recv RD %d, status 0x%02x, len %dn",
  335. rd, DBRI_RD_STATUS(status), DBRI_RD_CNT(status)));
  336. }
  337. static void dbri_process_one_interrupt(struct dbri *dbri, int x)
  338. {
  339. int val = D_INTR_GETVAL(x);
  340. int channel = D_INTR_GETCHAN(x);
  341. int command = D_INTR_GETCMD(x);
  342. int code = D_INTR_GETCODE(x);
  343. int rval = D_INTR_GETRVAL(x);
  344. if (channel == D_INTR_CMD) {
  345. dprintk(D_INT,("DBRI: INTR: Command: %-5s  Value:%dn",
  346.        cmds[command], val));
  347. } else {
  348. dprintk(D_INT,("DBRI: INTR: Chan:%d Code:%d Val:%#xn",
  349.        channel, code, rval));
  350. }
  351. if (channel == D_INTR_CMD && command == D_WAIT)
  352. dbri->wait_seen++;
  353. if (code == D_INTR_SBRI) {
  354. /* SBRI - BRI status change */
  355. const int liu_states[] = {1, 0, 8, 3, 4, 5, 6, 7};
  356. dbri->liu_state = liu_states[val & 0x7];
  357. if (dbri->liu_callback)
  358. dbri->liu_callback(dbri->liu_callback_arg);
  359. }
  360. if (code == D_INTR_BRDY)
  361. reception_complete_intr(dbri, channel);
  362. if (code == D_INTR_XCMP)
  363. transmission_complete_intr(dbri, channel);
  364. if (code == D_INTR_UNDR) {
  365. /* UNDR - Transmission underrun
  366.  * resend SDP command with clear pipe bit (C) set
  367.  */
  368. volatile s32 *cmd;
  369. int pipe = channel;
  370. int td = dbri->pipes[pipe].desc;
  371. dbri->dma->desc[td].word4 = 0;
  372. cmd = dbri_cmdlock(dbri);
  373. *(cmd++) = DBRI_CMD(D_SDP, 0,
  374.     dbri->pipes[pipe].sdp
  375.     | D_SDP_P | D_SDP_C | D_SDP_2SAME);
  376.                 *(cmd++) = dbri->dma_dvma + dbri_dma_off(desc, td);
  377. dbri_cmdsend(dbri, cmd);
  378. }
  379. if (code == D_INTR_FXDT) {
  380. /* FXDT - Fixed data change */
  381. if (dbri->pipes[channel].sdp & D_SDP_MSB)
  382. val = reverse_bytes(val, dbri->pipes[channel].length);
  383. if (dbri->pipes[channel].recv_fixed_ptr)
  384. *(dbri->pipes[channel].recv_fixed_ptr) = val;
  385. }
  386. }
  387. /* dbri_process_interrupt_buffer advances through the DBRI's interrupt
  388.  * buffer until it finds a zero word (indicating nothing more to do
  389.  * right now).  Non-zero words require processing and are handed off
  390.  * to dbri_process_one_interrupt AFTER advancing the pointer.  This
  391.  * order is important since we might recurse back into this function
  392.  * and need to make sure the pointer has been advanced first.
  393.  */
  394. static void dbri_process_interrupt_buffer(struct dbri *dbri)
  395. {
  396. s32 x;
  397. while ((x = dbri->dma->intr[dbri->dbri_irqp]) != 0) {
  398. dbri->dma->intr[dbri->dbri_irqp] = 0;
  399. dbri->dbri_irqp++;
  400. if (dbri->dbri_irqp == (DBRI_NO_INTS * DBRI_INT_BLK))
  401. dbri->dbri_irqp = 1;
  402. else if ((dbri->dbri_irqp & (DBRI_INT_BLK-1)) == 0)
  403. dbri->dbri_irqp++;
  404. tprintk(("dbri->dbri_irqp == %dn", dbri->dbri_irqp));
  405. dbri_process_one_interrupt(dbri, x);
  406. }
  407. }
  408. static void dbri_intr(int irq, void *opaque, struct pt_regs *regs)
  409. {
  410. struct dbri *dbri = (struct dbri *) opaque;
  411. int x;
  412. /*
  413.  * Read it, so the interrupt goes away.
  414.  */
  415. x = sbus_readl(dbri->regs + REG1);
  416. dprintk(D_INT, ("DBRI: Interrupt!  (reg1=0x%08x)n", x));
  417. if (x & (D_MRR|D_MLE|D_LBG|D_MBE)) {
  418.                 u32 tmp;
  419. if(x & D_MRR) printk("DBRI: Multiple Error Ack on SBusn");
  420. if(x & D_MLE) printk("DBRI: Multiple Late Error on SBusn");
  421. if(x & D_LBG) printk("DBRI: Lost Bus Grant on SBusn");
  422. if(x & D_MBE) printk("DBRI: Burst Error on SBusn");
  423. /* Some of these SBus errors cause the chip's SBus circuitry
  424.  * to be disabled, so just re-enable and try to keep going.
  425.  *
  426.  * The only one I've seen is MRR, which will be triggered
  427.  * if you let a transmit pipe underrun, then try to CDP it.
  428.  *
  429.  * If these things persist, we should probably reset
  430.  * and re-init the chip.
  431.  */
  432.                 tmp = sbus_readl(dbri->regs + REG0);
  433.                 tmp &= ~(D_D);
  434.                 sbus_writel(tmp, dbri->regs + REG0);
  435. }
  436. #if 0
  437. if (!(x & D_IR)) /* Not for us */
  438. return;
  439. #endif
  440. dbri_process_interrupt_buffer(dbri);
  441. }
  442. /*
  443. ****************************************************************************
  444. ************************** DBRI data pipe management ***********************
  445. ****************************************************************************
  446. While DBRI control functions use the command and interrupt buffers, the
  447. main data path takes the form of data pipes, which can be short (command
  448. and interrupt driven), or long (attached to DMA buffers).  These functions
  449. provide a rudimentary means of setting up and managing the DBRI's pipes,
  450. but the calling functions have to make sure they respect the pipes' linked
  451. list ordering, among other things.  The transmit and receive functions
  452. here interface closely with the transmit and receive interrupt code.
  453. */
  454. static int pipe_active(struct dbri *dbri, int pipe)
  455. {
  456. return (dbri->pipes[pipe].desc != -1);
  457. }
  458. /* reset_pipe(dbri, pipe)
  459.  *
  460.  * Called on an in-use pipe to clear anything being transmitted or received
  461.  */
  462. static void reset_pipe(struct dbri *dbri, int pipe)
  463. {
  464.         int sdp;
  465. int desc;
  466.         volatile int *cmd;
  467.         if (pipe < 0 || pipe > 31) {
  468.                 printk("DBRI: reset_pipe called with illegal pipe numbern");
  469.                 return;
  470.         }
  471.         sdp = dbri->pipes[pipe].sdp;
  472.         if (sdp == 0) {
  473.                 printk("DBRI: reset_pipe called on uninitialized pipen");
  474.                 return;
  475.         }
  476.         cmd = dbri_cmdlock(dbri);
  477.         *(cmd++) = DBRI_CMD(D_SDP, 0, sdp | D_SDP_C | D_SDP_P);
  478.         *(cmd++) = 0;
  479.         dbri_cmdsend(dbri, cmd);
  480. desc = dbri->pipes[pipe].desc;
  481. while (desc != -1) {
  482. void *buffer = dbri->descs[desc].buffer;
  483. void (*output_callback) (void *, int)
  484. = dbri->descs[desc].output_callback;
  485. void *output_callback_arg
  486. = dbri->descs[desc].output_callback_arg;
  487. void (*input_callback) (void *, int, unsigned int)
  488. = dbri->descs[desc].input_callback;
  489. void *input_callback_arg
  490. = dbri->descs[desc].input_callback_arg;
  491. if (buffer)
  492.                         sbus_unmap_single(dbri->sdev,
  493.                                           dbri->descs[desc].buffer_dvma,
  494.                                           dbri->descs[desc].len,
  495.                                           output_callback != NULL ? SBUS_DMA_TODEVICE
  496.                                           : SBUS_DMA_FROMDEVICE);
  497. dbri->descs[desc].inuse = 0;
  498. desc = dbri->descs[desc].next;
  499. if (output_callback)
  500. output_callback(output_callback_arg, -1);
  501. if (input_callback)
  502. input_callback(input_callback_arg, -1, 0);
  503. }
  504.         dbri->pipes[pipe].desc = -1;
  505. }
  506. static void setup_pipe(struct dbri *dbri, int pipe, int sdp)
  507. {
  508.         if (pipe < 0 || pipe > 31) {
  509.                 printk("DBRI: setup_pipe called with illegal pipe numbern");
  510.                 return;
  511.         }
  512.         if ((sdp & 0xf800) != sdp) {
  513.                 printk("DBRI: setup_pipe called with strange SDP valuen");
  514.                 /* sdp &= 0xf800; */
  515.         }
  516. /* If this is a fixed receive pipe, arrange for an interrupt
  517.  * every time its data changes
  518.  */
  519. if (D_SDP_MODE(sdp) == D_SDP_FIXED && ! (sdp & D_SDP_TO_SER))
  520. sdp |= D_SDP_CHANGE;
  521.         sdp |= D_PIPE(pipe);
  522.         dbri->pipes[pipe].sdp = sdp;
  523. dbri->pipes[pipe].desc = -1;
  524.         reset_pipe(dbri, pipe);
  525. }
  526. static void link_time_slot(struct dbri *dbri, int pipe,
  527.    enum in_or_out direction, int basepipe,
  528.    int length, int cycle)
  529. {
  530.         volatile s32 *cmd;
  531.         int val;
  532. int prevpipe;
  533. int nextpipe;
  534. if (pipe < 0 || pipe > 31 || basepipe < 0 || basepipe > 31) {
  535. printk("DBRI: link_time_slot called with illegal pipe numbern");
  536. return;
  537. }
  538. if (dbri->pipes[pipe].sdp == 0 || dbri->pipes[basepipe].sdp == 0) {
  539. printk("DBRI: link_time_slot called on uninitialized pipen");
  540. return;
  541. }
  542. /* Deal with CHI special case:
  543.  * "If transmission on edges 0 or 1 is desired, then cycle n
  544.  *  (where n = # of bit times per frame...) must be used."
  545.  *                  - DBRI data sheet, page 11
  546.  */
  547. if (basepipe == 16 && direction == PIPEoutput && cycle == 0)
  548. cycle = dbri->chi_bpf;
  549. if (basepipe == pipe) {
  550. prevpipe = pipe;
  551. nextpipe = pipe;
  552.         } else {
  553. /* We're not initializing a new linked list (basepipe != pipe),
  554.  * so run through the linked list and find where this pipe
  555.  * should be sloted in, based on its cycle.  CHI confuses
  556.  * things a bit, since it has a single anchor for both its
  557.  * transmit and receive lists.
  558.                  */
  559. if (basepipe == 16) {
  560. if (direction == PIPEinput) {
  561. prevpipe = dbri->chi_in_pipe;
  562. } else {
  563. prevpipe = dbri->chi_out_pipe;
  564. }
  565. } else {
  566. prevpipe = basepipe;
  567. }
  568. nextpipe = dbri->pipes[prevpipe].nextpipe;
  569. while (dbri->pipes[nextpipe].cycle < cycle
  570. && dbri->pipes[nextpipe].nextpipe != basepipe) {
  571. prevpipe = nextpipe;
  572. nextpipe = dbri->pipes[nextpipe].nextpipe;
  573.                 }
  574. }
  575. if (prevpipe == 16) {
  576. if (direction == PIPEinput) {
  577. dbri->chi_in_pipe = pipe;
  578. } else {
  579. dbri->chi_out_pipe = pipe;
  580. }
  581. } else {
  582. dbri->pipes[prevpipe].nextpipe = pipe;
  583.         }
  584. dbri->pipes[pipe].nextpipe = nextpipe;
  585. dbri->pipes[pipe].cycle = cycle;
  586. dbri->pipes[pipe].length = length;
  587. cmd = dbri_cmdlock(dbri);
  588. if (direction == PIPEinput) {
  589. val = D_DTS_VI | D_DTS_INS | D_DTS_PRVIN(prevpipe) | pipe;
  590. *(cmd++) = DBRI_CMD(D_DTS, 0, val);
  591. *(cmd++) = D_TS_LEN(length) | D_TS_CYCLE(cycle) | D_TS_NEXT(nextpipe);
  592. *(cmd++) = 0;
  593. } else {
  594. val = D_DTS_VO | D_DTS_INS | D_DTS_PRVOUT(prevpipe) | pipe;
  595. *(cmd++) = DBRI_CMD(D_DTS, 0, val);
  596. *(cmd++) = 0;
  597. *(cmd++) = D_TS_LEN(length) | D_TS_CYCLE(cycle) | D_TS_NEXT(nextpipe);
  598. }
  599.         dbri_cmdsend(dbri, cmd);
  600. }
  601. /* I don't use this function, so it's basically untested. */
  602. static void unlink_time_slot(struct dbri *dbri, int pipe,
  603.      enum in_or_out direction, int prevpipe,
  604.      int nextpipe)
  605. {
  606.         volatile s32 *cmd;
  607.         int val;
  608.         if (pipe < 0 || pipe > 31 || prevpipe < 0 || prevpipe > 31) {
  609. printk("DBRI: unlink_time_slot called with illegal pipe numbern");
  610.                 return;
  611.         }
  612.         cmd = dbri_cmdlock(dbri);
  613.         if (direction == PIPEinput) {
  614. val = D_DTS_VI | D_DTS_DEL | D_DTS_PRVIN(prevpipe) | pipe;
  615.                 *(cmd++) = DBRI_CMD(D_DTS, 0, val);
  616. *(cmd++) = D_TS_NEXT(nextpipe);
  617.                 *(cmd++) = 0;
  618.         } else {
  619. val = D_DTS_VO | D_DTS_DEL | D_DTS_PRVOUT(prevpipe) | pipe;
  620.                 *(cmd++) = DBRI_CMD(D_DTS, 0, val);
  621.                 *(cmd++) = 0;
  622. *(cmd++) = D_TS_NEXT(nextpipe);
  623.         }
  624.         dbri_cmdsend(dbri, cmd);
  625. }
  626. /* xmit_fixed() / recv_fixed()
  627.  *
  628.  * Transmit/receive data on a "fixed" pipe - i.e, one whose contents are not
  629.  * expected to change much, and which we don't need to buffer.
  630.  * The DBRI only interrupts us when the data changes (receive pipes),
  631.  * or only changes the data when this function is called (transmit pipes).
  632.  * Only short pipes (numbers 16-31) can be used in fixed data mode.
  633.  *
  634.  * These function operate on a 32-bit field, no matter how large
  635.  * the actual time slot is.  The interrupt handler takes care of bit
  636.  * ordering and alignment.  An 8-bit time slot will always end up
  637.  * in the low-order 8 bits, filled either MSB-first or LSB-first,
  638.  * depending on the settings passed to setup_pipe()
  639.  */
  640. static void xmit_fixed(struct dbri *dbri, int pipe, unsigned int data)
  641. {
  642.         volatile s32 *cmd;
  643.         if (pipe < 16 || pipe > 31) {
  644. printk("DBRI: xmit_fixed: Illegal pipe numbern");
  645. return;
  646. }
  647. if (D_SDP_MODE(dbri->pipes[pipe].sdp) == 0) {
  648. printk("DBRI: xmit_fixed: Uninitialized pipe %dn", pipe);
  649.                 return;
  650.         }
  651.         if (D_SDP_MODE(dbri->pipes[pipe].sdp) != D_SDP_FIXED) {
  652. printk("DBRI: xmit_fixed: Non-fixed pipe %dn", pipe);
  653.                 return;
  654.         }
  655.         if (! (dbri->pipes[pipe].sdp & D_SDP_TO_SER)) {
  656. printk("DBRI: xmit_fixed: Called on receive pipe %dn", pipe);
  657.                 return;
  658.         }
  659.         /* DBRI short pipes always transmit LSB first */
  660.         if (dbri->pipes[pipe].sdp & D_SDP_MSB)
  661.                 data = reverse_bytes(data, dbri->pipes[pipe].length);
  662.         cmd = dbri_cmdlock(dbri);
  663.         *(cmd++) = DBRI_CMD(D_SSP, 0, pipe);
  664.         *(cmd++) = data;
  665.         dbri_cmdsend(dbri, cmd);
  666. }
  667. static void recv_fixed(struct dbri *dbri, int pipe, volatile __u32 *ptr)
  668. {
  669.         if (pipe < 16 || pipe > 31) {
  670.                 printk("DBRI: recv_fixed called with illegal pipe numbern");
  671.                 return;
  672.         }
  673.         if (D_SDP_MODE(dbri->pipes[pipe].sdp) != D_SDP_FIXED) {
  674. printk("DBRI: recv_fixed called on non-fixed pipe %dn", pipe);
  675.                 return;
  676.         }
  677.         if (dbri->pipes[pipe].sdp & D_SDP_TO_SER) {
  678. printk("DBRI: recv_fixed called on transmit pipe %dn", pipe);
  679.                 return;
  680.         }
  681.         dbri->pipes[pipe].recv_fixed_ptr = ptr;
  682. }
  683. /* xmit_on_pipe() / recv_on_pipe()
  684.  *
  685.  * Transmit/receive data on a "long" pipe - i.e, one associated
  686.  * with a DMA buffer.
  687.  *
  688.  * Only pipe numbers 0-15 can be used in this mode.
  689.  *
  690.  * Both functions take pointer/len arguments pointing to a data buffer,
  691.  * and both provide callback functions (may be NULL) to notify higher
  692.  * level code when transmission/reception is complete.
  693.  *
  694.  * Both work by building chains of descriptors which identify the
  695.  * data buffers.  Buffers too large for a single descriptor will
  696.  * be spread across multiple descriptors.
  697.  */
  698. static void xmit_on_pipe(struct dbri *dbri, int pipe,
  699.                          void * buffer, unsigned int len,
  700.                          void (*callback)(void *, int), void * callback_arg)
  701. {
  702.         volatile s32 *cmd;
  703. unsigned long flags;
  704.         int td = 0;
  705.         int first_td = -1;
  706. int last_td = -1;
  707.         __u32 dvma_buffer, dvma_buffer_base;
  708.         if (pipe < 0 || pipe > 15) {
  709. printk("DBRI: xmit_on_pipe: Illegal pipe numbern");
  710.                 return;
  711.         }
  712.         if (dbri->pipes[pipe].sdp == 0) {
  713. printk("DBRI: xmit_on_pipe: Uninitialized pipe %dn", pipe);
  714.                 return;
  715.         }
  716.         if (! (dbri->pipes[pipe].sdp & D_SDP_TO_SER)) {
  717. printk("DBRI: xmit_on_pipe: Called on receive pipe %dn",
  718.        pipe);
  719.                 return;
  720.         }
  721.         dvma_buffer_base = dvma_buffer = sbus_map_single(dbri->sdev, buffer, len,
  722.  SBUS_DMA_TODEVICE);
  723.         while (len > 0) {
  724.                 int mylen;
  725. for (; td < DBRI_NO_DESCS; td ++) {
  726.                         if (! dbri->descs[td].inuse)
  727.                                 break;
  728.                 }
  729.                 if (td == DBRI_NO_DESCS) {
  730. printk("DBRI: xmit_on_pipe: No descriptorsn");
  731.                         break;
  732.                 }
  733.                 if (len > ((1 << 13) - 1)) {
  734.                         mylen = (1 << 13) - 1;
  735.                 } else {
  736.                         mylen = len;
  737.                 }
  738.                 dbri->descs[td].inuse = 1;
  739.                 dbri->descs[td].next = -1;
  740.                 dbri->descs[td].buffer = NULL;
  741.                 dbri->descs[td].output_callback = NULL;
  742.                 dbri->descs[td].input_callback = NULL;
  743.                 dbri->dma->desc[td].word1 = DBRI_TD_CNT(mylen);
  744.                 dbri->dma->desc[td].ba = dvma_buffer;
  745.                 dbri->dma->desc[td].nda = 0;
  746.                 dbri->dma->desc[td].word4 = 0;
  747.                 if (first_td == -1) {
  748.                         first_td = td;
  749.                 } else {
  750.                         dbri->descs[last_td].next = td;
  751.                         dbri->dma->desc[last_td].nda =
  752.                                 dbri->dma_dvma + dbri_dma_off(desc, td);
  753.                 }
  754.                 last_td = td;
  755.                 dvma_buffer += mylen;
  756.                 len -= mylen;
  757.         }
  758. if (first_td == -1 || last_td == -1) {
  759. sbus_unmap_single(dbri->sdev, dvma_buffer_base,
  760.   dvma_buffer - dvma_buffer_base + len,
  761.   SBUS_DMA_TODEVICE);
  762.                 return;
  763.         }
  764.         dbri->dma->desc[last_td].word1 |= DBRI_TD_I | DBRI_TD_F | DBRI_TD_B;
  765.         dbri->descs[last_td].buffer = buffer;
  766.         dbri->descs[last_td].buffer_dvma = dvma_buffer_base;
  767.         dbri->descs[last_td].len = dvma_buffer - dvma_buffer_base + len;
  768.         dbri->descs[last_td].output_callback = callback;
  769.         dbri->descs[last_td].output_callback_arg = callback_arg;
  770. for (td=first_td; td != -1; td = dbri->descs[td].next) {
  771. dprintk(D_DESC, ("DBRI TD %d: %08x %08x %08x %08xn",
  772.  td,
  773.  dbri->dma->desc[td].word1,
  774.  dbri->dma->desc[td].ba,
  775.  dbri->dma->desc[td].nda,
  776.  dbri->dma->desc[td].word4));
  777. }
  778. save_and_cli(flags);
  779. if (pipe_active(dbri, pipe)) {
  780. /* Pipe is already active - find last TD in use
  781.  * and link our first TD onto its end.  Then issue
  782.  * a CDP command to let the DBRI know there's more data.
  783.  */
  784. last_td = dbri->pipes[pipe].desc;
  785. while (dbri->descs[last_td].next != -1)
  786. last_td = dbri->descs[last_td].next;
  787. dbri->descs[last_td].next = first_td;
  788. dbri->dma->desc[last_td].nda =
  789.                         dbri->dma_dvma + dbri_dma_off(desc, first_td);
  790. cmd = dbri_cmdlock(dbri);
  791. *(cmd++) = DBRI_CMD(D_CDP, 0, pipe);
  792. dbri_cmdsend(dbri,cmd);
  793. } else {
  794. /* Pipe isn't active - issue an SDP command to start
  795.  * our chain of TDs running.
  796.  */
  797. dbri->pipes[pipe].desc = first_td;
  798. cmd = dbri_cmdlock(dbri);
  799. *(cmd++) = DBRI_CMD(D_SDP, 0,
  800.     dbri->pipes[pipe].sdp
  801.     | D_SDP_P | D_SDP_EVERY | D_SDP_C);
  802.                 *(cmd++) = dbri->dma_dvma + dbri_dma_off(desc, first_td);
  803. dbri_cmdsend(dbri, cmd);
  804. }
  805. restore_flags(flags);
  806. }
  807. static void recv_on_pipe(struct dbri *dbri, int pipe,
  808.                          void * buffer, unsigned int len,
  809.                          void (*callback)(void *, int, unsigned int),
  810.                          void * callback_arg)
  811. {
  812.         volatile s32 *cmd;
  813. int first_rd = -1;
  814. int last_rd = -1;
  815.         int rd;
  816. __u32 bus_buffer, bus_buffer_base;
  817.         if (pipe < 0 || pipe > 15) {
  818. printk("DBRI: recv_on_pipe: Illegal pipe numbern");
  819.                 return;
  820.         }
  821.         if (dbri->pipes[pipe].sdp == 0) {
  822. printk("DBRI: recv_on_pipe: Uninitialized pipe %dn", pipe);
  823.                 return;
  824.         }
  825.         if (dbri->pipes[pipe].sdp & D_SDP_TO_SER) {
  826. printk("DBRI: recv_on_pipe: Called on transmit pipe %dn",
  827.        pipe);
  828.                 return;
  829.         }
  830.         /* XXX Fix this XXX
  831.  * Should be able to queue multiple buffers to receive on a pipe
  832.          */
  833.         if (dbri->pipes[pipe].desc != -1) {
  834. printk("DBRI: recv_on_pipe: Called on active pipe %dn", pipe);
  835.                 return;
  836.         }
  837.         /* Make sure buffer size is multiple of four */
  838.         len &= ~3;
  839.         bus_buffer_base = bus_buffer = sbus_map_single(dbri->sdev, buffer, len,
  840.        SBUS_DMA_FROMDEVICE);
  841. while (len > 0) {
  842. int rd, mylen;
  843. if (len > ((1 << 13) - 4)) {
  844. mylen = (1 << 13) - 4;
  845. } else {
  846. mylen = len;
  847. }
  848. for (rd = 0; rd < DBRI_NO_DESCS; rd ++) {
  849. if (! dbri->descs[rd].inuse)
  850.                                 break;
  851. }
  852. if (rd == DBRI_NO_DESCS) {
  853. printk("DBRI recv_on_pipe: No descriptorsn");
  854. break;
  855. }
  856. dbri->dma->desc[rd].word1 = 0;
  857. dbri->dma->desc[rd].ba = bus_buffer;
  858. dbri->dma->desc[rd].nda = 0;
  859. dbri->dma->desc[rd].word4 = DBRI_RD_B | DBRI_RD_BCNT(mylen);
  860. dbri->descs[rd].buffer = NULL;
  861. dbri->descs[rd].len = 0;
  862. dbri->descs[rd].input_callback = NULL;
  863. dbri->descs[rd].output_callback = NULL;
  864. dbri->descs[rd].next = -1;
  865. dbri->descs[rd].inuse = 1;
  866. if (first_rd == -1) first_rd = rd;
  867. if (last_rd != -1) {
  868. dbri->dma->desc[last_rd].nda =
  869.                                 dbri->dma_dvma + dbri_dma_off(desc, rd);
  870. dbri->descs[last_rd].next = rd;
  871. }
  872. last_rd = rd;
  873. bus_buffer += mylen;
  874. len -= mylen;
  875.         }
  876. if (last_rd == -1 || first_rd == -1) {
  877. sbus_unmap_single(dbri->sdev, bus_buffer_base,
  878.   bus_buffer - bus_buffer_base + len,
  879.   SBUS_DMA_FROMDEVICE);
  880.                 return;
  881. }
  882. for (rd=first_rd; rd != -1; rd = dbri->descs[rd].next) {
  883. dprintk(D_DESC, ("DBRI RD %d: %08x %08x %08x %08xn",
  884.  rd,
  885.  dbri->dma->desc[rd].word1,
  886.  dbri->dma->desc[rd].ba,
  887.  dbri->dma->desc[rd].nda,
  888.  dbri->dma->desc[rd].word4));
  889. }
  890. dbri->descs[last_rd].buffer = buffer;
  891.         dbri->descs[last_rd].buffer_dvma = bus_buffer_base;
  892. dbri->descs[last_rd].len = bus_buffer - bus_buffer_base + len;
  893. dbri->descs[last_rd].input_callback = callback;
  894. dbri->descs[last_rd].input_callback_arg = callback_arg;
  895. dbri->pipes[pipe].desc = first_rd;
  896.         cmd = dbri_cmdlock(dbri);
  897. *(cmd++) = DBRI_CMD(D_SDP, 0, dbri->pipes[pipe].sdp | D_SDP_P | D_SDP_C);
  898.         *(cmd++) = dbri->dma_dvma + dbri_dma_off(desc, first_rd);
  899.         dbri_cmdsend(dbri, cmd);
  900. }
  901. /*
  902. ****************************************************************************
  903. ************************** DBRI - CHI interface ****************************
  904. ****************************************************************************
  905. The CHI is a four-wire (clock, frame sync, data in, data out) time-division
  906. multiplexed serial interface which the DBRI can operate in either master
  907. (give clock/frame sync) or slave (take clock/frame sync) mode.
  908. */
  909. enum master_or_slave { CHImaster, CHIslave };
  910. static void reset_chi(struct dbri *dbri, enum master_or_slave master_or_slave,
  911.       int bits_per_frame)
  912. {
  913. volatile s32 *cmd;
  914. int val;
  915. static int chi_initialized = 0;
  916. if (!chi_initialized) {
  917. cmd = dbri_cmdlock(dbri);
  918. /* Set CHI Anchor: Pipe 16 */
  919. val = D_DTS_VI | D_DTS_INS | D_DTS_PRVIN(16) | D_PIPE(16);
  920. *(cmd++) = DBRI_CMD(D_DTS, 0, val);
  921. *(cmd++) = D_TS_ANCHOR | D_TS_NEXT(16);
  922. *(cmd++) = 0;
  923. val = D_DTS_VO | D_DTS_INS | D_DTS_PRVOUT(16) | D_PIPE(16);
  924. *(cmd++) = DBRI_CMD(D_DTS, 0, val);
  925. *(cmd++) = 0;
  926. *(cmd++) = D_TS_ANCHOR | D_TS_NEXT(16);
  927. dbri->pipes[16].sdp = 1;
  928. dbri->pipes[16].nextpipe = 16;
  929. dbri->chi_in_pipe = 16;
  930. dbri->chi_out_pipe = 16;
  931. #if 0
  932. chi_initialized ++;
  933. #endif
  934. } else {
  935. int pipe;
  936. for (pipe = dbri->chi_in_pipe;
  937.      pipe != 16;
  938.      pipe = dbri->pipes[pipe].nextpipe) {
  939. unlink_time_slot(dbri, pipe, PIPEinput,
  940.  16, dbri->pipes[pipe].nextpipe);
  941. }
  942. for (pipe = dbri->chi_out_pipe;
  943.      pipe != 16;
  944.      pipe = dbri->pipes[pipe].nextpipe) {
  945. unlink_time_slot(dbri, pipe, PIPEoutput,
  946.  16, dbri->pipes[pipe].nextpipe);
  947. }
  948. dbri->chi_in_pipe = 16;
  949. dbri->chi_out_pipe = 16;
  950. cmd = dbri_cmdlock(dbri);
  951. }
  952. if (master_or_slave == CHIslave) {
  953. /* Setup DBRI for CHI Slave - receive clock, frame sync (FS)
  954.  *
  955.  * CHICM  = 0 (slave mode, 8 kHz frame rate)
  956.  * IR     = give immediate CHI status interrupt
  957.  * EN     = give CHI status interrupt upon change
  958.  */
  959. *(cmd++) = DBRI_CMD(D_CHI, 0, D_CHI_CHICM(0));
  960. } else {
  961. /* Setup DBRI for CHI Master - generate clock, FS
  962.  *
  963.  * BPF =  bits per 8 kHz frame
  964.  * 12.288 MHz / CHICM_divisor = clock rate
  965.  * FD  =  1 - drive CHIFS on rising edge of CHICK
  966.  */
  967. int clockrate = bits_per_frame * 8;
  968. int divisor   = 12288 / clockrate;
  969. if (divisor > 255 || divisor * clockrate != 12288)
  970. printk("DBRI: illegal bits_per_frame in setup_chin");
  971. *(cmd++) = DBRI_CMD(D_CHI, 0, D_CHI_CHICM(divisor) | D_CHI_FD
  972.     | D_CHI_BPF(bits_per_frame));
  973. }
  974. dbri->chi_bpf = bits_per_frame;
  975. /* CHI Data Mode
  976.  *
  977.  * RCE   =  0 - receive on falling edge of CHICK
  978.  * XCE   =  1 - transmit on rising edge of CHICK
  979.  * XEN   =  1 - enable transmitter
  980.  * REN   =  1 - enable receiver
  981.  */
  982. *(cmd++) = DBRI_CMD(D_PAUSE, 0, 0);
  983. *(cmd++) = DBRI_CMD(D_CDM, 0, D_CDM_XCE|D_CDM_XEN|D_CDM_REN);
  984. dbri_cmdsend(dbri, cmd);
  985. }
  986. /*
  987. ****************************************************************************
  988. *********************** CS4215 audio codec management **********************
  989. ****************************************************************************
  990. In the standard SPARC audio configuration, the CS4215 codec is attached
  991. to the DBRI via the CHI interface and few of the DBRI's PIO pins.
  992. */
  993. static void mmcodec_default(struct cs4215 *mm)
  994. {
  995. /*
  996.  * No action, memory resetting only.
  997.  *
  998.  * Data Time Slot 5-8
  999.  * Speaker,Line and Headphone enable. Gain set to the half.
  1000.  * Input is mike.
  1001.  */
  1002. mm->data[0] = CS4215_LO(0x20) | CS4215_HE|CS4215_LE;
  1003. mm->data[1] = CS4215_RO(0x20) | CS4215_SE;
  1004. mm->data[2] = CS4215_LG( 0x8) | CS4215_IS | CS4215_PIO0 | CS4215_PIO1;
  1005. mm->data[3] = CS4215_RG( 0x8) | CS4215_MA(0xf);
  1006. /*
  1007.  * Control Time Slot 1-4
  1008.  * 0: Default I/O voltage scale
  1009.  * 1: 8 bit ulaw, 8kHz, mono, high pass filter disabled
  1010.  * 2: Serial enable, CHI master, 128 bits per frame, clock 1
  1011.  * 3: Tests disabled
  1012.  */
  1013. mm->ctrl[0] = CS4215_RSRVD_1 | CS4215_MLB;
  1014. mm->ctrl[1] = CS4215_DFR_ULAW | CS4215_FREQ[0].csval;
  1015. mm->ctrl[2] = CS4215_XCLK |
  1016. CS4215_BSEL_128 | CS4215_FREQ[0].xtal;
  1017. mm->ctrl[3] = 0;
  1018. }
  1019. static void mmcodec_setup_pipes(struct dbri *dbri)
  1020. {
  1021. /*
  1022.  * Data mode:
  1023.  * Pipe  4: Send timeslots 1-4 (audio data)
  1024.  * Pipe 20: Send timeslots 5-8 (part of ctrl data)
  1025.  * Pipe  6: Receive timeslots 1-4 (audio data)
  1026.  * Pipe 21: Receive timeslots 6-7. We can only receive 20 bits via
  1027.  *          interrupt, and the rest of the data (slot 5 and 8) is
  1028.  *     not relevant for us (only for doublechecking).
  1029.  *
  1030.  * Control mode:
  1031.  * Pipe 17: Send timeslots 1-4 (slots 5-8 are readonly)
  1032.  * Pipe 18: Receive timeslot 1 (clb).
  1033.  * Pipe 19: Receive timeslot 7 (version). 
  1034.  */
  1035. setup_pipe(dbri,  4, D_SDP_MEM   | D_SDP_TO_SER | D_SDP_MSB);
  1036. setup_pipe(dbri, 20, D_SDP_FIXED | D_SDP_TO_SER | D_SDP_MSB);
  1037. setup_pipe(dbri,  6, D_SDP_MEM   | D_SDP_FROM_SER | D_SDP_MSB);
  1038. setup_pipe(dbri, 21, D_SDP_FIXED | D_SDP_FROM_SER | D_SDP_MSB);
  1039. setup_pipe(dbri, 17, D_SDP_FIXED | D_SDP_TO_SER   | D_SDP_MSB);
  1040. setup_pipe(dbri, 18, D_SDP_FIXED | D_SDP_FROM_SER | D_SDP_MSB);
  1041. setup_pipe(dbri, 19, D_SDP_FIXED | D_SDP_FROM_SER | D_SDP_MSB);
  1042. dbri->mm.status = 0;
  1043. recv_fixed(dbri, 18, & dbri->mm.status);
  1044. recv_fixed(dbri, 19, & dbri->mm.version);
  1045. }
  1046. static void mmcodec_setgain(struct dbri *dbri, int muted)
  1047. {
  1048. if (muted || dbri->perchip_info.output_muted) {
  1049. dbri->mm.data[0] = 63;
  1050. dbri->mm.data[1] = 63;
  1051. } else {
  1052. int left_gain = (dbri->perchip_info.play.gain / 4) % 64;
  1053. int right_gain = (dbri->perchip_info.play.gain / 4) % 64;
  1054. int outport = dbri->perchip_info.play.port;
  1055. if (dbri->perchip_info.play.balance < AUDIO_MID_BALANCE) {
  1056. right_gain *= dbri->perchip_info.play.balance;
  1057. right_gain /= AUDIO_MID_BALANCE;
  1058. } else {
  1059. left_gain *= AUDIO_RIGHT_BALANCE
  1060. - dbri->perchip_info.play.balance;
  1061. left_gain /= AUDIO_MID_BALANCE;
  1062. }
  1063. dprintk(D_MM, ("DBRI: Setting codec gain left: %d right: %dn",
  1064.        left_gain, right_gain));
  1065. dbri->mm.data[0] = (63 - left_gain);
  1066. if (outport & AUDIO_HEADPHONE) dbri->mm.data[0] |= CS4215_HE;
  1067. if (outport & AUDIO_LINE_OUT)  dbri->mm.data[0] |= CS4215_LE;
  1068. dbri->mm.data[1] = (63 - right_gain);
  1069. if (outport & AUDIO_SPEAKER)   dbri->mm.data[1] |= CS4215_SE;
  1070. }
  1071. xmit_fixed(dbri, 20, *(int *)dbri->mm.data);
  1072. }
  1073. static void mmcodec_init_data(struct dbri *dbri)
  1074. {
  1075. int data_width;
  1076.         u32 tmp;
  1077. /*
  1078.  * Data mode:
  1079.  * Pipe  4: Send timeslots 1-4 (audio data)
  1080.  * Pipe 20: Send timeslots 5-8 (part of ctrl data)
  1081.  * Pipe  6: Receive timeslots 1-4 (audio data)
  1082.  * Pipe 21: Receive timeslots 6-7. We can only receive 20 bits via
  1083.  *          interrupt, and the rest of the data (slot 5 and 8) is
  1084.  *     not relevant for us (only for doublechecking).
  1085.          *
  1086.          * Just like in control mode, the time slots are all offset by eight
  1087.          * bits.  The CS4215, it seems, observes TSIN (the delayed signal)
  1088.          * even if it's the CHI master.  Don't ask me...
  1089.  */
  1090.         tmp = sbus_readl(dbri->regs + REG0);
  1091.         tmp &= ~(D_C); /* Disable CHI */
  1092.         sbus_writel(tmp, dbri->regs + REG0);
  1093.         /* Switch CS4215 to data mode - set PIO3 to 1 */
  1094.         sbus_writel(D_ENPIO | D_PIO1 | D_PIO3 |
  1095.                     (dbri->mm.onboard ? D_PIO0 : D_PIO2),
  1096.                     dbri->regs + REG2);
  1097. reset_chi(dbri, CHIslave, 128);
  1098. /* Note: this next doesn't work for 8-bit stereo, because the two
  1099.  * channels would be on timeslots 1 and 3, with 2 and 4 idle.
  1100.  * (See CS4215 datasheet Fig 15)
  1101.  *
  1102.  * DBRI non-contiguous mode would be required to make this work.
  1103.  */
  1104. data_width = dbri->perchip_info.play.channels
  1105. * dbri->perchip_info.play.precision;
  1106. link_time_slot(dbri, 20, PIPEoutput, 16,
  1107.        32, dbri->mm.offset + 32);
  1108. link_time_slot(dbri,  4, PIPEoutput, 16,
  1109.        data_width, dbri->mm.offset);
  1110. link_time_slot(dbri,  6, PIPEinput, 16,
  1111.        data_width, dbri->mm.offset);
  1112. link_time_slot(dbri, 21, PIPEinput, 16,
  1113.        16, dbri->mm.offset + 40);
  1114. mmcodec_setgain(dbri, 0);
  1115.         tmp = sbus_readl(dbri->regs + REG0);
  1116. tmp |= D_C; /* Enable CHI */
  1117.         sbus_writel(tmp, dbri->regs + REG0);
  1118. }
  1119. /*
  1120.  * Send the control information (i.e. audio format)
  1121.  */
  1122. static int mmcodec_setctrl(struct dbri *dbri)
  1123. {
  1124. int i, val;
  1125.         u32 tmp;
  1126. /* XXX - let the CPU do something useful during these delays */
  1127. /* Temporarily mute outputs, and wait 1/8000 sec (125 us)
  1128.  * to make sure this takes.  This avoids clicking noises.
  1129.  */
  1130. mmcodec_setgain(dbri, 1);
  1131. udelay(125);
  1132. /*
  1133.  * Enable Control mode: Set DBRI's PIO3 (4215's D/~C) to 0, then wait
  1134.  * 12 cycles <= 12/(5512.5*64) sec = 34.01 usec
  1135.  */
  1136. val = D_ENPIO | D_PIO1 | (dbri->mm.onboard ? D_PIO0 : D_PIO2);
  1137. sbus_writel(val, dbri->regs + REG2);
  1138. udelay(34);
  1139.         /* In Control mode, the CS4215 is a slave device, so the DBRI must
  1140.          * operate as CHI master, supplying clocking and frame synchronization.
  1141.          *
  1142.          * In Data mode, however, the CS4215 must be CHI master to insure
  1143.          * that its data stream is synchronous with its codec.
  1144.          *
  1145.          * The upshot of all this?  We start by putting the DBRI into master
  1146.          * mode, program the CS4215 in Control mode, then switch the CS4215
  1147.          * into Data mode and put the DBRI into slave mode.  Various timing
  1148.          * requirements must be observed along the way.
  1149.          *
  1150.          * Oh, and one more thing, on a SPARCStation 20 (and maybe
  1151.          * others?), the addressing of the CS4215's time slots is
  1152.          * offset by eight bits, so we add eight to all the "cycle"
  1153.          * values in the Define Time Slot (DTS) commands.  This is
  1154.          * done in hardware by a TI 248 that delays the DBRI->4215
  1155.          * frame sync signal by eight clock cycles.  Anybody know why?
  1156.          */
  1157.         tmp = sbus_readl(dbri->regs + REG0);
  1158. tmp &= ~D_C; /* Disable CHI */
  1159.         sbus_writel(tmp, dbri->regs + REG0);
  1160.         reset_chi(dbri, CHImaster, 128);
  1161. /*
  1162.  * Control mode:
  1163.  * Pipe 17: Send timeslots 1-4 (slots 5-8 are readonly)
  1164.  * Pipe 18: Receive timeslot 1 (clb).
  1165.  * Pipe 19: Receive timeslot 7 (version). 
  1166.  */
  1167. link_time_slot(dbri, 17, PIPEoutput, 16,
  1168.        32, dbri->mm.offset);
  1169. link_time_slot(dbri, 18, PIPEinput, 16,
  1170.        8, dbri->mm.offset);
  1171. link_time_slot(dbri, 19, PIPEinput, 16,
  1172.        8, dbri->mm.offset + 48);
  1173.         /* Wait for the chip to echo back CLB (Control Latch Bit) as zero */
  1174. dbri->mm.ctrl[0] &= ~CS4215_CLB;
  1175.         xmit_fixed(dbri, 17, *(int *)dbri->mm.ctrl);
  1176.         tmp = sbus_readl(dbri->regs + REG0);
  1177.         tmp |= D_C; /* Enable CHI */
  1178.         sbus_writel(tmp, dbri->regs + REG0);
  1179. i = 64;
  1180. while (((dbri->mm.status & 0xe4) != 0x20) && --i)
  1181.                 udelay(125);
  1182.         if (i == 0) {
  1183. dprintk(D_MM, ("DBRI: CS4215 didn't respond to CLB (0x%02x)n",
  1184.        dbri->mm.status));
  1185. return -1;
  1186.         }
  1187.         /* Terminate CS4215 control mode - data sheet says
  1188.          * "Set CLB=1 and send two more frames of valid control info"
  1189.          */
  1190. dbri->mm.ctrl[0] |= CS4215_CLB;
  1191.         xmit_fixed(dbri, 17, *(int *)dbri->mm.ctrl);
  1192.         /* Two frames of control info @ 8kHz frame rate = 250 us delay */
  1193.         udelay(250);
  1194. mmcodec_setgain(dbri, 0);
  1195. return 0;
  1196. }
  1197. static int mmcodec_init(struct sparcaudio_driver *drv)
  1198. {
  1199. struct dbri *dbri = (struct dbri *) drv->private;
  1200. u32 reg2 = sbus_readl(dbri->regs + REG2);
  1201. /* Look for the cs4215 chips */
  1202. if(reg2 & D_PIO2) {
  1203. dprintk(D_MM, ("DBRI: Onboard CS4215 detectedn"));
  1204. dbri->mm.onboard = 1;
  1205. }
  1206. if(reg2 & D_PIO0) {
  1207. dprintk(D_MM, ("DBRI: Speakerbox detectedn"));
  1208. dbri->mm.onboard = 0;
  1209. }
  1210. /* Using the Speakerbox, if both are attached.  */
  1211. if((reg2 & D_PIO2) && (reg2 & D_PIO0)) {
  1212. printk("DBRI: Using speakerbox / ignoring onboard mmcodec.n");
  1213. sbus_writel(D_ENPIO2, dbri->regs + REG2);
  1214. dbri->mm.onboard = 0;
  1215. }
  1216. if(!(reg2 & (D_PIO0|D_PIO2))) {
  1217. printk("DBRI: no mmcodec found.n");
  1218. return -EIO;
  1219. }
  1220. mmcodec_setup_pipes(dbri);
  1221. mmcodec_default(&dbri->mm);
  1222. dbri->mm.version = 0xff;
  1223. dbri->mm.offset = dbri->mm.onboard ? 0 : 8;
  1224. if (mmcodec_setctrl(dbri) == -1 || dbri->mm.version == 0xff) {
  1225. dprintk(D_MM, ("DBRI: CS4215 failed probe at offset %dn",
  1226.        dbri->mm.offset));
  1227. return -EIO;
  1228. }
  1229. dprintk(D_MM, ("DBRI: Found CS4215 at offset %dn", dbri->mm.offset));
  1230. dbri->perchip_info.play.channels = 1;
  1231. dbri->perchip_info.play.precision = 8;
  1232. dbri->perchip_info.play.gain = (AUDIO_MAX_GAIN * 7 / 10);  /* 70% */
  1233. dbri->perchip_info.play.balance = AUDIO_MID_BALANCE;
  1234. dbri->perchip_info.play.port = dbri->perchip_info.play.avail_ports = 
  1235. AUDIO_SPEAKER | AUDIO_HEADPHONE | AUDIO_LINE_OUT;
  1236. dbri->perchip_info.record.port = AUDIO_MICROPHONE;
  1237. dbri->perchip_info.record.avail_ports =
  1238. AUDIO_MICROPHONE | AUDIO_LINE_IN;
  1239. mmcodec_init_data(dbri);
  1240. return 0;
  1241. }
  1242. /*
  1243. ****************************************************************************
  1244. ******************** Interface with sparcaudio midlevel ********************
  1245. ****************************************************************************
  1246. The sparcaudio midlevel is contained in the file audio.c.  It interfaces
  1247. to the user process and performs buffering, intercepts SunOS-style ioctl's,
  1248. etc.  It interfaces to a abstract audio device via a struct sparcaudio_driver.
  1249. This code presents such an interface for the DBRI with an attached CS4215.
  1250. All our routines are defined, and then comes our struct sparcaudio_driver.
  1251. */
  1252. /******************* sparcaudio midlevel - audio output *******************/
  1253. static void dbri_audio_output_callback(void * callback_arg, int status)
  1254. {
  1255.         struct sparcaudio_driver *drv = callback_arg;
  1256. if (status != -1)
  1257. sparcaudio_output_done(drv, 1);
  1258. }
  1259. static void dbri_start_output(struct sparcaudio_driver *drv,
  1260.                               __u8 * buffer, unsigned long count)
  1261. {
  1262. struct dbri *dbri = (struct dbri *) drv->private;
  1263. dprintk(D_USR, ("DBRI: start audio output buf=%p/%ldn",
  1264. buffer, count));
  1265.         /* Pipe 4 is audio transmit */
  1266. xmit_on_pipe(dbri, 4, buffer, count,
  1267.      &dbri_audio_output_callback, drv);
  1268. #if 0
  1269. /* Notify midlevel that we're a DMA-capable driver that
  1270.  * can accept another buffer immediately.  We should probably
  1271.  * check that we've got enough resources (i.e, descriptors)
  1272.  * available before doing this, but the default midlevel
  1273.  * settings only buffer 64KB, which we can handle with 16
  1274.  * of our DBRI_NO_DESCS (64) descriptors.
  1275.  *
  1276.  * This code is #ifdef'ed out because it's caused me more
  1277.  * problems than it solved.  It'd be nice to provide the
  1278.  * DBRI with a chain of buffers, but the midlevel code is
  1279.  * so tricky that I really don't want to deal with it.
  1280.  */
  1281. sparcaudio_output_done(drv, 2);
  1282. #endif
  1283. }
  1284. static void dbri_stop_output(struct sparcaudio_driver *drv)
  1285. {
  1286. struct dbri *dbri = (struct dbri *) drv->private;
  1287.         reset_pipe(dbri, 4);
  1288. }
  1289. /******************* sparcaudio midlevel - audio input ********************/
  1290. static void dbri_audio_input_callback(void * callback_arg, int status,
  1291.       unsigned int len)
  1292. {
  1293. struct sparcaudio_driver * drv =
  1294. (struct sparcaudio_driver *) callback_arg;
  1295. if (status != -1)
  1296. sparcaudio_input_done(drv, 3);
  1297. }
  1298. static void dbri_start_input(struct sparcaudio_driver *drv,
  1299.                              __u8 * buffer, unsigned long len)
  1300. {
  1301. struct dbri *dbri = (struct dbri *) drv->private;
  1302. /* Pipe 6 is audio receive */
  1303. recv_on_pipe(dbri, 6, buffer, len,
  1304.      &dbri_audio_input_callback, (void *)drv);
  1305. dprintk(D_USR, ("DBRI: start audio input buf=%p/%ldn",
  1306. buffer, len));
  1307. }
  1308. static void dbri_stop_input(struct sparcaudio_driver *drv)
  1309. {
  1310. struct dbri *dbri = (struct dbri *) drv->private;
  1311. reset_pipe(dbri, 6);
  1312. }
  1313. /******************* sparcaudio midlevel - volume & balance ***************/
  1314. static int dbri_set_output_volume(struct sparcaudio_driver *drv, int volume)
  1315. {
  1316. struct dbri *dbri = (struct dbri *) drv->private;
  1317. dbri->perchip_info.play.gain = volume;
  1318. mmcodec_setgain(dbri, 0);
  1319.         return 0;
  1320. }
  1321. static int dbri_get_output_volume(struct sparcaudio_driver *drv)
  1322. {
  1323. struct dbri *dbri = (struct dbri *) drv->private;
  1324. return dbri->perchip_info.play.gain;
  1325. }
  1326. static int dbri_set_input_volume(struct sparcaudio_driver *drv, int volume)
  1327. {
  1328.         return 0;
  1329. }
  1330. static int dbri_get_input_volume(struct sparcaudio_driver *drv)
  1331. {
  1332.         return 0;
  1333. }
  1334. static int dbri_set_monitor_volume(struct sparcaudio_driver *drv, int volume)
  1335. {
  1336.         return 0;
  1337. }
  1338. static int dbri_get_monitor_volume(struct sparcaudio_driver *drv)
  1339. {
  1340.         return 0;
  1341. }
  1342. static int dbri_set_output_balance(struct sparcaudio_driver *drv, int balance)
  1343. {
  1344. struct dbri *dbri = (struct dbri *) drv->private;
  1345. dbri->perchip_info.play.balance = balance;
  1346. mmcodec_setgain(dbri, 0);
  1347.         return 0;
  1348. }
  1349. static int dbri_get_output_balance(struct sparcaudio_driver *drv)
  1350. {
  1351. struct dbri *dbri = (struct dbri *) drv->private;
  1352. return dbri->perchip_info.play.balance;
  1353. }
  1354. static int dbri_set_input_balance(struct sparcaudio_driver *drv, int balance)
  1355. {
  1356.         return 0;
  1357. }
  1358. static int dbri_get_input_balance(struct sparcaudio_driver *drv)
  1359. {
  1360.         return 0;
  1361. }
  1362. static int dbri_set_output_muted(struct sparcaudio_driver *drv, int mute)
  1363. {
  1364. struct dbri *dbri = (struct dbri *) drv->private;
  1365. dbri->perchip_info.output_muted = mute;
  1366. return 0;
  1367. }
  1368. static int dbri_get_output_muted(struct sparcaudio_driver *drv)
  1369. {
  1370. struct dbri *dbri = (struct dbri *) drv->private;
  1371. return dbri->perchip_info.output_muted;
  1372. }
  1373. /******************* sparcaudio midlevel - encoding format ****************/
  1374. static int dbri_set_output_channels(struct sparcaudio_driver *drv, int chan)
  1375. {
  1376. struct dbri *dbri = (struct dbri *) drv->private;
  1377. switch (chan) {
  1378. case 0:
  1379. return 0;
  1380. case 1:
  1381. dbri->mm.ctrl[1] &= ~CS4215_DFR_STEREO;
  1382. break;
  1383. case 2:
  1384. dbri->mm.ctrl[1] |= CS4215_DFR_STEREO;
  1385. break;
  1386. default:
  1387. return -1;
  1388. }
  1389. dbri->perchip_info.play.channels = chan;
  1390. mmcodec_setctrl(dbri);
  1391. mmcodec_init_data(dbri);
  1392.         return 0;
  1393. }
  1394. static int dbri_get_output_channels(struct sparcaudio_driver *drv)
  1395. {
  1396. struct dbri *dbri = (struct dbri *) drv->private;
  1397. return dbri->perchip_info.play.channels;
  1398. }
  1399. static int dbri_set_input_channels(struct sparcaudio_driver *drv, int chan)
  1400. {
  1401. return dbri_set_output_channels(drv, chan);
  1402. }
  1403. static int dbri_get_input_channels(struct sparcaudio_driver *drv)
  1404. {
  1405. return dbri_get_output_channels(drv);
  1406. }
  1407. static int dbri_set_output_precision(struct sparcaudio_driver *drv, int prec)
  1408. {
  1409. return 0;
  1410. }
  1411. static int dbri_get_output_precision(struct sparcaudio_driver *drv)
  1412. {
  1413. struct dbri *dbri = (struct dbri *) drv->private;
  1414. return dbri->perchip_info.play.precision;
  1415. }
  1416. static int dbri_set_input_precision(struct sparcaudio_driver *drv, int prec)
  1417. {
  1418. return 0;
  1419. }
  1420. static int dbri_get_input_precision(struct sparcaudio_driver *drv)
  1421. {
  1422. struct dbri *dbri = (struct dbri *) drv->private;
  1423. return dbri->perchip_info.play.precision;
  1424. }
  1425. static int dbri_set_output_encoding(struct sparcaudio_driver *drv, int enc)
  1426. {
  1427. struct dbri *dbri = (struct dbri *) drv->private;
  1428. /* For ULAW and ALAW, audio.c enforces precision = 8,
  1429.  * for LINEAR, precision must be 16
  1430.  */
  1431. switch (enc) {
  1432. case AUDIO_ENCODING_NONE:
  1433. return 0;
  1434. case AUDIO_ENCODING_ULAW:
  1435. dbri->mm.ctrl[1] &= ~3;
  1436. dbri->mm.ctrl[1] |= CS4215_DFR_ULAW;
  1437. dbri->perchip_info.play.encoding = enc;
  1438. dbri->perchip_info.play.precision = 8;
  1439. break;
  1440. case AUDIO_ENCODING_ALAW:
  1441. dbri->mm.ctrl[1] &= ~3;
  1442. dbri->mm.ctrl[1] |= CS4215_DFR_ALAW;
  1443. dbri->perchip_info.play.encoding = enc;
  1444. dbri->perchip_info.play.precision = 8;
  1445. break;
  1446. case AUDIO_ENCODING_LINEAR:
  1447. dbri->mm.ctrl[1] &= ~3;
  1448. dbri->mm.ctrl[1] |= CS4215_DFR_LINEAR16;
  1449. dbri->perchip_info.play.encoding = enc;
  1450. dbri->perchip_info.play.precision = 16;
  1451. break;
  1452. default:
  1453. return -1;
  1454. };
  1455. mmcodec_setctrl(dbri);
  1456. mmcodec_init_data(dbri);
  1457.         return 0;
  1458. }
  1459. static int dbri_get_output_encoding(struct sparcaudio_driver *drv)
  1460. {
  1461. struct dbri *dbri = (struct dbri *) drv->private;
  1462. return dbri->perchip_info.play.encoding;
  1463. }
  1464. static int dbri_set_input_encoding(struct sparcaudio_driver *drv, int enc)
  1465. {
  1466. return dbri_set_output_encoding(drv, enc);
  1467. }
  1468. static int dbri_get_input_encoding(struct sparcaudio_driver *drv)
  1469. {
  1470. return dbri_get_output_encoding(drv);
  1471. }
  1472. static int dbri_set_output_rate(struct sparcaudio_driver *drv, int rate)
  1473. {
  1474. struct dbri *dbri = (struct dbri *) drv->private;
  1475. int i;
  1476. if (rate == 0)
  1477. return 0;
  1478. for (i=0; CS4215_FREQ[i].freq; i++) {
  1479. if (CS4215_FREQ[i].freq == rate)
  1480.                         break;
  1481. }
  1482. if (CS4215_FREQ[i].freq == 0)
  1483. return -1;
  1484. dbri->mm.ctrl[1] &= ~ 0x38;
  1485. dbri->mm.ctrl[1] |= CS4215_FREQ[i].csval;
  1486. dbri->mm.ctrl[2] &= ~ 0x70;
  1487. dbri->mm.ctrl[2] |= CS4215_FREQ[i].xtal;
  1488. dbri->perchip_info.play.sample_rate = rate;
  1489. mmcodec_setctrl(dbri);
  1490. mmcodec_init_data(dbri);
  1491.         return 0;
  1492. }
  1493. static int dbri_get_output_rate(struct sparcaudio_driver *drv)
  1494. {
  1495. struct dbri *dbri = (struct dbri *) drv->private;
  1496. return dbri->perchip_info.play.sample_rate;
  1497. }
  1498. static int dbri_set_input_rate(struct sparcaudio_driver *drv, int rate)
  1499. {
  1500. return dbri_set_output_rate(drv, rate);
  1501. }
  1502. static int dbri_get_input_rate(struct sparcaudio_driver *drv)
  1503. {
  1504. return dbri_get_output_rate(drv);
  1505. }
  1506. /******************* sparcaudio midlevel - ports ***********************/
  1507. static int dbri_set_output_port(struct sparcaudio_driver *drv, int port)
  1508. {
  1509. struct dbri *dbri = (struct dbri *) drv->private;
  1510. port &= dbri->perchip_info.play.avail_ports;
  1511. dbri->perchip_info.play.port = port;
  1512. mmcodec_setgain(dbri, 0);
  1513. return 0;
  1514. }
  1515. static int dbri_get_output_port(struct sparcaudio_driver *drv)
  1516. {
  1517. struct dbri *dbri = (struct dbri *) drv->private;
  1518. return dbri->perchip_info.play.port;
  1519. }
  1520. static int dbri_set_input_port(struct sparcaudio_driver *drv, int port)
  1521. {
  1522. struct dbri *dbri = (struct dbri *) drv->private;
  1523. port &= dbri->perchip_info.record.avail_ports;
  1524. dbri->perchip_info.record.port = port;
  1525. mmcodec_setgain(dbri, 0);
  1526. return 0;
  1527. }
  1528. static int dbri_get_input_port(struct sparcaudio_driver *drv)
  1529. {
  1530. struct dbri *dbri = (struct dbri *) drv->private;
  1531. return dbri->perchip_info.record.port;
  1532. }
  1533. static int dbri_get_output_ports(struct sparcaudio_driver *drv)
  1534. {
  1535. struct dbri *dbri = (struct dbri *) drv->private;
  1536. return dbri->perchip_info.play.avail_ports;
  1537. }
  1538. static int dbri_get_input_ports(struct sparcaudio_driver *drv)
  1539. {
  1540. struct dbri *dbri = (struct dbri *) drv->private;
  1541. return dbri->perchip_info.record.avail_ports;
  1542. }
  1543. /******************* sparcaudio midlevel - driver ID ********************/
  1544. static void dbri_audio_getdev(struct sparcaudio_driver *drv,
  1545.       audio_device_t *audinfo)
  1546. {
  1547. struct dbri *dbri = (struct dbri *) drv->private;
  1548. strncpy(audinfo->name, "SUNW,DBRI", sizeof(audinfo->name) - 1);
  1549. audinfo->version[0] = dbri->dbri_version;
  1550. audinfo->version[1] = '';
  1551. strncpy(audinfo->config, "onboard1", sizeof(audinfo->config) - 1);
  1552. }
  1553. static int dbri_sunaudio_getdev_sunos(struct sparcaudio_driver *drv)
  1554. {
  1555. return AUDIO_DEV_CODEC;
  1556. }
  1557. /******************* sparcaudio midlevel - open & close ******************/
  1558. static int dbri_open(struct inode * inode, struct file * file,
  1559.      struct sparcaudio_driver *drv)
  1560. {
  1561. MOD_INC_USE_COUNT;
  1562. return 0;
  1563. }
  1564. static void dbri_release(struct inode * inode, struct file * file,
  1565.  struct sparcaudio_driver *drv)
  1566. {
  1567. MOD_DEC_USE_COUNT;
  1568. }
  1569. static int dbri_ioctl(struct inode * inode, struct file * file,
  1570.       unsigned int x, unsigned long y,
  1571.       struct sparcaudio_driver *drv)
  1572. {
  1573. return -EINVAL;
  1574. }
  1575. /*********** sparcaudio midlevel - struct sparcaudio_driver ************/
  1576. static struct sparcaudio_operations dbri_ops = {
  1577. dbri_open,
  1578. dbri_release,
  1579. dbri_ioctl,
  1580. dbri_start_output,
  1581. dbri_stop_output,
  1582. dbri_start_input,
  1583.         dbri_stop_input,
  1584. dbri_audio_getdev,
  1585. dbri_set_output_volume,
  1586. dbri_get_output_volume,
  1587. dbri_set_input_volume,
  1588. dbri_get_input_volume,
  1589. dbri_set_monitor_volume,
  1590. dbri_get_monitor_volume,
  1591. dbri_set_output_balance,
  1592. dbri_get_output_balance,
  1593. dbri_set_input_balance,
  1594. dbri_get_input_balance,
  1595. dbri_set_output_channels,
  1596. dbri_get_output_channels,
  1597. dbri_set_input_channels,
  1598. dbri_get_input_channels,
  1599. dbri_set_output_precision,
  1600. dbri_get_output_precision,
  1601. dbri_set_input_precision,
  1602. dbri_get_input_precision,
  1603. dbri_set_output_port,
  1604. dbri_get_output_port,
  1605. dbri_set_input_port,
  1606. dbri_get_input_port,
  1607. dbri_set_output_encoding,
  1608. dbri_get_output_encoding,
  1609. dbri_set_input_encoding,
  1610. dbri_get_input_encoding,
  1611. dbri_set_output_rate,
  1612. dbri_get_output_rate,
  1613. dbri_set_input_rate,
  1614. dbri_get_input_rate,
  1615. dbri_sunaudio_getdev_sunos,
  1616. dbri_get_output_ports,
  1617. dbri_get_input_ports,
  1618. dbri_set_output_muted,
  1619. dbri_get_output_muted,
  1620. };
  1621. /*
  1622. ****************************************************************************
  1623. ************************** ISDN (Hisax) Interface **************************
  1624. ****************************************************************************
  1625. */
  1626. void dbri_isdn_init(struct dbri *dbri)
  1627. {
  1628.         /* Pipe  0: Receive D channel
  1629.          * Pipe  8: Receive B1 channel
  1630.          * Pipe  9: Receive B2 channel
  1631.          * Pipe  1: Transmit D channel
  1632.          * Pipe 10: Transmit B1 channel
  1633.          * Pipe 11: Transmit B2 channel
  1634.          */
  1635.         setup_pipe(dbri, 0, D_SDP_HDLC | D_SDP_FROM_SER | D_SDP_LSB);
  1636.         setup_pipe(dbri, 8, D_SDP_HDLC | D_SDP_FROM_SER | D_SDP_LSB);
  1637.         setup_pipe(dbri, 9, D_SDP_HDLC | D_SDP_FROM_SER | D_SDP_LSB);
  1638.         setup_pipe(dbri, 1, D_SDP_HDLC_D | D_SDP_TO_SER | D_SDP_LSB);
  1639.         setup_pipe(dbri,10, D_SDP_HDLC | D_SDP_TO_SER | D_SDP_LSB);
  1640.         setup_pipe(dbri,11, D_SDP_HDLC | D_SDP_TO_SER | D_SDP_LSB);
  1641.         link_time_slot(dbri, 0, PIPEinput, 0, 2, 17);
  1642. link_time_slot(dbri, 8, PIPEinput, 0, 8, 0);
  1643. link_time_slot(dbri, 9, PIPEinput, 8, 8, 8);
  1644.         link_time_slot(dbri,  1, PIPEoutput,  1, 2, 17);
  1645.         link_time_slot(dbri, 10, PIPEoutput,  1, 8, 0);
  1646.         link_time_slot(dbri, 11, PIPEoutput, 10, 8, 8);
  1647. }
  1648. int dbri_get_irqnum(int dev)
  1649. {
  1650.        struct dbri *dbri;
  1651.        if (dev >= num_drivers)
  1652.                return(0);
  1653.        dbri = (struct dbri *) drivers[dev].private;
  1654.        tprintk(("dbri_get_irqnum()n"));
  1655.         /* On the sparc, the cpu's irq number is only part of the "irq" */
  1656.        return (dbri->irq & NR_IRQS);
  1657. }
  1658. int dbri_get_liu_state(int dev)
  1659. {
  1660.        struct dbri *dbri;
  1661.        if (dev >= num_drivers)
  1662.                return(0);
  1663.        dbri = (struct dbri *) drivers[dev].private;
  1664.        tprintk(("dbri_get_liu_state() returns %dn", dbri->liu_state));
  1665.        return dbri->liu_state;
  1666. }
  1667. void dbri_liu_activate(int dev, int priority);
  1668. void dbri_liu_init(int dev, void (*callback)(void *), void *callback_arg)
  1669. {
  1670.        struct dbri *dbri;
  1671.        if (dev >= num_drivers)
  1672.                return;
  1673.        dbri = (struct dbri *) drivers[dev].private;
  1674.        tprintk(("dbri_liu_init()n"));
  1675.        /* Set callback for LIU state change */
  1676.        dbri->liu_callback = callback;
  1677.        dbri->liu_callback_arg = callback_arg;
  1678.        dbri_isdn_init(dbri);
  1679.        dbri_liu_activate(dev, 0);
  1680. }
  1681. void dbri_liu_activate(int dev, int priority)
  1682. {
  1683.        struct dbri *dbri;
  1684.        int val;
  1685.        volatile s32 *cmd;
  1686.        if (dev >= num_drivers)
  1687.                return;
  1688.        dbri = (struct dbri *) drivers[dev].private;
  1689.        tprintk(("dbri_liu_activate()n"));
  1690.        if (dbri->liu_state <= 3) {
  1691.                u32 tmp;
  1692.        cmd = dbri_cmdlock(dbri);
  1693.        /* Turn on the ISDN TE interface and request activation */
  1694.        val = D_NT_IRM_IMM | D_NT_IRM_EN | D_NT_ACT;
  1695. #ifdef LOOPBACK_D
  1696.        val |= D_NT_LLB(4);
  1697. #endif
  1698.        *(cmd++) = DBRI_CMD(D_TE, 0, val);
  1699.        dbri_cmdsend(dbri, cmd);
  1700.        /* Activate the interface */
  1701.                tmp = sbus_readl(dbri->regs + REG0);
  1702.                tmp |= D_T;
  1703.                sbus_writel(tmp, dbri->regs + REG0);
  1704.        }
  1705. }
  1706. void dbri_liu_deactivate(int dev)
  1707. {
  1708.        struct dbri *dbri;
  1709. #if 0
  1710.        u32 tmp;
  1711. #endif
  1712.        if (dev >= num_drivers)
  1713.                return;
  1714.        dbri = (struct dbri *) drivers[dev].private;
  1715.        tprintk(("dbri_liu_deactivate()n"));
  1716. #if 0
  1717.        /* Turn off the ISDN TE interface */
  1718.        tmp = sbus_readl(dbri->regs + REG0);
  1719.        tmp &= ~D_T;
  1720.        sbus_writel(tmp, dbri->regs + REG0);
  1721.        dbri->liu_state = 0;
  1722. #endif
  1723. }
  1724. void dbri_dxmit(int dev, __u8 *buffer, unsigned int count,
  1725.                 void (*callback)(void *, int), void *callback_arg)
  1726. {
  1727.        struct dbri *dbri;
  1728.        if (dev >= num_drivers)
  1729.                return;
  1730.        dbri = (struct dbri *) drivers[dev].private;
  1731.        /* Pipe 1 is D channel transmit */
  1732.        xmit_on_pipe(dbri, 1, buffer, count, callback, callback_arg);
  1733. }
  1734. void dbri_drecv(int dev, __u8 *buffer, unsigned int size,
  1735.                 void (*callback)(void *, int, unsigned int),
  1736.                 void *callback_arg)
  1737. {
  1738.        struct dbri *dbri;
  1739.        if (dev >= num_drivers)
  1740.                return;
  1741.        dbri = (struct dbri *) drivers[dev].private;
  1742.        /* Pipe 0 is D channel receive */
  1743.        recv_on_pipe(dbri, 0, buffer, size, callback, callback_arg);
  1744. }
  1745. int dbri_bopen(int dev, unsigned int chan,
  1746.                int hdlcmode, u_char xmit_idle_char)
  1747. {
  1748.        struct dbri *dbri;
  1749.        if (dev >= num_drivers || chan > 1)
  1750.                return -1;
  1751.        dbri = (struct dbri *) drivers[dev].private;
  1752.        if (hdlcmode) {
  1753.                /* return -1; */
  1754.                /* Pipe 8/9: receive B1/B2 channel */
  1755.                setup_pipe(dbri, 8+chan, D_SDP_HDLC | D_SDP_FROM_SER|D_SDP_LSB);
  1756.                /* Pipe 10/11: transmit B1/B2 channel */
  1757.                setup_pipe(dbri,10+chan, D_SDP_HDLC | D_SDP_TO_SER | D_SDP_LSB);
  1758.        } else {        /* !hdlcmode means transparent */
  1759.                /* Pipe 8/9: receive B1/B2 channel */
  1760.                setup_pipe(dbri, 8+chan, D_SDP_MEM | D_SDP_FROM_SER|D_SDP_LSB);
  1761.                /* Pipe 10/11: transmit B1/B2 channel */
  1762.                setup_pipe(dbri,10+chan, D_SDP_MEM | D_SDP_TO_SER | D_SDP_LSB);
  1763.        }
  1764.        return 0;
  1765. }
  1766. void dbri_bclose(int dev, unsigned int chan)
  1767. {
  1768.        struct dbri *dbri;
  1769.        if (dev >= num_drivers || chan > 1)
  1770.                return;
  1771.        dbri = (struct dbri *) drivers[dev].private;
  1772.        reset_pipe(dbri, 8+chan);
  1773.        reset_pipe(dbri, 10+chan);
  1774. }
  1775. void dbri_bxmit(int dev, unsigned int chan,
  1776.                 __u8 *buffer, unsigned long count,
  1777.                 void (*callback)(void *, int),
  1778.                 void *callback_arg)
  1779. {
  1780.        struct dbri *dbri;
  1781.        if (dev >= num_drivers || chan > 1)
  1782.                return;
  1783.        dbri = (struct dbri *) drivers[dev].private;
  1784.        /* Pipe 10/11 is B1/B2 channel transmit */
  1785.        xmit_on_pipe(dbri, 10+chan, buffer, count, callback, callback_arg);
  1786. }
  1787. void dbri_brecv(int dev, unsigned int chan,
  1788.                 __u8 *buffer, unsigned long size,
  1789.                 void (*callback)(void *, int, unsigned int),
  1790.                 void *callback_arg)
  1791. {
  1792.        struct dbri *dbri;
  1793.        if (dev >= num_drivers || chan > 1)
  1794.                return;
  1795.        dbri = (struct dbri *) drivers[dev].private;
  1796.        /* Pipe 8/9 is B1/B2 channel receive */
  1797.        recv_on_pipe(dbri, 8+chan, buffer, size, callback, callback_arg);
  1798. }
  1799. #if defined(DBRI_ISDN)
  1800. struct foreign_interface dbri_foreign_interface = {
  1801.         dbri_get_irqnum,
  1802.         dbri_get_liu_state,
  1803.         dbri_liu_init,
  1804.         dbri_liu_activate,
  1805.         dbri_liu_deactivate,
  1806.         dbri_dxmit,
  1807.         dbri_drecv,
  1808.         dbri_bopen,
  1809.         dbri_bclose,
  1810.         dbri_bxmit,
  1811.         dbri_brecv
  1812. };
  1813. EXPORT_SYMBOL(dbri_foreign_interface);
  1814. #endif
  1815. /*
  1816. ****************************************************************************
  1817. **************************** Initialization ********************************
  1818. ****************************************************************************
  1819. */
  1820. static int dbri_attach(struct sparcaudio_driver *drv, 
  1821.                        struct sbus_dev *sdev)
  1822. {
  1823. struct dbri *dbri;
  1824. struct linux_prom_irqs irq;
  1825. int err;
  1826. if (sdev->prom_name[9] < 'e') {
  1827. printk(KERN_ERR "DBRI: unsupported chip version %c found.n",
  1828. sdev->prom_name[9]);
  1829. return -EIO;
  1830. }
  1831. drv->ops = &dbri_ops;
  1832. drv->private = kmalloc(sizeof(struct dbri), GFP_KERNEL);
  1833. if (drv->private == NULL)
  1834. return -ENOMEM;
  1835. dbri = (struct dbri *) drv->private;
  1836.         memset(dbri, 0, sizeof(*dbri));
  1837.         dbri->dma = sbus_alloc_consistent(sdev,
  1838.                                           sizeof(struct dbri_dma),
  1839.                                           &dbri->dma_dvma);
  1840. memset((void *) dbri->dma, 0, sizeof(struct dbri_dma));
  1841. dprintk(D_GEN, ("DBRI: DMA Cmd Block 0x%p (0x%08x)n",
  1842. dbri->dma, dbri->dma_dvma));
  1843. dbri->dbri_version = sdev->prom_name[9];
  1844.         dbri->sdev = sdev;
  1845. /* Map the registers into memory. */
  1846. dbri->regs_size = sdev->reg_addrs[0].reg_size;
  1847.         dbri->regs = sbus_ioremap(&sdev->resource[0], 0,
  1848.                                   sdev->reg_addrs[0].reg_size,
  1849.                                   "DBRI Registers");
  1850. if (!dbri->regs) {
  1851. printk(KERN_ERR "DBRI: could not allocate registersn");
  1852.                 sbus_free_consistent(sdev, sizeof(struct dbri_dma),
  1853.                                      (void *)dbri->dma, dbri->dma_dvma);
  1854. kfree(drv->private);
  1855. return -EIO;
  1856. }
  1857. prom_getproperty(sdev->prom_node, "intr", (char *)&irq, sizeof(irq));
  1858. dbri->irq = irq.pri;
  1859. err = request_irq(dbri->irq, dbri_intr, SA_SHIRQ,
  1860.                           "DBRI audio/ISDN", dbri);
  1861. if (err) {
  1862. printk(KERN_ERR "DBRI: Can't get irq %dn", dbri->irq);
  1863.                 sbus_iounmap(dbri->regs, dbri->regs_size);
  1864.                 sbus_free_consistent(sdev, sizeof(struct dbri_dma),
  1865.                                      (void *)dbri->dma, dbri->dma_dvma);
  1866. kfree(drv->private);
  1867. return err;
  1868. }
  1869. dbri_initialize(dbri);
  1870. err = mmcodec_init(drv);
  1871. if(err) {
  1872. dbri_detach(dbri);
  1873. return err;
  1874. }
  1875.   
  1876. /* Register ourselves with the midlevel audio driver. */
  1877. err = register_sparcaudio_driver(drv,1);
  1878. if (err) {
  1879. printk(KERN_ERR "DBRI: unable to register audion");
  1880.                 dbri_detach(dbri);
  1881. return err;
  1882. }
  1883. dbri->perchip_info.play.active   = dbri->perchip_info.play.pause = 0;
  1884. dbri->perchip_info.record.active = dbri->perchip_info.record.pause = 0;
  1885. printk(KERN_INFO "audio%d at 0x%lx (irq %d) is DBRI(%c)+CS4215(%d)n",
  1886.        num_drivers, dbri->regs,
  1887.        dbri->irq, dbri->dbri_version, dbri->mm.version);
  1888. return 0;
  1889. }
  1890. /* Probe for the dbri chip and then attach the driver. */
  1891. static int __init dbri_init(void)
  1892. {
  1893. struct sbus_bus *sbus;
  1894. struct sbus_dev *sdev;
  1895.   
  1896. num_drivers = 0;
  1897.   
  1898. /* Probe each SBUS for the DBRI chip(s). */
  1899. for_all_sbusdev(sdev, sbus) {
  1900. /*
  1901.  * The version is coded in the last character
  1902.  */
  1903. if (!strncmp(sdev->prom_name, "SUNW,DBRI", 9)) {
  1904.        dprintk(D_GEN, ("DBRI: Found %s in SBUS slot %dn",
  1905. sdev->prom_name, sdev->slot));
  1906. if (num_drivers >= MAX_DRIVERS) {
  1907. printk("DBRI: Ignoring slot %dn", sdev->slot);
  1908. continue;
  1909. }
  1910.       
  1911. if (dbri_attach(&drivers[num_drivers], sdev) == 0)
  1912. num_drivers++;
  1913. }
  1914. }
  1915.   
  1916. return (num_drivers > 0) ? 0 : -EIO;
  1917. }
  1918. static void __exit dbri_exit(void)
  1919. {
  1920.         register int i;
  1921.         for (i = 0; i < num_drivers; i++) {
  1922.                 dbri_detach((struct dbri *) drivers[i].private);
  1923.                 unregister_sparcaudio_driver(& drivers[i], 1);
  1924.                 num_drivers--;
  1925.         }
  1926. }
  1927. module_init(dbri_init);
  1928. module_exit(dbri_exit);
  1929. MODULE_LICENSE("GPL");
  1930. /*
  1931.  * Overrides for Emacs so that we follow Linus's tabbing style.
  1932.  * Emacs will notice this stuff at the end of the file and automatically
  1933.  * adjust the settings for this buffer only.  This must remain at the end
  1934.  * of the file.
  1935.  * ---------------------------------------------------------------------------
  1936.  * Local Variables:
  1937.  * c-indent-level: 8
  1938.  * c-brace-imaginary-offset: 0
  1939.  * c-brace-offset: -8
  1940.  * c-argdecl-indent: 8
  1941.  * c-label-offset: -8
  1942.  * c-continued-statement-offset: 8
  1943.  * c-continued-brace-offset: 0
  1944.  * indent-tabs-mode: nil
  1945.  * tab-width: 8
  1946.  * End:
  1947.  */