dai: release llp slot when dai is free

At first llp slot is released by dai_dma_free for dai_free in
ipc4 path. Now dai_dma_free is removed from dai_free, so add
another function dai_release_llp_slot to free llp slot in
dai_free.

Signed-off-by: Rander Wang <rander.wang@intel.com>
This commit is contained in:
Rander Wang 2022-12-07 21:07:19 +08:00 committed by Liam Girdwood
parent efe51fa90a
commit 8cdf8e1e17
6 changed files with 38 additions and 5 deletions

View File

@ -234,6 +234,8 @@ static void dai_free(struct comp_dev *dev)
dma_put(dd->dma);
dai_release_llp_slot(dev);
dai_put(dd->dai);
if (dd->dai_spec_config)

View File

@ -367,6 +367,8 @@ static void dai_free(struct comp_dev *dev)
dma_put(dd->dma);
dai_release_llp_slot(dev);
dai_put(dd->dai);
rfree(dd->dai_spec_config);

View File

@ -570,6 +570,11 @@ int dai_position(struct comp_dev *dev, struct sof_ipc_stream_posn *posn);
* \brief update dai dma position for host driver.
*/
void dai_dma_position_update(struct comp_dev *dev);
/**
* \brief release llp slot
*/
void dai_release_llp_slot(struct comp_dev *dev);
/** @}*/
#endif /* __SOF_LIB_DAI_LEGACY_H__ */

View File

@ -278,6 +278,11 @@ int dai_position(struct comp_dev *dev, struct sof_ipc_stream_posn *posn);
* \brief update dai dma position for host driver.
*/
void dai_dma_position_update(struct comp_dev *dev);
/**
* \brief release llp slot
*/
void dai_release_llp_slot(struct comp_dev *dev);
/** @}*/
#endif /* __SOF_LIB_DAI_ZEPHYR_H__ */

View File

@ -397,3 +397,5 @@ int dai_position(struct comp_dev *dev, struct sof_ipc_stream_posn *posn)
}
void dai_dma_position_update(struct comp_dev *dev) { }
void dai_release_llp_slot(struct comp_dev *dev) { }

View File

@ -158,11 +158,8 @@ void dai_dma_release(struct comp_dev *dev)
if (dd->slot_info.node_id) {
k_spinlock_key_t key;
/* reset llp position to 0 in memory window for reset state.
* clear node id and llp position to 0 when dai is free
*/
/* reset llp position to 0 in memory window for reset state. */
memset_s(&slot, sizeof(slot), 0, sizeof(slot));
if (dev->state == COMP_STATE_PAUSED)
slot.node_id = dd->slot_info.node_id;
key = k_spin_lock(&sof_get()->fw_reg_lock);
@ -193,6 +190,26 @@ void dai_dma_release(struct comp_dev *dev)
}
}
void dai_release_llp_slot(struct comp_dev *dev)
{
struct dai_data *dd = comp_get_drvdata(dev);
struct ipc4_llp_reading_slot slot;
k_spinlock_key_t key;
if (!dd->slot_info.node_id)
return;
memset_s(&slot, sizeof(slot), 0, sizeof(slot));
/* clear node id for released llp slot */
key = k_spin_lock(&sof_get()->fw_reg_lock);
mailbox_sw_regs_write(dd->slot_info.reg_offset, &slot, sizeof(slot));
k_spin_unlock(&sof_get()->fw_reg_lock, key);
dd->slot_info.reg_offset = 0;
dd->slot_info.node_id = 0;
}
static int dai_get_unused_llp_slot(struct comp_dev *dev,
union ipc4_connector_node_id *node)
{