DSS2: make pan, set var not to wait for GO bits
authorGrazvydas Ignotas <notasas@gmail.com>
Sun, 6 Jun 2010 21:51:19 +0000 (00:51 +0300)
committerGrazvydas Ignotas <notasas@gmail.com>
Mon, 7 Jun 2010 22:01:34 +0000 (01:01 +0300)
In case we want to run faster than LCD refresh rate, we'll
eventually hit already set GO bit, and waiting for it to
clear will not allow to go faster then refresh, which is not
always desirable. Disable this behavior, anyone wanting to
sync can always use FBIO_WAITFORVSYNC.

arch/arm/plat-omap/include/mach/display.h
drivers/video/omap2/dss/dispc.c
drivers/video/omap2/dss/dpi.c
drivers/video/omap2/dss/dss.h
drivers/video/omap2/dss/manager.c
drivers/video/omap2/dss/overlay.c
drivers/video/omap2/omapfb/omapfb-ioctl.c
drivers/video/omap2/omapfb/omapfb-main.c
drivers/video/omap2/omapfb/omapfb-sysfs.c

index 45b16ca..fc897e2 100644 (file)
@@ -412,7 +412,7 @@ struct omap_overlay_manager {
                struct omap_display *display);
        int (*unset_display)(struct omap_overlay_manager *mgr);
 
-       int (*apply)(struct omap_overlay_manager *mgr);
+       int (*apply)(struct omap_overlay_manager *mgr, int no_wait);
 
        void (*set_default_color)(struct omap_overlay_manager *mgr, u32 color);
        u32 (*get_default_color)(struct omap_overlay_manager *mgr);
index f79decb..091df9b 100644 (file)
@@ -482,7 +482,7 @@ static inline void enable_clocks(bool enable)
                dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK1);
 }
 
-void dispc_go(enum omap_channel channel)
+void dispc_go(enum omap_channel channel, int no_wait)
 {
        int bit;
        unsigned long tmo;
@@ -503,13 +503,15 @@ void dispc_go(enum omap_channel channel)
        else
                bit = 6; /* GODIGIT */
 
-       tmo = jiffies + msecs_to_jiffies(200);
-       while (REG_GET(DISPC_CONTROL, bit, bit) == 1) {
-               if (time_after(jiffies, tmo)) {
-                       DSSERR("timeout waiting GO flag\n");
-                       goto end;
+       if (!no_wait) {
+               tmo = jiffies + msecs_to_jiffies(200);
+               while (REG_GET(DISPC_CONTROL, bit, bit) == 1) {
+                       if (time_after(jiffies, tmo)) {
+                               DSSERR("timeout waiting GO flag\n");
+                               goto end;
+                       }
+                       cpu_relax();
                }
-               cpu_relax();
        }
 
        DSSDBG("GO %s\n", channel == OMAP_DSS_CHANNEL_LCD ? "LCD" : "DIGIT");
@@ -2701,7 +2703,7 @@ static void dispc_error_worker(struct work_struct *work)
 
                        if (ovl->id == 0) {
                                dispc_enable_plane(ovl->id, 0);
-                               dispc_go(ovl->manager->id);
+                               dispc_go(ovl->manager->id, 0);
                                mdelay(50);
                                break;
                        }
@@ -2719,7 +2721,7 @@ static void dispc_error_worker(struct work_struct *work)
 
                        if (ovl->id == 1) {
                                dispc_enable_plane(ovl->id, 0);
-                               dispc_go(ovl->manager->id);
+                               dispc_go(ovl->manager->id, 0);
                                mdelay(50);
                                break;
                        }
@@ -2737,7 +2739,7 @@ static void dispc_error_worker(struct work_struct *work)
 
                        if (ovl->id == 2) {
                                dispc_enable_plane(ovl->id, 0);
-                               dispc_go(ovl->manager->id);
+                               dispc_go(ovl->manager->id, 0);
                                mdelay(50);
                                break;
                        }
@@ -2775,7 +2777,7 @@ static void dispc_error_worker(struct work_struct *work)
                                        dispc_enable_plane(ovl->id, 0);
                        }
 
-                       dispc_go(manager->id);
+                       dispc_go(manager->id, 0);
                        mdelay(50);
                        if (enable)
                                manager->display->enable(manager->display);
@@ -2813,7 +2815,7 @@ static void dispc_error_worker(struct work_struct *work)
                                        dispc_enable_plane(ovl->id, 0);
                        }
 
-                       dispc_go(manager->id);
+                       dispc_go(manager->id, 0);
                        mdelay(50);
                        if (enable)
                                manager->display->enable(manager->display);
index 71fffca..f652e88 100644 (file)
@@ -260,7 +260,7 @@ static void dpi_set_timings(struct omap_display *display,
        display->panel->timings = *timings;
        if (display->state == OMAP_DSS_DISPLAY_ACTIVE) {
                dpi_set_mode(display);
-               dispc_go(OMAP_DSS_CHANNEL_LCD);
+               dispc_go(OMAP_DSS_CHANNEL_LCD, 0);
        }
 }
 
index 20cef0a..e3c5aa1 100644 (file)
@@ -276,7 +276,7 @@ int dispc_setup_plane(enum omap_plane plane, enum omap_channel channel_out,
                      u8 rotation, bool mirror,
                      u8 global_alpha);
 
-void dispc_go(enum omap_channel channel);
+void dispc_go(enum omap_channel channel, int no_wait);
 void dispc_enable_lcd_out(bool enable);
 void dispc_enable_digit_out(bool enable);
 int dispc_enable_plane(enum omap_plane plane, bool enable);
index 1e6cd8d..10fe06f 100644 (file)
@@ -85,7 +85,7 @@ static ssize_t manager_display_store(struct omap_overlay_manager *mgr, const cha
                        return r;
                }
 
-               r = mgr->apply(mgr);
+               r = mgr->apply(mgr, 0);
                if (r) {
                        DSSERR("failed to apply dispc config\n");
                        return r;
@@ -391,7 +391,7 @@ static int overlay_enabled(struct omap_overlay *ovl)
 /* We apply settings to both managers here so that we can use optimizations
  * like fifomerge. Shadow registers can be changed first and the non-shadowed
  * should be changed last, at the same time with GO */
-static int omap_dss_mgr_apply(struct omap_overlay_manager *mgr)
+static int omap_dss_mgr_apply(struct omap_overlay_manager *mgr, int no_wait)
 {
        int i;
        int ret = 0;
@@ -512,7 +512,7 @@ static int omap_dss_mgr_apply(struct omap_overlay_manager *mgr)
                if (display->caps & OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE)
                        continue;
 
-               dispc_go(mgr->id);
+               dispc_go(mgr->id, no_wait);
        }
 
        dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK1);
index 035a57a..88488e0 100644 (file)
@@ -92,7 +92,7 @@ static ssize_t overlay_manager_store(struct omap_overlay *ovl, const char *buf,
                }
        }
 
-       if (ovl->manager && (r = ovl->manager->apply(ovl->manager)))
+       if (ovl->manager && (r = ovl->manager->apply(ovl->manager, 0)))
                return r;
 
        return size;
@@ -134,7 +134,7 @@ static ssize_t overlay_position_store(struct omap_overlay *ovl,
        if ((r = ovl->set_overlay_info(ovl, &info)))
                return r;
 
-       if (ovl->manager && (r = ovl->manager->apply(ovl->manager)))
+       if (ovl->manager && (r = ovl->manager->apply(ovl->manager, 0)))
                return r;
 
        return size;
@@ -165,7 +165,7 @@ static ssize_t overlay_output_size_store(struct omap_overlay *ovl,
        if ((r = ovl->set_overlay_info(ovl, &info)))
                return r;
 
-       if (ovl->manager && (r = ovl->manager->apply(ovl->manager)))
+       if (ovl->manager && (r = ovl->manager->apply(ovl->manager, 0)))
                return r;
 
        return size;
@@ -188,7 +188,7 @@ static ssize_t overlay_enabled_store(struct omap_overlay *ovl, const char *buf,
        if ((r = ovl->set_overlay_info(ovl, &info)))
                return r;
 
-       if (ovl->manager && (r = ovl->manager->apply(ovl->manager)))
+       if (ovl->manager && (r = ovl->manager->apply(ovl->manager, 0)))
                return r;
 
        return size;
@@ -219,7 +219,7 @@ static ssize_t overlay_global_alpha_store(struct omap_overlay *ovl,
        if ((r = ovl->set_overlay_info(ovl, &info)))
                return r;
 
-       if (ovl->manager && (r = ovl->manager->apply(ovl->manager)))
+       if (ovl->manager && (r = ovl->manager->apply(ovl->manager, 0)))
                return r;
 
        return size;
index c893fc9..bc85130 100644 (file)
@@ -76,7 +76,7 @@ static int omapfb_setup_plane(struct fb_info *fbi, struct omapfb_plane_info *pi)
                goto out;
 
        if (ovl->manager) {
-               r = ovl->manager->apply(ovl->manager);
+               r = ovl->manager->apply(ovl->manager, 0);
                if (r)
                        goto out;
        }
index 76e7c6c..29fae17 100644 (file)
@@ -786,7 +786,7 @@ int omapfb_apply_changes(struct fb_info *fbi, int init)
                        /* the fb is not available. disable the overlay */
                        omapfb_overlay_enable(ovl, 0);
                        if (!init && ovl->manager)
-                               ovl->manager->apply(ovl->manager);
+                               ovl->manager->apply(ovl->manager, 0);
                        continue;
                }
 
@@ -817,7 +817,7 @@ int omapfb_apply_changes(struct fb_info *fbi, int init)
                        goto err;
 
                if (!init && ovl->manager)
-                       ovl->manager->apply(ovl->manager);
+                       ovl->manager->apply(ovl->manager, !init);
        }
        return 0;
 err:
@@ -2003,7 +2003,7 @@ static int omapfb_probe(struct platform_device *pdev)
        for (i = 0; i < fbdev->num_managers; i++) {
                struct omap_overlay_manager *mgr;
                mgr = fbdev->managers[i];
-               r = mgr->apply(mgr);
+               r = mgr->apply(mgr, 0);
                if (r) {
                        dev_err(fbdev->dev, "failed to apply dispc config\n");
                        goto cleanup;
index 13028ae..ca1c281 100644 (file)
@@ -256,7 +256,7 @@ static ssize_t store_overlays(struct device *dev, struct device_attribute *attr,
                omapfb_overlay_enable(ovl, 0);
 
                if (ovl->manager)
-                       ovl->manager->apply(ovl->manager);
+                       ovl->manager->apply(ovl->manager, 0);
 
                for (t = i + 1; t < ofbi->num_overlays; t++)
                        ofbi->overlays[t-1] = ofbi->overlays[t];
@@ -289,7 +289,7 @@ static ssize_t store_overlays(struct device *dev, struct device_attribute *attr,
                        goto out;
 
                if (ovl->manager) {
-                       r = ovl->manager->apply(ovl->manager);
+                       r = ovl->manager->apply(ovl->manager, 0);
                        if (r)
                                goto out;
                }