OMAPDSS: store overlays in a list for each manager
Current way of handling overlay-manager links is a bit strange: each manager has a static array, containing pointers to all the overlays (even those used by other managers). The overlays contain a pointer to the manager being used. This patch makes the system a bit saner: each manager has a linked list of overlays, and only the overlays linked to that manager are in the list. Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
This commit is contained in:
Родитель
5617ad0979
Коммит
07e327c9c1
|
@ -398,8 +398,7 @@ void dss_mgr_start_update(struct omap_overlay_manager *mgr)
|
|||
{
|
||||
struct manager_cache_data *mc;
|
||||
struct overlay_cache_data *oc;
|
||||
const int num_ovls = dss_feat_get_num_ovls();
|
||||
int i;
|
||||
struct omap_overlay *ovl;
|
||||
|
||||
mc = &dss_cache.manager_cache[mgr->id];
|
||||
|
||||
|
@ -407,11 +406,8 @@ void dss_mgr_start_update(struct omap_overlay_manager *mgr)
|
|||
configure_dispc();
|
||||
mc->do_manual_update = false;
|
||||
|
||||
for (i = 0; i < num_ovls; ++i) {
|
||||
oc = &dss_cache.overlay_cache[i];
|
||||
if (oc->channel != mgr->id)
|
||||
continue;
|
||||
|
||||
list_for_each_entry(ovl, &mgr->overlays, list) {
|
||||
oc = &dss_cache.overlay_cache[ovl->id];
|
||||
oc->shadow_dirty = false;
|
||||
}
|
||||
|
||||
|
@ -584,8 +580,9 @@ static void omap_dss_mgr_apply_ovl_fifos(struct omap_overlay *ovl)
|
|||
|
||||
int omap_dss_mgr_apply(struct omap_overlay_manager *mgr)
|
||||
{
|
||||
int i, r;
|
||||
int r;
|
||||
unsigned long flags;
|
||||
struct omap_overlay *ovl;
|
||||
|
||||
DSSDBG("omap_dss_mgr_apply(%s)\n", mgr->name);
|
||||
|
||||
|
@ -596,31 +593,15 @@ int omap_dss_mgr_apply(struct omap_overlay_manager *mgr)
|
|||
spin_lock_irqsave(&dss_cache.lock, flags);
|
||||
|
||||
/* Configure overlays */
|
||||
for (i = 0; i < mgr->num_overlays; ++i) {
|
||||
struct omap_overlay *ovl;
|
||||
|
||||
ovl = mgr->overlays[i];
|
||||
|
||||
if (ovl->manager != mgr)
|
||||
continue;
|
||||
|
||||
list_for_each_entry(ovl, &mgr->overlays, list)
|
||||
omap_dss_mgr_apply_ovl(ovl);
|
||||
}
|
||||
|
||||
/* Configure manager */
|
||||
omap_dss_mgr_apply_mgr(mgr);
|
||||
|
||||
/* Configure overlay fifos */
|
||||
for (i = 0; i < mgr->num_overlays; ++i) {
|
||||
struct omap_overlay *ovl;
|
||||
|
||||
ovl = mgr->overlays[i];
|
||||
|
||||
if (ovl->manager != mgr)
|
||||
continue;
|
||||
|
||||
list_for_each_entry(ovl, &mgr->overlays, list)
|
||||
omap_dss_mgr_apply_ovl_fifos(ovl);
|
||||
}
|
||||
|
||||
r = 0;
|
||||
if (mgr->enabled && !mgr_manual_update(mgr)) {
|
||||
|
|
|
@ -470,8 +470,8 @@ static struct kobj_type manager_ktype = {
|
|||
static int omap_dss_set_device(struct omap_overlay_manager *mgr,
|
||||
struct omap_dss_device *dssdev)
|
||||
{
|
||||
int i;
|
||||
int r;
|
||||
struct omap_overlay *ovl;
|
||||
|
||||
if (dssdev->manager) {
|
||||
DSSERR("display '%s' already has a manager '%s'\n",
|
||||
|
@ -485,10 +485,8 @@ static int omap_dss_set_device(struct omap_overlay_manager *mgr,
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
for (i = 0; i < mgr->num_overlays; i++) {
|
||||
struct omap_overlay *ovl = mgr->overlays[i];
|
||||
|
||||
if (ovl->manager != mgr || !ovl->info.enabled)
|
||||
list_for_each_entry(ovl, &mgr->overlays, list) {
|
||||
if (!ovl->info.enabled)
|
||||
continue;
|
||||
|
||||
r = dss_check_overlay(ovl, dssdev);
|
||||
|
@ -626,7 +624,7 @@ int dss_init_overlay_managers(struct platform_device *pdev)
|
|||
mgr->supported_displays =
|
||||
dss_feat_get_supported_displays(mgr->id);
|
||||
|
||||
dss_overlay_setup_dispc_manager(mgr);
|
||||
INIT_LIST_HEAD(&mgr->overlays);
|
||||
|
||||
r = kobject_init_and_add(&mgr->kobj, &manager_ktype,
|
||||
&pdev->dev.kobj, "manager%d", i);
|
||||
|
|
|
@ -566,6 +566,7 @@ static int omap_dss_set_manager(struct omap_overlay *ovl,
|
|||
}
|
||||
|
||||
ovl->manager = mgr;
|
||||
list_add_tail(&ovl->list, &mgr->overlays);
|
||||
ovl->manager_changed = true;
|
||||
|
||||
/* XXX: When there is an overlay on a DSI manual update display, and
|
||||
|
@ -597,6 +598,7 @@ static int omap_dss_unset_manager(struct omap_overlay *ovl)
|
|||
}
|
||||
|
||||
ovl->manager = NULL;
|
||||
list_del(&ovl->list);
|
||||
ovl->manager_changed = true;
|
||||
|
||||
return 0;
|
||||
|
@ -617,14 +619,6 @@ struct omap_overlay *omap_dss_get_overlay(int num)
|
|||
}
|
||||
EXPORT_SYMBOL(omap_dss_get_overlay);
|
||||
|
||||
static struct omap_overlay *dispc_overlays[MAX_DSS_OVERLAYS];
|
||||
|
||||
void dss_overlay_setup_dispc_manager(struct omap_overlay_manager *mgr)
|
||||
{
|
||||
mgr->num_overlays = dss_feat_get_num_ovls();
|
||||
mgr->overlays = dispc_overlays;
|
||||
}
|
||||
|
||||
void dss_init_overlays(struct platform_device *pdev)
|
||||
{
|
||||
int i, r;
|
||||
|
@ -684,8 +678,6 @@ void dss_init_overlays(struct platform_device *pdev)
|
|||
|
||||
if (r)
|
||||
DSSERR("failed to create sysfs file\n");
|
||||
|
||||
dispc_overlays[i] = ovl;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -423,8 +423,7 @@ struct omap_overlay_manager {
|
|||
const char *name;
|
||||
enum omap_channel id;
|
||||
enum omap_overlay_manager_caps caps;
|
||||
int num_overlays;
|
||||
struct omap_overlay **overlays;
|
||||
struct list_head overlays;
|
||||
enum omap_display_type supported_displays;
|
||||
|
||||
/* dynamic fields */
|
||||
|
|
Загрузка…
Ссылка в новой задаче