diff options
author | tanimura <tanimura@FreeBSD.org> | 1999-12-04 09:51:24 +0000 |
---|---|---|
committer | tanimura <tanimura@FreeBSD.org> | 1999-12-04 09:51:24 +0000 |
commit | e7bbc71094945aee9f88ee994f0477d40ccedbe3 (patch) | |
tree | b75129639833806fbd0762a3812e9d2b7fe76b72 /sys/dev/sound | |
parent | 4dbe46020bb7e4e3ed357817e0f3aceb7cd9d9e9 (diff) | |
download | FreeBSD-src-e7bbc71094945aee9f88ee994f0477d40ccedbe3.zip FreeBSD-src-e7bbc71094945aee9f88ee994f0477d40ccedbe3.tar.gz |
Call ISA_PNP_PROBE() to probe PnP cards, rather than match
the vendor and logical IDs directly.
Submitted by: peter
Tested by: Timo Geusch <freebsd@timog.prestel.co.uk>
Diffstat (limited to 'sys/dev/sound')
-rw-r--r-- | sys/dev/sound/isa/sbc.c | 178 |
1 files changed, 59 insertions, 119 deletions
diff --git a/sys/dev/sound/isa/sbc.c b/sys/dev/sound/isa/sbc.c index 7e9080e..c0ec09a 100644 --- a/sys/dev/sound/isa/sbc.c +++ b/sys/dev/sound/isa/sbc.c @@ -83,135 +83,46 @@ static int release_resource(sc_p scp); static devclass_t sbc_devclass; #if NISA > 0 && NPNP > 0 -static int -sbc_probe(device_t dev) -{ - device_t child; - u_int32_t vend_id, logical_id, vend_id2; - char *s; - struct sndcard_func *func; - - vend_id = isa_get_vendorid(dev); - vend_id2 = vend_id & 0xff00ffff; - logical_id = isa_get_logicalid(dev); - s = NULL; - - switch (logical_id) { +static struct isa_pnp_id sbc_ids[] = { #if notdef - case 0x0000630e: /* Crystal Semiconductor */ - if (vend_id2 ==0x3600630e) /* CS4236 */ - s = "CS4236"; - else if (vend_id2 ==0x3200630e) /* CS4232 */ - s = "CS4232"; - else if (vend_id2 ==0x3500630e) /* CS4236B */ - s = "CS4236B"; - break; -#endif /* notdef */ - case 0x01008c0e: /* Creative ViBRA16C */ - if (vend_id2 == 0x70008c0e) - s = "Creative ViBRA16C PnP"; - break; - case 0x43008c0e: /* Creative ViBRA16X */ - if (vend_id2 == 0xf0008c0e) - s = "Creative ViBRA16C PnP"; - break; - case 0x31008c0e: /* Creative SB */ - if (vend_id2 == 0x26008c0e) - s = "Creative SB16 PnP"; - else if (vend_id2 == 0x42008c0e) - s = "Creative SB32 (CTL0042)"; - else if (vend_id2 == 0x44008c0e) - s = "Creative SB32 (CTL0044)"; - else if (vend_id2 == 0x48008c0e) - s = "Creative SB32 (CTL0048)"; - else if (vend_id2 == 0x49008c0e) - s = "Creative SB32 (CTL0049)"; - else if (vend_id2 == 0xf1008c0e) - s = "Creative SB32 (CTL00f1)"; - break; - case 0x42008c0e: /* Creative SB AWE64 (CTL00c1) */ - if (vend_id2 == 0xc1008c0e) - s = "Creative SB AWE64 (CTL00c1)"; - break; - case 0x45008c0e: /* Creative SB AWE64 (CTL0045) */ - if (vend_id2 == 0xe4008c0e) - s = "Creative SB AWE64 (CTL0045)"; - break; + {0x0000630e, "CS423x"}, +#endif + {0x01008c0e, "Creative ViBRA16C PnP"}, + {0x43008c0e, "Creative ViBRA16X PnP"}, + {0x31008c0e, "Creative SB16 PnP/SB32"}, + {0x42008c0e, "Creative SB AWE64"}, /* CTL00c1 */ + {0x45008c0e, "Creative SB AWE64"}, /* CTL0045 */ #if notdef - case 0x01200001: /* Avance Logic */ - if (vend_id2 == 0x20009305) - s = "Avance Logic ALS120"; - break; - case 0x01100001: /* Avance Asound */ - if (vend_id2 == 0x10009305) - s = "Avance Asound 110"; - break; - case 0x68187316: /* ESS1868 */ - if (vend_id2 == 0x68007316) - s = "ESS ES1868 Plug and Play AudioDrive"; - break; - case 0x79187316: /* ESS1879 */ - if (vend_id2 == 0x79007316) - s = "ESS ES1879 Plug and Play AudioDrive"; - break; - case 0x2100a865: /* Yamaha */ - if (vend_id2 == 0x2000a865) - s = "Yamaha OPL3-SA2/SAX Sound Board"; - break; - case 0x80719304: /* Terratec */ - if (vend_id2 == 0x1114b250) - s = "Terratec Soundsystem Base 1"; - break; - case 0x0300561e: /* Gravis */ - if (vend_id2 == 0x0100561e) - s = "Gravis UltraSound Plug & Play"; - break; -#endif /* notdef */ - } - - if (s != NULL) { - device_set_desc(dev, s); - - /* PCM Audio */ - func = malloc(sizeof(struct sndcard_func), M_DEVBUF, M_NOWAIT); - if (func == NULL) - return (ENOMEM); - bzero(func, sizeof(*func)); - func->func = SCF_PCM; - child = device_add_child(dev, "pcm", -1); - device_set_ivars(child, func); - -#if notyet - /* Midi Interface */ - func = malloc(sizeof(struct sndcard_func), M_DEVBUF, M_NOWAIT); - if (func == NULL) - return (ENOMEM); - bzero(func, sizeof(*func)); - func->func = SCF_MIDI; - child = device_add_child(dev, "midi", -1); - device_set_ivars(child, func); - - /* OPL FM Synthesizer */ - func = malloc(sizeof(struct sndcard_func), M_DEVBUF, M_NOWAIT); - if (func == NULL) - return (ENOMEM); - bzero(func, sizeof(*func)); - func->func = SCF_SYNTH; - child = device_add_child(dev, "midi", -1); - device_set_ivars(child, func); -#endif /* notyet */ - - return (0); - } + {0x01200001, "Avance Logic ALS120"}, + {0x01100001, "Avance Asound 110"}, + {0x68187316, "ESS ES1868 Plug and Play AudioDrive"}, /* ESS1868 */ + {0x79187316, "ESS ES1879 Plug and Play AudioDrive"}, /* ESS1879 */ + {0x2100a865, "Yamaha OPL3-SA2/SAX Sound Board"}, + {0x80719304, "Terratec Soundsystem Base 1"}, +#endif + {0} +}; - return (ENXIO); +static int +sbc_probe(device_t dev) +{ + int error; + + /* Check pnp ids */ + error = ISA_PNP_PROBE(device_get_parent(dev), dev, sbc_ids); + if (error) + return error; + else + return -100; } static int sbc_attach(device_t dev) { sc_p scp; + device_t child; int unit; + struct sndcard_func *func; scp = device_get_softc(dev); unit = device_get_unit(dev); @@ -224,6 +135,35 @@ sbc_attach(device_t dev) return (ENXIO); } + /* PCM Audio */ + func = malloc(sizeof(struct sndcard_func), M_DEVBUF, M_NOWAIT); + if (func == NULL) + return (ENOMEM); + bzero(func, sizeof(*func)); + func->func = SCF_PCM; + child = device_add_child(dev, "pcm", -1); + device_set_ivars(child, func); + +#if notyet + /* Midi Interface */ + func = malloc(sizeof(struct sndcard_func), M_DEVBUF, M_NOWAIT); + if (func == NULL) + return (ENOMEM); + bzero(func, sizeof(*func)); + func->func = SCF_MIDI; + child = device_add_child(dev, "midi", -1); + device_set_ivars(child, func); + + /* OPL FM Synthesizer */ + func = malloc(sizeof(struct sndcard_func), M_DEVBUF, M_NOWAIT); + if (func == NULL) + return (ENOMEM); + bzero(func, sizeof(*func)); + func->func = SCF_SYNTH; + child = device_add_child(dev, "midi", -1); + device_set_ivars(child, func); +#endif /* notyet */ + bus_generic_attach(dev); return (0); |