Skip to content

Commit

Permalink
net: stmmac: dwmac-meson8b: use picoseconds for the RGMII RX delay
Browse files Browse the repository at this point in the history
Amlogic Meson G12A, G12B and SM1 SoCs have a more advanced RGMII RX
delay register which allows picoseconds precision. Parse the new
"rx-internal-delay-ps" property or fall back to the value from the old
"amlogic,rx-delay-ns" property.

No upstream DTB uses the old "amlogic,rx-delay-ns" property (yet).
Only include minimalistic logic to fall back to the old property,
without any special validation (for example if the old and new
property are given at the same time).

Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
  • Loading branch information
Martin Blumenstingl authored and Jakub Kicinski committed Jan 7, 2021
1 parent 0258228 commit 140ddf0
Showing 1 changed file with 13 additions and 8 deletions.
21 changes: 13 additions & 8 deletions drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ struct meson8b_dwmac {
phy_interface_t phy_mode;
struct clk *rgmii_tx_clk;
u32 tx_delay_ns;
u32 rx_delay_ns;
u32 rx_delay_ps;
struct clk *timing_adj_clk;
};

Expand Down Expand Up @@ -276,7 +276,7 @@ static int meson8b_init_prg_eth(struct meson8b_dwmac *dwmac)
tx_dly_config = FIELD_PREP(PRG_ETH0_TXDLY_MASK,
dwmac->tx_delay_ns >> 1);

if (dwmac->rx_delay_ns == 2)
if (dwmac->rx_delay_ps == 2000)
rx_dly_config = PRG_ETH0_ADJ_ENABLE | PRG_ETH0_ADJ_SETUP;
else
rx_dly_config = 0;
Expand Down Expand Up @@ -406,14 +406,19 @@ static int meson8b_dwmac_probe(struct platform_device *pdev)
&dwmac->tx_delay_ns))
dwmac->tx_delay_ns = 2;

/* use 0ns as fallback since this is what most boards actually use */
if (of_property_read_u32(pdev->dev.of_node, "amlogic,rx-delay-ns",
&dwmac->rx_delay_ns))
dwmac->rx_delay_ns = 0;
/* RX delay defaults to 0ps since this is what many boards use */
if (of_property_read_u32(pdev->dev.of_node, "rx-internal-delay-ps",
&dwmac->rx_delay_ps)) {
if (!of_property_read_u32(pdev->dev.of_node,
"amlogic,rx-delay-ns",
&dwmac->rx_delay_ps))
/* convert ns to ps */
dwmac->rx_delay_ps *= 1000;
}

if (dwmac->rx_delay_ns != 0 && dwmac->rx_delay_ns != 2) {
if (dwmac->rx_delay_ps != 0 && dwmac->rx_delay_ps != 2000) {
dev_err(&pdev->dev,
"The only allowed RX delays values are: 0ns, 2ns");
"The only allowed RX delays values are: 0ps, 2000ps");
ret = -EINVAL;
goto err_remove_config_dt;
}
Expand Down

0 comments on commit 140ddf0

Please sign in to comment.