2 * Copyright 2001-2004 Randolph Chung <tausq@debian.org>
4 * Analog Devices 1889 PCI audio driver (AD1819 AC97-compatible codec)
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.
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.
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.
21 * 1. Only flat DMA is supported; s-g is not supported right now
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!
27 * $Id: ad1889.c,v 1.3 2002/10/19 21:31:44 grundler Exp $
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/interrupt.h>
42 #include <asm/delay.h>
45 #include <asm/uaccess.h>
49 #define DBG(fmt, arg...) printk(fmt, ##arg)
50 #define DEVNAME "ad1889"
56 #define UNDERRUN(dev) (0)
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)
64 /* #define WAIT_10MS() schedule_timeout(HZ/10) */
65 #define WAIT_10MS() do { int __i; for (__i = 0; __i < 100; __i++) udelay(1000); } while(0)
67 /* currently only support a single device */
68 static ad1889_dev_t
*ad1889_dev
= NULL
;
70 /************************* helper routines ***************************** */
71 static inline void ad1889_set_wav_rate(ad1889_dev_t
*dev
, int rate
)
73 struct ac97_codec
*ac97_codec
= dev
->ac97_codec
;
75 DBG("Setting WAV rate to %d\n", rate
);
76 dev
->state
[AD_WAV_STATE
].dmabuf
.rate
= rate
;
77 AD1889_WRITEW(dev
, AD_DSWAS
, rate
);
79 /* Cycle the DAC to enable the new rate */
80 ac97_codec
->codec_write(dev
->ac97_codec
, AC97_POWER_CONTROL
, 0x0200);
82 ac97_codec
->codec_write(dev
->ac97_codec
, AC97_POWER_CONTROL
, 0);
85 static inline void ad1889_set_wav_fmt(ad1889_dev_t
*dev
, int fmt
)
89 DBG("Setting WAV format to 0x%x\n", fmt
);
91 tmp
= AD1889_READW(ad1889_dev
, AD_DSWSMC
);
92 if (fmt
& AFMT_S16_LE
) {
93 //tmp |= 0x0100; /* set WA16 */
94 tmp
|= 0x0300; /* set WA16 stereo */
95 } else if (fmt
& AFMT_U8
) {
96 tmp
&= ~0x0100; /* clear WA16 */
98 AD1889_WRITEW(ad1889_dev
, AD_DSWSMC
, tmp
);
101 static inline void ad1889_set_adc_fmt(ad1889_dev_t
*dev
, int fmt
)
105 DBG("Setting ADC format to 0x%x\n", fmt
);
107 tmp
= AD1889_READW(ad1889_dev
, AD_DSRAMC
);
108 if (fmt
& AFMT_S16_LE
) {
109 tmp
|= 0x0100; /* set WA16 */
110 } else if (fmt
& AFMT_U8
) {
111 tmp
&= ~0x0100; /* clear WA16 */
113 AD1889_WRITEW(ad1889_dev
, AD_DSRAMC
, tmp
);
116 static void ad1889_start_wav(ad1889_state_t
*state
)
119 struct dmabuf
*dmabuf
= &state
->dmabuf
;
123 spin_lock_irqsave(&state
->card
->lock
, flags
);
125 if (dmabuf
->dma_len
) /* DMA already in flight */
129 cnt
= dmabuf
->wr_ptr
- dmabuf
->rd_ptr
;
130 if (cnt
== 0) /* done - don't need to do anything */
133 /* If the wr_ptr has wrapped, only map to the end */
135 cnt
= DMA_SIZE
- dmabuf
->rd_ptr
;
137 dmabuf
->dma_handle
= pci_map_single(ad1889_dev
->pci
,
138 dmabuf
->rawbuf
+ dmabuf
->rd_ptr
,
139 cnt
, PCI_DMA_TODEVICE
);
140 dmabuf
->dma_len
= cnt
;
143 DBG("Starting playback at 0x%p for %ld bytes\n", dmabuf
->rawbuf
+
144 dmabuf
->rd_ptr
, dmabuf
->dma_len
);
146 /* load up the current register set */
147 AD1889_WRITEL(ad1889_dev
, AD_DMAWAVCC
, cnt
);
148 AD1889_WRITEL(ad1889_dev
, AD_DMAWAVICC
, cnt
);
149 AD1889_WRITEL(ad1889_dev
, AD_DMAWAVCA
, dmabuf
->dma_handle
);
151 /* TODO: for now we load the base registers with the same thing */
152 AD1889_WRITEL(ad1889_dev
, AD_DMAWAVBC
, cnt
);
153 AD1889_WRITEL(ad1889_dev
, AD_DMAWAVIBC
, cnt
);
154 AD1889_WRITEL(ad1889_dev
, AD_DMAWAVBA
, dmabuf
->dma_handle
);
156 /* and we're off to the races... */
157 AD1889_WRITEL(ad1889_dev
, AD_DMACHSS
, 0x8);
158 tmp
= AD1889_READW(ad1889_dev
, AD_DSWSMC
);
159 tmp
|= 0x0400; /* set WAEN */
160 AD1889_WRITEW(ad1889_dev
, AD_DSWSMC
, tmp
);
161 (void) AD1889_READW(ad1889_dev
, AD_DSWSMC
); /* flush posted PCI write */
163 dmabuf
->enable
|= DAC_RUNNING
;
166 spin_unlock_irqrestore(&state
->card
->lock
, flags
);
170 static void ad1889_stop_wav(ad1889_state_t
*state
)
173 struct dmabuf
*dmabuf
= &state
->dmabuf
;
175 spin_lock_irqsave(&state
->card
->lock
, flags
);
177 if (dmabuf
->enable
& DAC_RUNNING
) {
179 unsigned long cnt
= dmabuf
->dma_len
;
181 tmp
= AD1889_READW(ad1889_dev
, AD_DSWSMC
);
182 tmp
&= ~0x0400; /* clear WAEN */
183 AD1889_WRITEW(ad1889_dev
, AD_DSWSMC
, tmp
);
184 (void) AD1889_READW(ad1889_dev
, AD_DSWSMC
); /* flush posted PCI write */
185 pci_unmap_single(ad1889_dev
->pci
, dmabuf
->dma_handle
,
186 cnt
, PCI_DMA_TODEVICE
);
188 dmabuf
->enable
&= ~DAC_RUNNING
;
190 /* update dma pointers */
191 dmabuf
->rd_ptr
+= cnt
;
192 dmabuf
->rd_ptr
&= (DMA_SIZE
- 1);
194 dmabuf
->dma_handle
= 0;
198 wake_up(&dmabuf
->wait
);
201 spin_unlock_irqrestore(&state
->card
->lock
, flags
);
206 static void ad1889_startstop_adc(ad1889_state_t
*state
, int start
)
211 spin_lock_irqsave(&state
->card
->lock
, flags
);
213 tmp
= AD1889_READW(ad1889_dev
, AD_DSRAMC
);
215 state
->dmabuf
.enable
|= ADC_RUNNING
;
216 tmp
|= 0x0004; /* set ADEN */
218 state
->dmabuf
.enable
&= ~ADC_RUNNING
;
219 tmp
&= ~0x0004; /* clear ADEN */
221 AD1889_WRITEW(ad1889_dev
, AD_DSRAMC
, tmp
);
223 spin_unlock_irqrestore(&state
->card
->lock
, flags
);
227 static ad1889_dev_t
*ad1889_alloc_dev(struct pci_dev
*pci
)
230 struct dmabuf
*dmabuf
;
233 if ((dev
= kmalloc(sizeof(ad1889_dev_t
), GFP_KERNEL
)) == NULL
)
235 memset(dev
, 0, sizeof(ad1889_dev_t
));
236 spin_lock_init(&dev
->lock
);
239 for (i
= 0; i
< AD_MAX_STATES
; i
++) {
240 dev
->state
[i
].card
= dev
;
241 init_MUTEX(&dev
->state
[i
].sem
);
242 init_waitqueue_head(&dev
->state
[i
].dmabuf
.wait
);
245 /* allocate dma buffer */
247 for (i
= 0; i
< AD_MAX_STATES
; i
++) {
248 dmabuf
= &dev
->state
[i
].dmabuf
;
249 dmabuf
->rawbuf
= kmalloc(DMA_SIZE
, GFP_KERNEL
|GFP_DMA
);
251 goto err_free_dmabuf
;
252 dmabuf
->rawbuf_size
= DMA_SIZE
;
253 dmabuf
->dma_handle
= 0;
254 dmabuf
->rd_ptr
= dmabuf
->wr_ptr
= dmabuf
->dma_len
= 0UL;
256 dmabuf
->rate
= 48000;
262 kfree(dev
->state
[i
].dmabuf
.rawbuf
);
267 static void ad1889_free_dev(ad1889_dev_t
*dev
)
270 struct dmabuf
*dmabuf
;
276 ac97_release_codec(dev
->ac97_codec
);
278 for (j
= 0; j
< AD_MAX_STATES
; j
++) {
279 dmabuf
= &dev
->state
[j
].dmabuf
;
280 if (dmabuf
->rawbuf
!= NULL
)
281 kfree(dmabuf
->rawbuf
);
287 static inline void ad1889_trigger_playback(ad1889_dev_t
*dev
)
291 struct dmabuf
*dmabuf
= &dev
->state
[AD_WAV_STATE
].dmabuf
;
294 ad1889_start_wav(&dev
->state
[AD_WAV_STATE
]);
297 static int ad1889_read_proc (char *page
, char **start
, off_t off
,
298 int count
, int *eof
, void *data
)
302 ad1889_dev_t
*dev
= data
;
303 ad1889_reg_t regs
[] = {
304 { "WSMC", AD_DSWSMC
, 16 },
305 { "RAMC", AD_DSRAMC
, 16 },
306 { "WADA", AD_DSWADA
, 16 },
307 { "SYDA", AD_DSSYDA
, 16 },
308 { "WAS", AD_DSWAS
, 16 },
309 { "RES", AD_DSRES
, 16 },
310 { "CCS", AD_DSCCS
, 16 },
311 { "ADCBA", AD_DMAADCBA
, 32 },
312 { "ADCCA", AD_DMAADCCA
, 32 },
313 { "ADCBC", AD_DMAADCBC
, 32 },
314 { "ADCCC", AD_DMAADCCC
, 32 },
315 { "ADCIBC", AD_DMAADCIBC
, 32 },
316 { "ADCICC", AD_DMAADCICC
, 32 },
317 { "ADCCTRL", AD_DMAADCCTRL
, 16 },
318 { "WAVBA", AD_DMAWAVBA
, 32 },
319 { "WAVCA", AD_DMAWAVCA
, 32 },
320 { "WAVBC", AD_DMAWAVBC
, 32 },
321 { "WAVCC", AD_DMAWAVCC
, 32 },
322 { "WAVIBC", AD_DMAWAVIBC
, 32 },
323 { "WAVICC", AD_DMAWAVICC
, 32 },
324 { "WAVCTRL", AD_DMAWAVCTRL
, 16 },
325 { "DISR", AD_DMADISR
, 32 },
326 { "CHSS", AD_DMACHSS
, 32 },
327 { "IPC", AD_GPIOIPC
, 16 },
328 { "OP", AD_GPIOOP
, 16 },
329 { "IP", AD_GPIOIP
, 16 },
330 { "ACIC", AD_ACIC
, 16 },
331 { "AC97_RESET", 0x100 + AC97_RESET
, 16 },
332 { "AC97_MASTER_VOL_STEREO", 0x100 + AC97_MASTER_VOL_STEREO
, 16 },
333 { "AC97_HEADPHONE_VOL", 0x100 + AC97_HEADPHONE_VOL
, 16 },
334 { "AC97_MASTER_VOL_MONO", 0x100 + AC97_MASTER_VOL_MONO
, 16 },
335 { "AC97_MASTER_TONE", 0x100 + AC97_MASTER_TONE
, 16 },
336 { "AC97_PCBEEP_VOL", 0x100 + AC97_PCBEEP_VOL
, 16 },
337 { "AC97_PHONE_VOL", 0x100 + AC97_PHONE_VOL
, 16 },
338 { "AC97_MIC_VOL", 0x100 + AC97_MIC_VOL
, 16 },
339 { "AC97_LINEIN_VOL", 0x100 + AC97_LINEIN_VOL
, 16 },
340 { "AC97_CD_VOL", 0x100 + AC97_CD_VOL
, 16 },
341 { "AC97_VIDEO_VOL", 0x100 + AC97_VIDEO_VOL
, 16 },
342 { "AC97_AUX_VOL", 0x100 + AC97_AUX_VOL
, 16 },
343 { "AC97_PCMOUT_VOL", 0x100 + AC97_PCMOUT_VOL
, 16 },
344 { "AC97_RECORD_SELECT", 0x100 + AC97_RECORD_SELECT
, 16 },
345 { "AC97_RECORD_GAIN", 0x100 + AC97_RECORD_GAIN
, 16 },
346 { "AC97_RECORD_GAIN_MIC", 0x100 + AC97_RECORD_GAIN_MIC
, 16 },
347 { "AC97_GENERAL_PURPOSE", 0x100 + AC97_GENERAL_PURPOSE
, 16 },
348 { "AC97_3D_CONTROL", 0x100 + AC97_3D_CONTROL
, 16 },
349 { "AC97_MODEM_RATE", 0x100 + AC97_MODEM_RATE
, 16 },
350 { "AC97_POWER_CONTROL", 0x100 + AC97_POWER_CONTROL
, 16 },
357 for (i
= 0; regs
[i
].name
!= 0; i
++)
358 out
+= sprintf(out
, "%s: 0x%0*x\n", regs
[i
].name
,
361 ? AD1889_READW(dev
, regs
[i
].offset
)
362 : AD1889_READL(dev
, regs
[i
].offset
)));
364 for (i
= 0; i
< AD_MAX_STATES
; i
++) {
365 out
+= sprintf(out
, "DMA status for %s:\n",
366 (i
== AD_WAV_STATE
? "WAV" : "ADC"));
367 out
+= sprintf(out
, "\t\t0x%p (IOVA: 0x%llu)\n",
368 dev
->state
[i
].dmabuf
.rawbuf
,
369 (unsigned long long)dev
->state
[i
].dmabuf
.dma_handle
);
371 out
+= sprintf(out
, "\tread ptr: offset %u\n",
372 (unsigned int)dev
->state
[i
].dmabuf
.rd_ptr
);
373 out
+= sprintf(out
, "\twrite ptr: offset %u\n",
374 (unsigned int)dev
->state
[i
].dmabuf
.wr_ptr
);
375 out
+= sprintf(out
, "\tdma len: offset %u\n",
376 (unsigned int)dev
->state
[i
].dmabuf
.dma_len
);
379 len
= out
- page
- off
;
382 if (len
<= 0) return 0;
390 /***************************** DMA interfaces ************************** */
392 static inline unsigned long ad1889_get_dma_addr(ad1889_state_t
*state
)
394 struct dmabuf
*dmabuf
= &state
->dmabuf
;
397 if (!(dmabuf
->enable
& (DAC_RUNNING
| ADC_RUNNING
))) {
398 printk(KERN_ERR DEVNAME
": get_dma_addr called without dma enabled\n");
402 if (dmabuf
->enable
& DAC_RUNNING
)
403 offset
= le32_to_cpu(AD1889_READL(state
->card
, AD_DMAWAVBA
));
405 offset
= le32_to_cpu(AD1889_READL(state
->card
, AD_DMAADCBA
));
407 return (unsigned long)bus_to_virt((unsigned long)offset
) - (unsigned long)dmabuf
->rawbuf
;
410 static void ad1889_update_ptr(ad1889_dev_t
*dev
, int wake
)
412 ad1889_state_t
*state
;
413 struct dmabuf
*dmabuf
;
417 /* check ADC first */
418 state
= &dev
->adc_state
;
419 dmabuf
= &state
->dmabuf
;
420 if (dmabuf
->enable
& ADC_RUNNING
) {
421 hwptr
= ad1889_get_dma_addr(state
);
422 diff
= (dmabuf
->dmasize
+ hwptr
- dmabuf
->hwptr
) % dmabuf
->dmasize
;
424 dmabuf
->hwptr
= hwptr
;
425 dmabuf
->total_bytes
+= diff
;
426 dmabuf
->count
+= diff
;
427 if (dmabuf
->count
> dmabuf
->dmasize
)
428 dmabuf
->count
= dmabuf
->dmasize
;
430 if (dmabuf
->mapped
) {
431 if (wake
& dmabuf
->count
>= dmabuf
->fragsize
)
432 wake_up(&dmabuf
->wait
);
434 if (wake
& dmabuf
->count
> 0)
435 wake_up(&dmabuf
->wait
);
440 state
= &dev
->wav_state
;
441 dmabuf
= &state
->dmabuf
;
442 if (dmabuf
->enable
& DAC_RUNNING
) {
448 /************************* /dev/dsp interfaces ************************* */
450 static ssize_t
ad1889_read(struct file
*file
, char __user
*buffer
, size_t count
,
456 static ssize_t
ad1889_write(struct file
*file
, const char __user
*buffer
, size_t count
,
459 ad1889_dev_t
*dev
= (ad1889_dev_t
*)file
->private_data
;
460 ad1889_state_t
*state
= &dev
->state
[AD_WAV_STATE
];
461 volatile struct dmabuf
*dmabuf
= &state
->dmabuf
;
463 DECLARE_WAITQUEUE(wait
, current
);
467 if (dmabuf
->mapped
) {
472 if (!access_ok(VERIFY_READ
, buffer
, count
)) {
477 add_wait_queue(&state
->dmabuf
.wait
, &wait
);
479 /* start filling dma buffer.... */
487 long timeout
; /* max time for DMA in jiffies */
489 /* buffer is full if wr catches up to rd */
490 spin_lock_irqsave(&state
->card
->lock
, flags
);
491 used_bytes
= dmabuf
->wr_ptr
- dmabuf
->rd_ptr
;
492 timeout
= (dmabuf
->dma_len
* HZ
) / dmabuf
->rate
;
493 spin_unlock_irqrestore(&state
->card
->lock
, flags
);
495 /* adjust for buffer wrap around */
496 used_bytes
= (used_bytes
+ DMA_SIZE
) & (DMA_SIZE
- 1);
498 /* If at least one page unused */
499 if (used_bytes
< (DMA_SIZE
- 0x1000))
502 /* dma buffer full */
504 if (file
->f_flags
& O_NONBLOCK
) {
509 set_current_state(TASK_INTERRUPTIBLE
);
510 schedule_timeout(timeout
+ 1);
511 if (signal_pending(current
)) {
517 /* watch out for wrapping around static buffer */
518 spin_lock_irqsave(&state
->card
->lock
, flags
);
519 rem
= DMA_SIZE
- dmabuf
->wr_ptr
;
523 rem
= dmabuf
->wr_ptr
;
525 /* update dma pointers */
526 dmabuf
->wr_ptr
+= cnt
;
527 dmabuf
->wr_ptr
&= DMA_SIZE
- 1; /* wrap ptr if necessary */
528 spin_unlock_irqrestore(&state
->card
->lock
, flags
);
530 /* transfer unwrapped chunk */
531 if (copy_from_user(dmabuf
->rawbuf
+ rem
, buffer
, cnt
)) {
536 DBG("Writing 0x%lx bytes to +0x%lx\n", cnt
, rem
);
538 /* update counters */
543 /* we have something to play - go play it! */
544 ad1889_trigger_playback(dev
);
548 remove_wait_queue(&state
->dmabuf
.wait
, &wait
);
554 static unsigned int ad1889_poll(struct file
*file
, struct poll_table_struct
*wait
)
556 unsigned int mask
= 0;
558 ad1889_dev_t
*dev
= (ad1889_dev_t
*)file
->private_data
;
559 ad1889_state_t
*state
= NULL
;
560 struct dmabuf
*dmabuf
;
563 if (!(file
->f_mode
& (FMODE_READ
| FMODE_WRITE
)))
566 if (file
->f_mode
& FMODE_WRITE
) {
567 state
= &dev
->state
[AD_WAV_STATE
];
568 if (!state
) return 0;
569 dmabuf
= &state
->dmabuf
;
570 poll_wait(file
, &dmabuf
->wait
, wait
);
573 if (file
->f_mode
& FMODE_READ
) {
574 state
= &dev
->state
[AD_ADC_STATE
];
575 if (!state
) return 0;
576 dmabuf
= &state
->dmabuf
;
577 poll_wait(file
, &dmabuf
->wait
, wait
);
580 spin_lock_irqsave(&dev
->lock
, flags
);
581 ad1889_update_ptr(dev
, 0);
583 if (file
->f_mode
& FMODE_WRITE
) {
584 state
= &dev
->state
[WAV_STATE
];
585 dmabuf
= &state
->dmabuf
;
586 if (dmabuf
->mapped
) {
587 if (dmabuf
->count
>= (int)dmabuf
->fragsize
)
588 mask
|= POLLOUT
| POLLWRNORM
;
590 if ((int)dmabuf
->dmasize
>= dmabuf
->count
+
591 (int)dmabuf
->fragsize
)
592 mask
|= POLLOUT
| POLLWRNORM
;
596 if (file
->f_mode
& FMODE_READ
) {
597 state
= &dev
->state
[AD_ADC_STATE
];
598 dmabuf
= &state
->dmabuf
;
599 if (dmabuf
->count
>= (int)dmabuf
->fragsize
)
600 mask
|= POLLIN
| POLLRDNORM
;
602 spin_unlock_irqrestore(&dev
->lock
, flags
);
608 static int ad1889_mmap(struct file
*file
, struct vm_area_struct
*vma
)
613 static int ad1889_ioctl(struct inode
*inode
, struct file
*file
, unsigned int cmd
,
617 ad1889_dev_t
*dev
= (ad1889_dev_t
*)file
->private_data
;
618 struct dmabuf
*dmabuf
;
619 audio_buf_info abinfo
;
620 int __user
*p
= (int __user
*)arg
;
622 DBG("ad1889_ioctl cmd 0x%x arg %lu\n", cmd
, arg
);
627 return put_user(SOUND_VERSION
, p
);
629 case SNDCTL_DSP_RESET
:
632 case SNDCTL_DSP_SYNC
:
635 case SNDCTL_DSP_SPEED
:
636 /* set sampling rate */
637 if (get_user(val
, p
))
639 if (val
> 5400 && val
< 48000)
641 if (file
->f_mode
& FMODE_WRITE
)
642 AD1889_WRITEW(ad1889_dev
, AD_DSWAS
, val
);
643 if (file
->f_mode
& FMODE_READ
)
644 AD1889_WRITEW(ad1889_dev
, AD_DSRES
, val
);
648 case SNDCTL_DSP_STEREO
: /* undocumented? */
649 if (get_user(val
, p
))
651 if (file
->f_mode
& FMODE_READ
) {
652 val
= AD1889_READW(ad1889_dev
, AD_DSWSMC
);
654 val
|= 0x0200; /* set WAST */
656 val
&= ~0x0200; /* clear WAST */
658 AD1889_WRITEW(ad1889_dev
, AD_DSWSMC
, val
);
660 if (file
->f_mode
& FMODE_WRITE
) {
661 val
= AD1889_READW(ad1889_dev
, AD_DSRAMC
);
663 val
|= 0x0002; /* set ADST */
665 val
&= ~0x0002; /* clear ADST */
667 AD1889_WRITEW(ad1889_dev
, AD_DSRAMC
, val
);
672 case SNDCTL_DSP_GETBLKSIZE
:
673 return put_user(DMA_SIZE
, p
);
675 case SNDCTL_DSP_GETFMTS
:
676 return put_user(AFMT_S16_LE
|AFMT_U8
, p
);
678 case SNDCTL_DSP_SETFMT
:
679 if (get_user(val
, p
))
683 if (file
->f_mode
& FMODE_READ
)
684 ad1889_set_adc_fmt(dev
, val
);
686 if (file
->f_mode
& FMODE_WRITE
)
687 ad1889_set_wav_fmt(dev
, val
);
689 val
= AFMT_S16_LE
| AFMT_U8
;
692 return put_user(val
, p
);
694 case SNDCTL_DSP_CHANNELS
:
697 case SNDCTL_DSP_POST
:
698 /* send all data to device */
701 case SNDCTL_DSP_SUBDIVIDE
:
704 case SNDCTL_DSP_SETFRAGMENT
:
705 /* not supported; uses fixed fragment sizes */
706 return put_user(DMA_SIZE
, p
);
708 case SNDCTL_DSP_GETOSPACE
:
709 case SNDCTL_DSP_GETISPACE
:
710 /* space left in dma buffers */
711 if (cmd
== SNDCTL_DSP_GETOSPACE
)
712 dmabuf
= &dev
->state
[AD_WAV_STATE
].dmabuf
;
714 dmabuf
= &dev
->state
[AD_ADC_STATE
].dmabuf
;
715 abinfo
.fragments
= 1;
716 abinfo
.fragstotal
= 1;
717 abinfo
.fragsize
= DMA_SIZE
;
718 abinfo
.bytes
= DMA_SIZE
;
719 return copy_to_user(p
, &abinfo
, sizeof(abinfo
)) ? -EFAULT
: 0;
720 case SNDCTL_DSP_NONBLOCK
:
721 file
->f_flags
|= O_NONBLOCK
;
724 case SNDCTL_DSP_GETCAPS
:
725 return put_user(0, p
);
727 case SNDCTL_DSP_GETTRIGGER
:
728 case SNDCTL_DSP_SETTRIGGER
:
731 case SNDCTL_DSP_GETIPTR
:
732 case SNDCTL_DSP_GETOPTR
:
735 case SNDCTL_DSP_SETDUPLEX
:
738 case SNDCTL_DSP_GETODELAY
:
741 case SOUND_PCM_READ_RATE
:
742 return put_user(AD1889_READW(ad1889_dev
, AD_DSWAS
), p
);
744 case SOUND_PCM_READ_CHANNELS
:
745 case SOUND_PCM_READ_BITS
:
748 case SNDCTL_DSP_MAPINBUF
:
749 case SNDCTL_DSP_MAPOUTBUF
:
750 case SNDCTL_DSP_SETSYNCRO
:
751 case SOUND_PCM_WRITE_FILTER
:
752 case SOUND_PCM_READ_FILTER
:
762 static int ad1889_open(struct inode
*inode
, struct file
*file
)
764 /* check minor; only support /dev/dsp atm */
765 if (iminor(inode
) != 3)
768 file
->private_data
= ad1889_dev
;
770 ad1889_set_wav_rate(ad1889_dev
, 48000);
771 ad1889_set_wav_fmt(ad1889_dev
, AFMT_S16_LE
);
772 AD1889_WRITEW(ad1889_dev
, AD_DSWADA
, 0x0404); /* attenuation */
773 return nonseekable_open(inode
, file
);
776 static int ad1889_release(struct inode
*inode
, struct file
*file
)
778 /* if we have state free it here */
782 static struct file_operations ad1889_fops
= {
783 .owner
= THIS_MODULE
,
786 .write
= ad1889_write
,
788 .ioctl
= ad1889_ioctl
,
791 .release
= ad1889_release
,
794 /************************* /dev/mixer interfaces ************************ */
795 static int ad1889_mixer_open(struct inode
*inode
, struct file
*file
)
797 if (ad1889_dev
->ac97_codec
->dev_mixer
!= iminor(inode
))
800 file
->private_data
= ad1889_dev
->ac97_codec
;
804 static int ad1889_mixer_release(struct inode
*inode
, struct file
*file
)
809 static int ad1889_mixer_ioctl(struct inode
*inode
, struct file
*file
,
810 unsigned int cmd
, unsigned long arg
)
812 struct ac97_codec
*codec
= (struct ac97_codec
*)file
->private_data
;
813 return codec
->mixer_ioctl(codec
, cmd
, arg
);
816 static struct file_operations ad1889_mixer_fops
= {
817 .owner
= THIS_MODULE
,
819 .ioctl
= ad1889_mixer_ioctl
,
820 .open
= ad1889_mixer_open
,
821 .release
= ad1889_mixer_release
,
824 /************************* AC97 interfaces ****************************** */
825 static void ad1889_codec_write(struct ac97_codec
*ac97
, u8 reg
, u16 val
)
827 ad1889_dev_t
*dev
= ac97
->private_data
;
829 //DBG("Writing 0x%x to 0x%lx\n", val, dev->regbase + 0x100 + reg);
830 AD1889_WRITEW(dev
, 0x100 + reg
, val
);
833 static u16
ad1889_codec_read(struct ac97_codec
*ac97
, u8 reg
)
835 ad1889_dev_t
*dev
= ac97
->private_data
;
836 //DBG("Reading from 0x%lx\n", dev->regbase + 0x100 + reg);
837 return AD1889_READW(dev
, 0x100 + reg
);
840 static int ad1889_ac97_init(ad1889_dev_t
*dev
, int id
)
842 struct ac97_codec
*ac97
;
845 if ((ac97
= ac97_alloc_codec()) == NULL
)
848 ac97
->private_data
= dev
;
851 ac97
->codec_read
= ad1889_codec_read
;
852 ac97
->codec_write
= ad1889_codec_write
;
854 if (ac97_probe_codec(ac97
) == 0) {
855 printk(DEVNAME
": ac97_probe_codec failed\n");
859 eid
= ad1889_codec_read(ac97
, AC97_EXTENDED_ID
);
861 printk(KERN_WARNING DEVNAME
": no codec attached?\n");
865 dev
->ac97_features
= eid
;
867 if ((ac97
->dev_mixer
= register_sound_mixer(&ad1889_mixer_fops
, -1)) < 0) {
868 printk(KERN_ERR DEVNAME
": cannot register mixer\n");
872 dev
->ac97_codec
= ac97
;
876 ac97_release_codec(ac97
);
880 static int ad1889_aclink_reset(struct pci_dev
* pcidev
)
884 ad1889_dev_t
*dev
= pci_get_drvdata(pcidev
);
886 AD1889_WRITEW(dev
, AD_DSCCS
, 0x8000); /* turn on clock */
887 AD1889_READW(dev
, AD_DSCCS
);
891 stat
= AD1889_READW(dev
, AD_ACIC
);
892 stat
|= 0x0002; /* Reset Disable */
893 AD1889_WRITEW(dev
, AD_ACIC
, stat
);
894 (void) AD1889_READW(dev
, AD_ACIC
); /* flush posted write */
898 stat
= AD1889_READW(dev
, AD_ACIC
);
899 stat
|= 0x0001; /* Interface Enable */
900 AD1889_WRITEW(dev
, AD_ACIC
, stat
);
903 if (AD1889_READW(dev
, AD_ACIC
) & 0x8000) /* Ready */
910 printk(KERN_ERR
"ad1889_aclink_reset: codec is not ready [0x%x]\n",
911 AD1889_READW(dev
, AD_ACIC
));
915 /* TODO reset AC97 codec */
916 /* TODO set wave/adc pci ctrl status */
918 stat
= AD1889_READW(dev
, AD_ACIC
);
919 stat
|= 0x0004; /* Audio Stream Output Enable */
920 AD1889_WRITEW(dev
, AD_ACIC
, stat
);
924 /************************* PCI interfaces ****************************** */
925 /* PCI device table */
926 static struct pci_device_id ad1889_id_tbl
[] = {
927 { PCI_VENDOR_ID_ANALOG_DEVICES
, PCI_DEVICE_ID_AD1889JS
, PCI_ANY_ID
,
928 PCI_ANY_ID
, 0, 0, (unsigned long)DEVNAME
},
931 MODULE_DEVICE_TABLE(pci
, ad1889_id_tbl
);
933 static irqreturn_t
ad1889_interrupt(int irq
, void *dev_id
, struct pt_regs
*regs
)
936 ad1889_dev_t
*dev
= (ad1889_dev_t
*)dev_id
;
938 stat
= AD1889_READL(dev
, AD_DMADISR
);
941 AD1889_WRITEL(dev
, AD_DMADISR
, stat
);
943 if (stat
& 0x8) { /* WAVI */
944 DBG("WAV interrupt\n");
945 dev
->stats
.wav_intrs
++;
946 if (dev
->state
[AD_WAV_STATE
].dmabuf
.ready
) {
947 ad1889_stop_wav(&dev
->state
[AD_WAV_STATE
]); /* clean up */
948 ad1889_start_wav(&dev
->state
[AD_WAV_STATE
]); /* start new */
952 if ((stat
& 0x2) && dev
->state
[AD_ADC_STATE
].dmabuf
.ready
) { /* ADCI */
953 DBG("ADC interrupt\n");
954 dev
->stats
.adc_intrs
++;
961 static void ad1889_initcfg(ad1889_dev_t
*dev
)
966 /* make sure the interrupt bits are setup the way we want */
967 tmp32
= AD1889_READL(dev
, AD_DMAWAVCTRL
);
968 tmp32
&= ~0xff; /* flat dma, no sg, mask out the intr bits */
969 tmp32
|= 0x6; /* intr on count, loop */
970 AD1889_WRITEL(dev
, AD_DMAWAVCTRL
, tmp32
);
973 tmp16
= AD1889_READW(dev
, AD_DSWADA
);
975 AD1889_WRITEW(dev
, AD_DSWADA
, tmp16
);
978 static int __devinit
ad1889_probe(struct pci_dev
*pcidev
, const struct pci_device_id
*ent
)
983 struct proc_dir_entry
*proc_root
= NULL
;
985 if ((err
= pci_enable_device(pcidev
)) != 0) {
986 printk(KERN_ERR DEVNAME
": pci_enable_device failed\n");
990 pci_set_master(pcidev
);
991 if ((dev
= ad1889_alloc_dev(pcidev
)) == NULL
) {
992 printk(KERN_ERR DEVNAME
": cannot allocate memory for device\n");
995 pci_set_drvdata(pcidev
, dev
);
996 bar
= pci_resource_start(pcidev
, 0);
998 if (!(pci_resource_flags(pcidev
, 0) & IORESOURCE_MEM
)) {
999 printk(KERN_ERR DEVNAME
": memory region not assigned\n");
1003 if (pci_request_region(pcidev
, 0, DEVNAME
)) {
1004 printk(KERN_ERR DEVNAME
": unable to request memory region\n");
1008 dev
->regbase
= ioremap_nocache(bar
, AD_DSIOMEMSIZE
);
1009 if (!dev
->regbase
) {
1010 printk(KERN_ERR DEVNAME
": unable to remap iomem\n");
1014 if (request_irq(pcidev
->irq
, ad1889_interrupt
, SA_SHIRQ
, DEVNAME
, dev
) != 0) {
1015 printk(KERN_ERR DEVNAME
": unable to request interrupt\n");
1019 printk(KERN_INFO DEVNAME
": %s at %p IRQ %d\n",
1020 (char *)ent
->driver_data
, dev
->regbase
, pcidev
->irq
);
1022 if (ad1889_aclink_reset(pcidev
) != 0)
1025 /* register /dev/dsp */
1026 if ((dev
->dev_audio
= register_sound_dsp(&ad1889_fops
, -1)) < 0) {
1027 printk(KERN_ERR DEVNAME
": cannot register /dev/dsp\n");
1031 if ((err
= ad1889_ac97_init(dev
, 0)) != 0)
1035 if (((proc_root
= proc_mkdir("driver/ad1889", NULL
)) == NULL
) ||
1036 create_proc_read_entry("ac97", S_IFREG
|S_IRUGO
, proc_root
, ac97_read_proc
, dev
->ac97_codec
) == NULL
||
1037 create_proc_read_entry("info", S_IFREG
|S_IRUGO
, proc_root
, ad1889_read_proc
, dev
) == NULL
)
1040 ad1889_initcfg(dev
);
1042 //DBG(DEVNAME ": Driver initialization done!\n");
1049 unregister_sound_dsp(dev
->dev_audio
);
1051 free_irq(pcidev
->irq
, dev
);
1053 iounmap(dev
->regbase
);
1055 pci_release_region(pcidev
, 0);
1057 ad1889_free_dev(dev
);
1058 pci_set_drvdata(pcidev
, NULL
);
1063 static void __devexit
ad1889_remove(struct pci_dev
*pcidev
)
1065 ad1889_dev_t
*dev
= pci_get_drvdata(pcidev
);
1067 if (dev
== NULL
) return;
1069 unregister_sound_mixer(dev
->ac97_codec
->dev_mixer
);
1070 unregister_sound_dsp(dev
->dev_audio
);
1071 free_irq(pcidev
->irq
, dev
);
1072 iounmap(dev
->regbase
);
1073 pci_release_region(pcidev
, 0);
1075 /* any hw programming needed? */
1076 ad1889_free_dev(dev
);
1077 pci_set_drvdata(pcidev
, NULL
);
1080 MODULE_AUTHOR("Randolph Chung");
1081 MODULE_DESCRIPTION("Analog Devices AD1889 PCI Audio");
1082 MODULE_LICENSE("GPL");
1084 static struct pci_driver ad1889_driver
= {
1086 .id_table
= ad1889_id_tbl
,
1087 .probe
= ad1889_probe
,
1088 .remove
= __devexit_p(ad1889_remove
),
1091 static int __init
ad1889_init_module(void)
1093 return pci_module_init(&ad1889_driver
);
1096 static void ad1889_exit_module(void)
1098 pci_unregister_driver(&ad1889_driver
);
1102 module_init(ad1889_init_module
);
1103 module_exit(ad1889_exit_module
);