dri-devel.lists.freedesktop.org archive mirror
 help / color / mirror / Atom feed
From: Inki Dae <inki.dae@samsung.com>
To: 'Sean Paul' <seanpaul@chromium.org>,
	'dri-devel' <dri-devel@lists.freedesktop.org>
Cc: "'Stéphane Marchesin'" <marcheu@chromium.org>
Subject: RE: [PATCH v2 26/26] drm/exynos: Consolidate suspend/resume in drm_drv
Date: Thu, 17 Oct 2013 14:10:30 +0900	[thread overview]
Message-ID: <00b501cecaf7$330a29c0$991e7d40$%dae@samsung.com> (raw)
In-Reply-To: <CAOw6vb+0C0-Y0Sq9T_RZ_T3OpLfFTp7n-8cB1M=UASroeTPU6Q@mail.gmail.com>



> -----Original Message-----
> From: Sean Paul [mailto:seanpaul@chromium.org]
> Sent: Thursday, October 17, 2013 5:40 AM
> To: dri-devel; InKi Dae
> Cc: Dave Airlie; Tomasz Figa; Stéphane Marchesin; Sean Paul
> Subject: Re: [PATCH v2 26/26] drm/exynos: Consolidate suspend/resume in
> drm_drv
> 
> On Wed, Oct 16, 2013 at 3:26 PM, Sean Paul <seanpaul@chromium.org> wrote:
> > 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
> >
> >  drivers/gpu/drm/exynos/exynos_drm_drv.c  | 97
> ++++++++++++++++++++++++++++++++
> >  drivers/gpu/drm/exynos/exynos_drm_fimd.c | 91 +++++--------------------
> -----
> >  drivers/gpu/drm/exynos/exynos_hdmi.c     | 82
+-------------------------
> -
> >  drivers/gpu/drm/exynos/exynos_mixer.c    | 75 +++++-------------------
> >  4 files changed, 127 insertions(+), 218 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
> 
> Argh, this (and the similar comment below) slipped by me, sorry about
that.
> 
> Can you remove, or would you like to to send a new version?
> 


I can do it.

Thanks,
Inki Dae

P.s. we didn't really think about this way. Actually, DRM driver contains
all device drivers; fimd, hdmi, g2d, and so on. So it's good idea that core
driver handles PM, and other sub drivers should take care of their own power
domain and clock according to dpms request from core driver. And with this
way, it seems that we could resolve power ordering issue when sleep ->
wakeup


> Sean
> 
> > +        */
> >         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_hdmi.c
> b/drivers/gpu/drm/exynos/exynos_hdmi.c
> > index afc83c9..130b109 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>
> > @@ -1771,7 +1770,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:
> > @@ -1780,20 +1778,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);
> > @@ -2036,8 +2030,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:
> > @@ -2053,88 +2045,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
> >

      reply	other threads:[~2013-10-17  5:10 UTC|newest]

