Commit 33814341 authored by Jesse Barnes's avatar Jesse Barnes Committed by Eric Anholt

drm/i915: disable LVDS downclock by default

Many platform support this feature, and it can provide significant
power savings when the reduced refresh rate is low.  However, on some
platforms a secondary (reduced) timing is provided but not actually
supported by the hardware.  This results in undesirable flicker at
runtime.

So disable the feature by default, but allow users to opt-in to the
reduced clock behavior with a new module parameter, lvds_downclock,
that can be set to 1 to enable the feature.
Signed-off-by: default avatarJesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: default avatarEric Anholt <eric@anholt.net>
parent 21bd770b
...@@ -45,6 +45,9 @@ module_param_named(fbpercrtc, i915_fbpercrtc, int, 0400); ...@@ -45,6 +45,9 @@ module_param_named(fbpercrtc, i915_fbpercrtc, int, 0400);
unsigned int i915_powersave = 1; unsigned int i915_powersave = 1;
module_param_named(powersave, i915_powersave, int, 0400); module_param_named(powersave, i915_powersave, int, 0400);
unsigned int i915_lvds_downclock = 0;
module_param_named(lvds_downclock, i915_lvds_downclock, int, 0400);
static struct drm_driver driver; static struct drm_driver driver;
#define INTEL_VGA_DEVICE(id, info) { \ #define INTEL_VGA_DEVICE(id, info) { \
......
...@@ -722,6 +722,7 @@ extern struct drm_ioctl_desc i915_ioctls[]; ...@@ -722,6 +722,7 @@ extern struct drm_ioctl_desc i915_ioctls[];
extern int i915_max_ioctl; extern int i915_max_ioctl;
extern unsigned int i915_fbpercrtc; extern unsigned int i915_fbpercrtc;
extern unsigned int i915_powersave; extern unsigned int i915_powersave;
extern unsigned int i915_lvds_downclock;
extern void i915_save_display(struct drm_device *dev); extern void i915_save_display(struct drm_device *dev);
extern void i915_restore_display(struct drm_device *dev); extern void i915_restore_display(struct drm_device *dev);
......
...@@ -197,7 +197,8 @@ parse_lfp_panel_data(struct drm_i915_private *dev_priv, ...@@ -197,7 +197,8 @@ parse_lfp_panel_data(struct drm_i915_private *dev_priv,
memset(temp_mode, 0, sizeof(*temp_mode)); memset(temp_mode, 0, sizeof(*temp_mode));
} }
kfree(temp_mode); kfree(temp_mode);
if (temp_downclock < panel_fixed_mode->clock) { if (temp_downclock < panel_fixed_mode->clock &&
i915_lvds_downclock) {
dev_priv->lvds_downclock_avail = 1; dev_priv->lvds_downclock_avail = 1;
dev_priv->lvds_downclock = temp_downclock; dev_priv->lvds_downclock = temp_downclock;
DRM_DEBUG_KMS("LVDS downclock is found in VBT. ", DRM_DEBUG_KMS("LVDS downclock is found in VBT. ",
......
...@@ -926,7 +926,8 @@ static void intel_find_lvds_downclock(struct drm_device *dev, ...@@ -926,7 +926,8 @@ static void intel_find_lvds_downclock(struct drm_device *dev,
} }
} }
mutex_unlock(&dev->mode_config.mutex); mutex_unlock(&dev->mode_config.mutex);
if (temp_downclock < panel_fixed_mode->clock) { if (temp_downclock < panel_fixed_mode->clock &&
i915_lvds_downclock) {
/* We found the downclock for LVDS. */ /* We found the downclock for LVDS. */
dev_priv->lvds_downclock_avail = 1; dev_priv->lvds_downclock_avail = 1;
dev_priv->lvds_downclock = temp_downclock; dev_priv->lvds_downclock = temp_downclock;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment