Commit f7be2cba authored by David S. Miller's avatar David S. Miller

Merge branch 'davinci_mdio'

Grygorii Strashko says:

====================
net: davinci_mdio: reuse for keystone2 arch

The similar MDIO HW blocks is used by keystone 2 SoCs as
in Davinci SoCs:
- one in Gigabit Ethernet (GbE) Switch Subsystem
  See http://www.ti.com/lit/ug/sprugv9d/sprugv9d.pdf
- one in 10 Gigabit Ethernet Subsystem
  See http://www.ti.com/lit/ug/spruhj5/spruhj5.pdf

Hence, reuse Davinci MDIO driver for Keystone 2 and
enable TI networking for Keystone 2 devices.

Also, as part of this series, enable PHY's creation from DT, because
Keystone 2 supports DT boot mode only.

Changes in v2:
- review comments applied.
  Keystone 2 compatibility string changed to "ti,keystone_mdio".
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 1373a773 0a0ea068
TI SoC Davinci MDIO Controller Device Tree Bindings TI SoC Davinci/Keystone2 MDIO Controller Device Tree Bindings
--------------------------------------------------- ---------------------------------------------------
Required properties: Required properties:
- compatible : Should be "ti,davinci_mdio" - compatible : Should be "ti,davinci_mdio" or "ti,keystone_mdio"
- reg : physical base address and size of the davinci mdio - reg : physical base address and size of the davinci mdio
registers map registers map
- bus_freq : Mdio Bus frequency - bus_freq : Mdio Bus frequency
...@@ -19,7 +19,7 @@ file. ...@@ -19,7 +19,7 @@ file.
Examples: Examples:
mdio: davinci_mdio@4A101000 { mdio: davinci_mdio@4A101000 {
compatible = "ti,cpsw"; compatible = "ti,davinci_mdio";
reg = <0x4A101000 0x1000>; reg = <0x4A101000 0x1000>;
bus_freq = <1000000>; bus_freq = <1000000>;
}; };
...@@ -27,7 +27,7 @@ Examples: ...@@ -27,7 +27,7 @@ Examples:
(or) (or)
mdio: davinci_mdio@4A101000 { mdio: davinci_mdio@4A101000 {
compatible = "ti,cpsw"; compatible = "ti,davinci_mdio";
ti,hwmods = "davinci_mdio"; ti,hwmods = "davinci_mdio";
bus_freq = <1000000>; bus_freq = <1000000>;
}; };
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
config NET_VENDOR_TI config NET_VENDOR_TI
bool "Texas Instruments (TI) devices" bool "Texas Instruments (TI) devices"
default y default y
depends on PCI || EISA || AR7 || (ARM && (ARCH_DAVINCI || ARCH_OMAP3 || SOC_AM33XX)) depends on PCI || EISA || AR7 || (ARM && (ARCH_DAVINCI || ARCH_OMAP3 || SOC_AM33XX || ARCH_KEYSTONE))
---help--- ---help---
If you have a network (Ethernet) card belonging to this class, say Y If you have a network (Ethernet) card belonging to this class, say Y
and read the Ethernet-HOWTO, available from and read the Ethernet-HOWTO, available from
...@@ -32,7 +32,7 @@ config TI_DAVINCI_EMAC ...@@ -32,7 +32,7 @@ config TI_DAVINCI_EMAC
config TI_DAVINCI_MDIO config TI_DAVINCI_MDIO
tristate "TI DaVinci MDIO Support" tristate "TI DaVinci MDIO Support"
depends on ARM && ( ARCH_DAVINCI || ARCH_OMAP3 || SOC_AM33XX ) depends on ARM && ( ARCH_DAVINCI || ARCH_OMAP3 || SOC_AM33XX || ARCH_KEYSTONE )
select PHYLIB select PHYLIB
---help--- ---help---
This driver supports TI's DaVinci MDIO module. This driver supports TI's DaVinci MDIO module.
......
...@@ -38,6 +38,7 @@ ...@@ -38,6 +38,7 @@
#include <linux/davinci_emac.h> #include <linux/davinci_emac.h>
#include <linux/of.h> #include <linux/of.h>
#include <linux/of_device.h> #include <linux/of_device.h>
#include <linux/of_mdio.h>
#include <linux/pinctrl/consumer.h> #include <linux/pinctrl/consumer.h>
/* /*
...@@ -95,6 +96,10 @@ struct davinci_mdio_data { ...@@ -95,6 +96,10 @@ struct davinci_mdio_data {
struct mii_bus *bus; struct mii_bus *bus;
bool suspended; bool suspended;
unsigned long access_time; /* jiffies */ unsigned long access_time; /* jiffies */
/* Indicates that driver shouldn't modify phy_mask in case
* if MDIO bus is registered from DT.
*/
bool skip_scan;
}; };
static void __davinci_mdio_reset(struct davinci_mdio_data *data) static void __davinci_mdio_reset(struct davinci_mdio_data *data)
...@@ -144,6 +149,9 @@ static int davinci_mdio_reset(struct mii_bus *bus) ...@@ -144,6 +149,9 @@ static int davinci_mdio_reset(struct mii_bus *bus)
dev_info(data->dev, "davinci mdio revision %d.%d\n", dev_info(data->dev, "davinci mdio revision %d.%d\n",
(ver >> 8) & 0xff, ver & 0xff); (ver >> 8) & 0xff, ver & 0xff);
if (data->skip_scan)
return 0;
/* get phy mask from the alive register */ /* get phy mask from the alive register */
phy_mask = __raw_readl(&data->regs->alive); phy_mask = __raw_readl(&data->regs->alive);
if (phy_mask) { if (phy_mask) {
...@@ -369,8 +377,17 @@ static int davinci_mdio_probe(struct platform_device *pdev) ...@@ -369,8 +377,17 @@ static int davinci_mdio_probe(struct platform_device *pdev)
goto bail_out; goto bail_out;
} }
/* register the mii bus */ /* register the mii bus
* Create PHYs from DT only in case if PHY child nodes are explicitly
* defined to support backward compatibility with DTs which assume that
* Davinci MDIO will always scan the bus for PHYs detection.
*/
if (dev->of_node && of_get_child_count(dev->of_node)) {
data->skip_scan = true;
ret = of_mdiobus_register(data->bus, dev->of_node);
} else {
ret = mdiobus_register(data->bus); ret = mdiobus_register(data->bus);
}
if (ret) if (ret)
goto bail_out; goto bail_out;
......
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