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