===================================================================
@@ -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,
===================================================================
@@ -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,
===================================================================
@@ -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,
===================================================================
@@ -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;
}
===================================================================
@@ -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;
===================================================================
@@ -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);
===================================================================
@@ -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 */