Skip to content

Commit e6a3ff2

Browse files
morimotobroonie
authored andcommitted
ASoC: simple-scu-card: use cpu/codec pointer on graph_dai_props
In DPCM case, it uses CPU-dummy / dummy-Codec dai links, and non DPCM case, it uses CPU-Codec dai links. Now, we want to merge simple-card and simple-scu-card. These sound cards are using silimar but not same logic on each functions. Then, of course we want to share same logic. To compromise, this patch uses cpu/codec pointer on simple-scu-card. It is same logic with simple-card, thus easy merging. This is prepare for merging simple card Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> Signed-off-by: Mark Brown <broonie@kernel.org>
1 parent 09ee833 commit e6a3ff2

File tree

1 file changed

+52
-25
lines changed

1 file changed

+52
-25
lines changed

sound/soc/generic/simple-scu-card.c

Lines changed: 52 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,14 @@ struct simple_card_data {
2323
struct snd_soc_card snd_card;
2424
struct snd_soc_codec_conf codec_conf;
2525
struct simple_dai_props {
26-
struct asoc_simple_dai dai;
26+
struct asoc_simple_dai *cpu_dai;
27+
struct asoc_simple_dai *codec_dai;
2728
struct snd_soc_dai_link_component codecs;
2829
struct snd_soc_dai_link_component platform;
2930
struct asoc_simple_card_data adata;
3031
} *dai_props;
3132
struct snd_soc_dai_link *dai_link;
33+
struct asoc_simple_dai *dais;
3234
struct asoc_simple_card_data adata;
3335
};
3436

@@ -47,8 +49,17 @@ static int asoc_simple_card_startup(struct snd_pcm_substream *substream)
4749
struct simple_card_data *priv = snd_soc_card_get_drvdata(rtd->card);
4850
struct simple_dai_props *dai_props =
4951
simple_priv_to_props(priv, rtd->num);
52+
int ret;
53+
54+
ret = asoc_simple_card_clk_enable(dai_props->cpu_dai);
55+
if (ret)
56+
return ret;
57+
58+
ret = asoc_simple_card_clk_enable(dai_props->codec_dai);
59+
if (ret)
60+
asoc_simple_card_clk_disable(dai_props->cpu_dai);
5061

51-
return asoc_simple_card_clk_enable(&dai_props->dai);
62+
return ret;
5263
}
5364

5465
static void asoc_simple_card_shutdown(struct snd_pcm_substream *substream)
@@ -58,7 +69,9 @@ static void asoc_simple_card_shutdown(struct snd_pcm_substream *substream)
5869
struct simple_dai_props *dai_props =
5970
simple_priv_to_props(priv, rtd->num);
6071

61-
asoc_simple_card_clk_disable(&dai_props->dai);
72+
asoc_simple_card_clk_disable(dai_props->cpu_dai);
73+
74+
asoc_simple_card_clk_disable(dai_props->codec_dai);
6275
}
6376

