提交 7c4112a2 编写于 作者: T Takashi Iwai

Merge branch 'fix/hda' into for-linus

* fix/hda:
  ALSA: hda - Set function_id only on FG nodes
  ALSA: hda - Add upper-limit of mixer amp for AD1884A-laptop model, too
  ALSA: hda - Fix headphone-detection on some machines with STAC/IDT codecs
  ALSA: hda_intel.c - Consolidate bitfields
...@@ -642,19 +642,21 @@ static int get_codec_name(struct hda_codec *codec) ...@@ -642,19 +642,21 @@ static int get_codec_name(struct hda_codec *codec)
*/ */
static void /*__devinit*/ setup_fg_nodes(struct hda_codec *codec) static void /*__devinit*/ setup_fg_nodes(struct hda_codec *codec)
{ {
int i, total_nodes; int i, total_nodes, function_id;
hda_nid_t nid; hda_nid_t nid;
total_nodes = snd_hda_get_sub_nodes(codec, AC_NODE_ROOT, &nid); total_nodes = snd_hda_get_sub_nodes(codec, AC_NODE_ROOT, &nid);
for (i = 0; i < total_nodes; i++, nid++) { for (i = 0; i < total_nodes; i++, nid++) {
codec->function_id = snd_hda_param_read(codec, nid, function_id = snd_hda_param_read(codec, nid,
AC_PAR_FUNCTION_TYPE) & 0xff; AC_PAR_FUNCTION_TYPE) & 0xff;
switch (codec->function_id) { switch (function_id) {
case AC_GRP_AUDIO_FUNCTION: case AC_GRP_AUDIO_FUNCTION:
codec->afg = nid; codec->afg = nid;
codec->function_id = function_id;
break; break;
case AC_GRP_MODEM_FUNCTION: case AC_GRP_MODEM_FUNCTION:
codec->mfg = nid; codec->mfg = nid;
codec->function_id = function_id;
break; break;
default: default:
break; break;
......
...@@ -312,7 +312,6 @@ struct azx_dev { ...@@ -312,7 +312,6 @@ struct azx_dev {
unsigned int period_bytes; /* size of the period in bytes */ unsigned int period_bytes; /* size of the period in bytes */
unsigned int frags; /* number for period in the play buffer */ unsigned int frags; /* number for period in the play buffer */
unsigned int fifo_size; /* FIFO size */ unsigned int fifo_size; /* FIFO size */
unsigned int start_flag: 1; /* stream full start flag */
unsigned long start_jiffies; /* start + minimum jiffies */ unsigned long start_jiffies; /* start + minimum jiffies */
unsigned long min_jiffies; /* minimum jiffies before position is valid */ unsigned long min_jiffies; /* minimum jiffies before position is valid */
...@@ -333,6 +332,7 @@ struct azx_dev { ...@@ -333,6 +332,7 @@ struct azx_dev {
unsigned int opened :1; unsigned int opened :1;
unsigned int running :1; unsigned int running :1;
unsigned int irq_pending :1; unsigned int irq_pending :1;
unsigned int start_flag: 1; /* stream full start flag */
/* /*
* For VIA: * For VIA:
* A flag to ensure DMA position is 0 * A flag to ensure DMA position is 0
......
...@@ -3977,6 +3977,14 @@ static int patch_ad1884a(struct hda_codec *codec) ...@@ -3977,6 +3977,14 @@ static int patch_ad1884a(struct hda_codec *codec)
spec->input_mux = &ad1884a_laptop_capture_source; spec->input_mux = &ad1884a_laptop_capture_source;
codec->patch_ops.unsol_event = ad1884a_hp_unsol_event; codec->patch_ops.unsol_event = ad1884a_hp_unsol_event;
codec->patch_ops.init = ad1884a_hp_init; codec->patch_ops.init = ad1884a_hp_init;
/* set the upper-limit for mixer amp to 0dB for avoiding the
* possible damage by overloading
*/
snd_hda_override_amp_caps(codec, 0x20, HDA_INPUT,
(0x17 << AC_AMPCAP_OFFSET_SHIFT) |
(0x17 << AC_AMPCAP_NUM_STEPS_SHIFT) |
(0x05 << AC_AMPCAP_STEP_SIZE_SHIFT) |
(1 << AC_AMPCAP_MUTE_SHIFT));
break; break;
case AD1884A_MOBILE: case AD1884A_MOBILE:
spec->mixers[0] = ad1884a_mobile_mixers; spec->mixers[0] = ad1884a_mobile_mixers;
......
...@@ -3076,6 +3076,11 @@ static int create_multi_out_ctls(struct hda_codec *codec, int num_outs, ...@@ -3076,6 +3076,11 @@ static int create_multi_out_ctls(struct hda_codec *codec, int num_outs,
unsigned int wid_caps; unsigned int wid_caps;
for (i = 0; i < num_outs && i < ARRAY_SIZE(chname); i++) { for (i = 0; i < num_outs && i < ARRAY_SIZE(chname); i++) {
if (type == AUTO_PIN_HP_OUT && !spec->hp_detect) {
wid_caps = get_wcaps(codec, pins[i]);
if (wid_caps & AC_WCAP_UNSOL_CAP)
spec->hp_detect = 1;
}
nid = dac_nids[i]; nid = dac_nids[i];
if (!nid) if (!nid)
continue; continue;
...@@ -3119,11 +3124,6 @@ static int create_multi_out_ctls(struct hda_codec *codec, int num_outs, ...@@ -3119,11 +3124,6 @@ static int create_multi_out_ctls(struct hda_codec *codec, int num_outs,
err = create_controls_idx(codec, name, idx, nid, 3); err = create_controls_idx(codec, name, idx, nid, 3);
if (err < 0) if (err < 0)
return err; return err;
if (type == AUTO_PIN_HP_OUT && !spec->hp_detect) {
wid_caps = get_wcaps(codec, pins[i]);
if (wid_caps & AC_WCAP_UNSOL_CAP)
spec->hp_detect = 1;
}
} }
} }
return 0; return 0;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册