818 lines
20 KiB
C
Raw Permalink Normal View History

2025-05-10 21:58:58 +08:00
/*
*************************************************************************
* Rockchip driver for CIF ISP 1.0
* (Based on Intel driver for sofiaxxx)
*
* Copyright (C) 2015 Intel Mobile Communications GmbH
* Copyright (C) 2016 Fuzhou Rockchip Electronics Co., Ltd.
*
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*************************************************************************
*/
#ifndef _CIF_ISP10_H
#define _CIF_ISP10_H
#include <linux/platform_device.h>
#include "cif_isp10_pltfrm.h"
#include "cif_isp10_img_src.h"
#include "cif_isp10_isp.h"
#include <linux/platform_data/rk_isp10_platform.h>
#include <media/v4l2-device.h>
#include <media/v4l2-controls_rockchip.h>
#include <media/videobuf2-v4l2.h>
#include <linux/dma-iommu.h>
#include <drm/rockchip_drm.h>
#include <linux/dma-mapping.h>
#include <linux/dma-buf.h>
/*****************************************************************************/
#if IS_ENABLED(CONFIG_VIDEOBUF2_DMA_CONTIG)
#define CIF_ISP10_MODE_DMA_CONTIG 1
#endif
#if IS_ENABLED(CONFIG_VIDEOBUF2_DMA_SG)
#define CIF_ISP10_MODE_DMA_SG 1
#endif
#if !defined(CIF_ISP10_MODE_DMA_CONTIG) && \
!defined(CIF_ISP10_MODE_DMA_SG)
#error One of the videobuf buffer modes(COTING/SG) \
must be selected in the config
#endif
/* Definitions */
#define CONFIG_CIF_ISP_AUTO_UPD_CFG_BUG
#define CIF_ISP10_NUM_INPUTS 10
/* FORMAT */
#define MAX_NB_FORMATS 30
#define CONTRAST_DEF 0x80
#define BRIGHTNESS_DEF 0x0
#define HUE_DEF 0x0
/*
* MIPI CSI2.0
*/
#define CSI2_DT_YUV420_8b (0x18)
#define CSI2_DT_YUV420_10b (0x19)
#define CSI2_DT_YUV422_8b (0x1E)
#define CSI2_DT_YUV422_10b (0x1F)
#define CSI2_DT_RGB565 (0x22)
#define CSI2_DT_RGB666 (0x23)
#define CSI2_DT_RGB888 (0x24)
#define CSI2_DT_RAW8 (0x2A)
#define CSI2_DT_RAW10 (0x2B)
#define CSI2_DT_RAW12 (0x2C)
enum cif_isp10_img_src_state {
CIF_ISP10_IMG_SRC_STATE_OFF = 0,
CIF_ISP10_IMG_SRC_STATE_SW_STNDBY = 1,
CIF_ISP10_IMG_SRC_STATE_STREAMING = 2
};
enum cif_isp10_state {
/* path not yet opened: */
CIF_ISP10_STATE_DISABLED = 0,
/* path opened but not yet configured: */
CIF_ISP10_STATE_INACTIVE = 1,
/* path opened and configured, ready for streaming: */
CIF_ISP10_STATE_READY = 2,
/* path is streaming: */
CIF_ISP10_STATE_STREAMING = 3
};
enum cif_isp10_pm_state {
CIF_ISP10_PM_STATE_OFF,
CIF_ISP10_PM_STATE_SUSPENDED,
CIF_ISP10_PM_STATE_SW_STNDBY,
CIF_ISP10_PM_STATE_STREAMING
};
enum cif_isp10_ispstate {
CIF_ISP10_STATE_IDLE = 0,
CIF_ISP10_STATE_RUNNING = 1,
CIF_ISP10_STATE_STOPPING = 2
};
enum cif_isp10_inp {
CIF_ISP10_INP_CSI = 0x10000000,
CIF_ISP10_INP_CPI = 0x20000000,
CIF_ISP10_INP_DMA = 0x30000000, /* DMA -> ISP */
CIF_ISP10_INP_DMA_IE = 0x31000000, /* DMA -> IE */
CIF_ISP10_INP_DMA_SP = 0x32000000, /* DMA -> SP */
CIF_ISP10_INP_DMA_MAX = 0x33000000,
CIF_ISP10_INP_MAX = 0x7fffffff
};
#define CIF_ISP10_INP_IS_DMA(inp) \
(((inp) & 0xf0000000) == CIF_ISP10_INP_DMA)
#define CIF_ISP10_INP_IS_MIPI(inp) \
(((inp) & 0xf0000000) == CIF_ISP10_INP_CSI)
#define CIF_ISP10_INP_IS_DVP(inp) \
(((inp) & 0xf0000000) == CIF_ISP10_INP_CPI)
#define CIF_ISP10_INP_NEED_ISP(inp) \
((inp) < CIF_ISP10_INP_DMA_IE)
#define CIF_ISP10_INP_DMA_CNT() \
((CIF_ISP10_INP_DMA_MAX -\
CIF_ISP10_INP_DMA) >> 24)
enum cif_isp10_pinctrl_state {
CIF_ISP10_PINCTRL_STATE_SLEEP,
CIF_ISP10_PINCTRL_STATE_INACTIVE,
CIF_ISP10_PINCTRL_STATE_DEFAULT,
CIF_ISP10_PINCTRL_STATE_ACTIVE
};
enum cif_isp10_flash_mode {
CIF_ISP10_FLASH_MODE_OFF,
CIF_ISP10_FLASH_MODE_FLASH,
CIF_ISP10_FLASH_MODE_TORCH,
};
enum cif_isp10_cid {
CIF_ISP10_CID_FLASH_MODE = 0,
CIF_ISP10_CID_EXPOSURE_TIME = 1,
CIF_ISP10_CID_ANALOG_GAIN = 2,
CIF_ISP10_CID_WB_TEMPERATURE = 3,
CIF_ISP10_CID_BLACK_LEVEL = 4,
CIF_ISP10_CID_AUTO_GAIN = 5,
CIF_ISP10_CID_AUTO_EXPOSURE = 6,
CIF_ISP10_CID_AUTO_WHITE_BALANCE = 7,
CIF_ISP10_CID_FOCUS_ABSOLUTE = 8,
CIF_ISP10_CID_AUTO_N_PRESET_WHITE_BALANCE = 9,
CIF_ISP10_CID_SCENE_MODE = 10,
CIF_ISP10_CID_SUPER_IMPOSE = 11,
CIF_ISP10_CID_JPEG_QUALITY = 12,
CIF_ISP10_CID_IMAGE_EFFECT = 13,
CIF_ISP10_CID_HFLIP = 14,
CIF_ISP10_CID_VFLIP = 15,
CIF_ISP10_CID_AUTO_FPS = 16,
CIF_ISP10_CID_VBLANKING = 17,
CIF_ISP10_CID_ISO_SENSITIVITY = 18,
CIF_ISP10_CID_MIN_BUFFER_FOR_CAPTURE = 19,
CIF_ISP10_CID_TEST_PATTERN = 20,
};
/* correspond to bit field values */
enum cif_isp10_image_effect {
CIF_ISP10_IE_BW = 0,
CIF_ISP10_IE_NEGATIVE = 1,
CIF_ISP10_IE_SEPIA = 2,
CIF_ISP10_IE_C_SEL = 3,
CIF_ISP10_IE_EMBOSS = 4,
CIF_ISP10_IE_SKETCH = 5,
CIF_ISP10_IE_NONE /* not a bit field value */
};
#define CIF_ISP10_PIX_FMT_MASK 0xf0000000
#define CIF_ISP10_PIX_FMT_MASK_BPP 0x0003f000
#define CIF_ISP10_PIX_FMT_YUV_MASK_CPLANES 0x00000003
#define CIF_ISP10_PIX_FMT_YUV_MASK_UVSWAP 0x00000004
#define CIF_ISP10_PIX_FMT_YUV_MASK_YCSWAP 0x00000008
#define CIF_ISP10_PIX_FMT_YUV_MASK_X 0x00000f00
#define CIF_ISP10_PIX_FMT_YUV_MASK_Y 0x000000f0
#define CIF_ISP10_PIX_FMT_RGB_MASK_PAT 0x000000f0
#define CIF_ISP10_PIX_FMT_BAYER_MASK_PAT 0x000000f0
#define CIF_ISP10_PIX_FMT_GET_BPP(pix_fmt) \
(((pix_fmt) & CIF_ISP10_PIX_FMT_MASK_BPP) >> 12)
#define cif_isp10_pix_fmt_set_bpp(pix_fmt, bpp) \
{ \
pix_fmt = (((pix_fmt) & ~CIF_ISP10_PIX_FMT_MASK_BPP) | \
(((bpp) << 12) & CIF_ISP10_PIX_FMT_MASK_BPP)); \
}
#define CIF_ISP10_PIX_FMT_YUV_GET_NUM_CPLANES(pix_fmt) \
((pix_fmt) & CIF_ISP10_PIX_FMT_YUV_MASK_CPLANES)
#define CIF_ISP10_PIX_FMT_YUV_IS_YC_SWAPPED(pix_fmt) \
((pix_fmt) & CIF_ISP10_PIX_FMT_YUV_MASK_YCSWAP)
#define CIF_ISP10_PIX_FMT_YUV_IS_UV_SWAPPED(pix_fmt) \
((pix_fmt) & CIF_ISP10_PIX_FMT_YUV_MASK_UVSWAP)
#define CIF_ISP10_PIX_FMT_YUV_GET_X_SUBS(pix_fmt) \
(((pix_fmt) & CIF_ISP10_PIX_FMT_YUV_MASK_X) >> 8)
#define CIF_ISP10_PIX_FMT_YUV_GET_Y_SUBS(pix_fmt) \
(((pix_fmt) & CIF_ISP10_PIX_FMT_YUV_MASK_Y) >> 4)
#define cif_isp10_pix_fmt_set_y_subs(pix_fmt, y_subs) \
{ \
pix_fmt = (((pix_fmt) & ~CIF_ISP10_PIX_FMT_YUV_MASK_Y) | \
((y_subs << 4) & CIF_ISP10_PIX_FMT_YUV_MASK_Y)); \
}
#define cif_isp10_pix_fmt_set_x_subs(pix_fmt, x_subs) \
{ \
pix_fmt = (((pix_fmt) & ~CIF_ISP10_PIX_FMT_YUV_MASK_X) | \
(((x_subs) << 8) & CIF_ISP10_PIX_FMT_YUV_MASK_X)); \
}
#define cif_isp10_pix_fmt_set_yc_swapped(pix_fmt, yc_swapped) \
{ \
pix_fmt = (((pix_fmt) & ~CIF_ISP10_PIX_FMT_YUV_MASK_YCSWAP) | \
(((yc_swapped) << 3) & \
CIF_ISP10_PIX_FMT_YUV_MASK_YCSWAP)); \
}
#define CIF_ISP10_PIX_FMT_BAYER_PAT_IS_BGGR(pix_fmt) \
(((pix_fmt) & CIF_ISP10_PIX_FMT_BAYER_MASK_PAT) == 0x0)
#define CIF_ISP10_PIX_FMT_BAYER_PAT_IS_GBRG(pix_fmt) \
(((pix_fmt) & CIF_ISP10_PIX_FMT_BAYER_MASK_PAT) == 0x10)
#define CIF_ISP10_PIX_FMT_BAYER_PAT_IS_GRBG(pix_fmt) \
(((pix_fmt) & CIF_ISP10_PIX_FMT_BAYER_MASK_PAT) == 0x20)
#define CIF_ISP10_PIX_FMT_BAYER_PAT_IS_RGGB(pix_fmt) \
(((pix_fmt) & CIF_ISP10_PIX_FMT_BAYER_MASK_PAT) == 0x30)
#define CIF_ISP10_PIX_FMT_IS_YUV(pix_fmt) \
(((pix_fmt) & CIF_ISP10_PIX_FMT_MASK) == 0x10000000)
#define CIF_ISP10_PIX_FMT_IS_RGB(pix_fmt) \
(((pix_fmt) & CIF_ISP10_PIX_FMT_MASK) == 0x20000000)
#define CIF_ISP10_PIX_FMT_IS_RAW_BAYER(pix_fmt) \
(((pix_fmt) & CIF_ISP10_PIX_FMT_MASK) == 0x30000000)
#define CIF_ISP10_PIX_FMT_IS_JPEG(pix_fmt) \
(((pix_fmt) & CIF_ISP10_PIX_FMT_MASK) == 0x40000000)
#define CIF_ISP10_PIX_FMT_IS_INTERLEAVED(pix_fmt) \
(!CIF_ISP10_PIX_FMT_IS_YUV(pix_fmt) ||\
!CIF_ISP10_PIX_FMT_YUV_GET_NUM_CPLANES(pix_fmt))
#define CIF_ISP10_PIX_FMT_IS_Y_ONLY(pix_fmt) \
((CIF_ISP10_PIX_FMT_IS_YUV(pix_fmt) == 1) && \
(CIF_ISP10_PIX_FMT_YUV_GET_X_SUBS(pix_fmt) == 0) && \
(CIF_ISP10_PIX_FMT_YUV_GET_Y_SUBS(pix_fmt) == 0) && \
(CIF_ISP10_PIX_FMT_YUV_IS_YC_SWAPPED(pix_fmt) == 0))
#define CIF_ISP10_IMG_SRC_DATA_NUM 6
enum cif_isp10_pix_fmt {
/* YUV */
CIF_YUV400 = 0x10008000,
CIF_YVU400 = 0x10008004,
CIF_Y10 = 0x1000a000,
CIF_Y12 = 0x10010000,
CIF_YUV420I = 0x1000c220,
CIF_YUV420SP = 0x1000c221, /* NV12 */
CIF_YUV420P = 0x1000c222,
CIF_YVU420I = 0x1000c224,
CIF_YVU420SP = 0x1000c225, /* NV21 */
CIF_YVU420P = 0x1000c226, /* YV12 */
CIF_YUV422I = 0x10010240,
CIF_YUV422SP = 0x10010241,
CIF_YUV422P = 0x10010242,
CIF_YVU422I = 0x10010244,
CIF_YVU422SP = 0x10010245,
CIF_YVU422P = 0x10010246,
CIF_YUV444I = 0x10018440,
CIF_YUV444SP = 0x10018441,
CIF_YUV444P = 0x10018442,
CIF_YVU444I = 0x10018444,
CIF_YVU444SP = 0x10018445,
CIF_YVU444P = 0x10018446,
CIF_UYV400 = 0x10008008,
CIF_UYV420I = 0x1000c228,
CIF_UYV420SP = 0x1000c229,
CIF_UYV420P = 0x1000c22a,
CIF_VYU420I = 0x1000c22c,
CIF_VYU420SP = 0x1000c22d,
CIF_VYU420P = 0x1000c22e,
CIF_UYV422I = 0x10010248,
CIF_UYV422SP = 0x10010249,
CIF_UYV422P = 0x1001024a,
CIF_VYU422I = 0x1001024c,
CIF_VYU422SP = 0x1001024d,
CIF_VYU422P = 0x1001024e,
CIF_UYV444I = 0x10018448,
CIF_UYV444SP = 0x10018449,
CIF_UYV444P = 0x1001844a,
CIF_VYU444I = 0x1001844c,
CIF_VYU444SP = 0x1001844d,
CIF_VYU444P = 0x1001844e,
/* RGB */
CIF_RGB565 = 0x20010000,
CIF_RGB666 = 0x20012000,
CIF_RGB888 = 0x20020000,
/* RAW Bayer */
CIF_BAYER_SBGGR8 = 0x30008000,
CIF_BAYER_SGBRG8 = 0x30008010,
CIF_BAYER_SGRBG8 = 0x30008020,
CIF_BAYER_SRGGB8 = 0x30008030,
CIF_BAYER_SBGGR10 = 0x3000a000,
CIF_BAYER_SGBRG10 = 0x3000a010,
CIF_BAYER_SGRBG10 = 0x3000a020,
CIF_BAYER_SRGGB10 = 0x3000a030,
CIF_BAYER_SBGGR12 = 0x3000c000,
CIF_BAYER_SGBRG12 = 0x3000c010,
CIF_BAYER_SGRBG12 = 0x3000c020,
CIF_BAYER_SRGGB12 = 0x3000c030,
/* JPEG */
CIF_JPEG = 0x40008000,
/* Data */
CIF_DATA = 0x70000000,
CIF_UNKNOWN_FORMAT = 0x80000000
};
enum cif_isp10_stream_id {
CIF_ISP10_STREAM_SP = 0x1,
CIF_ISP10_STREAM_MP = 0x2,
CIF_ISP10_STREAM_DMA = 0x4,
CIF_ISP10_STREAM_ISP = 0x8
};
#define CIF_ISP10_ALL_STREAMS \
(CIF_ISP10_STREAM_SP | \
CIF_ISP10_STREAM_MP | \
CIF_ISP10_STREAM_DMA)
enum cif_isp10_buff_fmt {
/* values correspond to bitfield values */
CIF_ISP10_BUFF_FMT_PLANAR = 0,
CIF_ISP10_BUFF_FMT_SEMIPLANAR = 1,
CIF_ISP10_BUFF_FMT_INTERLEAVED = 2,
CIF_ISP10_BUFF_FMT_RAW8 = 0,
CIF_ISP10_BUFF_FMT_RAW12 = 2
};
enum cif_isp10_jpeg_header {
CIF_ISP10_JPEG_HEADER_JFIF,
CIF_ISP10_JPEG_HEADER_NONE
};
struct cif_isp10_csi_config {
u32 vc;
u32 nb_lanes;
u32 bit_rate;
/* really used csi */
u32 used_csi; /* xuhf@rock-chips.com: v1.0.4 */
};
struct cif_isp10_paraport_config {
u32 cif_vsync;
u32 cif_hsync;
u32 cif_pclk;
/* really used csi */
u32 used_csi; /* xuhf@rock-chips.com: v1.0.4 */
};
struct cif_isp10_frm_intrvl {
u32 numerator;
u32 denominator;
};
struct cif_isp10_frm_fmt {
u32 width;
u32 height;
u32 stride;
u32 std_id;
enum cif_isp10_pix_fmt pix_fmt;
enum cif_isp10_pix_fmt_quantization quantization;
struct v4l2_rect defrect;
};
struct cif_isp10_strm_fmt {
struct cif_isp10_frm_fmt frm_fmt;
struct cif_isp10_frm_intrvl frm_intrvl;
};
struct cif_isp10_strm_fmt_desc {
bool discrete_frmsize;
struct {
u32 width;
u32 height;
} min_frmsize;
struct {
u32 width;
u32 height;
} max_frmsize;
enum cif_isp10_pix_fmt pix_fmt;
bool discrete_intrvl;
struct cif_isp10_frm_intrvl min_intrvl;
struct cif_isp10_frm_intrvl max_intrvl;
struct v4l2_rect defrect;
u32 std_id;
};
struct cif_isp10_rsz_config {
struct cif_isp10_frm_fmt *input;
struct cif_isp10_frm_fmt output;
bool ycflt_adjust;
bool ism_adjust;
};
struct cif_isp10_dcrop_config {
unsigned int h_offs;
unsigned int v_offs;
unsigned int h_size;
unsigned int v_size;
};
struct cif_isp10_sp_config {
struct cif_isp10_rsz_config rsz_config;
struct cif_isp10_dcrop_config dcrop;
};
struct cif_isp10_mp_config {
struct cif_isp10_rsz_config rsz_config;
struct cif_isp10_dcrop_config dcrop;
};
struct cif_isp10_mi_path_config {
struct cif_isp10_frm_fmt *input;
struct cif_isp10_frm_fmt output;
u32 llength;
u32 curr_buff_addr;
u32 next_buff_addr;
u32 cb_offs;
u32 cr_offs;
u32 y_size;
u32 cb_size;
u32 cr_size;
u32 burst_len;
bool busy;
/* FOR BT655: 0 = ODD, 1 = EVEN */
bool field_flag;
/* for interlace offset */
u32 vir_len_offset;
};
struct cif_isp10_zoom_buffer_info {
u32 width;
u32 height;
unsigned long buff_addr;
u32 flags;
};
struct cif_isp10_mi_config {
bool raw_enable;
u32 async_updt;
struct cif_isp10_mi_path_config mp;
struct cif_isp10_mi_path_config sp;
struct cif_isp10_mi_path_config dma;
};
struct cif_isp10_buffer {
struct vb2_v4l2_buffer vb;
struct list_head queue;
unsigned long int size;
};
struct cif_isp10_metadata_s {
unsigned int cnt;
unsigned int vmas;
spinlock_t spinlock;
unsigned char *d;
};
struct cif_isp10_stream {
enum cif_isp10_stream_id id;
enum cif_isp10_state state;
enum cif_isp10_state saved_state;
struct list_head buf_queue;
struct cif_isp10_buffer *curr_buf;
struct cif_isp10_buffer *next_buf;
bool updt_cfg;
bool stall;
bool stop;
CIF_ISP10_PLTFRM_EVENT done;
struct cif_isp10_metadata_s metadata;
};
struct cif_isp10_jpeg_config {
bool enable;
bool busy;
u32 ratio;
struct cif_isp10_frm_fmt *input;
enum cif_isp10_jpeg_header header;
};
struct cif_isp10_ie_config {
enum cif_isp10_image_effect effect;
};
/* IS */
struct cif_isp10_ism_params {
unsigned int ctrl;
unsigned int recenter;
unsigned int h_offs;
unsigned int v_offs;
unsigned int h_size;
unsigned int v_size;
unsigned int max_dx;
unsigned int max_dy;
unsigned int displace;
};
struct cif_isp10_ism_config {
bool ism_en;
struct cif_isp10_ism_params ism_params;
bool ism_update_needed;
};
struct cif_isp10_isp_config {
bool si_enable;
struct cif_isp10_ie_config ie_config;
struct cif_isp10_ism_config ism_config;
struct cif_isp10_frm_fmt *input;
struct cif_isp10_frm_fmt output;
};
struct cif_isp10_config {
CIF_ISP10_PLTFRM_MEM_IO_ADDR base_addr;
enum cif_isp10_flash_mode flash_mode;
enum cif_isp10_inp input_sel;
struct cif_isp10_jpeg_config jpeg_config;
struct cif_isp10_mi_config mi_config;
struct cif_isp10_sp_config sp_config;
struct cif_isp10_mp_config mp_config;
struct cif_isp10_strm_fmt img_src_output;
struct cif_isp10_isp_config isp_config;
struct pltfrm_cam_itf cam_itf;
bool out_of_buffer_stall;
};
struct cif_isp10_mi_state {
unsigned long flags;
unsigned int isp_ctrl;
unsigned int y_base_ad;
unsigned int y_size;
unsigned int cb_base_ad;
unsigned int cb_size;
unsigned int cr_base_ad;
unsigned int cr_size;
};
struct cif_isp10_img_src_exp {
struct list_head list;
struct cif_isp10_img_src_ext_ctrl exp;
};
struct cif_isp10_img_src_data {
unsigned int v_frame_id;
struct isp_supplemental_sensor_mode_data data;
};
struct cif_isp10_img_src_exps {
spinlock_t lock; /* protect list */
struct list_head list;
struct mutex mutex; /* protect frm_exp */
struct cif_isp10_img_src_data data[CIF_ISP10_IMG_SRC_DATA_NUM];
unsigned char exp_idx;
unsigned char exp_valid_frms[2];
bool inited;
};
enum cif_isp10_isp_vs_cmd {
CIF_ISP10_VS_EXIT = 0,
CIF_ISP10_VS_EXP = 1
};
struct cif_isp10_isp_vs_work {
struct work_struct work;
struct cif_isp10_device *dev;
enum cif_isp10_isp_vs_cmd cmd;
void *param;
};
struct cif_isp10_fmt {
char *name;
u32 fourcc;
int flags;
int depth;
unsigned char rotation;
unsigned char overlay;
};
#ifdef CIF_ISP10_MODE_DMA_SG
struct cif_isp10_iommu {
int client_fd;
int map_fd;
unsigned long linear_addr;
unsigned long len;
};
struct cif_isp10_dma_buf {
struct dma_buf *dma_buffer;
struct dma_buf_attachment *attach;
struct sg_table *sgt;
dma_addr_t dma_addr;
int fd;
};
#endif
struct cif_isp10_device {
unsigned int dev_id;
CIF_ISP10_PLTFRM_DEVICE dev;
struct v4l2_device v4l2_dev;
enum cif_isp10_pm_state pm_state;
enum cif_isp10_img_src_state img_src_state;
enum cif_isp10_ispstate isp_state;
spinlock_t vbq_lock; /* spinlock for videobuf queues */
spinlock_t vbreq_lock; /* spinlock for videobuf requeues */
spinlock_t iowrite32_verify_lock;
spinlock_t isp_state_lock;
wait_queue_head_t isp_stop_wait; /* wait while isp stop */
unsigned int isp_stop_flags;
struct cif_isp10_img_src *img_src;
struct cif_isp10_img_src *img_src_array[CIF_ISP10_NUM_INPUTS];
unsigned int img_src_cnt;
struct vb2_alloc_ctx *alloc_ctx;
#ifdef CIF_ISP10_MODE_DMA_SG
struct iommu_domain *domain;
struct cif_isp10_dma_buf dma_buffer[VB2_MAX_FRAME];
int dma_buf_cnt;
#endif
struct cif_isp10_img_src_exps img_src_exps;
struct cif_isp10_config config;
struct cif_isp10_isp_dev isp_dev;
struct cif_isp10_stream sp_stream;
struct cif_isp10_stream mp_stream;
struct cif_isp10_stream dma_stream;
struct workqueue_struct *vs_wq;
void (*sof_event)(struct cif_isp10_device *dev, __u32 frame_sequence);
/*
* requeue_bufs() is used to clean and rebuild the local buffer
* lists xx_stream.buf_queue. This is used e.g. in the CAPTURE use
* case where we start MP and SP separately and needs to shortly
* stop and start SP when start MP
*/
void (*requeue_bufs)(struct cif_isp10_device *dev,
enum cif_isp10_stream_id stream_id);
bool b_isp_frame_in;
bool b_mi_frame_end;
int otf_zsl_mode;
struct flash_timeinfo_s flash_t;
struct pltfrm_soc_cfg soc_cfg;
void *nodes;
struct mutex api_mutex; /* user api mutex */
};
struct cif_isp10_fmt *get_cif_isp10_output_format(int index);
int get_cif_isp10_output_format_size(void);
struct v4l2_fmtdesc *get_cif_isp10_output_format_desc(int index);
int get_cif_isp10_output_format_desc_size(void);
/* Clean code starts from here */
static inline
struct cif_isp10_stream *to_stream_by_id(struct cif_isp10_device *dev,
enum cif_isp10_stream_id id)
{
if (WARN_ON(id != CIF_ISP10_STREAM_MP &&
id != CIF_ISP10_STREAM_SP &&
id != CIF_ISP10_STREAM_DMA &&
id != CIF_ISP10_STREAM_ISP))
return &dev->sp_stream;
switch (id) {
case CIF_ISP10_STREAM_MP:
return &dev->mp_stream;
case CIF_ISP10_STREAM_SP:
return &dev->sp_stream;
case CIF_ISP10_STREAM_DMA:
return &dev->dma_stream;
case CIF_ISP10_STREAM_ISP:
return NULL;
}
return NULL;
}
struct cif_isp10_device *cif_isp10_create(
CIF_ISP10_PLTFRM_DEVICE pdev,
void (*sof_event)(struct cif_isp10_device *dev, __u32 frame_sequence),
void (*requeue_bufs)(struct cif_isp10_device *dev,
enum cif_isp10_stream_id stream_id),
struct pltfrm_soc_cfg *soc_cfg);
void cif_isp10_destroy(
struct cif_isp10_device *dev);
int cif_isp10_init(
struct cif_isp10_device *dev,
u32 stream_ids);
int cif_isp10_release(
struct cif_isp10_device *dev,
int stream_ids);
int cif_isp10_streamon(
struct cif_isp10_device *dev,
u32 stream_ids);
int cif_isp10_streamoff(
struct cif_isp10_device *dev,
u32 stream_ids);
int cif_isp10_g_input(
struct cif_isp10_device *dev,
enum cif_isp10_inp *inp);
int cif_isp10_s_input(
struct cif_isp10_device *dev,
enum cif_isp10_inp inp);
int cif_isp10_s_fmt(
struct cif_isp10_device *dev,
enum cif_isp10_stream_id stream_id,
struct cif_isp10_strm_fmt *strm_fmt,
u32 stride);
int cif_isp10_resume(
struct cif_isp10_device *dev);
int cif_isp10_suspend(
struct cif_isp10_device *dev);
int cif_isp10_qbuf(
struct cif_isp10_device *dev,
enum cif_isp10_stream_id stream,
struct cif_isp10_buffer *buf);
int cif_isp10_reqbufs(
struct cif_isp10_device *dev,
enum cif_isp10_stream_id strm,
struct v4l2_requestbuffers *req);
int cif_isp10_mmap(
struct cif_isp10_device *dev,
enum cif_isp10_stream_id stream_id,
struct vm_area_struct *vma);
int cif_isp10_get_target_frm_size(
struct cif_isp10_device *dev,
u32 *target_width,
u32 *target_height);
int cif_isp10_calc_isp_cropping(
struct cif_isp10_device *dev,
u32 *width,
u32 *height,
u32 *h_offs,
u32 *v_offs);
const char *cif_isp10_g_input_name(
struct cif_isp10_device *dev,
enum cif_isp10_inp inp);
int cif_isp10_calc_min_out_buff_size(
struct cif_isp10_device *dev,
enum cif_isp10_stream_id stream_id,
u32 *size,
bool payload);
int cif_isp10_s_ctrl(
struct cif_isp10_device *dev,
const enum cif_isp10_cid id,
int val);
int cif_isp10_s_vb_metadata(
struct cif_isp10_device *dev,
struct cif_isp10_isp_readout_work *readout_work);
int cif_isp10_s_exp(
struct cif_isp10_device *dev,
struct cif_isp10_img_src_ext_ctrl *exp_ctrl,
bool cls_exp);
int cif_isp10_s_vcm(
struct cif_isp10_device *dev,
unsigned int id,
int val);
void cif_isp10_sensor_mode_data_sync(
struct cif_isp10_device *dev,
unsigned int frame_id,
struct isp_supplemental_sensor_mode_data *data);
#endif