|
@@ -2656,6 +2656,8 @@ static int wm8994_hw_params(struct snd_pcm_substream *substream,
|
|
|
{
|
|
|
struct snd_soc_codec *codec = dai->codec;
|
|
|
struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec);
|
|
|
+ struct wm8994 *control = wm8994->wm8994;
|
|
|
+ struct wm8994_pdata *pdata = &control->pdata;
|
|
|
int aif1_reg;
|
|
|
int aif2_reg;
|
|
|
int bclk_reg;
|
|
@@ -2723,7 +2725,14 @@ static int wm8994_hw_params(struct snd_pcm_substream *substream,
|
|
|
}
|
|
|
|
|
|
wm8994->channels[id] = params_channels(params);
|
|
|
- switch (params_channels(params)) {
|
|
|
+ if (pdata->max_channels_clocked[id] &&
|
|
|
+ wm8994->channels[id] > pdata->max_channels_clocked[id]) {
|
|
|
+ dev_dbg(dai->dev, "Constraining channels to %d from %d\n",
|
|
|
+ pdata->max_channels_clocked[id], wm8994->channels[id]);
|
|
|
+ wm8994->channels[id] = pdata->max_channels_clocked[id];
|
|
|
+ }
|
|
|
+
|
|
|
+ switch (wm8994->channels[id]) {
|
|
|
case 1:
|
|
|
case 2:
|
|
|
bclk_rate *= 2;
|
|
@@ -2745,7 +2754,7 @@ static int wm8994_hw_params(struct snd_pcm_substream *substream,
|
|
|
dev_dbg(dai->dev, "AIF%dCLK is %dHz, target BCLK %dHz\n",
|
|
|
dai->id, wm8994->aifclk[id], bclk_rate);
|
|
|
|
|
|
- if (params_channels(params) == 1 &&
|
|
|
+ if (wm8994->channels[id] == 1 &&
|
|
|
(snd_soc_read(codec, aif1_reg) & 0x18) == 0x18)
|
|
|
aif2 |= WM8994_AIF1_MONO;
|
|
|
|