29#ifdef HAVE_KERNEL_OPTION_HEADERS
40#define PCI_VENDOR_FORTEMEDIA 0x1319
41#define PCI_DEVICE_FORTEMEDIA1 0x08011319
42#define PCI_DEVICE_FORTEMEDIA2 0x08021319
44#define FM_PCM_VOLUME 0x00
45#define FM_FM_VOLUME 0x02
46#define FM_I2S_VOLUME 0x04
47#define FM_RECORD_SOURCE 0x06
49#define FM_PLAY_CTL 0x08
50#define FM_PLAY_RATE_MASK 0x0f00
51#define FM_PLAY_BUF1_LAST 0x0001
52#define FM_PLAY_BUF2_LAST 0x0002
53#define FM_PLAY_START 0x0020
54#define FM_PLAY_PAUSE 0x0040
55#define FM_PLAY_STOPNOW 0x0080
56#define FM_PLAY_16BIT 0x4000
57#define FM_PLAY_STEREO 0x8000
59#define FM_PLAY_DMALEN 0x0a
60#define FM_PLAY_DMABUF1 0x0c
61#define FM_PLAY_DMABUF2 0x10
63#define FM_REC_CTL 0x14
64#define FM_REC_RATE_MASK 0x0f00
65#define FM_REC_BUF1_LAST 0x0001
66#define FM_REC_BUF2_LAST 0x0002
67#define FM_REC_START 0x0020
68#define FM_REC_PAUSE 0x0040
69#define FM_REC_STOPNOW 0x0080
70#define FM_REC_16BIT 0x4000
71#define FM_REC_STEREO 0x8000
73#define FM_REC_DMALEN 0x16
74#define FM_REC_DMABUF1 0x18
75#define FM_REC_DMABUF2 0x1c
77#define FM_CODEC_CTL 0x22
79#define FM_VOLUME_MUTE 0x8000
81#define FM_CODEC_CMD 0x2a
82#define FM_CODEC_CMD_READ 0x0080
83#define FM_CODEC_CMD_VALID 0x0100
84#define FM_CODEC_CMD_BUSY 0x0200
86#define FM_CODEC_DATA 0x2c
89#define FM_CARD_CTL 0x54
91#define FM_INTMASK 0x56
92#define FM_INTMASK_PLAY 0x0001
93#define FM_INTMASK_REC 0x0002
94#define FM_INTMASK_VOL 0x0040
95#define FM_INTMASK_MPU 0x0080
97#define FM_INTSTATUS 0x5a
98#define FM_INTSTATUS_PLAY 0x0100
99#define FM_INTSTATUS_REC 0x0200
100#define FM_INTSTATUS_VOL 0x4000
101#define FM_INTSTATUS_MPU 0x8000
103#define FM801_DEFAULT_BUFSZ 4096
106#define DPRINT if(0) printf
138 bus_space_handle_t
sh;
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));
218 DPRINT(
"fm801 rdcd: 1 - DELAY\n");
221 printf(
"fm801 rdcd: codec busy\n");
230 DPRINT(
"fm801 rdcd: 2 - DELAY\n");
233 printf(
"fm801 rdcd: write codec invalid\n");
253 DPRINT(
"fm801 rdcd: 1 - DELAY\n");
256 printf(
"fm801 wrcd: read codec busy\n");
266 DPRINT(
"fm801 wrcd: 2 - DELAY\n");
269 printf(
"fm801 wrcd: read codec busy\n");
294 DPRINT(
"\nfm801_intr intsrc 0x%x ", intsrc);
324 DPRINT(
"fm801_intr clear\n\n");
336 DPRINT(
"fm801ch_init, direction = %d\n",
dir);
352 DPRINT(
"fm801ch_setformat 0x%x : %s, %s, %s, %s\n",
format,
448 DPRINT(
"fm801ch_trigger go %d , ",
go);
500 u_int32_t result = 0;
567 DPRINT(
"FM801 init Ok\n");
580 fm801 = malloc(
sizeof(*fm801), M_DEVBUF, M_WAITOK | M_ZERO);
581 fm801->
type = pci_get_devid(
dev);
583 pci_enable_busmaster(
dev);
587 fm801->
regtype = SYS_RES_MEMORY;
589 &fm801->
regid, RF_ACTIVE);
592 fm801->
regtype = SYS_RES_IOPORT;
593 fm801->
reg = bus_alloc_resource_any(
dev,
600 fm801->
st = rman_get_bustag(fm801->
reg);
601 fm801->
sh = rman_get_bushandle(fm801->
reg);
607 device_printf(
dev,
"unable to map register space\n");
616 if (codec == NULL)
goto oops;
621 fm801->
irq = bus_alloc_resource_any(
dev, SYS_RES_IRQ, &fm801->
irqid,
622 RF_ACTIVE | RF_SHAREABLE);
625 device_printf(
dev,
"unable to map interrupt\n");
629 if (bus_dma_tag_create(bus_get_dma_tag(
dev), 2,
631 BUS_SPACE_MAXADDR_32BIT,
634 fm801->
bufsz, 1, 0x3ffff,
637 device_printf(
dev,
"unable to create dma tag\n");
641 snprintf(
status, 64,
"at %s 0x%jx irq %jd %s",
642 (fm801->
regtype == SYS_RES_IOPORT)?
"io" :
"memory",
645#define FM801_MAXPLAYCH 1
651 fm801->
radio = device_add_child(
dev,
"radio", -1);
652 bus_generic_attach(
dev);
659 if (fm801->
ih) bus_teardown_intr(
dev, fm801->
irq, fm801->
ih);
660 if (fm801->
irq) bus_release_resource(
dev, SYS_RES_IRQ, fm801->
irqid, fm801->
irq);
662 free(fm801, M_DEVBUF);
672 DPRINT(
"Forte Media FM801 detach\n");
676 r = bus_generic_detach(
dev);
679 if (fm801->
radio != NULL) {
680 r = device_delete_child(
dev, fm801->
radio);
691 bus_teardown_intr(
dev, fm801->
irq, fm801->
ih);
692 bus_release_resource(
dev, SYS_RES_IRQ, fm801->
irqid, fm801->
irq);
694 free(fm801, M_DEVBUF);
704 device_set_desc(
dev,
"Forte Media FM801 Audio Controller");
705 return BUS_PROBE_DEFAULT;
716static struct resource *
718 rman_res_t start, rman_res_t end, rman_res_t
count,
743 DEVMETHOD(device_shutdown, bus_generic_shutdown),
744 DEVMETHOD(device_suspend, bus_generic_suspend),
745 DEVMETHOD(device_resume, bus_generic_resume),
750 DEVMETHOD(bus_activate_resource, bus_generic_activate_resource),
751 DEVMETHOD(bus_deactivate_resource, bus_generic_deactivate_resource),
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)
void chn_intr(struct pcm_channel *c)
#define PCMTRIG_COMMON(x)
#define FM_PLAY_BUF2_LAST
static int fm801_rdcd(kobj_t obj, void *devinfo, int regno)
#define FM_CODEC_CMD_BUSY
static int fm801_pci_probe(device_t dev)
static int fm801_pci_detach(device_t dev)
static void fm801_intr(void *p)
static int fm801ch_trigger(kobj_t obj, void *data, int go)
#define FM801_DEFAULT_BUFSZ
static void * fm801ch_init(kobj_t obj, void *devinfo, struct snd_dbuf *b, struct pcm_channel *c, int dir)
static u_int32_t fm801ch_setblocksize(kobj_t obj, void *data, u_int32_t blocksize)
static int fm801ch_setformat(kobj_t obj, void *data, u_int32_t format)
SND_DECLARE_FILE("$FreeBSD$")
static int fm801_wrcd(kobj_t obj, void *devinfo, int regno, u_int32_t data)
static driver_t fm801_driver
#define FM_CODEC_CMD_VALID
MODULE_DEPEND(snd_fm801, sound, SOUND_MINVER, SOUND_PREFVER, SOUND_MAXVER)
#define PCI_DEVICE_FORTEMEDIA1
static u_int32_t fm801ch_setspeed(kobj_t obj, void *data, u_int32_t speed)
static int fm801_release_resource(device_t bus, device_t child, int type, int rid, struct resource *r)
static void fm801_wr(struct fm801_info *fm801, int regno, u_int32_t data, int size)
MODULE_VERSION(snd_fm801, 1)
static u_int32_t fm801_rd(struct fm801_info *fm801, int regno, int size)
static kobj_method_t fm801ch_methods[]
static kobj_method_t fm801_ac97_methods[]
#define FM_INTSTATUS_PLAY
static struct pcmchan_caps fm801ch_caps
static u_int32_t fm801ch_getptr(kobj_t obj, void *data)
#define FM_PLAY_BUF1_LAST
struct @8 fm801_rates[11]
static device_method_t fm801_methods[]
static int fm801_init(struct fm801_info *fm801)
DRIVER_MODULE(snd_fm801, pci, fm801_driver, pcm_devclass, 0, 0)
static struct pcmchan_caps * fm801ch_getcaps(kobj_t obj, void *data)
static struct resource * fm801_alloc_resource(device_t bus, device_t child, int type, int *rid, rman_res_t start, rman_res_t end, rman_res_t count, u_int flags)
#define FM_PLAY_RATE_MASK
#define FM_CODEC_CMD_READ
static int fm801_pci_attach(device_t dev)
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)
unsigned int pcm_getbuffersize(device_t dev, unsigned int minbufsz, unsigned int deflt, unsigned int maxbufsz)
#define SND_FORMAT(f, c, e)
struct pcm_channel * channel
struct fm801_info * parent
bus_dma_tag_t parent_dmat
struct fm801_chinfo pch rch