1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 | /* SPDX-License-Identifier: GPL-2.0-only */ /* * Copyright (c) 2016 MediaTek Inc. * Author: Ming Hsiu Tsai <minghsiu.tsai@mediatek.com> * Rick Chang <rick.chang@mediatek.com> */ #ifndef _MTK_JPEG_CORE_H #define _MTK_JPEG_CORE_H #include <linux/interrupt.h> #include <media/v4l2-ctrls.h> #include <media/v4l2-device.h> #include <media/v4l2-fh.h> #define MTK_JPEG_NAME "mtk-jpeg" #define MTK_JPEG_FMT_FLAG_DEC_OUTPUT BIT(0) #define MTK_JPEG_FMT_FLAG_DEC_CAPTURE BIT(1) #define MTK_JPEG_FMT_TYPE_OUTPUT 1 #define MTK_JPEG_FMT_TYPE_CAPTURE 2 #define MTK_JPEG_MIN_WIDTH 32 #define MTK_JPEG_MIN_HEIGHT 32 #define MTK_JPEG_MAX_WIDTH 8192 #define MTK_JPEG_MAX_HEIGHT 8192 #define MTK_JPEG_DEFAULT_SIZEIMAGE (1 * 1024 * 1024) enum mtk_jpeg_ctx_state { MTK_JPEG_INIT = 0, MTK_JPEG_RUNNING, MTK_JPEG_SOURCE_CHANGE, }; /** * struct mt_jpeg - JPEG IP abstraction * @lock: the mutex protecting this structure * @hw_lock: spinlock protecting the hw device resource * @workqueue: decode work queue * @dev: JPEG device * @v4l2_dev: v4l2 device for mem2mem mode * @m2m_dev: v4l2 mem2mem device data * @alloc_ctx: videobuf2 memory allocator's context * @dec_vdev: video device node for decoder mem2mem mode * @dec_reg_base: JPEG registers mapping * @clk_jdec: JPEG hw working clock * @clk_jdec_smi: JPEG SMI bus clock * @larb: SMI device */ struct mtk_jpeg_dev { struct mutex lock; spinlock_t hw_lock; struct workqueue_struct *workqueue; struct device *dev; struct v4l2_device v4l2_dev; struct v4l2_m2m_dev *m2m_dev; void *alloc_ctx; struct video_device *dec_vdev; void __iomem *dec_reg_base; struct clk *clk_jdec; struct clk *clk_jdec_smi; struct device *larb; }; /** * struct jpeg_fmt - driver's internal color format data * @fourcc: the fourcc code, 0 if not applicable * @h_sample: horizontal sample count of plane in 4 * 4 pixel image * @v_sample: vertical sample count of plane in 4 * 4 pixel image * @colplanes: number of color planes (1 for packed formats) * @h_align: horizontal alignment order (align to 2^h_align) * @v_align: vertical alignment order (align to 2^v_align) * @flags: flags describing format applicability */ struct mtk_jpeg_fmt { u32 fourcc; int h_sample[VIDEO_MAX_PLANES]; int v_sample[VIDEO_MAX_PLANES]; int colplanes; int h_align; int v_align; u32 flags; }; /** * mtk_jpeg_q_data - parameters of one queue * @fmt: driver-specific format of this queue * @w: image width * @h: image height * @bytesperline: distance in bytes between the leftmost pixels in two adjacent * lines * @sizeimage: image buffer size in bytes */ struct mtk_jpeg_q_data { struct mtk_jpeg_fmt *fmt; u32 w; u32 h; u32 bytesperline[VIDEO_MAX_PLANES]; u32 sizeimage[VIDEO_MAX_PLANES]; }; /** * mtk_jpeg_ctx - the device context data * @jpeg: JPEG IP device for this context * @out_q: source (output) queue information * @cap_q: destination (capture) queue queue information * @fh: V4L2 file handle * @dec_param parameters for HW decoding * @state: state of the context * @header_valid: set if header has been parsed and valid * @colorspace: enum v4l2_colorspace; supplemental to pixelformat * @ycbcr_enc: enum v4l2_ycbcr_encoding, Y'CbCr encoding * @quantization: enum v4l2_quantization, colorspace quantization * @xfer_func: enum v4l2_xfer_func, colorspace transfer function */ struct mtk_jpeg_ctx { struct mtk_jpeg_dev *jpeg; struct mtk_jpeg_q_data out_q; struct mtk_jpeg_q_data cap_q; struct v4l2_fh fh; enum mtk_jpeg_ctx_state state; enum v4l2_colorspace colorspace; enum v4l2_ycbcr_encoding ycbcr_enc; enum v4l2_quantization quantization; enum v4l2_xfer_func xfer_func; }; #endif /* _MTK_JPEG_CORE_H */ |