On 8/3/2021 2:54 PM, Srinivas Kandagatla wrote:
Add support to q6apm (Audio Process Manager) component which is core Audioreach service running in the DSP.
Signed-off-by: Srinivas Kandagatla srinivas.kandagatla@linaro.org
...
diff --git a/sound/soc/qcom/qdsp6/q6apm.c b/sound/soc/qcom/qdsp6/q6apm.c new file mode 100644 index 000000000000..6b0b11204f88 --- /dev/null +++ b/sound/soc/qcom/qdsp6/q6apm.c @@ -0,0 +1,662 @@ +// SPDX-License-Identifier: GPL-2.0 +// Copyright (c) 2020, Linaro Limited
+#include <dt-bindings/soc/qcom,gpr.h> +#include <linux/delay.h> +#include <linux/jiffies.h> +#include <linux/kernel.h> +#include <linux/module.h> +#include <linux/of.h> +#include <linux/of_platform.h> +#include <linux/sched.h> +#include <linux/slab.h> +#include <linux/soc/qcom/apr.h> +#include <linux/wait.h> +#include <sound/soc.h> +#include <sound/soc-dapm.h> +#include <sound/pcm.h> +#include "audioreach.h" +#include "q6apm.h"
+/* Graph Management */ +struct apm_graph_mgmt_cmd {
- struct apm_module_param_data param_data;
- uint32_t num_sub_graphs;
- uint32_t sub_graph_id_list[0];uint32_t sub_graph_id_list[];
+} __packed;
...
+static struct audioreach_graph *q6apm_get_audioreach_graph(struct q6apm *apm,
uint32_t graph_id)
+{
- struct audioreach_graph *graph;
- struct audioreach_graph_info *info;
- unsigned long flags;
- spin_lock_irqsave(&apm->lock, flags);
- graph = idr_find(&apm->graph_idr, graph_id);
- spin_unlock_irqrestore(&apm->lock, flags);
- if (graph) {
kref_get(&graph->refcount);
return graph;
- }
- info = idr_find(&apm->graph_info_idr, graph_id);
- if (!info)
return ERR_PTR(-ENODEV);
- graph = kzalloc(sizeof(*graph), GFP_KERNEL);
- if (!graph)
return ERR_PTR(-ENOMEM);
- graph->apm = apm;
- graph->info = info;
- graph->id = graph_id;
- /* Assuming Linear Graphs only for now! */
- graph->graph = audioreach_alloc_graph_pkt(apm, &info->sg_list, graph_id);
- if (IS_ERR(graph->graph))
return ERR_PTR(-ENOMEM);
Shouldn't graph be freed before returning here?
- spin_lock(&apm->lock);
- idr_alloc(&apm->graph_idr, graph, graph_id,
graph_id + 1, GFP_ATOMIC);
- spin_unlock(&apm->lock);
- kref_init(&graph->refcount);
- q6apm_send_cmd_sync(apm, graph->graph, 0);
- return graph;
+}
...