This patch fix bug about resource leak when happening probe fail and code clean to add debug message. Signed-off-by: Chanwoo Choi <cw00.choi@xxxxxxxxxxx> --- drivers/devfreq/exynos/exynos4_bus.c | 32 ++++++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/drivers/devfreq/exynos/exynos4_bus.c b/drivers/devfreq/exynos/exynos4_bus.c index a2a3a47..152a3e9 100644 --- a/drivers/devfreq/exynos/exynos4_bus.c +++ b/drivers/devfreq/exynos/exynos4_bus.c @@ -1152,8 +1152,11 @@ static int exynos4_busfreq_probe(struct platform_device *pdev) dev_err(dev, "Cannot determine the device id %d\n", data->type); err = -EINVAL; } - if (err) + if (err) { + dev_err(dev, "Cannot initialize busfreq table %d\n", + data->type); return err; + } rcu_read_lock(); opp = dev_pm_opp_find_freq_floor(dev, @@ -1176,7 +1179,7 @@ static int exynos4_busfreq_probe(struct platform_device *pdev) if (IS_ERR(data->devfreq)) { dev_err(dev, "Failed to add devfreq device\n"); err = PTR_ERR(data->devfreq); - goto err_opp; + goto err_devfreq; } /* @@ -1185,18 +1188,35 @@ static int exynos4_busfreq_probe(struct platform_device *pdev) */ busfreq_mon_reset(data); - devfreq_register_opp_notifier(dev, data->devfreq); + /* Register opp_notifier for Exynos4 busfreq */ + err = devfreq_register_opp_notifier(dev, data->devfreq); + if (err < 0) { + dev_err(dev, "Failed to register opp notifier\n"); + goto err_notifier_opp; + } + /* Register pm_notifier for Exynos4 busfreq */ err = register_pm_notifier(&data->pm_notifier); if (err) { dev_err(dev, "Failed to setup pm notifier\n"); - devfreq_remove_device(data->devfreq); - return err; + goto err_notifier_pm; } return 0; -err_opp: +err_notifier_pm: + devfreq_unregister_opp_notifier(dev, data->devfreq); +err_notifier_opp: + /* + * The devfreq_remove_device() would execute finally devfreq->profile + * ->exit(). To avoid duplicate resource free operation, return directly + * before executing resource free below 'err_devfreq' goto statement. + */ + devfreq_remove_device(data->devfreq); + + return err; + +err_devfreq: regulator_disable(data->vdd_int); if (data->type == TYPE_BUSF_EXYNOS4x12) regulator_disable(data->vdd_mif); -- 1.8.0 -- To unsubscribe from this list: send the line "unsubscribe linux-doc" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html