Commit 159a0760 authored by Quentin Schulz's avatar Quentin Schulz Committed by David S. Miller

net: fec: add post PHY reset delay DT property

Some PHY require to wait for a bit after the reset GPIO has been
toggled. This adds support for the DT property `phy-reset-post-delay`
which gives the delay in milliseconds to wait after reset.

If the DT property is not given, no delay is observed. Post reset delay
greater than 1000ms are invalid.
Signed-off-by: default avatarQuentin Schulz <quentin.schulz@free-electrons.com>
Reviewed-by: default avatarAndrew Lunn <andrew@lunn.ch>
Acked-by: default avatarFugang Duan <fugang.duan@nxp.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 11d3c949
...@@ -15,6 +15,10 @@ Optional properties: ...@@ -15,6 +15,10 @@ Optional properties:
- phy-reset-active-high : If present then the reset sequence using the GPIO - phy-reset-active-high : If present then the reset sequence using the GPIO
specified in the "phy-reset-gpios" property is reversed (H=reset state, specified in the "phy-reset-gpios" property is reversed (H=reset state,
L=operation state). L=operation state).
- phy-reset-post-delay : Post reset delay in milliseconds. If present then
a delay of phy-reset-post-delay milliseconds will be observed after the
phy-reset-gpios has been toggled. Can be omitted thus no delay is
observed. Delay is in range of 1ms to 1000ms. Other delays are invalid.
- phy-supply : regulator that powers the Ethernet PHY. - phy-supply : regulator that powers the Ethernet PHY.
- phy-handle : phandle to the PHY device connected to this device. - phy-handle : phandle to the PHY device connected to this device.
- fixed-link : Assume a fixed link. See fixed-link.txt in the same directory. - fixed-link : Assume a fixed link. See fixed-link.txt in the same directory.
......
...@@ -3192,7 +3192,7 @@ static int fec_reset_phy(struct platform_device *pdev) ...@@ -3192,7 +3192,7 @@ static int fec_reset_phy(struct platform_device *pdev)
{ {
int err, phy_reset; int err, phy_reset;
bool active_high = false; bool active_high = false;
int msec = 1; int msec = 1, phy_post_delay = 0;
struct device_node *np = pdev->dev.of_node; struct device_node *np = pdev->dev.of_node;
if (!np) if (!np)
...@@ -3209,6 +3209,11 @@ static int fec_reset_phy(struct platform_device *pdev) ...@@ -3209,6 +3209,11 @@ static int fec_reset_phy(struct platform_device *pdev)
else if (!gpio_is_valid(phy_reset)) else if (!gpio_is_valid(phy_reset))
return 0; return 0;
err = of_property_read_u32(np, "phy-reset-post-delay", &phy_post_delay);
/* valid reset duration should be less than 1s */
if (!err && phy_post_delay > 1000)
return -EINVAL;
active_high = of_property_read_bool(np, "phy-reset-active-high"); active_high = of_property_read_bool(np, "phy-reset-active-high");
err = devm_gpio_request_one(&pdev->dev, phy_reset, err = devm_gpio_request_one(&pdev->dev, phy_reset,
...@@ -3226,6 +3231,15 @@ static int fec_reset_phy(struct platform_device *pdev) ...@@ -3226,6 +3231,15 @@ static int fec_reset_phy(struct platform_device *pdev)
gpio_set_value_cansleep(phy_reset, !active_high); gpio_set_value_cansleep(phy_reset, !active_high);
if (!phy_post_delay)
return 0;
if (phy_post_delay > 20)
msleep(phy_post_delay);
else
usleep_range(phy_post_delay * 1000,
phy_post_delay * 1000 + 1000);
return 0; return 0;
} }
#else /* CONFIG_OF */ #else /* CONFIG_OF */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment