/* * On module freeup, we need to unbind the module with modules * it is already bind. * Find the pin allocated and unbind then using bind_unbind IPC */ int skl_unbind_modules(struct skl_sst *ctx, struct skl_module_cfg *src_mcfg, struct skl_module_cfg *dst_mcfg) { int ret; struct skl_ipc_bind_unbind_msg msg; struct skl_module_inst_id src_id = src_mcfg->id; struct skl_module_inst_id dst_id = dst_mcfg->id; int in_max = dst_mcfg->max_in_queue; int out_max = src_mcfg->max_out_queue; int src_index, dst_index; skl_dump_bind_info(ctx, src_mcfg, dst_mcfg); if (src_mcfg->m_state != SKL_MODULE_BIND_DONE) return 0; /* * if intra module unbind, check if both modules are BIND, * then send unbind */ if ((src_mcfg->pipe->ppl_id != dst_mcfg->pipe->ppl_id) && dst_mcfg->m_state != SKL_MODULE_BIND_DONE) return 0; else if (src_mcfg->m_state < SKL_MODULE_INIT_DONE && dst_mcfg->m_state < SKL_MODULE_INIT_DONE) return 0; /* get src queue index */ src_index = skl_get_queue_index(src_mcfg->m_out_pin, dst_id, out_max); if (src_index < 0) return -EINVAL; msg.src_queue = src_mcfg->m_out_pin[src_index].pin_index; /* get dst queue index */ dst_index = skl_get_queue_index(dst_mcfg->m_in_pin, src_id, in_max); if (dst_index < 0) return -EINVAL; msg.dst_queue = dst_mcfg->m_in_pin[dst_index].pin_index; msg.module_id = src_mcfg->id.module_id; msg.instance_id = src_mcfg->id.instance_id; msg.dst_module_id = dst_mcfg->id.module_id; msg.dst_instance_id = dst_mcfg->id.instance_id; msg.bind = false; ret = skl_ipc_bind_unbind(&ctx->ipc, &msg); if (!ret) { src_mcfg->m_state = SKL_MODULE_UNINIT; /* free queue only if unbind is success */ skl_free_queue(src_mcfg->m_out_pin, src_index); skl_free_queue(dst_mcfg->m_in_pin, dst_index); } return ret; }
/* * On module freeup, we need to unbind the module with modules * it is already bind. * Find the pin allocated and unbind then using bind_unbind IPC */ int skl_unbind_modules(struct skl_sst *ctx, struct skl_module_cfg *src_mcfg, struct skl_module_cfg *dst_mcfg) { int ret; struct skl_ipc_bind_unbind_msg msg; struct skl_module_inst_id src_id = src_mcfg->id; struct skl_module_inst_id dst_id = dst_mcfg->id; int in_max = dst_mcfg->module->max_input_pins; int out_max = src_mcfg->module->max_output_pins; int src_index, dst_index, src_pin_state, dst_pin_state; skl_dump_bind_info(ctx, src_mcfg, dst_mcfg); /* get src queue index */ src_index = skl_get_queue_index(src_mcfg->m_out_pin, dst_id, out_max); if (src_index < 0) return 0; msg.src_queue = src_index; /* get dst queue index */ dst_index = skl_get_queue_index(dst_mcfg->m_in_pin, src_id, in_max); if (dst_index < 0) return 0; msg.dst_queue = dst_index; src_pin_state = src_mcfg->m_out_pin[src_index].pin_state; dst_pin_state = dst_mcfg->m_in_pin[dst_index].pin_state; if (src_pin_state != SKL_PIN_BIND_DONE || dst_pin_state != SKL_PIN_BIND_DONE) return 0; msg.module_id = src_mcfg->id.module_id; msg.instance_id = src_mcfg->id.pvt_id; msg.dst_module_id = dst_mcfg->id.module_id; msg.dst_instance_id = dst_mcfg->id.pvt_id; msg.bind = false; ret = skl_ipc_bind_unbind(&ctx->ipc, &msg); if (!ret) { /* free queue only if unbind is success */ skl_free_queue(src_mcfg->m_out_pin, src_index); skl_free_queue(dst_mcfg->m_in_pin, dst_index); /* * check only if src module bind state, bind is * always from src -> sink */ skl_clear_module_state(src_mcfg->m_out_pin, out_max, src_mcfg); } return ret; }