static void ipu_di_sync_config_interlaced(struct ipu_di *di,
                struct ipu_di_signal_cfg *sig)
 {
-       u32 h_total = sig->width + sig->h_sync_width +
-               sig->h_start_width + sig->h_end_width;
-       u32 v_total = sig->height + sig->v_sync_width +
-               sig->v_start_width + sig->v_end_width;
+       u32 h_total = sig->mode.hactive + sig->mode.hsync_len +
+               sig->mode.hback_porch + sig->mode.hfront_porch;
+       u32 v_total = sig->mode.vactive + sig->mode.vsync_len +
+               sig->mode.vback_porch + sig->mode.vfront_porch;
        u32 reg;
        struct di_sync_config cfg[] = {
                {
                }, {
                        .run_count = v_total / 2 - 1,
                        .run_src = DI_SYNC_HSYNC,
-                       .offset_count = sig->v_start_width,
+                       .offset_count = sig->mode.vback_porch,
                        .offset_src = DI_SYNC_HSYNC,
                        .repeat_count = 2,
                        .cnt_clr_src = DI_SYNC_VSYNC,
                }, {
                        .run_src = DI_SYNC_HSYNC,
-                       .repeat_count = sig->height / 2,
+                       .repeat_count = sig->mode.vactive / 2,
                        .cnt_clr_src = 4,
                }, {
                        .run_count = v_total - 1,
                        .cnt_clr_src = DI_SYNC_VSYNC,
                }, {
                        .run_src = DI_SYNC_CLK,
-                       .offset_count = sig->h_start_width,
+                       .offset_count = sig->mode.hback_porch,
                        .offset_src = DI_SYNC_CLK,
-                       .repeat_count = sig->width,
+                       .repeat_count = sig->mode.hactive,
                        .cnt_clr_src = 5,
                }, {
                        .run_count = v_total - 1,
 static void ipu_di_sync_config_noninterlaced(struct ipu_di *di,
                struct ipu_di_signal_cfg *sig, int div)
 {
-       u32 h_total = sig->width + sig->h_sync_width + sig->h_start_width +
-               sig->h_end_width;
-       u32 v_total = sig->height + sig->v_sync_width + sig->v_start_width +
-               sig->v_end_width;
+       u32 h_total = sig->mode.hactive + sig->mode.hsync_len +
+               sig->mode.hback_porch + sig->mode.hfront_porch;
+       u32 v_total = sig->mode.vactive + sig->mode.vsync_len +
+               sig->mode.vback_porch + sig->mode.vfront_porch;
        struct di_sync_config cfg[] = {
                {
                        /* 1: INT_HSYNC */
                        .offset_src = DI_SYNC_CLK,
                        .cnt_polarity_gen_en = 1,
                        .cnt_polarity_trigger_src = DI_SYNC_CLK,
-                       .cnt_down = sig->h_sync_width * 2,
+                       .cnt_down = sig->mode.hsync_len * 2,
                } , {
                        /* PIN3: VSYNC */
                        .run_count = v_total - 1,
                        .run_src = DI_SYNC_INT_HSYNC,
                        .cnt_polarity_gen_en = 1,
                        .cnt_polarity_trigger_src = DI_SYNC_INT_HSYNC,
-                       .cnt_down = sig->v_sync_width * 2,
+                       .cnt_down = sig->mode.vsync_len * 2,
                } , {
                        /* 4: Line Active */
                        .run_src = DI_SYNC_HSYNC,
-                       .offset_count = sig->v_sync_width + sig->v_start_width,
+                       .offset_count = sig->mode.vsync_len +
+                                       sig->mode.vback_porch,
                        .offset_src = DI_SYNC_HSYNC,
-                       .repeat_count = sig->height,
+                       .repeat_count = sig->mode.vactive,
                        .cnt_clr_src = DI_SYNC_VSYNC,
                } , {
                        /* 5: Pixel Active, referenced by DC */
                        .run_src = DI_SYNC_CLK,
-                       .offset_count = sig->h_sync_width + sig->h_start_width,
+                       .offset_count = sig->mode.hsync_len +
+                                       sig->mode.hback_porch,
                        .offset_src = DI_SYNC_CLK,
-                       .repeat_count = sig->width,
+                       .repeat_count = sig->mode.hactive,
                        .cnt_clr_src = 5, /* Line Active */
                } , {
                        /* unused */
                } , {
                        /* 3: Line Active */
                        .run_src = DI_SYNC_INT_HSYNC,
-                       .offset_count = sig->v_sync_width + sig->v_start_width,
+                       .offset_count = sig->mode.vsync_len +
+                                       sig->mode.vback_porch,
                        .offset_src = DI_SYNC_INT_HSYNC,
-                       .repeat_count = sig->height,
+                       .repeat_count = sig->mode.vactive,
                        .cnt_clr_src = 3 /* VSYNC */,
                } , {
                        /* PIN4: HSYNC for VGA via TVEv2 on TQ MBa53 */
                        .offset_src = DI_SYNC_CLK,
                        .cnt_polarity_gen_en = 1,
                        .cnt_polarity_trigger_src = DI_SYNC_CLK,
-                       .cnt_down = sig->h_sync_width * 2,
+                       .cnt_down = sig->mode.hsync_len * 2,
                } , {
                        /* 5: Pixel Active signal to DC */
                        .run_src = DI_SYNC_CLK,
-                       .offset_count = sig->h_sync_width + sig->h_start_width,
+                       .offset_count = sig->mode.hsync_len +
+                                       sig->mode.hback_porch,
                        .offset_src = DI_SYNC_CLK,
-                       .repeat_count = sig->width,
+                       .repeat_count = sig->mode.hactive,
                        .cnt_clr_src = 4, /* Line Active */
                } , {
                        /* PIN6: VSYNC for VGA via TVEv2 on TQ MBa53 */
                        .offset_src = DI_SYNC_INT_HSYNC,
                        .cnt_polarity_gen_en = 1,
                        .cnt_polarity_trigger_src = DI_SYNC_INT_HSYNC,
-                       .cnt_down = sig->v_sync_width * 2,
+                       .cnt_down = sig->mode.vsync_len * 2,
                } , {
                        /* PIN4: HSYNC for VGA via TVEv2 on i.MX53-QSB */
                        .run_count = h_total - 1,
                        .offset_src = DI_SYNC_CLK,
                        .cnt_polarity_gen_en = 1,
                        .cnt_polarity_trigger_src = DI_SYNC_CLK,
-                       .cnt_down = sig->h_sync_width * 2,
+                       .cnt_down = sig->mode.hsync_len * 2,
                } , {
                        /* PIN6: VSYNC for VGA via TVEv2 on i.MX53-QSB */
                        .run_count = v_total - 1,
                        .offset_src = DI_SYNC_INT_HSYNC,
                        .cnt_polarity_gen_en = 1,
                        .cnt_polarity_trigger_src = DI_SYNC_INT_HSYNC,
-                       .cnt_down = sig->v_sync_width * 2,
+                       .cnt_down = sig->mode.vsync_len * 2,
                } , {
                        /* unused */
                },
                        unsigned long in_rate;
                        unsigned div;
 
-                       clk_set_rate(clk, sig->pixelclock);
+                       clk_set_rate(clk, sig->mode.pixelclock);
 
                        in_rate = clk_get_rate(clk);
-                       div = (in_rate + sig->pixelclock / 2) / sig->pixelclock;
+                       div = (in_rate + sig->mode.pixelclock / 2) /
+                               sig->mode.pixelclock;
                        if (div == 0)
                                div = 1;
 
                unsigned div, error;
 
                clkrate = clk_get_rate(di->clk_ipu);
-               div = (clkrate + sig->pixelclock / 2) / sig->pixelclock;
+               div = (clkrate + sig->mode.pixelclock / 2) /
+                       sig->mode.pixelclock;
                rate = clkrate / div;
 
-               error = rate / (sig->pixelclock / 1000);
+               error = rate / (sig->mode.pixelclock / 1000);
 
                dev_dbg(di->ipu->dev, "  IPU clock can give %lu with divider %u, error %d.%u%%\n",
                        rate, div, (signed)(error - 1000) / 10, error % 10);
 
                        clk = di->clk_di;
 
-                       clk_set_rate(clk, sig->pixelclock);
+                       clk_set_rate(clk, sig->mode.pixelclock);
 
                        in_rate = clk_get_rate(clk);
-                       div = (in_rate + sig->pixelclock / 2) / sig->pixelclock;
+                       div = (in_rate + sig->mode.pixelclock / 2) /
+                               sig->mode.pixelclock;
                        if (div == 0)
                                div = 1;
 
        ipu_di_write(di, val, DI_GENERAL);
 
        dev_dbg(di->ipu->dev, "Want %luHz IPU %luHz DI %luHz using %s, %luHz\n",
-               sig->pixelclock,
+               sig->mode.pixelclock,
                clk_get_rate(di->clk_ipu),
                clk_get_rate(di->clk_di),
                clk == di->clk_di ? "DI" : "IPU",
        u32 div;
 
        dev_dbg(di->ipu->dev, "disp %d: panel size = %d x %d\n",
-               di->id, sig->width, sig->height);
+               di->id, sig->mode.hactive, sig->mode.vactive);
 
-       if ((sig->v_sync_width == 0) || (sig->h_sync_width == 0))
+       if ((sig->mode.vsync_len == 0) || (sig->mode.hsync_len == 0))
                return -EINVAL;
 
        dev_dbg(di->ipu->dev, "Clocks: IPU %luHz DI %luHz Needed %luHz\n",
                clk_get_rate(di->clk_ipu),
                clk_get_rate(di->clk_di),
-               sig->pixelclock);
+               sig->mode.pixelclock);
 
        mutex_lock(&di_mutex);
 
        di_gen = ipu_di_read(di, DI_GENERAL) & DI_GEN_DI_CLK_EXT;
        di_gen |= DI_GEN_DI_VSYNC_EXT;
 
-       if (sig->interlaced) {
+       if (sig->mode.flags & DISPLAY_FLAGS_INTERLACED) {
                ipu_di_sync_config_interlaced(di, sig);
 
                /* set y_sel = 1 */
 
                vsync_cnt = 7;
 
-               if (sig->Hsync_pol)
+               if (sig->mode.flags & DISPLAY_FLAGS_HSYNC_HIGH)
                        di_gen |= DI_GEN_POLARITY_3;
-               if (sig->Vsync_pol)
+               if (sig->mode.flags & DISPLAY_FLAGS_VSYNC_HIGH)
                        di_gen |= DI_GEN_POLARITY_2;
        } else {
                ipu_di_sync_config_noninterlaced(di, sig, div);
                        if (!(sig->hsync_pin == 2 && sig->vsync_pin == 3))
                                vsync_cnt = 6;
 
-               if (sig->Hsync_pol) {
+               if (sig->mode.flags & DISPLAY_FLAGS_HSYNC_HIGH) {
                        if (sig->hsync_pin == 2)
                                di_gen |= DI_GEN_POLARITY_2;
                        else if (sig->hsync_pin == 4)
                        else if (sig->hsync_pin == 7)
                                di_gen |= DI_GEN_POLARITY_7;
                }
-               if (sig->Vsync_pol) {
+               if (sig->mode.flags & DISPLAY_FLAGS_VSYNC_HIGH) {
                        if (sig->vsync_pin == 3)
                                di_gen |= DI_GEN_POLARITY_3;
                        else if (sig->vsync_pin == 6)