media: staging: tegra-vde: Turn ON power domain on shutdown
On some devices bootloader isn't ready to a clamped VDE power, and thus, machine hangs on a warm reboot (CPU reset). The VDE power partition is turned ON by default on a cold boot, hence VDE driver should keep power partition enabled on system's reboot too. This fixes hang on a warm reboot on a Tegra20 Acer A500 device, which is handy if Embedded Controller driver is unavailable, i.e. cold reboot can't be performed. Signed-off-by: Dmitry Osipenko <digetx@gmail.com> Acked-by: Thierry Reding <treding@nvidia.com> Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl> Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
This commit is contained in:
parent
c19c7a13ee
commit
8f0c714ad9
@ -1081,9 +1081,17 @@ static int tegra_vde_remove(struct platform_device *pdev)
|
||||
struct tegra_vde *vde = platform_get_drvdata(pdev);
|
||||
struct device *dev = &pdev->dev;
|
||||
|
||||
pm_runtime_get_sync(dev);
|
||||
pm_runtime_dont_use_autosuspend(dev);
|
||||
pm_runtime_disable(dev);
|
||||
|
||||
/*
|
||||
* Balance RPM state, the VDE power domain is left ON and hardware
|
||||
* is clock-gated. It's safe to reboot machine now.
|
||||
*/
|
||||
pm_runtime_put_noidle(dev);
|
||||
clk_disable_unprepare(vde->clk);
|
||||
|
||||
misc_deregister(&vde->miscdev);
|
||||
|
||||
tegra_vde_dmabuf_cache_unmap_all(vde);
|
||||
@ -1095,6 +1103,16 @@ static int tegra_vde_remove(struct platform_device *pdev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void tegra_vde_shutdown(struct platform_device *pdev)
|
||||
{
|
||||
/*
|
||||
* On some devices bootloader isn't ready to a power-gated VDE on
|
||||
* a warm-reboot, machine will hang in that case.
|
||||
*/
|
||||
if (pm_runtime_status_suspended(&pdev->dev))
|
||||
tegra_vde_runtime_resume(&pdev->dev);
|
||||
}
|
||||
|
||||
static __maybe_unused int tegra_vde_pm_suspend(struct device *dev)
|
||||
{
|
||||
struct tegra_vde *vde = dev_get_drvdata(dev);
|
||||
@ -1140,6 +1158,7 @@ MODULE_DEVICE_TABLE(of, tegra_vde_of_match);
|
||||
static struct platform_driver tegra_vde_driver = {
|
||||
.probe = tegra_vde_probe,
|
||||
.remove = tegra_vde_remove,
|
||||
.shutdown = tegra_vde_shutdown,
|
||||
.driver = {
|
||||
.name = "tegra-vde",
|
||||
.of_match_table = tegra_vde_of_match,
|
||||
|
Loading…
x
Reference in New Issue
Block a user