xref: /openbmc/linux/sound/soc/soc-component.c (revision 0035e256)
14ff1fef1SKuninori Morimoto // SPDX-License-Identifier: GPL-2.0
24ff1fef1SKuninori Morimoto //
34ff1fef1SKuninori Morimoto // soc-component.c
44ff1fef1SKuninori Morimoto //
54ff1fef1SKuninori Morimoto // Copyright (C) 2019 Renesas Electronics Corp.
64ff1fef1SKuninori Morimoto // Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
74ff1fef1SKuninori Morimoto //
84a81e8f3SKuninori Morimoto #include <linux/module.h>
94ff1fef1SKuninori Morimoto #include <sound/soc.h>
104ff1fef1SKuninori Morimoto 
114ff1fef1SKuninori Morimoto /**
124ff1fef1SKuninori Morimoto  * snd_soc_component_set_sysclk - configure COMPONENT system or master clock.
134ff1fef1SKuninori Morimoto  * @component: COMPONENT
144ff1fef1SKuninori Morimoto  * @clk_id: DAI specific clock ID
154ff1fef1SKuninori Morimoto  * @source: Source for the clock
164ff1fef1SKuninori Morimoto  * @freq: new clock frequency in Hz
174ff1fef1SKuninori Morimoto  * @dir: new clock direction - input/output.
184ff1fef1SKuninori Morimoto  *
194ff1fef1SKuninori Morimoto  * Configures the CODEC master (MCLK) or system (SYSCLK) clocking.
204ff1fef1SKuninori Morimoto  */
214ff1fef1SKuninori Morimoto int snd_soc_component_set_sysclk(struct snd_soc_component *component,
224ff1fef1SKuninori Morimoto 				 int clk_id, int source, unsigned int freq,
234ff1fef1SKuninori Morimoto 				 int dir)
244ff1fef1SKuninori Morimoto {
254ff1fef1SKuninori Morimoto 	if (component->driver->set_sysclk)
264ff1fef1SKuninori Morimoto 		return component->driver->set_sysclk(component, clk_id, source,
274ff1fef1SKuninori Morimoto 						     freq, dir);
284ff1fef1SKuninori Morimoto 
294ff1fef1SKuninori Morimoto 	return -ENOTSUPP;
304ff1fef1SKuninori Morimoto }
314ff1fef1SKuninori Morimoto EXPORT_SYMBOL_GPL(snd_soc_component_set_sysclk);
324ff1fef1SKuninori Morimoto 
334ff1fef1SKuninori Morimoto /*
344ff1fef1SKuninori Morimoto  * snd_soc_component_set_pll - configure component PLL.
354ff1fef1SKuninori Morimoto  * @component: COMPONENT
364ff1fef1SKuninori Morimoto  * @pll_id: DAI specific PLL ID
374ff1fef1SKuninori Morimoto  * @source: DAI specific source for the PLL
384ff1fef1SKuninori Morimoto  * @freq_in: PLL input clock frequency in Hz
394ff1fef1SKuninori Morimoto  * @freq_out: requested PLL output clock frequency in Hz
404ff1fef1SKuninori Morimoto  *
414ff1fef1SKuninori Morimoto  * Configures and enables PLL to generate output clock based on input clock.
424ff1fef1SKuninori Morimoto  */
434ff1fef1SKuninori Morimoto int snd_soc_component_set_pll(struct snd_soc_component *component, int pll_id,
444ff1fef1SKuninori Morimoto 			      int source, unsigned int freq_in,
454ff1fef1SKuninori Morimoto 			      unsigned int freq_out)
464ff1fef1SKuninori Morimoto {
474ff1fef1SKuninori Morimoto 	if (component->driver->set_pll)
484ff1fef1SKuninori Morimoto 		return component->driver->set_pll(component, pll_id, source,
494ff1fef1SKuninori Morimoto 						  freq_in, freq_out);
504ff1fef1SKuninori Morimoto 
514ff1fef1SKuninori Morimoto 	return -EINVAL;
524ff1fef1SKuninori Morimoto }
534ff1fef1SKuninori Morimoto EXPORT_SYMBOL_GPL(snd_soc_component_set_pll);
544ff1fef1SKuninori Morimoto 
559d415fbfSKuninori Morimoto void snd_soc_component_seq_notifier(struct snd_soc_component *component,
569d415fbfSKuninori Morimoto 				    enum snd_soc_dapm_type type, int subseq)
579d415fbfSKuninori Morimoto {
589d415fbfSKuninori Morimoto 	if (component->driver->seq_notifier)
599d415fbfSKuninori Morimoto 		component->driver->seq_notifier(component, type, subseq);
609d415fbfSKuninori Morimoto }
619d415fbfSKuninori Morimoto 
628e2a990dSKuninori Morimoto int snd_soc_component_stream_event(struct snd_soc_component *component,
638e2a990dSKuninori Morimoto 				   int event)
648e2a990dSKuninori Morimoto {
658e2a990dSKuninori Morimoto 	if (component->driver->stream_event)
668e2a990dSKuninori Morimoto 		return component->driver->stream_event(component, event);
678e2a990dSKuninori Morimoto 
688e2a990dSKuninori Morimoto 	return 0;
698e2a990dSKuninori Morimoto }
708e2a990dSKuninori Morimoto 
717951b146SKuninori Morimoto int snd_soc_component_set_bias_level(struct snd_soc_component *component,
727951b146SKuninori Morimoto 				     enum snd_soc_bias_level level)
737951b146SKuninori Morimoto {
747951b146SKuninori Morimoto 	if (component->driver->set_bias_level)
757951b146SKuninori Morimoto 		return component->driver->set_bias_level(component, level);
767951b146SKuninori Morimoto 
777951b146SKuninori Morimoto 	return 0;
787951b146SKuninori Morimoto }
797951b146SKuninori Morimoto 
804ff1fef1SKuninori Morimoto int snd_soc_component_enable_pin(struct snd_soc_component *component,
814ff1fef1SKuninori Morimoto 				 const char *pin)
824ff1fef1SKuninori Morimoto {
834ff1fef1SKuninori Morimoto 	struct snd_soc_dapm_context *dapm =
844ff1fef1SKuninori Morimoto 		snd_soc_component_get_dapm(component);
854ff1fef1SKuninori Morimoto 	char *full_name;
864ff1fef1SKuninori Morimoto 	int ret;
874ff1fef1SKuninori Morimoto 
884ff1fef1SKuninori Morimoto 	if (!component->name_prefix)
894ff1fef1SKuninori Morimoto 		return snd_soc_dapm_enable_pin(dapm, pin);
904ff1fef1SKuninori Morimoto 
914ff1fef1SKuninori Morimoto 	full_name = kasprintf(GFP_KERNEL, "%s %s", component->name_prefix, pin);
924ff1fef1SKuninori Morimoto 	if (!full_name)
934ff1fef1SKuninori Morimoto 		return -ENOMEM;
944ff1fef1SKuninori Morimoto 
954ff1fef1SKuninori Morimoto 	ret = snd_soc_dapm_enable_pin(dapm, full_name);
964ff1fef1SKuninori Morimoto 	kfree(full_name);
974ff1fef1SKuninori Morimoto 
984ff1fef1SKuninori Morimoto 	return ret;
994ff1fef1SKuninori Morimoto }
1004ff1fef1SKuninori Morimoto EXPORT_SYMBOL_GPL(snd_soc_component_enable_pin);
1014ff1fef1SKuninori Morimoto 
1024ff1fef1SKuninori Morimoto int snd_soc_component_enable_pin_unlocked(struct snd_soc_component *component,
1034ff1fef1SKuninori Morimoto 					  const char *pin)
1044ff1fef1SKuninori Morimoto {
1054ff1fef1SKuninori Morimoto 	struct snd_soc_dapm_context *dapm =
1064ff1fef1SKuninori Morimoto 		snd_soc_component_get_dapm(component);
1074ff1fef1SKuninori Morimoto 	char *full_name;
1084ff1fef1SKuninori Morimoto 	int ret;
1094ff1fef1SKuninori Morimoto 
1104ff1fef1SKuninori Morimoto 	if (!component->name_prefix)
1114ff1fef1SKuninori Morimoto 		return snd_soc_dapm_enable_pin_unlocked(dapm, pin);
1124ff1fef1SKuninori Morimoto 
1134ff1fef1SKuninori Morimoto 	full_name = kasprintf(GFP_KERNEL, "%s %s", component->name_prefix, pin);
1144ff1fef1SKuninori Morimoto 	if (!full_name)
1154ff1fef1SKuninori Morimoto 		return -ENOMEM;
1164ff1fef1SKuninori Morimoto 
1174ff1fef1SKuninori Morimoto 	ret = snd_soc_dapm_enable_pin_unlocked(dapm, full_name);
1184ff1fef1SKuninori Morimoto 	kfree(full_name);
1194ff1fef1SKuninori Morimoto 
1204ff1fef1SKuninori Morimoto 	return ret;
1214ff1fef1SKuninori Morimoto }
1224ff1fef1SKuninori Morimoto EXPORT_SYMBOL_GPL(snd_soc_component_enable_pin_unlocked);
1234ff1fef1SKuninori Morimoto 
1244ff1fef1SKuninori Morimoto int snd_soc_component_disable_pin(struct snd_soc_component *component,
1254ff1fef1SKuninori Morimoto 				  const char *pin)
1264ff1fef1SKuninori Morimoto {
1274ff1fef1SKuninori Morimoto 	struct snd_soc_dapm_context *dapm =
1284ff1fef1SKuninori Morimoto 		snd_soc_component_get_dapm(component);
1294ff1fef1SKuninori Morimoto 	char *full_name;
1304ff1fef1SKuninori Morimoto 	int ret;
1314ff1fef1SKuninori Morimoto 
1324ff1fef1SKuninori Morimoto 	if (!component->name_prefix)
1334ff1fef1SKuninori Morimoto 		return snd_soc_dapm_disable_pin(dapm, pin);
1344ff1fef1SKuninori Morimoto 
1354ff1fef1SKuninori Morimoto 	full_name = kasprintf(GFP_KERNEL, "%s %s", component->name_prefix, pin);
1364ff1fef1SKuninori Morimoto 	if (!full_name)
1374ff1fef1SKuninori Morimoto 		return -ENOMEM;
1384ff1fef1SKuninori Morimoto 
1394ff1fef1SKuninori Morimoto 	ret = snd_soc_dapm_disable_pin(dapm, full_name);
1404ff1fef1SKuninori Morimoto 	kfree(full_name);
1414ff1fef1SKuninori Morimoto 
1424ff1fef1SKuninori Morimoto 	return ret;
1434ff1fef1SKuninori Morimoto }
1444ff1fef1SKuninori Morimoto EXPORT_SYMBOL_GPL(snd_soc_component_disable_pin);
1454ff1fef1SKuninori Morimoto 
1464ff1fef1SKuninori Morimoto int snd_soc_component_disable_pin_unlocked(struct snd_soc_component *component,
1474ff1fef1SKuninori Morimoto 					   const char *pin)
1484ff1fef1SKuninori Morimoto {
1494ff1fef1SKuninori Morimoto 	struct snd_soc_dapm_context *dapm =
1504ff1fef1SKuninori Morimoto 		snd_soc_component_get_dapm(component);
1514ff1fef1SKuninori Morimoto 	char *full_name;
1524ff1fef1SKuninori Morimoto 	int ret;
1534ff1fef1SKuninori Morimoto 
1544ff1fef1SKuninori Morimoto 	if (!component->name_prefix)
1554ff1fef1SKuninori Morimoto 		return snd_soc_dapm_disable_pin_unlocked(dapm, pin);
1564ff1fef1SKuninori Morimoto 
1574ff1fef1SKuninori Morimoto 	full_name = kasprintf(GFP_KERNEL, "%s %s", component->name_prefix, pin);
1584ff1fef1SKuninori Morimoto 	if (!full_name)
1594ff1fef1SKuninori Morimoto 		return -ENOMEM;
1604ff1fef1SKuninori Morimoto 
1614ff1fef1SKuninori Morimoto 	ret = snd_soc_dapm_disable_pin_unlocked(dapm, full_name);
1624ff1fef1SKuninori Morimoto 	kfree(full_name);
1634ff1fef1SKuninori Morimoto 
1644ff1fef1SKuninori Morimoto 	return ret;
1654ff1fef1SKuninori Morimoto }
1664ff1fef1SKuninori Morimoto EXPORT_SYMBOL_GPL(snd_soc_component_disable_pin_unlocked);
1674ff1fef1SKuninori Morimoto 
1684ff1fef1SKuninori Morimoto int snd_soc_component_nc_pin(struct snd_soc_component *component,
1694ff1fef1SKuninori Morimoto 			     const char *pin)
1704ff1fef1SKuninori Morimoto {
1714ff1fef1SKuninori Morimoto 	struct snd_soc_dapm_context *dapm =
1724ff1fef1SKuninori Morimoto 		snd_soc_component_get_dapm(component);
1734ff1fef1SKuninori Morimoto 	char *full_name;
1744ff1fef1SKuninori Morimoto 	int ret;
1754ff1fef1SKuninori Morimoto 
1764ff1fef1SKuninori Morimoto 	if (!component->name_prefix)
1774ff1fef1SKuninori Morimoto 		return snd_soc_dapm_nc_pin(dapm, pin);
1784ff1fef1SKuninori Morimoto 
1794ff1fef1SKuninori Morimoto 	full_name = kasprintf(GFP_KERNEL, "%s %s", component->name_prefix, pin);
1804ff1fef1SKuninori Morimoto 	if (!full_name)
1814ff1fef1SKuninori Morimoto 		return -ENOMEM;
1824ff1fef1SKuninori Morimoto 
1834ff1fef1SKuninori Morimoto 	ret = snd_soc_dapm_nc_pin(dapm, full_name);
1844ff1fef1SKuninori Morimoto 	kfree(full_name);
1854ff1fef1SKuninori Morimoto 
1864ff1fef1SKuninori Morimoto 	return ret;
1874ff1fef1SKuninori Morimoto }
1884ff1fef1SKuninori Morimoto EXPORT_SYMBOL_GPL(snd_soc_component_nc_pin);
1894ff1fef1SKuninori Morimoto 
1904ff1fef1SKuninori Morimoto int snd_soc_component_nc_pin_unlocked(struct snd_soc_component *component,
1914ff1fef1SKuninori Morimoto 				      const char *pin)
1924ff1fef1SKuninori Morimoto {
1934ff1fef1SKuninori Morimoto 	struct snd_soc_dapm_context *dapm =
1944ff1fef1SKuninori Morimoto 		snd_soc_component_get_dapm(component);
1954ff1fef1SKuninori Morimoto 	char *full_name;
1964ff1fef1SKuninori Morimoto 	int ret;
1974ff1fef1SKuninori Morimoto 
1984ff1fef1SKuninori Morimoto 	if (!component->name_prefix)
1994ff1fef1SKuninori Morimoto 		return snd_soc_dapm_nc_pin_unlocked(dapm, pin);
2004ff1fef1SKuninori Morimoto 
2014ff1fef1SKuninori Morimoto 	full_name = kasprintf(GFP_KERNEL, "%s %s", component->name_prefix, pin);
2024ff1fef1SKuninori Morimoto 	if (!full_name)
2034ff1fef1SKuninori Morimoto 		return -ENOMEM;
2044ff1fef1SKuninori Morimoto 
2054ff1fef1SKuninori Morimoto 	ret = snd_soc_dapm_nc_pin_unlocked(dapm, full_name);
2064ff1fef1SKuninori Morimoto 	kfree(full_name);
2074ff1fef1SKuninori Morimoto 
2084ff1fef1SKuninori Morimoto 	return ret;
2094ff1fef1SKuninori Morimoto }
2104ff1fef1SKuninori Morimoto EXPORT_SYMBOL_GPL(snd_soc_component_nc_pin_unlocked);
2114ff1fef1SKuninori Morimoto 
2124ff1fef1SKuninori Morimoto int snd_soc_component_get_pin_status(struct snd_soc_component *component,
2134ff1fef1SKuninori Morimoto 				     const char *pin)
2144ff1fef1SKuninori Morimoto {
2154ff1fef1SKuninori Morimoto 	struct snd_soc_dapm_context *dapm =
2164ff1fef1SKuninori Morimoto 		snd_soc_component_get_dapm(component);
2174ff1fef1SKuninori Morimoto 	char *full_name;
2184ff1fef1SKuninori Morimoto 	int ret;
2194ff1fef1SKuninori Morimoto 
2204ff1fef1SKuninori Morimoto 	if (!component->name_prefix)
2214ff1fef1SKuninori Morimoto 		return snd_soc_dapm_get_pin_status(dapm, pin);
2224ff1fef1SKuninori Morimoto 
2234ff1fef1SKuninori Morimoto 	full_name = kasprintf(GFP_KERNEL, "%s %s", component->name_prefix, pin);
2244ff1fef1SKuninori Morimoto 	if (!full_name)
2254ff1fef1SKuninori Morimoto 		return -ENOMEM;
2264ff1fef1SKuninori Morimoto 
2274ff1fef1SKuninori Morimoto 	ret = snd_soc_dapm_get_pin_status(dapm, full_name);
2284ff1fef1SKuninori Morimoto 	kfree(full_name);
2294ff1fef1SKuninori Morimoto 
2304ff1fef1SKuninori Morimoto 	return ret;
2314ff1fef1SKuninori Morimoto }
2324ff1fef1SKuninori Morimoto EXPORT_SYMBOL_GPL(snd_soc_component_get_pin_status);
2334ff1fef1SKuninori Morimoto 
2344ff1fef1SKuninori Morimoto int snd_soc_component_force_enable_pin(struct snd_soc_component *component,
2354ff1fef1SKuninori Morimoto 				       const char *pin)
2364ff1fef1SKuninori Morimoto {
2374ff1fef1SKuninori Morimoto 	struct snd_soc_dapm_context *dapm =
2384ff1fef1SKuninori Morimoto 		snd_soc_component_get_dapm(component);
2394ff1fef1SKuninori Morimoto 	char *full_name;
2404ff1fef1SKuninori Morimoto 	int ret;
2414ff1fef1SKuninori Morimoto 
2424ff1fef1SKuninori Morimoto 	if (!component->name_prefix)
2434ff1fef1SKuninori Morimoto 		return snd_soc_dapm_force_enable_pin(dapm, pin);
2444ff1fef1SKuninori Morimoto 
2454ff1fef1SKuninori Morimoto 	full_name = kasprintf(GFP_KERNEL, "%s %s", component->name_prefix, pin);
2464ff1fef1SKuninori Morimoto 	if (!full_name)
2474ff1fef1SKuninori Morimoto 		return -ENOMEM;
2484ff1fef1SKuninori Morimoto 
2494ff1fef1SKuninori Morimoto 	ret = snd_soc_dapm_force_enable_pin(dapm, full_name);
2504ff1fef1SKuninori Morimoto 	kfree(full_name);
2514ff1fef1SKuninori Morimoto 
2524ff1fef1SKuninori Morimoto 	return ret;
2534ff1fef1SKuninori Morimoto }
2544ff1fef1SKuninori Morimoto EXPORT_SYMBOL_GPL(snd_soc_component_force_enable_pin);
2554ff1fef1SKuninori Morimoto 
2564ff1fef1SKuninori Morimoto int snd_soc_component_force_enable_pin_unlocked(
2574ff1fef1SKuninori Morimoto 	struct snd_soc_component *component,
2584ff1fef1SKuninori Morimoto 	const char *pin)
2594ff1fef1SKuninori Morimoto {
2604ff1fef1SKuninori Morimoto 	struct snd_soc_dapm_context *dapm =
2614ff1fef1SKuninori Morimoto 		snd_soc_component_get_dapm(component);
2624ff1fef1SKuninori Morimoto 	char *full_name;
2634ff1fef1SKuninori Morimoto 	int ret;
2644ff1fef1SKuninori Morimoto 
2654ff1fef1SKuninori Morimoto 	if (!component->name_prefix)
2664ff1fef1SKuninori Morimoto 		return snd_soc_dapm_force_enable_pin_unlocked(dapm, pin);
2674ff1fef1SKuninori Morimoto 
2684ff1fef1SKuninori Morimoto 	full_name = kasprintf(GFP_KERNEL, "%s %s", component->name_prefix, pin);
2694ff1fef1SKuninori Morimoto 	if (!full_name)
2704ff1fef1SKuninori Morimoto 		return -ENOMEM;
2714ff1fef1SKuninori Morimoto 
2724ff1fef1SKuninori Morimoto 	ret = snd_soc_dapm_force_enable_pin_unlocked(dapm, full_name);
2734ff1fef1SKuninori Morimoto 	kfree(full_name);
2744ff1fef1SKuninori Morimoto 
2754ff1fef1SKuninori Morimoto 	return ret;
2764ff1fef1SKuninori Morimoto }
2774ff1fef1SKuninori Morimoto EXPORT_SYMBOL_GPL(snd_soc_component_force_enable_pin_unlocked);
2784ff1fef1SKuninori Morimoto 
2794ff1fef1SKuninori Morimoto /**
2804ff1fef1SKuninori Morimoto  * snd_soc_component_set_jack - configure component jack.
2814ff1fef1SKuninori Morimoto  * @component: COMPONENTs
2824ff1fef1SKuninori Morimoto  * @jack: structure to use for the jack
2834ff1fef1SKuninori Morimoto  * @data: can be used if codec driver need extra data for configuring jack
2844ff1fef1SKuninori Morimoto  *
2854ff1fef1SKuninori Morimoto  * Configures and enables jack detection function.
2864ff1fef1SKuninori Morimoto  */
2874ff1fef1SKuninori Morimoto int snd_soc_component_set_jack(struct snd_soc_component *component,
2884ff1fef1SKuninori Morimoto 			       struct snd_soc_jack *jack, void *data)
2894ff1fef1SKuninori Morimoto {
2904ff1fef1SKuninori Morimoto 	if (component->driver->set_jack)
2914ff1fef1SKuninori Morimoto 		return component->driver->set_jack(component, jack, data);
2924ff1fef1SKuninori Morimoto 
2934ff1fef1SKuninori Morimoto 	return -ENOTSUPP;
2944ff1fef1SKuninori Morimoto }
2954ff1fef1SKuninori Morimoto EXPORT_SYMBOL_GPL(snd_soc_component_set_jack);
2964a81e8f3SKuninori Morimoto 
2974a81e8f3SKuninori Morimoto int snd_soc_component_module_get(struct snd_soc_component *component,
2984a81e8f3SKuninori Morimoto 				 int upon_open)
2994a81e8f3SKuninori Morimoto {
3004a81e8f3SKuninori Morimoto 	if (component->driver->module_get_upon_open == !!upon_open &&
3014a81e8f3SKuninori Morimoto 	    !try_module_get(component->dev->driver->owner))
3024a81e8f3SKuninori Morimoto 		return -ENODEV;
3034a81e8f3SKuninori Morimoto 
3044a81e8f3SKuninori Morimoto 	return 0;
3054a81e8f3SKuninori Morimoto }
3064a81e8f3SKuninori Morimoto 
3074a81e8f3SKuninori Morimoto void snd_soc_component_module_put(struct snd_soc_component *component,
3084a81e8f3SKuninori Morimoto 				  int upon_open)
3094a81e8f3SKuninori Morimoto {
3104a81e8f3SKuninori Morimoto 	if (component->driver->module_get_upon_open == !!upon_open)
3114a81e8f3SKuninori Morimoto 		module_put(component->dev->driver->owner);
3124a81e8f3SKuninori Morimoto }
313ae2f4849SKuninori Morimoto 
314ae2f4849SKuninori Morimoto int snd_soc_component_open(struct snd_soc_component *component,
315ae2f4849SKuninori Morimoto 			   struct snd_pcm_substream *substream)
316ae2f4849SKuninori Morimoto {
317ae2f4849SKuninori Morimoto 	if (component->driver->ops &&
318ae2f4849SKuninori Morimoto 	    component->driver->ops->open)
319ae2f4849SKuninori Morimoto 		return component->driver->ops->open(substream);
320ae2f4849SKuninori Morimoto 
321ae2f4849SKuninori Morimoto 	return 0;
322ae2f4849SKuninori Morimoto }
3233672beb8SKuninori Morimoto 
3243672beb8SKuninori Morimoto int snd_soc_component_close(struct snd_soc_component *component,
3253672beb8SKuninori Morimoto 			    struct snd_pcm_substream *substream)
3263672beb8SKuninori Morimoto {
3273672beb8SKuninori Morimoto 	if (component->driver->ops &&
3283672beb8SKuninori Morimoto 	    component->driver->ops->close)
3293672beb8SKuninori Morimoto 		return component->driver->ops->close(substream);
3303672beb8SKuninori Morimoto 
3313672beb8SKuninori Morimoto 	return 0;
3323672beb8SKuninori Morimoto }
3336d537233SKuninori Morimoto 
3346d537233SKuninori Morimoto int snd_soc_component_prepare(struct snd_soc_component *component,
3356d537233SKuninori Morimoto 			      struct snd_pcm_substream *substream)
3366d537233SKuninori Morimoto {
3376d537233SKuninori Morimoto 	if (component->driver->ops &&
3386d537233SKuninori Morimoto 	    component->driver->ops->prepare)
3396d537233SKuninori Morimoto 		return component->driver->ops->prepare(substream);
3406d537233SKuninori Morimoto 
3416d537233SKuninori Morimoto 	return 0;
3426d537233SKuninori Morimoto }
343245c539aSKuninori Morimoto 
344245c539aSKuninori Morimoto int snd_soc_component_hw_params(struct snd_soc_component *component,
345245c539aSKuninori Morimoto 				struct snd_pcm_substream *substream,
346245c539aSKuninori Morimoto 				struct snd_pcm_hw_params *params)
347245c539aSKuninori Morimoto {
348245c539aSKuninori Morimoto 	if (component->driver->ops &&
349245c539aSKuninori Morimoto 	    component->driver->ops->hw_params)
350245c539aSKuninori Morimoto 		return component->driver->ops->hw_params(substream, params);
351245c539aSKuninori Morimoto 
352245c539aSKuninori Morimoto 	return 0;
353245c539aSKuninori Morimoto }
354eae7136aSKuninori Morimoto 
355eae7136aSKuninori Morimoto int snd_soc_component_hw_free(struct snd_soc_component *component,
356eae7136aSKuninori Morimoto 			       struct snd_pcm_substream *substream)
357eae7136aSKuninori Morimoto {
358eae7136aSKuninori Morimoto 	if (component->driver->ops &&
359eae7136aSKuninori Morimoto 	    component->driver->ops->hw_free)
360eae7136aSKuninori Morimoto 		return component->driver->ops->hw_free(substream);
361eae7136aSKuninori Morimoto 
362eae7136aSKuninori Morimoto 	return 0;
363eae7136aSKuninori Morimoto }
3645693d50cSKuninori Morimoto 
3655693d50cSKuninori Morimoto int snd_soc_component_trigger(struct snd_soc_component *component,
3665693d50cSKuninori Morimoto 			      struct snd_pcm_substream *substream,
3675693d50cSKuninori Morimoto 			      int cmd)
3685693d50cSKuninori Morimoto {
3695693d50cSKuninori Morimoto 	if (component->driver->ops &&
3705693d50cSKuninori Morimoto 	    component->driver->ops->trigger)
3715693d50cSKuninori Morimoto 		return component->driver->ops->trigger(substream, cmd);
3725693d50cSKuninori Morimoto 
3735693d50cSKuninori Morimoto 	return 0;
3745693d50cSKuninori Morimoto }
37566c51573SKuninori Morimoto 
37666c51573SKuninori Morimoto void snd_soc_component_suspend(struct snd_soc_component *component)
37766c51573SKuninori Morimoto {
37866c51573SKuninori Morimoto 	if (component->driver->suspend)
37966c51573SKuninori Morimoto 		component->driver->suspend(component);
38066c51573SKuninori Morimoto 	component->suspended = 1;
38166c51573SKuninori Morimoto }
3829a840cbaSKuninori Morimoto 
3839a840cbaSKuninori Morimoto void snd_soc_component_resume(struct snd_soc_component *component)
3849a840cbaSKuninori Morimoto {
3859a840cbaSKuninori Morimoto 	if (component->driver->resume)
3869a840cbaSKuninori Morimoto 		component->driver->resume(component);
3879a840cbaSKuninori Morimoto 	component->suspended = 0;
3889a840cbaSKuninori Morimoto }
389e40fadbcSKuninori Morimoto 
390e40fadbcSKuninori Morimoto int snd_soc_component_is_suspended(struct snd_soc_component *component)
391e40fadbcSKuninori Morimoto {
392e40fadbcSKuninori Morimoto 	return component->suspended;
393e40fadbcSKuninori Morimoto }
39408e837ddSKuninori Morimoto 
39508e837ddSKuninori Morimoto int snd_soc_component_probe(struct snd_soc_component *component)
39608e837ddSKuninori Morimoto {
39708e837ddSKuninori Morimoto 	if (component->driver->probe)
39808e837ddSKuninori Morimoto 		return component->driver->probe(component);
39908e837ddSKuninori Morimoto 
40008e837ddSKuninori Morimoto 	return 0;
40108e837ddSKuninori Morimoto }
40203b34dd7SKuninori Morimoto 
40303b34dd7SKuninori Morimoto void snd_soc_component_remove(struct snd_soc_component *component)
40403b34dd7SKuninori Morimoto {
40503b34dd7SKuninori Morimoto 	if (component->driver->remove)
40603b34dd7SKuninori Morimoto 		component->driver->remove(component);
40703b34dd7SKuninori Morimoto }
4082c7b1704SKuninori Morimoto 
4092c7b1704SKuninori Morimoto int snd_soc_component_of_xlate_dai_id(struct snd_soc_component *component,
4102c7b1704SKuninori Morimoto 				      struct device_node *ep)
4112c7b1704SKuninori Morimoto {
4122c7b1704SKuninori Morimoto 	if (component->driver->of_xlate_dai_id)
4132c7b1704SKuninori Morimoto 		return component->driver->of_xlate_dai_id(component, ep);
4142c7b1704SKuninori Morimoto 
4152c7b1704SKuninori Morimoto 	return -ENOTSUPP;
4162c7b1704SKuninori Morimoto }
417a2a34175SKuninori Morimoto 
418a2a34175SKuninori Morimoto int snd_soc_component_of_xlate_dai_name(struct snd_soc_component *component,
419a2a34175SKuninori Morimoto 					struct of_phandle_args *args,
420a2a34175SKuninori Morimoto 					const char **dai_name)
421a2a34175SKuninori Morimoto {
422a2a34175SKuninori Morimoto 	if (component->driver->of_xlate_dai_name)
423a2a34175SKuninori Morimoto 		return component->driver->of_xlate_dai_name(component,
424a2a34175SKuninori Morimoto 						     args, dai_name);
425a2a34175SKuninori Morimoto 	return -ENOTSUPP;
426a2a34175SKuninori Morimoto }
4270035e256SKuninori Morimoto 
4280035e256SKuninori Morimoto int snd_soc_pcm_component_pointer(struct snd_pcm_substream *substream)
4290035e256SKuninori Morimoto {
4300035e256SKuninori Morimoto 	struct snd_soc_pcm_runtime *rtd = substream->private_data;
4310035e256SKuninori Morimoto 	struct snd_soc_component *component;
4320035e256SKuninori Morimoto 	struct snd_soc_rtdcom_list *rtdcom;
4330035e256SKuninori Morimoto 
4340035e256SKuninori Morimoto 	for_each_rtdcom(rtd, rtdcom) {
4350035e256SKuninori Morimoto 		component = rtdcom->component;
4360035e256SKuninori Morimoto 
4370035e256SKuninori Morimoto 		/* FIXME: use 1st pointer */
4380035e256SKuninori Morimoto 		if (component->driver->ops &&
4390035e256SKuninori Morimoto 		    component->driver->ops->pointer)
4400035e256SKuninori Morimoto 			return component->driver->ops->pointer(substream);
4410035e256SKuninori Morimoto 	}
4420035e256SKuninori Morimoto 
4430035e256SKuninori Morimoto 	return 0;
4440035e256SKuninori Morimoto }
445