.h_align        = 3,
                .v_align        = 3,
                .flags          = MXC_JPEG_FMT_TYPE_RAW,
+               .precision      = 8,
        },
        {
                .name           = "ARGB", /* ARGBARGB packed format */
                .h_align        = 3,
                .v_align        = 3,
                .flags          = MXC_JPEG_FMT_TYPE_RAW,
+               .precision      = 8,
        },
        {
                .name           = "YUV420", /* 1st plane = Y, 2nd plane = UV */
                .h_align        = 4,
                .v_align        = 4,
                .flags          = MXC_JPEG_FMT_TYPE_RAW,
+               .precision      = 8,
        },
        {
                .name           = "YUV422", /* YUYV */
                .h_align        = 4,
                .v_align        = 3,
                .flags          = MXC_JPEG_FMT_TYPE_RAW,
+               .precision      = 8,
        },
        {
                .name           = "YUV444", /* YUVYUV */
                .h_align        = 3,
                .v_align        = 3,
                .flags          = MXC_JPEG_FMT_TYPE_RAW,
+               .precision      = 8,
        },
        {
                .name           = "Gray", /* Gray (Y8/Y12) or Single Comp */
                .h_align        = 3,
                .v_align        = 3,
                .flags          = MXC_JPEG_FMT_TYPE_RAW,
+               .precision      = 8,
        },
 };
 
 
        for (i = 0; i < MXC_JPEG_NUM_FORMATS; i++)
                if (mxc_formats[i].subsampling == header->frame.subsampling &&
-                   mxc_formats[i].nc == header->frame.num_components) {
+                   mxc_formats[i].nc == header->frame.num_components &&
+                   mxc_formats[i].precision == header->frame.precision) {
                        fourcc = mxc_formats[i].fourcc;
                        break;
                }
        if (fourcc == 0) {
-               dev_err(dev, "Could not identify image format nc=%d, subsampling=%d\n",
+               dev_err(dev,
+                       "Could not identify image format nc=%d, subsampling=%d, precision=%d\n",
                        header->frame.num_components,
-                       header->frame.subsampling);
+                       header->frame.subsampling,
+                       header->frame.precision);
                return fourcc;
        }
        /*
                /* bytesperline unused for compressed formats */
                q->bytesperline[0] = 0;
                q->bytesperline[1] = 0;
-       } else if (q->fmt->fourcc == V4L2_PIX_FMT_NV12M) {
+       } else if (q->fmt->subsampling == V4L2_JPEG_CHROMA_SUBSAMPLING_420) {
                /* When the image format is planar the bytesperline value
                 * applies to the first plane and is divided by the same factor
                 * as the width field for the other planes
                 */
-               q->bytesperline[0] = q->w * (precision / 8) *
-                                    (q->fmt->depth / 8);
+               q->bytesperline[0] = q->w * DIV_ROUND_UP(precision, 8);
                q->bytesperline[1] = q->bytesperline[0];
+       } else if (q->fmt->subsampling == V4L2_JPEG_CHROMA_SUBSAMPLING_422) {
+               q->bytesperline[0] = q->w * DIV_ROUND_UP(precision, 8) * 2;
+               q->bytesperline[1] = 0;
+       } else if (q->fmt->subsampling == V4L2_JPEG_CHROMA_SUBSAMPLING_444) {
+               q->bytesperline[0] = q->w * DIV_ROUND_UP(precision, 8) * q->fmt->nc;
+               q->bytesperline[1] = 0;
        } else {
-               /* single plane formats */
-               q->bytesperline[0] = q->w * (precision / 8) *
-                                    (q->fmt->depth / 8);
+               /* grayscale */
+               q->bytesperline[0] = q->w * DIV_ROUND_UP(precision, 8);
                q->bytesperline[1] = 0;
        }
 }
                (fourcc >> 24) & 0xff);
 
        /* setup bytesperline/sizeimage for capture queue */
-       mxc_jpeg_bytesperline(q_data_cap, header.frame.precision);
+       mxc_jpeg_bytesperline(q_data_cap, q_data_cap->fmt->precision);
        mxc_jpeg_sizeimage(q_data_cap);
 
        /*
                q[i]->h = MXC_JPEG_DEFAULT_HEIGHT;
                q[i]->w_adjusted = MXC_JPEG_DEFAULT_WIDTH;
                q[i]->h_adjusted = MXC_JPEG_DEFAULT_HEIGHT;
-               mxc_jpeg_bytesperline(q[i], 8);
+               mxc_jpeg_bytesperline(q[i], q[i]->fmt->precision);
                mxc_jpeg_sizeimage(q[i]);
        }
 }
        }
 
        /* calculate bytesperline & sizeimage into the tmp_q */
-       mxc_jpeg_bytesperline(&tmp_q, 8);
+       mxc_jpeg_bytesperline(&tmp_q, fmt->precision);
        mxc_jpeg_sizeimage(&tmp_q);
 
        /* adjust user format according to our calculations */