33#ifdef HAVE_KERNEL_OPTION_HEADERS
49#define CS461x_BUFFSIZE (4 * 1024)
51#define GOF_PER_SEC 200
178 u_long ulTemp1, ulTemp2;
180 u_long ulCorrectionPerGOF, ulCorrectionPerSec;
202 ulTemp1 = ulInRate << 16;
203 ulPhiIncr = ulTemp1 / ulOutRate;
204 ulTemp1 -= ulPhiIncr * ulOutRate;
207 ulTemp2 = ulTemp1 / ulOutRate;
208 ulPhiIncr += ulTemp2;
209 ulTemp1 -= ulTemp2 * ulOutRate;
212 ulCorrectionPerSec = ulTemp1;
224 u_long ulPhiIncr, ulCoeffIncr, ulTemp1, ulTemp2;
225 u_long ulCorrectionPerGOF, ulCorrectionPerSec, ulInitialDelay;
226 u_long dwFrameGroupLength, dwCnt;
235 if((ulOutRate * 9) < ulInRate)
242 if(ulOutRate > ulInRate)
266 ulTemp1 = ulOutRate << 16;
267 ulCoeffIncr = ulTemp1 / ulInRate;
268 ulTemp1 -= ulCoeffIncr * ulInRate;
271 ulCoeffIncr += ulTemp1 / ulInRate;
272 ulCoeffIncr ^= 0xFFFFFFFF;
274 ulTemp1 = ulInRate << 16;
275 ulPhiIncr = ulTemp1 / ulOutRate;
276 ulTemp1 -= ulPhiIncr * ulOutRate;
279 ulTemp2 = ulTemp1 / ulOutRate;
280 ulPhiIncr += ulTemp2;
281 ulTemp1 -= ulTemp2 * ulOutRate;
284 ulCorrectionPerSec = ulTemp1;
285 ulInitialDelay = ((ulInRate * 24) + ulOutRate - 1) / ulOutRate;
291 ((ulCorrectionPerSec << 16) & 0xFFFF0000) | (ulCorrectionPerGOF & 0xFFFF));
302 dwFrameGroupLength = 1;
303 for(dwCnt = 2; dwCnt <= 64; dwCnt *= 2)
305 if(((ulOutRate / dwCnt) * dwCnt) !=
308 dwFrameGroupLength *= 2;
311 if(((ulOutRate / 3) * 3) !=
314 dwFrameGroupLength *= 3;
316 for(dwCnt = 5; dwCnt <= 125; dwCnt *= 5)
318 if(((ulOutRate / dwCnt) * dwCnt) !=
321 dwFrameGroupLength *= 5;
376 csa->
pctl = ul & 0xffff0000;
403 csa->
cctl = ul & 0x0000ffff;
443 for (i = 0 ; i < 25 ; i++) {
609 if ((ch->
fmt & AFMT_U8) != 0 || (ch->
fmt & AFMT_S8) != 0)
613 if ((ch->
fmt & AFMT_U8) != 0 || (ch->
fmt & AFMT_S8) != 0)
694 if (
resp->io == NULL) {
695 resp->io = bus_alloc_resource_any(
dev, SYS_RES_MEMORY,
696 &
resp->io_rid, RF_ACTIVE);
697 if (
resp->io == NULL)
700 if (
resp->mem == NULL) {
701 resp->mem = bus_alloc_resource_any(
dev, SYS_RES_MEMORY,
702 &
resp->mem_rid, RF_ACTIVE);
703 if (
resp->mem == NULL)
706 if (
resp->irq == NULL) {
707 resp->irq = bus_alloc_resource_any(
dev, SYS_RES_IRQ,
708 &
resp->irq_rid, RF_ACTIVE | RF_SHAREABLE);
709 if (
resp->irq == NULL)
712 if (bus_dma_tag_create(bus_get_dma_tag(
dev),
715 BUS_SPACE_MAXADDR_32BIT,
732 KASSERT(csa != NULL, (
"called with bogus resource structure"));
735 if (
resp->irq != NULL) {
737 bus_teardown_intr(
dev,
resp->irq, csa->
ih);
738 bus_release_resource(
dev, SYS_RES_IRQ,
resp->irq_rid,
resp->irq);
741 if (
resp->io != NULL) {
742 bus_release_resource(
dev, SYS_RES_MEMORY,
resp->io_rid,
resp->io);
745 if (
resp->mem != NULL) {
746 bus_release_resource(
dev, SYS_RES_MEMORY,
resp->mem_rid,
resp->mem);
769 s =
"CS461x PCM Audio";
771 device_set_desc(
dev, s);
785 csa = malloc(
sizeof(*csa), M_DEVBUF, M_WAITOK | M_ZERO);
786 unit = device_get_unit(
dev);
794 csa->pch.dma = csa->
rch.
dma = 1;
873 for (
count = 0x2, i=0;
935 for (
count = 0x2, i=0;
kobj_class_t ac97_getmixerclass(void)
void ac97_destroy(struct ac97_info *codec)
void ac97_setflags(struct ac97_info *codec, u_int32_t val)
#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)
void chn_intr(struct pcm_channel *c)
#define PCMTRIG_COMMON(x)
u_int32_t csa_readmem(csa_res *resp, u_long offset)
void csa_writemem(csa_res *resp, u_long offset, u_int32_t data)
void csa_writeio(csa_res *resp, u_long offset, u_int32_t data)
void csa_resetdsp(csa_res *resp)
int csa_writecodec(csa_res *resp, u_long offset, u_int32_t data)
u_int32_t csa_readio(csa_res *resp, u_long offset)
void csa_clearserialfifos(csa_res *resp)
int csa_readcodec(csa_res *resp, u_long offset, u_int32_t *data)
static struct pcmchan_caps csa_playcaps
static void csa_startplaydma(struct csa_info *csa)
static void csa_startcapturedma(struct csa_info *csa)
static struct pcmchan_caps * csachan_getcaps(kobj_t obj, void *data)
static int pcmcsa_detach(device_t dev)
static u_int32_t csachan_setblocksize(kobj_t obj, void *data, u_int32_t blocksize)
static int csa_allocres(struct csa_info *scp, device_t dev)
static int pcmcsa_resume(device_t dev)
static void * csachan_init(kobj_t obj, void *devinfo, struct snd_dbuf *b, struct pcm_channel *c, int dir)
MODULE_DEPEND(snd_csapcm, sound, SOUND_MINVER, SOUND_PREFVER, SOUND_MAXVER)
static u_int32_t csachan_setspeed(kobj_t obj, void *data, u_int32_t speed)
static int csa_rdcd(kobj_t obj, void *devinfo, int regno)
static kobj_method_t csa_ac97_methods[]
SND_DECLARE_FILE("$FreeBSD$")
static void csa_releaseres(struct csa_info *scp, device_t dev)
static void csa_stopcapturedma(struct csa_info *csa)
DRIVER_MODULE(snd_csapcm, csa, pcmcsa_driver, pcm_devclass, 0, 0)
static int csa_wrcd(kobj_t obj, void *devinfo, int regno, u_int32_t data)
static int pcmcsa_attach(device_t dev)
static int csa_startdsp(csa_res *resp)
static int pcmcsa_probe(device_t dev)
static void csa_intr(void *)
static void csa_setcapturesamplerate(csa_res *resp, u_long ulOutRate)
static int csa_stopdsp(csa_res *resp)
static void csa_ac97_suspend(struct csa_info *csa)
static void csa_ac97_resume(struct csa_info *csa)
static u_int32_t csa_playfmt[]
static u_int32_t csa_recfmt[]
static driver_t pcmcsa_driver
MODULE_VERSION(snd_csapcm, 1)
static int csachan_trigger(kobj_t obj, void *data, int go)
static device_method_t pcmcsa_methods[]
static int csa_init(struct csa_info *)
static void csa_stopplaydma(struct csa_info *csa)
static void csa_setplaysamplerate(csa_res *resp, u_long ulInRate)
static int pcmcsa_suspend(device_t dev)
static int csachan_setformat(kobj_t obj, void *data, u_int32_t format)
static u_int32_t csachan_getptr(kobj_t obj, void *data)
static int csa_active(struct csa_info *csa, int run)
static kobj_method_t csachan_methods[]
static int csa_setupchan(struct csa_chinfo *ch)
static struct pcmchan_caps csa_reccaps
#define CS461x_AC97_NUMBER_RESTORE_REGS
#define BA0_AC97_POWERDOWN
#define CS_AC97_POWER_CONTROL_MIXVON
#define BA0_AC97_HEADPHONE_VOLUME
#define BA0_AC97_PCM_OUT_VOLUME
#define CS461x_AC97_HIGHESTREGTORESTORE
#define BA0_AC97_GENERAL_PURPOSE
#define BA0_AC97_MASTER_VOLUME
#define CS_AC97_POWER_CONTROL_ADC
#define BA0_AC97_MASTER_VOLUME_MONO
#define CS_AC97_POWER_CONTROL_DAC
#define BA1_VARIDEC_BUF_1
int mixer_init(device_t dev, kobj_class_t cls, void *devinfo)
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)
#define SND_FORMAT(f, c, e)
struct pcm_channel * channel
u_int32_t ac97_general_purpose
bus_dma_tag_t parent_dmat
struct csa_chinfo pch rch
struct csa_bridgeinfo * binfo
u_int32_t ac97[CS461x_AC97_NUMBER_RESTORE_REGS]