module_adapter: Extend the module interface

Add the bind/unbind ops that can be optionally implemented by modules to
perform module-specific actions when other modules are bound/unbound
from them.

These are particularly useful for modules such as the mixers, smart_amp,
copier that can have multiple input/output pins.

Signed-off-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com>
This commit is contained in:
Ranjani Sridharan 2023-05-31 09:04:49 -07:00 committed by Liam Girdwood
parent 2d02dd0ed5
commit 5433e371b8
4 changed files with 38 additions and 0 deletions

View File

@ -486,3 +486,21 @@ int module_set_configuration(struct processing_module *mod,
return ret; return ret;
} }
int module_bind(struct processing_module *mod, void *data)
{
struct module_data *md = &mod->priv;
if (md->ops->bind)
return md->ops->bind(mod, data);
return 0;
}
int module_unbind(struct processing_module *mod, void *data)
{
struct module_data *md = &mod->priv;
if (md->ops->unbind)
return md->ops->unbind(mod, data);
return 0;
}

View File

@ -1552,6 +1552,11 @@ int module_adapter_bind(struct comp_dev *dev, void *data)
struct comp_dev *source_dev; struct comp_dev *source_dev;
int source_index; int source_index;
int src_id; int src_id;
int ret;
ret = module_bind(mod, data);
if (ret < 0)
return ret;
bu = (struct ipc4_module_bind_unbind *)data; bu = (struct ipc4_module_bind_unbind *)data;
src_id = IPC4_COMP_ID(bu->primary.r.module_id, bu->primary.r.instance_id); src_id = IPC4_COMP_ID(bu->primary.r.module_id, bu->primary.r.instance_id);
@ -1603,6 +1608,11 @@ int module_adapter_unbind(struct comp_dev *dev, void *data)
struct comp_dev *source_dev; struct comp_dev *source_dev;
int source_index; int source_index;
int src_id; int src_id;
int ret;
ret = module_unbind(mod, data);
if (ret < 0)
return ret;
bu = (struct ipc4_module_bind_unbind *)data; bu = (struct ipc4_module_bind_unbind *)data;
src_id = IPC4_COMP_ID(bu->primary.r.module_id, bu->primary.r.instance_id); src_id = IPC4_COMP_ID(bu->primary.r.module_id, bu->primary.r.instance_id);

View File

@ -255,6 +255,8 @@ int module_set_configuration(struct processing_module *mod,
enum module_cfg_fragment_position pos, size_t data_offset_size, enum module_cfg_fragment_position pos, size_t data_offset_size,
const uint8_t *fragment, size_t fragment_size, uint8_t *response, const uint8_t *fragment, size_t fragment_size, uint8_t *response,
size_t response_size); size_t response_size);
int module_bind(struct processing_module *mod, void *data);
int module_unbind(struct processing_module *mod, void *data);
struct comp_dev *module_adapter_new(const struct comp_driver *drv, struct comp_dev *module_adapter_new(const struct comp_driver *drv,
const struct comp_ipc_config *config, const struct comp_ipc_config *config,

View File

@ -189,6 +189,14 @@ struct module_interface {
* free in .free(). This should free all memory allocated during module initialization. * free in .free(). This should free all memory allocated during module initialization.
*/ */
int (*free)(struct processing_module *mod); int (*free)(struct processing_module *mod);
/**
* Module specific bind procedure, called when modules are bound with each other
*/
int (*bind)(struct processing_module *mod, void *data);
/**
* Module specific unbind procedure, called when modules are disconnected from one another
*/
int (*unbind)(struct processing_module *mod, void *data);
}; };
/* Convert first_block/last_block indicator to fragment position */ /* Convert first_block/last_block indicator to fragment position */