[PATCH 1/5] drm/i915/lvds: Deduplicate register retrieval
Imre Deak
imre.deak at intel.com
Wed Jun 22 13:35:16 UTC 2016
Signed-off-by: Imre Deak <imre.deak at intel.com>
---
drivers/gpu/drm/i915/intel_lvds.c | 91 ++++++++++++++++++++-------------------
1 file changed, 47 insertions(+), 44 deletions(-)
diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c
index 935b536..83fe349 100644
--- a/drivers/gpu/drm/i915/intel_lvds.c
+++ b/drivers/gpu/drm/i915/intel_lvds.c
@@ -48,6 +48,15 @@ struct intel_lvds_connector {
struct notifier_block lid_notifier;
};
+struct lvds_registers {
+ i915_reg_t lvds;
+ i915_reg_t pp_ctrl;
+ i915_reg_t pp_stat;
+ i915_reg_t pp_on;
+ i915_reg_t pp_off;
+ i915_reg_t pp_div;
+};
+
struct intel_lvds_encoder {
struct intel_encoder base;
@@ -55,6 +64,8 @@ struct intel_lvds_encoder {
i915_reg_t reg;
u32 a3_power;
+ struct lvds_registers regs;
+
struct intel_lvds_connector *attached_connector;
};
@@ -217,21 +228,13 @@ static void intel_enable_lvds(struct intel_encoder *encoder)
struct intel_connector *intel_connector =
&lvds_encoder->attached_connector->base;
struct drm_i915_private *dev_priv = dev->dev_private;
- i915_reg_t ctl_reg, stat_reg;
+ struct lvds_registers *regs = &lvds_encoder->regs;
- if (HAS_PCH_SPLIT(dev)) {
- ctl_reg = PCH_PP_CONTROL;
- stat_reg = PCH_PP_STATUS;
- } else {
- ctl_reg = PP_CONTROL;
- stat_reg = PP_STATUS;
- }
+ I915_WRITE(regs->lvds, I915_READ(regs->lvds) | LVDS_PORT_EN);
- I915_WRITE(lvds_encoder->reg, I915_READ(lvds_encoder->reg) | LVDS_PORT_EN);
-
- I915_WRITE(ctl_reg, I915_READ(ctl_reg) | POWER_TARGET_ON);
- POSTING_READ(lvds_encoder->reg);
- if (wait_for((I915_READ(stat_reg) & PP_ON) != 0, 1000))
+ I915_WRITE(regs->pp_ctrl, I915_READ(regs->pp_ctrl) | POWER_TARGET_ON);
+ POSTING_READ(regs->lvds);
+ if (wait_for((I915_READ(regs->pp_stat) & PP_ON) != 0, 1000))
DRM_ERROR("timed out waiting for panel to power on\n");
intel_panel_enable_backlight(intel_connector);
@@ -242,22 +245,14 @@ static void intel_disable_lvds(struct intel_encoder *encoder)
struct drm_device *dev = encoder->base.dev;
struct intel_lvds_encoder *lvds_encoder = to_lvds_encoder(&encoder->base);
struct drm_i915_private *dev_priv = dev->dev_private;
- i915_reg_t ctl_reg, stat_reg;
+ struct lvds_registers *regs = &lvds_encoder->regs;
- if (HAS_PCH_SPLIT(dev)) {
- ctl_reg = PCH_PP_CONTROL;
- stat_reg = PCH_PP_STATUS;
- } else {
- ctl_reg = PP_CONTROL;
- stat_reg = PP_STATUS;
- }
-
- I915_WRITE(ctl_reg, I915_READ(ctl_reg) & ~POWER_TARGET_ON);
- if (wait_for((I915_READ(stat_reg) & PP_ON) == 0, 1000))
+ I915_WRITE(regs->pp_ctrl, I915_READ(regs->pp_ctrl) & ~POWER_TARGET_ON);
+ if (wait_for((I915_READ(regs->pp_stat) & PP_ON) == 0, 1000))
DRM_ERROR("timed out waiting for panel to power off\n");
- I915_WRITE(lvds_encoder->reg, I915_READ(lvds_encoder->reg) & ~LVDS_PORT_EN);
- POSTING_READ(lvds_encoder->reg);
+ I915_WRITE(regs->lvds, I915_READ(regs->lvds) & ~LVDS_PORT_EN);
+ POSTING_READ(regs->lvds);
}
static void gmch_disable_lvds(struct intel_encoder *encoder)
@@ -894,22 +889,35 @@ void intel_lvds_init(struct drm_device *dev)
struct drm_display_mode *downclock_mode = NULL;
struct edid *edid;
struct drm_crtc *crtc;
- i915_reg_t lvds_reg;
+ struct lvds_registers regs;
u32 lvds;
int pipe;
u8 pin;
+ if (HAS_PCH_SPLIT(dev_priv)) {
+ regs.lvds = PCH_LVDS;
+ regs.pp_ctrl = PCH_PP_CONTROL;
+ regs.pp_stat = PCH_PP_STATUS;
+ regs.pp_on = PCH_PP_ON_DELAYS;
+ regs.pp_off = PCH_PP_OFF_DELAYS;
+ regs.pp_div = PCH_PP_DIVISOR;
+ } else {
+ regs.lvds = LVDS;
+ regs.pp_ctrl = PP_CONTROL;
+ regs.pp_stat = PP_STATUS;
+ regs.pp_on = PP_ON_DELAYS;
+ regs.pp_off = PP_OFF_DELAYS;
+ regs.pp_div = PP_DIVISOR;
+ }
+
/*
* Unlock registers and just leave them unlocked. Do this before
* checking quirk lists to avoid bogus WARNINGs.
*/
- if (HAS_PCH_SPLIT(dev)) {
- I915_WRITE(PCH_PP_CONTROL,
- I915_READ(PCH_PP_CONTROL) | PANEL_UNLOCK_REGS);
- } else if (INTEL_INFO(dev_priv)->gen < 5) {
- I915_WRITE(PP_CONTROL,
- I915_READ(PP_CONTROL) | PANEL_UNLOCK_REGS);
- }
+ if (INTEL_INFO(dev_priv)->gen <= 5)
+ I915_WRITE(regs.pp_ctrl,
+ I915_READ(regs.pp_ctrl) | PANEL_UNLOCK_REGS);
+
if (!intel_lvds_supported(dev))
return;
@@ -917,12 +925,7 @@ void intel_lvds_init(struct drm_device *dev)
if (dmi_check_system(intel_no_lvds))
return;
- if (HAS_PCH_SPLIT(dev))
- lvds_reg = PCH_LVDS;
- else
- lvds_reg = LVDS;
-
- lvds = I915_READ(lvds_reg);
+ lvds = I915_READ(regs.lvds);
if (HAS_PCH_SPLIT(dev)) {
if ((lvds & LVDS_DETECTED) == 0)
@@ -944,12 +947,12 @@ void intel_lvds_init(struct drm_device *dev)
/* Set the Panel Power On/Off timings if uninitialized. */
if (INTEL_INFO(dev_priv)->gen < 5 &&
- I915_READ(PP_ON_DELAYS) == 0 && I915_READ(PP_OFF_DELAYS) == 0) {
+ I915_READ(regs.pp_on) == 0 && I915_READ(regs.pp_off) == 0) {
/* Set T2 to 40ms and T5 to 200ms */
- I915_WRITE(PP_ON_DELAYS, 0x019007d0);
+ I915_WRITE(regs.pp_on, 0x019007d0);
/* Set T3 to 35ms and Tx to 200ms */
- I915_WRITE(PP_OFF_DELAYS, 0x015e07d0);
+ I915_WRITE(regs.pp_off, 0x015e07d0);
DRM_DEBUG_KMS("Panel power timings uninitialized, setting defaults\n");
}
@@ -1011,7 +1014,7 @@ void intel_lvds_init(struct drm_device *dev)
connector->interlace_allowed = false;
connector->doublescan_allowed = false;
- lvds_encoder->reg = lvds_reg;
+ lvds_encoder->regs = regs;
/* create the scaling mode property */
drm_mode_create_scaling_mode_property(dev);
--
2.5.0
More information about the Intel-gfx-trybot
mailing list