Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6

* 'for-linus' of ssh://master.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6: (21 commits)
ALSA: usb - Use strlcat() correctly
ALSA: Fix invalid __exit in sound/mips/*.c
ALSA: hda - Fix / improve ALC66x parser
ALSA: ctxfi: Swapped SURROUND-SIDE mute
sound: Make keywest_driver static
ALSA: intel8x0 - Mute External Amplifier by default for Sony VAIO VGN-B1VP
ALSA: hda - Fix digita/analog mic auto-switching with IDT codecs
ASoC: fix kconfig order of Blackfin drivers
ALSA: hda - Added quirk to enable sound on Toshiba NB200
ASoC: Fix dependency of CONFIG_SND_PXA2XX_SOC_IMOTE2
ALSA: Don't assume i2c device probing always succeeds
ALSA: intel8x0 - Mute External Amplifier by default for Sony VAIO VGN-T350P
ALSA: echoaudio - Re-enable the line-out control for the Mia card
ALSA: hda - Resurrect input-source mixer of ALC268 model=acer
ALSA: hda - Analog Devices AD1984A add HP Touchsmart model
ALSA: hda - Add HP Pavilion dv4t-1300 to MSI whitelist
ALSA: hda - CD-audio sound for hda-intel conexant benq laptop
ASoC: DaVinci: Correct McASP FIFO initialization
ASoC: Davinci: Fix race with cpu_dai->dma_data
ASoC: DaVinci: Fix divide by zero error during 1st execution
...

+514 -258
+1
Documentation/sound/alsa/HD-Audio-Models.txt
··· 209 laptop laptop with HP jack sensing 210 mobile mobile devices with HP jack sensing 211 thinkpad Lenovo Thinkpad X300 212 213 AD1884 214 ======
··· 209 laptop laptop with HP jack sensing 210 mobile mobile devices with HP jack sensing 211 thinkpad Lenovo Thinkpad X300 212 + touchsmart HP Touchsmart 213 214 AD1884 215 ======
+9
sound/aoa/codecs/tas.c
··· 897 client = i2c_new_device(adapter, &info); 898 if (!client) 899 return -ENODEV; 900 901 /* 902 * Let i2c-core delete that device on driver removal.
··· 897 client = i2c_new_device(adapter, &info); 898 if (!client) 899 return -ENODEV; 900 + /* 901 + * We know the driver is already loaded, so the device should be 902 + * already bound. If not it means binding failed, and then there 903 + * is no point in keeping the device instantiated. 904 + */ 905 + if (!client->driver) { 906 + i2c_unregister_device(client); 907 + return -ENODEV; 908 + } 909 910 /* 911 * Let i2c-core delete that device on driver removal.
+1 -1
sound/mips/hal2.c
··· 915 return 0; 916 } 917 918 - static int __exit hal2_remove(struct platform_device *pdev) 919 { 920 struct snd_card *card = platform_get_drvdata(pdev); 921
··· 915 return 0; 916 } 917 918 + static int __devexit hal2_remove(struct platform_device *pdev) 919 { 920 struct snd_card *card = platform_get_drvdata(pdev); 921
+1 -1
sound/mips/sgio2audio.c
··· 973 return 0; 974 } 975 976 - static int __exit snd_sgio2audio_remove(struct platform_device *pdev) 977 { 978 struct snd_card *card = platform_get_drvdata(pdev); 979
··· 973 return 0; 974 } 975 976 + static int __devexit snd_sgio2audio_remove(struct platform_device *pdev) 977 { 978 struct snd_card *card = platform_get_drvdata(pdev); 979
+2 -2
sound/pci/ctxfi/ctatc.c
··· 1037 1038 static int atc_line_surround_unmute(struct ct_atc *atc, unsigned char state) 1039 { 1040 - return atc_daio_unmute(atc, state, LINEO4); 1041 } 1042 1043 static int atc_line_clfe_unmute(struct ct_atc *atc, unsigned char state) ··· 1047 1048 static int atc_line_rear_unmute(struct ct_atc *atc, unsigned char state) 1049 { 1050 - return atc_daio_unmute(atc, state, LINEO2); 1051 } 1052 1053 static int atc_line_in_unmute(struct ct_atc *atc, unsigned char state)
··· 1037 1038 static int atc_line_surround_unmute(struct ct_atc *atc, unsigned char state) 1039 { 1040 + return atc_daio_unmute(atc, state, LINEO2); 1041 } 1042 1043 static int atc_line_clfe_unmute(struct ct_atc *atc, unsigned char state) ··· 1047 1048 static int atc_line_rear_unmute(struct ct_atc *atc, unsigned char state) 1049 { 1050 + return atc_daio_unmute(atc, state, LINEO4); 1051 } 1052 1053 static int atc_line_in_unmute(struct ct_atc *atc, unsigned char state)
+26 -4
sound/pci/echoaudio/echoaudio.c
··· 950 Control interface 951 ******************************************************************************/ 952 953 - #ifndef ECHOCARD_HAS_VMIXER 954 955 /******************* PCM output volume *******************/ 956 static int snd_echo_output_gain_info(struct snd_kcontrol *kcontrol, ··· 1003 return changed; 1004 } 1005 1006 static struct snd_kcontrol_new snd_echo_pcm_output_gain __devinitdata = { 1007 .name = "PCM Playback Volume", 1008 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, ··· 1025 .put = snd_echo_output_gain_put, 1026 .tlv = {.p = db_scale_output_gain}, 1027 }; 1028 - 1029 #endif 1030 1031 1032 ··· 2044 snd_echo_vmixer.count = num_pipes_out(chip) * num_busses_out(chip); 2045 if ((err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_vmixer, chip))) < 0) 2046 goto ctl_error; 2047 - #else 2048 - if ((err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_pcm_output_gain, chip))) < 0) 2049 goto ctl_error; 2050 #endif 2051 2052 #ifdef ECHOCARD_HAS_INPUT_GAIN 2053 if ((err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_line_input_gain, chip))) < 0)
··· 950 Control interface 951 ******************************************************************************/ 952 953 + #if !defined(ECHOCARD_HAS_VMIXER) || defined(ECHOCARD_HAS_LINE_OUT_GAIN) 954 955 /******************* PCM output volume *******************/ 956 static int snd_echo_output_gain_info(struct snd_kcontrol *kcontrol, ··· 1003 return changed; 1004 } 1005 1006 + #ifdef ECHOCARD_HAS_LINE_OUT_GAIN 1007 + /* On the Mia this one controls the line-out volume */ 1008 + static struct snd_kcontrol_new snd_echo_line_output_gain __devinitdata = { 1009 + .name = "Line Playback Volume", 1010 + .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 1011 + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | 1012 + SNDRV_CTL_ELEM_ACCESS_TLV_READ, 1013 + .info = snd_echo_output_gain_info, 1014 + .get = snd_echo_output_gain_get, 1015 + .put = snd_echo_output_gain_put, 1016 + .tlv = {.p = db_scale_output_gain}, 1017 + }; 1018 + #else 1019 static struct snd_kcontrol_new snd_echo_pcm_output_gain __devinitdata = { 1020 .name = "PCM Playback Volume", 1021 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, ··· 1012 .put = snd_echo_output_gain_put, 1013 .tlv = {.p = db_scale_output_gain}, 1014 }; 1015 #endif 1016 + 1017 + #endif /* !ECHOCARD_HAS_VMIXER || ECHOCARD_HAS_LINE_OUT_GAIN */ 1018 1019 1020 ··· 2030 snd_echo_vmixer.count = num_pipes_out(chip) * num_busses_out(chip); 2031 if ((err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_vmixer, chip))) < 0) 2032 goto ctl_error; 2033 + #ifdef ECHOCARD_HAS_LINE_OUT_GAIN 2034 + err = snd_ctl_add(chip->card, 2035 + snd_ctl_new1(&snd_echo_line_output_gain, chip)); 2036 + if (err < 0) 2037 goto ctl_error; 2038 #endif 2039 + #else /* ECHOCARD_HAS_VMIXER */ 2040 + err = snd_ctl_add(chip->card, 2041 + snd_ctl_new1(&snd_echo_pcm_output_gain, chip)); 2042 + if (err < 0) 2043 + goto ctl_error; 2044 + #endif /* ECHOCARD_HAS_VMIXER */ 2045 2046 #ifdef ECHOCARD_HAS_INPUT_GAIN 2047 if ((err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_line_input_gain, chip))) < 0)
+1
sound/pci/echoaudio/mia.c
··· 29 #define ECHOCARD_HAS_ADAT FALSE 30 #define ECHOCARD_HAS_STEREO_BIG_ENDIAN32 31 #define ECHOCARD_HAS_MIDI 32 33 /* Pipe indexes */ 34 #define PX_ANALOG_OUT 0 /* 8 */
··· 29 #define ECHOCARD_HAS_ADAT FALSE 30 #define ECHOCARD_HAS_STEREO_BIG_ENDIAN32 31 #define ECHOCARD_HAS_MIDI 32 + #define ECHOCARD_HAS_LINE_OUT_GAIN 33 34 /* Pipe indexes */ 35 #define PX_ANALOG_OUT 0 /* 8 */
+1
sound/pci/hda/hda_intel.c
··· 2303 * white-list for enable_msi 2304 */ 2305 static struct snd_pci_quirk msi_white_list[] __devinitdata = { 2306 SND_PCI_QUIRK(0x103c, 0x3607, "HP Compa CQ40", 1), 2307 {} 2308 };
··· 2303 * white-list for enable_msi 2304 */ 2305 static struct snd_pci_quirk msi_white_list[] __devinitdata = { 2306 + SND_PCI_QUIRK(0x103c, 0x30f7, "HP Pavilion dv4t-1300", 1), 2307 SND_PCI_QUIRK(0x103c, 0x3607, "HP Compa CQ40", 1), 2308 {} 2309 };
+139
sound/pci/hda/patch_analog.c
··· 4032 } 4033 4034 /* 4035 */ 4036 4037 enum { ··· 4160 AD1884A_LAPTOP, 4161 AD1884A_MOBILE, 4162 AD1884A_THINKPAD, 4163 AD1884A_MODELS 4164 }; 4165 ··· 4169 [AD1884A_LAPTOP] = "laptop", 4170 [AD1884A_MOBILE] = "mobile", 4171 [AD1884A_THINKPAD] = "thinkpad", 4172 }; 4173 4174 static struct snd_pci_quirk ad1884a_cfg_tbl[] = { ··· 4182 SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x3600, "HP laptop", AD1884A_LAPTOP), 4183 SND_PCI_QUIRK_MASK(0x103c, 0xfff0, 0x7010, "HP laptop", AD1884A_MOBILE), 4184 SND_PCI_QUIRK(0x17aa, 0x20ac, "Thinkpad X300", AD1884A_THINKPAD), 4185 {} 4186 }; 4187 ··· 4265 spec->input_mux = &ad1984a_thinkpad_capture_source; 4266 codec->patch_ops.unsol_event = ad1984a_thinkpad_unsol_event; 4267 codec->patch_ops.init = ad1984a_thinkpad_init; 4268 break; 4269 } 4270
··· 4032 } 4033 4034 /* 4035 + * HP Touchsmart 4036 + * port-A (0x11) - front hp-out 4037 + * port-B (0x14) - unused 4038 + * port-C (0x15) - unused 4039 + * port-D (0x12) - rear line out 4040 + * port-E (0x1c) - front mic-in 4041 + * port-F (0x16) - Internal speakers 4042 + * digital-mic (0x17) - Internal mic 4043 + */ 4044 + 4045 + static struct hda_verb ad1984a_touchsmart_verbs[] = { 4046 + /* DACs; unmute as default */ 4047 + {0x03, AC_VERB_SET_AMP_GAIN_MUTE, 0x27}, /* 0dB */ 4048 + {0x04, AC_VERB_SET_AMP_GAIN_MUTE, 0x27}, /* 0dB */ 4049 + /* Port-A (HP) mixer - route only from analog mixer */ 4050 + {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 4051 + {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 4052 + /* Port-A pin */ 4053 + {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 4054 + /* Port-A (HP) pin - always unmuted */ 4055 + {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 4056 + /* Port-E (int speaker) mixer - route only from analog mixer */ 4057 + {0x25, AC_VERB_SET_AMP_GAIN_MUTE, 0x03}, 4058 + /* Port-E pin */ 4059 + {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 4060 + {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 4061 + {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 4062 + /* Port-F (int speaker) mixer - route only from analog mixer */ 4063 + {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 4064 + {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 4065 + /* Port-F pin */ 4066 + {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 4067 + {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 4068 + /* Analog mixer; mute as default */ 4069 + {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 4070 + {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 4071 + {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 4072 + {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 4073 + {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, 4074 + {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, 4075 + /* Analog Mix output amp */ 4076 + {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 4077 + /* capture sources */ 4078 + /* {0x0c, AC_VERB_SET_CONNECT_SEL, 0x0}, */ /* set via unsol */ 4079 + {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 4080 + {0x0d, AC_VERB_SET_CONNECT_SEL, 0x0}, 4081 + {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 4082 + /* unsolicited event for pin-sense */ 4083 + {0x11, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | AD1884A_HP_EVENT}, 4084 + {0x1c, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | AD1884A_MIC_EVENT}, 4085 + /* allow to touch GPIO1 (for mute control) */ 4086 + {0x01, AC_VERB_SET_GPIO_MASK, 0x02}, 4087 + {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x02}, 4088 + {0x01, AC_VERB_SET_GPIO_DATA, 0x02}, /* first muted */ 4089 + /* internal mic - dmic */ 4090 + {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 4091 + /* set magic COEFs for dmic */ 4092 + {0x01, AC_VERB_SET_COEF_INDEX, 0x13f7}, 4093 + {0x01, AC_VERB_SET_PROC_COEF, 0x08}, 4094 + { } /* end */ 4095 + }; 4096 + 4097 + static struct snd_kcontrol_new ad1984a_touchsmart_mixers[] = { 4098 + HDA_CODEC_VOLUME("Master Playback Volume", 0x21, 0x0, HDA_OUTPUT), 4099 + /* HDA_CODEC_MUTE("Master Playback Switch", 0x21, 0x0, HDA_OUTPUT),*/ 4100 + { 4101 + .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 4102 + .name = "Master Playback Switch", 4103 + .info = snd_hda_mixer_amp_switch_info, 4104 + .get = snd_hda_mixer_amp_switch_get, 4105 + .put = ad1884a_mobile_master_sw_put, 4106 + .private_value = HDA_COMPOSE_AMP_VAL(0x21, 3, 0, HDA_OUTPUT), 4107 + }, 4108 + HDA_CODEC_VOLUME("PCM Playback Volume", 0x20, 0x5, HDA_INPUT), 4109 + HDA_CODEC_MUTE("PCM Playback Switch", 0x20, 0x5, HDA_INPUT), 4110 + HDA_CODEC_VOLUME("Capture Volume", 0x0c, 0x0, HDA_OUTPUT), 4111 + HDA_CODEC_MUTE("Capture Switch", 0x0c, 0x0, HDA_OUTPUT), 4112 + HDA_CODEC_VOLUME("Mic Boost", 0x25, 0x0, HDA_OUTPUT), 4113 + HDA_CODEC_VOLUME("Internal Mic Boost", 0x17, 0x0, HDA_INPUT), 4114 + { } /* end */ 4115 + }; 4116 + 4117 + /* switch to external mic if plugged */ 4118 + static void ad1984a_touchsmart_automic(struct hda_codec *codec) 4119 + { 4120 + if (snd_hda_codec_read(codec, 0x1c, 0, 4121 + AC_VERB_GET_PIN_SENSE, 0) & 0x80000000) { 4122 + snd_hda_codec_write(codec, 0x0c, 0, 4123 + AC_VERB_SET_CONNECT_SEL, 0x4); 4124 + } else { 4125 + snd_hda_codec_write(codec, 0x0c, 0, 4126 + AC_VERB_SET_CONNECT_SEL, 0x5); 4127 + } 4128 + } 4129 + 4130 + 4131 + /* unsolicited event for HP jack sensing */ 4132 + static void ad1984a_touchsmart_unsol_event(struct hda_codec *codec, 4133 + unsigned int res) 4134 + { 4135 + switch (res >> 26) { 4136 + case AD1884A_HP_EVENT: 4137 + ad1884a_hp_automute(codec); 4138 + break; 4139 + case AD1884A_MIC_EVENT: 4140 + ad1984a_touchsmart_automic(codec); 4141 + break; 4142 + } 4143 + } 4144 + 4145 + /* initialize jack-sensing, too */ 4146 + static int ad1984a_touchsmart_init(struct hda_codec *codec) 4147 + { 4148 + ad198x_init(codec); 4149 + ad1884a_hp_automute(codec); 4150 + ad1984a_touchsmart_automic(codec); 4151 + return 0; 4152 + } 4153 + 4154 + 4155 + /* 4156 */ 4157 4158 enum { ··· 4039 AD1884A_LAPTOP, 4040 AD1884A_MOBILE, 4041 AD1884A_THINKPAD, 4042 + AD1984A_TOUCHSMART, 4043 AD1884A_MODELS 4044 }; 4045 ··· 4047 [AD1884A_LAPTOP] = "laptop", 4048 [AD1884A_MOBILE] = "mobile", 4049 [AD1884A_THINKPAD] = "thinkpad", 4050 + [AD1984A_TOUCHSMART] = "touchsmart", 4051 }; 4052 4053 static struct snd_pci_quirk ad1884a_cfg_tbl[] = { ··· 4059 SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x3600, "HP laptop", AD1884A_LAPTOP), 4060 SND_PCI_QUIRK_MASK(0x103c, 0xfff0, 0x7010, "HP laptop", AD1884A_MOBILE), 4061 SND_PCI_QUIRK(0x17aa, 0x20ac, "Thinkpad X300", AD1884A_THINKPAD), 4062 + SND_PCI_QUIRK(0x103c, 0x2a82, "Touchsmart", AD1984A_TOUCHSMART), 4063 {} 4064 }; 4065 ··· 4141 spec->input_mux = &ad1984a_thinkpad_capture_source; 4142 codec->patch_ops.unsol_event = ad1984a_thinkpad_unsol_event; 4143 codec->patch_ops.init = ad1984a_thinkpad_init; 4144 + break; 4145 + case AD1984A_TOUCHSMART: 4146 + spec->mixers[0] = ad1984a_touchsmart_mixers; 4147 + spec->init_verbs[0] = ad1984a_touchsmart_verbs; 4148 + spec->multiout.dig_out_nid = 0; 4149 + codec->patch_ops.unsol_event = ad1984a_touchsmart_unsol_event; 4150 + codec->patch_ops.init = ad1984a_touchsmart_init; 4151 + /* set the upper-limit for mixer amp to 0dB for avoiding the 4152 + * possible damage by overloading 4153 + */ 4154 + snd_hda_override_amp_caps(codec, 0x20, HDA_INPUT, 4155 + (0x17 << AC_AMPCAP_OFFSET_SHIFT) | 4156 + (0x17 << AC_AMPCAP_NUM_STEPS_SHIFT) | 4157 + (0x05 << AC_AMPCAP_STEP_SIZE_SHIFT) | 4158 + (1 << AC_AMPCAP_MUTE_SHIFT)); 4159 break; 4160 } 4161
+11 -1
sound/pci/hda/patch_conexant.c
··· 682 }; 683 684 static struct hda_input_mux cxt5045_capture_source_benq = { 685 - .num_items = 3, 686 .items = { 687 { "IntMic", 0x1 }, 688 { "ExtMic", 0x2 }, 689 { "LineIn", 0x3 }, 690 } 691 }; 692 ··· 813 }; 814 815 static struct snd_kcontrol_new cxt5045_benq_mixers[] = { 816 HDA_CODEC_VOLUME("Line In Capture Volume", 0x1a, 0x03, HDA_INPUT), 817 HDA_CODEC_MUTE("Line In Capture Switch", 0x1a, 0x03, HDA_INPUT), 818 HDA_CODEC_VOLUME("Line In Playback Volume", 0x17, 0x3, HDA_INPUT), 819 HDA_CODEC_MUTE("Line In Playback Switch", 0x17, 0x3, HDA_INPUT), 820 821 {} 822 };
··· 682 }; 683 684 static struct hda_input_mux cxt5045_capture_source_benq = { 685 + .num_items = 5, 686 .items = { 687 { "IntMic", 0x1 }, 688 { "ExtMic", 0x2 }, 689 { "LineIn", 0x3 }, 690 + { "CD", 0x4 }, 691 + { "Mixer", 0x0 }, 692 } 693 }; 694 ··· 811 }; 812 813 static struct snd_kcontrol_new cxt5045_benq_mixers[] = { 814 + HDA_CODEC_VOLUME("CD Capture Volume", 0x1a, 0x04, HDA_INPUT), 815 + HDA_CODEC_MUTE("CD Capture Switch", 0x1a, 0x04, HDA_INPUT), 816 + HDA_CODEC_VOLUME("CD Playback Volume", 0x17, 0x4, HDA_INPUT), 817 + HDA_CODEC_MUTE("CD Playback Switch", 0x17, 0x4, HDA_INPUT), 818 + 819 HDA_CODEC_VOLUME("Line In Capture Volume", 0x1a, 0x03, HDA_INPUT), 820 HDA_CODEC_MUTE("Line In Capture Switch", 0x1a, 0x03, HDA_INPUT), 821 HDA_CODEC_VOLUME("Line In Playback Volume", 0x17, 0x3, HDA_INPUT), 822 HDA_CODEC_MUTE("Line In Playback Switch", 0x17, 0x3, HDA_INPUT), 823 + 824 + HDA_CODEC_VOLUME("Mixer Capture Volume", 0x1a, 0x0, HDA_INPUT), 825 + HDA_CODEC_MUTE("Mixer Capture Switch", 0x1a, 0x0, HDA_INPUT), 826 827 {} 828 };
+159 -89
sound/pci/hda/patch_realtek.c
··· 12660 .init_hook = alc268_toshiba_automute, 12661 }, 12662 [ALC268_ACER] = { 12663 - .mixers = { alc268_acer_mixer, alc268_capture_nosrc_mixer, 12664 alc268_beep_mixer }, 12665 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs, 12666 alc268_acer_verbs }, ··· 16852 SND_PCI_QUIRK(0x105b, 0x0cd6, "Foxconn", ALC662_ECS), 16853 SND_PCI_QUIRK(0x105b, 0x0d47, "Foxconn 45CMX/45GMX/45CMX-K", 16854 ALC662_3ST_6ch_DIG), 16855 SND_PCI_QUIRK(0x144d, 0xca00, "Samsung NC10", ALC272_SAMSUNG_NC10), 16856 SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte 945GCM-S2L", 16857 ALC662_3ST_6ch_DIG), ··· 17146 * BIOS auto configuration 17147 */ 17148 17149 - /* add playback controls from the parsed DAC table */ 17150 - static int alc662_auto_create_multi_out_ctls(struct alc_spec *spec, 17151 - const struct auto_pin_cfg *cfg) 17152 { 17153 char name[32]; 17154 static const char *chname[4] = { 17155 "Front", "Surround", NULL /*CLFE*/, "Side" 17156 }; 17157 - hda_nid_t nid; 17158 int i, err; 17159 17160 for (i = 0; i < cfg->line_outs; i++) { 17161 - if (!spec->multiout.dac_nids[i]) 17162 continue; 17163 - nid = alc880_idx_to_dac(i); 17164 if (i == 2) { 17165 /* Center/LFE */ 17166 - err = add_control(spec, ALC_CTL_WIDGET_VOL, 17167 - "Center Playback Volume", 17168 - HDA_COMPOSE_AMP_VAL(nid, 1, 0, 17169 - HDA_OUTPUT)); 17170 if (err < 0) 17171 return err; 17172 - err = add_control(spec, ALC_CTL_WIDGET_VOL, 17173 - "LFE Playback Volume", 17174 - HDA_COMPOSE_AMP_VAL(nid, 2, 0, 17175 - HDA_OUTPUT)); 17176 if (err < 0) 17177 return err; 17178 - err = add_control(spec, ALC_CTL_WIDGET_MUTE, 17179 - "Center Playback Switch", 17180 - HDA_COMPOSE_AMP_VAL(0x0e, 1, 0, 17181 - HDA_INPUT)); 17182 if (err < 0) 17183 return err; 17184 - err = add_control(spec, ALC_CTL_WIDGET_MUTE, 17185 - "LFE Playback Switch", 17186 - HDA_COMPOSE_AMP_VAL(0x0e, 2, 0, 17187 - HDA_INPUT)); 17188 if (err < 0) 17189 return err; 17190 } else { 17191 const char *pfx; 17192 if (cfg->line_outs == 1 && 17193 cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) { 17194 - if (!cfg->hp_pins) 17195 pfx = "Speaker"; 17196 else 17197 pfx = "PCM"; 17198 } else 17199 pfx = chname[i]; 17200 - sprintf(name, "%s Playback Volume", pfx); 17201 - err = add_control(spec, ALC_CTL_WIDGET_VOL, name, 17202 - HDA_COMPOSE_AMP_VAL(nid, 3, 0, 17203 - HDA_OUTPUT)); 17204 if (err < 0) 17205 return err; 17206 if (cfg->line_outs == 1 && 17207 cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) 17208 pfx = "Speaker"; 17209 - sprintf(name, "%s Playback Switch", pfx); 17210 - err = add_control(spec, ALC_CTL_WIDGET_MUTE, name, 17211 - HDA_COMPOSE_AMP_VAL(alc880_idx_to_mixer(i), 17212 - 3, 0, HDA_INPUT)); 17213 if (err < 0) 17214 return err; 17215 } ··· 17293 } 17294 17295 /* add playback controls for speaker and HP outputs */ 17296 - static int alc662_auto_create_extra_out(struct alc_spec *spec, hda_nid_t pin, 17297 const char *pfx) 17298 { 17299 - hda_nid_t nid; 17300 int err; 17301 - char name[32]; 17302 17303 if (!pin) 17304 return 0; 17305 - 17306 - if (pin == 0x17) { 17307 - /* ALC663 has a mono output pin on 0x17 */ 17308 sprintf(name, "%s Playback Switch", pfx); 17309 - err = add_control(spec, ALC_CTL_WIDGET_MUTE, name, 17310 - HDA_COMPOSE_AMP_VAL(pin, 2, 0, HDA_OUTPUT)); 17311 return err; 17312 - } 17313 - 17314 - if (alc880_is_fixed_pin(pin)) { 17315 - nid = alc880_idx_to_dac(alc880_fixed_pin_idx(pin)); 17316 - /* printk(KERN_DEBUG "DAC nid=%x\n",nid); */ 17317 - /* specify the DAC as the extra output */ 17318 - if (!spec->multiout.hp_nid) 17319 - spec->multiout.hp_nid = nid; 17320 - else 17321 - spec->multiout.extra_out_nid[0] = nid; 17322 - /* control HP volume/switch on the output mixer amp */ 17323 - nid = alc880_idx_to_dac(alc880_fixed_pin_idx(pin)); 17324 - sprintf(name, "%s Playback Volume", pfx); 17325 - err = add_control(spec, ALC_CTL_WIDGET_VOL, name, 17326 - HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT)); 17327 - if (err < 0) 17328 - return err; 17329 - sprintf(name, "%s Playback Switch", pfx); 17330 - err = add_control(spec, ALC_CTL_BIND_MUTE, name, 17331 - HDA_COMPOSE_AMP_VAL(nid, 3, 2, HDA_INPUT)); 17332 - if (err < 0) 17333 - return err; 17334 - } else if (alc880_is_multi_pin(pin)) { 17335 - /* set manual connection */ 17336 - /* we have only a switch on HP-out PIN */ 17337 - sprintf(name, "%s Playback Switch", pfx); 17338 - err = add_control(spec, ALC_CTL_WIDGET_MUTE, name, 17339 - HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_OUTPUT)); 17340 - if (err < 0) 17341 - return err; 17342 - } 17343 - return 0; 17344 } 17345 17346 /* create playback/capture controls for input pins */ ··· 17333 17334 static void alc662_auto_set_output_and_unmute(struct hda_codec *codec, 17335 hda_nid_t nid, int pin_type, 17336 - int dac_idx) 17337 { 17338 alc_set_pin_output(codec, nid, pin_type); 17339 /* need the manual connection? */ 17340 - if (alc880_is_multi_pin(nid)) { 17341 - struct alc_spec *spec = codec->spec; 17342 - int idx = alc880_multi_pin_idx(nid); 17343 - snd_hda_codec_write(codec, alc880_idx_to_selector(idx), 0, 17344 - AC_VERB_SET_CONNECT_SEL, 17345 - alc880_dac_to_idx(spec->multiout.dac_nids[dac_idx])); 17346 } 17347 } 17348 17349 static void alc662_auto_init_multi_out(struct hda_codec *codec) 17350 { 17351 struct alc_spec *spec = codec->spec; 17352 int i; 17353 17354 for (i = 0; i <= HDA_SIDE; i++) { 17355 hda_nid_t nid = spec->autocfg.line_out_pins[i]; 17356 - int pin_type = get_pin_type(spec->autocfg.line_out_type); 17357 if (nid) 17358 alc662_auto_set_output_and_unmute(codec, nid, pin_type, 17359 - i); 17360 } 17361 } 17362 ··· 17371 hda_nid_t pin; 17372 17373 pin = spec->autocfg.hp_pins[0]; 17374 - if (pin) /* connect to front */ 17375 - /* use dac 0 */ 17376 - alc662_auto_set_output_and_unmute(codec, pin, PIN_HP, 0); 17377 pin = spec->autocfg.speaker_pins[0]; 17378 if (pin) 17379 - alc662_auto_set_output_and_unmute(codec, pin, PIN_OUT, 0); 17380 } 17381 17382 #define ALC662_PIN_CD_NID ALC880_PIN_CD_NID ··· 17415 if (!spec->autocfg.line_outs) 17416 return 0; /* can't find valid BIOS pin config */ 17417 17418 - err = alc880_auto_fill_dac_nids(spec, &spec->autocfg); 17419 if (err < 0) 17420 return err; 17421 - err = alc662_auto_create_multi_out_ctls(spec, &spec->autocfg); 17422 if (err < 0) 17423 return err; 17424 - err = alc662_auto_create_extra_out(spec, 17425 spec->autocfg.speaker_pins[0], 17426 "Speaker"); 17427 if (err < 0) 17428 return err; 17429 - err = alc662_auto_create_extra_out(spec, spec->autocfg.hp_pins[0], 17430 "Headphone"); 17431 if (err < 0) 17432 return err; 17433 err = alc662_auto_create_input_ctls(codec, &spec->autocfg); 17434 if (err < 0) 17435 return err;
··· 12660 .init_hook = alc268_toshiba_automute, 12661 }, 12662 [ALC268_ACER] = { 12663 + .mixers = { alc268_acer_mixer, alc268_capture_alt_mixer, 12664 alc268_beep_mixer }, 12665 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs, 12666 alc268_acer_verbs }, ··· 16852 SND_PCI_QUIRK(0x105b, 0x0cd6, "Foxconn", ALC662_ECS), 16853 SND_PCI_QUIRK(0x105b, 0x0d47, "Foxconn 45CMX/45GMX/45CMX-K", 16854 ALC662_3ST_6ch_DIG), 16855 + SND_PCI_QUIRK(0x1179, 0xff6e, "Toshiba NB200", ALC663_ASUS_MODE4), 16856 SND_PCI_QUIRK(0x144d, 0xca00, "Samsung NC10", ALC272_SAMSUNG_NC10), 16857 SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte 945GCM-S2L", 16858 ALC662_3ST_6ch_DIG), ··· 17145 * BIOS auto configuration 17146 */ 17147 17148 + /* convert from MIX nid to DAC */ 17149 + static inline hda_nid_t alc662_mix_to_dac(hda_nid_t nid) 17150 + { 17151 + if (nid == 0x0f) 17152 + return 0x02; 17153 + else if (nid >= 0x0c && nid <= 0x0e) 17154 + return nid - 0x0c + 0x02; 17155 + else 17156 + return 0; 17157 + } 17158 + 17159 + /* get MIX nid connected to the given pin targeted to DAC */ 17160 + static hda_nid_t alc662_dac_to_mix(struct hda_codec *codec, hda_nid_t pin, 17161 + hda_nid_t dac) 17162 + { 17163 + hda_nid_t mix[4]; 17164 + int i, num; 17165 + 17166 + num = snd_hda_get_connections(codec, pin, mix, ARRAY_SIZE(mix)); 17167 + for (i = 0; i < num; i++) { 17168 + if (alc662_mix_to_dac(mix[i]) == dac) 17169 + return mix[i]; 17170 + } 17171 + return 0; 17172 + } 17173 + 17174 + /* look for an empty DAC slot */ 17175 + static hda_nid_t alc662_look_for_dac(struct hda_codec *codec, hda_nid_t pin) 17176 + { 17177 + struct alc_spec *spec = codec->spec; 17178 + hda_nid_t srcs[5]; 17179 + int i, j, num; 17180 + 17181 + num = snd_hda_get_connections(codec, pin, srcs, ARRAY_SIZE(srcs)); 17182 + if (num < 0) 17183 + return 0; 17184 + for (i = 0; i < num; i++) { 17185 + hda_nid_t nid = alc662_mix_to_dac(srcs[i]); 17186 + if (!nid) 17187 + continue; 17188 + for (j = 0; j < spec->multiout.num_dacs; j++) 17189 + if (spec->multiout.dac_nids[j] == nid) 17190 + break; 17191 + if (j >= spec->multiout.num_dacs) 17192 + return nid; 17193 + } 17194 + return 0; 17195 + } 17196 + 17197 + /* fill in the dac_nids table from the parsed pin configuration */ 17198 + static int alc662_auto_fill_dac_nids(struct hda_codec *codec, 17199 + const struct auto_pin_cfg *cfg) 17200 + { 17201 + struct alc_spec *spec = codec->spec; 17202 + int i; 17203 + hda_nid_t dac; 17204 + 17205 + spec->multiout.dac_nids = spec->private_dac_nids; 17206 + for (i = 0; i < cfg->line_outs; i++) { 17207 + dac = alc662_look_for_dac(codec, cfg->line_out_pins[i]); 17208 + if (!dac) 17209 + continue; 17210 + spec->multiout.dac_nids[spec->multiout.num_dacs++] = dac; 17211 + } 17212 + return 0; 17213 + } 17214 + 17215 + static int alc662_add_vol_ctl(struct alc_spec *spec, const char *pfx, 17216 + hda_nid_t nid, unsigned int chs) 17217 { 17218 char name[32]; 17219 + sprintf(name, "%s Playback Volume", pfx); 17220 + return add_control(spec, ALC_CTL_WIDGET_VOL, name, 17221 + HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_OUTPUT)); 17222 + } 17223 + 17224 + static int alc662_add_sw_ctl(struct alc_spec *spec, const char *pfx, 17225 + hda_nid_t nid, unsigned int chs) 17226 + { 17227 + char name[32]; 17228 + sprintf(name, "%s Playback Switch", pfx); 17229 + return add_control(spec, ALC_CTL_WIDGET_MUTE, name, 17230 + HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_INPUT)); 17231 + } 17232 + 17233 + #define alc662_add_stereo_vol(spec, pfx, nid) \ 17234 + alc662_add_vol_ctl(spec, pfx, nid, 3) 17235 + #define alc662_add_stereo_sw(spec, pfx, nid) \ 17236 + alc662_add_sw_ctl(spec, pfx, nid, 3) 17237 + 17238 + /* add playback controls from the parsed DAC table */ 17239 + static int alc662_auto_create_multi_out_ctls(struct hda_codec *codec, 17240 + const struct auto_pin_cfg *cfg) 17241 + { 17242 + struct alc_spec *spec = codec->spec; 17243 static const char *chname[4] = { 17244 "Front", "Surround", NULL /*CLFE*/, "Side" 17245 }; 17246 + hda_nid_t nid, mix; 17247 int i, err; 17248 17249 for (i = 0; i < cfg->line_outs; i++) { 17250 + nid = spec->multiout.dac_nids[i]; 17251 + if (!nid) 17252 continue; 17253 + mix = alc662_dac_to_mix(codec, cfg->line_out_pins[i], nid); 17254 + if (!mix) 17255 + continue; 17256 if (i == 2) { 17257 /* Center/LFE */ 17258 + err = alc662_add_vol_ctl(spec, "Center", nid, 1); 17259 if (err < 0) 17260 return err; 17261 + err = alc662_add_vol_ctl(spec, "LFE", nid, 2); 17262 if (err < 0) 17263 return err; 17264 + err = alc662_add_sw_ctl(spec, "Center", mix, 1); 17265 if (err < 0) 17266 return err; 17267 + err = alc662_add_sw_ctl(spec, "LFE", mix, 2); 17268 if (err < 0) 17269 return err; 17270 } else { 17271 const char *pfx; 17272 if (cfg->line_outs == 1 && 17273 cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) { 17274 + if (cfg->hp_outs) 17275 pfx = "Speaker"; 17276 else 17277 pfx = "PCM"; 17278 } else 17279 pfx = chname[i]; 17280 + err = alc662_add_vol_ctl(spec, pfx, nid, 3); 17281 if (err < 0) 17282 return err; 17283 if (cfg->line_outs == 1 && 17284 cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) 17285 pfx = "Speaker"; 17286 + err = alc662_add_sw_ctl(spec, pfx, mix, 3); 17287 if (err < 0) 17288 return err; 17289 } ··· 17217 } 17218 17219 /* add playback controls for speaker and HP outputs */ 17220 + /* return DAC nid if any new DAC is assigned */ 17221 + static int alc662_auto_create_extra_out(struct hda_codec *codec, hda_nid_t pin, 17222 const char *pfx) 17223 { 17224 + struct alc_spec *spec = codec->spec; 17225 + hda_nid_t nid, mix; 17226 int err; 17227 17228 if (!pin) 17229 return 0; 17230 + nid = alc662_look_for_dac(codec, pin); 17231 + if (!nid) { 17232 + char name[32]; 17233 + /* the corresponding DAC is already occupied */ 17234 + if (!(get_wcaps(codec, pin) & AC_WCAP_OUT_AMP)) 17235 + return 0; /* no way */ 17236 + /* create a switch only */ 17237 sprintf(name, "%s Playback Switch", pfx); 17238 + return add_control(spec, ALC_CTL_WIDGET_MUTE, name, 17239 + HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_OUTPUT)); 17240 + } 17241 + 17242 + mix = alc662_dac_to_mix(codec, pin, nid); 17243 + if (!mix) 17244 + return 0; 17245 + err = alc662_add_vol_ctl(spec, pfx, nid, 3); 17246 + if (err < 0) 17247 return err; 17248 + err = alc662_add_sw_ctl(spec, pfx, mix, 3); 17249 + if (err < 0) 17250 + return err; 17251 + return nid; 17252 } 17253 17254 /* create playback/capture controls for input pins */ ··· 17273 17274 static void alc662_auto_set_output_and_unmute(struct hda_codec *codec, 17275 hda_nid_t nid, int pin_type, 17276 + hda_nid_t dac) 17277 { 17278 + int i, num; 17279 + hda_nid_t srcs[4]; 17280 + 17281 alc_set_pin_output(codec, nid, pin_type); 17282 /* need the manual connection? */ 17283 + num = snd_hda_get_connections(codec, nid, srcs, ARRAY_SIZE(srcs)); 17284 + if (num <= 1) 17285 + return; 17286 + for (i = 0; i < num; i++) { 17287 + if (alc662_mix_to_dac(srcs[i]) != dac) 17288 + continue; 17289 + snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CONNECT_SEL, i); 17290 + return; 17291 } 17292 } 17293 17294 static void alc662_auto_init_multi_out(struct hda_codec *codec) 17295 { 17296 struct alc_spec *spec = codec->spec; 17297 + int pin_type = get_pin_type(spec->autocfg.line_out_type); 17298 int i; 17299 17300 for (i = 0; i <= HDA_SIDE; i++) { 17301 hda_nid_t nid = spec->autocfg.line_out_pins[i]; 17302 if (nid) 17303 alc662_auto_set_output_and_unmute(codec, nid, pin_type, 17304 + spec->multiout.dac_nids[i]); 17305 } 17306 } 17307 ··· 17306 hda_nid_t pin; 17307 17308 pin = spec->autocfg.hp_pins[0]; 17309 + if (pin) 17310 + alc662_auto_set_output_and_unmute(codec, pin, PIN_HP, 17311 + spec->multiout.hp_nid); 17312 pin = spec->autocfg.speaker_pins[0]; 17313 if (pin) 17314 + alc662_auto_set_output_and_unmute(codec, pin, PIN_OUT, 17315 + spec->multiout.extra_out_nid[0]); 17316 } 17317 17318 #define ALC662_PIN_CD_NID ALC880_PIN_CD_NID ··· 17349 if (!spec->autocfg.line_outs) 17350 return 0; /* can't find valid BIOS pin config */ 17351 17352 + err = alc662_auto_fill_dac_nids(codec, &spec->autocfg); 17353 if (err < 0) 17354 return err; 17355 + err = alc662_auto_create_multi_out_ctls(codec, &spec->autocfg); 17356 if (err < 0) 17357 return err; 17358 + err = alc662_auto_create_extra_out(codec, 17359 spec->autocfg.speaker_pins[0], 17360 "Speaker"); 17361 if (err < 0) 17362 return err; 17363 + if (err) 17364 + spec->multiout.extra_out_nid[0] = err; 17365 + err = alc662_auto_create_extra_out(codec, spec->autocfg.hp_pins[0], 17366 "Headphone"); 17367 if (err < 0) 17368 return err; 17369 + if (err) 17370 + spec->multiout.hp_nid = err; 17371 err = alc662_auto_create_input_ctls(codec, &spec->autocfg); 17372 if (err < 0) 17373 return err;
+14 -6
sound/pci/hda/patch_sigmatel.c
··· 182 183 struct sigmatel_mic_route { 184 hda_nid_t pin; 185 - unsigned char mux_idx; 186 - unsigned char dmux_idx; 187 }; 188 189 struct sigmatel_spec { ··· 3469 break; 3470 if (i <= AUTO_PIN_FRONT_MIC) { 3471 /* analog pin */ 3472 - mic->dmux_idx = 0; 3473 i = get_connection_index(codec, spec->mux_nids[0], pin); 3474 if (i < 0) 3475 return -1; 3476 mic->mux_idx = i; 3477 } else if (spec->dmux_nids) { 3478 /* digital pin */ 3479 - mic->mux_idx = 0; 3480 i = get_connection_index(codec, spec->dmux_nids[0], pin); 3481 if (i < 0) 3482 return -1; 3483 mic->dmux_idx = i; 3484 } 3485 return 0; 3486 } ··· 4565 mic = &spec->ext_mic; 4566 else 4567 mic = &spec->int_mic; 4568 - if (mic->dmux_idx) 4569 snd_hda_codec_write_cache(codec, spec->dmux_nids[0], 0, 4570 AC_VERB_SET_CONNECT_SEL, 4571 mic->dmux_idx); 4572 - else 4573 snd_hda_codec_write_cache(codec, spec->mux_nids[0], 0, 4574 AC_VERB_SET_CONNECT_SEL, 4575 mic->mux_idx);
··· 182 183 struct sigmatel_mic_route { 184 hda_nid_t pin; 185 + signed char mux_idx; 186 + signed char dmux_idx; 187 }; 188 189 struct sigmatel_spec { ··· 3469 break; 3470 if (i <= AUTO_PIN_FRONT_MIC) { 3471 /* analog pin */ 3472 i = get_connection_index(codec, spec->mux_nids[0], pin); 3473 if (i < 0) 3474 return -1; 3475 mic->mux_idx = i; 3476 + mic->dmux_idx = -1; 3477 + if (spec->dmux_nids) 3478 + mic->dmux_idx = get_connection_index(codec, 3479 + spec->dmux_nids[0], 3480 + spec->mux_nids[0]); 3481 } else if (spec->dmux_nids) { 3482 /* digital pin */ 3483 i = get_connection_index(codec, spec->dmux_nids[0], pin); 3484 if (i < 0) 3485 return -1; 3486 mic->dmux_idx = i; 3487 + mic->mux_idx = -1; 3488 + if (spec->mux_nids) 3489 + mic->mux_idx = get_connection_index(codec, 3490 + spec->mux_nids[0], 3491 + spec->dmux_nids[0]); 3492 } 3493 return 0; 3494 } ··· 4557 mic = &spec->ext_mic; 4558 else 4559 mic = &spec->int_mic; 4560 + if (mic->dmux_idx >= 0) 4561 snd_hda_codec_write_cache(codec, spec->dmux_nids[0], 0, 4562 AC_VERB_SET_CONNECT_SEL, 4563 mic->dmux_idx); 4564 + if (mic->mux_idx >= 0) 4565 snd_hda_codec_write_cache(codec, spec->mux_nids[0], 0, 4566 AC_VERB_SET_CONNECT_SEL, 4567 mic->mux_idx);
+12
sound/pci/intel8x0.c
··· 1954 .name = "Sony S1XP", 1955 .type = AC97_TUNE_INV_EAPD 1956 }, 1957 { 1958 .subvendor = 0x1043, 1959 .subdevice = 0x80f3,
··· 1954 .name = "Sony S1XP", 1955 .type = AC97_TUNE_INV_EAPD 1956 }, 1957 + { 1958 + .subvendor = 0x104d, 1959 + .subdevice = 0x81c0, 1960 + .name = "Sony VAIO VGN-T350P", /*AD1981B*/ 1961 + .type = AC97_TUNE_INV_EAPD 1962 + }, 1963 + { 1964 + .subvendor = 0x104d, 1965 + .subdevice = 0x81c5, 1966 + .name = "Sony VAIO VGN-B1VP", /*AD1981B*/ 1967 + .type = AC97_TUNE_INV_EAPD 1968 + }, 1969 { 1970 .subvendor = 0x1043, 1971 .subdevice = 0x80f3,
+13 -1
sound/ppc/keywest.c
··· 59 strlcpy(info.type, "keywest", I2C_NAME_SIZE); 60 info.addr = keywest_ctx->addr; 61 keywest_ctx->client = i2c_new_device(adapter, &info); 62 63 /* 64 * Let i2c-core delete that device on driver removal. ··· 98 { } 99 }; 100 101 - struct i2c_driver keywest_driver = { 102 .driver = { 103 .name = "PMac Keywest Audio", 104 },
··· 59 strlcpy(info.type, "keywest", I2C_NAME_SIZE); 60 info.addr = keywest_ctx->addr; 61 keywest_ctx->client = i2c_new_device(adapter, &info); 62 + if (!keywest_ctx->client) 63 + return -ENODEV; 64 + /* 65 + * We know the driver is already loaded, so the device should be 66 + * already bound. If not it means binding failed, and then there 67 + * is no point in keeping the device instantiated. 68 + */ 69 + if (!keywest_ctx->client->driver) { 70 + i2c_unregister_device(keywest_ctx->client); 71 + keywest_ctx->client = NULL; 72 + return -ENODEV; 73 + } 74 75 /* 76 * Let i2c-core delete that device on driver removal. ··· 86 { } 87 }; 88 89 + static struct i2c_driver keywest_driver = { 90 .driver = { 91 .name = "PMac Keywest Audio", 92 },
+49 -49
sound/soc/blackfin/Kconfig
··· 7 mode (supports single stereo In/Out). 8 You will also need to select the audio interfaces to support below. 9 10 - config SND_BF5XX_TDM 11 - tristate "SoC I2S(TDM mode) Audio for the ADI BF5xx chip" 12 - depends on (BLACKFIN && SND_SOC) 13 - help 14 - Say Y or M if you want to add support for codecs attached to 15 - the Blackfin SPORT (synchronous serial ports) interface in TDM 16 - mode. 17 - You will also need to select the audio interfaces to support below. 18 - 19 config SND_BF5XX_SOC_SSM2602 20 tristate "SoC SSM2602 Audio support for BF52x ezkit" 21 depends on SND_BF5XX_I2S ··· 31 help 32 Enter the GPIO used to control AD73311's SE pin. Acceptable 33 values are 0 to 7 34 35 config SND_BF5XX_AC97 36 tristate "SoC AC97 Audio for the ADI BF5xx chip" ··· 87 Say y if you want AC97 driver to support up to 5.1 channel audio. 88 this mode will consume much more memory for DMA. 89 90 config SND_BF5XX_SOC_SPORT 91 tristate 92 ··· 128 select SND_SOC_AC97_BUS 129 select SND_BF5XX_SOC_SPORT 130 131 - config SND_BF5XX_SOC_AD1836 132 - tristate "SoC AD1836 Audio support for BF5xx" 133 - depends on SND_BF5XX_TDM 134 - select SND_BF5XX_SOC_TDM 135 - select SND_SOC_AD1836 136 - help 137 - Say Y if you want to add support for SoC audio on BF5xx STAMP/EZKIT. 138 - 139 - config SND_BF5XX_SOC_AD1980 140 - tristate "SoC AD1980/1 Audio support for BF5xx" 141 - depends on SND_BF5XX_AC97 142 - select SND_BF5XX_SOC_AC97 143 - select SND_SOC_AD1980 144 - help 145 - Say Y if you want to add support for SoC audio on BF5xx STAMP/EZKIT. 146 - 147 - config SND_BF5XX_SOC_AD1938 148 - tristate "SoC AD1938 Audio support for Blackfin" 149 - depends on SND_BF5XX_TDM 150 - select SND_BF5XX_SOC_TDM 151 - select SND_SOC_AD1938 152 - help 153 - Say Y if you want to add support for AD1938 codec on Blackfin. 154 - 155 config SND_BF5XX_SPORT_NUM 156 int "Set a SPORT for Sound chip" 157 depends on (SND_BF5XX_I2S || SND_BF5XX_AC97 || SND_BF5XX_TDM) ··· 136 default 0 137 help 138 Set the correct SPORT for sound chip. 139 - 140 - config SND_BF5XX_HAVE_COLD_RESET 141 - bool "BOARD has COLD Reset GPIO" 142 - depends on SND_BF5XX_AC97 143 - default y if BFIN548_EZKIT 144 - default n if !BFIN548_EZKIT 145 - 146 - config SND_BF5XX_RESET_GPIO_NUM 147 - int "Set a GPIO for cold reset" 148 - depends on SND_BF5XX_HAVE_COLD_RESET 149 - range 0 159 150 - default 19 if BFIN548_EZKIT 151 - default 5 if BFIN537_STAMP 152 - default 0 153 - help 154 - Set the correct GPIO for RESET the sound chip.
··· 7 mode (supports single stereo In/Out). 8 You will also need to select the audio interfaces to support below. 9 10 config SND_BF5XX_SOC_SSM2602 11 tristate "SoC SSM2602 Audio support for BF52x ezkit" 12 depends on SND_BF5XX_I2S ··· 40 help 41 Enter the GPIO used to control AD73311's SE pin. Acceptable 42 values are 0 to 7 43 + 44 + config SND_BF5XX_TDM 45 + tristate "SoC I2S(TDM mode) Audio for the ADI BF5xx chip" 46 + depends on (BLACKFIN && SND_SOC) 47 + help 48 + Say Y or M if you want to add support for codecs attached to 49 + the Blackfin SPORT (synchronous serial ports) interface in TDM 50 + mode. 51 + You will also need to select the audio interfaces to support below. 52 + 53 + config SND_BF5XX_SOC_AD1836 54 + tristate "SoC AD1836 Audio support for BF5xx" 55 + depends on SND_BF5XX_TDM 56 + select SND_BF5XX_SOC_TDM 57 + select SND_SOC_AD1836 58 + help 59 + Say Y if you want to add support for SoC audio on BF5xx STAMP/EZKIT. 60 + 61 + config SND_BF5XX_SOC_AD1938 62 + tristate "SoC AD1938 Audio support for Blackfin" 63 + depends on SND_BF5XX_TDM 64 + select SND_BF5XX_SOC_TDM 65 + select SND_SOC_AD1938 66 + help 67 + Say Y if you want to add support for AD1938 codec on Blackfin. 68 69 config SND_BF5XX_AC97 70 tristate "SoC AC97 Audio for the ADI BF5xx chip" ··· 71 Say y if you want AC97 driver to support up to 5.1 channel audio. 72 this mode will consume much more memory for DMA. 73 74 + config SND_BF5XX_HAVE_COLD_RESET 75 + bool "BOARD has COLD Reset GPIO" 76 + depends on SND_BF5XX_AC97 77 + default y if BFIN548_EZKIT 78 + default n if !BFIN548_EZKIT 79 + 80 + config SND_BF5XX_RESET_GPIO_NUM 81 + int "Set a GPIO for cold reset" 82 + depends on SND_BF5XX_HAVE_COLD_RESET 83 + range 0 159 84 + default 19 if BFIN548_EZKIT 85 + default 5 if BFIN537_STAMP 86 + default 0 87 + help 88 + Set the correct GPIO for RESET the sound chip. 89 + 90 + config SND_BF5XX_SOC_AD1980 91 + tristate "SoC AD1980/1 Audio support for BF5xx" 92 + depends on SND_BF5XX_AC97 93 + select SND_BF5XX_SOC_AC97 94 + select SND_SOC_AD1980 95 + help 96 + Say Y if you want to add support for SoC audio on BF5xx STAMP/EZKIT. 97 + 98 config SND_BF5XX_SOC_SPORT 99 tristate 100 ··· 88 select SND_SOC_AC97_BUS 89 select SND_BF5XX_SOC_SPORT 90 91 config SND_BF5XX_SPORT_NUM 92 int "Set a SPORT for Sound chip" 93 depends on (SND_BF5XX_I2S || SND_BF5XX_AC97 || SND_BF5XX_TDM) ··· 120 default 0 121 help 122 Set the correct SPORT for sound chip.
+4 -4
sound/soc/blackfin/bf5xx-i2s.c
··· 77 * TFS. When Port G is selected and EMAC then there is a conflict between 78 * the PHY interrupt line and TFS. Current settings prevent the conflict 79 * by ignoring the TFS pin when Port G is selected. This allows both 80 - * ssm2602 using Port G and EMAC concurrently. 81 */ 82 - #ifdef CONFIG_BF527_SPORT0_PORTF 83 - #define LOCAL_SPORT0_TFS (P_SPORT0_TFS) 84 - #else 85 #define LOCAL_SPORT0_TFS (0) 86 #endif 87 88 static u16 sport_req[][7] = { {P_SPORT0_DTPRI, P_SPORT0_TSCLK, P_SPORT0_RFS,
··· 77 * TFS. When Port G is selected and EMAC then there is a conflict between 78 * the PHY interrupt line and TFS. Current settings prevent the conflict 79 * by ignoring the TFS pin when Port G is selected. This allows both 80 + * codecs and EMAC using Port G concurrently. 81 */ 82 + #ifdef CONFIG_BF527_SPORT0_PORTG 83 #define LOCAL_SPORT0_TFS (0) 84 + #else 85 + #define LOCAL_SPORT0_TFS (P_SPORT0_TFS) 86 #endif 87 88 static u16 sport_req[][7] = { {P_SPORT0_DTPRI, P_SPORT0_TSCLK, P_SPORT0_RFS,
+4 -4
sound/soc/blackfin/bf5xx-tdm.c
··· 78 * TFS. When Port G is selected and EMAC then there is a conflict between 79 * the PHY interrupt line and TFS. Current settings prevent the conflict 80 * by ignoring the TFS pin when Port G is selected. This allows both 81 - * ssm2602 using Port G and EMAC concurrently. 82 */ 83 - #ifdef CONFIG_BF527_SPORT0_PORTF 84 - #define LOCAL_SPORT0_TFS (P_SPORT0_TFS) 85 - #else 86 #define LOCAL_SPORT0_TFS (0) 87 #endif 88 89 static u16 sport_req[][7] = { {P_SPORT0_DTPRI, P_SPORT0_TSCLK, P_SPORT0_RFS,
··· 78 * TFS. When Port G is selected and EMAC then there is a conflict between 79 * the PHY interrupt line and TFS. Current settings prevent the conflict 80 * by ignoring the TFS pin when Port G is selected. This allows both 81 + * codecs and EMAC using Port G concurrently. 82 */ 83 + #ifdef CONFIG_BF527_SPORT0_PORTG 84 #define LOCAL_SPORT0_TFS (0) 85 + #else 86 + #define LOCAL_SPORT0_TFS (P_SPORT0_TFS) 87 #endif 88 89 static u16 sport_req[][7] = { {P_SPORT0_DTPRI, P_SPORT0_TSCLK, P_SPORT0_RFS,
+12 -25
sound/soc/davinci/davinci-i2s.c
··· 97 DAVINCI_MCBSP_WORD_32, 98 }; 99 100 - static struct davinci_pcm_dma_params davinci_i2s_pcm_out = { 101 - .name = "I2S PCM Stereo out", 102 - }; 103 - 104 - static struct davinci_pcm_dma_params davinci_i2s_pcm_in = { 105 - .name = "I2S PCM Stereo in", 106 - }; 107 - 108 struct davinci_mcbsp_dev { 109 void __iomem *base; 110 #define MOD_DSP_A 0 111 #define MOD_DSP_B 1 112 int mode; 113 u32 pcr; 114 struct clk *clk; 115 - struct davinci_pcm_dma_params *dma_params[2]; 116 }; 117 118 static inline void davinci_mcbsp_write_reg(struct davinci_mcbsp_dev *dev, ··· 210 spcr &= playback ? ~DAVINCI_MCBSP_SPCR_XRST : ~DAVINCI_MCBSP_SPCR_RRST; 211 davinci_mcbsp_write_reg(dev, DAVINCI_MCBSP_SPCR_REG, spcr); 212 toggle_clock(dev, playback); 213 - } 214 - 215 - static int davinci_i2s_startup(struct snd_pcm_substream *substream, 216 - struct snd_soc_dai *cpu_dai) 217 - { 218 - struct davinci_mcbsp_dev *dev = cpu_dai->private_data; 219 - cpu_dai->dma_data = dev->dma_params[substream->stream]; 220 - return 0; 221 } 222 223 #define DEFAULT_BITPERSAMPLE 16 ··· 342 struct snd_pcm_hw_params *params, 343 struct snd_soc_dai *dai) 344 { 345 - struct davinci_pcm_dma_params *dma_params = dai->dma_data; 346 struct davinci_mcbsp_dev *dev = dai->private_data; 347 struct snd_interval *i = NULL; 348 int mcbsp_word_length; 349 unsigned int rcr, xcr, srgr; ··· 462 #define DAVINCI_I2S_RATES SNDRV_PCM_RATE_8000_96000 463 464 static struct snd_soc_dai_ops davinci_i2s_dai_ops = { 465 - .startup = davinci_i2s_startup, 466 .shutdown = davinci_i2s_shutdown, 467 .prepare = davinci_i2s_prepare, 468 .trigger = davinci_i2s_trigger, ··· 523 524 dev->base = (void __iomem *)IO_ADDRESS(mem->start); 525 526 - dev->dma_params[SNDRV_PCM_STREAM_PLAYBACK] = &davinci_i2s_pcm_out; 527 - dev->dma_params[SNDRV_PCM_STREAM_PLAYBACK]->dma_addr = 528 (dma_addr_t)(io_v2p(dev->base) + DAVINCI_MCBSP_DXR_REG); 529 530 - dev->dma_params[SNDRV_PCM_STREAM_CAPTURE] = &davinci_i2s_pcm_in; 531 - dev->dma_params[SNDRV_PCM_STREAM_CAPTURE]->dma_addr = 532 (dma_addr_t)(io_v2p(dev->base) + DAVINCI_MCBSP_DRR_REG); 533 534 /* first TX, then RX */ ··· 536 ret = -ENXIO; 537 goto err_free_mem; 538 } 539 - dev->dma_params[SNDRV_PCM_STREAM_PLAYBACK]->channel = res->start; 540 541 res = platform_get_resource(pdev, IORESOURCE_DMA, 1); 542 if (!res) { ··· 544 ret = -ENXIO; 545 goto err_free_mem; 546 } 547 - dev->dma_params[SNDRV_PCM_STREAM_CAPTURE]->channel = res->start; 548 549 davinci_i2s_dai.private_data = dev; 550 ret = snd_soc_register_dai(&davinci_i2s_dai);
··· 97 DAVINCI_MCBSP_WORD_32, 98 }; 99 100 struct davinci_mcbsp_dev { 101 + /* 102 + * dma_params must be first because rtd->dai->cpu_dai->private_data 103 + * is cast to a pointer of an array of struct davinci_pcm_dma_params in 104 + * davinci_pcm_open. 105 + */ 106 + struct davinci_pcm_dma_params dma_params[2]; 107 void __iomem *base; 108 #define MOD_DSP_A 0 109 #define MOD_DSP_B 1 110 int mode; 111 u32 pcr; 112 struct clk *clk; 113 }; 114 115 static inline void davinci_mcbsp_write_reg(struct davinci_mcbsp_dev *dev, ··· 213 spcr &= playback ? ~DAVINCI_MCBSP_SPCR_XRST : ~DAVINCI_MCBSP_SPCR_RRST; 214 davinci_mcbsp_write_reg(dev, DAVINCI_MCBSP_SPCR_REG, spcr); 215 toggle_clock(dev, playback); 216 } 217 218 #define DEFAULT_BITPERSAMPLE 16 ··· 353 struct snd_pcm_hw_params *params, 354 struct snd_soc_dai *dai) 355 { 356 struct davinci_mcbsp_dev *dev = dai->private_data; 357 + struct davinci_pcm_dma_params *dma_params = 358 + &dev->dma_params[substream->stream]; 359 struct snd_interval *i = NULL; 360 int mcbsp_word_length; 361 unsigned int rcr, xcr, srgr; ··· 472 #define DAVINCI_I2S_RATES SNDRV_PCM_RATE_8000_96000 473 474 static struct snd_soc_dai_ops davinci_i2s_dai_ops = { 475 .shutdown = davinci_i2s_shutdown, 476 .prepare = davinci_i2s_prepare, 477 .trigger = davinci_i2s_trigger, ··· 534 535 dev->base = (void __iomem *)IO_ADDRESS(mem->start); 536 537 + dev->dma_params[SNDRV_PCM_STREAM_PLAYBACK].dma_addr = 538 (dma_addr_t)(io_v2p(dev->base) + DAVINCI_MCBSP_DXR_REG); 539 540 + dev->dma_params[SNDRV_PCM_STREAM_CAPTURE].dma_addr = 541 (dma_addr_t)(io_v2p(dev->base) + DAVINCI_MCBSP_DRR_REG); 542 543 /* first TX, then RX */ ··· 549 ret = -ENXIO; 550 goto err_free_mem; 551 } 552 + dev->dma_params[SNDRV_PCM_STREAM_PLAYBACK].channel = res->start; 553 554 res = platform_get_resource(pdev, IORESOURCE_DMA, 1); 555 if (!res) { ··· 557 ret = -ENXIO; 558 goto err_free_mem; 559 } 560 + dev->dma_params[SNDRV_PCM_STREAM_CAPTURE].channel = res->start; 561 562 davinci_i2s_dai.private_data = dev; 563 ret = snd_soc_register_dai(&davinci_i2s_dai);
+28 -52
sound/soc/davinci/davinci-mcasp.c
··· 332 printk(KERN_ERR "GBLCTL write error\n"); 333 } 334 335 - static int davinci_mcasp_startup(struct snd_pcm_substream *substream, 336 - struct snd_soc_dai *cpu_dai) 337 - { 338 - struct davinci_audio_dev *dev = cpu_dai->private_data; 339 - cpu_dai->dma_data = dev->dma_params[substream->stream]; 340 - return 0; 341 - } 342 - 343 static void mcasp_start_rx(struct davinci_audio_dev *dev) 344 { 345 mcasp_set_ctl_reg(dev->base + DAVINCI_MCASP_GBLCTLR_REG, RXHCLKRST); ··· 378 379 static void davinci_mcasp_start(struct davinci_audio_dev *dev, int stream) 380 { 381 - if (stream == SNDRV_PCM_STREAM_PLAYBACK) 382 mcasp_start_tx(dev); 383 - else 384 mcasp_start_rx(dev); 385 - 386 - /* enable FIFO */ 387 - if (dev->txnumevt) 388 - mcasp_set_bits(dev->base + DAVINCI_MCASP_WFIFOCTL, FIFO_ENABLE); 389 - 390 - if (dev->rxnumevt) 391 - mcasp_set_bits(dev->base + DAVINCI_MCASP_RFIFOCTL, FIFO_ENABLE); 392 } 393 394 static void mcasp_stop_rx(struct davinci_audio_dev *dev) ··· 405 406 static void davinci_mcasp_stop(struct davinci_audio_dev *dev, int stream) 407 { 408 - if (stream == SNDRV_PCM_STREAM_PLAYBACK) 409 mcasp_stop_tx(dev); 410 - else 411 mcasp_stop_rx(dev); 412 - 413 - /* disable FIFO */ 414 - if (dev->txnumevt) 415 - mcasp_clr_bits(dev->base + DAVINCI_MCASP_WFIFOCTL, FIFO_ENABLE); 416 - 417 - if (dev->rxnumevt) 418 - mcasp_clr_bits(dev->base + DAVINCI_MCASP_RFIFOCTL, FIFO_ENABLE); 419 } 420 421 static int davinci_mcasp_set_dai_fmt(struct snd_soc_dai *cpu_dai, ··· 712 { 713 struct davinci_audio_dev *dev = cpu_dai->private_data; 714 struct davinci_pcm_dma_params *dma_params = 715 - dev->dma_params[substream->stream]; 716 int word_length; 717 u8 numevt; 718 ··· 790 } 791 792 static struct snd_soc_dai_ops davinci_mcasp_dai_ops = { 793 - .startup = davinci_mcasp_startup, 794 .trigger = davinci_mcasp_trigger, 795 .hw_params = davinci_mcasp_hw_params, 796 .set_fmt = davinci_mcasp_set_dai_fmt, ··· 840 struct resource *mem, *ioarea, *res; 841 struct snd_platform_data *pdata; 842 struct davinci_audio_dev *dev; 843 - int count = 0; 844 int ret = 0; 845 846 dev = kzalloc(sizeof(struct davinci_audio_dev), GFP_KERNEL); 847 if (!dev) 848 return -ENOMEM; 849 - 850 - dma_data = kzalloc(sizeof(struct davinci_pcm_dma_params) * 2, 851 - GFP_KERNEL); 852 - if (!dma_data) { 853 - ret = -ENOMEM; 854 - goto err_release_dev; 855 - } 856 857 mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); 858 if (!mem) { ··· 880 dev->txnumevt = pdata->txnumevt; 881 dev->rxnumevt = pdata->rxnumevt; 882 883 - dma_data[count].name = "I2S PCM Stereo out"; 884 - dma_data[count].eventq_no = pdata->eventq_no; 885 - dma_data[count].dma_addr = (dma_addr_t) (pdata->tx_dma_offset + 886 io_v2p(dev->base)); 887 - dev->dma_params[SNDRV_PCM_STREAM_PLAYBACK] = &dma_data[count]; 888 889 /* first TX, then RX */ 890 res = platform_get_resource(pdev, IORESOURCE_DMA, 0); ··· 892 goto err_release_region; 893 } 894 895 - dma_data[count].channel = res->start; 896 - count++; 897 - dma_data[count].name = "I2S PCM Stereo in"; 898 - dma_data[count].eventq_no = pdata->eventq_no; 899 - dma_data[count].dma_addr = (dma_addr_t)(pdata->rx_dma_offset + 900 io_v2p(dev->base)); 901 - dev->dma_params[SNDRV_PCM_STREAM_CAPTURE] = &dma_data[count]; 902 903 res = platform_get_resource(pdev, IORESOURCE_DMA, 1); 904 if (!res) { ··· 905 goto err_release_region; 906 } 907 908 - dma_data[count].channel = res->start; 909 davinci_mcasp_dai[pdata->op_mode].private_data = dev; 910 davinci_mcasp_dai[pdata->op_mode].dev = &pdev->dev; 911 ret = snd_soc_register_dai(&davinci_mcasp_dai[pdata->op_mode]); ··· 917 err_release_region: 918 release_mem_region(mem->start, (mem->end - mem->start) + 1); 919 err_release_data: 920 - kfree(dma_data); 921 - err_release_dev: 922 kfree(dev); 923 924 return ret; ··· 925 static int davinci_mcasp_remove(struct platform_device *pdev) 926 { 927 struct snd_platform_data *pdata = pdev->dev.platform_data; 928 - struct davinci_pcm_dma_params *dma_data; 929 struct davinci_audio_dev *dev; 930 struct resource *mem; 931 ··· 937 mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); 938 release_mem_region(mem->start, (mem->end - mem->start) + 1); 939 940 - dma_data = dev->dma_params[SNDRV_PCM_STREAM_PLAYBACK]; 941 - kfree(dma_data); 942 kfree(dev); 943 944 return 0;
··· 332 printk(KERN_ERR "GBLCTL write error\n"); 333 } 334 335 static void mcasp_start_rx(struct davinci_audio_dev *dev) 336 { 337 mcasp_set_ctl_reg(dev->base + DAVINCI_MCASP_GBLCTLR_REG, RXHCLKRST); ··· 386 387 static void davinci_mcasp_start(struct davinci_audio_dev *dev, int stream) 388 { 389 + if (stream == SNDRV_PCM_STREAM_PLAYBACK) { 390 + if (dev->txnumevt) /* enable FIFO */ 391 + mcasp_set_bits(dev->base + DAVINCI_MCASP_WFIFOCTL, 392 + FIFO_ENABLE); 393 mcasp_start_tx(dev); 394 + } else { 395 + if (dev->rxnumevt) /* enable FIFO */ 396 + mcasp_set_bits(dev->base + DAVINCI_MCASP_RFIFOCTL, 397 + FIFO_ENABLE); 398 mcasp_start_rx(dev); 399 + } 400 } 401 402 static void mcasp_stop_rx(struct davinci_audio_dev *dev) ··· 413 414 static void davinci_mcasp_stop(struct davinci_audio_dev *dev, int stream) 415 { 416 + if (stream == SNDRV_PCM_STREAM_PLAYBACK) { 417 + if (dev->txnumevt) /* disable FIFO */ 418 + mcasp_clr_bits(dev->base + DAVINCI_MCASP_WFIFOCTL, 419 + FIFO_ENABLE); 420 mcasp_stop_tx(dev); 421 + } else { 422 + if (dev->rxnumevt) /* disable FIFO */ 423 + mcasp_clr_bits(dev->base + DAVINCI_MCASP_RFIFOCTL, 424 + FIFO_ENABLE); 425 mcasp_stop_rx(dev); 426 + } 427 } 428 429 static int davinci_mcasp_set_dai_fmt(struct snd_soc_dai *cpu_dai, ··· 720 { 721 struct davinci_audio_dev *dev = cpu_dai->private_data; 722 struct davinci_pcm_dma_params *dma_params = 723 + &dev->dma_params[substream->stream]; 724 int word_length; 725 u8 numevt; 726 ··· 798 } 799 800 static struct snd_soc_dai_ops davinci_mcasp_dai_ops = { 801 .trigger = davinci_mcasp_trigger, 802 .hw_params = davinci_mcasp_hw_params, 803 .set_fmt = davinci_mcasp_set_dai_fmt, ··· 849 struct resource *mem, *ioarea, *res; 850 struct snd_platform_data *pdata; 851 struct davinci_audio_dev *dev; 852 int ret = 0; 853 854 dev = kzalloc(sizeof(struct davinci_audio_dev), GFP_KERNEL); 855 if (!dev) 856 return -ENOMEM; 857 858 mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); 859 if (!mem) { ··· 897 dev->txnumevt = pdata->txnumevt; 898 dev->rxnumevt = pdata->rxnumevt; 899 900 + dma_data = &dev->dma_params[SNDRV_PCM_STREAM_PLAYBACK]; 901 + dma_data->eventq_no = pdata->eventq_no; 902 + dma_data->dma_addr = (dma_addr_t) (pdata->tx_dma_offset + 903 io_v2p(dev->base)); 904 905 /* first TX, then RX */ 906 res = platform_get_resource(pdev, IORESOURCE_DMA, 0); ··· 910 goto err_release_region; 911 } 912 913 + dma_data->channel = res->start; 914 + 915 + dma_data = &dev->dma_params[SNDRV_PCM_STREAM_CAPTURE]; 916 + dma_data->eventq_no = pdata->eventq_no; 917 + dma_data->dma_addr = (dma_addr_t)(pdata->rx_dma_offset + 918 io_v2p(dev->base)); 919 920 res = platform_get_resource(pdev, IORESOURCE_DMA, 1); 921 if (!res) { ··· 924 goto err_release_region; 925 } 926 927 + dma_data->channel = res->start; 928 davinci_mcasp_dai[pdata->op_mode].private_data = dev; 929 davinci_mcasp_dai[pdata->op_mode].dev = &pdev->dev; 930 ret = snd_soc_register_dai(&davinci_mcasp_dai[pdata->op_mode]); ··· 936 err_release_region: 937 release_mem_region(mem->start, (mem->end - mem->start) + 1); 938 err_release_data: 939 kfree(dev); 940 941 return ret; ··· 946 static int davinci_mcasp_remove(struct platform_device *pdev) 947 { 948 struct snd_platform_data *pdata = pdev->dev.platform_data; 949 struct davinci_audio_dev *dev; 950 struct resource *mem; 951 ··· 959 mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); 960 release_mem_region(mem->start, (mem->end - mem->start) + 1); 961 962 kfree(dev); 963 964 return 0;
+6 -1
sound/soc/davinci/davinci-mcasp.h
··· 39 }; 40 41 struct davinci_audio_dev { 42 void __iomem *base; 43 int sample_rate; 44 struct clk *clk; 45 - struct davinci_pcm_dma_params *dma_params[2]; 46 unsigned int codec_fmt; 47 48 /* McASP specific data */
··· 39 }; 40 41 struct davinci_audio_dev { 42 + /* 43 + * dma_params must be first because rtd->dai->cpu_dai->private_data 44 + * is cast to a pointer of an array of struct davinci_pcm_dma_params in 45 + * davinci_pcm_open. 46 + */ 47 + struct davinci_pcm_dma_params dma_params[2]; 48 void __iomem *base; 49 int sample_rate; 50 struct clk *clk; 51 unsigned int codec_fmt; 52 53 /* McASP specific data */
+6 -7
sound/soc/davinci/davinci-pcm.c
··· 126 static int davinci_pcm_dma_request(struct snd_pcm_substream *substream) 127 { 128 struct davinci_runtime_data *prtd = substream->runtime->private_data; 129 - struct snd_soc_pcm_runtime *rtd = substream->private_data; 130 - struct davinci_pcm_dma_params *dma_data = rtd->dai->cpu_dai->dma_data; 131 struct edmacc_param p_ram; 132 int ret; 133 - 134 - if (!dma_data) 135 - return -ENODEV; 136 - 137 - prtd->params = dma_data; 138 139 /* Request master DMA channel */ 140 ret = edma_alloc_channel(prtd->params->channel, ··· 237 struct snd_pcm_runtime *runtime = substream->runtime; 238 struct davinci_runtime_data *prtd; 239 int ret = 0; 240 241 snd_soc_set_runtime_hwparams(substream, &davinci_pcm_hardware); 242 /* ensure that buffer size is a multiple of period size */ ··· 255 return -ENOMEM; 256 257 spin_lock_init(&prtd->lock); 258 259 runtime->private_data = prtd; 260
··· 126 static int davinci_pcm_dma_request(struct snd_pcm_substream *substream) 127 { 128 struct davinci_runtime_data *prtd = substream->runtime->private_data; 129 struct edmacc_param p_ram; 130 int ret; 131 132 /* Request master DMA channel */ 133 ret = edma_alloc_channel(prtd->params->channel, ··· 244 struct snd_pcm_runtime *runtime = substream->runtime; 245 struct davinci_runtime_data *prtd; 246 int ret = 0; 247 + struct snd_soc_pcm_runtime *rtd = substream->private_data; 248 + struct davinci_pcm_dma_params *pa = rtd->dai->cpu_dai->private_data; 249 + struct davinci_pcm_dma_params *params = &pa[substream->stream]; 250 + if (!params) 251 + return -ENODEV; 252 253 snd_soc_set_runtime_hwparams(substream, &davinci_pcm_hardware); 254 /* ensure that buffer size is a multiple of period size */ ··· 257 return -ENOMEM; 258 259 spin_lock_init(&prtd->lock); 260 + prtd->params = params; 261 262 runtime->private_data = prtd; 263
-1
sound/soc/davinci/davinci-pcm.h
··· 17 18 19 struct davinci_pcm_dma_params { 20 - char *name; /* stream identifier */ 21 int channel; /* sync dma channel ID */ 22 unsigned short acnt; 23 dma_addr_t dma_addr; /* device physical address for DMA */
··· 17 18 19 struct davinci_pcm_dma_params { 20 int channel; /* sync dma channel ID */ 21 unsigned short acnt; 22 dma_addr_t dma_addr; /* device physical address for DMA */
+1 -1
sound/soc/pxa/Kconfig
··· 138 139 config SND_PXA2XX_SOC_IMOTE2 140 tristate "SoC Audio support for IMote 2" 141 - depends on SND_PXA2XX_SOC && MACH_INTELMOTE2 142 select SND_PXA2XX_SOC_I2S 143 select SND_SOC_WM8940 144 help
··· 138 139 config SND_PXA2XX_SOC_IMOTE2 140 tristate "SoC Audio support for IMote 2" 141 + depends on SND_PXA2XX_SOC && MACH_INTELMOTE2 && I2C 142 select SND_PXA2XX_SOC_I2S 143 select SND_SOC_WM8940 144 help
+14 -9
sound/usb/usbmixer.c
··· 898 * build a feature control 899 */ 900 901 static void build_feature_ctl(struct mixer_build *state, unsigned char *desc, 902 unsigned int ctl_mask, int control, 903 struct usb_audio_term *iterm, int unitid) ··· 983 */ 984 if (! mapped_name && ! (state->oterm.type >> 16)) { 985 if ((state->oterm.type & 0xff00) == 0x0100) { 986 - len = strlcat(kctl->id.name, " Capture", sizeof(kctl->id.name)); 987 } else { 988 - len = strlcat(kctl->id.name + len, " Playback", sizeof(kctl->id.name)); 989 } 990 } 991 - strlcat(kctl->id.name + len, control == USB_FEATURE_MUTE ? " Switch" : " Volume", 992 - sizeof(kctl->id.name)); 993 if (control == USB_FEATURE_VOLUME) { 994 kctl->tlv.c = mixer_vol_tlv; 995 kctl->vd[0].access |= ··· 1148 len = get_term_name(state, iterm, kctl->id.name, sizeof(kctl->id.name), 0); 1149 if (! len) 1150 len = sprintf(kctl->id.name, "Mixer Source %d", in_ch + 1); 1151 - strlcat(kctl->id.name + len, " Volume", sizeof(kctl->id.name)); 1152 1153 snd_printdd(KERN_INFO "[%d] MU [%s] ch = %d, val = %d/%d\n", 1154 cval->id, kctl->id.name, cval->channels, cval->min, cval->max); ··· 1405 if (! len) 1406 strlcpy(kctl->id.name, name, sizeof(kctl->id.name)); 1407 } 1408 - strlcat(kctl->id.name, " ", sizeof(kctl->id.name)); 1409 - strlcat(kctl->id.name, valinfo->suffix, sizeof(kctl->id.name)); 1410 1411 snd_printdd(KERN_INFO "[%d] PU [%s] ch = %d, val = %d/%d\n", 1412 cval->id, kctl->id.name, cval->channels, cval->min, cval->max); ··· 1615 strlcpy(kctl->id.name, "USB", sizeof(kctl->id.name)); 1616 1617 if ((state->oterm.type & 0xff00) == 0x0100) 1618 - strlcat(kctl->id.name, " Capture Source", sizeof(kctl->id.name)); 1619 else 1620 - strlcat(kctl->id.name, " Playback Source", sizeof(kctl->id.name)); 1621 } 1622 1623 snd_printdd(KERN_INFO "[%d] SU [%s] items = %d\n",
··· 898 * build a feature control 899 */ 900 901 + static size_t append_ctl_name(struct snd_kcontrol *kctl, const char *str) 902 + { 903 + return strlcat(kctl->id.name, str, sizeof(kctl->id.name)); 904 + } 905 + 906 static void build_feature_ctl(struct mixer_build *state, unsigned char *desc, 907 unsigned int ctl_mask, int control, 908 struct usb_audio_term *iterm, int unitid) ··· 978 */ 979 if (! mapped_name && ! (state->oterm.type >> 16)) { 980 if ((state->oterm.type & 0xff00) == 0x0100) { 981 + len = append_ctl_name(kctl, " Capture"); 982 } else { 983 + len = append_ctl_name(kctl, " Playback"); 984 } 985 } 986 + append_ctl_name(kctl, control == USB_FEATURE_MUTE ? 987 + " Switch" : " Volume"); 988 if (control == USB_FEATURE_VOLUME) { 989 kctl->tlv.c = mixer_vol_tlv; 990 kctl->vd[0].access |= ··· 1143 len = get_term_name(state, iterm, kctl->id.name, sizeof(kctl->id.name), 0); 1144 if (! len) 1145 len = sprintf(kctl->id.name, "Mixer Source %d", in_ch + 1); 1146 + append_ctl_name(kctl, " Volume"); 1147 1148 snd_printdd(KERN_INFO "[%d] MU [%s] ch = %d, val = %d/%d\n", 1149 cval->id, kctl->id.name, cval->channels, cval->min, cval->max); ··· 1400 if (! len) 1401 strlcpy(kctl->id.name, name, sizeof(kctl->id.name)); 1402 } 1403 + append_ctl_name(kctl, " "); 1404 + append_ctl_name(kctl, valinfo->suffix); 1405 1406 snd_printdd(KERN_INFO "[%d] PU [%s] ch = %d, val = %d/%d\n", 1407 cval->id, kctl->id.name, cval->channels, cval->min, cval->max); ··· 1610 strlcpy(kctl->id.name, "USB", sizeof(kctl->id.name)); 1611 1612 if ((state->oterm.type & 0xff00) == 0x0100) 1613 + append_ctl_name(kctl, " Capture Source"); 1614 else 1615 + append_ctl_name(kctl, " Playback Source"); 1616 } 1617 1618 snd_printdd(KERN_INFO "[%d] SU [%s] items = %d\n",