]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/gpu/drm/exynos/exynos_dp_core.c
drm/exynos: split display's .dpms() into .enable() and .disable()
[karo-tx-linux.git] / drivers / gpu / drm / exynos / exynos_dp_core.c
index 30feb7d066244bfa078e36a518293a9195c3437c..ef249520e5bb71f22e8a649e5b4590fd69491eb9 100644 (file)
@@ -28,8 +28,8 @@
 #include <drm/drmP.h>
 #include <drm/drm_crtc.h>
 #include <drm/drm_crtc_helper.h>
+#include <drm/drm_atomic_helper.h>
 #include <drm/drm_panel.h>
-#include <drm/bridge/ptn3460.h>
 
 #include "exynos_dp_core.h"
 
@@ -953,10 +953,13 @@ static void exynos_dp_connector_destroy(struct drm_connector *connector)
 }
 
 static struct drm_connector_funcs exynos_dp_connector_funcs = {
-       .dpms = drm_helper_connector_dpms,
+       .dpms = drm_atomic_helper_connector_dpms,
        .fill_modes = drm_helper_probe_single_connector_modes,
        .detect = exynos_dp_detect,
        .destroy = exynos_dp_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 exynos_dp_get_modes(struct drm_connector *connector)
@@ -1063,8 +1066,9 @@ static void exynos_dp_phy_exit(struct exynos_dp_device *dp)
                phy_power_off(dp->phy);
 }
 
-static void exynos_dp_poweron(struct exynos_dp_device *dp)
+static void exynos_dp_enable(struct exynos_drm_display *display)
 {
+       struct exynos_dp_device *dp = display_to_dp(display);
        struct exynos_drm_crtc *crtc = dp_to_crtc(dp);
 
        if (dp->dpms_mode == DRM_MODE_DPMS_ON)
@@ -1085,10 +1089,13 @@ static void exynos_dp_poweron(struct exynos_dp_device *dp)
        exynos_dp_init_dp(dp);
        enable_irq(dp->irq);
        exynos_dp_commit(&dp->display);
+
+       dp->dpms_mode = DRM_MODE_DPMS_ON;
 }
 
-static void exynos_dp_poweroff(struct exynos_dp_device *dp)
+static void exynos_dp_disable(struct exynos_drm_display *display)
 {
+       struct exynos_dp_device *dp = display_to_dp(display);
        struct exynos_drm_crtc *crtc = dp_to_crtc(dp);
 
        if (dp->dpms_mode != DRM_MODE_DPMS_ON)
@@ -1113,30 +1120,14 @@ static void exynos_dp_poweroff(struct exynos_dp_device *dp)
                if (drm_panel_unprepare(dp->panel))
                        DRM_ERROR("failed to turnoff the panel\n");
        }
-}
-
-static void exynos_dp_dpms(struct exynos_drm_display *display, int mode)
-{
-       struct exynos_dp_device *dp = display_to_dp(display);
 
-       switch (mode) {
-       case DRM_MODE_DPMS_ON:
-               exynos_dp_poweron(dp);
-               break;
-       case DRM_MODE_DPMS_STANDBY:
-       case DRM_MODE_DPMS_SUSPEND:
-       case DRM_MODE_DPMS_OFF:
-               exynos_dp_poweroff(dp);
-               break;
-       default:
-               break;
-       }
-       dp->dpms_mode = mode;
+       dp->dpms_mode = DRM_MODE_DPMS_OFF;
 }
 
 static struct exynos_drm_display_ops exynos_dp_display_ops = {
        .create_connector = exynos_dp_create_connector,
-       .dpms = exynos_dp_dpms,
+       .enable = exynos_dp_enable,
+       .disable = exynos_dp_disable,
        .commit = exynos_dp_commit,
 };
 
@@ -1316,7 +1307,7 @@ static void exynos_dp_unbind(struct device *dev, struct device *master,
 {
        struct exynos_dp_device *dp = dev_get_drvdata(dev);
 
-       exynos_dp_dpms(&dp->display, DRM_MODE_DPMS_OFF);
+       exynos_dp_disable(&dp->display);
 }
 
 static const struct component_ops exynos_dp_ops = {
@@ -1329,7 +1320,6 @@ static int exynos_dp_probe(struct platform_device *pdev)
        struct device *dev = &pdev->dev;
        struct device_node *panel_node, *bridge_node, *endpoint;
        struct exynos_dp_device *dp;
-       int ret;
 
        dp = devm_kzalloc(&pdev->dev, sizeof(struct exynos_dp_device),
                                GFP_KERNEL);
@@ -1340,11 +1330,6 @@ static int exynos_dp_probe(struct platform_device *pdev)
        dp->display.ops = &exynos_dp_display_ops;
        platform_set_drvdata(pdev, dp);
 
-       ret = exynos_drm_component_add(&pdev->dev, EXYNOS_DEVICE_TYPE_CONNECTOR,
-                                       dp->display.type);
-       if (ret)
-               return ret;
-
        panel_node = of_parse_phandle(dev->of_node, "panel", 0);
        if (panel_node) {
                dp->panel = of_drm_find_panel(panel_node);
@@ -1365,18 +1350,12 @@ static int exynos_dp_probe(struct platform_device *pdev)
                        return -EPROBE_DEFER;
        }
 
-       ret = component_add(&pdev->dev, &exynos_dp_ops);
-       if (ret)
-               exynos_drm_component_del(&pdev->dev,
-                                               EXYNOS_DEVICE_TYPE_CONNECTOR);
-
-       return ret;
+       return component_add(&pdev->dev, &exynos_dp_ops);
 }
 
 static int exynos_dp_remove(struct platform_device *pdev)
 {
        component_del(&pdev->dev, &exynos_dp_ops);
-       exynos_drm_component_del(&pdev->dev, EXYNOS_DEVICE_TYPE_CONNECTOR);
 
        return 0;
 }
@@ -1386,7 +1365,7 @@ static int exynos_dp_suspend(struct device *dev)
 {
        struct exynos_dp_device *dp = dev_get_drvdata(dev);
 
-       exynos_dp_dpms(&dp->display, DRM_MODE_DPMS_OFF);
+       exynos_dp_disable(&dp->display);
        return 0;
 }
 
@@ -1394,7 +1373,7 @@ static int exynos_dp_resume(struct device *dev)
 {
        struct exynos_dp_device *dp = dev_get_drvdata(dev);
 
-       exynos_dp_dpms(&dp->display, DRM_MODE_DPMS_ON);
+       exynos_dp_enable(&dp->display);
        return 0;
 }
 #endif