OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [linux/] [linux-2.4/] [drivers/] [sbus/] [audio/] [cs4231.c] - Blame information for rev 1765

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1275 phoenix
/* $Id: cs4231.c,v 1.1.1.1 2004-04-15 02:07:23 phoenix Exp $
2
 * drivers/sbus/audio/cs4231.c
3
 *
4
 * Copyright 1996, 1997, 1998, 1999 Derrick J Brashear (shadow@andrew.cmu.edu)
5
 * The 4231/ebus support was written by David Miller, who didn't bother
6
 * crediting himself here, so I will.
7
 *
8
 * Based on the AMD7930 driver:
9
 * Copyright 1996 Thomas K. Dyas (tdyas@noc.rutgers.edu)
10
 *
11
 * This is the lowlevel driver for the CS4231 audio chip found on some
12
 * sun4m and sun4u machines.
13
 *
14
 * This was culled from the Crystal docs on the 4231a, and the addendum they
15
 * faxed me on the 4231.
16
 * The APC DMA controller support unfortunately is not documented. Thanks, Sun.
17
 */
18
 
19
#include <linux/config.h>
20
#include <linux/module.h>
21
#include <linux/kernel.h>
22
#include <linux/sched.h>
23
#include <linux/errno.h>
24
#include <linux/interrupt.h>
25
#include <linux/slab.h>
26
#include <linux/init.h>
27
#include <linux/delay.h>
28
#include <linux/soundcard.h>
29
#include <linux/version.h>
30
#include <linux/ioport.h>
31
#include <asm/openprom.h>
32
#include <asm/oplib.h>
33
#include <asm/system.h>
34
#include <asm/irq.h>
35
#include <asm/io.h>
36
#include <asm/pgtable.h>
37
#include <asm/sbus.h>
38
#if defined(CONFIG_PCI) && defined(CONFIG_SPARC64)
39
#define EB4231_SUPPORT
40
#include <asm/ebus.h>
41
#include <asm/pbm.h>
42
#endif
43
 
44
#include <asm/audioio.h>
45
#include "cs4231.h"
46
 
47
#undef __CS4231_DEBUG
48
#undef __CS4231_TRACE
49
#define __CS4231_ERROR
50
#ifdef __CS4231_ERROR
51
#define eprintk(x) printk x
52
#else
53
#define eprintk(x)
54
#endif
55
#ifdef __CS4231_TRACE
56
#define tprintk(x) printk x
57
#else
58
#define tprintk(x)
59
#endif
60
#ifdef __CS4231_DEBUG
61
#define dprintk(x) printk x
62
#else
63
#define dprintk(x)
64
#endif
65
 
66
#define MAX_DRIVERS 1
67
static struct sparcaudio_driver drivers[MAX_DRIVERS];
68
static int num_drivers;
69
 
70
static int cs4231_record_gain(struct sparcaudio_driver *drv, int value,
71
                              unsigned char balance);
72
static int cs4231_play_gain(struct sparcaudio_driver *drv, int value,
73
                            unsigned char balance);
74
static void cs4231_ready(struct sparcaudio_driver *drv);
75
static void cs4231_playintr(struct sparcaudio_driver *drv, int);
76
static int cs4231_recintr(struct sparcaudio_driver *drv);
77
static int cs4231_output_muted(struct sparcaudio_driver *drv, int value);
78
static void cs4231_pollinput(struct sparcaudio_driver *drv);
79
static int cs4231_length_to_samplecount(struct audio_prinfo *thisdir,
80
                                        unsigned int length);
81
static void cs4231_getsamplecount(struct sparcaudio_driver *drv,
82
                                  unsigned int length, unsigned int value);
83
#ifdef EB4231_SUPPORT
84
static void eb4231_pollinput(struct sparcaudio_driver *drv);
85
#endif
86
 
87
/* Serveral shorthands save typing... */
88
#define CHIP_READY() \
89
do { udelay(100); cs4231_ready(drv); udelay(1000); } while(0)
90
#define WRITE_IAR(__VAL) \
91
        CS4231_WRITE8(cs4231_chip, cs4231_chip->regs + IAR, __VAL)
92
#define WRITE_IDR(__VAL) \
93
        CS4231_WRITE8(cs4231_chip, cs4231_chip->regs + IDR, __VAL)
94
#define READ_IAR() \
95
        CS4231_READ8(cs4231_chip, cs4231_chip->regs + IAR)
96
#define READ_IDR() \
97
        CS4231_READ8(cs4231_chip, cs4231_chip->regs + IDR)
98
 
99
/* Enable cs4231 interrupts atomically. */
100
static void cs4231_enable_interrupts(struct sparcaudio_driver *drv)
101
{
102
        struct cs4231_chip *cs4231_chip = (struct cs4231_chip *) drv->private;
103
        unsigned long flags;
104
 
105
        tprintk(("enabling interrupts\n"));
106
        save_flags(flags);
107
        cli();
108
        if ((cs4231_chip->status & CS_STATUS_INTS_ON) == 0) {
109
                WRITE_IAR(0xa);
110
                WRITE_IDR(INTR_ON);
111
                cs4231_chip->status |= CS_STATUS_INTS_ON;
112
        }
113
        restore_flags(flags);
114
}
115
 
116
/* Disable cs4231 interrupts atomically. */
117
static void cs4231_disable_interrupts(struct sparcaudio_driver *drv)
118
{
119
        struct cs4231_chip *cs4231_chip = (struct cs4231_chip *) drv->private;
120
        unsigned long flags;
121
 
122
        tprintk(("disabling interrupts\n"));
123
        save_flags(flags);
124
        cli();
125
        if ((cs4231_chip->status & CS_STATUS_INTS_ON) != 0) {
126
                WRITE_IAR(0xa);
127
                WRITE_IDR(INTR_OFF);
128
                cs4231_chip->status &= ~CS_STATUS_INTS_ON;
129
        }
130
        restore_flags(flags);
131
}
132
 
133
static void cs4231_enable_play(struct sparcaudio_driver *drv)
134
{
135
        struct cs4231_chip *cs4231_chip = (struct cs4231_chip *) drv->private;
136
        unsigned long flags;
137
 
138
        tprintk(("enabling play\n"));
139
        save_flags(flags);
140
        cli();
141
        WRITE_IAR(0x9);
142
        WRITE_IDR(READ_IDR() | PEN_ENABLE);
143
        restore_flags(flags);
144
}
145
 
146
static void cs4231_disable_play(struct sparcaudio_driver *drv)
147
{
148
        struct cs4231_chip *cs4231_chip = (struct cs4231_chip *) drv->private;
149
        unsigned long flags;
150
 
151
        tprintk(("disabling play\n"));
152
        save_flags(flags);
153
        cli();
154
        WRITE_IAR(0x9);
155
        WRITE_IDR(READ_IDR() & PEN_DISABLE);
156
        restore_flags(flags);
157
}
158
 
159
static void cs4231_enable_rec(struct sparcaudio_driver *drv)
160
{
161
        struct cs4231_chip *cs4231_chip = (struct cs4231_chip *) drv->private;
162
        unsigned long flags;
163
 
164
        tprintk(("enabling rec\n"));
165
        save_flags(flags);
166
        cli();
167
        WRITE_IAR(0x9);
168
        WRITE_IDR(READ_IDR() | CEN_ENABLE);
169
        restore_flags(flags);
170
}
171
 
172
static void cs4231_disable_rec(struct sparcaudio_driver *drv)
173
{
174
        struct cs4231_chip *cs4231_chip = (struct cs4231_chip *) drv->private;
175
        unsigned long flags;
176
 
177
        tprintk(("disabling rec\n"));
178
        save_flags(flags);
179
        cli();
180
        WRITE_IAR(0x9);
181
        WRITE_IDR(READ_IDR() & CEN_DISABLE);
182
        restore_flags(flags);
183
}
184
 
185
static struct cs4231_rates {
186
        int speed, bits;
187
} cs4231_rate_table[] = {
188
        { 5512, CS4231_DFR_5512 },
189
        { 6615, CS4231_DFR_6615 },
190
        { 8000, CS4231_DFR_8000 },
191
        { 9600, CS4231_DFR_9600 },
192
        { 11025, CS4231_DFR_11025 },
193
        { 16000, CS4231_DFR_16000 },
194
        { 18900, CS4231_DFR_18900 },
195
        { 22050, CS4231_DFR_22050 },
196
        { 27429, CS4231_DFR_27429 },
197
        { 32000, CS4231_DFR_32000 },
198
        { 33075, CS4231_DFR_33075 },
199
        { 37800, CS4231_DFR_37800 },
200
        { 44100, CS4231_DFR_44100 },
201
        { 48000, CS4231_DFR_48000 }
202
};
203
 
204
#define NUM_RATES       (sizeof(cs4231_rate_table) / sizeof(struct cs4231_rates))
205
 
206
static int cs4231_rate_to_bits(struct sparcaudio_driver *drv, int *value)
207
{
208
        struct cs4231_rates *p = &cs4231_rate_table[0];
209
        int i, wanted = *value;
210
 
211
        /* We try to be nice and approximate what the user asks for. */
212
        if (wanted < 5512)
213
                wanted = 5512;
214
        if (wanted > 48000)
215
                wanted = 48000;
216
 
217
        for (i = 0; i < NUM_RATES; i++, p++) {
218
                /* Exact match? */
219
                if (wanted == p->speed)
220
                        break;
221
 
222
                /* If we're inbetween two entries, and neither is exact,
223
                 * pick the closest one.
224
                 */
225
                if (wanted == p[1].speed)
226
                        continue;
227
                if (wanted > p->speed && wanted < p[1].speed) {
228
                        int diff1, diff2;
229
 
230
                        diff1 = wanted - p->speed;
231
                        diff2 = p[1].speed - wanted;
232
                        if (diff2 < diff1)
233
                                p++;
234
                        break;
235
                }
236
        }
237
        *value = p->speed;
238
        return p->bits;
239
}
240
 
241
static int cs4231_encoding_to_bits(struct sparcaudio_driver *drv, int value)
242
{
243
        int set_bits;
244
 
245
        switch (value) {
246
        case AUDIO_ENCODING_ULAW:
247
                set_bits = CS4231_DFR_ULAW;
248
                break;
249
        case AUDIO_ENCODING_ALAW:
250
                set_bits = CS4231_DFR_ALAW;
251
                break;
252
        case AUDIO_ENCODING_DVI:
253
                set_bits = CS4231_DFR_ADPCM;
254
                break;
255
        case AUDIO_ENCODING_LINEARLE:
256
                set_bits = CS4231_DFR_LINEARLE;
257
                break;
258
        case AUDIO_ENCODING_LINEAR:
259
                set_bits = CS4231_DFR_LINEARBE;
260
                break;
261
        case AUDIO_ENCODING_LINEAR8:
262
                set_bits = CS4231_DFR_LINEAR8;
263
                break;
264
        default:
265
                set_bits = -EINVAL;
266
                break;
267
        };
268
 
269
        return set_bits;
270
}
271
 
272
static int cs4231_set_output_encoding(struct sparcaudio_driver *drv, int value)
273
{
274
        struct cs4231_chip *cs4231_chip = (struct cs4231_chip *) drv->private;
275
        int tmp_bits, set_bits;
276
 
277
        tprintk(("output encoding %d\n", value));
278
        if (value != 0) {
279
                set_bits = cs4231_encoding_to_bits(drv, value);
280
                if (set_bits >= 0) {
281
                        READ_IDR();
282
                        READ_IDR();
283
                        WRITE_IAR(IAR_AUTOCAL_BEGIN | 0x8);
284
                        tmp_bits = READ_IDR();
285
                        WRITE_IDR(CHANGE_ENCODING(tmp_bits, set_bits));
286
                        READ_IDR();
287
                        READ_IDR();
288
                        CHIP_READY();
289
                        cs4231_chip->perchip_info.play.encoding = value;
290
                        return 0;
291
                }
292
        }
293
        dprintk(("output enc failed\n"));
294
        return -EINVAL;
295
}
296
 
297
static int cs4231_get_output_encoding(struct sparcaudio_driver *drv)
298
{
299
      struct cs4231_chip *cs4231_chip = (struct cs4231_chip *) drv->private;
300
      return cs4231_chip->perchip_info.play.encoding;
301
}
302
 
303
static int cs4231_set_input_encoding(struct sparcaudio_driver *drv, int value)
304
{
305
        struct cs4231_chip *cs4231_chip = (struct cs4231_chip *) drv->private;
306
        int tmp_bits, set_bits;
307
 
308
        tprintk(("input encoding %d\n", value));
309
        if (value != 0) {
310
                set_bits = cs4231_encoding_to_bits(drv, value);
311
                if (set_bits >= 0) {
312
                        READ_IDR();
313
                        READ_IDR();
314
                        WRITE_IAR(IAR_AUTOCAL_BEGIN | 0x1c);
315
                        tmp_bits = READ_IDR();
316
                        WRITE_IDR(CHANGE_ENCODING(tmp_bits, set_bits));
317
                        READ_IDR();
318
                        READ_IDR();
319
                        CHIP_READY();
320
 
321
                        cs4231_chip->perchip_info.record.encoding = value;
322
                        return 0;
323
                }
324
        }
325
        dprintk(("input enc failed\n"));
326
        return -EINVAL;
327
}
328
 
329
static int cs4231_get_input_encoding(struct sparcaudio_driver *drv)
330
{
331
      struct cs4231_chip *cs4231_chip = (struct cs4231_chip *) drv->private;
332
      return cs4231_chip->perchip_info.record.encoding;
333
}
334
 
