Lines Matching +full:power +full:- +full:stable +full:- +full:time
1 // SPDX-License-Identifier: GPL-2.0-only
3 * (C) COPYRIGHT 2012-2013 ARM Limited. All rights reserved.
7 * Copyright (c) 2006-2008 Intel Corporation
15 #include <linux/dma-buf.h>
32 irq_stat = readl(priv->regs + CLCD_PL111_MIS); in pl111_irq()
38 drm_crtc_handle_vblank(&priv->pipe.crtc); in pl111_irq()
44 writel(irq_stat, priv->regs + CLCD_PL111_ICR); in pl111_irq()
53 struct drm_device *drm = pipe->crtc.dev; in pl111_mode_valid()
54 struct pl111_drm_dev_private *priv = drm->dev_private; in pl111_mode_valid()
55 u32 cpp = priv->variant->fb_bpp / 8; in pl111_mode_valid()
62 bw = mode->clock * 1000ULL; /* In Hz */ in pl111_mode_valid()
63 bw = bw * mode->hdisplay * mode->vdisplay * cpp; in pl111_mode_valid()
64 bw = div_u64(bw, mode->htotal * mode->vtotal); in pl111_mode_valid()
70 if (priv->memory_bw && (bw > priv->memory_bw)) { in pl111_mode_valid()
72 mode->hdisplay, mode->vdisplay, in pl111_mode_valid()
73 mode->clock * 1000, cpp, bw); in pl111_mode_valid()
78 mode->hdisplay, mode->vdisplay, in pl111_mode_valid()
79 mode->clock * 1000, cpp, bw); in pl111_mode_valid()
88 const struct drm_display_mode *mode = &cstate->mode; in pl111_display_check()
89 struct drm_framebuffer *old_fb = pipe->plane.state->fb; in pl111_display_check()
90 struct drm_framebuffer *fb = pstate->fb; in pl111_display_check()
92 if (mode->hdisplay % 16) in pl111_display_check()
93 return -EINVAL; in pl111_display_check()
100 return -EINVAL; in pl111_display_check()
102 /* There's no pitch register -- the mode's hdisplay in pl111_display_check()
105 if (fb->pitches[0] != mode->hdisplay * fb->format->cpp[0]) in pl111_display_check()
106 return -EINVAL; in pl111_display_check()
108 /* We can't change the FB format in a flicker-free in pl111_display_check()
111 if (old_fb && old_fb->format != fb->format) in pl111_display_check()
112 cstate->mode_changed = true; in pl111_display_check()
122 struct drm_crtc *crtc = &pipe->crtc; in pl111_display_enable()
123 struct drm_plane *plane = &pipe->plane; in pl111_display_enable()
124 struct drm_device *drm = crtc->dev; in pl111_display_enable()
125 struct pl111_drm_dev_private *priv = drm->dev_private; in pl111_display_enable()
126 const struct drm_display_mode *mode = &cstate->mode; in pl111_display_enable()
127 struct drm_framebuffer *fb = plane->state->fb; in pl111_display_enable()
128 struct drm_connector *connector = priv->connector; in pl111_display_enable()
129 struct drm_bridge *bridge = priv->bridge; in pl111_display_enable()
137 ret = clk_set_rate(priv->clk, mode->clock * 1000); in pl111_display_enable()
139 dev_err(drm->dev, in pl111_display_enable()
141 mode->clock * 1000, ret); in pl111_display_enable()
144 clk_prepare_enable(priv->clk); in pl111_display_enable()
146 ppl = (mode->hdisplay / 16) - 1; in pl111_display_enable()
147 hsw = mode->hsync_end - mode->hsync_start - 1; in pl111_display_enable()
148 hfp = mode->hsync_start - mode->hdisplay - 1; in pl111_display_enable()
149 hbp = mode->htotal - mode->hsync_end - 1; in pl111_display_enable()
151 lpp = mode->vdisplay - 1; in pl111_display_enable()
152 vsw = mode->vsync_end - mode->vsync_start - 1; in pl111_display_enable()
153 vfp = mode->vsync_start - mode->vdisplay; in pl111_display_enable()
154 vbp = mode->vtotal - mode->vsync_end; in pl111_display_enable()
156 cpl = mode->hdisplay - 1; in pl111_display_enable()
162 priv->regs + CLCD_TIM0); in pl111_display_enable()
167 priv->regs + CLCD_TIM1); in pl111_display_enable()
169 spin_lock(&priv->tim2_lock); in pl111_display_enable()
171 tim2 = readl(priv->regs + CLCD_TIM2); in pl111_display_enable()
174 if (priv->variant->broken_clockdivider) in pl111_display_enable()
177 if (mode->flags & DRM_MODE_FLAG_NHSYNC) in pl111_display_enable()
180 if (mode->flags & DRM_MODE_FLAG_NVSYNC) in pl111_display_enable()
184 if (connector->display_info.bus_flags & DRM_BUS_FLAG_DE_LOW) in pl111_display_enable()
187 if (connector->display_info.bus_flags & in pl111_display_enable()
191 if (connector->display_info.num_bus_formats == 1 && in pl111_display_enable()
192 connector->display_info.bus_formats[0] == in pl111_display_enable()
207 const struct drm_bridge_timings *btimings = bridge->timings; in pl111_display_enable()
212 * stable before the receiving bridge (such as a dumb VGA DAC in pl111_display_enable()
215 * edge of the clock so it is for sure stable when it gets in pl111_display_enable()
220 * that the setup time is more than 3000 picoseconds (3 ns). in pl111_display_enable()
221 * If we have a bridge that requires the signal to be stable in pl111_display_enable()
225 if (btimings && btimings->setup_time_ps >= 3000) in pl111_display_enable()
230 writel(tim2, priv->regs + CLCD_TIM2); in pl111_display_enable()
231 spin_unlock(&priv->tim2_lock); in pl111_display_enable()
233 writel(0, priv->regs + CLCD_TIM3); in pl111_display_enable()
248 if (priv->variant->st_bitmux_control) in pl111_display_enable()
257 switch (fb->format->format) { in pl111_display_enable()
260 if (priv->variant->st_bitmux_control) in pl111_display_enable()
265 if (priv->variant->st_bitmux_control) in pl111_display_enable()
270 if (priv->variant->st_bitmux_control) in pl111_display_enable()
277 if (priv->variant->st_bitmux_control) in pl111_display_enable()
283 if (priv->variant->is_pl110) in pl111_display_enable()
285 else if (priv->variant->st_bitmux_control) in pl111_display_enable()
291 if (priv->variant->is_pl110) in pl111_display_enable()
293 else if (priv->variant->st_bitmux_control) in pl111_display_enable()
301 if (priv->variant->st_bitmux_control) in pl111_display_enable()
307 if (priv->variant->st_bitmux_control) in pl111_display_enable()
315 if (priv->variant->st_bitmux_control) in pl111_display_enable()
321 if (priv->variant->st_bitmux_control) in pl111_display_enable()
328 fb->format->format); in pl111_display_enable()
333 if (priv->variant->external_bgr) in pl111_display_enable()
336 /* Power sequence: first enable and chill */ in pl111_display_enable()
337 writel(cntl, priv->regs + priv->ctrl); in pl111_display_enable()
345 if (priv->variant_display_enable) in pl111_display_enable()
346 priv->variant_display_enable(drm, fb->format->format); in pl111_display_enable()
348 /* Power Up */ in pl111_display_enable()
350 writel(cntl, priv->regs + priv->ctrl); in pl111_display_enable()
352 if (!priv->variant->broken_vblank) in pl111_display_enable()
358 struct drm_crtc *crtc = &pipe->crtc; in pl111_display_disable()
359 struct drm_device *drm = crtc->dev; in pl111_display_disable()
360 struct pl111_drm_dev_private *priv = drm->dev_private; in pl111_display_disable()
363 if (!priv->variant->broken_vblank) in pl111_display_disable()
366 /* Power Down */ in pl111_display_disable()
367 cntl = readl(priv->regs + priv->ctrl); in pl111_display_disable()
370 writel(cntl, priv->regs + priv->ctrl); in pl111_display_disable()
379 if (priv->variant_display_disable) in pl111_display_disable()
380 priv->variant_display_disable(drm); in pl111_display_disable()
383 writel(0, priv->regs + priv->ctrl); in pl111_display_disable()
385 clk_disable_unprepare(priv->clk); in pl111_display_disable()
391 struct drm_crtc *crtc = &pipe->crtc; in pl111_display_update()
392 struct drm_device *drm = crtc->dev; in pl111_display_update()
393 struct pl111_drm_dev_private *priv = drm->dev_private; in pl111_display_update()
394 struct drm_pending_vblank_event *event = crtc->state->event; in pl111_display_update()
395 struct drm_plane *plane = &pipe->plane; in pl111_display_update()
396 struct drm_plane_state *pstate = plane->state; in pl111_display_update()
397 struct drm_framebuffer *fb = pstate->fb; in pl111_display_update()
402 writel(addr, priv->regs + CLCD_UBAS); in pl111_display_update()
406 crtc->state->event = NULL; in pl111_display_update()
408 spin_lock_irq(&crtc->dev->event_lock); in pl111_display_update()
409 if (crtc->state->active && drm_crtc_vblank_get(crtc) == 0) in pl111_display_update()
413 spin_unlock_irq(&crtc->dev->event_lock); in pl111_display_update()
419 struct drm_crtc *crtc = &pipe->crtc; in pl111_display_enable_vblank()
420 struct drm_device *drm = crtc->dev; in pl111_display_enable_vblank()
421 struct pl111_drm_dev_private *priv = drm->dev_private; in pl111_display_enable_vblank()
423 writel(CLCD_IRQ_NEXTBASE_UPDATE, priv->regs + priv->ienb); in pl111_display_enable_vblank()
430 struct drm_crtc *crtc = &pipe->crtc; in pl111_display_disable_vblank()
431 struct drm_device *drm = crtc->dev; in pl111_display_disable_vblank()
432 struct pl111_drm_dev_private *priv = drm->dev_private; in pl111_display_disable_vblank()
434 writel(0, priv->regs + priv->ienb); in pl111_display_disable_vblank()
453 int max_div = (1 << (TIM2_PCD_LO_BITS + TIM2_PCD_HI_BITS)) - 1; in pl111_clk_div_choose_div()
463 diff = abs(rate - div_rate); in pl111_clk_div_choose_div()
489 u32 tim2 = readl(priv->regs + CLCD_TIM2); in pl111_clk_div_recalc_rate()
497 (TIM2_PCD_HI_SHIFT - TIM2_PCD_LO_BITS); in pl111_clk_div_recalc_rate()
511 spin_lock(&priv->tim2_lock); in pl111_clk_div_set_rate()
512 tim2 = readl(priv->regs + CLCD_TIM2); in pl111_clk_div_set_rate()
518 div -= 2; in pl111_clk_div_set_rate()
523 writel(tim2, priv->regs + CLCD_TIM2); in pl111_clk_div_set_rate()
524 spin_unlock(&priv->tim2_lock); in pl111_clk_div_set_rate()
538 struct pl111_drm_dev_private *priv = drm->dev_private; in pl111_init_clock_divider()
539 struct clk *parent = devm_clk_get(drm->dev, "clcdclk"); in pl111_init_clock_divider()
540 struct clk_hw *div = &priv->clk_div; in pl111_init_clock_divider()
552 dev_err(drm->dev, "CLCD: unable to get clcdclk.\n"); in pl111_init_clock_divider()
556 spin_lock_init(&priv->tim2_lock); in pl111_init_clock_divider()
559 if (priv->variant->broken_clockdivider) { in pl111_init_clock_divider()
560 priv->clk = parent; in pl111_init_clock_divider()
564 div->init = &init; in pl111_init_clock_divider()
566 ret = devm_clk_hw_register(drm->dev, div); in pl111_init_clock_divider()
568 priv->clk = div->clk; in pl111_init_clock_divider()
574 struct pl111_drm_dev_private *priv = drm->dev_private; in pl111_display_init()
581 if (!priv->variant->broken_vblank) { in pl111_display_init()
586 ret = drm_simple_display_pipe_init(drm, &priv->pipe, in pl111_display_init()
588 priv->variant->formats, in pl111_display_init()
589 priv->variant->nformats, in pl111_display_init()
591 priv->connector); in pl111_display_init()