Skip to content

Commit

Permalink
drm/panfrost: properly handle error in probe
Browse files Browse the repository at this point in the history
Introduce a boolean to know if opp table has been added.

With this, we can call panfrost_devfreq_fini() in case of error
and release what has been initialised.

Reviewed-by: Steven Price <[email protected]>
Reviewed-by: Alyssa Rosenzweig <[email protected]>
Signed-off-by: Clément Péron <[email protected]>
  • Loading branch information
clementperon authored and sigmaris committed Aug 8, 2020
1 parent 1c329cf commit f818d0c
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 6 deletions.
25 changes: 19 additions & 6 deletions drivers/gpu/drm/panfrost/panfrost_devfreq.c
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,7 @@ int panfrost_devfreq_init(struct panfrost_device *pfdev)
return 0;
else if (ret)
return ret;
pfdevfreq->opp_of_table_added = true;

spin_lock_init(&pfdevfreq->lock);

Expand All @@ -109,8 +110,10 @@ int panfrost_devfreq_init(struct panfrost_device *pfdev)
cur_freq = clk_get_rate(pfdev->clock);

opp = devfreq_recommended_opp(dev, &cur_freq, 0);
if (IS_ERR(opp))
return PTR_ERR(opp);
if (IS_ERR(opp)) {
ret = PTR_ERR(opp);
goto err_fini;
}

panfrost_devfreq_profile.initial_freq = cur_freq;
dev_pm_opp_put(opp);
Expand All @@ -119,8 +122,8 @@ int panfrost_devfreq_init(struct panfrost_device *pfdev)
DEVFREQ_GOV_SIMPLE_ONDEMAND, NULL);
if (IS_ERR(devfreq)) {
DRM_DEV_ERROR(dev, "Couldn't initialize GPU devfreq\n");
dev_pm_opp_of_remove_table(dev);
return PTR_ERR(devfreq);
ret = PTR_ERR(devfreq);
goto err_fini;
}
pfdevfreq->devfreq = devfreq;

Expand All @@ -131,15 +134,25 @@ int panfrost_devfreq_init(struct panfrost_device *pfdev)
pfdevfreq->cooling = cooling;

return 0;

err_fini:
panfrost_devfreq_fini(pfdev);
return ret;
}

void panfrost_devfreq_fini(struct panfrost_device *pfdev)
{
struct panfrost_devfreq *pfdevfreq = &pfdev->pfdevfreq;

if (pfdevfreq->cooling)
if (pfdevfreq->cooling) {
devfreq_cooling_unregister(pfdevfreq->cooling);
dev_pm_opp_of_remove_table(&pfdev->pdev->dev);
pfdevfreq->cooling = NULL;
}

if (pfdevfreq->opp_of_table_added) {
dev_pm_opp_of_remove_table(&pfdev->pdev->dev);
pfdevfreq->opp_of_table_added = false;
}
}

void panfrost_devfreq_resume(struct panfrost_device *pfdev)
Expand Down
1 change: 1 addition & 0 deletions drivers/gpu/drm/panfrost/panfrost_devfreq.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ struct panfrost_device;
struct panfrost_devfreq {
struct devfreq *devfreq;
struct thermal_cooling_device *cooling;
bool opp_of_table_added;

ktime_t busy_time;
ktime_t idle_time;
Expand Down

0 comments on commit f818d0c

Please sign in to comment.