mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-13 14:14:37 +00:00
Merge branch 'topic/hda' into for-linus
* topic/hda: ALSA: hda - Make jack-plug notification selectable ALSA: hda - Add digital-mic support to ALC262 auto model ALSA: hda - Fix check of input source type for realtek codecs ALSA: hda - Add quirk for Sony VAIO Z21MN ALSA: hda - Get back Input Source for ALC262 toshiba-s06 model ALSA: hda - Fix unsigned comparison in patch_sigmatel.c
This commit is contained in:
commit
11a93fd940
4 changed files with 71 additions and 61 deletions
|
@ -2,7 +2,6 @@ menuconfig SND_HDA_INTEL
|
||||||
tristate "Intel HD Audio"
|
tristate "Intel HD Audio"
|
||||||
select SND_PCM
|
select SND_PCM
|
||||||
select SND_VMASTER
|
select SND_VMASTER
|
||||||
select SND_JACK if INPUT=y || INPUT=SND
|
|
||||||
help
|
help
|
||||||
Say Y here to include support for Intel "High Definition
|
Say Y here to include support for Intel "High Definition
|
||||||
Audio" (Azalia) and its compatible devices.
|
Audio" (Azalia) and its compatible devices.
|
||||||
|
@ -39,6 +38,14 @@ config SND_HDA_INPUT_BEEP
|
||||||
Say Y here to build a digital beep interface for HD-audio
|
Say Y here to build a digital beep interface for HD-audio
|
||||||
driver. This interface is used to generate digital beeps.
|
driver. This interface is used to generate digital beeps.
|
||||||
|
|
||||||
|
config SND_HDA_INPUT_JACK
|
||||||
|
bool "Support jack plugging notification via input layer"
|
||||||
|
depends on INPUT=y || INPUT=SND_HDA_INTEL
|
||||||
|
select SND_JACK
|
||||||
|
help
|
||||||
|
Say Y here to enable the jack plugging notification via
|
||||||
|
input layer.
|
||||||
|
|
||||||
config SND_HDA_CODEC_REALTEK
|
config SND_HDA_CODEC_REALTEK
|
||||||
bool "Build Realtek HD-audio codec support"
|
bool "Build Realtek HD-audio codec support"
|
||||||
default y
|
default y
|
||||||
|
|
|
@ -349,7 +349,7 @@ static int conexant_mux_enum_put(struct snd_kcontrol *kcontrol,
|
||||||
&spec->cur_mux[adc_idx]);
|
&spec->cur_mux[adc_idx]);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_SND_JACK
|
#ifdef CONFIG_SND_HDA_INPUT_JACK
|
||||||
static void conexant_free_jack_priv(struct snd_jack *jack)
|
static void conexant_free_jack_priv(struct snd_jack *jack)
|
||||||
{
|
{
|
||||||
struct conexant_jack *jacks = jack->private_data;
|
struct conexant_jack *jacks = jack->private_data;
|
||||||
|
@ -463,7 +463,7 @@ static int conexant_init(struct hda_codec *codec)
|
||||||
|
|
||||||
static void conexant_free(struct hda_codec *codec)
|
static void conexant_free(struct hda_codec *codec)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_SND_JACK
|
#ifdef CONFIG_SND_HDA_INPUT_JACK
|
||||||
struct conexant_spec *spec = codec->spec;
|
struct conexant_spec *spec = codec->spec;
|
||||||
if (spec->jacks.list) {
|
if (spec->jacks.list) {
|
||||||
struct conexant_jack *jacks = spec->jacks.list;
|
struct conexant_jack *jacks = spec->jacks.list;
|
||||||
|
|
|
@ -250,13 +250,6 @@ enum {
|
||||||
ALC883_MODEL_LAST,
|
ALC883_MODEL_LAST,
|
||||||
};
|
};
|
||||||
|
|
||||||
/* styles of capture selection */
|
|
||||||
enum {
|
|
||||||
CAPT_MUX = 0, /* only mux based */
|
|
||||||
CAPT_MIX, /* only mixer based */
|
|
||||||
CAPT_1MUX_MIX, /* first mux and other mixers */
|
|
||||||
};
|
|
||||||
|
|
||||||
/* for GPIO Poll */
|
/* for GPIO Poll */
|
||||||
#define GPIO_MASK 0x03
|
#define GPIO_MASK 0x03
|
||||||
|
|
||||||
|
@ -306,7 +299,6 @@ struct alc_spec {
|
||||||
hda_nid_t *adc_nids;
|
hda_nid_t *adc_nids;
|
||||||
hda_nid_t *capsrc_nids;
|
hda_nid_t *capsrc_nids;
|
||||||
hda_nid_t dig_in_nid; /* digital-in NID; optional */
|
hda_nid_t dig_in_nid; /* digital-in NID; optional */
|
||||||
int capture_style; /* capture style (CAPT_*) */
|
|
||||||
|
|
||||||
/* capture source */
|
/* capture source */
|
||||||
unsigned int num_mux_defs;
|
unsigned int num_mux_defs;
|
||||||
|
@ -420,12 +412,13 @@ static int alc_mux_enum_put(struct snd_kcontrol *kcontrol,
|
||||||
unsigned int mux_idx;
|
unsigned int mux_idx;
|
||||||
hda_nid_t nid = spec->capsrc_nids ?
|
hda_nid_t nid = spec->capsrc_nids ?
|
||||||
spec->capsrc_nids[adc_idx] : spec->adc_nids[adc_idx];
|
spec->capsrc_nids[adc_idx] : spec->adc_nids[adc_idx];
|
||||||
|
unsigned int type;
|
||||||
|
|
||||||
mux_idx = adc_idx >= spec->num_mux_defs ? 0 : adc_idx;
|
mux_idx = adc_idx >= spec->num_mux_defs ? 0 : adc_idx;
|
||||||
imux = &spec->input_mux[mux_idx];
|
imux = &spec->input_mux[mux_idx];
|
||||||
|
|
||||||
if (spec->capture_style &&
|
type = (get_wcaps(codec, nid) & AC_WCAP_TYPE) >> AC_WCAP_TYPE_SHIFT;
|
||||||
!(spec->capture_style == CAPT_1MUX_MIX && !adc_idx)) {
|
if (type == AC_WID_AUD_MIX) {
|
||||||
/* Matrix-mixer style (e.g. ALC882) */
|
/* Matrix-mixer style (e.g. ALC882) */
|
||||||
unsigned int *cur_val = &spec->cur_mux[adc_idx];
|
unsigned int *cur_val = &spec->cur_mux[adc_idx];
|
||||||
unsigned int i, idx;
|
unsigned int i, idx;
|
||||||
|
@ -7557,7 +7550,6 @@ static int patch_alc882(struct hda_codec *codec)
|
||||||
spec->stream_digital_playback = &alc882_pcm_digital_playback;
|
spec->stream_digital_playback = &alc882_pcm_digital_playback;
|
||||||
spec->stream_digital_capture = &alc882_pcm_digital_capture;
|
spec->stream_digital_capture = &alc882_pcm_digital_capture;
|
||||||
|
|
||||||
spec->capture_style = CAPT_MIX; /* matrix-style capture */
|
|
||||||
if (!spec->adc_nids && spec->input_mux) {
|
if (!spec->adc_nids && spec->input_mux) {
|
||||||
/* check whether NID 0x07 is valid */
|
/* check whether NID 0x07 is valid */
|
||||||
unsigned int wcap = get_wcaps(codec, 0x07);
|
unsigned int wcap = get_wcaps(codec, 0x07);
|
||||||
|
@ -9781,7 +9773,6 @@ static int patch_alc883(struct hda_codec *codec)
|
||||||
}
|
}
|
||||||
if (!spec->capsrc_nids)
|
if (!spec->capsrc_nids)
|
||||||
spec->capsrc_nids = alc883_capsrc_nids;
|
spec->capsrc_nids = alc883_capsrc_nids;
|
||||||
spec->capture_style = CAPT_MIX; /* matrix-style capture */
|
|
||||||
spec->init_amp = ALC_INIT_DEFAULT; /* always initialize */
|
spec->init_amp = ALC_INIT_DEFAULT; /* always initialize */
|
||||||
break;
|
break;
|
||||||
case 0x10ec0889:
|
case 0x10ec0889:
|
||||||
|
@ -9791,8 +9782,6 @@ static int patch_alc883(struct hda_codec *codec)
|
||||||
}
|
}
|
||||||
if (!spec->capsrc_nids)
|
if (!spec->capsrc_nids)
|
||||||
spec->capsrc_nids = alc889_capsrc_nids;
|
spec->capsrc_nids = alc889_capsrc_nids;
|
||||||
spec->capture_style = CAPT_1MUX_MIX; /* 1mux/Nmix-style
|
|
||||||
capture */
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
if (!spec->num_adc_nids) {
|
if (!spec->num_adc_nids) {
|
||||||
|
@ -9801,7 +9790,6 @@ static int patch_alc883(struct hda_codec *codec)
|
||||||
}
|
}
|
||||||
if (!spec->capsrc_nids)
|
if (!spec->capsrc_nids)
|
||||||
spec->capsrc_nids = alc883_capsrc_nids;
|
spec->capsrc_nids = alc883_capsrc_nids;
|
||||||
spec->capture_style = CAPT_MIX; /* matrix-style capture */
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -10913,9 +10901,27 @@ static int alc262_auto_create_multi_out_ctls(struct alc_spec *spec,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* identical with ALC880 */
|
static int alc262_auto_create_analog_input_ctls(struct alc_spec *spec,
|
||||||
#define alc262_auto_create_analog_input_ctls \
|
const struct auto_pin_cfg *cfg)
|
||||||
alc880_auto_create_analog_input_ctls
|
{
|
||||||
|
int err;
|
||||||
|
|
||||||
|
err = alc880_auto_create_analog_input_ctls(spec, cfg);
|
||||||
|
if (err < 0)
|
||||||
|
return err;
|
||||||
|
/* digital-mic input pin is excluded in alc880_auto_create..()
|
||||||
|
* because it's under 0x18
|
||||||
|
*/
|
||||||
|
if (cfg->input_pins[AUTO_PIN_MIC] == 0x12 ||
|
||||||
|
cfg->input_pins[AUTO_PIN_FRONT_MIC] == 0x12) {
|
||||||
|
struct hda_input_mux *imux = &spec->private_imux[0];
|
||||||
|
imux->items[imux->num_items].label = "Int Mic";
|
||||||
|
imux->items[imux->num_items].index = 0x09;
|
||||||
|
imux->num_items++;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* generic initialization of ADC, input mixers and output mixers
|
* generic initialization of ADC, input mixers and output mixers
|
||||||
|
@ -11332,6 +11338,7 @@ static struct snd_pci_quirk alc262_cfg_tbl[] = {
|
||||||
SND_PCI_QUIRK(0x104d, 0x8203, "Sony UX-90", ALC262_HIPPO),
|
SND_PCI_QUIRK(0x104d, 0x8203, "Sony UX-90", ALC262_HIPPO),
|
||||||
SND_PCI_QUIRK(0x104d, 0x820f, "Sony ASSAMD", ALC262_SONY_ASSAMD),
|
SND_PCI_QUIRK(0x104d, 0x820f, "Sony ASSAMD", ALC262_SONY_ASSAMD),
|
||||||
SND_PCI_QUIRK(0x104d, 0x9016, "Sony VAIO", ALC262_AUTO), /* dig-only */
|
SND_PCI_QUIRK(0x104d, 0x9016, "Sony VAIO", ALC262_AUTO), /* dig-only */
|
||||||
|
SND_PCI_QUIRK(0x104d, 0x9025, "Sony VAIO Z21MN", ALC262_TOSHIBA_S06),
|
||||||
SND_PCI_QUIRK_MASK(0x104d, 0xff00, 0x9000, "Sony VAIO",
|
SND_PCI_QUIRK_MASK(0x104d, 0xff00, 0x9000, "Sony VAIO",
|
||||||
ALC262_SONY_ASSAMD),
|
ALC262_SONY_ASSAMD),
|
||||||
SND_PCI_QUIRK(0x1179, 0x0001, "Toshiba dynabook SS RX1",
|
SND_PCI_QUIRK(0x1179, 0x0001, "Toshiba dynabook SS RX1",
|
||||||
|
@ -11539,6 +11546,7 @@ static struct alc_config_preset alc262_presets[] = {
|
||||||
.capsrc_nids = alc262_dmic_capsrc_nids,
|
.capsrc_nids = alc262_dmic_capsrc_nids,
|
||||||
.dac_nids = alc262_dac_nids,
|
.dac_nids = alc262_dac_nids,
|
||||||
.adc_nids = alc262_dmic_adc_nids, /* ADC0 */
|
.adc_nids = alc262_dmic_adc_nids, /* ADC0 */
|
||||||
|
.num_adc_nids = 1, /* single ADC */
|
||||||
.dig_out_nid = ALC262_DIGOUT_NID,
|
.dig_out_nid = ALC262_DIGOUT_NID,
|
||||||
.num_channel_mode = ARRAY_SIZE(alc262_modes),
|
.num_channel_mode = ARRAY_SIZE(alc262_modes),
|
||||||
.channel_mode = alc262_modes,
|
.channel_mode = alc262_modes,
|
||||||
|
@ -11640,21 +11648,36 @@ static int patch_alc262(struct hda_codec *codec)
|
||||||
spec->stream_digital_playback = &alc262_pcm_digital_playback;
|
spec->stream_digital_playback = &alc262_pcm_digital_playback;
|
||||||
spec->stream_digital_capture = &alc262_pcm_digital_capture;
|
spec->stream_digital_capture = &alc262_pcm_digital_capture;
|
||||||
|
|
||||||
spec->capture_style = CAPT_MIX;
|
|
||||||
if (!spec->adc_nids && spec->input_mux) {
|
if (!spec->adc_nids && spec->input_mux) {
|
||||||
/* check whether NID 0x07 is valid */
|
int i;
|
||||||
unsigned int wcap = get_wcaps(codec, 0x07);
|
/* check whether the digital-mic has to be supported */
|
||||||
|
for (i = 0; i < spec->input_mux->num_items; i++) {
|
||||||
/* get type */
|
if (spec->input_mux->items[i].index >= 9)
|
||||||
wcap = (wcap & AC_WCAP_TYPE) >> AC_WCAP_TYPE_SHIFT;
|
break;
|
||||||
if (wcap != AC_WID_AUD_IN) {
|
}
|
||||||
spec->adc_nids = alc262_adc_nids_alt;
|
if (i < spec->input_mux->num_items) {
|
||||||
spec->num_adc_nids = ARRAY_SIZE(alc262_adc_nids_alt);
|
/* use only ADC0 */
|
||||||
spec->capsrc_nids = alc262_capsrc_nids_alt;
|
spec->adc_nids = alc262_dmic_adc_nids;
|
||||||
|
spec->num_adc_nids = 1;
|
||||||
|
spec->capsrc_nids = alc262_dmic_capsrc_nids;
|
||||||
} else {
|
} else {
|
||||||
spec->adc_nids = alc262_adc_nids;
|
/* all analog inputs */
|
||||||
spec->num_adc_nids = ARRAY_SIZE(alc262_adc_nids);
|
/* check whether NID 0x07 is valid */
|
||||||
spec->capsrc_nids = alc262_capsrc_nids;
|
unsigned int wcap = get_wcaps(codec, 0x07);
|
||||||
|
|
||||||
|
/* get type */
|
||||||
|
wcap = (wcap & AC_WCAP_TYPE) >> AC_WCAP_TYPE_SHIFT;
|
||||||
|
if (wcap != AC_WID_AUD_IN) {
|
||||||
|
spec->adc_nids = alc262_adc_nids_alt;
|
||||||
|
spec->num_adc_nids =
|
||||||
|
ARRAY_SIZE(alc262_adc_nids_alt);
|
||||||
|
spec->capsrc_nids = alc262_capsrc_nids_alt;
|
||||||
|
} else {
|
||||||
|
spec->adc_nids = alc262_adc_nids;
|
||||||
|
spec->num_adc_nids =
|
||||||
|
ARRAY_SIZE(alc262_adc_nids);
|
||||||
|
spec->capsrc_nids = alc262_capsrc_nids;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!spec->cap_mixer && !spec->no_analog)
|
if (!spec->cap_mixer && !spec->no_analog)
|
||||||
|
@ -13244,26 +13267,8 @@ static int alc269_auto_create_multi_out_ctls(struct alc_spec *spec,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int alc269_auto_create_analog_input_ctls(struct alc_spec *spec,
|
#define alc269_auto_create_analog_input_ctls \
|
||||||
const struct auto_pin_cfg *cfg)
|
alc262_auto_create_analog_input_ctls
|
||||||
{
|
|
||||||
int err;
|
|
||||||
|
|
||||||
err = alc880_auto_create_analog_input_ctls(spec, cfg);
|
|
||||||
if (err < 0)
|
|
||||||
return err;
|
|
||||||
/* digital-mic input pin is excluded in alc880_auto_create..()
|
|
||||||
* because it's under 0x18
|
|
||||||
*/
|
|
||||||
if (cfg->input_pins[AUTO_PIN_MIC] == 0x12 ||
|
|
||||||
cfg->input_pins[AUTO_PIN_FRONT_MIC] == 0x12) {
|
|
||||||
struct hda_input_mux *imux = &spec->private_imux[0];
|
|
||||||
imux->items[imux->num_items].label = "Int Mic";
|
|
||||||
imux->items[imux->num_items].index = 0x05;
|
|
||||||
imux->num_items++;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef CONFIG_SND_HDA_POWER_SAVE
|
#ifdef CONFIG_SND_HDA_POWER_SAVE
|
||||||
#define alc269_loopbacks alc880_loopbacks
|
#define alc269_loopbacks alc880_loopbacks
|
||||||
|
@ -15554,7 +15559,6 @@ static int patch_alc861vd(struct hda_codec *codec)
|
||||||
spec->adc_nids = alc861vd_adc_nids;
|
spec->adc_nids = alc861vd_adc_nids;
|
||||||
spec->num_adc_nids = ARRAY_SIZE(alc861vd_adc_nids);
|
spec->num_adc_nids = ARRAY_SIZE(alc861vd_adc_nids);
|
||||||
spec->capsrc_nids = alc861vd_capsrc_nids;
|
spec->capsrc_nids = alc861vd_capsrc_nids;
|
||||||
spec->capture_style = CAPT_MIX;
|
|
||||||
|
|
||||||
set_capture_mixer(spec);
|
set_capture_mixer(spec);
|
||||||
set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
|
set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
|
||||||
|
@ -17474,7 +17478,6 @@ static int patch_alc662(struct hda_codec *codec)
|
||||||
spec->adc_nids = alc662_adc_nids;
|
spec->adc_nids = alc662_adc_nids;
|
||||||
spec->num_adc_nids = ARRAY_SIZE(alc662_adc_nids);
|
spec->num_adc_nids = ARRAY_SIZE(alc662_adc_nids);
|
||||||
spec->capsrc_nids = alc662_capsrc_nids;
|
spec->capsrc_nids = alc662_capsrc_nids;
|
||||||
spec->capture_style = CAPT_MIX;
|
|
||||||
|
|
||||||
if (!spec->cap_mixer)
|
if (!spec->cap_mixer)
|
||||||
set_capture_mixer(spec);
|
set_capture_mixer(spec);
|
||||||
|
|
|
@ -639,7 +639,7 @@ static int stac92xx_smux_enum_put(struct snd_kcontrol *kcontrol,
|
||||||
static unsigned int stac92xx_vref_set(struct hda_codec *codec,
|
static unsigned int stac92xx_vref_set(struct hda_codec *codec,
|
||||||
hda_nid_t nid, unsigned int new_vref)
|
hda_nid_t nid, unsigned int new_vref)
|
||||||
{
|
{
|
||||||
unsigned int error;
|
int error;
|
||||||
unsigned int pincfg;
|
unsigned int pincfg;
|
||||||
pincfg = snd_hda_codec_read(codec, nid, 0,
|
pincfg = snd_hda_codec_read(codec, nid, 0,
|
||||||
AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
|
AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
|
||||||
|
@ -2703,7 +2703,7 @@ static int stac92xx_dc_bias_put(struct snd_kcontrol *kcontrol,
|
||||||
{
|
{
|
||||||
struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
|
struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
|
||||||
unsigned int new_vref = 0;
|
unsigned int new_vref = 0;
|
||||||
unsigned int error;
|
int error;
|
||||||
hda_nid_t nid = kcontrol->private_value;
|
hda_nid_t nid = kcontrol->private_value;
|
||||||
|
|
||||||
if (ucontrol->value.enumerated.item[0] == 0)
|
if (ucontrol->value.enumerated.item[0] == 0)
|
||||||
|
@ -4035,7 +4035,7 @@ static void stac_gpio_set(struct hda_codec *codec, unsigned int mask,
|
||||||
AC_VERB_SET_GPIO_DATA, gpiostate); /* sync */
|
AC_VERB_SET_GPIO_DATA, gpiostate); /* sync */
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_SND_JACK
|
#ifdef CONFIG_SND_HDA_INPUT_JACK
|
||||||
static void stac92xx_free_jack_priv(struct snd_jack *jack)
|
static void stac92xx_free_jack_priv(struct snd_jack *jack)
|
||||||
{
|
{
|
||||||
struct sigmatel_jack *jacks = jack->private_data;
|
struct sigmatel_jack *jacks = jack->private_data;
|
||||||
|
@ -4047,7 +4047,7 @@ static void stac92xx_free_jack_priv(struct snd_jack *jack)
|
||||||
static int stac92xx_add_jack(struct hda_codec *codec,
|
static int stac92xx_add_jack(struct hda_codec *codec,
|
||||||
hda_nid_t nid, int type)
|
hda_nid_t nid, int type)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_SND_JACK
|
#ifdef CONFIG_SND_HDA_INPUT_JACK
|
||||||
struct sigmatel_spec *spec = codec->spec;
|
struct sigmatel_spec *spec = codec->spec;
|
||||||
struct sigmatel_jack *jack;
|
struct sigmatel_jack *jack;
|
||||||
int def_conf = snd_hda_codec_get_pincfg(codec, nid);
|
int def_conf = snd_hda_codec_get_pincfg(codec, nid);
|
||||||
|
@ -4336,7 +4336,7 @@ static int stac92xx_init(struct hda_codec *codec)
|
||||||
|
|
||||||
static void stac92xx_free_jacks(struct hda_codec *codec)
|
static void stac92xx_free_jacks(struct hda_codec *codec)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_SND_JACK
|
#ifdef CONFIG_SND_HDA_INPUT_JACK
|
||||||
/* free jack instances manually when clearing/reconfiguring */
|
/* free jack instances manually when clearing/reconfiguring */
|
||||||
struct sigmatel_spec *spec = codec->spec;
|
struct sigmatel_spec *spec = codec->spec;
|
||||||
if (!codec->bus->shutdown && spec->jacks.list) {
|
if (!codec->bus->shutdown && spec->jacks.list) {
|
||||||
|
|
Loading…
Reference in a new issue