Lines Matching full:vpu
23 * VPU (video processor unit) is a tiny processor controlling video hardware
25 * VPU interfaces with other blocks by share memory and interrupt.
44 /* the size of share buffer between Host and VPU */
68 /* vpu inter-processor communication interrupt */
70 /* vpu idle state */
74 * enum vpu_fw_type - VPU firmware type
86 * struct vpu_mem - VPU extended program/data memory information
88 * @va: the kernel virtual memory address of VPU extended memory
89 * @pa: the physical memory address of VPU extended memory
98 * struct vpu_regs - VPU TCM and configuration registers
100 * @tcm: the register for VPU Tightly-Coupled Memory
101 * @cfg: the register for VPU configuration
102 * @irq: the irq number for VPU interrupt
111 * struct vpu_wdt_handler - VPU watchdog reset handler
122 * struct vpu_wdt - VPU watchdog workqueue
124 * @handler: VPU watchdog reset handler
125 * @ws: workstruct for VPU watchdog
126 * @wq: workqueue for VPU watchdog
135 * struct vpu_run - VPU initialization status
137 * @signaled: the signal of vpu initialization completed
138 * @fw_ver: VPU firmware version
143 * @wq: wait queue for VPU initialization status
154 * struct vpu_ipi_desc - VPU IPI descriptor
168 * AP and VPU
181 * struct mtk_vpu - vpu driver data
182 * @extmem: VPU extended memory information
183 * @reg: VPU TCM and configuration registers
184 * @run: VPU initialization status
185 * @wdt: VPU watchdog workqueue
186 * @ipi_desc: VPU IPI descriptor
187 * @recv_buf: VPU DTCM share buffer for receiving. The
189 * @send_buf: VPU DTCM share buffer for sending
190 * @dev: VPU struct device
191 * @clk: VPU clock on/off
192 * @fw_loaded: indicate VPU firmware loaded
193 * @enable_4GB: VPU 4GB mode on/off
195 * one client to use VPU service at a time. For example,
196 * suppose a client is using VPU to decode VP8.
200 * disabled if no other client is using VPU service
206 * interrupt to VPU
221 struct mutex vpu_mutex; /* for protecting vpu data data structure */
227 static inline void vpu_cfg_writel(struct mtk_vpu *vpu, u32 val, u32 offset) in vpu_cfg_writel() argument
229 writel(val, vpu->reg.cfg + offset); in vpu_cfg_writel()
232 static inline u32 vpu_cfg_readl(struct mtk_vpu *vpu, u32 offset) in vpu_cfg_readl() argument
234 return readl(vpu->reg.cfg + offset); in vpu_cfg_readl()
237 static inline bool vpu_running(struct mtk_vpu *vpu) in vpu_running() argument
239 return vpu_cfg_readl(vpu, VPU_RESET) & BIT(0); in vpu_running()
242 static void vpu_clock_disable(struct mtk_vpu *vpu) in vpu_clock_disable() argument
244 /* Disable VPU watchdog */ in vpu_clock_disable()
245 mutex_lock(&vpu->vpu_mutex); in vpu_clock_disable()
246 if (!--vpu->wdt_refcnt) in vpu_clock_disable()
247 vpu_cfg_writel(vpu, in vpu_clock_disable()
248 vpu_cfg_readl(vpu, VPU_WDT_REG) & ~(1L << 31), in vpu_clock_disable()
250 mutex_unlock(&vpu->vpu_mutex); in vpu_clock_disable()
252 clk_disable(vpu->clk); in vpu_clock_disable()
255 static int vpu_clock_enable(struct mtk_vpu *vpu) in vpu_clock_enable() argument
259 ret = clk_enable(vpu->clk); in vpu_clock_enable()
262 /* Enable VPU watchdog */ in vpu_clock_enable()
263 mutex_lock(&vpu->vpu_mutex); in vpu_clock_enable()
264 if (!vpu->wdt_refcnt++) in vpu_clock_enable()
265 vpu_cfg_writel(vpu, in vpu_clock_enable()
266 vpu_cfg_readl(vpu, VPU_WDT_REG) | (1L << 31), in vpu_clock_enable()
268 mutex_unlock(&vpu->vpu_mutex); in vpu_clock_enable()
273 static void vpu_dump_status(struct mtk_vpu *vpu) in vpu_dump_status() argument
275 dev_info(vpu->dev, in vpu_dump_status()
276 "vpu: run %x, pc = 0x%x, ra = 0x%x, sp = 0x%x, idle = 0x%x\n" in vpu_dump_status()
277 "vpu: int %x, hv = 0x%x, vh = 0x%x, wdt = 0x%x\n", in vpu_dump_status()
278 vpu_running(vpu), vpu_cfg_readl(vpu, VPU_PC_REG), in vpu_dump_status()
279 vpu_cfg_readl(vpu, VPU_RA_REG), vpu_cfg_readl(vpu, VPU_SP_REG), in vpu_dump_status()
280 vpu_cfg_readl(vpu, VPU_IDLE_REG), in vpu_dump_status()
281 vpu_cfg_readl(vpu, VPU_INT_STATUS), in vpu_dump_status()
282 vpu_cfg_readl(vpu, HOST_TO_VPU), in vpu_dump_status()
283 vpu_cfg_readl(vpu, VPU_TO_HOST), in vpu_dump_status()
284 vpu_cfg_readl(vpu, VPU_WDT_REG)); in vpu_dump_status()
291 struct mtk_vpu *vpu = platform_get_drvdata(pdev); in vpu_ipi_register() local
294 if (!vpu) { in vpu_ipi_register()
295 dev_err(&pdev->dev, "vpu device in not ready\n"); in vpu_ipi_register()
300 ipi_desc = vpu->ipi_desc; in vpu_ipi_register()
307 dev_err(&pdev->dev, "register vpu ipi id %d with invalid arguments\n", in vpu_ipi_register()
317 struct mtk_vpu *vpu = platform_get_drvdata(pdev); in vpu_ipi_send() local
318 struct share_obj __iomem *send_obj = vpu->send_buf; in vpu_ipi_send()
324 dev_err(vpu->dev, "failed to send ipi message\n"); in vpu_ipi_send()
328 ret = vpu_clock_enable(vpu); in vpu_ipi_send()
330 dev_err(vpu->dev, "failed to enable vpu clock\n"); in vpu_ipi_send()
333 if (!vpu_running(vpu)) { in vpu_ipi_send()
334 dev_err(vpu->dev, "vpu_ipi_send: VPU is not running\n"); in vpu_ipi_send()
339 mutex_lock(&vpu->vpu_mutex); in vpu_ipi_send()
341 /* Wait until VPU receives the last command */ in vpu_ipi_send()
345 dev_err(vpu->dev, "vpu_ipi_send: IPI timeout!\n"); in vpu_ipi_send()
347 vpu_dump_status(vpu); in vpu_ipi_send()
350 } while (vpu_cfg_readl(vpu, HOST_TO_VPU)); in vpu_ipi_send()
356 vpu->ipi_id_ack[id] = false; in vpu_ipi_send()
357 /* send the command to VPU */ in vpu_ipi_send()
358 vpu_cfg_writel(vpu, 0x1, HOST_TO_VPU); in vpu_ipi_send()
360 mutex_unlock(&vpu->vpu_mutex); in vpu_ipi_send()
362 /* wait for VPU's ACK */ in vpu_ipi_send()
364 ret = wait_event_timeout(vpu->ack_wq, vpu->ipi_id_ack[id], timeout); in vpu_ipi_send()
365 vpu->ipi_id_ack[id] = false; in vpu_ipi_send()
367 dev_err(vpu->dev, "vpu ipi %d ack time out !\n", id); in vpu_ipi_send()
369 vpu_dump_status(vpu); in vpu_ipi_send()
372 vpu_clock_disable(vpu); in vpu_ipi_send()
377 mutex_unlock(&vpu->vpu_mutex); in vpu_ipi_send()
379 vpu_clock_disable(vpu); in vpu_ipi_send()
388 struct mtk_vpu *vpu = container_of(wdt, struct mtk_vpu, wdt); in vpu_wdt_reset_func() local
392 dev_info(vpu->dev, "vpu reset\n"); in vpu_wdt_reset_func()
393 ret = vpu_clock_enable(vpu); in vpu_wdt_reset_func()
395 dev_err(vpu->dev, "[VPU] wdt enables clock failed %d\n", ret); in vpu_wdt_reset_func()
398 mutex_lock(&vpu->vpu_mutex); in vpu_wdt_reset_func()
399 vpu_cfg_writel(vpu, 0x0, VPU_RESET); in vpu_wdt_reset_func()
400 vpu->fw_loaded = false; in vpu_wdt_reset_func()
401 mutex_unlock(&vpu->vpu_mutex); in vpu_wdt_reset_func()
402 vpu_clock_disable(vpu); in vpu_wdt_reset_func()
407 dev_dbg(vpu->dev, "wdt handler func %d\n", index); in vpu_wdt_reset_func()
416 struct mtk_vpu *vpu = platform_get_drvdata(pdev); in vpu_wdt_reg_handler() local
419 if (!vpu) { in vpu_wdt_reg_handler()
420 dev_err(&pdev->dev, "vpu device in not ready\n"); in vpu_wdt_reg_handler()
424 handler = vpu->wdt.handler; in vpu_wdt_reg_handler()
427 dev_dbg(vpu->dev, "wdt register id %d\n", id); in vpu_wdt_reg_handler()
428 mutex_lock(&vpu->vpu_mutex); in vpu_wdt_reg_handler()
431 mutex_unlock(&vpu->vpu_mutex); in vpu_wdt_reg_handler()
435 dev_err(vpu->dev, "register vpu wdt handler failed\n"); in vpu_wdt_reg_handler()
442 struct mtk_vpu *vpu = platform_get_drvdata(pdev); in vpu_get_vdec_hw_capa() local
444 return vpu->run.dec_capability; in vpu_get_vdec_hw_capa()
450 struct mtk_vpu *vpu = platform_get_drvdata(pdev); in vpu_get_venc_hw_capa() local
452 return vpu->run.enc_capability; in vpu_get_venc_hw_capa()
459 struct mtk_vpu *vpu = platform_get_drvdata(pdev); in vpu_mapping_dm_addr() local
463 dev_err(vpu->dev, "invalid virtual data memory address\n"); in vpu_mapping_dm_addr()
468 return (__force void *)(dtcm_dmem_addr + vpu->reg.tcm + in vpu_mapping_dm_addr()
471 return vpu->extmem[D_FW].va + (dtcm_dmem_addr - VPU_DTCM_SIZE); in vpu_mapping_dm_addr()
481 vpu_node = of_parse_phandle(dev->of_node, "mediatek,vpu", 0); in vpu_get_plat_device()
483 dev_err(dev, "can't get vpu node\n"); in vpu_get_plat_device()
490 dev_err(dev, "vpu pdev failed\n"); in vpu_get_plat_device()
498 /* load vpu program/data memory */
499 static int load_requested_vpu(struct mtk_vpu *vpu, in load_requested_vpu() argument
512 ret = request_firmware(&vpu_fw, fw_new_name, vpu->dev); in load_requested_vpu()
514 dev_info(vpu->dev, "Failed to load %s, %d, retry\n", in load_requested_vpu()
517 ret = request_firmware(&vpu_fw, fw_name, vpu->dev); in load_requested_vpu()
519 dev_err(vpu->dev, "Failed to load %s, %d\n", fw_name, in load_requested_vpu()
526 dev_err(vpu->dev, "fw %s size %zu is abnormal\n", fw_name, in load_requested_vpu()
531 dev_dbg(vpu->dev, "Downloaded fw %s size: %zu.\n", in load_requested_vpu()
534 /* reset VPU */ in load_requested_vpu()
535 vpu_cfg_writel(vpu, 0x0, VPU_RESET); in load_requested_vpu()
539 dev_dbg(vpu->dev, "fw size %zu > limited fw size %zu\n", in load_requested_vpu()
542 dev_dbg(vpu->dev, "extra_fw_size %zu\n", extra_fw_size); in load_requested_vpu()
545 dest = (__force void *)vpu->reg.tcm; in load_requested_vpu()
551 dest = vpu->extmem[fw_type].va; in load_requested_vpu()
552 dev_dbg(vpu->dev, "download extended memory type %x\n", in load_requested_vpu()
564 struct mtk_vpu *vpu; in vpu_load_firmware() local
570 pr_err("VPU platform device is invalid\n"); in vpu_load_firmware()
576 vpu = platform_get_drvdata(pdev); in vpu_load_firmware()
577 run = &vpu->run; in vpu_load_firmware()
579 mutex_lock(&vpu->vpu_mutex); in vpu_load_firmware()
580 if (vpu->fw_loaded) { in vpu_load_firmware()
581 mutex_unlock(&vpu->vpu_mutex); in vpu_load_firmware()
584 mutex_unlock(&vpu->vpu_mutex); in vpu_load_firmware()
586 ret = vpu_clock_enable(vpu); in vpu_load_firmware()
592 mutex_lock(&vpu->vpu_mutex); in vpu_load_firmware()
595 dev_dbg(vpu->dev, "firmware request\n"); in vpu_load_firmware()
597 ret = load_requested_vpu(vpu, P_FW); in vpu_load_firmware()
604 ret = load_requested_vpu(vpu, D_FW); in vpu_load_firmware()
610 vpu->fw_loaded = true; in vpu_load_firmware()
611 /* boot up vpu */ in vpu_load_firmware()
612 vpu_cfg_writel(vpu, 0x1, VPU_RESET); in vpu_load_firmware()
620 dev_err(dev, "wait vpu initialization timeout!\n"); in vpu_load_firmware()
623 dev_err(dev, "wait vpu interrupted by a signal!\n"); in vpu_load_firmware()
628 dev_info(dev, "vpu is ready. Fw version %s\n", run->fw_ver); in vpu_load_firmware()
631 mutex_unlock(&vpu->vpu_mutex); in vpu_load_firmware()
632 vpu_clock_disable(vpu); in vpu_load_firmware()
640 struct mtk_vpu *vpu = priv; in vpu_init_ipi_handler() local
643 vpu->run.signaled = run->signaled; in vpu_init_ipi_handler()
644 strscpy(vpu->run.fw_ver, run->fw_ver, sizeof(vpu->run.fw_ver)); in vpu_init_ipi_handler()
645 vpu->run.dec_capability = run->dec_capability; in vpu_init_ipi_handler()
646 vpu->run.enc_capability = run->enc_capability; in vpu_init_ipi_handler()
647 wake_up_interruptible(&vpu->run.wq); in vpu_init_ipi_handler()
659 struct mtk_vpu *vpu = dev_get_drvdata(dev); in vpu_debug_read() local
661 ret = vpu_clock_enable(vpu); in vpu_debug_read()
663 dev_err(vpu->dev, "[VPU] enable clock failed %d\n", ret); in vpu_debug_read()
667 /* vpu register status */ in vpu_debug_read()
668 running = vpu_running(vpu); in vpu_debug_read()
669 pc = vpu_cfg_readl(vpu, VPU_PC_REG); in vpu_debug_read()
670 wdt = vpu_cfg_readl(vpu, VPU_WDT_REG); in vpu_debug_read()
671 host_to_vpu = vpu_cfg_readl(vpu, HOST_TO_VPU); in vpu_debug_read()
672 vpu_to_host = vpu_cfg_readl(vpu, VPU_TO_HOST); in vpu_debug_read()
673 ra = vpu_cfg_readl(vpu, VPU_RA_REG); in vpu_debug_read()
674 sp = vpu_cfg_readl(vpu, VPU_SP_REG); in vpu_debug_read()
675 idle = vpu_cfg_readl(vpu, VPU_IDLE_REG); in vpu_debug_read()
677 vpu_clock_disable(vpu); in vpu_debug_read()
680 len = snprintf(buf, sizeof(buf), "VPU is running\n\n" in vpu_debug_read()
684 "Host to VPU: 0x%x\n" in vpu_debug_read()
685 "VPU to Host: 0x%x\n" in vpu_debug_read()
689 vpu->run.fw_ver, pc, wdt, in vpu_debug_read()
692 len = snprintf(buf, sizeof(buf), "VPU not running\n"); in vpu_debug_read()
704 static void vpu_free_ext_mem(struct mtk_vpu *vpu, u8 fw_type) in vpu_free_ext_mem() argument
706 struct device *dev = vpu->dev; in vpu_free_ext_mem()
709 dma_free_coherent(dev, fw_ext_size, vpu->extmem[fw_type].va, in vpu_free_ext_mem()
710 vpu->extmem[fw_type].pa); in vpu_free_ext_mem()
713 static int vpu_alloc_ext_mem(struct mtk_vpu *vpu, u32 fw_type) in vpu_alloc_ext_mem() argument
715 struct device *dev = vpu->dev; in vpu_alloc_ext_mem()
719 u32 offset_4gb = vpu->enable_4GB ? 0x40000000 : 0; in vpu_alloc_ext_mem()
721 vpu->extmem[fw_type].va = dma_alloc_coherent(dev, in vpu_alloc_ext_mem()
723 &vpu->extmem[fw_type].pa, in vpu_alloc_ext_mem()
725 if (!vpu->extmem[fw_type].va) { in vpu_alloc_ext_mem()
731 vpu_cfg_writel(vpu, 0x1, vpu_ext_mem0); in vpu_alloc_ext_mem()
732 vpu_cfg_writel(vpu, (vpu->extmem[fw_type].pa & 0xFFFFF000) + offset_4gb, in vpu_alloc_ext_mem()
737 (unsigned long long)vpu->extmem[fw_type].pa, in vpu_alloc_ext_mem()
738 vpu->extmem[fw_type].va); in vpu_alloc_ext_mem()
743 static void vpu_ipi_handler(struct mtk_vpu *vpu) in vpu_ipi_handler() argument
745 struct share_obj __iomem *rcv_obj = vpu->recv_buf; in vpu_ipi_handler()
746 struct vpu_ipi_desc *ipi_desc = vpu->ipi_desc; in vpu_ipi_handler()
755 vpu->ipi_id_ack[id] = true; in vpu_ipi_handler()
756 wake_up(&vpu->ack_wq); in vpu_ipi_handler()
759 dev_err(vpu->dev, "No such ipi id = %d\n", id); in vpu_ipi_handler()
763 static int vpu_ipi_init(struct mtk_vpu *vpu) in vpu_ipi_init() argument
765 /* Disable VPU to host interrupt */ in vpu_ipi_init()
766 vpu_cfg_writel(vpu, 0x0, VPU_TO_HOST); in vpu_ipi_init()
769 vpu->recv_buf = vpu->reg.tcm + VPU_DTCM_OFFSET; in vpu_ipi_init()
770 vpu->send_buf = vpu->recv_buf + 1; in vpu_ipi_init()
771 memset_io(vpu->recv_buf, 0, sizeof(struct share_obj)); in vpu_ipi_init()
772 memset_io(vpu->send_buf, 0, sizeof(struct share_obj)); in vpu_ipi_init()
779 struct mtk_vpu *vpu = priv; in vpu_irq_handler() local
788 ret = clk_enable(vpu->clk); in vpu_irq_handler()
790 dev_err(vpu->dev, "[VPU] enable clock failed %d\n", ret); in vpu_irq_handler()
793 vpu_to_host = vpu_cfg_readl(vpu, VPU_TO_HOST); in vpu_irq_handler()
795 vpu_ipi_handler(vpu); in vpu_irq_handler()
797 dev_err(vpu->dev, "vpu watchdog timeout! 0x%x", vpu_to_host); in vpu_irq_handler()
798 queue_work(vpu->wdt.wq, &vpu->wdt.ws); in vpu_irq_handler()
801 /* VPU won't send another interrupt until we set VPU_TO_HOST to 0. */ in vpu_irq_handler()
802 vpu_cfg_writel(vpu, 0x0, VPU_TO_HOST); in vpu_irq_handler()
803 clk_disable(vpu->clk); in vpu_irq_handler()
813 struct mtk_vpu *vpu; in mtk_vpu_probe() local
820 vpu = devm_kzalloc(dev, sizeof(*vpu), GFP_KERNEL); in mtk_vpu_probe()
821 if (!vpu) in mtk_vpu_probe()
824 vpu->dev = &pdev->dev; in mtk_vpu_probe()
825 vpu->reg.tcm = devm_platform_ioremap_resource_byname(pdev, "tcm"); in mtk_vpu_probe()
826 if (IS_ERR((__force void *)vpu->reg.tcm)) in mtk_vpu_probe()
827 return PTR_ERR((__force void *)vpu->reg.tcm); in mtk_vpu_probe()
829 vpu->reg.cfg = devm_platform_ioremap_resource_byname(pdev, "cfg_reg"); in mtk_vpu_probe()
830 if (IS_ERR((__force void *)vpu->reg.cfg)) in mtk_vpu_probe()
831 return PTR_ERR((__force void *)vpu->reg.cfg); in mtk_vpu_probe()
833 /* Get VPU clock */ in mtk_vpu_probe()
834 vpu->clk = devm_clk_get(dev, "main"); in mtk_vpu_probe()
835 if (IS_ERR(vpu->clk)) { in mtk_vpu_probe()
836 dev_err(dev, "get vpu clock failed\n"); in mtk_vpu_probe()
837 return PTR_ERR(vpu->clk); in mtk_vpu_probe()
840 platform_set_drvdata(pdev, vpu); in mtk_vpu_probe()
842 ret = clk_prepare(vpu->clk); in mtk_vpu_probe()
844 dev_err(dev, "prepare vpu clock failed\n"); in mtk_vpu_probe()
848 /* VPU watchdog */ in mtk_vpu_probe()
849 vpu->wdt.wq = create_singlethread_workqueue("vpu_wdt"); in mtk_vpu_probe()
850 if (!vpu->wdt.wq) { in mtk_vpu_probe()
855 INIT_WORK(&vpu->wdt.ws, vpu_wdt_reset_func); in mtk_vpu_probe()
856 mutex_init(&vpu->vpu_mutex); in mtk_vpu_probe()
858 ret = vpu_clock_enable(vpu); in mtk_vpu_probe()
860 dev_err(dev, "enable vpu clock failed\n"); in mtk_vpu_probe()
864 dev_dbg(dev, "vpu ipi init\n"); in mtk_vpu_probe()
865 ret = vpu_ipi_init(vpu); in mtk_vpu_probe()
871 /* register vpu initialization IPI */ in mtk_vpu_probe()
873 "vpu_init", vpu); in mtk_vpu_probe()
885 vpu_cfg_writel(vpu, 0x2, VPU_TCM_CFG); in mtk_vpu_probe()
887 vpu->enable_4GB = !!(totalram_pages() > (SZ_2G >> PAGE_SHIFT)); in mtk_vpu_probe()
888 dev_info(dev, "4GB mode %u\n", vpu->enable_4GB); in mtk_vpu_probe()
890 if (vpu->enable_4GB) { in mtk_vpu_probe()
897 ret = vpu_alloc_ext_mem(vpu, D_FW); in mtk_vpu_probe()
903 ret = vpu_alloc_ext_mem(vpu, P_FW); in mtk_vpu_probe()
909 init_waitqueue_head(&vpu->run.wq); in mtk_vpu_probe()
910 init_waitqueue_head(&vpu->ack_wq); in mtk_vpu_probe()
915 vpu->reg.irq = ret; in mtk_vpu_probe()
916 ret = devm_request_irq(dev, vpu->reg.irq, vpu_irq_handler, 0, in mtk_vpu_probe()
917 pdev->name, vpu); in mtk_vpu_probe()
923 vpu_clock_disable(vpu); in mtk_vpu_probe()
929 vpu_free_ext_mem(vpu, P_FW); in mtk_vpu_probe()
931 vpu_free_ext_mem(vpu, D_FW); in mtk_vpu_probe()
937 memset(vpu->ipi_desc, 0, sizeof(struct vpu_ipi_desc) * IPI_MAX); in mtk_vpu_probe()
939 mutex_destroy(&vpu->vpu_mutex); in mtk_vpu_probe()
941 vpu_clock_disable(vpu); in mtk_vpu_probe()
943 destroy_workqueue(vpu->wdt.wq); in mtk_vpu_probe()
945 clk_unprepare(vpu->clk); in mtk_vpu_probe()
952 .compatible = "mediatek,mt8173-vpu",
960 struct mtk_vpu *vpu = platform_get_drvdata(pdev); in mtk_vpu_remove() local
965 if (vpu->wdt.wq) in mtk_vpu_remove()
966 destroy_workqueue(vpu->wdt.wq); in mtk_vpu_remove()
967 vpu_free_ext_mem(vpu, P_FW); in mtk_vpu_remove()
968 vpu_free_ext_mem(vpu, D_FW); in mtk_vpu_remove()
969 mutex_destroy(&vpu->vpu_mutex); in mtk_vpu_remove()
970 clk_unprepare(vpu->clk); in mtk_vpu_remove()
975 struct mtk_vpu *vpu = dev_get_drvdata(dev); in mtk_vpu_suspend() local
979 ret = vpu_clock_enable(vpu); in mtk_vpu_suspend()
981 dev_err(dev, "failed to enable vpu clock\n"); in mtk_vpu_suspend()
985 if (!vpu_running(vpu)) { in mtk_vpu_suspend()
986 vpu_clock_disable(vpu); in mtk_vpu_suspend()
987 clk_unprepare(vpu->clk); in mtk_vpu_suspend()
991 mutex_lock(&vpu->vpu_mutex); in mtk_vpu_suspend()
992 /* disable vpu timer interrupt */ in mtk_vpu_suspend()
993 vpu_cfg_writel(vpu, vpu_cfg_readl(vpu, VPU_INT_STATUS) | VPU_IDLE_STATE, in mtk_vpu_suspend()
995 /* check if vpu is idle for system suspend */ in mtk_vpu_suspend()
999 dev_err(dev, "vpu idle timeout\n"); in mtk_vpu_suspend()
1000 mutex_unlock(&vpu->vpu_mutex); in mtk_vpu_suspend()
1001 vpu_clock_disable(vpu); in mtk_vpu_suspend()
1004 } while (!vpu_cfg_readl(vpu, VPU_IDLE_REG)); in mtk_vpu_suspend()
1006 mutex_unlock(&vpu->vpu_mutex); in mtk_vpu_suspend()
1007 vpu_clock_disable(vpu); in mtk_vpu_suspend()
1008 clk_unprepare(vpu->clk); in mtk_vpu_suspend()
1015 struct mtk_vpu *vpu = dev_get_drvdata(dev); in mtk_vpu_resume() local
1018 clk_prepare(vpu->clk); in mtk_vpu_resume()
1019 ret = vpu_clock_enable(vpu); in mtk_vpu_resume()
1021 clk_unprepare(vpu->clk); in mtk_vpu_resume()
1022 dev_err(dev, "failed to enable vpu clock\n"); in mtk_vpu_resume()
1026 mutex_lock(&vpu->vpu_mutex); in mtk_vpu_resume()
1027 /* enable vpu timer interrupt */ in mtk_vpu_resume()
1028 vpu_cfg_writel(vpu, in mtk_vpu_resume()
1029 vpu_cfg_readl(vpu, VPU_INT_STATUS) & ~(VPU_IDLE_STATE), in mtk_vpu_resume()
1031 mutex_unlock(&vpu->vpu_mutex); in mtk_vpu_resume()
1032 vpu_clock_disable(vpu); in mtk_vpu_resume()