On Thu, Sep 14, 2023 at 09:37:31AM +0000, Charles Keepax wrote:
On Thu, Sep 14, 2023 at 07:27:03PM +1000, John Watts wrote:
On Thu, Sep 14, 2023 at 09:21:07AM +0000, Charles Keepax wrote:
On Thu, Sep 14, 2023 at 03:15:50AM +1000, John Watts wrote:
The wm8782 supports up to 192kHz audio when pins are set correctly. Instead of hardcoding which rates are supported enable them all then refer to a max_rate variable at runtime.
Signed-off-by: John Watts contact@jookia.org
+static int wm8782_dai_hw_params(struct snd_pcm_substream *component,
struct snd_pcm_hw_params *params,
struct snd_soc_dai *dai)
+{
- struct wm8782_priv *priv =
snd_soc_component_get_drvdata(dai->component);
- if (params_rate(params) > priv->max_rate)
return -EINVAL;
- return 0;
+}
We should be setting this as a constraint in startup, rather than returning an error in hw_params. That will let user-space know the supported rates and allow it to resample if necessary.
How do you do this? The struct with the rate is statically defined.
You can programmatically add additional constraints, commonly this will be done from the startup callback on the DAI. See something like arizona_startup in sound/soc/codecs/arizona.c for an example, that enables 44.1/48k rates based on clocks but the principle should be similar.
Although I would also imagine snd_pcm_hw_constraint_minmax is going to be more appropriate in your case.
Thanks, Charles