mediatek: add v5.4 support
authorMark-MC Lee (李明昌) <Mark-MC.Lee@mediatek.com>
Mon, 10 Feb 2020 08:33:15 +0000 (09:33 +0100)
committerKoen Vandeputte <koen.vandeputte@ncentric.com>
Fri, 28 Feb 2020 16:50:46 +0000 (17:50 +0100)
Signed-off-by: Mark-MC Lee (李明昌) <Mark-MC.Lee@mediatek.com>
26 files changed:
target/linux/mediatek/Makefile
target/linux/mediatek/files-5.4/drivers/net/phy/mtk/mt753x/Kconfig [new file with mode: 0644]
target/linux/mediatek/files-5.4/drivers/net/phy/mtk/mt753x/Makefile [new file with mode: 0644]
target/linux/mediatek/files-5.4/drivers/net/phy/mtk/mt753x/mt7530.c [new file with mode: 0644]
target/linux/mediatek/files-5.4/drivers/net/phy/mtk/mt753x/mt7530.h [new file with mode: 0644]
target/linux/mediatek/files-5.4/drivers/net/phy/mtk/mt753x/mt7531.c [new file with mode: 0644]
target/linux/mediatek/files-5.4/drivers/net/phy/mtk/mt753x/mt7531.h [new file with mode: 0644]
target/linux/mediatek/files-5.4/drivers/net/phy/mtk/mt753x/mt753x.h [new file with mode: 0644]
target/linux/mediatek/files-5.4/drivers/net/phy/mtk/mt753x/mt753x_common.c [new file with mode: 0644]
target/linux/mediatek/files-5.4/drivers/net/phy/mtk/mt753x/mt753x_mdio.c [new file with mode: 0644]
target/linux/mediatek/files-5.4/drivers/net/phy/mtk/mt753x/mt753x_nl.c [new file with mode: 0644]
target/linux/mediatek/files-5.4/drivers/net/phy/mtk/mt753x/mt753x_nl.h [new file with mode: 0644]
target/linux/mediatek/files-5.4/drivers/net/phy/mtk/mt753x/mt753x_regs.h [new file with mode: 0644]
target/linux/mediatek/files-5.4/drivers/net/phy/mtk/mt753x/mt753x_swconfig.c [new file with mode: 0644]
target/linux/mediatek/files-5.4/drivers/net/phy/mtk/mt753x/mt753x_swconfig.h [new file with mode: 0644]
target/linux/mediatek/files-5.4/drivers/net/phy/mtk/mt753x/mt753x_vlan.c [new file with mode: 0644]
target/linux/mediatek/files-5.4/drivers/net/phy/mtk/mt753x/mt753x_vlan.h [new file with mode: 0644]
target/linux/mediatek/mt7622/config-5.4 [new file with mode: 0755]
target/linux/mediatek/mt7623/config-5.4 [new file with mode: 0644]
target/linux/mediatek/mt7629/config-5.4 [new file with mode: 0644]
target/linux/mediatek/patches-5.4/0003-switch-add-mt7531.patch [new file with mode: 0755]
target/linux/mediatek/patches-5.4/0005-dts-mt7622-add-gsw.patch [new file with mode: 0755]
target/linux/mediatek/patches-5.4/0005-dts-mt7629-add-gsw.patch [new file with mode: 0644]
target/linux/mediatek/patches-5.4/0006-dts-fix-bpi2-console.patch [new file with mode: 0755]
target/linux/mediatek/patches-5.4/0006-dts-fix-bpi64-console.patch [new file with mode: 0755]
target/linux/mediatek/patches-5.4/0227-arm-dts-Add-Unielec-U7623-DTS.patch [new file with mode: 0644]

index 4d7df9852078ad7ffae8d2863836a30db6e4a6da..152b61bb400e36af498aa9eb749eb5434afe4b39 100644 (file)
@@ -10,6 +10,7 @@ FEATURES:=squashfs nand ramdisk fpu
 MAINTAINER:=John Crispin <john@phrozen.org>
 
 KERNEL_PATCHVER:=4.19
 MAINTAINER:=John Crispin <john@phrozen.org>
 
 KERNEL_PATCHVER:=4.19
+KERNEL_TESTING_PATCHVER:=5.4
 
 include $(INCLUDE_DIR)/target.mk
 DEFAULT_PACKAGES += \
 
 include $(INCLUDE_DIR)/target.mk
 DEFAULT_PACKAGES += \
