This patch adds a 60 fps mode to the Orisetech OTM8009A panel.
The 50 fps mode is left as preferred.

Signed-off-by: Raphael Gallais-Pou <raphael.gallais-...@foss.st.com>
---
 .../gpu/drm/panel/panel-orisetech-otm8009a.c  | 85 ++++++++++++-------
 1 file changed, 56 insertions(+), 29 deletions(-)

diff --git a/drivers/gpu/drm/panel/panel-orisetech-otm8009a.c 
b/drivers/gpu/drm/panel/panel-orisetech-otm8009a.c
index f80b44a8a700..dfb43b1374e7 100644
--- a/drivers/gpu/drm/panel/panel-orisetech-otm8009a.c
+++ b/drivers/gpu/drm/panel/panel-orisetech-otm8009a.c
@@ -60,6 +60,9 @@
 #define MCS_CMD2_ENA1  0xFF00  /* Enable Access Command2 "CMD2" */
 #define MCS_CMD2_ENA2  0xFF80  /* Enable Access Orise Command2 */
 
+#define OTM8009A_HDISPLAY      480
+#define OTM8009A_VDISPLAY      800
+
 struct otm8009a {
        struct device *dev;
        struct drm_panel panel;
@@ -70,19 +73,35 @@ struct otm8009a {
        bool enabled;
 };
 
-static const struct drm_display_mode default_mode = {
-       .clock = 29700,
-       .hdisplay = 480,
-       .hsync_start = 480 + 98,
-       .hsync_end = 480 + 98 + 32,
-       .htotal = 480 + 98 + 32 + 98,
-       .vdisplay = 800,
-       .vsync_start = 800 + 15,
-       .vsync_end = 800 + 15 + 10,
-       .vtotal = 800 + 15 + 10 + 14,
-       .flags = 0,
-       .width_mm = 52,
-       .height_mm = 86,
+static const struct drm_display_mode modes[] = {
+       { /* 50 Hz, preferred */
+               .clock = 29700,
+               .hdisplay = 480,
+               .hsync_start = 480 + 98,
+               .hsync_end = 480 + 98 + 32,
+               .htotal = 480 + 98 + 32 + 98,
+               .vdisplay = 800,
+               .vsync_start = 800 + 15,
+               .vsync_end = 800 + 15 + 10,
+               .vtotal = 800 + 15 + 10 + 14,
+               .flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC,
+               .width_mm = 52,
+               .height_mm = 86,
+       },
+       { /* 60 Hz */
+               .clock = 33000,
+               .hdisplay = 480,
+               .hsync_start = 480 + 70,
+               .hsync_end = 480 + 70 + 32,
+               .htotal = 480 + 70 + 32 + 72,
+               .vdisplay = 800,
+               .vsync_start = 800 + 15,
+               .vsync_end = 800 + 15 + 10,
+               .vtotal = 800 + 15 + 10 + 16,
+               .flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC,
+               .width_mm = 52,
+               .height_mm = 86,
+       },
 };
 
 static inline struct otm8009a *panel_to_otm8009a(struct drm_panel *panel)
@@ -208,12 +227,11 @@ static int otm8009a_init_sequence(struct otm8009a *ctx)
        /* Default portrait 480x800 rgb24 */
        dcs_write_seq(ctx, MIPI_DCS_SET_ADDRESS_MODE, 0x00);
 
-       ret = mipi_dsi_dcs_set_column_address(dsi, 0,
-                                             default_mode.hdisplay - 1);
+       ret = mipi_dsi_dcs_set_column_address(dsi, 0, OTM8009A_HDISPLAY - 1);
        if (ret)
                return ret;
 
-       ret = mipi_dsi_dcs_set_page_address(dsi, 0, default_mode.vdisplay - 1);
+       ret = mipi_dsi_dcs_set_page_address(dsi, 0, OTM8009A_VDISPLAY - 1);
        if (ret)
                return ret;
 
@@ -337,24 +355,33 @@ static int otm8009a_get_modes(struct drm_panel *panel,
                              struct drm_connector *connector)
 {
        struct drm_display_mode *mode;
-
-       mode = drm_mode_duplicate(connector->dev, &default_mode);
-       if (!mode) {
-               dev_err(panel->dev, "failed to add mode %ux%u@%u\n",
-                       default_mode.hdisplay, default_mode.vdisplay,
-                       drm_mode_vrefresh(&default_mode));
-               return -ENOMEM;
+       unsigned int num_modes = ARRAY_SIZE(modes);
+       unsigned int i;
+
+       for (i = 0; i < num_modes; i++) {
+               mode = drm_mode_duplicate(connector->dev, &modes[i]);
+               if (!mode) {
+                       dev_err(panel->dev, "failed to add mode %ux%u@%u\n",
+                               modes[i].hdisplay,
+                               modes[i].vdisplay,
+                               drm_mode_vrefresh(&modes[i]));
+                       return -ENOMEM;
+               }
+
+               mode->type = DRM_MODE_TYPE_DRIVER;
+
+               /* Setting first mode as preferred */
+               if (!i)
+                       mode->type |=  DRM_MODE_TYPE_PREFERRED;
+
+               drm_mode_set_name(mode);
+               drm_mode_probed_add(connector, mode);
        }
 
-       drm_mode_set_name(mode);
-
-       mode->type = DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED;
-       drm_mode_probed_add(connector, mode);
-
        connector->display_info.width_mm = mode->width_mm;
        connector->display_info.height_mm = mode->height_mm;
 
-       return 1;
+       return num_modes;
 }
 
 static const struct drm_panel_funcs otm8009a_drm_funcs = {
-- 
2.17.1

Reply via email to