dma: reset DGCS_GEN when pipeline is reset

DGCS_GEN bit should be set to 0 on a pipeline state change to reset

Signed-off-by: Kwasowiec, Fabiola <fabiola.kwasowiec@intel.com>
This commit is contained in:
Kwasowiec, Fabiola 2023-04-13 08:48:19 +02:00 committed by Michal Wasko
parent 2185d4a04b
commit 0f20e2affb
3 changed files with 11 additions and 29 deletions

View File

@ -1033,7 +1033,6 @@ static int dai_reset(struct comp_dev *dev)
/* used to pass standard and bespoke command (with data) to component */
static int dai_comp_trigger_internal(struct dai_data *dd, struct comp_dev *dev, int cmd)
{
int prev_state = dev->state;
int ret;
comp_dbg(dev, "dai_comp_trigger_internal(), command = %u", cmd);
@ -1079,11 +1078,9 @@ static int dai_comp_trigger_internal(struct dai_data *dd, struct comp_dev *dev,
/* only start the DAI if we are not XRUN handling */
if (dd->xrun == 0) {
/* recover valid start position */
if (dev->state == COMP_STATE_ACTIVE) {
ret = dma_stop(dd->chan->dma->z_dev, dd->chan->index);
if (ret < 0)
return ret;
}
ret = dma_stop(dd->chan->dma->z_dev, dd->chan->index);
if (ret < 0)
return ret;
/* dma_config needed after stop */
ret = dma_config(dd->chan->dma->z_dev, dd->chan->index, dd->z_config);
@ -1132,21 +1129,11 @@ static int dai_comp_trigger_internal(struct dai_data *dd, struct comp_dev *dev,
case COMP_TRIGGER_PAUSE:
comp_dbg(dev, "dai_comp_trigger_internal(), PAUSE");
#if CONFIG_COMP_DAI_TRIGGER_ORDER_REVERSE
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");
ret = 0;
}
ret = dma_suspend(dd->chan->dma->z_dev, dd->chan->index);
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_suspend(dd->chan->dma->z_dev, dd->chan->index);
} else {
comp_warn(dev, "dma was stopped earlier");
ret = 0;
}
ret = dma_suspend(dd->chan->dma->z_dev, dd->chan->index);
#endif
break;
case COMP_TRIGGER_PRE_START:

View File

@ -557,13 +557,10 @@ int host_zephyr_trigger(struct host_data *hd, struct comp_dev *dev, int cmd)
break;
case COMP_TRIGGER_STOP:
case COMP_TRIGGER_XRUN:
if (dev->state == COMP_STATE_ACTIVE) {
ret = dma_stop(hd->chan->dma->z_dev, hd->chan->index);
if (ret < 0)
comp_err(dev, "host_trigger(): dma stop failed: %d",
ret);
}
ret = dma_stop(hd->chan->dma->z_dev, hd->chan->index);
if (ret < 0)
comp_err(dev, "host_trigger(): dma stop failed: %d",
ret);
break;
default:
break;
@ -1015,8 +1012,7 @@ static int host_position(struct comp_dev *dev,
void host_zephyr_reset(struct host_data *hd, uint16_t state)
{
if (hd->chan) {
if (state == COMP_STATE_ACTIVE)
dma_stop(hd->chan->dma->z_dev, hd->chan->index);
dma_stop(hd->chan->dma->z_dev, hd->chan->index);
dma_release_channel(hd->dma->z_dev, hd->chan->index);
hd->chan = NULL;
}

View File

@ -168,8 +168,7 @@ void dai_dma_release(struct dai_data *dd, struct comp_dev *dev)
*/
#if CONFIG_ZEPHYR_NATIVE_DRIVERS
/* if reset is after pause dma has already been stopped */
if (dev->state != COMP_STATE_PAUSED)
dma_stop(dd->chan->dma->z_dev, dd->chan->index);
dma_stop(dd->chan->dma->z_dev, dd->chan->index);
dma_release_channel(dd->chan->dma->z_dev, dd->chan->index);
#else