Message ID | 20190111035120.20668-48-laurent.pinchart@ideasonboard.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | omapdrm: drm_bridge and drm_panel support | expand |
Hi, On Fri, Jan 11, 2019 at 05:51:18AM +0200, Laurent Pinchart wrote: > 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: Laurent Pinchart <laurent.pinchart@ideasonboard.com> > Reviewed-by: Sebastian Reichel <sebastian.reichel@collabora.com> > --- Tested-by: Sebastian Reichel <sebastian.reichel@collabora.com> -- Sebastian > drivers/gpu/drm/omapdrm/dss/base.c | 20 +++++++++++------- > .../gpu/drm/omapdrm/dss/omapdss-boot-init.c | 21 ++++++++++++++++++- > 2 files changed, 33 insertions(+), 8 deletions(-) > > diff --git a/drivers/gpu/drm/omapdrm/dss/base.c b/drivers/gpu/drm/omapdrm/dss/base.c > index 3c088cd2ceab..f8dad99013e8 100644 > --- a/drivers/gpu/drm/omapdrm/dss/base.c > +++ b/drivers/gpu/drm/omapdrm/dss/base.c > @@ -303,6 +303,7 @@ struct omapdss_comp_node { > struct list_head list; > struct device_node *node; > bool dss_core_component; > + const char *compat; > }; > > 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, > bool dss_core) > { > + struct omapdss_comp_node *comp; > struct device_node *n; > - struct omapdss_comp_node *comp = devm_kzalloc(dev, sizeof(*comp), > - GFP_KERNEL); > + const char *compat; > + int ret; > + > + ret = of_property_read_string(node, "compatible", &compat); > + if (ret < 0) > + return; > > + comp = devm_kzalloc(dev, sizeof(*comp), GFP_KERNEL); > if (comp) { > comp->node = node; > comp->dss_core_component = dss_core; > + comp->compat = compat; > list_add(&comp->list, &omapdss_comp_list); > } > > @@ -366,12 +374,8 @@ void omapdss_gather_components(struct device *dev) > > omapdss_walk_device(dev, dev->of_node, true); > > - for_each_available_child_of_node(dev->of_node, child) { > - if (!of_find_property(child, "compatible", NULL)) > - continue; > - > + for_each_available_child_of_node(dev->of_node, child) > omapdss_walk_device(dev, child, true); > - } > } > EXPORT_SYMBOL(omapdss_gather_components); > > @@ -379,6 +383,8 @@ static bool omapdss_component_is_loaded(struct omapdss_comp_node *comp) > { > if (comp->dss_core_component) > return true; > + if (!strstarts(comp->compat, "omapdss,")) > + return true; > if (omapdss_device_is_registered(comp->node)) > return true; > > diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss-boot-init.c b/drivers/gpu/drm/omapdrm/dss/omapdss-boot-init.c > index 3bfb95d230e0..309b7b453e98 100644 > --- a/drivers/gpu/drm/omapdrm/dss/omapdss-boot-init.c > +++ b/drivers/gpu/drm/omapdrm/dss/omapdss-boot-init.c > @@ -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) > { > struct device_node *dss, *child; > @@ -210,7 +229,7 @@ static int __init omapdss_boot_init(void) > n = list_first_entry(&dss_conv_list, struct dss_conv_node, > list); > > - if (!n->root) > + if (of_match_node(omapdss_of_fixups_whitelist, n->node)) > omapdss_omapify_node(n->node); > > list_del(&n->list); > -- > Regards, > > Laurent Pinchart > > _______________________________________________ > dri-devel mailing list > dri-devel@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/dri-devel
diff --git a/drivers/gpu/drm/omapdrm/dss/base.c b/drivers/gpu/drm/omapdrm/dss/base.c index 3c088cd2ceab..f8dad99013e8 100644 --- a/drivers/gpu/drm/omapdrm/dss/base.c +++ b/drivers/gpu/drm/omapdrm/dss/base.c @@ -303,6 +303,7 @@ struct omapdss_comp_node { struct list_head list; struct device_node *node; bool dss_core_component; + const char *compat; }; 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, bool dss_core) { + struct omapdss_comp_node *comp; struct device_node *n; - struct omapdss_comp_node *comp = devm_kzalloc(dev, sizeof(*comp), - GFP_KERNEL); + const char *compat; + int ret; + + ret = of_property_read_string(node, "compatible", &compat); + if (ret < 0) + return; + comp = devm_kzalloc(dev, sizeof(*comp), GFP_KERNEL); if (comp) { comp->node = node; comp->dss_core_component = dss_core; + comp->compat = compat; list_add(&comp->list, &omapdss_comp_list); } @@ -366,12 +374,8 @@ void omapdss_gather_components(struct device *dev) omapdss_walk_device(dev, dev->of_node, true); - for_each_available_child_of_node(dev->of_node, child) { - if (!of_find_property(child, "compatible", NULL)) - continue; - + for_each_available_child_of_node(dev->of_node, child) omapdss_walk_device(dev, child, true); - } } EXPORT_SYMBOL(omapdss_gather_components); @@ -379,6 +383,8 @@ static bool omapdss_component_is_loaded(struct omapdss_comp_node *comp) { if (comp->dss_core_component) return true; + if (!strstarts(comp->compat, "omapdss,")) + return true; if (omapdss_device_is_registered(comp->node)) return true; diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss-boot-init.c b/drivers/gpu/drm/omapdrm/dss/omapdss-boot-init.c index 3bfb95d230e0..309b7b453e98 100644 --- a/drivers/gpu/drm/omapdrm/dss/omapdss-boot-init.c +++ b/drivers/gpu/drm/omapdrm/dss/omapdss-boot-init.c @@ -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) { struct device_node *dss, *child; @@ -210,7 +229,7 @@ static int __init omapdss_boot_init(void) n = list_first_entry(&dss_conv_list, struct dss_conv_node, list); - if (!n->root) + if (of_match_node(omapdss_of_fixups_whitelist, n->node)) omapdss_omapify_node(n->node); list_del(&n->list);