6477
static const struct snd_soc_ops asoc_simple_card_ops = {
@@ -68,19 +81,21 @@ static const struct snd_soc_ops asoc_simple_card_ops = {
6881

6982
static int asoc_simple_card_dai_init(struct snd_soc_pcm_runtime *rtd)
7083
{
71-
struct simple_card_data *priv = snd_soc_card_get_drvdata(rtd->card);
72-
struct snd_soc_dai *dai;
73-
struct snd_soc_dai_link *dai_link;
74-
struct simple_dai_props *dai_props;
75-
int num = rtd->num;
84+
struct simple_card_data *priv = snd_soc_card_get_drvdata(rtd->card);
85+
struct simple_dai_props *dai_props = simple_priv_to_props(priv, rtd->num);
86+
int ret;
7687

77-
dai_link = simple_priv_to_link(priv, num);
78-
dai_props = simple_priv_to_props(priv, num);
79-
dai = dai_link->dynamic ?
80-
rtd->cpu_dai :
81-
rtd->codec_dai;
88+
ret = asoc_simple_card_init_dai(rtd->codec_dai,
89+
dai_props->codec_dai);
90+
if (ret < 0)
91+
return ret;
8292

83-
return asoc_simple_card_init_dai(dai, &dai_props->dai);
93+
ret = asoc_simple_card_init_dai(rtd->cpu_dai,
94+
dai_props->cpu_dai);
95+
if (ret < 0)
96+
return ret;
97+
98+
return 0;
8499
}
85100

86101
static int asoc_simple_card_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
@@ -101,13 +116,14 @@ static int asoc_simple_card_dai_link_of(struct device_node *link,
101116
struct device_node *np,
102117
struct device_node *codec,
103118
struct simple_card_data *priv,
104-
int idx, bool is_fe,
119+
int *dai_idx, int link_idx, int is_fe,
105120
bool is_top_level_node)
106121
{
107122
struct device *dev = simple_priv_to_dev(priv);
108-
struct snd_soc_dai_link *dai_link = simple_priv_to_link(priv, idx);
109-
struct simple_dai_props *dai_props = simple_priv_to_props(priv, idx);
123+
struct snd_soc_dai_link *dai_link = simple_priv_to_link(priv, link_idx);
124+
struct simple_dai_props *dai_props = simple_priv_to_props(priv, link_idx);
110125
struct snd_soc_card *card = simple_priv_to_card(priv);
126+
struct asoc_simple_dai *dai;
111127
char *prefix = "";
112128
int ret;
113129

@@ -129,12 +145,15 @@ static int asoc_simple_card_dai_link_of(struct device_node *link,
129145
dai_link->dynamic = 1;
130146
dai_link->dpcm_merged_format = 1;
131147

148+
dai =
149+
dai_props->cpu_dai = &priv->dais[(*dai_idx)++];
150+
132151
ret = asoc_simple_card_parse_cpu(np, dai_link, DAI, CELL,
133152
&is_single_links);
134153
if (ret)
135154
return ret;
136155

137-
ret = asoc_simple_card_parse_clk_cpu(dev, np, dai_link, &dai_props->dai);
156+
ret = asoc_simple_card_parse_clk_cpu(dev, np, dai_link, dai);
138157
if (ret < 0)
139158
return ret;
140159

@@ -155,11 +174,14 @@ static int asoc_simple_card_dai_link_of(struct device_node *link,
155174
dai_link->no_pcm = 1;
156175
dai_link->be_hw_params_fixup = asoc_simple_card_be_hw_params_fixup;
157176

177+
dai =
178+
dai_props->codec_dai = &priv->dais[(*dai_idx)++];
179+
158180
ret = asoc_simple_card_parse_codec(np, dai_link, DAI, CELL);
159181
if (ret < 0)
160182
return ret;
161183

162-
ret = asoc_simple_card_parse_clk_codec(dev, np, dai_link, &dai_props->dai);
184+
ret = asoc_simple_card_parse_clk_codec(dev, np, dai_link, dai);
163185
if (ret < 0)
164186
return ret;
165187

@@ -184,7 +206,7 @@ static int asoc_simple_card_dai_link_of(struct device_node *link,
184206

185207
asoc_simple_card_parse_convert(dev, link, prefix, &dai_props->adata);
186208

187-
ret = asoc_simple_card_of_parse_tdm(np, &dai_props->dai);
209+
ret = asoc_simple_card_of_parse_tdm(np, dai);
188210
if (ret)
189211
return ret;
190212

@@ -215,7 +237,8 @@ static int asoc_simple_card_parse_of(struct simple_card_data *priv)
215237
struct device_node *codec;
216238
struct snd_soc_card *card = simple_priv_to_card(priv);
217239
bool is_fe;
218-
int ret, i, loop;
240+
int ret, loop;
241+
int dai_idx, link_idx;
219242

220243
if (!top)
221244
return -EINVAL;
@@ -231,7 +254,8 @@ static int asoc_simple_card_parse_of(struct simple_card_data *priv)
231254
asoc_simple_card_parse_convert(dev, top, PREFIX, &priv->adata);
232255

233256
loop = 1;
234-
i = 0;
257+
link_idx = 0;
258+
dai_idx = 0;
235259
node = of_get_child_by_name(top, PREFIX "dai-link");
236260
if (!node) {
237261
node = dev->of_node;
@@ -248,10 +272,10 @@ static int asoc_simple_card_parse_of(struct simple_card_data *priv)
248272
is_fe = (np != codec);
249273

250274
ret = asoc_simple_card_dai_link_of(node, np, codec, priv,
251-
i, is_fe, !loop);
275+
&dai_idx, link_idx++,
276+
is_fe, !loop);
252277
if (ret < 0)
253278
return ret;
254-
i++;
255279
}
256280
node = of_get_next_child(top, node);
257281
} while (loop && node);
@@ -342,6 +366,7 @@ static int asoc_simple_card_probe(struct platform_device *pdev)
342366
struct simple_card_data *priv;
343367
struct snd_soc_dai_link *dai_link;
344368
struct simple_dai_props *dai_props;
369+
struct asoc_simple_dai *dais;
345370
struct snd_soc_card *card;
346371
struct device *dev = &pdev->dev;
347372
int ret, i;
@@ -358,7 +383,8 @@ static int asoc_simple_card_probe(struct platform_device *pdev)
358383

359384
dai_props = devm_kcalloc(dev, lnum, sizeof(*dai_props), GFP_KERNEL);
360385
dai_link = devm_kcalloc(dev, lnum, sizeof(*dai_link), GFP_KERNEL);
361-
if (!dai_props || !dai_link)
386+
dais = devm_kcalloc(dev, dnum, sizeof(*dais), GFP_KERNEL);
387+
if (!dai_props || !dai_link || !dais)
362388
return -ENOMEM;
363389

364390
/*
@@ -375,6 +401,7 @@ static int asoc_simple_card_probe(struct platform_device *pdev)
375401

376402
priv->dai_props = dai_props;
377403
priv->dai_link = dai_link;
404+
priv->dais = dais;
378405

379406
/* Init snd_soc_card */
380407
card = simple_priv_to_card(priv);

0 commit comments

Comments
 (0)