aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEnric Balletbo i Serra <enric.balletbo@collabora.com>2018-06-15 11:12:17 -0400
committerMyungJoo Ham <myungjoo.ham@samsung.com>2018-07-18 00:58:39 -0400
commitd6e98f3e6d825380b566dc59359917a116090154 (patch)
treee321331f3c5a4a42212eb5a4a5a214d662b650e1
parent2c2cb1e6b05b90d55b4b943646faa3cfbdf78f6e (diff)
PM / devfreq: rk3399_dmc: Fix duplicated opp table on reload.
The opp table is not removed when the driver is unloaded neither when there is an error within probe, so if the driver is reloaded the opp core shows the following warning: rk3399-dmc-freq dmc: _opp_add: duplicate OPPs detected. Existing: freq: 200000000, volt: 900000, enabled: 1. New: freq: 200000000, volt: 900000, enabled: 1 rk3399-dmc-freq dmc: _opp_add: duplicate OPPs detected. Existing: freq: 400000000, volt: 900000, enabled: 1. New: freq: 400000000, volt: 900000, enabled: 1 rk3399-dmc-freq dmc: _opp_add: duplicate OPPs detected. Existing: freq: 666000000, volt: 900000, enabled: 1. New: freq: 666000000, volt: 900000, enabled: 1 rk3399-dmc-freq dmc: _opp_add: duplicate OPPs detected. Existing: freq: 800000000, volt: 900000, enabled: 1. New: freq: 800000000, volt: 900000, enabled: 1 rk3399-dmc-freq dmc: _opp_add: duplicate OPPs detected. Existing: freq: 928000000, volt: 900000, enabled: 1. New: freq: 928000000, volt: 900000, enabled: 1 This patch fixes the error path in the probe function and adds a .remove function to properly cleanup the opp table on unloading. Fixes: 5a893e31a636c (PM / devfreq: rockchip: add devfreq driver for rk3399 dmc) Signed-off-by: Enric Balletbo i Serra <enric.balletbo@collabora.com> Reviewed-by: Chanwoo Choi <cw00.choi@samsung.com> Signed-off-by: MyungJoo Ham <myungjoo.ham@samsung.com>
-rw-r--r--drivers/devfreq/rk3399_dmc.c31
1 files changed, 27 insertions, 4 deletions
diff --git a/drivers/devfreq/rk3399_dmc.c b/drivers/devfreq/rk3399_dmc.c
index d5c03e5abe13..e795ad2b3f6b 100644
--- a/drivers/devfreq/rk3399_dmc.c
+++ b/drivers/devfreq/rk3399_dmc.c
@@ -375,8 +375,10 @@ static int rk3399_dmcfreq_probe(struct platform_device *pdev)
375 data->rate = clk_get_rate(data->dmc_clk); 375 data->rate = clk_get_rate(data->dmc_clk);
376 376
377 opp = devfreq_recommended_opp(dev, &data->rate, 0); 377 opp = devfreq_recommended_opp(dev, &data->rate, 0);
378 if (IS_ERR(opp)) 378 if (IS_ERR(opp)) {
379 return PTR_ERR(opp); 379 ret = PTR_ERR(opp);
380 goto err_free_opp;
381 }
380 382
381 data->rate = dev_pm_opp_get_freq(opp); 383 data->rate = dev_pm_opp_get_freq(opp);
382 data->volt = dev_pm_opp_get_voltage(opp); 384 data->volt = dev_pm_opp_get_voltage(opp);
@@ -388,14 +390,34 @@ static int rk3399_dmcfreq_probe(struct platform_device *pdev)
388 &rk3399_devfreq_dmc_profile, 390 &rk3399_devfreq_dmc_profile,
389 DEVFREQ_GOV_SIMPLE_ONDEMAND, 391 DEVFREQ_GOV_SIMPLE_ONDEMAND,
390 &data->ondemand_data); 392 &data->ondemand_data);
391 if (IS_ERR(data->devfreq)) 393 if (IS_ERR(data->devfreq)) {
392 return PTR_ERR(data->devfreq); 394 ret = PTR_ERR(data->devfreq);
395 goto err_free_opp;
396 }
397
393 devm_devfreq_register_opp_notifier(dev, data->devfreq); 398 devm_devfreq_register_opp_notifier(dev, data->devfreq);
394 399
395 data->dev = dev; 400 data->dev = dev;
396 platform_set_drvdata(pdev, data); 401 platform_set_drvdata(pdev, data);
397 402
398 return 0; 403 return 0;
404
405err_free_opp:
406 dev_pm_opp_of_remove_table(&pdev->dev);
407 return ret;
408}
409
410static int rk3399_dmcfreq_remove(struct platform_device *pdev)
411{
412 struct rk3399_dmcfreq *dmcfreq = dev_get_drvdata(&pdev->dev);
413
414 /*
415 * Before remove the opp table we need to unregister the opp notifier.
416 */
417 devm_devfreq_unregister_opp_notifier(dmcfreq->dev, dmcfreq->devfreq);
418 dev_pm_opp_of_remove_table(dmcfreq->dev);
419
420 return 0;
399} 421}
400 422
401static const struct of_device_id rk3399dmc_devfreq_of_match[] = { 423static const struct of_device_id rk3399dmc_devfreq_of_match[] = {
@@ -406,6 +428,7 @@ MODULE_DEVICE_TABLE(of, rk3399dmc_devfreq_of_match);
406 428
407static struct platform_driver rk3399_dmcfreq_driver = { 429static struct platform_driver rk3399_dmcfreq_driver = {
408 .probe = rk3399_dmcfreq_probe, 430 .probe = rk3399_dmcfreq_probe,
431 .remove = rk3399_dmcfreq_remove,
409 .driver = { 432 .driver = {
410 .name = "rk3399-dmc-freq", 433 .name = "rk3399-dmc-freq",
411 .pm = &rk3399_dmcfreq_pm, 434 .pm = &rk3399_dmcfreq_pm,