Commit 4039b037 authored by Lad Prabhakar's avatar Lad Prabhakar Committed by Mauro Carvalho Chehab
Browse files

media: i2c: ov5640: Add support for BT656 mode

parent 311a6408
Loading
Loading
Loading
Loading
+34 −12
Original line number Diff line number Diff line
@@ -84,6 +84,7 @@
#define OV5640_REG_VFIFO_HSIZE		0x4602
#define OV5640_REG_VFIFO_VSIZE		0x4604
#define OV5640_REG_JPG_MODE_SELECT	0x4713
#define OV5640_REG_CCIR656_CTRL00	0x4730
#define OV5640_REG_POLARITY_CTRL00	0x4740
#define OV5640_REG_MIPI_CTRL00		0x4800
#define OV5640_REG_DEBUG_MODE		0x4814
@@ -1215,6 +1216,20 @@ static int ov5640_set_autogain(struct ov5640_dev *sensor, bool on)
			      BIT(1), on ? 0 : BIT(1));
}

static int ov5640_set_stream_bt656(struct ov5640_dev *sensor, bool on)
{
	int ret;

	ret = ov5640_write_reg(sensor, OV5640_REG_CCIR656_CTRL00,
			       on ? 0x1 : 0x00);
	if (ret)
		return ret;

	return ov5640_write_reg(sensor, OV5640_REG_SYS_CTRL0, on ?
				OV5640_REG_SYS_CTRL0_SW_PWUP :
				OV5640_REG_SYS_CTRL0_SW_PWDN);
}

static int ov5640_set_stream_dvp(struct ov5640_dev *sensor, bool on)
{
	return ov5640_write_reg(sensor, OV5640_REG_SYS_CTRL0, on ?
@@ -2020,6 +2035,7 @@ static int ov5640_set_power_dvp(struct ov5640_dev *sensor, bool on)
	 *		datasheet and hardware, 0 is active high
	 *		and 1 is active low...)
	 */
	if (sensor->ep.bus_type == V4L2_MBUS_PARALLEL) {
		if (flags & V4L2_MBUS_PCLK_SAMPLE_RISING)
			pclk_pol = 1;
		if (flags & V4L2_MBUS_HSYNC_ACTIVE_HIGH)
@@ -2028,10 +2044,12 @@ static int ov5640_set_power_dvp(struct ov5640_dev *sensor, bool on)
			vsync_pol = 1;

		ret = ov5640_write_reg(sensor, OV5640_REG_POLARITY_CTRL00,
			       (pclk_pol << 5) | (hsync_pol << 1) | vsync_pol);
				       (pclk_pol << 5) | (hsync_pol << 1) |
				       vsync_pol);

		if (ret)
			return ret;
	}

	/*
	 * powerdown MIPI TX/RX PHY & disable MIPI
@@ -2055,7 +2073,9 @@ static int ov5640_set_power_dvp(struct ov5640_dev *sensor, bool on)
	 * - 4:		PCLK output enable
	 * - [3:0]:	D[9:6] output enable
	 */
	ret = ov5640_write_reg(sensor, OV5640_REG_PAD_OUTPUT_ENABLE01, 0x7f);
	ret = ov5640_write_reg(sensor, OV5640_REG_PAD_OUTPUT_ENABLE01,
			       sensor->ep.bus_type == V4L2_MBUS_PARALLEL ?
			       0x7f : 0x1f);
	if (ret)
		return ret;

@@ -2905,6 +2925,8 @@ static int ov5640_s_stream(struct v4l2_subdev *sd, int enable)

		if (sensor->ep.bus_type == V4L2_MBUS_CSI2_DPHY)
			ret = ov5640_set_stream_mipi(sensor, enable);
		else if (sensor->ep.bus_type == V4L2_MBUS_BT656)
			ret = ov5640_set_stream_bt656(sensor, enable);
		else
			ret = ov5640_set_stream_dvp(sensor, enable);