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

Subversion Repositories or1k

[/] [or1k/] [trunk/] [linux/] [linux-2.4/] [drivers/] [sound/] [ad1889.c] - Blame information for rev 1765

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1275 phoenix
/*
2
 *  Copyright 2001 Randolph Chung <tausq@debian.org>
3
 *
4
 *  Analog Devices 1889 PCI audio driver (AD1819 AC97-compatible codec)
5
 *
6
 *   This program is free software; you can redistribute it and/or modify
7
 *   it under the terms of the GNU General Public License as published by
8
 *   the Free Software Foundation; either version 2 of the License, or
9
 *   (at your option) any later version.
10
 *
11
 *   This program is distributed in the hope that it will be useful,
12
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 *   GNU General Public License for more details.
15
 *
16
 *   You should have received a copy of the GNU General Public License
17
 *   along with this program; if not, write to the Free Software
18
 *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19
 *
20
 *   Notes:
21
 *   1. Only flat DMA is supported; s-g is not supported right now
22
 *
23
 *
24
<jsm> tausq: Anyway, to set up sample rates for D to A, you just use the sample rate on the codec. For A to D, you need to set the codec always to 48K (using the split sample rate feature on the codec) and then set the resampler on the AD1889 to the sample rate you want.
25
<jsm> Also, when changing the sample rate on the codec you need to power it down and re power it up for the change to take effect!
26
 *
27
 * $Id: ad1889.c,v 1.1.1.1 2004-04-15 02:22:12 phoenix Exp $
28
 */
29
#include <linux/config.h>
30
#include <linux/module.h>
31
#include <linux/init.h>
32
#include <linux/ioport.h>
33
#include <linux/pci.h>
34
#include <linux/poll.h>
35
#include <linux/proc_fs.h>
36
#include <linux/slab.h>
37
#include <linux/soundcard.h>
38
#include <linux/ac97_codec.h>
39
#include <linux/sound.h>
40
#include <linux/wrapper.h>
41
 
42
#include <asm/delay.h>
43
#include <asm/io.h>
44
#include <asm/dma.h>
45
#include <asm/uaccess.h>
46
 
47
#include "ad1889.h"
48
 
49
#define DBG(fmt, arg...) printk(fmt, ##arg)
50
#define DEVNAME "ad1889"
51
 
52
#define NR_HW_CH        4
53
#define DAC_RUNNING     1
54
#define ADC_RUNNING     2
55
 
56
#define UNDERRUN(dev)   (0)
57
 
58
#define AD1889_READW(dev,reg) readw(dev->regbase + reg)
59
#define AD1889_WRITEW(dev,reg,val) writew((val), dev->regbase + reg)
60
#define AD1889_READL(dev,reg) readl(dev->regbase + reg)
61
#define AD1889_WRITEL(dev,reg,val) writel((val), dev->regbase + reg)
62
 
63
//now 100ms
64
#define WAIT_10MS()     do { int __i; for (__i = 0; __i < 100; __i++) udelay(1000); } while(0)
65
 
66
/* currently only support a single device */
67
static ad1889_dev_t *ad1889_dev = NULL;
68
 
69
/************************* helper routines ***************************** */
70
static inline void ad1889_set_wav_rate(ad1889_dev_t *dev, int rate)
71
{
72
        dev->state[AD_WAV_STATE].dmabuf.rate = rate;
73
        AD1889_WRITEW(dev, AD_DSWAS, rate);
74
}
75
 
76
static inline void ad1889_set_adc_rate(ad1889_dev_t *dev, int rate)
77
{
78
        dev->state[AD_ADC_STATE].dmabuf.rate = rate;
79
        AD1889_WRITEW(dev, AD_DSRES, rate);
80
}
81
 
82
static inline void ad1889_set_wav_fmt(ad1889_dev_t *dev, int fmt)
83
{
84
        u16 tmp;
85
 
86
        tmp = AD1889_READW(ad1889_dev, AD_DSWSMC);
87
        if (fmt == AFMT_S16_LE) {
88
                //tmp |= 0x0100; /* set WA16 */
89
                tmp |= 0x0300; /* set WA16 stereo */
90
        } else if (fmt == AFMT_U8) {
91
                tmp &= ~0x0100; /* clear WA16 */
92
        }
93
        AD1889_WRITEW(ad1889_dev, AD_DSWSMC, tmp);
94
}
95
 
96
static inline void ad1889_set_adc_fmt(ad1889_dev_t *dev, int fmt)
97
{
98
        u16 tmp;
99
 
100
        tmp = AD1889_READW(ad1889_dev, AD_DSRAMC);
101
        if (fmt == AFMT_S16_LE) {
102
                tmp |= 0x0100; /* set WA16 */
103
        } else if (fmt == AFMT_U8) {
104
                tmp &= ~0x0100; /* clear WA16 */
105
        }
106
        AD1889_WRITEW(ad1889_dev, AD_DSRAMC, tmp);
107
}
108
 
