ASoC: SOF: Add a route_free op in struct sof_ipc_tplg_ops
IPC4 requires that the widgets be unbound in the firmware before they are freed. So add a new op in struct sof_ipc_tplg_ops that will be used to send the IPC to the firmware to unbind widgets. Signed-off-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com> Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> Reviewed-by: Bard Liao <yung-chuan.liao@linux.intel.com> Reviewed-by: Péter Ujfalusi <peter.ujfalusi@linux.intel.com> Link: https://lore.kernel.org/r/20220426171743.171061-7-ranjani.sridharan@linux.intel.com Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
7b3a5be546
commit
d77d779554
@ -14,11 +14,16 @@
|
|||||||
|
|
||||||
static void sof_reset_route_setup_status(struct snd_sof_dev *sdev, struct snd_sof_widget *widget)
|
static void sof_reset_route_setup_status(struct snd_sof_dev *sdev, struct snd_sof_widget *widget)
|
||||||
{
|
{
|
||||||
|
const struct sof_ipc_tplg_ops *tplg_ops = sdev->ipc->ops->tplg;
|
||||||
struct snd_sof_route *sroute;
|
struct snd_sof_route *sroute;
|
||||||
|
|
||||||
list_for_each_entry(sroute, &sdev->route_list, list)
|
list_for_each_entry(sroute, &sdev->route_list, list)
|
||||||
if (sroute->src_widget == widget || sroute->sink_widget == widget)
|
if (sroute->src_widget == widget || sroute->sink_widget == widget) {
|
||||||
|
if (sroute->setup && tplg_ops->route_free)
|
||||||
|
tplg_ops->route_free(sdev, sroute);
|
||||||
|
|
||||||
sroute->setup = false;
|
sroute->setup = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int sof_widget_free(struct snd_sof_dev *sdev, struct snd_sof_widget *swidget)
|
int sof_widget_free(struct snd_sof_dev *sdev, struct snd_sof_widget *swidget)
|
||||||
|
@ -146,6 +146,7 @@ struct sof_ipc_tplg_widget_ops {
|
|||||||
* initialized to 0.
|
* initialized to 0.
|
||||||
* @control: Pointer to the IPC-specific ops for topology kcontrol IO
|
* @control: Pointer to the IPC-specific ops for topology kcontrol IO
|
||||||
* @route_setup: Function pointer for setting up pipeline connections
|
* @route_setup: Function pointer for setting up pipeline connections
|
||||||
|
* @route_free: Optional op for freeing pipeline connections.
|
||||||
* @token_list: List of all tokens supported by the IPC version. The size of the token_list
|
* @token_list: List of all tokens supported by the IPC version. The size of the token_list
|
||||||
* array should be SOF_TOKEN_COUNT. The unused elements in the array will be
|
* array should be SOF_TOKEN_COUNT. The unused elements in the array will be
|
||||||
* initialized to 0.
|
* initialized to 0.
|
||||||
@ -163,6 +164,7 @@ struct sof_ipc_tplg_ops {
|
|||||||
const struct sof_ipc_tplg_widget_ops *widget;
|
const struct sof_ipc_tplg_widget_ops *widget;
|
||||||
const struct sof_ipc_tplg_control_ops *control;
|
const struct sof_ipc_tplg_control_ops *control;
|
||||||
int (*route_setup)(struct snd_sof_dev *sdev, struct snd_sof_route *sroute);
|
int (*route_setup)(struct snd_sof_dev *sdev, struct snd_sof_route *sroute);
|
||||||
|
int (*route_free)(struct snd_sof_dev *sdev, struct snd_sof_route *sroute);
|
||||||
const struct sof_token_info *token_list;
|
const struct sof_token_info *token_list;
|
||||||
int (*control_setup)(struct snd_sof_dev *sdev, struct snd_sof_control *scontrol);
|
int (*control_setup)(struct snd_sof_dev *sdev, struct snd_sof_control *scontrol);
|
||||||
int (*control_free)(struct snd_sof_dev *sdev, struct snd_sof_control *scontrol);
|
int (*control_free)(struct snd_sof_dev *sdev, struct snd_sof_control *scontrol);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user