Changeset View
Changeset View
Standalone View
Standalone View
sys/dev/sound/pci/emu10k1.c
Show First 20 Lines • Show All 47 Lines • ▼ Show 20 Lines | |||||
/* -------------------------------------------------------------------- */ | /* -------------------------------------------------------------------- */ | ||||
#define NUM_G 64 /* use all channels */ | #define NUM_G 64 /* use all channels */ | ||||
#define WAVEOUT_MAXBUFSIZE 32768 | #define WAVEOUT_MAXBUFSIZE 32768 | ||||
#define EMUPAGESIZE 4096 /* don't change */ | #define EMUPAGESIZE 4096 /* don't change */ | ||||
#define EMUMAXPAGES (WAVEOUT_MAXBUFSIZE * NUM_G / EMUPAGESIZE) | #define EMUMAXPAGES (WAVEOUT_MAXBUFSIZE * NUM_G / EMUPAGESIZE) | ||||
#define EMU10K1_PCI_ID 0x00021102 /* 1102 => Creative Labs Vendor ID */ | #define EMU10K1_PCI_ID 0x00021102 /* 1102 => Creative Labs Vendor ID */ | ||||
#define EMU10K2_PCI_ID 0x00041102 | #define EMU10K2_PCI_ID 0x00041102 | ||||
#define EMU10K3_PCI_ID 0x00081102 | #define EMU10K3_PCI_ID 0x00081102 | ||||
#define CREATIVE_LABS_VENDOR_ID 0x1102 | |||||
#define EMU10K1_DEVICE_ID 0x0002 | |||||
#define EMU10K2_DEVICE_ID 0x0004 | |||||
#define EMU10K3_DEVICE_ID 0x0008 | |||||
#define EMU_DEFAULT_BUFSZ 4096 | #define EMU_DEFAULT_BUFSZ 4096 | ||||
#define EMU_MAX_CHANS 8 | #define EMU_MAX_CHANS 8 | ||||
#define EMU_CHANS 4 | #define EMU_CHANS 4 | ||||
#define MAXREQVOICES 8 | #define MAXREQVOICES 8 | ||||
#define RESERVED 0 | #define RESERVED 0 | ||||
#define NUM_MIDI 16 | #define NUM_MIDI 16 | ||||
#define NUM_FXSENDS 4 | #define NUM_FXSENDS 4 | ||||
▲ Show 20 Lines • Show All 87 Lines • ▼ Show 20 Lines | |||||
#define A_EXTOUT_ALFE 0x0b | #define A_EXTOUT_ALFE 0x0b | ||||
#define A_EXTOUT_AREAR_L 0x0e | #define A_EXTOUT_AREAR_L 0x0e | ||||
#define A_EXTOUT_AREAR_R 0x0f | #define A_EXTOUT_AREAR_R 0x0f | ||||
#define A_EXTOUT_AC97_L 0x10 | #define A_EXTOUT_AC97_L 0x10 | ||||
#define A_EXTOUT_AC97_R 0x11 | #define A_EXTOUT_AC97_R 0x11 | ||||
#define A_EXTOUT_ADC_CAP_L 0x16 | #define A_EXTOUT_ADC_CAP_L 0x16 | ||||
#define A_EXTOUT_ADC_CAP_R 0x17 | #define A_EXTOUT_ADC_CAP_R 0x17 | ||||
static struct emu_pci_dev { | struct pci_device_table emu_pci_devs[] = { | ||||
uint32_t devid; | {PCI_DEV(CREATIVE_LABS_VENDOR_ID, EMU10K1_DEVICE_ID), | ||||
const char *description; | PCI_DESCR("Creative EMU10K1"), PCI_REVID(0)}, | ||||
uint8_t rev; | {PCI_DEV(CREATIVE_LABS_VENDOR_ID, EMU10K2_DEVICE_ID), | ||||
} emu_pci_devs[] = { | PCI_DESCR("Creative Audigy (EMU10K2)"), PCI_REVID(0)}, | ||||
{EMU10K1_PCI_ID, "Creative EMU10K1", 0}, | {PCI_DEV(CREATIVE_LABS_VENDOR_ID, EMU10K2_DEVICE_ID), | ||||
{EMU10K2_PCI_ID, "Creative Audigy (EMU10K2)", 0}, | PCI_DESCR("Creative Audigy 2 (EMU10K2)"), PCI_REVID(0x04)}, | ||||
{EMU10K2_PCI_ID, "Creative Audigy 2 (EMU10K2)", 0x04}, | {PCI_DEV(CREATIVE_LABS_VENDOR_ID, EMU10K3_DEVICE_ID), | ||||
{EMU10K3_PCI_ID, "Creative Audigy 2 (EMU10K3)", 0}, | PCI_DESCR("Creative Audigy 2 (EMU10K3)"), PCI_REVID(0)} | ||||
{0, 0, 0}, | |||||
}; | }; | ||||
static struct emujoy_pci_dev { | struct pci_device_table emujoy_pci_devs[] = { | ||||
uint32_t devid; | {PCI_DEV(0x1102, 0x7002), | ||||
const char *description; | PCI_DESCR("Creative EMU10K1 Joystick")}, | ||||
} emujoy_pci_devs[] = { | {PCI_DEV(0x1102, 0x7003), | ||||
{0x70021102, "Creative EMU10K1 Joystick"}, | PCI_DESCR("Creative EMU10K2 Joystick")} | ||||
{0x70031102, "Creative EMU10K2 Joystick"}, | |||||
{0, 0}, | |||||
}; | }; | ||||
struct emu_memblk { | struct emu_memblk { | ||||
SLIST_ENTRY(emu_memblk) link; | SLIST_ENTRY(emu_memblk) link; | ||||
void *buf; | void *buf; | ||||
bus_addr_t buf_addr; | bus_addr_t buf_addr; | ||||
u_int32_t pte_start, pte_size; | u_int32_t pte_start, pte_size; | ||||
bus_dmamap_t buf_map; | bus_dmamap_t buf_map; | ||||
▲ Show 20 Lines • Show All 1,873 Lines • ▼ Show 20 Lines | emu_uninit(struct sc_info *sc) | ||||
if(sc->mpu) | if(sc->mpu) | ||||
mpu401_uninit(sc->mpu); | mpu401_uninit(sc->mpu); | ||||
return 0; | return 0; | ||||
} | } | ||||
static int | static int | ||||
emu_pci_probe(device_t dev) | emu_pci_probe(device_t dev) | ||||
{ | { | ||||
const struct emu_pci_dev *emud; | const struct pci_device_table *emud; | ||||
uint32_t devid; | |||||
size_t i; | |||||
uint8_t rev; | |||||
devid = pci_get_devid(dev); | emud = PCI_MATCH(dev, emu_pci_devs); | ||||
rev = pci_get_revid(dev); | if (emud == NULL) | ||||
for (i = 0; i < nitems(emu_pci_devs); i++) { | return (ENXIO); | ||||
emud = &emu_pci_devs[i]; | device_set_desc(dev, emud->descr); | ||||
if ((emud->devid == devid) && | return (BUS_PROBE_LOW_PRIORITY); | ||||
((emud->rev == rev) || emud->rev == 0)) { | |||||
device_set_desc(dev, emud->description); | |||||
return BUS_PROBE_LOW_PRIORITY; | |||||
} | } | ||||
} | |||||
return ENXIO; | |||||
} | |||||
static int | static int | ||||
emu_pci_attach(device_t dev) | emu_pci_attach(device_t dev) | ||||
{ | { | ||||
struct ac97_info *codec = NULL; | struct ac97_info *codec = NULL; | ||||
struct sc_info *sc; | struct sc_info *sc; | ||||
int i, gotmic; | int i, gotmic; | ||||
▲ Show 20 Lines • Show All 116 Lines • ▼ Show 20 Lines | |||||
static driver_t emu_driver = { | static driver_t emu_driver = { | ||||
"pcm", | "pcm", | ||||
emu_methods, | emu_methods, | ||||
PCM_SOFTC_SIZE, | PCM_SOFTC_SIZE, | ||||
}; | }; | ||||
DRIVER_MODULE(snd_emu10k1, pci, emu_driver, pcm_devclass, NULL, NULL); | DRIVER_MODULE(snd_emu10k1, pci, emu_driver, pcm_devclass, NULL, NULL); | ||||
MODULE_PNP_INFO("W32:vendor/device;D:#", pci, snd_emu101k1, | PCI_PNP_INFO(emu_pci_devs); | ||||
emu_pci_devs, sizeof(emu_pci_devs[0]), nitems(emu_pci_devs) - 1); | |||||
MODULE_DEPEND(snd_emu10k1, sound, SOUND_MINVER, SOUND_PREFVER, SOUND_MAXVER); | MODULE_DEPEND(snd_emu10k1, sound, SOUND_MINVER, SOUND_PREFVER, SOUND_MAXVER); | ||||
MODULE_VERSION(snd_emu10k1, 1); | MODULE_VERSION(snd_emu10k1, 1); | ||||
MODULE_DEPEND(snd_emu10k1, midi, 1, 1, 1); | MODULE_DEPEND(snd_emu10k1, midi, 1, 1, 1); | ||||
/* dummy driver to silence the joystick device */ | /* dummy driver to silence the joystick device */ | ||||
static int | static int | ||||
emujoy_pci_probe(device_t dev) | emujoy_pci_probe(device_t dev) | ||||
{ | { | ||||
const struct emujoy_pci_dev *emujd; | const struct pci_device_table *emujd; | ||||
size_t i; | |||||
uint32_t devid; | |||||
devid = pci_get_devid(dev); | emujd = PCI_MATCH(dev, emujoy_pci_devs); | ||||
for (i = 0; i < nitems(emujoy_pci_devs); i++) { | if (emujd == NULL) | ||||
emujd = &emujoy_pci_devs[i]; | return (ENXIO); | ||||
if(emujd->devid == devid) { | device_set_desc(dev, emujd->descr); | ||||
device_set_desc(dev, emujd->description); | |||||
device_quiet(dev); | device_quiet(dev); | ||||
return -1000; | return -1000; | ||||
} | } | ||||
} | |||||
return ENXIO; | |||||
} | |||||
static int | static int | ||||
emujoy_pci_attach(device_t dev) | emujoy_pci_attach(device_t dev) | ||||
{ | { | ||||
return 0; | return 0; | ||||
} | } | ||||
Show All 16 Lines | static driver_t emujoy_driver = { | ||||
"emujoy", | "emujoy", | ||||
emujoy_methods, | emujoy_methods, | ||||
1 /* no softc */ | 1 /* no softc */ | ||||
}; | }; | ||||
static devclass_t emujoy_devclass; | static devclass_t emujoy_devclass; | ||||
DRIVER_MODULE(emujoy, pci, emujoy_driver, emujoy_devclass, NULL, NULL); | DRIVER_MODULE(emujoy, pci, emujoy_driver, emujoy_devclass, NULL, NULL); | ||||
MODULE_PNP_INFO("W32:vendor/device;D:#", pci, emujoy, emujoy_pci_devs, | PCI_PNP_INFO(emujoy_pci_devs); | ||||
sizeof(emujoy_pci_devs[0]), nitems(emujoy_pci_devs) - 1); |