diff options
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/gk20a.c | 33 |
1 files changed, 15 insertions, 18 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/gk20a.c b/drivers/gpu/nvgpu/gk20a/gk20a.c index 44ed4e51..05599649 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) | |||
696 | static int gk20a_pm_prepare_poweroff(struct device *dev) | 696 | static int gk20a_pm_prepare_poweroff(struct device *dev) |
697 | { | 697 | { |
698 | struct gk20a *g = get_gk20a(dev); | 698 | struct gk20a *g = get_gk20a(dev); |
699 | struct gk20a_platform *platform = gk20a_get_platform(dev); | ||
699 | int ret = 0; | 700 | int ret = 0; |
700 | 701 | ||
701 | gk20a_dbg_fn(""); | 702 | gk20a_dbg_fn(""); |
@@ -733,6 +734,10 @@ static int gk20a_pm_prepare_poweroff(struct device *dev) | |||
733 | 734 | ||
734 | g->power_on = false; | 735 | g->power_on = false; |
735 | 736 | ||
737 | /* Decrement platform power refcount */ | ||
738 | if (platform->idle) | ||
739 | platform->idle(dev); | ||
740 | |||
736 | /* Stop CPU from accessing the GPU registers. */ | 741 | /* Stop CPU from accessing the GPU registers. */ |
737 | gk20a_lockout_registers(g); | 742 | gk20a_lockout_registers(g); |
738 | 743 | ||
@@ -779,6 +784,16 @@ int gk20a_pm_finalize_poweron(struct device *dev) | |||
779 | 784 | ||
780 | trace_gk20a_finalize_poweron(dev_name(dev)); | 785 | trace_gk20a_finalize_poweron(dev_name(dev)); |
781 | 786 | ||
787 | /* Increment platform power refcount */ | ||
788 | if (platform->busy) { | ||
789 | err = platform->busy(dev); | ||
790 | if (err < 0) { | ||
791 | dev_err(dev, "%s: failed to poweron platform dependency\n", | ||
792 | __func__); | ||
793 | return err; | ||
794 | } | ||
795 | } | ||
796 | |||
782 | err = gk20a_restore_registers(g); | 797 | err = gk20a_restore_registers(g); |
783 | if (err) | 798 | if (err) |
784 | return err; | 799 | return err; |
@@ -1802,27 +1817,13 @@ int gk20a_busy(struct device *dev) | |||
1802 | { | 1817 | { |
1803 | int ret = 0; | 1818 | int ret = 0; |
1804 | struct gk20a *g = get_gk20a(dev); | 1819 | struct gk20a *g = get_gk20a(dev); |
1805 | #ifdef CONFIG_PM | ||
1806 | struct gk20a_platform *platform = gk20a_get_platform(dev); | ||
1807 | #endif | ||
1808 | 1820 | ||
1809 | down_read(&g->busy_lock); | 1821 | down_read(&g->busy_lock); |
1810 | 1822 | ||
1811 | #ifdef CONFIG_PM | 1823 | #ifdef CONFIG_PM |
1812 | if (platform->busy) { | ||
1813 | ret = platform->busy(dev); | ||
1814 | if (ret < 0) { | ||
1815 | dev_err(dev, "%s: failed to poweron platform dependency\n", | ||
1816 | __func__); | ||
1817 | goto fail; | ||
1818 | } | ||
1819 | } | ||
1820 | |||
1821 | ret = pm_runtime_get_sync(dev); | 1824 | ret = pm_runtime_get_sync(dev); |
1822 | if (ret < 0) { | 1825 | if (ret < 0) { |
1823 | pm_runtime_put_noidle(dev); | 1826 | pm_runtime_put_noidle(dev); |
1824 | if (platform->idle) | ||
1825 | platform->idle(dev); | ||
1826 | goto fail; | 1827 | goto fail; |
1827 | } | 1828 | } |
1828 | #else | 1829 | #else |
@@ -1845,14 +1846,10 @@ fail: | |||
1845 | void gk20a_idle(struct device *dev) | 1846 | void gk20a_idle(struct device *dev) |
1846 | { | 1847 | { |
1847 | #ifdef CONFIG_PM | 1848 | #ifdef CONFIG_PM |
1848 | struct gk20a_platform *platform = gk20a_get_platform(dev); | ||
1849 | if (atomic_read(&dev->power.usage_count) == 1) | 1849 | if (atomic_read(&dev->power.usage_count) == 1) |
1850 | gk20a_scale_notify_idle(dev); | 1850 | gk20a_scale_notify_idle(dev); |
1851 | pm_runtime_mark_last_busy(dev); | 1851 | pm_runtime_mark_last_busy(dev); |
1852 | pm_runtime_put_sync_autosuspend(dev); | 1852 | pm_runtime_put_sync_autosuspend(dev); |
1853 | |||
1854 | if (platform->idle) | ||
1855 | platform->idle(dev); | ||
1856 | #else | 1853 | #else |
1857 | gk20a_scale_notify_idle(dev); | 1854 | gk20a_scale_notify_idle(dev); |
1858 | #endif | 1855 | #endif |