diff options
Diffstat (limited to 'sound/soc/codecs/hdmi-codec.c')
| -rw-r--r-- | sound/soc/codecs/hdmi-codec.c | 133 | 
1 files changed, 65 insertions, 68 deletions
diff --git a/sound/soc/codecs/hdmi-codec.c b/sound/soc/codecs/hdmi-codec.c index e5b6769b9797..39caf19abb0b 100644 --- a/sound/soc/codecs/hdmi-codec.c +++ b/sound/soc/codecs/hdmi-codec.c @@ -439,8 +439,12 @@ static int hdmi_codec_startup(struct snd_pcm_substream *substream,  		if (!ret) {  			ret = snd_pcm_hw_constraint_eld(substream->runtime,  							hcp->eld); -			if (ret) +			if (ret) { +				mutex_lock(&hcp->current_stream_lock); +				hcp->current_stream = NULL; +				mutex_unlock(&hcp->current_stream_lock);  				return ret; +			}  		}  		/* Select chmap supported */  		hdmi_codec_eld_chmap(hcp); @@ -484,9 +488,6 @@ static int hdmi_codec_hw_params(struct snd_pcm_substream *substream,  		params_width(params), params_rate(params),  		params_channels(params)); -	if (params_width(params) > 24) -		params->msbits = 24; -  	ret = snd_pcm_create_iec958_consumer_hw_params(params, hp.iec.status,  						       sizeof(hp.iec.status));  	if (ret < 0) { @@ -495,10 +496,6 @@ static int hdmi_codec_hw_params(struct snd_pcm_substream *substream,  		return ret;  	} -	ret = hdmi_codec_new_stream(substream, dai); -	if (ret) -		return ret; -  	hdmi_audio_infoframe_init(&hp.cea);  	hp.cea.channels = params_channels(params);  	hp.cea.coding_type = HDMI_AUDIO_CODING_TYPE_STREAM; @@ -529,73 +526,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) @@ -762,7 +757,7 @@ static int hdmi_codec_probe(struct platform_device *pdev)  	dev_dbg(dev, "%s()\n", __func__);  	if (!hcd) { -		dev_err(dev, "%s: No plalform data\n", __func__); +		dev_err(dev, "%s: No platform data\n", __func__);  		return -EINVAL;  	} @@ -792,8 +787,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);  |