Merge tag 'drm-misc-next-2020-02-10' of git://anongit.freedesktop.org/drm/drm-misc...
[platform/kernel/linux-starfive.git] / drivers / gpu / drm / i915 / display / vlv_dsi.c
index 5b96051..4514529 100644 (file)
@@ -23,7 +23,6 @@
  * Author: Jani Nikula <jani.nikula@intel.com>
  */
 
-#include <linux/gpio/consumer.h>
 #include <linux/slab.h>
 
 #include <drm/drm_atomic_helper.h>
@@ -319,7 +318,7 @@ static int intel_dsi_compute_config(struct intel_encoder *encoder,
 static bool glk_dsi_enable_io(struct intel_encoder *encoder)
 {
        struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
-       struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
+       struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
        enum port port;
        u32 tmp;
        bool cold_boot = false;
@@ -367,7 +366,7 @@ static bool glk_dsi_enable_io(struct intel_encoder *encoder)
 static void glk_dsi_device_ready(struct intel_encoder *encoder)
 {
        struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
-       struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
+       struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
        enum port port;
        u32 val;
 
@@ -438,7 +437,7 @@ static void glk_dsi_device_ready(struct intel_encoder *encoder)
 static void bxt_dsi_device_ready(struct intel_encoder *encoder)
 {
        struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
-       struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
+       struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
        enum port port;
        u32 val;
 
@@ -465,7 +464,7 @@ static void bxt_dsi_device_ready(struct intel_encoder *encoder)
 static void vlv_dsi_device_ready(struct intel_encoder *encoder)
 {
        struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
-       struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
+       struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
        enum port port;
        u32 val;
 
@@ -516,7 +515,7 @@ static void intel_dsi_device_ready(struct intel_encoder *encoder)
 static void glk_dsi_enter_low_power_mode(struct intel_encoder *encoder)
 {
        struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
-       struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
+       struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
        enum port port;
        u32 val;
 
@@ -546,7 +545,7 @@ static void glk_dsi_enter_low_power_mode(struct intel_encoder *encoder)
 static void glk_dsi_disable_mipi_io(struct intel_encoder *encoder)
 {
        struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
-       struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
+       struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
        enum port port;
        u32 tmp;
 
@@ -579,7 +578,7 @@ static void glk_dsi_clear_device_ready(struct intel_encoder *encoder)
 static void vlv_dsi_clear_device_ready(struct intel_encoder *encoder)
 {
        struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
-       struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
+       struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
        enum port port;
 
        DRM_DEBUG_KMS("\n");
@@ -625,7 +624,7 @@ static void intel_dsi_port_enable(struct intel_encoder *encoder,
 {
        struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
        struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
-       struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
+       struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
        enum port port;
 
        if (intel_dsi->dual_link == DSI_DUAL_LINK_FRONT_BACK) {
@@ -681,7 +680,7 @@ static void intel_dsi_port_disable(struct intel_encoder *encoder)
 {
        struct drm_device *dev = encoder->base.dev;
        struct drm_i915_private *dev_priv = to_i915(dev);
-       struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
+       struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
        enum port port;
 
        for_each_dsi_port(port, intel_dsi->ports) {
@@ -745,7 +744,7 @@ static void intel_dsi_pre_enable(struct intel_encoder *encoder,
                                 const struct intel_crtc_state *pipe_config,
                                 const struct drm_connector_state *conn_state)
 {
-       struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
+       struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
        struct drm_crtc *crtc = pipe_config->uapi.crtc;
        struct drm_i915_private *dev_priv = to_i915(crtc->dev);
        struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
@@ -793,9 +792,6 @@ static void intel_dsi_pre_enable(struct intel_encoder *encoder,
        if (!IS_GEMINILAKE(dev_priv))
                intel_dsi_prepare(encoder, pipe_config);
 
-       /* Power on, try both CRC pmic gpio and VBT */
-       if (intel_dsi->gpio_panel)
-               gpiod_set_value_cansleep(intel_dsi->gpio_panel, 1);
        intel_dsi_vbt_exec_sequence(intel_dsi, MIPI_SEQ_POWER_ON);
        intel_dsi_msleep(intel_dsi, intel_dsi->panel_on_delay);
 
@@ -850,7 +846,7 @@ static void intel_dsi_disable(struct intel_encoder *encoder,
                              const struct intel_crtc_state *old_crtc_state,
                              const struct drm_connector_state *old_conn_state)
 {
-       struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
+       struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
        enum port port;
 
        DRM_DEBUG_KMS("\n");
@@ -886,7 +882,7 @@ static void intel_dsi_post_disable(struct intel_encoder *encoder,
                                   const struct drm_connector_state *old_conn_state)
 {
        struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
-       struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
+       struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
        enum port port;
        u32 val;
 
@@ -895,7 +891,7 @@ static void intel_dsi_post_disable(struct intel_encoder *encoder,
        if (IS_GEN9_LP(dev_priv)) {
                intel_crtc_vblank_off(old_crtc_state);
 
-               skylake_scaler_disable(old_crtc_state);
+               skl_scaler_disable(old_crtc_state);
        }
 
        if (is_vid_mode(intel_dsi)) {
@@ -945,11 +941,8 @@ static void intel_dsi_post_disable(struct intel_encoder *encoder,
        /* Assert reset */
        intel_dsi_vbt_exec_sequence(intel_dsi, MIPI_SEQ_ASSERT_RESET);
 
-       /* Power off, try both CRC pmic gpio and VBT */
        intel_dsi_msleep(intel_dsi, intel_dsi->panel_off_delay);
        intel_dsi_vbt_exec_sequence(intel_dsi, MIPI_SEQ_POWER_OFF);
-       if (intel_dsi->gpio_panel)
-               gpiod_set_value_cansleep(intel_dsi->gpio_panel, 0);
 
        /*
         * FIXME As we do with eDP, just make a note of the time here
@@ -962,7 +955,7 @@ static bool intel_dsi_get_hw_state(struct intel_encoder *encoder,
                                   enum pipe *pipe)
 {
        struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
-       struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
+       struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
        intel_wakeref_t wakeref;
        enum port port;
        bool active = false;
@@ -1041,7 +1034,7 @@ static void bxt_dsi_get_pipe_config(struct intel_encoder *encoder,
                                        &pipe_config->hw.adjusted_mode;
        struct drm_display_mode *adjusted_mode_sw;
        struct intel_crtc *crtc = to_intel_crtc(pipe_config->uapi.crtc);
-       struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
+       struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
        unsigned int lane_count = intel_dsi->lane_count;
        unsigned int bpp, fmt;
        enum port port;
@@ -1234,7 +1227,7 @@ static void set_dsi_timings(struct drm_encoder *encoder,
 {
        struct drm_device *dev = encoder->dev;
        struct drm_i915_private *dev_priv = to_i915(dev);
-       struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
+       struct intel_dsi *intel_dsi = enc_to_intel_dsi(to_intel_encoder(encoder));
        enum port port;
        unsigned int bpp = mipi_dsi_pixel_format_to_bpp(intel_dsi->pixel_format);
        unsigned int lane_count = intel_dsi->lane_count;
@@ -1322,7 +1315,7 @@ static void intel_dsi_prepare(struct intel_encoder *intel_encoder,
        struct drm_device *dev = encoder->dev;
        struct drm_i915_private *dev_priv = to_i915(dev);
        struct intel_crtc *intel_crtc = to_intel_crtc(pipe_config->uapi.crtc);
-       struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
+       struct intel_dsi *intel_dsi = enc_to_intel_dsi(to_intel_encoder(encoder));
        const struct drm_display_mode *adjusted_mode = &pipe_config->hw.adjusted_mode;
        enum port port;
        unsigned int bpp = mipi_dsi_pixel_format_to_bpp(intel_dsi->pixel_format);
@@ -1512,7 +1505,7 @@ static void intel_dsi_prepare(struct intel_encoder *intel_encoder,
 static void intel_dsi_unprepare(struct intel_encoder *encoder)
 {
        struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
-       struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
+       struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
        enum port port;
        u32 val;
 
@@ -1539,12 +1532,9 @@ static void intel_dsi_unprepare(struct intel_encoder *encoder)
 
 static void intel_dsi_encoder_destroy(struct drm_encoder *encoder)
 {
-       struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
-
-       /* dispose of the gpios */
-       if (intel_dsi->gpio_panel)
-               gpiod_put(intel_dsi->gpio_panel);
+       struct intel_dsi *intel_dsi = enc_to_intel_dsi(to_intel_encoder(encoder));
 
+       intel_dsi_vbt_gpio_cleanup(intel_dsi);
        intel_encoder_destroy(encoder);
 }
 
@@ -1824,6 +1814,7 @@ void vlv_dsi_init(struct drm_i915_private *dev_priv)
        struct drm_connector *connector;
        struct drm_display_mode *current_mode, *fixed_mode;
        enum port port;
+       enum pipe pipe;
 
        DRM_DEBUG_KMS("\n");
 
@@ -1922,20 +1913,8 @@ void vlv_dsi_init(struct drm_i915_private *dev_priv)
 
        vlv_dphy_param_init(intel_dsi);
 
-       /*
-        * In case of BYT with CRC PMIC, we need to use GPIO for
-        * Panel control.
-        */
-       if ((IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) &&
-           (dev_priv->vbt.dsi.config->pwm_blc == PPS_BLC_PMIC)) {
-               intel_dsi->gpio_panel =
-                       gpiod_get(dev->dev, "panel", GPIOD_OUT_HIGH);
-
-               if (IS_ERR(intel_dsi->gpio_panel)) {
-                       DRM_ERROR("Failed to own gpio for panel control\n");
-                       intel_dsi->gpio_panel = NULL;
-               }
-       }
+       intel_dsi_vbt_gpio_init(intel_dsi,
+                               intel_dsi_get_hw_state(intel_encoder, &pipe));
 
        drm_connector_init(dev, connector, &intel_dsi_connector_funcs,
                           DRM_MODE_CONNECTOR_DSI);