net: stmmac: add Amlogic Meson glue layer
authorBeniamino Galvani <b.galvani@gmail.com>
Sat, 20 Sep 2014 13:29:16 +0000 (15:29 +0200)
committerDavid S. Miller <davem@davemloft.net>
Fri, 26 Sep 2014 04:12:56 +0000 (00:12 -0400)
The Ethernet controller available in Meson6 and Meson8 SoCs is a
Synopsys DesignWare MAC IP core, already supported by the stmmac
driver.

This glue layer implements some platform-specific settings needed by
the Amlogic variant.

Signed-off-by: Beniamino Galvani <b.galvani@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/stmicro/stmmac/Kconfig
drivers/net/ethernet/stmicro/stmmac/Makefile
drivers/net/ethernet/stmicro/stmmac/dwmac-meson.c [new file with mode: 0644]
drivers/net/ethernet/stmicro/stmmac/stmmac.h
drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c

index 2d09c116cbc8c57b9ded844082dc2693d27a2402..b02d4a3ffa379666477d69a7625db1fe1e020aa7 100644 (file)
@@ -26,6 +26,16 @@ config STMMAC_PLATFORM
 
          If unsure, say N.
 
+config DWMAC_MESON
+       bool "Amlogic Meson dwmac support"
+       depends on STMMAC_PLATFORM && ARCH_MESON
+       help
+         Support for Ethernet controller on Amlogic Meson SoCs.
+
+         This selects the Amlogic Meson SoC glue layer support for
+         the stmmac device driver. This driver is used for Meson6 and
+         Meson8 SoCs.
+
 config DWMAC_SOCFPGA
        bool "SOCFPGA dwmac support"
        depends on STMMAC_PLATFORM && MFD_SYSCON && (ARCH_SOCFPGA || COMPILE_TEST)
index 18695ebef7e43cb636e60640fbd52e4835e36ede..0533d0ba783d1d238f23fd367dc36763ef2950e4 100644 (file)
@@ -1,6 +1,7 @@
 obj-$(CONFIG_STMMAC_ETH) += stmmac.o
 stmmac-$(CONFIG_STMMAC_PLATFORM) += stmmac_platform.o
 stmmac-$(CONFIG_STMMAC_PCI) += stmmac_pci.o
+stmmac-$(CONFIG_DWMAC_MESON) += dwmac-meson.o
 stmmac-$(CONFIG_DWMAC_SUNXI) += dwmac-sunxi.o
 stmmac-$(CONFIG_DWMAC_STI) += dwmac-sti.o
 stmmac-$(CONFIG_DWMAC_SOCFPGA) += dwmac-socfpga.o
diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-meson.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-meson.c
new file mode 100644 (file)
index 0000000..d225a60
--- /dev/null
@@ -0,0 +1,67 @@
+/*
+ * Amlogic Meson DWMAC glue layer
+ *
+ * Copyright (C) 2014 Beniamino Galvani <b.galvani@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <linux/device.h>
+#include <linux/ethtool.h>
+#include <linux/io.h>
+#include <linux/ioport.h>
+#include <linux/platform_device.h>
+#include <linux/stmmac.h>
+
+#define ETHMAC_SPEED_100       BIT(1)
+
+struct meson_dwmac {
+       struct device   *dev;
+       void __iomem    *reg;
+};
+
+static void meson6_dwmac_fix_mac_speed(void *priv, unsigned int speed)
+{
+       struct meson_dwmac *dwmac = priv;
+       unsigned int val;
+
+       val = readl(dwmac->reg);
+
+       switch (speed) {
+       case SPEED_10:
+               val &= ~ETHMAC_SPEED_100;
+               break;
+       case SPEED_100:
+               val |= ETHMAC_SPEED_100;
+               break;
+       }
+
+       writel(val, dwmac->reg);
+}
+
+static void *meson6_dwmac_setup(struct platform_device *pdev)
+{
+       struct meson_dwmac *dwmac;
+       struct resource *res;
+
+       dwmac = devm_kzalloc(&pdev->dev, sizeof(*dwmac), GFP_KERNEL);
+       if (!dwmac)
+               return ERR_PTR(-ENOMEM);
+
+       res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
+       dwmac->reg = devm_ioremap_resource(&pdev->dev, res);
+       if (IS_ERR(dwmac->reg))
+               return dwmac->reg;
+
+       return dwmac;
+}
+
+const struct stmmac_of_data meson6_dwmac_data = {
+       .setup          = meson6_dwmac_setup,
+       .fix_mac_speed  = meson6_dwmac_fix_mac_speed,
+};
index 58097c0e2ad502699ace45392bb3f12855101625..44528896355d8d4dbae235b6c7b7b76c5caa7ed8 100644 (file)
@@ -137,6 +137,9 @@ void stmmac_disable_eee_mode(struct stmmac_priv *priv);
 bool stmmac_eee_init(struct stmmac_priv *priv);
 
 #ifdef CONFIG_STMMAC_PLATFORM
+#ifdef CONFIG_DWMAC_MESON
+extern const struct stmmac_of_data meson6_dwmac_data;
+#endif
 #ifdef CONFIG_DWMAC_SUNXI
 extern const struct stmmac_of_data sun7i_gmac_data;
 #endif
index bb524a932be48b6a0fa2e096eab0a2bb7732314d..65217170625803c5085d4be0c42a660c0e2f3f22 100644 (file)
@@ -30,6 +30,9 @@
 #include "stmmac.h"
 
 static const struct of_device_id stmmac_dt_ids[] = {
+#ifdef CONFIG_DWMAC_MESON
+       { .compatible = "amlogic,meson6-dwmac", .data = &meson6_dwmac_data},
+#endif
 #ifdef CONFIG_DWMAC_SUNXI
        { .compatible = "allwinner,sun7i-a20-gmac", .data = &sun7i_gmac_data},
 #endif