@@ -121,7 +121,6 @@ struct adp_drv_private {
121121 dma_addr_t mask_iova ;
122122 int be_irq ;
123123 int fe_irq ;
124- spinlock_t irq_lock ;
125124 struct drm_pending_vblank_event * event ;
126125};
127126
@@ -288,6 +287,7 @@ static void adp_crtc_atomic_enable(struct drm_crtc *crtc,
288287 writel (BIT (0 ), adp -> be + ADBE_BLEND_EN3 );
289288 writel (BIT (0 ), adp -> be + ADBE_BLEND_BYPASS );
290289 writel (BIT (0 ), adp -> be + ADBE_BLEND_EN4 );
290+ drm_crtc_vblank_on (crtc );
291291}
292292
293293static void adp_crtc_atomic_disable (struct drm_crtc * crtc ,
@@ -310,6 +310,7 @@ static void adp_crtc_atomic_flush(struct drm_crtc *crtc,
310310 struct drm_atomic_state * state )
311311{
312312 u32 frame_num = 1 ;
313+ unsigned long flags ;
313314 struct adp_drv_private * adp = crtc_to_adp (crtc );
314315 struct drm_crtc_state * new_state = drm_atomic_get_new_crtc_state (state , crtc );
315316 u64 new_size = ALIGN (new_state -> mode .hdisplay *
@@ -330,13 +331,19 @@ static void adp_crtc_atomic_flush(struct drm_crtc *crtc,
330331 }
331332 writel (ADBE_FIFO_SYNC | frame_num , adp -> be + ADBE_FIFO );
332333 //FIXME: use adbe flush interrupt
333- spin_lock_irq (& crtc -> dev -> event_lock );
334334 if (crtc -> state -> event ) {
335- drm_crtc_vblank_get (crtc );
336- adp -> event = crtc -> state -> event ;
335+ struct drm_pending_vblank_event * event = crtc -> state -> event ;
336+
337+ crtc -> state -> event = NULL ;
338+ spin_lock_irqsave (& crtc -> dev -> event_lock , flags );
339+
340+ if (drm_crtc_vblank_get (crtc ) != 0 )
341+ drm_crtc_send_vblank_event (crtc , event );
342+ else
343+ adp -> event = event ;
344+
345+ spin_unlock_irqrestore (& crtc -> dev -> event_lock , flags );
337346 }
338- crtc -> state -> event = NULL ;
339- spin_unlock_irq (& crtc -> dev -> event_lock );
340347}
341348
342349static const struct drm_crtc_funcs adp_crtc_funcs = {
@@ -482,8 +489,6 @@ static irqreturn_t adp_fe_irq(int irq, void *arg)
482489 u32 int_status ;
483490 u32 int_ctl ;
484491
485- spin_lock (& adp -> irq_lock );
486-
487492 int_status = readl (adp -> fe + ADP_INT_STATUS );
488493 if (int_status & ADP_INT_STATUS_VBLANK ) {
489494 drm_crtc_handle_vblank (& adp -> crtc );
@@ -501,7 +506,6 @@ static irqreturn_t adp_fe_irq(int irq, void *arg)
501506
502507 writel (int_status , adp -> fe + ADP_INT_STATUS );
503508
504- spin_unlock (& adp -> irq_lock );
505509
506510 return IRQ_HANDLED ;
507511}
@@ -512,8 +516,7 @@ static int adp_drm_bind(struct device *dev)
512516 struct adp_drv_private * adp = to_adp (drm );
513517 int err ;
514518
515- adp_disable_vblank (adp );
516- writel (ADP_CTRL_FIFO_ON | ADP_CTRL_VBLANK_ON , adp -> fe + ADP_CTRL );
519+ writel (ADP_CTRL_FIFO_ON , adp -> fe + ADP_CTRL );
517520
518521 adp -> next_bridge = drmm_of_get_bridge (& adp -> drm , dev -> of_node , 0 , 0 );
519522 if (IS_ERR (adp -> next_bridge )) {
@@ -567,8 +570,6 @@ static int adp_probe(struct platform_device *pdev)
567570 if (IS_ERR (adp ))
568571 return PTR_ERR (adp );
569572
570- spin_lock_init (& adp -> irq_lock );
571-
572573 dev_set_drvdata (& pdev -> dev , & adp -> drm );
573574
574575 err = adp_parse_of (pdev , adp );
0 commit comments