2 /* This is a modified version of linux/drivers/sound/dmasound.c to
3 * support the CS4218 codec on the 8xx TDM port. Thanks to everyone
4 * that contributed to the dmasound software (which includes me :-).
6 * The CS4218 is configured in Mode 4, sub-mode 0. This provides
7 * left/right data only on the TDM port, as a 32-bit word, per frame
8 * pulse. The control of the CS4218 is provided by some other means,
10 * Dan Malek (dmalek@jlc.net)
13 #include <linux/module.h>
14 #include <linux/sched.h>
15 #include <linux/timer.h>
16 #include <linux/major.h>
17 #include <linux/fcntl.h>
18 #include <linux/errno.h>
20 #include <linux/slab.h>
21 #include <linux/sound.h>
22 #include <linux/init.h>
23 #include <linux/delay.h>
25 #include <asm/system.h>
27 #include <asm/pgtable.h>
28 #include <asm/uaccess.h>
31 /* Should probably do something different with this path name.....
32 * Actually, I should just stop using it...
35 #include <linux/soundcard.h>
37 #include <asm/mpc8xx.h>
38 #include <asm/8xx_immap.h>
39 #include <asm/commproc.h>
41 #define DMASND_CS4218 5
43 #define MAX_CATCH_RADIUS 10
46 #define MAX_BUFSIZE 128
48 #define HAS_8BIT_TABLES
50 static int sq_unit
= -1;
51 static int mixer_unit
= -1;
52 static int state_unit
= -1;
53 static int irq_installed
= 0;
54 static char **sound_buffers
= NULL
;
55 static char **sound_read_buffers
= NULL
;
57 static DEFINE_SPINLOCK(cs4218_lock
);
59 /* Local copies of things we put in the control register. Output
60 * volume, like most codecs is really attenuation.
62 static int cs4218_rate_index
;
65 * Stuff for outputting a beep. The values range from -327 to +327
66 * so we can multiply by an amplitude in the range 0..100 to get a
67 * signed short value to put in the output buffer.
69 static short beep_wform
[256] = {
70 0, 40, 79, 117, 153, 187, 218, 245,
71 269, 288, 304, 316, 323, 327, 327, 324,
72 318, 310, 299, 288, 275, 262, 249, 236,
73 224, 213, 204, 196, 190, 186, 183, 182,
74 182, 183, 186, 189, 192, 196, 200, 203,
75 206, 208, 209, 209, 209, 207, 204, 201,
76 197, 193, 188, 183, 179, 174, 170, 166,
77 163, 161, 160, 159, 159, 160, 161, 162,
78 164, 166, 168, 169, 171, 171, 171, 170,
79 169, 167, 163, 159, 155, 150, 144, 139,
80 133, 128, 122, 117, 113, 110, 107, 105,
81 103, 103, 103, 103, 104, 104, 105, 105,
82 105, 103, 101, 97, 92, 86, 78, 68,
83 58, 45, 32, 18, 3, -11, -26, -41,
84 -55, -68, -79, -88, -95, -100, -102, -102,
85 -99, -93, -85, -75, -62, -48, -33, -16,
86 0, 16, 33, 48, 62, 75, 85, 93,
87 99, 102, 102, 100, 95, 88, 79, 68,
88 55, 41, 26, 11, -3, -18, -32, -45,
89 -58, -68, -78, -86, -92, -97, -101, -103,
90 -105, -105, -105, -104, -104, -103, -103, -103,
91 -103, -105, -107, -110, -113, -117, -122, -128,
92 -133, -139, -144, -150, -155, -159, -163, -167,
93 -169, -170, -171, -171, -171, -169, -168, -166,
94 -164, -162, -161, -160, -159, -159, -160, -161,
95 -163, -166, -170, -174, -179, -183, -188, -193,
96 -197, -201, -204, -207, -209, -209, -209, -208,
97 -206, -203, -200, -196, -192, -189, -186, -183,
98 -182, -182, -183, -186, -190, -196, -204, -213,
99 -224, -236, -249, -262, -275, -288, -299, -310,
100 -318, -324, -327, -327, -323, -316, -304, -288,
101 -269, -245, -218, -187, -153, -117, -79, -40,
104 #define BEEP_SPEED 5 /* 22050 Hz sample rate */
105 #define BEEP_BUFLEN 512
106 #define BEEP_VOLUME 15 /* 0 - 100 */
108 static int beep_volume
= BEEP_VOLUME
;
109 static int beep_playing
= 0;
110 static int beep_state
= 0;
111 static short *beep_buf
;
112 static void (*orig_mksound
)(unsigned int, unsigned int);
114 /* This is found someplace else......I guess in the keyboard driver
117 static void (*kd_mksound
)(unsigned int, unsigned int);
119 static int catchRadius
= 0;
120 static int numBufs
= 4, bufSize
= 32;
121 static int numReadBufs
= 4, readbufSize
= 32;
124 /* TDM/Serial transmit and receive buffer descriptors.
126 static volatile cbd_t
*rx_base
, *rx_cur
, *tx_base
, *tx_cur
;
128 module_param(catchRadius
, int, 0);
129 module_param(numBufs
, int, 0);
130 module_param(bufSize
, int, 0);
131 module_param(numreadBufs
, int, 0);
132 module_param(readbufSize
, int, 0);
134 #define arraysize(x) (sizeof(x)/sizeof(*(x)))
135 #define le2be16(x) (((x)<<8 & 0xff00) | ((x)>>8 & 0x00ff))
136 #define le2be16dbl(x) (((x)<<8 & 0xff00ff00) | ((x)>>8 & 0x00ff00ff))
138 #define IOCTL_IN(arg, ret) \
139 do { int error = get_user(ret, (int *)(arg)); \
140 if (error) return error; \
142 #define IOCTL_OUT(arg, ret) ioctl_return((int *)(arg), ret)
144 /* CS4218 serial port control in mode 4.
146 #define CS_INTMASK ((uint)0x40000000)
147 #define CS_DO1 ((uint)0x20000000)
148 #define CS_LATTEN ((uint)0x1f000000)
149 #define CS_RATTEN ((uint)0x00f80000)
150 #define CS_MUTE ((uint)0x00040000)
151 #define CS_ISL ((uint)0x00020000)
152 #define CS_ISR ((uint)0x00010000)
153 #define CS_LGAIN ((uint)0x0000f000)
154 #define CS_RGAIN ((uint)0x00000f00)
156 #define CS_LATTEN_SET(X) (((X) & 0x1f) << 24)
157 #define CS_RATTEN_SET(X) (((X) & 0x1f) << 19)
158 #define CS_LGAIN_SET(X) (((X) & 0x0f) << 12)
159 #define CS_RGAIN_SET(X) (((X) & 0x0f) << 8)
161 #define CS_LATTEN_GET(X) (((X) >> 24) & 0x1f)
162 #define CS_RATTEN_GET(X) (((X) >> 19) & 0x1f)
163 #define CS_LGAIN_GET(X) (((X) >> 12) & 0x0f)
164 #define CS_RGAIN_GET(X) (((X) >> 8) & 0x0f)
166 /* The control register is effectively write only. We have to keep a copy
169 static uint cs4218_control
;
171 /* A place to store expanding information.
173 static int expand_bal
;
174 static int expand_data
;
176 /* Since I can't make the microcode patch work for the SPI, I just
177 * clock the bits using software.
179 static void sw_spi_init(void);
180 static void sw_spi_io(u_char
*obuf
, u_char
*ibuf
, uint bcnt
);
181 static uint
cs4218_ctl_write(uint ctlreg
);
183 /*** Some low level helpers **************************************************/
187 static short ulaw2dma16
[] = {
188 -32124, -31100, -30076, -29052, -28028, -27004, -25980, -24956,
189 -23932, -22908, -21884, -20860, -19836, -18812, -17788, -16764,
190 -15996, -15484, -14972, -14460, -13948, -13436, -12924, -12412,
191 -11900, -11388, -10876, -10364, -9852, -9340, -8828, -8316,
192 -7932, -7676, -7420, -7164, -6908, -6652, -6396, -6140,
193 -5884, -5628, -5372, -5116, -4860, -4604, -4348, -4092,
194 -3900, -3772, -3644, -3516, -3388, -3260, -3132, -3004,
195 -2876, -2748, -2620, -2492, -2364, -2236, -2108, -1980,
196 -1884, -1820, -1756, -1692, -1628, -1564, -1500, -1436,
197 -1372, -1308, -1244, -1180, -1116, -1052, -988, -924,
198 -876, -844, -812, -780, -748, -716, -684, -652,
199 -620, -588, -556, -524, -492, -460, -428, -396,
200 -372, -356, -340, -324, -308, -292, -276, -260,
201 -244, -228, -212, -196, -180, -164, -148, -132,
202 -120, -112, -104, -96, -88, -80, -72, -64,
203 -56, -48, -40, -32, -24, -16, -8, 0,
204 32124, 31100, 30076, 29052, 28028, 27004, 25980, 24956,
205 23932, 22908, 21884, 20860, 19836, 18812, 17788, 16764,
206 15996, 15484, 14972, 14460, 13948, 13436, 12924, 12412,
207 11900, 11388, 10876, 10364, 9852, 9340, 8828, 8316,
208 7932, 7676, 7420, 7164, 6908, 6652, 6396, 6140,
209 5884, 5628, 5372, 5116, 4860, 4604, 4348, 4092,
210 3900, 3772, 3644, 3516, 3388, 3260, 3132, 3004,
211 2876, 2748, 2620, 2492, 2364, 2236, 2108, 1980,
212 1884, 1820, 1756, 1692, 1628, 1564, 1500, 1436,
213 1372, 1308, 1244, 1180, 1116, 1052, 988, 924,
214 876, 844, 812, 780, 748, 716, 684, 652,
215 620, 588, 556, 524, 492, 460, 428, 396,
216 372, 356, 340, 324, 308, 292, 276, 260,
217 244, 228, 212, 196, 180, 164, 148, 132,
218 120, 112, 104, 96, 88, 80, 72, 64,
219 56, 48, 40, 32, 24, 16, 8, 0,
224 static short alaw2dma16
[] = {
225 -5504, -5248, -6016, -5760, -4480, -4224, -4992, -4736,
226 -7552, -7296, -8064, -7808, -6528, -6272, -7040, -6784,
227 -2752, -2624, -3008, -2880, -2240, -2112, -2496, -2368,
228 -3776, -3648, -4032, -3904, -3264, -3136, -3520, -3392,
229 -22016, -20992, -24064, -23040, -17920, -16896, -19968, -18944,
230 -30208, -29184, -32256, -31232, -26112, -25088, -28160, -27136,
231 -11008, -10496, -12032, -11520, -8960, -8448, -9984, -9472,
232 -15104, -14592, -16128, -15616, -13056, -12544, -14080, -13568,
233 -344, -328, -376, -360, -280, -264, -312, -296,
234 -472, -456, -504, -488, -408, -392, -440, -424,
235 -88, -72, -120, -104, -24, -8, -56, -40,
236 -216, -200, -248, -232, -152, -136, -184, -168,
237 -1376, -1312, -1504, -1440, -1120, -1056, -1248, -1184,
238 -1888, -1824, -2016, -1952, -1632, -1568, -1760, -1696,
239 -688, -656, -752, -720, -560, -528, -624, -592,
240 -944, -912, -1008, -976, -816, -784, -880, -848,
241 5504, 5248, 6016, 5760, 4480, 4224, 4992, 4736,
242 7552, 7296, 8064, 7808, 6528, 6272, 7040, 6784,
243 2752, 2624, 3008, 2880, 2240, 2112, 2496, 2368,
244 3776, 3648, 4032, 3904, 3264, 3136, 3520, 3392,
245 22016, 20992, 24064, 23040, 17920, 16896, 19968, 18944,
246 30208, 29184, 32256, 31232, 26112, 25088, 28160, 27136,
247 11008, 10496, 12032, 11520, 8960, 8448, 9984, 9472,
248 15104, 14592, 16128, 15616, 13056, 12544, 14080, 13568,
249 344, 328, 376, 360, 280, 264, 312, 296,
250 472, 456, 504, 488, 408, 392, 440, 424,
251 88, 72, 120, 104, 24, 8, 56, 40,
252 216, 200, 248, 232, 152, 136, 184, 168,
253 1376, 1312, 1504, 1440, 1120, 1056, 1248, 1184,
254 1888, 1824, 2016, 1952, 1632, 1568, 1760, 1696,
255 688, 656, 752, 720, 560, 528, 624, 592,
256 944, 912, 1008, 976, 816, 784, 880, 848,
260 /*** Translations ************************************************************/
263 static ssize_t
cs4218_ct_law(const u_char
*userPtr
, size_t userCount
,
264 u_char frame
[], ssize_t
*frameUsed
,
266 static ssize_t
cs4218_ct_s8(const u_char
*userPtr
, size_t userCount
,
267 u_char frame
[], ssize_t
*frameUsed
,
269 static ssize_t
cs4218_ct_u8(const u_char
*userPtr
, size_t userCount
,
270 u_char frame
[], ssize_t
*frameUsed
,
272 static ssize_t
cs4218_ct_s16(const u_char
*userPtr
, size_t userCount
,
273 u_char frame
[], ssize_t
*frameUsed
,
275 static ssize_t
cs4218_ct_u16(const u_char
*userPtr
, size_t userCount
,
276 u_char frame
[], ssize_t
*frameUsed
,
278 static ssize_t
cs4218_ctx_law(const u_char
*userPtr
, size_t userCount
,
279 u_char frame
[], ssize_t
*frameUsed
,
281 static ssize_t
cs4218_ctx_s8(const u_char
*userPtr
, size_t userCount
,
282 u_char frame
[], ssize_t
*frameUsed
,
284 static ssize_t
cs4218_ctx_u8(const u_char
*userPtr
, size_t userCount
,
285 u_char frame
[], ssize_t
*frameUsed
,
287 static ssize_t
cs4218_ctx_s16(const u_char
*userPtr
, size_t userCount
,
288 u_char frame
[], ssize_t
*frameUsed
,
290 static ssize_t
cs4218_ctx_u16(const u_char
*userPtr
, size_t userCount
,
291 u_char frame
[], ssize_t
*frameUsed
,
293 static ssize_t
cs4218_ct_s16_read(const u_char
*userPtr
, size_t userCount
,
294 u_char frame
[], ssize_t
*frameUsed
,
296 static ssize_t
cs4218_ct_u16_read(const u_char
*userPtr
, size_t userCount
,
297 u_char frame
[], ssize_t
*frameUsed
,
301 /*** Low level stuff *********************************************************/
303 struct cs_sound_settings
{
304 MACHINE mach
; /* machine dependent things */
305 SETTINGS hard
; /* hardware settings */
306 SETTINGS soft
; /* software settings */
307 SETTINGS dsp
; /* /dev/dsp default settings */
308 TRANS
*trans_write
; /* supported translations for playback */
309 TRANS
*trans_read
; /* supported translations for record */
310 int volume_left
; /* volume (range is machine dependent) */
312 int bass
; /* tone (range is machine dependent) */
315 int minDev
; /* minor device number currently open */
318 static struct cs_sound_settings sound
;
320 static void *CS_Alloc(unsigned int size
, gfp_t flags
);
321 static void CS_Free(void *ptr
, unsigned int size
);
322 static int CS_IrqInit(void);
324 static void CS_IrqCleanup(void);
326 static void CS_Silence(void);
327 static void CS_Init(void);
328 static void CS_Play(void);
329 static void CS_Record(void);
330 static int CS_SetFormat(int format
);
331 static int CS_SetVolume(int volume
);
332 static void cs4218_tdm_tx_intr(void *devid
);
333 static void cs4218_tdm_rx_intr(void *devid
);
334 static void cs4218_intr(void *devid
);
335 static int cs_get_volume(uint reg
);
336 static int cs_volume_setter(int volume
, int mute
);
337 static int cs_get_gain(uint reg
);
338 static int cs_set_gain(int gain
);
339 static void cs_mksound(unsigned int hz
, unsigned int ticks
);
340 static void cs_nosound(unsigned long xx
);
342 /*** Mid level stuff *********************************************************/
345 static void sound_silence(void);
346 static void sound_init(void);
347 static int sound_set_format(int format
);
348 static int sound_set_speed(int speed
);
349 static int sound_set_stereo(int stereo
);
350 static int sound_set_volume(int volume
);
352 static ssize_t
sound_copy_translate(const u_char
*userPtr
,
354 u_char frame
[], ssize_t
*frameUsed
,
356 static ssize_t
sound_copy_translate_read(const u_char
*userPtr
,
358 u_char frame
[], ssize_t
*frameUsed
,
363 * /dev/mixer abstraction
371 static struct sound_mixer mixer
;
373 static struct sound_queue sq
;
374 static struct sound_queue read_sq
;
376 #define sq_block_address(i) (sq.buffers[i])
377 #define SIGNAL_RECEIVED (signal_pending(current))
378 #define NON_BLOCKING(open_mode) (open_mode & O_NONBLOCK)
379 #define ONE_SECOND HZ /* in jiffies (100ths of a second) */
380 #define NO_TIME_LIMIT 0xffffffff
392 static struct sound_state state
;
394 /*** Common stuff ********************************************************/
396 static long long sound_lseek(struct file
*file
, long long offset
, int orig
);
398 /*** Config & Setup **********************************************************/
400 void dmasound_setup(char *str
, int *ints
);
402 /*** Translations ************************************************************/
405 /* ++TeSche: radically changed for new expanding purposes...
407 * These two routines now deal with copying/expanding/translating the samples
408 * from user space into our buffer at the right frequency. They take care about
409 * how much data there's actually to read, how much buffer space there is and
410 * to convert samples into the right frequency/encoding. They will only work on
411 * complete samples so it may happen they leave some bytes in the input stream
412 * if the user didn't write a multiple of the current sample size. They both
413 * return the number of bytes they've used from both streams so you may detect
414 * such a situation. Luckily all programs should be able to cope with that.
416 * I think I've optimized anything as far as one can do in plain C, all
417 * variables should fit in registers and the loops are really short. There's
418 * one loop for every possible situation. Writing a more generalized and thus
419 * parameterized loop would only produce slower code. Feel free to optimize
420 * this in assembler if you like. :)
422 * I think these routines belong here because they're not yet really hardware
423 * independent, especially the fact that the Falcon can play 16bit samples
424 * only in stereo is hardcoded in both of them!
426 * ++geert: split in even more functions (one per format)
429 static ssize_t
cs4218_ct_law(const u_char
*userPtr
, size_t userCount
,
430 u_char frame
[], ssize_t
*frameUsed
,
433 short *table
= sound
.soft
.format
== AFMT_MU_LAW
? ulaw2dma16
: alaw2dma16
;
435 short *p
= (short *) &frame
[*frameUsed
];
436 int val
, stereo
= sound
.soft
.stereo
;
441 used
= count
= min(userCount
, frameLeft
);
444 if (get_user(data
, userPtr
++))
449 if (get_user(data
, userPtr
++))
456 *frameUsed
+= used
* 4;
457 return stereo
? used
* 2: used
;
461 static ssize_t
cs4218_ct_s8(const u_char
*userPtr
, size_t userCount
,
462 u_char frame
[], ssize_t
*frameUsed
,
466 short *p
= (short *) &frame
[*frameUsed
];
467 int val
, stereo
= sound
.soft
.stereo
;
472 used
= count
= min(userCount
, frameLeft
);
475 if (get_user(data
, userPtr
++))
480 if (get_user(data
, userPtr
++))
487 *frameUsed
+= used
* 4;
488 return stereo
? used
* 2: used
;
492 static ssize_t
cs4218_ct_u8(const u_char
*userPtr
, size_t userCount
,
493 u_char frame
[], ssize_t
*frameUsed
,
497 short *p
= (short *) &frame
[*frameUsed
];
498 int val
, stereo
= sound
.soft
.stereo
;
503 used
= count
= min(userCount
, frameLeft
);
506 if (get_user(data
, userPtr
++))
508 val
= (data
^ 0x80) << 8;
511 if (get_user(data
, userPtr
++))
513 val
= (data
^ 0x80) << 8;
518 *frameUsed
+= used
* 4;
519 return stereo
? used
* 2: used
;
523 /* This is the default format of the codec. Signed, 16-bit stereo
524 * generated by an application shouldn't have to be copied at all.
525 * We should just get the phsical address of the buffers and update
526 * the TDM BDs directly.
528 static ssize_t
cs4218_ct_s16(const u_char
*userPtr
, size_t userCount
,
529 u_char frame
[], ssize_t
*frameUsed
,
533 int stereo
= sound
.soft
.stereo
;
534 short *fp
= (short *) &frame
[*frameUsed
];
537 userCount
>>= (stereo
? 2: 1);
538 used
= count
= min(userCount
, frameLeft
);
540 short *up
= (short *) userPtr
;
543 if (get_user(data
, up
++))
550 if (copy_from_user(fp
, userPtr
, count
* 4))
553 *frameUsed
+= used
* 4;
554 return stereo
? used
* 4: used
* 2;
557 static ssize_t
cs4218_ct_u16(const u_char
*userPtr
, size_t userCount
,
558 u_char frame
[], ssize_t
*frameUsed
,
562 int mask
= (sound
.soft
.format
== AFMT_U16_LE
? 0x0080: 0x8000);
563 int stereo
= sound
.soft
.stereo
;
564 short *fp
= (short *) &frame
[*frameUsed
];
565 short *up
= (short *) userPtr
;
568 userCount
>>= (stereo
? 2: 1);
569 used
= count
= min(userCount
, frameLeft
);
572 if (get_user(data
, up
++))
577 if (get_user(data
, up
++))
584 *frameUsed
+= used
* 4;
585 return stereo
? used
* 4: used
* 2;
589 static ssize_t
cs4218_ctx_law(const u_char
*userPtr
, size_t userCount
,
590 u_char frame
[], ssize_t
*frameUsed
,
593 unsigned short *table
= (unsigned short *)
594 (sound
.soft
.format
== AFMT_MU_LAW
? ulaw2dma16
: alaw2dma16
);
595 unsigned int data
= expand_data
;
596 unsigned int *p
= (unsigned int *) &frame
[*frameUsed
];
597 int bal
= expand_bal
;
598 int hSpeed
= sound
.hard
.speed
, sSpeed
= sound
.soft
.speed
;
600 int stereo
= sound
.soft
.stereo
;
612 if (get_user(c
, userPtr
++))
616 if (get_user(c
, userPtr
++))
618 data
= (data
<< 16) + table
[c
];
620 data
= (data
<< 16) + data
;
630 *frameUsed
+= (ftotal
- frameLeft
) * 4;
632 return stereo
? utotal
* 2: utotal
;
636 static ssize_t
cs4218_ctx_s8(const u_char
*userPtr
, size_t userCount
,
637 u_char frame
[], ssize_t
*frameUsed
,
640 unsigned int *p
= (unsigned int *) &frame
[*frameUsed
];
641 unsigned int data
= expand_data
;
642 int bal
= expand_bal
;
643 int hSpeed
= sound
.hard
.speed
, sSpeed
= sound
.soft
.speed
;
644 int stereo
= sound
.soft
.stereo
;
657 if (get_user(c
, userPtr
++))
661 if (get_user(c
, userPtr
++))
663 data
= (data
<< 16) + (c
<< 8);
665 data
= (data
<< 16) + data
;
675 *frameUsed
+= (ftotal
- frameLeft
) * 4;
677 return stereo
? utotal
* 2: utotal
;
681 static ssize_t
cs4218_ctx_u8(const u_char
*userPtr
, size_t userCount
,
682 u_char frame
[], ssize_t
*frameUsed
,
685 unsigned int *p
= (unsigned int *) &frame
[*frameUsed
];
686 unsigned int data
= expand_data
;
687 int bal
= expand_bal
;
688 int hSpeed
= sound
.hard
.speed
, sSpeed
= sound
.soft
.speed
;
689 int stereo
= sound
.soft
.stereo
;
702 if (get_user(c
, userPtr
++))
704 data
= (c
^ 0x80) << 8;
706 if (get_user(c
, userPtr
++))
708 data
= (data
<< 16) + ((c
^ 0x80) << 8);
710 data
= (data
<< 16) + data
;
720 *frameUsed
+= (ftotal
- frameLeft
) * 4;
722 return stereo
? utotal
* 2: utotal
;
726 static ssize_t
cs4218_ctx_s16(const u_char
*userPtr
, size_t userCount
,
727 u_char frame
[], ssize_t
*frameUsed
,
730 unsigned int *p
= (unsigned int *) &frame
[*frameUsed
];
731 unsigned int data
= expand_data
;
732 unsigned short *up
= (unsigned short *) userPtr
;
733 int bal
= expand_bal
;
734 int hSpeed
= sound
.hard
.speed
, sSpeed
= sound
.soft
.speed
;
735 int stereo
= sound
.soft
.stereo
;
739 userCount
>>= (stereo
? 2: 1);
747 if (get_user(data
, up
++))
750 if (get_user(c
, up
++))
752 data
= (data
<< 16) + c
;
754 data
= (data
<< 16) + data
;
764 *frameUsed
+= (ftotal
- frameLeft
) * 4;
766 return stereo
? utotal
* 4: utotal
* 2;
770 static ssize_t
cs4218_ctx_u16(const u_char
*userPtr
, size_t userCount
,
771 u_char frame
[], ssize_t
*frameUsed
,
774 int mask
= (sound
.soft
.format
== AFMT_U16_LE
? 0x0080: 0x8000);
775 unsigned int *p
= (unsigned int *) &frame
[*frameUsed
];
776 unsigned int data
= expand_data
;
777 unsigned short *up
= (unsigned short *) userPtr
;
778 int bal
= expand_bal
;
779 int hSpeed
= sound
.hard
.speed
, sSpeed
= sound
.soft
.speed
;
780 int stereo
= sound
.soft
.stereo
;
784 userCount
>>= (stereo
? 2: 1);
792 if (get_user(data
, up
++))
796 if (get_user(c
, up
++))
798 data
= (data
<< 16) + (c
^ mask
);
800 data
= (data
<< 16) + data
;
810 *frameUsed
+= (ftotal
- frameLeft
) * 4;
812 return stereo
? utotal
* 4: utotal
* 2;
815 static ssize_t
cs4218_ct_s8_read(const u_char
*userPtr
, size_t userCount
,
816 u_char frame
[], ssize_t
*frameUsed
,
820 short *p
= (short *) &frame
[*frameUsed
];
821 int val
, stereo
= sound
.soft
.stereo
;
826 used
= count
= min(userCount
, frameLeft
);
832 if (put_user(data
, (u_char
*)userPtr
++))
837 if (put_user(data
, (u_char
*)userPtr
++))
843 *frameUsed
+= used
* 4;
844 return stereo
? used
* 2: used
;
848 static ssize_t
cs4218_ct_u8_read(const u_char
*userPtr
, size_t userCount
,
849 u_char frame
[], ssize_t
*frameUsed
,
853 short *p
= (short *) &frame
[*frameUsed
];
854 int val
, stereo
= sound
.soft
.stereo
;
859 used
= count
= min(userCount
, frameLeft
);
864 data
= (val
>> 8) ^ 0x80;
865 if (put_user(data
, (u_char
*)userPtr
++))
869 data
= (val
>> 8) ^ 0x80;
870 if (put_user(data
, (u_char
*)userPtr
++))
876 *frameUsed
+= used
* 4;
877 return stereo
? used
* 2: used
;
881 static ssize_t
cs4218_ct_s16_read(const u_char
*userPtr
, size_t userCount
,
882 u_char frame
[], ssize_t
*frameUsed
,
886 int stereo
= sound
.soft
.stereo
;
887 short *fp
= (short *) &frame
[*frameUsed
];
890 userCount
>>= (stereo
? 2: 1);
891 used
= count
= min(userCount
, frameLeft
);
893 short *up
= (short *) userPtr
;
897 if (put_user(data
, up
++))
903 if (copy_to_user((u_char
*)userPtr
, fp
, count
* 4))
906 *frameUsed
+= used
* 4;
907 return stereo
? used
* 4: used
* 2;
910 static ssize_t
cs4218_ct_u16_read(const u_char
*userPtr
, size_t userCount
,
911 u_char frame
[], ssize_t
*frameUsed
,
915 int mask
= (sound
.soft
.format
== AFMT_U16_LE
? 0x0080: 0x8000);
916 int stereo
= sound
.soft
.stereo
;
917 short *fp
= (short *) &frame
[*frameUsed
];
918 short *up
= (short *) userPtr
;
921 userCount
>>= (stereo
? 2: 1);
922 used
= count
= min(userCount
, frameLeft
);
928 if (put_user(data
, up
++))
933 if (put_user(data
, up
++))
939 *frameUsed
+= used
* 4;
940 return stereo
? used
* 4: used
* 2;
943 static TRANS transCSNormal
= {
944 cs4218_ct_law
, cs4218_ct_law
, cs4218_ct_s8
, cs4218_ct_u8
,
945 cs4218_ct_s16
, cs4218_ct_u16
, cs4218_ct_s16
, cs4218_ct_u16
948 static TRANS transCSExpand
= {
949 cs4218_ctx_law
, cs4218_ctx_law
, cs4218_ctx_s8
, cs4218_ctx_u8
,
950 cs4218_ctx_s16
, cs4218_ctx_u16
, cs4218_ctx_s16
, cs4218_ctx_u16
953 static TRANS transCSNormalRead
= {
954 NULL
, NULL
, cs4218_ct_s8_read
, cs4218_ct_u8_read
,
955 cs4218_ct_s16_read
, cs4218_ct_u16_read
,
956 cs4218_ct_s16_read
, cs4218_ct_u16_read
959 /*** Low level stuff *********************************************************/
961 static void *CS_Alloc(unsigned int size
, gfp_t flags
)
966 for (order
=0; order
< 5; order
++) {
971 return (void *)__get_free_pages(flags
, order
);
974 static void CS_Free(void *ptr
, unsigned int size
)
979 for (order
=0; order
< 5; order
++) {
984 free_pages((ulong
)ptr
, order
);
987 static int __init
CS_IrqInit(void)
989 cpm_install_handler(CPMVEC_SMC2
, cs4218_intr
, NULL
);
994 static void CS_IrqCleanup(void)
997 volatile cpm8xx_t
*cp
;
999 /* First disable transmitter and receiver.
1001 sp
= &cpmp
->cp_smc
[1];
1002 sp
->smc_smcmr
&= ~(SMCMR_REN
| SMCMR_TEN
);
1004 /* And now shut down the SMC.
1006 cp
= cpmp
; /* Get pointer to Communication Processor */
1007 cp
->cp_cpcr
= mk_cr_cmd(CPM_CR_CH_SMC2
,
1008 CPM_CR_STOP_TX
) | CPM_CR_FLG
;
1009 while (cp
->cp_cpcr
& CPM_CR_FLG
);
1011 /* Release the interrupt handler.
1013 cpm_free_handler(CPMVEC_SMC2
);
1016 kd_mksound
= orig_mksound
;
1020 static void CS_Silence(void)
1024 /* Disable transmitter.
1026 sp
= &cpmp
->cp_smc
[1];
1027 sp
->smc_smcmr
&= ~SMCMR_TEN
;
1030 /* Frequencies depend upon external oscillator. There are two
1031 * choices, 12.288 and 11.2896 MHz. The RPCG audio supports both through
1032 * and external control register selection bit.
1034 static int cs4218_freqs
[] = {
1035 /* 12.288 11.2896 */
1046 static void CS_Init(void)
1050 switch (sound
.soft
.format
) {
1053 sound
.hard
.format
= AFMT_S16_LE
;
1056 sound
.hard
.format
= AFMT_S16_BE
;
1059 sound
.hard
.stereo
= 1;
1060 sound
.hard
.size
= 16;
1063 * If we have a sample rate which is within catchRadius percent
1064 * of the requested value, we don't have to expand the samples.
1065 * Otherwise choose the next higher rate.
1067 i
= (sizeof(cs4218_freqs
) / sizeof(int));
1069 tolerance
= catchRadius
* cs4218_freqs
[--i
] / 100;
1070 } while (sound
.soft
.speed
> cs4218_freqs
[i
] + tolerance
&& i
> 0);
1071 if (sound
.soft
.speed
>= cs4218_freqs
[i
] - tolerance
)
1072 sound
.trans_write
= &transCSNormal
;
1074 sound
.trans_write
= &transCSExpand
;
1075 sound
.trans_read
= &transCSNormalRead
;
1076 sound
.hard
.speed
= cs4218_freqs
[i
];
1077 cs4218_rate_index
= i
;
1079 /* The CS4218 has seven selectable clock dividers for the sample
1080 * clock. The HIOX then provides one of two external rates.
1081 * An even numbered frequency table index uses the high external
1084 *(uint
*)HIOX_CSR4_ADDR
&= ~(HIOX_CSR4_AUDCLKHI
| HIOX_CSR4_AUDCLKSEL
);
1086 *(uint
*)HIOX_CSR4_ADDR
|= HIOX_CSR4_AUDCLKHI
;
1088 *(uint
*)HIOX_CSR4_ADDR
|= (i
& HIOX_CSR4_AUDCLKSEL
);
1090 expand_bal
= -sound
.soft
.speed
;
1093 static int CS_SetFormat(int format
)
1099 return sound
.soft
.format
;
1113 printk(KERN_ERR
"dmasound: unknown format 0x%x, using AFMT_U8\n",
1119 sound
.soft
.format
= format
;
1120 sound
.soft
.size
= size
;
1121 if (sound
.minDev
== SND_DEV_DSP
) {
1122 sound
.dsp
.format
= format
;
1123 sound
.dsp
.size
= size
;
1131 /* Volume is the amount of attenuation we tell the codec to impose
1132 * on the outputs. There are 32 levels, with 0 the "loudest".
1134 #define CS_VOLUME_TO_MASK(x) (31 - ((((x) - 1) * 31) / 99))
1135 #define CS_MASK_TO_VOLUME(y) (100 - ((y) * 99 / 31))
1137 static int cs_get_volume(uint reg
)
1141 volume
= CS_MASK_TO_VOLUME(CS_LATTEN_GET(reg
));
1142 volume
|= CS_MASK_TO_VOLUME(CS_RATTEN_GET(reg
)) << 8;
1146 static int cs_volume_setter(int volume
, int mute
)
1150 if (mute
&& volume
== 0) {
1151 tempctl
= cs4218_control
| CS_MUTE
;
1153 tempctl
= cs4218_control
& ~CS_MUTE
;
1154 tempctl
= tempctl
& ~(CS_LATTEN
| CS_RATTEN
);
1155 tempctl
|= CS_LATTEN_SET(CS_VOLUME_TO_MASK(volume
& 0xff));
1156 tempctl
|= CS_RATTEN_SET(CS_VOLUME_TO_MASK((volume
>> 8) & 0xff));
1157 volume
= cs_get_volume(tempctl
);
1159 if (tempctl
!= cs4218_control
) {
1160 cs4218_ctl_write(tempctl
);
1166 /* Gain has 16 steps from 0 to 15. These are in 1.5dB increments from
1167 * 0 (no gain) to 22.5 dB.
1169 #define CS_RECLEVEL_TO_GAIN(v) \
1170 ((v) < 0 ? 0 : (v) > 100 ? 15 : (v) * 3 / 20)
1171 #define CS_GAIN_TO_RECLEVEL(v) (((v) * 20 + 2) / 3)
1173 static int cs_get_gain(uint reg
)
1177 gain
= CS_GAIN_TO_RECLEVEL(CS_LGAIN_GET(reg
));
1178 gain
|= CS_GAIN_TO_RECLEVEL(CS_RGAIN_GET(reg
)) << 8;
1182 static int cs_set_gain(int gain
)
1186 tempctl
= cs4218_control
& ~(CS_LGAIN
| CS_RGAIN
);
1187 tempctl
|= CS_LGAIN_SET(CS_RECLEVEL_TO_GAIN(gain
& 0xff));
1188 tempctl
|= CS_RGAIN_SET(CS_RECLEVEL_TO_GAIN((gain
>> 8) & 0xff));
1189 gain
= cs_get_gain(tempctl
);
1191 if (tempctl
!= cs4218_control
) {
1192 cs4218_ctl_write(tempctl
);
1197 static int CS_SetVolume(int volume
)
1199 return cs_volume_setter(volume
, CS_MUTE
);
1202 static void CS_Play(void)
1205 unsigned long flags
;
1206 volatile cbd_t
*bdp
;
1207 volatile cpm8xx_t
*cp
;
1209 /* Protect buffer */
1210 spin_lock_irqsave(&cs4218_lock
, flags
);
1212 if (awacs_beep_state
) {
1213 /* sound takes precedence over beeps */
1214 out_le32(&awacs_txdma
->control
, (RUN
|PAUSE
|FLUSH
|WAKE
) << 16);
1215 out_le32(&awacs
->control
,
1216 (in_le32(&awacs
->control
) & ~0x1f00)
1217 | (awacs_rate_index
<< 8));
1218 out_le32(&awacs
->byteswap
, sound
.hard
.format
!= AFMT_S16_BE
);
1219 out_le32(&awacs_txdma
->cmdptr
, virt_to_bus(&(awacs_tx_cmds
[(sq
.front
+sq
.active
) % sq
.max_count
])));
1222 awacs_beep_state
= 0;
1225 i
= sq
.front
+ sq
.active
;
1226 if (i
>= sq
.max_count
)
1228 while (sq
.active
< 2 && sq
.active
< sq
.count
) {
1229 count
= (sq
.count
== sq
.active
+ 1)?sq
.rear_size
:sq
.block_size
;
1230 if (count
< sq
.block_size
&& !sq
.syncing
)
1231 /* last block not yet filled, and we're not syncing. */
1235 bdp
->cbd_datlen
= count
;
1237 flush_dcache_range((ulong
)sound_buffers
[i
],
1238 (ulong
)(sound_buffers
[i
] + count
));
1240 if (++i
>= sq
.max_count
)
1243 if (sq
.active
== 0) {
1244 /* The SMC does not load its fifo until the first
1245 * TDM frame pulse, so the transmit data gets shifted
1246 * by one word. To compensate for this, we incorrectly
1247 * transmit the first buffer and shorten it by one
1248 * word. Subsequent buffers are then aligned properly.
1250 bdp
->cbd_datlen
-= 2;
1252 /* Start up the SMC Transmitter.
1255 cp
->cp_smc
[1].smc_smcmr
|= SMCMR_TEN
;
1256 cp
->cp_cpcr
= mk_cr_cmd(CPM_CR_CH_SMC2
,
1257 CPM_CR_RESTART_TX
) | CPM_CR_FLG
;
1258 while (cp
->cp_cpcr
& CPM_CR_FLG
);
1261 /* Buffer is ready now.
1263 bdp
->cbd_sc
|= BD_SC_READY
;
1267 spin_unlock_irqrestore(&cs4218_lock
, flags
);
1271 static void CS_Record(void)
1273 unsigned long flags
;
1279 /* Protect buffer */
1280 spin_lock_irqsave(&cs4218_lock
, flags
);
1282 /* This is all we have to do......Just start it up.
1284 sp
= &cpmp
->cp_smc
[1];
1285 sp
->smc_smcmr
|= SMCMR_REN
;
1289 spin_unlock_irqrestore(&cs4218_lock
, flags
);
1294 cs4218_tdm_tx_intr(void *devid
)
1297 volatile cbd_t
*bdp
;
1299 while (sq
.active
> 0) {
1301 if (bdp
->cbd_sc
& BD_SC_READY
)
1302 break; /* this frame is still going */
1305 if (++i
>= sq
.max_count
)
1309 WAKE_UP(sq
.action_queue
);
1315 WAKE_UP(sq
.sync_queue
);
1320 cs4218_tdm_rx_intr(void *devid
)
1323 /* We want to blow 'em off when shutting down.
1325 if (read_sq
.active
== 0)
1328 /* Check multiple buffers in case we were held off from
1329 * interrupt processing for a long time. Geeze, I really hope
1330 * this doesn't happen.
1332 while ((rx_base
[read_sq
.rear
].cbd_sc
& BD_SC_EMPTY
) == 0) {
1334 /* Invalidate the data cache range for this buffer.
1336 invalidate_dcache_range(
1337 (uint
)(sound_read_buffers
[read_sq
.rear
]),
1338 (uint
)(sound_read_buffers
[read_sq
.rear
] + read_sq
.block_size
));
1340 /* Make buffer available again and move on.
1342 rx_base
[read_sq
.rear
].cbd_sc
|= BD_SC_EMPTY
;
1345 /* Wrap the buffer ring.
1347 if (read_sq
.rear
>= read_sq
.max_active
)
1350 /* If we have caught up to the front buffer, bump it.
1351 * This will cause weird (but not fatal) results if the
1352 * read loop is currently using this buffer. The user is
1353 * behind in this case anyway, so weird things are going
1356 if (read_sq
.rear
== read_sq
.front
) {
1358 if (read_sq
.front
>= read_sq
.max_active
)
1363 WAKE_UP(read_sq
.action_queue
);
1366 static void cs_nosound(unsigned long xx
)
1368 unsigned long flags
;
1370 /* not sure if this is needed, since hardware command is #if 0'd */
1371 spin_lock_irqsave(&cs4218_lock
, flags
);
1374 st_le16(&beep_dbdma_cmd
->command
, DBDMA_STOP
);
1378 spin_unlock_irqrestore(&cs4218_lock
, flags
);
1381 static DEFINE_TIMER(beep_timer
, cs_nosound
, 0, 0);
1384 static void cs_mksound(unsigned int hz
, unsigned int ticks
)
1386 unsigned long flags
;
1387 int beep_speed
= BEEP_SPEED
;
1388 int srate
= cs4218_freqs
[beep_speed
];
1389 int period
, ncycles
, nsamples
;
1392 static int beep_hz_cache
;
1393 static int beep_nsamples_cache
;
1394 static int beep_volume_cache
;
1396 if (hz
<= srate
/ BEEP_BUFLEN
|| hz
> srate
/ 2) {
1398 /* this is a hack for broken X server code */
1402 /* cancel beep currently playing */
1407 /* lock while modifying beep_timer */
1408 spin_lock_irqsave(&cs4218_lock
, flags
);
1409 del_timer(&beep_timer
);
1411 beep_timer
.expires
= jiffies
+ ticks
;
1412 add_timer(&beep_timer
);
1414 if (beep_playing
|| sq
.active
|| beep_buf
== NULL
) {
1415 spin_unlock_irqrestore(&cs4218_lock
, flags
);
1416 return; /* too hard, sorry :-( */
1420 st_le16(&beep_dbdma_cmd
->command
, OUTPUT_MORE
+ BR_ALWAYS
);
1422 spin_unlock_irqrestore(&cs4218_lock
, flags
);
1424 if (hz
== beep_hz_cache
&& beep_volume
== beep_volume_cache
) {
1425 nsamples
= beep_nsamples_cache
;
1427 period
= srate
* 256 / hz
; /* fixed point */
1428 ncycles
= BEEP_BUFLEN
* 256 / period
;
1429 nsamples
= (period
* ncycles
) >> 8;
1430 f
= ncycles
* 65536 / nsamples
;
1433 for (i
= 0; i
< nsamples
; ++i
, p
+= 2) {
1434 p
[0] = p
[1] = beep_wform
[j
>> 8] * beep_volume
;
1435 j
= (j
+ f
) & 0xffff;
1438 beep_volume_cache
= beep_volume
;
1439 beep_nsamples_cache
= nsamples
;
1443 st_le16(&beep_dbdma_cmd
->req_count
, nsamples
*4);
1444 st_le16(&beep_dbdma_cmd
->xfer_status
, 0);
1445 st_le32(&beep_dbdma_cmd
->cmd_dep
, virt_to_bus(beep_dbdma_cmd
));
1446 st_le32(&beep_dbdma_cmd
->phy_addr
, virt_to_bus(beep_buf
));
1447 awacs_beep_state
= 1;
1449 spin_lock_irqsave(&cs4218_lock
, flags
);
1450 if (beep_playing
) { /* i.e. haven't been terminated already */
1451 out_le32(&awacs_txdma
->control
, (RUN
|WAKE
|FLUSH
|PAUSE
) << 16);
1452 out_le32(&awacs
->control
,
1453 (in_le32(&awacs
->control
) & ~0x1f00)
1454 | (beep_speed
<< 8));
1455 out_le32(&awacs
->byteswap
, 0);
1456 out_le32(&awacs_txdma
->cmdptr
, virt_to_bus(beep_dbdma_cmd
));
1457 out_le32(&awacs_txdma
->control
, RUN
| (RUN
<< 16));
1459 spin_unlock_irqrestore(&cs4218_lock
, flags
);
1463 static MACHINE mach_cs4218
= {
1464 .owner
= THIS_MODULE
,
1465 .name
= "HIOX CS4218",
1466 .name2
= "Built-in Sound",
1467 .dma_alloc
= CS_Alloc
,
1468 .dma_free
= CS_Free
,
1469 .irqinit
= CS_IrqInit
,
1471 .irqcleanup
= CS_IrqCleanup
,
1474 .silence
= CS_Silence
,
1475 .setFormat
= CS_SetFormat
,
1476 .setVolume
= CS_SetVolume
,
1481 /*** Mid level stuff *********************************************************/
1484 static void sound_silence(void)
1486 /* update hardware settings one more */
1487 (*sound
.mach
.init
)();
1489 (*sound
.mach
.silence
)();
1493 static void sound_init(void)
1495 (*sound
.mach
.init
)();
1499 static int sound_set_format(int format
)
1501 return(*sound
.mach
.setFormat
)(format
);
1505 static int sound_set_speed(int speed
)
1508 return(sound
.soft
.speed
);
1510 sound
.soft
.speed
= speed
;
1511 (*sound
.mach
.init
)();
1512 if (sound
.minDev
== SND_DEV_DSP
)
1513 sound
.dsp
.speed
= sound
.soft
.speed
;
1515 return(sound
.soft
.speed
);
1519 static int sound_set_stereo(int stereo
)
1522 return(sound
.soft
.stereo
);
1524 stereo
= !!stereo
; /* should be 0 or 1 now */
1526 sound
.soft
.stereo
= stereo
;
1527 if (sound
.minDev
== SND_DEV_DSP
)
1528 sound
.dsp
.stereo
= stereo
;
1529 (*sound
.mach
.init
)();
1535 static int sound_set_volume(int volume
)
1537 return(*sound
.mach
.setVolume
)(volume
);
1540 static ssize_t
sound_copy_translate(const u_char
*userPtr
,
1542 u_char frame
[], ssize_t
*frameUsed
,
1545 ssize_t (*ct_func
)(const u_char
*, size_t, u_char
*, ssize_t
*, ssize_t
) = NULL
;
1547 switch (sound
.soft
.format
) {
1549 ct_func
= sound
.trans_write
->ct_ulaw
;
1552 ct_func
= sound
.trans_write
->ct_alaw
;
1555 ct_func
= sound
.trans_write
->ct_s8
;
1558 ct_func
= sound
.trans_write
->ct_u8
;
1561 ct_func
= sound
.trans_write
->ct_s16be
;
1564 ct_func
= sound
.trans_write
->ct_u16be
;
1567 ct_func
= sound
.trans_write
->ct_s16le
;
1570 ct_func
= sound
.trans_write
->ct_u16le
;
1574 return ct_func(userPtr
, userCount
, frame
, frameUsed
, frameLeft
);
1579 static ssize_t
sound_copy_translate_read(const u_char
*userPtr
,
1581 u_char frame
[], ssize_t
*frameUsed
,
1584 ssize_t (*ct_func
)(const u_char
*, size_t, u_char
*, ssize_t
*, ssize_t
) = NULL
;
1586 switch (sound
.soft
.format
) {
1588 ct_func
= sound
.trans_read
->ct_ulaw
;
1591 ct_func
= sound
.trans_read
->ct_alaw
;
1594 ct_func
= sound
.trans_read
->ct_s8
;
1597 ct_func
= sound
.trans_read
->ct_u8
;
1600 ct_func
= sound
.trans_read
->ct_s16be
;
1603 ct_func
= sound
.trans_read
->ct_u16be
;
1606 ct_func
= sound
.trans_read
->ct_s16le
;
1609 ct_func
= sound
.trans_read
->ct_u16le
;
1613 return ct_func(userPtr
, userCount
, frame
, frameUsed
, frameLeft
);
1620 * /dev/mixer abstraction
1623 static int mixer_open(struct inode
*inode
, struct file
*file
)
1626 return nonseekable_open(inode
, file
);
1630 static int mixer_release(struct inode
*inode
, struct file
*file
)
1637 static int mixer_ioctl(struct inode
*inode
, struct file
*file
, u_int cmd
,
1643 if (_SIOC_DIR(cmd
) & _SIOC_WRITE
)
1644 mixer
.modify_counter
++;
1645 if (cmd
== OSS_GETVERSION
)
1646 return IOCTL_OUT(arg
, SOUND_VERSION
);
1648 case SOUND_MIXER_INFO
: {
1650 strlcpy(info
.id
, "CS4218_TDM", sizeof(info
.id
));
1651 strlcpy(info
.name
, "CS4218_TDM", sizeof(info
.name
));
1652 info
.name
[sizeof(info
.name
)-1] = 0;
1653 info
.modify_counter
= mixer
.modify_counter
;
1654 if (copy_to_user((int *)arg
, &info
, sizeof(info
)))
1658 case SOUND_MIXER_READ_DEVMASK
:
1659 data
= SOUND_MASK_VOLUME
| SOUND_MASK_LINE
1660 | SOUND_MASK_MIC
| SOUND_MASK_RECLEV
1661 | SOUND_MASK_ALTPCM
;
1662 return IOCTL_OUT(arg
, data
);
1663 case SOUND_MIXER_READ_RECMASK
:
1664 data
= SOUND_MASK_LINE
| SOUND_MASK_MIC
;
1665 return IOCTL_OUT(arg
, data
);
1666 case SOUND_MIXER_READ_RECSRC
:
1667 if (cs4218_control
& CS_DO1
)
1668 data
= SOUND_MASK_LINE
;
1670 data
= SOUND_MASK_MIC
;
1671 return IOCTL_OUT(arg
, data
);
1672 case SOUND_MIXER_WRITE_RECSRC
:
1673 IOCTL_IN(arg
, data
);
1674 data
&= (SOUND_MASK_LINE
| SOUND_MASK_MIC
);
1675 if (data
& SOUND_MASK_LINE
)
1676 tmpcs
= cs4218_control
|
1677 (CS_ISL
| CS_ISR
| CS_DO1
);
1678 if (data
& SOUND_MASK_MIC
)
1679 tmpcs
= cs4218_control
&
1680 ~(CS_ISL
| CS_ISR
| CS_DO1
);
1681 if (tmpcs
!= cs4218_control
)
1682 cs4218_ctl_write(tmpcs
);
1683 return IOCTL_OUT(arg
, data
);
1684 case SOUND_MIXER_READ_STEREODEVS
:
1685 data
= SOUND_MASK_VOLUME
| SOUND_MASK_RECLEV
;
1686 return IOCTL_OUT(arg
, data
);
1687 case SOUND_MIXER_READ_CAPS
:
1688 return IOCTL_OUT(arg
, 0);
1689 case SOUND_MIXER_READ_VOLUME
:
1690 data
= (cs4218_control
& CS_MUTE
)? 0:
1691 cs_get_volume(cs4218_control
);
1692 return IOCTL_OUT(arg
, data
);
1693 case SOUND_MIXER_WRITE_VOLUME
:
1694 IOCTL_IN(arg
, data
);
1695 return IOCTL_OUT(arg
, sound_set_volume(data
));
1696 case SOUND_MIXER_WRITE_ALTPCM
: /* really bell volume */
1697 IOCTL_IN(arg
, data
);
1698 beep_volume
= data
& 0xff;
1700 case SOUND_MIXER_READ_ALTPCM
:
1701 return IOCTL_OUT(arg
, beep_volume
);
1702 case SOUND_MIXER_WRITE_RECLEV
:
1703 IOCTL_IN(arg
, data
);
1704 data
= cs_set_gain(data
);
1705 return IOCTL_OUT(arg
, data
);
1706 case SOUND_MIXER_READ_RECLEV
:
1707 data
= cs_get_gain(cs4218_control
);
1708 return IOCTL_OUT(arg
, data
);
1715 static struct file_operations mixer_fops
=
1717 .owner
= THIS_MODULE
,
1718 .llseek
= sound_lseek
,
1719 .ioctl
= mixer_ioctl
,
1721 .release
= mixer_release
,
1725 static void __init
mixer_init(void)
1727 mixer_unit
= register_sound_mixer(&mixer_fops
, -1);
1735 /* Set Line input, no gain, no attenuation.
1737 cs4218_control
= CS_ISL
| CS_ISR
| CS_DO1
;
1738 cs4218_control
|= CS_LGAIN_SET(0) | CS_RGAIN_SET(0);
1739 cs4218_control
|= CS_LATTEN_SET(0) | CS_RATTEN_SET(0);
1740 cs4218_ctl_write(cs4218_control
);
1745 * Sound queue stuff, the heart of the driver
1749 static int sq_allocate_buffers(void)
1755 sound_buffers
= kmalloc (numBufs
* sizeof(char *), GFP_KERNEL
);
1758 for (i
= 0; i
< numBufs
; i
++) {
1759 sound_buffers
[i
] = sound
.mach
.dma_alloc (bufSize
<< 10, GFP_KERNEL
);
1760 if (!sound_buffers
[i
]) {
1762 sound
.mach
.dma_free (sound_buffers
[i
], bufSize
<< 10);
1763 kfree (sound_buffers
);
1772 static void sq_release_buffers(void)
1776 if (sound_buffers
) {
1777 for (i
= 0; i
< numBufs
; i
++)
1778 sound
.mach
.dma_free (sound_buffers
[i
], bufSize
<< 10);
1779 kfree (sound_buffers
);
1785 static int sq_allocate_read_buffers(void)
1789 if (sound_read_buffers
)
1791 sound_read_buffers
= kmalloc(numReadBufs
* sizeof(char *), GFP_KERNEL
);
1792 if (!sound_read_buffers
)
1794 for (i
= 0; i
< numBufs
; i
++) {
1795 sound_read_buffers
[i
] = sound
.mach
.dma_alloc (readbufSize
<<10,
1797 if (!sound_read_buffers
[i
]) {
1799 sound
.mach
.dma_free (sound_read_buffers
[i
],
1801 kfree (sound_read_buffers
);
1802 sound_read_buffers
= 0;
1809 static void sq_release_read_buffers(void)
1813 if (sound_read_buffers
) {
1814 cpmp
->cp_smc
[1].smc_smcmr
&= ~SMCMR_REN
;
1815 for (i
= 0; i
< numReadBufs
; i
++)
1816 sound
.mach
.dma_free (sound_read_buffers
[i
],
1818 kfree (sound_read_buffers
);
1819 sound_read_buffers
= 0;
1824 static void sq_setup(int numBufs
, int bufSize
, char **write_buffers
)
1827 volatile cbd_t
*bdp
;
1828 volatile cpm8xx_t
*cp
;
1831 /* Make sure the SMC transmit is shut down.
1834 sp
= &cpmp
->cp_smc
[1];
1835 sp
->smc_smcmr
&= ~SMCMR_TEN
;
1837 sq
.max_count
= numBufs
;
1838 sq
.max_active
= numBufs
;
1839 sq
.block_size
= bufSize
;
1840 sq
.buffers
= write_buffers
;
1842 sq
.front
= sq
.count
= 0;
1848 for (i
=0; i
<numBufs
; i
++) {
1849 bdp
->cbd_bufaddr
= virt_to_bus(write_buffers
[i
]);
1853 /* This causes the SMC to sync up with the first buffer again.
1855 cp
->cp_cpcr
= mk_cr_cmd(CPM_CR_CH_SMC2
, CPM_CR_INIT_TX
) | CPM_CR_FLG
;
1856 while (cp
->cp_cpcr
& CPM_CR_FLG
);
1859 static void read_sq_setup(int numBufs
, int bufSize
, char **read_buffers
)
1862 volatile cbd_t
*bdp
;
1863 volatile cpm8xx_t
*cp
;
1866 /* Make sure the SMC receive is shut down.
1869 sp
= &cpmp
->cp_smc
[1];
1870 sp
->smc_smcmr
&= ~SMCMR_REN
;
1872 read_sq
.max_count
= numBufs
;
1873 read_sq
.max_active
= numBufs
;
1874 read_sq
.block_size
= bufSize
;
1875 read_sq
.buffers
= read_buffers
;
1877 read_sq
.front
= read_sq
.count
= 0;
1879 read_sq
.rear_size
= 0;
1880 read_sq
.syncing
= 0;
1884 for (i
=0; i
<numReadBufs
; i
++) {
1885 bdp
->cbd_bufaddr
= virt_to_bus(read_buffers
[i
]);
1886 bdp
->cbd_datlen
= read_sq
.block_size
;
1890 /* This causes the SMC to sync up with the first buffer again.
1892 cp
->cp_cpcr
= mk_cr_cmd(CPM_CR_CH_SMC2
, CPM_CR_INIT_RX
) | CPM_CR_FLG
;
1893 while (cp
->cp_cpcr
& CPM_CR_FLG
);
1897 static void sq_play(void)
1899 (*sound
.mach
.play
)();
1903 /* ++TeSche: radically changed this one too */
1905 static ssize_t
sq_write(struct file
*file
, const char *src
, size_t uLeft
,
1908 ssize_t uWritten
= 0;
1910 ssize_t uUsed
, bUsed
, bLeft
;
1912 /* ++TeSche: Is something like this necessary?
1913 * Hey, that's an honest question! Or does any other part of the
1914 * filesystem already checks this situation? I really don't know.
1919 /* The interrupt doesn't start to play the last, incomplete frame.
1920 * Thus we can append to it without disabling the interrupts! (Note
1921 * also that sq.rear isn't affected by the interrupt.)
1924 if (sq
.count
> 0 && (bLeft
= sq
.block_size
-sq
.rear_size
) > 0) {
1925 dest
= sq_block_address(sq
.rear
);
1926 bUsed
= sq
.rear_size
;
1927 uUsed
= sound_copy_translate(src
, uLeft
, dest
, &bUsed
, bLeft
);
1933 sq
.rear_size
= bUsed
;
1937 while (sq
.count
== sq
.max_active
) {
1939 if (NON_BLOCKING(sq
.open_mode
))
1940 return uWritten
> 0 ? uWritten
: -EAGAIN
;
1941 SLEEP(sq
.action_queue
);
1942 if (SIGNAL_RECEIVED
)
1943 return uWritten
> 0 ? uWritten
: -EINTR
;
1946 /* Here, we can avoid disabling the interrupt by first
1947 * copying and translating the data, and then updating
1948 * the sq variables. Until this is done, the interrupt
1949 * won't see the new frame and we can work on it
1953 dest
= sq_block_address((sq
.rear
+1) % sq
.max_count
);
1955 bLeft
= sq
.block_size
;
1956 uUsed
= sound_copy_translate(src
, uLeft
, dest
, &bUsed
, bLeft
);
1963 sq
.rear
= (sq
.rear
+1) % sq
.max_count
;
1964 sq
.rear_size
= bUsed
;
1967 } while (bUsed
); /* uUsed may have been 0 */
1971 return uUsed
< 0? uUsed
: uWritten
;
1977 /* Here is how the values are used for reading.
1978 * The value 'active' simply indicates the DMA is running. This is
1979 * done so the driver semantics are DMA starts when the first read is
1980 * posted. The value 'front' indicates the buffer we should next
1981 * send to the user. The value 'rear' indicates the buffer the DMA is
1982 * currently filling. When 'front' == 'rear' the buffer "ring" is
1983 * empty (we always have an empty available). The 'rear_size' is used
1984 * to track partial offsets into the current buffer. Right now, I just keep
1985 * The DMA running. If the reader can't keep up, the interrupt tosses
1986 * the oldest buffer. We could also shut down the DMA in this case.
1988 static ssize_t
sq_read(struct file
*file
, char *dst
, size_t uLeft
,
1992 ssize_t uRead
, bLeft
, bUsed
, uUsed
;
1997 if (!read_sq
.active
)
1998 CS_Record(); /* Kick off the record process. */
2002 /* Move what the user requests, depending upon other options.
2006 /* When front == rear, the DMA is not done yet.
2008 while (read_sq
.front
== read_sq
.rear
) {
2009 if (NON_BLOCKING(read_sq
.open_mode
)) {
2010 return uRead
> 0 ? uRead
: -EAGAIN
;
2012 SLEEP(read_sq
.action_queue
);
2013 if (SIGNAL_RECEIVED
)
2014 return uRead
> 0 ? uRead
: -EINTR
;
2017 /* The amount we move is either what is left in the
2018 * current buffer or what the user wants.
2020 bLeft
= read_sq
.block_size
- read_sq
.rear_size
;
2021 bUsed
= read_sq
.rear_size
;
2022 uUsed
= sound_copy_translate_read(dst
, uLeft
,
2023 read_sq
.buffers
[read_sq
.front
], &bUsed
, bLeft
);
2029 read_sq
.rear_size
+= bUsed
;
2030 if (read_sq
.rear_size
>= read_sq
.block_size
) {
2031 read_sq
.rear_size
= 0;
2033 if (read_sq
.front
>= read_sq
.max_active
)
2040 static int sq_open(struct inode
*inode
, struct file
*file
)
2044 if (file
->f_mode
& FMODE_WRITE
) {
2047 if (NON_BLOCKING(file
->f_flags
))
2051 SLEEP(sq
.open_queue
);
2052 if (SIGNAL_RECEIVED
)
2056 sq
.busy
= 1; /* Let's play spot-the-race-condition */
2058 if (sq_allocate_buffers()) goto err_out_nobusy
;
2060 sq_setup(numBufs
, bufSize
<<10,sound_buffers
);
2061 sq
.open_mode
= file
->f_mode
;
2065 if (file
->f_mode
& FMODE_READ
) {
2068 if (NON_BLOCKING(file
->f_flags
))
2071 while (read_sq
.busy
) {
2072 SLEEP(read_sq
.open_queue
);
2073 if (SIGNAL_RECEIVED
)
2079 if (sq_allocate_read_buffers()) goto err_out_nobusy
;
2081 read_sq_setup(numReadBufs
,readbufSize
<<10, sound_read_buffers
);
2082 read_sq
.open_mode
= file
->f_mode
;
2085 /* Start up the 4218 by:
2089 *((volatile uint
*)HIOX_CSR4_ADDR
) &= ~HIOX_CSR4_RSTAUDIO
;
2091 *((volatile uint
*)HIOX_CSR4_ADDR
) |= HIOX_CSR4_ENAUDIO
;
2093 *((volatile uint
*)HIOX_CSR4_ADDR
) |= HIOX_CSR4_RSTAUDIO
;
2095 /* We need to send the current control word in case someone
2096 * opened /dev/mixer and changed things while we were shut
2097 * down. Chances are good the initialization that follows
2098 * would have done this, but it is still possible it wouldn't.
2100 cs4218_ctl_write(cs4218_control
);
2102 sound
.minDev
= iminor(inode
) & 0x0f;
2103 sound
.soft
= sound
.dsp
;
2104 sound
.hard
= sound
.dsp
;
2106 if ((iminor(inode
) & 0x0f) == SND_DEV_AUDIO
) {
2107 sound_set_speed(8000);
2108 sound_set_stereo(0);
2109 sound_set_format(AFMT_MU_LAW
);
2112 return nonseekable_open(inode
, file
);
2115 if (file
->f_mode
& FMODE_WRITE
) {
2117 WAKE_UP(sq
.open_queue
);
2119 if (file
->f_mode
& FMODE_READ
) {
2121 WAKE_UP(read_sq
.open_queue
);
2128 static void sq_reset(void)
2133 sq
.front
= (sq
.rear
+1) % sq
.max_count
;
2140 static int sq_fsync(struct file
*filp
, struct dentry
*dentry
)
2145 sq_play(); /* there may be an incomplete frame waiting */
2148 SLEEP(sq
.sync_queue
);
2149 if (SIGNAL_RECEIVED
) {
2150 /* While waiting for audio output to drain, an
2151 * interrupt occurred. Stop audio output immediately
2152 * and clear the queue. */
2163 static int sq_release(struct inode
*inode
, struct file
*file
)
2168 rc
= sq_fsync(file
, file
->f_dentry
);
2169 sound
.soft
= sound
.dsp
;
2170 sound
.hard
= sound
.dsp
;
2173 sq_release_read_buffers();
2174 sq_release_buffers();
2176 if (file
->f_mode
& FMODE_READ
) {
2178 WAKE_UP(read_sq
.open_queue
);
2181 if (file
->f_mode
& FMODE_WRITE
) {
2183 WAKE_UP(sq
.open_queue
);
2186 /* Shut down the SMC.
2188 cpmp
->cp_smc
[1].smc_smcmr
&= ~(SMCMR_TEN
| SMCMR_REN
);
2190 /* Shut down the codec.
2192 *((volatile uint
*)HIOX_CSR4_ADDR
) |= HIOX_CSR4_RSTAUDIO
;
2194 *((volatile uint
*)HIOX_CSR4_ADDR
) &= ~HIOX_CSR4_ENAUDIO
;
2196 /* Wake up a process waiting for the queue being released.
2197 * Note: There may be several processes waiting for a call
2198 * to open() returning. */
2204 static int sq_ioctl(struct inode
*inode
, struct file
*file
, u_int cmd
,
2216 case SNDCTL_DSP_RESET
:
2219 case SNDCTL_DSP_POST
:
2220 case SNDCTL_DSP_SYNC
:
2221 return sq_fsync(file
, file
->f_dentry
);
2223 /* ++TeSche: before changing any of these it's
2224 * probably wise to wait until sound playing has
2226 case SNDCTL_DSP_SPEED
:
2227 sq_fsync(file
, file
->f_dentry
);
2228 IOCTL_IN(arg
, data
);
2229 return IOCTL_OUT(arg
, sound_set_speed(data
));
2230 case SNDCTL_DSP_STEREO
:
2231 sq_fsync(file
, file
->f_dentry
);
2232 IOCTL_IN(arg
, data
);
2233 return IOCTL_OUT(arg
, sound_set_stereo(data
));
2234 case SOUND_PCM_WRITE_CHANNELS
:
2235 sq_fsync(file
, file
->f_dentry
);
2236 IOCTL_IN(arg
, data
);
2237 return IOCTL_OUT(arg
, sound_set_stereo(data
-1)+1);
2238 case SNDCTL_DSP_SETFMT
:
2239 sq_fsync(file
, file
->f_dentry
);
2240 IOCTL_IN(arg
, data
);
2241 return IOCTL_OUT(arg
, sound_set_format(data
));
2242 case SNDCTL_DSP_GETFMTS
:
2244 if (sound
.trans_write
) {
2245 if (sound
.trans_write
->ct_ulaw
)
2247 if (sound
.trans_write
->ct_alaw
)
2249 if (sound
.trans_write
->ct_s8
)
2251 if (sound
.trans_write
->ct_u8
)
2253 if (sound
.trans_write
->ct_s16be
)
2255 if (sound
.trans_write
->ct_u16be
)
2257 if (sound
.trans_write
->ct_s16le
)
2259 if (sound
.trans_write
->ct_u16le
)
2262 return IOCTL_OUT(arg
, fmt
);
2263 case SNDCTL_DSP_GETBLKSIZE
:
2264 size
= sq
.block_size
2265 * sound
.soft
.size
* (sound
.soft
.stereo
+ 1)
2266 / (sound
.hard
.size
* (sound
.hard
.stereo
+ 1));
2267 return IOCTL_OUT(arg
, size
);
2268 case SNDCTL_DSP_SUBDIVIDE
:
2270 #if 0 /* Sorry can't do this at the moment. The CPM allocated buffers
2271 * long ago that can't be changed.
2273 case SNDCTL_DSP_SETFRAGMENT
:
2274 if (sq
.count
|| sq
.active
|| sq
.syncing
)
2276 IOCTL_IN(arg
, size
);
2278 if (nbufs
< 2 || nbufs
> numBufs
)
2281 if (size
>= 8 && size
<= 30) {
2283 size
*= sound
.hard
.size
* (sound
.hard
.stereo
+ 1);
2284 size
/= sound
.soft
.size
* (sound
.soft
.stereo
+ 1);
2285 if (size
> (bufSize
<< 10))
2286 size
= bufSize
<< 10;
2288 size
= bufSize
<< 10;
2289 sq_setup(numBufs
, size
, sound_buffers
);
2290 sq
.max_active
= nbufs
;
2295 return mixer_ioctl(inode
, file
, cmd
, arg
);
2302 static struct file_operations sq_fops
=
2304 .owner
= THIS_MODULE
,
2305 .llseek
= sound_lseek
,
2306 .read
= sq_read
, /* sq_read */
2310 .release
= sq_release
,
2314 static void __init
sq_init(void)
2316 sq_unit
= register_sound_dsp(&sq_fops
, -1);
2320 init_waitqueue_head(&sq
.action_queue
);
2321 init_waitqueue_head(&sq
.open_queue
);
2322 init_waitqueue_head(&sq
.sync_queue
);
2323 init_waitqueue_head(&read_sq
.action_queue
);
2324 init_waitqueue_head(&read_sq
.open_queue
);
2325 init_waitqueue_head(&read_sq
.sync_queue
);
2330 /* whatever you like as startup mode for /dev/dsp,
2331 * (/dev/audio hasn't got a startup mode). note that
2332 * once changed a new open() will *not* restore these!
2334 sound
.dsp
.format
= AFMT_S16_BE
;
2335 sound
.dsp
.stereo
= 1;
2336 sound
.dsp
.size
= 16;
2338 /* set minimum rate possible without expanding */
2339 sound
.dsp
.speed
= 8000;
2341 /* before the first open to /dev/dsp this wouldn't be set */
2342 sound
.soft
= sound
.dsp
;
2343 sound
.hard
= sound
.dsp
;
2353 /* state.buf should not overflow! */
2355 static int state_open(struct inode
*inode
, struct file
*file
)
2357 char *buffer
= state
.buf
, *mach
= "", cs4218_buf
[50];
2366 sprintf(cs4218_buf
, "Crystal CS4218 on TDM, ");
2369 len
+= sprintf(buffer
+len
, "%sDMA sound driver:\n", mach
);
2371 len
+= sprintf(buffer
+len
, "\tsound.format = 0x%x", sound
.soft
.format
);
2372 switch (sound
.soft
.format
) {
2374 len
+= sprintf(buffer
+len
, " (mu-law)");
2377 len
+= sprintf(buffer
+len
, " (A-law)");
2380 len
+= sprintf(buffer
+len
, " (unsigned 8 bit)");
2383 len
+= sprintf(buffer
+len
, " (signed 8 bit)");
2386 len
+= sprintf(buffer
+len
, " (signed 16 bit big)");
2389 len
+= sprintf(buffer
+len
, " (unsigned 16 bit big)");
2392 len
+= sprintf(buffer
+len
, " (signed 16 bit little)");
2395 len
+= sprintf(buffer
+len
, " (unsigned 16 bit little)");
2398 len
+= sprintf(buffer
+len
, "\n");
2399 len
+= sprintf(buffer
+len
, "\tsound.speed = %dHz (phys. %dHz)\n",
2400 sound
.soft
.speed
, sound
.hard
.speed
);
2401 len
+= sprintf(buffer
+len
, "\tsound.stereo = 0x%x (%s)\n",
2402 sound
.soft
.stereo
, sound
.soft
.stereo
? "stereo" : "mono");
2403 len
+= sprintf(buffer
+len
, "\tsq.block_size = %d sq.max_count = %d"
2404 " sq.max_active = %d\n",
2405 sq
.block_size
, sq
.max_count
, sq
.max_active
);
2406 len
+= sprintf(buffer
+len
, "\tsq.count = %d sq.rear_size = %d\n", sq
.count
,
2408 len
+= sprintf(buffer
+len
, "\tsq.active = %d sq.syncing = %d\n",
2409 sq
.active
, sq
.syncing
);
2411 return nonseekable_open(inode
, file
);
2415 static int state_release(struct inode
*inode
, struct file
*file
)
2422 static ssize_t
state_read(struct file
*file
, char *buf
, size_t count
,
2425 int n
= state
.len
- state
.ptr
;
2430 if (copy_to_user(buf
, &state
.buf
[state
.ptr
], n
))
2437 static struct file_operations state_fops
=
2439 .owner
= THIS_MODULE
,
2440 .llseek
= sound_lseek
,
2443 .release
= state_release
,
2447 static void __init
state_init(void)
2449 state_unit
= register_sound_special(&state_fops
, SND_DEV_STATUS
);
2456 /*** Common stuff ********************************************************/
2458 static long long sound_lseek(struct file
*file
, long long offset
, int orig
)
2464 /*** Config & Setup **********************************************************/
2467 int __init
tdm8xx_sound_init(void)
2471 volatile uint
*sirp
;
2472 volatile cbd_t
*bdp
;
2473 volatile cpm8xx_t
*cp
;
2475 volatile smc_uart_t
*up
;
2476 volatile immap_t
*immap
;
2480 /* Program the SI/TSA to use TDMa, connected to SMC2, for 4 bytes.
2482 cp
= cpmp
; /* Get pointer to Communication Processor */
2483 immap
= (immap_t
*)IMAP_ADDR
; /* and to internal registers */
2485 /* Set all TDMa control bits to zero. This enables most features
2488 cp
->cp_simode
&= ~0x00000fff;
2490 /* Enable common receive/transmit clock pins, use IDL format.
2491 * Sync on falling edge, transmit rising clock, receive falling
2492 * clock, delay 1 bit on both Tx and Rx. Common Tx/Rx clocks and
2494 * Connect SMC2 to TSA.
2496 cp
->cp_simode
|= 0x80000141;
2498 /* Configure port A pins for TDMa operation.
2499 * The RPX-Lite (MPC850/823) loses SMC2 when TDM is used.
2501 immap
->im_ioport
.iop_papar
|= 0x01c0; /* Enable TDMa functions */
2502 immap
->im_ioport
.iop_padir
|= 0x00c0; /* Enable TDMa Tx/Rx */
2503 immap
->im_ioport
.iop_padir
&= ~0x0100; /* Enable L1RCLKa */
2505 immap
->im_ioport
.iop_pcpar
|= 0x0800; /* Enable L1RSYNCa */
2506 immap
->im_ioport
.iop_pcdir
&= ~0x0800;
2508 /* Initialize the SI TDM routing table. We use TDMa only.
2509 * The receive table and transmit table each have only one
2510 * entry, to capture/send four bytes after each frame pulse.
2511 * The 16-bit ram entry is 0000 0001 1000 1111. (SMC2)
2514 sirp
= (uint
*)cp
->cp_siram
;
2516 *sirp
= 0x018f0000; /* Receive entry */
2518 *sirp
= 0x018f0000; /* Tramsmit entry */
2520 /* Enable single TDMa routing.
2522 cp
->cp_sigmr
= 0x04;
2524 /* Initialize the SMC for transparent operation.
2526 sp
= &cpmp
->cp_smc
[1];
2527 up
= (smc_uart_t
*)&cp
->cp_dparam
[PROFF_SMC2
];
2529 /* We need to allocate a transmit and receive buffer
2530 * descriptors from dual port ram.
2532 dp_addr
= cpm_dpalloc(sizeof(cbd_t
) * numReadBufs
, 8);
2534 /* Set the physical address of the host memory
2535 * buffers in the buffer descriptors, and the
2536 * virtual address for us to work with.
2538 bdp
= (cbd_t
*)&cp
->cp_dpmem
[dp_addr
];
2539 up
->smc_rbase
= dp_offset
;
2540 rx_cur
= rx_base
= (cbd_t
*)bdp
;
2542 for (i
=0; i
<(numReadBufs
-1); i
++) {
2543 bdp
->cbd_bufaddr
= 0;
2544 bdp
->cbd_datlen
= 0;
2545 bdp
->cbd_sc
= BD_SC_EMPTY
| BD_SC_INTRPT
;
2548 bdp
->cbd_bufaddr
= 0;
2549 bdp
->cbd_datlen
= 0;
2550 bdp
->cbd_sc
= BD_SC_WRAP
| BD_SC_EMPTY
| BD_SC_INTRPT
;
2552 /* Now, do the same for the transmit buffers.
2554 dp_offset
= cpm_dpalloc(sizeof(cbd_t
) * numBufs
, 8);
2556 bdp
= (cbd_t
*)&cp
->cp_dpmem
[dp_addr
];
2557 up
->smc_tbase
= dp_offset
;
2558 tx_cur
= tx_base
= (cbd_t
*)bdp
;
2560 for (i
=0; i
<(numBufs
-1); i
++) {
2561 bdp
->cbd_bufaddr
= 0;
2562 bdp
->cbd_datlen
= 0;
2563 bdp
->cbd_sc
= BD_SC_INTRPT
;
2566 bdp
->cbd_bufaddr
= 0;
2567 bdp
->cbd_datlen
= 0;
2568 bdp
->cbd_sc
= (BD_SC_WRAP
| BD_SC_INTRPT
);
2570 /* Set transparent SMC mode.
2571 * A few things are specific to our application. The codec interface
2572 * is MSB first, hence the REVD selection. The CD/CTS pulse are
2573 * used by the TSA to indicate the frame start to the SMC.
2575 up
->smc_rfcr
= SCC_EB
;
2576 up
->smc_tfcr
= SCC_EB
;
2577 up
->smc_mrblr
= readbufSize
* 1024;
2579 /* Set 16-bit reversed data, transparent mode.
2581 sp
->smc_smcmr
= smcr_mk_clen(15) |
2582 SMCMR_SM_TRANS
| SMCMR_REVD
| SMCMR_BS
;
2584 /* Enable and clear events.
2585 * Because of FIFO delays, all we need is the receive interrupt
2586 * and we can process both the current receive and current
2587 * transmit interrupt within a few microseconds of the transmit.
2589 sp
->smc_smce
= 0xff;
2590 sp
->smc_smcm
= SMCM_TXE
| SMCM_TX
| SMCM_RX
;
2592 /* Send the CPM an initialize command.
2594 cp
->cp_cpcr
= mk_cr_cmd(CPM_CR_CH_SMC2
,
2595 CPM_CR_INIT_TRX
) | CPM_CR_FLG
;
2596 while (cp
->cp_cpcr
& CPM_CR_FLG
);
2598 sound
.mach
= mach_cs4218
;
2601 /* Initialize beep stuff */
2602 orig_mksound
= kd_mksound
;
2603 kd_mksound
= cs_mksound
;
2604 beep_buf
= (short *) kmalloc(BEEP_BUFLEN
* 4, GFP_KERNEL
);
2605 if (beep_buf
== NULL
)
2606 printk(KERN_WARNING
"dmasound: no memory for "
2612 /* Initialize the software SPI.
2616 /* Set up sound queue, /dev/audio and /dev/dsp. */
2618 /* Set default settings. */
2621 /* Set up /dev/sndstat. */
2624 /* Set up /dev/mixer. */
2627 if (!sound
.mach
.irqinit()) {
2628 printk(KERN_ERR
"DMA sound driver: Interrupt initialization failed\n");
2635 printk(KERN_INFO
"DMA sound driver installed, using %d buffers of %dk.\n",
2641 /* Due to FIFOs and bit delays, the transmit interrupt occurs a few
2642 * microseconds ahead of the receive interrupt.
2643 * When we get an interrupt, we service the transmit first, then
2644 * check for a receive to prevent the overhead of returning through
2645 * the interrupt handler only to get back here right away during
2646 * full duplex operation.
2649 cs4218_intr(void *dev_id
)
2652 volatile cpm8xx_t
*cp
;
2654 sp
= &cpmp
->cp_smc
[1];
2656 if (sp
->smc_smce
& SCCM_TX
) {
2657 sp
->smc_smce
= SCCM_TX
;
2658 cs4218_tdm_tx_intr((void *)sp
);
2661 if (sp
->smc_smce
& SCCM_RX
) {
2662 sp
->smc_smce
= SCCM_RX
;
2663 cs4218_tdm_rx_intr((void *)sp
);
2666 if (sp
->smc_smce
& SCCM_TXE
) {
2667 /* Transmit underrun. This happens with the application
2668 * didn't keep up sending buffers. We tell the SMC to
2669 * restart, which will cause it to poll the current (next)
2670 * BD. If the user supplied data since this occurred,
2671 * we just start running again. If they didn't, the SMC
2672 * will poll the descriptor until data is placed there.
2674 sp
->smc_smce
= SCCM_TXE
;
2675 cp
= cpmp
; /* Get pointer to Communication Processor */
2676 cp
->cp_cpcr
= mk_cr_cmd(CPM_CR_CH_SMC2
,
2677 CPM_CR_RESTART_TX
) | CPM_CR_FLG
;
2678 while (cp
->cp_cpcr
& CPM_CR_FLG
);
2683 #define MAXARGS 8 /* Should be sufficient for now */
2685 void __init
dmasound_setup(char *str
, int *ints
)
2687 /* check the bootstrap parameter for "dmasound=" */
2691 if ((ints
[3] < 0) || (ints
[3] > MAX_CATCH_RADIUS
))
2692 printk("dmasound_setup: invalid catch radius, using default = %d\n", catchRadius
);
2694 catchRadius
= ints
[3];
2697 if (ints
[1] < MIN_BUFFERS
)
2698 printk("dmasound_setup: invalid number of buffers, using default = %d\n", numBufs
);
2701 if (ints
[2] < MIN_BUFSIZE
|| ints
[2] > MAX_BUFSIZE
)
2702 printk("dmasound_setup: invalid buffer size, using default = %d\n", bufSize
);
2709 printk("dmasound_setup: invalid number of arguments\n");
2713 /* Software SPI functions.
2714 * These are on Port B.
2716 #define PB_SPICLK ((uint)0x00000002)
2717 #define PB_SPIMOSI ((uint)0x00000004)
2718 #define PB_SPIMISO ((uint)0x00000008)
2721 void sw_spi_init(void)
2723 volatile cpm8xx_t
*cp
;
2724 volatile uint
*hcsr4
;
2726 hcsr4
= (volatile uint
*)HIOX_CSR4_ADDR
;
2727 cp
= cpmp
; /* Get pointer to Communication Processor */
2729 *hcsr4
&= ~HIOX_CSR4_AUDSPISEL
; /* Disable SPI select */
2731 /* Make these Port B signals general purpose I/O.
2732 * First, make sure the clock is low.
2734 cp
->cp_pbdat
&= ~PB_SPICLK
;
2735 cp
->cp_pbpar
&= ~(PB_SPICLK
| PB_SPIMOSI
| PB_SPIMISO
);
2737 /* Clock and Master Output are outputs.
2739 cp
->cp_pbdir
|= (PB_SPICLK
| PB_SPIMOSI
);
2743 cp
->cp_pbdir
&= ~PB_SPIMISO
;
2747 /* Write the CS4218 control word out the SPI port. While the
2748 * the control word is going out, the status word is arriving.
2751 uint
cs4218_ctl_write(uint ctlreg
)
2755 sw_spi_io((u_char
*)&ctlreg
, (u_char
*)&status
, 4);
2757 /* Shadow the control register.....I guess we could do
2758 * the same for the status, but for now we just return it
2759 * and let the caller decide.
2761 cs4218_control
= ctlreg
;
2766 void sw_spi_io(u_char
*obuf
, u_char
*ibuf
, uint bcnt
)
2769 u_char outbyte
, inbyte
;
2770 volatile cpm8xx_t
*cp
;
2771 volatile uint
*hcsr4
;
2773 hcsr4
= (volatile uint
*)HIOX_CSR4_ADDR
;
2774 cp
= cpmp
; /* Get pointer to Communication Processor */
2776 /* The timing on the bus is pretty slow. Code inefficiency
2777 * and eieio() is our friend here :-).
2779 cp
->cp_pbdat
&= ~PB_SPICLK
;
2780 *hcsr4
|= HIOX_CSR4_AUDSPISEL
; /* Enable SPI select */
2783 /* Clock in/out the bytes. Data is valid on the falling edge
2784 * of the clock. Data is MSB first.
2786 for (i
=0; i
<bcnt
; i
++) {
2789 for (bits
=0; bits
<8; bits
++) {
2791 cp
->cp_pbdat
|= PB_SPICLK
;
2794 cp
->cp_pbdat
|= PB_SPIMOSI
;
2796 cp
->cp_pbdat
&= ~PB_SPIMOSI
;
2798 cp
->cp_pbdat
&= ~PB_SPICLK
;
2802 if (cp
->cp_pbdat
& PB_SPIMISO
)
2808 *hcsr4
&= ~HIOX_CSR4_AUDSPISEL
; /* Disable SPI select */
2812 void cleanup_module(void)
2814 if (irq_installed
) {
2817 sound
.mach
.irqcleanup();
2821 sq_release_read_buffers();
2822 sq_release_buffers();
2824 if (mixer_unit
>= 0)
2825 unregister_sound_mixer(mixer_unit
);
2826 if (state_unit
>= 0)
2827 unregister_sound_special(state_unit
);
2829 unregister_sound_dsp(sq_unit
);
2832 module_init(tdm8xx_sound_init
);
2833 module_exit(cleanup_module
);