I've found a work-around the rolling effect by supplying the active size to sensor_data::pix::height and applying the following patch:
diff --git a/drivers/mxc/ipu3/ipu_capture.c b/drivers/mxc/ipu3/ipu_capture.c
index b1d6fb3..3f4d166 100644
--- a/drivers/mxc/ipu3/ipu_capture.c
+++ b/drivers/mxc/ipu3/ipu_capture.c
@@ -139,7 +139,7 @@ ipu_csi_init_interface(struct ipu_soc *ipu, uint16_t width, uint16_t height,
ipu_csi_write(ipu, csi, 0x40030, CSI_CCIR_CODE_1);
ipu_csi_write(ipu, csi, 0xFF0000, CSI_CCIR_CODE_3);
} else if (cfg_param.clk_mode == IPU_CSI_CLK_MODE_CCIR656_INTERLACED) {
- if (width == 720 && height == 625) {
+ if (width == 720 && (height == 625 || height == 576)) {
/* PAL case */
/*
* Field0BlankEnd = 0x6, Field0BlankStart = 0x2,
@@ -154,7 +154,7 @@ ipu_csi_init_interface(struct ipu_soc *ipu, uint16_t width, uint16_t height,
ipu_csi_write(ipu, csi, 0xFF0000, CSI_CCIR_CODE_3);
- } else if (width == 720 && height == 525) {
+ } else if (width == 720 && (height == 525 || height == 480)) {
/* NTSC case */
/*
* Field0BlankEnd = 0x7, Field0BlankStart = 0x3,
This prevents the rolling effect, but the captured frame still includes the blanking region.