1 //*****************************************************************************
3 // "cs4281.c" -- Cirrus Logic-Crystal CS4281 linux audio driver.
5 // Copyright (C) 2000 Cirrus Logic Corp.
6 // -- adapted from drivers by Thomas Sailer,
7 // -- but don't bug him; Problems should go to:
8 // -- gw boynton (wesb@crystal.cirrus.com) or
9 // -- tom woller (twoller@crystal.cirrus.com).
11 // This program is free software; you can redistribute it and/or modify
12 // it under the terms of the GNU General Public License as published by
13 // the Free Software Foundation; either version 2 of the License, or
14 // (at your option) any later version.
16 // This program is distributed in the hope that it will be useful,
17 // but WITHOUT ANY WARRANTY; without even the implied warranty of
18 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 // GNU General Public License for more details.
21 // You should have received a copy of the GNU General Public License
22 // along with this program; if not, write to the Free Software
23 // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
25 // Module command line parameters:
29 // /dev/dsp standard /dev/dsp device, (mostly) OSS compatible
30 // /dev/mixer standard /dev/mixer device, (mostly) OSS compatible
31 // /dev/midi simple MIDI UART interface, no ioctl
33 // Modification History
34 // 08/20/00 trw - silence and no stopping DAC until release
35 // 08/23/00 trw - added CS_DBG statements, fix interrupt hang issue on DAC stop.
36 // 09/18/00 trw - added 16bit only record with conversion
37 // 09/24/00 trw - added Enhanced Full duplex (separate simultaneous
38 // capture/playback rates)
39 // 10/03/00 trw - fixed mmap (fixed GRECORD and the XMMS mmap test plugin
41 // 10/11/00 trw - modified for 2.4.0-test9 kernel enhancements (NR_MAP removal)
42 // 11/03/00 trw - fixed interrupt loss/stutter, added debug.
43 // 11/10/00 bkz - added __devinit to cs4281_hw_init()
45 // *****************************************************************************
47 #include <linux/config.h>
48 #include <linux/version.h>
49 #include <linux/module.h>
50 #include <linux/string.h>
51 #include <linux/ioport.h>
52 #include <linux/sched.h>
53 #include <linux/delay.h>
54 #include <linux/sound.h>
55 #include <linux/malloc.h>
56 #include <linux/soundcard.h>
57 #include <linux/pci.h>
58 #include <linux/bitops.h>
59 #include <linux/spinlock.h>
62 #include <linux/init.h>
63 #include <linux/poll.h>
64 #include <linux/smp_lock.h>
65 #include <linux/wrapper.h>
66 #include <asm/uaccess.h>
67 #include <asm/hardirq.h>
68 //#include <linux/vmalloc.h>
70 #include "cs4281_hwdefs.h"
74 #undef OSS_DOCUMENTED_MIXER_SEMANTICS
76 // ---------------------------------------------------------------------
78 #ifndef PCI_VENDOR_ID_CIRRUS
79 #define PCI_VENDOR_ID_CIRRUS 0x1013
81 #ifndef PCI_DEVICE_ID_CRYSTAL_CS4281
82 #define PCI_DEVICE_ID_CRYSTAL_CS4281 0x6005
85 #define CS4281_MAGIC ((PCI_DEVICE_ID_CRYSTAL_CS4281<<16) | PCI_VENDOR_ID_CIRRUS)
87 // Turn on/off debugging compilation by using 1/0 respectively for CSDEBUG
89 #define CSDEBUG_INTERFACE 1
92 // CSDEBUG is usual mode is set to 1, then use the
93 // cs_debuglevel and cs_debugmask to turn on or off debugging.
94 // Debug level of 1 has been defined to be kernel errors and info
95 // that should be printed on any released driver.
98 extern unsigned long cs_debugmask
;
99 extern unsigned long cs_debuglevel
;
100 #define CS_DBGOUT(mask,level,x) if((cs_debuglevel >= (level)) && ((mask) & cs_debugmask) ) {x;}
102 #define CS_DBGOUT(mask,level,x)
105 // cs_debugmask areas
107 #define CS_INIT 0x00000001 // initialization and probe functions
108 #define CS_ERROR 0x00000002 // tmp debugging bit placeholder
109 #define CS_INTERRUPT 0x00000004 // interrupt handler (separate from all other)
110 #define CS_FUNCTION 0x00000008 // enter/leave functions
111 #define CS_WAVE_WRITE 0x00000010 // write information for wave
112 #define CS_WAVE_READ 0x00000020 // read information for wave
113 #define CS_MIDI_WRITE 0x00000040 // write information for midi
114 #define CS_MIDI_READ 0x00000080 // read information for midi
115 #define CS_MPU401_WRITE 0x00000100 // write information for mpu401
116 #define CS_MPU401_READ 0x00000200 // read information for mpu401
117 #define CS_OPEN 0x00000400 // all open functions in the driver
118 #define CS_RELEASE 0x00000800 // all release functions in the driver
119 #define CS_PARMS 0x00001000 // functional and operational parameters
120 #define CS_IOCTL 0x00002000 // ioctl (non-mixer)
121 #define CS_TMP 0x10000000 // tmp debug mask bit
124 static unsigned long cs_debuglevel
= 1; // levels range from 1-9
125 static unsigned long cs_debugmask
= CS_INIT
| CS_ERROR
; // use CS_DBGOUT with various mask values
127 MODULE_PARM(cs_debuglevel
, "i");
128 MODULE_PARM(cs_debugmask
, "i");
133 #define MIDIINBUF 500
134 #define MIDIOUTBUF 500
136 #define FMODE_MIDI_SHIFT 3
137 #define FMODE_MIDI_READ (FMODE_READ << FMODE_MIDI_SHIFT)
138 #define FMODE_MIDI_WRITE (FMODE_WRITE << FMODE_MIDI_SHIFT)
140 #define RSRCISIOREGION(dev,num) ((dev)->resource[(num)].start != 0 && \
141 ((dev)->resource[(num)].flags & PCI_BASE_ADDRESS_SPACE) == PCI_BASE_ADDRESS_SPACE_IO)
142 #define RSRCISMEMORYREGION(dev,num) ((dev)->resource[(num)].start != 0 && \
143 ((dev)->resource[(num)].flags & PCI_BASE_ADDRESS_SPACE) == PCI_BASE_ADDRESS_SPACE_MEMORY)
144 #define RSRCADDRESS(dev,num) ((dev)->resource[(num)].start)
146 #define CS4281_MAJOR_VERSION 1
147 #define CS4281_MINOR_VERSION 1
149 #define CS4281_ARCH 64 //architecture key
151 #define CS4281_ARCH 32 //architecture key
154 #define CS_TYPE_ADC 0
155 #define CS_TYPE_DAC 1
157 struct cs4281_state
{
161 // we keep the cards in a linked list
162 struct cs4281_state
*next
;
164 // pcidev is needed to turn off the DDMA controller at driver shutdown
165 struct pci_dev
*pcidev
;
172 // hardware resources
173 unsigned int pBA0phys
, pBA1phys
;
179 unsigned short vol
[10];
182 unsigned short micpreamp
;
188 unsigned fmt_original
; // original requested format
191 unsigned char clkdiv
;
192 } prop_dac
, prop_adc
;
193 unsigned conversion
:1; // conversion from 16 to 8 bit in progress
194 void *tmpbuff
; // tmp buffer for sample conversions
197 struct semaphore open_sem
;
198 struct semaphore open_sem_adc
;
199 struct semaphore open_sem_dac
;
201 wait_queue_head_t open_wait
;
202 wait_queue_head_t open_wait_adc
;
203 wait_queue_head_t open_wait_dac
;
205 dma_addr_t dmaaddr_tmpbuff
;
206 unsigned buforder_tmpbuff
; // Log base 2 of 'rawbuf' size in bytes..
208 void *rawbuf
; // Physical address of
210 unsigned buforder
; // Log base 2 of 'rawbuf' size in bytes..
211 unsigned numfrag
; // # of 'fragments' in the buffer.
212 unsigned fragshift
; // Log base 2 of fragment size.
213 unsigned hwptr
, swptr
;
214 unsigned total_bytes
; // # bytes process since open.
215 unsigned blocks
; // last returned blocks value GETOPTR
216 unsigned wakeup
; // interrupt occurred on block
218 unsigned error
; // over/underrun
219 wait_queue_head_t wait
;
220 // redundant, but makes calculations easier
221 unsigned fragsize
; // 2**fragshift..
222 unsigned dmasize
; // 2**buforder.
223 unsigned fragsamples
;
225 unsigned mapped
:1; // Buffer mapped in cs4281_mmap()?
226 unsigned ready
:1; // prog_dmabuf_dac()/adc() successful?
227 unsigned endcleared
:1;
228 unsigned type
:1; // adc or dac buffer (CS_TYPE_XXX)
229 unsigned ossfragshift
;
231 unsigned subdivision
;
236 unsigned ird
, iwr
, icnt
;
237 unsigned ord
, owr
, ocnt
;
238 wait_queue_head_t iwait
;
239 wait_queue_head_t owait
;
240 struct timer_list timer
;
241 unsigned char ibuf
[MIDIINBUF
];
242 unsigned char obuf
[MIDIOUTBUF
];
251 #define SOUND_MIXER_CS_GETDBGLEVEL _SIOWR('M',120, int)
252 #define SOUND_MIXER_CS_SETDBGLEVEL _SIOWR('M',121, int)
253 #define SOUND_MIXER_CS_GETDBGMASK _SIOWR('M',122, int)
254 #define SOUND_MIXER_CS_SETDBGMASK _SIOWR('M',123, int)
256 #define SNDCTL_DSP_CS_GETDBGLEVEL _SIOWR('P', 50, int)
257 #define SNDCTL_DSP_CS_SETDBGLEVEL _SIOWR('P', 51, int)
258 #define SNDCTL_DSP_CS_GETDBGMASK _SIOWR('P', 52, int)
259 #define SNDCTL_DSP_CS_SETDBGMASK _SIOWR('P', 53, int)
261 static void printioctl(unsigned int x
)
265 // Index of mixtable1[] member is Device ID
266 // and must be <= SOUND_MIXER_NRDEVICES.
267 // Value of array member is index into s->mix.vol[]
268 static const unsigned char mixtable1
[SOUND_MIXER_NRDEVICES
] = {
269 [SOUND_MIXER_PCM
] = 1, // voice
270 [SOUND_MIXER_LINE1
] = 2, // AUX
271 [SOUND_MIXER_CD
] = 3, // CD
272 [SOUND_MIXER_LINE
] = 4, // Line
273 [SOUND_MIXER_SYNTH
] = 5, // FM
274 [SOUND_MIXER_MIC
] = 6, // Mic
275 [SOUND_MIXER_SPEAKER
] = 7, // Speaker
276 [SOUND_MIXER_RECLEV
] = 8, // Recording level
277 [SOUND_MIXER_VOLUME
] = 9 // Master Volume
281 case SOUND_MIXER_CS_GETDBGMASK
:
282 CS_DBGOUT(CS_IOCTL
, 4,
283 printk("SOUND_MIXER_CS_GETDBGMASK:\n"));
285 case SOUND_MIXER_CS_GETDBGLEVEL
:
286 CS_DBGOUT(CS_IOCTL
, 4,
287 printk("SOUND_MIXER_CS_GETDBGLEVEL:\n"));
289 case SOUND_MIXER_CS_SETDBGMASK
:
290 CS_DBGOUT(CS_IOCTL
, 4,
291 printk("SOUND_MIXER_CS_SETDBGMASK:\n"));
293 case SOUND_MIXER_CS_SETDBGLEVEL
:
294 CS_DBGOUT(CS_IOCTL
, 4,
295 printk("SOUND_MIXER_CS_SETDBGLEVEL:\n"));
298 CS_DBGOUT(CS_IOCTL
, 4, printk("OSS_GETVERSION:\n"));
300 case SNDCTL_DSP_SYNC
:
301 CS_DBGOUT(CS_IOCTL
, 4, printk("SNDCTL_DSP_SYNC:\n"));
303 case SNDCTL_DSP_SETDUPLEX
:
304 CS_DBGOUT(CS_IOCTL
, 4, printk("SNDCTL_DSP_SETDUPLEX:\n"));
306 case SNDCTL_DSP_GETCAPS
:
307 CS_DBGOUT(CS_IOCTL
, 4, printk("SNDCTL_DSP_GETCAPS:\n"));
309 case SNDCTL_DSP_RESET
:
310 CS_DBGOUT(CS_IOCTL
, 4, printk("SNDCTL_DSP_RESET:\n"));
312 case SNDCTL_DSP_SPEED
:
313 CS_DBGOUT(CS_IOCTL
, 4, printk("SNDCTL_DSP_SPEED:\n"));
315 case SNDCTL_DSP_STEREO
:
316 CS_DBGOUT(CS_IOCTL
, 4, printk("SNDCTL_DSP_STEREO:\n"));
318 case SNDCTL_DSP_CHANNELS
:
319 CS_DBGOUT(CS_IOCTL
, 4, printk("SNDCTL_DSP_CHANNELS:\n"));
321 case SNDCTL_DSP_GETFMTS
:
322 CS_DBGOUT(CS_IOCTL
, 4, printk("SNDCTL_DSP_GETFMTS:\n"));
324 case SNDCTL_DSP_SETFMT
:
325 CS_DBGOUT(CS_IOCTL
, 4, printk("SNDCTL_DSP_SETFMT:\n"));
327 case SNDCTL_DSP_POST
:
328 CS_DBGOUT(CS_IOCTL
, 4, printk("SNDCTL_DSP_POST:\n"));
330 case SNDCTL_DSP_GETTRIGGER
:
331 CS_DBGOUT(CS_IOCTL
, 4, printk("SNDCTL_DSP_GETTRIGGER:\n"));
333 case SNDCTL_DSP_SETTRIGGER
:
334 CS_DBGOUT(CS_IOCTL
, 4, printk("SNDCTL_DSP_SETTRIGGER:\n"));
336 case SNDCTL_DSP_GETOSPACE
:
337 CS_DBGOUT(CS_IOCTL
, 4, printk("SNDCTL_DSP_GETOSPACE:\n"));
339 case SNDCTL_DSP_GETISPACE
:
340 CS_DBGOUT(CS_IOCTL
, 4, printk("SNDCTL_DSP_GETISPACE:\n"));
342 case SNDCTL_DSP_NONBLOCK
:
343 CS_DBGOUT(CS_IOCTL
, 4, printk("SNDCTL_DSP_NONBLOCK:\n"));
345 case SNDCTL_DSP_GETODELAY
:
346 CS_DBGOUT(CS_IOCTL
, 4, printk("SNDCTL_DSP_GETODELAY:\n"));
348 case SNDCTL_DSP_GETIPTR
:
349 CS_DBGOUT(CS_IOCTL
, 4, printk("SNDCTL_DSP_GETIPTR:\n"));
351 case SNDCTL_DSP_GETOPTR
:
352 CS_DBGOUT(CS_IOCTL
, 4, printk("SNDCTL_DSP_GETOPTR:\n"));
354 case SNDCTL_DSP_GETBLKSIZE
:
355 CS_DBGOUT(CS_IOCTL
, 4, printk("SNDCTL_DSP_GETBLKSIZE:\n"));
357 case SNDCTL_DSP_SETFRAGMENT
:
358 CS_DBGOUT(CS_IOCTL
, 4,
359 printk("SNDCTL_DSP_SETFRAGMENT:\n"));
361 case SNDCTL_DSP_SUBDIVIDE
:
362 CS_DBGOUT(CS_IOCTL
, 4, printk("SNDCTL_DSP_SUBDIVIDE:\n"));
364 case SOUND_PCM_READ_RATE
:
365 CS_DBGOUT(CS_IOCTL
, 4, printk("SOUND_PCM_READ_RATE:\n"));
367 case SOUND_PCM_READ_CHANNELS
:
368 CS_DBGOUT(CS_IOCTL
, 4,
369 printk("SOUND_PCM_READ_CHANNELS:\n"));
371 case SOUND_PCM_READ_BITS
:
372 CS_DBGOUT(CS_IOCTL
, 4, printk("SOUND_PCM_READ_BITS:\n"));
374 case SOUND_PCM_WRITE_FILTER
:
375 CS_DBGOUT(CS_IOCTL
, 4,
376 printk("SOUND_PCM_WRITE_FILTER:\n"));
378 case SNDCTL_DSP_SETSYNCRO
:
379 CS_DBGOUT(CS_IOCTL
, 4, printk("SNDCTL_DSP_SETSYNCRO:\n"));
381 case SOUND_PCM_READ_FILTER
:
382 CS_DBGOUT(CS_IOCTL
, 4, printk("SOUND_PCM_READ_FILTER:\n"));
384 case SNDCTL_DSP_CS_GETDBGMASK
:
385 CS_DBGOUT(CS_IOCTL
, 4,
386 printk("SNDCTL_DSP_CS_GETDBGMASK:\n"));
388 case SNDCTL_DSP_CS_GETDBGLEVEL
:
389 CS_DBGOUT(CS_IOCTL
, 4,
390 printk("SNDCTL_DSP_CS_GETDBGLEVEL:\n"));
392 case SNDCTL_DSP_CS_SETDBGMASK
:
393 CS_DBGOUT(CS_IOCTL
, 4,
394 printk("SNDCTL_DSP_CS_SETDBGMASK:\n"));
396 case SNDCTL_DSP_CS_SETDBGLEVEL
:
397 CS_DBGOUT(CS_IOCTL
, 4,
398 printk("SNDCTL_DSP_CS_SETDBGLEVEL:\n"));
401 case SOUND_MIXER_PRIVATE1
:
402 CS_DBGOUT(CS_IOCTL
, 4, printk("SOUND_MIXER_PRIVATE1:\n"));
404 case SOUND_MIXER_PRIVATE2
:
405 CS_DBGOUT(CS_IOCTL
, 4, printk("SOUND_MIXER_PRIVATE2:\n"));
407 case SOUND_MIXER_PRIVATE3
:
408 CS_DBGOUT(CS_IOCTL
, 4, printk("SOUND_MIXER_PRIVATE3:\n"));
410 case SOUND_MIXER_PRIVATE4
:
411 CS_DBGOUT(CS_IOCTL
, 4, printk("SOUND_MIXER_PRIVATE4:\n"));
413 case SOUND_MIXER_PRIVATE5
:
414 CS_DBGOUT(CS_IOCTL
, 4, printk("SOUND_MIXER_PRIVATE5:\n"));
416 case SOUND_MIXER_INFO
:
417 CS_DBGOUT(CS_IOCTL
, 4, printk("SOUND_MIXER_INFO:\n"));
419 case SOUND_OLD_MIXER_INFO
:
420 CS_DBGOUT(CS_IOCTL
, 4, printk("SOUND_OLD_MIXER_INFO:\n"));
424 switch (_IOC_NR(x
)) {
425 case SOUND_MIXER_VOLUME
:
426 CS_DBGOUT(CS_IOCTL
, 4,
427 printk("SOUND_MIXER_VOLUME:\n"));
429 case SOUND_MIXER_SPEAKER
:
430 CS_DBGOUT(CS_IOCTL
, 4,
431 printk("SOUND_MIXER_SPEAKER:\n"));
433 case SOUND_MIXER_RECLEV
:
434 CS_DBGOUT(CS_IOCTL
, 4,
435 printk("SOUND_MIXER_RECLEV:\n"));
437 case SOUND_MIXER_MIC
:
438 CS_DBGOUT(CS_IOCTL
, 4,
439 printk("SOUND_MIXER_MIC:\n"));
441 case SOUND_MIXER_SYNTH
:
442 CS_DBGOUT(CS_IOCTL
, 4,
443 printk("SOUND_MIXER_SYNTH:\n"));
445 case SOUND_MIXER_RECSRC
:
446 CS_DBGOUT(CS_IOCTL
, 4,
447 printk("SOUND_MIXER_RECSRC:\n"));
449 case SOUND_MIXER_DEVMASK
:
450 CS_DBGOUT(CS_IOCTL
, 4,
451 printk("SOUND_MIXER_DEVMASK:\n"));
453 case SOUND_MIXER_RECMASK
:
454 CS_DBGOUT(CS_IOCTL
, 4,
455 printk("SOUND_MIXER_RECMASK:\n"));
457 case SOUND_MIXER_STEREODEVS
:
458 CS_DBGOUT(CS_IOCTL
, 4,
459 printk("SOUND_MIXER_STEREODEVS:\n"));
461 case SOUND_MIXER_CAPS
:
462 CS_DBGOUT(CS_IOCTL
, 4,
463 printk("SOUND_MIXER_CAPS:\n"));
467 if (i
>= SOUND_MIXER_NRDEVICES
468 || !(vidx
= mixtable1
[i
])) {
469 CS_DBGOUT(CS_IOCTL
, 4,
471 ("UNKNOWN IOCTL: 0x%.8x NR=%d\n",
474 CS_DBGOUT(CS_IOCTL
, 4,
476 ("SOUND_MIXER_IOCTL AC9x: 0x%.8x NR=%d\n",
484 static int prog_dmabuf_adc(struct cs4281_state
*s
);
485 static void prog_codec(struct cs4281_state
*s
, unsigned type
);
487 static struct cs4281_state
*devs
= NULL
;
488 // ---------------------------------------------------------------------
490 // Hardware Interfaces For the CS4281
494 //******************************************************************************
495 // "delayus()-- Delay for the specified # of microseconds.
496 //******************************************************************************
497 static void delayus(u32 delay
)
501 j
= (delay
* HZ
) / 1000000; /* calculate delay in jiffies */
503 j
= 1; /* minimum one jiffy. */
504 current
->state
= TASK_UNINTERRUPTIBLE
;
512 //******************************************************************************
513 // "cs4281_read_ac97" -- Reads a word from the specified location in the
514 // CS4281's address space(based on the BA0 register).
516 // 1. Write ACCAD = Command Address Register = 46Ch for AC97 register address
517 // 2. Write ACCDA = Command Data Register = 470h for data to write to AC97 register,
519 // 3. Write ACCTL = Control Register = 460h for initiating the write
520 // 4. Read ACCTL = 460h, DCV should be reset by now and 460h = 17h
521 // 5. if DCV not cleared, break and return error
522 // 6. Read ACSTS = Status Register = 464h, check VSTS bit
523 //****************************************************************************
524 static int cs4281_read_ac97(struct cs4281_state
*card
, u32 offset
,
529 // Make sure that there is not data sitting
530 // around from a previous uncompleted access.
531 // ACSDA = Status Data Register = 47Ch
532 status
= readl(card
->pBA0
+ BA0_ACSDA
);
534 // Setup the AC97 control registers on the CS4281 to send the
535 // appropriate command to the AC97 to perform the read.
536 // ACCAD = Command Address Register = 46Ch
537 // ACCDA = Command Data Register = 470h
538 // ACCTL = Control Register = 460h
539 // bit DCV - will clear when process completed
540 // bit CRW - Read command
541 // bit VFRM - valid frame enabled
542 // bit ESYN - ASYNC generation enabled
544 // Get the actual AC97 register from the offset
545 writel(offset
- BA0_AC97_RESET
, card
->pBA0
+ BA0_ACCAD
);
546 writel(0, card
->pBA0
+ BA0_ACCDA
);
547 writel(ACCTL_DCV
| ACCTL_CRW
| ACCTL_VFRM
| ACCTL_ESYN
,
548 card
->pBA0
+ BA0_ACCTL
);
550 // Wait for the read to occur.
551 for (count
= 0; count
< 10; count
++) {
552 // First, we want to wait for a short time.
555 // Now, check to see if the read has completed.
556 // ACCTL = 460h, DCV should be reset by now and 460h = 17h
557 if (!(readl(card
->pBA0
+ BA0_ACCTL
) & ACCTL_DCV
))
561 // Make sure the read completed.
562 if (readl(card
->pBA0
+ BA0_ACCTL
) & ACCTL_DCV
)
565 // Wait for the valid status bit to go active.
566 for (count
= 0; count
< 10; count
++) {
567 // Read the AC97 status register.
568 // ACSTS = Status Register = 464h
569 status
= readl(card
->pBA0
+ BA0_ACSTS
);
571 // See if we have valid status.
572 // VSTS - Valid Status
573 if (status
& ACSTS_VSTS
)
575 // Wait for a short while.
579 // Make sure we got valid status.
580 if (!(status
& ACSTS_VSTS
))
583 // Read the data returned from the AC97 register.
584 // ACSDA = Status Data Register = 474h
585 *value
= readl(card
->pBA0
+ BA0_ACSDA
);
592 //****************************************************************************
594 // "cs4281_write_ac97()"-- writes a word to the specified location in the
595 // CS461x's address space (based on the part's base address zero register).
597 // 1. Write ACCAD = Command Address Register = 46Ch for AC97 register address
598 // 2. Write ACCDA = Command Data Register = 470h for data to write to AC97 reg.
599 // 3. Write ACCTL = Control Register = 460h for initiating the write
600 // 4. Read ACCTL = 460h, DCV should be reset by now and 460h = 07h
601 // 5. if DCV not cleared, break and return error
603 //****************************************************************************
604 static int cs4281_write_ac97(struct cs4281_state
*card
, u32 offset
,
609 CS_DBGOUT(CS_FUNCTION
, 2,
610 printk(KERN_INFO
"cs4281: cs_4281_write_ac97()+ \n"));
612 // Setup the AC97 control registers on the CS4281 to send the
613 // appropriate command to the AC97 to perform the read.
614 // ACCAD = Command Address Register = 46Ch
615 // ACCDA = Command Data Register = 470h
616 // ACCTL = Control Register = 460h
617 // set DCV - will clear when process completed
618 // reset CRW - Write command
619 // set VFRM - valid frame enabled
620 // set ESYN - ASYNC generation enabled
621 // set RSTN - ARST# inactive, AC97 codec not reset
623 // Get the actual AC97 register from the offset
625 writel(offset
- BA0_AC97_RESET
, card
->pBA0
+ BA0_ACCAD
);
626 writel(value
, card
->pBA0
+ BA0_ACCDA
);
627 writel(ACCTL_DCV
| ACCTL_VFRM
| ACCTL_ESYN
,
628 card
->pBA0
+ BA0_ACCTL
);
630 // Wait for the write to occur.
631 for (count
= 0; count
< 10; count
++) {
632 // First, we want to wait for a short time.
634 // Now, check to see if the write has completed.
635 // ACCTL = 460h, DCV should be reset by now and 460h = 07h
636 status
= readl(card
->pBA0
+ BA0_ACCTL
);
637 if (!(status
& ACCTL_DCV
))
641 // Make sure the write completed.
642 if (status
& ACCTL_DCV
) {
643 CS_DBGOUT(CS_ERROR
, 1, printk(KERN_INFO
644 "cs4281: cs_4281_write_ac97()- unable to write. ACCTL_DCV active\n"));
647 CS_DBGOUT(CS_FUNCTION
, 2,
648 printk(KERN_INFO
"cs4281: cs_4281_write_ac97()- 0\n"));
654 //******************************************************************************
655 // "Init4281()" -- Bring up the part.
656 //******************************************************************************
657 static int __devinit
cs4281_hw_init(struct cs4281_state
*card
)
662 CS_DBGOUT(CS_FUNCTION
, 2,
663 printk(KERN_INFO
"cs4281: cs4281_hw_init()+ \n"));
664 //***************************************7
665 // Set up the Sound System Configuration
666 //***************************************
668 // Set the 'Configuration Write Protect' register
669 // to 4281h. Allows vendor-defined configuration
670 // space between 0e4h and 0ffh to be written.
672 writel(0x4281, card
->pBA0
+ BA0_CWPR
); // (3e0h)
674 // (0), Blast the clock control register to zero so that the
675 // PLL starts out in a known state, and blast the master serial
676 // port control register to zero so that the serial ports also
677 // start out in a known state.
679 writel(0, card
->pBA0
+ BA0_CLKCR1
); // (400h)
680 writel(0, card
->pBA0
+ BA0_SERMC
); // (420h)
683 // (1), Make ESYN go to zero to turn off
684 // the Sync pulse on the AC97 link.
686 writel(0, card
->pBA0
+ BA0_ACCTL
);
690 // (2) Drive the ARST# pin low for a minimum of 1uS (as defined in
691 // the AC97 spec) and then drive it high. This is done for non
692 // AC97 modes since there might be logic external to the CS461x
693 // that uses the ARST# line for a reset.
695 writel(0, card
->pBA0
+ BA0_SPMC
); // (3ech)
697 writel(SPMC_RSTN
, card
->pBA0
+ BA0_SPMC
);
698 delayus(50000); // Wait 50 ms for ABITCLK to become stable.
700 // (3) Turn on the Sound System Clocks.
701 writel(CLKCR1_PLLP
, card
->pBA0
+ BA0_CLKCR1
); // (400h)
702 delayus(50000); // Wait for the PLL to stabilize.
703 // Turn on clocking of the core (CLKCR1(400h) = 0x00000030)
704 writel(CLKCR1_PLLP
| CLKCR1_SWCE
, card
->pBA0
+ BA0_CLKCR1
);
706 // (4) Power on everything for now..
707 writel(0x7E, card
->pBA0
+ BA0_SSPM
); // (740h)
709 // (5) Wait for clock stabilization.
710 for (temp1
= 0; temp1
< 1000; temp1
++) {
712 if (readl(card
->pBA0
+ BA0_CLKCR1
) & CLKCR1_DLLRDY
)
715 if (!(readl(card
->pBA0
+ BA0_CLKCR1
) & CLKCR1_DLLRDY
)) {
716 CS_DBGOUT(CS_ERROR
, 1,
717 printk(KERN_ERR
"cs4281: DLLRDY failed!\n"));
720 // (6) Enable ASYNC generation.
721 writel(ACCTL_ESYN
, card
->pBA0
+ BA0_ACCTL
); // (460h)
723 // Now wait 'for a short while' to allow the AC97
724 // part to start generating bit clock. (so we don't
725 // Try to start the PLL without an input clock.)
728 // Set the serial port timing configuration, so that the
729 // clock control circuit gets its clock from the right place.
730 writel(SERMC_PTC_AC97
, card
->pBA0
+ BA0_SERMC
); // (420h)=2.
732 // (7) Wait for the codec ready signal from the AC97 codec.
734 for (temp1
= 0; temp1
< 1000; temp1
++) {
735 // Delay a mil to let things settle out and
736 // to prevent retrying the read too quickly.
738 if (readl(card
->pBA0
+ BA0_ACSTS
) & ACSTS_CRDY
) // If ready, (464h)
739 break; // exit the 'for' loop.
741 if (!(readl(card
->pBA0
+ BA0_ACSTS
) & ACSTS_CRDY
)) // If never came ready,
743 CS_DBGOUT(CS_FUNCTION
, 2,
745 "cs4281: ACSTS never came ready!\n"));
746 return -EIO
; // exit initialization.
748 // (8) Assert the 'valid frame' signal so we can
749 // begin sending commands to the AC97 codec.
750 writel(ACCTL_VFRM
| ACCTL_ESYN
, card
->pBA0
+ BA0_ACCTL
); // (460h)
752 // (9), Wait until CODEC calibration is finished.
753 // Print an error message if it doesn't.
754 for (temp1
= 0; temp1
< 1000; temp1
++) {
756 // Read the AC97 Powerdown Control/Status Register.
757 cs4281_read_ac97(card
, BA0_AC97_POWERDOWN
, &temp2
);
758 if ((temp2
& 0x0000000F) == 0x0000000F)
761 if ((temp2
& 0x0000000F) != 0x0000000F) {
762 CS_DBGOUT(CS_FUNCTION
, 2, printk(KERN_ERR
763 "cs4281: Codec failed to calibrate. Status = %.8x.\n",
767 // (10), Set the serial port timing configuration, so that the
768 // clock control circuit gets its clock from the right place.
769 writel(SERMC_PTC_AC97
, card
->pBA0
+ BA0_SERMC
); // (420h)=2.
772 // (11) Wait until we've sampled input slots 3 & 4 as valid, meaning
773 // that the codec is pumping ADC data across the AC link.
774 for (temp1
= 0; temp1
< 1000; temp1
++) {
775 // Delay a mil to let things settle out and
776 // to prevent retrying the read too quickly.
777 delayus(1000); //(test)
779 // Read the input slot valid register; See
780 // if input slots 3 and 4 are valid yet.
782 (readl(card
->pBA0
+ BA0_ACISV
) &
783 (ACISV_ISV3
| ACISV_ISV4
)) ==
784 (ACISV_ISV3
| ACISV_ISV4
)) break; // Exit the 'for' if slots are valid.
786 // If we never got valid data, exit initialization.
787 if ((readl(card
->pBA0
+ BA0_ACISV
) & (ACISV_ISV3
| ACISV_ISV4
))
788 != (ACISV_ISV3
| ACISV_ISV4
)) {
789 CS_DBGOUT(CS_FUNCTION
, 2,
791 "cs4281: Never got valid data!\n"));
792 return -EIO
; // If no valid data, exit initialization.
794 // (12), Start digital data transfer of audio data to the codec.
795 writel(ACOSV_SLV3
| ACOSV_SLV4
, card
->pBA0
+ BA0_ACOSV
); // (468h)
798 //**************************************
799 // Unmute the Master and Alternate
800 // (headphone) volumes. Set to max.
801 //**************************************
802 cs4281_write_ac97(card
, BA0_AC97_HEADPHONE_VOLUME
, 0);
803 cs4281_write_ac97(card
, BA0_AC97_MASTER_VOLUME
, 0);
805 //******************************************
806 // Power on the DAC(AddDACUser()from main())
807 //******************************************
808 cs4281_read_ac97(card
, BA0_AC97_POWERDOWN
, &temp1
);
809 cs4281_write_ac97(card
, BA0_AC97_POWERDOWN
, temp1
&= 0xfdff);
811 // Wait until we sample a DAC ready state.
812 for (temp2
= 0; temp2
< 32; temp2
++) {
813 // Let's wait a mil to let things settle.
815 // Read the current state of the power control reg.
816 cs4281_read_ac97(card
, BA0_AC97_POWERDOWN
, &temp1
);
817 // If the DAC ready state bit is set, stop waiting.
822 //******************************************
823 // Power on the ADC(AddADCUser()from main())
824 //******************************************
825 cs4281_read_ac97(card
, BA0_AC97_POWERDOWN
, &temp1
);
826 cs4281_write_ac97(card
, BA0_AC97_POWERDOWN
, temp1
&= 0xfeff);
828 // Wait until we sample ADC ready state.
829 for (temp2
= 0; temp2
< 32; temp2
++) {
830 // Let's wait a mil to let things settle.
832 // Read the current state of the power control reg.
833 cs4281_read_ac97(card
, BA0_AC97_POWERDOWN
, &temp1
);
834 // If the ADC ready state bit is set, stop waiting.
838 // Set up 4281 Register contents that
839 // don't change for boot duration.
841 // For playback, we map AC97 slot 3 and 4(Left
842 // & Right PCM playback) to DMA Channel 0.
843 // Set the fifo to be 15 bytes at offset zero.
845 ac97_slotid
= 0x01000f00; // FCR0.RS[4:0]=1(=>slot4, right PCM playback).
846 // FCR0.LS[4:0]=0(=>slot3, left PCM playback).
847 // FCR0.SZ[6-0]=15; FCR0.OF[6-0]=0.
848 writel(ac97_slotid
, card
->pBA0
+ BA0_FCR0
); // (180h)
849 writel(ac97_slotid
| FCRn_FEN
, card
->pBA0
+ BA0_FCR0
); // Turn on FIFO Enable.
851 // For capture, we map AC97 slot 10 and 11(Left
852 // and Right PCM Record) to DMA Channel 1.
853 // Set the fifo to be 15 bytes at offset sixteen.
854 ac97_slotid
= 0x0B0A0f10; // FCR1.RS[4:0]=11(=>slot11, right PCM record).
855 // FCR1.LS[4:0]=10(=>slot10, left PCM record).
856 // FCR1.SZ[6-0]=15; FCR1.OF[6-0]=16.
857 writel(ac97_slotid
| FCRn_PSH
, card
->pBA0
+ BA0_FCR1
); // (184h)
858 writel(ac97_slotid
| FCRn_FEN
, card
->pBA0
+ BA0_FCR1
); // Turn on FIFO Enable.
860 // Map the Playback SRC to the same AC97 slots(3 & 4--
861 // --Playback left & right)as DMA channel 0.
862 // Map the record SRC to the same AC97 slots(10 & 11--
863 // -- Record left & right) as DMA channel 1.
865 ac97_slotid
= 0x0b0a0100; // SCRSA.PRSS[4:0]=1(=>slot4, right PCM playback).
866 // SCRSA.PLSS[4:0]=0(=>slot3, left PCM playback).
867 // SCRSA.CRSS[4:0]=11(=>slot11, right PCM record)
868 // SCRSA.CLSS[4:0]=10(=>slot10, left PCM record).
869 writel(ac97_slotid
, card
->pBA0
+ BA0_SRCSA
); // (75ch)
871 // Set 'Half Terminal Count Interrupt Enable' and 'Terminal
872 // Count Interrupt Enable' in DMA Control Registers 0 & 1.
873 // Set 'MSK' flag to 1 to keep the DMA engines paused.
874 temp1
= (DCRn_HTCIE
| DCRn_TCIE
| DCRn_MSK
); // (00030001h)
875 writel(temp1
, card
->pBA0
+ BA0_DCR0
); // (154h
876 writel(temp1
, card
->pBA0
+ BA0_DCR1
); // (15ch)
878 // Set 'Auto-Initialize Control' to 'enabled'; For playback,
879 // set 'Transfer Type Control'(TR[1:0]) to 'read transfer',
880 // for record, set Transfer Type Control to 'write transfer'.
881 // All other bits set to zero; Some will be changed @ transfer start.
882 temp1
= (DMRn_DMA
| DMRn_AUTO
| DMRn_TR_READ
); // (20000018h)
883 writel(temp1
, card
->pBA0
+ BA0_DMR0
); // (150h)
884 temp1
= (DMRn_DMA
| DMRn_AUTO
| DMRn_TR_WRITE
); // (20000014h)
885 writel(temp1
, card
->pBA0
+ BA0_DMR1
); // (158h)
887 // Enable DMA interrupts generally, and
888 // DMA0 & DMA1 interrupts specifically.
889 temp1
= readl(card
->pBA0
+ BA0_HIMR
) & 0xfffbfcff;
890 writel(temp1
, card
->pBA0
+ BA0_HIMR
);
892 CS_DBGOUT(CS_FUNCTION
, 2,
893 printk(KERN_INFO
"cs4281: cs4281_hw_init()- 0\n"));
898 //******************************************************************************
899 // "cs4281_play_rate()" --
900 //******************************************************************************
901 static void cs4281_play_rate(struct cs4281_state
*card
, u32 playrate
)
905 // Based on the sample rate, program the DACSR register.
906 if (playrate
== 8000)
908 if (playrate
== 11025)
910 else if (playrate
== 22050)
912 else if (playrate
== 44100)
914 else if ((playrate
<= 48000) && (playrate
>= 6023))
915 DACSRvalue
= 24576000 / (playrate
* 16);
916 else if (playrate
< 6023)
917 // Not allowed by open.
919 else if (playrate
> 48000)
920 // Not allowed by open.
922 CS_DBGOUT(CS_WAVE_WRITE
| CS_PARMS
, 2, printk(KERN_INFO
923 "cs4281: cs4281_play_rate(): DACSRvalue=0x%.8x playrate=%d\n",
926 // Write the 'sample rate select code'
927 // to the 'DAC Sample Rate' register.
928 writel(DACSRvalue
, card
->pBA0
+ BA0_DACSR
); // (744h)
931 //******************************************************************************
932 // "cs4281_record_rate()" -- Initialize the record sample rate converter.
933 //******************************************************************************
934 static void cs4281_record_rate(struct cs4281_state
*card
, u32 outrate
)
939 // Based on the sample rate, program the ADCSR register
943 if (outrate
== 11025)
945 else if (outrate
== 22050)
947 else if (outrate
== 44100)
949 else if ((outrate
<= 48000) && (outrate
>= 6023))
950 ADCSRvalue
= 24576000 / (outrate
* 16);
951 else if (outrate
< 6023) {
952 // Not allowed by open.
954 } else if (outrate
> 48000) {
955 // Not allowed by open.
958 CS_DBGOUT(CS_WAVE_READ
| CS_PARMS
, 2, printk(KERN_INFO
959 "cs4281: cs4281_record_rate(): ADCSRvalue=0x%.8x outrate=%d\n",
960 ADCSRvalue
, outrate
));
961 // Write the 'sample rate select code
962 // to the 'ADC Sample Rate' register.
963 writel(ADCSRvalue
, card
->pBA0
+ BA0_ADCSR
); // (748h)
968 static void stop_dac(struct cs4281_state
*s
)
973 CS_DBGOUT(CS_WAVE_WRITE
, 3,
974 printk(KERN_INFO
"cs4281: stop_dac():\n"));
975 spin_lock_irqsave(&s
->lock
, flags
);
976 s
->ena
&= ~FMODE_WRITE
;
977 temp1
= readl(s
->pBA0
+ BA0_DCR0
) | DCRn_MSK
;
978 writel(temp1
, s
->pBA0
+ BA0_DCR0
);
980 spin_unlock_irqrestore(&s
->lock
, flags
);
984 static void start_dac(struct cs4281_state
*s
)
989 CS_DBGOUT(CS_FUNCTION
, 3,
990 printk(KERN_INFO
"cs4281: start_dac()+\n"));
991 spin_lock_irqsave(&s
->lock
, flags
);
992 if (!(s
->ena
& FMODE_WRITE
) && (s
->dma_dac
.mapped
||
993 s
->dma_dac
.count
> 0)
994 && s
->dma_dac
.ready
) {
995 s
->ena
|= FMODE_WRITE
;
996 temp1
= readl(s
->pBA0
+ BA0_DCR0
) & ~DCRn_MSK
; // Clear DMA0 channel mask.
997 writel(temp1
, s
->pBA0
+ BA0_DCR0
); // Start DMA'ing.
998 writel(HICR_IEV
| HICR_CHGM
, s
->pBA0
+ BA0_HICR
); // Enable interrupts.
1000 writel(7, s
->pBA0
+ BA0_PPRVC
);
1001 writel(7, s
->pBA0
+ BA0_PPLVC
);
1002 CS_DBGOUT(CS_WAVE_WRITE
| CS_PARMS
, 8, printk(KERN_INFO
1003 "cs4281: start_dac(): writel 0x%x start dma\n",
1007 spin_unlock_irqrestore(&s
->lock
, flags
);
1008 CS_DBGOUT(CS_FUNCTION
, 3,
1009 printk(KERN_INFO
"cs4281: start_dac()-\n"));
1013 static void stop_adc(struct cs4281_state
*s
)
1015 unsigned long flags
;
1018 CS_DBGOUT(CS_FUNCTION
, 3,
1019 printk(KERN_INFO
"cs4281: stop_adc()+\n"));
1021 spin_lock_irqsave(&s
->lock
, flags
);
1022 s
->ena
&= ~FMODE_READ
;
1024 if (s
->conversion
== 1) {
1026 s
->prop_adc
.fmt
= s
->prop_adc
.fmt_original
;
1028 temp1
= readl(s
->pBA0
+ BA0_DCR1
) | DCRn_MSK
;
1029 writel(temp1
, s
->pBA0
+ BA0_DCR1
);
1030 spin_unlock_irqrestore(&s
->lock
, flags
);
1031 CS_DBGOUT(CS_FUNCTION
, 3,
1032 printk(KERN_INFO
"cs4281: stop_adc()-\n"));
1036 static void start_adc(struct cs4281_state
*s
)
1038 unsigned long flags
;
1041 CS_DBGOUT(CS_FUNCTION
, 2,
1042 printk(KERN_INFO
"cs4281: start_adc()+\n"));
1044 spin_lock_irqsave(&s
->lock
, flags
);
1045 if (!(s
->ena
& FMODE_READ
) &&
1046 (s
->dma_adc
.mapped
|| s
->dma_adc
.count
<=
1047 (signed) (s
->dma_adc
.dmasize
- 2 * s
->dma_adc
.fragsize
))
1048 && s
->dma_adc
.ready
) {
1049 if (s
->prop_adc
.fmt
& AFMT_S8
|| s
->prop_adc
.fmt
& AFMT_U8
) {
1051 // now only use 16 bit capture, due to truncation issue
1052 // in the chip, noticable distortion occurs.
1053 // allocate buffer and then convert from 16 bit to
1054 // 8 bit for the user buffer.
1056 s
->prop_adc
.fmt_original
= s
->prop_adc
.fmt
;
1057 if (s
->prop_adc
.fmt
& AFMT_S8
) {
1058 s
->prop_adc
.fmt
&= ~AFMT_S8
;
1059 s
->prop_adc
.fmt
|= AFMT_S16_LE
;
1061 if (s
->prop_adc
.fmt
& AFMT_U8
) {
1062 s
->prop_adc
.fmt
&= ~AFMT_U8
;
1063 s
->prop_adc
.fmt
|= AFMT_U16_LE
;
1066 // prog_dmabuf_adc performs a stop_adc() but that is
1067 // ok since we really haven't started the DMA yet.
1069 prog_codec(s
, CS_TYPE_ADC
);
1071 if (prog_dmabuf_adc(s
) != 0) {
1072 CS_DBGOUT(CS_ERROR
, 3,
1074 "cs4281: start_adc(): error in prog_dmabuf_adc\n"));
1078 s
->ena
|= FMODE_READ
;
1079 temp1
= readl(s
->pBA0
+ BA0_DCR1
) & ~DCRn_MSK
; // Clear DMA1 channel mask bit.
1080 writel(temp1
, s
->pBA0
+ BA0_DCR1
); // Start recording
1081 writel(HICR_IEV
| HICR_CHGM
, s
->pBA0
+ BA0_HICR
); // Enable interrupts.
1082 CS_DBGOUT(CS_PARMS
, 6,
1084 "cs4281: start_adc(): writel 0x%x \n",
1087 spin_unlock_irqrestore(&s
->lock
, flags
);
1088 CS_DBGOUT(CS_FUNCTION
, 2,
1089 printk(KERN_INFO
"cs4281: start_adc()-\n"));
1094 // ---------------------------------------------------------------------
1095 // use 64k (+1) rather than 32k as some of the higher frequencies need a larger buffer.
1096 // comments reflect 32k.
1097 #define DMABUF_DEFAULTORDER (15-PAGE_SHIFT+1) // == 3(for PC), = log base 2( buff sz = 32k).
1098 #define DMABUF_MINORDER 1 // ==> min buffer size = 8K.
1101 extern void dealloc_dmabuf(struct cs4281_state
*s
, struct dmabuf
*db
)
1103 struct page
*map
, *mapend
;
1106 // Undo prog_dmabuf()'s marking the pages as reserved
1108 virt_to_page(db
->rawbuf
+ (PAGE_SIZE
<< db
->buforder
) -
1110 for (map
= virt_to_page(db
->rawbuf
); map
<= mapend
; map
++)
1111 mem_map_unreserve(map
);
1112 pci_free_consistent(s
->pcidev
, PAGE_SIZE
<< db
->buforder
,
1113 db
->rawbuf
, db
->dmaaddr
);
1115 if (s
->tmpbuff
&& (db
->type
== CS_TYPE_ADC
)) {
1116 // Undo prog_dmabuf()'s marking the pages as reserved
1118 virt_to_page(s
->tmpbuff
+
1119 (PAGE_SIZE
<< s
->buforder_tmpbuff
) - 1);
1120 for (map
= virt_to_page(s
->tmpbuff
); map
<= mapend
; map
++)
1121 mem_map_unreserve(map
);
1122 pci_free_consistent(s
->pcidev
,
1123 PAGE_SIZE
<< s
->buforder_tmpbuff
,
1124 s
->tmpbuff
, s
->dmaaddr_tmpbuff
);
1128 db
->mapped
= db
->ready
= 0;
1131 static int prog_dmabuf(struct cs4281_state
*s
, struct dmabuf
*db
)
1134 unsigned bytespersec
, temp1
;
1135 unsigned bufs
, sample_shift
= 0;
1136 struct page
*map
, *mapend
;
1138 CS_DBGOUT(CS_FUNCTION
, 2,
1139 printk(KERN_INFO
"cs4281: prog_dmabuf()+\n"));
1140 db
->hwptr
= db
->swptr
= db
->total_bytes
= db
->count
= db
->error
=
1141 db
->endcleared
= db
->blocks
= db
->wakeup
= 0;
1144 db
->ready
= db
->mapped
= 0;
1145 for (order
= DMABUF_DEFAULTORDER
; order
>= DMABUF_MINORDER
;
1149 (void *) pci_alloc_consistent(s
->pcidev
,
1156 CS_DBGOUT(CS_ERROR
, 1, printk(KERN_ERR
1157 "cs4281: prog_dmabuf(): unable to allocate rawbuf\n"));
1160 db
->buforder
= order
;
1161 // Now mark the pages as reserved; otherwise the
1162 // remap_page_range() in cs4281_mmap doesn't work.
1163 // 1. get index to last page in mem_map array for rawbuf.
1165 virt_to_page(db
->rawbuf
+ (PAGE_SIZE
<< db
->buforder
) -
1168 // 2. mark each physical page in range as 'reserved'.
1169 for (map
= virt_to_page(db
->rawbuf
); map
<= mapend
; map
++)
1170 mem_map_reserve(map
);
1172 if (!s
->tmpbuff
&& (db
->type
== CS_TYPE_ADC
)) {
1173 for (order
= DMABUF_DEFAULTORDER
; order
>= DMABUF_MINORDER
;
1177 (void *) pci_alloc_consistent(s
->pcidev
,
1184 CS_DBGOUT(CS_ERROR
, 1, printk(KERN_ERR
1185 "cs4281: prog_dmabuf(): unable to allocate tmpbuff\n"));
1188 s
->buforder_tmpbuff
= order
;
1189 // Now mark the pages as reserved; otherwise the
1190 // remap_page_range() in cs4281_mmap doesn't work.
1191 // 1. get index to last page in mem_map array for rawbuf.
1193 virt_to_page(s
->tmpbuff
+
1194 (PAGE_SIZE
<< s
->buforder_tmpbuff
) - 1);
1196 // 2. mark each physical page in range as 'reserved'.
1197 for (map
= virt_to_page(s
->tmpbuff
); map
<= mapend
; map
++)
1198 mem_map_reserve(map
);
1200 if (db
->type
== CS_TYPE_DAC
) {
1201 if (s
->prop_dac
.fmt
& (AFMT_S16_LE
| AFMT_U16_LE
))
1203 if (s
->prop_dac
.channels
> 1)
1205 bytespersec
= s
->prop_dac
.rate
<< sample_shift
;
1206 } else // CS_TYPE_ADC
1208 if (s
->prop_adc
.fmt
& (AFMT_S16_LE
| AFMT_U16_LE
))
1210 if (s
->prop_adc
.channels
> 1)
1212 bytespersec
= s
->prop_adc
.rate
<< sample_shift
;
1214 bufs
= PAGE_SIZE
<< db
->buforder
;
1217 #define INTERRUPT_RATE_MS 100 // Interrupt rate in milliseconds.
1219 temp1
= bytespersec
/ (1000 / INTERRUPT_RATE_MS
); // Nominal frag size(bytes/interrupt)
1220 db
->fragshift
= 8; // Min 256 bytes.
1221 while (1 << db
->fragshift
< temp1
) // Calc power of 2 frag size.
1223 db
->fragsize
= 1 << db
->fragshift
;
1224 db
->dmasize
= db
->fragsize
* 2;
1225 db
->fragsamples
= db
->fragsize
>> sample_shift
; // # samples/fragment.
1227 // If the calculated size is larger than the allocated
1228 // buffer, divide the allocated buffer into 2 fragments.
1229 if (db
->dmasize
> bufs
) {
1231 db
->numfrag
= 2; // Two fragments.
1232 db
->fragsize
= bufs
>> 1; // Each 1/2 the alloc'ed buffer.
1233 db
->fragsamples
= db
->fragsize
>> sample_shift
; // # samples/fragment.
1234 db
->dmasize
= bufs
; // Use all the alloc'ed buffer.
1236 db
->fragshift
= 0; // Calculate 'fragshift'.
1237 temp1
= db
->fragsize
; // update_ptr() uses it
1238 while ((temp1
>>= 1) > 1) // to calc 'total-bytes'
1239 db
->fragshift
+= 1; // returned in DSP_GETI/OPTR.
1241 CS_DBGOUT(CS_FUNCTION
, 2,
1242 printk(KERN_INFO
"cs4281: prog_dmabuf()-\n"));
1243 CS_DBGOUT(CS_PARMS
, 8,
1245 "cs4281: prog_dmabuf(): numfrag=%d fragsize=%d fragsamples=%d fragshift=%d bufs=%d fmt=0x%x ch=%d\n",
1246 db
->numfrag
, db
->fragsize
, db
->fragsamples
,
1247 db
->fragshift
, bufs
,
1249 CS_TYPE_DAC
) ? s
->prop_dac
.fmt
: s
->prop_adc
.fmt
,
1251 CS_TYPE_DAC
) ? s
->prop_dac
.channels
: s
->
1252 prop_adc
.channels
));
1257 static int prog_dmabuf_adc(struct cs4281_state
*s
)
1263 s
->dma_adc
.type
= CS_TYPE_ADC
;
1264 if ((c
= prog_dmabuf(s
, &s
->dma_adc
)))
1267 if (s
->dma_adc
.rawbuf
) {
1268 memset(s
->dma_adc
.rawbuf
,
1270 fmt
& (AFMT_U8
| AFMT_U16_LE
)) ? 0x80 : 0,
1271 s
->dma_adc
.dmasize
);
1276 fmt
& (AFMT_U8
| AFMT_U16_LE
)) ? 0x80 : 0,
1277 PAGE_SIZE
<< s
->buforder_tmpbuff
);
1280 va
= virt_to_bus(s
->dma_adc
.rawbuf
);
1282 count
= s
->dma_adc
.dmasize
;
1285 fmt
& (AFMT_S16_LE
| AFMT_U16_LE
| AFMT_S16_BE
| AFMT_U16_BE
))
1286 count
/= 2; // 16-bit.
1288 if (s
->prop_adc
.channels
> 1)
1289 count
/= 2; // Assume stereo.
1291 CS_DBGOUT(CS_WAVE_READ
, 3, printk(KERN_INFO
1292 "cs4281: prog_dmabuf_adc(): count=%d va=0x%.8x\n",
1293 count
, (unsigned) va
));
1295 writel(va
, s
->pBA0
+ BA0_DBA1
); // Set buffer start address.
1296 writel(count
- 1, s
->pBA0
+ BA0_DBC1
); // Set count.
1297 s
->dma_adc
.ready
= 1;
1302 static int prog_dmabuf_dac(struct cs4281_state
*s
)
1308 s
->dma_dac
.type
= CS_TYPE_DAC
;
1309 if ((c
= prog_dmabuf(s
, &s
->dma_dac
)))
1311 memset(s
->dma_dac
.rawbuf
,
1312 (s
->prop_dac
.fmt
& (AFMT_U8
| AFMT_U16_LE
)) ? 0x80 : 0,
1313 s
->dma_dac
.dmasize
);
1315 va
= virt_to_bus(s
->dma_dac
.rawbuf
);
1317 count
= s
->dma_dac
.dmasize
;
1319 fmt
& (AFMT_S16_LE
| AFMT_U16_LE
| AFMT_S16_BE
| AFMT_U16_BE
))
1320 count
/= 2; // 16-bit.
1322 if (s
->prop_dac
.channels
> 1)
1323 count
/= 2; // Assume stereo.
1325 writel(va
, s
->pBA0
+ BA0_DBA0
); // Set buffer start address.
1326 writel(count
- 1, s
->pBA0
+ BA0_DBC0
); // Set count.
1328 CS_DBGOUT(CS_WAVE_WRITE
, 3, printk(KERN_INFO
1329 "cs4281: prog_dmabuf_dac(): count=%d va=0x%.8x\n",
1330 count
, (unsigned) va
));
1332 s
->dma_dac
.ready
= 1;
1337 static void clear_advance(void *buf
, unsigned bsize
, unsigned bptr
,
1338 unsigned len
, unsigned char c
)
1340 if (bptr
+ len
> bsize
) {
1341 unsigned x
= bsize
- bptr
;
1342 memset(((char *) buf
) + bptr
, c
, x
);
1346 CS_DBGOUT(CS_WAVE_WRITE
, 4, printk(KERN_INFO
1347 "cs4281: clear_advance(): memset %d at 0x%.8x for %d size \n",
1349 (unsigned) ((char *) buf
) +
1351 memset(((char *) buf
) + bptr
, c
, len
);
1356 // call with spinlock held!
1357 static void cs4281_update_ptr(struct cs4281_state
*s
)
1362 // update ADC pointer
1363 if (s
->ena
& FMODE_READ
) {
1364 hwptr
= readl(s
->pBA0
+ BA0_DCA1
); // Read capture DMA address.
1365 va
= virt_to_bus(s
->dma_adc
.rawbuf
);
1366 hwptr
-= (unsigned) va
;
1368 (s
->dma_adc
.dmasize
+ hwptr
-
1369 s
->dma_adc
.hwptr
) % s
->dma_adc
.dmasize
;
1370 s
->dma_adc
.hwptr
= hwptr
;
1371 s
->dma_adc
.total_bytes
+= diff
;
1372 s
->dma_adc
.count
+= diff
;
1373 if (s
->dma_adc
.count
> s
->dma_adc
.dmasize
)
1374 s
->dma_adc
.count
= s
->dma_adc
.dmasize
;
1375 if (s
->dma_adc
.mapped
) {
1376 if (s
->dma_adc
.count
>=
1377 (signed) s
->dma_adc
.fragsize
) wake_up(&s
->
1381 if (s
->dma_adc
.count
> 0)
1382 wake_up(&s
->dma_adc
.wait
);
1384 CS_DBGOUT(CS_PARMS
, 8, printk(KERN_INFO
1385 "cs4281: cs4281_update_ptr(): s=0x%.8x hwptr=%d total_bytes=%d count=%d \n",
1388 s
->dma_adc
.total_bytes
,
1391 // update DAC pointer
1393 // check for end of buffer, means that we are going to wait for another interrupt
1394 // to allow silence to fill the fifos on the part, to keep pops down to a minimum.
1396 if (s
->ena
& FMODE_WRITE
) {
1397 hwptr
= readl(s
->pBA0
+ BA0_DCA0
); // Read play DMA address.
1398 va
= virt_to_bus(s
->dma_dac
.rawbuf
);
1399 hwptr
-= (unsigned) va
;
1401 (s
->dma_dac
.dmasize
+ hwptr
-
1402 s
->dma_dac
.hwptr
) % s
->dma_dac
.dmasize
;
1403 s
->dma_dac
.hwptr
= hwptr
;
1404 s
->dma_dac
.total_bytes
+= diff
;
1405 if (s
->dma_dac
.mapped
) {
1406 s
->dma_dac
.count
+= diff
;
1407 if (s
->dma_dac
.count
>= s
->dma_dac
.fragsize
) {
1408 s
->dma_dac
.wakeup
= 1;
1409 wake_up(&s
->dma_dac
.wait
);
1410 if (s
->dma_dac
.count
> s
->dma_dac
.dmasize
)
1412 s
->dma_dac
.dmasize
- 1;
1416 s
->dma_dac
.count
-= diff
;
1417 if (s
->dma_dac
.count
<= 0) {
1419 // fill with silence, and do not shut down the DAC.
1420 // Continue to play silence until the _release.
1422 CS_DBGOUT(CS_WAVE_WRITE
, 6,
1424 "cs4281: cs4281_update_ptr(): memset %d at 0x%.8x for %d size \n",
1425 (unsigned) (s
->prop_dac
.
1430 (unsigned) s
->dma_dac
.
1432 s
->dma_dac
.dmasize
));
1433 memset(s
->dma_dac
.rawbuf
,
1435 fmt
& (AFMT_U8
| AFMT_U16_LE
)) ?
1436 0x80 : 0, s
->dma_dac
.dmasize
);
1437 } else if (s
->dma_dac
.count
<=
1438 (signed) s
->dma_dac
.fragsize
1439 && !s
->dma_dac
.endcleared
) {
1440 clear_advance(s
->dma_dac
.rawbuf
,
1443 s
->dma_dac
.fragsize
,
1446 AFMT_U16_LE
)) ? 0x80
1448 s
->dma_dac
.endcleared
= 1;
1450 if (s
->dma_dac
.count
< (signed) s
->dma_dac
.dmasize
)
1451 wake_up(&s
->dma_dac
.wait
);
1453 CS_DBGOUT(CS_PARMS
, 8, printk(KERN_INFO
1454 "cs4281: cs4281_update_ptr(): s=0x%.8x hwptr=%d total_bytes=%d count=%d \n",
1457 s
->dma_dac
.total_bytes
,
1463 // ---------------------------------------------------------------------
1465 static void prog_codec(struct cs4281_state
*s
, unsigned type
)
1467 unsigned long flags
;
1468 unsigned temp1
, format
;
1470 CS_DBGOUT(CS_FUNCTION
, 2,
1471 printk(KERN_INFO
"cs4281: prog_codec()+ \n"));
1473 spin_lock_irqsave(&s
->lock
, flags
);
1474 if (type
== CS_TYPE_ADC
) {
1475 temp1
= readl(s
->pBA0
+ BA0_DCR1
);
1476 writel(temp1
| DCRn_MSK
, s
->pBA0
+ BA0_DCR1
); // Stop capture DMA, if active.
1478 // program sampling rates
1479 // Note, for CS4281, capture & play rates can be set independently.
1480 cs4281_record_rate(s
, s
->prop_adc
.rate
);
1482 // program ADC parameters
1483 format
= DMRn_DMA
| DMRn_AUTO
| DMRn_TR_WRITE
;
1485 fmt
& (AFMT_S16_LE
| AFMT_U16_LE
| AFMT_S16_BE
| AFMT_U16_BE
)) { // 16-bit
1486 if (s
->prop_adc
.fmt
& (AFMT_S16_BE
| AFMT_U16_BE
)) // Big-endian?
1487 format
|= DMRn_BEND
;
1488 if (s
->prop_adc
.fmt
& (AFMT_U16_LE
| AFMT_U16_BE
))
1489 format
|= DMRn_USIGN
; // Unsigned.
1491 format
|= DMRn_SIZE8
| DMRn_USIGN
; // 8-bit, unsigned
1492 if (s
->prop_adc
.channels
< 2)
1493 format
|= DMRn_MONO
;
1495 writel(format
, s
->pBA0
+ BA0_DMR1
);
1497 CS_DBGOUT(CS_PARMS
, 2, printk(KERN_INFO
1498 "cs4281: prog_codec(): adc %s %s %s rate=%d DMR0 format=0x%.8x\n",
1499 (format
& DMRn_SIZE8
) ? "8" :
1501 (format
& DMRn_USIGN
) ?
1502 "Unsigned" : "Signed",
1503 (format
& DMRn_MONO
) ? "Mono"
1504 : "Stereo", s
->prop_adc
.rate
,
1507 s
->ena
&= ~FMODE_READ
; // not capturing data yet
1511 if (type
== CS_TYPE_DAC
) {
1512 temp1
= readl(s
->pBA0
+ BA0_DCR0
);
1513 writel(temp1
| DCRn_MSK
, s
->pBA0
+ BA0_DCR0
); // Stop play DMA, if active.
1515 // program sampling rates
1516 // Note, for CS4281, capture & play rates can be set independently.
1517 cs4281_play_rate(s
, s
->prop_dac
.rate
);
1519 // program DAC parameters
1520 format
= DMRn_DMA
| DMRn_AUTO
| DMRn_TR_READ
;
1522 fmt
& (AFMT_S16_LE
| AFMT_U16_LE
| AFMT_S16_BE
| AFMT_U16_BE
)) { // 16-bit
1523 if (s
->prop_dac
.fmt
& (AFMT_S16_BE
| AFMT_U16_BE
))
1524 format
|= DMRn_BEND
; // Big Endian.
1525 if (s
->prop_dac
.fmt
& (AFMT_U16_LE
| AFMT_U16_BE
))
1526 format
|= DMRn_USIGN
; // Unsigned.
1528 format
|= DMRn_SIZE8
| DMRn_USIGN
; // 8-bit, unsigned
1530 if (s
->prop_dac
.channels
< 2)
1531 format
|= DMRn_MONO
;
1533 writel(format
, s
->pBA0
+ BA0_DMR0
);
1536 CS_DBGOUT(CS_PARMS
, 2, printk(KERN_INFO
1537 "cs4281: prog_codec(): dac %s %s %s rate=%d DMR0 format=0x%.8x\n",
1538 (format
& DMRn_SIZE8
) ? "8" :
1540 (format
& DMRn_USIGN
) ?
1541 "Unsigned" : "Signed",
1542 (format
& DMRn_MONO
) ? "Mono"
1543 : "Stereo", s
->prop_dac
.rate
,
1546 s
->ena
&= ~FMODE_WRITE
; // not capturing data yet
1549 spin_unlock_irqrestore(&s
->lock
, flags
);
1550 CS_DBGOUT(CS_FUNCTION
, 2,
1551 printk(KERN_INFO
"cs4281: prog_codec()- \n"));
1555 // ---------------------------------------------------------------------
1557 static const char invalid_magic
[] =
1558 KERN_CRIT
"cs4281: invalid magic value\n";
1560 #define VALIDATE_STATE(s) \
1562 if (!(s) || (s)->magic != CS4281_MAGIC) { \
1563 printk(invalid_magic); \
1568 // ---------------------------------------------------------------------
1571 static int mixer_ioctl(struct cs4281_state
*s
, unsigned int cmd
,
1574 // Index to mixer_src[] is value of AC97 Input Mux Select Reg.
1575 // Value of array member is recording source Device ID Mask.
1576 static const unsigned int mixer_src
[8] = {
1577 SOUND_MASK_MIC
, SOUND_MASK_CD
, 0, SOUND_MASK_LINE1
,
1578 SOUND_MASK_LINE
, SOUND_MASK_VOLUME
, 0, 0
1581 // Index of mixtable1[] member is Device ID
1582 // and must be <= SOUND_MIXER_NRDEVICES.
1583 // Value of array member is index into s->mix.vol[]
1584 static const unsigned char mixtable1
[SOUND_MIXER_NRDEVICES
] = {
1585 [SOUND_MIXER_PCM
] = 1, // voice
1586 [SOUND_MIXER_LINE1
] = 2, // AUX
1587 [SOUND_MIXER_CD
] = 3, // CD
1588 [SOUND_MIXER_LINE
] = 4, // Line
1589 [SOUND_MIXER_SYNTH
] = 5, // FM
1590 [SOUND_MIXER_MIC
] = 6, // Mic
1591 [SOUND_MIXER_SPEAKER
] = 7, // Speaker
1592 [SOUND_MIXER_RECLEV
] = 8, // Recording level
1593 [SOUND_MIXER_VOLUME
] = 9 // Master Volume
1597 static const unsigned mixreg
[] = {
1598 BA0_AC97_PCM_OUT_VOLUME
,
1599 BA0_AC97_AUX_VOLUME
,
1601 BA0_AC97_LINE_IN_VOLUME
1603 unsigned char l
, r
, rl
, rr
, vidx
;
1604 unsigned char attentbl
[11] =
1605 { 63, 42, 26, 17, 14, 11, 8, 6, 4, 2, 0 };
1610 CS_DBGOUT(CS_FUNCTION
, 4,
1612 "cs4281: mixer_ioctl(): s=0x%.8x cmd=0x%.8x\n",
1613 (unsigned) s
, cmd
));
1617 #if CSDEBUG_INTERFACE
1619 if ((cmd
== SOUND_MIXER_CS_GETDBGMASK
) ||
1620 (cmd
== SOUND_MIXER_CS_SETDBGMASK
) ||
1621 (cmd
== SOUND_MIXER_CS_GETDBGLEVEL
) ||
1622 (cmd
== SOUND_MIXER_CS_SETDBGLEVEL
)) {
1625 case SOUND_MIXER_CS_GETDBGMASK
:
1626 return put_user(cs_debugmask
,
1627 (unsigned long *) arg
);
1629 case SOUND_MIXER_CS_GETDBGLEVEL
:
1630 return put_user(cs_debuglevel
,
1631 (unsigned long *) arg
);
1633 case SOUND_MIXER_CS_SETDBGMASK
:
1634 if (get_user(val
, (unsigned long *) arg
))
1639 case SOUND_MIXER_CS_SETDBGLEVEL
:
1640 if (get_user(val
, (unsigned long *) arg
))
1642 cs_debuglevel
= val
;
1645 CS_DBGOUT(CS_ERROR
, 1, printk(KERN_INFO
1646 "cs4281: mixer_ioctl(): ERROR unknown debug cmd\n"));
1652 if (cmd
== SOUND_MIXER_PRIVATE1
) {
1653 // enable/disable/query mixer preamp
1654 if (get_user(val
, (int *) arg
))
1657 cs4281_read_ac97(s
, BA0_AC97_MIC_VOLUME
, &temp1
);
1658 temp1
= val
? (temp1
| 0x40) : (temp1
& 0xffbf);
1659 cs4281_write_ac97(s
, BA0_AC97_MIC_VOLUME
, temp1
);
1661 cs4281_read_ac97(s
, BA0_AC97_MIC_VOLUME
, &temp1
);
1662 val
= (temp1
& 0x40) ? 1 : 0;
1663 return put_user(val
, (int *) arg
);
1665 if (cmd
== SOUND_MIXER_PRIVATE2
) {
1666 // enable/disable/query spatializer
1667 if (get_user(val
, (int *) arg
))
1670 temp1
= (val
& 0x3f) >> 2;
1671 cs4281_write_ac97(s
, BA0_AC97_3D_CONTROL
, temp1
);
1672 cs4281_read_ac97(s
, BA0_AC97_GENERAL_PURPOSE
,
1674 cs4281_write_ac97(s
, BA0_AC97_GENERAL_PURPOSE
,
1677 cs4281_read_ac97(s
, BA0_AC97_3D_CONTROL
, &temp1
);
1678 return put_user((temp1
<< 2) | 3, (int *) arg
);
1680 if (cmd
== SOUND_MIXER_INFO
) {
1682 strncpy(info
.id
, "CS4281", sizeof(info
.id
));
1683 strncpy(info
.name
, "Crystal CS4281", sizeof(info
.name
));
1684 info
.modify_counter
= s
->mix
.modcnt
;
1685 if (copy_to_user((void *) arg
, &info
, sizeof(info
)))
1689 if (cmd
== SOUND_OLD_MIXER_INFO
) {
1690 _old_mixer_info info
;
1691 strncpy(info
.id
, "CS4281", sizeof(info
.id
));
1692 strncpy(info
.name
, "Crystal CS4281", sizeof(info
.name
));
1693 if (copy_to_user((void *) arg
, &info
, sizeof(info
)))
1697 if (cmd
== OSS_GETVERSION
)
1698 return put_user(SOUND_VERSION
, (int *) arg
);
1700 if (_IOC_TYPE(cmd
) != 'M' || _SIOC_SIZE(cmd
) != sizeof(int))
1703 // If ioctl has only the SIOC_READ bit(bit 31)
1704 // on, process the only-read commands.
1705 if (_SIOC_DIR(cmd
) == _SIOC_READ
) {
1706 switch (_IOC_NR(cmd
)) {
1707 case SOUND_MIXER_RECSRC
: // Arg contains a bit for each recording source
1708 cs4281_read_ac97(s
, BA0_AC97_RECORD_SELECT
,
1710 return put_user(mixer_src
[temp1
& 7], (int *) arg
);
1712 case SOUND_MIXER_DEVMASK
: // Arg contains a bit for each supported device
1713 return put_user(SOUND_MASK_PCM
| SOUND_MASK_SYNTH
|
1714 SOUND_MASK_CD
| SOUND_MASK_LINE
|
1715 SOUND_MASK_LINE1
| SOUND_MASK_MIC
|
1718 SOUND_MASK_SPEAKER
, (int *) arg
);
1720 case SOUND_MIXER_RECMASK
: // Arg contains a bit for each supported recording source
1721 return put_user(SOUND_MASK_LINE
| SOUND_MASK_MIC
|
1722 SOUND_MASK_CD
| SOUND_MASK_VOLUME
|
1723 SOUND_MASK_LINE1
, (int *) arg
);
1725 case SOUND_MIXER_STEREODEVS
: // Mixer channels supporting stereo
1726 return put_user(SOUND_MASK_PCM
| SOUND_MASK_SYNTH
|
1727 SOUND_MASK_CD
| SOUND_MASK_LINE
|
1728 SOUND_MASK_LINE1
| SOUND_MASK_MIC
|
1730 SOUND_MASK_RECLEV
, (int *) arg
);
1732 case SOUND_MIXER_CAPS
:
1733 return put_user(SOUND_CAP_EXCL_INPUT
, (int *) arg
);
1737 if (i
>= SOUND_MIXER_NRDEVICES
1738 || !(vidx
= mixtable1
[i
]))
1740 return put_user(s
->mix
.vol
[vidx
- 1], (int *) arg
);
1743 // If ioctl doesn't have both the SIOC_READ and
1744 // the SIOC_WRITE bit set, return invalid.
1745 if (_SIOC_DIR(cmd
) != (_SIOC_READ
| _SIOC_WRITE
))
1748 // Increment the count of volume writes.
1751 // Isolate the command; it must be a write.
1752 switch (_IOC_NR(cmd
)) {
1754 case SOUND_MIXER_RECSRC
: // Arg contains a bit for each recording source
1755 if (get_user(val
, (int *) arg
))
1757 i
= hweight32(val
); // i = # bits on in val.
1758 if (i
!= 1) // One & only 1 bit must be on.
1760 for (i
= 0; i
< sizeof(mixer_src
) / sizeof(int); i
++) {
1761 if (val
== mixer_src
[i
]) {
1762 temp1
= (i
<< 8) | i
;
1763 cs4281_write_ac97(s
,
1764 BA0_AC97_RECORD_SELECT
,
1771 case SOUND_MIXER_VOLUME
:
1772 if (get_user(val
, (int *) arg
))
1776 l
= 100; // Max soundcard.h vol is 100.
1781 rl
= attentbl
[(10 * l
) / 100]; // Convert 0-100 vol to 63-0 atten.
1783 r
= (val
>> 8) & 0xff;
1785 r
= 100; // Max right volume is 100, too
1790 rr
= attentbl
[(10 * r
) / 100]; // Convert volume to attenuation.
1792 if ((rl
> 60) && (rr
> 60)) // If both l & r are 'low',
1793 temp1
= 0x8000; // turn on the mute bit.
1797 temp1
|= (rl
<< 8) | rr
;
1799 cs4281_write_ac97(s
, BA0_AC97_MASTER_VOLUME
, temp1
);
1800 cs4281_write_ac97(s
, BA0_AC97_HEADPHONE_VOLUME
, temp1
);
1802 #ifdef OSS_DOCUMENTED_MIXER_SEMANTICS
1803 s
->mix
.vol
[8] = ((unsigned int) r
<< 8) | l
;
1805 s
->mix
.vol
[8] = val
;
1807 return put_user(s
->mix
.vol
[8], (int *) arg
);
1809 case SOUND_MIXER_SPEAKER
:
1810 if (get_user(val
, (int *) arg
))
1819 rl
= (l
* 2 - 5) / 13; // Convert 0-100 range to 0-15.
1820 l
= (rl
* 13 + 5) / 2;
1828 rl
= 15 - rl
; // Convert volume to attenuation.
1830 cs4281_write_ac97(s
, BA0_AC97_PC_BEEP_VOLUME
, temp1
);
1832 #ifdef OSS_DOCUMENTED_MIXER_SEMANTICS
1833 s
->mix
.vol
[6] = l
<< 8;
1835 s
->mix
.vol
[6] = val
;
1837 return put_user(s
->mix
.vol
[6], (int *) arg
);
1839 case SOUND_MIXER_RECLEV
:
1840 if (get_user(val
, (int *) arg
))
1845 r
= (val
>> 8) & 0xff;
1848 rl
= (l
* 2 - 5) / 13; // Convert 0-100 scale to 0-15.
1849 rr
= (r
* 2 - 5) / 13;
1850 if (rl
< 3 && rr
< 3)
1855 temp1
= temp1
| (rl
<< 8) | rr
;
1856 cs4281_write_ac97(s
, BA0_AC97_RECORD_GAIN
, temp1
);
1858 #ifdef OSS_DOCUMENTED_MIXER_SEMANTICS
1859 s
->mix
.vol
[7] = ((unsigned int) r
<< 8) | l
;
1861 s
->mix
.vol
[7] = val
;
1863 return put_user(s
->mix
.vol
[7], (int *) arg
);
1865 case SOUND_MIXER_MIC
:
1866 if (get_user(val
, (int *) arg
))
1875 rl
= ((unsigned) l
* 5 - 4) / 16; // Convert 0-100 range to 0-31.
1876 l
= (rl
* 16 + 4) / 5;
1878 cs4281_read_ac97(s
, BA0_AC97_MIC_VOLUME
, &temp1
);
1879 temp1
&= 0x40; // Isolate 20db gain bit.
1884 rl
= 31 - rl
; // Convert volume to attenuation.
1886 cs4281_write_ac97(s
, BA0_AC97_MIC_VOLUME
, temp1
);
1888 #ifdef OSS_DOCUMENTED_MIXER_SEMANTICS
1889 s
->mix
.vol
[5] = val
<< 8;
1891 s
->mix
.vol
[5] = val
;
1893 return put_user(s
->mix
.vol
[5], (int *) arg
);
1896 case SOUND_MIXER_SYNTH
:
1897 if (get_user(val
, (int *) arg
))
1902 if (get_user(val
, (int *) arg
))
1904 r
= (val
>> 8) & 0xff;
1907 rl
= (l
* 2 - 11) / 3; // Convert 0-100 range to 0-63.
1908 rr
= (r
* 2 - 11) / 3;
1909 if (rl
< 3) // If l is low, turn on
1910 temp1
= 0x0080; // the mute bit.
1914 rl
= 63 - rl
; // Convert vol to attenuation.
1915 writel(temp1
| rl
, s
->pBA0
+ BA0_FMLVC
);
1916 if (rr
< 3) // If rr is low, turn on
1917 temp1
= 0x0080; // the mute bit.
1920 rr
= 63 - rr
; // Convert vol to attenuation.
1921 writel(temp1
| rr
, s
->pBA0
+ BA0_FMRVC
);
1923 #ifdef OSS_DOCUMENTED_MIXER_SEMANTICS
1924 s
->mix
.vol
[4] = (r
<< 8) | l
;
1926 s
->mix
.vol
[4] = val
;
1928 return put_user(s
->mix
.vol
[4], (int *) arg
);
1932 CS_DBGOUT(CS_IOCTL
, 4, printk(KERN_INFO
1933 "cs4281: mixer_ioctl(): default\n"));
1936 if (i
>= SOUND_MIXER_NRDEVICES
|| !(vidx
= mixtable1
[i
]))
1938 if (get_user(val
, (int *) arg
))
1947 rl
= (attentbl
[(l
* 10) / 100]) >> 1;
1949 r
= (val
>> 8) & 0xff;
1956 rr
= (attentbl
[(r
* 10) / 100]) >> 1;
1957 if ((rl
> 30) && (rr
> 30))
1961 temp1
= temp1
| (rl
<< 8) | rr
;
1962 cs4281_write_ac97(s
, mixreg
[vidx
- 1], temp1
);
1964 #ifdef OSS_DOCUMENTED_MIXER_SEMANTICS
1965 s
->mix
.vol
[vidx
- 1] = ((unsigned int) r
<< 8) | l
;
1967 s
->mix
.vol
[vidx
- 1] = val
;
1969 return put_user(s
->mix
.vol
[vidx
- 1], (int *) arg
);
1974 // ---------------------------------------------------------------------
1976 static loff_t
cs4281_llseek(struct file
*file
, loff_t offset
, int origin
)
1982 // ---------------------------------------------------------------------
1984 static int cs4281_open_mixdev(struct inode
*inode
, struct file
*file
)
1986 int minor
= MINOR(inode
->i_rdev
);
1987 struct cs4281_state
*s
= devs
;
1989 while (s
&& s
->dev_mixer
!= minor
)
1994 file
->private_data
= s
;
2000 static int cs4281_release_mixdev(struct inode
*inode
, struct file
*file
)
2002 struct cs4281_state
*s
=
2003 (struct cs4281_state
*) file
->private_data
;
2011 static int cs4281_ioctl_mixdev(struct inode
*inode
, struct file
*file
,
2012 unsigned int cmd
, unsigned long arg
)
2014 return mixer_ioctl((struct cs4281_state
*) file
->private_data
, cmd
,
2019 // ******************************************************************************************
2020 // Mixer file operations struct.
2021 // ******************************************************************************************
2022 static /*const */ struct file_operations cs4281_mixer_fops
= {
2023 llseek
:cs4281_llseek
,
2024 ioctl
:cs4281_ioctl_mixdev
,
2025 open
:cs4281_open_mixdev
,
2026 release
:cs4281_release_mixdev
,
2029 // ---------------------------------------------------------------------
2032 static int drain_adc(struct cs4281_state
*s
, int nonblock
)
2034 DECLARE_WAITQUEUE(wait
, current
);
2035 unsigned long flags
;
2039 if (s
->dma_adc
.mapped
)
2041 add_wait_queue(&s
->dma_adc
.wait
, &wait
);
2043 set_current_state(TASK_INTERRUPTIBLE
);
2044 spin_lock_irqsave(&s
->lock
, flags
);
2045 count
= s
->dma_adc
.count
;
2046 CS_DBGOUT(CS_FUNCTION
, 2,
2047 printk(KERN_INFO
"cs4281: drain_adc() %d\n",
2049 spin_unlock_irqrestore(&s
->lock
, flags
);
2051 CS_DBGOUT(CS_FUNCTION
, 2,
2053 "cs4281: drain_adc() count<0\n"));
2056 if (signal_pending(current
))
2059 remove_wait_queue(&s
->dma_adc
.wait
, &wait
);
2060 current
->state
= TASK_RUNNING
;
2065 s
->dma_adc
.fragsize
) / 2 / s
->prop_adc
.rate
;
2066 if (s
->prop_adc
.fmt
& (AFMT_S16_LE
| AFMT_U16_LE
))
2068 if (s
->prop_adc
.channels
> 1)
2070 if (!schedule_timeout(tmo
+ 1))
2071 printk(KERN_DEBUG
"cs4281: dma timed out??\n");
2073 remove_wait_queue(&s
->dma_adc
.wait
, &wait
);
2074 current
->state
= TASK_RUNNING
;
2075 if (signal_pending(current
))
2076 return -ERESTARTSYS
;
2080 static int drain_dac(struct cs4281_state
*s
, int nonblock
)
2082 DECLARE_WAITQUEUE(wait
, current
);
2083 unsigned long flags
;
2087 if (s
->dma_dac
.mapped
)
2089 add_wait_queue(&s
->dma_dac
.wait
, &wait
);
2091 set_current_state(TASK_INTERRUPTIBLE
);
2092 spin_lock_irqsave(&s
->lock
, flags
);
2093 count
= s
->dma_dac
.count
;
2094 spin_unlock_irqrestore(&s
->lock
, flags
);
2097 if (signal_pending(current
))
2100 remove_wait_queue(&s
->dma_dac
.wait
, &wait
);
2101 current
->state
= TASK_RUNNING
;
2106 s
->dma_dac
.fragsize
) / 2 / s
->prop_dac
.rate
;
2107 if (s
->prop_dac
.fmt
& (AFMT_S16_LE
| AFMT_U16_LE
))
2109 if (s
->prop_dac
.channels
> 1)
2111 if (!schedule_timeout(tmo
+ 1))
2112 printk(KERN_DEBUG
"cs4281: dma timed out??\n");
2114 remove_wait_queue(&s
->dma_dac
.wait
, &wait
);
2115 current
->state
= TASK_RUNNING
;
2116 if (signal_pending(current
))
2117 return -ERESTARTSYS
;
2121 //****************************************************************************
2123 // CopySamples copies 16-bit stereo samples from the source to the
2124 // destination, possibly converting down to either 8-bit or mono or both.
2125 // count specifies the number of output bytes to write.
2129 // dst - Pointer to a destination buffer.
2130 // src - Pointer to a source buffer
2131 // count - The number of bytes to copy into the destination buffer.
2132 // iChannels - Stereo - 2
2134 // fmt - AFMT_xxx (soundcard.h formats)
2136 // NOTES: only call this routine for conversion to 8bit from 16bit
2138 //****************************************************************************
2139 static void CopySamples(char *dst
, char *src
, int count
, int iChannels
,
2143 unsigned short *psSrc
;
2146 CS_DBGOUT(CS_FUNCTION
, 2,
2147 printk(KERN_INFO
"cs4281: CopySamples()+ "));
2148 CS_DBGOUT(CS_WAVE_READ
, 8,
2150 " dst=0x%x src=0x%x count=%d iChannels=%d fmt=0x%x\n",
2151 (unsigned) dst
, (unsigned) src
, (unsigned) count
,
2152 (unsigned) iChannels
, (unsigned) fmt
));
2154 // Gershwin does format conversion in hardware so normally
2155 // we don't do any host based coversion. The data formatter
2156 // truncates 16 bit data to 8 bit and that causes some hiss.
2157 // We have already forced the HW to do 16 bit sampling and
2158 // 2 channel so that we can use software to round instead
2162 // See if the data should be output as 8-bit unsigned stereo.
2164 if ((iChannels
== 2) && (fmt
& AFMT_U8
)) {
2166 // Convert each 16-bit unsigned stereo sample to 8-bit unsigned
2167 // stereo using rounding.
2169 psSrc
= (unsigned short *) src
;
2172 lAudioSample
= (long) psSrc
[count
] + (long) 0x80;
2173 if (lAudioSample
> 0xffff) {
2174 lAudioSample
= 0xffff;
2176 dst
[count
] = (char) (lAudioSample
>> 8);
2180 // check for 8-bit signed stereo.
2182 else if ((iChannels
== 2) && (fmt
& AFMT_S8
)) {
2184 // Convert each 16-bit stereo sample to 8-bit stereo using rounding.
2186 psSrc
= (short *) src
;
2189 (((long) psSrc
[0] + (long) psSrc
[1]) / 2);
2191 *dst
++ = (char) ((short) lAudioSample
>> 8);
2195 // See if the data should be output at 8-bit unsigned mono.
2197 else if ((iChannels
== 1) && (fmt
& AFMT_U8
)) {
2199 // Convert each 16-bit unsigned mono sample to 8-bit unsigned
2200 // mono using rounding.
2203 psSrc
= (short *) src
;
2205 lAudioSample
= (long) *psSrc
++ + (long) 0x80;
2206 if (lAudioSample
> 0x7fff) {
2207 lAudioSample
= 0x7fff;
2210 // Convert Signed to Unsigned.
2215 char) (((short) lAudioSample
+
2216 (short) 0x8000) >> 8);
2220 // Otherwise, the data should be output as 8-bit signed mono.
2222 else if ((iChannels
== 1) && (fmt
& AFMT_S8
)) {
2224 // Convert each 16-bit signed mono sample to 8-bit signed mono
2227 psSrc
= (short *) src
;
2230 (((long) psSrc
[0] + (long) psSrc
[1]) / 2);
2231 if (lAudioSample
> 0x7fff) {
2232 lAudioSample
= 0x7fff;
2235 *dst
++ = (char) ((short) lAudioSample
>> 8);
2241 // cs_copy_to_user()
2242 // replacement for the standard copy_to_user, to allow for a conversion from
2243 // 16 bit to 8 bit if the record conversion is active. the cs4281 has some
2244 // issues with 8 bit capture, so the driver always captures data in 16 bit
2245 // and then if the user requested 8 bit, converts from 16 to 8 bit.
2247 static unsigned cs_copy_to_user(struct cs4281_state
*s
, void *dest
,
2248 unsigned *hwsrc
, unsigned cnt
,
2251 void *src
= hwsrc
; //default to the standard destination buffer addr
2253 CS_DBGOUT(CS_FUNCTION
, 6, printk(KERN_INFO
2254 "cs_copy_to_user()+ fmt=0x%x fmt_o=0x%x cnt=%d dest=0x%.8x\n",
2256 s
->prop_adc
.fmt_original
,
2257 (unsigned) cnt
, (unsigned) dest
));
2259 if (cnt
> s
->dma_adc
.dmasize
) {
2260 cnt
= s
->dma_adc
.dmasize
;
2266 if (s
->conversion
) {
2271 CopySamples(s
->tmpbuff
, (void *) hwsrc
, cnt
,
2272 (unsigned) s
->prop_adc
.channels
,
2273 s
->prop_adc
.fmt_original
);
2278 if (copy_to_user(dest
, src
, cnt
)) {
2283 CS_DBGOUT(CS_FUNCTION
, 2, printk(KERN_INFO
2284 "cs4281: cs_copy_to_user()- copied bytes is %d \n",
2289 // ---------------------------------------------------------------------
2291 static ssize_t
cs4281_read(struct file
*file
, char *buffer
, size_t count
,
2294 struct cs4281_state
*s
=
2295 (struct cs4281_state
*) file
->private_data
;
2297 unsigned long flags
;
2300 unsigned copied
= 0;
2302 CS_DBGOUT(CS_FUNCTION
| CS_WAVE_READ
, 2,
2303 printk(KERN_INFO
"cs4281: cs4281_read()+ %d \n", count
));
2306 if (ppos
!= &file
->f_pos
)
2308 if (s
->dma_adc
.mapped
)
2310 if (!s
->dma_adc
.ready
&& (ret
= prog_dmabuf_adc(s
)))
2312 if (!access_ok(VERIFY_WRITE
, buffer
, count
))
2316 // "count" is the amount of bytes to read (from app), is decremented each loop
2317 // by the amount of bytes that have been returned to the user buffer.
2318 // "cnt" is the running total of each read from the buffer (changes each loop)
2319 // "buffer" points to the app's buffer
2320 // "ret" keeps a running total of the amount of bytes that have been copied
2321 // to the user buffer.
2322 // "copied" is the total bytes copied into the user buffer for each loop.
2325 CS_DBGOUT(CS_WAVE_READ
, 8, printk(KERN_INFO
2326 "_read() count>0 count=%d .count=%d .swptr=%d .hwptr=%d \n",
2327 count
, s
->dma_adc
.count
,
2330 spin_lock_irqsave(&s
->lock
, flags
);
2332 // get the current copy point of the sw buffer
2333 swptr
= s
->dma_adc
.swptr
;
2335 // cnt is the amount of unread bytes from the end of the
2336 // hw buffer to the current sw pointer
2337 cnt
= s
->dma_adc
.dmasize
- swptr
;
2339 // dma_adc.count is the current total bytes that have not been read.
2340 // if the amount of unread bytes from the current sw pointer to the
2341 // end of the buffer is greater than the current total bytes that
2342 // have not been read, then set the "cnt" (unread bytes) to the
2343 // amount of unread bytes.
2345 if (s
->dma_adc
.count
< cnt
)
2346 cnt
= s
->dma_adc
.count
;
2347 spin_unlock_irqrestore(&s
->lock
, flags
);
2349 // if we are converting from 8/16 then we need to copy
2350 // twice the number of 16 bit bytes then 8 bit bytes.
2352 if (s
->conversion
) {
2353 if (cnt
> (count
* 2))
2360 // "cnt" NOW is the smaller of the amount that will be read,
2361 // and the amount that is requested in this read (or partial).
2362 // if there are no bytes in the buffer to read, then start the
2363 // ADC and wait for the interrupt handler to wake us up.
2367 // start up the dma engine and then continue back to the top of
2368 // the loop when wake up occurs.
2370 if (file
->f_flags
& O_NONBLOCK
)
2371 return ret
? ret
: -EAGAIN
;
2372 interruptible_sleep_on(&s
->dma_adc
.wait
);
2373 if (signal_pending(current
))
2374 return ret
? ret
: -ERESTARTSYS
;
2377 // there are bytes in the buffer to read.
2378 // copy from the hw buffer over to the user buffer.
2379 // user buffer is designated by "buffer"
2380 // virtual address to copy from is rawbuf+swptr
2381 // the "cnt" is the number of bytes to read.
2383 CS_DBGOUT(CS_WAVE_READ
, 2, printk(KERN_INFO
2384 "_read() copy_to cnt=%d count=%d ",
2386 CS_DBGOUT(CS_WAVE_READ
, 8,
2388 " .dmasize=%d .count=%d buffer=0x%.8x ret=%d\n",
2389 s
->dma_adc
.dmasize
, s
->dma_adc
.count
,
2390 (unsigned) buffer
, ret
));
2393 (s
, buffer
, s
->dma_adc
.rawbuf
+ swptr
, cnt
, &copied
))
2394 return ret
? ret
: -EFAULT
;
2395 swptr
= (swptr
+ cnt
) % s
->dma_adc
.dmasize
;
2396 spin_lock_irqsave(&s
->lock
, flags
);
2397 s
->dma_adc
.swptr
= swptr
;
2398 s
->dma_adc
.count
-= cnt
;
2399 spin_unlock_irqrestore(&s
->lock
, flags
);
2405 CS_DBGOUT(CS_FUNCTION
| CS_WAVE_READ
, 2,
2406 printk(KERN_INFO
"cs4281: cs4281_read()- %d\n", ret
));
2411 static ssize_t
cs4281_write(struct file
*file
, const char *buffer
,
2412 size_t count
, loff_t
* ppos
)
2414 struct cs4281_state
*s
=
2415 (struct cs4281_state
*) file
->private_data
;
2417 unsigned long flags
;
2421 CS_DBGOUT(CS_FUNCTION
| CS_WAVE_WRITE
, 2,
2422 printk(KERN_INFO
"cs4281: cs4281_write()+ count=%d\n",
2426 if (ppos
!= &file
->f_pos
)
2428 if (s
->dma_dac
.mapped
)
2430 if (!s
->dma_dac
.ready
&& (ret
= prog_dmabuf_dac(s
)))
2432 if (!access_ok(VERIFY_READ
, buffer
, count
))
2436 spin_lock_irqsave(&s
->lock
, flags
);
2437 if (s
->dma_dac
.count
< 0) {
2438 s
->dma_dac
.count
= 0;
2439 s
->dma_dac
.swptr
= s
->dma_dac
.hwptr
;
2441 swptr
= s
->dma_dac
.swptr
;
2442 cnt
= s
->dma_dac
.dmasize
- swptr
;
2443 if (s
->dma_dac
.count
+ cnt
> s
->dma_dac
.dmasize
)
2444 cnt
= s
->dma_dac
.dmasize
- s
->dma_dac
.count
;
2445 spin_unlock_irqrestore(&s
->lock
, flags
);
2451 if (file
->f_flags
& O_NONBLOCK
)
2452 return ret
? ret
: -EAGAIN
;
2453 interruptible_sleep_on(&s
->dma_dac
.wait
);
2454 if (signal_pending(current
))
2455 return ret
? ret
: -ERESTARTSYS
;
2458 if (copy_from_user(s
->dma_dac
.rawbuf
+ swptr
, buffer
, cnt
))
2459 return ret
? ret
: -EFAULT
;
2460 swptr
= (swptr
+ cnt
) % s
->dma_dac
.dmasize
;
2461 spin_lock_irqsave(&s
->lock
, flags
);
2462 s
->dma_dac
.swptr
= swptr
;
2463 s
->dma_dac
.count
+= cnt
;
2464 s
->dma_dac
.endcleared
= 0;
2465 spin_unlock_irqrestore(&s
->lock
, flags
);
2471 CS_DBGOUT(CS_FUNCTION
| CS_WAVE_WRITE
, 2,
2472 printk(KERN_INFO
"cs4281: cs4281_write()- %d\n", ret
));
2477 static unsigned int cs4281_poll(struct file
*file
,
2478 struct poll_table_struct
*wait
)
2480 struct cs4281_state
*s
=
2481 (struct cs4281_state
*) file
->private_data
;
2482 unsigned long flags
;
2483 unsigned int mask
= 0;
2485 CS_DBGOUT(CS_FUNCTION
| CS_WAVE_WRITE
| CS_WAVE_READ
, 4,
2486 printk(KERN_INFO
"cs4281: cs4281_poll()+\n"));
2488 if (file
->f_mode
& FMODE_WRITE
) {
2489 CS_DBGOUT(CS_FUNCTION
| CS_WAVE_WRITE
| CS_WAVE_READ
, 4,
2491 "cs4281: cs4281_poll() wait on FMODE_WRITE\n"));
2492 poll_wait(file
, &s
->dma_dac
.wait
, wait
);
2494 if (file
->f_mode
& FMODE_READ
) {
2495 CS_DBGOUT(CS_FUNCTION
| CS_WAVE_WRITE
| CS_WAVE_READ
, 4,
2497 "cs4281: cs4281_poll() wait on FMODE_READ\n"));
2498 poll_wait(file
, &s
->dma_adc
.wait
, wait
);
2500 spin_lock_irqsave(&s
->lock
, flags
);
2501 cs4281_update_ptr(s
);
2502 if (file
->f_mode
& FMODE_WRITE
) {
2503 if (s
->dma_dac
.mapped
) {
2504 if (s
->dma_dac
.count
>=
2505 (signed) s
->dma_dac
.fragsize
) {
2506 if (s
->dma_dac
.wakeup
)
2507 mask
|= POLLOUT
| POLLWRNORM
;
2510 s
->dma_dac
.wakeup
= 0;
2513 if ((signed) s
->dma_dac
.dmasize
> s
->dma_dac
.count
)
2514 mask
|= POLLOUT
| POLLWRNORM
;
2516 } else if (file
->f_mode
& FMODE_READ
) {
2517 if (s
->dma_adc
.mapped
) {
2518 if (s
->dma_adc
.count
>=
2519 (signed) s
->dma_adc
.fragsize
) mask
|=
2520 POLLIN
| POLLRDNORM
;
2522 if (s
->dma_adc
.count
> 0)
2523 mask
|= POLLIN
| POLLRDNORM
;
2526 spin_unlock_irqrestore(&s
->lock
, flags
);
2527 CS_DBGOUT(CS_FUNCTION
| CS_WAVE_WRITE
| CS_WAVE_READ
, 4,
2528 printk(KERN_INFO
"cs4281: cs4281_poll()- 0x%.8x\n",
2534 static int cs4281_mmap(struct file
*file
, struct vm_area_struct
*vma
)
2536 struct cs4281_state
*s
=
2537 (struct cs4281_state
*) file
->private_data
;
2542 CS_DBGOUT(CS_FUNCTION
| CS_PARMS
| CS_OPEN
, 4,
2543 printk(KERN_INFO
"cs4281: cs4281_mmap()+\n"));
2546 if (vma
->vm_flags
& VM_WRITE
) {
2547 if ((ret
= prog_dmabuf_dac(s
)) != 0)
2550 } else if (vma
->vm_flags
& VM_READ
) {
2551 if ((ret
= prog_dmabuf_adc(s
)) != 0)
2557 // only support PLAYBACK for now
2561 if (vma
->vm_pgoff
!= 0)
2563 size
= vma
->vm_end
- vma
->vm_start
;
2564 if (size
> (PAGE_SIZE
<< db
->buforder
))
2566 if (remap_page_range
2567 (vma
->vm_start
, virt_to_phys(db
->rawbuf
), size
,
2568 vma
->vm_page_prot
)) return -EAGAIN
;
2571 CS_DBGOUT(CS_FUNCTION
| CS_PARMS
| CS_OPEN
, 4,
2572 printk(KERN_INFO
"cs4281: cs4281_mmap()- 0 size=%d\n",
2579 static int cs4281_ioctl(struct inode
*inode
, struct file
*file
,
2580 unsigned int cmd
, unsigned long arg
)
2582 struct cs4281_state
*s
=
2583 (struct cs4281_state
*) file
->private_data
;
2584 unsigned long flags
;
2585 audio_buf_info abinfo
;
2587 int val
, mapped
, ret
;
2589 CS_DBGOUT(CS_FUNCTION
, 4,
2591 "cs4281: cs4281_ioctl(): file=0x%.8x cmd=0x%.8x\n",
2592 (unsigned) file
, cmd
));
2597 mapped
= ((file
->f_mode
& FMODE_WRITE
) && s
->dma_dac
.mapped
) ||
2598 ((file
->f_mode
& FMODE_READ
) && s
->dma_adc
.mapped
);
2600 case OSS_GETVERSION
:
2601 CS_DBGOUT(CS_IOCTL
| CS_PARMS
, 4, printk(KERN_INFO
2602 "cs4281: cs4281_ioctl(): SOUND_VERSION=0x%.8x\n",
2604 return put_user(SOUND_VERSION
, (int *) arg
);
2606 case SNDCTL_DSP_SYNC
:
2607 CS_DBGOUT(CS_IOCTL
, 4,
2609 "cs4281: cs4281_ioctl(): DSP_SYNC\n"));
2610 if (file
->f_mode
& FMODE_WRITE
)
2612 0 /*file->f_flags & O_NONBLOCK */
2616 case SNDCTL_DSP_SETDUPLEX
:
2619 case SNDCTL_DSP_GETCAPS
:
2620 return put_user(DSP_CAP_DUPLEX
| DSP_CAP_REALTIME
|
2621 DSP_CAP_TRIGGER
| DSP_CAP_MMAP
,
2624 case SNDCTL_DSP_RESET
:
2625 CS_DBGOUT(CS_IOCTL
, 4,
2627 "cs4281: cs4281_ioctl(): DSP_RESET\n"));
2628 if (file
->f_mode
& FMODE_WRITE
) {
2631 s
->dma_dac
.swptr
= s
->dma_dac
.hwptr
=
2632 s
->dma_dac
.count
= s
->dma_dac
.total_bytes
=
2633 s
->dma_dac
.blocks
= s
->dma_dac
.wakeup
= 0;
2634 prog_codec(s
, CS_TYPE_DAC
);
2636 if (file
->f_mode
& FMODE_READ
) {
2639 s
->dma_adc
.swptr
= s
->dma_adc
.hwptr
=
2640 s
->dma_adc
.count
= s
->dma_adc
.total_bytes
=
2641 s
->dma_adc
.blocks
= s
->dma_dac
.wakeup
= 0;
2642 prog_codec(s
, CS_TYPE_ADC
);
2646 case SNDCTL_DSP_SPEED
:
2647 if (get_user(val
, (int *) arg
))
2649 CS_DBGOUT(CS_IOCTL
| CS_PARMS
, 4,
2651 "cs4281: cs4281_ioctl(): DSP_SPEED val=%d\n",
2654 // support independent capture and playback channels
2655 // assume that the file mode bit determines the
2656 // direction of the data flow.
2658 if (file
->f_mode
& FMODE_READ
) {
2661 s
->dma_adc
.ready
= 0;
2662 // program sampling rates
2667 s
->prop_adc
.rate
= val
;
2668 prog_codec(s
, CS_TYPE_ADC
);
2671 if (file
->f_mode
& FMODE_WRITE
) {
2674 s
->dma_dac
.ready
= 0;
2675 // program sampling rates
2680 s
->prop_dac
.rate
= val
;
2681 prog_codec(s
, CS_TYPE_DAC
);
2685 if (file
->f_mode
& FMODE_WRITE
)
2686 val
= s
->prop_dac
.rate
;
2687 else if (file
->f_mode
& FMODE_READ
)
2688 val
= s
->prop_adc
.rate
;
2690 return put_user(val
, (int *) arg
);
2692 case SNDCTL_DSP_STEREO
:
2693 if (get_user(val
, (int *) arg
))
2695 CS_DBGOUT(CS_IOCTL
| CS_PARMS
, 4,
2697 "cs4281: cs4281_ioctl(): DSP_STEREO val=%d\n",
2699 if (file
->f_mode
& FMODE_READ
) {
2701 s
->dma_adc
.ready
= 0;
2702 s
->prop_adc
.channels
= val
? 2 : 1;
2703 prog_codec(s
, CS_TYPE_ADC
);
2705 if (file
->f_mode
& FMODE_WRITE
) {
2707 s
->dma_dac
.ready
= 0;
2708 s
->prop_dac
.channels
= val
? 2 : 1;
2709 prog_codec(s
, CS_TYPE_DAC
);
2713 case SNDCTL_DSP_CHANNELS
:
2714 if (get_user(val
, (int *) arg
))
2716 CS_DBGOUT(CS_IOCTL
| CS_PARMS
, 4,
2718 "cs4281: cs4281_ioctl(): DSP_CHANNELS val=%d\n",
2721 if (file
->f_mode
& FMODE_READ
) {
2723 s
->dma_adc
.ready
= 0;
2725 s
->prop_adc
.channels
= 2;
2727 s
->prop_adc
.channels
= 1;
2728 prog_codec(s
, CS_TYPE_ADC
);
2730 if (file
->f_mode
& FMODE_WRITE
) {
2732 s
->dma_dac
.ready
= 0;
2734 s
->prop_dac
.channels
= 2;
2736 s
->prop_dac
.channels
= 1;
2737 prog_codec(s
, CS_TYPE_DAC
);
2741 if (file
->f_mode
& FMODE_WRITE
)
2742 val
= s
->prop_dac
.channels
;
2743 else if (file
->f_mode
& FMODE_READ
)
2744 val
= s
->prop_adc
.channels
;
2746 return put_user(val
, (int *) arg
);
2748 case SNDCTL_DSP_GETFMTS
: // Returns a mask
2749 CS_DBGOUT(CS_IOCTL
| CS_PARMS
, 4,
2751 "cs4281: cs4281_ioctl(): DSP_GETFMT val=0x%.8x\n",
2752 AFMT_S16_LE
| AFMT_U16_LE
| AFMT_S8
|
2754 return put_user(AFMT_S16_LE
| AFMT_U16_LE
| AFMT_S8
|
2755 AFMT_U8
, (int *) arg
);
2757 case SNDCTL_DSP_SETFMT
:
2758 if (get_user(val
, (int *) arg
))
2760 CS_DBGOUT(CS_IOCTL
| CS_PARMS
, 4,
2762 "cs4281: cs4281_ioctl(): DSP_SETFMT val=0x%.8x\n",
2764 if (val
!= AFMT_QUERY
) {
2765 if (file
->f_mode
& FMODE_READ
) {
2767 s
->dma_adc
.ready
= 0;
2768 if (val
!= AFMT_S16_LE
2769 && val
!= AFMT_U16_LE
&& val
!= AFMT_S8
2772 s
->prop_adc
.fmt
= val
;
2773 s
->prop_adc
.fmt_original
= s
->prop_adc
.fmt
;
2774 prog_codec(s
, CS_TYPE_ADC
);
2776 if (file
->f_mode
& FMODE_WRITE
) {
2778 s
->dma_dac
.ready
= 0;
2779 if (val
!= AFMT_S16_LE
2780 && val
!= AFMT_U16_LE
&& val
!= AFMT_S8
2783 s
->prop_dac
.fmt
= val
;
2784 s
->prop_dac
.fmt_original
= s
->prop_dac
.fmt
;
2785 prog_codec(s
, CS_TYPE_DAC
);
2788 if (file
->f_mode
& FMODE_WRITE
)
2789 val
= s
->prop_dac
.fmt_original
;
2790 else if (file
->f_mode
& FMODE_READ
)
2791 val
= s
->prop_adc
.fmt_original
;
2793 CS_DBGOUT(CS_IOCTL
| CS_PARMS
, 4,
2795 "cs4281: cs4281_ioctl(): DSP_SETFMT return val=0x%.8x\n",
2797 return put_user(val
, (int *) arg
);
2799 case SNDCTL_DSP_POST
:
2800 CS_DBGOUT(CS_IOCTL
, 4,
2802 "cs4281: cs4281_ioctl(): DSP_POST\n"));
2805 case SNDCTL_DSP_GETTRIGGER
:
2807 if (file
->f_mode
& s
->ena
& FMODE_READ
)
2808 val
|= PCM_ENABLE_INPUT
;
2809 if (file
->f_mode
& s
->ena
& FMODE_WRITE
)
2810 val
|= PCM_ENABLE_OUTPUT
;
2811 return put_user(val
, (int *) arg
);
2813 case SNDCTL_DSP_SETTRIGGER
:
2814 if (get_user(val
, (int *) arg
))
2816 if (file
->f_mode
& FMODE_READ
) {
2817 if (val
& PCM_ENABLE_INPUT
) {
2818 if (!s
->dma_adc
.ready
2819 && (ret
= prog_dmabuf_adc(s
)))
2825 if (file
->f_mode
& FMODE_WRITE
) {
2826 if (val
& PCM_ENABLE_OUTPUT
) {
2827 if (!s
->dma_dac
.ready
2828 && (ret
= prog_dmabuf_dac(s
)))
2836 case SNDCTL_DSP_GETOSPACE
:
2837 if (!(file
->f_mode
& FMODE_WRITE
))
2839 if (!(s
->ena
& FMODE_WRITE
)
2840 && (val
= prog_dmabuf_dac(s
)) != 0)
2842 spin_lock_irqsave(&s
->lock
, flags
);
2843 cs4281_update_ptr(s
);
2844 abinfo
.fragsize
= s
->dma_dac
.fragsize
;
2845 if (s
->dma_dac
.mapped
)
2846 abinfo
.bytes
= s
->dma_dac
.dmasize
;
2849 s
->dma_dac
.dmasize
- s
->dma_dac
.count
;
2850 abinfo
.fragstotal
= s
->dma_dac
.numfrag
;
2851 abinfo
.fragments
= abinfo
.bytes
>> s
->dma_dac
.fragshift
;
2852 CS_DBGOUT(CS_FUNCTION
| CS_PARMS
, 4, printk(KERN_INFO
2853 "cs4281: cs4281_ioctl(): GETOSPACE .fragsize=%d .bytes=%d .fragstotal=%d .fragments=%d\n",
2861 spin_unlock_irqrestore(&s
->lock
, flags
);
2862 return copy_to_user((void *) arg
, &abinfo
,
2863 sizeof(abinfo
)) ? -EFAULT
: 0;
2865 case SNDCTL_DSP_GETISPACE
:
2866 if (!(file
->f_mode
& FMODE_READ
))
2868 if (!(s
->ena
& FMODE_READ
)
2869 && (val
= prog_dmabuf_adc(s
)) != 0) return val
;
2870 spin_lock_irqsave(&s
->lock
, flags
);
2871 cs4281_update_ptr(s
);
2872 if (s
->conversion
) {
2873 abinfo
.fragsize
= s
->dma_adc
.fragsize
/ 2;
2874 abinfo
.bytes
= s
->dma_adc
.count
/ 2;
2875 abinfo
.fragstotal
= s
->dma_adc
.numfrag
;
2877 abinfo
.bytes
>> (s
->dma_adc
.fragshift
- 1);
2879 abinfo
.fragsize
= s
->dma_adc
.fragsize
;
2880 abinfo
.bytes
= s
->dma_adc
.count
;
2881 abinfo
.fragstotal
= s
->dma_adc
.numfrag
;
2883 abinfo
.bytes
>> s
->dma_adc
.fragshift
;
2885 spin_unlock_irqrestore(&s
->lock
, flags
);
2886 return copy_to_user((void *) arg
, &abinfo
,
2887 sizeof(abinfo
)) ? -EFAULT
: 0;
2889 case SNDCTL_DSP_NONBLOCK
:
2890 file
->f_flags
|= O_NONBLOCK
;
2893 case SNDCTL_DSP_GETODELAY
:
2894 if (!(file
->f_mode
& FMODE_WRITE
))
2896 spin_lock_irqsave(&s
->lock
, flags
);
2897 cs4281_update_ptr(s
);
2898 val
= s
->dma_dac
.count
;
2899 spin_unlock_irqrestore(&s
->lock
, flags
);
2900 return put_user(val
, (int *) arg
);
2902 case SNDCTL_DSP_GETIPTR
:
2903 if (!(file
->f_mode
& FMODE_READ
))
2905 spin_lock_irqsave(&s
->lock
, flags
);
2906 cs4281_update_ptr(s
);
2907 cinfo
.bytes
= s
->dma_adc
.total_bytes
;
2908 if (s
->dma_adc
.mapped
) {
2910 (cinfo
.bytes
>> s
->dma_adc
.fragshift
) -
2913 cinfo
.bytes
>> s
->dma_adc
.fragshift
;
2915 if (s
->conversion
) {
2918 2 >> (s
->dma_adc
.fragshift
- 1);
2921 s
->dma_adc
.count
>> s
->dma_adc
.
2925 cinfo
.ptr
= s
->dma_adc
.hwptr
/ 2;
2927 cinfo
.ptr
= s
->dma_adc
.hwptr
;
2928 if (s
->dma_adc
.mapped
)
2929 s
->dma_adc
.count
&= s
->dma_adc
.fragsize
- 1;
2930 spin_unlock_irqrestore(&s
->lock
, flags
);
2931 return copy_to_user((void *) arg
, &cinfo
, sizeof(cinfo
));
2933 case SNDCTL_DSP_GETOPTR
:
2934 if (!(file
->f_mode
& FMODE_WRITE
))
2936 spin_lock_irqsave(&s
->lock
, flags
);
2937 cs4281_update_ptr(s
);
2938 cinfo
.bytes
= s
->dma_dac
.total_bytes
;
2939 if (s
->dma_dac
.mapped
) {
2941 (cinfo
.bytes
>> s
->dma_dac
.fragshift
) -
2944 cinfo
.bytes
>> s
->dma_dac
.fragshift
;
2947 s
->dma_dac
.count
>> s
->dma_dac
.fragshift
;
2949 cinfo
.ptr
= s
->dma_dac
.hwptr
;
2950 if (s
->dma_dac
.mapped
)
2951 s
->dma_dac
.count
&= s
->dma_dac
.fragsize
- 1;
2952 spin_unlock_irqrestore(&s
->lock
, flags
);
2953 return copy_to_user((void *) arg
, &cinfo
, sizeof(cinfo
));
2955 case SNDCTL_DSP_GETBLKSIZE
:
2956 if (file
->f_mode
& FMODE_WRITE
) {
2957 if ((val
= prog_dmabuf_dac(s
)))
2959 return put_user(s
->dma_dac
.fragsize
, (int *) arg
);
2961 if ((val
= prog_dmabuf_adc(s
)))
2964 return put_user(s
->dma_adc
.fragsize
/ 2,
2967 return put_user(s
->dma_adc
.fragsize
, (int *) arg
);
2969 case SNDCTL_DSP_SETFRAGMENT
:
2970 if (get_user(val
, (int *) arg
))
2972 return 0; // Say OK, but do nothing.
2974 case SNDCTL_DSP_SUBDIVIDE
:
2975 if ((file
->f_mode
& FMODE_READ
&& s
->dma_adc
.subdivision
)
2976 || (file
->f_mode
& FMODE_WRITE
2977 && s
->dma_dac
.subdivision
)) return -EINVAL
;
2978 if (get_user(val
, (int *) arg
))
2980 if (val
!= 1 && val
!= 2 && val
!= 4)
2982 if (file
->f_mode
& FMODE_READ
)
2983 s
->dma_adc
.subdivision
= val
;
2984 else if (file
->f_mode
& FMODE_WRITE
)
2985 s
->dma_dac
.subdivision
= val
;
2988 case SOUND_PCM_READ_RATE
:
2989 if (file
->f_mode
& FMODE_READ
)
2990 return put_user(s
->prop_adc
.rate
, (int *) arg
);
2991 else if (file
->f_mode
& FMODE_WRITE
)
2992 return put_user(s
->prop_dac
.rate
, (int *) arg
);
2994 case SOUND_PCM_READ_CHANNELS
:
2995 if (file
->f_mode
& FMODE_READ
)
2996 return put_user(s
->prop_adc
.channels
, (int *) arg
);
2997 else if (file
->f_mode
& FMODE_WRITE
)
2998 return put_user(s
->prop_dac
.channels
, (int *) arg
);
3000 case SOUND_PCM_READ_BITS
:
3001 if (file
->f_mode
& FMODE_READ
)
3005 fmt
& (AFMT_S8
| AFMT_U8
)) ? 8 : 16,
3007 else if (file
->f_mode
& FMODE_WRITE
)
3011 fmt
& (AFMT_S8
| AFMT_U8
)) ? 8 : 16,
3014 case SOUND_PCM_WRITE_FILTER
:
3015 case SNDCTL_DSP_SETSYNCRO
:
3016 case SOUND_PCM_READ_FILTER
:
3019 #if CSDEBUG_INTERFACE
3021 case SNDCTL_DSP_CS_GETDBGMASK
:
3022 return put_user(cs_debugmask
, (unsigned long *) arg
);
3024 case SNDCTL_DSP_CS_GETDBGLEVEL
:
3025 return put_user(cs_debuglevel
, (unsigned long *) arg
);
3027 case SNDCTL_DSP_CS_SETDBGMASK
:
3028 if (get_user(val
, (unsigned long *) arg
))
3033 case SNDCTL_DSP_CS_SETDBGLEVEL
:
3034 if (get_user(val
, (unsigned long *) arg
))
3036 cs_debuglevel
= val
;
3041 return mixer_ioctl(s
, cmd
, arg
);
3045 static int cs4281_release(struct inode
*inode
, struct file
*file
)
3047 struct cs4281_state
*s
=
3048 (struct cs4281_state
*) file
->private_data
;
3050 CS_DBGOUT(CS_FUNCTION
| CS_RELEASE
, 2,
3052 "cs4281: cs4281_release(): inode=0x%.8x file=0x%.8x f_mode=%d\n",
3053 (unsigned) inode
, (unsigned) file
, file
->f_mode
));
3057 if (file
->f_mode
& FMODE_WRITE
) {
3058 drain_dac(s
, file
->f_flags
& O_NONBLOCK
);
3059 down(&s
->open_sem_dac
);
3061 dealloc_dmabuf(s
, &s
->dma_dac
);
3062 s
->open_mode
&= ~FMODE_WRITE
;
3063 up(&s
->open_sem_dac
);
3064 wake_up(&s
->open_wait_dac
);
3067 if (file
->f_mode
& FMODE_READ
) {
3068 drain_adc(s
, file
->f_flags
& O_NONBLOCK
);
3069 down(&s
->open_sem_adc
);
3071 dealloc_dmabuf(s
, &s
->dma_adc
);
3072 s
->open_mode
&= ~FMODE_READ
;
3073 up(&s
->open_sem_adc
);
3074 wake_up(&s
->open_wait_adc
);
3080 static int cs4281_open(struct inode
*inode
, struct file
*file
)
3082 int minor
= MINOR(inode
->i_rdev
);
3083 struct cs4281_state
*s
= devs
;
3085 CS_DBGOUT(CS_FUNCTION
| CS_OPEN
, 2,
3087 "cs4281: cs4281_open(): inode=0x%.8x file=0x%.8x f_mode=0x%x\n",
3088 (unsigned) inode
, (unsigned) file
, file
->f_mode
));
3089 while (s
&& ((s
->dev_audio
^ minor
) & ~0xf))
3092 CS_DBGOUT(CS_FUNCTION
| CS_OPEN
, 2, printk(KERN_INFO
3093 "cs4281: cs4281_open(): Error - unable to find audio state struct\n"));
3097 file
->private_data
= s
;
3099 // wait for device to become free
3100 if (!(file
->f_mode
& (FMODE_WRITE
| FMODE_READ
))) {
3101 CS_DBGOUT(CS_FUNCTION
| CS_OPEN
| CS_ERROR
, 2,
3103 "cs4281: cs4281_open(): Error - must open READ and/or WRITE\n"));
3106 if (file
->f_mode
& FMODE_WRITE
) {
3107 down(&s
->open_sem_dac
);
3108 while (s
->open_mode
& FMODE_WRITE
) {
3109 if (file
->f_flags
& O_NONBLOCK
) {
3110 up(&s
->open_sem_dac
);
3113 up(&s
->open_sem_dac
);
3114 interruptible_sleep_on(&s
->open_wait_dac
);
3116 if (signal_pending(current
))
3117 return -ERESTARTSYS
;
3118 down(&s
->open_sem_dac
);
3121 if (file
->f_mode
& FMODE_READ
) {
3122 down(&s
->open_sem_adc
);
3123 while (s
->open_mode
& FMODE_READ
) {
3124 if (file
->f_flags
& O_NONBLOCK
) {
3125 up(&s
->open_sem_adc
);
3128 up(&s
->open_sem_adc
);
3129 interruptible_sleep_on(&s
->open_wait_adc
);
3131 if (signal_pending(current
))
3132 return -ERESTARTSYS
;
3133 down(&s
->open_sem_adc
);
3136 s
->open_mode
|= file
->f_mode
& (FMODE_READ
| FMODE_WRITE
);
3137 if (file
->f_mode
& FMODE_READ
) {
3138 s
->prop_adc
.fmt
= AFMT_U8
;
3139 s
->prop_adc
.fmt_original
= s
->prop_adc
.fmt
;
3140 s
->prop_adc
.channels
= 1;
3141 s
->prop_adc
.rate
= 8000;
3142 s
->prop_adc
.clkdiv
= 96 | 0x80;
3144 s
->ena
&= ~FMODE_READ
;
3145 s
->dma_adc
.ossfragshift
= s
->dma_adc
.ossmaxfrags
=
3146 s
->dma_adc
.subdivision
= 0;
3147 up(&s
->open_sem_adc
);
3150 if (prog_dmabuf_adc(s
)) {
3151 CS_DBGOUT(CS_OPEN
| CS_ERROR
, 2, printk(KERN_ERR
3152 "cs4281: adc Program dmabufs failed.\n"));
3153 cs4281_release(inode
, file
);
3156 prog_codec(s
, CS_TYPE_ADC
);
3158 if (file
->f_mode
& FMODE_WRITE
) {
3159 s
->prop_dac
.fmt
= AFMT_U8
;
3160 s
->prop_dac
.fmt_original
= s
->prop_dac
.fmt
;
3161 s
->prop_dac
.channels
= 1;
3162 s
->prop_dac
.rate
= 8000;
3163 s
->prop_dac
.clkdiv
= 96 | 0x80;
3165 s
->ena
&= ~FMODE_WRITE
;
3166 s
->dma_dac
.ossfragshift
= s
->dma_dac
.ossmaxfrags
=
3167 s
->dma_dac
.subdivision
= 0;
3168 up(&s
->open_sem_dac
);
3171 if (prog_dmabuf_dac(s
)) {
3172 CS_DBGOUT(CS_OPEN
| CS_ERROR
, 2, printk(KERN_ERR
3173 "cs4281: dac Program dmabufs failed.\n"));
3174 cs4281_release(inode
, file
);
3177 prog_codec(s
, CS_TYPE_DAC
);
3179 CS_DBGOUT(CS_FUNCTION
| CS_OPEN
, 2,
3180 printk(KERN_INFO
"cs4281: cs4281_open()- 0\n"));
3185 // ******************************************************************************************
3186 // Wave (audio) file operations struct.
3187 // ******************************************************************************************
3188 static /*const */ struct file_operations cs4281_audio_fops
= {
3189 llseek
:cs4281_llseek
,
3196 release
:cs4281_release
,
3199 // ---------------------------------------------------------------------
3201 // hold spinlock for the following!
3202 static void cs4281_handle_midi(struct cs4281_state
*s
)
3209 while (!(readl(s
->pBA0
+ BA0_MIDSR
) & 0x80)) {
3210 ch
= readl(s
->pBA0
+ BA0_MIDRP
);
3211 if (s
->midi
.icnt
< MIDIINBUF
) {
3212 s
->midi
.ibuf
[s
->midi
.iwr
] = ch
;
3213 s
->midi
.iwr
= (s
->midi
.iwr
+ 1) % MIDIINBUF
;
3219 wake_up(&s
->midi
.iwait
);
3221 while (!(readl(s
->pBA0
+ BA0_MIDSR
) & 0x40) && s
->midi
.ocnt
> 0) {
3222 temp1
= (s
->midi
.obuf
[s
->midi
.ord
]) & 0x000000ff;
3223 writel(temp1
, s
->pBA0
+ BA0_MIDWP
);
3224 s
->midi
.ord
= (s
->midi
.ord
+ 1) % MIDIOUTBUF
;
3226 if (s
->midi
.ocnt
< MIDIOUTBUF
- 16)
3230 wake_up(&s
->midi
.owait
);
3235 static void cs4281_interrupt(int irq
, void *dev_id
, struct pt_regs
*regs
)
3237 struct cs4281_state
*s
= (struct cs4281_state
*) dev_id
;
3240 // fastpath out, to ease interrupt sharing
3241 temp1
= readl(s
->pBA0
+ BA0_HISR
); // Get Int Status reg.
3243 CS_DBGOUT(CS_INTERRUPT
, 6, printk(KERN_INFO
3244 "cs4281: cs4281_interrupt() BA0_HISR=0x%.8x\n",
3247 if (!(temp1
& (HISR_DMA0
| HISR_DMA1
| HISR_MIDI
))) { // If not DMA or MIDI int,
3248 writel(HICR_IEV
| HICR_CHGM
, s
->pBA0
+ BA0_HICR
); // reenable interrupts
3249 CS_DBGOUT(CS_INTERRUPT
, 4, printk(KERN_INFO
3250 "cs4281: cs4281_interrupt(): returning not cs4281 interrupt.\n"));
3251 return; // and return.
3254 if (temp1
& HISR_DMA0
) // If play interrupt,
3255 readl(s
->pBA0
+ BA0_HDSR0
); // clear the source.
3257 if (temp1
& HISR_DMA1
) // Same for play.
3258 readl(s
->pBA0
+ BA0_HDSR1
);
3259 writel(HICR_IEV
| HICR_CHGM
, s
->pBA0
+ BA0_HICR
); // Local EOI
3261 spin_lock(&s
->lock
);
3262 cs4281_update_ptr(s
);
3263 cs4281_handle_midi(s
);
3264 spin_unlock(&s
->lock
);
3267 // **************************************************************************
3269 static void cs4281_midi_timer(unsigned long data
)
3271 struct cs4281_state
*s
= (struct cs4281_state
*) data
;
3272 unsigned long flags
;
3274 spin_lock_irqsave(&s
->lock
, flags
);
3275 cs4281_handle_midi(s
);
3276 spin_unlock_irqrestore(&s
->lock
, flags
);
3277 s
->midi
.timer
.expires
= jiffies
+ 1;
3278 add_timer(&s
->midi
.timer
);
3282 // ---------------------------------------------------------------------
3284 static ssize_t
cs4281_midi_read(struct file
*file
, char *buffer
,
3285 size_t count
, loff_t
* ppos
)
3287 struct cs4281_state
*s
=
3288 (struct cs4281_state
*) file
->private_data
;
3290 unsigned long flags
;
3295 if (ppos
!= &file
->f_pos
)
3297 if (!access_ok(VERIFY_WRITE
, buffer
, count
))
3301 spin_lock_irqsave(&s
->lock
, flags
);
3303 cnt
= MIDIINBUF
- ptr
;
3304 if (s
->midi
.icnt
< cnt
)
3306 spin_unlock_irqrestore(&s
->lock
, flags
);
3310 if (file
->f_flags
& O_NONBLOCK
)
3311 return ret
? ret
: -EAGAIN
;
3312 interruptible_sleep_on(&s
->midi
.iwait
);
3313 if (signal_pending(current
))
3314 return ret
? ret
: -ERESTARTSYS
;
3317 if (copy_to_user(buffer
, s
->midi
.ibuf
+ ptr
, cnt
))
3318 return ret
? ret
: -EFAULT
;
3319 ptr
= (ptr
+ cnt
) % MIDIINBUF
;
3320 spin_lock_irqsave(&s
->lock
, flags
);
3322 s
->midi
.icnt
-= cnt
;
3323 spin_unlock_irqrestore(&s
->lock
, flags
);
3332 static ssize_t
cs4281_midi_write(struct file
*file
, const char *buffer
,
3333 size_t count
, loff_t
* ppos
)
3335 struct cs4281_state
*s
=
3336 (struct cs4281_state
*) file
->private_data
;
3338 unsigned long flags
;
3343 if (ppos
!= &file
->f_pos
)
3345 if (!access_ok(VERIFY_READ
, buffer
, count
))
3349 spin_lock_irqsave(&s
->lock
, flags
);
3351 cnt
= MIDIOUTBUF
- ptr
;
3352 if (s
->midi
.ocnt
+ cnt
> MIDIOUTBUF
)
3353 cnt
= MIDIOUTBUF
- s
->midi
.ocnt
;
3355 cs4281_handle_midi(s
);
3356 spin_unlock_irqrestore(&s
->lock
, flags
);
3360 if (file
->f_flags
& O_NONBLOCK
)
3361 return ret
? ret
: -EAGAIN
;
3362 interruptible_sleep_on(&s
->midi
.owait
);
3363 if (signal_pending(current
))
3364 return ret
? ret
: -ERESTARTSYS
;
3367 if (copy_from_user(s
->midi
.obuf
+ ptr
, buffer
, cnt
))
3368 return ret
? ret
: -EFAULT
;
3369 ptr
= (ptr
+ cnt
) % MIDIOUTBUF
;
3370 spin_lock_irqsave(&s
->lock
, flags
);
3372 s
->midi
.ocnt
+= cnt
;
3373 spin_unlock_irqrestore(&s
->lock
, flags
);
3377 spin_lock_irqsave(&s
->lock
, flags
);
3378 cs4281_handle_midi(s
);
3379 spin_unlock_irqrestore(&s
->lock
, flags
);
3385 static unsigned int cs4281_midi_poll(struct file
*file
,
3386 struct poll_table_struct
*wait
)
3388 struct cs4281_state
*s
=
3389 (struct cs4281_state
*) file
->private_data
;
3390 unsigned long flags
;
3391 unsigned int mask
= 0;
3394 if (file
->f_flags
& FMODE_WRITE
)
3395 poll_wait(file
, &s
->midi
.owait
, wait
);
3396 if (file
->f_flags
& FMODE_READ
)
3397 poll_wait(file
, &s
->midi
.iwait
, wait
);
3398 spin_lock_irqsave(&s
->lock
, flags
);
3399 if (file
->f_flags
& FMODE_READ
) {
3400 if (s
->midi
.icnt
> 0)
3401 mask
|= POLLIN
| POLLRDNORM
;
3403 if (file
->f_flags
& FMODE_WRITE
) {
3404 if (s
->midi
.ocnt
< MIDIOUTBUF
)
3405 mask
|= POLLOUT
| POLLWRNORM
;
3407 spin_unlock_irqrestore(&s
->lock
, flags
);
3412 static int cs4281_midi_open(struct inode
*inode
, struct file
*file
)
3414 int minor
= MINOR(inode
->i_rdev
);
3415 struct cs4281_state
*s
= devs
;
3416 unsigned long flags
, temp1
;
3417 while (s
&& s
->dev_midi
!= minor
)
3422 file
->private_data
= s
;
3423 // wait for device to become free
3425 while (s
->open_mode
& (file
->f_mode
<< FMODE_MIDI_SHIFT
)) {
3426 if (file
->f_flags
& O_NONBLOCK
) {
3431 interruptible_sleep_on(&s
->open_wait
);
3432 if (signal_pending(current
))
3433 return -ERESTARTSYS
;
3436 spin_lock_irqsave(&s
->lock
, flags
);
3437 if (!(s
->open_mode
& (FMODE_MIDI_READ
| FMODE_MIDI_WRITE
))) {
3438 s
->midi
.ird
= s
->midi
.iwr
= s
->midi
.icnt
= 0;
3439 s
->midi
.ord
= s
->midi
.owr
= s
->midi
.ocnt
= 0;
3440 writel(1, s
->pBA0
+ BA0_MIDCR
); // Reset the interface.
3441 writel(0, s
->pBA0
+ BA0_MIDCR
); // Return to normal mode.
3442 s
->midi
.ird
= s
->midi
.iwr
= s
->midi
.icnt
= 0;
3443 writel(0x0000000f, s
->pBA0
+ BA0_MIDCR
); // Enable transmit, record, ints.
3444 temp1
= readl(s
->pBA0
+ BA0_HIMR
);
3445 writel(temp1
& 0xffbfffff, s
->pBA0
+ BA0_HIMR
); // Enable midi int. recognition.
3446 writel(HICR_IEV
| HICR_CHGM
, s
->pBA0
+ BA0_HICR
); // Enable interrupts
3447 init_timer(&s
->midi
.timer
);
3448 s
->midi
.timer
.expires
= jiffies
+ 1;
3449 s
->midi
.timer
.data
= (unsigned long) s
;
3450 s
->midi
.timer
.function
= cs4281_midi_timer
;
3451 add_timer(&s
->midi
.timer
);
3453 if (file
->f_mode
& FMODE_READ
) {
3454 s
->midi
.ird
= s
->midi
.iwr
= s
->midi
.icnt
= 0;
3456 if (file
->f_mode
& FMODE_WRITE
) {
3457 s
->midi
.ord
= s
->midi
.owr
= s
->midi
.ocnt
= 0;
3459 spin_unlock_irqrestore(&s
->lock
, flags
);
3462 f_mode
<< FMODE_MIDI_SHIFT
) & (FMODE_MIDI_READ
|
3470 static int cs4281_midi_release(struct inode
*inode
, struct file
*file
)
3472 struct cs4281_state
*s
=
3473 (struct cs4281_state
*) file
->private_data
;
3474 DECLARE_WAITQUEUE(wait
, current
);
3475 unsigned long flags
;
3476 unsigned count
, tmo
;
3480 if (file
->f_mode
& FMODE_WRITE
) {
3481 add_wait_queue(&s
->midi
.owait
, &wait
);
3483 set_current_state(TASK_INTERRUPTIBLE
);
3484 spin_lock_irqsave(&s
->lock
, flags
);
3485 count
= s
->midi
.ocnt
;
3486 spin_unlock_irqrestore(&s
->lock
, flags
);
3489 if (signal_pending(current
))
3491 if (file
->f_flags
& O_NONBLOCK
) {
3492 remove_wait_queue(&s
->midi
.owait
, &wait
);
3493 current
->state
= TASK_RUNNING
;
3496 tmo
= (count
* HZ
) / 3100;
3497 if (!schedule_timeout(tmo
? : 1) && tmo
)
3499 "cs4281: midi timed out??\n");
3501 remove_wait_queue(&s
->midi
.owait
, &wait
);
3502 current
->state
= TASK_RUNNING
;
3506 (~(file
->f_mode
<< FMODE_MIDI_SHIFT
)) & (FMODE_MIDI_READ
|
3508 spin_lock_irqsave(&s
->lock
, flags
);
3509 if (!(s
->open_mode
& (FMODE_MIDI_READ
| FMODE_MIDI_WRITE
))) {
3510 writel(0, s
->pBA0
+ BA0_MIDCR
); // Disable Midi interrupts.
3511 del_timer(&s
->midi
.timer
);
3513 spin_unlock_irqrestore(&s
->lock
, flags
);
3515 wake_up(&s
->open_wait
);
3520 // ******************************************************************************************
3521 // Midi file operations struct.
3522 // ******************************************************************************************
3523 static /*const */ struct file_operations cs4281_midi_fops
= {
3524 llseek
:cs4281_llseek
,
3525 read
:cs4281_midi_read
,
3526 write
:cs4281_midi_write
,
3527 poll
:cs4281_midi_poll
,
3528 open
:cs4281_midi_open
,
3529 release
:cs4281_midi_release
,
3533 // ---------------------------------------------------------------------
3535 // maximum number of devices
3536 #define NR_DEVICE 8 // Only eight devices supported currently.
3538 // ---------------------------------------------------------------------
3540 static struct initvol
{
3543 } initvol
[] __initdata
= {
3546 SOUND_MIXER_WRITE_VOLUME
, 0x4040}, {
3547 SOUND_MIXER_WRITE_PCM
, 0x4040}, {
3548 SOUND_MIXER_WRITE_SYNTH
, 0x4040}, {
3549 SOUND_MIXER_WRITE_CD
, 0x4040}, {
3550 SOUND_MIXER_WRITE_LINE
, 0x4040}, {
3551 SOUND_MIXER_WRITE_LINE1
, 0x4040}, {
3552 SOUND_MIXER_WRITE_RECLEV
, 0x0000}, {
3553 SOUND_MIXER_WRITE_SPEAKER
, 0x4040}, {
3554 SOUND_MIXER_WRITE_MIC
, 0x0000}
3558 static int __devinit
cs4281_probe(struct pci_dev
*pcidev
,
3559 const struct pci_device_id
*pciid
)
3561 struct cs4281_state
*s
;
3562 dma_addr_t dma_mask
;
3564 int i
, val
, index
= 0;
3565 unsigned int temp1
, temp2
;
3567 CS_DBGOUT(CS_FUNCTION
| CS_INIT
, 2,
3568 printk(KERN_INFO
"cs4281: probe()+\n"));
3570 if (!RSRCISMEMORYREGION(pcidev
, 0) ||
3571 !RSRCISMEMORYREGION(pcidev
, 1)) {
3572 CS_DBGOUT(CS_ERROR
, 1,
3574 "cs4281: probe()- Memory region not assigned\n"));
3577 if (pcidev
->irq
== 0) {
3578 CS_DBGOUT(CS_ERROR
, 1,
3580 "cs4281: probe() IRQ not assigned\n"));
3583 if (!pci_dma_supported(pcidev
, 0xffffffff)) {
3584 CS_DBGOUT(CS_ERROR
, 1, printk(KERN_ERR
3585 "cs4281: probe() architecture does not support 32bit PCI busmaster DMA\n"));
3588 dma_mask
= 0xffffffff; /* this enables playback and recording */
3589 if (!(s
= kmalloc(sizeof(struct cs4281_state
), GFP_KERNEL
))) {
3590 CS_DBGOUT(CS_ERROR
, 1, printk(KERN_ERR
3591 "cs4281: probe() no memory for state struct.\n"));
3594 memset(s
, 0, sizeof(struct cs4281_state
));
3595 init_waitqueue_head(&s
->dma_adc
.wait
);
3596 init_waitqueue_head(&s
->dma_dac
.wait
);
3597 init_waitqueue_head(&s
->open_wait
);
3598 init_waitqueue_head(&s
->open_wait_adc
);
3599 init_waitqueue_head(&s
->open_wait_dac
);
3600 init_waitqueue_head(&s
->midi
.iwait
);
3601 init_waitqueue_head(&s
->midi
.owait
);
3602 init_MUTEX(&s
->open_sem
);
3603 init_MUTEX(&s
->open_sem_adc
);
3604 init_MUTEX(&s
->open_sem_dac
);
3605 spin_lock_init(&s
->lock
);
3606 s
->pBA0phys
= RSRCADDRESS(pcidev
, 0);
3607 s
->pBA1phys
= RSRCADDRESS(pcidev
, 1);
3608 s
->pBA0
= ioremap_nocache(s
->pBA0phys
, 4096); // Convert phys
3609 s
->pBA1
= ioremap_nocache(s
->pBA1phys
, 65536); // to linear.
3610 temp1
= readl(s
->pBA0
+ BA0_PCICFG00
);
3611 temp2
= readl(s
->pBA0
+ BA0_PCICFG04
);
3613 CS_DBGOUT(CS_INIT
, 2,
3615 "cs4281: probe() BA0=0x%.8x BA1=0x%.8x pBA0=0x%.8x pBA1=0x%.8x \n",
3616 (unsigned) temp1
, (unsigned) temp2
,
3617 (unsigned) s
->pBA0
, (unsigned) s
->pBA1
));
3619 CS_DBGOUT(CS_INIT
, 2,
3621 "cs4281: probe() pBA0phys=0x%.8x pBA1phys=0x%.8x\n",
3622 (unsigned) s
->pBA0phys
, (unsigned) s
->pBA1phys
));
3624 temp1
= cs4281_hw_init(s
);
3626 CS_DBGOUT(CS_ERROR
| CS_INIT
, 1,
3628 "cs4281: cs4281_hw_init() failed. Skipping part.\n"));
3631 s
->magic
= CS4281_MAGIC
;
3633 s
->irq
= pcidev
->irq
;
3634 if (pci_enable_device(pcidev
)) {
3635 CS_DBGOUT(CS_INIT
| CS_ERROR
, 1,
3637 "cs4281: pci_enable_device() failed\n"));
3641 (s
->irq
, cs4281_interrupt
, SA_SHIRQ
, "Crystal CS4281", s
)) {
3642 CS_DBGOUT(CS_INIT
| CS_ERROR
, 1,
3643 printk(KERN_ERR
"cs4281: irq %u in use\n",
3647 if ((s
->dev_audio
= register_sound_dsp(&cs4281_audio_fops
, -1)) <
3649 CS_DBGOUT(CS_INIT
| CS_ERROR
, 1,
3651 "cs4281: probe() register_sound_dsp() failed.\n"));
3654 if ((s
->dev_mixer
= register_sound_mixer(&cs4281_mixer_fops
, -1)) <
3656 CS_DBGOUT(CS_INIT
| CS_ERROR
, 1,
3658 "cs4281: probe() register_sound_mixer() failed.\n"));
3661 if ((s
->dev_midi
= register_sound_midi(&cs4281_midi_fops
, -1)) < 0) {
3662 CS_DBGOUT(CS_INIT
| CS_ERROR
, 1,
3664 "cs4281: probe() register_sound_midi() failed.\n"));
3668 pci_set_master(pcidev
); // enable bus mastering
3672 val
= SOUND_MASK_LINE
;
3673 mixer_ioctl(s
, SOUND_MIXER_WRITE_RECSRC
, (unsigned long) &val
);
3674 for (i
= 0; i
< sizeof(initvol
) / sizeof(initvol
[0]); i
++) {
3675 val
= initvol
[i
].vol
;
3676 mixer_ioctl(s
, initvol
[i
].mixch
, (unsigned long) &val
);
3678 val
= 1; // enable mic preamp
3679 mixer_ioctl(s
, SOUND_MIXER_PRIVATE1
, (unsigned long) &val
);
3682 // queue it for later freeing
3684 pcidev
->driver_data
= s
;
3685 pcidev
->dma_mask
= dma_mask
;
3691 unregister_sound_mixer(s
->dev_mixer
);
3693 unregister_sound_dsp(s
->dev_audio
);
3695 free_irq(s
->irq
, s
);
3700 CS_DBGOUT(CS_INIT
| CS_ERROR
, 1,
3702 "cs4281: probe()- no device allocated\n"));
3705 CS_DBGOUT(CS_INIT
| CS_FUNCTION
, 2,
3707 "cs4281: probe()- device allocated successfully\n"));
3712 // ---------------------------------------------------------------------
3714 static void __devinit
cs4281_remove(struct pci_dev
*dev
)
3716 struct cs4281_state
*s
= (struct cs4281_state
*) dev
->driver_data
;
3717 // stop DMA controller
3719 free_irq(s
->irq
, s
);
3720 unregister_sound_dsp(s
->dev_audio
);
3721 unregister_sound_mixer(s
->dev_mixer
);
3722 unregister_sound_midi(s
->dev_midi
);
3724 dev
->driver_data
= NULL
;
3725 CS_DBGOUT(CS_INIT
| CS_FUNCTION
, 2,
3727 "cs4281: cs4281_remove(): remove successful\n"));
3730 static struct pci_device_id id_table
[] __devinitdata
= {
3732 {PCI_VENDOR_ID_CIRRUS
, PCI_DEVICE_ID_CRYSTAL_CS4281
,
3733 PCI_ANY_ID
, PCI_ANY_ID
, 0, 0},
3737 MODULE_DEVICE_TABLE(pci
, id_table
);
3739 static struct pci_driver cs4281_driver
= {
3743 remove
:cs4281_remove
3746 static int __init
init_cs4281(void)
3749 CS_DBGOUT(CS_INIT
| CS_FUNCTION
, 2,
3750 printk(KERN_INFO
"cs4281: init_cs4281()+ \n"));
3751 if (!pci_present()) { /* No PCI bus in this machine! */
3752 CS_DBGOUT(CS_INIT
| CS_FUNCTION
, 2,
3754 "cs4281: init_cs4281()- no pci bus found\n"));
3757 printk(KERN_INFO
"cs4281: version v%d.%02d.%d time " __TIME__
" "
3758 __DATE__
"\n", CS4281_MAJOR_VERSION
, CS4281_MINOR_VERSION
,
3760 if (!pci_register_driver(&cs4281_driver
)) {
3761 pci_unregister_driver(&cs4281_driver
);
3762 CS_DBGOUT(CS_INIT
| CS_FUNCTION
, 2,
3764 "cs4281: init_cs4281()- unable to register pci device \n"));
3767 CS_DBGOUT(CS_INIT
| CS_FUNCTION
, 2,
3768 printk(KERN_INFO
"cs4281: init_cs4281()- 0\n"));
3773 // ---------------------------------------------------------------------
3776 MODULE_AUTHOR("gw boynton, wesb@crystal.cirrus.com");
3777 MODULE_DESCRIPTION("Cirrus Logic CS4281 Driver");
3779 static void __exit
cleanup_cs4281(void)
3781 pci_unregister_driver(&cs4281_driver
);
3782 CS_DBGOUT(CS_INIT
| CS_FUNCTION
, 2,
3783 printk(KERN_INFO
"cs4281: cleanup_cs4281() finished\n"));
3786 // ---------------------------------------------------------------------
3788 module_init(init_cs4281
);
3789 module_exit(cleanup_cs4281
);