struct drm_connector    drm_connector;
        uint32_t                encoder_id;
        struct exynos_drm_manager *manager;
-       uint32_t                dpms;
 };
 
 static int exynos_drm_connector_get_modes(struct drm_connector *connector)
        return ret;
 }
 
-struct drm_encoder *exynos_drm_best_encoder(struct drm_connector *connector)
+static struct drm_encoder *exynos_drm_best_encoder(
+               struct drm_connector *connector)
 {
        struct drm_device *dev = connector->dev;
        struct exynos_drm_connector *exynos_connector =
        .best_encoder   = exynos_drm_best_encoder,
 };
 
-void exynos_drm_display_power(struct drm_connector *connector, int mode)
-{
-       struct drm_encoder *encoder = exynos_drm_best_encoder(connector);
-       struct exynos_drm_connector *exynos_connector;
-       struct exynos_drm_manager *manager = exynos_drm_get_manager(encoder);
-       struct exynos_drm_display_ops *display_ops = manager->display_ops;
-
-       exynos_connector = to_exynos_connector(connector);
-
-       if (exynos_connector->dpms == mode) {
-               DRM_DEBUG_KMS("desired dpms mode is same as previous one.\n");
-               return;
-       }
-
-       if (display_ops && display_ops->power_on)
-               display_ops->power_on(manager->dev, mode);
-
-       exynos_connector->dpms = mode;
-}
-
-static void exynos_drm_connector_dpms(struct drm_connector *connector,
-                                       int mode)
-{
-       /*
-        * in case that drm_crtc_helper_set_mode() is called,
-        * encoder/crtc->funcs->dpms() will be just returned
-        * because they already were DRM_MODE_DPMS_ON so only
-        * exynos_drm_display_power() will be called.
-        */
-       drm_helper_connector_dpms(connector, mode);
-
-       exynos_drm_display_power(connector, mode);
-
-}
-
 static int exynos_drm_connector_fill_modes(struct drm_connector *connector,
                                unsigned int max_width, unsigned int max_height)
 {
 }
 
 static struct drm_connector_funcs exynos_connector_funcs = {
-       .dpms           = exynos_drm_connector_dpms,
+       .dpms           = drm_helper_connector_dpms,
        .fill_modes     = exynos_drm_connector_fill_modes,
        .detect         = exynos_drm_connector_detect,
        .destroy        = exynos_drm_connector_destroy,
 
        exynos_connector->encoder_id = encoder->base.id;
        exynos_connector->manager = manager;
-       exynos_connector->dpms = DRM_MODE_DPMS_OFF;
        connector->dpms = DRM_MODE_DPMS_OFF;
        connector->encoder = encoder;
 
 
 struct drm_connector *exynos_drm_connector_create(struct drm_device *dev,
                                                   struct drm_encoder *encoder);
 
-struct drm_encoder *exynos_drm_best_encoder(struct drm_connector *connector);
-
-void exynos_drm_display_power(struct drm_connector *connector, int mode);
-
 #endif
 
  * @manager: specific encoder has its own manager to control a hardware
  *     appropriately and we can access a hardware drawing on this manager.
  * @dpms: store the encoder dpms value.
- * @updated: indicate whether overlay data updating is needed or not.
  */
 struct exynos_drm_encoder {
        struct drm_crtc                 *old_crtc;
        struct drm_encoder              drm_encoder;
        struct exynos_drm_manager       *manager;
        int                             dpms;
-       bool                            updated;
 };
 
-static void exynos_drm_connector_power(struct drm_encoder *encoder, int mode)
-{
-       struct drm_device *dev = encoder->dev;
-       struct drm_connector *connector;
-
-       list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
-               if (exynos_drm_best_encoder(connector) == encoder) {
-                       DRM_DEBUG_KMS("connector[%d] dpms[%d]\n",
-                                       connector->base.id, mode);
-
-                       exynos_drm_display_power(connector, mode);
-               }
-       }
-}
-
 static void exynos_drm_encoder_dpms(struct drm_encoder *encoder, int mode)
 {
-       struct drm_device *dev = encoder->dev;
+       struct exynos_drm_manager *manager = exynos_drm_get_manager(encoder);
        struct exynos_drm_encoder *exynos_encoder = to_exynos_encoder(encoder);
+       struct exynos_drm_display_ops *display_ops = manager->display_ops;
 
        DRM_DEBUG_KMS("encoder dpms: %d\n", mode);
 
                return;
        }
 
-       mutex_lock(&dev->struct_mutex);
-
-       switch (mode) {
-       case DRM_MODE_DPMS_ON:
-               exynos_drm_connector_power(encoder, mode);
-               exynos_encoder->dpms = mode;
-               break;
-       case DRM_MODE_DPMS_STANDBY:
-       case DRM_MODE_DPMS_SUSPEND:
-       case DRM_MODE_DPMS_OFF:
-               exynos_drm_connector_power(encoder, mode);
-               exynos_encoder->dpms = mode;
-               exynos_encoder->updated = false;
-               break;
-       default:
-               DRM_ERROR("unspecified mode %d\n", mode);
-               break;
-       }
+       if (display_ops && display_ops->power_on)
+               display_ops->power_on(manager->ctx, mode);
 
-       mutex_unlock(&dev->struct_mutex);
+       exynos_encoder->dpms = mode;
 }
 
 static bool
        if (manager_ops && manager_ops->commit)
                manager_ops->commit(manager);
 
-       /*
-        * this will avoid one issue that overlay data is updated to
-        * real hardware two times.
-        * And this variable will be used to check if the data was
-        * already updated or not by exynos_drm_encoder_dpms function.
-        */
-       exynos_encoder->updated = true;
-
        /*
         * In case of setcrtc, there is no way to update encoder's dpms
         * so update it here.