All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/5] s5p-fimc driver fixes/cleanups
@ 2013-01-30 17:23 Sylwester Nawrocki
  2013-01-30 17:23 ` [PATCH 1/5] s5p-fimc: Avoid null pointer dereference in fimc_capture_ctrls_create() Sylwester Nawrocki
                   ` (4 more replies)
  0 siblings, 5 replies; 10+ messages in thread
From: Sylwester Nawrocki @ 2013-01-30 17:23 UTC (permalink / raw)
  To: linux-media; +Cc: kyungmin.park, sw0312.kim, Sylwester Nawrocki

This series includes s5p-fimc driver fixes, one v4l2 compliance
fix (I'm working on converting this driver to use the selection
API and there is more to come after that, patches 4/6 is required
for the driver to work with v3.9 kernel and patch 5/5 is a
prerequiste for FIMC-IS driver - as this is all I could push now
for v3.9. without the device tree support.

Sylwester Nawrocki (5):
  s5p-fimc: Avoid null pointer dereference in
    fimc_capture_ctrls_create()
  s5p-fimc: Set default image format at device open()
  s5p-fimc: Fix FIMC.n subdev set_selection ioctl handler
  s5p-fimc: Add clk_prepare/unprepare for sclk_cam clocks
  s5p-fimc: Redefine platform data structure for fimc-is

 arch/arm/mach-exynos/mach-nuri.c                |    8 +-
 arch/arm/mach-exynos/mach-universal_c210.c      |    8 +-
 arch/arm/mach-s5pv210/mach-goni.c               |    6 +-
 drivers/media/platform/s5p-fimc/fimc-capture.c  |   19 ++--
 drivers/media/platform/s5p-fimc/fimc-core.c     |   20 +---
 drivers/media/platform/s5p-fimc/fimc-core.h     |    5 +-
 drivers/media/platform/s5p-fimc/fimc-lite-reg.c |    8 +-
 drivers/media/platform/s5p-fimc/fimc-lite-reg.h |    4 +-
 drivers/media/platform/s5p-fimc/fimc-m2m.c      |  131 +++++++++++++----------
 drivers/media/platform/s5p-fimc/fimc-mdevice.c  |   69 +++++++-----
 drivers/media/platform/s5p-fimc/fimc-mdevice.h  |    2 +-
 drivers/media/platform/s5p-fimc/fimc-reg.c      |   34 +++---
 drivers/media/platform/s5p-fimc/fimc-reg.h      |    6 +-
 include/media/s5p_fimc.h                        |   49 +++++----
 14 files changed, 196 insertions(+), 173 deletions(-)

--
1.7.9.5


^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH 1/5] s5p-fimc: Avoid null pointer dereference in fimc_capture_ctrls_create()
  2013-01-30 17:23 [PATCH 0/5] s5p-fimc driver fixes/cleanups Sylwester Nawrocki
@ 2013-01-30 17:23 ` Sylwester Nawrocki
  2013-01-30 17:23 ` [PATCH 2/5] s5p-fimc: Set default image format at device open() Sylwester Nawrocki
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 10+ messages in thread
From: Sylwester Nawrocki @ 2013-01-30 17:23 UTC (permalink / raw)
  To: linux-media; +Cc: kyungmin.park, sw0312.kim, Sylwester Nawrocki

With presence of some faults, e.g. caused by wrong platform data or
the device tree structure the IDX_SENSOR entry in the array may be NULL,
so make sure it is not dereferenced then.

Signed-off-by: Sylwester Nawrocki <s.nawrocki@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
---
 drivers/media/platform/s5p-fimc/fimc-capture.c |    7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/drivers/media/platform/s5p-fimc/fimc-capture.c b/drivers/media/platform/s5p-fimc/fimc-capture.c
index df6fc6c..35998a3 100644
--- a/drivers/media/platform/s5p-fimc/fimc-capture.c
+++ b/drivers/media/platform/s5p-fimc/fimc-capture.c
@@ -486,6 +486,7 @@ static struct vb2_ops fimc_capture_qops = {
 int fimc_capture_ctrls_create(struct fimc_dev *fimc)
 {
 	struct fimc_vid_cap *vid_cap = &fimc->vid_cap;
+	struct v4l2_subdev *sensor = fimc->pipeline.subdevs[IDX_SENSOR];
 	int ret;
 
 	if (WARN_ON(vid_cap->ctx == NULL))
@@ -494,11 +495,13 @@ int fimc_capture_ctrls_create(struct fimc_dev *fimc)
 		return 0;
 
 	ret = fimc_ctrls_create(vid_cap->ctx);
-	if (ret || vid_cap->user_subdev_api || !vid_cap->ctx->ctrls.ready)
+
+	if (ret || vid_cap->user_subdev_api || !sensor  ||
+	    !vid_cap->ctx->ctrls.ready)
 		return ret;
 
 	return v4l2_ctrl_add_handler(&vid_cap->ctx->ctrls.handler,
-		    fimc->pipeline.subdevs[IDX_SENSOR]->ctrl_handler, NULL);
+				     sensor->ctrl_handler, NULL);
 }
 
 static int fimc_capture_set_default_format(struct fimc_dev *fimc);
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH 2/5] s5p-fimc: Set default image format at device open()
  2013-01-30 17:23 [PATCH 0/5] s5p-fimc driver fixes/cleanups Sylwester Nawrocki
  2013-01-30 17:23 ` [PATCH 1/5] s5p-fimc: Avoid null pointer dereference in fimc_capture_ctrls_create() Sylwester Nawrocki
@ 2013-01-30 17:23 ` Sylwester Nawrocki
  2013-01-30 17:23 ` [PATCH 3/5] s5p-fimc: Fix FIMC.n subdev set_selection ioctl handler Sylwester Nawrocki
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 10+ messages in thread
From: Sylwester Nawrocki @ 2013-01-30 17:23 UTC (permalink / raw)
  To: linux-media; +Cc: kyungmin.park, sw0312.kim, Sylwester Nawrocki

Make sure a valid image format is initially set on both the CAPTURE
and the OUTPUT buffer queue.

Signed-off-by: Sylwester Nawrocki <s.nawrocki@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
---
 drivers/media/platform/s5p-fimc/fimc-core.c |   20 +---
 drivers/media/platform/s5p-fimc/fimc-core.h |    5 +-
 drivers/media/platform/s5p-fimc/fimc-m2m.c  |  131 +++++++++++++++------------
 3 files changed, 75 insertions(+), 81 deletions(-)

diff --git a/drivers/media/platform/s5p-fimc/fimc-core.c b/drivers/media/platform/s5p-fimc/fimc-core.c
index a962541..29f7bb7 100644
--- a/drivers/media/platform/s5p-fimc/fimc-core.c
+++ b/drivers/media/platform/s5p-fimc/fimc-core.c
@@ -525,7 +525,6 @@ static int __fimc_s_ctrl(struct fimc_ctx *ctx, struct v4l2_ctrl *ctrl)
 {
 	struct fimc_dev *fimc = ctx->fimc_dev;
 	const struct fimc_variant *variant = fimc->variant;
-	unsigned int flags = FIMC_DST_FMT | FIMC_SRC_FMT;
 	int ret = 0;
 
 	if (ctrl->flags & V4L2_CTRL_FLAG_INACTIVE)
@@ -541,8 +540,7 @@ static int __fimc_s_ctrl(struct fimc_ctx *ctx, struct v4l2_ctrl *ctrl)
 		break;
 
 	case V4L2_CID_ROTATE:
-		if (fimc_capture_pending(fimc) ||
-		    (ctx->state & flags) == flags) {
+		if (fimc_capture_pending(fimc)) {
 			ret = fimc_check_scaler_ratio(ctx, ctx->s_frame.width,
 					ctx->s_frame.height, ctx->d_frame.width,
 					ctx->d_frame.height, ctrl->val);
@@ -709,22 +707,6 @@ void __fimc_get_format(struct fimc_frame *frame, struct v4l2_format *f)
 	}
 }
 
-void fimc_fill_frame(struct fimc_frame *frame, struct v4l2_format *f)
-{
-	struct v4l2_pix_format_mplane *pixm = &f->fmt.pix_mp;
-
-	frame->f_width  = pixm->plane_fmt[0].bytesperline;
-	if (frame->fmt->colplanes == 1)
-		frame->f_width = (frame->f_width * 8) / frame->fmt->depth[0];
-	frame->f_height	= pixm->height;
-	frame->width    = pixm->width;
-	frame->height   = pixm->height;
-	frame->o_width  = pixm->width;
-	frame->o_height = pixm->height;
-	frame->offs_h   = 0;
-	frame->offs_v   = 0;
-}
-
 /**
  * fimc_adjust_mplane_format - adjust bytesperline/sizeimage for each plane
  * @fmt: fimc pixel format description (input)
diff --git a/drivers/media/platform/s5p-fimc/fimc-core.h b/drivers/media/platform/s5p-fimc/fimc-core.h
index cf760c3..412d507 100644
--- a/drivers/media/platform/s5p-fimc/fimc-core.h
+++ b/drivers/media/platform/s5p-fimc/fimc-core.h
@@ -112,9 +112,7 @@ enum fimc_color_fmt {
 
 /* The hardware context state. */
 #define	FIMC_PARAMS		(1 << 0)
-#define	FIMC_SRC_FMT		(1 << 3)
-#define	FIMC_DST_FMT		(1 << 4)
-#define	FIMC_COMPOSE		(1 << 5)
+#define	FIMC_COMPOSE		(1 << 1)
 #define	FIMC_CTX_M2M		(1 << 16)
 #define	FIMC_CTX_CAP		(1 << 17)
 #define	FIMC_CTX_SHUT		(1 << 18)
@@ -654,7 +652,6 @@ int fimc_prepare_addr(struct fimc_ctx *ctx, struct vb2_buffer *vb,
 		      struct fimc_frame *frame, struct fimc_addr *paddr);
 void fimc_prepare_dma_offset(struct fimc_ctx *ctx, struct fimc_frame *f);
 void fimc_set_yuv_order(struct fimc_ctx *ctx);
-void fimc_fill_frame(struct fimc_frame *frame, struct v4l2_format *f);
 void fimc_capture_irq_handler(struct fimc_dev *fimc, int deq_buf);
 
 int fimc_register_m2m_device(struct fimc_dev *fimc,
diff --git a/drivers/media/platform/s5p-fimc/fimc-m2m.c b/drivers/media/platform/s5p-fimc/fimc-m2m.c
index 1eabd7e..f3d535c 100644
--- a/drivers/media/platform/s5p-fimc/fimc-m2m.c
+++ b/drivers/media/platform/s5p-fimc/fimc-m2m.c
@@ -1,8 +1,8 @@
 /*
  * Samsung S5P/EXYNOS4 SoC series FIMC (video postprocessor) driver
  *
- * Copyright (C) 2012 Samsung Electronics Co., Ltd.
- * Sylwester Nawrocki, <s.nawrocki@samsung.com>
+ * Copyright (C) 2012 - 2013 Samsung Electronics Co., Ltd.
+ * Sylwester Nawrocki <s.nawrocki@samsung.com>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published
@@ -160,8 +160,7 @@ static void fimc_device_run(void *priv)
 	fimc_hw_set_output_addr(fimc, &df->paddr, -1);
 
 	fimc_activate_capture(ctx);
-	ctx->state &= (FIMC_CTX_M2M | FIMC_CTX_CAP |
-		       FIMC_SRC_FMT | FIMC_DST_FMT);
+	ctx->state &= (FIMC_CTX_M2M | FIMC_CTX_CAP);
 	fimc_hw_activate_input_dma(fimc, true);
 
 dma_unlock:
@@ -309,8 +308,6 @@ static int fimc_try_fmt_mplane(struct fimc_ctx *ctx, struct v4l2_format *f)
 	if (!IS_M2M(f->type))
 		return -EINVAL;
 
-	dbg("w: %d, h: %d", pix->width, pix->height);
-
 	fmt = fimc_find_format(&pix->pixelformat, NULL,
 			       get_m2m_fmt_flags(f->type), 0);
 	if (WARN(fmt == NULL, "Pixel format lookup failed"))
@@ -350,19 +347,39 @@ static int fimc_m2m_try_fmt_mplane(struct file *file, void *fh,
 				   struct v4l2_format *f)
 {
 	struct fimc_ctx *ctx = fh_to_ctx(fh);
-
 	return fimc_try_fmt_mplane(ctx, f);
 }
 
+static void __set_frame_format(struct fimc_frame *frame, struct fimc_fmt *fmt,
+			       struct v4l2_pix_format_mplane *pixm)
+{
+	int i;
+
+	for (i = 0; i < fmt->colplanes; i++) {
+		frame->bytesperline[i] = pixm->plane_fmt[i].bytesperline;
+		frame->payload[i] = pixm->plane_fmt[i].sizeimage;
+	}
+
+	frame->f_width = pixm->width;
+	frame->f_height	= pixm->height;
+	frame->o_width = pixm->width;
+	frame->o_height = pixm->height;
+	frame->width = pixm->width;
+	frame->height = pixm->height;
+	frame->offs_h = 0;
+	frame->offs_v = 0;
+	frame->fmt = fmt;
+}
+
 static int fimc_m2m_s_fmt_mplane(struct file *file, void *fh,
 				 struct v4l2_format *f)
 {
 	struct fimc_ctx *ctx = fh_to_ctx(fh);
 	struct fimc_dev *fimc = ctx->fimc_dev;
+	struct fimc_fmt *fmt;
 	struct vb2_queue *vq;
 	struct fimc_frame *frame;
-	struct v4l2_pix_format_mplane *pix;
-	int i, ret = 0;
+	int ret;
 
 	ret = fimc_try_fmt_mplane(ctx, f);
 	if (ret)
@@ -380,31 +397,16 @@ static int fimc_m2m_s_fmt_mplane(struct file *file, void *fh,
 	else
 		frame = &ctx->d_frame;
 
-	pix = &f->fmt.pix_mp;
-	frame->fmt = fimc_find_format(&pix->pixelformat, NULL,
-				      get_m2m_fmt_flags(f->type), 0);
-	if (!frame->fmt)
+	fmt = fimc_find_format(&f->fmt.pix_mp.pixelformat, NULL,
+			       get_m2m_fmt_flags(f->type), 0);
+	if (!fmt)
 		return -EINVAL;
 
+	__set_frame_format(frame, fmt, &f->fmt.pix_mp);
+
 	/* Update RGB Alpha control state and value range */
 	fimc_alpha_ctrl_update(ctx);
 
-	for (i = 0; i < frame->fmt->colplanes; i++) {
-		frame->bytesperline[i] = pix->plane_fmt[i].bytesperline;
-		frame->payload[i] = pix->plane_fmt[i].sizeimage;
-	}
-
-	fimc_fill_frame(frame, f);
-
-	ctx->scaler.enabled = 1;
-
-	if (f->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE)
-		fimc_ctx_state_set(FIMC_PARAMS | FIMC_DST_FMT, ctx);
-	else
-		fimc_ctx_state_set(FIMC_PARAMS | FIMC_SRC_FMT, ctx);
-
-	dbg("f_w: %d, f_h: %d", frame->f_width, frame->f_height);
-
 	return 0;
 }
 
@@ -412,7 +414,6 @@ static int fimc_m2m_reqbufs(struct file *file, void *fh,
 			    struct v4l2_requestbuffers *reqbufs)
 {
 	struct fimc_ctx *ctx = fh_to_ctx(fh);
-
 	return v4l2_m2m_reqbufs(file, ctx->m2m_ctx, reqbufs);
 }
 
@@ -420,7 +421,6 @@ static int fimc_m2m_querybuf(struct file *file, void *fh,
 			     struct v4l2_buffer *buf)
 {
 	struct fimc_ctx *ctx = fh_to_ctx(fh);
-
 	return v4l2_m2m_querybuf(file, ctx->m2m_ctx, buf);
 }
 
@@ -428,7 +428,6 @@ static int fimc_m2m_qbuf(struct file *file, void *fh,
 			 struct v4l2_buffer *buf)
 {
 	struct fimc_ctx *ctx = fh_to_ctx(fh);
-
 	return v4l2_m2m_qbuf(file, ctx->m2m_ctx, buf);
 }
 
@@ -436,7 +435,6 @@ static int fimc_m2m_dqbuf(struct file *file, void *fh,
 			  struct v4l2_buffer *buf)
 {
 	struct fimc_ctx *ctx = fh_to_ctx(fh);
-
 	return v4l2_m2m_dqbuf(file, ctx->m2m_ctx, buf);
 }
 
@@ -444,7 +442,6 @@ static int fimc_m2m_expbuf(struct file *file, void *fh,
 			    struct v4l2_exportbuffer *eb)
 {
 	struct fimc_ctx *ctx = fh_to_ctx(fh);
-
 	return v4l2_m2m_expbuf(file, ctx->m2m_ctx, eb);
 }
 
@@ -453,15 +450,6 @@ static int fimc_m2m_streamon(struct file *file, void *fh,
 			     enum v4l2_buf_type type)
 {
 	struct fimc_ctx *ctx = fh_to_ctx(fh);
-
-	/* The source and target color format need to be set */
-	if (V4L2_TYPE_IS_OUTPUT(type)) {
-		if (!fimc_ctx_state_is_set(FIMC_SRC_FMT, ctx))
-			return -EINVAL;
-	} else if (!fimc_ctx_state_is_set(FIMC_DST_FMT, ctx)) {
-		return -EINVAL;
-	}
-
 	return v4l2_m2m_streamon(file, ctx->m2m_ctx, type);
 }
 
@@ -469,7 +457,6 @@ static int fimc_m2m_streamoff(struct file *file, void *fh,
 			    enum v4l2_buf_type type)
 {
 	struct fimc_ctx *ctx = fh_to_ctx(fh);
-
 	return v4l2_m2m_streamoff(file, ctx->m2m_ctx, type);
 }
 
@@ -577,20 +564,18 @@ static int fimc_m2m_s_crop(struct file *file, void *fh, const struct v4l2_crop *
 		&ctx->s_frame : &ctx->d_frame;
 
 	/* Check to see if scaling ratio is within supported range */
-	if (fimc_ctx_state_is_set(FIMC_DST_FMT | FIMC_SRC_FMT, ctx)) {
-		if (cr.type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) {
-			ret = fimc_check_scaler_ratio(ctx, cr.c.width,
-					cr.c.height, ctx->d_frame.width,
-					ctx->d_frame.height, ctx->rotation);
-		} else {
-			ret = fimc_check_scaler_ratio(ctx, ctx->s_frame.width,
-					ctx->s_frame.height, cr.c.width,
-					cr.c.height, ctx->rotation);
-		}
-		if (ret) {
-			v4l2_err(&fimc->m2m.vfd, "Out of scaler range\n");
-			return -EINVAL;
-		}
+	if (cr.type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) {
+		ret = fimc_check_scaler_ratio(ctx, cr.c.width,
+				cr.c.height, ctx->d_frame.width,
+				ctx->d_frame.height, ctx->rotation);
+	} else {
+		ret = fimc_check_scaler_ratio(ctx, ctx->s_frame.width,
+				ctx->s_frame.height, cr.c.width,
+				cr.c.height, ctx->rotation);
+	}
+	if (ret) {
+		v4l2_err(&fimc->m2m.vfd, "Out of scaler range\n");
+		return -EINVAL;
 	}
 
 	f->offs_h = cr.c.left;
@@ -653,6 +638,29 @@ static int queue_init(void *priv, struct vb2_queue *src_vq,
 	return vb2_queue_init(dst_vq);
 }
 
+static int fimc_m2m_set_default_format(struct fimc_ctx *ctx)
+{
+	struct v4l2_pix_format_mplane pixm = {
+		.pixelformat	= V4L2_PIX_FMT_RGB32,
+		.width		= 800,
+		.height		= 600,
+		.plane_fmt[0]	= {
+			.bytesperline = 800 * 4,
+			.sizeimage = 800 * 4 * 600,
+		},
+	};
+	struct fimc_fmt *fmt;
+
+	fmt = fimc_find_format(&pixm.pixelformat, NULL, FMT_FLAGS_M2M, 0);
+	if (!fmt)
+		return -EINVAL;
+
+	__set_frame_format(&ctx->s_frame, fmt, &pixm);
+	__set_frame_format(&ctx->d_frame, fmt, &pixm);
+
+	return 0;
+}
+
 static int fimc_m2m_open(struct file *file)
 {
 	struct fimc_dev *fimc = video_drvdata(file);
@@ -697,6 +705,7 @@ static int fimc_m2m_open(struct file *file)
 	ctx->flags = 0;
 	ctx->in_path = FIMC_IO_DMA;
 	ctx->out_path = FIMC_IO_DMA;
+	ctx->scaler.enabled = 1;
 
 	ctx->m2m_ctx = v4l2_m2m_ctx_init(fimc->m2m.m2m_dev, ctx, queue_init);
 	if (IS_ERR(ctx->m2m_ctx)) {
@@ -707,9 +716,15 @@ static int fimc_m2m_open(struct file *file)
 	if (fimc->m2m.refcnt++ == 0)
 		set_bit(ST_M2M_RUN, &fimc->state);
 
+	ret = fimc_m2m_set_default_format(ctx);
+	if (ret < 0)
+		goto error_m2m_ctx;
+
 	mutex_unlock(&fimc->lock);
 	return 0;
 
+error_m2m_ctx:
+	v4l2_m2m_ctx_release(ctx->m2m_ctx);
 error_c:
 	fimc_ctrls_delete(ctx);
 error_fh:
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH 3/5] s5p-fimc: Fix FIMC.n subdev set_selection ioctl handler
  2013-01-30 17:23 [PATCH 0/5] s5p-fimc driver fixes/cleanups Sylwester Nawrocki
  2013-01-30 17:23 ` [PATCH 1/5] s5p-fimc: Avoid null pointer dereference in fimc_capture_ctrls_create() Sylwester Nawrocki
  2013-01-30 17:23 ` [PATCH 2/5] s5p-fimc: Set default image format at device open() Sylwester Nawrocki
@ 2013-01-30 17:23 ` Sylwester Nawrocki
  2013-01-30 17:23 ` [PATCH 4/5] s5p-fimc: Add clk_prepare/unprepare for sclk_cam clocks Sylwester Nawrocki
  2013-01-30 17:23 ` [PATCH 5/5] s5p-fimc: Redefine platform data structure for fimc-is Sylwester Nawrocki
  4 siblings, 0 replies; 10+ messages in thread
