hrev46327 adds 2 changesets to branch 'master' old head: 72dfdc7940ae7700ccb02813055757a3af6e00d4 new head: fe2d4a0fa3ebcc16de39aa66383d300ccb7fd860 overview: http://cgit.haiku-os.org/haiku/log/?qt=range&q=fe2d4a0+%5E72dfdc7 ---------------------------------------------------------------------------- 4d9dca1: hda: added a few quirks. * trace the quirks along with codec ids. fe2d4a0: ac97: added a few codec ids. * minor code cleanup [ Jérôme Duval <jerome.duval@xxxxxxxxx> ] ---------------------------------------------------------------------------- 3 files changed, 68 insertions(+), 27 deletions(-) src/add-ons/kernel/drivers/audio/ac97/ac97.c | 32 +++++++++++++ src/add-ons/kernel/drivers/audio/ac97/ac97.h | 50 +++++++++++--------- .../kernel/drivers/audio/hda/hda_codec.cpp | 13 +++-- ############################################################################ Commit: 4d9dca1905672503cebebc64b30e3ea5dce0ae88 URL: http://cgit.haiku-os.org/haiku/commit/?id=4d9dca1 Author: Jérôme Duval <jerome.duval@xxxxxxxxx> Date: Fri Nov 8 17:46:45 2013 UTC hda: added a few quirks. * trace the quirks along with codec ids. ---------------------------------------------------------------------------- diff --git a/src/add-ons/kernel/drivers/audio/hda/hda_codec.cpp b/src/add-ons/kernel/drivers/audio/hda/hda_codec.cpp index 4cdd222..de64c0f 100644 --- a/src/add-ons/kernel/drivers/audio/hda/hda_codec.cpp +++ b/src/add-ons/kernel/drivers/audio/hda/hda_codec.cpp @@ -81,8 +81,12 @@ static const struct { } kCodecQuirks[] = { { HDA_ALL, HDA_ALL, HDA_ALL, HDA_ALL, HDA_QUIRK_IVREF, 0 }, { HDA_ALL, HDA_ALL, HDA_ALL, HDA_ALL, HDA_QUIRK_IVREF, 0 }, + { 0x10de, 0x0d94, CIRRUSLOGIC_VENDORID, HDA_ALL, + HDA_QUIRK_GPIO1 | HDA_QUIRK_GPIO3, 0 }, // MacBookAir 3,1(2) { 0x10de, 0xcb79, CIRRUSLOGIC_VENDORID, 0x4206, - HDA_QUIRK_GPIO1 | HDA_QUIRK_GPIO3, 0 }, // MacBook Pro 5.5 + HDA_QUIRK_GPIO1 | HDA_QUIRK_GPIO3, 0 }, // MacBook Pro 5,5 + { 0x10de, 0xcb89, CIRRUSLOGIC_VENDORID, 0x4206, + HDA_QUIRK_GPIO1 | HDA_QUIRK_GPIO3, 0 }, // MacBookPro 7,1 { 0x8384, 0x7680, SIGMATEL_VENDORID, 0x7680, HDA_QUIRK_GPIO0 | HDA_QUIRK_GPIO1, 0}, // Apple Intel Mac { 0x106b, 0x00a1, REALTEK_VENDORID, 0x0885, @@ -1285,7 +1289,7 @@ hda_codec_new_audio_group(hda_codec* codec, uint32 audioGroupNodeID) if (hda_audio_group_build_tree(audioGroup) != B_OK) goto err; hda_audio_group_switch_init(audioGroup); - + audioGroup->playback_stream = hda_stream_new(audioGroup, STREAM_PLAYBACK); audioGroup->record_stream = hda_stream_new(audioGroup, STREAM_RECORD); TRACE("hda: streams playback %p, record %p\n", audioGroup->playback_stream, @@ -1501,8 +1505,9 @@ hda_codec_new(hda_controller* controller, uint32 codecAddress) hda_codec_get_quirks(codec); TRACE("Codec %ld Vendor: %04lx Product: %04lx, Revision: " - "%lu.%lu.%lu.%lu\n", codecAddress, response.vendor, response.device, - response.major, response.minor, response.revision, response.stepping); + "%lu.%lu.%lu.%lu Quirks: %04lx\n", codecAddress, response.vendor, + response.device, response.major, response.minor, response.revision, + response.stepping, codec->quirks); for (uint32 nodeID = response.start; nodeID < response.start + response.count; nodeID++) { ############################################################################ Revision: hrev46327 Commit: fe2d4a0fa3ebcc16de39aa66383d300ccb7fd860 URL: http://cgit.haiku-os.org/haiku/commit/?id=fe2d4a0 Author: Jérôme Duval <jerome.duval@xxxxxxxxx> Date: Fri Nov 8 18:00:07 2013 UTC ac97: added a few codec ids. * minor code cleanup ---------------------------------------------------------------------------- diff --git a/src/add-ons/kernel/drivers/audio/ac97/ac97.c b/src/add-ons/kernel/drivers/audio/ac97/ac97.c index 37743f4..d0a63d6 100644 --- a/src/add-ons/kernel/drivers/audio/ac97/ac97.c +++ b/src/add-ons/kernel/drivers/audio/ac97/ac97.c @@ -99,6 +99,7 @@ static void stac9708_init(ac97_dev *dev); static void stac9721_init(ac97_dev *dev); static void stac9744_init(ac97_dev *dev); static void stac9756_init(ac97_dev *dev); +static void stac9758_init(ac97_dev *dev); static void tr28028_init(ac97_dev *dev); static void wm9701_init(ac97_dev *dev); static void wm9703_init(ac97_dev *dev); @@ -136,6 +137,8 @@ codec_table codecs[] = { CODEC_ID_AK4540, 0xffffffff, default_init, "Asahi Kasei AK4540" }, { CODEC_ID_AK4542, 0xffffffff, default_init, "Asahi Kasei AK4542" }, { CODEC_ID_AK4543, 0xffffffff, default_init, "Asahi Kasei AK4543" }, + { 0x414b4d06, 0xffffffff, default_init, "Asahi Kasei AK4544A" }, + { 0x414b4d07, 0xffffffff, default_init, "Asahi Kasei AK4545" }, { 0x414c4300, 0xffffff00, default_init, "Avance Logic (Realtek) ALC100" }, /* 0x4300 = ALC100 */ { 0x414c4320, 0xfffffff0, default_init, "Avance Logic (Realtek) ALC100/ALC100P, RL5383/RL5522" }, { CODEC_ID_ALC201A, 0xfffffff0, default_init, "Avance Logic (Realtek) ALC200/ALC200A, ALC201/ALC201A" }, /* 0x4710 = ALC201A */ @@ -161,6 +164,9 @@ codec_table codecs[] = { 0x43525941, 0xffffffff, default_init, "Cirrus Logic CS4201A" }, { 0x43525951, 0xffffffff, default_init, "Cirrus Logic CS4205A" }, { 0x43525961, 0xffffffff, default_init, "Cirrus Logic CS4291A" }, + { 0x43585421, 0xffffffff, default_init, "HSD11246" }, + { 0x44543031, 0xffffffff, default_init, "DT0398" }, + { 0x454d4328, 0xffffffff, default_init, "EM28028" }, { 0x45838308, 0xffffffff, default_init, "ESS Technology ES1921" }, { 0x49434501, 0xffffffff, default_init, "ICEnsemble ICE1230" }, { 0x49434511, 0xffffffff, default_init, "ICEnsemble ICE1232" }, @@ -175,11 +181,14 @@ codec_table codecs[] = { CODEC_ID_STAC9708,0xffffffff, stac9708_init, "SigmaTel STAC9708/9711" }, { CODEC_ID_STAC9721,0xffffffff, stac9721_init, "SigmaTel STAC9721/9723" }, { CODEC_ID_STAC9744,0xffffffff, stac9744_init, "SigmaTel STAC9744" }, + { CODEC_ID_STAC9750,0xffffffff, default_init, "SigmaTel STAC9750/51" }, { CODEC_ID_STAC9752,0xffffffff, default_init, "SigmaTel STAC9752/53" }, { CODEC_ID_STAC9756,0xffffffff, stac9756_init, "SigmaTel STAC9756/9757" }, + { CODEC_ID_STAC9758,0xffffffff, stac9758_init, "SigmaTel STAC9758/59" }, { CODEC_ID_STAC9766,0xffffffff, default_init, "SigmaTel STAC9766/67" }, { 0x53494c22, 0xffffffff, default_init, "Silicon Laboratory Si3036" }, { 0x53494c23, 0xffffffff, default_init, "Silicon Laboratory Si3038" }, + { 0x53544d02, 0xffffffff, default_init, "ST7597" }, { 0x54524103, 0xffffffff, default_init, "TriTech TR28023" }, { 0x54524106, 0xffffffff, default_init, "TriTech TR28026" }, { 0x54524108, 0xffffffff, tr28028_init, "TriTech TR28028" }, @@ -207,6 +216,7 @@ codec_table codecs[] = { 0x83847600, 0xffffff00, default_init, "SigmaTel" }, { 0x53494c00, 0xffffff00, default_init, "Silicon Laboratory" }, { 0x54524100, 0xffffff00, default_init, "TriTech" }, + { 0x54584e00, 0xffffff00, default_init, "Texas Instruments" }, { 0x56494100, 0xffffff00, default_init, "VIA Technologies" }, { 0x574d4c00, 0xffffff00, default_init, "Wolfson" }, { 0x594d4800, 0xffffff00, default_init, "Yamaha" }, @@ -1039,6 +1049,28 @@ stac9756_init(ac97_dev *dev) } + +void +stac9758_init(ac97_dev *dev) +{ + LOG(("stac9758_init\n")); + + ac97_reg_update_bits(dev, AC97_PAGING, 0xf, 0); + + if (dev->subsystem == 0x107b0601) { + ac97_reg_cached_write(dev, 0x64, 0xfc70); + ac97_reg_cached_write(dev, 0x68, 0x2102); + ac97_reg_cached_write(dev, 0x66, 0x0203); + ac97_reg_cached_write(dev, 0x72, 0x0041); + } else { + ac97_reg_cached_write(dev, 0x64, 0xd794); + ac97_reg_cached_write(dev, 0x68, 0x2001); + ac97_reg_cached_write(dev, 0x66, 0x0201); + ac97_reg_cached_write(dev, 0x72, 0x0040); + } +} + + void tr28028_init(ac97_dev *dev) { diff --git a/src/add-ons/kernel/drivers/audio/ac97/ac97.h b/src/add-ons/kernel/drivers/audio/ac97/ac97.h index 4590833..c54996f 100644 --- a/src/add-ons/kernel/drivers/audio/ac97/ac97.h +++ b/src/add-ons/kernel/drivers/audio/ac97/ac97.h @@ -5,24 +5,24 @@ * Copyright (c) 2008, Jérôme Duval * * All rights reserved. - * Redistribution and use in source and binary forms, with or without modification, + * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * - * - Redistributions of source code must retain the above copyright notice, + * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation + * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ @@ -51,7 +51,7 @@ enum AC97_REGISTER { AC97_3D_CONTROL = 0x22, AC97_PAGING = 0x24, AC97_POWERDOWN = 0x26, - + /* Extended audio register set */ AC97_EXTENDED_ID = 0x28, AC97_EXTENDED_STAT_CTRL = 0x2A, @@ -67,14 +67,14 @@ enum AC97_REGISTER { /* Vendor ID */ AC97_VENDOR_ID1 = 0x7C, AC97_VENDOR_ID2 = 0x7E, - + /* Analog Devices */ AC97_AD_JACK_SENSE = 0x72, AC97_AD_SERIAL_CONFIG = 0x74, AC97_AD_MISC_CONTROL = 0x76, AC97_AD_SAMPLE_RATE_0 = 0x78, AC97_AD_SAMPLE_RATE_1 = 0x7a, - + /* Realtek ALC650 */ AC97_ALC650_SPDIF_INPUT_CHAN_STATUS_LO = 0x60, /* only ALC650 Rev. E and later */ AC97_ALC650_SPDIF_INPUT_CHAN_STATUS_HI = 0x62, /* only ALC650 Rev. E and later */ @@ -134,8 +134,10 @@ enum { CODEC_ID_STAC9708 = 0x83847608, // ok, STAC9708/11 CODEC_ID_STAC9721 = 0x83847609, // ok, STAC9721/23 CODEC_ID_STAC9744 = 0x83847644, // ok, STAC9744 + CODEC_ID_STAC9750 = 0x83847650, // ok, STAC9750/51 CODEC_ID_STAC9752 = 0x83847652, // ok, STAC9752/53 CODEC_ID_STAC9756 = 0x83847656, // ok, STAC9756/57 + CODEC_ID_STAC9758 = 0x83847658, // ????, STAC9758/59 CODEC_ID_STAC9766 = 0x83847666, // ok, STAC9766/67 }; @@ -193,19 +195,19 @@ struct ac97_dev { uint16 reg_cache[0x7f]; void * cookie; - + uint32 codec_id; const char * codec_info; const char * codec_3d_stereo_enhancement; - + codec_init init; codec_reg_read reg_read; codec_reg_write reg_write; codec_set_rate set_rate; codec_get_rate get_rate; - uint32 max_vsr; - uint32 min_vsr; + uint32 max_vsr; + uint32 min_vsr; uint32 clock; uint64 capabilities; bool reversed_eamp_polarity; @@ -216,8 +218,9 @@ struct ac97_dev { extern "C" { #endif -void ac97_attach(ac97_dev **dev, codec_reg_read reg_read, codec_reg_write reg_write, void *cookie, - ushort subvendor_id, ushort subsystem_id); +void ac97_attach(ac97_dev **dev, codec_reg_read reg_read, + codec_reg_write reg_write, void *cookie, ushort subvendor_id, + ushort subsystem_id); void ac97_detach(ac97_dev *dev); void ac97_suspend(ac97_dev *dev); void ac97_resume(ac97_dev *dev); @@ -228,7 +231,8 @@ void ac97_reg_uncached_write(ac97_dev *dev, uint8 reg, uint16 value); uint16 ac97_reg_uncached_read(ac97_dev *dev, uint8 reg); bool ac97_reg_update(ac97_dev *dev, uint8 reg, uint16 value); -bool ac97_reg_update_bits(ac97_dev *dev, uint8 reg, uint16 mask, uint16 value); +bool ac97_reg_update_bits(ac97_dev *dev, uint8 reg, uint16 mask, + uint16 value); bool ac97_set_rate(ac97_dev *dev, uint8 reg, uint32 rate); bool ac97_get_rate(ac97_dev *dev, uint8 reg, uint32 *rate); @@ -256,7 +260,7 @@ typedef enum { typedef struct _ac97_source_info { const char *name; ac97_mixer_type type; - + int32 id; uint8 reg; uint16 default_value;