{
        struct drm_psb_private *dev_priv = dev->dev_private;
 
-       if (dev_priv->suspended)
+       if (!dev_priv->display_power)
                return;
        dev_priv->ops->save_regs(dev);
        dev_priv->ops->power_down(dev);
        struct drm_device *dev = pci_get_drvdata(pdev);
        struct drm_psb_private *dev_priv = dev->dev_private;
 
-       if (dev_priv->suspended == false)
+       if (dev_priv->display_power)
                return;
 
        /* turn on the display power island */
        /* Ok power up needed */
        ret = gma_resume_pci(dev->pdev);
        if (ret == 0) {
+               /* FIXME: we want to defer this for Medfield/Oaktrail */
+               gma_resume_display(dev);
                psb_irq_preinstall(dev);
                psb_irq_postinstall(dev);
                pm_runtime_get(&dev->pdev->dev);
 
 
        if (ret)
                return ret;
-#if 0
-       /*enable runtime pm at last*/
-       pm_runtime_enable(&dev->pdev->dev);
+
+       /* Enable runtime pm at last */
        pm_runtime_set_active(&dev->pdev->dev);
-#endif
-       /*Intel drm driver load is done, continue doing pvr load*/
        return 0;
 out_err:
        psb_driver_unload(dev);
                           struct drm_file *file_priv)
 {
        struct drm_psb_private *dev_priv = psb_priv(dev);
-       struct drm_psb_sizes_arg *arg =
-               (struct drm_psb_sizes_arg *) data;
+       struct drm_psb_sizes_arg *arg = data;
 
        *arg = dev_priv->sizes;
        return 0;
 }
 
-static int psb_dc_state_ioctl(struct drm_device *dev, void * data,
+static int psb_dc_state_ioctl(struct drm_device *dev, void *data,
                                struct drm_file *file_priv)
 {
        uint32_t flags;
        struct drm_mode_object *obj;
        struct drm_connector *connector;
        struct drm_crtc *crtc;
-       struct drm_psb_dc_state_arg *arg =
-               (struct drm_psb_dc_state_arg *)data;
+       struct drm_psb_dc_state_arg *arg = data;
 
 
        /* Double check MRST case */
 {
        struct drm_file *file_priv = filp->private_data;
        struct drm_device *dev = file_priv->minor->dev;
-       struct drm_psb_private *dev_priv = dev->dev_private;
-       static unsigned int runtime_allowed;
-
-       if (runtime_allowed == 1 && dev_priv->is_lvds_on) {
-               runtime_allowed++;
-               pm_runtime_allow(&dev->pdev->dev);
-               dev_priv->rpm_enabled = 1;
-       }
-       return drm_ioctl(filp, cmd, arg);
+       int ret;
+       
+       pm_runtime_forbid(dev->dev);
+       ret = drm_ioctl(filp, cmd, arg);
+       pm_runtime_allow(dev->dev);
+       return ret;
        /* FIXME: do we need to wrap the other side of this */
 }
 
 }
 
 static const struct dev_pm_ops psb_pm_ops = {
-       .resume = gma_power_resume,
        .suspend = gma_power_suspend,
+       .resume = gma_power_resume,
+       .freeze = gma_power_suspend,
+       .thaw = gma_power_resume,
+       .poweroff = gma_power_suspend,
+       .restore = gma_power_resume,
        .runtime_suspend = psb_runtime_suspend,
        .runtime_resume = psb_runtime_resume,
        .runtime_idle = psb_runtime_idle,