36#ifdef HAVE_KERNEL_OPTION_HEADERS
50#define CS4281_DEFAULT_BUFSZ 16384
53#define CS4281_FIFO_SIZE 15
56#define CS4281_DMA_PLAY 0
57#define CS4281_DMA_REC 1
61#define inline __inline
90 bus_space_handle_t
sh;
148static inline u_int32_t
151 return bus_space_read_4(sc->
st, sc->
sh,
regno);
198 v = ~ cs4281_rd(sc,
regno);
208static u_int32_t
cs4281_rates[] = {48000, 44100, 22050, 16000, 11025, 8000};
209#define CS4281_NUM_RATES sizeof(cs4281_rates)/sizeof(cs4281_rates[0])
221 if (v > 255 || v < 32) v = 5;
235static inline u_int32_t
246static inline u_int32_t
262 codecno =
regno >> 8;
277 device_printf(sc->
dev,
"cs4281_rdcd: DCV did not go\n");
283 device_printf(sc->
dev,
"cs4281_rdcd: VSTS did not come\n");
296 codecno =
regno >> 8;
305 device_printf(sc->
dev,
"cs4281_wrcd: DCV did not go\n");
418 u_int32_t dba, dca, ptr;
424 ptr = (dca - dba + sz) % sz;
521 if (hisr == 0)
return;
600 device_printf(sc->
dev,
"Clock stabilization failed\n");
615 device_printf(sc->
dev,
"codec did not avail\n");
626 for(i = 0 ; i < 1000; i++) {
629 if ((v & 0x0f) == 0x0f) {
634 device_printf(sc->
dev,
"codec failed to calibrate\n");
646 device_printf(sc->
dev,
"cs4281 never got valid data\n");
664 for(i = 0; i < 320; i++) {
675 for(i = 0; i < 320; i++) {
749 switch (pci_get_devid(
dev)) {
751 s =
"Crystal Semiconductor CS4281";
756 device_set_desc(
dev, s);
757 return s ? BUS_PROBE_DEFAULT : ENXIO;
767 sc = malloc(
sizeof(*sc), M_DEVBUF, M_WAITOK | M_ZERO);
771 pci_enable_busmaster(
dev);
773 if (pci_get_powerstate(
dev) != PCI_POWERSTATE_D0) {
775 device_printf(
dev,
"chip is in D%d power mode "
776 "-- setting to D0\n", pci_get_powerstate(
dev));
778 pci_set_powerstate(
dev, PCI_POWERSTATE_D0);
789 device_printf(
dev,
"unable to allocate register space\n");
793 sc->
st = rman_get_bustag(sc->
reg);
794 sc->
sh = rman_get_bushandle(sc->
reg);
797 sc->
mem = bus_alloc_resource_any(
dev, SYS_RES_MEMORY, &sc->
memid,
799 if (sc->
mem == NULL) {
800 device_printf(
dev,
"unable to allocate fifo space\n");
805 sc->
irq = bus_alloc_resource_any(
dev, SYS_RES_IRQ, &sc->
irqid,
806 RF_ACTIVE | RF_SHAREABLE);
808 device_printf(
dev,
"unable to allocate interrupt\n");
813 device_printf(
dev,
"unable to setup interrupt\n");
819 if (bus_dma_tag_create(bus_get_dma_tag(
dev), 2,
821 BUS_SPACE_MAXADDR_32BIT,
828 device_printf(
dev,
"unable to create dma tag\n");
837 device_printf(
dev,
"unable to initialize the card\n");
855 (sc->
regtype == SYS_RES_IOPORT)?
"io" :
"memory",
867 bus_release_resource(
dev, SYS_RES_MEMORY, sc->
memid, sc->
mem);
869 bus_teardown_intr(
dev, sc->
irq, sc->
ih);
871 bus_release_resource(
dev, SYS_RES_IRQ, sc->
irqid, sc->
irq);
895 bus_release_resource(
dev, SYS_RES_MEMORY, sc->
memid, sc->
mem);
896 bus_teardown_intr(
dev, sc->
irq, sc->
ih);
897 bus_release_resource(
dev, SYS_RES_IRQ, sc->
irqid, sc->
irq);
931 device_printf(
dev,
"unable to reinitialize the card\n");
937 device_printf(
dev,
"unable to reinitialize the mixer\n");
kobj_class_t ac97_getmixerclass(void)
void ac97_destroy(struct ac97_info *codec)
#define AC97_CREATE(dev, devinfo, cls)
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)
static int cs4281_pci_resume(device_t dev)
static struct pcmchan_caps * cs4281chan_getcaps(kobj_t obj, void *data)
static void cs4281_intr(void *)
static struct pcmchan_caps cs4281_caps
static u_int32_t cs4281_rates[]
MODULE_DEPEND(snd_cs4281, sound, SOUND_MINVER, SOUND_PREFVER, SOUND_MAXVER)
static u_int32_t adcdac_go(struct sc_chinfo *ch, u_int32_t go)
static int cs4281_init(struct sc_info *)
static driver_t cs4281_driver
static int cs4281_pci_attach(device_t dev)
static u_int32_t cs4281_format_to_bps(u_int32_t)
static void cs4281_set4(struct sc_info *sc, int regno, u_int32_t mask)
static int cs4281_pci_detach(device_t dev)
static int cs4281_pci_suspend(device_t dev)
static u_int32_t cs4281chan_setblocksize(kobj_t obj, void *data, u_int32_t blocksize)
static u_int32_t cs4281_fmts[]
SND_DECLARE_FILE("$FreeBSD$")
static device_method_t cs4281_methods[]
static u_int32_t cs4281chan_getptr(kobj_t obj, void *data)
static u_int32_t cs4281_format_to_dmr(u_int32_t)
static int cs4281chan_trigger(kobj_t obj, void *data, int go)
static void adcdac_prog(struct sc_chinfo *ch)
static int cs4281_waitclr(struct sc_info *sc, int regno, u_int32_t mask, int tries)
static int cs4281_power(struct sc_info *, int)
static u_int32_t cs4281_rv_to_rate(u_int8_t rv)
#define CS4281_DEFAULT_BUFSZ
static void * cs4281chan_init(kobj_t obj, void *devinfo, struct snd_dbuf *b, struct pcm_channel *c, int dir)
static int cs4281_waitset(struct sc_info *sc, int regno, u_int32_t mask, int tries)
static void cs4281_wr(struct sc_info *, int, u_int32_t)
static int cs4281_rdcd(kobj_t obj, void *devinfo, int regno)
static kobj_method_t cs4281chan_methods[]
static int cs4281_pci_probe(device_t dev)
static u_int32_t cs4281_rd(struct sc_info *, int)
DRIVER_MODULE(snd_cs4281, pci, cs4281_driver, pcm_devclass, 0, 0)
static int cs4281chan_setformat(kobj_t obj, void *data, u_int32_t format)
static int cs4281_wrcd(kobj_t obj, void *devinfo, int regno, u_int32_t data)
static u_int8_t cs4281_rate_to_rv(u_int32_t)
CHANNEL_DECLARE(cs4281chan)
AC97_DECLARE(cs4281_ac97)
MODULE_VERSION(snd_cs4281, 1)
static u_int32_t cs4281chan_setspeed(kobj_t obj, void *data, u_int32_t speed)
static kobj_method_t cs4281_ac97_methods[]
static void cs4281_clr4(struct sc_info *sc, int regno, u_int32_t mask)
#define CS4281PCI_SRCSA_PRSS(x)
#define CS4281PCI_DCR_TCIE
#define CS4281PCI_HIMR_DMAI
#define CS4281PCI_DMR_MONO
#define CS4281PCI_LPCM_PLAY_SLOT
#define CS4281PCI_SSPM_ACLEN
#define CS4281PCI_RPCM_REC_SLOT
#define CS4281PCI_FCR_SZ(x)
#define CS4281PCI_SSPM_MIXEN
#define CS4281PCI_ACCTL_ESYN
#define CS4281PCI_CLKCR1_SWCE
#define CS4281PCI_FCR_OF(x)
#define CS4281PCI_FCR_LS(x)
#define CS4281PCI_RPCM_PLAY_SLOT
#define CS4281PCI_HISR_DMA(x)
#define CS4281PCI_DMR_USIGN
#define CS4281PCI_SRCSA_PLSS(x)
#define CS4281PCI_ACOSV_SLV(x)
#define CS4281PCI_DMR_TR_REC
#define CS4281PCI_SPMC_RSTN
#define CS4281PCI_DMR_DMA
#define CS4281PCI_DCR_HTCIE
#define CS4281PCI_DMR_AUTO
#define CS4281PCI_SERMC_PTC_AC97
#define CS4281PCI_HIMR_DMA(x)
#define CS4281PCI_FCR_PSH
#define CS4281PCI_ACSTS_CRDY
#define CS4281PCI_CLKCR1_DLLRDY
#define CS4281PCI_FCR_RS(x)
#define CS4281PCI_DMR_TR_PLAY
#define CS4281PCI_CWPR_MAGIC
#define CS4281PCI_FCR_FEN
#define CS4281PCI_ACCTL_DCV
#define CS4281PCI_HICR_EOI
#define CS4281PCI_HDSR(x)
#define CS4281PCI_ACSTS_VSTS
#define CS4281PCI_ACISV_ISV(x)
#define CS4281PCI_DMR_BEND
#define CS4281PCI_CLKCR1_DLLP
#define CS4281PCI_DMR_SIZE8
#define CS4281PCI_SRCSA_CLSS(x)
#define CS4281PCI_SSPM_CSRCEN
#define CS4281PCI_SSPM_PSRCEN
#define CS4281PCI_LPCM_REC_SLOT
#define CS4281PCI_DCR_MSK
#define CS4281PCI_ACCTL_CRW
#define CS4281PCI_SRCSA_CRSS(x)
#define CS4281PCI_ACCTL_VFRM
#define CS4281PCI_EPPMC_FPDN
int mixer_init(device_t dev, kobj_class_t cls, void *devinfo)
int mixer_reinit(device_t dev)
void * pcm_getdevinfo(device_t dev)
int pcm_setstatus(device_t dev, char *str)
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)
#define DSP_DEFAULT_SPEED
struct pcm_channel * channel
bus_dma_tag_t parent_dmat