OMAP: DSS2: DSI: Get line buffer size from DSI_GNQ register
Archit Taneja [Mon, 16 May 2011 09:47:09 +0000 (14:47 +0530)]
The line buffer sizes vary across DSI modules, create a function
dsi_get_line_buf_size() using DSI_GNQ register to get the size of
line buffer used for the DISPC video port data.

Signed-off-by: Archit Taneja <archit@ti.com>
Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>

drivers/video/omap2/dss/dsi.c

index 784677d..345757c 100644 (file)
@@ -2036,6 +2036,37 @@ static inline int dsi_get_num_data_lanes_dssdev(struct omap_dss_device *dssdev)
        return num_data_lanes;
 }
 
+static unsigned dsi_get_line_buf_size(struct platform_device *dsidev)
+{
+       int val;
+
+       /* line buffer on OMAP3 is 1024 x 24bits */
+       /* XXX: for some reason using full buffer size causes
+        * considerable TX slowdown with update sizes that fill the
+        * whole buffer */
+       if (!dss_has_feature(FEAT_DSI_GNQ))
+               return 1023 * 3;
+
+       val = REG_GET(dsidev, DSI_GNQ, 14, 12); /* VP1_LINE_BUFFER_SIZE */
+
+       switch (val) {
+       case 1:
+               return 512 * 3;         /* 512x24 bits */
+       case 2:
+               return 682 * 3;         /* 682x24 bits */
+       case 3:
+               return 853 * 3;         /* 853x24 bits */
+       case 4:
+               return 1024 * 3;        /* 1024x24 bits */
+       case 5:
+               return 1194 * 3;        /* 1194x24 bits */
+       case 6:
+               return 1365 * 3;        /* 1365x24 bits */
+       default:
+               BUG();
+       }
+}
+
 static void dsi_set_lane_config(struct omap_dss_device *dssdev)
 {
        struct platform_device *dsidev = dsi_get_dsidev_from_dssdev(dssdev);
@@ -3771,10 +3802,7 @@ static void dsi_update_screen_dispc(struct omap_dss_device *dssdev,
        u32 l;
        int r;
        const unsigned channel = dsi->update_channel;
-       /* line buffer is 1024 x 24bits */
-       /* XXX: for some reason using full buffer size causes considerable TX
-        * slowdown with update sizes that fill the whole buffer */
-       const unsigned line_buf_size = 1023 * 3;
+       const unsigned line_buf_size = dsi_get_line_buf_size(dsidev);
 
        DSSDBG("dsi_update_screen_dispc(%d,%d %dx%d)\n",
                        x, y, w, h);