diff mbox series

[v2,5/9] drm/tegra: sor: Implement system suspend/resume

Message ID 20191203161914.1312555-5-thierry.reding@gmail.com (mailing list archive)
State New, archived
Headers show
Series None | expand

Commit Message

Thierry Reding Dec. 3, 2019, 4:19 p.m. UTC
From: Thierry Reding <treding@nvidia.com>

Upon system suspend, make sure the +5V HDMI regulator is disabled. This
avoids potentially leaking current to the HDMI connector. This also
makes sure that upon resume the regulator is enabled again, which in
some cases is necessary to properly restore the state of the supply on
resume.

Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Signed-off-by: Thierry Reding <treding@nvidia.com>
---
 drivers/gpu/drm/tegra/sor.c | 24 +++++++++++++++++++-----
 1 file changed, 19 insertions(+), 5 deletions(-)

Comments

Dmitry Osipenko Dec. 9, 2019, 12:40 a.m. UTC | #1
03.12.2019 19:19, Thierry Reding пишет:
> From: Thierry Reding <treding@nvidia.com>
> 
> Upon system suspend, make sure the +5V HDMI regulator is disabled. This
> avoids potentially leaking current to the HDMI connector. This also
> makes sure that upon resume the regulator is enabled again, which in
> some cases is necessary to properly restore the state of the supply on
> resume.
> 
> Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
> Signed-off-by: Thierry Reding <treding@nvidia.com>
> ---
>  drivers/gpu/drm/tegra/sor.c | 24 +++++++++++++++++++-----
>  1 file changed, 19 insertions(+), 5 deletions(-)
> 
> diff --git a/drivers/gpu/drm/tegra/sor.c b/drivers/gpu/drm/tegra/sor.c
> index 615cb319fa8b..2200f4cd397a 100644
> --- a/drivers/gpu/drm/tegra/sor.c
> +++ b/drivers/gpu/drm/tegra/sor.c
> @@ -3912,8 +3912,7 @@ static int tegra_sor_remove(struct platform_device *pdev)
>  	return 0;
>  }
>  
> -#ifdef CONFIG_PM
> -static int tegra_sor_suspend(struct device *dev)
> +static int tegra_sor_runtime_suspend(struct device *dev)
>  {
>  	struct tegra_sor *sor = dev_get_drvdata(dev);
>  	int err;
> @@ -3935,7 +3934,7 @@ static int tegra_sor_suspend(struct device *dev)
>  	return 0;
>  }
>  
> -static int tegra_sor_resume(struct device *dev)
> +static int tegra_sor_runtime_resume(struct device *dev)
>  {
>  	struct tegra_sor *sor = dev_get_drvdata(dev);
>  	int err;
> @@ -3967,10 +3966,25 @@ static int tegra_sor_resume(struct device *dev)
>  
>  	return 0;
>  }
> -#endif
> +
> +static int tegra_sor_suspend(struct device *dev)
> +{
> +	struct tegra_sor *sor = dev_get_drvdata(dev);
> +
> +	return regulator_disable(sor->hdmi_supply);
> +}
> +
> +static int tegra_sor_resume(struct device *dev)
> +{
> +	struct tegra_sor *sor = dev_get_drvdata(dev);
> +
> +	return regulator_enable(sor->hdmi_supply);
> +}

These functions should be annotated with __maybe_unused attribute.

>  static const struct dev_pm_ops tegra_sor_pm_ops = {
> -	SET_RUNTIME_PM_OPS(tegra_sor_suspend, tegra_sor_resume, NULL)
> +	SET_RUNTIME_PM_OPS(tegra_sor_runtime_suspend, tegra_sor_runtime_resume,
> +			   NULL)
> +	SET_SYSTEM_SLEEP_PM_OPS(tegra_sor_suspend, tegra_sor_resume)
>  };
>  
>  struct platform_driver tegra_sor_driver = {
>
diff mbox series

Patch

diff --git a/drivers/gpu/drm/tegra/sor.c b/drivers/gpu/drm/tegra/sor.c
index 615cb319fa8b..2200f4cd397a 100644
--- a/drivers/gpu/drm/tegra/sor.c
+++ b/drivers/gpu/drm/tegra/sor.c
@@ -3912,8 +3912,7 @@  static int tegra_sor_remove(struct platform_device *pdev)
 	return 0;
 }
 
-#ifdef CONFIG_PM
-static int tegra_sor_suspend(struct device *dev)
+static int tegra_sor_runtime_suspend(struct device *dev)
 {
 	struct tegra_sor *sor = dev_get_drvdata(dev);
 	int err;
@@ -3935,7 +3934,7 @@  static int tegra_sor_suspend(struct device *dev)
 	return 0;
 }
 
-static int tegra_sor_resume(struct device *dev)
+static int tegra_sor_runtime_resume(struct device *dev)
 {
 	struct tegra_sor *sor = dev_get_drvdata(dev);
 	int err;
@@ -3967,10 +3966,25 @@  static int tegra_sor_resume(struct device *dev)
 
 	return 0;
 }
-#endif
+
+static int tegra_sor_suspend(struct device *dev)
+{
+	struct tegra_sor *sor = dev_get_drvdata(dev);
+
+	return regulator_disable(sor->hdmi_supply);
+}
+
+static int tegra_sor_resume(struct device *dev)
+{
+	struct tegra_sor *sor = dev_get_drvdata(dev);
+
+	return regulator_enable(sor->hdmi_supply);
+}
 
 static const struct dev_pm_ops tegra_sor_pm_ops = {
-	SET_RUNTIME_PM_OPS(tegra_sor_suspend, tegra_sor_resume, NULL)
+	SET_RUNTIME_PM_OPS(tegra_sor_runtime_suspend, tegra_sor_runtime_resume,
+			   NULL)
+	SET_SYSTEM_SLEEP_PM_OPS(tegra_sor_suspend, tegra_sor_resume)
 };
 
 struct platform_driver tegra_sor_driver = {