dri-devel.lists.freedesktop.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/3] drm/exynos: add runtime pm support for hdmi and mixer.
@ 2012-11-28  6:00 Rahul Sharma
  2012-11-28  6:00 ` [PATCH 1/3] drm/exynos: added runtime pm support for hdmi Rahul Sharma
                   ` (3 more replies)
  0 siblings, 4 replies; 5+ messages in thread
From: Rahul Sharma @ 2012-11-28  6:00 UTC (permalink / raw)
  To: dri-devel; +Cc: kgene.kim, sw0312.kim, joshi

This patch set adds support for runtime power management for hdmi and
mixer devices. Its also adds support for hdmiphy power control.

It has been tested for hot plugin-plugout and dpms scenarios.

Based on exynos-drm-next branch of
http://git.kernel.org/?p=linux/kernel/git/daeinki/drm-exynos.git

Rahul Sharma (3):
  drm/exynos: added runtime pm support for hdmi
  drm/exynos: add runtime pm support for mixer
  drm/exynos: add support for hdmiphy power control for exynos5

 drivers/gpu/drm/exynos/exynos_hdmi.c  |   81 +++++++++++++++++++++++++++++---
 drivers/gpu/drm/exynos/exynos_mixer.c |   65 +++++++++++++++++++++++---
 drivers/gpu/drm/exynos/regs-hdmi.h    |    5 ++
 3 files changed, 136 insertions(+), 15 deletions(-)

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH 1/3] drm/exynos: added runtime pm support for hdmi
  2012-11-28  6:00 [PATCH 0/3] drm/exynos: add runtime pm support for hdmi and mixer Rahul Sharma
@ 2012-11-28  6:00 ` Rahul Sharma
  2012-11-28  6:00 ` [PATCH 2/3] drm/exynos: add runtime pm support for mixer Rahul Sharma
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 5+ messages in thread
From: Rahul Sharma @ 2012-11-28  6:00 UTC (permalink / raw)
  To: dri-devel; +Cc: kgene.kim, sw0312.kim, joshi

This patch adds runtime power management support for exynos drm
hdmi driver. 

