1 /* SPDX-License-Identifier: GPL-2.0 */
3 * i.MX8QXP/i.MX8QM JPEG encoder/decoder v4l2 driver
5 * Copyright 2018-2019 NXP
8 #include <media/v4l2-ctrls.h>
9 #include <media/v4l2-device.h>
10 #include <media/v4l2-fh.h>
12 #ifndef _MXC_JPEG_CORE_H
13 #define _MXC_JPEG_CORE_H
15 #define MXC_JPEG_NAME "mxc-jpeg"
16 #define MXC_JPEG_FMT_TYPE_ENC 0
17 #define MXC_JPEG_FMT_TYPE_RAW 1
18 #define MXC_JPEG_DEFAULT_WIDTH 1280
19 #define MXC_JPEG_DEFAULT_HEIGHT 720
20 #define MXC_JPEG_DEFAULT_PFMT V4L2_PIX_FMT_BGR24
21 #define MXC_JPEG_MIN_WIDTH 64
22 #define MXC_JPEG_MIN_HEIGHT 64
23 #define MXC_JPEG_MAX_WIDTH 0x2000
24 #define MXC_JPEG_MAX_HEIGHT 0x2000
25 #define MXC_JPEG_MAX_CFG_STREAM 0x1000
26 #define MXC_JPEG_H_ALIGN 3
27 #define MXC_JPEG_W_ALIGN 3
28 #define MXC_JPEG_MAX_SIZEIMAGE 0xFFFFFC00
29 #define MXC_JPEG_MAX_PLANES 2
31 enum mxc_jpeg_enc_state {
32 MXC_JPEG_ENCODING = 0, /* jpeg encode phase */
33 MXC_JPEG_ENC_CONF = 1, /* jpeg encoder config phase */
37 MXC_JPEG_DECODE = 0, /* jpeg decode mode */
38 MXC_JPEG_ENCODE = 1, /* jpeg encode mode */
42 * struct mxc_jpeg_fmt - driver's internal color format data
43 * @name: format description
44 * @fourcc: fourcc code, 0 if not applicable
45 * @subsampling: subsampling of jpeg components
46 * @nc: number of color components
47 * @depth: number of bits per pixel
48 * @mem_planes: number of memory planes (1 for packed formats)
49 * @comp_planes:number of component planes, which includes the alpha plane (1 to 4).
50 * @h_align: horizontal alignment order (align to 2^h_align)
51 * @v_align: vertical alignment order (align to 2^v_align)
52 * @flags: flags describing format applicability
53 * @precision: jpeg sample precision
54 * @is_rgb: is an RGB pixel format
59 enum v4l2_jpeg_chroma_subsampling subsampling;
71 struct mxc_jpeg_desc {
82 struct mxc_jpeg_q_data {
83 const struct mxc_jpeg_fmt *fmt;
84 u32 sizeimage[MXC_JPEG_MAX_PLANES];
85 u32 bytesperline[MXC_JPEG_MAX_PLANES];
90 unsigned int sequence;
91 struct v4l2_rect crop;
95 struct mxc_jpeg_dev *mxc_jpeg;
96 struct mxc_jpeg_q_data out_q;
97 struct mxc_jpeg_q_data cap_q;
99 enum mxc_jpeg_enc_state enc_state;
101 unsigned int source_change;
103 struct v4l2_ctrl_handler ctrl_handler;
105 struct delayed_work task_timer;
108 struct mxc_jpeg_slot_data {
111 struct mxc_jpeg_desc *desc; // enc/dec descriptor
112 struct mxc_jpeg_desc *cfg_desc; // configuration descriptor
113 void *cfg_stream_vaddr; // configuration bitstream virtual address
114 unsigned int cfg_stream_size;
115 dma_addr_t desc_handle;
116 dma_addr_t cfg_desc_handle; // configuration descriptor dma address
117 dma_addr_t cfg_stream_handle; // configuration bitstream dma address
120 struct mxc_jpeg_dev {
121 spinlock_t hw_lock; /* hardware access lock */
123 struct mutex lock; /* v4l2 ioctls serialization */
124 struct clk_bulk_data *clks;
126 struct platform_device *pdev;
128 void __iomem *base_reg;
129 struct v4l2_device v4l2_dev;
130 struct v4l2_m2m_dev *m2m_dev;
131 struct video_device *dec_vdev;
132 struct mxc_jpeg_slot_data slot_data;
134 struct device **pd_dev;
135 struct device_link **pd_link;
139 * struct mxc_jpeg_sof_comp - JPEG Start Of Frame component fields
141 * @v: vertical sampling
142 * @h: horizontal sampling
143 * @quantization_table_no: id of quantization table
145 struct mxc_jpeg_sof_comp {
149 u8 quantization_table_no;
152 #define MXC_JPEG_MAX_COMPONENTS 4
154 * struct mxc_jpeg_sof - JPEG Start Of Frame marker fields
155 * @length: Start of Frame length
156 * @precision: precision (bits per pixel per color component)
157 * @height: image height
158 * @width: image width
159 * @components_no: number of color components
160 * @comp: component fields for each color component
162 struct mxc_jpeg_sof {
167 struct mxc_jpeg_sof_comp comp[MXC_JPEG_MAX_COMPONENTS];
171 * struct mxc_jpeg_sos_comp - JPEG Start Of Scan component fields
173 * @huffman_table_no: id of the Huffman table
175 struct mxc_jpeg_sos_comp {
176 u8 id; /*component id*/
181 * struct mxc_jpeg_sos - JPEG Start Of Scan marker fields
182 * @length: Start of Frame length
183 * @components_no: number of color components
184 * @comp: SOS component fields for each color component
185 * @ignorable_bytes: ignorable bytes
187 struct mxc_jpeg_sos {
190 struct mxc_jpeg_sos_comp comp[MXC_JPEG_MAX_COMPONENTS];
191 u8 ignorable_bytes[3];