static void request_pending(struct drm_crtc *crtc, uint32_t pending) { struct mdp5_crtc *mdp5_crtc = to_mdp5_crtc(crtc); atomic_or(pending, &mdp5_crtc->pending); mdp_irq_register(&get_kms(crtc)->base, &mdp5_crtc->vblank); }
int mdp4_irq_postinstall(struct msm_kms *kms) { struct mdp_kms *mdp_kms = to_mdp_kms(kms); struct mdp4_kms *mdp4_kms = to_mdp4_kms(mdp_kms); struct mdp_irq *error_handler = &mdp4_kms->error_handler; error_handler->irq = mdp4_irq_error_handler; error_handler->irqmask = MDP4_IRQ_PRIMARY_INTF_UDERRUN | MDP4_IRQ_EXTERNAL_INTF_UDERRUN; mdp_irq_register(mdp_kms, error_handler); return 0; }
int mdp5_irq_postinstall(struct msm_kms *kms) { struct mdp_kms *mdp_kms = to_mdp_kms(kms); struct mdp5_kms *mdp5_kms = to_mdp5_kms(mdp_kms); struct mdp_irq *error_handler = &mdp5_kms->error_handler; error_handler->irq = mdp5_irq_error_handler; error_handler->irqmask = MDP5_IRQ_INTF0_UNDER_RUN | MDP5_IRQ_INTF1_UNDER_RUN | MDP5_IRQ_INTF2_UNDER_RUN | MDP5_IRQ_INTF3_UNDER_RUN; mdp_irq_register(mdp_kms, error_handler); return 0; }
static void mdp4_crtc_dpms(struct drm_crtc *crtc, int mode) { struct mdp4_crtc *mdp4_crtc = to_mdp4_crtc(crtc); struct mdp4_kms *mdp4_kms = get_kms(crtc); bool enabled = (mode == DRM_MODE_DPMS_ON); DBG("%s: mode=%d", mdp4_crtc->name, mode); if (enabled != mdp4_crtc->enabled) { if (enabled) { mdp4_enable(mdp4_kms); mdp_irq_register(&mdp4_kms->base, &mdp4_crtc->err); } else { mdp_irq_unregister(&mdp4_kms->base, &mdp4_crtc->err); mdp4_disable(mdp4_kms); } mdp4_crtc->enabled = enabled; } }
static void update_fb(struct drm_crtc *crtc, bool async, struct drm_framebuffer *new_fb) { struct mdp4_crtc *mdp4_crtc = to_mdp4_crtc(crtc); struct drm_framebuffer *old_fb = mdp4_crtc->fb; if (old_fb) drm_flip_work_queue(&mdp4_crtc->unref_fb_work, old_fb); /* grab reference to incoming scanout fb: */ drm_framebuffer_reference(new_fb); mdp4_crtc->base.fb = new_fb; mdp4_crtc->fb = new_fb; if (!async) { /* enable vblank to pick up the old_fb */ mdp_irq_register(&get_kms(crtc)->base, &mdp4_crtc->vblank); } }