[RFC PATCH 2/8] media: v4l: Add 10-bit RGBIr formats

From: Rishikesh Donadkar

Date: Fri Sep 25 2026 - 09:32:44 EST


From: Jai Luthra <j-luthra@xxxxxx>

Some camera sensors now use an expanded CFA pattern to capture near-IR
light along with the visible spectrum (R,G,B). This allows capturing
light in both low-light and day-light scenarios using the same sensor.

Instead of having a 2x2 repetition of B,G,R like in older bayer formats,
here we have a 4x4 repetition of B,G,R,Ir where the number of G pixels
are the same, but half the B and R pixels are replaced with Ir. Thus
instead of having 4 total phases, we now have 8 total phases or
re-arrangements of this pattern.

Co-developed-by: Rahul T R <r-ravikumar@xxxxxx>
Signed-off-by: Rahul T R <r-ravikumar@xxxxxx>
Signed-off-by: Jai Luthra <j-luthra@xxxxxx>
Co-developed-by: Rishikesh Donadkar <r-donadkar@xxxxxx>
Signed-off-by: Rishikesh Donadkar <r-donadkar@xxxxxx>
---
drivers/media/v4l2-core/v4l2-ioctl.c | 8 ++++++++
include/uapi/linux/media-bus-format.h | 10 +++++++++-
include/uapi/linux/videodev2.h | 9 +++++++++
3 files changed, 26 insertions(+), 1 deletion(-)

diff --git a/drivers/media/v4l2-core/v4l2-ioctl.c b/drivers/media/v4l2-core/v4l2-ioctl.c
index 17ba1ae70735..97ce6e1a6781 100644
--- a/drivers/media/v4l2-core/v4l2-ioctl.c
+++ b/drivers/media/v4l2-core/v4l2-ioctl.c
@@ -1435,6 +1435,14 @@ static void v4l_fill_fmtdesc(struct v4l2_fmtdesc *fmt)
case V4L2_PIX_FMT_SGRBG16: descr = "16-bit Bayer GRGR/BGBG"; break;
case V4L2_PIX_FMT_SRGGB16: descr = "16-bit Bayer RGRG/GBGB"; break;
case V4L2_PIX_FMT_RAW_CRU20: descr = "14-bit Raw CRU Packed"; break;
+ case V4L2_PIX_FMT_SRGGI10: descr = "10-bit Bayer RGBG/GIrGIr"; break;
+ case V4L2_PIX_FMT_SGRIG10: descr = "10-bit Bayer GRGB/IrGIrG"; break;
+ case V4L2_PIX_FMT_SBGGI10: descr = "10-bit Bayer BGRG/GIrGIr"; break;
+ case V4L2_PIX_FMT_SGBIG10: descr = "10-bit Bayer GBGR/IrGIrG"; break;
+ case V4L2_PIX_FMT_SGIRG10: descr = "10-bit Bayer GIrGIr/RGBG"; break;
+ case V4L2_PIX_FMT_SIGGR10: descr = "10-bit Bayer IrGIrG/GRGB"; break;
+ case V4L2_PIX_FMT_SGIBG10: descr = "10-bit Bayer GIrGIr/BGRG"; break;
+ case V4L2_PIX_FMT_SIGGB10: descr = "10-bit Bayer IrGIrG/GBGR"; break;
case V4L2_PIX_FMT_SN9C20X_I420: descr = "GSPCA SN9C20X I420"; break;
case V4L2_PIX_FMT_SPCA501: descr = "GSPCA SPCA501"; break;
case V4L2_PIX_FMT_SPCA505: descr = "GSPCA SPCA505"; break;
diff --git a/include/uapi/linux/media-bus-format.h b/include/uapi/linux/media-bus-format.h
index 6005f033e62c..c50042300a98 100644
--- a/include/uapi/linux/media-bus-format.h
+++ b/include/uapi/linux/media-bus-format.h
@@ -124,7 +124,7 @@
#define MEDIA_BUS_FMT_YUV16_1X48 0x202a
#define MEDIA_BUS_FMT_UYYVYY16_0_5X48 0x202b

