1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * V4L2 driver for the JPEG encoder/decoder from i.MX8QXP/i.MX8QM application 4 * processors. 5 * 6 * The multi-planar buffers API is used. 7 * 8 * Baseline and extended sequential jpeg decoding is supported. 9 * Progressive jpeg decoding is not supported by the IP. 10 * Supports encode and decode of various formats: 11 * YUV444, YUV422, YUV420, BGR, ABGR, Gray 12 * YUV420 is the only multi-planar format supported. 13 * Minimum resolution is 64 x 64, maximum 8192 x 8192. 14 * To achieve 8192 x 8192, modify in defconfig: CONFIG_CMA_SIZE_MBYTES=320 15 * The alignment requirements for the resolution depend on the format, 16 * multiple of 16 resolutions should work for all formats. 17 * Special workarounds are made in the driver to support NV12 1080p. 18 * When decoding, the driver detects image resolution and pixel format 19 * from the jpeg stream, by parsing the jpeg markers. 20 * 21 * The IP has 4 slots available for context switching, but only slot 0 22 * was fully tested to work. Context switching is not used by the driver. 23 * Each driver instance (context) allocates a slot for itself, but this 24 * is postponed until device_run, to allow unlimited opens. 25 * 26 * The driver submits jobs to the IP by setting up a descriptor for the 27 * used slot, and then validating it. The encoder has an additional descriptor 28 * for the configuration phase. The driver expects FRM_DONE interrupt from 29 * IP to mark the job as finished. 30 * 31 * The decoder IP has some limitations regarding the component ID's, 32 * but the driver works around this by replacing them in the jpeg stream. 33 * 34 * A module parameter is available for debug purpose (jpeg_tracing), to enable 35 * it, enable dynamic debug for this module and: 36 * echo 1 > /sys/module/mxc_jpeg_encdec/parameters/jpeg_tracing 37 * 38 * This is inspired by the drivers/media/platform/samsung/s5p-jpeg driver 39 * 40 * Copyright 2018-2019 NXP 41 */ 42 43 #include <linux/kernel.h> 44 #include <linux/module.h> 45 #include <linux/io.h> 46 #include <linux/clk.h> 47 #include <linux/of_platform.h> 48 #include <linux/platform_device.h> 49 #include <linux/slab.h> 50 #include <linux/irqreturn.h> 51 #include <linux/interrupt.h> 52 #include <linux/pm_runtime.h> 53 #include <linux/pm_domain.h> 54 #include <linux/string.h> 55 56 #include <media/v4l2-jpeg.h> 57 #include <media/v4l2-mem2mem.h> 58 #include <media/v4l2-ioctl.h> 59 #include <media/v4l2-common.h> 60 #include <media/v4l2-event.h> 61 #include <media/videobuf2-dma-contig.h> 62 63 #include "mxc-jpeg-hw.h" 64 #include "mxc-jpeg.h" 65 66 static const struct mxc_jpeg_fmt mxc_formats[] = { 67 { 68 .name = "JPEG", 69 .fourcc = V4L2_PIX_FMT_JPEG, 70 .subsampling = -1, 71 .nc = -1, 72 .mem_planes = 1, 73 .comp_planes = 1, 74 .flags = MXC_JPEG_FMT_TYPE_ENC, 75 }, 76 { 77 .name = "BGR", /*BGR packed format*/ 78 .fourcc = V4L2_PIX_FMT_BGR24, 79 .subsampling = V4L2_JPEG_CHROMA_SUBSAMPLING_444, 80 .nc = 3, 81 .depth = 24, 82 .mem_planes = 1, 83 .comp_planes = 1, 84 .h_align = 3, 85 .v_align = 3, 86 .flags = MXC_JPEG_FMT_TYPE_RAW, 87 .precision = 8, 88 .is_rgb = 1, 89 }, 90 { 91 .name = "BGR 12bit", /*12-bit BGR packed format*/ 92 .fourcc = V4L2_PIX_FMT_BGR48_12, 93 .subsampling = V4L2_JPEG_CHROMA_SUBSAMPLING_444, 94 .nc = 3, 95 .depth = 36, 96 .mem_planes = 1, 97 .comp_planes = 1, 98 .h_align = 3, 99 .v_align = 3, 100 .flags = MXC_JPEG_FMT_TYPE_RAW, 101 .precision = 12, 102 .is_rgb = 1, 103 }, 104 { 105 .name = "ABGR", /* ABGR packed format */ 106 .fourcc = V4L2_PIX_FMT_ABGR32, 107 .subsampling = V4L2_JPEG_CHROMA_SUBSAMPLING_444, 108 .nc = 4, 109 .depth = 32, 110 .mem_planes = 1, 111 .comp_planes = 1, 112 .h_align = 3, 113 .v_align = 3, 114 .flags = MXC_JPEG_FMT_TYPE_RAW, 115 .precision = 8, 116 .is_rgb = 1, 117 }, 118 { 119 .name = "ABGR 12bit", /* 12-bit ABGR packed format */ 120 .fourcc = V4L2_PIX_FMT_ABGR64_12, 121 .subsampling = V4L2_JPEG_CHROMA_SUBSAMPLING_444, 122 .nc = 4, 123 .depth = 48, 124 .mem_planes = 1, 125 .comp_planes = 1, 126 .h_align = 3, 127 .v_align = 3, 128 .flags = MXC_JPEG_FMT_TYPE_RAW, 129 .precision = 12, 130 .is_rgb = 1, 131 }, 132 { 133 .name = "YUV420", /* 1st plane = Y, 2nd plane = UV */ 134 .fourcc = V4L2_PIX_FMT_NV12M, 135 .subsampling = V4L2_JPEG_CHROMA_SUBSAMPLING_420, 136 .nc = 3, 137 .depth = 12, /* 6 bytes (4Y + UV) for 4 pixels */ 138 .mem_planes = 2, 139 .comp_planes = 2, /* 1 plane Y, 1 plane UV interleaved */ 140 .h_align = 4, 141 .v_align = 4, 142 .flags = MXC_JPEG_FMT_TYPE_RAW, 143 .precision = 8, 144 }, 145 { 146 .name = "YUV420", /* 1st plane = Y, 2nd plane = UV */ 147 .fourcc = V4L2_PIX_FMT_NV12, 148 .subsampling = V4L2_JPEG_CHROMA_SUBSAMPLING_420, 149 .nc = 3, 150 .depth = 12, /* 6 bytes (4Y + UV) for 4 pixels */ 151 .mem_planes = 1, 152 .comp_planes = 2, /* 1 plane Y, 1 plane UV interleaved */ 153 .h_align = 4, 154 .v_align = 4, 155 .flags = MXC_JPEG_FMT_TYPE_RAW, 156 .precision = 8, 157 }, 158 { 159 .name = "YUV420 12bit", /* 1st plane = Y, 2nd plane = UV */ 160 .fourcc = V4L2_PIX_FMT_P012M, 161 .subsampling = V4L2_JPEG_CHROMA_SUBSAMPLING_420, 162 .nc = 3, 163 .depth = 18, /* 6 x 12 bits (4Y + UV) for 4 pixels */ 164 .mem_planes = 2, 165 .comp_planes = 2, /* 1 plane Y, 1 plane UV interleaved */ 166 .h_align = 4, 167 .v_align = 4, 168 .flags = MXC_JPEG_FMT_TYPE_RAW, 169 .precision = 12, 170 }, 171 { 172 .name = "YUV420 12bit", /* 1st plane = Y, 2nd plane = UV */ 173 .fourcc = V4L2_PIX_FMT_P012, 174 .subsampling = V4L2_JPEG_CHROMA_SUBSAMPLING_420, 175 .nc = 3, 176 .depth = 18, /* 6 x 12 bits (4Y + UV) for 4 pixels */ 177 .mem_planes = 1, 178 .comp_planes = 2, /* 1 plane Y, 1 plane UV interleaved */ 179 .h_align = 4, 180 .v_align = 4, 181 .flags = MXC_JPEG_FMT_TYPE_RAW, 182 .precision = 12, 183 }, 184 { 185 .name = "YUV422", /* YUYV */ 186 .fourcc = V4L2_PIX_FMT_YUYV, 187 .subsampling = V4L2_JPEG_CHROMA_SUBSAMPLING_422, 188 .nc = 3, 189 .depth = 16, 190 .mem_planes = 1, 191 .comp_planes = 1, 192 .h_align = 4, 193 .v_align = 3, 194 .flags = MXC_JPEG_FMT_TYPE_RAW, 195 .precision = 8, 196 }, 197 { 198 .name = "YUV422 12bit", /* YUYV */ 199 .fourcc = V4L2_PIX_FMT_Y212, 200 .subsampling = V4L2_JPEG_CHROMA_SUBSAMPLING_422, 201 .nc = 3, 202 .depth = 24, 203 .mem_planes = 1, 204 .comp_planes = 1, 205 .h_align = 4, 206 .v_align = 3, 207 .flags = MXC_JPEG_FMT_TYPE_RAW, 208 .precision = 12, 209 }, 210 { 211 .name = "YUV444", /* YUVYUV */ 212 .fourcc = V4L2_PIX_FMT_YUV24, 213 .subsampling = V4L2_JPEG_CHROMA_SUBSAMPLING_444, 214 .nc = 3, 215 .depth = 24, 216 .mem_planes = 1, 217 .comp_planes = 1, 218 .h_align = 3, 219 .v_align = 3, 220 .flags = MXC_JPEG_FMT_TYPE_RAW, 221 .precision = 8, 222 }, 223 { 224 .name = "YUV444 12bit", /* YUVYUV */ 225 .fourcc = V4L2_PIX_FMT_YUV48_12, 226 .subsampling = V4L2_JPEG_CHROMA_SUBSAMPLING_444, 227 .nc = 3, 228 .depth = 36, 229 .mem_planes = 1, 230 .comp_planes = 1, 231 .h_align = 3, 232 .v_align = 3, 233 .flags = MXC_JPEG_FMT_TYPE_RAW, 234 .precision = 12, 235 }, 236 { 237 .name = "Gray", /* Gray (Y8/Y12) or Single Comp */ 238 .fourcc = V4L2_PIX_FMT_GREY, 239 .subsampling = V4L2_JPEG_CHROMA_SUBSAMPLING_GRAY, 240 .nc = 1, 241 .depth = 8, 242 .mem_planes = 1, 243 .comp_planes = 1, 244 .h_align = 3, 245 .v_align = 3, 246 .flags = MXC_JPEG_FMT_TYPE_RAW, 247 .precision = 8, 248 }, 249 { 250 .name = "Gray 12bit", /* Gray (Y8/Y12) or Single Comp */ 251 .fourcc = V4L2_PIX_FMT_Y012, 252 .subsampling = V4L2_JPEG_CHROMA_SUBSAMPLING_GRAY, 253 .nc = 1, 254 .depth = 12, 255 .mem_planes = 1, 256 .comp_planes = 1, 257 .h_align = 3, 258 .v_align = 3, 259 .flags = MXC_JPEG_FMT_TYPE_RAW, 260 .precision = 12, 261 }, 262 }; 263 264 #define MXC_JPEG_NUM_FORMATS ARRAY_SIZE(mxc_formats) 265 266 static const int mxc_decode_mode = MXC_JPEG_DECODE; 267 static const int mxc_encode_mode = MXC_JPEG_ENCODE; 268 269 static const struct of_device_id mxc_jpeg_match[] = { 270 { 271 .compatible = "nxp,imx8qxp-jpgdec", 272 .data = &mxc_decode_mode, 273 }, 274 { 275 .compatible = "nxp,imx8qxp-jpgenc", 276 .data = &mxc_encode_mode, 277 }, 278 { }, 279 }; 280 281 /* 282 * default configuration stream, 64x64 yuv422 283 * split by JPEG marker, so it's easier to modify & use 284 */ 285 static const unsigned char jpeg_soi[] = { 286 0xFF, 0xD8 287 }; 288 289 static const unsigned char jpeg_app0[] = { 290 0xFF, 0xE0, 291 0x00, 0x10, 0x4A, 0x46, 0x49, 0x46, 0x00, 292 0x01, 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 293 0x00, 0x00 294 }; 295 296 static const unsigned char jpeg_app14[] = { 297 0xFF, 0xEE, 298 0x00, 0x0E, 0x41, 0x64, 0x6F, 0x62, 0x65, 299 0x00, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00 300 }; 301 302 static const unsigned char jpeg_dqt[] = { 303 0xFF, 0xDB, 304 0x00, 0x84, 0x00, 0x10, 0x0B, 0x0C, 0x0E, 305 0x0C, 0x0A, 0x10, 0x0E, 0x0D, 0x0E, 0x12, 306 0x11, 0x10, 0x13, 0x18, 0x28, 0x1A, 0x18, 307 0x16, 0x16, 0x18, 0x31, 0x23, 0x25, 0x1D, 308 0x28, 0x3A, 0x33, 0x3D, 0x3C, 0x39, 0x33, 309 0x38, 0x37, 0x40, 0x48, 0x5C, 0x4E, 0x40, 310 0x44, 0x57, 0x45, 0x37, 0x38, 0x50, 0x6D, 311 0x51, 0x57, 0x5F, 0x62, 0x67, 0x68, 0x67, 312 0x3E, 0x4D, 0x71, 0x79, 0x70, 0x64, 0x78, 313 0x5C, 0x65, 0x67, 0x63, 0x01, 0x11, 0x12, 314 0x12, 0x18, 0x15, 0x18, 0x2F, 0x1A, 0x1A, 315 0x2F, 0x63, 0x42, 0x38, 0x42, 0x63, 0x63, 316 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 317 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 318 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 319 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 320 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 321 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 322 0x63, 0x63, 0x63, 0x63, 0x63, 0x63 323 }; 324 325 static const unsigned char jpeg_dqt_extseq[] = { 326 0xFF, 0xDB, 327 0x01, 0x04, 328 0x10, 329 0x00, 0x80, 0x00, 0x58, 0x00, 0x60, 0x00, 0x70, 330 0x00, 0x60, 0x00, 0x50, 0x00, 0x80, 0x00, 0x70, 331 0x00, 0x68, 0x00, 0x70, 0x00, 0x90, 0x00, 0x88, 332 0x00, 0x80, 0x00, 0x98, 0x00, 0xC0, 0x01, 0x40, 333 0x00, 0xD0, 0x00, 0xC0, 0x00, 0xB0, 0x00, 0xB0, 334 0x00, 0xC0, 0x01, 0x88, 0x01, 0x18, 0x01, 0x28, 335 0x00, 0xE8, 0x01, 0x40, 0x01, 0xD0, 0x01, 0x98, 336 0x01, 0xE8, 0x01, 0xE0, 0x01, 0xC8, 0x01, 0x98, 337 0x01, 0xC0, 0x01, 0xB8, 0x02, 0x00, 0x02, 0x40, 338 0x02, 0xE0, 0x02, 0x70, 0x02, 0x00, 0x02, 0x20, 339 0x02, 0xB8, 0x02, 0x28, 0x01, 0xB8, 0x01, 0xC0, 340 0x02, 0x80, 0x03, 0x68, 0x02, 0x88, 0x02, 0xB8, 341 0x02, 0xF8, 0x03, 0x10, 0x03, 0x38, 0x03, 0x40, 342 0x03, 0x38, 0x01, 0xF0, 0x02, 0x68, 0x03, 0x88, 343 0x03, 0xC8, 0x03, 0x80, 0x03, 0x20, 0x03, 0xC0, 344 0x02, 0xE0, 0x03, 0x28, 0x03, 0x38, 0x03, 0x18, 345 0x11, 346 0x00, 0x88, 0x00, 0x90, 0x00, 0x90, 0x00, 0xC0, 347 0x00, 0xA8, 0x00, 0xC0, 0x01, 0x78, 0x00, 0xD0, 348 0x00, 0xD0, 0x01, 0x78, 0x03, 0x18, 0x02, 0x10, 349 0x01, 0xC0, 0x02, 0x10, 0x03, 0x18, 0x03, 0x18, 350 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 351 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 352 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 353 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 354 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 355 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 356 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 357 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 358 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 359 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 360 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 361 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 362 }; 363 364 static const unsigned char jpeg_sof_maximal[] = { 365 0xFF, 0xC0, 366 0x00, 0x14, 0x08, 0x00, 0x40, 0x00, 0x40, 367 0x04, 0x01, 0x11, 0x00, 0x02, 0x11, 0x01, 368 0x03, 0x11, 0x01, 0x04, 0x11, 0x01 369 }; 370 371 static const unsigned char jpeg_sof_extseq[] = { 372 0xFF, 0xC1, 373 0x00, 0x14, 0x08, 0x00, 0x40, 0x00, 0x40, 374 0x04, 0x01, 0x11, 0x00, 0x02, 0x11, 0x01, 375 0x03, 0x11, 0x01, 0x04, 0x11, 0x01 376 }; 377 378 static const unsigned char jpeg_dht[] = { 379 0xFF, 0xC4, 380 0x01, 0xA2, 0x00, 0x00, 0x01, 0x05, 0x01, 381 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 382 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 383 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 384 0x09, 0x0A, 0x0B, 0x10, 0x00, 0x02, 0x01, 385 0x03, 0x03, 0x02, 0x04, 0x03, 0x05, 0x05, 386 0x04, 0x04, 0x00, 0x00, 0x01, 0x7D, 0x01, 387 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12, 388 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 389 0x07, 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 390 0xA1, 0x08, 0x23, 0x42, 0xB1, 0xC1, 0x15, 391 0x52, 0xD1, 0xF0, 0x24, 0x33, 0x62, 0x72, 392 0x82, 0x09, 0x0A, 0x16, 0x17, 0x18, 0x19, 393 0x1A, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 394 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 395 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 396 0x4A, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 397 0x59, 0x5A, 0x63, 0x64, 0x65, 0x66, 0x67, 398 0x68, 0x69, 0x6A, 0x73, 0x74, 0x75, 0x76, 399 0x77, 0x78, 0x79, 0x7A, 0x83, 0x84, 0x85, 400 0x86, 0x87, 0x88, 0x89, 0x8A, 0x92, 0x93, 401 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 402 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 403 0xA9, 0xAA, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 404 0xB7, 0xB8, 0xB9, 0xBA, 0xC2, 0xC3, 0xC4, 405 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xD2, 406 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 407 0xDA, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 408 0xE7, 0xE8, 0xE9, 0xEA, 0xF1, 0xF2, 0xF3, 409 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 410 0x01, 0x00, 0x03, 0x01, 0x01, 0x01, 0x01, 411 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 412 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 413 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 414 0x0B, 0x11, 0x00, 0x02, 0x01, 0x02, 0x04, 415 0x04, 0x03, 0x04, 0x07, 0x05, 0x04, 0x04, 416 0x00, 0x01, 0x02, 0x77, 0x00, 0x01, 0x02, 417 0x03, 0x11, 0x04, 0x05, 0x21, 0x31, 0x06, 418 0x12, 0x41, 0x51, 0x07, 0x61, 0x71, 0x13, 419 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91, 420 0xA1, 0xB1, 0xC1, 0x09, 0x23, 0x33, 0x52, 421 0xF0, 0x15, 0x62, 0x72, 0xD1, 0x0A, 0x16, 422 0x24, 0x34, 0xE1, 0x25, 0xF1, 0x17, 0x18, 423 0x19, 0x1A, 0x26, 0x27, 0x28, 0x29, 0x2A, 424 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x43, 425 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 426 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 427 0x5A, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 428 0x69, 0x6A, 0x73, 0x74, 0x75, 0x76, 0x77, 429 0x78, 0x79, 0x7A, 0x82, 0x83, 0x84, 0x85, 430 0x86, 0x87, 0x88, 0x89, 0x8A, 0x92, 0x93, 431 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 432 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 433 0xA9, 0xAA, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 434 0xB7, 0xB8, 0xB9, 0xBA, 0xC2, 0xC3, 0xC4, 435 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xD2, 436 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 437 0xDA, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 438 0xE8, 0xE9, 0xEA, 0xF2, 0xF3, 0xF4, 0xF5, 439 0xF6, 0xF7, 0xF8, 0xF9, 0xFA 440 }; 441 442 static const unsigned char jpeg_dht_extseq[] = { 443 0xFF, 0xC4, 444 0x02, 0x2a, 0x00, 0x00, 0x01, 0x05, 0x01, 445 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 446 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 447 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 448 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 449 0x10, 0x00, 0x02, 0x01, 0x03, 0x03, 0x02, 450 0x04, 0x03, 0x05, 0x05, 0x02, 0x03, 0x02, 451 0x00, 0x00, 0xbf, 0x01, 0x02, 0x03, 0x00, 452 0x04, 0x11, 0x05, 0x12, 0x21, 0x31, 0x41, 453 0x06, 0x13, 0x51, 0x61, 0x07, 0x22, 0x71, 454 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08, 0x23, 455 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0, 456 0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 457 0x16, 0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 458 0x27, 0x28, 0x29, 0x2a, 0x34, 0x35, 0x36, 459 0x37, 0x38, 0x39, 0x3a, 0x43, 0x44, 0x45, 460 0x46, 0x47, 0x48, 0x49, 0x4a, 0x53, 0x54, 461 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x63, 462 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 463 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 464 0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 465 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 466 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 467 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 468 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 469 0xba, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 470 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4, 0xd5, 471 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2, 472 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 473 0xea, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 474 0xf7, 0xf8, 0xf9, 0xfa, 0x0b, 0x0c, 0x0d, 475 0x0e, 0x1b, 0x1c, 0x1d, 0x1e, 0x2b, 0x2c, 476 0x2d, 0x2e, 0x3b, 0x3c, 0x3d, 0x3e, 0x4b, 477 0x4c, 0x4d, 0x4e, 0x5b, 0x5c, 0x5d, 0x5e, 478 0x6b, 0x6c, 0x6d, 0x6e, 0x7b, 0x7c, 0x7d, 479 0x7e, 0x8b, 0x8c, 0x8d, 0x8e, 0x9b, 0x9c, 480 0x9d, 0x9e, 0xab, 0xac, 0xad, 0xae, 0xbb, 481 0xbc, 0xbd, 0xbe, 0xcb, 0xcc, 0xcd, 0xce, 482 0xdb, 0xdc, 0xdd, 0xde, 0xeb, 0xec, 0xed, 483 0xee, 0xfb, 0xfc, 0xfd, 0xfe, 0x01, 0x00, 484 0x01, 0x05, 0x01, 0x01, 0x01, 0x01, 0x01, 485 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 486 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 487 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 488 0x0d, 0x0e, 0x0f, 0x11, 0x00, 0x02, 0x01, 489 0x03, 0x03, 0x02, 0x04, 0x03, 0x05, 0x05, 490 0x02, 0x03, 0x02, 0x00, 0x00, 0xbf, 0x01, 491 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12, 492 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 493 0x07, 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 494 0xa1, 0x08, 0x23, 0x42, 0xb1, 0xc1, 0x15, 495 0x52, 0xd1, 0xf0, 0x24, 0x33, 0x62, 0x72, 496 0x82, 0x09, 0x0a, 0x16, 0x17, 0x18, 0x19, 497 0x1a, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 498 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 499 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 500 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 501 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 502 0x68, 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 503 0x77, 0x78, 0x79, 0x7a, 0x83, 0x84, 0x85, 504 0x86, 0x87, 0x88, 0x89, 0x8a, 0x92, 0x93, 505 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 506 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 507 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 508 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 509 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 510 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 511 0xda, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 512 0xe7, 0xe8, 0xe9, 0xea, 0xf1, 0xf2, 0xf3, 513 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 514 0x0b, 0x0c, 0x0d, 0x0e, 0x1b, 0x1c, 0x1d, 515 0x1e, 0x2b, 0x2c, 0x2d, 0x2e, 0x3b, 0x3c, 516 0x3d, 0x3e, 0x4b, 0x4c, 0x4d, 0x4e, 0x5b, 517 0x5c, 0x5d, 0x5e, 0x6b, 0x6c, 0x6d, 0x6e, 518 0x7b, 0x7c, 0x7d, 0x7e, 0x8b, 0x8c, 0x8d, 519 0x8e, 0x9b, 0x9c, 0x9d, 0x9e, 0xab, 0xac, 520 0xad, 0xae, 0xbb, 0xbc, 0xbd, 0xbe, 0xcb, 521 0xcc, 0xcd, 0xce, 0xdb, 0xdc, 0xdd, 0xde, 522 0xeb, 0xec, 0xed, 0xee, 0xfb, 0xfc, 0xfd, 523 0xfe, 524 }; 525 526 static const unsigned char jpeg_dri[] = { 527 0xFF, 0xDD, 528 0x00, 0x04, 0x00, 0x20 529 }; 530 531 static const unsigned char jpeg_sos_maximal[] = { 532 0xFF, 0xDA, 533 0x00, 0x0C, 0x04, 0x01, 0x00, 0x02, 0x11, 0x03, 534 0x11, 0x04, 0x11, 0x00, 0x3F, 0x00 535 }; 536 537 static const unsigned char jpeg_image_red[] = { 538 0xFC, 0x5F, 0xA2, 0xBF, 0xCA, 0x73, 0xFE, 0xFE, 539 0x02, 0x8A, 0x00, 0x28, 0xA0, 0x02, 0x8A, 0x00, 540 0x28, 0xA0, 0x02, 0x8A, 0x00, 0x28, 0xA0, 0x02, 541 0x8A, 0x00, 0x28, 0xA0, 0x02, 0x8A, 0x00, 0x28, 542 0xA0, 0x02, 0x8A, 0x00, 0x28, 0xA0, 0x02, 0x8A, 543 0x00, 0x28, 0xA0, 0x02, 0x8A, 0x00, 0x28, 0xA0, 544 0x02, 0x8A, 0x00, 0x28, 0xA0, 0x02, 0x8A, 0x00, 545 0x28, 0xA0, 0x02, 0x8A, 0x00, 0x28, 0xA0, 0x02, 546 0x8A, 0x00, 0x28, 0xA0, 0x02, 0x8A, 0x00, 0x28, 547 0xA0, 0x02, 0x8A, 0x00, 0x28, 0xA0, 0x02, 0x8A, 548 0x00, 0x28, 0xA0, 0x02, 0x8A, 0x00 549 }; 550 551 static const unsigned char jpeg_eoi[] = { 552 0xFF, 0xD9 553 }; 554 555 struct mxc_jpeg_src_buf { 556 /* common v4l buffer stuff -- must be first */ 557 struct vb2_v4l2_buffer b; 558 struct list_head list; 559 560 /* mxc-jpeg specific */ 561 bool dht_needed; 562 bool jpeg_parse_error; 563 const struct mxc_jpeg_fmt *fmt; 564 int w; 565 int h; 566 }; 567 568 static inline struct mxc_jpeg_src_buf *vb2_to_mxc_buf(struct vb2_buffer *vb) 569 { 570 return container_of(to_vb2_v4l2_buffer(vb), 571 struct mxc_jpeg_src_buf, b); 572 } 573 574 static unsigned int debug; 575 module_param(debug, int, 0644); 576 MODULE_PARM_DESC(debug, "Debug level (0-3)"); 577 578 static unsigned int hw_timeout = 2000; 579 module_param(hw_timeout, int, 0644); 580 MODULE_PARM_DESC(hw_timeout, "MXC JPEG hw timeout, the number of milliseconds"); 581 582 static void mxc_jpeg_bytesperline(struct mxc_jpeg_q_data *q, u32 precision); 583 static void mxc_jpeg_sizeimage(struct mxc_jpeg_q_data *q); 584 585 static void _bswap16(u16 *a) 586 { 587 *a = ((*a & 0x00FF) << 8) | ((*a & 0xFF00) >> 8); 588 } 589 590 static void print_mxc_buf(struct mxc_jpeg_dev *jpeg, struct vb2_buffer *buf, 591 unsigned long len) 592 { 593 unsigned int plane_no; 594 u32 dma_addr; 595 void *vaddr; 596 unsigned long payload; 597 598 if (debug < 3) 599 return; 600 601 for (plane_no = 0; plane_no < buf->num_planes; plane_no++) { 602 payload = vb2_get_plane_payload(buf, plane_no); 603 if (len == 0) 604 len = payload; 605 dma_addr = vb2_dma_contig_plane_dma_addr(buf, plane_no); 606 vaddr = vb2_plane_vaddr(buf, plane_no); 607 v4l2_dbg(3, debug, &jpeg->v4l2_dev, 608 "plane %d (vaddr=%p dma_addr=%x payload=%ld):", 609 plane_no, vaddr, dma_addr, payload); 610 print_hex_dump(KERN_DEBUG, "", DUMP_PREFIX_OFFSET, 32, 1, 611 vaddr, len, false); 612 } 613 } 614 615 static inline struct mxc_jpeg_ctx *mxc_jpeg_fh_to_ctx(struct v4l2_fh *fh) 616 { 617 return container_of(fh, struct mxc_jpeg_ctx, fh); 618 } 619 620 static int enum_fmt(const struct mxc_jpeg_fmt *mxc_formats, int n, 621 struct v4l2_fmtdesc *f, u32 type) 622 { 623 int i, num = 0; 624 625 for (i = 0; i < n; ++i) { 626 if (mxc_formats[i].flags == type) { 627 /* index-th format of searched type found ? */ 628 if (num == f->index) 629 break; 630 /* Correct type but haven't reached our index yet, 631 * just increment per-type index 632 */ 633 ++num; 634 } 635 } 636 637 /* Format not found */ 638 if (i >= n) 639 return -EINVAL; 640 641 f->pixelformat = mxc_formats[i].fourcc; 642 643 return 0; 644 } 645 646 static const struct mxc_jpeg_fmt *mxc_jpeg_find_format(u32 pixelformat) 647 { 648 unsigned int k; 649 650 for (k = 0; k < MXC_JPEG_NUM_FORMATS; k++) { 651 const struct mxc_jpeg_fmt *fmt = &mxc_formats[k]; 652 653 if (fmt->fourcc == pixelformat) 654 return fmt; 655 } 656 return NULL; 657 } 658 659 static enum mxc_jpeg_image_format mxc_jpeg_fourcc_to_imgfmt(u32 fourcc) 660 { 661 switch (fourcc) { 662 case V4L2_PIX_FMT_GREY: 663 case V4L2_PIX_FMT_Y012: 664 return MXC_JPEG_GRAY; 665 case V4L2_PIX_FMT_YUYV: 666 case V4L2_PIX_FMT_Y212: 667 return MXC_JPEG_YUV422; 668 case V4L2_PIX_FMT_NV12: 669 case V4L2_PIX_FMT_NV12M: 670 case V4L2_PIX_FMT_P012: 671 case V4L2_PIX_FMT_P012M: 672 return MXC_JPEG_YUV420; 673 case V4L2_PIX_FMT_YUV24: 674 case V4L2_PIX_FMT_YUV48_12: 675 return MXC_JPEG_YUV444; 676 case V4L2_PIX_FMT_BGR24: 677 case V4L2_PIX_FMT_BGR48_12: 678 return MXC_JPEG_BGR; 679 case V4L2_PIX_FMT_ABGR32: 680 case V4L2_PIX_FMT_ABGR64_12: 681 return MXC_JPEG_ABGR; 682 default: 683 return MXC_JPEG_INVALID; 684 } 685 } 686 687 static struct mxc_jpeg_q_data *mxc_jpeg_get_q_data(struct mxc_jpeg_ctx *ctx, 688 enum v4l2_buf_type type) 689 { 690 if (V4L2_TYPE_IS_OUTPUT(type)) 691 return &ctx->out_q; 692 return &ctx->cap_q; 693 } 694 695 static void mxc_jpeg_addrs(struct mxc_jpeg_desc *desc, 696 struct vb2_buffer *raw_buf, 697 struct vb2_buffer *jpeg_buf, int offset) 698 { 699 int img_fmt = desc->stm_ctrl & STM_CTRL_IMAGE_FORMAT_MASK; 700 struct mxc_jpeg_ctx *ctx = vb2_get_drv_priv(raw_buf->vb2_queue); 701 struct mxc_jpeg_q_data *q_data; 702 703 q_data = mxc_jpeg_get_q_data(ctx, raw_buf->type); 704 desc->buf_base0 = vb2_dma_contig_plane_dma_addr(raw_buf, 0); 705 desc->buf_base1 = 0; 706 if (img_fmt == STM_CTRL_IMAGE_FORMAT(MXC_JPEG_YUV420)) { 707 if (raw_buf->num_planes == 2) 708 desc->buf_base1 = vb2_dma_contig_plane_dma_addr(raw_buf, 1); 709 else 710 desc->buf_base1 = desc->buf_base0 + q_data->sizeimage[0]; 711 } 712 desc->stm_bufbase = vb2_dma_contig_plane_dma_addr(jpeg_buf, 0) + 713 offset; 714 } 715 716 static bool mxc_jpeg_is_extended_sequential(const struct mxc_jpeg_fmt *fmt) 717 { 718 if (!fmt || !(fmt->flags & MXC_JPEG_FMT_TYPE_RAW)) 719 return false; 720 721 if (fmt->precision > 8) 722 return true; 723 724 return false; 725 } 726 727 static void notify_eos(struct mxc_jpeg_ctx *ctx) 728 { 729 const struct v4l2_event ev = { 730 .type = V4L2_EVENT_EOS 731 }; 732 733 dev_dbg(ctx->mxc_jpeg->dev, "Notify app event EOS reached"); 734 v4l2_event_queue_fh(&ctx->fh, &ev); 735 } 736 737 static void notify_src_chg(struct mxc_jpeg_ctx *ctx) 738 { 739 const struct v4l2_event ev = { 740 .type = V4L2_EVENT_SOURCE_CHANGE, 741 .u.src_change.changes = V4L2_EVENT_SRC_CH_RESOLUTION, 742 }; 743 744 dev_dbg(ctx->mxc_jpeg->dev, "Notify app event SRC_CH_RESOLUTION"); 745 v4l2_event_queue_fh(&ctx->fh, &ev); 746 } 747 748 static int mxc_get_free_slot(struct mxc_jpeg_slot_data *slot_data) 749 { 750 if (!slot_data->used) 751 return slot_data->slot; 752 return -1; 753 } 754 755 static bool mxc_jpeg_alloc_slot_data(struct mxc_jpeg_dev *jpeg) 756 { 757 struct mxc_jpeg_desc *desc; 758 struct mxc_jpeg_desc *cfg_desc; 759 void *cfg_stm; 760 761 if (jpeg->slot_data.desc) 762 goto skip_alloc; /* already allocated, reuse it */ 763 764 /* allocate descriptor for decoding/encoding phase */ 765 desc = dma_alloc_coherent(jpeg->dev, 766 sizeof(struct mxc_jpeg_desc), 767 &jpeg->slot_data.desc_handle, 768 GFP_ATOMIC); 769 if (!desc) 770 goto err; 771 jpeg->slot_data.desc = desc; 772 773 /* allocate descriptor for configuration phase (encoder only) */ 774 cfg_desc = dma_alloc_coherent(jpeg->dev, 775 sizeof(struct mxc_jpeg_desc), 776 &jpeg->slot_data.cfg_desc_handle, 777 GFP_ATOMIC); 778 if (!cfg_desc) 779 goto err; 780 jpeg->slot_data.cfg_desc = cfg_desc; 781 782 /* allocate configuration stream */ 783 cfg_stm = dma_alloc_coherent(jpeg->dev, 784 MXC_JPEG_MAX_CFG_STREAM, 785 &jpeg->slot_data.cfg_stream_handle, 786 GFP_ATOMIC); 787 if (!cfg_stm) 788 goto err; 789 jpeg->slot_data.cfg_stream_vaddr = cfg_stm; 790 791 skip_alloc: 792 jpeg->slot_data.used = true; 793 794 return true; 795 err: 796 dev_err(jpeg->dev, "Could not allocate descriptors for slot %d", jpeg->slot_data.slot); 797 798 return false; 799 } 800 801 static void mxc_jpeg_free_slot_data(struct mxc_jpeg_dev *jpeg) 802 { 803 /* free descriptor for decoding/encoding phase */ 804 dma_free_coherent(jpeg->dev, sizeof(struct mxc_jpeg_desc), 805 jpeg->slot_data.desc, 806 jpeg->slot_data.desc_handle); 807 808 /* free descriptor for encoder configuration phase / decoder DHT */ 809 dma_free_coherent(jpeg->dev, sizeof(struct mxc_jpeg_desc), 810 jpeg->slot_data.cfg_desc, 811 jpeg->slot_data.cfg_desc_handle); 812 813 /* free configuration stream */ 814 dma_free_coherent(jpeg->dev, MXC_JPEG_MAX_CFG_STREAM, 815 jpeg->slot_data.cfg_stream_vaddr, 816 jpeg->slot_data.cfg_stream_handle); 817 818 jpeg->slot_data.used = false; 819 } 820 821 static void mxc_jpeg_check_and_set_last_buffer(struct mxc_jpeg_ctx *ctx, 822 struct vb2_v4l2_buffer *src_buf, 823 struct vb2_v4l2_buffer *dst_buf) 824 { 825 if (v4l2_m2m_is_last_draining_src_buf(ctx->fh.m2m_ctx, src_buf)) { 826 dst_buf->flags |= V4L2_BUF_FLAG_LAST; 827 v4l2_m2m_mark_stopped(ctx->fh.m2m_ctx); 828 notify_eos(ctx); 829 ctx->header_parsed = false; 830 } 831 } 832 833 static void mxc_jpeg_job_finish(struct mxc_jpeg_ctx *ctx, enum vb2_buffer_state state, bool reset) 834 { 835 struct mxc_jpeg_dev *jpeg = ctx->mxc_jpeg; 836 void __iomem *reg = jpeg->base_reg; 837 struct vb2_v4l2_buffer *src_buf, *dst_buf; 838 839 dst_buf = v4l2_m2m_next_dst_buf(ctx->fh.m2m_ctx); 840 src_buf = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx); 841 mxc_jpeg_check_and_set_last_buffer(ctx, src_buf, dst_buf); 842 v4l2_m2m_src_buf_remove(ctx->fh.m2m_ctx); 843 v4l2_m2m_dst_buf_remove(ctx->fh.m2m_ctx); 844 v4l2_m2m_buf_done(src_buf, state); 845 v4l2_m2m_buf_done(dst_buf, state); 846 847 mxc_jpeg_disable_irq(reg, ctx->slot); 848 jpeg->slot_data.used = false; 849 if (reset) 850 mxc_jpeg_sw_reset(reg); 851 } 852 853 static u32 mxc_jpeg_get_plane_size(struct mxc_jpeg_q_data *q_data, u32 plane_no) 854 { 855 const struct mxc_jpeg_fmt *fmt = q_data->fmt; 856 u32 size; 857 int i; 858 859 if (plane_no >= fmt->mem_planes) 860 return 0; 861 862 if (fmt->mem_planes == fmt->comp_planes) 863 return q_data->sizeimage[plane_no]; 864 865 if (plane_no < fmt->mem_planes - 1) 866 return q_data->sizeimage[plane_no]; 867 868 size = q_data->sizeimage[fmt->mem_planes - 1]; 869 870 /* Should be impossible given mxc_formats. */ 871 if (WARN_ON_ONCE(fmt->comp_planes > ARRAY_SIZE(q_data->sizeimage))) 872 return size; 873 874 for (i = fmt->mem_planes; i < fmt->comp_planes; i++) 875 size += q_data->sizeimage[i]; 876 877 return size; 878 } 879 880 static irqreturn_t mxc_jpeg_dec_irq(int irq, void *priv) 881 { 882 struct mxc_jpeg_dev *jpeg = priv; 883 struct mxc_jpeg_ctx *ctx; 884 void __iomem *reg = jpeg->base_reg; 885 struct device *dev = jpeg->dev; 886 struct vb2_v4l2_buffer *src_buf, *dst_buf; 887 struct mxc_jpeg_src_buf *jpeg_src_buf; 888 enum vb2_buffer_state buf_state; 889 u32 dec_ret, com_status; 890 unsigned long payload; 891 struct mxc_jpeg_q_data *q_data; 892 enum v4l2_buf_type cap_type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 893 unsigned int slot; 894 895 spin_lock(&jpeg->hw_lock); 896 897 com_status = readl(reg + COM_STATUS); 898 slot = COM_STATUS_CUR_SLOT(com_status); 899 dev_dbg(dev, "Irq %d on slot %d.\n", irq, slot); 900 901 ctx = v4l2_m2m_get_curr_priv(jpeg->m2m_dev); 902 if (WARN_ON(!ctx)) 903 goto job_unlock; 904 905 if (slot != ctx->slot) { 906 /* TODO investigate when adding multi-instance support */ 907 dev_warn(dev, "IRQ slot %d != context slot %d.\n", 908 slot, ctx->slot); 909 goto job_unlock; 910 } 911 912 if (!jpeg->slot_data.used) 913 goto job_unlock; 914 915 dec_ret = readl(reg + MXC_SLOT_OFFSET(slot, SLOT_STATUS)); 916 writel(dec_ret, reg + MXC_SLOT_OFFSET(slot, SLOT_STATUS)); /* w1c */ 917 918 dst_buf = v4l2_m2m_next_dst_buf(ctx->fh.m2m_ctx); 919 src_buf = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx); 920 if (!dst_buf || !src_buf) { 921 dev_err(dev, "No source or destination buffer.\n"); 922 goto job_unlock; 923 } 924 jpeg_src_buf = vb2_to_mxc_buf(&src_buf->vb2_buf); 925 926 if (dec_ret & SLOT_STATUS_ENC_CONFIG_ERR) { 927 u32 ret = readl(reg + CAST_STATUS12); 928 929 dev_err(dev, "Encoder/decoder error, dec_ret = 0x%08x, status=0x%08x", 930 dec_ret, ret); 931 mxc_jpeg_clr_desc(reg, slot); 932 mxc_jpeg_sw_reset(reg); 933 buf_state = VB2_BUF_STATE_ERROR; 934 goto buffers_done; 935 } 936 937 if (!(dec_ret & SLOT_STATUS_FRMDONE)) 938 goto job_unlock; 939 940 if (jpeg->mode == MXC_JPEG_ENCODE && 941 ctx->enc_state == MXC_JPEG_ENC_CONF) { 942 q_data = mxc_jpeg_get_q_data(ctx, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE); 943 ctx->enc_state = MXC_JPEG_ENCODING; 944 dev_dbg(dev, "Encoder config finished. Start encoding...\n"); 945 mxc_jpeg_enc_set_quality(dev, reg, ctx->jpeg_quality); 946 mxc_jpeg_enc_mode_go(dev, reg, mxc_jpeg_is_extended_sequential(q_data->fmt)); 947 goto job_unlock; 948 } 949 if (jpeg->mode == MXC_JPEG_DECODE && jpeg_src_buf->dht_needed) { 950 jpeg_src_buf->dht_needed = false; 951 dev_dbg(dev, "Decoder DHT cfg finished. Start decoding...\n"); 952 goto job_unlock; 953 } 954 955 if (jpeg->mode == MXC_JPEG_ENCODE) { 956 payload = readl(reg + MXC_SLOT_OFFSET(slot, SLOT_BUF_PTR)); 957 vb2_set_plane_payload(&dst_buf->vb2_buf, 0, payload); 958 dev_dbg(dev, "Encoding finished, payload size: %ld\n", 959 payload); 960 } else { 961 q_data = mxc_jpeg_get_q_data(ctx, cap_type); 962 payload = mxc_jpeg_get_plane_size(q_data, 0); 963 vb2_set_plane_payload(&dst_buf->vb2_buf, 0, payload); 964 vb2_set_plane_payload(&dst_buf->vb2_buf, 1, 0); 965 if (q_data->fmt->mem_planes == 2) { 966 payload = mxc_jpeg_get_plane_size(q_data, 1); 967 vb2_set_plane_payload(&dst_buf->vb2_buf, 1, payload); 968 } 969 dev_dbg(dev, "Decoding finished, payload size: %ld + %ld\n", 970 vb2_get_plane_payload(&dst_buf->vb2_buf, 0), 971 vb2_get_plane_payload(&dst_buf->vb2_buf, 1)); 972 } 973 974 /* short preview of the results */ 975 dev_dbg(dev, "src_buf preview: "); 976 print_mxc_buf(jpeg, &src_buf->vb2_buf, 32); 977 dev_dbg(dev, "dst_buf preview: "); 978 print_mxc_buf(jpeg, &dst_buf->vb2_buf, 32); 979 buf_state = VB2_BUF_STATE_DONE; 980 981 buffers_done: 982 mxc_jpeg_job_finish(ctx, buf_state, false); 983 spin_unlock(&jpeg->hw_lock); 984 cancel_delayed_work(&ctx->task_timer); 985 v4l2_m2m_job_finish(jpeg->m2m_dev, ctx->fh.m2m_ctx); 986 return IRQ_HANDLED; 987 job_unlock: 988 spin_unlock(&jpeg->hw_lock); 989 return IRQ_HANDLED; 990 } 991 992 static int mxc_jpeg_fixup_sof(struct mxc_jpeg_sof *sof, 993 u32 fourcc, 994 u16 w, u16 h) 995 { 996 int sof_length; 997 const struct mxc_jpeg_fmt *fmt = mxc_jpeg_find_format(fourcc); 998 999 if (fmt) 1000 sof->precision = fmt->precision; 1001 else 1002 sof->precision = 8; /* TODO allow 8/12 bit precision*/ 1003 sof->height = h; 1004 _bswap16(&sof->height); 1005 sof->width = w; 1006 _bswap16(&sof->width); 1007 1008 switch (fourcc) { 1009 case V4L2_PIX_FMT_NV12: 1010 case V4L2_PIX_FMT_NV12M: 1011 case V4L2_PIX_FMT_P012: 1012 case V4L2_PIX_FMT_P012M: 1013 sof->components_no = 3; 1014 sof->comp[0].v = 0x2; 1015 sof->comp[0].h = 0x2; 1016 break; 1017 case V4L2_PIX_FMT_YUYV: 1018 case V4L2_PIX_FMT_Y212: 1019 sof->components_no = 3; 1020 sof->comp[0].v = 0x1; 1021 sof->comp[0].h = 0x2; 1022 break; 1023 case V4L2_PIX_FMT_YUV24: 1024 case V4L2_PIX_FMT_YUV48_12: 1025 case V4L2_PIX_FMT_BGR24: 1026 case V4L2_PIX_FMT_BGR48_12: 1027 default: 1028 sof->components_no = 3; 1029 break; 1030 case V4L2_PIX_FMT_ABGR32: 1031 case V4L2_PIX_FMT_ABGR64_12: 1032 sof->components_no = 4; 1033 break; 1034 case V4L2_PIX_FMT_GREY: 1035 case V4L2_PIX_FMT_Y012: 1036 sof->components_no = 1; 1037 break; 1038 } 1039 sof_length = 8 + 3 * sof->components_no; 1040 sof->length = sof_length; 1041 _bswap16(&sof->length); 1042 1043 return sof_length; /* not swaped */ 1044 } 1045 1046 static int mxc_jpeg_fixup_sos(struct mxc_jpeg_sos *sos, 1047 u32 fourcc) 1048 { 1049 int sos_length; 1050 u8 *sof_u8 = (u8 *)sos; 1051 1052 switch (fourcc) { 1053 case V4L2_PIX_FMT_NV12: 1054 case V4L2_PIX_FMT_NV12M: 1055 case V4L2_PIX_FMT_P012: 1056 case V4L2_PIX_FMT_P012M: 1057 sos->components_no = 3; 1058 break; 1059 case V4L2_PIX_FMT_YUYV: 1060 case V4L2_PIX_FMT_Y212: 1061 sos->components_no = 3; 1062 break; 1063 case V4L2_PIX_FMT_YUV24: 1064 case V4L2_PIX_FMT_YUV48_12: 1065 case V4L2_PIX_FMT_BGR24: 1066 case V4L2_PIX_FMT_BGR48_12: 1067 default: 1068 sos->components_no = 3; 1069 break; 1070 case V4L2_PIX_FMT_ABGR32: 1071 case V4L2_PIX_FMT_ABGR64_12: 1072 sos->components_no = 4; 1073 break; 1074 case V4L2_PIX_FMT_GREY: 1075 case V4L2_PIX_FMT_Y012: 1076 sos->components_no = 1; 1077 break; 1078 } 1079 sos_length = 6 + 2 * sos->components_no; 1080 sos->length = sos_length; 1081 _bswap16(&sos->length); 1082 1083 /* SOS ignorable bytes, not so ignorable after all */ 1084 sof_u8[sos_length - 1] = 0x0; 1085 sof_u8[sos_length - 2] = 0x3f; 1086 sof_u8[sos_length - 3] = 0x0; 1087 1088 return sos_length; /* not swaped */ 1089 } 1090 1091 static unsigned int mxc_jpeg_setup_cfg_stream(void *cfg_stream_vaddr, 1092 u32 fourcc, 1093 u16 w, u16 h) 1094 { 1095 /* 1096 * There is a hardware issue that first 128 bytes of configuration data 1097 * can't be loaded correctly. 1098 * To avoid this issue, we need to write the configuration from 1099 * an offset which should be no less than 0x80 (128 bytes). 1100 */ 1101 unsigned int offset = 0x80; 1102 u8 *cfg = (u8 *)cfg_stream_vaddr; 1103 struct mxc_jpeg_sof *sof; 1104 struct mxc_jpeg_sos *sos; 1105 const struct mxc_jpeg_fmt *fmt = mxc_jpeg_find_format(fourcc); 1106 1107 if (!fmt) 1108 return 0; 1109 1110 memcpy(cfg + offset, jpeg_soi, ARRAY_SIZE(jpeg_soi)); 1111 offset += ARRAY_SIZE(jpeg_soi); 1112 1113 if (fmt->is_rgb) { 1114 memcpy(cfg + offset, jpeg_app14, sizeof(jpeg_app14)); 1115 offset += sizeof(jpeg_app14); 1116 } else { 1117 memcpy(cfg + offset, jpeg_app0, sizeof(jpeg_app0)); 1118 offset += sizeof(jpeg_app0); 1119 } 1120 1121 if (mxc_jpeg_is_extended_sequential(fmt)) { 1122 memcpy(cfg + offset, jpeg_dqt_extseq, sizeof(jpeg_dqt_extseq)); 1123 offset += sizeof(jpeg_dqt_extseq); 1124 1125 memcpy(cfg + offset, jpeg_sof_extseq, sizeof(jpeg_sof_extseq)); 1126 } else { 1127 memcpy(cfg + offset, jpeg_dqt, sizeof(jpeg_dqt)); 1128 offset += sizeof(jpeg_dqt); 1129 1130 memcpy(cfg + offset, jpeg_sof_maximal, sizeof(jpeg_sof_maximal)); 1131 } 1132 offset += 2; /* skip marker ID */ 1133 sof = (struct mxc_jpeg_sof *)(cfg + offset); 1134 offset += mxc_jpeg_fixup_sof(sof, fourcc, w, h); 1135 1136 if (mxc_jpeg_is_extended_sequential(fmt)) { 1137 memcpy(cfg + offset, jpeg_dht_extseq, sizeof(jpeg_dht_extseq)); 1138 offset += sizeof(jpeg_dht_extseq); 1139 } else { 1140 memcpy(cfg + offset, jpeg_dht, sizeof(jpeg_dht)); 1141 offset += sizeof(jpeg_dht); 1142 } 1143 1144 memcpy(cfg + offset, jpeg_dri, sizeof(jpeg_dri)); 1145 offset += sizeof(jpeg_dri); 1146 1147 memcpy(cfg + offset, jpeg_sos_maximal, sizeof(jpeg_sos_maximal)); 1148 offset += 2; /* skip marker ID */ 1149 sos = (struct mxc_jpeg_sos *)(cfg + offset); 1150 offset += mxc_jpeg_fixup_sos(sos, fourcc); 1151 1152 memcpy(cfg + offset, jpeg_image_red, sizeof(jpeg_image_red)); 1153 offset += sizeof(jpeg_image_red); 1154 1155 memcpy(cfg + offset, jpeg_eoi, sizeof(jpeg_eoi)); 1156 offset += sizeof(jpeg_eoi); 1157 1158 return offset; 1159 } 1160 1161 static void mxc_jpeg_config_dec_desc(struct vb2_buffer *out_buf, 1162 struct mxc_jpeg_ctx *ctx, 1163 struct vb2_buffer *src_buf, 1164 struct vb2_buffer *dst_buf) 1165 { 1166 enum v4l2_buf_type cap_type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 1167 struct mxc_jpeg_q_data *q_data_cap; 1168 enum mxc_jpeg_image_format img_fmt; 1169 struct mxc_jpeg_dev *jpeg = ctx->mxc_jpeg; 1170 void __iomem *reg = jpeg->base_reg; 1171 unsigned int slot = ctx->slot; 1172 struct mxc_jpeg_desc *desc = jpeg->slot_data.desc; 1173 struct mxc_jpeg_desc *cfg_desc = jpeg->slot_data.cfg_desc; 1174 dma_addr_t desc_handle = jpeg->slot_data.desc_handle; 1175 dma_addr_t cfg_desc_handle = jpeg->slot_data.cfg_desc_handle; 1176 dma_addr_t cfg_stream_handle = jpeg->slot_data.cfg_stream_handle; 1177 unsigned int *cfg_size = &jpeg->slot_data.cfg_stream_size; 1178 void *cfg_stream_vaddr = jpeg->slot_data.cfg_stream_vaddr; 1179 struct mxc_jpeg_src_buf *jpeg_src_buf; 1180 1181 jpeg_src_buf = vb2_to_mxc_buf(src_buf); 1182 1183 /* setup the decoding descriptor */ 1184 desc->next_descpt_ptr = 0; /* end of chain */ 1185 q_data_cap = mxc_jpeg_get_q_data(ctx, cap_type); 1186 desc->imgsize = q_data_cap->w_adjusted << 16 | q_data_cap->h_adjusted; 1187 img_fmt = mxc_jpeg_fourcc_to_imgfmt(q_data_cap->fmt->fourcc); 1188 desc->stm_ctrl &= ~STM_CTRL_IMAGE_FORMAT(0xF); /* clear image format */ 1189 desc->stm_ctrl |= STM_CTRL_IMAGE_FORMAT(img_fmt); 1190 desc->stm_ctrl |= STM_CTRL_BITBUF_PTR_CLR(1); 1191 if (mxc_jpeg_is_extended_sequential(jpeg_src_buf->fmt)) 1192 desc->stm_ctrl |= STM_CTRL_PIXEL_PRECISION; 1193 else 1194 desc->stm_ctrl &= ~STM_CTRL_PIXEL_PRECISION; 1195 desc->line_pitch = q_data_cap->bytesperline[0]; 1196 mxc_jpeg_addrs(desc, dst_buf, src_buf, 0); 1197 mxc_jpeg_set_bufsize(desc, ALIGN(vb2_plane_size(src_buf, 0), 1024)); 1198 print_descriptor_info(jpeg->dev, desc); 1199 1200 if (!jpeg_src_buf->dht_needed) { 1201 /* validate the decoding descriptor */ 1202 mxc_jpeg_set_desc(desc_handle, reg, slot); 1203 return; 1204 } 1205 1206 /* 1207 * if a default huffman table is needed, use the config descriptor to 1208 * inject a DHT, by chaining it before the decoding descriptor 1209 */ 1210 *cfg_size = mxc_jpeg_setup_cfg_stream(cfg_stream_vaddr, 1211 V4L2_PIX_FMT_YUYV, 1212 MXC_JPEG_MIN_WIDTH, 1213 MXC_JPEG_MIN_HEIGHT); 1214 cfg_desc->next_descpt_ptr = desc_handle | MXC_NXT_DESCPT_EN; 1215 cfg_desc->buf_base0 = vb2_dma_contig_plane_dma_addr(dst_buf, 0); 1216 cfg_desc->buf_base1 = 0; 1217 cfg_desc->imgsize = MXC_JPEG_MIN_WIDTH << 16; 1218 cfg_desc->imgsize |= MXC_JPEG_MIN_HEIGHT; 1219 cfg_desc->line_pitch = MXC_JPEG_MIN_WIDTH * 2; 1220 cfg_desc->stm_ctrl = STM_CTRL_IMAGE_FORMAT(MXC_JPEG_YUV422); 1221 cfg_desc->stm_ctrl |= STM_CTRL_BITBUF_PTR_CLR(1); 1222 cfg_desc->stm_bufbase = cfg_stream_handle; 1223 cfg_desc->stm_bufsize = ALIGN(*cfg_size, 1024); 1224 print_descriptor_info(jpeg->dev, cfg_desc); 1225 1226 /* validate the configuration descriptor */ 1227 mxc_jpeg_set_desc(cfg_desc_handle, reg, slot); 1228 } 1229 1230 static void mxc_jpeg_config_enc_desc(struct vb2_buffer *out_buf, 1231 struct mxc_jpeg_ctx *ctx, 1232 struct vb2_buffer *src_buf, 1233 struct vb2_buffer *dst_buf) 1234 { 1235 struct mxc_jpeg_dev *jpeg = ctx->mxc_jpeg; 1236 void __iomem *reg = jpeg->base_reg; 1237 unsigned int slot = ctx->slot; 1238 struct mxc_jpeg_desc *desc = jpeg->slot_data.desc; 1239 struct mxc_jpeg_desc *cfg_desc = jpeg->slot_data.cfg_desc; 1240 dma_addr_t desc_handle = jpeg->slot_data.desc_handle; 1241 dma_addr_t cfg_desc_handle = jpeg->slot_data.cfg_desc_handle; 1242 void *cfg_stream_vaddr = jpeg->slot_data.cfg_stream_vaddr; 1243 struct mxc_jpeg_q_data *q_data; 1244 enum mxc_jpeg_image_format img_fmt; 1245 int w, h; 1246 1247 q_data = mxc_jpeg_get_q_data(ctx, src_buf->vb2_queue->type); 1248 1249 jpeg->slot_data.cfg_stream_size = 1250 mxc_jpeg_setup_cfg_stream(cfg_stream_vaddr, 1251 q_data->fmt->fourcc, 1252 q_data->crop.width, 1253 q_data->crop.height); 1254 1255 /* chain the config descriptor with the encoding descriptor */ 1256 cfg_desc->next_descpt_ptr = desc_handle | MXC_NXT_DESCPT_EN; 1257 1258 cfg_desc->buf_base0 = jpeg->slot_data.cfg_stream_handle; 1259 cfg_desc->buf_base1 = 0; 1260 cfg_desc->line_pitch = 0; 1261 cfg_desc->stm_bufbase = 0; /* no output expected */ 1262 cfg_desc->stm_bufsize = 0x0; 1263 cfg_desc->imgsize = 0; 1264 cfg_desc->stm_ctrl = STM_CTRL_CONFIG_MOD(1); 1265 cfg_desc->stm_ctrl |= STM_CTRL_BITBUF_PTR_CLR(1); 1266 1267 desc->next_descpt_ptr = 0; /* end of chain */ 1268 1269 /* use adjusted resolution for CAST IP job */ 1270 w = q_data->crop.width; 1271 h = q_data->crop.height; 1272 v4l_bound_align_image(&w, w, MXC_JPEG_MAX_WIDTH, q_data->fmt->h_align, 1273 &h, h, MXC_JPEG_MAX_HEIGHT, q_data->fmt->v_align, 0); 1274 mxc_jpeg_set_res(desc, w, h); 1275 mxc_jpeg_set_line_pitch(desc, q_data->bytesperline[0]); 1276 mxc_jpeg_set_bufsize(desc, ALIGN(vb2_plane_size(dst_buf, 0), 1024)); 1277 img_fmt = mxc_jpeg_fourcc_to_imgfmt(q_data->fmt->fourcc); 1278 if (img_fmt == MXC_JPEG_INVALID) 1279 dev_err(jpeg->dev, "No valid image format detected\n"); 1280 desc->stm_ctrl = STM_CTRL_CONFIG_MOD(0) | 1281 STM_CTRL_IMAGE_FORMAT(img_fmt); 1282 desc->stm_ctrl |= STM_CTRL_BITBUF_PTR_CLR(1); 1283 if (mxc_jpeg_is_extended_sequential(q_data->fmt)) 1284 desc->stm_ctrl |= STM_CTRL_PIXEL_PRECISION; 1285 else 1286 desc->stm_ctrl &= ~STM_CTRL_PIXEL_PRECISION; 1287 mxc_jpeg_addrs(desc, src_buf, dst_buf, 0); 1288 dev_dbg(jpeg->dev, "cfg_desc:\n"); 1289 print_descriptor_info(jpeg->dev, cfg_desc); 1290 dev_dbg(jpeg->dev, "enc desc:\n"); 1291 print_descriptor_info(jpeg->dev, desc); 1292 print_wrapper_info(jpeg->dev, reg); 1293 print_cast_status(jpeg->dev, reg, MXC_JPEG_ENCODE); 1294 1295 /* validate the configuration descriptor */ 1296 mxc_jpeg_set_desc(cfg_desc_handle, reg, slot); 1297 } 1298 1299 static const struct mxc_jpeg_fmt *mxc_jpeg_get_sibling_format(const struct mxc_jpeg_fmt *fmt) 1300 { 1301 int i; 1302 1303 for (i = 0; i < MXC_JPEG_NUM_FORMATS; i++) { 1304 if (mxc_formats[i].subsampling == fmt->subsampling && 1305 mxc_formats[i].nc == fmt->nc && 1306 mxc_formats[i].precision == fmt->precision && 1307 mxc_formats[i].is_rgb == fmt->is_rgb && 1308 mxc_formats[i].fourcc != fmt->fourcc) 1309 return &mxc_formats[i]; 1310 } 1311 1312 return NULL; 1313 } 1314 1315 static bool mxc_jpeg_compare_format(const struct mxc_jpeg_fmt *fmt1, 1316 const struct mxc_jpeg_fmt *fmt2) 1317 { 1318 if (fmt1 == fmt2) 1319 return true; 1320 if (mxc_jpeg_get_sibling_format(fmt1) == fmt2) 1321 return true; 1322 return false; 1323 } 1324 1325 static void mxc_jpeg_set_last_buffer(struct mxc_jpeg_ctx *ctx) 1326 { 1327 struct vb2_v4l2_buffer *next_dst_buf; 1328 1329 next_dst_buf = v4l2_m2m_dst_buf_remove(ctx->fh.m2m_ctx); 1330 if (!next_dst_buf) { 1331 ctx->fh.m2m_ctx->is_draining = true; 1332 ctx->fh.m2m_ctx->next_buf_last = true; 1333 return; 1334 } 1335 1336 v4l2_m2m_last_buffer_done(ctx->fh.m2m_ctx, next_dst_buf); 1337 } 1338 1339 static bool mxc_jpeg_source_change(struct mxc_jpeg_ctx *ctx, 1340 struct mxc_jpeg_src_buf *jpeg_src_buf) 1341 { 1342 struct device *dev = ctx->mxc_jpeg->dev; 1343 struct mxc_jpeg_q_data *q_data_cap; 1344 1345 if (!jpeg_src_buf->fmt) 1346 return false; 1347 1348 q_data_cap = mxc_jpeg_get_q_data(ctx, V4L2_BUF_TYPE_VIDEO_CAPTURE); 1349 if (mxc_jpeg_compare_format(q_data_cap->fmt, jpeg_src_buf->fmt)) 1350 jpeg_src_buf->fmt = q_data_cap->fmt; 1351 if (ctx->need_initial_source_change_evt || 1352 q_data_cap->fmt != jpeg_src_buf->fmt || 1353 q_data_cap->w != jpeg_src_buf->w || 1354 q_data_cap->h != jpeg_src_buf->h) { 1355 dev_dbg(dev, "Detected jpeg res=(%dx%d)->(%dx%d), pixfmt=%c%c%c%c\n", 1356 q_data_cap->w, q_data_cap->h, 1357 jpeg_src_buf->w, jpeg_src_buf->h, 1358 (jpeg_src_buf->fmt->fourcc & 0xff), 1359 (jpeg_src_buf->fmt->fourcc >> 8) & 0xff, 1360 (jpeg_src_buf->fmt->fourcc >> 16) & 0xff, 1361 (jpeg_src_buf->fmt->fourcc >> 24) & 0xff); 1362 1363 /* 1364 * set-up the capture queue with the pixelformat and resolution 1365 * detected from the jpeg output stream 1366 */ 1367 q_data_cap->w = jpeg_src_buf->w; 1368 q_data_cap->h = jpeg_src_buf->h; 1369 q_data_cap->fmt = jpeg_src_buf->fmt; 1370 q_data_cap->w_adjusted = q_data_cap->w; 1371 q_data_cap->h_adjusted = q_data_cap->h; 1372 q_data_cap->crop.left = 0; 1373 q_data_cap->crop.top = 0; 1374 q_data_cap->crop.width = jpeg_src_buf->w; 1375 q_data_cap->crop.height = jpeg_src_buf->h; 1376 q_data_cap->bytesperline[0] = 0; 1377 q_data_cap->bytesperline[1] = 0; 1378 1379 /* 1380 * align up the resolution for CAST IP, 1381 * but leave the buffer resolution unchanged 1382 */ 1383 v4l_bound_align_image(&q_data_cap->w_adjusted, 1384 q_data_cap->w_adjusted, /* adjust up */ 1385 MXC_JPEG_MAX_WIDTH, 1386 q_data_cap->fmt->h_align, 1387 &q_data_cap->h_adjusted, 1388 q_data_cap->h_adjusted, /* adjust up */ 1389 MXC_JPEG_MAX_HEIGHT, 1390 q_data_cap->fmt->v_align, 1391 0); 1392 1393 /* setup bytesperline/sizeimage for capture queue */ 1394 mxc_jpeg_bytesperline(q_data_cap, jpeg_src_buf->fmt->precision); 1395 mxc_jpeg_sizeimage(q_data_cap); 1396 notify_src_chg(ctx); 1397 ctx->source_change = 1; 1398 ctx->need_initial_source_change_evt = false; 1399 if (vb2_is_streaming(v4l2_m2m_get_dst_vq(ctx->fh.m2m_ctx))) 1400 mxc_jpeg_set_last_buffer(ctx); 1401 } 1402 1403 return ctx->source_change ? true : false; 1404 } 1405 1406 static int mxc_jpeg_job_ready(void *priv) 1407 { 1408 struct mxc_jpeg_ctx *ctx = priv; 1409 1410 return ctx->source_change ? 0 : 1; 1411 } 1412 1413 static void mxc_jpeg_device_run_timeout(struct work_struct *work) 1414 { 1415 struct delayed_work *dwork = to_delayed_work(work); 1416 struct mxc_jpeg_ctx *ctx = container_of(dwork, struct mxc_jpeg_ctx, task_timer); 1417 struct mxc_jpeg_dev *jpeg = ctx->mxc_jpeg; 1418 unsigned long flags; 1419 1420 spin_lock_irqsave(&ctx->mxc_jpeg->hw_lock, flags); 1421 if (ctx->mxc_jpeg->slot_data.used) { 1422 dev_warn(jpeg->dev, "%s timeout, cancel it\n", 1423 ctx->mxc_jpeg->mode == MXC_JPEG_DECODE ? "decode" : "encode"); 1424 mxc_jpeg_job_finish(ctx, VB2_BUF_STATE_ERROR, true); 1425 v4l2_m2m_job_finish(ctx->mxc_jpeg->m2m_dev, ctx->fh.m2m_ctx); 1426 } 1427 spin_unlock_irqrestore(&ctx->mxc_jpeg->hw_lock, flags); 1428 } 1429 1430 static void mxc_jpeg_device_run(void *priv) 1431 { 1432 struct mxc_jpeg_ctx *ctx = priv; 1433 struct mxc_jpeg_dev *jpeg = ctx->mxc_jpeg; 1434 void __iomem *reg = jpeg->base_reg; 1435 struct device *dev = jpeg->dev; 1436 struct vb2_v4l2_buffer *src_buf, *dst_buf; 1437 unsigned long flags; 1438 struct mxc_jpeg_q_data *q_data_cap, *q_data_out; 1439 struct mxc_jpeg_src_buf *jpeg_src_buf; 1440 1441 spin_lock_irqsave(&ctx->mxc_jpeg->hw_lock, flags); 1442 src_buf = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx); 1443 dst_buf = v4l2_m2m_next_dst_buf(ctx->fh.m2m_ctx); 1444 if (!src_buf || !dst_buf) { 1445 dev_err(dev, "Null src or dst buf\n"); 1446 goto end; 1447 } 1448 1449 q_data_cap = mxc_jpeg_get_q_data(ctx, V4L2_BUF_TYPE_VIDEO_CAPTURE); 1450 if (!q_data_cap) 1451 goto end; 1452 q_data_out = mxc_jpeg_get_q_data(ctx, V4L2_BUF_TYPE_VIDEO_OUTPUT); 1453 if (!q_data_out) 1454 goto end; 1455 src_buf->sequence = q_data_out->sequence++; 1456 dst_buf->sequence = q_data_cap->sequence++; 1457 1458 v4l2_m2m_buf_copy_metadata(src_buf, dst_buf, true); 1459 1460 jpeg_src_buf = vb2_to_mxc_buf(&src_buf->vb2_buf); 1461 if (q_data_cap->fmt->mem_planes != dst_buf->vb2_buf.num_planes) { 1462 dev_err(dev, "Capture format %s has %d planes, but capture buffer has %d planes\n", 1463 q_data_cap->fmt->name, q_data_cap->fmt->mem_planes, 1464 dst_buf->vb2_buf.num_planes); 1465 jpeg_src_buf->jpeg_parse_error = true; 1466 } 1467 if (jpeg_src_buf->jpeg_parse_error) { 1468 mxc_jpeg_check_and_set_last_buffer(ctx, src_buf, dst_buf); 1469 v4l2_m2m_src_buf_remove(ctx->fh.m2m_ctx); 1470 v4l2_m2m_dst_buf_remove(ctx->fh.m2m_ctx); 1471 v4l2_m2m_buf_done(src_buf, VB2_BUF_STATE_ERROR); 1472 v4l2_m2m_buf_done(dst_buf, VB2_BUF_STATE_ERROR); 1473 spin_unlock_irqrestore(&ctx->mxc_jpeg->hw_lock, flags); 1474 v4l2_m2m_job_finish(jpeg->m2m_dev, ctx->fh.m2m_ctx); 1475 1476 return; 1477 } 1478 if (ctx->mxc_jpeg->mode == MXC_JPEG_DECODE) { 1479 if (ctx->source_change || mxc_jpeg_source_change(ctx, jpeg_src_buf)) { 1480 spin_unlock_irqrestore(&ctx->mxc_jpeg->hw_lock, flags); 1481 v4l2_m2m_job_finish(jpeg->m2m_dev, ctx->fh.m2m_ctx); 1482 return; 1483 } 1484 } 1485 1486 mxc_jpeg_enable(reg); 1487 mxc_jpeg_set_l_endian(reg, 1); 1488 1489 ctx->slot = mxc_get_free_slot(&jpeg->slot_data); 1490 if (ctx->slot < 0) { 1491 dev_err(dev, "No more free slots\n"); 1492 goto end; 1493 } 1494 if (!mxc_jpeg_alloc_slot_data(jpeg)) { 1495 dev_err(dev, "Cannot allocate slot data\n"); 1496 goto end; 1497 } 1498 1499 mxc_jpeg_enable_slot(reg, ctx->slot); 1500 mxc_jpeg_enable_irq(reg, ctx->slot); 1501 1502 if (jpeg->mode == MXC_JPEG_ENCODE) { 1503 dev_dbg(dev, "Encoding on slot %d\n", ctx->slot); 1504 ctx->enc_state = MXC_JPEG_ENC_CONF; 1505 mxc_jpeg_config_enc_desc(&dst_buf->vb2_buf, ctx, 1506 &src_buf->vb2_buf, &dst_buf->vb2_buf); 1507 /* start config phase */ 1508 mxc_jpeg_enc_mode_conf(dev, reg, 1509 mxc_jpeg_is_extended_sequential(q_data_out->fmt)); 1510 } else { 1511 dev_dbg(dev, "Decoding on slot %d\n", ctx->slot); 1512 print_mxc_buf(jpeg, &src_buf->vb2_buf, 0); 1513 mxc_jpeg_config_dec_desc(&dst_buf->vb2_buf, ctx, 1514 &src_buf->vb2_buf, &dst_buf->vb2_buf); 1515 mxc_jpeg_dec_mode_go(dev, reg); 1516 } 1517 schedule_delayed_work(&ctx->task_timer, msecs_to_jiffies(hw_timeout)); 1518 end: 1519 spin_unlock_irqrestore(&ctx->mxc_jpeg->hw_lock, flags); 1520 } 1521 1522 static int mxc_jpeg_decoder_cmd(struct file *file, void *priv, 1523 struct v4l2_decoder_cmd *cmd) 1524 { 1525 struct v4l2_fh *fh = file->private_data; 1526 struct mxc_jpeg_ctx *ctx = mxc_jpeg_fh_to_ctx(fh); 1527 unsigned long flags; 1528 int ret; 1529 1530 ret = v4l2_m2m_ioctl_try_decoder_cmd(file, fh, cmd); 1531 if (ret < 0) 1532 return ret; 1533 1534 if (!vb2_is_streaming(v4l2_m2m_get_src_vq(fh->m2m_ctx))) 1535 return 0; 1536 1537 spin_lock_irqsave(&ctx->mxc_jpeg->hw_lock, flags); 1538 ret = v4l2_m2m_ioctl_decoder_cmd(file, priv, cmd); 1539 spin_unlock_irqrestore(&ctx->mxc_jpeg->hw_lock, flags); 1540 if (ret < 0) 1541 return ret; 1542 1543 if (cmd->cmd == V4L2_DEC_CMD_STOP && 1544 v4l2_m2m_has_stopped(fh->m2m_ctx)) { 1545 notify_eos(ctx); 1546 ctx->header_parsed = false; 1547 } 1548 1549 if (cmd->cmd == V4L2_DEC_CMD_START && 1550 v4l2_m2m_has_stopped(fh->m2m_ctx)) 1551 vb2_clear_last_buffer_dequeued(&fh->m2m_ctx->cap_q_ctx.q); 1552 return 0; 1553 } 1554 1555 static int mxc_jpeg_encoder_cmd(struct file *file, void *priv, 1556 struct v4l2_encoder_cmd *cmd) 1557 { 1558 struct v4l2_fh *fh = file->private_data; 1559 struct mxc_jpeg_ctx *ctx = mxc_jpeg_fh_to_ctx(fh); 1560 unsigned long flags; 1561 int ret; 1562 1563 ret = v4l2_m2m_ioctl_try_encoder_cmd(file, fh, cmd); 1564 if (ret < 0) 1565 return ret; 1566 1567 if (!vb2_is_streaming(v4l2_m2m_get_src_vq(fh->m2m_ctx)) || 1568 !vb2_is_streaming(v4l2_m2m_get_dst_vq(fh->m2m_ctx))) 1569 return 0; 1570 1571 spin_lock_irqsave(&ctx->mxc_jpeg->hw_lock, flags); 1572 ret = v4l2_m2m_ioctl_encoder_cmd(file, fh, cmd); 1573 spin_unlock_irqrestore(&ctx->mxc_jpeg->hw_lock, flags); 1574 if (ret < 0) 1575 return 0; 1576 1577 if (cmd->cmd == V4L2_ENC_CMD_STOP && 1578 v4l2_m2m_has_stopped(fh->m2m_ctx)) 1579 notify_eos(ctx); 1580 1581 if (cmd->cmd == V4L2_ENC_CMD_START && 1582 v4l2_m2m_has_stopped(fh->m2m_ctx)) 1583 vb2_clear_last_buffer_dequeued(&fh->m2m_ctx->cap_q_ctx.q); 1584 1585 return 0; 1586 } 1587 1588 static int mxc_jpeg_queue_setup(struct vb2_queue *q, 1589 unsigned int *nbuffers, 1590 unsigned int *nplanes, 1591 unsigned int sizes[], 1592 struct device *alloc_ctxs[]) 1593 { 1594 struct mxc_jpeg_ctx *ctx = vb2_get_drv_priv(q); 1595 struct mxc_jpeg_q_data *q_data = NULL; 1596 int i; 1597 1598 q_data = mxc_jpeg_get_q_data(ctx, q->type); 1599 if (!q_data) 1600 return -EINVAL; 1601 1602 /* Handle CREATE_BUFS situation - *nplanes != 0 */ 1603 if (*nplanes) { 1604 if (*nplanes != q_data->fmt->mem_planes) 1605 return -EINVAL; 1606 for (i = 0; i < *nplanes; i++) { 1607 if (sizes[i] < mxc_jpeg_get_plane_size(q_data, i)) 1608 return -EINVAL; 1609 } 1610 return 0; 1611 } 1612 1613 /* Handle REQBUFS situation */ 1614 *nplanes = q_data->fmt->mem_planes; 1615 for (i = 0; i < *nplanes; i++) 1616 sizes[i] = mxc_jpeg_get_plane_size(q_data, i); 1617 1618 if (V4L2_TYPE_IS_OUTPUT(q->type)) 1619 ctx->need_initial_source_change_evt = true; 1620 1621 return 0; 1622 } 1623 1624 static int mxc_jpeg_start_streaming(struct vb2_queue *q, unsigned int count) 1625 { 1626 struct mxc_jpeg_ctx *ctx = vb2_get_drv_priv(q); 1627 struct mxc_jpeg_q_data *q_data = mxc_jpeg_get_q_data(ctx, q->type); 1628 int ret; 1629 1630 v4l2_m2m_update_start_streaming_state(ctx->fh.m2m_ctx, q); 1631 1632 if (ctx->mxc_jpeg->mode == MXC_JPEG_DECODE && V4L2_TYPE_IS_CAPTURE(q->type)) 1633 ctx->source_change = 0; 1634 dev_dbg(ctx->mxc_jpeg->dev, "Start streaming ctx=%p", ctx); 1635 q_data->sequence = 0; 1636 1637 if (V4L2_TYPE_IS_CAPTURE(q->type)) 1638 ctx->need_initial_source_change_evt = false; 1639 1640 ret = pm_runtime_resume_and_get(ctx->mxc_jpeg->dev); 1641 if (ret < 0) { 1642 dev_err(ctx->mxc_jpeg->dev, "Failed to power up jpeg\n"); 1643 return ret; 1644 } 1645 1646 return 0; 1647 } 1648 1649 static void mxc_jpeg_stop_streaming(struct vb2_queue *q) 1650 { 1651 struct mxc_jpeg_ctx *ctx = vb2_get_drv_priv(q); 1652 struct vb2_v4l2_buffer *vbuf; 1653 1654 dev_dbg(ctx->mxc_jpeg->dev, "Stop streaming ctx=%p", ctx); 1655 1656 /* Release all active buffers */ 1657 for (;;) { 1658 if (V4L2_TYPE_IS_OUTPUT(q->type)) 1659 vbuf = v4l2_m2m_src_buf_remove(ctx->fh.m2m_ctx); 1660 else 1661 vbuf = v4l2_m2m_dst_buf_remove(ctx->fh.m2m_ctx); 1662 if (!vbuf) 1663 break; 1664 v4l2_m2m_buf_done(vbuf, VB2_BUF_STATE_ERROR); 1665 } 1666 1667 v4l2_m2m_update_stop_streaming_state(ctx->fh.m2m_ctx, q); 1668 /* if V4L2_DEC_CMD_STOP is sent before the source change triggered, 1669 * restore the is_draining flag 1670 */ 1671 if (V4L2_TYPE_IS_CAPTURE(q->type) && ctx->source_change && ctx->fh.m2m_ctx->last_src_buf) 1672 ctx->fh.m2m_ctx->is_draining = true; 1673 1674 if (V4L2_TYPE_IS_OUTPUT(q->type) && 1675 v4l2_m2m_has_stopped(ctx->fh.m2m_ctx)) { 1676 notify_eos(ctx); 1677 ctx->header_parsed = false; 1678 } 1679 1680 pm_runtime_put_sync(&ctx->mxc_jpeg->pdev->dev); 1681 } 1682 1683 static int mxc_jpeg_valid_comp_id(struct device *dev, 1684 struct mxc_jpeg_sof *sof, 1685 struct mxc_jpeg_sos *sos) 1686 { 1687 int valid = 1; 1688 int i; 1689 1690 /* 1691 * there's a limitation in the IP that the component IDs must be 1692 * between 0..4, if they are not, let's patch them 1693 */ 1694 for (i = 0; i < sof->components_no; i++) 1695 if (sof->comp[i].id > MXC_JPEG_MAX_COMPONENTS) { 1696 valid = 0; 1697 dev_err(dev, "Component %d has invalid ID: %d", 1698 i, sof->comp[i].id); 1699 } 1700 if (!valid) 1701 /* patch all comp IDs if at least one is invalid */ 1702 for (i = 0; i < sof->components_no; i++) { 1703 dev_warn(dev, "Component %d ID patched to: %d", 1704 i, i + 1); 1705 sof->comp[i].id = i + 1; 1706 sos->comp[i].id = i + 1; 1707 } 1708 1709 return valid; 1710 } 1711 1712 static bool mxc_jpeg_match_image_format(const struct mxc_jpeg_fmt *fmt, 1713 const struct v4l2_jpeg_header *header) 1714 { 1715 if (fmt->subsampling != header->frame.subsampling || 1716 fmt->nc != header->frame.num_components || 1717 fmt->precision != header->frame.precision) 1718 return false; 1719 1720 /* 1721 * If the transform flag from APP14 marker is 0, images that are 1722 * encoded with 3 components have RGB colorspace, see Recommendation 1723 * ITU-T T.872 chapter 6.5.3 APP14 marker segment for colour encoding 1724 */ 1725 if (header->frame.subsampling == V4L2_JPEG_CHROMA_SUBSAMPLING_444) { 1726 u8 is_rgb = header->app14_tf == V4L2_JPEG_APP14_TF_CMYK_RGB ? 1 : 0; 1727 1728 if (is_rgb != fmt->is_rgb) 1729 return false; 1730 } 1731 return true; 1732 } 1733 1734 static u32 mxc_jpeg_get_image_format(struct device *dev, 1735 const struct v4l2_jpeg_header *header) 1736 { 1737 int i; 1738 u32 fourcc = 0; 1739 1740 for (i = 0; i < MXC_JPEG_NUM_FORMATS; i++) { 1741 if (mxc_jpeg_match_image_format(&mxc_formats[i], header)) { 1742 fourcc = mxc_formats[i].fourcc; 1743 break; 1744 } 1745 } 1746 if (fourcc == 0) { 1747 dev_err(dev, 1748 "Could not identify image format nc=%d, subsampling=%d, precision=%d\n", 1749 header->frame.num_components, 1750 header->frame.subsampling, 1751 header->frame.precision); 1752 return fourcc; 1753 } 1754 1755 return fourcc; 1756 } 1757 1758 static void mxc_jpeg_bytesperline(struct mxc_jpeg_q_data *q, u32 precision) 1759 { 1760 u32 bytesperline[2]; 1761 1762 bytesperline[0] = q->bytesperline[0]; 1763 bytesperline[1] = q->bytesperline[0]; /*imx-jpeg only support the same line pitch*/ 1764 v4l_bound_align_image(&bytesperline[0], 0, MXC_JPEG_MAX_LINE, 2, 1765 &bytesperline[1], 0, MXC_JPEG_MAX_LINE, 2, 1766 0); 1767 1768 /* Bytes distance between the leftmost pixels in two adjacent lines */ 1769 if (q->fmt->fourcc == V4L2_PIX_FMT_JPEG) { 1770 /* bytesperline unused for compressed formats */ 1771 q->bytesperline[0] = 0; 1772 q->bytesperline[1] = 0; 1773 } else if (q->fmt->subsampling == V4L2_JPEG_CHROMA_SUBSAMPLING_420) { 1774 /* When the image format is planar the bytesperline value 1775 * applies to the first plane and is divided by the same factor 1776 * as the width field for the other planes 1777 */ 1778 q->bytesperline[0] = q->w_adjusted * DIV_ROUND_UP(precision, 8); 1779 q->bytesperline[1] = q->bytesperline[0]; 1780 } else if (q->fmt->subsampling == V4L2_JPEG_CHROMA_SUBSAMPLING_422) { 1781 q->bytesperline[0] = q->w_adjusted * DIV_ROUND_UP(precision, 8) * 2; 1782 q->bytesperline[1] = 0; 1783 } else if (q->fmt->subsampling == V4L2_JPEG_CHROMA_SUBSAMPLING_444) { 1784 q->bytesperline[0] = q->w_adjusted * DIV_ROUND_UP(precision, 8) * q->fmt->nc; 1785 q->bytesperline[1] = 0; 1786 } else { 1787 /* grayscale */ 1788 q->bytesperline[0] = q->w_adjusted * DIV_ROUND_UP(precision, 8); 1789 q->bytesperline[1] = 0; 1790 } 1791 1792 if (q->fmt->fourcc != V4L2_PIX_FMT_JPEG) { 1793 q->bytesperline[0] = max(q->bytesperline[0], bytesperline[0]); 1794 if (q->fmt->mem_planes > 1) 1795 q->bytesperline[1] = max(q->bytesperline[1], bytesperline[1]); 1796 } 1797 } 1798 1799 static void mxc_jpeg_sizeimage(struct mxc_jpeg_q_data *q) 1800 { 1801 if (q->fmt->fourcc == V4L2_PIX_FMT_JPEG) { 1802 /* if no sizeimage from user, assume worst jpeg compression */ 1803 if (!q->sizeimage[0]) 1804 q->sizeimage[0] = 6 * q->w * q->h; 1805 q->sizeimage[1] = 0; 1806 1807 if (q->sizeimage[0] > MXC_JPEG_MAX_SIZEIMAGE) 1808 q->sizeimage[0] = MXC_JPEG_MAX_SIZEIMAGE; 1809 1810 /* jpeg stream size must be multiple of 1K */ 1811 q->sizeimage[0] = ALIGN(q->sizeimage[0], 1024); 1812 } else { 1813 q->sizeimage[0] = q->bytesperline[0] * q->h_adjusted; 1814 q->sizeimage[1] = 0; 1815 if (q->fmt->subsampling == V4L2_JPEG_CHROMA_SUBSAMPLING_420) 1816 q->sizeimage[1] = q->sizeimage[0] / 2; 1817 } 1818 } 1819 1820 static int mxc_jpeg_parse(struct mxc_jpeg_ctx *ctx, struct vb2_buffer *vb) 1821 { 1822 struct device *dev = ctx->mxc_jpeg->dev; 1823 struct mxc_jpeg_q_data *q_data_out; 1824 struct mxc_jpeg_q_data *q_data_cap; 1825 u32 fourcc; 1826 struct v4l2_jpeg_header header; 1827 struct mxc_jpeg_sof *psof = NULL; 1828 struct mxc_jpeg_sos *psos = NULL; 1829 struct mxc_jpeg_src_buf *jpeg_src_buf = vb2_to_mxc_buf(vb); 1830 u8 *src_addr = (u8 *)vb2_plane_vaddr(vb, 0); 1831 u32 size = vb2_get_plane_payload(vb, 0); 1832 int ret; 1833 1834 memset(&header, 0, sizeof(header)); 1835 ret = v4l2_jpeg_parse_header((void *)src_addr, size, &header); 1836 if (ret < 0) { 1837 dev_err(dev, "Error parsing JPEG stream markers\n"); 1838 return ret; 1839 } 1840 1841 /* if DHT marker present, no need to inject default one */ 1842 jpeg_src_buf->dht_needed = (header.num_dht == 0); 1843 1844 q_data_out = mxc_jpeg_get_q_data(ctx, 1845 V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE); 1846 q_data_out->w = header.frame.width; 1847 q_data_out->h = header.frame.height; 1848 if (header.frame.width > MXC_JPEG_MAX_WIDTH || 1849 header.frame.height > MXC_JPEG_MAX_HEIGHT) { 1850 dev_err(dev, "JPEG width or height should be <= 8192: %dx%d\n", 1851 header.frame.width, header.frame.height); 1852 return -EINVAL; 1853 } 1854 if (header.frame.width < MXC_JPEG_MIN_WIDTH || 1855 header.frame.height < MXC_JPEG_MIN_HEIGHT) { 1856 dev_err(dev, "JPEG width or height should be > 64: %dx%d\n", 1857 header.frame.width, header.frame.height); 1858 return -EINVAL; 1859 } 1860 if (header.frame.num_components > V4L2_JPEG_MAX_COMPONENTS) { 1861 dev_err(dev, "JPEG number of components should be <=%d", 1862 V4L2_JPEG_MAX_COMPONENTS); 1863 return -EINVAL; 1864 } 1865 /* check and, if necessary, patch component IDs*/ 1866 psof = (struct mxc_jpeg_sof *)header.sof.start; 1867 psos = (struct mxc_jpeg_sos *)header.sos.start; 1868 if (!mxc_jpeg_valid_comp_id(dev, psof, psos)) 1869 dev_warn(dev, "JPEG component ids should be 0-3 or 1-4"); 1870 1871 q_data_cap = mxc_jpeg_get_q_data(ctx, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE); 1872 if (q_data_cap->fmt && mxc_jpeg_match_image_format(q_data_cap->fmt, &header)) 1873 fourcc = q_data_cap->fmt->fourcc; 1874 else 1875 fourcc = mxc_jpeg_get_image_format(dev, &header); 1876 if (fourcc == 0) 1877 return -EINVAL; 1878 1879 jpeg_src_buf->fmt = mxc_jpeg_find_format(fourcc); 1880 jpeg_src_buf->w = header.frame.width; 1881 jpeg_src_buf->h = header.frame.height; 1882 ctx->header_parsed = true; 1883 1884 if (!v4l2_m2m_num_src_bufs_ready(ctx->fh.m2m_ctx)) 1885 mxc_jpeg_source_change(ctx, jpeg_src_buf); 1886 1887 return 0; 1888 } 1889 1890 static void mxc_jpeg_buf_queue(struct vb2_buffer *vb) 1891 { 1892 int ret; 1893 struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb); 1894 struct mxc_jpeg_ctx *ctx = vb2_get_drv_priv(vb->vb2_queue); 1895 struct mxc_jpeg_src_buf *jpeg_src_buf; 1896 1897 if (V4L2_TYPE_IS_CAPTURE(vb->vb2_queue->type) && 1898 vb2_is_streaming(vb->vb2_queue) && 1899 v4l2_m2m_dst_buf_is_last(ctx->fh.m2m_ctx)) { 1900 struct mxc_jpeg_q_data *q_data; 1901 1902 q_data = mxc_jpeg_get_q_data(ctx, vb->vb2_queue->type); 1903 vbuf->field = V4L2_FIELD_NONE; 1904 vbuf->sequence = q_data->sequence++; 1905 v4l2_m2m_last_buffer_done(ctx->fh.m2m_ctx, vbuf); 1906 notify_eos(ctx); 1907 ctx->header_parsed = false; 1908 return; 1909 } 1910 1911 if (vb->vb2_queue->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) 1912 goto end; 1913 1914 /* for V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE */ 1915 if (ctx->mxc_jpeg->mode != MXC_JPEG_DECODE) 1916 goto end; 1917 1918 jpeg_src_buf = vb2_to_mxc_buf(vb); 1919 jpeg_src_buf->jpeg_parse_error = false; 1920 ret = mxc_jpeg_parse(ctx, vb); 1921 if (ret) 1922 jpeg_src_buf->jpeg_parse_error = true; 1923 1924 end: 1925 v4l2_m2m_buf_queue(ctx->fh.m2m_ctx, vbuf); 1926 } 1927 1928 static int mxc_jpeg_buf_out_validate(struct vb2_buffer *vb) 1929 { 1930 struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb); 1931 1932 vbuf->field = V4L2_FIELD_NONE; 1933 1934 return 0; 1935 } 1936 1937 static int mxc_jpeg_buf_prepare(struct vb2_buffer *vb) 1938 { 1939 struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb); 1940 struct mxc_jpeg_ctx *ctx = vb2_get_drv_priv(vb->vb2_queue); 1941 struct mxc_jpeg_q_data *q_data = NULL; 1942 struct device *dev = ctx->mxc_jpeg->dev; 1943 unsigned long sizeimage; 1944 int i; 1945 1946 vbuf->field = V4L2_FIELD_NONE; 1947 1948 q_data = mxc_jpeg_get_q_data(ctx, vb->vb2_queue->type); 1949 if (!q_data) 1950 return -EINVAL; 1951 for (i = 0; i < q_data->fmt->mem_planes; i++) { 1952 sizeimage = mxc_jpeg_get_plane_size(q_data, i); 1953 if (!ctx->source_change && vb2_plane_size(vb, i) < sizeimage) { 1954 dev_err(dev, "plane %d too small (%lu < %lu)", 1955 i, vb2_plane_size(vb, i), sizeimage); 1956 return -EINVAL; 1957 } 1958 } 1959 if (V4L2_TYPE_IS_CAPTURE(vb->vb2_queue->type)) { 1960 vb2_set_plane_payload(vb, 0, 0); 1961 vb2_set_plane_payload(vb, 1, 0); 1962 } 1963 return 0; 1964 } 1965 1966 static const struct vb2_ops mxc_jpeg_qops = { 1967 .queue_setup = mxc_jpeg_queue_setup, 1968 .buf_out_validate = mxc_jpeg_buf_out_validate, 1969 .buf_prepare = mxc_jpeg_buf_prepare, 1970 .start_streaming = mxc_jpeg_start_streaming, 1971 .stop_streaming = mxc_jpeg_stop_streaming, 1972 .buf_queue = mxc_jpeg_buf_queue, 1973 }; 1974 1975 static int mxc_jpeg_queue_init(void *priv, struct vb2_queue *src_vq, 1976 struct vb2_queue *dst_vq) 1977 { 1978 struct mxc_jpeg_ctx *ctx = priv; 1979 int ret; 1980 1981 src_vq->type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 1982 src_vq->io_modes = VB2_MMAP | VB2_DMABUF; 1983 src_vq->drv_priv = ctx; 1984 src_vq->buf_struct_size = sizeof(struct mxc_jpeg_src_buf); 1985 src_vq->ops = &mxc_jpeg_qops; 1986 src_vq->mem_ops = &vb2_dma_contig_memops; 1987 src_vq->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_COPY; 1988 src_vq->lock = &ctx->mxc_jpeg->lock; 1989 src_vq->dev = ctx->mxc_jpeg->dev; 1990 1991 ret = vb2_queue_init(src_vq); 1992 if (ret) 1993 return ret; 1994 1995 dst_vq->type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 1996 dst_vq->io_modes = VB2_MMAP | VB2_DMABUF; 1997 dst_vq->drv_priv = ctx; 1998 dst_vq->buf_struct_size = sizeof(struct v4l2_m2m_buffer); 1999 dst_vq->ops = &mxc_jpeg_qops; 2000 dst_vq->mem_ops = &vb2_dma_contig_memops; 2001 dst_vq->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_COPY; 2002 dst_vq->lock = &ctx->mxc_jpeg->lock; 2003 dst_vq->dev = ctx->mxc_jpeg->dev; 2004 2005 ret = vb2_queue_init(dst_vq); 2006 return ret; 2007 } 2008 2009 static void mxc_jpeg_set_default_params(struct mxc_jpeg_ctx *ctx) 2010 { 2011 struct mxc_jpeg_q_data *out_q = &ctx->out_q; 2012 struct mxc_jpeg_q_data *cap_q = &ctx->cap_q; 2013 struct mxc_jpeg_q_data *q[2] = {out_q, cap_q}; 2014 int i; 2015 2016 if (ctx->mxc_jpeg->mode == MXC_JPEG_ENCODE) { 2017 out_q->fmt = mxc_jpeg_find_format(MXC_JPEG_DEFAULT_PFMT); 2018 cap_q->fmt = mxc_jpeg_find_format(V4L2_PIX_FMT_JPEG); 2019 } else { 2020 out_q->fmt = mxc_jpeg_find_format(V4L2_PIX_FMT_JPEG); 2021 cap_q->fmt = mxc_jpeg_find_format(MXC_JPEG_DEFAULT_PFMT); 2022 } 2023 2024 for (i = 0; i < 2; i++) { 2025 q[i]->w = MXC_JPEG_DEFAULT_WIDTH; 2026 q[i]->h = MXC_JPEG_DEFAULT_HEIGHT; 2027 q[i]->w_adjusted = MXC_JPEG_DEFAULT_WIDTH; 2028 q[i]->h_adjusted = MXC_JPEG_DEFAULT_HEIGHT; 2029 q[i]->crop.left = 0; 2030 q[i]->crop.top = 0; 2031 q[i]->crop.width = MXC_JPEG_DEFAULT_WIDTH; 2032 q[i]->crop.height = MXC_JPEG_DEFAULT_HEIGHT; 2033 mxc_jpeg_bytesperline(q[i], q[i]->fmt->precision); 2034 mxc_jpeg_sizeimage(q[i]); 2035 } 2036 } 2037 2038 static int mxc_jpeg_s_ctrl(struct v4l2_ctrl *ctrl) 2039 { 2040 struct mxc_jpeg_ctx *ctx = 2041 container_of(ctrl->handler, struct mxc_jpeg_ctx, ctrl_handler); 2042 2043 switch (ctrl->id) { 2044 case V4L2_CID_JPEG_COMPRESSION_QUALITY: 2045 ctx->jpeg_quality = ctrl->val; 2046 break; 2047 default: 2048 dev_err(ctx->mxc_jpeg->dev, "Invalid control, id = %d, val = %d\n", 2049 ctrl->id, ctrl->val); 2050 return -EINVAL; 2051 } 2052 2053 return 0; 2054 } 2055 2056 static const struct v4l2_ctrl_ops mxc_jpeg_ctrl_ops = { 2057 .s_ctrl = mxc_jpeg_s_ctrl, 2058 }; 2059 2060 static void mxc_jpeg_encode_ctrls(struct mxc_jpeg_ctx *ctx) 2061 { 2062 v4l2_ctrl_new_std(&ctx->ctrl_handler, &mxc_jpeg_ctrl_ops, 2063 V4L2_CID_JPEG_COMPRESSION_QUALITY, 1, 100, 1, 75); 2064 } 2065 2066 static int mxc_jpeg_ctrls_setup(struct mxc_jpeg_ctx *ctx) 2067 { 2068 int err; 2069 2070 v4l2_ctrl_handler_init(&ctx->ctrl_handler, 2); 2071 2072 if (ctx->mxc_jpeg->mode == MXC_JPEG_ENCODE) 2073 mxc_jpeg_encode_ctrls(ctx); 2074 2075 if (ctx->ctrl_handler.error) { 2076 err = ctx->ctrl_handler.error; 2077 2078 v4l2_ctrl_handler_free(&ctx->ctrl_handler); 2079 return err; 2080 } 2081 2082 err = v4l2_ctrl_handler_setup(&ctx->ctrl_handler); 2083 if (err) 2084 v4l2_ctrl_handler_free(&ctx->ctrl_handler); 2085 return err; 2086 } 2087 2088 static int mxc_jpeg_open(struct file *file) 2089 { 2090 struct mxc_jpeg_dev *mxc_jpeg = video_drvdata(file); 2091 struct video_device *mxc_vfd = video_devdata(file); 2092 struct device *dev = mxc_jpeg->dev; 2093 struct mxc_jpeg_ctx *ctx; 2094 int ret = 0; 2095 2096 ctx = kzalloc(sizeof(*ctx), GFP_KERNEL); 2097 if (!ctx) 2098 return -ENOMEM; 2099 2100 if (mutex_lock_interruptible(&mxc_jpeg->lock)) { 2101 ret = -ERESTARTSYS; 2102 goto free; 2103 } 2104 2105 v4l2_fh_init(&ctx->fh, mxc_vfd); 2106 file->private_data = &ctx->fh; 2107 v4l2_fh_add(&ctx->fh); 2108 2109 ctx->mxc_jpeg = mxc_jpeg; 2110 2111 ctx->fh.m2m_ctx = v4l2_m2m_ctx_init(mxc_jpeg->m2m_dev, ctx, 2112 mxc_jpeg_queue_init); 2113 2114 if (IS_ERR(ctx->fh.m2m_ctx)) { 2115 ret = PTR_ERR(ctx->fh.m2m_ctx); 2116 goto error; 2117 } 2118 2119 ret = mxc_jpeg_ctrls_setup(ctx); 2120 if (ret) { 2121 dev_err(ctx->mxc_jpeg->dev, "failed to setup mxc jpeg controls\n"); 2122 goto err_ctrls_setup; 2123 } 2124 ctx->fh.ctrl_handler = &ctx->ctrl_handler; 2125 mxc_jpeg_set_default_params(ctx); 2126 ctx->slot = -1; /* slot not allocated yet */ 2127 INIT_DELAYED_WORK(&ctx->task_timer, mxc_jpeg_device_run_timeout); 2128 2129 if (mxc_jpeg->mode == MXC_JPEG_DECODE) 2130 dev_dbg(dev, "Opened JPEG decoder instance %p\n", ctx); 2131 else 2132 dev_dbg(dev, "Opened JPEG encoder instance %p\n", ctx); 2133 mutex_unlock(&mxc_jpeg->lock); 2134 2135 return 0; 2136 2137 err_ctrls_setup: 2138 v4l2_m2m_ctx_release(ctx->fh.m2m_ctx); 2139 error: 2140 v4l2_fh_del(&ctx->fh); 2141 v4l2_fh_exit(&ctx->fh); 2142 mutex_unlock(&mxc_jpeg->lock); 2143 free: 2144 kfree(ctx); 2145 return ret; 2146 } 2147 2148 static int mxc_jpeg_querycap(struct file *file, void *priv, 2149 struct v4l2_capability *cap) 2150 { 2151 strscpy(cap->driver, MXC_JPEG_NAME " codec", sizeof(cap->driver)); 2152 strscpy(cap->card, MXC_JPEG_NAME " codec", sizeof(cap->card)); 2153 cap->device_caps = V4L2_CAP_STREAMING | V4L2_CAP_VIDEO_M2M_MPLANE; 2154 cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS; 2155 2156 return 0; 2157 } 2158 2159 static int mxc_jpeg_enum_fmt_vid_cap(struct file *file, void *priv, 2160 struct v4l2_fmtdesc *f) 2161 { 2162 struct mxc_jpeg_ctx *ctx = mxc_jpeg_fh_to_ctx(priv); 2163 struct mxc_jpeg_q_data *q_data = mxc_jpeg_get_q_data(ctx, f->type); 2164 2165 if (ctx->mxc_jpeg->mode == MXC_JPEG_ENCODE) { 2166 return enum_fmt(mxc_formats, MXC_JPEG_NUM_FORMATS, f, 2167 MXC_JPEG_FMT_TYPE_ENC); 2168 } else if (!ctx->header_parsed) { 2169 return enum_fmt(mxc_formats, MXC_JPEG_NUM_FORMATS, f, 2170 MXC_JPEG_FMT_TYPE_RAW); 2171 } else { 2172 /* For the decoder CAPTURE queue, only enumerate the raw formats 2173 * supported for the format currently active on OUTPUT 2174 * (more precisely what was propagated on capture queue 2175 * after jpeg parse on the output buffer) 2176 */ 2177 int ret = -EINVAL; 2178 const struct mxc_jpeg_fmt *sibling; 2179 2180 switch (f->index) { 2181 case 0: 2182 f->pixelformat = q_data->fmt->fourcc; 2183 ret = 0; 2184 break; 2185 case 1: 2186 sibling = mxc_jpeg_get_sibling_format(q_data->fmt); 2187 if (sibling) { 2188 f->pixelformat = sibling->fourcc; 2189 ret = 0; 2190 } 2191 break; 2192 default: 2193 break; 2194 } 2195 return ret; 2196 } 2197 } 2198 2199 static int mxc_jpeg_enum_fmt_vid_out(struct file *file, void *priv, 2200 struct v4l2_fmtdesc *f) 2201 { 2202 struct mxc_jpeg_ctx *ctx = mxc_jpeg_fh_to_ctx(priv); 2203 u32 type = ctx->mxc_jpeg->mode == MXC_JPEG_DECODE ? MXC_JPEG_FMT_TYPE_ENC : 2204 MXC_JPEG_FMT_TYPE_RAW; 2205 int ret; 2206 2207 ret = enum_fmt(mxc_formats, MXC_JPEG_NUM_FORMATS, f, type); 2208 if (ret) 2209 return ret; 2210 if (ctx->mxc_jpeg->mode == MXC_JPEG_DECODE) 2211 f->flags = V4L2_FMT_FLAG_DYN_RESOLUTION; 2212 return 0; 2213 } 2214 2215 static u32 mxc_jpeg_get_fmt_type(struct mxc_jpeg_ctx *ctx, u32 type) 2216 { 2217 if (ctx->mxc_jpeg->mode == MXC_JPEG_DECODE) 2218 return V4L2_TYPE_IS_OUTPUT(type) ? MXC_JPEG_FMT_TYPE_ENC : MXC_JPEG_FMT_TYPE_RAW; 2219 else 2220 return V4L2_TYPE_IS_CAPTURE(type) ? MXC_JPEG_FMT_TYPE_ENC : MXC_JPEG_FMT_TYPE_RAW; 2221 } 2222 2223 static u32 mxc_jpeg_get_default_fourcc(struct mxc_jpeg_ctx *ctx, u32 type) 2224 { 2225 if (ctx->mxc_jpeg->mode == MXC_JPEG_DECODE) 2226 return V4L2_TYPE_IS_OUTPUT(type) ? V4L2_PIX_FMT_JPEG : MXC_JPEG_DEFAULT_PFMT; 2227 else 2228 return V4L2_TYPE_IS_CAPTURE(type) ? V4L2_PIX_FMT_JPEG : MXC_JPEG_DEFAULT_PFMT; 2229 } 2230 2231 static u32 mxc_jpeg_try_fourcc(struct mxc_jpeg_ctx *ctx, u32 fourcc) 2232 { 2233 const struct mxc_jpeg_fmt *sibling; 2234 struct mxc_jpeg_q_data *q_data_cap; 2235 2236 if (ctx->mxc_jpeg->mode != MXC_JPEG_DECODE) 2237 return fourcc; 2238 if (!ctx->header_parsed) 2239 return fourcc; 2240 2241 q_data_cap = &ctx->cap_q; 2242 if (q_data_cap->fmt->fourcc == fourcc) 2243 return fourcc; 2244 2245 sibling = mxc_jpeg_get_sibling_format(q_data_cap->fmt); 2246 if (sibling && sibling->fourcc == fourcc) 2247 return sibling->fourcc; 2248 2249 return q_data_cap->fmt->fourcc; 2250 } 2251 2252 static int mxc_jpeg_try_fmt(struct v4l2_format *f, 2253 struct mxc_jpeg_ctx *ctx, struct mxc_jpeg_q_data *q_data) 2254 { 2255 const struct mxc_jpeg_fmt *fmt; 2256 struct v4l2_pix_format_mplane *pix_mp = &f->fmt.pix_mp; 2257 struct v4l2_plane_pix_format *pfmt; 2258 u32 fourcc = f->fmt.pix_mp.pixelformat; 2259 u32 w = (pix_mp->width < MXC_JPEG_MAX_WIDTH) ? 2260 pix_mp->width : MXC_JPEG_MAX_WIDTH; 2261 u32 h = (pix_mp->height < MXC_JPEG_MAX_HEIGHT) ? 2262 pix_mp->height : MXC_JPEG_MAX_HEIGHT; 2263 int i; 2264 2265 fmt = mxc_jpeg_find_format(fourcc); 2266 if (!fmt || fmt->flags != mxc_jpeg_get_fmt_type(ctx, f->type)) { 2267 dev_warn(ctx->mxc_jpeg->dev, "Format not supported: %c%c%c%c, use the default.\n", 2268 (fourcc & 0xff), 2269 (fourcc >> 8) & 0xff, 2270 (fourcc >> 16) & 0xff, 2271 (fourcc >> 24) & 0xff); 2272 fourcc = mxc_jpeg_get_default_fourcc(ctx, f->type); 2273 fmt = mxc_jpeg_find_format(fourcc); 2274 if (!fmt) 2275 return -EINVAL; 2276 f->fmt.pix_mp.pixelformat = fourcc; 2277 } 2278 q_data->fmt = fmt; 2279 2280 memset(pix_mp->reserved, 0, sizeof(pix_mp->reserved)); 2281 pix_mp->field = V4L2_FIELD_NONE; 2282 pix_mp->num_planes = fmt->mem_planes; 2283 pix_mp->pixelformat = fmt->fourcc; 2284 2285 q_data->w = w; 2286 q_data->h = h; 2287 q_data->w_adjusted = w; 2288 q_data->h_adjusted = h; 2289 v4l_bound_align_image(&q_data->w_adjusted, 2290 w, /* adjust upwards*/ 2291 MXC_JPEG_MAX_WIDTH, 2292 fmt->h_align, 2293 &q_data->h_adjusted, 2294 h, /* adjust upwards*/ 2295 MXC_JPEG_MAX_HEIGHT, 2296 fmt->v_align, 2297 0); 2298 for (i = 0; i < pix_mp->num_planes; i++) { 2299 pfmt = &pix_mp->plane_fmt[i]; 2300 q_data->bytesperline[i] = pfmt->bytesperline; 2301 q_data->sizeimage[i] = pfmt->sizeimage; 2302 } 2303 2304 /* calculate bytesperline & sizeimage */ 2305 mxc_jpeg_bytesperline(q_data, fmt->precision); 2306 mxc_jpeg_sizeimage(q_data); 2307 2308 /* adjust user format according to our calculations */ 2309 for (i = 0; i < pix_mp->num_planes; i++) { 2310 pfmt = &pix_mp->plane_fmt[i]; 2311 memset(pfmt->reserved, 0, sizeof(pfmt->reserved)); 2312 pfmt->bytesperline = q_data->bytesperline[i]; 2313 pfmt->sizeimage = mxc_jpeg_get_plane_size(q_data, i); 2314 } 2315 2316 /* fix colorspace information to sRGB for both output & capture */ 2317 pix_mp->colorspace = V4L2_COLORSPACE_SRGB; 2318 pix_mp->ycbcr_enc = V4L2_YCBCR_ENC_601; 2319 pix_mp->xfer_func = V4L2_XFER_FUNC_SRGB; 2320 /* 2321 * this hardware does not change the range of the samples 2322 * but since inside JPEG the YUV quantization is full-range, 2323 * this driver will always use full-range for the raw frames, too 2324 */ 2325 pix_mp->quantization = V4L2_QUANTIZATION_FULL_RANGE; 2326 2327 if (fmt->flags == MXC_JPEG_FMT_TYPE_RAW) { 2328 q_data->crop.left = 0; 2329 q_data->crop.top = 0; 2330 q_data->crop.width = q_data->w; 2331 q_data->crop.height = q_data->h; 2332 } 2333 2334 pix_mp->width = q_data->w_adjusted; 2335 pix_mp->height = q_data->h_adjusted; 2336 2337 return 0; 2338 } 2339 2340 static int mxc_jpeg_try_fmt_vid_cap(struct file *file, void *priv, 2341 struct v4l2_format *f) 2342 { 2343 struct mxc_jpeg_ctx *ctx = mxc_jpeg_fh_to_ctx(priv); 2344 struct mxc_jpeg_dev *jpeg = ctx->mxc_jpeg; 2345 struct device *dev = jpeg->dev; 2346 struct mxc_jpeg_q_data tmp_q; 2347 2348 if (!V4L2_TYPE_IS_MULTIPLANAR(f->type)) { 2349 dev_err(dev, "TRY_FMT with Invalid type: %d\n", f->type); 2350 return -EINVAL; 2351 } 2352 2353 if (ctx->mxc_jpeg->mode != MXC_JPEG_DECODE && V4L2_TYPE_IS_CAPTURE(f->type)) 2354 f->fmt.pix_mp.pixelformat = mxc_jpeg_try_fourcc(ctx, f->fmt.pix_mp.pixelformat); 2355 2356 return mxc_jpeg_try_fmt(f, ctx, &tmp_q); 2357 } 2358 2359 static int mxc_jpeg_try_fmt_vid_out(struct file *file, void *priv, 2360 struct v4l2_format *f) 2361 { 2362 struct mxc_jpeg_ctx *ctx = mxc_jpeg_fh_to_ctx(priv); 2363 struct mxc_jpeg_dev *jpeg = ctx->mxc_jpeg; 2364 struct device *dev = jpeg->dev; 2365 struct mxc_jpeg_q_data tmp_q; 2366 2367 if (!V4L2_TYPE_IS_MULTIPLANAR(f->type)) { 2368 dev_err(dev, "TRY_FMT with Invalid type: %d\n", f->type); 2369 return -EINVAL; 2370 } 2371 2372 return mxc_jpeg_try_fmt(f, ctx, &tmp_q); 2373 } 2374 2375 static void mxc_jpeg_s_parsed_fmt(struct mxc_jpeg_ctx *ctx, struct v4l2_format *f) 2376 { 2377 struct v4l2_pix_format_mplane *pix_mp = &f->fmt.pix_mp; 2378 struct mxc_jpeg_q_data *q_data_cap; 2379 2380 if (ctx->mxc_jpeg->mode != MXC_JPEG_DECODE || !V4L2_TYPE_IS_CAPTURE(f->type)) 2381 return; 2382 if (!ctx->header_parsed) 2383 return; 2384 2385 q_data_cap = mxc_jpeg_get_q_data(ctx, f->type); 2386 pix_mp->pixelformat = mxc_jpeg_try_fourcc(ctx, pix_mp->pixelformat); 2387 pix_mp->width = q_data_cap->w; 2388 pix_mp->height = q_data_cap->h; 2389 } 2390 2391 static int mxc_jpeg_s_fmt(struct mxc_jpeg_ctx *ctx, 2392 struct v4l2_format *f) 2393 { 2394 struct vb2_queue *vq; 2395 struct mxc_jpeg_dev *jpeg = ctx->mxc_jpeg; 2396 2397 vq = v4l2_m2m_get_vq(ctx->fh.m2m_ctx, f->type); 2398 if (!vq) 2399 return -EINVAL; 2400 2401 if (vb2_is_busy(vq)) { 2402 v4l2_err(&jpeg->v4l2_dev, "queue busy\n"); 2403 return -EBUSY; 2404 } 2405 2406 mxc_jpeg_s_parsed_fmt(ctx, f); 2407 2408 return mxc_jpeg_try_fmt(f, ctx, mxc_jpeg_get_q_data(ctx, f->type)); 2409 } 2410 2411 static int mxc_jpeg_s_fmt_vid_cap(struct file *file, void *priv, 2412 struct v4l2_format *f) 2413 { 2414 return mxc_jpeg_s_fmt(mxc_jpeg_fh_to_ctx(priv), f); 2415 } 2416 2417 static int mxc_jpeg_s_fmt_vid_out(struct file *file, void *priv, 2418 struct v4l2_format *f) 2419 { 2420 int ret; 2421 struct mxc_jpeg_ctx *ctx = mxc_jpeg_fh_to_ctx(priv); 2422 struct vb2_queue *dst_vq; 2423 struct mxc_jpeg_q_data *q_data_cap; 2424 enum v4l2_buf_type cap_type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 2425 struct v4l2_format fc; 2426 2427 ret = mxc_jpeg_s_fmt(mxc_jpeg_fh_to_ctx(priv), f); 2428 if (ret) 2429 return ret; 2430 2431 if (ctx->mxc_jpeg->mode != MXC_JPEG_DECODE) 2432 return 0; 2433 2434 dst_vq = v4l2_m2m_get_vq(ctx->fh.m2m_ctx, cap_type); 2435 if (!dst_vq) 2436 return -EINVAL; 2437 2438 if (vb2_is_busy(dst_vq)) 2439 return 0; 2440 2441 q_data_cap = mxc_jpeg_get_q_data(ctx, cap_type); 2442 if (q_data_cap->w == f->fmt.pix_mp.width && q_data_cap->h == f->fmt.pix_mp.height) 2443 return 0; 2444 memset(&fc, 0, sizeof(fc)); 2445 fc.type = cap_type; 2446 fc.fmt.pix_mp.pixelformat = q_data_cap->fmt->fourcc; 2447 fc.fmt.pix_mp.width = f->fmt.pix_mp.width; 2448 fc.fmt.pix_mp.height = f->fmt.pix_mp.height; 2449 2450 return mxc_jpeg_s_fmt_vid_cap(file, priv, &fc); 2451 } 2452 2453 static int mxc_jpeg_g_fmt_vid(struct file *file, void *priv, 2454 struct v4l2_format *f) 2455 { 2456 struct mxc_jpeg_ctx *ctx = mxc_jpeg_fh_to_ctx(priv); 2457 struct mxc_jpeg_dev *jpeg = ctx->mxc_jpeg; 2458 struct device *dev = jpeg->dev; 2459 struct v4l2_pix_format_mplane *pix_mp = &f->fmt.pix_mp; 2460 struct mxc_jpeg_q_data *q_data = mxc_jpeg_get_q_data(ctx, f->type); 2461 int i; 2462 2463 if (!V4L2_TYPE_IS_MULTIPLANAR(f->type)) { 2464 dev_err(dev, "G_FMT with Invalid type: %d\n", f->type); 2465 return -EINVAL; 2466 } 2467 2468 pix_mp->pixelformat = q_data->fmt->fourcc; 2469 pix_mp->width = q_data->w; 2470 pix_mp->height = q_data->h; 2471 pix_mp->field = V4L2_FIELD_NONE; 2472 if (q_data->fmt->flags == MXC_JPEG_FMT_TYPE_RAW) { 2473 pix_mp->width = q_data->w_adjusted; 2474 pix_mp->height = q_data->h_adjusted; 2475 } 2476 2477 /* fix colorspace information to sRGB for both output & capture */ 2478 pix_mp->colorspace = V4L2_COLORSPACE_SRGB; 2479 pix_mp->ycbcr_enc = V4L2_YCBCR_ENC_601; 2480 pix_mp->xfer_func = V4L2_XFER_FUNC_SRGB; 2481 pix_mp->quantization = V4L2_QUANTIZATION_FULL_RANGE; 2482 2483 pix_mp->num_planes = q_data->fmt->mem_planes; 2484 for (i = 0; i < pix_mp->num_planes; i++) { 2485 pix_mp->plane_fmt[i].bytesperline = q_data->bytesperline[i]; 2486 pix_mp->plane_fmt[i].sizeimage = mxc_jpeg_get_plane_size(q_data, i); 2487 } 2488 2489 return 0; 2490 } 2491 2492 static int mxc_jpeg_dec_g_selection(struct file *file, void *fh, struct v4l2_selection *s) 2493 { 2494 struct mxc_jpeg_ctx *ctx = mxc_jpeg_fh_to_ctx(fh); 2495 struct mxc_jpeg_q_data *q_data_cap; 2496 2497 if (s->type != V4L2_BUF_TYPE_VIDEO_CAPTURE && s->type != V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) 2498 return -EINVAL; 2499 2500 q_data_cap = mxc_jpeg_get_q_data(ctx, s->type); 2501 2502 switch (s->target) { 2503 case V4L2_SEL_TGT_COMPOSE: 2504 case V4L2_SEL_TGT_COMPOSE_DEFAULT: 2505 s->r = q_data_cap->crop; 2506 break; 2507 case V4L2_SEL_TGT_COMPOSE_PADDED: 2508 case V4L2_SEL_TGT_COMPOSE_BOUNDS: 2509 s->r.left = 0; 2510 s->r.top = 0; 2511 s->r.width = q_data_cap->w_adjusted; 2512 s->r.height = q_data_cap->h_adjusted; 2513 break; 2514 default: 2515 return -EINVAL; 2516 } 2517 2518 return 0; 2519 } 2520 2521 static int mxc_jpeg_enc_g_selection(struct file *file, void *fh, struct v4l2_selection *s) 2522 { 2523 struct mxc_jpeg_ctx *ctx = mxc_jpeg_fh_to_ctx(fh); 2524 struct mxc_jpeg_q_data *q_data_out; 2525 2526 if (s->type != V4L2_BUF_TYPE_VIDEO_OUTPUT && s->type != V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) 2527 return -EINVAL; 2528 2529 q_data_out = mxc_jpeg_get_q_data(ctx, s->type); 2530 2531 switch (s->target) { 2532 case V4L2_SEL_TGT_CROP_DEFAULT: 2533 case V4L2_SEL_TGT_CROP_BOUNDS: 2534 s->r.left = 0; 2535 s->r.top = 0; 2536 s->r.width = q_data_out->w; 2537 s->r.height = q_data_out->h; 2538 break; 2539 case V4L2_SEL_TGT_CROP: 2540 s->r = q_data_out->crop; 2541 break; 2542 default: 2543 return -EINVAL; 2544 } 2545 2546 return 0; 2547 } 2548 2549 static int mxc_jpeg_g_selection(struct file *file, void *fh, struct v4l2_selection *s) 2550 { 2551 struct mxc_jpeg_ctx *ctx = mxc_jpeg_fh_to_ctx(fh); 2552 2553 if (ctx->mxc_jpeg->mode == MXC_JPEG_DECODE) 2554 return mxc_jpeg_dec_g_selection(file, fh, s); 2555 else 2556 return mxc_jpeg_enc_g_selection(file, fh, s); 2557 } 2558 2559 static int mxc_jpeg_s_selection(struct file *file, void *fh, struct v4l2_selection *s) 2560 { 2561 struct mxc_jpeg_ctx *ctx = mxc_jpeg_fh_to_ctx(fh); 2562 struct mxc_jpeg_q_data *q_data_out; 2563 2564 if (ctx->mxc_jpeg->mode != MXC_JPEG_ENCODE) 2565 return -ENOTTY; 2566 2567 if (s->type != V4L2_BUF_TYPE_VIDEO_OUTPUT && s->type != V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) 2568 return -EINVAL; 2569 if (s->target != V4L2_SEL_TGT_CROP) 2570 return -EINVAL; 2571 2572 q_data_out = mxc_jpeg_get_q_data(ctx, s->type); 2573 if (s->r.left || s->r.top) 2574 return -EINVAL; 2575 if (s->r.width > q_data_out->w || s->r.height > q_data_out->h) 2576 return -EINVAL; 2577 2578 q_data_out->crop.left = 0; 2579 q_data_out->crop.top = 0; 2580 q_data_out->crop.width = s->r.width; 2581 q_data_out->crop.height = s->r.height; 2582 2583 return 0; 2584 } 2585 2586 static int mxc_jpeg_subscribe_event(struct v4l2_fh *fh, 2587 const struct v4l2_event_subscription *sub) 2588 { 2589 switch (sub->type) { 2590 case V4L2_EVENT_EOS: 2591 return v4l2_event_subscribe(fh, sub, 0, NULL); 2592 case V4L2_EVENT_SOURCE_CHANGE: 2593 return v4l2_src_change_event_subscribe(fh, sub); 2594 case V4L2_EVENT_CTRL: 2595 return v4l2_ctrl_subscribe_event(fh, sub); 2596 default: 2597 return -EINVAL; 2598 } 2599 } 2600 2601 static const struct v4l2_ioctl_ops mxc_jpeg_ioctl_ops = { 2602 .vidioc_querycap = mxc_jpeg_querycap, 2603 .vidioc_enum_fmt_vid_cap = mxc_jpeg_enum_fmt_vid_cap, 2604 .vidioc_enum_fmt_vid_out = mxc_jpeg_enum_fmt_vid_out, 2605 2606 .vidioc_try_fmt_vid_cap_mplane = mxc_jpeg_try_fmt_vid_cap, 2607 .vidioc_try_fmt_vid_out_mplane = mxc_jpeg_try_fmt_vid_out, 2608 2609 .vidioc_s_fmt_vid_cap_mplane = mxc_jpeg_s_fmt_vid_cap, 2610 .vidioc_s_fmt_vid_out_mplane = mxc_jpeg_s_fmt_vid_out, 2611 2612 .vidioc_g_fmt_vid_cap_mplane = mxc_jpeg_g_fmt_vid, 2613 .vidioc_g_fmt_vid_out_mplane = mxc_jpeg_g_fmt_vid, 2614 2615 .vidioc_g_selection = mxc_jpeg_g_selection, 2616 .vidioc_s_selection = mxc_jpeg_s_selection, 2617 2618 .vidioc_subscribe_event = mxc_jpeg_subscribe_event, 2619 .vidioc_unsubscribe_event = v4l2_event_unsubscribe, 2620 2621 .vidioc_try_decoder_cmd = v4l2_m2m_ioctl_try_decoder_cmd, 2622 .vidioc_decoder_cmd = mxc_jpeg_decoder_cmd, 2623 .vidioc_try_encoder_cmd = v4l2_m2m_ioctl_try_encoder_cmd, 2624 .vidioc_encoder_cmd = mxc_jpeg_encoder_cmd, 2625 2626 .vidioc_qbuf = v4l2_m2m_ioctl_qbuf, 2627 .vidioc_dqbuf = v4l2_m2m_ioctl_dqbuf, 2628 2629 .vidioc_create_bufs = v4l2_m2m_ioctl_create_bufs, 2630 .vidioc_prepare_buf = v4l2_m2m_ioctl_prepare_buf, 2631 .vidioc_reqbufs = v4l2_m2m_ioctl_reqbufs, 2632 .vidioc_querybuf = v4l2_m2m_ioctl_querybuf, 2633 .vidioc_expbuf = v4l2_m2m_ioctl_expbuf, 2634 .vidioc_streamon = v4l2_m2m_ioctl_streamon, 2635 .vidioc_streamoff = v4l2_m2m_ioctl_streamoff, 2636 }; 2637 2638 static int mxc_jpeg_release(struct file *file) 2639 { 2640 struct mxc_jpeg_dev *mxc_jpeg = video_drvdata(file); 2641 struct mxc_jpeg_ctx *ctx = mxc_jpeg_fh_to_ctx(file->private_data); 2642 struct device *dev = mxc_jpeg->dev; 2643 2644 mutex_lock(&mxc_jpeg->lock); 2645 if (mxc_jpeg->mode == MXC_JPEG_DECODE) 2646 dev_dbg(dev, "Release JPEG decoder instance on slot %d.", 2647 ctx->slot); 2648 else 2649 dev_dbg(dev, "Release JPEG encoder instance on slot %d.", 2650 ctx->slot); 2651 v4l2_ctrl_handler_free(&ctx->ctrl_handler); 2652 v4l2_m2m_ctx_release(ctx->fh.m2m_ctx); 2653 v4l2_fh_del(&ctx->fh); 2654 v4l2_fh_exit(&ctx->fh); 2655 kfree(ctx); 2656 mutex_unlock(&mxc_jpeg->lock); 2657 2658 return 0; 2659 } 2660 2661 static const struct v4l2_file_operations mxc_jpeg_fops = { 2662 .owner = THIS_MODULE, 2663 .open = mxc_jpeg_open, 2664 .release = mxc_jpeg_release, 2665 .poll = v4l2_m2m_fop_poll, 2666 .unlocked_ioctl = video_ioctl2, 2667 .mmap = v4l2_m2m_fop_mmap, 2668 }; 2669 2670 static const struct v4l2_m2m_ops mxc_jpeg_m2m_ops = { 2671 .job_ready = mxc_jpeg_job_ready, 2672 .device_run = mxc_jpeg_device_run, 2673 }; 2674 2675 static void mxc_jpeg_detach_pm_domains(struct mxc_jpeg_dev *jpeg) 2676 { 2677 int i; 2678 2679 for (i = 0; i < jpeg->num_domains; i++) { 2680 if (jpeg->pd_dev[i] && !pm_runtime_suspended(jpeg->pd_dev[i])) 2681 pm_runtime_force_suspend(jpeg->pd_dev[i]); 2682 if (jpeg->pd_link[i] && !IS_ERR(jpeg->pd_link[i])) 2683 device_link_del(jpeg->pd_link[i]); 2684 if (jpeg->pd_dev[i] && !IS_ERR(jpeg->pd_dev[i])) 2685 dev_pm_domain_detach(jpeg->pd_dev[i], true); 2686 jpeg->pd_dev[i] = NULL; 2687 jpeg->pd_link[i] = NULL; 2688 } 2689 } 2690 2691 static int mxc_jpeg_attach_pm_domains(struct mxc_jpeg_dev *jpeg) 2692 { 2693 struct device *dev = jpeg->dev; 2694 struct device_node *np = jpeg->pdev->dev.of_node; 2695 int i; 2696 int ret; 2697 2698 jpeg->num_domains = of_count_phandle_with_args(np, "power-domains", 2699 "#power-domain-cells"); 2700 if (jpeg->num_domains < 0) { 2701 dev_err(dev, "No power domains defined for jpeg node\n"); 2702 return jpeg->num_domains; 2703 } 2704 if (jpeg->num_domains == 1) { 2705 /* genpd_dev_pm_attach() attach automatically if power domains count is 1 */ 2706 jpeg->num_domains = 0; 2707 return 0; 2708 } 2709 2710 jpeg->pd_dev = devm_kmalloc_array(dev, jpeg->num_domains, 2711 sizeof(*jpeg->pd_dev), GFP_KERNEL); 2712 if (!jpeg->pd_dev) 2713 return -ENOMEM; 2714 2715 jpeg->pd_link = devm_kmalloc_array(dev, jpeg->num_domains, 2716 sizeof(*jpeg->pd_link), GFP_KERNEL); 2717 if (!jpeg->pd_link) 2718 return -ENOMEM; 2719 2720 for (i = 0; i < jpeg->num_domains; i++) { 2721 jpeg->pd_dev[i] = dev_pm_domain_attach_by_id(dev, i); 2722 if (IS_ERR(jpeg->pd_dev[i])) { 2723 ret = PTR_ERR(jpeg->pd_dev[i]); 2724 goto fail; 2725 } 2726 2727 jpeg->pd_link[i] = device_link_add(dev, jpeg->pd_dev[i], 2728 DL_FLAG_STATELESS | 2729 DL_FLAG_PM_RUNTIME); 2730 if (!jpeg->pd_link[i]) { 2731 ret = -EINVAL; 2732 goto fail; 2733 } 2734 } 2735 2736 return 0; 2737 fail: 2738 mxc_jpeg_detach_pm_domains(jpeg); 2739 return ret; 2740 } 2741 2742 static int mxc_jpeg_probe(struct platform_device *pdev) 2743 { 2744 struct mxc_jpeg_dev *jpeg; 2745 struct device *dev = &pdev->dev; 2746 int dec_irq; 2747 int ret; 2748 int mode; 2749 const struct of_device_id *of_id; 2750 2751 of_id = of_match_node(mxc_jpeg_match, dev->of_node); 2752 if (!of_id) 2753 return -ENODEV; 2754 mode = *(const int *)of_id->data; 2755 2756 jpeg = devm_kzalloc(dev, sizeof(struct mxc_jpeg_dev), GFP_KERNEL); 2757 if (!jpeg) 2758 return -ENOMEM; 2759 2760 mutex_init(&jpeg->lock); 2761 spin_lock_init(&jpeg->hw_lock); 2762 2763 ret = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(32)); 2764 if (ret) { 2765 dev_err(&pdev->dev, "No suitable DMA available.\n"); 2766 goto err_irq; 2767 } 2768 2769 jpeg->base_reg = devm_platform_ioremap_resource(pdev, 0); 2770 if (IS_ERR(jpeg->base_reg)) 2771 return PTR_ERR(jpeg->base_reg); 2772 2773 ret = of_property_read_u32_index(pdev->dev.of_node, "slot", 0, &jpeg->slot_data.slot); 2774 if (ret) 2775 jpeg->slot_data.slot = 0; 2776 dev_info(&pdev->dev, "choose slot %d\n", jpeg->slot_data.slot); 2777 dec_irq = platform_get_irq(pdev, 0); 2778 if (dec_irq < 0) { 2779 ret = dec_irq; 2780 goto err_irq; 2781 } 2782 ret = devm_request_irq(&pdev->dev, dec_irq, mxc_jpeg_dec_irq, 2783 0, pdev->name, jpeg); 2784 if (ret) { 2785 dev_err(&pdev->dev, "Failed to request irq %d (%d)\n", 2786 dec_irq, ret); 2787 goto err_irq; 2788 } 2789 2790 jpeg->pdev = pdev; 2791 jpeg->dev = dev; 2792 jpeg->mode = mode; 2793 2794 /* Get clocks */ 2795 ret = devm_clk_bulk_get_all(&pdev->dev, &jpeg->clks); 2796 if (ret < 0) { 2797 dev_err(dev, "failed to get clock\n"); 2798 goto err_clk; 2799 } 2800 jpeg->num_clks = ret; 2801 2802 ret = mxc_jpeg_attach_pm_domains(jpeg); 2803 if (ret < 0) { 2804 dev_err(dev, "failed to attach power domains %d\n", ret); 2805 goto err_clk; 2806 } 2807 2808 /* v4l2 */ 2809 ret = v4l2_device_register(dev, &jpeg->v4l2_dev); 2810 if (ret) { 2811 dev_err(dev, "failed to register v4l2 device\n"); 2812 goto err_register; 2813 } 2814 jpeg->m2m_dev = v4l2_m2m_init(&mxc_jpeg_m2m_ops); 2815 if (IS_ERR(jpeg->m2m_dev)) { 2816 dev_err(dev, "failed to register v4l2 device\n"); 2817 ret = PTR_ERR(jpeg->m2m_dev); 2818 goto err_m2m; 2819 } 2820 2821 jpeg->dec_vdev = video_device_alloc(); 2822 if (!jpeg->dec_vdev) { 2823 dev_err(dev, "failed to register v4l2 device\n"); 2824 ret = -ENOMEM; 2825 goto err_vdev_alloc; 2826 } 2827 if (mode == MXC_JPEG_ENCODE) 2828 snprintf(jpeg->dec_vdev->name, 2829 sizeof(jpeg->dec_vdev->name), 2830 "%s-enc", MXC_JPEG_NAME); 2831 else 2832 snprintf(jpeg->dec_vdev->name, 2833 sizeof(jpeg->dec_vdev->name), 2834 "%s-dec", MXC_JPEG_NAME); 2835 2836 jpeg->dec_vdev->fops = &mxc_jpeg_fops; 2837 jpeg->dec_vdev->ioctl_ops = &mxc_jpeg_ioctl_ops; 2838 jpeg->dec_vdev->minor = -1; 2839 jpeg->dec_vdev->release = video_device_release; 2840 jpeg->dec_vdev->lock = &jpeg->lock; /* lock for ioctl serialization */ 2841 jpeg->dec_vdev->v4l2_dev = &jpeg->v4l2_dev; 2842 jpeg->dec_vdev->vfl_dir = VFL_DIR_M2M; 2843 jpeg->dec_vdev->device_caps = V4L2_CAP_STREAMING | 2844 V4L2_CAP_VIDEO_M2M_MPLANE; 2845 video_set_drvdata(jpeg->dec_vdev, jpeg); 2846 if (mode == MXC_JPEG_ENCODE) { 2847 v4l2_disable_ioctl(jpeg->dec_vdev, VIDIOC_DECODER_CMD); 2848 v4l2_disable_ioctl(jpeg->dec_vdev, VIDIOC_TRY_DECODER_CMD); 2849 } else { 2850 v4l2_disable_ioctl(jpeg->dec_vdev, VIDIOC_ENCODER_CMD); 2851 v4l2_disable_ioctl(jpeg->dec_vdev, VIDIOC_TRY_ENCODER_CMD); 2852 } 2853 ret = video_register_device(jpeg->dec_vdev, VFL_TYPE_VIDEO, -1); 2854 if (ret) { 2855 dev_err(dev, "failed to register video device\n"); 2856 goto err_vdev_register; 2857 } 2858 if (mode == MXC_JPEG_ENCODE) 2859 v4l2_info(&jpeg->v4l2_dev, 2860 "encoder device registered as /dev/video%d (%d,%d)\n", 2861 jpeg->dec_vdev->num, VIDEO_MAJOR, 2862 jpeg->dec_vdev->minor); 2863 else 2864 v4l2_info(&jpeg->v4l2_dev, 2865 "decoder device registered as /dev/video%d (%d,%d)\n", 2866 jpeg->dec_vdev->num, VIDEO_MAJOR, 2867 jpeg->dec_vdev->minor); 2868 2869 platform_set_drvdata(pdev, jpeg); 2870 pm_runtime_enable(dev); 2871 2872 return 0; 2873 2874 err_vdev_register: 2875 video_device_release(jpeg->dec_vdev); 2876 2877 err_vdev_alloc: 2878 v4l2_m2m_release(jpeg->m2m_dev); 2879 2880 err_m2m: 2881 v4l2_device_unregister(&jpeg->v4l2_dev); 2882 2883 err_register: 2884 mxc_jpeg_detach_pm_domains(jpeg); 2885 2886 err_irq: 2887 err_clk: 2888 return ret; 2889 } 2890 2891 static int mxc_jpeg_runtime_resume(struct device *dev) 2892 { 2893 struct mxc_jpeg_dev *jpeg = dev_get_drvdata(dev); 2894 int ret; 2895 2896 ret = clk_bulk_prepare_enable(jpeg->num_clks, jpeg->clks); 2897 if (ret < 0) { 2898 dev_err(dev, "failed to enable clock\n"); 2899 return ret; 2900 } 2901 2902 return 0; 2903 } 2904 2905 static int mxc_jpeg_runtime_suspend(struct device *dev) 2906 { 2907 struct mxc_jpeg_dev *jpeg = dev_get_drvdata(dev); 2908 2909 clk_bulk_disable_unprepare(jpeg->num_clks, jpeg->clks); 2910 2911 return 0; 2912 } 2913 2914 static int mxc_jpeg_suspend(struct device *dev) 2915 { 2916 struct mxc_jpeg_dev *jpeg = dev_get_drvdata(dev); 2917 2918 v4l2_m2m_suspend(jpeg->m2m_dev); 2919 return pm_runtime_force_suspend(dev); 2920 } 2921 2922 static int mxc_jpeg_resume(struct device *dev) 2923 { 2924 struct mxc_jpeg_dev *jpeg = dev_get_drvdata(dev); 2925 int ret; 2926 2927 ret = pm_runtime_force_resume(dev); 2928 if (ret < 0) 2929 return ret; 2930 2931 v4l2_m2m_resume(jpeg->m2m_dev); 2932 return ret; 2933 } 2934 2935 static const struct dev_pm_ops mxc_jpeg_pm_ops = { 2936 RUNTIME_PM_OPS(mxc_jpeg_runtime_suspend, mxc_jpeg_runtime_resume, NULL) 2937 SYSTEM_SLEEP_PM_OPS(mxc_jpeg_suspend, mxc_jpeg_resume) 2938 }; 2939 2940 static void mxc_jpeg_remove(struct platform_device *pdev) 2941 { 2942 struct mxc_jpeg_dev *jpeg = platform_get_drvdata(pdev); 2943 2944 mxc_jpeg_free_slot_data(jpeg); 2945 2946 pm_runtime_disable(&pdev->dev); 2947 video_unregister_device(jpeg->dec_vdev); 2948 v4l2_m2m_release(jpeg->m2m_dev); 2949 v4l2_device_unregister(&jpeg->v4l2_dev); 2950 mxc_jpeg_detach_pm_domains(jpeg); 2951 } 2952 2953 MODULE_DEVICE_TABLE(of, mxc_jpeg_match); 2954 2955 static struct platform_driver mxc_jpeg_driver = { 2956 .probe = mxc_jpeg_probe, 2957 .remove = mxc_jpeg_remove, 2958 .driver = { 2959 .name = "mxc-jpeg", 2960 .of_match_table = mxc_jpeg_match, 2961 .pm = pm_ptr(&mxc_jpeg_pm_ops), 2962 }, 2963 }; 2964 module_platform_driver(mxc_jpeg_driver); 2965 2966 MODULE_AUTHOR("Zhengyu Shen <zhengyu.shen_1@nxp.com>"); 2967 MODULE_AUTHOR("Mirela Rabulea <mirela.rabulea@nxp.com>"); 2968 MODULE_DESCRIPTION("V4L2 driver for i.MX8 QXP/QM JPEG encoder/decoder"); 2969 MODULE_LICENSE("GPL v2"); 2970