static void mdfld_dsi_connector_dpms(struct drm_connector *connector, int mode)
{
+ struct drm_device *dev = connector->dev;
+ struct drm_psb_private *dev_priv = dev->dev_private;
+ int old_dpms;
+
screen_notifier_call_chain((unsigned int)mode, connector);
+#ifdef CONFIG_EARLYSUSPEND
if (early_suspend)
return;
+#endif
+
+ if (dev_priv->rpm_enabled) {
+ old_dpms = connector->dpms;
+
+ if (mode == old_dpms)
+ return;
+
+ if ((mode < old_dpms) && (mode == DRM_MODE_DPMS_ON)) {
+ connector->dpms = mode;
+ gfx_runtime_resume(&dev->pdev->dev);
+ }
+
+ if ((mode > old_dpms) && (old_dpms == DRM_MODE_DPMS_ON)) {
+ connector->dpms = mode;
+ gfx_runtime_suspend(&dev->pdev->dev);
+ }
+
+ connector->dpms = mode;
+ return;
+ }
+
+ if (!(dev_priv->rpm_enabled)) {
+ if (mode == DRM_MODE_DPMS_ON)
+ dev_priv->rpm_enabled = 1;
+ }
drm_helper_connector_dpms(connector, mode);
}
return 0;
}
+void gfx_runtime_suspend(struct device *dev)
+{
+ struct pci_dev *pdev = to_pci_dev(dev);
+ struct drm_device *drm_dev = pci_get_drvdata(pdev);
+ struct drm_psb_private *dev_priv = drm_dev->dev_private;
+ struct drm_encoder *encoder;
+
+#ifdef OSPM_GFX_DPK
+ printk(KERN_ALERT "%s\n", __func__);
+#endif
+
+ mutex_lock(&dev_priv->rpm_mutex);
+ list_for_each_entry(encoder, &drm_dev->mode_config.encoder_list, head) {
+ struct drm_encoder_helper_funcs *ehf = encoder->helper_private;
+ if (drm_helper_encoder_in_use(encoder) && ehf && ehf->save)
+ ehf->save(encoder);
+ }
+ mutex_unlock(&dev_priv->rpm_mutex);
+
+ pm_runtime_put(dev);
+}
+
+void gfx_runtime_resume(struct device *dev)
+{
+ struct pci_dev *pdev = to_pci_dev(dev);
+ struct drm_device *drm_dev = pci_get_drvdata(pdev);
+ struct drm_psb_private *dev_priv = drm_dev->dev_private;
+ struct drm_encoder *encoder;
+
+#ifdef OSPM_GFX_DPK
+ printk(KERN_ALERT "%s\n", __func__);
+#endif
+ pm_runtime_get_sync(dev);
+
+ mutex_lock(&dev_priv->rpm_mutex);
+ list_for_each_entry(encoder, &drm_dev->mode_config.encoder_list, head) {
+ struct drm_encoder_helper_funcs *ehf = encoder->helper_private;
+
+ if (drm_helper_encoder_in_use(encoder) && ehf && ehf->restore) {
+ ehf->restore(encoder);
+ }
+ }
+ mutex_unlock(&dev_priv->rpm_mutex);
+}
+
int psb_runtime_suspend(struct device *dev)
{
struct pci_dev *pdev = to_pci_dev(dev);
struct pci_dev *pdev = to_pci_dev(dev);
struct drm_device *drm_dev = pci_get_drvdata(pdev);
+#ifdef OSPM_GFX_DPK
+ dev_dbg(&drm_dev->pdev->dev, "%s\n", __func__);
+#endif
+
ospm_power_resume(dev);
psb_runtime_hdmi_audio_resume(drm_dev);