These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / drivers / gpu / drm / omapdrm / omap_encoder.c
index 7445fb1..7d9b32a 100644 (file)
  * this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
+#include <linux/list.h>
+
+#include <drm/drm_crtc.h>
+#include <drm/drm_crtc_helper.h>
 #include <drm/drm_edid.h>
 
 #include "omap_drv.h"
 
-#include "drm_crtc.h"
-#include "drm_crtc_helper.h"
-
-#include <linux/list.h>
-
-
 /*
  * encoder funcs
  */
@@ -54,8 +52,6 @@ static void omap_encoder_destroy(struct drm_encoder *encoder)
 {
        struct omap_encoder *omap_encoder = to_omap_encoder(encoder);
 
-       omap_encoder_set_enabled(encoder, false);
-
        drm_encoder_cleanup(encoder);
        kfree(omap_encoder);
 }
@@ -64,29 +60,6 @@ static const struct drm_encoder_funcs omap_encoder_funcs = {
        .destroy = omap_encoder_destroy,
 };
 
-/*
- * The CRTC drm_crtc_helper_set_mode() doesn't really give us the right
- * order.. the easiest way to work around this for now is to make all
- * the encoder-helper's no-op's and have the omap_crtc code take care
- * of the sequencing and call us in the right points.
- *
- * Eventually to handle connecting CRTCs to different encoders properly,
- * either the CRTC helpers need to change or we need to replace
- * drm_crtc_helper_set_mode(), but lets wait until atomic-modeset for
- * that.
- */
-
-static void omap_encoder_dpms(struct drm_encoder *encoder, int mode)
-{
-}
-
-static bool omap_encoder_mode_fixup(struct drm_encoder *encoder,
-                                 const struct drm_display_mode *mode,
-                                 struct drm_display_mode *adjusted_mode)
-{
-       return true;
-}
-
 static void omap_encoder_mode_set(struct drm_encoder *encoder,
                                struct drm_display_mode *mode,
                                struct drm_display_mode *adjusted_mode)
@@ -118,44 +91,18 @@ static void omap_encoder_mode_set(struct drm_encoder *encoder,
        }
 }
 
-static void omap_encoder_prepare(struct drm_encoder *encoder)
-{
-}
-
-static void omap_encoder_commit(struct drm_encoder *encoder)
-{
-}
-
-static const struct drm_encoder_helper_funcs omap_encoder_helper_funcs = {
-       .dpms = omap_encoder_dpms,
-       .mode_fixup = omap_encoder_mode_fixup,
-       .mode_set = omap_encoder_mode_set,
-       .prepare = omap_encoder_prepare,
-       .commit = omap_encoder_commit,
-};
-
-/*
- * Instead of relying on the helpers for modeset, the omap_crtc code
- * calls these functions in the proper sequence.
- */
-
-int omap_encoder_set_enabled(struct drm_encoder *encoder, bool enabled)
+static void omap_encoder_disable(struct drm_encoder *encoder)
 {
        struct omap_encoder *omap_encoder = to_omap_encoder(encoder);
        struct omap_dss_device *dssdev = omap_encoder->dssdev;
        struct omap_dss_driver *dssdrv = dssdev->driver;
 
-       if (enabled) {
-               return dssdrv->enable(dssdev);
-       } else {
-               dssdrv->disable(dssdev);
-               return 0;
-       }
+       dssdrv->disable(dssdev);
 }
 
-int omap_encoder_update(struct drm_encoder *encoder,
-               struct omap_overlay_manager *mgr,
-               struct omap_video_timings *timings)
+static int omap_encoder_update(struct drm_encoder *encoder,
+                              enum omap_channel channel,
+                              struct omap_video_timings *timings)
 {
        struct drm_device *dev = encoder->dev;
        struct omap_encoder *omap_encoder = to_omap_encoder(encoder);
@@ -163,7 +110,7 @@ int omap_encoder_update(struct drm_encoder *encoder,
        struct omap_dss_driver *dssdrv = dssdev->driver;
        int ret;
 
-       dssdev->src->manager = mgr;
+       dssdev->src->manager = omap_dss_get_overlay_manager(channel);
 
        if (dssdrv->check_timings) {
                ret = dssdrv->check_timings(dssdev, timings);
@@ -189,6 +136,32 @@ int omap_encoder_update(struct drm_encoder *encoder,
        return 0;
 }
 
+static void omap_encoder_enable(struct drm_encoder *encoder)
+{
+       struct omap_encoder *omap_encoder = to_omap_encoder(encoder);
+       struct omap_dss_device *dssdev = omap_encoder->dssdev;
+       struct omap_dss_driver *dssdrv = dssdev->driver;
+
+       omap_encoder_update(encoder, omap_crtc_channel(encoder->crtc),
+                           omap_crtc_timings(encoder->crtc));
+
+       dssdrv->enable(dssdev);
+}
+
+static int omap_encoder_atomic_check(struct drm_encoder *encoder,
+                                    struct drm_crtc_state *crtc_state,
+                                    struct drm_connector_state *conn_state)
+{
+       return 0;
+}
+
+static const struct drm_encoder_helper_funcs omap_encoder_helper_funcs = {
+       .mode_set = omap_encoder_mode_set,
+       .disable = omap_encoder_disable,
+       .enable = omap_encoder_enable,
+       .atomic_check = omap_encoder_atomic_check,
+};
+
 /* initialize encoder */
 struct drm_encoder *omap_encoder_init(struct drm_device *dev,
                struct omap_dss_device *dssdev)