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.pinch...@ideasonboard.com>
> Reviewed-by: Sebastian Reichel <sebastian.reic...@collabora.com>
> ---

Tested-by: Sebastian Reichel <sebastian.reic...@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

Attachment: signature.asc
Description: PGP signature

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to