in core.c [1090:1151]
int most_start_channel(struct most_interface *iface, int id,
struct most_component *comp)
{
int num_buffer;
int ret;
struct most_channel *c = iface->p->channel[id];
if (unlikely(!c))
return -EINVAL;
mutex_lock(&c->start_mutex);
if (c->pipe0.refs + c->pipe1.refs > 0)
goto out; /* already started by another component */
if (!try_module_get(iface->mod)) {
dev_err(&c->dev, "Failed to acquire HDM lock\n");
mutex_unlock(&c->start_mutex);
return -ENOLCK;
}
c->cfg.extra_len = 0;
if (c->iface->configure(c->iface, c->channel_id, &c->cfg)) {
dev_err(&c->dev, "Channel configuration failed. Go check settings...\n");
ret = -EINVAL;
goto err_put_module;
}
init_waitqueue_head(&c->hdm_fifo_wq);
if (c->cfg.direction == MOST_CH_RX)
num_buffer = arm_mbo_chain(c, c->cfg.direction,
most_read_completion);
else
num_buffer = arm_mbo_chain(c, c->cfg.direction,
most_write_completion);
if (unlikely(!num_buffer)) {
ret = -ENOMEM;
goto err_put_module;
}
ret = run_enqueue_thread(c, id);
if (ret)
goto err_put_module;
c->is_starving = 0;
c->pipe0.num_buffers = c->cfg.num_buffers / 2;
c->pipe1.num_buffers = c->cfg.num_buffers - c->pipe0.num_buffers;
atomic_set(&c->mbo_ref, num_buffer);
out:
if (comp == c->pipe0.comp)
c->pipe0.refs++;
if (comp == c->pipe1.comp)
c->pipe1.refs++;
mutex_unlock(&c->start_mutex);
return 0;
err_put_module:
module_put(iface->mod);
mutex_unlock(&c->start_mutex);
return ret;
}