xref: /openbmc/linux/sound/soc/soc-component.c (revision e2cb4a14)
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 {
317e2cb4a14SKuninori Morimoto 	if (component->driver->open)
318e2cb4a14SKuninori Morimoto 		return component->driver->open(component, substream);
319e2cb4a14SKuninori Morimoto 
320e2cb4a14SKuninori Morimoto 	/* remove me */
321ae2f4849SKuninori Morimoto 	if (component->driver->ops &&
322ae2f4849SKuninori Morimoto 	    component->driver->ops->open)
323ae2f4849SKuninori Morimoto 		return component->driver->ops->open(substream);
324ae2f4849SKuninori Morimoto 
325ae2f4849SKuninori Morimoto 	return 0;
326ae2f4849SKuninori Morimoto }
3273672beb8SKuninori Morimoto 
3283672beb8SKuninori Morimoto int snd_soc_component_close(struct snd_soc_component *component,
3293672beb8SKuninori Morimoto 			    struct snd_pcm_substream *substream)
3303672beb8SKuninori Morimoto {
331e2cb4a14SKuninori Morimoto 	if (component->driver->close)
332e2cb4a14SKuninori Morimoto 		return component->driver->close(component, substream);
333e2cb4a14SKuninori Morimoto 
334e2cb4a14SKuninori Morimoto 	/* remove me */
3353672beb8SKuninori Morimoto 	if (component->driver->ops &&
3363672beb8SKuninori Morimoto 	    component->driver->ops->close)
3373672beb8SKuninori Morimoto 		return component->driver->ops->close(substream);
3383672beb8SKuninori Morimoto 
3393672beb8SKuninori Morimoto 	return 0;
3403672beb8SKuninori Morimoto }
3416d537233SKuninori Morimoto 
3426d537233SKuninori Morimoto int snd_soc_component_prepare(struct snd_soc_component *component,
3436d537233SKuninori Morimoto 			      struct snd_pcm_substream *substream)
3446d537233SKuninori Morimoto {
345e2cb4a14SKuninori Morimoto 	if (component->driver->prepare)
346e2cb4a14SKuninori Morimoto 		return component->driver->prepare(component, substream);
347e2cb4a14SKuninori Morimoto 
348e2cb4a14SKuninori Morimoto 	/* remove me */
3496d537233SKuninori Morimoto 	if (component->driver->ops &&
3506d537233SKuninori Morimoto 	    component->driver->ops->prepare)
3516d537233SKuninori Morimoto 		return component->driver->ops->prepare(substream);
3526d537233SKuninori Morimoto 
3536d537233SKuninori Morimoto 	return 0;
3546d537233SKuninori Morimoto }
355245c539aSKuninori Morimoto 
356245c539aSKuninori Morimoto int snd_soc_component_hw_params(struct snd_soc_component *component,
357245c539aSKuninori Morimoto 				struct snd_pcm_substream *substream,
358245c539aSKuninori Morimoto 				struct snd_pcm_hw_params *params)
359245c539aSKuninori Morimoto {
360e2cb4a14SKuninori Morimoto 	if (component->driver->hw_params)
361e2cb4a14SKuninori Morimoto 		return component->driver->hw_params(component,
362e2cb4a14SKuninori Morimoto 						    substream, params);
363e2cb4a14SKuninori Morimoto 
364e2cb4a14SKuninori Morimoto 	/* remove me */
365245c539aSKuninori Morimoto 	if (component->driver->ops &&
366245c539aSKuninori Morimoto 	    component->driver->ops->hw_params)
367245c539aSKuninori Morimoto 		return component->driver->ops->hw_params(substream, params);
368245c539aSKuninori Morimoto 
369245c539aSKuninori Morimoto 	return 0;
370245c539aSKuninori Morimoto }
371eae7136aSKuninori Morimoto 
372eae7136aSKuninori Morimoto int snd_soc_component_hw_free(struct snd_soc_component *component,
373eae7136aSKuninori Morimoto 			       struct snd_pcm_substream *substream)
374eae7136aSKuninori Morimoto {
375e2cb4a14SKuninori Morimoto 	if (component->driver->hw_free)
376e2cb4a14SKuninori Morimoto 		return component->driver->hw_free(component, substream);
377e2cb4a14SKuninori Morimoto 
378e2cb4a14SKuninori Morimoto 	/* remove me */
379eae7136aSKuninori Morimoto 	if (component->driver->ops &&
380eae7136aSKuninori Morimoto 	    component->driver->ops->hw_free)
381eae7136aSKuninori Morimoto 		return component->driver->ops->hw_free(substream);
382eae7136aSKuninori Morimoto 
383eae7136aSKuninori Morimoto 	return 0;
384eae7136aSKuninori Morimoto }
3855693d50cSKuninori Morimoto 
3865693d50cSKuninori Morimoto int snd_soc_component_trigger(struct snd_soc_component *component,
3875693d50cSKuninori Morimoto 			      struct snd_pcm_substream *substream,
3885693d50cSKuninori Morimoto 			      int cmd)
3895693d50cSKuninori Morimoto {
390e2cb4a14SKuninori Morimoto 	if (component->driver->trigger)
391e2cb4a14SKuninori Morimoto 		return component->driver->trigger(component, substream, cmd);
392e2cb4a14SKuninori Morimoto 
393e2cb4a14SKuninori Morimoto 	/* remove me */
3945693d50cSKuninori Morimoto 	if (component->driver->ops &&
3955693d50cSKuninori Morimoto 	    component->driver->ops->trigger)
3965693d50cSKuninori Morimoto 		return component->driver->ops->trigger(substream, cmd);
3975693d50cSKuninori Morimoto 
3985693d50cSKuninori Morimoto 	return 0;
3995693d50cSKuninori Morimoto }
40066c51573SKuninori Morimoto 
40166c51573SKuninori Morimoto void snd_soc_component_suspend(struct snd_soc_component *component)
40266c51573SKuninori Morimoto {
40366c51573SKuninori Morimoto 	if (component->driver->suspend)
40466c51573SKuninori Morimoto 		component->driver->suspend(component);
40566c51573SKuninori Morimoto 	component->suspended = 1;
40666c51573SKuninori Morimoto }
4079a840cbaSKuninori Morimoto 
4089a840cbaSKuninori Morimoto void snd_soc_component_resume(struct snd_soc_component *component)
4099a840cbaSKuninori Morimoto {
4109a840cbaSKuninori Morimoto 	if (component->driver->resume)
4119a840cbaSKuninori Morimoto 		component->driver->resume(component);
4129a840cbaSKuninori Morimoto 	component->suspended = 0;
4139a840cbaSKuninori Morimoto }
414e40fadbcSKuninori Morimoto 
415e40fadbcSKuninori Morimoto int snd_soc_component_is_suspended(struct snd_soc_component *component)
416e40fadbcSKuninori Morimoto {
417e40fadbcSKuninori Morimoto 	return component->suspended;
418e40fadbcSKuninori Morimoto }
41908e837ddSKuninori Morimoto 
42008e837ddSKuninori Morimoto int snd_soc_component_probe(struct snd_soc_component *component)
42108e837ddSKuninori Morimoto {
42208e837ddSKuninori Morimoto 	if (component->driver->probe)
42308e837ddSKuninori Morimoto 		return component->driver->probe(component);
42408e837ddSKuninori Morimoto 
42508e837ddSKuninori Morimoto 	return 0;
42608e837ddSKuninori Morimoto }
42703b34dd7SKuninori Morimoto 
42803b34dd7SKuninori Morimoto void snd_soc_component_remove(struct snd_soc_component *component)
42903b34dd7SKuninori Morimoto {
43003b34dd7SKuninori Morimoto 	if (component->driver->remove)
43103b34dd7SKuninori Morimoto 		component->driver->remove(component);
43203b34dd7SKuninori Morimoto }
4332c7b1704SKuninori Morimoto 
4342c7b1704SKuninori Morimoto int snd_soc_component_of_xlate_dai_id(struct snd_soc_component *component,
4352c7b1704SKuninori Morimoto 				      struct device_node *ep)
4362c7b1704SKuninori Morimoto {
4372c7b1704SKuninori Morimoto 	if (component->driver->of_xlate_dai_id)
4382c7b1704SKuninori Morimoto 		return component->driver->of_xlate_dai_id(component, ep);
4392c7b1704SKuninori Morimoto 
4402c7b1704SKuninori Morimoto 	return -ENOTSUPP;
4412c7b1704SKuninori Morimoto }
442a2a34175SKuninori Morimoto 
443a2a34175SKuninori Morimoto int snd_soc_component_of_xlate_dai_name(struct snd_soc_component *component,
444a2a34175SKuninori Morimoto 					struct of_phandle_args *args,
445a2a34175SKuninori Morimoto 					const char **dai_name)
446a2a34175SKuninori Morimoto {
447a2a34175SKuninori Morimoto 	if (component->driver->of_xlate_dai_name)
448a2a34175SKuninori Morimoto 		return component->driver->of_xlate_dai_name(component,
449a2a34175SKuninori Morimoto 						     args, dai_name);
450a2a34175SKuninori Morimoto 	return -ENOTSUPP;
451a2a34175SKuninori Morimoto }
4520035e256SKuninori Morimoto 
4530035e256SKuninori Morimoto int snd_soc_pcm_component_pointer(struct snd_pcm_substream *substream)
4540035e256SKuninori Morimoto {
4550035e256SKuninori Morimoto 	struct snd_soc_pcm_runtime *rtd = substream->private_data;
4560035e256SKuninori Morimoto 	struct snd_soc_component *component;
4570035e256SKuninori Morimoto 	struct snd_soc_rtdcom_list *rtdcom;
4580035e256SKuninori Morimoto 
4590035e256SKuninori Morimoto 	for_each_rtdcom(rtd, rtdcom) {
4600035e256SKuninori Morimoto 		component = rtdcom->component;
4610035e256SKuninori Morimoto 
4620035e256SKuninori Morimoto 		/* FIXME: use 1st pointer */
463e2cb4a14SKuninori Morimoto 		if (component->driver->pointer)
464e2cb4a14SKuninori Morimoto 			return component->driver->pointer(component, substream);
465e2cb4a14SKuninori Morimoto 
466e2cb4a14SKuninori Morimoto 		/* remove me */
4670035e256SKuninori Morimoto 		if (component->driver->ops &&
4680035e256SKuninori Morimoto 		    component->driver->ops->pointer)
4690035e256SKuninori Morimoto 			return component->driver->ops->pointer(substream);
4700035e256SKuninori Morimoto 	}
4710035e256SKuninori Morimoto 
4720035e256SKuninori Morimoto 	return 0;
4730035e256SKuninori Morimoto }
47496a47908SKuninori Morimoto 
47596a47908SKuninori Morimoto int snd_soc_pcm_component_ioctl(struct snd_pcm_substream *substream,
47696a47908SKuninori Morimoto 				unsigned int cmd, void *arg)
47796a47908SKuninori Morimoto {
47896a47908SKuninori Morimoto 	struct snd_soc_pcm_runtime *rtd = substream->private_data;
47996a47908SKuninori Morimoto 	struct snd_soc_component *component;
48096a47908SKuninori Morimoto 	struct snd_soc_rtdcom_list *rtdcom;
48196a47908SKuninori Morimoto 
48296a47908SKuninori Morimoto 	for_each_rtdcom(rtd, rtdcom) {
48396a47908SKuninori Morimoto 		component = rtdcom->component;
48496a47908SKuninori Morimoto 
48596a47908SKuninori Morimoto 		/* FIXME: use 1st ioctl */
486e2cb4a14SKuninori Morimoto 		if (component->driver->ioctl)
487e2cb4a14SKuninori Morimoto 			return component->driver->ioctl(component, substream,
488e2cb4a14SKuninori Morimoto 							cmd, arg);
489e2cb4a14SKuninori Morimoto 
490e2cb4a14SKuninori Morimoto 		/* remove me */
49196a47908SKuninori Morimoto 		if (component->driver->ops &&
49296a47908SKuninori Morimoto 		    component->driver->ops->ioctl)
49396a47908SKuninori Morimoto 			return component->driver->ops->ioctl(substream,
49496a47908SKuninori Morimoto 							     cmd, arg);
49596a47908SKuninori Morimoto 	}
49696a47908SKuninori Morimoto 
49796a47908SKuninori Morimoto 	return snd_pcm_lib_ioctl(substream, cmd, arg);
49896a47908SKuninori Morimoto }
49982d81f5cSKuninori Morimoto 
50082d81f5cSKuninori Morimoto int snd_soc_pcm_component_copy_user(struct snd_pcm_substream *substream,
50182d81f5cSKuninori Morimoto 				    int channel, unsigned long pos,
50282d81f5cSKuninori Morimoto 				    void __user *buf, unsigned long bytes)
50382d81f5cSKuninori Morimoto {
50482d81f5cSKuninori Morimoto 	struct snd_soc_pcm_runtime *rtd = substream->private_data;
50582d81f5cSKuninori Morimoto 	struct snd_soc_rtdcom_list *rtdcom;
50682d81f5cSKuninori Morimoto 	struct snd_soc_component *component;
50782d81f5cSKuninori Morimoto 
50882d81f5cSKuninori Morimoto 	for_each_rtdcom(rtd, rtdcom) {
50982d81f5cSKuninori Morimoto 		component = rtdcom->component;
51082d81f5cSKuninori Morimoto 
51182d81f5cSKuninori Morimoto 		/* FIXME. it returns 1st copy now */
512e2cb4a14SKuninori Morimoto 		if (component->driver->copy_user)
513e2cb4a14SKuninori Morimoto 			return component->driver->copy_user(
514e2cb4a14SKuninori Morimoto 				component, substream, channel, pos, buf, bytes);
515e2cb4a14SKuninori Morimoto 
516e2cb4a14SKuninori Morimoto 		/* remove me */
51782d81f5cSKuninori Morimoto 		if (component->driver->ops &&
51882d81f5cSKuninori Morimoto 		    component->driver->ops->copy_user)
51982d81f5cSKuninori Morimoto 			return component->driver->ops->copy_user(
52082d81f5cSKuninori Morimoto 				substream, channel, pos, buf, bytes);
52182d81f5cSKuninori Morimoto 	}
52282d81f5cSKuninori Morimoto 
52382d81f5cSKuninori Morimoto 	return -EINVAL;
52482d81f5cSKuninori Morimoto }
5259c712e4fSKuninori Morimoto 
5269c712e4fSKuninori Morimoto struct page *snd_soc_pcm_component_page(struct snd_pcm_substream *substream,
5279c712e4fSKuninori Morimoto 					unsigned long offset)
5289c712e4fSKuninori Morimoto {
5299c712e4fSKuninori Morimoto 	struct snd_soc_pcm_runtime *rtd = substream->private_data;
5309c712e4fSKuninori Morimoto 	struct snd_soc_rtdcom_list *rtdcom;
5319c712e4fSKuninori Morimoto 	struct snd_soc_component *component;
5329c712e4fSKuninori Morimoto 	struct page *page;
5339c712e4fSKuninori Morimoto 
5349c712e4fSKuninori Morimoto 	for_each_rtdcom(rtd, rtdcom) {
5359c712e4fSKuninori Morimoto 		component = rtdcom->component;
5369c712e4fSKuninori Morimoto 
5379c712e4fSKuninori Morimoto 		/* FIXME. it returns 1st page now */
538e2cb4a14SKuninori Morimoto 		if (component->driver->page) {
539e2cb4a14SKuninori Morimoto 			page = component->driver->page(component,
540e2cb4a14SKuninori Morimoto 						       substream, offset);
541e2cb4a14SKuninori Morimoto 			if (page)
542e2cb4a14SKuninori Morimoto 				return page;
543e2cb4a14SKuninori Morimoto 		}
544e2cb4a14SKuninori Morimoto 
545e2cb4a14SKuninori Morimoto 		/* remove me */
5469c712e4fSKuninori Morimoto 		if (component->driver->ops &&
5479c712e4fSKuninori Morimoto 		    component->driver->ops->page) {
5489c712e4fSKuninori Morimoto 			page = component->driver->ops->page(substream, offset);
5499c712e4fSKuninori Morimoto 			if (page)
5509c712e4fSKuninori Morimoto 				return page;
5519c712e4fSKuninori Morimoto 		}
5529c712e4fSKuninori Morimoto 	}
5539c712e4fSKuninori Morimoto 
5549c712e4fSKuninori Morimoto 	return NULL;
5559c712e4fSKuninori Morimoto }
556205875e1SKuninori Morimoto 
557205875e1SKuninori Morimoto int snd_soc_pcm_component_mmap(struct snd_pcm_substream *substream,
558205875e1SKuninori Morimoto 			       struct vm_area_struct *vma)
559205875e1SKuninori Morimoto {
560205875e1SKuninori Morimoto 	struct snd_soc_pcm_runtime *rtd = substream->private_data;
561205875e1SKuninori Morimoto 	struct snd_soc_rtdcom_list *rtdcom;
562205875e1SKuninori Morimoto 	struct snd_soc_component *component;
563205875e1SKuninori Morimoto 
564205875e1SKuninori Morimoto 	for_each_rtdcom(rtd, rtdcom) {
565205875e1SKuninori Morimoto 		component = rtdcom->component;
566205875e1SKuninori Morimoto 
567205875e1SKuninori Morimoto 		/* FIXME. it returns 1st mmap now */
568e2cb4a14SKuninori Morimoto 		if (component->driver->mmap)
569e2cb4a14SKuninori Morimoto 			return component->driver->mmap(component,
570e2cb4a14SKuninori Morimoto 						       substream, vma);
571e2cb4a14SKuninori Morimoto 
572e2cb4a14SKuninori Morimoto 		/* remove me */
573205875e1SKuninori Morimoto 		if (component->driver->ops &&
574205875e1SKuninori Morimoto 		    component->driver->ops->mmap)
575205875e1SKuninori Morimoto 			return component->driver->ops->mmap(substream, vma);
576205875e1SKuninori Morimoto 	}
577205875e1SKuninori Morimoto 
578205875e1SKuninori Morimoto 	return -EINVAL;
579205875e1SKuninori Morimoto }
5807484291eSKuninori Morimoto 
5817484291eSKuninori Morimoto int snd_soc_pcm_component_new(struct snd_pcm *pcm)
5827484291eSKuninori Morimoto {
5837484291eSKuninori Morimoto 	struct snd_soc_pcm_runtime *rtd = pcm->private_data;
5847484291eSKuninori Morimoto 	struct snd_soc_rtdcom_list *rtdcom;
5857484291eSKuninori Morimoto 	struct snd_soc_component *component;
5867484291eSKuninori Morimoto 	int ret;
5877484291eSKuninori Morimoto 
5887484291eSKuninori Morimoto 	for_each_rtdcom(rtd, rtdcom) {
5897484291eSKuninori Morimoto 		component = rtdcom->component;
5907484291eSKuninori Morimoto 
5917484291eSKuninori Morimoto 		if (component->driver->pcm_new) {
5927484291eSKuninori Morimoto 			ret = component->driver->pcm_new(rtd);
5937484291eSKuninori Morimoto 			if (ret < 0)
5947484291eSKuninori Morimoto 				return ret;
5957484291eSKuninori Morimoto 		}
5967484291eSKuninori Morimoto 	}
5977484291eSKuninori Morimoto 
5987484291eSKuninori Morimoto 	return 0;
5997484291eSKuninori Morimoto }
60079776da0SKuninori Morimoto 
60179776da0SKuninori Morimoto void snd_soc_pcm_component_free(struct snd_pcm *pcm)
60279776da0SKuninori Morimoto {
60379776da0SKuninori Morimoto 	struct snd_soc_pcm_runtime *rtd = pcm->private_data;
60479776da0SKuninori Morimoto 	struct snd_soc_rtdcom_list *rtdcom;
60579776da0SKuninori Morimoto 	struct snd_soc_component *component;
60679776da0SKuninori Morimoto 
60779776da0SKuninori Morimoto 	for_each_rtdcom(rtd, rtdcom) {
60879776da0SKuninori Morimoto 		component = rtdcom->component;
60979776da0SKuninori Morimoto 
61079776da0SKuninori Morimoto 		if (component->driver->pcm_free)
61179776da0SKuninori Morimoto 			component->driver->pcm_free(pcm);
61279776da0SKuninori Morimoto 	}
61379776da0SKuninori Morimoto }
614