[alsa-devel] [PATCH 0/2 v6] ASoC: mediatek: Add second I2S on mt8173-rt5650 machine driver
Because applied patch (commit 0beeb8d0b434b8b007ac8058fb2cac5997fff6df "ASoC: mediatek: Add second I2S on mt8173-rt5650 machine driver") is dropped, I upload new version which include dependent patch.
Changes since v5: - add "ASoC: core: export snd_soc_get_dai_name" patch. Because snd_soc_of_get_dai_name() fix the property name "sound-dai". Our patch needs to change name to use, so export snd_soc_get_dai_name() which is included in snd_soc_of_get_dai_name().
Changes since v4: Change name from "sound-dai" to "capture-dai" to determine the capture path
Changes since v2,v3: Fix unclear code and use sound-dai to determine the capture path
Changes since v1: Use codec dai name to determine the capture path.
Jean-Francois Moine (1): ASoC: core: export snd_soc_get_dai_name
PC Liao (1): ASoC: mediatek: Add second I2S on mt8173-rt5650 machine driver
.../devicetree/bindings/sound/mt8173-rt5650.txt | 6 +++ include/sound/soc.h | 2 + sound/soc/mediatek/mt8173-rt5650.c | 44 ++++++++++++++++++-- sound/soc/soc-core.c | 5 ++- 4 files changed, 52 insertions(+), 5 deletions(-)
From: Jean-Francois Moine moinejf@free.fr
snd_soc_get_dai_name() may be used to define a sound card with a different syntax from the one of the simple-card.
Signed-off-by: Jean-Francois Moine moinejf@free.fr Signed-off-by: PC Liao pc.liao@mediatek.com --- include/sound/soc.h | 2 ++ sound/soc/soc-core.c | 5 +++-- 2 files changed, 5 insertions(+), 2 deletions(-)
diff --git a/include/sound/soc.h b/include/sound/soc.h index 02b4a21..03b2d19 100644 --- a/include/sound/soc.h +++ b/include/sound/soc.h @@ -1669,6 +1669,8 @@ unsigned int snd_soc_of_parse_daifmt(struct device_node *np, const char *prefix, struct device_node **bitclkmaster, struct device_node **framemaster); +int snd_soc_get_dai_name(struct of_phandle_args *args, + const char **dai_name); int snd_soc_of_get_dai_name(struct device_node *of_node, const char **dai_name); int snd_soc_of_get_dai_link_codecs(struct device *dev, diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c index d2e62b15..69cbbb0 100644 --- a/sound/soc/soc-core.c +++ b/sound/soc/soc-core.c @@ -3786,8 +3786,8 @@ unsigned int snd_soc_of_parse_daifmt(struct device_node *np, } EXPORT_SYMBOL_GPL(snd_soc_of_parse_daifmt);
-static int snd_soc_get_dai_name(struct of_phandle_args *args, - const char **dai_name) +int snd_soc_get_dai_name(struct of_phandle_args *args, + const char **dai_name) { struct snd_soc_component *pos; struct device_node *component_of_node; @@ -3838,6 +3838,7 @@ static int snd_soc_get_dai_name(struct of_phandle_args *args, mutex_unlock(&client_mutex); return ret; } +EXPORT_SYMBOL_GPL(snd_soc_get_dai_name);
int snd_soc_of_get_dai_name(struct device_node *of_node, const char **dai_name)
This patch adds second I2S connection to rt5650 codec for capture path on mt8173-rt5650 machine driver.
Signed-off-by: PC Liao pc.liao@mediatek.com --- .../devicetree/bindings/sound/mt8173-rt5650.txt | 6 +++ sound/soc/mediatek/mt8173-rt5650.c | 44 ++++++++++++++++++-- 2 files changed, 47 insertions(+), 3 deletions(-)
diff --git a/Documentation/devicetree/bindings/sound/mt8173-rt5650.txt b/Documentation/devicetree/bindings/sound/mt8173-rt5650.txt index fe5a5ef..802dd1b 100644 --- a/Documentation/devicetree/bindings/sound/mt8173-rt5650.txt +++ b/Documentation/devicetree/bindings/sound/mt8173-rt5650.txt @@ -5,11 +5,17 @@ Required properties: - mediatek,audio-codec: the phandles of rt5650 codecs - mediatek,platform: the phandle of MT8173 ASoC platform
+Optional properties: +- capture-dai: audio codec dai on capture path + <&rt5650 0> : Default setting. Connect rt5650 I2S1 for capture. (dai_name = rt5645-aif1) + <&rt5650 1> : Connect rt5650 I2S2 for capture. (dai_name = rt5645-aif2) + Example:
sound { compatible = "mediatek,mt8173-rt5650"; mediatek,audio-codec = <&rt5650>; mediatek,platform = <&afe>; + capture-dai = <&rt5650 1>; };
diff --git a/sound/soc/mediatek/mt8173-rt5650.c b/sound/soc/mediatek/mt8173-rt5650.c index bb09bb1..45dea22 100644 --- a/sound/soc/mediatek/mt8173-rt5650.c +++ b/sound/soc/mediatek/mt8173-rt5650.c @@ -85,12 +85,26 @@ static int mt8173_rt5650_init(struct snd_soc_pcm_runtime *runtime) { struct snd_soc_card *card = runtime->card; struct snd_soc_codec *codec = runtime->codec_dais[0]->codec; + const char *codec_dai_capture = runtime->codec_dais[1]->name; int ret;
rt5645_sel_asrc_clk_src(codec, - RT5645_DA_STEREO_FILTER | - RT5645_AD_STEREO_FILTER, + RT5645_DA_STEREO_FILTER, RT5645_CLK_SEL_I2S1_ASRC); + + if (!strcmp(codec_dai_capture, "rt5645-aif1")) { + rt5645_sel_asrc_clk_src(codec, + RT5645_AD_STEREO_FILTER, + RT5645_CLK_SEL_I2S1_ASRC); + } else if (!strcmp(codec_dai_capture, "rt5645-aif2")) { + rt5645_sel_asrc_clk_src(codec, + RT5645_AD_STEREO_FILTER, + RT5645_CLK_SEL_I2S2_ASRC); + } else { + dev_err(card->dev, "Can't get the right codec dai\n"); + return -EINVAL; + } + /* enable jack detection */ ret = snd_soc_card_jack_new(card, "Headset Jack", SND_JACK_HEADPHONE | SND_JACK_MICROPHONE | @@ -110,6 +124,11 @@ static int mt8173_rt5650_init(struct snd_soc_pcm_runtime *runtime)
static struct snd_soc_dai_link_component mt8173_rt5650_codecs[] = { { + /* Playback */ + .dai_name = "rt5645-aif1", + }, + { + /* Capture */ .dai_name = "rt5645-aif1", }, }; @@ -149,7 +168,7 @@ static struct snd_soc_dai_link mt8173_rt5650_dais[] = { .cpu_dai_name = "I2S", .no_pcm = 1, .codecs = mt8173_rt5650_codecs, - .num_codecs = 1, + .num_codecs = 2, .init = mt8173_rt5650_init, .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBS_CFS, @@ -177,6 +196,8 @@ static int mt8173_rt5650_dev_probe(struct platform_device *pdev) { struct snd_soc_card *card = &mt8173_rt5650_card; struct device_node *platform_node; + const char *codec_dai_capture; + struct of_phandle_args args; int i, ret;
platform_node = of_parse_phandle(pdev->dev.of_node, @@ -199,6 +220,23 @@ static int mt8173_rt5650_dev_probe(struct platform_device *pdev) "Property 'audio-codec' missing or invalid\n"); return -EINVAL; } + mt8173_rt5650_codecs[1].of_node = mt8173_rt5650_codecs[0].of_node; + + if (device_property_present(&pdev->dev, "capture-dai")) { + ret = of_parse_phandle_with_args(pdev->dev.of_node, + "capture-dai", + "#sound-dai-cells", 0, &args); + if (ret < 0) { + dev_err(&pdev->dev, + "%s capture-dai name fail %d\n", + __func__, ret); + return ret; + } + + ret = snd_soc_get_dai_name(&args, &codec_dai_capture); + mt8173_rt5650_codecs[1].dai_name = codec_dai_capture; + } + card->dev = &pdev->dev; platform_set_drvdata(pdev, card);
On Wed, Apr 20, 2016 at 02:40:47PM +0800, PC Liao wrote:
+Optional properties: +- capture-dai: audio codec dai on capture path
- <&rt5650 0> : Default setting. Connect rt5650 I2S1 for capture. (dai_name = rt5645-aif1)
- <&rt5650 1> : Connect rt5650 I2S2 for capture. (dai_name = rt5645-aif2)
I sugggested changing this to use a subnode but you've ignored my suggestion...
Hi Mark,
On Wed, 2016-04-20 at 16:29 +0800, Mark Brown wrote:
On Wed, Apr 20, 2016 at 02:40:47PM +0800, PC Liao wrote:
+Optional properties: +- capture-dai: audio codec dai on capture path
- <&rt5650 0> : Default setting. Connect rt5650 I2S1 for capture. (dai_name = rt5645-aif1)
- <&rt5650 1> : Connect rt5650 I2S2 for capture. (dai_name = rt5645-aif2)
I sugggested changing this to use a subnode but you've ignored my suggestion...
Sorry.... It's my mistake.
You mean that using a subnode. This is my example:
codec-capture { sound-dai = <&rt5650 1>; };
Does this is your suggestion? Thanks!
On Wed, Apr 20, 2016 at 05:39:50PM +0800, PC Liao wrote:
On Wed, 2016-04-20 at 16:29 +0800, Mark Brown wrote:
On Wed, Apr 20, 2016 at 02:40:47PM +0800, PC Liao wrote:
+Optional properties: +- capture-dai: audio codec dai on capture path
- <&rt5650 0> : Default setting. Connect rt5650 I2S1 for capture. (dai_name = rt5645-aif1)
- <&rt5650 1> : Connect rt5650 I2S2 for capture. (dai_name = rt5645-aif2)
I sugggested changing this to use a subnode but you've ignored my suggestion...
Sorry.... It's my mistake.
You mean that using a subnode. This is my example:
codec-capture { sound-dai = <&rt5650 1>; };
Does this is your suggestion?
Yeah. Having refreshed my mind about the APIs a bit the idea is that if you do things this way then any additional parameters that are needed for the DAI can be added within the subnode.
On 20/04/16 08:40, PC Liao wrote:
This patch adds second I2S connection to rt5650 codec for capture path on mt8173-rt5650 machine driver.
Signed-off-by: PC Liao pc.liao@mediatek.com
.../devicetree/bindings/sound/mt8173-rt5650.txt | 6 +++ sound/soc/mediatek/mt8173-rt5650.c | 44 ++++++++++++++++++-- 2 files changed, 47 insertions(+), 3 deletions(-)
diff --git a/Documentation/devicetree/bindings/sound/mt8173-rt5650.txt b/Documentation/devicetree/bindings/sound/mt8173-rt5650.txt index fe5a5ef..802dd1b 100644 --- a/Documentation/devicetree/bindings/sound/mt8173-rt5650.txt +++ b/Documentation/devicetree/bindings/sound/mt8173-rt5650.txt @@ -5,11 +5,17 @@ Required properties:
- mediatek,audio-codec: the phandles of rt5650 codecs
- mediatek,platform: the phandle of MT8173 ASoC platform
+Optional properties: +- capture-dai: audio codec dai on capture path
<&rt5650 0> : Default setting. Connect rt5650 I2S1 for capture. (dai_name = rt5645-aif1)
<&rt5650 1> : Connect rt5650 I2S2 for capture. (dai_name = rt5645-aif2)
Example:
sound { compatible = "mediatek,mt8173-rt5650"; mediatek,audio-codec = <&rt5650>; mediatek,platform = <&afe>;
capture-dai = <&rt5650 1>;
};
diff --git a/sound/soc/mediatek/mt8173-rt5650.c b/sound/soc/mediatek/mt8173-rt5650.c index bb09bb1..45dea22 100644 --- a/sound/soc/mediatek/mt8173-rt5650.c +++ b/sound/soc/mediatek/mt8173-rt5650.c @@ -85,12 +85,26 @@ static int mt8173_rt5650_init(struct snd_soc_pcm_runtime *runtime) { struct snd_soc_card *card = runtime->card; struct snd_soc_codec *codec = runtime->codec_dais[0]->codec;
const char *codec_dai_capture = runtime->codec_dais[1]->name; int ret;
rt5645_sel_asrc_clk_src(codec,
RT5645_DA_STEREO_FILTER |
RT5645_AD_STEREO_FILTER,
RT5645_DA_STEREO_FILTER, RT5645_CLK_SEL_I2S1_ASRC);
- if (!strcmp(codec_dai_capture, "rt5645-aif1")) {
rt5645_sel_asrc_clk_src(codec,
RT5645_AD_STEREO_FILTER,
RT5645_CLK_SEL_I2S1_ASRC);
- } else if (!strcmp(codec_dai_capture, "rt5645-aif2")) {
rt5645_sel_asrc_clk_src(codec,
RT5645_AD_STEREO_FILTER,
RT5645_CLK_SEL_I2S2_ASRC);
- } else {
For compatibility you should change this to something like:
dev_warn(card->dev, "Only one dai codec found in DTS, enabled rt5645 AD filter\n"); rt5645_sel_asrc_clk_src(codec, RT5645_AD_STEREO_FILTER, RT5645_CLK_SEL_I2S1_ASRC); }
Regards, Matthias
Hi Matthias,
On Wed, 2016-04-20 at 21:30 +0800, Matthias Brugger wrote:
For compatibility you should change this to something like:
dev_warn(card->dev, "Only one dai codec found in DTS, enabled rt5645 AD filter\n"); rt5645_sel_asrc_clk_src(codec, RT5645_AD_STEREO_FILTER, RT5645_CLK_SEL_I2S1_ASRC);
}
I will use this in next version. Thanks!
On 20/04/16 18:27, PC Liao wrote:
Hi Matthias,
On Wed, 2016-04-20 at 21:30 +0800, Matthias Brugger wrote:
For compatibility you should change this to something like:
dev_warn(card->dev, "Only one dai codec found in DTS, enabled rt5645 AD filter\n"); rt5645_sel_asrc_clk_src(codec, RT5645_AD_STEREO_FILTER, RT5645_CLK_SEL_I2S1_ASRC);
}
I will use this in next version. Thanks!
I think you forgot to add this to v7 of the patches.
Cheers, Matthias
Hi Matthias,
On Thu, 2016-04-21 at 17:22 +0800, Matthias Brugger wrote:
On 20/04/16 18:27, PC Liao wrote:
Hi Matthias,
On Wed, 2016-04-20 at 21:30 +0800, Matthias Brugger wrote:
For compatibility you should change this to something like:
dev_warn(card->dev, "Only one dai codec found in DTS, enabled rt5645 AD filter\n"); rt5645_sel_asrc_clk_src(codec, RT5645_AD_STEREO_FILTER, RT5645_CLK_SEL_I2S1_ASRC);
}
I will use this in next version. Thanks!
I think you forgot to add this to v7 of the patches.
Cheers, Matthias
Oh, sorry. I misunderstand your suggestion. I will upload. Thanks!
participants (3)
-
Mark Brown
-
Matthias Brugger
-
PC Liao