mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-13 00:29:50 +00:00
Merge remote-tracking branches 'asoc/topic/wm8523' and 'asoc/topic/wm8741' into asoc-next
This commit is contained in:
commit
e12be671ad
@ -113,6 +113,15 @@ static struct {
|
|||||||
{ 7, 1152 },
|
{ 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,
|
static int wm8523_startup(struct snd_pcm_substream *substream,
|
||||||
struct snd_soc_dai *dai)
|
struct snd_soc_dai *dai)
|
||||||
{
|
{
|
||||||
@ -162,6 +171,23 @@ static int wm8523_hw_params(struct snd_pcm_substream *substream,
|
|||||||
aifctrl2 &= ~WM8523_SR_MASK;
|
aifctrl2 &= ~WM8523_SR_MASK;
|
||||||
aifctrl2 |= lrclk_ratios[i].value;
|
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;
|
aifctrl1 &= ~WM8523_WL_MASK;
|
||||||
switch (params_width(params)) {
|
switch (params_width(params)) {
|
||||||
case 16:
|
case 16:
|
||||||
|
@ -125,18 +125,6 @@ static const struct snd_soc_dapm_route wm8741_dapm_routes[] = {
|
|||||||
{ "VOUTRN", NULL, "DACR" },
|
{ "VOUTRN", NULL, "DACR" },
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct {
|
|
||||||
int value;
|
|
||||||
int ratio;
|
|
||||||
} lrclk_ratios[WM8741_NUM_RATES] = {
|
|
||||||
{ 1, 128 },
|
|
||||||
{ 2, 192 },
|
|
||||||
{ 3, 256 },
|
|
||||||
{ 4, 384 },
|
|
||||||
{ 5, 512 },
|
|
||||||
{ 6, 768 },
|
|
||||||
};
|
|
||||||
|
|
||||||
static const unsigned int rates_11289[] = {
|
static const unsigned int rates_11289[] = {
|
||||||
44100, 88200,
|
44100, 88200,
|
||||||
};
|
};
|
||||||
@ -209,25 +197,16 @@ static const struct snd_pcm_hw_constraint_list constraints_36864 = {
|
|||||||
.list = rates_36864,
|
.list = rates_36864,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
static int wm8741_startup(struct snd_pcm_substream *substream,
|
static int wm8741_startup(struct snd_pcm_substream *substream,
|
||||||
struct snd_soc_dai *dai)
|
struct snd_soc_dai *dai)
|
||||||
{
|
{
|
||||||
struct snd_soc_codec *codec = dai->codec;
|
struct snd_soc_codec *codec = dai->codec;
|
||||||
struct wm8741_priv *wm8741 = snd_soc_codec_get_drvdata(codec);
|
struct wm8741_priv *wm8741 = snd_soc_codec_get_drvdata(codec);
|
||||||
|
|
||||||
/* The set of sample rates that can be supported depends on the
|
if (wm8741->sysclk)
|
||||||
* MCLK supplied to the CODEC - enforce this.
|
snd_pcm_hw_constraint_list(substream->runtime, 0,
|
||||||
*/
|
SNDRV_PCM_HW_PARAM_RATE,
|
||||||
if (!wm8741->sysclk) {
|
wm8741->sysclk_constraints);
|
||||||
dev_err(codec->dev,
|
|
||||||
"No MCLK configured, call set_sysclk() on init\n");
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
snd_pcm_hw_constraint_list(substream->runtime, 0,
|
|
||||||
SNDRV_PCM_HW_PARAM_RATE,
|
|
||||||
wm8741->sysclk_constraints);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -241,17 +220,24 @@ static int wm8741_hw_params(struct snd_pcm_substream *substream,
|
|||||||
u16 iface = snd_soc_read(codec, WM8741_FORMAT_CONTROL) & 0x1FC;
|
u16 iface = snd_soc_read(codec, WM8741_FORMAT_CONTROL) & 0x1FC;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
/* Find a supported LRCLK ratio */
|
/* The set of sample rates that can be supported depends on the
|
||||||
for (i = 0; i < ARRAY_SIZE(lrclk_ratios); i++) {
|
* MCLK supplied to the CODEC - enforce this.
|
||||||
if (wm8741->sysclk / params_rate(params) ==
|
*/
|
||||||
lrclk_ratios[i].ratio)
|
if (!wm8741->sysclk) {
|
||||||
|
dev_err(codec->dev,
|
||||||
|
"No MCLK configured, call set_sysclk() on init or in hw_params\n");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Find a supported LRCLK rate */
|
||||||
|
for (i = 0; i < wm8741->sysclk_constraints->count; i++) {
|
||||||
|
if (wm8741->sysclk_constraints->list[i] == params_rate(params))
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Should never happen, should be handled by constraints */
|
if (i == wm8741->sysclk_constraints->count) {
|
||||||
if (i == ARRAY_SIZE(lrclk_ratios)) {
|
dev_err(codec->dev, "LRCLK %d unsupported with MCLK %d\n",
|
||||||
dev_err(codec->dev, "MCLK/fs ratio %d unsupported\n",
|
params_rate(params), wm8741->sysclk);
|
||||||
wm8741->sysclk / params_rate(params));
|
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -274,8 +260,8 @@ static int wm8741_hw_params(struct snd_pcm_substream *substream,
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
dev_dbg(codec->dev, "wm8741_hw_params: bit size param = %d",
|
dev_dbg(codec->dev, "wm8741_hw_params: bit size param = %d, rate param = %d",
|
||||||
params_width(params));
|
params_width(params), params_rate(params));
|
||||||
|
|
||||||
snd_soc_write(codec, WM8741_FORMAT_CONTROL, iface);
|
snd_soc_write(codec, WM8741_FORMAT_CONTROL, iface);
|
||||||
return 0;
|
return 0;
|
||||||
@ -290,6 +276,11 @@ static int wm8741_set_dai_sysclk(struct snd_soc_dai *codec_dai,
|
|||||||
dev_dbg(codec->dev, "wm8741_set_dai_sysclk info: freq=%dHz\n", freq);
|
dev_dbg(codec->dev, "wm8741_set_dai_sysclk info: freq=%dHz\n", freq);
|
||||||
|
|
||||||
switch (freq) {
|
switch (freq) {
|
||||||
|
case 0:
|
||||||
|
wm8741->sysclk_constraints = NULL;
|
||||||
|
wm8741->sysclk = freq;
|
||||||
|
return 0;
|
||||||
|
|
||||||
case 11289600:
|
case 11289600:
|
||||||
wm8741->sysclk_constraints = &constraints_11289;
|
wm8741->sysclk_constraints = &constraints_11289;
|
||||||
wm8741->sysclk = freq;
|
wm8741->sysclk = freq;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user