Hi Paul. On Wed, Aug 26, 2020 at 11:58:41PM +0200, Paul Cercueil wrote: > Even if support for the IPU was compiled in, we may run on a device > (e.g. the Qi LB60) where the IPU is not available, or simply with an old > devicetree without the IPU node. In that case the ingenic-drm refused to > probe. > > Fix the driver so that it will probe even if the IPU node is not present > in devicetree (but then IPU support is disabled of course). > > Fixes: fc1acf317b01 ("drm/ingenic: Add support for the IPU") > Signed-off-by: Paul Cercueil <paul@xxxxxxxxxxxxxxx> > --- > drivers/gpu/drm/ingenic/ingenic-drm-drv.c | 23 ++++++++++++++++------- > 1 file changed, 16 insertions(+), 7 deletions(-) > > diff --git a/drivers/gpu/drm/ingenic/ingenic-drm-drv.c b/drivers/gpu/drm/ingenic/ingenic-drm-drv.c > index ada990a7f911..216b67f1672e 100644 > --- a/drivers/gpu/drm/ingenic/ingenic-drm-drv.c > +++ b/drivers/gpu/drm/ingenic/ingenic-drm-drv.c > @@ -673,6 +673,18 @@ static void ingenic_drm_unbind_all(void *d) > component_unbind_all(priv->dev, &priv->drm); > } > > +static inline struct device_node *ingenic_drm_get_ipu_node(struct device *dev) > +{ > + /* IPU is at port address 8 */ > + return of_graph_get_remote_node(dev->of_node, 8, 0); > +} kernel-doc for of_graph_get_remote_node() says: * Return: Remote device node associated with remote endpoint node linked * to @node. Use of_node_put() on it when done. In other words this code leaks a device node. This was the case with the old code too. Sam > + > +static inline bool ingenic_drm_has_ipu(struct device *dev) > +{ > + return IS_ENABLED(CONFIG_DRM_INGENIC_IPU) && > + !!ingenic_drm_get_ipu_node(dev); > +} > + > static int ingenic_drm_bind(struct device *dev) > { > struct platform_device *pdev = to_platform_device(dev); > @@ -808,7 +820,7 @@ static int ingenic_drm_bind(struct device *dev) > return ret; > } > > - if (IS_ENABLED(CONFIG_DRM_INGENIC_IPU)) { > + if (ingenic_drm_has_ipu(dev)) { > ret = component_bind_all(dev, drm); > if (ret) { > if (ret != -EPROBE_DEFER) > @@ -970,12 +982,9 @@ static int ingenic_drm_probe(struct platform_device *pdev) > if (!IS_ENABLED(CONFIG_DRM_INGENIC_IPU)) > return ingenic_drm_bind(dev); > > - /* IPU is at port address 8 */ > - np = of_graph_get_remote_node(dev->of_node, 8, 0); > - if (!np) { > - dev_err(dev, "Unable to get IPU node\n"); > - return -EINVAL; > - } > + np = ingenic_drm_get_ipu_node(dev); > + if (!np) > + return ingenic_drm_bind(dev); > > drm_of_component_match_add(dev, &match, compare_of, np); > > -- > 2.28.0 _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel