|
@@ -3791,9 +3791,10 @@ static int is_dual_headphones(struct hda_codec *codec)
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
-static int stac92xx_parse_auto_config(struct hda_codec *codec, hda_nid_t dig_out, hda_nid_t dig_in)
|
|
|
|
|
|
+static int stac92xx_parse_auto_config(struct hda_codec *codec)
|
|
{
|
|
{
|
|
struct sigmatel_spec *spec = codec->spec;
|
|
struct sigmatel_spec *spec = codec->spec;
|
|
|
|
+ hda_nid_t dig_out = 0, dig_in = 0;
|
|
int hp_swap = 0;
|
|
int hp_swap = 0;
|
|
int i, err;
|
|
int i, err;
|
|
|
|
|
|
@@ -3976,6 +3977,22 @@ static int stac92xx_parse_auto_config(struct hda_codec *codec, hda_nid_t dig_out
|
|
if (spec->multiout.max_channels > 2)
|
|
if (spec->multiout.max_channels > 2)
|
|
spec->surr_switch = 1;
|
|
spec->surr_switch = 1;
|
|
|
|
|
|
|
|
+ /* find digital out and in converters */
|
|
|
|
+ for (i = codec->start_nid; i < codec->start_nid + codec->num_nodes; i++) {
|
|
|
|
+ unsigned int wid_caps = get_wcaps(codec, i);
|
|
|
|
+ if (wid_caps & AC_WCAP_DIGITAL) {
|
|
|
|
+ switch (get_wcaps_type(wid_caps)) {
|
|
|
|
+ case AC_WID_AUD_OUT:
|
|
|
|
+ if (!dig_out)
|
|
|
|
+ dig_out = i;
|
|
|
|
+ break;
|
|
|
|
+ case AC_WID_AUD_IN:
|
|
|
|
+ if (!dig_in)
|
|
|
|
+ dig_in = i;
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
if (spec->autocfg.dig_outs)
|
|
if (spec->autocfg.dig_outs)
|
|
spec->multiout.dig_out_nid = dig_out;
|
|
spec->multiout.dig_out_nid = dig_out;
|
|
if (dig_in && spec->autocfg.dig_in_pin)
|
|
if (dig_in && spec->autocfg.dig_in_pin)
|
|
@@ -5279,7 +5296,7 @@ static int patch_stac925x(struct hda_codec *codec)
|
|
spec->capvols = stac925x_capvols;
|
|
spec->capvols = stac925x_capvols;
|
|
spec->capsws = stac925x_capsws;
|
|
spec->capsws = stac925x_capsws;
|
|
|
|
|
|
- err = stac92xx_parse_auto_config(codec, 0x8, 0x7);
|
|
|
|
|
|
+ err = stac92xx_parse_auto_config(codec);
|
|
if (!err) {
|
|
if (!err) {
|
|
if (spec->board_config < 0) {
|
|
if (spec->board_config < 0) {
|
|
printk(KERN_WARNING "hda_codec: No auto-config is "
|
|
printk(KERN_WARNING "hda_codec: No auto-config is "
|
|
@@ -5420,7 +5437,7 @@ again:
|
|
spec->num_pwrs = ARRAY_SIZE(stac92hd73xx_pwr_nids);
|
|
spec->num_pwrs = ARRAY_SIZE(stac92hd73xx_pwr_nids);
|
|
spec->pwr_nids = stac92hd73xx_pwr_nids;
|
|
spec->pwr_nids = stac92hd73xx_pwr_nids;
|
|
|
|
|
|
- err = stac92xx_parse_auto_config(codec, 0x25, 0x27);
|
|
|
|
|
|
+ err = stac92xx_parse_auto_config(codec);
|
|
|
|
|
|
if (!err) {
|
|
if (!err) {
|
|
if (spec->board_config < 0) {
|
|
if (spec->board_config < 0) {
|
|
@@ -5629,26 +5646,8 @@ again:
|
|
stac92xx_set_config_regs(codec,
|
|
stac92xx_set_config_regs(codec,
|
|
stac92hd83xxx_brd_tbl[spec->board_config]);
|
|
stac92hd83xxx_brd_tbl[spec->board_config]);
|
|
|
|
|
|
- switch (codec->vendor_id) {
|
|
|
|
- case 0x111d76d1:
|
|
|
|
- case 0x111d76d9:
|
|
|
|
- case 0x111d76df:
|
|
|
|
- case 0x111d76e5:
|
|
|
|
- case 0x111d7666:
|
|
|
|
- case 0x111d7667:
|
|
|
|
- case 0x111d7668:
|
|
|
|
- case 0x111d7669:
|
|
|
|
- case 0x111d76e3:
|
|
|
|
- case 0x111d7604:
|
|
|
|
- case 0x111d76d4:
|
|
|
|
- case 0x111d7605:
|
|
|
|
- case 0x111d76d5:
|
|
|
|
- case 0x111d76e7:
|
|
|
|
- if (spec->board_config == STAC_92HD83XXX_PWR_REF)
|
|
|
|
- break;
|
|
|
|
|
|
+ if (spec->board_config != STAC_92HD83XXX_PWR_REF)
|
|
spec->num_pwrs = 0;
|
|
spec->num_pwrs = 0;
|
|
- break;
|
|
|
|
- }
|
|
|
|
|
|
|
|
codec->patch_ops = stac92xx_patch_ops;
|
|
codec->patch_ops = stac92xx_patch_ops;
|
|
|
|
|
|
@@ -5675,7 +5674,7 @@ again:
|
|
}
|
|
}
|
|
#endif
|
|
#endif
|
|
|
|
|
|
- err = stac92xx_parse_auto_config(codec, 0x1d, 0);
|
|
|
|
|
|
+ err = stac92xx_parse_auto_config(codec);
|
|
if (!err) {
|
|
if (!err) {
|
|
if (spec->board_config < 0) {
|
|
if (spec->board_config < 0) {
|
|
printk(KERN_WARNING "hda_codec: No auto-config is "
|
|
printk(KERN_WARNING "hda_codec: No auto-config is "
|
|
@@ -5996,7 +5995,7 @@ again:
|
|
|
|
|
|
spec->multiout.dac_nids = spec->dac_nids;
|
|
spec->multiout.dac_nids = spec->dac_nids;
|
|
|
|
|
|
- err = stac92xx_parse_auto_config(codec, 0x21, 0);
|
|
|
|
|
|
+ err = stac92xx_parse_auto_config(codec);
|
|
if (!err) {
|
|
if (!err) {
|
|
if (spec->board_config < 0) {
|
|
if (spec->board_config < 0) {
|
|
printk(KERN_WARNING "hda_codec: No auto-config is "
|
|
printk(KERN_WARNING "hda_codec: No auto-config is "
|
|
@@ -6105,7 +6104,7 @@ static int patch_stac922x(struct hda_codec *codec)
|
|
|
|
|
|
spec->multiout.dac_nids = spec->dac_nids;
|
|
spec->multiout.dac_nids = spec->dac_nids;
|
|
|
|
|
|
- err = stac92xx_parse_auto_config(codec, 0x08, 0x09);
|
|
|
|
|
|
+ err = stac92xx_parse_auto_config(codec);
|
|
if (!err) {
|
|
if (!err) {
|
|
if (spec->board_config < 0) {
|
|
if (spec->board_config < 0) {
|
|
printk(KERN_WARNING "hda_codec: No auto-config is "
|
|
printk(KERN_WARNING "hda_codec: No auto-config is "
|
|
@@ -6230,7 +6229,7 @@ static int patch_stac927x(struct hda_codec *codec)
|
|
spec->aloopback_shift = 0;
|
|
spec->aloopback_shift = 0;
|
|
spec->eapd_switch = 1;
|
|
spec->eapd_switch = 1;
|
|
|
|
|
|
- err = stac92xx_parse_auto_config(codec, 0x1e, 0x20);
|
|
|
|
|
|
+ err = stac92xx_parse_auto_config(codec);
|
|
if (!err) {
|
|
if (!err) {
|
|
if (spec->board_config < 0) {
|
|
if (spec->board_config < 0) {
|
|
printk(KERN_WARNING "hda_codec: No auto-config is "
|
|
printk(KERN_WARNING "hda_codec: No auto-config is "
|
|
@@ -6355,7 +6354,7 @@ static int patch_stac9205(struct hda_codec *codec)
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
- err = stac92xx_parse_auto_config(codec, 0x1f, 0x20);
|
|
|
|
|
|
+ err = stac92xx_parse_auto_config(codec);
|
|
if (!err) {
|
|
if (!err) {
|
|
if (spec->board_config < 0) {
|
|
if (spec->board_config < 0) {
|
|
printk(KERN_WARNING "hda_codec: No auto-config is "
|
|
printk(KERN_WARNING "hda_codec: No auto-config is "
|
|
@@ -6460,7 +6459,7 @@ static int patch_stac9872(struct hda_codec *codec)
|
|
spec->capvols = stac9872_capvols;
|
|
spec->capvols = stac9872_capvols;
|
|
spec->capsws = stac9872_capsws;
|
|
spec->capsws = stac9872_capsws;
|
|
|
|
|
|
- err = stac92xx_parse_auto_config(codec, 0x10, 0x12);
|
|
|
|
|
|
+ err = stac92xx_parse_auto_config(codec);
|
|
if (err < 0) {
|
|
if (err < 0) {
|
|
stac92xx_free(codec);
|
|
stac92xx_free(codec);
|
|
return -EINVAL;
|
|
return -EINVAL;
|
|
@@ -6565,6 +6564,18 @@ static const struct hda_codec_preset snd_hda_preset_sigmatel[] = {
|
|
{ .id = 0x111d76e3, .name = "92HD98BXX", .patch = patch_stac92hd83xxx},
|
|
{ .id = 0x111d76e3, .name = "92HD98BXX", .patch = patch_stac92hd83xxx},
|
|
{ .id = 0x111d76e5, .name = "92HD99BXX", .patch = patch_stac92hd83xxx},
|
|
{ .id = 0x111d76e5, .name = "92HD99BXX", .patch = patch_stac92hd83xxx},
|
|
{ .id = 0x111d76e7, .name = "92HD90BXX", .patch = patch_stac92hd83xxx},
|
|
{ .id = 0x111d76e7, .name = "92HD90BXX", .patch = patch_stac92hd83xxx},
|
|
|
|
+ { .id = 0x111d76e8, .name = "92HD66B1X5", .patch = patch_stac92hd83xxx},
|
|
|
|
+ { .id = 0x111d76e9, .name = "92HD66B2X5", .patch = patch_stac92hd83xxx},
|
|
|
|
+ { .id = 0x111d76ea, .name = "92HD66B3X5", .patch = patch_stac92hd83xxx},
|
|
|
|
+ { .id = 0x111d76eb, .name = "92HD66C1X5", .patch = patch_stac92hd83xxx},
|
|
|
|
+ { .id = 0x111d76ec, .name = "92HD66C2X5", .patch = patch_stac92hd83xxx},
|
|
|
|
+ { .id = 0x111d76ed, .name = "92HD66C3X5", .patch = patch_stac92hd83xxx},
|
|
|
|
+ { .id = 0x111d76ee, .name = "92HD66B1X3", .patch = patch_stac92hd83xxx},
|
|
|
|
+ { .id = 0x111d76ef, .name = "92HD66B2X3", .patch = patch_stac92hd83xxx},
|
|
|
|
+ { .id = 0x111d76f0, .name = "92HD66B3X3", .patch = patch_stac92hd83xxx},
|
|
|
|
+ { .id = 0x111d76f1, .name = "92HD66C1X3", .patch = patch_stac92hd83xxx},
|
|
|
|
+ { .id = 0x111d76f2, .name = "92HD66C2X3", .patch = patch_stac92hd83xxx},
|
|
|
|
+ { .id = 0x111d76f3, .name = "92HD66C3/65", .patch = patch_stac92hd83xxx},
|
|
{} /* terminator */
|
|
{} /* terminator */
|
|
};
|
|
};
|
|
|
|
|