29#ifdef HAVE_KERNEL_OPTION_HEADERS
38#include <sys/sysctl.h>
44#define VIA_PCI_ID 0x30581106
47#define SEGS_PER_CHAN (NSEGS/2)
50#define VIA_DEFAULT_BUFSZ 0x1000
59#define VIA_DMAOP_EOL 0x80000000
60#define VIA_DMAOP_FLAG 0x40000000
61#define VIA_DMAOP_STOP 0x20000000
62#define VIA_DMAOP_COUNT(x) ((x)&0x00FFFFFF)
79 bus_space_handle_t
sh;
85 struct resource *
reg, *
irq;
108static __inline u_int32_t
114 return bus_space_read_1(via->
st, via->
sh,
regno);
116 return bus_space_read_2(via->
st, via->
sh,
regno);
118 return bus_space_read_4(via->
st, via->
sh,
regno);
154 printf(
"via: codec busy\n");
171 printf(
"via: codec invalid\n");
221 u_int32_t phys_addr, flag;
222 int i, segs, seg_size;
230 seg_size = ch->
blksz;
234 for (i = 0; i < segs; i++) {
294 DEB(printf(
"set format: dir = %d, format=%x\n", ch->
dir,
format));
351 DEB(printf(
"ado located at va=%p pa=%x\n", ado, sgd_addr));
362 DEB(printf(
"viachan_trigger: go=%d\n",
go));
384 DEB(printf(
"viachan_getptr: len / base = %x / %x\n",
len,
base));
401 DEB(printf(
"return ptr=%u\n",
ptr));
460 device_set_desc(
dev,
"VIA VT82C686A");
461 return BUS_PROBE_DEFAULT;
467dma_cb(
void *p, bus_dma_segment_t *bds,
int a,
int b)
480 via = malloc(
sizeof(*via), M_DEVBUF, M_WAITOK | M_ZERO);
482 "snd_via82c686 softc");
484 pci_enable_busmaster(
dev);
510 for (cnt = 0; cnt < 2000; cnt++) {
518 via->
reg = bus_alloc_resource_any(
dev, SYS_RES_IOPORT,
519 &via->
regid, RF_ACTIVE);
521 device_printf(
dev,
"cannot allocate bus resource.");
524 via->
st = rman_get_bustag(via->
reg);
525 via->
sh = rman_get_bushandle(via->
reg);
530 via->
irq = bus_alloc_resource_any(
dev, SYS_RES_IRQ, &via->
irqid,
531 RF_ACTIVE | RF_SHAREABLE);
533 device_printf(
dev,
"unable to map interrupt\n");
552 if (bus_dma_tag_create(bus_get_dma_tag(
dev), 2,
554 BUS_SPACE_MAXADDR_32BIT,
557 via->
bufsz, 1, 0x3ffff,
560 device_printf(
dev,
"unable to create dma tag\n");
569 if (bus_dma_tag_create(bus_get_dma_tag(
dev), 2,
571 BUS_SPACE_MAXADDR_32BIT,
578 device_printf(
dev,
"unable to create dma tag\n");
590 rman_get_start(via->
reg), rman_get_start(via->
irq),
601 if (via->
reg) bus_release_resource(
dev, SYS_RES_IOPORT, via->
regid, via->
reg);
602 if (via->
ih) bus_teardown_intr(
dev, via->
irq, via->
ih);
603 if (via->
irq) bus_release_resource(
dev, SYS_RES_IRQ, via->
irqid, via->
irq);
609 if (via)
free(via, M_DEVBUF);
624 bus_release_resource(
dev, SYS_RES_IOPORT, via->
regid, via->
reg);
625 bus_teardown_intr(
dev, via->
irq, via->
ih);
626 bus_release_resource(
dev, SYS_RES_IRQ, via->
irqid, via->
irq);
int ac97_setextmode(struct ac97_info *codec, u_int16_t mode)
u_int16_t ac97_getextcaps(struct ac97_info *codec)
kobj_class_t ac97_getmixerclass(void)
void ac97_destroy(struct ac97_info *codec)
int ac97_setrate(struct ac97_info *codec, int which, int rate)
#define AC97_CREATE(dev, devinfo, cls)
#define AC97_REGEXT_FDACRATE
#define AC97_REGEXT_LADCRATE
int sndbuf_alloc(struct snd_dbuf *b, bus_dma_tag_t dmatag, int dmaflags, unsigned int size)
bus_addr_t sndbuf_getbufaddr(struct snd_dbuf *buf)
unsigned int sndbuf_getsize(struct snd_dbuf *b)
int sndbuf_resize(struct snd_dbuf *b, unsigned int blkcnt, unsigned int blksz)
void chn_intr(struct pcm_channel *c)
#define PCMTRIG_COMMON(x)
int mixer_init(device_t dev, kobj_class_t cls, void *devinfo)
void * snd_mtxcreate(const char *desc, const char *type)
void * pcm_getdevinfo(device_t dev)
int pcm_setstatus(device_t dev, char *str)
void snd_mtxfree(void *m)
int pcm_addchan(device_t dev, int dir, kobj_class_t cls, void *devinfo)
int pcm_unregister(device_t dev)
int pcm_register(device_t dev, void *devinfo, int numplay, int numrec)
int snd_setup_intr(device_t dev, struct resource *res, int flags, driver_intr_t hand, void *param, void **cookiep)
unsigned int pcm_getbuffersize(device_t dev, unsigned int minbufsz, unsigned int deflt, unsigned int maxbufsz)
#define SND_FORMAT(f, c, e)
struct via_dma_op * sgd_table
struct pcm_channel * channel
struct via_chinfo rch[NWRCHANS]
struct via_dma_op * sgd_table
struct via_chinfo pch[NDXSCHANS+NMSGDCHANS]
bus_dma_tag_t parent_dmat
#define VIA_CODEC_PRIVALID
#define VIA_CODEC_INDEX(x)
static kobj_method_t viachan_methods[]
DRIVER_MODULE(snd_via82c686, pci, via_driver, pcm_devclass, 0, 0)
#define VIA_DEFAULT_BUFSZ
static __inline u_int32_t via_rd(struct via_info *via, int regno, int size)
static int via_waitvalid_codec(struct via_info *via)
static u_int32_t viachan_setblocksize(kobj_t obj, void *data, u_int32_t blocksize)
static void * viachan_init(kobj_t obj, void *devinfo, struct snd_dbuf *b, struct pcm_channel *c, int dir)
static device_method_t via_methods[]
static driver_t via_driver
static void dma_cb(void *p, bus_dma_segment_t *bds, int a, int b)
static u_int32_t via_fmt[]
static u_int32_t viachan_getptr(kobj_t obj, void *data)
static int via_waitready_codec(struct via_info *via)
static int via_attach(device_t dev)
static int via_buildsgdt(struct via_chinfo *ch)
static struct pcmchan_caps via_vracaps
static int via_read_codec(kobj_t obj, void *addr, int reg)
static int via_detach(device_t dev)
SND_DECLARE_FILE("$FreeBSD$")
static struct pcmchan_caps * viachan_getcaps(kobj_t obj, void *data)
static int viachan_setformat(kobj_t obj, void *data, u_int32_t format)
MODULE_VERSION(snd_via82c686, 1)
static u_int32_t viachan_setspeed(kobj_t obj, void *data, u_int32_t speed)
static int viachan_trigger(kobj_t obj, void *data, int go)
static void via_intr(void *p)
MODULE_DEPEND(snd_via82c686, sound, SOUND_MINVER, SOUND_PREFVER, SOUND_MAXVER)
static int via_write_codec(kobj_t obj, void *addr, int reg, u_int32_t val)
static kobj_method_t via_ac97_methods[]
static __inline void via_wr(struct via_info *via, int regno, u_int32_t data, int size)
static int via_probe(device_t dev)
static struct pcmchan_caps via_caps
#define VIA_AC97STATUS_RDY
#define VIA_PLAY_DMAOPS_BASE
#define VIA_RECORD_DMAOPS_BASE
#define VIA_RECORD_DMAOPS_COUNT
#define VIA_RECORD_CONTROL
#define VIA_RPCTRL_TERMINATE
#define VIA_ACLINK_DESIRED
#define VIA_RPMODE_INTR_FLAG
#define VIA_RPMODE_STEREO
#define VIA_PLAY_DMAOPS_COUNT
#define VIA_RPMODE_AUTOSTART
#define VIA_RPMODE_INTR_EOL