[ALSA] ASoC: Add support for BCLK based on (Rate * Chn * Word Size)

This patch adds support for the DAI BCLK to be generated by multiplying
Rate * Channels * Word Size (RCW).
This now gives 3 options for BCLK clocking and synchronisation :-
 1. BCLK = Rate * x
 2. BCLK = MCLK / x
 3. BCLK = Rate * Chn * Word Size.  (New)
Changes:-
 o Add support for RCW generation of BCLK
 o Update Documentation to include RCW.
 o Update DAI documentation for label = value DAI modes.
 o Add RCW support to wm8731, wm8750 and pxa2xx-i2s drivers.

Signed-off-by: Liam Girdwood <lg@opensource.wolfsonmicro.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Jaroslav Kysela <perex@suse.cz>
diff --git a/sound/soc/codecs/wm8731.c b/sound/soc/codecs/wm8731.c
index 9adbd2d..4122912 100644
--- a/sound/soc/codecs/wm8731.c
+++ b/sound/soc/codecs/wm8731.c
@@ -90,32 +90,36 @@
 		.pcmfmt = WM8731_HIFI_BITS,
 		.pcmrate = SNDRV_PCM_RATE_8000,
 		.pcmdir = WM8731_DIR,
+		.flags = SND_SOC_DAI_BFS_RATE,
 		.fs = 1536,
-		.bfs = SND_SOC_FSB(64),
+		.bfs = 64,
 	},
 	{
 		.fmt = WM8731_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
 		.pcmfmt = WM8731_HIFI_BITS,
 		.pcmrate = SNDRV_PCM_RATE_8000,
 		.pcmdir = WM8731_DIR,
+		.flags = SND_SOC_DAI_BFS_RATE,
 		.fs = 2304,
-		.bfs = SND_SOC_FSB(64),
+		.bfs = 64,
 	},
 	{
 		.fmt = WM8731_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
 		.pcmfmt = WM8731_HIFI_BITS,
 		.pcmrate = SNDRV_PCM_RATE_8000,
 		.pcmdir = WM8731_DIR,
+		.flags = SND_SOC_DAI_BFS_RATE,
 		.fs = 1408,
-		.bfs = SND_SOC_FSB(64),
+		.bfs = 64,
 	},
 	{
 		.fmt = WM8731_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
 		.pcmfmt = WM8731_HIFI_BITS,
 		.pcmrate = SNDRV_PCM_RATE_8000,
 		.pcmdir = WM8731_DIR,
+		.flags = SND_SOC_DAI_BFS_RATE,
 		.fs = 2112,
-		.bfs = SND_SOC_FSB(64),
+		.bfs = 64,
 	},
 
 	/* 32k */
@@ -124,16 +128,18 @@
 		.pcmfmt = WM8731_HIFI_BITS,
 		.pcmrate = SNDRV_PCM_RATE_32000,
 		.pcmdir = WM8731_DIR,
+		.flags = SND_SOC_DAI_BFS_RATE,
 		.fs = 384,
-		.bfs = SND_SOC_FSB(64),
+		.bfs = 64,
 	},
 	{
 		.fmt = WM8731_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
 		.pcmfmt = WM8731_HIFI_BITS,
 		.pcmrate = SNDRV_PCM_RATE_32000,
 		.pcmdir = WM8731_DIR,
+		.flags = SND_SOC_DAI_BFS_RATE,
 		.fs = 576,
-		.bfs = SND_SOC_FSB(64),
+		.bfs = 64,
 	},
 
 	/* 44.1k & 48k */
@@ -142,16 +148,18 @@
 		.pcmfmt = WM8731_HIFI_BITS,
 		.pcmrate = SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000,
 		.pcmdir = WM8731_DIR,
+		.flags = SND_SOC_DAI_BFS_RATE,
 		.fs = 256,
-		.bfs = SND_SOC_FSB(64),
+		.bfs = 64,
 	},
 	{
 		.fmt = WM8731_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
 		.pcmfmt = WM8731_HIFI_BITS,
 		.pcmrate = SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000,
 		.pcmdir = WM8731_DIR,
+		.flags = SND_SOC_DAI_BFS_RATE,
 		.fs = 384,
-		.bfs = SND_SOC_FSB(64),
+		.bfs = 64,
 	},
 
 	/* 88.2 & 96k */
@@ -160,17 +168,18 @@
 		.pcmfmt = WM8731_HIFI_BITS,
 		.pcmrate = SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000,
 		.pcmdir = WM8731_DIR,
+		.flags = SND_SOC_DAI_BFS_RATE,
 		.fs = 128,
-		.bfs = SND_SOC_FSB(64),
-		
+		.bfs = 64,
 	},
 	{
 		.fmt = WM8731_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
 		.pcmfmt = WM8731_HIFI_BITS,
 		.pcmrate = SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000,
 		.pcmdir = WM8731_DIR,
+		.flags = SND_SOC_DAI_BFS_RATE,
 		.fs = 192,
-		.bfs = SND_SOC_FSB(64),
+		.bfs = 64,
 	},
 
 	/* USB codec frame and clock master modes */
@@ -237,7 +246,7 @@
 		.pcmdir = WM8731_DIR,
 		.flags = SND_SOC_DAI_BFS_DIV,
 		.fs = SND_SOC_FS_ALL,
-		.bfs = SND_SOC_FSBD_ALL,
+		.bfs = SND_SOC_FSB_ALL,
 	},
 };
 
diff --git a/sound/soc/codecs/wm8750.c b/sound/soc/codecs/wm8750.c
index 243da71..c5d13a9 100644
--- a/sound/soc/codecs/wm8750.c
+++ b/sound/soc/codecs/wm8750.c
@@ -343,7 +343,7 @@
 		.pcmdir = WM8750_DIR,
 		.flags = SND_SOC_DAI_BFS_DIV,
 		.fs = SND_SOC_FS_ALL,
-		.bfs = SND_SOC_FSBD_ALL,
+		.bfs = SND_SOC_FSB_ALL,
 	},
 };
 
@@ -829,6 +829,9 @@
 		if (coeff_div[i].rate == rate && coeff_div[i].mclk == mclk)
 			return i;
 	}
+
+	printk(KERN_ERR "wm8750: could not get coeff for mclk %d @ rate %d\n",
+		mclk, rate);
 	return -EINVAL;
 }
 
@@ -836,13 +839,7 @@
 static unsigned int wm8750_config_sysclk(struct snd_soc_codec_dai *dai,
 	struct snd_soc_clock_info *info, unsigned int clk)
 {
-	dai->mclk = 0;
-
-	/* check that the calculated FS and rate actually match a clock from
-	 * the machine driver */
-	if (info->fs * info->rate == clk)
-		dai->mclk = clk;
-
+	dai->mclk = clk;
 	return dai->mclk;
 }
 
@@ -859,7 +856,7 @@
 	if (i < 0)
 		return i;
 
-	bfs = SND_SOC_FSB_REAL(rtd->codec_dai->dai_runtime.bfs);
+	bfs = SND_SOC_FSBD_REAL(rtd->codec_dai->dai_runtime.bfs);
 
 	/* set master/slave audio interface */
 	switch (rtd->codec_dai->dai_runtime.fmt & SND_SOC_DAIFMT_CLOCK_MASK) {