media: platform: mtk-mdp3: fix error handling about components clock_on
authorMoudy Ho <moudy.ho@mediatek.com>
Thu, 20 Oct 2022 07:17:59 +0000 (15:17 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 31 Dec 2022 12:32:08 +0000 (13:32 +0100)
[ Upstream commit 74a596e7fca6d240d61def5f448e55c256c12fed ]

Add goto statement in mdp_comp_clock_on() to avoid error code not being
propagated or returning positive values.
This change also performs a well-timed clock_off when an error occurs, and
reduces unnecessary error logging in mdp_cmdq_send().

Fixes: 61890ccaefaf ("media: platform: mtk-mdp3: add MediaTek MDP3 driver")
Signed-off-by: Moudy Ho <moudy.ho@mediatek.com>
Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/media/platform/mediatek/mdp3/mtk-mdp3-cmdq.c
drivers/media/platform/mediatek/mdp3/mtk-mdp3-comp.c

index e194dec..124c1b9 100644 (file)
@@ -433,10 +433,8 @@ int mdp_cmdq_send(struct mdp_dev *mdp, struct mdp_cmdq_param *param)
        cmd->mdp_ctx = param->mdp_ctx;
 
        ret = mdp_comp_clocks_on(&mdp->pdev->dev, cmd->comps, cmd->num_comps);
-       if (ret) {
-               dev_err(dev, "comp %d failed to enable clock!\n", ret);
+       if (ret)
                goto err_free_path;
-       }
 
        dma_sync_single_for_device(mdp->cmdq_clt->chan->mbox->dev,
                                   cmd->pkt.pa_base, cmd->pkt.cmd_buf_size,
index d3eaf88..7bc05f4 100644 (file)
@@ -699,12 +699,22 @@ int mdp_comp_clock_on(struct device *dev, struct mdp_comp *comp)
                        dev_err(dev,
                                "Failed to enable clk %d. type:%d id:%d\n",
                                i, comp->type, comp->id);
-                       pm_runtime_put(comp->comp_dev);
-                       return ret;
+                       goto err_revert;
                }
        }
 
        return 0;
+
+err_revert:
+       while (--i >= 0) {
+               if (IS_ERR_OR_NULL(comp->clks[i]))
+                       continue;
+               clk_disable_unprepare(comp->clks[i]);
+       }
+       if (comp->comp_dev)
+               pm_runtime_put_sync(comp->comp_dev);
+
+       return ret;
 }
 
 void mdp_comp_clock_off(struct device *dev, struct mdp_comp *comp)
@@ -723,11 +733,13 @@ void mdp_comp_clock_off(struct device *dev, struct mdp_comp *comp)
 
 int mdp_comp_clocks_on(struct device *dev, struct mdp_comp *comps, int num)
 {
-       int i;
+       int i, ret;
 
-       for (i = 0; i < num; i++)
-               if (mdp_comp_clock_on(dev, &comps[i]) != 0)
-                       return ++i;
+       for (i = 0; i < num; i++) {
+               ret = mdp_comp_clock_on(dev, &comps[i]);
+               if (ret)
+                       return ret;
+       }
 
        return 0;
 }