drm: rcar-du: Add max resolution support 26/31926/1
authorKoji Matsuoka <koji.matsuoka.xm@renesas.com>
Wed, 10 Dec 2014 02:53:05 +0000 (11:53 +0900)
committerDamian Hobson-Garcia <dhobsong@igel.co.jp>
Fri, 12 Dec 2014 09:13:35 +0000 (18:13 +0900)
Change-Id: I88997563d45f4f0c06ea0df746c0b8abf518f310
Signed-off-by: Koji Matsuoka <koji.matsuoka.xm@renesas.com>
Signed-off-by: Damian Hobson-Garcia <dhobsong@igel.co.jp>
drivers/gpu/drm/i2c/adv7511.c
drivers/gpu/drm/rcar-du/rcar_du_drv.c
drivers/gpu/drm/rcar-du/rcar_du_drv.h
drivers/gpu/drm/rcar-du/rcar_du_hdmicon.c

index faf1c0c..fa140e0 100644 (file)
@@ -644,9 +644,6 @@ static int adv7511_encoder_mode_valid(struct drm_encoder *encoder,
        if (mode->clock > 165000)
                return MODE_CLOCK_HIGH;
 
-       if (mode->flags & DRM_MODE_FLAG_INTERLACE)
-               return MODE_NO_INTERLACE;
-
        return MODE_OK;
 }
 
index ca3ef6a..fcee2b0 100644 (file)
@@ -80,6 +80,10 @@ static const struct rcar_du_device_info rcar_du_r8a7790_info = {
                },
        },
        .num_lvds = 2,
+       .drgbs_bit = 0,
+       .max_xres = 1920,
+       .max_yres = 1080,
+       .interlace = false,
 };
 
 static const struct rcar_du_device_info rcar_du_r8a7791_info = {
@@ -101,6 +105,10 @@ static const struct rcar_du_device_info rcar_du_r8a7791_info = {
                },
        },
        .num_lvds = 1,
+       .drgbs_bit = 1,
+       .max_xres = 1920,
+       .max_yres = 1080,
+       .interlace = true,
 };
 
 static const struct platform_device_id rcar_du_id_table[] = {
index fdd645b..f9a0eb0 100644 (file)
@@ -63,6 +63,10 @@ struct rcar_du_device_info {
        unsigned int num_crtcs;
        struct rcar_du_output_routing routes[RCAR_DU_OUTPUT_MAX];
        unsigned int num_lvds;
+       unsigned int drgbs_bit;
+       unsigned int max_xres;
+       unsigned int max_yres;
+       bool interlace;
 };
 
 struct rcar_du_device {
index 1678a31..61ca841 100644 (file)
@@ -41,6 +41,20 @@ static int rcar_du_hdmi_connector_mode_valid(struct drm_connector *connector,
        struct rcar_du_connector *con = to_rcar_connector(connector);
        struct drm_encoder *encoder = rcar_encoder_to_drm_encoder(con->encoder);
        struct drm_encoder_slave_funcs *sfuncs = to_slave_funcs(encoder);
+       struct rcar_du_device *rcdu = connector->dev->dev_private;
+       unsigned int max_width, max_height;
+       bool laced;
+
+       max_width = rcdu->info->max_xres;
+       max_height = rcdu->info->max_yres;
+       laced = rcdu->info->interlace;
+
+       if ((mode->hdisplay * mode->vdisplay) > (max_width * max_height))
+               return MODE_BAD_WIDTH;
+
+       if (((mode->hdisplay * mode->vdisplay) == (max_width * max_height))
+               && (laced) && (!(mode->flags & DRM_MODE_FLAG_INTERLACE)))
+               return MODE_BAD;
 
        if (sfuncs->mode_valid == NULL)
                return MODE_OK;