Hi 2012/11/5 Daniel Vetter <daniel.vetter at ffwll.ch>: > Just a prep patch to make this a property of intel_lvds. Makes more > sense, removes clutter from intel_display.c and eventually I want to > move all the encoder special cases wrt clock handling to encoders > anyway. > > Signed-off-by: Daniel Vetter <daniel.vetter at ffwll.ch> > --- > drivers/gpu/drm/i915/intel_display.c | 60 +++--------------------------------- > drivers/gpu/drm/i915/intel_drv.h | 1 + > drivers/gpu/drm/i915/intel_lvds.c | 53 +++++++++++++++++++++++++++++++ > 3 files changed, 59 insertions(+), 55 deletions(-) > > diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c > index 0973391..7309790 100644 > --- a/drivers/gpu/drm/i915/intel_display.c > +++ b/drivers/gpu/drm/i915/intel_display.c > @@ -472,61 +472,14 @@ static void vlv_init_dpio(struct drm_device *dev) > POSTING_READ(DPIO_CTL); > } > > -static int intel_dual_link_lvds_callback(const struct dmi_system_id *id) > -{ > - DRM_INFO("Forcing lvds to dual link mode on %s\n", id->ident); > - return 1; > -} > - > -static const struct dmi_system_id intel_dual_link_lvds[] = { > - { > - .callback = intel_dual_link_lvds_callback, > - .ident = "Apple MacBook Pro (Core i5/i7 Series)", > - .matches = { > - DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."), > - DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro8,2"), > - }, > - }, > - { } /* terminating entry */ > -}; > - > -static bool is_dual_link_lvds(struct drm_i915_private *dev_priv, > - unsigned int reg) > -{ > - unsigned int val; > - > - /* use the module option value if specified */ > - if (i915_lvds_channel_mode > 0) > - return i915_lvds_channel_mode == 2; > - > - if (dmi_check_system(intel_dual_link_lvds)) > - return true; > - > - if (dev_priv->lvds_val) > - val = dev_priv->lvds_val; > - else { > - /* BIOS should set the proper LVDS register value at boot, but > - * in reality, it doesn't set the value when the lid is closed; > - * we need to check "the value to be set" in VBT when LVDS > - * register is uninitialized. > - */ > - val = I915_READ(reg); > - if (!(val & ~(LVDS_PIPE_MASK | LVDS_DETECTED))) > - val = dev_priv->bios_lvds_val; > - dev_priv->lvds_val = val; > - } > - return (val & LVDS_CLKB_POWER_MASK) == LVDS_CLKB_POWER_UP; > -} > - > static const intel_limit_t *intel_ironlake_limit(struct drm_crtc *crtc, > int refclk) > { > struct drm_device *dev = crtc->dev; > - struct drm_i915_private *dev_priv = dev->dev_private; > const intel_limit_t *limit; > > if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS)) { > - if (is_dual_link_lvds(dev_priv, PCH_LVDS)) { > + if (is_dual_link_lvds(dev)) { > /* LVDS dual channel */ > if (refclk == 100000) > limit = &intel_limits_ironlake_dual_lvds_100m; > @@ -550,11 +503,10 @@ static const intel_limit_t *intel_ironlake_limit(struct drm_crtc *crtc, > static const intel_limit_t *intel_g4x_limit(struct drm_crtc *crtc) > { > struct drm_device *dev = crtc->dev; > - struct drm_i915_private *dev_priv = dev->dev_private; > const intel_limit_t *limit; > > if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS)) { > - if (is_dual_link_lvds(dev_priv, LVDS)) > + if (is_dual_link_lvds(dev)) > /* LVDS with dual channel */ > limit = &intel_limits_g4x_dual_channel_lvds; > else > @@ -686,7 +638,6 @@ intel_find_best_PLL(const intel_limit_t *limit, struct drm_crtc *crtc, > > { > struct drm_device *dev = crtc->dev; > - struct drm_i915_private *dev_priv = dev->dev_private; > intel_clock_t clock; > int err = target; > > @@ -697,7 +648,7 @@ intel_find_best_PLL(const intel_limit_t *limit, struct drm_crtc *crtc, > * reliably set up different single/dual channel state, if we > * even can. > */ > - if (is_dual_link_lvds(dev_priv, LVDS)) > + if (is_dual_link_lvds(dev)) > clock.p2 = limit->p2.p2_fast; > else > clock.p2 = limit->p2.p2_slow; > @@ -750,7 +701,6 @@ intel_g4x_find_best_PLL(const intel_limit_t *limit, struct drm_crtc *crtc, > intel_clock_t *best_clock) > { > struct drm_device *dev = crtc->dev; > - struct drm_i915_private *dev_priv = dev->dev_private; > intel_clock_t clock; > int max_n; > bool found; > @@ -765,7 +715,7 @@ intel_g4x_find_best_PLL(const intel_limit_t *limit, struct drm_crtc *crtc, > lvds_reg = PCH_LVDS; > else > lvds_reg = LVDS; > - if (is_dual_link_lvds(dev_priv, lvds_reg)) > + if (is_dual_link_lvds(dev)) > clock.p2 = limit->p2.p2_fast; > else > clock.p2 = limit->p2.p2_slow; > @@ -5358,7 +5308,7 @@ static uint32_t ironlake_compute_dpll(struct intel_crtc *intel_crtc, > if (is_lvds) { > if ((intel_panel_use_ssc(dev_priv) && > dev_priv->lvds_ssc_freq == 100) || > - is_dual_link_lvds(dev_priv, PCH_LVDS)) > + is_dual_link_lvds(dev)) > factor = 25; > } else if (is_sdvo && is_tv) > factor = 20; > diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h > index 42a40a1..ee4a4ba 100644 > --- a/drivers/gpu/drm/i915/intel_drv.h > +++ b/drivers/gpu/drm/i915/intel_drv.h > @@ -439,6 +439,7 @@ extern void intel_mark_idle(struct drm_device *dev); > extern void intel_mark_fb_busy(struct drm_i915_gem_object *obj); > extern void intel_mark_fb_idle(struct drm_i915_gem_object *obj); > extern bool intel_lvds_init(struct drm_device *dev); > +extern bool is_dual_link_lvds(struct drm_device *dev); > extern void intel_dp_init(struct drm_device *dev, int output_reg, > enum port port); > extern void intel_dp_init_connector(struct intel_digital_port *intel_dig_port, > diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c > index ffa0051..2303984 100644 > --- a/drivers/gpu/drm/i915/intel_lvds.c > +++ b/drivers/gpu/drm/i915/intel_lvds.c > @@ -900,6 +900,59 @@ static bool lvds_is_present_in_vbt(struct drm_device *dev, > return false; > } > > +static int intel_dual_link_lvds_callback(const struct dmi_system_id *id) > +{ > + DRM_INFO("Forcing lvds to dual link mode on %s\n", id->ident); > + return 1; > +} > + > +static const struct dmi_system_id intel_dual_link_lvds[] = { > + { > + .callback = intel_dual_link_lvds_callback, > + .ident = "Apple MacBook Pro (Core i5/i7 Series)", > + .matches = { > + DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."), > + DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro8,2"), > + }, > + }, > + { } /* terminating entry */ > +}; > + > +bool is_dual_link_lvds(struct drm_device *dev) The last time I did something similar someone asked me to add "intel_" prefix to the function name. With or without the intel_ prefix: Yay! Encoder-specific code moving to encoder-specific file! Reviewed-by: Paulo Zanoni <paulo.r.zanoni at intel.com> > +{ > + unsigned int val; > + struct drm_i915_private *dev_priv = dev->dev_private; > + u32 lvds_reg; > + > + if (HAS_PCH_SPLIT(dev)) { > + lvds_reg = PCH_LVDS; > + } else { > + lvds_reg = LVDS; > + } > + > + /* use the module option value if specified */ > + if (i915_lvds_channel_mode > 0) > + return i915_lvds_channel_mode == 2; > + > + if (dmi_check_system(intel_dual_link_lvds)) > + return true; > + > + if (dev_priv->lvds_val) > + val = dev_priv->lvds_val; > + else { > + /* BIOS should set the proper LVDS register value at boot, but > + * in reality, it doesn't set the value when the lid is closed; > + * we need to check "the value to be set" in VBT when LVDS > + * register is uninitialized. > + */ > + val = I915_READ(lvds_reg); > + if (!(val & ~(LVDS_PIPE_MASK | LVDS_DETECTED))) > + val = dev_priv->bios_lvds_val; > + dev_priv->lvds_val = val; > + } > + return (val & LVDS_CLKB_POWER_MASK) == LVDS_CLKB_POWER_UP; > +} > + > static bool intel_lvds_supported(struct drm_device *dev) > { > /* With the introduction of the PCH we gained a dedicated > -- > 1.7.11.7 > > _______________________________________________ > Intel-gfx mailing list > Intel-gfx at lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/intel-gfx -- Paulo Zanoni