Lines Matching +full:core +full:- +full:module
1 // SPDX-License-Identifier: GPL-2.0-only
3 * HD-audio codec driver binding
10 #include <linux/module.h>
14 #include <sound/core.h>
23 struct hda_codec *codec = container_of(dev, struct hda_codec, core); in hda_codec_match()
25 container_of(drv, struct hda_codec_driver, core); in hda_codec_match()
28 u32 id = codec->probe_id ? codec->probe_id : codec->core.vendor_id; in hda_codec_match()
29 u32 rev_id = codec->core.revision_id; in hda_codec_match()
31 for (list = driver->id; list->vendor_id; list++) { in hda_codec_match()
32 if (list->vendor_id == id && in hda_codec_match()
33 (!list->rev_id || list->rev_id == rev_id)) { in hda_codec_match()
34 codec->preset = list; in hda_codec_match()
44 struct hda_codec *codec = container_of(dev, struct hda_codec, core); in hda_codec_unsol_event()
47 if (codec->bus->shutdown) in hda_codec_unsol_event()
50 if (codec->patch_ops.unsol_event) in hda_codec_unsol_event()
51 codec->patch_ops.unsol_event(codec, ev); in hda_codec_unsol_event()
55 * snd_hda_codec_set_name - set the codec name
65 err = snd_hdac_device_set_chip_name(&codec->core, name); in snd_hda_codec_set_name()
70 if (!*codec->card->mixername || in snd_hda_codec_set_name()
71 codec->bus->mixer_assigned >= codec->core.addr) { in snd_hda_codec_set_name()
72 snprintf(codec->card->mixername, in snd_hda_codec_set_name()
73 sizeof(codec->card->mixername), "%s %s", in snd_hda_codec_set_name()
74 codec->core.vendor_name, codec->core.chip_name); in snd_hda_codec_set_name()
75 codec->bus->mixer_assigned = codec->core.addr; in snd_hda_codec_set_name()
85 struct module *owner = dev->driver->owner; in hda_codec_driver_probe()
89 if (codec->bus->core.ext_ops) { in hda_codec_driver_probe()
90 if (WARN_ON(!codec->bus->core.ext_ops->hdev_attach)) in hda_codec_driver_probe()
91 return -EINVAL; in hda_codec_driver_probe()
92 return codec->bus->core.ext_ops->hdev_attach(&codec->core); in hda_codec_driver_probe()
95 if (WARN_ON(!codec->preset)) in hda_codec_driver_probe()
96 return -EINVAL; in hda_codec_driver_probe()
98 err = snd_hda_codec_set_name(codec, codec->preset->name); in hda_codec_driver_probe()
101 err = snd_hdac_regmap_init(&codec->core); in hda_codec_driver_probe()
106 err = -EINVAL; in hda_codec_driver_probe()
110 patch = (hda_codec_patch_t)codec->preset->driver_data; in hda_codec_driver_probe()
124 if (!codec->bus->bus_probing && codec->card->registered) { in hda_codec_driver_probe()
125 err = snd_card_register(codec->card); in hda_codec_driver_probe()
131 codec->core.lazy_cache = true; in hda_codec_driver_probe()
135 if (codec->patch_ops.free) in hda_codec_driver_probe()
136 codec->patch_ops.free(codec); in hda_codec_driver_probe()
149 if (codec->bus->core.ext_ops) { in hda_codec_driver_remove()
150 if (WARN_ON(!codec->bus->core.ext_ops->hdev_detach)) in hda_codec_driver_remove()
151 return -EINVAL; in hda_codec_driver_remove()
152 return codec->bus->core.ext_ops->hdev_detach(&codec->core); in hda_codec_driver_remove()
155 if (codec->patch_ops.free) in hda_codec_driver_remove()
156 codec->patch_ops.free(codec); in hda_codec_driver_remove()
158 module_put(dev->driver->owner); in hda_codec_driver_remove()
166 if (!pm_runtime_suspended(dev) && codec->patch_ops.reboot_notify) in hda_codec_driver_shutdown()
167 codec->patch_ops.reboot_notify(codec); in hda_codec_driver_shutdown()
171 struct module *owner) in __hda_codec_driver_register()
173 drv->core.driver.name = name; in __hda_codec_driver_register()
174 drv->core.driver.owner = owner; in __hda_codec_driver_register()
175 drv->core.driver.bus = &snd_hda_bus_type; in __hda_codec_driver_register()
176 drv->core.driver.probe = hda_codec_driver_probe; in __hda_codec_driver_register()
177 drv->core.driver.remove = hda_codec_driver_remove; in __hda_codec_driver_register()
178 drv->core.driver.shutdown = hda_codec_driver_shutdown; in __hda_codec_driver_register()
179 drv->core.driver.pm = &hda_codec_driver_pm; in __hda_codec_driver_register()
180 drv->core.type = HDA_DEV_LEGACY; in __hda_codec_driver_register()
181 drv->core.match = hda_codec_match; in __hda_codec_driver_register()
182 drv->core.unsol_event = hda_codec_unsol_event; in __hda_codec_driver_register()
183 return driver_register(&drv->core.driver); in __hda_codec_driver_register()
189 driver_unregister(&drv->core.driver); in hda_codec_driver_unregister()
195 return device_attach(hda_codec_dev(codec)) > 0 && codec->preset; in codec_probed()
198 /* try to auto-load codec module */
201 #ifdef MODULE in request_codec_module()
205 switch (codec->probe_id) { in request_codec_module()
208 mod = "snd-hda-codec-hdmi"; in request_codec_module()
213 mod = "snd-hda-codec-generic"; in request_codec_module()
217 snd_hdac_codec_modalias(&codec->core, modalias, sizeof(modalias)); in request_codec_module()
224 #endif /* MODULE */ in request_codec_module()
227 /* try to auto-load and bind the codec module */
230 #ifdef MODULE in codec_bind_module()
263 if (codec->probe_id) in codec_bind_generic()
264 return -ENODEV; in codec_bind_generic()
267 codec->probe_id = HDA_CODEC_ID_GENERIC_HDMI; in codec_bind_generic()
273 codec->probe_id = HDA_CODEC_ID_GENERIC; in codec_bind_generic()
277 return -ENODEV; in codec_bind_generic()
282 (codec->modelname && !strcmp(codec->modelname, "generic"))
288 * snd_hda_codec_configure - (Re-)configure the HD-audio codec
291 * Start parsing of the given codec tree and (re-)initialize the whole
301 codec->probe_id = HDA_CODEC_ID_GENERIC; in snd_hda_codec_configure()
303 codec->probe_id = 0; in snd_hda_codec_configure()
305 err = snd_hdac_device_register(&codec->core); in snd_hda_codec_configure()
309 if (!codec->preset) in snd_hda_codec_configure()
311 if (!codec->preset) { in snd_hda_codec_configure()
322 snd_hdac_device_unregister(&codec->core); in snd_hda_codec_configure()