]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
ENGR00173864 MX6Q ipu capture: add multi camera switch
authorYuxi Sun <b36102@freescale.com>
Mon, 6 Feb 2012 09:29:49 +0000 (17:29 +0800)
committerOliver Wendt <ow@karo-electronics.de>
Mon, 30 Sep 2013 12:10:50 +0000 (14:10 +0200)
Add IOCTRL command V4L2_CID_MXC_SWITCH_CAM for multi camera switch

Signed-off-by: Yuxi Sun <b36102@freescale.com>
drivers/media/video/mxc/capture/mxc_v4l2_capture.c
drivers/media/video/mxc/capture/mxc_v4l2_capture.h
include/linux/mxc_v4l2.h

index ada0e7168caef20c7af8f245e3d747bab5c643c3..b2ece92436fbea8559f9945d921c53ba3b0ff219 100644 (file)
@@ -40,6 +40,8 @@
 #include "ipu_prp_sw.h"
 
 #define init_MUTEX(sem)         sema_init(sem, 1)
+#define MXC_SENSOR_NUM 2
+static int sensor_index;
 
 static int video_nr = -1, local_buf_num;
 static cam_data *g_cam;
@@ -1009,8 +1011,9 @@ static int mxc_v4l2_g_ctrl(cam_data *cam, struct v4l2_control *c)
  */
 static int mxc_v4l2_s_ctrl(cam_data *cam, struct v4l2_control *c)
 {
-       int ret = 0;
+       int i, ret = 0;
        int tmp_rotation = IPU_ROTATE_NONE;
+       struct sensor_data *sensor_data;
 
        pr_debug("In MVC:mxc_v4l2_s_ctrl\n");
 
@@ -1179,6 +1182,25 @@ static int mxc_v4l2_s_ctrl(cam_data *cam, struct v4l2_control *c)
                ipu_csi_flash_strobe(true);
 #endif
                break;
+       case V4L2_CID_MXC_SWITCH_CAM:
+               if (cam->sensor != cam->all_sensors[c->value]) {
+                       /* power down other cameraes before enable new one */
+                       for (i = 0; i < sensor_index; i++) {
+                               if (i != c->value) {
+                                       vidioc_int_dev_exit(cam->all_sensors[i]);
+                                       vidioc_int_s_power(cam->all_sensors[i], 0);
+                               }
+                       }
+                       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);
+                       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:
                pr_debug("   default case\n");
                ret = -EINVAL;
@@ -2773,17 +2795,32 @@ static int mxc_v4l2_master_attach(struct v4l2_int_device *slave)
 {
        cam_data *cam = slave->u.slave->master->priv;
        struct v4l2_format cam_fmt;
+       int i;
 
        pr_debug("In MVC: mxc_v4l2_master_attach\n");
        pr_debug("   slave.name = %s\n", slave->name);
        pr_debug("   master.name = %s\n", slave->u.slave->master->name);
 
-       cam->sensor = slave;
        if (slave == NULL) {
                pr_err("ERROR: v4l2 capture: slave parameter not valid.\n");
                return -1;
        }
 
+       cam->sensor = slave;
+
+       if (sensor_index < MXC_SENSOR_NUM) {
+               cam->all_sensors[sensor_index] = slave;
+               sensor_index++;
+       } else {
+               pr_err("ERROR: v4l2 capture: slave number exceeds the maximum.\n");
+               return -1;
+       }
+
+       for (i = 0; i < sensor_index - 1; i++) {
+               vidioc_int_dev_exit(cam->all_sensors[i]);
+               vidioc_int_s_power(cam->all_sensors[i], 0);
+       }
+
        ipu_csi_enable_mclk_if(cam->ipu, CSI_MCLK_I2C, cam->csi, true, true);
        vidioc_int_s_power(cam->sensor, 1);
        vidioc_int_dev_init(slave);
index 350d4bd7f59c136c02d2bc6901db5d0735485a33..5b7b0bfe7706b1843dfa3ace96b39336e221a28f 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2004-2011 Freescale Semiconductor, Inc. All Rights Reserved.
+ * Copyright 2004-2012 Freescale Semiconductor, Inc. All Rights Reserved.
  */
 
 /*
@@ -194,10 +194,35 @@ typedef struct _cam_data {
 
        /* camera sensor interface */
        struct camera_sensor *cam_sensor;       /* old version */
+       struct v4l2_int_device *all_sensors[2];
        struct v4l2_int_device *sensor;
        void *ipu;
 } cam_data;
 
+struct sensor_data {
+       const struct ov5642_platform_data *platform_data;
+       struct v4l2_int_device *v4l2_int_device;
+       struct i2c_client *i2c_client;
+       struct v4l2_pix_format pix;
+       struct v4l2_captureparm streamcap;
+       bool on;
+
+       /* control settings */
+       int brightness;
+       int hue;
+       int contrast;
+       int saturation;
+       int red;
+       int green;
+       int blue;
+       int ae_mode;
+
+       u32 mclk;
+       int csi;
+
+       void (*io_init)(void);
+};
+
 #if defined(CONFIG_MXC_IPU_V1) || defined(CONFIG_VIDEO_MXC_EMMA_CAMERA) \
                               || defined(CONFIG_VIDEO_MXC_CSI_CAMERA_MODULE) \
                               || defined(CONFIG_VIDEO_MXC_CSI_CAMERA)
index e83e5923c2a4b9be561bf9b5335c9922f860bd1e..dd106ff312655eaa6ad1663e5d075d54a6b9d6ab 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2004-2011 Freescale Semiconductor, Inc. All Rights Reserved.
+ * Copyright 2004-2012 Freescale Semiconductor, Inc. All Rights Reserved.
  */
 
 /*
@@ -29,7 +29,8 @@
 #define V4L2_CID_MXC_ROT               (V4L2_CID_PRIVATE_BASE + 0)
 #define V4L2_CID_MXC_FLASH             (V4L2_CID_PRIVATE_BASE + 1)
 #define V4L2_CID_MXC_VF_ROT            (V4L2_CID_PRIVATE_BASE + 2)
-#define V4L2_CID_MXC_MOTION     (V4L2_CID_PRIVATE_BASE + 3)
+#define V4L2_CID_MXC_MOTION            (V4L2_CID_PRIVATE_BASE + 3)
+#define  V4L2_CID_MXC_SWITCH_CAM        (V4L2_CID_PRIVATE_BASE + 6)
 
 #define V4L2_MXC_ROTATE_NONE                   0
 #define V4L2_MXC_ROTATE_VERT_FLIP              1