From: Dominic Curran <dcur...@ti.com>
Subject: [OMAPZOOM][PATCH 2/3] ISP: Add CCDC offset info to board file.

Adds new enums which signal what component order CCDC input should expect:
  ISPCCDC_INPUT_FMT_GR_BG
  ISPCCDC_INPUT_FMT_RG_GB
  ISPCCDC_INPUT_FMT_BG_GR
  ISPCCDC_INPUT_FMT_GB_RG
These are set per sensor, and the setup has been moved to the board files.

This enum value is then passed to CCDC which turns it into a horiz/vert offset 
that will set the register fields:
 ISPCCDC_FMT_HORZ.ISPCCDC_FMT_HORZ_FMTSPH_SHIFT
 ISPCCDC_FMT_VERT.ISPCCDC_FMT_VERT_FMTSLV_SHIFT

This patch causes the CCDC output component order to be consistent for all 
sensors regardless of the input order.

Signed-off-by: Dominic Curran <dcur...@ti.com>
---
 arch/arm/mach-omap2/board-3430sdp.c |    5 +++
 arch/arm/mach-omap2/board-ldp.c     |    3 +-
 arch/arm/mach-omap2/board-zoom2.c   |    1 
 drivers/media/video/isp/isp.c       |    1 
 drivers/media/video/isp/isp.h       |    8 ++++++
 drivers/media/video/isp/ispccdc.c   |   48 ++++++++++++++++++++++++++++++++----
 drivers/media/video/isp/ispccdc.h   |    2 +
 7 files changed, 61 insertions(+), 7 deletions(-)

Index: omapzoom04/arch/arm/mach-omap2/board-3430sdp.c
===================================================================
--- omapzoom04.orig/arch/arm/mach-omap2/board-3430sdp.c
+++ omapzoom04/arch/arm/mach-omap2/board-3430sdp.c
@@ -661,6 +661,7 @@ static struct isp_interface_config mt9p0
        .prev_slv = 0,
        .wenlog = ISPCCDC_CFG_WENLOG_OR,
        .dcsub = 42,
+       .raw_fmt_in = ISPCCDC_INPUT_FMT_GR_BG,
        .u.par.par_bridge = 0x0,
        .u.par.par_clk_pol = 0x0,
 };
@@ -782,9 +783,10 @@ static struct isp_interface_config ov364
        .prestrobe = 0x0,
        .shutter = 0x0,
        .prev_sph = 2,
-       .prev_slv = 1,
+       .prev_slv = 0,
        .wenlog = ISPCCDC_CFG_WENLOG_AND,
        .dcsub = OV3640_BLACK_LEVEL_10BIT,
+       .raw_fmt_in = ISPCCDC_INPUT_FMT_BG_GR,
        .u.csi.crc = 0x0,
        .u.csi.mode = 0x0,
        .u.csi.edge = 0x0,
@@ -994,6 +996,7 @@ static struct isp_interface_config imx04
        .prev_slv               = 0,
        .wenlog                 = ISPCCDC_CFG_WENLOG_OR,
        .dcsub                  = IMX046_BLACK_LEVEL_AVG,
+       .raw_fmt_in             = ISPCCDC_INPUT_FMT_RG_GB,
        .u.csi.crc              = 0x0,
        .u.csi.mode             = 0x0,
        .u.csi.edge             = 0x0,
Index: omapzoom04/arch/arm/mach-omap2/board-ldp.c
===================================================================
--- omapzoom04.orig/arch/arm/mach-omap2/board-ldp.c
+++ omapzoom04/arch/arm/mach-omap2/board-ldp.c
@@ -623,9 +623,10 @@ static struct isp_interface_config ov364
        .prestrobe = 0x0,
        .shutter = 0x0,
        .prev_sph = 2,
-       .prev_slv = 1,
+       .prev_slv = 0,
        .wenlog = ISPCCDC_CFG_WENLOG_AND,
        .dcsub = OV3640_BLACK_LEVEL_10BIT,
+       .raw_fmt_in = ISPCCDC_INPUT_FMT_BG_GR,
        .u.csi.crc = 0x0,
        .u.csi.mode = 0x0,
        .u.csi.edge = 0x0,
