ASoC: wm8782: Use wlf,fsampen device tree property
authorJohn Watts <contact@jookia.org>
Mon, 18 Sep 2023 13:15:31 +0000 (23:15 +1000)
committerMark Brown <broonie@kernel.org>
Mon, 18 Sep 2023 13:32:11 +0000 (14:32 +0100)
The wm8782 supports rates 96kHz and 192kHz as long as the hardware
is configured properly. Allow this to be specified in the device tree.

Signed-off-by: John Watts <contact@jookia.org>
Acked-by: Charles Keepax <ckeepax@opensource.cirrus.com>
Link: https://lore.kernel.org/r/20230918131532.2257615-3-contact@jookia.org
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/codecs/wm8782.c

index f3dc87b92b1eb35674c84b2bfc48a3bad332834b..3a2acdfa9b858f54e0cc52487638b959ae7c6890 100644 (file)
@@ -119,8 +119,9 @@ static const struct snd_soc_component_driver soc_component_dev_wm8782 = {
 static int wm8782_probe(struct platform_device *pdev)
 {
        struct device *dev = &pdev->dev;
+       struct device_node *np = dev->of_node;
        struct wm8782_priv *priv;
-       int ret, i;
+       int ret, i, fsampen;
 
        priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
        if (!priv)
@@ -136,8 +137,26 @@ static int wm8782_probe(struct platform_device *pdev)
        if (ret < 0)
                return ret;
 
-       /* For configurations with FSAMPEN=0 */
-       priv->max_rate = 48000;
+       // Assume lowest value by default to avoid inadvertent overclocking
+       fsampen = 0;
+
+       if (np)
+               of_property_read_u32(np, "wlf,fsampen", &fsampen);
+
+       switch (fsampen) {
+       case 0:
+               priv->max_rate = 48000;
+               break;
+       case 1:
+               priv->max_rate = 96000;
+               break;
+       case 2:
+               priv->max_rate = 192000;
+               break;
+       default:
+               dev_err(dev, "Invalid wlf,fsampen value");
+               return -EINVAL;
+       }
 
        return devm_snd_soc_register_component(&pdev->dev,
                        &soc_component_dev_wm8782, &wm8782_dai, 1);