Required properties:
- compatible: value should be following:
- "rockchip,rk3288-hdmi",
- "rockchip,rk3368-hdmi",
"rockchip,rk3036-hdmi",
"rockchip,rk312x-hdmi",
+ "rockchip,rk3288-hdmi",
+ "rockchip,rk3366-hdmi",
+ "rockchip,rk3368-hdmi",
+ "rockchip,rk3399-hdmi",
- reg: physical base address of the hdmi and length of memory mapped
region.
- interrupts: interrupt number to the cpu.
#include "rockchip_hdmiv2.h"
#include "rockchip_hdmiv2_hw.h"
-#define HDMI_SEL_LCDC(x) ((((x) & 1) << 4) | (1 << 20))
+#define HDMI_SEL_LCDC(x, bit) ((((x) & 1) << bit) | (1 << (16 + bit)))
#define grf_writel(v, offset) writel_relaxed(v, RK_GRF_VIRT + offset)
+#define GRF_SOC_CON20 0x6250
static struct hdmi_dev *hdmi_dev;
static int rockchip_hdmiv2_clk_enable(struct hdmi_dev *hdmi_dev)
{
if (hdmi_dev->soctype == HDMI_SOC_RK322X ||
- hdmi_dev->soctype == HDMI_SOC_RK3366) {
+ hdmi_dev->soctype == HDMI_SOC_RK3366 ||
+ hdmi_dev->soctype == HDMI_SOC_RK3399) {
if ((hdmi_dev->clk_on & HDMI_EXT_PHY_CLK_ON) == 0) {
if (!hdmi_dev->pclk_phy) {
if (hdmi_dev->soctype == HDMI_SOC_RK322X)
{.compatible = "rockchip,rk3288-hdmi",},
{.compatible = "rockchip,rk3366-hdmi",},
{.compatible = "rockchip,rk3368-hdmi",},
+ {.compatible = "rockchip,rk3399-hdmi",},
{}
};
hdmi_dev->soctype = HDMI_SOC_RK322X;
} else if (!strcmp(match->compatible, "rockchip,rk3366-hdmi")) {
hdmi_dev->soctype = HDMI_SOC_RK3366;
+ } else if (!strcmp(match->compatible, "rockchip,rk3399-hdmi")) {
+ hdmi_dev->soctype = HDMI_SOC_RK3399;
} else {
pr_err("It is not a valid rockchip soc!");
return -ENOMEM;
}
/*lcdc source select*/
if (hdmi_dev->soctype == HDMI_SOC_RK3288) {
- grf_writel(HDMI_SEL_LCDC(rk_hdmi_property.videosrc),
+ grf_writel(HDMI_SEL_LCDC(rk_hdmi_property.videosrc, 4),
RK3288_GRF_SOC_CON6);
/* select GPIO7_C0 as cec pin */
grf_writel(((1 << 12) | (1 << 28)), RK3288_GRF_SOC_CON8);
+ } else if (hdmi_dev->soctype == HDMI_SOC_RK3399) {
+ regmap_write(hdmi_dev->grf_base,
+ GRF_SOC_CON20,
+ HDMI_SEL_LCDC(rk_hdmi_property.videosrc, 6));
}
rockchip_hdmiv2_dev_init_ops(&rk_hdmi_ops);
/* Register HDMI device */
SUPPORT_YUV420 |
SUPPORT_YCBCR_INPUT |
SUPPORT_TMDS_600M;
+ } else if (hdmi_dev->soctype == HDMI_SOC_RK3399) {
+ rk_hdmi_property.feature |=
+ SUPPORT_DEEP_10BIT |
+ SUPPORT_YCBCR_INPUT |
+ SUPPORT_1080I |
+ SUPPORT_480I_576I;
+ if (rk_hdmi_property.videosrc == DISPLAY_SOURCE_LCDC0)
+ rk_hdmi_property.feature |=
+ SUPPORT_4K |
+ SUPPORT_4K_4096 |
+ SUPPORT_YUV420 |
+ SUPPORT_YCBCR_INPUT |
+ SUPPORT_TMDS_600M;
} else {
ret = -ENXIO;
goto failed1;
clk_set_rate(hdmi_dev->pclk_phy, 148500000);
else
clk_set_rate(hdmi_dev->pclk_phy, hdmi_dev->pixelclk);
+ } else if (hdmi_dev->soctype == HDMI_SOC_RK3399) {
+ clk_set_rate(hdmi_dev->pclk_phy, hdmi_dev->pixelclk);
}
hdmi_msk_reg(hdmi_dev, PHY_I2CM_DIV,
int word_length = 0, channel = 0, mclk_fs;
unsigned int N = 0, CTS = 0;
int rate = 0;
+ char design_id;
HDMIDBG("%s\n", __func__);
hdmi_msk_reg(hdmi_dev, AUD_CONF0,
m_SW_AUD_FIFO_RST, v_SW_AUD_FIFO_RST(1));
hdmi_writel(hdmi_dev, MC_SWRSTZREQ, 0xF7);
- hdmi_writel(hdmi_dev, AUD_CONF2, 0x0);
+ design_id = hdmi_readl(hdmi_dev, DESIGN_ID);
+ if (design_id >= 0x21)
+ hdmi_writel(hdmi_dev, AUD_CONF2, 0x4);
+ else
+ hdmi_writel(hdmi_dev, AUD_CONF2, 0x0);
usleep_range(90, 100);
if (channel == I2S_CHANNEL_7_8) {
HDMIDBG("hbr mode.\n");
hdmi_writel(hdmi_dev, AUD_CONF2, 0x2);
word_length = I2S_24BIT_SAMPLE;
} else {
- hdmi_writel(hdmi_dev, AUD_CONF2, 0x0);
+ if (design_id >= 0x21)
+ hdmi_writel(hdmi_dev, AUD_CONF2, 0x4);
+ else
+ hdmi_writel(hdmi_dev, AUD_CONF2, 0x0);
}
hdmi_msk_reg(hdmi_dev, AUD_CONF0,
m_I2S_SEL | m_I2S_IN_EN,