drm/edid: Extract drm_gtf2_mode()
authorVille Syrjälä <ville.syrjala@linux.intel.com>
Tue, 27 Sep 2022 17:00:01 +0000 (20:00 +0300)
committerVille Syrjälä <ville.syrjala@linux.intel.com>
Tue, 4 Oct 2022 19:44:38 +0000 (22:44 +0300)
Extract the GTF vs. GTF2 logic into a separate function.
We'll have a second user soon.

Reviewed-by: Jani Nikula <jani.nikula@intel.com>
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20220927170006.27855-5-ville.syrjala@linux.intel.com
drivers/gpu/drm/drm_edid.c

index e0d8ed9..03b3c88 100644 (file)
@@ -3113,6 +3113,35 @@ static int drm_mode_hsync(const struct drm_display_mode *mode)
        return DIV_ROUND_CLOSEST(mode->clock, mode->htotal);
 }
 
+static struct drm_display_mode *
+drm_gtf2_mode(struct drm_device *dev,
+             const struct drm_edid *drm_edid,
+             int hsize, int vsize, int vrefresh_rate)
+{
+       struct drm_display_mode *mode;
+
+       /*
+        * This is potentially wrong if there's ever a monitor with
+        * more than one ranges section, each claiming a different
+        * secondary GTF curve.  Please don't do that.
+        */
+       mode = drm_gtf_mode(dev, hsize, vsize, vrefresh_rate, 0, 0);
+       if (!mode)
+               return NULL;
+
+       if (drm_mode_hsync(mode) > drm_gtf2_hbreak(drm_edid)) {
+               drm_mode_destroy(dev, mode);
+               mode = drm_gtf_mode_complex(dev, hsize, vsize,
+                                           vrefresh_rate, 0, 0,
+                                           drm_gtf2_m(drm_edid),
+                                           drm_gtf2_2c(drm_edid),
+                                           drm_gtf2_k(drm_edid),
+                                           drm_gtf2_2j(drm_edid));
+       }
+
+       return mode;
+}
+
 /*
  * Take the standard timing params (in this case width, aspect, and refresh)
  * and convert them into a real mode using CVT/GTF/DMT.
@@ -3201,23 +3230,7 @@ static struct drm_display_mode *drm_mode_std(struct drm_connector *connector,
                mode = drm_gtf_mode(dev, hsize, vsize, vrefresh_rate, 0, 0);
                break;
        case LEVEL_GTF2:
-               /*
-                * This is potentially wrong if there's ever a monitor with
-                * more than one ranges section, each claiming a different
-                * secondary GTF curve.  Please don't do that.
-                */
-               mode = drm_gtf_mode(dev, hsize, vsize, vrefresh_rate, 0, 0);
-               if (!mode)
-                       return NULL;
-               if (drm_mode_hsync(mode) > drm_gtf2_hbreak(drm_edid)) {
-                       drm_mode_destroy(dev, mode);
-                       mode = drm_gtf_mode_complex(dev, hsize, vsize,
-                                                   vrefresh_rate, 0, 0,
-                                                   drm_gtf2_m(drm_edid),
-                                                   drm_gtf2_2c(drm_edid),
-                                                   drm_gtf2_k(drm_edid),
-                                                   drm_gtf2_2j(drm_edid));
-               }
+               mode = drm_gtf2_mode(dev, drm_edid, hsize, vsize, vrefresh_rate);
                break;
        case LEVEL_CVT:
                mode = drm_cvt_mode(dev, hsize, vsize, vrefresh_rate, 0, 0,