Lines Matching refs:cmdq

62 	struct cmdq		*cmdq;  member
69 struct cmdq { struct
79 static int cmdq_thread_suspend(struct cmdq *cmdq, struct cmdq_thread *thread) in cmdq_thread_suspend() argument
91 dev_err(cmdq->mbox.dev, "suspend GCE thread 0x%x failed\n", in cmdq_thread_suspend()
92 (u32)(thread->base - cmdq->base)); in cmdq_thread_suspend()
104 static void cmdq_init(struct cmdq *cmdq) in cmdq_init() argument
106 WARN_ON(clk_enable(cmdq->clock) < 0); in cmdq_init()
107 writel(CMDQ_THR_ACTIVE_SLOT_CYCLES, cmdq->base + CMDQ_THR_SLOT_CYCLES); in cmdq_init()
108 clk_disable(cmdq->clock); in cmdq_init()
111 static int cmdq_thread_reset(struct cmdq *cmdq, struct cmdq_thread *thread) in cmdq_thread_reset() argument
119 dev_err(cmdq->mbox.dev, "reset GCE thread 0x%x failed\n", in cmdq_thread_reset()
120 (u32)(thread->base - cmdq->base)); in cmdq_thread_reset()
127 static void cmdq_thread_disable(struct cmdq *cmdq, struct cmdq_thread *thread) in cmdq_thread_disable() argument
129 cmdq_thread_reset(cmdq, thread); in cmdq_thread_disable()
142 struct device *dev = task->cmdq->mbox.dev; in cmdq_task_insert_into_thread()
171 struct device *dev = task->cmdq->mbox.dev; in cmdq_task_remove_wfe()
219 dev_err(task->cmdq->mbox.dev, "task 0x%p error\n", task); in cmdq_task_handle_error()
220 WARN_ON(cmdq_thread_suspend(task->cmdq, thread) < 0); in cmdq_task_handle_error()
228 static void cmdq_thread_irq_handler(struct cmdq *cmdq, in cmdq_thread_irq_handler() argument
276 cmdq_thread_disable(cmdq, thread); in cmdq_thread_irq_handler()
277 clk_disable(cmdq->clock); in cmdq_thread_irq_handler()
283 struct cmdq *cmdq = dev; in cmdq_irq_handler() local
287 irq_status = readl(cmdq->base + CMDQ_CURR_IRQ_STATUS) & CMDQ_IRQ_MASK; in cmdq_irq_handler()
292 struct cmdq_thread *thread = &cmdq->thread[bit]; in cmdq_irq_handler()
295 cmdq_thread_irq_handler(cmdq, thread); in cmdq_irq_handler()
304 struct cmdq *cmdq = dev_get_drvdata(dev); in cmdq_suspend() local
309 cmdq->suspended = true; in cmdq_suspend()
311 for (i = 0; i < cmdq->thread_nr; i++) { in cmdq_suspend()
312 thread = &cmdq->thread[i]; in cmdq_suspend()
322 clk_unprepare(cmdq->clock); in cmdq_suspend()
329 struct cmdq *cmdq = dev_get_drvdata(dev); in cmdq_resume() local
331 WARN_ON(clk_prepare(cmdq->clock) < 0); in cmdq_resume()
332 cmdq->suspended = false; in cmdq_resume()
338 struct cmdq *cmdq = platform_get_drvdata(pdev); in cmdq_remove() local
340 mbox_controller_unregister(&cmdq->mbox); in cmdq_remove()
341 clk_unprepare(cmdq->clock); in cmdq_remove()
343 if (cmdq->mbox.chans) in cmdq_remove()
344 devm_kfree(&pdev->dev, cmdq->mbox.chans); in cmdq_remove()
346 if (cmdq->thread) in cmdq_remove()
347 devm_kfree(&pdev->dev, cmdq->thread); in cmdq_remove()
349 devm_kfree(&pdev->dev, cmdq); in cmdq_remove()
358 struct cmdq *cmdq = dev_get_drvdata(chan->mbox->dev); in cmdq_mbox_send_data() local
363 WARN_ON(cmdq->suspended); in cmdq_mbox_send_data()
366 task->cmdq = cmdq; in cmdq_mbox_send_data()
373 WARN_ON(clk_enable(cmdq->clock) < 0); in cmdq_mbox_send_data()
374 WARN_ON(cmdq_thread_reset(cmdq, thread) < 0); in cmdq_mbox_send_data()
383 WARN_ON(cmdq_thread_suspend(cmdq, thread) < 0); in cmdq_mbox_send_data()
396 WARN_ON(cmdq_thread_suspend(cmdq, thread) < 0); in cmdq_mbox_send_data()
462 struct cmdq *cmdq; in cmdq_probe() local
465 cmdq = devm_kzalloc(dev, sizeof(*cmdq), GFP_KERNEL); in cmdq_probe()
466 if (!cmdq) in cmdq_probe()
470 cmdq->base = devm_ioremap_resource(dev, res); in cmdq_probe()
471 if (IS_ERR(cmdq->base)) { in cmdq_probe()
473 return PTR_ERR(cmdq->base); in cmdq_probe()
476 cmdq->irq = platform_get_irq(pdev, 0); in cmdq_probe()
477 if (!cmdq->irq) { in cmdq_probe()
481 err = devm_request_irq(dev, cmdq->irq, cmdq_irq_handler, IRQF_SHARED, in cmdq_probe()
482 "mtk_cmdq", cmdq); in cmdq_probe()
489 dev, cmdq->base, cmdq->irq); in cmdq_probe()
491 cmdq->clock = devm_clk_get(dev, "gce"); in cmdq_probe()
492 if (IS_ERR(cmdq->clock)) { in cmdq_probe()
494 return PTR_ERR(cmdq->clock); in cmdq_probe()
497 cmdq->thread_nr = (u32)(unsigned long)of_device_get_match_data(dev); in cmdq_probe()
498 cmdq->mbox.dev = dev; in cmdq_probe()
499 cmdq->mbox.chans = devm_kcalloc(dev, cmdq->thread_nr, in cmdq_probe()
500 sizeof(*cmdq->mbox.chans), GFP_KERNEL); in cmdq_probe()
501 if (!cmdq->mbox.chans) in cmdq_probe()
504 cmdq->mbox.num_chans = cmdq->thread_nr; in cmdq_probe()
505 cmdq->mbox.ops = &cmdq_mbox_chan_ops; in cmdq_probe()
506 cmdq->mbox.of_xlate = cmdq_xlate; in cmdq_probe()
509 cmdq->mbox.txdone_irq = false; in cmdq_probe()
510 cmdq->mbox.txdone_poll = false; in cmdq_probe()
512 cmdq->thread = devm_kcalloc(dev, cmdq->thread_nr, in cmdq_probe()
513 sizeof(*cmdq->thread), GFP_KERNEL); in cmdq_probe()
514 if (!cmdq->thread) in cmdq_probe()
517 for (i = 0; i < cmdq->thread_nr; i++) { in cmdq_probe()
518 cmdq->thread[i].base = cmdq->base + CMDQ_THR_BASE + in cmdq_probe()
520 INIT_LIST_HEAD(&cmdq->thread[i].task_busy_list); in cmdq_probe()
521 cmdq->mbox.chans[i].con_priv = (void *)&cmdq->thread[i]; in cmdq_probe()
524 err = mbox_controller_register(&cmdq->mbox); in cmdq_probe()
530 platform_set_drvdata(pdev, cmdq); in cmdq_probe()
531 WARN_ON(clk_prepare(cmdq->clock) < 0); in cmdq_probe()
533 cmdq_init(cmdq); in cmdq_probe()