Lines Matching +full:clock +full:- +full:mode

1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright © 2006-2011 Intel Corporation
48 /* The single-channel range is 25-112Mhz, and dual-channel
49 * is 80-224Mhz. Prefer single channel as much as possible.
68 static void psb_intel_clock(int refclk, struct gma_clock_t *clock) in psb_intel_clock() argument
70 clock->m = 5 * (clock->m1 + 2) + (clock->m2 + 2); in psb_intel_clock()
71 clock->p = clock->p1 * clock->p2; in psb_intel_clock()
72 clock->vco = refclk * clock->m / (clock->n + 2); in psb_intel_clock()
73 clock->dot = clock->vco / clock->p; in psb_intel_clock()
78 * or -1 if the panel fitter is not present or not in use
88 return -1; in psb_intel_panel_fitter_pipe()
94 struct drm_display_mode *mode, in psb_intel_crtc_mode_set() argument
99 struct drm_device *dev = crtc->dev; in psb_intel_crtc_mode_set()
102 const struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private; in psb_intel_crtc_mode_set()
103 int pipe = gma_crtc->pipe; in psb_intel_crtc_mode_set()
104 const struct psb_offset *map = &dev_priv->regmap[pipe]; in psb_intel_crtc_mode_set()
106 struct gma_clock_t clock; in psb_intel_crtc_mode_set() local
115 if (crtc->primary->fb == NULL) { in psb_intel_crtc_mode_set()
116 crtc_funcs->mode_set_base(crtc, x, y, old_fb); in psb_intel_crtc_mode_set()
124 if (!connector->encoder in psb_intel_crtc_mode_set()
125 || connector->encoder->crtc != crtc) in psb_intel_crtc_mode_set()
128 switch (gma_encoder->type) { in psb_intel_crtc_mode_set()
146 limit = gma_crtc->clock_funcs->limit(crtc, refclk); in psb_intel_crtc_mode_set()
148 ok = limit->find_pll(limit, crtc, adjusted_mode->clock, refclk, in psb_intel_crtc_mode_set()
149 &clock); in psb_intel_crtc_mode_set()
151 DRM_ERROR("Couldn't find PLL settings for mode! target: %d, actual: %d", in psb_intel_crtc_mode_set()
152 adjusted_mode->clock, clock.dot); in psb_intel_crtc_mode_set()
156 fp = clock.n << 16 | clock.m1 << 8 | clock.m2; in psb_intel_crtc_mode_set()
166 adjusted_mode->clock / mode->clock; in psb_intel_crtc_mode_set()
169 (sdvo_pixel_multiply - 1) << SDVO_MULTIPLIER_SHIFT_HIRES; in psb_intel_crtc_mode_set()
173 dpll |= (1 << (clock.p1 - 1)) << 16; in psb_intel_crtc_mode_set()
174 switch (clock.p2) { in psb_intel_crtc_mode_set()
197 pipeconf = REG_READ(map->conf); in psb_intel_crtc_mode_set()
216 drm_mode_debug_printmodeline(mode); in psb_intel_crtc_mode_set()
219 REG_WRITE(map->fp0, fp); in psb_intel_crtc_mode_set()
220 REG_WRITE(map->dpll, dpll & ~DPLL_VCO_ENABLE); in psb_intel_crtc_mode_set()
221 REG_READ(map->dpll); in psb_intel_crtc_mode_set()
237 /* Set the B0-B3 data pairs corresponding to in psb_intel_crtc_mode_set()
239 * set the DPLLs for dual-channel mode or not. in psb_intel_crtc_mode_set()
242 if (clock.p2 == 7) in psb_intel_crtc_mode_set()
245 /* It would be nice to set 24 vs 18-bit mode (LVDS_A3_POWER_UP) in psb_intel_crtc_mode_set()
254 REG_WRITE(map->fp0, fp); in psb_intel_crtc_mode_set()
255 REG_WRITE(map->dpll, dpll); in psb_intel_crtc_mode_set()
256 REG_READ(map->dpll); in psb_intel_crtc_mode_set()
260 /* write it again -- the BIOS does, after all */ in psb_intel_crtc_mode_set()
261 REG_WRITE(map->dpll, dpll); in psb_intel_crtc_mode_set()
263 REG_READ(map->dpll); in psb_intel_crtc_mode_set()
267 REG_WRITE(map->htotal, (adjusted_mode->crtc_hdisplay - 1) | in psb_intel_crtc_mode_set()
268 ((adjusted_mode->crtc_htotal - 1) << 16)); in psb_intel_crtc_mode_set()
269 REG_WRITE(map->hblank, (adjusted_mode->crtc_hblank_start - 1) | in psb_intel_crtc_mode_set()
270 ((adjusted_mode->crtc_hblank_end - 1) << 16)); in psb_intel_crtc_mode_set()
271 REG_WRITE(map->hsync, (adjusted_mode->crtc_hsync_start - 1) | in psb_intel_crtc_mode_set()
272 ((adjusted_mode->crtc_hsync_end - 1) << 16)); in psb_intel_crtc_mode_set()
273 REG_WRITE(map->vtotal, (adjusted_mode->crtc_vdisplay - 1) | in psb_intel_crtc_mode_set()
274 ((adjusted_mode->crtc_vtotal - 1) << 16)); in psb_intel_crtc_mode_set()
275 REG_WRITE(map->vblank, (adjusted_mode->crtc_vblank_start - 1) | in psb_intel_crtc_mode_set()
276 ((adjusted_mode->crtc_vblank_end - 1) << 16)); in psb_intel_crtc_mode_set()
277 REG_WRITE(map->vsync, (adjusted_mode->crtc_vsync_start - 1) | in psb_intel_crtc_mode_set()
278 ((adjusted_mode->crtc_vsync_end - 1) << 16)); in psb_intel_crtc_mode_set()
282 REG_WRITE(map->size, in psb_intel_crtc_mode_set()
283 ((mode->vdisplay - 1) << 16) | (mode->hdisplay - 1)); in psb_intel_crtc_mode_set()
284 REG_WRITE(map->pos, 0); in psb_intel_crtc_mode_set()
285 REG_WRITE(map->src, in psb_intel_crtc_mode_set()
286 ((mode->hdisplay - 1) << 16) | (mode->vdisplay - 1)); in psb_intel_crtc_mode_set()
287 REG_WRITE(map->conf, pipeconf); in psb_intel_crtc_mode_set()
288 REG_READ(map->conf); in psb_intel_crtc_mode_set()
292 REG_WRITE(map->cntr, dspcntr); in psb_intel_crtc_mode_set()
295 crtc_funcs->mode_set_base(crtc, x, y, old_fb); in psb_intel_crtc_mode_set()
302 /* Returns the clock of the currently programmed mode of the given pipe. */
308 int pipe = gma_crtc->pipe; in psb_intel_crtc_clock_get()
309 const struct psb_offset *map = &dev_priv->regmap[pipe]; in psb_intel_crtc_clock_get()
312 struct gma_clock_t clock; in psb_intel_crtc_clock_get() local
314 struct psb_pipe *p = &dev_priv->regs.pipe[pipe]; in psb_intel_crtc_clock_get()
317 dpll = REG_READ(map->dpll); in psb_intel_crtc_clock_get()
319 fp = REG_READ(map->fp0); in psb_intel_crtc_clock_get()
321 fp = REG_READ(map->fp1); in psb_intel_crtc_clock_get()
325 dpll = p->dpll; in psb_intel_crtc_clock_get()
328 fp = p->fp0; in psb_intel_crtc_clock_get()
330 fp = p->fp1; in psb_intel_crtc_clock_get()
332 is_lvds = (pipe == 1) && (dev_priv->regs.psb.saveLVDS & in psb_intel_crtc_clock_get()
336 clock.m1 = (fp & FP_M1_DIV_MASK) >> FP_M1_DIV_SHIFT; in psb_intel_crtc_clock_get()
337 clock.m2 = (fp & FP_M2_DIV_MASK) >> FP_M2_DIV_SHIFT; in psb_intel_crtc_clock_get()
338 clock.n = (fp & FP_N_DIV_MASK) >> FP_N_DIV_SHIFT; in psb_intel_crtc_clock_get()
341 clock.p1 = in psb_intel_crtc_clock_get()
345 clock.p2 = 14; in psb_intel_crtc_clock_get()
350 psb_intel_clock(66000, &clock); in psb_intel_crtc_clock_get()
352 psb_intel_clock(48000, &clock); in psb_intel_crtc_clock_get()
355 clock.p1 = 2; in psb_intel_crtc_clock_get()
357 clock.p1 = in psb_intel_crtc_clock_get()
363 clock.p2 = 4; in psb_intel_crtc_clock_get()
365 clock.p2 = 2; in psb_intel_crtc_clock_get()
367 psb_intel_clock(48000, &clock); in psb_intel_crtc_clock_get()
375 return clock.dot; in psb_intel_crtc_clock_get()
378 /** Returns the currently programmed mode of the given pipe. */
383 int pipe = gma_crtc->pipe; in psb_intel_crtc_mode_get()
384 struct drm_display_mode *mode; in psb_intel_crtc_mode_get() local
390 struct psb_pipe *p = &dev_priv->regs.pipe[pipe]; in psb_intel_crtc_mode_get()
391 const struct psb_offset *map = &dev_priv->regmap[pipe]; in psb_intel_crtc_mode_get()
394 htot = REG_READ(map->htotal); in psb_intel_crtc_mode_get()
395 hsync = REG_READ(map->hsync); in psb_intel_crtc_mode_get()
396 vtot = REG_READ(map->vtotal); in psb_intel_crtc_mode_get()
397 vsync = REG_READ(map->vsync); in psb_intel_crtc_mode_get()
400 htot = p->htotal; in psb_intel_crtc_mode_get()
401 hsync = p->hsync; in psb_intel_crtc_mode_get()
402 vtot = p->vtotal; in psb_intel_crtc_mode_get()
403 vsync = p->vsync; in psb_intel_crtc_mode_get()
406 mode = kzalloc(sizeof(*mode), GFP_KERNEL); in psb_intel_crtc_mode_get()
407 if (!mode) in psb_intel_crtc_mode_get()
410 mode->clock = psb_intel_crtc_clock_get(dev, crtc); in psb_intel_crtc_mode_get()
411 mode->hdisplay = (htot & 0xffff) + 1; in psb_intel_crtc_mode_get()
412 mode->htotal = ((htot & 0xffff0000) >> 16) + 1; in psb_intel_crtc_mode_get()
413 mode->hsync_start = (hsync & 0xffff) + 1; in psb_intel_crtc_mode_get()
414 mode->hsync_end = ((hsync & 0xffff0000) >> 16) + 1; in psb_intel_crtc_mode_get()
415 mode->vdisplay = (vtot & 0xffff) + 1; in psb_intel_crtc_mode_get()
416 mode->vtotal = ((vtot & 0xffff0000) >> 16) + 1; in psb_intel_crtc_mode_get()
417 mode->vsync_start = (vsync & 0xffff) + 1; in psb_intel_crtc_mode_get()
418 mode->vsync_end = ((vsync & 0xffff0000) >> 16) + 1; in psb_intel_crtc_mode_get()
420 drm_mode_set_name(mode); in psb_intel_crtc_mode_get()
421 drm_mode_set_crtcinfo(mode, 0); in psb_intel_crtc_mode_get()
423 return mode; in psb_intel_crtc_mode_get()
436 .clock = psb_intel_clock,
453 if (dev_priv->ops->cursor_needs_phys) { in psb_intel_cursor_init()
459 gma_crtc->cursor_pobj = NULL; in psb_intel_cursor_init()
462 gma_crtc->cursor_pobj = cursor_pobj; in psb_intel_cursor_init()
463 gma_crtc->cursor_addr = dev_priv->stolen_base + cursor_pobj->offset; in psb_intel_cursor_init()
465 gma_crtc->cursor_pobj = NULL; in psb_intel_cursor_init()
469 REG_WRITE(control[gma_crtc->pipe], 0); in psb_intel_cursor_init()
470 REG_WRITE(base[gma_crtc->pipe], 0); in psb_intel_cursor_init()
488 gma_crtc->crtc_state = in psb_intel_crtc_init()
490 if (!gma_crtc->crtc_state) { in psb_intel_crtc_init()
491 dev_err(dev->dev, "Crtc state error: No memory\n"); in psb_intel_crtc_init()
496 drm_crtc_init(dev, &gma_crtc->base, &gma_crtc_funcs); in psb_intel_crtc_init()
498 /* Set the CRTC clock functions from chip specific data */ in psb_intel_crtc_init()
499 gma_crtc->clock_funcs = dev_priv->ops->clock_funcs; in psb_intel_crtc_init()
501 drm_mode_crtc_set_gamma_size(&gma_crtc->base, 256); in psb_intel_crtc_init()
502 gma_crtc->pipe = pipe; in psb_intel_crtc_init()
503 gma_crtc->plane = pipe; in psb_intel_crtc_init()
506 gma_crtc->lut_adj[i] = 0; in psb_intel_crtc_init()
508 gma_crtc->mode_dev = mode_dev; in psb_intel_crtc_init()
509 gma_crtc->cursor_addr = 0; in psb_intel_crtc_init()
511 drm_crtc_helper_add(&gma_crtc->base, in psb_intel_crtc_init()
512 dev_priv->ops->crtc_helper); in psb_intel_crtc_init()
515 gma_crtc->mode_set.crtc = &gma_crtc->base; in psb_intel_crtc_init()
516 BUG_ON(pipe >= ARRAY_SIZE(dev_priv->plane_to_crtc_mapping) || in psb_intel_crtc_init()
517 dev_priv->plane_to_crtc_mapping[gma_crtc->plane] != NULL); in psb_intel_crtc_init()
518 dev_priv->plane_to_crtc_mapping[gma_crtc->plane] = &gma_crtc->base; in psb_intel_crtc_init()
519 dev_priv->pipe_to_crtc_mapping[gma_crtc->pipe] = &gma_crtc->base; in psb_intel_crtc_init()
520 gma_crtc->mode_set.connectors = (struct drm_connector **)(gma_crtc + 1); in psb_intel_crtc_init()
521 gma_crtc->mode_set.num_connectors = 0; in psb_intel_crtc_init()
525 gma_crtc->active = true; in psb_intel_crtc_init()
532 list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { in psb_intel_get_crtc_from_pipe()
535 if (gma_crtc->pipe == pipe) in psb_intel_get_crtc_from_pipe()
551 if (type_mask & (1 << gma_encoder->type)) in gma_connector_clones()