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_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_capture_close(struct file *file) { struct fimc_dev *fimc = video_drvdata(file); dbg("pid: %d, state: 0x%lx", task_pid_nr(current), fimc->state); if (--fimc->vid_cap.refcnt == 0) { fimc_stop_capture(fimc); vb2_queue_release(&fimc->vid_cap.vbq); v4l2_err(&fimc->vid_cap.v4l2_dev, "releasing ISP\n"); v4l2_subdev_call(fimc->vid_cap.sd, core, s_power, 0); clk_disable(fimc->clock[CLK_CAM]); fimc_subdev_unregister(fimc); } return 0; }
static int fimc_isp_subdev_init(struct fimc_dev *fimc, int index) { struct s3c_fimc_isp_info *isp_info; int ret; ret = fimc_subdev_attach(fimc, index); if (ret) return ret; isp_info = fimc->pdata->isp_info[fimc->vid_cap.input_index]; ret = fimc_hw_set_camera_polarity(fimc, isp_info); if (!ret) { ret = v4l2_subdev_call(fimc->vid_cap.sd, core, s_power, 1); if (!ret) return ret; } fimc_subdev_unregister(fimc); err("ISP initialization failed: %d", ret); return ret; }
static int fimc_isp_subdev_init(struct fimc_dev *fimc, unsigned int index) { struct s5p_fimc_isp_info *isp_info; struct s5p_platform_fimc *pdata = fimc->pdata; int ret; if (index >= pdata->num_clients) return -EINVAL; isp_info = &pdata->isp_info[index]; if (isp_info->clk_frequency) clk_set_rate(fimc->clock[CLK_CAM], isp_info->clk_frequency); ret = clk_enable(fimc->clock[CLK_CAM]); if (ret) return ret; ret = fimc_subdev_attach(fimc, index); if (ret) return ret; ret = fimc_hw_set_camera_polarity(fimc, isp_info); if (ret) return ret; ret = v4l2_subdev_call(fimc->vid_cap.sd, core, s_power, 1); if (!ret) return ret; /* enabling power failed so unregister subdev */ fimc_subdev_unregister(fimc); v4l2_err(&fimc->vid_cap.v4l2_dev, "ISP initialization failed: %d\n", ret); return ret; }
static int fimc_capture_close(struct file *file) { struct fimc_dev *fimc = video_drvdata(file); if (mutex_lock_interruptible(&fimc->lock)) return -ERESTARTSYS; dbg("pid: %d, state: 0x%lx", task_pid_nr(current), fimc->state); if (--fimc->vid_cap.refcnt == 0) { fimc_stop_capture(fimc); videobuf_stop(&fimc->vid_cap.vbq); videobuf_mmap_free(&fimc->vid_cap.vbq); v4l2_err(&fimc->vid_cap.v4l2_dev, "releasing ISP\n"); v4l2_subdev_call(fimc->vid_cap.sd, core, s_power, 0); fimc_subdev_unregister(fimc); } mutex_unlock(&fimc->lock); return 0; }