MLK-14257 video: mxsfb: fix a deadlock issue for overlay fb
authorFancy Fang <chen.fang@nxp.com>
Fri, 24 Feb 2017 01:26:57 +0000 (09:26 +0800)
committerNitin Garg <nitin.garg@nxp.com>
Mon, 19 Mar 2018 20:21:50 +0000 (15:21 -0500)
The overlayfb_enable() function would call fb0 info lock,
so in some overlay functions which may call overlay_enable()
should not lock the fb0 info.

Signed-off-by: Fancy Fang <chen.fang@nxp.com>
(cherry picked from commit ec53f89c7f702aa56e7fe6f360e23582ed78302f)

drivers/video/fbdev/mxsfb.c

index 775cdfc..e5384b6 100644 (file)
@@ -1860,6 +1860,7 @@ static int overlayfb_set_par(struct fb_info *info)
                clk_enable_axi(fbi);
                clk_enable_disp_axi(fbi);
        }
+       unlock_fb_info(fbi->fb_info);
 
        if (ofb->blank_state == FB_BLANK_UNBLANK)
                ofb->ops->disable(ofb);
@@ -1869,12 +1870,14 @@ static int overlayfb_set_par(struct fb_info *info)
        if (ofb->blank_state == FB_BLANK_UNBLANK)
                ofb->ops->enable(ofb);
 
+       if (!lock_fb_info(fbi->fb_info))
+               return -EINVAL;
+
        if (fbi->cur_blank != FB_BLANK_UNBLANK) {
                clk_disable_disp_axi(fbi);
                clk_disable_axi(fbi);
                clk_disable_pix(fbi);
        }
-
        unlock_fb_info(fbi->fb_info);
 
        if ((var->activate & FB_ACTIVATE_FORCE) &&
@@ -1900,6 +1903,7 @@ static int overlayfb_blank(int blank, struct fb_info *info)
                clk_enable_axi(fbi);
                clk_enable_disp_axi(fbi);
        }
+       unlock_fb_info(fbi->fb_info);
 
        switch (blank) {
        case FB_BLANK_POWERDOWN:
@@ -1913,12 +1917,14 @@ static int overlayfb_blank(int blank, struct fb_info *info)
                break;
        }
 
+       if (!lock_fb_info(fbi->fb_info))
+               return -EINVAL;
+
        if (fbi->cur_blank != FB_BLANK_UNBLANK) {
                clk_disable_disp_axi(fbi);
                clk_disable_axi(fbi);
                clk_disable_pix(fbi);
        }
-
        unlock_fb_info(fbi->fb_info);
 
        ofb->blank_state = blank;