Skip to content

Commit

Permalink
PM / devfreq: exynos4: Fix bug of resource leak and code clean on pro…
Browse files Browse the repository at this point in the history
…be()

This patch fix bug about resource leak when happening probe fail and code clean
to add debug message.

Signed-off-by: Chanwoo Choi <[email protected]>
Reviewed-by: Tomasz Figa <[email protected]>
Signed-off-by: MyungJoo Ham <[email protected]>
  • Loading branch information
chanwoochoi authored and myungjoo committed May 24, 2014
1 parent 4b660a7 commit 45c58e9
Showing 1 changed file with 23 additions and 12 deletions.
35 changes: 23 additions & 12 deletions drivers/devfreq/exynos/exynos4_bus.c
Original file line number Diff line number Diff line change
Expand Up @@ -763,19 +763,11 @@ static int exynos4_bus_get_dev_status(struct device *dev,
return 0;
}

static void exynos4_bus_exit(struct device *dev)
{
struct busfreq_data *data = dev_get_drvdata(dev);

devfreq_unregister_opp_notifier(dev, data->devfreq);
}

static struct devfreq_dev_profile exynos4_devfreq_profile = {
.initial_freq = 400000,
.polling_ms = 50,
.target = exynos4_bus_target,
.get_dev_status = exynos4_bus_get_dev_status,
.exit = exynos4_bus_exit,
};

static int exynos4210_init_tables(struct busfreq_data *data)
Expand Down Expand Up @@ -1048,8 +1040,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;
}

data->vdd_int = devm_regulator_get(dev, "vdd_int");
if (IS_ERR(data->vdd_int)) {
Expand Down Expand Up @@ -1086,23 +1081,39 @@ static int exynos4_busfreq_probe(struct platform_device *pdev)
if (IS_ERR(data->devfreq))
return PTR_ERR(data->devfreq);

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_notifier_pm:
devfreq_unregister_opp_notifier(dev, data->devfreq);
err_notifier_opp:
devfreq_remove_device(data->devfreq);

return err;
}

static int exynos4_busfreq_remove(struct platform_device *pdev)
{
struct busfreq_data *data = platform_get_drvdata(pdev);

/* Unregister all of notifier chain */
unregister_pm_notifier(&data->pm_notifier);
devfreq_unregister_opp_notifier(data->dev, data->devfreq);

/* Remove devfreq instance */
devfreq_remove_device(data->devfreq);

return 0;
Expand Down

0 comments on commit 45c58e9

Please sign in to comment.