[alsa-devel] [PATCH] ASoC: hdmi-codec: fix S/PDIF DAI
Jyri Sarha
jsarha at ti.com
Fri Mar 1 10:09:44 CET 2019
On 28/02/2019 17:30, Russell King wrote:
> 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 at armlinux.org.uk>
Reviewed-by: Jyri Sarha <jsarha at ti.com>
> ---
> 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 e5b6769b9797..d5f73c837281 100644
> --- a/sound/soc/codecs/hdmi-codec.c
> +++ b/sound/soc/codecs/hdmi-codec.c
> @@ -529,73 +529,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)
> @@ -792,8 +790,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;
> + }
>
> dev_set_drvdata(dev, hcp);
>
>
--
Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki.
Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki
More information about the Alsa-devel
mailing list