Unverified Commit 5d9cacdc authored by Kuninori Morimoto's avatar Kuninori Morimoto Committed by Mark Brown
Browse files

ASoC: simple-card-utils: add link-trigger-order support



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: default avatarKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Link: https://patch.msgid.link/87r0d2zojq.wl-kuninori.morimoto.gx@renesas.com


Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent fafc20de
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -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,
+71 −0
Original line number Diff line number Diff line
@@ -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");