static int rk_edp_hw_link_training(struct rk_edp *edp) { u32 val; struct stopwatch sw; /* Set link rate and count as you want to establish*/ write32(&edp->regs->link_bw_set, edp->link_train.link_rate); write32(&edp->regs->lane_count_set, edp->link_train.lane_count); if (rk_edp_link_train_cr(edp)) return -1; if (rk_edp_link_train_ce(edp)) return -1; write32(&edp->regs->dp_hw_link_training, HW_LT_EN); stopwatch_init_msecs_expire(&sw, 10); do { val = read32(&edp->regs->dp_hw_link_training); if (!(val & HW_LT_EN)) break; } while (!stopwatch_expired(&sw)); if (val & HW_LT_ERR_CODE_MASK) { printk(BIOS_ERR, "edp hw link training error: %d\n", val >> HW_LT_ERR_CODE_SHIFT); return -1; }
static int rk_edp_hw_link_training(struct rk_edp_priv *edp) { ulong start; u32 val; int ret; /* Set link rate and count as you want to establish */ writel(edp->link_train.link_rate, &edp->regs->link_bw_set); writel(edp->link_train.lane_count, &edp->regs->lane_count_set); ret = rk_edp_link_train_cr(edp); if (ret) return ret; ret = rk_edp_link_train_ce(edp); if (ret) return ret; writel(HW_LT_EN, &edp->regs->dp_hw_link_training); start = get_timer(0); do { val = readl(&edp->regs->dp_hw_link_training); if (!(val & HW_LT_EN)) break; } while (get_timer(start) < 10); if (val & HW_LT_ERR_CODE_MASK) { printf("edp hw link training error: %d\n", val >> HW_LT_ERR_CODE_SHIFT); return -EIO; }