OMAPDSS: DSI: Add function to set panel size for command mode panels
authorArchit Taneja <archit@ti.com>
Thu, 9 Aug 2012 09:53:43 +0000 (15:23 +0530)
committerArchit Taneja <archit@ti.com>
Mon, 13 Aug 2012 10:14:39 +0000 (15:44 +0530)
DSI command mode panels don't need to configure a full set of timings to
configure DSI, they only require the width and the height of the panel in
pixels.

Use omapdss_dsi_set_size for command mode panels, omapdss_dsi_set_timings is
meant for video mode panels. When performing rotation via chaning the address
mode of the panel, we would need to swap width and height when doing 90 or 270
rotation. Make sure that omapdss_dsi_set_size() makes the new width and height
visible to DSI.

Signed-off-by: Archit Taneja <archit@ti.com>
drivers/video/omap2/displays/panel-taal.c
drivers/video/omap2/dss/dsi.c
include/video/omapdss.h

index 3f5acc7771da34f6f08549c7c8db27b40d102af9..c3bca2fb15d40086a729573782ae691962adb762 100644 (file)
@@ -1060,6 +1060,9 @@ static int taal_power_on(struct omap_dss_device *dssdev)
                goto err0;
        };
 
+       omapdss_dsi_set_size(dssdev, dssdev->panel.timings.x_res,
+               dssdev->panel.timings.y_res);
+
        r = omapdss_dsi_display_enable(dssdev);
        if (r) {
                dev_err(&dssdev->dev, "failed to enable DSI\n");
@@ -1487,6 +1490,7 @@ static int taal_get_te(struct omap_dss_device *dssdev)
 static int taal_rotate(struct omap_dss_device *dssdev, u8 rotate)
 {
        struct taal_data *td = dev_get_drvdata(&dssdev->dev);
+       u16 dw, dh;
        int r;
 
        dev_dbg(&dssdev->dev, "rotate %d\n", rotate);
@@ -1508,6 +1512,16 @@ static int taal_rotate(struct omap_dss_device *dssdev, u8 rotate)
                        goto err;
        }
 
+       if (rotate == 0 || rotate == 2) {
+               dw = dssdev->panel.timings.x_res;
+               dh = dssdev->panel.timings.y_res;
+       } else {
+               dw = dssdev->panel.timings.y_res;
+               dh = dssdev->panel.timings.x_res;
+       }
+
+       omapdss_dsi_set_size(dssdev, dw, dh);
+
        td->rotate = rotate;
 
        dsi_bus_unlock(dssdev);
index 4787e469131b8fe097f25e03e62fa3b7ba34f638..da68a2f93104e2cd86266b47c2c9ec6eba32b845 100644 (file)
@@ -4328,7 +4328,8 @@ int omap_dsi_update(struct omap_dss_device *dssdev, int channel,
        dsi->framedone_callback = callback;
        dsi->framedone_data = data;
 
-       dssdev->driver->get_resolution(dssdev, &dw, &dh);
+       dw = dsi->timings.x_res;
+       dh = dsi->timings.y_res;
 
 #ifdef DEBUG
        dsi->update_bytes = dw * dh *
@@ -4374,12 +4375,6 @@ static int dsi_display_init_dispc(struct omap_dss_device *dssdev)
        u32 irq = 0;
 
        if (dssdev->panel.dsi_mode == OMAP_DSS_DSI_CMD_MODE) {
-               u16 dw, dh;
-
-               dssdev->driver->get_resolution(dssdev, &dw, &dh);
-
-               dsi->timings.x_res = dw;
-               dsi->timings.y_res = dh;
                dsi->timings.hsw = 1;
                dsi->timings.hfp = 1;
                dsi->timings.hbp = 1;
@@ -4667,6 +4662,20 @@ void omapdss_dsi_set_timings(struct omap_dss_device *dssdev,
 }
 EXPORT_SYMBOL(omapdss_dsi_set_timings);
 
+void omapdss_dsi_set_size(struct omap_dss_device *dssdev, u16 w, u16 h)
+{
+       struct platform_device *dsidev = dsi_get_dsidev_from_dssdev(dssdev);
+       struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev);
+
+       mutex_lock(&dsi->lock);
+
+       dsi->timings.x_res = w;
+       dsi->timings.y_res = h;
+
+       mutex_unlock(&dsi->lock);
+}
+EXPORT_SYMBOL(omapdss_dsi_set_size);
+
 static int __init dsi_init_display(struct omap_dss_device *dssdev)
 {
        struct platform_device *dsidev = dsi_get_dsidev_from_dssdev(dssdev);
index 47cfc170100e25662cf7815c62147664540acab9..0898c2fad9ae94d49b1573cc5fefb4a696474962 100644 (file)
@@ -721,6 +721,7 @@ void omapdss_dsi_vc_enable_hs(struct omap_dss_device *dssdev, int channel,
 int omapdss_dsi_enable_te(struct omap_dss_device *dssdev, bool enable);
 void omapdss_dsi_set_timings(struct omap_dss_device *dssdev,
                struct omap_video_timings *timings);
+void omapdss_dsi_set_size(struct omap_dss_device *dssdev, u16 w, u16 h);
 
 int omap_dsi_update(struct omap_dss_device *dssdev, int channel,
                void (*callback)(int, void *), void *data);