109
static void ad1889_start_wav(ad1889_state_t *state)
110
{
111
        unsigned long flags;
112
        struct dmabuf *dmabuf = &state->dmabuf;
113
        int cnt;
114
        u16 tmp;
115
 
116
        spin_lock_irqsave(&state->card->lock, flags);
117
 
118
        if (dmabuf->dma_len)    /* DMA already in flight */
119
                goto skip_dma;
120
 
121
        /* setup dma */
122
        cnt = dmabuf->wr_ptr - dmabuf->rd_ptr;
123
        if (cnt == 0)            /* done - don't need to do anything */
124
                goto skip_dma;
125
 
126
        /* If the wr_ptr has wrapped, only map to the end */
127
        if (cnt < 0)
128
                cnt = DMA_SIZE - dmabuf->rd_ptr;
129
 
130
        dmabuf->dma_handle = pci_map_single(ad1889_dev->pci,
131
                                        dmabuf->rawbuf + dmabuf->rd_ptr,
132
                                        cnt, PCI_DMA_TODEVICE);
133
        dmabuf->dma_len = cnt;
134
        dmabuf->ready = 1;
135
 
136
        /* load up the current register set */
137
        AD1889_WRITEL(ad1889_dev, AD_DMAWAVCC, cnt);
138
        AD1889_WRITEL(ad1889_dev, AD_DMAWAVICC, cnt);
139
        AD1889_WRITEL(ad1889_dev, AD_DMAWAVCA, dmabuf->dma_handle);
140
 
141
        /* TODO: for now we load the base registers with the same thing */
142
        AD1889_WRITEL(ad1889_dev, AD_DMAWAVBC, cnt);
143
        AD1889_WRITEL(ad1889_dev, AD_DMAWAVIBC, cnt);
144
        AD1889_WRITEL(ad1889_dev, AD_DMAWAVBA, dmabuf->dma_handle);
145
 
146
        /* and we're off to the races... */
147
        AD1889_WRITEL(ad1889_dev, AD_DMACHSS, 0x8);
148
        tmp = AD1889_READW(ad1889_dev, AD_DSWSMC);
149
        tmp |= 0x0400; /* set WAEN */
150
        AD1889_WRITEW(ad1889_dev, AD_DSWSMC, tmp);
151
        (void) AD1889_READW(ad1889_dev, AD_DSWSMC); /* flush posted PCI write */
152
 
153
        dmabuf->enable |= DAC_RUNNING;
154
 
155
skip_dma:
156
        spin_unlock_irqrestore(&state->card->lock, flags);
157
}
158
 
159
 
160
static void ad1889_stop_wav(ad1889_state_t *state)
161
{
162
        unsigned long flags;
163
        struct dmabuf *dmabuf = &state->dmabuf;
164
 
165
        spin_lock_irqsave(&state->card->lock, flags);
166
 
167
        if (dmabuf->enable & DAC_RUNNING) {
168
                u16 tmp;
169
                unsigned long cnt = dmabuf->dma_len;
170
 
171
                tmp = AD1889_READW(ad1889_dev, AD_DSWSMC);
172
                tmp &= ~0x0400; /* clear WAEN */
173
                AD1889_WRITEW(ad1889_dev, AD_DSWSMC, tmp);
174
                (void) AD1889_READW(ad1889_dev, AD_DSWSMC); /* flush posted PCI write */
175
                pci_unmap_single(ad1889_dev->pci, dmabuf->dma_handle,
176
                                cnt, PCI_DMA_TODEVICE);
177
 
178
                dmabuf->enable &= ~DAC_RUNNING;
179
 
180
                /* update dma pointers */
181
                dmabuf->rd_ptr += cnt;
182
                dmabuf->rd_ptr &= (DMA_SIZE - 1);
183
 
184
                dmabuf->dma_handle = 0;
185
                dmabuf->dma_len = 0;
186
                dmabuf->ready = 0;
187
 
188
                wake_up(&dmabuf->wait);
189
        }
190
 
191
        spin_unlock_irqrestore(&state->card->lock, flags);
192
}
193
 
194
 
195
#if 0
196
static void ad1889_startstop_adc(ad1889_state_t *state, int start)
197
{
198
        u16 tmp;
199
        unsigned long flags;
200
 
201
        spin_lock_irqsave(&state->card->lock, flags);
202
 
203
        tmp = AD1889_READW(ad1889_dev, AD_DSRAMC);
204
        if (start) {
205
                state->dmabuf.enable |= ADC_RUNNING;
206
                tmp |= 0x0004; /* set ADEN */
207
        } else {
208
                state->dmabuf.enable &= ~ADC_RUNNING;
209
                tmp &= ~0x0004; /* clear ADEN */
210
        }
211
        AD1889_WRITEW(ad1889_dev, AD_DSRAMC, tmp);
212
 
213
        spin_unlock_irqrestore(&state->card->lock, flags);
214
}
215
#endif
216
 
217
static ad1889_dev_t *ad1889_alloc_dev(struct pci_dev *pci)
218
{
219
        ad1889_dev_t *dev;
220
        struct dmabuf *dmabuf;
221
        int i;
222
 
223
        if ((dev = kmalloc(sizeof(ad1889_dev_t), GFP_KERNEL)) == NULL)
224
                return NULL;
225
        memset(dev, 0, sizeof(ad1889_dev_t));
226
        spin_lock_init(&dev->lock);
227
        dev->pci = pci;
228
 
229
        for (i = 0; i < AD_MAX_STATES; i++) {
230
                dev->state[i].card = dev;
231
                init_MUTEX(&dev->state[i].sem);
232
                init_waitqueue_head(&dev->state[i].dmabuf.wait);
233
        }
234
 
235
        /* allocate dma buffer */
236
 
237
        for (i = 0; i < AD_MAX_STATES; i++) {
238
                dmabuf = &dev->state[i].dmabuf;
239
                dmabuf->rawbuf = kmalloc(DMA_SIZE, GFP_KERNEL|GFP_DMA);
240
                if (!dmabuf->rawbuf)
241
                        goto err_free_dmabuf;
242
                dmabuf->rawbuf_size = DMA_SIZE;
243
                dmabuf->dma_handle = 0;
244
                dmabuf->rd_ptr = dmabuf->wr_ptr = dmabuf->dma_len = 0UL;
245
                dmabuf->ready = 0;
246
                dmabuf->rate = 44100;
247
        }
248
out:
249
        return dev;
250
 
251
err_free_dmabuf:
252
        while (--i >= 0)
253
                kfree(dev->state[i].dmabuf.rawbuf);
254
        kfree(dev);
255
        dev = NULL;
256
        goto out;
257
}
258
 
