case V4L2_CID_HUE:
if (cam->sensor) {
cam->hue = c->value;
- ipu_csi_enable_mclk_if(cam->ipu, CSI_MCLK_I2C, cam->csi,
- true, true);
ret = vidioc_int_s_ctrl(cam->sensor, c);
- ipu_csi_enable_mclk_if(cam->ipu, CSI_MCLK_I2C, cam->csi,
- false, false);
} else {
pr_err("ERROR: v4l2 capture: slave not found!\n");
ret = -ENODEV;
case V4L2_CID_CONTRAST:
if (cam->sensor) {
cam->contrast = c->value;
- ipu_csi_enable_mclk_if(cam->ipu, CSI_MCLK_I2C, cam->csi,
- true, true);
ret = vidioc_int_s_ctrl(cam->sensor, c);
- ipu_csi_enable_mclk_if(cam->ipu, CSI_MCLK_I2C, cam->csi,
- false, false);
} else {
pr_err("ERROR: v4l2 capture: slave not found!\n");
ret = -ENODEV;
case V4L2_CID_BRIGHTNESS:
if (cam->sensor) {
cam->bright = c->value;
- ipu_csi_enable_mclk_if(cam->ipu, CSI_MCLK_I2C, cam->csi,
- true, true);
ret = vidioc_int_s_ctrl(cam->sensor, c);
- ipu_csi_enable_mclk_if(cam->ipu, CSI_MCLK_I2C, cam->csi,
- false, false);
} else {
pr_err("ERROR: v4l2 capture: slave not found!\n");
ret = -ENODEV;
case V4L2_CID_SATURATION:
if (cam->sensor) {
cam->saturation = c->value;
- ipu_csi_enable_mclk_if(cam->ipu, CSI_MCLK_I2C, cam->csi,
- true, true);
ret = vidioc_int_s_ctrl(cam->sensor, c);
- ipu_csi_enable_mclk_if(cam->ipu, CSI_MCLK_I2C, cam->csi,
- false, false);
} else {
pr_err("ERROR: v4l2 capture: slave not found!\n");
ret = -ENODEV;
case V4L2_CID_RED_BALANCE:
if (cam->sensor) {
cam->red = c->value;
- ipu_csi_enable_mclk_if(cam->ipu, CSI_MCLK_I2C, cam->csi,
- true, true);
ret = vidioc_int_s_ctrl(cam->sensor, c);
- ipu_csi_enable_mclk_if(cam->ipu, CSI_MCLK_I2C, cam->csi,
- false, false);
} else {
pr_err("ERROR: v4l2 capture: slave not found!\n");
ret = -ENODEV;
case V4L2_CID_BLUE_BALANCE:
if (cam->sensor) {
cam->blue = c->value;
- ipu_csi_enable_mclk_if(cam->ipu, CSI_MCLK_I2C, cam->csi,
- true, true);
ret = vidioc_int_s_ctrl(cam->sensor, c);
- ipu_csi_enable_mclk_if(cam->ipu, CSI_MCLK_I2C, cam->csi,
- false, false);
} else {
pr_err("ERROR: v4l2 capture: slave not found!\n");
ret = -ENODEV;
case V4L2_CID_EXPOSURE:
if (cam->sensor) {
cam->ae_mode = c->value;
- ipu_csi_enable_mclk_if(cam->ipu, CSI_MCLK_I2C, cam->csi,
- true, true);
ret = vidioc_int_s_ctrl(cam->sensor, c);
- ipu_csi_enable_mclk_if(cam->ipu, CSI_MCLK_I2C, cam->csi,
- false, false);
} else {
pr_err("ERROR: v4l2 capture: slave not found!\n");
ret = -ENODEV;
if (i != c->value) {
vidioc_int_dev_exit(cam->all_sensors[i]);
vidioc_int_s_power(cam->all_sensors[i], 0);
+ if (cam->mclk_on[cam->mclk_source]) {
+ ipu_csi_enable_mclk_if(cam->ipu,
+ CSI_MCLK_I2C,
+ cam->mclk_source,
+ false, false);
+ cam->mclk_on[cam->mclk_source] =
+ false;
+ }
}
}
sensor_data = cam->all_sensors[c->value]->priv;
if (sensor_data->io_init)
sensor_data->io_init();
cam->sensor = cam->all_sensors[c->value];
- ipu_csi_enable_mclk_if(cam->ipu, CSI_MCLK_I2C, cam->csi, true, true);
+ cam->mclk_source = sensor_data->mclk_source;
+ ipu_csi_enable_mclk_if(cam->ipu, CSI_MCLK_I2C,
+ cam->mclk_source, true, true);
+ cam->mclk_on[cam->mclk_source] = true;
vidioc_int_s_power(cam->sensor, 1);
vidioc_int_dev_init(cam->sensor);
- ipu_csi_enable_mclk_if(cam->ipu, CSI_MCLK_I2C, cam->csi, false, false);
}
break;
default:
current_fps, parm_fps);
/* This will change any camera settings needed. */
- ipu_csi_enable_mclk_if(cam->ipu, CSI_MCLK_I2C, cam->csi, true, true);
err = vidioc_int_s_parm(cam->sensor, parm);
- ipu_csi_enable_mclk_if(cam->ipu, CSI_MCLK_I2C, cam->csi, false, false);
if (err) {
pr_err("%s: vidioc_int_s_parm returned an error %d\n",
__func__, err);
cam_fmt.fmt.pix.pixelformat,
csi_param);
- ipu_csi_enable_mclk_if(cam->ipu, CSI_MCLK_I2C, cam->mclk_source,
- true, true);
+ if (!cam->mclk_on[cam->mclk_source]) {
+ ipu_csi_enable_mclk_if(cam->ipu, CSI_MCLK_I2C,
+ cam->mclk_source,
+ true, true);
+ cam->mclk_on[cam->mclk_source] = true;
+ }
vidioc_int_s_power(cam->sensor, 1);
vidioc_int_init(cam->sensor);
vidioc_int_dev_init(cam->sensor);
if (--cam->open_count == 0) {
vidioc_int_s_power(cam->sensor, 0);
- ipu_csi_enable_mclk_if(cam->ipu, CSI_MCLK_I2C, cam->csi,
- false, false);
+ if (cam->mclk_on[cam->mclk_source]) {
+ ipu_csi_enable_mclk_if(cam->ipu, CSI_MCLK_I2C,
+ cam->mclk_source,
+ false, false);
+ cam->mclk_on[cam->mclk_source] = false;
+ }
wait_event_interruptible(cam->power_queue,
cam->low_power == false);
cam->csi = pdata->csi;
cam->mclk_source = pdata->mclk_source;
+ cam->mclk_on[cam->mclk_source] = false;
cam->enc_callback = camera_callback;
init_waitqueue_head(&cam->power_queue);
cam->enc_disable(cam);
}
- if (cam->sensor && cam->open_count)
+ if (cam->sensor && cam->open_count) {
+ if (cam->mclk_on[cam->mclk_source]) {
+ ipu_csi_enable_mclk_if(cam->ipu, CSI_MCLK_I2C,
+ cam->mclk_source,
+ false, false);
+ cam->mclk_on[cam->mclk_source] = false;
+ }
vidioc_int_s_power(cam->sensor, 0);
+ }
up(&cam->busy_lock);
cam->low_power = false;
wake_up_interruptible(&cam->power_queue);
- if (cam->sensor && cam->open_count)
+ if (cam->sensor && cam->open_count) {
vidioc_int_s_power(cam->sensor, 1);
+ if (!cam->mclk_on[cam->mclk_source]) {
+ ipu_csi_enable_mclk_if(cam->ipu, CSI_MCLK_I2C,
+ cam->mclk_source,
+ true, true);
+ cam->mclk_on[cam->mclk_source] = true;
+ }
+ }
+
if (cam->overlay_on == true)
start_preview(cam);
if (cam->capture_on == true)