ipc_task
ipc_task_deinit(ipc_imem->ipc_task);
kfree(ipc_imem->ipc_task);
ipc_imem->ipc_task = kzalloc_obj(*ipc_imem->ipc_task);
if (!ipc_imem->ipc_task)
if (ipc_task_init(ipc_imem->ipc_task))
ipc_imem->ipc_task->dev = ipc_imem->dev;
ipc_task_deinit(ipc_imem->ipc_task);
kfree(ipc_imem->ipc_task);
struct ipc_task *ipc_task;
if (nextpos != ipc_task->q_rpos) {
ipc_task->args[pos].arg = arg;
ipc_task->args[pos].msg = msg;
ipc_task->args[pos].func = func;
ipc_task->args[pos].ipc_imem = ipc_imem;
ipc_task->args[pos].size = size;
ipc_task->args[pos].is_copy = is_copy;
ipc_task->args[pos].completion = wait ? &completion : NULL;
ipc_task->args[pos].response = -1;
ipc_task->q_wpos = nextpos;
spin_unlock_irqrestore(&ipc_task->q_lock, flags);
result = ipc_task->args[pos].response;
dev_err(ipc_imem->ipc_task->dev, "queue is full");
struct ipc_task_queue *ipc_task = (struct ipc_task_queue *)data;
unsigned int q_rpos = ipc_task->q_rpos;
dev_err(imem->ipc_task->dev,
int ipc_task_init(struct ipc_task *ipc_task)
struct ipc_task_queue *ipc_queue = &ipc_task->ipc_queue;
ipc_task->ipc_tasklet = kzalloc_obj(*ipc_task->ipc_tasklet);
if (!ipc_task->ipc_tasklet)
while (q_rpos != ipc_task->q_wpos) {
tasklet_init(ipc_task->ipc_tasklet, ipc_task_queue_handler,
void ipc_task_deinit(struct ipc_task *ipc_task)
tasklet_kill(ipc_task->ipc_tasklet);
kfree(ipc_task->ipc_tasklet);
struct ipc_task_queue_args *args = &ipc_task->args[q_rpos];
ipc_task_queue_cleanup(&ipc_task->ipc_queue);
ipc_task->q_rpos = q_rpos;
static void ipc_task_queue_cleanup(struct ipc_task_queue *ipc_task)
unsigned int q_rpos = ipc_task->q_rpos;
while (q_rpos != ipc_task->q_wpos) {
struct ipc_task_queue_args *args = &ipc_task->args[q_rpos];
ipc_task->q_rpos = q_rpos;
struct tasklet_struct *ipc_tasklet = ipc_imem->ipc_task->ipc_tasklet;
struct ipc_task_queue *ipc_task = &ipc_imem->ipc_task->ipc_queue;
spin_lock_irqsave(&ipc_task->q_lock, flags);
pos = ipc_task->q_wpos;
int ipc_task_init(struct ipc_task *ipc_task);
void ipc_task_deinit(struct ipc_task *ipc_task);