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@xxxxxxxxxxxxxxx> Reviewed-by: Jyri Sarha <jsarha@xxxxxx> > --- > 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 _______________________________________________ Alsa-devel mailing list Alsa-devel@xxxxxxxxxxxxxxxx https://mailman.alsa-project.org/mailman/listinfo/alsa-devel