struct dcss_plane *plane[3];
int irq;
+ bool irq_enabled;
struct drm_property *alpha;
struct drm_property *use_global;
struct drm_property *dtrc_table_ofs;
- struct completion disable_completion;
+ struct completion en_dis_completion;
enum dcss_hdr10_nonlinearity opipe_nl;
enum dcss_hdr10_gamut opipe_g;
enum dcss_hdr10_pixel_range opipe_pr;
u32 opipe_pix_format;
-
- bool fist_vblank_after_en;
};
static void dcss_crtc_reset(struct drm_crtc *crtc)
base);
struct dcss_soc *dcss = dev_get_drvdata(dcss_crtc->dev->parent);
+ if (dcss_crtc->irq_enabled)
+ return 0;
+
+ dcss_crtc->irq_enabled = true;
+
dcss_vblank_irq_enable(dcss, true);
enable_irq(dcss_crtc->irq);
disable_irq_nosync(dcss_crtc->irq);
dcss_vblank_irq_enable(dcss, false);
+
+ dcss_crtc->irq_enabled = false;
}
static const struct drm_crtc_funcs dcss_crtc_funcs = {
pm_runtime_get_sync(dcss_crtc->dev->parent);
+ dcss_enable_vblank(crtc);
+
dcss_dtg_sync_set(dcss, &vm);
dcss_ss_subsam_set(dcss, dcss_crtc->opipe_pix_format);
dcss_dtg_enable(dcss, true, NULL);
dcss_ctxld_enable(dcss);
- dcss_crtc->fist_vblank_after_en = true;
+ reinit_completion(&dcss_crtc->en_dis_completion);
+ wait_for_completion_timeout(&dcss_crtc->en_dis_completion,
+ msecs_to_jiffies(100));
crtc->enabled = true;
}
spin_unlock_irq(&crtc->dev->event_lock);
dcss_ss_enable(dcss, false);
- dcss_dtg_enable(dcss, false, &dcss_crtc->disable_completion);
+ dcss_dtg_enable(dcss, false, &dcss_crtc->en_dis_completion);
dcss_ctxld_enable(dcss);
crtc->enabled = false;
- wait_for_completion_timeout(&dcss_crtc->disable_completion,
+ reinit_completion(&dcss_crtc->en_dis_completion);
+ wait_for_completion_timeout(&dcss_crtc->en_dis_completion,
msecs_to_jiffies(100));
drm_crtc_vblank_off(crtc);
dcss_trace_module(TRACE_DRM_CRTC, TRACE_VBLANK);
- if (dcss_ctxld_is_flushed(dcss) || dcss_crtc->fist_vblank_after_en) {
+ complete(&dcss_crtc->en_dis_completion);
+
+ if (dcss_ctxld_is_flushed(dcss))
drm_crtc_handle_vblank(&dcss_crtc->base);
- dcss_crtc->fist_vblank_after_en = false;
- }
dcss_vblank_irq_clear(dcss);
return crtc->irq;
}
- init_completion(&crtc->disable_completion);
+ init_completion(&crtc->en_dis_completion);
ret = devm_request_irq(crtc->dev, crtc->irq, dcss_crtc_irq_handler,
IRQF_TRIGGER_RISING, "dcss_drm", crtc);