dbri.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:68k
源码类别:

嵌入式Linux

开发平台:

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