diff --git a/msm/sde/sde_wb.c b/msm/sde/sde_wb.c index 4b8b386ccf..e859eed6a6 100644 --- a/msm/sde/sde_wb.c +++ b/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;