Lines Matching defs:fm801

36 SND_DECLARE_FILE("$FreeBSD: releng/11.0/sys/dev/sound/pci/fm801.c 297862 2016-04-12 17:23:03Z pfg $");
174 fm801_rd(struct fm801_info *fm801, int regno, int size)
178 return (bus_space_read_1(fm801->st, fm801->sh, regno));
180 return (bus_space_read_2(fm801->st, fm801->sh, regno));
182 return (bus_space_read_4(fm801->st, fm801->sh, regno));
189 fm801_wr(struct fm801_info *fm801, int regno, u_int32_t data, int size)
194 bus_space_write_1(fm801->st, fm801->sh, regno, data);
197 bus_space_write_2(fm801->st, fm801->sh, regno, data);
200 bus_space_write_4(fm801->st, fm801->sh, regno, data);
213 struct fm801_info *fm801 = (struct fm801_info *)devinfo;
216 for (i = 0; i < TIMO && fm801_rd(fm801,FM_CODEC_CMD,2) & FM_CODEC_CMD_BUSY; i++) {
218 DPRINT("fm801 rdcd: 1 - DELAY\n");
221 printf("fm801 rdcd: codec busy\n");
225 fm801_wr(fm801,FM_CODEC_CMD, regno|FM_CODEC_CMD_READ,2);
227 for (i = 0; i < TIMO && !(fm801_rd(fm801,FM_CODEC_CMD,2) & FM_CODEC_CMD_VALID); i++)
230 DPRINT("fm801 rdcd: 2 - DELAY\n");
233 printf("fm801 rdcd: write codec invalid\n");
237 return fm801_rd(fm801,FM_CODEC_DATA,2);
243 struct fm801_info *fm801 = (struct fm801_info *)devinfo;
251 for (i = 0; i < TIMO && fm801_rd(fm801,FM_CODEC_CMD,2) & FM_CODEC_CMD_BUSY; i++) {
253 DPRINT("fm801 rdcd: 1 - DELAY\n");
256 printf("fm801 wrcd: read codec busy\n");
260 fm801_wr(fm801,FM_CODEC_DATA,data, 2);
261 fm801_wr(fm801,FM_CODEC_CMD, regno,2);
264 for (i = 0; i < TIMO && fm801_rd(fm801,FM_CODEC_CMD,2) & FM_CODEC_CMD_BUSY; i++) {
266 DPRINT("fm801 wrcd: 2 - DELAY\n");
269 printf("fm801 wrcd: read codec busy\n");
272 DPRINT("fm801 wrcd release reg 0x%x val 0x%x\n",regno, data);
291 struct fm801_info *fm801 = (struct fm801_info *)p;
292 u_int32_t intsrc = fm801_rd(fm801, FM_INTSTATUS, 2);
297 fm801->play_flip++;
298 if(fm801->play_flip & 1) {
299 fm801_wr(fm801, FM_PLAY_DMABUF1, fm801->play_start,4);
301 fm801_wr(fm801, FM_PLAY_DMABUF2, fm801->play_nextblk,4);
302 chn_intr(fm801->pch.channel);
306 fm801->rec_flip++;
307 if(fm801->rec_flip & 1) {
308 fm801_wr(fm801, FM_REC_DMABUF1, fm801->rec_start,4);
310 fm801_wr(fm801, FM_REC_DMABUF2, fm801->rec_nextblk,4);
311 chn_intr(fm801->rch.channel);
316 fm801_wr(fm801, FM_INTSTATUS, intsrc & FM_INTSTATUS_MPU,2);
321 fm801_wr(fm801, FM_INTSTATUS, intsrc & FM_INTSTATUS_VOL,2);
325 fm801_wr(fm801, FM_INTSTATUS, intsrc & (FM_INTSTATUS_PLAY | FM_INTSTATUS_REC), 2);
333 struct fm801_info *fm801 = (struct fm801_info *)devinfo;
334 struct fm801_chinfo *ch = (dir == PCMDIR_PLAY)? &fm801->pch : &fm801->rch;
337 ch->parent = fm801;
341 if (sndbuf_alloc(ch->buffer, fm801->parent_dmat, 0, fm801->bufsz) != 0)
350 struct fm801_info *fm801 = ch->parent;
359 fm801->play_fmt =
361 fm801->play_fmt |= (format & AFMT_16BIT) ? FM_PLAY_16BIT : 0;
366 fm801->rec_fmt = (AFMT_CHANNEL(format) > 1)? FM_REC_STEREO:0;
367 fm801->rec_fmt |= (format & AFMT_16BIT) ? FM_PLAY_16BIT : 0;
396 struct fm801_info *fm801 = ch->parent;
403 fm801->pch.spd = fm801_rates[i].rate;
404 fm801->play_shift = (i<<8);
405 fm801->play_shift &= FM_PLAY_RATE_MASK;
409 fm801->rch.spd = fm801_rates[i].rate;
410 fm801->rec_shift = (i<<8);
411 fm801->rec_shift &= FM_REC_RATE_MASK;
423 struct fm801_info *fm801 = ch->parent;
431 fm801->play_blksize = blocksize;
434 fm801->rec_blksize = blocksize;
445 struct fm801_info *fm801 = ch->parent;
457 fm801->play_start = baseaddr;
458 fm801->play_nextblk = fm801->play_start + fm801->play_blksize;
459 fm801->play_flip = 0;
460 fm801_wr(fm801, FM_PLAY_DMALEN, fm801->play_blksize - 1, 2);
461 fm801_wr(fm801, FM_PLAY_DMABUF1,fm801->play_start,4);
462 fm801_wr(fm801, FM_PLAY_DMABUF2,fm801->play_nextblk,4);
463 fm801_wr(fm801, FM_PLAY_CTL,
464 FM_PLAY_START | FM_PLAY_STOPNOW | fm801->play_fmt | fm801->play_shift,
467 fm801->play_flip = 0;
468 k1 = fm801_rd(fm801, FM_PLAY_CTL,2);
469 fm801_wr(fm801, FM_PLAY_CTL,
475 fm801->rec_start = baseaddr;
476 fm801->rec_nextblk = fm801->rec_start + fm801->rec_blksize;
477 fm801->rec_flip = 0;
478 fm801_wr(fm801, FM_REC_DMALEN, fm801->rec_blksize - 1, 2);
479 fm801_wr(fm801, FM_REC_DMABUF1,fm801->rec_start,4);
480 fm801_wr(fm801, FM_REC_DMABUF2,fm801->rec_nextblk,4);
481 fm801_wr(fm801, FM_REC_CTL,
482 FM_REC_START | FM_REC_STOPNOW | fm801->rec_fmt | fm801->rec_shift,
485 fm801->rec_flip = 0;
486 k1 = fm801_rd(fm801, FM_REC_CTL,2);
487 fm801_wr(fm801, FM_REC_CTL,
501 struct fm801_info *fm801 = ch->parent;
505 result = fm801_rd(fm801,
506 (fm801->play_flip&1) ?
507 FM_PLAY_DMABUF2:FM_PLAY_DMABUF1, 4) - fm801->play_start;
511 result = fm801_rd(fm801,
512 (fm801->rec_flip&1) ?
513 FM_REC_DMABUF2:FM_REC_DMABUF1, 4) - fm801->rec_start;
543 fm801_init(struct fm801_info *fm801)
548 fm801_wr(fm801, FM_CODEC_CTL, 0x0020,2);
550 fm801_wr(fm801, FM_CODEC_CTL, 0x0000,2);
553 fm801_wr(fm801, FM_PCM_VOLUME, 0x0808,2);
554 fm801_wr(fm801, FM_FM_VOLUME, 0x0808,2);
555 fm801_wr(fm801, FM_I2S_VOLUME, 0x0808,2);
556 fm801_wr(fm801, 0x40,0x107f,2); /* enable legacy audio */
558 fm801_wr((void *)fm801, FM_RECORD_SOURCE, 0x0000,2);
561 k1 = fm801_rd((void *)fm801, FM_INTMASK,2);
562 fm801_wr(fm801, FM_INTMASK,
565 fm801_wr(fm801, FM_INTSTATUS,
577 struct fm801_info *fm801;
582 fm801 = malloc(sizeof(*fm801), M_DEVBUF, M_WAITOK | M_ZERO);
583 fm801->type = pci_get_devid(dev);
588 fm801->regid = PCIR_BAR(i);
589 fm801->regtype = SYS_RES_MEMORY;
590 fm801->reg = bus_alloc_resource_any(dev, fm801->regtype,
591 &fm801->regid, RF_ACTIVE);
592 if(!fm801->reg)
594 fm801->regtype = SYS_RES_IOPORT;
595 fm801->reg = bus_alloc_resource_any(dev,
596 fm801->regtype,
597 &fm801->regid,
601 if(fm801->reg) {
602 fm801->st = rman_get_bustag(fm801->reg);
603 fm801->sh = rman_get_bushandle(fm801->reg);
613 fm801->bufsz = pcm_getbuffersize(dev, 4096, FM801_DEFAULT_BUFSZ, 65536);
615 fm801_init(fm801);
617 codec = AC97_CREATE(dev, fm801, fm801_ac97);
622 fm801->irqid = 0;
623 fm801->irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &fm801->irqid,
625 if (!fm801->irq ||
626 snd_setup_intr(dev, fm801->irq, 0, fm801_intr, fm801, &fm801->ih)) {
636 /*maxsize*/fm801->bufsz, /*nsegments*/1, /*maxsegz*/0x3ffff,
638 /*lockarg*/&Giant, &fm801->parent_dmat) != 0) {
644 (fm801->regtype == SYS_RES_IOPORT)? "io" : "memory",
645 rman_get_start(fm801->reg), rman_get_start(fm801->irq),PCM_KLDSTRING(snd_fm801));
648 if (pcm_register(dev, fm801, FM801_MAXPLAYCH, 1)) goto oops;
649 pcm_addchan(dev, PCMDIR_PLAY, &fm801ch_class, fm801);
650 pcm_addchan(dev, PCMDIR_REC, &fm801ch_class, fm801);
653 fm801->radio = device_add_child(dev, "radio", -1);
660 if (fm801->reg) bus_release_resource(dev, fm801->regtype, fm801->regid, fm801->reg);
661 if (fm801->ih) bus_teardown_intr(dev, fm801->irq, fm801->ih);
662 if (fm801->irq) bus_release_resource(dev, SYS_RES_IRQ, fm801->irqid, fm801->irq);
663 if (fm801->parent_dmat) bus_dma_tag_destroy(fm801->parent_dmat);
664 free(fm801, M_DEVBUF);
672 struct fm801_info *fm801;
676 fm801 = pcm_getdevinfo(dev);
681 if (fm801->radio != NULL) {
682 r = device_delete_child(dev, fm801->radio);
685 fm801->radio = NULL;
692 bus_release_resource(dev, fm801->regtype, fm801->regid, fm801->reg);
693 bus_teardown_intr(dev, fm801->irq, fm801->ih);
694 bus_release_resource(dev, SYS_RES_IRQ, fm801->irqid, fm801->irq);
695 bus_dma_tag_destroy(fm801->parent_dmat);
696 free(fm801, M_DEVBUF);
723 struct fm801_info *fm801;
725 fm801 = pcm_getdevinfo(bus);
728 return (fm801->reg);