Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

media: vimc: Support multiple media bus codes for each pixelformat

Change vimc_pix_map_list to allow multiple media bus codes to map to the
same pixelformat, making it possible to add media bus codes for which
there are no pixelformat.

Acked-by: Helen Koike <helen.koike@collabora.com>
Signed-off-by: Nícolas F. R. A. Prado <nfraprado@protonmail.com>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
[hverkuil-cisco@xs4all.nl: fix sparse warning: const u32 -> u32]
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>

authored by

Nícolas F. R. A. Prado and committed by
Mauro Carvalho Chehab
b77da87c 6c8d0cdd

+69 -33
+46 -27
drivers/media/test-drivers/vimc/vimc-common.c
··· 19 19 20 20 /* RGB formats */ 21 21 { 22 - .code = MEDIA_BUS_FMT_BGR888_1X24, 22 + .code = { MEDIA_BUS_FMT_BGR888_1X24 }, 23 23 .pixelformat = V4L2_PIX_FMT_BGR24, 24 24 .bpp = 3, 25 25 .bayer = false, 26 26 }, 27 27 { 28 - .code = MEDIA_BUS_FMT_RGB888_1X24, 28 + .code = { MEDIA_BUS_FMT_RGB888_1X24 }, 29 29 .pixelformat = V4L2_PIX_FMT_RGB24, 30 30 .bpp = 3, 31 31 .bayer = false, 32 32 }, 33 33 { 34 - .code = MEDIA_BUS_FMT_ARGB8888_1X32, 34 + .code = { MEDIA_BUS_FMT_ARGB8888_1X32 }, 35 35 .pixelformat = V4L2_PIX_FMT_ARGB32, 36 36 .bpp = 4, 37 37 .bayer = false, ··· 39 39 40 40 /* Bayer formats */ 41 41 { 42 - .code = MEDIA_BUS_FMT_SBGGR8_1X8, 42 + .code = { MEDIA_BUS_FMT_SBGGR8_1X8 }, 43 43 .pixelformat = V4L2_PIX_FMT_SBGGR8, 44 44 .bpp = 1, 45 45 .bayer = true, 46 46 }, 47 47 { 48 - .code = MEDIA_BUS_FMT_SGBRG8_1X8, 48 + .code = { MEDIA_BUS_FMT_SGBRG8_1X8 }, 49 49 .pixelformat = V4L2_PIX_FMT_SGBRG8, 50 50 .bpp = 1, 51 51 .bayer = true, 52 52 }, 53 53 { 54 - .code = MEDIA_BUS_FMT_SGRBG8_1X8, 54 + .code = { MEDIA_BUS_FMT_SGRBG8_1X8 }, 55 55 .pixelformat = V4L2_PIX_FMT_SGRBG8, 56 56 .bpp = 1, 57 57 .bayer = true, 58 58 }, 59 59 { 60 - .code = MEDIA_BUS_FMT_SRGGB8_1X8, 60 + .code = { MEDIA_BUS_FMT_SRGGB8_1X8 }, 61 61 .pixelformat = V4L2_PIX_FMT_SRGGB8, 62 62 .bpp = 1, 63 63 .bayer = true, 64 64 }, 65 65 { 66 - .code = MEDIA_BUS_FMT_SBGGR10_1X10, 66 + .code = { MEDIA_BUS_FMT_SBGGR10_1X10 }, 67 67 .pixelformat = V4L2_PIX_FMT_SBGGR10, 68 68 .bpp = 2, 69 69 .bayer = true, 70 70 }, 71 71 { 72 - .code = MEDIA_BUS_FMT_SGBRG10_1X10, 72 + .code = { MEDIA_BUS_FMT_SGBRG10_1X10 }, 73 73 .pixelformat = V4L2_PIX_FMT_SGBRG10, 74 74 .bpp = 2, 75 75 .bayer = true, 76 76 }, 77 77 { 78 - .code = MEDIA_BUS_FMT_SGRBG10_1X10, 78 + .code = { MEDIA_BUS_FMT_SGRBG10_1X10 }, 79 79 .pixelformat = V4L2_PIX_FMT_SGRBG10, 80 80 .bpp = 2, 81 81 .bayer = true, 82 82 }, 83 83 { 84 - .code = MEDIA_BUS_FMT_SRGGB10_1X10, 84 + .code = { MEDIA_BUS_FMT_SRGGB10_1X10 }, 85 85 .pixelformat = V4L2_PIX_FMT_SRGGB10, 86 86 .bpp = 2, 87 87 .bayer = true, ··· 89 89 90 90 /* 10bit raw bayer a-law compressed to 8 bits */ 91 91 { 92 - .code = MEDIA_BUS_FMT_SBGGR10_ALAW8_1X8, 92 + .code = { MEDIA_BUS_FMT_SBGGR10_ALAW8_1X8 }, 93 93 .pixelformat = V4L2_PIX_FMT_SBGGR10ALAW8, 94 94 .bpp = 1, 95 95 .bayer = true, 96 96 }, 97 97 { 98 - .code = MEDIA_BUS_FMT_SGBRG10_ALAW8_1X8, 98 + .code = { MEDIA_BUS_FMT_SGBRG10_ALAW8_1X8 }, 99 99 .pixelformat = V4L2_PIX_FMT_SGBRG10ALAW8, 100 100 .bpp = 1, 101 101 .bayer = true, 102 102 }, 103 103 { 104 - .code = MEDIA_BUS_FMT_SGRBG10_ALAW8_1X8, 104 + .code = { MEDIA_BUS_FMT_SGRBG10_ALAW8_1X8 }, 105 105 .pixelformat = V4L2_PIX_FMT_SGRBG10ALAW8, 106 106 .bpp = 1, 107 107 .bayer = true, 108 108 }, 109 109 { 110 - .code = MEDIA_BUS_FMT_SRGGB10_ALAW8_1X8, 110 + .code = { MEDIA_BUS_FMT_SRGGB10_ALAW8_1X8 }, 111 111 .pixelformat = V4L2_PIX_FMT_SRGGB10ALAW8, 112 112 .bpp = 1, 113 113 .bayer = true, ··· 115 115 116 116 /* 10bit raw bayer DPCM compressed to 8 bits */ 117 117 { 118 - .code = MEDIA_BUS_FMT_SBGGR10_DPCM8_1X8, 118 + .code = { MEDIA_BUS_FMT_SBGGR10_DPCM8_1X8 }, 119 119 .pixelformat = V4L2_PIX_FMT_SBGGR10DPCM8, 120 120 .bpp = 1, 121 121 .bayer = true, 122 122 }, 123 123 { 124 - .code = MEDIA_BUS_FMT_SGBRG10_DPCM8_1X8, 124 + .code = { MEDIA_BUS_FMT_SGBRG10_DPCM8_1X8 }, 125 125 .pixelformat = V4L2_PIX_FMT_SGBRG10DPCM8, 126 126 .bpp = 1, 127 127 .bayer = true, 128 128 }, 129 129 { 130 - .code = MEDIA_BUS_FMT_SGRBG10_DPCM8_1X8, 130 + .code = { MEDIA_BUS_FMT_SGRBG10_DPCM8_1X8 }, 131 131 .pixelformat = V4L2_PIX_FMT_SGRBG10DPCM8, 132 132 .bpp = 1, 133 133 .bayer = true, 134 134 }, 135 135 { 136 - .code = MEDIA_BUS_FMT_SRGGB10_DPCM8_1X8, 136 + .code = { MEDIA_BUS_FMT_SRGGB10_DPCM8_1X8 }, 137 137 .pixelformat = V4L2_PIX_FMT_SRGGB10DPCM8, 138 138 .bpp = 1, 139 139 .bayer = true, 140 140 }, 141 141 { 142 - .code = MEDIA_BUS_FMT_SBGGR12_1X12, 142 + .code = { MEDIA_BUS_FMT_SBGGR12_1X12 }, 143 143 .pixelformat = V4L2_PIX_FMT_SBGGR12, 144 144 .bpp = 2, 145 145 .bayer = true, 146 146 }, 147 147 { 148 - .code = MEDIA_BUS_FMT_SGBRG12_1X12, 148 + .code = { MEDIA_BUS_FMT_SGBRG12_1X12 }, 149 149 .pixelformat = V4L2_PIX_FMT_SGBRG12, 150 150 .bpp = 2, 151 151 .bayer = true, 152 152 }, 153 153 { 154 - .code = MEDIA_BUS_FMT_SGRBG12_1X12, 154 + .code = { MEDIA_BUS_FMT_SGRBG12_1X12 }, 155 155 .pixelformat = V4L2_PIX_FMT_SGRBG12, 156 156 .bpp = 2, 157 157 .bayer = true, 158 158 }, 159 159 { 160 - .code = MEDIA_BUS_FMT_SRGGB12_1X12, 160 + .code = { MEDIA_BUS_FMT_SRGGB12_1X12 }, 161 161 .pixelformat = V4L2_PIX_FMT_SRGGB12, 162 162 .bpp = 2, 163 163 .bayer = true, ··· 182 182 return &vimc_pix_map_list[i]; 183 183 } 184 184 185 - const struct vimc_pix_map *vimc_pix_map_by_code(u32 code) 185 + u32 vimc_mbus_code_by_index(unsigned int index) 186 186 { 187 - unsigned int i; 187 + unsigned int i, j; 188 188 189 189 for (i = 0; i < ARRAY_SIZE(vimc_pix_map_list); i++) { 190 - if (vimc_pix_map_list[i].code == code) 191 - return &vimc_pix_map_list[i]; 190 + for (j = 0; j < ARRAY_SIZE(vimc_pix_map_list[i].code); j++) { 191 + if (!vimc_pix_map_list[i].code[j]) 192 + break; 193 + 194 + if (!index) 195 + return vimc_pix_map_list[i].code[j]; 196 + index--; 197 + } 198 + } 199 + return 0; 200 + } 201 + 202 + const struct vimc_pix_map *vimc_pix_map_by_code(u32 code) 203 + { 204 + unsigned int i, j; 205 + 206 + for (i = 0; i < ARRAY_SIZE(vimc_pix_map_list); i++) { 207 + for (j = 0; j < ARRAY_SIZE(vimc_pix_map_list[i].code); j++) { 208 + if (vimc_pix_map_list[i].code[j] == code) 209 + return &vimc_pix_map_list[i]; 210 + } 192 211 } 193 212 return NULL; 194 213 }
+12 -1
drivers/media/test-drivers/vimc/vimc-common.h
··· 32 32 #define VIMC_IS_SRC(pad) (pad) 33 33 #define VIMC_IS_SINK(pad) (!(pad)) 34 34 35 + #define VIMC_PIX_FMT_MAX_CODES 1 36 + 35 37 /** 36 38 * vimc_colorimetry_clamp - Adjust colorimetry parameters 37 39 * ··· 72 70 * V4L2_PIX_FMT_* fourcc pixelformat and its bytes per pixel (bpp) 73 71 */ 74 72 struct vimc_pix_map { 75 - unsigned int code; 73 + unsigned int code[VIMC_PIX_FMT_MAX_CODES]; 76 74 unsigned int bpp; 77 75 u32 pixelformat; 78 76 bool bayer; ··· 170 168 * @i: index of the vimc_pix_map struct in vimc_pix_map_list 171 169 */ 172 170 const struct vimc_pix_map *vimc_pix_map_by_index(unsigned int i); 171 + 172 + /** 173 + * vimc_mbus_code_by_index - get mbus code by its index 174 + * 175 + * @index: index of the mbus code in vimc_pix_map_list 176 + * 177 + * Returns 0 if no mbus code is found for the given index. 178 + */ 179 + u32 vimc_mbus_code_by_index(unsigned int index); 173 180 174 181 /** 175 182 * vimc_pix_map_by_code - get vimc_pix_map struct by media bus code
+8 -2
drivers/media/test-drivers/vimc/vimc-scaler.c
··· 110 110 struct v4l2_subdev_pad_config *cfg, 111 111 struct v4l2_subdev_mbus_code_enum *code) 112 112 { 113 - const struct vimc_pix_map *vpix = vimc_pix_map_by_index(code->index); 113 + u32 mbus_code = vimc_mbus_code_by_index(code->index); 114 + const struct vimc_pix_map *vpix; 115 + 116 + if (!mbus_code) 117 + return -EINVAL; 118 + 119 + vpix = vimc_pix_map_by_code(mbus_code); 114 120 115 121 /* We don't support bayer format */ 116 122 if (!vpix || vpix->bayer) 117 123 return -EINVAL; 118 124 119 - code->code = vpix->code; 125 + code->code = mbus_code; 120 126 121 127 return 0; 122 128 }
+3 -3
drivers/media/test-drivers/vimc/vimc-sensor.c
··· 52 52 struct v4l2_subdev_pad_config *cfg, 53 53 struct v4l2_subdev_mbus_code_enum *code) 54 54 { 55 - const struct vimc_pix_map *vpix = vimc_pix_map_by_index(code->index); 55 + u32 mbus_code = vimc_mbus_code_by_index(code->index); 56 56 57 - if (!vpix) 57 + if (!mbus_code) 58 58 return -EINVAL; 59 59 60 - code->code = vpix->code; 60 + code->code = mbus_code; 61 61 62 62 return 0; 63 63 }