diff --git a/drivers/gpu/nvgpu/gk20a/gk20a.c b/drivers/gpu/nvgpu/gk20a/gk20a.c index 44ed4e515..055996493 100644 --- a/drivers/gpu/nvgpu/gk20a/gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/gk20a.c @@ -696,6 +696,7 @@ static int gk20a_init_support(struct platform_device *dev) static int gk20a_pm_prepare_poweroff(struct device *dev) { struct gk20a *g = get_gk20a(dev); + struct gk20a_platform *platform = gk20a_get_platform(dev); int ret = 0; gk20a_dbg_fn(""); @@ -733,6 +734,10 @@ static int gk20a_pm_prepare_poweroff(struct device *dev) g->power_on = false; + /* Decrement platform power refcount */ + if (platform->idle) + platform->idle(dev); + /* Stop CPU from accessing the GPU registers. */ gk20a_lockout_registers(g); @@ -779,6 +784,16 @@ int gk20a_pm_finalize_poweron(struct device *dev) trace_gk20a_finalize_poweron(dev_name(dev)); + /* Increment platform power refcount */ + if (platform->busy) { + err = platform->busy(dev); + if (err < 0) { + dev_err(dev, "%s: failed to poweron platform dependency\n", + __func__); + return err; + } + } + err = gk20a_restore_registers(g); if (err) return err; @@ -1802,27 +1817,13 @@ int gk20a_busy(struct device *dev) { int ret = 0; struct gk20a *g = get_gk20a(dev); -#ifdef CONFIG_PM - struct gk20a_platform *platform = gk20a_get_platform(dev); -#endif down_read(&g->busy_lock); #ifdef CONFIG_PM - if (platform->busy) { - ret = platform->busy(dev); - if (ret < 0) { - dev_err(dev, "%s: failed to poweron platform dependency\n", - __func__); - goto fail; - } - } - ret = pm_runtime_get_sync(dev); if (ret < 0) { pm_runtime_put_noidle(dev); - if (platform->idle) - platform->idle(dev); goto fail; } #else @@ -1845,14 +1846,10 @@ fail: void gk20a_idle(struct device *dev) { #ifdef CONFIG_PM - struct gk20a_platform *platform = gk20a_get_platform(dev); if (atomic_read(&dev->power.usage_count) == 1) gk20a_scale_notify_idle(dev); pm_runtime_mark_last_busy(dev); pm_runtime_put_sync_autosuspend(dev); - - if (platform->idle) - platform->idle(dev); #else gk20a_scale_notify_idle(dev); #endif