lkml.org 
[lkml]   [2019]   [Apr]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 4.14 01/32] ASoC: hdmi-codec: fix S/PDIF DAI
    Date
    From: Russell King <rmk+kernel@armlinux.org.uk>

    [ Upstream commit 2e95f984aae4cf0608d0ba2189c756f2bd50b44a ]

    When using the S/PDIF DAI, there is no requirement to call
    snd_soc_dai_set_fmt() as there is no DAI format definition that defines
    S/PDIF. In any case, S/PDIF does not have separate clocks, this is
    embedded into the data stream.

    Consequently, when attempting to use TDA998x in S/PDIF mode, the attempt
    to configure TDA998x via the hw_params callback fails as the
    hdmi_codec_daifmt is left initialised to zero.

    Since the S/PDIF DAI will only be used by S/PDIF, prepare the
    hdmi_codec_daifmt structure for this format.

    Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
    Reviewed-by: Jyri Sarha <jsarha@ti.com>
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    sound/soc/codecs/hdmi-codec.c | 118 +++++++++++++++++-----------------
    1 file changed, 59 insertions(+), 59 deletions(-)

    diff --git a/sound/soc/codecs/hdmi-codec.c b/sound/soc/codecs/hdmi-codec.c
    index cf3b905b4ead..7406695ee5dc 100644
    --- a/sound/soc/codecs/hdmi-codec.c
    +++ b/sound/soc/codecs/hdmi-codec.c
    @@ -536,73 +536,71 @@ static int hdmi_codec_set_fmt(struct snd_soc_dai *dai,
    {
    struct hdmi_codec_priv *hcp = snd_soc_dai_get_drvdata(dai);
    struct hdmi_codec_daifmt cf = { 0 };
    - int ret = 0;

    dev_dbg(dai->dev, "%s()\n", __func__);

    - if (dai->id == DAI_ID_SPDIF) {
    - cf.fmt = HDMI_SPDIF;
    - } else {
    - switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
    - case SND_SOC_DAIFMT_CBM_CFM:
    - cf.bit_clk_master = 1;
    - cf.frame_clk_master = 1;
    - break;
    - case SND_SOC_DAIFMT_CBS_CFM:
    - cf.frame_clk_master = 1;
    - break;
    - case SND_SOC_DAIFMT_CBM_CFS:
    - cf.bit_clk_master = 1;
    - break;
    - case SND_SOC_DAIFMT_CBS_CFS:
    - break;
    - default:
    - return -EINVAL;
    - }
    + if (dai->id == DAI_ID_SPDIF)
    + return 0;
    +
    + switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
    + case SND_SOC_DAIFMT_CBM_CFM:
    + cf.bit_clk_master = 1;
    + cf.frame_clk_master = 1;
    + break;
    + case SND_SOC_DAIFMT_CBS_CFM:
    + cf.frame_clk_master = 1;
    + break;
    + case SND_SOC_DAIFMT_CBM_CFS:
    + cf.bit_clk_master = 1;
    + break;
    + case SND_SOC_DAIFMT_CBS_CFS:
    + break;
    + default:
    + return -EINVAL;
    + }

    - switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
    - case SND_SOC_DAIFMT_NB_NF:
    - break;
    - case SND_SOC_DAIFMT_NB_IF:
    - cf.frame_clk_inv = 1;
    - break;
    - case SND_SOC_DAIFMT_IB_NF:
    - cf.bit_clk_inv = 1;
    - break;
    - case SND_SOC_DAIFMT_IB_IF:
    - cf.frame_clk_inv = 1;
    - cf.bit_clk_inv = 1;
    - break;
    - }
    + switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
    + case SND_SOC_DAIFMT_NB_NF:
    + break;
    + case SND_SOC_DAIFMT_NB_IF:
    + cf.frame_clk_inv = 1;
    + break;
    + case SND_SOC_DAIFMT_IB_NF:
    + cf.bit_clk_inv = 1;
    + break;
    + case SND_SOC_DAIFMT_IB_IF:
    + cf.frame_clk_inv = 1;
    + cf.bit_clk_inv = 1;
    + break;
    + }

    - switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
    - case SND_SOC_DAIFMT_I2S:
    - cf.fmt = HDMI_I2S;
    - break;
    - case SND_SOC_DAIFMT_DSP_A:
    - cf.fmt = HDMI_DSP_A;
    - break;
    - case SND_SOC_DAIFMT_DSP_B:
    - cf.fmt = HDMI_DSP_B;
    - break;
    - case SND_SOC_DAIFMT_RIGHT_J:
    - cf.fmt = HDMI_RIGHT_J;
    - break;
    - case SND_SOC_DAIFMT_LEFT_J:
    - cf.fmt = HDMI_LEFT_J;
    - break;
    - case SND_SOC_DAIFMT_AC97:
    - cf.fmt = HDMI_AC97;
    - break;
    - default:
    - dev_err(dai->dev, "Invalid DAI interface format\n");
    - return -EINVAL;
    - }
    + switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
    + case SND_SOC_DAIFMT_I2S:
    + cf.fmt = HDMI_I2S;
    + break;
    + case SND_SOC_DAIFMT_DSP_A:
    + cf.fmt = HDMI_DSP_A;
    + break;
    + case SND_SOC_DAIFMT_DSP_B:
    + cf.fmt = HDMI_DSP_B;
    + break;
    + case SND_SOC_DAIFMT_RIGHT_J:
    + cf.fmt = HDMI_RIGHT_J;
    + break;
    + case SND_SOC_DAIFMT_LEFT_J:
    + cf.fmt = HDMI_LEFT_J;
    + break;
    + case SND_SOC_DAIFMT_AC97:
    + cf.fmt = HDMI_AC97;
    + break;
    + default:
    + dev_err(dai->dev, "Invalid DAI interface format\n");
    + return -EINVAL;
    }

    hcp->daifmt[dai->id] = cf;

    - return ret;
    + return 0;
    }

    static int hdmi_codec_digital_mute(struct snd_soc_dai *dai, int mute)
    @@ -784,8 +782,10 @@ static int hdmi_codec_probe(struct platform_device *pdev)
    i++;
    }

    - if (hcd->spdif)
    + if (hcd->spdif) {
    hcp->daidrv[i] = hdmi_spdif_dai;
    + hcp->daifmt[DAI_ID_SPDIF].fmt = HDMI_SPDIF;
    + }

    ret = snd_soc_register_codec(dev, &hdmi_codec, hcp->daidrv,
    dai_count);
    --
    2.19.1
    \
     
     \ /
      Last update: 2019-04-27 03:48    [W:4.610 / U:0.084 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site