static int fimc_cap_s_input(struct file *file, void *priv, unsigned int i) { struct fimc_ctx *ctx = priv; struct fimc_dev *fimc = ctx->fimc_dev; struct s3c_platform_fimc *pdata = fimc->pdata; int ret; if (fimc_capture_active(ctx->fimc_dev)) return -EBUSY; if (mutex_lock_interruptible(&fimc->lock)) return -ERESTARTSYS; if (i >= FIMC_MAX_CAMIF_CLIENTS || !pdata->isp_info[i]) { ret = -EINVAL; goto si_unlock; } if (fimc->vid_cap.sd) { ret = v4l2_subdev_call(fimc->vid_cap.sd, core, s_power, 0); if (ret) err("s_power failed: %d", ret); } /* Release the attached sensor subdevice. */ fimc_subdev_unregister(fimc); ret = fimc_isp_subdev_init(fimc, i); si_unlock: mutex_unlock(&fimc->lock); return ret; }
static int fimc_cap_s_input(struct file *file, void *priv, unsigned int i) { struct fimc_ctx *ctx = priv; struct fimc_dev *fimc = ctx->fimc_dev; struct s5p_platform_fimc *pdata = fimc->pdata; if (fimc_capture_active(ctx->fimc_dev)) return -EBUSY; if (i >= pdata->num_clients) return -EINVAL; if (fimc->vid_cap.sd) { int ret = v4l2_subdev_call(fimc->vid_cap.sd, core, s_power, 0); if (ret) err("s_power failed: %d", ret); clk_disable(fimc->clock[CLK_CAM]); } /* Release the attached sensor subdevice. */ fimc_subdev_unregister(fimc); return fimc_isp_subdev_init(fimc, i); }
static int fimc_capture_open(struct file *file) { struct fimc_dev *fimc = video_drvdata(file); int ret = 0; dbg("pid: %d, state: 0x%lx", task_pid_nr(current), fimc->state); /* Return if the corresponding video mem2mem node is already opened. */ if (fimc_m2m_active(fimc)) return -EBUSY; if (mutex_lock_interruptible(&fimc->lock)) return -ERESTARTSYS; if (++fimc->vid_cap.refcnt == 1) { ret = fimc_isp_subdev_init(fimc, -1); if (ret) { fimc->vid_cap.refcnt--; ret = -EIO; } } file->private_data = fimc->vid_cap.ctx; mutex_unlock(&fimc->lock); return ret; }