Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8267525c authored by Daniel Mack's avatar Daniel Mack Committed by Mark Brown
Browse files

ASoC: mcasp: don't override bclk divider if it was provided by the machine



If a machine driver provides an BCLK divider to the McASP driver, skip the
automatic calculation.

This fixes machines on which the physical sample transport always works
in 32 bits, even though not all of them are actually used.
snd_soc_params_to_bclk() will fail to address such cases properly.

Signed-off-by: default avatarDaniel Mack <zonque@gmail.com>
Acked-by: default avatarPeter Ujfalusi <peter.ujfalusi@ti.com>
Signed-off-by: default avatarMark Brown <broonie@linaro.org>
parent f3f9cfa8
Loading
Loading
Loading
Loading
+7 −2
Original line number Diff line number Diff line
@@ -65,6 +65,7 @@ struct davinci_mcasp {
	u8	num_serializer;
	u8	*serial_dir;
	u8	version;
	u8	bclk_div;
	u16	bclk_lrclk_ratio;
	int	streams;

@@ -419,6 +420,7 @@ static int davinci_mcasp_set_clkdiv(struct snd_soc_dai *dai, int div_id, int div
			       ACLKXDIV(div - 1), ACLKXDIV_MASK);
		mcasp_mod_bits(mcasp, DAVINCI_MCASP_ACLKRCTL_REG,
			       ACLKRDIV(div - 1), ACLKRDIV_MASK);
		mcasp->bclk_div = div;
		break;

	case 2:		/* BCLK/LRCLK ratio */
@@ -721,8 +723,11 @@ static int davinci_mcasp_hw_params(struct snd_pcm_substream *substream,
	int period_size = params_period_size(params);
	int ret;

	/* If mcasp is BCLK master we need to set BCLK divider */
	if (mcasp->bclk_master && mcasp->sysclk_freq) {
	/*
	 * If mcasp is BCLK master, and a BCLK divider was not provided by
	 * the machine driver, we need to calculate the ratio.
	 */
	if (mcasp->bclk_master && mcasp->bclk_div == 0 && mcasp->sysclk_freq) {
		unsigned int bclk_freq = snd_soc_params_to_bclk(params);
		unsigned int div = mcasp->sysclk_freq / bclk_freq;
		if (mcasp->sysclk_freq % bclk_freq != 0) {