Skip to content

Commit

Permalink
ASoC: wm8523: Set bclk ratio for master mode
Browse files Browse the repository at this point in the history
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>
Signed-off-by: Mark Brown <broonie@kernel.org>
  • Loading branch information
Julian Scheel authored and Mark Brown committed Jun 12, 2015
1 parent b787f68 commit ef5294f
Showing 1 changed file with 26 additions and 0 deletions.
26 changes: 26 additions & 0 deletions sound/soc/codecs/wm8523.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand Down Expand Up @@ -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:
Expand Down

0 comments on commit ef5294f

Please sign in to comment.