/* SPDX-License-Identifier: GPL-2.0-only */ 
 | 
/* 
 | 
 * Copyright (c) 2016 MediaTek Inc. 
 | 
 * Author: Ming Hsiu Tsai <minghsiu.tsai@mediatek.com> 
 | 
 *         Rick Chang <rick.chang@mediatek.com> 
 | 
 *         Xia Jiang <xia.jiang@mediatek.com> 
 | 
 */ 
 | 
  
 | 
#ifndef _MTK_JPEG_CORE_H 
 | 
#define _MTK_JPEG_CORE_H 
 | 
  
 | 
#include <linux/interrupt.h> 
 | 
#include <media/v4l2-ctrls.h> 
 | 
#include <media/v4l2-device.h> 
 | 
#include <media/v4l2-fh.h> 
 | 
  
 | 
#define MTK_JPEG_NAME        "mtk-jpeg" 
 | 
  
 | 
#define MTK_JPEG_COMP_MAX        3 
 | 
  
 | 
#define MTK_JPEG_FMT_FLAG_OUTPUT    BIT(0) 
 | 
#define MTK_JPEG_FMT_FLAG_CAPTURE    BIT(1) 
 | 
  
 | 
#define MTK_JPEG_MIN_WIDTH    32U 
 | 
#define MTK_JPEG_MIN_HEIGHT    32U 
 | 
#define MTK_JPEG_MAX_WIDTH    65535U 
 | 
#define MTK_JPEG_MAX_HEIGHT    65535U 
 | 
  
 | 
#define MTK_JPEG_DEFAULT_SIZEIMAGE    (1 * 1024 * 1024) 
 | 
  
 | 
#define MTK_JPEG_HW_TIMEOUT_MSEC 1000 
 | 
  
 | 
#define MTK_JPEG_MAX_EXIF_SIZE    (64 * 1024) 
 | 
  
 | 
/** 
 | 
 * enum mtk_jpeg_ctx_state - states of the context state machine 
 | 
 * @MTK_JPEG_INIT:        current state is initialized 
 | 
 * @MTK_JPEG_RUNNING:        current state is running 
 | 
 * @MTK_JPEG_SOURCE_CHANGE:    current state is source resolution change 
 | 
 */ 
 | 
enum mtk_jpeg_ctx_state { 
 | 
    MTK_JPEG_INIT = 0, 
 | 
    MTK_JPEG_RUNNING, 
 | 
    MTK_JPEG_SOURCE_CHANGE, 
 | 
}; 
 | 
  
 | 
/** 
 | 
 * mtk_jpeg_variant - mtk jpeg driver variant 
 | 
 * @clks:            clock names 
 | 
 * @num_clks:            numbers of clock 
 | 
 * @format:            jpeg driver's internal color format 
 | 
 * @num_format:            number of format 
 | 
 * @qops:            the callback of jpeg vb2_ops 
 | 
 * @irq_handler:        jpeg irq handler callback 
 | 
 * @hw_reset:            jpeg hardware reset callback 
 | 
 * @m2m_ops:            the callback of jpeg v4l2_m2m_ops 
 | 
 * @dev_name:            jpeg device name 
 | 
 * @ioctl_ops:            the callback of jpeg v4l2_ioctl_ops 
 | 
 * @out_q_default_fourcc:    output queue default fourcc 
 | 
 * @cap_q_default_fourcc:    capture queue default fourcc 
 | 
 */ 
 | 
struct mtk_jpeg_variant { 
 | 
    struct clk_bulk_data *clks; 
 | 
    int num_clks; 
 | 
    struct mtk_jpeg_fmt *formats; 
 | 
    int num_formats; 
 | 
    const struct vb2_ops *qops; 
 | 
    irqreturn_t (*irq_handler)(int irq, void *priv); 
 | 
    void (*hw_reset)(void __iomem *base); 
 | 
    const struct v4l2_m2m_ops *m2m_ops; 
 | 
    const char *dev_name; 
 | 
    const struct v4l2_ioctl_ops *ioctl_ops; 
 | 
    u32 out_q_default_fourcc; 
 | 
    u32 cap_q_default_fourcc; 
 | 
}; 
 | 
  
 | 