259
static void ad1889_free_dev(ad1889_dev_t *dev)
260
{
261
        int j;
262
        struct dmabuf *dmabuf;
263
 
264
        if (dev == NULL)
265
                return;
266
 
267
        if (dev->ac97_codec)
268
                ac97_release_codec(dev->ac97_codec);
269
 
270
        for (j = 0; j < AD_MAX_STATES; j++) {
271
                dmabuf = &dev->state[j].dmabuf;
272
                if (dmabuf->rawbuf != NULL)
273
                        kfree(dmabuf->rawbuf);
274
        }
275
 
276
        kfree(dev);
277
}
278
 
279
static inline void ad1889_trigger_playback(ad1889_dev_t *dev)
280
{
281
#if 0
282
        u32 val;
283
        struct dmabuf *dmabuf = &dev->state[AD_WAV_STATE].dmabuf;
284
#endif
285
 
286
        ad1889_start_wav(&dev->state[AD_WAV_STATE]);
287
}
288
 
289
int ad1889_read_proc (char *page, char **start, off_t off,
290
                      int count, int *eof, void *data)
291
{
292
        char *out = page;
293
        int len, i;
294
        ad1889_dev_t *dev = data;
295
        ad1889_reg_t regs[] = {
296
                { "WSMC", AD_DSWSMC, 16 },
297
                { "RAMC", AD_DSRAMC, 16 },
298
                { "WADA", AD_DSWADA, 16 },
299
                { "SYDA", AD_DSSYDA, 16 },
300
                { "WAS", AD_DSWAS, 16 },
301
                { "RES", AD_DSRES, 16 },
302
                { "CCS", AD_DSCCS, 16 },
303
                { "ADCBA", AD_DMAADCBA, 32 },
304
                { "ADCCA", AD_DMAADCCA, 32 },
305
                { "ADCBC", AD_DMAADCBC, 32 },
306
                { "ADCCC", AD_DMAADCCC, 32 },
307
                { "ADCIBC", AD_DMAADCIBC, 32 },
308
                { "ADCICC", AD_DMAADCICC, 32 },
309
                { "ADCCTRL", AD_DMAADCCTRL, 16 },
310
                { "WAVBA", AD_DMAWAVBA, 32 },
311
                { "WAVCA", AD_DMAWAVCA, 32 },
312
                { "WAVBC", AD_DMAWAVBC, 32 },
313
                { "WAVCC", AD_DMAWAVCC, 32 },
314
                { "WAVIBC", AD_DMAWAVIBC, 32 },
315
                { "WAVICC", AD_DMAWAVICC, 32 },
316
                { "WAVCTRL", AD_DMAWAVCTRL, 16 },
317
                { "DISR", AD_DMADISR, 32 },
318
                { "CHSS", AD_DMACHSS, 32 },
319
                { "IPC", AD_GPIOIPC, 16 },
320
                { "OP", AD_GPIOOP, 16 },
321
                { "IP", AD_GPIOIP, 16 },
322
                { "ACIC", AD_ACIC, 16 },
323
                { "AC97_RESET", 0x100 + AC97_RESET, 16 },
324
                { "AC97_MASTER_VOL_STEREO", 0x100 + AC97_MASTER_VOL_STEREO, 16 },
325
                { "AC97_HEADPHONE_VOL", 0x100 + AC97_HEADPHONE_VOL, 16 },
326
                { "AC97_MASTER_VOL_MONO", 0x100 + AC97_MASTER_VOL_MONO, 16 },
327
                { "AC97_MASTER_TONE", 0x100 + AC97_MASTER_TONE, 16 },
328
                { "AC97_PCBEEP_VOL", 0x100 + AC97_PCBEEP_VOL, 16 },
329
                { "AC97_PHONE_VOL", 0x100 + AC97_PHONE_VOL, 16 },
330
                { "AC97_MIC_VOL", 0x100 + AC97_MIC_VOL, 16 },
331
                { "AC97_LINEIN_VOL", 0x100 + AC97_LINEIN_VOL, 16 },
332
                { "AC97_CD_VOL", 0x100 + AC97_CD_VOL, 16 },
333
                { "AC97_VIDEO_VOL", 0x100 + AC97_VIDEO_VOL, 16 },
334
                { "AC97_AUX_VOL", 0x100 + AC97_AUX_VOL, 16 },
335
                { "AC97_PCMOUT_VOL", 0x100 + AC97_PCMOUT_VOL, 16 },
336
                { "AC97_RECORD_SELECT", 0x100 + AC97_RECORD_SELECT, 16 },
337
                { "AC97_RECORD_GAIN", 0x100 + AC97_RECORD_GAIN, 16 },
338
                { "AC97_RECORD_GAIN_MIC", 0x100 + AC97_RECORD_GAIN_MIC, 16 },
339
                { "AC97_GENERAL_PURPOSE", 0x100 + AC97_GENERAL_PURPOSE, 16 },
340
                { "AC97_3D_CONTROL", 0x100 + AC97_3D_CONTROL, 16 },
341
                { "AC97_MODEM_RATE", 0x100 + AC97_MODEM_RATE, 16 },
342
                { "AC97_POWER_CONTROL", 0x100 + AC97_POWER_CONTROL, 16 },
343
                { 0 }
344
        };
345
 
346
        if (dev == NULL)
347
                return -ENODEV;
348
 
349
        for (i = 0; regs[i].name != 0; i++)
350
                out += sprintf(out, "%s: 0x%0*x\n", regs[i].name,
351
                        regs[i].width >> 2,
352
                        (regs[i].width == 16
353
                                ? AD1889_READW(dev, regs[i].offset)
354
                                : AD1889_READL(dev, regs[i].offset)));
355
 
356
        for (i = 0; i < AD_MAX_STATES; i++) {
357
                out += sprintf(out, "DMA status for %s:\n",
358
                        (i == AD_WAV_STATE ? "WAV" : "ADC"));
359
                out += sprintf(out, "\t\t0x%p (IOVA: 0x%u)\n",
360
                        dev->state[i].dmabuf.rawbuf,
361
                        dev->state[i].dmabuf.dma_handle);
362
 
363
                out += sprintf(out, "\tread ptr: offset %u\n",
364
                        (unsigned int)dev->state[i].dmabuf.rd_ptr);
365
                out += sprintf(out, "\twrite ptr: offset %u\n",
366
                        (unsigned int)dev->state[i].dmabuf.wr_ptr);
367
                out += sprintf(out, "\tdma len: offset %u\n",
368
                        (unsigned int)dev->state[i].dmabuf.dma_len);
369
        }
370
 
371
        len = out - page - off;
372
        if (len < count) {
373
                *eof = 1;
374
                if (len <= 0) return 0;
375
        } else {
376
                len = count;
377
        }
378
        *start = page + off;
379
        return len;
380
}
381
 
