diff options
Diffstat (limited to 'sound')
-rw-r--r-- | sound/pci/hda/Makefile | 2 | ||||
-rw-r--r-- | sound/pci/hda/hda_bind.c | 320 | ||||
-rw-r--r-- | sound/pci/hda/hda_codec.c | 307 | ||||
-rw-r--r-- | sound/pci/hda/hda_codec.h | 27 | ||||
-rw-r--r-- | sound/pci/hda/hda_generic.c | 18 | ||||
-rw-r--r-- | sound/pci/hda/hda_local.h | 18 | ||||
-rw-r--r-- | sound/pci/hda/patch_analog.c | 16 | ||||
-rw-r--r-- | sound/pci/hda/patch_ca0110.c | 16 | ||||
-rw-r--r-- | sound/pci/hda/patch_ca0132.c | 16 | ||||
-rw-r--r-- | sound/pci/hda/patch_cirrus.c | 16 | ||||
-rw-r--r-- | sound/pci/hda/patch_cmedia.c | 16 | ||||
-rw-r--r-- | sound/pci/hda/patch_conexant.c | 16 | ||||
-rw-r--r-- | sound/pci/hda/patch_hdmi.c | 27 | ||||
-rw-r--r-- | sound/pci/hda/patch_realtek.c | 16 | ||||
-rw-r--r-- | sound/pci/hda/patch_si3054.c | 16 | ||||
-rw-r--r-- | sound/pci/hda/patch_sigmatel.c | 16 | ||||
-rw-r--r-- | sound/pci/hda/patch_via.c | 16 |
17 files changed, 401 insertions, 478 deletions
diff --git a/sound/pci/hda/Makefile b/sound/pci/hda/Makefile index 194f30935e77..96caaebfc19d 100644 --- a/sound/pci/hda/Makefile +++ b/sound/pci/hda/Makefile | |||
@@ -4,7 +4,7 @@ snd-hda-tegra-objs := hda_tegra.o | |||
4 | # for haswell power well | 4 | # for haswell power well |
5 | snd-hda-intel-$(CONFIG_SND_HDA_I915) += hda_i915.o | 5 | snd-hda-intel-$(CONFIG_SND_HDA_I915) += hda_i915.o |
6 | 6 | ||
7 | snd-hda-codec-y := hda_codec.o hda_jack.o hda_auto_parser.o hda_sysfs.o | 7 | snd-hda-codec-y := hda_bind.o hda_codec.o hda_jack.o hda_auto_parser.o hda_sysfs.o |
8 | snd-hda-codec-$(CONFIG_PROC_FS) += hda_proc.o | 8 | snd-hda-codec-$(CONFIG_PROC_FS) += hda_proc.o |
9 | snd-hda-codec-$(CONFIG_SND_HDA_HWDEP) += hda_hwdep.o | 9 | snd-hda-codec-$(CONFIG_SND_HDA_HWDEP) += hda_hwdep.o |
10 | snd-hda-codec-$(CONFIG_SND_HDA_INPUT_BEEP) += hda_beep.o | 10 | snd-hda-codec-$(CONFIG_SND_HDA_INPUT_BEEP) += hda_beep.o |
diff --git a/sound/pci/hda/hda_bind.c b/sound/pci/hda/hda_bind.c new file mode 100644 index 000000000000..adf6b475dee1 --- /dev/null +++ b/sound/pci/hda/hda_bind.c | |||
@@ -0,0 +1,320 @@ | |||
1 | /* | ||
2 | * HD-audio codec driver binding | ||
3 | * Copyright (c) Takashi Iwai <tiwai@suse.de> | ||
4 | */ | ||
5 | |||
6 | #include <linux/init.h> | ||
7 | #include <linux/slab.h> | ||
8 | #include <linux/mutex.h> | ||
9 | #include <linux/module.h> | ||
10 | #include <linux/export.h> | ||
11 | #include <sound/core.h> | ||
12 | #include "hda_codec.h" | ||
13 | #include "hda_local.h" | ||
14 | |||
15 | /* codec vendor labels */ | ||
16 | struct hda_vendor_id { | ||
17 | unsigned int id; | ||
18 | const char *name; | ||
19 | }; | ||
20 | |||
21 | static struct hda_vendor_id hda_vendor_ids[] = { | ||
22 | { 0x1002, "ATI" }, | ||
23 | { 0x1013, "Cirrus Logic" }, | ||
24 | { 0x1057, "Motorola" }, | ||
25 | { 0x1095, "Silicon Image" }, | ||
26 | { 0x10de, "Nvidia" }, | ||
27 | { 0x10ec, "Realtek" }, | ||
28 | { 0x1102, "Creative" }, | ||
29 | { 0x1106, "VIA" }, | ||
30 | { 0x111d, "IDT" }, | ||
31 | { 0x11c1, "LSI" }, | ||
32 | { 0x11d4, "Analog Devices" }, | ||
33 | { 0x13f6, "C-Media" }, | ||
34 | { 0x14f1, "Conexant" }, | ||
35 | { 0x17e8, "Chrontel" }, | ||
36 | { 0x1854, "LG" }, | ||
37 | { 0x1aec, "Wolfson Microelectronics" }, | ||
38 | { 0x1af4, "QEMU" }, | ||
39 | { 0x434d, "C-Media" }, | ||
40 | { 0x8086, "Intel" }, | ||
41 | { 0x8384, "SigmaTel" }, | ||
42 | {} /* terminator */ | ||
43 | }; | ||
44 | |||
45 | /* | ||
46 | * find a matching codec preset | ||
47 | */ | ||
48 | static int hda_bus_match(struct device *dev, struct device_driver *drv) | ||
49 | { | ||
50 | struct hda_codec *codec = container_of(dev, struct hda_codec, dev); | ||
51 | struct hda_codec_driver *driver = | ||
52 | container_of(drv, struct hda_codec_driver, driver); | ||
53 | const struct hda_codec_preset *preset; | ||
54 | /* check probe_id instead of vendor_id if set */ | ||
55 | u32 id = codec->probe_id ? codec->probe_id : codec->vendor_id; | ||
56 | |||
57 | for (preset = driver->preset; preset->id; preset++) { | ||
58 | u32 mask = preset->mask; | ||
59 | |||
60 | if (preset->afg && preset->afg != codec->afg) | ||
61 | continue; | ||
62 | if (preset->mfg && preset->mfg != codec->mfg) | ||
63 | continue; | ||
64 | if (!mask) | ||
65 | mask = ~0; | ||
66 | if (preset->id == (id & mask) && | ||
67 | (!preset->rev || preset->rev == codec->revision_id)) { | ||
68 | codec->preset = preset; | ||
69 | return 1; | ||
70 | } | ||
71 | } | ||
72 | return 0; | ||
73 | } | ||
74 | |||
75 | /* reset the codec name from the preset */ | ||
76 | static int codec_refresh_name(struct hda_codec *codec, const char *name) | ||
77 | { | ||
78 | char tmp[16]; | ||
79 | |||
80 | kfree(codec->chip_name); | ||
81 | if (!name) { | ||
82 | sprintf(tmp, "ID %x", codec->vendor_id & 0xffff); | ||
83 | name = tmp; | ||
84 | } | ||
85 | codec->chip_name = kstrdup(name, GFP_KERNEL); | ||
86 | return codec->chip_name ? 0 : -ENOMEM; | ||
87 | } | ||
88 | |||
89 | static int hda_codec_driver_probe(struct device *dev) | ||
90 | { | ||
91 | struct hda_codec *codec = dev_to_hda_codec(dev); | ||
92 | struct module *owner = dev->driver->owner; | ||
93 | int err; | ||
94 | |||
95 | if (WARN_ON(!codec->preset)) | ||
96 | return -EINVAL; | ||
97 | |||
98 | err = codec_refresh_name(codec, codec->preset->name); | ||
99 | if (err < 0) | ||
100 | goto error; | ||
101 | |||
102 | if (!try_module_get(owner)) { | ||
103 | err = -EINVAL; | ||
104 | goto error; | ||
105 | } | ||
106 | |||
107 | err = codec->preset->patch(codec); | ||
108 | if (err < 0) { | ||
109 | module_put(owner); | ||
110 | goto error; | ||
111 | } | ||
112 | |||
113 | return 0; | ||
114 | |||
115 | error: | ||
116 | codec->preset = NULL; | ||
117 | memset(&codec->patch_ops, 0, sizeof(codec->patch_ops)); | ||
118 | return err; | ||
119 | } | ||
120 | |||
121 | static int hda_codec_driver_remove(struct device *dev) | ||
122 | { | ||
123 | struct hda_codec *codec = dev_to_hda_codec(dev); | ||
124 | |||
125 | if (codec->patch_ops.free) | ||
126 | codec->patch_ops.free(codec); | ||
127 | codec->preset = NULL; | ||
128 | memset(&codec->patch_ops, 0, sizeof(codec->patch_ops)); | ||
129 | module_put(dev->driver->owner); | ||
130 | return 0; | ||
131 | } | ||
132 | |||
133 | int __hda_codec_driver_register(struct hda_codec_driver *drv, const char *name, | ||
134 | struct module *owner) | ||
135 | { | ||
136 | drv->driver.name = name; | ||
137 | drv->driver.owner = owner; | ||
138 | drv->driver.bus = &snd_hda_bus_type; | ||
139 | drv->driver.probe = hda_codec_driver_probe; | ||
140 | drv->driver.remove = hda_codec_driver_remove; | ||
141 | /* TODO: PM and others */ | ||
142 | return driver_register(&drv->driver); | ||
143 | } | ||
144 | EXPORT_SYMBOL_GPL(__hda_codec_driver_register); | ||
145 | |||
146 | void hda_codec_driver_unregister(struct hda_codec_driver *drv) | ||
147 | { | ||
148 | driver_unregister(&drv->driver); | ||
149 | } | ||
150 | EXPORT_SYMBOL_GPL(hda_codec_driver_unregister); | ||
151 | |||
152 | static inline bool codec_probed(struct hda_codec *codec) | ||
153 | { | ||
154 | return device_attach(hda_codec_dev(codec)) > 0 && codec->preset; | ||
155 | } | ||
156 | |||
157 | /* try to auto-load and bind the codec module */ | ||
158 | static void codec_bind_module(struct hda_codec *codec) | ||
159 | { | ||
160 | #ifdef MODULE | ||
161 | request_module("snd-hda-codec-id:%08x", codec->vendor_id); | ||
162 | if (codec_probed(codec)) | ||
163 | return; | ||
164 | request_module("snd-hda-codec-id:%04x*", | ||
165 | (codec->vendor_id >> 16) & 0xffff); | ||
166 | if (codec_probed(codec)) | ||
167 | return; | ||
168 | #endif | ||
169 | } | ||
170 | |||
171 | /* store the codec vendor name */ | ||
172 | static int get_codec_vendor_name(struct hda_codec *codec) | ||
173 | { | ||
174 | const struct hda_vendor_id *c; | ||
175 | const char *vendor = NULL; | ||
176 | u16 vendor_id = codec->vendor_id >> 16; | ||
177 | char tmp[16]; | ||
178 | |||
179 | for (c = hda_vendor_ids; c->id; c++) { | ||
180 | if (c->id == vendor_id) { | ||
181 | vendor = c->name; | ||
182 | break; | ||
183 | } | ||
184 | } | ||
185 | if (!vendor) { | ||
186 | sprintf(tmp, "Generic %04x", vendor_id); | ||
187 | vendor = tmp; | ||
188 | } | ||
189 | codec->vendor_name = kstrdup(vendor, GFP_KERNEL); | ||
190 | if (!codec->vendor_name) | ||
191 | return -ENOMEM; | ||
192 | return 0; | ||
193 | } | ||
194 | |||
195 | #if IS_ENABLED(CONFIG_SND_HDA_CODEC_HDMI) | ||
196 | /* if all audio out widgets are digital, let's assume the codec as a HDMI/DP */ | ||
197 | static bool is_likely_hdmi_codec(struct hda_codec *codec) | ||
198 | { | ||
199 | hda_nid_t nid = codec->start_nid; | ||
200 | int i; | ||
201 | |||
202 | for (i = 0; i < codec->num_nodes; i++, nid++) { | ||
203 | unsigned int wcaps = get_wcaps(codec, nid); | ||
204 | switch (get_wcaps_type(wcaps)) { | ||
205 | case AC_WID_AUD_IN: | ||
206 | return false; /* HDMI parser supports only HDMI out */ | ||
207 | case AC_WID_AUD_OUT: | ||
208 | if (!(wcaps & AC_WCAP_DIGITAL)) | ||
209 | return false; | ||
210 | break; | ||
211 | } | ||
212 | } | ||
213 | return true; | ||
214 | } | ||
215 | #else | ||
216 | /* no HDMI codec parser support */ | ||
217 | #define is_likely_hdmi_codec(codec) false | ||
218 | #endif /* CONFIG_SND_HDA_CODEC_HDMI */ | ||
219 | |||
220 | static int codec_bind_generic(struct hda_codec *codec) | ||
221 | { | ||
222 | if (codec->probe_id) | ||
223 | return -ENODEV; | ||
224 | |||
225 | if (is_likely_hdmi_codec(codec)) { | ||
226 | codec->probe_id = HDA_CODEC_ID_GENERIC_HDMI; | ||
227 | #if IS_MODULE(CONFIG_SND_HDA_CODEC_HDMI) | ||
228 | request_module("snd-hda-codec-hdmi"); | ||
229 | #endif | ||
230 | if (codec_probed(codec)) | ||
231 | return 0; | ||
232 | } | ||
233 | |||
234 | codec->probe_id = HDA_CODEC_ID_GENERIC; | ||
235 | #if IS_MODULE(CONFIG_SND_HDA_GENERIC) | ||
236 | request_module("snd-hda-codec-generic"); | ||
237 | #endif | ||
238 | if (codec_probed(codec)) | ||
239 | return 0; | ||
240 | return -ENODEV; | ||
241 | } | ||
242 | |||
243 | #if IS_ENABLED(CONFIG_SND_HDA_GENERIC) | ||
244 | #define is_generic_config(codec) \ | ||
245 | (codec->modelname && !strcmp(codec->modelname, "generic")) | ||
246 | #else | ||
247 | #define is_generic_config(codec) 0 | ||
248 | #endif | ||
249 | |||
250 | /** | ||
251 | * snd_hda_codec_configure - (Re-)configure the HD-audio codec | ||
252 | * @codec: the HDA codec | ||
253 | * | ||
254 | * Start parsing of the given codec tree and (re-)initialize the whole | ||
255 | * patch instance. | ||
256 | * | ||
257 | * Returns 0 if successful or a negative error code. | ||
258 | */ | ||
259 | int snd_hda_codec_configure(struct hda_codec *codec) | ||
260 | { | ||
261 | int err; | ||
262 | |||
263 | if (!codec->vendor_name) { | ||
264 | err = get_codec_vendor_name(codec); | ||
265 | if (err < 0) | ||
266 | return err; | ||
267 | } | ||
268 | |||
269 | if (is_generic_config(codec)) | ||
270 | codec->probe_id = HDA_CODEC_ID_GENERIC; | ||
271 | else | ||
272 | codec->probe_id = 0; | ||
273 | |||
274 | err = device_add(hda_codec_dev(codec)); | ||
275 | if (err < 0) | ||
276 | return err; | ||
277 | |||
278 | if (!codec->preset) | ||
279 | codec_bind_module(codec); | ||
280 | if (!codec->preset) { | ||
281 | err = codec_bind_generic(codec); | ||
282 | if (err < 0) { | ||
283 | codec_err(codec, "Unable to bind the codec\n"); | ||
284 | goto error; | ||
285 | } | ||
286 | } | ||
287 | |||
288 | /* audio codec should override the mixer name */ | ||
289 | if (codec->afg || !*codec->bus->card->mixername) | ||
290 | snprintf(codec->bus->card->mixername, | ||
291 | sizeof(codec->bus->card->mixername), | ||
292 | "%s %s", codec->vendor_name, codec->chip_name); | ||
293 | return 0; | ||
294 | |||
295 | error: | ||
296 | device_del(hda_codec_dev(codec)); | ||
297 | return err; | ||
298 | } | ||
299 | EXPORT_SYMBOL_GPL(snd_hda_codec_configure); | ||
300 | |||
301 | /* | ||
302 | * bus registration | ||
303 | */ | ||
304 | struct bus_type snd_hda_bus_type = { | ||
305 | .name = "hdaudio", | ||
306 | .match = hda_bus_match, | ||
307 | }; | ||
308 | |||
309 | static int __init hda_codec_init(void) | ||
310 | { | ||
311 | return bus_register(&snd_hda_bus_type); | ||
312 | } | ||
313 | |||
314 | static void __exit hda_codec_exit(void) | ||
315 | { | ||
316 | bus_unregister(&snd_hda_bus_type); | ||
317 | } | ||
318 | |||
319 | module_init(hda_codec_init); | ||
320 | module_exit(hda_codec_exit); | ||
diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c index 5e755eb6f19a..61c8174e8013 100644 --- a/sound/pci/hda/hda_codec.c +++ b/sound/pci/hda/hda_codec.c | |||
@@ -40,69 +40,6 @@ | |||
40 | #define CREATE_TRACE_POINTS | 40 | #define CREATE_TRACE_POINTS |
41 | #include "hda_trace.h" | 41 | #include "hda_trace.h" |
42 | 42 | ||
43 | /* | ||
44 | * vendor / preset table | ||
45 | */ | ||
46 | |||
47 | struct hda_vendor_id { | ||
48 | unsigned int id; | ||
49 | const char *name; | ||
50 | }; | ||
51 | |||
52 | /* codec vendor labels */ | ||
53 | static struct hda_vendor_id hda_vendor_ids[] = { | ||
54 | { 0x1002, "ATI" }, | ||
55 | { 0x1013, "Cirrus Logic" }, | ||
56 | { 0x1057, "Motorola" }, | ||
57 | { 0x1095, "Silicon Image" }, | ||
58 | { 0x10de, "Nvidia" }, | ||
59 | { 0x10ec, "Realtek" }, | ||
60 | { 0x1102, "Creative" }, | ||
61 | { 0x1106, "VIA" }, | ||
62 | { 0x111d, "IDT" }, | ||
63 | { 0x11c1, "LSI" }, | ||
64 | { 0x11d4, "Analog Devices" }, | ||
65 | { 0x13f6, "C-Media" }, | ||
66 | { 0x14f1, "Conexant" }, | ||
67 | { 0x17e8, "Chrontel" }, | ||
68 | { 0x1854, "LG" }, | ||
69 | { 0x1aec, "Wolfson Microelectronics" }, | ||
70 | { 0x1af4, "QEMU" }, | ||
71 | { 0x434d, "C-Media" }, | ||
72 | { 0x8086, "Intel" }, | ||
73 | { 0x8384, "SigmaTel" }, | ||
74 | {} /* terminator */ | ||
75 | }; | ||
76 | |||
77 | static DEFINE_MUTEX(preset_mutex); | ||
78 | static LIST_HEAD(hda_preset_tables); | ||
79 | |||
80 | /** | ||
81 | * snd_hda_add_codec_preset - Add a codec preset to the chain | ||
82 | * @preset: codec preset table to add | ||
83 | */ | ||
84 | int snd_hda_add_codec_preset(struct hda_codec_preset_list *preset) | ||
85 | { | ||
86 | mutex_lock(&preset_mutex); | ||
87 | list_add_tail(&preset->list, &hda_preset_tables); | ||
88 | mutex_unlock(&preset_mutex); | ||
89 | return 0; | ||
90 | } | ||
91 | EXPORT_SYMBOL_GPL(snd_hda_add_codec_preset); | ||
92 | |||
93 | /** | ||
94 | * snd_hda_delete_codec_preset - Delete a codec preset from the chain | ||
95 | * @preset: codec preset table to delete | ||
96 | */ | ||
97 | int snd_hda_delete_codec_preset(struct hda_codec_preset_list *preset) | ||
98 | { | ||
99 | mutex_lock(&preset_mutex); | ||
100 | list_del(&preset->list); | ||
101 | mutex_unlock(&preset_mutex); | ||
102 | return 0; | ||
103 | } | ||
104 | EXPORT_SYMBOL_GPL(snd_hda_delete_codec_preset); | ||
105 | |||
106 | #ifdef CONFIG_PM | 43 | #ifdef CONFIG_PM |
107 | #define codec_in_pm(codec) ((codec)->in_pm) | 44 | #define codec_in_pm(codec) ((codec)->in_pm) |
108 | static void hda_power_work(struct work_struct *work); | 45 | static void hda_power_work(struct work_struct *work); |
@@ -885,111 +822,6 @@ int snd_hda_bus_new(struct snd_card *card, | |||
885 | } | 822 | } |
886 | EXPORT_SYMBOL_GPL(snd_hda_bus_new); | 823 | EXPORT_SYMBOL_GPL(snd_hda_bus_new); |
887 | 824 | ||
888 | #if IS_ENABLED(CONFIG_SND_HDA_GENERIC) | ||
889 | #define is_generic_config(codec) \ | ||
890 | (codec->modelname && !strcmp(codec->modelname, "generic")) | ||
891 | #else | ||
892 | #define is_generic_config(codec) 0 | ||
893 | #endif | ||
894 | |||
895 | #ifdef MODULE | ||
896 | #define HDA_MODREQ_MAX_COUNT 2 /* two request_modules()'s */ | ||
897 | #else | ||
898 | #define HDA_MODREQ_MAX_COUNT 0 /* all presets are statically linked */ | ||
899 | #endif | ||
900 | |||
901 | /* | ||
902 | * find a matching codec preset | ||
903 | */ | ||
904 | static const struct hda_codec_preset * | ||
905 | find_codec_preset(struct hda_codec *codec) | ||
906 | { | ||
907 | struct hda_codec_preset_list *tbl; | ||
908 | const struct hda_codec_preset *preset; | ||
909 | unsigned int mod_requested = 0; | ||
910 | |||
911 | again: | ||
912 | mutex_lock(&preset_mutex); | ||
913 | list_for_each_entry(tbl, &hda_preset_tables, list) { | ||
914 | if (!try_module_get(tbl->owner)) { | ||
915 | codec_err(codec, "cannot module_get\n"); | ||
916 | continue; | ||
917 | } | ||
918 | for (preset = tbl->preset; preset->id; preset++) { | ||
919 | u32 mask = preset->mask; | ||
920 | if (preset->afg && preset->afg != codec->afg) | ||
921 | continue; | ||
922 | if (preset->mfg && preset->mfg != codec->mfg) | ||
923 | continue; | ||
924 | if (!mask) | ||
925 | mask = ~0; | ||
926 | if (preset->id == (codec->vendor_id & mask) && | ||
927 | (!preset->rev || | ||
928 | preset->rev == codec->revision_id)) { | ||
929 | mutex_unlock(&preset_mutex); | ||
930 | codec->owner = tbl->owner; | ||
931 | return preset; | ||
932 | } | ||
933 | } | ||
934 | module_put(tbl->owner); | ||
935 | } | ||
936 | mutex_unlock(&preset_mutex); | ||
937 | |||
938 | if (mod_requested < HDA_MODREQ_MAX_COUNT) { | ||
939 | if (!mod_requested) | ||
940 | request_module("snd-hda-codec-id:%08x", | ||
941 | codec->vendor_id); | ||
942 | else | ||
943 | request_module("snd-hda-codec-id:%04x*", | ||
944 | (codec->vendor_id >> 16) & 0xffff); | ||
945 | mod_requested++; | ||
946 | goto again; | ||
947 | } | ||
948 | return NULL; | ||
949 | } | ||
950 | |||
951 | /* | ||
952 | * get_codec_name - store the codec name | ||
953 | */ | ||
954 | static int get_codec_name(struct hda_codec *codec) | ||
955 | { | ||
956 | const struct hda_vendor_id *c; | ||
957 | const char *vendor = NULL; | ||
958 | u16 vendor_id = codec->vendor_id >> 16; | ||
959 | char tmp[16]; | ||
960 | |||
961 | if (codec->vendor_name) | ||
962 | goto get_chip_name; | ||
963 | |||
964 | for (c = hda_vendor_ids; c->id; c++) { | ||
965 | if (c->id == vendor_id) { | ||
966 | vendor = c->name; | ||
967 | break; | ||
968 | } | ||
969 | } | ||
970 | if (!vendor) { | ||
971 | sprintf(tmp, "Generic %04x", vendor_id); | ||
972 | vendor = tmp; | ||
973 | } | ||
974 | codec->vendor_name = kstrdup(vendor, GFP_KERNEL); | ||
975 | if (!codec->vendor_name) | ||
976 | return -ENOMEM; | ||
977 | |||
978 | get_chip_name: | ||
979 | if (codec->chip_name) | ||
980 | return 0; | ||
981 | |||
982 | if (codec->preset && codec->preset->name) | ||
983 | codec->chip_name = kstrdup(codec->preset->name, GFP_KERNEL); | ||
984 | else { | ||
985 | sprintf(tmp, "ID %x", codec->vendor_id & 0xffff); | ||
986 | codec->chip_name = kstrdup(tmp, GFP_KERNEL); | ||
987 | } | ||
988 | if (!codec->chip_name) | ||
989 | return -ENOMEM; | ||
990 | return 0; | ||
991 | } | ||
992 | |||
993 | /* | 825 | /* |
994 | * look for an AFG and MFG nodes | 826 | * look for an AFG and MFG nodes |
995 | */ | 827 | */ |
@@ -1301,20 +1133,6 @@ get_hda_cvt_setup(struct hda_codec *codec, hda_nid_t nid) | |||
1301 | } | 1133 | } |
1302 | 1134 | ||
1303 | /* | 1135 | /* |
1304 | * Dynamic symbol binding for the codec parsers | ||
1305 | */ | ||
1306 | |||
1307 | #define load_parser(codec, sym) \ | ||
1308 | ((codec)->parser = (int (*)(struct hda_codec *))symbol_request(sym)) | ||
1309 | |||
1310 | static void unload_parser(struct hda_codec *codec) | ||
1311 | { | ||
1312 | if (codec->parser) | ||
1313 | symbol_put_addr(codec->parser); | ||
1314 | codec->parser = NULL; | ||
1315 | } | ||
1316 | |||
1317 | /* | ||
1318 | * codec destructor | 1136 | * codec destructor |
1319 | */ | 1137 | */ |
1320 | static void snd_hda_codec_free(struct hda_codec *codec) | 1138 | static void snd_hda_codec_free(struct hda_codec *codec) |
@@ -1322,6 +1140,8 @@ static void snd_hda_codec_free(struct hda_codec *codec) | |||
1322 | if (!codec) | 1140 | if (!codec) |
1323 | return; | 1141 | return; |
1324 | cancel_delayed_work_sync(&codec->jackpoll_work); | 1142 | cancel_delayed_work_sync(&codec->jackpoll_work); |
1143 | if (device_is_registered(hda_codec_dev(codec))) | ||
1144 | device_del(hda_codec_dev(codec)); | ||
1325 | snd_hda_jack_tbl_clear(codec); | 1145 | snd_hda_jack_tbl_clear(codec); |
1326 | free_init_pincfgs(codec); | 1146 | free_init_pincfgs(codec); |
1327 | #ifdef CONFIG_PM | 1147 | #ifdef CONFIG_PM |
@@ -1335,12 +1155,8 @@ static void snd_hda_codec_free(struct hda_codec *codec) | |||
1335 | snd_array_free(&codec->spdif_out); | 1155 | snd_array_free(&codec->spdif_out); |
1336 | remove_conn_list(codec); | 1156 | remove_conn_list(codec); |
1337 | codec->bus->caddr_tbl[codec->addr] = NULL; | 1157 | codec->bus->caddr_tbl[codec->addr] = NULL; |
1338 | if (codec->patch_ops.free) | ||
1339 | codec->patch_ops.free(codec); | ||
1340 | hda_call_pm_notify(codec, false); /* cancel leftover refcounts */ | 1158 | hda_call_pm_notify(codec, false); /* cancel leftover refcounts */ |
1341 | snd_hda_sysfs_clear(codec); | 1159 | snd_hda_sysfs_clear(codec); |
1342 | unload_parser(codec); | ||
1343 | module_put(codec->owner); | ||
1344 | free_hda_cache(&codec->amp_cache); | 1160 | free_hda_cache(&codec->amp_cache); |
1345 | free_hda_cache(&codec->cmd_cache); | 1161 | free_hda_cache(&codec->cmd_cache); |
1346 | kfree(codec->vendor_name); | 1162 | kfree(codec->vendor_name); |
@@ -1348,7 +1164,7 @@ static void snd_hda_codec_free(struct hda_codec *codec) | |||
1348 | kfree(codec->modelname); | 1164 | kfree(codec->modelname); |
1349 | kfree(codec->wcaps); | 1165 | kfree(codec->wcaps); |
1350 | codec->bus->num_codecs--; | 1166 | codec->bus->num_codecs--; |
1351 | put_device(&codec->dev); | 1167 | put_device(hda_codec_dev(codec)); |
1352 | } | 1168 | } |
1353 | 1169 | ||
1354 | static bool snd_hda_codec_get_supported_ps(struct hda_codec *codec, | 1170 | static bool snd_hda_codec_get_supported_ps(struct hda_codec *codec, |
@@ -1360,10 +1176,7 @@ static unsigned int hda_set_power_state(struct hda_codec *codec, | |||
1360 | static int snd_hda_codec_dev_register(struct snd_device *device) | 1176 | static int snd_hda_codec_dev_register(struct snd_device *device) |
1361 | { | 1177 | { |
1362 | struct hda_codec *codec = device->device_data; | 1178 | struct hda_codec *codec = device->device_data; |
1363 | int err = device_add(&codec->dev); | ||
1364 | 1179 | ||
1365 | if (err < 0) | ||
1366 | return err; | ||
1367 | snd_hda_register_beep_device(codec); | 1180 | snd_hda_register_beep_device(codec); |
1368 | return 0; | 1181 | return 0; |
1369 | } | 1182 | } |
@@ -1373,7 +1186,6 @@ static int snd_hda_codec_dev_disconnect(struct snd_device *device) | |||
1373 | struct hda_codec *codec = device->device_data; | 1186 | struct hda_codec *codec = device->device_data; |
1374 | 1187 | ||
1375 | snd_hda_detach_beep_device(codec); | 1188 | snd_hda_detach_beep_device(codec); |
1376 | device_del(&codec->dev); | ||
1377 | return 0; | 1189 | return 0; |
1378 | } | 1190 | } |
1379 | 1191 | ||
@@ -1386,7 +1198,7 @@ static int snd_hda_codec_dev_free(struct snd_device *device) | |||
1386 | /* just free the container */ | 1198 | /* just free the container */ |
1387 | static void snd_hda_codec_dev_release(struct device *dev) | 1199 | static void snd_hda_codec_dev_release(struct device *dev) |
1388 | { | 1200 | { |
1389 | kfree(container_of(dev, struct hda_codec, dev)); | 1201 | kfree(dev_to_hda_codec(dev)); |
1390 | } | 1202 | } |
1391 | 1203 | ||
1392 | /** | 1204 | /** |
@@ -1402,6 +1214,7 @@ int snd_hda_codec_new(struct hda_bus *bus, | |||
1402 | struct hda_codec **codecp) | 1214 | struct hda_codec **codecp) |
1403 | { | 1215 | { |
1404 | struct hda_codec *codec; | 1216 | struct hda_codec *codec; |
1217 | struct device *dev; | ||
1405 | char component[31]; | 1218 | char component[31]; |
1406 | hda_nid_t fg; | 1219 | hda_nid_t fg; |
1407 | int err; | 1220 | int err; |
@@ -1429,14 +1242,14 @@ int snd_hda_codec_new(struct hda_bus *bus, | |||
1429 | return -ENOMEM; | 1242 | return -ENOMEM; |
1430 | } | 1243 | } |
1431 | 1244 | ||
1432 | device_initialize(&codec->dev); | 1245 | dev = hda_codec_dev(codec); |
1433 | codec->dev.parent = &bus->card->card_dev; | 1246 | device_initialize(dev); |
1434 | codec->dev.class = sound_class; | 1247 | dev->parent = bus->card->dev; |
1435 | codec->dev.release = snd_hda_codec_dev_release; | 1248 | dev->bus = &snd_hda_bus_type; |
1436 | codec->dev.groups = snd_hda_dev_attr_groups; | 1249 | dev->release = snd_hda_codec_dev_release; |
1437 | dev_set_name(&codec->dev, "hdaudioC%dD%d", bus->card->number, | 1250 | dev->groups = snd_hda_dev_attr_groups; |
1438 | codec_addr); | 1251 | dev_set_name(dev, "hdaudioC%dD%d", bus->card->number, codec_addr); |
1439 | dev_set_drvdata(&codec->dev, codec); /* for sysfs */ | 1252 | dev_set_drvdata(dev, codec); /* for sysfs */ |
1440 | 1253 | ||
1441 | codec->bus = bus; | 1254 | codec->bus = bus; |
1442 | codec->addr = codec_addr; | 1255 | codec->addr = codec_addr; |
@@ -1587,92 +1400,6 @@ int snd_hda_codec_update_widgets(struct hda_codec *codec) | |||
1587 | } | 1400 | } |
1588 | EXPORT_SYMBOL_GPL(snd_hda_codec_update_widgets); | 1401 | EXPORT_SYMBOL_GPL(snd_hda_codec_update_widgets); |
1589 | 1402 | ||
1590 | |||
1591 | #if IS_ENABLED(CONFIG_SND_HDA_CODEC_HDMI) | ||
1592 | /* if all audio out widgets are digital, let's assume the codec as a HDMI/DP */ | ||
1593 | static bool is_likely_hdmi_codec(struct hda_codec *codec) | ||
1594 | { | ||
1595 | hda_nid_t nid = codec->start_nid; | ||
1596 | int i; | ||
1597 | |||
1598 | for (i = 0; i < codec->num_nodes; i++, nid++) { | ||
1599 | unsigned int wcaps = get_wcaps(codec, nid); | ||
1600 | switch (get_wcaps_type(wcaps)) { | ||
1601 | case AC_WID_AUD_IN: | ||
1602 | return false; /* HDMI parser supports only HDMI out */ | ||
1603 | case AC_WID_AUD_OUT: | ||
1604 | if (!(wcaps & AC_WCAP_DIGITAL)) | ||
1605 | return false; | ||
1606 | break; | ||
1607 | } | ||
1608 | } | ||
1609 | return true; | ||
1610 | } | ||
1611 | #else | ||
1612 | /* no HDMI codec parser support */ | ||
1613 | #define is_likely_hdmi_codec(codec) false | ||
1614 | #endif /* CONFIG_SND_HDA_CODEC_HDMI */ | ||
1615 | |||
1616 | /** | ||
1617 | * snd_hda_codec_configure - (Re-)configure the HD-audio codec | ||
1618 | * @codec: the HDA codec | ||
1619 | * | ||
1620 | * Start parsing of the given codec tree and (re-)initialize the whole | ||
1621 | * patch instance. | ||
1622 | * | ||
1623 | * Returns 0 if successful or a negative error code. | ||
1624 | */ | ||
1625 | int snd_hda_codec_configure(struct hda_codec *codec) | ||
1626 | { | ||
1627 | int (*patch)(struct hda_codec *) = NULL; | ||
1628 | int err; | ||
1629 | |||
1630 | codec->preset = find_codec_preset(codec); | ||
1631 | if (!codec->vendor_name || !codec->chip_name) { | ||
1632 | err = get_codec_name(codec); | ||
1633 | if (err < 0) | ||
1634 | return err; | ||
1635 | } | ||
1636 | |||
1637 | if (!is_generic_config(codec) && codec->preset) | ||
1638 | patch = codec->preset->patch; | ||
1639 | if (!patch) { | ||
1640 | unload_parser(codec); /* to be sure */ | ||
1641 | if (is_likely_hdmi_codec(codec)) { | ||
1642 | #if IS_MODULE(CONFIG_SND_HDA_CODEC_HDMI) | ||
1643 | patch = load_parser(codec, snd_hda_parse_hdmi_codec); | ||
1644 | #elif IS_BUILTIN(CONFIG_SND_HDA_CODEC_HDMI) | ||
1645 | patch = snd_hda_parse_hdmi_codec; | ||
1646 | #endif | ||
1647 | } | ||
1648 | if (!patch) { | ||
1649 | #if IS_MODULE(CONFIG_SND_HDA_GENERIC) | ||
1650 | patch = load_parser(codec, snd_hda_parse_generic_codec); | ||
1651 | #elif IS_BUILTIN(CONFIG_SND_HDA_GENERIC) | ||
1652 | patch = snd_hda_parse_generic_codec; | ||
1653 | #endif | ||
1654 | } | ||
1655 | if (!patch) { | ||
1656 | codec_err(codec, "No codec parser is available\n"); | ||
1657 | return -ENODEV; | ||
1658 | } | ||
1659 | } | ||
1660 | |||
1661 | err = patch(codec); | ||
1662 | if (err < 0) { | ||
1663 | unload_parser(codec); | ||
1664 | return err; | ||
1665 | } | ||
1666 | |||
1667 | /* audio codec should override the mixer name */ | ||
1668 | if (codec->afg || !*codec->bus->card->mixername) | ||
1669 | snprintf(codec->bus->card->mixername, | ||
1670 | sizeof(codec->bus->card->mixername), | ||
1671 | "%s %s", codec->vendor_name, codec->chip_name); | ||
1672 | return 0; | ||
1673 | } | ||
1674 | EXPORT_SYMBOL_GPL(snd_hda_codec_configure); | ||
1675 | |||
1676 | /* update the stream-id if changed */ | 1403 | /* update the stream-id if changed */ |
1677 | static void update_pcm_stream_id(struct hda_codec *codec, | 1404 | static void update_pcm_stream_id(struct hda_codec *codec, |
1678 | struct hda_cvt_setup *p, hda_nid_t nid, | 1405 | struct hda_cvt_setup *p, hda_nid_t nid, |
@@ -2739,8 +2466,9 @@ int snd_hda_codec_reset(struct hda_codec *codec) | |||
2739 | } | 2466 | } |
2740 | } | 2467 | } |
2741 | snd_hda_detach_beep_device(codec); | 2468 | snd_hda_detach_beep_device(codec); |
2742 | if (codec->patch_ops.free) | 2469 | if (device_is_registered(hda_codec_dev(codec))) |
2743 | codec->patch_ops.free(codec); | 2470 | device_del(hda_codec_dev(codec)); |
2471 | |||
2744 | memset(&codec->patch_ops, 0, sizeof(codec->patch_ops)); | 2472 | memset(&codec->patch_ops, 0, sizeof(codec->patch_ops)); |
2745 | snd_hda_jack_tbl_clear(codec); | 2473 | snd_hda_jack_tbl_clear(codec); |
2746 | codec->proc_widget_hook = NULL; | 2474 | codec->proc_widget_hook = NULL; |
@@ -2759,9 +2487,6 @@ int snd_hda_codec_reset(struct hda_codec *codec) | |||
2759 | codec->preset = NULL; | 2487 | codec->preset = NULL; |
2760 | codec->slave_dig_outs = NULL; | 2488 | codec->slave_dig_outs = NULL; |
2761 | codec->spdif_status_reset = 0; | 2489 | codec->spdif_status_reset = 0; |
2762 | unload_parser(codec); | ||
2763 | module_put(codec->owner); | ||
2764 | codec->owner = NULL; | ||
2765 | 2490 | ||
2766 | /* allow device access again */ | 2491 | /* allow device access again */ |
2767 | snd_hda_unlock_devices(bus); | 2492 | snd_hda_unlock_devices(bus); |
diff --git a/sound/pci/hda/hda_codec.h b/sound/pci/hda/hda_codec.h index 96421a3b32cd..3d42717e0e65 100644 --- a/sound/pci/hda/hda_codec.h +++ b/sound/pci/hda/hda_codec.h | |||
@@ -174,15 +174,22 @@ struct hda_codec_preset { | |||
174 | int (*patch)(struct hda_codec *codec); | 174 | int (*patch)(struct hda_codec *codec); |
175 | }; | 175 | }; |
176 | 176 | ||
177 | struct hda_codec_preset_list { | 177 | #define HDA_CODEC_ID_GENERIC_HDMI 0x00000101 |
178 | #define HDA_CODEC_ID_GENERIC 0x00000201 | ||
179 | |||
180 | struct hda_codec_driver { | ||
181 | struct device_driver driver; | ||
178 | const struct hda_codec_preset *preset; | 182 | const struct hda_codec_preset *preset; |
179 | struct module *owner; | ||
180 | struct list_head list; | ||
181 | }; | 183 | }; |
182 | 184 | ||
183 | /* initial hook */ | 185 | int __hda_codec_driver_register(struct hda_codec_driver *drv, const char *name, |
184 | int snd_hda_add_codec_preset(struct hda_codec_preset_list *preset); | 186 | struct module *owner); |
185 | int snd_hda_delete_codec_preset(struct hda_codec_preset_list *preset); | 187 | #define hda_codec_driver_register(drv) \ |
188 | __hda_codec_driver_register(drv, KBUILD_MODNAME, THIS_MODULE) | ||
189 | void hda_codec_driver_unregister(struct hda_codec_driver *drv); | ||
190 | #define module_hda_codec_driver(drv) \ | ||
191 | module_driver(drv, hda_codec_driver_register, \ | ||
192 | hda_codec_driver_unregister) | ||
186 | 193 | ||
187 | /* ops set by the preset patch */ | 194 | /* ops set by the preset patch */ |
188 | struct hda_codec_ops { | 195 | struct hda_codec_ops { |
@@ -286,11 +293,10 @@ struct hda_codec { | |||
286 | u32 vendor_id; | 293 | u32 vendor_id; |
287 | u32 subsystem_id; | 294 | u32 subsystem_id; |
288 | u32 revision_id; | 295 | u32 revision_id; |
296 | u32 probe_id; /* overridden id for probing */ | ||
289 | 297 | ||
290 | /* detected preset */ | 298 | /* detected preset */ |
291 | const struct hda_codec_preset *preset; | 299 | const struct hda_codec_preset *preset; |
292 | struct module *owner; | ||
293 | int (*parser)(struct hda_codec *codec); | ||
294 | const char *vendor_name; /* codec vendor name */ | 300 | const char *vendor_name; /* codec vendor name */ |
295 | const char *chip_name; /* codec chip name */ | 301 | const char *chip_name; /* codec chip name */ |
296 | const char *modelname; /* model name for preset */ | 302 | const char *modelname; /* model name for preset */ |
@@ -408,6 +414,11 @@ struct hda_codec { | |||
408 | struct snd_array verbs; | 414 | struct snd_array verbs; |
409 | }; | 415 | }; |
410 | 416 | ||
417 | #define dev_to_hda_codec(_dev) container_of(_dev, struct hda_codec, dev) | ||
418 | #define hda_codec_dev(_dev) (&(_dev)->dev) | ||
419 | |||
420 | extern struct bus_type snd_hda_bus_type; | ||
421 | |||
411 | /* direction */ | 422 | /* direction */ |
412 | enum { | 423 | enum { |
413 | HDA_INPUT, HDA_OUTPUT | 424 | HDA_INPUT, HDA_OUTPUT |
diff --git a/sound/pci/hda/hda_generic.c b/sound/pci/hda/hda_generic.c index b680b4ec6331..947d1a50f384 100644 --- a/sound/pci/hda/hda_generic.c +++ b/sound/pci/hda/hda_generic.c | |||
@@ -5493,13 +5493,11 @@ static const struct hda_codec_ops generic_patch_ops = { | |||
5493 | #endif | 5493 | #endif |
5494 | }; | 5494 | }; |
5495 | 5495 | ||
5496 | /** | 5496 | /* |
5497 | * snd_hda_parse_generic_codec - Generic codec parser | 5497 | * snd_hda_parse_generic_codec - Generic codec parser |
5498 | * @codec: the HDA codec | 5498 | * @codec: the HDA codec |
5499 | * | ||
5500 | * This should be called from the HDA codec core. | ||
5501 | */ | 5499 | */ |
5502 | int snd_hda_parse_generic_codec(struct hda_codec *codec) | 5500 | static int snd_hda_parse_generic_codec(struct hda_codec *codec) |
5503 | { | 5501 | { |
5504 | struct hda_gen_spec *spec; | 5502 | struct hda_gen_spec *spec; |
5505 | int err; | 5503 | int err; |
@@ -5525,7 +5523,17 @@ error: | |||
5525 | snd_hda_gen_free(codec); | 5523 | snd_hda_gen_free(codec); |
5526 | return err; | 5524 | return err; |
5527 | } | 5525 | } |
5528 | EXPORT_SYMBOL_GPL(snd_hda_parse_generic_codec); | 5526 | |
5527 | static const struct hda_codec_preset snd_hda_preset_generic[] = { | ||
5528 | { .id = HDA_CODEC_ID_GENERIC, .patch = snd_hda_parse_generic_codec }, | ||
5529 | {} /* terminator */ | ||
5530 | }; | ||
5531 | |||
5532 | static struct hda_codec_driver generic_driver = { | ||
5533 | .preset = snd_hda_preset_generic, | ||
5534 | }; | ||
5535 | |||
5536 | module_hda_codec_driver(generic_driver); | ||
5529 | 5537 | ||
5530 | MODULE_LICENSE("GPL"); | 5538 | MODULE_LICENSE("GPL"); |
5531 | MODULE_DESCRIPTION("Generic HD-audio codec parser"); | 5539 | MODULE_DESCRIPTION("Generic HD-audio codec parser"); |
diff --git a/sound/pci/hda/hda_local.h b/sound/pci/hda/hda_local.h index 49c08a7278c4..2f7d9646a41d 100644 --- a/sound/pci/hda/hda_local.h +++ b/sound/pci/hda/hda_local.h | |||
@@ -351,12 +351,6 @@ int snd_hda_multi_out_analog_cleanup(struct hda_codec *codec, | |||
351 | struct hda_multi_out *mout); | 351 | struct hda_multi_out *mout); |
352 | 352 | ||
353 | /* | 353 | /* |
354 | * generic codec parser | ||
355 | */ | ||
356 | int snd_hda_parse_generic_codec(struct hda_codec *codec); | ||
357 | int snd_hda_parse_hdmi_codec(struct hda_codec *codec); | ||
358 | |||
359 | /* | ||
360 | * generic proc interface | 354 | * generic proc interface |
361 | */ | 355 | */ |
362 | #ifdef CONFIG_PROC_FS | 356 | #ifdef CONFIG_PROC_FS |
@@ -783,9 +777,13 @@ void snd_print_channel_allocation(int spk_alloc, char *buf, int buflen); | |||
783 | 777 | ||
784 | /* | 778 | /* |
785 | */ | 779 | */ |
786 | #define codec_err(codec, fmt, args...) dev_err(&(codec)->dev, fmt, ##args) | 780 | #define codec_err(codec, fmt, args...) \ |
787 | #define codec_warn(codec, fmt, args...) dev_warn(&(codec)->dev, fmt, ##args) | 781 | dev_err(hda_codec_dev(codec), fmt, ##args) |
788 | #define codec_info(codec, fmt, args...) dev_info(&(codec)->dev, fmt, ##args) | 782 | #define codec_warn(codec, fmt, args...) \ |
789 | #define codec_dbg(codec, fmt, args...) dev_dbg(&(codec)->dev, fmt, ##args) | 783 | dev_warn(hda_codec_dev(codec), fmt, ##args) |
784 | #define codec_info(codec, fmt, args...) \ | ||
785 | dev_info(hda_codec_dev(codec), fmt, ##args) | ||
786 | #define codec_dbg(codec, fmt, args...) \ | ||
787 | dev_dbg(hda_codec_dev(codec), fmt, ##args) | ||
790 | 788 | ||
791 | #endif /* __SOUND_HDA_LOCAL_H */ | 789 | #endif /* __SOUND_HDA_LOCAL_H */ |
diff --git a/sound/pci/hda/patch_analog.c b/sound/pci/hda/patch_analog.c index d285904cdb64..af4c7be86c27 100644 --- a/sound/pci/hda/patch_analog.c +++ b/sound/pci/hda/patch_analog.c | |||
@@ -1194,20 +1194,8 @@ MODULE_ALIAS("snd-hda-codec-id:11d4*"); | |||
1194 | MODULE_LICENSE("GPL"); | 1194 | MODULE_LICENSE("GPL"); |
1195 | MODULE_DESCRIPTION("Analog Devices HD-audio codec"); | 1195 | MODULE_DESCRIPTION("Analog Devices HD-audio codec"); |
1196 | 1196 | ||
1197 | static struct hda_codec_preset_list analog_list = { | 1197 | static struct hda_codec_driver analog_driver = { |
1198 | .preset = snd_hda_preset_analog, | 1198 | .preset = snd_hda_preset_analog, |
1199 | .owner = THIS_MODULE, | ||
1200 | }; | 1199 | }; |
1201 | 1200 | ||
1202 | static int __init patch_analog_init(void) | 1201 | module_hda_codec_driver(analog_driver); |
1203 | { | ||
1204 | return snd_hda_add_codec_preset(&analog_list); | ||
1205 | } | ||
1206 | |||
1207 | static void __exit patch_analog_exit(void) | ||
1208 | { | ||
1209 | snd_hda_delete_codec_preset(&analog_list); | ||
1210 | } | ||
1211 | |||
1212 | module_init(patch_analog_init) | ||
1213 | module_exit(patch_analog_exit) | ||
diff --git a/sound/pci/hda/patch_ca0110.c b/sound/pci/hda/patch_ca0110.c index 5e65999e0d8e..447302695195 100644 --- a/sound/pci/hda/patch_ca0110.c +++ b/sound/pci/hda/patch_ca0110.c | |||
@@ -98,20 +98,8 @@ MODULE_ALIAS("snd-hda-codec-id:1102000d"); | |||
98 | MODULE_LICENSE("GPL"); | 98 | MODULE_LICENSE("GPL"); |
99 | MODULE_DESCRIPTION("Creative CA0110-IBG HD-audio codec"); | 99 | MODULE_DESCRIPTION("Creative CA0110-IBG HD-audio codec"); |
100 | 100 | ||
101 | static struct hda_codec_preset_list ca0110_list = { | 101 | static struct hda_codec_driver ca0110_driver = { |
102 | .preset = snd_hda_preset_ca0110, | 102 | .preset = snd_hda_preset_ca0110, |
103 | .owner = THIS_MODULE, | ||
104 | }; | 103 | }; |
105 | 104 | ||
106 | static int __init patch_ca0110_init(void) | 105 | module_hda_codec_driver(ca0110_driver); |
107 | { | ||
108 | return snd_hda_add_codec_preset(&ca0110_list); | ||
109 | } | ||
110 | |||
111 | static void __exit patch_ca0110_exit(void) | ||
112 | { | ||
113 | snd_hda_delete_codec_preset(&ca0110_list); | ||
114 | } | ||
115 | |||
116 | module_init(patch_ca0110_init) | ||
117 | module_exit(patch_ca0110_exit) | ||
diff --git a/sound/pci/hda/patch_ca0132.c b/sound/pci/hda/patch_ca0132.c index e0383eea9880..81991b4134cd 100644 --- a/sound/pci/hda/patch_ca0132.c +++ b/sound/pci/hda/patch_ca0132.c | |||
@@ -4702,20 +4702,8 @@ MODULE_ALIAS("snd-hda-codec-id:11020011"); | |||
4702 | MODULE_LICENSE("GPL"); | 4702 | MODULE_LICENSE("GPL"); |
4703 | MODULE_DESCRIPTION("Creative Sound Core3D codec"); | 4703 | MODULE_DESCRIPTION("Creative Sound Core3D codec"); |
4704 | 4704 | ||
4705 | static struct hda_codec_preset_list ca0132_list = { | 4705 | static struct hda_codec_driver ca0132_driver = { |
4706 | .preset = snd_hda_preset_ca0132, | 4706 | .preset = snd_hda_preset_ca0132, |
4707 | .owner = THIS_MODULE, | ||
4708 | }; | 4707 | }; |
4709 | 4708 | ||
4710 | static int __init patch_ca0132_init(void) | 4709 | module_hda_codec_driver(ca0132_driver); |
4711 | { | ||
4712 | return snd_hda_add_codec_preset(&ca0132_list); | ||
4713 | } | ||
4714 | |||
4715 | static void __exit patch_ca0132_exit(void) | ||
4716 | { | ||
4717 | snd_hda_delete_codec_preset(&ca0132_list); | ||
4718 | } | ||
4719 | |||
4720 | module_init(patch_ca0132_init) | ||
4721 | module_exit(patch_ca0132_exit) | ||
diff --git a/sound/pci/hda/patch_cirrus.c b/sound/pci/hda/patch_cirrus.c index 1589c9bcce3e..1af133933bc0 100644 --- a/sound/pci/hda/patch_cirrus.c +++ b/sound/pci/hda/patch_cirrus.c | |||
@@ -1219,20 +1219,8 @@ MODULE_ALIAS("snd-hda-codec-id:10134213"); | |||
1219 | MODULE_LICENSE("GPL"); | 1219 | MODULE_LICENSE("GPL"); |
1220 | MODULE_DESCRIPTION("Cirrus Logic HD-audio codec"); | 1220 | MODULE_DESCRIPTION("Cirrus Logic HD-audio codec"); |
1221 | 1221 | ||
1222 | static struct hda_codec_preset_list cirrus_list = { | 1222 | static struct hda_codec_driver cirrus_driver = { |
1223 | .preset = snd_hda_preset_cirrus, | 1223 | .preset = snd_hda_preset_cirrus, |
1224 | .owner = THIS_MODULE, | ||
1225 | }; | 1224 | }; |
1226 | 1225 | ||
1227 | static int __init patch_cirrus_init(void) | 1226 | module_hda_codec_driver(cirrus_driver); |
1228 | { | ||
1229 | return snd_hda_add_codec_preset(&cirrus_list); | ||
1230 | } | ||
1231 | |||
1232 | static void __exit patch_cirrus_exit(void) | ||
1233 | { | ||
1234 | snd_hda_delete_codec_preset(&cirrus_list); | ||
1235 | } | ||
1236 | |||
1237 | module_init(patch_cirrus_init) | ||
1238 | module_exit(patch_cirrus_exit) | ||
diff --git a/sound/pci/hda/patch_cmedia.c b/sound/pci/hda/patch_cmedia.c index c895a8f21192..617d9012e78a 100644 --- a/sound/pci/hda/patch_cmedia.c +++ b/sound/pci/hda/patch_cmedia.c | |||
@@ -137,20 +137,8 @@ MODULE_ALIAS("snd-hda-codec-id:434d4980"); | |||
137 | MODULE_LICENSE("GPL"); | 137 | MODULE_LICENSE("GPL"); |
138 | MODULE_DESCRIPTION("C-Media HD-audio codec"); | 138 | MODULE_DESCRIPTION("C-Media HD-audio codec"); |
139 | 139 | ||
140 | static struct hda_codec_preset_list cmedia_list = { | 140 | static struct hda_codec_driver cmedia_driver = { |
141 | .preset = snd_hda_preset_cmedia, | 141 | .preset = snd_hda_preset_cmedia, |
142 | .owner = THIS_MODULE, | ||
143 | }; | 142 | }; |
144 | 143 | ||
145 | static int __init patch_cmedia_init(void) | 144 | module_hda_codec_driver(cmedia_driver); |
146 | { | ||
147 | return snd_hda_add_codec_preset(&cmedia_list); | ||
148 | } | ||
149 | |||
150 | static void __exit patch_cmedia_exit(void) | ||
151 | { | ||
152 | snd_hda_delete_codec_preset(&cmedia_list); | ||
153 | } | ||
154 | |||
155 | module_init(patch_cmedia_init) | ||
156 | module_exit(patch_cmedia_exit) | ||
diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c index fd3ed18670e9..15a0a7d38c35 100644 --- a/sound/pci/hda/patch_conexant.c +++ b/sound/pci/hda/patch_conexant.c | |||
@@ -1007,20 +1007,8 @@ MODULE_ALIAS("snd-hda-codec-id:14f151d7"); | |||
1007 | MODULE_LICENSE("GPL"); | 1007 | MODULE_LICENSE("GPL"); |
1008 | MODULE_DESCRIPTION("Conexant HD-audio codec"); | 1008 | MODULE_DESCRIPTION("Conexant HD-audio codec"); |
1009 | 1009 | ||
1010 | static struct hda_codec_preset_list conexant_list = { | 1010 | static struct hda_codec_driver conexant_driver = { |
1011 | .preset = snd_hda_preset_conexant, | 1011 | .preset = snd_hda_preset_conexant, |
1012 | .owner = THIS_MODULE, | ||
1013 | }; | 1012 | }; |
1014 | 1013 | ||
1015 | static int __init patch_conexant_init(void) | 1014 | module_hda_codec_driver(conexant_driver); |
1016 | { | ||
1017 | return snd_hda_add_codec_preset(&conexant_list); | ||
1018 | } | ||
1019 | |||
1020 | static void __exit patch_conexant_exit(void) | ||
1021 | { | ||
1022 | snd_hda_delete_codec_preset(&conexant_list); | ||
1023 | } | ||
1024 | |||
1025 | module_init(patch_conexant_init) | ||
1026 | module_exit(patch_conexant_exit) | ||
diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c index b422e406a9cb..f1812aabd63e 100644 --- a/sound/pci/hda/patch_hdmi.c +++ b/sound/pci/hda/patch_hdmi.c | |||
@@ -3301,15 +3301,6 @@ static int patch_via_hdmi(struct hda_codec *codec) | |||
3301 | } | 3301 | } |
3302 | 3302 | ||
3303 | /* | 3303 | /* |
3304 | * called from hda_codec.c for generic HDMI support | ||
3305 | */ | ||
3306 | int snd_hda_parse_hdmi_codec(struct hda_codec *codec) | ||
3307 | { | ||
3308 | return patch_generic_hdmi(codec); | ||
3309 | } | ||
3310 | EXPORT_SYMBOL_GPL(snd_hda_parse_hdmi_codec); | ||
3311 | |||
3312 | /* | ||
3313 | * patch entries | 3304 | * patch entries |
3314 | */ | 3305 | */ |
3315 | static const struct hda_codec_preset snd_hda_preset_hdmi[] = { | 3306 | static const struct hda_codec_preset snd_hda_preset_hdmi[] = { |
@@ -3373,6 +3364,8 @@ static const struct hda_codec_preset snd_hda_preset_hdmi[] = { | |||
3373 | { .id = 0x80862882, .name = "Valleyview2 HDMI", .patch = patch_generic_hdmi }, | 3364 | { .id = 0x80862882, .name = "Valleyview2 HDMI", .patch = patch_generic_hdmi }, |
3374 | { .id = 0x80862883, .name = "Braswell HDMI", .patch = patch_generic_hdmi }, | 3365 | { .id = 0x80862883, .name = "Braswell HDMI", .patch = patch_generic_hdmi }, |
3375 | { .id = 0x808629fb, .name = "Crestline HDMI", .patch = patch_generic_hdmi }, | 3366 | { .id = 0x808629fb, .name = "Crestline HDMI", .patch = patch_generic_hdmi }, |
3367 | /* special ID for generic HDMI */ | ||
3368 | { .id = HDA_CODEC_ID_GENERIC_HDMI, .patch = patch_generic_hdmi }, | ||
3376 | {} /* terminator */ | 3369 | {} /* terminator */ |
3377 | }; | 3370 | }; |
3378 | 3371 | ||
@@ -3442,20 +3435,8 @@ MODULE_ALIAS("snd-hda-codec-intelhdmi"); | |||
3442 | MODULE_ALIAS("snd-hda-codec-nvhdmi"); | 3435 | MODULE_ALIAS("snd-hda-codec-nvhdmi"); |
3443 | MODULE_ALIAS("snd-hda-codec-atihdmi"); | 3436 | MODULE_ALIAS("snd-hda-codec-atihdmi"); |
3444 | 3437 | ||
3445 | static struct hda_codec_preset_list intel_list = { | 3438 | static struct hda_codec_driver hdmi_driver = { |
3446 | .preset = snd_hda_preset_hdmi, | 3439 | .preset = snd_hda_preset_hdmi, |
3447 | .owner = THIS_MODULE, | ||
3448 | }; | 3440 | }; |
3449 | 3441 | ||
3450 | static int __init patch_hdmi_init(void) | 3442 | module_hda_codec_driver(hdmi_driver); |
3451 | { | ||
3452 | return snd_hda_add_codec_preset(&intel_list); | ||
3453 | } | ||
3454 | |||
3455 | static void __exit patch_hdmi_exit(void) | ||
3456 | { | ||
3457 | snd_hda_delete_codec_preset(&intel_list); | ||
3458 | } | ||
3459 | |||
3460 | module_init(patch_hdmi_init) | ||
3461 | module_exit(patch_hdmi_exit) | ||
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index b2b24a8b3dac..70808f92276a 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
@@ -6514,20 +6514,8 @@ MODULE_ALIAS("snd-hda-codec-id:10ec*"); | |||
6514 | MODULE_LICENSE("GPL"); | 6514 | MODULE_LICENSE("GPL"); |
6515 | MODULE_DESCRIPTION("Realtek HD-audio codec"); | 6515 | MODULE_DESCRIPTION("Realtek HD-audio codec"); |
6516 | 6516 | ||
6517 | static struct hda_codec_preset_list realtek_list = { | 6517 | static struct hda_codec_driver realtek_driver = { |
6518 | .preset = snd_hda_preset_realtek, | 6518 | .preset = snd_hda_preset_realtek, |
6519 | .owner = THIS_MODULE, | ||
6520 | }; | 6519 | }; |
6521 | 6520 | ||
6522 | static int __init patch_realtek_init(void) | 6521 | module_hda_codec_driver(realtek_driver); |
6523 | { | ||
6524 | return snd_hda_add_codec_preset(&realtek_list); | ||
6525 | } | ||
6526 | |||
6527 | static void __exit patch_realtek_exit(void) | ||
6528 | { | ||
6529 | snd_hda_delete_codec_preset(&realtek_list); | ||
6530 | } | ||
6531 | |||
6532 | module_init(patch_realtek_init) | ||
6533 | module_exit(patch_realtek_exit) | ||
diff --git a/sound/pci/hda/patch_si3054.c b/sound/pci/hda/patch_si3054.c index 3208ad69583e..38a477333321 100644 --- a/sound/pci/hda/patch_si3054.c +++ b/sound/pci/hda/patch_si3054.c | |||
@@ -319,20 +319,8 @@ MODULE_ALIAS("snd-hda-codec-id:18540018"); | |||
319 | MODULE_LICENSE("GPL"); | 319 | MODULE_LICENSE("GPL"); |
320 | MODULE_DESCRIPTION("Si3054 HD-audio modem codec"); | 320 | MODULE_DESCRIPTION("Si3054 HD-audio modem codec"); |
321 | 321 | ||
322 | static struct hda_codec_preset_list si3054_list = { | 322 | static struct hda_codec_driver si3054_driver = { |
323 | .preset = snd_hda_preset_si3054, | 323 | .preset = snd_hda_preset_si3054, |
324 | .owner = THIS_MODULE, | ||
325 | }; | 324 | }; |
326 | 325 | ||
327 | static int __init patch_si3054_init(void) | 326 | module_hda_codec_driver(si3054_driver); |
328 | { | ||
329 | return snd_hda_add_codec_preset(&si3054_list); | ||
330 | } | ||
331 | |||
332 | static void __exit patch_si3054_exit(void) | ||
333 | { | ||
334 | snd_hda_delete_codec_preset(&si3054_list); | ||
335 | } | ||
336 | |||
337 | module_init(patch_si3054_init) | ||
338 | module_exit(patch_si3054_exit) | ||
diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c index 87eff3173ce9..6a2163056216 100644 --- a/sound/pci/hda/patch_sigmatel.c +++ b/sound/pci/hda/patch_sigmatel.c | |||
@@ -5091,20 +5091,8 @@ MODULE_ALIAS("snd-hda-codec-id:111d*"); | |||
5091 | MODULE_LICENSE("GPL"); | 5091 | MODULE_LICENSE("GPL"); |
5092 | MODULE_DESCRIPTION("IDT/Sigmatel HD-audio codec"); | 5092 | MODULE_DESCRIPTION("IDT/Sigmatel HD-audio codec"); |
5093 | 5093 | ||
5094 | static struct hda_codec_preset_list sigmatel_list = { | 5094 | static struct hda_codec_driver sigmatel_driver = { |
5095 | .preset = snd_hda_preset_sigmatel, | 5095 | .preset = snd_hda_preset_sigmatel, |
5096 | .owner = THIS_MODULE, | ||
5097 | }; | 5096 | }; |
5098 | 5097 | ||
5099 | static int __init patch_sigmatel_init(void) | 5098 | module_hda_codec_driver(sigmatel_driver); |
5100 | { | ||
5101 | return snd_hda_add_codec_preset(&sigmatel_list); | ||
5102 | } | ||
5103 | |||
5104 | static void __exit patch_sigmatel_exit(void) | ||
5105 | { | ||
5106 | snd_hda_delete_codec_preset(&sigmatel_list); | ||
5107 | } | ||
5108 | |||
5109 | module_init(patch_sigmatel_init) | ||
5110 | module_exit(patch_sigmatel_exit) | ||
diff --git a/sound/pci/hda/patch_via.c b/sound/pci/hda/patch_via.c index 3de6d3d779c9..2045f33b1ace 100644 --- a/sound/pci/hda/patch_via.c +++ b/sound/pci/hda/patch_via.c | |||
@@ -1884,23 +1884,11 @@ static const struct hda_codec_preset snd_hda_preset_via[] = { | |||
1884 | 1884 | ||
1885 | MODULE_ALIAS("snd-hda-codec-id:1106*"); | 1885 | MODULE_ALIAS("snd-hda-codec-id:1106*"); |
1886 | 1886 | ||
1887 | static struct hda_codec_preset_list via_list = { | 1887 | static struct hda_codec_driver via_driver = { |
1888 | .preset = snd_hda_preset_via, | 1888 | .preset = snd_hda_preset_via, |
1889 | .owner = THIS_MODULE, | ||
1890 | }; | 1889 | }; |
1891 | 1890 | ||
1892 | MODULE_LICENSE("GPL"); | 1891 | MODULE_LICENSE("GPL"); |
1893 | MODULE_DESCRIPTION("VIA HD-audio codec"); | 1892 | MODULE_DESCRIPTION("VIA HD-audio codec"); |
1894 | 1893 | ||
1895 | static int __init patch_via_init(void) | 1894 | module_hda_codec_driver(via_driver); |
1896 | { | ||
1897 | return snd_hda_add_codec_preset(&via_list); | ||
1898 | } | ||
1899 | |||
1900 | static void __exit patch_via_exit(void) | ||
1901 | { | ||
1902 | snd_hda_delete_codec_preset(&via_list); | ||
1903 | } | ||
1904 | |||
1905 | module_init(patch_via_init) | ||
1906 | module_exit(patch_via_exit) | ||