aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/sunxi/patches-3.13/193-stmmac-platform-ext-for-a20.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/sunxi/patches-3.13/193-stmmac-platform-ext-for-a20.patch')
-rw-r--r--target/linux/sunxi/patches-3.13/193-stmmac-platform-ext-for-a20.patch204
1 files changed, 204 insertions, 0 deletions
diff --git a/target/linux/sunxi/patches-3.13/193-stmmac-platform-ext-for-a20.patch b/target/linux/sunxi/patches-3.13/193-stmmac-platform-ext-for-a20.patch
new file mode 100644
index 0000000000..9bc1bcbbf0
--- /dev/null
+++ b/target/linux/sunxi/patches-3.13/193-stmmac-platform-ext-for-a20.patch
@@ -0,0 +1,204 @@
+From 3c6560eccfeee3a93d57c3b2206abfbe06459015 Mon Sep 17 00:00:00 2001
+From: Chen-Yu Tsai <wens@csie.org>
+Date: Sat, 7 Dec 2013 01:29:37 +0800
+Subject: [PATCH] net: stmmac: sunxi platfrom extensions for GMAC in Allwinner
+ A20 SoC's
+
+The Allwinner A20 has an ethernet controller that seems to be
+an early version of Synopsys DesignWare MAC 10/100/1000 Universal,
+which is supported by the stmmac driver.
+
+Allwinner's GMAC requires setting additional registers in the SoC's
+clock control unit.
+
+The exact version of the DWMAC IP that Allwinner uses is unknown,
+thus the exact feature set is unknown.
+
+Signed-off-by: Chen-Yu Tsai <wens@csie.org>
+---
+ .../bindings/net/allwinner,sun7i-gmac.txt | 22 +++++++
+ drivers/net/ethernet/stmicro/stmmac/Kconfig | 12 ++++
+ drivers/net/ethernet/stmicro/stmmac/Makefile | 1 +
+ drivers/net/ethernet/stmicro/stmmac/dwmac-sunxi.c | 76 ++++++++++++++++++++++
+ drivers/net/ethernet/stmicro/stmmac/stmmac.h | 3 +
+ .../net/ethernet/stmicro/stmmac/stmmac_platform.c | 3 +
+ 6 files changed, 117 insertions(+)
+ create mode 100644 Documentation/devicetree/bindings/net/allwinner,sun7i-gmac.txt
+ create mode 100644 drivers/net/ethernet/stmicro/stmmac/dwmac-sunxi.c
+
+diff --git a/Documentation/devicetree/bindings/net/allwinner,sun7i-gmac.txt b/Documentation/devicetree/bindings/net/allwinner,sun7i-gmac.txt
+new file mode 100644
+index 0000000..271554a
+--- /dev/null
++++ b/Documentation/devicetree/bindings/net/allwinner,sun7i-gmac.txt
+@@ -0,0 +1,22 @@
++* Allwinner GMAC ethernet controller
++
++This device is a platform glue layer for stmmac.
++Please see stmmac.txt for the other unchanged properties.
++
++Required properties:
++ - compatible: Should be "allwinner,sun7i-gmac"
++ - reg: Address and length of register set for the device and corresponding
++ clock control
++
++Examples:
++
++ gmac: ethernet@01c50000 {
++ compatible = "allwinner,sun7i-gmac";
++ reg = <0x01c50000 0x10000>,
++ <0x01c20164 0x4>;
++ interrupts = <0 85 1>;
++ interrupt-names = "macirq";
++ clocks = <&ahb_gates 49>;
++ clock-names = "stmmaceth";
++ phy-mode = "mii";
++ };
+diff --git a/drivers/net/ethernet/stmicro/stmmac/Kconfig b/drivers/net/ethernet/stmicro/stmmac/Kconfig
+index 6e52c0f..6d71210 100644
+--- a/drivers/net/ethernet/stmicro/stmmac/Kconfig
++++ b/drivers/net/ethernet/stmicro/stmmac/Kconfig
+@@ -25,6 +25,18 @@ config STMMAC_PLATFORM
+
+ If unsure, say N.
+
++config DWMAC_SUNXI
++ bool "Allwinner GMAC support"
++ depends on STMMAC_PLATFORM
++ depends on ARCH_SUNXI
++ default y
++ ---help---
++ Support for Allwinner A20 GMAC ethernet driver.
++
++ This selects Allwinner SoC glue layer support for the
++ stmmac device driver. This driver is used for A20 GMAC
++ ethernet controller.
++
+ config STMMAC_PCI
+ bool "STMMAC PCI bus support"
+ depends on STMMAC_ETH && PCI
+diff --git a/drivers/net/ethernet/stmicro/stmmac/Makefile b/drivers/net/ethernet/stmicro/stmmac/Makefile
+index 356a9dd..ecadece 100644
+--- a/drivers/net/ethernet/stmicro/stmmac/Makefile
++++ b/drivers/net/ethernet/stmicro/stmmac/Makefile
+@@ -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_SUNXI) += dwmac-sunxi.o
+ stmmac-objs:= stmmac_main.o stmmac_ethtool.o stmmac_mdio.o ring_mode.o \
+ chain_mode.o dwmac_lib.o dwmac1000_core.o dwmac1000_dma.o \
+ dwmac100_core.o dwmac100_dma.o enh_desc.o norm_desc.o \
+diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-sunxi.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-sunxi.c
+new file mode 100644
+index 0000000..6c9fdb0
+--- /dev/null
++++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-sunxi.c
+@@ -0,0 +1,76 @@
++/**
++ * dwmac-sunxi.c - Allwinner sunxi DWMAC specific glue layer
++ *
++ * Copyright (C) 2013 Chen-Yu Tsai
++ *
++ * Chen-Yu Tsai <wens@csie.org>
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ */
++
++#include <linux/clk.h>
++#include <linux/phy.h>
++#include <linux/stmmac.h>
++
++#define GMAC_IF_TYPE_RGMII 0x4
++
++#define GMAC_TX_CLK_MASK 0x3
++#define GMAC_TX_CLK_MII 0x0
++#define GMAC_TX_CLK_RGMII_INT 0x2
++
++static int sun7i_gmac_init(struct platform_device *pdev)
++{
++ struct resource *res;
++ struct device *dev = &pdev->dev;
++ void __iomem *addr = NULL;
++ struct plat_stmmacenet_data *plat_dat = NULL;
++ u32 priv_clk_reg;
++
++ plat_dat = dev_get_platdata(&pdev->dev);
++ if (!plat_dat)
++ return -EINVAL;
++
++ /* Get GMAC clock register in CCU */
++ res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
++ addr = devm_ioremap_resource(dev, res);
++ if (IS_ERR(addr))
++ return PTR_ERR(addr);
++
++ priv_clk_reg = readl(addr);
++
++ /* Set GMAC interface port mode */
++ if (plat_dat->interface == PHY_INTERFACE_MODE_RGMII)
++ priv_clk_reg |= GMAC_IF_TYPE_RGMII;
++ else
++ priv_clk_reg &= ~GMAC_IF_TYPE_RGMII;
++
++ /* Set GMAC transmit clock source. */
++ priv_clk_reg &= ~GMAC_TX_CLK_MASK;
++ if (plat_dat->interface == PHY_INTERFACE_MODE_RGMII
++ || plat_dat->interface == PHY_INTERFACE_MODE_GMII)
++ priv_clk_reg |= GMAC_TX_CLK_RGMII_INT;
++ else
++ priv_clk_reg |= GMAC_TX_CLK_MII;
++
++ writel(priv_clk_reg, addr);
++
++ /* mask out phy addr 0x0 */
++ plat_dat->mdio_bus_data->phy_mask = 0x1;
++
++ return 0;
++}
++
++const struct plat_stmmacenet_data sun7i_gmac_data = {
++ .has_gmac = 1,
++ .tx_coe = 1,
++ .init = sun7i_gmac_init,
++};
++
+diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac.h b/drivers/net/ethernet/stmicro/stmmac/stmmac.h
+index 22f89ff..c8f659a 100644
+--- a/drivers/net/ethernet/stmicro/stmmac/stmmac.h
++++ b/drivers/net/ethernet/stmicro/stmmac/stmmac.h
+@@ -130,6 +130,9 @@ struct stmmac_priv *stmmac_dvr_probe(struct device *device,
+ bool stmmac_eee_init(struct stmmac_priv *priv);
+
+ #ifdef CONFIG_STMMAC_PLATFORM
++#ifdef CONFIG_DWMAC_SUNXI
++extern const struct plat_stmmacenet_data sun7i_gmac_data;
++#endif
+ extern struct platform_driver stmmac_pltfr_driver;
+ static inline int stmmac_register_platform(void)
+ {
+diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c
+index df3fd1c..6cf8292 100644
+--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c
++++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c
+@@ -35,6 +35,9 @@
+ { .compatible = "snps,dwmac-3.70a"},
+ { .compatible = "snps,dwmac-3.710"},
+ { .compatible = "snps,dwmac"},
++#ifdef CONFIG_DWMAC_SUNXI
++ { .compatible = "allwinner,sun7i-gmac", .data = &sun7i_gmac_data},
++#endif
+ { /* sentinel */ }
+ };
+ MODULE_DEVICE_TABLE(of, stmmac_dt_ids);
+--
+1.8.5.1
+