Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 284935
b: refs/heads/master
c: 5558db3
h: refs/heads/master
i:
  284933: 647f521
  284931: fb77738
  284927: 8a8aa14
v: v3
  • Loading branch information
Tomi Valkeinen committed Dec 2, 2011
1 parent d0818be commit 06f949d
Show file tree
Hide file tree
Showing 2 changed files with 63 additions and 10 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 5738b633136a41923b4ba75e6b1a160d08539c99
refs/heads/master: 5558db3fdd52e3928d5eaabe363e1576dc5fe473
71 changes: 62 additions & 9 deletions trunk/drivers/video/omap2/dss/apply.c
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,8 @@ static struct {

/* protects dss_data */
static spinlock_t data_lock;
/* lock for blocking functions */
static DEFINE_MUTEX(apply_lock);

static struct ovl_priv_data *get_ovl_priv(struct omap_overlay *ovl)
{
Expand Down Expand Up @@ -639,14 +641,22 @@ int omap_dss_mgr_apply(struct omap_overlay_manager *mgr)

void dss_mgr_enable(struct omap_overlay_manager *mgr)
{
mutex_lock(&apply_lock);

dispc_mgr_enable(mgr->id, true);
mgr->enabled = true;

mutex_unlock(&apply_lock);
}

void dss_mgr_disable(struct omap_overlay_manager *mgr)
{
mutex_lock(&apply_lock);

dispc_mgr_enable(mgr->id, false);
mgr->enabled = false;

mutex_unlock(&apply_lock);
}

int dss_mgr_set_info(struct omap_overlay_manager *mgr,
Expand All @@ -669,44 +679,65 @@ int dss_mgr_set_device(struct omap_overlay_manager *mgr,
{
int r;

mutex_lock(&apply_lock);

if (dssdev->manager) {
DSSERR("display '%s' already has a manager '%s'\n",
dssdev->name, dssdev->manager->name);
return -EINVAL;
r = -EINVAL;
goto err;
}

if ((mgr->supported_displays & dssdev->type) == 0) {
DSSERR("display '%s' does not support manager '%s'\n",
dssdev->name, mgr->name);
return -EINVAL;
r = -EINVAL;
goto err;
}

dssdev->manager = mgr;
mgr->device = dssdev;
mgr->device_changed = true;

mutex_unlock(&apply_lock);

return 0;
err:
mutex_unlock(&apply_lock);
return r;
}

int dss_mgr_unset_device(struct omap_overlay_manager *mgr)
{
int r;

mutex_lock(&apply_lock);

if (!mgr->device) {
DSSERR("failed to unset display, display not set.\n");
return -EINVAL;
r = -EINVAL;
goto err;
}

/*
* Don't allow currently enabled displays to have the overlay manager
* pulled out from underneath them
*/
if (mgr->device->state != OMAP_DSS_DISPLAY_DISABLED)
return -EINVAL;
if (mgr->device->state != OMAP_DSS_DISPLAY_DISABLED) {
r = -EINVAL;
goto err;
}

mgr->device->manager = NULL;
mgr->device = NULL;
mgr->device_changed = true;

mutex_unlock(&apply_lock);

return 0;
err:
mutex_unlock(&apply_lock);
return r;
}


Expand All @@ -729,18 +760,24 @@ void dss_ovl_get_info(struct omap_overlay *ovl,
int dss_ovl_set_manager(struct omap_overlay *ovl,
struct omap_overlay_manager *mgr)
{
int r;

if (!mgr)
return -EINVAL;

mutex_lock(&apply_lock);

if (ovl->manager) {
DSSERR("overlay '%s' already has a manager '%s'\n",
ovl->name, ovl->manager->name);
return -EINVAL;
r = -EINVAL;
goto err;
}

if (ovl->info.enabled) {
DSSERR("overlay has to be disabled to change the manager\n");
return -EINVAL;
r = -EINVAL;
goto err;
}

ovl->manager = mgr;
Expand All @@ -760,25 +797,41 @@ int dss_ovl_set_manager(struct omap_overlay *ovl,
* the overlay, but before moving the overlay to TV.
*/

mutex_unlock(&apply_lock);

return 0;
err:
mutex_unlock(&apply_lock);
return r;
}

int dss_ovl_unset_manager(struct omap_overlay *ovl)
{
int r;

mutex_lock(&apply_lock);

if (!ovl->manager) {
DSSERR("failed to detach overlay: manager not set\n");
return -EINVAL;
r = -EINVAL;
goto err;
}

if (ovl->info.enabled) {
DSSERR("overlay has to be disabled to unset the manager\n");
return -EINVAL;
r = -EINVAL;
goto err;
}

ovl->manager = NULL;
list_del(&ovl->list);
ovl->manager_changed = true;

mutex_unlock(&apply_lock);

return 0;
err:
mutex_unlock(&apply_lock);
return r;
}

0 comments on commit 06f949d

Please sign in to comment.