-/* Bayer - next is 0x3025 */
+/* Bayer - next is 0x3029 */
#define MEDIA_BUS_FMT_SBGGR8_1X8 0x3001
#define MEDIA_BUS_FMT_SGBRG8_1X8 0x3013
#define MEDIA_BUS_FMT_SGRBG8_1X8 0x3002
@@ -161,6 +161,14 @@
#define MEDIA_BUS_FMT_SGBRG20_1X20 0x3022
#define MEDIA_BUS_FMT_SGRBG20_1X20 0x3023
#define MEDIA_BUS_FMT_SRGGB20_1X20 0x3024
+#define MEDIA_BUS_FMT_SRGGI10_1X10 0x3021
+#define MEDIA_BUS_FMT_SGRIG10_1X10 0x3022
+#define MEDIA_BUS_FMT_SBGGI10_1X10 0x3023
+#define MEDIA_BUS_FMT_SGBIG10_1X10 0x3024
+#define MEDIA_BUS_FMT_SGIRG10_1X10 0x3025
+#define MEDIA_BUS_FMT_SIGGR10_1X10 0x3026
+#define MEDIA_BUS_FMT_SGIBG10_1X10 0x3027
+#define MEDIA_BUS_FMT_SIGGB10_1X10 0x3028

/* JPEG compressed formats - next is 0x4002 */
#define MEDIA_BUS_FMT_JPEG_1X8 0x4001
diff --git a/include/uapi/linux/videodev2.h b/include/uapi/linux/videodev2.h
index 5373dba640fa..c56af0826f59 100644
--- a/include/uapi/linux/videodev2.h
+++ b/include/uapi/linux/videodev2.h
@@ -744,6 +744,15 @@ struct v4l2_pix_format {
#define V4L2_PIX_FMT_SGBRG16 v4l2_fourcc('G', 'B', '1', '6') /* 16 GBGB.. RGRG.. */
#define V4L2_PIX_FMT_SGRBG16 v4l2_fourcc('G', 'R', '1', '6') /* 16 GRGR.. BGBG.. */
#define V4L2_PIX_FMT_SRGGB16 v4l2_fourcc('R', 'G', '1', '6') /* 16 RGRG.. GBGB.. */
+ /* 10bit raw bayer with IR (4x4) */
+#define V4L2_PIX_FMT_SRGGI10 v4l2_fourcc('R', 'G', 'I', '0') /* 10 RGBG.. GIrGIr.. */
+#define V4L2_PIX_FMT_SGRIG10 v4l2_fourcc('G', 'R', 'I', '0') /* 10 GRGB.. IrGIrG.. */
+#define V4L2_PIX_FMT_SBGGI10 v4l2_fourcc('B', 'G', 'I', '0') /* 10 BGRG.. GIrGIr.. */
+#define V4L2_PIX_FMT_SGBIG10 v4l2_fourcc('G', 'B', 'I', '0') /* 10 GBGR.. IrGIrG.. */
+#define V4L2_PIX_FMT_SGIRG10 v4l2_fourcc('G', 'I', 'R', '0') /* 10 GIrGIr.. RGBG.. */
+#define V4L2_PIX_FMT_SIGGR10 v4l2_fourcc('I', 'G', 'R', '0') /* 10 IrGIrG.. GRGB.. */
+#define V4L2_PIX_FMT_SGIBG10 v4l2_fourcc('G', 'I', 'B', '0') /* 10 GIrGIr.. BGRG.. */
+#define V4L2_PIX_FMT_SIGGB10 v4l2_fourcc('I', 'G', 'B', '0') /* 10 IrGIrG.. GBGR.. */

/* HSV formats */
#define V4L2_PIX_FMT_HSV24 v4l2_fourcc('H', 'S', 'V', '3')
--
2.34.1