drm/exynos: mixer: support for 1440x900 resolution
authorAkshay Saraswat <Akshay.s@samsung.com>
Wed, 24 Oct 2012 05:11:00 +0000 (14:11 +0900)
committerGerrit <chrome-bot@google.com>
Thu, 25 Oct 2012 02:41:58 +0000 (19:41 -0700)
Extend the mixer configuration to include all resolutions that can be
generated by the mixer. This patch adds 1440x900 resolution with the
help of workaround 4.
Workaround summary:
1. Set the resolution mode as HD_1080.
2. Set HD_1080 and all kinds of destination X with biasing 0xE0.

BUG=chrome-os-partner:12643
TEST=Tested on snow with mentioned resolution

Change-Id: Iaa0cb9ddfe2995a760b4c72a724807c1b6a2031c
Signed-off-by: Akshay Saraswat <Akshay.s@samsung.com>
Reviewed-on: https://gerrit.chromium.org/gerrit/33860
Tested-by: Akshay Saraswat <akshay.s@samsung.com>
Reviewed-by: Sean Paul <seanpaul@chromium.org>
Commit-Ready: Akshay Saraswat <akshay.s@samsung.com>

drivers/gpu/drm/exynos/exynos_drm_hdmi.c
drivers/gpu/drm/exynos/exynos_hdmi.c
drivers/gpu/drm/exynos/exynos_mixer.c
drivers/gpu/drm/exynos/regs-mixer.h

index 9236788..7edfdf4 100644 (file)
@@ -81,7 +81,8 @@ enum exynos_mixer_mode_type exynos_mixer_get_mode_type(int width, int height)
                return EXYNOS_MIXER_MODE_SD_PAL;
        else if (width >= 1024 && width <= 1280 && height <= 720)
                return EXYNOS_MIXER_MODE_HD_720;
-       else if (width >= 1664 && width <= 1920 && height <= 1080)
+       else if ((width == 1440 && height == 900) ||
+               (width >= 1664 && width <= 1920 && height <= 1080))
                return EXYNOS_MIXER_MODE_HD_1080;
        else
                return EXYNOS_MIXER_MODE_INVALID;
index fc1f7fe..fd1adce 100644 (file)
@@ -1835,6 +1835,14 @@ static void hdmi_v14_mode_set(struct hdmi_context *hdata,
        hdmi_set_reg(tg->field_top_hdmi, 2, 0x1); /* Reset value */
        hdmi_set_reg(tg->field_bot_hdmi, 2, 0x233); /* Reset value */
        hdmi_set_reg(tg->tg_3d, 1, 0x0);
+
+       /* Workaround 4 implementation for 1440x900 resolution support */
+       if (hdata->is_soc_exynos5) {
+               if (m->hdisplay == 1440 && m->vdisplay == 900 && m->clock == 106500) {
+                       hdmi_set_reg(tg->hact_st, 2, m->htotal - m->hdisplay - 0xe0);
+                       hdmi_set_reg(tg->hact_sz, 2, m->hdisplay + 0xe0);
+               }
+       }
 }
 
 static void hdmi_mode_set(void *ctx, void *mode)
index 448f6d6..b185268 100644 (file)
@@ -93,6 +93,7 @@ struct mixer_context {
        struct mixer_resources  mixer_res;
        struct hdmi_win_data    win_data[MIXER_WIN_NR];
        unsigned long           event_flags;
+       int                     previous_dxy;
 };
 
 /* event flags used  */
@@ -306,6 +307,20 @@ static void mixer_cfg_scan(struct mixer_context *mctx, u32 width, u32 height)
        mixer_reg_writemask(res, MXR_CFG, val, MXR_CFG_SCAN_MASK);
 }
 
+static void mixer_set_layer_offset(struct mixer_context *mctx, u32 offset)
+{
+       struct mixer_resources *res = &mctx->mixer_res;
+       int current_dxy = mixer_reg_read(res, MXR_GRAPHIC1_DXY);
+
+       if (mctx->previous_dxy != current_dxy) {
+               current_dxy += MXR_GRP_DXY_DX(offset);
+               mixer_reg_write(res, MXR_GRAPHIC1_DXY, current_dxy);
+               mctx->previous_dxy = current_dxy;
+       }
+
+       mixer_reg_write(res, MXR_GRAPHIC0_DXY, MXR_GRP_DXY_DX(offset));
+}
+
 static void mixer_cfg_rgb_fmt(struct mixer_context *mctx, unsigned int height)
 {
        struct mixer_resources *res = &mctx->mixer_res;
@@ -634,6 +649,13 @@ static void mixer_graph_buffer(struct mixer_context *mctx, int win)
        mixer_reg_write(res, MXR_GRAPHIC_BASE(win), dma_addr);
 
        mixer_cfg_scan(mctx, mode_width, mode_height);
+
+       /* Workaround 4 implementation for 1440x900 resolution support */
+       if (res->is_soc_exynos5) {
+               if (mode_width == 1440 && mode_height == 900)
+                       mixer_set_layer_offset(mctx, 224);
+       }
+
        mixer_cfg_rgb_fmt(mctx, mode_height);
        mixer_cfg_layer(mctx, win, true);
        mixer_cfg_layer(mctx, MIXER_DEFAULT_WIN, true);
index 23534a7..81e4fee 100644 (file)
@@ -44,6 +44,7 @@
 #define MXR_CM_COEFF_Y                 0x0080
 #define MXR_CM_COEFF_CB                        0x0084
 #define MXR_CM_COEFF_CR                        0x0088
+#define MXR_TVOUT_CFG                  0x0100
 #define MXR_GRAPHIC0_BASE_S            0x2024
 #define MXR_GRAPHIC1_BASE_S            0x2044