| From 7551942cdc0474f3039e918cbf463b92bed2a3b6 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 22 Jul 2020 14:39:14 +0200 |
| Subject: media: mtk-mdp: Fix a refcounting bug on error in init |
| |
| From: Dan Carpenter <dan.carpenter@oracle.com> |
| |
| [ Upstream commit dd4eddc4ba31fbf4554fc5fa12d3a553b50e1469 ] |
| |
| We need to call of_node_put(comp->dev_node); on the error paths in this |
| function. |
| |
| Fixes: c8eb2d7e8202 ("[media] media: Add Mediatek MDP Driver") |
| Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com> |
| Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl> |
| Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/media/platform/mtk-mdp/mtk_mdp_comp.c | 16 ++++++++++++---- |
| 1 file changed, 12 insertions(+), 4 deletions(-) |
| |
| diff --git a/drivers/media/platform/mtk-mdp/mtk_mdp_comp.c b/drivers/media/platform/mtk-mdp/mtk_mdp_comp.c |
| index 14991685adb78..9b375d3677536 100644 |
| --- a/drivers/media/platform/mtk-mdp/mtk_mdp_comp.c |
| +++ b/drivers/media/platform/mtk-mdp/mtk_mdp_comp.c |
| @@ -96,6 +96,7 @@ int mtk_mdp_comp_init(struct device *dev, struct device_node *node, |
| { |
| struct device_node *larb_node; |
| struct platform_device *larb_pdev; |
| + int ret; |
| int i; |
| |
| if (comp_id < 0 || comp_id >= MTK_MDP_COMP_ID_MAX) { |
| @@ -113,8 +114,8 @@ int mtk_mdp_comp_init(struct device *dev, struct device_node *node, |
| if (IS_ERR(comp->clk[i])) { |
| if (PTR_ERR(comp->clk[i]) != -EPROBE_DEFER) |
| dev_err(dev, "Failed to get clock\n"); |
| - |
| - return PTR_ERR(comp->clk[i]); |
| + ret = PTR_ERR(comp->clk[i]); |
| + goto put_dev; |
| } |
| |
| /* Only RDMA needs two clocks */ |
| @@ -133,20 +134,27 @@ int mtk_mdp_comp_init(struct device *dev, struct device_node *node, |
| if (!larb_node) { |
| dev_err(dev, |
| "Missing mediadek,larb phandle in %pOF node\n", node); |
| - return -EINVAL; |
| + ret = -EINVAL; |
| + goto put_dev; |
| } |
| |
| larb_pdev = of_find_device_by_node(larb_node); |
| if (!larb_pdev) { |
| dev_warn(dev, "Waiting for larb device %pOF\n", larb_node); |
| of_node_put(larb_node); |
| - return -EPROBE_DEFER; |
| + ret = -EPROBE_DEFER; |
| + goto put_dev; |
| } |
| of_node_put(larb_node); |
| |
| comp->larb_dev = &larb_pdev->dev; |
| |
| return 0; |
| + |
| +put_dev: |
| + of_node_put(comp->dev_node); |
| + |
| + return ret; |
| } |
| |
| void mtk_mdp_comp_deinit(struct device *dev, struct mtk_mdp_comp *comp) |
| -- |
| 2.25.1 |
| |