diff options
Diffstat (limited to 'sound/soc')
| -rw-r--r-- | sound/soc/davinci/davinci-mcasp.c | 15 | 
1 files changed, 13 insertions, 2 deletions
diff --git a/sound/soc/davinci/davinci-mcasp.c b/sound/soc/davinci/davinci-mcasp.c index e460f97c514e..0dab382ba147 100644 --- a/sound/soc/davinci/davinci-mcasp.c +++ b/sound/soc/davinci/davinci-mcasp.c @@ -582,8 +582,17 @@ static int davinci_config_channel_size(struct davinci_mcasp *mcasp,  	 * both left and right channels), so it has to be divided by number of  	 * tdm-slots (for I2S - divided by 2).  	 */ -	if (mcasp->bclk_lrclk_ratio) -		word_length = mcasp->bclk_lrclk_ratio / mcasp->tdm_slots; +	if (mcasp->bclk_lrclk_ratio) { +		u32 slot_length = mcasp->bclk_lrclk_ratio / mcasp->tdm_slots; + +		/* +		 * When we have more bclk then it is needed for the data, we +		 * need to use the rotation to move the received samples to have +		 * correct alignment. +		 */ +		rx_rotate = (slot_length - word_length) / 4; +		word_length = slot_length; +	}  	/* mapping of the XSSZ bit-field as described in the datasheet */  	fmt = (word_length >> 1) - 1; @@ -1125,6 +1134,7 @@ static struct snd_soc_dai_driver davinci_mcasp_dai[] = {  		},  		.ops 		= &davinci_mcasp_dai_ops, +		.symmetric_samplebits	= 1,  	},  	{  		.name		= "davinci-mcasp.1", @@ -1391,6 +1401,7 @@ static int davinci_mcasp_probe(struct platform_device *pdev)  	ret = pm_runtime_get_sync(&pdev->dev);  	if (IS_ERR_VALUE(ret)) {  		dev_err(&pdev->dev, "pm_runtime_get_sync() failed\n"); +		pm_runtime_disable(&pdev->dev);  		return ret;  	}  |