static int jpeg_remove(struct platform_device *dev) { #if defined(CONFIG_S5P_SYSMMU_JPEG) s5p_sysmmu_disable(jpeg_pm); jpeg_dbg("sysmmu off\n"); #endif free_irq(jpeg_ctrl->irq_no, dev); mutex_destroy(&jpeg_ctrl->lock); iounmap(jpeg_ctrl->reg_base); kfree(jpeg_ctrl); misc_deregister(&jpeg_miscdev); #ifdef CONFIG_PM_RUNTIME pm_runtime_disable(jpeg_pm); #endif return 0; }
void g2d_sysmmu_off(struct g2d_global *g2d_dev) { g2d_clk_enable(g2d_dev); s5p_sysmmu_disable(g2d_dev->dev); g2d_clk_disable(g2d_dev); }
void fimg2d4x_bitblt(struct fimg2d_control *info) { struct fimg2d_context *ctx; struct fimg2d_bltcmd *cmd; unsigned long *pgd; fimg2d_debug("enter blitter\n"); #ifdef CONFIG_PM_RUNTIME pm_runtime_get_sync(info->dev); fimg2d_debug("pm_runtime_get_sync\n"); #endif fimg2d_clk_on(info); while ((cmd = fimg2d_get_first_command(info))) { ctx = cmd->ctx; if (info->err) { printk(KERN_ERR "[%s] device error\n", __func__); goto blitend; } atomic_set(&info->busy, 1); info->configure(info, cmd); if (cmd->image[IDST].addr.type != ADDR_PHYS) { pgd = (unsigned long *)ctx->mm->pgd; s5p_sysmmu_enable(info->dev, (unsigned long)virt_to_phys(pgd)); fimg2d_debug("sysmmu enable: pgd %p ctx %p seq_no(%u)\n", pgd, ctx, cmd->seq_no); } fimg2d4x_pre_bitblt(info, cmd); #ifdef PERF_PROFILE perf_start(cmd->ctx, PERF_BLIT); #endif /* start blit */ info->run(info); fimg2d4x_blit_wait(info, cmd); #ifdef PERF_PROFILE perf_end(cmd->ctx, PERF_BLIT); #endif if (cmd->image[IDST].addr.type != ADDR_PHYS) { s5p_sysmmu_disable(info->dev); fimg2d_debug("sysmmu disable\n"); } blitend: spin_lock(&info->bltlock); fimg2d_dequeue(&cmd->node); kfree(cmd); atomic_dec(&ctx->ncmd); /* wake up context */ if (!atomic_read(&ctx->ncmd)) wake_up(&ctx->wait_q); spin_unlock(&info->bltlock); } atomic_set(&info->active, 0); fimg2d_clk_off(info); #ifdef CONFIG_PM_RUNTIME pm_runtime_put_sync(info->dev); fimg2d_debug("pm_runtime_put_sync\n"); #endif fimg2d_debug("exit blitter\n"); }