diff options
| -rw-r--r-- | Documentation/devicetree/bindings/net/stmmac.txt | 6 | ||||
| -rw-r--r-- | drivers/net/ethernet/stmicro/stmmac/stmmac_mdio.c | 48 | ||||
| -rw-r--r-- | include/linux/stmmac.h | 4 |
3 files changed, 56 insertions, 2 deletions
diff --git a/Documentation/devicetree/bindings/net/stmmac.txt b/Documentation/devicetree/bindings/net/stmmac.txt index e1ddfcc46a4e..261c563b5f06 100644 --- a/Documentation/devicetree/bindings/net/stmmac.txt +++ b/Documentation/devicetree/bindings/net/stmmac.txt | |||
| @@ -13,6 +13,12 @@ Required properties: | |||
| 13 | - phy-mode: String, operation mode of the PHY interface. | 13 | - phy-mode: String, operation mode of the PHY interface. |
| 14 | Supported values are: "mii", "rmii", "gmii", "rgmii". | 14 | Supported values are: "mii", "rmii", "gmii", "rgmii". |
| 15 | - snps,phy-addr phy address to connect to. | 15 | - snps,phy-addr phy address to connect to. |
| 16 | - snps,reset-gpio gpio number for phy reset. | ||
| 17 | - snps,reset-active-low boolean flag to indicate if phy reset is active low. | ||
| 18 | - snps,reset-delays-us is triplet of delays | ||
| 19 | The 1st cell is reset pre-delay in micro seconds. | ||
| 20 | The 2nd cell is reset pulse in micro seconds. | ||
| 21 | The 3rd cell is reset post-delay in micro seconds. | ||
| 16 | - snps,pbl Programmable Burst Length | 22 | - snps,pbl Programmable Burst Length |
| 17 | - snps,fixed-burst Program the DMA to use the fixed burst mode | 23 | - snps,fixed-burst Program the DMA to use the fixed burst mode |
| 18 | - snps,mixed-burst Program the DMA to use the mixed burst mode | 24 | - snps,mixed-burst Program the DMA to use the mixed burst mode |
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_mdio.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_mdio.c index cc15039eaa47..fe7bc9903867 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_mdio.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_mdio.c | |||
| @@ -27,6 +27,9 @@ | |||
| 27 | #include <linux/mii.h> | 27 | #include <linux/mii.h> |
| 28 | #include <linux/phy.h> | 28 | #include <linux/phy.h> |
| 29 | #include <linux/slab.h> | 29 | #include <linux/slab.h> |
| 30 | #include <linux/of.h> | ||
| 31 | #include <linux/of_gpio.h> | ||
| 32 | |||
| 30 | #include <asm/io.h> | 33 | #include <asm/io.h> |
| 31 | 34 | ||
| 32 | #include "stmmac.h" | 35 | #include "stmmac.h" |
| @@ -131,10 +134,46 @@ static int stmmac_mdio_reset(struct mii_bus *bus) | |||
| 131 | struct net_device *ndev = bus->priv; | 134 | struct net_device *ndev = bus->priv; |
| 132 | struct stmmac_priv *priv = netdev_priv(ndev); | 135 | struct stmmac_priv *priv = netdev_priv(ndev); |
| 133 | unsigned int mii_address = priv->hw->mii.addr; | 136 | unsigned int mii_address = priv->hw->mii.addr; |
| 137 | struct stmmac_mdio_bus_data *data = priv->plat->mdio_bus_data; | ||
| 138 | |||
| 139 | #ifdef CONFIG_OF | ||
| 140 | if (priv->device->of_node) { | ||
| 141 | int reset_gpio, active_low; | ||
| 142 | |||
| 143 | if (data->reset_gpio < 0) { | ||
| 144 | struct device_node *np = priv->device->of_node; | ||
| 145 | if (!np) | ||
| 146 | return 0; | ||
| 147 | |||
| 148 | data->reset_gpio = of_get_named_gpio(np, | ||
| 149 | "snps,reset-gpio", 0); | ||
| 150 | if (data->reset_gpio < 0) | ||
| 151 | return 0; | ||
| 152 | |||
| 153 | data->active_low = of_property_read_bool(np, | ||
| 154 | "snps,reset-active-low"); | ||
| 155 | of_property_read_u32_array(np, | ||
| 156 | "snps,reset-delays-us", data->delays, 3); | ||
| 157 | } | ||
| 158 | |||
| 159 | reset_gpio = data->reset_gpio; | ||
| 160 | active_low = data->active_low; | ||
| 161 | |||
| 162 | if (!gpio_request(reset_gpio, "mdio-reset")) { | ||
| 163 | gpio_direction_output(reset_gpio, active_low ? 1 : 0); | ||
| 164 | udelay(data->delays[0]); | ||
| 165 | gpio_set_value(reset_gpio, active_low ? 0 : 1); | ||
| 166 | udelay(data->delays[1]); | ||
| 167 | gpio_set_value(reset_gpio, active_low ? 1 : 0); | ||
| 168 | udelay(data->delays[2]); | ||
| 169 | gpio_free(reset_gpio); | ||
| 170 | } | ||
| 171 | } | ||
| 172 | #endif | ||
| 134 | 173 | ||
| 135 | if (priv->plat->mdio_bus_data->phy_reset) { | 174 | if (data->phy_reset) { |
| 136 | pr_debug("stmmac_mdio_reset: calling phy_reset\n"); | 175 | pr_debug("stmmac_mdio_reset: calling phy_reset\n"); |
| 137 | priv->plat->mdio_bus_data->phy_reset(priv->plat->bsp_priv); | 176 | data->phy_reset(priv->plat->bsp_priv); |
| 138 | } | 177 | } |
| 139 | 178 | ||
| 140 | /* This is a workaround for problems with the STE101P PHY. | 179 | /* This is a workaround for problems with the STE101P PHY. |
| @@ -172,6 +211,11 @@ int stmmac_mdio_register(struct net_device *ndev) | |||
| 172 | else | 211 | else |
| 173 | irqlist = priv->mii_irq; | 212 | irqlist = priv->mii_irq; |
| 174 | 213 | ||
| 214 | #ifdef CONFIG_OF | ||
| 215 | if (priv->device->of_node) | ||
| 216 | mdio_bus_data->reset_gpio = -1; | ||
| 217 | #endif | ||
| 218 | |||
| 175 | new_bus->name = "stmmac"; | 219 | new_bus->name = "stmmac"; |
| 176 | new_bus->read = &stmmac_mdio_read; | 220 | new_bus->read = &stmmac_mdio_read; |
| 177 | new_bus->write = &stmmac_mdio_write; | 221 | new_bus->write = &stmmac_mdio_write; |
diff --git a/include/linux/stmmac.h b/include/linux/stmmac.h index c1b3ed3fb787..9e495d31516e 100644 --- a/include/linux/stmmac.h +++ b/include/linux/stmmac.h | |||
| @@ -80,6 +80,10 @@ struct stmmac_mdio_bus_data { | |||
| 80 | unsigned int phy_mask; | 80 | unsigned int phy_mask; |
| 81 | int *irqs; | 81 | int *irqs; |
| 82 | int probed_phy_irq; | 82 | int probed_phy_irq; |
| 83 | #ifdef CONFIG_OF | ||
| 84 | int reset_gpio, active_low; | ||
| 85 | u32 delays[3]; | ||
| 86 | #endif | ||
| 83 | }; | 87 | }; |
| 84 | 88 | ||
| 85 | struct stmmac_dma_cfg { | 89 | struct stmmac_dma_cfg { |
