]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
ENGR00178617 MX6x HDMI hotplug,video discontinuously after do a hotplug
authorSandor Yu <R01008@freescale.com>
Fri, 8 Jun 2012 05:37:17 +0000 (13:37 +0800)
committerLothar Waßmann <LW@KARO-electronics.de>
Fri, 24 May 2013 06:34:47 +0000 (08:34 +0200)
The issue only in play video on DP FG, no such issue on DP BG.
HDMI drvier will call fb_set_var to config framebuffer after HDMI cable plugin.
In Frame buffer driver, the DP FG and BG register as different fb.
The function fb_set_var only update one fb.
As IPU DP module, if DP BG is re-enabled, the FG should reconfig again.
So after HDMI plugin, only BG fb is update, FG fb will work incorrect,
no end of frame interrupt trigger, and print
"mxc_sdc_fb mxc_sdc_fb.0: timeout when waiting for flip irq"
to display.

Change code in function fb_set_var, FG fb will reconfig with DP BG fb.

Signed-off-by: Sandor Yu <R01008@freescale.com>
drivers/video/mxc/mxc_ipuv3_fb.c

index ad21ef8f05347466b8d9b4f2e3aa9cfa3d6b5279..f3f5bac837832a382550324eb79511bafbd8764c 100644 (file)
@@ -334,11 +334,30 @@ static int mxcfb_set_par(struct fb_info *fbi)
        ipu_di_signal_cfg_t sig_cfg;
        struct mxcfb_info *mxc_fbi = (struct mxcfb_info *)fbi->par;
 
+       struct mxcfb_info *mxc_fbi_fg = NULL;
+       bool ovfbi_enable = false;
+
+       if (mxc_fbi->ovfbi)
+               mxc_fbi_fg = (struct mxcfb_info *)mxc_fbi->ovfbi->par;
+
+       if (mxc_fbi->ovfbi && mxc_fbi_fg)
+               if (mxc_fbi_fg->next_blank == FB_BLANK_UNBLANK)
+                       ovfbi_enable = true;
+
        if (!mxcfb_need_to_set_par(fbi))
                return 0;
 
        dev_dbg(fbi->device, "Reconfiguring framebuffer\n");
 
+       if (ovfbi_enable) {
+               ipu_clear_irq(mxc_fbi_fg->ipu, mxc_fbi_fg->ipu_ch_irq);
+               ipu_disable_irq(mxc_fbi_fg->ipu, mxc_fbi_fg->ipu_ch_irq);
+               ipu_clear_irq(mxc_fbi_fg->ipu, mxc_fbi_fg->ipu_ch_nf_irq);
+               ipu_disable_irq(mxc_fbi_fg->ipu, mxc_fbi_fg->ipu_ch_nf_irq);
+               ipu_disable_channel(mxc_fbi_fg->ipu, mxc_fbi_fg->ipu_ch, true);
+               ipu_uninit_channel(mxc_fbi_fg->ipu, mxc_fbi_fg->ipu_ch);
+       }
+
        ipu_clear_irq(mxc_fbi->ipu, mxc_fbi->ipu_ch_irq);
        ipu_disable_irq(mxc_fbi->ipu, mxc_fbi->ipu_ch_irq);
        ipu_clear_irq(mxc_fbi->ipu, mxc_fbi->ipu_ch_nf_irq);
@@ -415,6 +434,8 @@ static int mxcfb_set_par(struct fb_info *fbi)
        }
 
        _setup_disp_channel1(fbi);
+       if (ovfbi_enable)
+               _setup_disp_channel1(mxc_fbi->ovfbi);
 
        if (!mxc_fbi->overlay) {
                uint32_t out_pixel_fmt;
@@ -472,7 +493,18 @@ static int mxcfb_set_par(struct fb_info *fbi)
                return retval;
        }
 
+       if (ovfbi_enable) {
+               retval = _setup_disp_channel2(mxc_fbi->ovfbi);
+               if (retval) {
+                       ipu_uninit_channel(mxc_fbi_fg->ipu, mxc_fbi_fg->ipu_ch);
+                       ipu_uninit_channel(mxc_fbi->ipu, mxc_fbi->ipu_ch);
+                       return retval;
+               }
+       }
+
        ipu_enable_channel(mxc_fbi->ipu, mxc_fbi->ipu_ch);
+       if (ovfbi_enable)
+               ipu_enable_channel(mxc_fbi_fg->ipu, mxc_fbi_fg->ipu_ch);
 
        if (mxc_fbi->dispdrv && mxc_fbi->dispdrv->drv->enable) {
                retval = mxc_fbi->dispdrv->drv->enable(mxc_fbi->dispdrv);