xref: /linux/sound/hda/common/bind.c (revision 05be28fe8521f183f945d052d5019197e5934f0e)
1*05be28feSTakashi Iwai // SPDX-License-Identifier: GPL-2.0-only
2*05be28feSTakashi Iwai /*
3*05be28feSTakashi Iwai  * HD-audio codec driver binding
4*05be28feSTakashi Iwai  * Copyright (c) Takashi Iwai <tiwai@suse.de>
5*05be28feSTakashi Iwai  */
6*05be28feSTakashi Iwai 
7*05be28feSTakashi Iwai #include <linux/init.h>
8*05be28feSTakashi Iwai #include <linux/slab.h>
9*05be28feSTakashi Iwai #include <linux/mutex.h>
10*05be28feSTakashi Iwai #include <linux/module.h>
11*05be28feSTakashi Iwai #include <linux/export.h>
12*05be28feSTakashi Iwai #include <linux/pm.h>
13*05be28feSTakashi Iwai #include <sound/core.h>
14*05be28feSTakashi Iwai #include <sound/hda_codec.h>
15*05be28feSTakashi Iwai #include "hda_local.h"
16*05be28feSTakashi Iwai #include "hda_jack.h"
17*05be28feSTakashi Iwai 
18*05be28feSTakashi Iwai /*
19*05be28feSTakashi Iwai  * find a matching codec id
20*05be28feSTakashi Iwai  */
21*05be28feSTakashi Iwai static int hda_codec_match(struct hdac_device *dev, const struct hdac_driver *drv)
22*05be28feSTakashi Iwai {
23*05be28feSTakashi Iwai 	struct hda_codec *codec = container_of(dev, struct hda_codec, core);
24*05be28feSTakashi Iwai 	const struct hda_codec_driver *driver =
25*05be28feSTakashi Iwai 		container_of(drv, struct hda_codec_driver, core);
26*05be28feSTakashi Iwai 	const struct hda_device_id *list;
27*05be28feSTakashi Iwai 	/* check probe_id instead of vendor_id if set */
28*05be28feSTakashi Iwai 	u32 id = codec->probe_id ? codec->probe_id : codec->core.vendor_id;
29*05be28feSTakashi Iwai 	u32 rev_id = codec->core.revision_id;
30*05be28feSTakashi Iwai 
31*05be28feSTakashi Iwai 	for (list = driver->id; list->vendor_id; list++) {
32*05be28feSTakashi Iwai 		if (list->vendor_id == id &&
33*05be28feSTakashi Iwai 		    (!list->rev_id || list->rev_id == rev_id)) {
34*05be28feSTakashi Iwai 			codec->preset = list;
35*05be28feSTakashi Iwai 			return 1;
36*05be28feSTakashi Iwai 		}
37*05be28feSTakashi Iwai 	}
38*05be28feSTakashi Iwai 	return 0;
39*05be28feSTakashi Iwai }
40*05be28feSTakashi Iwai 
41*05be28feSTakashi Iwai /* process an unsolicited event */
42*05be28feSTakashi Iwai static void hda_codec_unsol_event(struct hdac_device *dev, unsigned int ev)
43*05be28feSTakashi Iwai {
44*05be28feSTakashi Iwai 	struct hda_codec *codec = container_of(dev, struct hda_codec, core);
45*05be28feSTakashi Iwai 
46*05be28feSTakashi Iwai 	/* ignore unsol events during shutdown */
47*05be28feSTakashi Iwai 	if (codec->card->shutdown || codec->bus->shutdown)
48*05be28feSTakashi Iwai 		return;
49*05be28feSTakashi Iwai 
50*05be28feSTakashi Iwai 	/* ignore unsol events during system suspend/resume */
51*05be28feSTakashi Iwai 	if (codec->core.dev.power.power_state.event != PM_EVENT_ON)
52*05be28feSTakashi Iwai 		return;
53*05be28feSTakashi Iwai 
54*05be28feSTakashi Iwai 	if (codec->patch_ops.unsol_event)
55*05be28feSTakashi Iwai 		codec->patch_ops.unsol_event(codec, ev);
56*05be28feSTakashi Iwai }
57*05be28feSTakashi Iwai 
58*05be28feSTakashi Iwai /**
59*05be28feSTakashi Iwai  * snd_hda_codec_set_name - set the codec name
60*05be28feSTakashi Iwai  * @codec: the HDA codec
61*05be28feSTakashi Iwai  * @name: name string to set
62*05be28feSTakashi Iwai  */
63*05be28feSTakashi Iwai int snd_hda_codec_set_name(struct hda_codec *codec, const char *name)
64*05be28feSTakashi Iwai {
65*05be28feSTakashi Iwai 	int err;
66*05be28feSTakashi Iwai 
67*05be28feSTakashi Iwai 	if (!name)
68*05be28feSTakashi Iwai 		return 0;
69*05be28feSTakashi Iwai 	err = snd_hdac_device_set_chip_name(&codec->core, name);
70*05be28feSTakashi Iwai 	if (err < 0)
71*05be28feSTakashi Iwai 		return err;
72*05be28feSTakashi Iwai 
73*05be28feSTakashi Iwai 	/* update the mixer name */
74*05be28feSTakashi Iwai 	if (!*codec->card->mixername ||
75*05be28feSTakashi Iwai 	    codec->bus->mixer_assigned >= codec->core.addr) {
76*05be28feSTakashi Iwai 		snprintf(codec->card->mixername,
77*05be28feSTakashi Iwai 			 sizeof(codec->card->mixername), "%s %s",
78*05be28feSTakashi Iwai 			 codec->core.vendor_name, codec->core.chip_name);
79*05be28feSTakashi Iwai 		codec->bus->mixer_assigned = codec->core.addr;
80*05be28feSTakashi Iwai 	}
81*05be28feSTakashi Iwai 
82*05be28feSTakashi Iwai 	return 0;
83*05be28feSTakashi Iwai }
84*05be28feSTakashi Iwai EXPORT_SYMBOL_GPL(snd_hda_codec_set_name);
85*05be28feSTakashi Iwai 
86*05be28feSTakashi Iwai static int hda_codec_driver_probe(struct device *dev)
87*05be28feSTakashi Iwai {
88*05be28feSTakashi Iwai 	struct hda_codec *codec = dev_to_hda_codec(dev);
89*05be28feSTakashi Iwai 	struct module *owner = dev->driver->owner;
90*05be28feSTakashi Iwai 	hda_codec_patch_t patch;
91*05be28feSTakashi Iwai 	int err;
92*05be28feSTakashi Iwai 
93*05be28feSTakashi Iwai 	if (codec->bus->core.ext_ops) {
94*05be28feSTakashi Iwai 		if (WARN_ON(!codec->bus->core.ext_ops->hdev_attach))
95*05be28feSTakashi Iwai 			return -EINVAL;
96*05be28feSTakashi Iwai 		return codec->bus->core.ext_ops->hdev_attach(&codec->core);
97*05be28feSTakashi Iwai 	}
98*05be28feSTakashi Iwai 
99*05be28feSTakashi Iwai 	if (WARN_ON(!codec->preset))
100*05be28feSTakashi Iwai 		return -EINVAL;
101*05be28feSTakashi Iwai 
102*05be28feSTakashi Iwai 	err = snd_hda_codec_set_name(codec, codec->preset->name);
103*05be28feSTakashi Iwai 	if (err < 0)
104*05be28feSTakashi Iwai 		goto error;
105*05be28feSTakashi Iwai 	err = snd_hdac_regmap_init(&codec->core);
106*05be28feSTakashi Iwai 	if (err < 0)
107*05be28feSTakashi Iwai 		goto error;
108*05be28feSTakashi Iwai 
109*05be28feSTakashi Iwai 	if (!try_module_get(owner)) {
110*05be28feSTakashi Iwai 		err = -EINVAL;
111*05be28feSTakashi Iwai 		goto error;
112*05be28feSTakashi Iwai 	}
113*05be28feSTakashi Iwai 
114*05be28feSTakashi Iwai 	patch = (hda_codec_patch_t)codec->preset->driver_data;
115*05be28feSTakashi Iwai 	if (patch) {
116*05be28feSTakashi Iwai 		err = patch(codec);
117*05be28feSTakashi Iwai 		if (err < 0)
118*05be28feSTakashi Iwai 			goto error_module_put;
119*05be28feSTakashi Iwai 	}
120*05be28feSTakashi Iwai 
121*05be28feSTakashi Iwai 	err = snd_hda_codec_build_pcms(codec);
122*05be28feSTakashi Iwai 	if (err < 0)
123*05be28feSTakashi Iwai 		goto error_module;
124*05be28feSTakashi Iwai 	err = snd_hda_codec_build_controls(codec);
125*05be28feSTakashi Iwai 	if (err < 0)
126*05be28feSTakashi Iwai 		goto error_module;
127*05be28feSTakashi Iwai 	/* only register after the bus probe finished; otherwise it's racy */
128*05be28feSTakashi Iwai 	if (!codec->bus->bus_probing && codec->card->registered) {
129*05be28feSTakashi Iwai 		err = snd_card_register(codec->card);
130*05be28feSTakashi Iwai 		if (err < 0)
131*05be28feSTakashi Iwai 			goto error_module;
132*05be28feSTakashi Iwai 		snd_hda_codec_register(codec);
133*05be28feSTakashi Iwai 	}
134*05be28feSTakashi Iwai 
135*05be28feSTakashi Iwai 	codec->core.lazy_cache = true;
136*05be28feSTakashi Iwai 	return 0;
137*05be28feSTakashi Iwai 
138*05be28feSTakashi Iwai  error_module:
139*05be28feSTakashi Iwai 	if (codec->patch_ops.free)
140*05be28feSTakashi Iwai 		codec->patch_ops.free(codec);
141*05be28feSTakashi Iwai  error_module_put:
142*05be28feSTakashi Iwai 	module_put(owner);
143*05be28feSTakashi Iwai 
144*05be28feSTakashi Iwai  error:
145*05be28feSTakashi Iwai 	snd_hda_codec_cleanup_for_unbind(codec);
146*05be28feSTakashi Iwai 	codec->preset = NULL;
147*05be28feSTakashi Iwai 	return err;
148*05be28feSTakashi Iwai }
149*05be28feSTakashi Iwai 
150*05be28feSTakashi Iwai static int hda_codec_driver_remove(struct device *dev)
151*05be28feSTakashi Iwai {
152*05be28feSTakashi Iwai 	struct hda_codec *codec = dev_to_hda_codec(dev);
153*05be28feSTakashi Iwai 
154*05be28feSTakashi Iwai 	if (codec->bus->core.ext_ops) {
155*05be28feSTakashi Iwai 		if (WARN_ON(!codec->bus->core.ext_ops->hdev_detach))
156*05be28feSTakashi Iwai 			return -EINVAL;
157*05be28feSTakashi Iwai 		return codec->bus->core.ext_ops->hdev_detach(&codec->core);
158*05be28feSTakashi Iwai 	}
159*05be28feSTakashi Iwai 
160*05be28feSTakashi Iwai 	snd_hda_codec_disconnect_pcms(codec);
161*05be28feSTakashi Iwai 	snd_hda_jack_tbl_disconnect(codec);
162*05be28feSTakashi Iwai 	if (!refcount_dec_and_test(&codec->pcm_ref))
163*05be28feSTakashi Iwai 		wait_event(codec->remove_sleep, !refcount_read(&codec->pcm_ref));
164*05be28feSTakashi Iwai 	snd_power_sync_ref(codec->bus->card);
165*05be28feSTakashi Iwai 
166*05be28feSTakashi Iwai 	if (codec->patch_ops.free)
167*05be28feSTakashi Iwai 		codec->patch_ops.free(codec);
168*05be28feSTakashi Iwai 	snd_hda_codec_cleanup_for_unbind(codec);
169*05be28feSTakashi Iwai 	codec->preset = NULL;
170*05be28feSTakashi Iwai 	module_put(dev->driver->owner);
171*05be28feSTakashi Iwai 	return 0;
172*05be28feSTakashi Iwai }
173*05be28feSTakashi Iwai 
174*05be28feSTakashi Iwai static void hda_codec_driver_shutdown(struct device *dev)
175*05be28feSTakashi Iwai {
176*05be28feSTakashi Iwai 	snd_hda_codec_shutdown(dev_to_hda_codec(dev));
177*05be28feSTakashi Iwai }
178*05be28feSTakashi Iwai 
179*05be28feSTakashi Iwai int __hda_codec_driver_register(struct hda_codec_driver *drv, const char *name,
180*05be28feSTakashi Iwai 			       struct module *owner)
181*05be28feSTakashi Iwai {
182*05be28feSTakashi Iwai 	drv->core.driver.name = name;
183*05be28feSTakashi Iwai 	drv->core.driver.owner = owner;
184*05be28feSTakashi Iwai 	drv->core.driver.bus = &snd_hda_bus_type;
185*05be28feSTakashi Iwai 	drv->core.driver.probe = hda_codec_driver_probe;
186*05be28feSTakashi Iwai 	drv->core.driver.remove = hda_codec_driver_remove;
187*05be28feSTakashi Iwai 	drv->core.driver.shutdown = hda_codec_driver_shutdown;
188*05be28feSTakashi Iwai 	drv->core.driver.pm = pm_ptr(&hda_codec_driver_pm);
189*05be28feSTakashi Iwai 	drv->core.type = HDA_DEV_LEGACY;
190*05be28feSTakashi Iwai 	drv->core.match = hda_codec_match;
191*05be28feSTakashi Iwai 	drv->core.unsol_event = hda_codec_unsol_event;
192*05be28feSTakashi Iwai 	return driver_register(&drv->core.driver);
193*05be28feSTakashi Iwai }
194*05be28feSTakashi Iwai EXPORT_SYMBOL_GPL(__hda_codec_driver_register);
195*05be28feSTakashi Iwai 
196*05be28feSTakashi Iwai void hda_codec_driver_unregister(struct hda_codec_driver *drv)
197*05be28feSTakashi Iwai {
198*05be28feSTakashi Iwai 	driver_unregister(&drv->core.driver);
199*05be28feSTakashi Iwai }
200*05be28feSTakashi Iwai EXPORT_SYMBOL_GPL(hda_codec_driver_unregister);
201*05be28feSTakashi Iwai 
202*05be28feSTakashi Iwai static inline bool codec_probed(struct hda_codec *codec)
203*05be28feSTakashi Iwai {
204*05be28feSTakashi Iwai 	return device_attach(hda_codec_dev(codec)) > 0 && codec->preset;
205*05be28feSTakashi Iwai }
206*05be28feSTakashi Iwai 
207*05be28feSTakashi Iwai /* try to auto-load codec module */
208*05be28feSTakashi Iwai static void request_codec_module(struct hda_codec *codec)
209*05be28feSTakashi Iwai {
210*05be28feSTakashi Iwai #ifdef MODULE
211*05be28feSTakashi Iwai 	char modalias[32];
212*05be28feSTakashi Iwai 	const char *mod = NULL;
213*05be28feSTakashi Iwai 
214*05be28feSTakashi Iwai 	switch (codec->probe_id) {
215*05be28feSTakashi Iwai 	case HDA_CODEC_ID_GENERIC_HDMI:
216*05be28feSTakashi Iwai #if IS_MODULE(CONFIG_SND_HDA_CODEC_HDMI)
217*05be28feSTakashi Iwai 		mod = "snd-hda-codec-hdmi";
218*05be28feSTakashi Iwai #endif
219*05be28feSTakashi Iwai 		break;
220*05be28feSTakashi Iwai 	case HDA_CODEC_ID_GENERIC:
221*05be28feSTakashi Iwai #if IS_MODULE(CONFIG_SND_HDA_GENERIC)
222*05be28feSTakashi Iwai 		mod = "snd-hda-codec-generic";
223*05be28feSTakashi Iwai #endif
224*05be28feSTakashi Iwai 		break;
225*05be28feSTakashi Iwai 	default:
226*05be28feSTakashi Iwai 		snd_hdac_codec_modalias(&codec->core, modalias, sizeof(modalias));
227*05be28feSTakashi Iwai 		mod = modalias;
228*05be28feSTakashi Iwai 		break;
229*05be28feSTakashi Iwai 	}
230*05be28feSTakashi Iwai 
231*05be28feSTakashi Iwai 	if (mod)
232*05be28feSTakashi Iwai 		request_module(mod);
233*05be28feSTakashi Iwai #endif /* MODULE */
234*05be28feSTakashi Iwai }
235*05be28feSTakashi Iwai 
236*05be28feSTakashi Iwai /* try to auto-load and bind the codec module */
237*05be28feSTakashi Iwai static void codec_bind_module(struct hda_codec *codec)
238*05be28feSTakashi Iwai {
239*05be28feSTakashi Iwai #ifdef MODULE
240*05be28feSTakashi Iwai 	request_codec_module(codec);
241*05be28feSTakashi Iwai 	if (codec_probed(codec))
242*05be28feSTakashi Iwai 		return;
243*05be28feSTakashi Iwai #endif
244*05be28feSTakashi Iwai }
245*05be28feSTakashi Iwai 
246*05be28feSTakashi Iwai #if IS_ENABLED(CONFIG_SND_HDA_CODEC_HDMI)
247*05be28feSTakashi Iwai /* if all audio out widgets are digital, let's assume the codec as a HDMI/DP */
248*05be28feSTakashi Iwai static bool is_likely_hdmi_codec(struct hda_codec *codec)
249*05be28feSTakashi Iwai {
250*05be28feSTakashi Iwai 	hda_nid_t nid;
251*05be28feSTakashi Iwai 
252*05be28feSTakashi Iwai 	/*
253*05be28feSTakashi Iwai 	 * For ASoC users, if snd_hda_hdmi_codec module is denylisted and any
254*05be28feSTakashi Iwai 	 * event causes i915 enumeration to fail, ->wcaps remains uninitialized.
255*05be28feSTakashi Iwai 	 */
256*05be28feSTakashi Iwai 	if (!codec->wcaps)
257*05be28feSTakashi Iwai 		return true;
258*05be28feSTakashi Iwai 
259*05be28feSTakashi Iwai 	for_each_hda_codec_node(nid, codec) {
260*05be28feSTakashi Iwai 		unsigned int wcaps = get_wcaps(codec, nid);
261*05be28feSTakashi Iwai 		switch (get_wcaps_type(wcaps)) {
262*05be28feSTakashi Iwai 		case AC_WID_AUD_IN:
263*05be28feSTakashi Iwai 			return false; /* HDMI parser supports only HDMI out */
264*05be28feSTakashi Iwai 		case AC_WID_AUD_OUT:
265*05be28feSTakashi Iwai 			if (!(wcaps & AC_WCAP_DIGITAL))
266*05be28feSTakashi Iwai 				return false;
267*05be28feSTakashi Iwai 			break;
268*05be28feSTakashi Iwai 		}
269*05be28feSTakashi Iwai 	}
270*05be28feSTakashi Iwai 	return true;
271*05be28feSTakashi Iwai }
272*05be28feSTakashi Iwai #else
273*05be28feSTakashi Iwai /* no HDMI codec parser support */
274*05be28feSTakashi Iwai #define is_likely_hdmi_codec(codec)	false
275*05be28feSTakashi Iwai #endif /* CONFIG_SND_HDA_CODEC_HDMI */
276*05be28feSTakashi Iwai 
277*05be28feSTakashi Iwai static int codec_bind_generic(struct hda_codec *codec)
278*05be28feSTakashi Iwai {
279*05be28feSTakashi Iwai 	if (codec->probe_id)
280*05be28feSTakashi Iwai 		return -ENODEV;
281*05be28feSTakashi Iwai 
282*05be28feSTakashi Iwai 	if (is_likely_hdmi_codec(codec)) {
283*05be28feSTakashi Iwai 		codec->probe_id = HDA_CODEC_ID_GENERIC_HDMI;
284*05be28feSTakashi Iwai 		request_codec_module(codec);
285*05be28feSTakashi Iwai 		if (codec_probed(codec))
286*05be28feSTakashi Iwai 			return 0;
287*05be28feSTakashi Iwai 	}
288*05be28feSTakashi Iwai 
289*05be28feSTakashi Iwai 	codec->probe_id = HDA_CODEC_ID_GENERIC;
290*05be28feSTakashi Iwai 	request_codec_module(codec);
291*05be28feSTakashi Iwai 	if (codec_probed(codec))
292*05be28feSTakashi Iwai 		return 0;
293*05be28feSTakashi Iwai 	return -ENODEV;
294*05be28feSTakashi Iwai }
295*05be28feSTakashi Iwai 
296*05be28feSTakashi Iwai #if IS_ENABLED(CONFIG_SND_HDA_GENERIC)
297*05be28feSTakashi Iwai #define is_generic_config(codec) \
298*05be28feSTakashi Iwai 	(codec->modelname && !strcmp(codec->modelname, "generic"))
299*05be28feSTakashi Iwai #else
300*05be28feSTakashi Iwai #define is_generic_config(codec)	0
301*05be28feSTakashi Iwai #endif
302*05be28feSTakashi Iwai 
303*05be28feSTakashi Iwai /**
304*05be28feSTakashi Iwai  * snd_hda_codec_configure - (Re-)configure the HD-audio codec
305*05be28feSTakashi Iwai  * @codec: the HDA codec
306*05be28feSTakashi Iwai  *
307*05be28feSTakashi Iwai  * Start parsing of the given codec tree and (re-)initialize the whole
308*05be28feSTakashi Iwai  * patch instance.
309*05be28feSTakashi Iwai  *
310*05be28feSTakashi Iwai  * Returns 0 if successful or a negative error code.
311*05be28feSTakashi Iwai  */
312*05be28feSTakashi Iwai int snd_hda_codec_configure(struct hda_codec *codec)
313*05be28feSTakashi Iwai {
314*05be28feSTakashi Iwai 	int err;
315*05be28feSTakashi Iwai 
316*05be28feSTakashi Iwai 	if (codec->configured)
317*05be28feSTakashi Iwai 		return 0;
318*05be28feSTakashi Iwai 
319*05be28feSTakashi Iwai 	if (is_generic_config(codec))
320*05be28feSTakashi Iwai 		codec->probe_id = HDA_CODEC_ID_GENERIC;
321*05be28feSTakashi Iwai 	else
322*05be28feSTakashi Iwai 		codec->probe_id = 0;
323*05be28feSTakashi Iwai 
324*05be28feSTakashi Iwai 	if (!device_is_registered(&codec->core.dev)) {
325*05be28feSTakashi Iwai 		err = snd_hdac_device_register(&codec->core);
326*05be28feSTakashi Iwai 		if (err < 0)
327*05be28feSTakashi Iwai 			return err;
328*05be28feSTakashi Iwai 	}
329*05be28feSTakashi Iwai 
330*05be28feSTakashi Iwai 	if (!codec->preset)
331*05be28feSTakashi Iwai 		codec_bind_module(codec);
332*05be28feSTakashi Iwai 	if (!codec->preset) {
333*05be28feSTakashi Iwai 		err = codec_bind_generic(codec);
334*05be28feSTakashi Iwai 		if (err < 0) {
335*05be28feSTakashi Iwai 			codec_dbg(codec, "Unable to bind the codec\n");
336*05be28feSTakashi Iwai 			return err;
337*05be28feSTakashi Iwai 		}
338*05be28feSTakashi Iwai 	}
339*05be28feSTakashi Iwai 
340*05be28feSTakashi Iwai 	codec->configured = 1;
341*05be28feSTakashi Iwai 	return 0;
342*05be28feSTakashi Iwai }
343*05be28feSTakashi Iwai EXPORT_SYMBOL_GPL(snd_hda_codec_configure);
344