~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/sound/oss/swarm_cs4297a.c

Version: ~ [ linux-5.9 ] ~ [ linux-5.8.14 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.70 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.150 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.200 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.238 ] ~ [ linux-4.8.17 ] ~ [ linux-4.7.10 ] ~ [ linux-4.6.7 ] ~ [ linux-4.5.7 ] ~ [ linux-4.4.238 ] ~ [ linux-4.3.6 ] ~ [ linux-4.2.8 ] ~ [ linux-4.1.52 ] ~ [ linux-4.0.9 ] ~ [ linux-3.19.8 ] ~ [ linux-3.18.140 ] ~ [ linux-3.17.8 ] ~ [ linux-3.16.85 ] ~ [ linux-3.15.10 ] ~ [ linux-3.14.79 ] ~ [ linux-3.13.11 ] ~ [ linux-3.12.74 ] ~ [ linux-3.11.10 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.5 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 /*******************************************************************************
  2 *
  3 *      "swarm_cs4297a.c" --  Cirrus Logic-Crystal CS4297a linux audio driver.
  4 *
  5 *      Copyright (C) 2001  Broadcom Corporation.
  6 *      Copyright (C) 2000,2001  Cirrus Logic Corp.  
  7 *            -- adapted from drivers by Thomas Sailer, 
  8 *            -- but don't bug him; Problems should go to:
  9 *            -- tom woller (twoller@crystal.cirrus.com) or
 10 *               (audio@crystal.cirrus.com).
 11 *            -- adapted from cs4281 PCI driver for cs4297a on
 12 *               BCM1250 Synchronous Serial interface
 13 *               (Kip Walker, Broadcom Corp.)
 14 *      Copyright (C) 2004  Maciej W. Rozycki
 15 *      Copyright (C) 2005 Ralf Baechle (ralf@linux-mips.org)
 16 *
 17 *      This program is free software; you can redistribute it and/or modify
 18 *      it under the terms of the GNU General Public License as published by
 19 *      the Free Software Foundation; either version 2 of the License, or
 20 *      (at your option) any later version.
 21 *
 22 *      This program is distributed in the hope that it will be useful,
 23 *      but WITHOUT ANY WARRANTY; without even the implied warranty of
 24 *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 25 *      GNU General Public License for more details.
 26 *
 27 *      You should have received a copy of the GNU General Public License
 28 *      along with this program; if not, write to the Free Software
 29 *      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 30 *
 31 * Module command line parameters:
 32 *   none
 33 *
 34 *  Supported devices:
 35 *  /dev/dsp    standard /dev/dsp device, (mostly) OSS compatible
 36 *  /dev/mixer  standard /dev/mixer device, (mostly) OSS compatible
 37 *  /dev/midi   simple MIDI UART interface, no ioctl
 38 *
 39 * Modification History
 40 * 08/20/00 trw - silence and no stopping DAC until release
 41 * 08/23/00 trw - added CS_DBG statements, fix interrupt hang issue on DAC stop.
 42 * 09/18/00 trw - added 16bit only record with conversion 
 43 * 09/24/00 trw - added Enhanced Full duplex (separate simultaneous 
 44 *                capture/playback rates)
 45 * 10/03/00 trw - fixed mmap (fixed GRECORD and the XMMS mmap test plugin  
 46 *                libOSSm.so)
 47 * 10/11/00 trw - modified for 2.4.0-test9 kernel enhancements (NR_MAP removal)
 48 * 11/03/00 trw - fixed interrupt loss/stutter, added debug.
 49 * 11/10/00 bkz - added __devinit to cs4297a_hw_init()
 50 * 11/10/00 trw - fixed SMP and capture spinlock hang.
 51 * 12/04/00 trw - cleaned up CSDEBUG flags and added "defaultorder" moduleparm.
 52 * 12/05/00 trw - fixed polling (myth2), and added underrun swptr fix.
 53 * 12/08/00 trw - added PM support. 
 54 * 12/14/00 trw - added wrapper code, builds under 2.4.0, 2.2.17-20, 2.2.17-8 
 55 *                (RH/Dell base), 2.2.18, 2.2.12.  cleaned up code mods by ident.
 56 * 12/19/00 trw - added PM support for 2.2 base (apm_callback). other PM cleanup.
 57 * 12/21/00 trw - added fractional "defaultorder" inputs. if >100 then use 
 58 *                defaultorder-100 as power of 2 for the buffer size. example:
 59 *                106 = 2^(106-100) = 2^6 = 64 bytes for the buffer size.
 60 *
 61 *******************************************************************************/
 62 
 63 #include <linux/list.h>
 64 #include <linux/module.h>
 65 #include <linux/string.h>
 66 #include <linux/ioport.h>
 67 #include <linux/sched.h>
 68 #include <linux/delay.h>
 69 #include <linux/sound.h>
 70 #include <linux/slab.h>
 71 #include <linux/soundcard.h>
 72 #include <linux/pci.h>
 73 #include <linux/bitops.h>
 74 #include <linux/interrupt.h>
 75 #include <linux/init.h>
 76 #include <linux/poll.h>
 77 #include <linux/mutex.h>
 78 #include <linux/kernel.h>
 79 
 80 #include <asm/byteorder.h>
 81 #include <asm/dma.h>
 82 #include <asm/io.h>
 83 #include <asm/uaccess.h>
 84 
 85 #include <asm/sibyte/sb1250_regs.h>
 86 #include <asm/sibyte/sb1250_int.h>
 87 #include <asm/sibyte/sb1250_dma.h>
 88 #include <asm/sibyte/sb1250_scd.h>
 89 #include <asm/sibyte/sb1250_syncser.h>
 90 #include <asm/sibyte/sb1250_mac.h>
 91 #include <asm/sibyte/sb1250.h>
 92 
 93 struct cs4297a_state;
 94 
 95 static DEFINE_MUTEX(swarm_cs4297a_mutex);
 96 static void stop_dac(struct cs4297a_state *s);
 97 static void stop_adc(struct cs4297a_state *s);
 98 static void start_dac(struct cs4297a_state *s);
 99 static void start_adc(struct cs4297a_state *s);
100 #undef OSS_DOCUMENTED_MIXER_SEMANTICS
101 
102 // --------------------------------------------------------------------- 
103 
104 #define CS4297a_MAGIC           0xf00beef1
105 
106 // buffer order determines the size of the dma buffer for the driver.
107 // under Linux, a smaller buffer allows more responsiveness from many of the 
108 // applications (e.g. games).  A larger buffer allows some of the apps (esound) 
109 // to not underrun the dma buffer as easily.  As default, use 32k (order=3)
110 // rather than 64k as some of the games work more responsively.
111 // log base 2( buff sz = 32k).
112 
113 //
114 // Turn on/off debugging compilation by commenting out "#define CSDEBUG"
115 //
116 #define CSDEBUG 0
117 #if CSDEBUG
118 #define CSDEBUG_INTERFACE 1
119 #else
120 #undef CSDEBUG_INTERFACE
121 #endif
122 //
123 // cs_debugmask areas
124 //
125 #define CS_INIT         0x00000001      // initialization and probe functions
126 #define CS_ERROR        0x00000002      // tmp debugging bit placeholder
127 #define CS_INTERRUPT    0x00000004      // interrupt handler (separate from all other)
128 #define CS_FUNCTION     0x00000008      // enter/leave functions
129 #define CS_WAVE_WRITE   0x00000010      // write information for wave
130 #define CS_WAVE_READ    0x00000020      // read information for wave
131 #define CS_AC97         0x00000040      // AC97 register access
132 #define CS_DESCR        0x00000080      // descriptor management
133 #define CS_OPEN         0x00000400      // all open functions in the driver
134 #define CS_RELEASE      0x00000800      // all release functions in the driver
135 #define CS_PARMS        0x00001000      // functional and operational parameters
136 #define CS_IOCTL        0x00002000      // ioctl (non-mixer)
137 #define CS_TMP          0x10000000      // tmp debug mask bit
138 
139 //
140 // CSDEBUG is usual mode is set to 1, then use the
141 // cs_debuglevel and cs_debugmask to turn on or off debugging.
142 // Debug level of 1 has been defined to be kernel errors and info
143 // that should be printed on any released driver.
144 //
145 #if CSDEBUG
146 #define CS_DBGOUT(mask,level,x) if((cs_debuglevel >= (level)) && ((mask) & cs_debugmask) ) {x;}
147 #else
148 #define CS_DBGOUT(mask,level,x)
149 #endif
150 
151 #if CSDEBUG
152 static unsigned long cs_debuglevel = 4; // levels range from 1-9
153 static unsigned long cs_debugmask = CS_INIT /*| CS_IOCTL*/;
154 module_param(cs_debuglevel, int, 0);
155 module_param(cs_debugmask, int, 0);
156 #endif
157 #define CS_TRUE         1
158 #define CS_FALSE        0
159 
160 #define CS_TYPE_ADC 0
161 #define CS_TYPE_DAC 1
162 
163 #define SER_BASE    (A_SER_BASE_1 + KSEG1)
164 #define SS_CSR(t)   (SER_BASE+t)
165 #define SS_TXTBL(t) (SER_BASE+R_SER_TX_TABLE_BASE+(t*8))
166 #define SS_RXTBL(t) (SER_BASE+R_SER_RX_TABLE_BASE+(t*8))
167 
168 #define FRAME_BYTES            32
169 #define FRAME_SAMPLE_BYTES      4
170 
171 /* Should this be variable? */
172 #define SAMPLE_BUF_SIZE        (16*1024)
173 #define SAMPLE_FRAME_COUNT     (SAMPLE_BUF_SIZE / FRAME_SAMPLE_BYTES)
174 /* The driver can explode/shrink the frames to/from a smaller sample
175    buffer */
176 #define DMA_BLOAT_FACTOR       1
177 #define DMA_DESCR              (SAMPLE_FRAME_COUNT / DMA_BLOAT_FACTOR)
178 #define DMA_BUF_SIZE           (DMA_DESCR * FRAME_BYTES)
179 
180 /* Use the maxmium count (255 == 5.1 ms between interrupts) */
181 #define DMA_INT_CNT            ((1 << S_DMA_INT_PKTCNT) - 1)
182 
183 /* Figure this out: how many TX DMAs ahead to schedule a reg access */
184 #define REG_LATENCY            150
185 
186 #define FRAME_TX_US             20
187 
188 #define SERDMA_NEXTBUF(d,f) (((d)->f+1) % (d)->ringsz)
189 
190 static const char invalid_magic[] =
191     KERN_CRIT "cs4297a: invalid magic value\n";
192 
193 #define VALIDATE_STATE(s)                          \
194 ({                                                 \
195         if (!(s) || (s)->magic != CS4297a_MAGIC) { \
196                 printk(invalid_magic);             \
197                 return -ENXIO;                     \
198         }                                          \
199 })
200 
201 /* AC97 registers */
202 #define AC97_MASTER_VOL_STEREO   0x0002      /* Line Out                */
203 #define AC97_PCBEEP_VOL          0x000a      /* none                    */
204 #define AC97_PHONE_VOL           0x000c      /* TAD Input (mono)        */
205 #define AC97_MIC_VOL             0x000e      /* MIC Input (mono)        */
206 #define AC97_LINEIN_VOL          0x0010      /* Line Input (stereo)     */
207 #define AC97_CD_VOL              0x0012      /* CD Input (stereo)       */
208 #define AC97_AUX_VOL             0x0016      /* Aux Input (stereo)      */
209 #define AC97_PCMOUT_VOL          0x0018      /* Wave Output (stereo)    */
210 #define AC97_RECORD_SELECT       0x001a      /*                 */
211 #define AC97_RECORD_GAIN         0x001c
212 #define AC97_GENERAL_PURPOSE     0x0020
213 #define AC97_3D_CONTROL          0x0022
214 #define AC97_POWER_CONTROL       0x0026
215 #define AC97_VENDOR_ID1           0x007c
216 
217 struct list_head cs4297a_devs = { &cs4297a_devs, &cs4297a_devs };
218 
219 typedef struct serdma_descr_s {
220         u64 descr_a;
221         u64 descr_b;
222 } serdma_descr_t;
223 
224 typedef unsigned long paddr_t;
225 
226 typedef struct serdma_s {
227         unsigned         ringsz;
228         serdma_descr_t  *descrtab;
229         serdma_descr_t  *descrtab_end;
230         paddr_t          descrtab_phys;
231         
232         serdma_descr_t  *descr_add;
233         serdma_descr_t  *descr_rem;
234         
235         u64  *dma_buf;           // buffer for DMA contents (frames)
236         paddr_t          dma_buf_phys;
237         u16  *sample_buf;               // tmp buffer for sample conversions
238         u16  *sb_swptr;
239         u16  *sb_hwptr;
240         u16  *sb_end;
241 
242         dma_addr_t dmaaddr;
243 //        unsigned buforder;    // Log base 2 of 'dma_buf' size in bytes..
244         unsigned numfrag;       // # of 'fragments' in the buffer.
245         unsigned fragshift;     // Log base 2 of fragment size.
246         unsigned hwptr, swptr;
247         unsigned total_bytes;   // # bytes process since open.
248         unsigned blocks;        // last returned blocks value GETOPTR
249         unsigned wakeup;        // interrupt occurred on block 
250         int count;
251         unsigned underrun;      // underrun flag
252         unsigned error; // over/underrun 
253         wait_queue_head_t wait;
254         wait_queue_head_t reg_wait;
255         // redundant, but makes calculations easier 
256         unsigned fragsize;      // 2**fragshift..
257         unsigned sbufsz;        // 2**buforder.
258         unsigned fragsamples;
259         // OSS stuff 
260         unsigned mapped:1;      // Buffer mapped in cs4297a_mmap()?
261         unsigned ready:1;       // prog_dmabuf_dac()/adc() successful?
262         unsigned endcleared:1;
263         unsigned type:1;        // adc or dac buffer (CS_TYPE_XXX)
264         unsigned ossfragshift;
265         int ossmaxfrags;
266         unsigned subdivision;
267 } serdma_t;
268 
269 struct cs4297a_state {
270         // magic 
271         unsigned int magic;
272 
273         struct list_head list;
274 
275         // soundcore stuff 
276         int dev_audio;
277         int dev_mixer;
278 
279         // hardware resources 
280         unsigned int irq;
281 
282         struct {
283                 unsigned int rx_ovrrn; /* FIFO */
284                 unsigned int rx_overflow; /* staging buffer */
285                 unsigned int tx_underrun;
286                 unsigned int rx_bad;
287                 unsigned int rx_good;
288         } stats;
289 
290         // mixer registers 
291         struct {
292                 unsigned short vol[10];
293                 unsigned int recsrc;
294                 unsigned int modcnt;
295                 unsigned short micpreamp;
296         } mix;
297 
298         // wave stuff   
299         struct properties {
300                 unsigned fmt;
301                 unsigned fmt_original;  // original requested format
302                 unsigned channels;
303                 unsigned rate;
304         } prop_dac, prop_adc;
305         unsigned conversion:1;  // conversion from 16 to 8 bit in progress
306         unsigned ena;
307         spinlock_t lock;
308         struct mutex open_mutex;
309         struct mutex open_sem_adc;
310         struct mutex open_sem_dac;
311         fmode_t open_mode;
312         wait_queue_head_t open_wait;
313         wait_queue_head_t open_wait_adc;
314         wait_queue_head_t open_wait_dac;
315 
316         dma_addr_t dmaaddr_sample_buf;
317         unsigned buforder_sample_buf;   // Log base 2 of 'dma_buf' size in bytes..
318 
319         serdma_t dma_dac, dma_adc;
320 
321         volatile u16 read_value;
322         volatile u16 read_reg;
323         volatile u64 reg_request;
324 };
325 
326 #if 1
327 #define prog_codec(a,b)
328 #define dealloc_dmabuf(a,b);
329 #endif
330 
331 static int prog_dmabuf_adc(struct cs4297a_state *s)
332 {
333         s->dma_adc.ready = 1;
334         return 0;
335 }
336 
337 
338 static int prog_dmabuf_dac(struct cs4297a_state *s)
339 {
340         s->dma_dac.ready = 1;
341         return 0;
342 }
343 
344 static void clear_advance(void *buf, unsigned bsize, unsigned bptr,
345                           unsigned len, unsigned char c)
346 {
347         if (bptr + len > bsize) {
348                 unsigned x = bsize - bptr;
349                 memset(((char *) buf) + bptr, c, x);
350                 bptr = 0;
351                 len -= x;
352         }
353         CS_DBGOUT(CS_WAVE_WRITE, 4, printk(KERN_INFO
354                 "cs4297a: clear_advance(): memset %d at 0x%.8x for %d size \n",
355                         (unsigned)c, (unsigned)((char *) buf) + bptr, len));
356         memset(((char *) buf) + bptr, c, len);
357 }
358 
359 #if CSDEBUG
360 
361 // DEBUG ROUTINES
362 
363 #define SOUND_MIXER_CS_GETDBGLEVEL      _SIOWR('M',120, int)
364 #define SOUND_MIXER_CS_SETDBGLEVEL      _SIOWR('M',121, int)
365 #define SOUND_MIXER_CS_GETDBGMASK       _SIOWR('M',122, int)
366 #define SOUND_MIXER_CS_SETDBGMASK       _SIOWR('M',123, int)
367 
368 static void cs_printioctl(unsigned int x)
369 {
370         unsigned int i;
371         unsigned char vidx;
372         // Index of mixtable1[] member is Device ID 
373         // and must be <= SOUND_MIXER_NRDEVICES.
374         // Value of array member is index into s->mix.vol[]
375         static const unsigned char mixtable1[SOUND_MIXER_NRDEVICES] = {
376                 [SOUND_MIXER_PCM] = 1,  // voice 
377                 [SOUND_MIXER_LINE1] = 2,        // AUX
378                 [SOUND_MIXER_CD] = 3,   // CD 
379                 [SOUND_MIXER_LINE] = 4, // Line 
380                 [SOUND_MIXER_SYNTH] = 5,        // FM
381                 [SOUND_MIXER_MIC] = 6,  // Mic 
382                 [SOUND_MIXER_SPEAKER] = 7,      // Speaker 
383                 [SOUND_MIXER_RECLEV] = 8,       // Recording level 
384                 [SOUND_MIXER_VOLUME] = 9        // Master Volume 
385         };
386 
387         switch (x) {
388         case SOUND_MIXER_CS_GETDBGMASK:
389                 CS_DBGOUT(CS_IOCTL, 4,
390                           printk("SOUND_MIXER_CS_GETDBGMASK:\n"));
391                 break;
392         case SOUND_MIXER_CS_GETDBGLEVEL:
393                 CS_DBGOUT(CS_IOCTL, 4,
394                           printk("SOUND_MIXER_CS_GETDBGLEVEL:\n"));
395                 break;
396         case SOUND_MIXER_CS_SETDBGMASK:
397                 CS_DBGOUT(CS_IOCTL, 4,
398                           printk("SOUND_MIXER_CS_SETDBGMASK:\n"));
399                 break;
400         case SOUND_MIXER_CS_SETDBGLEVEL:
401                 CS_DBGOUT(CS_IOCTL, 4,
402                           printk("SOUND_MIXER_CS_SETDBGLEVEL:\n"));
403                 break;
404         case OSS_GETVERSION:
405                 CS_DBGOUT(CS_IOCTL, 4, printk("OSS_GETVERSION:\n"));
406                 break;
407         case SNDCTL_DSP_SYNC:
408                 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_SYNC:\n"));
409                 break;
410         case SNDCTL_DSP_SETDUPLEX:
411                 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_SETDUPLEX:\n"));
412                 break;
413         case SNDCTL_DSP_GETCAPS:
414                 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETCAPS:\n"));
415                 break;
416         case SNDCTL_DSP_RESET:
417                 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_RESET:\n"));
418                 break;
419         case SNDCTL_DSP_SPEED:
420                 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_SPEED:\n"));
421                 break;
422         case SNDCTL_DSP_STEREO:
423                 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_STEREO:\n"));
424                 break;
425         case SNDCTL_DSP_CHANNELS:
426                 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_CHANNELS:\n"));
427                 break;
428         case SNDCTL_DSP_GETFMTS:
429                 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETFMTS:\n"));
430                 break;
431         case SNDCTL_DSP_SETFMT:
432                 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_SETFMT:\n"));
433                 break;
434         case SNDCTL_DSP_POST:
435                 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_POST:\n"));
436                 break;
437         case SNDCTL_DSP_GETTRIGGER:
438                 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETTRIGGER:\n"));
439                 break;
440         case SNDCTL_DSP_SETTRIGGER:
441                 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_SETTRIGGER:\n"));
442                 break;
443         case SNDCTL_DSP_GETOSPACE:
444                 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETOSPACE:\n"));
445                 break;
446         case SNDCTL_DSP_GETISPACE:
447                 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETISPACE:\n"));
448                 break;
449         case SNDCTL_DSP_NONBLOCK:
450                 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_NONBLOCK:\n"));
451                 break;
452         case SNDCTL_DSP_GETODELAY:
453                 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETODELAY:\n"));
454                 break;
455         case SNDCTL_DSP_GETIPTR:
456                 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETIPTR:\n"));
457                 break;
458         case SNDCTL_DSP_GETOPTR:
459                 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETOPTR:\n"));
460                 break;
461         case SNDCTL_DSP_GETBLKSIZE:
462                 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETBLKSIZE:\n"));
463                 break;
464         case SNDCTL_DSP_SETFRAGMENT:
465                 CS_DBGOUT(CS_IOCTL, 4,
466                           printk("SNDCTL_DSP_SETFRAGMENT:\n"));
467                 break;
468         case SNDCTL_DSP_SUBDIVIDE:
469                 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_SUBDIVIDE:\n"));
470                 break;
471         case SOUND_PCM_READ_RATE:
472                 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_PCM_READ_RATE:\n"));
473                 break;
474         case SOUND_PCM_READ_CHANNELS:
475                 CS_DBGOUT(CS_IOCTL, 4,
476                           printk("SOUND_PCM_READ_CHANNELS:\n"));
477                 break;
478         case SOUND_PCM_READ_BITS:
479                 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_PCM_READ_BITS:\n"));
480                 break;
481         case SOUND_PCM_WRITE_FILTER:
482                 CS_DBGOUT(CS_IOCTL, 4,
483                           printk("SOUND_PCM_WRITE_FILTER:\n"));
484                 break;
485         case SNDCTL_DSP_SETSYNCRO:
486                 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_SETSYNCRO:\n"));
487                 break;
488         case SOUND_PCM_READ_FILTER:
489                 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_PCM_READ_FILTER:\n"));
490                 break;
491         case SOUND_MIXER_PRIVATE1:
492                 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_PRIVATE1:\n"));
493                 break;
494         case SOUND_MIXER_PRIVATE2:
495                 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_PRIVATE2:\n"));
496                 break;
497         case SOUND_MIXER_PRIVATE3:
498                 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_PRIVATE3:\n"));
499                 break;
500         case SOUND_MIXER_PRIVATE4:
501                 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_PRIVATE4:\n"));
502                 break;
503         case SOUND_MIXER_PRIVATE5:
504                 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_PRIVATE5:\n"));
505                 break;
506         case SOUND_MIXER_INFO:
507                 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_INFO:\n"));
508                 break;
509         case SOUND_OLD_MIXER_INFO:
510                 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_OLD_MIXER_INFO:\n"));
511                 break;
512 
513         default:
514                 switch (_IOC_NR(x)) {
515                 case SOUND_MIXER_VOLUME:
516                         CS_DBGOUT(CS_IOCTL, 4,
517                                   printk("SOUND_MIXER_VOLUME:\n"));
518                         break;
519                 case SOUND_MIXER_SPEAKER:
520                         CS_DBGOUT(CS_IOCTL, 4,
521                                   printk("SOUND_MIXER_SPEAKER:\n"));
522                         break;
523                 case SOUND_MIXER_RECLEV:
524                         CS_DBGOUT(CS_IOCTL, 4,
525                                   printk("SOUND_MIXER_RECLEV:\n"));
526                         break;
527                 case SOUND_MIXER_MIC:
528                         CS_DBGOUT(CS_IOCTL, 4,
529                                   printk("SOUND_MIXER_MIC:\n"));
530                         break;
531                 case SOUND_MIXER_SYNTH:
532                         CS_DBGOUT(CS_IOCTL, 4,
533                                   printk("SOUND_MIXER_SYNTH:\n"));
534                         break;
535                 case SOUND_MIXER_RECSRC:
536                         CS_DBGOUT(CS_IOCTL, 4,
537                                   printk("SOUND_MIXER_RECSRC:\n"));
538                         break;
539                 case SOUND_MIXER_DEVMASK:
540                         CS_DBGOUT(CS_IOCTL, 4,
541                                   printk("SOUND_MIXER_DEVMASK:\n"));
542                         break;
543                 case SOUND_MIXER_RECMASK:
544                         CS_DBGOUT(CS_IOCTL, 4,
545                                   printk("SOUND_MIXER_RECMASK:\n"));
546                         break;
547                 case SOUND_MIXER_STEREODEVS:
548                         CS_DBGOUT(CS_IOCTL, 4,
549                                   printk("SOUND_MIXER_STEREODEVS:\n"));
550                         break;
551                 case SOUND_MIXER_CAPS:
552                         CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_CAPS:\n"));
553                         break;
554                 default:
555                         i = _IOC_NR(x);
556                         if (i >= SOUND_MIXER_NRDEVICES
557                             || !(vidx = mixtable1[i])) {
558                                 CS_DBGOUT(CS_IOCTL, 4, printk
559                                         ("UNKNOWN IOCTL: 0x%.8x NR=%d\n",
560                                                 x, i));
561                         } else {
562                                 CS_DBGOUT(CS_IOCTL, 4, printk
563                                         ("SOUND_MIXER_IOCTL AC9x: 0x%.8x NR=%d\n",
564                                                 x, i));
565                         }
566                         break;
567                 }
568         }
569 }
570 #endif
571 
572 
573 static int ser_init(struct cs4297a_state *s)
574 {
575         int i;
576 
577         CS_DBGOUT(CS_INIT, 2, 
578                   printk(KERN_INFO "cs4297a: Setting up serial parameters\n"));
579 
580         __raw_writeq(M_SYNCSER_CMD_RX_RESET | M_SYNCSER_CMD_TX_RESET, SS_CSR(R_SER_CMD));
581 
582         __raw_writeq(M_SYNCSER_MSB_FIRST, SS_CSR(R_SER_MODE));
583         __raw_writeq(32, SS_CSR(R_SER_MINFRM_SZ));
584         __raw_writeq(32, SS_CSR(R_SER_MAXFRM_SZ));
585 
586         __raw_writeq(1, SS_CSR(R_SER_TX_RD_THRSH));
587         __raw_writeq(4, SS_CSR(R_SER_TX_WR_THRSH));
588         __raw_writeq(8, SS_CSR(R_SER_RX_RD_THRSH));
589 
590         /* This looks good from experimentation */
591         __raw_writeq((M_SYNCSER_TXSYNC_INT | V_SYNCSER_TXSYNC_DLY(0) | M_SYNCSER_TXCLK_EXT |
592                M_SYNCSER_RXSYNC_INT | V_SYNCSER_RXSYNC_DLY(1) | M_SYNCSER_RXCLK_EXT | M_SYNCSER_RXSYNC_EDGE),
593               SS_CSR(R_SER_LINE_MODE));
594 
595         /* This looks good from experimentation */
596         __raw_writeq(V_SYNCSER_SEQ_COUNT(14) | M_SYNCSER_SEQ_ENABLE | M_SYNCSER_SEQ_STROBE,
597               SS_TXTBL(0));
598         __raw_writeq(V_SYNCSER_SEQ_COUNT(15) | M_SYNCSER_SEQ_ENABLE | M_SYNCSER_SEQ_BYTE,
599               SS_TXTBL(1));
600         __raw_writeq(V_SYNCSER_SEQ_COUNT(13) | M_SYNCSER_SEQ_ENABLE | M_SYNCSER_SEQ_BYTE,
601               SS_TXTBL(2));
602         __raw_writeq(V_SYNCSER_SEQ_COUNT( 0) | M_SYNCSER_SEQ_ENABLE |
603               M_SYNCSER_SEQ_STROBE | M_SYNCSER_SEQ_LAST, SS_TXTBL(3));
604 
605         __raw_writeq(V_SYNCSER_SEQ_COUNT(14) | M_SYNCSER_SEQ_ENABLE | M_SYNCSER_SEQ_STROBE,
606               SS_RXTBL(0));
607         __raw_writeq(V_SYNCSER_SEQ_COUNT(15) | M_SYNCSER_SEQ_ENABLE | M_SYNCSER_SEQ_BYTE,
608               SS_RXTBL(1));
609         __raw_writeq(V_SYNCSER_SEQ_COUNT(13) | M_SYNCSER_SEQ_ENABLE | M_SYNCSER_SEQ_BYTE,
610               SS_RXTBL(2));
611         __raw_writeq(V_SYNCSER_SEQ_COUNT( 0) | M_SYNCSER_SEQ_ENABLE | M_SYNCSER_SEQ_STROBE |
612               M_SYNCSER_SEQ_LAST, SS_RXTBL(3));
613 
614         for (i=4; i<16; i++) {
615                 /* Just in case... */
616                 __raw_writeq(M_SYNCSER_SEQ_LAST, SS_TXTBL(i));
617                 __raw_writeq(M_SYNCSER_SEQ_LAST, SS_RXTBL(i));
618         }
619 
620         return 0;
621 }
622 
623 static int init_serdma(serdma_t *dma)
624 {
625         CS_DBGOUT(CS_INIT, 2,
626                   printk(KERN_ERR "cs4297a: desc - %d sbufsize - %d dbufsize - %d\n",
627                          DMA_DESCR, SAMPLE_BUF_SIZE, DMA_BUF_SIZE));
628 
629         /* Descriptors */
630         dma->ringsz = DMA_DESCR;
631         dma->descrtab = kzalloc(dma->ringsz * sizeof(serdma_descr_t), GFP_KERNEL);
632         if (!dma->descrtab) {
633                 printk(KERN_ERR "cs4297a: kzalloc descrtab failed\n");
634                 return -1;
635         }
636         dma->descrtab_end = dma->descrtab + dma->ringsz;
637         /* XXX bloddy mess, use proper DMA API here ...  */
638         dma->descrtab_phys = CPHYSADDR((long)dma->descrtab);
639         dma->descr_add = dma->descr_rem = dma->descrtab;
640 
641         /* Frame buffer area */
642         dma->dma_buf = kzalloc(DMA_BUF_SIZE, GFP_KERNEL);
643         if (!dma->dma_buf) {
644                 printk(KERN_ERR "cs4297a: kzalloc dma_buf failed\n");
645                 kfree(dma->descrtab);
646                 return -1;
647         }
648         dma->dma_buf_phys = CPHYSADDR((long)dma->dma_buf);
649 
650         /* Samples buffer area */
651         dma->sbufsz = SAMPLE_BUF_SIZE;
652         dma->sample_buf = kmalloc(dma->sbufsz, GFP_KERNEL);
653         if (!dma->sample_buf) {
654                 printk(KERN_ERR "cs4297a: kmalloc sample_buf failed\n");
655                 kfree(dma->descrtab);
656                 kfree(dma->dma_buf);
657                 return -1;
658         }
659         dma->sb_swptr = dma->sb_hwptr = dma->sample_buf;
660         dma->sb_end = (u16 *)((void *)dma->sample_buf + dma->sbufsz);
661         dma->fragsize = dma->sbufsz >> 1;
662 
663         CS_DBGOUT(CS_INIT, 4, 
664                   printk(KERN_ERR "cs4297a: descrtab - %08x dma_buf - %x sample_buf - %x\n",
665                          (int)dma->descrtab, (int)dma->dma_buf, 
666                          (int)dma->sample_buf));
667 
668         return 0;
669 }
670 
671 static int dma_init(struct cs4297a_state *s)
672 {
673         int i;
674 
675         CS_DBGOUT(CS_INIT, 2, 
676                   printk(KERN_INFO "cs4297a: Setting up DMA\n"));
677 
678         if (init_serdma(&s->dma_adc) ||
679             init_serdma(&s->dma_dac))
680                 return -1;
681 
682         if (__raw_readq(SS_CSR(R_SER_DMA_DSCR_COUNT_RX))||
683             __raw_readq(SS_CSR(R_SER_DMA_DSCR_COUNT_TX))) {
684                 panic("DMA state corrupted?!");
685         }
686 
687         /* Initialize now - the descr/buffer pairings will never
688            change... */
689         for (i=0; i<DMA_DESCR; i++) {
690                 s->dma_dac.descrtab[i].descr_a = M_DMA_SERRX_SOP | V_DMA_DSCRA_A_SIZE(1) | 
691                         (s->dma_dac.dma_buf_phys + i*FRAME_BYTES);
692                 s->dma_dac.descrtab[i].descr_b = V_DMA_DSCRB_PKT_SIZE(FRAME_BYTES);
693                 s->dma_adc.descrtab[i].descr_a = V_DMA_DSCRA_A_SIZE(1) |
694                         (s->dma_adc.dma_buf_phys + i*FRAME_BYTES);
695                 s->dma_adc.descrtab[i].descr_b = 0;
696         }
697 
698         __raw_writeq((M_DMA_EOP_INT_EN | V_DMA_INT_PKTCNT(DMA_INT_CNT) |
699                V_DMA_RINGSZ(DMA_DESCR) | M_DMA_TDX_EN),
700               SS_CSR(R_SER_DMA_CONFIG0_RX));
701         __raw_writeq(M_DMA_L2CA, SS_CSR(R_SER_DMA_CONFIG1_RX));
702         __raw_writeq(s->dma_adc.descrtab_phys, SS_CSR(R_SER_DMA_DSCR_BASE_RX));
703 
704         __raw_writeq(V_DMA_RINGSZ(DMA_DESCR), SS_CSR(R_SER_DMA_CONFIG0_TX));
705         __raw_writeq(M_DMA_L2CA | M_DMA_NO_DSCR_UPDT, SS_CSR(R_SER_DMA_CONFIG1_TX));
706         __raw_writeq(s->dma_dac.descrtab_phys, SS_CSR(R_SER_DMA_DSCR_BASE_TX));
707 
708         /* Prep the receive DMA descriptor ring */
709         __raw_writeq(DMA_DESCR, SS_CSR(R_SER_DMA_DSCR_COUNT_RX));
710 
711         __raw_writeq(M_SYNCSER_DMA_RX_EN | M_SYNCSER_DMA_TX_EN, SS_CSR(R_SER_DMA_ENABLE));
712 
713         __raw_writeq((M_SYNCSER_RX_SYNC_ERR | M_SYNCSER_RX_OVERRUN | M_SYNCSER_RX_EOP_COUNT),
714               SS_CSR(R_SER_INT_MASK));
715 
716         /* Enable the rx/tx; let the codec warm up to the sync and
717            start sending good frames before the receive FIFO is
718            enabled */
719         __raw_writeq(M_SYNCSER_CMD_TX_EN, SS_CSR(R_SER_CMD));
720         udelay(1000);
721         __raw_writeq(M_SYNCSER_CMD_RX_EN | M_SYNCSER_CMD_TX_EN, SS_CSR(R_SER_CMD));
722 
723         /* XXXKW is this magic? (the "1" part) */
724         while ((__raw_readq(SS_CSR(R_SER_STATUS)) & 0xf1) != 1)
725                 ;
726 
727         CS_DBGOUT(CS_INIT, 4, 
728                   printk(KERN_INFO "cs4297a: status: %08x\n",
729                          (unsigned int)(__raw_readq(SS_CSR(R_SER_STATUS)) & 0xffffffff)));
730 
731         return 0;
732 }
733 
734 static int serdma_reg_access(struct cs4297a_state *s, u64 data)
735 {
736         serdma_t *d = &s->dma_dac;
737         u64 *data_p;
738         unsigned swptr;
739         unsigned long flags;
740         serdma_descr_t *descr;
741 
742         if (s->reg_request) {
743                 printk(KERN_ERR "cs4297a: attempt to issue multiple reg_access\n");
744                 return -1;
745         }
746 
747         if (s->ena & FMODE_WRITE) {
748                 /* Since a writer has the DSP open, we have to mux the
749                    request in */
750                 s->reg_request = data;
751                 interruptible_sleep_on(&s->dma_dac.reg_wait);
752                 /* XXXKW how can I deal with the starvation case where
753                    the opener isn't writing? */
754         } else {
755                 /* Be safe when changing ring pointers */
756                 spin_lock_irqsave(&s->lock, flags);
757                 if (d->hwptr != d->swptr) {
758                         printk(KERN_ERR "cs4297a: reg access found bookkeeping error (hw/sw = %d/%d\n",
759                                d->hwptr, d->swptr);
760                         spin_unlock_irqrestore(&s->lock, flags);
761                         return -1;
762                 }
763                 swptr = d->swptr;
764                 d->hwptr = d->swptr = (d->swptr + 1) % d->ringsz;
765                 spin_unlock_irqrestore(&s->lock, flags);
766 
767                 descr = &d->descrtab[swptr];
768                 data_p = &d->dma_buf[swptr * 4];
769                 *data_p = cpu_to_be64(data);
770                 __raw_writeq(1, SS_CSR(R_SER_DMA_DSCR_COUNT_TX));
771                 CS_DBGOUT(CS_DESCR, 4,
772                           printk(KERN_INFO "cs4297a: add_tx  %p (%x -> %x)\n",
773                                  data_p, swptr, d->hwptr));
774         }
775 
776         CS_DBGOUT(CS_FUNCTION, 6,
777                   printk(KERN_INFO "cs4297a: serdma_reg_access()-\n"));
778         
779         return 0;
780 }
781 
782 //****************************************************************************
783 // "cs4297a_read_ac97" -- Reads an AC97 register
784 //****************************************************************************
785 static int cs4297a_read_ac97(struct cs4297a_state *s, u32 offset,
786                             u32 * value)
787 {
788         CS_DBGOUT(CS_AC97, 1,
789                   printk(KERN_INFO "cs4297a: read reg %2x\n", offset));
790         if (serdma_reg_access(s, (0xCLL << 60) | (1LL << 47) | ((u64)(offset & 0x7F) << 40)))
791                 return -1;
792 
793         interruptible_sleep_on(&s->dma_adc.reg_wait);
794         *value = s->read_value;
795         CS_DBGOUT(CS_AC97, 2,
796                   printk(KERN_INFO "cs4297a: rdr reg %x -> %x\n", s->read_reg, s->read_value));
797 
798         return 0;
799 }
800 
801 
802 //****************************************************************************
803 // "cs4297a_write_ac97()"-- writes an AC97 register
804 //****************************************************************************
805 static int cs4297a_write_ac97(struct cs4297a_state *s, u32 offset,
806                              u32 value)
807 {
808         CS_DBGOUT(CS_AC97, 1,
809                   printk(KERN_INFO "cs4297a: write reg %2x -> %04x\n", offset, value));
810         return (serdma_reg_access(s, (0xELL << 60) | ((u64)(offset & 0x7F) << 40) | ((value & 0xffff) << 12)));
811 }
812 
813 static void stop_dac(struct cs4297a_state *s)
814 {
815         unsigned long flags;
816 
817         CS_DBGOUT(CS_WAVE_WRITE, 3, printk(KERN_INFO "cs4297a: stop_dac():\n"));
818         spin_lock_irqsave(&s->lock, flags);
819         s->ena &= ~FMODE_WRITE;
820 #if 0
821         /* XXXKW what do I really want here?  My theory for now is
822            that I just flip the "ena" bit, and the interrupt handler
823            will stop processing the xmit channel */
824         __raw_writeq((s->ena & FMODE_READ) ? M_SYNCSER_DMA_RX_EN : 0,
825               SS_CSR(R_SER_DMA_ENABLE));
826 #endif
827 
828         spin_unlock_irqrestore(&s->lock, flags);
829 }
830 
831 
832 static void start_dac(struct cs4297a_state *s)
833 {
834         unsigned long flags;
835 
836         CS_DBGOUT(CS_FUNCTION, 3, printk(KERN_INFO "cs4297a: start_dac()+\n"));
837         spin_lock_irqsave(&s->lock, flags);
838         if (!(s->ena & FMODE_WRITE) && (s->dma_dac.mapped ||
839                                         (s->dma_dac.count > 0
840                                         && s->dma_dac.ready))) {
841                 s->ena |= FMODE_WRITE;
842                 /* XXXKW what do I really want here?  My theory for
843                    now is that I just flip the "ena" bit, and the
844                    interrupt handler will start processing the xmit
845                    channel */
846 
847                 CS_DBGOUT(CS_WAVE_WRITE | CS_PARMS, 8, printk(KERN_INFO
848                         "cs4297a: start_dac(): start dma\n"));
849 
850         }
851         spin_unlock_irqrestore(&s->lock, flags);
852         CS_DBGOUT(CS_FUNCTION, 3,
853                   printk(KERN_INFO "cs4297a: start_dac()-\n"));
854 }
855 
856 
857 static void stop_adc(struct cs4297a_state *s)
858 {
859         unsigned long flags;
860 
861         CS_DBGOUT(CS_FUNCTION, 3,
862                   printk(KERN_INFO "cs4297a: stop_adc()+\n"));
863 
864         spin_lock_irqsave(&s->lock, flags);
865         s->ena &= ~FMODE_READ;
866 
867         if (s->conversion == 1) {
868                 s->conversion = 0;
869                 s->prop_adc.fmt = s->prop_adc.fmt_original;
870         }
871         /* Nothing to do really, I need to keep the DMA going
872            XXXKW when do I get here, and is there more I should do? */
873         spin_unlock_irqrestore(&s->lock, flags);
874         CS_DBGOUT(CS_FUNCTION, 3,
875                   printk(KERN_INFO "cs4297a: stop_adc()-\n"));
876 }
877 
878 
879 static void start_adc(struct cs4297a_state *s)
880 {
881         unsigned long flags;
882 
883         CS_DBGOUT(CS_FUNCTION, 2,
884                   printk(KERN_INFO "cs4297a: start_adc()+\n"));
885 
886         if (!(s->ena & FMODE_READ) &&
887             (s->dma_adc.mapped || s->dma_adc.count <=
888              (signed) (s->dma_adc.sbufsz - 2 * s->dma_adc.fragsize))
889             && s->dma_adc.ready) {
890                 if (s->prop_adc.fmt & AFMT_S8 || s->prop_adc.fmt & AFMT_U8) {
891                         // 
892                         // now only use 16 bit capture, due to truncation issue
893                         // in the chip, noticeable distortion occurs.
894                         // allocate buffer and then convert from 16 bit to 
895                         // 8 bit for the user buffer.
896                         //
897                         s->prop_adc.fmt_original = s->prop_adc.fmt;
898                         if (s->prop_adc.fmt & AFMT_S8) {
899                                 s->prop_adc.fmt &= ~AFMT_S8;
900                                 s->prop_adc.fmt |= AFMT_S16_LE;
901                         }
902                         if (s->prop_adc.fmt & AFMT_U8) {
903                                 s->prop_adc.fmt &= ~AFMT_U8;
904                                 s->prop_adc.fmt |= AFMT_U16_LE;
905                         }
906                         //
907                         // prog_dmabuf_adc performs a stop_adc() but that is
908                         // ok since we really haven't started the DMA yet.
909                         //
910                         prog_codec(s, CS_TYPE_ADC);
911 
912                         prog_dmabuf_adc(s);
913                         s->conversion = 1;
914                 }
915                 spin_lock_irqsave(&s->lock, flags);
916                 s->ena |= FMODE_READ;
917                 /* Nothing to do really, I am probably already
918                    DMAing...  XXXKW when do I get here, and is there
919                    more I should do? */
920                 spin_unlock_irqrestore(&s->lock, flags);
921 
922                 CS_DBGOUT(CS_PARMS, 6, printk(KERN_INFO
923                          "cs4297a: start_adc(): start adc\n"));
924         }
925         CS_DBGOUT(CS_FUNCTION, 2,
926                   printk(KERN_INFO "cs4297a: start_adc()-\n"));
927 
928 }
929 
930 
931 // call with spinlock held! 
932 static void cs4297a_update_ptr(struct cs4297a_state *s, int intflag)
933 {
934         int good_diff, diff, diff2;
935         u64 *data_p, data;
936         u32 *s_ptr;
937         unsigned hwptr;
938         u32 status;
939         serdma_t *d;
940         serdma_descr_t *descr;
941 
942         // update ADC pointer 
943         status = intflag ? __raw_readq(SS_CSR(R_SER_STATUS)) : 0;
944 
945         if ((s->ena & FMODE_READ) || (status & (M_SYNCSER_RX_EOP_COUNT))) {
946                 d = &s->dma_adc;
947                 hwptr = (unsigned) (((__raw_readq(SS_CSR(R_SER_DMA_CUR_DSCR_ADDR_RX)) & M_DMA_CURDSCR_ADDR) -
948                                      d->descrtab_phys) / sizeof(serdma_descr_t));
949 
950                 if (s->ena & FMODE_READ) {
951                         CS_DBGOUT(CS_FUNCTION, 2, 
952                                   printk(KERN_INFO "cs4297a: upd_rcv sw->hw->hw %x/%x/%x (int-%d)n",
953                                          d->swptr, d->hwptr, hwptr, intflag));
954                         /* Number of DMA buffers available for software: */
955                         diff2 = diff = (d->ringsz + hwptr - d->hwptr) % d->ringsz;
956                         d->hwptr = hwptr;
957                         good_diff = 0;
958                         s_ptr = (u32 *)&(d->dma_buf[d->swptr*4]);
959                         descr = &d->descrtab[d->swptr];
960                         while (diff2--) {
961                                 u64 data = be64_to_cpu(*(u64 *)s_ptr);
962                                 u64 descr_a;
963                                 u16 left, right;
964                                 descr_a = descr->descr_a;
965                                 descr->descr_a &= ~M_DMA_SERRX_SOP;
966                                 if ((descr_a & M_DMA_DSCRA_A_ADDR) != CPHYSADDR((long)s_ptr)) {
967                                         printk(KERN_ERR "cs4297a: RX Bad address (read)\n");
968                                 }
969                                 if (((data & 0x9800000000000000) != 0x9800000000000000) ||
970                                     (!(descr_a & M_DMA_SERRX_SOP)) ||
971                                     (G_DMA_DSCRB_PKT_SIZE(descr->descr_b) != FRAME_BYTES)) {
972                                         s->stats.rx_bad++;
973                                         printk(KERN_DEBUG "cs4297a: RX Bad attributes (read)\n");
974                                         continue;
975                                 }
976                                 s->stats.rx_good++;
977                                 if ((data >> 61) == 7) {
978                                         s->read_value = (data >> 12) & 0xffff;
979                                         s->read_reg = (data >> 40) & 0x7f;
980                                         wake_up(&d->reg_wait);
981                                 }
982                                 if (d->count && (d->sb_hwptr == d->sb_swptr)) {
983                                         s->stats.rx_overflow++;
984                                         printk(KERN_DEBUG "cs4297a: RX overflow\n");
985                                         continue;
986                                 }
987                                 good_diff++;
988                                 left = ((be32_to_cpu(s_ptr[1]) & 0xff) << 8) |
989                                        ((be32_to_cpu(s_ptr[2]) >> 24) & 0xff);
990                                 right = (be32_to_cpu(s_ptr[2]) >> 4) & 0xffff;
991                                 *d->sb_hwptr++ = cpu_to_be16(left);
992                                 *d->sb_hwptr++ = cpu_to_be16(right);
993                                 if (d->sb_hwptr == d->sb_end)
994                                         d->sb_hwptr = d->sample_buf;
995                                 descr++;
996                                 if (descr == d->descrtab_end) {
997                                         descr = d->descrtab;
998                                         s_ptr = (u32 *)s->dma_adc.dma_buf;
999                                 } else {
1000                                         s_ptr += 8;
1001                                 }
1002                         }
1003                         d->total_bytes += good_diff * FRAME_SAMPLE_BYTES;
1004                         d->count += good_diff * FRAME_SAMPLE_BYTES;
1005                         if (d->count > d->sbufsz) {
1006                                 printk(KERN_ERR "cs4297a: bogus receive overflow!!\n");
1007                         }
1008                         d->swptr = (d->swptr + diff) % d->ringsz;
1009                         __raw_writeq(diff, SS_CSR(R_SER_DMA_DSCR_COUNT_RX));
1010                         if (d->mapped) {
1011                                 if (d->count >= (signed) d->fragsize)
1012                                         wake_up(&d->wait);
1013                         } else {
1014                                 if (d->count > 0) {
1015                                         CS_DBGOUT(CS_WAVE_READ, 4,
1016                                                   printk(KERN_INFO
1017                                                          "cs4297a: update count -> %d\n", d->count));
1018                                         wake_up(&d->wait);
1019                                 }
1020                         }
1021                 } else {
1022                         /* Receive is going even if no one is
1023                            listening (for register accesses and to
1024                            avoid FIFO overrun) */
1025                         diff2 = diff = (hwptr + d->ringsz - d->hwptr) % d->ringsz;
1026                         if (!diff) {
1027                                 printk(KERN_ERR "cs4297a: RX full or empty?\n");
1028                         }
1029                         
1030                         descr = &d->descrtab[d->swptr];
1031                         data_p = &d->dma_buf[d->swptr*4];
1032 
1033                         /* Force this to happen at least once; I got
1034                            here because of an interrupt, so there must
1035                            be a buffer to process. */
1036                         do {
1037                                 data = be64_to_cpu(*data_p);
1038                                 if ((descr->descr_a & M_DMA_DSCRA_A_ADDR) != CPHYSADDR((long)data_p)) {
1039                                         printk(KERN_ERR "cs4297a: RX Bad address %d (%llx %lx)\n", d->swptr,
1040                                                (long long)(descr->descr_a & M_DMA_DSCRA_A_ADDR),
1041                                                (long)CPHYSADDR((long)data_p));
1042                                 }
1043                                 if (!(data & (1LL << 63)) ||
1044                                     !(descr->descr_a & M_DMA_SERRX_SOP) ||
1045                                     (G_DMA_DSCRB_PKT_SIZE(descr->descr_b) != FRAME_BYTES)) {
1046                                         s->stats.rx_bad++;
1047                                         printk(KERN_DEBUG "cs4297a: RX Bad attributes\n");
1048                                 } else {
1049                                         s->stats.rx_good++;
1050                                         if ((data >> 61) == 7) {
1051                                                 s->read_value = (data >> 12) & 0xffff;
1052                                                 s->read_reg = (data >> 40) & 0x7f;
1053                                                 wake_up(&d->reg_wait);
1054                                         }
1055                                 }
1056                                 descr->descr_a &= ~M_DMA_SERRX_SOP;
1057                                 descr++;
1058                                 d->swptr++;
1059                                 data_p += 4;
1060                                 if (descr == d->descrtab_end) {
1061                                         descr = d->descrtab;
1062                                         d->swptr = 0;
1063                                         data_p = d->dma_buf;
1064                                 }
1065                                 __raw_writeq(1, SS_CSR(R_SER_DMA_DSCR_COUNT_RX));
1066                         } while (--diff);
1067                         d->hwptr = hwptr;
1068 
1069                         CS_DBGOUT(CS_DESCR, 6, 
1070                                   printk(KERN_INFO "cs4297a: hw/sw %x/%x\n", d->hwptr, d->swptr));
1071                 }
1072 
1073                 CS_DBGOUT(CS_PARMS, 8, printk(KERN_INFO
1074                         "cs4297a: cs4297a_update_ptr(): s=0x%.8x hwptr=%d total_bytes=%d count=%d \n",
1075                                 (unsigned)s, d->hwptr, 
1076                                 d->total_bytes, d->count));
1077         }
1078 
1079         /* XXXKW worry about s->reg_request -- there is a starvation
1080            case if s->ena has FMODE_WRITE on, but the client isn't
1081            doing writes */
1082 
1083         // update DAC pointer 
1084         //
1085         // check for end of buffer, means that we are going to wait for another interrupt
1086         // to allow silence to fill the fifos on the part, to keep pops down to a minimum.
1087         //
1088         if (s->ena & FMODE_WRITE) {
1089                 serdma_t *d = &s->dma_dac;
1090                 hwptr = (unsigned) (((__raw_readq(SS_CSR(R_SER_DMA_CUR_DSCR_ADDR_TX)) & M_DMA_CURDSCR_ADDR) -
1091                                      d->descrtab_phys) / sizeof(serdma_descr_t));
1092                 diff = (d->ringsz + hwptr - d->hwptr) % d->ringsz;
1093                 CS_DBGOUT(CS_WAVE_WRITE, 4, printk(KERN_INFO
1094                                                    "cs4297a: cs4297a_update_ptr(): hw/hw/sw %x/%x/%x diff %d count %d\n",
1095                                                    d->hwptr, hwptr, d->swptr, diff, d->count));
1096                 d->hwptr = hwptr;
1097                 /* XXXKW stereo? conversion? Just assume 2 16-bit samples for now */
1098                 d->total_bytes += diff * FRAME_SAMPLE_BYTES;
1099                 if (d->mapped) {
1100                         d->count += diff * FRAME_SAMPLE_BYTES;
1101                         if (d->count >= d->fragsize) {
1102                                 d->wakeup = 1;
1103                                 wake_up(&d->wait);
1104                                 if (d->count > d->sbufsz)
1105                                         d->count &= d->sbufsz - 1;
1106                         }
1107                 } else {
1108                         d->count -= diff * FRAME_SAMPLE_BYTES;
1109                         if (d->count <= 0) {
1110                                 //
1111                                 // fill with silence, and do not shut down the DAC.
1112                                 // Continue to play silence until the _release.
1113                                 //
1114                                 CS_DBGOUT(CS_WAVE_WRITE, 6, printk(KERN_INFO
1115                                         "cs4297a: cs4297a_update_ptr(): memset %d at 0x%.8x for %d size \n",
1116                                                 (unsigned)(s->prop_dac.fmt & 
1117                                                 (AFMT_U8 | AFMT_U16_LE)) ? 0x80 : 0, 
1118                                                 (unsigned)d->dma_buf, 
1119                                                 d->ringsz));
1120                                 memset(d->dma_buf, 0, d->ringsz * FRAME_BYTES);
1121                                 if (d->count < 0) {
1122                                         d->underrun = 1;
1123                                         s->stats.tx_underrun++;
1124                                         d->count = 0;
1125                                         CS_DBGOUT(CS_ERROR, 9, printk(KERN_INFO
1126                                          "cs4297a: cs4297a_update_ptr(): underrun\n"));
1127                                 }
1128                         } else if (d->count <=
1129                                    (signed) d->fragsize
1130                                    && !d->endcleared) {
1131                           /* XXXKW what is this for? */
1132                                 clear_advance(d->dma_buf,
1133                                               d->sbufsz,
1134                                               d->swptr,
1135                                               d->fragsize,
1136                                               0);
1137                                 d->endcleared = 1;
1138                         }
1139                         if ( (d->count <= (signed) d->sbufsz/2) || intflag)
1140                         {
1141                                 CS_DBGOUT(CS_WAVE_WRITE, 4,
1142                                           printk(KERN_INFO
1143                                                  "cs4297a: update count -> %d\n", d->count));
1144                                 wake_up(&d->wait);
1145                         }
1146                 }
1147                 CS_DBGOUT(CS_PARMS, 8, printk(KERN_INFO
1148                         "cs4297a: cs4297a_update_ptr(): s=0x%.8x hwptr=%d total_bytes=%d count=%d \n",
1149                                 (unsigned) s, d->hwptr, 
1150                                 d->total_bytes, d->count));
1151         }
1152 }
1153 
1154 static int mixer_ioctl(struct cs4297a_state *s, unsigned int cmd,
1155                        unsigned long arg)
1156 {
1157         // Index to mixer_src[] is value of AC97 Input Mux Select Reg.
1158         // Value of array member is recording source Device ID Mask.
1159         static const unsigned int mixer_src[8] = {
1160                 SOUND_MASK_MIC, SOUND_MASK_CD, 0, SOUND_MASK_LINE1,
1161                 SOUND_MASK_LINE, SOUND_MASK_VOLUME, 0, 0
1162         };
1163 
1164         // Index of mixtable1[] member is Device ID 
1165         // and must be <= SOUND_MIXER_NRDEVICES.
1166         // Value of array member is index into s->mix.vol[]
1167         static const unsigned char mixtable1[SOUND_MIXER_NRDEVICES] = {
1168                 [SOUND_MIXER_PCM] = 1,  // voice 
1169                 [SOUND_MIXER_LINE1] = 2,        // AUX
1170                 [SOUND_MIXER_CD] = 3,   // CD 
1171                 [SOUND_MIXER_LINE] = 4, // Line 
1172                 [SOUND_MIXER_SYNTH] = 5,        // FM
1173                 [SOUND_MIXER_MIC] = 6,  // Mic 
1174                 [SOUND_MIXER_SPEAKER] = 7,      // Speaker 
1175                 [SOUND_MIXER_RECLEV] = 8,       // Recording level 
1176                 [SOUND_MIXER_VOLUME] = 9        // Master Volume 
1177         };
1178 
1179         static const unsigned mixreg[] = {
1180                 AC97_PCMOUT_VOL,
1181                 AC97_AUX_VOL,
1182                 AC97_CD_VOL,
1183                 AC97_LINEIN_VOL
1184         };
1185         unsigned char l, r, rl, rr, vidx;
1186         unsigned char attentbl[11] =
1187             { 63, 42, 26, 17, 14, 11, 8, 6, 4, 2, 0 };
1188         unsigned temp1;
1189         int i, val;
1190 
1191         VALIDATE_STATE(s);
1192         CS_DBGOUT(CS_FUNCTION, 4, printk(KERN_INFO
1193                  "cs4297a: mixer_ioctl(): s=0x%.8x cmd=0x%.8x\n",
1194                          (unsigned) s, cmd));
1195 #if CSDEBUG
1196         cs_printioctl(cmd);
1197 #endif
1198 #if CSDEBUG_INTERFACE
1199 
1200         if ((cmd == SOUND_MIXER_CS_GETDBGMASK) ||
1201             (cmd == SOUND_MIXER_CS_SETDBGMASK) ||
1202             (cmd == SOUND_MIXER_CS_GETDBGLEVEL) ||
1203             (cmd == SOUND_MIXER_CS_SETDBGLEVEL))
1204         {
1205                 switch (cmd) {
1206 
1207                 case SOUND_MIXER_CS_GETDBGMASK:
1208                         return put_user(cs_debugmask,
1209                                         (unsigned long *) arg);
1210 
1211                 case SOUND_MIXER_CS_GETDBGLEVEL:
1212                         return put_user(cs_debuglevel,
1213                                         (unsigned long *) arg);
1214 
1215                 case SOUND_MIXER_CS_SETDBGMASK:
1216                         if (get_user(val, (unsigned long *) arg))
1217                                 return -EFAULT;
1218                         cs_debugmask = val;
1219                         return 0;
1220 
1221                 case SOUND_MIXER_CS_SETDBGLEVEL:
1222                         if (get_user(val, (unsigned long *) arg))
1223                                 return -EFAULT;
1224                         cs_debuglevel = val;
1225                         return 0;
1226                 default:
1227                         CS_DBGOUT(CS_ERROR, 1, printk(KERN_INFO
1228                                 "cs4297a: mixer_ioctl(): ERROR unknown debug cmd\n"));
1229                         return 0;
1230                 }
1231         }
1232 #endif
1233 
1234         if (cmd == SOUND_MIXER_PRIVATE1) {
1235                 return -EINVAL;
1236         }
1237         if (cmd == SOUND_MIXER_PRIVATE2) {
1238                 // enable/disable/query spatializer 
1239                 if (get_user(val, (int *) arg))
1240                         return -EFAULT;
1241                 if (val != -1) {
1242                         temp1 = (val & 0x3f) >> 2;
1243                         cs4297a_write_ac97(s, AC97_3D_CONTROL, temp1);
1244                         cs4297a_read_ac97(s, AC97_GENERAL_PURPOSE,
1245                                          &temp1);
1246                         cs4297a_write_ac97(s, AC97_GENERAL_PURPOSE,
1247                                           temp1 | 0x2000);
1248                 }
1249                 cs4297a_read_ac97(s, AC97_3D_CONTROL, &temp1);
1250                 return put_user((temp1 << 2) | 3, (int *) arg);
1251         }
1252         if (cmd == SOUND_MIXER_INFO) {
1253                 mixer_info info;
1254                 memset(&info, 0, sizeof(info));
1255                 strlcpy(info.id, "CS4297a", sizeof(info.id));
1256                 strlcpy(info.name, "Crystal CS4297a", sizeof(info.name));
1257                 info.modify_counter = s->mix.modcnt;
1258                 if (copy_to_user((void *) arg, &info, sizeof(info)))
1259                         return -EFAULT;
1260                 return 0;
1261         }
1262         if (cmd == SOUND_OLD_MIXER_INFO) {
1263                 _old_mixer_info info;
1264                 memset(&info, 0, sizeof(info));
1265                 strlcpy(info.id, "CS4297a", sizeof(info.id));
1266                 strlcpy(info.name, "Crystal CS4297a", sizeof(info.name));
1267                 if (copy_to_user((void *) arg, &info, sizeof(info)))
1268                         return -EFAULT;
1269                 return 0;
1270         }
1271         if (cmd == OSS_GETVERSION)
1272                 return put_user(SOUND_VERSION, (int *) arg);
1273 
1274         if (_IOC_TYPE(cmd) != 'M' || _SIOC_SIZE(cmd) != sizeof(int))
1275                 return -EINVAL;
1276 
1277         // If ioctl has only the SIOC_READ bit(bit 31)
1278         // on, process the only-read commands. 
1279         if (_SIOC_DIR(cmd) == _SIOC_READ) {
1280                 switch (_IOC_NR(cmd)) {
1281                 case SOUND_MIXER_RECSRC:        // Arg contains a bit for each recording source 
1282                         cs4297a_read_ac97(s, AC97_RECORD_SELECT,
1283                                          &temp1);
1284                         return put_user(mixer_src[temp1 & 7], (int *) arg);
1285 
1286                 case SOUND_MIXER_DEVMASK:       // Arg contains a bit for each supported device 
1287                         return put_user(SOUND_MASK_PCM | SOUND_MASK_LINE |
1288                                         SOUND_MASK_VOLUME | SOUND_MASK_RECLEV,
1289                                         (int *) arg);
1290 
1291                 case SOUND_MIXER_RECMASK:       // Arg contains a bit for each supported recording source 
1292                         return put_user(SOUND_MASK_LINE | SOUND_MASK_VOLUME,
1293                                         (int *) arg);
1294 
1295                 case SOUND_MIXER_STEREODEVS:    // Mixer channels supporting stereo 
1296                         return put_user(SOUND_MASK_PCM | SOUND_MASK_LINE |
1297                                         SOUND_MASK_VOLUME | SOUND_MASK_RECLEV,
1298                                         (int *) arg);
1299 
1300                 case SOUND_MIXER_CAPS:
1301                         return put_user(SOUND_CAP_EXCL_INPUT, (int *) arg);
1302 
1303                 default:
1304                         i = _IOC_NR(cmd);
1305                         if (i >= SOUND_MIXER_NRDEVICES
1306                             || !(vidx = mixtable1[i]))
1307                                 return -EINVAL;
1308                         return put_user(s->mix.vol[vidx - 1], (int *) arg);
1309                 }
1310         }
1311         // If ioctl doesn't have both the SIOC_READ and 
1312         // the SIOC_WRITE bit set, return invalid.
1313         if (_SIOC_DIR(cmd) != (_SIOC_READ | _SIOC_WRITE))
1314                 return -EINVAL;
1315 
1316         // Increment the count of volume writes.
1317         s->mix.modcnt++;
1318 
1319         // Isolate the command; it must be a write.
1320         switch (_IOC_NR(cmd)) {
1321 
1322         case SOUND_MIXER_RECSRC:        // Arg contains a bit for each recording source 
1323                 if (get_user(val, (int *) arg))
1324                         return -EFAULT;
1325                 i = hweight32(val);     // i = # bits on in val.
1326                 if (i != 1)     // One & only 1 bit must be on.
1327                         return 0;
1328                 for (i = 0; i < sizeof(mixer_src) / sizeof(int); i++) {
1329                         if (val == mixer_src[i]) {
1330                                 temp1 = (i << 8) | i;
1331                                 cs4297a_write_ac97(s,
1332                                                   AC97_RECORD_SELECT,
1333                                                   temp1);
1334                                 return 0;
1335                         }
1336                 }
1337                 return 0;
1338 
1339         case SOUND_MIXER_VOLUME:
1340                 if (get_user(val, (int *) arg))
1341                         return -EFAULT;
1342                 l = val & 0xff;
1343                 if (l > 100)
1344                         l = 100;        // Max soundcard.h vol is 100.
1345                 if (l < 6) {
1346                         rl = 63;
1347                         l = 0;
1348                 } else
1349                         rl = attentbl[(10 * l) / 100];  // Convert 0-100 vol to 63-0 atten.
1350 
1351                 r = (val >> 8) & 0xff;
1352                 if (r > 100)
1353                         r = 100;        // Max right volume is 100, too
1354                 if (r < 6) {
1355                         rr = 63;
1356                         r = 0;
1357                 } else
1358                         rr = attentbl[(10 * r) / 100];  // Convert volume to attenuation.
1359 
1360                 if ((rl > 60) && (rr > 60))     // If both l & r are 'low',          
1361                         temp1 = 0x8000; //  turn on the mute bit.
1362                 else
1363                         temp1 = 0;
1364 
1365                 temp1 |= (rl << 8) | rr;
1366 
1367                 cs4297a_write_ac97(s, AC97_MASTER_VOL_STEREO, temp1);
1368                 cs4297a_write_ac97(s, AC97_PHONE_VOL, temp1);
1369 
1370 #ifdef OSS_DOCUMENTED_MIXER_SEMANTICS
1371                 s->mix.vol[8] = ((unsigned int) r << 8) | l;
1372 #else
1373                 s->mix.vol[8] = val;
1374 #endif
1375                 return put_user(s->mix.vol[8], (int *) arg);
1376 
1377         case SOUND_MIXER_SPEAKER:
1378                 if (get_user(val, (int *) arg))
1379                         return -EFAULT;
1380                 l = val & 0xff;
1381                 if (l > 100)
1382                         l = 100;
1383                 if (l < 3) {
1384                         rl = 0;
1385                         l = 0;
1386                 } else {
1387                         rl = (l * 2 - 5) / 13;  // Convert 0-100 range to 0-15.
1388                         l = (rl * 13 + 5) / 2;
1389                 }
1390 
1391                 if (rl < 3) {
1392                         temp1 = 0x8000;
1393                         rl = 0;
1394                 } else
1395                         temp1 = 0;
1396                 rl = 15 - rl;   // Convert volume to attenuation.
1397                 temp1 |= rl << 1;
1398                 cs4297a_write_ac97(s, AC97_PCBEEP_VOL, temp1);
1399 
1400 #ifdef OSS_DOCUMENTED_MIXER_SEMANTICS
1401                 s->mix.vol[6] = l << 8;
1402 #else
1403                 s->mix.vol[6] = val;
1404 #endif
1405                 return put_user(s->mix.vol[6], (int *) arg);
1406 
1407         case SOUND_MIXER_RECLEV:
1408                 if (get_user(val, (int *) arg))
1409                         return -EFAULT;
1410                 l = val & 0xff;
1411                 if (l > 100)
1412                         l = 100;
1413                 r = (val >> 8) & 0xff;
1414                 if (r > 100)
1415                         r = 100;
1416                 rl = (l * 2 - 5) / 13;  // Convert 0-100 scale to 0-15.
1417                 rr = (r * 2 - 5) / 13;
1418                 if (rl < 3 && rr < 3)
1419                         temp1 = 0x8000;
1420                 else
1421                         temp1 = 0;
1422 
1423                 temp1 = temp1 | (rl << 8) | rr;
1424                 cs4297a_write_ac97(s, AC97_RECORD_GAIN, temp1);
1425 
1426 #ifdef OSS_DOCUMENTED_MIXER_SEMANTICS
1427                 s->mix.vol[7] = ((unsigned int) r << 8) | l;
1428 #else
1429                 s->mix.vol[7] = val;
1430 #endif
1431                 return put_user(s->mix.vol[7], (int *) arg);
1432 
1433         case SOUND_MIXER_MIC:
1434                 if (get_user(val, (int *) arg))
1435                         return -EFAULT;
1436                 l = val & 0xff;
1437                 if (l > 100)
1438                         l = 100;
1439                 if (l < 1) {
1440                         l = 0;
1441                         rl = 0;
1442                 } else {
1443                         rl = ((unsigned) l * 5 - 4) / 16;       // Convert 0-100 range to 0-31.
1444                         l = (rl * 16 + 4) / 5;
1445                 }
1446                 cs4297a_read_ac97(s, AC97_MIC_VOL, &temp1);
1447                 temp1 &= 0x40;  // Isolate 20db gain bit.
1448                 if (rl < 3) {
1449                         temp1 |= 0x8000;
1450                         rl = 0;
1451                 }
1452                 rl = 31 - rl;   // Convert volume to attenuation.
1453                 temp1 |= rl;
1454                 cs4297a_write_ac97(s, AC97_MIC_VOL, temp1);
1455 
1456 #ifdef OSS_DOCUMENTED_MIXER_SEMANTICS
1457                 s->mix.vol[5] = val << 8;
1458 #else
1459                 s->mix.vol[5] = val;
1460 #endif
1461                 return put_user(s->mix.vol[5], (int *) arg);
1462 
1463 
1464         case SOUND_MIXER_SYNTH:
1465                 if (get_user(val, (int *) arg))
1466                         return -EFAULT;
1467                 l = val & 0xff;
1468                 if (l > 100)
1469                         l = 100;
1470                 if (get_user(val, (int *) arg))
1471                         return -EFAULT;
1472                 r = (val >> 8) & 0xff;
1473                 if (r > 100)
1474                         r = 100;
1475                 rl = (l * 2 - 11) / 3;  // Convert 0-100 range to 0-63.
1476                 rr = (r * 2 - 11) / 3;
1477                 if (rl < 3)     // If l is low, turn on
1478                         temp1 = 0x0080; //  the mute bit.
1479                 else
1480                         temp1 = 0;
1481 
1482                 rl = 63 - rl;   // Convert vol to attenuation.
1483 //              writel(temp1 | rl, s->pBA0 + FMLVC);
1484                 if (rr < 3)     //  If rr is low, turn on
1485                         temp1 = 0x0080; //   the mute bit.
1486                 else
1487                         temp1 = 0;
1488                 rr = 63 - rr;   // Convert vol to attenuation.
1489 //              writel(temp1 | rr, s->pBA0 + FMRVC);
1490 
1491 #ifdef OSS_DOCUMENTED_MIXER_SEMANTICS
1492                 s->mix.vol[4] = (r << 8) | l;
1493 #else
1494                 s->mix.vol[4] = val;
1495 #endif
1496                 return put_user(s->mix.vol[4], (int *) arg);
1497 
1498 
1499         default:
1500                 CS_DBGOUT(CS_IOCTL, 4, printk(KERN_INFO
1501                         "cs4297a: mixer_ioctl(): default\n"));
1502 
1503                 i = _IOC_NR(cmd);
1504                 if (i >= SOUND_MIXER_NRDEVICES || !(vidx = mixtable1[i]))
1505                         return -EINVAL;
1506                 if (get_user(val, (int *) arg))
1507                         return -EFAULT;
1508                 l = val & 0xff;
1509                 if (l > 100)
1510                         l = 100;
1511                 if (l < 1) {
1512                         l = 0;
1513                         rl = 31;
1514                 } else
1515                         rl = (attentbl[(l * 10) / 100]) >> 1;
1516 
1517                 r = (val >> 8) & 0xff;
1518                 if (r > 100)
1519                         r = 100;
1520                 if (r < 1) {
1521                         r = 0;
1522                         rr = 31;
1523                 } else
1524                         rr = (attentbl[(r * 10) / 100]) >> 1;
1525                 if ((rl > 30) && (rr > 30))
1526                         temp1 = 0x8000;
1527                 else
1528                         temp1 = 0;
1529                 temp1 = temp1 | (rl << 8) | rr;
1530                 cs4297a_write_ac97(s, mixreg[vidx - 1], temp1);
1531 
1532 #ifdef OSS_DOCUMENTED_MIXER_SEMANTICS
1533                 s->mix.vol[vidx - 1] = ((unsigned int) r << 8) | l;
1534 #else
1535                 s->mix.vol[vidx - 1] = val;
1536 #endif
1537                 return put_user(s->mix.vol[vidx - 1], (int *) arg);
1538         }
1539 }
1540 
1541 
1542 // --------------------------------------------------------------------- 
1543 
1544 static int cs4297a_open_mixdev(struct inode *inode, struct file *file)
1545 {
1546         int minor = iminor(inode);
1547         struct cs4297a_state *s=NULL;
1548         struct list_head *entry;
1549 
1550         CS_DBGOUT(CS_FUNCTION | CS_OPEN, 4,
1551                   printk(KERN_INFO "cs4297a: cs4297a_open_mixdev()+\n"));
1552 
1553         mutex_lock(&swarm_cs4297a_mutex);
1554         list_for_each(entry, &cs4297a_devs)
1555         {
1556                 s = list_entry(entry, struct cs4297a_state, list);
1557                 if(s->dev_mixer == minor)
1558                         break;
1559         }
1560         if (!s)
1561         {
1562                 CS_DBGOUT(CS_FUNCTION | CS_OPEN | CS_ERROR, 2,
1563                         printk(KERN_INFO "cs4297a: cs4297a_open_mixdev()- -ENODEV\n"));
1564 
1565                 mutex_unlock(&swarm_cs4297a_mutex);
1566                 return -ENODEV;
1567         }
1568         VALIDATE_STATE(s);
1569         file->private_data = s;
1570 
1571         CS_DBGOUT(CS_FUNCTION | CS_OPEN, 4,
1572                   printk(KERN_INFO "cs4297a: cs4297a_open_mixdev()- 0\n"));
1573         mutex_unlock(&swarm_cs4297a_mutex);
1574 
1575         return nonseekable_open(inode, file);
1576 }
1577 
1578 
1579 static int cs4297a_release_mixdev(struct inode *inode, struct file *file)
1580 {
1581         struct cs4297a_state *s =
1582             (struct cs4297a_state *) file->private_data;
1583 
1584         VALIDATE_STATE(s);
1585         return 0;
1586 }
1587 
1588 
1589 static int cs4297a_ioctl_mixdev(struct file *file,
1590                                unsigned int cmd, unsigned long arg)
1591 {
1592         int ret;
1593         mutex_lock(&swarm_cs4297a_mutex);
1594         ret = mixer_ioctl((struct cs4297a_state *) file->private_data, cmd,
1595                            arg);
1596         mutex_unlock(&swarm_cs4297a_mutex);
1597         return ret;
1598 }
1599 
1600 
1601 // ******************************************************************************************
1602 //   Mixer file operations struct.
1603 // ******************************************************************************************
1604 static const struct file_operations cs4297a_mixer_fops = {
1605         .owner          = THIS_MODULE,
1606         .llseek         = no_llseek,
1607         .unlocked_ioctl = cs4297a_ioctl_mixdev,
1608         .open           = cs4297a_open_mixdev,
1609         .release        = cs4297a_release_mixdev,
1610 };
1611 
1612 // --------------------------------------------------------------------- 
1613 
1614 
1615 static int drain_adc(struct cs4297a_state *s, int nonblock)
1616 {
1617         /* This routine serves no purpose currently - any samples
1618            sitting in the receive queue will just be processed by the
1619            background consumer.  This would be different if DMA
1620            actually stopped when there were no clients. */
1621         return 0;
1622 }
1623 
1624 static int drain_dac(struct cs4297a_state *s, int nonblock)
1625 {
1626         DECLARE_WAITQUEUE(wait, current);
1627         unsigned long flags;
1628         unsigned hwptr;
1629         unsigned tmo;
1630         int count;
1631 
1632         if (s->dma_dac.mapped)
1633                 return 0;
1634         if (nonblock)
1635                 return -EBUSY;
1636         add_wait_queue(&s->dma_dac.wait, &wait);
1637         while ((count = __raw_readq(SS_CSR(R_SER_DMA_DSCR_COUNT_TX))) ||
1638                (s->dma_dac.count > 0)) {
1639                 if (!signal_pending(current)) {
1640                         set_current_state(TASK_INTERRUPTIBLE);
1641                         /* XXXKW is this calculation working? */
1642                         tmo = ((count * FRAME_TX_US) * HZ) / 1000000;
1643                         schedule_timeout(tmo + 1);
1644                 } else {
1645                         /* XXXKW do I care if there is a signal pending? */
1646                 }
1647         }
1648         spin_lock_irqsave(&s->lock, flags);
1649         /* Reset the bookkeeping */
1650         hwptr = (int)(((__raw_readq(SS_CSR(R_SER_DMA_CUR_DSCR_ADDR_TX)) & M_DMA_CURDSCR_ADDR) -
1651                        s->dma_dac.descrtab_phys) / sizeof(serdma_descr_t));
1652         s->dma_dac.hwptr = s->dma_dac.swptr = hwptr;
1653         spin_unlock_irqrestore(&s->lock, flags);
1654         remove_wait_queue(&s->dma_dac.wait, &wait);
1655         current->state = TASK_RUNNING;
1656         return 0;
1657 }
1658 
1659 
1660 // --------------------------------------------------------------------- 
1661 
1662 static ssize_t cs4297a_read(struct file *file, char *buffer, size_t count,
1663                            loff_t * ppos)
1664 {
1665         struct cs4297a_state *s =
1666             (struct cs4297a_state *) file->private_data;
1667         ssize_t ret;
1668         unsigned long flags;
1669         int cnt, count_fr, cnt_by;
1670         unsigned copied = 0;
1671 
1672         CS_DBGOUT(CS_FUNCTION | CS_WAVE_READ, 2,
1673                   printk(KERN_INFO "cs4297a: cs4297a_read()+ %d \n", count));
1674 
1675         VALIDATE_STATE(s);
1676         if (s->dma_adc.mapped)
1677                 return -ENXIO;
1678         if (!s->dma_adc.ready && (ret = prog_dmabuf_adc(s)))
1679                 return ret;
1680         if (!access_ok(VERIFY_WRITE, buffer, count))
1681                 return -EFAULT;
1682         ret = 0;
1683 //
1684 // "count" is the amount of bytes to read (from app), is decremented each loop
1685 //      by the amount of bytes that have been returned to the user buffer.
1686 // "cnt" is the running total of each read from the buffer (changes each loop)
1687 // "buffer" points to the app's buffer
1688 // "ret" keeps a running total of the amount of bytes that have been copied
1689 //      to the user buffer.
1690 // "copied" is the total bytes copied into the user buffer for each loop.
1691 //
1692         while (count > 0) {
1693                 CS_DBGOUT(CS_WAVE_READ, 8, printk(KERN_INFO
1694                         "_read() count>0 count=%d .count=%d .swptr=%d .hwptr=%d \n",
1695                                 count, s->dma_adc.count,
1696                                 s->dma_adc.swptr, s->dma_adc.hwptr));
1697                 spin_lock_irqsave(&s->lock, flags);
1698 
1699                 /* cnt will be the number of available samples (16-bit
1700                    stereo); it starts out as the maxmimum consequetive
1701                    samples */
1702                 cnt = (s->dma_adc.sb_end - s->dma_adc.sb_swptr) / 2;
1703                 count_fr = s->dma_adc.count / FRAME_SAMPLE_BYTES;
1704 
1705                 // dma_adc.count is the current total bytes that have not been read.
1706                 // if the amount of unread bytes from the current sw pointer to the
1707                 // end of the buffer is greater than the current total bytes that
1708                 // have not been read, then set the "cnt" (unread bytes) to the
1709                 // amount of unread bytes.  
1710 
1711                 if (count_fr < cnt)
1712                         cnt = count_fr;
1713                 cnt_by = cnt * FRAME_SAMPLE_BYTES;
1714                 spin_unlock_irqrestore(&s->lock, flags);
1715                 //
1716                 // if we are converting from 8/16 then we need to copy
1717                 // twice the number of 16 bit bytes then 8 bit bytes.
1718                 // 
1719                 if (s->conversion) {
1720                         if (cnt_by > (count * 2)) {
1721                                 cnt = (count * 2) / FRAME_SAMPLE_BYTES;
1722                                 cnt_by = count * 2;
1723                         }
1724                 } else {
1725                         if (cnt_by > count) {
1726                                 cnt = count / FRAME_SAMPLE_BYTES;
1727                                 cnt_by = count;
1728                         }
1729                 }
1730                 //
1731                 // "cnt" NOW is the smaller of the amount that will be read,
1732                 // and the amount that is requested in this read (or partial).
1733                 // if there are no bytes in the buffer to read, then start the
1734                 // ADC and wait for the interrupt handler to wake us up.
1735                 //
1736                 if (cnt <= 0) {
1737 
1738                         // start up the dma engine and then continue back to the top of
1739                         // the loop when wake up occurs.
1740                         start_adc(s);
1741                         if (file->f_flags & O_NONBLOCK)
1742                                 return ret ? ret : -EAGAIN;
1743                         interruptible_sleep_on(&s->dma_adc.wait);
1744                         if (signal_pending(current))
1745                                 return ret ? ret : -ERESTARTSYS;
1746                         continue;
1747                 }
1748                 // there are bytes in the buffer to read.
1749                 // copy from the hw buffer over to the user buffer.
1750                 // user buffer is designated by "buffer"
1751                 // virtual address to copy from is dma_buf+swptr
1752                 // the "cnt" is the number of bytes to read.
1753 
1754                 CS_DBGOUT(CS_WAVE_READ, 2, printk(KERN_INFO
1755                         "_read() copy_to cnt=%d count=%d ", cnt_by, count));
1756                 CS_DBGOUT(CS_WAVE_READ, 8, printk(KERN_INFO
1757                          " .sbufsz=%d .count=%d buffer=0x%.8x ret=%d\n",
1758                                  s->dma_adc.sbufsz, s->dma_adc.count,
1759                                  (unsigned) buffer, ret));
1760 
1761                 if (copy_to_user (buffer, ((void *)s->dma_adc.sb_swptr), cnt_by))
1762                         return ret ? ret : -EFAULT;
1763                 copied = cnt_by;
1764 
1765                 /* Return the descriptors */
1766                 spin_lock_irqsave(&s->lock, flags);
1767                 CS_DBGOUT(CS_FUNCTION, 2, 
1768                           printk(KERN_INFO "cs4297a: upd_rcv sw->hw %x/%x\n", s->dma_adc.swptr, s->dma_adc.hwptr));
1769                 s->dma_adc.count -= cnt_by;
1770                 s->dma_adc.sb_swptr += cnt * 2;
1771                 if (s->dma_adc.sb_swptr == s->dma_adc.sb_end)
1772                         s->dma_adc.sb_swptr = s->dma_adc.sample_buf;
1773                 spin_unlock_irqrestore(&s->lock, flags);
1774                 count -= copied;
1775                 buffer += copied;
1776                 ret += copied;
1777                 start_adc(s);
1778         }
1779         CS_DBGOUT(CS_FUNCTION | CS_WAVE_READ, 2,
1780                   printk(KERN_INFO "cs4297a: cs4297a_read()- %d\n", ret));
1781         return ret;
1782 }
1783 
1784 
1785 static ssize_t cs4297a_write(struct file *file, const char *buffer,
1786                             size_t count, loff_t * ppos)
1787 {
1788         struct cs4297a_state *s =
1789             (struct cs4297a_state *) file->private_data;
1790         ssize_t ret;
1791         unsigned long flags;
1792         unsigned swptr, hwptr;
1793         int cnt;
1794 
1795         CS_DBGOUT(CS_FUNCTION | CS_WAVE_WRITE, 2,
1796                   printk(KERN_INFO "cs4297a: cs4297a_write()+ count=%d\n",
1797                          count));
1798         VALIDATE_STATE(s);
1799 
1800         if (s->dma_dac.mapped)
1801                 return -ENXIO;
1802         if (!s->dma_dac.ready && (ret = prog_dmabuf_dac(s)))
1803                 return ret;
1804         if (!access_ok(VERIFY_READ, buffer, count))
1805                 return -EFAULT;
1806         ret = 0;
1807         while (count > 0) {
1808                 serdma_t *d = &s->dma_dac;
1809                 int copy_cnt;
1810                 u32 *s_tmpl;
1811                 u32 *t_tmpl;
1812                 u32 left, right;
1813                 int swap = (s->prop_dac.fmt == AFMT_S16_LE) || (s->prop_dac.fmt == AFMT_U16_LE);
1814                 
1815                 /* XXXXXX this is broken for BLOAT_FACTOR */
1816                 spin_lock_irqsave(&s->lock, flags);
1817                 if (d->count < 0) {
1818                         d->count = 0;
1819                         d->swptr = d->hwptr;
1820                 }
1821                 if (d->underrun) {
1822                         d->underrun = 0;
1823                         hwptr = (unsigned) (((__raw_readq(SS_CSR(R_SER_DMA_CUR_DSCR_ADDR_TX)) & M_DMA_CURDSCR_ADDR) -
1824                                              d->descrtab_phys) / sizeof(serdma_descr_t));
1825                         d->swptr = d->hwptr = hwptr;
1826                 }
1827                 swptr = d->swptr;
1828                 cnt = d->sbufsz - (swptr * FRAME_SAMPLE_BYTES);
1829                 /* Will this write fill up the buffer? */
1830                 if (d->count + cnt > d->sbufsz)
1831                         cnt = d->sbufsz - d->count;
1832                 spin_unlock_irqrestore(&s->lock, flags);
1833                 if (cnt > count)
1834                         cnt = count;
1835                 if (cnt <= 0) {
1836                         start_dac(s);
1837                         if (file->f_flags & O_NONBLOCK)
1838                                 return ret ? ret : -EAGAIN;
1839                         interruptible_sleep_on(&d->wait);
1840                         if (signal_pending(current))
1841                                 return ret ? ret : -ERESTARTSYS;
1842                         continue;
1843                 }
1844                 if (copy_from_user(d->sample_buf, buffer, cnt))
1845                         return ret ? ret : -EFAULT;
1846 
1847                 copy_cnt = cnt;
1848                 s_tmpl = (u32 *)d->sample_buf;
1849                 t_tmpl = (u32 *)(d->dma_buf + (swptr * 4));
1850 
1851                 /* XXXKW assuming 16-bit stereo! */
1852                 do {
1853                         u32 tmp;
1854 
1855                         t_tmpl[0] = cpu_to_be32(0x98000000);
1856 
1857                         tmp = be32_to_cpu(s_tmpl[0]);
1858                         left = tmp & 0xffff;
1859                         right = tmp >> 16;
1860                         if (swap) {
1861                                 left = swab16(left);
1862                                 right = swab16(right);
1863                         }
1864                         t_tmpl[1] = cpu_to_be32(left >> 8);
1865                         t_tmpl[2] = cpu_to_be32(((left & 0xff) << 24) |
1866                                                 (right << 4));
1867 
1868                         s_tmpl++;
1869                         t_tmpl += 8;
1870                         copy_cnt -= 4;
1871                 } while (copy_cnt);
1872 
1873                 /* Mux in any pending read/write accesses */
1874                 if (s->reg_request) {
1875                         *(u64 *)(d->dma_buf + (swptr * 4)) |=
1876                                 cpu_to_be64(s->reg_request);
1877                         s->reg_request = 0;
1878                         wake_up(&s->dma_dac.reg_wait);
1879                 }
1880 
1881                 CS_DBGOUT(CS_WAVE_WRITE, 4,
1882                           printk(KERN_INFO
1883                                  "cs4297a: copy in %d to swptr %x\n", cnt, swptr));
1884 
1885                 swptr = (swptr + (cnt/FRAME_SAMPLE_BYTES)) % d->ringsz;
1886                 __raw_writeq(cnt/FRAME_SAMPLE_BYTES, SS_CSR(R_SER_DMA_DSCR_COUNT_TX));
1887                 spin_lock_irqsave(&s->lock, flags);
1888                 d->swptr = swptr;
1889                 d->count += cnt;
1890                 d->endcleared = 0;
1891                 spin_unlock_irqrestore(&s->lock, flags);
1892                 count -= cnt;
1893                 buffer += cnt;
1894                 ret += cnt;
1895                 start_dac(s);
1896         }
1897         CS_DBGOUT(CS_FUNCTION | CS_WAVE_WRITE, 2,
1898                   printk(KERN_INFO "cs4297a: cs4297a_write()- %d\n", ret));
1899         return ret;
1900 }
1901 
1902 
1903 static unsigned int cs4297a_poll(struct file *file,
1904                                 struct poll_table_struct *wait)
1905 {
1906         struct cs4297a_state *s =
1907             (struct cs4297a_state *) file->private_data;
1908         unsigned long flags;
1909         unsigned int mask = 0;
1910 
1911         CS_DBGOUT(CS_FUNCTION | CS_WAVE_WRITE | CS_WAVE_READ, 4,
1912                   printk(KERN_INFO "cs4297a: cs4297a_poll()+\n"));
1913         VALIDATE_STATE(s);
1914         if (file->f_mode & FMODE_WRITE) {
1915                 CS_DBGOUT(CS_FUNCTION | CS_WAVE_WRITE | CS_WAVE_READ, 4,
1916                           printk(KERN_INFO
1917                                  "cs4297a: cs4297a_poll() wait on FMODE_WRITE\n"));
1918                 if(!s->dma_dac.ready && prog_dmabuf_dac(s))
1919                         return 0;
1920                 poll_wait(file, &s->dma_dac.wait, wait);
1921         }
1922         if (file->f_mode & FMODE_READ) {
1923                 CS_DBGOUT(CS_FUNCTION | CS_WAVE_WRITE | CS_WAVE_READ, 4,
1924                           printk(KERN_INFO
1925                                  "cs4297a: cs4297a_poll() wait on FMODE_READ\n"));
1926                 if(!s->dma_dac.ready && prog_dmabuf_adc(s))
1927                         return 0;
1928                 poll_wait(file, &s->dma_adc.wait, wait);
1929         }
1930         spin_lock_irqsave(&s->lock, flags);
1931         cs4297a_update_ptr(s,CS_FALSE);
1932         if (file->f_mode & FMODE_WRITE) {
1933                 if (s->dma_dac.mapped) {
1934                         if (s->dma_dac.count >=
1935                             (signed) s->dma_dac.fragsize) {
1936                                 if (s->dma_dac.wakeup)
1937                                         mask |= POLLOUT | POLLWRNORM;
1938                                 else
1939                                         mask = 0;
1940                                 s->dma_dac.wakeup = 0;
1941                         }
1942                 } else {
1943                         if ((signed) (s->dma_dac.sbufsz/2) >= s->dma_dac.count)
1944                                 mask |= POLLOUT | POLLWRNORM;
1945                 }
1946         } else if (file->f_mode & FMODE_READ) {
1947                 if (s->dma_adc.mapped) {
1948                         if (s->dma_adc.count >= (signed) s->dma_adc.fragsize) 
1949                                 mask |= POLLIN | POLLRDNORM;
1950                 } else {
1951                         if (s->dma_adc.count > 0)
1952                                 mask |= POLLIN | POLLRDNORM;
1953                 }
1954         }
1955         spin_unlock_irqrestore(&s->lock, flags);
1956         CS_DBGOUT(CS_FUNCTION | CS_WAVE_WRITE | CS_WAVE_READ, 4,
1957                   printk(KERN_INFO "cs4297a: cs4297a_poll()- 0x%.8x\n",
1958                          mask));
1959         return mask;
1960 }
1961 
1962 
1963 static int cs4297a_mmap(struct file *file, struct vm_area_struct *vma)
1964 {
1965         /* XXXKW currently no mmap support */
1966         return -EINVAL;
1967         return 0;
1968 }
1969 
1970 
1971 static int cs4297a_ioctl(struct file *file,
1972                         unsigned int cmd, unsigned long arg)
1973 {
1974         struct cs4297a_state *s =
1975             (struct cs4297a_state *) file->private_data;
1976         unsigned long flags;
1977         audio_buf_info abinfo;
1978         count_info cinfo;
1979         int val, mapped, ret;
1980 
1981         CS_DBGOUT(CS_FUNCTION|CS_IOCTL, 4, printk(KERN_INFO
1982                  "cs4297a: cs4297a_ioctl(): file=0x%.8x cmd=0x%.8x\n",
1983                          (unsigned) file, cmd));
1984 #if CSDEBUG
1985         cs_printioctl(cmd);
1986 #endif
1987         VALIDATE_STATE(s);
1988         mapped = ((file->f_mode & FMODE_WRITE) && s->dma_dac.mapped) ||
1989             ((file->f_mode & FMODE_READ) && s->dma_adc.mapped);
1990         switch (cmd) {
1991         case OSS_GETVERSION:
1992                 CS_DBGOUT(CS_IOCTL | CS_PARMS, 4, printk(KERN_INFO
1993                         "cs4297a: cs4297a_ioctl(): SOUND_VERSION=0x%.8x\n",
1994                                  SOUND_VERSION));
1995                 return put_user(SOUND_VERSION, (int *) arg);
1996 
1997         case SNDCTL_DSP_SYNC:
1998                 CS_DBGOUT(CS_IOCTL, 4, printk(KERN_INFO
1999                          "cs4297a: cs4297a_ioctl(): DSP_SYNC\n"));
2000                 if (file->f_mode & FMODE_WRITE)
2001                         return drain_dac(s,
2002                                          0 /*file->f_flags & O_NONBLOCK */
2003                                          );
2004                 return 0;
2005 
2006         case SNDCTL_DSP_SETDUPLEX:
2007                 return 0;
2008 
2009         case SNDCTL_DSP_GETCAPS:
2010                 return put_user(DSP_CAP_DUPLEX | DSP_CAP_REALTIME |
2011                                 DSP_CAP_TRIGGER | DSP_CAP_MMAP,
2012                                 (int *) arg);
2013 
2014         case SNDCTL_DSP_RESET:
2015                 CS_DBGOUT(CS_IOCTL, 4, printk(KERN_INFO
2016                          "cs4297a: cs4297a_ioctl(): DSP_RESET\n"));
2017                 if (file->f_mode & FMODE_WRITE) {
2018                         stop_dac(s);
2019                         synchronize_irq(s->irq);
2020                         s->dma_dac.count = s->dma_dac.total_bytes =
2021                                 s->dma_dac.blocks = s->dma_dac.wakeup = 0;
2022                         s->dma_dac.swptr = s->dma_dac.hwptr =
2023                                 (int)(((__raw_readq(SS_CSR(R_SER_DMA_CUR_DSCR_ADDR_TX)) & M_DMA_CURDSCR_ADDR) -
2024                                        s->dma_dac.descrtab_phys) / sizeof(serdma_descr_t));
2025                 }
2026                 if (file->f_mode & FMODE_READ) {
2027                         stop_adc(s);
2028                         synchronize_irq(s->irq);
2029                         s->dma_adc.count = s->dma_adc.total_bytes =
2030                                 s->dma_adc.blocks = s->dma_dac.wakeup = 0;
2031                         s->dma_adc.swptr = s->dma_adc.hwptr =
2032                                 (int)(((__raw_readq(SS_CSR(R_SER_DMA_CUR_DSCR_ADDR_RX)) & M_DMA_CURDSCR_ADDR) -
2033                                        s->dma_adc.descrtab_phys) / sizeof(serdma_descr_t));
2034                 }
2035                 return 0;
2036 
2037         case SNDCTL_DSP_SPEED:
2038                 if (get_user(val, (int *) arg))
2039                         return -EFAULT;
2040                 CS_DBGOUT(CS_IOCTL | CS_PARMS, 4, printk(KERN_INFO
2041                          "cs4297a: cs4297a_ioctl(): DSP_SPEED val=%d -> 48000\n", val));
2042                 val = 48000;
2043                 return put_user(val, (int *) arg);
2044 
2045         case SNDCTL_DSP_STEREO:
2046                 if (get_user(val, (int *) arg))
2047                         return -EFAULT;
2048                 CS_DBGOUT(CS_IOCTL | CS_PARMS, 4, printk(KERN_INFO
2049                          "cs4297a: cs4297a_ioctl(): DSP_STEREO val=%d\n", val));
2050                 if (file->f_mode & FMODE_READ) {
2051                         stop_adc(s);
2052                         s->dma_adc.ready = 0;
2053                         s->prop_adc.channels = val ? 2 : 1;
2054                 }
2055                 if (file->f_mode & FMODE_WRITE) {
2056                         stop_dac(s);
2057                         s->dma_dac.ready = 0;
2058                         s->prop_dac.channels = val ? 2 : 1;
2059                 }
2060                 return 0;
2061 
2062         case SNDCTL_DSP_CHANNELS:
2063                 if (get_user(val, (int *) arg))
2064                         return -EFAULT;
2065                 CS_DBGOUT(CS_IOCTL | CS_PARMS, 4, printk(KERN_INFO
2066                          "cs4297a: cs4297a_ioctl(): DSP_CHANNELS val=%d\n",
2067                                  val));
2068                 if (val != 0) {
2069                         if (file->f_mode & FMODE_READ) {
2070                                 stop_adc(s);
2071                                 s->dma_adc.ready = 0;
2072                                 if (val >= 2)
2073                                         s->prop_adc.channels = 2;
2074                                 else
2075                                         s->prop_adc.channels = 1;
2076                         }
2077                         if (file->f_mode & FMODE_WRITE) {
2078                                 stop_dac(s);
2079                                 s->dma_dac.ready = 0;
2080                                 if (val >= 2)
2081                                         s->prop_dac.channels = 2;
2082                                 else
2083                                         s->prop_dac.channels = 1;
2084                         }
2085                 }
2086 
2087                 if (file->f_mode & FMODE_WRITE)
2088                         val = s->prop_dac.channels;
2089                 else if (file->f_mode & FMODE_READ)
2090                         val = s->prop_adc.channels;
2091 
2092                 return put_user(val, (int *) arg);
2093 
2094         case SNDCTL_DSP_GETFMTS:        // Returns a mask 
2095                 CS_DBGOUT(CS_IOCTL | CS_PARMS, 4, printk(KERN_INFO
2096                         "cs4297a: cs4297a_ioctl(): DSP_GETFMT val=0x%.8x\n",
2097                                  AFMT_S16_LE | AFMT_U16_LE | AFMT_S8 |
2098                                  AFMT_U8));
2099                 return put_user(AFMT_S16_LE | AFMT_U16_LE | AFMT_S8 |
2100                                 AFMT_U8, (int *) arg);
2101 
2102         case SNDCTL_DSP_SETFMT:
2103                 if (get_user(val, (int *) arg))
2104                         return -EFAULT;
2105                 CS_DBGOUT(CS_IOCTL | CS_PARMS, 4, printk(KERN_INFO
2106                          "cs4297a: cs4297a_ioctl(): DSP_SETFMT val=0x%.8x\n",
2107                                  val));
2108                 if (val != AFMT_QUERY) {
2109                         if (file->f_mode & FMODE_READ) {
2110                                 stop_adc(s);
2111                                 s->dma_adc.ready = 0;
2112                                 if (val != AFMT_S16_LE
2113                                     && val != AFMT_U16_LE && val != AFMT_S8
2114                                     && val != AFMT_U8)
2115                                         val = AFMT_U8;
2116                                 s->prop_adc.fmt = val;
2117                                 s->prop_adc.fmt_original = s->prop_adc.fmt;
2118                         }
2119                         if (file->f_mode & FMODE_WRITE) {
2120                                 stop_dac(s);
2121                                 s->dma_dac.ready = 0;
2122                                 if (val != AFMT_S16_LE
2123                                     && val != AFMT_U16_LE && val != AFMT_S8
2124                                     && val != AFMT_U8)
2125                                         val = AFMT_U8;
2126                                 s->prop_dac.fmt = val;
2127                                 s->prop_dac.fmt_original = s->prop_dac.fmt;
2128                         }
2129                 } else {
2130                         if (file->f_mode & FMODE_WRITE)
2131                                 val = s->prop_dac.fmt_original;
2132                         else if (file->f_mode & FMODE_READ)
2133                                 val = s->prop_adc.fmt_original;
2134                 }
2135                 CS_DBGOUT(CS_IOCTL | CS_PARMS, 4, printk(KERN_INFO
2136                   "cs4297a: cs4297a_ioctl(): DSP_SETFMT return val=0x%.8x\n", 
2137                         val));
2138                 return put_user(val, (int *) arg);
2139 
2140         case SNDCTL_DSP_POST:
2141                 CS_DBGOUT(CS_IOCTL, 4, printk(KERN_INFO
2142                          "cs4297a: cs4297a_ioctl(): DSP_POST\n"));
2143                 return 0;
2144 
2145         case SNDCTL_DSP_GETTRIGGER:
2146                 val = 0;
2147                 if (file->f_mode & s->ena & FMODE_READ)
2148                         val |= PCM_ENABLE_INPUT;
2149                 if (file->f_mode & s->ena & FMODE_WRITE)
2150                         val |= PCM_ENABLE_OUTPUT;
2151                 return put_user(val, (int *) arg);
2152 
2153         case SNDCTL_DSP_SETTRIGGER:
2154                 if (get_user(val, (int *) arg))
2155                         return -EFAULT;
2156                 if (file->f_mode & FMODE_READ) {
2157                         if (val & PCM_ENABLE_INPUT) {
2158                                 if (!s->dma_adc.ready
2159                                     && (ret = prog_dmabuf_adc(s)))
2160                                         return ret;
2161                                 start_adc(s);
2162                         } else
2163                                 stop_adc(s);
2164                 }
2165                 if (file->f_mode & FMODE_WRITE) {
2166                         if (val & PCM_ENABLE_OUTPUT) {
2167                                 if (!s->dma_dac.ready
2168                                     && (ret = prog_dmabuf_dac(s)))
2169                                         return ret;
2170                                 start_dac(s);
2171                         } else
2172                                 stop_dac(s);
2173                 }
2174                 return 0;
2175 
2176         case SNDCTL_DSP_GETOSPACE:
2177                 if (!(file->f_mode & FMODE_WRITE))
2178                         return -EINVAL;
2179                 if (!s->dma_dac.ready && (val = prog_dmabuf_dac(s)))
2180                         return val;
2181                 spin_lock_irqsave(&s->lock, flags);
2182                 cs4297a_update_ptr(s,CS_FALSE);
2183                 abinfo.fragsize = s->dma_dac.fragsize;
2184                 if (s->dma_dac.mapped)
2185                         abinfo.bytes = s->dma_dac.sbufsz;
2186                 else
2187                         abinfo.bytes =
2188                             s->dma_dac.sbufsz - s->dma_dac.count;
2189                 abinfo.fragstotal = s->dma_dac.numfrag;
2190                 abinfo.fragments = abinfo.bytes >> s->dma_dac.fragshift;
2191                 CS_DBGOUT(CS_FUNCTION | CS_PARMS, 4, printk(KERN_INFO
2192                         "cs4297a: cs4297a_ioctl(): GETOSPACE .fragsize=%d .bytes=%d .fragstotal=%d .fragments=%d\n",
2193                                 abinfo.fragsize,abinfo.bytes,abinfo.fragstotal,
2194                                 abinfo.fragments));
2195                 spin_unlock_irqrestore(&s->lock, flags);
2196                 return copy_to_user((void *) arg, &abinfo,
2197                                     sizeof(abinfo)) ? -EFAULT : 0;
2198 
2199         case SNDCTL_DSP_GETISPACE:
2200                 if (!(file->f_mode & FMODE_READ))
2201                         return -EINVAL;
2202                 if (!s->dma_adc.ready && (val = prog_dmabuf_adc(s)))
2203                         return val;
2204                 spin_lock_irqsave(&s->lock, flags);
2205                 cs4297a_update_ptr(s,CS_FALSE);
2206                 if (s->conversion) {
2207                         abinfo.fragsize = s->dma_adc.fragsize / 2;
2208                         abinfo.bytes = s->dma_adc.count / 2;
2209                         abinfo.fragstotal = s->dma_adc.numfrag;
2210                         abinfo.fragments =
2211                             abinfo.bytes >> (s->dma_adc.fragshift - 1);
2212                 } else {
2213                         abinfo.fragsize = s->dma_adc.fragsize;
2214                         abinfo.bytes = s->dma_adc.count;
2215                         abinfo.fragstotal = s->dma_adc.numfrag;
2216                         abinfo.fragments =
2217                             abinfo.bytes >> s->dma_adc.fragshift;
2218                 }
2219                 spin_unlock_irqrestore(&s->lock, flags);
2220                 return copy_to_user((void *) arg, &abinfo,
2221                                     sizeof(abinfo)) ? -EFAULT : 0;
2222 
2223         case SNDCTL_DSP_NONBLOCK:
2224                 spin_lock(&file->f_lock);
2225                 file->f_flags |= O_NONBLOCK;
2226                 spin_unlock(&file->f_lock);
2227                 return 0;
2228 
2229         case SNDCTL_DSP_GETODELAY:
2230                 if (!(file->f_mode & FMODE_WRITE))
2231                         return -EINVAL;
2232                 if(!s->dma_dac.ready && prog_dmabuf_dac(s))
2233                         return 0;
2234                 spin_lock_irqsave(&s->lock, flags);
2235                 cs4297a_update_ptr(s,CS_FALSE);
2236                 val = s->dma_dac.count;
2237                 spin_unlock_irqrestore(&s->lock, flags);
2238                 return put_user(val, (int *) arg);
2239 
2240         case SNDCTL_DSP_GETIPTR:
2241                 if (!(file->f_mode & FMODE_READ))
2242                         return -EINVAL;
2243                 if(!s->dma_adc.ready && prog_dmabuf_adc(s))
2244                         return 0;
2245                 spin_lock_irqsave(&s->lock, flags);
2246                 cs4297a_update_ptr(s,CS_FALSE);
2247                 cinfo.bytes = s->dma_adc.total_bytes;
2248                 if (s->dma_adc.mapped) {
2249                         cinfo.blocks =
2250                             (cinfo.bytes >> s->dma_adc.fragshift) -
2251                             s->dma_adc.blocks;
2252                         s->dma_adc.blocks =
2253                             cinfo.bytes >> s->dma_adc.fragshift;
2254                 } else {
2255                         if (s->conversion) {
2256                                 cinfo.blocks =
2257                                     s->dma_adc.count /
2258                                     2 >> (s->dma_adc.fragshift - 1);
2259                         } else
2260                                 cinfo.blocks =
2261                                     s->dma_adc.count >> s->dma_adc.
2262                                     fragshift;
2263                 }
2264                 if (s->conversion)
2265                         cinfo.ptr = s->dma_adc.hwptr / 2;
2266                 else
2267                         cinfo.ptr = s->dma_adc.hwptr;
2268                 if (s->dma_adc.mapped)
2269                         s->dma_adc.count &= s->dma_adc.fragsize - 1;
2270                 spin_unlock_irqrestore(&s->lock, flags);
2271                 return copy_to_user((void *) arg, &cinfo, sizeof(cinfo)) ? -EFAULT : 0;
2272 
2273         case SNDCTL_DSP_GETOPTR:
2274                 if (!(file->f_mode & FMODE_WRITE))
2275                         return -EINVAL;
2276                 if(!s->dma_dac.ready && prog_dmabuf_dac(s))
2277                         return 0;
2278                 spin_lock_irqsave(&s->lock, flags);
2279                 cs4297a_update_ptr(s,CS_FALSE);
2280                 cinfo.bytes = s->dma_dac.total_bytes;
2281                 if (s->dma_dac.mapped) {
2282                         cinfo.blocks =
2283                             (cinfo.bytes >> s->dma_dac.fragshift) -
2284                             s->dma_dac.blocks;
2285                         s->dma_dac.blocks =
2286                             cinfo.bytes >> s->dma_dac.fragshift;
2287                 } else {
2288                         cinfo.blocks =
2289                             s->dma_dac.count >> s->dma_dac.fragshift;
2290                 }
2291                 cinfo.ptr = s->dma_dac.hwptr;
2292                 if (s->dma_dac.mapped)
2293                         s->dma_dac.count &= s->dma_dac.fragsize - 1;
2294                 spin_unlock_irqrestore(&s->lock, flags);
2295                 return copy_to_user((void *) arg, &cinfo, sizeof(cinfo)) ? -EFAULT : 0;
2296 
2297         case SNDCTL_DSP_GETBLKSIZE:
2298                 if (file->f_mode & FMODE_WRITE) {
2299                         if ((val = prog_dmabuf_dac(s)))
2300                                 return val;
2301                         return put_user(s->dma_dac.fragsize, (int *) arg);
2302                 }
2303                 if ((val = prog_dmabuf_adc(s)))
2304                         return val;
2305                 if (s->conversion)
2306                         return put_user(s->dma_adc.fragsize / 2,
2307                                         (int *) arg);
2308                 else
2309                         return put_user(s->dma_adc.fragsize, (int *) arg);
2310 
2311         case SNDCTL_DSP_SETFRAGMENT:
2312                 if (get_user(val, (int *) arg))
2313                         return -EFAULT;
2314                 return 0;       // Say OK, but do nothing.
2315 
2316         case SNDCTL_DSP_SUBDIVIDE:
2317                 if ((file->f_mode & FMODE_READ && s->dma_adc.subdivision)
2318                     || (file->f_mode & FMODE_WRITE
2319                         && s->dma_dac.subdivision)) return -EINVAL;
2320                 if (get_user(val, (int *) arg))
2321                         return -EFAULT;
2322                 if (val != 1 && val != 2 && val != 4)
2323                         return -EINVAL;
2324                 if (file->f_mode & FMODE_READ)
2325                         s->dma_adc.subdivision = val;
2326                 else if (file->f_mode & FMODE_WRITE)
2327                         s->dma_dac.subdivision = val;
2328                 return 0;
2329 
2330         case SOUND_PCM_READ_RATE:
2331                 if (file->f_mode & FMODE_READ)
2332                         return put_user(s->prop_adc.rate, (int *) arg);
2333                 else if (file->f_mode & FMODE_WRITE)
2334                         return put_user(s->prop_dac.rate, (int *) arg);
2335 
2336         case SOUND_PCM_READ_CHANNELS:
2337                 if (file->f_mode & FMODE_READ)
2338                         return put_user(s->prop_adc.channels, (int *) arg);
2339                 else if (file->f_mode & FMODE_WRITE)
2340                         return put_user(s->prop_dac.channels, (int *) arg);
2341 
2342         case SOUND_PCM_READ_BITS:
2343                 if (file->f_mode & FMODE_READ)
2344                         return
2345                             put_user(
2346                                      (s->prop_adc.
2347                                       fmt & (AFMT_S8 | AFMT_U8)) ? 8 : 16,
2348                                      (int *) arg);
2349                 else if (file->f_mode & FMODE_WRITE)
2350                         return
2351                             put_user(
2352                                      (s->prop_dac.
2353                                       fmt & (AFMT_S8 | AFMT_U8)) ? 8 : 16,
2354                                      (int *) arg);
2355 
2356         case SOUND_PCM_WRITE_FILTER:
2357         case SNDCTL_DSP_SETSYNCRO:
2358         case SOUND_PCM_READ_FILTER:
2359                 return -EINVAL;
2360         }
2361         return mixer_ioctl(s, cmd, arg);
2362 }
2363 
2364 static long cs4297a_unlocked_ioctl(struct file *file, u_int cmd, u_long arg)
2365 {
2366         int ret;
2367 
2368         mutex_lock(&swarm_cs4297a_mutex);
2369         ret = cs4297a_ioctl(file, cmd, arg);
2370         mutex_unlock(&swarm_cs4297a_mutex);
2371 
2372         return ret;
2373 }
2374 
2375 static int cs4297a_release(struct inode *inode, struct file *file)
2376 {
2377         struct cs4297a_state *s =
2378             (struct cs4297a_state *) file->private_data;
2379 
2380         CS_DBGOUT(CS_FUNCTION | CS_RELEASE, 2, printk(KERN_INFO
2381                  "cs4297a: cs4297a_release(): inode=0x%.8x file=0x%.8x f_mode=0x%x\n",
2382                          (unsigned) inode, (unsigned) file, file->f_mode));
2383         VALIDATE_STATE(s);
2384 
2385         if (file->f_mode & FMODE_WRITE) {
2386                 drain_dac(s, file->f_flags & O_NONBLOCK);
2387                 mutex_lock(&s->open_sem_dac);
2388                 stop_dac(s);
2389                 dealloc_dmabuf(s, &s->dma_dac);
2390                 s->open_mode &= ~FMODE_WRITE;
2391                 mutex_unlock(&s->open_sem_dac);
2392                 wake_up(&s->open_wait_dac);
2393         }
2394         if (file->f_mode & FMODE_READ) {
2395                 drain_adc(s, file->f_flags & O_NONBLOCK);
2396                 mutex_lock(&s->open_sem_adc);
2397                 stop_adc(s);
2398                 dealloc_dmabuf(s, &s->dma_adc);
2399                 s->open_mode &= ~FMODE_READ;
2400                 mutex_unlock(&s->open_sem_adc);
2401                 wake_up(&s->open_wait_adc);
2402         }
2403         return 0;
2404 }
2405 
2406 static int cs4297a_locked_open(struct inode *inode, struct file *file)
2407 {
2408         int minor = iminor(inode);
2409         struct cs4297a_state *s=NULL;
2410         struct list_head *entry;
2411 
2412         CS_DBGOUT(CS_FUNCTION | CS_OPEN, 2, printk(KERN_INFO
2413                 "cs4297a: cs4297a_open(): inode=0x%.8x file=0x%.8x f_mode=0x%x\n",
2414                         (unsigned) inode, (unsigned) file, file->f_mode));
2415         CS_DBGOUT(CS_FUNCTION | CS_OPEN, 2, printk(KERN_INFO
2416                 "cs4297a: status = %08x\n", (int)__raw_readq(SS_CSR(R_SER_STATUS_DEBUG))));
2417 
2418         list_for_each(entry, &cs4297a_devs)
2419         {
2420                 s = list_entry(entry, struct cs4297a_state, list);
2421 
2422                 if (!((s->dev_audio ^ minor) & ~0xf))
2423                         break;
2424         }
2425         if (entry == &cs4297a_devs)
2426                 return -ENODEV;
2427         if (!s) {
2428                 CS_DBGOUT(CS_FUNCTION | CS_OPEN, 2, printk(KERN_INFO
2429                         "cs4297a: cs4297a_open(): Error - unable to find audio state struct\n"));
2430                 return -ENODEV;
2431         }
2432         VALIDATE_STATE(s);
2433         file->private_data = s;
2434 
2435         // wait for device to become free 
2436         if (!(file->f_mode & (FMODE_WRITE | FMODE_READ))) {
2437                 CS_DBGOUT(CS_FUNCTION | CS_OPEN | CS_ERROR, 2, printk(KERN_INFO
2438                          "cs4297a: cs4297a_open(): Error - must open READ and/or WRITE\n"));
2439                 return -ENODEV;
2440         }
2441         if (file->f_mode & FMODE_WRITE) {
2442                 if (__raw_readq(SS_CSR(R_SER_DMA_DSCR_COUNT_TX)) != 0) {
2443                         printk(KERN_ERR "cs4297a: TX pipe needs to drain\n");
2444                         while (__raw_readq(SS_CSR(R_SER_DMA_DSCR_COUNT_TX)))
2445                                 ;
2446                 }
2447           
2448                 mutex_lock(&s->open_sem_dac);
2449                 while (s->open_mode & FMODE_WRITE) {
2450                         if (file->f_flags & O_NONBLOCK) {
2451                                 mutex_unlock(&s->open_sem_dac);
2452                                 return -EBUSY;
2453                         }
2454                         mutex_unlock(&s->open_sem_dac);
2455                         interruptible_sleep_on(&s->open_wait_dac);
2456 
2457                         if (signal_pending(current)) {
2458                                 printk("open - sig pending\n");
2459                                 return -ERESTARTSYS;
2460                         }
2461                         mutex_lock(&s->open_sem_dac);
2462                 }
2463         }
2464         if (file->f_mode & FMODE_READ) {
2465                 mutex_lock(&s->open_sem_adc);
2466                 while (s->open_mode & FMODE_READ) {
2467                         if (file->f_flags & O_NONBLOCK) {
2468                                 mutex_unlock(&s->open_sem_adc);
2469                                 return -EBUSY;
2470                         }
2471                         mutex_unlock(&s->open_sem_adc);
2472                         interruptible_sleep_on(&s->open_wait_adc);
2473 
2474                         if (signal_pending(current)) {
2475                                 printk("open - sig pending\n");
2476                                 return -ERESTARTSYS;
2477                         }
2478                         mutex_lock(&s->open_sem_adc);
2479                 }
2480         }
2481         s->open_mode |= file->f_mode & (FMODE_READ | FMODE_WRITE);
2482         if (file->f_mode & FMODE_READ) {
2483                 s->prop_adc.fmt = AFMT_S16_BE;
2484                 s->prop_adc.fmt_original = s->prop_adc.fmt;
2485                 s->prop_adc.channels = 2;
2486                 s->prop_adc.rate = 48000;
2487                 s->conversion = 0;
2488                 s->ena &= ~FMODE_READ;
2489                 s->dma_adc.ossfragshift = s->dma_adc.ossmaxfrags =
2490                     s->dma_adc.subdivision = 0;
2491                 mutex_unlock(&s->open_sem_adc);
2492 
2493                 if (prog_dmabuf_adc(s)) {
2494                         CS_DBGOUT(CS_OPEN | CS_ERROR, 2, printk(KERN_ERR
2495                                 "cs4297a: adc Program dmabufs failed.\n"));
2496                         cs4297a_release(inode, file);
2497                         return -ENOMEM;
2498                 }
2499         }
2500         if (file->f_mode & FMODE_WRITE) {
2501                 s->prop_dac.fmt = AFMT_S16_BE;
2502                 s->prop_dac.fmt_original = s->prop_dac.fmt;
2503                 s->prop_dac.channels = 2;
2504                 s->prop_dac.rate = 48000;
2505                 s->conversion = 0;
2506                 s->ena &= ~FMODE_WRITE;
2507                 s->dma_dac.ossfragshift = s->dma_dac.ossmaxfrags =
2508                     s->dma_dac.subdivision = 0;
2509                 mutex_unlock(&s->open_sem_dac);
2510 
2511                 if (prog_dmabuf_dac(s)) {
2512                         CS_DBGOUT(CS_OPEN | CS_ERROR, 2, printk(KERN_ERR
2513                                 "cs4297a: dac Program dmabufs failed.\n"));
2514                         cs4297a_release(inode, file);
2515                         return -ENOMEM;
2516                 }
2517         }
2518         CS_DBGOUT(CS_FUNCTION | CS_OPEN, 2,
2519                   printk(KERN_INFO "cs4297a: cs4297a_open()- 0\n"));
2520         return nonseekable_open(inode, file);
2521 }
2522 
2523 static int cs4297a_open(struct inode *inode, struct file *file)
2524 {
2525         int ret;
2526 
2527         mutex_lock(&swarm_cs4297a_mutex);
2528         ret = cs4297a_open(inode, file);
2529         mutex_unlock(&swarm_cs4297a_mutex);
2530 
2531         return ret;
2532 }
2533 
2534 // ******************************************************************************************
2535 //   Wave (audio) file operations struct.
2536 // ******************************************************************************************
2537 static const struct file_operations cs4297a_audio_fops = {
2538         .owner          = THIS_MODULE,
2539         .llseek         = no_llseek,
2540         .read           = cs4297a_read,
2541         .write          = cs4297a_write,
2542         .poll           = cs4297a_poll,
2543         .unlocked_ioctl = cs4297a_unlocked_ioctl,
2544         .mmap           = cs4297a_mmap,
2545         .open           = cs4297a_open,
2546         .release        = cs4297a_release,
2547 };
2548 
2549 static void cs4297a_interrupt(int irq, void *dev_id)
2550 {
2551         struct cs4297a_state *s = (struct cs4297a_state *) dev_id;
2552         u32 status;
2553 
2554         status = __raw_readq(SS_CSR(R_SER_STATUS_DEBUG));
2555 
2556         CS_DBGOUT(CS_INTERRUPT, 6, printk(KERN_INFO
2557                  "cs4297a: cs4297a_interrupt() HISR=0x%.8x\n", status));
2558 
2559 #if 0
2560         /* XXXKW what check *should* be done here? */
2561         if (!(status & (M_SYNCSER_RX_EOP_COUNT | M_SYNCSER_RX_OVERRUN | M_SYNCSER_RX_SYNC_ERR))) {
2562                 status = __raw_readq(SS_CSR(R_SER_STATUS));
2563                 printk(KERN_ERR "cs4297a: unexpected interrupt (status %08x)\n", status);
2564                 return;
2565         }
2566 #endif
2567 
2568         if (status & M_SYNCSER_RX_SYNC_ERR) {
2569                 status = __raw_readq(SS_CSR(R_SER_STATUS));
2570                 printk(KERN_ERR "cs4297a: rx sync error (status %08x)\n", status);
2571                 return;
2572         }
2573 
2574         if (status & M_SYNCSER_RX_OVERRUN) {
2575                 int newptr, i;
2576                 s->stats.rx_ovrrn++;
2577                 printk(KERN_ERR "cs4297a: receive FIFO overrun\n");
2578 
2579                 /* Fix things up: get the receive descriptor pool
2580                    clean and give them back to the hardware */
2581                 while (__raw_readq(SS_CSR(R_SER_DMA_DSCR_COUNT_RX)))
2582                         ;
2583                 newptr = (unsigned) (((__raw_readq(SS_CSR(R_SER_DMA_CUR_DSCR_ADDR_RX)) & M_DMA_CURDSCR_ADDR) -
2584                                      s->dma_adc.descrtab_phys) / sizeof(serdma_descr_t));
2585                 for (i=0; i<DMA_DESCR; i++) {
2586                         s->dma_adc.descrtab[i].descr_a &= ~M_DMA_SERRX_SOP;
2587                 }
2588                 s->dma_adc.swptr = s->dma_adc.hwptr = newptr;
2589                 s->dma_adc.count = 0;
2590                 s->dma_adc.sb_swptr = s->dma_adc.sb_hwptr = s->dma_adc.sample_buf;
2591                 __raw_writeq(DMA_DESCR, SS_CSR(R_SER_DMA_DSCR_COUNT_RX));
2592         }
2593 
2594         spin_lock(&s->lock);
2595         cs4297a_update_ptr(s,CS_TRUE);
2596         spin_unlock(&s->lock);
2597 
2598         CS_DBGOUT(CS_INTERRUPT, 6, printk(KERN_INFO
2599                   "cs4297a: cs4297a_interrupt()-\n"));
2600 }
2601 
2602 #if 0
2603 static struct initvol {
2604         int mixch;
2605         int vol;
2606 } initvol[] __initdata = {
2607 
2608         {SOUND_MIXER_WRITE_VOLUME, 0x4040},
2609         {SOUND_MIXER_WRITE_PCM, 0x4040},
2610         {SOUND_MIXER_WRITE_SYNTH, 0x4040},
2611         {SOUND_MIXER_WRITE_CD, 0x4040},
2612         {SOUND_MIXER_WRITE_LINE, 0x4040},
2613         {SOUND_MIXER_WRITE_LINE1, 0x4040},
2614         {SOUND_MIXER_WRITE_RECLEV, 0x0000},
2615         {SOUND_MIXER_WRITE_SPEAKER, 0x4040},
2616         {SOUND_MIXER_WRITE_MIC, 0x0000}
2617 };
2618 #endif
2619 
2620 static int __init cs4297a_init(void)
2621 {
2622         struct cs4297a_state *s;
2623         u32 pwr, id;
2624         mm_segment_t fs;
2625         int rval;
2626 #ifndef CONFIG_BCM_CS4297A_CSWARM
2627         u64 cfg;
2628         int mdio_val;
2629 #endif
2630 
2631         CS_DBGOUT(CS_INIT | CS_FUNCTION, 2, printk(KERN_INFO 
2632                 "cs4297a: cs4297a_init_module()+ \n"));
2633 
2634 #ifndef CONFIG_BCM_CS4297A_CSWARM
2635         mdio_val = __raw_readq(KSEG1 + A_MAC_REGISTER(2, R_MAC_MDIO)) &
2636                 (M_MAC_MDIO_DIR|M_MAC_MDIO_OUT);
2637 
2638         /* Check syscfg for synchronous serial on port 1 */
2639         cfg = __raw_readq(KSEG1 + A_SCD_SYSTEM_CFG);
2640         if (!(cfg & M_SYS_SER1_ENABLE)) {
2641                 __raw_writeq(cfg | M_SYS_SER1_ENABLE, KSEG1+A_SCD_SYSTEM_CFG);
2642                 cfg = __raw_readq(KSEG1 + A_SCD_SYSTEM_CFG);
2643                 if (!(cfg & M_SYS_SER1_ENABLE)) {
2644                   printk(KERN_INFO "cs4297a: serial port 1 not configured for synchronous operation\n");
2645                   return -1;
2646                 }
2647 
2648                 printk(KERN_INFO "cs4297a: serial port 1 switching to synchronous operation\n");
2649                 
2650                 /* Force the codec (on SWARM) to reset by clearing
2651                    GENO, preserving MDIO (no effect on CSWARM) */
2652                 __raw_writeq(mdio_val, KSEG1+A_MAC_REGISTER(2, R_MAC_MDIO));
2653                 udelay(10);
2654         }
2655 
2656         /* Now set GENO */
2657         __raw_writeq(mdio_val | M_MAC_GENC, KSEG1+A_MAC_REGISTER(2, R_MAC_MDIO));
2658         /* Give the codec some time to finish resetting (start the bit clock) */
2659         udelay(100);
2660 #endif
2661 
2662         if (!(s = kzalloc(sizeof(struct cs4297a_state), GFP_KERNEL))) {
2663                 CS_DBGOUT(CS_ERROR, 1, printk(KERN_ERR
2664                       "cs4297a: probe() no memory for state struct.\n"));
2665                 return -1;
2666         }
2667         s->magic = CS4297a_MAGIC;
2668         init_waitqueue_head(&s->dma_adc.wait);
2669         init_waitqueue_head(&s->dma_dac.wait);
2670         init_waitqueue_head(&s->dma_adc.reg_wait);
2671         init_waitqueue_head(&s->dma_dac.reg_wait);
2672         init_waitqueue_head(&s->open_wait);
2673         init_waitqueue_head(&s->open_wait_adc);
2674         init_waitqueue_head(&s->open_wait_dac);
2675         mutex_init(&s->open_sem_adc);
2676         mutex_init(&s->open_sem_dac);
2677         spin_lock_init(&s->lock);
2678 
2679         s->irq = K_INT_SER_1;
2680 
2681         if (request_irq
2682             (s->irq, cs4297a_interrupt, 0, "Crystal CS4297a", s)) {
2683                 CS_DBGOUT(CS_INIT | CS_ERROR, 1,
2684                           printk(KERN_ERR "cs4297a: irq %u in use\n", s->irq));
2685                 goto err_irq;
2686         }
2687         if ((s->dev_audio = register_sound_dsp(&cs4297a_audio_fops, -1)) <
2688             0) {
2689                 CS_DBGOUT(CS_INIT | CS_ERROR, 1, printk(KERN_ERR
2690                          "cs4297a: probe() register_sound_dsp() failed.\n"));
2691                 goto err_dev1;
2692         }
2693         if ((s->dev_mixer = register_sound_mixer(&cs4297a_mixer_fops, -1)) <
2694             0) {
2695                 CS_DBGOUT(CS_INIT | CS_ERROR, 1, printk(KERN_ERR
2696                          "cs4297a: probe() register_sound_mixer() failed.\n"));
2697                 goto err_dev2;
2698         }
2699 
2700         if (ser_init(s) || dma_init(s)) {
2701                 CS_DBGOUT(CS_INIT | CS_ERROR, 1, printk(KERN_ERR
2702                          "cs4297a: ser_init failed.\n"));
2703                 goto err_dev3;
2704         }
2705 
2706         do {
2707                 udelay(4000);
2708                 rval = cs4297a_read_ac97(s, AC97_POWER_CONTROL, &pwr);
2709         } while (!rval && (pwr != 0xf));
2710 
2711         if (!rval) {
2712                 char *sb1250_duart_present;
2713 
2714                 fs = get_fs();
2715                 set_fs(KERNEL_DS);
2716 #if 0
2717                 val = SOUND_MASK_LINE;
2718                 mixer_ioctl(s, SOUND_MIXER_WRITE_RECSRC, (unsigned long) &val);
2719                 for (i = 0; i < ARRAY_SIZE(initvol); i++) {
2720                         val = initvol[i].vol;
2721                         mixer_ioctl(s, initvol[i].mixch, (unsigned long) &val);
2722                 }
2723 //                cs4297a_write_ac97(s, 0x18, 0x0808);
2724 #else
2725                 //                cs4297a_write_ac97(s, 0x5e, 0x180);
2726                 cs4297a_write_ac97(s, 0x02, 0x0808);
2727                 cs4297a_write_ac97(s, 0x18, 0x0808);
2728 #endif
2729                 set_fs(fs);
2730 
2731                 list_add(&s->list, &cs4297a_devs);
2732 
2733                 cs4297a_read_ac97(s, AC97_VENDOR_ID1, &id);
2734 
2735                 sb1250_duart_present = symbol_get(sb1250_duart_present);
2736                 if (sb1250_duart_present)
2737                         sb1250_duart_present[1] = 0;
2738 
2739                 printk(KERN_INFO "cs4297a: initialized (vendor id = %x)\n", id);
2740 
2741                 CS_DBGOUT(CS_INIT | CS_FUNCTION, 2,
2742                           printk(KERN_INFO "cs4297a: cs4297a_init_module()-\n"));
2743                 
2744                 return 0;
2745         }
2746 
2747  err_dev3:
2748         unregister_sound_mixer(s->dev_mixer);
2749  err_dev2:
2750         unregister_sound_dsp(s->dev_audio);
2751  err_dev1:
2752         free_irq(s->irq, s);
2753  err_irq:
2754         kfree(s);
2755 
2756         printk(KERN_INFO "cs4297a: initialization failed\n");
2757 
2758         return -1;
2759 }
2760 
2761 static void __exit cs4297a_cleanup(void)
2762 {
2763         /*
2764           XXXKW 
2765            disable_irq, free_irq
2766            drain DMA queue
2767            disable DMA
2768            disable TX/RX
2769            free memory
2770         */
2771         CS_DBGOUT(CS_INIT | CS_FUNCTION, 2,
2772                   printk(KERN_INFO "cs4297a: cleanup_cs4297a() finished\n"));
2773 }
2774 
2775 // --------------------------------------------------------------------- 
2776 
2777 MODULE_AUTHOR("Kip Walker, Broadcom Corp.");
2778 MODULE_DESCRIPTION("Cirrus Logic CS4297a Driver for Broadcom SWARM board");
2779 
2780 // --------------------------------------------------------------------- 
2781 
2782 module_init(cs4297a_init);
2783 module_exit(cs4297a_cleanup);
2784 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | Wiki (Japanese) | Wiki (English) | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

osdn.jp