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@armlinux.org.uk
Reviewed-by: Jyri Sarha jsarha@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);