Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c07007e6 authored by Peter Liu's avatar Peter Liu Committed by Stephen Boyd
Browse files

msm: camera: Add support for IDEAL RAW.



When IDEAL RAW is used in ISP, the isp path should be
enabled instead of the bus path which streams the image to
the bus directly. This change fix the path configuration
when IDEAL RAW is in used. Also added configuration to support
MIPI raw, PLAIN8 and PLAIN16 RAW through IDEAL RAW interface.

Change-Id: I7f8b12ac45f4a9db981d5f7d57bf6ea5f4665f4a
Signed-off-by: default avatarPeter Liu <pingchie@codeaurora.org>
parent d62132c8
Loading
Loading
Loading
Loading
+11 −1
Original line number Diff line number Diff line
@@ -49,6 +49,16 @@ struct vfe_subscribe_info {
	uint32_t active;
};

enum msm_isp_pack_fmt {
	QCOM,
	MIPI,
	DPCM6,
	DPCM8,
	PLAIN8,
	PLAIN16,
	MAX_ISP_PACK_FMT,
};

enum msm_isp_camif_update_state {
	NO_UPDATE,
	ENABLE_CAMIF,
@@ -290,7 +300,7 @@ struct msm_vfe_src_info {
	enum msm_vfe_inputmux input_mux;
	uint32_t width;
	long pixel_clock;
	uint32_t input_format;
	uint32_t input_format;/*V4L2 pix format with bayer pattern*/
};

enum msm_wm_ub_cfg_type {
+30 −2
Original line number Diff line number Diff line
@@ -484,7 +484,7 @@ static void msm_vfe32_clear_framedrop(struct vfe_device *vfe_dev,
static void msm_vfe32_cfg_io_format(struct vfe_device *vfe_dev,
	enum msm_vfe_axi_stream_src stream_src, uint32_t io_format)
{
	int bpp, bpp_reg = 0;
	int bpp, bpp_reg = 0, pack_fmt = 0, pack_reg = 0;
	uint32_t io_format_reg;
	bpp = msm_isp_get_bit_per_pixel(io_format);

@@ -499,6 +499,34 @@ static void msm_vfe32_cfg_io_format(struct vfe_device *vfe_dev,
		bpp_reg = 1 << 1;
		break;
	}

	if (stream_src == IDEAL_RAW) {
		pack_fmt = msm_isp_get_pack_format(io_format);
		switch (pack_fmt) {
		case QCOM:
			pack_reg = 0x0;
			break;
		case MIPI:
			pack_reg = 0x1;
			break;
		case DPCM6:
			pack_reg = 0x2;
			break;
		case DPCM8:
			pack_reg = 0x3;
			break;
		case PLAIN8:
			pack_reg = 0x4;
			break;
		case PLAIN16:
			pack_reg = 0x5;
			break;
		default:
			pr_err("%s: invalid pack fmt!\n", __func__);
			return;
		}
	}

	io_format_reg = msm_camera_io_r(vfe_dev->vfe_base + 0x6F8);
	switch (stream_src) {
	case PIX_ENCODER:
@@ -509,7 +537,7 @@ static void msm_vfe32_cfg_io_format(struct vfe_device *vfe_dev,
		break;
	case IDEAL_RAW:
		io_format_reg &= 0xFFFFFFC8;
		io_format_reg |= bpp_reg << 4;
		io_format_reg |= bpp_reg << 4 | pack_reg;
		break;
	case RDI_INTF_0:
	case RDI_INTF_1:
+33 −3
Original line number Diff line number Diff line
@@ -690,8 +690,9 @@ static void msm_vfe40_clear_framedrop(struct vfe_device *vfe_dev,
static void msm_vfe40_cfg_io_format(struct vfe_device *vfe_dev,
	enum msm_vfe_axi_stream_src stream_src, uint32_t io_format)
{
	int bpp, bpp_reg = 0;
	uint32_t io_format_reg;
	int bpp, bpp_reg = 0, pack_reg = 0;
	enum msm_isp_pack_fmt pack_fmt = 0;
	uint32_t io_format_reg; /*io format register bit*/
	bpp = msm_isp_get_bit_per_pixel(io_format);

	switch (bpp) {
@@ -705,6 +706,35 @@ static void msm_vfe40_cfg_io_format(struct vfe_device *vfe_dev,
		bpp_reg = 1 << 1;
		break;
	}

	if (stream_src == IDEAL_RAW) {
		/*use io_format(v4l2_pix_fmt) to get pack format*/
		pack_fmt = msm_isp_get_pack_format(io_format);
		switch (pack_fmt) {
		case QCOM:
			pack_reg = 0x0;
			break;
		case MIPI:
			pack_reg = 0x1;
			break;
		case DPCM6:
			pack_reg = 0x2;
			break;
		case DPCM8:
			pack_reg = 0x3;
			break;
		case PLAIN8:
			pack_reg = 0x4;
			break;
		case PLAIN16:
			pack_reg = 0x5;
			break;
		default:
			pr_err("%s: invalid pack fmt!\n", __func__);
			return;
		}
	}

	io_format_reg = msm_camera_io_r(vfe_dev->vfe_base + 0x54);
	switch (stream_src) {
	case PIX_ENCODER:
@@ -715,7 +745,7 @@ static void msm_vfe40_cfg_io_format(struct vfe_device *vfe_dev,
		break;
	case IDEAL_RAW:
		io_format_reg &= 0xFFFFFFC8;
		io_format_reg |= bpp_reg << 4;
		io_format_reg |= bpp_reg << 4 | pack_reg;
		break;
	case RDI_INTF_0:
	case RDI_INTF_1:
+36 −0
Original line number Diff line number Diff line
@@ -668,6 +668,42 @@ int msm_isp_cal_word_per_line(uint32_t output_format,
	return val;
}

enum msm_isp_pack_fmt msm_isp_get_pack_format(uint32_t output_format)
{
	switch (output_format) {
	case V4L2_PIX_FMT_SBGGR8:
	case V4L2_PIX_FMT_SGBRG8:
	case V4L2_PIX_FMT_SGRBG8:
	case V4L2_PIX_FMT_SRGGB8:
	case V4L2_PIX_FMT_SBGGR10:
	case V4L2_PIX_FMT_SGBRG10:
	case V4L2_PIX_FMT_SGRBG10:
	case V4L2_PIX_FMT_SRGGB10:
	case V4L2_PIX_FMT_SBGGR12:
	case V4L2_PIX_FMT_SGBRG12:
	case V4L2_PIX_FMT_SGRBG12:
	case V4L2_PIX_FMT_SRGGB12:
		return MIPI;
	case V4L2_PIX_FMT_QBGGR8:
	case V4L2_PIX_FMT_QGBRG8:
	case V4L2_PIX_FMT_QGRBG8:
	case V4L2_PIX_FMT_QRGGB8:
	case V4L2_PIX_FMT_QBGGR10:
	case V4L2_PIX_FMT_QGBRG10:
	case V4L2_PIX_FMT_QGRBG10:
	case V4L2_PIX_FMT_QRGGB10:
	case V4L2_PIX_FMT_QBGGR12:
	case V4L2_PIX_FMT_QGBRG12:
	case V4L2_PIX_FMT_QGRBG12:
	case V4L2_PIX_FMT_QRGGB12:
		return QCOM;
	default:
		pr_err("%s: Invalid output format\n", __func__);
		break;
	}
	return -EINVAL;
}

int msm_isp_get_bit_per_pixel(uint32_t output_format)
{
	switch (output_format) {
+1 −0
Original line number Diff line number Diff line
@@ -63,6 +63,7 @@ int msm_isp_send_event(struct vfe_device *vfe_dev,
int msm_isp_cal_word_per_line(uint32_t output_format,
	uint32_t pixel_per_line);
int msm_isp_get_bit_per_pixel(uint32_t output_format);
enum msm_isp_pack_fmt msm_isp_get_pack_format(uint32_t output_format);
irqreturn_t msm_isp_process_irq(int irq_num, void *data);
void msm_isp_set_src_state(struct vfe_device *vfe_dev, void *arg);
void msm_isp_do_tasklet(unsigned long data);