From: Sean Paul <seanpaul@chromium.org>
To: dri-devel@lists.freedesktop.org, inki.dae@samsung.com
Cc: marcheu@chromium.org
Subject: [PATCH v3 26/32] drm/exynos: Consolidate suspend/resume in drm_drv
Date: Tue, 29 Oct 2013 12:13:12 -0400 [thread overview]
Message-ID: <1383063198-10526-27-git-send-email-seanpaul@chromium.org> (raw)
In-Reply-To: <1383063198-10526-1-git-send-email-seanpaul@chromium.org>
This patch removes all of the suspend/resume logic from the individual
drivers and consolidates it in drm_drv. This consolidation reduces the
number of functions which enable/disable the hardware to just one -- the
dpms callback. This ensures that we always power up/down in a consistent
manner.
Signed-off-by: Sean Paul <seanpaul@chromium.org>
---
Changes in v2:
- Added to the patchset
Changes in v3:
- Made appropriate changes to vidi as well (removed pm_ops)
drivers/gpu/drm/exynos/exynos_drm_drv.c | 97 +++++++++++++++++++++++++
drivers/gpu/drm/exynos/exynos_drm_fimd.c | 91 ++++-------------------
drivers/gpu/drm/exynos/exynos_drm_vidi.c | 119 +++++++++++++------------------
drivers/gpu/drm/exynos/exynos_hdmi.c | 82 +--------------------
drivers/gpu/drm/exynos/exynos_mixer.c | 75 ++++---------------
5 files changed, 176 insertions(+), 288 deletions(-)
diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.c b/drivers/gpu/drm/exynos/exynos_drm_drv.c
index 03caa3a..91d6863 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_drv.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_drv.c
@@ -11,6 +11,7 @@
* option) any later version.
*/
+#include <linux/pm_runtime.h>
#include <drm/drmP.h>
#include <drm/drm_crtc_helper.h>
@@ -51,6 +52,7 @@ static int exynos_drm_load(struct drm_device *dev, unsigned long flags)
return -ENOMEM;
INIT_LIST_HEAD(&private->pageflip_event_list);
+ dev_set_drvdata(dev->dev, dev);
dev->dev_private = (void *)private;
/*
@@ -155,6 +157,41 @@ static int exynos_drm_unload(struct drm_device *dev)
return 0;
}
+static int exynos_drm_suspend(struct drm_device *dev, pm_message_t state)
+{
+ struct drm_connector *connector;
+
+ drm_modeset_lock_all(dev);
+ list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
+ int old_dpms = connector->dpms;
+
+ if (connector->funcs->dpms)
+ connector->funcs->dpms(connector, DRM_MODE_DPMS_OFF);
+
+ /* Set the old mode back to the connector for resume */
+ connector->dpms = old_dpms;
+ }
+ drm_modeset_unlock_all(dev);
+
+ return 0;
+}
+
+static int exynos_drm_resume(struct drm_device *dev)
+{
+ struct drm_connector *connector;
+
+ drm_modeset_lock_all(dev);
+ list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
+ if (connector->funcs->dpms)
+ connector->funcs->dpms(connector, connector->dpms);
+ }
+
+ drm_helper_resume_force_mode(dev);
+ drm_modeset_unlock_all(dev);
+
+ return 0;
+}
+
static int exynos_drm_open(struct drm_device *dev, struct drm_file *file)
{
struct drm_exynos_file_private *file_priv;
@@ -262,6 +299,8 @@ static struct drm_driver exynos_drm_driver = {
DRIVER_GEM | DRIVER_PRIME,
.load = exynos_drm_load,
.unload = exynos_drm_unload,
+ .suspend = exynos_drm_suspend,
+ .resume = exynos_drm_resume,
.open = exynos_drm_open,
.preclose = exynos_drm_preclose,
.lastclose = exynos_drm_lastclose,
@@ -293,6 +332,9 @@ static int exynos_drm_platform_probe(struct platform_device *pdev)
{
pdev->dev.coherent_dma_mask = DMA_BIT_MASK(32);
+ pm_runtime_enable(&pdev->dev);
+ pm_runtime_get_sync(&pdev->dev);
+
return drm_platform_init(&exynos_drm_driver, pdev);
}
@@ -303,12 +345,67 @@ static int exynos_drm_platform_remove(struct platform_device *pdev)
return 0;
}
+#ifdef CONFIG_PM_SLEEP
+static int exynos_drm_sys_suspend(struct device *dev)
+{
+ struct drm_device *drm_dev = dev_get_drvdata(dev);
+ pm_message_t message;
+
+ if (pm_runtime_suspended(dev))
+ return 0;
+
+ message.event = PM_EVENT_SUSPEND;
+ return exynos_drm_suspend(drm_dev, message);
+}
+
+static int exynos_drm_sys_resume(struct device *dev)
+{
+ struct drm_device *drm_dev = dev_get_drvdata(dev);
+
+ if (pm_runtime_suspended(dev))
+ return 0;
+
+ return exynos_drm_resume(drm_dev);
+}
+#endif
+
+#ifdef CONFIG_PM_RUNTIME
+static int exynos_drm_runtime_suspend(struct device *dev)
+{
+ struct drm_device *drm_dev = dev_get_drvdata(dev);
+ pm_message_t message;
+
+ if (pm_runtime_suspended(dev))
+ return 0;
+
+ message.event = PM_EVENT_SUSPEND;
+ return exynos_drm_suspend(drm_dev, message);
+}
+
+static int exynos_drm_runtime_resume(struct device *dev)
+{
+ struct drm_device *drm_dev = dev_get_drvdata(dev);
+
+ if (!pm_runtime_suspended(dev))
+ return 0;
+
+ return exynos_drm_resume(drm_dev);
+}
+#endif
+
+static const struct dev_pm_ops exynos_drm_pm_ops = {
+ SET_SYSTEM_SLEEP_PM_OPS(exynos_drm_sys_suspend, exynos_drm_sys_resume)
+ SET_RUNTIME_PM_OPS(exynos_drm_runtime_suspend,
+ exynos_drm_runtime_resume, NULL)
+};
+
static struct platform_driver exynos_drm_platform_driver = {
.probe = exynos_drm_platform_probe,
.remove = exynos_drm_platform_remove,
.driver = {
.owner = THIS_MODULE,
.name = "exynos-drm",
+ .pm = &exynos_drm_pm_ops,
},
};
diff --git a/drivers/gpu/drm/exynos/exynos_drm_fimd.c b/drivers/gpu/drm/exynos/exynos_drm_fimd.c
index ba12916..208e013 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_fimd.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_fimd.c
@@ -741,6 +741,8 @@ static int fimd_poweron(struct exynos_drm_manager *mgr)
ctx->suspended = false;
+ pm_runtime_get_sync(ctx->dev);
+
ret = clk_prepare_enable(ctx->bus_clk);
if (ret < 0) {
DRM_ERROR("Failed to prepare_enable the bus clk [%d]\n", ret);
@@ -794,32 +796,24 @@ static int fimd_poweroff(struct exynos_drm_manager *mgr)
clk_disable_unprepare(ctx->lcd_clk);
clk_disable_unprepare(ctx->bus_clk);
+ pm_runtime_put_sync(ctx->dev);
+
ctx->suspended = true;
return 0;
}
static void fimd_dpms(struct exynos_drm_manager *mgr, int mode)
{
- struct fimd_context *ctx = mgr->ctx;
-
DRM_DEBUG_KMS("%s, %d\n", __FILE__, mode);
switch (mode) {
case DRM_MODE_DPMS_ON:
- /*
- * enable fimd hardware only if suspended status.
- *
- * P.S. fimd_dpms function would be called at booting time so
- * clk_enable could be called double time.
- */
- if (ctx->suspended)
- pm_runtime_get_sync(ctx->dev);
+ fimd_poweron(mgr);
break;
case DRM_MODE_DPMS_STANDBY:
case DRM_MODE_DPMS_SUSPEND:
case DRM_MODE_DPMS_OFF:
- if (!ctx->suspended)
- pm_runtime_put_sync(ctx->dev);
+ fimd_poweroff(mgr);
break;
default:
DRM_DEBUG_KMS("unspecified mode %d\n", mode);
@@ -950,8 +944,14 @@ static int fimd_probe(struct platform_device *pdev)
fimd_manager.ctx = ctx;
exynos_drm_manager_register(&fimd_manager);
+ /*
+ * We need to runtime pm to enable/disable sysmmu since it is a child of
+ * this driver. Ideally, this would hang off the drm driver's runtime
+ * operations, but we're not quite there yet.
+ *
+ * Tracked in crbug.com/264312
+ */
pm_runtime_enable(dev);
- pm_runtime_get_sync(dev);
for (win = 0; win < WINDOWS_NR; win++)
fimd_clear_win(ctx, win);
@@ -961,84 +961,23 @@ static int fimd_probe(struct platform_device *pdev)
static int fimd_remove(struct platform_device *pdev)
{
- struct device *dev = &pdev->dev;
struct exynos_drm_manager *mgr = platform_get_drvdata(pdev);
- struct fimd_context *ctx = mgr->ctx;
exynos_drm_manager_unregister(&fimd_manager);
- if (ctx->suspended)
- goto out;
-
- pm_runtime_set_suspended(dev);
- pm_runtime_put_sync(dev);
+ fimd_dpms(mgr, DRM_MODE_DPMS_OFF);
-out:
- pm_runtime_disable(dev);
+ pm_runtime_disable(&pdev->dev);
return 0;
}
-#ifdef CONFIG_PM_SLEEP
-static int fimd_suspend(struct device *dev)
-{
- struct exynos_drm_manager *mgr = get_fimd_manager(dev);
-
- /*
- * do not use pm_runtime_suspend(). if pm_runtime_suspend() is
- * called here, an error would be returned by that interface
- * because the usage_count of pm runtime is more than 1.
- */
- if (!pm_runtime_suspended(dev))
- return fimd_poweroff(mgr);
-
- return 0;
-}
-
-static int fimd_resume(struct device *dev)
-{
- struct exynos_drm_manager *mgr = get_fimd_manager(dev);
-
- /*
- * if entered to sleep when lcd panel was on, the usage_count
- * of pm runtime would still be 1 so in this case, fimd driver
- * should be on directly not drawing on pm runtime interface.
- */
- if (pm_runtime_suspended(dev))
- return 0;
-
- return fimd_poweron(mgr);
-}
-#endif
-
-#ifdef CONFIG_PM_RUNTIME
-static int fimd_runtime_suspend(struct device *dev)
-{
- struct exynos_drm_manager *mgr = get_fimd_manager(dev);
-
- return fimd_poweroff(mgr);
-}
-
-static int fimd_runtime_resume(struct device *dev)
-{
- struct exynos_drm_manager *mgr = get_fimd_manager(dev);
-
- return fimd_poweron(mgr);
-}
-#endif
-
-static const struct dev_pm_ops fimd_pm_ops = {
- SET_SYSTEM_SLEEP_PM_OPS(fimd_suspend, fimd_resume)
- SET_RUNTIME_PM_OPS(fimd_runtime_suspend, fimd_runtime_resume, NULL)
-};
-
struct platform_driver fimd_driver = {
.probe = fimd_probe,
.remove = fimd_remove,
.driver = {
.name = "exynos4-fb",
.owner = THIS_MODULE,
- .pm = &fimd_pm_ops,
.of_match_table = fimd_driver_dt_match,
},
};
diff --git a/drivers/gpu/drm/exynos/exynos_drm_vidi.c b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
index 90dacaf..7d79b6c 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_vidi.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
@@ -142,31 +142,6 @@ static struct exynos_drm_display vidi_display = {
.ops = &vidi_display_ops,
};
-static void vidi_dpms(struct exynos_drm_manager *mgr, int mode)
-{
- struct vidi_context *ctx = mgr->ctx;
-
- DRM_DEBUG_KMS("%d\n", mode);
-
- mutex_lock(&ctx->lock);
-
- switch (mode) {
- case DRM_MODE_DPMS_ON:
- /* TODO. */
- break;
- case DRM_MODE_DPMS_STANDBY:
- case DRM_MODE_DPMS_SUSPEND:
- case DRM_MODE_DPMS_OFF:
- /* TODO. */
- break;
- default:
- DRM_DEBUG_KMS("unspecified mode %d\n", mode);
- break;
- }
-
- mutex_unlock(&ctx->lock);
-}
-
static void vidi_apply(struct exynos_drm_manager *mgr)
{
struct vidi_context *ctx = mgr->ctx;
@@ -321,6 +296,55 @@ static void vidi_win_disable(struct exynos_drm_manager *mgr, int zpos)
/* TODO. */
}
+static int vidi_power_on(struct exynos_drm_manager *mgr, bool enable)
+{
+ struct vidi_context *ctx = mgr->ctx;
+
+ DRM_DEBUG_KMS("%s\n", __FILE__);
+
+ if (enable != false && enable != true)
+ return -EINVAL;
+
+ if (enable) {
+ ctx->suspended = false;
+
+ /* if vblank was enabled status, enable it again. */
+ if (test_and_clear_bit(0, &ctx->irq_flags))
+ vidi_enable_vblank(mgr);
+
+ vidi_apply(mgr);
+ } else {
+ ctx->suspended = true;
+ }
+
+ return 0;
+}
+
+static void vidi_dpms(struct exynos_drm_manager *mgr, int mode)
+{
+ struct vidi_context *ctx = mgr->ctx;
+
+ DRM_DEBUG_KMS("%d\n", mode);
+
+ mutex_lock(&ctx->lock);
+
+ switch (mode) {
+ case DRM_MODE_DPMS_ON:
+ vidi_power_on(mgr, true);
+ break;
+ case DRM_MODE_DPMS_STANDBY:
+ case DRM_MODE_DPMS_SUSPEND:
+ case DRM_MODE_DPMS_OFF:
+ vidi_power_on(mgr, false);
+ break;
+ default:
+ DRM_DEBUG_KMS("unspecified mode %d\n", mode);
+ break;
+ }
+
+ mutex_unlock(&ctx->lock);
+}
+
static int vidi_mgr_initialize(struct exynos_drm_manager *mgr,
struct drm_device *drm_dev, int pipe)
{
@@ -392,30 +416,6 @@ static void vidi_fake_vblank_handler(struct work_struct *work)
exynos_drm_crtc_finish_pageflip(ctx->drm_dev, ctx->pipe);
}
-static int vidi_power_on(struct exynos_drm_manager *mgr, bool enable)
-{
- struct vidi_context *ctx = mgr->ctx;
-
- DRM_DEBUG_KMS("%s\n", __FILE__);
-
- if (enable != false && enable != true)
- return -EINVAL;
-
- if (enable) {
- ctx->suspended = false;
-
- /* if vblank was enabled status, enable it again. */
- if (test_and_clear_bit(0, &ctx->irq_flags))
- vidi_enable_vblank(mgr);
-
- vidi_apply(mgr);
- } else {
- ctx->suspended = true;
- }
-
- return 0;
-}
-
static int vidi_show_connection(struct device *dev,
struct device_attribute *attr, char *buf)
{
@@ -582,32 +582,11 @@ static int vidi_remove(struct platform_device *pdev)
return 0;
}
-#ifdef CONFIG_PM_SLEEP
-static int vidi_suspend(struct device *dev)
-{
- struct exynos_drm_manager *mgr = get_vidi_mgr(dev);
-
- return vidi_power_on(mgr, false);
-}
-
-static int vidi_resume(struct device *dev)
-{
- struct exynos_drm_manager *mgr = get_vidi_mgr(dev);
-
- return vidi_power_on(mgr, true);
-}
-#endif
-
-static const struct dev_pm_ops vidi_pm_ops = {
- SET_SYSTEM_SLEEP_PM_OPS(vidi_suspend, vidi_resume)
-};
-
struct platform_driver vidi_driver = {
.probe = vidi_probe,
.remove = vidi_remove,
.driver = {
.name = "exynos-drm-vidi",
.owner = THIS_MODULE,
- .pm = &vidi_pm_ops,
},
};
diff --git a/drivers/gpu/drm/exynos/exynos_hdmi.c b/drivers/gpu/drm/exynos/exynos_hdmi.c
index 2c127b9..c6561fe 100644
--- a/drivers/gpu/drm/exynos/exynos_hdmi.c
+++ b/drivers/gpu/drm/exynos/exynos_hdmi.c
@@ -28,7 +28,6 @@
#include <linux/interrupt.h>
#include <linux/irq.h>
#include <linux/delay.h>
-#include <linux/pm_runtime.h>
#include <linux/clk.h>
#include <linux/regulator/consumer.h>
#include <linux/io.h>
@@ -1770,7 +1769,6 @@ static void hdmi_poweroff(struct exynos_drm_display *display)
regulator_bulk_disable(res->regul_count, res->regul_bulk);
mutex_lock(&hdata->hdmi_mutex);
-
hdata->powered = false;
out:
@@ -1779,20 +1777,16 @@ out:
static void hdmi_dpms(struct exynos_drm_display *display, int mode)
{
- struct hdmi_context *hdata = display->ctx;
-
DRM_DEBUG_KMS("mode %d\n", mode);
switch (mode) {
case DRM_MODE_DPMS_ON:
- if (pm_runtime_suspended(hdata->dev))
- pm_runtime_get_sync(hdata->dev);
+ hdmi_poweron(display);
break;
case DRM_MODE_DPMS_STANDBY:
case DRM_MODE_DPMS_SUSPEND:
case DRM_MODE_DPMS_OFF:
- if (!pm_runtime_suspended(hdata->dev))
- pm_runtime_put_sync(hdata->dev);
+ hdmi_poweroff(display);
break;
default:
DRM_DEBUG_KMS("unknown dpms mode: %d\n", mode);
@@ -2030,8 +2024,6 @@ static int hdmi_probe(struct platform_device *pdev)
hdmi_display.ctx = hdata;
exynos_drm_display_register(&hdmi_display);
- pm_runtime_enable(dev);
-
return 0;
err_hdmiphy:
@@ -2047,88 +2039,18 @@ static int hdmi_remove(struct platform_device *pdev)
struct exynos_drm_display *display = get_hdmi_display(dev);
struct hdmi_context *hdata = display->ctx;
- pm_runtime_disable(dev);
-
put_device(&hdata->hdmiphy_port->dev);
put_device(&hdata->ddc_port->dev);
return 0;
}
-#ifdef CONFIG_PM_SLEEP
-static int hdmi_suspend(struct device *dev)
-{
- struct exynos_drm_display *display = get_hdmi_display(dev);
- struct hdmi_context *hdata = display->ctx;
-
- disable_irq(hdata->irq);
-
- hdata->hpd = false;
- if (hdata->drm_dev)
- drm_helper_hpd_irq_event(hdata->drm_dev);
-
- if (pm_runtime_suspended(dev)) {
- DRM_DEBUG_KMS("Already suspended\n");
- return 0;
- }
-
- hdmi_poweroff(display);
-
- return 0;
-}
-
-static int hdmi_resume(struct device *dev)
-{
- struct exynos_drm_display *display = get_hdmi_display(dev);
- struct hdmi_context *hdata = display->ctx;
-
- hdata->hpd = gpio_get_value(hdata->hpd_gpio);
-
- enable_irq(hdata->irq);
-
- if (!pm_runtime_suspended(dev)) {
- DRM_DEBUG_KMS("Already resumed\n");
- return 0;
- }
-
- hdmi_poweron(display);
-
- return 0;
-}
-#endif
-
-#ifdef CONFIG_PM_RUNTIME
-static int hdmi_runtime_suspend(struct device *dev)
-{
- struct exynos_drm_display *display = get_hdmi_display(dev);
-
- hdmi_poweroff(display);
-
- return 0;
-}
-
-static int hdmi_runtime_resume(struct device *dev)
-{
- struct exynos_drm_display *display = get_hdmi_display(dev);
-
- hdmi_poweron(display);
-
- return 0;
-}
-#endif
-
-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,
.remove = hdmi_remove,
.driver = {
.name = "exynos-hdmi",
.owner = THIS_MODULE,
- .pm = &hdmi_pm_ops,
.of_match_table = hdmi_match_types,
},
};
diff --git a/drivers/gpu/drm/exynos/exynos_mixer.c b/drivers/gpu/drm/exynos/exynos_mixer.c
index 39aed3e..985391d 100644
--- a/drivers/gpu/drm/exynos/exynos_mixer.c
+++ b/drivers/gpu/drm/exynos/exynos_mixer.c
@@ -902,6 +902,8 @@ static void mixer_poweron(struct exynos_drm_manager *mgr)
ctx->powered = true;
mutex_unlock(&ctx->mixer_mutex);
+ pm_runtime_get_sync(ctx->dev);
+
clk_prepare_enable(res->mixer);
if (ctx->vp_enabled) {
clk_prepare_enable(res->vp);
@@ -934,6 +936,8 @@ static void mixer_poweroff(struct exynos_drm_manager *mgr)
clk_disable_unprepare(res->sclk_mixer);
}
+ pm_runtime_put_sync(ctx->dev);
+
mutex_lock(&ctx->mixer_mutex);
ctx->powered = false;
@@ -943,18 +947,14 @@ out:
static void mixer_dpms(struct exynos_drm_manager *mgr, int mode)
{
- struct mixer_context *mixer_ctx = mgr->ctx;
-
switch (mode) {
case DRM_MODE_DPMS_ON:
- if (pm_runtime_suspended(mixer_ctx->dev))
- pm_runtime_get_sync(mixer_ctx->dev);
+ mixer_poweron(mgr);
break;
case DRM_MODE_DPMS_STANDBY:
case DRM_MODE_DPMS_SUSPEND:
case DRM_MODE_DPMS_OFF:
- if (!pm_runtime_suspended(mixer_ctx->dev))
- pm_runtime_put_sync(mixer_ctx->dev);
+ mixer_poweroff(mgr);
break;
default:
DRM_DEBUG_KMS("unknown dpms mode: %d\n", mode);
@@ -1239,6 +1239,13 @@ static int mixer_probe(struct platform_device *pdev)
platform_set_drvdata(pdev, &mixer_manager);
exynos_drm_manager_register(&mixer_manager);
+ /*
+ * We need to runtime pm to enable/disable sysmmu since it is a child of
+ * this driver. Ideally, this would hang off the drm driver's runtime
+ * operations, but we're not quite there yet.
+ *
+ * Tracked in crbug.com/264312
+ */
pm_runtime_enable(dev);
return 0;
@@ -1258,66 +1265,10 @@ static int mixer_remove(struct platform_device *pdev)
return 0;
}
-#ifdef CONFIG_PM_SLEEP
-static int mixer_suspend(struct device *dev)
-{
- struct exynos_drm_manager *mgr = get_mixer_manager(dev);
-
- if (pm_runtime_suspended(dev)) {
- DRM_DEBUG_KMS("Already suspended\n");
- return 0;
- }
-
- mixer_poweroff(mgr);
-
- return 0;
-}
-
-static int mixer_resume(struct device *dev)
-{
- struct exynos_drm_manager *mgr = get_mixer_manager(dev);
-
- if (!pm_runtime_suspended(dev)) {
- DRM_DEBUG_KMS("Already resumed\n");
- return 0;
- }
-
- mixer_poweron(mgr);
-
- return 0;
-}
-#endif
-
-#ifdef CONFIG_PM_RUNTIME
-static int mixer_runtime_suspend(struct device *dev)
-{
- struct exynos_drm_manager *mgr = get_mixer_manager(dev);
-
- mixer_poweroff(mgr);
-
- return 0;
-}
-
-static int mixer_runtime_resume(struct device *dev)
-{
- struct exynos_drm_manager *mgr = get_mixer_manager(dev);
-
- mixer_poweron(mgr);
-
- 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 = {
.name = "exynos-mixer",
.owner = THIS_MODULE,
- .pm = &mixer_pm_ops,
.of_match_table = mixer_match_types,
},
.probe = mixer_probe,
--
1.8.4
next prev parent reply other threads:[~2013-10-29 16:14 UTC|newest]
Thread overview: 124+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-10-29 16:12 [PATCH v3 00/32] drm/exynos: Refactor parts of the exynos driver Sean Paul
2013-10-29 16:12 ` [PATCH v3 01/32] drm/exynos: Remove useless slab.h include Sean Paul
2013-10-31 10:24 ` Inki Dae
2013-10-31 23:32 ` Tomasz Figa
2013-10-29 16:12 ` [PATCH v3 02/32] drm/exynos: Merge overlay_ops into manager_ops Sean Paul
2013-10-31 23:39 ` Tomasz Figa
2013-11-01 19:50 ` Sean Paul
2013-11-01 19:55 ` Tomasz Figa
2013-11-04 7:44 ` Inki Dae
2013-10-29 16:12 ` [PATCH v3 03/32] drm/exynos: Add an initialize function to manager and display Sean Paul
2013-10-31 23:42 ` Tomasz Figa
2013-10-29 16:12 ` [PATCH v3 04/32] drm/exynos: Use manager_op initialize in fimd Sean Paul
2013-10-31 23:49 ` Tomasz Figa
2013-11-01 19:51 ` Sean Paul
2013-11-01 19:57 ` Tomasz Figa
2013-10-29 16:12 ` [PATCH v3 05/32] drm/exynos: hdmi: Implement initialize op for hdmi Sean Paul
2013-10-31 23:53 ` Tomasz Figa
2013-11-01 19:54 ` Sean Paul
2013-11-01 19:56 ` Tomasz Figa
2013-11-01 20:08 ` Sean Paul
2013-10-29 16:12 ` [PATCH v3 06/32] drm/exynos: Pass exynos_drm_manager in manager ops instead of dev Sean Paul
2013-11-01 0:19 ` Tomasz Figa
2013-11-01 20:01 ` Sean Paul
2013-11-01 20:11 ` Tomasz Figa
2013-10-29 16:12 ` [PATCH v3 07/32] drm/exynos: Remove apply manager callback Sean Paul
2013-11-08 21:05 ` Tomasz Figa
2013-10-29 16:12 ` [PATCH v3 08/32] drm/exynos: Remove dpms link between encoder/connector Sean Paul
2013-11-08 21:45 ` Tomasz Figa
2013-10-29 16:12 ` [PATCH v3 09/32] drm/exynos: Rename display_op power_on to dpms Sean Paul
2013-11-08 22:09 ` Tomasz Figa
2013-10-29 16:12 ` [PATCH v3 10/32] drm/exynos: Don't keep dpms state in encoder Sean Paul
2013-11-10 20:47 ` Tomasz Figa
2013-10-29 16:12 ` [PATCH v3 11/32] drm/exynos: Use unsigned long for possible_crtcs Sean Paul
2013-11-10 20:47 ` Tomasz Figa
2013-10-29 16:12 ` [PATCH v3 12/32] drm/exynos: Split manager/display/subdrv Sean Paul
2013-10-31 10:30 ` Inki Dae
2013-10-31 16:08 ` Sean Paul
2013-11-01 4:20 ` Inki Dae
2013-11-10 21:09 ` Tomasz Figa
2013-11-12 17:51 ` Sean Paul
2013-11-12 18:35 ` Tomasz Figa
2013-11-26 18:00 ` Olof Johansson
2013-11-27 10:04 ` Thierry Reding
2013-11-28 23:04 ` Tomasz Figa
2013-11-29 7:52 ` Daniel Vetter
2013-11-29 9:10 ` Tomasz Figa
2013-11-29 10:25 ` Daniel Vetter
2013-11-29 14:13 ` Rob Clark
2013-11-29 17:05 ` Tomasz Figa
2013-11-29 18:35 ` Rob Clark
2013-11-30 5:25 ` Inki Dae
2013-12-03 21:38 ` Sean Paul
2013-11-29 10:16 ` Thierry Reding
2013-10-29 16:12 ` [PATCH v3 13/32] drm/exynos: hdmi: remove the i2c drivers and use devtree Sean Paul
2013-11-10 20:46 ` Tomasz Figa
2013-11-11 8:44 ` Thierry Reding
2013-11-28 13:30 ` Tomasz Figa
2013-11-29 10:24 ` Thierry Reding
2013-12-03 0:37 ` Olof Johansson
2013-10-29 16:13 ` [PATCH v3 14/32] drm/exynos: Remove exynos_drm_hdmi shim Sean Paul
2013-11-10 21:24 ` Tomasz Figa
2013-10-29 16:13 ` [PATCH v3 15/32] drm/exynos: Use drm_mode_copy to copy modes Sean Paul
2013-11-10 21:27 ` Tomasz Figa
2013-10-29 16:13 ` [PATCH v3 16/32] drm/exynos: Disable unused crtc planes from crtc Sean Paul
2013-11-10 21:29 ` Tomasz Figa
2013-10-29 16:13 ` [PATCH v3 17/32] drm/exynos: Add mode_set manager operation Sean Paul
2013-11-10 21:31 ` Tomasz Figa
2013-10-29 16:13 ` [PATCH v3 18/32] drm/exynos: Implement mode_fixup " Sean Paul
2013-11-10 21:33 ` Tomasz Figa
2013-10-29 16:13 ` [PATCH v3 19/32] drm/exynos: Use mode_set to configure fimd Sean Paul
2013-11-10 22:03 ` Tomasz Figa
2013-11-15 13:49 ` Daniel Kurtz
2013-11-15 13:53 ` Daniel Kurtz
2013-11-28 22:57 ` Tomasz Figa
2013-12-04 22:37 ` Sean Paul
2013-10-29 16:13 ` [PATCH v3 20/32] drm/exynos: Remove unused/useless fimd_context members Sean Paul
2013-11-11 1:19 ` Tomasz Figa
2013-10-29 16:13 ` [PATCH v3 21/32] drm/exynos: Move dp driver from video/ to drm/ Sean Paul
2013-10-31 10:46 ` Inki Dae
2013-10-31 16:05 ` Sean Paul
2013-10-31 23:06 ` Jingoo Han
2013-10-31 23:11 ` Tomasz Figa
2013-10-31 23:23 ` Jingoo Han
2013-10-31 23:27 ` Tomasz Figa
2013-10-31 23:55 ` Jingoo Han
2013-11-01 0:01 ` Tomasz Figa
[not found] ` <3513711.0qTZKxmOZX@flatron>
2013-12-04 23:07 ` Sean Paul
2013-10-29 16:13 ` [PATCH v3 22/32] drm/exynos: Move display implementation into dp Sean Paul
[not found] ` <1383063198-10526-23-git-send-email-seanpaul-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>
2013-11-11 1:53 ` Tomasz Figa
2013-10-29 16:13 ` [PATCH v3 23/32] ARM: dts: Move display-timings node from fimd to dp Sean Paul
2013-10-29 16:13 ` [PATCH v3 24/32] drm/exynos: Implement dpms display callback in DP Sean Paul
2013-11-11 2:04 ` Tomasz Figa
2013-10-29 16:13 ` [PATCH v3 25/32] drm/exynos: Clean up FIMD power on/off routines Sean Paul
2013-10-31 10:54 ` Inki Dae
[not found] ` <1630995.NnKzZB9Rl5@flatron>
2013-11-11 4:08 ` Inki Dae
2013-11-11 2:09 ` Tomasz Figa
2013-10-29 16:13 ` Sean Paul [this message]
2013-11-29 14:58 ` [PATCH v3 26/32] drm/exynos: Consolidate suspend/resume in drm_drv Tomasz Figa
2013-12-19 16:48 ` Inki Dae
2013-10-29 16:13 ` [PATCH v3 27/32] drm/exynos: Add create_connector callback Sean Paul
2013-11-11 2:19 ` Tomasz Figa
2013-12-03 5:01 ` Inki Dae
2013-10-29 16:13 ` [PATCH v3 28/32] drm/exynos: Implement drm_connector in hdmi directly Sean Paul
2013-11-29 15:58 ` Tomasz Figa
2013-12-02 9:46 ` Thierry Reding
2013-12-02 9:54 ` Tomasz Figa
2013-10-29 16:13 ` [PATCH v3 29/32] drm/exynos: Implement drm_connector directly in dp driver Sean Paul
2013-11-29 16:04 ` Tomasz Figa
2013-12-03 4:45 ` Inki Dae
2013-12-04 6:46 ` Inki Dae
2013-10-29 16:13 ` [PATCH v3 30/32] drm/exynos: Implement drm_connector directly in vidi driver Sean Paul
2013-11-29 16:13 ` Tomasz Figa
2013-12-03 4:47 ` Inki Dae
2013-12-04 6:47 ` Inki Dae
2013-10-29 16:13 ` [PATCH v3 31/32] drm/exynos: Move lvds bridge discovery into DP driver Sean Paul
2013-11-29 16:55 ` Tomasz Figa
2013-11-30 5:18 ` Inki Dae
2013-11-30 12:27 ` Tomasz Figa
2013-10-29 16:13 ` [PATCH v3 32/32] drm/exynos: Remove the exynos_drm_connector shim Sean Paul
2013-11-29 16:14 ` Tomasz Figa
2013-11-07 5:48 ` [PATCH v3 00/32] drm/exynos: Refactor parts of the exynos driver Inki Dae
2013-11-07 18:20 ` Sean Paul
2013-11-08 21:01 ` Tomasz Figa
2013-11-08 21:22 ` Sean Paul
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1383063198-10526-27-git-send-email-seanpaul@chromium.org \
--to=seanpaul@chromium.org \
--cc=dri-devel@lists.freedesktop.org \
--cc=inki.dae@samsung.com \
--cc=marcheu@chromium.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).