summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZhao Yakui <yakui.zhao@intel.com>2012-05-28 05:58:09 -0400
committerZhenyu Wang <zhenyuw@linux.intel.com>2012-06-05 15:39:22 +0800
commit5f26f5dbb6219199cd2382e3b6d74c7dce1c721f (patch)
treeeb1dd899eb4df9e989e6fe29ba7d543022cb2024
parent3f3b4608409b270fe6e94020f3b97116ae6a6289 (diff)
Disable the clock gating of display controller to make DP/eDP work wellcdv-3.2
I don't know why the DP/eDP is affected by the clock gating. But the test shows that it really fixes the DP/eDP clock issue during enabling DP/eDP. Fix the issue in https://lecutus.jf.intel.com/ceg/ticket/300 Signed-off-by: Zhao Yakui <yakui.zhao@intel.com>
-rw-r--r--drivers/staging/cdv/drv/psb_fb.c19
-rw-r--r--drivers/staging/cdv/drv/psb_intel_drv.h2
-rw-r--r--drivers/staging/cdv/drv/psb_intel_reg.h4
-rw-r--r--drivers/staging/cdv/drv/psb_powermgmt.c2
4 files changed, 27 insertions, 0 deletions
diff --git a/drivers/staging/cdv/drv/psb_fb.c b/drivers/staging/cdv/drv/psb_fb.c
index 65dee822530..6e6d3488179 100644
--- a/drivers/staging/cdv/drv/psb_fb.c
+++ b/drivers/staging/cdv/drv/psb_fb.c
@@ -735,6 +735,23 @@ static int psb_bo_unpin_for_scanout(struct drm_device *dev, void *bo)
return 0;
}
+/* Cedarview display clock gating */
+void psb_intel_clock_gating (struct drm_device *dev)
+{
+ uint32_t reg_value;
+ reg_value = REG_READ(DSPCLK_GATE_D);
+
+ reg_value |= (DPUNIT_PIPEB_GATE_DISABLE |
+ DPUNIT_PIPEA_GATE_DISABLE |
+ DPCUNIT_CLOCK_GATE_DISABLE |
+ DPLSUNIT_CLOCK_GATE_DISABLE |
+ DPOUNIT_CLOCK_GATE_DISABLE |
+ DPIOUNIT_CLOCK_GATE_DISABLE);
+
+ REG_WRITE(DSPCLK_GATE_D, reg_value);
+
+ udelay(500);
+}
/* Cedarview display workarounds */
void psb_intel_display_wa (struct drm_device *dev)
{
@@ -771,6 +788,8 @@ void psb_modeset_init(struct drm_device *dev)
drm_mode_config_init(dev);
+ psb_intel_clock_gating(dev);
+
dev->mode_config.min_width = 0;
dev->mode_config.min_height = 0;
diff --git a/drivers/staging/cdv/drv/psb_intel_drv.h b/drivers/staging/cdv/drv/psb_intel_drv.h
index 2f4d40dd519..7b1443d73f9 100644
--- a/drivers/staging/cdv/drv/psb_intel_drv.h
+++ b/drivers/staging/cdv/drv/psb_intel_drv.h
@@ -281,4 +281,6 @@ extern u32 psb_intel_panel_get_backlight(struct drm_device *dev);
extern void psb_intel_panel_destroy_backlight(struct drm_device *dev);
extern int psb_intel_panel_setup_backlight(struct drm_device *dev);
+
+extern void psb_intel_clock_gating (struct drm_device *dev);
#endif /* __INTEL_DRV_H__ */
diff --git a/drivers/staging/cdv/drv/psb_intel_reg.h b/drivers/staging/cdv/drv/psb_intel_reg.h
index 20265dac641..f0bfb0c4c29 100644
--- a/drivers/staging/cdv/drv/psb_intel_reg.h
+++ b/drivers/staging/cdv/drv/psb_intel_reg.h
@@ -1402,6 +1402,10 @@ gamma settings.
# define VRHUNIT_CLOCK_GATE_DISABLE (1 << 28) /* Fixed value on CDV */
# define DPOUNIT_CLOCK_GATE_DISABLE (1 << 11)
# define DPIOUNIT_CLOCK_GATE_DISABLE (1 << 6)
+# define DPUNIT_PIPEB_GATE_DISABLE (1 << 30)
+# define DPUNIT_PIPEA_GATE_DISABLE (1 << 25)
+# define DPCUNIT_CLOCK_GATE_DISABLE (1 << 24)
+# define DPLSUNIT_CLOCK_GATE_DISABLE (1 << 13)
#define RAMCLK_GATE_D 0x6210
diff --git a/drivers/staging/cdv/drv/psb_powermgmt.c b/drivers/staging/cdv/drv/psb_powermgmt.c
index 8bb69990282..33ead94c3b8 100644
--- a/drivers/staging/cdv/drv/psb_powermgmt.c
+++ b/drivers/staging/cdv/drv/psb_powermgmt.c
@@ -563,6 +563,8 @@ int ospm_power_resume(struct pci_dev *pdev)
ospm_resume_pci(pdev);
+ psb_intel_clock_gating(gpDrmDevice);
+
psb_intel_opregion_setup(gpDrmDevice);
/* resume PVR power island and service */