ASoC: qdsp6: audioreach: Add ADSP ready check
authorSrinivasa Rao Mandadapu <quic_srivasam@quicinc.com>
Thu, 12 Jan 2023 07:30:17 +0000 (13:00 +0530)
committerMark Brown <broonie@kernel.org>
Mon, 23 Jan 2023 13:31:00 +0000 (13:31 +0000)
Check for SPF readiness in prm driver probe to avoid race conditions
during ADSP pil loading.
This patch is to avoid, sending requests to ADSP before it's
power domains are up and ready.

Signed-off-by: Srinivasa Rao Mandadapu <quic_srivasam@quicinc.com>
Tested-by: Ratna Deepthi Kudaravalli <rkudarav@qti.qualcomm.com>
Link: https://lore.kernel.org/r/1673508617-27410-1-git-send-email-quic_srivasam@quicinc.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/qcom/qdsp6/q6apm.c
sound/soc/qcom/qdsp6/q6apm.h
sound/soc/qcom/qdsp6/q6prm.c

index 5beb898f28f5c223992d31888087ae9c9dd52769..8a7dfd27d3c561ceeb0695881f2414a0ef4b37b8 100644 (file)
@@ -27,6 +27,8 @@ struct apm_graph_mgmt_cmd {
 
 #define APM_GRAPH_MGMT_PSIZE(p, n) ALIGN(struct_size(p, sub_graph_id_list, n), 8)
 
+struct q6apm *g_apm;
+
 int q6apm_send_cmd_sync(struct q6apm *apm, struct gpr_pkt *pkt, uint32_t rsp_opcode)
 {
        gpr_device_t *gdev = apm->gdev;
@@ -143,6 +145,15 @@ static void q6apm_put_audioreach_graph(struct kref *ref)
        kfree(graph);
 }
 
+bool q6apm_is_adsp_ready(void)
+{
+       if (g_apm && g_apm->state)
+               return true;
+
+       return false;
+}
+EXPORT_SYMBOL_GPL(q6apm_is_adsp_ready);
+
 static int q6apm_get_apm_state(struct q6apm *apm)
 {
        struct gpr_pkt *pkt;
@@ -658,6 +669,8 @@ static int apm_probe(gpr_device_t *gdev)
 
        idr_init(&apm->modules_idr);
 
+       g_apm = apm;
+
        q6apm_get_apm_state(apm);
 
        ret = devm_snd_soc_register_component(dev, &q6apm_audio_component, NULL, 0);
index 273f97812741aaf41e806cf04d0235d2350baf02..7005be9b63e339f1cbf0e81ade4650f13d0b4521 100644 (file)
@@ -145,4 +145,6 @@ struct audioreach_module *q6apm_find_module_by_mid(struct q6apm_graph *graph,
 void q6apm_set_fe_dai_ops(struct snd_soc_dai_driver *dai_drv);
 int q6apm_graph_get_rx_shmem_module_iid(struct q6apm_graph *graph);
 
+bool q6apm_is_adsp_ready(void);
+
 #endif /* __APM_GRAPH_ */
index 8aa1a213bfb7563a35cbc5eeaa3b424f0eae7611..3aa63aac4a68e28540b06e5af4ca4ed151407a2a 100644 (file)
@@ -12,6 +12,7 @@
 #include <linux/soc/qcom/apr.h>
 #include <dt-bindings/soc/qcom,gpr.h>
 #include <dt-bindings/sound/qcom,q6dsp-lpass-ports.h>
+#include "q6apm.h"
 #include "q6prm.h"
 #include "audioreach.h"
 
@@ -226,6 +227,9 @@ static int prm_probe(gpr_device_t *gdev)
        init_waitqueue_head(&cc->wait);
        dev_set_drvdata(dev, cc);
 
+       if (!q6apm_is_adsp_ready())
+               return -EPROBE_DEFER;
+
        return devm_of_platform_populate(dev);
 }