Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
1/* SPDX-License-Identifier: GPL-2.0 */
2/*
3 * Imagination E5010 JPEG Encoder driver.
4 *
5 * Copyright (C) 2023 Texas Instruments Incorporated - https://www.ti.com/
6 *
7 * Author: David Huang <d-huang@ti.com>
8 * Author: Devarsh Thakkar <devarsht@ti.com>
9 */
10
11#include <media/v4l2-ctrls.h>
12#include <media/v4l2-device.h>
13#include <media/v4l2-fh.h>
14
15#ifndef _E5010_JPEG_ENC_H
16#define _E5010_JPEG_ENC_H
17
18#define MAX_PLANES 2
19#define HEADER_SIZE 0x025D
20#define MIN_DIMENSION 64
21#define MAX_DIMENSION 8192
22#define DEFAULT_WIDTH 640
23#define DEFAULT_HEIGHT 480
24#define E5010_MODULE_NAME "e5010"
25#define JPEG_MAX_BYTES_PER_PIXEL 2
26
27/* JPEG marker definitions */
28#define START_OF_IMAGE 0xFFD8
29#define SOF_BASELINE_DCT 0xFFC0
30#define END_OF_IMAGE 0xFFD9
31#define START_OF_SCAN 0xFFDA
32
33/* Definitions for the huffman table specification in the Marker segment */
34#define DHT_MARKER 0xFFC4
35#define LH_DC 0x001F
36#define LH_AC 0x00B5
37
38/* Definitions for the quantization table specification in the Marker segment */
39#define DQT_MARKER 0xFFDB
40#define ACMAX 0x03FF
41#define DCMAX 0x07FF
42
43/* Length and precision of the quantization table parameters */
44#define LQPQ 0x00430
45#define QMAX 255
46
47/* Misc JPEG header definitions */
48#define UC_NUM_COMP 3
49#define PRECISION 8
50#define HORZ_SAMPLING_FACTOR (2 << 4)
51#define VERT_SAMPLING_FACTOR_422 1
52#define VERT_SAMPLING_FACTOR_420 2
53#define COMPONENTS_IN_SCAN 3
54#define PELS_IN_BLOCK 64
55
56/* Used for Qp table generation */
57#define LUMINOSITY 10
58#define CONTRAST 1
59#define INCREASE 2
60#define QP_TABLE_SIZE (8 * 8)
61#define QP_TABLE_FIELD_OFFSET 0x04
62
63/*
64 * vb2 queue structure
65 * contains queue data information
66 *
67 * @fmt: format info
68 * @width: frame width
69 * @height: frame height
70 * @bytesperline: bytes per line in memory
71 * @size_image: image size in memory
72 */
73struct e5010_q_data {
74 struct e5010_fmt *fmt;
75 u32 width;
76 u32 height;
77 u32 width_adjusted;
78 u32 height_adjusted;
79 u32 sizeimage[MAX_PLANES];
80 u32 bytesperline[MAX_PLANES];
81 u32 sequence;
82 struct v4l2_rect crop;
83 bool crop_set;
84};
85
86/*
87 * Driver device structure
88 * Holds all memory handles and global parameters
89 * Shared by all instances
90 */
91struct e5010_dev {
92 struct device *dev;
93 struct v4l2_device v4l2_dev;
94 struct v4l2_m2m_dev *m2m_dev;
95 struct video_device *vdev;
96 void __iomem *core_base;
97 void __iomem *mmu_base;
98 struct clk *clk;
99 struct e5010_context *last_context_run;
100 /* Protect access to device data */
101 struct mutex mutex;
102 /* Protect access to hardware*/
103 spinlock_t hw_lock;
104};
105
106/*
107 * Driver context structure
108 * One of these exists for every m2m context
109 * Holds context specific data
110 */
111struct e5010_context {
112 struct v4l2_fh fh;
113 struct e5010_dev *e5010;
114 struct e5010_q_data out_queue;
115 struct e5010_q_data cap_queue;
116 int quality;
117 bool update_qp;
118 struct v4l2_ctrl_handler ctrl_handler;
119 u8 luma_qp[QP_TABLE_SIZE];
120 u8 chroma_qp[QP_TABLE_SIZE];
121};
122
123static inline struct e5010_context *to_e5010_context(struct file *filp)
124{
125 return container_of(file_to_v4l2_fh(filp), struct e5010_context, fh);
126}
127
128/*
129 * Buffer structure
130 * Contains info for all buffers
131 */
132struct e5010_buffer {
133 struct v4l2_m2m_buffer buffer;
134};
135
136enum {
137 CHROMA_ORDER_CB_CR = 0, //UV ordering
138 CHROMA_ORDER_CR_CB = 1, //VU ordering
139};
140
141enum {
142 SUBSAMPLING_420 = 1,
143 SUBSAMPLING_422 = 2,
144};
145
146/*
147 * e5010 format structure
148 * contains format information
149 */
150struct e5010_fmt {
151 u32 fourcc;
152 unsigned int num_planes;
153 unsigned int type;
154 u32 subsampling;
155 u32 chroma_order;
156 const struct v4l2_frmsize_stepwise frmsize;
157};
158
159/*
160 * struct e5010_ctrl - contains info for each supported v4l2 control
161 */
162struct e5010_ctrl {
163 unsigned int cid;
164 enum v4l2_ctrl_type type;
165 unsigned char name[32];
166 int minimum;
167 int maximum;
168 int step;
169 int default_value;
170 unsigned char compound;
171};
172
173#endif