Merge tag 'media/v5.20-1' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab...
[linux-2.6-microblaze.git] / drivers / media / i2c / st-mipid02.c
index ef976d0..16cc547 100644 (file)
@@ -50,6 +50,7 @@
 /* Bits definition for MIPID02_MODE_REG2 */
 #define MODE_HSYNC_ACTIVE_HIGH                         BIT(1)
 #define MODE_VSYNC_ACTIVE_HIGH                         BIT(2)
+#define MODE_PCLK_SAMPLE_RISING                                BIT(3)
 /* Bits definition for MIPID02_DATA_SELECTION_CTRL */
 #define SELECTION_MANUAL_DATA                          BIT(2)
 #define SELECTION_MANUAL_WIDTH                         BIT(3)
@@ -61,9 +62,12 @@ static const u32 mipid02_supported_fmt_codes[] = {
        MEDIA_BUS_FMT_SGRBG10_1X10, MEDIA_BUS_FMT_SRGGB10_1X10,
        MEDIA_BUS_FMT_SBGGR12_1X12, MEDIA_BUS_FMT_SGBRG12_1X12,
        MEDIA_BUS_FMT_SGRBG12_1X12, MEDIA_BUS_FMT_SRGGB12_1X12,
-       MEDIA_BUS_FMT_UYVY8_1X16, MEDIA_BUS_FMT_BGR888_1X24,
+       MEDIA_BUS_FMT_YUYV8_1X16, MEDIA_BUS_FMT_YVYU8_1X16,
+       MEDIA_BUS_FMT_UYVY8_1X16, MEDIA_BUS_FMT_VYUY8_1X16,
+       MEDIA_BUS_FMT_RGB565_1X16, MEDIA_BUS_FMT_BGR888_1X24,
        MEDIA_BUS_FMT_RGB565_2X8_LE, MEDIA_BUS_FMT_RGB565_2X8_BE,
-       MEDIA_BUS_FMT_YUYV8_2X8, MEDIA_BUS_FMT_UYVY8_2X8,
+       MEDIA_BUS_FMT_YUYV8_2X8, MEDIA_BUS_FMT_YVYU8_2X8,
+       MEDIA_BUS_FMT_UYVY8_2X8, MEDIA_BUS_FMT_VYUY8_2X8,
        MEDIA_BUS_FMT_JPEG_1X8
 };
 
@@ -130,9 +134,15 @@ static int bpp_from_code(__u32 code)
        case MEDIA_BUS_FMT_SGRBG12_1X12:
        case MEDIA_BUS_FMT_SRGGB12_1X12:
                return 12;
+       case MEDIA_BUS_FMT_YUYV8_1X16:
+       case MEDIA_BUS_FMT_YVYU8_1X16:
        case MEDIA_BUS_FMT_UYVY8_1X16:
+       case MEDIA_BUS_FMT_VYUY8_1X16:
+       case MEDIA_BUS_FMT_RGB565_1X16:
        case MEDIA_BUS_FMT_YUYV8_2X8:
+       case MEDIA_BUS_FMT_YVYU8_2X8:
        case MEDIA_BUS_FMT_UYVY8_2X8:
+       case MEDIA_BUS_FMT_VYUY8_2X8:
        case MEDIA_BUS_FMT_RGB565_2X8_LE:
        case MEDIA_BUS_FMT_RGB565_2X8_BE:
                return 16;
@@ -161,12 +171,18 @@ static u8 data_type_from_code(__u32 code)
        case MEDIA_BUS_FMT_SGRBG12_1X12:
        case MEDIA_BUS_FMT_SRGGB12_1X12:
                return 0x2c;
+       case MEDIA_BUS_FMT_YUYV8_1X16:
+       case MEDIA_BUS_FMT_YVYU8_1X16:
        case MEDIA_BUS_FMT_UYVY8_1X16:
+       case MEDIA_BUS_FMT_VYUY8_1X16:
        case MEDIA_BUS_FMT_YUYV8_2X8:
+       case MEDIA_BUS_FMT_YVYU8_2X8:
        case MEDIA_BUS_FMT_UYVY8_2X8:
+       case MEDIA_BUS_FMT_VYUY8_2X8:
                return 0x1e;
        case MEDIA_BUS_FMT_BGR888_1X24:
                return 0x24;
+       case MEDIA_BUS_FMT_RGB565_1X16:
        case MEDIA_BUS_FMT_RGB565_2X8_LE:
        case MEDIA_BUS_FMT_RGB565_2X8_BE:
                return 0x22;
@@ -201,8 +217,16 @@ static __u32 get_fmt_code(__u32 code)
 
 static __u32 serial_to_parallel_code(__u32 serial)
 {
+       if (serial == MEDIA_BUS_FMT_RGB565_1X16)
+               return MEDIA_BUS_FMT_RGB565_2X8_LE;
+       if (serial == MEDIA_BUS_FMT_YUYV8_1X16)
+               return MEDIA_BUS_FMT_YUYV8_2X8;
+       if (serial == MEDIA_BUS_FMT_YVYU8_1X16)
+               return MEDIA_BUS_FMT_YVYU8_2X8;
        if (serial == MEDIA_BUS_FMT_UYVY8_1X16)
                return MEDIA_BUS_FMT_UYVY8_2X8;
+       if (serial == MEDIA_BUS_FMT_VYUY8_1X16)
+               return MEDIA_BUS_FMT_VYUY8_2X8;
        if (serial == MEDIA_BUS_FMT_BGR888_1X24)
                return MEDIA_BUS_FMT_BGR888_3X8;
 
@@ -494,6 +518,8 @@ static int mipid02_configure_from_tx(struct mipid02_dev *bridge)
                bridge->r.mode_reg2 |= MODE_HSYNC_ACTIVE_HIGH;
        if (ep->bus.parallel.flags & V4L2_MBUS_VSYNC_ACTIVE_HIGH)
                bridge->r.mode_reg2 |= MODE_VSYNC_ACTIVE_HIGH;
+       if (ep->bus.parallel.flags & V4L2_MBUS_PCLK_SAMPLE_RISING)
+               bridge->r.mode_reg2 |= MODE_PCLK_SAMPLE_RISING;
 
        return 0;
 }