rk fb: fix uboot logo switch to kernel logo splash screen
authorhjc <hjc@rock-chips.com>
Tue, 26 May 2015 06:38:23 +0000 (14:38 +0800)
committerhjc <hjc@rock-chips.com>
Tue, 26 May 2015 09:12:04 +0000 (17:12 +0800)
Signed-off-by: hjc <hjc@rock-chips.com>
drivers/video/rockchip/rk_fb.c
include/linux/rk_fb.h

index b9bca58b7768bed8995b390800c614757fd0960a..20ab70cc9dfc0ced437fbbe8311e3777a60385c6 100755 (executable)
@@ -3919,6 +3919,7 @@ int rk_fb_register(struct rk_lcdc_driver *dev_drv,
        struct fb_info *fbi;
        struct rk_fb_par *fb_par = NULL;
        int i = 0, ret = 0, index = 0;
+       unsigned long flags;
 
        if (rk_fb->num_lcdc == RK30_MAX_LCDC_SUPPORT)
                return -ENXIO;
@@ -4090,7 +4091,9 @@ int rk_fb_register(struct rk_lcdc_driver *dev_drv,
                                        xact, yact, width, height);
                                return 0;
                        }
-
+                       local_irq_save(flags);
+                       if (dev_drv->ops->wait_frame_start)
+                               dev_drv->ops->wait_frame_start(dev_drv, 0);
                        if (dev_drv->ops->post_dspbuf) {
                                dev_drv->ops->post_dspbuf(dev_drv,
                                        main_fbi->fix.smem_start,
@@ -4103,7 +4106,7 @@ int rk_fb_register(struct rk_lcdc_driver *dev_drv,
                                        dev_drv->ops->mmu_en(dev_drv);
                                freed_index = 0;
                        }
-
+                       local_irq_restore(flags);
                        return 0;
                } else if (dev_drv->uboot_logo && uboot_logo_base) {
                        u32 start = uboot_logo_base;
@@ -4143,7 +4146,9 @@ int rk_fb_register(struct rk_lcdc_driver *dev_drv,
 
                        kfree(pages);
                        vunmap(vaddr);
-
+                       local_irq_save(flags);
+                       if (dev_drv->ops->wait_frame_start)
+                               dev_drv->ops->wait_frame_start(dev_drv, 0);
                        dev_drv->ops->post_dspbuf(dev_drv,
                                        main_fbi->fix.smem_start,
                                        format, xact, yact,
@@ -4154,6 +4159,7 @@ int rk_fb_register(struct rk_lcdc_driver *dev_drv,
                                        dev_drv->ops->mmu_en(dev_drv);
                                freed_index = 0;
                        }
+                       local_irq_restore(flags);
                        return 0;
                } else {
                        if (dev_drv->iommu_enabled) {
index 2185db815450bae70b868949629717d1891dfb11..694332df135423a752ff2af4922ca86ddaa78449 100755 (executable)
@@ -483,6 +483,7 @@ struct rk_lcdc_drv_ops {
        int (*backlight_close)(struct rk_lcdc_driver *dev_drv, int enable);
        int (*area_support_num)(struct rk_lcdc_driver *dev_drv, unsigned int *area_support);
        int (*extern_func)(struct rk_lcdc_driver *dev_drv, int cmd);
+       int (*wait_frame_start)(struct rk_lcdc_driver *dev_drv, int enable);
 };
 
 struct rk_fb_area_par {