335
static int cs4231_set_output_rate(struct sparcaudio_driver *drv, int value)
336
{
337
        struct cs4231_chip *cs4231_chip = (struct cs4231_chip *) drv->private;
338
        int tmp_bits, set_bits;
339
 
340
        tprintk(("output rate %d\n", value));
341
        if (value != 0) {
342
                set_bits = cs4231_rate_to_bits(drv, &value);
343
                if (set_bits >= 0) {
344
                        READ_IDR();
345
                        READ_IDR();
346
                        WRITE_IAR(IAR_AUTOCAL_BEGIN | 0x8);
347
                        tmp_bits = READ_IDR();
348
                        WRITE_IDR(CHANGE_DFR(tmp_bits, set_bits));
349
                        READ_IDR();
350
                        READ_IDR();
351
                        CHIP_READY();
352
 
353
                        cs4231_chip->perchip_info.play.sample_rate = value;
354
                        tprintk(("tmp_bits[%02x] set_bits[%02x] CHANGE_DFR[%02x]\n",
355
                                 tmp_bits, set_bits, CHANGE_DFR(tmp_bits, set_bits)));
356
                        return 0;
357
                }
358
        }
359
        dprintk(("output rate failed\n"));
360
        return -EINVAL;
361
}
362
 
363
static int cs4231_get_output_rate(struct sparcaudio_driver *drv)
364
{
365
      struct cs4231_chip *cs4231_chip = (struct cs4231_chip *) drv->private;
366
      return cs4231_chip->perchip_info.play.sample_rate;
367
}
368
 
369
static int cs4231_set_input_rate(struct sparcaudio_driver *drv, int value)
370
{
371
        struct cs4231_chip *cs4231_chip = (struct cs4231_chip *) drv->private;
372
        int tmp_bits, set_bits;
373
 
374
        tprintk(("input rate %d\n", value));
375
        if (value != 0) {
376
                set_bits = cs4231_rate_to_bits(drv, &value);
377
                if (set_bits >= 0) {
378
                        READ_IDR();
379
                        READ_IDR();
380
                        WRITE_IAR(IAR_AUTOCAL_BEGIN | 0x1c);
381
                        tmp_bits = READ_IDR();
382
                        WRITE_IDR(CHANGE_DFR(tmp_bits, set_bits));
383
                        READ_IDR();
384
                        READ_IDR();
385
                        CHIP_READY();
386
 
387
                        cs4231_chip->perchip_info.record.sample_rate = value;
388
                        return 0;
389
                }
390
        }
391
        dprintk(("input rate failed\n"));
392
        return -EINVAL;
393
}
394
 
395
static int cs4231_get_input_rate(struct sparcaudio_driver *drv)
396
{
397
      struct cs4231_chip *cs4231_chip = (struct cs4231_chip *) drv->private;
398
      return cs4231_chip->perchip_info.record.sample_rate;
399
}
400
 
401
/* Generically we support 4 channels. This hardware does 2 */
402
static int cs4231_set_input_channels(struct sparcaudio_driver *drv, int value)
403
{
404
        struct cs4231_chip *cs4231_chip = (struct cs4231_chip *) drv->private;
405
        int tmp_bits;
406
 
407
        tprintk(("input channels %d\n", value));
408
        WRITE_IAR(IAR_AUTOCAL_BEGIN | 0x1c);
409
        tmp_bits = READ_IDR();
410
        switch (value) {
411
        case 1:
412
                WRITE_IDR(CS4231_MONO_ON(tmp_bits));
413
                break;
414
        case 2:
415
                WRITE_IDR(CS4231_STEREO_ON(tmp_bits));
416
                break;
417
        default:
418
                dprintk(("input chan failed\n"));
419
                return -EINVAL;
420
        };
421
        CHIP_READY();
422
 
423
        cs4231_chip->perchip_info.record.channels = value;
424
        return 0;
425
}
426
 
427
static int cs4231_get_input_channels(struct sparcaudio_driver *drv)
428
{
429
      struct cs4231_chip *cs4231_chip = (struct cs4231_chip *) drv->private;
430
      return cs4231_chip->perchip_info.record.channels;
431
}
432
 
433
/* Generically we support 4 channels. This hardware does 2 */
434
static int cs4231_set_output_channels(struct sparcaudio_driver *drv, int value)
435
{
436
        struct cs4231_chip *cs4231_chip = (struct cs4231_chip *) drv->private;
437
        int tmp_bits;
438
 
439
        tprintk(("output channels %d\n", value));
440
        WRITE_IAR(IAR_AUTOCAL_BEGIN | 0x8);
441
        tmp_bits = READ_IDR();
442
        switch (value) {
443
        case 1:
444
                WRITE_IDR(CS4231_MONO_ON(tmp_bits));
445
                break;
446
        case 2:
447
                WRITE_IDR(CS4231_STEREO_ON(tmp_bits));
448
                break;
449
        default:
450
                dprintk(("output chan failed\n"));
451
                return -EINVAL;
452
        };
453
        CHIP_READY();
454
 
455
        cs4231_chip->perchip_info.play.channels = value;
456
        return 0;
457
}
458
 
459
static int cs4231_get_output_channels(struct sparcaudio_driver *drv)
460
{
461
      struct cs4231_chip *cs4231_chip = (struct cs4231_chip *) drv->private;
462
      return cs4231_chip->perchip_info.play.channels;
463
}
464
 
465
static int cs4231_get_input_precision(struct sparcaudio_driver *drv)
466
{
467
      struct cs4231_chip *cs4231_chip = (struct cs4231_chip *) drv->private;
468
      return cs4231_chip->perchip_info.record.precision;
469
}
470
 
471
static int cs4231_get_output_precision(struct sparcaudio_driver *drv)
472
{
473
      struct cs4231_chip *cs4231_chip = (struct cs4231_chip *) drv->private;
474
      return cs4231_chip->perchip_info.play.precision;
475
}
476
 
477
static int cs4231_set_input_precision(struct sparcaudio_driver *drv, int val)
478
{
479
      struct cs4231_chip *cs4231_chip = (struct cs4231_chip *) drv->private;
480
 
481
      cs4231_chip->perchip_info.record.precision = val;
482
 
483
      return cs4231_chip->perchip_info.record.precision;
484
}
485
 
486
static int cs4231_set_output_precision(struct sparcaudio_driver *drv, int val)
487
{
488
      struct cs4231_chip *cs4231_chip = (struct cs4231_chip *) drv->private;
489
 
490
      cs4231_chip->perchip_info.play.precision = val;
491
 
492
      return cs4231_chip->perchip_info.play.precision;
493
}
494
 
495
/* Wait until the auto calibration process has finished */
496
static void cs4231_ready(struct sparcaudio_driver *drv)
497
{
498
        struct cs4231_chip *cs4231_chip = (struct cs4231_chip *) drv->private;
499
        unsigned int x;
500
 
501
        WRITE_IAR(IAR_AUTOCAL_END);
502
        x = 0;
503
        do {
504
                if (READ_IDR() != IAR_NOT_READY)
505
                        break;
506
                x++;
507
        } while (x <= CS_TIMEOUT);
508
 
509
        WRITE_IAR(0x0b);
510
        x = 0;
511
        do {
512
                if (READ_IDR() != AUTOCAL_IN_PROGRESS)
513
                        break;
514
                x++;
515
        } while (x <= CS_TIMEOUT);
516
}
517
 
518
/* Set output mute */
519
static int cs4231_output_muted(struct sparcaudio_driver *drv, int value)
520
{
521
        struct cs4231_chip *cs4231_chip = (struct cs4231_chip *) drv->private;
522
        tprintk(("in cs4231_output_muted: %d\n", value));
523
        if (!value) {
524
                WRITE_IAR(0x7);
525
                WRITE_IDR(READ_IDR() & OUTCR_UNMUTE);
526
                WRITE_IAR(0x6);
527
                WRITE_IDR(READ_IDR() & OUTCR_UNMUTE);
528
                cs4231_chip->perchip_info.output_muted = 0;
529
        } else {
530
                WRITE_IAR(0x7);
531
                WRITE_IDR(READ_IDR() | OUTCR_MUTE);
532
                WRITE_IAR(0x6);
533
                WRITE_IDR(READ_IDR() | OUTCR_MUTE);
534
                cs4231_chip->perchip_info.output_muted = 1;
535
        }
536
        return 0;
537
}
538
 
539
static int cs4231_get_output_muted(struct sparcaudio_driver *drv)
540
{
541
        struct cs4231_chip *cs4231_chip = (struct cs4231_chip *) drv->private;
542
        return cs4231_chip->perchip_info.output_muted;
543
}
544
 
545
static int cs4231_get_formats(struct sparcaudio_driver *drv)
546
{
547
        return (AFMT_MU_LAW | AFMT_A_LAW |
548
                AFMT_U8 | AFMT_IMA_ADPCM |
549
                AFMT_S16_LE | AFMT_S16_BE);
550
}
551
 
552
static int cs4231_get_output_ports(struct sparcaudio_driver *drv)
553
{
554
        return (AUDIO_LINE_OUT | AUDIO_SPEAKER | AUDIO_HEADPHONE);
555
}
556
 
557
static int cs4231_get_input_ports(struct sparcaudio_driver *drv)
558
{
559
        struct cs4231_chip *cs4231_chip = (struct cs4231_chip *) drv->private;
560
 
561
        /* This apparently applies only to APC ultras, not ebus ultras */
562
        if (cs4231_chip->status & CS_STATUS_IS_ULTRA)
563
                return (AUDIO_LINE_IN | AUDIO_MICROPHONE | AUDIO_ANALOG_LOOPBACK);
564
        else
565
                return (AUDIO_INTERNAL_CD_IN | AUDIO_LINE_IN |
566
                        AUDIO_MICROPHONE | AUDIO_ANALOG_LOOPBACK);
567
}
568
 
569
/* Set chip "output" port */
570
static int cs4231_set_output_port(struct sparcaudio_driver *drv, int value)
571
{
572
        struct cs4231_chip *cs4231_chip = (struct cs4231_chip *) drv->private;
573
        int retval = 0;
574
 
575
        tprintk(("output port: %d\n", value));
576
        /* Aaaaaah! It's all coming so fast! Turn it all off, then selectively
577
         * enable things.
578
         */
579
        WRITE_IAR(0x1a);
580
        WRITE_IDR(READ_IDR() | MONO_IOCR_MUTE);
581
        WRITE_IAR(0x0a);
582
        WRITE_IDR(READ_IDR() | PINCR_LINE_MUTE);
583
        WRITE_IDR(READ_IDR() | PINCR_HDPH_MUTE);
584
 
585
        if (value & AUDIO_SPEAKER) {
586
                WRITE_IAR(0x1a);
587
                WRITE_IDR(READ_IDR() & ~MONO_IOCR_MUTE);
588
                retval |= AUDIO_SPEAKER;
589
        }
590
 
591
        if (value & AUDIO_HEADPHONE) {
592
                WRITE_IAR(0x0a);
593
                WRITE_IDR(READ_IDR() & ~PINCR_HDPH_MUTE);
594
                retval |= AUDIO_HEADPHONE;
595
        }
596
 
597
        if (value & AUDIO_LINE_OUT) {
598
                WRITE_IAR(0x0a);
599
                WRITE_IDR(READ_IDR() & ~PINCR_LINE_MUTE);
600
                retval |= AUDIO_LINE_OUT;
601
        }
602
 
603
        cs4231_chip->perchip_info.play.port = retval;
604
 
605
        return (retval);
606
}
607
 
608
static int cs4231_get_output_port(struct sparcaudio_driver *drv)
609
{
610
        struct cs4231_chip *cs4231_chip = (struct cs4231_chip *) drv->private;
611
        return cs4231_chip->perchip_info.play.port;
612
}
613
 
614
/* Set chip "input" port */
615
static int cs4231_set_input_port(struct sparcaudio_driver *drv, int value)
616
{
617
        struct cs4231_chip *cs4231_chip = (struct cs4231_chip *) drv->private;
618
        int retval = 0;
619
 
620
        tprintk(("input port: %d\n", value));
621
 
622
        /* You can have one and only one. This is probably wrong, but
623
         * appears to be how SunOS is doing it. Should be able to mix.
624
         * More work to be done. CD input mixable, analog loopback may be.
625
         */
626
 
627
        /* Ultra systems do not support AUDIO_INTERNAL_CD_IN */
628
        /* This apparently applies only to APC ultras, not ebus ultras */
629
        if (!(cs4231_chip->status & CS_STATUS_IS_ULTRA)) {
630
                if (value & AUDIO_INTERNAL_CD_IN) {
631
                        WRITE_IAR(0x1);
632
                        WRITE_IDR(CDROM_ENABLE(READ_IDR()));
633
                        WRITE_IAR(0x0);
634
                        WRITE_IDR(CDROM_ENABLE(READ_IDR()));
635
                        retval = AUDIO_INTERNAL_CD_IN;
636
                }
637
        }
638
        if ((value & AUDIO_LINE_IN)) {
639
                WRITE_IAR(0x1);
640
                WRITE_IDR(LINE_ENABLE(READ_IDR()));
641
                WRITE_IAR(0x0);
642
                WRITE_IDR(LINE_ENABLE(READ_IDR()));
643
                retval = AUDIO_LINE_IN;
644
        } else if (value & AUDIO_MICROPHONE) {
645
                WRITE_IAR(0x1);
646
                WRITE_IDR(MIC_ENABLE(READ_IDR()));
647
                WRITE_IAR(0x0);
648
                WRITE_IDR(MIC_ENABLE(READ_IDR()));
649
                retval = AUDIO_MICROPHONE;
650
        } else if (value & AUDIO_ANALOG_LOOPBACK) {
651
                WRITE_IAR(0x1);
652
                WRITE_IDR(OUTPUTLOOP_ENABLE(READ_IDR()));
653
                WRITE_IAR(0x0);
654
                WRITE_IDR(OUTPUTLOOP_ENABLE(READ_IDR()));
655
                retval = AUDIO_ANALOG_LOOPBACK;
656
        }
657
 
658
        cs4231_chip->perchip_info.record.port = retval;
659
 
660
        return retval;
661
}
662
 
