media: imx: lift CSI and PRP ENC/VF width alignment restriction
authorPhilipp Zabel <p.zabel@pengutronix.de>
Thu, 17 Jan 2019 15:51:54 +0000 (13:51 -0200)
committerMauro Carvalho Chehab <mchehab+samsung@kernel.org>
Mon, 21 Jan 2019 18:43:07 +0000 (16:43 -0200)
The CSI, PRP ENC, and PRP VF subdevices shouldn't have to care about
IDMAC line start address alignment. With compose rectangle support in
the capture driver, they don't have to anymore.
If the direct CSI -> IC path is enabled, the CSI output width must
still be aligned to 8 pixels (IC burst length).

Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
Reviewed-by: Steve Longerbeam <slongerbeam@gmail.com>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
drivers/staging/media/imx/imx-ic-prpencvf.c
drivers/staging/media/imx/imx-media-csi.c
drivers/staging/media/imx/imx-media-utils.c

index c7855fbc449d1bbb403c3c42891514fcc6d3b9b3..053a911d477aa6ec1d7ac4fec204ae2be8cf33cb 100644 (file)
@@ -48,7 +48,7 @@
 
 #define MAX_W_SRC  1024
 #define MAX_H_SRC  1024
-#define W_ALIGN_SRC   4 /* multiple of 16 pixels */
+#define W_ALIGN_SRC   1 /* multiple of 2 pixels */
 #define H_ALIGN_SRC   1 /* multiple of 2 lines */
 
 #define S_ALIGN       1 /* multiple of 2 */
index 39fad3bfa6ca3e422c9e64e238bafc78b61b5c15..8857994b2a160f4663bb0b46c80ddc789634036f 100644 (file)
@@ -41,7 +41,7 @@
 #define MIN_H       144
 #define MAX_W      4096
 #define MAX_H      4096
-#define W_ALIGN    4 /* multiple of 16 pixels */
+#define W_ALIGN    1 /* multiple of 2 pixels */
 #define H_ALIGN    1 /* multiple of 2 lines */
 #define S_ALIGN    1 /* multiple of 2 */
 
@@ -1029,6 +1029,8 @@ static int csi_link_setup(struct media_entity *entity,
                v4l2_ctrl_handler_free(&priv->ctrl_hdlr);
                v4l2_ctrl_handler_init(&priv->ctrl_hdlr, 0);
                priv->sink = NULL;
+               /* do not apply IC burst alignment in csi_try_crop */
+               priv->active_output_pad = CSI_SRC_PAD_IDMAC;
                goto out;
        }
 
@@ -1172,7 +1174,10 @@ static void csi_try_crop(struct csi_priv *priv,
                crop->left = infmt->width - crop->width;
        /* adjust crop left/width to h/w alignment restrictions */
        crop->left &= ~0x3;
-       crop->width &= ~0x7;
+       if (priv->active_output_pad == CSI_SRC_PAD_DIRECT)
+               crop->width &= ~0x7; /* multiple of 8 pixels (IC burst) */
+       else
+               crop->width &= ~0x1; /* multiple of 2 pixels */
 
        in_height = infmt->height;
        if (infmt->field == V4L2_FIELD_ALTERNATE)
@@ -1937,6 +1942,8 @@ static int imx_csi_probe(struct platform_device *pdev)
        priv->csi_id = pdata->csi;
        priv->smfc_id = (priv->csi_id == 0) ? 0 : 2;
 
+       priv->active_output_pad = CSI_SRC_PAD_IDMAC;
+
        timer_setup(&priv->eof_timeout_timer, csi_idmac_eof_timeout, 0);
        spin_lock_init(&priv->irqlock);
 
index 0eaa353d5cb3976893f460c8a114442e87541012..5f110d90a4ef81cd25a847134f8fbcd72e871855 100644 (file)
@@ -580,6 +580,7 @@ int imx_media_mbus_fmt_to_pix_fmt(struct v4l2_pix_format *pix,
                                  struct v4l2_mbus_framefmt *mbus,
                                  const struct imx_media_pixfmt *cc)
 {
+       u32 width;
        u32 stride;
 
        if (!cc) {
@@ -602,9 +603,16 @@ int imx_media_mbus_fmt_to_pix_fmt(struct v4l2_pix_format *pix,
                cc = imx_media_find_mbus_format(code, CS_SEL_YUV, false);
        }
 
-       stride = cc->planar ? mbus->width : (mbus->width * cc->bpp) >> 3;
+       /* Round up width for minimum burst size */
+       width = round_up(mbus->width, 8);
 
-       pix->width = mbus->width;
+       /* Round up stride for IDMAC line start address alignment */
+       if (cc->planar)
+               stride = round_up(width, 16);
+       else
+               stride = round_up((width * cc->bpp) >> 3, 8);
+
+       pix->width = width;
        pix->height = mbus->height;
        pix->pixelformat = cc->fourcc;
        pix->colorspace = mbus->colorspace;
@@ -613,7 +621,8 @@ int imx_media_mbus_fmt_to_pix_fmt(struct v4l2_pix_format *pix,
        pix->quantization = mbus->quantization;
        pix->field = mbus->field;
        pix->bytesperline = stride;
-       pix->sizeimage = (pix->width * pix->height * cc->bpp) >> 3;
+       pix->sizeimage = cc->planar ? ((stride * pix->height * cc->bpp) >> 3) :
+                        stride * pix->height;
 
        return 0;
 }