Subversion Repositories Kolibri OS

Rev

Rev 4560 | Rev 5354 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 4560 Rev 5060
Line 296... Line 296...
296
	tmp |= DSI_PLL_LDO_GATE;
296
	tmp |= DSI_PLL_LDO_GATE;
297
	vlv_cck_write(dev_priv, CCK_REG_DSI_PLL_CONTROL, tmp);
297
	vlv_cck_write(dev_priv, CCK_REG_DSI_PLL_CONTROL, tmp);
Line 298... Line 298...
298
 
298
 
299
	mutex_unlock(&dev_priv->dpio_lock);
299
	mutex_unlock(&dev_priv->dpio_lock);
-
 
300
}
-
 
301
 
-
 
302
static void assert_bpp_mismatch(int pixel_format, int pipe_bpp)
-
 
303
{
-
 
304
	int bpp;
-
 
305
 
-
 
306
	switch (pixel_format) {
-
 
307
	default:
-
 
308
	case VID_MODE_FORMAT_RGB888:
-
 
309
	case VID_MODE_FORMAT_RGB666_LOOSE:
-
 
310
		bpp = 24;
-
 
311
		break;
-
 
312
	case VID_MODE_FORMAT_RGB666:
-
 
313
		bpp = 18;
-
 
314
		break;
-
 
315
	case VID_MODE_FORMAT_RGB565:
-
 
316
		bpp = 16;
-
 
317
		break;
-
 
318
	}
-
 
319
 
-
 
320
	WARN(bpp != pipe_bpp,
-
 
321
		"bpp match assertion failure (expected %d, current %d)\n",
-
 
322
		bpp, pipe_bpp);
-
 
323
}
-
 
324
 
-
 
325
u32 vlv_get_dsi_pclk(struct intel_encoder *encoder, int pipe_bpp)
-
 
326
{
-
 
327
	struct drm_i915_private *dev_priv = encoder->base.dev->dev_private;
-
 
328
	struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
-
 
329
	u32 dsi_clock, pclk;
-
 
330
	u32 pll_ctl, pll_div;
-
 
331
	u32 m = 0, p = 0;
-
 
332
	int refclk = 25000;
-
 
333
	int i;
-
 
334
 
-
 
335
	DRM_DEBUG_KMS("\n");
-
 
336
 
-
 
337
	mutex_lock(&dev_priv->dpio_lock);
-
 
338
	pll_ctl = vlv_cck_read(dev_priv, CCK_REG_DSI_PLL_CONTROL);
-
 
339
	pll_div = vlv_cck_read(dev_priv, CCK_REG_DSI_PLL_DIVIDER);
-
 
340
	mutex_unlock(&dev_priv->dpio_lock);
-
 
341
 
-
 
342
	/* mask out other bits and extract the P1 divisor */
-
 
343
	pll_ctl &= DSI_PLL_P1_POST_DIV_MASK;
-
 
344
	pll_ctl = pll_ctl >> (DSI_PLL_P1_POST_DIV_SHIFT - 2);
-
 
345
 
-
 
346
	/* mask out the other bits and extract the M1 divisor */
-
 
347
	pll_div &= DSI_PLL_M1_DIV_MASK;
-
 
348
	pll_div = pll_div >> DSI_PLL_M1_DIV_SHIFT;
-
 
349
 
-
 
350
	while (pll_ctl) {
-
 
351
		pll_ctl = pll_ctl >> 1;
-
 
352
		p++;
-
 
353
	}
-
 
354
	p--;
-
 
355
 
-
 
356
	if (!p) {
-
 
357
		DRM_ERROR("wrong P1 divisor\n");
-
 
358
		return 0;
-
 
359
	}
-
 
360
 
-
 
361
	for (i = 0; i < ARRAY_SIZE(lfsr_converts); i++) {
-
 
362
		if (lfsr_converts[i] == pll_div)
-
 
363
			break;
-
 
364
	}
-
 
365
 
-
 
366
	if (i == ARRAY_SIZE(lfsr_converts)) {
-
 
367
		DRM_ERROR("wrong m_seed programmed\n");
-
 
368
		return 0;
-
 
369
	}
-
 
370
 
-
 
371
	m = i + 62;
-
 
372
 
-
 
373
	dsi_clock = (m * refclk) / p;
-
 
374
 
-
 
375
	/* pixel_format and pipe_bpp should agree */
-
 
376
	assert_bpp_mismatch(intel_dsi->pixel_format, pipe_bpp);
-
 
377
 
-
 
378
	pclk = DIV_ROUND_CLOSEST(dsi_clock * intel_dsi->lane_count, pipe_bpp);
-
 
379
 
-
 
380
	return pclk;