aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2007-08-16 12:19:38 -0400
committerJaroslav Kysela <perex@perex.cz>2007-10-16 09:59:11 -0400
commit87350ad0cf05d734309ca40e1524a07cf12190aa (patch)
tree1b4ebe80fcd721551b23024e189ea39b75d6b5ae
parent38baf5ad8b7d24be16a2cf0e4c1d7429aeb4aa45 (diff)
[ALSA] hda-codec - Add support for Macbook Pro rev3
Added the support for Macbook Pro rev3 with ALC885 codec chip. The patch taken from ALSA bug#3242. Signed-off-by: Takashi Iwai <tiwai@suse.de> Signed-off-by: Jaroslav Kysela <perex@suse.cz>
-rw-r--r--Documentation/sound/alsa/ALSA-Configuration.txt1
-rw-r--r--sound/pci/hda/patch_realtek.c145
2 files changed, 146 insertions, 0 deletions
diff --git a/Documentation/sound/alsa/ALSA-Configuration.txt b/Documentation/sound/alsa/ALSA-Configuration.txt
index b42458fe0ad5..da70bb82f637 100644
--- a/Documentation/sound/alsa/ALSA-Configuration.txt
+++ b/Documentation/sound/alsa/ALSA-Configuration.txt
@@ -849,6 +849,7 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
849 6stack-dig 6-jack digital with SPDIF I/O 849 6stack-dig 6-jack digital with SPDIF I/O
850 arima Arima W820Di1 850 arima Arima W820Di1
851 macpro MacPro support 851 macpro MacPro support
852 mbp3 Macbook Pro rev3
852 imac24 iMac 24'' with jack detection 853 imac24 iMac 24'' with jack detection
853 w2jc ASUS W2JC 854 w2jc ASUS W2JC
854 auto auto-config reading BIOS (default) 855 auto auto-config reading BIOS (default)
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
index e4064f997e8c..0473f2a9c182 100644
--- a/sound/pci/hda/patch_realtek.c
+++ b/sound/pci/hda/patch_realtek.c
@@ -156,6 +156,7 @@ enum {
156 ALC882_TARGA, 156 ALC882_TARGA,
157 ALC882_ASUS_A7J, 157 ALC882_ASUS_A7J,
158 ALC885_MACPRO, 158 ALC885_MACPRO,
159 ALC885_MBP3,
159 ALC885_IMAC24, 160 ALC885_IMAC24,
160 ALC882_AUTO, 161 ALC882_AUTO,
161 ALC882_MODEL_LAST, 162 ALC882_MODEL_LAST,
@@ -4895,6 +4896,38 @@ static struct hda_channel_mode alc882_sixstack_modes[2] = {
4895 { 8, alc882_sixstack_ch8_init }, 4896 { 8, alc882_sixstack_ch8_init },
4896}; 4897};
4897 4898
4899/*
4900 * macbook pro ALC885 can switch LineIn to LineOut without loosing Mic
4901 */
4902
4903/*
4904 * 2ch mode
4905 */
4906static struct hda_verb alc885_mbp_ch2_init[] = {
4907 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
4908 { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
4909 { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
4910 { } /* end */
4911};
4912
4913/*
4914 * 6ch mode
4915 */
4916static struct hda_verb alc885_mbp_ch6_init[] = {
4917 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
4918 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
4919 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
4920 { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
4921 { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
4922 { } /* end */
4923};
4924
4925static struct hda_channel_mode alc885_mbp_6ch_modes[2] = {
4926 { 2, alc885_mbp_ch2_init },
4927 { 6, alc885_mbp_ch6_init },
4928};
4929
4930
4898/* Pin assignment: Front=0x14, Rear=0x15, CLFE=0x16, Side=0x17 4931/* Pin assignment: Front=0x14, Rear=0x15, CLFE=0x16, Side=0x17
4899 * Mic=0x18, Front Mic=0x19, Line-In=0x1a, HP=0x1b 4932 * Mic=0x18, Front Mic=0x19, Line-In=0x1a, HP=0x1b
4900 */ 4933 */
@@ -4925,6 +4958,19 @@ static struct snd_kcontrol_new alc882_base_mixer[] = {
4925 { } /* end */ 4958 { } /* end */
4926}; 4959};
4927 4960
4961static struct snd_kcontrol_new alc885_mbp3_mixer[] = {
4962 HDA_CODEC_VOLUME("Master Volume", 0x0c, 0x00, HDA_OUTPUT),
4963 HDA_BIND_MUTE ("Master Switch", 0x0c, 0x02, HDA_INPUT),
4964 HDA_CODEC_MUTE ("Speaker Switch", 0x14, 0x00, HDA_OUTPUT),
4965 HDA_CODEC_VOLUME("Line Out Volume", 0x0d,0x00, HDA_OUTPUT),
4966 HDA_CODEC_VOLUME("Line In Playback Volume", 0x0b, 0x02, HDA_INPUT),
4967 HDA_CODEC_MUTE ("Line In Playback Switch", 0x0b, 0x02, HDA_INPUT),
4968 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x00, HDA_INPUT),
4969 HDA_CODEC_MUTE ("Mic Playback Switch", 0x0b, 0x00, HDA_INPUT),
4970 HDA_CODEC_VOLUME("Line In Boost", 0x1a, 0x00, HDA_INPUT),
4971 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0x00, HDA_INPUT),
4972 { } /* end */
4973};
4928static struct snd_kcontrol_new alc882_w2jc_mixer[] = { 4974static struct snd_kcontrol_new alc882_w2jc_mixer[] = {
4929 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 4975 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
4930 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 4976 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
@@ -5135,6 +5181,66 @@ static struct hda_verb alc882_macpro_init_verbs[] = {
5135 { } 5181 { }
5136}; 5182};
5137 5183
5184/* Macbook Pro rev3 */
5185static struct hda_verb alc885_mbp3_init_verbs[] = {
5186 /* Front mixer: unmute input/output amp left and right (volume = 0) */
5187 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5188 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5189 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5190 /* Rear mixer */
5191 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5192 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5193 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5194 /* Front Pin: output 0 (0x0c) */
5195 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5196 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5197 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
5198 /* HP Pin: output 0 (0x0d) */
5199 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc4},
5200 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
5201 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
5202 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
5203 /* Mic (rear) pin: input vref at 80% */
5204 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
5205 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
5206 /* Front Mic pin: input vref at 80% */
5207 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
5208 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
5209 /* Line In pin: use output 1 when in LineOut mode */
5210 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
5211 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
5212 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
5213
5214 /* FIXME: use matrix-type input source selection */
5215 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
5216 /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
5217 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5218 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
5219 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
5220 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
5221 /* Input mixer2 */
5222 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5223 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
5224 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
5225 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
5226 /* Input mixer3 */
5227 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5228 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
5229 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
5230 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
5231 /* ADC1: mute amp left and right */
5232 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5233 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
5234 /* ADC2: mute amp left and right */
5235 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5236 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
5237 /* ADC3: mute amp left and right */
5238 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5239 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
5240
5241 { }
5242};
5243
5138/* iMac 24 mixer. */ 5244/* iMac 24 mixer. */
5139static struct snd_kcontrol_new alc885_imac24_mixer[] = { 5245static struct snd_kcontrol_new alc885_imac24_mixer[] = {
5140 HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x00, HDA_OUTPUT), 5246 HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
@@ -5185,6 +5291,27 @@ static void alc885_imac24_unsol_event(struct hda_codec *codec,
5185 alc885_imac24_automute(codec); 5291 alc885_imac24_automute(codec);
5186} 5292}
5187 5293
5294static void alc885_mbp3_automute(struct hda_codec *codec)
5295{
5296 unsigned int present;
5297
5298 present = snd_hda_codec_read(codec, 0x15, 0,
5299 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000;
5300 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
5301 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
5302 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
5303 HDA_AMP_MUTE, present ? 0 : HDA_AMP_MUTE);
5304
5305}
5306static void alc885_mbp3_unsol_event(struct hda_codec *codec,
5307 unsigned int res)
5308{
5309 /* Headphone insertion or removal. */
5310 if ((res >> 26) == ALC880_HP_EVENT)
5311 alc885_mbp3_automute(codec);
5312}
5313
5314
5188static struct hda_verb alc882_targa_verbs[] = { 5315static struct hda_verb alc882_targa_verbs[] = {
5189 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 5316 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5190 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 5317 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
@@ -5422,6 +5549,7 @@ static const char *alc882_models[ALC882_MODEL_LAST] = {
5422 [ALC882_ARIMA] = "arima", 5549 [ALC882_ARIMA] = "arima",
5423 [ALC882_W2JC] = "w2jc", 5550 [ALC882_W2JC] = "w2jc",
5424 [ALC885_MACPRO] = "macpro", 5551 [ALC885_MACPRO] = "macpro",
5552 [ALC885_MBP3] = "mbp3",
5425 [ALC885_IMAC24] = "imac24", 5553 [ALC885_IMAC24] = "imac24",
5426 [ALC882_AUTO] = "auto", 5554 [ALC882_AUTO] = "auto",
5427}; 5555};
@@ -5484,6 +5612,20 @@ static struct alc_config_preset alc882_presets[] = {
5484 .input_mux = &alc882_capture_source, 5612 .input_mux = &alc882_capture_source,
5485 .dig_out_nid = ALC882_DIGOUT_NID, 5613 .dig_out_nid = ALC882_DIGOUT_NID,
5486 }, 5614 },
5615 [ALC885_MBP3] = {
5616 .mixers = { alc885_mbp3_mixer, alc882_chmode_mixer },
5617 .init_verbs = { alc885_mbp3_init_verbs,
5618 alc880_gpio1_init_verbs },
5619 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
5620 .dac_nids = alc882_dac_nids,
5621 .channel_mode = alc885_mbp_6ch_modes,
5622 .num_channel_mode = ARRAY_SIZE(alc885_mbp_6ch_modes),
5623 .input_mux = &alc882_capture_source,
5624 .dig_out_nid = ALC882_DIGOUT_NID,
5625 .dig_in_nid = ALC882_DIGIN_NID,
5626 .unsol_event = alc885_mbp3_unsol_event,
5627 .init_hook = alc885_mbp3_automute,
5628 },
5487 [ALC885_MACPRO] = { 5629 [ALC885_MACPRO] = {
5488 .mixers = { alc882_macpro_mixer }, 5630 .mixers = { alc882_macpro_mixer },
5489 .init_verbs = { alc882_macpro_init_verbs }, 5631 .init_verbs = { alc882_macpro_init_verbs },
@@ -5684,6 +5826,9 @@ static int patch_alc882(struct hda_codec *codec)
5684 case 0x106b1000: /* iMac 24 */ 5826 case 0x106b1000: /* iMac 24 */
5685 board_config = ALC885_IMAC24; 5827 board_config = ALC885_IMAC24;
5686 break; 5828 break;
5829 case 0x106b2c00: /* Macbook Pro rev3 */
5830 board_config = ALC885_MBP3;
5831 break;
5687 default: 5832 default:
5688 printk(KERN_INFO "hda_codec: Unknown model for ALC882, " 5833 printk(KERN_INFO "hda_codec: Unknown model for ALC882, "
5689 "trying auto-probe from BIOS...\n"); 5834 "trying auto-probe from BIOS...\n");