struct vb2_queue                queue;
 
        struct v4l2_fwnode_bus_parallel bus;
+       enum v4l2_mbus_type             bus_type;
        struct completion               complete;
        struct clk                      *mclk;
        enum state                      state;
        if (dcmi->bus.flags & V4L2_MBUS_PCLK_SAMPLE_RISING)
                val |= CR_PCKPOL;
 
+       /*
+        * BT656 embedded synchronisation bus mode.
+        *
+        * Default SAV/EAV mode is supported here with default codes
+        * SAV=0xff000080 & EAV=0xff00009d.
+        * With DCMI this means LSC=SAV=0x80 & LEC=EAV=0x9d.
+        */
+       if (dcmi->bus_type == V4L2_MBUS_BT656) {
+               val |= CR_ESS;
+
+               /* Unmask all codes */
+               reg_write(dcmi->regs, DCMI_ESUR, 0xffffffff);/* FEC:LEC:LSC:FSC */
+
+               /* Trig on LSC=0x80 & LEC=0x9d codes, ignore FSC and FEC */
+               reg_write(dcmi->regs, DCMI_ESCR, 0xff9d80ff);/* FEC:LEC:LSC:FSC */
+       }
+
        reg_write(dcmi->regs, DCMI_CR, val);
 
        /* Set crop */
        if (ret)
                return ret;
 
-       /* Disable crop if JPEG is requested */
-       if (pix->pixelformat == V4L2_PIX_FMT_JPEG)
+       /* Disable crop if JPEG is requested or BT656 bus is selected */
+       if (pix->pixelformat == V4L2_PIX_FMT_JPEG &&
+           dcmi->bus_type != V4L2_MBUS_BT656)
                dcmi->do_crop = false;
 
        /* pix to mbus format */
                        if (dcmi_formats[i].mbus_code != mbus_code.code)
                                continue;
 
+                       /* Exclude JPEG if BT656 bus is selected */
+                       if (dcmi_formats[i].fourcc == V4L2_PIX_FMT_JPEG &&
+                           dcmi->bus_type == V4L2_MBUS_BT656)
+                               continue;
+
                        /* Code supported, have we got this fourcc yet? */
                        for (j = 0; j < num_fmts; j++)
                                if (sd_fmts[j]->fourcc ==
                dev_err(&pdev->dev, "CSI bus not supported\n");
                return -ENODEV;
        }
+
+       if (ep.bus_type == V4L2_MBUS_BT656 &&
+           ep.bus.parallel.bus_width != 8) {
+               dev_err(&pdev->dev, "BT656 bus conflicts with %u bits bus width (8 bits required)\n",
+                       ep.bus.parallel.bus_width);
+               return -ENODEV;
+       }
+
        dcmi->bus.flags = ep.bus.parallel.flags;
        dcmi->bus.bus_width = ep.bus.parallel.bus_width;
        dcmi->bus.data_shift = ep.bus.parallel.data_shift;
+       dcmi->bus_type = ep.bus_type;
 
        irq = platform_get_irq(pdev, 0);
        if (irq <= 0)