Message ID | 87v9xjfjgo.wl-kuninori.morimoto.gx@renesas.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | ASoC: modern dai_link style support | expand |
On 06 Jun 2019 13:19:14 +0900 Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> wrote: > From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> > > ASoC is now supporting modern style dai_link > (= snd_soc_dai_link_component) for CPU/Codec/Platform. > This patch switches to use it. > > Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> > --- > sound/soc/soc-topology.c | 22 ++++++++++++++++------ > 1 file changed, 16 insertions(+), 6 deletions(-) > > diff --git a/sound/soc/soc-topology.c b/sound/soc/soc-topology.c > index 3299ebb..f485f7f 100644 > --- a/sound/soc/soc-topology.c > +++ b/sound/soc/soc-topology.c > @@ -560,7 +560,7 @@ static void remove_link(struct snd_soc_component > *comp, > kfree(link->name); > kfree(link->stream_name); > - kfree(link->cpu_dai_name); > + kfree(link->cpus->dai_name); > > list_del(&dobj->list); > snd_soc_remove_dai_link(comp->card, link); > @@ -1879,12 +1879,22 @@ static int soc_tplg_fe_link_create(struct > soc_tplg *tplg, struct snd_soc_tplg_pcm *pcm) > { > struct snd_soc_dai_link *link; > + struct snd_soc_dai_link_component *dlc; > int ret; > > - link = kzalloc(sizeof(struct snd_soc_dai_link), GFP_KERNEL); > + /* link + cpu + codec */ > + link = kzalloc(sizeof(*link) + (2 * sizeof(*dlc)), > GFP_KERNEL); if (link == NULL) > return -ENOMEM; > > + dlc = (struct snd_soc_dai_link_component *)(link + 1); > + > + link->cpus = &dlc[0]; > + link->codecs = &dlc[1]; While I understand what is going on here, I find this bit ugly. Can it perhaps be changed to something like: link = kzalloc(sizeof(*link), GFP_KERNEL); if (link == NULL) return -ENOMEM; link->cpus = kzalloc(sizeof(*dlc), GFP_KERNEL); if (link->cpus == NULL) { ret = -ENOMEM; goto err; } link->codecs = kzalloc(sizeof(*dlc), GFP_KERNEL); if (link->cpus == NULL) { ret = -ENOMEM; goto err; } (...) err: kfree(link->cpus); kfree(link); return ret; While it has a bit more of boiler plate it's easier to follow. And while I look at soc_tplg_fe_link_create() it could use some more memory checks, but it's a topic for separate patch. > + > + link->num_cpus = 1; > + link->num_codecs = 1; > + > if (strlen(pcm->pcm_name)) { > link->name = kstrdup(pcm->pcm_name, GFP_KERNEL); > link->stream_name = kstrdup(pcm->pcm_name, > GFP_KERNEL); @@ -1892,10 +1902,10 @@ static int > soc_tplg_fe_link_create(struct soc_tplg *tplg, link->id = > le32_to_cpu(pcm->pcm_id); > if (strlen(pcm->dai_name)) > - link->cpu_dai_name = kstrdup(pcm->dai_name, > GFP_KERNEL); > + link->cpus->dai_name = kstrdup(pcm->dai_name, > GFP_KERNEL); > - link->codec_name = "snd-soc-dummy"; > - link->codec_dai_name = "snd-soc-dummy-dai"; > + link->codecs->name = "snd-soc-dummy"; > + link->codecs->dai_name = "snd-soc-dummy-dai"; > > /* enable DPCM */ > link->dynamic = 1; > @@ -1912,7 +1922,7 @@ static int soc_tplg_fe_link_create(struct > soc_tplg *tplg, dev_err(tplg->comp->dev, "ASoC: FE link loading > failed\n"); kfree(link->name); > kfree(link->stream_name); > - kfree(link->cpu_dai_name); > + kfree(link->cpus->dai_name); > kfree(link); > return ret; > }
>> diff --git a/sound/soc/soc-topology.c b/sound/soc/soc-topology.c >> index 3299ebb..f485f7f 100644 >> --- a/sound/soc/soc-topology.c >> +++ b/sound/soc/soc-topology.c >> @@ -560,7 +560,7 @@ static void remove_link(struct snd_soc_component >> *comp, >> kfree(link->name); >> kfree(link->stream_name); >> - kfree(link->cpu_dai_name); >> + kfree(link->cpus->dai_name); >> >> list_del(&dobj->list); >> snd_soc_remove_dai_link(comp->card, link); >> @@ -1879,12 +1879,22 @@ static int soc_tplg_fe_link_create(struct >> soc_tplg *tplg, struct snd_soc_tplg_pcm *pcm) >> { >> struct snd_soc_dai_link *link; >> + struct snd_soc_dai_link_component *dlc; >> int ret; >> >> - link = kzalloc(sizeof(struct snd_soc_dai_link), GFP_KERNEL); >> + /* link + cpu + codec */ >> + link = kzalloc(sizeof(*link) + (2 * sizeof(*dlc)), >> GFP_KERNEL); if (link == NULL) >> return -ENOMEM; >> >> + dlc = (struct snd_soc_dai_link_component *)(link + 1); >> + >> + link->cpus = &dlc[0]; >> + link->codecs = &dlc[1]; > > While I understand what is going on here, I find this bit ugly. It's not so bad and it avoid multiple tests and tags that are just as ugly IMHO. > Can it perhaps be changed to something like: > > link = kzalloc(sizeof(*link), GFP_KERNEL); > if (link == NULL) > return -ENOMEM; > link->cpus = kzalloc(sizeof(*dlc), GFP_KERNEL); > if (link->cpus == NULL) { > ret = -ENOMEM; > goto err; > } > link->codecs = kzalloc(sizeof(*dlc), GFP_KERNEL); > if (link->cpus == NULL) { > ret = -ENOMEM; > goto err; > } > > (...) > err: > kfree(link->cpus); > kfree(link); > return ret; > > While it has a bit more of boiler plate it's easier to follow. > > And while I look at soc_tplg_fe_link_create() it could use some > more memory checks, but it's a topic for separate patch.
Hi Amadeusz Thank you for your feedback > >> + /* link + cpu + codec */ > >> + link = kzalloc(sizeof(*link) + (2 * sizeof(*dlc)), > >> GFP_KERNEL); if (link == NULL) > >> return -ENOMEM; > >> + dlc = (struct snd_soc_dai_link_component *)(link + 1); > >> + > >> + link->cpus = &dlc[0]; > >> + link->codecs = &dlc[1]; > > > > While I understand what is going on here, I find this bit ugly. > > It's not so bad and it avoid multiple tests and tags that are just as > ugly IMHO. Yeah, it is using a little bit tricky method. > > Can it perhaps be changed to something like: > > > > link = kzalloc(sizeof(*link), GFP_KERNEL); > > if (link == NULL) > > return -ENOMEM; > > link->cpus = kzalloc(sizeof(*dlc), GFP_KERNEL); > > if (link->cpus == NULL) { > > ret = -ENOMEM; > > goto err; > > } > > link->codecs = kzalloc(sizeof(*dlc), GFP_KERNEL); > > if (link->cpus == NULL) { > > ret = -ENOMEM; > > goto err; > > } From "logic" point of view, I think this patch has no bug, but from "readable code" point of view, I have no objection to exchange like above. I'm not familiar with this driver, so, can you handle it by incremental patch if you want? Thank you for your help !! Best regards --- Kuninori Morimoto
diff --git a/sound/soc/soc-topology.c b/sound/soc/soc-topology.c index 3299ebb..f485f7f 100644 --- a/sound/soc/soc-topology.c +++ b/sound/soc/soc-topology.c @@ -560,7 +560,7 @@ static void remove_link(struct snd_soc_component *comp, kfree(link->name); kfree(link->stream_name); - kfree(link->cpu_dai_name); + kfree(link->cpus->dai_name); list_del(&dobj->list); snd_soc_remove_dai_link(comp->card, link); @@ -1879,12 +1879,22 @@ static int soc_tplg_fe_link_create(struct soc_tplg *tplg, struct snd_soc_tplg_pcm *pcm) { struct snd_soc_dai_link *link; + struct snd_soc_dai_link_component *dlc; int ret; - link = kzalloc(sizeof(struct snd_soc_dai_link), GFP_KERNEL); + /* link + cpu + codec */ + link = kzalloc(sizeof(*link) + (2 * sizeof(*dlc)), GFP_KERNEL); if (link == NULL) return -ENOMEM; + dlc = (struct snd_soc_dai_link_component *)(link + 1); + + link->cpus = &dlc[0]; + link->codecs = &dlc[1]; + + link->num_cpus = 1; + link->num_codecs = 1; + if (strlen(pcm->pcm_name)) { link->name = kstrdup(pcm->pcm_name, GFP_KERNEL); link->stream_name = kstrdup(pcm->pcm_name, GFP_KERNEL); @@ -1892,10 +1902,10 @@ static int soc_tplg_fe_link_create(struct soc_tplg *tplg, link->id = le32_to_cpu(pcm->pcm_id); if (strlen(pcm->dai_name)) - link->cpu_dai_name = kstrdup(pcm->dai_name, GFP_KERNEL); + link->cpus->dai_name = kstrdup(pcm->dai_name, GFP_KERNEL); - link->codec_name = "snd-soc-dummy"; - link->codec_dai_name = "snd-soc-dummy-dai"; + link->codecs->name = "snd-soc-dummy"; + link->codecs->dai_name = "snd-soc-dummy-dai"; /* enable DPCM */ link->dynamic = 1; @@ -1912,7 +1922,7 @@ static int soc_tplg_fe_link_create(struct soc_tplg *tplg, dev_err(tplg->comp->dev, "ASoC: FE link loading failed\n"); kfree(link->name); kfree(link->stream_name); - kfree(link->cpu_dai_name); + kfree(link->cpus->dai_name); kfree(link); return ret; }