Signed-off-by: Rahul Sharma <rahul.sharma@samsung.com>
Signed-off-by: Shirish S <s.shirish@samsung.com>
---
 drivers/gpu/drm/exynos/exynos_hdmi.c |   60 +++++++++++++++++++++++++++++----
 1 files changed, 52 insertions(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/exynos/exynos_hdmi.c b/drivers/gpu/drm/exynos/exynos_hdmi.c
index 59839cc..a85fc58 100644
--- a/drivers/gpu/drm/exynos/exynos_hdmi.c
+++ b/drivers/gpu/drm/exynos/exynos_hdmi.c
@@ -2064,8 +2064,6 @@ static void hdmi_poweron(struct hdmi_context *hdata)
 
 	mutex_unlock(&hdata->hdmi_mutex);
 
-	pm_runtime_get_sync(hdata->dev);
-
 	regulator_bulk_enable(res->regul_count, res->regul_bulk);
 	clk_enable(res->hdmiphy);
 	clk_enable(res->hdmi);
@@ -2094,8 +2092,6 @@ static void hdmi_poweroff(struct hdmi_context *hdata)
 	clk_disable(res->hdmiphy);
 	regulator_bulk_disable(res->regul_count, res->regul_bulk);
 
-	pm_runtime_put_sync(hdata->dev);
-
 	mutex_lock(&hdata->hdmi_mutex);
 
 	hdata->powered = false;
@@ -2108,16 +2104,18 @@ static void hdmi_dpms(void *ctx, int mode)
 {
 	struct hdmi_context *hdata = ctx;
 
-	DRM_DEBUG_KMS("[%d] %s\n", __LINE__, __func__);
+	DRM_DEBUG_KMS("[%d] %s mode %d\n", __LINE__, __func__, mode);
 
 	switch (mode) {
 	case DRM_MODE_DPMS_ON:
-		hdmi_poweron(hdata);
+		if (pm_runtime_suspended(hdata->dev))
+			pm_runtime_get_sync(hdata->dev);
 		break;
 	case DRM_MODE_DPMS_STANDBY:
 	case DRM_MODE_DPMS_SUSPEND:
 	case DRM_MODE_DPMS_OFF:
-		hdmi_poweroff(hdata);
+		if (!pm_runtime_suspended(hdata->dev))
+			pm_runtime_put_sync(hdata->dev);
 		break;
 	default:
 		DRM_DEBUG_KMS("unknown dpms mode: %d\n", mode);
@@ -2540,6 +2538,8 @@ static int hdmi_suspend(struct device *dev)
 	struct exynos_drm_hdmi_context *ctx = get_hdmi_context(dev);
 	struct hdmi_context *hdata = ctx->ctx;
 
+	DRM_DEBUG_KMS("[%d] %s\n", __LINE__, __func__);
+
 	disable_irq(hdata->internal_irq);
 	disable_irq(hdata->external_irq);
 
@@ -2547,6 +2547,11 @@ static int hdmi_suspend(struct device *dev)
 	if (ctx->drm_dev)
 		drm_helper_hpd_irq_event(ctx->drm_dev);
 
+	if (pm_runtime_suspended(dev)) {
+		DRM_DEBUG_KMS("%s : Already suspended\n", __func__);
+		return 0;
+	}
+
 	hdmi_poweroff(hdata);
 
 	return 0;
@@ -2557,13 +2562,52 @@ static int hdmi_resume(struct device *dev)
 	struct exynos_drm_hdmi_context *ctx = get_hdmi_context(dev);
 	struct hdmi_context *hdata = ctx->ctx;
 
+	DRM_DEBUG_KMS("[%d] %s\n", __LINE__, __func__);
+
+	hdata->hpd = gpio_get_value(hdata->hpd_gpio);
+
 	enable_irq(hdata->external_irq);
 	enable_irq(hdata->internal_irq);
+
+	if (!pm_runtime_suspended(dev)) {
+		DRM_DEBUG_KMS("%s : Already resumed\n", __func__);
+		return 0;
+	}
+
+	hdmi_poweron(hdata);
+
+	return 0;
+}
+#endif
+
+#ifdef CONFIG_PM_RUNTIME
+static int hdmi_runtime_suspend(struct device *dev)
+{
+	struct exynos_drm_hdmi_context *ctx = get_hdmi_context(dev);
+	struct hdmi_context *hdata = ctx->ctx;
+	DRM_DEBUG_KMS("[%d] %s\n", __LINE__, __func__);
+
+	hdmi_poweroff(hdata);
+
+	return 0;
+}
+
+static int hdmi_runtime_resume(struct device *dev)
+{
+	struct exynos_drm_hdmi_context *ctx = get_hdmi_context(dev);
+	struct hdmi_context *hdata = ctx->ctx;
+	DRM_DEBUG_KMS("[%d] %s\n", __LINE__, __func__);
+
+	hdmi_poweron(hdata);
+
 	return 0;
 }
 #endif
 
-static SIMPLE_DEV_PM_OPS(hdmi_pm_ops, hdmi_suspend, hdmi_resume);
+static const struct dev_pm_ops hdmi_pm_ops = {
+	SET_SYSTEM_SLEEP_PM_OPS(hdmi_suspend, hdmi_resume)
+	SET_RUNTIME_PM_OPS(hdmi_runtime_suspend, hdmi_runtime_resume, NULL)
+};
 
 struct platform_driver hdmi_driver = {
 	.probe		= hdmi_probe,
-- 
1.7.0.4

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH 2/3] drm/exynos: add runtime pm support for mixer
  2012-11-28  6:00 [PATCH 0/3] drm/exynos: add runtime pm support for hdmi and mixer Rahul Sharma
  2012-11-28  6:00 ` [PATCH 1/3] drm/exynos: added runtime pm support for hdmi Rahul Sharma
@ 2012-11-28  6:00 ` Rahul Sharma
  2012-11-28  6:00 ` [PATCH 3/3] drm/exynos: add support for hdmiphy power control for exynos5 Rahul Sharma
  2012-12-14  4:40 ` [PATCH 0/3] drm/exynos: add runtime pm support for hdmi and mixer Rahul Sharma
  3 siblings, 0 replies; 5+ messages in thread
From: Rahul Sharma @ 2012-11-28  6:00 UTC (permalink / raw)
  To: dri-devel; +Cc: kgene.kim, sw0312.kim, joshi

This patch adds support for runtime power management for
drm mixer driver.

Signed-off-by: Rahul Sharma <rahul.sharma@samsung.com>
Signed-off-by: Shirish S <s.shirish@samsung.com>
---
 drivers/gpu/drm/exynos/exynos_mixer.c |   65 +++++++++++++++++++++++++++++----
 1 files changed, 58 insertions(+), 7 deletions(-)

diff --git a/drivers/gpu/drm/exynos/exynos_mixer.c b/drivers/gpu/drm/exynos/exynos_mixer.c
index 0d3ed28..b15b770 100644
--- a/drivers/gpu/drm/exynos/exynos_mixer.c
+++ b/drivers/gpu/drm/exynos/exynos_mixer.c
@@ -679,8 +679,6 @@ static void mixer_poweron(struct mixer_context *ctx)
 	ctx->powered = true;
 	mutex_unlock(&ctx->mixer_mutex);
 
-	pm_runtime_get_sync(ctx->dev);
-
 	clk_enable(res->mixer);
 	if (ctx->vp_enabled) {
 		clk_enable(res->vp);
@@ -710,8 +708,6 @@ static void mixer_poweroff(struct mixer_context *ctx)
 		clk_disable(res->sclk_mixer);
 	}
 
-	pm_runtime_put_sync(ctx->dev);
-
 	mutex_lock(&ctx->mixer_mutex);
 	ctx->powered = false;
 
@@ -754,12 +750,14 @@ static void mixer_dpms(void *ctx, int mode)
 
 	switch (mode) {
 	case DRM_MODE_DPMS_ON:
-		mixer_poweron(mixer_ctx);
+		if (pm_runtime_suspended(mixer_ctx->dev))
+			pm_runtime_get_sync(mixer_ctx->dev);
 		break;
 	case DRM_MODE_DPMS_STANDBY:
 	case DRM_MODE_DPMS_SUSPEND:
 	case DRM_MODE_DPMS_OFF:
-		mixer_poweroff(mixer_ctx);
+		if (!pm_runtime_suspended(mixer_ctx->dev))
+			pm_runtime_put_sync(mixer_ctx->dev);
 		break;
 	default:
 		DRM_DEBUG_KMS("unknown dpms mode: %d\n", mode);
@@ -1193,13 +1191,66 @@ static int mixer_suspend(struct device *dev)
 	struct exynos_drm_hdmi_context *drm_hdmi_ctx = get_mixer_context(dev);
 	struct mixer_context *ctx = drm_hdmi_ctx->ctx;
 
+	DRM_DEBUG_KMS("[%d] %s\n", __LINE__, __func__);
+
+	if (pm_runtime_suspended(dev)) {
+		DRM_DEBUG_KMS("%s : Already suspended\n", __func__);
+		return 0;
+	}
+
 	mixer_poweroff(ctx);
 
 	return 0;
 }
+
+static int mixer_resume(struct device *dev)
+{
+	struct exynos_drm_hdmi_context *drm_hdmi_ctx = get_mixer_context(dev);
+	struct mixer_context *ctx = drm_hdmi_ctx->ctx;
+
+	DRM_DEBUG_KMS("[%d] %s\n", __LINE__, __func__);
+
+	if (!pm_runtime_suspended(dev)) {
+		DRM_DEBUG_KMS("%s : Already resumed\n", __func__);
+		return 0;
+	}
+
+	mixer_poweron(ctx);
+
+	return 0;
+}
 #endif
 
-static SIMPLE_DEV_PM_OPS(mixer_pm_ops, mixer_suspend, NULL);
+#ifdef CONFIG_PM_RUNTIME
+static int mixer_runtime_suspend(struct device *dev)
+{
+	struct exynos_drm_hdmi_context *drm_hdmi_ctx = get_mixer_context(dev);
+	struct mixer_context *ctx = drm_hdmi_ctx->ctx;
+
+	DRM_DEBUG_KMS("[%d] %s\n", __LINE__, __func__);
+
+	mixer_poweroff(ctx);
+
+	return 0;
+}
+
+static int mixer_runtime_resume(struct device *dev)
+{
+	struct exynos_drm_hdmi_context *drm_hdmi_ctx = get_mixer_context(dev);
+	struct mixer_context *ctx = drm_hdmi_ctx->ctx;
+
+	DRM_DEBUG_KMS("[%d] %s\n", __LINE__, __func__);
+
+	mixer_poweron(ctx);
+
+	return 0;
+}
+#endif
+
+static const struct dev_pm_ops mixer_pm_ops = {
+	SET_SYSTEM_SLEEP_PM_OPS(mixer_suspend, mixer_resume)
+	SET_RUNTIME_PM_OPS(mixer_runtime_suspend, mixer_runtime_resume, NULL)
+};
 
 struct platform_driver mixer_driver = {
 	.driver = {
-- 
1.7.0.4

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH 3/3] drm/exynos: add support for hdmiphy power control for exynos5
  2012-11-28  6:00 [PATCH 0/3] drm/exynos: add runtime pm support for hdmi and mixer Rahul Sharma
  2012-11-28  6:00 ` [PATCH 1/3] drm/exynos: added runtime pm support for hdmi Rahul Sharma
  2012-11-28  6:00 ` [PATCH 2/3] drm/exynos: add runtime pm support for mixer Rahul Sharma
@ 2012-11-28  6:00 ` Rahul Sharma
  2012-12-14  4:40 ` [PATCH 0/3] drm/exynos: add runtime pm support for hdmi and mixer Rahul Sharma
  3 siblings, 0 replies; 5+ messages in thread
From: Rahul Sharma @ 2012-11-28  6:00 UTC (permalink / raw)
  To: dri-devel; +Cc: kgene.kim, sw0312.kim, joshi

This patch adds support for controlling power of hdmi phy for
exynos5 soc. A special bit is provided in exynos5 for directly
switching of PHY while in exynos4, phy power needs to be controlled
through i2c settings. I2C configuration may affect the suspend to
resume and wake-up time requirements hence not added.

Signed-off-by: Rahul Sharma <rahul.sharma@samsung.com>
---
 drivers/gpu/drm/exynos/exynos_hdmi.c |   21 +++++++++++++++++++++
 drivers/gpu/drm/exynos/regs-hdmi.h   |    5 +++++
 2 files changed, 26 insertions(+), 0 deletions(-)

diff --git a/drivers/gpu/drm/exynos/exynos_hdmi.c b/drivers/gpu/drm/exynos/exynos_hdmi.c
index a85fc58..74e38a5 100644
--- a/drivers/gpu/drm/exynos/exynos_hdmi.c
+++ b/drivers/gpu/drm/exynos/exynos_hdmi.c
@@ -1877,6 +1877,24 @@ static void hdmiphy_conf_reset(struct hdmi_context *hdata)
 	mdelay(10);
 }
 
+static void hdmiphy_poweron(struct hdmi_context *hdata)
+{
+	DRM_DEBUG_KMS("[%d] %s\n", __LINE__, __func__);
+
+	if (hdata->type == HDMI_TYPE14)
+		hdmi_reg_writemask(hdata, HDMI_PHY_CON_0, 0,
+			HDMI_PHY_POWER_OFF_EN);
+}
+
+static void hdmiphy_poweroff(struct hdmi_context *hdata)
+{
+	DRM_DEBUG_KMS("[%d] %s\n", __LINE__, __func__);
+
+	if (hdata->type == HDMI_TYPE14)
+		hdmi_reg_writemask(hdata, HDMI_PHY_CON_0, ~0,
+			HDMI_PHY_POWER_OFF_EN);
+}
+
 static void hdmiphy_conf_apply(struct hdmi_context *hdata)
 {
 	const u8 *hdmiphy_data;
@@ -2068,6 +2086,8 @@ static void hdmi_poweron(struct hdmi_context *hdata)
 	clk_enable(res->hdmiphy);
 	clk_enable(res->hdmi);
 	clk_enable(res->sclk_hdmi);
+
+	hdmiphy_poweron(hdata);
 }
 
 static void hdmi_poweroff(struct hdmi_context *hdata)
@@ -2086,6 +2106,7 @@ static void hdmi_poweroff(struct hdmi_context *hdata)
 	 * its reset state seems to meet the condition.
 	 */
 	hdmiphy_conf_reset(hdata);
+	hdmiphy_poweroff(hdata);
 
 	clk_disable(res->sclk_hdmi);
 	clk_disable(res->hdmi);
diff --git a/drivers/gpu/drm/exynos/regs-hdmi.h b/drivers/gpu/drm/exynos/regs-hdmi.h
index 9cc7c5e..59ff7fa 100644
--- a/drivers/gpu/drm/exynos/regs-hdmi.h
+++ b/drivers/gpu/drm/exynos/regs-hdmi.h
@@ -176,6 +176,11 @@
 #define HDMI_PHY_CMU			HDMI_CTRL_BASE(0x007C)
 #define HDMI_CORE_RSTOUT		HDMI_CTRL_BASE(0x0080)
 
+/* PHY Control bit definition */
+
+/* HDMI_PHY_CON_0 */
+#define HDMI_PHY_POWER_OFF_EN		(1 << 0)
+
 /* Video related registers */
 #define HDMI_YMAX			HDMI_CORE_BASE(0x0060)
 #define HDMI_YMIN			HDMI_CORE_BASE(0x0064)
-- 
1.7.0.4

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH 0/3] drm/exynos: add runtime pm support for hdmi and mixer.
  2012-11-28  6:00 [PATCH 0/3] drm/exynos: add runtime pm support for hdmi and mixer Rahul Sharma
                   ` (2 preceding siblings ...)
  2012-11-28  6:00 ` [PATCH 3/3] drm/exynos: add support for hdmiphy power control for exynos5 Rahul Sharma
@ 2012-12-14  4:40 ` Rahul Sharma
  3 siblings, 0 replies; 5+ messages in thread
From: Rahul Sharma @ 2012-12-14  4:40 UTC (permalink / raw)
  To: Rahul Sharma; +Cc: kgene.kim, sw0312.kim, joshi, dri-devel

Hi All,

Kindly review the following patch set for Runtime PM  Changes for
Mixer and Hdmi.

regards,
Rahul Sharma

On Wed, Nov 28, 2012 at 11:30 AM, Rahul Sharma <rahul.sharma@samsung.com> wrote:
> This patch set adds support for runtime power management for hdmi and
> mixer devices. Its also adds support for hdmiphy power control.
>
> It has been tested for hot plugin-plugout and dpms scenarios.
>
> Based on exynos-drm-next branch of
> http://git.kernel.org/?p=linux/kernel/git/daeinki/drm-exynos.git
>
> Rahul Sharma (3):
>   drm/exynos: added runtime pm support for hdmi
>   drm/exynos: add runtime pm support for mixer
>   drm/exynos: add support for hdmiphy power control for exynos5
>
>  drivers/gpu/drm/exynos/exynos_hdmi.c  |   81 +++++++++++++++++++++++++++++---
>  drivers/gpu/drm/exynos/exynos_mixer.c |   65 +++++++++++++++++++++++---
>  drivers/gpu/drm/exynos/regs-hdmi.h    |    5 ++
>  3 files changed, 136 insertions(+), 15 deletions(-)
>

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2012-12-14  4:40 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-11-28  6:00 [PATCH 0/3] drm/exynos: add runtime pm support for hdmi and mixer Rahul Sharma
2012-11-28  6:00 ` [PATCH 1/3] drm/exynos: added runtime pm support for hdmi Rahul Sharma
2012-11-28  6:00 ` [PATCH 2/3] drm/exynos: add runtime pm support for mixer Rahul Sharma
2012-11-28  6:00 ` [PATCH 3/3] drm/exynos: add support for hdmiphy power control for exynos5 Rahul Sharma
2012-12-14  4:40 ` [PATCH 0/3] drm/exynos: add runtime pm support for hdmi and mixer Rahul Sharma

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).