static int patch_ad1981(struct hda_codec *codec) { struct ad198x_spec *spec; int err; err = alloc_ad_spec(codec); if (err < 0) return -ENOMEM; spec = codec->spec; spec->gen.mixer_nid = 0x0e; spec->gen.beep_nid = 0x10; set_beep_amp(spec, 0x0d, 0, HDA_OUTPUT); snd_hda_pick_fixup(codec, NULL, ad1981_fixup_tbl, ad1981_fixups); snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE); err = ad198x_parse_auto_config(codec, false); if (err < 0) goto error; err = ad1983_add_spdif_mux_ctl(codec); if (err < 0) goto error; snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE); return 0; error: snd_hda_gen_free(codec); return err; }
static int patch_ad1983(struct hda_codec *codec) { struct ad198x_spec *spec; static hda_nid_t conn_0c[] = { 0x08 }; static hda_nid_t conn_0d[] = { 0x09 }; int err; err = alloc_ad_spec(codec); if (err < 0) return err; spec = codec->spec; spec->gen.mixer_nid = 0x0e; spec->gen.beep_nid = 0x10; set_beep_amp(spec, 0x10, 0, HDA_OUTPUT); /* limit the loopback routes not to confuse the parser */ snd_hda_override_conn_list(codec, 0x0c, ARRAY_SIZE(conn_0c), conn_0c); snd_hda_override_conn_list(codec, 0x0d, ARRAY_SIZE(conn_0d), conn_0d); err = ad198x_parse_auto_config(codec, false); if (err < 0) goto error; err = ad1983_add_spdif_mux_ctl(codec); if (err < 0) goto error; return 0; error: snd_hda_gen_free(codec); return err; }
static int patch_ad1986a(struct hda_codec *codec) { int err; struct ad198x_spec *spec; static hda_nid_t preferred_pairs[] = { 0x1a, 0x03, 0x1b, 0x03, 0x1c, 0x04, 0x1d, 0x05, 0x1e, 0x03, 0 }; err = alloc_ad_spec(codec); if (err < 0) return err; spec = codec->spec; /* AD1986A has the inverted EAPD implementation */ codec->inv_eapd = 1; spec->gen.mixer_nid = 0x07; spec->gen.beep_nid = 0x19; set_beep_amp(spec, 0x18, 0, HDA_OUTPUT); /* AD1986A has a hardware problem that it can't share a stream * with multiple output pins. The copy of front to surrounds * causes noisy or silent outputs at a certain timing, e.g. * changing the volume. * So, let's disable the shared stream. */ spec->gen.multiout.no_share_stream = 1; /* give fixed DAC/pin pairs */ spec->gen.preferred_dacs = preferred_pairs; /* AD1986A can't manage the dynamic pin on/off smoothly */ spec->gen.auto_mute_via_amp = 1; snd_hda_pick_fixup(codec, ad1986a_fixup_models, ad1986a_fixup_tbl, ad1986a_fixups); snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE); err = ad198x_parse_auto_config(codec, false); if (err < 0) { snd_hda_gen_free(codec); return err; } snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE); return 0; }
static int patch_ad1983(struct hda_codec *codec) { struct ad198x_spec *spec; int err; err = alloc_ad_spec(codec); if (err < 0) return err; spec = codec->spec; spec->gen.beep_nid = 0x10; set_beep_amp(spec, 0x10, 0, HDA_OUTPUT); err = ad198x_parse_auto_config(codec, false); if (err < 0) goto error; err = ad1983_add_spdif_mux_ctl(codec); if (err < 0) goto error; return 0; error: snd_hda_gen_free(codec); return err; }