[PATCHv2 4/4] media: imx: Use dedicated format handler for i.MX7/8
Dan Carpenter
dan.carpenter at oracle.com
Wed Nov 3 03:41:00 PDT 2021
On Sun, Oct 17, 2021 at 01:08:37PM +0200, Dorota Czaplejewicz wrote:
> +static int imx78_media_mbus_fmt_to_pix_fmt(struct v4l2_pix_format *pix,
> + const struct v4l2_mbus_framefmt *mbus,
> + const struct imx_media_pixfmt *cc)
> +{
> + u32 width;
> + u32 stride;
> + u8 divisor;
> +
> + if (!cc) {
> + cc = imx_media_find_ipu_format(mbus->code,
> + PIXFMT_SEL_YUV_RGB);
> + if (!cc)
> + cc = imx_media_find_mbus_format(mbus->code,
> + PIXFMT_SEL_ANY);
> + if (!cc)
> + return -EINVAL;
> + }
> +
> + /*
> + * TODO: the IPU currently does not support the AYUV32 format,
> + * so until it does convert to a supported YUV format.
> + */
> + if (cc->ipufmt && cc->cs == IPUV3_COLORSPACE_YUV) {
> + u32 code;
> +
> + imx_media_enum_mbus_formats(&code, 0, PIXFMT_SEL_YUV);
> + cc = imx_media_find_mbus_format(code, PIXFMT_SEL_YUV);
Do we need a if (!cc) NULL check after this assignment?
> + }
> +
> + /*
> + * The hardware can handle line lengths divisible by 4 bytes,
> + * as long as the number of lines is even.
> + * Otherwise, use the value of 8 bytes recommended in the datasheet.
> + */
> + divisor = 4 << (mbus->height % 2);
> +
> + width = round_up(mbus->width, divisor);
> +
> + if (cc->planar)
> + stride = round_up(width, 16);
> + else
> + stride = round_up((width * cc->bpp) >> 3, divisor);
> +
> + pix->width = width;
> + pix->height = mbus->height;
> + pix->pixelformat = cc->fourcc;
> + pix->colorspace = mbus->colorspace;
> + pix->xfer_func = mbus->xfer_func;
> + pix->ycbcr_enc = mbus->ycbcr_enc;
> + pix->quantization = mbus->quantization;
> + pix->field = mbus->field;
> + pix->bytesperline = stride;
> + pix->sizeimage = cc->planar ? ((stride * pix->height * cc->bpp) >> 3) :
> + stride * pix->height;
> +
> + return 0;
> +}
regards,
dan carpenter
More information about the linux-arm-kernel
mailing list