Forráskód Böngészése

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

qctecmdr 4 éve
szülő
commit
7773b23c21
1 módosított fájl, 49 hozzáadás és 0 törlés
  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;