Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 345620
b: refs/heads/master
c: 64327cb
h: refs/heads/master
v: v3
  • Loading branch information
Rahul Sharma authored and Inki Dae committed Dec 14, 2012
1 parent f9c32c5 commit 5e28a00
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 9 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 1169af218010ec7420c2f66c10284047774ba96c
refs/heads/master: 64327cb35acea0e3046d7c08d90b84ab83d5e7d1
60 changes: 52 additions & 8 deletions trunk/drivers/gpu/drm/exynos/exynos_hdmi.c
Original file line number Diff line number Diff line change
Expand Up @@ -2171,8 +2171,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);
Expand Down Expand Up @@ -2201,8 +2199,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;
Expand All @@ -2215,16 +2211,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);
Expand Down Expand Up @@ -2612,13 +2610,20 @@ 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);

hdata->hpd = false;
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;
Expand All @@ -2629,13 +2634,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,
Expand Down

0 comments on commit 5e28a00

Please sign in to comment.