blob: f321fbbac6c2b62d0320ec620e9486a5a693b893 [file] [log] [blame]
/*
* drivers/amlogic/media/vin/tvin/tvin_global.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_GLOBAL_H
#define __TVIN_GLOBAL_H
/* #include <mach/io.h> */
#include <linux/amlogic/media/frame_provider/tvin/tvin.h>
/* #include <mach/am_regs.h> */
#include <linux/amlogic/iomap.h>
#include <linux/amlogic/cpu_version.h>
#ifdef TVBUS_REG_ADDR
#define R_APB_REG(reg) aml_read_reg32(TVBUS_REG_ADDR(reg))
#define W_APB_REG(reg, val) aml_write_reg32(TVBUS_REG_ADDR(reg), val)
#define R_VBI_APB_REG(reg) aml_read_reg32(TVBUS_REG_ADDR(reg))
#define W_VBI_APB_REG(reg, val) aml_write_reg32(TVBUS_REG_ADDR(reg), val)
#define R_APB_BIT(reg, start, len) \
aml_get_reg32_bits(TVBUS_REG_ADDR(reg), start, len)
#define W_APB_BIT(reg, val, start, len) \
aml_set_reg32_bits(TVBUS_REG_ADDR(reg), val, start, len)
#define W_VBI_APB_BIT(reg, val, start, len) \
aml_set_reg32_bits(TVBUS_REG_ADDR(reg), val, start, len)
#else
#if 1
extern int tvafe_reg_read(unsigned int reg, unsigned int *val);
extern int tvafe_reg_write(unsigned int reg, unsigned int val);
extern int tvafe_vbi_reg_read(unsigned int reg, unsigned int *val);
extern int tvafe_vbi_reg_write(unsigned int reg, unsigned int val);
extern int tvafe_hiu_reg_read(unsigned int reg, unsigned int *val);
extern int tvafe_hiu_reg_write(unsigned int reg, unsigned int val);
#else
static void __iomem *tvafe_reg_base;
static int tvafe_reg_read(unsigned int reg, unsigned int *val)
{
*val = readl(tvafe_reg_base+reg);
return 0;
}
static int tvafe_reg_write(unsigned int reg, unsigned int val)
{
writel(val, (tvafe_reg_base+reg));
return 0;
}
#endif
static inline uint32_t R_APB_REG(uint32_t reg)
{
unsigned int val;
tvafe_reg_read(reg, &val);
return val;
}
static inline void W_APB_REG(uint32_t reg,
const uint32_t val)
{
tvafe_reg_write(reg, val);
}
static inline uint32_t R_VBI_APB_REG(uint32_t reg)
{
unsigned int val = 0;
tvafe_vbi_reg_read(reg, &val);
return val;
}
static inline void W_VBI_APB_REG(uint32_t reg,
const uint32_t val)
{
tvafe_vbi_reg_write(reg, val);
}
static inline void W_VBI_APB_BIT(uint32_t reg,
const uint32_t value,
const uint32_t start,
const uint32_t len)
{
W_VBI_APB_REG(reg, ((R_VBI_APB_REG(reg) &
~(((1L << (len)) - 1) << (start))) |
(((value) & ((1L << (len)) - 1)) << (start))));
}
static inline void W_APB_BIT(uint32_t reg,
const uint32_t value,
const uint32_t start,
const uint32_t len)
{
W_APB_REG(reg, ((R_APB_REG(reg) &
~(((1L << (len)) - 1) << (start))) |
(((value) & ((1L << (len)) - 1)) << (start))));
}
static inline uint32_t R_APB_BIT(uint32_t reg,
const uint32_t start,
const uint32_t len)
{
uint32_t val;
val = ((R_APB_REG(reg) >> (start)) & ((1L << (len)) - 1));
return val;
}
static inline void W_VCBUS_BIT(uint32_t reg,
const uint32_t value,
const uint32_t start,
const uint32_t len)
{
aml_write_vcbus(reg, ((aml_read_vcbus(reg) &
~(((1L << (len)) - 1) << (start))) |
(((value) & ((1L << (len)) - 1)) << (start))));
}
static inline uint32_t R_VCBUS_BIT(uint32_t reg,
const uint32_t start,
const uint32_t len)
{
uint32_t val;
val = ((aml_read_vcbus(reg) >> (start)) & ((1L << (len)) - 1));
return val;
}
static inline uint32_t R_HIU_REG(uint32_t reg)
{
unsigned int val;
tvafe_hiu_reg_read(reg, &val);
return val;
}
static inline void W_HIU_REG(uint32_t reg,
const uint32_t val)
{
tvafe_hiu_reg_write(reg, val);
}
static inline void W_HIU_BIT(uint32_t reg,
const uint32_t value,
const uint32_t start,
const uint32_t len)
{
W_HIU_REG(reg, ((R_HIU_REG(reg) &
~(((1L << (len)) - 1) << (start))) |
(((value) & ((1L << (len)) - 1)) << (start))));
}
static inline uint32_t R_HIU_BIT(uint32_t reg,
const uint32_t start,
const uint32_t len)
{
uint32_t val;
val = ((R_HIU_REG(reg) >> (start)) & ((1L << (len)) - 1));
return val;
}
/*
#define R_APB_REG(reg) READ_APB_REG(reg)
#define W_APB_REG(reg, val) WRITE_APB_REG(reg, val)
#define R_APB_BIT(reg, start, len) \
READ_APB_REG_BITS(reg, start, len)
#define W_APB_BIT(reg, val, start, len) \
WRITE_APB_REG_BITS(reg, val, start, len)
*/
#endif
static inline uint32_t rd(uint32_t offset,
uint32_t reg)
{
return (uint32_t)aml_read_vcbus(reg+offset);
}
static inline void wr(uint32_t offset,
uint32_t reg,
const uint32_t val)
{
aml_write_vcbus(reg+offset, val);
}
static inline void wr_bits(uint32_t offset,
uint32_t reg,
const uint32_t value,
const uint32_t start,
const uint32_t len)
{
aml_write_vcbus(reg+offset, ((aml_read_vcbus(reg+offset) &
~(((1L << (len)) - 1) << (start))) |
(((value) & ((1L << (len)) - 1)) << (start))));
}
static inline uint32_t rd_bits(uint32_t offset,
uint32_t reg,
const uint32_t start,
const uint32_t len)
{
uint32_t val;
val = ((aml_read_vcbus(reg+offset) >> (start)) & ((1L << (len)) - 1));
return val;
}
/* ************************************************************************* */
/* *** enum definitions ********************************************* */
/* ************************************************************************* */
#define STATUS_ANTI_SHOCKING 3
#define MINIMUM_H_CNT 1400
#define ADC_REG_NUM 112
#define CVD_PART1_REG_NUM 64
#define CVD_PART1_REG_MIN 0x00
#define CVD_PART2_REG_NUM 144
#define CVD_PART2_REG_MIN 0x70
#define CVD_PART3_REG_NUM 7 /* 0x87, 0x93, 0x94, 0x95, 0x96, 0xe6, 0xfa */
#define CVD_PART3_REG_0 0x87
#define CVD_PART3_REG_1 0x93
#define CVD_PART3_REG_2 0x94
#define CVD_PART3_REG_3 0x95
#define CVD_PART3_REG_4 0x96
#define CVD_PART3_REG_5 0xe6
#define CVD_PART3_REG_6 0xfa
/* #define ACD_REG_NUM1 0x32 //0x00-0x32 except 0x1E&0x31 */
/* #define ACD_REG_NUM2 0x39 //the sum of the part2 acd register */
#define ACD_REG_NUM 0xff/* the sum all of the acd register */
/* #if (MESON_CPU_TYPE >= MESON_CPU_TYPE_MESONG9TV) */
#define CRYSTAL_24M
/* #endif */
#ifndef CRYSTAL_24M
#define CRYSTAL_25M
#endif
#ifdef CRYSTAL_24M
#define CVD2_CHROMA_DTO_NTSC_M 0x262e8ba2
#define CVD2_CHROMA_DTO_NTSC_443 0x2f4abc24
#define CVD2_CHROMA_DTO_PAL_I 0x2f4abc24
#define CVD2_CHROMA_DTO_PAL_M 0x2623cd98
#define CVD2_CHROMA_DTO_PAL_CN 0x263566cf
#define CVD2_CHROMA_DTO_PAL_60 0x2f4abc24
#define CVD2_CHROMA_DTO_SECAM 0x2db7a328
#define CVD2_HSYNC_DTO_NTSC_M 0x24000000
#define CVD2_HSYNC_DTO_NTSC_443 0x24000000
#define CVD2_HSYNC_DTO_PAL_I 0x24000000
#define CVD2_HSYNC_DTO_PAL_M 0x24000000
#define CVD2_HSYNC_DTO_PAL_CN 0x24000000
#define CVD2_HSYNC_DTO_PAL_60 0x24000000
#define CVD2_HSYNC_DTO_SECAM 0x24000000
#define CVD2_DCRESTORE_ACCUM 0x98 /* [5:0] = 24(MHz) */
#endif
#ifdef CRYSTAL_25M
#define CVD2_CHROMA_DTO_NTSC_M 0x24a7904a
#define CVD2_CHROMA_DTO_NTSC_443 0x2d66772d
#define CVD2_CHROMA_DTO_PAL_I 0x2d66772d
#define CVD2_CHROMA_DTO_PAL_M 0x249d4040
#define CVD2_CHROMA_DTO_PAL_CN 0x24ae2541
#define CVD2_CHROMA_DTO_PAL_60 0x2d66772d
#define CVD2_CHROMA_DTO_SECAM 0x2be37de9
#define CVD2_HSYNC_DTO_NTSC_M 0x228f5c28
#define CVD2_HSYNC_DTO_NTSC_443 0x228f5c28
#define CVD2_HSYNC_DTO_PAL_I 0x228f5c28
#define CVD2_HSYNC_DTO_PAL_M 0x228f5c28
#define CVD2_HSYNC_DTO_PAL_CN 0x228f5c28
#define CVD2_HSYNC_DTO_PAL_60 0x228f5c28
#define CVD2_HSYNC_DTO_SECAM 0x228f5c28
#define CVD2_DCRESTORE_ACCUM 0x99 /* [5:0] = 25(MHz) */
#endif
#define TVAFE_SET_CVBS_PGA_EN
#ifdef TVAFE_SET_CVBS_PGA_EN
#define TVAFE_SET_CVBS_PGA_START 5
#define TVAFE_SET_CVBS_PGA_STEP 1
#define CVD2_DGAIN_MIDDLE 0x0200
#define CVD2_DGAIN_WINDOW 0x000F
#define CVD2_DGAIN_LIMITH (CVD2_DGAIN_MIDDLE + CVD2_DGAIN_WINDOW)
#define CVD2_DGAIN_LIMITL (CVD2_DGAIN_MIDDLE - CVD2_DGAIN_WINDOW)
#define CVD2_DGAIN_MAX 0x0600
#define CVD2_DGAIN_MIN 0x0100
#define PGA_DELTA_VAL 0x10
#endif
#define TVAFE_SET_CVBS_CDTO_EN
#ifdef TVAFE_SET_CVBS_CDTO_EN
#define TVAFE_SET_CVBS_CDTO_START 300
#define TVAFE_SET_CVBS_CDTO_STEP 0
#define HS_CNT_STANDARD 0x31380 /*0x17a00*/
#define CDTO_FILTER_FACTOR 1
#endif
enum tvin_sync_pol_e {
TVIN_SYNC_POL_NULL = 0,
TVIN_SYNC_POL_NEGATIVE,
TVIN_SYNC_POL_POSITIVE,
};
enum tvin_color_space_e {
TVIN_CS_RGB444 = 0,
TVIN_CS_YUV444,
TVIN_CS_YUV422_16BITS,
TVIN_CS_YCbCr422_8BITS,
TVIN_CS_MAX
};
/*vdin buffer control for tvin frontend*/
enum tvin_buffer_ctl_e {
TVIN_BUF_NULL,
TVIN_BUF_SKIP,
TVIN_BUF_TMP,
TVIN_BUF_RECYCLE_TMP,
};
/* ************************************************************************* */
/* *** structure definitions ********************************************* */
/* ************************************************************************* */
/* Hs_cnt Pixel_Clk(Khz/10) */
struct tvin_format_s {
/* Th in the unit of pixel */
unsigned short h_active;
/* Tv in the unit of line */
unsigned short v_active;
/* Th in the unit of T, while 1/T = 24MHz or 27MHz or even 100MHz */
unsigned short h_cnt;
/* Tolerance of h_cnt */
unsigned short h_cnt_offset;
/* Tolerance of v_cnt */
unsigned short v_cnt_offset;
/* Ths in the unit of T, while 1/T = 24MHz or 27MHz or even 100MHz */
unsigned short hs_cnt;
/* Tolerance of hs_cnt */
unsigned short hs_cnt_offset;
/* Th in the unit of pixel */
unsigned short h_total;
/* Tv in the unit of line */
unsigned short v_total;
/* h front proch */
unsigned short hs_front;
/* HS in the unit of pixel */
unsigned short hs_width;
/* HS in the unit of pixel */
unsigned short hs_bp;
/* vs front proch in the unit of line */
unsigned short vs_front;
/* VS width in the unit of line */
unsigned short vs_width;
/* vs back proch in the unit of line */
unsigned short vs_bp;
enum tvin_sync_pol_e hs_pol;
enum tvin_sync_pol_e vs_pol;
enum tvin_scan_mode_e scan_mode;
/* (Khz/10) */
unsigned short pixel_clk;
unsigned short vbi_line_start;
unsigned short vbi_line_end;
unsigned int duration;
};
enum tvin_ar_b3_b0_val_e {
TVIN_AR_14x9_LB_CENTER_VAL = 0x11,
TVIN_AR_14x9_LB_TOP_VAL = 0x12,
TVIN_AR_16x9_LB_TOP_VAL = 0x14,
TVIN_AR_16x9_FULL_VAL = 0x17,
TVIN_AR_4x3_FULL_VAL = 0x18,
TVIN_AR_16x9_LB_CENTER_VAL = 0x1b,
TVIN_AR_16x9_LB_CENTER1_VAL = 0x1d,
TVIN_AR_14x9_FULL_VAL = 0x1e,
};
enum tvin_aspect_ratio_e {
TVIN_ASPECT_NULL = 0,
TVIN_ASPECT_1x1,
TVIN_ASPECT_4x3_FULL,
TVIN_ASPECT_14x9_FULL,
TVIN_ASPECT_14x9_LB_CENTER,
TVIN_ASPECT_14x9_LB_TOP,
TVIN_ASPECT_16x9_FULL,
TVIN_ASPECT_16x9_LB_CENTER,
TVIN_ASPECT_16x9_LB_TOP,
TVIN_ASPECT_MAX,
};
const char *tvin_aspect_ratio_str(enum tvin_aspect_ratio_e aspect_ratio);
enum tvin_hdr_eotf_e {
EOTF_SDR,
EOTF_HDR,
EOTF_SMPTE_ST_2048,
EOTF_HLG,
EOTF_MAX,
};
enum tvin_hdr_state_e {
HDR_STATE_NULL,
HDR_STATE_GET,
HDR_STATE_SET,
};
struct tvin_hdr_property_s {
unsigned int x;/* max */
unsigned int y;/* min */
};
struct tvin_hdr_data_s {
enum tvin_hdr_eotf_e eotf:8;
unsigned char metadata_id;
unsigned char length;
unsigned char reserved;
struct tvin_hdr_property_s primaries[3];
struct tvin_hdr_property_s white_points;
struct tvin_hdr_property_s master_lum;/* max min lum */
unsigned int mcll;
unsigned int mfall;
};
struct tvin_hdr_info_s {
struct tvin_hdr_data_s hdr_data;
enum tvin_hdr_state_e hdr_state;
unsigned int hdr_check_cnt;
};
enum tvin_cn_type_e {
GRAPHICS,
PHOTO,
CINEMA,
GAME,
};
struct tvin_latency_s {
bool allm_mode;
bool it_content;
enum tvin_cn_type_e cn_type;
};
struct tvin_sig_property_s {
enum tvin_trans_fmt trans_fmt;
enum tvin_color_fmt_e color_format;
/* for vdin matrix destination color fmt */
enum tvin_color_fmt_e dest_cfmt;
enum tvin_aspect_ratio_e aspect_ratio;
unsigned int dvi_info;
unsigned short scaling4h; /* for vscaler */
unsigned short scaling4w; /* for hscaler */
unsigned int hs; /* for horizontal start cut window */
unsigned int he; /* for horizontal end cut window */
unsigned int vs; /* for vertical start cut window */
unsigned int ve; /* for vertical end cut window */
unsigned int pre_vs; /* for vertical start cut window */
unsigned int pre_ve; /* for vertical end cut window */
unsigned int pre_hs; /* for horizontal start cut window */
unsigned int pre_he; /* for horizontal end cut window */
unsigned int decimation_ratio; /* for decimation */
unsigned int colordepth; /* for color bit depth */
unsigned int vdin_hdr_Flag;
enum tvin_color_fmt_range_e color_fmt_range;
struct tvin_hdr_info_s hdr_info;
bool dolby_vision;/*is signal dolby version*/
bool low_latency;/*is low latency dolby mode*/
uint8_t fps;
unsigned int skip_vf_num;/*skip pre vframe num*/
struct tvin_latency_s latency;
};
#define TVAFE_VF_POOL_SIZE 6 /* 8 */
#define VDIN_VF_POOL_MAX_SIZE 6 /* 8 */
#define TVHDMI_VF_POOL_SIZE 6 /* 8 */
#define BT656IN_ANCI_DATA_SIZE 0x4000 /* save anci data from bt656in */
#define CAMERA_IN_ANCI_DATA_SIZE 0x4000 /* save anci data from bt656in */
#endif /* __TVIN_GLOBAL_H */