382
/***************************** DMA interfaces ************************** */
383
#if 0
384
static inline unsigned long ad1889_get_dma_addr(ad1889_state_t *state)
385
{
386
        struct dmabuf *dmabuf = &state->dmabuf;
387
        u32 offset;
388
 
389
        if (!(dmabuf->enable & (DAC_RUNNING | ADC_RUNNING))) {
390
                printk(KERN_ERR DEVNAME ": get_dma_addr called without dma enabled\n");
391
                return 0;
392
        }
393
 
394
        if (dmabuf->enable & DAC_RUNNING)
395
                offset = le32_to_cpu(AD1889_READL(state->card, AD_DMAWAVBA));
396
        else
397
                offset = le32_to_cpu(AD1889_READL(state->card, AD_DMAADCBA));
398
 
399
        return (unsigned long)bus_to_virt((unsigned long)offset) - (unsigned long)dmabuf->rawbuf;
400
}
401
 
402
static void ad1889_update_ptr(ad1889_dev_t *dev, int wake)
403
{
404
        ad1889_state_t *state;
405
        struct dmabuf *dmabuf;
406
        unsigned long hwptr;
407
        int diff;
408
 
409
        /* check ADC first */
410
        state = &dev->adc_state;
411
        dmabuf = &state->dmabuf;
412
        if (dmabuf->enable & ADC_RUNNING) {
413
                hwptr = ad1889_get_dma_addr(state);
414
                diff = (dmabuf->dmasize + hwptr - dmabuf->hwptr) % dmabuf->dmasize;
415
 
416
                dmabuf->hwptr = hwptr;
417
                dmabuf->total_bytes += diff;
418
                dmabuf->count += diff;
419
                if (dmabuf->count > dmabuf->dmasize)
420
                        dmabuf->count = dmabuf->dmasize;
421
 
422
                if (dmabuf->mapped) {
423
                        if (wake & dmabuf->count >= dmabuf->fragsize)
424
                                wake_up(&dmabuf->wait);
425
                } else {
426
                        if (wake & dmabuf->count > 0)
427
                                wake_up(&dmabuf->wait);
428
                }
429
        }
430
 
431
        /* check DAC */
432
        state = &dev->wav_state;
433
        dmabuf = &state->dmabuf;
434
        if (dmabuf->enable & DAC_RUNNING) {
435
XXX
436
 
437
}
438
#endif
439
 
440
/************************* /dev/dsp interfaces ************************* */
441
 
442
static ssize_t ad1889_read(struct file *file, char *buffer, size_t count,
443
        loff_t *ppos)
444
{
445
        return 0;
446
}
447
 
448
static ssize_t ad1889_write(struct file *file, const char *buffer, size_t count,
449
        loff_t *ppos)
450
{
451
        ad1889_dev_t *dev = (ad1889_dev_t *)file->private_data;
452
        ad1889_state_t *state = &dev->state[AD_WAV_STATE];
453
        volatile struct dmabuf *dmabuf = &state->dmabuf;
454
        ssize_t ret = 0;
455
        DECLARE_WAITQUEUE(wait, current);
456
 
457
        if (ppos != &file->f_pos)
458
                return -ESPIPE;
459
 
460
        down(&state->sem);
461
#if 0
462
        if (dmabuf->mapped) {
463
                ret = -ENXIO;
464
                goto err1;
465
        }
466
#endif
467
        if (!access_ok(VERIFY_READ, buffer, count)) {
468
                ret = -EFAULT;
469
                goto err1;
470
        }
471
 
472
        add_wait_queue(&state->dmabuf.wait, &wait);
473
 
474
        /* start filling dma buffer.... */
475
        while (count > 0) {
476
                long rem;
477
                long cnt = count;
478
                unsigned long flags;
479
 
480
 
481
                for (;;) {
482
                        long used_bytes;
483
                        long timeout;   /* max time for DMA in jiffies */
484
 
485
                        /* buffer is full if wr catches up to rd */
486
                        spin_lock_irqsave(&state->card->lock, flags);
487
                        used_bytes = dmabuf->wr_ptr - dmabuf->rd_ptr;
488
                        timeout = (dmabuf->dma_len * HZ) / dmabuf->rate;
489
                        spin_unlock_irqrestore(&state->card->lock, flags);
490
 
491
                        /* adjust for buffer wrap around */
492
                        used_bytes = (used_bytes + DMA_SIZE) & (DMA_SIZE - 1);
493
 
494
                        /* If at least one page unused */
495
                        if (used_bytes < (DMA_SIZE - 0x1000))
496
                                break;
497
 
498
                        /* dma buffer full */
499
 
500
                        if (file->f_flags & O_NONBLOCK) {
501
                                ret = -EAGAIN;
502
                                goto err2;
503
                        }
504
 
505
                        set_current_state(TASK_INTERRUPTIBLE);
506
                        if (!schedule_timeout(timeout + 1))
507
                                printk(KERN_WARNING "AD1889 timeout(%ld) r/w %lx/%lx len %lx\n",
508
                                    timeout+1,
509
                                    dmabuf->rd_ptr, dmabuf->wr_ptr,
510
                                    dmabuf->dma_len);
511
 
512
                        if (signal_pending(current)) {
513
                                ret = -ERESTARTSYS;
514
                                goto err2;
515
                        }
516
 
517
                }
518
 
519
                /* watch out for wrapping around static buffer */
520
                spin_lock_irqsave(&state->card->lock, flags);
521
                rem = DMA_SIZE - dmabuf->wr_ptr;
522
                if (cnt > rem)
523
                        cnt = rem;
524
 
525
                rem = dmabuf->wr_ptr;
526
 
527
                /* update dma pointers */
528
                dmabuf->wr_ptr += cnt;
529
                dmabuf->wr_ptr &= DMA_SIZE - 1; /* wrap ptr if necessary */
530
                spin_unlock_irqrestore(&state->card->lock, flags);
531
 
532
                /* transfer unwrapped chunk */
533
                if (copy_from_user(dmabuf->rawbuf + rem, buffer, cnt)) {
534
                        ret = -EFAULT;
535
                        goto err2;
536
                }
537
 
538
                DBG("Writing 0x%lx bytes to +0x%lx\n", cnt, rem);
539
 
540
                /* update counters */
541
                count -= cnt;
542
                buffer += cnt;
543
                ret += cnt;
544
 
545
                /* we have something to play - go play it! */
546
                ad1889_trigger_playback(dev);
547
        }
548
 
549
err2:
550
        remove_wait_queue(&state->dmabuf.wait, &wait);
551
err1:
552
        up(&state->sem);
553
        return ret;
554
}
555
 
556
static unsigned int ad1889_poll(struct file *file, struct poll_table_struct *wait)
557
{
558
        unsigned int mask = 0;
559
#if 0
560
        ad1889_dev_t *dev = (ad1889_dev_t *)file->private_data;
561
        ad1889_state_t *state = NULL;
562
        struct dmabuf *dmabuf;
563
        unsigned long flags;
564
 
565
        if (!(file->f_mode & (FMODE_READ | FMODE_WRITE)))
566
                return -EINVAL;
567
 
568
        if (file->f_mode & FMODE_WRITE) {
569
                state = &dev->state[AD_WAV_STATE];
570
                if (!state) return 0;
571
                dmabuf = &state->dmabuf;
572
                poll_wait(file, &dmabuf->wait, wait);
573
        }
574
 
575
        if (file->f_mode & FMODE_READ) {
576
                state = &dev->state[AD_ADC_STATE];
577
                if (!state) return 0;
578
                dmabuf = &state->dmabuf;
579
                poll_wait(file, &dmabuf->wait, wait);
580
        }
581
 
582
        spin_lock_irqsave(&dev->lock, flags);
583
        ad1889_update_ptr(dev, 0);
584
 
585
        if (file->f_mode & FMODE_WRITE) {
586
                state = &dev->state[WAV_STATE];
587
                dmabuf = &state->dmabuf;
588
                if (dmabuf->mapped) {
589
                        if (dmabuf->count >= (int)dmabuf->fragsize)
590
                                mask |= POLLOUT | POLLWRNORM;
591
                } else {
592
                        if ((int)dmabuf->dmasize >= dmabuf->count +
593
                                (int)dmabuf->fragsize)
594
                                mask |= POLLOUT | POLLWRNORM;
595
                }
596
        }
597
 
598
        if (file ->f_mode & FMODE_READ) {
599
                state = &dev->state[AD_ADC_STATE];
600
                dmabuf = &state->dmabuf;
601
                if (dmabuf->count >= (int)dmabuf->fragsize)
602
                        mask |= POLLIN | POLLRDNORM;
603
        }
604
        spin_unlock_irqrestore(&dev->lock, flags);
605
 
606
#endif
607
        return mask;
608
}
609
 
610
static int ad1889_mmap(struct file *file, struct vm_area_struct *vma)
611
{
612
        return 0;
613
}
614
 
615
static int ad1889_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
616
        unsigned long arg)
