]> xenbits.xensource.com Git - people/aperard/linux-chromebook.git/commitdiff
drm/exynos: Clean up fimd mode handling
authorSean Paul <seanpaul@chromium.org>
Tue, 20 Nov 2012 15:56:54 +0000 (10:56 -0500)
committerGerrit <chrome-bot@google.com>
Wed, 21 Nov 2012 21:18:06 +0000 (13:18 -0800)
FIMD has been using the panel timing data straight from the driver's
platform data instead of the data that is provided via the drm layer.
This makes things difficult if we want to use EDID data from the dp
driver, since it would be ignored. This patch changes FIMD to just
use the platform panel data as a seed to get_panel. From then on, we use
the overlay data that is set via modeset.

This patch also removes the panel array, since we only want one
resolution from platform data.

BUG=chrome-os-partner:11158
TEST=Tested on snow, no regressions noted

Change-Id: I345c3663509e6820a745b85c4b9a37f77f42c0d2
Signed-off-by: Sean Paul <seanpaul@chromium.org>
Reviewed-on: https://gerrit.chromium.org/gerrit/38409
Reviewed-by: Stéphane Marchesin <marcheu@chromium.org>
arch/arm/mach-exynos/mach-exynos5-dt.c
drivers/gpu/drm/exynos/exynos_drm_connector.c
drivers/gpu/drm/exynos/exynos_drm_crtc.c
drivers/gpu/drm/exynos/exynos_drm_drv.h
drivers/gpu/drm/exynos/exynos_drm_fimd.c
include/drm/exynos_drm.h

