From 6e4aba1606af771e4a8b238d442f5ed9e9f89082 Mon Sep 17 00:00:00 2001 From: Manikantan R Date: Thu, 29 Jan 2026 15:56:17 +0530 Subject: [PATCH 1/2] audioreach-kernel: fix SPF state response handling q6apm callback function incorrectly processes SPF state responses by using header opcode, this causes the spf to always appear up. This change properly extracts the SPF status from the response payload and correctly populates the result & status values for accurate SPF state tracking. In addition push wait queue signalling to end of callback as apm spf query function waits on this queue. Signed-off-by: Manikantan R --- audioreach-driver/q6apm_audio_pkt.c | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/audioreach-driver/q6apm_audio_pkt.c b/audioreach-driver/q6apm_audio_pkt.c index 88e5bc5..75bac73 100644 --- a/audioreach-driver/q6apm_audio_pkt.c +++ b/audioreach-driver/q6apm_audio_pkt.c @@ -115,6 +115,15 @@ struct gpr_port_map { u32 dst_port; }; +struct apm_cmd_rsp_get_spf_status_t { + /* Spf status + * @values + * 0 -> Not ready + * 1 -> Ready + */ + uint32_t status; +}; + #define dev_to_audpkt_dev(_dev) container_of(_dev, struct q6apm_audio_pkt, dev) #define cdev_to_audpkt_dev(_cdev) container_of(_cdev, struct q6apm_audio_pkt, cdev) @@ -596,6 +605,7 @@ static int q6apm_audio_pkt_callback(struct gpr_resp_pkt *data, void *priv, int o struct q6apm_audio_pkt *apm = dev_get_drvdata(&gdev->dev); struct gpr_ibasic_rsp_result_t *result; struct gpr_hdr *hdr = &data->hdr; + struct apm_cmd_rsp_get_spf_status_t *spf_status; uint8_t *pkt = NULL; uint16_t hdr_size, pkt_size; unsigned long flags; @@ -638,16 +648,17 @@ static int q6apm_audio_pkt_callback(struct gpr_resp_pkt *data, void *priv, int o skb_queue_tail(&apm->queue, skb); spin_unlock_irqrestore(&apm->queue_lock, flags); + if (hdr->opcode == APM_CMD_RSP_GET_SPF_STATE) { + result = data->payload; + spf_status = (struct apm_cmd_rsp_get_spf_status_t *)(pkt+hdr_size); + apm->result.opcode = result->opcode; + apm->result.status = result->status; + /* First word of result it state */ + apm->state = spf_status->status; + } /* wake up any blocking processes, waiting for new data */ wake_up_interruptible(&apm->readq); - if(hdr->opcode == APM_CMD_RSP_GET_SPF_STATE) { - result = data->payload; - apm->result.opcode = hdr->opcode; - apm->result.status = 0; - /* First word of result it state */ - apm->state = hdr->opcode; - } return 0; } From f2c1b6e7bf3f3c94194cd346b598011dcda1e7ed Mon Sep 17 00:00:00 2001 From: Manikantan R Date: Thu, 29 Jan 2026 16:12:52 +0530 Subject: [PATCH 2/2] audioreach-kernel: use resource managed version of of_platform_populate update proble and remove callback to use devres managed api for of_platform_populate. Signed-off-by: Manikantan R --- audioreach-driver/q6apm_audio_pkt.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/audioreach-driver/q6apm_audio_pkt.c b/audioreach-driver/q6apm_audio_pkt.c index 75bac73..ccf946c 100644 --- a/audioreach-driver/q6apm_audio_pkt.c +++ b/audioreach-driver/q6apm_audio_pkt.c @@ -585,7 +585,7 @@ static int q6apm_audio_pkt_probe(gpr_device_t *adev) q6apm_audio_is_adsp_ready(); AUDIO_PKT_INFO("Audio Packet Port Driver Initialized\n"); - return of_platform_populate(dev->of_node, NULL, NULL, dev); + return devm_of_platform_populate(dev); free_dev: put_device(dev); @@ -665,7 +665,7 @@ static int q6apm_audio_pkt_callback(struct gpr_resp_pkt *data, void *priv, int o static void q6apm_audio_pkt_remove(gpr_device_t *adev) { - of_platform_depopulate(&adev->dev); + return; } #ifdef CONFIG_OF