drm/i915: Split hsw_get_dpll()
Split out the DisplayPort and HDMI pll setup code into separate functions and refactor the DP code that calculates the pll so that it doesn't depend on crtc state. This will be used for acquiring port pll when doing upfront link training. Reviewed-by: Durgadoss R <durgadoss.r@intel.com> Signed-off-by: Manasi Navare <manasi.d.navare@intel.com> Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
This commit is contained in:
parent
9a4edadacc
commit
81b9fd8fc6
|
@ -667,20 +667,13 @@ hsw_ddi_calculate_wrpll(int clock /* in Hz */,
|
|||
*r2_out = best.r2;
|
||||
}
|
||||
|
||||
static struct intel_shared_dpll *
|
||||
hsw_get_dpll(struct intel_crtc *crtc, struct intel_crtc_state *crtc_state,
|
||||
struct intel_encoder *encoder)
|
||||
static struct intel_shared_dpll *hsw_ddi_hdmi_get_dpll(int clock,
|
||||
struct intel_crtc *crtc,
|
||||
struct intel_crtc_state *crtc_state)
|
||||
{
|
||||
struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
|
||||
struct intel_shared_dpll *pll;
|
||||
int clock = crtc_state->port_clock;
|
||||
|
||||
memset(&crtc_state->dpll_hw_state, 0,
|
||||
sizeof(crtc_state->dpll_hw_state));
|
||||
|
||||
if (encoder->type == INTEL_OUTPUT_HDMI) {
|
||||
uint32_t val;
|
||||
unsigned p, n2, r2;
|
||||
unsigned int p, n2, r2;
|
||||
|
||||
hsw_ddi_calculate_wrpll(clock * 1000, &r2, &n2, &p);
|
||||
|
||||
|
@ -693,9 +686,17 @@ hsw_get_dpll(struct intel_crtc *crtc, struct intel_crtc_state *crtc_state,
|
|||
pll = intel_find_shared_dpll(crtc, crtc_state,
|
||||
DPLL_ID_WRPLL1, DPLL_ID_WRPLL2);
|
||||
|
||||
} else if (encoder->type == INTEL_OUTPUT_DP ||
|
||||
encoder->type == INTEL_OUTPUT_DP_MST ||
|
||||
encoder->type == INTEL_OUTPUT_EDP) {
|
||||
if (!pll)
|
||||
return NULL;
|
||||
|
||||
return pll;
|
||||
}
|
||||
|
||||
struct intel_shared_dpll *hsw_ddi_dp_get_dpll(struct intel_encoder *encoder,
|
||||
int clock)
|
||||
{
|
||||
struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
|
||||
struct intel_shared_dpll *pll;
|
||||
enum intel_dpll_id pll_id;
|
||||
|
||||
switch (clock / 2) {
|
||||
|
@ -715,6 +716,30 @@ hsw_get_dpll(struct intel_crtc *crtc, struct intel_crtc_state *crtc_state,
|
|||
|
||||
pll = intel_get_shared_dpll_by_id(dev_priv, pll_id);
|
||||
|
||||
if (!pll)
|
||||
return NULL;
|
||||
|
||||
return pll;
|
||||
}
|
||||
|
||||
static struct intel_shared_dpll *
|
||||
hsw_get_dpll(struct intel_crtc *crtc, struct intel_crtc_state *crtc_state,
|
||||
struct intel_encoder *encoder)
|
||||
{
|
||||
struct intel_shared_dpll *pll;
|
||||
int clock = crtc_state->port_clock;
|
||||
|
||||
memset(&crtc_state->dpll_hw_state, 0,
|
||||
sizeof(crtc_state->dpll_hw_state));
|
||||
|
||||
if (encoder->type == INTEL_OUTPUT_HDMI) {
|
||||
pll = hsw_ddi_hdmi_get_dpll(clock, crtc, crtc_state);
|
||||
|
||||
} else if (encoder->type == INTEL_OUTPUT_DP ||
|
||||
encoder->type == INTEL_OUTPUT_DP_MST ||
|
||||
encoder->type == INTEL_OUTPUT_EDP) {
|
||||
pll = hsw_ddi_dp_get_dpll(encoder, clock);
|
||||
|
||||
} else if (encoder->type == INTEL_OUTPUT_ANALOG) {
|
||||
if (WARN_ON(crtc_state->port_clock / 2 != 135000))
|
||||
return NULL;
|
||||
|
@ -736,7 +761,6 @@ hsw_get_dpll(struct intel_crtc *crtc, struct intel_crtc_state *crtc_state,
|
|||
return pll;
|
||||
}
|
||||
|
||||
|
||||
static const struct intel_shared_dpll_funcs hsw_ddi_wrpll_funcs = {
|
||||
.enable = hsw_ddi_wrpll_enable,
|
||||
.disable = hsw_ddi_wrpll_disable,
|
||||
|
|
|
@ -164,8 +164,14 @@ void intel_shared_dpll_init(struct drm_device *dev);
|
|||
bool bxt_ddi_dp_set_dpll_hw_state(int clock,
|
||||
struct intel_dpll_hw_state *dpll_hw_state);
|
||||
|
||||
|
||||
/* SKL dpll related functions */
|
||||
bool skl_ddi_dp_set_dpll_hw_state(int clock,
|
||||
struct intel_dpll_hw_state *dpll_hw_state);
|
||||
|
||||
|
||||
/* HSW dpll related functions */
|
||||
struct intel_shared_dpll *hsw_ddi_dp_get_dpll(struct intel_encoder *encoder,
|
||||
int clock);
|
||||
|
||||
#endif /* _INTEL_DPLL_MGR_H_ */
|
||||
|
|
Loading…
Reference in New Issue