Hi Sakari,

Thanks for reviewing,

On 10/13/20 11:07 AM, Sakari Ailus wrote:
> Hi Hugues,
> 
> On Wed, Oct 07, 2020 at 06:14:50PM +0200, Hugues Fruchet wrote:
>> Add support of BT656 embedded synchronization bus.
>> This mode allows to save hardware synchro lines hsync & vsync
>> by replacing them with synchro codes embedded in data stream.
>> This bus type is only compatible with 8 bits width data bus.
>> Due to reserved values 0x00 & 0xff used for synchro codes,
>> valid data only vary from 0x1 to 0xfe, this is up to sensor
>> to clip accordingly pixel data. As a consequence of this
>> clipping, JPEG is not supported when using this bus type.
>> DCMI crop feature is also not available with this bus type.
> 
> You can have more than 62 characters per line. In fact, 75 is the
> recommended maximum.
> 
> You should also amend the bindings to cover BT.656 mode. Also bus-type
> should probably be made mandatory, too.
Will do both.

> 
>>
>> Signed-off-by: Hugues Fruchet <hugues.fruc...@st.com>
>> ---
>>   drivers/media/platform/stm32/stm32-dcmi.c | 37 
>> +++++++++++++++++++++++++++++--
>>   1 file changed, 35 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/media/platform/stm32/stm32-dcmi.c 
>> b/drivers/media/platform/stm32/stm32-dcmi.c
>> index fd1c41c..d7d7cdb 100644
>> --- a/drivers/media/platform/stm32/stm32-dcmi.c
>> +++ b/drivers/media/platform/stm32/stm32-dcmi.c
>> @@ -157,6 +157,7 @@ struct stm32_dcmi {
>>      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;
>> @@ -777,6 +778,23 @@ static int dcmi_start_streaming(struct vb2_queue *vq, 
>> unsigned int count)
>>      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 */
>> @@ -1067,8 +1085,9 @@ static int dcmi_set_fmt(struct stm32_dcmi *dcmi, 
>> struct v4l2_format *f)
>>      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 */
>> @@ -1592,6 +1611,11 @@ static int dcmi_formats_init(struct stm32_dcmi *dcmi)
>>                      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 ==
>> @@ -1873,9 +1897,18 @@ static int dcmi_probe(struct platform_device *pdev)
>>              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 %d bits bus width 
>> (8 bits required)\n",
>> +                    ep.bus.parallel.bus_width);
> 
> bus_width is unsigned here.
I will fix it.

> 
>> +            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)
> 

BR,
Hugues.

Reply via email to