#define RK29_CAM_RESETACTIVE_H (0x01<<RK29_CAM_RESETACTIVE_BITPOS)
#define RK29_CAM_RESETACTIVE_L (0x00<<RK29_CAM_RESETACTIVE_BITPOS)
+/* v4l2_subdev_core_ops.ioctl ioctl_cmd macro */
+#define RK29_CAM_SUBDEV_ACTIVATE 0x00
+#define RK29_CAM_SUBDEV_DEACTIVATE 0x01
+
struct rk29camera_gpio_res {
unsigned int gpio_reset;
unsigned int gpio_power;
#include <media/v4l2-common.h>
#include <media/v4l2-chip-ident.h>
#include <media/soc_camera.h>
+#include <mach/rk29_camera.h>
#define _CONS(a,b) a##b
#define CONS(a,b) _CONS(a,b)
return ret;
}
+static int sensor_deactivate(struct v4l2_subdev *sd)
+{
+ struct i2c_client *client = sd->priv;
+
+ SENSOR_DG("\n%s..%s.. \n",SENSOR_NAME_STRING(),__FUNCTION__);
+
+ /* ddl@rock-chips.com : all sensor output pin must change to input for other sensor */
+ sensor_write(client, 0x30b0, 0x00);
+ sensor_write(client, 0x30b1, 0x00);
+
+ return 0;
+}
+
static struct reginfo sensor_power_down_sequence[]=
{
{0x30ab, 0x00},
return ret;
}
+static long sensor_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
+{
+ SENSOR_DG("\n%s..%s..cmd:%x \n",SENSOR_NAME_STRING(),__FUNCTION__,cmd);
+ switch (cmd)
+ {
+ case RK29_CAM_SUBDEV_DEACTIVATE:
+ {
+ sensor_deactivate(sd);
+ break;
+ }
+ default:
+ break;
+ }
+
+ return 0;
+}
static struct v4l2_subdev_core_ops sensor_subdev_core_ops = {
.init = sensor_init,
.g_ctrl = sensor_g_control,
.g_ext_ctrls = sensor_g_ext_controls,
.s_ext_ctrls = sensor_s_ext_controls,
.g_chip_ident = sensor_g_chip_ident,
+ .ioctl = sensor_ioctl,
};
static struct v4l2_subdev_video_ops sensor_subdev_video_ops = {
#include <media/v4l2-common.h>
#include <media/v4l2-chip-ident.h>
#include <media/soc_camera.h>
+#include <mach/rk29_camera.h>
#define _CONS(a,b) a##b
#define CONS(a,b) _CONS(a,b)
#define CONFIG_SENSOR_Mirror 0
#define CONFIG_SENSOR_Flip 0
-#define CONFIG_SENSOR_I2C_SPEED 400000 /* Hz */
+#define CONFIG_SENSOR_I2C_SPEED 300000 /* Hz */
#define CONFIG_SENSOR_TR 1
#define CONFIG_SENSOR_DEBUG 1
return ret;
}
+static int sensor_deactivate(struct v4l2_subdev *sd)
+{
+ struct i2c_client *client = sd->priv;
+ u8 reg_val;
+
+ SENSOR_DG("\n%s..%s.. \n",SENSOR_NAME_STRING(),__FUNCTION__);
+
+ /* ddl@rock-chips.com : all sensor output pin must change to input for other sensor */
+ sensor_read(client,0x3000,®_val);
+ sensor_write(client, 0x3000, reg_val&0xfc);
+ sensor_write(client, 0x3001, 0x00);
+ sensor_read(client,0x3002,®_val);
+ sensor_write(client, 0x3002, reg_val&0x1f);
+
+ return 0;
+}
+
static struct reginfo sensor_power_down_sequence[]=
{
{0x30ab, 0x00},
return ret;
}
+static long sensor_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
+{
+ SENSOR_DG("\n%s..%s..cmd:%x \n",SENSOR_NAME_STRING(),__FUNCTION__,cmd);
+ switch (cmd)
+ {
+ case RK29_CAM_SUBDEV_DEACTIVATE:
+ {
+ sensor_deactivate(sd);
+ break;
+ }
+ default:
+ break;
+ }
+
+ return 0;
+
+}
+
static struct v4l2_subdev_core_ops sensor_subdev_core_ops = {
.init = sensor_init,
.g_ctrl = sensor_g_control,
.g_ext_ctrls = sensor_g_ext_controls,
.s_ext_ctrls = sensor_s_ext_controls,
.g_chip_ident = sensor_g_chip_ident,
+ .ioctl = sensor_ioctl,
};
static struct v4l2_subdev_video_ops sensor_subdev_video_ops = {
#include <media/v4l2-common.h>
#include <media/v4l2-chip-ident.h>
#include <media/soc_camera.h>
+#include <mach/rk29_camera.h>
#define _CONS(a,b) a##b
#define CONS(a,b) _CONS(a,b)
#define CONFIG_SENSOR_Mirror 0
#define CONFIG_SENSOR_Flip 0
-#define CONFIG_SENSOR_I2C_SPEED 400000 /* Hz */
+#define CONFIG_SENSOR_I2C_SPEED 300000 /* Hz */
#define CONFIG_SENSOR_TR 1
#define CONFIG_SENSOR_DEBUG 1
sensor_INIT_ERR:
return ret;
}
+static int sensor_deactivate(struct v4l2_subdev *sd)
+{
+ struct i2c_client *client = sd->priv;
+
+ SENSOR_DG("\n%s..%s.. \n",SENSOR_NAME_STRING(),__FUNCTION__);
+ /* ddl@rock-chips.com : all sensor output pin must change to input for other sensor */
+ sensor_write(client, 0x3017, 0x00); // FREX,VSYNC,HREF,PCLK,D9-D6
+ sensor_write(client, 0x3018, 0x03); // D5-D0
+ sensor_write(client,0x3019,0X00); // STROBE,SDA
+
+ return 0;
+}
static struct reginfo sensor_power_down_sequence[]=
{
{0x00,0x00}
return ret;
}
+static long sensor_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
+{
+ SENSOR_DG("\n%s..%s..cmd:%x \n",SENSOR_NAME_STRING(),__FUNCTION__,cmd);
+ switch (cmd)
+ {
+ case RK29_CAM_SUBDEV_DEACTIVATE:
+ {
+ sensor_deactivate(sd);
+ break;
+ }
+ default:
+ break;
+ }
+
+ return 0;
+
+}
static struct v4l2_subdev_core_ops sensor_subdev_core_ops = {
.init = sensor_init,
.g_ext_ctrls = sensor_g_ext_controls,
.s_ext_ctrls = sensor_s_ext_controls,
.g_chip_ident = sensor_g_chip_ident,
+ .ioctl = sensor_ioctl,
};
static struct v4l2_subdev_video_ops sensor_subdev_video_ops = {
{
struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
struct rk29_camera_dev *pcdev = ici->priv;
+ struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
BUG_ON(icd != pcdev->icd);
dev_info(&icd->dev, "RK29 Camera driver detached from camera %d\n",
icd->devnum);
+ v4l2_subdev_call(sd, core, ioctl, RK29_CAM_SUBDEV_DEACTIVATE,NULL);
rk29_camera_deactivate(pcdev);
/* ddl@rock-chips.com: Call videobuf_mmap_free here for free the struct video_buffer which malloc in videobuf_alloc */