1
2
3
4
5
6
7
8#include <sound/soc.h>
9#include <sound/soc-link.h>
10
11#define soc_link_ret(rtd, ret) _soc_link_ret(rtd, __func__, ret)
12static inline int _soc_link_ret(struct snd_soc_pcm_runtime *rtd,
13 const char *func, int ret)
14{
15
16 if (ret >= 0)
17 return ret;
18
19
20 switch (ret) {
21 case -EPROBE_DEFER:
22 case -ENOTSUPP:
23 break;
24 default:
25 dev_err(rtd->dev,
26 "ASoC: error at %s on %s: %d\n",
27 func, rtd->dai_link->name, ret);
28 }
29
30 return ret;
31}
32
33int snd_soc_link_init(struct snd_soc_pcm_runtime *rtd)
34{
35 int ret = 0;
36
37 if (rtd->dai_link->init)
38 ret = rtd->dai_link->init(rtd);
39
40 return soc_link_ret(rtd, ret);
41}
42
43void snd_soc_link_exit(struct snd_soc_pcm_runtime *rtd)
44{
45 if (rtd->dai_link->exit)
46 rtd->dai_link->exit(rtd);
47}
48
49int snd_soc_link_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
50 struct snd_pcm_hw_params *params)
51{
52 int ret = 0;
53
54 if (rtd->dai_link->be_hw_params_fixup)
55 ret = rtd->dai_link->be_hw_params_fixup(rtd, params);
56
57 return soc_link_ret(rtd, ret);
58}
59
60int snd_soc_link_startup(struct snd_pcm_substream *substream)
61{
62 struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
63 int ret = 0;
64
65 if (rtd->dai_link->ops &&
66 rtd->dai_link->ops->startup)
67 ret = rtd->dai_link->ops->startup(substream);
68
69 return soc_link_ret(rtd, ret);
70}
71
72void snd_soc_link_shutdown(struct snd_pcm_substream *substream)
73{
74 struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
75
76 if (rtd->dai_link->ops &&
77 rtd->dai_link->ops->shutdown)
78 rtd->dai_link->ops->shutdown(substream);
79}
80
81int snd_soc_link_prepare(struct snd_pcm_substream *substream)
82{
83 struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
84 int ret = 0;
85
86 if (rtd->dai_link->ops &&
87 rtd->dai_link->ops->prepare)
88 ret = rtd->dai_link->ops->prepare(substream);
89
90 return soc_link_ret(rtd, ret);
91}
92
93int snd_soc_link_hw_params(struct snd_pcm_substream *substream,
94 struct snd_pcm_hw_params *params)
95{
96 struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
97 int ret = 0;
98
99 if (rtd->dai_link->ops &&
100 rtd->dai_link->ops->hw_params)
101 ret = rtd->dai_link->ops->hw_params(substream, params);
102
103 return soc_link_ret(rtd, ret);
104}
105
106void snd_soc_link_hw_free(struct snd_pcm_substream *substream)
107{
108 struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
109
110 if (rtd->dai_link->ops &&
111 rtd->dai_link->ops->hw_free)
112 rtd->dai_link->ops->hw_free(substream);
113}
114
115int snd_soc_link_trigger(struct snd_pcm_substream *substream, int cmd)
116{
117 struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
118 int ret = 0;
119
120 if (rtd->dai_link->ops &&
121 rtd->dai_link->ops->trigger)
122 ret = rtd->dai_link->ops->trigger(substream, cmd);
123
124 return soc_link_ret(rtd, ret);
125}
126
127int snd_soc_link_compr_startup(struct snd_compr_stream *cstream)
128{
129 struct snd_soc_pcm_runtime *rtd = cstream->private_data;
130 int ret = 0;
131
132 if (rtd->dai_link->compr_ops &&
133 rtd->dai_link->compr_ops->startup)
134 ret = rtd->dai_link->compr_ops->startup(cstream);
135
136 return soc_link_ret(rtd, ret);
137}
138EXPORT_SYMBOL_GPL(snd_soc_link_compr_startup);
139
140void snd_soc_link_compr_shutdown(struct snd_compr_stream *cstream)
141{
142 struct snd_soc_pcm_runtime *rtd = cstream->private_data;
143
144 if (rtd->dai_link->compr_ops &&
145 rtd->dai_link->compr_ops->shutdown)
146 rtd->dai_link->compr_ops->shutdown(cstream);
147}
148EXPORT_SYMBOL_GPL(snd_soc_link_compr_shutdown);
149
150int snd_soc_link_compr_set_params(struct snd_compr_stream *cstream)
151{
152 struct snd_soc_pcm_runtime *rtd = cstream->private_data;
153 int ret = 0;
154
155 if (rtd->dai_link->compr_ops &&
156 rtd->dai_link->compr_ops->set_params)
157 ret = rtd->dai_link->compr_ops->set_params(cstream);
158
159 return soc_link_ret(rtd, ret);
160}
161EXPORT_SYMBOL_GPL(snd_soc_link_compr_set_params);
162