]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
ASoC: simple-card-utils: add link-trigger-order support
authorKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Wed, 12 Jun 2024 06:02:33 +0000 (06:02 +0000)
committerMark Brown <broonie@kernel.org>
Wed, 26 Jun 2024 16:47:56 +0000 (17:47 +0100)
Some Sound Card might need special trigger ordering which is based on
CPU/Codec connection. It is already supported on ASoC, but Simple Audio
Card / Audio Graph Card still not support it. Let's support it.

Cc: Maxim Kochetkov <fido_max@inbox.ru>
Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Link: https://patch.msgid.link/87r0d2zojq.wl-kuninori.morimoto.gx@renesas.com
Signed-off-by: Mark Brown <broonie@kernel.org>
include/sound/simple_card_utils.h
sound/soc/generic/simple-card-utils.c

index 0a6435ac5c5fe3331a50841d09d3d140b6eca079..3360d9eab068d5f9ea4ae7e4dcd8da6a3234d068 100644 (file)
@@ -199,6 +199,10 @@ int graph_util_parse_dai(struct device *dev, struct device_node *ep,
 
 void graph_util_parse_link_direction(struct device_node *np,
                                    bool *is_playback_only, bool *is_capture_only);
+void graph_util_parse_trigger_order(struct simple_util_priv *priv,
+                                   struct device_node *np,
+                                   enum snd_soc_trigger_order *trigger_start,
+                                   enum snd_soc_trigger_order *trigger_stop);
 
 #ifdef DEBUG
 static inline void simple_util_debug_dai(struct simple_util_priv *priv,
index dcd0569157cefa14300e1cb162bda45d8213f89f..a18de86b3c88214d7464a14120e118022e2685f5 100644 (file)
@@ -4,6 +4,7 @@
 //
 // Copyright (c) 2016 Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
 
+#include <dt-bindings/sound/audio-graph.h>
 #include <linux/clk.h>
 #include <linux/gpio/consumer.h>
 #include <linux/module.h>
@@ -1156,6 +1157,76 @@ void graph_util_parse_link_direction(struct device_node *np,
 }
 EXPORT_SYMBOL_GPL(graph_util_parse_link_direction);
 
+static enum snd_soc_trigger_order
+__graph_util_parse_trigger_order(struct simple_util_priv *priv,
+                                struct device_node *np,
+                                const char *prop)
+{
+       u32 val[SND_SOC_TRIGGER_SIZE];
+       int ret;
+
+       ret = of_property_read_u32_array(np, prop, val, SND_SOC_TRIGGER_SIZE);
+       if (ret == 0) {
+               struct device *dev = simple_priv_to_dev(priv);
+               u32 order =     (val[0] << 8) +
+                       (val[1] << 4) +
+                       (val[2]);
+
+               switch (order) {
+               case    (SND_SOC_TRIGGER_LINK           << 8) +
+                       (SND_SOC_TRIGGER_COMPONENT      << 4) +
+                       (SND_SOC_TRIGGER_DAI):
+                       return SND_SOC_TRIGGER_ORDER_DEFAULT;
+
+               case    (SND_SOC_TRIGGER_LINK           << 8) +
+                       (SND_SOC_TRIGGER_DAI            << 4) +
+                       (SND_SOC_TRIGGER_COMPONENT):
+                       return SND_SOC_TRIGGER_ORDER_LDC;
+
+               default:
+                       dev_err(dev, "unsupported trigger order [0x%x]\n", order);
+               }
+       }
+
+       /* SND_SOC_TRIGGER_ORDER_MAX means error */
+       return SND_SOC_TRIGGER_ORDER_MAX;
+}
+
+void graph_util_parse_trigger_order(struct simple_util_priv *priv,
+                                   struct device_node *np,
+                                   enum snd_soc_trigger_order *trigger_start,
+                                   enum snd_soc_trigger_order *trigger_stop)
+{
+       static enum snd_soc_trigger_order order;
+
+       /*
+        * We can use it like below
+        *
+        * #include <dt-bindings/sound/audio-graph.h>
+        *
+        * link-trigger-order = <SND_SOC_TRIGGER_LINK
+        *                       SND_SOC_TRIGGER_COMPONENT
+        *                       SND_SOC_TRIGGER_DAI>;
+        */
+
+       order = __graph_util_parse_trigger_order(priv, np, "link-trigger-order");
+       if (order < SND_SOC_TRIGGER_ORDER_MAX) {
+               *trigger_start = order;
+               *trigger_stop  = order;
+       }
+
+       order = __graph_util_parse_trigger_order(priv, np, "link-trigger-order-start");
+       if (order < SND_SOC_TRIGGER_ORDER_MAX)
+               *trigger_start = order;
+
+       order = __graph_util_parse_trigger_order(priv, np, "link-trigger-order-stop");
+       if (order < SND_SOC_TRIGGER_ORDER_MAX)
+               *trigger_stop  = order;
+
+       return;
+}
+EXPORT_SYMBOL_GPL(graph_util_parse_trigger_order);
+
 /* Module information */
 MODULE_AUTHOR("Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>");
 MODULE_DESCRIPTION("ALSA SoC Simple Card Utils");