OMAPDSS: DSI: call mgr_enable/disable for cmd mode displays
authorTomi Valkeinen <tomi.valkeinen@ti.com>
Wed, 9 Nov 2011 13:30:11 +0000 (15:30 +0200)
committerTomi Valkeinen <tomi.valkeinen@ti.com>
Fri, 2 Dec 2011 06:54:42 +0000 (08:54 +0200)
The current code uses dsi_video_mode_enable/disable functions to
enable/disable DISPC output for video mode displays. For command mode
displays we have no notion in the DISPC side of whether the panel is
enabled, except when a dss_mgr_start_update() call is made.

However, to properly maintain the DISPC state in apply.c, we need to
know if a manager used for a manual update display is currently in use.

This patch achieves that by changing dsi_video_mode_enable/disable to
dsi_enable/disable_video_output, which is called by both video and
command mode displays. For video mode displays it starts the actual
pixel stream, as it did before. For command mode displays it doesn't do
anything else than mark that the manager is currently in use.

Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
drivers/video/omap2/displays/panel-taal.c
drivers/video/omap2/dss/apply.c
drivers/video/omap2/dss/dsi.c
include/video/omapdss.h

index dd64bd13f4f8d042a4218c89b17f9664d08f664d..00c5c615585f91d3216df25a28fb64fbc42611b4 100644 (file)
@@ -1182,6 +1182,10 @@ static int taal_power_on(struct omap_dss_device *dssdev)
        if (r)
                goto err;
 
+       r = dsi_enable_video_output(dssdev, td->channel);
+       if (r)
+               goto err;
+
        td->enabled = 1;
 
        if (!td->intro_printed) {
@@ -1211,6 +1215,8 @@ static void taal_power_off(struct omap_dss_device *dssdev)
        struct taal_data *td = dev_get_drvdata(&dssdev->dev);
        int r;
 
+       dsi_disable_video_output(dssdev, td->channel);
+
        r = taal_dcs_write_0(td, MIPI_DCS_SET_DISPLAY_OFF);
        if (!r)
                r = taal_sleep_in(td);
index eafa808463650a0ed27f5fb8347e60fe2df73847..936571b7aace5f2842cd517dbe228b2a1fd3c3b1 100644 (file)
@@ -648,7 +648,8 @@ void dss_mgr_enable(struct omap_overlay_manager *mgr)
 {
        mutex_lock(&apply_lock);
 
-       dispc_mgr_enable(mgr->id, true);
+       if (!mgr_manual_update(mgr))
+               dispc_mgr_enable(mgr->id, true);
        mgr->enabled = true;
 
        mutex_unlock(&apply_lock);
@@ -658,7 +659,8 @@ void dss_mgr_disable(struct omap_overlay_manager *mgr)
 {
        mutex_lock(&apply_lock);
 
-       dispc_mgr_enable(mgr->id, false);
+       if (!mgr_manual_update(mgr))
+               dispc_mgr_enable(mgr->id, false);
        mgr->enabled = false;
 
        mutex_unlock(&apply_lock);
index 9358afa2a77e3ee4ac5d675247c78974a5468431..9cb2e827c001a5f11c3249cfe02365ce080620c8 100644 (file)
@@ -3973,65 +3973,70 @@ static void dsi_proto_timings(struct omap_dss_device *dssdev)
        }
 }
 
-int dsi_video_mode_enable(struct omap_dss_device *dssdev, int channel)
+int dsi_enable_video_output(struct omap_dss_device *dssdev, int channel)
 {
        struct platform_device *dsidev = dsi_get_dsidev_from_dssdev(dssdev);
        int bpp = dsi_get_pixel_size(dssdev->panel.dsi_pix_fmt);
        u8 data_type;
        u16 word_count;
 
-       switch (dssdev->panel.dsi_pix_fmt) {
-       case OMAP_DSS_DSI_FMT_RGB888:
-               data_type = MIPI_DSI_PACKED_PIXEL_STREAM_24;
-               break;
-       case OMAP_DSS_DSI_FMT_RGB666:
-               data_type = MIPI_DSI_PIXEL_STREAM_3BYTE_18;
-               break;
-       case OMAP_DSS_DSI_FMT_RGB666_PACKED:
-               data_type = MIPI_DSI_PACKED_PIXEL_STREAM_18;
-               break;
-       case OMAP_DSS_DSI_FMT_RGB565:
-               data_type = MIPI_DSI_PACKED_PIXEL_STREAM_16;
-               break;
-       default:
-               BUG();
-       };
+       if (dssdev->panel.dsi_mode == OMAP_DSS_DSI_VIDEO_MODE) {
+               switch (dssdev->panel.dsi_pix_fmt) {
+               case OMAP_DSS_DSI_FMT_RGB888:
+                       data_type = MIPI_DSI_PACKED_PIXEL_STREAM_24;
+                       break;
+               case OMAP_DSS_DSI_FMT_RGB666:
+                       data_type = MIPI_DSI_PIXEL_STREAM_3BYTE_18;
+                       break;
+               case OMAP_DSS_DSI_FMT_RGB666_PACKED:
+                       data_type = MIPI_DSI_PACKED_PIXEL_STREAM_18;
+                       break;
+               case OMAP_DSS_DSI_FMT_RGB565:
+                       data_type = MIPI_DSI_PACKED_PIXEL_STREAM_16;
+                       break;
+               default:
+                       BUG();
+               };
 
-       dsi_if_enable(dsidev, false);
-       dsi_vc_enable(dsidev, channel, false);
+               dsi_if_enable(dsidev, false);
+               dsi_vc_enable(dsidev, channel, false);
 
-       /* MODE, 1 = video mode */
-       REG_FLD_MOD(dsidev, DSI_VC_CTRL(channel), 1, 4, 4);
+               /* MODE, 1 = video mode */
+               REG_FLD_MOD(dsidev, DSI_VC_CTRL(channel), 1, 4, 4);
 
-       word_count = DIV_ROUND_UP(dssdev->panel.timings.x_res * bpp, 8);
+               word_count = DIV_ROUND_UP(dssdev->panel.timings.x_res * bpp, 8);
 
-       dsi_vc_write_long_header(dsidev, channel, data_type, word_count, 0);
+               dsi_vc_write_long_header(dsidev, channel, data_type,
+                               word_count, 0);
 
-       dsi_vc_enable(dsidev, channel, true);
-       dsi_if_enable(dsidev, true);
+               dsi_vc_enable(dsidev, channel, true);
+               dsi_if_enable(dsidev, true);
+       }
 
        dss_mgr_enable(dssdev->manager);
 
        return 0;
 }
-EXPORT_SYMBOL(dsi_video_mode_enable);
+EXPORT_SYMBOL(dsi_enable_video_output);
 
-void dsi_video_mode_disable(struct omap_dss_device *dssdev, int channel)
+void dsi_disable_video_output(struct omap_dss_device *dssdev, int channel)
 {
        struct platform_device *dsidev = dsi_get_dsidev_from_dssdev(dssdev);
 
-       dsi_if_enable(dsidev, false);
-       dsi_vc_enable(dsidev, channel, false);
+       if (dssdev->panel.dsi_mode == OMAP_DSS_DSI_VIDEO_MODE) {
+               dsi_if_enable(dsidev, false);
+               dsi_vc_enable(dsidev, channel, false);
 
-       /* MODE, 0 = command mode */
-       REG_FLD_MOD(dsidev, DSI_VC_CTRL(channel), 0, 4, 4);
+               /* MODE, 0 = command mode */
+               REG_FLD_MOD(dsidev, DSI_VC_CTRL(channel), 0, 4, 4);
 
-       dsi_vc_enable(dsidev, channel, true);
-       dsi_if_enable(dsidev, true);
+               dsi_vc_enable(dsidev, channel, true);
+               dsi_if_enable(dsidev, true);
+       }
 
        dss_mgr_disable(dssdev->manager);
 }
-EXPORT_SYMBOL(dsi_video_mode_disable);
+EXPORT_SYMBOL(dsi_disable_video_output);
 
 static void dsi_update_screen_dispc(struct omap_dss_device *dssdev,
                u16 w, u16 h)
index eaeca89de152f55c2161e8ca159b6dfb88249397..25ef771b0a31ead8a97ad8a66a75572cbaec59cb 100644 (file)
@@ -294,8 +294,8 @@ int dsi_vc_set_max_rx_packet_size(struct omap_dss_device *dssdev, int channel,
                u16 len);
 int dsi_vc_send_null(struct omap_dss_device *dssdev, int channel);
 int dsi_vc_send_bta_sync(struct omap_dss_device *dssdev, int channel);
-int dsi_video_mode_enable(struct omap_dss_device *dssdev, int channel);
-void dsi_video_mode_disable(struct omap_dss_device *dssdev, int channel);
+int dsi_enable_video_output(struct omap_dss_device *dssdev, int channel);
+void dsi_disable_video_output(struct omap_dss_device *dssdev, int channel);
 
 /* Board specific data */
 struct omap_dss_board_info {