From: Dave Gerlach <d-gerl...@ti.com>

Update tilcdc driver to set the state of the pins to:
- "default on resume
- "sleep" on suspend

By optionally putting the pins into sleep state in the suspend callback
we can accomplish two things.
- minimize current leakage from pins and thus save power,
- prevent the IP from driving pins output in an uncontrolled manner,
which may happen if the power domain drops the domain regulator.

Signed-off-by: Dave Gerlach <d-gerlach at ti.com>
Signed-off-by: Darren Etheridge <detheridge at ti.com>
Signed-off-by: Jyri Sarha <jsarha at ti.com>
---
 drivers/gpu/drm/tilcdc/tilcdc_drv.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/drivers/gpu/drm/tilcdc/tilcdc_drv.c 
b/drivers/gpu/drm/tilcdc/tilcdc_drv.c
index c6acce9..e25db59 100644
--- a/drivers/gpu/drm/tilcdc/tilcdc_drv.c
+++ b/drivers/gpu/drm/tilcdc/tilcdc_drv.c
@@ -18,6 +18,7 @@
 /* LCDC DRM driver, based on da8xx-fb */

 #include <linux/component.h>
+#include <linux/pinctrl/consumer.h>
 #include <linux/suspend.h>

 #include "tilcdc_drv.h"
@@ -602,6 +603,9 @@ static int tilcdc_pm_suspend(struct device *dev)
                if (registers[i].save && (priv->rev >= registers[i].rev))
                        priv->saved_register[n++] = tilcdc_read(ddev, 
registers[i].reg);

+       /* Select sleep pin state */
+       pinctrl_pm_select_sleep_state(dev);
+
        return 0;
 }

@@ -611,6 +615,9 @@ static int tilcdc_pm_resume(struct device *dev)
        struct tilcdc_drm_private *priv = ddev->dev_private;
        unsigned i, n = 0;

+       /* Select default pin state */
+       pinctrl_pm_select_default_state(dev);
+
        /* Restore register state: */
        for (i = 0; i < ARRAY_SIZE(registers); i++)
                if (registers[i].save && (priv->rev >= registers[i].rev))
-- 
1.9.1

Reply via email to