[PATCH] drm/ingenic: Fix driver not probing when IPU port is missing

7 views
Skip to first unread message

Paul Cercueil

unread,
Aug 26, 2020, 5:58:50 PM8/26/20
to David Airlie, Daniel Vetter, Sam Ravnborg, dri-...@lists.freedesktop.org, linux-...@vger.kernel.org, o...@zcrc.me, Ezequiel Garcia, MIPS Creator CI20 Development, Paul Cercueil
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 <pa...@crapouillou.net>
---
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);
+}
+
+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

Sam Ravnborg

unread,
Aug 27, 2020, 12:39:03 AM8/27/20
to Paul Cercueil, David Airlie, Daniel Vetter, dri-...@lists.freedesktop.org, linux-...@vger.kernel.org, o...@zcrc.me, Ezequiel Garcia, MIPS Creator CI20 Development
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 <pa...@crapouillou.net>
> ---
> 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
Reply all
Reply to author
Forward
0 new messages