/* SPDX-License-Identifier: GPL-2.0 */ /* * Imagination E5010 JPEG Encoder driver. * * Copyright (C) 2023 Texas Instruments Incorporated - https://www.ti.com/ * * Author: David Huang * Author: Devarsh Thakkar */ #include #include #include #ifndef _E5010_JPEG_ENC_H #define _E5010_JPEG_ENC_H #define MAX_PLANES 2 #define HEADER_SIZE 0x025D #define MIN_DIMENSION 64 #define MAX_DIMENSION 8192 #define DEFAULT_WIDTH 640 #define DEFAULT_HEIGHT 480 #define E5010_MODULE_NAME "e5010" #define JPEG_MAX_BYTES_PER_PIXEL 2 /* JPEG marker definitions */ #define START_OF_IMAGE 0xFFD8 #define SOF_BASELINE_DCT 0xFFC0 #define END_OF_IMAGE 0xFFD9 #define START_OF_SCAN 0xFFDA /* Definitions for the huffman table specification in the Marker segment */ #define DHT_MARKER 0xFFC4 #define LH_DC 0x001F #define LH_AC 0x00B5 /* Definitions for the quantization table specification in the Marker segment */ #define DQT_MARKER 0xFFDB #define ACMAX 0x03FF #define DCMAX 0x07FF /* Length and precision of the quantization table parameters */ #define LQPQ 0x00430 #define QMAX 255 /* Misc JPEG header definitions */ #define UC_NUM_COMP 3 #define PRECISION 8 #define HORZ_SAMPLING_FACTOR (2 << 4) #define VERT_SAMPLING_FACTOR_422 1 #define VERT_SAMPLING_FACTOR_420 2 #define COMPONENTS_IN_SCAN 3 #define PELS_IN_BLOCK 64 /* Used for Qp table generation */ #define LUMINOSITY 10 #define CONTRAST 1 #define INCREASE 2 #define QP_TABLE_SIZE (8 * 8) #define QP_TABLE_FIELD_OFFSET 0x04 /* * vb2 queue structure * contains queue data information * * @fmt: format info * @width: frame width * @height: frame height * @bytesperline: bytes per line in memory * @size_image: image size in memory */ struct e5010_q_data { struct e5010_fmt *fmt; u32 width; u32 height; u32 width_adjusted; u32 height_adjusted; u32 sizeimage[MAX_PLANES]; u32 bytesperline[MAX_PLANES]; u32 sequence; struct v4l2_rect crop; bool crop_set; }; /* * Driver device structure * Holds all memory handles and global parameters * Shared by all instances */ struct e5010_dev { struct device *dev; struct v4l2_device v4l2_dev; struct v4l2_m2m_dev *m2m_dev; struct video_device *vdev; void __iomem *core_base; void __iomem *mmu_base; struct clk *clk; struct e5010_context *last_context_run; /* Protect access to device data */ struct mutex mutex; /* Protect access to hardware*/ spinlock_t hw_lock; }; /* * Driver context structure * One of these exists for every m2m context * Holds context specific data */ struct e5010_context { struct v4l2_fh fh; struct e5010_dev *e5010; struct e5010_q_data out_queue; struct e5010_q_data cap_queue; int quality; bool update_qp; struct v4l2_ctrl_handler ctrl_handler; u8 luma_qp[QP_TABLE_SIZE]; u8 chroma_qp[QP_TABLE_SIZE]; }; /* * Buffer structure * Contains info for all buffers */ struct e5010_buffer { struct v4l2_m2m_buffer buffer; }; enum { CHROMA_ORDER_CB_CR = 0, //UV ordering CHROMA_ORDER_CR_CB = 1, //VU ordering }; enum { SUBSAMPLING_420 = 1, SUBSAMPLING_422 = 2, }; /* * e5010 format structure * contains format information */ struct e5010_fmt { u32 fourcc; unsigned int num_planes; unsigned int type; u32 subsampling; u32 chroma_order; const struct v4l2_frmsize_stepwise frmsize; }; /* * struct e5010_ctrl - contains info for each supported v4l2 control */ struct e5010_ctrl { unsigned int cid; enum v4l2_ctrl_type type; unsigned char name[32]; int minimum; int maximum; int step; int default_value; unsigned char compound; }; #endif