From 67fae6e547ca20c4171e1b3d0ad9d252c2e3c0ee Mon Sep 17 00:00:00 2001 From: Alex Waterman Date: Tue, 5 Jul 2016 14:31:36 -0700 Subject: Revert "gpu: nvgpu: take platform power ref at power on" This reverts commit 1e01a49fdc139b8cdf5164b4a6767d22ef4ad1d3. Bug 1784924 Change-Id: I7bd77f34e37395ed5339d018897d8db91eb5ee0e Signed-off-by: Alex Waterman Reviewed-on: http://git-master/r/1175903 GVS: Gerrit_Virtual_Submit --- drivers/gpu/nvgpu/gk20a/gk20a.c | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) (limited to 'drivers/gpu/nvgpu/gk20a/gk20a.c') diff --git a/drivers/gpu/nvgpu/gk20a/gk20a.c b/drivers/gpu/nvgpu/gk20a/gk20a.c index 05599649..44ed4e51 100644 --- a/drivers/gpu/nvgpu/gk20a/gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/gk20a.c @@ -696,7 +696,6 @@ 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(""); @@ -734,10 +733,6 @@ 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); @@ -784,16 +779,6 @@ 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; @@ -1817,13 +1802,27 @@ 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 @@ -1846,10 +1845,14 @@ 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 -- cgit v1.2.2