Re: [PATCH 3/4] ASoC: rockchip_max98090: Add dai_link for HDMI
From: Tzung-Bi Shih
Date: Fri Jul 05 2019 - 03:10:08 EST
On Fri, Jul 5, 2019 at 12:26 PM Cheng-Yi Chiang <cychiang@xxxxxxxxxxxx> wrote:
> diff --git a/sound/soc/rockchip/rockchip_max98090.c b/sound/soc/rockchip/rockchip_max98090.c
> index c5fc24675a33..195309d1225a 100644
> --- a/sound/soc/rockchip/rockchip_max98090.c
> +++ b/sound/soc/rockchip/rockchip_max98090.c
> static int rk_aif1_hw_params(struct snd_pcm_substream *substream,
> @@ -92,38 +95,59 @@ static int rk_aif1_hw_params(struct snd_pcm_substream *substream,
>
> ret = snd_soc_dai_set_sysclk(cpu_dai, 0, mclk,
> SND_SOC_CLOCK_OUT);
> - if (ret < 0) {
> - dev_err(codec_dai->dev, "Can't set codec clock %d\n", ret);
> + if (ret && ret != -ENOTSUPP) {
> + dev_err(cpu_dai->dev, "Can't set cpu dai clock %d\n", ret);
> return ret;
> }
>
> ret = snd_soc_dai_set_sysclk(codec_dai, 0, mclk,
> SND_SOC_CLOCK_IN);
> - if (ret < 0) {
> - dev_err(codec_dai->dev, "Can't set codec clock %d\n", ret);
> + if (ret && ret != -ENOTSUPP) {
> + dev_err(codec_dai->dev, "Can't set codec dai clock %d\n", ret);
> return ret;
> }
Does it imply: it is acceptable even if they are "not supported"?
>
> - return ret;
> + return 0;
> }
>
> static const struct snd_soc_ops rk_aif1_ops = {
> .hw_params = rk_aif1_hw_params,
> };
>
> -SND_SOC_DAILINK_DEFS(hifi,
> +SND_SOC_DAILINK_DEFS(analog,
> DAILINK_COMP_ARRAY(COMP_EMPTY()),
> DAILINK_COMP_ARRAY(COMP_CODEC(NULL, "HiFi")),
> DAILINK_COMP_ARRAY(COMP_EMPTY()));
>
> -static struct snd_soc_dai_link rk_dailink = {
> - .name = "max98090",
> - .stream_name = "Audio",
> - .ops = &rk_aif1_ops,
> - /* set max98090 as slave */
> - .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF |
> - SND_SOC_DAIFMT_CBS_CFS,
> - SND_SOC_DAILINK_REG(hifi),
> +SND_SOC_DAILINK_DEFS(hdmi,
> + DAILINK_COMP_ARRAY(COMP_EMPTY()),
> + DAILINK_COMP_ARRAY(COMP_CODEC("hdmi-audio-codec.3.auto", "i2s-hifi")),
> + DAILINK_COMP_ARRAY(COMP_EMPTY()));
> +
> +enum {
> + DAILINK_MAX98090,
> + DAILINK_HDMI,
> +};
> +
> +/* max98090 and HDMI codec dai_link */
> +static struct snd_soc_dai_link rk_dailinks[] = {
> + [DAILINK_MAX98090] = {
> + .name = "max98090",
> + .stream_name = "Analog",
> + .ops = &rk_aif1_ops,
> + /* set max98090 as slave */
> + .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF |
> + SND_SOC_DAIFMT_CBS_CFS,
> + SND_SOC_DAILINK_REG(analog),
> + },
> + [DAILINK_HDMI] = {
> + .name = "HDMI",
> + .stream_name = "HDMI",
> + .ops = &rk_aif1_ops,
> + .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF |
> + SND_SOC_DAIFMT_CBS_CFS,
> + SND_SOC_DAILINK_REG(hdmi),
> + }
> };
>
> static int rk_98090_headset_init(struct snd_soc_component *component);
> @@ -136,8 +160,8 @@ static struct snd_soc_aux_dev rk_98090_headset_dev = {
> static struct snd_soc_card snd_soc_card_rk = {
> .name = "ROCKCHIP-I2S",
> .owner = THIS_MODULE,
> - .dai_link = &rk_dailink,
> - .num_links = 1,
> + .dai_link = rk_dailinks,
> + .num_links = ARRAY_SIZE(rk_dailinks),
> .aux_dev = &rk_98090_headset_dev,
> .num_aux_devs = 1,
> .dapm_widgets = rk_dapm_widgets,
> @@ -173,27 +197,48 @@ static int snd_rk_mc_probe(struct platform_device *pdev)
> int ret = 0;
> struct snd_soc_card *card = &snd_soc_card_rk;
> struct device_node *np = pdev->dev.of_node;
> + struct device_node *np_analog;
> + struct device_node *np_cpu;
> + struct of_phandle_args args;
>
> /* register the soc card */
> card->dev = &pdev->dev;
>
> - rk_dailink.codecs->of_node = of_parse_phandle(np,
> - "rockchip,audio-codec", 0);
> - if (!rk_dailink.codecs->of_node) {
> + np_analog = of_parse_phandle(np, "rockchip,audio-codec", 0);
> + if (!np_analog) {
> dev_err(&pdev->dev,
> "Property 'rockchip,audio-codec' missing or invalid\n");
> return -EINVAL;
> }
> + rk_dailinks[DAILINK_MAX98090].codecs->of_node = np_analog;
> +
> + ret = of_parse_phandle_with_fixed_args(np, "rockchip,audio-codec",
> + 0, 0, &args);
> + if (ret) {
> + dev_err(&pdev->dev,
> + "Unable to parse property 'rockchip,audio-codec'\n");
> + return ret;
> + }
> +
> + ret = snd_soc_get_dai_name(
> + &args, &rk_dailinks[DAILINK_MAX98090].codecs->dai_name);
> + if (ret) {
> + dev_err(&pdev->dev, "Unable to get codec dai_name\n");
> + return ret;
> + }
> +
> + np_cpu = of_parse_phandle(np, "rockchip,i2s-controller", 0);
>
> - rk_dailink.cpus->of_node = of_parse_phandle(np,
> - "rockchip,i2s-controller", 0);
> - if (!rk_dailink.cpus->of_node) {
> + if (!np_cpu) {
> dev_err(&pdev->dev,
> "Property 'rockchip,i2s-controller' missing or invalid\n");
> return -EINVAL;
> }
>
> - rk_dailink.platforms->of_node = rk_dailink.cpus->of_node;
> + rk_dailinks[DAILINK_MAX98090].cpus->of_node = np_cpu;
> + rk_dailinks[DAILINK_MAX98090].platforms->of_node = np_cpu;
> + rk_dailinks[DAILINK_HDMI].cpus->of_node = np_cpu;
> + rk_dailinks[DAILINK_HDMI].platforms->of_node = np_cpu;
>
> rk_98090_headset_dev.codec_of_node = of_parse_phandle(np,
> "rockchip,headset-codec", 0);
> --
> 2.22.0.410.gd8fdbe21b5-goog
>