/* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */ /* * include/amlogic/aml_lcd_vout.h * * Copyright (C) 2020 Amlogic, Inc. All rights reserved. * */ #ifndef INC_AML_LCD_VOUT_H #define INC_AML_LCD_VOUT_H #include #include #include #include #ifdef CONFIG_AML_LCD_TCON #include #endif /* ********************************** * debug print define * ********************************** */ //#define LCD_DEBUG_INFO extern unsigned int lcd_debug_print_flag; #define LCDPR(fmt, args...) printf("lcd: "fmt"", ## args) #define LCDERR(fmt, args...) printf("lcd: error: "fmt"", ## args) #define PR_BUF_MAX (4 * 1024) /* ********************************** * clk parameter bit define * pll_ctrl, div_ctrl, clk_ctrl * ********************************** */ /* ******** pll_ctrl ******** */ #define PLL_CTRL_OD3 20 /* [21:20] */ #define PLL_CTRL_OD2 18 /* [19:18] */ #define PLL_CTRL_OD1 16 /* [17:16] */ #define PLL_CTRL_N 9 /* [13:9] */ #define PLL_CTRL_M 0 /* [8:0] */ /* ******** div_ctrl ******** */ #define DIV_CTRL_EDP_DIV1 24 /* [26:24] */ #define DIV_CTRL_EDP_DIV0 20 /* [23:20] */ #define DIV_CTRL_DIV_SEL 8 /* [15:8] */ #define DIV_CTRL_XD 0 /* [7:0] */ /* ******** clk_ctrl ******** */ #define CLK_CTRL_LEVEL 28 /* [30:28] */ #define CLK_CTRL_FRAC_SHIFT 24 /* [24] */ #define CLK_CTRL_FRAC 0 /* [23:0] */ /* ********************************** * VENC to TCON sync delay * ********************************** */ #define TTL_DELAY 13 #define PRE_DE_DELAY 8 #define LCD_PINMUX_END 0xff #define LCD_PINMUX_NUM 15 /* ********************************** * global control define * ********************************** */ enum lcd_mode_e { LCD_MODE_TV = 0, LCD_MODE_TABLET, LCD_MODE_MAX, }; enum lcd_chip_e { LCD_CHIP_GXTVBB = 0, LCD_CHIP_GXL, /* 1 */ LCD_CHIP_GXM, /* 2 */ LCD_CHIP_TXL, /* 3 */ LCD_CHIP_TXLX, /* 4 */ LCD_CHIP_AXG, /* 5 */ LCD_CHIP_TXHD, /* 6 */ LCD_CHIP_G12A, /* 7 */ LCD_CHIP_G12B, /* 8 */ LCD_CHIP_TL1, /* 9 */ LCD_CHIP_SM1, /* 10 */ LCD_CHIP_TM2, /* 11 */ LCD_CHIP_T5, /* 12 */ LCD_CHIP_T5D, /* 13 */ LCD_CHIP_T5W, /* 14 */ LCD_CHIP_MAX, }; enum lcd_type_e { LCD_TTL = 0, LCD_LVDS, LCD_VBYONE, LCD_MIPI, LCD_MLVDS, LCD_P2P, LCD_TYPE_MAX, }; #define MOD_LEN_MAX 48 struct lcd_basic_s { char model_name[MOD_LEN_MAX]; enum lcd_type_e lcd_type; unsigned char lcd_bits; unsigned char config_check; unsigned short screen_width; /* screen physical width in "mm" unit */ unsigned short screen_height; /* screen physical height in "mm" unit */ }; #define LCD_CLK_FRAC_UPDATE (1 << 0) #define LCD_CLK_PLL_CHANGE (1 << 1) #define LCD_CLK_PLL_RESET (1 << 2) struct lcd_timing_s { struct lcd_detail_timing_s dft_timing; //panel parameter probe stage struct lcd_detail_timing_s base_timing; //panel parameter init stage struct lcd_detail_timing_s act_timing; //panel parameter actual stage unsigned char pll_flag; unsigned char clk_change; /* internal used */ unsigned int ss_level; unsigned int ss_freq; unsigned int ss_mode; unsigned int enc_clk; unsigned long long bit_rate; /* Hz */ unsigned int pll_ctrl; /* pll settings */ unsigned int div_ctrl; /* divider settings */ unsigned int clk_ctrl; /* clock settings */ unsigned int hstart; unsigned int hend; unsigned int vstart; unsigned int vend; unsigned char pre_de_h; unsigned char pre_de_v; unsigned short de_hs_addr; unsigned short de_he_addr; unsigned short de_vs_addr; unsigned short de_ve_addr; unsigned short hs_hs_addr; unsigned short hs_he_addr; unsigned short hs_vs_addr; unsigned short hs_ve_addr; unsigned short vs_hs_addr; unsigned short vs_he_addr; unsigned short vs_vs_addr; unsigned short vs_ve_addr; unsigned short pre_h_de_start; unsigned short pre_h_de_end; unsigned short pre_v_de_start; unsigned short pre_v_de_end; unsigned short pre_hso_start; unsigned short pre_hso_end; unsigned short pre_vso_hstart; unsigned short pre_vso_hend; unsigned short pre_vso_start; unsigned short pre_vso_end; }; struct lcd_disp_tmg_req_s { unsigned int alert_level;//0:disable, 1:warning, 2:fatal err unsigned int hswbp_vid; unsigned int hfp_vid; unsigned int vswbp_vid; unsigned int vfp_vid; }; struct ttl_config_s { unsigned int clk_pol; unsigned int sync_valid; /* [1]DE, [0]hvsync */ unsigned int swap_ctrl; /* [1]rb swap, [0]bit swap */ }; #define LVDS_PHY_VSWING_DFT 3 #define LVDS_PHY_PREEM_DFT 0 #define LVDS_PHY_CLK_VSWING_DFT 0 #define LVDS_PHY_CLK_PREEM_DFT 0 struct lvds_config_s { unsigned int lvds_repack; unsigned int dual_port; unsigned int pn_swap; unsigned int port_swap; unsigned int lane_reverse; unsigned int port_sel; unsigned int phy_vswing; unsigned int phy_preem; unsigned int phy_clk_vswing; unsigned int phy_clk_preem; }; #define VX1_PHY_VSWING_DFT 3 #define VX1_PHY_PREEM_DFT 0 #define VX1_PWR_ON_RESET_DLY_DFT 500 /* 500ms */ #define VX1_HPD_DATA_DELAY_DFT 10 /* 10ms */ #define VX1_CDR_TRAINING_HOLD_DFT 200 /* 200ms */ #define VX1_SW_FILTER_TIME_DFT 10 /* 10*100us=1ms */ #define VX1_SW_FILTER_CNT_DFT 6 #define VX1_SW_FILTER_RETRY_CNT_DFT 2 #define VX1_SW_FILTER_RETRY_DLY_DFT 100 /* 100ms */ #define VX1_SW_CDR_DET_TIME_DFT 20 /* 20us*100=2ms */ #define VX1_SW_CDR_DET_CNT_DFT 100 #define VX1_SW_CDR_TIMEOUT_CNT_DFT 100 struct vbyone_config_s { unsigned int lane_count; unsigned int region_num; unsigned int byte_mode; unsigned int color_fmt; unsigned int phy_div; unsigned int phy_vswing; /*[5:4]:ext_pullup, [3:0]vswing*/ unsigned int phy_preem; unsigned int ctrl_flag; /* bit[0]:power_on_reset_en bit[1]:hpd_data_delay_en bit[2]:cdr_training_hold_en bit[3]:hw_filter_en bit[5:4]:sw_filter */ /* ctrl timing */ unsigned int power_on_reset_delay; /* ms */ unsigned int hpd_data_delay; /* ms */ unsigned int cdr_training_hold; /* ms */ /* hw filter */ unsigned int hpd_hw_filter_time; /* ms */ unsigned int hpd_hw_filter_cnt; unsigned int lockn_hw_filter_time; /* ms */ unsigned int lockn_hw_filter_cnt; /* sw filter */ unsigned int vx1_sw_filter_en; /* 0=disable, 1=sw_filter, 2=sw_filter with sw_reset */ unsigned int vx1_sw_filter_time; /* 100us base */ unsigned int vx1_sw_filter_cnt; unsigned int vx1_sw_filter_retry_cnt; unsigned int vx1_sw_filter_retry_delay; /* ms base */ unsigned int vx1_sw_cdr_detect_time; /* us base * 100 times, must cover tcon lockn pulse */ unsigned int vx1_sw_cdr_detect_cnt; unsigned int vx1_sw_cdr_timeout_cnt; /* hw filter */ unsigned int hw_filter_time; unsigned int hw_filter_cnt; }; /* mipi-dsi config */ /* Operation mode parameters */ #define OPERATION_VIDEO_MODE 0 #define OPERATION_COMMAND_MODE 1 #define SYNC_PULSE 0x0 #define SYNC_EVENT 0x1 #define BURST_MODE 0x2 /* command config */ #define DSI_CMD_SIZE_INDEX 1 /* byte[1] */ #define DSI_GPIO_INDEX 2 /* byte[2] */ #define DSI_INIT_ON_MAX 100 #define DSI_INIT_OFF_MAX 30 struct dsi_config_s { unsigned char lane_num; unsigned int bit_rate_max; unsigned int bit_rate_min; unsigned int clk_factor; /* bit_rate/pclk */ unsigned int factor_numerator; unsigned int factor_denominator; /* 100 */ unsigned char operation_mode_init; /* 0=video mode, 1=command mode */ unsigned char operation_mode_display; /* 0=video mode, 1=command mode */ unsigned char video_mode_type; /* 0=sync_pulse, 1=sync_event, 2=burst */ unsigned char clk_always_hs; /* 0=disable, 1=enable */ unsigned char phy_switch; /* 0=auto, 1=standard, 2=slow */ unsigned int venc_data_width; unsigned int dpi_data_format; unsigned char *dsi_init_on; unsigned char *dsi_init_off; unsigned char extern_init; unsigned char check_en; unsigned char check_reg; unsigned char check_cnt; unsigned char check_state; }; struct mlvds_config_s { unsigned int channel_num; unsigned int channel_sel0; unsigned int channel_sel1; unsigned int clk_phase; /* [14:13]=clk01_sel, * [12]=data bypass buffer, * [11:8]=pi2, [7:4]=pi1, [3:0]=pi0 */ unsigned int pn_swap; unsigned int bit_swap; /* MSB/LSB reverse */ unsigned int phy_vswing; unsigned int phy_preem; /* internal used */ unsigned int pi_clk_sel; /* bit[9:0] */ }; enum p2p_type_e { P2P_CEDS = 0, P2P_CMPI, P2P_ISP, P2P_EPI, P2P_CHPI = 0x10, /* low common mode */ P2P_CSPI, P2P_USIT, P2P_MAX, }; struct p2p_config_s { unsigned int p2p_type; /* bit[4:0] for type, bit[5] for vcm flag */ unsigned int lane_num; unsigned int channel_sel0; unsigned int channel_sel1; unsigned int pn_swap; unsigned int bit_swap; /* MSB/LSB reverse */ unsigned int phy_vswing; unsigned int phy_preem; }; #define PHY_BIT_VSWING (1 << 0) #define PHY_BIT_VCM (1 << 1) #define PHY_BIT_REF_BIAS (1 << 2) #define PHY_BIT_ODT (1 << 3) #define PHY_BIT_CV_MODE (1 << 4) #define PHY_BIT_LANE_PREEM (1 << 12) #define PHY_BIT_LAEN_AMP (1 << 13) #define PHY_BIT_LANE_SEL (1 << 14) #define PHY_PHASE_0 0 #define PHY_PHASE_A 1 #define PHY_PHASE_B 2 struct phy_lane_s { unsigned int preem; //flag bit[12] unsigned int amp; //flag bit[13] unsigned int sel; //flag bit[14] unsigned char phase_sel; }; #define PHY_CMODE 0 #define PHY_VMODE 1 #define CH_LANE_MAX 32 struct phy_config_s { unsigned int flag; unsigned int vswing; //flag bit[0] unsigned int vcm; //flag bit[1] unsigned int ref_bias; //flag bit[2] unsigned int odt; //flag bit[3] unsigned int cv_mode; //flag bit[4] //val:0=cm,1=vm unsigned int weakly_pull_down; struct phy_lane_s lane[CH_LANE_MAX]; unsigned int lane_num; unsigned int ch_swap0; unsigned int ch_swap1; unsigned int vswing_level; unsigned int ext_pullup; unsigned int preem_level; unsigned int low_common_mode; unsigned int clk_phase; unsigned int ckdi; unsigned int lane_valid; //(valid & mask)<