159 lines
5.5 KiB
Diff
159 lines
5.5 KiB
Diff
From c5e4ddbdfa1134a36589c1466ed4abb85fe6f976 Mon Sep 17 00:00:00 2001
|
|
From: Chen-Yu Tsai <wens@csie.org>
|
|
Date: Fri, 17 Jan 2014 21:24:41 +0800
|
|
Subject: [PATCH] net: stmmac: Add support for optional reset control
|
|
|
|
The DWMAC has a reset assert line, which is used on some SoCs. Add an
|
|
optional reset control to stmmac driver core.
|
|
|
|
To support reset control deferred probing, this patch changes the driver
|
|
probe function to return the actual error, instead of just -EINVAL.
|
|
|
|
Signed-off-by: Chen-Yu Tsai <wens@csie.org>
|
|
Signed-off-by: David S. Miller <davem@davemloft.net>
|
|
---
|
|
Documentation/devicetree/bindings/net/stmmac.txt | 3 +++
|
|
drivers/net/ethernet/stmicro/stmmac/Kconfig | 1 +
|
|
drivers/net/ethernet/stmicro/stmmac/stmmac.h | 2 ++
|
|
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 19 ++++++++++++++++++-
|
|
drivers/net/ethernet/stmicro/stmmac/stmmac_pci.c | 4 ++--
|
|
drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c | 4 ++--
|
|
6 files changed, 28 insertions(+), 5 deletions(-)
|
|
|
|
diff --git a/Documentation/devicetree/bindings/net/stmmac.txt b/Documentation/devicetree/bindings/net/stmmac.txt
|
|
index eba0e5e..d132513 100644
|
|
--- a/Documentation/devicetree/bindings/net/stmmac.txt
|
|
+++ b/Documentation/devicetree/bindings/net/stmmac.txt
|
|
@@ -30,6 +30,9 @@ Required properties:
|
|
|
|
Optional properties:
|
|
- mac-address: 6 bytes, mac address
|
|
+- resets: Should contain a phandle to the STMMAC reset signal, if any
|
|
+- reset-names: Should contain the reset signal name "stmmaceth", if a
|
|
+ reset phandle is given
|
|
|
|
Examples:
|
|
|
|
diff --git a/drivers/net/ethernet/stmicro/stmmac/Kconfig b/drivers/net/ethernet/stmicro/stmmac/Kconfig
|
|
index 6e52c0f..b59d1ef 100644
|
|
--- a/drivers/net/ethernet/stmicro/stmmac/Kconfig
|
|
+++ b/drivers/net/ethernet/stmicro/stmmac/Kconfig
|
|
@@ -5,6 +5,7 @@ config STMMAC_ETH
|
|
select PHYLIB
|
|
select CRC32
|
|
select PTP_1588_CLOCK
|
|
+ select RESET_CONTROLLER
|
|
---help---
|
|
This is the driver for the Ethernet IPs are built around a
|
|
Synopsys IP Core and only tested on the STMicroelectronics
|
|
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac.h b/drivers/net/ethernet/stmicro/stmmac/stmmac.h
|
|
index 73709e9..c1c141f 100644
|
|
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac.h
|
|
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac.h
|
|
@@ -32,6 +32,7 @@
|
|
#include <linux/pci.h>
|
|
#include "common.h"
|
|
#include <linux/ptp_clock_kernel.h>
|
|
+#include <linux/reset.h>
|
|
|
|
struct stmmac_priv {
|
|
/* Frequently used values are kept adjacent for cache effect */
|
|
@@ -91,6 +92,7 @@ struct stmmac_priv {
|
|
int wolopts;
|
|
int wol_irq;
|
|
struct clk *stmmac_clk;
|
|
+ struct reset_control *stmmac_rst;
|
|
int clk_csr;
|
|
struct timer_list eee_ctrl_timer;
|
|
int lpi_irq;
|
|
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
|
|
index 0d2c4cb..0c5c120 100644
|
|
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
|
|
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
|
|
@@ -51,6 +51,7 @@
|
|
#include <linux/net_tstamp.h>
|
|
#include "stmmac_ptp.h"
|
|
#include "stmmac.h"
|
|
+#include <linux/reset.h>
|
|
|
|
#define STMMAC_ALIGN(x) L1_CACHE_ALIGN(x)
|
|
#define JUMBO_LEN 9000
|
|
@@ -2728,10 +2729,24 @@ struct stmmac_priv *stmmac_dvr_probe(struct device *device,
|
|
if (IS_ERR(priv->stmmac_clk)) {
|
|
dev_warn(priv->device, "%s: warning: cannot get CSR clock\n",
|
|
__func__);
|
|
+ ret = PTR_ERR(priv->stmmac_clk);
|
|
goto error_clk_get;
|
|
}
|
|
clk_prepare_enable(priv->stmmac_clk);
|
|
|
|
+ priv->stmmac_rst = devm_reset_control_get(priv->device,
|
|
+ STMMAC_RESOURCE_NAME);
|
|
+ if (IS_ERR(priv->stmmac_rst)) {
|
|
+ if (PTR_ERR(priv->stmmac_rst) == -EPROBE_DEFER) {
|
|
+ ret = -EPROBE_DEFER;
|
|
+ goto error_hw_init;
|
|
+ }
|
|
+ dev_info(priv->device, "no reset control found\n");
|
|
+ priv->stmmac_rst = NULL;
|
|
+ }
|
|
+ if (priv->stmmac_rst)
|
|
+ reset_control_deassert(priv->stmmac_rst);
|
|
+
|
|
/* Init MAC and get the capabilities */
|
|
ret = stmmac_hw_init(priv);
|
|
if (ret)
|
|
@@ -2808,7 +2823,7 @@ struct stmmac_priv *stmmac_dvr_probe(struct device *device,
|
|
error_clk_get:
|
|
free_netdev(ndev);
|
|
|
|
- return NULL;
|
|
+ return ERR_PTR(ret);
|
|
}
|
|
|
|
/**
|
|
@@ -2832,6 +2847,8 @@ int stmmac_dvr_remove(struct net_device *ndev)
|
|
stmmac_mdio_unregister(ndev);
|
|
netif_carrier_off(ndev);
|
|
unregister_netdev(ndev);
|
|
+ if (priv->stmmac_rst)
|
|
+ reset_control_assert(priv->stmmac_rst);
|
|
clk_disable_unprepare(priv->stmmac_clk);
|
|
free_netdev(ndev);
|
|
|
|
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_pci.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_pci.c
|
|
index 37ba2e0..2916089 100644
|
|
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_pci.c
|
|
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_pci.c
|
|
@@ -100,9 +100,9 @@ static int stmmac_pci_probe(struct pci_dev *pdev,
|
|
stmmac_default_data();
|
|
|
|
priv = stmmac_dvr_probe(&(pdev->dev), &plat_dat, addr);
|
|
- if (!priv) {
|
|
+ if (IS_ERR(priv)) {
|
|
pr_err("%s: main driver probe failed", __func__);
|
|
- ret = -ENODEV;
|
|
+ ret = PTR_ERR(priv);
|
|
goto err_out;
|
|
}
|
|
priv->dev->irq = pdev->irq;
|
|
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c
|
|
index 6d0bf22..cc6b89a7 100644
|
|
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c
|
|
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c
|
|
@@ -152,9 +152,9 @@ static int stmmac_pltfr_probe(struct platform_device *pdev)
|
|
}
|
|
|
|
priv = stmmac_dvr_probe(&(pdev->dev), plat_dat, addr);
|
|
- if (!priv) {
|
|
+ if (IS_ERR(priv)) {
|
|
pr_err("%s: main driver probe failed", __func__);
|
|
- return -ENODEV;
|
|
+ return PTR_ERR(priv);
|
|
}
|
|
|
|
/* Get MAC address if available (DT) */
|
|
--
|
|
1.8.5.5
|
|
|