617
{
618
        int val = 0;
619
        ad1889_dev_t *dev = (ad1889_dev_t *)file->private_data;
620
        struct dmabuf *dmabuf;
621
        audio_buf_info abinfo;
622
 
623
        switch (cmd)
624
        {
625
        case OSS_GETVERSION:
626
                return put_user(SOUND_VERSION, (int *)arg);
627
 
628
        case SNDCTL_DSP_RESET:
629
                break;
630
 
631
        case SNDCTL_DSP_SYNC:
632
                break;
633
 
634
        case SNDCTL_DSP_SPEED:
635
                /* set sampling rate */
636
                if (get_user(val, (int *)arg))
637
                        return -EFAULT;
638
                if (val > 5400 && val < 48000)
639
                {
640
                        if (file->f_mode & FMODE_WRITE)
641
                                AD1889_WRITEW(ad1889_dev, AD_DSWAS, val);
642
                        if (file->f_mode & FMODE_READ)
643
                                AD1889_WRITEW(ad1889_dev, AD_DSRES, val);
644
                }
645
                return 0;
646
 
647
        case SNDCTL_DSP_STEREO: /* undocumented? */
648
                if (get_user(val, (int *)arg))
649
                        return -EFAULT;
650
                if (file->f_mode & FMODE_READ) {
651
                        val = AD1889_READW(ad1889_dev, AD_DSWSMC);
652
                        if (val) {
653
                                val |= 0x0200;  /* set WAST */
654
                        } else {
655
                                val &= ~0x0200; /* clear WAST */
656
                        }
657
                        AD1889_WRITEW(ad1889_dev, AD_DSWSMC, val);
658
                }
659
                if (file->f_mode & FMODE_WRITE) {
660
                        val = AD1889_READW(ad1889_dev, AD_DSRAMC);
661
                        if (val) {
662
                                val |= 0x0002;  /* set ADST */
663
                        } else {
664
                                val &= ~0x0002; /* clear ADST */
665
                        }
666
                        AD1889_WRITEW(ad1889_dev, AD_DSRAMC, val);
667
                }
668
 
669
                return 0;
670
 
671
        case SNDCTL_DSP_GETBLKSIZE:
672
                return put_user(DMA_SIZE, (int *)arg);
673
 
674
        case SNDCTL_DSP_GETFMTS:
675
                return put_user(AFMT_S16_LE|AFMT_U8, (int *)arg);
676
 
677
        case SNDCTL_DSP_SETFMT:
678
                if (get_user(val, (int *)arg))
679
                        return -EFAULT;
680
 
681
                if (file->f_mode & FMODE_READ)
682
                        ad1889_set_adc_fmt(dev, val);
683
 
684
                if (file->f_mode & FMODE_WRITE)
685
                        ad1889_set_wav_fmt(dev, val);
686
 
687
                return put_user(val, (int *)arg);
688
 
689
        case SNDCTL_DSP_CHANNELS:
690
                break;
691
 
692
        case SNDCTL_DSP_POST:
693
                /* send all data to device */
694
                break;
695
 
696
        case SNDCTL_DSP_SUBDIVIDE:
697
                break;
698
 
699
        case SNDCTL_DSP_SETFRAGMENT:
700
                /* not supported; uses fixed fragment sizes */
701
                return put_user(DMA_SIZE, (int *)arg);
702
 
703
        case SNDCTL_DSP_GETOSPACE:
704
        case SNDCTL_DSP_GETISPACE:
705
                /* space left in dma buffers */
706
                if (cmd == SNDCTL_DSP_GETOSPACE)
707
                        dmabuf = &dev->state[AD_WAV_STATE].dmabuf;
708
                else
709
                        dmabuf = &dev->state[AD_ADC_STATE].dmabuf;
710
                abinfo.fragments = 1;
711
                abinfo.fragstotal = 1;
712
                abinfo.fragsize = DMA_SIZE;
713
                abinfo.bytes = DMA_SIZE;
714
                return copy_to_user((void *)arg, &abinfo, sizeof(abinfo)) ? -EFAULT : 0;
715
        case SNDCTL_DSP_NONBLOCK:
716
                file->f_flags |= O_NONBLOCK;
717
                return 0;
718
 
719
        case SNDCTL_DSP_GETCAPS:
720
                return put_user(0, (int *)arg);
721
 
722
        case SNDCTL_DSP_GETTRIGGER:
723
        case SNDCTL_DSP_SETTRIGGER:
724
                break;
725
 
726
        case SNDCTL_DSP_GETIPTR:
727
        case SNDCTL_DSP_GETOPTR:
728
                break;
729
 
730
        case SNDCTL_DSP_SETDUPLEX:
731
                break;
732
 
733
        case SNDCTL_DSP_GETODELAY:
734
                break;
735
 
736
        case SOUND_PCM_READ_RATE:
737
                return put_user(AD1889_READW(ad1889_dev, AD_DSWAS), (int *)arg);
738
 
739
        case SOUND_PCM_READ_CHANNELS:
740
        case SOUND_PCM_READ_BITS:
741
                break;
742
 
743
        case SNDCTL_DSP_MAPINBUF:
744
        case SNDCTL_DSP_MAPOUTBUF:
745
        case SNDCTL_DSP_SETSYNCRO:
746
        case SOUND_PCM_WRITE_FILTER:
747
        case SOUND_PCM_READ_FILTER:
748
                break;
749
 
750
        default:
751
                break;
752
        }
753
 
754
        return -ENOTTY;
755
}
756
 
