drm/i915: Add atomic_get_property entrypoint for connectors (v2)
[deliverable/linux.git] / drivers / gpu / drm / i915 / intel_dsi.c
index 4bb9886fa2cfb44864a123ac0f222d5a188ce15b..317e633960605a8a5321018cc5a1267390104646 100644 (file)
@@ -24,6 +24,7 @@
  */
 
 #include <drm/drmP.h>
+#include <drm/drm_atomic_helper.h>
 #include <drm/drm_crtc.h>
 #include <drm/drm_edid.h>
 #include <drm/i915_drm.h>
@@ -42,6 +43,20 @@ static const struct intel_dsi_device intel_dsi_devices[] = {
        },
 };
 
+static void wait_for_dsi_fifo_empty(struct intel_dsi *intel_dsi, enum port port)
+{
+       struct drm_encoder *encoder = &intel_dsi->base.base;
+       struct drm_device *dev = encoder->dev;
+       struct drm_i915_private *dev_priv = dev->dev_private;
+       u32 mask;
+
+       mask = LP_CTRL_FIFO_EMPTY | HS_CTRL_FIFO_EMPTY |
+               LP_DATA_FIFO_EMPTY | HS_DATA_FIFO_EMPTY;
+
+       if (wait_for((I915_READ(MIPI_GEN_FIFO_STAT(port)) & mask) == mask, 100))
+               DRM_ERROR("DPI FIFOs are not empty\n");
+}
+
 static void band_gap_reset(struct drm_i915_private *dev_priv)
 {
        mutex_lock(&dev_priv->dpio_lock);
@@ -56,12 +71,6 @@ static void band_gap_reset(struct drm_i915_private *dev_priv)
        mutex_unlock(&dev_priv->dpio_lock);
 }
 
