10 #include <soc/addressmap.h>
17 #include <soc/clk_rst.h>
18 #include <soc/clock.h>
20 #include <soc/display.h>
24 #define APBDEV_PMC_DPD_SAMPLE (0x20)
25 #define APBDEV_PMC_DPD_SAMPLE_ON_DISABLE (0)
26 #define APBDEV_PMC_DPD_SAMPLE_ON_ENABLE (1)
27 #define APBDEV_PMC_SEL_DPD_TIM (0x1c8)
28 #define APBDEV_PMC_SEL_DPD_TIM_SEL_DPD_TIM_DEFAULT (0x7f)
29 #define APBDEV_PMC_IO_DPD2_REQ (0x1c0)
30 #define APBDEV_PMC_IO_DPD2_REQ_LVDS_SHIFT (25)
31 #define APBDEV_PMC_IO_DPD2_REQ_LVDS_OFF (0 << 25)
32 #define APBDEV_PMC_IO_DPD2_REQ_LVDS_ON (1 << 25)
33 #define APBDEV_PMC_IO_DPD2_REQ_CODE_SHIFT (30)
34 #define APBDEV_PMC_IO_DPD2_REQ_CODE_DEFAULT_MASK (0x3 << 30)
35 #define APBDEV_PMC_IO_DPD2_REQ_CODE_IDLE (0 << 30)
36 #define APBDEV_PMC_IO_DPD2_REQ_CODE_DPD_OFF (1 << 30)
37 #define APBDEV_PMC_IO_DPD2_REQ_CODE_DPD_ON (2 << 30)
38 #define APBDEV_PMC_IO_DPD2_STATUS (0x1c4)
39 #define APBDEV_PMC_IO_DPD2_STATUS_LVDS_SHIFT (25)
40 #define APBDEV_PMC_IO_DPD2_STATUS_LVDS_OFF (0 << 25)
41 #define APBDEV_PMC_IO_DPD2_STATUS_LVDS_ON (1 << 25)
43 #define DC_N_WINDOWS 5
77 u32 pe_reg,
u32 vs_reg,
u32 pc_reg,
u8 pc_supported)
93 u32 temp = timeout_us;
99 if (timeout_us > poll_interval_us)
100 timeout_us -= poll_interval_us;
103 }
while ((reg_val &
mask) != exp_val);
105 if ((reg_val &
mask) == exp_val)
108 "sor_poll_register 0x%x: timeout, "
109 "(reg_val)0x%08x & (mask)0x%08x != (exp_val)0x%08x\n",
110 reg, reg_val,
mask, exp_val);
125 if (reg_val == orig_val)
137 "dc timeout waiting for SOR_PWR = NEW_DONE\n");
163 switch (training_pattern) {
170 0x43434343 : 0x42424242;
206 "dp: timeout while waiting for SOR lane sequencer "
207 "to power down langes\n");
214 u32 lane_count,
int pu)
221 switch (lane_count) {
234 "dp: invalid lane number %d\n", lane_count);
272 "dp: timeout while waiting for SOR PWM setting\n");
359 "PMC_IO_DPD2 polling failed (0x%x)\n", reg_val);
423 switch (lane_count) {
517 #define DUMP_REG(a) printk(BIOS_INFO, "%-32s %03x %08x\n", \
518 #a, a, tegra_sor_readl(sor, a));
594 const int head_num = 0;
597 u32 vblank_end, hblank_end;
598 u32 vblank_start, hblank_start;
620 vsync_end =
config->vsync_width - 1;
626 vblank_end = vsync_end +
config->vback_porch;
632 vblank_start = vblank_end +
config->yres;
633 hblank_start = hblank_end +
config->xres;
819 u32 drive_current = 0;
820 u32 pre_emphasis = 0;
826 drive_current = 0x13131313;
879 "Wait for lane power down failed: %d\n", err);
902 "dp: invalid lane number %d\n", cfg->
lane_count);
917 u32 temp = timeout_us;
922 reg_val =
READL(reg);
923 if (timeout_us > poll_interval_us)
924 timeout_us -= poll_interval_us;
927 }
while ((reg_val &
mask) != exp_val);
929 if ((reg_val &
mask) == exp_val)
943 "dc timeout waiting for DC to stop\n");
964 int selected_windows, i;
1009 int selected_windows, i;
1043 unsigned long dc_int_mask;
1059 "dc timeout waiting for OPMOD = SLEEP\n");
#define printk(level,...)
#define DISP_CTRL_MODE_STOP
#define DISP_CTRL_MODE_C_DISPLAY
unsigned long READL(void *p)
#define VSYNC_H_POSITION(x)
void WRITEL(unsigned long value, void *p)
#define BIOS_INFO
BIOS_INFO - Expected events.
#define BIOS_ERR
BIOS_ERR - System in incomplete state.
#define BIOS_WARNING
BIOS_WARNING - Bad configuration.
void sor_clock_start(void)
struct tegra_dc_dp_link_config link_cfg
struct tegra_dc_dp_link_config * link_cfg
#define NV_SOR_POSTCURSOR(i)
#define NV_SOR_DP_AUDIO_VBLANK_SYMBOLS_MASK
#define NV_SOR_DP_AUDIO_VBLANK_SYMBOLS
#define NV_SOR_LANE_SEQ_CTL_SETTING_MASK
#define NV_SOR_LANE_DRIVE_CURRENT(i)
#define NV_SOR_PWR_SETTING_NEW_DONE
#define NV_SOR_PWM_CTL_SETTING_NEW_TRIGGER
#define NV_SOR_PWR_SETTING_NEW_DEFAULT_MASK
#define NV_SOR_SUPER_STATE1_ASY_ORMODE_SAFE
#define NV_SOR_PLL2_AUX8_SEQ_PLLCAPPD_ENFORCE_MASK
#define NV_SOR_PWM_CTL_DUTY_CYCLE_MASK
#define NV_SOR_PLL1_TMDS_TERM_ENABLE
#define NV_SOR_DP_CONFIG_ACTIVESYM_CNTL_ENABLE
#define NV_HEAD_STATE1(i)
#define NV_SOR_DP_CONFIG(i)
#define NV_SOR_CLK_CNTRL_DP_LINK_SPEED_MASK
#define NV_SOR_DP_PADCTL_PD_TXD_1_YES
#define NV_SOR_TEST_ACT_HEAD_OPMODE_AWAKE
#define NV_SOR_CLK_CNTRL_DP_LINK_SPEED_G1_62
#define NV_HEAD_STATE1_HTOTAL_SHIFT
#define NV_SOR_STATE1_ASY_CRCMODE_COMPLETE_RASTER
#define NV_SOR_PWR_SETTING_NEW_TRIGGER
#define NV_SOR_DP_LINKCTL(i)
#define NV_SOR_DP_LINKCTL_ENHANCEDFRAME_ENABLE
#define NV_SOR_LANE_SEQ_CTL_SEQUENCE_DOWN
#define NV_SOR_CLK_CNTRL_DP_CLK_SEL_SINGLE_DPCLK
#define NV_SOR_PLL0_VCOPD_ASSERT
#define NV_SOR_PLL2_AUX1_SEQ_MASK
#define NV_HEAD_STATE4_VBLANK_START_SHIFT
#define NV_SOR_PLL2_AUX6_BANDGAP_POWERDOWN_ENABLE
#define NV_SOR_DP_CONFIG_ACTIVESYM_POLARITY_POSITIVE
#define NV_SOR_STATE1_ASY_SUBOWNER_NONE
#define NV_SOR_DP_PADCTL(i)
#define NV_SOR_PLL0_VCOPD_MASK
#define NV_SOR_PLL2_AUX2_OVERRIDE_POWERDOWN
#define NV_SOR_LANE_SEQ_CTL_SETTING_NEW_TRIGGER
#define NV_SOR_DP_LINKCTL_TUSIZE_SHIFT
#define NV_SOR_DP_LINKCTL_LANECOUNT_TWO
#define NV_SOR_DP_SPARE_SOR_CLK_SEL_MACRO_SORCLK
#define NV_SOR_PWM_CTL_SETTING_NEW_DONE
#define NV_SOR_PLL1_TERM_COMPOUT_HIGH
#define NV_SOR_PLL2_AUX6_BANDGAP_POWERDOWN_MASK
#define NV_SOR_LANE_SEQ_CTL_NEW_POWER_STATE_PD
#define NV_SOR_DP_PADCTL_PD_TXD_0_NO
#define NV_SOR_DP_CONFIG_RD_RESET_VAL_NEGATIVE
#define NV_HEAD_STATE0(i)
#define NV_SOR_DP_PADCTL_TX_PU_MASK
#define NV_SOR_SUPER_STATE1_ATTACHED_NO
#define NV_SOR_SEQ_INST(i)
#define NV_HEAD_STATE3_HBLANK_END_SHIFT
#define NV_SOR_STATE1_ASY_OWNER_HEAD0
#define NV_SOR_DP_CONFIG_ACTIVESYM_COUNT_MASK
#define NV_SOR_DP_PADCTL_PAD_CAL_PD_POWERUP
#define NV_SOR_PLL2_AUX9_LVDSEN_OVERRIDE
#define NV_SOR_DP_PADCTL_PAD_CAL_PD_POWERDOWN
#define NV_SOR_LANE_SEQ_CTL
#define NV_SOR_LANE4_PREEMPHASIS(i)
#define NV_SOR_DP_PADCTL_PD_TXD_1_NO
#define NV_SOR_LANE_SEQ_CTL_NEW_POWER_STATE_PU
#define NV_SOR_STATE1_ASY_VSYNCPOL_NEGATIVE_TRUE
#define NV_SOR_DP_PADCTL_TX_PU_DISABLE
#define NV_HEAD_STATE2(i)
#define NV_HEAD_STATE2_HSYNC_END_SHIFT
#define NV_HEAD_STATE4(i)
#define NV_HEAD_STATE1_VTOTAL_SHIFT
#define NV_SOR_PLL2_AUX7_PORT_POWERDOWN_ENABLE
#define NV_SOR_PLL0_PWR_OFF
#define NV_SOR_STATE1_ASY_PROTOCOL_LVDS_CUSTOM
#define NV_HEAD_STATE4_HBLANK_START_SHIFT
#define NV_SOR_PWR_NORMAL_STATE_PD
#define NV_SOR_SUPER_STATE1_ASY_ORMODE_NORMAL
#define NV_SOR_CSTM_ROTCLK_SHIFT
#define NV_SOR_PLL0_VCOCAP_SHIFT
#define NV_SOR_DP_PADCTL_PD_TXD_2_NO
#define NV_SOR_PLL2_AUX7_PORT_POWERDOWN_DISABLE
#define NV_SOR_DP_DEBUG(i)
#define NV_SOR_DP_LINKCTL_TUSIZE_MASK
#define NV_SOR_PLL2_AUX8_SEQ_PLLCAPPD_ENFORCE_DISABLE
#define NV_SOR_DP_LINKCTL_LANECOUNT_ZERO
#define NV_SOR_SUPER_STATE1
#define NV_SOR_DP_PADCTL_TX_PU_VALUE_DEFAULT_MASK
#define NV_SOR_CSTM_LVDS_EN_ENABLE
#define NV_SOR_PLL0_VCOPD_RESCIND
#define TEGRA_SOR_TIMEOUT_MS
#define NV_SOR_DP_SPARE_PANEL_INTERNAL
#define TEGRA_SOR_ATTACH_TIMEOUT_MS
#define NV_SOR_DP_CONFIG_ACTIVESYM_FRAC_SHIFT
#define NV_SOR_PLL2_AUX2_MASK
#define NV_SOR_CSTM_LVDS_EN_DISABLE
#define NV_SOR_DP_AUDIO_HBLANK_SYMBOLS_MASK
#define NV_SOR_DP_CONFIG_ACTIVESYM_FRAC_MASK
#define NV_SOR_PLL3_PLLVDD_MODE_V3_3
#define NV_SOR_SUPER_STATE0
#define SOR_LINK_SPEED_G1_62
#define NV_SOR_TEST_ACT_HEAD_OPMODE_SLEEP
#define NV_SOR_PWR_NORMAL_STATE_PU
#define SOR_LINK_SPEED_G5_4
#define NV_SOR_PLL2_AUX1_SEQ_PLLCAPPD_OVERRIDE
#define NV_SOR_PLL3_PLLVDD_MODE_MASK
#define NV_HEAD_STATE2_VSYNC_END_SHIFT
#define NV_SOR_PLL2_AUX6_BANDGAP_POWERDOWN_DISABLE
#define NV_SOR_DP_LINKCTL_LANECOUNT_FOUR
#define NV_SOR_PLL2_AUX8_SEQ_PLLCAPPD_ENFORCE_ENABLE
#define NV_SOR_DP_PADCTL_PD_TXD_3_NO
#define NV_SOR_DP_SPARE(i)
#define NV_SOR_STATE1_ASY_PIXELDEPTH_BPP_18_444
#define NV_SOR_DP_AUDIO_HBLANK_SYMBOLS
#define NV_SOR_DP_LINKCTL_LANECOUNT_MASK
#define NV_SOR_SUPER_STATE1_ATTACHED_YES
#define NV_SOR_TEST_ACT_HEAD_OPMODE_DEFAULT_MASK
#define NV_SOR_DP_CONFIG_ACTIVESYM_COUNT_SHIFT
#define NV_SOR_STATE1_ASY_PIXELDEPTH_BPP_24_444
#define NV_SOR_DP_CONFIG_WATERMARK_MASK
#define NV_SOR_PWM_CTL_SETTING_NEW_SHIFT
#define SOR_LINK_SPEED_G2_7
#define NV_SOR_DP_LINKCTL_LANECOUNT_ONE
#define NV_SOR_PLL0_PLLREG_LEVEL_V45
#define NV_HEAD_STATE5(i)
#define NV_SOR_DP_LINKCTL_ENABLE_YES
#define NV_SOR_PLL0_PWR_MASK
#define NV_SOR_CSTM_ROTCLK_DEFAULT_MASK
#define NV_SOR_STATE1_ASY_HSYNCPOL_NEGATIVE_TRUE
#define NV_SOR_DP_PADCTL_TX_PU_ENABLE
#define NV_SOR_CLK_CNTRL_DP_CLK_SEL_MASK
#define NV_SOR_DP_PADCTL_PD_TXD_2_YES
#define NV_SOR_CLK_CNTRL_DP_LINK_SPEED_SHIFT
#define NV_SOR_DP_PADCTL_COMODE_TXD_0_DP_TXD_2_SHIFT
#define NV_SOR_LANE_SEQ_CTL_SEQUENCE_UP
#define NV_SOR_TEST_ATTACHED_TRUE
#define NV_SOR_PLL0_ICHPMP_SHFIT
#define NV_HEAD_STATE3_VBLANK_END_SHIFT
#define NV_SOR_SUPER_STATE1_ASY_HEAD_OP_SLEEP
#define NV_SOR_DP_SPARE_SEQ_ENABLE_YES
#define NV_SOR_PLL0_RESISTORSEL_EXT
#define NV_SOR_CLK_CNTRL_DP_LINK_SPEED_LVDS
#define NV_SOR_PLL0_PWR_ON
#define NV_SOR_DP_PADCTL_PD_TXD_3_YES
#define NV_SOR_STATE1_ASY_PROTOCOL_DP_A
#define NV_SOR_LANE_SEQ_CTL_SETTING_NEW_DONE
#define NV_SOR_PLL2_AUX7_PORT_POWERDOWN_MASK
#define NV_SOR_DP_LINKCTL_ENABLE_NO
#define NV_SOR_DP_PADCTL_TX_PU_VALUE_SHIFT
#define NV_SOR_SUPER_STATE1_ASY_HEAD_OP_AWAKE
#define NV_SOR_LANE_SEQ_CTL_DELAY_SHIFT
#define NV_HEAD_STATE3(i)
void tegra_dc_sor_set_lane_count(struct tegra_dc_sor_data *sor, u8 lane_count)
void tegra_dc_sor_attach(struct tegra_dc_sor_data *sor)
void tegra_dc_sor_read_link_config(struct tegra_dc_sor_data *sor, u8 *link_bw, u8 *lane_count)
void tegra_dc_sor_set_dp_linkctl(struct tegra_dc_sor_data *sor, int ena, u8 training_pattern, const struct tegra_dc_dp_link_config *link_cfg)
void tegra_dc_sor_set_voltage_swing(struct tegra_dc_sor_data *sor)
void tegra_dc_sor_set_internal_panel(struct tegra_dc_sor_data *sor, int is_int)
void tegra_dp_disable_tx_pu(struct tegra_dc_sor_data *sor)
void tegra_dc_sor_set_link_bandwidth(struct tegra_dc_sor_data *sor, u8 link_bw)
int tegra_dc_sor_set_power_state(struct tegra_dc_sor_data *sor, int pu_pd)
void tegra_dc_sor_set_lane_parm(struct tegra_dc_sor_data *sor, const struct tegra_dc_dp_link_config *link_cfg)
void tegra_sor_precharge_lanes(struct tegra_dc_sor_data *sor)
void tegra_dc_sor_enable_dp(struct tegra_dc_sor_data *sor)
void tegra_dc_sor_set_panel_power(struct tegra_dc_sor_data *sor, int power_up)
void tegra_dc_sor_power_down_unused_lanes(struct tegra_dc_sor_data *sor)
void tegra_dp_set_pe_vs_pc(struct tegra_dc_sor_data *sor, u32 mask, u32 pe_reg, u32 vs_reg, u32 pc_reg, u8 pc_supported)
#define TEGRA_DC_POLL_TIMEOUT_MS
#define APBDEV_PMC_IO_DPD2_REQ_CODE_DEFAULT_MASK
#define APBDEV_PMC_IO_DPD2_REQ_LVDS_ON
static void tegra_dc_sor_io_set_dpd(struct tegra_dc_sor_data *sor, int up)
static void tegra_dc_sor_config_panel(struct tegra_dc_sor_data *sor, int is_lvds)
static void tegra_dc_sor_disable_win_short_raster(struct display_controller *disp_ctrl, int *dc_reg_ctx)
static int tegra_dc_sor_power_dplanes(struct tegra_dc_sor_data *sor, u32 lane_count, int pu)
static int tegra_dc_sor_enable_lane_sequencer(struct tegra_dc_sor_data *sor, int pu, int is_lvds)
static u32 tegra_dc_sor_poll_register(struct tegra_dc_sor_data *sor, u32 reg, u32 mask, u32 exp_val, u32 poll_interval_us, u32 timeout_us)
#define APBDEV_PMC_IO_DPD2_REQ
static void tegra_dc_sor_super_update(struct tegra_dc_sor_data *sor)
#define APBDEV_PMC_IO_DPD2_REQ_CODE_DPD_ON
static void tegra_dc_sor_power_up(struct tegra_dc_sor_data *sor, int is_lvds)
#define APBDEV_PMC_IO_DPD2_STATUS_LVDS_ON
static void tegra_dc_sor_enable_sor(struct tegra_dc_sor_data *sor, int enable)
static void tegra_dc_sor_enable_dc(struct tegra_dc_sor_data *sor)
static void tegra_sor_enable_edp_clock(struct tegra_dc_sor_data *sor)
static u32 tegra_sor_readl(struct tegra_dc_sor_data *sor, u32 reg)
static void tegra_sor_write_field(struct tegra_dc_sor_data *sor, u32 reg, u32 mask, u32 val)
#define APBDEV_PMC_IO_DPD2_REQ_CODE_DPD_OFF
static void tegra_sor_writel(struct tegra_dc_sor_data *sor, u32 reg, u32 val)
#define APBDEV_PMC_SEL_DPD_TIM
static void tegra_dc_sor_general_act(struct display_controller *disp_ctrl)
static u32 tegra_dc_poll_register(void *reg, u32 mask, u32 exp_val, u32 poll_interval_us, u32 timeout_us)
#define APBDEV_PMC_IO_DPD2_REQ_LVDS_OFF
static void tegra_dc_sor_set_dp_mode(struct tegra_dc_sor_data *sor, const struct tegra_dc_dp_link_config *link_cfg)
#define APBDEV_PMC_DPD_SAMPLE_ON_ENABLE
#define APBDEV_PMC_IO_DPD2_STATUS
static void tegra_dc_sor_update(struct tegra_dc_sor_data *sor)
static void tegra_dc_sor_config_pwm(struct tegra_dc_sor_data *sor, u32 pwm_div, u32 pwm_dutycycle)
#define APBDEV_PMC_DPD_SAMPLE
static void tegra_dc_sor_restore_win_and_raster(struct display_controller *disp_ctrl, int *dc_reg_ctx)
void tegra_dc_detach(struct tegra_dc_sor_data *sor)
static struct tegra_dc_mode min_mode
#define APBDEV_PMC_DPD_SAMPLE_ON_DISABLE