1 /* SPDX-License-Identifier: GPL-2.0-only */
3 * Copyright (c) 2016 MediaTek Inc.
4 * Author: Ming Hsiu Tsai <minghsiu.tsai@mediatek.com>
5 * Rick Chang <rick.chang@mediatek.com>
6 * Xia Jiang <xia.jiang@mediatek.com>
9 #ifndef _MTK_JPEG_CORE_H
10 #define _MTK_JPEG_CORE_H
12 #include <linux/interrupt.h>
13 #include <media/v4l2-ctrls.h>
14 #include <media/v4l2-device.h>
15 #include <media/v4l2-fh.h>
17 #define MTK_JPEG_NAME "mtk-jpeg"
19 #define MTK_JPEG_COMP_MAX 3
21 #define MTK_JPEG_FMT_FLAG_OUTPUT BIT(0)
22 #define MTK_JPEG_FMT_FLAG_CAPTURE BIT(1)
24 #define MTK_JPEG_MIN_WIDTH 32U
25 #define MTK_JPEG_MIN_HEIGHT 32U
26 #define MTK_JPEG_MAX_WIDTH 65535U
27 #define MTK_JPEG_MAX_HEIGHT 65535U
29 #define MTK_JPEG_DEFAULT_SIZEIMAGE (1 * 1024 * 1024)
31 #define MTK_JPEG_HW_TIMEOUT_MSEC 1000
33 #define MTK_JPEG_MAX_EXIF_SIZE (64 * 1024)
36 * enum mtk_jpeg_ctx_state - states of the context state machine
37 * @MTK_JPEG_INIT: current state is initialized
38 * @MTK_JPEG_RUNNING: current state is running
39 * @MTK_JPEG_SOURCE_CHANGE: current state is source resolution change
41 enum mtk_jpeg_ctx_state {
44 MTK_JPEG_SOURCE_CHANGE,
48 * mtk_jpeg_variant - mtk jpeg driver variant
50 * @num_clks: numbers of clock
51 * @format: jpeg driver's internal color format
52 * @num_format: number of format
53 * @qops: the callback of jpeg vb2_ops
54 * @irq_handler: jpeg irq handler callback
55 * @hw_reset: jpeg hardware reset callback
56 * @m2m_ops: the callback of jpeg v4l2_m2m_ops
57 * @dev_name: jpeg device name
58 * @ioctl_ops: the callback of jpeg v4l2_ioctl_ops
59 * @out_q_default_fourcc: output queue default fourcc
60 * @cap_q_default_fourcc: capture queue default fourcc
62 struct mtk_jpeg_variant {
63 struct clk_bulk_data *clks;
65 struct mtk_jpeg_fmt *formats;
67 const struct vb2_ops *qops;
68 irqreturn_t (*irq_handler)(int irq, void *priv);
69 void (*hw_reset)(void __iomem *base);
70 const struct v4l2_m2m_ops *m2m_ops;
72 const struct v4l2_ioctl_ops *ioctl_ops;
73 u32 out_q_default_fourcc;
74 u32 cap_q_default_fourcc;
78 * struct mt_jpeg - JPEG IP abstraction
79 * @lock: the mutex protecting this structure
80 * @hw_lock: spinlock protecting the hw device resource
81 * @workqueue: decode work queue
83 * @v4l2_dev: v4l2 device for mem2mem mode
84 * @m2m_dev: v4l2 mem2mem device data
85 * @alloc_ctx: videobuf2 memory allocator's context
86 * @vdev: video device node for jpeg mem2mem mode
87 * @reg_base: JPEG registers mapping
89 * @job_timeout_work: IRQ timeout structure
90 * @variant: driver variant to be used
95 struct workqueue_struct *workqueue;
97 struct v4l2_device v4l2_dev;
98 struct v4l2_m2m_dev *m2m_dev;
100 struct video_device *vdev;
101 void __iomem *reg_base;
103 struct delayed_work job_timeout_work;
104 const struct mtk_jpeg_variant *variant;
108 * struct jpeg_fmt - driver's internal color format data
109 * @fourcc: the fourcc code, 0 if not applicable
110 * @hw_format: hardware format value
111 * @h_sample: horizontal sample count of plane in 4 * 4 pixel image
112 * @v_sample: vertical sample count of plane in 4 * 4 pixel image
113 * @colplanes: number of color planes (1 for packed formats)
114 * @h_align: horizontal alignment order (align to 2^h_align)
115 * @v_align: vertical alignment order (align to 2^v_align)
116 * @flags: flags describing format applicability
118 struct mtk_jpeg_fmt {
121 int h_sample[VIDEO_MAX_PLANES];
122 int v_sample[VIDEO_MAX_PLANES];
130 * mtk_jpeg_q_data - parameters of one queue
131 * @fmt: driver-specific format of this queue
132 * @pix_mp: multiplanar format
133 * @enc_crop_rect: jpeg encoder crop information
135 struct mtk_jpeg_q_data {
136 struct mtk_jpeg_fmt *fmt;
137 struct v4l2_pix_format_mplane pix_mp;
138 struct v4l2_rect enc_crop_rect;
142 * mtk_jpeg_ctx - the device context data
143 * @jpeg: JPEG IP device for this context
144 * @out_q: source (output) queue information
145 * @cap_q: destination (capture) queue queue information
146 * @fh: V4L2 file handle
147 * @state: state of the context
148 * @enable_exif: enable exif mode of jpeg encoder
149 * @enc_quality: jpeg encoder quality
150 * @restart_interval: jpeg encoder restart interval
151 * @ctrl_hdl: controls handler
153 struct mtk_jpeg_ctx {
154 struct mtk_jpeg_dev *jpeg;
155 struct mtk_jpeg_q_data out_q;
156 struct mtk_jpeg_q_data cap_q;
158 enum mtk_jpeg_ctx_state state;
162 struct v4l2_ctrl_handler ctrl_hdl;
165 #endif /* _MTK_JPEG_CORE_H */