Thread overview: 93+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-10-16 19:26 [PATCH v2 00/26] drm/exynos: Refactor parts of the exynos driver Sean Paul
2013-10-16 19:26 ` [PATCH v2 01/26] drm/exynos: Remove useless slab.h include Sean Paul
2013-10-16 19:26 ` [PATCH v2 02/26] drm/exynos: Merge overlay_ops into manager_ops Sean Paul
2013-10-16 19:26 ` [PATCH v2 03/26] drm/exynos: Add an initialize function to manager and display Sean Paul
2013-10-16 19:26 ` [PATCH v2 04/26] drm/exynos: Use manager_op initialize in fimd Sean Paul
2013-10-16 19:26 ` [PATCH v2 05/26] drm/exynos: hdmi: Implement initialize op for hdmi Sean Paul
2013-10-16 19:26 ` [PATCH v2 06/26] drm/exynos: Pass exynos_drm_manager in manager ops instead of dev Sean Paul
2013-10-16 19:26 ` [PATCH v2 07/26] drm/exynos: Remove apply manager callback Sean Paul
2013-10-16 19:26 ` [PATCH v2 08/26] drm/exynos: Remove dpms link between encoder/connector Sean Paul
2013-10-16 19:26 ` [PATCH v2 09/26] drm/exynos: Rename display_op power_on to dpms Sean Paul
2013-10-16 19:26 ` [PATCH v2 10/26] drm/exynos: Don't keep dpms state in encoder Sean Paul
2013-10-16 19:26 ` [PATCH v2 11/26] drm/exynos: Use unsigned long for possible_crtcs Sean Paul
2013-10-16 19:26 ` [PATCH v2 12/26] drm/exynos: Split manager/display/subdrv Sean Paul
2013-10-17  8:21   ` Inki Dae
2013-10-17 14:37     ` Sean Paul
2013-10-18  2:31       ` Inki Dae
2013-10-21 14:46         ` Sean Paul
2013-10-21 21:17           ` Sean Paul
2013-10-22  5:30             ` Inki Dae
2013-10-22 13:45               ` Sean Paul
2013-10-23  2:28                 ` Inki Dae
2013-10-23  2:40                   ` Stéphane Marchesin
2013-10-23  3:38                     ` Inki Dae
2013-10-23  4:03                       ` Stéphane Marchesin
2013-10-23  4:15                         ` Inki Dae
2013-10-23  4:28                           ` Stéphane Marchesin
2013-10-23  4:48                             ` Inki Dae
2013-10-23  5:19                               ` Sean Paul
2013-10-23  5:42                                 ` Inki Dae
2013-10-23 12:20                                   ` Sean Paul
2013-10-23 13:18                                     ` Inki Dae
2013-10-23 14:29                                       ` Dave Airlie
2013-10-23 14:45                                         ` Sean Paul
2013-10-23 15:22                                           ` Dave Airlie
2013-10-23 15:27                                             ` Rob Clark
2013-10-23 15:27                                             ` Sean Paul
2013-10-23 15:28                                               ` Sean Paul
2013-10-23 15:53                                               ` Dave Airlie
2013-10-23 16:09                                                 ` Sean Paul
2013-10-28 16:49                                                   ` Olof Johansson
2013-10-28 17:39                                                     ` Sean Paul
2013-10-28 23:13                                                   ` Tomasz Figa
2013-10-29 19:19                                                     ` Olof Johansson
2013-10-29 19:23                                                       ` Tomasz Figa
2013-10-29 19:47                                                         ` Sylwester Nawrocki
2013-10-29 23:08                                                           ` Laurent Pinchart
2013-10-29 20:36                                                     ` Sean Paul
2013-10-29 20:50                                                       ` Tomasz Figa
2013-10-29 21:29                                                         ` Rob Clark
2013-10-29 23:32                                                           ` Laurent Pinchart
2013-11-04 10:21                                                             ` Thierry Reding
2013-11-04 10:10                                                           ` Thierry Reding
2013-11-04 12:14                                                             ` Rob Clark
2013-11-04 12:52                                                               ` Thierry Reding
2013-11-04 16:12                                                                 ` Daniel Vetter
2013-10-30  3:46                                                         ` Stéphane Marchesin
2013-11-04 10:25                                                           ` Thierry Reding
2013-11-04 11:30                                                             ` Inki Dae
2013-11-04 15:44                                                               ` Sean Paul
2013-11-05  7:38                                                                 ` Inki Dae
2013-10-30 15:32                                                         ` Sean Paul
2013-10-30 15:45                                                           ` Laurent Pinchart
2013-10-30 15:56                                                             ` Sean Paul
2013-11-04 10:12                                                               ` Laurent Pinchart
2013-10-30 15:53                                                           ` Daniel Vetter
2013-11-04 10:13                                                             ` Laurent Pinchart
2013-11-04 10:36                                                           ` Thierry Reding
2013-11-04 10:08                                             ` Thierry Reding
2013-10-24  6:47                                           ` Inki Dae
2013-10-23 14:51                                       ` Rob Clark
2013-10-24  7:46                                         ` Inki Dae
2013-10-25  5:15                                           ` Inki Dae
2013-10-28 20:43                                           ` Rob Clark
2013-10-23  3:39                   ` Sean Paul
2013-10-22  4:55           ` Inki Dae
2013-10-22 10:30   ` Inki Dae
2013-10-23  5:18     ` Inki Dae
2013-10-16 19:26 ` [PATCH v2 13/26] drm/exynos: hdmi: remove the i2c drivers and use devtree Sean Paul
2013-10-16 19:26 ` [PATCH v2 14/26] drm/exynos: Remove exynos_drm_hdmi shim Sean Paul
2013-10-16 19:26 ` [PATCH v2 15/26] drm/exynos: Use drm_mode_copy to copy modes Sean Paul
2013-10-16 19:26 ` [PATCH v2 16/26] drm/exynos: Disable unused crtc planes from crtc Sean Paul
2013-10-16 19:26 ` [PATCH v2 17/26] drm/exynos: Add mode_set manager operation Sean Paul
2013-10-16 19:26 ` [PATCH v2 18/26] drm/exynos: Implement mode_fixup " Sean Paul
2013-10-16 19:26 ` [PATCH v2 19/26] drm/exynos: Use mode_set to configure fimd Sean Paul
2013-10-16 19:26 ` [PATCH v2 20/26] drm/exynos: Remove unused/useless fimd_context members Sean Paul
2013-10-16 19:26 ` [PATCH v2 21/26] drm/exynos: Move dp driver from video/ to drm/ Sean Paul
2013-10-16 19:26 ` [PATCH v2 22/26] drm/exynos: Move display implementation into dp Sean Paul
2013-10-16 19:26 ` [PATCH v2 23/26] ARM: dts: Move display-timings node from fimd to dp Sean Paul
2013-10-16 19:26 ` [PATCH v2 24/26] drm/exynos: Implement dpms display callback in DP Sean Paul
2013-10-16 19:26 ` [PATCH v2 25/26] drm/exynos: Clean up FIMD power on/off routines Sean Paul
2013-10-16 19:26 ` [PATCH v2 26/26] drm/exynos: Consolidate suspend/resume in drm_drv Sean Paul
2013-10-16 20:40   ` Sean Paul
2013-10-17  5:10     ` Inki Dae [this message]

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='00b501cecaf7$330a29c0$991e7d40$%dae@samsung.com' \
    --to=inki.dae@samsung.com \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=marcheu@chromium.org \
    --cc=seanpaul@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).