-static struct intel_dsi *intel_attached_dsi(struct drm_connector *connector)
-{
-       return container_of(intel_attached_encoder(connector),
-                           struct intel_dsi, base);
-}
-
 static inline bool is_vid_mode(struct intel_dsi *intel_dsi)
 {
        return intel_dsi->operation_mode == INTEL_DSI_VIDEO_MODE;
@@ -85,7 +94,6 @@ static bool intel_dsi_compute_config(struct intel_encoder *encoder,
        struct intel_connector *intel_connector = intel_dsi->attached_connector;
        struct drm_display_mode *fixed_mode = intel_connector->panel.fixed_mode;
        struct drm_display_mode *adjusted_mode = &config->base.adjusted_mode;
-       struct drm_display_mode *mode = &config->base.mode;
 
        DRM_DEBUG_KMS("\n");
 
@@ -95,10 +103,6 @@ static bool intel_dsi_compute_config(struct intel_encoder *encoder,
        /* DSI uses short packets for sync events, so clear mode flags for DSI */
        adjusted_mode->flags = 0;
 
-       if (intel_dsi->dev.dev_ops->mode_fixup)
-               return intel_dsi->dev.dev_ops->mode_fixup(&intel_dsi->dev,
-                                                         mode, adjusted_mode);
-
        return true;
 }
 
@@ -197,15 +201,15 @@ static void intel_dsi_enable(struct intel_encoder *encoder)
 {
        struct drm_device *dev = encoder->base.dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
-       struct intel_crtc *intel_crtc = to_intel_crtc(encoder->base.crtc);
        struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
-       enum port port = intel_dsi_pipe_to_port(intel_crtc->pipe);
+       enum port port;
 
        DRM_DEBUG_KMS("\n");
 
-       if (is_cmd_mode(intel_dsi))
-               I915_WRITE(MIPI_MAX_RETURN_PKT_SIZE(port), 8 * 4);
-       else {
+       if (is_cmd_mode(intel_dsi)) {
+               for_each_dsi_port(port, intel_dsi->ports)
+                       I915_WRITE(MIPI_MAX_RETURN_PKT_SIZE(port), 8 * 4);
+       } else {
                msleep(20); /* XXX */
                for_each_dsi_port(port, intel_dsi->ports)
                        dpi_send_cmd(intel_dsi, TURN_ON, DPI_LP_MODE_EN, port);
@@ -214,7 +218,8 @@ static void intel_dsi_enable(struct intel_encoder *encoder)
                if (intel_dsi->dev.dev_ops->enable)
                        intel_dsi->dev.dev_ops->enable(&intel_dsi->dev);
 
-               wait_for_dsi_fifo_empty(intel_dsi);
+               for_each_dsi_port(port, intel_dsi->ports)
+                       wait_for_dsi_fifo_empty(intel_dsi, port);
 
                intel_dsi_port_enable(encoder);
        }
@@ -227,6 +232,7 @@ static void intel_dsi_pre_enable(struct intel_encoder *encoder)
        struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
        struct intel_crtc *intel_crtc = to_intel_crtc(encoder->base.crtc);
        enum pipe pipe = intel_crtc->pipe;
+       enum port port;
        u32 tmp;
 
        DRM_DEBUG_KMS("\n");
@@ -253,10 +259,8 @@ static void intel_dsi_pre_enable(struct intel_encoder *encoder)
        if (intel_dsi->dev.dev_ops->panel_reset)
                intel_dsi->dev.dev_ops->panel_reset(&intel_dsi->dev);
 
-       if (intel_dsi->dev.dev_ops->send_otp_cmds)
-               intel_dsi->dev.dev_ops->send_otp_cmds(&intel_dsi->dev);
-
-       wait_for_dsi_fifo_empty(intel_dsi);
+       for_each_dsi_port(port, intel_dsi->ports)
+               wait_for_dsi_fifo_empty(intel_dsi, port);
 
        /* Enable port in pre-enable phase itself because as per hw team
         * recommendation, port should be enabled befor plane & pipe */
@@ -299,7 +303,8 @@ static void intel_dsi_disable(struct intel_encoder *encoder)
        DRM_DEBUG_KMS("\n");
 
        if (is_vid_mode(intel_dsi)) {
-               wait_for_dsi_fifo_empty(intel_dsi);
+               for_each_dsi_port(port, intel_dsi->ports)
+                       wait_for_dsi_fifo_empty(intel_dsi, port);
 
                intel_dsi_port_disable(encoder);
                msleep(2);
@@ -328,7 +333,8 @@ static void intel_dsi_disable(struct intel_encoder *encoder)
        if (intel_dsi->dev.dev_ops->disable)
                intel_dsi->dev.dev_ops->disable(&intel_dsi->dev);
 
-       wait_for_dsi_fifo_empty(intel_dsi);
+       for_each_dsi_port(port, intel_dsi->ports)
+               wait_for_dsi_fifo_empty(intel_dsi, port);
 }
 
 static void intel_dsi_clear_device_ready(struct intel_encoder *encoder)
@@ -465,7 +471,6 @@ intel_dsi_mode_valid(struct drm_connector *connector,
 {
        struct intel_connector *intel_connector = to_intel_connector(connector);
        struct drm_display_mode *fixed_mode = intel_connector->panel.fixed_mode;
-       struct intel_dsi *intel_dsi = intel_attached_dsi(connector);
 
        DRM_DEBUG_KMS("\n");
 
@@ -481,7 +486,7 @@ intel_dsi_mode_valid(struct drm_connector *connector,
                        return MODE_PANEL;
        }
 
-       return intel_dsi->dev.dev_ops->mode_valid(&intel_dsi->dev, mode);
+       return MODE_OK;
 }
 
 /* return txclkesc cycles in terms of divider and duration in us */
@@ -730,20 +735,7 @@ static void intel_dsi_pre_pll_enable(struct intel_encoder *encoder)
 static enum drm_connector_status
 intel_dsi_detect(struct drm_connector *connector, bool force)
 {
-       struct intel_dsi *intel_dsi = intel_attached_dsi(connector);
-       struct intel_encoder *intel_encoder = &intel_dsi->base;
-       enum intel_display_power_domain power_domain;
-       enum drm_connector_status connector_status;
-       struct drm_i915_private *dev_priv = intel_encoder->base.dev->dev_private;
-
-       DRM_DEBUG_KMS("\n");
-       power_domain = intel_display_port_power_domain(intel_encoder);
-
-       intel_display_power_get(dev_priv, power_domain);
-       connector_status = intel_dsi->dev.dev_ops->detect(&intel_dsi->dev);
-       intel_display_power_put(dev_priv, power_domain);
-
-       return connector_status;
+       return connector_status_connected;
 }
 
 static int intel_dsi_get_modes(struct drm_connector *connector)
@@ -794,6 +786,8 @@ static const struct drm_connector_funcs intel_dsi_connector_funcs = {
        .detect = intel_dsi_detect,
        .destroy = intel_dsi_destroy,
        .fill_modes = drm_helper_probe_single_connector_modes,
+       .atomic_get_property = intel_connector_atomic_get_property,
+       .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
 };
 
 void intel_dsi_init(struct drm_device *dev)
This page took 0.042588 seconds and 5 git commands to generate.