Index: sys/dev/sound/pcm/ac97.c =================================================================== RCS file: /home/xorpc/u2/freebsd/src/sys/dev/sound/pcm/ac97.c,v retrieving revision 1.29 diff -u -u -r1.29 ac97.c --- sys/dev/sound/pcm/ac97.c 13 Jan 2003 17:43:49 -0000 1.29 +++ sys/dev/sound/pcm/ac97.c 14 Jan 2003 17:09:20 -0000 @@ -33,6 +33,10 @@ MALLOC_DEFINE(M_AC97, "ac97", "ac97 codec"); +typedef void (*ac97_patch)(struct ac97_info*); + +static void ad1886_patch(struct ac97_info*); + struct ac97mixtable_entry { int reg:8; unsigned bits:4; @@ -56,11 +60,13 @@ struct ac97mixtable_entry mix[32]; char name[AC97_NAMELEN]; struct mtx *lock; + ac97_patch patch; }; struct ac97_codecid { u_int32_t id, noext:1; char *name; + ac97_patch patch; }; static const struct ac97mixtable_entry ac97mixtable_default[32] = { @@ -81,46 +87,47 @@ }; static struct ac97_codecid ac97codecid[] = { - { 0x41445303, 0, "Analog Devices AD1819" }, - { 0x41445340, 0, "Analog Devices AD1881" }, - { 0x41445348, 0, "Analog Devices AD1881A" }, + { 0x41445303, 0, "Analog Devices AD1819", 0 }, + { 0x41445340, 0, "Analog Devices AD1881", 0 }, + { 0x41445348, 0, "Analog Devices AD1881A", 0 }, { 0x41445360, 0, "Analog Devices AD1885" }, - { 0x414b4d00, 1, "Asahi Kasei AK4540" }, - { 0x414b4d01, 1, "Asahi Kasei AK4542" }, - { 0x414b4d02, 1, "Asahi Kasei AK4543" }, - { 0x414c4710, 0, "Avance Logic ALC200/200P" }, - { 0x414c4720, 0, "Realtek Semiconductor ALC650" }, - { 0x43525900, 0, "Cirrus Logic CS4297" }, - { 0x43525903, 0, "Cirrus Logic CS4297" }, - { 0x43525913, 0, "Cirrus Logic CS4297A" }, - { 0x43525914, 0, "Cirrus Logic CS4297B" }, - { 0x43525923, 0, "Cirrus Logic CS4294C" }, - { 0x4352592b, 0, "Cirrus Logic CS4298C" }, - { 0x43525931, 0, "Cirrus Logic CS4299A" }, - { 0x43525933, 0, "Cirrus Logic CS4299C" }, - { 0x43525934, 0, "Cirrus Logic CS4299D" }, - { 0x43525941, 0, "Cirrus Logic CS4201A" }, - { 0x43525951, 0, "Cirrus Logic CS4205A" }, - { 0x43525961, 0, "Cirrus Logic CS4291A" }, - { 0x45838308, 0, "ESS Technology ES1921" }, - { 0x49434511, 0, "ICEnsemble ICE1232" }, - { 0x4e534331, 0, "National Semiconductor LM4549" }, - { 0x83847600, 0, "SigmaTel STAC9700/9783/9784" }, - { 0x83847604, 0, "SigmaTel STAC9701/9703/9704/9705" }, - { 0x83847605, 0, "SigmaTel STAC9704" }, - { 0x83847608, 0, "SigmaTel STAC9708/9711" }, - { 0x83847609, 0, "SigmaTel STAC9721/9723" }, - { 0x83847644, 0, "SigmaTel STAC9744" }, - { 0x83847656, 0, "SigmaTel STAC9756/9757" }, - { 0x53494c22, 0, "Silicon Laboratory Si3036" }, - { 0x53494c23, 0, "Silicon Laboratory Si3038" }, - { 0x54524103, 0, "TriTech TR?????" }, - { 0x54524106, 0, "TriTech TR28026" }, - { 0x54524108, 0, "TriTech TR28028" }, - { 0x54524123, 0, "TriTech TR28602" }, - { 0x574d4c00, 0, "Wolfson WM9701A" }, - { 0x574d4c03, 0, "Wolfson WM9703/9704" }, - { 0x574d4c04, 0, "Wolfson WM9704 (quad)" }, + { 0x41445361, 0, "Analog Devices AD1886", ad1886_patch }, + { 0x414b4d00, 1, "Asahi Kasei AK4540", 0 }, + { 0x414b4d01, 1, "Asahi Kasei AK4542", 0 }, + { 0x414b4d02, 1, "Asahi Kasei AK4543", 0 }, + { 0x414c4710, 0, "Avance Logic ALC200/200P", 0 }, + { 0x414c4720, 0, "Realtek Semiconductor ALC650", 0 }, + { 0x43525900, 0, "Cirrus Logic CS4297", 0 }, + { 0x43525903, 0, "Cirrus Logic CS4297", 0 }, + { 0x43525913, 0, "Cirrus Logic CS4297A", 0 }, + { 0x43525914, 0, "Cirrus Logic CS4297B", 0 }, + { 0x43525923, 0, "Cirrus Logic CS4294C", 0 }, + { 0x4352592b, 0, "Cirrus Logic CS4298C", 0 }, + { 0x43525931, 0, "Cirrus Logic CS4299A", 0 }, + { 0x43525933, 0, "Cirrus Logic CS4299C", 0 }, + { 0x43525934, 0, "Cirrus Logic CS4299D", 0 }, + { 0x43525941, 0, "Cirrus Logic CS4201A", 0 }, + { 0x43525951, 0, "Cirrus Logic CS4205A", 0 }, + { 0x43525961, 0, "Cirrus Logic CS4291A", 0 }, + { 0x45838308, 0, "ESS Technology ES1921", 0 }, + { 0x49434511, 0, "ICEnsemble ICE1232", 0 }, + { 0x4e534331, 0, "National Semiconductor LM4549", 0 }, + { 0x83847600, 0, "SigmaTel STAC9700/9783/9784", 0 }, + { 0x83847604, 0, "SigmaTel STAC9701/9703/9704/9705", 0 }, + { 0x83847605, 0, "SigmaTel STAC9704", 0 }, + { 0x83847608, 0, "SigmaTel STAC9708/9711", 0 }, + { 0x83847609, 0, "SigmaTel STAC9721/9723", 0 }, + { 0x83847644, 0, "SigmaTel STAC9744", 0 }, + { 0x83847656, 0, "SigmaTel STAC9756/9757", 0 }, + { 0x53494c22, 0, "Silicon Laboratory Si3036", 0 }, + { 0x53494c23, 0, "Silicon Laboratory Si3038", 0 }, + { 0x54524103, 0, "TriTech TR?????", 0 }, + { 0x54524106, 0, "TriTech TR28026", 0 }, + { 0x54524108, 0, "TriTech TR28028", 0 }, + { 0x54524123, 0, "TriTech TR28602", 0 }, + { 0x574d4c00, 0, "Wolfson WM9701A", 0 }, + { 0x574d4c03, 0, "Wolfson WM9703/9704", 0 }, + { 0x574d4c04, 0, "Wolfson WM9704 (quad)", 0 }, { 0, 0, NULL } }; @@ -434,6 +441,7 @@ if (ac97codecid[i].id == id) { codec->id = ac97codecid[i].name; codec->noext = ac97codecid[i].noext; + codec->patch = ac97codecid[i].patch; } } @@ -453,6 +461,8 @@ codec->mix[i] = ac97mixtable_default[i]; } ac97_fix_auxout(codec); + if (codec->patch) + codec->patch(codec); for (i = 0; i < 32; i++) { k = codec->noext? codec->mix[i].enable : 1; @@ -669,4 +679,14 @@ return &ac97mixer_class; } - +void ad1886_patch(struct ac97_info* codec) +{ +#define AC97_AD_JACK_SPDIF 0x72 + /* + * Presario700 workaround + * for Jack Sense/SPDIF Register misetting causing + * no audible output + * by Santiago Nullo 04/05/2002 + */ + wrcd(codec, AC97_AD_JACK_SPDIF, 0x0010); +}