diff --git a/drivers/gpu/drm/rockchip/rockchip_lvds.c b/drivers/gpu/drm/rockchip/rockchip_lvds.c index af34354f44de..91f78e8f7160 100644 --- a/drivers/gpu/drm/rockchip/rockchip_lvds.c +++ b/drivers/gpu/drm/rockchip/rockchip_lvds.c @@ -21,6 +21,7 @@ #include #include +#include #include #include #include @@ -144,6 +145,9 @@ static inline int lvds_name_to_output(const char *s) static int innov2_lvds_power_on(struct rockchip_lvds *lvds) { + u32 status; + int ret; + if (lvds->output == DISPLAY_OUTPUT_RGB) { lvds_writel(lvds, RK3288_LVDS_CH0_REG0, RK3288_LVDS_CH0_REG0_TTL_EN | @@ -213,6 +217,13 @@ static int innov2_lvds_power_on(struct rockchip_lvds *lvds) writel(RK3288_LVDS_CFG_REGC_PLL_ENABLE, lvds->regs + RK3288_LVDS_CFG_REGC); + ret = readl_poll_timeout(lvds->regs + RK3288_LVDS_CH0_REGF, status, + status & RK3288_LVDS_CH0_PLL_LOCK, 500, 10000); + if (ret) { + dev_err(lvds->dev, "PLL is not lock\n"); + return ret; + } + writel(RK3288_LVDS_CFG_REG21_TX_ENABLE, lvds->regs + RK3288_LVDS_CFG_REG21); diff --git a/drivers/gpu/drm/rockchip/rockchip_lvds.h b/drivers/gpu/drm/rockchip/rockchip_lvds.h index d517d75ba365..0cc9fbe36535 100644 --- a/drivers/gpu/drm/rockchip/rockchip_lvds.h +++ b/drivers/gpu/drm/rockchip/rockchip_lvds.h @@ -71,6 +71,9 @@ #define RK3288_LVDS_CH0_REGD 0x34 #define RK3288_LVDS_CH0_REGD_PLL_PREDIV_MASK 0x1f +#define RK3288_LVDS_CH0_REGF 0x3c +#define RK3288_LVDS_CH0_PLL_LOCK BIT(1) + #define RK3288_LVDS_CH0_REG20 0x80 #define RK3288_LVDS_CH0_REG20_MSB 0x45 #define RK3288_LVDS_CH0_REG20_LSB 0x44