diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_dsi_pll.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_dsi_pll.c | 42 |
1 files changed, 25 insertions, 17 deletions
diff --git a/drivers/gpu/drm/i915/intel_dsi_pll.c b/drivers/gpu/drm/i915/intel_dsi_pll.c index 1765e6e18f2c..6ab58a01b18e 100644 --- a/drivers/gpu/drm/i915/intel_dsi_pll.c +++ b/drivers/gpu/drm/i915/intel_dsi_pll.c | |||
@@ -55,12 +55,10 @@ static int dsi_calc_mnp(struct drm_i915_private *dev_priv, | |||
55 | struct intel_crtc_state *config, | 55 | struct intel_crtc_state *config, |
56 | int target_dsi_clk) | 56 | int target_dsi_clk) |
57 | { | 57 | { |
58 | unsigned int calc_m = 0, calc_p = 0; | ||
59 | unsigned int m_min, m_max, p_min = 2, p_max = 6; | 58 | unsigned int m_min, m_max, p_min = 2, p_max = 6; |
60 | unsigned int m, n, p; | 59 | unsigned int m, n, p; |
61 | int ref_clk; | 60 | unsigned int calc_m, calc_p; |
62 | int delta = target_dsi_clk; | 61 | int delta, ref_clk; |
63 | u32 m_seed; | ||
64 | 62 | ||
65 | /* target_dsi_clk is expected in kHz */ | 63 | /* target_dsi_clk is expected in kHz */ |
66 | if (target_dsi_clk < 300000 || target_dsi_clk > 1150000) { | 64 | if (target_dsi_clk < 300000 || target_dsi_clk > 1150000) { |
@@ -80,6 +78,10 @@ static int dsi_calc_mnp(struct drm_i915_private *dev_priv, | |||
80 | m_max = 92; | 78 | m_max = 92; |
81 | } | 79 | } |
82 | 80 | ||
81 | calc_p = p_min; | ||
82 | calc_m = m_min; | ||
83 | delta = abs(target_dsi_clk - (m_min * ref_clk) / (p_min * n)); | ||
84 | |||
83 | for (m = m_min; m <= m_max && delta; m++) { | 85 | for (m = m_min; m <= m_max && delta; m++) { |
84 | for (p = p_min; p <= p_max && delta; p++) { | 86 | for (p = p_min; p <= p_max && delta; p++) { |
85 | /* | 87 | /* |
@@ -97,11 +99,10 @@ static int dsi_calc_mnp(struct drm_i915_private *dev_priv, | |||
97 | } | 99 | } |
98 | 100 | ||
99 | /* register has log2(N1), this works fine for powers of two */ | 101 | /* register has log2(N1), this works fine for powers of two */ |
100 | n = ffs(n) - 1; | ||
101 | m_seed = lfsr_converts[calc_m - 62]; | ||
102 | config->dsi_pll.ctrl = 1 << (DSI_PLL_P1_POST_DIV_SHIFT + calc_p - 2); | 102 | config->dsi_pll.ctrl = 1 << (DSI_PLL_P1_POST_DIV_SHIFT + calc_p - 2); |
103 | config->dsi_pll.div = n << DSI_PLL_N1_DIV_SHIFT | | 103 | config->dsi_pll.div = |
104 | m_seed << DSI_PLL_M1_DIV_SHIFT; | 104 | (ffs(n) - 1) << DSI_PLL_N1_DIV_SHIFT | |
105 | (u32)lfsr_converts[calc_m - 62] << DSI_PLL_M1_DIV_SHIFT; | ||
105 | 106 | ||
106 | return 0; | 107 | return 0; |
107 | } | 108 | } |
@@ -113,7 +114,7 @@ static int dsi_calc_mnp(struct drm_i915_private *dev_priv, | |||
113 | static int vlv_compute_dsi_pll(struct intel_encoder *encoder, | 114 | static int vlv_compute_dsi_pll(struct intel_encoder *encoder, |
114 | struct intel_crtc_state *config) | 115 | struct intel_crtc_state *config) |
115 | { | 116 | { |
116 | struct drm_i915_private *dev_priv = encoder->base.dev->dev_private; | 117 | struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); |
117 | struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base); | 118 | struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base); |
118 | int ret; | 119 | int ret; |
119 | u32 dsi_clk; | 120 | u32 dsi_clk; |
@@ -234,8 +235,11 @@ static void bxt_disable_dsi_pll(struct intel_encoder *encoder) | |||
234 | * PLL lock should deassert within 200us. | 235 | * PLL lock should deassert within 200us. |
235 | * Wait up to 1ms before timing out. | 236 | * Wait up to 1ms before timing out. |
236 | */ | 237 | */ |
237 | if (wait_for((I915_READ(BXT_DSI_PLL_ENABLE) | 238 | if (intel_wait_for_register(dev_priv, |
238 | & BXT_DSI_PLL_LOCKED) == 0, 1)) | 239 | BXT_DSI_PLL_ENABLE, |
240 | BXT_DSI_PLL_LOCKED, | ||
241 | 0, | ||
242 | 1)) | ||
239 | DRM_ERROR("Timeout waiting for PLL lock deassertion\n"); | 243 | DRM_ERROR("Timeout waiting for PLL lock deassertion\n"); |
240 | } | 244 | } |
241 | 245 | ||
@@ -321,7 +325,7 @@ static u32 bxt_dsi_get_pclk(struct intel_encoder *encoder, int pipe_bpp, | |||
321 | u32 dsi_clk; | 325 | u32 dsi_clk; |
322 | u32 dsi_ratio; | 326 | u32 dsi_ratio; |
323 | struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base); | 327 | struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base); |
324 | struct drm_i915_private *dev_priv = encoder->base.dev->dev_private; | 328 | struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); |
325 | 329 | ||
326 | /* Divide by zero */ | 330 | /* Divide by zero */ |
327 | if (!pipe_bpp) { | 331 | if (!pipe_bpp) { |
@@ -356,7 +360,7 @@ u32 intel_dsi_get_pclk(struct intel_encoder *encoder, int pipe_bpp, | |||
356 | static void vlv_dsi_reset_clocks(struct intel_encoder *encoder, enum port port) | 360 | static void vlv_dsi_reset_clocks(struct intel_encoder *encoder, enum port port) |
357 | { | 361 | { |
358 | u32 temp; | 362 | u32 temp; |
359 | struct drm_i915_private *dev_priv = encoder->base.dev->dev_private; | 363 | struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); |
360 | struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base); | 364 | struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base); |
361 | 365 | ||
362 | temp = I915_READ(MIPI_CTRL(port)); | 366 | temp = I915_READ(MIPI_CTRL(port)); |
@@ -370,7 +374,7 @@ static void vlv_dsi_reset_clocks(struct intel_encoder *encoder, enum port port) | |||
370 | static void bxt_dsi_program_clocks(struct drm_device *dev, enum port port, | 374 | static void bxt_dsi_program_clocks(struct drm_device *dev, enum port port, |
371 | const struct intel_crtc_state *config) | 375 | const struct intel_crtc_state *config) |
372 | { | 376 | { |
373 | struct drm_i915_private *dev_priv = dev->dev_private; | 377 | struct drm_i915_private *dev_priv = to_i915(dev); |
374 | u32 tmp; | 378 | u32 tmp; |
375 | u32 dsi_rate = 0; | 379 | u32 dsi_rate = 0; |
376 | u32 pll_ratio = 0; | 380 | u32 pll_ratio = 0; |
@@ -465,7 +469,7 @@ static int bxt_compute_dsi_pll(struct intel_encoder *encoder, | |||
465 | static void bxt_enable_dsi_pll(struct intel_encoder *encoder, | 469 | static void bxt_enable_dsi_pll(struct intel_encoder *encoder, |
466 | const struct intel_crtc_state *config) | 470 | const struct intel_crtc_state *config) |
467 | { | 471 | { |
468 | struct drm_i915_private *dev_priv = encoder->base.dev->dev_private; | 472 | struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); |
469 | struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base); | 473 | struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base); |
470 | enum port port; | 474 | enum port port; |
471 | u32 val; | 475 | u32 val; |
@@ -486,7 +490,11 @@ static void bxt_enable_dsi_pll(struct intel_encoder *encoder, | |||
486 | I915_WRITE(BXT_DSI_PLL_ENABLE, val); | 490 | I915_WRITE(BXT_DSI_PLL_ENABLE, val); |
487 | 491 | ||
488 | /* Timeout and fail if PLL not locked */ | 492 | /* Timeout and fail if PLL not locked */ |
489 | if (wait_for(I915_READ(BXT_DSI_PLL_ENABLE) & BXT_DSI_PLL_LOCKED, 1)) { | 493 | if (intel_wait_for_register(dev_priv, |
494 | BXT_DSI_PLL_ENABLE, | ||
495 | BXT_DSI_PLL_LOCKED, | ||
496 | BXT_DSI_PLL_LOCKED, | ||
497 | 1)) { | ||
490 | DRM_ERROR("Timed out waiting for DSI PLL to lock\n"); | 498 | DRM_ERROR("Timed out waiting for DSI PLL to lock\n"); |
491 | return; | 499 | return; |
492 | } | 500 | } |
@@ -542,7 +550,7 @@ static void bxt_dsi_reset_clocks(struct intel_encoder *encoder, enum port port) | |||
542 | { | 550 | { |
543 | u32 tmp; | 551 | u32 tmp; |
544 | struct drm_device *dev = encoder->base.dev; | 552 | struct drm_device *dev = encoder->base.dev; |
545 | struct drm_i915_private *dev_priv = dev->dev_private; | 553 | struct drm_i915_private *dev_priv = to_i915(dev); |
546 | 554 | ||
547 | /* Clear old configurations */ | 555 | /* Clear old configurations */ |
548 | tmp = I915_READ(BXT_MIPI_CLOCK_CTL); | 556 | tmp = I915_READ(BXT_MIPI_CLOCK_CTL); |