blob: 284f8b7693fe69c737404d5259f38dc7feb18780 [file] [log] [blame]
/*
* drivers/amlogic/media/vin/tvin/vdin/vdin_drv.h
*
* Copyright (C) 2017 Amlogic, Inc. All rights reserved.
*
* 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.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
*/
#ifndef __TVIN_VDIN_DRV_H
#define __TVIN_VDIN_DRV_H
/* Standard Linux Headers */
#include <linux/cdev.h>
#include <linux/irqreturn.h>
#include <linux/timer.h>
#include <linux/mutex.h>
#include <linux/interrupt.h>
#include <linux/time.h>
#include <linux/device.h>
#include <linux/clk.h>
#include <linux/workqueue.h>
/* Amlogic Headers */
#include <linux/amlogic/cpu_version.h>
#include <linux/amlogic/media/canvas/canvas.h>
#include <linux/amlogic/media/vfm/vframe.h>
#include <linux/amlogic/media/vfm/vframe_receiver.h>
#include <linux/amlogic/media/vfm/vframe_provider.h>
#include <linux/amlogic/media/frame_provider/tvin/tvin_v4l2.h>
#include <linux/amlogic/media/video_sink/video_signal_notify.h>
#include <linux/amlogic/media/amvecm/amvecm.h>
#ifdef CONFIG_AMLOGIC_MEDIA_RDMA
#include <linux/amlogic/media/rdma/rdma_mgr.h>
#endif
/* Local Headers */
#include "../tvin_frontend.h"
#include "vdin_vf.h"
#include "vdin_regs.h"
/* Ref.2019/04/25: tl1 vdin0 afbce dynamically switch support,
* vpp also should support this function
*/
#define VDIN_VER "ver:2020-1026: support secure mode for screen cap"
/*the counter of vdin*/
#define VDIN_MAX_DEVS 2
enum vdin_hw_ver_e {
VDIN_HW_ORG = 0,
VDIN_HW_SM1,
VDIN_HW_TL1,
/*
* tm2 vdin0/vdin1 all support upto 40k
*/
VDIN_HW_TM2,
VDIN_HW_TM2_B,
/*
* sc2, sm1 vdin0 upto 4k, vdin1 upto 1080P (write)
* no afbce
*/
VDIN_HW_SC2,
};
/*addr for verify chip*/
#define K_FORCE_HV_SHRINK 0
enum vdin_irq_flg_e {
VDIN_IRQ_FLG_NO_END = 1,
VDIN_IRQ_FLG_IRQ_STOP = 2,
VDIN_IRQ_FLG_FAKE_IRQ = 3,
VDIN_IRQ_FLG_DROP_FRAME = 4,
VDIN_IRQ_FLG_DV_CHK_SUM_ERR = 5,
VDIN_IRQ_FLG_CYCLE_CHK,
VDIN_IRQ_FLG_SIG_NOT_STABLE,
VDIN_IRQ_FLG_FMT_TRANS_CHG,
VDIN_IRQ_FLG_CSC_CHG,
VDIN_IRQ_FLG_BUFF_SKIP, /* 10 */
VDIN_IRQ_FLG_IGNORE_FRAME,
VDIN_IRQ_FLG_SKIP_FRAME,
VDIN_IRQ_FLG_GM_DV_CHK_SUM_ERR,
VDIN_IRQ_FLG_NO_WR_FE,
VDIN_IRQ_FLG_NO_NEXT_FE, /* 15 */
VDIN_IRQ_FLG_SECURE_MD,
};
/* for config hw function support */
struct match_data_s {
char *name;
enum vdin_hw_ver_e hw_ver;
bool de_tunnel_tunnel;
/* tm2 verb :444 de-tunnel and wr mif 12 bit mode*/
bool ipt444_to_422_12bit;
};
/* #define VDIN_CRYSTAL 24000000 */
/* #define VDIN_MEAS_CLK 50000000 */
/* values of vdin_dev_t.flags */
#define VDIN_FLAG_NULL 0x00000000
#define VDIN_FLAG_DEC_INIT 0x00000001
#define VDIN_FLAG_DEC_STARTED 0x00000002
#define VDIN_FLAG_DEC_OPENED 0x00000004
#define VDIN_FLAG_DEC_REGED 0x00000008
#define VDIN_FLAG_DEC_STOP_ISR 0x00000010
#define VDIN_FLAG_FORCE_UNSTABLE 0x00000020
#define VDIN_FLAG_FS_OPENED 0x00000100
#define VDIN_FLAG_SKIP_ISR 0x00000200
/*flag for vdin0 output*/
#define VDIN_FLAG_OUTPUT_TO_NR 0x00000400
/*flag for force vdin buffer recycle*/
#define VDIN_FLAG_FORCE_RECYCLE 0x00000800
/*flag for vdin scale down,color fmt conversion*/
#define VDIN_FLAG_MANUAL_CONVERSION 0x00001000
/*flag for vdin rdma enable*/
#define VDIN_FLAG_RDMA_ENABLE 0x00002000
/*flag for vdin snow on&off*/
#define VDIN_FLAG_SNOW_FLAG 0x00004000
/*flag for disable vdin sm*/
#define VDIN_FLAG_SM_DISABLE 0x00008000
/*flag for vdin suspend state*/
#define VDIN_FLAG_SUSPEND 0x00010000
/*flag for vdin-v4l2 debug*/
#define VDIN_FLAG_V4L2_DEBUG 0x00020000
/*flag for isr req&free*/
#define VDIN_FLAG_ISR_REQ 0x00040000
#define VDIN_FLAG_ISR_EN 0x00100000
/* flag for rdma done in isr*/
#define VDIN_FLAG_RDMA_DONE 0x00080000
/*values of vdin isr bypass check flag */
#define VDIN_BYPASS_STOP_CHECK 0x00000001
#define VDIN_BYPASS_CYC_CHECK 0x00000002
#define VDIN_BYPASS_VGA_CHECK 0x00000008
/*values of vdin game mode process flag */
/*enable*/
#define VDIN_GAME_MODE_0 (1 << 0)
/*delay 1 frame, vdin have one frame buffer delay*/
#define VDIN_GAME_MODE_1 (1 << 1)
/*delay 2 frame write, read at same buffer*/
#define VDIN_GAME_MODE_2 (1 << 2)
/*when phase lock, will switch 2 to 1*/
#define VDIN_GAME_MODE_SWITCH_EN (1 << 3)
/*flag for flush vdin buff*/
#define VDIN_FLAG_BLACK_SCREEN_ON 1
#define VDIN_FLAG_BLACK_SCREEN_OFF 0
/* size for rdma table */
#define RDMA_TABLE_SIZE (PAGE_SIZE>>3)
/* #define VDIN_DEBUG */
#define IS_HDMI_SRC(src) \
({typeof(src) src_ = src; \
(((src_) >= TVIN_PORT_HDMI0) && \
((src_) <= TVIN_PORT_HDMI7)); })
#define IS_CVBS_SRC(src) \
({typeof(src) src_ = src; \
(((src_) >= TVIN_PORT_CVBS0) && \
((src_) <= TVIN_PORT_CVBS3)); })
#define H_SHRINK_TIMES_4k 4
#define V_SHRINK_TIMES_4k 4
#define H_SHRINK_TIMES_1080 2
#define V_SHRINK_TIMES_1080 2
/*vdin write mem color-depth support*/
enum VDIN_WR_COLOR_DEPTHe {
VDIN_WR_COLOR_DEPTH_8BIT = 0x01,
VDIN_WR_COLOR_DEPTH_9BIT = 0x02,
VDIN_WR_COLOR_DEPTH_10BIT = 0x04,
VDIN_WR_COLOR_DEPTH_12BIT = 0x08,
/*TXL new add*/
VDIN_WR_COLOR_DEPTH_10BIT_FULL_PCAK_MODE = 0x10,
};
#define VDIN_422_FULL_PK_EN 1
#define VDIN_422_FULL_PK_DIS 0
/* vdin afbce flag */
#define VDIN_AFBCE_EN (1 << 0)
#define VDIN_AFBCE_EN_LOOSY (1 << 1)
#define VDIN_AFBCE_EN_4K (1 << 4)
#define VDIN_AFBCE_EN_1080P (1 << 5)
#define VDIN_AFBCE_EN_720P (1 << 6)
#define VDIN_AFBCE_EN_SMALL (1 << 7)
enum COLOR_DEEPS_CFGe {
COLOR_DEEPS_AUTO = 0,
COLOR_DEEPS_8BIT = 8,
COLOR_DEEPS_10BIT = 10,
COLOR_DEEPS_12BIT = 12,
COLOR_DEEPS_MANUAL = 0x100,
};
enum vdin_color_deeps_e {
VDIN_COLOR_DEEPS_8BIT = 8,
VDIN_COLOR_DEEPS_9BIT = 9,
VDIN_COLOR_DEEPS_10BIT = 10,
VDIN_COLOR_DEEPS_12BIT = 12,
};
enum vdin_vf_put_md {
VDIN_VF_PUT,
VDIN_VF_RECYCLE,
};
/* *********************************************************************** */
/* *** enum definitions ********************************************* */
/* *********************************************************************** */
/*
*YUV601: SDTV BT.601 YCbCr (16~235, 16~240, 16~240)
*YUV601F: SDTV BT.601 Full_Range YCbCr ( 0~255, 0~255, 0~255)
*YUV709: HDTV BT.709 YCbCr (16~235, 16~240, 16~240)
*YUV709F: HDTV BT.709 Full_Range YCbCr ( 0~255, 0~255, 0~255)
*RGBS: StudioRGB (16~235, 16~235, 16~235)
*RGB: RGB ( 0~255, 0~255, 0~255)
*/
enum vdin_matrix_csc_e {
VDIN_MATRIX_NULL = 0,
VDIN_MATRIX_XXX_YUV601_BLACK,/*1*/
VDIN_MATRIX_RGB_YUV601,
VDIN_MATRIX_GBR_YUV601,
VDIN_MATRIX_BRG_YUV601,
VDIN_MATRIX_YUV601_RGB,/*5*/
VDIN_MATRIX_YUV601_GBR,
VDIN_MATRIX_YUV601_BRG,
VDIN_MATRIX_RGB_YUV601F,
VDIN_MATRIX_YUV601F_RGB,/*9*/
VDIN_MATRIX_RGBS_YUV601,/*10*/
VDIN_MATRIX_YUV601_RGBS,
VDIN_MATRIX_RGBS_YUV601F,
VDIN_MATRIX_YUV601F_RGBS,
VDIN_MATRIX_YUV601F_YUV601,
VDIN_MATRIX_YUV601_YUV601F,/*15*/
VDIN_MATRIX_RGB_YUV709,
VDIN_MATRIX_YUV709_RGB,
VDIN_MATRIX_YUV709_GBR,
VDIN_MATRIX_YUV709_BRG,
VDIN_MATRIX_RGB_YUV709F,/*20*/
VDIN_MATRIX_YUV709F_RGB,
VDIN_MATRIX_RGBS_YUV709,
VDIN_MATRIX_YUV709_RGBS,
VDIN_MATRIX_RGBS_YUV709F,
VDIN_MATRIX_YUV709F_RGBS,/*25*/
VDIN_MATRIX_YUV709F_YUV709,
VDIN_MATRIX_YUV709_YUV709F,
VDIN_MATRIX_YUV601_YUV709,
VDIN_MATRIX_YUV709_YUV601,
VDIN_MATRIX_YUV601_YUV709F,/*30*/
VDIN_MATRIX_YUV709F_YUV601,
VDIN_MATRIX_YUV601F_YUV709,
VDIN_MATRIX_YUV709_YUV601F,
VDIN_MATRIX_YUV601F_YUV709F,
VDIN_MATRIX_YUV709F_YUV601F,/*35*/
VDIN_MATRIX_RGBS_RGB,
VDIN_MATRIX_RGB_RGBS,
VDIN_MATRIX_RGB2020_YUV2020,
VDIN_MATRIX_YUV2020F_YUV2020,
};
static inline const char *vdin_fmt_convert_str(
enum vdin_format_convert_e fmt_cvt)
{
switch (fmt_cvt) {
case VDIN_FORMAT_CONVERT_YUV_YUV422:
return "FMT_CONVERT_YUV_YUV422";
break;
case VDIN_FORMAT_CONVERT_YUV_YUV444:
return "FMT_CONVERT_YUV_YUV444";
break;
case VDIN_FORMAT_CONVERT_YUV_RGB:
return "FMT_CONVERT_YUV_RGB";
break;
case VDIN_FORMAT_CONVERT_RGB_YUV422:
return "FMT_CONVERT_RGB_YUV422";
break;
case VDIN_FORMAT_CONVERT_RGB_YUV444:
return "FMT_CONVERT_RGB_YUV444";
break;
case VDIN_FORMAT_CONVERT_RGB_RGB:
return "FMT_CONVERT_RGB_RGB";
break;
case VDIN_FORMAT_CONVERT_YUV_NV12:
return "VDIN_FORMAT_CONVERT_YUV_NV12";
break;
case VDIN_FORMAT_CONVERT_YUV_NV21:
return "VDIN_FORMAT_CONVERT_YUV_NV21";
break;
case VDIN_FORMAT_CONVERT_RGB_NV12:
return "VDIN_FORMAT_CONVERT_RGB_NV12";
break;
case VDIN_FORMAT_CONVERT_RGB_NV21:
return "VDIN_FORMAT_CONVERT_RGB_NV21";
break;
default:
return "FMT_CONVERT_NULL";
break;
}
}
/* only for keystone use begin */
struct vdin_set_canvas_s {
int fd;
int index;
};
struct vdin_set_canvas_addr_s {
long paddr;
int size;
struct dma_buf *dmabuff;
struct dma_buf_attachment *dmabufattach;
struct sg_table *sgtable;
};
extern struct vdin_set_canvas_addr_s vdin_set_canvas_addr[VDIN_CANVAS_MAX_CNT];
struct vdin_crc_info {
int index;
unsigned int crc;
};
/* only for keystone use end */
/*******for debug **********/
struct vdin_debug_s {
struct tvin_cutwin_s cutwin;
unsigned short scaler4h;/* for vscaler */
unsigned short scaler4w;/* for hscaler */
unsigned short dest_cfmt;/* for color fmt conversion */
};
struct vdin_dv_s {
struct vframe_provider_s vprov_dv;
struct delayed_work dv_dwork;
unsigned int dv_cur_index;
unsigned int dv_next_index;
unsigned int dolby_input;
dma_addr_t dv_dma_paddr;
void *dv_dma_vaddr;
void *temp_meta_data;
unsigned int dv_flag_cnt;/*cnt for no dv input*/
bool dv_flag;
bool dv_config;
bool dv_path_idx;
bool dv_crc_check;/*0:fail;1:ok*/
unsigned int dv_mem_alloced;
struct tvin_dv_vsif_s dv_vsif;/*dolby vsi info*/
bool low_latency;
unsigned int chg_cnt;
unsigned int allm_chg_cnt;
};
struct vdin_afbce_s {
unsigned int frame_head_size;/*1 frame head size*/
unsigned int frame_table_size;/*1 frame table size*/
unsigned int frame_body_size;/*1 frame body size*/
unsigned long head_paddr;
unsigned long table_paddr;
/*every frame head addr*/
unsigned long fm_head_paddr[VDIN_CANVAS_MAX_CNT];
/*every frame tab addr*/
unsigned long fm_table_paddr[VDIN_CANVAS_MAX_CNT];
/*every body head addr*/
unsigned long fm_body_paddr[VDIN_CANVAS_MAX_CNT];
};
struct vdin_event_info {
/*enum tvin_sg_chg_flg*/
u32 event_sts;
};
struct vdin_dev_s {
struct cdev cdev;
struct device *dev;
struct tvin_parm_s parm;
struct tvin_format_s *fmt_info_p;
struct vf_pool *vfp;
struct tvin_frontend_s *frontend;
struct tvin_frontend_s vdin_frontend;
struct tvin_sig_property_s pre_prop;
struct tvin_sig_property_s prop;
struct vframe_provider_s vprov;
struct vdin_dv_s dv;
struct delayed_work vlock_dwork;
struct vdin_afbce_s *afbce_info;
/*vdin event*/
struct vdin_event_info event_info;
struct extcon_dev *extcon_event;
struct delayed_work event_dwork;
/* 0:from gpio A,1:from csi2 , 2:gpio B*/
enum bt_path_e bt_path;
const struct match_data_s *dtdata;
struct timer_list timer;
spinlock_t isr_lock;
spinlock_t hist_lock;
struct mutex fe_lock;
struct clk *msr_clk;
unsigned int msr_clk_val;
struct vdin_debug_s debug;
enum vdin_format_convert_e format_convert;
enum vdin_color_deeps_e source_bitdepth;
enum vdin_matrix_csc_e csc_idx;
struct vf_entry *curr_wr_vfe;
struct vf_entry *last_wr_vfe;
unsigned int curr_field_type;
unsigned int curr_dv_flag;
char name[15];
/* bit0 TVIN_PARM_FLAG_CAP bit31: TVIN_PARM_FLAG_WORK_ON */
unsigned int flags;
unsigned int flags_isr;
unsigned int index;
unsigned int vdin_max_pixelclk;
unsigned long mem_start;
unsigned int mem_size;
unsigned long vfmem_start[VDIN_CANVAS_MAX_CNT];
struct page *vfvenc_pages[VDIN_CANVAS_MAX_CNT];
/* save secure handle */
unsigned int secure_handle;
bool secure_en;
bool mem_protected;
unsigned int vfmem_size;
unsigned int vfmem_size_small;/* double write use */
unsigned int frame_size;
unsigned int vfmem_max_cnt;
unsigned int frame_buff_num;
unsigned int h_active;
unsigned int v_active;
unsigned int h_shrink_out;/* double write use */
unsigned int v_shrink_out;/* double write use */
unsigned int h_shrink_times;/* double write use */
unsigned int v_shrink_times;/* double write use */
unsigned int h_active_org;/*vdin scaler in*/
unsigned int v_active_org;/*vdin scaler in*/
unsigned int canvas_h;
unsigned int canvas_w;
unsigned int canvas_active_w;
unsigned int canvas_alin_w;
unsigned int canvas_max_size;
unsigned int canvas_max_num;
/*before G12A:32byte(256bit)align;
*after G12A:64byte(512bit)align
*/
unsigned int canvas_align;
unsigned int irq;
unsigned int rdma_irq;
unsigned int vpu_crash_irq;
unsigned int wr_done_irq;
char irq_name[12];
char vpu_crash_irq_name[20];
char wr_done_irq_name[20];
/* address offset(vdin0/vdin1/...) */
unsigned int addr_offset;
unsigned int unstable_flag;
unsigned int wr_done_abnormal_cnt;
unsigned int stamp;
unsigned int hcnt64;
unsigned int cycle;
unsigned int start_time;/* ms vdin start time */
int rdma_handle;
/*for unreliable vsync interrupt check*/
unsigned long long vs_time_stamp;
unsigned int unreliable_vs_cnt;
unsigned int unreliable_vs_cnt_pre;
unsigned int unreliable_vs_idx;
unsigned int unreliable_vs_time[10];
bool cma_config_en;
/*cma_config_flag:
*bit0: (1:share with codec_mm;0:cma alone)
*bit8: (1:discontinuous alloc way;0:continuous alloc way)
*/
unsigned int cma_config_flag;
#ifdef CONFIG_CMA
struct platform_device *this_pdev;
struct page *venc_pages;
unsigned int cma_mem_size;/*BYTE*/
unsigned int cma_mem_alloc;
/*cma_mem_mode:0:according to input size and output fmt;
**1:according to input size and output fmt force as YUV444
*/
unsigned int cma_mem_mode;
unsigned int force_yuv444_malloc;
#endif
/* bit0: enable/disable; bit4: luma range info */
bool csc_cfg;
/* duration of current timing */
unsigned int duration;
/* color-depth for vdin write */
/*vdin write mem color depth support:
*bit0:support 8bit
*bit1:support 9bit
*bit2:support 10bit
*bit3:support 12bit
*bit4:support yuv422 10bit full pack mode (from txl new add)
*/
enum VDIN_WR_COLOR_DEPTHe color_depth_support;
/*color depth config
*0:auto config as frontend
*8:force config as 8bit
*10:force config as 10bit
*12:force config as 12bit
*/
enum COLOR_DEEPS_CFGe color_depth_config;
/* new add from txl:color depth mode for 10bit
*1: full pack mode;config 10bit as 10bit
*0: config 10bit as 12bit
*/
unsigned int full_pack;
/* output_color_depth:
* when tv_input is 4k50hz_10bit or 4k60hz_10bit,
* choose output color depth from dts
*/
unsigned int output_color_depth;
/* cutwindow config */
bool cutwindow_cfg;
bool auto_cutwindow_en;
/*
*1:vdin out limit range
*0:vdin out full range
*/
unsigned int color_range_mode;
/*
*game_mode:
*bit0:enable/disable
*bit1:for true bypas and put vframe in advance one vsync
*bit2:for true bypas and put vframe in advance two vsync,
*vdin & vpp read/write same buffer may happen
*/
unsigned int game_mode;
unsigned int rdma_enable;
/* afbce_mode: (amlogic frame buff compression encoder)
* 0: normal mode, not use afbce
* 1: use afbce non-mmu mode: head/body addr set by code
* 2: use afbce mmu mode: head set by code, body addr assigning by hw
*/
/*afbce_flag:
*bit[0]: enable afbce
*bit[1]: enable afbce_loosy
*bit[4]: afbce enable for 4k
*bit[5]: afbce enable for 1080p
*bit[6]: afbce enable for 720p
*bit[7]: afbce enable for other small resolution
*/
unsigned int afbce_flag;
unsigned int afbce_mode_pre;
unsigned int afbce_mode;
unsigned int afbce_valid;
/*fot 'T correction' on projector*/
unsigned int set_canvas_manual;
unsigned int keystone_vframe_ready;
struct vf_entry *keystone_entry[VDIN_CANVAS_MAX_CNT];
unsigned int canvas_config_mode;
bool prehsc_en;
bool vshrk_en;
bool urgent_en;
bool double_wr_cfg;
bool double_wr;
bool double_wr_10bit_sup;
bool black_bar_enable;
bool hist_bar_enable;
unsigned int ignore_frames;
/*use frame rate to cal duraton*/
unsigned int use_frame_rate;
unsigned int irq_cnt;
unsigned int vpu_crash_cnt;
unsigned int frame_cnt;
unsigned int puted_frame_cnt;
unsigned int rdma_irq_cnt;
unsigned int wr_done_irq_cnt;
unsigned int vdin_irq_flag;
unsigned int vdin_reset_flag;
unsigned int vdin_dev_ssize;
wait_queue_head_t queue;
struct dentry *dbg_root; /*dbg_fs*/
/*atv non-std signal,force drop the field if previous already dropped*/
unsigned int interlace_force_drop;
unsigned int frame_drop_num;
unsigned int skip_disp_md_check;
unsigned int vframe_wr_en;
unsigned int vframe_wr_en_pre;
unsigned int tx_fmt;
unsigned int vd1_fmt;
};
struct vdin_hist_s {
ulong sum;
int width;
int height;
int ave;
unsigned short hist[64];
};
struct vdin_v4l2_param_s {
int width;
int height;
int fps;
};
extern unsigned int max_ignore_frame_cnt;
extern unsigned int skip_frame_debug;
extern unsigned int vdin_drop_cnt;
extern unsigned int vdin0_afbce_debug_force;
extern unsigned int dv_de_scramble;
extern bool enable_reset;
extern unsigned int dolby_size_byte;
extern unsigned int dv_dbg_mask;
extern u32 vdin_cfg_444_to_422_wmif_en;
extern unsigned int vdin_isr_monitor;
extern unsigned int vdin_get_prop_in_vs_en;
extern unsigned int vdin_prop_monitor;
extern unsigned int vdin_get_prop_in_fe_en;
extern struct vdin_hist_s vdin1_hist;
struct vframe_provider_s *vf_get_provider_by_name(
const char *provider_name);
char *vf_get_receiver_name(const char *provider_name);
int start_tvin_service(int no, struct vdin_parm_s *para);
int stop_tvin_service(int no);
int vdin_reg_v4l2(struct vdin_v4l2_ops_s *v4l2_ops);
void vdin_unreg_v4l2(void);
int vdin_create_class_files(struct class *vdin_clsp);
void vdin_remove_class_files(struct class *vdin_clsp);
int vdin_create_debug_files(struct device *dev);
void vdin_remove_debug_files(struct device *dev);
int vdin_open_fe(enum tvin_port_e port, int index,
struct vdin_dev_s *devp);
void vdin_close_fe(struct vdin_dev_s *devp);
void vdin_start_dec(struct vdin_dev_s *devp);
void vdin_stop_dec(struct vdin_dev_s *devp);
irqreturn_t vdin_isr_simple(int irq, void *dev_id);
irqreturn_t vdin_isr(int irq, void *dev_id);
irqreturn_t vdin_v4l2_isr(int irq, void *dev_id);
void ldim_get_matrix(int *data, int reg_sel);
void ldim_set_matrix(int *data, int reg_sel);
void tvafe_snow_config(unsigned int onoff);
void tvafe_snow_config_clamp(unsigned int onoff);
void vdin_vf_reg(struct vdin_dev_s *devp);
void vdin_vf_unreg(struct vdin_dev_s *devp);
void vdin_pause_dec(struct vdin_dev_s *devp);
void vdin_resume_dec(struct vdin_dev_s *devp);
bool is_dolby_vision_enable(void);
void vdin_debugfs_init(struct vdin_dev_s *vdevp);
void vdin_debugfs_exit(struct vdin_dev_s *vdevp);
bool vlock_get_phlock_flag(void);
bool vlock_get_vlock_flag(void);
u32 vlock_get_phase_en(void);
struct vdin_dev_s *vdin_get_dev(unsigned int index);
void vdin_mif_config_init(struct vdin_dev_s *devp);
void vdin_drop_frame_info(struct vdin_dev_s *devp, char *info);
#endif /* __TVIN_VDIN_DRV_H */