/* set phy MPLL parameters */
val = readl(priv->base + CKCTRL0);
val &= ~CKCTRL0_NCY_MASK;
val |= FIELD_PREP(CKCTRL0_NCY_MASK, 0x6);
val &= ~CKCTRL0_NCY5_MASK;
val |= FIELD_PREP(CKCTRL0_NCY5_MASK, 0x2);
val &= ~CKCTRL0_PRESCALE_MASK;
val |= FIELD_PREP(CKCTRL0_PRESCALE_MASK, 0x1);
writel(val, priv->base + CKCTRL0);
/* setup phy control parameters */
val = readl(priv->base + CKCTRL1);
val &= ~CKCTRL1_LOS_LVL_MASK;
val |= FIELD_PREP(CKCTRL1_LOS_LVL_MASK, 0x10);
val &= ~CKCTRL1_TX_LVL_MASK;
val |= FIELD_PREP(CKCTRL1_TX_LVL_MASK, 0x06);
writel(val, priv->base + CKCTRL1);
val = readl(priv->base + RXTXCTRL);
val &= ~RXTXCTRL_RX_EQ_VALL_MASK;
val |= FIELD_PREP(RXTXCTRL_RX_EQ_VALL_MASK, 0x6);
val &= ~RXTXCTRL_RX_DPLL_MODE_MASK;
val |= FIELD_PREP(RXTXCTRL_RX_DPLL_MODE_MASK, 0x3);
val &= ~RXTXCTRL_TX_ATTEN_MASK;
val |= FIELD_PREP(RXTXCTRL_TX_ATTEN_MASK, 0x3);
val &= ~RXTXCTRL_TX_BOOST_MASK;
val |= FIELD_PREP(RXTXCTRL_TX_BOOST_MASK, 0x5);
val &= ~RXTXCTRL_TX_EDGERATE_MASK;
val |= FIELD_PREP(RXTXCTRL_TX_EDGERATE_MASK, 0x0);
writel(val, priv->base + RXTXCTRL);
return 0;
}
staticint uniphier_ahciphy_pro4_power_on(struct uniphier_ahciphy_priv *priv)
{
u32 val; int ret;
/* enable reference clock for phy */
val = readl(priv->base + CKCTRL0);
val &= ~CKCTRL0_CK_OFF;
writel(val, priv->base + CKCTRL0);
/* enable TX clock */
val = readl(priv->base + RXTXCTRL);
val |= RXTXCTRL_TX_CKO_EN;
writel(val, priv->base + RXTXCTRL);
/* wait until RX is ready */
ret = readl_poll_timeout(priv->base + RSTPWR, val,
!(val & RSTPWR_RX_EN_VAL), 200, 2000); if (ret) {
dev_err(priv->dev, "Failed to check whether Rx is ready\n"); goto out_disable_clock;
}
/* release all reset */
ret = reset_control_deassert(priv->rst_pm); if (ret) {
dev_err(priv->dev, "Failed to release PM reset\n"); goto out_disable_clock;
}
ret = reset_control_deassert(priv->rst_tx); if (ret) {
dev_err(priv->dev, "Failed to release Tx reset\n"); goto out_reset_pm_assert;
}
ret = reset_control_deassert(priv->rst_rx); if (ret) {
dev_err(priv->dev, "Failed to release Rx reset\n"); goto out_reset_tx_assert;
}
staticint uniphier_ahciphy_pxs3_init(struct uniphier_ahciphy_priv *priv)
{ int i;
u32 val;
/* setup port parameter */
val = readl(priv->base + TXCTRL0);
val &= ~TXCTRL0_AMP_G3_MASK;
val |= FIELD_PREP(TXCTRL0_AMP_G3_MASK, 0x73);
val &= ~TXCTRL0_AMP_G2_MASK;
val |= FIELD_PREP(TXCTRL0_AMP_G2_MASK, 0x46);
val &= ~TXCTRL0_AMP_G1_MASK;
val |= FIELD_PREP(TXCTRL0_AMP_G1_MASK, 0x42);
writel(val, priv->base + TXCTRL0);
val = readl(priv->base + TXCTRL1);
val &= ~TXCTRL1_DEEMPH_G3_MASK;
val |= FIELD_PREP(TXCTRL1_DEEMPH_G3_MASK, 0x23);
val &= ~TXCTRL1_DEEMPH_G2_MASK;
val |= FIELD_PREP(TXCTRL1_DEEMPH_G2_MASK, 0x05);
val &= ~TXCTRL1_DEEMPH_G1_MASK;
val |= FIELD_PREP(TXCTRL1_DEEMPH_G1_MASK, 0x05);
val = readl(priv->base + RXCTRL);
val &= ~RXCTRL_LOS_LVL_MASK;
val |= FIELD_PREP(RXCTRL_LOS_LVL_MASK, 0x9);
val &= ~RXCTRL_LOS_BIAS_MASK;
val |= FIELD_PREP(RXCTRL_LOS_BIAS_MASK, 0x2);
val &= ~RXCTRL_RX_EQ_MASK;
val |= FIELD_PREP(RXCTRL_RX_EQ_MASK, 0x1);
/* dummy read 25 times to make a wait time for the phy to stabilize */ for (i = 0; i < 25; i++)
readl(priv->base + CKCTRL);
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.