|
@@ -168,25 +168,19 @@ static struct drm_driver exynos_drm_driver = {
|
|
|
static int exynos_drm_suspend(struct device *dev)
|
|
|
{
|
|
|
struct drm_device *drm_dev = dev_get_drvdata(dev);
|
|
|
- struct drm_connector *connector;
|
|
|
- struct drm_connector_list_iter conn_iter;
|
|
|
+ struct exynos_drm_private *private = drm_dev->dev_private;
|
|
|
|
|
|
if (pm_runtime_suspended(dev) || !drm_dev)
|
|
|
return 0;
|
|
|
|
|
|
- drm_modeset_lock_all(drm_dev);
|
|
|
- drm_connector_list_iter_begin(drm_dev, &conn_iter);
|
|
|
- drm_for_each_connector_iter(connector, &conn_iter) {
|
|
|
- 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_kms_helper_poll_disable(drm_dev);
|
|
|
+ exynos_drm_fbdev_suspend(drm_dev);
|
|
|
+ private->suspend_state = drm_atomic_helper_suspend(drm_dev);
|
|
|
+ if (IS_ERR(private->suspend_state)) {
|
|
|
+ exynos_drm_fbdev_resume(drm_dev);
|
|
|
+ drm_kms_helper_poll_enable(drm_dev);
|
|
|
+ return PTR_ERR(private->suspend_state);
|
|
|
}
|
|
|
- drm_connector_list_iter_end(&conn_iter);
|
|
|
- drm_modeset_unlock_all(drm_dev);
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
@@ -194,24 +188,14 @@ static int exynos_drm_suspend(struct device *dev)
|
|
|
static int exynos_drm_resume(struct device *dev)
|
|
|
{
|
|
|
struct drm_device *drm_dev = dev_get_drvdata(dev);
|
|
|
- struct drm_connector *connector;
|
|
|
- struct drm_connector_list_iter conn_iter;
|
|
|
+ struct exynos_drm_private *private = drm_dev->dev_private;
|
|
|
|
|
|
if (pm_runtime_suspended(dev) || !drm_dev)
|
|
|
return 0;
|
|
|
|
|
|
- drm_modeset_lock_all(drm_dev);
|
|
|
- drm_connector_list_iter_begin(drm_dev, &conn_iter);
|
|
|
- drm_for_each_connector_iter(connector, &conn_iter) {
|
|
|
- if (connector->funcs->dpms) {
|
|
|
- int dpms = connector->dpms;
|
|
|
-
|
|
|
- connector->dpms = DRM_MODE_DPMS_OFF;
|
|
|
- connector->funcs->dpms(connector, dpms);
|
|
|
- }
|
|
|
- }
|
|
|
- drm_connector_list_iter_end(&conn_iter);
|
|
|
- drm_modeset_unlock_all(drm_dev);
|
|
|
+ drm_atomic_helper_resume(drm_dev, private->suspend_state);
|
|
|
+ exynos_drm_fbdev_resume(drm_dev);
|
|
|
+ drm_kms_helper_poll_enable(drm_dev);
|
|
|
|
|
|
return 0;
|
|
|
}
|