diff options
-rw-r--r-- | sound/pci/hda/patch_cmedia.c | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/sound/pci/hda/patch_cmedia.c b/sound/pci/hda/patch_cmedia.c index ed3d133ffbb6..c895a8f21192 100644 --- a/sound/pci/hda/patch_cmedia.c +++ b/sound/pci/hda/patch_cmedia.c | |||
@@ -75,15 +75,62 @@ static int patch_cmi9880(struct hda_codec *codec) | |||
75 | return err; | 75 | return err; |
76 | } | 76 | } |
77 | 77 | ||
78 | static int patch_cmi8888(struct hda_codec *codec) | ||
79 | { | ||
80 | struct cmi_spec *spec; | ||
81 | struct auto_pin_cfg *cfg; | ||
82 | int err; | ||
83 | |||
84 | spec = kzalloc(sizeof(*spec), GFP_KERNEL); | ||
85 | if (!spec) | ||
86 | return -ENOMEM; | ||
87 | |||
88 | codec->spec = spec; | ||
89 | cfg = &spec->gen.autocfg; | ||
90 | snd_hda_gen_spec_init(&spec->gen); | ||
91 | |||
92 | /* mask NID 0x10 from the playback volume selection; | ||
93 | * it's a headphone boost volume handled manually below | ||
94 | */ | ||
95 | spec->gen.out_vol_mask = (1ULL << 0x10); | ||
96 | |||
97 | err = snd_hda_parse_pin_defcfg(codec, cfg, NULL, 0); | ||
98 | if (err < 0) | ||
99 | goto error; | ||
100 | err = snd_hda_gen_parse_auto_config(codec, cfg); | ||
101 | if (err < 0) | ||
102 | goto error; | ||
103 | |||
104 | if (get_defcfg_device(snd_hda_codec_get_pincfg(codec, 0x10)) == | ||
105 | AC_JACK_HP_OUT) { | ||
106 | static const struct snd_kcontrol_new amp_kctl = | ||
107 | HDA_CODEC_VOLUME("Headphone Amp Playback Volume", | ||
108 | 0x10, 0, HDA_OUTPUT); | ||
109 | if (!snd_hda_gen_add_kctl(&spec->gen, NULL, &_kctl)) { | ||
110 | err = -ENOMEM; | ||
111 | goto error; | ||
112 | } | ||
113 | } | ||
114 | |||
115 | codec->patch_ops = cmi_auto_patch_ops; | ||
116 | return 0; | ||
117 | |||
118 | error: | ||
119 | snd_hda_gen_free(codec); | ||
120 | return err; | ||
121 | } | ||
122 | |||
78 | /* | 123 | /* |
79 | * patch entries | 124 | * patch entries |
80 | */ | 125 | */ |
81 | static const struct hda_codec_preset snd_hda_preset_cmedia[] = { | 126 | static const struct hda_codec_preset snd_hda_preset_cmedia[] = { |
127 | { .id = 0x13f68888, .name = "CMI8888", .patch = patch_cmi8888 }, | ||
82 | { .id = 0x13f69880, .name = "CMI9880", .patch = patch_cmi9880 }, | 128 | { .id = 0x13f69880, .name = "CMI9880", .patch = patch_cmi9880 }, |
83 | { .id = 0x434d4980, .name = "CMI9880", .patch = patch_cmi9880 }, | 129 | { .id = 0x434d4980, .name = "CMI9880", .patch = patch_cmi9880 }, |
84 | {} /* terminator */ | 130 | {} /* terminator */ |
85 | }; | 131 | }; |
86 | 132 | ||
133 | MODULE_ALIAS("snd-hda-codec-id:13f68888"); | ||
87 | MODULE_ALIAS("snd-hda-codec-id:13f69880"); | 134 | MODULE_ALIAS("snd-hda-codec-id:13f69880"); |
88 | MODULE_ALIAS("snd-hda-codec-id:434d4980"); | 135 | MODULE_ALIAS("snd-hda-codec-id:434d4980"); |
89 | 136 | ||