757
static int ad1889_open(struct inode *inode, struct file *file)
758
{
759
        /* check minor; only support /dev/dsp atm */
760
        if (MINOR(inode->i_rdev) != 3)
761
                return -ENXIO;
762
 
763
        file->private_data = ad1889_dev;
764
 
765
        ad1889_set_wav_rate(ad1889_dev, 44100);
766
        ad1889_set_wav_fmt(ad1889_dev, AFMT_S16_LE);
767
        AD1889_WRITEW(ad1889_dev, AD_DSWADA, 0x0404); /* attenuation */
768
        MOD_INC_USE_COUNT;
769
        return 0;
770
}
771
 
772
static int ad1889_release(struct inode *inode, struct file *file)
773
{
774
        /* if we have state free it here */
775
        MOD_DEC_USE_COUNT;
776
        return 0;
777
}
778
 
779
static struct file_operations ad1889_fops = {
780
        llseek:         no_llseek,
781
        read:           ad1889_read,
782
        write:          ad1889_write,
783
        poll:           ad1889_poll,
784
        ioctl:          ad1889_ioctl,
785
        mmap:           ad1889_mmap,
786
        open:           ad1889_open,
787
        release:        ad1889_release,
788
};
789
 
790
/************************* /dev/mixer interfaces ************************ */
791
static int ad1889_mixer_open(struct inode *inode, struct file *file)
792
{
793
        if (ad1889_dev->ac97_codec->dev_mixer != MINOR(inode->i_rdev))
794
                return -ENODEV;
795
 
796
        file->private_data = ad1889_dev->ac97_codec;
797
        MOD_INC_USE_COUNT;
798
        return 0;
799
}
800
 
801
static int ad1889_mixer_release(struct inode *inode, struct file *file)
802
{
803
        MOD_DEC_USE_COUNT;
804
        return 0;
805
}
806
 
807
static int ad1889_mixer_ioctl(struct inode *inode, struct file *file,
808
        unsigned int cmd, unsigned long arg)
809
{
810
        struct ac97_codec *codec = (struct ac97_codec *)file->private_data;
811
        return codec->mixer_ioctl(codec, cmd, arg);
812
}
813
 
