In ipu_add_client_devices(), we need to call of_node_put() for
reference returned by of_graph_get_port_by_id() in fail path.

Fixes: 17e052175039 ("gpu: ipu-v3: Do not bail out on missing optional port 
nodes")
Signed-off-by: Liang He <win...@126.com>
---
In fact, there may be another problem in following code:
 'reg->pdata.of_node = of_node;'
 'ret = platform_device_add_data(pdev, &reg->pdata,
                       sizeof(reg->pdata));'
The prolbem is that the 'of_node' will first escape into 
global 'reg (i.e., client_reg)' and then 'kmemdup' into 
'pdev->dev.platform_data', so there are totally two copies 
of the reference 'of_node'. 
I do not know if there is any problems as I do not know the 
whole picture of 'platform_device_*'.

As a result, I can only give a fix, adding the of_node_put().

 drivers/gpu/ipu-v3/ipu-common.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/gpu/ipu-v3/ipu-common.c b/drivers/gpu/ipu-v3/ipu-common.c
index 118318513e2d..c35eac1116f5 100644
--- a/drivers/gpu/ipu-v3/ipu-common.c
+++ b/drivers/gpu/ipu-v3/ipu-common.c
@@ -1165,6 +1165,7 @@ static int ipu_add_client_devices(struct ipu_soc *ipu, 
unsigned long ipu_base)
                pdev = platform_device_alloc(reg->name, id++);
                if (!pdev) {
                        ret = -ENOMEM;
+                       of_node_put(of_node);
                        goto err_register;
                }
 
-- 
2.25.1

Reply via email to