staticstruct mmp_overlay *path_get_overlay(struct mmp_path *path, int overlay_id)
{ if (path && overlay_id < path->overlay_num) return &path->overlays[overlay_id]; return NULL;
}
staticint path_check_status(struct mmp_path *path)
{ int i; for (i = 0; i < path->overlay_num; i++) if (path->overlays[i].status) return 1;
return 0;
}
/* * Get modelist write pointer of modelist. * It also returns modelist number * this function fetches modelist from phy/panel: * for HDMI/parallel or dsi to hdmi cases, get from phy * or get from panel
*/ staticint path_get_modelist(struct mmp_path *path, struct mmp_mode **modelist)
{
BUG_ON(!path || !modelist);
if (path->panel && path->panel->get_modelist) return path->panel->get_modelist(path->panel, modelist);
return 0;
}
/* * panel list is used to pair panel/path when path/panel registered * path list is used for both buffer driver and platdriver * plat driver do path register/unregister * panel driver do panel register/unregister * buffer driver get registered path
*/ static LIST_HEAD(panel_list); static LIST_HEAD(path_list); static DEFINE_MUTEX(disp_lock);
/* * mmp_register_panel - register panel to panel_list and connect to path * @p: panel to be registered * * this function provides interface for panel drivers to register panel * to panel_list and connect to path which matchs panel->plat_path_name. * no error returns when no matching path is found as path register after * panel register is permitted.
*/ void mmp_register_panel(struct mmp_panel *panel)
{ struct mmp_path *path;
/* * mmp_unregister_panel - unregister panel from panel_list and disconnect * @p: panel to be unregistered * * this function provides interface for panel drivers to unregister panel * from panel_list and disconnect from path.
*/ void mmp_unregister_panel(struct mmp_panel *panel)
{ struct mmp_path *path;
/* * mmp_get_path - get path by name * @p: path name * * this function checks path name in path_list and return matching path * return NULL if no matching path
*/ struct mmp_path *mmp_get_path(constchar *name)
{ struct mmp_path *path = NULL, *iter;
/* * mmp_register_path - init and register path by path_info * @p: path info provided by display controller * * this function init by path info and register path to path_list * this function also try to connect path with panel by name
*/ struct mmp_path *mmp_register_path(struct mmp_path_info *info)
{ int i; struct mmp_path *path = NULL; struct mmp_panel *panel;
path = kzalloc(struct_size(path, overlays, info->overlay_num),
GFP_KERNEL); if (!path) return NULL;
/* default op set: if already set by driver, never cover it */ if (!path->ops.check_status)
path->ops.check_status = path_check_status; if (!path->ops.get_overlay)
path->ops.get_overlay = path_get_overlay; if (!path->ops.get_modelist)
path->ops.get_modelist = path_get_modelist;
/* step3: init overlays */ for (i = 0; i < path->overlay_num; i++) {
path->overlays[i].path = path;
path->overlays[i].id = i;
mutex_init(&path->overlays[i].access_ok);
path->overlays[i].ops = info->overlay_ops;
}
/* add to pathlist */
list_add_tail(&path->node, &path_list);
/* * mmp_unregister_path - unregister and destroy path * @p: path to be destroyed. * * this function registers path and destroys it.
*/ void mmp_unregister_path(struct mmp_path *path)
{ int i;
if (!path) return;
mutex_lock(&disp_lock); /* del from pathlist */
list_del(&path->node);
/* deinit overlays */ for (i = 0; i < path->overlay_num; i++)
mutex_destroy(&path->overlays[i].access_ok);
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.