From: Sylwester Nawrocki @ 2013-01-30 17:23 UTC (permalink / raw)
  To: linux-media; +Cc: kyungmin.park, sw0312.kim, Sylwester Nawrocki

The V4L2_SEL_TGT_CROP_BOUNDS, V4L2_SEL_TGT_COMPOSE_BOUNDS selection
targets are not supposed to be handled in the set_selection ioctl.
Remove the code that doesn't do anything sensible now and make sure
ctx->state is modified with the spinlock held.

Signed-off-by: Sylwester Nawrocki <s.nawrocki@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
---
 drivers/media/platform/s5p-fimc/fimc-capture.c |   12 +-----------
 1 file changed, 1 insertion(+), 11 deletions(-)

diff --git a/drivers/media/platform/s5p-fimc/fimc-capture.c b/drivers/media/platform/s5p-fimc/fimc-capture.c
index 35998a3..f822b8e 100644
--- a/drivers/media/platform/s5p-fimc/fimc-capture.c
+++ b/drivers/media/platform/s5p-fimc/fimc-capture.c
@@ -1688,16 +1688,6 @@ static int fimc_subdev_set_selection(struct v4l2_subdev *sd,
 	fimc_capture_try_selection(ctx, r, V4L2_SEL_TGT_CROP);
 
 	switch (sel->target) {
-	case V4L2_SEL_TGT_COMPOSE_BOUNDS:
-		f = &ctx->d_frame;
-	case V4L2_SEL_TGT_CROP_BOUNDS:
-		r->width = f->o_width;
-		r->height = f->o_height;
-		r->left = 0;
-		r->top = 0;
-		mutex_unlock(&fimc->lock);
-		return 0;
-
 	case V4L2_SEL_TGT_CROP:
 		try_sel = v4l2_subdev_get_try_crop(fh, sel->pad);
 		break;
@@ -1716,9 +1706,9 @@ static int fimc_subdev_set_selection(struct v4l2_subdev *sd,
 		spin_lock_irqsave(&fimc->slock, flags);
 		set_frame_crop(f, r->left, r->top, r->width, r->height);
 		set_bit(ST_CAPT_APPLY_CFG, &fimc->state);
-		spin_unlock_irqrestore(&fimc->slock, flags);
 		if (sel->target == V4L2_SEL_TGT_COMPOSE)
 			ctx->state |= FIMC_COMPOSE;
+		spin_unlock_irqrestore(&fimc->slock, flags);
 	}
 
 	dbg("target %#x: (%d,%d)/%dx%d", sel->target, r->left, r->top,
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH 4/5] s5p-fimc: Add clk_prepare/unprepare for sclk_cam clocks
  2013-01-30 17:23 [PATCH 0/5] s5p-fimc driver fixes/cleanups Sylwester Nawrocki
                   ` (2 preceding siblings ...)
  2013-01-30 17:23 ` [PATCH 3/5] s5p-fimc: Fix FIMC.n subdev set_selection ioctl handler Sylwester Nawrocki
@ 2013-01-30 17:23 ` Sylwester Nawrocki
  2013-01-30 17:23 ` [PATCH 5/5] s5p-fimc: Redefine platform data structure for fimc-is Sylwester Nawrocki
  4 siblings, 0 replies; 10+ messages in thread
From: Sylwester Nawrocki @ 2013-01-30 17:23 UTC (permalink / raw)
  To: linux-media; +Cc: kyungmin.park, sw0312.kim, Sylwester Nawrocki

Add clk_prepare(), clk_unprepare() calls for the sclk_cam clocks
to ensure the driver works on platforms with the common clocks
API enabled.

Signed-off-by: Sylwester Nawrocki <s.nawrocki@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
---
 drivers/media/platform/s5p-fimc/fimc-mdevice.c |   53 ++++++++++++++++--------
 1 file changed, 36 insertions(+), 17 deletions(-)

diff --git a/drivers/media/platform/s5p-fimc/fimc-mdevice.c b/drivers/media/platform/s5p-fimc/fimc-mdevice.c
index 2b05872..d940454 100644
--- a/drivers/media/platform/s5p-fimc/fimc-mdevice.c
+++ b/drivers/media/platform/s5p-fimc/fimc-mdevice.c
@@ -708,35 +708,54 @@ static int fimc_md_create_links(struct fimc_md *fmd)
 /*
  * The peripheral sensor clock management.
  */
+static void fimc_md_put_clocks(struct fimc_md *fmd)
+{
+	int i = FIMC_MAX_CAMCLKS;
+
+	while (--i >= 0) {
+		if (IS_ERR(fmd->camclk[i].clock))
+			continue;
+		clk_unprepare(fmd->camclk[i].clock);
+		clk_put(fmd->camclk[i].clock);
+		fmd->camclk[i].clock = ERR_PTR(-EINVAL);
+	}
+}
+
 static int fimc_md_get_clocks(struct fimc_md *fmd)
 {
+	struct device *dev = NULL;
 	char clk_name[32];
 	struct clk *clock;
-	int i;
+	int ret, i;
+
+	for (i = 0; i < FIMC_MAX_CAMCLKS; i++)
+		fmd->camclk[i].clock = ERR_PTR(-EINVAL);
+
+	if (fmd->pdev->dev.of_node)
+		dev = &fmd->pdev->dev;
 
 	for (i = 0; i < FIMC_MAX_CAMCLKS; i++) {
 		snprintf(clk_name, sizeof(clk_name), "sclk_cam%u", i);
-		clock = clk_get(NULL, clk_name);
+		clock = clk_get(dev, clk_name);
+
 		if (IS_ERR(clock)) {
-			v4l2_err(&fmd->v4l2_dev, "Failed to get clock: %s",
-				  clk_name);
-			return -ENXIO;
+			dev_err(&fmd->pdev->dev, "Failed to get clock: %s\n",
+								clk_name);
+			ret = PTR_ERR(clock);
+			break;
+		}
+		ret = clk_prepare(clock);
+		if (ret < 0) {
+			clk_put(clock);
+			fmd->camclk[i].clock = ERR_PTR(-EINVAL);
+			break;
 		}
 		fmd->camclk[i].clock = clock;
 	}
-	return 0;
-}
-
-static void fimc_md_put_clocks(struct fimc_md *fmd)
-{
-	int i = FIMC_MAX_CAMCLKS;
+	if (ret)
+		fimc_md_put_clocks(fmd);
 
-	while (--i >= 0) {
-		if (IS_ERR_OR_NULL(fmd->camclk[i].clock))
-			continue;
-		clk_put(fmd->camclk[i].clock);
-		fmd->camclk[i].clock = NULL;
-	}
+	return ret;
 }
 
 static int __fimc_md_set_camclk(struct fimc_md *fmd,
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH 5/5] s5p-fimc: Redefine platform data structure for fimc-is
  2013-01-30 17:23 [PATCH 0/5] s5p-fimc driver fixes/cleanups Sylwester Nawrocki
                   ` (3 preceding siblings ...)
  2013-01-30 17:23 ` [PATCH 4/5] s5p-fimc: Add clk_prepare/unprepare for sclk_cam clocks Sylwester Nawrocki
@ 2013-01-30 17:23 ` Sylwester Nawrocki
  2013-02-01 11:05     ` Sylwester Nawrocki
  4 siblings, 1 reply; 10+ messages in thread
From: Sylwester Nawrocki @ 2013-01-30 17:23 UTC (permalink / raw)
  To: linux-media
  Cc: kyungmin.park, sw0312.kim, Sylwester Nawrocki, Kukjin Kim,
	linux-samsung-soc

Newer Exynos4 SoC are equipped with a local camera ISP that
controls external raw image sensor directly. Such sensors
can be connected through FIMC-LITEn (and MIPI-CSISn) IPs to
the ISP, which then feeds image data to the FIMCn IP. Thus
there can be two busses associated with an image source
(sensor). Rename struct s5p_fimc_isp_info describing external
image sensor (video decoder) to struct fimc_source_info to
avoid confusion. bus_type is split into fimc_bus_type and
sensor_bus_type. The bus type enumeration is extended to
include both FIMC Writeback input types.

The bus_type enumeration and the data structure name in the
board files are modified according to the above changes.

Cc: Kukjin Kim <kgene.kim@samsung.com>
Cc: linux-samsung-soc@vger.kernel.org
Signed-off-by: Sylwester Nawrocki <s.nawrocki@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
---
 arch/arm/mach-exynos/mach-nuri.c                |    8 ++--
 arch/arm/mach-exynos/mach-universal_c210.c      |    8 ++--
 arch/arm/mach-s5pv210/mach-goni.c               |    6 +--
 drivers/media/platform/s5p-fimc/fimc-lite-reg.c |    8 ++--
 drivers/media/platform/s5p-fimc/fimc-lite-reg.h |    4 +-
 drivers/media/platform/s5p-fimc/fimc-mdevice.c  |   16 ++++----
 drivers/media/platform/s5p-fimc/fimc-mdevice.h  |    2 +-
 drivers/media/platform/s5p-fimc/fimc-reg.c      |   34 +++++++++-------
 drivers/media/platform/s5p-fimc/fimc-reg.h      |    6 +--
 include/media/s5p_fimc.h                        |   49 ++++++++++++++---------
 10 files changed, 79 insertions(+), 62 deletions(-)

diff --git a/arch/arm/mach-exynos/mach-nuri.c b/arch/arm/mach-exynos/mach-nuri.c
index 27d4ed8..7c2600e 100644
--- a/arch/arm/mach-exynos/mach-nuri.c
+++ b/arch/arm/mach-exynos/mach-nuri.c
@@ -1209,25 +1209,25 @@ static struct i2c_board_info m5mols_board_info = {
 	.platform_data	= &m5mols_platdata,
 };

-static struct s5p_fimc_isp_info nuri_camera_sensors[] = {
+static struct fimc_source_info nuri_camera_sensors[] = {
 	{
 		.flags		= V4L2_MBUS_PCLK_SAMPLE_RISING |
 				  V4L2_MBUS_VSYNC_ACTIVE_LOW,
-		.bus_type	= FIMC_ITU_601,
+		.fimc_bus_type	= FIMC_BUS_TYPE_ITU_601,
 		.board_info	= &s5k6aa_board_info,
 		.clk_frequency	= 24000000UL,
 		.i2c_bus_num	= 6,
 	}, {
 		.flags		= V4L2_MBUS_PCLK_SAMPLE_FALLING |
 				  V4L2_MBUS_VSYNC_ACTIVE_LOW,
-		.bus_type	= FIMC_MIPI_CSI2,
+		.fimc_bus_type	= FIMC_BUS_TYPE_MIPI_CSI2,
 		.board_info	= &m5mols_board_info,
 		.clk_frequency	= 24000000UL,
 	},
 };

 static struct s5p_platform_fimc fimc_md_platdata = {
-	.isp_info	= nuri_camera_sensors,
+	.source_info	= nuri_camera_sensors,
 	.num_clients	= ARRAY_SIZE(nuri_camera_sensors),
 };

diff --git a/arch/arm/mach-exynos/mach-universal_c210.c b/arch/arm/mach-exynos/mach-universal_c210.c
index 9e3340f..c09290a 100644
--- a/arch/arm/mach-exynos/mach-universal_c210.c
+++ b/arch/arm/mach-exynos/mach-universal_c210.c
@@ -988,12 +988,12 @@ static struct i2c_board_info m5mols_board_info = {
 	.platform_data = &m5mols_platdata,
 };

-static struct s5p_fimc_isp_info universal_camera_sensors[] = {
+static struct fimc_source_info universal_camera_sensors[] = {
 	{
 		.mux_id		= 0,
 		.flags		= V4L2_MBUS_PCLK_SAMPLE_FALLING |
 				  V4L2_MBUS_VSYNC_ACTIVE_LOW,
-		.bus_type	= FIMC_ITU_601,
+		.fimc_bus_type	= FIMC_BUS_TYPE_ITU_601,
 		.board_info	= &s5k6aa_board_info,
 		.i2c_bus_num	= 0,
 		.clk_frequency	= 24000000UL,
@@ -1001,7 +1001,7 @@ static struct s5p_fimc_isp_info universal_camera_sensors[] = {
 		.mux_id		= 0,
 		.flags		= V4L2_MBUS_PCLK_SAMPLE_FALLING |
 				  V4L2_MBUS_VSYNC_ACTIVE_LOW,
-		.bus_type	= FIMC_MIPI_CSI2,
+		.fimc_bus_type	= FIMC_BUS_TYPE_MIPI_CSI2,
 		.board_info	= &m5mols_board_info,
 		.i2c_bus_num	= 0,
 		.clk_frequency	= 24000000UL,
@@ -1009,7 +1009,7 @@ static struct s5p_fimc_isp_info universal_camera_sensors[] = {
 };

 static struct s5p_platform_fimc fimc_md_platdata = {
-	.isp_info	= universal_camera_sensors,
+	.source_info	= universal_camera_sensors,
 	.num_clients	= ARRAY_SIZE(universal_camera_sensors),
 };

diff --git a/arch/arm/mach-s5pv210/mach-goni.c b/arch/arm/mach-s5pv210/mach-goni.c
index c72b310..423f6b6 100644
--- a/arch/arm/mach-s5pv210/mach-goni.c
+++ b/arch/arm/mach-s5pv210/mach-goni.c
@@ -841,12 +841,12 @@ static struct i2c_board_info noon010pc30_board_info = {
 	.platform_data = &noon010pc30_pldata,
 };

-static struct s5p_fimc_isp_info goni_camera_sensors[] = {
+static struct fimc_source_info goni_camera_sensors[] = {
 	{
 		.mux_id		= 0,
 		.flags		= V4L2_MBUS_PCLK_SAMPLE_FALLING |
 				  V4L2_MBUS_VSYNC_ACTIVE_LOW,
-		.bus_type	= FIMC_ITU_601,
+		.bus_type	= FIMC_BUS_TYPE_ITU_601,
 		.board_info	= &noon010pc30_board_info,
 		.i2c_bus_num	= 0,
 		.clk_frequency	= 16000000UL,
@@ -854,7 +854,7 @@ static struct s5p_fimc_isp_info goni_camera_sensors[] = {
 };

 static struct s5p_platform_fimc goni_fimc_md_platdata __initdata = {
-	.isp_info	= goni_camera_sensors,
+	.source_info	= goni_camera_sensors,
 	.num_clients	= ARRAY_SIZE(goni_camera_sensors),
 };

diff --git a/drivers/media/platform/s5p-fimc/fimc-lite-reg.c b/drivers/media/platform/s5p-fimc/fimc-lite-reg.c
index 962652d..f0af075 100644
--- a/drivers/media/platform/s5p-fimc/fimc-lite-reg.c
+++ b/drivers/media/platform/s5p-fimc/fimc-lite-reg.c
@@ -187,12 +187,12 @@ static void flite_hw_set_camera_port(struct fimc_lite *dev, int id)

 /* Select serial or parallel bus, camera port (A,B) and set signals polarity */
 void flite_hw_set_camera_bus(struct fimc_lite *dev,
-			     struct s5p_fimc_isp_info *s_info)
+			     struct fimc_source_info *si)
 {
 	u32 cfg = readl(dev->regs + FLITE_REG_CIGCTRL);
-	unsigned int flags = s_info->flags;
+	unsigned int flags = si->flags;

-	if (s_info->bus_type != FIMC_MIPI_CSI2) {
+	if (si->sensor_bus_type != FIMC_BUS_TYPE_MIPI_CSI2) {
 		cfg &= ~(FLITE_REG_CIGCTRL_SELCAM_MIPI |
 			 FLITE_REG_CIGCTRL_INVPOLPCLK |
 			 FLITE_REG_CIGCTRL_INVPOLVSYNC |
@@ -212,7 +212,7 @@ void flite_hw_set_camera_bus(struct fimc_lite *dev,

 	writel(cfg, dev->regs + FLITE_REG_CIGCTRL);

-	flite_hw_set_camera_port(dev, s_info->mux_id);
+	flite_hw_set_camera_port(dev, si->mux_id);
 }

 static void flite_hw_set_out_order(struct fimc_lite *dev, struct flite_frame *f)
diff --git a/drivers/media/platform/s5p-fimc/fimc-lite-reg.h b/drivers/media/platform/s5p-fimc/fimc-lite-reg.h
index adb9e9e..0e34584 100644
--- a/drivers/media/platform/s5p-fimc/fimc-lite-reg.h
+++ b/drivers/media/platform/s5p-fimc/fimc-lite-reg.h
@@ -131,9 +131,9 @@ void flite_hw_set_interrupt_mask(struct fimc_lite *dev);
 void flite_hw_capture_start(struct fimc_lite *dev);
 void flite_hw_capture_stop(struct fimc_lite *dev);
 void flite_hw_set_camera_bus(struct fimc_lite *dev,
-			     struct s5p_fimc_isp_info *s_info);
+			     struct fimc_source_info *s_info);
 void flite_hw_set_camera_polarity(struct fimc_lite *dev,
-				  struct s5p_fimc_isp_info *cam);
+				  struct fimc_source_info *cam);
 void flite_hw_set_window_offset(struct fimc_lite *dev, struct flite_frame *f);
 void flite_hw_set_source_format(struct fimc_lite *dev, struct flite_frame *f);

diff --git a/drivers/media/platform/s5p-fimc/fimc-mdevice.c b/drivers/media/platform/s5p-fimc/fimc-mdevice.c
index d940454..f49f6f1 100644
--- a/drivers/media/platform/s5p-fimc/fimc-mdevice.c
+++ b/drivers/media/platform/s5p-fimc/fimc-mdevice.c
@@ -290,7 +290,7 @@ static int fimc_md_register_sensor_entities(struct fimc_md *fmd)
 	for (i = 0; i < num_clients; i++) {
 		struct v4l2_subdev *sd;

-		fmd->sensor[i].pdata = pdata->isp_info[i];
+		fmd->sensor[i].pdata = pdata->source_info[i];
 		ret = __fimc_md_set_camclk(fmd, &fmd->sensor[i], true);
 		if (ret)
 			break;
@@ -504,7 +504,7 @@ static int __fimc_md_create_fimc_sink_links(struct fimc_md *fmd,
 					    struct v4l2_subdev *sensor,
 					    int pad, int link_mask)
 {
-	struct fimc_sensor_info *s_info;
+	struct fimc_sensor_info *s_info = NULL;
 	struct media_entity *sink;
 	unsigned int flags = 0;
 	int ret, i;
@@ -614,7 +614,7 @@ static int fimc_md_create_links(struct fimc_md *fmd)
 {
 	struct v4l2_subdev *csi_sensors[CSIS_MAX_ENTITIES] = { NULL };
 	struct v4l2_subdev *sensor, *csis;
-	struct s5p_fimc_isp_info *pdata;
+	struct fimc_source_info *pdata;
 	struct fimc_sensor_info *s_info;
 	struct media_entity *source, *sink;
 	int i, pad, fimc_id = 0, ret = 0;
@@ -632,8 +632,8 @@ static int fimc_md_create_links(struct fimc_md *fmd)
 		source = NULL;
 		pdata = &s_info->pdata;

-		switch (pdata->bus_type) {
-		case FIMC_MIPI_CSI2:
+		switch (pdata->sensor_bus_type) {
+		case FIMC_BUS_TYPE_MIPI_CSI2:
 			if (WARN(pdata->mux_id >= CSIS_MAX_ENTITIES,
 				"Wrong CSI channel id: %d\n", pdata->mux_id))
 				return -EINVAL;
@@ -659,14 +659,14 @@ static int fimc_md_create_links(struct fimc_md *fmd)
 			csi_sensors[pdata->mux_id] = sensor;
 			break;

-		case FIMC_ITU_601...FIMC_ITU_656:
+		case FIMC_BUS_TYPE_ITU_601...FIMC_BUS_TYPE_ITU_656:
 			source = &sensor->entity;
 			pad = 0;
 			break;

 		default:
 			v4l2_err(&fmd->v4l2_dev, "Wrong bus_type: %x\n",
-				 pdata->bus_type);
+				 pdata->sensor_bus_type);
 			return -EINVAL;
 		}
 		if (source == NULL)
@@ -762,7 +762,7 @@ static int __fimc_md_set_camclk(struct fimc_md *fmd,
 				struct fimc_sensor_info *s_info,
 				bool on)
 {
-	struct s5p_fimc_isp_info *pdata = &s_info->pdata;
+	struct fimc_source_info *pdata = &s_info->pdata;
 	struct fimc_camclk_info *camclk;
 	int ret = 0;

diff --git a/drivers/media/platform/s5p-fimc/fimc-mdevice.h b/drivers/media/platform/s5p-fimc/fimc-mdevice.h
index da7d992..06b0d82 100644
--- a/drivers/media/platform/s5p-fimc/fimc-mdevice.h
+++ b/drivers/media/platform/s5p-fimc/fimc-mdevice.h
@@ -53,7 +53,7 @@ struct fimc_camclk_info {
  * This data structure applies to image sensor and the writeback subdevs.
  */
 struct fimc_sensor_info {
-	struct s5p_fimc_isp_info pdata;
+	struct fimc_source_info pdata;
 	struct v4l2_subdev *subdev;
 	struct fimc_dev *host;
 };
diff --git a/drivers/media/platform/s5p-fimc/fimc-reg.c b/drivers/media/platform/s5p-fimc/fimc-reg.c
index c05d044..50b97c7 100644
--- a/drivers/media/platform/s5p-fimc/fimc-reg.c
+++ b/drivers/media/platform/s5p-fimc/fimc-reg.c
@@ -554,7 +554,7 @@ void fimc_hw_set_output_addr(struct fimc_dev *dev,
 }

 int fimc_hw_set_camera_polarity(struct fimc_dev *fimc,
-				struct s5p_fimc_isp_info *cam)
+				struct fimc_source_info *cam)
 {
 	u32 cfg = readl(fimc->regs + FIMC_REG_CIGCTRL);

@@ -596,14 +596,15 @@ static const struct mbus_pixfmt_desc pix_desc[] = {
 };

 int fimc_hw_set_camera_source(struct fimc_dev *fimc,
-			      struct s5p_fimc_isp_info *cam)
+			      struct fimc_source_info *source)
 {
 	struct fimc_frame *f = &fimc->vid_cap.ctx->s_frame;
-	u32 cfg = 0;
-	u32 bus_width;
+	u32 bus_width, cfg = 0;
 	int i;

-	if (cam->bus_type == FIMC_ITU_601 || cam->bus_type == FIMC_ITU_656) {
+	switch (source->fimc_bus_type) {
+	case FIMC_BUS_TYPE_ITU_601:
+	case FIMC_BUS_TYPE_ITU_656:
 		for (i = 0; i < ARRAY_SIZE(pix_desc); i++) {
 			if (fimc->vid_cap.mf.code == pix_desc[i].pixelcode) {
 				cfg = pix_desc[i].cisrcfmt;
@@ -619,15 +620,17 @@ int fimc_hw_set_camera_source(struct fimc_dev *fimc,
 			return -EINVAL;
 		}

-		if (cam->bus_type == FIMC_ITU_601) {
+		if (source->fimc_bus_type == FIMC_BUS_TYPE_ITU_601) {
 			if (bus_width == 8)
 				cfg |= FIMC_REG_CISRCFMT_ITU601_8BIT;
 			else if (bus_width == 16)
 				cfg |= FIMC_REG_CISRCFMT_ITU601_16BIT;
 		} /* else defaults to ITU-R BT.656 8-bit */
-	} else if (cam->bus_type == FIMC_MIPI_CSI2) {
+		break;
+	case FIMC_BUS_TYPE_MIPI_CSI2:
 		if (fimc_fmt_is_user_defined(f->fmt->color))
 			cfg |= FIMC_REG_CISRCFMT_ITU601_8BIT;
+		break;
 	}

 	cfg |= (f->o_width << 16) | f->o_height;
@@ -655,7 +658,7 @@ void fimc_hw_set_camera_offset(struct fimc_dev *fimc, struct fimc_frame *f)
 }

 int fimc_hw_set_camera_type(struct fimc_dev *fimc,
-			    struct s5p_fimc_isp_info *cam)
+			    struct fimc_source_info *source)
 {
 	u32 cfg, tmp;
 	struct fimc_vid_cap *vid_cap = &fimc->vid_cap;
@@ -668,11 +671,11 @@ int fimc_hw_set_camera_type(struct fimc_dev *fimc,
 		FIMC_REG_CIGCTRL_SELCAM_MIPI | FIMC_REG_CIGCTRL_CAMIF_SELWB |
 		FIMC_REG_CIGCTRL_SELCAM_MIPI_A | FIMC_REG_CIGCTRL_CAM_JPEG);

-	switch (cam->bus_type) {
-	case FIMC_MIPI_CSI2:
+	switch (source->fimc_bus_type) {
+	case FIMC_BUS_TYPE_MIPI_CSI2:
 		cfg |= FIMC_REG_CIGCTRL_SELCAM_MIPI;

-		if (cam->mux_id == 0)
+		if (source->mux_id == 0)
 			cfg |= FIMC_REG_CIGCTRL_SELCAM_MIPI_A;

 		/* TODO: add remaining supported formats. */
@@ -695,15 +698,16 @@ int fimc_hw_set_camera_type(struct fimc_dev *fimc,

 		writel(tmp, fimc->regs + FIMC_REG_CSIIMGFMT);
 		break;
-	case FIMC_ITU_601...FIMC_ITU_656:
-		if (cam->mux_id == 0) /* ITU-A, ITU-B: 0, 1 */
+	case FIMC_BUS_TYPE_ITU_601...FIMC_BUS_TYPE_ITU_656:
+		if (source->mux_id == 0) /* ITU-A, ITU-B: 0, 1 */
 			cfg |= FIMC_REG_CIGCTRL_SELCAM_ITU_A;
 		break;
-	case FIMC_LCD_WB:
+	case FIMC_BUS_TYPE_LCD_WRITEBACK_A:
 		cfg |= FIMC_REG_CIGCTRL_CAMIF_SELWB;
 		break;
 	default:
-		v4l2_err(&vid_cap->vfd, "Invalid camera bus type selected\n");
+		v4l2_err(&vid_cap->vfd, "Invalid FIMC bus type selected: %d\n",
+			 source->fimc_bus_type);
 		return -EINVAL;
 	}
 	writel(cfg, fimc->regs + FIMC_REG_CIGCTRL);
diff --git a/drivers/media/platform/s5p-fimc/fimc-reg.h b/drivers/media/platform/s5p-fimc/fimc-reg.h
index f3e0b78..1a40df6 100644
--- a/drivers/media/platform/s5p-fimc/fimc-reg.h
+++ b/drivers/media/platform/s5p-fimc/fimc-reg.h
@@ -297,12 +297,12 @@ void fimc_hw_set_input_addr(struct fimc_dev *fimc, struct fimc_addr *paddr);
 void fimc_hw_set_output_addr(struct fimc_dev *fimc, struct fimc_addr *paddr,
 			     int index);
 int fimc_hw_set_camera_source(struct fimc_dev *fimc,
-			      struct s5p_fimc_isp_info *cam);
+			      struct fimc_source_info *cam);
 void fimc_hw_set_camera_offset(struct fimc_dev *fimc, struct fimc_frame *f);
 int fimc_hw_set_camera_polarity(struct fimc_dev *fimc,
-				struct s5p_fimc_isp_info *cam);
+				struct fimc_source_info *cam);
 int fimc_hw_set_camera_type(struct fimc_dev *fimc,
-			    struct s5p_fimc_isp_info *cam);
+			    struct fimc_source_info *cam);
 void fimc_hw_clear_irq(struct fimc_dev *dev);
 void fimc_hw_enable_scaler(struct fimc_dev *dev, bool on);
 void fimc_hw_activate_input_dma(struct fimc_dev *dev, bool on);
diff --git a/include/media/s5p_fimc.h b/include/media/s5p_fimc.h
index eaea62a..28f3590 100644
--- a/include/media/s5p_fimc.h
+++ b/include/media/s5p_fimc.h
@@ -1,8 +1,8 @@
 /*
- * Samsung S5P SoC camera interface driver header
+ * Samsung S5P/Exynos4 SoC series camera interface driver header
  *
- * Copyright (c) 2010 Samsung Electronics Co., Ltd
- * Author: Sylwester Nawrocki, <s.nawrocki@samsung.com>
+ * Copyright (C) 2010 - 2013 Samsung Electronics Co., Ltd.
+ * Sylwester Nawrocki <s.nawrocki@samsung.com>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 as
@@ -14,45 +14,58 @@

 #include <media/media-entity.h>

-enum cam_bus_type {
-	FIMC_ITU_601 = 1,
-	FIMC_ITU_656,
-	FIMC_MIPI_CSI2,
-	FIMC_LCD_WB, /* FIFO link from LCD mixer */
+/*
+ * Enumeration of the FIMC data bus types.
+ */
+enum fimc_bus_type {
+	/* Camera parallel bus */
+	FIMC_BUS_TYPE_ITU_601 = 1,
+	/* Camera parallel bus with embedded synchronization */
+	FIMC_BUS_TYPE_ITU_656,
+	/* Camera MIPI-CSI2 serial bus */
+	FIMC_BUS_TYPE_MIPI_CSI2,
+	/* FIFO link from LCD controller (WriteBack A) */
+	FIMC_BUS_TYPE_LCD_WRITEBACK_A,
+	/* FIFO link from LCD controller (WriteBack B) */
+	FIMC_BUS_TYPE_LCD_WRITEBACK_B,
+	/* FIFO link from FIMC-IS */
+	FIMC_BUS_TYPE_ISP_WRITEBACK = FIMC_BUS_TYPE_LCD_WRITEBACK_B,
 };

 struct i2c_board_info;

 /**
- * struct s5p_fimc_isp_info - image sensor information required for host
- *			      interace configuration.
+ * struct fimc_source_info - video source description required for the host
+ *			     interface configuration
  *
  * @board_info: pointer to I2C subdevice's board info
  * @clk_frequency: frequency of the clock the host interface provides to sensor
- * @bus_type: determines bus type, MIPI, ITU-R BT.601 etc.
+ * @fimc_bus_type: FIMC camera input type
+ * @sensor_bus_type: image sensor bus type, MIPI, ITU-R BT.601 etc.
+ * @flags: the parallel sensor bus flags defining signals polarity (V4L2_MBUS_*)
  * @i2c_bus_num: i2c control bus id the sensor is attached to
  * @mux_id: FIMC camera interface multiplexer index (separate for MIPI and ITU)
  * @clk_id: index of the SoC peripheral clock for sensors
- * @flags: the parallel bus flags defining signals polarity (V4L2_MBUS_*)
  */
-struct s5p_fimc_isp_info {
+struct fimc_source_info {
 	struct i2c_board_info *board_info;
 	unsigned long clk_frequency;
-	enum cam_bus_type bus_type;
+	enum fimc_bus_type fimc_bus_type;
+	enum fimc_bus_type sensor_bus_type;
+	u16 flags;
 	u16 i2c_bus_num;
 	u16 mux_id;
-	u16 flags;
 	u8 clk_id;
 };

 /**
  * struct s5p_platform_fimc - camera host interface platform data
  *
- * @isp_info: properties of camera sensor required for host interface setup
- * @num_clients: the number of attached image sensors
+ * @source_info: properties of an image source for the host interface setup
+ * @num_clients: the number of attached image sources
  */
 struct s5p_platform_fimc {
-	struct s5p_fimc_isp_info *isp_info;
+	struct fimc_source_info *source_info;
 	int num_clients;
 };

--
1.7.9.5

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* Re: [PATCH 5/5] s5p-fimc: Redefine platform data structure for fimc-is
  2013-01-30 17:23 ` [PATCH 5/5] s5p-fimc: Redefine platform data structure for fimc-is Sylwester Nawrocki
@ 2013-02-01 11:05     ` Sylwester Nawrocki
  0 siblings, 0 replies; 10+ messages in thread
From: Sylwester Nawrocki @ 2013-02-01 11:05 UTC (permalink / raw)
  To: Kukjin Kim
  Cc: Sylwester Nawrocki, linux-media, kyungmin.park, sw0312.kim,
	linux-samsung-soc, 'linux-arm-kernel'

On 01/30/2013 06:23 PM, Sylwester Nawrocki wrote:
> Newer Exynos4 SoC are equipped with a local camera ISP that
> controls external raw image sensor directly. Such sensors
> can be connected through FIMC-LITEn (and MIPI-CSISn) IPs to
> the ISP, which then feeds image data to the FIMCn IP. Thus
> there can be two busses associated with an image source
> (sensor). Rename struct s5p_fimc_isp_info describing external
> image sensor (video decoder) to struct fimc_source_info to
> avoid confusion. bus_type is split into fimc_bus_type and
> sensor_bus_type. The bus type enumeration is extended to
> include both FIMC Writeback input types.
> 
> The bus_type enumeration and the data structure name in the
> board files are modified according to the above changes.
> 
> Cc: Kukjin Kim <kgene.kim@samsung.com>
> Cc: linux-samsung-soc@vger.kernel.org
> Signed-off-by: Sylwester Nawrocki <s.nawrocki@samsung.com>
> Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>

Kukjin, can I please have your ack on this patch so it can be
merged through the media tree ?

--

Thanks,
Sylwester
> ---
>  arch/arm/mach-exynos/mach-nuri.c                |    8 ++--
>  arch/arm/mach-exynos/mach-universal_c210.c      |    8 ++--
>  arch/arm/mach-s5pv210/mach-goni.c               |    6 +--
>  drivers/media/platform/s5p-fimc/fimc-lite-reg.c |    8 ++--
>  drivers/media/platform/s5p-fimc/fimc-lite-reg.h |    4 +-
>  drivers/media/platform/s5p-fimc/fimc-mdevice.c  |   16 ++++----
>  drivers/media/platform/s5p-fimc/fimc-mdevice.h  |    2 +-
>  drivers/media/platform/s5p-fimc/fimc-reg.c      |   34 +++++++++-------
>  drivers/media/platform/s5p-fimc/fimc-reg.h      |    6 +--
>  include/media/s5p_fimc.h                        |   49 ++++++++++++++---------
>  10 files changed, 79 insertions(+), 62 deletions(-)
> 
> diff --git a/arch/arm/mach-exynos/mach-nuri.c b/arch/arm/mach-exynos/mach-nuri.c
> index 27d4ed8..7c2600e 100644
> --- a/arch/arm/mach-exynos/mach-nuri.c
> +++ b/arch/arm/mach-exynos/mach-nuri.c
> @@ -1209,25 +1209,25 @@ static struct i2c_board_info m5mols_board_info = {
>  	.platform_data	= &m5mols_platdata,
>  };
> 
> -static struct s5p_fimc_isp_info nuri_camera_sensors[] = {
> +static struct fimc_source_info nuri_camera_sensors[] = {
>  	{
>  		.flags		= V4L2_MBUS_PCLK_SAMPLE_RISING |
>  				  V4L2_MBUS_VSYNC_ACTIVE_LOW,
> -		.bus_type	= FIMC_ITU_601,
> +		.fimc_bus_type	= FIMC_BUS_TYPE_ITU_601,
>  		.board_info	= &s5k6aa_board_info,
>  		.clk_frequency	= 24000000UL,
>  		.i2c_bus_num	= 6,
>  	}, {
>  		.flags		= V4L2_MBUS_PCLK_SAMPLE_FALLING |
>  				  V4L2_MBUS_VSYNC_ACTIVE_LOW,
> -		.bus_type	= FIMC_MIPI_CSI2,
> +		.fimc_bus_type	= FIMC_BUS_TYPE_MIPI_CSI2,
>  		.board_info	= &m5mols_board_info,
>  		.clk_frequency	= 24000000UL,
>  	},
>  };
> 
>  static struct s5p_platform_fimc fimc_md_platdata = {
> -	.isp_info	= nuri_camera_sensors,
> +	.source_info	= nuri_camera_sensors,
>  	.num_clients	= ARRAY_SIZE(nuri_camera_sensors),
>  };
> 
> diff --git a/arch/arm/mach-exynos/mach-universal_c210.c b/arch/arm/mach-exynos/mach-universal_c210.c
> index 9e3340f..c09290a 100644
> --- a/arch/arm/mach-exynos/mach-universal_c210.c
> +++ b/arch/arm/mach-exynos/mach-universal_c210.c
> @@ -988,12 +988,12 @@ static struct i2c_board_info m5mols_board_info = {
>  	.platform_data = &m5mols_platdata,
>  };
> 
> -static struct s5p_fimc_isp_info universal_camera_sensors[] = {
> +static struct fimc_source_info universal_camera_sensors[] = {
>  	{
>  		.mux_id		= 0,
>  		.flags		= V4L2_MBUS_PCLK_SAMPLE_FALLING |
>  				  V4L2_MBUS_VSYNC_ACTIVE_LOW,
> -		.bus_type	= FIMC_ITU_601,
> +		.fimc_bus_type	= FIMC_BUS_TYPE_ITU_601,
>  		.board_info	= &s5k6aa_board_info,
>  		.i2c_bus_num	= 0,
>  		.clk_frequency	= 24000000UL,
> @@ -1001,7 +1001,7 @@ static struct s5p_fimc_isp_info universal_camera_sensors[] = {
>  		.mux_id		= 0,
>  		.flags		= V4L2_MBUS_PCLK_SAMPLE_FALLING |
>  				  V4L2_MBUS_VSYNC_ACTIVE_LOW,
> -		.bus_type	= FIMC_MIPI_CSI2,
> +		.fimc_bus_type	= FIMC_BUS_TYPE_MIPI_CSI2,
>  		.board_info	= &m5mols_board_info,
>  		.i2c_bus_num	= 0,
>  		.clk_frequency	= 24000000UL,
> @@ -1009,7 +1009,7 @@ static struct s5p_fimc_isp_info universal_camera_sensors[] = {
>  };
> 
>  static struct s5p_platform_fimc fimc_md_platdata = {
> -	.isp_info	= universal_camera_sensors,
> +	.source_info	= universal_camera_sensors,
>  	.num_clients	= ARRAY_SIZE(universal_camera_sensors),
>  };
> 
> diff --git a/arch/arm/mach-s5pv210/mach-goni.c b/arch/arm/mach-s5pv210/mach-goni.c
> index c72b310..423f6b6 100644
> --- a/arch/arm/mach-s5pv210/mach-goni.c
> +++ b/arch/arm/mach-s5pv210/mach-goni.c
> @@ -841,12 +841,12 @@ static struct i2c_board_info noon010pc30_board_info = {
>  	.platform_data = &noon010pc30_pldata,
>  };
> 
> -static struct s5p_fimc_isp_info goni_camera_sensors[] = {
> +static struct fimc_source_info goni_camera_sensors[] = {
>  	{
>  		.mux_id		= 0,
>  		.flags		= V4L2_MBUS_PCLK_SAMPLE_FALLING |
>  				  V4L2_MBUS_VSYNC_ACTIVE_LOW,
> -		.bus_type	= FIMC_ITU_601,
> +		.bus_type	= FIMC_BUS_TYPE_ITU_601,
>  		.board_info	= &noon010pc30_board_info,
>  		.i2c_bus_num	= 0,
>  		.clk_frequency	= 16000000UL,
> @@ -854,7 +854,7 @@ static struct s5p_fimc_isp_info goni_camera_sensors[] = {
>  };
> 
>  static struct s5p_platform_fimc goni_fimc_md_platdata __initdata = {
> -	.isp_info	= goni_camera_sensors,
> +	.source_info	= goni_camera_sensors,
>  	.num_clients	= ARRAY_SIZE(goni_camera_sensors),
>  };
> 
> diff --git a/drivers/media/platform/s5p-fimc/fimc-lite-reg.c b/drivers/media/platform/s5p-fimc/fimc-lite-reg.c
> index 962652d..f0af075 100644
> --- a/drivers/media/platform/s5p-fimc/fimc-lite-reg.c
> +++ b/drivers/media/platform/s5p-fimc/fimc-lite-reg.c
> @@ -187,12 +187,12 @@ static void flite_hw_set_camera_port(struct fimc_lite *dev, int id)
> 
>  /* Select serial or parallel bus, camera port (A,B) and set signals polarity */
>  void flite_hw_set_camera_bus(struct fimc_lite *dev,
> -			     struct s5p_fimc_isp_info *s_info)
> +			     struct fimc_source_info *si)
>  {
>  	u32 cfg = readl(dev->regs + FLITE_REG_CIGCTRL);
> -	unsigned int flags = s_info->flags;
> +	unsigned int flags = si->flags;
> 
> -	if (s_info->bus_type != FIMC_MIPI_CSI2) {
> +	if (si->sensor_bus_type != FIMC_BUS_TYPE_MIPI_CSI2) {
>  		cfg &= ~(FLITE_REG_CIGCTRL_SELCAM_MIPI |
>  			 FLITE_REG_CIGCTRL_INVPOLPCLK |
>  			 FLITE_REG_CIGCTRL_INVPOLVSYNC |
> @@ -212,7 +212,7 @@ void flite_hw_set_camera_bus(struct fimc_lite *dev,
> 
>  	writel(cfg, dev->regs + FLITE_REG_CIGCTRL);
> 
> -	flite_hw_set_camera_port(dev, s_info->mux_id);
> +	flite_hw_set_camera_port(dev, si->mux_id);
>  }
> 
>  static void flite_hw_set_out_order(struct fimc_lite *dev, struct flite_frame *f)
> diff --git a/drivers/media/platform/s5p-fimc/fimc-lite-reg.h b/drivers/media/platform/s5p-fimc/fimc-lite-reg.h
> index adb9e9e..0e34584 100644
> --- a/drivers/media/platform/s5p-fimc/fimc-lite-reg.h
> +++ b/drivers/media/platform/s5p-fimc/fimc-lite-reg.h
> @@ -131,9 +131,9 @@ void flite_hw_set_interrupt_mask(struct fimc_lite *dev);
>  void flite_hw_capture_start(struct fimc_lite *dev);
>  void flite_hw_capture_stop(struct fimc_lite *dev);
>  void flite_hw_set_camera_bus(struct fimc_lite *dev,
> -			     struct s5p_fimc_isp_info *s_info);
> +			     struct fimc_source_info *s_info);
>  void flite_hw_set_camera_polarity(struct fimc_lite *dev,
> -				  struct s5p_fimc_isp_info *cam);
> +				  struct fimc_source_info *cam);
>  void flite_hw_set_window_offset(struct fimc_lite *dev, struct flite_frame *f);
>  void flite_hw_set_source_format(struct fimc_lite *dev, struct flite_frame *f);
> 
> diff --git a/drivers/media/platform/s5p-fimc/fimc-mdevice.c b/drivers/media/platform/s5p-fimc/fimc-mdevice.c
> index d940454..f49f6f1 100644
> --- a/drivers/media/platform/s5p-fimc/fimc-mdevice.c
> +++ b/drivers/media/platform/s5p-fimc/fimc-mdevice.c
> @@ -290,7 +290,7 @@ static int fimc_md_register_sensor_entities(struct fimc_md *fmd)
>  	for (i = 0; i < num_clients; i++) {
>  		struct v4l2_subdev *sd;
> 
> -		fmd->sensor[i].pdata = pdata->isp_info[i];
> +		fmd->sensor[i].pdata = pdata->source_info[i];
>  		ret = __fimc_md_set_camclk(fmd, &fmd->sensor[i], true);
>  		if (ret)
>  			break;
> @@ -504,7 +504,7 @@ static int __fimc_md_create_fimc_sink_links(struct fimc_md *fmd,
>  					    struct v4l2_subdev *sensor,
>  					    int pad, int link_mask)
>  {
> -	struct fimc_sensor_info *s_info;
> +	struct fimc_sensor_info *s_info = NULL;
>  	struct media_entity *sink;
>  	unsigned int flags = 0;
>  	int ret, i;
> @@ -614,7 +614,7 @@ static int fimc_md_create_links(struct fimc_md *fmd)
>  {
>  	struct v4l2_subdev *csi_sensors[CSIS_MAX_ENTITIES] = { NULL };
>  	struct v4l2_subdev *sensor, *csis;
> -	struct s5p_fimc_isp_info *pdata;
> +	struct fimc_source_info *pdata;
>  	struct fimc_sensor_info *s_info;
>  	struct media_entity *source, *sink;
>  	int i, pad, fimc_id = 0, ret = 0;
> @@ -632,8 +632,8 @@ static int fimc_md_create_links(struct fimc_md *fmd)
>  		source = NULL;
>  		pdata = &s_info->pdata;
> 
> -		switch (pdata->bus_type) {
> -		case FIMC_MIPI_CSI2:
> +		switch (pdata->sensor_bus_type) {
> +		case FIMC_BUS_TYPE_MIPI_CSI2:
>  			if (WARN(pdata->mux_id >= CSIS_MAX_ENTITIES,
>  				"Wrong CSI channel id: %d\n", pdata->mux_id))
>  				return -EINVAL;
> @@ -659,14 +659,14 @@ static int fimc_md_create_links(struct fimc_md *fmd)
>  			csi_sensors[pdata->mux_id] = sensor;
>  			break;
> 
> -		case FIMC_ITU_601...FIMC_ITU_656:
> +		case FIMC_BUS_TYPE_ITU_601...FIMC_BUS_TYPE_ITU_656:
>  			source = &sensor->entity;
>  			pad = 0;
>  			break;
> 
>  		default:
>  			v4l2_err(&fmd->v4l2_dev, "Wrong bus_type: %x\n",
> -				 pdata->bus_type);
> +				 pdata->sensor_bus_type);
>  			return -EINVAL;
>  		}
>  		if (source == NULL)
> @@ -762,7 +762,7 @@ static int __fimc_md_set_camclk(struct fimc_md *fmd,
>  				struct fimc_sensor_info *s_info,
>  				bool on)
>  {
> -	struct s5p_fimc_isp_info *pdata = &s_info->pdata;
> +	struct fimc_source_info *pdata = &s_info->pdata;
>  	struct fimc_camclk_info *camclk;
>  	int ret = 0;
> 
> diff --git a/drivers/media/platform/s5p-fimc/fimc-mdevice.h b/drivers/media/platform/s5p-fimc/fimc-mdevice.h
> index da7d992..06b0d82 100644
> --- a/drivers/media/platform/s5p-fimc/fimc-mdevice.h
> +++ b/drivers/media/platform/s5p-fimc/fimc-mdevice.h
> @@ -53,7 +53,7 @@ struct fimc_camclk_info {
>   * This data structure applies to image sensor and the writeback subdevs.
>   */
>  struct fimc_sensor_info {
> -	struct s5p_fimc_isp_info pdata;
> +	struct fimc_source_info pdata;
>  	struct v4l2_subdev *subdev;
>  	struct fimc_dev *host;
>  };
> diff --git a/drivers/media/platform/s5p-fimc/fimc-reg.c b/drivers/media/platform/s5p-fimc/fimc-reg.c
> index c05d044..50b97c7 100644
> --- a/drivers/media/platform/s5p-fimc/fimc-reg.c
> +++ b/drivers/media/platform/s5p-fimc/fimc-reg.c
> @@ -554,7 +554,7 @@ void fimc_hw_set_output_addr(struct fimc_dev *dev,
>  }
> 
>  int fimc_hw_set_camera_polarity(struct fimc_dev *fimc,
> -				struct s5p_fimc_isp_info *cam)
> +				struct fimc_source_info *cam)
>  {
>  	u32 cfg = readl(fimc->regs + FIMC_REG_CIGCTRL);
> 
> @@ -596,14 +596,15 @@ static const struct mbus_pixfmt_desc pix_desc[] = {
>  };
> 
>  int fimc_hw_set_camera_source(struct fimc_dev *fimc,
> -			      struct s5p_fimc_isp_info *cam)
> +			      struct fimc_source_info *source)
>  {
>  	struct fimc_frame *f = &fimc->vid_cap.ctx->s_frame;
> -	u32 cfg = 0;
> -	u32 bus_width;
> +	u32 bus_width, cfg = 0;
>  	int i;
> 
> -	if (cam->bus_type == FIMC_ITU_601 || cam->bus_type == FIMC_ITU_656) {
> +	switch (source->fimc_bus_type) {
> +	case FIMC_BUS_TYPE_ITU_601:
> +	case FIMC_BUS_TYPE_ITU_656:
>  		for (i = 0; i < ARRAY_SIZE(pix_desc); i++) {
>  			if (fimc->vid_cap.mf.code == pix_desc[i].pixelcode) {
>  				cfg = pix_desc[i].cisrcfmt;
> @@ -619,15 +620,17 @@ int fimc_hw_set_camera_source(struct fimc_dev *fimc,
>  			return -EINVAL;
>  		}
> 
> -		if (cam->bus_type == FIMC_ITU_601) {
> +		if (source->fimc_bus_type == FIMC_BUS_TYPE_ITU_601) {
>  			if (bus_width == 8)
>  				cfg |= FIMC_REG_CISRCFMT_ITU601_8BIT;
>  			else if (bus_width == 16)
>  				cfg |= FIMC_REG_CISRCFMT_ITU601_16BIT;
>  		} /* else defaults to ITU-R BT.656 8-bit */
> -	} else if (cam->bus_type == FIMC_MIPI_CSI2) {
> +		break;
> +	case FIMC_BUS_TYPE_MIPI_CSI2:
>  		if (fimc_fmt_is_user_defined(f->fmt->color))
>  			cfg |= FIMC_REG_CISRCFMT_ITU601_8BIT;
> +		break;
>  	}
> 
>  	cfg |= (f->o_width << 16) | f->o_height;
> @@ -655,7 +658,7 @@ void fimc_hw_set_camera_offset(struct fimc_dev *fimc, struct fimc_frame *f)
>  }
> 
>  int fimc_hw_set_camera_type(struct fimc_dev *fimc,
> -			    struct s5p_fimc_isp_info *cam)
> +			    struct fimc_source_info *source)
>  {
>  	u32 cfg, tmp;
>  	struct fimc_vid_cap *vid_cap = &fimc->vid_cap;
> @@ -668,11 +671,11 @@ int fimc_hw_set_camera_type(struct fimc_dev *fimc,
>  		FIMC_REG_CIGCTRL_SELCAM_MIPI | FIMC_REG_CIGCTRL_CAMIF_SELWB |
>  		FIMC_REG_CIGCTRL_SELCAM_MIPI_A | FIMC_REG_CIGCTRL_CAM_JPEG);
> 
> -	switch (cam->bus_type) {
> -	case FIMC_MIPI_CSI2:
> +	switch (source->fimc_bus_type) {
> +	case FIMC_BUS_TYPE_MIPI_CSI2:
>  		cfg |= FIMC_REG_CIGCTRL_SELCAM_MIPI;
> 
> -		if (cam->mux_id == 0)
> +		if (source->mux_id == 0)
>  			cfg |= FIMC_REG_CIGCTRL_SELCAM_MIPI_A;
> 
>  		/* TODO: add remaining supported formats. */
> @@ -695,15 +698,16 @@ int fimc_hw_set_camera_type(struct fimc_dev *fimc,
> 
>  		writel(tmp, fimc->regs + FIMC_REG_CSIIMGFMT);
>  		break;
> -	case FIMC_ITU_601...FIMC_ITU_656:
> -		if (cam->mux_id == 0) /* ITU-A, ITU-B: 0, 1 */
> +	case FIMC_BUS_TYPE_ITU_601...FIMC_BUS_TYPE_ITU_656:
> +		if (source->mux_id == 0) /* ITU-A, ITU-B: 0, 1 */
>  			cfg |= FIMC_REG_CIGCTRL_SELCAM_ITU_A;
>  		break;
> -	case FIMC_LCD_WB:
> +	case FIMC_BUS_TYPE_LCD_WRITEBACK_A:
>  		cfg |= FIMC_REG_CIGCTRL_CAMIF_SELWB;
>  		break;
>  	default:
> -		v4l2_err(&vid_cap->vfd, "Invalid camera bus type selected\n");
> +		v4l2_err(&vid_cap->vfd, "Invalid FIMC bus type selected: %d\n",
> +			 source->fimc_bus_type);
>  		return -EINVAL;
>  	}
>  	writel(cfg, fimc->regs + FIMC_REG_CIGCTRL);
> diff --git a/drivers/media/platform/s5p-fimc/fimc-reg.h b/drivers/media/platform/s5p-fimc/fimc-reg.h
> index f3e0b78..1a40df6 100644
> --- a/drivers/media/platform/s5p-fimc/fimc-reg.h
> +++ b/drivers/media/platform/s5p-fimc/fimc-reg.h
> @@ -297,12 +297,12 @@ void fimc_hw_set_input_addr(struct fimc_dev *fimc, struct fimc_addr *paddr);
>  void fimc_hw_set_output_addr(struct fimc_dev *fimc, struct fimc_addr *paddr,
>  			     int index);
>  int fimc_hw_set_camera_source(struct fimc_dev *fimc,
> -			      struct s5p_fimc_isp_info *cam);
> +			      struct fimc_source_info *cam);
>  void fimc_hw_set_camera_offset(struct fimc_dev *fimc, struct fimc_frame *f);
>  int fimc_hw_set_camera_polarity(struct fimc_dev *fimc,
> -				struct s5p_fimc_isp_info *cam);
> +				struct fimc_source_info *cam);
>  int fimc_hw_set_camera_type(struct fimc_dev *fimc,
> -			    struct s5p_fimc_isp_info *cam);
> +			    struct fimc_source_info *cam);
>  void fimc_hw_clear_irq(struct fimc_dev *dev);
>  void fimc_hw_enable_scaler(struct fimc_dev *dev, bool on);
>  void fimc_hw_activate_input_dma(struct fimc_dev *dev, bool on);
> diff --git a/include/media/s5p_fimc.h b/include/media/s5p_fimc.h
> index eaea62a..28f3590 100644
> --- a/include/media/s5p_fimc.h
> +++ b/include/media/s5p_fimc.h
> @@ -1,8 +1,8 @@
>  /*
> - * Samsung S5P SoC camera interface driver header
> + * Samsung S5P/Exynos4 SoC series camera interface driver header
>   *
> - * Copyright (c) 2010 Samsung Electronics Co., Ltd
> - * Author: Sylwester Nawrocki, <s.nawrocki@samsung.com>
> + * Copyright (C) 2010 - 2013 Samsung Electronics Co., Ltd.
> + * Sylwester Nawrocki <s.nawrocki@samsung.com>
>   *
>   * This program is free software; you can redistribute it and/or modify
>   * it under the terms of the GNU General Public License version 2 as
> @@ -14,45 +14,58 @@
> 
>  #include <media/media-entity.h>
> 
> -enum cam_bus_type {
> -	FIMC_ITU_601 = 1,
> -	FIMC_ITU_656,
> -	FIMC_MIPI_CSI2,
> -	FIMC_LCD_WB, /* FIFO link from LCD mixer */
> +/*
> + * Enumeration of the FIMC data bus types.
> + */
> +enum fimc_bus_type {
> +	/* Camera parallel bus */
> +	FIMC_BUS_TYPE_ITU_601 = 1,
> +	/* Camera parallel bus with embedded synchronization */
> +	FIMC_BUS_TYPE_ITU_656,
> +	/* Camera MIPI-CSI2 serial bus */
> +	FIMC_BUS_TYPE_MIPI_CSI2,
> +	/* FIFO link from LCD controller (WriteBack A) */
> +	FIMC_BUS_TYPE_LCD_WRITEBACK_A,
> +	/* FIFO link from LCD controller (WriteBack B) */
> +	FIMC_BUS_TYPE_LCD_WRITEBACK_B,
> +	/* FIFO link from FIMC-IS */
> +	FIMC_BUS_TYPE_ISP_WRITEBACK = FIMC_BUS_TYPE_LCD_WRITEBACK_B,
>  };
> 
>  struct i2c_board_info;
> 
>  /**
> - * struct s5p_fimc_isp_info - image sensor information required for host
> - *			      interace configuration.
> + * struct fimc_source_info - video source description required for the host
> + *			     interface configuration
>   *
>   * @board_info: pointer to I2C subdevice's board info
>   * @clk_frequency: frequency of the clock the host interface provides to sensor
> - * @bus_type: determines bus type, MIPI, ITU-R BT.601 etc.
> + * @fimc_bus_type: FIMC camera input type
> + * @sensor_bus_type: image sensor bus type, MIPI, ITU-R BT.601 etc.
> + * @flags: the parallel sensor bus flags defining signals polarity (V4L2_MBUS_*)
>   * @i2c_bus_num: i2c control bus id the sensor is attached to
>   * @mux_id: FIMC camera interface multiplexer index (separate for MIPI and ITU)
>   * @clk_id: index of the SoC peripheral clock for sensors
> - * @flags: the parallel bus flags defining signals polarity (V4L2_MBUS_*)
>   */
> -struct s5p_fimc_isp_info {
> +struct fimc_source_info {
>  	struct i2c_board_info *board_info;
>  	unsigned long clk_frequency;
> -	enum cam_bus_type bus_type;
> +	enum fimc_bus_type fimc_bus_type;
> +	enum fimc_bus_type sensor_bus_type;
> +	u16 flags;
>  	u16 i2c_bus_num;
>  	u16 mux_id;
> -	u16 flags;
>  	u8 clk_id;
>  };
> 
>  /**
>   * struct s5p_platform_fimc - camera host interface platform data
>   *
> - * @isp_info: properties of camera sensor required for host interface setup
> - * @num_clients: the number of attached image sensors
> + * @source_info: properties of an image source for the host interface setup
> + * @num_clients: the number of attached image sources
>   */
>  struct s5p_platform_fimc {
> -	struct s5p_fimc_isp_info *isp_info;
> +	struct fimc_source_info *source_info;
>  	int num_clients;
>  };
> 
> --
> 1.7.9.5

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH 5/5] s5p-fimc: Redefine platform data structure for fimc-is
@ 2013-02-01 11:05     ` Sylwester Nawrocki
  0 siblings, 0 replies; 10+ messages in thread
From: Sylwester Nawrocki @ 2013-02-01 11:05 UTC (permalink / raw)
  To: linux-arm-kernel

On 01/30/2013 06:23 PM, Sylwester Nawrocki wrote:
> Newer Exynos4 SoC are equipped with a local camera ISP that
> controls external raw image sensor directly. Such sensors
> can be connected through FIMC-LITEn (and MIPI-CSISn) IPs to
> the ISP, which then feeds image data to the FIMCn IP. Thus
> there can be two busses associated with an image source
> (sensor). Rename struct s5p_fimc_isp_info describing external
> image sensor (video decoder) to struct fimc_source_info to
> avoid confusion. bus_type is split into fimc_bus_type and
> sensor_bus_type. The bus type enumeration is extended to
> include both FIMC Writeback input types.
> 
> The bus_type enumeration and the data structure name in the
> board files are modified according to the above changes.
> 
> Cc: Kukjin Kim <kgene.kim@samsung.com>
> Cc: linux-samsung-soc at vger.kernel.org
> Signed-off-by: Sylwester Nawrocki <s.nawrocki@samsung.com>
> Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>

Kukjin, can I please have your ack on this patch so it can be
merged through the media tree ?

--

Thanks,
Sylwester
> ---
>  arch/arm/mach-exynos/mach-nuri.c                |    8 ++--
>  arch/arm/mach-exynos/mach-universal_c210.c      |    8 ++--
>  arch/arm/mach-s5pv210/mach-goni.c               |    6 +--
>  drivers/media/platform/s5p-fimc/fimc-lite-reg.c |    8 ++--
>  drivers/media/platform/s5p-fimc/fimc-lite-reg.h |    4 +-
>  drivers/media/platform/s5p-fimc/fimc-mdevice.c  |   16 ++++----
>  drivers/media/platform/s5p-fimc/fimc-mdevice.h  |    2 +-
>  drivers/media/platform/s5p-fimc/fimc-reg.c      |   34 +++++++++-------
>  drivers/media/platform/s5p-fimc/fimc-reg.h      |    6 +--
>  include/media/s5p_fimc.h                        |   49 ++++++++++++++---------
>  10 files changed, 79 insertions(+), 62 deletions(-)
> 
> diff --git a/arch/arm/mach-exynos/mach-nuri.c b/arch/arm/mach-exynos/mach-nuri.c
> index 27d4ed8..7c2600e 100644
> --- a/arch/arm/mach-exynos/mach-nuri.c
> +++ b/arch/arm/mach-exynos/mach-nuri.c
> @@ -1209,25 +1209,25 @@ static struct i2c_board_info m5mols_board_info = {
>  	.platform_data	= &m5mols_platdata,
>  };
> 
> -static struct s5p_fimc_isp_info nuri_camera_sensors[] = {
> +static struct fimc_source_info nuri_camera_sensors[] = {
>  	{
>  		.flags		= V4L2_MBUS_PCLK_SAMPLE_RISING |
>  				  V4L2_MBUS_VSYNC_ACTIVE_LOW,
> -		.bus_type	= FIMC_ITU_601,
> +		.fimc_bus_type	= FIMC_BUS_TYPE_ITU_601,
>  		.board_info	= &s5k6aa_board_info,
>  		.clk_frequency	= 24000000UL,
>  		.i2c_bus_num	= 6,
>  	}, {
>  		.flags		= V4L2_MBUS_PCLK_SAMPLE_FALLING |
>  				  V4L2_MBUS_VSYNC_ACTIVE_LOW,
> -		.bus_type	= FIMC_MIPI_CSI2,
> +		.fimc_bus_type	= FIMC_BUS_TYPE_MIPI_CSI2,
>  		.board_info	= &m5mols_board_info,
>  		.clk_frequency	= 24000000UL,
>  	},
>  };
> 
>  static struct s5p_platform_fimc fimc_md_platdata = {
> -	.isp_info	= nuri_camera_sensors,
> +	.source_info	= nuri_camera_sensors,
>  	.num_clients	= ARRAY_SIZE(nuri_camera_sensors),
>  };
> 
> diff --git a/arch/arm/mach-exynos/mach-universal_c210.c b/arch/arm/mach-exynos/mach-universal_c210.c
> index 9e3340f..c09290a 100644
> --- a/arch/arm/mach-exynos/mach-universal_c210.c
> +++ b/arch/arm/mach-exynos/mach-universal_c210.c
> @@ -988,12 +988,12 @@ static struct i2c_board_info m5mols_board_info = {
>  	.platform_data = &m5mols_platdata,
>  };
> 
> -static struct s5p_fimc_isp_info universal_camera_sensors[] = {
> +static struct fimc_source_info universal_camera_sensors[] = {
>  	{
>  		.mux_id		= 0,
>  		.flags		= V4L2_MBUS_PCLK_SAMPLE_FALLING |
>  				  V4L2_MBUS_VSYNC_ACTIVE_LOW,
> -		.bus_type	= FIMC_ITU_601,
> +		.fimc_bus_type	= FIMC_BUS_TYPE_ITU_601,
>  		.board_info	= &s5k6aa_board_info,
>  		.i2c_bus_num	= 0,
>  		.clk_frequency	= 24000000UL,
> @@ -1001,7 +1001,7 @@ static struct s5p_fimc_isp_info universal_camera_sensors[] = {
>  		.mux_id		= 0,
>  		.flags		= V4L2_MBUS_PCLK_SAMPLE_FALLING |
>  				  V4L2_MBUS_VSYNC_ACTIVE_LOW,
> -		.bus_type	= FIMC_MIPI_CSI2,
> +		.fimc_bus_type	= FIMC_BUS_TYPE_MIPI_CSI2,
>  		.board_info	= &m5mols_board_info,
>  		.i2c_bus_num	= 0,
>  		.clk_frequency	= 24000000UL,
> @@ -1009,7 +1009,7 @@ static struct s5p_fimc_isp_info universal_camera_sensors[] = {
>  };
> 
>  static struct s5p_platform_fimc fimc_md_platdata = {
> -	.isp_info	= universal_camera_sensors,
> +	.source_info	= universal_camera_sensors,
>  	.num_clients	= ARRAY_SIZE(universal_camera_sensors),
>  };
> 
> diff --git a/arch/arm/mach-s5pv210/mach-goni.c b/arch/arm/mach-s5pv210/mach-goni.c
> index c72b310..423f6b6 100644
> --- a/arch/arm/mach-s5pv210/mach-goni.c
> +++ b/arch/arm/mach-s5pv210/mach-goni.c
> @@ -841,12 +841,12 @@ static struct i2c_board_info noon010pc30_board_info = {
>  	.platform_data = &noon010pc30_pldata,
>  };
> 
> -static struct s5p_fimc_isp_info goni_camera_sensors[] = {
> +static struct fimc_source_info goni_camera_sensors[] = {
>  	{
>  		.mux_id		= 0,
>  		.flags		= V4L2_MBUS_PCLK_SAMPLE_FALLING |
>  				  V4L2_MBUS_VSYNC_ACTIVE_LOW,
> -		.bus_type	= FIMC_ITU_601,
> +		.bus_type	= FIMC_BUS_TYPE_ITU_601,
>  		.board_info	= &noon010pc30_board_info,
>  		.i2c_bus_num	= 0,
>  		.clk_frequency	= 16000000UL,
> @@ -854,7 +854,7 @@ static struct s5p_fimc_isp_info goni_camera_sensors[] = {
>  };
> 
>  static struct s5p_platform_fimc goni_fimc_md_platdata __initdata = {
> -	.isp_info	= goni_camera_sensors,
> +	.source_info	= goni_camera_sensors,
>  	.num_clients	= ARRAY_SIZE(goni_camera_sensors),
>  };
> 
> diff --git a/drivers/media/platform/s5p-fimc/fimc-lite-reg.c b/drivers/media/platform/s5p-fimc/fimc-lite-reg.c
> index 962652d..f0af075 100644
> --- a/drivers/media/platform/s5p-fimc/fimc-lite-reg.c
> +++ b/drivers/media/platform/s5p-fimc/fimc-lite-reg.c
> @@ -187,12 +187,12 @@ static void flite_hw_set_camera_port(struct fimc_lite *dev, int id)
> 
>  /* Select serial or parallel bus, camera port (A,B) and set signals polarity */
>  void flite_hw_set_camera_bus(struct fimc_lite *dev,
> -			     struct s5p_fimc_isp_info *s_info)
> +			     struct fimc_source_info *si)
>  {
>  	u32 cfg = readl(dev->regs + FLITE_REG_CIGCTRL);
> -	unsigned int flags = s_info->flags;
> +	unsigned int flags = si->flags;
> 
> -	if (s_info->bus_type != FIMC_MIPI_CSI2) {
> +	if (si->sensor_bus_type != FIMC_BUS_TYPE_MIPI_CSI2) {
>  		cfg &= ~(FLITE_REG_CIGCTRL_SELCAM_MIPI |
>  			 FLITE_REG_CIGCTRL_INVPOLPCLK |
>  			 FLITE_REG_CIGCTRL_INVPOLVSYNC |
> @@ -212,7 +212,7 @@ void flite_hw_set_camera_bus(struct fimc_lite *dev,
> 
>  	writel(cfg, dev->regs + FLITE_REG_CIGCTRL);
> 
> -	flite_hw_set_camera_port(dev, s_info->mux_id);
> +	flite_hw_set_camera_port(dev, si->mux_id);
>  }
> 
>  static void flite_hw_set_out_order(struct fimc_lite *dev, struct flite_frame *f)
> diff --git a/drivers/media/platform/s5p-fimc/fimc-lite-reg.h b/drivers/media/platform/s5p-fimc/fimc-lite-reg.h
> index adb9e9e..0e34584 100644
> --- a/drivers/media/platform/s5p-fimc/fimc-lite-reg.h
> +++ b/drivers/media/platform/s5p-fimc/fimc-lite-reg.h
> @@ -131,9 +131,9 @@ void flite_hw_set_interrupt_mask(struct fimc_lite *dev);
>  void flite_hw_capture_start(struct fimc_lite *dev);
>  void flite_hw_capture_stop(struct fimc_lite *dev);
>  void flite_hw_set_camera_bus(struct fimc_lite *dev,
> -			     struct s5p_fimc_isp_info *s_info);
> +			     struct fimc_source_info *s_info);
>  void flite_hw_set_camera_polarity(struct fimc_lite *dev,
> -				  struct s5p_fimc_isp_info *cam);
> +				  struct fimc_source_info *cam);
>  void flite_hw_set_window_offset(struct fimc_lite *dev, struct flite_frame *f);
>  void flite_hw_set_source_format(struct fimc_lite *dev, struct flite_frame *f);
> 
> diff --git a/drivers/media/platform/s5p-fimc/fimc-mdevice.c b/drivers/media/platform/s5p-fimc/fimc-mdevice.c
> index d940454..f49f6f1 100644
> --- a/drivers/media/platform/s5p-fimc/fimc-mdevice.c
> +++ b/drivers/media/platform/s5p-fimc/fimc-mdevice.c
> @@ -290,7 +290,7 @@ static int fimc_md_register_sensor_entities(struct fimc_md *fmd)
>  	for (i = 0; i < num_clients; i++) {
>  		struct v4l2_subdev *sd;
> 
> -		fmd->sensor[i].pdata = pdata->isp_info[i];
> +		fmd->sensor[i].pdata = pdata->source_info[i];
>  		ret = __fimc_md_set_camclk(fmd, &fmd->sensor[i], true);
>  		if (ret)
>  			break;
> @@ -504,7 +504,7 @@ static int __fimc_md_create_fimc_sink_links(struct fimc_md *fmd,
>  					    struct v4l2_subdev *sensor,
>  					    int pad, int link_mask)
>  {
> -	struct fimc_sensor_info *s_info;
> +	struct fimc_sensor_info *s_info = NULL;
>  	struct media_entity *sink;
>  	unsigned int flags = 0;
>  	int ret, i;
> @@ -614,7 +614,7 @@ static int fimc_md_create_links(struct fimc_md *fmd)
>  {
>  	struct v4l2_subdev *csi_sensors[CSIS_MAX_ENTITIES] = { NULL };
>  	struct v4l2_subdev *sensor, *csis;
> -	struct s5p_fimc_isp_info *pdata;
> +	struct fimc_source_info *pdata;
>  	struct fimc_sensor_info *s_info;
>  	struct media_entity *source, *sink;
>  	int i, pad, fimc_id = 0, ret = 0;
> @@ -632,8 +632,8 @@ static int fimc_md_create_links(struct fimc_md *fmd)
>  		source = NULL;
>  		pdata = &s_info->pdata;
> 
> -		switch (pdata->bus_type) {
> -		case FIMC_MIPI_CSI2:
> +		switch (pdata->sensor_bus_type) {
> +		case FIMC_BUS_TYPE_MIPI_CSI2:
>  			if (WARN(pdata->mux_id >= CSIS_MAX_ENTITIES,
>  				"Wrong CSI channel id: %d\n", pdata->mux_id))
>  				return -EINVAL;
> @@ -659,14 +659,14 @@ static int fimc_md_create_links(struct fimc_md *fmd)
>  			csi_sensors[pdata->mux_id] = sensor;
>  			break;
> 
> -		case FIMC_ITU_601...FIMC_ITU_656:
> +		case FIMC_BUS_TYPE_ITU_601...FIMC_BUS_TYPE_ITU_656:
>  			source = &sensor->entity;
>  			pad = 0;
>  			break;
> 
>  		default:
>  			v4l2_err(&fmd->v4l2_dev, "Wrong bus_type: %x\n",
> -				 pdata->bus_type);
> +				 pdata->sensor_bus_type);
>  			return -EINVAL;
>  		}
>  		if (source == NULL)
> @@ -762,7 +762,7 @@ static int __fimc_md_set_camclk(struct fimc_md *fmd,
>  				struct fimc_sensor_info *s_info,
>  				bool on)
>  {
> -	struct s5p_fimc_isp_info *pdata = &s_info->pdata;
> +	struct fimc_source_info *pdata = &s_info->pdata;
>  	struct fimc_camclk_info *camclk;
>  	int ret = 0;
> 
> diff --git a/drivers/media/platform/s5p-fimc/fimc-mdevice.h b/drivers/media/platform/s5p-fimc/fimc-mdevice.h
> index da7d992..06b0d82 100644
> --- a/drivers/media/platform/s5p-fimc/fimc-mdevice.h
> +++ b/drivers/media/platform/s5p-fimc/fimc-mdevice.h
> @@ -53,7 +53,7 @@ struct fimc_camclk_info {
>   * This data structure applies to image sensor and the writeback subdevs.
>   */
>  struct fimc_sensor_info {
> -	struct s5p_fimc_isp_info pdata;
> +	struct fimc_source_info pdata;
>  	struct v4l2_subdev *subdev;
>  	struct fimc_dev *host;
>  };
> diff --git a/drivers/media/platform/s5p-fimc/fimc-reg.c b/drivers/media/platform/s5p-fimc/fimc-reg.c
> index c05d044..50b97c7 100644
> --- a/drivers/media/platform/s5p-fimc/fimc-reg.c
> +++ b/drivers/media/platform/s5p-fimc/fimc-reg.c
> @@ -554,7 +554,7 @@ void fimc_hw_set_output_addr(struct fimc_dev *dev,
>  }
> 
>  int fimc_hw_set_camera_polarity(struct fimc_dev *fimc,
> -				struct s5p_fimc_isp_info *cam)
> +				struct fimc_source_info *cam)
>  {
>  	u32 cfg = readl(fimc->regs + FIMC_REG_CIGCTRL);
> 
> @@ -596,14 +596,15 @@ static const struct mbus_pixfmt_desc pix_desc[] = {
>  };
> 
>  int fimc_hw_set_camera_source(struct fimc_dev *fimc,
> -			      struct s5p_fimc_isp_info *cam)
> +			      struct fimc_source_info *source)
>  {
>  	struct fimc_frame *f = &fimc->vid_cap.ctx->s_frame;
> -	u32 cfg = 0;
> -	u32 bus_width;
> +	u32 bus_width, cfg = 0;
>  	int i;
> 
> -	if (cam->bus_type == FIMC_ITU_601 || cam->bus_type == FIMC_ITU_656) {
> +	switch (source->fimc_bus_type) {
> +	case FIMC_BUS_TYPE_ITU_601:
> +	case FIMC_BUS_TYPE_ITU_656:
>  		for (i = 0; i < ARRAY_SIZE(pix_desc); i++) {
>  			if (fimc->vid_cap.mf.code == pix_desc[i].pixelcode) {
>  				cfg = pix_desc[i].cisrcfmt;
> @@ -619,15 +620,17 @@ int fimc_hw_set_camera_source(struct fimc_dev *fimc,
>  			return -EINVAL;
>  		}
> 
> -		if (cam->bus_type == FIMC_ITU_601) {
> +		if (source->fimc_bus_type == FIMC_BUS_TYPE_ITU_601) {
>  			if (bus_width == 8)
>  				cfg |= FIMC_REG_CISRCFMT_ITU601_8BIT;
>  			else if (bus_width == 16)
>  				cfg |= FIMC_REG_CISRCFMT_ITU601_16BIT;
>  		} /* else defaults to ITU-R BT.656 8-bit */
> -	} else if (cam->bus_type == FIMC_MIPI_CSI2) {
> +		break;
> +	case FIMC_BUS_TYPE_MIPI_CSI2:
>  		if (fimc_fmt_is_user_defined(f->fmt->color))
>  			cfg |= FIMC_REG_CISRCFMT_ITU601_8BIT;
> +		break;
>  	}
> 
>  	cfg |= (f->o_width << 16) | f->o_height;
> @@ -655,7 +658,7 @@ void fimc_hw_set_camera_offset(struct fimc_dev *fimc, struct fimc_frame *f)
>  }
> 
>  int fimc_hw_set_camera_type(struct fimc_dev *fimc,
> -			    struct s5p_fimc_isp_info *cam)
> +			    struct fimc_source_info *source)
>  {
>  	u32 cfg, tmp;
>  	struct fimc_vid_cap *vid_cap = &fimc->vid_cap;
> @@ -668,11 +671,11 @@ int fimc_hw_set_camera_type(struct fimc_dev *fimc,
>  		FIMC_REG_CIGCTRL_SELCAM_MIPI | FIMC_REG_CIGCTRL_CAMIF_SELWB |
>  		FIMC_REG_CIGCTRL_SELCAM_MIPI_A | FIMC_REG_CIGCTRL_CAM_JPEG);
> 
> -	switch (cam->bus_type) {
> -	case FIMC_MIPI_CSI2:
> +	switch (source->fimc_bus_type) {
> +	case FIMC_BUS_TYPE_MIPI_CSI2:
>  		cfg |= FIMC_REG_CIGCTRL_SELCAM_MIPI;
> 
> -		if (cam->mux_id == 0)
> +		if (source->mux_id == 0)
>  			cfg |= FIMC_REG_CIGCTRL_SELCAM_MIPI_A;
> 
>  		/* TODO: add remaining supported formats. */
> @@ -695,15 +698,16 @@ int fimc_hw_set_camera_type(struct fimc_dev *fimc,
> 
>  		writel(tmp, fimc->regs + FIMC_REG_CSIIMGFMT);
>  		break;
> -	case FIMC_ITU_601...FIMC_ITU_656:
> -		if (cam->mux_id == 0) /* ITU-A, ITU-B: 0, 1 */
> +	case FIMC_BUS_TYPE_ITU_601...FIMC_BUS_TYPE_ITU_656:
> +		if (source->mux_id == 0) /* ITU-A, ITU-B: 0, 1 */
>  			cfg |= FIMC_REG_CIGCTRL_SELCAM_ITU_A;
>  		break;
> -	case FIMC_LCD_WB:
> +	case FIMC_BUS_TYPE_LCD_WRITEBACK_A:
>  		cfg |= FIMC_REG_CIGCTRL_CAMIF_SELWB;
>  		break;
>  	default:
> -		v4l2_err(&vid_cap->vfd, "Invalid camera bus type selected\n");
> +		v4l2_err(&vid_cap->vfd, "Invalid FIMC bus type selected: %d\n",
> +			 source->fimc_bus_type);
>  		return -EINVAL;
>  	}
>  	writel(cfg, fimc->regs + FIMC_REG_CIGCTRL);
> diff --git a/drivers/media/platform/s5p-fimc/fimc-reg.h b/drivers/media/platform/s5p-fimc/fimc-reg.h
> index f3e0b78..1a40df6 100644
> --- a/drivers/media/platform/s5p-fimc/fimc-reg.h
> +++ b/drivers/media/platform/s5p-fimc/fimc-reg.h
> @@ -297,12 +297,12 @@ void fimc_hw_set_input_addr(struct fimc_dev *fimc, struct fimc_addr *paddr);
>  void fimc_hw_set_output_addr(struct fimc_dev *fimc, struct fimc_addr *paddr,
>  			     int index);
>  int fimc_hw_set_camera_source(struct fimc_dev *fimc,
> -			      struct s5p_fimc_isp_info *cam);
> +			      struct fimc_source_info *cam);
>  void fimc_hw_set_camera_offset(struct fimc_dev *fimc, struct fimc_frame *f);
>  int fimc_hw_set_camera_polarity(struct fimc_dev *fimc,
> -				struct s5p_fimc_isp_info *cam);
> +				struct fimc_source_info *cam);
>  int fimc_hw_set_camera_type(struct fimc_dev *fimc,
> -			    struct s5p_fimc_isp_info *cam);
> +			    struct fimc_source_info *cam);
>  void fimc_hw_clear_irq(struct fimc_dev *dev);
>  void fimc_hw_enable_scaler(struct fimc_dev *dev, bool on);
>  void fimc_hw_activate_input_dma(struct fimc_dev *dev, bool on);
> diff --git a/include/media/s5p_fimc.h b/include/media/s5p_fimc.h
> index eaea62a..28f3590 100644
> --- a/include/media/s5p_fimc.h
> +++ b/include/media/s5p_fimc.h
> @@ -1,8 +1,8 @@
>  /*
> - * Samsung S5P SoC camera interface driver header
> + * Samsung S5P/Exynos4 SoC series camera interface driver header
>   *
> - * Copyright (c) 2010 Samsung Electronics Co., Ltd
> - * Author: Sylwester Nawrocki, <s.nawrocki@samsung.com>
> + * Copyright (C) 2010 - 2013 Samsung Electronics Co., Ltd.
> + * Sylwester Nawrocki <s.nawrocki@samsung.com>
>   *
>   * This program is free software; you can redistribute it and/or modify
>   * it under the terms of the GNU General Public License version 2 as
> @@ -14,45 +14,58 @@
> 
>  #include <media/media-entity.h>
> 
> -enum cam_bus_type {
> -	FIMC_ITU_601 = 1,
> -	FIMC_ITU_656,
> -	FIMC_MIPI_CSI2,
> -	FIMC_LCD_WB, /* FIFO link from LCD mixer */
> +/*
> + * Enumeration of the FIMC data bus types.
> + */
> +enum fimc_bus_type {
> +	/* Camera parallel bus */
> +	FIMC_BUS_TYPE_ITU_601 = 1,
> +	/* Camera parallel bus with embedded synchronization */
> +	FIMC_BUS_TYPE_ITU_656,
> +	/* Camera MIPI-CSI2 serial bus */
> +	FIMC_BUS_TYPE_MIPI_CSI2,
> +	/* FIFO link from LCD controller (WriteBack A) */
> +	FIMC_BUS_TYPE_LCD_WRITEBACK_A,
> +	/* FIFO link from LCD controller (WriteBack B) */
> +	FIMC_BUS_TYPE_LCD_WRITEBACK_B,
> +	/* FIFO link from FIMC-IS */
> +	FIMC_BUS_TYPE_ISP_WRITEBACK = FIMC_BUS_TYPE_LCD_WRITEBACK_B,
>  };
> 
>  struct i2c_board_info;
> 
>  /**
> - * struct s5p_fimc_isp_info - image sensor information required for host
> - *			      interace configuration.
> + * struct fimc_source_info - video source description required for the host
> + *			     interface configuration
>   *
>   * @board_info: pointer to I2C subdevice's board info
>   * @clk_frequency: frequency of the clock the host interface provides to sensor
> - * @bus_type: determines bus type, MIPI, ITU-R BT.601 etc.
> + * @fimc_bus_type: FIMC camera input type
> + * @sensor_bus_type: image sensor bus type, MIPI, ITU-R BT.601 etc.
> + * @flags: the parallel sensor bus flags defining signals polarity (V4L2_MBUS_*)
>   * @i2c_bus_num: i2c control bus id the sensor is attached to
>   * @mux_id: FIMC camera interface multiplexer index (separate for MIPI and ITU)
>   * @clk_id: index of the SoC peripheral clock for sensors
> - * @flags: the parallel bus flags defining signals polarity (V4L2_MBUS_*)
>   */
> -struct s5p_fimc_isp_info {
> +struct fimc_source_info {
>  	struct i2c_board_info *board_info;
>  	unsigned long clk_frequency;
> -	enum cam_bus_type bus_type;
> +	enum fimc_bus_type fimc_bus_type;
> +	enum fimc_bus_type sensor_bus_type;
> +	u16 flags;
>  	u16 i2c_bus_num;
>  	u16 mux_id;
> -	u16 flags;
>  	u8 clk_id;
>  };
> 
>  /**
>   * struct s5p_platform_fimc - camera host interface platform data
>   *
> - * @isp_info: properties of camera sensor required for host interface setup
> - * @num_clients: the number of attached image sensors
> + * @source_info: properties of an image source for the host interface setup
> + * @num_clients: the number of attached image sources
>   */
>  struct s5p_platform_fimc {
> -	struct s5p_fimc_isp_info *isp_info;
> +	struct fimc_source_info *source_info;
>  	int num_clients;
>  };
> 
> --
> 1.7.9.5

^ permalink raw reply	[flat|nested] 10+ messages in thread

* RE: [PATCH 5/5] s5p-fimc: Redefine platform data structure for fimc-is
  2013-02-01 11:05     ` Sylwester Nawrocki
@ 2013-02-01 17:36       ` Kukjin Kim
  -1 siblings, 0 replies; 10+ messages in thread
From: Kukjin Kim @ 2013-02-01 17:36 UTC (permalink / raw)
  To: 'Sylwester Nawrocki'
  Cc: linux-media, kyungmin.park, sw0312.kim, linux-samsung-soc,
	'linux-arm-kernel'

Sylwester Nawrocki wrote:
> 
> On 01/30/2013 06:23 PM, Sylwester Nawrocki wrote:
> > Newer Exynos4 SoC are equipped with a local camera ISP that
> > controls external raw image sensor directly. Such sensors
> > can be connected through FIMC-LITEn (and MIPI-CSISn) IPs to
> > the ISP, which then feeds image data to the FIMCn IP. Thus
> > there can be two busses associated with an image source
> > (sensor). Rename struct s5p_fimc_isp_info describing external
> > image sensor (video decoder) to struct fimc_source_info to
> > avoid confusion. bus_type is split into fimc_bus_type and
> > sensor_bus_type. The bus type enumeration is extended to
> > include both FIMC Writeback input types.
> >
> > The bus_type enumeration and the data structure name in the
> > board files are modified according to the above changes.
> >
> > Cc: Kukjin Kim <kgene.kim@samsung.com>
> > Cc: linux-samsung-soc@vger.kernel.org
> > Signed-off-by: Sylwester Nawrocki <s.nawrocki@samsung.com>
> > Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
> 
> Kukjin, can I please have your ack on this patch so it can be
> merged through the media tree ?
> 
Sure, why not? Please go ahead with my ack:

Acked-by: Kukjin Kim <kgene.kim@samsung.com>

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH 5/5] s5p-fimc: Redefine platform data structure for fimc-is
@ 2013-02-01 17:36       ` Kukjin Kim
  0 siblings, 0 replies; 10+ messages in thread
From: Kukjin Kim @ 2013-02-01 17:36 UTC (permalink / raw)
  To: linux-arm-kernel

Sylwester Nawrocki wrote:
> 
> On 01/30/2013 06:23 PM, Sylwester Nawrocki wrote:
> > Newer Exynos4 SoC are equipped with a local camera ISP that
> > controls external raw image sensor directly. Such sensors
> > can be connected through FIMC-LITEn (and MIPI-CSISn) IPs to
> > the ISP, which then feeds image data to the FIMCn IP. Thus
> > there can be two busses associated with an image source
> > (sensor). Rename struct s5p_fimc_isp_info describing external
> > image sensor (video decoder) to struct fimc_source_info to
> > avoid confusion. bus_type is split into fimc_bus_type and
> > sensor_bus_type. The bus type enumeration is extended to
> > include both FIMC Writeback input types.
> >
> > The bus_type enumeration and the data structure name in the
> > board files are modified according to the above changes.
> >
> > Cc: Kukjin Kim <kgene.kim@samsung.com>
> > Cc: linux-samsung-soc at vger.kernel.org
> > Signed-off-by: Sylwester Nawrocki <s.nawrocki@samsung.com>
> > Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
> 
> Kukjin, can I please have your ack on this patch so it can be
> merged through the media tree ?
> 
Sure, why not? Please go ahead with my ack:

Acked-by: Kukjin Kim <kgene.kim@samsung.com>

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2013-02-01 17:36 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-01-30 17:23 [PATCH 0/5] s5p-fimc driver fixes/cleanups Sylwester Nawrocki
2013-01-30 17:23 ` [PATCH 1/5] s5p-fimc: Avoid null pointer dereference in fimc_capture_ctrls_create() Sylwester Nawrocki
2013-01-30 17:23 ` [PATCH 2/5] s5p-fimc: Set default image format at device open() Sylwester Nawrocki
2013-01-30 17:23 ` [PATCH 3/5] s5p-fimc: Fix FIMC.n subdev set_selection ioctl handler Sylwester Nawrocki
2013-01-30 17:23 ` [PATCH 4/5] s5p-fimc: Add clk_prepare/unprepare for sclk_cam clocks Sylwester Nawrocki
2013-01-30 17:23 ` [PATCH 5/5] s5p-fimc: Redefine platform data structure for fimc-is Sylwester Nawrocki
2013-02-01 11:05   ` Sylwester Nawrocki
2013-02-01 11:05     ` Sylwester Nawrocki
2013-02-01 17:36     ` Kukjin Kim
2013-02-01 17:36       ` Kukjin Kim

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.