/** 
 | 
 * struct mt_jpeg - JPEG IP abstraction 
 | 
 * @lock:        the mutex protecting this structure 
 | 
 * @hw_lock:        spinlock protecting the hw device resource 
 | 
 * @workqueue:        decode work queue 
 | 
 * @dev:        JPEG device 
 | 
 * @v4l2_dev:        v4l2 device for mem2mem mode 
 | 
 * @m2m_dev:        v4l2 mem2mem device data 
 | 
 * @alloc_ctx:        videobuf2 memory allocator's context 
 | 
 * @vdev:        video device node for jpeg mem2mem mode 
 | 
 * @reg_base:        JPEG registers mapping 
 | 
 * @larb:        SMI device 
 | 
 * @job_timeout_work:    IRQ timeout structure 
 | 
 * @variant:        driver variant to be used 
 | 
 */ 
 | 
struct mtk_jpeg_dev { 
 | 
    struct mutex        lock; 
 | 
    spinlock_t        hw_lock; 
 | 
    struct workqueue_struct    *workqueue; 
 | 
    struct device        *dev; 
 | 
    struct v4l2_device    v4l2_dev; 
 | 
    struct v4l2_m2m_dev    *m2m_dev; 
 | 
    void            *alloc_ctx; 
 | 
    struct video_device    *vdev; 
 | 
    void __iomem        *reg_base; 
 | 
    struct device        *larb; 
 | 
    struct delayed_work job_timeout_work; 
 | 
    const struct mtk_jpeg_variant *variant; 
 | 
}; 
 | 
  
 | 
/** 
 | 
 * struct jpeg_fmt - driver's internal color format data 
 | 
 * @fourcc:    the fourcc code, 0 if not applicable 
 | 
 * @hw_format:    hardware format value 
 | 
 * @h_sample:    horizontal sample count of plane in 4 * 4 pixel image 
 | 
 * @v_sample:    vertical sample count of plane in 4 * 4 pixel image 
 | 
 * @colplanes:    number of color planes (1 for packed formats) 
 | 
 * @h_align:    horizontal alignment order (align to 2^h_align) 
 | 
 * @v_align:    vertical alignment order (align to 2^v_align) 
 | 
 * @flags:    flags describing format applicability 
 | 
 */ 
 | 
struct mtk_jpeg_fmt { 
 | 
    u32    fourcc; 
 | 
    u32    hw_format; 
 | 
    int    h_sample[VIDEO_MAX_PLANES]; 
 | 
    int    v_sample[VIDEO_MAX_PLANES]; 
 | 
    int    colplanes; 
 | 
    int    h_align; 
 | 
    int    v_align; 
 | 
    u32    flags; 
 | 
}; 
 | 
  
 | 
/** 
 | 
 * mtk_jpeg_q_data - parameters of one queue 
 | 
 * @fmt:      driver-specific format of this queue 
 | 
 * @pix_mp:      multiplanar format 
 | 
 * @enc_crop_rect:    jpeg encoder crop information 
 | 
 */ 
 | 
struct mtk_jpeg_q_data { 
 | 
    struct mtk_jpeg_fmt    *fmt; 
 | 
    struct v4l2_pix_format_mplane pix_mp; 
 | 
    struct v4l2_rect enc_crop_rect; 
 | 
}; 
 | 
  
 | 
/** 
 | 
 * mtk_jpeg_ctx - the device context data 
 | 
 * @jpeg:        JPEG IP device for this context 
 | 
 * @out_q:        source (output) queue information 
 | 
 * @cap_q:        destination (capture) queue queue information 
 | 
 * @fh:            V4L2 file handle 
 | 
 * @state:        state of the context 
 | 
 * @enable_exif:    enable exif mode of jpeg encoder 
 | 
 * @enc_quality:    jpeg encoder quality 
 | 
 * @restart_interval:    jpeg encoder restart interval 
 | 
 * @ctrl_hdl:        controls handler 
 | 
 */ 
 | 
struct mtk_jpeg_ctx { 
 | 
    struct mtk_jpeg_dev        *jpeg; 
 | 
    struct mtk_jpeg_q_data        out_q; 
 | 
    struct mtk_jpeg_q_data        cap_q; 
 | 
    struct v4l2_fh            fh; 
 | 
    enum mtk_jpeg_ctx_state        state; 
 | 
    bool enable_exif; 
 | 
    u8 enc_quality; 
 | 
    u8 restart_interval; 
 | 
    struct v4l2_ctrl_handler ctrl_hdl; 
 | 
}; 
 | 
  
 | 
#endif /* _MTK_JPEG_CORE_H */ 
 |