Commit 00524a84 authored by John Watts's avatar John Watts Committed by Mark Brown

ASoC: wm8782: Constrain maximum audio rate at runtime

The wm8782 supports up to 192kHz audio when pins are set correctly.
Instead of hardcoding which rates are supported constrain them at
runtime based on a max_rate variable.
Signed-off-by: default avatarJohn Watts <contact@jookia.org>
Acked-by: default avatarCharles Keepax <ckeepax@opensource.cirrus.com>
Link: https://lore.kernel.org/r/20230918131532.2257615-2-contact@jookia.orgSigned-off-by: default avatarMark Brown <broonie@kernel.org>
parent 9dc098e3
......@@ -23,6 +23,27 @@
#include <sound/initval.h>
#include <sound/soc.h>
/* regulator power supply names */
static const char *supply_names[] = {
"Vdda", /* analog supply, 2.7V - 3.6V */
"Vdd", /* digital supply, 2.7V - 5.5V */
};
struct wm8782_priv {
struct regulator_bulk_data supplies[ARRAY_SIZE(supply_names)];
int max_rate;
};
static int wm8782_dai_startup(struct snd_pcm_substream *sub, struct snd_soc_dai *dai)
{
struct snd_pcm_runtime *runtime = sub->runtime;
struct wm8782_priv *priv =
snd_soc_component_get_drvdata(dai->component);
return snd_pcm_hw_constraint_minmax(runtime, SNDRV_PCM_HW_PARAM_RATE,
8000, priv->max_rate);
}
static const struct snd_soc_dapm_widget wm8782_dapm_widgets[] = {
SND_SOC_DAPM_INPUT("AINL"),
SND_SOC_DAPM_INPUT("AINR"),
......@@ -33,28 +54,22 @@ static const struct snd_soc_dapm_route wm8782_dapm_routes[] = {
{ "Capture", NULL, "AINR" },
};
static const struct snd_soc_dai_ops wm8782_dai_ops = {
.startup = &wm8782_dai_startup,
};
static struct snd_soc_dai_driver wm8782_dai = {
.name = "wm8782",
.capture = {
.stream_name = "Capture",
.channels_min = 2,
.channels_max = 2,
/* For configurations with FSAMPEN=0 */
.rates = SNDRV_PCM_RATE_8000_48000,
.rates = SNDRV_PCM_RATE_8000_192000,
.formats = SNDRV_PCM_FMTBIT_S16_LE |
SNDRV_PCM_FMTBIT_S20_3LE |
SNDRV_PCM_FMTBIT_S24_LE,
},
};
/* regulator power supply names */
static const char *supply_names[] = {
"Vdda", /* analog supply, 2.7V - 3.6V */
"Vdd", /* digital supply, 2.7V - 5.5V */
};
struct wm8782_priv {
struct regulator_bulk_data supplies[ARRAY_SIZE(supply_names)];
.ops = &wm8782_dai_ops,
};
static int wm8782_soc_probe(struct snd_soc_component *component)
......@@ -121,6 +136,9 @@ static int wm8782_probe(struct platform_device *pdev)
if (ret < 0)
return ret;
/* For configurations with FSAMPEN=0 */
priv->max_rate = 48000;
return devm_snd_soc_register_component(&pdev->dev,
&soc_component_dev_wm8782, &wm8782_dai, 1);
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment