mirror of
https://github.com/torvalds/linux.git
synced 2024-11-21 19:41:42 +00:00
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: 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>
This commit is contained in:
parent
fafc20ded3
commit
5d9cacdccf
@ -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,
|
void graph_util_parse_link_direction(struct device_node *np,
|
||||||
bool *is_playback_only, bool *is_capture_only);
|
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
|
#ifdef DEBUG
|
||||||
static inline void simple_util_debug_dai(struct simple_util_priv *priv,
|
static inline void simple_util_debug_dai(struct simple_util_priv *priv,
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
//
|
//
|
||||||
// Copyright (c) 2016 Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
|
// Copyright (c) 2016 Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
|
||||||
|
|
||||||
|
#include <dt-bindings/sound/audio-graph.h>
|
||||||
#include <linux/clk.h>
|
#include <linux/clk.h>
|
||||||
#include <linux/gpio/consumer.h>
|
#include <linux/gpio/consumer.h>
|
||||||
#include <linux/module.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);
|
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 information */
|
||||||
MODULE_AUTHOR("Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>");
|
MODULE_AUTHOR("Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>");
|
||||||
MODULE_DESCRIPTION("ALSA SoC Simple Card Utils");
|
MODULE_DESCRIPTION("ALSA SoC Simple Card Utils");
|
||||||
|
Loading…
Reference in New Issue
Block a user