} else {
rk_hdmi_property.defaultmode = HDMI_VIDEO_DEFAULT_MODE;
}
+ if (of_get_property(np, "rockchip,phy_table", &val)) {
+ hdmi_dev->phy_table = kmalloc(val, GFP_KERNEL);
+ if (!hdmi_dev->phy_table) {
+ pr_err("kmalloc phy table %d error\n", val);
+ return -ENOMEM;
+ }
+ hdmi_dev->phy_table_size =
+ val / sizeof(struct hdmi_dev_phy_para);
+ of_property_read_u32_array(np, "rockchip,phy_table",
+ (u32 *)hdmi_dev->phy_table,
+ val / sizeof(u32));
+ } else {
+ pr_info("hdmi phy_table not exist\n");
+ }
#ifdef CONFIG_MFD_SYSCON
hdmi_dev->grf_base =
syscon_regmap_lookup_by_phandle(np, "rockchip,grf");
platform_set_drvdata(pdev, hdmi_dev);
hdmi_dev->dev = &pdev->dev;
- rockchip_hdmiv2_parse_dt(hdmi_dev);
+ if (rockchip_hdmiv2_parse_dt(hdmi_dev))
+ goto failed;
/*request and remap iomem*/
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
failed1:
rockchip_hdmi_unregister(hdmi_dev->hdmi);
failed:
+ kfree(hdmi_dev->phy_table);
kfree(hdmi_dev);
hdmi_dev = NULL;
dev_err(&pdev->dev, "rk3288 hdmi probe error.\n");
phy_mpll->gmp_cntrl));
}
- rockchip_hdmiv2_write_phy(hdmi_dev, PHYTX_CLKSYMCTRL,
- v_OVERRIDE(1) | v_SLOPEBOOST(0) |
- v_TX_SYMON(1) | v_TX_TRAON(0) |
- v_TX_TRBON(0) | v_CLK_SYMON(1));
- if (hdmi_dev->tmdsclk > 340000000) {
- rockchip_hdmiv2_write_phy(hdmi_dev, PHYTX_TERM_RESIS,
- v_TX_TERM(R50_OHMS));
- rockchip_hdmiv2_write_phy(hdmi_dev, PHYTX_VLEVCTRL,
- v_SUP_TXLVL(9) |
- v_SUP_CLKLVL(17));
- } else {
- rockchip_hdmiv2_write_phy(hdmi_dev, PHYTX_TERM_RESIS,
- v_TX_TERM(R100_OHMS));
- if (hdmi_dev->tmdsclk > 165000000)
+ if (hdmi_dev->phy_table) {
+ for (i = 0; i < hdmi_dev->phy_table_size; i++)
+ if (hdmi_dev->tmdsclk <= hdmi_dev->phy_table[i].maxfreq)
+ break;
+ }
+ if (i == hdmi_dev->phy_table_size) {
+ pr_info("%s use default phy settings\n", __func__);
+ rockchip_hdmiv2_write_phy(hdmi_dev, PHYTX_CLKSYMCTRL,
+ v_OVERRIDE(1) | v_SLOPEBOOST(0) |
+ v_TX_SYMON(1) | v_CLK_SYMON(1) |
+ v_PREEMPHASIS(0));
+ if (hdmi_dev->tmdsclk > 340000000)
rockchip_hdmiv2_write_phy(hdmi_dev, PHYTX_VLEVCTRL,
+ v_SUP_TXLVL(9) |
+ v_SUP_CLKLVL(17));
+ else if (hdmi_dev->tmdsclk > 165000000)
+ rockchip_hdmiv2_write_phy(hdmi_dev,
+ PHYTX_VLEVCTRL,
v_SUP_TXLVL(14) |
v_SUP_CLKLVL(17));
else
- rockchip_hdmiv2_write_phy(hdmi_dev, PHYTX_VLEVCTRL,
+ rockchip_hdmiv2_write_phy(hdmi_dev,
+ PHYTX_VLEVCTRL,
v_SUP_TXLVL(18) |
v_SUP_CLKLVL(17));
+ } else {
+ stat = v_OVERRIDE(1) | v_TX_SYMON(1) | v_CLK_SYMON(1) |
+ v_PREEMPHASIS(hdmi_dev->phy_table[i].pre_emphasis) |
+ v_SLOPEBOOST(hdmi_dev->phy_table[i].slopeboost);
+ rockchip_hdmiv2_write_phy(hdmi_dev, PHYTX_CLKSYMCTRL, stat);
+
+ stat = v_SUP_CLKLVL(hdmi_dev->phy_table[i].clk_level) |
+ v_SUP_TXLVL(hdmi_dev->phy_table[i].data0_level);
+ rockchip_hdmiv2_write_phy(hdmi_dev, PHYTX_VLEVCTRL, stat);
}
+
+ if (hdmi_dev->tmdsclk > 340000000)
+ rockchip_hdmiv2_write_phy(hdmi_dev, PHYTX_TERM_RESIS,
+ v_TX_TERM(R50_OHMS));
+ else
+ rockchip_hdmiv2_write_phy(hdmi_dev, PHYTX_TERM_RESIS,
+ v_TX_TERM(R100_OHMS));
/* rockchip_hdmiv2_write_phy(hdmi_dev, 0x05, 0x8000); */
if (hdmi_dev->tmdsclk_ratio_change)
msleep(100);
*/
/* check if the PHY PLL is locked */
#define PHY_TIMEOUT 10000
+ i = 0;
while (i++ < PHY_TIMEOUT) {
if ((i % 10) == 0) {
stat = hdmi_readl(hdmi_dev, PHY_STAT0);