ソースを参照

修复ark1668e_lcdc_display_update_atomic重入造成的显示黑屏问题

huangliang 10 ヶ月 前
コミット
c4095dbd4d

+ 1 - 0
linux/drivers/video/fbdev/arkmicro/ark1668e_lcdc.h

@@ -134,5 +134,6 @@ int ark1668e_lcdc_wait_for_vsync(void);
 int ark1668e_lcdfb_ioctl(struct fb_info *info, unsigned int cmd, unsigned long arg);
 int ark1668e_lcdc_set_osd_addr(int layer, int addr);
 int ark1668e_lcdc_set_video_addr(int layer,  unsigned int yaddr,unsigned int cbaddr, unsigned int craddr);
+void ark1668e_lcdc_display_update_atomic(struct ark1668e_lcdfb_info* sinfo);
 
 #endif /* __ARK1668E_LCDC_H__ */

+ 1 - 4
linux/drivers/video/fbdev/arkmicro/ark1668e_lcdc_funcs.c

@@ -1129,7 +1129,7 @@ static int ark1668e_lcdc_set_osd_addr_group1(int layer, int addr)
  *		Ioctl interface.
  *
  **************************************************************************************************/
-static void ark1668e_lcdc_display_update_atomic(struct ark1668e_lcdfb_info* sinfo)
+void ark1668e_lcdc_display_update_atomic(struct ark1668e_lcdfb_info* sinfo)
 {
 	unsigned int format, yuv_order, rgb_order, i, layer;
 	struct ark_disp_atomic *p = NULL;
@@ -1224,8 +1224,6 @@ int ark1668e_lcdc_wait_for_vsync(void)
 		return ret;
 	if (ret == 0)
 		return -ETIMEDOUT;
-	if(sinfo->atomic_flag)
-		ark1668e_lcdc_display_update_atomic(sinfo);
 	return 0;
 }
 EXPORT_SYMBOL(ark1668e_lcdc_wait_for_vsync);
@@ -1559,7 +1557,6 @@ int ark1668e_lcdfb_ioctl(struct fb_info *info, unsigned int cmd, unsigned long a
 			printk(KERN_DEBUG "%s===>layer=%d, atomic_stat=0x%0x.\n ",__func__, layer, atomic.atomic_stat);
 			sinfo->atomic_flag |= (1 << layer);
 			memcpy(&sinfo->patomic[layer], &atomic, sizeof(struct ark_disp_atomic));
-			error += ark1668e_lcdc_wait_for_vsync();
 			break;
 		}
 		case ARKFB_GET_WINDOW_ADDR: {

+ 3 - 0
linux/drivers/video/fbdev/arkmicro/ark1668e_lcdfb.c

@@ -476,6 +476,9 @@ static irqreturn_t ark1668e_lcdfb_interrupt(int irq, void *dev_id)
 			}
 		}
 
+		if(sinfo->atomic_flag)
+			ark1668e_lcdc_display_update_atomic(sinfo);
+
 		sinfo->vsync_flag = 1;
 		wake_up_interruptible(&sinfo->vsync_waitq);
 		schedule_work(&sinfo->task);