[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