]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
net: phy: adin: add support for Analog Devices PHYs
authorAlexandru Ardelean <alexandru.ardelean@analog.com>
Fri, 16 Aug 2019 13:09:59 +0000 (16:09 +0300)
committerDavid S. Miller <davem@davemloft.net>
Fri, 16 Aug 2019 18:56:25 +0000 (11:56 -0700)
This change adds support for Analog Devices Industrial Ethernet PHYs.
Particularly the PHYs this driver adds support for:
 * ADIN1200 - Robust, Industrial, Low Power 10/100 Ethernet PHY
 * ADIN1300 - Robust, Industrial, Low Latency 10/100/1000 Gigabit
   Ethernet PHY

The 2 chips are register compatible with one another. The main difference
being that ADIN1200 doesn't operate in gigabit mode.

The chips can be operated by the Generic PHY driver as well via the
standard IEEE PHY registers (0x0000 - 0x000F) which are supported by the
kernel as well. This assumes that configuration of the PHY has been done
completely in HW, according to spec.

Configuration can also be done via registers, which will be supported by
this driver.

Datasheets:
  https://www.analog.com/media/en/technical-documentation/data-sheets/ADIN1300.pdf
  https://www.analog.com/media/en/technical-documentation/data-sheets/ADIN1200.pdf

Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Signed-off-by: Alexandru Ardelean <alexandru.ardelean@analog.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
MAINTAINERS
drivers/net/phy/Kconfig
drivers/net/phy/Makefile
drivers/net/phy/adin.c [new file with mode: 0644]

index e352550a6895c9556cc82f0b8247187ccbbb3e58..e8aa8a6678642db92720528635685f1b43809ca1 100644 (file)
@@ -938,6 +938,13 @@ S: Supported
 F:     drivers/mux/adgs1408.c
 F:     Documentation/devicetree/bindings/mux/adi,adgs1408.txt
 
+ANALOG DEVICES INC ADIN DRIVER
+M:     Alexandru Ardelean <alexaundru.ardelean@analog.com>
+L:     netdev@vger.kernel.org
+W:     http://ez.analog.com/community/linux-device-drivers
+S:     Supported
+F:     drivers/net/phy/adin.c
+
 ANALOG DEVICES INC ADIS DRIVER LIBRARY
 M:     Alexandru Ardelean <alexandru.ardelean@analog.com>
 S:     Supported
index 48ca213c0ada88d573edca5a06df90aaafe215f3..03be30cde552c318a265a989e9b24012e45872a2 100644 (file)
@@ -257,6 +257,15 @@ config SFP
        depends on HWMON || HWMON=n
        select MDIO_I2C
 
+config ADIN_PHY
+       tristate "Analog Devices Industrial Ethernet PHYs"
+       help
+         Adds support for the Analog Devices Industrial Ethernet PHYs.
+         Currently supports the:
+         - ADIN1200 - Robust,Industrial, Low Power 10/100 Ethernet PHY
+         - ADIN1300 - Robust,Industrial, Low Latency 10/100/1000 Gigabit
+           Ethernet PHY
+
 config AMD_PHY
        tristate "AMD PHYs"
        ---help---
index ba07c27e420842c854b3c5b1418330f4f853fbfd..a03437e091f3b995e5efb810a804625b4f868ca5 100644 (file)
@@ -47,6 +47,7 @@ obj-$(CONFIG_SFP)             += sfp.o
 sfp-obj-$(CONFIG_SFP)          += sfp-bus.o
 obj-y                          += $(sfp-obj-y) $(sfp-obj-m)
 
+obj-$(CONFIG_ADIN_PHY)         += adin.o
 obj-$(CONFIG_AMD_PHY)          += amd.o
 aquantia-objs                  += aquantia_main.o
 ifdef CONFIG_HWMON
diff --git a/drivers/net/phy/adin.c b/drivers/net/phy/adin.c
new file mode 100644 (file)
index 0000000..6d7af47
--- /dev/null
@@ -0,0 +1,49 @@
+// SPDX-License-Identifier: GPL-2.0+
+/**
+ *  Driver for Analog Devices Industrial Ethernet PHYs
+ *
+ * Copyright 2019 Analog Devices Inc.
+ */
+#include <linux/kernel.h>
+#include <linux/errno.h>
+#include <linux/init.h>
+#include <linux/module.h>
+#include <linux/mii.h>
+#include <linux/phy.h>
+
+#define PHY_ID_ADIN1200                                0x0283bc20
+#define PHY_ID_ADIN1300                                0x0283bc30
+
+static int adin_config_init(struct phy_device *phydev)
+{
+       return genphy_config_init(phydev);
+}
+
+static struct phy_driver adin_driver[] = {
+       {
+               PHY_ID_MATCH_MODEL(PHY_ID_ADIN1200),
+               .name           = "ADIN1200",
+               .config_init    = adin_config_init,
+               .config_aneg    = genphy_config_aneg,
+               .read_status    = genphy_read_status,
+       },
+       {
+               PHY_ID_MATCH_MODEL(PHY_ID_ADIN1300),
+               .name           = "ADIN1300",
+               .config_init    = adin_config_init,
+               .config_aneg    = genphy_config_aneg,
+               .read_status    = genphy_read_status,
+       },
+};
+
+module_phy_driver(adin_driver);
+
+static struct mdio_device_id __maybe_unused adin_tbl[] = {
+       { PHY_ID_MATCH_MODEL(PHY_ID_ADIN1200) },
+       { PHY_ID_MATCH_MODEL(PHY_ID_ADIN1300) },
+       { }
+};
+
+MODULE_DEVICE_TABLE(mdio, adin_tbl);
+MODULE_DESCRIPTION("Analog Devices Industrial Ethernet PHY driver");
+MODULE_LICENSE("GPL");