/***********************************************************************
 * Copyright 2001 MontaVista Software Inc.
 * Author: Jun Sun, jsun@mvista.com or jsun@junsun.net
 *
 * drivers/sound/nec_vrc5477.c
 *     AC97 sound dirver for NEC Vrc5477 chip (an integrated, 
 *     multi-function controller chip for MIPS CPUs)
 *
 * VRA support Copyright 2001 Bradley D. LaRonde <brad@ltc.com>
 *
 * This program is free software; you can redistribute  it and/or modify it
 * under  the terms of  the GNU General  Public License as published by the
 * Free Software Foundation;  either version 2 of the  License, or (at your
 * option) any later version.
 ***********************************************************************
 */

/*
 * This code is derived from ite8172.c, which is written by Steve Longerbeam.
 *
 * Features:
 *   Currently we only support the following capabilities:
 *	. mono output to PCM L/R (line out).
 *	. stereo output to PCM L/R (line out).
 *	. mono input from PCM L (line in).
 *	. stereo output from PCM (line in).
 *	. sampling rate at 48k or variable sampling rate 
 *	. support /dev/dsp, /dev/mixer devices, standard OSS devices.
 *	. only support 16-bit PCM format (hardware limit, no software
 *	  translation) 
 *	. support duplex, but no trigger or realtime.
 *	
 *   Specifically the following are not supported:
 *	. app-set frag size.
 *	. mmap'ed buffer access
 */

/* 
 * Original comments from ite8172.c file.
 */

/*
 *
 * Notes:
 *
 *  1. Much of the OSS buffer allocation, ioctl's, and mmap'ing are
 *     taken, slightly modified or not at all, from the ES1371 driver,
 *     so refer to the credits in es1371.c for those. The rest of the
 *     code (probe, open, read, write, the ISR, etc.) is new.
 *  2. The following support is untested:
 *      * Memory mapping the audio buffers, and the ioctl controls that go
 *        with it.
 *      * S/PDIF output.
 *  3. The following is not supported:
 *      * I2S input.
 *      * legacy audio mode.
 *  4. Support for volume button interrupts is implemented but doesn't
 *     work yet.
 *
 *  Revision history
 *    02.08.2001  0.1   Initial release
 */

#include <linux/module.h>
#include <linux/string.h>
#include <linux/kernel.h>
#include <linux/ioport.h>
#include <linux/sched.h>
#include <linux/delay.h>
#include <linux/sound.h>
#include <linux/slab.h>
#include <linux/soundcard.h>
#include <linux/pci.h>
#include <linux/init.h>
#include <linux/poll.h>
#include <linux/bitops.h>
#include <linux/proc_fs.h>
#include <linux/spinlock.h>
#include <linux/smp_lock.h>
#include <linux/ac97_codec.h>
#include <linux/mutex.h>

#include <asm/io.h>
#include <asm/dma.h>
#include <asm/uaccess.h>

/* -------------------debug macros -------------------------------------- */
/* #undef VRC5477_AC97_DEBUG */
#define VRC5477_AC97_DEBUG

#undef VRC5477_AC97_VERBOSE_DEBUG
/* #define VRC5477_AC97_VERBOSE_DEBUG */

#if defined(VRC5477_AC97_VERBOSE_DEBUG)
#define VRC5477_AC97_DEBUG
#endif

