return NULL;
}
- if (dev_priv->vbt.drrs_type != DRRS_TYPE_SEAMLESS) {
+ if (dev_priv->vbt.drrs_type == DRRS_TYPE_NONE) {
drm_dbg_kms(&dev_priv->drm,
"[CONNECTOR:%d:%s] DRRS not supported according to VBT\n",
connector->base.base.id, connector->base.name);
intel_panel_fixed_mode(struct intel_connector *connector,
const struct drm_display_mode *mode)
{
- return connector->panel.fixed_mode;
+ const struct drm_display_mode *fixed_mode = connector->panel.fixed_mode;
+ const struct drm_display_mode *downclock_mode = connector->panel.downclock_mode;
+
+ /* pick the one that is closer in terms of vrefresh */
+ /* FIXME make this a a list of modes so we can have more than two */
+ if (fixed_mode && downclock_mode &&
+ abs(drm_mode_vrefresh(downclock_mode) - drm_mode_vrefresh(mode)) <
+ abs(drm_mode_vrefresh(fixed_mode) - drm_mode_vrefresh(mode)))
+ return downclock_mode;
+ else
+ return fixed_mode;
}
const struct drm_display_mode *
intel_panel_downclock_mode(struct intel_connector *connector,
const struct drm_display_mode *adjusted_mode)
{
- return connector->panel.downclock_mode;
+ const struct drm_display_mode *downclock_mode = connector->panel.downclock_mode;
+
+ if (downclock_mode &&
+ drm_mode_vrefresh(downclock_mode) < drm_mode_vrefresh(adjusted_mode))
+ return downclock_mode;
+ else
+ return NULL;
}
int intel_panel_get_modes(struct intel_connector *connector)
}
}
+ if (connector->panel.downclock_mode) {
+ struct drm_display_mode *mode;
+
+ mode = drm_mode_duplicate(connector->base.dev,
+ connector->panel.downclock_mode);
+ if (mode) {
+ drm_mode_probed_add(&connector->base, mode);
+ num_modes++;
+ }
+ }
+
return num_modes;
}