Index: omapzoom04/arch/arm/mach-omap2/board-zoom2.c
===================================================================
--- omapzoom04.orig/arch/arm/mach-omap2/board-zoom2.c
+++ omapzoom04/arch/arm/mach-omap2/board-zoom2.c
@@ -372,6 +372,7 @@ static struct isp_interface_config imx04
        .prev_slv               = 0,
        .wenlog                 = ISPCCDC_CFG_WENLOG_OR,
        .dcsub                  = IMX046_BLACK_LEVEL_AVG,
+       .raw_fmt_in             = ISPCCDC_INPUT_FMT_RG_GB,
        .u.csi.crc              = 0x0,
        .u.csi.mode             = 0x0,
        .u.csi.edge             = 0x0,
Index: omapzoom04/drivers/media/video/isp/isp.c
===================================================================
--- omapzoom04.orig/drivers/media/video/isp/isp.c
+++ omapzoom04/drivers/media/video/isp/isp.c
@@ -952,6 +952,7 @@ int isp_configure_interface(struct isp_i
        isppreview_set_skip(config->prev_sph, config->prev_slv);
        ispccdc_set_wenlog(config->wenlog);
        ispccdc_set_dcsub(config->dcsub);
+       ispccdc_set_crop_offset(config->raw_fmt_in);
 
        return 0;
 }
Index: omapzoom04/drivers/media/video/isp/isp.h
===================================================================
--- omapzoom04.orig/drivers/media/video/isp/isp.h
+++ omapzoom04/drivers/media/video/isp/isp.h
@@ -123,6 +123,13 @@ enum isp_callback_type {
        CBK_END,
 };
 
+enum ispccdc_raw_fmt {
+       ISPCCDC_INPUT_FMT_GR_BG,
+       ISPCCDC_INPUT_FMT_RG_GB,
+       ISPCCDC_INPUT_FMT_BG_GR,
+       ISPCCDC_INPUT_FMT_GB_RG,
+};
+
 /**
  * struct isp_reg - Structure for ISP register values.
  * @reg: 32-bit Register address.
@@ -199,6 +206,7 @@ struct isp_interface_config {
        u32 prev_slv;
        u32 wenlog;
        u32 dcsub;
+       enum ispccdc_raw_fmt raw_fmt_in;
        union {
                struct par {
                        unsigned par_bridge:2;
Index: omapzoom04/drivers/media/video/isp/ispccdc.c
===================================================================
--- omapzoom04.orig/drivers/media/video/isp/ispccdc.c
+++ omapzoom04/drivers/media/video/isp/ispccdc.c
@@ -491,6 +491,35 @@ void ispccdc_enable_lsc(u8 enable)
 }
 EXPORT_SYMBOL(ispccdc_enable_lsc);
 
+/**
+ * ispccdc_set_crop_offset - Store the component order as component offset.
+ * @raw_fmt: Input data component order.
+ *
+ * Turns the component order into a horizontal & vertical offset and store
+ * offsets to be used later.
+ **/
+void ispccdc_set_crop_offset(enum ispccdc_raw_fmt raw_fmt)
+{
+       switch (raw_fmt) {
+       case ISPCCDC_INPUT_FMT_GR_BG:
+               ispccdc_obj.ccdcin_woffset = 1;
+               ispccdc_obj.ccdcin_hoffset = 0;
+               break;
+       case ISPCCDC_INPUT_FMT_BG_GR:
+               ispccdc_obj.ccdcin_woffset = 1;
+               ispccdc_obj.ccdcin_hoffset = 1;
+               break;
+       case ISPCCDC_INPUT_FMT_RG_GB:
+               ispccdc_obj.ccdcin_woffset = 0;
+               ispccdc_obj.ccdcin_hoffset = 0;
+               break;
+       case ISPCCDC_INPUT_FMT_GB_RG:
+               ispccdc_obj.ccdcin_woffset = 0;
+               ispccdc_obj.ccdcin_hoffset = 1;
+               break;
+       }
+}
+EXPORT_SYMBOL(ispccdc_set_crop_offset);
 
 /**
  * ispccdc_config_crop - Configures crop parameters for the ISP CCDC.
@@ -1210,6 +1239,13 @@ int ispccdc_try_size(u32 input_w, u32 in
                                        CCDC_OTHERS_VP_MEM))
                *output_h -= 1;
 
+       if (ispccdc_obj.ccdc_outfmt == CCDC_OTHERS_VP) {
+               *output_h -= ispccdc_obj.ccdcin_hoffset;
+               *output_w -= ispccdc_obj.ccdcin_woffset;
+               *output_h &= 0xFFFFFFFE;
+               *output_w &= 0xFFFFFFFE;
+       }
+
        if ((ispccdc_obj.ccdc_outfmt == CCDC_OTHERS_MEM) ||
                                                (ispccdc_obj.ccdc_outfmt ==
                                                CCDC_OTHERS_VP_MEM) ||
@@ -1267,12 +1303,12 @@ int ispccdc_config_size(u32 input_w, u32
        if (ispccdc_obj.ccdc_outfmt == CCDC_OTHERS_VP) {
                omap_writel((ispccdc_obj.ccdcin_woffset <<
                                        ISPCCDC_FMT_HORZ_FMTSPH_SHIFT) |
-                                       (ispccdc_obj.ccdcin_w <<
+                       ((ispccdc_obj.ccdcin_w-ispccdc_obj.ccdcin_woffset) <<
                                        ISPCCDC_FMT_HORZ_FMTLNH_SHIFT),
                                        ISPCCDC_FMT_HORZ);
                omap_writel((ispccdc_obj.ccdcin_hoffset <<
                                        ISPCCDC_FMT_VERT_FMTSLV_SHIFT) |
-                                       (ispccdc_obj.ccdcin_h <<
+                       ((ispccdc_obj.ccdcin_h-ispccdc_obj.ccdcin_hoffset) <<
                                        ISPCCDC_FMT_VERT_FMTLNV_SHIFT),
                                        ISPCCDC_FMT_VERT);
                omap_writel((ispccdc_obj.ccdcout_w <<
@@ -1295,7 +1331,8 @@ int ispccdc_config_size(u32 input_w, u32
                                                ISPCCDC_HORZ_INFO);
                } else {
                        if (ispccdc_obj.ccdc_inpfmt == CCDC_RAW) {
-                               omap_writel(1 << ISPCCDC_HORZ_INFO_SPH_SHIFT
+                               omap_writel(ispccdc_obj.ccdcin_woffset
+                                               << ISPCCDC_HORZ_INFO_SPH_SHIFT
                                                | ((ispccdc_obj.ccdcout_w - 1)
                                                << ISPCCDC_HORZ_INFO_NPH_SHIFT),
                                                ISPCCDC_HORZ_INFO);
@@ -1306,8 +1343,9 @@ int ispccdc_config_size(u32 input_w, u32
                                                ISPCCDC_HORZ_INFO);
                        }
                }
-               omap_writel(0 << ISPCCDC_VERT_START_SLV0_SHIFT,
-                                                       ISPCCDC_VERT_START);
+               omap_writel(ispccdc_obj.ccdcin_hoffset
+                               << ISPCCDC_VERT_START_SLV0_SHIFT,
+                               ISPCCDC_VERT_START);
                omap_writel((ispccdc_obj.ccdcout_h - 1) <<
                                                ISPCCDC_VERT_LINES_NLV_SHIFT,
                                                ISPCCDC_VERT_LINES);
Index: omapzoom04/drivers/media/video/isp/ispccdc.h
===================================================================
--- omapzoom04.orig/drivers/media/video/isp/ispccdc.h
+++ omapzoom04/drivers/media/video/isp/ispccdc.h
@@ -213,4 +213,6 @@ void ispccdc_set_wenlog(u32 wenlog);
 
 void ispccdc_set_dcsub(u32 dcsub);
 
+void ispccdc_set_crop_offset(enum ispccdc_raw_fmt);
+
 #endif         /* OMAP_ISP_CCDC_H */
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to