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>
41 #include <linux/mutex.h>
43 #include <asm/delay.h>
46 #include <asm/uaccess.h>
50 #define DBG(fmt, arg...) printk(fmt, ##arg)
51 #define DEVNAME "ad1889"
57 #define UNDERRUN(dev) (0)
59 #define AD1889_READW(dev,reg) readw(dev->regbase + reg)
60 #define AD1889_WRITEW(dev,reg,val) writew((val), dev->regbase + reg)
61 #define AD1889_READL(dev,reg) readl(dev->regbase + reg)
62 #define AD1889_WRITEL(dev,reg,val) writel((val), dev->regbase + reg)
65 /* #define WAIT_10MS() schedule_timeout(HZ/10) */
66 #define WAIT_10MS() do { int __i; for (__i = 0; __i < 100; __i++) udelay(1000); } while(0)
68 /* currently only support a single device */
69 static ad1889_dev_t *ad1889_dev = NULL;
71 /************************* helper routines ***************************** */
72 static inline void ad1889_set_wav_rate(ad1889_dev_t *dev, int rate)
74 struct ac97_codec *ac97_codec = dev->ac97_codec;
76 DBG("Setting WAV rate to %d\n", rate);
77 dev->state[AD_WAV_STATE].dmabuf.rate = rate;
78 AD1889_WRITEW(dev, AD_DSWAS, rate);
80 /* Cycle the DAC to enable the new rate */
81 ac97_codec->codec_write(dev->ac97_codec, AC97_POWER_CONTROL, 0x0200);
83 ac97_codec->codec_write(dev->ac97_codec, AC97_POWER_CONTROL, 0);
86 static inline void ad1889_set_wav_fmt(ad1889_dev_t *dev, int fmt)
90 DBG("Setting WAV format to 0x%x\n", fmt);
92 tmp = AD1889_READW(ad1889_dev, AD_DSWSMC);
93 if (fmt & AFMT_S16_LE) {
94 //tmp |= 0x0100; /* set WA16 */
95 tmp |= 0x0300; /* set WA16 stereo */
96 } else if (fmt & AFMT_U8) {
97 tmp &= ~0x0100; /* clear WA16 */
99 AD1889_WRITEW(ad1889_dev, AD_DSWSMC, tmp);
102 static inline void ad1889_set_adc_fmt(ad1889_dev_t *dev, int fmt)
106 DBG("Setting ADC format to 0x%x\n", fmt);
108 tmp = AD1889_READW(ad1889_dev, AD_DSRAMC);
109 if (fmt & AFMT_S16_LE) {
110 tmp |= 0x0100; /* set WA16 */
111 } else if (fmt & AFMT_U8) {
112 tmp &= ~0x0100; /* clear WA16 */
114 AD1889_WRITEW(ad1889_dev, AD_DSRAMC, tmp);
117 static void ad1889_start_wav(ad1889_state_t *state)
120 struct dmabuf *dmabuf = &state->dmabuf;
124 spin_lock_irqsave(&state->card->lock, flags);
126 if (dmabuf->dma_len) /* DMA already in flight */
130 cnt = dmabuf->wr_ptr - dmabuf->rd_ptr;
131 if (cnt == 0) /* done - don't need to do anything */
134 /* If the wr_ptr has wrapped, only map to the end */
136 cnt = DMA_SIZE - dmabuf->rd_ptr;
138 dmabuf->dma_handle = pci_map_single(ad1889_dev->pci,
139 dmabuf->rawbuf + dmabuf->rd_ptr,
140 cnt, PCI_DMA_TODEVICE);
141 dmabuf->dma_len = cnt;
144 DBG("Starting playback at 0x%p for %ld bytes\n", dmabuf->rawbuf +
145 dmabuf->rd_ptr, dmabuf->dma_len);
147 /* load up the current register set */
148 AD1889_WRITEL(ad1889_dev, AD_DMAWAVCC, cnt);
149 AD1889_WRITEL(ad1889_dev, AD_DMAWAVICC, cnt);
150 AD1889_WRITEL(ad1889_dev, AD_DMAWAVCA, dmabuf->dma_handle);
152 /* TODO: for now we load the base registers with the same thing */
153 AD1889_WRITEL(ad1889_dev, AD_DMAWAVBC, cnt);
154 AD1889_WRITEL(ad1889_dev, AD_DMAWAVIBC, cnt);
155 AD1889_WRITEL(ad1889_dev, AD_DMAWAVBA, dmabuf->dma_handle);
157 /* and we're off to the races... */
158 AD1889_WRITEL(ad1889_dev, AD_DMACHSS, 0x8);
159 tmp = AD1889_READW(ad1889_dev, AD_DSWSMC);
160 tmp |= 0x0400; /* set WAEN */
161 AD1889_WRITEW(ad1889_dev, AD_DSWSMC, tmp);
162 (void) AD1889_READW(ad1889_dev, AD_DSWSMC); /* flush posted PCI write */
164 dmabuf->enable |= DAC_RUNNING;
167 spin_unlock_irqrestore(&state->card->lock, flags);
171 static void ad1889_stop_wav(ad1889_state_t *state)
174 struct dmabuf *dmabuf = &state->dmabuf;
176 spin_lock_irqsave(&state->card->lock, flags);
178 if (dmabuf->enable & DAC_RUNNING) {
180 unsigned long cnt = dmabuf->dma_len;
182 tmp = AD1889_READW(ad1889_dev, AD_DSWSMC);
183 tmp &= ~0x0400; /* clear WAEN */
184 AD1889_WRITEW(ad1889_dev, AD_DSWSMC, tmp);
185 (void) AD1889_READW(ad1889_dev, AD_DSWSMC); /* flush posted PCI write */
186 pci_unmap_single(ad1889_dev->pci, dmabuf->dma_handle,
187 cnt, PCI_DMA_TODEVICE);
189 dmabuf->enable &= ~DAC_RUNNING;
191 /* update dma pointers */
192 dmabuf->rd_ptr += cnt;
193 dmabuf->rd_ptr &= (DMA_SIZE - 1);
195 dmabuf->dma_handle = 0;
199 wake_up(&dmabuf->wait);
202 spin_unlock_irqrestore(&state->card->lock, flags);
207 static void ad1889_startstop_adc(ad1889_state_t *state, int start)
212 spin_lock_irqsave(&state->card->lock, flags);
214 tmp = AD1889_READW(ad1889_dev, AD_DSRAMC);
216 state->dmabuf.enable |= ADC_RUNNING;
217 tmp |= 0x0004; /* set ADEN */
219 state->dmabuf.enable &= ~ADC_RUNNING;
220 tmp &= ~0x0004; /* clear ADEN */
222 AD1889_WRITEW(ad1889_dev, AD_DSRAMC, tmp);
224 spin_unlock_irqrestore(&state->card->lock, flags);
228 static ad1889_dev_t *ad1889_alloc_dev(struct pci_dev *pci)
231 struct dmabuf *dmabuf;
234 if ((dev = kmalloc(sizeof(ad1889_dev_t), GFP_KERNEL)) == NULL)
236 memset(dev, 0, sizeof(ad1889_dev_t));
237 spin_lock_init(&dev->lock);
240 for (i = 0; i < AD_MAX_STATES; i++) {
241 dev->state[i].card = dev;
242 mutex_init(&dev->state[i].mutex);
243 init_waitqueue_head(&dev->state[i].dmabuf.wait);
246 /* allocate dma buffer */
248 for (i = 0; i < AD_MAX_STATES; i++) {
249 dmabuf = &dev->state[i].dmabuf;
250 dmabuf->rawbuf = kmalloc(DMA_SIZE, GFP_KERNEL|GFP_DMA);
252 goto err_free_dmabuf;
253 dmabuf->rawbuf_size = DMA_SIZE;
254 dmabuf->dma_handle = 0;
255 dmabuf->rd_ptr = dmabuf->wr_ptr = dmabuf->dma_len = 0UL;
257 dmabuf->rate = 48000;
263 kfree(dev->state[i].dmabuf.rawbuf);
268 static void ad1889_free_dev(ad1889_dev_t *dev)
271 struct dmabuf *dmabuf;
277 ac97_release_codec(dev->ac97_codec);
279 for (j = 0; j < AD_MAX_STATES; j++) {
280 dmabuf = &dev->state[j].dmabuf;
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);
465 mutex_lock(&state->mutex);
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);
550 mutex_unlock(&state->mutex);
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_register_driver(&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);