/* ignore unsol events during shutdown */ if (codec->card->shutdown || codec->bus->shutdown) return;
/* ignore unsol events during system suspend/resume */ if (codec->core.dev.power.power_state.event != PM_EVENT_ON) return;
if (driver->ops->unsol_event)
driver->ops->unsol_event(codec, ev);
}
/** * snd_hda_codec_set_name - set the codec name * @codec: the HDA codec * @name: name string to set
*/ int snd_hda_codec_set_name(struct hda_codec *codec, constchar *name)
{ int err;
if (!name) return 0;
err = snd_hdac_device_set_chip_name(&codec->core, name); if (err < 0) return err;
/* update the mixer name */ if (!*codec->card->mixername ||
codec->bus->mixer_assigned >= codec->core.addr) {
snprintf(codec->card->mixername, sizeof(codec->card->mixername), "%s %s",
codec->core.vendor_name, codec->core.chip_name);
codec->bus->mixer_assigned = codec->core.addr;
}
if (codec->bus->core.ext_ops) { if (WARN_ON(!codec->bus->core.ext_ops->hdev_attach)) return -EINVAL; return codec->bus->core.ext_ops->hdev_attach(&codec->core);
}
if (WARN_ON(!codec->preset)) return -EINVAL;
err = snd_hda_codec_set_name(codec, codec->preset->name); if (err < 0) goto error;
err = snd_hdac_regmap_init(&codec->core); if (err < 0) goto error;
if (!try_module_get(owner)) {
err = -EINVAL; goto error;
}
if (codec->bus->core.ext_ops) { if (WARN_ON(!codec->bus->core.ext_ops->hdev_detach)) return -EINVAL; return codec->bus->core.ext_ops->hdev_detach(&codec->core);
}
snd_hda_codec_disconnect_pcms(codec);
snd_hda_jack_tbl_disconnect(codec); if (!refcount_dec_and_test(&codec->pcm_ref))
wait_event(codec->remove_sleep, !refcount_read(&codec->pcm_ref));
snd_power_sync_ref(codec->bus->card);
switch (codec->probe_id) { case HDA_CODEC_ID_GENERIC_HDMI: #if IS_MODULE(CONFIG_SND_HDA_CODEC_HDMI)
mod = "snd-hda-codec-hdmi"; #endif break; case HDA_CODEC_ID_GENERIC: #if IS_MODULE(CONFIG_SND_HDA_GENERIC)
mod = "snd-hda-codec-generic"; #endif break; default:
snd_hdac_codec_modalias(&codec->core, modalias, sizeof(modalias));
mod = modalias; break;
}
if (mod)
request_module(mod); #endif/* MODULE */
}
/* try to auto-load and bind the codec module */ staticvoid codec_bind_module(struct hda_codec *codec)
{ #ifdef MODULE
request_codec_module(codec); if (codec_probed(codec)) return; #endif
}
#if IS_ENABLED(CONFIG_SND_HDA_CODEC_HDMI) /* if all audio out widgets are digital, let's assume the codec as a HDMI/DP */ staticbool is_likely_hdmi_codec(struct hda_codec *codec)
{
hda_nid_t nid;
/* * For ASoC users, if snd_hda_hdmi_codec module is denylisted and any * event causes i915 enumeration to fail, ->wcaps remains uninitialized.
*/ if (!codec->wcaps) returntrue;
for_each_hda_codec_node(nid, codec) { unsignedint wcaps = get_wcaps(codec, nid); switch (get_wcaps_type(wcaps)) { case AC_WID_AUD_IN: returnfalse; /* HDMI parser supports only HDMI out */ case AC_WID_AUD_OUT: if (!(wcaps & AC_WCAP_DIGITAL)) returnfalse; break;
}
} returntrue;
} #else /* no HDMI codec parser support */ #define is_likely_hdmi_codec(codec) false #endif/* CONFIG_SND_HDA_CODEC_HDMI */
staticint codec_bind_generic(struct hda_codec *codec)
{ if (codec->probe_id) return -ENODEV;
if (is_likely_hdmi_codec(codec)) {
codec->probe_id = HDA_CODEC_ID_GENERIC_HDMI;
request_codec_module(codec); if (codec_probed(codec)) return 0;
}
/** * snd_hda_codec_configure - (Re-)configure the HD-audio codec * @codec: the HDA codec * * Start parsing of the given codec tree and (re-)initialize the whole * codec driver binding. * * Returns 0 if successful or a negative error code.
*/ int snd_hda_codec_configure(struct hda_codec *codec)
{ int err;
if (codec->configured) return 0;
if (is_generic_config(codec))
codec->probe_id = HDA_CODEC_ID_GENERIC; else
codec->probe_id = 0;
if (!device_is_registered(&codec->core.dev)) {
err = snd_hdac_device_register(&codec->core); if (err < 0) return err;
}
if (!codec->preset)
codec_bind_module(codec); if (!codec->preset) {
err = codec_bind_generic(codec); if (err < 0) {
codec_dbg(codec, "Unable to bind the codec\n"); return err;
}
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.