Skip to content

Commit

Permalink
OMAPDSS: DISPC: remove dssdev depependency from error handler
Browse files Browse the repository at this point in the history
The dispc error handler tries to "fix" issues by disabling and enabling
panel. This is problematic, as we're trying to remove the dependency
from omapdss to the omap_dss_devices. It's also racy, and doesn't really
fix anything.

This patch removes the use of omap_dss_device from the error handler,
and just disables and enables the associated overlay manager. This
should produce similar results as the previous solution, without using
dssdev.

However, the error handling is still horrible. But the problem boils
down to one question, to which I don't have a clear answer: what to do
when a HW error happens?

Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
  • Loading branch information
Tomi Valkeinen committed Oct 29, 2012
1 parent 4c6c65b commit b276dd0
Showing 1 changed file with 4 additions and 15 deletions.
19 changes: 4 additions & 15 deletions drivers/video/omap2/dss/dispc.c
Original file line number Diff line number Diff line change
Expand Up @@ -3902,44 +3902,33 @@ static void dispc_error_worker(struct work_struct *work)

if (bit & errors) {
int j;
struct omap_dss_device *dssdev = mgr->get_device(mgr);
bool enable;

DSSERR("SYNC_LOST on channel %s, restarting the output "
"with video overlays disabled\n",
mgr->name);

enable = dssdev->state == OMAP_DSS_DISPLAY_ACTIVE;
dssdev->driver->disable(dssdev);
dss_mgr_disable(mgr);

for (j = 0; j < omap_dss_get_num_overlays(); ++j) {
struct omap_overlay *ovl;
ovl = omap_dss_get_overlay(j);

if (ovl->id != OMAP_DSS_GFX &&
ovl->manager == mgr)
dispc_ovl_enable(ovl->id, false);
ovl->disable(ovl);
}

dispc_mgr_go(mgr->id);
msleep(50);

if (enable)
dssdev->driver->enable(dssdev);
dss_mgr_enable(mgr);
}
}

if (errors & DISPC_IRQ_OCP_ERR) {
DSSERR("OCP_ERR\n");
for (i = 0; i < omap_dss_get_num_overlay_managers(); ++i) {
struct omap_overlay_manager *mgr;
struct omap_dss_device *dssdev;

mgr = omap_dss_get_overlay_manager(i);
dssdev = mgr->get_device(mgr);

if (dssdev && dssdev->driver)
dssdev->driver->disable(dssdev);
dss_mgr_disable(mgr);
}
}

Expand Down

0 comments on commit b276dd0

Please sign in to comment.