Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 45c58e93 authored by Chanwoo Choi's avatar Chanwoo Choi Committed by MyungJoo Ham
Browse files

PM / devfreq: exynos4: Fix bug of resource leak and code clean on probe()



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

Signed-off-by: default avatarChanwoo Choi <cw00.choi@samsung.com>
Reviewed-by: default avatarTomasz Figa <t.figa@samsung.com>
Signed-off-by: default avatarMyungJoo Ham <myungjoo.ham@samsung.com>
parent 4b660a7f
Loading
Loading
Loading
Loading
+23 −12
Original line number Diff line number Diff line
@@ -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)
@@ -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)) {
@@ -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;