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
This commit is contained in:
commit
7c4112a285
4 changed files with 19 additions and 9 deletions
|
@ -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 {
|
||||||
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 {
|
||||||
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)
|
||||||
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,
|
||||||
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,
|
||||||
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;
|
||||||
|
|
Loading…
Add table
Reference in a new issue