mirror of https://github.com/thesofproject/sof.git
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:
parent
efe51fa90a
commit
8cdf8e1e17
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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__ */
|
||||
|
|
|
@ -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__ */
|
||||
|
|
|
@ -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) { }
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue