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);
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;
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");
if (ovl->id == 0) {
dispc_enable_plane(ovl->id, 0);
- dispc_go(ovl->manager->id);
+ dispc_go(ovl->manager->id, 0);
mdelay(50);
break;
}
if (ovl->id == 1) {
dispc_enable_plane(ovl->id, 0);
- dispc_go(ovl->manager->id);
+ dispc_go(ovl->manager->id, 0);
mdelay(50);
break;
}
if (ovl->id == 2) {
dispc_enable_plane(ovl->id, 0);
- dispc_go(ovl->manager->id);
+ dispc_go(ovl->manager->id, 0);
mdelay(50);
break;
}
dispc_enable_plane(ovl->id, 0);
}
- dispc_go(manager->id);
+ dispc_go(manager->id, 0);
mdelay(50);
if (enable)
manager->display->enable(manager->display);
dispc_enable_plane(ovl->id, 0);
}
- dispc_go(manager->id);
+ dispc_go(manager->id, 0);
mdelay(50);
if (enable)
manager->display->enable(manager->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);
}
}
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);
return r;
}
- r = mgr->apply(mgr);
+ r = mgr->apply(mgr, 0);
if (r) {
DSSERR("failed to apply dispc config\n");
return r;
/* 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;
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);
}
}
- if (ovl->manager && (r = ovl->manager->apply(ovl->manager)))
+ if (ovl->manager && (r = ovl->manager->apply(ovl->manager, 0)))
return r;
return size;
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;
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;
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;
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;
goto out;
if (ovl->manager) {
- r = ovl->manager->apply(ovl->manager);
+ r = ovl->manager->apply(ovl->manager, 0);
if (r)
goto out;
}
/* 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;
}
goto err;
if (!init && ovl->manager)
- ovl->manager->apply(ovl->manager);
+ ovl->manager->apply(ovl->manager, !init);
}
return 0;
err:
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;
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];
goto out;
if (ovl->manager) {
- r = ovl->manager->apply(ovl->manager);
+ r = ovl->manager->apply(ovl->manager, 0);
if (r)
goto out;
}