static int fimg2d_resume(struct device *dev) { unsigned long flags; g2d_lock(&ctrl->drvlock); g2d_spin_lock(&ctrl->bltlock, flags); atomic_set(&ctrl->suspended, 0); g2d_spin_unlock(&ctrl->bltlock, flags); g2d_unlock(&ctrl->drvlock); fimg2d_info("resume... done\n"); return 0; }
static int fimg2d_resume(struct device *dev) { unsigned long flags; g2d_lock(&ctrl->drvlock); g2d_spin_lock(&ctrl->bltlock, flags); atomic_set(&ctrl->suspended, 0); g2d_spin_unlock(&ctrl->bltlock, flags); g2d_unlock(&ctrl->drvlock); /* G2D clk gating mask */ if (ip_is_g2d_5ar2()) { fimg2d_clk_on(ctrl); fimg2d_clk_off(ctrl); } fimg2d_info("resume... done\n"); return 0; }
static int fimg2d_suspend(struct device *dev) { unsigned long flags; int retry = POLL_RETRY; g2d_lock(&ctrl->drvlock); g2d_spin_lock(&ctrl->bltlock, flags); atomic_set(&ctrl->suspended, 1); g2d_spin_unlock(&ctrl->bltlock, flags); while (retry--) { if (fimg2d_queue_is_empty(&ctrl->cmd_q)) break; mdelay(POLL_TIMEOUT); } g2d_unlock(&ctrl->drvlock); fimg2d_info("suspend... done\n"); return 0; }
static int fimg2d_resume(struct device *dev) { unsigned long flags; int ret = 0; g2d_lock(&ctrl->drvlock); g2d_spin_lock(&ctrl->bltlock, flags); atomic_set(&ctrl->suspended, 0); g2d_spin_unlock(&ctrl->bltlock, flags); g2d_unlock(&ctrl->drvlock); /* G2D clk gating mask */ if (ip_is_g2d_5ar2()) { fimg2d_clk_on(ctrl); fimg2d_clk_off(ctrl); } else if (ip_is_g2d_5hp()) { ret = exynos5430_fimg2d_clk_set(ctrl); if (ret) { fimg2d_err("failed to exynos5430_fimg2d_clk_set()\n"); return -ENOENT; } } fimg2d_info("resume... done\n"); return ret; }
static long fimg2d_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { int ret = 0; struct fimg2d_context *ctx; struct mm_struct *mm; ctx = file->private_data; switch (cmd) { case FIMG2D_BITBLT_BLIT: mm = get_task_mm(current); if(!mm) { fimg2d_err("no mm for ctx\n"); return -ENXIO; } fimg2d_clk_on(ctrl); g2d_lock(&ctrl->drvlock); ctx->mm = mm; if (atomic_read(&ctrl->drvact) || atomic_read(&ctrl->suspended)) { fimg2d_err("driver is unavailable, do sw fallback\n"); g2d_unlock(&ctrl->drvlock); fimg2d_clk_off(ctrl); mmput(mm); return -EPERM; } ret = fimg2d_add_command(ctrl, ctx, (struct fimg2d_blit __user *)arg); if (ret) { fimg2d_err("add command not allowed.\n"); g2d_unlock(&ctrl->drvlock); fimg2d_clk_off(ctrl); mmput(mm); return ret; } ret = fimg2d_request_bitblt(ctrl, ctx); if (ret) { fimg2d_err("request bitblit not allowed.\n"); g2d_unlock(&ctrl->drvlock); fimg2d_clk_off(ctrl); mmput(mm); return -EBUSY; } g2d_unlock(&ctrl->drvlock); fimg2d_clk_off(ctrl); mmput(mm); break; case FIMG2D_BITBLT_VERSION: { struct fimg2d_version ver; struct fimg2d_platdata *pdata; pdata = to_fimg2d_plat(ctrl->dev); ver.hw = pdata->hw_ver; ver.sw = 0; fimg2d_info("version info. hw(0x%x), sw(0x%x)\n", ver.hw, ver.sw); if (copy_to_user((void *)arg, &ver, sizeof(ver))) return -EFAULT; break; } case FIMG2D_BITBLT_ACTIVATE: { enum driver_act act; if (copy_from_user(&act, (void *)arg, sizeof(act))) return -EFAULT; g2d_lock(&ctrl->drvlock); atomic_set(&ctrl->drvact, act); if (act == DRV_ACT) fimg2d_info("fimg2d driver is activated\n"); else fimg2d_info("fimg2d driver is deactivated\n"); g2d_unlock(&ctrl->drvlock); break; } default: fimg2d_err("unknown ioctl\n"); ret = -EFAULT; break; } return ret; }
static long fimg2d_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { int ret = 0; struct fimg2d_context *ctx; struct mm_struct *mm; struct fimg2d_dma *usr_dst; ctx = file->private_data; switch (cmd) { case FIMG2D_BITBLT_BLIT: mm = get_task_mm(current); if (!mm) { fimg2d_err("no mm for ctx\n"); return -ENXIO; } g2d_lock(&ctrl->drvlock); ctx->mm = mm; if (atomic_read(&ctrl->drvact) || atomic_read(&ctrl->suspended)) { fimg2d_err("driver is unavailable, do sw fallback\n"); g2d_unlock(&ctrl->drvlock); mmput(mm); return -EPERM; } ret = fimg2d_add_command(ctrl, ctx, (struct fimg2d_blit __user *)arg); if (ret) { fimg2d_err("add command not allowed.\n"); g2d_unlock(&ctrl->drvlock); mmput(mm); return ret; } fimg2d_pm_qos_update(ctrl, FIMG2D_QOS_ON); usr_dst = kzalloc(sizeof(struct fimg2d_dma), GFP_KERNEL); if (!usr_dst) { fimg2d_err("failed to allocate memory for fimg2d_dma\n"); g2d_unlock(&ctrl->drvlock); mmput(mm); return -ENOMEM; } ret = store_user_dst((struct fimg2d_blit __user *)arg, usr_dst); if (ret) { fimg2d_err("store_user_dst() not allowed.\n"); g2d_unlock(&ctrl->drvlock); kfree(usr_dst); mmput(mm); return ret; } ret = fimg2d_request_bitblt(ctrl, ctx); if (ret) { fimg2d_info("request bitblit not allowed, " "so passing to s/w fallback.\n"); g2d_unlock(&ctrl->drvlock); kfree(usr_dst); mmput(mm); return -EBUSY; } g2d_unlock(&ctrl->drvlock); fimg2d_debug("addr : %p, size : %zd\n", (void *)usr_dst->addr, usr_dst->size); #ifndef CCI_SNOOP fimg2d_dma_unsync_inner(usr_dst->addr, usr_dst->size, DMA_FROM_DEVICE); #endif kfree(usr_dst); mmput(mm); break; case FIMG2D_BITBLT_VERSION: { struct fimg2d_version ver; struct fimg2d_platdata *pdata; #ifdef CONFIG_OF pdata = ctrl->pdata; #else pdata = to_fimg2d_plat(ctrl->dev); #endif ver.hw = pdata->hw_ver; ver.sw = 0; fimg2d_info("version info. hw(0x%x), sw(0x%x)\n", ver.hw, ver.sw); if (copy_to_user((void *)arg, &ver, sizeof(ver))) return -EFAULT; break; } case FIMG2D_BITBLT_ACTIVATE: { enum driver_act act; if (copy_from_user(&act, (void *)arg, sizeof(act))) return -EFAULT; g2d_lock(&ctrl->drvlock); atomic_set(&ctrl->drvact, act); if (act == DRV_ACT) { fimg2d_power_control(ctrl, FIMG2D_PW_OFF); fimg2d_info("fimg2d driver is activated\n"); } else { fimg2d_power_control(ctrl, FIMG2D_PW_ON); fimg2d_info("fimg2d driver is deactivated\n"); } g2d_unlock(&ctrl->drvlock); break; } default: fimg2d_err("unknown ioctl\n"); ret = -EFAULT; break; } return ret; }