814
static struct file_operations ad1889_mixer_fops = {
815
        llseek:         no_llseek,
816
        ioctl:          ad1889_mixer_ioctl,
817
        open:           ad1889_mixer_open,
818
        release:        ad1889_mixer_release,
819
};
820
 
821
/************************* AC97 interfaces ****************************** */
822
static void ad1889_codec_write(struct ac97_codec *ac97, u8 reg, u16 val)
823
{
824
        ad1889_dev_t *dev = ac97->private_data;
825
 
826
        //DBG("Writing 0x%x to 0x%lx\n", val, dev->regbase + 0x100 + reg);
827
        AD1889_WRITEW(dev, 0x100 + reg, val);
828
}
829
 
830
static u16 ad1889_codec_read(struct ac97_codec *ac97, u8 reg)
831
{
832
        ad1889_dev_t *dev = ac97->private_data;
833
        //DBG("Reading from 0x%lx\n", dev->regbase + 0x100 + reg);
834
        return AD1889_READW(dev, 0x100 + reg);
835
}
836
 
837
static int ad1889_ac97_init(ad1889_dev_t *dev, int id)
838
{
839
        struct ac97_codec *ac97;
840
        u16 eid;
841
 
842
        if ((ac97 = ac97_alloc_codec()) == NULL)
843
                return -ENOMEM;
844
 
845
        ac97->private_data = dev;
846
        ac97->id = id;
847
 
848
        ac97->codec_read = ad1889_codec_read;
849
        ac97->codec_write = ad1889_codec_write;
850
 
851
        if (ac97_probe_codec(ac97) == 0) {
852
                printk(DEVNAME ": ac97_probe_codec failed\n");
853
                goto out_free;
854
        }
855
 
856
        eid = ad1889_codec_read(ac97, AC97_EXTENDED_ID);
857
        if (eid == 0xffffff) {
858
                printk(KERN_WARNING DEVNAME ": no codec attached?\n");
859
                goto out_free;
860
        }
861
 
862
        dev->ac97_features = eid;
863
 
864
        if ((ac97->dev_mixer = register_sound_mixer(&ad1889_mixer_fops, -1)) < 0) {
865
                printk(KERN_ERR DEVNAME ": cannot register mixer\n");
866
                goto out_free;
867
        }
868
 
869
        dev->ac97_codec = ac97;
870
        return 0;
871
 
872
out_free:
873
        ac97_release_codec(ac97);
874
        return -ENODEV;
875
}
876
 
877
static int ad1889_aclink_reset(struct pci_dev * pcidev)
878
{
879
        u16 stat;
880
        int retry = 200;
881
        ad1889_dev_t *dev = pci_get_drvdata(pcidev);
882
 
883
        AD1889_WRITEW(dev, AD_DSCCS, 0x8000); /* turn on clock */
884
        AD1889_READW(dev, AD_DSCCS);
885
 
886
        WAIT_10MS();
887
 
888
        stat = AD1889_READW(dev, AD_ACIC);
889
        stat |= 0x0002;                         /* Reset Disable */
890
        AD1889_WRITEW(dev, AD_ACIC, stat);
891
        (void) AD1889_READW(dev, AD_ACIC);      /* flush posted write */
892
 
893
        udelay(10);
894
 
895
        stat = AD1889_READW(dev, AD_ACIC);
896
        stat |= 0x0001;                         /* Interface Enable */
897
        AD1889_WRITEW(dev, AD_ACIC, stat);
898
 
899
        do {
900
                if (AD1889_READW(dev, AD_ACIC) & 0x8000)        /* Ready */
901
                        break;
902
                WAIT_10MS();
903
                retry--;
904
        } while (retry > 0);
905
 
906
        if (!retry) {
907
                printk(KERN_ERR "ad1889_aclink_reset: codec is not ready [0x%x]\n",
908
                            AD1889_READW(dev, AD_ACIC));
909
                return -EBUSY;
910
        }
911
 
912
        /* TODO reset AC97 codec */
913
        /* TODO set wave/adc pci ctrl status */
914
 
915
        stat = AD1889_READW(dev, AD_ACIC);
916
        stat |= 0x0004;                         /* Audio Stream Output Enable */
917
        AD1889_WRITEW(dev, AD_ACIC, stat);
918
        return 0;
919
}
920
 
921
/************************* PCI interfaces ****************************** */
922
/* PCI device table */
923
static struct pci_device_id ad1889_id_tbl[] __devinitdata = {
924
        { PCI_VENDOR_ID_ANALOG_DEVICES, PCI_DEVICE_ID_AD1889JS, PCI_ANY_ID,
925
          PCI_ANY_ID, 0, 0, (unsigned long)DEVNAME },
926
        { },
927
};
928
MODULE_DEVICE_TABLE(pci, ad1889_id_tbl);
929
 
930
static void ad1889_interrupt(int irq, void *dev_id, struct pt_regs *regs)
931
{
932
        u32 stat;
933
        ad1889_dev_t *dev = (ad1889_dev_t *)dev_id;
934
 
935
        stat = AD1889_READL(dev, AD_DMADISR);
936
 
937
        /* clear ISR */
938
        AD1889_WRITEL(dev, AD_DMADISR, stat);
939
 
940
        if (stat & 0x8) {               /* WAVI */
941
                DBG("WAV interrupt\n");
942
                dev->stats.wav_intrs++;
943
                if (dev->state[AD_WAV_STATE].dmabuf.ready) {
944
                        ad1889_stop_wav(&dev->state[AD_WAV_STATE]);     /* clean up */
945
                        ad1889_start_wav(&dev->state[AD_WAV_STATE]);    /* start new */
946
                }
947
 
948
        }
949
 
950
        if (stat & 0x2 && dev->state[AD_ADC_STATE].dmabuf.ready) { /* ADCI */
951
                DBG("ADC interrupt\n");
952
                dev->stats.adc_intrs++;
953
        }
954
}
955
 
