These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / drivers / gpu / drm / sti / sti_vid.c
index 10ced6a..a8254cc 100644 (file)
@@ -6,7 +6,7 @@
 
 #include <drm/drmP.h>
 
-#include "sti_layer.h"
+#include "sti_plane.h"
 #include "sti_vid.h"
 #include "sti_vtg.h"
 
 #define VID_MPR2_BT709          0x07150545
 #define VID_MPR3_BT709          0x00000AE8
 
-static int sti_vid_prepare_layer(struct sti_layer *vid, bool first_prepare)
+void sti_vid_commit(struct sti_vid *vid,
+                   struct drm_plane_state *state)
 {
-       u32 val;
+       struct drm_crtc *crtc = state->crtc;
+       struct drm_display_mode *mode = &crtc->mode;
+       int dst_x = state->crtc_x;
+       int dst_y = state->crtc_y;
+       int dst_w = clamp_val(state->crtc_w, 0, mode->crtc_hdisplay - dst_x);
+       int dst_h = clamp_val(state->crtc_h, 0, mode->crtc_vdisplay - dst_y);
+       u32 val, ydo, xdo, yds, xds;
+
+       /* Input / output size
+        * Align to upper even value */
+       dst_w = ALIGN(dst_w, 2);
+       dst_h = ALIGN(dst_h, 2);
 
        /* Unmask */
        val = readl(vid->regs + VID_CTL);
        val &= ~VID_CTL_IGNORE;
        writel(val, vid->regs + VID_CTL);
 
-       return 0;
-}
-
-static int sti_vid_commit_layer(struct sti_layer *vid)
-{
-       struct drm_display_mode *mode = vid->mode;
-       u32 ydo, xdo, yds, xds;
-
-       ydo = sti_vtg_get_line_number(*mode, vid->dst_y);
-       yds = sti_vtg_get_line_number(*mode, vid->dst_y + vid->dst_h - 1);
-       xdo = sti_vtg_get_pixel_number(*mode, vid->dst_x);
-       xds = sti_vtg_get_pixel_number(*mode, vid->dst_x + vid->dst_w - 1);
+       ydo = sti_vtg_get_line_number(*mode, dst_y);
+       yds = sti_vtg_get_line_number(*mode, dst_y + dst_h - 1);
+       xdo = sti_vtg_get_pixel_number(*mode, dst_x);
+       xds = sti_vtg_get_pixel_number(*mode, dst_x + dst_w - 1);
 
        writel((ydo << 16) | xdo, vid->regs + VID_VPO);
        writel((yds << 16) | xds, vid->regs + VID_VPS);
-
-       return 0;
 }
 
-static int sti_vid_disable_layer(struct sti_layer *vid)
+void sti_vid_disable(struct sti_vid *vid)
 {
        u32 val;
 
@@ -79,21 +81,9 @@ static int sti_vid_disable_layer(struct sti_layer *vid)
        val = readl(vid->regs + VID_CTL);
        val |= VID_CTL_IGNORE;
        writel(val, vid->regs + VID_CTL);
-
-       return 0;
 }
 
-static const uint32_t *sti_vid_get_formats(struct sti_layer *layer)
-{
-       return NULL;
-}
-
-static unsigned int sti_vid_get_nb_formats(struct sti_layer *layer)
-{
-       return 0;
-}
-
-static void sti_vid_init(struct sti_layer *vid)
+static void sti_vid_init(struct sti_vid *vid)
 {
        /* Enable PSI, Mask layer */
        writel(VID_CTL_PSI_ENABLE | VID_CTL_IGNORE, vid->regs + VID_CTL);
@@ -113,18 +103,10 @@ static void sti_vid_init(struct sti_layer *vid)
        writel(VID_CSAT_DFLT, vid->regs + VID_CSAT);
 }
 
-static const struct sti_layer_funcs vid_ops = {
-       .get_formats = sti_vid_get_formats,
-       .get_nb_formats = sti_vid_get_nb_formats,
-       .init = sti_vid_init,
-       .prepare = sti_vid_prepare_layer,
-       .commit = sti_vid_commit_layer,
-       .disable = sti_vid_disable_layer,
-};
-
-struct sti_layer *sti_vid_create(struct device *dev)
+struct sti_vid *sti_vid_create(struct device *dev, int id,
+                              void __iomem *baseaddr)
 {
-       struct sti_layer *vid;
+       struct sti_vid *vid;
 
        vid = devm_kzalloc(dev, sizeof(*vid), GFP_KERNEL);
        if (!vid) {
@@ -132,7 +114,11 @@ struct sti_layer *sti_vid_create(struct device *dev)
                return NULL;
        }
 
-       vid->ops = &vid_ops;
+       vid->dev = dev;
+       vid->regs = baseaddr;
+       vid->id = id;
+
+       sti_vid_init(vid);
 
        return vid;
 }