linux/drivers/media/platform/s5p-jpeg/jpeg-core.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0-only */
   2/* linux/drivers/media/platform/s5p-jpeg/jpeg-core.h
   3 *
   4 * Copyright (c) 2011 Samsung Electronics Co., Ltd.
   5 *              http://www.samsung.com
   6 *
   7 * Author: Andrzej Pietrasiewicz <andrzejtp2010@gmail.com>
   8 */
   9
  10#ifndef JPEG_CORE_H_
  11#define JPEG_CORE_H_
  12
  13#include <linux/interrupt.h>
  14#include <media/v4l2-device.h>
  15#include <media/v4l2-fh.h>
  16#include <media/v4l2-ctrls.h>
  17
  18#define S5P_JPEG_M2M_NAME               "s5p-jpeg"
  19
  20#define JPEG_MAX_CLOCKS                 4
  21
  22/* JPEG compression quality setting */
  23#define S5P_JPEG_COMPR_QUAL_BEST        0
  24#define S5P_JPEG_COMPR_QUAL_WORST       3
  25
  26/* JPEG RGB to YCbCr conversion matrix coefficients */
  27#define S5P_JPEG_COEF11                 0x4d
  28#define S5P_JPEG_COEF12                 0x97
  29#define S5P_JPEG_COEF13                 0x1e
  30#define S5P_JPEG_COEF21                 0x2c
  31#define S5P_JPEG_COEF22                 0x57
  32#define S5P_JPEG_COEF23                 0x83
  33#define S5P_JPEG_COEF31                 0x83
  34#define S5P_JPEG_COEF32                 0x6e
  35#define S5P_JPEG_COEF33                 0x13
  36
  37#define EXYNOS3250_IRQ_TIMEOUT          0x10000000
  38
  39/* a selection of JPEG markers */
  40#define TEM                             0x01
  41#define SOF0                            0xc0
  42#define DHT                             0xc4
  43#define RST                             0xd0
  44#define SOI                             0xd8
  45#define EOI                             0xd9
  46#define SOS                             0xda
  47#define DQT                             0xdb
  48#define DHP                             0xde
  49
  50/* Flags that indicate a format can be used for capture/output */
  51#define SJPEG_FMT_FLAG_ENC_CAPTURE      (1 << 0)
  52#define SJPEG_FMT_FLAG_ENC_OUTPUT       (1 << 1)
  53#define SJPEG_FMT_FLAG_DEC_CAPTURE      (1 << 2)
  54#define SJPEG_FMT_FLAG_DEC_OUTPUT       (1 << 3)
  55#define SJPEG_FMT_FLAG_S5P              (1 << 4)
  56#define SJPEG_FMT_FLAG_EXYNOS3250       (1 << 5)
  57#define SJPEG_FMT_FLAG_EXYNOS4          (1 << 6)
  58#define SJPEG_FMT_RGB                   (1 << 7)
  59#define SJPEG_FMT_NON_RGB               (1 << 8)
  60
  61#define S5P_JPEG_ENCODE         0
  62#define S5P_JPEG_DECODE         1
  63#define S5P_JPEG_DISABLE        -1
  64
  65#define FMT_TYPE_OUTPUT         0
  66#define FMT_TYPE_CAPTURE        1
  67
  68#define SJPEG_SUBSAMPLING_444   0x11
  69#define SJPEG_SUBSAMPLING_422   0x21
  70#define SJPEG_SUBSAMPLING_420   0x22
  71
  72#define S5P_JPEG_MAX_MARKER     4
  73
  74/* Version numbers */
  75enum sjpeg_version {
  76        SJPEG_S5P,
  77        SJPEG_EXYNOS3250,
  78        SJPEG_EXYNOS4,
  79        SJPEG_EXYNOS5420,
  80        SJPEG_EXYNOS5433,
  81};
  82
  83enum exynos4_jpeg_result {
  84        OK_ENC_OR_DEC,
  85        ERR_PROT,
  86        ERR_DEC_INVALID_FORMAT,
  87        ERR_MULTI_SCAN,
  88        ERR_FRAME,
  89        ERR_UNKNOWN,
  90};
  91
  92enum  exynos4_jpeg_img_quality_level {
  93        QUALITY_LEVEL_1 = 0,    /* high */
  94        QUALITY_LEVEL_2,
  95        QUALITY_LEVEL_3,
  96        QUALITY_LEVEL_4,        /* low */
  97};
  98
  99enum s5p_jpeg_ctx_state {
 100        JPEGCTX_RUNNING = 0,
 101        JPEGCTX_RESOLUTION_CHANGE,
 102};
 103
 104/**
 105 * struct s5p_jpeg - JPEG IP abstraction
 106 * @lock:               the mutex protecting this structure
 107 * @slock:              spinlock protecting the device contexts
 108 * @v4l2_dev:           v4l2 device for mem2mem mode
 109 * @vfd_encoder:        video device node for encoder mem2mem mode
 110 * @vfd_decoder:        video device node for decoder mem2mem mode
 111 * @m2m_dev:            v4l2 mem2mem device data
 112 * @regs:               JPEG IP registers mapping
 113 * @irq:                JPEG IP irq
 114 * @irq_ret:            JPEG IP irq result value
 115 * @clocks:             JPEG IP clock(s)
 116 * @dev:                JPEG IP struct device
 117 * @variant:            driver variant to be used
 118 * @irq_status:         interrupt flags set during single encode/decode
 119 *                      operation
 120 */
 121struct s5p_jpeg {
 122        struct mutex            lock;
 123        spinlock_t              slock;
 124
 125        struct v4l2_device      v4l2_dev;
 126        struct video_device     *vfd_encoder;
 127        struct video_device     *vfd_decoder;
 128        struct v4l2_m2m_dev     *m2m_dev;
 129
 130        void __iomem            *regs;
 131        unsigned int            irq;
 132        enum exynos4_jpeg_result irq_ret;
 133        struct clk              *clocks[JPEG_MAX_CLOCKS];
 134        struct device           *dev;
 135        struct s5p_jpeg_variant *variant;
 136        u32                     irq_status;
 137};
 138
 139struct s5p_jpeg_variant {
 140        unsigned int            version;
 141        unsigned int            fmt_ver_flag;
 142        unsigned int            hw3250_compat:1;
 143        unsigned int            htbl_reinit:1;
 144        unsigned int            hw_ex4_compat:1;
 145        struct v4l2_m2m_ops     *m2m_ops;
 146        irqreturn_t             (*jpeg_irq)(int irq, void *priv);
 147        const char              *clk_names[JPEG_MAX_CLOCKS];
 148        int                     num_clocks;
 149};
 150
 151/**
 152 * struct s5p_jpeg_fmt - driver's internal color format data
 153 * @fourcc:     the fourcc code, 0 if not applicable
 154 * @depth:      number of bits per pixel
 155 * @colplanes:  number of color planes (1 for packed formats)
 156 * @memplanes:  number of memory planes (1 for packed formats)
 157 * @h_align:    horizontal alignment order (align to 2^h_align)
 158 * @v_align:    vertical alignment order (align to 2^v_align)
 159 * @subsampling:subsampling of a raw format or a JPEG
 160 * @flags:      flags describing format applicability
 161 */
 162struct s5p_jpeg_fmt {
 163        u32     fourcc;
 164        int     depth;
 165        int     colplanes;
 166        int     memplanes;
 167        int     h_align;
 168        int     v_align;
 169        int     subsampling;
 170        u32     flags;
 171};
 172
 173/**
 174 * struct s5p_jpeg_marker - collection of markers from jpeg header
 175 * @marker:     markers' positions relative to the buffer beginning
 176 * @len:        markers' payload lengths (without length field)
 177 * @n:          number of markers in collection
 178 */
 179struct s5p_jpeg_marker {
 180        u32     marker[S5P_JPEG_MAX_MARKER];
 181        u32     len[S5P_JPEG_MAX_MARKER];
 182        u32     n;
 183};
 184
 185/**
 186 * struct s5p_jpeg_q_data - parameters of one queue
 187 * @fmt:        driver-specific format of this queue
 188 * @w:          image width
 189 * @h:          image height
 190 * @sos:        SOS marker's position relative to the buffer beginning
 191 * @dht:        DHT markers' positions relative to the buffer beginning
 192 * @dqt:        DQT markers' positions relative to the buffer beginning
 193 * @sof:        SOF0 marker's position relative to the buffer beginning
 194 * @sof_len:    SOF0 marker's payload length (without length field itself)
 195 * @size:       image buffer size in bytes
 196 */
 197struct s5p_jpeg_q_data {
 198        struct s5p_jpeg_fmt     *fmt;
 199        u32                     w;
 200        u32                     h;
 201        u32                     sos;
 202        struct s5p_jpeg_marker  dht;
 203        struct s5p_jpeg_marker  dqt;
 204        u32                     sof;
 205        u32                     sof_len;
 206        u32                     size;
 207};
 208
 209/**
 210 * struct s5p_jpeg_ctx - the device context data
 211 * @jpeg:               JPEG IP device for this context
 212 * @mode:               compression (encode) operation or decompression (decode)
 213 * @compr_quality:      destination image quality in compression (encode) mode
 214 * @restart_interval:   JPEG restart interval for JPEG encoding
 215 * @subsampling:        subsampling of a raw format or a JPEG
 216 * @out_q:              source (output) queue information
 217 * @cap_q:              destination (capture) queue queue information
 218 * @scale_factor:       scale factor for JPEG decoding
 219 * @crop_rect:          a rectangle representing crop area of the output buffer
 220 * @fh:                 V4L2 file handle
 221 * @hdr_parsed:         set if header has been parsed during decompression
 222 * @crop_altered:       set if crop rectangle has been altered by the user space
 223 * @ctrl_handler:       controls handler
 224 * @state:              state of the context
 225 */
 226struct s5p_jpeg_ctx {
 227        struct s5p_jpeg         *jpeg;
 228        unsigned int            mode;
 229        unsigned short          compr_quality;
 230        unsigned short          restart_interval;
 231        unsigned short          subsampling;
 232        struct s5p_jpeg_q_data  out_q;
 233        struct s5p_jpeg_q_data  cap_q;
 234        unsigned int            scale_factor;
 235        struct v4l2_rect        crop_rect;
 236        struct v4l2_fh          fh;
 237        bool                    hdr_parsed;
 238        bool                    crop_altered;
 239        struct v4l2_ctrl_handler ctrl_handler;
 240        enum s5p_jpeg_ctx_state state;
 241};
 242
 243/**
 244 * struct s5p_jpeg_buffer - description of memory containing input JPEG data
 245 * @size:       buffer size
 246 * @curr:       current position in the buffer
 247 * @data:       pointer to the data
 248 */
 249struct s5p_jpeg_buffer {
 250        unsigned long size;
 251        unsigned long curr;
 252        unsigned long data;
 253};
 254
 255/**
 256 * struct s5p_jpeg_addr - JPEG converter physical address set for DMA
 257 * @y:   luminance plane physical address
 258 * @cb:  Cb plane physical address
 259 * @cr:  Cr plane physical address
 260 */
 261struct s5p_jpeg_addr {
 262        u32     y;
 263        u32     cb;
 264        u32     cr;
 265};
 266
 267#endif /* JPEG_CORE_H */
 268