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 * struct mtk_jpeg_variant - mtk jpeg driver variant
50 * @num_clks: numbers of clock
51 * @formats: jpeg driver's internal color format
52 * @num_formats: number of formats
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 mtk_jpeg_dev - 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
88 * @job_timeout_work: IRQ timeout structure
89 * @variant: driver variant to be used
94 struct workqueue_struct *workqueue;
96 struct v4l2_device v4l2_dev;
97 struct v4l2_m2m_dev *m2m_dev;
99 struct video_device *vdev;
100 void __iomem *reg_base;
101 struct delayed_work job_timeout_work;
102 const struct mtk_jpeg_variant *variant;
106 * struct mtk_jpeg_fmt - driver's internal color format data
107 * @fourcc: the fourcc code, 0 if not applicable
108 * @hw_format: hardware format value
109 * @h_sample: horizontal sample count of plane in 4 * 4 pixel image
110 * @v_sample: vertical sample count of plane in 4 * 4 pixel image
111 * @colplanes: number of color planes (1 for packed formats)
112 * @h_align: horizontal alignment order (align to 2^h_align)
113 * @v_align: vertical alignment order (align to 2^v_align)
114 * @flags: flags describing format applicability
116 struct mtk_jpeg_fmt {
119 int h_sample[VIDEO_MAX_PLANES];
120 int v_sample[VIDEO_MAX_PLANES];
128 * struct mtk_jpeg_q_data - parameters of one queue
129 * @fmt: driver-specific format of this queue
130 * @pix_mp: multiplanar format
131 * @enc_crop_rect: jpeg encoder crop information
133 struct mtk_jpeg_q_data {
134 struct mtk_jpeg_fmt *fmt;
135 struct v4l2_pix_format_mplane pix_mp;
136 struct v4l2_rect enc_crop_rect;
140 * struct mtk_jpeg_ctx - the device context data
141 * @jpeg: JPEG IP device for this context
142 * @out_q: source (output) queue information
143 * @cap_q: destination (capture) queue queue information
144 * @fh: V4L2 file handle
145 * @state: state of the context
146 * @enable_exif: enable exif mode of jpeg encoder
147 * @enc_quality: jpeg encoder quality
148 * @restart_interval: jpeg encoder restart interval
149 * @ctrl_hdl: controls handler
151 struct mtk_jpeg_ctx {
152 struct mtk_jpeg_dev *jpeg;
153 struct mtk_jpeg_q_data out_q;
154 struct mtk_jpeg_q_data cap_q;
156 enum mtk_jpeg_ctx_state state;
160 struct v4l2_ctrl_handler ctrl_hdl;
163 #endif /* _MTK_JPEG_CORE_H */