663
static int cs4231_get_input_port(struct sparcaudio_driver *drv)
664
{
665
        struct cs4231_chip *cs4231_chip = (struct cs4231_chip *) drv->private;
666
        return cs4231_chip->perchip_info.record.port;
667
}
668
 
669
/* Set chip "monitor" gain */
670
static int cs4231_set_monitor_volume(struct sparcaudio_driver *drv, int value)
671
{
672
        struct cs4231_chip *cs4231_chip = (struct cs4231_chip *) drv->private;
673
        int a = 0;
674
 
675
        tprintk(("monitor gain: %d\n", value));
676
 
677
        /* This interpolation really sucks. The question is, be compatible
678
         * with ScumOS/Sloaris or not?
679
         */
680
        a = CS4231_MON_MAX_ATEN - (value * (CS4231_MON_MAX_ATEN + 1) /
681
                                   (AUDIO_MAX_GAIN + 1));
682
 
683
        WRITE_IAR(0x0d);
684
        if (a >= CS4231_MON_MAX_ATEN)
685
                WRITE_IDR(LOOPB_OFF);
686
        else
687
                WRITE_IDR((a << 2) | LOOPB_ON);
688
 
689
        if (value == AUDIO_MAX_GAIN)
690
                cs4231_chip->perchip_info.monitor_gain = AUDIO_MAX_GAIN;
691
        else
692
                cs4231_chip->perchip_info.monitor_gain =
693
                        ((CS4231_MAX_DEV_ATEN - a) *
694
                         (AUDIO_MAX_GAIN + 1) /
695
                         (CS4231_MAX_DEV_ATEN + 1));
696
 
697
        return 0;
698
}
699
 
700
static int cs4231_get_monitor_volume(struct sparcaudio_driver *drv)
701
{
702
        struct cs4231_chip *cs4231_chip = (struct cs4231_chip *) drv->private;
703
 
704
        return (int) cs4231_chip->perchip_info.monitor_gain;
705
}
706
 
707
static int cs4231_get_output_error(struct sparcaudio_driver *drv)
708
{
709
        struct cs4231_chip *cs4231_chip = (struct cs4231_chip *) drv->private;
710
 
711
        return (int) cs4231_chip->perchip_info.play.error;
712
}
713
 
714
static int cs4231_get_input_error(struct sparcaudio_driver *drv)
715
{
716
        struct cs4231_chip *cs4231_chip = (struct cs4231_chip *) drv->private;
717
 
718
        return (int) cs4231_chip->perchip_info.record.error;
719
}
720
 
721
#ifdef EB4231_SUPPORT
722
static int eb4231_get_output_samples(struct sparcaudio_driver *drv)
723
{
724
        struct cs4231_chip *cs4231_chip = (struct cs4231_chip *) drv->private;
725
        u32 dbcr = readl(cs4231_chip->eb2p + EBDMA_COUNT);
726
        int count =
727
                cs4231_length_to_samplecount(&cs4231_chip->perchip_info.play, dbcr);
728
 
729
        return (cs4231_chip->perchip_info.play.samples -
730
                ((count > cs4231_chip->perchip_info.play.samples)
731
                 ? 0 : count));
732
}
733
 