#if defined(VRC5477_AC97_DEBUG)
#define ASSERT(x)  if (!(x)) { \
	panic("assertion failed at %s:%d: %s\n", __FILE__, __LINE__, #x); }
#else
#define	ASSERT(x)
#endif /* VRC5477_AC97_DEBUG */

#if defined(VRC5477_AC97_VERBOSE_DEBUG)
static u16 inTicket; 		/* check sync between intr & write */
static u16 outTicket;
#endif

/* --------------------------------------------------------------------- */

#undef OSS_DOCUMENTED_MIXER_SEMANTICS

static const unsigned sample_shift[] = { 0, 1, 1, 2 };

#define         VRC5477_INT_CLR         0x0
#define         VRC5477_INT_STATUS	0x0
#define         VRC5477_CODEC_WR        0x4
#define         VRC5477_CODEC_RD        0x8
#define         VRC5477_CTRL            0x18
#define         VRC5477_ACLINK_CTRL     0x1c
#define         VRC5477_INT_MASK        0x24

#define		VRC5477_DAC1_CTRL	0x30
#define		VRC5477_DAC1L		0x34
#define		VRC5477_DAC1_BADDR	0x38
#define		VRC5477_DAC2_CTRL	0x3c
#define		VRC5477_DAC2L		0x40
#define		VRC5477_DAC2_BADDR	0x44
#define		VRC5477_DAC3_CTRL	0x48
#define		VRC5477_DAC3L		0x4c
#define		VRC5477_DAC3_BADDR	0x50

#define		VRC5477_ADC1_CTRL	0x54
#define		VRC5477_ADC1L		0x58
#define		VRC5477_ADC1_BADDR	0x5c
#define		VRC5477_ADC2_CTRL	0x60
#define		VRC5477_ADC2L		0x64
#define		VRC5477_ADC2_BADDR	0x68
#define		VRC5477_ADC3_CTRL	0x6c
#define		VRC5477_ADC3L		0x70
#define		VRC5477_ADC3_BADDR	0x74

#define		VRC5477_CODEC_WR_RWC	(1 << 23)

#define		VRC5477_CODEC_RD_RRDYA	(1 << 31)
#define		VRC5477_CODEC_RD_RRDYD	(1 << 30)

#define		VRC5477_ACLINK_CTRL_RST_ON	(1 << 15)
#define		VRC5477_ACLINK_CTRL_RST_TIME	0x7f
#define		VRC5477_ACLINK_CTRL_SYNC_ON	(1 << 30)
#define		VRC5477_ACLINK_CTRL_CK_STOP_ON	(1 << 31)

#define		VRC5477_CTRL_DAC2ENB		(1 << 15) 
#define		VRC5477_CTRL_ADC2ENB		(1 << 14) 
#define		VRC5477_CTRL_DAC1ENB		(1 << 13) 
#define		VRC5477_CTRL_ADC1ENB		(1 << 12) 

#define		VRC5477_INT_MASK_NMASK		(1 << 31) 
#define		VRC5477_INT_MASK_DAC1END	(1 << 5) 
#define		VRC5477_INT_MASK_DAC2END	(1 << 4) 
#define		VRC5477_INT_MASK_DAC3END	(1 << 3) 
#define		VRC5477_INT_MASK_ADC1END	(1 << 2) 
#define		VRC5477_INT_MASK_ADC2END	(1 << 1) 
#define		VRC5477_INT_MASK_ADC3END	(1 << 0) 

#define		VRC5477_DMA_ACTIVATION		(1 << 31)
#define		VRC5477_DMA_WIP			(1 << 30)


#define VRC5477_AC97_MODULE_NAME "NEC_Vrc5477_audio"
#define PFX VRC5477_AC97_MODULE_NAME ": "

/* --------------------------------------------------------------------- */

struct vrc5477_ac97_state {
	/* list of vrc5477_ac97 devices */
	struct list_head devs;

	/* the corresponding pci_dev structure */
	struct pci_dev *dev;

	/* soundcore stuff */
	int dev_audio;

	/* hardware resources */
	unsigned long io;
	unsigned int irq;

#ifdef VRC5477_AC97_DEBUG
	/* debug /proc entry */
	struct proc_dir_entry *ps;
	struct proc_dir_entry *ac97_ps;
#endif /* VRC5477_AC97_DEBUG */

	struct ac97_codec *codec;

	unsigned dacChannels, adcChannels;
	unsigned short dacRate, adcRate;
	unsigned short extended_status;

	spinlock_t lock;
	struct mutex open_mutex;
	mode_t open_mode;
	wait_queue_head_t open_wait;

	struct dmabuf {
		void *lbuf, *rbuf;
		dma_addr_t lbufDma, rbufDma;
		unsigned bufOrder;
		unsigned numFrag;
		unsigned fragShift;
		unsigned fragSize;	/* redundant */
		unsigned fragTotalSize;	/* = numFrag * fragSize(real)  */
		unsigned nextIn;
		unsigned nextOut;
		int count;
		unsigned error; /* over/underrun */
		wait_queue_head_t wait;
		/* OSS stuff */
		unsigned stopped:1;
		unsigned ready:1;
	} dma_dac, dma_adc;

	#define	WORK_BUF_SIZE	2048
	struct {
		u16 lchannel;
		u16 rchannel;
	} workBuf[WORK_BUF_SIZE/4];
};

/* --------------------------------------------------------------------- */

static LIST_HEAD(devs);

/* --------------------------------------------------------------------- */

static inline unsigned ld2(unsigned int x)
{
    unsigned r = 0;
	
    if (x >= 0x10000) {
	x >>= 16;
	r += 16;
    }
    if (x >= 0x100) {
	x >>= 8;
	r += 8;
    }
    if (x >= 0x10) {
	x >>= 4;
	r += 4;
    }
    if (x >= 4) {
	x >>= 2;
	r += 2;
    }
    if (x >= 2)
	r++;
    return r;
}

/* --------------------------------------------------------------------- */

static u16 rdcodec(struct ac97_codec *codec, u8 addr)
{
	struct vrc5477_ac97_state *s = 
		(struct vrc5477_ac97_state *)codec->private_data;
	unsigned long flags;
	u32 result;

	spin_lock_irqsave(&s->lock, flags);

	/* wait until we can access codec registers */
	while (inl(s->io + VRC5477_CODEC_WR) & 0x80000000);

	/* write the address and "read" command to codec */
	addr = addr & 0x7f;
	outl((addr << 16) | VRC5477_CODEC_WR_RWC, s->io + VRC5477_CODEC_WR);

	/* get the return result */
	udelay(100); /* workaround hardware bug */
	while ( (result = inl(s->io + VRC5477_CODEC_RD)) & 
                (VRC5477_CODEC_RD_RRDYA | VRC5477_CODEC_RD_RRDYD) ) {
		/* we get either addr or data, or both */
		if (result & VRC5477_CODEC_RD_RRDYA) {
			ASSERT(addr == ((result >> 16) & 0x7f) );
		}
		if (result & VRC5477_CODEC_RD_RRDYD) {
			break;
		}
	}

	spin_unlock_irqrestore(&s->lock, flags);

	return result & 0xffff;
}


static void wrcodec(struct ac97_codec *codec, u8 addr, u16 data)
{
	struct vrc5477_ac97_state *s = 
		(struct vrc5477_ac97_state *)codec->private_data;
	unsigned long flags;

	spin_lock_irqsave(&s->lock, flags);

	/* wait until we can access codec registers */
	while (inl(s->io + VRC5477_CODEC_WR) & 0x80000000);

	/* write the address and value to codec */
	outl((addr << 16) | data, s->io + VRC5477_CODEC_WR);

	spin_unlock_irqrestore(&s->lock, flags);
}


static void waitcodec(struct ac97_codec *codec)
{
	struct vrc5477_ac97_state *s = 
		(struct vrc5477_ac97_state *)codec->private_data;

	/* wait until we can access codec registers */
	while (inl(s->io + VRC5477_CODEC_WR) & 0x80000000);
}

static int ac97_codec_not_present(struct ac97_codec *codec)
{
	struct vrc5477_ac97_state *s = 
		(struct vrc5477_ac97_state *)codec->private_data;
	unsigned long flags;
	unsigned short count  = 0xffff; 

	spin_lock_irqsave(&s->lock, flags);

	/* wait until we can access codec registers */
	do {
	       if (!(inl(s->io + VRC5477_CODEC_WR) & 0x80000000))
		       break;
	} while (--count);

	if (count == 0) {
		spin_unlock_irqrestore(&s->lock, flags);
		return -1;
	}

	/* write 0 to reset */
	outl((AC97_RESET << 16) | 0, s->io + VRC5477_CODEC_WR);

	/* test whether we get a response from ac97 chip */
	count  = 0xffff; 
	do { 
	       if (!(inl(s->io + VRC5477_CODEC_WR) & 0x80000000))
		       break;
	} while (--count);

	if (count == 0) {
		spin_unlock_irqrestore(&s->lock, flags);
		return -1;
	}
	spin_unlock_irqrestore(&s->lock, flags);
	return 0;
}

/* --------------------------------------------------------------------- */

static void vrc5477_ac97_delay(int msec)
{
	unsigned long tmo;
	signed long tmo2;

	if (in_interrupt())
		return;
    
	tmo = jiffies + (msec*HZ)/1000;
	for (;;) {
		tmo2 = tmo - jiffies;
		if (tmo2 <= 0)
			break;
		schedule_timeout(tmo2);
	}
}


static void set_adc_rate(struct vrc5477_ac97_state *s, unsigned rate)
{
	wrcodec(s->codec, AC97_PCM_LR_ADC_RATE, rate);
	s->adcRate = rate;
}


static void set_dac_rate(struct vrc5477_ac97_state *s, unsigned rate)
{
	if(s->extended_status & AC97_EXTSTAT_VRA) {
	wrcodec(s->codec, AC97_PCM_FRONT_DAC_RATE, rate);
		s->dacRate = rdcodec(s->codec, AC97_PCM_FRONT_DAC_RATE);
	}
}

static int ac97_codec_not_present(struct ac97_codec *codec)
{
	struct vrc5477_ac97_state *s =
		(struct vrc5477_ac97_state *)codec->private_data;
	unsigned long flags;
	unsigned short count  = 0xffff;

	spin_lock_irqsave(&s->lock, flags);

	/* wait until we can access codec registers */
	do {
	       if (!(inl(s->io + VRC5477_CODEC_WR) & 0x80000000))
		       break;
	} while (--count);

	if (count == 0) {
		spin_unlock_irqrestore(&s->lock, flags);
		return -1;
	}

	/* write 0 to reset */
	outl((AC97_RESET << 16) | 0, s->io + VRC5477_CODEC_WR);

	/* test whether we get a response from ac97 chip */
	count  = 0xffff;
	do {
	       if (!(inl(s->io + VRC5477_CODEC_WR) & 0x80000000))
		       break;
	} while (--count);

	if (count == 0) {
		spin_unlock_irqrestore(&s->lock, flags);
		return -1;
	}
	spin_unlock_irqrestore(&s->lock, flags);
	return 0;
}

/* --------------------------------------------------------------------- */

static inline void
stop_dac(struct vrc5477_ac97_state *s)
{
	struct dmabuf* db = &s->dma_dac;
	unsigned long flags;
	u32 temp;
    
	spin_lock_irqsave(&s->lock, flags);

	if (db->stopped) {
		spin_unlock_irqrestore(&s->lock, flags);
		return;
	}

	/* deactivate the dma */
	outl(0, s->io + VRC5477_DAC1_CTRL);
	outl(0, s->io + VRC5477_DAC2_CTRL);

	/* wait for DAM completely stop */
	while (inl(s->io + VRC5477_DAC1_CTRL) & VRC5477_DMA_WIP);
	while (inl(s->io + VRC5477_DAC2_CTRL) & VRC5477_DMA_WIP);

	/* disable dac slots in aclink */
	temp = inl(s->io + VRC5477_CTRL);
	temp &= ~ (VRC5477_CTRL_DAC1ENB | VRC5477_CTRL_DAC2ENB);
	outl (temp, s->io + VRC5477_CTRL);

	/* disable interrupts */
	temp = inl(s->io + VRC5477_INT_MASK);
	temp &= ~ (VRC5477_INT_MASK_DAC1END | VRC5477_INT_MASK_DAC2END); 
	outl (temp, s->io + VRC5477_INT_MASK);

	/* clear pending ones */
	outl(VRC5477_INT_MASK_DAC1END | VRC5477_INT_MASK_DAC2END, 
	     s->io +  VRC5477_INT_CLR);
    
	db->stopped = 1;
    
	spin_unlock_irqrestore(&s->lock, flags);
}	

static void start_dac(struct vrc5477_ac97_state *s)
{
	struct dmabuf* db = &s->dma_dac;
	unsigned long flags;
	u32 dmaLength;
	u32 temp;

	spin_lock_irqsave(&s->lock, flags);

	if (!db->stopped) {
		spin_unlock_irqrestore(&s->lock, flags);
		return;
	}

	/* we should have some data to do the DMA trasnfer */
	ASSERT(db->count >= db->fragSize);

	/* clear pending fales interrupts */
	outl(VRC5477_INT_MASK_DAC1END | VRC5477_INT_MASK_DAC2END, 
	     s->io +  VRC5477_INT_CLR);

	/* enable interrupts */
	temp = inl(s->io + VRC5477_INT_MASK);
	temp |= VRC5477_INT_MASK_DAC1END | VRC5477_INT_MASK_DAC2END;
	outl(temp, s->io +  VRC5477_INT_MASK);

	/* setup dma base addr */
	outl(db->lbufDma + db->nextOut, s->io + VRC5477_DAC1_BADDR);
	if (s->dacChannels == 1) {
		outl(db->lbufDma + db->nextOut, s->io + VRC5477_DAC2_BADDR);
	} else {
		outl(db->rbufDma + db->nextOut, s->io + VRC5477_DAC2_BADDR);
	}

	/* set dma length, in the unit of 0x10 bytes */
	dmaLength = db->fragSize >> 4;
	outl(dmaLength, s->io + VRC5477_DAC1L);
	outl(dmaLength, s->io + VRC5477_DAC2L);

	/* activate dma */
	outl(VRC5477_DMA_ACTIVATION, s->io + VRC5477_DAC1_CTRL);
	outl(VRC5477_DMA_ACTIVATION, s->io + VRC5477_DAC2_CTRL);

	/* enable dac slots - we should hear the music now! */
	temp = inl(s->io + VRC5477_CTRL);
	temp |= (VRC5477_CTRL_DAC1ENB | VRC5477_CTRL_DAC2ENB);
	outl (temp, s->io + VRC5477_CTRL);

	/* it is time to setup next dma transfer */
	ASSERT(inl(s->io + VRC5477_DAC1_CTRL) & VRC5477_DMA_WIP);
	ASSERT(inl(s->io + VRC5477_DAC2_CTRL) & VRC5477_DMA_WIP);

	temp = db->nextOut + db->fragSize;
	if (temp >= db->fragTotalSize) {
		ASSERT(temp == db->fragTotalSize);
		temp = 0;
	}

	outl(db->lbufDma + temp, s->io + VRC5477_DAC1_BADDR);
	if (s->dacChannels == 1) {
		outl(db->lbufDma + temp, s->io + VRC5477_DAC2_BADDR);
	} else {
		outl(db->rbufDma + temp, s->io + VRC5477_DAC2_BADDR);
	}

	db->stopped = 0;

#if defined(VRC5477_AC97_VERBOSE_DEBUG)
	outTicket = *(u16*)(db->lbuf+db->nextOut);
	if (db->count > db->fragSize) {
		ASSERT((u16)(outTicket+1) == *(u16*)(db->lbuf+temp));
	}
#endif

	spin_unlock_irqrestore(&s->lock, flags);
}	

static inline void stop_adc(struct vrc5477_ac97_state *s)
{
	struct dmabuf* db = &s->dma_adc;
	unsigned long flags;
	u32 temp;
    
	spin_lock_irqsave(&s->lock, flags);

	if (db->stopped) {
		spin_unlock_irqrestore(&s->lock, flags);
		return;
	}

	/* deactivate the dma */
	outl(0, s->io + VRC5477_ADC1_CTRL);
	outl(0, s->io + VRC5477_ADC2_CTRL);

	/* disable adc slots in aclink */
	temp = inl(s->io + VRC5477_CTRL);
	temp &= ~ (VRC5477_CTRL_ADC1ENB | VRC5477_CTRL_ADC2ENB);
	outl (temp, s->io + VRC5477_CTRL);

	/* disable interrupts */
        temp = inl(s->io + VRC5477_INT_MASK);
        temp &= ~ (VRC5477_INT_MASK_ADC1END | VRC5477_INT_MASK_ADC2END); 
        outl (temp, s->io + VRC5477_INT_MASK);

	/* clear pending ones */
	outl(VRC5477_INT_MASK_ADC1END | VRC5477_INT_MASK_ADC2END, 
	     s->io +  VRC5477_INT_CLR);
    
	db->stopped = 1;

	spin_unlock_irqrestore(&s->lock, flags);
}	

static void start_adc(struct vrc5477_ac97_state *s)
{
	struct dmabuf* db = &s->dma_adc;
	unsigned long flags;
	u32 dmaLength;
	u32 temp;

	spin_lock_irqsave(&s->lock, flags);

	if (!db->stopped) {
		spin_unlock_irqrestore(&s->lock, flags);
		return;
	}

	/* we should at least have some free space in the buffer */
	ASSERT(db->count < db->fragTotalSize - db->fragSize * 2);

	/* clear pending ones */
	outl(VRC5477_INT_MASK_ADC1END | VRC5477_INT_MASK_ADC2END, 
	     s->io +  VRC5477_INT_CLR);

        /* enable interrupts */
        temp = inl(s->io + VRC5477_INT_MASK);
        temp |= VRC5477_INT_MASK_ADC1END | VRC5477_INT_MASK_ADC2END;
        outl(temp, s->io +  VRC5477_INT_MASK);

	/* setup dma base addr */
	outl(db->lbufDma + db->nextIn, s->io + VRC5477_ADC1_BADDR);
	outl(db->rbufDma + db->nextIn, s->io + VRC5477_ADC2_BADDR);

	/* setup dma length */
	dmaLength = db->fragSize >> 4;
	outl(dmaLength, s->io + VRC5477_ADC1L);
	outl(dmaLength, s->io + VRC5477_ADC2L);

	/* activate dma */
	outl(VRC5477_DMA_ACTIVATION, s->io + VRC5477_ADC1_CTRL);
	outl(VRC5477_DMA_ACTIVATION, s->io + VRC5477_ADC2_CTRL);

	/* enable adc slots */
	temp = inl(s->io + VRC5477_CTRL);
	temp |= (VRC5477_CTRL_ADC1ENB | VRC5477_CTRL_ADC2ENB);
	outl (temp, s->io + VRC5477_CTRL);

	/* it is time to setup next dma transfer */
	temp = db->nextIn + db->fragSize;
	if (temp >= db->fragTotalSize) {
		ASSERT(temp == db->fragTotalSize);
		temp = 0;
	}
	outl(db->lbufDma + temp, s->io + VRC5477_ADC1_BADDR);
	outl(db->rbufDma + temp, s->io + VRC5477_ADC2_BADDR);

	db->stopped = 0;

	spin_unlock_irqrestore(&s->lock, flags);
}	

/* --------------------------------------------------------------------- */

#define DMABUF_DEFAULTORDER (16-PAGE_SHIFT)
#define DMABUF_MINORDER 1

static inline void dealloc_dmabuf(struct vrc5477_ac97_state *s,
				  struct dmabuf *db)
{
	if (db->lbuf) {
		ASSERT(db->rbuf);
		pci_free_consistent(s->dev, PAGE_SIZE << db->bufOrder,
				    db->lbuf, db->lbufDma);
		pci_free_consistent(s->dev, PAGE_SIZE << db->bufOrder,
				    db->rbuf, db->rbufDma);
		db->lbuf = db->rbuf = NULL;
	}
	db->nextIn = db->nextOut = 0;
	db->ready = 0;
}

static int prog_dmabuf(struct vrc5477_ac97_state *s, 
		       struct dmabuf *db,
		       unsigned rate)
{
	int order;
	unsigned bufsize;

	if (!db->lbuf) {
		ASSERT(!db->rbuf);

		db->ready = 0;
		for (order = DMABUF_DEFAULTORDER; 
		     order >= DMABUF_MINORDER; 
		     order--) {
			db->lbuf = pci_alloc_consistent(s->dev,
							PAGE_SIZE << order,
							&db->lbufDma);
			db->rbuf = pci_alloc_consistent(s->dev,
							PAGE_SIZE << order,
							&db->rbufDma);
			if (db->lbuf && db->rbuf) break;
			if (db->lbuf) {
			    ASSERT(!db->rbuf);
			    pci_free_consistent(s->dev, 
						PAGE_SIZE << order,
						db->lbuf,
						db->lbufDma);
			}
		}
		if (!db->lbuf) {
			ASSERT(!db->rbuf);
			return -ENOMEM;
		}

		db->bufOrder = order;
	}

	db->count = 0;
	db->nextIn = db->nextOut = 0;
    
	bufsize = PAGE_SIZE << db->bufOrder;
	db->fragShift = ld2(rate * 2 / 100);
	if (db->fragShift < 4) db->fragShift = 4;

	db->numFrag = bufsize >> db->fragShift;
	while (db->numFrag < 4 && db->fragShift > 4) {
		db->fragShift--;
		db->numFrag = bufsize >> db->fragShift;
	}
	db->fragSize = 1 << db->fragShift;
	db->fragTotalSize = db->numFrag << db->fragShift;
	memset(db->lbuf, 0, db->fragTotalSize);
	memset(db->rbuf, 0, db->fragTotalSize);
    
	db->ready = 1;

	return 0;
}

static inline int prog_dmabuf_adc(struct vrc5477_ac97_state *s)
{
    stop_adc(s);
    return prog_dmabuf(s, &s->dma_adc, s->adcRate);
}

static inline int prog_dmabuf_dac(struct vrc5477_ac97_state *s)
{
    stop_dac(s);
    return prog_dmabuf(s, &s->dma_dac, s->dacRate);
}


/* --------------------------------------------------------------------- */
/* hold spinlock for the following! */

static inline void vrc5477_ac97_adc_interrupt(struct vrc5477_ac97_state *s)
{
	struct dmabuf* adc = &s->dma_adc;
	unsigned temp;

	/* we need two frags avaiable because one is already being used
	 * and the other will be used when next interrupt happens.
	 */
	if (adc->count >= adc->fragTotalSize - adc->fragSize) {
		stop_adc(s);
		adc->error++;
		printk(KERN_INFO PFX "adc overrun\n");
		return;
	}

	/* set the base addr for next DMA transfer */
	temp = adc->nextIn + 2*adc->fragSize;
	if (temp >= adc->fragTotalSize) {
		ASSERT( (temp == adc->fragTotalSize) ||
                             (temp == adc->fragTotalSize + adc->fragSize) );
		temp -= adc->fragTotalSize;
	}
	outl(adc->lbufDma + temp, s->io + VRC5477_ADC1_BADDR);
	outl(adc->rbufDma + temp, s->io + VRC5477_ADC2_BADDR);

	/* adjust nextIn */
	adc->nextIn += adc->fragSize;
	if (adc->nextIn >= adc->fragTotalSize) {
		ASSERT(adc->nextIn == adc->fragTotalSize);
		adc->nextIn = 0;
	}

	/* adjust count */
	adc->count += adc->fragSize;

	/* wake up anybody listening */
	if (waitqueue_active(&adc->wait)) {
		wake_up_interruptible(&adc->wait);
	}	
}

static inline void vrc5477_ac97_dac_interrupt(struct vrc5477_ac97_state *s)
{
	struct dmabuf* dac = &s->dma_dac;
	unsigned temp;

	/* next DMA transfer should already started */
	// ASSERT(inl(s->io + VRC5477_DAC1_CTRL) & VRC5477_DMA_WIP);
	// ASSERT(inl(s->io + VRC5477_DAC2_CTRL) & VRC5477_DMA_WIP);

	/* let us set for next next DMA transfer */
	temp = dac->nextOut + dac->fragSize*2;
	if (temp >= dac->fragTotalSize) {
		ASSERT( (temp == dac->fragTotalSize) || 
                             (temp == dac->fragTotalSize + dac->fragSize) );
		temp -= dac->fragTotalSize;
	}
	outl(dac->lbufDma + temp, s->io + VRC5477_DAC1_BADDR);
	if (s->dacChannels == 1) {
		outl(dac->lbufDma + temp, s->io + VRC5477_DAC2_BADDR);
	} else {
		outl(dac->rbufDma + temp, s->io + VRC5477_DAC2_BADDR);
	}

#if defined(VRC5477_AC97_VERBOSE_DEBUG)
	if (*(u16*)(dac->lbuf +  dac->nextOut) != outTicket) {
		printk("assert fail: - %d vs %d\n", 
		        *(u16*)(dac->lbuf +  dac->nextOut),
                        outTicket);
                ASSERT(1 == 0);
	}
#endif

	/* adjust nextOut pointer */
	dac->nextOut += dac->fragSize;
	if (dac->nextOut >= dac->fragTotalSize) {
		ASSERT(dac->nextOut == dac->fragTotalSize);
		dac->nextOut = 0;
	}

	/* adjust count */
	dac->count -= dac->fragSize;
	if (dac->count <=0 ) {
		/* buffer under run */
		dac->count = 0;
		dac->nextIn = dac->nextOut;
		stop_dac(s);
	}

#if defined(VRC5477_AC97_VERBOSE_DEBUG)
	if (dac->count) {
		outTicket ++;
		ASSERT(*(u16*)(dac->lbuf +  dac->nextOut) == outTicket);
	}
#endif
	
	/* we cannot have both under run and someone is waiting on us */
	ASSERT(! (waitqueue_active(&dac->wait) && (dac->count <= 0)) );

	/* wake up anybody listening */
	if (waitqueue_active(&dac->wait))
		wake_up_interruptible(&dac->wait);
}

static irqreturn_t vrc5477_ac97_interrupt(int irq, void *dev_id)
{
	struct vrc5477_ac97_state *s = (struct vrc5477_ac97_state *)dev_id;
	u32 irqStatus;
	u32 adcInterrupts, dacInterrupts;

	spin_lock(&s->lock);

	/* get irqStatus and clear the detected ones */
	irqStatus = inl(s->io + VRC5477_INT_STATUS);
	outl(irqStatus, s->io + VRC5477_INT_CLR);

	/* let us see what we get */
	dacInterrupts = VRC5477_INT_MASK_DAC1END | VRC5477_INT_MASK_DAC2END;
	adcInterrupts = VRC5477_INT_MASK_ADC1END | VRC5477_INT_MASK_ADC2END;
	if (irqStatus & dacInterrupts) {
		/* we should get both interrupts, but just in case ...  */
		if (irqStatus & VRC5477_INT_MASK_DAC1END) {
			vrc5477_ac97_dac_interrupt(s);
		}
		if ( (irqStatus & dacInterrupts) != dacInterrupts ) {
			printk(KERN_WARNING "vrc5477_ac97 : dac interrupts not in sync!!!\n");
			stop_dac(s);
			start_dac(s);
		}
	} else if (irqStatus & adcInterrupts) {
		/* we should get both interrupts, but just in case ...  */
		if(irqStatus & VRC5477_INT_MASK_ADC1END) {
			vrc5477_ac97_adc_interrupt(s);
		} 
		if ( (irqStatus & adcInterrupts) != adcInterrupts ) {
			printk(KERN_WARNING "vrc5477_ac97 : adc interrupts not in sync!!!\n");
			stop_adc(s);
			start_adc(s);
		}
	}

	spin_unlock(&s->lock);
	return IRQ_HANDLED;
}

/* --------------------------------------------------------------------- */

static int vrc5477_ac97_open_mixdev(struct inode *inode, struct file *file)
{
	int minor = iminor(inode);
	struct list_head *list;
	struct vrc5477_ac97_state *s;

	for (list = devs.next; ; list = list->next) {
		if (list == &devs)
			return -ENODEV;
		s = list_entry(list, struct vrc5477_ac97_state, devs);
		if (s->codec->dev_mixer == minor)
			break;
	}
	file->private_data = s;
	return nonseekable_open(inode, file);
}

static int vrc5477_ac97_release_mixdev(struct inode *inode, struct file *file)
{
	return 0;
}


static int mixdev_ioctl(struct ac97_codec *codec, unsigned int cmd,
			unsigned long arg)
{
	return codec->mixer_ioctl(codec, cmd, arg);
}

static int vrc5477_ac97_ioctl_mixdev(struct inode *inode, struct file *file,
				     unsigned int cmd, unsigned long arg)
{
    struct vrc5477_ac97_state *s = 
	    (struct vrc5477_ac97_state *)file->private_data;
    struct ac97_codec *codec = s->codec;

    return mixdev_ioctl(codec, cmd, arg);
}

static /*const*/ struct file_operations vrc5477_ac97_mixer_fops = {
	.owner		= THIS_MODULE,
	.llseek		= no_llseek,
	.ioctl		= vrc5477_ac97_ioctl_mixdev,
	.open		= vrc5477_ac97_open_mixdev,
	.release	= vrc5477_ac97_release_mixdev,
};

/* --------------------------------------------------------------------- */

static int drain_dac(struct vrc5477_ac97_state *s, int nonblock)
{
	unsigned long flags;
	int count, tmo;
	
	if (!s->dma_dac.ready)
		return 0;

	for (;;) {
		spin_lock_irqsave(&s->lock, flags);
		count = s->dma_dac.count;
		spin_unlock_irqrestore(&s->lock, flags);
		if (count <= 0)
			break;
		if (signal_pending(current))
			break;
		if (nonblock)
			return -EBUSY;
		tmo = 1000 * count / s->dacRate / 2;
		vrc5477_ac97_delay(tmo);
	}
	if (signal_pending(current))
		return -ERESTARTSYS;
	return 0;
}

/* --------------------------------------------------------------------- */

static inline int
copy_two_channel_adc_to_user(struct vrc5477_ac97_state *s, 
		             char *buffer, 
			     int copyCount)
{
	struct dmabuf *db = &s->dma_adc;
	int bufStart = db->nextOut;
	for (; copyCount > 0; ) {
		int i;
		int count = copyCount;
		if (count > WORK_BUF_SIZE/2) count = WORK_BUF_SIZE/2;
		for (i=0; i< count/2; i++) {
			s->workBuf[i].lchannel = 
				*(u16*)(db->lbuf + bufStart + i*2);
			s->workBuf[i].rchannel = 
				*(u16*)(db->rbuf + bufStart + i*2);
		}
		if (copy_to_user(buffer, s->workBuf, count*2)) {
			return -1;
		}

		copyCount -= count;
		bufStart += count;
		ASSERT(bufStart <= db->fragTotalSize);
		buffer += count *2;
	}
	return 0;
}

/* return the total bytes that is copied */
static inline int
copy_adc_to_user(struct vrc5477_ac97_state *s,
		 char * buffer,
		 size_t count,
		 int avail)
{
	struct dmabuf *db = &s->dma_adc;
	int copyCount=0;
	int copyFragCount=0;
	int totalCopyCount = 0;
	int totalCopyFragCount = 0;
	unsigned long flags;

	/* adjust count to signel channel byte count */
	count >>= s->adcChannels - 1;

	/* we may have to "copy" twice as ring buffer wraps around */
	for (; (avail > 0) && (count > 0); ) {
		/* determine max possible copy count for single channel */
		copyCount = count;
		if (copyCount > avail) {
			copyCount = avail;
		}
		if (copyCount + db->nextOut > db->fragTotalSize) {
			copyCount = db->fragTotalSize - db->nextOut;
			ASSERT((copyCount % db->fragSize) == 0);
		}

		copyFragCount = (copyCount-1) >> db->fragShift;
		copyFragCount = (copyFragCount+1) << db->fragShift;
		ASSERT(copyFragCount >= copyCount);

		/* we copy differently based on adc channels */
		if (s->adcChannels == 1) {
			if (copy_to_user(buffer, 
					 db->lbuf + db->nextOut, 
					 copyCount)) 
				return -1;
		} else {
			/* *sigh* we have to mix two streams into one  */
			if (copy_two_channel_adc_to_user(s, buffer, copyCount))
				return -1;
		}	

		count -= copyCount;
		totalCopyCount += copyCount;
		avail -= copyFragCount;
		totalCopyFragCount += copyFragCount;

		buffer += copyCount << (s->adcChannels-1);

		db->nextOut += copyFragCount;
		if (db->nextOut >= db->fragTotalSize) {
			ASSERT(db->nextOut == db->fragTotalSize);
			db->nextOut = 0;
		}

		ASSERT((copyFragCount % db->fragSize) == 0);
		ASSERT( (count == 0) || (copyCount == copyFragCount));
	}

	spin_lock_irqsave(&s->lock, flags);
        db->count -= totalCopyFragCount;
        spin_unlock_irqrestore(&s->lock, flags);

	return totalCopyCount << (s->adcChannels-1);
}

static ssize_t 
vrc5477_ac97_read(struct file *file, 
		  char *buffer,
		  size_t count, 
		  loff_t *ppos)
{
	struct vrc5477_ac97_state *s = 
		(struct vrc5477_ac97_state *)file->private_data;
	struct dmabuf *db = &s->dma_adc;
	ssize_t ret = 0;
	unsigned long flags;
	int copyCount;
	size_t avail;

	if (!access_ok(VERIFY_WRITE, buffer, count))
		return -EFAULT;

	ASSERT(db->ready);

	while (count > 0) {
		// wait for samples in capture buffer
		do {
			spin_lock_irqsave(&s->lock, flags);
			if (db->stopped)
				start_adc(s);
			avail = db->count;
			spin_unlock_irqrestore(&s->lock, flags);
			if (avail <= 0) {
				if (file->f_flags & O_NONBLOCK) {
					if (!ret)
						ret = -EAGAIN;
					return ret;
				}
				interruptible_sleep_on(&db->wait);
				if (signal_pending(current)) {
					if (!ret)
						ret = -ERESTARTSYS;
					return ret;
				}
			}
		} while (avail <= 0);

		ASSERT( (avail % db->fragSize) == 0);
		copyCount = copy_adc_to_user(s, buffer, count, avail);
		if (copyCount <=0 ) {
			if (!ret) ret = -EFAULT;
			return ret;
		}

		count -= copyCount;
		buffer += copyCount;
		ret += copyCount;
	} // while (count > 0)

	return ret;
}

static inline int
copy_two_channel_dac_from_user(struct vrc5477_ac97_state *s, 
			       const char *buffer, 
			       int copyCount)
{
	struct dmabuf *db = &s->dma_dac;
	int bufStart = db->nextIn;

	ASSERT(db->ready);

        for (; copyCount > 0; ) {
                int i;
                int count = copyCount;
                if (count > WORK_BUF_SIZE/2) count = WORK_BUF_SIZE/2;
                if (copy_from_user(s->workBuf, buffer, count*2)) {
                        return -1;
                }
                for (i=0; i< count/2; i++) {
			*(u16*)(db->lbuf + bufStart + i*2) = 
				s->workBuf[i].lchannel;
			*(u16*)(db->rbuf + bufStart + i*2) = 
				s->workBuf[i].rchannel;
                }

                copyCount -= count;
		bufStart += count;
		ASSERT(bufStart <= db->fragTotalSize);
                buffer += count *2;
        }
        return 0;

}

/* return the total bytes that is copied */
static inline int
copy_dac_from_user(struct vrc5477_ac97_state *s, 
		   const char *buffer, 
		   size_t count, 
		   int avail)
{	
        struct dmabuf *db = &s->dma_dac;
        int copyCount=0;
        int copyFragCount=0;
        int totalCopyCount = 0;
        int totalCopyFragCount = 0;
        unsigned long flags;
#if defined(VRC5477_AC97_VERBOSE_DEBUG)
	int i;
#endif

        /* adjust count to signel channel byte count */
        count >>= s->dacChannels - 1;

        /* we may have to "copy" twice as ring buffer wraps around */
        for (; (avail > 0) && (count > 0); ) {
                /* determine max possible copy count for single channel */
                copyCount = count;
                if (copyCount > avail) {
                        copyCount = avail;
		}
                if (copyCount + db->nextIn > db->fragTotalSize) {
                        copyCount = db->fragTotalSize - db->nextIn;
                        ASSERT(copyCount > 0);
                }

		copyFragCount = copyCount;
		ASSERT(copyFragCount >= copyCount);

		/* we copy differently based on the number channels */
		if (s->dacChannels == 1) {
			if (copy_from_user(db->lbuf + db->nextIn,
					   buffer,
					   copyCount)) 
				return -1;
			/* fill gaps with 0 */
			memset(db->lbuf + db->nextIn + copyCount,
			       0,
			       copyFragCount - copyCount);
		} else {
			/* we have demux the stream into two separate ones */
			if (copy_two_channel_dac_from_user(s, buffer, copyCount))
				return -1;
			/* fill gaps with 0 */
			memset(db->lbuf + db->nextIn + copyCount,
			       0,
			       copyFragCount - copyCount);
			memset(db->rbuf + db->nextIn + copyCount,
			       0,
			       copyFragCount - copyCount);
		}

#if defined(VRC5477_AC97_VERBOSE_DEBUG)
		for (i=0; i< copyFragCount; i+= db->fragSize) {
			*(u16*)(db->lbuf + db->nextIn + i) = inTicket ++;
		}
#endif

		count -= copyCount;
		totalCopyCount += copyCount;
		avail -= copyFragCount;
		totalCopyFragCount += copyFragCount;

		buffer += copyCount << (s->dacChannels - 1);

		db->nextIn += copyFragCount;
		if (db->nextIn >= db->fragTotalSize) {
			ASSERT(db->nextIn == db->fragTotalSize);
			db->nextIn = 0;
		}

		ASSERT( (count == 0) || (copyCount == copyFragCount));
	}

	spin_lock_irqsave(&s->lock, flags);
        db->count += totalCopyFragCount;
	if (db->stopped) {
		start_dac(s);
	}

	/* nextIn should not be equal to nextOut unless we are full */
	ASSERT( ( (db->count == db->fragTotalSize) && 
                       (db->nextIn == db->nextOut) ) ||
                     ( (db->count < db->fragTotalSize) &&
                       (db->nextIn != db->nextOut) ) );

        spin_unlock_irqrestore(&s->lock, flags);

        return totalCopyCount << (s->dacChannels-1);

}

static ssize_t vrc5477_ac97_write(struct file *file, const char *buffer,
				  size_t count, loff_t *ppos)
{
	struct vrc5477_ac97_state *s = 
		(struct vrc5477_ac97_state *)file->private_data;
	struct dmabuf *db = &s->dma_dac;
	ssize_t ret;
	unsigned long flags;
	int copyCount, avail;

	if (!access_ok(VERIFY_READ, buffer, count))
		return -EFAULT;
	ret = 0;
    
	while (count > 0) {
		// wait for space in playback buffer
		do {
			spin_lock_irqsave(&s->lock, flags);
			avail = db->fragTotalSize - db->count;
			spin_unlock_irqrestore(&s->lock, flags);
			if (avail <= 0) {
				if (file->f_flags & O_NONBLOCK) {
					if (!ret)
						ret = -EAGAIN;
					return ret;
				}
				interruptible_sleep_on(&db->wait);
				if (signal_pending(current)) {
					if (!ret)
						ret = -ERESTARTSYS;
					return ret;
				}
			}
		} while (avail <= 0);
	
		copyCount = copy_dac_from_user(s, buffer, count, avail);
		if (copyCount < 0) {
			if (!ret) ret = -EFAULT;
			return ret;
		}

		count -= copyCount;
		buffer += copyCount;
		ret += copyCount;
	} // while (count > 0)
	
	return ret;
}

/* No kernel lock - we have our own spinlock */
static unsigned int vrc5477_ac97_poll(struct file *file,
				      struct poll_table_struct *wait)
{
	struct vrc5477_ac97_state *s = (struct vrc5477_ac97_state *)file->private_data;
	unsigned long flags;
	unsigned int mask = 0;

	if (file->f_mode & FMODE_WRITE)
		poll_wait(file, &s->dma_dac.wait, wait);
	if (file->f_mode & FMODE_READ)
		poll_wait(file, &s->dma_adc.wait, wait);
	spin_lock_irqsave(&s->lock, flags);
	if (file->f_mode & FMODE_READ) {
		if (s->dma_adc.count >= (signed)s->dma_adc.fragSize)
			mask |= POLLIN | POLLRDNORM;
	}
	if (file->f_mode & FMODE_WRITE) {
		if ((signed)s->dma_dac.fragTotalSize >=
		    s->dma_dac.count + (signed)s->dma_dac.fragSize)
			mask |= POLLOUT | POLLWRNORM;
	}
	spin_unlock_irqrestore(&s->lock, flags);
	return mask;
}

#ifdef VRC5477_AC97_DEBUG
static struct ioctl_str_t {
    unsigned int cmd;
    const char* str;
} ioctl_str[] = {
    {SNDCTL_DSP_RESET, "SNDCTL_DSP_RESET"},
    {SNDCTL_DSP_SYNC, "SNDCTL_DSP_SYNC"},
    {SNDCTL_DSP_SPEED, "SNDCTL_DSP_SPEED"},
    {SNDCTL_DSP_STEREO, "SNDCTL_DSP_STEREO"},
    {SNDCTL_DSP_GETBLKSIZE, "SNDCTL_DSP_GETBLKSIZE"},
    {SNDCTL_DSP_SETFMT, "SNDCTL_DSP_SETFMT"},
    {SNDCTL_DSP_SAMPLESIZE, "SNDCTL_DSP_SAMPLESIZE"},
    {SNDCTL_DSP_CHANNELS, "SNDCTL_DSP_CHANNELS"},
    {SOUND_PCM_WRITE_CHANNELS, "SOUND_PCM_WRITE_CHANNELS"},
    {SOUND_PCM_WRITE_FILTER, "SOUND_PCM_WRITE_FILTER"},
    {SNDCTL_DSP_POST, "SNDCTL_DSP_POST"},
    {SNDCTL_DSP_SUBDIVIDE, "SNDCTL_DSP_SUBDIVIDE"},
    {SNDCTL_DSP_SETFRAGMENT, "SNDCTL_DSP_SETFRAGMENT"},
    {SNDCTL_DSP_GETFMTS, "SNDCTL_DSP_GETFMTS"},
    {SNDCTL_DSP_GETOSPACE, "SNDCTL_DSP_GETOSPACE"},
    {SNDCTL_DSP_GETISPACE, "SNDCTL_DSP_GETISPACE"},
    {SNDCTL_DSP_NONBLOCK, "SNDCTL_DSP_NONBLOCK"},
    {SNDCTL_DSP_GETCAPS, "SNDCTL_DSP_GETCAPS"},
    {SNDCTL_DSP_GETTRIGGER, "SNDCTL_DSP_GETTRIGGER"},
    {SNDCTL_DSP_SETTRIGGER, "SNDCTL_DSP_SETTRIGGER"},
    {SNDCTL_DSP_GETIPTR, "SNDCTL_DSP_GETIPTR"},
    {SNDCTL_DSP_GETOPTR, "SNDCTL_DSP_GETOPTR"},
    {SNDCTL_DSP_MAPINBUF, "SNDCTL_DSP_MAPINBUF"},
    {SNDCTL_DSP_MAPOUTBUF, "SNDCTL_DSP_MAPOUTBUF"},
    {SNDCTL_DSP_SETSYNCRO, "SNDCTL_DSP_SETSYNCRO"},
    {SNDCTL_DSP_SETDUPLEX, "SNDCTL_DSP_SETDUPLEX"},
    {SNDCTL_DSP_GETODELAY, "SNDCTL_DSP_GETODELAY"},
    {SNDCTL_DSP_GETCHANNELMASK, "SNDCTL_DSP_GETCHANNELMASK"},
    {SNDCTL_DSP_BIND_CHANNEL, "SNDCTL_DSP_BIND_CHANNEL"},
    {OSS_GETVERSION, "OSS_GETVERSION"},
    {SOUND_PCM_READ_RATE, "SOUND_PCM_READ_RATE"},
    {SOUND_PCM_READ_CHANNELS, "SOUND_PCM_READ_CHANNELS"},
    {SOUND_PCM_READ_BITS, "SOUND_PCM_READ_BITS"},
    {SOUND_PCM_READ_FILTER, "SOUND_PCM_READ_FILTER"}
};
#endif    

static int vrc5477_ac97_ioctl(struct inode *inode, struct file *file,
			unsigned int cmd, unsigned long arg)
{
	struct vrc5477_ac97_state *s = (struct vrc5477_ac97_state *)file->private_data;
	unsigned long flags;
	audio_buf_info abinfo;
	int count;
	int val, ret;

#ifdef VRC5477_AC97_DEBUG
	for (count = 0; count < ARRAY_SIZE(ioctl_str); count++) {
		if (ioctl_str[count].cmd == cmd)
			break;
	}
	if (count < ARRAY_SIZE(ioctl_str))
		printk(KERN_INFO PFX "ioctl %s\n", ioctl_str[count].str);
	else
		printk(KERN_INFO PFX "ioctl unknown, 0x%x\n", cmd);
#endif
    
	switch (cmd) {
	case OSS_GETVERSION:
		return put_user(SOUND_VERSION, (int *)arg);

	case SNDCTL_DSP_SYNC:
		if (file->f_mode & FMODE_WRITE)
			return drain_dac(s, file->f_flags & O_NONBLOCK);
		return 0;
		
	case SNDCTL_DSP_SETDUPLEX:
		return 0;

	case SNDCTL_DSP_GETCAPS:
		return put_user(DSP_CAP_DUPLEX, (int *)arg);
		
	case SNDCTL_DSP_RESET:
		if (file->f_mode & FMODE_WRITE) {
			stop_dac(s);
			synchronize_irq(s->irq);
			s->dma_dac.count = 0;
			s->dma_dac.nextIn = s->dma_dac.nextOut = 0;
		}
		if (file->f_mode & FMODE_READ) {
			stop_adc(s);
			synchronize_irq(s->irq);
			s->dma_adc.count = 0;
			s->dma_adc.nextIn = s->dma_adc.nextOut = 0;
		}
		return 0;

	case SNDCTL_DSP_SPEED:
		if (get_user(val, (int *)arg))
			return -EFAULT;
		if (val >= 0) {
			if (file->f_mode & FMODE_READ) {
				stop_adc(s);
				set_adc_rate(s, val);
				if ((ret = prog_dmabuf_adc(s)))
					return ret;
			}
			if (file->f_mode & FMODE_WRITE) {
				stop_dac(s);
				set_dac_rate(s, val);
				if ((ret = prog_dmabuf_dac(s)))
					return ret;
			}
		}
		return put_user((file->f_mode & FMODE_READ) ?
				s->adcRate : s->dacRate, (int *)arg);

	case SNDCTL_DSP_STEREO:
		if (get_user(val, (int *)arg))
			return -EFAULT;
		if (file->f_mode & FMODE_READ) {
			stop_adc(s);
			if (val)
				s->adcChannels = 2;
			else
				s->adcChannels = 1;
			if ((ret = prog_dmabuf_adc(s)))
				return ret;
		}
		if (file->f_mode & FMODE_WRITE) {
			stop_dac(s);
			if (val)
				s->dacChannels = 2;
			else
				s->dacChannels = 1;
			if ((ret = prog_dmabuf_dac(s)))
				return ret;
		}
		return 0;

	case SNDCTL_DSP_CHANNELS:
		if (get_user(val, (int *)arg))
			return -EFAULT;
		if (val != 0) {
			if ( (val != 1) && (val != 2)) val = 2;

			if (file->f_mode & FMODE_READ) {
				stop_adc(s);
				s->dacChannels = val;
				if ((ret = prog_dmabuf_adc(s)))
					return ret;
			}
			if (file->f_mode & FMODE_WRITE) {
				stop_dac(s);
				s->dacChannels = val;
				if ((ret = prog_dmabuf_dac(s)))
					return ret;
			}
		}
		return put_user(val, (int *)arg);
		
	case SNDCTL_DSP_GETFMTS: /* Returns a mask */
		return put_user(AFMT_S16_LE, (int *)arg);
		
	case SNDCTL_DSP_SETFMT: /* Selects ONE fmt*/
		if (get_user(val, (int *)arg))
			return -EFAULT;
		if (val != AFMT_QUERY) {
			if (val != AFMT_S16_LE) return -EINVAL;
			if (file->f_mode & FMODE_READ) {
				stop_adc(s);
				if ((ret = prog_dmabuf_adc(s)))
					return ret;
			}
			if (file->f_mode & FMODE_WRITE) {
				stop_dac(s);
				if ((ret = prog_dmabuf_dac(s)))
					return ret;
			}
		} else {
			val = AFMT_S16_LE;
		}
		return put_user(val, (int *)arg);
		
	case SNDCTL_DSP_POST:
		return 0;

	case SNDCTL_DSP_GETTRIGGER:
	case SNDCTL_DSP_SETTRIGGER:
		/* NO trigger */
		return -EINVAL;

	case SNDCTL_DSP_GETOSPACE:
		if (!(file->f_mode & FMODE_WRITE))
			return -EINVAL;
		abinfo.fragsize = s->dma_dac.fragSize << (s->dacChannels-1);
		spin_lock_irqsave(&s->lock, flags);
		count = s->dma_dac.count;
		spin_unlock_irqrestore(&s->lock, flags);
		abinfo.bytes = (s->dma_dac.fragTotalSize - count) << 
			(s->dacChannels-1);
		abinfo.fragstotal = s->dma_dac.numFrag;
		abinfo.fragments = abinfo.bytes >> s->dma_dac.fragShift >> 
			(s->dacChannels-1);      
		return copy_to_user((void *)arg, &abinfo, sizeof(abinfo)) ? -EFAULT : 0;

	case SNDCTL_DSP_GETISPACE:
		if (!(file->f_mode & FMODE_READ))
			return -EINVAL;
		abinfo.fragsize = s->dma_adc.fragSize << (s->adcChannels-1);
		spin_lock_irqsave(&s->lock, flags);
		count = s->dma_adc.count;
		spin_unlock_irqrestore(&s->lock, flags);
		if (count < 0)
			count = 0;
		abinfo.bytes = count << (s->adcChannels-1);
		abinfo.fragstotal = s->dma_adc.numFrag;
		abinfo.fragments = (abinfo.bytes >> s->dma_adc.fragShift) >>
			(s->adcChannels-1);      
		return copy_to_user((void *)arg, &abinfo, sizeof(abinfo)) ? -EFAULT : 0;
		
	case SNDCTL_DSP_NONBLOCK:
		file->f_flags |= O_NONBLOCK;
		return 0;

	case SNDCTL_DSP_GETODELAY:
		if (!(file->f_mode & FMODE_WRITE))
			return -EINVAL;
		spin_lock_irqsave(&s->lock, flags);
		count = s->dma_dac.count;
		spin_unlock_irqrestore(&s->lock, flags);
		return put_user(count, (int *)arg);

	case SNDCTL_DSP_GETIPTR:
	case SNDCTL_DSP_GETOPTR:
		/* we cannot get DMA ptr */
		return -EINVAL;

	case SNDCTL_DSP_GETBLKSIZE:
		if (file->f_mode & FMODE_WRITE)
			return put_user(s->dma_dac.fragSize << (s->dacChannels-1), (int *)arg);
		else
			return put_user(s->dma_adc.fragSize << (s->adcChannels-1), (int *)arg);

	case SNDCTL_DSP_SETFRAGMENT:
		/* we ignore fragment size request */
		return 0;

	case SNDCTL_DSP_SUBDIVIDE:
		/* what is this for? [jsun] */
		return 0;

	case SOUND_PCM_READ_RATE:
		return put_user((file->f_mode & FMODE_READ) ?
				s->adcRate : s->dacRate, (int *)arg);

	case SOUND_PCM_READ_CHANNELS:
		if (file->f_mode & FMODE_READ)
			return put_user(s->adcChannels, (int *)arg);
		else
			return put_user(s->dacChannels ? 2 : 1, (int *)arg);
	    
	case SOUND_PCM_READ_BITS:
		return put_user(16, (int *)arg);

	case SOUND_PCM_WRITE_FILTER:
	case SNDCTL_DSP_SETSYNCRO:
	case SOUND_PCM_READ_FILTER:
		return -EINVAL;
	}

	return mixdev_ioctl(s->codec, cmd, arg);
}


static int vrc5477_ac97_open(struct inode *inode, struct file *file)
{
	int minor = iminor(inode);
	DECLARE_WAITQUEUE(wait, current);
	unsigned long flags;
	struct list_head *list;
	struct vrc5477_ac97_state *s;
	int ret=0;

	nonseekable_open(inode, file);    
	for (list = devs.next; ; list = list->next) {
		if (list == &devs)
			return -ENODEV;
		s = list_entry(list, struct vrc5477_ac97_state, devs);
		if (!((s->dev_audio ^ minor) & ~0xf))
			break;
	}
	file->private_data = s;

	/* wait for device to become free */
	mutex_lock(&s->open_mutex);
	while (s->open_mode & file->f_mode) {

		if (file->f_flags & O_NONBLOCK) {
			mutex_unlock(&s->open_mutex);
			return -EBUSY;
		}
		add_wait_queue(&s->open_wait, &wait);
		__set_current_state(TASK_INTERRUPTIBLE);
		mutex_unlock(&s->open_mutex);
		schedule();
		remove_wait_queue(&s->open_wait, &wait);
		set_current_state(TASK_RUNNING);
		if (signal_pending(current))
			return -ERESTARTSYS;
		mutex_lock(&s->open_mutex);
	}

	spin_lock_irqsave(&s->lock, flags);

	if (file->f_mode & FMODE_READ) {
		/* set default settings */
		set_adc_rate(s, 48000);
		s->adcChannels = 2;

		ret = prog_dmabuf_adc(s);
		if (ret) goto bailout;
	}
	if (file->f_mode & FMODE_WRITE) {
		/* set default settings */
		set_dac_rate(s, 48000);
		s->dacChannels = 2;

		ret = prog_dmabuf_dac(s);
		if (ret) goto bailout;
	}

	s->open_mode |= file->f_mode & (FMODE_READ | FMODE_WRITE);

 bailout:
	spin_unlock_irqrestore(&s->lock, flags);

	mutex_unlock(&s->open_mutex);
	return ret;
}

static int vrc5477_ac97_release(struct inode *inode, struct file *file)
{
	struct vrc5477_ac97_state *s = 
		(struct vrc5477_ac97_state *)file->private_data;

	lock_kernel();
	if (file->f_mode & FMODE_WRITE)
		drain_dac(s, file->f_flags & O_NONBLOCK);
	mutex_lock(&s->open_mutex);
	if (file->f_mode & FMODE_WRITE) {
		stop_dac(s);
		dealloc_dmabuf(s, &s->dma_dac);
	}
	if (file->f_mode & FMODE_READ) {
		stop_adc(s);
		dealloc_dmabuf(s, &s->dma_adc);
	}
	s->open_mode &= (~file->f_mode) & (FMODE_READ|FMODE_WRITE);
	mutex_unlock(&s->open_mutex);
	wake_up(&s->open_wait);
	unlock_kernel();
	return 0;
}

static /*const*/ struct file_operations vrc5477_ac97_audio_fops = {
	.owner		= THIS_MODULE,
	.llseek		= no_llseek,
	.read		= vrc5477_ac97_read,
	.write		= vrc5477_ac97_write,
	.poll		= vrc5477_ac97_poll,
	.ioctl		= vrc5477_ac97_ioctl,
	// .mmap	= vrc5477_ac97_mmap,
	.open		= vrc5477_ac97_open,
	.release	= vrc5477_ac97_release,
};


/* --------------------------------------------------------------------- */


/* --------------------------------------------------------------------- */

/*
 * for debugging purposes, we'll create a proc device that dumps the
 * CODEC chipstate
 */

#ifdef VRC5477_AC97_DEBUG

struct {
       const char *regname;
       unsigned regaddr;
} vrc5477_ac97_regs[] = {
	{"VRC5477_INT_STATUS", VRC5477_INT_STATUS},
	{"VRC5477_CODEC_WR", VRC5477_CODEC_WR},
	{"VRC5477_CODEC_RD", VRC5477_CODEC_RD},
	{"VRC5477_CTRL", VRC5477_CTRL},
	{"VRC5477_ACLINK_CTRL", VRC5477_ACLINK_CTRL},
	{"VRC5477_INT_MASK", VRC5477_INT_MASK},
	{"VRC5477_DAC1_CTRL", VRC5477_DAC1_CTRL},
	{"VRC5477_DAC1L", VRC5477_DAC1L},
	{"VRC5477_DAC1_BADDR", VRC5477_DAC1_BADDR},
	{"VRC5477_DAC2_CTRL", VRC5477_DAC2_CTRL},
	{"VRC5477_DAC2L", VRC5477_DAC2L},
	{"VRC5477_DAC2_BADDR", VRC5477_DAC2_BADDR},
	{"VRC5477_DAC3_CTRL", VRC5477_DAC3_CTRL},
	{"VRC5477_DAC3L", VRC5477_DAC3L},
	{"VRC5477_DAC3_BADDR", VRC5477_DAC3_BADDR},
	{"VRC5477_ADC1_CTRL", VRC5477_ADC1_CTRL},
	{"VRC5477_ADC1L", VRC5477_ADC1L},
	{"VRC5477_ADC1_BADDR", VRC5477_ADC1_BADDR},
	{"VRC5477_ADC2_CTRL", VRC5477_ADC2_CTRL},
	{"VRC5477_ADC2L", VRC5477_ADC2L},
	{"VRC5477_ADC2_BADDR", VRC5477_ADC2_BADDR},
	{"VRC5477_ADC3_CTRL", VRC5477_ADC3_CTRL},
	{"VRC5477_ADC3L", VRC5477_ADC3L},
	{"VRC5477_ADC3_BADDR", VRC5477_ADC3_BADDR},
	{NULL, 0x0}
};

static int proc_vrc5477_ac97_dump (char *buf, char **start, off_t fpos,
				   int length, int *eof, void *data)
{
	struct vrc5477_ac97_state *s;
	int cnt, len = 0;

	if (list_empty(&devs))
		return 0;
	s = list_entry(devs.next, struct vrc5477_ac97_state, devs);

	/* print out header */
	len += sprintf(buf + len, "\n\t\tVrc5477 Audio Debug\n\n");

	// print out digital controller state
	len += sprintf (buf + len, "NEC Vrc5477 Audio Controller registers\n");
	len += sprintf (buf + len, "---------------------------------\n");
	for (cnt=0; vrc5477_ac97_regs[cnt].regname != NULL; cnt++) {
		len+= sprintf (buf + len, "%-20s = %08x\n",
			       vrc5477_ac97_regs[cnt].regname,
			       inl(s->io + vrc5477_ac97_regs[cnt].regaddr));
	}
   
	/* print out driver state */
	len += sprintf (buf + len, "NEC Vrc5477 Audio driver states\n");
	len += sprintf (buf + len, "---------------------------------\n");
	len += sprintf (buf + len, "dacChannels  = %d\n", s->dacChannels);
	len += sprintf (buf + len, "adcChannels  = %d\n", s->adcChannels);
	len += sprintf (buf + len, "dacRate  = %d\n", s->dacRate);
	len += sprintf (buf + len, "adcRate  = %d\n", s->adcRate);

	len += sprintf (buf + len, "dma_dac is %s ready\n",  
	                s->dma_dac.ready? "" : "not");
        if (s->dma_dac.ready) {
		len += sprintf (buf + len, "dma_dac is %s stopped.\n",  
	                        s->dma_dac.stopped? "" : "not");
		len += sprintf (buf + len, "dma_dac.fragSize = %x\n", 
                                s->dma_dac.fragSize);
		len += sprintf (buf + len, "dma_dac.fragShift = %x\n", 
                                s->dma_dac.fragShift);
		len += sprintf (buf + len, "dma_dac.numFrag = %x\n", 
                                s->dma_dac.numFrag);
		len += sprintf (buf + len, "dma_dac.fragTotalSize = %x\n", 
                                s->dma_dac.fragTotalSize);
		len += sprintf (buf + len, "dma_dac.nextIn = %x\n", 
                                s->dma_dac.nextIn);
		len += sprintf (buf + len, "dma_dac.nextOut = %x\n", 
                                s->dma_dac.nextOut);
		len += sprintf (buf + len, "dma_dac.count = %x\n", 
                                s->dma_dac.count);
	}

	len += sprintf (buf + len, "dma_adc is %s ready\n",  
	                s->dma_adc.ready? "" : "not");
        if (s->dma_adc.ready) {
		len += sprintf (buf + len, "dma_adc is %s stopped.\n",  
	                        s->dma_adc.stopped? "" : "not");
		len += sprintf (buf + len, "dma_adc.fragSize = %x\n", 
                                s->dma_adc.fragSize);
		len += sprintf (buf + len, "dma_adc.fragShift = %x\n", 
                                s->dma_adc.fragShift);
		len += sprintf (buf + len, "dma_adc.numFrag = %x\n", 
                                s->dma_adc.numFrag);
		len += sprintf (buf + len, "dma_adc.fragTotalSize = %x\n", 
                                s->dma_adc.fragTotalSize);
		len += sprintf (buf + len, "dma_adc.nextIn = %x\n", 
                                s->dma_adc.nextIn);
		len += sprintf (buf + len, "dma_adc.nextOut = %x\n", 
                                s->dma_adc.nextOut);
		len += sprintf (buf + len, "dma_adc.count = %x\n", 
                                s->dma_adc.count);
	}
	 
	/* print out CODEC state */
	len += sprintf (buf + len, "\nAC97 CODEC registers\n");
	len += sprintf (buf + len, "----------------------\n");
	for (cnt=0; cnt <= 0x7e; cnt = cnt +2)
		len+= sprintf (buf + len, "reg %02x = %04x\n",
			       cnt, rdcodec(s->codec, cnt));

	if (fpos >=len){
		*start = buf;
		*eof =1;
		return 0;
	}
	*start = buf + fpos;
	if ((len -= fpos) > length)
		return length;
	*eof =1;
	return len;

}
#endif /* VRC5477_AC97_DEBUG */

/* --------------------------------------------------------------------- */

/* maximum number of devices; only used for command line params */
#define NR_DEVICE 5

static unsigned int devindex;

MODULE_AUTHOR("Monta Vista Software, jsun@mvista.com or jsun@junsun.net");
MODULE_DESCRIPTION("NEC Vrc5477 audio (AC97) Driver");
MODULE_LICENSE("GPL");

static int __devinit vrc5477_ac97_probe(struct pci_dev *pcidev,
					const struct pci_device_id *pciid)
{
	struct vrc5477_ac97_state *s;
#ifdef VRC5477_AC97_DEBUG
	char proc_str[80];
#endif

	if (pcidev->irq == 0) 
		return -1;

	if (!(s = kzalloc(sizeof(struct vrc5477_ac97_state), GFP_KERNEL))) {
		printk(KERN_ERR PFX "alloc of device struct failed\n");
		return -1;
	}

	init_waitqueue_head(&s->dma_adc.wait);
	init_waitqueue_head(&s->dma_dac.wait);
	init_waitqueue_head(&s->open_wait);
	mutex_init(&s->open_mutex);
	spin_lock_init(&s->lock);

	s->dev = pcidev;
	s->io = pci_resource_start(pcidev, 0);
	s->irq = pcidev->irq;
	
	s->codec = ac97_alloc_codec();

	s->codec->private_data = s;
	s->codec->id = 0;
	s->codec->codec_read = rdcodec;
	s->codec->codec_write = wrcodec;
	s->codec->codec_wait = waitcodec;

	/* setting some other default values such as
	 * adcChannels, adcRate is done in open() so that
         * no persistent state across file opens.
	 */

	/* test if get response from ac97, if not return */
        if (ac97_codec_not_present(s->codec)) {
		printk(KERN_ERR PFX "no ac97 codec\n");
		goto err_region;

        }

	/* test if get response from ac97, if not return */
        if (ac97_codec_not_present(&(s->codec))) {
		printk(KERN_ERR PFX "no ac97 codec\n");
		goto err_region;

        }

	if (!request_region(s->io, pci_resource_len(pcidev,0),
			    VRC5477_AC97_MODULE_NAME)) {
		printk(KERN_ERR PFX "io ports %#lx->%#lx in use\n",
		       s->io, s->io + pci_resource_len(pcidev,0)-1);
		goto err_region;
	}
	if (request_irq(s->irq, vrc5477_ac97_interrupt, IRQF_DISABLED,
			VRC5477_AC97_MODULE_NAME, s)) {
		printk(KERN_ERR PFX "irq %u in use\n", s->irq);
		goto err_irq;
	}

	printk(KERN_INFO PFX "IO at %#lx, IRQ %d\n", s->io, s->irq);

	/* register devices */
	if ((s->dev_audio = register_sound_dsp(&vrc5477_ac97_audio_fops, -1)) < 0)
		goto err_dev1;
	if ((s->codec->dev_mixer =
	     register_sound_mixer(&vrc5477_ac97_mixer_fops, -1)) < 0)
		goto err_dev2;

#ifdef VRC5477_AC97_DEBUG
	/* initialize the debug proc device */
	s->ps = create_proc_read_entry(VRC5477_AC97_MODULE_NAME, 0, NULL,
				       proc_vrc5477_ac97_dump, NULL);
#endif /* VRC5477_AC97_DEBUG */
	
	/* enable pci io and bus mastering */
	if (pci_enable_device(pcidev))
		goto err_dev3;
	pci_set_master(pcidev);

	/* cold reset the AC97 */
	outl(VRC5477_ACLINK_CTRL_RST_ON | VRC5477_ACLINK_CTRL_RST_TIME,
	     s->io + VRC5477_ACLINK_CTRL);
	while (inl(s->io + VRC5477_ACLINK_CTRL) & VRC5477_ACLINK_CTRL_RST_ON);

	/* codec init */
	if (!ac97_probe_codec(s->codec))
		goto err_dev3;

#ifdef VRC5477_AC97_DEBUG
	sprintf(proc_str, "driver/%s/%d/ac97", 
		VRC5477_AC97_MODULE_NAME, s->codec->id);
	s->ac97_ps = create_proc_read_entry (proc_str, 0, NULL,
					     ac97_read_proc, s->codec);
	/* TODO : why this proc file does not show up? */
#endif

	/* Try to enable variable rate audio mode. */
	wrcodec(s->codec, AC97_EXTENDED_STATUS,
		rdcodec(s->codec, AC97_EXTENDED_STATUS) | AC97_EXTSTAT_VRA);
	/* Did we enable it? */
	if(rdcodec(s->codec, AC97_EXTENDED_STATUS) & AC97_EXTSTAT_VRA)
		s->extended_status |= AC97_EXTSTAT_VRA;
	else {
		s->dacRate = 48000;
		printk(KERN_INFO PFX "VRA mode not enabled; rate fixed at %d.",
			s->dacRate);
	}

        /* let us get the default volumne louder */
        wrcodec(s->codec, 0x2, 0x1010);	/* master volume, middle */
        wrcodec(s->codec, 0xc, 0x10);		/* phone volume, middle */
        // wrcodec(s->codec, 0xe, 0x10);		/* misc volume, middle */
	wrcodec(s->codec, 0x10, 0x8000);	/* line-in 2 line-out disable */
        wrcodec(s->codec, 0x18, 0x0707);	/* PCM out (line out) middle */


	/* by default we select line in the input */
	wrcodec(s->codec, 0x1a, 0x0404);
	wrcodec(s->codec, 0x1c, 0x0f0f);
	wrcodec(s->codec, 0x1e, 0x07);

	/* enable the master interrupt but disable all others */
	outl(VRC5477_INT_MASK_NMASK, s->io + VRC5477_INT_MASK);

	/* store it in the driver field */
	pci_set_drvdata(pcidev, s);
	pcidev->dma_mask = 0xffffffff;
	/* put it into driver list */
	list_add_tail(&s->devs, &devs);
	/* increment devindex */
	if (devindex < NR_DEVICE-1)
		devindex++;
	return 0;

 err_dev3:
	unregister_sound_mixer(s->codec->dev_mixer);
 err_dev2:
	unregister_sound_dsp(s->dev_audio);
 err_dev1:
	printk(KERN_ERR PFX "cannot register misc device\n");
	free_irq(s->irq, s);
 err_irq:
	release_region(s->io, pci_resource_len(pcidev,0));
 err_region:
 	ac97_release_codec(codec);
	kfree(s);
	return -1;
}

static void __devexit vrc5477_ac97_remove(struct pci_dev *dev)
{
	struct vrc5477_ac97_state *s = pci_get_drvdata(dev);

	if (!s)
		return;
	list_del(&s->devs);

#ifdef VRC5477_AC97_DEBUG
	if (s->ps)
		remove_proc_entry(VRC5477_AC97_MODULE_NAME, NULL);
#endif /* VRC5477_AC97_DEBUG */

	synchronize_irq();
	free_irq(s->irq, s);
	release_region(s->io, pci_resource_len(dev,0));
	unregister_sound_dsp(s->dev_audio);
	unregister_sound_mixer(s->codec->dev_mixer);
	ac97_release_codec(s->codec);
	kfree(s);
	pci_set_drvdata(dev, NULL);
}


static struct pci_device_id id_table[] = {
    { PCI_VENDOR_ID_NEC, PCI_DEVICE_ID_NEC_VRC5477_AC97, 
      PCI_ANY_ID, PCI_ANY_ID, 0, 0 },
    { 0, }
};

MODULE_DEVICE_TABLE(pci, id_table);

static struct pci_driver vrc5477_ac97_driver = {
	.name		= VRC5477_AC97_MODULE_NAME,
	.id_table	= id_table,
	.probe		= vrc5477_ac97_probe,
	.remove		= __devexit_p(vrc5477_ac97_remove)
};

static int __init init_vrc5477_ac97(void)
{
	printk("Vrc5477 AC97 driver: version v0.2 time " __TIME__ " " __DATE__ " by Jun Sun\n");
	return pci_register_driver(&vrc5477_ac97_driver);
}

static void __exit cleanup_vrc5477_ac97(void)
{
	printk(KERN_INFO PFX "unloading\n");
	pci_unregister_driver(&vrc5477_ac97_driver);
}

module_init(init_vrc5477_ac97);
module_exit(cleanup_vrc5477_ac97);

