From 4396e4f834d97919df166cac6cbc74f288465a93 Mon Sep 17 00:00:00 2001 From: Hin-Tak Leung Date: Wed, 5 Aug 2020 01:42:57 +0100 Subject: [PATCH 1/8] v4.20: support snd_soc_dai_link_component style for codec commit 710af9196ce614ee02185c2ec55e617a71843183 Author: Kuninori Morimoto Date: Fri Aug 31 03:08:24 2018 +0000 ASoC: simple-card: support snd_soc_dai_link_component style for codec Current ASoC is supporting snd_soc_dai_link_component for binding, it is more useful than current legacy style. Currently only codec is supporting it as multicodec (= codecs). CPU will support multi style in the future. We want to have it on Platform too in the future. If all Codec/CPU/Platform are replaced into snd_soc_dai_link_component style, we can remove legacy complex style. This patch supports snd_soc_dai_link_component style for simple-card for codec. --- seeed-voicecard.c | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/seeed-voicecard.c b/seeed-voicecard.c index 82e8893..5436db3 100644 --- a/seeed-voicecard.c +++ b/seeed-voicecard.c @@ -42,6 +42,7 @@ struct seeed_card_data { struct seeed_dai_props { struct asoc_simple_dai cpu_dai; struct asoc_simple_dai codec_dai; + struct snd_soc_dai_link_component codecs; /* single codec */ unsigned int mclk_fs; } *dai_props; unsigned int mclk_fs; @@ -561,7 +562,7 @@ static int seeed_voice_card_probe(struct platform_device *pdev) struct seeed_dai_props *dai_props; struct device_node *np = pdev->dev.of_node; struct device *dev = &pdev->dev; - int num, ret; + int num, ret, i; /* Get the number of DAI links */ if (np && of_get_child_by_name(np, PREFIX "dai-link")) @@ -579,6 +580,17 @@ static int seeed_voice_card_probe(struct platform_device *pdev) if (!dai_props || !dai_link) return -ENOMEM; + /* + * Use snd_soc_dai_link_component instead of legacy style + * It is codec only. but cpu/platform will be supported in the future. + * see + * soc-core.c :: snd_soc_init_multicodec() + */ + for (i = 0; i < num; i++) { + dai_link[i].codecs = &dai_props[i].codecs; + dai_link[i].num_codecs = 1; + } + priv->dai_props = dai_props; priv->dai_link = dai_link; @@ -597,6 +609,7 @@ static int seeed_voice_card_probe(struct platform_device *pdev) } } else { struct seeed_card_info *cinfo; + struct snd_soc_dai_link_component *codecs; cinfo = dev->platform_data; if (!cinfo) { @@ -613,13 +626,15 @@ static int seeed_voice_card_probe(struct platform_device *pdev) return -EINVAL; } + codecs = dai_link->codecs; + codecs->name = cinfo->codec; + codecs->dai_name = cinfo->codec_dai.name; + priv->snd_card.name = (cinfo->card) ? cinfo->card : cinfo->name; dai_link->name = cinfo->name; dai_link->stream_name = cinfo->name; dai_link->platforms->name = cinfo->platform; - dai_link->codecs->name = cinfo->codec; dai_link->cpus->dai_name = cinfo->cpu_dai.name; - dai_link->codecs->dai_name = cinfo->codec_dai.name; dai_link->dai_fmt = cinfo->daifmt; dai_link->init = asoc_simple_dai_init; memcpy(&priv->dai_props->cpu_dai, &cinfo->cpu_dai, From 953fa50f4f1c82fa90846863113790152d9c2131 Mon Sep 17 00:00:00 2001 From: Hin-Tak Leung Date: Wed, 5 Aug 2020 02:07:32 +0100 Subject: [PATCH 2/8] v4.20: support snd_soc_dai_link_component style for platform commit e58f41e41185c6906bd11c73c4e76aa5fc3ea685 Author: Kuninori Morimoto Date: Fri Aug 31 03:10:33 2018 +0000 ASoC: simple-card: support snd_soc_dai_link_component style for platform Current ASoC is supporting snd_soc_dai_link_component for binding, it is more useful than current legacy style. Currently only codec is supporting it as multicodec (= codecs). CPU will support multi style in the future. We want to have it on Platform too in the future. If all Codec/CPU/Platform are replaced into snd_soc_dai_link_component style, we can remove legacy complex style. This patch supports snd_soc_dai_link_component style for simple-card for platform. --- seeed-voicecard.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/seeed-voicecard.c b/seeed-voicecard.c index 5436db3..6a23508 100644 --- a/seeed-voicecard.c +++ b/seeed-voicecard.c @@ -43,6 +43,7 @@ struct seeed_card_data { struct asoc_simple_dai cpu_dai; struct asoc_simple_dai codec_dai; struct snd_soc_dai_link_component codecs; /* single codec */ + struct snd_soc_dai_link_component platform; unsigned int mclk_fs; } *dai_props; unsigned int mclk_fs; @@ -589,6 +590,7 @@ static int seeed_voice_card_probe(struct platform_device *pdev) for (i = 0; i < num; i++) { dai_link[i].codecs = &dai_props[i].codecs; dai_link[i].num_codecs = 1; + dai_link[i].platforms = &dai_props[i].platform; } priv->dai_props = dai_props; @@ -610,6 +612,7 @@ static int seeed_voice_card_probe(struct platform_device *pdev) } else { struct seeed_card_info *cinfo; struct snd_soc_dai_link_component *codecs; + struct snd_soc_dai_link_component *platform; cinfo = dev->platform_data; if (!cinfo) { @@ -630,10 +633,12 @@ static int seeed_voice_card_probe(struct platform_device *pdev) codecs->name = cinfo->codec; codecs->dai_name = cinfo->codec_dai.name; + platform = dai_link->platforms; + platform->name = cinfo->platform; + priv->snd_card.name = (cinfo->card) ? cinfo->card : cinfo->name; dai_link->name = cinfo->name; dai_link->stream_name = cinfo->name; - dai_link->platforms->name = cinfo->platform; dai_link->cpus->dai_name = cinfo->cpu_dai.name; dai_link->dai_fmt = cinfo->daifmt; dai_link->init = asoc_simple_dai_init; From 6afe18224aa7167f3bf7e8e1a6dded9a8a6956a0 Mon Sep 17 00:00:00 2001 From: Hin-Tak Leung Date: Wed, 5 Aug 2020 02:18:23 +0100 Subject: [PATCH 3/8] v5.1: add .num_platform for dai_link commit 910fdcabedd2354d161b1beab6ad7dc7e859651d Author: Kuninori Morimoto Date: Mon Jan 21 09:32:32 2019 +0900 ASoC: soc-core: add .num_platform for dai_link Current snd_soc_dai_link is starting to use snd_soc_dai_link_component (= modern) style for Platform, but it is still assuming single Platform so far. We will need to have multi Platform support in the not far future. Currently only simple card is using it as sound card driver, and other drivers are converted to it from legacy style by snd_soc_init_platform(). To avoid future problem of multi Platform support, let's add num_platforms before it is too late. In the same time, to make it same naming mothed, "platform" should be "platforms". This patch fixup it too. --- seeed-voicecard.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/seeed-voicecard.c b/seeed-voicecard.c index 6a23508..0b0fb8f 100644 --- a/seeed-voicecard.c +++ b/seeed-voicecard.c @@ -43,7 +43,7 @@ struct seeed_card_data { struct asoc_simple_dai cpu_dai; struct asoc_simple_dai codec_dai; struct snd_soc_dai_link_component codecs; /* single codec */ - struct snd_soc_dai_link_component platform; + struct snd_soc_dai_link_component platforms; unsigned int mclk_fs; } *dai_props; unsigned int mclk_fs; @@ -590,7 +590,8 @@ static int seeed_voice_card_probe(struct platform_device *pdev) for (i = 0; i < num; i++) { dai_link[i].codecs = &dai_props[i].codecs; dai_link[i].num_codecs = 1; - dai_link[i].platforms = &dai_props[i].platform; + dai_link[i].platforms = &dai_props[i].platforms; + dai_link[i].num_platforms = 1; } priv->dai_props = dai_props; From 51966603da5054e252f1e20162a684a66762d930 Mon Sep 17 00:00:00 2001 From: Hin-Tak Leung Date: Wed, 5 Aug 2020 02:30:53 +0100 Subject: [PATCH 4/8] v5.3: support snd_soc_dai_link_component style for cpu commit f107294c6422e772773b53dbf802186175b6289e Author: Kuninori Morimoto Date: Thu Jun 6 13:07:35 2019 +0900 ASoC: simple-card: support snd_soc_dai_link_component style for cpu ASoC supports modern style dai_link (= snd_soc_dai_link_component) for CPU. legacy style dai_link (= cpu_dai_name, cpu_name, cpu_of_node) are no longer needed. This patch switches to modern style. --- seeed-voicecard.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/seeed-voicecard.c b/seeed-voicecard.c index 0b0fb8f..2ee7966 100644 --- a/seeed-voicecard.c +++ b/seeed-voicecard.c @@ -42,6 +42,7 @@ struct seeed_card_data { struct seeed_dai_props { struct asoc_simple_dai cpu_dai; struct asoc_simple_dai codec_dai; + struct snd_soc_dai_link_component cpus; /* single cpu */ struct snd_soc_dai_link_component codecs; /* single codec */ struct snd_soc_dai_link_component platforms; unsigned int mclk_fs; @@ -588,6 +589,8 @@ static int seeed_voice_card_probe(struct platform_device *pdev) * soc-core.c :: snd_soc_init_multicodec() */ for (i = 0; i < num; i++) { + dai_link[i].cpus = &dai_props[i].cpus; + dai_link[i].num_cpus = 1; dai_link[i].codecs = &dai_props[i].codecs; dai_link[i].num_codecs = 1; dai_link[i].platforms = &dai_props[i].platforms; @@ -612,6 +615,7 @@ static int seeed_voice_card_probe(struct platform_device *pdev) } } else { struct seeed_card_info *cinfo; + struct snd_soc_dai_link_component *cpus; struct snd_soc_dai_link_component *codecs; struct snd_soc_dai_link_component *platform; @@ -630,6 +634,9 @@ static int seeed_voice_card_probe(struct platform_device *pdev) return -EINVAL; } + cpus = dai_link->cpus; + cpus->dai_name = cinfo->cpu_dai.name; + codecs = dai_link->codecs; codecs->name = cinfo->codec; codecs->dai_name = cinfo->codec_dai.name; @@ -640,7 +647,6 @@ static int seeed_voice_card_probe(struct platform_device *pdev) priv->snd_card.name = (cinfo->card) ? cinfo->card : cinfo->name; dai_link->name = cinfo->name; dai_link->stream_name = cinfo->name; - dai_link->cpus->dai_name = cinfo->cpu_dai.name; dai_link->dai_fmt = cinfo->daifmt; dai_link->init = asoc_simple_dai_init; memcpy(&priv->dai_props->cpu_dai, &cinfo->cpu_dai, From ed094dece557fca856c72b1420c4b978ac42e08d Mon Sep 17 00:00:00 2001 From: Hin-Tak Leung Date: Wed, 5 Aug 2020 03:26:15 +0100 Subject: [PATCH 5/8] v5.2: comments The init code was extracted into asoc_simple_card_init_priv(), with additional comments. commit 65a5056b21202eff7f54243e587183f4bb6ed352 Author: Kuninori Morimoto Date: Wed Mar 20 13:56:26 2019 +0900 ASoC: simple-card-utils: share asoc_simple_card_init_priv() The difference between simple-card / audio-graph are just using OF graph style, or not. In other words, other things should be same. This means, simple-card/audio-graph common functions should be implemented at simple-card-utils, and its own functions should be implemented at each files. Current simple-card / audio-graph are initializing each priv, but it is same operation. This patch adds new asoc_simple_card_init_priv() and initialize priv by same operation. --- seeed-voicecard.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/seeed-voicecard.c b/seeed-voicecard.c index 2ee7966..e8299d5 100644 --- a/seeed-voicecard.c +++ b/seeed-voicecard.c @@ -587,6 +587,10 @@ static int seeed_voice_card_probe(struct platform_device *pdev) * It is codec only. but cpu/platform will be supported in the future. * see * soc-core.c :: snd_soc_init_multicodec() + * + * "platform" might be removed + * see + * simple-card-utils.c :: asoc_simple_canonicalize_platform() */ for (i = 0; i < num; i++) { dai_link[i].cpus = &dai_props[i].cpus; From c2b419c2862d0ba5ead1007d0823c3747d9e8e49 Mon Sep 17 00:00:00 2001 From: Hin-Tak Leung Date: Wed, 5 Aug 2020 04:28:16 +0100 Subject: [PATCH 6/8] Revert "asoc_simple_card_init_dai is not exported, but asoc_simple_dai_init is, and does more" This reverts commit de22f922980be74249d0629be23236cfee1fe56a. That commit was wrong: seeed_priv_to_props() is not identical to simple_priv_props(). Conflicts: seeed-voicecard.c --- seeed-voicecard.c | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/seeed-voicecard.c b/seeed-voicecard.c index e8299d5..6b9bb81 100644 --- a/seeed-voicecard.c +++ b/seeed-voicecard.c @@ -304,6 +304,26 @@ static int asoc_simple_parse_dai(struct device_node *node, return 0; } +static int seeed_voice_card_dai_init(struct snd_soc_pcm_runtime *rtd) +{ + struct seeed_card_data *priv = snd_soc_card_get_drvdata(rtd->card); + struct snd_soc_dai *codec = rtd->codec_dai; + struct snd_soc_dai *cpu = rtd->cpu_dai; + struct seeed_dai_props *dai_props = + seeed_priv_to_props(priv, rtd->num); + int ret; + + ret = asoc_simple_init_dai(codec, &dai_props->codec_dai); + if (ret < 0) + return ret; + + ret = asoc_simple_init_dai(cpu, &dai_props->cpu_dai); + if (ret < 0) + return ret; + + return 0; +} + static int seeed_voice_card_dai_link_of(struct device_node *node, struct seeed_card_data *priv, int idx, @@ -425,7 +445,7 @@ static int seeed_voice_card_dai_link_of(struct device_node *node, goto dai_link_of_err; dai_link->ops = &seeed_voice_card_ops; - dai_link->init = asoc_simple_dai_init; + dai_link->init = seeed_voice_card_dai_init; dev_dbg(dev, "\tname : %s\n", dai_link->stream_name); dev_dbg(dev, "\tformat : %04x\n", dai_link->dai_fmt); @@ -652,7 +672,7 @@ static int seeed_voice_card_probe(struct platform_device *pdev) dai_link->name = cinfo->name; dai_link->stream_name = cinfo->name; dai_link->dai_fmt = cinfo->daifmt; - dai_link->init = asoc_simple_dai_init; + dai_link->init = seeed_voice_card_dai_init; memcpy(&priv->dai_props->cpu_dai, &cinfo->cpu_dai, sizeof(priv->dai_props->cpu_dai)); memcpy(&priv->dai_props->codec_dai, &cinfo->codec_dai, From fcbc3b6d6b4e5b0e517e9bcaf32251f200d57f71 Mon Sep 17 00:00:00 2001 From: Hin-Tak Leung Date: Wed, 5 Aug 2020 04:42:41 +0100 Subject: [PATCH 7/8] copy asoc_simple_card_init_dai() from v5.7:sound/soc/generic/simple-card-utils.c It was made private in v5.2: commit ad934ca8010843482d61fda46786449a9bc99e10 Author: Kuninori Morimoto Date: Wed Mar 20 13:55:52 2019 +0900 ASoC: simple-card-utils: share asoc_simple_dai_init() --- seeed-voicecard.c | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/seeed-voicecard.c b/seeed-voicecard.c index 6b9bb81..a620e55 100644 --- a/seeed-voicecard.c +++ b/seeed-voicecard.c @@ -304,6 +304,38 @@ static int asoc_simple_parse_dai(struct device_node *node, return 0; } +static int asoc_simple_init_dai(struct snd_soc_dai *dai, + struct asoc_simple_dai *simple_dai) +{ + int ret; + + if (!simple_dai) + return 0; + + if (simple_dai->sysclk) { + ret = snd_soc_dai_set_sysclk(dai, 0, simple_dai->sysclk, + simple_dai->clk_direction); + if (ret && ret != -ENOTSUPP) { + dev_err(dai->dev, "simple-card: set_sysclk error\n"); + return ret; + } + } + + if (simple_dai->slots) { + ret = snd_soc_dai_set_tdm_slot(dai, + simple_dai->tx_slot_mask, + simple_dai->rx_slot_mask, + simple_dai->slots, + simple_dai->slot_width); + if (ret && ret != -ENOTSUPP) { + dev_err(dai->dev, "simple-card: set_tdm_slot error\n"); + return ret; + } + } + + return 0; +} + static int seeed_voice_card_dai_init(struct snd_soc_pcm_runtime *rtd) { struct seeed_card_data *priv = snd_soc_card_get_drvdata(rtd->card); From 0be1de9750b18a244244d0ed0ca19d1bc4a1b2b9 Mon Sep 17 00:00:00 2001 From: Hin-Tak Leung Date: Wed, 5 Aug 2020 05:26:01 +0100 Subject: [PATCH 8/8] Revert previous over-zealous "rename asoc_simple_card_xxx() to asoc_simple_()" Two of them should not have been changed, as they were protected and intended for older kernels. --- seeed-voicecard.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/seeed-voicecard.c b/seeed-voicecard.c index a620e55..0ba8b72 100644 --- a/seeed-voicecard.c +++ b/seeed-voicecard.c @@ -445,7 +445,7 @@ static int seeed_voice_card_dai_link_of(struct device_node *node, goto dai_link_of_err; #if LINUX_VERSION_CODE <= KERNEL_VERSION(4,10,0) - ret = asoc_simple_parse_clk_cpu(cpu, dai_link, cpu_dai); + ret = asoc_simple_card_parse_clk_cpu(cpu, dai_link, cpu_dai); #else ret = asoc_simple_parse_clk_cpu(dev, cpu, dai_link, cpu_dai); #endif @@ -453,7 +453,7 @@ static int seeed_voice_card_dai_link_of(struct device_node *node, goto dai_link_of_err; #if LINUX_VERSION_CODE <= KERNEL_VERSION(4,10,0) - ret = asoc_simple_parse_clk_codec(codec, dai_link, codec_dai); + ret = asoc_simple_card_parse_clk_codec(codec, dai_link, codec_dai); #else ret = asoc_simple_parse_clk_codec(dev, codec, dai_link, codec_dai); #endif