956
static void ad1889_initcfg(ad1889_dev_t *dev)
957
{
958
        u16 tmp;
959
 
960
        /* make sure the interrupt bits are setup the way we want */
961
        tmp = AD1889_READW(dev, AD_DMAWAVCTRL);
962
        tmp &= ~0x00ff; /* flat dma, no sg, mask out the intr bits */
963
        tmp |= 0x0004;  /* intr on count, loop */
964
        AD1889_WRITEW(dev, AD_DMAWAVCTRL, tmp);
965
 
966
        /* unmute... */
967
        tmp = AD1889_READW(dev, AD_DSWADA);
968
        tmp &= ~0x8080;
969
        AD1889_WRITEW(dev, AD_DSWADA, tmp);
970
}
971
 
972
static int __devinit ad1889_probe(struct pci_dev *pcidev, const struct pci_device_id *ent)
973
{
974
        int err;
975
        ad1889_dev_t *dev;
976
        unsigned long bar;
977
        struct proc_dir_entry *proc_root = NULL;
978
 
979
        if ((err = pci_enable_device(pcidev)) != 0) {
980
                printk(KERN_ERR DEVNAME ": pci_enable_device failed\n");
981
                return err;
982
        }
983
 
984
        pci_set_master(pcidev);
985
        if ((dev = ad1889_alloc_dev(pcidev)) == NULL) {
986
                printk(KERN_ERR DEVNAME ": cannot allocate memory for device\n");
987
                return -ENOMEM;
988
        }
989
        pci_set_drvdata(pcidev, dev);
990
        bar = pci_resource_start(pcidev, 0);
991
 
992
        if (!(pci_resource_flags(pcidev, 0) & IORESOURCE_MEM)) {
993
                printk(KERN_ERR DEVNAME ": memory region not assigned\n");
994
                goto err_free_mem;
995
        }
996
 
997
        if (request_irq(pcidev->irq, ad1889_interrupt, SA_SHIRQ, DEVNAME, dev) != 0) {
998
                printk(KERN_ERR DEVNAME ": unable to request interrupt\n");
999
                goto err_free_mem;
1000
        }
1001
 
1002
        request_mem_region(bar, AD_DSIOMEMSIZE, DEVNAME);
1003
        dev->regbase = (unsigned long)ioremap_nocache(bar, AD_DSIOMEMSIZE);
1004
 
1005
        printk(KERN_INFO DEVNAME ": %s at 0x%lx IRQ %d\n",
1006
                (char *)ent->driver_data, dev->regbase, pcidev->irq);
1007
 
1008
        if (ad1889_aclink_reset(pcidev) != 0)
1009
                goto err_free_mem;
1010
 
1011
        /* register /dev/dsp */
1012
        if ((dev->dev_audio = register_sound_dsp(&ad1889_fops, -1)) < 0) {
1013
                printk(KERN_ERR DEVNAME ": cannot register /dev/dsp\n");
1014
                goto err_free_irq;
1015
        }
1016
 
1017
        if ((err = ad1889_ac97_init(dev, 0)) != 0)
1018
                goto err_free_dsp;
1019
 
1020
        if (((proc_root = proc_mkdir("driver/ad1889", 0)) == NULL) ||
1021
            create_proc_read_entry("ac97", S_IFREG|S_IRUGO, proc_root, ac97_read_proc, dev->ac97_codec) == NULL ||
1022
            create_proc_read_entry("info", S_IFREG|S_IRUGO, proc_root, ad1889_read_proc, dev) == NULL)
1023
                goto err_free_dsp;
1024
 
1025
        ad1889_initcfg(dev);
1026
 
1027
        //DBG(DEVNAME ": Driver initialization done!\n");
1028
 
1029
        ad1889_dev = dev;
1030
 
1031
        return 0;
1032
 
1033
err_free_dsp:
1034
        unregister_sound_dsp(dev->dev_audio);
1035
 
1036
err_free_irq:
1037
        free_irq(pcidev->irq, dev);
1038
 
1039
err_free_mem:
1040
        ad1889_free_dev(dev);
1041
        pci_set_drvdata(pcidev, 0);
1042
 
1043
        return -ENODEV;
1044
}
1045
 
1046
static void __devexit ad1889_remove(struct pci_dev *pcidev)
1047
{
1048
        ad1889_dev_t *dev = pci_get_drvdata(pcidev);
1049
 
1050
        if (dev == NULL) return;
1051
 
1052
        unregister_sound_mixer(dev->ac97_codec->dev_mixer);
1053
        unregister_sound_dsp(dev->dev_audio);
1054
        free_irq(pcidev->irq, dev);
1055
        release_mem_region(dev->regbase, AD_DSIOMEMSIZE);
1056
 
1057
        /* any hw programming needed? */
1058
        ad1889_free_dev(dev);
1059
}
1060
 
1061
MODULE_AUTHOR("Randolph Chung");
1062
MODULE_DESCRIPTION("Analog Devices AD1889 PCI Audio");
1063
MODULE_LICENSE("GPL");
1064
 
1065
static struct pci_driver ad1889_driver = {
1066
        name:           DEVNAME,
1067
        id_table:       ad1889_id_tbl,
1068
        probe:          ad1889_probe,
1069
        remove:         __devexit_p(ad1889_remove),
1070
};
1071
 
1072
static int __init ad1889_init_module(void)
1073
{
1074
        return pci_module_init(&ad1889_driver);
1075
}
1076
 
1077
static void ad1889_exit_module(void)
1078
{
1079
        pci_unregister_driver(&ad1889_driver);
1080
        return;
1081
}
1082
 
1083
module_init(ad1889_init_module);
1084
module_exit(ad1889_exit_module);

powered by: WebSVN 2.1.0

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