Jelajahi Sumber

disp: msm: sde: add 5k custom mode for wb connector

Writeback connector gets the available modes from the default
DRM Display Monitor Timing (DMT) modes. However, wb connector
now supports 5k mode. This change adds support for adding this
mode to the connector mode list by creating a custom wb mode
table. This table can be used to add new modes in the future.

Change-Id: I4b164e44b817b904aa7d6b5cff22c006a071c057
Signed-off-by: Nilaan Gunabalachandran <[email protected]>
Nilaan Gunabalachandran 4 tahun lalu
induk
melakukan
f4f950e1af
1 mengubah file dengan 49 tambahan dan 0 penghapusan
  1. 49 0
      msm/sde/sde_wb.c

+ 49 - 0
msm/sde/sde_wb.c

@@ -17,6 +17,21 @@
 #define SDE_WB_MODE_MAX_WIDTH	5120
 #define SDE_WB_MODE_MAX_HEIGHT	5120
 
+static const struct drm_display_mode sde_custom_wb_modes[] = {
+/* 5120x2160@60Hz */
+{ DRM_MODE("5120x2160", DRM_MODE_TYPE_DRIVER, 693264, 5120, 5128,
+		5160, 5200, 0, 2160, 2208, 2216, 2222, 0,
+		DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
+
+{ DRM_MODE("2160x5120", DRM_MODE_TYPE_DRIVER, 693264, 2160, 2208,
+		2216, 2222, 0, 5120, 5128, 5160, 5200, 0,
+		DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
+
+{ DRM_MODE("5120x2560", DRM_MODE_TYPE_DRIVER, 818064, 5120, 5128,
+		5160, 5200, 0, 2560, 2608, 2616, 2622, 0,
+		DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
+};
+
 /* Serialization lock for sde_wb_list */
 static DEFINE_MUTEX(sde_wb_list_lock);
 
@@ -62,6 +77,37 @@ sde_wb_connector_detect(struct drm_connector *connector,
 	return rc;
 }
 
+static int sde_wb_connector_add_custom_modes(struct drm_connector *connector,
+		u32 hdisplay, u32 vdisplay)
+{
+	int i, num_modes = 0;
+	struct drm_display_mode *mode;
+	struct drm_device *dev = connector->dev;
+
+	if (!hdisplay || !vdisplay)
+		return 0;
+
+	if (hdisplay > SDE_WB_MODE_MAX_WIDTH)
+		hdisplay = SDE_WB_MODE_MAX_WIDTH;
+	if (vdisplay > SDE_WB_MODE_MAX_HEIGHT)
+		vdisplay = SDE_WB_MODE_MAX_HEIGHT;
+
+	for (i = 0; i < ARRAY_SIZE(sde_custom_wb_modes); i++) {
+		const struct drm_display_mode *ptr = &sde_custom_wb_modes[i];
+
+		if (ptr->hdisplay > hdisplay || ptr->vdisplay > vdisplay)
+			continue;
+
+		mode = drm_mode_duplicate(dev, ptr);
+		if (mode) {
+			drm_mode_probed_add(connector, mode);
+			num_modes++;
+		}
+	}
+
+	return num_modes;
+}
+
 int sde_wb_connector_get_modes(struct drm_connector *connector, void *display,
 		const struct msm_resource_caps_info *avail_res)
 {
@@ -105,6 +151,9 @@ int sde_wb_connector_get_modes(struct drm_connector *connector, void *display,
 
 		num_modes = drm_add_modes_noedid(connector, max_width,
 				SDE_WB_MODE_MAX_HEIGHT);
+
+		num_modes += sde_wb_connector_add_custom_modes(connector, max_width,
+				SDE_WB_MODE_MAX_HEIGHT);
 	}
 	mutex_unlock(&wb_dev->wb_lock);
 	return num_modes;