index 03b860e979ea0967065bae3e772fb6db47fed89e..1b1b62ad48c19be54411bc57530595a3f50a54ce 100644 (file)
@@ -153,8 +153,7 @@ static struct s3c_fb_pd_win smdk5250_fb_win2 = {
  * - 70500000. / ((1366 + 40 + 40 + 32) * (768 + 10 + 12 + 6))
  *   59.92411312312578
  */
-static struct fb_videomode snow_fb_window[] = {
-       {
+static struct fb_videomode snow_fb_window = {
                .left_margin    = 40,
                .right_margin   = 40,
                .upper_margin   = 10,
@@ -163,10 +162,8 @@ static struct fb_videomode snow_fb_window[] = {
                .vsync_len      = 6,
                .xres           = 1366,
                .yres           = 768,
-       }, {
-               .xres           = -1,
-               .yres           = -1,
-       },
+               .refresh        = 60,
+               .pixclock       = 70500000,
 };
 
 static void exynos_fimd_gpio_setup_24bpp(void)
@@ -226,31 +223,18 @@ static struct exynos_drm_hdmi_pdata drm_hdmi_pdata = {
 
 #ifdef CONFIG_DRM_EXYNOS_FIMD
 static struct exynos_drm_fimd_pdata smdk5250_lcd1_pdata = {
-       .panel[0].timing   = {
-               .xres           = 1280,
-               .yres           = 800,
-               .hsync_len      = 4,
-               .left_margin    = 0x4,
-               .right_margin   = 0x4,
-               .vsync_len      = 4,
-               .upper_margin   = 4,
-               .lower_margin   = 4,
-               .refresh        = 60,
-       },
-       .panel[1].timing   = {
-               .xres           = 1280,
-               .yres           = 720,
-               .hsync_len      = 4,
-               .left_margin    = 0x4,
-               .right_margin   = 0x4,
-               .vsync_len      = 4,
-               .upper_margin   = 4,
-               .lower_margin   = 4,
-               .refresh        = 60,
-       },
-       .panel[2].timing   = {
-               .xres           = -1,
-               .yres           = -1,
+       .panel = {
+               .timing   = {
+                       .xres           = 1280,
+                       .yres           = 800,
+                       .hsync_len      = 4,
+                       .left_margin    = 0x4,
+                       .right_margin   = 0x4,
+                       .vsync_len      = 4,
+                       .upper_margin   = 4,
+                       .lower_margin   = 4,
+                       .refresh        = 60,
+               },
        },
        .vidcon0        = VIDCON0_VIDOUT_RGB | VIDCON0_PNRMODE_RGB,
        .vidcon1        = VIDCON1_INV_VCLK,
@@ -1043,7 +1027,6 @@ static void exynos5_i2c_setup(void)
 static void __init exynos5250_dt_machine_init(void)
 {
        struct device_node *srom_np, *np;
-       int i;
 
        regulator_register_fixed(0, dummy_supplies, ARRAY_SIZE(dummy_supplies));
 
@@ -1085,12 +1068,8 @@ static void __init exynos5250_dt_machine_init(void)
 
        if (of_machine_is_compatible("google,daisy")) {
 #ifdef CONFIG_DRM_EXYNOS_FIMD
-               smdk5250_lcd1_pdata.panel[0].timing.xres = 1366;
-               smdk5250_lcd1_pdata.panel[0].timing.yres = 768;
-               smdk5250_lcd1_pdata.panel[1].timing.xres = 1280;
-               smdk5250_lcd1_pdata.panel[1].timing.yres = 720;
-               smdk5250_lcd1_pdata.panel[2].timing.xres = -1;
-               smdk5250_lcd1_pdata.panel[2].timing.yres = -1;
+               smdk5250_lcd1_pdata.panel.timing.xres = 1366;
+               smdk5250_lcd1_pdata.panel.timing.yres = 768;
                smdk5250_lcd1_pdata.panel_type = MIPI_LCD;
 #else
                smdk5250_fb_win0.win_mode.xres = 1366;
@@ -1113,12 +1092,12 @@ static void __init exynos5250_dt_machine_init(void)
        } else if ((of_machine_is_compatible("google,snow")) ||
                   (of_machine_is_compatible("google,spring"))) {
 #ifdef CONFIG_DRM_EXYNOS_FIMD
-               for (i = 0;i < ARRAY_SIZE(snow_fb_window);i++)
-                       smdk5250_lcd1_pdata.panel[i].timing = snow_fb_window[i];
+               smdk5250_lcd1_pdata.panel.timing = snow_fb_window;
 
                smdk5250_lcd1_pdata.panel_type = DP_LCD;
-               smdk5250_lcd1_pdata.clock_rate = 70500000;
                smdk5250_lcd1_pdata.vidcon1 = 0;
+               smdk5250_lcd1_pdata.clock_rate =
+                       smdk5250_lcd1_pdata.panel.timing.pixclock;
 #endif
        }
 
index 86349e1bdd1cbf03ba468b6803d4659c1c2cd1a7..8e92d007ab73766efe0fed645c3ec3d5f9f9bdc4 100644 (file)
@@ -150,36 +150,22 @@ static int exynos_drm_connector_get_panel(struct drm_connector *connector)
        struct exynos_drm_display *display = display_from_connector(connector);
        struct drm_display_mode *mode;
        struct exynos_drm_panel_info *panel;
-       int ret;
 
        if (!display->controller_ops->get_panel)
                return -EINVAL;
 
-       panel = display->controller_ops->get_panel(
-                               display->controller_ctx);
-
-       for (ret = 0; panel && ret < MAX_NR_PANELS; ret++) {
-               if (panel[ret].timing.xres == -1 &&
-                   panel[ret].timing.yres == -1)
-                       break;
+       panel = display->controller_ops->get_panel(display->controller_ctx);
 
-               mode = drm_mode_create(connector->dev);
-               mode->type = DRM_MODE_TYPE_DRIVER;
+       mode = drm_mode_create(connector->dev);
+       mode->type = DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED;
 
-               /* Only the first panel is preferred mode */
-               if (ret)
-                       mode->type |= DRM_MODE_TYPE_PREFERRED;
-               else
-                       mode->type |= DRM_MODE_TYPE_USERDEF;
+       convert_to_display_mode(mode, panel);
+       connector->display_info.width_mm = mode->width_mm;
+       connector->display_info.height_mm = mode->height_mm;
+       drm_mode_set_name(mode);
+       drm_mode_probed_add(connector, mode);
 
-               convert_to_display_mode(mode, &panel[ret]);
-               connector->display_info.width_mm = mode->width_mm;
-               connector->display_info.height_mm = mode->height_mm;
-               drm_mode_set_name(mode);
-               drm_mode_probed_add(connector, mode);
-       }
-
-       return ret;
+       return 1;
 }
 
 static int exynos_drm_connector_get_modes(struct drm_connector *connector)
index 62644434650e7e13dbf76e2cd01f65f2db819803..eb565f660af073b0270c3e0a1df1b7161f4f059a 100644 (file)
@@ -86,6 +86,10 @@ void exynos_drm_overlay_update(struct exynos_drm_overlay *overlay,
        overlay->crtc_y = pos->crtc_y;
        overlay->crtc_width = actual_w;
        overlay->crtc_height = actual_h;
+       overlay->crtc_htotal = mode->crtc_htotal;
+       overlay->crtc_hsync_len = mode->hsync_end - mode->hsync_start;
+       overlay->crtc_vtotal = mode->crtc_vtotal;
+       overlay->crtc_vsync_len = mode->vsync_end - mode->vsync_start;
 
        /* set drm mode data. */
        overlay->mode_width = mode->hdisplay;
index 5aae6904e8623360e411c4562639195010ecf58b..d2d227ea7305f0f2d1699ee53f56a4c0ad02adbd 100644 (file)
@@ -103,6 +103,10 @@ struct exynos_drm_overlay {
        unsigned int crtc_y;
        unsigned int crtc_width;
        unsigned int crtc_height;
+       unsigned int crtc_htotal;
+       unsigned int crtc_hsync_len;
+       unsigned int crtc_vtotal;
+       unsigned int crtc_vsync_len;
        unsigned int mode_width;
        unsigned int mode_height;
        unsigned int refresh;
index 75a002cbd249fd6fe40cd35e551838d17b6bf7e3..7d8e837d41a390903c4570adc8ff016c51211bcb 100644 (file)
@@ -67,6 +67,19 @@ struct fimd_win_data {
        unsigned int            fb_height;
        unsigned int            fb_pitch;
        unsigned int            bpp;
+
+       /*
+        * TODO(seanpaul): These fields only really make sense for the 'default
+        * window', but we go through the same path for updating a plane as we
+        * do for setting the crtc mode. If/when/once these are decoupled, this
+        * code should be refactored to seperate plane/overlay/window settings
+        * with crtc settings.
+        */
+       unsigned int            hsync_len;
+       unsigned int            hmargin;
+       unsigned int            vsync_len;
+       unsigned int            vmargin;
+
        dma_addr_t              dma_addr;
        void __iomem            *vaddr;
        unsigned int            buf_offsize;
@@ -87,14 +100,13 @@ struct fimd_context {
        void __iomem                    *regs;
        void __iomem                    *regs_mie;
        struct fimd_win_data            win_data[WINDOWS_NR];
-       unsigned int                    clkdiv[MAX_NR_PANELS];
        unsigned int                    default_win;
        unsigned long                   irq_flags;
        u32                             vidcon0;
        u32                             vidcon1;
-       int                             idx;
        bool                            suspended;
        struct mutex                    lock;
+       u32                             clkdiv;
 
        struct exynos_drm_panel_info *panel;
 };
@@ -139,12 +151,15 @@ static int fimd_power(void *ctx, int mode)
 static void fimd_commit(void *ctx)
 {
        struct fimd_context *fimd_ctx = ctx;
-       struct exynos_drm_panel_info *panel = &fimd_ctx->panel[fimd_ctx->idx];
-       struct fb_videomode *timing = &panel->timing;
+       struct fimd_win_data *win_data;
        u32 val;
 
        if (fimd_ctx->suspended)
                return;
+       win_data = &fimd_ctx->win_data[fimd_ctx->default_win];
+
+       if (!win_data->ovl_width || !win_data->ovl_height)
+               return;
 
        DRM_DEBUG_KMS("%s\n", __FILE__);
 
@@ -152,29 +167,28 @@ static void fimd_commit(void *ctx)
        writel(fimd_ctx->vidcon1, fimd_ctx->regs + VIDCON1);
 
        /* setup vertical timing values. */
-       val = VIDTCON0_VBPD(timing->upper_margin - 1) |
-              VIDTCON0_VFPD(timing->lower_margin - 1) |
-              VIDTCON0_VSPW(timing->vsync_len - 1);
+       val = VIDTCON0_VBPD(win_data->vmargin - 1) |
+               VIDTCON0_VFPD(win_data->vmargin - 1) |
+               VIDTCON0_VSPW(win_data->vsync_len - 1);
        writel(val, fimd_ctx->regs + VIDTCON0);
 
        /* setup horizontal timing values.  */
-       val = VIDTCON1_HBPD(timing->left_margin - 1) |
-              VIDTCON1_HFPD(timing->right_margin - 1) |
-              VIDTCON1_HSPW(timing->hsync_len - 1);
+       val = VIDTCON1_HBPD(win_data->hmargin - 1) |
+               VIDTCON1_HFPD(win_data->hmargin - 1) |
+               VIDTCON1_HSPW(win_data->hsync_len - 1);
        writel(val, fimd_ctx->regs + VIDTCON1);
 
        /* setup horizontal and vertical display size. */
-       val = VIDTCON2_LINEVAL(timing->yres - 1) |
-              VIDTCON2_HOZVAL(timing->xres - 1);
+       val = VIDTCON2_LINEVAL(win_data->ovl_height - 1) |
+              VIDTCON2_HOZVAL(win_data->ovl_width - 1);
        writel(val, fimd_ctx->regs + VIDTCON2);
 
        /* setup clock source, clock divider, enable dma. */
        val = fimd_ctx->vidcon0;
        val &= ~(VIDCON0_CLKVAL_F_MASK | VIDCON0_CLKDIR);
 
-       if (fimd_ctx->clkdiv[fimd_ctx->idx] > 1)
-               val |= VIDCON0_CLKVAL_F(fimd_ctx->clkdiv[fimd_ctx->idx] - 1) |
-                       VIDCON0_CLKDIR;
+       if (fimd_ctx->clkdiv)
+               val |= VIDCON0_CLKVAL_F(fimd_ctx->clkdiv - 1) | VIDCON0_CLKDIR;
        else
                val &= ~VIDCON0_CLKDIR; /* 1:1 clock */
 
@@ -235,11 +249,54 @@ static void fimd_disable_vblank(void *ctx)
        }
 }
 
+static int fimd_calc_clkdiv(struct fimd_context *fimd_ctx,
+                           struct fimd_win_data *win_data,
+                           int refresh)
+{
+       unsigned long clk = clk_get_rate(fimd_ctx->lcd_clk);
+       u32 retrace;
+       u32 clkdiv;
+       u32 best_framerate = 0;
+       u32 framerate;
+
+       DRM_DEBUG_KMS("%s\n", __FILE__);
+
+       retrace = win_data->hmargin * 2 + win_data->hsync_len +
+                               win_data->ovl_width;
+       retrace *= win_data->vmargin * 2 + win_data->vsync_len +
+                               win_data->ovl_height;
+
+       /* default framerate is 60Hz */
+       if (!refresh)
+               refresh = 60;
+
+       clk /= retrace;
+
+       for (clkdiv = 1; clkdiv < 0x100; clkdiv++) {
+               int tmp;
+
+               /* get best framerate */
+               framerate = clk / clkdiv;
+               tmp = refresh - framerate;
+               if (tmp < 0) {
+                       best_framerate = framerate;
+                       continue;
+               } else {
+                       if (!best_framerate)
+                               best_framerate = framerate;
+                       else if (tmp < (best_framerate - framerate))
+                               best_framerate = framerate;
+                       break;
+               }
+       }
+       return clkdiv;
+}
+
 static void fimd_win_mode_set(void *ctx, struct exynos_drm_overlay *overlay)
 {
        struct fimd_context *fimd_ctx = ctx;
        struct fimd_win_data *win_data;
-       int i, win;
+       int win;
        unsigned long offset;
 
        DRM_DEBUG_KMS("%s\n", __FILE__);
@@ -256,24 +313,6 @@ static void fimd_win_mode_set(void *ctx, struct exynos_drm_overlay *overlay)
        if (win < 0 || win > WINDOWS_NR)
                return;
 
-       if (win == fimd_ctx->default_win) {
-               for (i = 0; i < MAX_NR_PANELS; i++) {
-                       struct fb_videomode *timing;
-
-                       timing = &fimd_ctx->panel[i].timing;
-
-                       if (timing->xres == -1 && timing->yres == -1) {
-                               DRM_ERROR("Invalid panel parameters");
-                               i = 0; /* Reset to first panel index*/
-                               break;
-                       }
-                       if (timing->xres == overlay->fb_width &&
-                           timing->yres == overlay->fb_height)
-                               break;
-               }
-               fimd_ctx->idx = i;
-       }
-
        offset = overlay->fb_x * (overlay->bpp >> 3);
        offset += overlay->fb_y * overlay->fb_pitch;
 
@@ -289,6 +328,12 @@ static void fimd_win_mode_set(void *ctx, struct exynos_drm_overlay *overlay)
        win_data->fb_width = overlay->fb_width;
        win_data->fb_height = overlay->fb_height;
        win_data->fb_pitch = overlay->fb_pitch;
+       win_data->hsync_len = overlay->crtc_hsync_len;
+       win_data->hmargin = (overlay->crtc_htotal - overlay->crtc_width -
+                               overlay->crtc_hsync_len) / 2;
+       win_data->vsync_len = overlay->crtc_vsync_len;
+       win_data->vmargin = (overlay->crtc_vtotal - overlay->crtc_height -
+                               overlay->crtc_vsync_len) / 2;
        win_data->dma_addr = overlay->dma_addr[0] + offset;
        win_data->vaddr = overlay->vaddr[0] + offset;
        win_data->bpp = overlay->bpp;
@@ -296,6 +341,10 @@ static void fimd_win_mode_set(void *ctx, struct exynos_drm_overlay *overlay)
                (overlay->fb_width * (overlay->bpp >> 3));
        win_data->line_size = overlay->fb_width * (overlay->bpp >> 3);
 
+       if (win == fimd_ctx->default_win)
+               fimd_ctx->clkdiv = fimd_calc_clkdiv(fimd_ctx, win_data,
+                                       overlay->refresh);
+
        DRM_DEBUG_KMS("offset_x = %d, offset_y = %d\n",
                        win_data->offset_x, win_data->offset_y);
        DRM_DEBUG_KMS("ovl_width = %d, ovl_height = %d\n",
@@ -395,37 +444,37 @@ static void fimd_win_set_colkey(struct fimd_context *fimd_ctx, unsigned int win)
        writel(keycon1, fimd_ctx->regs + WKEYCON1_BASE(win));
 }
 
-static void mie_set_6bit_dithering(struct fimd_context *ctx)
+static void mie_set_6bit_dithering(struct fimd_context *ctx, int win)
 {
-       struct fb_videomode *timing = &ctx->panel->timing;
+       struct fimd_win_data *win_data = &ctx->win_data[win];
        unsigned long val;
+       unsigned int width, height;
        int i;
 
-       writel(MIE_HRESOL(timing->xres) | MIE_VRESOL(timing->yres) |
-                               MIE_MODE_UI, ctx->regs_mie + MIE_CTRL1);
+       width = win_data->ovl_width;
+       height = win_data->ovl_height;
+
+       writel(MIE_HRESOL(width) | MIE_VRESOL(height) | MIE_MODE_UI,
+                       ctx->regs_mie + MIE_CTRL1);
+
+       writel(MIE_WINHADDR0(0) | MIE_WINHADDR1(width),
+                       ctx->regs_mie + MIE_WINHADDR);
+       writel(MIE_WINVADDR0(0) | MIE_WINVADDR1(height),
+                       ctx->regs_mie + MIE_WINVADDR);
 
-       writel(MIE_WINHADDR0(0) | MIE_WINHADDR1(timing->xres),
-                                               ctx->regs_mie + MIE_WINHADDR);
-       writel(MIE_WINVADDR0(0) | MIE_WINVADDR1(timing->yres),
-                                               ctx->regs_mie + MIE_WINVADDR);
+       val = (width + win_data->hmargin * 2 + win_data->hsync_len) *
+                       (height + win_data->vmargin * 2 + win_data->vsync_len) /
+                       (MIE_PWMCLKVAL + 1);
 
-       val = (timing->xres + timing->left_margin +
-                       timing->right_margin + timing->hsync_len) *
-             (timing->yres + timing->upper_margin +
-                       timing->lower_margin + timing->vsync_len) /
-                                                       (MIE_PWMCLKVAL + 1);
        writel(PWMCLKCNT(val), ctx->regs_mie + MIE_PWMCLKCNT);
 
-       writel((MIE_VBPD(timing->upper_margin)) |
-               MIE_VFPD(timing->lower_margin) |
-               MIE_VSPW(timing->vsync_len), ctx->regs_mie + MIE_PWMVIDTCON1);
+       writel((MIE_VBPD(win_data->vmargin)) | MIE_VFPD(win_data->vmargin) |
+               MIE_VSPW(win_data->vsync_len), ctx->regs_mie + MIE_PWMVIDTCON1);
 
-       writel(MIE_HBPD(timing->left_margin) |
-               MIE_HFPD(timing->right_margin) |
-               MIE_HSPW(timing->hsync_len), ctx->regs_mie + MIE_PWMVIDTCON2);
+       writel(MIE_HBPD(win_data->hmargin) | MIE_HFPD(win_data->hmargin) |
+               MIE_HSPW(win_data->hsync_len), ctx->regs_mie + MIE_PWMVIDTCON2);
 
-       writel(MIE_DITHCON_EN | MIE_RGB6MODE,
-                                       ctx->regs_mie + MIE_AUXCON);
+       writel(MIE_DITHCON_EN | MIE_RGB6MODE, ctx->regs_mie + MIE_AUXCON);
 
        /* Bypass MIE image brightness enhancement */
        for (i = 0; i <= 0x30; i += 4) {
@@ -536,7 +585,7 @@ static void fimd_win_commit(void *ctx, int zpos)
        val |= WINCONx_ENWIN;
        writel(val, fimd_ctx->regs + WINCON(win));
 
-       mie_set_6bit_dithering(fimd_ctx);
+       mie_set_6bit_dithering(fimd_ctx, win);
 
        /* Enable DMA channel and unprotect windows */
        val = readl(fimd_ctx->regs + SHADOWCON);
@@ -660,49 +709,6 @@ static struct exynos_controller_ops fimd_controller_ops = {
        .win_disable = fimd_win_disable,
 };
 
-static int fimd_calc_clkdiv(struct fimd_context *ctx,
-                           struct fb_videomode *timing)
-{
-       unsigned long clk = clk_get_rate(ctx->lcd_clk);
-       u32 retrace;
-       u32 clkdiv;
-       u32 best_framerate = 0;
-       u32 framerate;
-
-       DRM_DEBUG_KMS("%s\n", __FILE__);
-
-       retrace = timing->left_margin + timing->hsync_len +
-                               timing->right_margin + timing->xres;
-       retrace *= timing->upper_margin + timing->vsync_len +
-                               timing->lower_margin + timing->yres;
-
-       /* default framerate is 60Hz */
-       if (!timing->refresh)
-               timing->refresh = 60;
-
-       clk /= retrace;
-
-       for (clkdiv = 1; clkdiv < 0x100; clkdiv++) {
-               int tmp;
-
-               /* get best framerate */
-               framerate = clk / clkdiv;
-               tmp = timing->refresh - framerate;
-               if (tmp < 0) {
-                       best_framerate = framerate;
-                       continue;
-               } else {
-                       if (!best_framerate)
-                               best_framerate = framerate;
-                       else if (tmp < (best_framerate - framerate))
-                               best_framerate = framerate;
-                       break;
-               }
-       }
-
-       return clkdiv;
-}
-
 static void fimd_clear_win(struct fimd_context *ctx, int win)
 {
        u32 val;
@@ -851,10 +857,9 @@ static int __devinit fimd_probe(struct platform_device *pdev)
        struct device *dev = &pdev->dev;
        struct fimd_context *fimd_ctx;
        struct exynos_drm_fimd_pdata *pdata;
-       struct exynos_drm_panel_info *panel;
        struct resource *res;
        struct clk *clk_parent;
-       int win,i;
+       int win;
        int ret = -EINVAL;
 
 #ifdef CONFIG_EXYNOS_IOMMU
@@ -872,12 +877,6 @@ static int __devinit fimd_probe(struct platform_device *pdev)
                return -EINVAL;
        }
 
-       panel = pdata->panel;
-       if (!panel) {
-               dev_err(dev, "panel is null.\n");
-               return -EINVAL;
-       }
-
        fimd_ctx = kzalloc(sizeof(*fimd_ctx), GFP_KERNEL);
        if (!fimd_ctx)
                return -ENOMEM;
@@ -964,7 +963,7 @@ static int __devinit fimd_probe(struct platform_device *pdev)
        fimd_ctx->vidcon0 = pdata->vidcon0;
        fimd_ctx->vidcon1 = pdata->vidcon1;
        fimd_ctx->default_win = pdata->default_win;
-       fimd_ctx->panel = panel;
+       fimd_ctx->panel = &pdata->panel;
 
        mutex_init(&fimd_ctx->lock);
 
@@ -972,19 +971,6 @@ static int __devinit fimd_probe(struct platform_device *pdev)
 
        fimd_power(fimd_ctx, DRM_MODE_DPMS_ON);
 
-       for (i = 0;i < MAX_NR_PANELS;i++) {
-               if(panel[i].timing.xres == -1 && panel[i].timing.yres == -1)
-                       break;
-
-               fimd_ctx->clkdiv[i] = fimd_calc_clkdiv(fimd_ctx,
-                                       &panel[i].timing);
-               panel[i].timing.pixclock = clk_get_rate(fimd_ctx->lcd_clk) /
-                                               fimd_ctx->clkdiv[i];
-               DRM_DEBUG_KMS("pixel clock = %d, clkdiv = %d\n for panel[%d]",
-                               panel[i].timing.pixclock,
-                               fimd_ctx->clkdiv[i], i);
-       }
-
        for (win = 0; win < WINDOWS_NR; win++)
                fimd_clear_win(fimd_ctx, win);
 
index cf9323829a1bd81fb4e05d206d9ce7d412c263cb..7d15c84d501220a2ec2eadfa0d95522386ae078b 100644 (file)
@@ -124,8 +124,6 @@ enum e_drm_exynos_gem_mem_type {
 
 #ifdef __KERNEL__
 
-/* FIMD Panels. */
-#define MAX_NR_PANELS  5
 /**
  * A structure for lcd panel information.
  *
@@ -152,7 +150,7 @@ enum disp_panel_type {
  * @bpp: default bit per pixel.
  */
 struct exynos_drm_fimd_pdata {
-       struct exynos_drm_panel_info panel[MAX_NR_PANELS];
+       struct exynos_drm_panel_info    panel;
        u32                             vidcon0;
        u32                             vidcon1;
        unsigned int                    default_win;