Merge drm/drm-next into drm-misc-next
[sfrench/cifs-2.6.git] / drivers / gpu / drm / drm_edid.c
index 73c614efc13281a9deb9be990f5fbab3fe2ab2bf..47465b9765f1a483b0249e6e204fd83459c86618 100644 (file)
@@ -6112,12 +6112,14 @@ static void drm_parse_cea_ext(struct drm_connector *connector,
 }
 
 static
-void get_monitor_range(const struct detailed_timing *timing,
-                      void *info_monitor_range)
+void get_monitor_range(const struct detailed_timing *timing, void *c)
 {
-       struct drm_monitor_range_info *monitor_range = info_monitor_range;
+       struct detailed_mode_closure *closure = c;
+       struct drm_display_info *info = &closure->connector->display_info;
+       struct drm_monitor_range_info *monitor_range = &info->monitor_range;
        const struct detailed_non_pixel *data = &timing->data.other_data;
        const struct detailed_data_monitor_range *range = &data->data.range;
+       const struct edid *edid = closure->drm_edid->edid;
 
        if (!is_display_descriptor(timing, EDID_DETAIL_MONITOR_RANGE))
                return;
@@ -6136,12 +6138,23 @@ void get_monitor_range(const struct detailed_timing *timing,
 
        monitor_range->min_vfreq = range->min_vfreq;
        monitor_range->max_vfreq = range->max_vfreq;
+
+       if (edid->revision >= 4) {
+               if (data->pad2 & DRM_EDID_RANGE_OFFSET_MIN_VFREQ)
+                       monitor_range->min_vfreq += 255;
+               if (data->pad2 & DRM_EDID_RANGE_OFFSET_MAX_VFREQ)
+                       monitor_range->max_vfreq += 255;
+       }
 }
 
 static void drm_get_monitor_range(struct drm_connector *connector,
                                  const struct drm_edid *drm_edid)
 {
-       struct drm_display_info *info = &connector->display_info;
+       const struct drm_display_info *info = &connector->display_info;
+       struct detailed_mode_closure closure = {
+               .connector = connector,
+               .drm_edid = drm_edid,
+       };
 
        if (drm_edid->edid->revision < 4)
                return;
@@ -6149,8 +6162,7 @@ static void drm_get_monitor_range(struct drm_connector *connector,
        if (!(drm_edid->edid->features & DRM_EDID_FEATURE_CONTINUOUS_FREQ))
                return;
 
-       drm_for_each_detailed_block(drm_edid, get_monitor_range,
-                                   &info->monitor_range);
+       drm_for_each_detailed_block(drm_edid, get_monitor_range, &closure);
 
        DRM_DEBUG_KMS("Supported Monitor Refresh rate range is %d Hz - %d Hz\n",
                      info->monitor_range.min_vfreq,