diff mbox

ASoC: wm8523: Set bclk ratio for master mode

Message ID 1434117452-25223-1-git-send-email-julian@jusst.de (mailing list archive)
State Accepted
Commit ef5294fd250adc8c340ffeb410b62e1b777ddf6f
Headers show

Commit Message

Julian Scheel June 12, 2015, 1:57 p.m. UTC
When running in master mode the bclk divider must be configured to generate a
sane bitclock. Pick the smallest fs multiplicator, which can hold all
transmitted bits.

Signed-off-by: Julian Scheel <julian@jusst.de>
---
 sound/soc/codecs/wm8523.c | 26 ++++++++++++++++++++++++++
 1 file changed, 26 insertions(+)

Comments

Charles Keepax June 12, 2015, 3:37 p.m. UTC | #1
On Fri, Jun 12, 2015 at 03:57:32PM +0200, Julian Scheel wrote:
> When running in master mode the bclk divider must be configured to generate a
> sane bitclock. Pick the smallest fs multiplicator, which can hold all
> transmitted bits.
> 
> Signed-off-by: Julian Scheel <julian@jusst.de>
> ---

Acked-by: Charles Keepax <ckeepax@opensource.wolfsonmicro.com>

Thanks,
Charles
Mark Brown June 12, 2015, 4:17 p.m. UTC | #2
On Fri, Jun 12, 2015 at 03:57:32PM +0200, Julian Scheel wrote:
> When running in master mode the bclk divider must be configured to generate a
> sane bitclock. Pick the smallest fs multiplicator, which can hold all
> transmitted bits.

Applied, thanks.
diff mbox

Patch

diff --git a/sound/soc/codecs/wm8523.c b/sound/soc/codecs/wm8523.c
index ec1f574..9c60058 100644
--- a/sound/soc/codecs/wm8523.c
+++ b/sound/soc/codecs/wm8523.c
@@ -113,6 +113,15 @@  static struct {
 	{ 7, 1152 },
 };
 
+static struct {
+	int value;
+	int ratio;
+} bclk_ratios[WM8523_NUM_RATES] = {
+	{ 2, 32 },
+	{ 3, 64 },
+	{ 4, 128 },
+};
+
 static int wm8523_startup(struct snd_pcm_substream *substream,
 			  struct snd_soc_dai *dai)
 {
@@ -162,6 +171,23 @@  static int wm8523_hw_params(struct snd_pcm_substream *substream,
 	aifctrl2 &= ~WM8523_SR_MASK;
 	aifctrl2 |= lrclk_ratios[i].value;
 
+	if (aifctrl1 & WM8523_AIF_MSTR) {
+		/* Find a fs->bclk ratio */
+		for (i = 0; i < ARRAY_SIZE(bclk_ratios); i++)
+			if (params_width(params) * 2 <= bclk_ratios[i].ratio)
+				break;
+
+		if (i == ARRAY_SIZE(bclk_ratios)) {
+			dev_err(codec->dev,
+				"No matching BCLK/fs ratio for word length %d\n",
+				params_width(params));
+			return -EINVAL;
+		}
+
+		aifctrl2 &= ~WM8523_BCLKDIV_MASK;
+		aifctrl2 |= bclk_ratios[i].value << WM8523_BCLKDIV_SHIFT;
+	}
+
 	aifctrl1 &= ~WM8523_WL_MASK;
 	switch (params_width(params)) {
 	case 16: