13 #include <soc/addressmap.h>
21 #define AUDIO_SAMPLERATE_DEFAULT (48*KHz)
23 #define hdmi_debug(x...) do { if (0) printk(BIOS_DEBUG, x); } while (0)
35 .
tmds = 25175, .n = 6144, .cts = 25175,
37 .tmds = 25200, .n = 6144, .cts = 25200,
39 .tmds = 27000, .n = 6144, .cts = 27000,
41 .tmds = 27027, .n = 6144, .cts = 27027,
43 .tmds = 40000, .n = 6144, .cts = 40000,
45 .tmds = 54000, .n = 6144, .cts = 54000,
47 .tmds = 54054, .n = 6144, .cts = 54054,
49 .tmds = 65000, .n = 6144, .cts = 65000,
51 .tmds = 74176, .n = 11648, .cts = 140625,
53 .tmds = 74250, .n = 6144, .cts = 74250,
55 .tmds = 83500, .n = 6144, .cts = 83500,
57 .tmds = 106500, .n = 6144, .cts = 106500,
59 .tmds = 108000, .n = 6144, .cts = 108000,
61 .tmds = 148352, .n = 5824, .cts = 140625,
63 .tmds = 148500, .n = 6144, .cts = 148500,
65 .tmds = 297000, .n = 5120, .cts = 247500,
89 .sym_ctr = 0x8009, .term = 0x0004, .vlev_ctr = 0x0272,
91 .mpixelclock = 148500,
92 .sym_ctr = 0x802b, .term = 0x0004, .vlev_ctr = 0x028d,
94 .mpixelclock = 297000,
95 .sym_ctr = 0x8039, .term = 0x0005, .vlev_ctr = 0x028d,
98 .sym_ctr = 0x0000, .term = 0x0000, .vlev_ctr = 0x0000,
105 .cpce = 0x00b3, .gmp = 0x0000, .curr = 0x0018,
107 .mpixelclock = 65000,
108 .cpce = 0x0072, .gmp = 0x0001, .curr = 0x0028,
110 .mpixelclock = 66000,
111 .cpce = 0x013e, .gmp = 0x0003, .curr = 0x0038,
113 .mpixelclock = 83500,
114 .cpce = 0x0072, .gmp = 0x0001, .curr = 0x0028,
116 .mpixelclock = 146250,
117 .cpce = 0x0051, .gmp = 0x0002, .curr = 0x0038,
119 .mpixelclock = 148500,
120 .cpce = 0x0051, .gmp = 0x0003, .curr = 0x0000,
123 .cpce = 0x0051, .gmp = 0x0003, .curr = 0x0000,
128 { 0x2000, 0x0000, 0x0000, 0x0000 },
129 { 0x0000, 0x2000, 0x0000, 0x0000 },
130 { 0x0000, 0x0000, 0x2000, 0x0000 }
183 hdmi_debug(
"audio not supported for pixel clk %d\n", pixel_clk);
201 u32 color_format = 0x01;
463 for (i = 0; i < 2; i++) {
472 hdmi_debug(
"hdmi phy config failure %d\n", ret);
482 u8 mdataenablepolarity = 1;
496 inv_val |= (mdataenablepolarity ?
606 hdmi_debug(
"hdmi, mode info : clock %d hdis %d vdis %d\n",
716 int shift = (block % 2) * 0x80;
717 int edid_read_err = 0;
752 for (j = 0; j < 8; j++) {
754 buff[8 * n + j] =
val;
762 return edid_read_err;
792 if (edid_buf[0x7e] != 0) {
804 hdmi_debug(
"failed to set mode to 640x480@60Hz\n");
static void write32(void *addr, uint32_t val)
static uint32_t read32(const void *addr)
#define clrsetbits32(addr, clear, set)
int set_display_mode(struct edid *edid, enum edid_modes mode)
int decode_edid(unsigned char *edid, int size, struct edid *out)
int gpio_get(gpio_t gpio)
void gpio_output(gpio_t gpio, int value)
void gpio_input_pullup(gpio_t gpio)
static int stopwatch_expired(struct stopwatch *sw)
static void stopwatch_init_msecs_expire(struct stopwatch *sw, long ms)
static struct rk3288_grf_regs *const rk3288_grf
#define IOMUX_HDMI_EDP_I2C_SDA
#define IOMUX_HDMI_EDP_I2C_SCL
static const struct hdmi_mpll_config rockchip_mpll_cfg[]
static void hdmi_phy_enable_spare(u8 enable)
static void hdmi_phy_sel_interface_control(u8 enable)
static u8 hdmi_get_plug_in_status(void)
static void hdmi_video_csc(void)
static const u32 csc_coeff_default[3][4]
static void hdmi_phy_gen2_pddq(u8 enable)
static void hdmi_phy_gen2_txpwron(u8 enable)
struct rk3288_hdmi_regs *const hdmi_regs
static void hdmi_init_interrupt(void)
int rk_hdmi_get_edid(struct edid *edid)
static void hdmi_update_csc_coeffs(void)
static void hdmi_video_sample(void)
static int hdmi_ddc_wait_i2c_done(int msec)
static int hdmi_phy_configure(u32 mpixelclock)
static int hdmi_setup(const struct edid *edid)
static int hdmi_phy_init(u32 mpixelclock)
static void hdmi_ddc_reset(void)
static void hdmi_audio_set_format(void)
static void hdmi_phy_enable_power(u8 enable)
static void hdmi_audio_set_samplerate(u32 pixel_clk)
static void hdmi_phy_sel_data_en_pol(u8 enable)
static void hdmi_enable_video_path(void)
static void hdmi_audio_fifo_reset(void)
static int hdmi_phy_wait_i2c_done(u32 msec)
static void hdmi_video_packetize(void)
int rk_hdmi_enable(const struct edid *edid)
int rk_hdmi_init(u32 vop_id)
static int hdmi_wait_for_hpd(void)
static int hdmi_read_edid(int block, u8 *buff)
static void hdmi_phy_i2c_write(u16 data, u8 addr)
static void hdmi_av_composer(const struct edid *edid)
static void hdmi_phy_test_clear(u8 bit)
static void hdmi_set_clock_regenerator(u32 n, u32 cts)
static const struct tmds_n_cts n_cts_table[]
static int hdmi_lookup_n_cts(u32 pixel_clk)
static void hdmi_phy_enable_tmds(u8 enable)
static void hdmi_clear_overflow(void)
static const struct hdmi_phy_config rockchip_phy_config[]
#define HDMI_EDID_BLOCK_SIZE
@ HDMI_VP_CONF_YCC422_EN_MASK
@ HDMI_PHY_CONF0_ENTMDS_OFFSET
@ HDMI_TX_INSTUFFING_BDBDATA_STUFFING_ENABLE
@ HDMI_PHY_CONF0_GEN2_TXPWRON_OFFSET
@ HDMI_MC_HEACPHY_RST_ASSERT
@ HDMI_VP_CONF_YCC422_EN_DISABLE
@ HDMI_FC_INVIDCONF_DE_IN_POLARITY_ACTIVE_HIGH
@ HDMI_TX_INSTUFFING_GYDATA_STUFFING_ENABLE
@ HDMI_VP_STUFF_PP_STUFFING_STUFFING_MODE
@ HDMI_FC_INVIDCONF_HSYNC_IN_POLARITY_ACTIVE_LOW
@ HDMI_AUD_CTS3_CTS_MANUAL
@ HDMI_IH_MUTE_MUTE_ALL_INTERRUPT
@ HDMI_VP_CONF_BYPASS_EN_MASK
@ HDMI_VP_STUFF_PR_STUFFING_STUFFING_MODE
@ HDMI_VP_STUFF_IDEFAULT_PHASE_MASK
@ HDMI_MC_SWRSTZ_TMDSSWRST_REQ
@ HDMI_MC_SWRSTZ_II2SSWRST_REQ
@ HDMI_VP_CONF_PR_EN_MASK
@ HDMI_VP_CONF_BYPASS_SELECT_MASK
@ HDMI_PHY_CONF0_PDZ_MASK
@ HDMI_TX_INVID0_VIDEO_MAPPING_MASK
@ HDMI_PHY_I2CM_OPERATION_ADDR_WRITE
@ HDMI_FC_INVIDCONF_DE_IN_POLARITY_ACTIVE_LOW
@ HDMI_CSC_SCALE_CSC_COLORDE_PTH_MASK
@ HDMI_PHY_CONF0_ENTMDS_MASK
@ HDMI_VP_PR_CD_COLOR_DEPTH_OFFSET
@ HDMI_FC_INVIDCONF_VSYNC_IN_POLARITY_ACTIVE_LOW
@ HDMI_CSC_CFG_INTMODE_DISABLE
@ HDMI_PHY_CONF0_PDZ_OFFSET
@ HDMI_PHY_CONF0_SELDIPIF_MASK
@ HDMI_MC_CLKDIS_AUDCLK_DISABLE
@ HDMI_VP_STUFF_YCC422_STUFFING_MASK
@ HDMI_AUD_N3_NCTS_ATOMIC_WRITE
@ HDMI_PHY_CONF0_SPARECTRL_MASK
@ HDMI_PHY_I2CM_CTLINT_ADDR_NAC_POL
@ HDMI_AUD_CONF0_SW_AUDIO_FIFO_RST
@ HDMI_PHY_CONF0_GEN2_PDDQ_MASK
@ HDMI_VP_STUFF_YCC422_STUFFING_STUFFING_MODE
@ HDMI_AUD_N3_AUDN19_16_MASK
@ HDMI_FC_INVIDCONF_DVI_MODEZ_HDMI_MODE
@ HDMI_FC_INVIDCONF_IN_I_P_PROGRESSIVE
@ HDMI_PHY_TST0_TSTCLR_OFFSET
@ HDMI_VP_CONF_PR_EN_DISABLE
@ HDMI_AUD_CONF0_I2S_IN_EN_0
@ HDMI_AUD_CONF1_I2S_WIDTH_16BIT
@ HDMI_PHY_I2CM_CTLINT_ADDR_ARBITRATION_POL
@ HDMI_VP_CONF_BYPASS_SELECT_VID_PACKETIZER
@ HDMI_I2CM_SLAVE_DDC_ADDR
@ HDMI_PHY_CONF0_SPARECTRL_OFFSET
@ HDMI_PHY_CONF0_SELDIPIF_OFFSET
@ HDMI_AUD_CONF0_I2S_SELECT
@ HDMI_I2CM_DIV_FAST_STD_MODE
@ HDMI_MC_PHYRSTZ_DEASSERT
@ HDMI_MC_FLOWCTRL_FEED_THROUGH_OFF_CSC_BYPASS
@ HDMI_VP_REMAP_YCC422_16BIT
@ HDMI_PHY_CONF0_SELDATAENPOL_OFFSET
@ HDMI_VP_STUFF_PP_STUFFING_MASK
@ HDMI_VP_CONF_PP_EN_ENMASK
@ HDMI_AUD_CTS3_AUDCTS19_16_MASK
@ HDMI_PHY_CONF0_GEN2_PDDQ_OFFSET
@ HDMI_PHY_TST0_TSTCLR_MASK
@ HDMI_AUD_CTS3_N_SHIFT_OFFSET
@ HDMI_CSC_SCALE_CSCSCALE_MASK
@ HDMI_IH_MUTE_MUTE_WAKEUP_INTERRUPT
@ HDMI_VP_CONF_OUTPUT_SELECTOR_BYPASS
@ HDMI_AUD_CONF1_I2S_MODE_STANDARD_MODE
@ HDMI_PHY_CONF0_GEN2_TXPWRON_MASK
@ HDMI_VP_CONF_OUTPUT_SELECTOR_MASK
@ HDMI_VP_PR_CD_DESIRED_PR_FACTOR_OFFSET
@ HDMI_VP_CONF_BYPASS_EN_ENABLE
@ HDMI_MC_CLKDIS_PIXELCLK_DISABLE
@ HDMI_FC_INVIDCONF_R_V_BLANK_IN_OSC_ACTIVE_LOW
@ HDMI_FC_INVIDCONF_VSYNC_IN_POLARITY_ACTIVE_HIGH
@ HDMI_VP_PR_CD_DESIRED_PR_FACTOR_MASK
@ HDMI_PHY_I2CM_SLAVE_ADDR_PHY_GEN2
@ HDMI_FC_INVIDCONF_HDCP_KEEPOUT_INACTIVE
@ HDMI_VP_STUFF_PR_STUFFING_MASK
@ HDMI_VP_CONF_PP_EN_DISABLE
@ HDMI_VP_PR_CD_COLOR_DEPTH_MASK
@ HDMI_FC_INVIDCONF_DVI_MODEZ_DVI_MODE
@ HDMI_TX_INVID0_VIDEO_MAPPING_OFFSET
@ HDMI_PHY_CONF0_SELDATAENPOL_MASK
@ HDMI_VP_STUFF_IDEFAULT_PHASE_OFFSET
@ HDMI_TX_INSTUFFING_RCRDATA_STUFFING_ENABLE
@ HDMI_CSC_SCALE_CSC_COLORDE_PTH_24BPP
@ HDMI_FC_INVIDCONF_HSYNC_IN_POLARITY_ACTIVE_HIGH
@ HDMI_MC_CLKDIS_TMDSCLK_DISABLE
@ HDMI_AUD_CTS3_N_SHIFT_1
@ HDMI_AUD_INPUTCLKFS_128
@ HDMI_TX_INVID0_INTERNAL_DE_GENERATOR_DISABLE
@ HDMI_PHY_I2CM_INT_ADDR_DONE_POL
int hdmi_monitor_detected
u32 i2cm_ss_scl_lcnt_0_addr
u32 phy_i2cm_operation_addr
u32 phy_i2cm_datao_1_addr
u32 phy_i2cm_datao_0_addr
u32 i2cm_ss_scl_hcnt_0_addr
u32 phy_i2cm_address_addr
struct rk3288_hdmi_regs::@1481 csc_coef[3][4]