]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
net: designware: s700: Add glue code for S700 mac
authorAmit Singh Tomar <amittomer25@gmail.com>
Sat, 9 May 2020 14:25:12 +0000 (19:55 +0530)
committerTom Rini <trini@konsulko.com>
Tue, 7 Jul 2020 21:11:58 +0000 (17:11 -0400)
This patchs adds glue logic to enable designware mac present on
Action Semi based S700 SoC, Configures SoC specific bits.

Undocumented bit that programs the PHY interface select register
comes from vendor source.

It has been tested on Cubieboard7-lite based on S700 SoC.

Signed-off-by: Amit Singh Tomar <amittomer25@gmail.com>
arch/arm/include/asm/arch-owl/regs_s700.h
drivers/net/Kconfig
drivers/net/Makefile
drivers/net/dwmac_s700.c [new file with mode: 0644]

index 90459ae95eeba39e6edd2e3129e40f67bd7b1bb1..0f79faec69c1a0bf6158f9668cd64770ca577d2e 100644 (file)
 
 #define CMU_DEVCLKEN1_ETH      BIT(23)
 
+#define GPIO_MFP_PWM           (0xE01B0000)
+#define MFP_CTL0               (GPIO_MFP_PWM + 0x40)
+#define MFP_CTL1               (GPIO_MFP_PWM + 0x44)
+#define MFP_CTL2               (GPIO_MFP_PWM + 0x48)
+#define MFP_CTL3               (GPIO_MFP_PWM + 0x4C)
+
 #endif
index 1566b3bda131a22d557c2ec7ecbf288cef2a745a..ec3fb4983206fd6e986919890b64d07bdcb76e4c 100644 (file)
@@ -238,6 +238,13 @@ config ETH_DESIGNWARE_SOCFPGA
          Altera system manager to correctly interface with the PHY.
          This code handles those SoC specifics.
 
+config ETH_DESIGNWARE_S700
+       bool "Actins S700 glue driver for Synopsys Designware Ethernet MAC"
+       depends on DM_ETH && ETH_DESIGNWARE
+       help
+         This provides glue layer to use Synopsys Designware Ethernet MAC
+         present on Actions S700 SoC.
+
 config ETHOC
        bool "OpenCores 10/100 Mbps Ethernet MAC"
        help
index 383ed1c64f7b9e368474d5afdde35b4d95b2ccc8..1ecdc40b8f1deb62aaf5574a0884e4823031311e 100644 (file)
@@ -18,6 +18,7 @@ obj-$(CONFIG_CS8900) += cs8900.o
 obj-$(CONFIG_TULIP) += dc2114x.o
 obj-$(CONFIG_ETH_DESIGNWARE) += designware.o
 obj-$(CONFIG_ETH_DESIGNWARE_SOCFPGA) += dwmac_socfpga.o
+obj-$(CONFIG_ETH_DESIGNWARE_S700) += dwmac_s700.o
 obj-$(CONFIG_DRIVER_DM9000) += dm9000x.o
 obj-$(CONFIG_DNET) += dnet.o
 obj-$(CONFIG_DM_ETH_PHY) += eth-phy-uclass.o
diff --git a/drivers/net/dwmac_s700.c b/drivers/net/dwmac_s700.c
new file mode 100644 (file)
index 0000000..9d3f3ac
--- /dev/null
@@ -0,0 +1,67 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (C) 2020 Amit Singh Tomar <amittomer25@gmail.com>
+ *
+ * Actions DWMAC specific glue layer
+ */
+
+#include <common.h>
+#include <asm/io.h>
+#include <dm.h>
+#include <clk.h>
+#include <phy.h>
+#include <regmap.h>
+#include <reset.h>
+#include <syscon.h>
+#include "designware.h"
+#include <asm/arch-owl/regs_s700.h>
+#include <linux/bitops.h>
+
+/* pin control for MAC */
+#define RMII_TXD01_MFP_CTL0            (0x0 << 16)
+#define RMII_RXD01_MFP_CTL0            (0x0 << 8)
+#define RMII_TXEN_TXER_MFP_CTL0                (0x0 << 13)
+#define RMII_REF_CLK_MFP_CTL0          (0x0 << 6)
+#define CLKO_25M_EN_MFP_CTL3           BIT(30)
+
+DECLARE_GLOBAL_DATA_PTR;
+
+static void dwmac_board_setup(void)
+{
+       clrbits_le32(MFP_CTL0, (RMII_TXD01_MFP_CTL0 | RMII_RXD01_MFP_CTL0 |
+                    RMII_TXEN_TXER_MFP_CTL0 | RMII_REF_CLK_MFP_CTL0));
+
+       setbits_le32(MFP_CTL3, CLKO_25M_EN_MFP_CTL3);
+}
+
+static int dwmac_s700_probe(struct udevice *dev)
+{
+       dwmac_board_setup();
+
+       /* This is undocumented, phy interface select register */
+       writel(0x4, 0xe024c0a0);
+
+       return designware_eth_probe(dev);
+}
+
+static int dwmac_s700_ofdata_to_platdata(struct udevice *dev)
+{
+       return designware_eth_ofdata_to_platdata(dev);
+}
+
+static const struct udevice_id dwmac_s700_ids[] = {
+       {.compatible = "actions,s700-ethernet"},
+       { }
+};
+
+U_BOOT_DRIVER(dwmac_s700) = {
+       .name   = "dwmac_s700",
+       .id     = UCLASS_ETH,
+       .of_match = dwmac_s700_ids,
+       .ofdata_to_platdata = dwmac_s700_ofdata_to_platdata,
+       .probe  = dwmac_s700_probe,
+       .ops    = &designware_eth_ops,
+       .priv_auto_alloc_size = sizeof(struct dw_eth_dev),
+       .platdata_auto_alloc_size = sizeof(struct eth_pdata),
+       .flags = DM_FLAG_ALLOC_PRIV_DMA,
+};