static void ade_crtc_atomic_flush(struct drm_crtc *crtc, struct drm_crtc_state *old_state) { struct ade_crtc *acrtc = to_ade_crtc(crtc); struct ade_hw_ctx *ctx = acrtc->ctx; struct drm_pending_vblank_event *event = crtc->state->event; void __iomem *base = ctx->base; /* only crtc is enabled regs take effect */ if (acrtc->enable) { ade_dump_regs(base); /* flush ade registers */ writel(ADE_ENABLE, base + ADE_EN); } if (event) { crtc->state->event = NULL; spin_lock_irq(&crtc->dev->event_lock); if (drm_crtc_vblank_get(crtc) == 0) drm_crtc_arm_vblank_event(crtc, event); else drm_crtc_send_vblank_event(crtc, event); spin_unlock_irq(&crtc->dev->event_lock); } }
static void ade_crtc_atomic_begin(struct drm_crtc *crtc, struct drm_crtc_state *old_state) { struct ade_crtc *acrtc = to_ade_crtc(crtc); struct ade_hw_ctx *ctx = acrtc->ctx; if (!ctx->power_on) (void)ade_power_up(ctx); }
static void ade_crtc_mode_set_nofb(struct drm_crtc *crtc) { struct ade_crtc *acrtc = to_ade_crtc(crtc); struct ade_hw_ctx *ctx = acrtc->ctx; struct drm_display_mode *mode = &crtc->state->mode; struct drm_display_mode *adj_mode = &crtc->state->adjusted_mode; if (!ctx->power_on) (void)ade_power_up(ctx); ade_ldi_set_mode(acrtc, mode, adj_mode); }
static bool ade_crtc_mode_fixup(struct drm_crtc *crtc, const struct drm_display_mode *mode, struct drm_display_mode *adjusted_mode) { struct ade_crtc *acrtc = to_ade_crtc(crtc); struct ade_hw_ctx *ctx = acrtc->ctx; adjusted_mode->clock = clk_round_rate(ctx->ade_pix_clk, mode->clock * 1000) / 1000; return true; }
static void ade_crtc_disable(struct drm_crtc *crtc) { struct ade_crtc *acrtc = to_ade_crtc(crtc); struct ade_hw_ctx *ctx = acrtc->ctx; if (!acrtc->enable) return; ade_power_down(ctx); acrtc->enable = false; }
static void ade_crtc_atomic_disable(struct drm_crtc *crtc, struct drm_crtc_state *old_state) { struct ade_crtc *acrtc = to_ade_crtc(crtc); struct ade_hw_ctx *ctx = acrtc->ctx; if (!acrtc->enable) return; drm_crtc_vblank_off(crtc); ade_power_down(ctx); acrtc->enable = false; }
static void ade_crtc_disable_vblank(struct drm_crtc *crtc) { struct ade_crtc *acrtc = to_ade_crtc(crtc); struct ade_hw_ctx *ctx = acrtc->ctx; void __iomem *base = ctx->base; if (!ctx->power_on) { DRM_ERROR("power is down! vblank disable fail\n"); return; } ade_update_bits(base + LDI_INT_EN, FRAME_END_INT_EN_OFST, MASK(1), 0); }
static int ade_crtc_enable_vblank(struct drm_crtc *crtc) { struct ade_crtc *acrtc = to_ade_crtc(crtc); struct ade_hw_ctx *ctx = acrtc->ctx; void __iomem *base = ctx->base; if (!ctx->power_on) (void)ade_power_up(ctx); ade_update_bits(base + LDI_INT_EN, FRAME_END_INT_EN_OFST, MASK(1), 1); return 0; }
static void ade_disable_vblank(struct drm_device *dev, unsigned int pipe) { struct kirin_drm_private *priv = dev->dev_private; struct ade_crtc *acrtc = to_ade_crtc(priv->crtc[pipe]); struct ade_hw_ctx *ctx = acrtc->ctx; void __iomem *base = ctx->base; if (!ctx->power_on) { DRM_ERROR("power is down! vblank disable fail\n"); return; } ade_update_bits(base + LDI_INT_EN, FRAME_END_INT_EN_OFST, MASK(1), 0); }
static int ade_enable_vblank(struct drm_device *dev, unsigned int pipe) { struct kirin_drm_private *priv = dev->dev_private; struct ade_crtc *acrtc = to_ade_crtc(priv->crtc[pipe]); struct ade_hw_ctx *ctx = acrtc->ctx; void __iomem *base = ctx->base; if (!ctx->power_on) (void)ade_power_up(ctx); ade_update_bits(base + LDI_INT_EN, FRAME_END_INT_EN_OFST, MASK(1), 1); return 0; }
static void ade_crtc_atomic_flush(struct drm_crtc *crtc, struct drm_crtc_state *old_state) { struct ade_crtc *acrtc = to_ade_crtc(crtc); struct ade_hw_ctx *ctx = acrtc->ctx; void __iomem *base = ctx->base; /* only crtc is enabled regs take effect */ if (acrtc->enable) { ade_dump_regs(base); /* flush ade registers */ writel(ADE_ENABLE, base + ADE_EN); } }
static void ade_crtc_enable(struct drm_crtc *crtc) { struct ade_crtc *acrtc = to_ade_crtc(crtc); struct ade_hw_ctx *ctx = acrtc->ctx; int ret; if (acrtc->enable) return; if (!ctx->power_on) { ret = ade_power_up(ctx); if (ret) return; } ade_set_medianoc_qos(acrtc); ade_display_enable(acrtc); ade_dump_regs(ctx->base); acrtc->enable = true; }