diff --git a/target/linux/mediatek/files-5.4/drivers/net/phy/mtk/mt753x/Kconfig b/target/linux/mediatek/files-5.4/drivers/net/phy/mtk/mt753x/Kconfig
new file mode 100644 (file)
index 0000000..d9e0230
--- /dev/null
@@ -0,0 +1,3 @@
+
+config MT753X_GSW
+       tristate "Driver for the MediaTek MT753x switch"
diff --git a/target/linux/mediatek/files-5.4/drivers/net/phy/mtk/mt753x/Makefile b/target/linux/mediatek/files-5.4/drivers/net/phy/mtk/mt753x/Makefile
new file mode 100644 (file)
index 0000000..7aae451
--- /dev/null
@@ -0,0 +1,11 @@
+#
+# Makefile for MediaTek MT753x gigabit switch
+#
+
+obj-$(CONFIG_MT753X_GSW)       += mt753x.o
+
+mt753x-$(CONFIG_SWCONFIG)      += mt753x_swconfig.o
+
+mt753x-y                       += mt753x_mdio.o mt7530.o mt7531.o \
+                                       mt753x_common.o mt753x_vlan.o \
+                                       mt753x_nl.o
diff --git a/target/linux/mediatek/files-5.4/drivers/net/phy/mtk/mt753x/mt7530.c b/target/linux/mediatek/files-5.4/drivers/net/phy/mtk/mt753x/mt7530.c
new file mode 100644 (file)
index 0000000..014b83b
--- /dev/null
@@ -0,0 +1,631 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (c) 2018 MediaTek Inc.
+ * Author: Weijie Gao <weijie.gao@mediatek.com>
+ */
+
+#include <linux/kernel.h>
+#include <linux/delay.h>
+
+#include "mt753x.h"
+#include "mt753x_regs.h"
+
+/* MT7530 registers */
+
+/* Unique fields of PMCR for MT7530 */
+#define FORCE_MODE                     BIT(15)
+
+/* Unique fields of GMACCR for MT7530 */
+#define VLAN_SUPT_NO_S                 14
+#define VLAN_SUPT_NO_M                 0x1c000
+#define LATE_COL_DROP                  BIT(13)
+
+/* Unique fields of (M)HWSTRAP for MT7530 */
+#define BOND_OPTION                    BIT(24)
+#define P5_PHY0_SEL                    BIT(20)
+#define CHG_TRAP                       BIT(16)
+#define LOOPDET_DIS                    BIT(14)
+#define P5_INTF_SEL_GMAC5              BIT(13)
+#define SMI_ADDR_S                     11
+#define SMI_ADDR_M                     0x1800
+#define XTAL_FSEL_S                    9
+#define XTAL_FSEL_M                    0x600
+#define P6_INTF_DIS                    BIT(8)
+#define P5_INTF_MODE_RGMII             BIT(7)
+#define P5_INTF_DIS_S                  BIT(6)
+#define C_MDIO_BPS_S                   BIT(5)
+#define EEPROM_EN_S                    BIT(4)
+
+/* PHY EEE Register bitmap of define */
+#define PHY_DEV07                      0x07
+#define PHY_DEV07_REG_03C              0x3c
+
+/* PHY Extend Register 0x14 bitmap of define */
+#define PHY_EXT_REG_14                 0x14
+
+/* Fields of PHY_EXT_REG_14 */
+#define PHY_EN_DOWN_SHFIT              BIT(4)
+
+/* PHY Token Ring Register 0x10 bitmap of define */
+#define PHY_TR_REG_10                  0x10
+
+/* PHY Token Ring Register 0x12 bitmap of define */
+#define PHY_TR_REG_12                  0x12
+
+/* PHY LPI PCS/DSP Control Register bitmap of define */
+#define PHY_LPI_REG_11                 0x11
+
+/* PHY DEV 0x1e Register bitmap of define */
+#define PHY_DEV1E                      0x1e
+#define PHY_DEV1E_REG_123              0x123
+#define PHY_DEV1E_REG_A6               0xa6
+
+/* Values of XTAL_FSEL */
+#define XTAL_20MHZ                     1
+#define XTAL_40MHZ                     2
+#define XTAL_25MHZ                     3
+
+#define P6ECR                          0x7830
+#define P6_INTF_MODE_TRGMII            BIT(0)
+
+#define TRGMII_TXCTRL                  0x7a40
+#define TRAIN_TXEN                     BIT(31)
+#define TXC_INV                                BIT(30)
+#define TX_DOEO                                BIT(29)
+#define TX_RST                         BIT(28)
+
+#define TRGMII_TD0_CTRL                        0x7a50
+#define TRGMII_TD1_CTRL                        0x7a58
+#define TRGMII_TD2_CTRL                        0x7a60
+#define TRGMII_TD3_CTRL                        0x7a68
+#define TRGMII_TXCTL_CTRL              0x7a70
+#define TRGMII_TCK_CTRL                        0x7a78
+#define TRGMII_TD_CTRL(n)              (0x7a50 + (n) * 8)
+#define NUM_TRGMII_CTRL                        6
+#define TX_DMPEDRV                     BIT(31)
+#define TX_DM_SR                       BIT(15)
+#define TX_DMERODT                     BIT(14)
+#define TX_DMOECTL                     BIT(13)
+#define TX_TAP_S                       8
+#define TX_TAP_M                       0xf00
+#define TX_TRAIN_WD_S                  0
+#define TX_TRAIN_WD_M                  0xff
+
+#define TRGMII_TD0_ODT                 0x7a54
+#define TRGMII_TD1_ODT                 0x7a5c
+#define TRGMII_TD2_ODT                 0x7a64
+#define TRGMII_TD3_ODT                 0x7a6c
+#define TRGMII_TXCTL_ODT               0x7574
+#define TRGMII_TCK_ODT                 0x757c
+#define TRGMII_TD_ODT(n)               (0x7a54 + (n) * 8)
+#define NUM_TRGMII_ODT                 6
+#define TX_DM_DRVN_PRE_S               30
+#define TX_DM_DRVN_PRE_M               0xc0000000
+#define TX_DM_DRVP_PRE_S               28
+#define TX_DM_DRVP_PRE_M               0x30000000
+#define TX_DM_TDSEL_S                  24
+#define TX_DM_TDSEL_M                  0xf000000
+#define TX_ODTEN                       BIT(23)
+#define TX_DME_PRE                     BIT(20)
+#define TX_DM_DRVNT0                   BIT(19)
+#define TX_DM_DRVPT0                   BIT(18)
+#define TX_DM_DRVNTE                   BIT(17)
+#define TX_DM_DRVPTE                   BIT(16)
+#define TX_DM_ODTN_S                   12
+#define TX_DM_ODTN_M                   0x7000
+#define TX_DM_ODTP_S                   8
+#define TX_DM_ODTP_M                   0x700
+#define TX_DM_DRVN_S                   4
+#define TX_DM_DRVN_M                   0xf0
+#define TX_DM_DRVP_S                   0
+#define TX_DM_DRVP_M                   0x0f
+
+#define P5RGMIIRXCR                    0x7b00
+#define CSR_RGMII_RCTL_CFG_S           24
+#define CSR_RGMII_RCTL_CFG_M           0x7000000
+#define CSR_RGMII_RXD_CFG_S            16
+#define CSR_RGMII_RXD_CFG_M            0x70000
+#define CSR_RGMII_EDGE_ALIGN           BIT(8)
+#define CSR_RGMII_RXC_90DEG_CFG_S      4
+#define CSR_RGMII_RXC_90DEG_CFG_M      0xf0
+#define CSR_RGMII_RXC_0DEG_CFG_S       0
+#define CSR_RGMII_RXC_0DEG_CFG_M       0x0f
+
+#define P5RGMIITXCR                    0x7b04
+#define CSR_RGMII_TXEN_CFG_S           16
+#define CSR_RGMII_TXEN_CFG_M           0x70000
+#define CSR_RGMII_TXD_CFG_S            8
+#define CSR_RGMII_TXD_CFG_M            0x700
+#define CSR_RGMII_TXC_CFG_S            0
+#define CSR_RGMII_TXC_CFG_M            0x1f
+
+#define CHIP_REV                       0x7ffc
+#define CHIP_NAME_S                    16
+#define CHIP_NAME_M                    0xffff0000
+#define CHIP_REV_S                     0
+#define CHIP_REV_M                     0x0f
+
+/* MMD registers */
+#define CORE_PLL_GROUP2                        0x401
+#define RG_SYSPLL_EN_NORMAL            BIT(15)
+#define RG_SYSPLL_VODEN                        BIT(14)
+#define RG_SYSPLL_POSDIV_S             5
+#define RG_SYSPLL_POSDIV_M             0x60
+
+#define CORE_PLL_GROUP4                        0x403
+#define RG_SYSPLL_DDSFBK_EN            BIT(12)
+#define RG_SYSPLL_BIAS_EN              BIT(11)
+#define RG_SYSPLL_BIAS_LPF_EN          BIT(10)
+
+#define CORE_PLL_GROUP5                        0x404
+#define RG_LCDDS_PCW_NCPO1_S           0
+#define RG_LCDDS_PCW_NCPO1_M           0xffff
+
+#define CORE_PLL_GROUP6                        0x405
+#define RG_LCDDS_PCW_NCPO0_S           0
+#define RG_LCDDS_PCW_NCPO0_M           0xffff
+
+#define CORE_PLL_GROUP7                        0x406
+#define RG_LCDDS_PWDB                  BIT(15)
+#define RG_LCDDS_ISO_EN                        BIT(13)
+#define RG_LCCDS_C_S                   4
+#define RG_LCCDS_C_M                   0x70
+#define RG_LCDDS_PCW_NCPO_CHG          BIT(3)
+
+#define CORE_PLL_GROUP10               0x409
+#define RG_LCDDS_SSC_DELTA_S           0
+#define RG_LCDDS_SSC_DELTA_M           0xfff
+
+#define CORE_PLL_GROUP11               0x40a
+#define RG_LCDDS_SSC_DELTA1_S          0
+#define RG_LCDDS_SSC_DELTA1_M          0xfff
+
+#define CORE_GSWPLL_GCR_1              0x040d
+#define GSWPLL_PREDIV_S                        14
+#define GSWPLL_PREDIV_M                        0xc000
+#define GSWPLL_POSTDIV_200M_S          12
+#define GSWPLL_POSTDIV_200M_M          0x3000
+#define GSWPLL_EN_PRE                  BIT(11)
+#define GSWPLL_FBKSEL                  BIT(10)
+#define GSWPLL_BP                      BIT(9)
+#define GSWPLL_BR                      BIT(8)
+#define GSWPLL_FBKDIV_200M_S           0
+#define GSWPLL_FBKDIV_200M_M           0xff
+
+#define CORE_GSWPLL_GCR_2              0x040e
+#define GSWPLL_POSTDIV_500M_S          8
+#define GSWPLL_POSTDIV_500M_M          0x300
+#define GSWPLL_FBKDIV_500M_S           0
+#define GSWPLL_FBKDIV_500M_M           0xff
+
+#define TRGMII_GSW_CLK_CG              0x0410
+#define TRGMIICK_EN                    BIT(1)
+#define GSWCK_EN                       BIT(0)
+
+static int mt7530_mii_read(struct gsw_mt753x *gsw, int phy, int reg)
+{
+       if (phy < MT753X_NUM_PHYS)
+               phy = (gsw->phy_base + phy) & MT753X_SMI_ADDR_MASK;
+
+       return mdiobus_read(gsw->host_bus, phy, reg);
+}
+
+static void mt7530_mii_write(struct gsw_mt753x *gsw, int phy, int reg, u16 val)
+{
+       if (phy < MT753X_NUM_PHYS)
+               phy = (gsw->phy_base + phy) & MT753X_SMI_ADDR_MASK;
+
+       mdiobus_write(gsw->host_bus, phy, reg, val);
+}
+
+static int mt7530_mmd_read(struct gsw_mt753x *gsw, int addr, int devad, u16 reg)
+{
+       u16 val;
+
+       if (addr < MT753X_NUM_PHYS)
+               addr = (gsw->phy_base + addr) & MT753X_SMI_ADDR_MASK;
+
+       mutex_lock(&gsw->host_bus->mdio_lock);
+
+       gsw->host_bus->write(gsw->host_bus, addr, MII_MMD_ACC_CTL_REG,
+                            (MMD_ADDR << MMD_CMD_S) |
+                            ((devad << MMD_DEVAD_S) & MMD_DEVAD_M));
+
+       gsw->host_bus->write(gsw->host_bus, addr, MII_MMD_ADDR_DATA_REG, reg);
+
+       gsw->host_bus->write(gsw->host_bus, addr, MII_MMD_ACC_CTL_REG,
+                            (MMD_DATA << MMD_CMD_S) |
+                            ((devad << MMD_DEVAD_S) & MMD_DEVAD_M));
+
+       val = gsw->host_bus->read(gsw->host_bus, addr, MII_MMD_ADDR_DATA_REG);
+
+       mutex_unlock(&gsw->host_bus->mdio_lock);
+
+       return val;
+}
+
+static void mt7530_mmd_write(struct gsw_mt753x *gsw, int addr, int devad,
+                            u16 reg, u16 val)
+{
+       if (addr < MT753X_NUM_PHYS)
+               addr = (gsw->phy_base + addr) & MT753X_SMI_ADDR_MASK;
+
+       mutex_lock(&gsw->host_bus->mdio_lock);
+
+       gsw->host_bus->write(gsw->host_bus, addr, MII_MMD_ACC_CTL_REG,
+                     (MMD_ADDR << MMD_CMD_S) |
+                     ((devad << MMD_DEVAD_S) & MMD_DEVAD_M));
+
+       gsw->host_bus->write(gsw->host_bus, addr, MII_MMD_ADDR_DATA_REG, reg);
+
+       gsw->host_bus->write(gsw->host_bus, addr, MII_MMD_ACC_CTL_REG,
+                     (MMD_DATA << MMD_CMD_S) |
+                     ((devad << MMD_DEVAD_S) & MMD_DEVAD_M));
+
+       gsw->host_bus->write(gsw->host_bus, addr, MII_MMD_ADDR_DATA_REG, val);
+
+       mutex_unlock(&gsw->host_bus->mdio_lock);
+}
+
+static void mt7530_core_reg_write(struct gsw_mt753x *gsw, u32 reg, u32 val)
+{
+       gsw->mmd_write(gsw, 0, 0x1f, reg, val);
+}
+
+static void mt7530_trgmii_setting(struct gsw_mt753x *gsw)
+{
+       u16 i;
+
+       mt7530_core_reg_write(gsw, CORE_PLL_GROUP5, 0x0780);
+       mdelay(1);
+       mt7530_core_reg_write(gsw, CORE_PLL_GROUP6, 0);
+       mt7530_core_reg_write(gsw, CORE_PLL_GROUP10, 0x87);
+       mdelay(1);
+       mt7530_core_reg_write(gsw, CORE_PLL_GROUP11, 0x87);
+
+       /* PLL BIAS enable */
+       mt7530_core_reg_write(gsw, CORE_PLL_GROUP4,
+                             RG_SYSPLL_DDSFBK_EN | RG_SYSPLL_BIAS_EN);
+       mdelay(1);
+
+       /* PLL LPF enable */
+       mt7530_core_reg_write(gsw, CORE_PLL_GROUP4,
+                             RG_SYSPLL_DDSFBK_EN |
+                             RG_SYSPLL_BIAS_EN | RG_SYSPLL_BIAS_LPF_EN);
+
+       /* sys PLL enable */
+       mt7530_core_reg_write(gsw, CORE_PLL_GROUP2,
+                             RG_SYSPLL_EN_NORMAL | RG_SYSPLL_VODEN |
+                             (1 << RG_SYSPLL_POSDIV_S));
+
+       /* LCDDDS PWDS */
+       mt7530_core_reg_write(gsw, CORE_PLL_GROUP7,
+                             (3 << RG_LCCDS_C_S) |
+                             RG_LCDDS_PWDB | RG_LCDDS_ISO_EN);
+       mdelay(1);
+
+       /* Enable MT7530 TRGMII clock */
+       mt7530_core_reg_write(gsw, TRGMII_GSW_CLK_CG, GSWCK_EN | TRGMIICK_EN);
+
+       /* lower Tx Driving */
+       for (i = 0 ; i < NUM_TRGMII_ODT; i++)
+               mt753x_reg_write(gsw, TRGMII_TD_ODT(i),
+                                (4 << TX_DM_DRVP_S) | (4 << TX_DM_DRVN_S));
+}
+
+static void mt7530_rgmii_setting(struct gsw_mt753x *gsw)
+{
+       u32 val;
+
+       mt7530_core_reg_write(gsw, CORE_PLL_GROUP5, 0x0c80);
+       mdelay(1);
+       mt7530_core_reg_write(gsw, CORE_PLL_GROUP6, 0);
+       mt7530_core_reg_write(gsw, CORE_PLL_GROUP10, 0x87);
+       mdelay(1);
+       mt7530_core_reg_write(gsw, CORE_PLL_GROUP11, 0x87);
+
+       val = mt753x_reg_read(gsw, TRGMII_TXCTRL);
+       val &= ~TXC_INV;
+       mt753x_reg_write(gsw, TRGMII_TXCTRL, val);
+
+       mt753x_reg_write(gsw, TRGMII_TCK_CTRL,
+                        (8 << TX_TAP_S) | (0x55 << TX_TRAIN_WD_S));
+}
+
+static int mt7530_mac_port_setup(struct gsw_mt753x *gsw)
+{
+       u32 hwstrap, p6ecr = 0, p5mcr, p6mcr, phyad;
+
+       hwstrap = mt753x_reg_read(gsw, MHWSTRAP);
+       hwstrap &= ~(P6_INTF_DIS | P5_INTF_MODE_RGMII | P5_INTF_DIS_S);
+       hwstrap |= P5_INTF_SEL_GMAC5;
+       if (!gsw->port5_cfg.enabled) {
+               p5mcr = FORCE_MODE;
+               hwstrap |= P5_INTF_DIS_S;
+       } else {
+               p5mcr = (IPG_96BIT_WITH_SHORT_IPG << IPG_CFG_S) |
+                       MAC_MODE | MAC_TX_EN | MAC_RX_EN |
+                       BKOFF_EN | BACKPR_EN;
+
+               if (gsw->port5_cfg.force_link) {
+                       p5mcr |= FORCE_MODE | FORCE_LINK | FORCE_RX_FC |
+                                FORCE_TX_FC;
+                       p5mcr |= gsw->port5_cfg.speed << FORCE_SPD_S;
+
+                       if (gsw->port5_cfg.duplex)
+                               p5mcr |= FORCE_DPX;
+               }
+
+               switch (gsw->port5_cfg.phy_mode) {
+               case PHY_INTERFACE_MODE_MII:
+               case PHY_INTERFACE_MODE_GMII:
+                       break;
+               case PHY_INTERFACE_MODE_RGMII:
+                       hwstrap |= P5_INTF_MODE_RGMII;
+                       break;
+               default:
+                       dev_info(gsw->dev, "%s is not supported by port5\n",
+                                phy_modes(gsw->port5_cfg.phy_mode));
+                       p5mcr = FORCE_MODE;
+                       hwstrap |= P5_INTF_DIS_S;
+               }
+
+               /* Port5 to PHY direct mode */
+               if (of_property_read_u32(gsw->port5_cfg.np, "phy-address",
+                                        &phyad))
+                       goto parse_p6;
+
+               if (phyad != 0 && phyad != 4) {
+                       dev_info(gsw->dev,
+                                "Only PHY 0/4 can be connected to Port 5\n");
+                       goto parse_p6;
+               }
+
+               hwstrap &= ~P5_INTF_SEL_GMAC5;
+               if (phyad == 0)
+                       hwstrap |= P5_PHY0_SEL;
+               else
+                       hwstrap &= ~P5_PHY0_SEL;
+       }
+
+parse_p6:
+       if (!gsw->port6_cfg.enabled) {
+               p6mcr = FORCE_MODE;
+               hwstrap |= P6_INTF_DIS;
+       } else {
+               p6mcr = (IPG_96BIT_WITH_SHORT_IPG << IPG_CFG_S) |
+                       MAC_MODE | MAC_TX_EN | MAC_RX_EN |
+                       BKOFF_EN | BACKPR_EN;
+
+               if (gsw->port6_cfg.force_link) {
+                       p6mcr |= FORCE_MODE | FORCE_LINK | FORCE_RX_FC |
+                                FORCE_TX_FC;
+                       p6mcr |= gsw->port6_cfg.speed << FORCE_SPD_S;
+
+                       if (gsw->port6_cfg.duplex)
+                               p6mcr |= FORCE_DPX;
+               }
+
+               switch (gsw->port6_cfg.phy_mode) {
+               case PHY_INTERFACE_MODE_RGMII:
+                       p6ecr = BIT(1);
+                       break;
+               case PHY_INTERFACE_MODE_TRGMII:
+                       /* set MT7530 central align */
+                       p6ecr = BIT(0);
+                       break;
+               default:
+                       dev_info(gsw->dev, "%s is not supported by port6\n",
+                                phy_modes(gsw->port6_cfg.phy_mode));
+                       p6mcr = FORCE_MODE;
+                       hwstrap |= P6_INTF_DIS;
+               }
+       }
+
+       mt753x_reg_write(gsw, MHWSTRAP, hwstrap);
+       mt753x_reg_write(gsw, P6ECR, p6ecr);
+
+       mt753x_reg_write(gsw, PMCR(5), p5mcr);
+       mt753x_reg_write(gsw, PMCR(6), p6mcr);
+
+       return 0;
+}
+
+static void mt7530_core_pll_setup(struct gsw_mt753x *gsw)
+{
+       u32 hwstrap;
+
+       hwstrap = mt753x_reg_read(gsw, HWSTRAP);
+
+       switch ((hwstrap & XTAL_FSEL_M) >> XTAL_FSEL_S) {
+       case XTAL_40MHZ:
+               /* Disable MT7530 core clock */
+               mt7530_core_reg_write(gsw, TRGMII_GSW_CLK_CG, 0);
+
+               /* disable MT7530 PLL */
+               mt7530_core_reg_write(gsw, CORE_GSWPLL_GCR_1,
+                                     (2 << GSWPLL_POSTDIV_200M_S) |
+                                     (32 << GSWPLL_FBKDIV_200M_S));
+
+               /* For MT7530 core clock = 500Mhz */
+               mt7530_core_reg_write(gsw, CORE_GSWPLL_GCR_2,
+                                     (1 << GSWPLL_POSTDIV_500M_S) |
+                                     (25 << GSWPLL_FBKDIV_500M_S));
+
+               /* Enable MT7530 PLL */
+               mt7530_core_reg_write(gsw, CORE_GSWPLL_GCR_1,
+                                     (2 << GSWPLL_POSTDIV_200M_S) |
+                                     (32 << GSWPLL_FBKDIV_200M_S) |
+                                     GSWPLL_EN_PRE);
+
+               usleep_range(20, 40);
+
+               /* Enable MT7530 core clock */
+               mt7530_core_reg_write(gsw, TRGMII_GSW_CLK_CG, GSWCK_EN);
+               break;
+       default:
+               /* TODO: PLL settings for 20/25MHz */
+               break;
+       }
+
+       hwstrap = mt753x_reg_read(gsw, HWSTRAP);
+       hwstrap |= CHG_TRAP;
+       if (gsw->direct_phy_access)
+               hwstrap &= ~C_MDIO_BPS_S;
+       else
+               hwstrap |= C_MDIO_BPS_S;
+
+       mt753x_reg_write(gsw, MHWSTRAP, hwstrap);
+
+       if (gsw->port6_cfg.enabled &&
+           gsw->port6_cfg.phy_mode == PHY_INTERFACE_MODE_TRGMII) {
+               mt7530_trgmii_setting(gsw);
+       } else {
+               /* RGMII */
+               mt7530_rgmii_setting(gsw);
+       }
+
+       /* delay setting for 10/1000M */
+       mt753x_reg_write(gsw, P5RGMIIRXCR,
+                        CSR_RGMII_EDGE_ALIGN |
+                        (2 << CSR_RGMII_RXC_0DEG_CFG_S));
+       mt753x_reg_write(gsw, P5RGMIITXCR, 0x14 << CSR_RGMII_TXC_CFG_S);
+}
+
+static int mt7530_sw_detect(struct gsw_mt753x *gsw, struct chip_rev *crev)
+{
+       u32 rev;
+
+       rev = mt753x_reg_read(gsw, CHIP_REV);
+
+       if (((rev & CHIP_NAME_M) >> CHIP_NAME_S) == MT7530) {
+               if (crev) {
+                       crev->rev = rev & CHIP_REV_M;
+                       crev->name = "MT7530";
+               }
+
+               return 0;
+       }
+
+       return -ENODEV;
+}
+
+static void mt7530_phy_setting(struct gsw_mt753x *gsw)
+{
+       int i;
+       u32 val;
+
+       for (i = 0; i < MT753X_NUM_PHYS; i++) {
+               /* Disable EEE */
+               gsw->mmd_write(gsw, i, PHY_DEV07, PHY_DEV07_REG_03C, 0);
+
+               /* Enable HW auto downshift */
+               gsw->mii_write(gsw, i, 0x1f, 0x1);
+               val = gsw->mii_read(gsw, i, PHY_EXT_REG_14);
+               val |= PHY_EN_DOWN_SHFIT;
+               gsw->mii_write(gsw, i, PHY_EXT_REG_14, val);
+
+               /* Increase SlvDPSready time */
+               gsw->mii_write(gsw, i, 0x1f, 0x52b5);
+               gsw->mii_write(gsw, i, PHY_TR_REG_10, 0xafae);
+               gsw->mii_write(gsw, i, PHY_TR_REG_12, 0x2f);
+               gsw->mii_write(gsw, i, PHY_TR_REG_10, 0x8fae);
+
+               /* Increase post_update_timer */
+               gsw->mii_write(gsw, i, 0x1f, 0x3);
+               gsw->mii_write(gsw, i, PHY_LPI_REG_11, 0x4b);
+               gsw->mii_write(gsw, i, 0x1f, 0);
+
+               /* Adjust 100_mse_threshold */
+               gsw->mmd_write(gsw, i, PHY_DEV1E, PHY_DEV1E_REG_123, 0xffff);
+
+               /* Disable mcc */
+               gsw->mmd_write(gsw, i, PHY_DEV1E, PHY_DEV1E_REG_A6, 0x300);
+       }
+}
+
+static inline bool get_phy_access_mode(const struct device_node *np)
+{
+       return of_property_read_bool(np, "mt7530,direct-phy-access");
+}
+
+static int mt7530_sw_init(struct gsw_mt753x *gsw)
+{
+       int i;
+       u32 val;
+
+       gsw->direct_phy_access = get_phy_access_mode(gsw->dev->of_node);
+
+       /* Force MT7530 to use (in)direct PHY access */
+       val = mt753x_reg_read(gsw, HWSTRAP);
+       val |= CHG_TRAP;
+       if (gsw->direct_phy_access)
+               val &= ~C_MDIO_BPS_S;
+       else
+               val |= C_MDIO_BPS_S;
+       mt753x_reg_write(gsw, MHWSTRAP, val);
+
+       /* Read PHY address base from HWSTRAP */
+       gsw->phy_base  = (((val & SMI_ADDR_M) >> SMI_ADDR_S) << 3) + 8;
+       gsw->phy_base &= MT753X_SMI_ADDR_MASK;
+
+       if (gsw->direct_phy_access) {
+               gsw->mii_read = mt7530_mii_read;
+               gsw->mii_write = mt7530_mii_write;
+               gsw->mmd_read = mt7530_mmd_read;
+               gsw->mmd_write = mt7530_mmd_write;
+       } else {
+               gsw->mii_read = mt753x_mii_read;
+               gsw->mii_write = mt753x_mii_write;
+               gsw->mmd_read = mt753x_mmd_ind_read;
+               gsw->mmd_write = mt753x_mmd_ind_write;
+       }
+
+       for (i = 0; i < MT753X_NUM_PHYS; i++) {
+               val = gsw->mii_read(gsw, i, MII_BMCR);
+               val |= BMCR_PDOWN;
+               gsw->mii_write(gsw, i, MII_BMCR, val);
+       }
+
+       /* Force MAC link down before reset */
+       mt753x_reg_write(gsw, PMCR(5), FORCE_MODE);
+       mt753x_reg_write(gsw, PMCR(6), FORCE_MODE);
+
+       /* Switch soft reset */
+       /* BUG: sw reset causes gsw int flooding */
+       mt753x_reg_write(gsw, SYS_CTRL, SW_PHY_RST | SW_SYS_RST | SW_REG_RST);
+       usleep_range(10, 20);
+
+       /* global mac control settings configuration */
+       mt753x_reg_write(gsw, GMACCR,
+                        LATE_COL_DROP | (15 << MTCC_LMT_S) |
+                        (2 << MAX_RX_JUMBO_S) | RX_PKT_LEN_MAX_JUMBO);
+
+       mt7530_core_pll_setup(gsw);
+       mt7530_mac_port_setup(gsw);
+
+       return 0;
+}
+
+static int mt7530_sw_post_init(struct gsw_mt753x *gsw)
+{
+       int i;
+       u32 val;
+
+       mt7530_phy_setting(gsw);
+
+       for (i = 0; i < MT753X_NUM_PHYS; i++) {
+               val = gsw->mii_read(gsw, i, MII_BMCR);
+               val &= ~BMCR_PDOWN;
+               gsw->mii_write(gsw, i, MII_BMCR, val);
+       }
+
+       return 0;
+}
+
+struct mt753x_sw_id mt7530_id = {
+       .model = MT7530,
+       .detect = mt7530_sw_detect,
+       .init = mt7530_sw_init,
+       .post_init = mt7530_sw_post_init
+};
diff --git a/target/linux/mediatek/files-5.4/drivers/net/phy/mtk/mt753x/mt7530.h b/target/linux/mediatek/files-5.4/drivers/net/phy/mtk/mt753x/mt7530.h
new file mode 100644 (file)
index 0000000..ef2d684
--- /dev/null
@@ -0,0 +1,13 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (c) 2018 MediaTek Inc.
+ */
+
+#ifndef _MT7530_H_
+#define _MT7530_H_
+
+#include "mt753x.h"
+
+extern struct mt753x_sw_id mt7530_id;
+
+#endif /* _MT7530_H_ */
diff --git a/target/linux/mediatek/files-5.4/drivers/net/phy/mtk/mt753x/mt7531.c b/target/linux/mediatek/files-5.4/drivers/net/phy/mtk/mt753x/mt7531.c
new file mode 100644 (file)
index 0000000..5b9f359
--- /dev/null
@@ -0,0 +1,918 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (c) 2018 MediaTek Inc.
+ * Author: Zhanguo Ju <zhanguo.ju@mediatek.com>
+ */
+
+#include <linux/kernel.h>
+#include <linux/delay.h>
+#include <linux/hrtimer.h>
+
+#include "mt753x.h"
+#include "mt753x_regs.h"
+
+/* MT7531 registers */
+#define SGMII_REG_BASE                 0x5000
+#define SGMII_REG_PORT_BASE            0x1000
+#define SGMII_REG(p, r)                        (SGMII_REG_BASE + \
+                                       (p) * SGMII_REG_PORT_BASE + (r))
+#define PCS_CONTROL_1(p)               SGMII_REG(p, 0x00)
+#define SGMII_MODE(p)                  SGMII_REG(p, 0x20)
+#define QPHY_PWR_STATE_CTRL(p)         SGMII_REG(p, 0xe8)
+#define PHYA_CTRL_SIGNAL3(p)           SGMII_REG(p, 0x128)
+
+/* Fields of PCS_CONTROL_1 */
+#define SGMII_LINK_STATUS              BIT(18)
+#define SGMII_AN_ENABLE                        BIT(12)
+#define SGMII_AN_RESTART               BIT(9)
+
+/* Fields of SGMII_MODE */
+#define SGMII_REMOTE_FAULT_DIS         BIT(8)
+#define SGMII_IF_MODE_FORCE_DUPLEX     BIT(4)
+#define SGMII_IF_MODE_FORCE_SPEED_S    0x2
+#define SGMII_IF_MODE_FORCE_SPEED_M    0x0c
+#define SGMII_IF_MODE_ADVERT_AN                BIT(1)
+
+/* Values of SGMII_IF_MODE_FORCE_SPEED */
+#define SGMII_IF_MODE_FORCE_SPEED_10   0
+#define SGMII_IF_MODE_FORCE_SPEED_100  1
+#define SGMII_IF_MODE_FORCE_SPEED_1000 2
+
+/* Fields of QPHY_PWR_STATE_CTRL */
+#define PHYA_PWD                       BIT(4)
+
+/* Fields of PHYA_CTRL_SIGNAL3 */
+#define RG_TPHY_SPEED_S                        2
+#define RG_TPHY_SPEED_M                        0x0c
+
+/* Values of RG_TPHY_SPEED */
+#define RG_TPHY_SPEED_1000             0
+#define RG_TPHY_SPEED_2500             1
+
+/* Unique fields of (M)HWSTRAP for MT7531 */
+#define XTAL_FSEL_S                    7
+#define XTAL_FSEL_M                    BIT(7)
+#define PHY_EN                         BIT(6)
+#define CHG_STRAP                      BIT(8)
+
+/* Efuse Register Define */
+#define GBE_EFUSE                      0x7bc8
+#define GBE_SEL_EFUSE_EN               BIT(0)
+
+/* PHY ENABLE Register bitmap define */
+#define PHY_DEV1F                      0x1f
+#define PHY_DEV1F_REG_44               0x44
+#define PHY_DEV1F_REG_104              0x104
+#define PHY_DEV1F_REG_10A              0x10a
+#define PHY_DEV1F_REG_10B              0x10b
+#define PHY_DEV1F_REG_10C              0x10c
+#define PHY_DEV1F_REG_10D              0x10d
+#define PHY_DEV1F_REG_268              0x268
+#define PHY_DEV1F_REG_269              0x269
+#define PHY_DEV1F_REG_403              0x403
+
+/* Fields of PHY_DEV1F_REG_403 */
+#define GBE_EFUSE_SETTING              BIT(3)
+#define PHY_EN_BYPASS_MODE             BIT(4)
+#define POWER_ON_OFF                   BIT(5)
+#define PHY_PLL_M                      GENMASK(9, 8)
+#define PHY_PLL_SEL(x)                 (((x) << 8) & GENMASK(9, 8))
+
+/* PHY EEE Register bitmap of define */
+#define PHY_DEV07                      0x07
+#define PHY_DEV07_REG_03C              0x3c
+
+/* PHY Extend Register 0x14 bitmap of define */
+#define PHY_EXT_REG_14                 0x14
+
+/* Fields of PHY_EXT_REG_14 */
+#define PHY_EN_DOWN_SHFIT              BIT(4)
+
+/* PHY Extend Register 0x17 bitmap of define */
+#define PHY_EXT_REG_17                 0x17
+
+/* Fields of PHY_EXT_REG_17 */
+#define PHY_LINKDOWN_POWER_SAVING_EN   BIT(4)
+
+/* PHY Token Ring Register 0x10 bitmap of define */
+#define PHY_TR_REG_10                  0x10
+
+/* PHY Token Ring Register 0x12 bitmap of define */
+#define PHY_TR_REG_12                  0x12
+
+/* PHY DEV 0x1e Register bitmap of define */
+#define PHY_DEV1E                      0x1e
+#define PHY_DEV1E_REG_13               0x13
+#define PHY_DEV1E_REG_14               0x14
+#define PHY_DEV1E_REG_41               0x41
+#define PHY_DEV1E_REG_A6               0xa6
+#define PHY_DEV1E_REG_0C6              0x0c6
+#define PHY_DEV1E_REG_0FE              0x0fe
+#define PHY_DEV1E_REG_123              0x123
+#define PHY_DEV1E_REG_189              0x189
+
+/* Fields of PHY_DEV1E_REG_0C6 */
+#define PHY_POWER_SAVING_S             8
+#define PHY_POWER_SAVING_M             0x300
+#define PHY_POWER_SAVING_TX            0x0
+
+/* Fields of PHY_DEV1E_REG_189 */
+#define DESCRAMBLER_CLEAR_EN           0x1
+
+/* Values of XTAL_FSEL_S */
+#define XTAL_40MHZ                     0
+#define XTAL_25MHZ                     1
+
+#define PLLGP_EN                       0x7820
+#define EN_COREPLL                     BIT(2)
+#define SW_CLKSW                       BIT(1)
+#define SW_PLLGP                       BIT(0)
+
+#define PLLGP_CR0                      0x78a8
+#define RG_COREPLL_EN                  BIT(22)
+#define RG_COREPLL_POSDIV_S            23
+#define RG_COREPLL_POSDIV_M            0x3800000
+#define RG_COREPLL_SDM_PCW_S           1
+#define RG_COREPLL_SDM_PCW_M           0x3ffffe
+#define RG_COREPLL_SDM_PCW_CHG         BIT(0)
+
+/* TOP Signals Status Register */
+#define TOP_SIG_SR                     0x780c
+#define PAD_DUAL_SGMII_EN              BIT(1)
+
+/* RGMII and SGMII PLL clock */
+#define ANA_PLLGP_CR2                  0x78b0
+#define ANA_PLLGP_CR5                  0x78bc
+
+/* GPIO mode define */
+#define GPIO_MODE_REGS(x)              (0x7c0c + (((x) / 8) * 4))
+#define GPIO_MODE_S                    4
+
+/* GPIO GROUP IOLB SMT0 Control */
+#define SMT0_IOLB                      0x7f04
+#define SMT_IOLB_5_SMI_MDC_EN          BIT(5)
+
+/* Unique fields of PMCR for MT7531 */
+#define FORCE_MODE_EEE1G               BIT(25)
+#define FORCE_MODE_EEE100              BIT(26)
+#define FORCE_MODE_TX_FC               BIT(27)
+#define FORCE_MODE_RX_FC               BIT(28)
+#define FORCE_MODE_DPX                 BIT(29)
+#define FORCE_MODE_SPD                 BIT(30)
+#define FORCE_MODE_LNK                 BIT(31)
+#define FORCE_MODE                     BIT(15)
+
+#define CHIP_REV                       0x781C
+#define CHIP_NAME_S                    16
+#define CHIP_NAME_M                    0xffff0000
+#define CHIP_REV_S                     0
+#define CHIP_REV_M                     0x0f
+#define CHIP_REV_E1                    0x0
+
+#define CLKGEN_CTRL                    0x7500
+#define CLK_SKEW_OUT_S                 8
+#define CLK_SKEW_OUT_M                 0x300
+#define CLK_SKEW_IN_S                  6
+#define CLK_SKEW_IN_M                  0xc0
+#define RXCLK_NO_DELAY                 BIT(5)
+#define TXCLK_NO_REVERSE               BIT(4)
+#define GP_MODE_S                      1
+#define GP_MODE_M                      0x06
+#define GP_CLK_EN                      BIT(0)
+
+/* Values of GP_MODE */
+#define GP_MODE_RGMII                  0
+#define GP_MODE_MII                    1
+#define GP_MODE_REV_MII                        2
+
+/* Values of CLK_SKEW_IN */
+#define CLK_SKEW_IN_NO_CHANGE          0
+#define CLK_SKEW_IN_DELAY_100PPS       1
+#define CLK_SKEW_IN_DELAY_200PPS       2
+#define CLK_SKEW_IN_REVERSE            3
+
+/* Values of CLK_SKEW_OUT */
+#define CLK_SKEW_OUT_NO_CHANGE         0
+#define CLK_SKEW_OUT_DELAY_100PPS      1
+#define CLK_SKEW_OUT_DELAY_200PPS      2
+#define CLK_SKEW_OUT_REVERSE           3
+
+/* Proprietory Control Register of Internal Phy device 0x1e */
+#define RXADC_CONTROL_3                        0xc2
+#define RXADC_LDO_CONTROL_2            0xd3
+
+/* Proprietory Control Register of Internal Phy device 0x1f */
+#define TXVLD_DA_271                   0x271
+#define TXVLD_DA_272                   0x272
+#define TXVLD_DA_273                   0x273
+
+/* DSP Channel and NOD_ADDR*/
+#define DSP_CH                         0x2
+#define DSP_NOD_ADDR                   0xD
+
+/* gpio pinmux pins and functions define */
+static int gpio_int_pins[] = {0};
+static int gpio_int_funcs[] = {1};
+static int gpio_mdc_pins[] = {11, 20};
+static int gpio_mdc_funcs[] = {2, 2};
+static int gpio_mdio_pins[] = {12, 21};
+static int gpio_mdio_funcs[] = {2, 2};
+
+static int mt7531_set_port_sgmii_force_mode(struct gsw_mt753x *gsw, u32 port,
+                                           struct mt753x_port_cfg *port_cfg)
+{
+       u32 speed, port_base, val;
+       ktime_t timeout;
+       u32 timeout_us;
+
+       if (port < 5 || port >= MT753X_NUM_PORTS) {
+               dev_info(gsw->dev, "port %d is not a SGMII port\n", port);
+               return -EINVAL;
+       }
+
+       port_base = port - 5;
+
+       switch (port_cfg->speed) {
+       case MAC_SPD_1000:
+               speed = RG_TPHY_SPEED_1000;
+               break;
+       case MAC_SPD_2500:
+               speed = RG_TPHY_SPEED_2500;
+               break;
+       default:
+               dev_info(gsw->dev, "invalid SGMII speed idx %d for port %d\n",
+                        port_cfg->speed, port);
+
+               speed = RG_TPHY_SPEED_1000;
+       }
+
+       /* Step 1: Speed select register setting */
+       val = mt753x_reg_read(gsw, PHYA_CTRL_SIGNAL3(port_base));
+       val &= ~RG_TPHY_SPEED_M;
+       val |= speed << RG_TPHY_SPEED_S;
+       mt753x_reg_write(gsw, PHYA_CTRL_SIGNAL3(port_base), val);
+
+       /* Step 2 : Disable AN */
+       val = mt753x_reg_read(gsw, PCS_CONTROL_1(port_base));
+       val &= ~SGMII_AN_ENABLE;
+       mt753x_reg_write(gsw, PCS_CONTROL_1(port_base), val);
+
+       /* Step 3: SGMII force mode setting */
+       val = mt753x_reg_read(gsw, SGMII_MODE(port_base));
+       val &= ~SGMII_IF_MODE_ADVERT_AN;
+       val &= ~SGMII_IF_MODE_FORCE_SPEED_M;
+       val |= SGMII_IF_MODE_FORCE_SPEED_1000 << SGMII_IF_MODE_FORCE_SPEED_S;
+       val |= SGMII_IF_MODE_FORCE_DUPLEX;
+       /* For sgmii force mode, 0 is full duplex and 1 is half duplex */
+       if (port_cfg->duplex)
+               val &= ~SGMII_IF_MODE_FORCE_DUPLEX;
+
+       mt753x_reg_write(gsw, SGMII_MODE(port_base), val);
+
+       /* Step 4: XXX: Disable Link partner's AN and set force mode */
+
+       /* Step 5: XXX: Special setting for PHYA ==> reserved for flexible */
+
+       /* Step 6 : Release PHYA power down state */
+       val = mt753x_reg_read(gsw, QPHY_PWR_STATE_CTRL(port_base));
+       val &= ~PHYA_PWD;
+       mt753x_reg_write(gsw, QPHY_PWR_STATE_CTRL(port_base), val);
+
+       /* Step 7 : Polling SGMII_LINK_STATUS */
+       timeout_us = 2000000;
+       timeout = ktime_add_us(ktime_get(), timeout_us);
+       while (1) {
+               val = mt753x_reg_read(gsw, PCS_CONTROL_1(port_base));
+               val &= SGMII_LINK_STATUS;
+
+               if (val)
+                       break;
+
+               if (ktime_compare(ktime_get(), timeout) > 0)
+                       return -ETIMEDOUT;
+       }
+
+       return 0;
+}
+
+static int mt7531_set_port_sgmii_an_mode(struct gsw_mt753x *gsw, u32 port,
+                                        struct mt753x_port_cfg *port_cfg)
+{
+       u32 speed, port_base, val;
+       ktime_t timeout;
+       u32 timeout_us;
+
+       if (port < 5 || port >= MT753X_NUM_PORTS) {
+               dev_info(gsw->dev, "port %d is not a SGMII port\n", port);
+               return -EINVAL;
+       }
+
+       port_base = port - 5;
+
+       switch (port_cfg->speed) {
+       case MAC_SPD_1000:
+               speed = RG_TPHY_SPEED_1000;
+               break;
+       case MAC_SPD_2500:
+               speed = RG_TPHY_SPEED_2500;
+               break;
+       default:
+               dev_info(gsw->dev, "invalid SGMII speed idx %d for port %d\n",
+                        port_cfg->speed, port);
+
+               speed = RG_TPHY_SPEED_1000;
+       }
+
+       /* Step 1: Speed select register setting */
+       val = mt753x_reg_read(gsw, PHYA_CTRL_SIGNAL3(port_base));
+       val &= ~RG_TPHY_SPEED_M;
+       val |= speed << RG_TPHY_SPEED_S;
+       mt753x_reg_write(gsw, PHYA_CTRL_SIGNAL3(port_base), val);
+
+       /* Step 2: Remote fault disable */
+       val = mt753x_reg_read(gsw, SGMII_MODE(port));
+       val |= SGMII_REMOTE_FAULT_DIS;
+       mt753x_reg_write(gsw, SGMII_MODE(port), val);
+
+       /* Step 3: Setting Link partner's AN enable = 1 */
+
+       /* Step 4: Setting Link partner's device ability for speed/duplex */
+
+       /* Step 5: AN re-start */
+       val = mt753x_reg_read(gsw, PCS_CONTROL_1(port));
+       val |= SGMII_AN_RESTART;
+       mt753x_reg_write(gsw, PCS_CONTROL_1(port), val);
+
+       /* Step 6: Special setting for PHYA ==> reserved for flexible */
+
+       /* Step 7 : Polling SGMII_LINK_STATUS */
+       timeout_us = 2000000;
+       timeout = ktime_add_us(ktime_get(), timeout_us);
+       while (1) {
+               val = mt753x_reg_read(gsw, PCS_CONTROL_1(port_base));
+               val &= SGMII_LINK_STATUS;
+
+               if (val)
+                       break;
+
+               if (ktime_compare(ktime_get(), timeout) > 0)
+                       return -ETIMEDOUT;
+       }
+
+       return 0;
+}
+
+static int mt7531_set_port_rgmii(struct gsw_mt753x *gsw, u32 port)
+{
+       u32 val;
+
+       if (port != 5) {
+               dev_info(gsw->dev, "RGMII mode is not available for port %d\n",
+                        port);
+               return -EINVAL;
+       }
+
+       val = mt753x_reg_read(gsw, CLKGEN_CTRL);
+       val |= GP_CLK_EN;
+       val &= ~GP_MODE_M;
+       val |= GP_MODE_RGMII << GP_MODE_S;
+       val |= TXCLK_NO_REVERSE;
+       val |= RXCLK_NO_DELAY;
+       val &= ~CLK_SKEW_IN_M;
+       val |= CLK_SKEW_IN_NO_CHANGE << CLK_SKEW_IN_S;
+       val &= ~CLK_SKEW_OUT_M;
+       val |= CLK_SKEW_OUT_NO_CHANGE << CLK_SKEW_OUT_S;
+       mt753x_reg_write(gsw, CLKGEN_CTRL, val);
+
+       return 0;
+}
+
+static int mt7531_mac_port_setup(struct gsw_mt753x *gsw, u32 port,
+                                struct mt753x_port_cfg *port_cfg)
+{
+       u32 pmcr;
+       u32 speed;
+
+       if (port < 5 || port >= MT753X_NUM_PORTS) {
+               dev_info(gsw->dev, "port %d is not a MAC port\n", port);
+               return -EINVAL;
+       }
+
+       if (port_cfg->enabled) {
+               pmcr = (IPG_96BIT_WITH_SHORT_IPG << IPG_CFG_S) |
+                      MAC_MODE | MAC_TX_EN | MAC_RX_EN |
+                      BKOFF_EN | BACKPR_EN;
+
+               if (port_cfg->force_link) {
+                       /* PMCR's speed field 0x11 is reserved,
+                        * sw should set 0x10
+                        */
+                       speed = port_cfg->speed;
+                       if (port_cfg->speed == MAC_SPD_2500)
+                               speed = MAC_SPD_1000;
+
+                       pmcr |= FORCE_MODE_LNK | FORCE_LINK |
+                               FORCE_MODE_SPD | FORCE_MODE_DPX |
+                               FORCE_MODE_RX_FC | FORCE_MODE_TX_FC |
+                               FORCE_RX_FC | FORCE_TX_FC |
+                               (speed << FORCE_SPD_S);
+
+                       if (port_cfg->duplex)
+                               pmcr |= FORCE_DPX;
+               }
+       } else {
+               pmcr = FORCE_MODE_LNK;
+       }
+
+       switch (port_cfg->phy_mode) {
+       case PHY_INTERFACE_MODE_RGMII:
+               mt7531_set_port_rgmii(gsw, port);
+               break;
+       case PHY_INTERFACE_MODE_SGMII:
+               if (port_cfg->force_link)
+                       mt7531_set_port_sgmii_force_mode(gsw, port, port_cfg);
+               else
+                       mt7531_set_port_sgmii_an_mode(gsw, port, port_cfg);
+               break;
+       default:
+               if (port_cfg->enabled)
+                       dev_info(gsw->dev, "%s is not supported by port %d\n",
+                                phy_modes(port_cfg->phy_mode), port);
+
+               pmcr = FORCE_MODE_LNK;
+       }
+
+       mt753x_reg_write(gsw, PMCR(port), pmcr);
+
+       return 0;
+}
+
+static void mt7531_core_pll_setup(struct gsw_mt753x *gsw)
+{
+       u32 hwstrap;
+       u32 val;
+
+       val = mt753x_reg_read(gsw, TOP_SIG_SR);
+       if (val & PAD_DUAL_SGMII_EN)
+               return;
+
+       hwstrap = mt753x_reg_read(gsw, HWSTRAP);
+
+       switch ((hwstrap & XTAL_FSEL_M) >> XTAL_FSEL_S) {
+       case XTAL_25MHZ:
+               /* Step 1 : Disable MT7531 COREPLL */
+               val = mt753x_reg_read(gsw, PLLGP_EN);
+               val &= ~EN_COREPLL;
+               mt753x_reg_write(gsw, PLLGP_EN, val);
+
+               /* Step 2: switch to XTAL output */
+               val = mt753x_reg_read(gsw, PLLGP_EN);
+               val |= SW_CLKSW;
+               mt753x_reg_write(gsw, PLLGP_EN, val);
+
+               val = mt753x_reg_read(gsw, PLLGP_CR0);
+               val &= ~RG_COREPLL_EN;
+               mt753x_reg_write(gsw, PLLGP_CR0, val);
+
+               /* Step 3: disable PLLGP and enable program PLLGP */
+               val = mt753x_reg_read(gsw, PLLGP_EN);
+               val |= SW_PLLGP;
+               mt753x_reg_write(gsw, PLLGP_EN, val);
+
+               /* Step 4: program COREPLL output frequency to 500MHz */
+               val = mt753x_reg_read(gsw, PLLGP_CR0);
+               val &= ~RG_COREPLL_POSDIV_M;
+               val |= 2 << RG_COREPLL_POSDIV_S;
+               mt753x_reg_write(gsw, PLLGP_CR0, val);
+               usleep_range(25, 35);
+
+               val = mt753x_reg_read(gsw, PLLGP_CR0);
+               val &= ~RG_COREPLL_SDM_PCW_M;
+               val |= 0x140000 << RG_COREPLL_SDM_PCW_S;
+               mt753x_reg_write(gsw, PLLGP_CR0, val);
+
+               /* Set feedback divide ratio update signal to high */
+               val = mt753x_reg_read(gsw, PLLGP_CR0);
+               val |= RG_COREPLL_SDM_PCW_CHG;
+               mt753x_reg_write(gsw, PLLGP_CR0, val);
+               /* Wait for at least 16 XTAL clocks */
+               usleep_range(10, 20);
+
+               /* Step 5: set feedback divide ratio update signal to low */
+               val = mt753x_reg_read(gsw, PLLGP_CR0);
+               val &= ~RG_COREPLL_SDM_PCW_CHG;
+               mt753x_reg_write(gsw, PLLGP_CR0, val);
+
+               /* Enable 325M clock for SGMII */
+               mt753x_reg_write(gsw, ANA_PLLGP_CR5, 0xad0000);
+
+               /* Enable 250SSC clock for RGMII */
+               mt753x_reg_write(gsw, ANA_PLLGP_CR2, 0x4f40000);
+
+               /* Step 6: Enable MT7531 PLL */
+               val = mt753x_reg_read(gsw, PLLGP_CR0);
+               val |= RG_COREPLL_EN;
+               mt753x_reg_write(gsw, PLLGP_CR0, val);
+
+               val = mt753x_reg_read(gsw, PLLGP_EN);
+               val |= EN_COREPLL;
+               mt753x_reg_write(gsw, PLLGP_EN, val);
+               usleep_range(25, 35);
+
+               break;
+       case XTAL_40MHZ:
+               /* Step 1 : Disable MT7531 COREPLL */
+               val = mt753x_reg_read(gsw, PLLGP_EN);
+               val &= ~EN_COREPLL;
+               mt753x_reg_write(gsw, PLLGP_EN, val);
+
+               /* Step 2: switch to XTAL output */
+               val = mt753x_reg_read(gsw, PLLGP_EN);
+               val |= SW_CLKSW;
+               mt753x_reg_write(gsw, PLLGP_EN, val);
+
+               val = mt753x_reg_read(gsw, PLLGP_CR0);
+               val &= ~RG_COREPLL_EN;
+               mt753x_reg_write(gsw, PLLGP_CR0, val);
+
+               /* Step 3: disable PLLGP and enable program PLLGP */
+               val = mt753x_reg_read(gsw, PLLGP_EN);
+               val |= SW_PLLGP;
+               mt753x_reg_write(gsw, PLLGP_EN, val);
+
+               /* Step 4: program COREPLL output frequency to 500MHz */
+               val = mt753x_reg_read(gsw, PLLGP_CR0);
+               val &= ~RG_COREPLL_POSDIV_M;
+               val |= 2 << RG_COREPLL_POSDIV_S;
+               mt753x_reg_write(gsw, PLLGP_CR0, val);
+               usleep_range(25, 35);
+
+               val = mt753x_reg_read(gsw, PLLGP_CR0);
+               val &= ~RG_COREPLL_SDM_PCW_M;
+               val |= 0x190000 << RG_COREPLL_SDM_PCW_S;
+               mt753x_reg_write(gsw, PLLGP_CR0, val);
+
+               /* Set feedback divide ratio update signal to high */
+               val = mt753x_reg_read(gsw, PLLGP_CR0);
+               val |= RG_COREPLL_SDM_PCW_CHG;
+               mt753x_reg_write(gsw, PLLGP_CR0, val);
+               /* Wait for at least 16 XTAL clocks */
+               usleep_range(10, 20);
+
+               /* Step 5: set feedback divide ratio update signal to low */
+               val = mt753x_reg_read(gsw, PLLGP_CR0);
+               val &= ~RG_COREPLL_SDM_PCW_CHG;
+               mt753x_reg_write(gsw, PLLGP_CR0, val);
+
+               /* Enable 325M clock for SGMII */
+               mt753x_reg_write(gsw, ANA_PLLGP_CR5, 0xad0000);
+
+               /* Enable 250SSC clock for RGMII */
+               mt753x_reg_write(gsw, ANA_PLLGP_CR2, 0x4f40000);
+
+               /* Step 6: Enable MT7531 PLL */
+               val = mt753x_reg_read(gsw, PLLGP_CR0);
+               val |= RG_COREPLL_EN;
+               mt753x_reg_write(gsw, PLLGP_CR0, val);
+
+               val = mt753x_reg_read(gsw, PLLGP_EN);
+               val |= EN_COREPLL;
+               mt753x_reg_write(gsw, PLLGP_EN, val);
+               usleep_range(25, 35);
+               break;
+       }
+}
+
+static int mt7531_internal_phy_calibration(struct gsw_mt753x *gsw)
+{
+       return 0;
+}
+
+static int mt7531_sw_detect(struct gsw_mt753x *gsw, struct chip_rev *crev)
+{
+       u32 rev, topsig;
+
+       rev = mt753x_reg_read(gsw, CHIP_REV);
+
+       if (((rev & CHIP_NAME_M) >> CHIP_NAME_S) == MT7531) {
+               if (crev) {
+                       topsig = mt753x_reg_read(gsw, TOP_SIG_SR);
+
+                       crev->rev = rev & CHIP_REV_M;
+                       crev->name = topsig & PAD_DUAL_SGMII_EN ?
+                                    "MT7531AE" : "MT7531BE";
+               }
+
+               return 0;
+       }
+
+       return -ENODEV;
+}
+
+static void pinmux_set_mux_7531(struct gsw_mt753x *gsw, u32 pin, u32 mode)
+{
+       u32 val;
+
+       val = mt753x_reg_read(gsw, GPIO_MODE_REGS(pin));
+       val &= ~(0xf << (pin & 7) * GPIO_MODE_S);
+       val |= mode << (pin & 7) * GPIO_MODE_S;
+       mt753x_reg_write(gsw, GPIO_MODE_REGS(pin), val);
+}
+
+static int mt7531_set_gpio_pinmux(struct gsw_mt753x *gsw)
+{
+       u32 group = 0;
+       struct device_node *np = gsw->dev->of_node;
+
+       /* Set GPIO 0 interrupt mode */
+       pinmux_set_mux_7531(gsw, gpio_int_pins[0], gpio_int_funcs[0]);
+
+       of_property_read_u32(np, "mediatek,mdio_master_pinmux", &group);
+
+       /* group = 0: do nothing, 1: 1st group (AE), 2: 2nd group (BE) */
+       if (group > 0 && group <= 2) {
+               group--;
+               pinmux_set_mux_7531(gsw, gpio_mdc_pins[group],
+                                   gpio_mdc_funcs[group]);
+               pinmux_set_mux_7531(gsw, gpio_mdio_pins[group],
+                                   gpio_mdio_funcs[group]);
+       }
+
+       return 0;
+}
+
+static void mt7531_phy_pll_setup(struct gsw_mt753x *gsw)
+{
+       u32 hwstrap;
+       u32 val;
+
+       hwstrap = mt753x_reg_read(gsw, HWSTRAP);
+
+       switch ((hwstrap & XTAL_FSEL_M) >> XTAL_FSEL_S) {
+       case XTAL_25MHZ:
+               /* disable pll auto calibration */
+               gsw->mmd_write(gsw, 0, PHY_DEV1F, PHY_DEV1F_REG_104, 0x608);
+
+               /* change pll sel */
+               val = gsw->mmd_read(gsw, 0, PHY_DEV1F,
+                                    PHY_DEV1F_REG_403);
+               val &= ~(PHY_PLL_M);
+               val |= PHY_PLL_SEL(3);
+               gsw->mmd_write(gsw, 0, PHY_DEV1F, PHY_DEV1F_REG_403, val);
+
+               /* set divider ratio */
+               gsw->mmd_write(gsw, 0, PHY_DEV1F,
+                              PHY_DEV1F_REG_10A, 0x1009);
+
+               /* set divider ratio */
+               gsw->mmd_write(gsw, 0, PHY_DEV1F, PHY_DEV1F_REG_10B, 0x7c6);
+
+               /* capacitance and resistance adjustment */
+               gsw->mmd_write(gsw, 0, PHY_DEV1F,
+                              PHY_DEV1F_REG_10C, 0xa8be);
+
+               break;
+       case XTAL_40MHZ:
+               /* disable pll auto calibration */
+               gsw->mmd_write(gsw, 0, PHY_DEV1F, PHY_DEV1F_REG_104, 0x608);
+
+               /* change pll sel */
+               val = gsw->mmd_read(gsw, 0, PHY_DEV1F,
+                                    PHY_DEV1F_REG_403);
+               val &= ~(PHY_PLL_M);
+               val |= PHY_PLL_SEL(3);
+               gsw->mmd_write(gsw, 0, PHY_DEV1F, PHY_DEV1F_REG_403, val);
+
+               /* set divider ratio */
+               gsw->mmd_write(gsw, 0, PHY_DEV1F,
+                              PHY_DEV1F_REG_10A, 0x1018);
+
+               /* set divider ratio */
+               gsw->mmd_write(gsw, 0, PHY_DEV1F, PHY_DEV1F_REG_10B, 0xc676);
+
+               /* capacitance and resistance adjustment */
+               gsw->mmd_write(gsw, 0, PHY_DEV1F,
+                              PHY_DEV1F_REG_10C, 0xd8be);
+               break;
+       }
+
+       /* power down pll. additional delay is not required via mdio access */
+       gsw->mmd_write(gsw, 0, PHY_DEV1F, PHY_DEV1F_REG_10D, 0x10);
+
+       /* power up pll */
+       gsw->mmd_write(gsw, 0, PHY_DEV1F, PHY_DEV1F_REG_10D, 0x14);
+}
+
+static void mt7531_phy_setting(struct gsw_mt753x *gsw)
+{
+       int i;
+       u32 val;
+
+       /* Adjust DAC TX Delay */
+       gsw->mmd_write(gsw, 0, PHY_DEV1F, PHY_DEV1F_REG_44, 0xc0);
+
+       for (i = 0; i < MT753X_NUM_PHYS; i++) {
+               /* Disable EEE */
+               gsw->mmd_write(gsw, i, PHY_DEV07, PHY_DEV07_REG_03C, 0);
+
+               /* Enable HW auto downshift */
+               gsw->mii_write(gsw, i, 0x1f, 0x1);
+               val = gsw->mii_read(gsw, i, PHY_EXT_REG_14);
+               val |= PHY_EN_DOWN_SHFIT;
+               gsw->mii_write(gsw, i, PHY_EXT_REG_14, val);
+
+               /* Increase SlvDPSready time */
+               gsw->mii_write(gsw, i, 0x1f, 0x52b5);
+               gsw->mii_write(gsw, i, PHY_TR_REG_10, 0xafae);
+               gsw->mii_write(gsw, i, PHY_TR_REG_12, 0x2f);
+               gsw->mii_write(gsw, i, PHY_TR_REG_10, 0x8fae);
+               gsw->mii_write(gsw, i, 0x1f, 0);
+
+               /* Adjust 100_mse_threshold */
+               gsw->mmd_write(gsw, i, PHY_DEV1E, PHY_DEV1E_REG_123, 0xffff);
+
+               /* Disable mcc */
+               gsw->mmd_write(gsw, i, PHY_DEV1E, PHY_DEV1E_REG_A6, 0x300);
+
+               /* PHY link down power saving enable */
+               val = gsw->mii_read(gsw, i, PHY_EXT_REG_17);
+               val |= PHY_LINKDOWN_POWER_SAVING_EN;
+               gsw->mii_write(gsw, i, PHY_EXT_REG_17, val);
+
+               val = gsw->mmd_read(gsw, i, PHY_DEV1E, PHY_DEV1E_REG_0C6);
+               val &= ~PHY_POWER_SAVING_M;
+               val |= PHY_POWER_SAVING_TX << PHY_POWER_SAVING_S;
+               gsw->mmd_write(gsw, i, PHY_DEV1E, PHY_DEV1E_REG_0C6, val);
+
+               /* Set TX Pair delay selection */
+               gsw->mmd_write(gsw, i, PHY_DEV1E, PHY_DEV1E_REG_13, 0x404);
+               gsw->mmd_write(gsw, i, PHY_DEV1E, PHY_DEV1E_REG_14, 0x404);
+       }
+}
+
+static void mt7531_adjust_line_driving(struct gsw_mt753x *gsw, u32 port)
+{
+       /* For ADC timing margin window for LDO calibration */
+       gsw->mmd_write(gsw, port, PHY_DEV1E, RXADC_LDO_CONTROL_2, 0x2222);
+
+       /* Adjust AD sample timing */
+       gsw->mmd_write(gsw, port, PHY_DEV1E, RXADC_CONTROL_3, 0x4444);
+
+       /* Adjust Line driver current for different mode */
+       gsw->mmd_write(gsw, port, PHY_DEV1F, TXVLD_DA_271, 0x2ca5);
+
+       /* Adjust Line driver current for different mode */
+       gsw->mmd_write(gsw, port, PHY_DEV1F, TXVLD_DA_272, 0xc6b);
+
+       /* Adjust Line driver amplitude for 10BT */
+       gsw->mmd_write(gsw, port, PHY_DEV1F, TXVLD_DA_273, 0x3000);
+
+       /* Adjust RX Echo path filter */
+       gsw->mmd_write(gsw, port, PHY_DEV1E, PHY_DEV1E_REG_0FE, 0x2);
+
+       /* Adjust RX HVGA bias current */
+       gsw->mmd_write(gsw, port, PHY_DEV1E, PHY_DEV1E_REG_41, 0x3333);
+
+       /* Adjust TX class AB driver 1 */
+       gsw->mmd_write(gsw, port, PHY_DEV1F, PHY_DEV1F_REG_268, 0x388);
+
+       /* Adjust TX class AB driver 2 */
+       gsw->mmd_write(gsw, port, PHY_DEV1F, PHY_DEV1F_REG_269, 0x4448);
+}
+
+static void mt7531_eee_setting(struct gsw_mt753x *gsw, u32 port)
+{
+       u32 tr_reg_control;
+       u32 val;
+
+       /* Disable generate signal to clear the scramble_lock when lpi mode */
+       val = gsw->mmd_read(gsw, port, PHY_DEV1E, PHY_DEV1E_REG_189);
+       val &= ~DESCRAMBLER_CLEAR_EN;
+       gsw->mmd_write(gsw, port, PHY_DEV1E, PHY_DEV1E_REG_189, val);
+
+       /* roll back CR*/
+       gsw->mii_write(gsw, port, 0x1f, 0x52b5);
+       gsw->mmd_write(gsw, port, 0x1e, 0x2d1, 0);
+       tr_reg_control = (1 << 15) | (0 << 13) | (DSP_CH << 11) |
+                        (DSP_NOD_ADDR << 7) | (0x8 << 1);
+       gsw->mii_write(gsw, port, 17, 0x1b);
+       gsw->mii_write(gsw, port, 18, 0);
+       gsw->mii_write(gsw, port, 16, tr_reg_control);
+       tr_reg_control = (1 << 15) | (0 << 13) | (DSP_CH << 11) |
+                        (DSP_NOD_ADDR << 7) | (0xf << 1);
+       gsw->mii_write(gsw, port, 17, 0);
+       gsw->mii_write(gsw, port, 18, 0);
+       gsw->mii_write(gsw, port, 16, tr_reg_control);
+
+       tr_reg_control = (1 << 15) | (0 << 13) | (DSP_CH << 11) |
+                        (DSP_NOD_ADDR << 7) | (0x10 << 1);
+       gsw->mii_write(gsw, port, 17, 0x500);
+       gsw->mii_write(gsw, port, 18, 0);
+       gsw->mii_write(gsw, port, 16, tr_reg_control);
+       gsw->mii_write(gsw, port, 0x1f, 0);
+}
+
+static int mt7531_sw_init(struct gsw_mt753x *gsw)
+{
+       int i;
+       u32 val;
+
+       gsw->phy_base = (gsw->smi_addr + 1) & MT753X_SMI_ADDR_MASK;
+
+       gsw->mii_read = mt753x_mii_read;
+       gsw->mii_write = mt753x_mii_write;
+       gsw->mmd_read = mt753x_mmd_read;
+       gsw->mmd_write = mt753x_mmd_write;
+
+       for (i = 0; i < MT753X_NUM_PHYS; i++) {
+               val = gsw->mii_read(gsw, i, MII_BMCR);
+               val |= BMCR_ISOLATE;
+               gsw->mii_write(gsw, i, MII_BMCR, val);
+       }
+
+       /* Force MAC link down before reset */
+       mt753x_reg_write(gsw, PMCR(5), FORCE_MODE_LNK);
+       mt753x_reg_write(gsw, PMCR(6), FORCE_MODE_LNK);
+
+       /* Switch soft reset */
+       mt753x_reg_write(gsw, SYS_CTRL, SW_SYS_RST | SW_REG_RST);
+       usleep_range(10, 20);
+
+       /* Enable MDC input Schmitt Trigger */
+       val = mt753x_reg_read(gsw, SMT0_IOLB);
+       mt753x_reg_write(gsw, SMT0_IOLB, val | SMT_IOLB_5_SMI_MDC_EN);
+
+       /* Set 7531 gpio pinmux */
+       mt7531_set_gpio_pinmux(gsw);
+
+       /* Global mac control settings */
+       mt753x_reg_write(gsw, GMACCR,
+                        (15 << MTCC_LMT_S) | (11 << MAX_RX_JUMBO_S) |
+                        RX_PKT_LEN_MAX_JUMBO);
+
+       mt7531_core_pll_setup(gsw);
+       mt7531_mac_port_setup(gsw, 5, &gsw->port5_cfg);
+       mt7531_mac_port_setup(gsw, 6, &gsw->port6_cfg);
+
+       return 0;
+}
+
+static int mt7531_sw_post_init(struct gsw_mt753x *gsw)
+{
+       int i;
+       u32 val;
+
+       mt7531_phy_pll_setup(gsw);
+
+       /* Internal PHYs are disabled by default. SW should enable them.
+        * Note that this may already be enabled in bootloader stage.
+        */
+       val = gsw->mmd_read(gsw, 0, PHY_DEV1F, PHY_DEV1F_REG_403);
+       val |= PHY_EN_BYPASS_MODE;
+       val &= ~POWER_ON_OFF;
+       gsw->mmd_write(gsw, 0, PHY_DEV1F, PHY_DEV1F_REG_403, val);
+
+       mt7531_phy_setting(gsw);
+
+       for (i = 0; i < MT753X_NUM_PHYS; i++) {
+               val = gsw->mii_read(gsw, i, MII_BMCR);
+               val &= ~BMCR_ISOLATE;
+               gsw->mii_write(gsw, i, MII_BMCR, val);
+       }
+
+       for (i = 0; i < MT753X_NUM_PHYS; i++)
+               mt7531_adjust_line_driving(gsw, i);
+
+       for (i = 0; i < MT753X_NUM_PHYS; i++)
+               mt7531_eee_setting(gsw, i);
+
+       val = mt753x_reg_read(gsw, CHIP_REV);
+       val &= CHIP_REV_M;
+       if (val == CHIP_REV_E1) {
+               mt7531_internal_phy_calibration(gsw);
+       } else {
+               val = mt753x_reg_read(gsw, GBE_EFUSE);
+               if (val & GBE_SEL_EFUSE_EN) {
+                       val = gsw->mmd_read(gsw, 0, PHY_DEV1F,
+                                           PHY_DEV1F_REG_403);
+                       val &= ~GBE_EFUSE_SETTING;
+                       gsw->mmd_write(gsw, 0, PHY_DEV1F, PHY_DEV1F_REG_403,
+                                      val);
+               } else {
+                       mt7531_internal_phy_calibration(gsw);
+               }
+       }
+
+       return 0;
+}
+
+struct mt753x_sw_id mt7531_id = {
+       .model = MT7531,
+       .detect = mt7531_sw_detect,
+       .init = mt7531_sw_init,
+       .post_init = mt7531_sw_post_init
+};
+
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Zhanguo Ju <zhanguo.ju@mediatek.com>");
+MODULE_DESCRIPTION("Driver for MediaTek MT753x Gigabit Switch");
diff --git a/target/linux/mediatek/files-5.4/drivers/net/phy/mtk/mt753x/mt7531.h b/target/linux/mediatek/files-5.4/drivers/net/phy/mtk/mt753x/mt7531.h
new file mode 100644 (file)
index 0000000..e4ef81e
--- /dev/null
@@ -0,0 +1,13 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (c) 2018 MediaTek Inc.
+ */
+
+#ifndef _MT7531_H_
+#define _MT7531_H_
+
+#include "mt753x.h"
+
+extern struct mt753x_sw_id mt7531_id;
+
+#endif /* _MT7531_H_ */
diff --git a/target/linux/mediatek/files-5.4/drivers/net/phy/mtk/mt753x/mt753x.h b/target/linux/mediatek/files-5.4/drivers/net/phy/mtk/mt753x/mt753x.h
new file mode 100644 (file)
index 0000000..317b31d
--- /dev/null
@@ -0,0 +1,213 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (c) 2018 MediaTek Inc.
+ * Author: Weijie Gao <weijie.gao@mediatek.com>
+ */
+
+#ifndef _MT753X_H_
+#define _MT753X_H_
+
+#include <linux/list.h>
+#include <linux/mutex.h>
+#include <linux/netdevice.h>
+#include <linux/of_mdio.h>
+#include <linux/workqueue.h>
+#include <linux/gpio/consumer.h>
+
+#ifdef CONFIG_SWCONFIG
+#include <linux/switch.h>
+#endif
+
+#include "mt753x_vlan.h"
+
+#define MT753X_DFL_CPU_PORT    6
+#define MT753X_NUM_PHYS                5
+
+#define MT753X_DFL_SMI_ADDR    0x1f
+#define MT753X_SMI_ADDR_MASK   0x1f
+
+struct gsw_mt753x;
+
+enum mt753x_model {
+       MT7530 = 0x7530,
+       MT7531 = 0x7531
+};
+
+struct mt753x_port_cfg {
+       struct device_node *np;
+       int phy_mode;
+       u32 enabled: 1;
+       u32 force_link: 1;
+       u32 speed: 2;
+       u32 duplex: 1;
+};
+
+struct mt753x_phy {
+       struct gsw_mt753x *gsw;
+       struct net_device netdev;
+       struct phy_device *phydev;
+};
+
+struct gsw_mt753x {
+       u32 id;
+
+       struct device *dev;
+       struct mii_bus *host_bus;
+       struct mii_bus *gphy_bus;
+       struct mutex mii_lock;  /* MII access lock */
+       u32 smi_addr;
+       u32 phy_base;
+       int direct_phy_access;
+
+       enum mt753x_model model;
+       const char *name;
+
+       struct mt753x_port_cfg port5_cfg;
+       struct mt753x_port_cfg port6_cfg;
+
+       int phy_status_poll;
+       struct mt753x_phy phys[MT753X_NUM_PHYS];
+
+       int phy_link_sts;
+
+       int irq;
+       int reset_pin;
+       struct work_struct irq_worker;
+
+#ifdef CONFIG_SWCONFIG
+       struct switch_dev swdev;
+       u32 cpu_port;
+#endif
+
+       int global_vlan_enable;
+       struct mt753x_vlan_entry vlan_entries[MT753X_NUM_VLANS];
+       struct mt753x_port_entry port_entries[MT753X_NUM_PORTS];
+
+       int (*mii_read)(struct gsw_mt753x *gsw, int phy, int reg);
+       void (*mii_write)(struct gsw_mt753x *gsw, int phy, int reg, u16 val);
+
+       int (*mmd_read)(struct gsw_mt753x *gsw, int addr, int devad, u16 reg);
+       void (*mmd_write)(struct gsw_mt753x *gsw, int addr, int devad, u16 reg,
+                         u16 val);
+
+       struct list_head list;
+};
+
+struct chip_rev {
+       const char *name;
+       u32 rev;
+};
+
+struct mt753x_sw_id {
+       enum mt753x_model model;
+       int (*detect)(struct gsw_mt753x *gsw, struct chip_rev *crev);
+       int (*init)(struct gsw_mt753x *gsw);
+       int (*post_init)(struct gsw_mt753x *gsw);
+};
+
+extern struct list_head mt753x_devs;
+
+struct gsw_mt753x *mt753x_get_gsw(u32 id);
+struct gsw_mt753x *mt753x_get_first_gsw(void);
+void mt753x_put_gsw(void);
+void mt753x_lock_gsw(void);
+
+u32 mt753x_reg_read(struct gsw_mt753x *gsw, u32 reg);
+void mt753x_reg_write(struct gsw_mt753x *gsw, u32 reg, u32 val);
+
+int mt753x_mii_read(struct gsw_mt753x *gsw, int phy, int reg);
+void mt753x_mii_write(struct gsw_mt753x *gsw, int phy, int reg, u16 val);
+
+int mt753x_mmd_read(struct gsw_mt753x *gsw, int addr, int devad, u16 reg);
+void mt753x_mmd_write(struct gsw_mt753x *gsw, int addr, int devad, u16 reg,
+                     u16 val);
+
+int mt753x_mmd_ind_read(struct gsw_mt753x *gsw, int addr, int devad, u16 reg);
+void mt753x_mmd_ind_write(struct gsw_mt753x *gsw, int addr, int devad, u16 reg,
+                         u16 val);
+
+void mt753x_irq_worker(struct work_struct *work);
+void mt753x_irq_enable(struct gsw_mt753x *gsw);
+
+/* MDIO Indirect Access Registers */
+#define MII_MMD_ACC_CTL_REG            0x0d
+#define MMD_CMD_S                      14
+#define MMD_CMD_M                      0xc000
+#define MMD_DEVAD_S                    0
+#define MMD_DEVAD_M                    0x1f
+
+/* MMD_CMD: MMD commands */
+#define MMD_ADDR                       0
+#define MMD_DATA                       1
+
+#define MII_MMD_ADDR_DATA_REG          0x0e
+
+/* Procedure of MT753x Internal Register Access
+ *
+ * 1. Internal Register Address
+ *
+ *    The MT753x has a 16-bit register address and each register is 32-bit.
+ *    This means the lowest two bits are not used as the register address is
+ *    4-byte aligned.
+ *
+ *    Rest of the valid bits are divided into two parts:
+ *      Bit 15..6 is the Page address
+ *      Bit 5..2 is the low address
+ *
+ *    -------------------------------------------------------------------
+ *    | 15  14  13  12  11  10   9   8   7   6 | 5   4   3   2 | 1   0  |
+ *    |----------------------------------------|---------------|--------|
+ *    |              Page Address              |    Address    | Unused |
+ *    -------------------------------------------------------------------
+ *
+ * 2. MDIO access timing
+ *
+ *    The MT753x uses the following MDIO timing for a single register read
+ *
+ *      Phase 1: Write Page Address
+ *    -------------------------------------------------------------------
+ *    | ST | OP | PHY_ADDR | TYPE | RSVD | TA |  RSVD |    PAGE_ADDR    |
+ *    -------------------------------------------------------------------
+ *    | 01 | 01 |   11111  |   1  | 1111 | xx | 00000 | REG_ADDR[15..6] |
+ *    -------------------------------------------------------------------
+ *
+ *      Phase 2: Write low Address & Read low word
+ *    -------------------------------------------------------------------
+ *    | ST | OP | PHY_ADDR | TYPE |    LOW_ADDR    | TA |      DATA     |
+ *    -------------------------------------------------------------------
+ *    | 01 | 10 |   11111  |   0  | REG_ADDR[5..2] | xx |  DATA[15..0]  |
+ *    -------------------------------------------------------------------
+ *
+ *      Phase 3: Read high word
+ *    -------------------------------------------------------------------
+ *    | ST | OP | PHY_ADDR | TYPE | RSVD | TA |           DATA          |
+ *    -------------------------------------------------------------------
+ *    | 01 | 10 |   11111  |   1  | 0000 | xx |       DATA[31..16]      |
+ *    -------------------------------------------------------------------
+ *
+ *    The MT753x uses the following MDIO timing for a single register write
+ *
+ *      Phase 1: Write Page Address (The same as read)
+ *
+ *      Phase 2: Write low Address and low word
+ *    -------------------------------------------------------------------
+ *    | ST | OP | PHY_ADDR | TYPE |    LOW_ADDR    | TA |      DATA     |
+ *    -------------------------------------------------------------------
+ *    | 01 | 01 |   11111  |   0  | REG_ADDR[5..2] | xx |  DATA[15..0]  |
+ *    -------------------------------------------------------------------
+ *
+ *      Phase 3: write high word
+ *    -------------------------------------------------------------------
+ *    | ST | OP | PHY_ADDR | TYPE | RSVD | TA |           DATA          |
+ *    -------------------------------------------------------------------
+ *    | 01 | 01 |   11111  |   1  | 0000 | xx |       DATA[31..16]      |
+ *    -------------------------------------------------------------------
+ *
+ */
+
+/* Internal Register Address fields */
+#define MT753X_REG_PAGE_ADDR_S         6
+#define MT753X_REG_PAGE_ADDR_M         0xffc0
+#define MT753X_REG_ADDR_S              2
+#define MT753X_REG_ADDR_M              0x3c
+#endif /* _MT753X_H_ */
diff --git a/target/linux/mediatek/files-5.4/drivers/net/phy/mtk/mt753x/mt753x_common.c b/target/linux/mediatek/files-5.4/drivers/net/phy/mtk/mt753x/mt753x_common.c
new file mode 100644 (file)
index 0000000..18f9259
--- /dev/null
@@ -0,0 +1,90 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (c) 2018 MediaTek Inc.
+ * Author: Weijie Gao <weijie.gao@mediatek.com>
+ */
+
+#include <linux/kernel.h>
+#include <linux/delay.h>
+
+#include "mt753x.h"
+#include "mt753x_regs.h"
+
+void mt753x_irq_enable(struct gsw_mt753x *gsw)
+{
+       u32 val;
+       int i;
+
+       /* Record initial PHY link status */
+       for (i = 0; i < MT753X_NUM_PHYS; i++) {
+               val = gsw->mii_read(gsw, i, MII_BMSR);
+               if (val & BMSR_LSTATUS)
+                       gsw->phy_link_sts |= BIT(i);
+       }
+
+       val = BIT(MT753X_NUM_PHYS) - 1;
+
+       mt753x_reg_write(gsw, SYS_INT_EN, val);
+}
+
+static void display_port_link_status(struct gsw_mt753x *gsw, u32 port)
+{
+       u32 pmsr, speed_bits;
+       const char *speed;
+
+       pmsr = mt753x_reg_read(gsw, PMSR(port));
+
+       speed_bits = (pmsr & MAC_SPD_STS_M) >> MAC_SPD_STS_S;
+
+       switch (speed_bits) {
+       case MAC_SPD_10:
+               speed = "10Mbps";
+               break;
+       case MAC_SPD_100:
+               speed = "100Mbps";
+               break;
+       case MAC_SPD_1000:
+               speed = "1Gbps";
+               break;
+       case MAC_SPD_2500:
+               speed = "2.5Gbps";
+               break;
+       }
+
+       if (pmsr & MAC_LNK_STS) {
+               dev_info(gsw->dev, "Port %d Link is Up - %s/%s\n",
+                        port, speed, (pmsr & MAC_DPX_STS) ? "Full" : "Half");
+       } else {
+               dev_info(gsw->dev, "Port %d Link is Down\n", port);
+       }
+}
+
+void mt753x_irq_worker(struct work_struct *work)
+{
+       struct gsw_mt753x *gsw;
+       u32 sts, physts, laststs;
+       int i;
+
+       gsw = container_of(work, struct gsw_mt753x, irq_worker);
+
+       sts = mt753x_reg_read(gsw, SYS_INT_STS);
+
+       /* Check for changed PHY link status */
+       for (i = 0; i < MT753X_NUM_PHYS; i++) {
+               if (!(sts & PHY_LC_INT(i)))
+                       continue;
+
+               laststs = gsw->phy_link_sts & BIT(i);
+               physts = !!(gsw->mii_read(gsw, i, MII_BMSR) & BMSR_LSTATUS);
+               physts <<= i;
+
+               if (physts ^ laststs) {
+                       gsw->phy_link_sts ^= BIT(i);
+                       display_port_link_status(gsw, i);
+               }
+       }
+
+       mt753x_reg_write(gsw, SYS_INT_STS, sts);
+
+       enable_irq(gsw->irq);
+}
diff --git a/target/linux/mediatek/files-5.4/drivers/net/phy/mtk/mt753x/mt753x_mdio.c b/target/linux/mediatek/files-5.4/drivers/net/phy/mtk/mt753x/mt753x_mdio.c
new file mode 100644 (file)
index 0000000..8a9a45c
--- /dev/null
@@ -0,0 +1,598 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (c) 2018 MediaTek Inc.
+ * Author: Weijie Gao <weijie.gao@mediatek.com>
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/device.h>
+#include <linux/delay.h>
+#include <linux/reset.h>
+#include <linux/hrtimer.h>
+#include <linux/mii.h>
+#include <linux/of_mdio.h>
+#include <linux/of_platform.h>
+#include <linux/of_gpio.h>
+#include <linux/of_net.h>
+#include <linux/of_irq.h>
+#include <linux/phy.h>
+
+#include "mt753x.h"
+#include "mt753x_swconfig.h"
+#include "mt753x_regs.h"
+#include "mt753x_nl.h"
+#include "mt7530.h"
+#include "mt7531.h"
+
+static u32 mt753x_id;
+struct list_head mt753x_devs;
+static DEFINE_MUTEX(mt753x_devs_lock);
+
+static struct mt753x_sw_id *mt753x_sw_ids[] = {
+       &mt7530_id,
+       &mt7531_id,
+};
+
+u32 mt753x_reg_read(struct gsw_mt753x *gsw, u32 reg)
+{
+       u32 high, low;
+
+       mutex_lock(&gsw->host_bus->mdio_lock);
+
+       gsw->host_bus->write(gsw->host_bus, gsw->smi_addr, 0x1f,
+               (reg & MT753X_REG_PAGE_ADDR_M) >> MT753X_REG_PAGE_ADDR_S);
+
+       low = gsw->host_bus->read(gsw->host_bus, gsw->smi_addr,
+               (reg & MT753X_REG_ADDR_M) >> MT753X_REG_ADDR_S);
+
+       high = gsw->host_bus->read(gsw->host_bus, gsw->smi_addr, 0x10);
+
+       mutex_unlock(&gsw->host_bus->mdio_lock);
+
+       return (high << 16) | (low & 0xffff);
+}
+
+void mt753x_reg_write(struct gsw_mt753x *gsw, u32 reg, u32 val)
+{
+       mutex_lock(&gsw->host_bus->mdio_lock);
+
+       gsw->host_bus->write(gsw->host_bus, gsw->smi_addr, 0x1f,
+               (reg & MT753X_REG_PAGE_ADDR_M) >> MT753X_REG_PAGE_ADDR_S);
+
+       gsw->host_bus->write(gsw->host_bus, gsw->smi_addr,
+               (reg & MT753X_REG_ADDR_M) >> MT753X_REG_ADDR_S, val & 0xffff);
+
+       gsw->host_bus->write(gsw->host_bus, gsw->smi_addr, 0x10, val >> 16);
+
+       mutex_unlock(&gsw->host_bus->mdio_lock);
+}
+
+/* Indirect MDIO clause 22/45 access */
+static int mt753x_mii_rw(struct gsw_mt753x *gsw, int phy, int reg, u16 data,
+                        u32 cmd, u32 st)
+{
+       ktime_t timeout;
+       u32 val, timeout_us;
+       int ret = 0;
+
+       timeout_us = 100000;
+       timeout = ktime_add_us(ktime_get(), timeout_us);
+       while (1) {
+               val = mt753x_reg_read(gsw, PHY_IAC);
+
+               if ((val & PHY_ACS_ST) == 0)
+                       break;
+
+               if (ktime_compare(ktime_get(), timeout) > 0)
+                       return -ETIMEDOUT;
+       }
+
+       val = (st << MDIO_ST_S) |
+             ((cmd << MDIO_CMD_S) & MDIO_CMD_M) |
+             ((phy << MDIO_PHY_ADDR_S) & MDIO_PHY_ADDR_M) |
+             ((reg << MDIO_REG_ADDR_S) & MDIO_REG_ADDR_M);
+
+       if (cmd == MDIO_CMD_WRITE || cmd == MDIO_CMD_ADDR)
+               val |= data & MDIO_RW_DATA_M;
+
+       mt753x_reg_write(gsw, PHY_IAC, val | PHY_ACS_ST);
+
+       timeout_us = 100000;
+       timeout = ktime_add_us(ktime_get(), timeout_us);
+       while (1) {
+               val = mt753x_reg_read(gsw, PHY_IAC);
+
+               if ((val & PHY_ACS_ST) == 0)
+                       break;
+
+               if (ktime_compare(ktime_get(), timeout) > 0)
+                       return -ETIMEDOUT;
+       }
+
+       if (cmd == MDIO_CMD_READ || cmd == MDIO_CMD_READ_C45) {
+               val = mt753x_reg_read(gsw, PHY_IAC);
+               ret = val & MDIO_RW_DATA_M;
+       }
+
+       return ret;
+}
+
+int mt753x_mii_read(struct gsw_mt753x *gsw, int phy, int reg)
+{
+       int val;
+
+       if (phy < MT753X_NUM_PHYS)
+               phy = (gsw->phy_base + phy) & MT753X_SMI_ADDR_MASK;
+
+       mutex_lock(&gsw->mii_lock);
+       val = mt753x_mii_rw(gsw, phy, reg, 0, MDIO_CMD_READ, MDIO_ST_C22);
+       mutex_unlock(&gsw->mii_lock);
+
+       return val;
+}
+
+void mt753x_mii_write(struct gsw_mt753x *gsw, int phy, int reg, u16 val)
+{
+       if (phy < MT753X_NUM_PHYS)
+               phy = (gsw->phy_base + phy) & MT753X_SMI_ADDR_MASK;
+
+       mutex_lock(&gsw->mii_lock);
+       mt753x_mii_rw(gsw, phy, reg, val, MDIO_CMD_WRITE, MDIO_ST_C22);
+       mutex_unlock(&gsw->mii_lock);
+}
+
+int mt753x_mmd_read(struct gsw_mt753x *gsw, int addr, int devad, u16 reg)
+{
+       int val;
+
+       if (addr < MT753X_NUM_PHYS)
+               addr = (gsw->phy_base + addr) & MT753X_SMI_ADDR_MASK;
+
+       mutex_lock(&gsw->mii_lock);
+       mt753x_mii_rw(gsw, addr, devad, reg, MDIO_CMD_ADDR, MDIO_ST_C45);
+       val = mt753x_mii_rw(gsw, addr, devad, 0, MDIO_CMD_READ_C45,
+                           MDIO_ST_C45);
+       mutex_unlock(&gsw->mii_lock);
+
+       return val;
+}
+
+void mt753x_mmd_write(struct gsw_mt753x *gsw, int addr, int devad, u16 reg,
+                     u16 val)
+{
+       if (addr < MT753X_NUM_PHYS)
+               addr = (gsw->phy_base + addr) & MT753X_SMI_ADDR_MASK;
+
+       mutex_lock(&gsw->mii_lock);
+       mt753x_mii_rw(gsw, addr, devad, reg, MDIO_CMD_ADDR, MDIO_ST_C45);
+       mt753x_mii_rw(gsw, addr, devad, val, MDIO_CMD_WRITE, MDIO_ST_C45);
+       mutex_unlock(&gsw->mii_lock);
+}
+
+int mt753x_mmd_ind_read(struct gsw_mt753x *gsw, int addr, int devad, u16 reg)
+{
+       u16 val;
+
+       if (addr < MT753X_NUM_PHYS)
+               addr = (gsw->phy_base + addr) & MT753X_SMI_ADDR_MASK;
+
+       mutex_lock(&gsw->mii_lock);
+
+       mt753x_mii_rw(gsw, addr, MII_MMD_ACC_CTL_REG,
+                     (MMD_ADDR << MMD_CMD_S) |
+                     ((devad << MMD_DEVAD_S) & MMD_DEVAD_M),
+                     MDIO_CMD_WRITE, MDIO_ST_C22);
+
+       mt753x_mii_rw(gsw, addr, MII_MMD_ADDR_DATA_REG, reg,
+                     MDIO_CMD_WRITE, MDIO_ST_C22);
+
+       mt753x_mii_rw(gsw, addr, MII_MMD_ACC_CTL_REG,
+                     (MMD_DATA << MMD_CMD_S) |
+                     ((devad << MMD_DEVAD_S) & MMD_DEVAD_M),
+                     MDIO_CMD_WRITE, MDIO_ST_C22);
+
+       val = mt753x_mii_rw(gsw, addr, MII_MMD_ADDR_DATA_REG, 0,
+                           MDIO_CMD_READ, MDIO_ST_C22);
+
+       mutex_unlock(&gsw->mii_lock);
+
+       return val;
+}
+
+void mt753x_mmd_ind_write(struct gsw_mt753x *gsw, int addr, int devad, u16 reg,
+                         u16 val)
+{
+       if (addr < MT753X_NUM_PHYS)
+               addr = (gsw->phy_base + addr) & MT753X_SMI_ADDR_MASK;
+
+       mutex_lock(&gsw->mii_lock);
+
+       mt753x_mii_rw(gsw, addr, MII_MMD_ACC_CTL_REG,
+                     (MMD_ADDR << MMD_CMD_S) |
+                     ((devad << MMD_DEVAD_S) & MMD_DEVAD_M),
+                     MDIO_CMD_WRITE, MDIO_ST_C22);
+
+       mt753x_mii_rw(gsw, addr, MII_MMD_ADDR_DATA_REG, reg,
+                     MDIO_CMD_WRITE, MDIO_ST_C22);
+
+       mt753x_mii_rw(gsw, addr, MII_MMD_ACC_CTL_REG,
+                     (MMD_DATA << MMD_CMD_S) |
+                     ((devad << MMD_DEVAD_S) & MMD_DEVAD_M),
+                     MDIO_CMD_WRITE, MDIO_ST_C22);
+
+       mt753x_mii_rw(gsw, addr, MII_MMD_ADDR_DATA_REG, val,
+                     MDIO_CMD_WRITE, MDIO_ST_C22);
+
+       mutex_unlock(&gsw->mii_lock);
+}
+
+static inline int mt753x_get_duplex(const struct device_node *np)
+{
+       return of_property_read_bool(np, "full-duplex");
+}
+
+static void mt753x_load_port_cfg(struct gsw_mt753x *gsw)
+{
+       struct device_node *port_np;
+       struct device_node *fixed_link_node;
+       struct mt753x_port_cfg *port_cfg;
+       u32 port;
+
+       for_each_child_of_node(gsw->dev->of_node, port_np) {
+               if (!of_device_is_compatible(port_np, "mediatek,mt753x-port"))
+                       continue;
+
+               if (!of_device_is_available(port_np))
+                       continue;
+
+               if (of_property_read_u32(port_np, "reg", &port))
+                       continue;
+
+               switch (port) {
+               case 5:
+                       port_cfg = &gsw->port5_cfg;
+                       break;
+               case 6:
+                       port_cfg = &gsw->port6_cfg;
+                       break;
+               default:
+                       continue;
+               }
+
+               if (port_cfg->enabled) {
+                       dev_info(gsw->dev, "duplicated node for port%d\n",
+                                port_cfg->phy_mode);
+                       continue;
+               }
+
+               port_cfg->np = port_np;
+
+               port_cfg->phy_mode = of_get_phy_mode(port_np);
+               if (port_cfg->phy_mode < 0) {
+                       dev_info(gsw->dev, "incorrect phy-mode %d\n", port);
+                       continue;
+               }
+
+               fixed_link_node = of_get_child_by_name(port_np, "fixed-link");
+               if (fixed_link_node) {
+                       u32 speed;
+
+                       port_cfg->force_link = 1;
+                       port_cfg->duplex = mt753x_get_duplex(fixed_link_node);
+
+                       if (of_property_read_u32(fixed_link_node, "speed",
+                                                &speed)) {
+                               speed = 0;
+                               continue;
+                       }
+
+                       of_node_put(fixed_link_node);
+
+                       switch (speed) {
+                       case 10:
+                               port_cfg->speed = MAC_SPD_10;
+                               break;
+                       case 100:
+                               port_cfg->speed = MAC_SPD_100;
+                               break;
+                       case 1000:
+                               port_cfg->speed = MAC_SPD_1000;
+                               break;
+                       case 2500:
+                               port_cfg->speed = MAC_SPD_2500;
+                               break;
+                       default:
+                               dev_info(gsw->dev, "incorrect speed %d\n",
+                                        speed);
+                               continue;
+                       }
+               }
+
+               port_cfg->enabled = 1;
+       }
+}
+
+static void mt753x_add_gsw(struct gsw_mt753x *gsw)
+{
+       mutex_lock(&mt753x_devs_lock);
+       gsw->id = mt753x_id++;
+       INIT_LIST_HEAD(&gsw->list);
+       list_add_tail(&gsw->list, &mt753x_devs);
+       mutex_unlock(&mt753x_devs_lock);
+}
+
+static void mt753x_remove_gsw(struct gsw_mt753x *gsw)
+{
+       mutex_lock(&mt753x_devs_lock);
+       list_del(&gsw->list);
+       mutex_unlock(&mt753x_devs_lock);
+}
+
+
+struct gsw_mt753x *mt753x_get_gsw(u32 id)
+{
+       struct gsw_mt753x *dev;
+
+       mutex_lock(&mt753x_devs_lock);
+
+       list_for_each_entry(dev, &mt753x_devs, list) {
+               if (dev->id == id)
+                       return dev;
+       }
+
+       mutex_unlock(&mt753x_devs_lock);
+
+       return NULL;
+}
+
+struct gsw_mt753x *mt753x_get_first_gsw(void)
+{
+       struct gsw_mt753x *dev;
+
+       mutex_lock(&mt753x_devs_lock);
+
+       list_for_each_entry(dev, &mt753x_devs, list)
+               return dev;
+
+       mutex_unlock(&mt753x_devs_lock);
+
+       return NULL;
+}
+
+void mt753x_put_gsw(void)
+{
+       mutex_unlock(&mt753x_devs_lock);
+}
+
+void mt753x_lock_gsw(void)
+{
+       mutex_lock(&mt753x_devs_lock);
+}
+
+static int mt753x_hw_reset(struct gsw_mt753x *gsw)
+{
+       struct device_node *np = gsw->dev->of_node;
+       struct reset_control *rstc;
+       int mcm;
+       int ret = -EINVAL;
+
+       mcm = of_property_read_bool(np, "mediatek,mcm");
+       if (mcm) {
+               rstc = devm_reset_control_get(gsw->dev, "mcm");
+               ret = IS_ERR(rstc);
+               if (IS_ERR(rstc)) {
+                       dev_err(gsw->dev, "Missing reset ctrl of switch\n");
+                       return ret;
+               }
+
+               reset_control_assert(rstc);
+               msleep(30);
+               reset_control_deassert(rstc);
+
+               gsw->reset_pin = -1;
+               return 0;
+       }
+
+       gsw->reset_pin = of_get_named_gpio(np, "reset-gpios", 0);
+       if (gsw->reset_pin < 0) {
+               dev_err(gsw->dev, "Missing reset pin of switch\n");
+               return ret;
+       }
+
+       ret = devm_gpio_request(gsw->dev, gsw->reset_pin, "mt753x-reset");
+       if (ret) {
+               dev_info(gsw->dev, "Failed to request gpio %d\n",
+                        gsw->reset_pin);
+               return ret;
+       }
+
+       gpio_direction_output(gsw->reset_pin, 0);
+       msleep(30);
+       gpio_set_value(gsw->reset_pin, 1);
+       msleep(500);
+
+       return 0;
+}
+
+static irqreturn_t mt753x_irq_handler(int irq, void *dev)
+{
+       struct gsw_mt753x *gsw = dev;
+
+       disable_irq_nosync(gsw->irq);
+
+       schedule_work(&gsw->irq_worker);
+
+       return IRQ_HANDLED;
+}
+
+static int mt753x_probe(struct platform_device *pdev)
+{
+       struct gsw_mt753x *gsw;
+       struct mt753x_sw_id *sw;
+       struct device_node *np = pdev->dev.of_node;
+       struct device_node *mdio;
+       struct mii_bus *mdio_bus;
+       int ret = -EINVAL;
+       struct chip_rev rev;
+       struct mt753x_mapping *map;
+       int i;
+
+       mdio = of_parse_phandle(np, "mediatek,mdio", 0);
+       if (!mdio)
+               return -EINVAL;
+
+       mdio_bus = of_mdio_find_bus(mdio);
+       if (!mdio_bus)
+               return -EPROBE_DEFER;
+
+       gsw = devm_kzalloc(&pdev->dev, sizeof(struct gsw_mt753x), GFP_KERNEL);
+       if (!gsw)
+               return -ENOMEM;
+
+       gsw->host_bus = mdio_bus;
+       gsw->dev = &pdev->dev;
+       mutex_init(&gsw->mii_lock);
+
+       /* Switch hard reset */
+       if (mt753x_hw_reset(gsw))
+               goto fail;
+
+       /* Fetch the SMI address dirst */
+       if (of_property_read_u32(np, "mediatek,smi-addr", &gsw->smi_addr))
+               gsw->smi_addr = MT753X_DFL_SMI_ADDR;
+
+       /* Get LAN/WAN port mapping */
+       map = mt753x_find_mapping(np);
+       if (map) {
+               mt753x_apply_mapping(gsw, map);
+               gsw->global_vlan_enable = 1;
+               dev_info(gsw->dev, "LAN/WAN VLAN setting=%s\n", map->name);
+       }
+
+       /* Load MAC port configurations */
+       mt753x_load_port_cfg(gsw);
+
+       /* Check for valid switch and then initialize */
+       for (i = 0; i < ARRAY_SIZE(mt753x_sw_ids); i++) {
+               if (!mt753x_sw_ids[i]->detect(gsw, &rev)) {
+                       sw = mt753x_sw_ids[i];
+
+                       gsw->name = rev.name;
+                       gsw->model = sw->model;
+
+                       dev_info(gsw->dev, "Switch is MediaTek %s rev %d",
+                                gsw->name, rev.rev);
+
+                       /* Initialize the switch */
+                       ret = sw->init(gsw);
+                       if (ret)
+                               goto fail;
+
+                       break;
+               }
+       }
+
+       if (i >= ARRAY_SIZE(mt753x_sw_ids)) {
+               dev_err(gsw->dev, "No mt753x switch found\n");
+               goto fail;
+       }
+
+       gsw->irq = platform_get_irq(pdev, 0);
+       if (gsw->irq >= 0) {
+               ret = devm_request_irq(gsw->dev, gsw->irq, mt753x_irq_handler,
+                                      0, dev_name(gsw->dev), gsw);
+               if (ret) {
+                       dev_err(gsw->dev, "Failed to request irq %d\n",
+                               gsw->irq);
+                       goto fail;
+               }
+
+               INIT_WORK(&gsw->irq_worker, mt753x_irq_worker);
+       }
+
+       platform_set_drvdata(pdev, gsw);
+
+       gsw->phy_status_poll = of_property_read_bool(gsw->dev->of_node,
+                                                    "mediatek,phy-poll");
+
+       mt753x_add_gsw(gsw);
+
+       mt753x_swconfig_init(gsw);
+
+       if (sw->post_init)
+               sw->post_init(gsw);
+
+       if (gsw->irq >= 0)
+               mt753x_irq_enable(gsw);
+
+       return 0;
+
+fail:
+       devm_kfree(&pdev->dev, gsw);
+
+       return ret;
+}
+
+static int mt753x_remove(struct platform_device *pdev)
+{
+       struct gsw_mt753x *gsw = platform_get_drvdata(pdev);
+
+       if (gsw->irq >= 0)
+               cancel_work_sync(&gsw->irq_worker);
+
+       if (gsw->reset_pin >= 0)
+               devm_gpio_free(&pdev->dev, gsw->reset_pin);
+
+#ifdef CONFIG_SWCONFIG
+       mt753x_swconfig_destroy(gsw);
+#endif
+
+       mt753x_remove_gsw(gsw);
+
+       platform_set_drvdata(pdev, NULL);
+
+       return 0;
+}
+
+static const struct of_device_id mt753x_ids[] = {
+       { .compatible = "mediatek,mt753x" },
+       { },
+};
+
+MODULE_DEVICE_TABLE(of, mt753x_ids);
+
+static struct platform_driver mt753x_driver = {
+       .probe = mt753x_probe,
+       .remove = mt753x_remove,
+       .driver = {
+               .name = "mt753x",
+               .of_match_table = mt753x_ids,
+       },
+};
+
+static int __init mt753x_init(void)
+{
+       int ret;
+
+       INIT_LIST_HEAD(&mt753x_devs);
+       ret = platform_driver_register(&mt753x_driver);
+
+       mt753x_nl_init();
+
+       return ret;
+}
+module_init(mt753x_init);
+
+static void __exit mt753x_exit(void)
+{
+       mt753x_nl_exit();
+
+       platform_driver_unregister(&mt753x_driver);
+}
+module_exit(mt753x_exit);
+
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Weijie Gao <weijie.gao@mediatek.com>");
+MODULE_DESCRIPTION("Driver for MediaTek MT753x Gigabit Switch");
diff --git a/target/linux/mediatek/files-5.4/drivers/net/phy/mtk/mt753x/mt753x_nl.c b/target/linux/mediatek/files-5.4/drivers/net/phy/mtk/mt753x/mt753x_nl.c
new file mode 100644 (file)
index 0000000..40faa01
--- /dev/null
@@ -0,0 +1,382 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (c) 2018 MediaTek Inc.
+ * Author: Sirui Zhao <Sirui.Zhao@mediatek.com>
+ */
+
+#include <linux/types.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <net/genetlink.h>
+
+#include "mt753x.h"
+#include "mt753x_nl.h"
+
+struct mt753x_nl_cmd_item {
+       enum mt753x_cmd cmd;
+       bool require_dev;
+       int (*process)(struct genl_info *info, struct gsw_mt753x *gsw);
+       u32 nr_required_attrs;
+       const enum mt753x_attr *required_attrs;
+};
+
+static int mt753x_nl_response(struct sk_buff *skb, struct genl_info *info);
+
+/*
+static const struct nla_policy mt753x_nl_cmd_policy[] = {
+       [MT753X_ATTR_TYPE_MESG] = { .type = NLA_STRING },
+       [MT753X_ATTR_TYPE_PHY] = { .type = NLA_S32 },
+       [MT753X_ATTR_TYPE_REG] = { .type = NLA_S32 },
+       [MT753X_ATTR_TYPE_VAL] = { .type = NLA_S32 },
+       [MT753X_ATTR_TYPE_DEV_NAME] = { .type = NLA_S32 },
+       [MT753X_ATTR_TYPE_DEV_ID] = { .type = NLA_S32 },
+       [MT753X_ATTR_TYPE_DEVAD] = { .type = NLA_S32 },
+};
+*/
+
+static const struct genl_ops mt753x_nl_ops[] = {
+       {
+               .cmd = MT753X_CMD_REQUEST,
+               .doit = mt753x_nl_response,
+//             .policy = mt753x_nl_cmd_policy,
+               .flags = GENL_ADMIN_PERM,
+       }, {
+               .cmd = MT753X_CMD_READ,
+               .doit = mt753x_nl_response,
+//             .policy = mt753x_nl_cmd_policy,
+               .flags = GENL_ADMIN_PERM,
+       }, {
+               .cmd = MT753X_CMD_WRITE,
+               .doit = mt753x_nl_response,
+//             .policy = mt753x_nl_cmd_policy,
+               .flags = GENL_ADMIN_PERM,
+       },
+};
+
+static struct genl_family mt753x_nl_family = {
+       .name =         MT753X_GENL_NAME,
+       .version =      MT753X_GENL_VERSION,
+       .maxattr =      MT753X_NR_ATTR_TYPE,
+       .ops =          mt753x_nl_ops,
+       .n_ops =        ARRAY_SIZE(mt753x_nl_ops),
+};
+
+static int mt753x_nl_list_devs(char *buff, int size)
+{
+       struct gsw_mt753x *gsw;
+       int len, total = 0;
+       char buf[80];
+
+       memset(buff, 0, size);
+
+       mt753x_lock_gsw();
+
+       list_for_each_entry(gsw, &mt753x_devs, list) {
+               len = snprintf(buf, sizeof(buf),
+                              "id: %d, model: %s, node: %s\n",
+                              gsw->id, gsw->name, gsw->dev->of_node->name);
+               strncat(buff, buf, size - total);
+               total += len;
+       }
+
+       mt753x_put_gsw();
+
+       return total;
+}
+
+static int mt753x_nl_prepare_reply(struct genl_info *info, u8 cmd,
+                                  struct sk_buff **skbp)
+{
+       struct sk_buff *msg;
+       void *reply;
+
+       if (!info)
+               return -EINVAL;
+
+       msg = genlmsg_new(NLMSG_GOODSIZE, GFP_KERNEL);
+       if (!msg)
+               return -ENOMEM;
+
+       /* Construct send-back message header */
+       reply = genlmsg_put(msg, info->snd_portid, info->snd_seq,
+                           &mt753x_nl_family, 0, cmd);
+       if (!reply) {
+               nlmsg_free(msg);
+               return -EINVAL;
+       }
+
+       *skbp = msg;
+       return 0;
+}
+
+static int mt753x_nl_send_reply(struct sk_buff *skb, struct genl_info *info)
+{
+       struct genlmsghdr *genlhdr = nlmsg_data(nlmsg_hdr(skb));
+       void *reply = genlmsg_data(genlhdr);
+
+       /* Finalize a generic netlink message (update message header) */
+       genlmsg_end(skb, reply);
+
+       /* reply to a request */
+       return genlmsg_reply(skb, info);
+}
+
+static s32 mt753x_nl_get_s32(struct genl_info *info, enum mt753x_attr attr,
+                            s32 defval)
+{
+       struct nlattr *na;
+
+       na = info->attrs[attr];
+       if (na)
+               return nla_get_s32(na);
+
+       return defval;
+}
+
+static int mt753x_nl_get_u32(struct genl_info *info, enum mt753x_attr attr,
+                            u32 *val)
+{
+       struct nlattr *na;
+
+       na = info->attrs[attr];
+       if (na) {
+               *val = nla_get_u32(na);
+               return 0;
+       }
+
+       return -1;
+}
+
+static struct gsw_mt753x *mt753x_nl_parse_find_gsw(struct genl_info *info)
+{
+       struct gsw_mt753x *gsw;
+       struct nlattr *na;
+       int gsw_id;
+
+       na = info->attrs[MT753X_ATTR_TYPE_DEV_ID];
+       if (na) {
+               gsw_id = nla_get_s32(na);
+               if (gsw_id >= 0)
+                       gsw = mt753x_get_gsw(gsw_id);
+               else
+                       gsw = mt753x_get_first_gsw();
+       } else {
+               gsw = mt753x_get_first_gsw();
+       }
+
+       return gsw;
+}
+
+static int mt753x_nl_get_swdevs(struct genl_info *info, struct gsw_mt753x *gsw)
+{
+       struct sk_buff *rep_skb = NULL;
+       char dev_info[512];
+       int ret;
+
+       ret = mt753x_nl_list_devs(dev_info, sizeof(dev_info));
+       if (!ret) {
+               pr_info("No switch registered\n");
+               return -EINVAL;
+       }
+
+       ret = mt753x_nl_prepare_reply(info, MT753X_CMD_REPLY, &rep_skb);
+       if (ret < 0)
+               goto err;
+
+       ret = nla_put_string(rep_skb, MT753X_ATTR_TYPE_MESG, dev_info);
+       if (ret < 0)
+               goto err;
+
+       return mt753x_nl_send_reply(rep_skb, info);
+
+err:
+       if (rep_skb)
+               nlmsg_free(rep_skb);
+
+       return ret;
+}
+
+static int mt753x_nl_reply_read(struct genl_info *info, struct gsw_mt753x *gsw)
+{
+       struct sk_buff *rep_skb = NULL;
+       s32 phy, devad, reg;
+       int value;
+       int ret = 0;
+
+       phy = mt753x_nl_get_s32(info, MT753X_ATTR_TYPE_PHY, -1);
+       devad = mt753x_nl_get_s32(info, MT753X_ATTR_TYPE_DEVAD, -1);
+       reg = mt753x_nl_get_s32(info, MT753X_ATTR_TYPE_REG, -1);
+
+       if (reg < 0)
+               goto err;
+
+       ret = mt753x_nl_prepare_reply(info, MT753X_CMD_READ, &rep_skb);
+       if (ret < 0)
+               goto err;
+
+       if (phy >= 0) {
+               if (devad < 0)
+                       value = gsw->mii_read(gsw, phy, reg);
+               else
+                       value = gsw->mmd_read(gsw, phy, devad, reg);
+       } else {
+               value = mt753x_reg_read(gsw, reg);
+       }
+
+       ret = nla_put_s32(rep_skb, MT753X_ATTR_TYPE_REG, reg);
+       if (ret < 0)
+               goto err;
+
+       ret = nla_put_s32(rep_skb, MT753X_ATTR_TYPE_VAL, value);
+       if (ret < 0)
+               goto err;
+
+       return mt753x_nl_send_reply(rep_skb, info);
+
+err:
+       if (rep_skb)
+               nlmsg_free(rep_skb);
+
+       return ret;
+}
+
+static int mt753x_nl_reply_write(struct genl_info *info, struct gsw_mt753x *gsw)
+{
+       struct sk_buff *rep_skb = NULL;
+       s32 phy, devad, reg;
+       u32 value;
+       int ret = 0;
+
+       phy = mt753x_nl_get_s32(info, MT753X_ATTR_TYPE_PHY, -1);
+       devad = mt753x_nl_get_s32(info, MT753X_ATTR_TYPE_DEVAD, -1);
+       reg = mt753x_nl_get_s32(info, MT753X_ATTR_TYPE_REG, -1);
+
+       if (mt753x_nl_get_u32(info, MT753X_ATTR_TYPE_VAL, &value))
+               goto err;
+
+       if (reg < 0)
+               goto err;
+
+       ret = mt753x_nl_prepare_reply(info, MT753X_CMD_WRITE, &rep_skb);
+       if (ret < 0)
+               goto err;
+
+       if (phy >= 0) {
+               if (devad < 0)
+                       gsw->mii_write(gsw, phy, reg, value);
+               else
+                       gsw->mmd_write(gsw, phy, devad, reg, value);
+       } else {
+               mt753x_reg_write(gsw, reg, value);
+       }
+
+       ret = nla_put_s32(rep_skb, MT753X_ATTR_TYPE_REG, reg);
+       if (ret < 0)
+               goto err;
+
+       ret = nla_put_s32(rep_skb, MT753X_ATTR_TYPE_VAL, value);
+       if (ret < 0)
+               goto err;
+
+       return mt753x_nl_send_reply(rep_skb, info);
+
+err:
+       if (rep_skb)
+               nlmsg_free(rep_skb);
+
+       return ret;
+}
+
+static const enum mt753x_attr mt753x_nl_cmd_read_attrs[] = {
+       MT753X_ATTR_TYPE_REG
+};
+
+static const enum mt753x_attr mt753x_nl_cmd_write_attrs[] = {
+       MT753X_ATTR_TYPE_REG,
+       MT753X_ATTR_TYPE_VAL
+};
+
+static const struct mt753x_nl_cmd_item mt753x_nl_cmds[] = {
+       {
+               .cmd = MT753X_CMD_REQUEST,
+               .require_dev = false,
+               .process = mt753x_nl_get_swdevs
+       }, {
+               .cmd = MT753X_CMD_READ,
+               .require_dev = true,
+               .process = mt753x_nl_reply_read,
+               .required_attrs = mt753x_nl_cmd_read_attrs,
+               .nr_required_attrs = ARRAY_SIZE(mt753x_nl_cmd_read_attrs),
+       }, {
+               .cmd = MT753X_CMD_WRITE,
+               .require_dev = true,
+               .process = mt753x_nl_reply_write,
+               .required_attrs = mt753x_nl_cmd_write_attrs,
+               .nr_required_attrs = ARRAY_SIZE(mt753x_nl_cmd_write_attrs),
+       }
+};
+
+static int mt753x_nl_response(struct sk_buff *skb, struct genl_info *info)
+{
+       struct genlmsghdr *hdr = nlmsg_data(info->nlhdr);
+       const struct mt753x_nl_cmd_item *cmditem = NULL;
+       struct gsw_mt753x *gsw = NULL;
+       u32 sat_req_attrs = 0;
+       int i, ret;
+
+       for (i = 0; i < ARRAY_SIZE(mt753x_nl_cmds); i++) {
+               if (hdr->cmd == mt753x_nl_cmds[i].cmd) {
+                       cmditem = &mt753x_nl_cmds[i];
+                       break;
+               }
+       }
+
+       if (!cmditem) {
+               pr_info("mt753x-nl: unknown cmd %u\n", hdr->cmd);
+               return -EINVAL;
+       }
+
+       for (i = 0; i < cmditem->nr_required_attrs; i++) {
+               if (info->attrs[cmditem->required_attrs[i]])
+                       sat_req_attrs++;
+       }
+
+       if (sat_req_attrs != cmditem->nr_required_attrs) {
+               pr_info("mt753x-nl: missing required attr(s) for cmd %u\n",
+                       hdr->cmd);
+               return -EINVAL;
+       }
+
+       if (cmditem->require_dev) {
+               gsw = mt753x_nl_parse_find_gsw(info);
+               if (!gsw) {
+                       pr_info("mt753x-nl: failed to find switch dev\n");
+                       return -EINVAL;
+               }
+       }
+
+       ret = cmditem->process(info, gsw);
+
+       mt753x_put_gsw();
+
+       return ret;
+}
+
+int __init mt753x_nl_init(void)
+{
+       int ret;
+
+       ret = genl_register_family(&mt753x_nl_family);
+       if (ret) {
+               pr_info("mt753x-nl: genl_register_family_with_ops failed\n");
+               return ret;
+       }
+
+       return 0;
+}
+
+void __exit mt753x_nl_exit(void)
+{
+       genl_unregister_family(&mt753x_nl_family);
+}
diff --git a/target/linux/mediatek/files-5.4/drivers/net/phy/mtk/mt753x/mt753x_nl.h b/target/linux/mediatek/files-5.4/drivers/net/phy/mtk/mt753x/mt753x_nl.h
new file mode 100644 (file)
index 0000000..3c06273
--- /dev/null
@@ -0,0 +1,43 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (c) 2018 MediaTek Inc.
+ * Author: Sirui Zhao <Sirui.Zhao@mediatek.com>
+ */
+
+#ifndef _MT753X_NL_H_
+#define _MT753X_NL_H_
+
+#define MT753X_GENL_NAME               "mt753x"
+#define MT753X_GENL_VERSION            0x1
+
+enum mt753x_cmd {
+       MT753X_CMD_UNSPEC = 0,
+       MT753X_CMD_REQUEST,
+       MT753X_CMD_REPLY,
+       MT753X_CMD_READ,
+       MT753X_CMD_WRITE,
+
+       __MT753X_CMD_MAX,
+};
+
+enum mt753x_attr {
+       MT753X_ATTR_TYPE_UNSPEC = 0,
+       MT753X_ATTR_TYPE_MESG,
+       MT753X_ATTR_TYPE_PHY,
+       MT753X_ATTR_TYPE_DEVAD,
+       MT753X_ATTR_TYPE_REG,
+       MT753X_ATTR_TYPE_VAL,
+       MT753X_ATTR_TYPE_DEV_NAME,
+       MT753X_ATTR_TYPE_DEV_ID,
+
+       __MT753X_ATTR_TYPE_MAX,
+};
+
+#define MT753X_NR_ATTR_TYPE            (__MT753X_ATTR_TYPE_MAX - 1)
+
+#ifdef __KERNEL__
+int __init mt753x_nl_init(void);
+void __exit mt753x_nl_exit(void);
+#endif /* __KERNEL__ */
+
+#endif /* _MT753X_NL_H_ */
diff --git a/target/linux/mediatek/files-5.4/drivers/net/phy/mtk/mt753x/mt753x_regs.h b/target/linux/mediatek/files-5.4/drivers/net/phy/mtk/mt753x/mt753x_regs.h
new file mode 100644 (file)
index 0000000..0c91b8e
--- /dev/null
@@ -0,0 +1,294 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (c) 2018 MediaTek Inc.
+ * Author: Weijie Gao <weijie.gao@mediatek.com>
+ */
+
+#ifndef _MT753X_REGS_H_
+#define _MT753X_REGS_H_
+
+#include <linux/bitops.h>
+
+/* Values of Egress TAG Control */
+#define ETAG_CTRL_UNTAG                        0
+#define ETAG_CTRL_TAG                  2
+#define ETAG_CTRL_SWAP                 1
+#define ETAG_CTRL_STACK                        3
+
+#define VTCR                           0x90
+#define VAWD1                          0x94
+#define VAWD2                          0x98
+
+/* Fields of VTCR */
+#define VTCR_BUSY                      BIT(31)
+#define IDX_INVLD                      BIT(16)
+#define VTCR_FUNC_S                    12
+#define VTCR_FUNC_M                    0xf000
+#define VTCR_VID_S                     0
+#define VTCR_VID_M                     0xfff
+
+/* Values of VTCR_FUNC */
+#define VTCR_READ_VLAN_ENTRY           0
+#define VTCR_WRITE_VLAN_ENTRY          1
+#define VTCR_INVD_VLAN_ENTRY           2
+#define VTCR_ENABLE_VLAN_ENTRY         3
+#define VTCR_READ_ACL_ENTRY            4
+#define VTCR_WRITE_ACL_ENTRY           5
+#define VTCR_READ_TRTCM_TABLE          6
+#define VTCR_WRITE_TRTCM_TABLE         7
+#define VTCR_READ_ACL_MASK_ENTRY       8
+#define VTCR_WRITE_ACL_MASK_ENTRY      9
+#define VTCR_READ_ACL_RULE_ENTRY       10
+#define VTCR_WRITE_ACL_RULE_ENTRY      11
+#define VTCR_READ_ACL_RATE_ENTRY       12
+#define VTCR_WRITE_ACL_RATE_ENTRY      13
+
+/* VLAN entry fields */
+/* VAWD1 */
+#define PORT_STAG                      BIT(31)
+#define IVL_MAC                                BIT(30)
+#define EG_CON                         BIT(29)
+#define VTAG_EN                                BIT(28)
+#define COPY_PRI                       BIT(27)
+#define USER_PRI_S                     24
+#define USER_PRI_M                     0x7000000
+#define PORT_MEM_S                     16
+#define PORT_MEM_M                     0xff0000
+#define S_TAG1_S                       4
+#define S_TAG1_M                       0xfff0
+#define FID_S                          1
+#define FID_M                          0x0e
+#define VENTRY_VALID                   BIT(0)
+
+/* VAWD2 */
+#define S_TAG2_S                       16
+#define S_TAG2_M                       0xffff0000
+#define PORT_ETAG_S(p)                 ((p) * 2)
+#define PORT_ETAG_M                    0x03
+
+#define PORT_CTRL_BASE                 0x2000
+#define PORT_CTRL_PORT_OFFSET          0x100
+#define PORT_CTRL_REG(p, r)            (PORT_CTRL_BASE + \
+                                       (p) * PORT_CTRL_PORT_OFFSET +  (r))
+#define CKGCR(p)                       PORT_CTRL_REG(p, 0x00)
+#define PCR(p)                         PORT_CTRL_REG(p, 0x04)
+#define PIC(p)                         PORT_CTRL_REG(p, 0x08)
+#define PSC(p)                         PORT_CTRL_REG(p, 0x0c)
+#define PVC(p)                         PORT_CTRL_REG(p, 0x10)
+#define PPBV1(p)                       PORT_CTRL_REG(p, 0x14)
+#define PPBV2(p)                       PORT_CTRL_REG(p, 0x18)
+#define BSR(p)                         PORT_CTRL_REG(p, 0x1c)
+#define STAG01                         PORT_CTRL_REG(p, 0x20)
+#define STAG23                         PORT_CTRL_REG(p, 0x24)
+#define STAG45                         PORT_CTRL_REG(p, 0x28)
+#define STAG67                         PORT_CTRL_REG(p, 0x2c)
+
+#define PPBV(p, g)                     (PPBV1(p) + ((g) / 2) * 4)
+
+/* Fields of PCR */
+#define MLDV2_EN                       BIT(30)
+#define EG_TAG_S                       28
+#define EG_TAG_M                       0x30000000
+#define PORT_PRI_S                     24
+#define PORT_PRI_M                     0x7000000
+#define PORT_MATRIX_S                  16
+#define PORT_MATRIX_M                  0xff0000
+#define UP2DSCP_EN                     BIT(12)
+#define UP2TAG_EN                      BIT(11)
+#define ACL_EN                         BIT(10)
+#define PORT_TX_MIR                    BIT(9)
+#define PORT_RX_MIR                    BIT(8)
+#define ACL_MIR                                BIT(7)
+#define MIS_PORT_FW_S                  4
+#define MIS_PORT_FW_M                  0x70
+#define VLAN_MIS                       BIT(2)
+#define PORT_VLAN_S                    0
+#define PORT_VLAN_M                    0x03
+
+/* Values of PORT_VLAN */
+#define PORT_MATRIX_MODE               0
+#define FALLBACK_MODE                  1
+#define CHECK_MODE                     2
+#define SECURITY_MODE                  3
+
+/* Fields of PVC */
+#define STAG_VPID_S                    16
+#define STAG_VPID_M                    0xffff0000
+#define DIS_PVID                       BIT(15)
+#define FORCE_PVID                     BIT(14)
+#define PT_VPM                         BIT(12)
+#define PT_OPTION                      BIT(11)
+#define PVC_EG_TAG_S                   8
+#define PVC_EG_TAG_M                   0x700
+#define VLAN_ATTR_S                    6
+#define VLAN_ATTR_M                    0xc0
+#define PVC_PORT_STAG                  BIT(5)
+#define BC_LKYV_EN                     BIT(4)
+#define MC_LKYV_EN                     BIT(3)
+#define UC_LKYV_EN                     BIT(2)
+#define ACC_FRM_S                      0
+#define ACC_FRM_M                      0x03
+
+/* Values of VLAN_ATTR */
+#define VA_USER_PORT                   0
+#define VA_STACK_PORT                  1
+#define VA_TRANSLATION_PORT            2
+#define VA_TRANSPARENT_PORT            3
+
+/* Fields of PPBV */
+#define GRP_PORT_PRI_S(g)              (((g) % 2) * 16 + 13)
+#define GRP_PORT_PRI_M                 0x07
+#define GRP_PORT_VID_S(g)              (((g) % 2) * 16)
+#define GRP_PORT_VID_M                 0xfff
+
+#define PORT_MAC_CTRL_BASE             0x3000
+#define PORT_MAC_CTRL_PORT_OFFSET      0x100
+#define PORT_MAC_CTRL_REG(p, r)                (PORT_MAC_CTRL_BASE + \
+                                       (p) * PORT_MAC_CTRL_PORT_OFFSET + (r))
+#define PMCR(p)                                PORT_MAC_CTRL_REG(p, 0x00)
+#define PMEEECR(p)                     PORT_MAC_CTRL_REG(p, 0x04)
+#define PMSR(p)                                PORT_MAC_CTRL_REG(p, 0x08)
+#define PINT_EN(p)                     PORT_MAC_CTRL_REG(p, 0x10)
+#define PINT_STS(p)                    PORT_MAC_CTRL_REG(p, 0x14)
+
+#define GMACCR                         (PORT_MAC_CTRL_BASE + 0xe0)
+#define TXCRC_EN                       BIT(19)
+#define RXCRC_EN                       BIT(18)
+#define PRMBL_LMT_EN                   BIT(17)
+#define MTCC_LMT_S                     9
+#define MTCC_LMT_M                     0x1e00
+#define MAX_RX_JUMBO_S                 2
+#define MAX_RX_JUMBO_M                 0x3c
+#define MAX_RX_PKT_LEN_S               0
+#define MAX_RX_PKT_LEN_M               0x3
+
+/* Values of MAX_RX_PKT_LEN */
+#define RX_PKT_LEN_1518                        0
+#define RX_PKT_LEN_1536                        1
+#define RX_PKT_LEN_1522                        2
+#define RX_PKT_LEN_MAX_JUMBO           3
+
+/* Fields of PMCR */
+#define IPG_CFG_S                      18
+#define IPG_CFG_M                      0xc0000
+#define EXT_PHY                                BIT(17)
+#define MAC_MODE                       BIT(16)
+#define MAC_TX_EN                      BIT(14)
+#define MAC_RX_EN                      BIT(13)
+#define MAC_PRE                                BIT(11)
+#define BKOFF_EN                       BIT(9)
+#define BACKPR_EN                      BIT(8)
+#define FORCE_EEE1G                    BIT(7)
+#define FORCE_EEE1000                  BIT(6)
+#define FORCE_RX_FC                    BIT(5)
+#define FORCE_TX_FC                    BIT(4)
+#define FORCE_SPD_S                    2
+#define FORCE_SPD_M                    0x0c
+#define FORCE_DPX                      BIT(1)
+#define FORCE_LINK                     BIT(0)
+
+/* Fields of PMSR */
+#define EEE1G_STS                      BIT(7)
+#define EEE100_STS                     BIT(6)
+#define RX_FC_STS                      BIT(5)
+#define TX_FC_STS                      BIT(4)
+#define MAC_SPD_STS_S                  2
+#define MAC_SPD_STS_M                  0x0c
+#define MAC_DPX_STS                    BIT(1)
+#define MAC_LNK_STS                    BIT(0)
+
+/* Values of MAC_SPD_STS */
+#define MAC_SPD_10                     0
+#define MAC_SPD_100                    1
+#define MAC_SPD_1000                   2
+#define MAC_SPD_2500                   3
+
+/* Values of IPG_CFG */
+#define IPG_96BIT                      0
+#define IPG_96BIT_WITH_SHORT_IPG       1
+#define IPG_64BIT                      2
+
+#define MIB_COUNTER_BASE               0x4000
+#define MIB_COUNTER_PORT_OFFSET                0x100
+#define MIB_COUNTER_REG(p, r)          (MIB_COUNTER_BASE + \
+                                       (p) * MIB_COUNTER_PORT_OFFSET + (r))
+#define STATS_TDPC                     0x00
+#define STATS_TCRC                     0x04
+#define STATS_TUPC                     0x08
+#define STATS_TMPC                     0x0C
+#define STATS_TBPC                     0x10
+#define STATS_TCEC                     0x14
+#define STATS_TSCEC                    0x18
+#define STATS_TMCEC                    0x1C
+#define STATS_TDEC                     0x20
+#define STATS_TLCEC                    0x24
+#define STATS_TXCEC                    0x28
+#define STATS_TPPC                     0x2C
+#define STATS_TL64PC                   0x30
+#define STATS_TL65PC                   0x34
+#define STATS_TL128PC                  0x38
+#define STATS_TL256PC                  0x3C
+#define STATS_TL512PC                  0x40
+#define STATS_TL1024PC                 0x44
+#define STATS_TOC                      0x48
+#define STATS_RDPC                     0x60
+#define STATS_RFPC                     0x64
+#define STATS_RUPC                     0x68
+#define STATS_RMPC                     0x6C
+#define STATS_RBPC                     0x70
+#define STATS_RAEPC                    0x74
+#define STATS_RCEPC                    0x78
+#define STATS_RUSPC                    0x7C
+#define STATS_RFEPC                    0x80
+#define STATS_ROSPC                    0x84
+#define STATS_RJEPC                    0x88
+#define STATS_RPPC                     0x8C
+#define STATS_RL64PC                   0x90
+#define STATS_RL65PC                   0x94
+#define STATS_RL128PC                  0x98
+#define STATS_RL256PC                  0x9C
+#define STATS_RL512PC                  0xA0
+#define STATS_RL1024PC                 0xA4
+#define STATS_ROC                      0xA8
+#define STATS_RDPC_CTRL                        0xB0
+#define STATS_RDPC_ING                 0xB4
+#define STATS_RDPC_ARL                 0xB8
+
+#define SYS_CTRL                       0x7000
+#define SW_PHY_RST                     BIT(2)
+#define SW_SYS_RST                     BIT(1)
+#define SW_REG_RST                     BIT(0)
+
+#define SYS_INT_EN                     0x7008
+#define SYS_INT_STS                    0x700c
+#define MAC_PC_INT                     BIT(16)
+#define PHY_INT(p)                     BIT((p) + 8)
+#define PHY_LC_INT(p)                  BIT(p)
+
+#define PHY_IAC                                0x701c
+#define PHY_ACS_ST                     BIT(31)
+#define MDIO_REG_ADDR_S                        25
+#define MDIO_REG_ADDR_M                        0x3e000000
+#define MDIO_PHY_ADDR_S                        20
+#define MDIO_PHY_ADDR_M                        0x1f00000
+#define MDIO_CMD_S                     18
+#define MDIO_CMD_M                     0xc0000
+#define MDIO_ST_S                      16
+#define MDIO_ST_M                      0x30000
+#define MDIO_RW_DATA_S                 0
+#define MDIO_RW_DATA_M                 0xffff
+
+/* MDIO_CMD: MDIO commands */
+#define MDIO_CMD_ADDR                  0
+#define MDIO_CMD_WRITE                 1
+#define MDIO_CMD_READ                  2
+#define MDIO_CMD_READ_C45              3
+
+/* MDIO_ST: MDIO start field */
+#define MDIO_ST_C45                    0
+#define MDIO_ST_C22                    1
+
+#define HWSTRAP                                0x7800
+#define MHWSTRAP                       0x7804
+
+#endif /* _MT753X_REGS_H_ */
diff --git a/target/linux/mediatek/files-5.4/drivers/net/phy/mtk/mt753x/mt753x_swconfig.c b/target/linux/mediatek/files-5.4/drivers/net/phy/mtk/mt753x/mt753x_swconfig.c
new file mode 100644 (file)
index 0000000..b601b90
--- /dev/null
@@ -0,0 +1,510 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (c) 2018 MediaTek Inc.
+ * Author: Weijie Gao <weijie.gao@mediatek.com>
+ */
+
+#include <linux/if.h>
+#include <linux/list.h>
+#include <linux/if_ether.h>
+#include <linux/skbuff.h>
+#include <linux/netdevice.h>
+#include <linux/netlink.h>
+#include <linux/bitops.h>
+#include <net/genetlink.h>
+#include <linux/delay.h>
+#include <linux/phy.h>
+#include <linux/netdevice.h>
+#include <linux/etherdevice.h>
+#include <linux/lockdep.h>
+#include <linux/workqueue.h>
+#include <linux/of_device.h>
+
+#include "mt753x.h"
+#include "mt753x_swconfig.h"
+#include "mt753x_regs.h"
+
+#define MT753X_PORT_MIB_TXB_ID 18      /* TxByte */
+#define MT753X_PORT_MIB_RXB_ID 37      /* RxByte */
+
+#define MIB_DESC(_s, _o, _n)   \
+       {                       \
+               .size = (_s),   \
+               .offset = (_o), \
+               .name = (_n),   \
+       }
+
+struct mt753x_mib_desc {
+       unsigned int size;
+       unsigned int offset;
+       const char *name;
+};
+
+static const struct mt753x_mib_desc mt753x_mibs[] = {
+       MIB_DESC(1, STATS_TDPC, "TxDrop"),
+       MIB_DESC(1, STATS_TCRC, "TxCRC"),
+       MIB_DESC(1, STATS_TUPC, "TxUni"),
+       MIB_DESC(1, STATS_TMPC, "TxMulti"),
+       MIB_DESC(1, STATS_TBPC, "TxBroad"),
+       MIB_DESC(1, STATS_TCEC, "TxCollision"),
+       MIB_DESC(1, STATS_TSCEC, "TxSingleCol"),
+       MIB_DESC(1, STATS_TMCEC, "TxMultiCol"),
+       MIB_DESC(1, STATS_TDEC, "TxDefer"),
+       MIB_DESC(1, STATS_TLCEC, "TxLateCol"),
+       MIB_DESC(1, STATS_TXCEC, "TxExcCol"),
+       MIB_DESC(1, STATS_TPPC, "TxPause"),
+       MIB_DESC(1, STATS_TL64PC, "Tx64Byte"),
+       MIB_DESC(1, STATS_TL65PC, "Tx65Byte"),
+       MIB_DESC(1, STATS_TL128PC, "Tx128Byte"),
+       MIB_DESC(1, STATS_TL256PC, "Tx256Byte"),
+       MIB_DESC(1, STATS_TL512PC, "Tx512Byte"),
+       MIB_DESC(1, STATS_TL1024PC, "Tx1024Byte"),
+       MIB_DESC(2, STATS_TOC, "TxByte"),
+       MIB_DESC(1, STATS_RDPC, "RxDrop"),
+       MIB_DESC(1, STATS_RFPC, "RxFiltered"),
+       MIB_DESC(1, STATS_RUPC, "RxUni"),
+       MIB_DESC(1, STATS_RMPC, "RxMulti"),
+       MIB_DESC(1, STATS_RBPC, "RxBroad"),
+       MIB_DESC(1, STATS_RAEPC, "RxAlignErr"),
+       MIB_DESC(1, STATS_RCEPC, "RxCRC"),
+       MIB_DESC(1, STATS_RUSPC, "RxUnderSize"),
+       MIB_DESC(1, STATS_RFEPC, "RxFragment"),
+       MIB_DESC(1, STATS_ROSPC, "RxOverSize"),
+       MIB_DESC(1, STATS_RJEPC, "RxJabber"),
+       MIB_DESC(1, STATS_RPPC, "RxPause"),
+       MIB_DESC(1, STATS_RL64PC, "Rx64Byte"),
+       MIB_DESC(1, STATS_RL65PC, "Rx65Byte"),
+       MIB_DESC(1, STATS_RL128PC, "Rx128Byte"),
+       MIB_DESC(1, STATS_RL256PC, "Rx256Byte"),
+       MIB_DESC(1, STATS_RL512PC, "Rx512Byte"),
+       MIB_DESC(1, STATS_RL1024PC, "Rx1024Byte"),
+       MIB_DESC(2, STATS_ROC, "RxByte"),
+       MIB_DESC(1, STATS_RDPC_CTRL, "RxCtrlDrop"),
+       MIB_DESC(1, STATS_RDPC_ING, "RxIngDrop"),
+       MIB_DESC(1, STATS_RDPC_ARL, "RxARLDrop")
+};
+
+enum {
+       /* Global attributes. */
+       MT753X_ATTR_ENABLE_VLAN,
+};
+
+static int mt753x_get_vlan_enable(struct switch_dev *dev,
+                                 const struct switch_attr *attr,
+                                 struct switch_val *val)
+{
+       struct gsw_mt753x *gsw = container_of(dev, struct gsw_mt753x, swdev);
+
+       val->value.i = gsw->global_vlan_enable;
+
+       return 0;
+}
+
+static int mt753x_set_vlan_enable(struct switch_dev *dev,
+                                 const struct switch_attr *attr,
+                                 struct switch_val *val)
+{
+       struct gsw_mt753x *gsw = container_of(dev, struct gsw_mt753x, swdev);
+
+       gsw->global_vlan_enable = val->value.i != 0;
+
+       return 0;
+}
+
+static int mt753x_get_port_pvid(struct switch_dev *dev, int port, int *val)
+{
+       struct gsw_mt753x *gsw = container_of(dev, struct gsw_mt753x, swdev);
+
+       if (port >= MT753X_NUM_PORTS)
+               return -EINVAL;
+
+       *val = mt753x_reg_read(gsw, PPBV1(port));
+       *val &= GRP_PORT_VID_M;
+
+       return 0;
+}
+
+static int mt753x_set_port_pvid(struct switch_dev *dev, int port, int pvid)
+{
+       struct gsw_mt753x *gsw = container_of(dev, struct gsw_mt753x, swdev);
+
+       if (port >= MT753X_NUM_PORTS)
+               return -EINVAL;
+
+       if (pvid < MT753X_MIN_VID || pvid > MT753X_MAX_VID)
+               return -EINVAL;
+
+       gsw->port_entries[port].pvid = pvid;
+
+       return 0;
+}
+
+static int mt753x_get_vlan_ports(struct switch_dev *dev, struct switch_val *val)
+{
+       struct gsw_mt753x *gsw = container_of(dev, struct gsw_mt753x, swdev);
+       u32 member;
+       u32 etags;
+       int i;
+
+       val->len = 0;
+
+       if (val->port_vlan < 0 || val->port_vlan >= MT753X_NUM_VLANS)
+               return -EINVAL;
+
+       mt753x_vlan_ctrl(gsw, VTCR_READ_VLAN_ENTRY, val->port_vlan);
+
+       member = mt753x_reg_read(gsw, VAWD1);
+       member &= PORT_MEM_M;
+       member >>= PORT_MEM_S;
+
+       etags = mt753x_reg_read(gsw, VAWD2);
+
+       for (i = 0; i < MT753X_NUM_PORTS; i++) {
+               struct switch_port *p;
+               int etag;
+
+               if (!(member & BIT(i)))
+                       continue;
+
+               p = &val->value.ports[val->len++];
+               p->id = i;
+
+               etag = (etags >> PORT_ETAG_S(i)) & PORT_ETAG_M;
+
+               if (etag == ETAG_CTRL_TAG)
+                       p->flags |= BIT(SWITCH_PORT_FLAG_TAGGED);
+               else if (etag != ETAG_CTRL_UNTAG)
+                       dev_info(gsw->dev,
+                                "vlan egress tag control neither untag nor tag.\n");
+       }
+
+       return 0;
+}
+
+static int mt753x_set_vlan_ports(struct switch_dev *dev, struct switch_val *val)
+{
+       struct gsw_mt753x *gsw = container_of(dev, struct gsw_mt753x, swdev);
+       u8 member = 0;
+       u8 etags = 0;
+       int i;
+
+       if (val->port_vlan < 0 || val->port_vlan >= MT753X_NUM_VLANS ||
+           val->len > MT753X_NUM_PORTS)
+               return -EINVAL;
+
+       for (i = 0; i < val->len; i++) {
+               struct switch_port *p = &val->value.ports[i];
+
+               if (p->id >= MT753X_NUM_PORTS)
+                       return -EINVAL;
+
+               member |= BIT(p->id);
+
+               if (p->flags & BIT(SWITCH_PORT_FLAG_TAGGED))
+                       etags |= BIT(p->id);
+       }
+
+       gsw->vlan_entries[val->port_vlan].member = member;
+       gsw->vlan_entries[val->port_vlan].etags = etags;
+
+       return 0;
+}
+
+static int mt753x_set_vid(struct switch_dev *dev,
+                         const struct switch_attr *attr,
+                         struct switch_val *val)
+{
+       struct gsw_mt753x *gsw = container_of(dev, struct gsw_mt753x, swdev);
+       int vlan;
+       u16 vid;
+
+       vlan = val->port_vlan;
+       vid = (u16)val->value.i;
+
+       if (vlan < 0 || vlan >= MT753X_NUM_VLANS)
+               return -EINVAL;
+
+       if (vid < MT753X_MIN_VID || vid > MT753X_MAX_VID)
+               return -EINVAL;
+
+       gsw->vlan_entries[vlan].vid = vid;
+       return 0;
+}
+
+static int mt753x_get_vid(struct switch_dev *dev,
+                         const struct switch_attr *attr,
+                         struct switch_val *val)
+{
+       val->value.i = val->port_vlan;
+       return 0;
+}
+
+static int mt753x_get_port_link(struct switch_dev *dev, int port,
+                               struct switch_port_link *link)
+{
+       struct gsw_mt753x *gsw = container_of(dev, struct gsw_mt753x, swdev);
+       u32 speed, pmsr;
+
+       if (port < 0 || port >= MT753X_NUM_PORTS)
+               return -EINVAL;
+
+       pmsr = mt753x_reg_read(gsw, PMSR(port));
+
+       link->link = pmsr & MAC_LNK_STS;
+       link->duplex = pmsr & MAC_DPX_STS;
+       speed = (pmsr & MAC_SPD_STS_M) >> MAC_SPD_STS_S;
+
+       switch (speed) {
+       case MAC_SPD_10:
+               link->speed = SWITCH_PORT_SPEED_10;
+               break;
+       case MAC_SPD_100:
+               link->speed = SWITCH_PORT_SPEED_100;
+               break;
+       case MAC_SPD_1000:
+               link->speed = SWITCH_PORT_SPEED_1000;
+               break;
+       case MAC_SPD_2500:
+               /* TODO: swconfig has no support for 2500 now */
+               link->speed = SWITCH_PORT_SPEED_UNKNOWN;
+               break;
+       }
+
+       return 0;
+}
+
+static int mt753x_set_port_link(struct switch_dev *dev, int port,
+                               struct switch_port_link *link)
+{
+#ifndef MODULE
+       if (port >= MT753X_NUM_PHYS)
+               return -EINVAL;
+
+       return switch_generic_set_link(dev, port, link);
+#else
+       return -ENOTSUPP;
+#endif
+}
+
+static u64 get_mib_counter(struct gsw_mt753x *gsw, int i, int port)
+{
+       unsigned int offset;
+       u64 lo, hi, hi2;
+
+       offset = mt753x_mibs[i].offset;
+
+       if (mt753x_mibs[i].size == 1)
+               return mt753x_reg_read(gsw, MIB_COUNTER_REG(port, offset));
+
+       do {
+               hi = mt753x_reg_read(gsw, MIB_COUNTER_REG(port, offset + 4));
+               lo = mt753x_reg_read(gsw, MIB_COUNTER_REG(port, offset));
+               hi2 = mt753x_reg_read(gsw, MIB_COUNTER_REG(port, offset + 4));
+       } while (hi2 != hi);
+
+       return (hi << 32) | lo;
+}
+
+static int mt753x_get_port_mib(struct switch_dev *dev,
+                              const struct switch_attr *attr,
+                              struct switch_val *val)
+{
+       static char buf[4096];
+       struct gsw_mt753x *gsw = container_of(dev, struct gsw_mt753x, swdev);
+       int i, len = 0;
+
+       if (val->port_vlan >= MT753X_NUM_PORTS)
+               return -EINVAL;
+
+       len += snprintf(buf + len, sizeof(buf) - len,
+                       "Port %d MIB counters\n", val->port_vlan);
+
+       for (i = 0; i < ARRAY_SIZE(mt753x_mibs); ++i) {
+               u64 counter;
+
+               len += snprintf(buf + len, sizeof(buf) - len,
+                               "%-11s: ", mt753x_mibs[i].name);
+               counter = get_mib_counter(gsw, i, val->port_vlan);
+               len += snprintf(buf + len, sizeof(buf) - len, "%llu\n",
+                               counter);
+       }
+
+       val->value.s = buf;
+       val->len = len;
+       return 0;
+}
+
+static int mt753x_get_port_stats(struct switch_dev *dev, int port,
+                                struct switch_port_stats *stats)
+{
+       struct gsw_mt753x *gsw = container_of(dev, struct gsw_mt753x, swdev);
+
+       if (port < 0 || port >= MT753X_NUM_PORTS)
+               return -EINVAL;
+
+       stats->tx_bytes = get_mib_counter(gsw, MT753X_PORT_MIB_TXB_ID, port);
+       stats->rx_bytes = get_mib_counter(gsw, MT753X_PORT_MIB_RXB_ID, port);
+
+       return 0;
+}
+
+static void mt753x_port_isolation(struct gsw_mt753x *gsw)
+{
+       int i;
+
+       for (i = 0; i < MT753X_NUM_PORTS; i++)
+               mt753x_reg_write(gsw, PCR(i),
+                                BIT(gsw->cpu_port) << PORT_MATRIX_S);
+
+       mt753x_reg_write(gsw, PCR(gsw->cpu_port), PORT_MATRIX_M);
+
+       for (i = 0; i < MT753X_NUM_PORTS; i++)
+               mt753x_reg_write(gsw, PVC(i),
+                                (0x8100 << STAG_VPID_S) |
+                                (VA_TRANSPARENT_PORT << VLAN_ATTR_S));
+}
+
+static int mt753x_apply_config(struct switch_dev *dev)
+{
+       struct gsw_mt753x *gsw = container_of(dev, struct gsw_mt753x, swdev);
+
+       if (!gsw->global_vlan_enable) {
+               mt753x_port_isolation(gsw);
+               return 0;
+       }
+
+       mt753x_apply_vlan_config(gsw);
+
+       return 0;
+}
+
+static int mt753x_reset_switch(struct switch_dev *dev)
+{
+       struct gsw_mt753x *gsw = container_of(dev, struct gsw_mt753x, swdev);
+       int i;
+
+       memset(gsw->port_entries, 0, sizeof(gsw->port_entries));
+       memset(gsw->vlan_entries, 0, sizeof(gsw->vlan_entries));
+
+       /* set default vid of each vlan to the same number of vlan, so the vid
+        * won't need be set explicitly.
+        */
+       for (i = 0; i < MT753X_NUM_VLANS; i++)
+               gsw->vlan_entries[i].vid = i;
+
+       return 0;
+}
+
+static int mt753x_phy_read16(struct switch_dev *dev, int addr, u8 reg,
+                            u16 *value)
+{
+       struct gsw_mt753x *gsw = container_of(dev, struct gsw_mt753x, swdev);
+
+       *value = gsw->mii_read(gsw, addr, reg);
+
+       return 0;
+}
+
+static int mt753x_phy_write16(struct switch_dev *dev, int addr, u8 reg,
+                             u16 value)
+{
+       struct gsw_mt753x *gsw = container_of(dev, struct gsw_mt753x, swdev);
+
+       gsw->mii_write(gsw, addr, reg, value);
+
+       return 0;
+}
+
+static const struct switch_attr mt753x_global[] = {
+       {
+               .type = SWITCH_TYPE_INT,
+               .name = "enable_vlan",
+               .description = "VLAN mode (1:enabled)",
+               .max = 1,
+               .id = MT753X_ATTR_ENABLE_VLAN,
+               .get = mt753x_get_vlan_enable,
+               .set = mt753x_set_vlan_enable,
+       }
+};
+
+static const struct switch_attr mt753x_port[] = {
+       {
+               .type = SWITCH_TYPE_STRING,
+               .name = "mib",
+               .description = "Get MIB counters for port",
+               .get = mt753x_get_port_mib,
+               .set = NULL,
+       },
+};
+
+static const struct switch_attr mt753x_vlan[] = {
+       {
+               .type = SWITCH_TYPE_INT,
+               .name = "vid",
+               .description = "VLAN ID (0-4094)",
+               .set = mt753x_set_vid,
+               .get = mt753x_get_vid,
+               .max = 4094,
+       },
+};
+
+static const struct switch_dev_ops mt753x_swdev_ops = {
+       .attr_global = {
+               .attr = mt753x_global,
+               .n_attr = ARRAY_SIZE(mt753x_global),
+       },
+       .attr_port = {
+               .attr = mt753x_port,
+               .n_attr = ARRAY_SIZE(mt753x_port),
+       },
+       .attr_vlan = {
+               .attr = mt753x_vlan,
+               .n_attr = ARRAY_SIZE(mt753x_vlan),
+       },
+       .get_vlan_ports = mt753x_get_vlan_ports,
+       .set_vlan_ports = mt753x_set_vlan_ports,
+       .get_port_pvid = mt753x_get_port_pvid,
+       .set_port_pvid = mt753x_set_port_pvid,
+       .get_port_link = mt753x_get_port_link,
+       .set_port_link = mt753x_set_port_link,
+       .get_port_stats = mt753x_get_port_stats,
+       .apply_config = mt753x_apply_config,
+       .reset_switch = mt753x_reset_switch,
+       .phy_read16 = mt753x_phy_read16,
+       .phy_write16 = mt753x_phy_write16,
+};
+
+int mt753x_swconfig_init(struct gsw_mt753x *gsw)
+{
+       struct device_node *np = gsw->dev->of_node;
+       struct switch_dev *swdev;
+       int ret;
+
+       if (of_property_read_u32(np, "mediatek,cpuport", &gsw->cpu_port))
+               gsw->cpu_port = MT753X_DFL_CPU_PORT;
+
+       swdev = &gsw->swdev;
+
+       swdev->name = gsw->name;
+       swdev->alias = gsw->name;
+       swdev->cpu_port = gsw->cpu_port;
+       swdev->ports = MT753X_NUM_PORTS;
+       swdev->vlans = MT753X_NUM_VLANS;
+       swdev->ops = &mt753x_swdev_ops;
+
+       ret = register_switch(swdev, NULL);
+       if (ret) {
+               dev_notice(gsw->dev, "Failed to register switch %s\n",
+                          swdev->name);
+               return ret;
+       }
+
+       mt753x_apply_config(swdev);
+
+       return 0;
+}
+
+void mt753x_swconfig_destroy(struct gsw_mt753x *gsw)
+{
+       unregister_switch(&gsw->swdev);
+}
diff --git a/target/linux/mediatek/files-5.4/drivers/net/phy/mtk/mt753x/mt753x_swconfig.h b/target/linux/mediatek/files-5.4/drivers/net/phy/mtk/mt753x/mt753x_swconfig.h
new file mode 100644 (file)
index 0000000..b877d89
--- /dev/null
@@ -0,0 +1,29 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (c) 2018 MediaTek Inc.
+ * Author: Weijie Gao <weijie.gao@mediatek.com>
+ */
+
+#ifndef _MT753X_SWCONFIG_H_
+#define _MT753X_SWCONFIG_H_
+
+#ifdef CONFIG_SWCONFIG
+#include <linux/switch.h>
+#include "mt753x.h"
+
+int mt753x_swconfig_init(struct gsw_mt753x *gsw);
+void mt753x_swconfig_destroy(struct gsw_mt753x *gsw);
+#else
+static inline int mt753x_swconfig_init(struct gsw_mt753x *gsw)
+{
+       mt753x_apply_vlan_config(gsw);
+
+       return 0;
+}
+
+static inline void mt753x_swconfig_destroy(struct gsw_mt753x *gsw)
+{
+}
+#endif
+
+#endif /* _MT753X_SWCONFIG_H_ */
diff --git a/target/linux/mediatek/files-5.4/drivers/net/phy/mtk/mt753x/mt753x_vlan.c b/target/linux/mediatek/files-5.4/drivers/net/phy/mtk/mt753x/mt753x_vlan.c
new file mode 100644 (file)
index 0000000..f3c8c38
--- /dev/null
@@ -0,0 +1,183 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (c) 2018 MediaTek Inc.
+ */
+
+#include "mt753x.h"
+#include "mt753x_regs.h"
+
+struct mt753x_mapping mt753x_def_mapping[] = {
+       {
+               .name = "llllw",
+               .pvids = { 1, 1, 1, 1, 2, 2, 1 },
+               .members = { 0, 0x4f, 0x30 },
+               .etags = { 0, 0, 0 },
+               .vids = { 0, 1, 2 },
+       }, {
+               .name = "wllll",
+               .pvids = { 2, 1, 1, 1, 1, 2, 1 },
+               .members = { 0, 0x5e, 0x21 },
+               .etags = { 0, 0, 0 },
+               .vids = { 0, 1, 2 },
+       }, {
+               .name = "lwlll",
+               .pvids = { 1, 2, 1, 1, 1, 2, 1 },
+               .members = { 0, 0x5d, 0x22 },
+               .etags = { 0, 0, 0 },
+               .vids = { 0, 1, 2 },
+       },
+};
+
+void mt753x_vlan_ctrl(struct gsw_mt753x *gsw, u32 cmd, u32 val)
+{
+       int i;
+
+       mt753x_reg_write(gsw, VTCR,
+                        VTCR_BUSY | ((cmd << VTCR_FUNC_S) & VTCR_FUNC_M) |
+                        (val & VTCR_VID_M));
+
+       for (i = 0; i < 300; i++) {
+               u32 val = mt753x_reg_read(gsw, VTCR);
+
+               if ((val & VTCR_BUSY) == 0)
+                       break;
+
+               usleep_range(1000, 1100);
+       }
+
+       if (i == 300)
+               dev_info(gsw->dev, "vtcr timeout\n");
+}
+
+static void mt753x_write_vlan_entry(struct gsw_mt753x *gsw, int vlan, u16 vid,
+                                   u8 ports, u8 etags)
+{
+       int port;
+       u32 val;
+
+       /* vlan port membership */
+       if (ports)
+               mt753x_reg_write(gsw, VAWD1,
+                                IVL_MAC | VTAG_EN | VENTRY_VALID |
+                                ((ports << PORT_MEM_S) & PORT_MEM_M));
+       else
+               mt753x_reg_write(gsw, VAWD1, 0);
+
+       /* egress mode */
+       val = 0;
+       for (port = 0; port < MT753X_NUM_PORTS; port++) {
+               if (etags & BIT(port))
+                       val |= ETAG_CTRL_TAG << PORT_ETAG_S(port);
+               else
+                       val |= ETAG_CTRL_UNTAG << PORT_ETAG_S(port);
+       }
+       mt753x_reg_write(gsw, VAWD2, val);
+
+       /* write to vlan table */
+       mt753x_vlan_ctrl(gsw, VTCR_WRITE_VLAN_ENTRY, vid);
+}
+
+void mt753x_apply_vlan_config(struct gsw_mt753x *gsw)
+{
+       int i, j;
+       u8 tag_ports;
+       u8 untag_ports;
+
+       /* set all ports as security mode */
+       for (i = 0; i < MT753X_NUM_PORTS; i++)
+               mt753x_reg_write(gsw, PCR(i),
+                                PORT_MATRIX_M | SECURITY_MODE);
+
+       /* check if a port is used in tag/untag vlan egress mode */
+       tag_ports = 0;
+       untag_ports = 0;
+
+       for (i = 0; i < MT753X_NUM_VLANS; i++) {
+               u8 member = gsw->vlan_entries[i].member;
+               u8 etags = gsw->vlan_entries[i].etags;
+
+               if (!member)
+                       continue;
+
+               for (j = 0; j < MT753X_NUM_PORTS; j++) {
+                       if (!(member & BIT(j)))
+                               continue;
+
+                       if (etags & BIT(j))
+                               tag_ports |= 1u << j;
+                       else
+                               untag_ports |= 1u << j;
+               }
+       }
+
+       /* set all untag-only ports as transparent and the rest as user port */
+       for (i = 0; i < MT753X_NUM_PORTS; i++) {
+               u32 pvc_mode = 0x8100 << STAG_VPID_S;
+
+               if (untag_ports & BIT(i) && !(tag_ports & BIT(i)))
+                       pvc_mode = (0x8100 << STAG_VPID_S) |
+                               (VA_TRANSPARENT_PORT << VLAN_ATTR_S);
+
+               mt753x_reg_write(gsw, PVC(i), pvc_mode);
+       }
+
+       /* first clear the switch vlan table */
+       for (i = 0; i < MT753X_NUM_VLANS; i++)
+               mt753x_write_vlan_entry(gsw, i, i, 0, 0);
+
+       /* now program only vlans with members to avoid
+        * clobbering remapped entries in later iterations
+        */
+       for (i = 0; i < MT753X_NUM_VLANS; i++) {
+               u16 vid = gsw->vlan_entries[i].vid;
+               u8 member = gsw->vlan_entries[i].member;
+               u8 etags = gsw->vlan_entries[i].etags;
+
+               if (member)
+                       mt753x_write_vlan_entry(gsw, i, vid, member, etags);
+       }
+
+       /* Port Default PVID */
+       for (i = 0; i < MT753X_NUM_PORTS; i++) {
+               int vlan = gsw->port_entries[i].pvid;
+               u16 pvid = 0;
+               u32 val;
+
+               if (vlan < MT753X_NUM_VLANS && gsw->vlan_entries[vlan].member)
+                       pvid = gsw->vlan_entries[vlan].vid;
+
+               val = mt753x_reg_read(gsw, PPBV1(i));
+               val &= ~GRP_PORT_VID_M;
+               val |= pvid;
+               mt753x_reg_write(gsw, PPBV1(i), val);
+       }
+}
+
+struct mt753x_mapping *mt753x_find_mapping(struct device_node *np)
+{
+       const char *map;
+       int i;
+
+       if (of_property_read_string(np, "mediatek,portmap", &map))
+               return NULL;
+
+       for (i = 0; i < ARRAY_SIZE(mt753x_def_mapping); i++)
+               if (!strcmp(map, mt753x_def_mapping[i].name))
+                       return &mt753x_def_mapping[i];
+
+       return NULL;
+}
+
+void mt753x_apply_mapping(struct gsw_mt753x *gsw, struct mt753x_mapping *map)
+{
+       int i = 0;
+
+       for (i = 0; i < MT753X_NUM_PORTS; i++)
+               gsw->port_entries[i].pvid = map->pvids[i];
+
+       for (i = 0; i < MT753X_NUM_VLANS; i++) {
+               gsw->vlan_entries[i].member = map->members[i];
+               gsw->vlan_entries[i].etags = map->etags[i];
+               gsw->vlan_entries[i].vid = map->vids[i];
+       }
+}
diff --git a/target/linux/mediatek/files-5.4/drivers/net/phy/mtk/mt753x/mt753x_vlan.h b/target/linux/mediatek/files-5.4/drivers/net/phy/mtk/mt753x/mt753x_vlan.h
new file mode 100644 (file)
index 0000000..66c9cf9
--- /dev/null
@@ -0,0 +1,40 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (c) 2018 MediaTek Inc.
+ */
+
+#ifndef _MT753X_VLAN_H_
+#define _MT753X_VLAN_H_
+
+#define MT753X_NUM_PORTS       7
+#define MT753X_NUM_VLANS       4095
+#define MT753X_MAX_VID         4095
+#define MT753X_MIN_VID         0
+
+struct gsw_mt753x;
+
+struct mt753x_port_entry {
+       u16     pvid;
+};
+
+struct mt753x_vlan_entry {
+       u16     vid;
+       u8      member;
+       u8      etags;
+};
+
+struct mt753x_mapping {
+       char    *name;
+       u16     pvids[MT753X_NUM_PORTS];
+       u8      members[MT753X_NUM_VLANS];
+       u8      etags[MT753X_NUM_VLANS];
+       u16     vids[MT753X_NUM_VLANS];
+};
+
+extern struct mt753x_mapping mt753x_defaults[];
+
+void mt753x_vlan_ctrl(struct gsw_mt753x *gsw, u32 cmd, u32 val);
+void mt753x_apply_vlan_config(struct gsw_mt753x *gsw);
+struct mt753x_mapping *mt753x_find_mapping(struct device_node *np);
+void mt753x_apply_mapping(struct gsw_mt753x *gsw, struct mt753x_mapping *map);
+#endif /* _MT753X_VLAN_H_ */
diff --git a/target/linux/mediatek/mt7622/config-5.4 b/target/linux/mediatek/mt7622/config-5.4
new file mode 100755 (executable)
index 0000000..ec54bcd
--- /dev/null
@@ -0,0 +1,608 @@
+CONFIG_64BIT=y
+CONFIG_64BIT_TIME=y
+CONFIG_AHCI_MTK=y
+# CONFIG_ARCH_AGILEX is not set
+# CONFIG_ARCH_BITMAIN is not set
+CONFIG_ARCH_CLOCKSOURCE_DATA=y
+CONFIG_ARCH_DMA_ADDR_T_64BIT=y
+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
+CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y
+CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y
+CONFIG_ARCH_HAS_DEBUG_VIRTUAL=y
+CONFIG_ARCH_HAS_DMA_COHERENT_TO_PFN=y
+CONFIG_ARCH_HAS_DMA_PREP_COHERENT=y
+CONFIG_ARCH_HAS_ELF_RANDOMIZE=y
+CONFIG_ARCH_HAS_FAST_MULTIPLIER=y
+CONFIG_ARCH_HAS_FORTIFY_SOURCE=y
+CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y
+CONFIG_ARCH_HAS_GIGANTIC_PAGE=y
+CONFIG_ARCH_HAS_KCOV=y
+CONFIG_ARCH_HAS_KEEPINITRD=y
+CONFIG_ARCH_HAS_MEMBARRIER_SYNC_CORE=y
+CONFIG_ARCH_HAS_PTE_DEVMAP=y
+CONFIG_ARCH_HAS_PTE_SPECIAL=y
+CONFIG_ARCH_HAS_SETUP_DMA_OPS=y
+CONFIG_ARCH_HAS_SET_DIRECT_MAP=y
+CONFIG_ARCH_HAS_SET_MEMORY=y
+CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y
+CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y
+CONFIG_ARCH_HAS_SYNC_DMA_FOR_CPU=y
+CONFIG_ARCH_HAS_SYNC_DMA_FOR_DEVICE=y
+CONFIG_ARCH_HAS_SYSCALL_WRAPPER=y
+CONFIG_ARCH_HAS_TICK_BROADCAST=y
+CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y
+CONFIG_ARCH_INLINE_READ_LOCK=y
+CONFIG_ARCH_INLINE_READ_LOCK_BH=y
+CONFIG_ARCH_INLINE_READ_LOCK_IRQ=y
+CONFIG_ARCH_INLINE_READ_LOCK_IRQSAVE=y
+CONFIG_ARCH_INLINE_READ_UNLOCK=y
+CONFIG_ARCH_INLINE_READ_UNLOCK_BH=y
+CONFIG_ARCH_INLINE_READ_UNLOCK_IRQ=y
+CONFIG_ARCH_INLINE_READ_UNLOCK_IRQRESTORE=y
+CONFIG_ARCH_INLINE_SPIN_LOCK=y
+CONFIG_ARCH_INLINE_SPIN_LOCK_BH=y
+CONFIG_ARCH_INLINE_SPIN_LOCK_IRQ=y
+CONFIG_ARCH_INLINE_SPIN_LOCK_IRQSAVE=y
+CONFIG_ARCH_INLINE_SPIN_TRYLOCK=y
+CONFIG_ARCH_INLINE_SPIN_TRYLOCK_BH=y
+CONFIG_ARCH_INLINE_SPIN_UNLOCK=y
+CONFIG_ARCH_INLINE_SPIN_UNLOCK_BH=y
+CONFIG_ARCH_INLINE_SPIN_UNLOCK_IRQ=y
+CONFIG_ARCH_INLINE_SPIN_UNLOCK_IRQRESTORE=y
+CONFIG_ARCH_INLINE_WRITE_LOCK=y
+CONFIG_ARCH_INLINE_WRITE_LOCK_BH=y
+CONFIG_ARCH_INLINE_WRITE_LOCK_IRQ=y
+CONFIG_ARCH_INLINE_WRITE_LOCK_IRQSAVE=y
+CONFIG_ARCH_INLINE_WRITE_UNLOCK=y
+CONFIG_ARCH_INLINE_WRITE_UNLOCK_BH=y
+CONFIG_ARCH_INLINE_WRITE_UNLOCK_IRQ=y
+CONFIG_ARCH_INLINE_WRITE_UNLOCK_IRQRESTORE=y
+CONFIG_ARCH_KEEP_MEMBLOCK=y
+CONFIG_ARCH_MEDIATEK=y
+CONFIG_ARCH_MMAP_RND_BITS=18
+CONFIG_ARCH_MMAP_RND_BITS_MAX=24
+CONFIG_ARCH_MMAP_RND_BITS_MIN=18
+CONFIG_ARCH_MMAP_RND_COMPAT_BITS=11
+CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MIN=11
+CONFIG_ARCH_PROC_KCORE_TEXT=y
+CONFIG_ARCH_SELECT_MEMORY_MODEL=y
+CONFIG_ARCH_SPARSEMEM_DEFAULT=y
+CONFIG_ARCH_SPARSEMEM_ENABLE=y
+CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y
+CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y
+CONFIG_ARCH_SUPPORTS_INT128=y
+CONFIG_ARCH_SUPPORTS_MEMORY_FAILURE=y
+CONFIG_ARCH_SUPPORTS_NUMA_BALANCING=y
+CONFIG_ARCH_SUPPORTS_UPROBES=y
+CONFIG_ARCH_SUSPEND_POSSIBLE=y
+CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y
+CONFIG_ARCH_USE_MEMREMAP_PROT=y
+CONFIG_ARCH_USE_QUEUED_RWLOCKS=y
+CONFIG_ARCH_USE_QUEUED_SPINLOCKS=y
+CONFIG_ARCH_WANT_COMPAT_IPC_PARSE_VERSION=y
+CONFIG_ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT=y
+CONFIG_ARCH_WANT_FRAME_POINTERS=y
+CONFIG_ARCH_WANT_HUGE_PMD_SHARE=y
+CONFIG_ARM64=y
+# CONFIG_ARM64_16K_PAGES is not set
+CONFIG_ARM64_4K_PAGES=y
+# CONFIG_ARM64_64K_PAGES is not set
+CONFIG_ARM64_CNP=y
+CONFIG_ARM64_CONT_SHIFT=4
+# CONFIG_ARM64_CRYPTO is not set
+CONFIG_ARM64_ERRATUM_1165522=y
+CONFIG_ARM64_ERRATUM_1286807=y
+CONFIG_ARM64_ERRATUM_1418040=y
+CONFIG_ARM64_HW_AFDBM=y
+# CONFIG_ARM64_LSE_ATOMICS is not set
+# CONFIG_ARM64_MODULE_PLTS is not set
+CONFIG_ARM64_PAGE_SHIFT=12
+CONFIG_ARM64_PAN=y
+CONFIG_ARM64_PA_BITS=48
+CONFIG_ARM64_PA_BITS_48=y
+# CONFIG_ARM64_PMEM is not set
+# CONFIG_ARM64_PSEUDO_NMI is not set
+# CONFIG_ARM64_PTDUMP_DEBUGFS is not set
+CONFIG_ARM64_PTR_AUTH=y
+# CONFIG_ARM64_RANDOMIZE_TEXT_OFFSET is not set
+CONFIG_ARM64_SSBD=y
+CONFIG_ARM64_SVE=y
+# CONFIG_ARM64_SW_TTBR0_PAN is not set
+CONFIG_ARM64_TAGGED_ADDR_ABI=y
+CONFIG_ARM64_UAO=y
+CONFIG_ARM64_VA_BITS=39
+CONFIG_ARM64_VA_BITS_39=y
+# CONFIG_ARM64_VA_BITS_48 is not set
+CONFIG_ARM64_VHE=y
+CONFIG_ARM64_WORKAROUND_REPEAT_TLBI=y
+# CONFIG_ARMV8_DEPRECATED is not set
+CONFIG_ARM_AMBA=y
+CONFIG_ARM_ARCH_TIMER=y
+CONFIG_ARM_ARCH_TIMER_EVTSTREAM=y
+CONFIG_ARM_GIC=y
+CONFIG_ARM_GIC_V2M=y
+CONFIG_ARM_GIC_V3=y
+CONFIG_ARM_GIC_V3_ITS=y
+CONFIG_ARM_GIC_V3_ITS_PCI=y
+CONFIG_ARM_MEDIATEK_CPUFREQ=y
+CONFIG_ARM_PMU=y
+CONFIG_ARM_PSCI_FW=y
+# CONFIG_ARM_SP805_WATCHDOG is not set
+CONFIG_ATA=y
+CONFIG_AUDIT_ARCH_COMPAT_GENERIC=y
+# CONFIG_BACKLIGHT_CLASS_DEVICE is not set
+CONFIG_BLK_DEV_SD=y
+CONFIG_BLK_MQ_PCI=y
+CONFIG_BLK_PM=y
+CONFIG_BLK_SCSI_REQUEST=y
+CONFIG_BLOCK_COMPAT=y
+CONFIG_BSD_PROCESS_ACCT=y
+CONFIG_BSD_PROCESS_ACCT_V3=y
+CONFIG_BT=y
+CONFIG_BT_BCM=y
+CONFIG_BT_BREDR=y
+CONFIG_BT_DEBUGFS=y
+CONFIG_BT_HCIUART=y
+CONFIG_BT_HCIUART_BCM=y
+# CONFIG_BT_HCIUART_INTEL is not set
+# CONFIG_BT_HCIUART_NOKIA is not set
+CONFIG_BT_HCIUART_QCA=y
+CONFIG_BT_HCIUART_SERDEV=y
+CONFIG_BT_HCIVHCI=y
+CONFIG_BT_HS=y
+CONFIG_BT_LE=y
+CONFIG_BT_MTKUART=y
+CONFIG_BT_QCA=y
+CONFIG_CAVIUM_TX2_ERRATUM_219=y
+CONFIG_CC_CAN_LINK=y
+CONFIG_CC_HAS_ASM_INLINE=y
+CONFIG_CC_HAS_KASAN_GENERIC=y
+CONFIG_CC_HAS_WARN_MAYBE_UNINITIALIZED=y
+CONFIG_CLKDEV_LOOKUP=y
+CONFIG_CLKSRC_MMIO=y
+CONFIG_CLOCK_THERMAL=y
+CONFIG_CLONE_BACKWARDS=y
+CONFIG_COMMON_CLK=y
+CONFIG_COMMON_CLK_MEDIATEK=y
+CONFIG_COMMON_CLK_MT2712=y
+# CONFIG_COMMON_CLK_MT2712_BDPSYS is not set
+# CONFIG_COMMON_CLK_MT2712_IMGSYS is not set
+# CONFIG_COMMON_CLK_MT2712_JPGDECSYS is not set
+# CONFIG_COMMON_CLK_MT2712_MFGCFG is not set
+# CONFIG_COMMON_CLK_MT2712_MMSYS is not set
+# CONFIG_COMMON_CLK_MT2712_VDECSYS is not set
+# CONFIG_COMMON_CLK_MT2712_VENCSYS is not set
+# CONFIG_COMMON_CLK_MT6779 is not set
+# CONFIG_COMMON_CLK_MT6797 is not set
+CONFIG_COMMON_CLK_MT7622=y
+CONFIG_COMMON_CLK_MT7622_AUDSYS=y
+CONFIG_COMMON_CLK_MT7622_ETHSYS=y
+CONFIG_COMMON_CLK_MT7622_HIFSYS=y
+# CONFIG_COMMON_CLK_MT8173 is not set
+CONFIG_COMMON_CLK_MT8183=y
+# CONFIG_COMMON_CLK_MT8183_AUDIOSYS is not set
+# CONFIG_COMMON_CLK_MT8183_CAMSYS is not set
+# CONFIG_COMMON_CLK_MT8183_IMGSYS is not set
+# CONFIG_COMMON_CLK_MT8183_IPU_ADL is not set
+# CONFIG_COMMON_CLK_MT8183_IPU_CONN is not set
+# CONFIG_COMMON_CLK_MT8183_IPU_CORE0 is not set
+# CONFIG_COMMON_CLK_MT8183_IPU_CORE1 is not set
+# CONFIG_COMMON_CLK_MT8183_MFGCFG is not set
+# CONFIG_COMMON_CLK_MT8183_MMSYS is not set
+# CONFIG_COMMON_CLK_MT8183_VDECSYS is not set
+# CONFIG_COMMON_CLK_MT8183_VENCSYS is not set
+CONFIG_COMMON_CLK_MT8516=y
+# CONFIG_COMMON_CLK_MT8516_AUDSYS is not set
+CONFIG_COMPAT=y
+CONFIG_COMPAT_32BIT_TIME=y
+CONFIG_COMPAT_BINFMT_ELF=y
+CONFIG_COMPAT_OLD_SIGACTION=y
+CONFIG_CONSOLE_LOGLEVEL_DEFAULT=15
+# CONFIG_CPUFREQ_DT is not set
+# CONFIG_CPU_BIG_ENDIAN is not set
+CONFIG_CPU_FREQ=y
+# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set
+CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE=y
+CONFIG_CPU_FREQ_GOV_ATTR_SET=y
+CONFIG_CPU_FREQ_GOV_COMMON=y
+CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y
+CONFIG_CPU_FREQ_GOV_ONDEMAND=y
+CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
+CONFIG_CPU_FREQ_GOV_POWERSAVE=y
+CONFIG_CPU_FREQ_GOV_SCHEDUTIL=y
+CONFIG_CPU_FREQ_GOV_USERSPACE=y
+CONFIG_CPU_FREQ_STAT=y
+CONFIG_CPU_RMAP=y
+CONFIG_CPU_THERMAL=y
+CONFIG_CRC16=y
+CONFIG_CRYPTO_ACOMP2=y
+CONFIG_CRYPTO_AEAD=y
+CONFIG_CRYPTO_AEAD2=y
+CONFIG_CRYPTO_AKCIPHER2=y
+CONFIG_CRYPTO_CMAC=y
+CONFIG_CRYPTO_DRBG=y
+CONFIG_CRYPTO_DRBG_HMAC=y
+CONFIG_CRYPTO_DRBG_MENU=y
+CONFIG_CRYPTO_ECB=y
+CONFIG_CRYPTO_ECC=y
+CONFIG_CRYPTO_ECDH=y
+CONFIG_CRYPTO_HASH=y
+CONFIG_CRYPTO_HASH2=y
+CONFIG_CRYPTO_HMAC=y
+CONFIG_CRYPTO_JITTERENTROPY=y
+CONFIG_CRYPTO_KPP=y
+CONFIG_CRYPTO_KPP2=y
+CONFIG_CRYPTO_LIB_AES=y
+CONFIG_CRYPTO_LIB_SHA256=y
+CONFIG_CRYPTO_MANAGER=y
+CONFIG_CRYPTO_MANAGER2=y
+CONFIG_CRYPTO_NULL2=y
+CONFIG_CRYPTO_RNG=y
+CONFIG_CRYPTO_RNG2=y
+CONFIG_CRYPTO_RNG_DEFAULT=y
+CONFIG_CRYPTO_SHA256=y
+CONFIG_DCACHE_WORD_ACCESS=y
+CONFIG_DEBUG_MISC=y
+CONFIG_DEVTMPFS=y
+CONFIG_DEVTMPFS_MOUNT=y
+CONFIG_DMADEVICES=y
+CONFIG_DMATEST=y
+CONFIG_DMA_DECLARE_COHERENT=y
+CONFIG_DMA_DIRECT_REMAP=y
+CONFIG_DMA_ENGINE=y
+CONFIG_DMA_ENGINE_RAID=y
+CONFIG_DMA_OF=y
+CONFIG_DMA_REMAP=y
+CONFIG_DMA_VIRTUAL_CHANNELS=y
+CONFIG_DRM_RCAR_WRITEBACK=y
+CONFIG_DTC=y
+CONFIG_DYNAMIC_DEBUG=y
+CONFIG_EDAC_SUPPORT=y
+CONFIG_EFI_EARLYCON=y
+CONFIG_EINT_MTK=y
+# CONFIG_ENERGY_MODEL is not set
+CONFIG_FIXED_PHY=y
+CONFIG_FIX_EARLYCON_MEM=y
+# CONFIG_FLATMEM_MANUAL is not set
+CONFIG_FONT_8x16=y
+CONFIG_FONT_AUTOSELECT=y
+CONFIG_FONT_SUPPORT=y
+CONFIG_FRAME_POINTER=y
+# CONFIG_FSL_QDMA is not set
+CONFIG_FUJITSU_ERRATUM_010001=y
+CONFIG_FW_LOADER_PAGED_BUF=y
+CONFIG_GENERIC_ALLOCATOR=y
+CONFIG_GENERIC_ARCH_TOPOLOGY=y
+CONFIG_GENERIC_BUG=y
+CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y
+CONFIG_GENERIC_CLOCKEVENTS=y
+CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y
+CONFIG_GENERIC_CPU_AUTOPROBE=y
+CONFIG_GENERIC_CPU_VULNERABILITIES=y
+CONFIG_GENERIC_CSUM=y
+CONFIG_GENERIC_EARLY_IOREMAP=y
+CONFIG_GENERIC_GETTIMEOFDAY=y
+CONFIG_GENERIC_IDLE_POLL_SETUP=y
+CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y
+CONFIG_GENERIC_IRQ_MULTI_HANDLER=y
+CONFIG_GENERIC_IRQ_SHOW=y
+CONFIG_GENERIC_IRQ_SHOW_LEVEL=y
+CONFIG_GENERIC_MSI_IRQ=y
+CONFIG_GENERIC_MSI_IRQ_DOMAIN=y
+CONFIG_GENERIC_PCI_IOMAP=y
+CONFIG_GENERIC_PHY=y
+CONFIG_GENERIC_PINCONF=y
+CONFIG_GENERIC_PINCTRL_GROUPS=y
+CONFIG_GENERIC_PINMUX_FUNCTIONS=y
+CONFIG_GENERIC_SCHED_CLOCK=y
+CONFIG_GENERIC_SMP_IDLE_THREAD=y
+CONFIG_GENERIC_STRNCPY_FROM_USER=y
+CONFIG_GENERIC_STRNLEN_USER=y
+CONFIG_GENERIC_TIME_VSYSCALL=y
+CONFIG_GLOB=y
+CONFIG_GPIOLIB=y
+# CONFIG_GVE is not set
+# CONFIG_HABANA_AI is not set
+CONFIG_HANDLE_DOMAIN_IRQ=y
+CONFIG_HARDEN_BRANCH_PREDICTOR=y
+CONFIG_HARDIRQS_SW_RESEND=y
+CONFIG_HAS_DMA=y
+CONFIG_HAS_IOMEM=y
+CONFIG_HAS_IOPORT_MAP=y
+CONFIG_HAVE_ALIGNED_STRUCT_PAGE=y
+CONFIG_HAVE_ARCH_AUDITSYSCALL=y
+CONFIG_HAVE_ARCH_BITREVERSE=y
+CONFIG_HAVE_ARCH_HUGE_VMAP=y
+CONFIG_HAVE_ARCH_JUMP_LABEL=y
+CONFIG_HAVE_ARCH_JUMP_LABEL_RELATIVE=y
+CONFIG_HAVE_ARCH_KASAN=y
+CONFIG_HAVE_ARCH_KASAN_SW_TAGS=y
+CONFIG_HAVE_ARCH_KGDB=y
+CONFIG_HAVE_ARCH_MMAP_RND_COMPAT_BITS=y
+CONFIG_HAVE_ARCH_PFN_VALID=y
+CONFIG_HAVE_ARCH_PREL32_RELOCATIONS=y
+CONFIG_HAVE_ARCH_SECCOMP_FILTER=y
+CONFIG_HAVE_ARCH_STACKLEAK=y
+CONFIG_HAVE_ARCH_THREAD_STRUCT_WHITELIST=y
+CONFIG_HAVE_ARCH_TRACEHOOK=y
+CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=y
+CONFIG_HAVE_ARCH_VMAP_STACK=y
+CONFIG_HAVE_ARM_SMCCC=y
+CONFIG_HAVE_ASM_MODVERSIONS=y
+CONFIG_HAVE_CLK=y
+CONFIG_HAVE_CLK_PREPARE=y
+CONFIG_HAVE_CMPXCHG_DOUBLE=y
+CONFIG_HAVE_CMPXCHG_LOCAL=y
+CONFIG_HAVE_CONTEXT_TRACKING=y
+CONFIG_HAVE_C_RECORDMCOUNT=y
+CONFIG_HAVE_DEBUG_BUGVERBOSE=y
+CONFIG_HAVE_DEBUG_KMEMLEAK=y
+CONFIG_HAVE_DMA_CONTIGUOUS=y
+CONFIG_HAVE_DYNAMIC_FTRACE=y
+CONFIG_HAVE_EBPF_JIT=y
+CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y
+CONFIG_HAVE_FAST_GUP=y
+CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y
+CONFIG_HAVE_FUNCTION_ARG_ACCESS_API=y
+CONFIG_HAVE_FUNCTION_ERROR_INJECTION=y
+CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y
+CONFIG_HAVE_FUNCTION_TRACER=y
+CONFIG_HAVE_GENERIC_VDSO=y
+CONFIG_HAVE_HW_BREAKPOINT=y
+CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y
+CONFIG_HAVE_MEMORY_PRESENT=y
+CONFIG_HAVE_NET_DSA=y
+CONFIG_HAVE_PATA_PLATFORM=y
+CONFIG_HAVE_PCI=y
+CONFIG_HAVE_PERF_EVENTS=y
+CONFIG_HAVE_PERF_REGS=y
+CONFIG_HAVE_PERF_USER_STACK_DUMP=y
+CONFIG_HAVE_RCU_TABLE_FREE=y
+CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y
+CONFIG_HAVE_RSEQ=y
+CONFIG_HAVE_SCHED_AVG_IRQ=y
+CONFIG_HAVE_SYSCALL_TRACEPOINTS=y
+CONFIG_HAVE_UID16=y
+CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y
+CONFIG_HOLES_IN_ZONE=y
+# CONFIG_HUGETLBFS is not set
+CONFIG_ICPLUS_PHY=y
+# CONFIG_IGC is not set
+CONFIG_IIO=y
+# CONFIG_IIO_BUFFER is not set
+# CONFIG_IIO_TRIGGER is not set
+CONFIG_IKCONFIG=y
+CONFIG_IKCONFIG_PROC=y
+CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_INIT_STACK_NONE=y
+CONFIG_INLINE_READ_LOCK=y
+CONFIG_INLINE_READ_LOCK_BH=y
+CONFIG_INLINE_READ_LOCK_IRQ=y
+CONFIG_INLINE_READ_LOCK_IRQSAVE=y
+CONFIG_INLINE_READ_UNLOCK_BH=y
+CONFIG_INLINE_READ_UNLOCK_IRQRESTORE=y
+CONFIG_INLINE_SPIN_LOCK=y
+CONFIG_INLINE_SPIN_LOCK_BH=y
+CONFIG_INLINE_SPIN_LOCK_IRQ=y
+CONFIG_INLINE_SPIN_LOCK_IRQSAVE=y
+CONFIG_INLINE_SPIN_TRYLOCK=y
+CONFIG_INLINE_SPIN_TRYLOCK_BH=y
+CONFIG_INLINE_SPIN_UNLOCK_BH=y
+CONFIG_INLINE_SPIN_UNLOCK_IRQRESTORE=y
+CONFIG_INLINE_WRITE_LOCK=y
+CONFIG_INLINE_WRITE_LOCK_BH=y
+CONFIG_INLINE_WRITE_LOCK_IRQ=y
+CONFIG_INLINE_WRITE_LOCK_IRQSAVE=y
+CONFIG_INLINE_WRITE_UNLOCK_BH=y
+CONFIG_INLINE_WRITE_UNLOCK_IRQRESTORE=y
+# CONFIG_IONIC is not set
+CONFIG_IO_URING=y
+CONFIG_IRQCHIP=y
+CONFIG_IRQ_DOMAIN=y
+CONFIG_IRQ_DOMAIN_HIERARCHY=y
+CONFIG_IRQ_FORCED_THREADING=y
+CONFIG_IRQ_TIME_ACCOUNTING=y
+CONFIG_IRQ_WORK=y
+CONFIG_JUMP_LABEL=y
+CONFIG_KASAN_STACK=1
+CONFIG_LIBFDT=y
+CONFIG_LOCK_DEBUGGING_SUPPORT=y
+CONFIG_LOCK_SPIN_ON_OWNER=y
+CONFIG_MAGIC_SYSRQ=y
+CONFIG_MDIO_BUS=y
+CONFIG_MDIO_DEVICE=y
+CONFIG_MEDIATEK_MT6577_AUXADC=y
+CONFIG_MEDIATEK_WATCHDOG=y
+CONFIG_MEDIA_SUPPORT=y
+CONFIG_MEMFD_CREATE=y
+# CONFIG_MEMORY_HOTPLUG is not set
+CONFIG_MESSAGE_LOGLEVEL_DEFAULT=7
+CONFIG_MFD_SYSCON=y
+CONFIG_MIGRATION=y
+# CONFIG_MISC_ALCOR_PCI is not set
+CONFIG_MMC=y
+CONFIG_MMC_MTK=y
+# CONFIG_MMC_TIFM_SD is not set
+CONFIG_MODULES_TREE_LOOKUP=y
+CONFIG_MODULES_USE_ELF_RELA=y
+CONFIG_MT753X_GSW=y
+CONFIG_MTD_NAND_CORE=y
+CONFIG_MTD_SPI_NAND=y
+CONFIG_MTD_SPI_NOR=y
+# CONFIG_MTK_CMDQ is not set
+# CONFIG_MTK_CQDMA is not set
+CONFIG_MTK_EFUSE=y
+CONFIG_MTK_HSDMA=y
+CONFIG_MTK_INFRACFG=y
+CONFIG_MTK_PMIC_WRAP=y
+CONFIG_MTK_SCPSYS=y
+CONFIG_MTK_THERMAL=y
+CONFIG_MTK_TIMER=y
+# CONFIG_MTK_UART_APDMA is not set
+CONFIG_MUTEX_SPIN_ON_OWNER=y
+CONFIG_NEED_DMA_MAP_STATE=y
+CONFIG_NEED_SG_DMA_LENGTH=y
+CONFIG_NET_FLOW_LIMIT=y
+CONFIG_NET_MEDIATEK_SOC=y
+CONFIG_NET_VENDOR_MEDIATEK=y
+CONFIG_NLS=y
+CONFIG_NO_HZ_COMMON=y
+CONFIG_NO_HZ_IDLE=y
+CONFIG_NR_CPUS=2
+# CONFIG_NUMA is not set
+CONFIG_NVMEM=y
+# CONFIG_NVMEM_REBOOT_MODE is not set
+CONFIG_NVMEM_SYSFS=y
+# CONFIG_OCTEONTX2_AF is not set
+CONFIG_OF=y
+CONFIG_OF_ADDRESS=y
+CONFIG_OF_EARLY_FLATTREE=y
+CONFIG_OF_FLATTREE=y
+CONFIG_OF_GPIO=y
+CONFIG_OF_IRQ=y
+CONFIG_OF_KOBJ=y
+CONFIG_OF_MDIO=y
+CONFIG_OF_NET=y
+CONFIG_OF_RESERVED_MEM=y
+CONFIG_OLD_SIGSUSPEND3=y
+CONFIG_PADATA=y
+CONFIG_PARTITION_PERCPU=y
+CONFIG_PCI=y
+# CONFIG_PCIE_AL is not set
+CONFIG_PCIE_MEDIATEK=y
+CONFIG_PCI_DEBUG=y
+CONFIG_PCI_DOMAINS=y
+CONFIG_PCI_DOMAINS_GENERIC=y
+# CONFIG_PCI_MESON is not set
+CONFIG_PCI_MSI=y
+CONFIG_PCI_MSI_IRQ_DOMAIN=y
+CONFIG_PERF_EVENTS=y
+CONFIG_PGTABLE_LEVELS=3
+CONFIG_PHYLIB=y
+CONFIG_PHYLINK=y
+CONFIG_PHYS_ADDR_T_64BIT=y
+CONFIG_PHY_MTK_TPHY=y
+# CONFIG_PHY_MTK_UFS is not set
+# CONFIG_PHY_MTK_XSPHY is not set
+CONFIG_PINCTRL=y
+# CONFIG_PINCTRL_MT2712 is not set
+# CONFIG_PINCTRL_MT6765 is not set
+# CONFIG_PINCTRL_MT6797 is not set
+CONFIG_PINCTRL_MT7622=y
+# CONFIG_PINCTRL_MT8173 is not set
+# CONFIG_PINCTRL_MT8183 is not set
+CONFIG_PINCTRL_MT8516=y
+CONFIG_PINCTRL_MTK=y
+CONFIG_PINCTRL_MTK_MOORE=y
+CONFIG_PM=y
+# CONFIG_PMS7003 is not set
+CONFIG_PM_CLK=y
+# CONFIG_PM_DEBUG is not set
+CONFIG_PM_GENERIC_DOMAINS=y
+CONFIG_PM_GENERIC_DOMAINS_OF=y
+CONFIG_PM_OPP=y
+CONFIG_POWER_RESET=y
+CONFIG_POWER_RESET_SYSCON=y
+CONFIG_POWER_SUPPLY=y
+CONFIG_PRINTK_TIME=y
+CONFIG_PWM=y
+CONFIG_PWM_MEDIATEK=y
+# CONFIG_PWM_MTK_DISP is not set
+CONFIG_PWM_SYSFS=y
+CONFIG_QUEUED_RWLOCKS=y
+CONFIG_QUEUED_SPINLOCKS=y
+# CONFIG_RANDOMIZE_BASE is not set
+CONFIG_RAS=y
+CONFIG_RATIONAL=y
+# CONFIG_RAVE_SP_CORE is not set
+CONFIG_RCU_NEED_SEGCBLIST=y
+CONFIG_RCU_STALL_COMMON=y
+CONFIG_REALTEK_PHY=y
+CONFIG_REFCOUNT_FULL=y
+CONFIG_REGMAP=y
+CONFIG_REGMAP_MMIO=y
+CONFIG_REGMAP_SPI=y
+CONFIG_REGULATOR=y
+CONFIG_REGULATOR_FIXED_VOLTAGE=y
+CONFIG_REGULATOR_MT6380=y
+CONFIG_RESET_CONTROLLER=y
+CONFIG_RFKILL_LEDS=y
+CONFIG_RFS_ACCEL=y
+CONFIG_RODATA_FULL_DEFAULT_ENABLED=y
+CONFIG_RPS=y
+CONFIG_RTC_CLASS=y
+CONFIG_RTC_DRV_MT7622=y
+CONFIG_RTC_I2C_AND_SPI=y
+CONFIG_RWSEM_SPIN_ON_OWNER=y
+CONFIG_SCHED_MC=y
+CONFIG_SCSI=y
+# CONFIG_SCSI_MYRS is not set
+# CONFIG_SECTION_MISMATCH_WARN_ONLY is not set
+CONFIG_SERIAL_8250_FSL=y
+CONFIG_SERIAL_8250_MT6577=y
+CONFIG_SERIAL_8250_NR_UARTS=3
+CONFIG_SERIAL_8250_RUNTIME_UARTS=3
+# CONFIG_SERIAL_AMBA_PL011 is not set
+CONFIG_SERIAL_DEV_BUS=y
+CONFIG_SERIAL_DEV_CTRL_TTYPORT=y
+CONFIG_SERIAL_MCTRL_GPIO=y
+CONFIG_SERIAL_OF_PLATFORM=y
+CONFIG_SGL_ALLOC=y
+CONFIG_SG_POOL=y
+CONFIG_SMP=y
+CONFIG_SPARSEMEM=y
+CONFIG_SPARSEMEM_EXTREME=y
+CONFIG_SPARSEMEM_MANUAL=y
+CONFIG_SPARSEMEM_VMEMMAP=y
+CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y
+CONFIG_SPARSE_IRQ=y
+CONFIG_SPI=y
+CONFIG_SPI_MASTER=y
+CONFIG_SPI_MEM=y
+CONFIG_SPI_MT65XX=y
+CONFIG_SRCU=y
+CONFIG_SWIOTLB=y
+CONFIG_SWPHY=y
+CONFIG_SYSCTL_EXCEPTION_TRACE=y
+CONFIG_SYSVIPC_COMPAT=y
+CONFIG_SYS_SUPPORTS_HUGETLBFS=y
+CONFIG_THERMAL=y
+CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y
+CONFIG_THERMAL_EMERGENCY_POWEROFF_DELAY_MS=0
+CONFIG_THERMAL_EMULATION=y
+CONFIG_THERMAL_GOV_BANG_BANG=y
+CONFIG_THERMAL_GOV_FAIR_SHARE=y
+CONFIG_THERMAL_GOV_POWER_ALLOCATOR=y
+CONFIG_THERMAL_GOV_STEP_WISE=y
+CONFIG_THERMAL_GOV_USER_SPACE=y
+CONFIG_THERMAL_OF=y
+CONFIG_THERMAL_WRITABLE_TRIPS=y
+CONFIG_THREAD_INFO_IN_TASK=y
+CONFIG_TICK_CPU_ACCOUNTING=y
+CONFIG_TIMER_OF=y
+CONFIG_TIMER_PROBE=y
+# CONFIG_TI_CPSW_PHY_SEL is not set
+CONFIG_TREE_RCU=y
+CONFIG_TREE_SRCU=y
+CONFIG_UBSAN_ALIGNMENT=y
+# CONFIG_UCLAMP_TASK is not set
+CONFIG_UNIX_SCM=y
+# CONFIG_UNMAP_KERNEL_AT_EL0 is not set
+CONFIG_USB=y
+CONFIG_USB_COMMON=y
+# CONFIG_USB_EHCI_HCD is not set
+CONFIG_USB_SUPPORT=y
+CONFIG_USB_XHCI_HCD=y
+CONFIG_USB_XHCI_MTK=y
+# CONFIG_USB_XHCI_PLATFORM is not set
+CONFIG_VMAP_STACK=y
+CONFIG_WATCHDOG_CORE=y
+CONFIG_WATCHDOG_PRETIMEOUT_DEFAULT_GOV_PANIC=y
+CONFIG_WATCHDOG_PRETIMEOUT_GOV=y
+# CONFIG_WATCHDOG_PRETIMEOUT_GOV_NOOP is not set
+CONFIG_WATCHDOG_PRETIMEOUT_GOV_PANIC=y
+CONFIG_WATCHDOG_PRETIMEOUT_GOV_SEL=m
+CONFIG_WATCHDOG_SYSFS=y
+CONFIG_XPS=y
+CONFIG_ZONE_DMA32=y
diff --git a/target/linux/mediatek/mt7623/config-5.4 b/target/linux/mediatek/mt7623/config-5.4
new file mode 100644 (file)
index 0000000..61c07dd
--- /dev/null
@@ -0,0 +1,571 @@
+CONFIG_64BIT_TIME=y
+# CONFIG_AIO is not set
+CONFIG_ALIGNMENT_TRAP=y
+CONFIG_ARCH_32BIT_OFF_T=y
+CONFIG_ARCH_CLOCKSOURCE_DATA=y
+CONFIG_ARCH_HAS_BINFMT_FLAT=y
+CONFIG_ARCH_HAS_DEBUG_VIRTUAL=y
+CONFIG_ARCH_HAS_ELF_RANDOMIZE=y
+CONFIG_ARCH_HAS_FORTIFY_SOURCE=y
+CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y
+CONFIG_ARCH_HAS_KCOV=y
+CONFIG_ARCH_HAS_KEEPINITRD=y
+CONFIG_ARCH_HAS_MEMBARRIER_SYNC_CORE=y
+CONFIG_ARCH_HAS_PHYS_TO_DMA=y
+CONFIG_ARCH_HAS_SETUP_DMA_OPS=y
+CONFIG_ARCH_HAS_SET_MEMORY=y
+CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y
+CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y
+CONFIG_ARCH_HAS_TEARDOWN_DMA_OPS=y
+CONFIG_ARCH_HAS_TICK_BROADCAST=y
+CONFIG_ARCH_HAVE_CUSTOM_GPIO_H=y
+CONFIG_ARCH_HIBERNATION_POSSIBLE=y
+CONFIG_ARCH_KEEP_MEMBLOCK=y
+CONFIG_ARCH_MEDIATEK=y
+CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y
+# CONFIG_ARCH_MILBEAUT is not set
+CONFIG_ARCH_MULTIPLATFORM=y
+CONFIG_ARCH_MULTI_V6_V7=y
+CONFIG_ARCH_MULTI_V7=y
+CONFIG_ARCH_NR_GPIO=0
+CONFIG_ARCH_OPTIONAL_KERNEL_RWX=y
+CONFIG_ARCH_OPTIONAL_KERNEL_RWX_DEFAULT=y
+# CONFIG_ARCH_RDA is not set
+CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y
+CONFIG_ARCH_SUPPORTS_UPROBES=y
+CONFIG_ARCH_SUSPEND_POSSIBLE=y
+CONFIG_ARCH_USE_BUILTIN_BSWAP=y
+CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y
+CONFIG_ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT=y
+CONFIG_ARCH_WANT_GENERAL_HUGETLB=y
+CONFIG_ARCH_WANT_IPC_PARSE_VERSION=y
+CONFIG_ARM=y
+CONFIG_ARM_APPENDED_DTB=y
+CONFIG_ARM_ARCH_TIMER=y
+CONFIG_ARM_ARCH_TIMER_EVTSTREAM=y
+# CONFIG_ARM_ATAG_DTB_COMPAT is not set
+CONFIG_ARM_CPU_SUSPEND=y
+# CONFIG_ARM_CPU_TOPOLOGY is not set
+# CONFIG_ARM_ERRATA_814220 is not set
+# CONFIG_ARM_ERRATA_857271 is not set
+# CONFIG_ARM_ERRATA_857272 is not set
+CONFIG_ARM_GIC=y
+CONFIG_ARM_HAS_SG_CHAIN=y
+CONFIG_ARM_L1_CACHE_SHIFT=6
+CONFIG_ARM_L1_CACHE_SHIFT_6=y
+# CONFIG_ARM_LPAE is not set
+CONFIG_ARM_MEDIATEK_CPUFREQ=y
+CONFIG_ARM_PATCH_IDIV=y
+CONFIG_ARM_PATCH_PHYS_VIRT=y
+# CONFIG_ARM_SMMU is not set
+CONFIG_ARM_THUMB=y
+CONFIG_ARM_THUMBEE=y
+CONFIG_ARM_UNWIND=y
+CONFIG_ARM_VIRT_EXT=y
+CONFIG_ATAGS=y
+CONFIG_AUTO_ZRELADDR=y
+# CONFIG_BACKLIGHT_CLASS_DEVICE is not set
+CONFIG_BINFMT_FLAT_ARGVP_ENVP_ON_STACK=y
+CONFIG_BLK_DEV_LOOP=y
+CONFIG_BLK_MQ_PCI=y
+CONFIG_BLK_PM=y
+CONFIG_BOUNCE=y
+# CONFIG_CACHE_L2X0 is not set
+CONFIG_CC_CAN_LINK=y
+CONFIG_CC_HAS_ASM_INLINE=y
+CONFIG_CC_HAS_KASAN_GENERIC=y
+CONFIG_CC_HAS_WARN_MAYBE_UNINITIALIZED=y
+CONFIG_CLEANCACHE=y
+CONFIG_CLKDEV_LOOKUP=y
+CONFIG_CLKSRC_MMIO=y
+CONFIG_CLONE_BACKWARDS=y
+CONFIG_CMDLINE="earlyprintk console=ttyS0,115200 rootfstype=squashfs,jffs2"
+CONFIG_CMDLINE_FROM_BOOTLOADER=y
+CONFIG_COMMON_CLK=y
+CONFIG_COMMON_CLK_MEDIATEK=y
+CONFIG_COMMON_CLK_MT2701=y
+# CONFIG_COMMON_CLK_MT2701_AUDSYS is not set
+CONFIG_COMMON_CLK_MT2701_BDPSYS=y
+CONFIG_COMMON_CLK_MT2701_ETHSYS=y
+# CONFIG_COMMON_CLK_MT2701_G3DSYS is not set
+CONFIG_COMMON_CLK_MT2701_HIFSYS=y
+CONFIG_COMMON_CLK_MT2701_IMGSYS=y
+CONFIG_COMMON_CLK_MT2701_MMSYS=y
+CONFIG_COMMON_CLK_MT2701_VDECSYS=y
+# CONFIG_COMMON_CLK_MT7622 is not set
+# CONFIG_COMMON_CLK_MT7629 is not set
+# CONFIG_COMMON_CLK_MT8135 is not set
+# CONFIG_COMMON_CLK_MT8173 is not set
+CONFIG_COMMON_CLK_MT8516=y
+# CONFIG_COMMON_CLK_MT8516_AUDSYS is not set
+CONFIG_COMPAT_32BIT_TIME=y
+CONFIG_COREDUMP=y
+# CONFIG_CPUFREQ_DT is not set
+CONFIG_CPU_32v6K=y
+CONFIG_CPU_32v7=y
+CONFIG_CPU_ABRT_EV7=y
+# CONFIG_CPU_BPREDICT_DISABLE is not set
+CONFIG_CPU_CACHE_V7=y
+CONFIG_CPU_CACHE_VIPT=y
+CONFIG_CPU_COPY_V6=y
+CONFIG_CPU_CP15=y
+CONFIG_CPU_CP15_MMU=y
+CONFIG_CPU_FREQ=y
+CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y
+CONFIG_CPU_FREQ_GOV_ATTR_SET=y
+CONFIG_CPU_FREQ_GOV_COMMON=y
+CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y
+CONFIG_CPU_FREQ_GOV_ONDEMAND=y
+CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
+CONFIG_CPU_FREQ_GOV_POWERSAVE=y
+# CONFIG_CPU_FREQ_GOV_USERSPACE is not set
+CONFIG_CPU_FREQ_STAT=y
+CONFIG_CPU_HAS_ASID=y
+# CONFIG_CPU_HOTPLUG_STATE_CONTROL is not set
+# CONFIG_CPU_ICACHE_DISABLE is not set
+# CONFIG_CPU_ICACHE_MISMATCH_WORKAROUND is not set
+CONFIG_CPU_PABRT_V7=y
+CONFIG_CPU_PM=y
+CONFIG_CPU_RMAP=y
+CONFIG_CPU_SPECTRE=y
+# CONFIG_CPU_THERMAL is not set
+CONFIG_CPU_THUMB_CAPABLE=y
+CONFIG_CPU_TLB_V7=y
+CONFIG_CPU_V7=y
+CONFIG_CRC16=y
+# CONFIG_CRC32_SARWATE is not set
+CONFIG_CRC32_SLICEBY8=y
+CONFIG_CROSS_MEMORY_ATTACH=y
+CONFIG_CRYPTO_ACOMP2=y
+CONFIG_CRYPTO_AEAD=y
+CONFIG_CRYPTO_AEAD2=y
+CONFIG_CRYPTO_AKCIPHER2=y
+CONFIG_CRYPTO_CRC32=y
+CONFIG_CRYPTO_CRC32C=y
+CONFIG_CRYPTO_CTR=y
+CONFIG_CRYPTO_DEFLATE=y
+CONFIG_CRYPTO_DEV_MEDIATEK=y
+CONFIG_CRYPTO_DRBG=y
+CONFIG_CRYPTO_DRBG_HMAC=y
+CONFIG_CRYPTO_DRBG_MENU=y
+CONFIG_CRYPTO_HASH=y
+CONFIG_CRYPTO_HASH2=y
+CONFIG_CRYPTO_HASH_INFO=y
+CONFIG_CRYPTO_HMAC=y
+CONFIG_CRYPTO_HW=y
+CONFIG_CRYPTO_JITTERENTROPY=y
+CONFIG_CRYPTO_KPP2=y
+CONFIG_CRYPTO_LIB_AES=y
+CONFIG_CRYPTO_LIB_SHA256=y
+CONFIG_CRYPTO_LZO=y
+CONFIG_CRYPTO_MANAGER=y
+CONFIG_CRYPTO_MANAGER2=y
+CONFIG_CRYPTO_NULL=y
+CONFIG_CRYPTO_NULL2=y
+CONFIG_CRYPTO_RNG=y
+CONFIG_CRYPTO_RNG2=y
+CONFIG_CRYPTO_RNG_DEFAULT=y
+CONFIG_CRYPTO_SEQIV=y
+CONFIG_CRYPTO_SHA1=y
+CONFIG_CRYPTO_SHA256=y
+CONFIG_CRYPTO_SHA512=y
+CONFIG_CRYPTO_ZSTD=y
+CONFIG_DCACHE_WORD_ACCESS=y
+CONFIG_DEBUG_ALIGN_RODATA=y
+CONFIG_DEBUG_BUGVERBOSE=y
+CONFIG_DEBUG_GPIO=y
+CONFIG_DEBUG_INFO=y
+CONFIG_DEBUG_LL=y
+CONFIG_DEBUG_LL_INCLUDE="debug/8250.S"
+CONFIG_DEBUG_MISC=y
+CONFIG_DEBUG_MT6589_UART0=y
+# CONFIG_DEBUG_MT8127_UART0 is not set
+# CONFIG_DEBUG_MT8135_UART3 is not set
+CONFIG_DEBUG_PREEMPT=y
+CONFIG_DEBUG_UART_8250=y
+# CONFIG_DEBUG_UART_8250_FLOW_CONTROL is not set
+CONFIG_DEBUG_UART_8250_SHIFT=2
+# CONFIG_DEBUG_UART_8250_WORD is not set
+CONFIG_DEBUG_UART_PHYS=0x11004000
+CONFIG_DEBUG_UART_VIRT=0xf1004000
+CONFIG_DEBUG_UNCOMPRESS=y
+# CONFIG_DEBUG_USER is not set
+CONFIG_DMADEVICES=y
+CONFIG_DMA_DECLARE_COHERENT=y
+CONFIG_DMA_ENGINE=y
+CONFIG_DMA_OF=y
+CONFIG_DMA_REMAP=y
+CONFIG_DTC=y
+CONFIG_EARLY_PRINTK=y
+CONFIG_EDAC_ATOMIC_SCRUB=y
+CONFIG_EDAC_SUPPORT=y
+CONFIG_EINT_MTK=y
+CONFIG_ELF_CORE=y
+# CONFIG_ENERGY_MODEL is not set
+CONFIG_EXT4_FS=y
+# CONFIG_F2FS_CHECK_FS is not set
+CONFIG_F2FS_FS=y
+# CONFIG_F2FS_FS_SECURITY is not set
+CONFIG_F2FS_FS_XATTR=y
+CONFIG_F2FS_STAT_FS=y
+CONFIG_FIXED_PHY=y
+CONFIG_FIX_EARLYCON_MEM=y
+CONFIG_FREEZER=y
+# CONFIG_FSL_QDMA is not set
+CONFIG_FS_IOMAP=y
+CONFIG_FS_MBCACHE=y
+CONFIG_FW_LOADER_PAGED_BUF=y
+CONFIG_GENERIC_ALLOCATOR=y
+CONFIG_GENERIC_BUG=y
+CONFIG_GENERIC_CLOCKEVENTS=y
+CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y
+CONFIG_GENERIC_CPU_AUTOPROBE=y
+CONFIG_GENERIC_EARLY_IOREMAP=y
+CONFIG_GENERIC_IDLE_POLL_SETUP=y
+CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y
+CONFIG_GENERIC_IRQ_MIGRATION=y
+CONFIG_GENERIC_IRQ_MULTI_HANDLER=y
+CONFIG_GENERIC_IRQ_SHOW=y
+CONFIG_GENERIC_IRQ_SHOW_LEVEL=y
+CONFIG_GENERIC_MSI_IRQ=y
+CONFIG_GENERIC_MSI_IRQ_DOMAIN=y
+CONFIG_GENERIC_PCI_IOMAP=y
+CONFIG_GENERIC_PHY=y
+CONFIG_GENERIC_PINCONF=y
+CONFIG_GENERIC_PINCTRL_GROUPS=y
+CONFIG_GENERIC_PINMUX_FUNCTIONS=y
+CONFIG_GENERIC_SCHED_CLOCK=y
+CONFIG_GENERIC_SMP_IDLE_THREAD=y
+CONFIG_GENERIC_STRNCPY_FROM_USER=y
+CONFIG_GENERIC_STRNLEN_USER=y
+CONFIG_GPIOLIB=y
+CONFIG_GPIO_SYSFS=y
+# CONFIG_GVE is not set
+# CONFIG_HABANA_AI is not set
+CONFIG_HANDLE_DOMAIN_IRQ=y
+CONFIG_HARDEN_BRANCH_PREDICTOR=y
+CONFIG_HARDIRQS_SW_RESEND=y
+CONFIG_HAS_DMA=y
+CONFIG_HAS_IOMEM=y
+CONFIG_HAS_IOPORT_MAP=y
+CONFIG_HAVE_ARCH_AUDITSYSCALL=y
+CONFIG_HAVE_ARCH_BITREVERSE=y
+CONFIG_HAVE_ARCH_JUMP_LABEL=y
+CONFIG_HAVE_ARCH_KGDB=y
+CONFIG_HAVE_ARCH_PFN_VALID=y
+CONFIG_HAVE_ARCH_SECCOMP_FILTER=y
+CONFIG_HAVE_ARCH_THREAD_STRUCT_WHITELIST=y
+CONFIG_HAVE_ARCH_TRACEHOOK=y
+CONFIG_HAVE_ARM_ARCH_TIMER=y
+CONFIG_HAVE_ARM_SMCCC=y
+CONFIG_HAVE_CLK=y
+CONFIG_HAVE_CLK_PREPARE=y
+CONFIG_HAVE_CONTEXT_TRACKING=y
+CONFIG_HAVE_COPY_THREAD_TLS=y
+CONFIG_HAVE_C_RECORDMCOUNT=y
+CONFIG_HAVE_DEBUG_KMEMLEAK=y
+CONFIG_HAVE_DMA_CONTIGUOUS=y
+CONFIG_HAVE_DYNAMIC_FTRACE=y
+CONFIG_HAVE_DYNAMIC_FTRACE_WITH_REGS=y
+CONFIG_HAVE_EBPF_JIT=y
+CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y
+CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y
+CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y
+CONFIG_HAVE_FUNCTION_TRACER=y
+CONFIG_HAVE_IDE=y
+CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y
+CONFIG_HAVE_LD_DEAD_CODE_DATA_ELIMINATION=y
+CONFIG_HAVE_MOD_ARCH_SPECIFIC=y
+CONFIG_HAVE_NET_DSA=y
+CONFIG_HAVE_OPROFILE=y
+CONFIG_HAVE_OPTPROBES=y
+CONFIG_HAVE_PCI=y
+CONFIG_HAVE_PERF_EVENTS=y
+CONFIG_HAVE_PERF_REGS=y
+CONFIG_HAVE_PERF_USER_STACK_DUMP=y
+CONFIG_HAVE_PROC_CPU=y
+CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y
+CONFIG_HAVE_RSEQ=y
+CONFIG_HAVE_SMP=y
+CONFIG_HAVE_SYSCALL_TRACEPOINTS=y
+CONFIG_HAVE_UID16=y
+CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y
+CONFIG_HIGHMEM=y
+# CONFIG_HIGHPTE is not set
+CONFIG_HOTPLUG_CPU=y
+CONFIG_HWMON=y
+CONFIG_HW_RANDOM=y
+CONFIG_HW_RANDOM_MTK=y
+CONFIG_HZ_FIXED=0
+CONFIG_I2C=y
+CONFIG_I2C_BOARDINFO=y
+CONFIG_I2C_CHARDEV=y
+CONFIG_I2C_MT65XX=y
+# CONFIG_I2C_NVIDIA_GPU is not set
+CONFIG_ICPLUS_PHY=y
+# CONFIG_IGC is not set
+CONFIG_IIO=y
+# CONFIG_IIO_BUFFER is not set
+# CONFIG_IIO_TRIGGER is not set
+CONFIG_INITRAMFS_COMPRESSION=""
+CONFIG_INITRAMFS_ROOT_GID=1000
+CONFIG_INITRAMFS_ROOT_UID=1000
+CONFIG_INITRAMFS_SOURCE="/openwrt/trunk/build_dir/target-arm_cortex-a7_musl-1.1.14_eabi/root-mediatek /openwrt/trunk/target/linux/generic/image/initramfs-base-files.txt"
+CONFIG_INIT_STACK_NONE=y
+# CONFIG_IOMMU_DEBUGFS is not set
+# CONFIG_IOMMU_IO_PGTABLE_ARMV7S is not set
+# CONFIG_IOMMU_IO_PGTABLE_LPAE is not set
+CONFIG_IOMMU_SUPPORT=y
+CONFIG_IO_URING=y
+CONFIG_IRQCHIP=y
+CONFIG_IRQ_DOMAIN=y
+CONFIG_IRQ_DOMAIN_HIERARCHY=y
+CONFIG_IRQ_FORCED_THREADING=y
+CONFIG_IRQ_WORK=y
+CONFIG_JBD2=y
+CONFIG_KALLSYMS=y
+CONFIG_KASAN_STACK=1
+CONFIG_LEDS_MT6323=y
+CONFIG_LIBFDT=y
+CONFIG_LOCK_DEBUGGING_SUPPORT=y
+CONFIG_LOCK_SPIN_ON_OWNER=y
+CONFIG_LZO_COMPRESS=y
+CONFIG_LZO_DECOMPRESS=y
+# CONFIG_MACH_MT2701 is not set
+# CONFIG_MACH_MT6589 is not set
+# CONFIG_MACH_MT6592 is not set
+CONFIG_MACH_MT7623=y
+# CONFIG_MACH_MT7629 is not set
+# CONFIG_MACH_MT8127 is not set
+# CONFIG_MACH_MT8135 is not set
+CONFIG_MAGIC_SYSRQ=y
+CONFIG_MDIO_BITBANG=y
+CONFIG_MDIO_BUS=y
+CONFIG_MDIO_DEVICE=y
+CONFIG_MDIO_GPIO=y
+CONFIG_MEDIATEK_MT6577_AUXADC=y
+CONFIG_MEDIATEK_WATCHDOG=y
+CONFIG_MEMFD_CREATE=y
+CONFIG_MFD_CORE=y
+# CONFIG_MFD_LOCHNAGAR is not set
+CONFIG_MFD_MT6397=y
+# CONFIG_MFD_ROHM_BD70528 is not set
+# CONFIG_MFD_STPMIC1 is not set
+CONFIG_MFD_SYSCON=y
+CONFIG_MIGHT_HAVE_CACHE_L2X0=y
+CONFIG_MIGRATION=y
+# CONFIG_MISC_ALCOR_PCI is not set
+CONFIG_MMC=y
+CONFIG_MMC_BLOCK=y
+CONFIG_MMC_MTK=y
+CONFIG_MMC_SDHCI=y
+# CONFIG_MMC_SDHCI_PCI is not set
+CONFIG_MMC_SDHCI_PLTFM=y
+# CONFIG_MMC_TIFM_SD is not set
+CONFIG_MODULES_USE_ELF_REL=y
+# CONFIG_MT753X_GSW is not set
+CONFIG_MTD_BLOCK2MTD=y
+CONFIG_MTD_CMDLINE_PARTS=y
+CONFIG_MTD_SPI_NOR=y
+CONFIG_MTD_SPLIT_FIRMWARE=y
+CONFIG_MTD_SPLIT_UIMAGE_FW=y
+CONFIG_MTD_UBI=y
+CONFIG_MTD_UBI_BEB_LIMIT=20
+CONFIG_MTD_UBI_BLOCK=y
+# CONFIG_MTD_UBI_FASTMAP is not set
+# CONFIG_MTD_UBI_GLUEBI is not set
+CONFIG_MTD_UBI_WL_THRESHOLD=4096
+# CONFIG_MTK_CMDQ is not set
+# CONFIG_MTK_CQDMA is not set
+CONFIG_MTK_EFUSE=y
+# CONFIG_MTK_HSDMA is not set
+CONFIG_MTK_INFRACFG=y
+# CONFIG_MTK_IOMMU is not set
+# CONFIG_MTK_IOMMU_V1 is not set
+CONFIG_MTK_PMIC_WRAP=y
+CONFIG_MTK_SCPSYS=y
+CONFIG_MTK_THERMAL=y
+CONFIG_MTK_TIMER=y
+# CONFIG_MTK_UART_APDMA is not set
+CONFIG_MUTEX_SPIN_ON_OWNER=y
+CONFIG_NEED_DMA_MAP_STATE=y
+CONFIG_NEON=y
+CONFIG_NET_DEVLINK=y
+CONFIG_NET_DSA=y
+CONFIG_NET_DSA_MT7530=y
+CONFIG_NET_DSA_TAG_MTK=y
+# CONFIG_NET_DSA_TAG_QCA is not set
+CONFIG_NET_FLOW_LIMIT=y
+CONFIG_NET_MEDIATEK_SOC=y
+CONFIG_NET_SWITCHDEV=y
+# CONFIG_NET_VENDOR_AURORA is not set
+CONFIG_NET_VENDOR_MEDIATEK=y
+# CONFIG_NET_VENDOR_WIZNET is not set
+CONFIG_NLS=y
+CONFIG_NO_HZ=y
+CONFIG_NO_HZ_COMMON=y
+CONFIG_NO_HZ_IDLE=y
+CONFIG_NR_CPUS=4
+CONFIG_NVMEM=y
+# CONFIG_NVMEM_REBOOT_MODE is not set
+CONFIG_NVMEM_SYSFS=y
+CONFIG_OF=y
+CONFIG_OF_ADDRESS=y
+CONFIG_OF_EARLY_FLATTREE=y
+CONFIG_OF_FLATTREE=y
+CONFIG_OF_GPIO=y
+CONFIG_OF_IRQ=y
+CONFIG_OF_KOBJ=y
+CONFIG_OF_MDIO=y
+CONFIG_OF_NET=y
+CONFIG_OF_RESERVED_MEM=y
+CONFIG_OLD_SIGACTION=y
+CONFIG_OLD_SIGSUSPEND3=y
+CONFIG_PADATA=y
+CONFIG_PAGE_OFFSET=0xC0000000
+CONFIG_PCI=y
+CONFIG_PCIEAER=y
+CONFIG_PCIEPORTBUS=y
+# CONFIG_PCIE_BW is not set
+CONFIG_PCIE_MEDIATEK=y
+CONFIG_PCIE_PME=y
+CONFIG_PCI_DOMAINS=y
+CONFIG_PCI_DOMAINS_GENERIC=y
+# CONFIG_PCI_MESON is not set
+CONFIG_PCI_MSI=y
+CONFIG_PCI_MSI_IRQ_DOMAIN=y
+# CONFIG_PCI_V3_SEMI is not set
+CONFIG_PERF_USE_VMALLOC=y
+CONFIG_PGTABLE_LEVELS=2
+CONFIG_PHYLIB=y
+CONFIG_PHYLINK=y
+CONFIG_PHY_MTK_TPHY=y
+# CONFIG_PHY_MTK_UFS is not set
+# CONFIG_PHY_MTK_XSPHY is not set
+CONFIG_PINCTRL=y
+CONFIG_PINCTRL_MT2701=y
+CONFIG_PINCTRL_MT6397=y
+CONFIG_PINCTRL_MT7623=y
+CONFIG_PINCTRL_MTK=y
+CONFIG_PINCTRL_MTK_MOORE=y
+CONFIG_PM=y
+CONFIG_PM_CLK=y
+# CONFIG_PM_DEBUG is not set
+CONFIG_PM_GENERIC_DOMAINS=y
+CONFIG_PM_GENERIC_DOMAINS_OF=y
+CONFIG_PM_GENERIC_DOMAINS_SLEEP=y
+CONFIG_PM_OPP=y
+CONFIG_PM_SLEEP=y
+CONFIG_PM_SLEEP_SMP=y
+CONFIG_POWER_RESET=y
+CONFIG_POWER_SUPPLY=y
+CONFIG_POWER_SUPPLY_HWMON=y
+CONFIG_PREEMPT=y
+CONFIG_PREEMPTION=y
+CONFIG_PREEMPT_COUNT=y
+# CONFIG_PREEMPT_NONE is not set
+CONFIG_PREEMPT_RCU=y
+CONFIG_PRINTK_TIME=y
+CONFIG_PWM=y
+CONFIG_PWM_MEDIATEK=y
+# CONFIG_PWM_MTK_DISP is not set
+CONFIG_PWM_SYSFS=y
+# CONFIG_QCOM_SPMI_ADC5 is not set
+CONFIG_RAS=y
+CONFIG_RATIONAL=y
+CONFIG_RCU_CPU_STALL_TIMEOUT=21
+# CONFIG_RCU_EXPERT is not set
+CONFIG_RCU_NEED_SEGCBLIST=y
+CONFIG_RCU_STALL_COMMON=y
+CONFIG_REFCOUNT_FULL=y
+CONFIG_REGMAP=y
+CONFIG_REGMAP_I2C=y
+CONFIG_REGMAP_MMIO=y
+CONFIG_REGMAP_SPI=y
+CONFIG_REGULATOR=y
+CONFIG_REGULATOR_FIXED_VOLTAGE=y
+CONFIG_REGULATOR_GPIO=y
+CONFIG_REGULATOR_MT6323=y
+# CONFIG_REGULATOR_MT6380 is not set
+# CONFIG_REGULATOR_MT6397 is not set
+# CONFIG_REGULATOR_QCOM_SPMI is not set
+CONFIG_RESET_CONTROLLER=y
+CONFIG_RFS_ACCEL=y
+CONFIG_RPS=y
+CONFIG_RTC_CLASS=y
+# CONFIG_RTC_DRV_MT6397 is not set
+# CONFIG_RTC_DRV_MT7622 is not set
+CONFIG_RTC_I2C_AND_SPI=y
+CONFIG_RWSEM_SPIN_ON_OWNER=y
+# CONFIG_SENSORS_OCC_P8_I2C is not set
+# CONFIG_SERIAL_8250_DMA is not set
+CONFIG_SERIAL_8250_FSL=y
+CONFIG_SERIAL_8250_MT6577=y
+CONFIG_SERIAL_8250_NR_UARTS=4
+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
+CONFIG_SERIAL_MCTRL_GPIO=y
+CONFIG_SGL_ALLOC=y
+CONFIG_SMP=y
+# CONFIG_SMP_ON_UP is not set
+CONFIG_SPARSE_IRQ=y
+CONFIG_SPI=y
+CONFIG_SPI_BITBANG=y
+CONFIG_SPI_MASTER=y
+CONFIG_SPI_MEM=y
+CONFIG_SPI_MT65XX=y
+CONFIG_SPMI=y
+CONFIG_SRCU=y
+# CONFIG_STRIP_ASM_SYMS is not set
+CONFIG_SUSPEND=y
+CONFIG_SUSPEND_FREEZER=y
+CONFIG_SWCONFIG=y
+CONFIG_SWPHY=y
+CONFIG_SWP_EMULATE=y
+CONFIG_SYS_SUPPORTS_APM_EMULATION=y
+CONFIG_TASKS_RCU=y
+CONFIG_THERMAL=y
+CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y
+CONFIG_THERMAL_EMERGENCY_POWEROFF_DELAY_MS=0
+CONFIG_THERMAL_GOV_STEP_WISE=y
+CONFIG_THERMAL_OF=y
+# CONFIG_THUMB2_KERNEL is not set
+CONFIG_TICK_CPU_ACCOUNTING=y
+CONFIG_TIMER_OF=y
+CONFIG_TIMER_PROBE=y
+# CONFIG_TI_CPSW_PHY_SEL is not set
+CONFIG_TREE_SRCU=y
+# CONFIG_TRUSTED_FOUNDATIONS is not set
+CONFIG_UBIFS_FS=y
+# CONFIG_UBIFS_FS_ADVANCED_COMPR is not set
+CONFIG_UBIFS_FS_LZO=y
+CONFIG_UBIFS_FS_ZLIB=y
+CONFIG_UBIFS_FS_ZSTD=y
+CONFIG_UBSAN_ALIGNMENT=y
+CONFIG_UEVENT_HELPER_PATH=""
+CONFIG_UNCOMPRESS_INCLUDE="debug/uncompress.h"
+CONFIG_UNINLINE_SPIN_UNLOCK=y
+CONFIG_UNIX_SCM=y
+CONFIG_UNWINDER_ARM=y
+# CONFIG_UNWINDER_FRAME_POINTER is not set
+CONFIG_USB=y
+CONFIG_USB_COMMON=y
+# CONFIG_USB_EHCI_HCD is not set
+CONFIG_USB_SUPPORT=y
+CONFIG_USB_XHCI_HCD=y
+CONFIG_USB_XHCI_MTK=y
+CONFIG_USB_XHCI_PLATFORM=y
+CONFIG_USE_OF=y
+CONFIG_VFP=y
+CONFIG_VFPv3=y
+CONFIG_VM_EVENT_COUNTERS=y
+CONFIG_WATCHDOG_CORE=y
+CONFIG_XPS=y
+CONFIG_XXHASH=y
+CONFIG_XZ_DEC_ARM=y
+CONFIG_XZ_DEC_BCJ=y
+CONFIG_ZBOOT_ROM_BSS=0
+CONFIG_ZBOOT_ROM_TEXT=0
+CONFIG_ZLIB_DEFLATE=y
+CONFIG_ZLIB_INFLATE=y
+CONFIG_ZSTD_COMPRESS=y
+CONFIG_ZSTD_DECOMPRESS=y
diff --git a/target/linux/mediatek/mt7629/config-5.4 b/target/linux/mediatek/mt7629/config-5.4
new file mode 100644 (file)
index 0000000..00f5412
--- /dev/null
@@ -0,0 +1,490 @@
+CONFIG_64BIT_TIME=y
+# CONFIG_ADIN_PHY is not set
+CONFIG_ALIGNMENT_TRAP=y
+# CONFIG_AL_FIC is not set
+CONFIG_ARCH_32BIT_OFF_T=y
+CONFIG_ARCH_CLOCKSOURCE_DATA=y
+CONFIG_ARCH_HAS_BINFMT_FLAT=y
+CONFIG_ARCH_HAS_DEBUG_VIRTUAL=y
+CONFIG_ARCH_HAS_ELF_RANDOMIZE=y
+CONFIG_ARCH_HAS_FORTIFY_SOURCE=y
+CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y
+CONFIG_ARCH_HAS_KCOV=y
+CONFIG_ARCH_HAS_KEEPINITRD=y
+CONFIG_ARCH_HAS_MEMBARRIER_SYNC_CORE=y
+CONFIG_ARCH_HAS_PHYS_TO_DMA=y
+CONFIG_ARCH_HAS_SETUP_DMA_OPS=y
+CONFIG_ARCH_HAS_SET_MEMORY=y
+CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y
+CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y
+CONFIG_ARCH_HAS_TEARDOWN_DMA_OPS=y
+CONFIG_ARCH_HAS_TICK_BROADCAST=y
+CONFIG_ARCH_HAVE_CUSTOM_GPIO_H=y
+CONFIG_ARCH_HIBERNATION_POSSIBLE=y
+CONFIG_ARCH_KEEP_MEMBLOCK=y
+CONFIG_ARCH_MEDIATEK=y
+CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y
+# CONFIG_ARCH_MILBEAUT is not set
+CONFIG_ARCH_MULTIPLATFORM=y
+CONFIG_ARCH_MULTI_V6_V7=y
+CONFIG_ARCH_MULTI_V7=y
+CONFIG_ARCH_NR_GPIO=0
+CONFIG_ARCH_OPTIONAL_KERNEL_RWX=y
+CONFIG_ARCH_OPTIONAL_KERNEL_RWX_DEFAULT=y
+# CONFIG_ARCH_RDA is not set
+CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y
+CONFIG_ARCH_SUPPORTS_UPROBES=y
+CONFIG_ARCH_SUSPEND_POSSIBLE=y
+CONFIG_ARCH_USE_BUILTIN_BSWAP=y
+CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y
+CONFIG_ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT=y
+CONFIG_ARCH_WANT_GENERAL_HUGETLB=y
+CONFIG_ARCH_WANT_IPC_PARSE_VERSION=y
+CONFIG_ARM=y
+CONFIG_ARM_ARCH_TIMER=y
+CONFIG_ARM_ARCH_TIMER_EVTSTREAM=y
+# CONFIG_ARM_ERRATA_814220 is not set
+# CONFIG_ARM_ERRATA_857271 is not set
+# CONFIG_ARM_ERRATA_857272 is not set
+CONFIG_ARM_GIC=y
+CONFIG_ARM_HAS_SG_CHAIN=y
+CONFIG_ARM_HEAVY_MB=y
+CONFIG_ARM_L1_CACHE_SHIFT=6
+CONFIG_ARM_L1_CACHE_SHIFT_6=y
+# CONFIG_ARM_LPAE is not set
+CONFIG_ARM_PATCH_IDIV=y
+CONFIG_ARM_PATCH_PHYS_VIRT=y
+CONFIG_ARM_PMU=y
+CONFIG_ARM_THUMB=y
+# CONFIG_ARM_THUMBEE is not set
+CONFIG_ARM_UNWIND=y
+CONFIG_ARM_VIRT_EXT=y
+CONFIG_ATAGS=y
+CONFIG_AUTO_ZRELADDR=y
+# CONFIG_BACKLIGHT_CLASS_DEVICE is not set
+CONFIG_BINFMT_FLAT_ARGVP_ENVP_ON_STACK=y
+CONFIG_BLK_DEV_SD=y
+CONFIG_BLK_MQ_PCI=y
+CONFIG_BLK_PM=y
+CONFIG_BLK_SCSI_REQUEST=y
+CONFIG_BSD_PROCESS_ACCT=y
+CONFIG_BSD_PROCESS_ACCT_V3=y
+CONFIG_CACHE_L2X0=y
+CONFIG_CC_CAN_LINK=y
+CONFIG_CC_DISABLE_WARN_MAYBE_UNINITIALIZED=y
+CONFIG_CC_HAS_ASM_INLINE=y
+CONFIG_CC_HAS_KASAN_GENERIC=y
+CONFIG_CC_HAS_WARN_MAYBE_UNINITIALIZED=y
+# CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE is not set
+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+CONFIG_CHR_DEV_SCH=y
+CONFIG_CLKDEV_LOOKUP=y
+CONFIG_CLKSRC_MMIO=y
+CONFIG_CLONE_BACKWARDS=y
+CONFIG_CMDLINE="rootfstype=squashfs,jffs2"
+CONFIG_CMDLINE_FROM_BOOTLOADER=y
+CONFIG_COMMON_CLK=y
+# CONFIG_COMMON_CLK_FIXED_MMIO is not set
+CONFIG_COMMON_CLK_MEDIATEK=y
+# CONFIG_COMMON_CLK_MT2701 is not set
+# CONFIG_COMMON_CLK_MT7622 is not set
+CONFIG_COMMON_CLK_MT7629=y
+CONFIG_COMMON_CLK_MT7629_ETHSYS=y
+CONFIG_COMMON_CLK_MT7629_HIFSYS=y
+# CONFIG_COMMON_CLK_MT8135 is not set
+# CONFIG_COMMON_CLK_MT8173 is not set
+CONFIG_COMMON_CLK_MT8516=y
+# CONFIG_COMMON_CLK_MT8516_AUDSYS is not set
+CONFIG_COMPAT_32BIT_TIME=y
+# CONFIG_COUNTER is not set
+CONFIG_CPU_32v6K=y
+CONFIG_CPU_32v7=y
+CONFIG_CPU_ABRT_EV7=y
+# CONFIG_CPU_BPREDICT_DISABLE is not set
+CONFIG_CPU_CACHE_V7=y
+CONFIG_CPU_CACHE_VIPT=y
+CONFIG_CPU_COPY_V6=y
+CONFIG_CPU_CP15=y
+CONFIG_CPU_CP15_MMU=y
+CONFIG_CPU_HAS_ASID=y
+# CONFIG_CPU_HOTPLUG_STATE_CONTROL is not set
+# CONFIG_CPU_ICACHE_DISABLE is not set
+# CONFIG_CPU_ICACHE_MISMATCH_WORKAROUND is not set
+CONFIG_CPU_IDLE=y
+# CONFIG_CPU_IDLE_GOV_LADDER is not set
+CONFIG_CPU_IDLE_GOV_MENU=y
+# CONFIG_CPU_IDLE_GOV_TEO is not set
+CONFIG_CPU_PABRT_V7=y
+CONFIG_CPU_PM=y
+CONFIG_CPU_RMAP=y
+CONFIG_CPU_SPECTRE=y
+CONFIG_CPU_THUMB_CAPABLE=y
+CONFIG_CPU_TLB_V7=y
+CONFIG_CPU_V7=y
+CONFIG_CRC16=y
+CONFIG_CRYPTO_ACOMP2=y
+# CONFIG_CRYPTO_ADIANTUM is not set
+CONFIG_CRYPTO_AEAD=y
+CONFIG_CRYPTO_AEAD2=y
+CONFIG_CRYPTO_AKCIPHER2=y
+CONFIG_CRYPTO_DEFLATE=y
+# CONFIG_CRYPTO_ECRDSA is not set
+# CONFIG_CRYPTO_ESSIV is not set
+CONFIG_CRYPTO_HASH2=y
+CONFIG_CRYPTO_HASH_INFO=y
+CONFIG_CRYPTO_KPP2=y
+CONFIG_CRYPTO_LIB_AES=y
+CONFIG_CRYPTO_LZO=y
+CONFIG_CRYPTO_MANAGER=y
+CONFIG_CRYPTO_MANAGER2=y
+CONFIG_CRYPTO_NULL2=y
+# CONFIG_CRYPTO_OFB is not set
+CONFIG_CRYPTO_RNG2=y
+# CONFIG_CRYPTO_STREEBOG is not set
+# CONFIG_CRYPTO_XXHASH is not set
+CONFIG_CRYPTO_ZSTD=y
+CONFIG_DCACHE_WORD_ACCESS=y
+CONFIG_DEBUG_LL_INCLUDE="mach/debug-macro.S"
+CONFIG_DEBUG_MISC=y
+# CONFIG_DEBUG_PLIST is not set
+# CONFIG_DEBUG_USER is not set
+CONFIG_DEFAULT_HOSTNAME="(mt7629)"
+CONFIG_DMA_DECLARE_COHERENT=y
+CONFIG_DMA_REMAP=y
+CONFIG_DTC=y
+CONFIG_EDAC_ATOMIC_SCRUB=y
+CONFIG_EDAC_SUPPORT=y
+CONFIG_EINT_MTK=y
+# CONFIG_EXFAT_FS is not set
+# CONFIG_FIELDBUS_DEV is not set
+CONFIG_FIXED_PHY=y
+CONFIG_FIX_EARLYCON_MEM=y
+# CONFIG_FS_VERITY is not set
+# CONFIG_FW_LOADER_COMPRESS is not set
+CONFIG_FW_LOADER_PAGED_BUF=y
+CONFIG_GENERIC_ALLOCATOR=y
+CONFIG_GENERIC_ARCH_TOPOLOGY=y
+CONFIG_GENERIC_BUG=y
+CONFIG_GENERIC_CLOCKEVENTS=y
+CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y
+CONFIG_GENERIC_CPU_AUTOPROBE=y
+CONFIG_GENERIC_EARLY_IOREMAP=y
+CONFIG_GENERIC_IDLE_POLL_SETUP=y
+CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y
+CONFIG_GENERIC_IRQ_MIGRATION=y
+CONFIG_GENERIC_IRQ_MULTI_HANDLER=y
+CONFIG_GENERIC_IRQ_SHOW=y
+CONFIG_GENERIC_IRQ_SHOW_LEVEL=y
+CONFIG_GENERIC_MSI_IRQ=y
+CONFIG_GENERIC_MSI_IRQ_DOMAIN=y
+CONFIG_GENERIC_PCI_IOMAP=y
+CONFIG_GENERIC_PHY=y
+CONFIG_GENERIC_PINCONF=y
+CONFIG_GENERIC_PINCTRL_GROUPS=y
+CONFIG_GENERIC_PINMUX_FUNCTIONS=y
+CONFIG_GENERIC_SCHED_CLOCK=y
+CONFIG_GENERIC_SMP_IDLE_THREAD=y
+CONFIG_GENERIC_STRNCPY_FROM_USER=y
+CONFIG_GENERIC_STRNLEN_USER=y
+CONFIG_GPIOLIB=y
+# CONFIG_GPIO_AMD_FCH is not set
+# CONFIG_GPIO_CADENCE is not set
+# CONFIG_GPIO_SAMA5D2_PIOBU is not set
+CONFIG_GPIO_SYSFS=y
+# CONFIG_GVE is not set
+# CONFIG_HABANA_AI is not set
+CONFIG_HANDLE_DOMAIN_IRQ=y
+# CONFIG_HARDENED_USERCOPY is not set
+CONFIG_HARDEN_BRANCH_PREDICTOR=y
+CONFIG_HARDIRQS_SW_RESEND=y
+CONFIG_HAS_DMA=y
+CONFIG_HAS_IOMEM=y
+CONFIG_HAS_IOPORT_MAP=y
+CONFIG_HAVE_ARCH_AUDITSYSCALL=y
+CONFIG_HAVE_ARCH_BITREVERSE=y
+CONFIG_HAVE_ARCH_JUMP_LABEL=y
+CONFIG_HAVE_ARCH_KGDB=y
+CONFIG_HAVE_ARCH_PFN_VALID=y
+CONFIG_HAVE_ARCH_SECCOMP_FILTER=y
+CONFIG_HAVE_ARCH_THREAD_STRUCT_WHITELIST=y
+CONFIG_HAVE_ARCH_TRACEHOOK=y
+CONFIG_HAVE_ARM_ARCH_TIMER=y
+CONFIG_HAVE_ARM_SMCCC=y
+CONFIG_HAVE_CLK=y
+CONFIG_HAVE_CLK_PREPARE=y
+CONFIG_HAVE_CONTEXT_TRACKING=y
+CONFIG_HAVE_C_RECORDMCOUNT=y
+CONFIG_HAVE_DEBUG_KMEMLEAK=y
+CONFIG_HAVE_DMA_CONTIGUOUS=y
+CONFIG_HAVE_DYNAMIC_FTRACE=y
+CONFIG_HAVE_DYNAMIC_FTRACE_WITH_REGS=y
+CONFIG_HAVE_EBPF_JIT=y
+CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y
+CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y
+CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y
+CONFIG_HAVE_FUNCTION_TRACER=y
+CONFIG_HAVE_HW_BREAKPOINT=y
+CONFIG_HAVE_IDE=y
+CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y
+CONFIG_HAVE_LD_DEAD_CODE_DATA_ELIMINATION=y
+CONFIG_HAVE_MOD_ARCH_SPECIFIC=y
+CONFIG_HAVE_NET_DSA=y
+CONFIG_HAVE_OPROFILE=y
+CONFIG_HAVE_OPTPROBES=y
+CONFIG_HAVE_PCI=y
+CONFIG_HAVE_PERF_EVENTS=y
+CONFIG_HAVE_PERF_REGS=y
+CONFIG_HAVE_PERF_USER_STACK_DUMP=y
+CONFIG_HAVE_PROC_CPU=y
+CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y
+CONFIG_HAVE_RSEQ=y
+CONFIG_HAVE_SCHED_AVG_IRQ=y
+CONFIG_HAVE_SMP=y
+CONFIG_HAVE_SYSCALL_TRACEPOINTS=y
+CONFIG_HAVE_UID16=y
+CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y
+# CONFIG_HEADERS_INSTALL is not set
+# CONFIG_HEADER_TEST is not set
+CONFIG_HOTPLUG_CPU=y
+CONFIG_HW_RANDOM=y
+CONFIG_HW_RANDOM_MTK=y
+CONFIG_HZ_FIXED=0
+# CONFIG_I3C is not set
+# CONFIG_IGC is not set
+# CONFIG_IKHEADERS is not set
+CONFIG_INITRAMFS_SOURCE=""
+# CONFIG_INIT_ON_ALLOC_DEFAULT_ON is not set
+# CONFIG_INIT_ON_FREE_DEFAULT_ON is not set
+CONFIG_INIT_STACK_NONE=y
+# CONFIG_INTERCONNECT is not set
+CONFIG_IO_URING=y
+CONFIG_IRQCHIP=y
+CONFIG_IRQ_DOMAIN=y
+CONFIG_IRQ_DOMAIN_HIERARCHY=y
+CONFIG_IRQ_FORCED_THREADING=y
+CONFIG_IRQ_TIME_ACCOUNTING=y
+CONFIG_IRQ_WORK=y
+CONFIG_KASAN_STACK=1
+# CONFIG_LCD_CLASS_DEVICE is not set
+# CONFIG_LEDS_BRIGHTNESS_HW_CHANGED is not set
+# CONFIG_LEDS_TRIGGER_AUDIO is not set
+# CONFIG_LEDS_TRIGGER_PATTERN is not set
+CONFIG_LIBFDT=y
+CONFIG_LOCK_DEBUGGING_SUPPORT=y
+# CONFIG_LOCK_EVENT_COUNTS is not set
+CONFIG_LOCK_SPIN_ON_OWNER=y
+CONFIG_LSM="lockdown,yama,loadpin,safesetid,integrity"
+CONFIG_LZO_COMPRESS=y
+CONFIG_LZO_DECOMPRESS=y
+# CONFIG_MACH_MT2701 is not set
+# CONFIG_MACH_MT6589 is not set
+# CONFIG_MACH_MT6592 is not set
+# CONFIG_MACH_MT7623 is not set
+CONFIG_MACH_MT7629=y
+# CONFIG_MACH_MT8127 is not set
+# CONFIG_MACH_MT8135 is not set
+CONFIG_MDIO_BUS=y
+# CONFIG_MDIO_BUS_MUX_MULTIPLEXER is not set
+CONFIG_MDIO_DEVICE=y
+CONFIG_MEDIATEK_WATCHDOG=y
+CONFIG_MEMFD_CREATE=y
+CONFIG_MFD_SYSCON=y
+# CONFIG_MFD_TQMX86 is not set
+CONFIG_MIGHT_HAVE_CACHE_L2X0=y
+CONFIG_MIGRATION=y
+# CONFIG_MISC_ALCOR_PCI is not set
+CONFIG_MODULES_TREE_LOOKUP=y
+CONFIG_MODULES_USE_ELF_REL=y
+# CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS is not set
+CONFIG_MT753X_GSW=y
+# CONFIG_MTD_HYPERBUS is not set
+CONFIG_MTD_NAND_CORE=y
+# CONFIG_MTD_RAW_NAND is not set
+CONFIG_MTD_SPI_NAND=y
+CONFIG_MTD_SPI_NOR=y
+CONFIG_MTD_SPLIT_FIRMWARE=y
+CONFIG_MTD_SPLIT_FIT_FW=y
+CONFIG_MTD_UBI=y
+CONFIG_MTD_UBI_BEB_LIMIT=20
+CONFIG_MTD_UBI_BLOCK=y
+# CONFIG_MTD_UBI_FASTMAP is not set
+# CONFIG_MTD_UBI_GLUEBI is not set
+CONFIG_MTD_UBI_WL_THRESHOLD=4096
+# CONFIG_MTK_CMDQ is not set
+# CONFIG_MTK_EFUSE is not set
+CONFIG_MTK_INFRACFG=y
+# CONFIG_MTK_PMIC_WRAP is not set
+CONFIG_MTK_SCPSYS=y
+CONFIG_MTK_TIMER=y
+CONFIG_MUTEX_SPIN_ON_OWNER=y
+CONFIG_NEED_DMA_MAP_STATE=y
+CONFIG_NETFILTER=y
+CONFIG_NET_FLOW_LIMIT=y
+CONFIG_NET_MEDIATEK_SOC=y
+# CONFIG_NET_SCH_TAPRIO is not set
+CONFIG_NET_VENDOR_GOOGLE=y
+CONFIG_NET_VENDOR_MEDIATEK=y
+CONFIG_NET_VENDOR_PENSANDO=y
+# CONFIG_NI_XGE_MANAGEMENT_ENET is not set
+CONFIG_NLS=y
+CONFIG_NO_HZ_COMMON=y
+CONFIG_NO_HZ_IDLE=y
+CONFIG_NR_CPUS=2
+# CONFIG_NULL_TTY is not set
+CONFIG_NVMEM=y
+CONFIG_NVMEM_SYSFS=y
+CONFIG_OF=y
+CONFIG_OF_ADDRESS=y
+CONFIG_OF_EARLY_FLATTREE=y
+CONFIG_OF_FLATTREE=y
+CONFIG_OF_GPIO=y
+CONFIG_OF_IRQ=y
+CONFIG_OF_KOBJ=y
+CONFIG_OF_MDIO=y
+CONFIG_OF_NET=y
+CONFIG_OF_RESERVED_MEM=y
+CONFIG_OLD_SIGACTION=y
+CONFIG_OLD_SIGSUSPEND3=y
+CONFIG_OUTER_CACHE=y
+CONFIG_OUTER_CACHE_SYNC=y
+# CONFIG_PACKING is not set
+CONFIG_PADATA=y
+CONFIG_PAGE_OFFSET=0xC0000000
+CONFIG_PCI=y
+CONFIG_PCIEAER=y
+CONFIG_PCIEPORTBUS=y
+# CONFIG_PCIE_BW is not set
+CONFIG_PCIE_MEDIATEK=y
+CONFIG_PCIE_PME=y
+CONFIG_PCI_DOMAINS=y
+CONFIG_PCI_DOMAINS_GENERIC=y
+# CONFIG_PCI_MESON is not set
+CONFIG_PCI_MSI=y
+CONFIG_PCI_MSI_IRQ_DOMAIN=y
+# CONFIG_PCI_V3_SEMI is not set
+CONFIG_PERF_EVENTS=y
+CONFIG_PERF_USE_VMALLOC=y
+CONFIG_PGTABLE_LEVELS=2
+CONFIG_PHYLIB=y
+CONFIG_PHYLINK=y
+# CONFIG_PHY_CADENCE_DP is not set
+# CONFIG_PHY_CADENCE_DPHY is not set
+# CONFIG_PHY_CADENCE_SIERRA is not set
+# CONFIG_PHY_FSL_IMX8MQ_USB is not set
+# CONFIG_PHY_MIXEL_MIPI_DPHY is not set
+CONFIG_PHY_MTK_TPHY=y
+# CONFIG_PHY_MTK_UFS is not set
+# CONFIG_PHY_MTK_XSPHY is not set
+# CONFIG_PHY_OCELOT_SERDES is not set
+CONFIG_PINCTRL=y
+CONFIG_PINCTRL_MT7629=y
+CONFIG_PINCTRL_MTK_MOORE=y
+# CONFIG_PINCTRL_OCELOT is not set
+# CONFIG_PL310_ERRATA_588369 is not set
+# CONFIG_PL310_ERRATA_727915 is not set
+# CONFIG_PL310_ERRATA_753970 is not set
+# CONFIG_PL310_ERRATA_769419 is not set
+CONFIG_PM=y
+CONFIG_PM_CLK=y
+# CONFIG_PM_DEBUG is not set
+CONFIG_PM_GENERIC_DOMAINS=y
+CONFIG_PM_GENERIC_DOMAINS_OF=y
+# CONFIG_PRINTK_CALLER is not set
+# CONFIG_PSI is not set
+# CONFIG_PVPANIC is not set
+CONFIG_PWM=y
+CONFIG_PWM_MEDIATEK=y
+# CONFIG_PWM_MTK_DISP is not set
+CONFIG_PWM_SYSFS=y
+# CONFIG_RANDOM_TRUST_BOOTLOADER is not set
+CONFIG_RAS=y
+CONFIG_RATIONAL=y
+CONFIG_RCU_NEED_SEGCBLIST=y
+CONFIG_RCU_STALL_COMMON=y
+# CONFIG_REED_SOLOMON_TEST is not set
+CONFIG_REFCOUNT_FULL=y
+CONFIG_REGMAP=y
+CONFIG_REGMAP_MMIO=y
+CONFIG_RESET_CONTROLLER=y
+CONFIG_RFS_ACCEL=y
+CONFIG_RPS=y
+CONFIG_RWSEM_SPIN_ON_OWNER=y
+CONFIG_SCSI=y
+# CONFIG_SCSI_MYRS is not set
+CONFIG_SERIAL_8250_FSL=y
+CONFIG_SERIAL_8250_MT6577=y
+CONFIG_SERIAL_8250_NR_UARTS=3
+CONFIG_SERIAL_8250_RUNTIME_UARTS=3
+# CONFIG_SERIAL_FSL_LINFLEXUART is not set
+CONFIG_SERIAL_MCTRL_GPIO=y
+CONFIG_SERIAL_OF_PLATFORM=y
+# CONFIG_SERIAL_SIFIVE is not set
+CONFIG_SGL_ALLOC=y
+CONFIG_SG_POOL=y
+# CONFIG_SHUFFLE_PAGE_ALLOCATOR is not set
+CONFIG_SMP=y
+CONFIG_SMP_ON_UP=y
+CONFIG_SPARSE_IRQ=y
+CONFIG_SPI=y
+CONFIG_SPI_MASTER=y
+CONFIG_SPI_MEM=y
+# CONFIG_SPI_MT65XX is not set
+# CONFIG_SPI_MTK_QUADSPI is not set
+CONFIG_SRCU=y
+CONFIG_STACKTRACE=y
+# CONFIG_SWAP is not set
+CONFIG_SWCONFIG=y
+CONFIG_SWPHY=y
+CONFIG_SWP_EMULATE=y
+CONFIG_SYS_SUPPORTS_APM_EMULATION=y
+# CONFIG_TEST_BLACKHOLE_DEV is not set
+# CONFIG_TEST_MEMCAT_P is not set
+# CONFIG_TEST_MEMINIT is not set
+# CONFIG_TEST_STACKINIT is not set
+# CONFIG_TEST_STRSCPY is not set
+# CONFIG_TEST_VMALLOC is not set
+# CONFIG_TEST_XARRAY is not set
+# CONFIG_THUMB2_KERNEL is not set
+CONFIG_TICK_CPU_ACCOUNTING=y
+CONFIG_TIMER_OF=y
+CONFIG_TIMER_PROBE=y
+# CONFIG_TI_CPSW_PHY_SEL is not set
+CONFIG_TREE_RCU=y
+CONFIG_TREE_SRCU=y
+# CONFIG_TRUSTED_FOUNDATIONS is not set
+CONFIG_UBIFS_FS=y
+# CONFIG_UBIFS_FS_ADVANCED_COMPR is not set
+CONFIG_UBIFS_FS_LZO=y
+CONFIG_UBIFS_FS_ZLIB=y
+CONFIG_UBIFS_FS_ZSTD=y
+CONFIG_UBSAN_ALIGNMENT=y
+CONFIG_UNCOMPRESS_INCLUDE="debug/uncompress.h"
+# CONFIG_UNICODE is not set
+CONFIG_UNIX_SCM=y
+CONFIG_UNWINDER_ARM=y
+# CONFIG_UNWINDER_FRAME_POINTER is not set
+CONFIG_USB=y
+CONFIG_USB_COMMON=y
+# CONFIG_USB_CONN_GPIO is not set
+# CONFIG_USB_EHCI_HCD is not set
+CONFIG_USB_SUPPORT=y
+CONFIG_USB_XHCI_HCD=y
+CONFIG_USB_XHCI_MTK=y
+# CONFIG_USB_XHCI_PLATFORM is not set
+CONFIG_USE_OF=y
+# CONFIG_VALIDATE_FS_PARSER is not set
+# CONFIG_VFP is not set
+CONFIG_WATCHDOG_CORE=y
+CONFIG_WATCHDOG_OPEN_TIMEOUT=0
+# CONFIG_WQ_POWER_EFFICIENT_DEFAULT is not set
+# CONFIG_XILINX_SDFEC is not set
+CONFIG_XPS=y
+CONFIG_XXHASH=y
+CONFIG_XZ_DEC_ARM=y
+CONFIG_XZ_DEC_BCJ=y
+CONFIG_ZBOOT_ROM_BSS=0
+CONFIG_ZBOOT_ROM_TEXT=0
+CONFIG_ZLIB_DEFLATE=y
+CONFIG_ZLIB_INFLATE=y
+CONFIG_ZSTD_COMPRESS=y
+CONFIG_ZSTD_DECOMPRESS=y
diff --git a/target/linux/mediatek/patches-5.4/0003-switch-add-mt7531.patch b/target/linux/mediatek/patches-5.4/0003-switch-add-mt7531.patch
new file mode 100755 (executable)
index 0000000..096802a
--- /dev/null
@@ -0,0 +1,19 @@
+--- a/drivers/net/phy/Kconfig
++++ b/drivers/net/phy/Kconfig
+@@ -292,6 +292,8 @@ config RTL8367B_PHY
+ endif # RTL8366_SMI
++source "drivers/net/phy/mtk/mt753x/Kconfig"
++
+ comment "MII PHY device drivers"
+ config SFP
+--- a/drivers/net/phy/Makefile
++++ b/drivers/net/phy/Makefile
+@@ -100,3 +100,5 @@ obj-$(CONFIG_STE10XP)              += ste10Xp.o
+ obj-$(CONFIG_TERANETICS_PHY)  += teranetics.o
+ obj-$(CONFIG_VITESSE_PHY)     += vitesse.o
+ obj-$(CONFIG_XILINX_GMII2RGMII) += xilinx_gmii2rgmii.o
++obj-$(CONFIG_MT753X_GSW)        += mtk/mt753x/
++
diff --git a/target/linux/mediatek/patches-5.4/0005-dts-mt7622-add-gsw.patch b/target/linux/mediatek/patches-5.4/0005-dts-mt7622-add-gsw.patch
new file mode 100755 (executable)
index 0000000..26c17f2
--- /dev/null
@@ -0,0 +1,257 @@
+diff -urN a/arch/arm64/boot/dts/mediatek/mt7622-bananapi-bpi-r64.dts b/arch/arm64/boot/dts/mediatek/mt7622-bananapi-bpi-r64.dts
+--- a/arch/arm64/boot/dts/mediatek/mt7622-bananapi-bpi-r64.dts 2019-12-02 14:33:30.126586402 +0800
++++ b/arch/arm64/boot/dts/mediatek/mt7622-bananapi-bpi-r64.dts 2019-12-02 14:35:02.304005081 +0800
+@@ -53,6 +53,13 @@
+               };
+       };
++      gsw: gsw@0 {
++              compatible = "mediatek,mt753x";
++              mediatek,ethsys = <&ethsys>;
++              #address-cells = <1>;
++              #size-cells = <0>;
++      };
++
+       leds {
+               compatible = "gpio-leds";
+@@ -146,6 +153,36 @@
+       };
+ };
++&gsw {
++        mediatek,mdio = <&mdio>;
++        mediatek,portmap = "wllll";
++        mediatek,mdio_master_pinmux = <0>;
++        reset-gpios = <&pio 54 0>;
++        interrupt-parent = <&pio>;
++        interrupts = <53 IRQ_TYPE_LEVEL_HIGH>;
++        status = "okay";
++
++        port5: port@5 {
++                compatible = "mediatek,mt753x-port";
++                reg = <5>;
++                phy-mode = "rgmii";
++                fixed-link {
++                        speed = <1000>;
++                        full-duplex;
++                };
++        };
++
++        port6: port@6 {
++                compatible = "mediatek,mt753x-port";
++                reg = <6>;
++                phy-mode = "sgmii";
++                fixed-link {
++                        speed = <2500>;
++                        full-duplex;
++                };
++        };
++};
++
+ &i2c1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&i2c1_pins>;
+--- a/arch/arm64/boot/dts/mediatek/mt7622-rfb1.dts     2020-01-12 19:21:53.000000000 +0800
++++ b/arch/arm64/boot/dts/mediatek/mt7622-rfb1.dts     2020-01-15 15:36:50.987901563 +0800
+@@ -1,7 +1,6 @@
+ /*
+- * Copyright (c) 2017 MediaTek Inc.
+- * Author: Ming Huang <ming.huang@mediatek.com>
+- *       Sean Wang <sean.wang@mediatek.com>
++ * Copyright (c) 2018 MediaTek Inc.
++ * Author: Ryder Lee <ryder.lee@mediatek.com>
+  *
+  * SPDX-License-Identifier: (GPL-2.0 OR MIT)
+  */
+@@ -14,8 +13,8 @@
+ #include "mt6380.dtsi"
+ / {
+-      model = "MediaTek MT7622 RFB1 board";
+-      compatible = "mediatek,mt7622-rfb1", "mediatek,mt7622";
++      model = "MT7622_MT7531 RFB";
++      compatible = "bananapi,bpi-r64", "mediatek,mt7622";
+       aliases {
+               serial0 = &uart0;
+@@ -23,7 +22,7 @@
+       chosen {
+               stdout-path = "serial0:115200n8";
+-              bootargs = "earlycon=uart8250,mmio32,0x11002000 swiotlb=512";
++              bootargs = "earlycon=uart8250,mmio32,0x11002000 console=ttyS0,115200n1 swiotlb=512";
+       };
+       cpus {
+@@ -40,23 +39,45 @@
+       gpio-keys {
+               compatible = "gpio-keys";
+-              poll-interval = <100>;
+               factory {
+                       label = "factory";
+                       linux,code = <BTN_0>;
+-                      gpios = <&pio 0 0>;
++                      gpios = <&pio 0 GPIO_ACTIVE_HIGH>;
+               };
+               wps {
+                       label = "wps";
+                       linux,code = <KEY_WPS_BUTTON>;
+-                      gpios = <&pio 102 0>;
++                      gpios = <&pio 102 GPIO_ACTIVE_HIGH>;
++              };
++      };
++
++      gsw: gsw@0 {
++                compatible = "mediatek,mt753x";
++                mediatek,ethsys = <&ethsys>;
++                #address-cells = <1>;
++                #size-cells = <0>;
++        };
++
++      leds {
++              compatible = "gpio-leds";
++
++              green {
++                      label = "bpi-r64:pio:green";
++                      gpios = <&pio 89 GPIO_ACTIVE_HIGH>;
++                      default-state = "off";
++              };
++
++              red {
++                      label = "bpi-r64:pio:red";
++                      gpios = <&pio 88 GPIO_ACTIVE_HIGH>;
++                      default-state = "off";
+               };
+       };
+       memory {
+-              reg = <0 0x40000000 0 0x20000000>;
++              reg = <0 0x40000000 0 0x40000000>;
+       };
+       reg_1p8v: regulator-1p8v {
+@@ -101,27 +122,67 @@
+ };
+ &eth {
+-      pinctrl-names = "default";
+-      pinctrl-0 = <&eth_pins>;
+       status = "okay";
++      gmac0: mac@0 {
++              compatible = "mediatek,eth-mac";
++              reg = <0>;
++              phy-mode = "2500base-x";
++
++              fixed-link {
++                      speed = <2500>;
++                      full-duplex;
++                      pause;
++              };
++      };
+       gmac1: mac@1 {
+               compatible = "mediatek,eth-mac";
+               reg = <1>;
+-              phy-handle = <&phy5>;
++              phy-mode = "rgmii";
++
++              fixed-link {
++                      speed = <1000>;
++                      full-duplex;
++                      pause;
++              };
+       };
+-      mdio-bus {
++      mdio: mdio-bus {
+               #address-cells = <1>;
+               #size-cells = <0>;
+-
+-              phy5: ethernet-phy@5 {
+-                      reg = <5>;
+-                      phy-mode = "sgmii";
+-              };
+       };
+ };
++&gsw {
++        mediatek,mdio = <&mdio>;
++        mediatek,portmap = "llllw";
++        mediatek,mdio_master_pinmux = <0>;
++        reset-gpios = <&pio 54 0>;
++        interrupt-parent = <&pio>;
++        interrupts = <53 IRQ_TYPE_LEVEL_HIGH>;
++        status = "okay";
++
++        port5: port@5 {
++                compatible = "mediatek,mt753x-port";
++                reg = <5>;
++                phy-mode = "rgmii";
++                fixed-link {
++                        speed = <1000>;
++                        full-duplex;
++                };
++        };
++
++        port6: port@6 {
++                compatible = "mediatek,mt753x-port";
++                reg = <6>;
++                phy-mode = "sgmii";
++                fixed-link {
++                        speed = <2500>;
++                        full-duplex;
++                };
++        };
++};    
++
+ &i2c1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&i2c1_pins>;
+@@ -185,15 +246,28 @@
+ &pcie {
+       pinctrl-names = "default";
+-      pinctrl-0 = <&pcie0_pins>;
++      pinctrl-0 = <&pcie0_pins>, <&pcie1_pins>;
+       status = "okay";
+       pcie@0,0 {
+               status = "okay";
+       };
++
++      pcie@1,0 {
++              status = "okay";
++      };
+ };
+ &pio {
++      /* Attention: GPIO 90 is used to switch between PCIe@1,0 and
++       * SATA functions. i.e. output-high: PCIe, output-low: SATA
++       */
++      asm_sel {
++              gpio-hog;
++              gpios = <90 GPIO_ACTIVE_HIGH>;
++              output-high;
++      };
++
+       /* eMMC is shared pin with parallel NAND */
+       emmc_pins_default: emmc-pins-default {
+               mux {
+@@ -460,11 +534,11 @@
+ };
+ &sata {
+-      status = "okay";
++      status = "disable";
+ };
+ &sata_phy {
+-      status = "okay";
++      status = "disable";
+ };
+ &spi0 {
diff --git a/target/linux/mediatek/patches-5.4/0005-dts-mt7629-add-gsw.patch b/target/linux/mediatek/patches-5.4/0005-dts-mt7629-add-gsw.patch
new file mode 100644 (file)
index 0000000..99673f3
--- /dev/null
@@ -0,0 +1,67 @@
+--- a/arch/arm/boot/dts/mt7629-rfb.dts 2020-01-15 19:54:43.784316313 +0800
++++ b/arch/arm/boot/dts/mt7629-rfb.dts 2020-01-15 20:00:20.994843001 +0800
+@@ -18,6 +18,7 @@
+       chosen {
+               stdout-path = "serial0:115200n8";
++              bootargs = "earlycon=uart8250,mmio32,0x11002000 console=ttyS0,115200n8";
+       };
+       gpio-keys {
+@@ -36,6 +37,13 @@
+               };
+       };
++      gsw: gsw@0 {
++              compatible = "mediatek,mt753x";
++              mediatek,ethsys = <&ethsys>;
++              #address-cells = <1>;
++              #size-cells = <0>;
++        };
++
+       memory@40000000 {
+               device_type = "memory";
+               reg = <0x40000000 0x10000000>;
+@@ -69,6 +77,7 @@
+       gmac0: mac@0 {
+               compatible = "mediatek,eth-mac";
+               reg = <0>;
++              mtd-mac-address = <&factory 0x2a>;
+               phy-mode = "2500base-x";
+               fixed-link {
+                       speed = <2500>;
+@@ -80,6 +89,7 @@
+       gmac1: mac@1 {
+               compatible = "mediatek,eth-mac";
+               reg = <1>;
++              mtd-mac-address = <&factory 0x24>;
+               phy-mode = "gmii";
+               phy-handle = <&phy0>;
+       };
+@@ -93,6 +103,26 @@
+               };
+       };
+ };
++
++&gsw {
++      mediatek,mdio = <&mdio>;
++      mediatek,portmap = "llllw";
++      mediatek,mdio_master_pinmux = <0>;
++      reset-gpios = <&pio 28 0>;
++      interrupt-parent = <&pio>;
++      interrupts = <6 IRQ_TYPE_LEVEL_HIGH>;
++      status = "okay";
++
++      port6: port@6 {
++              compatible = "mediatek,mt753x-port";
++              reg = <6>;
++              phy-mode = "sgmii";
++              fixed-link {
++                      speed = <2500>;
++                      full-duplex;
++              };
++      };
++};
+ &i2c {
+       pinctrl-names = "default";
diff --git a/target/linux/mediatek/patches-5.4/0006-dts-fix-bpi2-console.patch b/target/linux/mediatek/patches-5.4/0006-dts-fix-bpi2-console.patch
new file mode 100755 (executable)
index 0000000..8a3d68a
--- /dev/null
@@ -0,0 +1,11 @@
+diff -urN a/arch/arm/boot/dts/mt7623n-bananapi-bpi-r2.dts b/arch/arm/boot/dts/mt7623n-bananapi-bpi-r2.dts
+--- a/arch/arm/boot/dts/mt7623n-bananapi-bpi-r2.dts    2019-12-17 14:43:47.273940258 +0800
++++ b/arch/arm/boot/dts/mt7623n-bananapi-bpi-r2.dts    2019-12-17 14:44:20.300945884 +0800
+@@ -19,6 +19,7 @@
+       chosen {
+               stdout-path = "serial2:115200n8";
++              bootargs = "console=ttyS2,115200n8";
+       };
+       cpus {
diff --git a/target/linux/mediatek/patches-5.4/0006-dts-fix-bpi64-console.patch b/target/linux/mediatek/patches-5.4/0006-dts-fix-bpi64-console.patch
new file mode 100755 (executable)
index 0000000..c0e4130
--- /dev/null
@@ -0,0 +1,12 @@
+diff -urN a/arch/arm64/boot/dts/mediatek/mt7622-bananapi-bpi-r64.dts b/arch/arm64/boot/dts/mediatek/mt7622-bananapi-bpi-r64.dts
+--- a/arch/arm64/boot/dts/mediatek/mt7622-bananapi-bpi-r64.dts 2019-11-29 16:44:05.105269904 +0800
++++ b/arch/arm64/boot/dts/mediatek/mt7622-bananapi-bpi-r64.dts 2019-11-29 16:44:20.184825647 +0800
+@@ -22,7 +22,7 @@
+       chosen {
+               stdout-path = "serial0:115200n8";
+-              bootargs = "earlycon=uart8250,mmio32,0x11002000 swiotlb=512";
++              bootargs = "earlycon=uart8250,mmio32,0x11002000 console=ttyS0,115200n1 swiotlb=512";
+       };
+       cpus {
diff --git a/target/linux/mediatek/patches-5.4/0227-arm-dts-Add-Unielec-U7623-DTS.patch b/target/linux/mediatek/patches-5.4/0227-arm-dts-Add-Unielec-U7623-DTS.patch
new file mode 100644 (file)
index 0000000..564bc0e
--- /dev/null
@@ -0,0 +1,397 @@
+From 004eb24e939b5b31f828333f37fb5cb2a877d6f2 Mon Sep 17 00:00:00 2001
+From: Kristian Evensen <kristian.evensen@gmail.com>
+Date: Sun, 17 Jun 2018 14:41:47 +0200
+Subject: [PATCH] arm: dts: Add Unielec U7623 DTS
+
+---
+ arch/arm/boot/dts/Makefile                         |   1 +
+ .../dts/mt7623a-unielec-u7623-02-emmc-512m.dts     |  18 +
+ .../boot/dts/mt7623a-unielec-u7623-02-emmc.dtsi    | 366 +++++++++++++++++++++
+ 3 files changed, 385 insertions(+)
+ create mode 100644 arch/arm/boot/dts/mt7623a-unielec-u7623-02-emmc-512m.dts
+ create mode 100644 arch/arm/boot/dts/mt7623a-unielec-u7623-02-emmc.dtsi
+
+--- a/arch/arm/boot/dts/Makefile
++++ b/arch/arm/boot/dts/Makefile
+@@ -1193,6 +1193,7 @@ dtb-$(CONFIG_ARCH_MEDIATEK) += \
+       mt7623a-rfb-nand.dtb \
+       mt7623n-rfb-emmc.dtb \
+       mt7623n-bananapi-bpi-r2.dtb \
++      mt7623a-unielec-u7623-02-emmc-512m.dtb \
+       mt7629-rfb.dtb \
+       mt8127-moose.dtb \
+       mt8135-evbp1.dtb
+ dtb-$(CONFIG_ARCH_ZX) += zx296702-ad1.dtb
+--- /dev/null
++++ b/arch/arm/boot/dts/mt7623a-unielec-u7623-02-emmc-512m.dts
+@@ -0,0 +1,18 @@
++/*
++ * Copyright 2018 Kristian Evensen <kristian.evensen@gmail.com>
++ *
++ * SPDX-License-Identifier: (GPL-2.0+ OR MIT)
++ */
++
++/dts-v1/;
++#include "mt7623a-unielec-u7623-02-emmc.dtsi"
++
++/ {
++      model = "UniElec U7623-02 eMMC (512M RAM)";
++      compatible = "unielec,u7623-02-emmc-512m", "unielec,u7623-02-emmc", "mediatek,mt7623";
++
++      memory@80000000 {
++              device_type = "memory";
++              reg = <0 0x80000000 0 0x20000000>;
++      };
++};
+--- /dev/null
++++ b/arch/arm/boot/dts/mt7623a-unielec-u7623-02-emmc.dtsi
+@@ -0,0 +1,349 @@
++/*
++ * Copyright 2018 Kristian Evensen <kristian.evensen@gmail.com>
++ *
++ * SPDX-License-Identifier: (GPL-2.0+ OR MIT)
++ */
++
++#include <dt-bindings/input/input.h>
++#include "mt7623.dtsi"
++#include "mt6323.dtsi"
++
++/ {
++      compatible = "unielec,u7623-02-emmc", "mediatek,mt7623";
++
++      aliases {
++              serial2 = &uart2;
++      };
++
++      chosen {
++              bootargs = "root=/dev/mmcblk0p2 rootfstype=squashfs,f2fs";
++              stdout-path = "serial2:115200n8";
++      };
++
++      cpus {
++              cpu@0 {
++                      proc-supply = <&mt6323_vproc_reg>;
++              };
++
++              cpu@1 {
++                      proc-supply = <&mt6323_vproc_reg>;
++              };
++
++              cpu@2 {
++                      proc-supply = <&mt6323_vproc_reg>;
++              };
++
++              cpu@3 {
++                      proc-supply = <&mt6323_vproc_reg>;
++              };
++      };
++
++      reg_1p8v: regulator-1p8v {
++              compatible = "regulator-fixed";
++              regulator-name = "fixed-1.8V";
++              regulator-min-microvolt = <1800000>;
++              regulator-max-microvolt = <1800000>;
++              regulator-boot-on;
++              regulator-always-on;
++      };
++
++      reg_3p3v: regulator-3p3v {
++              compatible = "regulator-fixed";
++              regulator-name = "fixed-3.3V";
++              regulator-min-microvolt = <3300000>;
++              regulator-max-microvolt = <3300000>;
++              regulator-boot-on;
++              regulator-always-on;
++      };
++
++      reg_5v: regulator-5v {
++              compatible = "regulator-fixed";
++              regulator-name = "fixed-5V";
++              regulator-min-microvolt = <5000000>;
++              regulator-max-microvolt = <5000000>;
++              regulator-boot-on;
++              regulator-always-on;
++      };
++
++      gpio-keys {
++              compatible = "gpio-keys";
++              pinctrl-names = "default";
++              pinctrl-0 = <&key_pins_a>;
++
++              factory {
++                      label = "factory";
++                      linux,code = <KEY_RESTART>;
++                      gpios = <&pio 256 GPIO_ACTIVE_LOW>;
++              };
++      };
++
++      leds {
++              compatible = "gpio-leds";
++              pinctrl-names = "default";
++              pinctrl-0 = <&led_pins_unielec>;
++
++              led3 {
++                      label = "u7623-01:green:led3";
++                      gpios = <&pio 14 GPIO_ACTIVE_LOW>;
++                      default-state = "off";
++              };
++
++              led4 {
++                      label = "u7623-01:green:led4";
++                      gpios = <&pio 15 GPIO_ACTIVE_LOW>;
++                      default-state = "off";
++              };
++      };
++
++      mt7530: switch@0 {
++              compatible = "mediatek,mt7530";
++              #address-cells = <1>;
++              #size-cells = <0>;
++      };
++};
++
++&crypto {
++      status = "okay";
++};
++
++&eth {
++      status = "okay";
++
++      gmac0: mac@0 {
++              compatible = "mediatek,eth-mac";
++              reg = <0>;
++              phy-mode = "trgmii";
++
++              fixed-link {
++                      speed = <1000>;
++                      full-duplex;
++                      pause;
++              };
++      };
++
++      mdio: mdio-bus {
++              #address-cells = <1>;
++              #size-cells = <0>;
++              phy5: ethernet-phy@5 {
++                      reg = <5>;
++                      phy-mode = "rgmii-rxid";
++              };
++      };
++};
++
++&mt7530 {
++      compatible = "mediatek,mt7530";
++      #address-cells = <1>;
++      #size-cells = <0>;
++      reg = <0>;
++      pinctrl-names = "default";
++      mediatek,mcm;
++      resets = <&ethsys 2>;
++      reset-names = "mcm";
++      core-supply = <&mt6323_vpa_reg>;
++      io-supply = <&mt6323_vemc3v3_reg>;
++
++      dsa,mii-bus = <&mdio>;
++
++      ports {
++              #address-cells = <1>;
++              #size-cells = <0>;
++              reg = <0>;
++
++              port@0 {
++                      reg = <0>;
++                      label = "lan0";
++                      cpu = <&cpu_port0>;
++              };
++
++              port@1 {
++                      reg = <1>;
++                      label = "lan1";
++                      cpu = <&cpu_port0>;
++              };
++
++              port@2 {
++                      reg = <2>;
++                      label = "lan2";
++                      cpu = <&cpu_port0>;
++              };
++
++              port@3 {
++                      reg = <3>;
++                      label = "lan3";
++                      cpu = <&cpu_port0>;
++              };
++
++              port@4 {
++                      reg = <4>;
++                      label = "wan";
++                      cpu = <&cpu_port0>;
++              };
++
++              cpu_port0: port@6 {
++                      reg = <6>;
++                      label = "cpu";
++                      ethernet = <&gmac0>;
++                      phy-mode = "trgmii";
++
++                      fixed-link {
++                              speed = <1000>;
++                              full-duplex;
++                      };
++              };
++      };
++};
++
++&mmc0 {
++      pinctrl-names = "default", "state_uhs";
++      pinctrl-0 = <&mmc0_pins_default>;
++      pinctrl-1 = <&mmc0_pins_uhs>;
++      status = "okay";
++      bus-width = <8>;
++      max-frequency = <50000000>;
++      cap-mmc-highspeed;
++      vmmc-supply = <&reg_3p3v>;
++      vqmmc-supply = <&reg_1p8v>;
++      non-removable;
++};
++
++&pio {
++      key_pins_a: keys-alt {
++              pins-keys {
++                      pinmux = <MT7623_PIN_256_GPIO256_FUNC_GPIO256>,
++                               <MT7623_PIN_257_GPIO257_FUNC_GPIO257>;
++                      input-enable;
++              };
++      };
++
++      led_pins_unielec: leds-unielec {
++              pins-leds {
++                      pinmux = <MT7623_PIN_14_GPIO14_FUNC_GPIO14>,
++                               <MT7623_PIN_15_GPIO15_FUNC_GPIO15>;
++              };
++      };
++
++      mmc0_pins_default: mmc0default {
++              pins_cmd_dat {
++                      pinmux = <MT7623_PIN_111_MSDC0_DAT7_FUNC_MSDC0_DAT7>,
++                               <MT7623_PIN_112_MSDC0_DAT6_FUNC_MSDC0_DAT6>,
++                               <MT7623_PIN_113_MSDC0_DAT5_FUNC_MSDC0_DAT5>,
++                               <MT7623_PIN_114_MSDC0_DAT4_FUNC_MSDC0_DAT4>,
++                               <MT7623_PIN_118_MSDC0_DAT3_FUNC_MSDC0_DAT3>,
++                               <MT7623_PIN_119_MSDC0_DAT2_FUNC_MSDC0_DAT2>,
++                               <MT7623_PIN_120_MSDC0_DAT1_FUNC_MSDC0_DAT1>,
++                               <MT7623_PIN_121_MSDC0_DAT0_FUNC_MSDC0_DAT0>,
++                               <MT7623_PIN_116_MSDC0_CMD_FUNC_MSDC0_CMD>;
++                      input-enable;
++                      bias-pull-up;
++              };
++
++              pins_clk {
++                      pinmux = <MT7623_PIN_117_MSDC0_CLK_FUNC_MSDC0_CLK>;
++                      bias-pull-down;
++              };
++
++              pins_rst {
++                      pinmux = <MT7623_PIN_115_MSDC0_RSTB_FUNC_MSDC0_RSTB>;
++                      bias-pull-up;
++              };
++      };
++
++      mmc0_pins_uhs: mmc0 {
++              pins_cmd_dat {
++                      pinmux = <MT7623_PIN_111_MSDC0_DAT7_FUNC_MSDC0_DAT7>,
++                               <MT7623_PIN_112_MSDC0_DAT6_FUNC_MSDC0_DAT6>,
++                               <MT7623_PIN_113_MSDC0_DAT5_FUNC_MSDC0_DAT5>,
++                               <MT7623_PIN_114_MSDC0_DAT4_FUNC_MSDC0_DAT4>,
++                               <MT7623_PIN_118_MSDC0_DAT3_FUNC_MSDC0_DAT3>,
++                               <MT7623_PIN_119_MSDC0_DAT2_FUNC_MSDC0_DAT2>,
++                               <MT7623_PIN_120_MSDC0_DAT1_FUNC_MSDC0_DAT1>,
++                               <MT7623_PIN_121_MSDC0_DAT0_FUNC_MSDC0_DAT0>,
++                               <MT7623_PIN_116_MSDC0_CMD_FUNC_MSDC0_CMD>;
++                      input-enable;
++                      drive-strength = <MTK_DRIVE_2mA>;
++                      bias-pull-up = <MTK_PUPD_SET_R1R0_01>;
++              };
++
++              pins_clk {
++                      pinmux = <MT7623_PIN_117_MSDC0_CLK_FUNC_MSDC0_CLK>;
++                      drive-strength = <MTK_DRIVE_2mA>;
++                      bias-pull-down = <MTK_PUPD_SET_R1R0_01>;
++              };
++
++              pins_rst {
++                      pinmux = <MT7623_PIN_115_MSDC0_RSTB_FUNC_MSDC0_RSTB>;
++                      bias-pull-up;
++              };
++      };
++
++      pcie_default: pcie_pin_default {
++              pins_cmd_dat {
++                      pinmux = <MT7623_PIN_208_AUD_EXT_CK1_FUNC_PCIE0_PERST_N>,
++                               <MT7623_PIN_209_AUD_EXT_CK2_FUNC_PCIE1_PERST_N>;
++                      bias-disable;
++              };
++      };
++};
++
++&pwm {
++      pinctrl-names = "default";
++      pinctrl-0 = <&pwm_pins_a>;
++      status = "okay";
++};
++
++&pwrap {
++      mt6323 {
++              mt6323led: led {
++                      compatible = "mediatek,mt6323-led";
++                      #address-cells = <1>;
++                      #size-cells = <0>;
++
++                      led@0 {
++                              reg = <0>;
++                              label = "led0";
++                              default-state = "off";
++                      };
++              };
++      };
++};
++
++&uart2 {
++      pinctrl-names = "default";
++      pinctrl-0 = <&uart2_pins_b>;
++      status = "okay";
++};
++
++&usb1 {
++      vusb33-supply = <&reg_3p3v>;
++      vbus-supply = <&reg_3p3v>;
++      status = "okay";
++};
++
++&u3phy1 {
++      status = "okay";
++};
++
++&u3phy2 {
++      status = "okay";
++      mediatek,phy-switch = <&hifsys>;
++};
++
++&pcie {
++      pinctrl-names = "default";
++      pinctrl-0 = <&pcie_default>;
++      status = "okay";
++
++      pcie@1,0 {
++              status = "okay";
++      };
++
++      pcie@2,0 {
++              status = "okay";
++      };
++};
++
++&pcie1_phy {
++      status = "okay";
++};
++