From 732be8960cae227837bb6d43a82498a7bc0502e8 Mon Sep 17 00:00:00 2001 From: Kai Vehmanen Date: Thu, 16 Feb 2023 15:14:46 +0200 Subject: [PATCH 1/3] dai-zephyr: fix state dependent logic in trigger handling The component state dependent actions in dai_comp_trigger_internal() are not working as intended as dev->state is already updated to new target state at the start of the function. Update the logic to correctly evaluate previous state in trigger actions. Signed-off-by: Kai Vehmanen --- src/audio/dai-zephyr.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/audio/dai-zephyr.c b/src/audio/dai-zephyr.c index bbe0e7aec3dd..b1d2098dbf67 100644 --- a/src/audio/dai-zephyr.c +++ b/src/audio/dai-zephyr.c @@ -1014,6 +1014,7 @@ static void dai_update_start_position(struct comp_dev *dev) static int dai_comp_trigger_internal(struct comp_dev *dev, int cmd) { struct dai_data *dd = comp_get_drvdata(dev); + int prev_state = dev->state; int ret; comp_dbg(dev, "dai_comp_trigger_internal(), command = %u", cmd); @@ -1101,7 +1102,7 @@ static int dai_comp_trigger_internal(struct comp_dev *dev, int cmd) dai_trigger_op(dd->dai, cmd, dev->direction); #else dai_trigger_op(dd->dai, cmd, dev->direction); - if (dev->state == COMP_STATE_ACTIVE) { + if (prev_state == COMP_STATE_ACTIVE) { ret = dma_stop(dd->chan->dma->z_dev, dd->chan->index); } else { comp_warn(dev, "dma was stopped earlier"); @@ -1111,7 +1112,7 @@ static int dai_comp_trigger_internal(struct comp_dev *dev, int cmd) break; case COMP_TRIGGER_PAUSE: comp_dbg(dev, "dai_comp_trigger_internal(), PAUSE"); - if (dev->state == COMP_STATE_ACTIVE) { + if (prev_state == COMP_STATE_ACTIVE) { ret = dma_suspend(dd->chan->dma->z_dev, dd->chan->index); } else { comp_warn(dev, "dma was stopped earlier"); From 67e6ff43719a02c5ad00aebdf05e89210aa4077e Mon Sep 17 00:00:00 2001 From: Kai Vehmanen Date: Thu, 16 Feb 2023 16:14:14 +0200 Subject: [PATCH 2/3] dai-zephyr: call dma_stop() also if previous state is COMP_STATE_PAUSED To ensure DMA is stopped in all cases, we need to call dma_stop() also when the previous state is PAUSED. With Zephyr commit ec9d94e06d4a ("dma: Document expected behavior of start/stop") the dma interface semantics were clarified. Build on this and call dma_stop() in all cases and make the code simpler to follow. Signed-off-by: Kai Vehmanen --- src/audio/dai-zephyr.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/audio/dai-zephyr.c b/src/audio/dai-zephyr.c index b1d2098dbf67..bb2581af654c 100644 --- a/src/audio/dai-zephyr.c +++ b/src/audio/dai-zephyr.c @@ -1102,9 +1102,8 @@ static int dai_comp_trigger_internal(struct comp_dev *dev, int cmd) dai_trigger_op(dd->dai, cmd, dev->direction); #else dai_trigger_op(dd->dai, cmd, dev->direction); - if (prev_state == COMP_STATE_ACTIVE) { - ret = dma_stop(dd->chan->dma->z_dev, dd->chan->index); - } else { + ret = dma_stop(dd->chan->dma->z_dev, dd->chan->index); + if (ret) { comp_warn(dev, "dma was stopped earlier"); ret = 0; } From cc5b53905c2d1e7b51ea7ffb6c96d7488997059d Mon Sep 17 00:00:00 2001 From: Kai Vehmanen Date: Wed, 1 Feb 2023 15:18:21 +0200 Subject: [PATCH 3/3] west.yml: upgrade Zephyr to 8f34181e3dd7 + PR54900 backport Update Zephyr to latest version plus cherry-pick PR54900 https://github.com/zephyrproject-rtos/zephyr/pull/54900 on top. Signed-off-by: Kai Vehmanen --- west.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/west.yml b/west.yml index 9a8dd39c578b..619ee9620a5b 100644 --- a/west.yml +++ b/west.yml @@ -11,6 +11,8 @@ manifest: url-base: https://github.com/thesofproject - name: zephyrproject url-base: https://github.com/zephyrproject-rtos + - name: kvzephyrproject + url-base: https://github.com/kv2019i # When upgrading projects here please run git log --oneline in the # project and if not too long then include the output in your commit @@ -43,8 +45,8 @@ manifest: - name: zephyr repo-path: zephyr - revision: d9c4ec31fc49e7eef3c8c3b0d07827cc04e6efee - remote: zephyrproject + revision: 8f34181e3dd73fa7c1a552be01aa48abbad6ca84 + remote: kvzephyrproject # Import some projects listed in zephyr/west.yml@revision # # Warning: changes to zephyr/west.yml or to any other _imported_