Esempio n. 1
0
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);
}
Esempio n. 2
0
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;
}
Esempio n. 3
0
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;
}
Esempio n. 4
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;
}
Esempio n. 5
0
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;
}
Esempio n. 6
0
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;
}