Message ID | 20230503092742.19404-1-jia-wei.chang@mediatek.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | PM / devfreq: mtk-cci: refactor error handling of probe and remove | expand |
Il 03/05/23 11:27, jia-wei.chang ha scritto: > From: Jia-Wei Chang <jia-wei.chang@mediatek.com> > > To refactor the regulator/clk handlers so it can follow the way of "Free > the Last Thing Style". > > Signed-off-by: Jia-Wei Chang <jia-wei.chang@mediatek.com> > Fixes: 86d231b1db1b ("PM / devfreq: mediatek: Introduce MediaTek CCI devfreq driver") > --- > drivers/devfreq/mtk-cci-devfreq.c | 47 ++++++++++++++++++------------- > 1 file changed, 28 insertions(+), 19 deletions(-) > > diff --git a/drivers/devfreq/mtk-cci-devfreq.c b/drivers/devfreq/mtk-cci-devfreq.c > index e5458ada5197..d2f743774147 100644 > --- a/drivers/devfreq/mtk-cci-devfreq.c > +++ b/drivers/devfreq/mtk-cci-devfreq.c > @@ -294,14 +294,14 @@ static int mtk_ccifreq_probe(struct platform_device *pdev) > if (IS_ERR(drv->sram_reg)) { > ret = PTR_ERR(drv->sram_reg); > if (ret == -EPROBE_DEFER) > - goto out_free_resources; > + goto out_disable_proc_reg; > > drv->sram_reg = NULL; > } else { > ret = regulator_enable(drv->sram_reg); > if (ret) { > dev_err(dev, "failed to enable sram regulator\n"); > - goto out_free_resources; > + goto out_disable_proc_reg; > } > } > > @@ -316,12 +316,16 @@ static int mtk_ccifreq_probe(struct platform_device *pdev) > > ret = clk_prepare_enable(drv->cci_clk); > if (ret) > - goto out_free_resources; > + goto out_disable_sram_reg; > + > + ret = clk_prepare_enable(drv->inter_clk); Adding a clk_prepare_enable() call for a clock must be done in a separate commit. Besides, there shouldn't be any need to do that, as when you call clk_set_parent() (done in mtk_ccifreq_target()) on a clock that has flag CLK_OPS_PARENT_ENABLE, the clk core will automatically call clk_core_prepare_enable() on the new parent. If you're facing a bug for which the parent is not getting enabled, the solution is to add CLK_OPS_PARENT_ENABLE to the interested clock. Regards, Angelo
On Wed, 2023-05-03 at 13:40 +0200, AngeloGioacchino Del Regno wrote: > External email : Please do not click links or open attachments until > you have verified the sender or the content. > > > Il 03/05/23 11:27, jia-wei.chang ha scritto: > > From: Jia-Wei Chang <jia-wei.chang@mediatek.com> > > > > To refactor the regulator/clk handlers so it can follow the way of > > "Free > > the Last Thing Style". > > > > Signed-off-by: Jia-Wei Chang <jia-wei.chang@mediatek.com> > > Fixes: 86d231b1db1b ("PM / devfreq: mediatek: Introduce MediaTek > > CCI devfreq driver") > > --- > > drivers/devfreq/mtk-cci-devfreq.c | 47 ++++++++++++++++++------ > > ------- > > 1 file changed, 28 insertions(+), 19 deletions(-) > > > > diff --git a/drivers/devfreq/mtk-cci-devfreq.c > > b/drivers/devfreq/mtk-cci-devfreq.c > > index e5458ada5197..d2f743774147 100644 > > --- a/drivers/devfreq/mtk-cci-devfreq.c > > +++ b/drivers/devfreq/mtk-cci-devfreq.c > > @@ -294,14 +294,14 @@ static int mtk_ccifreq_probe(struct > > platform_device *pdev) > > if (IS_ERR(drv->sram_reg)) { > > ret = PTR_ERR(drv->sram_reg); > > if (ret == -EPROBE_DEFER) > > - goto out_free_resources; > > + goto out_disable_proc_reg; > > > > drv->sram_reg = NULL; > > } else { > > ret = regulator_enable(drv->sram_reg); > > if (ret) { > > dev_err(dev, "failed to enable sram > > regulator\n"); > > - goto out_free_resources; > > + goto out_disable_proc_reg; > > } > > } > > > > @@ -316,12 +316,16 @@ static int mtk_ccifreq_probe(struct > > platform_device *pdev) > > > > ret = clk_prepare_enable(drv->cci_clk); > > if (ret) > > - goto out_free_resources; > > + goto out_disable_sram_reg; > > + > > + ret = clk_prepare_enable(drv->inter_clk); > > Adding a clk_prepare_enable() call for a clock must be done in a > separate commit. > Besides, there shouldn't be any need to do that, as when you call > clk_set_parent() > (done in mtk_ccifreq_target()) on a clock that has flag > CLK_OPS_PARENT_ENABLE, the > clk core will automatically call clk_core_prepare_enable() on the new > parent. > > If you're facing a bug for which the parent is not getting enabled, > the solution > is to add CLK_OPS_PARENT_ENABLE to the interested clock. > > Regards, > Angelo > Hi Angelo Sir, Thanks for your suggestion. I will send a new patch to remove clk_prepare_enable() call on the parent clock, since it is not directly related to this commit purpose. As you suggested, clock parent enable will be handled by flag if necessary.
diff --git a/drivers/devfreq/mtk-cci-devfreq.c b/drivers/devfreq/mtk-cci-devfreq.c index e5458ada5197..d2f743774147 100644 --- a/drivers/devfreq/mtk-cci-devfreq.c +++ b/drivers/devfreq/mtk-cci-devfreq.c @@ -294,14 +294,14 @@ static int mtk_ccifreq_probe(struct platform_device *pdev) if (IS_ERR(drv->sram_reg)) { ret = PTR_ERR(drv->sram_reg); if (ret == -EPROBE_DEFER) - goto out_free_resources; + goto out_disable_proc_reg; drv->sram_reg = NULL; } else { ret = regulator_enable(drv->sram_reg); if (ret) { dev_err(dev, "failed to enable sram regulator\n"); - goto out_free_resources; + goto out_disable_proc_reg; } } @@ -316,12 +316,16 @@ static int mtk_ccifreq_probe(struct platform_device *pdev) ret = clk_prepare_enable(drv->cci_clk); if (ret) - goto out_free_resources; + goto out_disable_sram_reg; + + ret = clk_prepare_enable(drv->inter_clk); + if (ret) + goto out_disable_cci_clock; ret = dev_pm_opp_of_add_table(dev); if (ret) { dev_err(dev, "failed to add opp table: %d\n", ret); - goto out_disable_cci_clk; + goto out_disable_inter_clock; } rate = clk_get_rate(drv->inter_clk); @@ -329,7 +333,7 @@ static int mtk_ccifreq_probe(struct platform_device *pdev) if (IS_ERR(opp)) { ret = PTR_ERR(opp); dev_err(dev, "failed to get intermediate opp: %d\n", ret); - goto out_remove_opp_table; + goto out_free_opp_table; } drv->inter_voltage = dev_pm_opp_get_voltage(opp); dev_pm_opp_put(opp); @@ -339,7 +343,7 @@ static int mtk_ccifreq_probe(struct platform_device *pdev) if (IS_ERR(opp)) { dev_err(dev, "failed to get opp\n"); ret = PTR_ERR(opp); - goto out_remove_opp_table; + goto out_free_opp_table; } opp_volt = dev_pm_opp_get_voltage(opp); @@ -348,13 +352,13 @@ static int mtk_ccifreq_probe(struct platform_device *pdev) if (ret) { dev_err(dev, "failed to scale to highest voltage %lu in proc_reg\n", opp_volt); - goto out_remove_opp_table; + goto out_free_opp_table; } passive_data = devm_kzalloc(dev, sizeof(*passive_data), GFP_KERNEL); if (!passive_data) { ret = -ENOMEM; - goto out_remove_opp_table; + goto out_free_opp_table; } passive_data->parent_type = CPUFREQ_PARENT_DEV; @@ -365,29 +369,33 @@ static int mtk_ccifreq_probe(struct platform_device *pdev) ret = -EPROBE_DEFER; dev_err(dev, "failed to add devfreq device: %ld\n", PTR_ERR(drv->devfreq)); - goto out_remove_opp_table; + goto out_free_opp_table; } drv->opp_nb.notifier_call = mtk_ccifreq_opp_notifier; ret = dev_pm_opp_register_notifier(dev, &drv->opp_nb); if (ret) { dev_err(dev, "failed to register opp notifier: %d\n", ret); - goto out_remove_opp_table; + goto out_free_opp_table; } return 0; -out_remove_opp_table: +out_free_opp_table: dev_pm_opp_of_remove_table(dev); -out_disable_cci_clk: +out_disable_inter_clock: + clk_disable_unprepare(drv->inter_clk); + +out_disable_cci_clock: clk_disable_unprepare(drv->cci_clk); -out_free_resources: - if (regulator_is_enabled(drv->proc_reg)) - regulator_disable(drv->proc_reg); - if (drv->sram_reg && regulator_is_enabled(drv->sram_reg)) +out_disable_sram_reg: + if (drv->sram_reg) regulator_disable(drv->sram_reg); +out_disable_proc_reg: + regulator_disable(drv->proc_reg); + return ret; } @@ -398,12 +406,13 @@ static int mtk_ccifreq_remove(struct platform_device *pdev) drv = platform_get_drvdata(pdev); - dev_pm_opp_unregister_notifier(dev, &drv->opp_nb); - dev_pm_opp_of_remove_table(dev); - clk_disable_unprepare(drv->cci_clk); regulator_disable(drv->proc_reg); if (drv->sram_reg) regulator_disable(drv->sram_reg); + clk_disable_unprepare(drv->cci_clk); + clk_disable_unprepare(drv->inter_clk); + dev_pm_opp_of_remove_table(dev); + dev_pm_opp_unregister_notifier(dev, &drv->opp_nb); return 0; }