]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
gpu: ipu-v3: ipu-ic: allow to manually set resize coefficients
authorPhilipp Zabel <p.zabel@pengutronix.de>
Tue, 18 Sep 2018 09:34:08 +0000 (11:34 +0200)
committerPhilipp Zabel <p.zabel@pengutronix.de>
Mon, 5 Nov 2018 13:40:06 +0000 (14:40 +0100)
For tiled scaling, we want to compute the scaling coefficients
externally in such a way that the interpolation overshoots tile
boundaries and samples up to the first pixel of the next tile.
Prepare to override the resizing coefficients from the image
conversion code.

Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
Acked-by: Steve Longerbeam <slongerbeam@gmail.com>
Tested-by: Steve Longerbeam <slongerbeam@gmail.com>
drivers/gpu/ipu-v3/ipu-ic.c
include/video/imx-ipu-v3.h

index 67cc820253a99b84341825437e9e0bfce3cd16d6..594c3cbc8291b217a2ad6d5b87fe16a6782634fe 100644 (file)
@@ -442,36 +442,40 @@ int ipu_ic_task_graphics_init(struct ipu_ic *ic,
 }
 EXPORT_SYMBOL_GPL(ipu_ic_task_graphics_init);
 
-int ipu_ic_task_init(struct ipu_ic *ic,
-                    int in_width, int in_height,
-                    int out_width, int out_height,
-                    enum ipu_color_space in_cs,
-                    enum ipu_color_space out_cs)
+int ipu_ic_task_init_rsc(struct ipu_ic *ic,
+                        int in_width, int in_height,
+                        int out_width, int out_height,
+                        enum ipu_color_space in_cs,
+                        enum ipu_color_space out_cs,
+                        u32 rsc)
 {
        struct ipu_ic_priv *priv = ic->priv;
-       u32 reg, downsize_coeff, resize_coeff;
+       u32 downsize_coeff, resize_coeff;
        unsigned long flags;
        int ret = 0;
 
-       /* Setup vertical resizing */
-       ret = calc_resize_coeffs(ic, in_height, out_height,
-                                &resize_coeff, &downsize_coeff);
-       if (ret)
-               return ret;
+       if (!rsc) {
+               /* Setup vertical resizing */
 
-       reg = (downsize_coeff << 30) | (resize_coeff << 16);
+               ret = calc_resize_coeffs(ic, in_height, out_height,
+                                        &resize_coeff, &downsize_coeff);
+               if (ret)
+                       return ret;
+
+               rsc = (downsize_coeff << 30) | (resize_coeff << 16);
 
-       /* Setup horizontal resizing */
-       ret = calc_resize_coeffs(ic, in_width, out_width,
-                                &resize_coeff, &downsize_coeff);
-       if (ret)
-               return ret;
+               /* Setup horizontal resizing */
+               ret = calc_resize_coeffs(ic, in_width, out_width,
+                                        &resize_coeff, &downsize_coeff);
+               if (ret)
+                       return ret;
 
-       reg |= (downsize_coeff << 14) | resize_coeff;
+               rsc |= (downsize_coeff << 14) | resize_coeff;
+       }
 
        spin_lock_irqsave(&priv->lock, flags);
 
-       ipu_ic_write(ic, reg, ic->reg->rsc);
+       ipu_ic_write(ic, rsc, ic->reg->rsc);
 
        /* Setup color space conversion */
        ic->in_cs = in_cs;
@@ -487,6 +491,16 @@ int ipu_ic_task_init(struct ipu_ic *ic,
        spin_unlock_irqrestore(&priv->lock, flags);
        return ret;
 }
+
+int ipu_ic_task_init(struct ipu_ic *ic,
+                    int in_width, int in_height,
+                    int out_width, int out_height,
+                    enum ipu_color_space in_cs,
+                    enum ipu_color_space out_cs)
+{
+       return ipu_ic_task_init_rsc(ic, in_width, in_height, out_width,
+                                   out_height, in_cs, out_cs, 0);
+}
 EXPORT_SYMBOL_GPL(ipu_ic_task_init);
 
 int ipu_ic_task_idma_init(struct ipu_ic *ic, struct ipuv3_channel *channel,
index 8bb163cd931481fdbeb38e83d77bebb2dc1ef8d6..e582e8e7527afc9c7c37eb9bfaf6d070b807045b 100644 (file)
@@ -390,6 +390,12 @@ int ipu_ic_task_init(struct ipu_ic *ic,
                     int out_width, int out_height,
                     enum ipu_color_space in_cs,
                     enum ipu_color_space out_cs);
+int ipu_ic_task_init_rsc(struct ipu_ic *ic,
+                        int in_width, int in_height,
+                        int out_width, int out_height,
+                        enum ipu_color_space in_cs,
+                        enum ipu_color_space out_cs,
+                        u32 rsc);
 int ipu_ic_task_graphics_init(struct ipu_ic *ic,
                              enum ipu_color_space in_g_cs,
                              bool galpha_en, u32 galpha,