int intel_configure_dsi_pll(struct intel_dsi *intel_dsi,
		struct drm_display_mode *mode)
{
	struct drm_i915_private *dev_priv =
			intel_dsi->base.base.dev->dev_private;
	int ret;
	struct dsi_mnp dsi_mnp;
	u32 dsi_clk;

	DRM_DEBUG_KMS("\n");

	if (intel_dsi->dsi_clock_freq)
		dsi_clk = intel_dsi->dsi_clock_freq;
	else
		get_dsi_clk(intel_dsi, mode, &dsi_clk);

	ret = dsi_calc_mnp(dsi_clk, &dsi_mnp);
	/*ret = mnp_from_clk_table(dsi_clk, &dsi_mnp);*/

	if (ret != 0)
		return ret;

	dsi_mnp.dsi_pll_ctrl |= DSI_PLL_CLK_GATE_DSI0_DSIPLL;

	DRM_DEBUG_KMS("dsi pll div %08x, ctrl %08x\n",
			dsi_mnp.dsi_pll_div, dsi_mnp.dsi_pll_ctrl);

	vlv_cck_write(dev_priv, CCK_REG_DSI_PLL_CONTROL, 0);
	vlv_cck_write(dev_priv, CCK_REG_DSI_PLL_DIVIDER, dsi_mnp.dsi_pll_div);
	vlv_cck_write(dev_priv, CCK_REG_DSI_PLL_CONTROL, dsi_mnp.dsi_pll_ctrl);

	return 0;
}
Пример #2
0
/*
 * XXX: The muxing and gating is hard coded for now. Need to add support for
 * sharing PLLs with two DSI outputs.
 */
int vlv_dsi_pll_compute(struct intel_encoder *encoder,
			struct intel_crtc_state *config)
{
	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
	struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
	int ret;
	u32 dsi_clk;

	dsi_clk = dsi_clk_from_pclk(intel_dsi->pclk, intel_dsi->pixel_format,
				    intel_dsi->lane_count);

	ret = dsi_calc_mnp(dev_priv, config, dsi_clk);
	if (ret) {
		DRM_DEBUG_KMS("dsi_calc_mnp failed\n");
		return ret;
	}

	if (intel_dsi->ports & (1 << PORT_A))
		config->dsi_pll.ctrl |= DSI_PLL_CLK_GATE_DSI0_DSIPLL;

	if (intel_dsi->ports & (1 << PORT_C))
		config->dsi_pll.ctrl |= DSI_PLL_CLK_GATE_DSI1_DSIPLL;

	config->dsi_pll.ctrl |= DSI_PLL_VCO_EN;

	DRM_DEBUG_KMS("dsi pll div %08x, ctrl %08x\n",
		      config->dsi_pll.div, config->dsi_pll.ctrl);

	return 0;
}
int intel_calculate_dsi_pll_mnp(struct intel_dsi *intel_dsi,
		struct drm_display_mode *mode,
			struct intel_dsi_mnp *intel_dsi_mnp, u32 dsi_clk)
{
	int ret;

	if (dsi_clk == 0) {
		ret = intel_get_dsi_clk(intel_dsi, mode, &dsi_clk);
		if (ret < 0)
			return ret;
	}

	return dsi_calc_mnp(dsi_clk, intel_dsi_mnp);
}
int intel_configure_dsi_pll(struct intel_dsi *intel_dsi,
		struct drm_display_mode *mode)
{
	struct drm_i915_private *dev_priv =
			intel_dsi->base.base.dev->dev_private;
	int ret;
	struct dsi_mnp dsi_mnp;
	u32 dsi_clk;


	get_dsi_clk(intel_dsi, mode, &dsi_clk);
	ret = dsi_calc_mnp(dsi_clk, &dsi_mnp);
	/*ret = mnp_from_clk_table(dsi_clk, &dsi_mnp);*/

	if (ret != 0)
		return ret;

	intel_cck_write32(dev_priv, 0x48, 0x00000000);
	intel_cck_write32(dev_priv, 0x4C, dsi_mnp.dsi_pll_div);
	intel_cck_write32(dev_priv, 0x48, dsi_mnp.dsi_pll_ctrl);

	return 0;
}