drm/exynos: consolidate driver/device initialization code
[linux-drm-fsl-dcu.git] / drivers / gpu / drm / exynos / exynos_drm_vidi.c
index 27e84ec21694d587f26a78d258c216d52bd450ea..a12ae38502566265889f709816f6db1faab2ee74 100644 (file)
@@ -20,6 +20,7 @@
 
 #include <drm/drm_edid.h>
 #include <drm/drm_crtc_helper.h>
+#include <drm/drm_atomic_helper.h>
 
 #include "exynos_drm_drv.h"
 #include "exynos_drm_crtc.h"
@@ -152,56 +153,36 @@ static void vidi_win_disable(struct exynos_drm_crtc *crtc, unsigned int win)
        /* TODO. */
 }
 
-static int vidi_power_on(struct vidi_context *ctx, bool enable)
+static void vidi_enable(struct exynos_drm_crtc *crtc)
 {
+       struct vidi_context *ctx = crtc->ctx;
        struct exynos_drm_plane *plane;
        int i;
 
-       DRM_DEBUG_KMS("%s\n", __FILE__);
-
-       if (enable != false && enable != true)
-               return -EINVAL;
+       mutex_lock(&ctx->lock);
 
-       if (enable) {
-               ctx->suspended = false;
+       ctx->suspended = false;
 
-               /* if vblank was enabled status, enable it again. */
-               if (test_and_clear_bit(0, &ctx->irq_flags))
-                       vidi_enable_vblank(ctx->crtc);
+       /* if vblank was enabled status, enable it again. */
+       if (test_and_clear_bit(0, &ctx->irq_flags))
+               vidi_enable_vblank(ctx->crtc);
 
-               for (i = 0; i < WINDOWS_NR; i++) {
-                       plane = &ctx->planes[i];
-                       if (plane->enabled)
-                               vidi_win_commit(ctx->crtc, i);
-               }
-       } else {
-               ctx->suspended = true;
+       for (i = 0; i < WINDOWS_NR; i++) {
+               plane = &ctx->planes[i];
+               if (plane->enabled)
+                       vidi_win_commit(ctx->crtc, i);
        }
 
-       return 0;
+       mutex_unlock(&ctx->lock);
 }
 
-static void vidi_dpms(struct exynos_drm_crtc *crtc, int mode)
+static void vidi_disable(struct exynos_drm_crtc *crtc)
 {
        struct vidi_context *ctx = crtc->ctx;
 
-       DRM_DEBUG_KMS("%d\n", mode);
-
        mutex_lock(&ctx->lock);
 
-       switch (mode) {
-       case DRM_MODE_DPMS_ON:
-               vidi_power_on(ctx, true);
-               break;
-       case DRM_MODE_DPMS_STANDBY:
-       case DRM_MODE_DPMS_SUSPEND:
-       case DRM_MODE_DPMS_OFF:
-               vidi_power_on(ctx, false);
-               break;
-       default:
-               DRM_DEBUG_KMS("unspecified mode %d\n", mode);
-               break;
-       }
+       ctx->suspended = true;
 
        mutex_unlock(&ctx->lock);
 }
@@ -217,8 +198,9 @@ static int vidi_ctx_initialize(struct vidi_context *ctx,
        return 0;
 }
 
-static struct exynos_drm_crtc_ops vidi_crtc_ops = {
-       .dpms = vidi_dpms,
+static const struct exynos_drm_crtc_ops vidi_crtc_ops = {
+       .enable = vidi_enable,
+       .disable = vidi_disable,
        .enable_vblank = vidi_enable_vblank,
        .disable_vblank = vidi_disable_vblank,
        .win_commit = vidi_win_commit,
@@ -384,10 +366,13 @@ static void vidi_connector_destroy(struct drm_connector *connector)
 }
 
 static struct drm_connector_funcs vidi_connector_funcs = {
-       .dpms = drm_helper_connector_dpms,
+       .dpms = drm_atomic_helper_connector_dpms,
        .fill_modes = drm_helper_probe_single_connector_modes,
        .detect = vidi_detect,
        .destroy = vidi_connector_destroy,
+       .reset = drm_atomic_helper_connector_reset,
+       .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
+       .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
 };
 
 static int vidi_get_modes(struct drm_connector *connector)
@@ -584,38 +569,3 @@ struct platform_driver vidi_driver = {
                .owner  = THIS_MODULE,
        },
 };
-
-int exynos_drm_probe_vidi(void)
-{
-       struct platform_device *pdev;
-       int ret;
-
-       pdev = platform_device_register_simple("exynos-drm-vidi", -1, NULL, 0);
-       if (IS_ERR(pdev))
-               return PTR_ERR(pdev);
-
-       ret = platform_driver_register(&vidi_driver);
-       if (ret) {
-               platform_device_unregister(pdev);
-               return ret;
-       }
-
-       return ret;
-}
-
-static int exynos_drm_remove_vidi_device(struct device *dev, void *data)
-{
-       platform_device_unregister(to_platform_device(dev));
-
-       return 0;
-}
-
-void exynos_drm_remove_vidi(void)
-{
-       int ret = driver_for_each_device(&vidi_driver.driver, NULL, NULL,
-                                        exynos_drm_remove_vidi_device);
-       /* silence compiler warning */
-       (void)ret;
-
-       platform_driver_unregister(&vidi_driver);
-}