Message ID | 20170905041401.23866-1-jeffy.chen@rock-chips.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
El Tue, Sep 05, 2017 at 12:14:01PM +0800 Jeffy Chen ha dit: > Currently we are using a fixed list of dapm routes. > > Init dapm routes dynamically when parsing dailinks, since we are > supporting optional codecs. > > Signed-off-by: Jeffy Chen <jeffy.chen@rock-chips.com> > --- > > sound/soc/rockchip/rk3399_gru_sound.c | 88 +++++++++++++++++++++++++++++------ > 1 file changed, 74 insertions(+), 14 deletions(-) > > diff --git a/sound/soc/rockchip/rk3399_gru_sound.c b/sound/soc/rockchip/rk3399_gru_sound.c > index 0513fe480353..c537781f8054 100644 > --- a/sound/soc/rockchip/rk3399_gru_sound.c > +++ b/sound/soc/rockchip/rk3399_gru_sound.c > @@ -47,18 +47,7 @@ static const struct snd_soc_dapm_widget rockchip_dapm_widgets[] = { > SND_SOC_DAPM_SPK("Speakers", NULL), > SND_SOC_DAPM_MIC("Headset Mic", NULL), > SND_SOC_DAPM_MIC("Int Mic", NULL), > -}; > - > -static const struct snd_soc_dapm_route rockchip_dapm_routes[] = { > - /* Input Lines */ > - {"MIC", NULL, "Headset Mic"}, > - {"DMIC1L", NULL, "Int Mic"}, > - {"DMIC1R", NULL, "Int Mic"}, > - > - /* Output Lines */ > - {"Headphones", NULL, "HPL"}, > - {"Headphones", NULL, "HPR"}, > - {"Speakers", NULL, "Speaker"}, > + SND_SOC_DAPM_LINE("HDMI", NULL), The HDMI items are newly added, I think a separate patch would be preferable. > }; > > static const struct snd_kcontrol_new rockchip_controls[] = { > @@ -66,6 +55,7 @@ static const struct snd_kcontrol_new rockchip_controls[] = { > SOC_DAPM_PIN_SWITCH("Speakers"), > SOC_DAPM_PIN_SWITCH("Headset Mic"), > SOC_DAPM_PIN_SWITCH("Int Mic"), > + SOC_DAPM_PIN_SWITCH("HDMI"), > }; > > static int rockchip_sound_max98357a_hw_params(struct snd_pcm_substream *substream, > @@ -314,8 +304,6 @@ static struct snd_soc_card rockchip_sound_card = { > .owner = THIS_MODULE, > .dapm_widgets = rockchip_dapm_widgets, > .num_dapm_widgets = ARRAY_SIZE(rockchip_dapm_widgets), > - .dapm_routes = rockchip_dapm_routes, > - .num_dapm_routes = ARRAY_SIZE(rockchip_dapm_routes), > .controls = rockchip_controls, > .num_controls = ARRAY_SIZE(rockchip_controls), > }; > @@ -391,6 +379,65 @@ static const struct snd_soc_dai_link rockchip_dais[] = { > }, > }; > > +static const struct snd_soc_dapm_route rockchip_sound_cdndp_routes[] = { > + /* Output */ > + {"HDMI", NULL, "TX"}, > +}; > + > +static const struct snd_soc_dapm_route rockchip_sound_da7219_routes[] = { > + /* Output */ > + {"Headphones", NULL, "HPL"}, > + {"Headphones", NULL, "HPR"}, > + > + /* Input */ > + {"MIC", NULL, "Headset Mic"}, > +}; > + > +static const struct snd_soc_dapm_route rockchip_sound_dmic_routes[] = { > + /* Input */ > + {"Dmic", NULL, "Int Mic"}, Should be "DMic" as in dmic_dapm_widgets of the dmic codec driver. This route is also new and would probably be better added in a separate patch. > +}; > + > +static const struct snd_soc_dapm_route rockchip_sound_max98357a_routes[] = { > + /* Output */ > + {"Speakers", NULL, "Speaker"}, > +}; > + > +static const struct snd_soc_dapm_route rockchip_sound_rt5514_routes[] = { > + /* Input */ > + {"DMIC1L", NULL, "Int Mic"}, > + {"DMIC1R", NULL, "Int Mic"}, > +}; > + > +struct rockchip_sound_route { > + const struct snd_soc_dapm_route *routes; > + int num_routes; > +}; > + > +static const struct rockchip_sound_route rockchip_routes[] = { > + [DAILINK_CDNDP] = { > + .routes = rockchip_sound_cdndp_routes, > + .num_routes = ARRAY_SIZE(rockchip_sound_cdndp_routes), > + }, > + [DAILINK_DA7219] = { > + .routes = rockchip_sound_da7219_routes, > + .num_routes = ARRAY_SIZE(rockchip_sound_da7219_routes), > + }, > + [DAILINK_DMIC] = { > + .routes = rockchip_sound_dmic_routes, > + .num_routes = ARRAY_SIZE(rockchip_sound_dmic_routes), > + }, > + [DAILINK_MAX98357A] = { > + .routes = rockchip_sound_max98357a_routes, > + .num_routes = ARRAY_SIZE(rockchip_sound_max98357a_routes), > + }, > + [DAILINK_RT5514] = { > + .routes = rockchip_sound_rt5514_routes, > + .num_routes = ARRAY_SIZE(rockchip_sound_rt5514_routes), > + }, > + [DAILINK_RT5514_DSP] = {}, > +}; > + > static int rockchip_sound_codec_node_match(struct device_node *np_codec) > { > int i; > @@ -408,6 +455,7 @@ static int rockchip_sound_of_parse_dais(struct device *dev, > struct device_node *np_cpu, *np_cpu0, *np_cpu1; > struct device_node *np_codec; > struct snd_soc_dai_link *dai; > + struct snd_soc_dapm_route *routes; > int i, index; > > card->dai_link = devm_kzalloc(dev, sizeof(rockchip_dais), > @@ -415,9 +463,16 @@ static int rockchip_sound_of_parse_dais(struct device *dev, > if (!card->dai_link) > return -ENOMEM; > > + routes = devm_kzalloc(dev, sizeof(rockchip_routes), > + GFP_KERNEL); > + if (!routes) > + return -ENOMEM; > + card->dapm_routes = routes; > + > np_cpu0 = of_parse_phandle(dev->of_node, "rockchip,cpu", 0); > np_cpu1 = of_parse_phandle(dev->of_node, "rockchip,cpu", 1); > > + card->num_dapm_routes = 0; > card->num_links = 0; > for (i = 0; i < ARRAY_SIZE(rockchip_dais); i++) { > np_codec = of_parse_phandle(dev->of_node, > @@ -445,6 +500,11 @@ static int rockchip_sound_of_parse_dais(struct device *dev, > dai->codec_of_node = np_codec; > dai->platform_of_node = np_cpu; > dai->cpu_of_node = np_cpu; > + > + memcpy(routes + card->num_dapm_routes, > + rockchip_routes[index].routes, > + rockchip_routes[index].num_routes * sizeof(*routes)); > + card->num_dapm_routes += rockchip_routes[index].num_routes; > } > > return 0; Reviewed-by: Matthias Kaehlcke <mka@chromium.org> Tested-by: Matthias Kaehlcke <mka@chromium.org>
Hi Matthias, Thanks for your test and review. On 09/16/2017 08:54 AM, Matthias Kaehlcke wrote: >> -static const struct snd_soc_dapm_route rockchip_dapm_routes[] = { >> >- /* Input Lines */ >> >- {"MIC", NULL, "Headset Mic"}, >> >- {"DMIC1L", NULL, "Int Mic"}, >> >- {"DMIC1R", NULL, "Int Mic"}, >> >- >> >- /* Output Lines */ >> >- {"Headphones", NULL, "HPL"}, >> >- {"Headphones", NULL, "HPR"}, >> >- {"Speakers", NULL, "Speaker"}, >> >+ SND_SOC_DAPM_LINE("HDMI", NULL), > The HDMI items are newly added, I think a separate patch would be > preferable. ok, will do > >> > }; >> > >> > static const struct snd_kcontrol_new rockchip_controls[] = { >> >@@ -66,6 +55,7 @@ static const struct snd_kcontrol_new rockchip_controls[] = { >> > SOC_DAPM_PIN_SWITCH("Speakers"), >> > SOC_DAPM_PIN_SWITCH("Headset Mic"), >> > SOC_DAPM_PIN_SWITCH("Int Mic"), >> >+ SOC_DAPM_PIN_SWITCH("HDMI"), >> > }; >> > >> > static int rockchip_sound_max98357a_hw_params(struct snd_pcm_substream *substream, >> >@@ -314,8 +304,6 @@ static struct snd_soc_card rockchip_sound_card = { >> > .owner = THIS_MODULE, >> > .dapm_widgets = rockchip_dapm_widgets, >> > .num_dapm_widgets = ARRAY_SIZE(rockchip_dapm_widgets), >> >- .dapm_routes = rockchip_dapm_routes, >> >- .num_dapm_routes = ARRAY_SIZE(rockchip_dapm_routes), >> > .controls = rockchip_controls, >> > .num_controls = ARRAY_SIZE(rockchip_controls), >> > }; >> >@@ -391,6 +379,65 @@ static const struct snd_soc_dai_link rockchip_dais[] = { >> > }, >> > }; >> > >> >+static const struct snd_soc_dapm_route rockchip_sound_cdndp_routes[] = { >> >+ /* Output */ >> >+ {"HDMI", NULL, "TX"}, >> >+}; >> >+ >> >+static const struct snd_soc_dapm_route rockchip_sound_da7219_routes[] = { >> >+ /* Output */ >> >+ {"Headphones", NULL, "HPL"}, >> >+ {"Headphones", NULL, "HPR"}, >> >+ >> >+ /* Input */ >> >+ {"MIC", NULL, "Headset Mic"}, >> >+}; >> >+ >> >+static const struct snd_soc_dapm_route rockchip_sound_dmic_routes[] = { >> >+ /* Input */ >> >+ {"Dmic", NULL, "Int Mic"}, > Should be "DMic" as in dmic_dapm_widgets of the dmic codec driver. > > This route is also new and would probably be better added in a > separate patch. ok, will do >
diff --git a/sound/soc/rockchip/rk3399_gru_sound.c b/sound/soc/rockchip/rk3399_gru_sound.c index 0513fe480353..c537781f8054 100644 --- a/sound/soc/rockchip/rk3399_gru_sound.c +++ b/sound/soc/rockchip/rk3399_gru_sound.c @@ -47,18 +47,7 @@ static const struct snd_soc_dapm_widget rockchip_dapm_widgets[] = { SND_SOC_DAPM_SPK("Speakers", NULL), SND_SOC_DAPM_MIC("Headset Mic", NULL), SND_SOC_DAPM_MIC("Int Mic", NULL), -}; - -static const struct snd_soc_dapm_route rockchip_dapm_routes[] = { - /* Input Lines */ - {"MIC", NULL, "Headset Mic"}, - {"DMIC1L", NULL, "Int Mic"}, - {"DMIC1R", NULL, "Int Mic"}, - - /* Output Lines */ - {"Headphones", NULL, "HPL"}, - {"Headphones", NULL, "HPR"}, - {"Speakers", NULL, "Speaker"}, + SND_SOC_DAPM_LINE("HDMI", NULL), }; static const struct snd_kcontrol_new rockchip_controls[] = { @@ -66,6 +55,7 @@ static const struct snd_kcontrol_new rockchip_controls[] = { SOC_DAPM_PIN_SWITCH("Speakers"), SOC_DAPM_PIN_SWITCH("Headset Mic"), SOC_DAPM_PIN_SWITCH("Int Mic"), + SOC_DAPM_PIN_SWITCH("HDMI"), }; static int rockchip_sound_max98357a_hw_params(struct snd_pcm_substream *substream, @@ -314,8 +304,6 @@ static struct snd_soc_card rockchip_sound_card = { .owner = THIS_MODULE, .dapm_widgets = rockchip_dapm_widgets, .num_dapm_widgets = ARRAY_SIZE(rockchip_dapm_widgets), - .dapm_routes = rockchip_dapm_routes, - .num_dapm_routes = ARRAY_SIZE(rockchip_dapm_routes), .controls = rockchip_controls, .num_controls = ARRAY_SIZE(rockchip_controls), }; @@ -391,6 +379,65 @@ static const struct snd_soc_dai_link rockchip_dais[] = { }, }; +static const struct snd_soc_dapm_route rockchip_sound_cdndp_routes[] = { + /* Output */ + {"HDMI", NULL, "TX"}, +}; + +static const struct snd_soc_dapm_route rockchip_sound_da7219_routes[] = { + /* Output */ + {"Headphones", NULL, "HPL"}, + {"Headphones", NULL, "HPR"}, + + /* Input */ + {"MIC", NULL, "Headset Mic"}, +}; + +static const struct snd_soc_dapm_route rockchip_sound_dmic_routes[] = { + /* Input */ + {"Dmic", NULL, "Int Mic"}, +}; + +static const struct snd_soc_dapm_route rockchip_sound_max98357a_routes[] = { + /* Output */ + {"Speakers", NULL, "Speaker"}, +}; + +static const struct snd_soc_dapm_route rockchip_sound_rt5514_routes[] = { + /* Input */ + {"DMIC1L", NULL, "Int Mic"}, + {"DMIC1R", NULL, "Int Mic"}, +}; + +struct rockchip_sound_route { + const struct snd_soc_dapm_route *routes; + int num_routes; +}; + +static const struct rockchip_sound_route rockchip_routes[] = { + [DAILINK_CDNDP] = { + .routes = rockchip_sound_cdndp_routes, + .num_routes = ARRAY_SIZE(rockchip_sound_cdndp_routes), + }, + [DAILINK_DA7219] = { + .routes = rockchip_sound_da7219_routes, + .num_routes = ARRAY_SIZE(rockchip_sound_da7219_routes), + }, + [DAILINK_DMIC] = { + .routes = rockchip_sound_dmic_routes, + .num_routes = ARRAY_SIZE(rockchip_sound_dmic_routes), + }, + [DAILINK_MAX98357A] = { + .routes = rockchip_sound_max98357a_routes, + .num_routes = ARRAY_SIZE(rockchip_sound_max98357a_routes), + }, + [DAILINK_RT5514] = { + .routes = rockchip_sound_rt5514_routes, + .num_routes = ARRAY_SIZE(rockchip_sound_rt5514_routes), + }, + [DAILINK_RT5514_DSP] = {}, +}; + static int rockchip_sound_codec_node_match(struct device_node *np_codec) { int i; @@ -408,6 +455,7 @@ static int rockchip_sound_of_parse_dais(struct device *dev, struct device_node *np_cpu, *np_cpu0, *np_cpu1; struct device_node *np_codec; struct snd_soc_dai_link *dai; + struct snd_soc_dapm_route *routes; int i, index; card->dai_link = devm_kzalloc(dev, sizeof(rockchip_dais), @@ -415,9 +463,16 @@ static int rockchip_sound_of_parse_dais(struct device *dev, if (!card->dai_link) return -ENOMEM; + routes = devm_kzalloc(dev, sizeof(rockchip_routes), + GFP_KERNEL); + if (!routes) + return -ENOMEM; + card->dapm_routes = routes; + np_cpu0 = of_parse_phandle(dev->of_node, "rockchip,cpu", 0); np_cpu1 = of_parse_phandle(dev->of_node, "rockchip,cpu", 1); + card->num_dapm_routes = 0; card->num_links = 0; for (i = 0; i < ARRAY_SIZE(rockchip_dais); i++) { np_codec = of_parse_phandle(dev->of_node, @@ -445,6 +500,11 @@ static int rockchip_sound_of_parse_dais(struct device *dev, dai->codec_of_node = np_codec; dai->platform_of_node = np_cpu; dai->cpu_of_node = np_cpu; + + memcpy(routes + card->num_dapm_routes, + rockchip_routes[index].routes, + rockchip_routes[index].num_routes * sizeof(*routes)); + card->num_dapm_routes += rockchip_routes[index].num_routes; } return 0;
Currently we are using a fixed list of dapm routes. Init dapm routes dynamically when parsing dailinks, since we are supporting optional codecs. Signed-off-by: Jeffy Chen <jeffy.chen@rock-chips.com> --- sound/soc/rockchip/rk3399_gru_sound.c | 88 +++++++++++++++++++++++++++++------ 1 file changed, 74 insertions(+), 14 deletions(-)