734
static int eb4231_get_input_samples(struct sparcaudio_driver *drv)
735
{
736
        struct cs4231_chip *cs4231_chip = (struct cs4231_chip *) drv->private;
737
        u32 dbcr = readl(cs4231_chip->eb2c + EBDMA_COUNT);
738
        int count =
739
                cs4231_length_to_samplecount(&cs4231_chip->perchip_info.record, dbcr);
740
 
741
        return (cs4231_chip->perchip_info.record.samples -
742
                ((count > cs4231_chip->perchip_info.record.samples) ?
743
 
744
}
745
#endif
746
 
747
static int cs4231_get_output_samples(struct sparcaudio_driver *drv)
748
{
749
        struct cs4231_chip *cs4231_chip = (struct cs4231_chip *) drv->private;
750
        u32 dmapc = sbus_readl(cs4231_chip->regs + APCPC);
751
        int count =
752
          cs4231_length_to_samplecount(&cs4231_chip->perchip_info.play, dmapc);
753
 
754
        return (cs4231_chip->perchip_info.play.samples -
755
                ((count > cs4231_chip->perchip_info.play.samples)
756
                 ? 0 : count));
757
}
758
 
759
static int cs4231_get_input_samples(struct sparcaudio_driver *drv)
760
{
761
        struct cs4231_chip *cs4231_chip = (struct cs4231_chip *) drv->private;
762
        u32 dmacc = sbus_readl(cs4231_chip->regs + APCCC);
763
        int count =
764
          cs4231_length_to_samplecount(&cs4231_chip->perchip_info.record, dmacc);
765
 
766
        return (cs4231_chip->perchip_info.record.samples -
767
                ((count > cs4231_chip->perchip_info.record.samples) ?
768
 
769
}
770
 
771
static int cs4231_get_output_pause(struct sparcaudio_driver *drv)
772
{
773
        struct cs4231_chip *cs4231_chip = (struct cs4231_chip *) drv->private;
774
 
775
        return (int) cs4231_chip->perchip_info.play.pause;
776
}
777
 
778
static int cs4231_get_input_pause(struct sparcaudio_driver *drv)
779
{
780
        struct cs4231_chip *cs4231_chip = (struct cs4231_chip *) drv->private;
781
 
782
        return (int) cs4231_chip->perchip_info.record.pause;
783
}
784
 
785
/* But for play/record we have these cheesy jacket routines because of
786
 * how this crap gets set.
787
 */
788
static int cs4231_set_input_volume(struct sparcaudio_driver *drv, int value)
789
{
790
        struct cs4231_chip *cs4231_chip = (struct cs4231_chip *) drv->private;
791
 
792
        cs4231_record_gain(drv, value,
793
                           cs4231_chip->perchip_info.record.balance);
794
 
795
        return 0;
796
}
797
 
798
static int cs4231_get_input_volume(struct sparcaudio_driver *drv)
799
{
800
        struct cs4231_chip *cs4231_chip = (struct cs4231_chip *) drv->private;
801
 
802
        return (int) cs4231_chip->perchip_info.record.gain;
803
}
804
 
805
static int cs4231_set_output_volume(struct sparcaudio_driver *drv, int value)
806
{
807
        struct cs4231_chip *cs4231_chip = (struct cs4231_chip *) drv->private;
808
 
809
        cs4231_play_gain(drv, value, cs4231_chip->perchip_info.play.balance);
810
 
811
        return 0;
812
}
813
 
814
static int cs4231_get_output_volume(struct sparcaudio_driver *drv)
815
{
816
        struct cs4231_chip *cs4231_chip = (struct cs4231_chip *) drv->private;
817
 
818
        return cs4231_chip->perchip_info.play.gain;
819
}
820
 
821
/* Likewise for balance */
822
static int cs4231_set_input_balance(struct sparcaudio_driver *drv, int value)
823
{
824
        struct cs4231_chip *cs4231_chip = (struct cs4231_chip *) drv->private;
825
 
826
        cs4231_chip->perchip_info.record.balance = value;
827
        cs4231_record_gain(drv, cs4231_chip->perchip_info.record.gain,
828
                           cs4231_chip->perchip_info.record.balance);
829
 
830
        return 0;
831
}
832
 
833
static int cs4231_get_input_balance(struct sparcaudio_driver *drv)
834
{
835
        struct cs4231_chip *cs4231_chip = (struct cs4231_chip *) drv->private;
836
 
837
        return (int) cs4231_chip->perchip_info.record.balance;
838
}
839
 
840
static int cs4231_set_output_balance(struct sparcaudio_driver *drv, int value)
841
{
842
        struct cs4231_chip *cs4231_chip = (struct cs4231_chip *) drv->private;
843
 
844
        cs4231_chip->perchip_info.play.balance = value;
845
        cs4231_play_gain(drv, cs4231_chip->perchip_info.play.gain,
846
                         cs4231_chip->perchip_info.play.balance);
847
 
848
        return 0;
849
}
850
 
851
static int cs4231_get_output_balance(struct sparcaudio_driver *drv)
852
{
853
        struct cs4231_chip *cs4231_chip = (struct cs4231_chip *) drv->private;
854
 
855
        return (int) cs4231_chip->perchip_info.play.balance;
856
}
857
 
858
/* Set chip record gain */
859
static int cs4231_record_gain(struct sparcaudio_driver *drv, int value,
860
                              unsigned char balance)
861
{
862
        struct cs4231_chip *cs4231_chip = (struct cs4231_chip *) drv->private;
863
        int tmp = 0, r, l, r_adj, l_adj;
864
        unsigned char old_gain;
865
 
866
        r = l = value;
867
 
868
        if (balance < AUDIO_MID_BALANCE) {
869
                r = (int) (value -
870
                           ((AUDIO_MID_BALANCE - balance) << AUDIO_BALANCE_SHIFT));
871
 
872
                if (r < 0)
873
                        r = 0;
874
        } else if (balance > AUDIO_MID_BALANCE) {
875
                l = (int) (value -
876
                           ((balance - AUDIO_MID_BALANCE) << AUDIO_BALANCE_SHIFT));
877
 
878
                if (l < 0)
879
                        l = 0;
880
        }
881
 
882
        l_adj = l * (CS4231_MAX_GAIN + 1) / (AUDIO_MAX_GAIN + 1);
883
        r_adj = r * (CS4231_MAX_GAIN + 1) / (AUDIO_MAX_GAIN + 1);
884
 
885
        WRITE_IAR(0x0);
886
        old_gain = READ_IDR();
887
        WRITE_IDR(RECGAIN_SET(old_gain, l_adj));
888
        WRITE_IAR(0x1);
889
        old_gain = READ_IDR();
890
        WRITE_IDR(RECGAIN_SET(old_gain, r_adj));
891
 
892
        if (l == value) {
893
                (l == 0) ? (tmp = 0) : (tmp = ((l_adj + 1) * AUDIO_MAX_GAIN) /
894
                                        (CS4231_MAX_GAIN + 1));
895
        } else if (r == value) {
896
                (r == 0) ? (tmp = 0) : (tmp = ((r_adj + 1) * AUDIO_MAX_GAIN) /
897
                                        (CS4231_MAX_GAIN + 1));
898
        }
899
        cs4231_chip->perchip_info.record.gain = tmp;
900
        return 0;
901
}
902
 
903
/* Set chip play gain */
904
static int cs4231_play_gain(struct sparcaudio_driver *drv, int value,
905
                            unsigned char balance)
906
{
907
        struct cs4231_chip *cs4231_chip = (struct cs4231_chip *) drv->private;
908
        int tmp = 0, r, l, r_adj, l_adj;
909
        unsigned char old_gain;
910
 
911
        tprintk(("in play_gain: %d %c\n", value, balance));
912
        r = l = value;
913
        if (balance < AUDIO_MID_BALANCE) {
914
                r = (int) (value -
915
                           ((AUDIO_MID_BALANCE - balance) << AUDIO_BALANCE_SHIFT));
916
 
917
                if (r < 0)
918
                        r = 0;
919
        } else if (balance > AUDIO_MID_BALANCE) {
920
                l = (int) (value -
921
                           ((balance - AUDIO_MID_BALANCE) << AUDIO_BALANCE_SHIFT));
922
 
923
                if (l < 0)
924
                        l = 0;
925
        }
926
 
927
        (l == 0) ? (l_adj = CS4231_MAX_DEV_ATEN) : (l_adj = CS4231_MAX_ATEN -
928
                                                    (l * (CS4231_MAX_ATEN + 1) /
929
                                                     (AUDIO_MAX_GAIN + 1)));
930
        (r == 0) ? (r_adj = CS4231_MAX_DEV_ATEN) : (r_adj = CS4231_MAX_ATEN -
931
                                                    (r * (CS4231_MAX_ATEN + 1) /
932
                                                     (AUDIO_MAX_GAIN + 1)));
933
 
934
        WRITE_IAR(0x6);
935
        old_gain = READ_IDR();
936
        WRITE_IDR(GAIN_SET(old_gain, l_adj));
937
        WRITE_IAR(0x7);
938
        old_gain = READ_IDR();
939
        WRITE_IDR(GAIN_SET(old_gain, r_adj));
940
 
941
        if ((value == 0) || (value == AUDIO_MAX_GAIN)) {
942
                tmp = value;
943
        } else {
944
                if (value == l) {
945
                        tmp = ((CS4231_MAX_ATEN - l_adj) * (AUDIO_MAX_GAIN + 1) /
946
                               (CS4231_MAX_ATEN + 1));
947
                } else if (value == r) {
948
                        tmp = ((CS4231_MAX_ATEN - r_adj) * (AUDIO_MAX_GAIN + 1) /
949
                               (CS4231_MAX_ATEN + 1));
950
                }
951
        }
952
        cs4231_chip->perchip_info.play.gain = tmp;
953
 
954
        return 0;
955
}
956
 
957
/* Reset the audio chip to a sane state. */
958
static void cs4231_chip_reset(struct sparcaudio_driver *drv)
959
{
960
        struct cs4231_chip *cs4231_chip = (struct cs4231_chip *) drv->private;
961
        unsigned char vers;
962
 
963
        tprintk(("in cs4231_chip_reset\n"));
964
 
965
        if (cs4231_chip->status & CS_STATUS_IS_EBUS) {
966
#ifdef EB4231_SUPPORT
967
                writel(EBUS_DCSR_RESET, cs4231_chip->eb2p + EBDMA_CSR);
968
                writel(EBUS_DCSR_RESET, cs4231_chip->eb2c + EBDMA_CSR);
969
                writel(EBUS_DCSR_BURST_SZ_16, cs4231_chip->eb2p + EBDMA_CSR);
970
                writel(EBUS_DCSR_BURST_SZ_16, cs4231_chip->eb2c + EBDMA_CSR);
971
#endif
972
        } else {
973
                u32 tmp;
974
 
975
                sbus_writel(APC_CHIP_RESET, cs4231_chip->regs + APCCSR);
976
                sbus_writel(0x00, cs4231_chip->regs + APCCSR);
977
                tmp = sbus_readl(cs4231_chip->regs + APCCSR);
978
                tmp |= APC_CDC_RESET;
979
                sbus_writel(tmp, cs4231_chip->regs + APCCSR);
980
 
981
                udelay(20);
982
 
983
                tmp = sbus_readl(cs4231_chip->regs + APCCSR);
984
                tmp &= ~(APC_CDC_RESET);
985
                sbus_writel(tmp, cs4231_chip->regs + APCCSR);
986
        }
987
 
988
        WRITE_IAR(READ_IAR() | IAR_AUTOCAL_BEGIN);
989
        CHIP_READY();
990
 
991
        WRITE_IAR(IAR_AUTOCAL_BEGIN | 0x0c);
992
        WRITE_IDR(MISC_IR_MODE2);
993
 
994
        /* This is the equivalent of DEFAULT_DATA_FMAT */
995
        cs4231_set_input_encoding(drv, AUDIO_ENCODING_ULAW);
996
        cs4231_set_input_rate(drv, CS4231_RATE);
997
        cs4231_set_input_channels(drv, CS4231_CHANNELS);
998
        cs4231_set_input_precision(drv, CS4231_PRECISION);
999
 
1000
        cs4231_set_output_encoding(drv, AUDIO_ENCODING_ULAW);
1001
        cs4231_set_output_rate(drv, CS4231_RATE);
1002
        cs4231_set_output_channels(drv, CS4231_CHANNELS);
1003
        cs4231_set_output_precision(drv, CS4231_PRECISION);
1004
 
1005
        WRITE_IAR(0x19);
1006
 
1007
        /* see what we can turn on */
1008
        vers = READ_IDR();
1009
        if (vers & CS4231A) {
1010
                tprintk(("This is a CS4231A\n"));
1011
                cs4231_chip->status |= CS_STATUS_REV_A;
1012
        } else {
1013
                cs4231_chip->status &= ~CS_STATUS_REV_A;
1014
        }
1015
 
1016
        WRITE_IAR(IAR_AUTOCAL_BEGIN | 0x10);
1017
        WRITE_IDR(OLB_ENABLE);
1018
 
1019
        WRITE_IAR(IAR_AUTOCAL_BEGIN | 0x11);
1020
        if (cs4231_chip->status & CS_STATUS_REV_A)
1021
                WRITE_IDR(HPF_ON | XTALE_ON);
1022
        else
1023
                WRITE_IDR(HPF_ON);
1024
 
1025
        WRITE_IAR(IAR_AUTOCAL_BEGIN | 0x1a);
1026
        WRITE_IDR(0x00);
1027
 
1028
        /* Now set things up for defaults */
1029
        cs4231_set_input_balance(drv, AUDIO_MID_BALANCE);
1030
        cs4231_set_output_balance(drv, AUDIO_MID_BALANCE);
1031
 
1032
        cs4231_set_input_volume(drv, CS4231_DEFAULT_RECGAIN);
1033
        cs4231_set_output_volume(drv, CS4231_DEFAULT_PLAYGAIN);
1034
 
1035
        cs4231_set_input_port(drv, AUDIO_MICROPHONE);
1036
        cs4231_set_output_port(drv, AUDIO_SPEAKER);
1037
 
1038
        cs4231_set_monitor_volume(drv, LOOPB_OFF);
1039
 
1040
        WRITE_IAR(IAR_AUTOCAL_END);
1041
 
1042
        cs4231_ready(drv);
1043
 
1044
        WRITE_IAR(IAR_AUTOCAL_BEGIN | 0x09);
1045
        WRITE_IDR(READ_IDR() & ACAL_DISABLE);
1046
        WRITE_IAR(IAR_AUTOCAL_END);
1047
 
1048
        cs4231_ready(drv);
1049
 
1050
        cs4231_output_muted(drv, 0);
1051
 
1052
        cs4231_chip->recording_count = 0;
1053
        cs4231_chip->input_next_dma_handle = 0;
1054
        cs4231_chip->input_dma_handle = 0;
1055
        cs4231_chip->input_next_dma_size = 0;
1056
        cs4231_chip->input_dma_size = 0;
1057
 
1058
        cs4231_chip->playing_count = 0;
1059
        cs4231_chip->output_next_dma_handle = 0;
1060
        cs4231_chip->output_dma_handle = 0;
1061
        cs4231_chip->output_next_dma_size = 0;
1062
        cs4231_chip->output_dma_size = 0;
1063
}
1064
 
1065
static int
1066
cs4231_length_to_samplecount(struct audio_prinfo *thisdir, unsigned int length)
1067
{
1068
        unsigned int count;
1069
 
1070
        if (thisdir->channels == 2)
1071
                count = (length / 2);
1072
        else
1073
                count = length;
1074
 
1075
        if (thisdir->encoding == AUDIO_ENCODING_LINEAR)
1076
                count = (count / 2);
1077
        else if (thisdir->encoding == AUDIO_ENCODING_DVI)
1078
                count = (count / 4);
1079
 
1080
        return count;
1081
}
1082
 
1083
#ifdef EB4231_SUPPORT
1084
static void eb4231_getsamplecount(struct sparcaudio_driver *drv,
1085
                                  unsigned int length,
1086
                                  unsigned int direction)
1087
{
1088
        struct cs4231_chip *cs4231_chip = (struct cs4231_chip *) drv->private;
1089
        struct audio_prinfo *thisdir;
1090
        unsigned int count, curcount, nextcount, dbcr;
1091
 
1092
        if(direction == 1) {
1093
                thisdir = &cs4231_chip->perchip_info.record;
1094
                dbcr = readl(cs4231_chip->eb2c + EBDMA_COUNT);
1095
                nextcount = cs4231_chip->input_next_dma_size;
1096
        } else {
1097
                thisdir = &cs4231_chip->perchip_info.play;
1098
                dbcr = readl(cs4231_chip->eb2p + EBDMA_COUNT);
1099
                nextcount = cs4231_chip->output_next_dma_size;
1100
        }
1101
        curcount = cs4231_length_to_samplecount(thisdir, dbcr);
1102
        count = thisdir->samples;
1103
        length = cs4231_length_to_samplecount(thisdir, length);
1104
        /* normalize for where we are. */
1105
        thisdir->samples = ((count - nextcount) + (length - curcount));
1106
}
1107
#endif
1108
 
1109
static void cs4231_getsamplecount(struct sparcaudio_driver *drv,
1110
                                  unsigned int length,
1111
                                  unsigned int direction)
1112
{
1113
        struct cs4231_chip *cs4231_chip = (struct cs4231_chip *) drv->private;
1114
        struct audio_prinfo *thisdir;
1115
        unsigned int count, nextcount, curcount;
1116
        u32 tmp;
1117
 
1118
        if (direction == 1) {
1119
                /* record */
1120
                thisdir = &cs4231_chip->perchip_info.record;
1121
                tmp = sbus_readl(cs4231_chip->regs + APCCC);
1122
                curcount = cs4231_length_to_samplecount(thisdir, tmp);
1123
                tmp = sbus_readl(cs4231_chip->regs + APCCNC);
1124
                nextcount = cs4231_length_to_samplecount(thisdir, tmp);
1125
        } else {
1126
                /* play */
1127
                thisdir = &cs4231_chip->perchip_info.play;
1128
                tmp = sbus_readl(cs4231_chip->regs + APCPC);
1129
                curcount = cs4231_length_to_samplecount(thisdir, tmp);
1130
                tmp = sbus_readl(cs4231_chip->regs + APCPNC);
1131
                nextcount = cs4231_length_to_samplecount(thisdir, tmp);
1132
        }
1133
        count = thisdir->samples;
1134
        length = cs4231_length_to_samplecount(thisdir, length);
1135
 
1136
        /* normalize for where we are. */
1137
        thisdir->samples = ((count - nextcount) + (length - curcount));
1138
}
1139
 
1140
static int cs4231_open(struct inode * inode, struct file * file, struct sparcaudio_driver *drv)
1141
{
1142
        struct cs4231_chip *cs4231_chip = (struct cs4231_chip *) drv->private;
1143
 
1144
        /* Set the default audio parameters if not already in use. */
1145
        if (file->f_mode & FMODE_WRITE) {
1146
                if (!(drv->flags & SDF_OPEN_WRITE) &&
1147
                    (cs4231_chip->perchip_info.play.active == 0)) {
1148
                        cs4231_chip->perchip_info.play.open = 1;
1149
                        cs4231_chip->perchip_info.play.samples =
1150
                                cs4231_chip->perchip_info.play.error = 0;
1151
                }
1152
        }
1153
 
1154
        if (file->f_mode & FMODE_READ) {
1155
                if (!(drv->flags & SDF_OPEN_READ) &&
1156
                    (cs4231_chip->perchip_info.record.active == 0)) {
1157
                        cs4231_chip->perchip_info.record.open = 1;
1158
                        cs4231_chip->perchip_info.record.samples =
1159
                                cs4231_chip->perchip_info.record.error = 0;
1160
                }
1161
        }
1162
 
1163
        cs4231_ready(drv);
1164
        CHIP_READY();
1165
 
1166
        MOD_INC_USE_COUNT;
1167
 
1168
        return 0;
1169
}
1170
 
1171
static void cs4231_release(struct inode * inode, struct file * file, struct sparcaudio_driver *drv)
1172
{
1173
        struct cs4231_chip *cs4231_chip = (struct cs4231_chip *)drv->private;
1174
        void (*dma_unmap_single)(struct sbus_dev *, dma_addr_t, size_t, int) = sbus_unmap_single;
1175
 
1176
#ifdef EB4231_SUPPORT
1177
        if (cs4231_chip->status & CS_STATUS_IS_EBUS)
1178
                dma_unmap_single = (void (*)(struct sbus_dev *, dma_addr_t, size_t, int)) pci_unmap_single;
1179
#endif
1180
        /* zero out any info about what data we have as well */
1181
        if (file->f_mode & FMODE_READ) {
1182
                /* stop capture here or midlevel? */
1183
                cs4231_chip->perchip_info.record.open = 0;
1184
                if (cs4231_chip->input_dma_handle) {
1185
                        dma_unmap_single(drv->dev,
1186
                                         cs4231_chip->input_dma_handle,
1187
                                         cs4231_chip->input_dma_size,
1188
                                         SBUS_DMA_FROMDEVICE);
1189
                        cs4231_chip->input_dma_handle = 0;
1190
                        cs4231_chip->input_dma_size = 0;
1191
                }
1192
                if (cs4231_chip->input_next_dma_handle) {
1193
                        dma_unmap_single(drv->dev,
1194
                                         cs4231_chip->input_next_dma_handle,
1195
                                         cs4231_chip->input_next_dma_size,
1196
                                         SBUS_DMA_FROMDEVICE);
1197
                        cs4231_chip->input_next_dma_handle = 0;
1198
                        cs4231_chip->input_next_dma_size = 0;
1199
                }
1200
        }
1201
 
1202
        if (file->f_mode & FMODE_WRITE) {
1203
                cs4231_chip->perchip_info.play.active =
1204
                        cs4231_chip->perchip_info.play.open = 0;
1205
                if (cs4231_chip->output_dma_handle) {
1206
                        dma_unmap_single(drv->dev,
1207
                                         cs4231_chip->output_dma_handle,
1208
                                         cs4231_chip->output_dma_size,
1209
                                         SBUS_DMA_TODEVICE);
1210
                        cs4231_chip->output_dma_handle = 0;
1211
                        cs4231_chip->output_dma_size = 0;
1212
                }
1213
                if (cs4231_chip->output_next_dma_handle) {
1214
                        dma_unmap_single(drv->dev,
1215
                                         cs4231_chip->output_next_dma_handle,
1216
                                         cs4231_chip->output_next_dma_size,
1217
                                         SBUS_DMA_TODEVICE);
1218
                        cs4231_chip->output_next_dma_handle = 0;
1219
                        cs4231_chip->output_next_dma_size = 0;
1220
                }
1221
        }
1222
 
1223
        if (!cs4231_chip->perchip_info.play.open &&
1224
            !cs4231_chip->perchip_info.record.open &&
1225
            (cs4231_chip->status & CS_STATUS_INIT_ON_CLOSE)) {
1226
                cs4231_chip_reset(drv);
1227
                cs4231_chip->status &= ~CS_STATUS_INIT_ON_CLOSE;
1228
        }
1229
 
1230
        MOD_DEC_USE_COUNT;
1231
}
1232
 
1233
static void cs4231_playintr(struct sparcaudio_driver *drv, int push)
1234
{
1235
        struct cs4231_chip *cs4231_chip = (struct cs4231_chip *) drv->private;
1236
        int status = 0;
1237
 
1238
        if (!push) {
1239
                if (!cs4231_chip->perchip_info.play.active) {
1240
                        sbus_writel(cs4231_chip->output_next_dma_handle,
1241
                                    cs4231_chip->regs + APCPNVA);
1242
                        sbus_writel(cs4231_chip->output_next_dma_size,
1243
                                    cs4231_chip->regs + APCPNC);
1244
                }
1245
                sparcaudio_output_done(drv, 0);
1246
                return;
1247
        }
1248
 
1249
        if (cs4231_chip->playlen == 0 && cs4231_chip->output_size > 0)
1250
                cs4231_chip->playlen = cs4231_chip->output_size;
1251
 
1252
        if (cs4231_chip->output_dma_handle) {
1253
                sbus_unmap_single(drv->dev,
1254
                                  cs4231_chip->output_dma_handle,
1255
                                  cs4231_chip->output_dma_size,
1256
                                  SBUS_DMA_TODEVICE);
1257
                cs4231_chip->output_dma_handle = 0;
1258
                cs4231_chip->output_dma_size = 0;
1259
                cs4231_chip->playing_count--;
1260
                status++;
1261
        }
1262
 
1263
        if (cs4231_chip->output_next_dma_handle) {
1264
                cs4231_chip->output_dma_handle = cs4231_chip->output_next_dma_handle;
1265
                cs4231_chip->output_dma_size = cs4231_chip->output_next_dma_size;
1266
                cs4231_chip->output_next_dma_size = 0;
1267
                cs4231_chip->output_next_dma_handle = 0;
1268
        }
1269
 
1270
        if ((cs4231_chip->output_ptr && cs4231_chip->output_size > 0) &&
1271
            !(cs4231_chip->perchip_info.play.pause)) {
1272
                cs4231_chip->output_next_dma_handle =
1273
                        sbus_map_single(drv->dev,
1274
                                        (char *)cs4231_chip->output_ptr,
1275
                                        cs4231_chip->output_size,
1276
                                        SBUS_DMA_TODEVICE);
1277
                cs4231_chip->output_next_dma_size = cs4231_chip->output_size;
1278
                sbus_writel(cs4231_chip->output_next_dma_handle,
1279
                            cs4231_chip->regs + APCPNVA);
1280
                sbus_writel(cs4231_chip->output_next_dma_size,
1281
                            cs4231_chip->regs + APCPNC);
1282
                cs4231_chip->output_size = 0;
1283
                cs4231_chip->output_ptr = NULL;
1284
                cs4231_chip->playing_count++;
1285
                status += 2;
1286
        } else {
1287
                sbus_writel(0, cs4231_chip->regs + APCPNVA);
1288
                sbus_writel(0, cs4231_chip->regs + APCPNC);
1289
        }
1290
 
1291
        sparcaudio_output_done(drv, status);
1292
}
1293
 
1294
#ifdef EB4231_SUPPORT
1295
static void eb4231_playintr(struct sparcaudio_driver *drv)
1296
{
1297
        struct cs4231_chip *cs4231_chip = (struct cs4231_chip *) drv->private;
1298
        int status = 0;
1299
 
1300
        if (cs4231_chip->playlen == 0 && cs4231_chip->output_size > 0)
1301
                cs4231_chip->playlen = cs4231_chip->output_size;
1302
 
1303
        if (cs4231_chip->output_dma_handle) {
1304
                pci_unmap_single((struct pci_dev *)drv->dev,
1305
                                 cs4231_chip->output_dma_handle,
1306
                                 cs4231_chip->output_dma_size,
1307
                                 PCI_DMA_TODEVICE);
1308
                cs4231_chip->output_dma_handle = 0;
1309
                cs4231_chip->output_dma_size = 0;
1310
                cs4231_chip->playing_count--;
1311
                status++;
1312
        }
1313
 
1314
        if(cs4231_chip->output_next_dma_handle) {
1315
                cs4231_chip->output_dma_handle = cs4231_chip->output_next_dma_handle;
1316
                cs4231_chip->output_dma_size = cs4231_chip->output_next_dma_size;
1317
                cs4231_chip->output_next_dma_handle = 0;
1318
                cs4231_chip->output_next_dma_size = 0;
1319
        }
1320
 
1321
        if ((cs4231_chip->output_ptr && cs4231_chip->output_size > 0) &&
1322
            !(cs4231_chip->perchip_info.play.pause)) {
1323
                cs4231_chip->output_next_dma_handle =
1324
                        pci_map_single((struct pci_dev *)drv->dev,
1325
                                       (char *)cs4231_chip->output_ptr,
1326
                                       cs4231_chip->output_size,
1327
                                       PCI_DMA_TODEVICE);
1328
                cs4231_chip->output_next_dma_size = cs4231_chip->output_size;
1329
 
1330
                writel(cs4231_chip->output_next_dma_size,
1331
                       cs4231_chip->eb2p + EBDMA_COUNT);
1332
                writel(cs4231_chip->output_next_dma_handle,
1333
                       cs4231_chip->eb2p + EBDMA_ADDR);
1334
                cs4231_chip->output_size = 0;
1335
                cs4231_chip->output_ptr = NULL;
1336
                cs4231_chip->playing_count++;
1337
                status += 2;
1338
        }
1339
 
1340
        sparcaudio_output_done(drv, status);
1341
}
1342
#endif
1343
 
1344
static void cs4231_recclear(int fmt, char *dmabuf, int length)
1345
{
1346
        switch (fmt) {
1347
        case AUDIO_ENCODING_LINEAR:
1348
                memset(dmabuf, 0x00, length);
1349
                break;
1350
        case AUDIO_ENCODING_ALAW:
1351
                memset(dmabuf, 0xd5, length);
1352
                break;
1353
        case AUDIO_ENCODING_ULAW:
1354
                memset(dmabuf, 0xff, length);
1355
                break;
1356
        }
1357
}
1358
 
1359
static int cs4231_recintr(struct sparcaudio_driver *drv)
1360
{
1361
        struct cs4231_chip *cs4231_chip = (struct cs4231_chip *) drv->private;
1362
        int status = 0;
1363
 
1364
        if (cs4231_chip->perchip_info.record.active == 0) {
1365
                dprintk(("going inactive\n"));
1366
                cs4231_pollinput(drv);
1367
                cs4231_disable_rec(drv);
1368
        }
1369
 
1370
        if (cs4231_chip->input_dma_handle) {
1371
                sbus_unmap_single(drv->dev,
1372
                                  cs4231_chip->input_dma_handle,
1373
                                  cs4231_chip->input_dma_size,
1374
                                  SBUS_DMA_FROMDEVICE);
1375
                cs4231_chip->input_dma_handle = 0;
1376
                cs4231_chip->input_dma_size = 0;
1377
                cs4231_chip->recording_count--;
1378
                status++;
1379
        }
1380
 
1381
        if (cs4231_chip->input_next_dma_handle) {
1382
                cs4231_chip->input_dma_handle = cs4231_chip->input_next_dma_handle;
1383
                cs4231_chip->input_dma_size = cs4231_chip->input_next_dma_size;
1384
                cs4231_chip->input_next_dma_size = 0;
1385
                cs4231_chip->input_next_dma_handle = 0;
1386
        }
1387
 
1388
        if ((cs4231_chip->input_ptr && cs4231_chip->input_size > 0) &&
1389
            !(cs4231_chip->perchip_info.record.pause)) {
1390
                cs4231_recclear(cs4231_chip->perchip_info.record.encoding,
1391
                                (char *)cs4231_chip->input_ptr,
1392
                                cs4231_chip->input_size);
1393
                cs4231_chip->input_next_dma_handle =
1394
                        sbus_map_single(drv->dev,
1395
                                        (char *)cs4231_chip->input_ptr,
1396
                                        cs4231_chip->input_size,
1397
                                        SBUS_DMA_FROMDEVICE);
1398
                cs4231_chip->input_next_dma_size = cs4231_chip->input_size;
1399
                sbus_writel(cs4231_chip->input_next_dma_handle,
1400
                            cs4231_chip->regs + APCCNVA);
1401
                sbus_writel(cs4231_chip->input_next_dma_size,
1402
                            cs4231_chip->regs + APCCNC);
1403
                cs4231_chip->input_size = 0;
1404
                cs4231_chip->input_ptr = NULL;
1405
                cs4231_chip->recording_count++;
1406
                status += 2;
1407
        } else {
1408
                sbus_writel(0, cs4231_chip->regs + APCCNVA);
1409
                sbus_writel(0, cs4231_chip->regs + APCCNC);
1410
        }
1411
 
1412
        sparcaudio_input_done(drv, status);
1413
        return 1;
1414
}
1415
 
1416
#ifdef EB4231_SUPPORT
1417
static int eb4231_recintr(struct sparcaudio_driver *drv)
1418
{
1419
        struct cs4231_chip *cs4231_chip = (struct cs4231_chip *) drv->private;
1420
        int status = 0;
1421
 
1422
        if (cs4231_chip->perchip_info.record.active == 0) {
1423
                dprintk(("going inactive\n"));
1424
                eb4231_pollinput(drv);
1425
                cs4231_disable_rec(drv);
1426
        }
1427
 
1428
        if (cs4231_chip->input_dma_handle) {
1429
                pci_unmap_single((struct pci_dev *)drv->dev,
1430
                                 cs4231_chip->input_dma_handle,
1431
                                 cs4231_chip->input_dma_size,
1432
                                 PCI_DMA_FROMDEVICE);
1433
                cs4231_chip->input_dma_handle = 0;
1434
                cs4231_chip->input_dma_size = 0;
1435
                cs4231_chip->recording_count--;
1436
                status++;
1437
        }
1438
 
1439
        if (cs4231_chip->input_next_dma_handle) {
1440
                cs4231_chip->input_dma_handle = cs4231_chip->input_next_dma_handle;
1441
                cs4231_chip->input_dma_size = cs4231_chip->input_next_dma_size;
1442
                cs4231_chip->input_next_dma_size = 0;
1443
                cs4231_chip->input_next_dma_handle = 0;
1444
        }
1445
 
1446
        if ((cs4231_chip->input_ptr && cs4231_chip->input_size > 0) &&
1447
            !(cs4231_chip->perchip_info.record.pause)) {
1448
                cs4231_recclear(cs4231_chip->perchip_info.record.encoding,
1449
                                (char *)cs4231_chip->input_ptr,
1450
                                cs4231_chip->input_size);
1451
 
1452
                cs4231_chip->input_next_dma_handle =
1453
                        pci_map_single((struct pci_dev *)drv->dev,
1454
                                       (char *)cs4231_chip->input_ptr,
1455
                                       cs4231_chip->input_size,
1456
                                       PCI_DMA_FROMDEVICE);
1457
                cs4231_chip->input_next_dma_size = cs4231_chip->input_size;
1458
 
1459
                writel(cs4231_chip->input_next_dma_size,
1460
                       cs4231_chip->eb2c + EBDMA_COUNT);
1461
                writel(cs4231_chip->input_next_dma_handle,
1462
                       cs4231_chip->eb2c + EBDMA_ADDR);
1463
 
1464
                cs4231_chip->input_size = 0;
1465
                cs4231_chip->input_ptr = NULL;
1466
                cs4231_chip->recording_count++;
1467
                status += 2;
1468
        }
1469
 
1470
        sparcaudio_input_done(drv, status);
1471
        return 1;
1472
}
1473
#endif
1474
 
1475
#ifdef EB4231_SUPPORT
1476
static void eb4231_start_output(struct sparcaudio_driver *drv, __u8 * buffer,
1477
                                unsigned long count)
1478
{
1479
        struct cs4231_chip *cs4231_chip = (struct cs4231_chip *) drv->private;
1480
        u32 dcsr;
1481
 
1482
        cs4231_chip->output_ptr = buffer;
1483
        cs4231_chip->output_size = count;
1484
 
1485
        if (cs4231_chip->perchip_info.play.active ||
1486
            (cs4231_chip->perchip_info.play.pause))
1487
                return;
1488
 
1489
        cs4231_ready(drv);
1490
 
1491
        cs4231_chip->perchip_info.play.active = 1;
1492
        cs4231_chip->playing_count = 0;
1493
 
1494
        dcsr = readl(cs4231_chip->eb2p + EBDMA_CSR);
1495
        if (!(dcsr & EBUS_DCSR_EN_DMA)) {
1496
                writel(EBUS_DCSR_RESET, cs4231_chip->eb2p + EBDMA_CSR);
1497
                writel(EBUS_DCSR_BURST_SZ_16, cs4231_chip->eb2p + EBDMA_CSR);
1498
 
1499
                eb4231_playintr(drv);
1500
 
1501
                writel(EBUS_DCSR_BURST_SZ_16 |
1502
                       (EBUS_DCSR_EN_DMA | EBUS_DCSR_INT_EN |
1503
                        EBUS_DCSR_EN_CNT | EBUS_DCSR_EN_NEXT),
1504
                       cs4231_chip->eb2p + EBDMA_CSR);
1505
 
1506
                cs4231_enable_play(drv);
1507
 
1508
                cs4231_ready(drv);
1509
        } else {
1510
                eb4231_playintr(drv);
1511
        }
1512
}
1513
#endif
1514
 
1515
static void cs4231_start_output(struct sparcaudio_driver *drv, __u8 * buffer,
1516
                                unsigned long count)
1517
{
1518
        struct cs4231_chip *cs4231_chip = (struct cs4231_chip *) drv->private;
1519
        u32 csr;
1520
 
1521
        tprintk(("in 4231 start output\n"));
1522
        cs4231_chip->output_ptr = buffer;
1523
        cs4231_chip->output_size = count;
1524
 
1525
        if (cs4231_chip->perchip_info.play.active ||
1526
            (cs4231_chip->perchip_info.play.pause))
1527
                return;
1528
 
1529
        cs4231_ready(drv);
1530
 
1531
        cs4231_chip->perchip_info.play.active = 1;
1532
        cs4231_chip->playing_count = 0;
1533
 
1534
        csr = sbus_readl(cs4231_chip->regs + APCCSR);
1535
        if ((csr & APC_PPAUSE) || !(csr & APC_PDMA_READY)) {
1536
                u32 pnva;
1537
 
1538
                csr &= ~APC_XINT_PLAY;
1539
                sbus_writel(csr, cs4231_chip->regs + APCCSR);
1540
                csr &= ~APC_PPAUSE;
1541
                sbus_writel(csr, cs4231_chip->regs + APCCSR);
1542
 
1543
                pnva = sbus_readl(cs4231_chip->regs + APCPNVA);
1544
                cs4231_playintr(drv, (pnva == 0) ? 1 : 0);
1545
 
1546
                csr |= APC_PLAY_SETUP;
1547
                sbus_writel(csr, cs4231_chip->regs + APCCSR);
1548
                cs4231_enable_play(drv);
1549
 
1550
                cs4231_ready(drv);
1551
        }
1552
}
1553
 
1554
#ifdef EB4231_SUPPORT
1555
static void eb4231_stop_output(struct sparcaudio_driver *drv)
1556
{
1557
        struct cs4231_chip *cs4231_chip = (struct cs4231_chip *) drv->private;
1558
        u32 dcsr;
1559
 
1560
        dprintk(("eb4231_stop_output: dcsr 0x%x dacr 0x%x dbcr %d\n",
1561
                 readl(cs4231_chip->eb2p + EBDMA_CSR),
1562
                 readl(cs4231_chip->eb2p + EBDMA_ADDR),
1563
                 readl(cs4231_chip->eb2p + EBDMA_COUNT)));
1564
 
1565
        cs4231_chip->output_ptr = NULL;
1566
        cs4231_chip->output_size = 0;
1567
 
1568
        if (cs4231_chip->output_dma_handle) {
1569
                pci_unmap_single((struct pci_dev *)drv->dev,
1570
                                 cs4231_chip->output_dma_handle,
1571
                                 cs4231_chip->output_dma_size,
1572
                                 PCI_DMA_TODEVICE);
1573
                cs4231_chip->output_dma_handle = 0;
1574
                cs4231_chip->output_dma_size = 0;
1575
        }
1576
 
1577
        if (cs4231_chip->output_next_dma_handle) {
1578
                pci_unmap_single((struct pci_dev *)drv->dev,
1579
                                 cs4231_chip->output_next_dma_handle,
1580
                                 cs4231_chip->output_next_dma_size,
1581
                                 PCI_DMA_TODEVICE);
1582
                cs4231_chip->output_next_dma_handle = 0;
1583
                cs4231_chip->output_next_dma_size = 0;
1584
        }
1585
        dcsr = readl(cs4231_chip->eb2p + EBDMA_CSR);
1586
        if(dcsr & EBUS_DCSR_EN_DMA)
1587
                writel(dcsr & ~EBUS_DCSR_EN_DMA,
1588
                       cs4231_chip->eb2p + EBDMA_CSR);
1589
 
1590
        /* Else subsequent speed setting changes are ignored by the chip. */
1591
        cs4231_disable_play(drv);
1592
}
1593
#endif
1594
 
1595
static void cs4231_stop_output(struct sparcaudio_driver *drv)
1596
{
1597
        struct cs4231_chip *cs4231_chip = (struct cs4231_chip *) drv->private;
1598
 
1599
        tprintk(("in cs4231_stop_output\n"));
1600
        cs4231_chip->output_ptr = NULL;
1601
        cs4231_chip->output_size = 0;
1602
 
1603
        if (cs4231_chip->output_dma_handle) {
1604
                sbus_unmap_single(drv->dev,
1605
                                  cs4231_chip->output_dma_handle,
1606
                                  cs4231_chip->output_dma_size,
1607
                                  SBUS_DMA_TODEVICE);
1608
                cs4231_chip->output_dma_handle = 0;
1609
                cs4231_chip->output_dma_size = 0;
1610
        }
1611
 
1612
        if (cs4231_chip->output_next_dma_handle) {
1613
                sbus_unmap_single(drv->dev,
1614
                                  cs4231_chip->output_next_dma_handle,
1615
                                  cs4231_chip->output_next_dma_size,
1616
                                  SBUS_DMA_TODEVICE);
1617
                cs4231_chip->output_next_dma_handle = 0;
1618
                cs4231_chip->output_next_dma_size = 0;
1619
        }
1620
#if 0 /* Not safe without shutting off the DMA controller as well. -DaveM */
1621
        /* Else subsequent speed setting changes are ignored by the chip. */
1622
        cs4231_disable_play(drv);
1623
#endif
1624
}
1625
 
1626
#ifdef EB4231_SUPPORT
1627
static void eb4231_pollinput(struct sparcaudio_driver *drv)
1628
{
1629
        struct cs4231_chip *cs4231_chip = (struct cs4231_chip *) drv->private;
1630
        int x;
1631
        u32 dcsr;
1632
 
1633
        x = 0;
1634
        do {
1635
                dcsr = readl(cs4231_chip->eb2c + EBDMA_CSR);
1636
                if (dcsr & EBUS_DCSR_TC)
1637
                        break;
1638
                x++;
1639
        } while (x <= CS_TIMEOUT);
1640
 
1641
        writel(dcsr | EBUS_DCSR_TC,
1642
               cs4231_chip->eb2c + EBDMA_CSR);
1643
}
1644
#endif
1645
 
1646
static void cs4231_pollinput(struct sparcaudio_driver *drv)
1647
{
1648
        struct cs4231_chip *cs4231_chip = (struct cs4231_chip *) drv->private;
1649
        int x;
1650
        u32 csr;
1651
 
1652
        x = 0;
1653
        do {
1654
                csr = sbus_readl(cs4231_chip->regs + APCCSR);
1655
                if (csr & APC_XINT_COVF)
1656
                        break;
1657
                x++;
1658
        } while (x <= CS_TIMEOUT);
1659
 
1660
        sbus_writel(csr | APC_XINT_CEMP,
1661
                    cs4231_chip->regs + APCCSR);
1662
}
1663
 
1664
static void cs4231_start_input(struct sparcaudio_driver *drv, __u8 * buffer,
1665
                               unsigned long count)
1666
{
1667
        struct cs4231_chip *cs4231_chip = (struct cs4231_chip *) drv->private;
1668
        u32 csr;
1669
 
1670
        cs4231_chip->input_ptr = buffer;
1671
        cs4231_chip->input_size = count;
1672
 
1673
        if (cs4231_chip->perchip_info.record.active ||
1674
            (cs4231_chip->perchip_info.record.pause))
1675
                return;
1676
 
1677
        cs4231_ready(drv);
1678
 
1679
        cs4231_chip->perchip_info.record.active = 1;
1680
        cs4231_chip->recording_count = 0;
1681
 
1682
        csr = sbus_readl(cs4231_chip->regs + APCCSR);
1683
        if ((csr & APC_CPAUSE) || !(csr & APC_CDMA_READY)) {
1684
                csr &= ~APC_XINT_CAPT;
1685
                sbus_writel(csr, cs4231_chip->regs + APCCSR);
1686
                csr &= ~APC_CPAUSE;
1687
                sbus_writel(csr, cs4231_chip->regs + APCCSR);
1688
 
1689
                cs4231_recintr(drv);
1690
 
1691
                csr |= APC_CAPT_SETUP;
1692
                sbus_writel(csr, cs4231_chip->regs + APCCSR);
1693
 
1694
                cs4231_enable_rec(drv);
1695
                cs4231_ready(drv);
1696
        } else {
1697
                cs4231_recintr(drv);
1698
        }
1699
}
1700
 
1701
static void cs4231_stop_input(struct sparcaudio_driver *drv)
1702
{
1703
        struct cs4231_chip *cs4231_chip = (struct cs4231_chip *) drv->private;
1704
        u32 csr;
1705
 
1706
        cs4231_chip->perchip_info.record.active = 0;
1707
 
1708
        csr = sbus_readl(cs4231_chip->regs + APCCSR);
1709
        csr |= APC_CPAUSE;
1710
        sbus_writel(csr, cs4231_chip->regs + APCCSR);
1711
 
1712
        cs4231_chip->input_ptr = NULL;
1713
        cs4231_chip->input_size = 0;
1714
 
1715
        if (cs4231_chip->input_dma_handle) {
1716
                sbus_unmap_single(drv->dev,
1717
                                  cs4231_chip->input_dma_handle,
1718
                                  cs4231_chip->input_dma_size,
1719
                                  SBUS_DMA_FROMDEVICE);
1720
                cs4231_chip->input_dma_handle = 0;
1721
                cs4231_chip->input_dma_size = 0;
1722
        }
1723
 
1724
        if (cs4231_chip->input_next_dma_handle) {
1725
                sbus_unmap_single(drv->dev,
1726
                                  cs4231_chip->input_next_dma_handle,
1727
                                  cs4231_chip->input_next_dma_size,
1728
                                  SBUS_DMA_FROMDEVICE);
1729
                cs4231_chip->input_next_dma_handle = 0;
1730
                cs4231_chip->input_next_dma_size = 0;
1731
        }
1732
 
1733
        cs4231_pollinput(drv);
1734
}
1735
 
1736
#ifdef EB4231_SUPPORT
1737
static void eb4231_start_input(struct sparcaudio_driver *drv, __u8 * buffer,
1738
                               unsigned long count)
1739
{
1740
        struct cs4231_chip *cs4231_chip = (struct cs4231_chip *) drv->private;
1741
        u32 dcsr;
1742
 
1743
        cs4231_chip->input_ptr = buffer;
1744
        cs4231_chip->input_size = count;
1745
 
1746
        if (cs4231_chip->perchip_info.record.active ||
1747
            (cs4231_chip->perchip_info.record.pause))
1748
                return;
1749
 
1750
        cs4231_ready(drv);
1751
        cs4231_chip->perchip_info.record.active = 1;
1752
        cs4231_chip->recording_count = 0;
1753
 
1754
        dcsr = readl(cs4231_chip->eb2c + EBDMA_CSR);
1755
        if (!(dcsr & EBUS_DCSR_EN_DMA)) {
1756
                writel(EBUS_DCSR_RESET, cs4231_chip->eb2c + EBDMA_CSR);
1757
                writel(EBUS_DCSR_BURST_SZ_16, cs4231_chip->eb2c + EBDMA_CSR);
1758
 
1759
                eb4231_recintr(drv);
1760
 
1761
                writel(EBUS_DCSR_BURST_SZ_16 |
1762
                       (EBUS_DCSR_EN_DMA | EBUS_DCSR_INT_EN |
1763
                        EBUS_DCSR_EN_CNT | EBUS_DCSR_EN_NEXT),
1764
                       cs4231_chip->eb2c + EBDMA_CSR);
1765
 
1766
                cs4231_enable_rec(drv);
1767
                cs4231_ready(drv);
1768
        } else {
1769
                eb4231_recintr(drv);
1770
        }
1771
}
1772
 
1773
static void eb4231_stop_input(struct sparcaudio_driver *drv)
1774
{
1775
        struct cs4231_chip *cs4231_chip = (struct cs4231_chip *) drv->private;
1776
        u32 dcsr;
1777
 
1778
        cs4231_chip->perchip_info.record.active = 0;
1779
 
1780
        cs4231_chip->input_ptr = NULL;
1781
        cs4231_chip->input_size = 0;
1782
 
1783
        if (cs4231_chip->input_dma_handle) {
1784
                pci_unmap_single((struct pci_dev *)drv->dev,
1785
                                 cs4231_chip->input_dma_handle,
1786
                                 cs4231_chip->input_dma_size,
1787
                                 PCI_DMA_FROMDEVICE);
1788
                cs4231_chip->input_dma_handle = 0;
1789
                cs4231_chip->input_dma_size = 0;
1790
        }
1791
 
1792
        if (cs4231_chip->input_next_dma_handle) {
1793
                pci_unmap_single((struct pci_dev *)drv->dev,
1794
                                 cs4231_chip->input_next_dma_handle,
1795
                                 cs4231_chip->input_next_dma_size,
1796
                                 PCI_DMA_FROMDEVICE);
1797
                cs4231_chip->input_next_dma_handle = 0;
1798
                cs4231_chip->input_next_dma_size = 0;
1799
        }
1800
 
1801
        dcsr = readl(cs4231_chip->eb2c + EBDMA_CSR);
1802
        if (dcsr & EBUS_DCSR_EN_DMA)
1803
                writel(dcsr & ~EBUS_DCSR_EN_DMA, cs4231_chip->eb2c + EBDMA_CSR);
1804
 
1805
        cs4231_disable_rec(drv);
1806
}
1807
#endif
1808
 
1809
static int cs4231_set_output_pause(struct sparcaudio_driver *drv, int value)
1810
{
1811
        struct cs4231_chip *cs4231_chip = (struct cs4231_chip *) drv->private;
1812
 
1813
        cs4231_chip->perchip_info.play.pause = value;
1814
 
1815
        if (!value)
1816
                sparcaudio_output_done(drv, 0);
1817
 
1818
        return value;
1819
}
1820
 
1821
static int cs4231_set_output_error(struct sparcaudio_driver *drv, int value)
1822
{
1823
        struct cs4231_chip *cs4231_chip = (struct cs4231_chip *) drv->private;
1824
        int i;
1825
 
1826
        i = cs4231_chip->perchip_info.play.error;
1827
        cs4231_chip->perchip_info.play.error = value;
1828
 
1829
        return i;
1830
}
1831
 
1832
static int cs4231_set_input_error(struct sparcaudio_driver *drv, int value)
1833
{
1834
        struct cs4231_chip *cs4231_chip = (struct cs4231_chip *) drv->private;
1835
        int i;
1836
 
1837
        i = cs4231_chip->perchip_info.record.error;
1838
        cs4231_chip->perchip_info.record.error = value;
1839
 
1840
        return i;
1841
}
1842
 
1843
static int cs4231_set_output_samples(struct sparcaudio_driver *drv, int value)
1844
{
1845
        struct cs4231_chip *cs4231_chip = (struct cs4231_chip *)drv->private;
1846
        int i;
1847
 
1848
        i = cs4231_chip->perchip_info.play.samples;
1849
        cs4231_chip->perchip_info.play.samples = value;
1850
 
1851
        return i;
1852
}
1853
 
1854
static int cs4231_set_input_samples(struct sparcaudio_driver *drv, int value)
1855
{
1856
        struct cs4231_chip *cs4231_chip = (struct cs4231_chip *) drv->private;
1857
        int i;
1858
 
1859
        i = cs4231_chip->perchip_info.record.samples;
1860
        cs4231_chip->perchip_info.record.samples = value;
1861
 
1862
        return i;
1863
}
1864
 
1865
static int cs4231_set_input_pause(struct sparcaudio_driver *drv, int value)
1866
{
1867
        struct cs4231_chip *cs4231_chip = (struct cs4231_chip *) drv->private;
1868
 
1869
        cs4231_chip->perchip_info.record.pause = value;
1870
 
1871
        if (value)
1872
                cs4231_stop_input(drv);
1873
 
1874
        return value;
1875
}
1876
 
1877
static void cs4231_audio_getdev(struct sparcaudio_driver *drv,
1878
                                 audio_device_t * audinfo)
1879
{
1880
        struct cs4231_chip *cs4231_chip = (struct cs4231_chip *) drv->private;
1881
 
1882
        strncpy(audinfo->name, "SUNW,CS4231", sizeof(audinfo->name) - 1);
1883
        /* versions */
1884
        /* a: SPARCstation 4/5          b: Ultra 1/2 (electron)       */
1885
        /* c: Ultra 1/2 PCI? (positron) d: ppc                        */
1886
        /* e: x86                       f: Ultra Enterprise? (tazmo)  */
1887
        /* g: Ultra 30? (quark)         h: Ultra 5/10? (darwin)       */
1888
        /* apparently Ultra 1, Ultra 2 don't have internal CD input */
1889
        if (cs4231_chip->status & CS_STATUS_IS_ULTRA)
1890
                strncpy(audinfo->version, "b", sizeof(audinfo->version) - 1);
1891
        else
1892
                strncpy(audinfo->version, "a", sizeof(audinfo->version) - 1);
1893
        strncpy(audinfo->config, "onboard1", sizeof(audinfo->config) - 1);
1894
}
1895
 
1896
 
1897
static int cs4231_audio_getdev_sunos(struct sparcaudio_driver *drv)
1898
{
1899
        return AUDIO_DEV_CS4231;
1900
}
1901
 
1902
static void cs4231_loopback(struct sparcaudio_driver *drv, unsigned int value)
1903
{
1904
        struct cs4231_chip *cs4231_chip = (struct cs4231_chip *) drv->private;
1905
 
1906
        WRITE_IAR(0x0d);
1907
        WRITE_IDR(value ? LOOPB_ON : 0);
1908
}
1909
 
1910
static int cs4231_ioctl(struct inode * inode, struct file * file,
1911
                        unsigned int cmd, unsigned long arg,
1912
                        struct sparcaudio_driver *drv)
1913
{
1914
        struct cs4231_chip *cs4231_chip = (struct cs4231_chip *) drv->private;
1915
        int retval = 0;
1916
 
1917
        switch (cmd) {
1918
        case AUDIO_DIAG_LOOPBACK:
1919
                cs4231_chip->status |= CS_STATUS_INIT_ON_CLOSE;
1920
                cs4231_loopback(drv, (unsigned int)arg);
1921
                break;
1922
        default:
1923
                retval = -EINVAL;
1924
        };
1925
 
1926
        return retval;
1927
}
1928
 
1929
#ifdef EB4231_SUPPORT
1930
/* ebus audio capture interrupt handler. */
1931
void eb4231_cinterrupt(int irq, void *dev_id, struct pt_regs *regs)
1932
{
1933
        struct sparcaudio_driver *drv = (struct sparcaudio_driver *) dev_id;
1934
        struct cs4231_chip *cs4231_chip = (struct cs4231_chip *) drv->private;
1935
        u32 dummy;
1936
 
1937
        /* Clear the interrupt. */
1938
        dummy = readl(cs4231_chip->eb2c + EBDMA_CSR);
1939
        writel(dummy, cs4231_chip->eb2c + EBDMA_CSR);
1940
 
1941
        if ((dummy & EBUS_DCSR_TC) != 0
1942
            /*&& (dummy & EBUS_DCSR_A_LOADED) != 0*/) {
1943
                cs4231_chip->perchip_info.record.samples +=
1944
                    cs4231_length_to_samplecount(&(cs4231_chip->perchip_info.record),
1945
                                                 cs4231_chip->reclen);
1946
                eb4231_recintr(drv);
1947
        }
1948
 
1949
        if ((dummy & EBUS_DCSR_A_LOADED) == 0) {
1950
                cs4231_chip->perchip_info.record.active = 0;
1951
                eb4231_recintr(drv);
1952
                eb4231_getsamplecount(drv, cs4231_chip->reclen, 1);
1953
        }
1954
}
1955
 
1956
/* ebus audio play interrupt handler. */
1957
void eb4231_pinterrupt(int irq, void *dev_id, struct pt_regs *regs)
1958
{
1959
        struct sparcaudio_driver *drv = (struct sparcaudio_driver *) dev_id;
1960
        struct cs4231_chip *cs4231_chip = (struct cs4231_chip *) drv->private;
1961
        u32 dummy;
1962
 
1963
        /* Clear the interrupt.  Bleh, when not using the next-address
1964
         * feature, TC can only be cleared by a reset.
1965
         */
1966
        dummy = readl(cs4231_chip->eb2p + EBDMA_CSR);
1967
        writel(dummy, cs4231_chip->eb2p + EBDMA_CSR);
1968
 
1969
        /* If we get a terminal count and address loaded condition,
1970
         * this means the DNAR was copied into DACR.
1971
         */
1972
        if((dummy & EBUS_DCSR_TC) != 0
1973
           /*&& (dummy & EBUS_DCSR_A_LOADED) != 0*/) {
1974
                cs4231_chip->perchip_info.play.samples +=
1975
                        cs4231_length_to_samplecount(&(cs4231_chip->perchip_info.play),
1976
                                                     cs4231_chip->playlen);
1977
                eb4231_playintr(drv);
1978
        }
1979
 
1980
        if((dummy & EBUS_DCSR_A_LOADED) == 0) {
1981
                cs4231_chip->perchip_info.play.active = 0;
1982
                eb4231_playintr(drv);
1983
                eb4231_getsamplecount(drv, cs4231_chip->playlen, 0);
1984
        }
1985
}
1986
#endif
1987
 
1988
/* Audio interrupt handler. */
1989
void cs4231_interrupt(int irq, void *dev_id, struct pt_regs *regs)
1990
{
1991
        struct sparcaudio_driver *drv = (struct sparcaudio_driver *) dev_id;
1992
        struct cs4231_chip *cs4231_chip = (struct cs4231_chip *) drv->private;
1993
        __u32 dummy;
1994
 
1995
        dprintk(("in cs4231_interrupt\n"));
1996
 
1997
        /* Clear the interrupt. */
1998
        dummy = sbus_readl(cs4231_chip->regs + APCCSR);
1999
        sbus_writel(dummy, cs4231_chip->regs + APCCSR);
2000
 
2001
        /* now go through and figure out what gets to claim the interrupt
2002
         * if anything since we may be doing shared interrupts
2003
         */
2004
        if (dummy & APC_PLAY_INT) {
2005
                if (dummy & APC_XINT_PNVA) {
2006
                        cs4231_chip->perchip_info.play.samples +=
2007
                         cs4231_length_to_samplecount(&(cs4231_chip->perchip_info.play),
2008
                                                      cs4231_chip->playlen);
2009
                        if (!(dummy & APC_XINT_EMPT))
2010
                                cs4231_playintr(drv, 1);
2011
                }
2012
                /* Any other conditions we need worry about? */
2013
        }
2014
 
2015
        if (dummy & APC_CAPT_INT) {
2016
                if (dummy & APC_XINT_CNVA) {
2017
                  cs4231_chip->perchip_info.record.samples +=
2018
                    cs4231_length_to_samplecount(&(cs4231_chip->perchip_info.record),
2019
                                                 cs4231_chip->reclen);
2020
                  cs4231_recintr(drv);
2021
                }
2022
                /* Any other conditions we need worry about? */
2023
        }
2024
 
2025
 
2026
        if (dummy & APC_XINT_CEMP) {
2027
                if (cs4231_chip->perchip_info.record.active == 0) {
2028
                        /* Fix me */
2029
                        cs4231_chip->perchip_info.record.active = 0;
2030
                        cs4231_chip->perchip_info.record.error = 1;
2031
                        cs4231_recintr(drv);
2032
                }
2033
        }
2034
 
2035
        if (dummy & APC_XINT_EMPT) {
2036
                if (!cs4231_chip->output_next_dma_handle) {
2037
                        u32 csr = sbus_readl(cs4231_chip->regs + APCCSR);
2038
 
2039
                        csr |= APC_PPAUSE;
2040
                        sbus_writel(csr, cs4231_chip->regs + APCCSR);
2041
                        cs4231_disable_play(drv);
2042
                        cs4231_chip->perchip_info.play.error = 1;
2043
                }
2044
                cs4231_chip->perchip_info.play.active = 0;
2045
                cs4231_playintr(drv, 0);
2046
 
2047
                cs4231_getsamplecount(drv, cs4231_chip->playlen, 0);
2048
        }
2049
 
2050
        if (dummy & APC_GENL_INT) {
2051
                /* If we get here we must be sharing an interrupt, but I haven't code
2052
                 * to handle this right now.
2053
                 */
2054
        }
2055
}
2056
 
2057
static struct sparcaudio_operations cs4231_ops = {
2058
        cs4231_open,
2059
        cs4231_release,
2060
        cs4231_ioctl,
2061
        cs4231_start_output,
2062
        cs4231_stop_output,
2063
        cs4231_start_input,
2064
        cs4231_stop_input,
2065
        cs4231_audio_getdev,
2066
        cs4231_set_output_volume,
2067
        cs4231_get_output_volume,
2068
        cs4231_set_input_volume,
2069
        cs4231_get_input_volume,
2070
        cs4231_set_monitor_volume,
2071
        cs4231_get_monitor_volume,
2072
        cs4231_set_output_balance,
2073
        cs4231_get_output_balance,
2074
        cs4231_set_input_balance,
2075
        cs4231_get_input_balance,
2076
        cs4231_set_output_channels,
2077
        cs4231_get_output_channels,
2078
        cs4231_set_input_channels,
2079
        cs4231_get_input_channels,
2080
        cs4231_set_output_precision,
2081
        cs4231_get_output_precision,
2082
        cs4231_set_input_precision,
2083
        cs4231_get_input_precision,
2084
        cs4231_set_output_port,
2085
        cs4231_get_output_port,
2086
        cs4231_set_input_port,
2087
        cs4231_get_input_port,
2088
        cs4231_set_output_encoding,
2089
        cs4231_get_output_encoding,
2090
        cs4231_set_input_encoding,
2091
        cs4231_get_input_encoding,
2092
        cs4231_set_output_rate,
2093
        cs4231_get_output_rate,
2094
        cs4231_set_input_rate,
2095
        cs4231_get_input_rate,
2096
        cs4231_audio_getdev_sunos,
2097
        cs4231_get_output_ports,
2098
        cs4231_get_input_ports,
2099
        cs4231_output_muted,
2100
        cs4231_get_output_muted,
2101
        cs4231_set_output_pause,
2102
        cs4231_get_output_pause,
2103
        cs4231_set_input_pause,
2104
        cs4231_get_input_pause,
2105
        cs4231_set_output_samples,
2106
        cs4231_get_output_samples,
2107
        cs4231_set_input_samples,
2108
        cs4231_get_input_samples,
2109
        cs4231_set_output_error,
2110
        cs4231_get_output_error,
2111
        cs4231_set_input_error,
2112
        cs4231_get_input_error,
2113
        cs4231_get_formats,
2114
};
2115
 
2116
#ifdef EB4231_SUPPORT
2117
static struct sparcaudio_operations eb4231_ops = {
2118
        cs4231_open,
2119
        cs4231_release,
2120
        cs4231_ioctl,
2121
        eb4231_start_output,
2122
        eb4231_stop_output,
2123
        eb4231_start_input,
2124
        eb4231_stop_input,
2125
        cs4231_audio_getdev,
2126
        cs4231_set_output_volume,
2127
        cs4231_get_output_volume,
2128
        cs4231_set_input_volume,
2129
        cs4231_get_input_volume,
2130
        cs4231_set_monitor_volume,
2131
        cs4231_get_monitor_volume,
2132
        cs4231_set_output_balance,
2133
        cs4231_get_output_balance,
2134
        cs4231_set_input_balance,
2135
        cs4231_get_input_balance,
2136
        cs4231_set_output_channels,
2137
        cs4231_get_output_channels,
2138
        cs4231_set_input_channels,
2139
        cs4231_get_input_channels,
2140
        cs4231_set_output_precision,
2141
        cs4231_get_output_precision,
2142
        cs4231_set_input_precision,
2143
        cs4231_get_input_precision,
2144
        cs4231_set_output_port,
2145
        cs4231_get_output_port,
2146
        cs4231_set_input_port,
2147
        cs4231_get_input_port,
2148
        cs4231_set_output_encoding,
2149
        cs4231_get_output_encoding,
2150
        cs4231_set_input_encoding,
2151
        cs4231_get_input_encoding,
2152
        cs4231_set_output_rate,
2153
        cs4231_get_output_rate,
2154
        cs4231_set_input_rate,
2155
        cs4231_get_input_rate,
2156
        cs4231_audio_getdev_sunos,
2157
        cs4231_get_output_ports,
2158
        cs4231_get_input_ports,
2159
        cs4231_output_muted,
2160
        cs4231_get_output_muted,
2161
        cs4231_set_output_pause,
2162
        cs4231_get_output_pause,
2163
        cs4231_set_input_pause,
2164
        cs4231_get_input_pause,
2165
        cs4231_set_output_samples,
2166
        eb4231_get_output_samples,
2167
        cs4231_set_input_samples,
2168
        eb4231_get_input_samples,
2169
        cs4231_set_output_error,
2170
        cs4231_get_output_error,
2171
        cs4231_set_input_error,
2172
        cs4231_get_input_error,
2173
        cs4231_get_formats,
2174
};
2175
#endif
2176
 
2177
/* Attach to an cs4231 chip given its PROM node. */
2178
static int cs4231_attach(struct sparcaudio_driver *drv,
2179
                         struct sbus_dev *sdev)
2180
{
2181
        struct cs4231_chip *cs4231_chip;
2182
        int err;
2183
 
2184
        /* Allocate our private information structure. */
2185
        drv->private = kmalloc(sizeof(struct cs4231_chip), GFP_KERNEL);
2186
        if (drv->private == NULL)
2187
                return -ENOMEM;
2188
 
2189
        /* Point at the information structure and initialize it. */
2190
        drv->ops = &cs4231_ops;
2191
        cs4231_chip = (struct cs4231_chip *) drv->private;
2192
        cs4231_chip->input_ptr = cs4231_chip->output_ptr = NULL;
2193
        cs4231_chip->input_size = cs4231_chip->output_size = 0;
2194
        cs4231_chip->status = 0;
2195
 
2196
        drv->dev = sdev;
2197
 
2198
        /* Map the registers into memory. */
2199
        cs4231_chip->regs_size = sdev->reg_addrs[0].reg_size;
2200
        cs4231_chip->regs = sbus_ioremap(&sdev->resource[0], 0,
2201
                                         sdev->reg_addrs[0].reg_size,
2202
                                         "cs4231");
2203
 
2204
        if (!cs4231_chip->regs) {
2205
                printk(KERN_ERR "cs4231: could not remap registers\n");
2206
                kfree(drv->private);
2207
                return -EIO;
2208
        }
2209
 
2210
        /* Attach the interrupt handler to the audio interrupt. */
2211
        cs4231_chip->irq = sdev->irqs[0];
2212
        request_irq(cs4231_chip->irq, cs4231_interrupt, SA_SHIRQ, "cs4231", drv);
2213
 
2214
        cs4231_chip->nirqs = 1;
2215
        cs4231_enable_interrupts(drv);
2216
 
2217
        /* Reset the audio chip. */
2218
        cs4231_chip_reset(drv);
2219
 
2220
        /* Register ourselves with the midlevel audio driver. */
2221
        err = register_sparcaudio_driver(drv, 1);
2222
 
2223
        if (err < 0) {
2224
                printk(KERN_ERR "cs4231: unable to register\n");
2225
                cs4231_disable_interrupts(drv);
2226
                free_irq(cs4231_chip->irq, drv);
2227
                sbus_iounmap(cs4231_chip->regs, cs4231_chip->regs_size);
2228
                kfree(drv->private);
2229
                return -EIO;
2230
        }
2231
 
2232
        cs4231_chip->perchip_info.play.active =
2233
                cs4231_chip->perchip_info.play.pause = 0;
2234
 
2235
        cs4231_chip->perchip_info.record.active =
2236
                cs4231_chip->perchip_info.record.pause = 0;
2237
 
2238
        cs4231_chip->perchip_info.play.avail_ports = (AUDIO_HEADPHONE |
2239
                                                      AUDIO_SPEAKER |
2240
                                                      AUDIO_LINE_OUT);
2241
 
2242
        cs4231_chip->perchip_info.record.avail_ports = (AUDIO_INTERNAL_CD_IN |
2243
                                                        AUDIO_LINE_IN |
2244
                                                        AUDIO_MICROPHONE |
2245
                                                        AUDIO_ANALOG_LOOPBACK);
2246
 
2247
        /* Announce the hardware to the user. */
2248
        printk(KERN_INFO "audio%d: cs4231%c at %lx irq %s\n",
2249
               drv->index, (cs4231_chip->status & CS_STATUS_REV_A) ? 'a' : ' ',
2250
               cs4231_chip->regs, __irq_itoa(cs4231_chip->irq));
2251
 
2252
        /* Success! */
2253
        return 0;
2254
}
2255
 
2256
#ifdef EB4231_SUPPORT
2257
/* Attach to an cs4231 chip given its PROM node. */
2258
static int eb4231_attach(struct sparcaudio_driver *drv,
2259
                         struct linux_ebus_device *edev)
2260
{
2261
        struct cs4231_chip *cs4231_chip;
2262
        int len, err, nregs;
2263
        struct linux_prom_registers regs[4];
2264
 
2265
        /* Allocate our private information structure. */
2266
        drv->private = kmalloc(sizeof(struct cs4231_chip), GFP_KERNEL);
2267
        if (drv->private == NULL)
2268
                return -ENOMEM;
2269
 
2270
        /* Point at the information structure and initialize it. */
2271
        drv->ops = &eb4231_ops;
2272
        cs4231_chip = (struct cs4231_chip *) drv->private;
2273
        cs4231_chip->input_ptr = cs4231_chip->output_ptr = NULL;
2274
        cs4231_chip->input_size = cs4231_chip->output_size = 0;
2275
        cs4231_chip->status = 0;
2276
 
2277
        drv->dev = (struct sbus_dev *)edev->bus->self;
2278
 
2279
        len = prom_getproperty(edev->prom_node, "reg", (void *)regs, sizeof(regs));
2280
        if ((len % sizeof(regs[0])) != 0) {
2281
                printk("eb4231: Strange reg property size %d\n", len);
2282
                return -ENODEV;
2283
        }
2284
 
2285
        nregs = len / sizeof(regs[0]);
2286
        cs4231_chip->regs = (unsigned long)ioremap(edev->resource[0].start, 0x10);
2287
        cs4231_chip->eb2p = (unsigned long)ioremap(edev->resource[1].start, 0x10);
2288
        cs4231_chip->eb2c = (unsigned long)ioremap(edev->resource[2].start, 0x10);
2289
 
2290
        cs4231_chip->status |= CS_STATUS_IS_EBUS;
2291
 
2292
        /* Attach the interrupt handler to the audio interrupt. */
2293
        cs4231_chip->irq = edev->irqs[0];
2294
        cs4231_chip->irq2 = edev->irqs[1];
2295
 
2296
        if(request_irq(cs4231_chip->irq, eb4231_cinterrupt, SA_SHIRQ, "cs4231", drv) ||
2297
           request_irq(cs4231_chip->irq2, eb4231_pinterrupt, SA_SHIRQ, "cs4231", drv))
2298
                goto bail;
2299
 
2300
        cs4231_chip->nirqs = 2;
2301
        cs4231_enable_interrupts(drv);
2302
 
2303
        /* Reset the audio chip. */
2304
        cs4231_chip_reset(drv);
2305
 
2306
        /* Register ourselves with the midlevel audio driver. */
2307
        err = register_sparcaudio_driver(drv, 1);
2308
 
2309
        if (err < 0) {
2310
        bail:
2311
                printk(KERN_ERR "cs4231: unable to register\n");
2312
                cs4231_disable_interrupts(drv);
2313
                free_irq(cs4231_chip->irq, drv);
2314
                free_irq(cs4231_chip->irq2, drv);
2315
                kfree(drv->private);
2316
                return -EIO;
2317
        }
2318
 
2319
        cs4231_chip->perchip_info.play.active =
2320
                cs4231_chip->perchip_info.play.pause = 0;
2321
 
2322
        cs4231_chip->perchip_info.record.active =
2323
                cs4231_chip->perchip_info.record.pause = 0;
2324
 
2325
        cs4231_chip->perchip_info.play.avail_ports = (AUDIO_HEADPHONE |
2326
                                                      AUDIO_SPEAKER |
2327
                                                      AUDIO_LINE_OUT);
2328
 
2329
        cs4231_chip->perchip_info.record.avail_ports = (AUDIO_INTERNAL_CD_IN |
2330
                                                        AUDIO_LINE_IN |
2331
                                                        AUDIO_MICROPHONE |
2332
                                                        AUDIO_ANALOG_LOOPBACK);
2333
 
2334
        /* Announce the hardware to the user. */
2335
        printk(KERN_INFO "audio%d: cs4231%c(eb2) at %lx irq %s\n",
2336
               drv->index, (cs4231_chip->status & CS_STATUS_REV_A) ? 'a' : ' ',
2337
               cs4231_chip->regs, __irq_itoa(cs4231_chip->irq));
2338
 
2339
        /* Success! */
2340
        return 0;
2341
}
2342
#endif
2343
 
2344
#ifdef EB4231_SUPPORT
2345
static int __init ebus_cs4231_p(struct linux_ebus_device *edev)
2346
{
2347
        if (!strcmp(edev->prom_name, "SUNW,CS4231"))
2348
                return 1;
2349
        if (!strcmp(edev->prom_name, "audio")) {
2350
                char compat[16];
2351
 
2352
                prom_getstring(edev->prom_node, "compatible",
2353
                               compat, sizeof(compat));
2354
                compat[15] = '\0';
2355
                if (!strcmp(compat, "SUNW,CS4231"))
2356
                        return 1;
2357
        }
2358
 
2359
        return 0;
2360
}
2361
#endif
2362
 
2363
/* Detach from an cs4231 chip given the device structure. */
2364
static void __exit cs4231_detach(struct sparcaudio_driver *drv)
2365
{
2366
        struct cs4231_chip *cs4231_chip = (struct cs4231_chip *) drv->private;
2367
 
2368
        cs4231_disable_interrupts(drv);
2369
        unregister_sparcaudio_driver(drv, 1);
2370
        free_irq(cs4231_chip->irq, drv);
2371
        if (!(cs4231_chip->status & CS_STATUS_IS_EBUS)) {
2372
                sbus_iounmap(cs4231_chip->regs, cs4231_chip->regs_size);
2373
        } else {
2374
#ifdef EB4231_SUPPORT
2375
                iounmap(cs4231_chip->regs);
2376
                iounmap(cs4231_chip->eb2p);
2377
                iounmap(cs4231_chip->eb2c);
2378
                free_irq(cs4231_chip->irq2, drv);
2379
#endif
2380
        }
2381
        kfree(drv->private);
2382
}
2383
 
2384
 
2385
/* Probe for the cs4231 chip and then attach the driver. */
2386
static int __init cs4231_init(void)
2387
{
2388
        struct sbus_bus *sbus;
2389
        struct sbus_dev *sdev;
2390
#ifdef EB4231_SUPPORT
2391
        struct linux_ebus *ebus;
2392
        struct linux_ebus_device *edev;
2393
#endif
2394
 
2395
        num_drivers = 0;
2396
 
2397
        /* Probe each SBUS for cs4231 chips. */
2398
        for_all_sbusdev(sdev, sbus) {
2399
                if (!strcmp(sdev->prom_name, "SUNW,CS4231")) {
2400
                        /* Don't go over the max number of drivers. */
2401
                        if (num_drivers >= MAX_DRIVERS)
2402
                                continue;
2403
 
2404
                        if (cs4231_attach(&drivers[num_drivers], sdev) == 0)
2405
                                num_drivers++;
2406
                }
2407
        }
2408
 
2409
#ifdef EB4231_SUPPORT
2410
        for_each_ebus(ebus) {
2411
                for_each_ebusdev(edev, ebus) {
2412
                        if (ebus_cs4231_p(edev)) {
2413
                                /* Don't go over the max number of drivers. */
2414
                                if (num_drivers >= MAX_DRIVERS)
2415
                                        continue;
2416
 
2417
                                if (eb4231_attach(&drivers[num_drivers], edev) == 0)
2418
                                        num_drivers++;
2419
                        }
2420
                }
2421
        }
2422
#endif
2423
 
2424
        /* Only return success if we found some cs4231 chips. */
2425
        return (num_drivers > 0) ? 0 : -EIO;
2426
}
2427
 
2428
static void __exit cs4231_exit(void)
2429
{
2430
        register int i;
2431
 
2432
        for (i = 0; i < num_drivers; i++) {
2433
                cs4231_detach(&drivers[i]);
2434
                num_drivers--;
2435
        }
2436
}
2437
 
2438
module_init(cs4231_init);
2439
module_exit(cs4231_exit);
2440
MODULE_LICENSE("GPL");
2441
/*
2442
 * Overrides for Emacs so that we follow Linus's tabbing style.
2443
 * Emacs will notice this stuff at the end of the file and automatically
2444
 * adjust the settings for this buffer only.  This must remain at the end
2445
 * of the file.
2446
 * ---------------------------------------------------------------------------
2447
 * Local variables:
2448
 * c-indent-level: 4
2449
 * c-brace-imaginary-offset: 0
2450
 * c-brace-offset: -4
2451
 * c-argdecl-indent: 4
2452
 * c-label-offset: -4
2453
 * c-continued-statement-offset: 4
2454
 * c-continued-brace-offset: 0
2455
 * indent-tabs-mode: nil
2456
 * tab-width: 8
2457
 * End:
2458
 */

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.