drm/i915: Deduplicate PPS register retrieval
No functional change. Signed-off-by: Imre Deak <imre.deak@intel.com> Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Link: http://patchwork.freedesktop.org/patch/msgid/1466084243-5388-3-git-send-email-imre.deak@intel.com
This commit is contained in:
		
							parent
							
								
									7859799637
								
							
						
					
					
						commit
						8e8232d518
					
				| @ -571,30 +571,64 @@ void intel_power_sequencer_reset(struct drm_i915_private *dev_priv) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| struct pps_registers { | ||||
| 	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; | ||||
| }; | ||||
| 
 | ||||
| static void intel_pps_get_registers(struct drm_i915_private *dev_priv, | ||||
| 				    struct intel_dp *intel_dp, | ||||
| 				    struct pps_registers *regs) | ||||
| { | ||||
| 	memset(regs, 0, sizeof(*regs)); | ||||
| 
 | ||||
| 	if (IS_BROXTON(dev_priv)) { | ||||
| 		int idx = bxt_power_sequencer_idx(intel_dp); | ||||
| 
 | ||||
| 		regs->pp_ctrl = BXT_PP_CONTROL(idx); | ||||
| 		regs->pp_stat = BXT_PP_STATUS(idx); | ||||
| 		regs->pp_on = BXT_PP_ON_DELAYS(idx); | ||||
| 		regs->pp_off = BXT_PP_OFF_DELAYS(idx); | ||||
| 	} else if (HAS_PCH_SPLIT(dev_priv)) { | ||||
| 		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 { | ||||
| 		enum pipe pipe = vlv_power_sequencer_pipe(intel_dp); | ||||
| 
 | ||||
| 		regs->pp_ctrl = VLV_PIPE_PP_CONTROL(pipe); | ||||
| 		regs->pp_stat = VLV_PIPE_PP_STATUS(pipe); | ||||
| 		regs->pp_on = VLV_PIPE_PP_ON_DELAYS(pipe); | ||||
| 		regs->pp_off = VLV_PIPE_PP_OFF_DELAYS(pipe); | ||||
| 		regs->pp_div = VLV_PIPE_PP_DIVISOR(pipe); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| static i915_reg_t | ||||
| _pp_ctrl_reg(struct intel_dp *intel_dp) | ||||
| { | ||||
| 	struct drm_device *dev = intel_dp_to_dev(intel_dp); | ||||
| 	struct pps_registers regs; | ||||
| 
 | ||||
| 	if (IS_BROXTON(dev)) | ||||
| 		return BXT_PP_CONTROL(bxt_power_sequencer_idx(intel_dp)); | ||||
| 	else if (HAS_PCH_SPLIT(dev)) | ||||
| 		return PCH_PP_CONTROL; | ||||
| 	else | ||||
| 		return VLV_PIPE_PP_CONTROL(vlv_power_sequencer_pipe(intel_dp)); | ||||
| 	intel_pps_get_registers(to_i915(intel_dp_to_dev(intel_dp)), intel_dp, | ||||
| 				®s); | ||||
| 
 | ||||
| 	return regs.pp_ctrl; | ||||
| } | ||||
| 
 | ||||
| static i915_reg_t | ||||
| _pp_stat_reg(struct intel_dp *intel_dp) | ||||
| { | ||||
| 	struct drm_device *dev = intel_dp_to_dev(intel_dp); | ||||
| 	struct pps_registers regs; | ||||
| 
 | ||||
| 	if (IS_BROXTON(dev)) | ||||
| 		return BXT_PP_STATUS(bxt_power_sequencer_idx(intel_dp)); | ||||
| 	else if (HAS_PCH_SPLIT(dev)) | ||||
| 		return PCH_PP_STATUS; | ||||
| 	else | ||||
| 		return VLV_PIPE_PP_STATUS(vlv_power_sequencer_pipe(intel_dp)); | ||||
| 	intel_pps_get_registers(to_i915(intel_dp_to_dev(intel_dp)), intel_dp, | ||||
| 				®s); | ||||
| 
 | ||||
| 	return regs.pp_stat; | ||||
| } | ||||
| 
 | ||||
| /* Reboot notifier handler to shutdown panel power to guarantee T12 timing
 | ||||
| @ -4745,7 +4779,7 @@ intel_dp_init_panel_power_sequencer(struct drm_device *dev, | ||||
| 	struct edp_power_seq cur, vbt, spec, | ||||
| 		*final = &intel_dp->pps_delays; | ||||
| 	u32 pp_on, pp_off, pp_div = 0, pp_ctl = 0; | ||||
| 	i915_reg_t pp_ctrl_reg, pp_on_reg, pp_off_reg, pp_div_reg; | ||||
| 	struct pps_registers regs; | ||||
| 
 | ||||
| 	lockdep_assert_held(&dev_priv->pps_mutex); | ||||
| 
 | ||||
| @ -4753,35 +4787,17 @@ intel_dp_init_panel_power_sequencer(struct drm_device *dev, | ||||
| 	if (final->t11_t12 != 0) | ||||
| 		return; | ||||
| 
 | ||||
| 	if (IS_BROXTON(dev)) { | ||||
| 		int idx = bxt_power_sequencer_idx(intel_dp); | ||||
| 
 | ||||
| 		pp_ctrl_reg = BXT_PP_CONTROL(idx); | ||||
| 		pp_on_reg = BXT_PP_ON_DELAYS(idx); | ||||
| 		pp_off_reg = BXT_PP_OFF_DELAYS(idx); | ||||
| 	} else if (HAS_PCH_SPLIT(dev)) { | ||||
| 		pp_ctrl_reg = PCH_PP_CONTROL; | ||||
| 		pp_on_reg = PCH_PP_ON_DELAYS; | ||||
| 		pp_off_reg = PCH_PP_OFF_DELAYS; | ||||
| 		pp_div_reg = PCH_PP_DIVISOR; | ||||
| 	} else { | ||||
| 		enum pipe pipe = vlv_power_sequencer_pipe(intel_dp); | ||||
| 
 | ||||
| 		pp_ctrl_reg = VLV_PIPE_PP_CONTROL(pipe); | ||||
| 		pp_on_reg = VLV_PIPE_PP_ON_DELAYS(pipe); | ||||
| 		pp_off_reg = VLV_PIPE_PP_OFF_DELAYS(pipe); | ||||
| 		pp_div_reg = VLV_PIPE_PP_DIVISOR(pipe); | ||||
| 	} | ||||
| 	intel_pps_get_registers(dev_priv, intel_dp, ®s); | ||||
| 
 | ||||
| 	/* Workaround: Need to write PP_CONTROL with the unlock key as
 | ||||
| 	 * the very first thing. */ | ||||
| 	pp_ctl = ironlake_get_pp_control(intel_dp); | ||||
| 
 | ||||
| 	pp_on = I915_READ(pp_on_reg); | ||||
| 	pp_off = I915_READ(pp_off_reg); | ||||
| 	pp_on = I915_READ(regs.pp_on); | ||||
| 	pp_off = I915_READ(regs.pp_off); | ||||
| 	if (!IS_BROXTON(dev)) { | ||||
| 		I915_WRITE(pp_ctrl_reg, pp_ctl); | ||||
| 		pp_div = I915_READ(pp_div_reg); | ||||
| 		I915_WRITE(regs.pp_ctrl, pp_ctl); | ||||
| 		pp_div = I915_READ(regs.pp_div); | ||||
| 	} | ||||
| 
 | ||||
| 	/* Pull timing values out of registers */ | ||||
| @ -4864,30 +4880,13 @@ intel_dp_init_panel_power_sequencer_registers(struct drm_device *dev, | ||||
| 	struct drm_i915_private *dev_priv = dev->dev_private; | ||||
| 	u32 pp_on, pp_off, pp_div, port_sel = 0; | ||||
| 	int div = dev_priv->rawclk_freq / 1000; | ||||
| 	i915_reg_t pp_on_reg, pp_off_reg, pp_div_reg, pp_ctrl_reg; | ||||
| 	struct pps_registers regs; | ||||
| 	enum port port = dp_to_dig_port(intel_dp)->port; | ||||
| 	const struct edp_power_seq *seq = &intel_dp->pps_delays; | ||||
| 
 | ||||
| 	lockdep_assert_held(&dev_priv->pps_mutex); | ||||
| 
 | ||||
| 	if (IS_BROXTON(dev)) { | ||||
| 		int idx = bxt_power_sequencer_idx(intel_dp); | ||||
| 
 | ||||
| 		pp_ctrl_reg = BXT_PP_CONTROL(idx); | ||||
| 		pp_on_reg = BXT_PP_ON_DELAYS(idx); | ||||
| 		pp_off_reg = BXT_PP_OFF_DELAYS(idx); | ||||
| 
 | ||||
| 	} else if (HAS_PCH_SPLIT(dev)) { | ||||
| 		pp_on_reg = PCH_PP_ON_DELAYS; | ||||
| 		pp_off_reg = PCH_PP_OFF_DELAYS; | ||||
| 		pp_div_reg = PCH_PP_DIVISOR; | ||||
| 	} else { | ||||
| 		enum pipe pipe = vlv_power_sequencer_pipe(intel_dp); | ||||
| 
 | ||||
| 		pp_on_reg = VLV_PIPE_PP_ON_DELAYS(pipe); | ||||
| 		pp_off_reg = VLV_PIPE_PP_OFF_DELAYS(pipe); | ||||
| 		pp_div_reg = VLV_PIPE_PP_DIVISOR(pipe); | ||||
| 	} | ||||
| 	intel_pps_get_registers(dev_priv, intel_dp, ®s); | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * And finally store the new values in the power sequencer. The | ||||
| @ -4904,7 +4903,7 @@ intel_dp_init_panel_power_sequencer_registers(struct drm_device *dev, | ||||
| 	/* Compute the divisor for the pp clock, simply match the Bspec
 | ||||
| 	 * formula. */ | ||||
| 	if (IS_BROXTON(dev)) { | ||||
| 		pp_div = I915_READ(pp_ctrl_reg); | ||||
| 		pp_div = I915_READ(regs.pp_ctrl); | ||||
| 		pp_div &= ~BXT_POWER_CYCLE_DELAY_MASK; | ||||
| 		pp_div |= (DIV_ROUND_UP((seq->t11_t12 + 1), 1000) | ||||
| 				<< BXT_POWER_CYCLE_DELAY_SHIFT); | ||||
| @ -4927,19 +4926,19 @@ intel_dp_init_panel_power_sequencer_registers(struct drm_device *dev, | ||||
| 
 | ||||
| 	pp_on |= port_sel; | ||||
| 
 | ||||
| 	I915_WRITE(pp_on_reg, pp_on); | ||||
| 	I915_WRITE(pp_off_reg, pp_off); | ||||
| 	I915_WRITE(regs.pp_on, pp_on); | ||||
| 	I915_WRITE(regs.pp_off, pp_off); | ||||
| 	if (IS_BROXTON(dev)) | ||||
| 		I915_WRITE(pp_ctrl_reg, pp_div); | ||||
| 		I915_WRITE(regs.pp_ctrl, pp_div); | ||||
| 	else | ||||
| 		I915_WRITE(pp_div_reg, pp_div); | ||||
| 		I915_WRITE(regs.pp_div, pp_div); | ||||
| 
 | ||||
| 	DRM_DEBUG_KMS("panel power sequencer register settings: PP_ON %#x, PP_OFF %#x, PP_DIV %#x\n", | ||||
| 		      I915_READ(pp_on_reg), | ||||
| 		      I915_READ(pp_off_reg), | ||||
| 		      I915_READ(regs.pp_on), | ||||
| 		      I915_READ(regs.pp_off), | ||||
| 		      IS_BROXTON(dev) ? | ||||
| 		      (I915_READ(pp_ctrl_reg) & BXT_POWER_CYCLE_DELAY_MASK) : | ||||
| 		      I915_READ(pp_div_reg)); | ||||
| 		      (I915_READ(regs.pp_ctrl) & BXT_POWER_CYCLE_DELAY_MASK) : | ||||
| 		      I915_READ(regs.pp_div)); | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user