Commit 4e17763c authored by Laurent Pinchart's avatar Laurent Pinchart Committed by Tomi Valkeinen

drm/omap: Whitelist DT nodes to fixup with omapdss, prefix

The omapdss driver patches DT at runtime to prepend an "omapdss," prefix
to the compatible string of all encoders, panels and connectors. This
mechanism ensures they get bound to the omapdss-specific drivers instead
of generic drivers.

Now that we have drm_bridge support in omapdrm, we need to selectively
disable this mechanism. Add a whitelist of compatible strings to patch,
and fill it with all the devices we support. They will be removed one by
one once corresponding drm_bridge drivers become available and get
successfully tested with omapdrm.

The omapdss components load check code is updated accordingly to ignore
devices managed by external bridge drivers.
Signed-off-by: default avatarLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: default avatarSebastian Reichel <sebastian.reichel@collabora.com>
Tested-by: default avatarSebastian Reichel <sebastian.reichel@collabora.com>
Signed-off-by: default avatarTomi Valkeinen <tomi.valkeinen@ti.com>
parent 30b71761
...@@ -303,6 +303,7 @@ struct omapdss_comp_node { ...@@ -303,6 +303,7 @@ struct omapdss_comp_node {
struct list_head list; struct list_head list;
struct device_node *node; struct device_node *node;
bool dss_core_component; bool dss_core_component;
const char *compat;
}; };
static bool omapdss_list_contains(const struct device_node *node) static bool omapdss_list_contains(const struct device_node *node)
...@@ -320,13 +321,20 @@ static bool omapdss_list_contains(const struct device_node *node) ...@@ -320,13 +321,20 @@ static bool omapdss_list_contains(const struct device_node *node)
static void omapdss_walk_device(struct device *dev, struct device_node *node, static void omapdss_walk_device(struct device *dev, struct device_node *node,
bool dss_core) bool dss_core)
{ {
struct omapdss_comp_node *comp;
struct device_node *n; struct device_node *n;
struct omapdss_comp_node *comp = devm_kzalloc(dev, sizeof(*comp), const char *compat;
GFP_KERNEL); int ret;
ret = of_property_read_string(node, "compatible", &compat);
if (ret < 0)
return;
comp = devm_kzalloc(dev, sizeof(*comp), GFP_KERNEL);
if (comp) { if (comp) {
comp->node = node; comp->node = node;
comp->dss_core_component = dss_core; comp->dss_core_component = dss_core;
comp->compat = compat;
list_add(&comp->list, &omapdss_comp_list); list_add(&comp->list, &omapdss_comp_list);
} }
...@@ -366,12 +374,8 @@ void omapdss_gather_components(struct device *dev) ...@@ -366,12 +374,8 @@ void omapdss_gather_components(struct device *dev)
omapdss_walk_device(dev, dev->of_node, true); omapdss_walk_device(dev, dev->of_node, true);
for_each_available_child_of_node(dev->of_node, child) { for_each_available_child_of_node(dev->of_node, child)
if (!of_find_property(child, "compatible", NULL))
continue;
omapdss_walk_device(dev, child, true); omapdss_walk_device(dev, child, true);
}
} }
EXPORT_SYMBOL(omapdss_gather_components); EXPORT_SYMBOL(omapdss_gather_components);
...@@ -379,6 +383,8 @@ static bool omapdss_component_is_loaded(struct omapdss_comp_node *comp) ...@@ -379,6 +383,8 @@ static bool omapdss_component_is_loaded(struct omapdss_comp_node *comp)
{ {
if (comp->dss_core_component) if (comp->dss_core_component)
return true; return true;
if (!strstarts(comp->compat, "omapdss,"))
return true;
if (omapdss_device_is_registered(comp->node)) if (omapdss_device_is_registered(comp->node))
return true; return true;
......
...@@ -184,6 +184,25 @@ static const struct of_device_id omapdss_of_match[] __initconst = { ...@@ -184,6 +184,25 @@ static const struct of_device_id omapdss_of_match[] __initconst = {
{}, {},
}; };
static const struct of_device_id omapdss_of_fixups_whitelist[] __initconst = {
{ .compatible = "composite-video-connector" },
{ .compatible = "dvi-connector" },
{ .compatible = "hdmi-connector" },
{ .compatible = "lgphilips,lb035q02" },
{ .compatible = "nec,nl8048hl11" },
{ .compatible = "panel-dpi" },
{ .compatible = "panel-dsi-cm" },
{ .compatible = "sharp,ls037v7dw01" },
{ .compatible = "sony,acx565akm" },
{ .compatible = "svideo-connector" },
{ .compatible = "ti,opa362" },
{ .compatible = "ti,tfp410" },
{ .compatible = "ti,tpd12s015" },
{ .compatible = "toppoly,td028ttec1" },
{ .compatible = "tpo,td028ttec1" },
{ .compatible = "tpo,td043mtea1" },
};
static int __init omapdss_boot_init(void) static int __init omapdss_boot_init(void)
{ {
struct device_node *dss, *child; struct device_node *dss, *child;
...@@ -210,7 +229,7 @@ static int __init omapdss_boot_init(void) ...@@ -210,7 +229,7 @@ static int __init omapdss_boot_init(void)
n = list_first_entry(&dss_conv_list, struct dss_conv_node, n = list_first_entry(&dss_conv_list, struct dss_conv_node,
list); list);
if (!n->root) if (of_match_node(omapdss_of_fixups_whitelist, n->node))
omapdss_omapify_node(n->node); omapdss_omapify_node(n->node);
list_del(&n->list); list_del(&n->list);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment