[source] mediatek: bump to v4.9

LEDE Commits lede-commits at lists.infradead.org
Thu Feb 16 01:00:06 PST 2017


blogic pushed a commit to source.git, branch master:
https://git.lede-project.org/53f5d59fa17049d94a3992d1067ded1fa90f61f8

commit 53f5d59fa17049d94a3992d1067ded1fa90f61f8
Author: John Crispin <john at phrozen.org>
AuthorDate: Thu Feb 16 09:53:03 2017 +0100

    mediatek: bump to v4.9
    
    Signed-off-by: John Crispin <john at phrozen.org>
---
 target/linux/mediatek/Makefile                     |    2 +-
 target/linux/mediatek/config-4.4                   |  415 --
 .../mediatek/files/arch/arm/boot/dts/_mt7623.dtsi  |    2 +-
 ...diatek-Separate-scpsys-driver-common-code.patch |  665 ---
 ...ediatek-Init-MT8173-scpsys-driver-earlier.patch |   33 -
 ...-mediatek-Add-MT2701-MT7623-scpsys-driver.patch |  204 -
 ...k-Refine-the-makefile-to-support-multiple.patch |   61 -
 ...-ARM-Mediatek-Document-bindings-for-MT270.patch |  172 -
 ...ediatek-Add-dt-bindings-for-MT2701-clocks.patch |  499 --
 ...tek-mt2701-reset-controller-dt-binding-fi.patch |   93 -
 ...-mediatek-Modify-pinctrl-bindings-for-mt2.patch |   31 -
 ...bindings-Add-pinfunc-header-file-for-mt27.patch | 3792 --------------
 ...-mediatek-Modify-pinctrl-bindings-for-mt7.patch |  547 --
 ...l-dt-bindings-Add-pinctrl-file-for-mt7623.patch | 2379 ---------
 ...-Add-a-binding-for-Mediatek-xHCI-host-con.patch |   69 -
 ...mediatek-support-MTK-xHCI-host-controller.patch | 1525 ------
 ...-dts-mediatek-add-xHCI-usb-phy-for-mt8173.patch |  107 -
 ...-Add-bindings-for-mediatek-MT7623-SoC-Pla.patch |   55 -
 ...ek-add-compat-string-for-mt7623-to-scpsys.patch |   22 -
 ...ARM-dts-mediatek-add-MT7623-basic-support.patch | 1079 ----
 .../patches-4.4/0026-scpsys-various-fixes.patch    |   56 -
 ...k-PMIC-wrap-Clear-the-vldclr-if-state-mac.patch |   69 -
 ...-ARM-mediatek-add-MT7623-smp-bringup-code.patch |   36 -
 ...k-PMIC-wrap-clear-the-STAUPD_TRIG-bit-of-.patch |   58 -
 ...-ARM-mediatek-add-mt2701-smp-bringup-code.patch |   23 -
 ...-ARM-Mediatek-add-MT2701-7623-string-to-t.patch |   23 -
 ...k-PMIC-wrap-don-t-duplicate-the-wrapper-d.patch |   93 -
 ...k-PMIC-wrap-add-wrapper-callbacks-for-ini.patch |  122 -
 ...k-PMIC-wrap-split-SoC-specific-init-into-.patch |  122 -
 ...k-PMIC-wrap-WRAP_INT_EN-needs-a-different.patch |   48 -
 ...k-PMIC-wrap-SPI_WRITE-needs-a-different-b.patch |   61 -
 ...k-PMIC-wrap-move-wdt_src-into-the-pmic_wr.patch |   61 -
 ...k-PMIC-wrap-remove-pwrap_is_mt8135-and-pw.patch |  113 -
 ...tek-PMIC-wrap-add-a-slave-specific-struct.patch |  297 --
 ...diatek-PMIC-wrap-add-mt6323-slave-support.patch |   93 -
 ...ediatek-PMIC-wrap-add-MT2701-7623-support.patch |  232 -
 ...-mfd-Add-bindings-for-the-MediaTek-MT6323.patch |   50 -
 ...int_con-and-int_status-may-vary-in-locati.patch |   97 -
 ...397-add-support-for-different-Slave-types.patch |  100 -
 ...t6397-add-MT6323-support-to-MT6397-driver.patch |  519 --
 ...gulator-Add-document-for-MT6323-regulator.patch |  254 -
 ...r-mt6323-Add-support-for-MT6323-regulator.patch |  538 --
 ...diatek-document-MediaTek-SoC-ethernet-bin.patch |   97 -
 ...-mediatek-add-support-for-MT7623-ethernet.patch | 2262 ---------
 ...et-next-mediatek-add-Kconfig-and-Makefile.patch |   65 -
 ...next-mediatek-add-an-entry-to-MAINTAINERS.patch |   29 -
 ...k-make-a7-timer-work-Signed-off-by-John-C.patch |   31 -
 ...iatek-checking-for-IS_ERR-instead-of-NULL.patch |   27 -
 ...et-mediatek-unlock-on-error-in-mtk_tx_map.patch |   24 -
 ...059-net-mediatek-use-dma_addr_t-correctly.patch |   30 -
 ...atek-remove-incorrect-dma_mask-assignment.patch |   31 -
 ...t-mediatek-check-device_reset-return-code.patch |   33 -
 ...2-net-mediatek-watchdog_timeo-was-not-set.patch |   23 -
 ...ediatek-mtk_cal_txd_req-returns-bad-value.patch |   25 -
 ...net-mediatek-remove-superflous-reset-call.patch |   26 -
 ...net-mediatek-fix-stop-and-wakeup-of-queue.patch |   84 -
 .../0066-net-mediatek-fix-mtk_pending_work.patch   |   58 -
 .../0067-net-mediatek-fix-TX-locking.patch         |   93 -
 ...k-move-the-pending_work-struct-to-the-dev.patch |  102 -
 ...k-do-not-set-the-QID-field-in-the-TX-DMA-.patch |   32 -
 ...k-update-the-IRQ-part-of-the-binding-docu.patch |   41 -
 ...mtd-backport-v4.7-0day-patches-from-Boris.patch | 5286 --------------------
 ...pare-helper-reading-NAND-ECC-algo-from-DT.patch |   91 -
 ...k-device-tree-docs-for-MTK-Smart-Device-G.patch |  179 -
 ...tek-driver-for-MTK-Smart-Device-Gen1-NAND.patch | 2064 --------
 ...-add-power-domains-to-the-mediatek-driver.patch |   67 -
 ...diatek-use-mdiobus_free-in-favour-of-kfre.patch |   36 -
 ...diatek-fix-gigabit-and-flow-control-adver.patch |   71 -
 ...9-net-next-mediatek-add-fixed-phy-support.patch |   38 -
 ...next-mediatek-properly-handle-RGMII-modes.patch |   31 -
 .../0081-net-next-mediatek-fix-DQL-support.patch   |   92 -
 ...xt-mediatek-add-missing-return-code-check.patch |   26 -
 ...diatek-fix-missing-free-of-scratch-memory.patch |   92 -
 ...diatek-invalid-buffer-lookup-in-mtk_tx_ma.patch |   27 -
 ...diatek-dropped-rx-packets-are-not-being-c.patch |   34 -
 ...diatek-add-next-data-pointer-coherency-pr.patch |   39 -
 ...diatek-disable-all-interrupts-during-prob.patch |   26 -
 ...088-net-next-mediatek-fix-threshold-value.patch |   30 -
 ...net-next-mediatek-increase-watchdog_timeo.patch |   26 -
 ...diatek-fix-off-by-one-in-the-TX-ring-allo.patch |   36 -
 ...diatek-only-wake-the-queue-if-it-is-stopp.patch |   48 -
 ...diatek-remove-superfluous-queue-wake-up-c.patch |   36 -
 ...ediatek-remove-superfluous-register-reads.patch |   37 -
 ...diatek-don-t-use-intermediate-variables-t.patch |   82 -
 .../0095-net-next-mediatek-add-IRQ-locking.patch   |   64 -
 ...ext-mediatek-add-support-for-IRQ-grouping.patch |  361 --
 ...net-next-mediatek-change-my-email-address.patch |   30 -
 ...diatek-only-trigger-the-tx-watchdog-reset.patch |   57 -
 .../0099-MAINTAINERS-change-my-email-address.patch |   23 -
 ...-add-Sean-as-mediatek-ethernet-maintainer.patch |   25 -
 .../0102-net-mediatek-v4.4-backports.patch         |   46 -
 .../mediatek/patches-4.9/0000-pinctrl-esw.patch    |   12 +
 .../0001-NET-multi-phy-support.patch               |    0
 ...soc-mediatek-Add-MT2701-power-dt-bindings.patch |    0
 ...009-clk-mediatek-Add-MT2701-clock-support.patch |   24 +-
 .../0011-reset-mediatek-mt2701-reset-driver.patch  |    0
 ...k-Add-MT2701-config-options-for-mediatek-.patch |    6 +-
 .../0017-clk-add-hifsys-reset.patch                |   18 +-
 ...s-add-MediaTek-PCIe-binding-documentation.patch |    0
 ...k-add-support-for-PCIe-found-on-MT7623-MT.patch |   16 +-
 .../patches-4.9/0026-scpsys-various-fixes.patch    |   22 +
 .../0052-clk-dont-disable-unused-clocks.patch      |    0
 .../0053-clk-mediatek-enable-critical-clocks.patch |    0
 ...k-Export-CPU-mux-clocks-for-CPU-frequency.patch |   20 +-
 .../0055-cpufreq-mediatek-add-driver.patch         |    0
 .../0071-pwm-add-pwm-mediatek.patch                |   57 +-
 .../0101-net-mediatek-add-gsw-mt7530-driver.patch  |  146 +-
 .../0103-nand_fixes.patch                          |    0
 .../0200-devicetree.patch                          |    0
 .../0201-block2mtd.patch                           |    0
 110 files changed, 136 insertions(+), 27215 deletions(-)

diff --git a/target/linux/mediatek/Makefile b/target/linux/mediatek/Makefile
index e3eecd5..0b495ef 100644
--- a/target/linux/mediatek/Makefile
+++ b/target/linux/mediatek/Makefile
@@ -10,7 +10,7 @@ CPU_TYPE:=cortex-a7
 CPU_SUBTYPE:=neon-vfpv4
 MAINTAINER:=John Crispin <john at phrozen.org>
 
-KERNEL_PATCHVER:=4.4
+KERNEL_PATCHVER:=4.9
 
 KERNELNAME:=Image dtbs zImage
 
diff --git a/target/linux/mediatek/config-4.4 b/target/linux/mediatek/config-4.4
deleted file mode 100644
index 56e721b..0000000
--- a/target/linux/mediatek/config-4.4
+++ /dev/null
@@ -1,415 +0,0 @@
-# CONFIG_AIO is not set
-CONFIG_ALIGNMENT_TRAP=y
-# CONFIG_APM_EMULATION is not set
-CONFIG_ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE=y
-CONFIG_ARCH_HAS_ELF_RANDOMIZE=y
-CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y
-CONFIG_ARCH_HAS_SG_CHAIN=y
-CONFIG_ARCH_HAS_TICK_BROADCAST=y
-CONFIG_ARCH_HAVE_CUSTOM_GPIO_H=y
-CONFIG_ARCH_HIBERNATION_POSSIBLE=y
-CONFIG_ARCH_MEDIATEK=y
-CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y
-CONFIG_ARCH_MULTIPLATFORM=y
-# CONFIG_ARCH_MULTI_CPU_AUTO is not set
-CONFIG_ARCH_MULTI_V6_V7=y
-CONFIG_ARCH_MULTI_V7=y
-CONFIG_ARCH_NR_GPIO=0
-# CONFIG_ARCH_SELECT_MEMORY_MODEL is not set
-# CONFIG_ARCH_SPARSEMEM_DEFAULT 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_GENERAL_HUGETLB=y
-CONFIG_ARCH_WANT_IPC_PARSE_VERSION=y
-CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=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_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_MT7623_CPUFREQ=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_BOOTPARAM_SOFTLOCKUP_PANIC is not set
-CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0
-CONFIG_BOUNCE=y
-# CONFIG_CACHE_L2X0 is not set
-CONFIG_CC_STACKPROTECTOR=y
-# CONFIG_CC_STACKPROTECTOR_NONE is not set
-CONFIG_CC_STACKPROTECTOR_REGULAR=y
-CONFIG_CLEANCACHE=y
-CONFIG_CLKDEV_LOOKUP=y
-CONFIG_CLKSRC_MMIO=y
-CONFIG_CLKSRC_OF=y
-CONFIG_CLKSRC_PROBE=y
-CONFIG_CLONE_BACKWARDS=y
-CONFIG_CMDLINE="earlyprintk console=ttyS0,115200 block2mtd.block2mtd=/dev/mmcblk0,65536,eMMC,5 mtdparts=eMMC:256k(mbr)ro,512k(uboot)ro,256k(config)ro,256k(factory)ro,32M(kernel),32M(recovery),1024M(rootfs),2048M(usrdata),-(bmtpool) rootfstype=squashfs,jffs2"
-CONFIG_CMDLINE_FORCE=y
-CONFIG_COMMON_CLK=y
-CONFIG_COMMON_CLK_MEDIATEK=y
-CONFIG_COMMON_CLK_MT2701=y
-# CONFIG_COMMON_CLK_MT8135 is not set
-# CONFIG_COMMON_CLK_MT8173 is not set
-CONFIG_COMPACTION=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_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_ICACHE_DISABLE is not set
-CONFIG_CPU_PABRT_V7=y
-CONFIG_CPU_PM=y
-CONFIG_CPU_RMAP=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_DEFLATE=y
-CONFIG_CRYPTO_LZO=y
-CONFIG_CRYPTO_RNG2=y
-CONFIG_CRYPTO_WORKQUEUE=y
-CONFIG_DCACHE_WORD_ACCESS=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_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_ENGINE=y
-CONFIG_DMA_OF=y
-CONFIG_DTC=y
-# CONFIG_DW_DMAC_PCI is not set
-CONFIG_EARLY_PRINTK=y
-CONFIG_EDAC_ATOMIC_SCRUB=y
-CONFIG_EDAC_SUPPORT=y
-CONFIG_ELF_CORE=y
-CONFIG_FIXED_PHY=y
-CONFIG_FIX_EARLYCON_MEM=y
-CONFIG_FREEZER=y
-CONFIG_GENERIC_ALLOCATOR=y
-CONFIG_GENERIC_BUG=y
-CONFIG_GENERIC_CLOCKEVENTS=y
-CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y
-CONFIG_GENERIC_IDLE_POLL_SETUP=y
-CONFIG_GENERIC_IO=y
-CONFIG_GENERIC_IRQ_SHOW=y
-CONFIG_GENERIC_IRQ_SHOW_LEVEL=y
-CONFIG_GENERIC_MSI_IRQ=y
-CONFIG_GENERIC_PCI_IOMAP=y
-CONFIG_GENERIC_PHY=y
-CONFIG_GENERIC_PINCONF=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_DEVRES=y
-CONFIG_GPIO_SYSFS=y
-CONFIG_HANDLE_DOMAIN_IRQ=y
-CONFIG_HARDIRQS_SW_RESEND=y
-CONFIG_HAS_DMA=y
-CONFIG_HAS_IOMEM=y
-CONFIG_HAS_IOPORT_MAP=y
-# CONFIG_HAVE_64BIT_ALIGNED_ACCESS is not set
-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_TRACEHOOK=y
-CONFIG_HAVE_ARM_ARCH_TIMER=y
-# CONFIG_HAVE_BOOTMEM_INFO_NODE is not set
-CONFIG_HAVE_BPF_JIT=y
-CONFIG_HAVE_CC_STACKPROTECTOR=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_API_DEBUG=y
-CONFIG_HAVE_DMA_ATTRS=y
-CONFIG_HAVE_DMA_CONTIGUOUS=y
-CONFIG_HAVE_DYNAMIC_FTRACE=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_GENERIC_DMA_COHERENT=y
-CONFIG_HAVE_IDE=y
-CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y
-CONFIG_HAVE_MEMBLOCK=y
-CONFIG_HAVE_MOD_ARCH_SPECIFIC=y
-CONFIG_HAVE_NET_DSA=y
-CONFIG_HAVE_OPROFILE=y
-CONFIG_HAVE_OPTPROBES=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_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_HZ_FIXED=0
-CONFIG_I2C=y
-CONFIG_I2C_BOARDINFO=y
-CONFIG_I2C_CHARDEV=y
-CONFIG_I2C_MT65XX=y
-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_IOMMU_HELPER=y
-# CONFIG_IOMMU_IO_PGTABLE_LPAE is not set
-CONFIG_IOMMU_SUPPORT=y
-CONFIG_IRQCHIP=y
-CONFIG_IRQ_DOMAIN=y
-CONFIG_IRQ_DOMAIN_HIERARCHY=y
-CONFIG_IRQ_FORCED_THREADING=y
-CONFIG_IRQ_WORK=y
-CONFIG_KALLSYMS=y
-CONFIG_LIBFDT=y
-CONFIG_LOCKUP_DETECTOR=y
-CONFIG_LOCK_SPIN_ON_OWNER=y
-CONFIG_LZO_COMPRESS=y
-CONFIG_LZO_DECOMPRESS=y
-CONFIG_MACH_MT2701=y
-# CONFIG_MACH_MT6589 is not set
-# CONFIG_MACH_MT6592 is not set
-CONFIG_MACH_MT7623=y
-CONFIG_MACH_MT8127=y
-# CONFIG_MACH_MT8135 is not set
-CONFIG_MAGIC_SYSRQ=y
-CONFIG_MDIO_BITBANG=y
-CONFIG_MDIO_BOARDINFO=y
-CONFIG_MDIO_GPIO=y
-CONFIG_MEDIATEK_WATCHDOG=y
-CONFIG_MFD_CORE=y
-CONFIG_MFD_MT6397=y
-CONFIG_MFD_SYSCON=y
-CONFIG_MIGHT_HAVE_CACHE_L2X0=y
-CONFIG_MIGHT_HAVE_PCI=y
-CONFIG_MIGRATION=y
-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_MTD_BLOCK2MTD=y
-CONFIG_MTD_CMDLINE_PARTS=y
-CONFIG_MTD_M25P80=y
-CONFIG_MTD_MT81xx_NOR=y
-CONFIG_MTD_NAND=y
-CONFIG_MTD_NAND_ECC=y
-CONFIG_MTD_NAND_MTK=y
-CONFIG_MTD_SPI_NOR=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_INFRACFG=y
-CONFIG_MTK_PMIC_WRAP=y
-CONFIG_MTK_SCPSYS=y
-CONFIG_MTK_SCPSYS_MT2701=y
-CONFIG_MTK_SCPSYS_MT8173=y
-CONFIG_MTK_TIMER=y
-CONFIG_MULTI_IRQ_HANDLER=y
-CONFIG_MUTEX_SPIN_ON_OWNER=y
-CONFIG_NEED_DMA_MAP_STATE=y
-# CONFIG_NEON is not set
-CONFIG_NET_FLOW_LIMIT=y
-CONFIG_NET_MEDIATEK_SOC=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_BOOTMEM=y
-CONFIG_NO_HZ=y
-CONFIG_NO_HZ_COMMON=y
-CONFIG_NO_HZ_IDLE=y
-CONFIG_NR_CPUS=4
-CONFIG_OF=y
-CONFIG_OF_ADDRESS=y
-CONFIG_OF_ADDRESS_PCI=y
-CONFIG_OF_EARLY_FLATTREE=y
-CONFIG_OF_FLATTREE=y
-CONFIG_OF_GPIO=y
-CONFIG_OF_IRQ=y
-CONFIG_OF_MDIO=y
-CONFIG_OF_MTD=y
-CONFIG_OF_NET=y
-CONFIG_OF_PCI=y
-CONFIG_OF_PCI_IRQ=y
-CONFIG_OF_RESERVED_MEM=y
-CONFIG_OLD_SIGACTION=y
-CONFIG_OLD_SIGSUSPEND3=y
-CONFIG_PAGE_OFFSET=0xC0000000
-CONFIG_PCI=y
-CONFIG_PCIE_MTK=y
-# CONFIG_PCI_DOMAINS_GENERIC is not set
-CONFIG_PCI_MSI=y
-CONFIG_PERF_USE_VMALLOC=y
-CONFIG_PGTABLE_LEVELS=2
-CONFIG_PHYLIB=y
-CONFIG_PHY_MT65XX_USB3=y
-CONFIG_PINCTRL=y
-CONFIG_PINCTRL_MT2701=y
-CONFIG_PINCTRL_MT6397=y
-CONFIG_PINCTRL_MT7623=y
-CONFIG_PINCTRL_MT8127=y
-# CONFIG_PINCTRL_MT8135 is not set
-CONFIG_PINCTRL_MTK_COMMON=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_PREEMPT=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_RATIONAL=y
-CONFIG_RCU_CPU_STALL_TIMEOUT=21
-# CONFIG_RCU_EXPERT is not set
-CONFIG_RCU_STALL_COMMON=y
-CONFIG_REGMAP=y
-CONFIG_REGMAP_MMIO=y
-CONFIG_REGULATOR=y
-CONFIG_REGULATOR_FIXED_VOLTAGE=y
-CONFIG_REGULATOR_GPIO=y
-CONFIG_REGULATOR_MT6323=y
-# 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_CMOS is not set
-# CONFIG_RTC_DRV_MT6397 is not set
-CONFIG_RWSEM_SPIN_ON_OWNER=y
-CONFIG_RWSEM_XCHGADD_ALGORITHM=y
-CONFIG_SCHED_HRTICK=y
-# CONFIG_SCHED_INFO is not set
-# CONFIG_SCSI_DMA 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_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_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_SWIOTLB=y
-CONFIG_SWP_EMULATE=y
-CONFIG_SYS_SUPPORTS_APM_EMULATION=y
-# CONFIG_THUMB2_KERNEL is not set
-CONFIG_TICK_CPU_ACCOUNTING=y
-CONFIG_TIMER_STATS=y
-CONFIG_UBIFS_FS=y
-# CONFIG_UBIFS_FS_ADVANCED_COMPR is not set
-CONFIG_UBIFS_FS_LZO=y
-CONFIG_UBIFS_FS_ZLIB=y
-CONFIG_UEVENT_HELPER_PATH=""
-CONFIG_UNCOMPRESS_INCLUDE="debug/uncompress.h"
-CONFIG_UNINLINE_SPIN_UNLOCK=y
-CONFIG_USB=y
-CONFIG_USB_COMMON=y
-# CONFIG_USB_EHCI_HCD is not set
-CONFIG_USB_SUPPORT=y
-# CONFIG_USB_UHCI_HCD is not set
-CONFIG_USB_XHCI_HCD=y
-CONFIG_USB_XHCI_MTK=y
-CONFIG_USB_XHCI_PCI=y
-CONFIG_USB_XHCI_PLATFORM=y
-CONFIG_USE_OF=y
-CONFIG_VECTORS_BASE=0xffff0000
-CONFIG_VFP=y
-CONFIG_VFPv3=y
-CONFIG_VM_EVENT_COUNTERS=y
-CONFIG_WATCHDOG_CORE=y
-CONFIG_XPS=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_ZONE_DMA_FLAG=0
diff --git a/target/linux/mediatek/files/arch/arm/boot/dts/_mt7623.dtsi b/target/linux/mediatek/files/arch/arm/boot/dts/_mt7623.dtsi
index 87be1b8..0f91194 100644
--- a/target/linux/mediatek/files/arch/arm/boot/dts/_mt7623.dtsi
+++ b/target/linux/mediatek/files/arch/arm/boot/dts/_mt7623.dtsi
@@ -17,7 +17,7 @@
 #include <dt-bindings/clock/mt2701-clk.h>
 #include <dt-bindings/power/mt2701-power.h>
 #include <dt-bindings/phy/phy.h>
-#include <dt-bindings/reset-controller/mt2701-resets.h>
+#include <dt-bindings/reset/mt2701-resets.h>
 #include <dt-bindings/pinctrl/mt7623-pinfunc.h>
 #include "skeleton64.dtsi"
 
diff --git a/target/linux/mediatek/patches-4.4/0002-soc-mediatek-Separate-scpsys-driver-common-code.patch b/target/linux/mediatek/patches-4.4/0002-soc-mediatek-Separate-scpsys-driver-common-code.patch
deleted file mode 100644
index 194e669..0000000
--- a/target/linux/mediatek/patches-4.4/0002-soc-mediatek-Separate-scpsys-driver-common-code.patch
+++ /dev/null
@@ -1,665 +0,0 @@
-From 1892fcf687116720d07135c83d489a23ec56a166 Mon Sep 17 00:00:00 2001
-From: James Liao <jamesjj.liao at mediatek.com>
-Date: Wed, 30 Dec 2015 14:41:43 +0800
-Subject: [PATCH 002/102] soc: mediatek: Separate scpsys driver common code
-
-Separate scpsys driver common code to mtk-scpsys.c, and move MT8173
-platform code to mtk-scpsys-mt8173.c.
-
-Signed-off-by: James Liao <jamesjj.liao at mediatek.com>
----
- drivers/soc/mediatek/Kconfig             |   13 +-
- drivers/soc/mediatek/Makefile            |    1 +
- drivers/soc/mediatek/mtk-scpsys-mt8173.c |  179 ++++++++++++++++++
- drivers/soc/mediatek/mtk-scpsys.c        |  301 ++++++++----------------------
- drivers/soc/mediatek/mtk-scpsys.h        |   54 ++++++
- 5 files changed, 320 insertions(+), 228 deletions(-)
- create mode 100644 drivers/soc/mediatek/mtk-scpsys-mt8173.c
- create mode 100644 drivers/soc/mediatek/mtk-scpsys.h
-
---- a/drivers/soc/mediatek/Kconfig
-+++ b/drivers/soc/mediatek/Kconfig
-@@ -22,11 +22,20 @@ config MTK_PMIC_WRAP
- 
- config MTK_SCPSYS
- 	bool "MediaTek SCPSYS Support"
--	depends on ARCH_MEDIATEK || COMPILE_TEST
--	default ARM64 && ARCH_MEDIATEK
- 	select REGMAP
- 	select MTK_INFRACFG
- 	select PM_GENERIC_DOMAINS if PM
- 	help
- 	  Say yes here to add support for the MediaTek SCPSYS power domain
- 	  driver.
-+
-+config MTK_SCPSYS_MT8173
-+	bool "MediaTek MT8173 SCPSYS Support"
-+	depends on ARCH_MEDIATEK || COMPILE_TEST
-+	select MTK_SCPSYS
-+	default ARCH_MEDIATEK
-+	help
-+	  Say yes here to add support for the MT8173 SCPSYS power domain
-+	  driver.
-+	  The System Control Processor System (SCPSYS) has several power
-+	  management related tasks in the system.
---- a/drivers/soc/mediatek/Makefile
-+++ b/drivers/soc/mediatek/Makefile
-@@ -1,3 +1,4 @@
- obj-$(CONFIG_MTK_INFRACFG) += mtk-infracfg.o
- obj-$(CONFIG_MTK_PMIC_WRAP) += mtk-pmic-wrap.o
- obj-$(CONFIG_MTK_SCPSYS) += mtk-scpsys.o
-+obj-$(CONFIG_MTK_SCPSYS_MT8173) += mtk-scpsys-mt8173.o
---- /dev/null
-+++ b/drivers/soc/mediatek/mtk-scpsys-mt8173.c
-@@ -0,0 +1,179 @@
-+/*
-+ * Copyright (c) 2015 Pengutronix, Sascha Hauer <kernel at pengutronix.de>
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 as
-+ * published by the Free Software Foundation.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ */
-+#include <linux/mfd/syscon.h>
-+#include <linux/module.h>
-+#include <linux/of_device.h>
-+#include <linux/pm_domain.h>
-+#include <linux/soc/mediatek/infracfg.h>
-+#include <dt-bindings/power/mt8173-power.h>
-+
-+#include "mtk-scpsys.h"
-+
-+#define SPM_VDE_PWR_CON			0x0210
-+#define SPM_MFG_PWR_CON			0x0214
-+#define SPM_VEN_PWR_CON			0x0230
-+#define SPM_ISP_PWR_CON			0x0238
-+#define SPM_DIS_PWR_CON			0x023c
-+#define SPM_VEN2_PWR_CON		0x0298
-+#define SPM_AUDIO_PWR_CON		0x029c
-+#define SPM_MFG_2D_PWR_CON		0x02c0
-+#define SPM_MFG_ASYNC_PWR_CON		0x02c4
-+#define SPM_USB_PWR_CON			0x02cc
-+
-+#define PWR_STATUS_DISP			BIT(3)
-+#define PWR_STATUS_MFG			BIT(4)
-+#define PWR_STATUS_ISP			BIT(5)
-+#define PWR_STATUS_VDEC			BIT(7)
-+#define PWR_STATUS_VENC_LT		BIT(20)
-+#define PWR_STATUS_VENC			BIT(21)
-+#define PWR_STATUS_MFG_2D		BIT(22)
-+#define PWR_STATUS_MFG_ASYNC		BIT(23)
-+#define PWR_STATUS_AUDIO		BIT(24)
-+#define PWR_STATUS_USB			BIT(25)
-+
-+static const struct scp_domain_data scp_domain_data[] __initconst = {
-+	[MT8173_POWER_DOMAIN_VDEC] = {
-+		.name = "vdec",
-+		.sta_mask = PWR_STATUS_VDEC,
-+		.ctl_offs = SPM_VDE_PWR_CON,
-+		.sram_pdn_bits = GENMASK(11, 8),
-+		.sram_pdn_ack_bits = GENMASK(12, 12),
-+		.clk_id = {CLK_MM},
-+	},
-+	[MT8173_POWER_DOMAIN_VENC] = {
-+		.name = "venc",
-+		.sta_mask = PWR_STATUS_VENC,
-+		.ctl_offs = SPM_VEN_PWR_CON,
-+		.sram_pdn_bits = GENMASK(11, 8),
-+		.sram_pdn_ack_bits = GENMASK(15, 12),
-+		.clk_id = {CLK_MM, CLK_VENC},
-+	},
-+	[MT8173_POWER_DOMAIN_ISP] = {
-+		.name = "isp",
-+		.sta_mask = PWR_STATUS_ISP,
-+		.ctl_offs = SPM_ISP_PWR_CON,
-+		.sram_pdn_bits = GENMASK(11, 8),
-+		.sram_pdn_ack_bits = GENMASK(13, 12),
-+		.clk_id = {CLK_MM},
-+	},
-+	[MT8173_POWER_DOMAIN_MM] = {
-+		.name = "mm",
-+		.sta_mask = PWR_STATUS_DISP,
-+		.ctl_offs = SPM_DIS_PWR_CON,
-+		.sram_pdn_bits = GENMASK(11, 8),
-+		.sram_pdn_ack_bits = GENMASK(12, 12),
-+		.clk_id = {CLK_MM},
-+		.bus_prot_mask = MT8173_TOP_AXI_PROT_EN_MM_M0 |
-+			MT8173_TOP_AXI_PROT_EN_MM_M1,
-+	},
-+	[MT8173_POWER_DOMAIN_VENC_LT] = {
-+		.name = "venc_lt",
-+		.sta_mask = PWR_STATUS_VENC_LT,
-+		.ctl_offs = SPM_VEN2_PWR_CON,
-+		.sram_pdn_bits = GENMASK(11, 8),
-+		.sram_pdn_ack_bits = GENMASK(15, 12),
-+		.clk_id = {CLK_MM, CLK_VENC_LT},
-+	},
-+	[MT8173_POWER_DOMAIN_AUDIO] = {
-+		.name = "audio",
-+		.sta_mask = PWR_STATUS_AUDIO,
-+		.ctl_offs = SPM_AUDIO_PWR_CON,
-+		.sram_pdn_bits = GENMASK(11, 8),
-+		.sram_pdn_ack_bits = GENMASK(15, 12),
-+		.clk_id = {CLK_NONE},
-+	},
-+	[MT8173_POWER_DOMAIN_USB] = {
-+		.name = "usb",
-+		.sta_mask = PWR_STATUS_USB,
-+		.ctl_offs = SPM_USB_PWR_CON,
-+		.sram_pdn_bits = GENMASK(11, 8),
-+		.sram_pdn_ack_bits = GENMASK(15, 12),
-+		.clk_id = {CLK_NONE},
-+		.active_wakeup = true,
-+	},
-+	[MT8173_POWER_DOMAIN_MFG_ASYNC] = {
-+		.name = "mfg_async",
-+		.sta_mask = PWR_STATUS_MFG_ASYNC,
-+		.ctl_offs = SPM_MFG_ASYNC_PWR_CON,
-+		.sram_pdn_bits = GENMASK(11, 8),
-+		.sram_pdn_ack_bits = 0,
-+		.clk_id = {CLK_MFG},
-+	},
-+	[MT8173_POWER_DOMAIN_MFG_2D] = {
-+		.name = "mfg_2d",
-+		.sta_mask = PWR_STATUS_MFG_2D,
-+		.ctl_offs = SPM_MFG_2D_PWR_CON,
-+		.sram_pdn_bits = GENMASK(11, 8),
-+		.sram_pdn_ack_bits = GENMASK(13, 12),
-+		.clk_id = {CLK_NONE},
-+	},
-+	[MT8173_POWER_DOMAIN_MFG] = {
-+		.name = "mfg",
-+		.sta_mask = PWR_STATUS_MFG,
-+		.ctl_offs = SPM_MFG_PWR_CON,
-+		.sram_pdn_bits = GENMASK(13, 8),
-+		.sram_pdn_ack_bits = GENMASK(21, 16),
-+		.clk_id = {CLK_NONE},
-+		.bus_prot_mask = MT8173_TOP_AXI_PROT_EN_MFG_S |
-+			MT8173_TOP_AXI_PROT_EN_MFG_M0 |
-+			MT8173_TOP_AXI_PROT_EN_MFG_M1 |
-+			MT8173_TOP_AXI_PROT_EN_MFG_SNOOP_OUT,
-+	},
-+};
-+
-+#define NUM_DOMAINS	ARRAY_SIZE(scp_domain_data)
-+
-+static int __init scpsys_probe(struct platform_device *pdev)
-+{
-+	struct scp *scp;
-+	struct genpd_onecell_data *pd_data;
-+	int ret;
-+
-+	scp = init_scp(pdev, scp_domain_data, NUM_DOMAINS);
-+	if (IS_ERR(scp))
-+		return PTR_ERR(scp);
-+
-+	mtk_register_power_domains(pdev, scp, NUM_DOMAINS);
-+
-+	pd_data = &scp->pd_data;
-+
-+	ret = pm_genpd_add_subdomain(pd_data->domains[MT8173_POWER_DOMAIN_MFG_ASYNC],
-+		pd_data->domains[MT8173_POWER_DOMAIN_MFG_2D]);
-+	if (ret && IS_ENABLED(CONFIG_PM))
-+		dev_err(&pdev->dev, "Failed to add subdomain: %d\n", ret);
-+
-+	ret = pm_genpd_add_subdomain(pd_data->domains[MT8173_POWER_DOMAIN_MFG_2D],
-+		pd_data->domains[MT8173_POWER_DOMAIN_MFG]);
-+	if (ret && IS_ENABLED(CONFIG_PM))
-+		dev_err(&pdev->dev, "Failed to add subdomain: %d\n", ret);
-+
-+	return 0;
-+}
-+
-+static const struct of_device_id of_scpsys_match_tbl[] = {
-+	{
-+		.compatible = "mediatek,mt8173-scpsys",
-+	}, {
-+		/* sentinel */
-+	}
-+};
-+
-+static struct platform_driver scpsys_drv = {
-+	.driver = {
-+		.name = "mtk-scpsys-mt8173",
-+		.owner = THIS_MODULE,
-+		.of_match_table = of_match_ptr(of_scpsys_match_tbl),
-+	},
-+};
-+
-+module_platform_driver_probe(scpsys_drv, scpsys_probe);
---- a/drivers/soc/mediatek/mtk-scpsys.c
-+++ b/drivers/soc/mediatek/mtk-scpsys.c
-@@ -11,28 +11,14 @@
-  * GNU General Public License for more details.
-  */
- #include <linux/clk.h>
--#include <linux/delay.h>
- #include <linux/io.h>
--#include <linux/kernel.h>
- #include <linux/mfd/syscon.h>
--#include <linux/module.h>
--#include <linux/of_device.h>
- #include <linux/platform_device.h>
- #include <linux/pm_domain.h>
--#include <linux/regmap.h>
- #include <linux/soc/mediatek/infracfg.h>
--#include <dt-bindings/power/mt8173-power.h>
- 
--#define SPM_VDE_PWR_CON			0x0210
--#define SPM_MFG_PWR_CON			0x0214
--#define SPM_VEN_PWR_CON			0x0230
--#define SPM_ISP_PWR_CON			0x0238
--#define SPM_DIS_PWR_CON			0x023c
--#define SPM_VEN2_PWR_CON		0x0298
--#define SPM_AUDIO_PWR_CON		0x029c
--#define SPM_MFG_2D_PWR_CON		0x02c0
--#define SPM_MFG_ASYNC_PWR_CON		0x02c4
--#define SPM_USB_PWR_CON			0x02cc
-+#include "mtk-scpsys.h"
-+
- #define SPM_PWR_STATUS			0x060c
- #define SPM_PWR_STATUS_2ND		0x0610
- 
-@@ -42,153 +28,6 @@
- #define PWR_ON_2ND_BIT			BIT(3)
- #define PWR_CLK_DIS_BIT			BIT(4)
- 
--#define PWR_STATUS_DISP			BIT(3)
--#define PWR_STATUS_MFG			BIT(4)
--#define PWR_STATUS_ISP			BIT(5)
--#define PWR_STATUS_VDEC			BIT(7)
--#define PWR_STATUS_VENC_LT		BIT(20)
--#define PWR_STATUS_VENC			BIT(21)
--#define PWR_STATUS_MFG_2D		BIT(22)
--#define PWR_STATUS_MFG_ASYNC		BIT(23)
--#define PWR_STATUS_AUDIO		BIT(24)
--#define PWR_STATUS_USB			BIT(25)
--
--enum clk_id {
--	MT8173_CLK_NONE,
--	MT8173_CLK_MM,
--	MT8173_CLK_MFG,
--	MT8173_CLK_VENC,
--	MT8173_CLK_VENC_LT,
--	MT8173_CLK_MAX,
--};
--
--#define MAX_CLKS	2
--
--struct scp_domain_data {
--	const char *name;
--	u32 sta_mask;
--	int ctl_offs;
--	u32 sram_pdn_bits;
--	u32 sram_pdn_ack_bits;
--	u32 bus_prot_mask;
--	enum clk_id clk_id[MAX_CLKS];
--	bool active_wakeup;
--};
--
--static const struct scp_domain_data scp_domain_data[] __initconst = {
--	[MT8173_POWER_DOMAIN_VDEC] = {
--		.name = "vdec",
--		.sta_mask = PWR_STATUS_VDEC,
--		.ctl_offs = SPM_VDE_PWR_CON,
--		.sram_pdn_bits = GENMASK(11, 8),
--		.sram_pdn_ack_bits = GENMASK(12, 12),
--		.clk_id = {MT8173_CLK_MM},
--	},
--	[MT8173_POWER_DOMAIN_VENC] = {
--		.name = "venc",
--		.sta_mask = PWR_STATUS_VENC,
--		.ctl_offs = SPM_VEN_PWR_CON,
--		.sram_pdn_bits = GENMASK(11, 8),
--		.sram_pdn_ack_bits = GENMASK(15, 12),
--		.clk_id = {MT8173_CLK_MM, MT8173_CLK_VENC},
--	},
--	[MT8173_POWER_DOMAIN_ISP] = {
--		.name = "isp",
--		.sta_mask = PWR_STATUS_ISP,
--		.ctl_offs = SPM_ISP_PWR_CON,
--		.sram_pdn_bits = GENMASK(11, 8),
--		.sram_pdn_ack_bits = GENMASK(13, 12),
--		.clk_id = {MT8173_CLK_MM},
--	},
--	[MT8173_POWER_DOMAIN_MM] = {
--		.name = "mm",
--		.sta_mask = PWR_STATUS_DISP,
--		.ctl_offs = SPM_DIS_PWR_CON,
--		.sram_pdn_bits = GENMASK(11, 8),
--		.sram_pdn_ack_bits = GENMASK(12, 12),
--		.clk_id = {MT8173_CLK_MM},
--		.bus_prot_mask = MT8173_TOP_AXI_PROT_EN_MM_M0 |
--			MT8173_TOP_AXI_PROT_EN_MM_M1,
--	},
--	[MT8173_POWER_DOMAIN_VENC_LT] = {
--		.name = "venc_lt",
--		.sta_mask = PWR_STATUS_VENC_LT,
--		.ctl_offs = SPM_VEN2_PWR_CON,
--		.sram_pdn_bits = GENMASK(11, 8),
--		.sram_pdn_ack_bits = GENMASK(15, 12),
--		.clk_id = {MT8173_CLK_MM, MT8173_CLK_VENC_LT},
--	},
--	[MT8173_POWER_DOMAIN_AUDIO] = {
--		.name = "audio",
--		.sta_mask = PWR_STATUS_AUDIO,
--		.ctl_offs = SPM_AUDIO_PWR_CON,
--		.sram_pdn_bits = GENMASK(11, 8),
--		.sram_pdn_ack_bits = GENMASK(15, 12),
--		.clk_id = {MT8173_CLK_NONE},
--	},
--	[MT8173_POWER_DOMAIN_USB] = {
--		.name = "usb",
--		.sta_mask = PWR_STATUS_USB,
--		.ctl_offs = SPM_USB_PWR_CON,
--		.sram_pdn_bits = GENMASK(11, 8),
--		.sram_pdn_ack_bits = GENMASK(15, 12),
--		.clk_id = {MT8173_CLK_NONE},
--		.active_wakeup = true,
--	},
--	[MT8173_POWER_DOMAIN_MFG_ASYNC] = {
--		.name = "mfg_async",
--		.sta_mask = PWR_STATUS_MFG_ASYNC,
--		.ctl_offs = SPM_MFG_ASYNC_PWR_CON,
--		.sram_pdn_bits = GENMASK(11, 8),
--		.sram_pdn_ack_bits = 0,
--		.clk_id = {MT8173_CLK_MFG},
--	},
--	[MT8173_POWER_DOMAIN_MFG_2D] = {
--		.name = "mfg_2d",
--		.sta_mask = PWR_STATUS_MFG_2D,
--		.ctl_offs = SPM_MFG_2D_PWR_CON,
--		.sram_pdn_bits = GENMASK(11, 8),
--		.sram_pdn_ack_bits = GENMASK(13, 12),
--		.clk_id = {MT8173_CLK_NONE},
--	},
--	[MT8173_POWER_DOMAIN_MFG] = {
--		.name = "mfg",
--		.sta_mask = PWR_STATUS_MFG,
--		.ctl_offs = SPM_MFG_PWR_CON,
--		.sram_pdn_bits = GENMASK(13, 8),
--		.sram_pdn_ack_bits = GENMASK(21, 16),
--		.clk_id = {MT8173_CLK_NONE},
--		.bus_prot_mask = MT8173_TOP_AXI_PROT_EN_MFG_S |
--			MT8173_TOP_AXI_PROT_EN_MFG_M0 |
--			MT8173_TOP_AXI_PROT_EN_MFG_M1 |
--			MT8173_TOP_AXI_PROT_EN_MFG_SNOOP_OUT,
--	},
--};
--
--#define NUM_DOMAINS	ARRAY_SIZE(scp_domain_data)
--
--struct scp;
--
--struct scp_domain {
--	struct generic_pm_domain genpd;
--	struct scp *scp;
--	struct clk *clk[MAX_CLKS];
--	u32 sta_mask;
--	void __iomem *ctl_addr;
--	u32 sram_pdn_bits;
--	u32 sram_pdn_ack_bits;
--	u32 bus_prot_mask;
--	bool active_wakeup;
--};
--
--struct scp {
--	struct scp_domain domains[NUM_DOMAINS];
--	struct genpd_onecell_data pd_data;
--	struct device *dev;
--	void __iomem *base;
--	struct regmap *infracfg;
--};
--
- static int scpsys_domain_is_on(struct scp_domain *scpd)
- {
- 	struct scp *scp = scpd->scp;
-@@ -398,63 +237,89 @@ static bool scpsys_active_wakeup(struct
- 	return scpd->active_wakeup;
- }
- 
--static int __init scpsys_probe(struct platform_device *pdev)
-+static void init_clks(struct platform_device *pdev, struct clk *clk[CLK_MAX])
-+{
-+	enum clk_id clk_ids[] = {
-+		CLK_MM,
-+		CLK_MFG,
-+		CLK_VENC,
-+		CLK_VENC_LT
-+	};
-+
-+	static const char * const clk_names[] = {
-+		"mm",
-+		"mfg",
-+		"venc",
-+		"venc_lt",
-+	};
-+
-+	int i;
-+
-+	for (i = 0; i < ARRAY_SIZE(clk_ids); i++)
-+		clk[clk_ids[i]] = devm_clk_get(&pdev->dev, clk_names[i]);
-+}
-+
-+struct scp *init_scp(struct platform_device *pdev,
-+			const struct scp_domain_data *scp_domain_data, int num)
- {
- 	struct genpd_onecell_data *pd_data;
- 	struct resource *res;
--	int i, j, ret;
-+	int i, j;
- 	struct scp *scp;
--	struct clk *clk[MT8173_CLK_MAX];
-+	struct clk *clk[CLK_MAX];
- 
- 	scp = devm_kzalloc(&pdev->dev, sizeof(*scp), GFP_KERNEL);
- 	if (!scp)
--		return -ENOMEM;
-+		return ERR_PTR(-ENOMEM);
- 
- 	scp->dev = &pdev->dev;
- 
- 	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
- 	scp->base = devm_ioremap_resource(&pdev->dev, res);
- 	if (IS_ERR(scp->base))
--		return PTR_ERR(scp->base);
--
--	pd_data = &scp->pd_data;
--
--	pd_data->domains = devm_kzalloc(&pdev->dev,
--			sizeof(*pd_data->domains) * NUM_DOMAINS, GFP_KERNEL);
--	if (!pd_data->domains)
--		return -ENOMEM;
--
--	clk[MT8173_CLK_MM] = devm_clk_get(&pdev->dev, "mm");
--	if (IS_ERR(clk[MT8173_CLK_MM]))
--		return PTR_ERR(clk[MT8173_CLK_MM]);
--
--	clk[MT8173_CLK_MFG] = devm_clk_get(&pdev->dev, "mfg");
--	if (IS_ERR(clk[MT8173_CLK_MFG]))
--		return PTR_ERR(clk[MT8173_CLK_MFG]);
--
--	clk[MT8173_CLK_VENC] = devm_clk_get(&pdev->dev, "venc");
--	if (IS_ERR(clk[MT8173_CLK_VENC]))
--		return PTR_ERR(clk[MT8173_CLK_VENC]);
--
--	clk[MT8173_CLK_VENC_LT] = devm_clk_get(&pdev->dev, "venc_lt");
--	if (IS_ERR(clk[MT8173_CLK_VENC_LT]))
--		return PTR_ERR(clk[MT8173_CLK_VENC_LT]);
-+		return ERR_CAST(scp->base);
- 
- 	scp->infracfg = syscon_regmap_lookup_by_phandle(pdev->dev.of_node,
- 			"infracfg");
- 	if (IS_ERR(scp->infracfg)) {
- 		dev_err(&pdev->dev, "Cannot find infracfg controller: %ld\n",
- 				PTR_ERR(scp->infracfg));
--		return PTR_ERR(scp->infracfg);
-+		return ERR_CAST(scp->infracfg);
- 	}
- 
--	pd_data->num_domains = NUM_DOMAINS;
-+	scp->domains = devm_kzalloc(&pdev->dev,
-+				sizeof(*scp->domains) * num, GFP_KERNEL);
-+	if (!scp->domains)
-+		return ERR_PTR(-ENOMEM);
-+
-+	pd_data = &scp->pd_data;
- 
--	for (i = 0; i < NUM_DOMAINS; i++) {
-+	pd_data->domains = devm_kzalloc(&pdev->dev,
-+			sizeof(*pd_data->domains) * num, GFP_KERNEL);
-+	if (!pd_data->domains)
-+		return ERR_PTR(-ENOMEM);
-+
-+	pd_data->num_domains = num;
-+
-+	init_clks(pdev, clk);
-+
-+	for (i = 0; i < num; i++) {
- 		struct scp_domain *scpd = &scp->domains[i];
- 		struct generic_pm_domain *genpd = &scpd->genpd;
- 		const struct scp_domain_data *data = &scp_domain_data[i];
- 
-+		for (j = 0; j < MAX_CLKS && data->clk_id[j]; j++) {
-+			struct clk *c = clk[data->clk_id[j]];
-+
-+			if (IS_ERR(c)) {
-+				dev_err(&pdev->dev, "%s: clk unavailable\n",
-+					data->name);
-+				return ERR_CAST(c);
-+			}
-+
-+			scpd->clk[j] = c;
-+		}
-+
- 		pd_data->domains[i] = genpd;
- 		scpd->scp = scp;
- 
-@@ -464,13 +329,25 @@ static int __init scpsys_probe(struct pl
- 		scpd->sram_pdn_ack_bits = data->sram_pdn_ack_bits;
- 		scpd->bus_prot_mask = data->bus_prot_mask;
- 		scpd->active_wakeup = data->active_wakeup;
--		for (j = 0; j < MAX_CLKS && data->clk_id[j]; j++)
--			scpd->clk[j] = clk[data->clk_id[j]];
- 
- 		genpd->name = data->name;
- 		genpd->power_off = scpsys_power_off;
- 		genpd->power_on = scpsys_power_on;
- 		genpd->dev_ops.active_wakeup = scpsys_active_wakeup;
-+	}
-+
-+	return scp;
-+}
-+
-+void mtk_register_power_domains(struct platform_device *pdev,
-+				struct scp *scp, int num)
-+{
-+	struct genpd_onecell_data *pd_data;
-+	int i, ret;
-+
-+	for (i = 0; i < num; i++) {
-+		struct scp_domain *scpd = &scp->domains[i];
-+		struct generic_pm_domain *genpd = &scpd->genpd;
- 
- 		/*
- 		 * Initially turn on all domains to make the domains usable
-@@ -489,37 +366,9 @@ static int __init scpsys_probe(struct pl
- 	 * valid.
- 	 */
- 
--	ret = pm_genpd_add_subdomain(pd_data->domains[MT8173_POWER_DOMAIN_MFG_ASYNC],
--		pd_data->domains[MT8173_POWER_DOMAIN_MFG_2D]);
--	if (ret && IS_ENABLED(CONFIG_PM))
--		dev_err(&pdev->dev, "Failed to add subdomain: %d\n", ret);
--
--	ret = pm_genpd_add_subdomain(pd_data->domains[MT8173_POWER_DOMAIN_MFG_2D],
--		pd_data->domains[MT8173_POWER_DOMAIN_MFG]);
--	if (ret && IS_ENABLED(CONFIG_PM))
--		dev_err(&pdev->dev, "Failed to add subdomain: %d\n", ret);
-+	pd_data = &scp->pd_data;
- 
- 	ret = of_genpd_add_provider_onecell(pdev->dev.of_node, pd_data);
- 	if (ret)
- 		dev_err(&pdev->dev, "Failed to add OF provider: %d\n", ret);
--
--	return 0;
- }
--
--static const struct of_device_id of_scpsys_match_tbl[] = {
--	{
--		.compatible = "mediatek,mt8173-scpsys",
--	}, {
--		/* sentinel */
--	}
--};
--
--static struct platform_driver scpsys_drv = {
--	.driver = {
--		.name = "mtk-scpsys",
--		.owner = THIS_MODULE,
--		.of_match_table = of_match_ptr(of_scpsys_match_tbl),
--	},
--};
--
--module_platform_driver_probe(scpsys_drv, scpsys_probe);
---- /dev/null
-+++ b/drivers/soc/mediatek/mtk-scpsys.h
-@@ -0,0 +1,54 @@
-+#ifndef __DRV_SOC_MTK_H
-+#define __DRV_SOC_MTK_H
-+
-+enum clk_id {
-+	CLK_NONE,
-+	CLK_MM,
-+	CLK_MFG,
-+	CLK_VENC,
-+	CLK_VENC_LT,
-+	CLK_MAX,
-+};
-+
-+#define MAX_CLKS	2
-+
-+struct scp_domain_data {
-+	const char *name;
-+	u32 sta_mask;
-+	int ctl_offs;
-+	u32 sram_pdn_bits;
-+	u32 sram_pdn_ack_bits;
-+	u32 bus_prot_mask;
-+	enum clk_id clk_id[MAX_CLKS];
-+	bool active_wakeup;
-+};
-+
-+struct scp;
-+
-+struct scp_domain {
-+	struct generic_pm_domain genpd;
-+	struct scp *scp;
-+	struct clk *clk[MAX_CLKS];
-+	u32 sta_mask;
-+	void __iomem *ctl_addr;
-+	u32 sram_pdn_bits;
-+	u32 sram_pdn_ack_bits;
-+	u32 bus_prot_mask;
-+	bool active_wakeup;
-+};
-+
-+struct scp {
-+	struct scp_domain *domains;
-+	struct genpd_onecell_data pd_data;
-+	struct device *dev;
-+	void __iomem *base;
-+	struct regmap *infracfg;
-+};
-+
-+struct scp *init_scp(struct platform_device *pdev,
-+			const struct scp_domain_data *scp_domain_data, int num);
-+
-+void mtk_register_power_domains(struct platform_device *pdev,
-+				struct scp *scp, int num);
-+
-+#endif /* __DRV_SOC_MTK_H */
diff --git a/target/linux/mediatek/patches-4.4/0003-soc-mediatek-Init-MT8173-scpsys-driver-earlier.patch b/target/linux/mediatek/patches-4.4/0003-soc-mediatek-Init-MT8173-scpsys-driver-earlier.patch
deleted file mode 100644
index 46af964..0000000
--- a/target/linux/mediatek/patches-4.4/0003-soc-mediatek-Init-MT8173-scpsys-driver-earlier.patch
+++ /dev/null
@@ -1,33 +0,0 @@
-From 6f87948c3a58f02f6a64eadda719317016739d5e Mon Sep 17 00:00:00 2001
-From: James Liao <jamesjj.liao at mediatek.com>
-Date: Wed, 30 Dec 2015 14:41:44 +0800
-Subject: [PATCH 003/102] soc: mediatek: Init MT8173 scpsys driver earlier
-
-Some power domain comsumers may init before module_init.
-So the power domain provider (scpsys) need to be initialized
-earlier too.
-
-Signed-off-by: James Liao <jamesjj.liao at mediatek.com>
----
- drivers/soc/mediatek/mtk-scpsys-mt8173.c |   13 ++++++++++++-
- 1 file changed, 12 insertions(+), 1 deletion(-)
-
---- a/drivers/soc/mediatek/mtk-scpsys-mt8173.c
-+++ b/drivers/soc/mediatek/mtk-scpsys-mt8173.c
-@@ -176,4 +176,15 @@ static struct platform_driver scpsys_drv
- 	},
- };
- 
--module_platform_driver_probe(scpsys_drv, scpsys_probe);
-+static int __init scpsys_drv_init(void)
-+{
-+	return platform_driver_probe(&scpsys_drv, scpsys_probe);
-+}
-+
-+static void __exit scpsys_drv_exit(void)
-+{
-+	platform_driver_unregister(&scpsys_drv);
-+}
-+
-+subsys_initcall(scpsys_drv_init);
-+module_exit(scpsys_drv_exit);
diff --git a/target/linux/mediatek/patches-4.4/0005-soc-mediatek-Add-MT2701-MT7623-scpsys-driver.patch b/target/linux/mediatek/patches-4.4/0005-soc-mediatek-Add-MT2701-MT7623-scpsys-driver.patch
deleted file mode 100644
index 2f2337a..0000000
--- a/target/linux/mediatek/patches-4.4/0005-soc-mediatek-Add-MT2701-MT7623-scpsys-driver.patch
+++ /dev/null
@@ -1,204 +0,0 @@
-From 8aa49d107d8a22fd6cbf37174614baf32d0976e2 Mon Sep 17 00:00:00 2001
-From: Shunli Wang <shunli.wang at mediatek.com>
-Date: Wed, 30 Dec 2015 14:41:46 +0800
-Subject: [PATCH 005/102] soc: mediatek: Add MT2701/MT7623 scpsys driver
-
-Add scpsys driver for MT2701 and MT7623.
-
-Signed-off-by: Shunli Wang <shunli.wang at mediatek.com>
-Signed-off-by: James Liao <jamesjj.liao at mediatek.com>
----
- drivers/soc/mediatek/Kconfig             |   11 ++
- drivers/soc/mediatek/Makefile            |    1 +
- drivers/soc/mediatek/mtk-scpsys-mt2701.c |  161 ++++++++++++++++++++++++++++++
- 3 files changed, 173 insertions(+)
- create mode 100644 drivers/soc/mediatek/mtk-scpsys-mt2701.c
-
---- a/drivers/soc/mediatek/Kconfig
-+++ b/drivers/soc/mediatek/Kconfig
-@@ -39,3 +39,14 @@ config MTK_SCPSYS_MT8173
- 	  driver.
- 	  The System Control Processor System (SCPSYS) has several power
- 	  management related tasks in the system.
-+
-+config MTK_SCPSYS_MT2701
-+	bool "SCPSYS Support MediaTek MT2701 and MT7623"
-+	depends on ARCH_MEDIATEK || COMPILE_TEST
-+	select MTK_SCPSYS
-+	default ARCH_MEDIATEK
-+	help
-+	  Say yes here to add support for the MT2701/MT7623 SCPSYS power
-+	  domain driver.
-+	  The System Control Processor System (SCPSYS) has several power
-+	  management related tasks in the system.
---- a/drivers/soc/mediatek/Makefile
-+++ b/drivers/soc/mediatek/Makefile
-@@ -2,3 +2,4 @@ obj-$(CONFIG_MTK_INFRACFG) += mtk-infrac
- obj-$(CONFIG_MTK_PMIC_WRAP) += mtk-pmic-wrap.o
- obj-$(CONFIG_MTK_SCPSYS) += mtk-scpsys.o
- obj-$(CONFIG_MTK_SCPSYS_MT8173) += mtk-scpsys-mt8173.o
-+obj-$(CONFIG_MTK_SCPSYS_MT2701) += mtk-scpsys-mt2701.o
---- /dev/null
-+++ b/drivers/soc/mediatek/mtk-scpsys-mt2701.c
-@@ -0,0 +1,161 @@
-+/*
-+ * Copyright (c) 2015 Mediatek, Shunli Wang <shunli.wang at mediatek.com>
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 as
-+ * published by the Free Software Foundation.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ */
-+#include <linux/mfd/syscon.h>
-+#include <linux/module.h>
-+#include <linux/of_device.h>
-+#include <linux/pm_domain.h>
-+#include <linux/soc/mediatek/infracfg.h>
-+#include <dt-bindings/power/mt2701-power.h>
-+
-+#include "mtk-scpsys.h"
-+
-+#define SPM_VDE_PWR_CON			0x0210
-+#define SPM_MFG_PWR_CON			0x0214
-+#define SPM_ISP_PWR_CON			0x0238
-+#define SPM_DIS_PWR_CON			0x023C
-+#define SPM_CONN_PWR_CON		0x0280
-+#define SPM_BDP_PWR_CON			0x029C
-+#define SPM_ETH_PWR_CON			0x02A0
-+#define SPM_HIF_PWR_CON			0x02A4
-+#define SPM_IFR_MSC_PWR_CON		0x02A8
-+#define SPM_PWR_STATUS			0x060c
-+#define SPM_PWR_STATUS_2ND		0x0610
-+
-+#define CONN_PWR_STA_MASK		BIT(1)
-+#define DIS_PWR_STA_MASK		BIT(3)
-+#define MFG_PWR_STA_MASK		BIT(4)
-+#define ISP_PWR_STA_MASK		BIT(5)
-+#define VDE_PWR_STA_MASK		BIT(7)
-+#define BDP_PWR_STA_MASK		BIT(14)
-+#define ETH_PWR_STA_MASK		BIT(15)
-+#define HIF_PWR_STA_MASK		BIT(16)
-+#define IFR_MSC_PWR_STA_MASK		BIT(17)
-+
-+#define MT2701_TOP_AXI_PROT_EN_CONN	0x0104
-+#define MT2701_TOP_AXI_PROT_EN_DISP	0x0002
-+
-+static const struct scp_domain_data scp_domain_data[] = {
-+	[MT2701_POWER_DOMAIN_CONN] = {
-+		.name = "conn",
-+		.sta_mask = CONN_PWR_STA_MASK,
-+		.ctl_offs = SPM_CONN_PWR_CON,
-+		.bus_prot_mask = MT2701_TOP_AXI_PROT_EN_CONN,
-+		.active_wakeup = true,
-+	},
-+	[MT2701_POWER_DOMAIN_DISP] = {
-+		.name = "disp",
-+		.sta_mask = DIS_PWR_STA_MASK,
-+		.ctl_offs = SPM_DIS_PWR_CON,
-+		.sram_pdn_bits = GENMASK(11, 8),
-+		.clk_id = {CLK_MM},
-+		.bus_prot_mask = MT2701_TOP_AXI_PROT_EN_DISP,
-+		.active_wakeup = true,
-+	},
-+	[MT2701_POWER_DOMAIN_MFG] = {
-+		.name = "mfg",
-+		.sta_mask = MFG_PWR_STA_MASK,
-+		.ctl_offs = SPM_MFG_PWR_CON,
-+		.sram_pdn_bits = GENMASK(11, 8),
-+		.sram_pdn_ack_bits = GENMASK(12, 12),
-+		.active_wakeup = true,
-+	},
-+	[MT2701_POWER_DOMAIN_VDEC] = {
-+		.name = "vdec",
-+		.sta_mask = VDE_PWR_STA_MASK,
-+		.ctl_offs = SPM_VDE_PWR_CON,
-+		.sram_pdn_bits = GENMASK(11, 8),
-+		.sram_pdn_ack_bits = GENMASK(12, 12),
-+		.clk_id = {CLK_MM},
-+		.active_wakeup = true,
-+	},
-+	[MT2701_POWER_DOMAIN_ISP] = {
-+		.name = "isp",
-+		.sta_mask = ISP_PWR_STA_MASK,
-+		.ctl_offs = SPM_ISP_PWR_CON,
-+		.sram_pdn_bits = GENMASK(11, 8),
-+		.sram_pdn_ack_bits = GENMASK(13, 12),
-+		.active_wakeup = true,
-+	},
-+	[MT2701_POWER_DOMAIN_BDP] = {
-+		.name = "bdp",
-+		.sta_mask = BDP_PWR_STA_MASK,
-+		.ctl_offs = SPM_BDP_PWR_CON,
-+		.sram_pdn_bits = GENMASK(11, 8),
-+		.active_wakeup = true,
-+	},
-+	[MT2701_POWER_DOMAIN_ETH] = {
-+		.name = "eth",
-+		.sta_mask = ETH_PWR_STA_MASK,
-+		.ctl_offs = SPM_ETH_PWR_CON,
-+		.sram_pdn_bits = GENMASK(11, 8),
-+		.sram_pdn_ack_bits = GENMASK(15, 12),
-+		.active_wakeup = true,
-+	},
-+	[MT2701_POWER_DOMAIN_HIF] = {
-+		.name = "hif",
-+		.sta_mask = HIF_PWR_STA_MASK,
-+		.ctl_offs = SPM_HIF_PWR_CON,
-+		.sram_pdn_bits = GENMASK(11, 8),
-+		.sram_pdn_ack_bits = GENMASK(15, 12),
-+		.active_wakeup = true,
-+	},
-+	[MT2701_POWER_DOMAIN_IFR_MSC] = {
-+		.name = "ifr_msc",
-+		.sta_mask = IFR_MSC_PWR_STA_MASK,
-+		.ctl_offs = SPM_IFR_MSC_PWR_CON,
-+		.active_wakeup = true,
-+	},
-+};
-+
-+#define NUM_DOMAINS	ARRAY_SIZE(scp_domain_data)
-+
-+static int __init scpsys_probe(struct platform_device *pdev)
-+{
-+	struct scp *scp;
-+
-+	scp = init_scp(pdev, scp_domain_data, NUM_DOMAINS);
-+	if (IS_ERR(scp))
-+		return PTR_ERR(scp);
-+
-+	mtk_register_power_domains(pdev, scp, NUM_DOMAINS);
-+
-+	return 0;
-+}
-+
-+static const struct of_device_id of_scpsys_match_tbl[] = {
-+	{
-+		.compatible = "mediatek,mt2701-scpsys",
-+	}, {
-+		/* sentinel */
-+	}
-+};
-+MODULE_DEVICE_TABLE(of, of_scpsys_match_tbl);
-+
-+static struct platform_driver scpsys_drv = {
-+	.driver = {
-+		.name = "mtk-scpsys-mt2701",
-+		.owner = THIS_MODULE,
-+		.of_match_table = of_match_ptr(of_scpsys_match_tbl),
-+	},
-+	.probe = scpsys_probe,
-+};
-+
-+static int __init scpsys_init(void)
-+{
-+	return platform_driver_register(&scpsys_drv);
-+}
-+
-+subsys_initcall(scpsys_init);
-+
-+MODULE_DESCRIPTION("MediaTek MT2701 scpsys driver");
-+MODULE_LICENSE("GPL v2");
diff --git a/target/linux/mediatek/patches-4.4/0006-clk-mediatek-Refine-the-makefile-to-support-multiple.patch b/target/linux/mediatek/patches-4.4/0006-clk-mediatek-Refine-the-makefile-to-support-multiple.patch
deleted file mode 100644
index d4bac23..0000000
--- a/target/linux/mediatek/patches-4.4/0006-clk-mediatek-Refine-the-makefile-to-support-multiple.patch
+++ /dev/null
@@ -1,61 +0,0 @@
-From 69d4e250847f82a5896c41bcb5f1e793c5a8fbac Mon Sep 17 00:00:00 2001
-From: James Liao <jamesjj.liao at mediatek.com>
-Date: Tue, 5 Jan 2016 14:30:17 +0800
-Subject: [PATCH 006/102] clk: mediatek: Refine the makefile to support
- multiple clock drivers
-
-Add a Kconfig to define clock configuration for each SoC, and
-modify the Makefile to build drivers that only selected in config.
-
-Signed-off-by: Shunli Wang <shunli.wang at mediatek.com>
-Signed-off-by: James Liao <jamesjj.liao at mediatek.com>
----
- drivers/clk/Kconfig           |    1 +
- drivers/clk/mediatek/Kconfig  |   23 +++++++++++++++++++++++
- drivers/clk/mediatek/Makefile |    6 +++---
- 3 files changed, 27 insertions(+), 3 deletions(-)
- create mode 100644 drivers/clk/mediatek/Kconfig
-
---- a/drivers/clk/Kconfig
-+++ b/drivers/clk/Kconfig
-@@ -198,3 +198,4 @@ source "drivers/clk/mvebu/Kconfig"
- 
- source "drivers/clk/samsung/Kconfig"
- source "drivers/clk/tegra/Kconfig"
-+source "drivers/clk/mediatek/Kconfig"
---- /dev/null
-+++ b/drivers/clk/mediatek/Kconfig
-@@ -0,0 +1,23 @@
-+#
-+# MediaTek SoC drivers
-+#
-+config COMMON_CLK_MEDIATEK
-+	bool
-+	---help---
-+	  Mediatek SoCs' clock support.
-+
-+config COMMON_CLK_MT8135
-+	bool "Clock driver for Mediatek MT8135"
-+	depends on COMMON_CLK
-+	select COMMON_CLK_MEDIATEK
-+	default ARCH_MEDIATEK
-+	---help---
-+	  This driver supports Mediatek MT8135 clocks.
-+
-+config COMMON_CLK_MT8173
-+	bool "Clock driver for Mediatek MT8173"
-+	depends on COMMON_CLK
-+	select COMMON_CLK_MEDIATEK
-+	default ARCH_MEDIATEK
-+	---help---
-+	  This driver supports Mediatek MT8173 clocks.
---- a/drivers/clk/mediatek/Makefile
-+++ b/drivers/clk/mediatek/Makefile
-@@ -1,4 +1,4 @@
--obj-y += clk-mtk.o clk-pll.o clk-gate.o clk-apmixed.o
-+obj-$(CONFIG_COMMON_CLK_MEDIATEK) += clk-mtk.o clk-pll.o clk-gate.o clk-apmixed.o
- obj-$(CONFIG_RESET_CONTROLLER) += reset.o
--obj-y += clk-mt8135.o
--obj-y += clk-mt8173.o
-+obj-$(CONFIG_COMMON_CLK_MT8135) += clk-mt8135.o
-+obj-$(CONFIG_COMMON_CLK_MT8173) += clk-mt8173.o
diff --git a/target/linux/mediatek/patches-4.4/0007-dt-bindings-ARM-Mediatek-Document-bindings-for-MT270.patch b/target/linux/mediatek/patches-4.4/0007-dt-bindings-ARM-Mediatek-Document-bindings-for-MT270.patch
deleted file mode 100644
index fd21c0b..0000000
--- a/target/linux/mediatek/patches-4.4/0007-dt-bindings-ARM-Mediatek-Document-bindings-for-MT270.patch
+++ /dev/null
@@ -1,172 +0,0 @@
-From 7c98b20fa68a2a64bca69822eb7be4fa9b668fab Mon Sep 17 00:00:00 2001
-From: James Liao <jamesjj.liao at mediatek.com>
-Date: Tue, 5 Jan 2016 14:30:18 +0800
-Subject: [PATCH 007/102] dt-bindings: ARM: Mediatek: Document bindings for
- MT2701
-
-This patch adds the binding documentation for apmixedsys, bdpsys,
-ethsys, hifsys, imgsys, infracfg, mmsys, pericfg, topckgen and
-vdecsys for Mediatek MT2701.
-
-Signed-off-by: James Liao <jamesjj.liao at mediatek.com>
----
- .../bindings/arm/mediatek/mediatek,apmixedsys.txt  |    1 +
- .../bindings/arm/mediatek/mediatek,bdpsys.txt      |   22 ++++++++++++++++++++
- .../bindings/arm/mediatek/mediatek,ethsys.txt      |   22 ++++++++++++++++++++
- .../bindings/arm/mediatek/mediatek,hifsys.txt      |   22 ++++++++++++++++++++
- .../bindings/arm/mediatek/mediatek,imgsys.txt      |    1 +
- .../bindings/arm/mediatek/mediatek,infracfg.txt    |    1 +
- .../bindings/arm/mediatek/mediatek,mmsys.txt       |    1 +
- .../bindings/arm/mediatek/mediatek,pericfg.txt     |    1 +
- .../bindings/arm/mediatek/mediatek,topckgen.txt    |    1 +
- .../bindings/arm/mediatek/mediatek,vdecsys.txt     |    1 +
- 10 files changed, 73 insertions(+)
- create mode 100644 Documentation/devicetree/bindings/arm/mediatek/mediatek,bdpsys.txt
- create mode 100644 Documentation/devicetree/bindings/arm/mediatek/mediatek,ethsys.txt
- create mode 100644 Documentation/devicetree/bindings/arm/mediatek/mediatek,hifsys.txt
-
---- a/Documentation/devicetree/bindings/arm/mediatek/mediatek,apmixedsys.txt
-+++ b/Documentation/devicetree/bindings/arm/mediatek/mediatek,apmixedsys.txt
-@@ -6,6 +6,7 @@ The Mediatek apmixedsys controller provi
- Required Properties:
- 
- - compatible: Should be:
-+	- "mediatek,mt2701-apmixedsys"
- 	- "mediatek,mt8135-apmixedsys"
- 	- "mediatek,mt8173-apmixedsys"
- - #clock-cells: Must be 1
---- /dev/null
-+++ b/Documentation/devicetree/bindings/arm/mediatek/mediatek,bdpsys.txt
-@@ -0,0 +1,22 @@
-+Mediatek bdpsys controller
-+============================
-+
-+The Mediatek bdpsys controller provides various clocks to the system.
-+
-+Required Properties:
-+
-+- compatible: Should be:
-+	- "mediatek,mt2701-bdpsys", "syscon"
-+- #clock-cells: Must be 1
-+
-+The bdpsys controller uses the common clk binding from
-+Documentation/devicetree/bindings/clock/clock-bindings.txt
-+The available clocks are defined in dt-bindings/clock/mt*-clk.h.
-+
-+Example:
-+
-+bdpsys: clock-controller at 1c000000 {
-+	compatible = "mediatek,mt2701-bdpsys", "syscon";
-+	reg = <0 0x1c000000 0 0x1000>;
-+	#clock-cells = <1>;
-+};
---- /dev/null
-+++ b/Documentation/devicetree/bindings/arm/mediatek/mediatek,ethsys.txt
-@@ -0,0 +1,22 @@
-+Mediatek ethsys controller
-+============================
-+
-+The Mediatek ethsys controller provides various clocks to the system.
-+
-+Required Properties:
-+
-+- compatible: Should be:
-+	- "mediatek,mt2701-ethsys", "syscon"
-+- #clock-cells: Must be 1
-+
-+The ethsys controller uses the common clk binding from
-+Documentation/devicetree/bindings/clock/clock-bindings.txt
-+The available clocks are defined in dt-bindings/clock/mt*-clk.h.
-+
-+Example:
-+
-+ethsys: clock-controller at 1b000000 {
-+	compatible = "mediatek,mt2701-ethsys", "syscon";
-+	reg = <0 0x1b000000 0 0x1000>;
-+	#clock-cells = <1>;
-+};
---- /dev/null
-+++ b/Documentation/devicetree/bindings/arm/mediatek/mediatek,hifsys.txt
-@@ -0,0 +1,22 @@
-+Mediatek hifsys controller
-+============================
-+
-+The Mediatek hifsys controller provides various clocks to the system.
-+
-+Required Properties:
-+
-+- compatible: Should be:
-+	- "mediatek,mt2701-hifsys", "syscon"
-+- #clock-cells: Must be 1
-+
-+The hifsys controller uses the common clk binding from
-+Documentation/devicetree/bindings/clock/clock-bindings.txt
-+The available clocks are defined in dt-bindings/clock/mt*-clk.h.
-+
-+Example:
-+
-+hifsys: clock-controller at 1a000000 {
-+	compatible = "mediatek,mt2701-hifsys", "syscon";
-+	reg = <0 0x1a000000 0 0x1000>;
-+	#clock-cells = <1>;
-+};
---- a/Documentation/devicetree/bindings/arm/mediatek/mediatek,imgsys.txt
-+++ b/Documentation/devicetree/bindings/arm/mediatek/mediatek,imgsys.txt
-@@ -6,6 +6,7 @@ The Mediatek imgsys controller provides
- Required Properties:
- 
- - compatible: Should be:
-+	- "mediatek,mt2701-imgsys", "syscon"
- 	- "mediatek,mt8173-imgsys", "syscon"
- - #clock-cells: Must be 1
- 
---- a/Documentation/devicetree/bindings/arm/mediatek/mediatek,infracfg.txt
-+++ b/Documentation/devicetree/bindings/arm/mediatek/mediatek,infracfg.txt
-@@ -7,6 +7,7 @@ outputs to the system.
- Required Properties:
- 
- - compatible: Should be:
-+	- "mediatek,mt2701-infracfg", "syscon"
- 	- "mediatek,mt8135-infracfg", "syscon"
- 	- "mediatek,mt8173-infracfg", "syscon"
- - #clock-cells: Must be 1
---- a/Documentation/devicetree/bindings/arm/mediatek/mediatek,mmsys.txt
-+++ b/Documentation/devicetree/bindings/arm/mediatek/mediatek,mmsys.txt
-@@ -6,6 +6,7 @@ The Mediatek mmsys controller provides v
- Required Properties:
- 
- - compatible: Should be:
-+	- "mediatek,mt2701-mmsys", "syscon"
- 	- "mediatek,mt8173-mmsys", "syscon"
- - #clock-cells: Must be 1
- 
---- a/Documentation/devicetree/bindings/arm/mediatek/mediatek,pericfg.txt
-+++ b/Documentation/devicetree/bindings/arm/mediatek/mediatek,pericfg.txt
-@@ -7,6 +7,7 @@ outputs to the system.
- Required Properties:
- 
- - compatible: Should be:
-+	- "mediatek,mt2701-pericfg", "syscon"
- 	- "mediatek,mt8135-pericfg", "syscon"
- 	- "mediatek,mt8173-pericfg", "syscon"
- - #clock-cells: Must be 1
---- a/Documentation/devicetree/bindings/arm/mediatek/mediatek,topckgen.txt
-+++ b/Documentation/devicetree/bindings/arm/mediatek/mediatek,topckgen.txt
-@@ -6,6 +6,7 @@ The Mediatek topckgen controller provide
- Required Properties:
- 
- - compatible: Should be:
-+	- "mediatek,mt2701-topckgen"
- 	- "mediatek,mt8135-topckgen"
- 	- "mediatek,mt8173-topckgen"
- - #clock-cells: Must be 1
---- a/Documentation/devicetree/bindings/arm/mediatek/mediatek,vdecsys.txt
-+++ b/Documentation/devicetree/bindings/arm/mediatek/mediatek,vdecsys.txt
-@@ -6,6 +6,7 @@ The Mediatek vdecsys controller provides
- Required Properties:
- 
- - compatible: Should be:
-+	- "mediatek,mt2701-vdecsys", "syscon"
- 	- "mediatek,mt8173-vdecsys", "syscon"
- - #clock-cells: Must be 1
- 
diff --git a/target/linux/mediatek/patches-4.4/0008-clk-mediatek-Add-dt-bindings-for-MT2701-clocks.patch b/target/linux/mediatek/patches-4.4/0008-clk-mediatek-Add-dt-bindings-for-MT2701-clocks.patch
deleted file mode 100644
index 422a5be..0000000
--- a/target/linux/mediatek/patches-4.4/0008-clk-mediatek-Add-dt-bindings-for-MT2701-clocks.patch
+++ /dev/null
@@ -1,499 +0,0 @@
-From 190696e3995be38fa01490e4ab88ea2c859829c9 Mon Sep 17 00:00:00 2001
-From: Shunli Wang <shunli.wang at mediatek.com>
-Date: Tue, 5 Jan 2016 14:30:19 +0800
-Subject: [PATCH 008/102] clk: mediatek: Add dt-bindings for MT2701 clocks
-
-Add MT2701 clock dt-bindings, include topckgen, apmixedsys,
-infracfg, pericfg and subsystem clocks.
-
-Signed-off-by: Shunli Wang <shunli.wang at mediatek.com>
-Signed-off-by: James Liao <jamesjj.liao at mediatek.com>
----
- include/dt-bindings/clock/mt2701-clk.h |  481 ++++++++++++++++++++++++++++++++
- 1 file changed, 481 insertions(+)
- create mode 100644 include/dt-bindings/clock/mt2701-clk.h
-
---- /dev/null
-+++ b/include/dt-bindings/clock/mt2701-clk.h
-@@ -0,0 +1,481 @@
-+/*
-+ * Copyright (c) 2014 MediaTek Inc.
-+ * Author: Shunli Wang <shunli.wang at mediatek.com>
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 as
-+ * published by the Free Software Foundation.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ */
-+
-+#ifndef _DT_BINDINGS_CLK_MT2701_H
-+#define _DT_BINDINGS_CLK_MT2701_H
-+
-+/* TOPCKGEN */
-+#define CLK_TOP_SYSPLL				1
-+#define CLK_TOP_SYSPLL_D2			2
-+#define CLK_TOP_SYSPLL_D3			3
-+#define CLK_TOP_SYSPLL_D5			4
-+#define CLK_TOP_SYSPLL_D7			5
-+#define CLK_TOP_SYSPLL1_D2			6
-+#define CLK_TOP_SYSPLL1_D4			7
-+#define CLK_TOP_SYSPLL1_D8			8
-+#define CLK_TOP_SYSPLL1_D16			9
-+#define CLK_TOP_SYSPLL2_D2			10
-+#define CLK_TOP_SYSPLL2_D4			11
-+#define CLK_TOP_SYSPLL2_D8			12
-+#define CLK_TOP_SYSPLL3_D2			13
-+#define CLK_TOP_SYSPLL3_D4			14
-+#define CLK_TOP_SYSPLL4_D2			15
-+#define CLK_TOP_SYSPLL4_D4			16
-+#define CLK_TOP_UNIVPLL				17
-+#define CLK_TOP_UNIVPLL_D2			18
-+#define CLK_TOP_UNIVPLL_D3			19
-+#define CLK_TOP_UNIVPLL_D5			20
-+#define CLK_TOP_UNIVPLL_D7			21
-+#define CLK_TOP_UNIVPLL_D26			22
-+#define CLK_TOP_UNIVPLL_D52			23
-+#define CLK_TOP_UNIVPLL_D108			24
-+#define CLK_TOP_USB_PHY48M			25
-+#define CLK_TOP_UNIVPLL1_D2			26
-+#define CLK_TOP_UNIVPLL1_D4			27
-+#define CLK_TOP_UNIVPLL1_D8			28
-+#define CLK_TOP_UNIVPLL2_D2			29
-+#define CLK_TOP_UNIVPLL2_D4			30
-+#define CLK_TOP_UNIVPLL2_D8			31
-+#define CLK_TOP_UNIVPLL2_D16			32
-+#define CLK_TOP_UNIVPLL2_D32			33
-+#define CLK_TOP_UNIVPLL3_D2			34
-+#define CLK_TOP_UNIVPLL3_D4			35
-+#define CLK_TOP_UNIVPLL3_D8			36
-+#define CLK_TOP_MSDCPLL				37
-+#define CLK_TOP_MSDCPLL_D2			38
-+#define CLK_TOP_MSDCPLL_D4			39
-+#define CLK_TOP_MSDCPLL_D8			40
-+#define CLK_TOP_MMPLL				41
-+#define CLK_TOP_MMPLL_D2			42
-+#define CLK_TOP_DMPLL				43
-+#define CLK_TOP_DMPLL_D2			44
-+#define CLK_TOP_DMPLL_D4			45
-+#define CLK_TOP_DMPLL_X2			46
-+#define CLK_TOP_TVDPLL				47
-+#define CLK_TOP_TVDPLL_D2			48
-+#define CLK_TOP_TVDPLL_D4			49
-+#define CLK_TOP_TVD2PLL				50
-+#define CLK_TOP_TVD2PLL_D2			51
-+#define CLK_TOP_HADDS2PLL_98M			52
-+#define CLK_TOP_HADDS2PLL_294M			53
-+#define CLK_TOP_HADDS2_FB			54
-+#define CLK_TOP_MIPIPLL_D2			55
-+#define CLK_TOP_MIPIPLL_D4			56
-+#define CLK_TOP_HDMIPLL				57
-+#define CLK_TOP_HDMIPLL_D2			58
-+#define CLK_TOP_HDMIPLL_D3			59
-+#define CLK_TOP_HDMI_SCL_RX			60
-+#define CLK_TOP_HDMI_0_PIX340M			61
-+#define CLK_TOP_HDMI_0_DEEP340M			62
-+#define CLK_TOP_HDMI_0_PLL340M			63
-+#define CLK_TOP_AUD1PLL_98M			64
-+#define CLK_TOP_AUD2PLL_90M			65
-+#define CLK_TOP_AUDPLL				66
-+#define CLK_TOP_AUDPLL_D4			67
-+#define CLK_TOP_AUDPLL_D8			68
-+#define CLK_TOP_AUDPLL_D16			69
-+#define CLK_TOP_AUDPLL_D24			70
-+#define CLK_TOP_ETHPLL_500M			71
-+#define CLK_TOP_VDECPLL				72
-+#define CLK_TOP_VENCPLL				73
-+#define CLK_TOP_MIPIPLL				74
-+#define CLK_TOP_ARMPLL_1P3G			75
-+
-+#define CLK_TOP_MM_SEL				76
-+#define CLK_TOP_DDRPHYCFG_SEL			77
-+#define CLK_TOP_MEM_SEL				78
-+#define CLK_TOP_AXI_SEL				79
-+#define CLK_TOP_CAMTG_SEL			80
-+#define CLK_TOP_MFG_SEL				81
-+#define CLK_TOP_VDEC_SEL			82
-+#define CLK_TOP_PWM_SEL				83
-+#define CLK_TOP_MSDC30_0_SEL			84
-+#define CLK_TOP_USB20_SEL			85
-+#define CLK_TOP_SPI0_SEL			86
-+#define CLK_TOP_UART_SEL			87
-+#define CLK_TOP_AUDINTBUS_SEL			88
-+#define CLK_TOP_AUDIO_SEL			89
-+#define CLK_TOP_MSDC30_2_SEL			90
-+#define CLK_TOP_MSDC30_1_SEL			91
-+#define CLK_TOP_DPI1_SEL			92
-+#define CLK_TOP_DPI0_SEL			93
-+#define CLK_TOP_SCP_SEL				94
-+#define CLK_TOP_PMICSPI_SEL			95
-+#define CLK_TOP_APLL_SEL			96
-+#define CLK_TOP_HDMI_SEL			97
-+#define CLK_TOP_TVE_SEL				98
-+#define CLK_TOP_EMMC_HCLK_SEL			99
-+#define CLK_TOP_NFI2X_SEL			100
-+#define CLK_TOP_RTC_SEL				101
-+#define CLK_TOP_OSD_SEL				102
-+#define CLK_TOP_NR_SEL				103
-+#define CLK_TOP_DI_SEL				104
-+#define CLK_TOP_FLASH_SEL			105
-+#define CLK_TOP_ASM_M_SEL			106
-+#define CLK_TOP_ASM_I_SEL			107
-+#define CLK_TOP_INTDIR_SEL			108
-+#define CLK_TOP_HDMIRX_BIST_SEL			109
-+#define CLK_TOP_ETHIF_SEL			110
-+#define CLK_TOP_MS_CARD_SEL			111
-+#define CLK_TOP_ASM_H_SEL			112
-+#define CLK_TOP_SPI1_SEL			113
-+#define CLK_TOP_CMSYS_SEL			114
-+#define CLK_TOP_MSDC30_3_SEL			115
-+#define CLK_TOP_HDMIRX26_24_SEL			116
-+#define CLK_TOP_AUD2DVD_SEL			117
-+#define CLK_TOP_8BDAC_SEL			118
-+#define CLK_TOP_SPI2_SEL			119
-+#define CLK_TOP_AUD_MUX1_SEL			120
-+#define CLK_TOP_AUD_MUX2_SEL			121
-+#define CLK_TOP_AUDPLL_MUX_SEL			122
-+#define CLK_TOP_AUD_K1_SRC_SEL			123
-+#define CLK_TOP_AUD_K2_SRC_SEL			124
-+#define CLK_TOP_AUD_K3_SRC_SEL			125
-+#define CLK_TOP_AUD_K4_SRC_SEL			126
-+#define CLK_TOP_AUD_K5_SRC_SEL			127
-+#define CLK_TOP_AUD_K6_SRC_SEL			128
-+#define CLK_TOP_PADMCLK_SEL			129
-+#define CLK_TOP_AUD_EXTCK1_DIV			130
-+#define CLK_TOP_AUD_EXTCK2_DIV			131
-+#define CLK_TOP_AUD_MUX1_DIV			132
-+#define CLK_TOP_AUD_MUX2_DIV			133
-+#define CLK_TOP_AUD_K1_SRC_DIV			134
-+#define CLK_TOP_AUD_K2_SRC_DIV			135
-+#define CLK_TOP_AUD_K3_SRC_DIV			136
-+#define CLK_TOP_AUD_K4_SRC_DIV			137
-+#define CLK_TOP_AUD_K5_SRC_DIV			138
-+#define CLK_TOP_AUD_K6_SRC_DIV			139
-+#define CLK_TOP_AUD_I2S1_MCLK			140
-+#define CLK_TOP_AUD_I2S2_MCLK			141
-+#define CLK_TOP_AUD_I2S3_MCLK			142
-+#define CLK_TOP_AUD_I2S4_MCLK			143
-+#define CLK_TOP_AUD_I2S5_MCLK			144
-+#define CLK_TOP_AUD_I2S6_MCLK			145
-+#define CLK_TOP_AUD_48K_TIMING			146
-+#define CLK_TOP_AUD_44K_TIMING			147
-+
-+#define CLK_TOP_32K_INTERNAL			148
-+#define CLK_TOP_32K_EXTERNAL			149
-+#define CLK_TOP_CLK26M_D8			150
-+#define CLK_TOP_8BDAC				151
-+#define CLK_TOP_WBG_DIG_416M			152
-+#define CLK_TOP_DPI				153
-+#define CLK_TOP_HDMITX_CLKDIG_CTS		154
-+#define CLK_TOP_NR				155
-+
-+/* APMIXEDSYS */
-+
-+#define CLK_APMIXED_ARMPLL			1
-+#define CLK_APMIXED_MAINPLL			2
-+#define CLK_APMIXED_UNIVPLL			3
-+#define CLK_APMIXED_MMPLL			4
-+#define CLK_APMIXED_MSDCPLL			5
-+#define CLK_APMIXED_TVDPLL			6
-+#define CLK_APMIXED_AUD1PLL			7
-+#define CLK_APMIXED_TRGPLL			8
-+#define CLK_APMIXED_ETHPLL			9
-+#define CLK_APMIXED_VDECPLL			10
-+#define CLK_APMIXED_HADDS2PLL			11
-+#define CLK_APMIXED_AUD2PLL			12
-+#define CLK_APMIXED_TVD2PLL			13
-+#define CLK_APMIXED_NR				14
-+
-+/* DDRPHY */
-+
-+#define CLK_DDRPHY_VENCPLL			1
-+#define CLK_DDRPHY_NR				2
-+
-+/* INFRACFG */
-+
-+#define CLK_INFRA_DBG				1
-+#define CLK_INFRA_SMI				2
-+#define CLK_INFRA_QAXI_CM4			3
-+#define CLK_INFRA_AUD_SPLIN_B			4
-+#define CLK_INFRA_AUDIO				5
-+#define CLK_INFRA_EFUSE				6
-+#define CLK_INFRA_L2C_SRAM			7
-+#define CLK_INFRA_M4U				8
-+#define CLK_INFRA_CONNMCU			9
-+#define CLK_INFRA_TRNG				10
-+#define CLK_INFRA_RAMBUFIF			11
-+#define CLK_INFRA_CPUM				12
-+#define CLK_INFRA_KP				13
-+#define CLK_INFRA_CEC				14
-+#define CLK_INFRA_IRRX				15
-+#define CLK_INFRA_PMICSPI			16
-+#define CLK_INFRA_PMICWRAP			17
-+#define CLK_INFRA_DDCCI				18
-+#define CLK_INFRA_CLK_13M                       19
-+#define CLK_INFRA_NR				20
-+
-+/* PERICFG */
-+
-+#define CLK_PERI_NFI				1
-+#define CLK_PERI_THERM				2
-+#define CLK_PERI_PWM1				3
-+#define CLK_PERI_PWM2				4
-+#define CLK_PERI_PWM3				5
-+#define CLK_PERI_PWM4				6
-+#define CLK_PERI_PWM5				7
-+#define CLK_PERI_PWM6				8
-+#define CLK_PERI_PWM7				9
-+#define CLK_PERI_PWM				10
-+#define CLK_PERI_USB0				11
-+#define CLK_PERI_USB1				12
-+#define CLK_PERI_AP_DMA				13
-+#define CLK_PERI_MSDC30_0			14
-+#define CLK_PERI_MSDC30_1			15
-+#define CLK_PERI_MSDC30_2			16
-+#define CLK_PERI_MSDC30_3			17
-+#define CLK_PERI_MSDC50_3			18
-+#define CLK_PERI_NLI				19
-+#define CLK_PERI_UART0				20
-+#define CLK_PERI_UART1				21
-+#define CLK_PERI_UART2				22
-+#define CLK_PERI_UART3				23
-+#define CLK_PERI_BTIF				24
-+#define CLK_PERI_I2C0				25
-+#define CLK_PERI_I2C1				26
-+#define CLK_PERI_I2C2				27
-+#define CLK_PERI_I2C3				28
-+#define CLK_PERI_AUXADC				29
-+#define CLK_PERI_SPI0				30
-+#define CLK_PERI_ETH				31
-+#define CLK_PERI_USB0_MCU			32
-+
-+#define CLK_PERI_USB1_MCU			33
-+#define CLK_PERI_USB_SLV			34
-+#define CLK_PERI_GCPU				35
-+#define CLK_PERI_NFI_ECC			36
-+#define CLK_PERI_NFI_PAD			37
-+#define CLK_PERI_FLASH				38
-+#define CLK_PERI_HOST89_INT			39
-+#define CLK_PERI_HOST89_SPI			40
-+#define CLK_PERI_HOST89_DVD			41
-+#define CLK_PERI_SPI1				42
-+#define CLK_PERI_SPI2				43
-+#define CLK_PERI_FCI				44
-+
-+#define CLK_PERI_UART0_SEL			45
-+#define CLK_PERI_UART1_SEL			46
-+#define CLK_PERI_UART2_SEL			47
-+#define CLK_PERI_UART3_SEL			48
-+#define CLK_PERI_NR				49
-+
-+/* AUDIO */
-+
-+#define CLK_AUD_AFE				1
-+#define CLK_AUD_LRCK_DETECT			2
-+#define CLK_AUD_I2S				3
-+#define CLK_AUD_APLL_TUNER			4
-+#define CLK_AUD_HDMI				5
-+#define CLK_AUD_SPDF				6
-+#define CLK_AUD_SPDF2				7
-+#define CLK_AUD_APLL				8
-+#define CLK_AUD_TML				9
-+#define CLK_AUD_AHB_IDLE_EXT			10
-+#define CLK_AUD_AHB_IDLE_INT			11
-+
-+#define CLK_AUD_I2SIN1				12
-+#define CLK_AUD_I2SIN2				13
-+#define CLK_AUD_I2SIN3				14
-+#define CLK_AUD_I2SIN4				15
-+#define CLK_AUD_I2SIN5				16
-+#define CLK_AUD_I2SIN6				17
-+#define CLK_AUD_I2SO1				18
-+#define CLK_AUD_I2SO2				19
-+#define CLK_AUD_I2SO3				20
-+#define CLK_AUD_I2SO4				21
-+#define CLK_AUD_I2SO5				22
-+#define CLK_AUD_I2SO6				23
-+#define CLK_AUD_ASRCI1				24
-+#define CLK_AUD_ASRCI2				25
-+#define CLK_AUD_ASRCO1				26
-+#define CLK_AUD_ASRCO2				27
-+#define CLK_AUD_ASRC11				28
-+#define CLK_AUD_ASRC12				29
-+#define CLK_AUD_HDMIRX				30
-+#define CLK_AUD_INTDIR				31
-+#define CLK_AUD_A1SYS				32
-+#define CLK_AUD_A2SYS				33
-+#define CLK_AUD_AFE_CONN			34
-+#define CLK_AUD_AFE_PCMIF			35
-+#define CLK_AUD_AFE_MRGIF			36
-+
-+#define CLK_AUD_MMIF_UL1			37
-+#define CLK_AUD_MMIF_UL2			38
-+#define CLK_AUD_MMIF_UL3			39
-+#define CLK_AUD_MMIF_UL4			40
-+#define CLK_AUD_MMIF_UL5			41
-+#define CLK_AUD_MMIF_UL6			42
-+#define CLK_AUD_MMIF_DL1			43
-+#define CLK_AUD_MMIF_DL2			44
-+#define CLK_AUD_MMIF_DL3			45
-+#define CLK_AUD_MMIF_DL4			46
-+#define CLK_AUD_MMIF_DL5			47
-+#define CLK_AUD_MMIF_DL6			48
-+#define CLK_AUD_MMIF_DLMCH			49
-+#define CLK_AUD_MMIF_ARB1			50
-+#define CLK_AUD_MMIF_AWB1			51
-+#define CLK_AUD_MMIF_AWB2			52
-+#define CLK_AUD_MMIF_DAI			53
-+
-+#define CLK_AUD_DMIC1				54
-+#define CLK_AUD_DMIC2				55
-+#define CLK_AUD_ASRCI3				56
-+#define CLK_AUD_ASRCI4				57
-+#define CLK_AUD_ASRCI5				58
-+#define CLK_AUD_ASRCI6				59
-+#define CLK_AUD_ASRCO3				60
-+#define CLK_AUD_ASRCO4				61
-+#define CLK_AUD_ASRCO5				62
-+#define CLK_AUD_ASRCO6				63
-+#define CLK_AUD_MEM_ASRC1			64
-+#define CLK_AUD_MEM_ASRC2			65
-+#define CLK_AUD_MEM_ASRC3			66
-+#define CLK_AUD_MEM_ASRC4			67
-+#define CLK_AUD_MEM_ASRC5			68
-+#define CLK_AUD_DSD_ENC				69
-+#define CLK_AUD_ASRC_BRG			70
-+#define CLK_AUD_NR				71
-+
-+/* MMSYS */
-+
-+#define CLK_MM_SMI_COMMON			1
-+#define CLK_MM_SMI_LARB0			2
-+#define CLK_MM_CMDQ				3
-+#define CLK_MM_MUTEX				4
-+#define CLK_MM_DISP_COLOR			5
-+#define CLK_MM_DISP_BLS				6
-+#define CLK_MM_DISP_WDMA			7
-+#define CLK_MM_DISP_RDMA			8
-+#define CLK_MM_DISP_OVL				9
-+#define CLK_MM_MDP_TDSHP			10
-+#define CLK_MM_MDP_WROT				11
-+#define CLK_MM_MDP_WDMA				12
-+#define CLK_MM_MDP_RSZ1				13
-+#define CLK_MM_MDP_RSZ0				14
-+#define CLK_MM_MDP_RDMA				15
-+#define CLK_MM_MDP_BLS_26M			16
-+#define CLK_MM_CAM_MDP				17
-+#define CLK_MM_FAKE_ENG				18
-+#define CLK_MM_MUTEX_32K			19
-+#define CLK_MM_DISP_RDMA1			20
-+#define CLK_MM_DISP_UFOE			21
-+
-+#define CLK_MM_DSI_ENGINE			22
-+#define CLK_MM_DSI_DIG				23
-+#define CLK_MM_DPI_DIGL				24
-+#define CLK_MM_DPI_ENGINE			25
-+#define CLK_MM_DPI1_DIGL			26
-+#define CLK_MM_DPI1_ENGINE			27
-+#define CLK_MM_TVE_OUTPUT			28
-+#define CLK_MM_TVE_INPUT			29
-+#define CLK_MM_HDMI_PIXEL			30
-+#define CLK_MM_HDMI_PLL				31
-+#define CLK_MM_HDMI_AUDIO			32
-+#define CLK_MM_HDMI_SPDIF			33
-+#define CLK_MM_TVE_FMM				34
-+#define CLK_MM_NR				35
-+
-+/* IMGSYS */
-+
-+#define CLK_IMG_SMI_COMM			1
-+#define CLK_IMG_RESZ				2
-+#define CLK_IMG_JPGDEC				3
-+#define CLK_IMG_VENC_LT				4
-+#define CLK_IMG_VENC				5
-+#define CLK_IMG_NR				6
-+
-+/* VDEC */
-+
-+#define CLK_VDEC_CKGEN				1
-+#define CLK_VDEC_LARB				2
-+#define CLK_VDEC_NR				3
-+
-+/* HIFSYS */
-+
-+#define CLK_HIFSYS_USB0PHY			1
-+#define CLK_HIFSYS_USB1PHY			2
-+#define CLK_HIFSYS_PCIE0			3
-+#define CLK_HIFSYS_PCIE1			4
-+#define CLK_HIFSYS_PCIE2			5
-+#define CLK_HIFSYS_NR				6
-+
-+/* ETHSYS */
-+#define CLK_ETHSYS_HSDMA			1
-+#define CLK_ETHSYS_ESW				2
-+#define CLK_ETHSYS_GP2				3
-+#define CLK_ETHSYS_GP1				4
-+#define CLK_ETHSYS_PCM				5
-+#define CLK_ETHSYS_GDMA				6
-+#define CLK_ETHSYS_I2S				7
-+#define CLK_ETHSYS_CRYPTO			8
-+#define CLK_ETHSYS_NR				9
-+
-+/* BDP */
-+
-+#define CLK_BDP_BRG_BA				1
-+#define CLK_BDP_BRG_DRAM			2
-+#define CLK_BDP_LARB_DRAM			3
-+#define CLK_BDP_WR_VDI_PXL			4
-+#define CLK_BDP_WR_VDI_DRAM			5
-+#define CLK_BDP_WR_B				6
-+#define CLK_BDP_DGI_IN				7
-+#define CLK_BDP_DGI_OUT				8
-+#define CLK_BDP_FMT_MAST_27			9
-+#define CLK_BDP_FMT_B				10
-+#define CLK_BDP_OSD_B				11
-+#define CLK_BDP_OSD_DRAM			12
-+#define CLK_BDP_OSD_AGENT			13
-+#define CLK_BDP_OSD_PXL				14
-+#define CLK_BDP_RLE_B				15
-+#define CLK_BDP_RLE_AGENT			16
-+#define CLK_BDP_RLE_DRAM			17
-+#define CLK_BDP_F27M				18
-+#define CLK_BDP_F27M_VDOUT			19
-+#define CLK_BDP_F27_74_74			20
-+#define CLK_BDP_F2FS				21
-+#define CLK_BDP_F2FS74_148			22
-+#define CLK_BDP_FB				23
-+#define CLK_BDP_VDO_DRAM			24
-+#define CLK_BDP_VDO_2FS				25
-+#define CLK_BDP_VDO_B				26
-+#define CLK_BDP_WR_DI_PXL			27
-+#define CLK_BDP_WR_DI_DRAM			28
-+#define CLK_BDP_WR_DI_B				29
-+#define CLK_BDP_NR_PXL				30
-+#define CLK_BDP_NR_DRAM				31
-+#define CLK_BDP_NR_B				32
-+
-+#define CLK_BDP_RX_F				33
-+#define CLK_BDP_RX_X				34
-+#define CLK_BDP_RXPDT				35
-+#define CLK_BDP_RX_CSCL_N			36
-+#define CLK_BDP_RX_CSCL				37
-+#define CLK_BDP_RX_DDCSCL_N			38
-+#define CLK_BDP_RX_DDCSCL			39
-+#define CLK_BDP_RX_VCO				40
-+#define CLK_BDP_RX_DP				41
-+#define CLK_BDP_RX_P				42
-+#define CLK_BDP_RX_M				43
-+#define CLK_BDP_RX_PLL				44
-+#define CLK_BDP_BRG_RT_B			45
-+#define CLK_BDP_BRG_RT_DRAM			46
-+#define CLK_BDP_LARBRT_DRAM			47
-+#define CLK_BDP_TMDS_SYN			48
-+#define CLK_BDP_HDMI_MON			49
-+#define CLK_BDP_NR				50
-+
-+#endif /* _DT_BINDINGS_CLK_MT2701_H */
diff --git a/target/linux/mediatek/patches-4.4/0010-reset-mediatek-mt2701-reset-controller-dt-binding-fi.patch b/target/linux/mediatek/patches-4.4/0010-reset-mediatek-mt2701-reset-controller-dt-binding-fi.patch
deleted file mode 100644
index b5b10e7..0000000
--- a/target/linux/mediatek/patches-4.4/0010-reset-mediatek-mt2701-reset-controller-dt-binding-fi.patch
+++ /dev/null
@@ -1,93 +0,0 @@
-From 8bf0f2a1e8ff082de3f650211abd985ef68abe1b Mon Sep 17 00:00:00 2001
-From: Shunli Wang <shunli.wang at mediatek.com>
-Date: Tue, 5 Jan 2016 14:30:21 +0800
-Subject: [PATCH 010/102] reset: mediatek: mt2701 reset controller dt-binding
- file
-
-Dt-binding file about reset controller is used to provide
-kinds of definition, which is referenced by dts file and
-IC-specified reset controller driver code.
-
-Signed-off-by: Shunli Wang <shunli.wang at mediatek.com>
----
- .../dt-bindings/reset-controller/mt2701-resets.h   |   74 ++++++++++++++++++++
- 1 file changed, 74 insertions(+)
- create mode 100644 include/dt-bindings/reset-controller/mt2701-resets.h
-
---- /dev/null
-+++ b/include/dt-bindings/reset-controller/mt2701-resets.h
-@@ -0,0 +1,74 @@
-+/*
-+ * Copyright (c) 2015 MediaTek, Shunli Wang <shunli.wang at mediatek.com>
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 as
-+ * published by the Free Software Foundation.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ */
-+
-+#ifndef _DT_BINDINGS_RESET_CONTROLLER_MT2701
-+#define _DT_BINDINGS_RESET_CONTROLLER_MT2701
-+
-+/* INFRACFG resets */
-+#define MT2701_INFRA_EMI_REG_RST		0
-+#define MT2701_INFRA_DRAMC0_A0_RST		1
-+#define MT2701_INFRA_FHCTL_RST			2
-+#define MT2701_INFRA_APCIRQ_EINT_RST		3
-+#define MT2701_INFRA_APXGPT_RST			4
-+#define MT2701_INFRA_SCPSYS_RST			5
-+#define MT2701_INFRA_KP_RST			6
-+#define MT2701_INFRA_PMIC_WRAP_RST		7
-+#define MT2701_INFRA_MIPI_RST			8
-+#define MT2701_INFRA_IRRX_RST			9
-+#define MT2701_INFRA_CEC_RST			10
-+#define MT2701_INFRA_EMI_RST			32
-+#define MT2701_INFRA_DRAMC0_RST			34
-+#define MT2701_INFRA_TRNG_RST			37
-+#define MT2701_INFRA_SYSIRQ_RST			38
-+
-+/*  PERICFG resets */
-+#define MT2701_PERI_UART0_SW_RST		0
-+#define MT2701_PERI_UART1_SW_RST		1
-+#define MT2701_PERI_UART2_SW_RST		2
-+#define MT2701_PERI_UART3_SW_RST		3
-+#define MT2701_PERI_GCPU_SW_RST			5
-+#define MT2701_PERI_BTIF_SW_RST			6
-+#define MT2701_PERI_PWM_SW_RST			8
-+#define MT2701_PERI_AUXADC_SW_RST		10
-+#define MT2701_PERI_DMA_SW_RST			11
-+#define MT2701_PERI_NFI_SW_RST			14
-+#define MT2701_PERI_NLI_SW_RST			15
-+#define MT2701_PERI_THERM_SW_RST		16
-+#define MT2701_PERI_MSDC2_SW_RST		17
-+#define MT2701_PERI_MSDC0_SW_RST		19
-+#define MT2701_PERI_MSDC1_SW_RST		20
-+#define MT2701_PERI_I2C0_SW_RST			22
-+#define MT2701_PERI_I2C1_SW_RST			23
-+#define MT2701_PERI_I2C2_SW_RST			24
-+#define MT2701_PERI_I2C3_SW_RST			25
-+#define MT2701_PERI_USB_SW_RST			28
-+#define MT2701_PERI_ETH_SW_RST			29
-+#define MT2701_PERI_SPI0_SW_RST			33
-+
-+/* TOPRGU resets */
-+#define MT2701_TOPRGU_INFRA_RST			0
-+#define MT2701_TOPRGU_MM_RST			1
-+#define MT2701_TOPRGU_MFG_RST			2
-+#define MT2701_TOPRGU_ETHDMA_RST		3
-+#define MT2701_TOPRGU_VDEC_RST			4
-+#define MT2701_TOPRGU_VENC_IMG_RST		5
-+#define MT2701_TOPRGU_DDRPHY_RST		6
-+#define MT2701_TOPRGU_MD_RST			7
-+#define MT2701_TOPRGU_INFRA_AO_RST		8
-+#define MT2701_TOPRGU_CONN_RST			9
-+#define MT2701_TOPRGU_APMIXED_RST		10
-+#define MT2701_TOPRGU_HIFSYS_RST		11
-+#define MT2701_TOPRGU_CONN_MCU_RST		12
-+#define MT2701_TOPRGU_BDP_DISP_RST		13
-+
-+#endif  /* _DT_BINDINGS_RESET_CONTROLLER_MT2701 */
diff --git a/target/linux/mediatek/patches-4.4/0013-dt-bindings-mediatek-Modify-pinctrl-bindings-for-mt2.patch b/target/linux/mediatek/patches-4.4/0013-dt-bindings-mediatek-Modify-pinctrl-bindings-for-mt2.patch
deleted file mode 100644
index af1ad66..0000000
--- a/target/linux/mediatek/patches-4.4/0013-dt-bindings-mediatek-Modify-pinctrl-bindings-for-mt2.patch
+++ /dev/null
@@ -1,31 +0,0 @@
-From afcbed6f51e8c3a9195952b27c8aad047c314ed0 Mon Sep 17 00:00:00 2001
-From: Biao Huang <biao.huang at mediatek.com>
-Date: Mon, 28 Dec 2015 15:09:03 +0800
-Subject: [PATCH 013/102] dt-bindings: mediatek: Modify pinctrl bindings for
- mt2701
-
-Signed-off-by: Biao Huang <biao.huang at mediatek.com>
-Acked-by: Rob Herring <robh at kernel.org>
-Reviewed-by: Mathias Brugger <matthias.bgg at gmail.com>
----
- Documentation/devicetree/bindings/pinctrl/pinctrl-mt65xx.txt |    9 +++++----
- 1 file changed, 5 insertions(+), 4 deletions(-)
-
---- a/Documentation/devicetree/bindings/pinctrl/pinctrl-mt65xx.txt
-+++ b/Documentation/devicetree/bindings/pinctrl/pinctrl-mt65xx.txt
-@@ -4,10 +4,11 @@ The Mediatek's Pin controller is used to
- 
- Required properties:
- - compatible: value should be one of the following.
--    (a) "mediatek,mt8135-pinctrl", compatible with mt8135 pinctrl.
--    (b) "mediatek,mt8173-pinctrl", compatible with mt8173 pinctrl.
--    (c) "mediatek,mt6397-pinctrl", compatible with mt6397 pinctrl.
--    (d) "mediatek,mt8127-pinctrl", compatible with mt8127 pinctrl.
-+	"mediatek,mt2701-pinctrl", compatible with mt2701 pinctrl.
-+	"mediatek,mt6397-pinctrl", compatible with mt6397 pinctrl.
-+	"mediatek,mt8127-pinctrl", compatible with mt8127 pinctrl.
-+	"mediatek,mt8135-pinctrl", compatible with mt8135 pinctrl.
-+	"mediatek,mt8173-pinctrl", compatible with mt8173 pinctrl.
- - pins-are-numbered: Specify the subnodes are using numbered pinmux to
-   specify pins.
- - gpio-controller : Marks the device node as a gpio controller.
diff --git a/target/linux/mediatek/patches-4.4/0014-pinctrl-dt-bindings-Add-pinfunc-header-file-for-mt27.patch b/target/linux/mediatek/patches-4.4/0014-pinctrl-dt-bindings-Add-pinfunc-header-file-for-mt27.patch
deleted file mode 100644
index 0df6d18..0000000
--- a/target/linux/mediatek/patches-4.4/0014-pinctrl-dt-bindings-Add-pinfunc-header-file-for-mt27.patch
+++ /dev/null
@@ -1,3792 +0,0 @@
-From 124894a4d1635915ff95c447767677b60fd27e9c Mon Sep 17 00:00:00 2001
-From: Biao Huang <biao.huang at mediatek.com>
-Date: Mon, 28 Dec 2015 15:09:04 +0800
-Subject: [PATCH 014/102] pinctrl: dt bindings: Add pinfunc header file for
- mt2701
-
-Add pinfunc header file, mt2701 related dts will include it
-
-Signed-off-by: Biao Huang <biao.huang at mediatek.com>
-Acked-by: Linus Walleij <linus.walleij at linaro.org>
----
- arch/arm/boot/dts/mt2701-pinfunc.h            |  735 ++++++++
- drivers/pinctrl/mediatek/Kconfig              |    6 +
- drivers/pinctrl/mediatek/Makefile             |    1 +
- drivers/pinctrl/mediatek/pinctrl-mt2701.c     |  586 +++++++
- drivers/pinctrl/mediatek/pinctrl-mtk-common.c |   16 +
- drivers/pinctrl/mediatek/pinctrl-mtk-common.h |   12 +-
- drivers/pinctrl/mediatek/pinctrl-mtk-mt2701.h | 2323 +++++++++++++++++++++++++
- 7 files changed, 3678 insertions(+), 1 deletion(-)
- create mode 100644 arch/arm/boot/dts/mt2701-pinfunc.h
- create mode 100644 drivers/pinctrl/mediatek/pinctrl-mt2701.c
- create mode 100644 drivers/pinctrl/mediatek/pinctrl-mtk-mt2701.h
-
---- /dev/null
-+++ b/arch/arm/boot/dts/mt2701-pinfunc.h
-@@ -0,0 +1,735 @@
-+/*
-+ * Copyright (c) 2015 MediaTek Inc.
-+ * Author: Biao Huang <biao.huang at mediatek.com>
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 as
-+ * published by the Free Software Foundation.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ */
-+
-+#ifndef __DTS_MT2701_PINFUNC_H
-+#define __DTS_MT2701_PINFUNC_H
-+
-+#include <dt-bindings/pinctrl/mt65xx.h>
-+
-+#define MT2701_PIN_0_PWRAP_SPI0_MI__FUNC_GPIO0 (MTK_PIN_NO(0) | 0)
-+#define MT2701_PIN_0_PWRAP_SPI0_MI__FUNC_PWRAP_SPIDO (MTK_PIN_NO(0) | 1)
-+#define MT2701_PIN_0_PWRAP_SPI0_MI__FUNC_PWRAP_SPIDI (MTK_PIN_NO(0) | 2)
-+
-+#define MT2701_PIN_1_PWRAP_SPI0_MO__FUNC_GPIO1 (MTK_PIN_NO(1) | 0)
-+#define MT2701_PIN_1_PWRAP_SPI0_MO__FUNC_PWRAP_SPIDI (MTK_PIN_NO(1) | 1)
-+#define MT2701_PIN_1_PWRAP_SPI0_MO__FUNC_PWRAP_SPIDO (MTK_PIN_NO(1) | 2)
-+
-+#define MT2701_PIN_2_PWRAP_INT__FUNC_GPIO2 (MTK_PIN_NO(2) | 0)
-+#define MT2701_PIN_2_PWRAP_INT__FUNC_PWRAP_INT (MTK_PIN_NO(2) | 1)
-+
-+#define MT2701_PIN_3_PWRAP_SPI0_CK__FUNC_GPIO3 (MTK_PIN_NO(3) | 0)
-+#define MT2701_PIN_3_PWRAP_SPI0_CK__FUNC_PWRAP_SPICK_I (MTK_PIN_NO(3) | 1)
-+
-+#define MT2701_PIN_4_PWRAP_SPI0_CSN__FUNC_GPIO4 (MTK_PIN_NO(4) | 0)
-+#define MT2701_PIN_4_PWRAP_SPI0_CSN__FUNC_PWRAP_SPICS_B_I (MTK_PIN_NO(4) | 1)
-+
-+#define MT2701_PIN_5_PWRAP_SPI0_CK2__FUNC_GPIO5 (MTK_PIN_NO(5) | 0)
-+#define MT2701_PIN_5_PWRAP_SPI0_CK2__FUNC_PWRAP_SPICK2_I (MTK_PIN_NO(5) | 1)
-+#define MT2701_PIN_5_PWRAP_SPI0_CK2__FUNC_ANT_SEL1 (MTK_PIN_NO(5) | 5)
-+
-+#define MT2701_PIN_6_PWRAP_SPI0_CSN2__FUNC_GPIO6 (MTK_PIN_NO(6) | 0)
-+#define MT2701_PIN_6_PWRAP_SPI0_CSN2__FUNC_PWRAP_SPICS2_B_I (MTK_PIN_NO(6) | 1)
-+#define MT2701_PIN_6_PWRAP_SPI0_CSN2__FUNC_ANT_SEL0 (MTK_PIN_NO(6) | 5)
-+#define MT2701_PIN_6_PWRAP_SPI0_CSN2__FUNC_DBG_MON_A_0 (MTK_PIN_NO(6) | 7)
-+
-+#define MT2701_PIN_7_SPI1_CSN__FUNC_GPIO7 (MTK_PIN_NO(7) | 0)
-+#define MT2701_PIN_7_SPI1_CSN__FUNC_SPI1_CS (MTK_PIN_NO(7) | 1)
-+#define MT2701_PIN_7_SPI1_CSN__FUNC_KCOL0 (MTK_PIN_NO(7) | 4)
-+#define MT2701_PIN_7_SPI1_CSN__FUNC_DBG_MON_B_12 (MTK_PIN_NO(7) | 7)
-+
-+#define MT2701_PIN_8_SPI1_MI__FUNC_GPIO8 (MTK_PIN_NO(8) | 0)
-+#define MT2701_PIN_8_SPI1_MI__FUNC_SPI1_MI (MTK_PIN_NO(8) | 1)
-+#define MT2701_PIN_8_SPI1_MI__FUNC_SPI1_MO (MTK_PIN_NO(8) | 2)
-+#define MT2701_PIN_8_SPI1_MI__FUNC_KCOL1 (MTK_PIN_NO(8) | 4)
-+#define MT2701_PIN_8_SPI1_MI__FUNC_DBG_MON_B_13 (MTK_PIN_NO(8) | 7)
-+
-+#define MT2701_PIN_9_SPI1_MO__FUNC_GPIO9 (MTK_PIN_NO(9) | 0)
-+#define MT2701_PIN_9_SPI1_MO__FUNC_SPI1_MO (MTK_PIN_NO(9) | 1)
-+#define MT2701_PIN_9_SPI1_MO__FUNC_SPI1_MI (MTK_PIN_NO(9) | 2)
-+#define MT2701_PIN_9_SPI1_MO__FUNC_EXT_FRAME_SYNC (MTK_PIN_NO(9) | 3)
-+#define MT2701_PIN_9_SPI1_MO__FUNC_KCOL2 (MTK_PIN_NO(9) | 4)
-+#define MT2701_PIN_9_SPI1_MO__FUNC_DBG_MON_B_14 (MTK_PIN_NO(9) | 7)
-+
-+#define MT2701_PIN_10_RTC32K_CK__FUNC_GPIO10 (MTK_PIN_NO(10) | 0)
-+#define MT2701_PIN_10_RTC32K_CK__FUNC_RTC32K_CK (MTK_PIN_NO(10) | 1)
-+
-+#define MT2701_PIN_11_WATCHDOG__FUNC_GPIO11 (MTK_PIN_NO(11) | 0)
-+#define MT2701_PIN_11_WATCHDOG__FUNC_WATCHDOG (MTK_PIN_NO(11) | 1)
-+
-+#define MT2701_PIN_12_SRCLKENA__FUNC_GPIO12 (MTK_PIN_NO(12) | 0)
-+#define MT2701_PIN_12_SRCLKENA__FUNC_SRCLKENA (MTK_PIN_NO(12) | 1)
-+
-+#define MT2701_PIN_13_SRCLKENAI__FUNC_GPIO13 (MTK_PIN_NO(13) | 0)
-+#define MT2701_PIN_13_SRCLKENAI__FUNC_SRCLKENAI (MTK_PIN_NO(13) | 1)
-+
-+#define MT2701_PIN_14_URXD2__FUNC_GPIO14 (MTK_PIN_NO(14) | 0)
-+#define MT2701_PIN_14_URXD2__FUNC_URXD2 (MTK_PIN_NO(14) | 1)
-+#define MT2701_PIN_14_URXD2__FUNC_UTXD2 (MTK_PIN_NO(14) | 2)
-+#define MT2701_PIN_14_URXD2__FUNC_SRCCLKENAI2 (MTK_PIN_NO(14) | 5)
-+#define MT2701_PIN_14_URXD2__FUNC_DBG_MON_B_30 (MTK_PIN_NO(14) | 7)
-+
-+#define MT2701_PIN_15_UTXD2__FUNC_GPIO15 (MTK_PIN_NO(15) | 0)
-+#define MT2701_PIN_15_UTXD2__FUNC_UTXD2 (MTK_PIN_NO(15) | 1)
-+#define MT2701_PIN_15_UTXD2__FUNC_URXD2 (MTK_PIN_NO(15) | 2)
-+#define MT2701_PIN_15_UTXD2__FUNC_DBG_MON_B_31 (MTK_PIN_NO(15) | 7)
-+
-+#define MT2701_PIN_18_PCM_CLK__FUNC_GPIO18 (MTK_PIN_NO(18) | 0)
-+#define MT2701_PIN_18_PCM_CLK__FUNC_PCM_CLK0 (MTK_PIN_NO(18) | 1)
-+#define MT2701_PIN_18_PCM_CLK__FUNC_MRG_CLK (MTK_PIN_NO(18) | 2)
-+#define MT2701_PIN_18_PCM_CLK__FUNC_MM_TEST_CK (MTK_PIN_NO(18) | 4)
-+#define MT2701_PIN_18_PCM_CLK__FUNC_CONN_DSP_JCK (MTK_PIN_NO(18) | 5)
-+#define MT2701_PIN_18_PCM_CLK__FUNC_WCN_PCM_CLKO (MTK_PIN_NO(18) | 6)
-+#define MT2701_PIN_18_PCM_CLK__FUNC_DBG_MON_A_3 (MTK_PIN_NO(18) | 7)
-+
-+#define MT2701_PIN_19_PCM_SYNC__FUNC_GPIO19 (MTK_PIN_NO(19) | 0)
-+#define MT2701_PIN_19_PCM_SYNC__FUNC_PCM_SYNC (MTK_PIN_NO(19) | 1)
-+#define MT2701_PIN_19_PCM_SYNC__FUNC_MRG_SYNC (MTK_PIN_NO(19) | 2)
-+#define MT2701_PIN_19_PCM_SYNC__FUNC_CONN_DSP_JINTP (MTK_PIN_NO(19) | 5)
-+#define MT2701_PIN_19_PCM_SYNC__FUNC_WCN_PCM_SYNC (MTK_PIN_NO(19) | 6)
-+#define MT2701_PIN_19_PCM_SYNC__FUNC_DBG_MON_A_5 (MTK_PIN_NO(19) | 7)
-+
-+#define MT2701_PIN_20_PCM_RX__FUNC_GPIO20 (MTK_PIN_NO(20) | 0)
-+#define MT2701_PIN_20_PCM_RX__FUNC_PCM_RX (MTK_PIN_NO(20) | 1)
-+#define MT2701_PIN_20_PCM_RX__FUNC_MRG_RX (MTK_PIN_NO(20) | 2)
-+#define MT2701_PIN_20_PCM_RX__FUNC_MRG_TX (MTK_PIN_NO(20) | 3)
-+#define MT2701_PIN_20_PCM_RX__FUNC_PCM_TX (MTK_PIN_NO(20) | 4)
-+#define MT2701_PIN_20_PCM_RX__FUNC_CONN_DSP_JDI (MTK_PIN_NO(20) | 5)
-+#define MT2701_PIN_20_PCM_RX__FUNC_WCN_PCM_RX (MTK_PIN_NO(20) | 6)
-+#define MT2701_PIN_20_PCM_RX__FUNC_DBG_MON_A_4 (MTK_PIN_NO(20) | 7)
-+
-+#define MT2701_PIN_21_PCM_TX__FUNC_GPIO21 (MTK_PIN_NO(21) | 0)
-+#define MT2701_PIN_21_PCM_TX__FUNC_PCM_TX (MTK_PIN_NO(21) | 1)
-+#define MT2701_PIN_21_PCM_TX__FUNC_MRG_TX (MTK_PIN_NO(21) | 2)
-+#define MT2701_PIN_21_PCM_TX__FUNC_MRG_RX (MTK_PIN_NO(21) | 3)
-+#define MT2701_PIN_21_PCM_TX__FUNC_PCM_RX (MTK_PIN_NO(21) | 4)
-+#define MT2701_PIN_21_PCM_TX__FUNC_CONN_DSP_JMS (MTK_PIN_NO(21) | 5)
-+#define MT2701_PIN_21_PCM_TX__FUNC_WCN_PCM_TX (MTK_PIN_NO(21) | 6)
-+#define MT2701_PIN_21_PCM_TX__FUNC_DBG_MON_A_2 (MTK_PIN_NO(21) | 7)
-+
-+#define MT2701_PIN_22_EINT0__FUNC_GPIO22 (MTK_PIN_NO(22) | 0)
-+#define MT2701_PIN_22_EINT0__FUNC_UCTS0 (MTK_PIN_NO(22) | 1)
-+#define MT2701_PIN_22_EINT0__FUNC_KCOL3 (MTK_PIN_NO(22) | 3)
-+#define MT2701_PIN_22_EINT0__FUNC_CONN_DSP_JDO (MTK_PIN_NO(22) | 4)
-+#define MT2701_PIN_22_EINT0__FUNC_EXT_FRAME_SYNC (MTK_PIN_NO(22) | 5)
-+#define MT2701_PIN_22_EINT0__FUNC_DBG_MON_A_30 (MTK_PIN_NO(22) | 7)
-+#define MT2701_PIN_22_EINT0__FUNC_PCIE0_PERST_N (MTK_PIN_NO(22) | 10)
-+
-+#define MT2701_PIN_23_EINT1__FUNC_GPIO23 (MTK_PIN_NO(23) | 0)
-+#define MT2701_PIN_23_EINT1__FUNC_URTS0 (MTK_PIN_NO(23) | 1)
-+#define MT2701_PIN_23_EINT1__FUNC_KCOL2 (MTK_PIN_NO(23) | 3)
-+#define MT2701_PIN_23_EINT1__FUNC_CONN_MCU_TDO (MTK_PIN_NO(23) | 4)
-+#define MT2701_PIN_23_EINT1__FUNC_EXT_FRAME_SYNC (MTK_PIN_NO(23) | 5)
-+#define MT2701_PIN_23_EINT1__FUNC_DBG_MON_A_29 (MTK_PIN_NO(23) | 7)
-+#define MT2701_PIN_23_EINT1__FUNC_PCIE1_PERST_N (MTK_PIN_NO(23) | 10)
-+
-+#define MT2701_PIN_24_EINT2__FUNC_GPIO24 (MTK_PIN_NO(24) | 0)
-+#define MT2701_PIN_24_EINT2__FUNC_UCTS1 (MTK_PIN_NO(24) | 1)
-+#define MT2701_PIN_24_EINT2__FUNC_KCOL1 (MTK_PIN_NO(24) | 3)
-+#define MT2701_PIN_24_EINT2__FUNC_CONN_MCU_DBGACK_N (MTK_PIN_NO(24) | 4)
-+#define MT2701_PIN_24_EINT2__FUNC_DBG_MON_A_28 (MTK_PIN_NO(24) | 7)
-+#define MT2701_PIN_24_EINT2__FUNC_PCIE2_PERST_N (MTK_PIN_NO(24) | 10)
-+
-+#define MT2701_PIN_25_EINT3__FUNC_GPIO25 (MTK_PIN_NO(25) | 0)
-+#define MT2701_PIN_25_EINT3__FUNC_URTS1 (MTK_PIN_NO(25) | 1)
-+#define MT2701_PIN_25_EINT3__FUNC_KCOL0 (MTK_PIN_NO(25) | 3)
-+#define MT2701_PIN_25_EINT3__FUNC_CONN_MCU_DBGI_N (MTK_PIN_NO(25) | 4)
-+#define MT2701_PIN_25_EINT3__FUNC_DBG_MON_A_27 (MTK_PIN_NO(25) | 7)
-+
-+#define MT2701_PIN_26_EINT4__FUNC_GPIO26 (MTK_PIN_NO(26) | 0)
-+#define MT2701_PIN_26_EINT4__FUNC_UCTS3 (MTK_PIN_NO(26) | 1)
-+#define MT2701_PIN_26_EINT4__FUNC_DRV_VBUS_P1 (MTK_PIN_NO(26) | 2)
-+#define MT2701_PIN_26_EINT4__FUNC_KROW3 (MTK_PIN_NO(26) | 3)
-+#define MT2701_PIN_26_EINT4__FUNC_CONN_MCU_TCK0 (MTK_PIN_NO(26) | 4)
-+#define MT2701_PIN_26_EINT4__FUNC_CONN_MCU_AICE_JCKC (MTK_PIN_NO(26) | 5)
-+#define MT2701_PIN_26_EINT4__FUNC_PCIE2_WAKE_N (MTK_PIN_NO(26) | 6)
-+#define MT2701_PIN_26_EINT4__FUNC_DBG_MON_A_26 (MTK_PIN_NO(26) | 7)
-+
-+#define MT2701_PIN_27_EINT5__FUNC_GPIO27 (MTK_PIN_NO(27) | 0)
-+#define MT2701_PIN_27_EINT5__FUNC_URTS3 (MTK_PIN_NO(27) | 1)
-+#define MT2701_PIN_27_EINT5__FUNC_IDDIG_P1 (MTK_PIN_NO(27) | 2)
-+#define MT2701_PIN_27_EINT5__FUNC_KROW2 (MTK_PIN_NO(27) | 3)
-+#define MT2701_PIN_27_EINT5__FUNC_CONN_MCU_TDI (MTK_PIN_NO(27) | 4)
-+#define MT2701_PIN_27_EINT5__FUNC_PCIE1_WAKE_N (MTK_PIN_NO(27) | 6)
-+#define MT2701_PIN_27_EINT5__FUNC_DBG_MON_A_25 (MTK_PIN_NO(27) | 7)
-+
-+#define MT2701_PIN_28_EINT6__FUNC_GPIO28 (MTK_PIN_NO(28) | 0)
-+#define MT2701_PIN_28_EINT6__FUNC_DRV_VBUS (MTK_PIN_NO(28) | 1)
-+#define MT2701_PIN_28_EINT6__FUNC_KROW1 (MTK_PIN_NO(28) | 3)
-+#define MT2701_PIN_28_EINT6__FUNC_CONN_MCU_TRST_B (MTK_PIN_NO(28) | 4)
-+#define MT2701_PIN_28_EINT6__FUNC_PCIE0_WAKE_N (MTK_PIN_NO(28) | 6)
-+#define MT2701_PIN_28_EINT6__FUNC_DBG_MON_A_24 (MTK_PIN_NO(28) | 7)
-+
-+#define MT2701_PIN_29_EINT7__FUNC_GPIO29 (MTK_PIN_NO(29) | 0)
-+#define MT2701_PIN_29_EINT7__FUNC_IDDIG (MTK_PIN_NO(29) | 1)
-+#define MT2701_PIN_29_EINT7__FUNC_MSDC1_WP (MTK_PIN_NO(29) | 2)
-+#define MT2701_PIN_29_EINT7__FUNC_KROW0 (MTK_PIN_NO(29) | 3)
-+#define MT2701_PIN_29_EINT7__FUNC_CONN_MCU_TMS (MTK_PIN_NO(29) | 4)
-+#define MT2701_PIN_29_EINT7__FUNC_CONN_MCU_AICE_JMSC (MTK_PIN_NO(29) | 5)
-+#define MT2701_PIN_29_EINT7__FUNC_DBG_MON_A_23 (MTK_PIN_NO(29) | 7)
-+#define MT2701_PIN_29_EINT7__FUNC_PCIE2_PERST_N (MTK_PIN_NO(29) | 14)
-+
-+#define MT2701_PIN_33_I2S1_DATA__FUNC_GPIO33 (MTK_PIN_NO(33) | 0)
-+#define MT2701_PIN_33_I2S1_DATA__FUNC_I2S1_DATA (MTK_PIN_NO(33) | 1)
-+#define MT2701_PIN_33_I2S1_DATA__FUNC_I2S1_DATA_BYPS (MTK_PIN_NO(33) | 2)
-+#define MT2701_PIN_33_I2S1_DATA__FUNC_PCM_TX (MTK_PIN_NO(33) | 3)
-+#define MT2701_PIN_33_I2S1_DATA__FUNC_IMG_TEST_CK (MTK_PIN_NO(33) | 4)
-+#define MT2701_PIN_33_I2S1_DATA__FUNC_G1_RXD0 (MTK_PIN_NO(33) | 5)
-+#define MT2701_PIN_33_I2S1_DATA__FUNC_WCN_PCM_TX (MTK_PIN_NO(33) | 6)
-+#define MT2701_PIN_33_I2S1_DATA__FUNC_DBG_MON_B_8 (MTK_PIN_NO(33) | 7)
-+
-+#define MT2701_PIN_34_I2S1_DATA_IN__FUNC_GPIO34 (MTK_PIN_NO(34) | 0)
-+#define MT2701_PIN_34_I2S1_DATA_IN__FUNC_I2S1_DATA_IN (MTK_PIN_NO(34) | 1)
-+#define MT2701_PIN_34_I2S1_DATA_IN__FUNC_PCM_RX (MTK_PIN_NO(34) | 3)
-+#define MT2701_PIN_34_I2S1_DATA_IN__FUNC_VDEC_TEST_CK (MTK_PIN_NO(34) | 4)
-+#define MT2701_PIN_34_I2S1_DATA_IN__FUNC_G1_RXD1 (MTK_PIN_NO(34) | 5)
-+#define MT2701_PIN_34_I2S1_DATA_IN__FUNC_WCN_PCM_RX (MTK_PIN_NO(34) | 6)
-+#define MT2701_PIN_34_I2S1_DATA_IN__FUNC_DBG_MON_B_7 (MTK_PIN_NO(34) | 7)
-+
-+#define MT2701_PIN_35_I2S1_BCK__FUNC_GPIO35 (MTK_PIN_NO(35) | 0)
-+#define MT2701_PIN_35_I2S1_BCK__FUNC_I2S1_BCK (MTK_PIN_NO(35) | 1)
-+#define MT2701_PIN_35_I2S1_BCK__FUNC_PCM_CLK0 (MTK_PIN_NO(35) | 3)
-+#define MT2701_PIN_35_I2S1_BCK__FUNC_G1_RXD2 (MTK_PIN_NO(35) | 5)
-+#define MT2701_PIN_35_I2S1_BCK__FUNC_WCN_PCM_CLKO (MTK_PIN_NO(35) | 6)
-+#define MT2701_PIN_35_I2S1_BCK__FUNC_DBG_MON_B_9 (MTK_PIN_NO(35) | 7)
-+
-+#define MT2701_PIN_36_I2S1_LRCK__FUNC_GPIO36 (MTK_PIN_NO(36) | 0)
-+#define MT2701_PIN_36_I2S1_LRCK__FUNC_I2S1_LRCK (MTK_PIN_NO(36) | 1)
-+#define MT2701_PIN_36_I2S1_LRCK__FUNC_PCM_SYNC (MTK_PIN_NO(36) | 3)
-+#define MT2701_PIN_36_I2S1_LRCK__FUNC_G1_RXD3 (MTK_PIN_NO(36) | 5)
-+#define MT2701_PIN_36_I2S1_LRCK__FUNC_WCN_PCM_SYNC (MTK_PIN_NO(36) | 6)
-+#define MT2701_PIN_36_I2S1_LRCK__FUNC_DBG_MON_B_10 (MTK_PIN_NO(36) | 7)
-+
-+#define MT2701_PIN_37_I2S1_MCLK__FUNC_GPIO37 (MTK_PIN_NO(37) | 0)
-+#define MT2701_PIN_37_I2S1_MCLK__FUNC_I2S1_MCLK (MTK_PIN_NO(37) | 1)
-+#define MT2701_PIN_37_I2S1_MCLK__FUNC_G1_RXDV (MTK_PIN_NO(37) | 5)
-+#define MT2701_PIN_37_I2S1_MCLK__FUNC_DBG_MON_B_11 (MTK_PIN_NO(37) | 7)
-+
-+#define MT2701_PIN_39_JTMS__FUNC_GPIO39 (MTK_PIN_NO(39) | 0)
-+#define MT2701_PIN_39_JTMS__FUNC_JTMS (MTK_PIN_NO(39) | 1)
-+#define MT2701_PIN_39_JTMS__FUNC_CONN_MCU_TMS (MTK_PIN_NO(39) | 2)
-+#define MT2701_PIN_39_JTMS__FUNC_CONN_MCU_AICE_JMSC (MTK_PIN_NO(39) | 3)
-+#define MT2701_PIN_39_JTMS__FUNC_DFD_TMS_XI (MTK_PIN_NO(39) | 4)
-+
-+#define MT2701_PIN_40_JTCK__FUNC_GPIO40 (MTK_PIN_NO(40) | 0)
-+#define MT2701_PIN_40_JTCK__FUNC_JTCK (MTK_PIN_NO(40) | 1)
-+#define MT2701_PIN_40_JTCK__FUNC_CONN_MCU_TCK1 (MTK_PIN_NO(40) | 2)
-+#define MT2701_PIN_40_JTCK__FUNC_CONN_MCU_AICE_JCKC (MTK_PIN_NO(40) | 3)
-+#define MT2701_PIN_40_JTCK__FUNC_DFD_TCK_XI (MTK_PIN_NO(40) | 4)
-+
-+#define MT2701_PIN_41_JTDI__FUNC_GPIO41 (MTK_PIN_NO(41) | 0)
-+#define MT2701_PIN_41_JTDI__FUNC_JTDI (MTK_PIN_NO(41) | 1)
-+#define MT2701_PIN_41_JTDI__FUNC_CONN_MCU_TDI (MTK_PIN_NO(41) | 2)
-+#define MT2701_PIN_41_JTDI__FUNC_DFD_TDI_XI (MTK_PIN_NO(41) | 4)
-+
-+#define MT2701_PIN_42_JTDO__FUNC_GPIO42 (MTK_PIN_NO(42) | 0)
-+#define MT2701_PIN_42_JTDO__FUNC_JTDO (MTK_PIN_NO(42) | 1)
-+#define MT2701_PIN_42_JTDO__FUNC_CONN_MCU_TDO (MTK_PIN_NO(42) | 2)
-+#define MT2701_PIN_42_JTDO__FUNC_DFD_TDO (MTK_PIN_NO(42) | 4)
-+
-+#define MT2701_PIN_43_NCLE__FUNC_GPIO43 (MTK_PIN_NO(43) | 0)
-+#define MT2701_PIN_43_NCLE__FUNC_NCLE (MTK_PIN_NO(43) | 1)
-+#define MT2701_PIN_43_NCLE__FUNC_EXT_XCS2 (MTK_PIN_NO(43) | 2)
-+
-+#define MT2701_PIN_44_NCEB1__FUNC_GPIO44 (MTK_PIN_NO(44) | 0)
-+#define MT2701_PIN_44_NCEB1__FUNC_NCEB1 (MTK_PIN_NO(44) | 1)
-+#define MT2701_PIN_44_NCEB1__FUNC_IDDIG (MTK_PIN_NO(44) | 2)
-+
-+#define MT2701_PIN_45_NCEB0__FUNC_GPIO45 (MTK_PIN_NO(45) | 0)
-+#define MT2701_PIN_45_NCEB0__FUNC_NCEB0 (MTK_PIN_NO(45) | 1)
-+#define MT2701_PIN_45_NCEB0__FUNC_DRV_VBUS (MTK_PIN_NO(45) | 2)
-+
-+#define MT2701_PIN_46_IR__FUNC_GPIO46 (MTK_PIN_NO(46) | 0)
-+#define MT2701_PIN_46_IR__FUNC_IR (MTK_PIN_NO(46) | 1)
-+
-+#define MT2701_PIN_47_NREB__FUNC_GPIO47 (MTK_PIN_NO(47) | 0)
-+#define MT2701_PIN_47_NREB__FUNC_NREB (MTK_PIN_NO(47) | 1)
-+#define MT2701_PIN_47_NREB__FUNC_IDDIG_P1 (MTK_PIN_NO(47) | 2)
-+
-+#define MT2701_PIN_48_NRNB__FUNC_GPIO48 (MTK_PIN_NO(48) | 0)
-+#define MT2701_PIN_48_NRNB__FUNC_NRNB (MTK_PIN_NO(48) | 1)
-+#define MT2701_PIN_48_NRNB__FUNC_DRV_VBUS_P1 (MTK_PIN_NO(48) | 2)
-+
-+#define MT2701_PIN_49_I2S0_DATA__FUNC_GPIO49 (MTK_PIN_NO(49) | 0)
-+#define MT2701_PIN_49_I2S0_DATA__FUNC_I2S0_DATA (MTK_PIN_NO(49) | 1)
-+#define MT2701_PIN_49_I2S0_DATA__FUNC_I2S0_DATA_BYPS (MTK_PIN_NO(49) | 2)
-+#define MT2701_PIN_49_I2S0_DATA__FUNC_PCM_TX (MTK_PIN_NO(49) | 3)
-+#define MT2701_PIN_49_I2S0_DATA__FUNC_WCN_I2S_DO (MTK_PIN_NO(49) | 6)
-+#define MT2701_PIN_49_I2S0_DATA__FUNC_DBG_MON_B_3 (MTK_PIN_NO(49) | 7)
-+
-+#define MT2701_PIN_53_SPI0_CSN__FUNC_GPIO53 (MTK_PIN_NO(53) | 0)
-+#define MT2701_PIN_53_SPI0_CSN__FUNC_SPI0_CS (MTK_PIN_NO(53) | 1)
-+#define MT2701_PIN_53_SPI0_CSN__FUNC_SPDIF (MTK_PIN_NO(53) | 3)
-+#define MT2701_PIN_53_SPI0_CSN__FUNC_ADC_CK (MTK_PIN_NO(53) | 4)
-+#define MT2701_PIN_53_SPI0_CSN__FUNC_PWM1 (MTK_PIN_NO(53) | 5)
-+#define MT2701_PIN_53_SPI0_CSN__FUNC_DBG_MON_A_7 (MTK_PIN_NO(53) | 7)
-+
-+#define MT2701_PIN_54_SPI0_CK__FUNC_GPIO54 (MTK_PIN_NO(54) | 0)
-+#define MT2701_PIN_54_SPI0_CK__FUNC_SPI0_CK (MTK_PIN_NO(54) | 1)
-+#define MT2701_PIN_54_SPI0_CK__FUNC_SPDIF_IN1 (MTK_PIN_NO(54) | 3)
-+#define MT2701_PIN_54_SPI0_CK__FUNC_ADC_DAT_IN (MTK_PIN_NO(54) | 4)
-+#define MT2701_PIN_54_SPI0_CK__FUNC_DBG_MON_A_10 (MTK_PIN_NO(54) | 7)
-+
-+#define MT2701_PIN_55_SPI0_MI__FUNC_GPIO55 (MTK_PIN_NO(55) | 0)
-+#define MT2701_PIN_55_SPI0_MI__FUNC_SPI0_MI (MTK_PIN_NO(55) | 1)
-+#define MT2701_PIN_55_SPI0_MI__FUNC_SPI0_MO (MTK_PIN_NO(55) | 2)
-+#define MT2701_PIN_55_SPI0_MI__FUNC_MSDC1_WP (MTK_PIN_NO(55) | 3)
-+#define MT2701_PIN_55_SPI0_MI__FUNC_ADC_WS (MTK_PIN_NO(55) | 4)
-+#define MT2701_PIN_55_SPI0_MI__FUNC_PWM2 (MTK_PIN_NO(55) | 5)
-+#define MT2701_PIN_55_SPI0_MI__FUNC_DBG_MON_A_8 (MTK_PIN_NO(55) | 7)
-+
-+#define MT2701_PIN_56_SPI0_MO__FUNC_GPIO56 (MTK_PIN_NO(56) | 0)
-+#define MT2701_PIN_56_SPI0_MO__FUNC_SPI0_MO (MTK_PIN_NO(56) | 1)
-+#define MT2701_PIN_56_SPI0_MO__FUNC_SPI0_MI (MTK_PIN_NO(56) | 2)
-+#define MT2701_PIN_56_SPI0_MO__FUNC_SPDIF_IN0 (MTK_PIN_NO(56) | 3)
-+#define MT2701_PIN_56_SPI0_MO__FUNC_DBG_MON_A_9 (MTK_PIN_NO(56) | 7)
-+
-+#define MT2701_PIN_57_SDA1__FUNC_GPIO57 (MTK_PIN_NO(57) | 0)
-+#define MT2701_PIN_57_SDA1__FUNC_SDA1 (MTK_PIN_NO(57) | 1)
-+
-+#define MT2701_PIN_58_SCL1__FUNC_GPIO58 (MTK_PIN_NO(58) | 0)
-+#define MT2701_PIN_58_SCL1__FUNC_SCL1 (MTK_PIN_NO(58) | 1)
-+
-+#define MT2701_PIN_72_I2S0_DATA_IN__FUNC_GPIO72 (MTK_PIN_NO(72) | 0)
-+#define MT2701_PIN_72_I2S0_DATA_IN__FUNC_I2S0_DATA_IN (MTK_PIN_NO(72) | 1)
-+#define MT2701_PIN_72_I2S0_DATA_IN__FUNC_PCM_RX (MTK_PIN_NO(72) | 3)
-+#define MT2701_PIN_72_I2S0_DATA_IN__FUNC_PWM0 (MTK_PIN_NO(72) | 4)
-+#define MT2701_PIN_72_I2S0_DATA_IN__FUNC_DISP_PWM (MTK_PIN_NO(72) | 5)
-+#define MT2701_PIN_72_I2S0_DATA_IN__FUNC_WCN_I2S_DI (MTK_PIN_NO(72) | 6)
-+#define MT2701_PIN_72_I2S0_DATA_IN__FUNC_DBG_MON_B_2 (MTK_PIN_NO(72) | 7)
-+
-+#define MT2701_PIN_73_I2S0_LRCK__FUNC_GPIO73 (MTK_PIN_NO(73) | 0)
-+#define MT2701_PIN_73_I2S0_LRCK__FUNC_I2S0_LRCK (MTK_PIN_NO(73) | 1)
-+#define MT2701_PIN_73_I2S0_LRCK__FUNC_PCM_SYNC (MTK_PIN_NO(73) | 3)
-+#define MT2701_PIN_73_I2S0_LRCK__FUNC_WCN_I2S_LRCK (MTK_PIN_NO(73) | 6)
-+#define MT2701_PIN_73_I2S0_LRCK__FUNC_DBG_MON_B_5 (MTK_PIN_NO(73) | 7)
-+
-+#define MT2701_PIN_74_I2S0_BCK__FUNC_GPIO74 (MTK_PIN_NO(74) | 0)
-+#define MT2701_PIN_74_I2S0_BCK__FUNC_I2S0_BCK (MTK_PIN_NO(74) | 1)
-+#define MT2701_PIN_74_I2S0_BCK__FUNC_PCM_CLK0 (MTK_PIN_NO(74) | 3)
-+#define MT2701_PIN_74_I2S0_BCK__FUNC_WCN_I2S_BCK (MTK_PIN_NO(74) | 6)
-+#define MT2701_PIN_74_I2S0_BCK__FUNC_DBG_MON_B_4 (MTK_PIN_NO(74) | 7)
-+
-+#define MT2701_PIN_75_SDA0__FUNC_GPIO75 (MTK_PIN_NO(75) | 0)
-+#define MT2701_PIN_75_SDA0__FUNC_SDA0 (MTK_PIN_NO(75) | 1)
-+
-+#define MT2701_PIN_76_SCL0__FUNC_GPIO76 (MTK_PIN_NO(76) | 0)
-+#define MT2701_PIN_76_SCL0__FUNC_SCL0 (MTK_PIN_NO(76) | 1)
-+
-+#define MT2701_PIN_77_SDA2__FUNC_GPIO77 (MTK_PIN_NO(77) | 0)
-+#define MT2701_PIN_77_SDA2__FUNC_SDA2 (MTK_PIN_NO(77) | 1)
-+
-+#define MT2701_PIN_78_SCL2__FUNC_GPIO78 (MTK_PIN_NO(78) | 0)
-+#define MT2701_PIN_78_SCL2__FUNC_SCL2 (MTK_PIN_NO(78) | 1)
-+
-+#define MT2701_PIN_79_URXD0__FUNC_GPIO79 (MTK_PIN_NO(79) | 0)
-+#define MT2701_PIN_79_URXD0__FUNC_URXD0 (MTK_PIN_NO(79) | 1)
-+#define MT2701_PIN_79_URXD0__FUNC_UTXD0 (MTK_PIN_NO(79) | 2)
-+#define MT2701_PIN_79_URXD0__FUNC_ (MTK_PIN_NO(79) | 5)
-+
-+#define MT2701_PIN_80_UTXD0__FUNC_GPIO80 (MTK_PIN_NO(80) | 0)
-+#define MT2701_PIN_80_UTXD0__FUNC_UTXD0 (MTK_PIN_NO(80) | 1)
-+#define MT2701_PIN_80_UTXD0__FUNC_URXD0 (MTK_PIN_NO(80) | 2)
-+
-+#define MT2701_PIN_81_URXD1__FUNC_GPIO81 (MTK_PIN_NO(81) | 0)
-+#define MT2701_PIN_81_URXD1__FUNC_URXD1 (MTK_PIN_NO(81) | 1)
-+#define MT2701_PIN_81_URXD1__FUNC_UTXD1 (MTK_PIN_NO(81) | 2)
-+
-+#define MT2701_PIN_82_UTXD1__FUNC_GPIO82 (MTK_PIN_NO(82) | 0)
-+#define MT2701_PIN_82_UTXD1__FUNC_UTXD1 (MTK_PIN_NO(82) | 1)
-+#define MT2701_PIN_82_UTXD1__FUNC_URXD1 (MTK_PIN_NO(82) | 2)
-+
-+#define MT2701_PIN_83_LCM_RST__FUNC_GPIO83 (MTK_PIN_NO(83) | 0)
-+#define MT2701_PIN_83_LCM_RST__FUNC_LCM_RST (MTK_PIN_NO(83) | 1)
-+#define MT2701_PIN_83_LCM_RST__FUNC_VDAC_CK_XI (MTK_PIN_NO(83) | 2)
-+#define MT2701_PIN_83_LCM_RST__FUNC_DBG_MON_B_1 (MTK_PIN_NO(83) | 7)
-+
-+#define MT2701_PIN_84_DSI_TE__FUNC_GPIO84 (MTK_PIN_NO(84) | 0)
-+#define MT2701_PIN_84_DSI_TE__FUNC_DSI_TE (MTK_PIN_NO(84) | 1)
-+#define MT2701_PIN_84_DSI_TE__FUNC_DBG_MON_B_0 (MTK_PIN_NO(84) | 7)
-+
-+#define MT2701_PIN_91_TDN3__FUNC_GPI91 (MTK_PIN_NO(91) | 0)
-+#define MT2701_PIN_91_TDN3__FUNC_TDN3 (MTK_PIN_NO(91) | 1)
-+
-+#define MT2701_PIN_92_TDP3__FUNC_GPI92 (MTK_PIN_NO(92) | 0)
-+#define MT2701_PIN_92_TDP3__FUNC_TDP3 (MTK_PIN_NO(92) | 1)
-+
-+#define MT2701_PIN_93_TDN2__FUNC_GPI93 (MTK_PIN_NO(93) | 0)
-+#define MT2701_PIN_93_TDN2__FUNC_TDN2 (MTK_PIN_NO(93) | 1)
-+
-+#define MT2701_PIN_94_TDP2__FUNC_GPI94 (MTK_PIN_NO(94) | 0)
-+#define MT2701_PIN_94_TDP2__FUNC_TDP2 (MTK_PIN_NO(94) | 1)
-+
-+#define MT2701_PIN_95_TCN__FUNC_GPI95 (MTK_PIN_NO(95) | 0)
-+#define MT2701_PIN_95_TCN__FUNC_TCN (MTK_PIN_NO(95) | 1)
-+
-+#define MT2701_PIN_96_TCP__FUNC_GPI96 (MTK_PIN_NO(96) | 0)
-+#define MT2701_PIN_96_TCP__FUNC_TCP (MTK_PIN_NO(96) | 1)
-+
-+#define MT2701_PIN_97_TDN1__FUNC_GPI97 (MTK_PIN_NO(97) | 0)
-+#define MT2701_PIN_97_TDN1__FUNC_TDN1 (MTK_PIN_NO(97) | 1)
-+
-+#define MT2701_PIN_98_TDP1__FUNC_GPI98 (MTK_PIN_NO(98) | 0)
-+#define MT2701_PIN_98_TDP1__FUNC_TDP1 (MTK_PIN_NO(98) | 1)
-+
-+#define MT2701_PIN_99_TDN0__FUNC_GPI99 (MTK_PIN_NO(99) | 0)
-+#define MT2701_PIN_99_TDN0__FUNC_TDN0 (MTK_PIN_NO(99) | 1)
-+
-+#define MT2701_PIN_100_TDP0__FUNC_GPI100 (MTK_PIN_NO(100) | 0)
-+#define MT2701_PIN_100_TDP0__FUNC_TDP0 (MTK_PIN_NO(100) | 1)
-+
-+#define MT2701_PIN_101_SPI2_CSN__FUNC_GPIO101 (MTK_PIN_NO(101) | 0)
-+#define MT2701_PIN_101_SPI2_CSN__FUNC_SPI2_CS (MTK_PIN_NO(101) | 1)
-+#define MT2701_PIN_101_SPI2_CSN__FUNC_SCL3 (MTK_PIN_NO(101) | 3)
-+#define MT2701_PIN_101_SPI2_CSN__FUNC_KROW0 (MTK_PIN_NO(101) | 4)
-+
-+#define MT2701_PIN_102_SPI2_MI__FUNC_GPIO102 (MTK_PIN_NO(102) | 0)
-+#define MT2701_PIN_102_SPI2_MI__FUNC_SPI2_MI (MTK_PIN_NO(102) | 1)
-+#define MT2701_PIN_102_SPI2_MI__FUNC_SPI2_MO (MTK_PIN_NO(102) | 2)
-+#define MT2701_PIN_102_SPI2_MI__FUNC_SDA3 (MTK_PIN_NO(102) | 3)
-+#define MT2701_PIN_102_SPI2_MI__FUNC_KROW1 (MTK_PIN_NO(102) | 4)
-+
-+#define MT2701_PIN_103_SPI2_MO__FUNC_GPIO103 (MTK_PIN_NO(103) | 0)
-+#define MT2701_PIN_103_SPI2_MO__FUNC_SPI2_MO (MTK_PIN_NO(103) | 1)
-+#define MT2701_PIN_103_SPI2_MO__FUNC_SPI2_MI (MTK_PIN_NO(103) | 2)
-+#define MT2701_PIN_103_SPI2_MO__FUNC_SCL3 (MTK_PIN_NO(103) | 3)
-+#define MT2701_PIN_103_SPI2_MO__FUNC_KROW2 (MTK_PIN_NO(103) | 4)
-+
-+#define MT2701_PIN_104_SPI2_CLK__FUNC_GPIO104 (MTK_PIN_NO(104) | 0)
-+#define MT2701_PIN_104_SPI2_CLK__FUNC_SPI2_CK (MTK_PIN_NO(104) | 1)
-+#define MT2701_PIN_104_SPI2_CLK__FUNC_SDA3 (MTK_PIN_NO(104) | 3)
-+#define MT2701_PIN_104_SPI2_CLK__FUNC_KROW3 (MTK_PIN_NO(104) | 4)
-+
-+#define MT2701_PIN_105_MSDC1_CMD__FUNC_GPIO105 (MTK_PIN_NO(105) | 0)
-+#define MT2701_PIN_105_MSDC1_CMD__FUNC_MSDC1_CMD (MTK_PIN_NO(105) | 1)
-+#define MT2701_PIN_105_MSDC1_CMD__FUNC_ANT_SEL0 (MTK_PIN_NO(105) | 2)
-+#define MT2701_PIN_105_MSDC1_CMD__FUNC_SDA1 (MTK_PIN_NO(105) | 3)
-+#define MT2701_PIN_105_MSDC1_CMD__FUNC_I2SOUT_BCK (MTK_PIN_NO(105) | 6)
-+#define MT2701_PIN_105_MSDC1_CMD__FUNC_DBG_MON_B_27 (MTK_PIN_NO(105) | 7)
-+
-+#define MT2701_PIN_106_MSDC1_CLK__FUNC_GPIO106 (MTK_PIN_NO(106) | 0)
-+#define MT2701_PIN_106_MSDC1_CLK__FUNC_MSDC1_CLK (MTK_PIN_NO(106) | 1)
-+#define MT2701_PIN_106_MSDC1_CLK__FUNC_ANT_SEL1 (MTK_PIN_NO(106) | 2)
-+#define MT2701_PIN_106_MSDC1_CLK__FUNC_SCL1 (MTK_PIN_NO(106) | 3)
-+#define MT2701_PIN_106_MSDC1_CLK__FUNC_I2SOUT_LRCK (MTK_PIN_NO(106) | 6)
-+#define MT2701_PIN_106_MSDC1_CLK__FUNC_DBG_MON_B_28 (MTK_PIN_NO(106) | 7)
-+
-+#define MT2701_PIN_107_MSDC1_DAT0__FUNC_GPIO107 (MTK_PIN_NO(107) | 0)
-+#define MT2701_PIN_107_MSDC1_DAT0__FUNC_MSDC1_DAT0 (MTK_PIN_NO(107) | 1)
-+#define MT2701_PIN_107_MSDC1_DAT0__FUNC_ANT_SEL2 (MTK_PIN_NO(107) | 2)
-+#define MT2701_PIN_107_MSDC1_DAT0__FUNC_UTXD0 (MTK_PIN_NO(107) | 5)
-+#define MT2701_PIN_107_MSDC1_DAT0__FUNC_I2SOUT_DATA_OUT (MTK_PIN_NO(107) | 6)
-+#define MT2701_PIN_107_MSDC1_DAT0__FUNC_DBG_MON_B_26 (MTK_PIN_NO(107) | 7)
-+
-+#define MT2701_PIN_108_MSDC1_DAT1__FUNC_GPIO108 (MTK_PIN_NO(108) | 0)
-+#define MT2701_PIN_108_MSDC1_DAT1__FUNC_MSDC1_DAT1 (MTK_PIN_NO(108) | 1)
-+#define MT2701_PIN_108_MSDC1_DAT1__FUNC_ANT_SEL3 (MTK_PIN_NO(108) | 2)
-+#define MT2701_PIN_108_MSDC1_DAT1__FUNC_PWM0 (MTK_PIN_NO(108) | 3)
-+#define MT2701_PIN_108_MSDC1_DAT1__FUNC_URXD0 (MTK_PIN_NO(108) | 5)
-+#define MT2701_PIN_108_MSDC1_DAT1__FUNC_PWM1 (MTK_PIN_NO(108) | 6)
-+#define MT2701_PIN_108_MSDC1_DAT1__FUNC_DBG_MON_B_25 (MTK_PIN_NO(108) | 7)
-+
-+#define MT2701_PIN_109_MSDC1_DAT2__FUNC_GPIO109 (MTK_PIN_NO(109) | 0)
-+#define MT2701_PIN_109_MSDC1_DAT2__FUNC_MSDC1_DAT2 (MTK_PIN_NO(109) | 1)
-+#define MT2701_PIN_109_MSDC1_DAT2__FUNC_ANT_SEL4 (MTK_PIN_NO(109) | 2)
-+#define MT2701_PIN_109_MSDC1_DAT2__FUNC_SDA2 (MTK_PIN_NO(109) | 3)
-+#define MT2701_PIN_109_MSDC1_DAT2__FUNC_UTXD1 (MTK_PIN_NO(109) | 5)
-+#define MT2701_PIN_109_MSDC1_DAT2__FUNC_PWM2 (MTK_PIN_NO(109) | 6)
-+#define MT2701_PIN_109_MSDC1_DAT2__FUNC_DBG_MON_B_24 (MTK_PIN_NO(109) | 7)
-+
-+#define MT2701_PIN_110_MSDC1_DAT3__FUNC_GPIO110 (MTK_PIN_NO(110) | 0)
-+#define MT2701_PIN_110_MSDC1_DAT3__FUNC_MSDC1_DAT3 (MTK_PIN_NO(110) | 1)
-+#define MT2701_PIN_110_MSDC1_DAT3__FUNC_ANT_SEL5 (MTK_PIN_NO(110) | 2)
-+#define MT2701_PIN_110_MSDC1_DAT3__FUNC_SCL2 (MTK_PIN_NO(110) | 3)
-+#define MT2701_PIN_110_MSDC1_DAT3__FUNC_EXT_FRAME_SYNC (MTK_PIN_NO(110) | 4)
-+#define MT2701_PIN_110_MSDC1_DAT3__FUNC_URXD1 (MTK_PIN_NO(110) | 5)
-+#define MT2701_PIN_110_MSDC1_DAT3__FUNC_PWM3 (MTK_PIN_NO(110) | 6)
-+#define MT2701_PIN_110_MSDC1_DAT3__FUNC_DBG_MON_B_23 (MTK_PIN_NO(110) | 7)
-+
-+#define MT2701_PIN_111_MSDC0_DAT7__FUNC_GPIO111 (MTK_PIN_NO(111) | 0)
-+#define MT2701_PIN_111_MSDC0_DAT7__FUNC_MSDC0_DAT7 (MTK_PIN_NO(111) | 1)
-+#define MT2701_PIN_111_MSDC0_DAT7__FUNC_NLD7 (MTK_PIN_NO(111) | 4)
-+
-+#define MT2701_PIN_112_MSDC0_DAT6__FUNC_GPIO112 (MTK_PIN_NO(112) | 0)
-+#define MT2701_PIN_112_MSDC0_DAT6__FUNC_MSDC0_DAT6 (MTK_PIN_NO(112) | 1)
-+#define MT2701_PIN_112_MSDC0_DAT6__FUNC_NLD6 (MTK_PIN_NO(112) | 4)
-+
-+#define MT2701_PIN_113_MSDC0_DAT5__FUNC_GPIO113 (MTK_PIN_NO(113) | 0)
-+#define MT2701_PIN_113_MSDC0_DAT5__FUNC_MSDC0_DAT5 (MTK_PIN_NO(113) | 1)
-+#define MT2701_PIN_113_MSDC0_DAT5__FUNC_NLD5 (MTK_PIN_NO(113) | 4)
-+
-+#define MT2701_PIN_114_MSDC0_DAT4__FUNC_GPIO114 (MTK_PIN_NO(114) | 0)
-+#define MT2701_PIN_114_MSDC0_DAT4__FUNC_MSDC0_DAT4 (MTK_PIN_NO(114) | 1)
-+#define MT2701_PIN_114_MSDC0_DAT4__FUNC_NLD4 (MTK_PIN_NO(114) | 4)
-+
-+#define MT2701_PIN_115_MSDC0_RSTB__FUNC_GPIO115 (MTK_PIN_NO(115) | 0)
-+#define MT2701_PIN_115_MSDC0_RSTB__FUNC_MSDC0_RSTB (MTK_PIN_NO(115) | 1)
-+#define MT2701_PIN_115_MSDC0_RSTB__FUNC_NLD8 (MTK_PIN_NO(115) | 4)
-+
-+#define MT2701_PIN_116_MSDC0_CMD__FUNC_GPIO116 (MTK_PIN_NO(116) | 0)
-+#define MT2701_PIN_116_MSDC0_CMD__FUNC_MSDC0_CMD (MTK_PIN_NO(116) | 1)
-+#define MT2701_PIN_116_MSDC0_CMD__FUNC_NALE (MTK_PIN_NO(116) | 4)
-+
-+#define MT2701_PIN_117_MSDC0_CLK__FUNC_GPIO117 (MTK_PIN_NO(117) | 0)
-+#define MT2701_PIN_117_MSDC0_CLK__FUNC_MSDC0_CLK (MTK_PIN_NO(117) | 1)
-+#define MT2701_PIN_117_MSDC0_CLK__FUNC_NWEB (MTK_PIN_NO(117) | 4)
-+
-+#define MT2701_PIN_118_MSDC0_DAT3__FUNC_GPIO118 (MTK_PIN_NO(118) | 0)
-+#define MT2701_PIN_118_MSDC0_DAT3__FUNC_MSDC0_DAT3 (MTK_PIN_NO(118) | 1)
-+#define MT2701_PIN_118_MSDC0_DAT3__FUNC_NLD3 (MTK_PIN_NO(118) | 4)
-+
-+#define MT2701_PIN_119_MSDC0_DAT2__FUNC_GPIO119 (MTK_PIN_NO(119) | 0)
-+#define MT2701_PIN_119_MSDC0_DAT2__FUNC_MSDC0_DAT2 (MTK_PIN_NO(119) | 1)
-+#define MT2701_PIN_119_MSDC0_DAT2__FUNC_NLD2 (MTK_PIN_NO(119) | 4)
-+
-+#define MT2701_PIN_120_MSDC0_DAT1__FUNC_GPIO120 (MTK_PIN_NO(120) | 0)
-+#define MT2701_PIN_120_MSDC0_DAT1__FUNC_MSDC0_DAT1 (MTK_PIN_NO(120) | 1)
-+#define MT2701_PIN_120_MSDC0_DAT1__FUNC_NLD1 (MTK_PIN_NO(120) | 4)
-+
-+#define MT2701_PIN_121_MSDC0_DAT0__FUNC_GPIO121 (MTK_PIN_NO(121) | 0)
-+#define MT2701_PIN_121_MSDC0_DAT0__FUNC_MSDC0_DAT0 (MTK_PIN_NO(121) | 1)
-+#define MT2701_PIN_121_MSDC0_DAT0__FUNC_NLD0 (MTK_PIN_NO(121) | 4)
-+#define MT2701_PIN_121_MSDC0_DAT0__FUNC_WATCHDOG (MTK_PIN_NO(121) | 5)
-+
-+#define MT2701_PIN_122_CEC__FUNC_GPIO122 (MTK_PIN_NO(122) | 0)
-+#define MT2701_PIN_122_CEC__FUNC_CEC (MTK_PIN_NO(122) | 1)
-+#define MT2701_PIN_122_CEC__FUNC_SDA2 (MTK_PIN_NO(122) | 4)
-+#define MT2701_PIN_122_CEC__FUNC_URXD0 (MTK_PIN_NO(122) | 5)
-+
-+#define MT2701_PIN_123_HTPLG__FUNC_GPIO123 (MTK_PIN_NO(123) | 0)
-+#define MT2701_PIN_123_HTPLG__FUNC_HTPLG (MTK_PIN_NO(123) | 1)
-+#define MT2701_PIN_123_HTPLG__FUNC_SCL2 (MTK_PIN_NO(123) | 4)
-+#define MT2701_PIN_123_HTPLG__FUNC_UTXD0 (MTK_PIN_NO(123) | 5)
-+
-+#define MT2701_PIN_124_HDMISCK__FUNC_GPIO124 (MTK_PIN_NO(124) | 0)
-+#define MT2701_PIN_124_HDMISCK__FUNC_HDMISCK (MTK_PIN_NO(124) | 1)
-+#define MT2701_PIN_124_HDMISCK__FUNC_SDA1 (MTK_PIN_NO(124) | 4)
-+#define MT2701_PIN_124_HDMISCK__FUNC_PWM3 (MTK_PIN_NO(124) | 5)
-+
-+#define MT2701_PIN_125_HDMISD__FUNC_GPIO125 (MTK_PIN_NO(125) | 0)
-+#define MT2701_PIN_125_HDMISD__FUNC_HDMISD (MTK_PIN_NO(125) | 1)
-+#define MT2701_PIN_125_HDMISD__FUNC_SCL1 (MTK_PIN_NO(125) | 4)
-+#define MT2701_PIN_125_HDMISD__FUNC_PWM4 (MTK_PIN_NO(125) | 5)
-+
-+#define MT2701_PIN_126_I2S0_MCLK__FUNC_GPIO126 (MTK_PIN_NO(126) | 0)
-+#define MT2701_PIN_126_I2S0_MCLK__FUNC_I2S0_MCLK (MTK_PIN_NO(126) | 1)
-+#define MT2701_PIN_126_I2S0_MCLK__FUNC_WCN_I2S_MCLK (MTK_PIN_NO(126) | 6)
-+#define MT2701_PIN_126_I2S0_MCLK__FUNC_DBG_MON_B_6 (MTK_PIN_NO(126) | 7)
-+
-+#define MT2701_PIN_199_SPI1_CLK__FUNC_GPIO199 (MTK_PIN_NO(199) | 0)
-+#define MT2701_PIN_199_SPI1_CLK__FUNC_SPI1_CK (MTK_PIN_NO(199) | 1)
-+#define MT2701_PIN_199_SPI1_CLK__FUNC_EXT_FRAME_SYNC (MTK_PIN_NO(199) | 3)
-+#define MT2701_PIN_199_SPI1_CLK__FUNC_KCOL3 (MTK_PIN_NO(199) | 4)
-+#define MT2701_PIN_199_SPI1_CLK__FUNC_DBG_MON_B_15 (MTK_PIN_NO(199) | 7)
-+
-+#define MT2701_PIN_200_SPDIF_OUT__FUNC_GPIO200 (MTK_PIN_NO(200) | 0)
-+#define MT2701_PIN_200_SPDIF_OUT__FUNC_SPDIF_OUT (MTK_PIN_NO(200) | 1)
-+#define MT2701_PIN_200_SPDIF_OUT__FUNC_G1_TXD3 (MTK_PIN_NO(200) | 5)
-+#define MT2701_PIN_200_SPDIF_OUT__FUNC_URXD2 (MTK_PIN_NO(200) | 6)
-+#define MT2701_PIN_200_SPDIF_OUT__FUNC_DBG_MON_B_16 (MTK_PIN_NO(200) | 7)
-+
-+#define MT2701_PIN_201_SPDIF_IN0__FUNC_GPIO201 (MTK_PIN_NO(201) | 0)
-+#define MT2701_PIN_201_SPDIF_IN0__FUNC_SPDIF_IN0 (MTK_PIN_NO(201) | 1)
-+#define MT2701_PIN_201_SPDIF_IN0__FUNC_G1_TXEN (MTK_PIN_NO(201) | 5)
-+#define MT2701_PIN_201_SPDIF_IN0__FUNC_UTXD2 (MTK_PIN_NO(201) | 6)
-+#define MT2701_PIN_201_SPDIF_IN0__FUNC_DBG_MON_B_17 (MTK_PIN_NO(201) | 7)
-+
-+#define MT2701_PIN_202_SPDIF_IN1__FUNC_GPIO202 (MTK_PIN_NO(202) | 0)
-+#define MT2701_PIN_202_SPDIF_IN1__FUNC_SPDIF_IN1 (MTK_PIN_NO(202) | 1)
-+
-+#define MT2701_PIN_203_PWM0__FUNC_GPIO203 (MTK_PIN_NO(203) | 0)
-+#define MT2701_PIN_203_PWM0__FUNC_PWM0 (MTK_PIN_NO(203) | 1)
-+#define MT2701_PIN_203_PWM0__FUNC_DISP_PWM (MTK_PIN_NO(203) | 2)
-+#define MT2701_PIN_203_PWM0__FUNC_G1_TXD2 (MTK_PIN_NO(203) | 5)
-+#define MT2701_PIN_203_PWM0__FUNC_DBG_MON_B_18 (MTK_PIN_NO(203) | 7)
-+#define MT2701_PIN_203_PWM0__FUNC_I2S2_DATA (MTK_PIN_NO(203) | 9)
-+
-+#define MT2701_PIN_204_PWM1__FUNC_GPIO204 (MTK_PIN_NO(204) | 0)
-+#define MT2701_PIN_204_PWM1__FUNC_PWM1 (MTK_PIN_NO(204) | 1)
-+#define MT2701_PIN_204_PWM1__FUNC_CLKM3 (MTK_PIN_NO(204) | 2)
-+#define MT2701_PIN_204_PWM1__FUNC_G1_TXD1 (MTK_PIN_NO(204) | 5)
-+#define MT2701_PIN_204_PWM1__FUNC_DBG_MON_B_19 (MTK_PIN_NO(204) | 7)
-+#define MT2701_PIN_204_PWM1__FUNC_I2S3_DATA (MTK_PIN_NO(204) | 9)
-+
-+#define MT2701_PIN_205_PWM2__FUNC_GPIO205 (MTK_PIN_NO(205) | 0)
-+#define MT2701_PIN_205_PWM2__FUNC_PWM2 (MTK_PIN_NO(205) | 1)
-+#define MT2701_PIN_205_PWM2__FUNC_CLKM2 (MTK_PIN_NO(205) | 2)
-+#define MT2701_PIN_205_PWM2__FUNC_G1_TXD0 (MTK_PIN_NO(205) | 5)
-+#define MT2701_PIN_205_PWM2__FUNC_DBG_MON_B_20 (MTK_PIN_NO(205) | 7)
-+
-+#define MT2701_PIN_206_PWM3__FUNC_GPIO206 (MTK_PIN_NO(206) | 0)
-+#define MT2701_PIN_206_PWM3__FUNC_PWM3 (MTK_PIN_NO(206) | 1)
-+#define MT2701_PIN_206_PWM3__FUNC_CLKM1 (MTK_PIN_NO(206) | 2)
-+#define MT2701_PIN_206_PWM3__FUNC_EXT_FRAME_SYNC (MTK_PIN_NO(206) | 3)
-+#define MT2701_PIN_206_PWM3__FUNC_G1_TXC (MTK_PIN_NO(206) | 5)
-+#define MT2701_PIN_206_PWM3__FUNC_DBG_MON_B_21 (MTK_PIN_NO(206) | 7)
-+
-+#define MT2701_PIN_207_PWM4__FUNC_GPIO207 (MTK_PIN_NO(207) | 0)
-+#define MT2701_PIN_207_PWM4__FUNC_PWM4 (MTK_PIN_NO(207) | 1)
-+#define MT2701_PIN_207_PWM4__FUNC_CLKM0 (MTK_PIN_NO(207) | 2)
-+#define MT2701_PIN_207_PWM4__FUNC_EXT_FRAME_SYNC (MTK_PIN_NO(207) | 3)
-+#define MT2701_PIN_207_PWM4__FUNC_G1_RXC (MTK_PIN_NO(207) | 5)
-+#define MT2701_PIN_207_PWM4__FUNC_DBG_MON_B_22 (MTK_PIN_NO(207) | 7)
-+
-+#define MT2701_PIN_208_AUD_EXT_CK1__FUNC_GPIO208 (MTK_PIN_NO(208) | 0)
-+#define MT2701_PIN_208_AUD_EXT_CK1__FUNC_AUD_EXT_CK1 (MTK_PIN_NO(208) | 1)
-+#define MT2701_PIN_208_AUD_EXT_CK1__FUNC_PWM0 (MTK_PIN_NO(208) | 2)
-+#define MT2701_PIN_208_AUD_EXT_CK1__FUNC_ANT_SEL5 (MTK_PIN_NO(208) | 4)
-+#define MT2701_PIN_208_AUD_EXT_CK1__FUNC_DISP_PWM (MTK_PIN_NO(208) | 5)
-+#define MT2701_PIN_208_AUD_EXT_CK1__FUNC_DBG_MON_A_31 (MTK_PIN_NO(208) | 7)
-+#define MT2701_PIN_208_AUD_EXT_CK1__FUNC_PCIE0_PERST_N (MTK_PIN_NO(208) | 11)
-+
-+#define MT2701_PIN_209_AUD_EXT_CK2__FUNC_GPIO209 (MTK_PIN_NO(209) | 0)
-+#define MT2701_PIN_209_AUD_EXT_CK2__FUNC_AUD_EXT_CK2 (MTK_PIN_NO(209) | 1)
-+#define MT2701_PIN_209_AUD_EXT_CK2__FUNC_MSDC1_WP (MTK_PIN_NO(209) | 2)
-+#define MT2701_PIN_209_AUD_EXT_CK2__FUNC_PWM1 (MTK_PIN_NO(209) | 5)
-+#define MT2701_PIN_209_AUD_EXT_CK2__FUNC_DBG_MON_A_32 (MTK_PIN_NO(209) | 7)
-+#define MT2701_PIN_209_AUD_EXT_CK2__FUNC_PCIE1_PERST_N (MTK_PIN_NO(209) | 11)
-+
-+#define MT2701_PIN_236_EXT_SDIO3__FUNC_GPIO236 (MTK_PIN_NO(236) | 0)
-+#define MT2701_PIN_236_EXT_SDIO3__FUNC_EXT_SDIO3 (MTK_PIN_NO(236) | 1)
-+#define MT2701_PIN_236_EXT_SDIO3__FUNC_IDDIG (MTK_PIN_NO(236) | 2)
-+#define MT2701_PIN_236_EXT_SDIO3__FUNC_DBG_MON_A_1 (MTK_PIN_NO(236) | 7)
-+
-+#define MT2701_PIN_237_EXT_SDIO2__FUNC_GPIO237 (MTK_PIN_NO(237) | 0)
-+#define MT2701_PIN_237_EXT_SDIO2__FUNC_EXT_SDIO2 (MTK_PIN_NO(237) | 1)
-+#define MT2701_PIN_237_EXT_SDIO2__FUNC_DRV_VBUS (MTK_PIN_NO(237) | 2)
-+
-+#define MT2701_PIN_238_EXT_SDIO1__FUNC_GPIO238 (MTK_PIN_NO(238) | 0)
-+#define MT2701_PIN_238_EXT_SDIO1__FUNC_EXT_SDIO1 (MTK_PIN_NO(238) | 1)
-+#define MT2701_PIN_238_EXT_SDIO1__FUNC_IDDIG_P1 (MTK_PIN_NO(238) | 2)
-+
-+#define MT2701_PIN_239_EXT_SDIO0__FUNC_GPIO239 (MTK_PIN_NO(239) | 0)
-+#define MT2701_PIN_239_EXT_SDIO0__FUNC_EXT_SDIO0 (MTK_PIN_NO(239) | 1)
-+#define MT2701_PIN_239_EXT_SDIO0__FUNC_DRV_VBUS_P1 (MTK_PIN_NO(239) | 2)
-+
-+#define MT2701_PIN_240_EXT_XCS__FUNC_GPIO240 (MTK_PIN_NO(240) | 0)
-+#define MT2701_PIN_240_EXT_XCS__FUNC_EXT_XCS (MTK_PIN_NO(240) | 1)
-+
-+#define MT2701_PIN_241_EXT_SCK__FUNC_GPIO241 (MTK_PIN_NO(241) | 0)
-+#define MT2701_PIN_241_EXT_SCK__FUNC_EXT_SCK (MTK_PIN_NO(241) | 1)
-+
-+#define MT2701_PIN_242_URTS2__FUNC_GPIO242 (MTK_PIN_NO(242) | 0)
-+#define MT2701_PIN_242_URTS2__FUNC_URTS2 (MTK_PIN_NO(242) | 1)
-+#define MT2701_PIN_242_URTS2__FUNC_UTXD3 (MTK_PIN_NO(242) | 2)
-+#define MT2701_PIN_242_URTS2__FUNC_URXD3 (MTK_PIN_NO(242) | 3)
-+#define MT2701_PIN_242_URTS2__FUNC_SCL1 (MTK_PIN_NO(242) | 4)
-+#define MT2701_PIN_242_URTS2__FUNC_DBG_MON_B_32 (MTK_PIN_NO(242) | 7)
-+
-+#define MT2701_PIN_243_UCTS2__FUNC_GPIO243 (MTK_PIN_NO(243) | 0)
-+#define MT2701_PIN_243_UCTS2__FUNC_UCTS2 (MTK_PIN_NO(243) | 1)
-+#define MT2701_PIN_243_UCTS2__FUNC_URXD3 (MTK_PIN_NO(243) | 2)
-+#define MT2701_PIN_243_UCTS2__FUNC_UTXD3 (MTK_PIN_NO(243) | 3)
-+#define MT2701_PIN_243_UCTS2__FUNC_SDA1 (MTK_PIN_NO(243) | 4)
-+#define MT2701_PIN_243_UCTS2__FUNC_DBG_MON_A_6 (MTK_PIN_NO(243) | 7)
-+
-+#define MT2701_PIN_244_HDMI_SDA_RX__FUNC_GPIO244 (MTK_PIN_NO(244) | 0)
-+#define MT2701_PIN_244_HDMI_SDA_RX__FUNC_HDMI_SDA_RX (MTK_PIN_NO(244) | 1)
-+
-+#define MT2701_PIN_245_HDMI_SCL_RX__FUNC_GPIO245 (MTK_PIN_NO(245) | 0)
-+#define MT2701_PIN_245_HDMI_SCL_RX__FUNC_HDMI_SCL_RX (MTK_PIN_NO(245) | 1)
-+
-+#define MT2701_PIN_246_MHL_SENCE__FUNC_GPIO246 (MTK_PIN_NO(246) | 0)
-+
-+#define MT2701_PIN_247_HDMI_HPD_CBUS_RX__FUNC_GPIO247 (MTK_PIN_NO(247) | 0)
-+#define MT2701_PIN_247_HDMI_HPD_CBUS_RX__FUNC_HDMI_HPD_RX (MTK_PIN_NO(247) | 1)
-+
-+#define MT2701_PIN_248_HDMI_TESTOUTP_RX__FUNC_GPIO248 (MTK_PIN_NO(248) | 0)
-+#define MT2701_PIN_248_HDMI_TESTOUTP_RX__FUNC_HDMI_TESTOUTP_RX (MTK_PIN_NO(248) | 1)
-+
-+#define MT2701_PIN_249_MSDC0E_RSTB__FUNC_MSDC0E_RSTB (MTK_PIN_NO(249) | 9)
-+
-+#define MT2701_PIN_250_MSDC0E_DAT7__FUNC_MSDC3_DAT7 (MTK_PIN_NO(250) | 9)
-+#define MT2701_PIN_250_MSDC0E_DAT7__FUNC_PCIE0_CLKREQ_N (MTK_PIN_NO(250) | 14)
-+
-+#define MT2701_PIN_251_MSDC0E_DAT6__FUNC_MSDC3_DAT6 (MTK_PIN_NO(251) | 9)
-+#define MT2701_PIN_251_MSDC0E_DAT6__FUNC_PCIE0_WAKE_N (MTK_PIN_NO(251) | 14)
-+
-+#define MT2701_PIN_252_MSDC0E_DAT5__FUNC_MSDC3_DAT5 (MTK_PIN_NO(252) | 9)
-+#define MT2701_PIN_252_MSDC0E_DAT5__FUNC_PCIE1_CLKREQ_N (MTK_PIN_NO(252) | 14)
-+
-+#define MT2701_PIN_253_MSDC0E_DAT4__FUNC_MSDC3_DAT4 (MTK_PIN_NO(253) | 9)
-+#define MT2701_PIN_253_MSDC0E_DAT4__FUNC_PCIE1_WAKE_N (MTK_PIN_NO(253) | 14)
-+
-+#define MT2701_PIN_254_MSDC0E_DAT3__FUNC_MSDC3_DAT3 (MTK_PIN_NO(254) | 9)
-+#define MT2701_PIN_254_MSDC0E_DAT3__FUNC_PCIE2_CLKREQ_N (MTK_PIN_NO(254) | 14)
-+
-+#define MT2701_PIN_255_MSDC0E_DAT2__FUNC_MSDC3_DAT2 (MTK_PIN_NO(255) | 9)
-+#define MT2701_PIN_255_MSDC0E_DAT2__FUNC_PCIE2_WAKE_N (MTK_PIN_NO(255) | 14)
-+
-+#define MT2701_PIN_256_MSDC0E_DAT1__FUNC_MSDC3_DAT1 (MTK_PIN_NO(256) | 9)
-+
-+#define MT2701_PIN_257_MSDC0E_DAT0__FUNC_MSDC3_DAT0 (MTK_PIN_NO(257) | 9)
-+
-+#define MT2701_PIN_258_MSDC0E_CMD__FUNC_MSDC3_CMD (MTK_PIN_NO(258) | 9)
-+
-+#define MT2701_PIN_259_MSDC0E_CLK__FUNC_MSDC3_CLK (MTK_PIN_NO(259) | 9)
-+
-+#define MT2701_PIN_260_MSDC0E_DSL__FUNC_MSDC3_DSL (MTK_PIN_NO(260) | 9)
-+
-+#define MT2701_PIN_261_MSDC1_INS__FUNC_GPIO261 (MTK_PIN_NO(261) | 0)
-+#define MT2701_PIN_261_MSDC1_INS__FUNC_MSDC1_INS (MTK_PIN_NO(261) | 1)
-+#define MT2701_PIN_261_MSDC1_INS__FUNC_DBG_MON_B_29 (MTK_PIN_NO(261) | 7)
-+
-+#define MT2701_PIN_262_G2_TXEN__FUNC_GPIO262 (MTK_PIN_NO(262) | 0)
-+#define MT2701_PIN_262_G2_TXEN__FUNC_G2_TXEN (MTK_PIN_NO(262) | 1)
-+
-+#define MT2701_PIN_263_G2_TXD3__FUNC_GPIO263 (MTK_PIN_NO(263) | 0)
-+#define MT2701_PIN_263_G2_TXD3__FUNC_G2_TXD3 (MTK_PIN_NO(263) | 1)
-+#define MT2701_PIN_263_G2_TXD3__FUNC_ANT_SEL5 (MTK_PIN_NO(263) | 6)
-+
-+#define MT2701_PIN_264_G2_TXD2__FUNC_GPIO264 (MTK_PIN_NO(264) | 0)
-+#define MT2701_PIN_264_G2_TXD2__FUNC_G2_TXD2 (MTK_PIN_NO(264) | 1)
-+#define MT2701_PIN_264_G2_TXD2__FUNC_ANT_SEL4 (MTK_PIN_NO(264) | 6)
-+
-+#define MT2701_PIN_265_G2_TXD1__FUNC_GPIO265 (MTK_PIN_NO(265) | 0)
-+#define MT2701_PIN_265_G2_TXD1__FUNC_G2_TXD1 (MTK_PIN_NO(265) | 1)
-+#define MT2701_PIN_265_G2_TXD1__FUNC_ANT_SEL3 (MTK_PIN_NO(265) | 6)
-+
-+#define MT2701_PIN_266_G2_TXD0__FUNC_GPIO266 (MTK_PIN_NO(266) | 0)
-+#define MT2701_PIN_266_G2_TXD0__FUNC_G2_TXD0 (MTK_PIN_NO(266) | 1)
-+#define MT2701_PIN_266_G2_TXD0__FUNC_ANT_SEL2 (MTK_PIN_NO(266) | 6)
-+
-+#define MT2701_PIN_267_G2_TXC__FUNC_GPIO267 (MTK_PIN_NO(267) | 0)
-+#define MT2701_PIN_267_G2_TXC__FUNC_G2_TXC (MTK_PIN_NO(267) | 1)
-+
-+#define MT2701_PIN_268_G2_RXC__FUNC_GPIO268 (MTK_PIN_NO(268) | 0)
-+#define MT2701_PIN_268_G2_RXC__FUNC_G2_RXC (MTK_PIN_NO(268) | 1)
-+
-+#define MT2701_PIN_269_G2_RXD0__FUNC_GPIO269 (MTK_PIN_NO(269) | 0)
-+#define MT2701_PIN_269_G2_RXD0__FUNC_G2_RXD0 (MTK_PIN_NO(269) | 1)
-+
-+#define MT2701_PIN_270_G2_RXD1__FUNC_GPIO270 (MTK_PIN_NO(270) | 0)
-+#define MT2701_PIN_270_G2_RXD1__FUNC_G2_RXD1 (MTK_PIN_NO(270) | 1)
-+
-+#define MT2701_PIN_271_G2_RXD2__FUNC_GPIO271 (MTK_PIN_NO(271) | 0)
-+#define MT2701_PIN_271_G2_RXD2__FUNC_G2_RXD2 (MTK_PIN_NO(271) | 1)
-+
-+#define MT2701_PIN_272_G2_RXD3__FUNC_GPIO272 (MTK_PIN_NO(272) | 0)
-+#define MT2701_PIN_272_G2_RXD3__FUNC_G2_RXD3 (MTK_PIN_NO(272) | 1)
-+
-+#define MT2701_PIN_274_G2_RXDV__FUNC_GPIO274 (MTK_PIN_NO(274) | 0)
-+#define MT2701_PIN_274_G2_RXDV__FUNC_G2_RXDV (MTK_PIN_NO(274) | 1)
-+
-+#define MT2701_PIN_275_MDC__FUNC_GPIO275 (MTK_PIN_NO(275) | 0)
-+#define MT2701_PIN_275_MDC__FUNC_MDC (MTK_PIN_NO(275) | 1)
-+#define MT2701_PIN_275_MDC__FUNC_ANT_SEL0 (MTK_PIN_NO(275) | 6)
-+
-+#define MT2701_PIN_276_MDIO__FUNC_GPIO276 (MTK_PIN_NO(276) | 0)
-+#define MT2701_PIN_276_MDIO__FUNC_MDIO (MTK_PIN_NO(276) | 1)
-+#define MT2701_PIN_276_MDIO__FUNC_ANT_SEL1 (MTK_PIN_NO(276) | 6)
-+
-+#define MT2701_PIN_278_JTAG_RESET__FUNC_GPIO278 (MTK_PIN_NO(278) | 0)
-+#define MT2701_PIN_278_JTAG_RESET__FUNC_JTAG_RESET (MTK_PIN_NO(278) | 1)
-+
-+#endif /* __DTS_MT2701_PINFUNC_H */
---- a/drivers/pinctrl/mediatek/Kconfig
-+++ b/drivers/pinctrl/mediatek/Kconfig
-@@ -9,6 +9,12 @@ config PINCTRL_MTK_COMMON
- 	select OF_GPIO
- 
- # For ARMv7 SoCs
-+config PINCTRL_MT2701
-+	bool "Mediatek MT2701 pin control" if COMPILE_TEST && !MACH_MT2701
-+	depends on OF
-+	default MACH_MT2701
-+	select PINCTRL_MTK_COMMON
-+
- config PINCTRL_MT8135
- 	bool "Mediatek MT8135 pin control" if COMPILE_TEST && !MACH_MT8135
- 	depends on OF
---- a/drivers/pinctrl/mediatek/Makefile
-+++ b/drivers/pinctrl/mediatek/Makefile
-@@ -2,6 +2,7 @@
- obj-$(CONFIG_PINCTRL_MTK_COMMON)	+= pinctrl-mtk-common.o
- 
- # SoC Drivers
-+obj-$(CONFIG_PINCTRL_MT2701)		+= pinctrl-mt2701.o
- obj-$(CONFIG_PINCTRL_MT8135)		+= pinctrl-mt8135.o
- obj-$(CONFIG_PINCTRL_MT8127)		+= pinctrl-mt8127.o
- obj-$(CONFIG_PINCTRL_MT8173)		+= pinctrl-mt8173.o
---- /dev/null
-+++ b/drivers/pinctrl/mediatek/pinctrl-mt2701.c
-@@ -0,0 +1,586 @@
-+/*
-+ * Copyright (c) 2015 MediaTek Inc.
-+ * Author: Biao Huang <biao.huang at mediatek.com>
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 as
-+ * published by the Free Software Foundation.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ */
-+
-+#include <dt-bindings/pinctrl/mt65xx.h>
-+#include <linux/module.h>
-+#include <linux/of.h>
-+#include <linux/of_device.h>
-+#include <linux/platform_device.h>
-+#include <linux/pinctrl/pinctrl.h>
-+#include <linux/regmap.h>
-+
-+#include "pinctrl-mtk-common.h"
-+#include "pinctrl-mtk-mt2701.h"
-+
-+/**
-+ * struct mtk_spec_pinmux_set
-+ * - For special pins' mode setting
-+ * @pin: The pin number.
-+ * @offset: The offset of extra setting register.
-+ * @bit: The bit of extra setting register.
-+ */
-+struct mtk_spec_pinmux_set {
-+	unsigned short pin;
-+	unsigned short offset;
-+	unsigned char bit;
-+};
-+
-+#define MTK_PINMUX_SPEC(_pin, _offset, _bit)	\
-+	{					\
-+		.pin = _pin,			\
-+		.offset = _offset,		\
-+		.bit = _bit,			\
-+	}
-+
-+static const struct mtk_drv_group_desc mt2701_drv_grp[] =  {
-+	/* 0E4E8SR 4/8/12/16 */
-+	MTK_DRV_GRP(4, 16, 1, 2, 4),
-+	/* 0E2E4SR  2/4/6/8 */
-+	MTK_DRV_GRP(2, 8, 1, 2, 2),
-+	/* E8E4E2  2/4/6/8/10/12/14/16 */
-+	MTK_DRV_GRP(2, 16, 0, 2, 2)
-+};
-+
-+static const struct mtk_pin_drv_grp mt2701_pin_drv[] = {
-+	MTK_PIN_DRV_GRP(0, 0xf50, 0, 1),
-+	MTK_PIN_DRV_GRP(1, 0xf50, 0, 1),
-+	MTK_PIN_DRV_GRP(2, 0xf50, 0, 1),
-+	MTK_PIN_DRV_GRP(3, 0xf50, 0, 1),
-+	MTK_PIN_DRV_GRP(4, 0xf50, 0, 1),
-+	MTK_PIN_DRV_GRP(5, 0xf50, 0, 1),
-+	MTK_PIN_DRV_GRP(6, 0xf50, 0, 1),
-+	MTK_PIN_DRV_GRP(7, 0xf50, 4, 1),
-+	MTK_PIN_DRV_GRP(8, 0xf50, 4, 1),
-+	MTK_PIN_DRV_GRP(9, 0xf50, 4, 1),
-+	MTK_PIN_DRV_GRP(10, 0xf50, 8, 1),
-+	MTK_PIN_DRV_GRP(11, 0xf50, 8, 1),
-+	MTK_PIN_DRV_GRP(12, 0xf50, 8, 1),
-+	MTK_PIN_DRV_GRP(13, 0xf50, 8, 1),
-+	MTK_PIN_DRV_GRP(14, 0xf50, 12, 0),
-+	MTK_PIN_DRV_GRP(15, 0xf50, 12, 0),
-+	MTK_PIN_DRV_GRP(16, 0xf60, 0, 0),
-+	MTK_PIN_DRV_GRP(17, 0xf60, 0, 0),
-+	MTK_PIN_DRV_GRP(18, 0xf60, 4, 0),
-+	MTK_PIN_DRV_GRP(19, 0xf60, 4, 0),
-+	MTK_PIN_DRV_GRP(20, 0xf60, 4, 0),
-+	MTK_PIN_DRV_GRP(21, 0xf60, 4, 0),
-+	MTK_PIN_DRV_GRP(22, 0xf60, 8, 0),
-+	MTK_PIN_DRV_GRP(23, 0xf60, 8, 0),
-+	MTK_PIN_DRV_GRP(24, 0xf60, 8, 0),
-+	MTK_PIN_DRV_GRP(25, 0xf60, 8, 0),
-+	MTK_PIN_DRV_GRP(26, 0xf60, 8, 0),
-+	MTK_PIN_DRV_GRP(27, 0xf60, 12, 0),
-+	MTK_PIN_DRV_GRP(28, 0xf60, 12, 0),
-+	MTK_PIN_DRV_GRP(29, 0xf60, 12, 0),
-+	MTK_PIN_DRV_GRP(30, 0xf60, 0, 0),
-+	MTK_PIN_DRV_GRP(31, 0xf60, 0, 0),
-+	MTK_PIN_DRV_GRP(32, 0xf60, 0, 0),
-+	MTK_PIN_DRV_GRP(33, 0xf70, 0, 0),
-+	MTK_PIN_DRV_GRP(34, 0xf70, 0, 0),
-+	MTK_PIN_DRV_GRP(35, 0xf70, 0, 0),
-+	MTK_PIN_DRV_GRP(36, 0xf70, 0, 0),
-+	MTK_PIN_DRV_GRP(37, 0xf70, 0, 0),
-+	MTK_PIN_DRV_GRP(38, 0xf70, 4, 0),
-+	MTK_PIN_DRV_GRP(39, 0xf70, 8, 1),
-+	MTK_PIN_DRV_GRP(40, 0xf70, 8, 1),
-+	MTK_PIN_DRV_GRP(41, 0xf70, 8, 1),
-+	MTK_PIN_DRV_GRP(42, 0xf70, 8, 1),
-+	MTK_PIN_DRV_GRP(43, 0xf70, 12, 0),
-+	MTK_PIN_DRV_GRP(44, 0xf70, 12, 0),
-+	MTK_PIN_DRV_GRP(45, 0xf70, 12, 0),
-+	MTK_PIN_DRV_GRP(47, 0xf80, 0, 0),
-+	MTK_PIN_DRV_GRP(48, 0xf80, 0, 0),
-+	MTK_PIN_DRV_GRP(49, 0xf80, 4, 0),
-+	MTK_PIN_DRV_GRP(50, 0xf70, 4, 0),
-+	MTK_PIN_DRV_GRP(51, 0xf70, 4, 0),
-+	MTK_PIN_DRV_GRP(52, 0xf70, 4, 0),
-+	MTK_PIN_DRV_GRP(53, 0xf80, 12, 0),
-+	MTK_PIN_DRV_GRP(54, 0xf80, 12, 0),
-+	MTK_PIN_DRV_GRP(55, 0xf80, 12, 0),
-+	MTK_PIN_DRV_GRP(56, 0xf80, 12, 0),
-+	MTK_PIN_DRV_GRP(60, 0xf90, 8, 1),
-+	MTK_PIN_DRV_GRP(61, 0xf90, 8, 1),
-+	MTK_PIN_DRV_GRP(62, 0xf90, 8, 1),
-+	MTK_PIN_DRV_GRP(63, 0xf90, 12, 1),
-+	MTK_PIN_DRV_GRP(64, 0xf90, 12, 1),
-+	MTK_PIN_DRV_GRP(65, 0xf90, 12, 1),
-+	MTK_PIN_DRV_GRP(66, 0xfa0, 0, 1),
-+	MTK_PIN_DRV_GRP(67, 0xfa0, 0, 1),
-+	MTK_PIN_DRV_GRP(68, 0xfa0, 0, 1),
-+	MTK_PIN_DRV_GRP(69, 0xfa0, 0, 1),
-+	MTK_PIN_DRV_GRP(70, 0xfa0, 0, 1),
-+	MTK_PIN_DRV_GRP(71, 0xfa0, 0, 1),
-+	MTK_PIN_DRV_GRP(72, 0xf80, 4, 0),
-+	MTK_PIN_DRV_GRP(73, 0xf80, 4, 0),
-+	MTK_PIN_DRV_GRP(74, 0xf80, 4, 0),
-+	MTK_PIN_DRV_GRP(85, 0xda0, 0, 2),
-+	MTK_PIN_DRV_GRP(86, 0xd90, 0, 2),
-+	MTK_PIN_DRV_GRP(87, 0xdb0, 0, 2),
-+	MTK_PIN_DRV_GRP(88, 0xdb0, 0, 2),
-+	MTK_PIN_DRV_GRP(89, 0xdb0, 0, 2),
-+	MTK_PIN_DRV_GRP(90, 0xdb0, 0, 2),
-+	MTK_PIN_DRV_GRP(105, 0xd40, 0, 2),
-+	MTK_PIN_DRV_GRP(106, 0xd30, 0, 2),
-+	MTK_PIN_DRV_GRP(107, 0xd50, 0, 2),
-+	MTK_PIN_DRV_GRP(108, 0xd50, 0, 2),
-+	MTK_PIN_DRV_GRP(109, 0xd50, 0, 2),
-+	MTK_PIN_DRV_GRP(110, 0xd50, 0, 2),
-+	MTK_PIN_DRV_GRP(111, 0xce0, 0, 2),
-+	MTK_PIN_DRV_GRP(112, 0xce0, 0, 2),
-+	MTK_PIN_DRV_GRP(113, 0xce0, 0, 2),
-+	MTK_PIN_DRV_GRP(114, 0xce0, 0, 2),
-+	MTK_PIN_DRV_GRP(115, 0xce0, 0, 2),
-+	MTK_PIN_DRV_GRP(116, 0xcd0, 0, 2),
-+	MTK_PIN_DRV_GRP(117, 0xcc0, 0, 2),
-+	MTK_PIN_DRV_GRP(118, 0xce0, 0, 2),
-+	MTK_PIN_DRV_GRP(119, 0xce0, 0, 2),
-+	MTK_PIN_DRV_GRP(120, 0xce0, 0, 2),
-+	MTK_PIN_DRV_GRP(121, 0xce0, 0, 2),
-+	MTK_PIN_DRV_GRP(126, 0xf80, 4, 0),
-+	MTK_PIN_DRV_GRP(188, 0xf70, 4, 0),
-+	MTK_PIN_DRV_GRP(189, 0xfe0, 8, 0),
-+	MTK_PIN_DRV_GRP(190, 0xfe0, 8, 0),
-+	MTK_PIN_DRV_GRP(191, 0xfe0, 8, 0),
-+	MTK_PIN_DRV_GRP(192, 0xfe0, 8, 0),
-+	MTK_PIN_DRV_GRP(193, 0xfe0, 8, 0),
-+	MTK_PIN_DRV_GRP(194, 0xfe0, 12, 0),
-+	MTK_PIN_DRV_GRP(195, 0xfe0, 12, 0),
-+	MTK_PIN_DRV_GRP(196, 0xfe0, 12, 0),
-+	MTK_PIN_DRV_GRP(197, 0xfe0, 12, 0),
-+	MTK_PIN_DRV_GRP(198, 0xfe0, 12, 0),
-+	MTK_PIN_DRV_GRP(199, 0xf50, 4, 1),
-+	MTK_PIN_DRV_GRP(200, 0xfd0, 0, 0),
-+	MTK_PIN_DRV_GRP(201, 0xfd0, 0, 0),
-+	MTK_PIN_DRV_GRP(202, 0xfd0, 0, 0),
-+	MTK_PIN_DRV_GRP(203, 0xfd0, 4, 0),
-+	MTK_PIN_DRV_GRP(204, 0xfd0, 4, 0),
-+	MTK_PIN_DRV_GRP(205, 0xfd0, 4, 0),
-+	MTK_PIN_DRV_GRP(206, 0xfd0, 4, 0),
-+	MTK_PIN_DRV_GRP(207, 0xfd0, 4, 0),
-+	MTK_PIN_DRV_GRP(208, 0xfd0, 8, 0),
-+	MTK_PIN_DRV_GRP(209, 0xfd0, 8, 0),
-+	MTK_PIN_DRV_GRP(210, 0xfd0, 12, 1),
-+	MTK_PIN_DRV_GRP(211, 0xff0, 0, 1),
-+	MTK_PIN_DRV_GRP(212, 0xff0, 0, 1),
-+	MTK_PIN_DRV_GRP(213, 0xff0, 0, 1),
-+	MTK_PIN_DRV_GRP(214, 0xff0, 0, 1),
-+	MTK_PIN_DRV_GRP(215, 0xff0, 0, 1),
-+	MTK_PIN_DRV_GRP(216, 0xff0, 0, 1),
-+	MTK_PIN_DRV_GRP(217, 0xff0, 0, 1),
-+	MTK_PIN_DRV_GRP(218, 0xff0, 0, 1),
-+	MTK_PIN_DRV_GRP(219, 0xff0, 0, 1),
-+	MTK_PIN_DRV_GRP(220, 0xff0, 0, 1),
-+	MTK_PIN_DRV_GRP(221, 0xff0, 0, 1),
-+	MTK_PIN_DRV_GRP(222, 0xff0, 0, 1),
-+	MTK_PIN_DRV_GRP(223, 0xff0, 0, 1),
-+	MTK_PIN_DRV_GRP(224, 0xff0, 0, 1),
-+	MTK_PIN_DRV_GRP(225, 0xff0, 0, 1),
-+	MTK_PIN_DRV_GRP(226, 0xff0, 0, 1),
-+	MTK_PIN_DRV_GRP(227, 0xff0, 0, 1),
-+	MTK_PIN_DRV_GRP(228, 0xff0, 0, 1),
-+	MTK_PIN_DRV_GRP(229, 0xff0, 0, 1),
-+	MTK_PIN_DRV_GRP(230, 0xff0, 0, 1),
-+	MTK_PIN_DRV_GRP(231, 0xff0, 0, 1),
-+	MTK_PIN_DRV_GRP(232, 0xff0, 0, 1),
-+	MTK_PIN_DRV_GRP(233, 0xff0, 0, 1),
-+	MTK_PIN_DRV_GRP(234, 0xff0, 0, 1),
-+	MTK_PIN_DRV_GRP(235, 0xff0, 0, 1),
-+	MTK_PIN_DRV_GRP(236, 0xff0, 4, 0),
-+	MTK_PIN_DRV_GRP(237, 0xff0, 4, 0),
-+	MTK_PIN_DRV_GRP(238, 0xff0, 4, 0),
-+	MTK_PIN_DRV_GRP(239, 0xff0, 4, 0),
-+	MTK_PIN_DRV_GRP(240, 0xff0, 4, 0),
-+	MTK_PIN_DRV_GRP(241, 0xff0, 4, 0),
-+	MTK_PIN_DRV_GRP(242, 0xff0, 8, 0),
-+	MTK_PIN_DRV_GRP(243, 0xff0, 8, 0),
-+	MTK_PIN_DRV_GRP(248, 0xf00, 0, 0),
-+	MTK_PIN_DRV_GRP(249, 0xfc0, 0, 2),
-+	MTK_PIN_DRV_GRP(250, 0xfc0, 0, 2),
-+	MTK_PIN_DRV_GRP(251, 0xfc0, 0, 2),
-+	MTK_PIN_DRV_GRP(252, 0xfc0, 0, 2),
-+	MTK_PIN_DRV_GRP(253, 0xfc0, 0, 2),
-+	MTK_PIN_DRV_GRP(254, 0xfc0, 0, 2),
-+	MTK_PIN_DRV_GRP(255, 0xfc0, 0, 2),
-+	MTK_PIN_DRV_GRP(256, 0xfc0, 0, 2),
-+	MTK_PIN_DRV_GRP(257, 0xce0, 0, 2),
-+	MTK_PIN_DRV_GRP(258, 0xcb0, 0, 2),
-+	MTK_PIN_DRV_GRP(259, 0xc90, 0, 2),
-+	MTK_PIN_DRV_GRP(260, 0x3a0, 0, 2),
-+	MTK_PIN_DRV_GRP(261, 0xd50, 0, 2),
-+	MTK_PIN_DRV_GRP(262, 0xf00, 8, 0),
-+	MTK_PIN_DRV_GRP(263, 0xf00, 8, 0),
-+	MTK_PIN_DRV_GRP(264, 0xf00, 8, 0),
-+	MTK_PIN_DRV_GRP(265, 0xf00, 8, 0),
-+	MTK_PIN_DRV_GRP(266, 0xf00, 8, 0),
-+	MTK_PIN_DRV_GRP(267, 0xf00, 8, 0),
-+	MTK_PIN_DRV_GRP(268, 0xf00, 8, 0),
-+	MTK_PIN_DRV_GRP(269, 0xf00, 8, 0),
-+	MTK_PIN_DRV_GRP(270, 0xf00, 8, 0),
-+	MTK_PIN_DRV_GRP(271, 0xf00, 8, 0),
-+	MTK_PIN_DRV_GRP(272, 0xf00, 8, 0),
-+	MTK_PIN_DRV_GRP(273, 0xf00, 8, 0),
-+	MTK_PIN_DRV_GRP(274, 0xf00, 8, 0),
-+	MTK_PIN_DRV_GRP(275, 0xf00, 8, 0),
-+	MTK_PIN_DRV_GRP(276, 0xf00, 8, 0),
-+	MTK_PIN_DRV_GRP(277, 0xf00, 8, 0),
-+	MTK_PIN_DRV_GRP(278, 0xf70, 8, 1),
-+};
-+
-+static const struct mtk_pin_spec_pupd_set_samereg mt2701_spec_pupd[] = {
-+	MTK_PIN_PUPD_SPEC_SR(111, 0xd00, 12, 13, 14),	/* ms0 data7 */
-+	MTK_PIN_PUPD_SPEC_SR(112, 0xd00, 8, 9, 10),	/* ms0 data6 */
-+	MTK_PIN_PUPD_SPEC_SR(113, 0xd00, 4, 5, 6),	/* ms0 data5 */
-+	MTK_PIN_PUPD_SPEC_SR(114, 0xd00, 0, 1, 2),	/* ms0 data4 */
-+	MTK_PIN_PUPD_SPEC_SR(115, 0xd10, 0, 1, 2),	/* ms0 rstb */
-+	MTK_PIN_PUPD_SPEC_SR(116, 0xcd0, 8, 9, 10),	/* ms0 cmd */
-+	MTK_PIN_PUPD_SPEC_SR(117, 0xcc0, 8, 9, 10),	/* ms0 clk */
-+	MTK_PIN_PUPD_SPEC_SR(118, 0xcf0, 12, 13, 14),	/* ms0 data3 */
-+	MTK_PIN_PUPD_SPEC_SR(119, 0xcf0, 8, 9, 10),	/* ms0 data2 */
-+	MTK_PIN_PUPD_SPEC_SR(120, 0xcf0, 4, 5, 6),	/* ms0 data1 */
-+	MTK_PIN_PUPD_SPEC_SR(121, 0xcf0, 0, 1, 2),	/* ms0 data0 */
-+
-+	MTK_PIN_PUPD_SPEC_SR(105, 0xd40, 8, 9, 10),	/* ms1 cmd */
-+	MTK_PIN_PUPD_SPEC_SR(106, 0xd30, 8, 9, 10),	/* ms1 clk */
-+	MTK_PIN_PUPD_SPEC_SR(107, 0xd60, 0, 1, 2),	/* ms1 dat0 */
-+	MTK_PIN_PUPD_SPEC_SR(108, 0xd60, 10, 9, 8),	/* ms1 dat1 */
-+	MTK_PIN_PUPD_SPEC_SR(109, 0xd60, 4, 5, 6),	/* ms1 dat2 */
-+	MTK_PIN_PUPD_SPEC_SR(110, 0xc60, 12, 13, 14),	/* ms1 dat3 */
-+
-+	MTK_PIN_PUPD_SPEC_SR(85, 0xda0, 8, 9, 10),	/* ms2 cmd */
-+	MTK_PIN_PUPD_SPEC_SR(86, 0xd90, 8, 9, 10),	/* ms2 clk */
-+	MTK_PIN_PUPD_SPEC_SR(87, 0xdc0, 0, 1, 2),	/* ms2 dat0 */
-+	MTK_PIN_PUPD_SPEC_SR(88, 0xdc0, 10, 9, 8),	/* ms2 dat1 */
-+	MTK_PIN_PUPD_SPEC_SR(89, 0xdc0, 4, 5, 6),	/* ms2 dat2 */
-+	MTK_PIN_PUPD_SPEC_SR(90, 0xdc0, 12, 13, 14),	/* ms2 dat3 */
-+
-+	MTK_PIN_PUPD_SPEC_SR(249, 0x140, 0, 1, 2),	/* ms0e rstb */
-+	MTK_PIN_PUPD_SPEC_SR(250, 0x130, 12, 13, 14),	/* ms0e dat7 */
-+	MTK_PIN_PUPD_SPEC_SR(251, 0x130, 8, 9, 10),	/* ms0e dat6 */
-+	MTK_PIN_PUPD_SPEC_SR(252, 0x130, 4, 5, 6),	/* ms0e dat5 */
-+	MTK_PIN_PUPD_SPEC_SR(253, 0x130, 0, 1, 2),	/* ms0e dat4 */
-+	MTK_PIN_PUPD_SPEC_SR(254, 0xf40, 12, 13, 14),	/* ms0e dat3 */
-+	MTK_PIN_PUPD_SPEC_SR(255, 0xf40, 8, 9, 10),	/* ms0e dat2 */
-+	MTK_PIN_PUPD_SPEC_SR(256, 0xf40, 4, 5, 6),	/* ms0e dat1 */
-+	MTK_PIN_PUPD_SPEC_SR(257, 0xf40, 0, 1, 2),	/* ms0e dat0 */
-+	MTK_PIN_PUPD_SPEC_SR(258, 0xcb0, 8, 9, 10),	/* ms0e cmd */
-+	MTK_PIN_PUPD_SPEC_SR(259, 0xc90, 8, 9, 10),	/* ms0e clk */
-+	MTK_PIN_PUPD_SPEC_SR(261, 0x140, 8, 9, 10),	/* ms1 ins */
-+};
-+
-+static int mt2701_spec_pull_set(struct regmap *regmap, unsigned int pin,
-+		unsigned char align, bool isup, unsigned int r1r0)
-+{
-+	return mtk_pctrl_spec_pull_set_samereg(regmap, mt2701_spec_pupd,
-+		ARRAY_SIZE(mt2701_spec_pupd), pin, align, isup, r1r0);
-+}
-+
-+static const struct mtk_pin_ies_smt_set mt2701_ies_set[] = {
-+	MTK_PIN_IES_SMT_SPEC(0, 6, 0xb20, 0),
-+	MTK_PIN_IES_SMT_SPEC(7, 9, 0xb20, 1),
-+	MTK_PIN_IES_SMT_SPEC(10, 13, 0xb30, 3),
-+	MTK_PIN_IES_SMT_SPEC(14, 15, 0xb30, 13),
-+	MTK_PIN_IES_SMT_SPEC(16, 17, 0xb40, 7),
-+	MTK_PIN_IES_SMT_SPEC(18, 21, 0xb40, 13),
-+	MTK_PIN_IES_SMT_SPEC(22, 26, 0xb40, 13),
-+	MTK_PIN_IES_SMT_SPEC(27, 29, 0xb40, 13),
-+	MTK_PIN_IES_SMT_SPEC(30, 32, 0xb40, 7),
-+	MTK_PIN_IES_SMT_SPEC(33, 37, 0xb40, 13),
-+	MTK_PIN_IES_SMT_SPEC(38, 38, 0xb20, 13),
-+	MTK_PIN_IES_SMT_SPEC(39, 42, 0xb40, 13),
-+	MTK_PIN_IES_SMT_SPEC(43, 45, 0xb20, 10),
-+	MTK_PIN_IES_SMT_SPEC(47, 48, 0xb20, 11),
-+	MTK_PIN_IES_SMT_SPEC(49, 49, 0xb20, 12),
-+	MTK_PIN_IES_SMT_SPEC(50, 52, 0xb20, 13),
-+	MTK_PIN_IES_SMT_SPEC(53, 56, 0xb20, 14),
-+	MTK_PIN_IES_SMT_SPEC(57, 58, 0xb20, 15),
-+	MTK_PIN_IES_SMT_SPEC(59, 59, 0xb30, 10),
-+	MTK_PIN_IES_SMT_SPEC(60, 62, 0xb30, 0),
-+	MTK_PIN_IES_SMT_SPEC(63, 65, 0xb30, 1),
-+	MTK_PIN_IES_SMT_SPEC(66, 71, 0xb30, 2),
-+	MTK_PIN_IES_SMT_SPEC(72, 74, 0xb20, 12),
-+	MTK_PIN_IES_SMT_SPEC(75, 76, 0xb30, 3),
-+	MTK_PIN_IES_SMT_SPEC(77, 78, 0xb30, 4),
-+	MTK_PIN_IES_SMT_SPEC(79, 82, 0xb30, 5),
-+	MTK_PIN_IES_SMT_SPEC(83, 84, 0xb30, 2),
-+	MTK_PIN_IES_SMT_SPEC(85, 85, 0xda0, 4),
-+	MTK_PIN_IES_SMT_SPEC(86, 86, 0xd90, 4),
-+	MTK_PIN_IES_SMT_SPEC(87, 90, 0xdb0, 4),
-+	MTK_PIN_IES_SMT_SPEC(101, 104, 0xb30, 6),
-+	MTK_PIN_IES_SMT_SPEC(105, 105, 0xd40, 4),
-+	MTK_PIN_IES_SMT_SPEC(106, 106, 0xd30, 4),
-+	MTK_PIN_IES_SMT_SPEC(107, 110, 0xd50, 4),
-+	MTK_PIN_IES_SMT_SPEC(111, 115, 0xce0, 4),
-+	MTK_PIN_IES_SMT_SPEC(116, 116, 0xcd0, 4),
-+	MTK_PIN_IES_SMT_SPEC(117, 117, 0xcc0, 4),
-+	MTK_PIN_IES_SMT_SPEC(118, 121, 0xce0, 4),
-+	MTK_PIN_IES_SMT_SPEC(122, 125, 0xb30, 7),
-+	MTK_PIN_IES_SMT_SPEC(126, 126, 0xb20, 12),
-+	MTK_PIN_IES_SMT_SPEC(127, 142, 0xb30, 9),
-+	MTK_PIN_IES_SMT_SPEC(143, 160, 0xb30, 10),
-+	MTK_PIN_IES_SMT_SPEC(161, 168, 0xb30, 12),
-+	MTK_PIN_IES_SMT_SPEC(169, 183, 0xb30, 10),
-+	MTK_PIN_IES_SMT_SPEC(184, 186, 0xb30, 9),
-+	MTK_PIN_IES_SMT_SPEC(187, 187, 0xb30, 14),
-+	MTK_PIN_IES_SMT_SPEC(188, 188, 0xb20, 13),
-+	MTK_PIN_IES_SMT_SPEC(189, 193, 0xb30, 15),
-+	MTK_PIN_IES_SMT_SPEC(194, 198, 0xb40, 0),
-+	MTK_PIN_IES_SMT_SPEC(199, 199, 0xb20, 1),
-+	MTK_PIN_IES_SMT_SPEC(200, 202, 0xb40, 1),
-+	MTK_PIN_IES_SMT_SPEC(203, 207, 0xb40, 2),
-+	MTK_PIN_IES_SMT_SPEC(208, 209, 0xb40, 3),
-+	MTK_PIN_IES_SMT_SPEC(210, 210, 0xb40, 4),
-+	MTK_PIN_IES_SMT_SPEC(211, 235, 0xb40, 5),
-+	MTK_PIN_IES_SMT_SPEC(236, 241, 0xb40, 6),
-+	MTK_PIN_IES_SMT_SPEC(242, 243, 0xb40, 7),
-+	MTK_PIN_IES_SMT_SPEC(244, 247, 0xb40, 8),
-+	MTK_PIN_IES_SMT_SPEC(248, 248, 0xb40, 9),
-+	MTK_PIN_IES_SMT_SPEC(249, 257, 0xfc0, 4),
-+	MTK_PIN_IES_SMT_SPEC(258, 258, 0xcb0, 4),
-+	MTK_PIN_IES_SMT_SPEC(259, 259, 0xc90, 4),
-+	MTK_PIN_IES_SMT_SPEC(260, 260, 0x3a0, 4),
-+	MTK_PIN_IES_SMT_SPEC(261, 261, 0xd50, 4),
-+	MTK_PIN_IES_SMT_SPEC(262, 277, 0xb40, 12),
-+	MTK_PIN_IES_SMT_SPEC(278, 278, 0xb40, 13),
-+};
-+
-+static const struct mtk_pin_ies_smt_set mt2701_smt_set[] = {
-+	MTK_PIN_IES_SMT_SPEC(0, 6, 0xb50, 0),
-+	MTK_PIN_IES_SMT_SPEC(7, 9, 0xb50, 1),
-+	MTK_PIN_IES_SMT_SPEC(10, 13, 0xb60, 3),
-+	MTK_PIN_IES_SMT_SPEC(14, 15, 0xb60, 13),
-+	MTK_PIN_IES_SMT_SPEC(16, 17, 0xb70, 7),
-+	MTK_PIN_IES_SMT_SPEC(18, 21, 0xb70, 13),
-+	MTK_PIN_IES_SMT_SPEC(22, 26, 0xb70, 13),
-+	MTK_PIN_IES_SMT_SPEC(27, 29, 0xb70, 13),
-+	MTK_PIN_IES_SMT_SPEC(30, 32, 0xb70, 7),
-+	MTK_PIN_IES_SMT_SPEC(33, 37, 0xb70, 13),
-+	MTK_PIN_IES_SMT_SPEC(38, 38, 0xb50, 13),
-+	MTK_PIN_IES_SMT_SPEC(39, 42, 0xb70, 13),
-+	MTK_PIN_IES_SMT_SPEC(43, 45, 0xb50, 10),
-+	MTK_PIN_IES_SMT_SPEC(47, 48, 0xb50, 11),
-+	MTK_PIN_IES_SMT_SPEC(49, 49, 0xb50, 12),
-+	MTK_PIN_IES_SMT_SPEC(50, 52, 0xb50, 13),
-+	MTK_PIN_IES_SMT_SPEC(53, 56, 0xb50, 14),
-+	MTK_PIN_IES_SMT_SPEC(57, 58, 0xb50, 15),
-+	MTK_PIN_IES_SMT_SPEC(59, 59, 0xb60, 10),
-+	MTK_PIN_IES_SMT_SPEC(60, 62, 0xb60, 0),
-+	MTK_PIN_IES_SMT_SPEC(63, 65, 0xb60, 1),
-+	MTK_PIN_IES_SMT_SPEC(66, 71, 0xb60, 2),
-+	MTK_PIN_IES_SMT_SPEC(72, 74, 0xb50, 12),
-+	MTK_PIN_IES_SMT_SPEC(75, 76, 0xb60, 3),
-+	MTK_PIN_IES_SMT_SPEC(77, 78, 0xb60, 4),
-+	MTK_PIN_IES_SMT_SPEC(79, 82, 0xb60, 5),
-+	MTK_PIN_IES_SMT_SPEC(83, 84, 0xb60, 2),
-+	MTK_PIN_IES_SMT_SPEC(85, 85, 0xda0, 11),
-+	MTK_PIN_IES_SMT_SPEC(86, 86, 0xd90, 11),
-+	MTK_PIN_IES_SMT_SPEC(87, 87, 0xdc0, 3),
-+	MTK_PIN_IES_SMT_SPEC(88, 88, 0xdc0, 7),
-+	MTK_PIN_IES_SMT_SPEC(89, 89, 0xdc0, 11),
-+	MTK_PIN_IES_SMT_SPEC(90, 90, 0xdc0, 15),
-+	MTK_PIN_IES_SMT_SPEC(101, 104, 0xb60, 6),
-+	MTK_PIN_IES_SMT_SPEC(105, 105, 0xd40, 11),
-+	MTK_PIN_IES_SMT_SPEC(106, 106, 0xd30, 11),
-+	MTK_PIN_IES_SMT_SPEC(107, 107, 0xd60, 3),
-+	MTK_PIN_IES_SMT_SPEC(108, 108, 0xd60, 7),
-+	MTK_PIN_IES_SMT_SPEC(109, 109, 0xd60, 11),
-+	MTK_PIN_IES_SMT_SPEC(110, 110, 0xd60, 15),
-+	MTK_PIN_IES_SMT_SPEC(111, 111, 0xd00, 15),
-+	MTK_PIN_IES_SMT_SPEC(112, 112, 0xd00, 11),
-+	MTK_PIN_IES_SMT_SPEC(113, 113, 0xd00, 7),
-+	MTK_PIN_IES_SMT_SPEC(114, 114, 0xd00, 3),
-+	MTK_PIN_IES_SMT_SPEC(115, 115, 0xd10, 3),
-+	MTK_PIN_IES_SMT_SPEC(116, 116, 0xcd0, 11),
-+	MTK_PIN_IES_SMT_SPEC(117, 117, 0xcc0, 11),
-+	MTK_PIN_IES_SMT_SPEC(118, 118, 0xcf0, 15),
-+	MTK_PIN_IES_SMT_SPEC(119, 119, 0xcf0, 11),
-+	MTK_PIN_IES_SMT_SPEC(120, 120, 0xcf0, 7),
-+	MTK_PIN_IES_SMT_SPEC(121, 121, 0xcf0, 3),
-+	MTK_PIN_IES_SMT_SPEC(122, 125, 0xb60, 7),
-+	MTK_PIN_IES_SMT_SPEC(126, 126, 0xb50, 12),
-+	MTK_PIN_IES_SMT_SPEC(127, 142, 0xb60, 9),
-+	MTK_PIN_IES_SMT_SPEC(143, 160, 0xb60, 10),
-+	MTK_PIN_IES_SMT_SPEC(161, 168, 0xb60, 12),
-+	MTK_PIN_IES_SMT_SPEC(169, 183, 0xb60, 10),
-+	MTK_PIN_IES_SMT_SPEC(184, 186, 0xb60, 9),
-+	MTK_PIN_IES_SMT_SPEC(187, 187, 0xb60, 14),
-+	MTK_PIN_IES_SMT_SPEC(188, 188, 0xb50, 13),
-+	MTK_PIN_IES_SMT_SPEC(189, 193, 0xb60, 15),
-+	MTK_PIN_IES_SMT_SPEC(194, 198, 0xb70, 0),
-+	MTK_PIN_IES_SMT_SPEC(199, 199, 0xb50, 1),
-+	MTK_PIN_IES_SMT_SPEC(200, 202, 0xb70, 1),
-+	MTK_PIN_IES_SMT_SPEC(203, 207, 0xb70, 2),
-+	MTK_PIN_IES_SMT_SPEC(208, 209, 0xb70, 3),
-+	MTK_PIN_IES_SMT_SPEC(210, 210, 0xb70, 4),
-+	MTK_PIN_IES_SMT_SPEC(211, 235, 0xb70, 5),
-+	MTK_PIN_IES_SMT_SPEC(236, 241, 0xb70, 6),
-+	MTK_PIN_IES_SMT_SPEC(242, 243, 0xb70, 7),
-+	MTK_PIN_IES_SMT_SPEC(244, 247, 0xb70, 8),
-+	MTK_PIN_IES_SMT_SPEC(248, 248, 0xb70, 9),
-+	MTK_PIN_IES_SMT_SPEC(249, 249, 0x140, 3),
-+	MTK_PIN_IES_SMT_SPEC(250, 250, 0x130, 15),
-+	MTK_PIN_IES_SMT_SPEC(251, 251, 0x130, 11),
-+	MTK_PIN_IES_SMT_SPEC(252, 252, 0x130, 7),
-+	MTK_PIN_IES_SMT_SPEC(253, 253, 0x130, 3),
-+	MTK_PIN_IES_SMT_SPEC(254, 254, 0xf40, 15),
-+	MTK_PIN_IES_SMT_SPEC(255, 255, 0xf40, 11),
-+	MTK_PIN_IES_SMT_SPEC(256, 256, 0xf40, 7),
-+	MTK_PIN_IES_SMT_SPEC(257, 257, 0xf40, 3),
-+	MTK_PIN_IES_SMT_SPEC(258, 258, 0xcb0, 11),
-+	MTK_PIN_IES_SMT_SPEC(259, 259, 0xc90, 11),
-+	MTK_PIN_IES_SMT_SPEC(260, 260, 0x3a0, 11),
-+	MTK_PIN_IES_SMT_SPEC(261, 261, 0x0b0, 3),
-+	MTK_PIN_IES_SMT_SPEC(262, 277, 0xb70, 12),
-+	MTK_PIN_IES_SMT_SPEC(278, 278, 0xb70, 13),
-+};
-+
-+static int mt2701_ies_smt_set(struct regmap *regmap, unsigned int pin,
-+		unsigned char align, int value, enum pin_config_param arg)
-+{
-+	if (arg == PIN_CONFIG_INPUT_ENABLE)
-+		return mtk_pconf_spec_set_ies_smt_range(regmap, mt2701_ies_set,
-+			ARRAY_SIZE(mt2701_ies_set), pin, align, value);
-+	else if (arg == PIN_CONFIG_INPUT_SCHMITT_ENABLE)
-+		return mtk_pconf_spec_set_ies_smt_range(regmap, mt2701_smt_set,
-+			ARRAY_SIZE(mt2701_smt_set), pin, align, value);
-+	return -EINVAL;
-+}
-+
-+static const struct mtk_spec_pinmux_set mt2701_spec_pinmux[] = {
-+	MTK_PINMUX_SPEC(22, 0xb10, 3),
-+	MTK_PINMUX_SPEC(23, 0xb10, 4),
-+	MTK_PINMUX_SPEC(24, 0xb10, 5),
-+	MTK_PINMUX_SPEC(29, 0xb10, 9),
-+	MTK_PINMUX_SPEC(208, 0xb10, 7),
-+	MTK_PINMUX_SPEC(209, 0xb10, 8),
-+	MTK_PINMUX_SPEC(203, 0xf20, 0),
-+	MTK_PINMUX_SPEC(204, 0xf20, 1),
-+	MTK_PINMUX_SPEC(249, 0xef0, 0),
-+	MTK_PINMUX_SPEC(250, 0xef0, 0),
-+	MTK_PINMUX_SPEC(251, 0xef0, 0),
-+	MTK_PINMUX_SPEC(252, 0xef0, 0),
-+	MTK_PINMUX_SPEC(253, 0xef0, 0),
-+	MTK_PINMUX_SPEC(254, 0xef0, 0),
-+	MTK_PINMUX_SPEC(255, 0xef0, 0),
-+	MTK_PINMUX_SPEC(256, 0xef0, 0),
-+	MTK_PINMUX_SPEC(257, 0xef0, 0),
-+	MTK_PINMUX_SPEC(258, 0xef0, 0),
-+	MTK_PINMUX_SPEC(259, 0xef0, 0),
-+	MTK_PINMUX_SPEC(260, 0xef0, 0),
-+};
-+
-+static void mt2701_spec_pinmux_set(struct regmap *reg, unsigned int pin,
-+			unsigned int mode)
-+{
-+	unsigned int i, value, mask;
-+	unsigned int info_num = ARRAY_SIZE(mt2701_spec_pinmux);
-+	unsigned int spec_flag;
-+
-+	for (i = 0; i < info_num; i++) {
-+		if (pin == mt2701_spec_pinmux[i].pin)
-+			break;
-+	}
-+
-+	if (i == info_num)
-+		return;
-+
-+	spec_flag = (mode >> 3);
-+	mask = BIT(mt2701_spec_pinmux[i].bit);
-+	if (!spec_flag)
-+		value = mask;
-+	else
-+		value = 0;
-+	regmap_update_bits(reg, mt2701_spec_pinmux[i].offset, mask, value);
-+}
-+
-+static void mt2701_spec_dir_set(unsigned int *reg_addr, unsigned int pin)
-+{
-+	if (pin > 175)
-+		*reg_addr += 0x10;
-+}
-+
-+static const struct mtk_pinctrl_devdata mt2701_pinctrl_data = {
-+	.pins = mtk_pins_mt2701,
-+	.npins = ARRAY_SIZE(mtk_pins_mt2701),
-+	.grp_desc = mt2701_drv_grp,
-+	.n_grp_cls = ARRAY_SIZE(mt2701_drv_grp),
-+	.pin_drv_grp = mt2701_pin_drv,
-+	.n_pin_drv_grps = ARRAY_SIZE(mt2701_pin_drv),
-+	.spec_pull_set = mt2701_spec_pull_set,
-+	.spec_ies_smt_set = mt2701_ies_smt_set,
-+	.spec_pinmux_set = mt2701_spec_pinmux_set,
-+	.spec_dir_set = mt2701_spec_dir_set,
-+	.dir_offset = 0x0000,
-+	.pullen_offset = 0x0150,
-+	.pullsel_offset = 0x0280,
-+	.dout_offset = 0x0500,
-+	.din_offset = 0x0630,
-+	.pinmux_offset = 0x0760,
-+	.type1_start = 280,
-+	.type1_end = 280,
-+	.port_shf = 4,
-+	.port_mask = 0x1f,
-+	.port_align = 4,
-+	.eint_offsets = {
-+		.name = "mt2701_eint",
-+		.stat      = 0x000,
-+		.ack       = 0x040,
-+		.mask      = 0x080,
-+		.mask_set  = 0x0c0,
-+		.mask_clr  = 0x100,
-+		.sens      = 0x140,
-+		.sens_set  = 0x180,
-+		.sens_clr  = 0x1c0,
-+		.soft      = 0x200,
-+		.soft_set  = 0x240,
-+		.soft_clr  = 0x280,
-+		.pol       = 0x300,
-+		.pol_set   = 0x340,
-+		.pol_clr   = 0x380,
-+		.dom_en    = 0x400,
-+		.dbnc_ctrl = 0x500,
-+		.dbnc_set  = 0x600,
-+		.dbnc_clr  = 0x700,
-+		.port_mask = 6,
-+		.ports     = 6,
-+	},
-+	.ap_num = 169,
-+	.db_cnt = 16,
-+};
-+
-+static int mt2701_pinctrl_probe(struct platform_device *pdev)
-+{
-+	return mtk_pctrl_init(pdev, &mt2701_pinctrl_data, NULL);
-+}
-+
-+static const struct of_device_id mt2701_pctrl_match[] = {
-+	{ .compatible = "mediatek,mt2701-pinctrl", },
-+	{}
-+};
-+MODULE_DEVICE_TABLE(of, mt2701_pctrl_match);
-+
-+static struct platform_driver mtk_pinctrl_driver = {
-+	.probe = mt2701_pinctrl_probe,
-+	.driver = {
-+		.name = "mediatek-mt2701-pinctrl",
-+		.owner = THIS_MODULE,
-+		.of_match_table = mt2701_pctrl_match,
-+	},
-+};
-+
-+static int __init mtk_pinctrl_init(void)
-+{
-+	return platform_driver_register(&mtk_pinctrl_driver);
-+}
-+
-+arch_initcall(mtk_pinctrl_init);
---- a/drivers/pinctrl/mediatek/pinctrl-mtk-common.c
-+++ b/drivers/pinctrl/mediatek/pinctrl-mtk-common.c
-@@ -47,6 +47,8 @@
- static const char * const mtk_gpio_functions[] = {
- 	"func0", "func1", "func2", "func3",
- 	"func4", "func5", "func6", "func7",
-+	"func8", "func9", "func10", "func11",
-+	"func12", "func13", "func14", "func15",
- };
- 
- /*
-@@ -81,6 +83,9 @@ static int mtk_pmx_gpio_set_direction(st
- 	reg_addr = mtk_get_port(pctl, offset) + pctl->devdata->dir_offset;
- 	bit = BIT(offset & 0xf);
- 
-+	if (pctl->devdata->spec_dir_set)
-+		pctl->devdata->spec_dir_set(&reg_addr, offset);
-+
- 	if (input)
- 		/* Different SoC has different alignment offset. */
- 		reg_addr = CLR_ADDR(reg_addr, pctl);
-@@ -347,6 +352,7 @@ static int mtk_pconf_parse_conf(struct p
- 		ret = mtk_pconf_set_pull_select(pctl, pin, true, false, arg);
- 		break;
- 	case PIN_CONFIG_INPUT_ENABLE:
-+		mtk_pmx_gpio_set_direction(pctldev, NULL, pin, true);
- 		ret = mtk_pconf_set_ies_smt(pctl, pin, arg, param);
- 		break;
- 	case PIN_CONFIG_OUTPUT:
-@@ -354,6 +360,7 @@ static int mtk_pconf_parse_conf(struct p
- 		ret = mtk_pmx_gpio_set_direction(pctldev, NULL, pin, false);
- 		break;
- 	case PIN_CONFIG_INPUT_SCHMITT_ENABLE:
-+		mtk_pmx_gpio_set_direction(pctldev, NULL, pin, true);
- 		ret = mtk_pconf_set_ies_smt(pctl, pin, arg, param);
- 		break;
- 	case PIN_CONFIG_DRIVE_STRENGTH:
-@@ -667,9 +674,14 @@ static int mtk_pmx_set_mode(struct pinct
- 	unsigned int mask = (1L << GPIO_MODE_BITS) - 1;
- 	struct mtk_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
- 
-+	if (pctl->devdata->spec_pinmux_set)
-+		pctl->devdata->spec_pinmux_set(mtk_get_regmap(pctl, pin),
-+					pin, mode);
-+
- 	reg_addr = ((pin / MAX_GPIO_MODE_PER_REG) << pctl->devdata->port_shf)
- 			+ pctl->devdata->pinmux_offset;
- 
-+	mode &= mask;
- 	bit = pin % MAX_GPIO_MODE_PER_REG;
- 	mask <<= (GPIO_MODE_BITS * bit);
- 	val = (mode << (GPIO_MODE_BITS * bit));
-@@ -746,6 +758,10 @@ static int mtk_gpio_get_direction(struct
- 
- 	reg_addr =  mtk_get_port(pctl, offset) + pctl->devdata->dir_offset;
- 	bit = BIT(offset & 0xf);
-+
-+	if (pctl->devdata->spec_dir_set)
-+		pctl->devdata->spec_dir_set(&reg_addr, offset);
-+
- 	regmap_read(pctl->regmap1, reg_addr, &read_val);
- 	return !(read_val & bit);
- }
---- a/drivers/pinctrl/mediatek/pinctrl-mtk-common.h
-+++ b/drivers/pinctrl/mediatek/pinctrl-mtk-common.h
-@@ -209,7 +209,14 @@ struct mtk_eint_offsets {
-  * means when user set smt, input enable is set at the same time. So they
-  * also need special control. If special control is success, this should
-  * return 0, otherwise return non-zero value.
-- *
-+ * @spec_pinmux_set: In some cases, there are two pinmux functions share
-+ * the same value in the same segment of pinmux control register. If user
-+ * want to use one of the two functions, they need an extra bit setting to
-+ * select the right one.
-+ * @spec_dir_set: In very few SoCs, direction control registers are not
-+ * arranged continuously, they may be cut to parts. So they need special
-+ * dir setting.
-+
-  * @dir_offset: The direction register offset.
-  * @pullen_offset: The pull-up/pull-down enable register offset.
-  * @pinmux_offset: The pinmux register offset.
-@@ -234,6 +241,9 @@ struct mtk_pinctrl_devdata {
- 			unsigned char align, bool isup, unsigned int arg);
- 	int (*spec_ies_smt_set)(struct regmap *reg, unsigned int pin,
- 			unsigned char align, int value, enum pin_config_param arg);
-+	void (*spec_pinmux_set)(struct regmap *reg, unsigned int pin,
-+			unsigned int mode);
-+	void (*spec_dir_set)(unsigned int *reg_addr, unsigned int pin);
- 	unsigned int dir_offset;
- 	unsigned int ies_offset;
- 	unsigned int smt_offset;
---- /dev/null
-+++ b/drivers/pinctrl/mediatek/pinctrl-mtk-mt2701.h
-@@ -0,0 +1,2323 @@
-+/*
-+ * Copyright (c) 2015 MediaTek Inc.
-+ * Author: Biao Huang <biao.huang at mediatek.com>
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 as
-+ * published by the Free Software Foundation.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ */
-+
-+#ifndef __PINCTRL_MTK_MT2701_H
-+#define __PINCTRL_MTK_MT2701_H
-+
-+#include <linux/pinctrl/pinctrl.h>
-+#include "pinctrl-mtk-common.h"
-+
-+static const struct mtk_desc_pin mtk_pins_mt2701[] = {
-+	MTK_PIN(
-+		PINCTRL_PIN(0, "PWRAP_SPI0_MI"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 148),
-+		MTK_FUNCTION(0, "GPIO0"),
-+		MTK_FUNCTION(1, "PWRAP_SPIDO"),
-+		MTK_FUNCTION(2, "PWRAP_SPIDI")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(1, "PWRAP_SPI0_MO"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 149),
-+		MTK_FUNCTION(0, "GPIO1"),
-+		MTK_FUNCTION(1, "PWRAP_SPIDI"),
-+		MTK_FUNCTION(2, "PWRAP_SPIDO")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(2, "PWRAP_INT"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 150),
-+		MTK_FUNCTION(0, "GPIO2"),
-+		MTK_FUNCTION(1, "PWRAP_INT")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(3, "PWRAP_SPI0_CK"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 151),
-+		MTK_FUNCTION(0, "GPIO3"),
-+		MTK_FUNCTION(1, "PWRAP_SPICK_I")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(4, "PWRAP_SPI0_CSN"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 152),
-+		MTK_FUNCTION(0, "GPIO4"),
-+		MTK_FUNCTION(1, "PWRAP_SPICS_B_I")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(5, "PWRAP_SPI0_CK2"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 153),
-+		MTK_FUNCTION(0, "GPIO5"),
-+		MTK_FUNCTION(1, "PWRAP_SPICK2_I"),
-+		MTK_FUNCTION(5, "ANT_SEL1")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(6, "PWRAP_SPI0_CSN2"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 154),
-+		MTK_FUNCTION(0, "GPIO6"),
-+		MTK_FUNCTION(1, "PWRAP_SPICS2_B_I"),
-+		MTK_FUNCTION(5, "ANT_SEL0"),
-+		MTK_FUNCTION(7, "DBG_MON_A[0]")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(7, "SPI1_CSN"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 155),
-+		MTK_FUNCTION(0, "GPIO7"),
-+		MTK_FUNCTION(1, "SPI1_CS"),
-+		MTK_FUNCTION(4, "KCOL0"),
-+		MTK_FUNCTION(7, "DBG_MON_B[12]")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(8, "SPI1_MI"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 156),
-+		MTK_FUNCTION(0, "GPIO8"),
-+		MTK_FUNCTION(1, "SPI1_MI"),
-+		MTK_FUNCTION(2, "SPI1_MO"),
-+		MTK_FUNCTION(4, "KCOL1"),
-+		MTK_FUNCTION(7, "DBG_MON_B[13]")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(9, "SPI1_MO"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 157),
-+		MTK_FUNCTION(0, "GPIO9"),
-+		MTK_FUNCTION(1, "SPI1_MO"),
-+		MTK_FUNCTION(2, "SPI1_MI"),
-+		MTK_FUNCTION(3, "EXT_FRAME_SYNC"),
-+		MTK_FUNCTION(4, "KCOL2"),
-+		MTK_FUNCTION(7, "DBG_MON_B[14]")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(10, "RTC32K_CK"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 158),
-+		MTK_FUNCTION(0, "GPIO10"),
-+		MTK_FUNCTION(1, "RTC32K_CK")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(11, "WATCHDOG"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 159),
-+		MTK_FUNCTION(0, "GPIO11"),
-+		MTK_FUNCTION(1, "WATCHDOG")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(12, "SRCLKENA"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 160),
-+		MTK_FUNCTION(0, "GPIO12"),
-+		MTK_FUNCTION(1, "SRCLKENA")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(13, "SRCLKENAI"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 161),
-+		MTK_FUNCTION(0, "GPIO13"),
-+		MTK_FUNCTION(1, "SRCLKENAI")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(14, "URXD2"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 162),
-+		MTK_FUNCTION(0, "GPIO14"),
-+		MTK_FUNCTION(1, "URXD2"),
-+		MTK_FUNCTION(2, "UTXD2"),
-+		MTK_FUNCTION(5, "SRCCLKENAI2"),
-+		MTK_FUNCTION(7, "DBG_MON_B[30]")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(15, "UTXD2"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 163),
-+		MTK_FUNCTION(0, "GPIO15"),
-+		MTK_FUNCTION(1, "UTXD2"),
-+		MTK_FUNCTION(2, "URXD2"),
-+		MTK_FUNCTION(7, "DBG_MON_B[31]")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(16, "I2S5_DATA_IN"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 164),
-+		MTK_FUNCTION(0, "GPIO16"),
-+		MTK_FUNCTION(1, "I2S5_DATA_IN"),
-+		MTK_FUNCTION(3, "PCM_RX"),
-+		MTK_FUNCTION(4, "ANT_SEL4")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(17, "I2S5_BCK"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 165),
-+		MTK_FUNCTION(0, "GPIO17"),
-+		MTK_FUNCTION(1, "I2S5_BCK"),
-+		MTK_FUNCTION(3, "PCM_CLK0"),
-+		MTK_FUNCTION(4, "ANT_SEL2")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(18, "PCM_CLK"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 166),
-+		MTK_FUNCTION(0, "GPIO18"),
-+		MTK_FUNCTION(1, "PCM_CLK0"),
-+		MTK_FUNCTION(2, "MRG_CLK"),
-+		MTK_FUNCTION(4, "MM_TEST_CK"),
-+		MTK_FUNCTION(5, "CONN_DSP_JCK"),
-+		MTK_FUNCTION(6, "WCN_PCM_CLKO"),
-+		MTK_FUNCTION(7, "DBG_MON_A[3]")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(19, "PCM_SYNC"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 167),
-+		MTK_FUNCTION(0, "GPIO19"),
-+		MTK_FUNCTION(1, "PCM_SYNC"),
-+		MTK_FUNCTION(2, "MRG_SYNC"),
-+		MTK_FUNCTION(5, "CONN_DSP_JINTP"),
-+		MTK_FUNCTION(6, "WCN_PCM_SYNC"),
-+		MTK_FUNCTION(7, "DBG_MON_A[5]")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(20, "PCM_RX"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO20"),
-+		MTK_FUNCTION(1, "PCM_RX"),
-+		MTK_FUNCTION(2, "MRG_RX"),
-+		MTK_FUNCTION(3, "MRG_TX"),
-+		MTK_FUNCTION(4, "PCM_TX"),
-+		MTK_FUNCTION(5, "CONN_DSP_JDI"),
-+		MTK_FUNCTION(6, "WCN_PCM_RX"),
-+		MTK_FUNCTION(7, "DBG_MON_A[4]")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(21, "PCM_TX"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO21"),
-+		MTK_FUNCTION(1, "PCM_TX"),
-+		MTK_FUNCTION(2, "MRG_TX"),
-+		MTK_FUNCTION(3, "MRG_RX"),
-+		MTK_FUNCTION(4, "PCM_RX"),
-+		MTK_FUNCTION(5, "CONN_DSP_JMS"),
-+		MTK_FUNCTION(6, "WCN_PCM_TX"),
-+		MTK_FUNCTION(7, "DBG_MON_A[2]")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(22, "EINT0"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 0),
-+		MTK_FUNCTION(0, "GPIO22"),
-+		MTK_FUNCTION(1, "UCTS0"),
-+		MTK_FUNCTION(3, "KCOL3"),
-+		MTK_FUNCTION(4, "CONN_DSP_JDO"),
-+		MTK_FUNCTION(5, "EXT_FRAME_SYNC"),
-+		MTK_FUNCTION(7, "DBG_MON_A[30]"),
-+		MTK_FUNCTION(10, "PCIE0_PERST_N")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(23, "EINT1"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 1),
-+		MTK_FUNCTION(0, "GPIO23"),
-+		MTK_FUNCTION(1, "URTS0"),
-+		MTK_FUNCTION(3, "KCOL2"),
-+		MTK_FUNCTION(4, "CONN_MCU_TDO"),
-+		MTK_FUNCTION(5, "EXT_FRAME_SYNC"),
-+		MTK_FUNCTION(7, "DBG_MON_A[29]"),
-+		MTK_FUNCTION(10, "PCIE1_PERST_N")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(24, "EINT2"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 2),
-+		MTK_FUNCTION(0, "GPIO24"),
-+		MTK_FUNCTION(1, "UCTS1"),
-+		MTK_FUNCTION(3, "KCOL1"),
-+		MTK_FUNCTION(4, "CONN_MCU_DBGACK_N"),
-+		MTK_FUNCTION(7, "DBG_MON_A[28]"),
-+		MTK_FUNCTION(10, "PCIE2_PERST_N")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(25, "EINT3"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 3),
-+		MTK_FUNCTION(0, "GPIO25"),
-+		MTK_FUNCTION(1, "URTS1"),
-+		MTK_FUNCTION(3, "KCOL0"),
-+		MTK_FUNCTION(4, "CONN_MCU_DBGI_N"),
-+		MTK_FUNCTION(7, "DBG_MON_A[27]")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(26, "EINT4"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 4),
-+		MTK_FUNCTION(0, "GPIO26"),
-+		MTK_FUNCTION(1, "UCTS3"),
-+		MTK_FUNCTION(2, "DRV_VBUS_P1"),
-+		MTK_FUNCTION(3, "KROW3"),
-+		MTK_FUNCTION(4, "CONN_MCU_TCK0"),
-+		MTK_FUNCTION(5, "CONN_MCU_AICE_JCKC"),
-+		MTK_FUNCTION(6, "PCIE2_WAKE_N"),
-+		MTK_FUNCTION(7, "DBG_MON_A[26]")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(27, "EINT5"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 5),
-+		MTK_FUNCTION(0, "GPIO27"),
-+		MTK_FUNCTION(1, "URTS3"),
-+		MTK_FUNCTION(2, "IDDIG_P1"),
-+		MTK_FUNCTION(3, "KROW2"),
-+		MTK_FUNCTION(4, "CONN_MCU_TDI"),
-+		MTK_FUNCTION(6, "PCIE1_WAKE_N"),
-+		MTK_FUNCTION(7, "DBG_MON_A[25]")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(28, "EINT6"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 6),
-+		MTK_FUNCTION(0, "GPIO28"),
-+		MTK_FUNCTION(1, "DRV_VBUS"),
-+		MTK_FUNCTION(3, "KROW1"),
-+		MTK_FUNCTION(4, "CONN_MCU_TRST_B"),
-+		MTK_FUNCTION(6, "PCIE0_WAKE_N"),
-+		MTK_FUNCTION(7, "DBG_MON_A[24]")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(29, "EINT7"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 7),
-+		MTK_FUNCTION(0, "GPIO29"),
-+		MTK_FUNCTION(1, "IDDIG"),
-+		MTK_FUNCTION(2, "MSDC1_WP"),
-+		MTK_FUNCTION(3, "KROW0"),
-+		MTK_FUNCTION(4, "CONN_MCU_TMS"),
-+		MTK_FUNCTION(5, "CONN_MCU_AICE_JMSC"),
-+		MTK_FUNCTION(7, "DBG_MON_A[23]"),
-+		MTK_FUNCTION(14, "PCIE2_PERST_N")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(30, "I2S5_LRCK"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 12),
-+		MTK_FUNCTION(0, "GPIO30"),
-+		MTK_FUNCTION(1, "I2S5_LRCK"),
-+		MTK_FUNCTION(3, "PCM_SYNC"),
-+		MTK_FUNCTION(4, "ANT_SEL1")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(31, "I2S5_MCLK"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 13),
-+		MTK_FUNCTION(0, "GPIO31"),
-+		MTK_FUNCTION(1, "I2S5_MCLK"),
-+		MTK_FUNCTION(4, "ANT_SEL0")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(32, "I2S5_DATA"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 14),
-+		MTK_FUNCTION(0, "GPIO32"),
-+		MTK_FUNCTION(1, "I2S5_DATA"),
-+		MTK_FUNCTION(2, "I2S5_DATA_BYPS"),
-+		MTK_FUNCTION(3, "PCM_TX"),
-+		MTK_FUNCTION(4, "ANT_SEL3")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(33, "I2S1_DATA"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 15),
-+		MTK_FUNCTION(0, "GPIO33"),
-+		MTK_FUNCTION(1, "I2S1_DATA"),
-+		MTK_FUNCTION(2, "I2S1_DATA_BYPS"),
-+		MTK_FUNCTION(3, "PCM_TX"),
-+		MTK_FUNCTION(4, "IMG_TEST_CK"),
-+		MTK_FUNCTION(5, "G1_RXD0"),
-+		MTK_FUNCTION(6, "WCN_PCM_TX"),
-+		MTK_FUNCTION(7, "DBG_MON_B[8]")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(34, "I2S1_DATA_IN"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 16),
-+		MTK_FUNCTION(0, "GPIO34"),
-+		MTK_FUNCTION(1, "I2S1_DATA_IN"),
-+		MTK_FUNCTION(3, "PCM_RX"),
-+		MTK_FUNCTION(4, "VDEC_TEST_CK"),
-+		MTK_FUNCTION(5, "G1_RXD1"),
-+		MTK_FUNCTION(6, "WCN_PCM_RX"),
-+		MTK_FUNCTION(7, "DBG_MON_B[7]")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(35, "I2S1_BCK"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 17),
-+		MTK_FUNCTION(0, "GPIO35"),
-+		MTK_FUNCTION(1, "I2S1_BCK"),
-+		MTK_FUNCTION(3, "PCM_CLK0"),
-+		MTK_FUNCTION(5, "G1_RXD2"),
-+		MTK_FUNCTION(6, "WCN_PCM_CLKO"),
-+		MTK_FUNCTION(7, "DBG_MON_B[9]")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(36, "I2S1_LRCK"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 18),
-+		MTK_FUNCTION(0, "GPIO36"),
-+		MTK_FUNCTION(1, "I2S1_LRCK"),
-+		MTK_FUNCTION(3, "PCM_SYNC"),
-+		MTK_FUNCTION(5, "G1_RXD3"),
-+		MTK_FUNCTION(6, "WCN_PCM_SYNC"),
-+		MTK_FUNCTION(7, "DBG_MON_B[10]")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(37, "I2S1_MCLK"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 19),
-+		MTK_FUNCTION(0, "GPIO37"),
-+		MTK_FUNCTION(1, "I2S1_MCLK"),
-+		MTK_FUNCTION(5, "G1_RXDV"),
-+		MTK_FUNCTION(7, "DBG_MON_B[11]")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(38, "I2S2_DATA"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 20),
-+		MTK_FUNCTION(0, "GPIO38"),
-+		MTK_FUNCTION(2, "I2S2_DATA_BYPS"),
-+		MTK_FUNCTION(3, "PCM_TX"),
-+		MTK_FUNCTION(4, "DMIC_DAT0")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(39, "JTMS"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 21),
-+		MTK_FUNCTION(0, "GPIO39"),
-+		MTK_FUNCTION(1, "JTMS"),
-+		MTK_FUNCTION(2, "CONN_MCU_TMS"),
-+		MTK_FUNCTION(3, "CONN_MCU_AICE_JMSC"),
-+		MTK_FUNCTION(4, "DFD_TMS_XI")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(40, "JTCK"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 22),
-+		MTK_FUNCTION(0, "GPIO40"),
-+		MTK_FUNCTION(1, "JTCK"),
-+		MTK_FUNCTION(2, "CONN_MCU_TCK1"),
-+		MTK_FUNCTION(3, "CONN_MCU_AICE_JCKC"),
-+		MTK_FUNCTION(4, "DFD_TCK_XI")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(41, "JTDI"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 23),
-+		MTK_FUNCTION(0, "GPIO41"),
-+		MTK_FUNCTION(1, "JTDI"),
-+		MTK_FUNCTION(2, "CONN_MCU_TDI"),
-+		MTK_FUNCTION(4, "DFD_TDI_XI")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(42, "JTDO"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 24),
-+		MTK_FUNCTION(0, "GPIO42"),
-+		MTK_FUNCTION(1, "JTDO"),
-+		MTK_FUNCTION(2, "CONN_MCU_TDO"),
-+		MTK_FUNCTION(4, "DFD_TDO")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(43, "NCLE"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 25),
-+		MTK_FUNCTION(0, "GPIO43"),
-+		MTK_FUNCTION(1, "NCLE"),
-+		MTK_FUNCTION(2, "EXT_XCS2")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(44, "NCEB1"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 26),
-+		MTK_FUNCTION(0, "GPIO44"),
-+		MTK_FUNCTION(1, "NCEB1"),
-+		MTK_FUNCTION(2, "IDDIG")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(45, "NCEB0"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 27),
-+		MTK_FUNCTION(0, "GPIO45"),
-+		MTK_FUNCTION(1, "NCEB0"),
-+		MTK_FUNCTION(2, "DRV_VBUS")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(46, "IR"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 28),
-+		MTK_FUNCTION(0, "GPIO46"),
-+		MTK_FUNCTION(1, "IR")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(47, "NREB"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 29),
-+		MTK_FUNCTION(0, "GPIO47"),
-+		MTK_FUNCTION(1, "NREB"),
-+		MTK_FUNCTION(2, "IDDIG_P1")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(48, "NRNB"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 30),
-+		MTK_FUNCTION(0, "GPIO48"),
-+		MTK_FUNCTION(1, "NRNB"),
-+		MTK_FUNCTION(2, "DRV_VBUS_P1")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(49, "I2S0_DATA"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 31),
-+		MTK_FUNCTION(0, "GPIO49"),
-+		MTK_FUNCTION(1, "I2S0_DATA"),
-+		MTK_FUNCTION(2, "I2S0_DATA_BYPS"),
-+		MTK_FUNCTION(3, "PCM_TX"),
-+		MTK_FUNCTION(6, "WCN_I2S_DO"),
-+		MTK_FUNCTION(7, "DBG_MON_B[3]")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(50, "I2S2_BCK"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 32),
-+		MTK_FUNCTION(0, "GPIO50"),
-+		MTK_FUNCTION(1, "I2S2_BCK"),
-+		MTK_FUNCTION(3, "PCM_CLK0"),
-+		MTK_FUNCTION(4, "DMIC_SCK1")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(51, "I2S2_DATA_IN"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 33),
-+		MTK_FUNCTION(0, "GPIO51"),
-+		MTK_FUNCTION(1, "I2S2_DATA_IN"),
-+		MTK_FUNCTION(3, "PCM_RX"),
-+		MTK_FUNCTION(4, "DMIC_SCK0")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(52, "I2S2_LRCK"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 34),
-+		MTK_FUNCTION(0, "GPIO52"),
-+		MTK_FUNCTION(1, "I2S2_LRCK"),
-+		MTK_FUNCTION(3, "PCM_SYNC"),
-+		MTK_FUNCTION(4, "DMIC_DAT1")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(53, "SPI0_CSN"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 35),
-+		MTK_FUNCTION(0, "GPIO53"),
-+		MTK_FUNCTION(1, "SPI0_CS"),
-+		MTK_FUNCTION(3, "SPDIF"),
-+		MTK_FUNCTION(4, "ADC_CK"),
-+		MTK_FUNCTION(5, "PWM1"),
-+		MTK_FUNCTION(7, "DBG_MON_A[7]")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(54, "SPI0_CK"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 36),
-+		MTK_FUNCTION(0, "GPIO54"),
-+		MTK_FUNCTION(1, "SPI0_CK"),
-+		MTK_FUNCTION(3, "SPDIF_IN1"),
-+		MTK_FUNCTION(4, "ADC_DAT_IN"),
-+		MTK_FUNCTION(7, "DBG_MON_A[10]")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(55, "SPI0_MI"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 37),
-+		MTK_FUNCTION(0, "GPIO55"),
-+		MTK_FUNCTION(1, "SPI0_MI"),
-+		MTK_FUNCTION(2, "SPI0_MO"),
-+		MTK_FUNCTION(3, "MSDC1_WP"),
-+		MTK_FUNCTION(4, "ADC_WS"),
-+		MTK_FUNCTION(5, "PWM2"),
-+		MTK_FUNCTION(7, "DBG_MON_A[8]")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(56, "SPI0_MO"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 38),
-+		MTK_FUNCTION(0, "GPIO56"),
-+		MTK_FUNCTION(1, "SPI0_MO"),
-+		MTK_FUNCTION(2, "SPI0_MI"),
-+		MTK_FUNCTION(3, "SPDIF_IN0"),
-+		MTK_FUNCTION(7, "DBG_MON_A[9]")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(57, "SDA1"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 39),
-+		MTK_FUNCTION(0, "GPIO57"),
-+		MTK_FUNCTION(1, "SDA1")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(58, "SCL1"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 40),
-+		MTK_FUNCTION(0, "GPIO58"),
-+		MTK_FUNCTION(1, "SCL1")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(59, "RAMBUF_I_CLK"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO59"),
-+		MTK_FUNCTION(1, "RAMBUF_I_CLK")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(60, "WB_RSTB"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 41),
-+		MTK_FUNCTION(0, "GPIO60"),
-+		MTK_FUNCTION(1, "WB_RSTB"),
-+		MTK_FUNCTION(7, "DBG_MON_A[11]")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(61, "F2W_DATA"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 42),
-+		MTK_FUNCTION(0, "GPIO61"),
-+		MTK_FUNCTION(1, "F2W_DATA"),
-+		MTK_FUNCTION(7, "DBG_MON_A[16]")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(62, "F2W_CLK"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 43),
-+		MTK_FUNCTION(0, "GPIO62"),
-+		MTK_FUNCTION(1, "F2W_CK"),
-+		MTK_FUNCTION(7, "DBG_MON_A[15]")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(63, "WB_SCLK"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 44),
-+		MTK_FUNCTION(0, "GPIO63"),
-+		MTK_FUNCTION(1, "WB_SCLK"),
-+		MTK_FUNCTION(7, "DBG_MON_A[13]")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(64, "WB_SDATA"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 45),
-+		MTK_FUNCTION(0, "GPIO64"),
-+		MTK_FUNCTION(1, "WB_SDATA"),
-+		MTK_FUNCTION(7, "DBG_MON_A[12]")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(65, "WB_SEN"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 46),
-+		MTK_FUNCTION(0, "GPIO65"),
-+		MTK_FUNCTION(1, "WB_SEN"),
-+		MTK_FUNCTION(7, "DBG_MON_A[14]")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(66, "WB_CRTL0"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 47),
-+		MTK_FUNCTION(0, "GPIO66"),
-+		MTK_FUNCTION(1, "WB_CRTL0"),
-+		MTK_FUNCTION(5, "DFD_NTRST_XI"),
-+		MTK_FUNCTION(7, "DBG_MON_A[17]")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(67, "WB_CRTL1"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 48),
-+		MTK_FUNCTION(0, "GPIO67"),
-+		MTK_FUNCTION(1, "WB_CRTL1"),
-+		MTK_FUNCTION(5, "DFD_TMS_XI"),
-+		MTK_FUNCTION(7, "DBG_MON_A[18]")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(68, "WB_CRTL2"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 49),
-+		MTK_FUNCTION(0, "GPIO68"),
-+		MTK_FUNCTION(1, "WB_CRTL2"),
-+		MTK_FUNCTION(5, "DFD_TCK_XI"),
-+		MTK_FUNCTION(7, "DBG_MON_A[19]")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(69, "WB_CRTL3"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 50),
-+		MTK_FUNCTION(0, "GPIO69"),
-+		MTK_FUNCTION(1, "WB_CRTL3"),
-+		MTK_FUNCTION(5, "DFD_TDI_XI"),
-+		MTK_FUNCTION(7, "DBG_MON_A[20]")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(70, "WB_CRTL4"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 51),
-+		MTK_FUNCTION(0, "GPIO70"),
-+		MTK_FUNCTION(1, "WB_CRTL4"),
-+		MTK_FUNCTION(5, "DFD_TDO"),
-+		MTK_FUNCTION(7, "DBG_MON_A[21]")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(71, "WB_CRTL5"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 52),
-+		MTK_FUNCTION(0, "GPIO71"),
-+		MTK_FUNCTION(1, "WB_CRTL5"),
-+		MTK_FUNCTION(7, "DBG_MON_A[22]")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(72, "I2S0_DATA_IN"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 53),
-+		MTK_FUNCTION(0, "GPIO72"),
-+		MTK_FUNCTION(1, "I2S0_DATA_IN"),
-+		MTK_FUNCTION(3, "PCM_RX"),
-+		MTK_FUNCTION(4, "PWM0"),
-+		MTK_FUNCTION(5, "DISP_PWM"),
-+		MTK_FUNCTION(6, "WCN_I2S_DI"),
-+		MTK_FUNCTION(7, "DBG_MON_B[2]")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(73, "I2S0_LRCK"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 54),
-+		MTK_FUNCTION(0, "GPIO73"),
-+		MTK_FUNCTION(1, "I2S0_LRCK"),
-+		MTK_FUNCTION(3, "PCM_SYNC"),
-+		MTK_FUNCTION(6, "WCN_I2S_LRCK"),
-+		MTK_FUNCTION(7, "DBG_MON_B[5]")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(74, "I2S0_BCK"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 55),
-+		MTK_FUNCTION(0, "GPIO74"),
-+		MTK_FUNCTION(1, "I2S0_BCK"),
-+		MTK_FUNCTION(3, "PCM_CLK0"),
-+		MTK_FUNCTION(6, "WCN_I2S_BCK"),
-+		MTK_FUNCTION(7, "DBG_MON_B[4]")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(75, "SDA0"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 56),
-+		MTK_FUNCTION(0, "GPIO75"),
-+		MTK_FUNCTION(1, "SDA0")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(76, "SCL0"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 57),
-+		MTK_FUNCTION(0, "GPIO76"),
-+		MTK_FUNCTION(1, "SCL0")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(77, "SDA2"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 58),
-+		MTK_FUNCTION(0, "GPIO77"),
-+		MTK_FUNCTION(1, "SDA2")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(78, "SCL2"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 59),
-+		MTK_FUNCTION(0, "GPIO78"),
-+		MTK_FUNCTION(1, "SCL2")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(79, "URXD0"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 60),
-+		MTK_FUNCTION(0, "GPIO79"),
-+		MTK_FUNCTION(1, "URXD0"),
-+		MTK_FUNCTION(2, "UTXD0")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(80, "UTXD0"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 61),
-+		MTK_FUNCTION(0, "GPIO80"),
-+		MTK_FUNCTION(1, "UTXD0"),
-+		MTK_FUNCTION(2, "URXD0")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(81, "URXD1"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 62),
-+		MTK_FUNCTION(0, "GPIO81"),
-+		MTK_FUNCTION(1, "URXD1"),
-+		MTK_FUNCTION(2, "UTXD1")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(82, "UTXD1"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 63),
-+		MTK_FUNCTION(0, "GPIO82"),
-+		MTK_FUNCTION(1, "UTXD1"),
-+		MTK_FUNCTION(2, "URXD1")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(83, "LCM_RST"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 64),
-+		MTK_FUNCTION(0, "GPIO83"),
-+		MTK_FUNCTION(1, "LCM_RST"),
-+		MTK_FUNCTION(2, "VDAC_CK_XI"),
-+		MTK_FUNCTION(7, "DBG_MON_B[1]")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(84, "DSI_TE"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 65),
-+		MTK_FUNCTION(0, "GPIO84"),
-+		MTK_FUNCTION(1, "DSI_TE"),
-+		MTK_FUNCTION(7, "DBG_MON_B[0]")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(85, "MSDC2_CMD"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 66),
-+		MTK_FUNCTION(0, "GPIO85"),
-+		MTK_FUNCTION(1, "MSDC2_CMD"),
-+		MTK_FUNCTION(2, "ANT_SEL0"),
-+		MTK_FUNCTION(3, "SDA1"),
-+		MTK_FUNCTION(6, "I2SOUT_BCK")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(86, "MSDC2_CLK"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 67),
-+		MTK_FUNCTION(0, "GPIO86"),
-+		MTK_FUNCTION(1, "MSDC2_CLK"),
-+		MTK_FUNCTION(2, "ANT_SEL1"),
-+		MTK_FUNCTION(3, "SCL1"),
-+		MTK_FUNCTION(6, "I2SOUT_LRCK")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(87, "MSDC2_DAT0"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 68),
-+		MTK_FUNCTION(0, "GPIO87"),
-+		MTK_FUNCTION(1, "MSDC2_DAT0"),
-+		MTK_FUNCTION(2, "ANT_SEL2"),
-+		MTK_FUNCTION(5, "UTXD0"),
-+		MTK_FUNCTION(6, "I2SOUT_DATA_OUT")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(88, "MSDC2_DAT1"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 71),
-+		MTK_FUNCTION(0, "GPIO88"),
-+		MTK_FUNCTION(1, "MSDC2_DAT1"),
-+		MTK_FUNCTION(2, "ANT_SEL3"),
-+		MTK_FUNCTION(3, "PWM0"),
-+		MTK_FUNCTION(5, "URXD0"),
-+		MTK_FUNCTION(6, "PWM1")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(89, "MSDC2_DAT2"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 72),
-+		MTK_FUNCTION(0, "GPIO89"),
-+		MTK_FUNCTION(1, "MSDC2_DAT2"),
-+		MTK_FUNCTION(2, "ANT_SEL4"),
-+		MTK_FUNCTION(3, "SDA2"),
-+		MTK_FUNCTION(5, "UTXD1"),
-+		MTK_FUNCTION(6, "PWM2")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(90, "MSDC2_DAT3"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 73),
-+		MTK_FUNCTION(0, "GPIO90"),
-+		MTK_FUNCTION(1, "MSDC2_DAT3"),
-+		MTK_FUNCTION(2, "ANT_SEL5"),
-+		MTK_FUNCTION(3, "SCL2"),
-+		MTK_FUNCTION(4, "EXT_FRAME_SYNC"),
-+		MTK_FUNCTION(5, "URXD1"),
-+		MTK_FUNCTION(6, "PWM3")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(91, "TDN3"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPI91"),
-+		MTK_FUNCTION(1, "TDN3")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(92, "TDP3"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPI92"),
-+		MTK_FUNCTION(1, "TDP3")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(93, "TDN2"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPI93"),
-+		MTK_FUNCTION(1, "TDN2")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(94, "TDP2"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPI94"),
-+		MTK_FUNCTION(1, "TDP2")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(95, "TCN"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPI95"),
-+		MTK_FUNCTION(1, "TCN")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(96, "TCP"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPI96"),
-+		MTK_FUNCTION(1, "TCP")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(97, "TDN1"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPI97"),
-+		MTK_FUNCTION(1, "TDN1")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(98, "TDP1"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPI98"),
-+		MTK_FUNCTION(1, "TDP1")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(99, "TDN0"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPI99"),
-+		MTK_FUNCTION(1, "TDN0")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(100, "TDP0"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPI100"),
-+		MTK_FUNCTION(1, "TDP0")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(101, "SPI2_CSN"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 74),
-+		MTK_FUNCTION(0, "GPIO101"),
-+		MTK_FUNCTION(1, "SPI2_CS"),
-+		MTK_FUNCTION(3, "SCL3"),
-+		MTK_FUNCTION(4, "KROW0")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(102, "SPI2_MI"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 75),
-+		MTK_FUNCTION(0, "GPIO102"),
-+		MTK_FUNCTION(1, "SPI2_MI"),
-+		MTK_FUNCTION(2, "SPI2_MO"),
-+		MTK_FUNCTION(3, "SDA3"),
-+		MTK_FUNCTION(4, "KROW1")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(103, "SPI2_MO"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 76),
-+		MTK_FUNCTION(0, "GPIO103"),
-+		MTK_FUNCTION(1, "SPI2_MO"),
-+		MTK_FUNCTION(2, "SPI2_MI"),
-+		MTK_FUNCTION(3, "SCL3"),
-+		MTK_FUNCTION(4, "KROW2")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(104, "SPI2_CLK"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 77),
-+		MTK_FUNCTION(0, "GPIO104"),
-+		MTK_FUNCTION(1, "SPI2_CK"),
-+		MTK_FUNCTION(3, "SDA3"),
-+		MTK_FUNCTION(4, "KROW3")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(105, "MSDC1_CMD"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 78),
-+		MTK_FUNCTION(0, "GPIO105"),
-+		MTK_FUNCTION(1, "MSDC1_CMD"),
-+		MTK_FUNCTION(2, "ANT_SEL0"),
-+		MTK_FUNCTION(3, "SDA1"),
-+		MTK_FUNCTION(6, "I2SOUT_BCK"),
-+		MTK_FUNCTION(7, "DBG_MON_B[27]")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(106, "MSDC1_CLK"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 79),
-+		MTK_FUNCTION(0, "GPIO106"),
-+		MTK_FUNCTION(1, "MSDC1_CLK"),
-+		MTK_FUNCTION(2, "ANT_SEL1"),
-+		MTK_FUNCTION(3, "SCL1"),
-+		MTK_FUNCTION(6, "I2SOUT_LRCK"),
-+		MTK_FUNCTION(7, "DBG_MON_B[28]")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(107, "MSDC1_DAT0"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 80),
-+		MTK_FUNCTION(0, "GPIO107"),
-+		MTK_FUNCTION(1, "MSDC1_DAT0"),
-+		MTK_FUNCTION(2, "ANT_SEL2"),
-+		MTK_FUNCTION(5, "UTXD0"),
-+		MTK_FUNCTION(6, "I2SOUT_DATA_OUT"),
-+		MTK_FUNCTION(7, "DBG_MON_B[26]")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(108, "MSDC1_DAT1"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 81),
-+		MTK_FUNCTION(0, "GPIO108"),
-+		MTK_FUNCTION(1, "MSDC1_DAT1"),
-+		MTK_FUNCTION(2, "ANT_SEL3"),
-+		MTK_FUNCTION(3, "PWM0"),
-+		MTK_FUNCTION(5, "URXD0"),
-+		MTK_FUNCTION(6, "PWM1"),
-+		MTK_FUNCTION(7, "DBG_MON_B[25]")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(109, "MSDC1_DAT2"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 82),
-+		MTK_FUNCTION(0, "GPIO109"),
-+		MTK_FUNCTION(1, "MSDC1_DAT2"),
-+		MTK_FUNCTION(2, "ANT_SEL4"),
-+		MTK_FUNCTION(3, "SDA2"),
-+		MTK_FUNCTION(5, "UTXD1"),
-+		MTK_FUNCTION(6, "PWM2"),
-+		MTK_FUNCTION(7, "DBG_MON_B[24]")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(110, "MSDC1_DAT3"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 83),
-+		MTK_FUNCTION(0, "GPIO110"),
-+		MTK_FUNCTION(1, "MSDC1_DAT3"),
-+		MTK_FUNCTION(2, "ANT_SEL5"),
-+		MTK_FUNCTION(3, "SCL2"),
-+		MTK_FUNCTION(4, "EXT_FRAME_SYNC"),
-+		MTK_FUNCTION(5, "URXD1"),
-+		MTK_FUNCTION(6, "PWM3"),
-+		MTK_FUNCTION(7, "DBG_MON_B[23]")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(111, "MSDC0_DAT7"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 84),
-+		MTK_FUNCTION(0, "GPIO111"),
-+		MTK_FUNCTION(1, "MSDC0_DAT7"),
-+		MTK_FUNCTION(4, "NLD7")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(112, "MSDC0_DAT6"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 85),
-+		MTK_FUNCTION(0, "GPIO112"),
-+		MTK_FUNCTION(1, "MSDC0_DAT6"),
-+		MTK_FUNCTION(4, "NLD6")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(113, "MSDC0_DAT5"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 86),
-+		MTK_FUNCTION(0, "GPIO113"),
-+		MTK_FUNCTION(1, "MSDC0_DAT5"),
-+		MTK_FUNCTION(4, "NLD5")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(114, "MSDC0_DAT4"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 87),
-+		MTK_FUNCTION(0, "GPIO114"),
-+		MTK_FUNCTION(1, "MSDC0_DAT4"),
-+		MTK_FUNCTION(4, "NLD4")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(115, "MSDC0_RSTB"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 88),
-+		MTK_FUNCTION(0, "GPIO115"),
-+		MTK_FUNCTION(1, "MSDC0_RSTB"),
-+		MTK_FUNCTION(4, "NLD8")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(116, "MSDC0_CMD"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 89),
-+		MTK_FUNCTION(0, "GPIO116"),
-+		MTK_FUNCTION(1, "MSDC0_CMD"),
-+		MTK_FUNCTION(4, "NALE")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(117, "MSDC0_CLK"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 90),
-+		MTK_FUNCTION(0, "GPIO117"),
-+		MTK_FUNCTION(1, "MSDC0_CLK"),
-+		MTK_FUNCTION(4, "NWEB")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(118, "MSDC0_DAT3"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 91),
-+		MTK_FUNCTION(0, "GPIO118"),
-+		MTK_FUNCTION(1, "MSDC0_DAT3"),
-+		MTK_FUNCTION(4, "NLD3")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(119, "MSDC0_DAT2"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 92),
-+		MTK_FUNCTION(0, "GPIO119"),
-+		MTK_FUNCTION(1, "MSDC0_DAT2"),
-+		MTK_FUNCTION(4, "NLD2")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(120, "MSDC0_DAT1"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 93),
-+		MTK_FUNCTION(0, "GPIO120"),
-+		MTK_FUNCTION(1, "MSDC0_DAT1"),
-+		MTK_FUNCTION(4, "NLD1")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(121, "MSDC0_DAT0"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 94),
-+		MTK_FUNCTION(0, "GPIO121"),
-+		MTK_FUNCTION(1, "MSDC0_DAT0"),
-+		MTK_FUNCTION(4, "NLD0"),
-+		MTK_FUNCTION(5, "WATCHDOG")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(122, "CEC"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 95),
-+		MTK_FUNCTION(0, "GPIO122"),
-+		MTK_FUNCTION(1, "CEC"),
-+		MTK_FUNCTION(4, "SDA2"),
-+		MTK_FUNCTION(5, "URXD0")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(123, "HTPLG"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 96),
-+		MTK_FUNCTION(0, "GPIO123"),
-+		MTK_FUNCTION(1, "HTPLG"),
-+		MTK_FUNCTION(4, "SCL2"),
-+		MTK_FUNCTION(5, "UTXD0")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(124, "HDMISCK"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 97),
-+		MTK_FUNCTION(0, "GPIO124"),
-+		MTK_FUNCTION(1, "HDMISCK"),
-+		MTK_FUNCTION(4, "SDA1"),
-+		MTK_FUNCTION(5, "PWM3")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(125, "HDMISD"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 98),
-+		MTK_FUNCTION(0, "GPIO125"),
-+		MTK_FUNCTION(1, "HDMISD"),
-+		MTK_FUNCTION(4, "SCL1"),
-+		MTK_FUNCTION(5, "PWM4")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(126, "I2S0_MCLK"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 99),
-+		MTK_FUNCTION(0, "GPIO126"),
-+		MTK_FUNCTION(1, "I2S0_MCLK"),
-+		MTK_FUNCTION(6, "WCN_I2S_MCLK"),
-+		MTK_FUNCTION(7, "DBG_MON_B[6]")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(127, "RAMBUF_IDATA0"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO127"),
-+		MTK_FUNCTION(1, "RAMBUF_IDATA0")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(128, "RAMBUF_IDATA1"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO128"),
-+		MTK_FUNCTION(1, "RAMBUF_IDATA1")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(129, "RAMBUF_IDATA2"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO129"),
-+		MTK_FUNCTION(1, "RAMBUF_IDATA2")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(130, "RAMBUF_IDATA3"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO130"),
-+		MTK_FUNCTION(1, "RAMBUF_IDATA3")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(131, "RAMBUF_IDATA4"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO131"),
-+		MTK_FUNCTION(1, "RAMBUF_IDATA4")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(132, "RAMBUF_IDATA5"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO132"),
-+		MTK_FUNCTION(1, "RAMBUF_IDATA5")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(133, "RAMBUF_IDATA6"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO133"),
-+		MTK_FUNCTION(1, "RAMBUF_IDATA6")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(134, "RAMBUF_IDATA7"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO134"),
-+		MTK_FUNCTION(1, "RAMBUF_IDATA7")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(135, "RAMBUF_IDATA8"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO135"),
-+		MTK_FUNCTION(1, "RAMBUF_IDATA8")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(136, "RAMBUF_IDATA9"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO136"),
-+		MTK_FUNCTION(1, "RAMBUF_IDATA9")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(137, "RAMBUF_IDATA10"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO137"),
-+		MTK_FUNCTION(1, "RAMBUF_IDATA10")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(138, "RAMBUF_IDATA11"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO138"),
-+		MTK_FUNCTION(1, "RAMBUF_IDATA11")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(139, "RAMBUF_IDATA12"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO139"),
-+		MTK_FUNCTION(1, "RAMBUF_IDATA12")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(140, "RAMBUF_IDATA13"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO140"),
-+		MTK_FUNCTION(1, "RAMBUF_IDATA13")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(141, "RAMBUF_IDATA14"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO141"),
-+		MTK_FUNCTION(1, "RAMBUF_IDATA14")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(142, "RAMBUF_IDATA15"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO142"),
-+		MTK_FUNCTION(1, "RAMBUF_IDATA15")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(143, "RAMBUF_ODATA0"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO143"),
-+		MTK_FUNCTION(1, "RAMBUF_ODATA0")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(144, "RAMBUF_ODATA1"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO144"),
-+		MTK_FUNCTION(1, "RAMBUF_ODATA1")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(145, "RAMBUF_ODATA2"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO145"),
-+		MTK_FUNCTION(1, "RAMBUF_ODATA2")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(146, "RAMBUF_ODATA3"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO146"),
-+		MTK_FUNCTION(1, "RAMBUF_ODATA3")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(147, "RAMBUF_ODATA4"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO147"),
-+		MTK_FUNCTION(1, "RAMBUF_ODATA4")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(148, "RAMBUF_ODATA5"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO148"),
-+		MTK_FUNCTION(1, "RAMBUF_ODATA5")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(149, "RAMBUF_ODATA6"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO149"),
-+		MTK_FUNCTION(1, "RAMBUF_ODATA6")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(150, "RAMBUF_ODATA7"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO150"),
-+		MTK_FUNCTION(1, "RAMBUF_ODATA7")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(151, "RAMBUF_ODATA8"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO151"),
-+		MTK_FUNCTION(1, "RAMBUF_ODATA8")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(152, "RAMBUF_ODATA9"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO152"),
-+		MTK_FUNCTION(1, "RAMBUF_ODATA9")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(153, "RAMBUF_ODATA10"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO153"),
-+		MTK_FUNCTION(1, "RAMBUF_ODATA10")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(154, "RAMBUF_ODATA11"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO154"),
-+		MTK_FUNCTION(1, "RAMBUF_ODATA11")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(155, "RAMBUF_ODATA12"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO155"),
-+		MTK_FUNCTION(1, "RAMBUF_ODATA12")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(156, "RAMBUF_ODATA13"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO156"),
-+		MTK_FUNCTION(1, "RAMBUF_ODATA13")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(157, "RAMBUF_ODATA14"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO157"),
-+		MTK_FUNCTION(1, "RAMBUF_ODATA14")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(158, "RAMBUF_ODATA15"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO158"),
-+		MTK_FUNCTION(1, "RAMBUF_ODATA15")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(159, "RAMBUF_BE0"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO159"),
-+		MTK_FUNCTION(1, "RAMBUF_BE0")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(160, "RAMBUF_BE1"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO160"),
-+		MTK_FUNCTION(1, "RAMBUF_BE1")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(161, "AP2PT_INT"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO161"),
-+		MTK_FUNCTION(1, "AP2PT_INT")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(162, "AP2PT_INT_CLR"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO162"),
-+		MTK_FUNCTION(1, "AP2PT_INT_CLR")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(163, "PT2AP_INT"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO163"),
-+		MTK_FUNCTION(1, "PT2AP_INT")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(164, "PT2AP_INT_CLR"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO164"),
-+		MTK_FUNCTION(1, "PT2AP_INT_CLR")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(165, "AP2UP_INT"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO165"),
-+		MTK_FUNCTION(1, "AP2UP_INT")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(166, "AP2UP_INT_CLR"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO166"),
-+		MTK_FUNCTION(1, "AP2UP_INT_CLR")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(167, "UP2AP_INT"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO167"),
-+		MTK_FUNCTION(1, "UP2AP_INT")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(168, "UP2AP_INT_CLR"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO168"),
-+		MTK_FUNCTION(1, "UP2AP_INT_CLR")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(169, "RAMBUF_ADDR0"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO169"),
-+		MTK_FUNCTION(1, "RAMBUF_ADDR0")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(170, "RAMBUF_ADDR1"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO170"),
-+		MTK_FUNCTION(1, "RAMBUF_ADDR1")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(171, "RAMBUF_ADDR2"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO171"),
-+		MTK_FUNCTION(1, "RAMBUF_ADDR2")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(172, "RAMBUF_ADDR3"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO172"),
-+		MTK_FUNCTION(1, "RAMBUF_ADDR3")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(173, "RAMBUF_ADDR4"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO173"),
-+		MTK_FUNCTION(1, "RAMBUF_ADDR4")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(174, "RAMBUF_ADDR5"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO174"),
-+		MTK_FUNCTION(1, "RAMBUF_ADDR5")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(175, "RAMBUF_ADDR6"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO175"),
-+		MTK_FUNCTION(1, "RAMBUF_ADDR6")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(176, "RAMBUF_ADDR7"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO176"),
-+		MTK_FUNCTION(1, "RAMBUF_ADDR7")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(177, "RAMBUF_ADDR8"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO177"),
-+		MTK_FUNCTION(1, "RAMBUF_ADDR8")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(178, "RAMBUF_ADDR9"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO178"),
-+		MTK_FUNCTION(1, "RAMBUF_ADDR9")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(179, "RAMBUF_ADDR10"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO179"),
-+		MTK_FUNCTION(1, "RAMBUF_ADDR10")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(180, "RAMBUF_RW"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO180"),
-+		MTK_FUNCTION(1, "RAMBUF_RW")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(181, "RAMBUF_LAST"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO181"),
-+		MTK_FUNCTION(1, "RAMBUF_LAST")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(182, "RAMBUF_HP"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO182"),
-+		MTK_FUNCTION(1, "RAMBUF_HP")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(183, "RAMBUF_REQ"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO183"),
-+		MTK_FUNCTION(1, "RAMBUF_REQ")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(184, "RAMBUF_ALE"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO184"),
-+		MTK_FUNCTION(1, "RAMBUF_ALE")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(185, "RAMBUF_DLE"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO185"),
-+		MTK_FUNCTION(1, "RAMBUF_DLE")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(186, "RAMBUF_WDLE"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO186"),
-+		MTK_FUNCTION(1, "RAMBUF_WDLE")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(187, "RAMBUF_O_CLK"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO187"),
-+		MTK_FUNCTION(1, "RAMBUF_O_CLK")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(188, "I2S2_MCLK"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 100),
-+		MTK_FUNCTION(0, "GPIO188"),
-+		MTK_FUNCTION(1, "I2S2_MCLK")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(189, "I2S3_DATA"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 101),
-+		MTK_FUNCTION(0, "GPIO189"),
-+		MTK_FUNCTION(2, "I2S3_DATA_BYPS"),
-+		MTK_FUNCTION(3, "PCM_TX")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(190, "I2S3_DATA_IN"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 102),
-+		MTK_FUNCTION(0, "GPIO190"),
-+		MTK_FUNCTION(1, "I2S3_DATA_IN"),
-+		MTK_FUNCTION(3, "PCM_RX")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(191, "I2S3_BCK"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 103),
-+		MTK_FUNCTION(0, "GPIO191"),
-+		MTK_FUNCTION(1, "I2S3_BCK"),
-+		MTK_FUNCTION(3, "PCM_CLK0")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(192, "I2S3_LRCK"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 104),
-+		MTK_FUNCTION(0, "GPIO192"),
-+		MTK_FUNCTION(1, "I2S3_LRCK"),
-+		MTK_FUNCTION(3, "PCM_SYNC")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(193, "I2S3_MCLK"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 105),
-+		MTK_FUNCTION(0, "GPIO193"),
-+		MTK_FUNCTION(1, "I2S3_MCLK")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(194, "I2S4_DATA"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 106),
-+		MTK_FUNCTION(0, "GPIO194"),
-+		MTK_FUNCTION(1, "I2S4_DATA"),
-+		MTK_FUNCTION(2, "I2S4_DATA_BYPS"),
-+		MTK_FUNCTION(3, "PCM_TX")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(195, "I2S4_DATA_IN"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 107),
-+		MTK_FUNCTION(0, "GPIO195"),
-+		MTK_FUNCTION(1, "I2S4_DATA_IN"),
-+		MTK_FUNCTION(3, "PCM_RX")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(196, "I2S4_BCK"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 108),
-+		MTK_FUNCTION(0, "GPIO196"),
-+		MTK_FUNCTION(1, "I2S4_BCK"),
-+		MTK_FUNCTION(3, "PCM_CLK0")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(197, "I2S4_LRCK"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 109),
-+		MTK_FUNCTION(0, "GPIO197"),
-+		MTK_FUNCTION(1, "I2S4_LRCK"),
-+		MTK_FUNCTION(3, "PCM_SYNC")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(198, "I2S4_MCLK"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 110),
-+		MTK_FUNCTION(0, "GPIO198"),
-+		MTK_FUNCTION(1, "I2S4_MCLK")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(199, "SPI1_CLK"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 111),
-+		MTK_FUNCTION(0, "GPIO199"),
-+		MTK_FUNCTION(1, "SPI1_CK"),
-+		MTK_FUNCTION(3, "EXT_FRAME_SYNC"),
-+		MTK_FUNCTION(4, "KCOL3"),
-+		MTK_FUNCTION(7, "DBG_MON_B[15]")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(200, "SPDIF_OUT"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 112),
-+		MTK_FUNCTION(0, "GPIO200"),
-+		MTK_FUNCTION(1, "SPDIF_OUT"),
-+		MTK_FUNCTION(5, "G1_TXD3"),
-+		MTK_FUNCTION(6, "URXD2"),
-+		MTK_FUNCTION(7, "DBG_MON_B[16]")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(201, "SPDIF_IN0"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 113),
-+		MTK_FUNCTION(0, "GPIO201"),
-+		MTK_FUNCTION(1, "SPDIF_IN0"),
-+		MTK_FUNCTION(5, "G1_TXEN"),
-+		MTK_FUNCTION(6, "UTXD2"),
-+		MTK_FUNCTION(7, "DBG_MON_B[17]")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(202, "SPDIF_IN1"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 114),
-+		MTK_FUNCTION(0, "GPIO202"),
-+		MTK_FUNCTION(1, "SPDIF_IN1")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(203, "PWM0"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 115),
-+		MTK_FUNCTION(0, "GPIO203"),
-+		MTK_FUNCTION(1, "PWM0"),
-+		MTK_FUNCTION(2, "DISP_PWM"),
-+		MTK_FUNCTION(5, "G1_TXD2"),
-+		MTK_FUNCTION(7, "DBG_MON_B[18]"),
-+		MTK_FUNCTION(9, "I2S2_DATA")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(204, "PWM1"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 116),
-+		MTK_FUNCTION(0, "GPIO204"),
-+		MTK_FUNCTION(1, "PWM1"),
-+		MTK_FUNCTION(2, "CLKM3"),
-+		MTK_FUNCTION(5, "G1_TXD1"),
-+		MTK_FUNCTION(7, "DBG_MON_B[19]"),
-+		MTK_FUNCTION(9, "I2S3_DATA")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(205, "PWM2"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 117),
-+		MTK_FUNCTION(0, "GPIO205"),
-+		MTK_FUNCTION(1, "PWM2"),
-+		MTK_FUNCTION(2, "CLKM2"),
-+		MTK_FUNCTION(5, "G1_TXD0"),
-+		MTK_FUNCTION(7, "DBG_MON_B[20]")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(206, "PWM3"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 118),
-+		MTK_FUNCTION(0, "GPIO206"),
-+		MTK_FUNCTION(1, "PWM3"),
-+		MTK_FUNCTION(2, "CLKM1"),
-+		MTK_FUNCTION(3, "EXT_FRAME_SYNC"),
-+		MTK_FUNCTION(5, "G1_TXC"),
-+		MTK_FUNCTION(7, "DBG_MON_B[21]")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(207, "PWM4"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 119),
-+		MTK_FUNCTION(0, "GPIO207"),
-+		MTK_FUNCTION(1, "PWM4"),
-+		MTK_FUNCTION(2, "CLKM0"),
-+		MTK_FUNCTION(3, "EXT_FRAME_SYNC"),
-+		MTK_FUNCTION(5, "G1_RXC"),
-+		MTK_FUNCTION(7, "DBG_MON_B[22]")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(208, "AUD_EXT_CK1"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 120),
-+		MTK_FUNCTION(0, "GPIO208"),
-+		MTK_FUNCTION(1, "AUD_EXT_CK1"),
-+		MTK_FUNCTION(2, "PWM0"),
-+		MTK_FUNCTION(4, "ANT_SEL5"),
-+		MTK_FUNCTION(5, "DISP_PWM"),
-+		MTK_FUNCTION(7, "DBG_MON_A[31]"),
-+		MTK_FUNCTION(11, "PCIE0_PERST_N")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(209, "AUD_EXT_CK2"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 121),
-+		MTK_FUNCTION(0, "GPIO209"),
-+		MTK_FUNCTION(1, "AUD_EXT_CK2"),
-+		MTK_FUNCTION(2, "MSDC1_WP"),
-+		MTK_FUNCTION(5, "PWM1"),
-+		MTK_FUNCTION(7, "DBG_MON_A[32]"),
-+		MTK_FUNCTION(11, "PCIE1_PERST_N")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(210, "AUD_CLOCK"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO210"),
-+		MTK_FUNCTION(1, "AUD_CLOCK")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(211, "DVP_RESET"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO211"),
-+		MTK_FUNCTION(1, "DVP_RESET")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(212, "DVP_CLOCK"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO212"),
-+		MTK_FUNCTION(1, "DVP_CLOCK")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(213, "DVP_CS"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO213"),
-+		MTK_FUNCTION(1, "DVP_CS")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(214, "DVP_CK"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO214"),
-+		MTK_FUNCTION(1, "DVP_CK")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(215, "DVP_DI"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO215"),
-+		MTK_FUNCTION(1, "DVP_DI")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(216, "DVP_DO"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO216"),
-+		MTK_FUNCTION(1, "DVP_DO")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(217, "AP_CS"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO217"),
-+		MTK_FUNCTION(1, "AP_CS")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(218, "AP_CK"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO218"),
-+		MTK_FUNCTION(1, "AP_CK")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(219, "AP_DI"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO219"),
-+		MTK_FUNCTION(1, "AP_DI")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(220, "AP_DO"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO220"),
-+		MTK_FUNCTION(1, "AP_DO")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(221, "DVD_BCLK"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO221"),
-+		MTK_FUNCTION(1, "DVD_BCLK")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(222, "T8032_CLK"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO222"),
-+		MTK_FUNCTION(1, "T8032_CLK")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(223, "AP_BCLK"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO223"),
-+		MTK_FUNCTION(1, "AP_BCLK")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(224, "HOST_CS"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO224"),
-+		MTK_FUNCTION(1, "HOST_CS")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(225, "HOST_CK"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO225"),
-+		MTK_FUNCTION(1, "HOST_CK")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(226, "HOST_DO0"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO226"),
-+		MTK_FUNCTION(1, "HOST_DO0")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(227, "HOST_DO1"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO227"),
-+		MTK_FUNCTION(1, "HOST_DO1")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(228, "SLV_CS"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO228"),
-+		MTK_FUNCTION(1, "SLV_CS")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(229, "SLV_CK"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO229"),
-+		MTK_FUNCTION(1, "SLV_CK")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(230, "SLV_DI0"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO230"),
-+		MTK_FUNCTION(1, "SLV_DI0")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(231, "SLV_DI1"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO231"),
-+		MTK_FUNCTION(1, "SLV_DI1")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(232, "AP2DSP_INT"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO232"),
-+		MTK_FUNCTION(1, "AP2DSP_INT")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(233, "AP2DSP_INT_CLR"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO233"),
-+		MTK_FUNCTION(1, "AP2DSP_INT_CLR")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(234, "DSP2AP_INT"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO234"),
-+		MTK_FUNCTION(1, "DSP2AP_INT")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(235, "DSP2AP_INT_CLR"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO235"),
-+		MTK_FUNCTION(1, "DSP2AP_INT_CLR")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(236, "EXT_SDIO3"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 122),
-+		MTK_FUNCTION(0, "GPIO236"),
-+		MTK_FUNCTION(1, "EXT_SDIO3"),
-+		MTK_FUNCTION(2, "IDDIG"),
-+		MTK_FUNCTION(7, "DBG_MON_A[1]")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(237, "EXT_SDIO2"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 123),
-+		MTK_FUNCTION(0, "GPIO237"),
-+		MTK_FUNCTION(1, "EXT_SDIO2"),
-+		MTK_FUNCTION(2, "DRV_VBUS")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(238, "EXT_SDIO1"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 124),
-+		MTK_FUNCTION(0, "GPIO238"),
-+		MTK_FUNCTION(1, "EXT_SDIO1"),
-+		MTK_FUNCTION(2, "IDDIG_P1")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(239, "EXT_SDIO0"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 125),
-+		MTK_FUNCTION(0, "GPIO239"),
-+		MTK_FUNCTION(1, "EXT_SDIO0"),
-+		MTK_FUNCTION(2, "DRV_VBUS_P1")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(240, "EXT_XCS"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 126),
-+		MTK_FUNCTION(0, "GPIO240"),
-+		MTK_FUNCTION(1, "EXT_XCS")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(241, "EXT_SCK"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 127),
-+		MTK_FUNCTION(0, "GPIO241"),
-+		MTK_FUNCTION(1, "EXT_SCK")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(242, "URTS2"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 128),
-+		MTK_FUNCTION(0, "GPIO242"),
-+		MTK_FUNCTION(1, "URTS2"),
-+		MTK_FUNCTION(2, "UTXD3"),
-+		MTK_FUNCTION(3, "URXD3"),
-+		MTK_FUNCTION(4, "SCL1"),
-+		MTK_FUNCTION(7, "DBG_MON_B[32]")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(243, "UCTS2"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 129),
-+		MTK_FUNCTION(0, "GPIO243"),
-+		MTK_FUNCTION(1, "UCTS2"),
-+		MTK_FUNCTION(2, "URXD3"),
-+		MTK_FUNCTION(3, "UTXD3"),
-+		MTK_FUNCTION(4, "SDA1"),
-+		MTK_FUNCTION(7, "DBG_MON_A[6]")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(244, "HDMI_SDA_RX"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 130),
-+		MTK_FUNCTION(0, "GPIO244"),
-+		MTK_FUNCTION(1, "HDMI_SDA_RX")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(245, "HDMI_SCL_RX"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 131),
-+		MTK_FUNCTION(0, "GPIO245"),
-+		MTK_FUNCTION(1, "HDMI_SCL_RX")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(246, "MHL_SENCE"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 132),
-+		MTK_FUNCTION(0, "GPIO246")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(247, "HDMI_HPD_CBUS_RX"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 69),
-+		MTK_FUNCTION(0, "GPIO247"),
-+		MTK_FUNCTION(1, "HDMI_HPD_RX")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(248, "HDMI_TESTOUTP_RX"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 133),
-+		MTK_FUNCTION(0, "GPIO248"),
-+		MTK_FUNCTION(1, "HDMI_TESTOUTP_RX")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(249, "MSDC0E_RSTB"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 134),
-+		MTK_FUNCTION(0, "GPIO249"),
-+		MTK_FUNCTION(1, "MSDC0E_RSTB")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(250, "MSDC0E_DAT7"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 135),
-+		MTK_FUNCTION(0, "GPIO250"),
-+		MTK_FUNCTION(1, "MSDC3_DAT7"),
-+		MTK_FUNCTION(6, "PCIE0_CLKREQ_N")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(251, "MSDC0E_DAT6"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 136),
-+		MTK_FUNCTION(0, "GPIO251"),
-+		MTK_FUNCTION(1, "MSDC3_DAT6"),
-+		MTK_FUNCTION(6, "PCIE0_WAKE_N")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(252, "MSDC0E_DAT5"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 137),
-+		MTK_FUNCTION(0, "GPIO252"),
-+		MTK_FUNCTION(1, "MSDC3_DAT5"),
-+		MTK_FUNCTION(6, "PCIE1_CLKREQ_N")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(253, "MSDC0E_DAT4"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 138),
-+		MTK_FUNCTION(0, "GPIO253"),
-+		MTK_FUNCTION(1, "MSDC3_DAT4"),
-+		MTK_FUNCTION(6, "PCIE1_WAKE_N")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(254, "MSDC0E_DAT3"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 139),
-+		MTK_FUNCTION(0, "GPIO254"),
-+		MTK_FUNCTION(1, "MSDC3_DAT3"),
-+		MTK_FUNCTION(6, "PCIE2_CLKREQ_N")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(255, "MSDC0E_DAT2"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 140),
-+		MTK_FUNCTION(0, "GPIO255"),
-+		MTK_FUNCTION(1, "MSDC3_DAT2"),
-+		MTK_FUNCTION(6, "PCIE2_WAKE_N")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(256, "MSDC0E_DAT1"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 141),
-+		MTK_FUNCTION(0, "GPIO256"),
-+		MTK_FUNCTION(1, "MSDC3_DAT1")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(257, "MSDC0E_DAT0"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 142),
-+		MTK_FUNCTION(0, "GPIO257"),
-+		MTK_FUNCTION(1, "MSDC3_DAT0")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(258, "MSDC0E_CMD"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 143),
-+		MTK_FUNCTION(0, "GPIO258"),
-+		MTK_FUNCTION(1, "MSDC3_CMD")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(259, "MSDC0E_CLK"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 144),
-+		MTK_FUNCTION(0, "GPIO259"),
-+		MTK_FUNCTION(1, "MSDC3_CLK")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(260, "MSDC0E_DSL"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 145),
-+		MTK_FUNCTION(0, "GPIO260"),
-+		MTK_FUNCTION(1, "MSDC3_DSL")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(261, "MSDC1_INS"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 146),
-+		MTK_FUNCTION(0, "GPIO261"),
-+		MTK_FUNCTION(1, "MSDC1_INS"),
-+		MTK_FUNCTION(7, "DBG_MON_B[29]")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(262, "G2_TXEN"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 8),
-+		MTK_FUNCTION(0, "GPIO262"),
-+		MTK_FUNCTION(1, "G2_TXEN")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(263, "G2_TXD3"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 9),
-+		MTK_FUNCTION(0, "GPIO263"),
-+		MTK_FUNCTION(1, "G2_TXD3"),
-+		MTK_FUNCTION(6, "ANT_SEL5")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(264, "G2_TXD2"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 10),
-+		MTK_FUNCTION(0, "GPIO264"),
-+		MTK_FUNCTION(1, "G2_TXD2"),
-+		MTK_FUNCTION(6, "ANT_SEL4")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(265, "G2_TXD1"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 11),
-+		MTK_FUNCTION(0, "GPIO265"),
-+		MTK_FUNCTION(1, "G2_TXD1"),
-+		MTK_FUNCTION(6, "ANT_SEL3")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(266, "G2_TXD0"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO266"),
-+		MTK_FUNCTION(1, "G2_TXD0"),
-+		MTK_FUNCTION(6, "ANT_SEL2")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(267, "G2_TXC"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO267"),
-+		MTK_FUNCTION(1, "G2_TXC")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(268, "G2_RXC"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO268"),
-+		MTK_FUNCTION(1, "G2_RXC")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(269, "G2_RXD0"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO269"),
-+		MTK_FUNCTION(1, "G2_RXD0")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(270, "G2_RXD1"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO270"),
-+		MTK_FUNCTION(1, "G2_RXD1")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(271, "G2_RXD2"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO271"),
-+		MTK_FUNCTION(1, "G2_RXD2")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(272, "G2_RXD3"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO272"),
-+		MTK_FUNCTION(1, "G2_RXD3")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(273, "ESW_INT"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 168),
-+		MTK_FUNCTION(0, "GPIO273"),
-+		MTK_FUNCTION(1, "ESW_INT")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(274, "G2_RXDV"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO274"),
-+		MTK_FUNCTION(1, "G2_RXDV")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(275, "MDC"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO275"),
-+		MTK_FUNCTION(1, "MDC"),
-+		MTK_FUNCTION(6, "ANT_SEL0")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(276, "MDIO"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO276"),
-+		MTK_FUNCTION(1, "MDIO"),
-+		MTK_FUNCTION(6, "ANT_SEL1")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(277, "ESW_RST"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO277"),
-+		MTK_FUNCTION(1, "ESW_RST")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(278, "JTAG_RESET"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(0, 147),
-+		MTK_FUNCTION(0, "GPIO278"),
-+		MTK_FUNCTION(1, "JTAG_RESET")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(279, "USB3_RES_BOND"),
-+		NULL, "mt2701",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO279"),
-+		MTK_FUNCTION(1, "USB3_RES_BOND")
-+	),
-+};
-+
-+#endif /* __PINCTRL_MTK_MT2701_H */
diff --git a/target/linux/mediatek/patches-4.4/0015-dt-bindings-mediatek-Modify-pinctrl-bindings-for-mt7.patch b/target/linux/mediatek/patches-4.4/0015-dt-bindings-mediatek-Modify-pinctrl-bindings-for-mt7.patch
deleted file mode 100644
index fcd39c4..0000000
--- a/target/linux/mediatek/patches-4.4/0015-dt-bindings-mediatek-Modify-pinctrl-bindings-for-mt7.patch
+++ /dev/null
@@ -1,547 +0,0 @@
-From 3800e5c33e5becbb56c6694008d1f3435fd78707 Mon Sep 17 00:00:00 2001
-From: John Crispin <blogic at openwrt.org>
-Date: Thu, 7 Jan 2016 23:42:06 +0100
-Subject: [PATCH 015/102] dt-bindings: mediatek: Modify pinctrl bindings for
- mt7623
-
-Signed-off-by: John Crispin <blogic at openwrt.org>
----
- .../devicetree/bindings/pinctrl/pinctrl-mt65xx.txt |    1 +
- include/dt-bindings/pinctrl/mt7623-pinfunc.h       |  521 ++++++++++++++++++++
- 2 files changed, 522 insertions(+)
- create mode 100644 include/dt-bindings/pinctrl/mt7623-pinfunc.h
-
---- a/Documentation/devicetree/bindings/pinctrl/pinctrl-mt65xx.txt
-+++ b/Documentation/devicetree/bindings/pinctrl/pinctrl-mt65xx.txt
-@@ -6,6 +6,7 @@ Required properties:
- - compatible: value should be one of the following.
- 	"mediatek,mt2701-pinctrl", compatible with mt2701 pinctrl.
- 	"mediatek,mt6397-pinctrl", compatible with mt6397 pinctrl.
-+	"mediatek,mt7623-pinctrl", compatible with mt7623 pinctrl.
- 	"mediatek,mt8127-pinctrl", compatible with mt8127 pinctrl.
- 	"mediatek,mt8135-pinctrl", compatible with mt8135 pinctrl.
- 	"mediatek,mt8173-pinctrl", compatible with mt8173 pinctrl.
---- /dev/null
-+++ b/include/dt-bindings/pinctrl/mt7623-pinfunc.h
-@@ -0,0 +1,521 @@
-+#ifndef __DTS_MT7623_PINFUNC_H
-+#define __DTS_MT7623_PINFUNC_H
-+
-+#include <dt-bindings/pinctrl/mt65xx.h>
-+
-+#define MT7623_PIN_0_PWRAP_SPI0_MI_FUNC_GPIO0 (MTK_PIN_NO(0) | 0)
-+#define MT7623_PIN_0_PWRAP_SPI0_MI_FUNC_PWRAP_SPIDO (MTK_PIN_NO(0) | 1)
-+#define MT7623_PIN_0_PWRAP_SPI0_MI_FUNC_PWRAP_SPIDI (MTK_PIN_NO(0) | 2)
-+
-+#define MT7623_PIN_1_PWRAP_SPI0_MO_FUNC_GPIO1 (MTK_PIN_NO(1) | 0)
-+#define MT7623_PIN_1_PWRAP_SPI0_MO_FUNC_PWRAP_SPIDI (MTK_PIN_NO(1) | 1)
-+#define MT7623_PIN_1_PWRAP_SPI0_MO_FUNC_PWRAP_SPIDO (MTK_PIN_NO(1) | 2)
-+
-+#define MT7623_PIN_2_PWRAP_INT_FUNC_GPIO2 (MTK_PIN_NO(2) | 0)
-+#define MT7623_PIN_2_PWRAP_INT_FUNC_PWRAP_INT (MTK_PIN_NO(2) | 1)
-+
-+#define MT7623_PIN_3_PWRAP_SPI0_CK_FUNC_GPIO3 (MTK_PIN_NO(3) | 0)
-+#define MT7623_PIN_3_PWRAP_SPI0_CK_FUNC_PWRAP_SPICK_I (MTK_PIN_NO(3) | 1)
-+
-+#define MT7623_PIN_4_PWRAP_SPI0_CSN_FUNC_GPIO4 (MTK_PIN_NO(4) | 0)
-+#define MT7623_PIN_4_PWRAP_SPI0_CSN_FUNC_PWRAP_SPICS_B_I (MTK_PIN_NO(4) | 1)
-+
-+#define MT7623_PIN_5_PWRAP_SPI0_CK2_FUNC_GPIO5 (MTK_PIN_NO(5) | 0)
-+#define MT7623_PIN_5_PWRAP_SPI0_CK2_FUNC_PWRAP_SPICK2_I (MTK_PIN_NO(5) | 1)
-+
-+#define MT7623_PIN_6_PWRAP_SPI0_CSN2_FUNC_GPIO6 (MTK_PIN_NO(6) | 0)
-+#define MT7623_PIN_6_PWRAP_SPI0_CSN2_FUNC_PWRAP_SPICS2_B_I (MTK_PIN_NO(6) | 1)
-+
-+#define MT7623_PIN_7_SPI1_CSN_FUNC_GPIO7 (MTK_PIN_NO(7) | 0)
-+#define MT7623_PIN_7_SPI1_CSN_FUNC_SPI1_CS (MTK_PIN_NO(7) | 1)
-+
-+#define MT7623_PIN_8_SPI1_MI_FUNC_GPIO8 (MTK_PIN_NO(8) | 0)
-+#define MT7623_PIN_8_SPI1_MI_FUNC_SPI1_MI (MTK_PIN_NO(8) | 1)
-+#define MT7623_PIN_8_SPI1_MI_FUNC_SPI1_MO (MTK_PIN_NO(8) | 2)
-+
-+#define MT7623_PIN_9_SPI1_MO_FUNC_GPIO9 (MTK_PIN_NO(9) | 0)
-+#define MT7623_PIN_9_SPI1_MO_FUNC_SPI1_MO (MTK_PIN_NO(9) | 1)
-+#define MT7623_PIN_9_SPI1_MO_FUNC_SPI1_MI (MTK_PIN_NO(9) | 2)
-+
-+#define MT7623_PIN_10_RTC32K_CK_FUNC_GPIO10 (MTK_PIN_NO(10) | 0)
-+#define MT7623_PIN_10_RTC32K_CK_FUNC_RTC32K_CK (MTK_PIN_NO(10) | 1)
-+
-+#define MT7623_PIN_11_WATCHDOG_FUNC_GPIO11 (MTK_PIN_NO(11) | 0)
-+#define MT7623_PIN_11_WATCHDOG_FUNC_WATCHDOG (MTK_PIN_NO(11) | 1)
-+
-+#define MT7623_PIN_12_SRCLKENA_FUNC_GPIO12 (MTK_PIN_NO(12) | 0)
-+#define MT7623_PIN_12_SRCLKENA_FUNC_SRCLKENA (MTK_PIN_NO(12) | 1)
-+
-+#define MT7623_PIN_13_SRCLKENAI_FUNC_GPIO13 (MTK_PIN_NO(13) | 0)
-+#define MT7623_PIN_13_SRCLKENAI_FUNC_SRCLKENAI (MTK_PIN_NO(13) | 1)
-+
-+#define MT7623_PIN_14_GPIO14_FUNC_GPIO14 (MTK_PIN_NO(14) | 0)
-+#define MT7623_PIN_14_GPIO14_FUNC_URXD2 (MTK_PIN_NO(14) | 1)
-+#define MT7623_PIN_14_GPIO14_FUNC_UTXD2 (MTK_PIN_NO(14) | 2)
-+
-+#define MT7623_PIN_15_GPIO15_FUNC_GPIO15 (MTK_PIN_NO(15) | 0)
-+#define MT7623_PIN_15_GPIO15_FUNC_UTXD2 (MTK_PIN_NO(15) | 1)
-+#define MT7623_PIN_15_GPIO15_FUNC_URXD2 (MTK_PIN_NO(15) | 2)
-+
-+#define MT7623_PIN_18_PCM_CLK_FUNC_GPIO18 (MTK_PIN_NO(18) | 0)
-+#define MT7623_PIN_18_PCM_CLK_FUNC_PCM_CLK0 (MTK_PIN_NO(18) | 1)
-+#define MT7623_PIN_18_PCM_CLK_FUNC_AP_PCM_CLKO (MTK_PIN_NO(18) | 6)
-+
-+#define MT7623_PIN_19_PCM_SYNC_FUNC_GPIO19 (MTK_PIN_NO(19) | 0)
-+#define MT7623_PIN_19_PCM_SYNC_FUNC_PCM_SYNC (MTK_PIN_NO(19) | 1)
-+#define MT7623_PIN_19_PCM_SYNC_FUNC_AP_PCM_SYNC (MTK_PIN_NO(19) | 6)
-+
-+#define MT7623_PIN_20_PCM_RX_FUNC_GPIO20 (MTK_PIN_NO(20) | 0)
-+#define MT7623_PIN_20_PCM_RX_FUNC_PCM_RX (MTK_PIN_NO(20) | 1)
-+#define MT7623_PIN_20_PCM_RX_FUNC_PCM_TX (MTK_PIN_NO(20) | 4)
-+#define MT7623_PIN_20_PCM_RX_FUNC_AP_PCM_RX (MTK_PIN_NO(20) | 6)
-+
-+#define MT7623_PIN_21_PCM_TX_FUNC_GPIO21 (MTK_PIN_NO(21) | 0)
-+#define MT7623_PIN_21_PCM_TX_FUNC_PCM_TX (MTK_PIN_NO(21) | 1)
-+#define MT7623_PIN_21_PCM_TX_FUNC_PCM_RX (MTK_PIN_NO(21) | 4)
-+#define MT7623_PIN_21_PCM_TX_FUNC_AP_PCM_TX (MTK_PIN_NO(21) | 6)
-+
-+#define MT7623_PIN_22_EINT0_FUNC_GPIO22 (MTK_PIN_NO(22) | 0)
-+#define MT7623_PIN_22_EINT0_FUNC_UCTS0 (MTK_PIN_NO(22) | 1)
-+#define MT7623_PIN_22_EINT0_FUNC_PCIE0_PERST_N (MTK_PIN_NO(22) | 2)
-+
-+#define MT7623_PIN_23_EINT1_FUNC_GPIO23 (MTK_PIN_NO(23) | 0)
-+#define MT7623_PIN_23_EINT1_FUNC_URTS0 (MTK_PIN_NO(23) | 1)
-+#define MT7623_PIN_23_EINT1_FUNC_PCIE1_PERST_N (MTK_PIN_NO(23) | 2)
-+
-+#define MT7623_PIN_24_EINT2_FUNC_GPIO24 (MTK_PIN_NO(24) | 0)
-+#define MT7623_PIN_24_EINT2_FUNC_UCTS1 (MTK_PIN_NO(24) | 1)
-+#define MT7623_PIN_24_EINT2_FUNC_PCIE2_PERST_N (MTK_PIN_NO(24) | 2)
-+
-+#define MT7623_PIN_25_EINT3_FUNC_GPIO25 (MTK_PIN_NO(25) | 0)
-+#define MT7623_PIN_25_EINT3_FUNC_URTS1 (MTK_PIN_NO(25) | 1)
-+
-+#define MT7623_PIN_26_EINT4_FUNC_GPIO26 (MTK_PIN_NO(26) | 0)
-+#define MT7623_PIN_26_EINT4_FUNC_UCTS3 (MTK_PIN_NO(26) | 1)
-+#define MT7623_PIN_26_EINT4_FUNC_PCIE2_WAKE_N (MTK_PIN_NO(26) | 6)
-+
-+#define MT7623_PIN_27_EINT5_FUNC_GPIO27 (MTK_PIN_NO(27) | 0)
-+#define MT7623_PIN_27_EINT5_FUNC_URTS3 (MTK_PIN_NO(27) | 1)
-+#define MT7623_PIN_27_EINT5_FUNC_PCIE1_WAKE_N (MTK_PIN_NO(27) | 6)
-+
-+#define MT7623_PIN_28_EINT6_FUNC_GPIO28 (MTK_PIN_NO(28) | 0)
-+#define MT7623_PIN_28_EINT6_FUNC_DRV_VBUS (MTK_PIN_NO(28) | 1)
-+#define MT7623_PIN_28_EINT6_FUNC_PCIE0_WAKE_N (MTK_PIN_NO(28) | 6)
-+
-+#define MT7623_PIN_29_EINT7_FUNC_GPIO29 (MTK_PIN_NO(29) | 0)
-+#define MT7623_PIN_29_EINT7_FUNC_IDDIG (MTK_PIN_NO(29) | 1)
-+#define MT7623_PIN_29_EINT7_FUNC_MSDC1_WP (MTK_PIN_NO(29) | 2)
-+#define MT7623_PIN_29_EINT7_FUNC_PCIE2_PERST_N (MTK_PIN_NO(29) | 6)
-+
-+#define MT7623_PIN_33_I2S1_DATA_FUNC_GPIO33 (MTK_PIN_NO(33) | 0)
-+#define MT7623_PIN_33_I2S1_DATA_FUNC_I2S1_DATA (MTK_PIN_NO(33) | 1)
-+#define MT7623_PIN_33_I2S1_DATA_FUNC_PCM_TX (MTK_PIN_NO(33) | 3)
-+#define MT7623_PIN_33_I2S1_DATA_FUNC_AP_PCM_TX (MTK_PIN_NO(33) | 6)
-+
-+#define MT7623_PIN_34_I2S1_DATA_IN_FUNC_GPIO34 (MTK_PIN_NO(34) | 0)
-+#define MT7623_PIN_34_I2S1_DATA_IN_FUNC_I2S1_DATA_IN (MTK_PIN_NO(34) | 1)
-+#define MT7623_PIN_34_I2S1_DATA_IN_FUNC_PCM_RX (MTK_PIN_NO(34) | 3)
-+#define MT7623_PIN_34_I2S1_DATA_IN_FUNC_AP_PCM_RX (MTK_PIN_NO(34) | 6)
-+
-+#define MT7623_PIN_35_I2S1_BCK_FUNC_GPIO35 (MTK_PIN_NO(35) | 0)
-+#define MT7623_PIN_35_I2S1_BCK_FUNC_I2S1_BCK (MTK_PIN_NO(35) | 1)
-+#define MT7623_PIN_35_I2S1_BCK_FUNC_PCM_CLK0 (MTK_PIN_NO(35) | 3)
-+#define MT7623_PIN_35_I2S1_BCK_FUNC_AP_PCM_CLKO (MTK_PIN_NO(35) | 6)
-+
-+#define MT7623_PIN_36_I2S1_LRCK_FUNC_GPIO36 (MTK_PIN_NO(36) | 0)
-+#define MT7623_PIN_36_I2S1_LRCK_FUNC_I2S1_LRCK (MTK_PIN_NO(36) | 1)
-+#define MT7623_PIN_36_I2S1_LRCK_FUNC_PCM_SYNC (MTK_PIN_NO(36) | 3)
-+#define MT7623_PIN_36_I2S1_LRCK_FUNC_AP_PCM_SYNC (MTK_PIN_NO(36) | 6)
-+
-+#define MT7623_PIN_37_I2S1_MCLK_FUNC_GPIO37 (MTK_PIN_NO(37) | 0)
-+#define MT7623_PIN_37_I2S1_MCLK_FUNC_I2S1_MCLK (MTK_PIN_NO(37) | 1)
-+
-+#define MT7623_PIN_39_JTMS_FUNC_GPIO39 (MTK_PIN_NO(39) | 0)
-+#define MT7623_PIN_39_JTMS_FUNC_JTMS (MTK_PIN_NO(39) | 1)
-+
-+#define MT7623_PIN_40_JTCK_FUNC_GPIO40 (MTK_PIN_NO(40) | 0)
-+#define MT7623_PIN_40_JTCK_FUNC_JTCK (MTK_PIN_NO(40) | 1)
-+
-+#define MT7623_PIN_41_JTDI_FUNC_GPIO41 (MTK_PIN_NO(41) | 0)
-+#define MT7623_PIN_41_JTDI_FUNC_JTDI (MTK_PIN_NO(41) | 1)
-+
-+#define MT7623_PIN_42_JTDO_FUNC_GPIO42 (MTK_PIN_NO(42) | 0)
-+#define MT7623_PIN_42_JTDO_FUNC_JTDO (MTK_PIN_NO(42) | 1)
-+
-+#define MT7623_PIN_43_NCLE_FUNC_GPIO43 (MTK_PIN_NO(43) | 0)
-+#define MT7623_PIN_43_NCLE_FUNC_NCLE (MTK_PIN_NO(43) | 1)
-+#define MT7623_PIN_43_NCLE_FUNC_EXT_XCS2 (MTK_PIN_NO(43) | 2)
-+
-+#define MT7623_PIN_44_NCEB1_FUNC_GPIO44 (MTK_PIN_NO(44) | 0)
-+#define MT7623_PIN_44_NCEB1_FUNC_NCEB1 (MTK_PIN_NO(44) | 1)
-+#define MT7623_PIN_44_NCEB1_FUNC_IDDIG (MTK_PIN_NO(44) | 2)
-+
-+#define MT7623_PIN_45_NCEB0_FUNC_GPIO45 (MTK_PIN_NO(45) | 0)
-+#define MT7623_PIN_45_NCEB0_FUNC_NCEB0 (MTK_PIN_NO(45) | 1)
-+#define MT7623_PIN_45_NCEB0_FUNC_DRV_VBUS (MTK_PIN_NO(45) | 2)
-+
-+#define MT7623_PIN_46_IR_FUNC_GPIO46 (MTK_PIN_NO(46) | 0)
-+#define MT7623_PIN_46_IR_FUNC_IR (MTK_PIN_NO(46) | 1)
-+
-+#define MT7623_PIN_47_NREB_FUNC_GPIO47 (MTK_PIN_NO(47) | 0)
-+#define MT7623_PIN_47_NREB_FUNC_NREB (MTK_PIN_NO(47) | 1)
-+
-+#define MT7623_PIN_48_NRNB_FUNC_GPIO48 (MTK_PIN_NO(48) | 0)
-+#define MT7623_PIN_48_NRNB_FUNC_NRNB (MTK_PIN_NO(48) | 1)
-+
-+#define MT7623_PIN_49_I2S0_DATA_FUNC_GPIO49 (MTK_PIN_NO(49) | 0)
-+#define MT7623_PIN_49_I2S0_DATA_FUNC_I2S0_DATA (MTK_PIN_NO(49) | 1)
-+#define MT7623_PIN_49_I2S0_DATA_FUNC_PCM_TX (MTK_PIN_NO(49) | 3)
-+#define MT7623_PIN_49_I2S0_DATA_FUNC_AP_I2S_DO (MTK_PIN_NO(49) | 6)
-+
-+#define MT7623_PIN_53_SPI0_CSN_FUNC_GPIO53 (MTK_PIN_NO(53) | 0)
-+#define MT7623_PIN_53_SPI0_CSN_FUNC_SPI0_CS (MTK_PIN_NO(53) | 1)
-+#define MT7623_PIN_53_SPI0_CSN_FUNC_PWM1 (MTK_PIN_NO(53) | 5)
-+
-+#define MT7623_PIN_54_SPI0_CK_FUNC_GPIO54 (MTK_PIN_NO(54) | 0)
-+#define MT7623_PIN_54_SPI0_CK_FUNC_SPI0_CK (MTK_PIN_NO(54) | 1)
-+
-+#define MT7623_PIN_55_SPI0_MI_FUNC_GPIO55 (MTK_PIN_NO(55) | 0)
-+#define MT7623_PIN_55_SPI0_MI_FUNC_SPI0_MI (MTK_PIN_NO(55) | 1)
-+#define MT7623_PIN_55_SPI0_MI_FUNC_SPI0_MO (MTK_PIN_NO(55) | 2)
-+#define MT7623_PIN_55_SPI0_MI_FUNC_MSDC1_WP (MTK_PIN_NO(55) | 3)
-+#define MT7623_PIN_55_SPI0_MI_FUNC_PWM2 (MTK_PIN_NO(55) | 5)
-+
-+#define MT7623_PIN_56_SPI0_MO_FUNC_GPIO56 (MTK_PIN_NO(56) | 0)
-+#define MT7623_PIN_56_SPI0_MO_FUNC_SPI0_MO (MTK_PIN_NO(56) | 1)
-+#define MT7623_PIN_56_SPI0_MO_FUNC_SPI0_MI (MTK_PIN_NO(56) | 2)
-+
-+#define MT7623_PIN_60_WB_RSTB_FUNC_GPIO60 (MTK_PIN_NO(60) | 0)
-+#define MT7623_PIN_60_WB_RSTB_FUNC_WB_RSTB (MTK_PIN_NO(60) | 1)
-+
-+#define MT7623_PIN_61_GPIO61_FUNC_GPIO61 (MTK_PIN_NO(61) | 0)
-+#define MT7623_PIN_61_GPIO61_FUNC_TEST_FD (MTK_PIN_NO(61) | 1)
-+
-+#define MT7623_PIN_62_GPIO62_FUNC_GPIO62 (MTK_PIN_NO(62) | 0)
-+#define MT7623_PIN_62_GPIO62_FUNC_TEST_FC (MTK_PIN_NO(62) | 1)
-+
-+#define MT7623_PIN_63_WB_SCLK_FUNC_GPIO63 (MTK_PIN_NO(63) | 0)
-+#define MT7623_PIN_63_WB_SCLK_FUNC_WB_SCLK (MTK_PIN_NO(63) | 1)
-+
-+#define MT7623_PIN_64_WB_SDATA_FUNC_GPIO64 (MTK_PIN_NO(64) | 0)
-+#define MT7623_PIN_64_WB_SDATA_FUNC_WB_SDATA (MTK_PIN_NO(64) | 1)
-+
-+#define MT7623_PIN_65_WB_SEN_FUNC_GPIO65 (MTK_PIN_NO(65) | 0)
-+#define MT7623_PIN_65_WB_SEN_FUNC_WB_SEN (MTK_PIN_NO(65) | 1)
-+
-+#define MT7623_PIN_66_WB_CRTL0_FUNC_GPIO66 (MTK_PIN_NO(66) | 0)
-+#define MT7623_PIN_66_WB_CRTL0_FUNC_WB_CRTL0 (MTK_PIN_NO(66) | 1)
-+
-+#define MT7623_PIN_67_WB_CRTL1_FUNC_GPIO67 (MTK_PIN_NO(67) | 0)
-+#define MT7623_PIN_67_WB_CRTL1_FUNC_WB_CRTL1 (MTK_PIN_NO(67) | 1)
-+
-+#define MT7623_PIN_68_WB_CRTL2_FUNC_GPIO68 (MTK_PIN_NO(68) | 0)
-+#define MT7623_PIN_68_WB_CRTL2_FUNC_WB_CRTL2 (MTK_PIN_NO(68) | 1)
-+
-+#define MT7623_PIN_69_WB_CRTL3_FUNC_GPIO69 (MTK_PIN_NO(69) | 0)
-+#define MT7623_PIN_69_WB_CRTL3_FUNC_WB_CRTL3 (MTK_PIN_NO(69) | 1)
-+
-+#define MT7623_PIN_70_WB_CRTL4_FUNC_GPIO70 (MTK_PIN_NO(70) | 0)
-+#define MT7623_PIN_70_WB_CRTL4_FUNC_WB_CRTL4 (MTK_PIN_NO(70) | 1)
-+
-+#define MT7623_PIN_71_WB_CRTL5_FUNC_GPIO71 (MTK_PIN_NO(71) | 0)
-+#define MT7623_PIN_71_WB_CRTL5_FUNC_WB_CRTL5 (MTK_PIN_NO(71) | 1)
-+
-+#define MT7623_PIN_72_I2S0_DATA_IN_FUNC_GPIO72 (MTK_PIN_NO(72) | 0)
-+#define MT7623_PIN_72_I2S0_DATA_IN_FUNC_I2S0_DATA_IN (MTK_PIN_NO(72) | 1)
-+#define MT7623_PIN_72_I2S0_DATA_IN_FUNC_PCM_RX (MTK_PIN_NO(72) | 3)
-+#define MT7623_PIN_72_I2S0_DATA_IN_FUNC_PWM0 (MTK_PIN_NO(72) | 4)
-+#define MT7623_PIN_72_I2S0_DATA_IN_FUNC_DISP_PWM (MTK_PIN_NO(72) | 5)
-+#define MT7623_PIN_72_I2S0_DATA_IN_FUNC_AP_I2S_DI (MTK_PIN_NO(72) | 6)
-+
-+#define MT7623_PIN_73_I2S0_LRCK_FUNC_GPIO73 (MTK_PIN_NO(73) | 0)
-+#define MT7623_PIN_73_I2S0_LRCK_FUNC_I2S0_LRCK (MTK_PIN_NO(73) | 1)
-+#define MT7623_PIN_73_I2S0_LRCK_FUNC_PCM_SYNC (MTK_PIN_NO(73) | 3)
-+#define MT7623_PIN_73_I2S0_LRCK_FUNC_AP_I2S_LRCK (MTK_PIN_NO(73) | 6)
-+
-+#define MT7623_PIN_74_I2S0_BCK_FUNC_GPIO74 (MTK_PIN_NO(74) | 0)
-+#define MT7623_PIN_74_I2S0_BCK_FUNC_I2S0_BCK (MTK_PIN_NO(74) | 1)
-+#define MT7623_PIN_74_I2S0_BCK_FUNC_PCM_CLK0 (MTK_PIN_NO(74) | 3)
-+#define MT7623_PIN_74_I2S0_BCK_FUNC_AP_I2S_BCK (MTK_PIN_NO(74) | 6)
-+
-+#define MT7623_PIN_75_SDA0_FUNC_GPIO75 (MTK_PIN_NO(75) | 0)
-+#define MT7623_PIN_75_SDA0_FUNC_SDA0 (MTK_PIN_NO(75) | 1)
-+
-+#define MT7623_PIN_76_SCL0_FUNC_GPIO76 (MTK_PIN_NO(76) | 0)
-+#define MT7623_PIN_76_SCL0_FUNC_SCL0 (MTK_PIN_NO(76) | 1)
-+
-+#define MT7623_PIN_83_LCM_RST_FUNC_GPIO83 (MTK_PIN_NO(83) | 0)
-+#define MT7623_PIN_83_LCM_RST_FUNC_LCM_RST (MTK_PIN_NO(83) | 1)
-+
-+#define MT7623_PIN_84_DSI_TE_FUNC_GPIO84 (MTK_PIN_NO(84) | 0)
-+#define MT7623_PIN_84_DSI_TE_FUNC_DSI_TE (MTK_PIN_NO(84) | 1)
-+
-+#define MT7623_PIN_95_MIPI_TCN_FUNC_GPIO95 (MTK_PIN_NO(95) | 0)
-+#define MT7623_PIN_95_MIPI_TCN_FUNC_TCN (MTK_PIN_NO(95) | 1)
-+
-+#define MT7623_PIN_96_MIPI_TCP_FUNC_GPIO96 (MTK_PIN_NO(96) | 0)
-+#define MT7623_PIN_96_MIPI_TCP_FUNC_TCP (MTK_PIN_NO(96) | 1)
-+
-+#define MT7623_PIN_97_MIPI_TDN1_FUNC_GPIO97 (MTK_PIN_NO(97) | 0)
-+#define MT7623_PIN_97_MIPI_TDN1_FUNC_TDN1 (MTK_PIN_NO(97) | 1)
-+
-+#define MT7623_PIN_98_MIPI_TDP1_FUNC_GPIO98 (MTK_PIN_NO(98) | 0)
-+#define MT7623_PIN_98_MIPI_TDP1_FUNC_TDP1 (MTK_PIN_NO(98) | 1)
-+
-+#define MT7623_PIN_99_MIPI_TDN0_FUNC_GPIO99 (MTK_PIN_NO(99) | 0)
-+#define MT7623_PIN_99_MIPI_TDN0_FUNC_TDN0 (MTK_PIN_NO(99) | 1)
-+
-+#define MT7623_PIN_100_MIPI_TDP0_FUNC_GPIO100 (MTK_PIN_NO(100) | 0)
-+#define MT7623_PIN_100_MIPI_TDP0_FUNC_TDP0 (MTK_PIN_NO(100) | 1)
-+
-+#define MT7623_PIN_105_MSDC1_CMD_FUNC_GPIO105 (MTK_PIN_NO(105) | 0)
-+#define MT7623_PIN_105_MSDC1_CMD_FUNC_MSDC1_CMD (MTK_PIN_NO(105) | 1)
-+#define MT7623_PIN_105_MSDC1_CMD_FUNC_SDA1 (MTK_PIN_NO(105) | 3)
-+#define MT7623_PIN_105_MSDC1_CMD_FUNC_I2SOUT_BCK (MTK_PIN_NO(105) | 6)
-+
-+#define MT7623_PIN_106_MSDC1_CLK_FUNC_GPIO106 (MTK_PIN_NO(106) | 0)
-+#define MT7623_PIN_106_MSDC1_CLK_FUNC_MSDC1_CLK (MTK_PIN_NO(106) | 1)
-+#define MT7623_PIN_106_MSDC1_CLK_FUNC_SCL1 (MTK_PIN_NO(106) | 3)
-+#define MT7623_PIN_106_MSDC1_CLK_FUNC_I2SOUT_LRCK (MTK_PIN_NO(106) | 6)
-+
-+#define MT7623_PIN_107_MSDC1_DAT0_FUNC_GPIO107 (MTK_PIN_NO(107) | 0)
-+#define MT7623_PIN_107_MSDC1_DAT0_FUNC_MSDC1_DAT0 (MTK_PIN_NO(107) | 1)
-+#define MT7623_PIN_107_MSDC1_DAT0_FUNC_UTXD0 (MTK_PIN_NO(107) | 5)
-+#define MT7623_PIN_107_MSDC1_DAT0_FUNC_I2SOUT_DATA_OUT (MTK_PIN_NO(107) | 6)
-+
-+#define MT7623_PIN_108_MSDC1_DAT1_FUNC_GPIO108 (MTK_PIN_NO(108) | 0)
-+#define MT7623_PIN_108_MSDC1_DAT1_FUNC_MSDC1_DAT1 (MTK_PIN_NO(108) | 1)
-+#define MT7623_PIN_108_MSDC1_DAT1_FUNC_PWM0 (MTK_PIN_NO(108) | 3)
-+#define MT7623_PIN_108_MSDC1_DAT1_FUNC_URXD0 (MTK_PIN_NO(108) | 5)
-+#define MT7623_PIN_108_MSDC1_DAT1_FUNC_PWM1 (MTK_PIN_NO(108) | 6)
-+
-+#define MT7623_PIN_109_MSDC1_DAT2_FUNC_GPIO109 (MTK_PIN_NO(109) | 0)
-+#define MT7623_PIN_109_MSDC1_DAT2_FUNC_MSDC1_DAT2 (MTK_PIN_NO(109) | 1)
-+#define MT7623_PIN_109_MSDC1_DAT2_FUNC_SDA2 (MTK_PIN_NO(109) | 3)
-+#define MT7623_PIN_109_MSDC1_DAT2_FUNC_UTXD1 (MTK_PIN_NO(109) | 5)
-+#define MT7623_PIN_109_MSDC1_DAT2_FUNC_PWM2 (MTK_PIN_NO(109) | 6)
-+
-+#define MT7623_PIN_110_MSDC1_DAT3_FUNC_GPIO110 (MTK_PIN_NO(110) | 0)
-+#define MT7623_PIN_110_MSDC1_DAT3_FUNC_MSDC1_DAT3 (MTK_PIN_NO(110) | 1)
-+#define MT7623_PIN_110_MSDC1_DAT3_FUNC_SCL2 (MTK_PIN_NO(110) | 3)
-+#define MT7623_PIN_110_MSDC1_DAT3_FUNC_URXD1 (MTK_PIN_NO(110) | 5)
-+#define MT7623_PIN_110_MSDC1_DAT3_FUNC_PWM3 (MTK_PIN_NO(110) | 6)
-+
-+#define MT7623_PIN_111_MSDC0_DAT7_FUNC_GPIO111 (MTK_PIN_NO(111) | 0)
-+#define MT7623_PIN_111_MSDC0_DAT7_FUNC_MSDC0_DAT7 (MTK_PIN_NO(111) | 1)
-+#define MT7623_PIN_111_MSDC0_DAT7_FUNC_NLD7 (MTK_PIN_NO(111) | 4)
-+
-+#define MT7623_PIN_112_MSDC0_DAT6_FUNC_GPIO112 (MTK_PIN_NO(112) | 0)
-+#define MT7623_PIN_112_MSDC0_DAT6_FUNC_MSDC0_DAT6 (MTK_PIN_NO(112) | 1)
-+#define MT7623_PIN_112_MSDC0_DAT6_FUNC_NLD6 (MTK_PIN_NO(112) | 4)
-+
-+#define MT7623_PIN_113_MSDC0_DAT5_FUNC_GPIO113 (MTK_PIN_NO(113) | 0)
-+#define MT7623_PIN_113_MSDC0_DAT5_FUNC_MSDC0_DAT5 (MTK_PIN_NO(113) | 1)
-+#define MT7623_PIN_113_MSDC0_DAT5_FUNC_NLD5 (MTK_PIN_NO(113) | 4)
-+
-+#define MT7623_PIN_114_MSDC0_DAT4_FUNC_GPIO114 (MTK_PIN_NO(114) | 0)
-+#define MT7623_PIN_114_MSDC0_DAT4_FUNC_MSDC0_DAT4 (MTK_PIN_NO(114) | 1)
-+#define MT7623_PIN_114_MSDC0_DAT4_FUNC_NLD4 (MTK_PIN_NO(114) | 4)
-+
-+#define MT7623_PIN_115_MSDC0_RSTB_FUNC_GPIO115 (MTK_PIN_NO(115) | 0)
-+#define MT7623_PIN_115_MSDC0_RSTB_FUNC_MSDC0_RSTB (MTK_PIN_NO(115) | 1)
-+#define MT7623_PIN_115_MSDC0_RSTB_FUNC_NLD8 (MTK_PIN_NO(115) | 4)
-+
-+#define MT7623_PIN_116_MSDC0_CMD_FUNC_GPIO116 (MTK_PIN_NO(116) | 0)
-+#define MT7623_PIN_116_MSDC0_CMD_FUNC_MSDC0_CMD (MTK_PIN_NO(116) | 1)
-+#define MT7623_PIN_116_MSDC0_CMD_FUNC_NALE (MTK_PIN_NO(116) | 4)
-+
-+#define MT7623_PIN_117_MSDC0_CLK_FUNC_GPIO117 (MTK_PIN_NO(117) | 0)
-+#define MT7623_PIN_117_MSDC0_CLK_FUNC_MSDC0_CLK (MTK_PIN_NO(117) | 1)
-+#define MT7623_PIN_117_MSDC0_CLK_FUNC_NWEB (MTK_PIN_NO(117) | 4)
-+
-+#define MT7623_PIN_118_MSDC0_DAT3_FUNC_GPIO118 (MTK_PIN_NO(118) | 0)
-+#define MT7623_PIN_118_MSDC0_DAT3_FUNC_MSDC0_DAT3 (MTK_PIN_NO(118) | 1)
-+#define MT7623_PIN_118_MSDC0_DAT3_FUNC_NLD3 (MTK_PIN_NO(118) | 4)
-+
-+#define MT7623_PIN_119_MSDC0_DAT2_FUNC_GPIO119 (MTK_PIN_NO(119) | 0)
-+#define MT7623_PIN_119_MSDC0_DAT2_FUNC_MSDC0_DAT2 (MTK_PIN_NO(119) | 1)
-+#define MT7623_PIN_119_MSDC0_DAT2_FUNC_NLD2 (MTK_PIN_NO(119) | 4)
-+
-+#define MT7623_PIN_120_MSDC0_DAT1_FUNC_GPIO120 (MTK_PIN_NO(120) | 0)
-+#define MT7623_PIN_120_MSDC0_DAT1_FUNC_MSDC0_DAT1 (MTK_PIN_NO(120) | 1)
-+#define MT7623_PIN_120_MSDC0_DAT1_FUNC_NLD1 (MTK_PIN_NO(120) | 4)
-+
-+#define MT7623_PIN_121_MSDC0_DAT0_FUNC_GPIO121 (MTK_PIN_NO(121) | 0)
-+#define MT7623_PIN_121_MSDC0_DAT0_FUNC_MSDC0_DAT0 (MTK_PIN_NO(121) | 1)
-+#define MT7623_PIN_121_MSDC0_DAT0_FUNC_NLD0 (MTK_PIN_NO(121) | 4)
-+#define MT7623_PIN_121_MSDC0_DAT0_FUNC_WATCHDOG (MTK_PIN_NO(121) | 5)
-+
-+#define MT7623_PIN_122_GPIO122_FUNC_GPIO122 (MTK_PIN_NO(122) | 0)
-+#define MT7623_PIN_122_GPIO122_FUNC_TEST (MTK_PIN_NO(122) | 1)
-+#define MT7623_PIN_122_GPIO122_FUNC_SDA2 (MTK_PIN_NO(122) | 4)
-+#define MT7623_PIN_122_GPIO122_FUNC_URXD0 (MTK_PIN_NO(122) | 5)
-+
-+#define MT7623_PIN_123_GPIO123_FUNC_GPIO123 (MTK_PIN_NO(123) | 0)
-+#define MT7623_PIN_123_GPIO123_FUNC_TEST (MTK_PIN_NO(123) | 1)
-+#define MT7623_PIN_123_GPIO123_FUNC_SCL2 (MTK_PIN_NO(123) | 4)
-+#define MT7623_PIN_123_GPIO123_FUNC_UTXD0 (MTK_PIN_NO(123) | 5)
-+
-+#define MT7623_PIN_124_GPIO124_FUNC_GPIO124 (MTK_PIN_NO(124) | 0)
-+#define MT7623_PIN_124_GPIO124_FUNC_TEST (MTK_PIN_NO(124) | 1)
-+#define MT7623_PIN_124_GPIO124_FUNC_SDA1 (MTK_PIN_NO(124) | 4)
-+#define MT7623_PIN_124_GPIO124_FUNC_PWM3 (MTK_PIN_NO(124) | 5)
-+
-+#define MT7623_PIN_125_GPIO125_FUNC_GPIO125 (MTK_PIN_NO(125) | 0)
-+#define MT7623_PIN_125_GPIO125_FUNC_TEST (MTK_PIN_NO(125) | 1)
-+#define MT7623_PIN_125_GPIO125_FUNC_SCL1 (MTK_PIN_NO(125) | 4)
-+#define MT7623_PIN_125_GPIO125_FUNC_PWM4 (MTK_PIN_NO(125) | 5)
-+
-+#define MT7623_PIN_126_I2S0_MCLK_FUNC_GPIO126 (MTK_PIN_NO(126) | 0)
-+#define MT7623_PIN_126_I2S0_MCLK_FUNC_I2S0_MCLK (MTK_PIN_NO(126) | 1)
-+#define MT7623_PIN_126_I2S0_MCLK_FUNC_AP_I2S_MCLK (MTK_PIN_NO(126) | 6)
-+
-+#define MT7623_PIN_199_SPI1_CK_FUNC_GPIO199 (MTK_PIN_NO(199) | 0)
-+#define MT7623_PIN_199_SPI1_CK_FUNC_SPI1_CK (MTK_PIN_NO(199) | 1)
-+
-+#define MT7623_PIN_200_URXD2_FUNC_GPIO200 (MTK_PIN_NO(200) | 0)
-+#define MT7623_PIN_200_URXD2_FUNC_URXD2 (MTK_PIN_NO(200) | 6)
-+
-+#define MT7623_PIN_201_UTXD2_FUNC_GPIO201 (MTK_PIN_NO(201) | 0)
-+#define MT7623_PIN_201_UTXD2_FUNC_UTXD2 (MTK_PIN_NO(201) | 6)
-+
-+#define MT7623_PIN_203_PWM0_FUNC_GPIO203 (MTK_PIN_NO(203) | 0)
-+#define MT7623_PIN_203_PWM0_FUNC_PWM0 (MTK_PIN_NO(203) | 1)
-+#define MT7623_PIN_203_PWM0_FUNC_DISP_PWM (MTK_PIN_NO(203) | 2)
-+
-+#define MT7623_PIN_204_PWM1_FUNC_GPIO204 (MTK_PIN_NO(204) | 0)
-+#define MT7623_PIN_204_PWM1_FUNC_PWM1 (MTK_PIN_NO(204) | 1)
-+
-+#define MT7623_PIN_205_PWM2_FUNC_GPIO205 (MTK_PIN_NO(205) | 0)
-+#define MT7623_PIN_205_PWM2_FUNC_PWM2 (MTK_PIN_NO(205) | 1)
-+
-+#define MT7623_PIN_206_PWM3_FUNC_GPIO206 (MTK_PIN_NO(206) | 0)
-+#define MT7623_PIN_206_PWM3_FUNC_PWM3 (MTK_PIN_NO(206) | 1)
-+
-+#define MT7623_PIN_207_PWM4_FUNC_GPIO207 (MTK_PIN_NO(207) | 0)
-+#define MT7623_PIN_207_PWM4_FUNC_PWM4 (MTK_PIN_NO(207) | 1)
-+
-+#define MT7623_PIN_208_AUD_EXT_CK1_FUNC_GPIO208 (MTK_PIN_NO(208) | 0)
-+#define MT7623_PIN_208_AUD_EXT_CK1_FUNC_AUD_EXT_CK1 (MTK_PIN_NO(208) | 1)
-+#define MT7623_PIN_208_AUD_EXT_CK1_FUNC_PWM0 (MTK_PIN_NO(208) | 2)
-+#define MT7623_PIN_208_AUD_EXT_CK1_FUNC_PCIE0_PERST_N (MTK_PIN_NO(208) | 3)
-+#define MT7623_PIN_208_AUD_EXT_CK1_FUNC_DISP_PWM (MTK_PIN_NO(208) | 5)
-+
-+#define MT7623_PIN_209_AUD_EXT_CK2_FUNC_GPIO209 (MTK_PIN_NO(209) | 0)
-+#define MT7623_PIN_209_AUD_EXT_CK2_FUNC_AUD_EXT_CK2 (MTK_PIN_NO(209) | 1)
-+#define MT7623_PIN_209_AUD_EXT_CK2_FUNC_MSDC1_WP (MTK_PIN_NO(209) | 2)
-+#define MT7623_PIN_209_AUD_EXT_CK2_FUNC_PCIE1_PERST_N (MTK_PIN_NO(209) | 3)
-+#define MT7623_PIN_209_AUD_EXT_CK2_FUNC_PWM1 (MTK_PIN_NO(209) | 5)
-+
-+#define MT7623_PIN_236_EXT_SDIO3_FUNC_GPIO236 (MTK_PIN_NO(236) | 0)
-+#define MT7623_PIN_236_EXT_SDIO3_FUNC_EXT_SDIO3 (MTK_PIN_NO(236) | 1)
-+#define MT7623_PIN_236_EXT_SDIO3_FUNC_IDDIG (MTK_PIN_NO(236) | 2)
-+
-+#define MT7623_PIN_237_EXT_SDIO2_FUNC_GPIO237 (MTK_PIN_NO(237) | 0)
-+#define MT7623_PIN_237_EXT_SDIO2_FUNC_EXT_SDIO2 (MTK_PIN_NO(237) | 1)
-+#define MT7623_PIN_237_EXT_SDIO2_FUNC_DRV_VBUS (MTK_PIN_NO(237) | 2)
-+
-+#define MT7623_PIN_238_EXT_SDIO1_FUNC_GPIO238 (MTK_PIN_NO(238) | 0)
-+#define MT7623_PIN_238_EXT_SDIO1_FUNC_EXT_SDIO1 (MTK_PIN_NO(238) | 1)
-+
-+#define MT7623_PIN_239_EXT_SDIO0_FUNC_GPIO239 (MTK_PIN_NO(239) | 0)
-+#define MT7623_PIN_239_EXT_SDIO0_FUNC_EXT_SDIO0 (MTK_PIN_NO(239) | 1)
-+
-+#define MT7623_PIN_240_EXT_XCS_FUNC_GPIO240 (MTK_PIN_NO(240) | 0)
-+#define MT7623_PIN_240_EXT_XCS_FUNC_EXT_XCS (MTK_PIN_NO(240) | 1)
-+
-+#define MT7623_PIN_241_EXT_SCK_FUNC_GPIO241 (MTK_PIN_NO(241) | 0)
-+#define MT7623_PIN_241_EXT_SCK_FUNC_EXT_SCK (MTK_PIN_NO(241) | 1)
-+
-+#define MT7623_PIN_242_URTS2_FUNC_GPIO242 (MTK_PIN_NO(242) | 0)
-+#define MT7623_PIN_242_URTS2_FUNC_URTS2 (MTK_PIN_NO(242) | 1)
-+#define MT7623_PIN_242_URTS2_FUNC_UTXD3 (MTK_PIN_NO(242) | 2)
-+#define MT7623_PIN_242_URTS2_FUNC_URXD3 (MTK_PIN_NO(242) | 3)
-+#define MT7623_PIN_242_URTS2_FUNC_SCL1 (MTK_PIN_NO(242) | 4)
-+
-+#define MT7623_PIN_243_UCTS2_FUNC_GPIO243 (MTK_PIN_NO(243) | 0)
-+#define MT7623_PIN_243_UCTS2_FUNC_UCTS2 (MTK_PIN_NO(243) | 1)
-+#define MT7623_PIN_243_UCTS2_FUNC_URXD3 (MTK_PIN_NO(243) | 2)
-+#define MT7623_PIN_243_UCTS2_FUNC_UTXD3 (MTK_PIN_NO(243) | 3)
-+#define MT7623_PIN_243_UCTS2_FUNC_SDA1 (MTK_PIN_NO(243) | 4)
-+
-+#define MT7623_PIN_250_GPIO250_FUNC_GPIO250 (MTK_PIN_NO(250) | 0)
-+#define MT7623_PIN_250_GPIO250_FUNC_TEST_MD7 (MTK_PIN_NO(250) | 1)
-+#define MT7623_PIN_250_GPIO250_FUNC_PCIE0_CLKREQ_N (MTK_PIN_NO(250) | 6)
-+
-+#define MT7623_PIN_251_GPIO251_FUNC_GPIO251 (MTK_PIN_NO(251) | 0)
-+#define MT7623_PIN_251_GPIO251_FUNC_TEST_MD6 (MTK_PIN_NO(251) | 1)
-+#define MT7623_PIN_251_GPIO251_FUNC_PCIE0_WAKE_N (MTK_PIN_NO(251) | 6)
-+
-+#define MT7623_PIN_252_GPIO252_FUNC_GPIO252 (MTK_PIN_NO(252) | 0)
-+#define MT7623_PIN_252_GPIO252_FUNC_TEST_MD5 (MTK_PIN_NO(252) | 1)
-+#define MT7623_PIN_252_GPIO252_FUNC_PCIE1_CLKREQ_N (MTK_PIN_NO(252) | 6)
-+
-+#define MT7623_PIN_253_GPIO253_FUNC_GPIO253 (MTK_PIN_NO(253) | 0)
-+#define MT7623_PIN_253_GPIO253_FUNC_TEST_MD4 (MTK_PIN_NO(253) | 1)
-+#define MT7623_PIN_253_GPIO253_FUNC_PCIE1_WAKE_N (MTK_PIN_NO(253) | 6)
-+
-+#define MT7623_PIN_254_GPIO254_FUNC_GPIO254 (MTK_PIN_NO(254) | 0)
-+#define MT7623_PIN_254_GPIO254_FUNC_TEST_MD3 (MTK_PIN_NO(254) | 1)
-+#define MT7623_PIN_254_GPIO254_FUNC_PCIE2_CLKREQ_N (MTK_PIN_NO(254) | 6)
-+
-+#define MT7623_PIN_255_GPIO255_FUNC_GPIO255 (MTK_PIN_NO(255) | 0)
-+#define MT7623_PIN_255_GPIO255_FUNC_TEST_MD2 (MTK_PIN_NO(255) | 1)
-+#define MT7623_PIN_255_GPIO255_FUNC_PCIE2_WAKE_N (MTK_PIN_NO(255) | 6)
-+
-+#define MT7623_PIN_256_GPIO256_FUNC_GPIO256 (MTK_PIN_NO(256) | 0)
-+#define MT7623_PIN_256_GPIO256_FUNC_TEST_MD1 (MTK_PIN_NO(256) | 1)
-+
-+#define MT7623_PIN_257_GPIO257_FUNC_GPIO257 (MTK_PIN_NO(257) | 0)
-+#define MT7623_PIN_257_GPIO257_FUNC_TEST_MD0 (MTK_PIN_NO(257) | 1)
-+
-+#define MT7623_PIN_261_MSDC1_INS_FUNC_GPIO261 (MTK_PIN_NO(261) | 0)
-+#define MT7623_PIN_261_MSDC1_INS_FUNC_MSDC1_INS (MTK_PIN_NO(261) | 1)
-+
-+#define MT7623_PIN_262_G2_TXEN_FUNC_GPIO262 (MTK_PIN_NO(262) | 0)
-+#define MT7623_PIN_262_G2_TXEN_FUNC_G2_TXEN (MTK_PIN_NO(262) | 1)
-+
-+#define MT7623_PIN_263_G2_TXD3_FUNC_GPIO263 (MTK_PIN_NO(263) | 0)
-+#define MT7623_PIN_263_G2_TXD3_FUNC_G2_TXD3 (MTK_PIN_NO(263) | 1)
-+
-+#define MT7623_PIN_264_G2_TXD2_FUNC_GPIO264 (MTK_PIN_NO(264) | 0)
-+#define MT7623_PIN_264_G2_TXD2_FUNC_G2_TXD2 (MTK_PIN_NO(264) | 1)
-+
-+#define MT7623_PIN_265_G2_TXD1_FUNC_GPIO265 (MTK_PIN_NO(265) | 0)
-+#define MT7623_PIN_265_G2_TXD1_FUNC_G2_TXD1 (MTK_PIN_NO(265) | 1)
-+
-+#define MT7623_PIN_266_G2_TXD0_FUNC_GPIO266 (MTK_PIN_NO(266) | 0)
-+#define MT7623_PIN_266_G2_TXD0_FUNC_G2_TXD0 (MTK_PIN_NO(266) | 1)
-+
-+#define MT7623_PIN_267_G2_TXCLK_FUNC_GPIO267 (MTK_PIN_NO(267) | 0)
-+#define MT7623_PIN_267_G2_TXCLK_FUNC_G2_TXC (MTK_PIN_NO(267) | 1)
-+
-+#define MT7623_PIN_268_G2_RXCLK_FUNC_GPIO268 (MTK_PIN_NO(268) | 0)
-+#define MT7623_PIN_268_G2_RXCLK_FUNC_G2_RXC (MTK_PIN_NO(268) | 1)
-+
-+#define MT7623_PIN_269_G2_RXD0_FUNC_GPIO269 (MTK_PIN_NO(269) | 0)
-+#define MT7623_PIN_269_G2_RXD0_FUNC_G2_RXD0 (MTK_PIN_NO(269) | 1)
-+
-+#define MT7623_PIN_270_G2_RXD1_FUNC_GPIO270 (MTK_PIN_NO(270) | 0)
-+#define MT7623_PIN_270_G2_RXD1_FUNC_G2_RXD1 (MTK_PIN_NO(270) | 1)
-+
-+#define MT7623_PIN_271_G2_RXD2_FUNC_GPIO271 (MTK_PIN_NO(271) | 0)
-+#define MT7623_PIN_271_G2_RXD2_FUNC_G2_RXD2 (MTK_PIN_NO(271) | 1)
-+
-+#define MT7623_PIN_272_G2_RXD3_FUNC_GPIO272 (MTK_PIN_NO(272) | 0)
-+#define MT7623_PIN_272_G2_RXD3_FUNC_G2_RXD3 (MTK_PIN_NO(272) | 1)
-+
-+#define MT7623_PIN_274_G2_RXDV_FUNC_GPIO274 (MTK_PIN_NO(274) | 0)
-+#define MT7623_PIN_274_G2_RXDV_FUNC_G2_RXDV (MTK_PIN_NO(274) | 1)
-+
-+#define MT7623_PIN_275_G2_MDC_FUNC_GPIO275 (MTK_PIN_NO(275) | 0)
-+#define MT7623_PIN_275_G2_MDC_FUNC_MDC (MTK_PIN_NO(275) | 1)
-+
-+#define MT7623_PIN_276_G2_MDIO_FUNC_GPIO276 (MTK_PIN_NO(276) | 0)
-+#define MT7623_PIN_276_G2_MDIO_FUNC_MDIO (MTK_PIN_NO(276) | 1)
-+
-+#define MT7623_PIN_278_JTAG_RESET_FUNC_GPIO278 (MTK_PIN_NO(278) | 0)
-+#define MT7623_PIN_278_JTAG_RESET_FUNC_JTAG_RESET (MTK_PIN_NO(278) | 1)
-+
-+#endif /* __DTS_MT7623_PINFUNC_H */
-+
diff --git a/target/linux/mediatek/patches-4.4/0016-pinctrl-dt-bindings-Add-pinctrl-file-for-mt7623.patch b/target/linux/mediatek/patches-4.4/0016-pinctrl-dt-bindings-Add-pinctrl-file-for-mt7623.patch
deleted file mode 100644
index 3428fce..0000000
--- a/target/linux/mediatek/patches-4.4/0016-pinctrl-dt-bindings-Add-pinctrl-file-for-mt7623.patch
+++ /dev/null
@@ -1,2379 +0,0 @@
-From 641ccb565a934ffaa30b828f2361e6f57325c70a Mon Sep 17 00:00:00 2001
-From: John Crispin <blogic at openwrt.org>
-Date: Sat, 27 Jun 2015 13:13:05 +0200
-Subject: [PATCH 016/102] pinctrl: dt bindings: Add pinctrl file for mt7623
-
-Add the driver and header files required to make pinctrl work on MediaTek
-MT7623.
-
-Signed-off-by: John Crispin <blogic at openwrt.org>
----
- drivers/pinctrl/mediatek/Kconfig              |    6 +
- drivers/pinctrl/mediatek/Makefile             |    1 +
- drivers/pinctrl/mediatek/pinctrl-mt7623.c     |  380 +++++
- drivers/pinctrl/mediatek/pinctrl-mtk-mt7623.h | 1937 +++++++++++++++++++++++++
- include/dt-bindings/pinctrl/mt7623-pinfunc.h  |    3 +
- 5 files changed, 2327 insertions(+)
- create mode 100644 drivers/pinctrl/mediatek/pinctrl-mt7623.c
- create mode 100644 drivers/pinctrl/mediatek/pinctrl-mtk-mt7623.h
-
---- a/drivers/pinctrl/mediatek/Kconfig
-+++ b/drivers/pinctrl/mediatek/Kconfig
-@@ -15,6 +15,12 @@ config PINCTRL_MT2701
- 	default MACH_MT2701
- 	select PINCTRL_MTK_COMMON
- 
-+config PINCTRL_MT7623
-+	bool "Mediatek MT7623 pin control" if COMPILE_TEST && !MACH_MT7623
-+	depends on OF
-+	default MACH_MT7623
-+	select PINCTRL_MTK_COMMON
-+
- config PINCTRL_MT8135
- 	bool "Mediatek MT8135 pin control" if COMPILE_TEST && !MACH_MT8135
- 	depends on OF
---- a/drivers/pinctrl/mediatek/Makefile
-+++ b/drivers/pinctrl/mediatek/Makefile
-@@ -3,6 +3,7 @@ obj-$(CONFIG_PINCTRL_MTK_COMMON)	+= pinc
- 
- # SoC Drivers
- obj-$(CONFIG_PINCTRL_MT2701)		+= pinctrl-mt2701.o
-+obj-$(CONFIG_PINCTRL_MT7623)		+= pinctrl-mt7623.o
- obj-$(CONFIG_PINCTRL_MT8135)		+= pinctrl-mt8135.o
- obj-$(CONFIG_PINCTRL_MT8127)		+= pinctrl-mt8127.o
- obj-$(CONFIG_PINCTRL_MT8173)		+= pinctrl-mt8173.o
---- /dev/null
-+++ b/drivers/pinctrl/mediatek/pinctrl-mt7623.c
-@@ -0,0 +1,380 @@
-+/*
-+ * Copyright (c) 2016 John Crispin <blogic at openwrt.org>
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 as
-+ * published by the Free Software Foundation.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ */
-+
-+#include <dt-bindings/pinctrl/mt65xx.h>
-+#include <linux/module.h>
-+#include <linux/of.h>
-+#include <linux/of_device.h>
-+#include <linux/platform_device.h>
-+#include <linux/pinctrl/pinctrl.h>
-+#include <linux/regmap.h>
-+
-+#include "pinctrl-mtk-common.h"
-+#include "pinctrl-mtk-mt7623.h"
-+
-+static const struct mtk_drv_group_desc mt7623_drv_grp[] =  {
-+	/* 0E4E8SR 4/8/12/16 */
-+	MTK_DRV_GRP(4, 16, 1, 2, 4),
-+	/* 0E2E4SR  2/4/6/8 */
-+	MTK_DRV_GRP(2, 8, 1, 2, 2),
-+	/* E8E4E2  2/4/6/8/10/12/14/16 */
-+	MTK_DRV_GRP(2, 16, 0, 2, 2)
-+};
-+
-+#define DRV_SEL0	0xf50
-+#define DRV_SEL1	0xf60
-+#define DRV_SEL2	0xf70
-+#define DRV_SEL3	0xf80
-+#define DRV_SEL4	0xf90
-+#define DRV_SEL5	0xfa0
-+#define DRV_SEL6	0xfb0
-+#define DRV_SEL7	0xfe0
-+#define DRV_SEL8	0xfd0
-+#define DRV_SEL9	0xff0
-+#define DRV_SEL10	0xf00
-+
-+#define MSDC0_CTRL0	0xcc0
-+#define MSDC0_CTRL1	0xcd0
-+#define MSDC0_CTRL2	0xce0
-+#define MSDC0_CTRL3	0xcf0
-+#define MSDC0_CTRL4	0xd00
-+#define MSDC0_CTRL5	0xd10
-+#define MSDC0_CTRL6	0xd20
-+#define MSDC1_CTRL0	0xd30
-+#define MSDC1_CTRL1	0xd40
-+#define MSDC1_CTRL2	0xd50
-+#define MSDC1_CTRL3	0xd60
-+#define MSDC1_CTRL4	0xd70
-+#define MSDC1_CTRL5	0xd80
-+#define MSDC1_CTRL6	0xd90
-+
-+#define IES_EN0		0xb20
-+#define IES_EN1		0xb30
-+#define IES_EN2		0xb40
-+
-+#define SMT_EN0		0xb50
-+#define SMT_EN1		0xb60
-+#define SMT_EN2		0xb70
-+
-+static const struct mtk_pin_drv_grp mt7623_pin_drv[] = {
-+	MTK_PIN_DRV_GRP(0, DRV_SEL0, 0, 1),
-+	MTK_PIN_DRV_GRP(1, DRV_SEL0, 0, 1),
-+	MTK_PIN_DRV_GRP(2, DRV_SEL0, 0, 1),
-+	MTK_PIN_DRV_GRP(3, DRV_SEL0, 0, 1),
-+	MTK_PIN_DRV_GRP(4, DRV_SEL0, 0, 1),
-+	MTK_PIN_DRV_GRP(5, DRV_SEL0, 0, 1),
-+	MTK_PIN_DRV_GRP(6, DRV_SEL0, 0, 1),
-+	MTK_PIN_DRV_GRP(7, DRV_SEL0, 4, 1),
-+	MTK_PIN_DRV_GRP(8, DRV_SEL0, 4, 1),
-+	MTK_PIN_DRV_GRP(9, DRV_SEL0, 4, 1),
-+	MTK_PIN_DRV_GRP(10, DRV_SEL0, 8, 1),
-+	MTK_PIN_DRV_GRP(11, DRV_SEL0, 8, 1),
-+	MTK_PIN_DRV_GRP(12, DRV_SEL0, 8, 1),
-+	MTK_PIN_DRV_GRP(13, DRV_SEL0, 8, 1),
-+	MTK_PIN_DRV_GRP(14, DRV_SEL0, 12, 0),
-+	MTK_PIN_DRV_GRP(15, DRV_SEL0, 12, 0),
-+	MTK_PIN_DRV_GRP(18, DRV_SEL1, 4, 0),
-+	MTK_PIN_DRV_GRP(19, DRV_SEL1, 4, 0),
-+	MTK_PIN_DRV_GRP(20, DRV_SEL1, 4, 0),
-+	MTK_PIN_DRV_GRP(21, DRV_SEL1, 4, 0),
-+	MTK_PIN_DRV_GRP(22, DRV_SEL1, 8, 0),
-+	MTK_PIN_DRV_GRP(23, DRV_SEL1, 8, 0),
-+	MTK_PIN_DRV_GRP(24, DRV_SEL1, 8, 0),
-+	MTK_PIN_DRV_GRP(25, DRV_SEL1, 8, 0),
-+	MTK_PIN_DRV_GRP(26, DRV_SEL1, 8, 0),
-+	MTK_PIN_DRV_GRP(27, DRV_SEL1, 12, 0),
-+	MTK_PIN_DRV_GRP(28, DRV_SEL1, 12, 0),
-+	MTK_PIN_DRV_GRP(29, DRV_SEL1, 12, 0),
-+	MTK_PIN_DRV_GRP(33, DRV_SEL2, 0, 0),
-+	MTK_PIN_DRV_GRP(34, DRV_SEL2, 0, 0),
-+	MTK_PIN_DRV_GRP(35, DRV_SEL2, 0, 0),
-+	MTK_PIN_DRV_GRP(36, DRV_SEL2, 0, 0),
-+	MTK_PIN_DRV_GRP(37, DRV_SEL2, 0, 0),
-+	MTK_PIN_DRV_GRP(39, DRV_SEL2, 8, 1),
-+	MTK_PIN_DRV_GRP(40, DRV_SEL2, 8, 1),
-+	MTK_PIN_DRV_GRP(41, DRV_SEL2, 8, 1),
-+	MTK_PIN_DRV_GRP(42, DRV_SEL2, 8, 1),
-+	MTK_PIN_DRV_GRP(43, DRV_SEL2, 12, 0),
-+	MTK_PIN_DRV_GRP(44, DRV_SEL2, 12, 0),
-+	MTK_PIN_DRV_GRP(45, DRV_SEL2, 12, 0),
-+	MTK_PIN_DRV_GRP(47, DRV_SEL3, 0, 0),
-+	MTK_PIN_DRV_GRP(48, DRV_SEL3, 0, 0),
-+	MTK_PIN_DRV_GRP(49, DRV_SEL3, 4, 0),
-+	MTK_PIN_DRV_GRP(53, DRV_SEL3, 12, 0),
-+	MTK_PIN_DRV_GRP(54, DRV_SEL3, 12, 0),
-+	MTK_PIN_DRV_GRP(55, DRV_SEL3, 12, 0),
-+	MTK_PIN_DRV_GRP(56, DRV_SEL3, 12, 0),
-+	MTK_PIN_DRV_GRP(60, DRV_SEL4, 8, 1),
-+	MTK_PIN_DRV_GRP(61, DRV_SEL4, 8, 1),
-+	MTK_PIN_DRV_GRP(62, DRV_SEL4, 8, 1),
-+	MTK_PIN_DRV_GRP(63, DRV_SEL4, 12, 1),
-+	MTK_PIN_DRV_GRP(64, DRV_SEL4, 12, 1),
-+	MTK_PIN_DRV_GRP(65, DRV_SEL4, 12, 1),
-+	MTK_PIN_DRV_GRP(66, DRV_SEL5, 0, 1),
-+	MTK_PIN_DRV_GRP(67, DRV_SEL5, 0, 1),
-+	MTK_PIN_DRV_GRP(68, DRV_SEL5, 0, 1),
-+	MTK_PIN_DRV_GRP(69, DRV_SEL5, 0, 1),
-+	MTK_PIN_DRV_GRP(70, DRV_SEL5, 0, 1),
-+	MTK_PIN_DRV_GRP(71, DRV_SEL5, 0, 1),
-+	MTK_PIN_DRV_GRP(72, DRV_SEL3, 4, 0),
-+	MTK_PIN_DRV_GRP(73, DRV_SEL3, 4, 0),
-+	MTK_PIN_DRV_GRP(74, DRV_SEL3, 4, 0),
-+	MTK_PIN_DRV_GRP(83, DRV_SEL5, 0, 1),
-+	MTK_PIN_DRV_GRP(84, DRV_SEL5, 0, 1),
-+	MTK_PIN_DRV_GRP(105, MSDC1_CTRL1, 0, 1),
-+	MTK_PIN_DRV_GRP(106, MSDC1_CTRL0, 0, 1),
-+	MTK_PIN_DRV_GRP(107, MSDC1_CTRL2, 0, 1),
-+	MTK_PIN_DRV_GRP(108, MSDC1_CTRL2, 0, 1),
-+	MTK_PIN_DRV_GRP(109, MSDC1_CTRL2, 0, 1),
-+	MTK_PIN_DRV_GRP(110, MSDC1_CTRL2, 0, 1),
-+	MTK_PIN_DRV_GRP(111, MSDC0_CTRL2, 0, 1),
-+	MTK_PIN_DRV_GRP(112, MSDC0_CTRL2, 0, 1),
-+	MTK_PIN_DRV_GRP(113, MSDC0_CTRL2, 0, 1),
-+	MTK_PIN_DRV_GRP(114, MSDC0_CTRL2, 0, 1),
-+	MTK_PIN_DRV_GRP(115, MSDC0_CTRL2, 0, 1),
-+	MTK_PIN_DRV_GRP(116, MSDC0_CTRL1, 0, 1),
-+	MTK_PIN_DRV_GRP(117, MSDC0_CTRL0, 0, 1),
-+	MTK_PIN_DRV_GRP(118, MSDC0_CTRL2, 0, 1),
-+	MTK_PIN_DRV_GRP(119, MSDC0_CTRL2, 0, 1),
-+	MTK_PIN_DRV_GRP(120, MSDC0_CTRL2, 0, 1),
-+	MTK_PIN_DRV_GRP(121, MSDC0_CTRL2, 0, 1),
-+	MTK_PIN_DRV_GRP(126, DRV_SEL3, 4, 0),
-+	MTK_PIN_DRV_GRP(199, DRV_SEL0, 4, 1),
-+	MTK_PIN_DRV_GRP(200, DRV_SEL8, 0, 0),
-+	MTK_PIN_DRV_GRP(201, DRV_SEL8, 0, 0),
-+	MTK_PIN_DRV_GRP(203, DRV_SEL8, 4, 0),
-+	MTK_PIN_DRV_GRP(204, DRV_SEL8, 4, 0),
-+	MTK_PIN_DRV_GRP(205, DRV_SEL8, 4, 0),
-+	MTK_PIN_DRV_GRP(206, DRV_SEL8, 4, 0),
-+	MTK_PIN_DRV_GRP(207, DRV_SEL8, 4, 0),
-+	MTK_PIN_DRV_GRP(208, DRV_SEL8, 8, 0),
-+	MTK_PIN_DRV_GRP(209, DRV_SEL8, 8, 0),
-+	MTK_PIN_DRV_GRP(236, DRV_SEL9, 4, 0),
-+	MTK_PIN_DRV_GRP(237, DRV_SEL9, 4, 0),
-+	MTK_PIN_DRV_GRP(238, DRV_SEL9, 4, 0),
-+	MTK_PIN_DRV_GRP(239, DRV_SEL9, 4, 0),
-+	MTK_PIN_DRV_GRP(240, DRV_SEL9, 4, 0),
-+	MTK_PIN_DRV_GRP(241, DRV_SEL9, 4, 0),
-+	MTK_PIN_DRV_GRP(242, DRV_SEL9, 8, 0),
-+	MTK_PIN_DRV_GRP(243, DRV_SEL9, 8, 0),
-+	MTK_PIN_DRV_GRP(257, MSDC0_CTRL2, 0, 1),
-+	MTK_PIN_DRV_GRP(261, MSDC1_CTRL2, 0, 1),
-+	MTK_PIN_DRV_GRP(262, DRV_SEL10, 8, 0),
-+	MTK_PIN_DRV_GRP(263, DRV_SEL10, 8, 0),
-+	MTK_PIN_DRV_GRP(264, DRV_SEL10, 8, 0),
-+	MTK_PIN_DRV_GRP(265, DRV_SEL10, 8, 0),
-+	MTK_PIN_DRV_GRP(266, DRV_SEL10, 8, 0),
-+	MTK_PIN_DRV_GRP(267, DRV_SEL10, 8, 0),
-+	MTK_PIN_DRV_GRP(268, DRV_SEL10, 8, 0),
-+	MTK_PIN_DRV_GRP(269, DRV_SEL10, 8, 0),
-+	MTK_PIN_DRV_GRP(270, DRV_SEL10, 8, 0),
-+	MTK_PIN_DRV_GRP(271, DRV_SEL10, 8, 0),
-+	MTK_PIN_DRV_GRP(272, DRV_SEL10, 8, 0),
-+	MTK_PIN_DRV_GRP(274, DRV_SEL10, 8, 0),
-+	MTK_PIN_DRV_GRP(275, DRV_SEL10, 8, 0),
-+	MTK_PIN_DRV_GRP(276, DRV_SEL10, 8, 0),
-+	MTK_PIN_DRV_GRP(278, DRV_SEL2, 8, 1),
-+};
-+
-+static const struct mtk_pin_spec_pupd_set_samereg mt7623_spec_pupd[] = {
-+	MTK_PIN_PUPD_SPEC_SR(105, MSDC1_CTRL1, 8, 9, 10),
-+	MTK_PIN_PUPD_SPEC_SR(106, MSDC1_CTRL0, 8, 9, 10),
-+	MTK_PIN_PUPD_SPEC_SR(107, MSDC1_CTRL3, 0, 1, 2),
-+	MTK_PIN_PUPD_SPEC_SR(108, MSDC1_CTRL3, 4, 5, 6),
-+	MTK_PIN_PUPD_SPEC_SR(109, MSDC1_CTRL3, 8, 9, 10),
-+	MTK_PIN_PUPD_SPEC_SR(110, MSDC1_CTRL3, 12, 13, 14),
-+	MTK_PIN_PUPD_SPEC_SR(111, MSDC0_CTRL4, 12, 13, 14),
-+	MTK_PIN_PUPD_SPEC_SR(112, MSDC0_CTRL4, 8, 9, 10),
-+	MTK_PIN_PUPD_SPEC_SR(113, MSDC0_CTRL4, 4, 5, 6),
-+	MTK_PIN_PUPD_SPEC_SR(114, MSDC0_CTRL4, 0, 1, 2),
-+	MTK_PIN_PUPD_SPEC_SR(115, MSDC0_CTRL5, 0, 1, 2),
-+	MTK_PIN_PUPD_SPEC_SR(116, MSDC0_CTRL1, 8, 9, 10),
-+	MTK_PIN_PUPD_SPEC_SR(117, MSDC0_CTRL0, 8, 9, 10),
-+	MTK_PIN_PUPD_SPEC_SR(118, MSDC0_CTRL3, 12, 13, 14),
-+	MTK_PIN_PUPD_SPEC_SR(119, MSDC0_CTRL3, 8, 9, 10),
-+	MTK_PIN_PUPD_SPEC_SR(120, MSDC0_CTRL3, 4, 5, 6),
-+	MTK_PIN_PUPD_SPEC_SR(121, MSDC0_CTRL3, 0, 1, 2),
-+};
-+
-+static int mt7623_spec_pull_set(struct regmap *regmap, unsigned int pin,
-+		unsigned char align, bool isup, unsigned int r1r0)
-+{
-+	return mtk_pctrl_spec_pull_set_samereg(regmap, mt7623_spec_pupd,
-+		ARRAY_SIZE(mt7623_spec_pupd), pin, align, isup, r1r0);
-+}
-+
-+static const struct mtk_pin_ies_smt_set mt7623_ies_set[] = {
-+	MTK_PIN_IES_SMT_SPEC(0, 6, IES_EN0, 0),
-+	MTK_PIN_IES_SMT_SPEC(7, 9, IES_EN0, 1),
-+	MTK_PIN_IES_SMT_SPEC(10, 13, IES_EN0, 2),
-+	MTK_PIN_IES_SMT_SPEC(14, 15, IES_EN0, 3),
-+	MTK_PIN_IES_SMT_SPEC(18, 21, IES_EN0, 5),
-+	MTK_PIN_IES_SMT_SPEC(22, 26, IES_EN0, 6),
-+	MTK_PIN_IES_SMT_SPEC(27, 29, IES_EN0, 7),
-+	MTK_PIN_IES_SMT_SPEC(33, 37, IES_EN0, 8),
-+	MTK_PIN_IES_SMT_SPEC(39, 42, IES_EN0, 9),
-+	MTK_PIN_IES_SMT_SPEC(43, 45, IES_EN0, 10),
-+	MTK_PIN_IES_SMT_SPEC(47, 48, IES_EN0, 11),
-+	MTK_PIN_IES_SMT_SPEC(49, 49, IES_EN0, 12),
-+	MTK_PIN_IES_SMT_SPEC(53, 56, IES_EN0, 14),
-+	MTK_PIN_IES_SMT_SPEC(60, 62, IES_EN1, 0),
-+	MTK_PIN_IES_SMT_SPEC(63, 65, IES_EN1, 1),
-+	MTK_PIN_IES_SMT_SPEC(66, 71, IES_EN1, 2),
-+	MTK_PIN_IES_SMT_SPEC(72, 74, IES_EN0, 12),
-+	MTK_PIN_IES_SMT_SPEC(75, 76, IES_EN1, 3),
-+	MTK_PIN_IES_SMT_SPEC(83, 84, IES_EN1, 2),
-+	MTK_PIN_IES_SMT_SPEC(105, 121, MSDC1_CTRL1, 4),
-+	MTK_PIN_IES_SMT_SPEC(122, 125, IES_EN1, 7),
-+	MTK_PIN_IES_SMT_SPEC(126, 126, IES_EN0, 12),
-+	MTK_PIN_IES_SMT_SPEC(199, 201, IES_EN0, 1),
-+	MTK_PIN_IES_SMT_SPEC(203, 207, IES_EN2, 2),
-+	MTK_PIN_IES_SMT_SPEC(208, 209, IES_EN2, 3),
-+	MTK_PIN_IES_SMT_SPEC(236, 241, IES_EN2, 6),
-+	MTK_PIN_IES_SMT_SPEC(242, 243, IES_EN2, 7),
-+	MTK_PIN_IES_SMT_SPEC(261, 261, MSDC1_CTRL2, 4),
-+	MTK_PIN_IES_SMT_SPEC(262, 272, IES_EN2, 12),
-+	MTK_PIN_IES_SMT_SPEC(274, 276, IES_EN2, 12),
-+	MTK_PIN_IES_SMT_SPEC(278, 278, IES_EN2, 13),
-+};
-+
-+static const struct mtk_pin_ies_smt_set mt7623_smt_set[] = {
-+	MTK_PIN_IES_SMT_SPEC(0, 6, SMT_EN0, 0),
-+	MTK_PIN_IES_SMT_SPEC(7, 9, SMT_EN0, 1),
-+	MTK_PIN_IES_SMT_SPEC(10, 13, SMT_EN0, 2),
-+	MTK_PIN_IES_SMT_SPEC(14, 15, SMT_EN0, 3),
-+	MTK_PIN_IES_SMT_SPEC(18, 21, SMT_EN0, 5),
-+	MTK_PIN_IES_SMT_SPEC(22, 26, SMT_EN0, 6),
-+	MTK_PIN_IES_SMT_SPEC(27, 29, SMT_EN0, 7),
-+	MTK_PIN_IES_SMT_SPEC(33, 37, SMT_EN0, 8),
-+	MTK_PIN_IES_SMT_SPEC(39, 42, SMT_EN0, 9),
-+	MTK_PIN_IES_SMT_SPEC(43, 45, SMT_EN0, 10),
-+	MTK_PIN_IES_SMT_SPEC(47, 48, SMT_EN0, 11),
-+	MTK_PIN_IES_SMT_SPEC(49, 49, SMT_EN0, 12),
-+	MTK_PIN_IES_SMT_SPEC(53, 56, SMT_EN0, 14),
-+	MTK_PIN_IES_SMT_SPEC(60, 62, SMT_EN1, 0),
-+	MTK_PIN_IES_SMT_SPEC(63, 65, SMT_EN1, 1),
-+	MTK_PIN_IES_SMT_SPEC(66, 71, SMT_EN1, 2),
-+	MTK_PIN_IES_SMT_SPEC(72, 74, SMT_EN0, 12),
-+	MTK_PIN_IES_SMT_SPEC(75, 76, SMT_EN1, 3),
-+	MTK_PIN_IES_SMT_SPEC(83, 84, SMT_EN1, 2),
-+	MTK_PIN_IES_SMT_SPEC(105, 106, MSDC1_CTRL1, 11),
-+	MTK_PIN_IES_SMT_SPEC(107, 107, MSDC1_CTRL3, 3),
-+	MTK_PIN_IES_SMT_SPEC(108, 108, MSDC1_CTRL3, 7),
-+	MTK_PIN_IES_SMT_SPEC(109, 109, MSDC1_CTRL3, 11),
-+	MTK_PIN_IES_SMT_SPEC(110, 111, MSDC1_CTRL3, 15),
-+	MTK_PIN_IES_SMT_SPEC(112, 112, MSDC0_CTRL4, 11),
-+	MTK_PIN_IES_SMT_SPEC(113, 113, MSDC0_CTRL4, 7),
-+	MTK_PIN_IES_SMT_SPEC(114, 115, MSDC0_CTRL4, 3),
-+	MTK_PIN_IES_SMT_SPEC(116, 117, MSDC0_CTRL1, 11),
-+	MTK_PIN_IES_SMT_SPEC(118, 118, MSDC0_CTRL3, 15),
-+	MTK_PIN_IES_SMT_SPEC(119, 119, MSDC0_CTRL3, 11),
-+	MTK_PIN_IES_SMT_SPEC(120, 120, MSDC0_CTRL3, 7),
-+	MTK_PIN_IES_SMT_SPEC(121, 121, MSDC0_CTRL3, 3),
-+	MTK_PIN_IES_SMT_SPEC(122, 125, SMT_EN1, 7),
-+	MTK_PIN_IES_SMT_SPEC(126, 126, SMT_EN0, 12),
-+	MTK_PIN_IES_SMT_SPEC(199, 201, SMT_EN0, 1),
-+	MTK_PIN_IES_SMT_SPEC(203, 207, SMT_EN2, 2),
-+	MTK_PIN_IES_SMT_SPEC(208, 209, SMT_EN2, 3),
-+	MTK_PIN_IES_SMT_SPEC(236, 241, SMT_EN2, 6),
-+	MTK_PIN_IES_SMT_SPEC(242, 243, SMT_EN2, 7),
-+	MTK_PIN_IES_SMT_SPEC(261, 261, MSDC1_CTRL6, 3),
-+	MTK_PIN_IES_SMT_SPEC(262, 272, SMT_EN2, 12),
-+	MTK_PIN_IES_SMT_SPEC(274, 276, SMT_EN2, 12),
-+	MTK_PIN_IES_SMT_SPEC(278, 278, SMT_EN2, 13),
-+};
-+
-+static int mt7623_ies_smt_set(struct regmap *regmap, unsigned int pin,
-+		unsigned char align, int value, enum pin_config_param arg)
-+{
-+	if (arg == PIN_CONFIG_INPUT_ENABLE)
-+		return mtk_pconf_spec_set_ies_smt_range(regmap, mt7623_ies_set,
-+			ARRAY_SIZE(mt7623_ies_set), pin, align, value);
-+	else if (arg == PIN_CONFIG_INPUT_SCHMITT_ENABLE)
-+		return mtk_pconf_spec_set_ies_smt_range(regmap, mt7623_smt_set,
-+			ARRAY_SIZE(mt7623_smt_set), pin, align, value);
-+	return -EINVAL;
-+}
-+
-+static const struct mtk_pinctrl_devdata mt7623_pinctrl_data = {
-+	.pins = mtk_pins_mt7623,
-+	.npins = ARRAY_SIZE(mtk_pins_mt7623),
-+	.grp_desc = mt7623_drv_grp,
-+	.n_grp_cls = ARRAY_SIZE(mt7623_drv_grp),
-+	.pin_drv_grp = mt7623_pin_drv,
-+	.n_pin_drv_grps = ARRAY_SIZE(mt7623_pin_drv),
-+	.spec_pull_set = mt7623_spec_pull_set,
-+	.spec_ies_smt_set = mt7623_ies_smt_set,
-+	.dir_offset = 0x0000,
-+	.pullen_offset = 0x0150,
-+	.pullsel_offset = 0x0280,
-+	.dout_offset = 0x0500,
-+	.din_offset = 0x0630,
-+	.pinmux_offset = 0x0760,
-+	.type1_start = 280,
-+	.type1_end = 280,
-+	.port_shf = 4,
-+	.port_mask = 0x1f,
-+	.port_align = 4,
-+	.eint_offsets = {
-+		.name = "mt7623_eint",
-+		.stat      = 0x000,
-+		.ack       = 0x040,
-+		.mask      = 0x080,
-+		.mask_set  = 0x0c0,
-+		.mask_clr  = 0x100,
-+		.sens      = 0x140,
-+		.sens_set  = 0x180,
-+		.sens_clr  = 0x1c0,
-+		.soft      = 0x200,
-+		.soft_set  = 0x240,
-+		.soft_clr  = 0x280,
-+		.pol       = 0x300,
-+		.pol_set   = 0x340,
-+		.pol_clr   = 0x380,
-+		.dom_en    = 0x400,
-+		.dbnc_ctrl = 0x500,
-+		.dbnc_set  = 0x600,
-+		.dbnc_clr  = 0x700,
-+		.port_mask = 6,
-+		.ports     = 6,
-+	},
-+	.ap_num = 169,
-+	.db_cnt = 16,
-+};
-+
-+static int mt7623_pinctrl_probe(struct platform_device *pdev)
-+{
-+	return mtk_pctrl_init(pdev, &mt7623_pinctrl_data, NULL);
-+}
-+
-+static const struct of_device_id mt7623_pctrl_match[] = {
-+	{ .compatible = "mediatek,mt7623-pinctrl", },
-+	{}
-+};
-+MODULE_DEVICE_TABLE(of, mt7623_pctrl_match);
-+
-+static struct platform_driver mtk_pinctrl_driver = {
-+	.probe = mt7623_pinctrl_probe,
-+	.driver = {
-+		.name = "mediatek-mt7623-pinctrl",
-+		.owner = THIS_MODULE,
-+		.of_match_table = mt7623_pctrl_match,
-+	},
-+};
-+
-+static int __init mtk_pinctrl_init(void)
-+{
-+	return platform_driver_register(&mtk_pinctrl_driver);
-+}
-+
-+arch_initcall(mtk_pinctrl_init);
---- /dev/null
-+++ b/drivers/pinctrl/mediatek/pinctrl-mtk-mt7623.h
-@@ -0,0 +1,1937 @@
-+/*
-+ * Copyright (c) 2016 John Crispin <blogic at openwrt.org>
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 as
-+ * published by the Free Software Foundation.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ */
-+
-+#ifndef __PINCTRL_MTK_MT7623_H
-+#define __PINCTRL_MTK_MT7623_H
-+
-+#include <linux/pinctrl/pinctrl.h>
-+#include "pinctrl-mtk-common.h"
-+
-+static const struct mtk_desc_pin mtk_pins_mt7623[] = {
-+	MTK_PIN(
-+		PINCTRL_PIN(0, "PWRAP_SPI0_MI"),
-+		"J20", "mt7623",
-+		MTK_EINT_FUNCTION(0, 148),
-+		MTK_FUNCTION(0, "GPIO0"),
-+		MTK_FUNCTION(1, "PWRAP_SPIDO"),
-+		MTK_FUNCTION(2, "PWRAP_SPIDI")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(1, "PWRAP_SPI0_MO"),
-+		"D10", "mt7623",
-+		MTK_EINT_FUNCTION(0, 149),
-+		MTK_FUNCTION(0, "GPIO1"),
-+		MTK_FUNCTION(1, "PWRAP_SPIDI"),
-+		MTK_FUNCTION(2, "PWRAP_SPIDO")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(2, "PWRAP_INT"),
-+		"E11", "mt7623",
-+		MTK_EINT_FUNCTION(0, 150),
-+		MTK_FUNCTION(0, "GPIO2"),
-+		MTK_FUNCTION(1, "PWRAP_INT")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(3, "PWRAP_SPI0_CK"),
-+		"H12", "mt7623",
-+		MTK_EINT_FUNCTION(0, 151),
-+		MTK_FUNCTION(0, "GPIO3"),
-+		MTK_FUNCTION(1, "PWRAP_SPICK_I")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(4, "PWRAP_SPI0_CSN"),
-+		"E12", "mt7623",
-+		MTK_EINT_FUNCTION(0, 152),
-+		MTK_FUNCTION(0, "GPIO4"),
-+		MTK_FUNCTION(1, "PWRAP_SPICS_B_I")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(5, "PWRAP_SPI0_CK2"),
-+		"H11", "mt7623",
-+		MTK_EINT_FUNCTION(0, 155),
-+		MTK_FUNCTION(0, "GPIO5"),
-+		MTK_FUNCTION(1, "PWRAP_SPICK2_I")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(6, "PWRAP_SPI0_CSN2"),
-+		"G11", "mt7623",
-+		MTK_EINT_FUNCTION(0, 156),
-+		MTK_FUNCTION(0, "GPIO6"),
-+		MTK_FUNCTION(1, "PWRAP_SPICS2_B_I")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(7, "SPI1_CSN"),
-+		"G19", "mt7623",
-+		MTK_EINT_FUNCTION(0, 153),
-+		MTK_FUNCTION(0, "GPIO7"),
-+		MTK_FUNCTION(1, "SPI1_CS")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(8, "SPI1_MI"),
-+		"F19", "mt7623",
-+		MTK_EINT_FUNCTION(0, 154),
-+		MTK_FUNCTION(0, "GPIO8"),
-+		MTK_FUNCTION(1, "SPI1_MI"),
-+		MTK_FUNCTION(2, "SPI1_MO")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(9, "SPI1_MO"),
-+		"G20", "mt7623",
-+		MTK_EINT_FUNCTION(0, 157),
-+		MTK_FUNCTION(0, "GPIO9"),
-+		MTK_FUNCTION(1, "SPI1_MO"),
-+		MTK_FUNCTION(2, "SPI1_MI")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(10, "RTC32K_CK"),
-+		"A13", "mt7623",
-+		MTK_EINT_FUNCTION(0, 158),
-+		MTK_FUNCTION(0, "GPIO10"),
-+		MTK_FUNCTION(1, "RTC32K_CK")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(11, "WATCHDOG"),
-+		"D14", "mt7623",
-+		MTK_EINT_FUNCTION(0, 159),
-+		MTK_FUNCTION(0, "GPIO11"),
-+		MTK_FUNCTION(1, "WATCHDOG")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(12, "SRCLKENA"),
-+		"C13", "mt7623",
-+		MTK_EINT_FUNCTION(0, 169),
-+		MTK_FUNCTION(0, "GPIO12"),
-+		MTK_FUNCTION(1, "SRCLKENA")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(13, "SRCLKENAI"),
-+		"B13", "mt7623",
-+		MTK_EINT_FUNCTION(0, 161),
-+		MTK_FUNCTION(0, "GPIO13"),
-+		MTK_FUNCTION(1, "SRCLKENAI")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(14, "GPIO14"),
-+		"E18", "mt7623",
-+		MTK_EINT_FUNCTION(0, 162),
-+		MTK_FUNCTION(0, "GPIO14"),
-+		MTK_FUNCTION(1, "URXD2"),
-+		MTK_FUNCTION(2, "UTXD2")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(15, "GPIO15"),
-+		"E17", "mt7623",
-+		MTK_EINT_FUNCTION(0, 163),
-+		MTK_FUNCTION(0, "GPIO15"),
-+		MTK_FUNCTION(1, "UTXD2"),
-+		MTK_FUNCTION(2, "URXD2")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(16, "GPIO16"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO16")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(17, "GPIO17"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO17")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(18, "PCM_CLK"),
-+		"C19", "mt7623",
-+		MTK_EINT_FUNCTION(0, 166),
-+		MTK_FUNCTION(0, "GPIO18"),
-+		MTK_FUNCTION(1, "PCM_CLK0"),
-+		MTK_FUNCTION(6, "AP_PCM_CLKO")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(19, "PCM_SYNC"),
-+		"D19", "mt7623",
-+		MTK_EINT_FUNCTION(0, 167),
-+		MTK_FUNCTION(0, "GPIO19"),
-+		MTK_FUNCTION(1, "PCM_SYNC"),
-+		MTK_FUNCTION(6, "AP_PCM_SYNC")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(20, "PCM_RX"),
-+		"D18", "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO20"),
-+		MTK_FUNCTION(1, "PCM_RX"),
-+		MTK_FUNCTION(4, "PCM_TX"),
-+		MTK_FUNCTION(6, "AP_PCM_RX")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(21, "PCM_TX"),
-+		"C18", "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO21"),
-+		MTK_FUNCTION(1, "PCM_TX"),
-+		MTK_FUNCTION(4, "PCM_RX"),
-+		MTK_FUNCTION(6, "AP_PCM_TX")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(22, "EINT0"),
-+		"H15", "mt7623",
-+		MTK_EINT_FUNCTION(0, 0),
-+		MTK_FUNCTION(0, "GPIO22"),
-+		MTK_FUNCTION(1, "UCTS0"),
-+		MTK_FUNCTION(2, "PCIE0_PERST_N")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(23, "EINT1"),
-+		"J16", "mt7623",
-+		MTK_EINT_FUNCTION(0, 1),
-+		MTK_FUNCTION(0, "GPIO23"),
-+		MTK_FUNCTION(1, "URTS0"),
-+		MTK_FUNCTION(2, "PCIE1_PERST_N")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(24, "EINT2"),
-+		"H16", "mt7623",
-+		MTK_EINT_FUNCTION(0, 2),
-+		MTK_FUNCTION(0, "GPIO24"),
-+		MTK_FUNCTION(1, "UCTS1"),
-+		MTK_FUNCTION(2, "PCIE2_PERST_N")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(25, "EINT3"),
-+		"K15", "mt7623",
-+		MTK_EINT_FUNCTION(0, 3),
-+		MTK_FUNCTION(0, "GPIO25"),
-+		MTK_FUNCTION(1, "URTS1")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(26, "EINT4"),
-+		"G15", "mt7623",
-+		MTK_EINT_FUNCTION(0, 4),
-+		MTK_FUNCTION(0, "GPIO26"),
-+		MTK_FUNCTION(1, "UCTS3"),
-+		MTK_FUNCTION(6, "PCIE2_WAKE_N")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(27, "EINT5"),
-+		"F15", "mt7623",
-+		MTK_EINT_FUNCTION(0, 5),
-+		MTK_FUNCTION(0, "GPIO27"),
-+		MTK_FUNCTION(1, "URTS3"),
-+		MTK_FUNCTION(6, "PCIE1_WAKE_N")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(28, "EINT6"),
-+		"J15", "mt7623",
-+		MTK_EINT_FUNCTION(0, 6),
-+		MTK_FUNCTION(0, "GPIO28"),
-+		MTK_FUNCTION(1, "DRV_VBUS"),
-+		MTK_FUNCTION(6, "PCIE0_WAKE_N")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(29, "EINT7"),
-+		"E15", "mt7623",
-+		MTK_EINT_FUNCTION(0, 7),
-+		MTK_FUNCTION(0, "GPIO29"),
-+		MTK_FUNCTION(1, "IDDIG"),
-+		MTK_FUNCTION(2, "MSDC1_WP"),
-+		MTK_FUNCTION(6, "PCIE2_PERST_N")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(30, "GPIO30"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO30")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(31, "GPIO31"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO31")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(32, "GPIO32"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO32")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(33, "I2S1_DATA"),
-+		"Y18", "mt7623",
-+		MTK_EINT_FUNCTION(0, 15),
-+		MTK_FUNCTION(0, "GPIO33"),
-+		MTK_FUNCTION(1, "I2S1_DATA"),
-+		MTK_FUNCTION(3, "PCM_TX"),
-+		MTK_FUNCTION(6, "AP_PCM_TX")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(34, "I2S1_DATA_IN"),
-+		"Y17", "mt7623",
-+		MTK_EINT_FUNCTION(0, 16),
-+		MTK_FUNCTION(0, "GPIO34"),
-+		MTK_FUNCTION(1, "I2S1_DATA_IN"),
-+		MTK_FUNCTION(3, "PCM_RX"),
-+		MTK_FUNCTION(6, "AP_PCM_RX")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(35, "I2S1_BCK"),
-+		"V17", "mt7623",
-+		MTK_EINT_FUNCTION(0, 17),
-+		MTK_FUNCTION(0, "GPIO35"),
-+		MTK_FUNCTION(1, "I2S1_BCK"),
-+		MTK_FUNCTION(3, "PCM_CLK0"),
-+		MTK_FUNCTION(6, "AP_PCM_CLKO")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(36, "I2S1_LRCK"),
-+		"W17", "mt7623",
-+		MTK_EINT_FUNCTION(0, 18),
-+		MTK_FUNCTION(0, "GPIO36"),
-+		MTK_FUNCTION(1, "I2S1_LRCK"),
-+		MTK_FUNCTION(3, "PCM_SYNC"),
-+		MTK_FUNCTION(6, "AP_PCM_SYNC")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(37, "I2S1_MCLK"),
-+		"AA18", "mt7623",
-+		MTK_EINT_FUNCTION(0, 19),
-+		MTK_FUNCTION(0, "GPIO37"),
-+		MTK_FUNCTION(1, "I2S1_MCLK")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(38, "GPIO38"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO38")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(39, "JTMS"),
-+		"G21", "mt7623",
-+		MTK_EINT_FUNCTION(0, 21),
-+		MTK_FUNCTION(0, "GPIO39"),
-+		MTK_FUNCTION(1, "JTMS")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(40, "GPIO40"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO40")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(41, "JTDI"),
-+		"H22", "mt7623",
-+		MTK_EINT_FUNCTION(0, 23),
-+		MTK_FUNCTION(0, "GPIO41"),
-+		MTK_FUNCTION(1, "JTDI")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(42, "JTDO"),
-+		"H21", "mt7623",
-+		MTK_EINT_FUNCTION(0, 24),
-+		MTK_FUNCTION(0, "GPIO42"),
-+		MTK_FUNCTION(1, "JTDO")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(43, "NCLE"),
-+		"C7", "mt7623",
-+		MTK_EINT_FUNCTION(0, 25),
-+		MTK_FUNCTION(0, "GPIO43"),
-+		MTK_FUNCTION(1, "NCLE"),
-+		MTK_FUNCTION(2, "EXT_XCS2")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(44, "NCEB1"),
-+		"C6", "mt7623",
-+		MTK_EINT_FUNCTION(0, 26),
-+		MTK_FUNCTION(0, "GPIO44"),
-+		MTK_FUNCTION(1, "NCEB1"),
-+		MTK_FUNCTION(2, "IDDIG")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(45, "NCEB0"),
-+		"D7", "mt7623",
-+		MTK_EINT_FUNCTION(0, 27),
-+		MTK_FUNCTION(0, "GPIO45"),
-+		MTK_FUNCTION(1, "NCEB0"),
-+		MTK_FUNCTION(2, "DRV_VBUS")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(46, "IR"),
-+		"D15", "mt7623",
-+		MTK_EINT_FUNCTION(0, 28),
-+		MTK_FUNCTION(0, "GPIO46"),
-+		MTK_FUNCTION(1, "IR")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(47, "NREB"),
-+		"A6", "mt7623",
-+		MTK_EINT_FUNCTION(0, 29),
-+		MTK_FUNCTION(0, "GPIO47"),
-+		MTK_FUNCTION(1, "NREB")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(48, "NRNB"),
-+		"B6", "mt7623",
-+		MTK_EINT_FUNCTION(0, 30),
-+		MTK_FUNCTION(0, "GPIO48"),
-+		MTK_FUNCTION(1, "NRNB")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(49, "I2S0_DATA"),
-+		"AB18", "mt7623",
-+		MTK_EINT_FUNCTION(0, 31),
-+		MTK_FUNCTION(0, "GPIO49"),
-+		MTK_FUNCTION(1, "I2S0_DATA"),
-+		MTK_FUNCTION(3, "PCM_TX"),
-+		MTK_FUNCTION(6, "AP_I2S_DO")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(50, "GPIO50"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO50")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(51, "GPIO51"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO51")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(52, "GPIO52"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO52")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(53, "SPI0_CSN"),
-+		"E7", "mt7623",
-+		MTK_EINT_FUNCTION(0, 35),
-+		MTK_FUNCTION(0, "GPIO53"),
-+		MTK_FUNCTION(1, "SPI0_CS"),
-+		MTK_FUNCTION(5, "PWM1")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(54, "SPI0_CK"),
-+		"F7", "mt7623",
-+		MTK_EINT_FUNCTION(0, 36),
-+		MTK_FUNCTION(0, "GPIO54"),
-+		MTK_FUNCTION(1, "SPI0_CK")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(55, "SPI0_MI"),
-+		"E6", "mt7623",
-+		MTK_EINT_FUNCTION(0, 37),
-+		MTK_FUNCTION(0, "GPIO55"),
-+		MTK_FUNCTION(1, "SPI0_MI"),
-+		MTK_FUNCTION(2, "SPI0_MO"),
-+		MTK_FUNCTION(3, "MSDC1_WP"),
-+		MTK_FUNCTION(5, "PWM2")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(56, "SPI0_MO"),
-+		"G7", "mt7623",
-+		MTK_EINT_FUNCTION(0, 38),
-+		MTK_FUNCTION(0, "GPIO56"),
-+		MTK_FUNCTION(1, "SPI0_MO"),
-+		MTK_FUNCTION(2, "SPI0_MI")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(57, "GPIO57"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO57")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(58, "GPIO58"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO58")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(59, "GPIO59"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO59")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(60, "WB_RSTB"),
-+		"Y21", "mt7623",
-+		MTK_EINT_FUNCTION(0, 41),
-+		MTK_FUNCTION(0, "GPIO60"),
-+		MTK_FUNCTION(1, "WB_RSTB")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(61, "GPIO61"),
-+		"AA21", "mt7623",
-+		MTK_EINT_FUNCTION(0, 42),
-+		MTK_FUNCTION(0, "GPIO61"),
-+		MTK_FUNCTION(1, "TEST_FD")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(62, "GPIO62"),
-+		"AB22", "mt7623",
-+		MTK_EINT_FUNCTION(0, 43),
-+		MTK_FUNCTION(0, "GPIO62"),
-+		MTK_FUNCTION(1, "TEST_FC")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(63, "WB_SCLK"),
-+		"AC23", "mt7623",
-+		MTK_EINT_FUNCTION(0, 44),
-+		MTK_FUNCTION(0, "GPIO63"),
-+		MTK_FUNCTION(1, "WB_SCLK")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(64, "WB_SDATA"),
-+		"AB21", "mt7623",
-+		MTK_EINT_FUNCTION(0, 45),
-+		MTK_FUNCTION(0, "GPIO64"),
-+		MTK_FUNCTION(1, "WB_SDATA")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(65, "WB_SEN"),
-+		"AB24", "mt7623",
-+		MTK_EINT_FUNCTION(0, 46),
-+		MTK_FUNCTION(0, "GPIO65"),
-+		MTK_FUNCTION(1, "WB_SEN")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(66, "WB_CRTL0"),
-+		"AB20", "mt7623",
-+		MTK_EINT_FUNCTION(0, 47),
-+		MTK_FUNCTION(0, "GPIO66"),
-+		MTK_FUNCTION(1, "WB_CRTL0")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(67, "WB_CRTL1"),
-+		"AC20", "mt7623",
-+		MTK_EINT_FUNCTION(0, 48),
-+		MTK_FUNCTION(0, "GPIO67"),
-+		MTK_FUNCTION(1, "WB_CRTL1")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(68, "WB_CRTL2"),
-+		"AB19", "mt7623",
-+		MTK_EINT_FUNCTION(0, 49),
-+		MTK_FUNCTION(0, "GPIO68"),
-+		MTK_FUNCTION(1, "WB_CRTL2")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(69, "WB_CRTL3"),
-+		"AC19", "mt7623",
-+		MTK_EINT_FUNCTION(0, 50),
-+		MTK_FUNCTION(0, "GPIO69"),
-+		MTK_FUNCTION(1, "WB_CRTL3")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(70, "WB_CRTL4"),
-+		"AD19", "mt7623",
-+		MTK_EINT_FUNCTION(0, 51),
-+		MTK_FUNCTION(0, "GPIO70"),
-+		MTK_FUNCTION(1, "WB_CRTL4")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(71, "WB_CRTL5"),
-+		"AE19", "mt7623",
-+		MTK_EINT_FUNCTION(0, 52),
-+		MTK_FUNCTION(0, "GPIO71"),
-+		MTK_FUNCTION(1, "WB_CRTL5")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(72, "I2S0_DATA_IN"),
-+		"AA20", "mt7623",
-+		MTK_EINT_FUNCTION(0, 53),
-+		MTK_FUNCTION(0, "GPIO72"),
-+		MTK_FUNCTION(1, "I2S0_DATA_IN"),
-+		MTK_FUNCTION(3, "PCM_RX"),
-+		MTK_FUNCTION(4, "PWM0"),
-+		MTK_FUNCTION(5, "DISP_PWM"),
-+		MTK_FUNCTION(6, "AP_I2S_DI")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(73, "I2S0_LRCK"),
-+		"Y20", "mt7623",
-+		MTK_EINT_FUNCTION(0, 54),
-+		MTK_FUNCTION(0, "GPIO73"),
-+		MTK_FUNCTION(1, "I2S0_LRCK"),
-+		MTK_FUNCTION(3, "PCM_SYNC"),
-+		MTK_FUNCTION(6, "AP_I2S_LRCK")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(74, "I2S0_BCK"),
-+		"Y19", "mt7623",
-+		MTK_EINT_FUNCTION(0, 55),
-+		MTK_FUNCTION(0, "GPIO74"),
-+		MTK_FUNCTION(1, "I2S0_BCK"),
-+		MTK_FUNCTION(3, "PCM_CLK0"),
-+		MTK_FUNCTION(6, "AP_I2S_BCK")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(75, "SDA0"),
-+		"K19", "mt7623",
-+		MTK_EINT_FUNCTION(0, 56),
-+		MTK_FUNCTION(0, "GPIO75"),
-+		MTK_FUNCTION(1, "SDA0")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(76, "SCL0"),
-+		"K20", "mt7623",
-+		MTK_EINT_FUNCTION(0, 57),
-+		MTK_FUNCTION(0, "GPIO76"),
-+		MTK_FUNCTION(1, "SCL0")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(77, "GPIO77"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO77")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(78, "GPIO78"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO78")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(79, "GPIO79"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO79")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(80, "GPIO80"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO80")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(81, "GPIO81"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO81")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(82, "GPIO82"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO82")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(83, "LCM_RST"),
-+		"V16", "mt7623",
-+		MTK_EINT_FUNCTION(0, 64),
-+		MTK_FUNCTION(0, "GPIO83"),
-+		MTK_FUNCTION(1, "LCM_RST")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(84, "DSI_TE"),
-+		"V14", "mt7623",
-+		MTK_EINT_FUNCTION(0, 65),
-+		MTK_FUNCTION(0, "GPIO84"),
-+		MTK_FUNCTION(1, "DSI_TE")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(85, "GPIO85"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO85")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(86, "GPIO86"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO86")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(87, "GPIO87"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO87")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(88, "GPIO88"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO88")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(89, "GPIO89"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO89")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(90, "GPIO90"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO90")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(91, "GPIO91"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO91")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(92, "GPIO92"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO92")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(93, "GPIO93"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO93")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(94, "GPIO94"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO94")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(95, "MIPI_TCN"),
-+		"AB14", "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO95"),
-+		MTK_FUNCTION(1, "TCN")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(96, "MIPI_TCP"),
-+		"AC14", "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO96"),
-+		MTK_FUNCTION(1, "TCP")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(97, "MIPI_TDN1"),
-+		"AE15", "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO97"),
-+		MTK_FUNCTION(1, "TDN1")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(98, "MIPI_TDP1"),
-+		"AD15", "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO98"),
-+		MTK_FUNCTION(1, "TDP1")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(99, "MIPI_TDN0"),
-+		"AB15", "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO99"),
-+		MTK_FUNCTION(1, "TDN0")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(100, "MIPI_TDP0"),
-+		"AC15", "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO100"),
-+		MTK_FUNCTION(1, "TDP0")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(101, "GPIO101"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO101")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(102, "GPIO102"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO102")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(103, "GPIO103"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO103")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(104, "GPIO104"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO104")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(105, "MSDC1_CMD"),
-+		"AD2", "mt7623",
-+		MTK_EINT_FUNCTION(0, 78),
-+		MTK_FUNCTION(0, "GPIO105"),
-+		MTK_FUNCTION(1, "MSDC1_CMD"),
-+		MTK_FUNCTION(3, "SDA1"),
-+		MTK_FUNCTION(6, "I2SOUT_BCK")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(106, "MSDC1_CLK"),
-+		"AD3", "mt7623",
-+		MTK_EINT_FUNCTION(0, 79),
-+		MTK_FUNCTION(0, "GPIO106"),
-+		MTK_FUNCTION(1, "MSDC1_CLK"),
-+		MTK_FUNCTION(3, "SCL1"),
-+		MTK_FUNCTION(6, "I2SOUT_LRCK")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(107, "MSDC1_DAT0"),
-+		"AE2", "mt7623",
-+		MTK_EINT_FUNCTION(0, 80),
-+		MTK_FUNCTION(0, "GPIO107"),
-+		MTK_FUNCTION(1, "MSDC1_DAT0"),
-+		MTK_FUNCTION(5, "UTXD0"),
-+		MTK_FUNCTION(6, "I2SOUT_DATA_OUT")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(108, "MSDC1_DAT1"),
-+		"AC1", "mt7623",
-+		MTK_EINT_FUNCTION(0, 81),
-+		MTK_FUNCTION(0, "GPIO108"),
-+		MTK_FUNCTION(1, "MSDC1_DAT1"),
-+		MTK_FUNCTION(3, "PWM0"),
-+		MTK_FUNCTION(5, "URXD0"),
-+		MTK_FUNCTION(6, "PWM1")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(109, "MSDC1_DAT2"),
-+		"AC3", "mt7623",
-+		MTK_EINT_FUNCTION(0, 82),
-+		MTK_FUNCTION(0, "GPIO109"),
-+		MTK_FUNCTION(1, "MSDC1_DAT2"),
-+		MTK_FUNCTION(3, "SDA2"),
-+		MTK_FUNCTION(5, "UTXD1"),
-+		MTK_FUNCTION(6, "PWM2")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(110, "MSDC1_DAT3"),
-+		"AC4", "mt7623",
-+		MTK_EINT_FUNCTION(0, 83),
-+		MTK_FUNCTION(0, "GPIO110"),
-+		MTK_FUNCTION(1, "MSDC1_DAT3"),
-+		MTK_FUNCTION(3, "SCL2"),
-+		MTK_FUNCTION(5, "URXD1"),
-+		MTK_FUNCTION(6, "PWM3")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(111, "MSDC0_DAT7"),
-+		"A2", "mt7623",
-+		MTK_EINT_FUNCTION(0, 84),
-+		MTK_FUNCTION(0, "GPIO111"),
-+		MTK_FUNCTION(1, "MSDC0_DAT7"),
-+		MTK_FUNCTION(4, "NLD7")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(112, "MSDC0_DAT6"),
-+		"B3", "mt7623",
-+		MTK_EINT_FUNCTION(0, 85),
-+		MTK_FUNCTION(0, "GPIO112"),
-+		MTK_FUNCTION(1, "MSDC0_DAT6"),
-+		MTK_FUNCTION(4, "NLD6")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(113, "MSDC0_DAT5"),
-+		"C4", "mt7623",
-+		MTK_EINT_FUNCTION(0, 86),
-+		MTK_FUNCTION(0, "GPIO113"),
-+		MTK_FUNCTION(1, "MSDC0_DAT5"),
-+		MTK_FUNCTION(4, "NLD5")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(114, "MSDC0_DAT4"),
-+		"A4", "mt7623",
-+		MTK_EINT_FUNCTION(0, 87),
-+		MTK_FUNCTION(0, "GPIO114"),
-+		MTK_FUNCTION(1, "MSDC0_DAT4"),
-+		MTK_FUNCTION(4, "NLD4")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(115, "MSDC0_RSTB"),
-+		"C5", "mt7623",
-+		MTK_EINT_FUNCTION(0, 88),
-+		MTK_FUNCTION(0, "GPIO115"),
-+		MTK_FUNCTION(1, "MSDC0_RSTB"),
-+		MTK_FUNCTION(4, "NLD8")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(116, "MSDC0_CMD"),
-+		"D5", "mt7623",
-+		MTK_EINT_FUNCTION(0, 89),
-+		MTK_FUNCTION(0, "GPIO116"),
-+		MTK_FUNCTION(1, "MSDC0_CMD"),
-+		MTK_FUNCTION(4, "NALE")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(117, "MSDC0_CLK"),
-+		"B1", "mt7623",
-+		MTK_EINT_FUNCTION(0, 90),
-+		MTK_FUNCTION(0, "GPIO117"),
-+		MTK_FUNCTION(1, "MSDC0_CLK"),
-+		MTK_FUNCTION(4, "NWEB")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(118, "MSDC0_DAT3"),
-+		"D6", "mt7623",
-+		MTK_EINT_FUNCTION(0, 91),
-+		MTK_FUNCTION(0, "GPIO118"),
-+		MTK_FUNCTION(1, "MSDC0_DAT3"),
-+		MTK_FUNCTION(4, "NLD3")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(119, "MSDC0_DAT2"),
-+		"B2", "mt7623",
-+		MTK_EINT_FUNCTION(0, 92),
-+		MTK_FUNCTION(0, "GPIO119"),
-+		MTK_FUNCTION(1, "MSDC0_DAT2"),
-+		MTK_FUNCTION(4, "NLD2")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(120, "MSDC0_DAT1"),
-+		"A3", "mt7623",
-+		MTK_EINT_FUNCTION(0, 93),
-+		MTK_FUNCTION(0, "GPIO120"),
-+		MTK_FUNCTION(1, "MSDC0_DAT1"),
-+		MTK_FUNCTION(4, "NLD1")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(121, "MSDC0_DAT0"),
-+		"B4", "mt7623",
-+		MTK_EINT_FUNCTION(0, 94),
-+		MTK_FUNCTION(0, "GPIO121"),
-+		MTK_FUNCTION(1, "MSDC0_DAT0"),
-+		MTK_FUNCTION(4, "NLD0"),
-+		MTK_FUNCTION(5, "WATCHDOG")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(122, "GPIO122"),
-+		"H17", "mt7623",
-+		MTK_EINT_FUNCTION(0, 95),
-+		MTK_FUNCTION(0, "GPIO122"),
-+		MTK_FUNCTION(1, "TEST"),
-+		MTK_FUNCTION(4, "SDA2"),
-+		MTK_FUNCTION(5, "URXD0")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(123, "GPIO123"),
-+		"F17", "mt7623",
-+		MTK_EINT_FUNCTION(0, 96),
-+		MTK_FUNCTION(0, "GPIO123"),
-+		MTK_FUNCTION(1, "TEST"),
-+		MTK_FUNCTION(4, "SCL2"),
-+		MTK_FUNCTION(5, "UTXD0")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(124, "GPIO124"),
-+		"H18", "mt7623",
-+		MTK_EINT_FUNCTION(0, 97),
-+		MTK_FUNCTION(0, "GPIO124"),
-+		MTK_FUNCTION(1, "TEST"),
-+		MTK_FUNCTION(4, "SDA1"),
-+		MTK_FUNCTION(5, "PWM3")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(125, "GPIO125"),
-+		"G17", "mt7623",
-+		MTK_EINT_FUNCTION(0, 98),
-+		MTK_FUNCTION(0, "GPIO125"),
-+		MTK_FUNCTION(1, "TEST"),
-+		MTK_FUNCTION(4, "SCL1"),
-+		MTK_FUNCTION(5, "PWM4")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(126, "I2S0_MCLK"),
-+		"AA19", "mt7623",
-+		MTK_EINT_FUNCTION(0, 99),
-+		MTK_FUNCTION(0, "GPIO126"),
-+		MTK_FUNCTION(1, "I2S0_MCLK"),
-+		MTK_FUNCTION(6, "AP_I2S_MCLK")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(127, "GPIO127"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO127")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(128, "GPIO128"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO128")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(129, "GPIO129"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO129")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(130, "GPIO130"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO130")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(131, "GPIO131"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO131")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(132, "GPIO132"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO132")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(133, "GPIO133"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO133")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(134, "GPIO134"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO134")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(135, "GPIO135"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO135")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(136, "GPIO136"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO136")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(137, "GPIO137"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO137")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(138, "GPIO138"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO138")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(139, "GPIO139"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO139")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(140, "GPIO140"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO140")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(141, "GPIO141"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO141")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(142, "GPIO142"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO142")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(143, "GPIO143"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO143")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(144, "GPIO144"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO144")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(145, "GPIO145"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO145")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(146, "GPIO146"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO146")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(147, "GPIO147"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO147")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(148, "GPIO148"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO148")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(149, "GPIO149"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO149")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(150, "GPIO150"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO150")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(151, "GPIO151"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO151")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(152, "GPIO152"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO152")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(153, "GPIO153"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO153")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(154, "GPIO154"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO154")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(155, "GPIO155"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO155")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(156, "GPIO156"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO156")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(157, "GPIO157"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO157")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(158, "GPIO158"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO158")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(159, "GPIO159"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO159")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(160, "GPIO160"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO160")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(161, "GPIO161"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO161")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(162, "GPIO162"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO162")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(163, "GPIO163"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO163")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(164, "GPIO164"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO164")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(165, "GPIO165"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO165")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(166, "GPIO166"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO166")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(167, "GPIO167"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO167")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(168, "GPIO168"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO168")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(169, "GPIO169"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO169")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(170, "GPIO170"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO170")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(171, "GPIO171"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO171")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(172, "GPIO172"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO172")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(173, "GPIO173"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO173")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(174, "GPIO174"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO174")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(175, "GPIO175"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO175")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(176, "GPIO176"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO176")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(177, "GPIO177"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO177")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(178, "GPIO178"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO178")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(179, "GPIO179"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO179")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(180, "GPIO180"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO180")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(181, "GPIO181"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO181")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(182, "GPIO182"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO182")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(183, "GPIO183"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO183")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(184, "GPIO184"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO184")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(185, "GPIO185"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO185")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(186, "GPIO186"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO186")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(187, "GPIO187"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO187")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(188, "GPIO188"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO188")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(189, "GPIO189"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO189")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(190, "GPIO190"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO190")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(191, "GPIO191"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO191")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(192, "GPIO192"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO192")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(193, "GPIO193"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO193")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(194, "GPIO194"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO194")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(195, "GPIO195"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO195")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(196, "GPIO196"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO196")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(197, "GPIO197"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO197")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(198, "GPIO198"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO198")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(199, "SPI1_CK"),
-+		"E19", "mt7623",
-+		MTK_EINT_FUNCTION(0, 111),
-+		MTK_FUNCTION(0, "GPIO199"),
-+		MTK_FUNCTION(1, "SPI1_CK")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(200, "URXD2"),
-+		"K18", "mt7623",
-+		MTK_EINT_FUNCTION(0, 112),
-+		MTK_FUNCTION(0, "GPIO200"),
-+		MTK_FUNCTION(6, "URXD2")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(201, "UTXD2"),
-+		"L18", "mt7623",
-+		MTK_EINT_FUNCTION(0, 113),
-+		MTK_FUNCTION(0, "GPIO201"),
-+		MTK_FUNCTION(6, "UTXD2")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(202, "GPIO202"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO202")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(203, "PWM0"),
-+		"AA16", "mt7623",
-+		MTK_EINT_FUNCTION(0, 115),
-+		MTK_FUNCTION(0, "GPIO203"),
-+		MTK_FUNCTION(1, "PWM0"),
-+		MTK_FUNCTION(2, "DISP_PWM")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(204, "PWM1"),
-+		"Y16", "mt7623",
-+		MTK_EINT_FUNCTION(0, 116),
-+		MTK_FUNCTION(0, "GPIO204"),
-+		MTK_FUNCTION(1, "PWM1")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(205, "PWM2"),
-+		"AA15", "mt7623",
-+		MTK_EINT_FUNCTION(0, 117),
-+		MTK_FUNCTION(0, "GPIO205"),
-+		MTK_FUNCTION(1, "PWM2")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(206, "PWM3"),
-+		"AA17", "mt7623",
-+		MTK_EINT_FUNCTION(0, 118),
-+		MTK_FUNCTION(0, "GPIO206"),
-+		MTK_FUNCTION(1, "PWM3")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(207, "PWM4"),
-+		"Y15", "mt7623",
-+		MTK_EINT_FUNCTION(0, 119),
-+		MTK_FUNCTION(0, "GPIO207"),
-+		MTK_FUNCTION(1, "PWM4")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(208, "AUD_EXT_CK1"),
-+		"W14", "mt7623",
-+		MTK_EINT_FUNCTION(0, 120),
-+		MTK_FUNCTION(0, "GPIO208"),
-+		MTK_FUNCTION(1, "AUD_EXT_CK1"),
-+		MTK_FUNCTION(2, "PWM0"),
-+		MTK_FUNCTION(3, "PCIE0_PERST_N"),
-+		MTK_FUNCTION(5, "DISP_PWM")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(209, "AUD_EXT_CK2"),
-+		"V15", "mt7623",
-+		MTK_EINT_FUNCTION(0, 121),
-+		MTK_FUNCTION(0, "GPIO209"),
-+		MTK_FUNCTION(1, "AUD_EXT_CK2"),
-+		MTK_FUNCTION(2, "MSDC1_WP"),
-+		MTK_FUNCTION(3, "PCIE1_PERST_N"),
-+		MTK_FUNCTION(5, "PWM1")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(210, "GPIO210"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO210")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(211, "GPIO211"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO211")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(212, "GPIO212"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO212")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(213, "GPIO213"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO213")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(214, "GPIO214"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO214")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(215, "GPIO215"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO215")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(216, "GPIO216"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO216")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(217, "GPIO217"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO217")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(218, "GPIO218"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO218")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(219, "GPIO219"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO219")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(220, "GPIO220"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO220")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(221, "GPIO221"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO221")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(222, "GPIO222"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO222")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(223, "GPIO223"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO223")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(224, "GPIO224"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO224")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(225, "GPIO225"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO225")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(226, "GPIO226"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO226")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(227, "GPIO227"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO227")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(228, "GPIO228"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO228")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(229, "GPIO229"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO229")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(230, "GPIO230"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO230")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(231, "GPIO231"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO231")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(232, "GPIO232"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO232")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(233, "GPIO233"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO233")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(234, "GPIO234"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO234")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(235, "GPIO235"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO235")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(236, "EXT_SDIO3"),
-+		"A8", "mt7623",
-+		MTK_EINT_FUNCTION(0, 122),
-+		MTK_FUNCTION(0, "GPIO236"),
-+		MTK_FUNCTION(1, "EXT_SDIO3"),
-+		MTK_FUNCTION(2, "IDDIG")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(237, "EXT_SDIO2"),
-+		"D8", "mt7623",
-+		MTK_EINT_FUNCTION(0, 123),
-+		MTK_FUNCTION(0, "GPIO237"),
-+		MTK_FUNCTION(1, "EXT_SDIO2"),
-+		MTK_FUNCTION(2, "DRV_VBUS")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(238, "EXT_SDIO1"),
-+		"D9", "mt7623",
-+		MTK_EINT_FUNCTION(0, 124),
-+		MTK_FUNCTION(0, "GPIO238"),
-+		MTK_FUNCTION(1, "EXT_SDIO1")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(239, "EXT_SDIO0"),
-+		"B8", "mt7623",
-+		MTK_EINT_FUNCTION(0, 125),
-+		MTK_FUNCTION(0, "GPIO239"),
-+		MTK_FUNCTION(1, "EXT_SDIO0")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(240, "EXT_XCS"),
-+		"C9", "mt7623",
-+		MTK_EINT_FUNCTION(0, 126),
-+		MTK_FUNCTION(0, "GPIO240"),
-+		MTK_FUNCTION(1, "EXT_XCS")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(241, "EXT_SCK"),
-+		"C8", "mt7623",
-+		MTK_EINT_FUNCTION(0, 127),
-+		MTK_FUNCTION(0, "GPIO241"),
-+		MTK_FUNCTION(1, "EXT_SCK")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(242, "URTS2"),
-+		"G18", "mt7623",
-+		MTK_EINT_FUNCTION(0, 128),
-+		MTK_FUNCTION(0, "GPIO242"),
-+		MTK_FUNCTION(1, "URTS2"),
-+		MTK_FUNCTION(2, "UTXD3"),
-+		MTK_FUNCTION(3, "URXD3"),
-+		MTK_FUNCTION(4, "SCL1")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(243, "UCTS2"),
-+		"H19", "mt7623",
-+		MTK_EINT_FUNCTION(0, 129),
-+		MTK_FUNCTION(0, "GPIO243"),
-+		MTK_FUNCTION(1, "UCTS2"),
-+		MTK_FUNCTION(2, "URXD3"),
-+		MTK_FUNCTION(3, "UTXD3"),
-+		MTK_FUNCTION(4, "SDA1")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(244, "GPIO244"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO244")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(245, "GPIO245"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO245")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(246, "GPIO246"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO246")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(247, "GPIO247"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO247")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(248, "GPIO248"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO248")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(249, "GPIO249"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO249")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(250, "GPIO250"),
-+		"A15", "mt7623",
-+		MTK_EINT_FUNCTION(0, 135),
-+		MTK_FUNCTION(0, "GPIO250"),
-+		MTK_FUNCTION(1, "TEST_MD7"),
-+		MTK_FUNCTION(6, "PCIE0_CLKREQ_N")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(251, "GPIO251"),
-+		"B15", "mt7623",
-+		MTK_EINT_FUNCTION(0, 136),
-+		MTK_FUNCTION(0, "GPIO251"),
-+		MTK_FUNCTION(1, "TEST_MD6"),
-+		MTK_FUNCTION(6, "PCIE0_WAKE_N")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(252, "GPIO252"),
-+		"C16", "mt7623",
-+		MTK_EINT_FUNCTION(0, 137),
-+		MTK_FUNCTION(0, "GPIO252"),
-+		MTK_FUNCTION(1, "TEST_MD5"),
-+		MTK_FUNCTION(6, "PCIE1_CLKREQ_N")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(253, "GPIO253"),
-+		"D17", "mt7623",
-+		MTK_EINT_FUNCTION(0, 138),
-+		MTK_FUNCTION(0, "GPIO253"),
-+		MTK_FUNCTION(1, "TEST_MD4"),
-+		MTK_FUNCTION(6, "PCIE1_WAKE_N")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(254, "GPIO254"),
-+		"D16", "mt7623",
-+		MTK_EINT_FUNCTION(0, 139),
-+		MTK_FUNCTION(0, "GPIO254"),
-+		MTK_FUNCTION(1, "TEST_MD3"),
-+		MTK_FUNCTION(6, "PCIE2_CLKREQ_N")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(255, "GPIO255"),
-+		"C17", "mt7623",
-+		MTK_EINT_FUNCTION(0, 140),
-+		MTK_FUNCTION(0, "GPIO255"),
-+		MTK_FUNCTION(1, "TEST_MD2"),
-+		MTK_FUNCTION(6, "PCIE2_WAKE_N")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(256, "GPIO256"),
-+		"B17", "mt7623",
-+		MTK_EINT_FUNCTION(0, 141),
-+		MTK_FUNCTION(0, "GPIO256"),
-+		MTK_FUNCTION(1, "TEST_MD1")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(257, "GPIO257"),
-+		"C15", "mt7623",
-+		MTK_EINT_FUNCTION(0, 142),
-+		MTK_FUNCTION(0, "GPIO257"),
-+		MTK_FUNCTION(1, "TEST_MD0")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(258, "GPIO258"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO258")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(259, "GPIO259"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO259")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(260, "GPIO260"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO260")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(261, "MSDC1_INS"),
-+		"AD1", "mt7623",
-+		MTK_EINT_FUNCTION(0, 146),
-+		MTK_FUNCTION(0, "GPIO261"),
-+		MTK_FUNCTION(1, "MSDC1_INS")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(262, "G2_TXEN"),
-+		"A23", "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO262"),
-+		MTK_FUNCTION(1, "G2_TXEN")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(263, "G2_TXD3"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO263"),
-+		MTK_FUNCTION(1, "G2_TXD3")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(264, "G2_TXD2"),
-+		"C24", "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO264"),
-+		MTK_FUNCTION(1, "G2_TXD2")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(265, "G2_TXD1"),
-+		"B25", "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO265"),
-+		MTK_FUNCTION(1, "G2_TXD1")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(266, "G2_TXD0"),
-+		"A24", "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO266"),
-+		MTK_FUNCTION(1, "G2_TXD0")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(267, "G2_TXCLK"),
-+		"C23", "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO267"),
-+		MTK_FUNCTION(1, "G2_TXC")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(268, "G2_RXCLK"),
-+		"B23", "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO268"),
-+		MTK_FUNCTION(1, "G2_RXC")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(269, "G2_RXD0"),
-+		"D21", "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO269"),
-+		MTK_FUNCTION(1, "G2_RXD0")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(270, "G2_RXD1"),
-+		"B22", "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO270"),
-+		MTK_FUNCTION(1, "G2_RXD1")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(271, "G2_RXD2"),
-+		"A22", "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO271"),
-+		MTK_FUNCTION(1, "G2_RXD2")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(272, "G2_RXD3"),
-+		"C22", "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO272"),
-+		MTK_FUNCTION(1, "G2_RXD3")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(273, "GPIO273"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(0, 168),
-+		MTK_FUNCTION(0, "GPIO273"),
-+		MTK_FUNCTION(1, "ESW_INT")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(274, "G2_RXDV"),
-+		"C21", "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO274"),
-+		MTK_FUNCTION(1, "G2_RXDV")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(275, "G2_MDC"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO275"),
-+		MTK_FUNCTION(1, "MDC")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(276, "G2_MDIO"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO276"),
-+		MTK_FUNCTION(1, "MDIO")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(277, "GPIO277"),
-+		NULL, "mt7623",
-+		MTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),
-+		MTK_FUNCTION(0, "GPIO277")
-+	),
-+	MTK_PIN(
-+		PINCTRL_PIN(278, "JTAG_RESET"),
-+		"H20", "mt7623",
-+		MTK_EINT_FUNCTION(0, 147),
-+		MTK_FUNCTION(0, "GPIO278"),
-+		MTK_FUNCTION(1, "JTAG_RESET")
-+	),
-+};
-+
-+#endif /* __PINCTRL_MTK_MT7623_H */
---- a/include/dt-bindings/pinctrl/mt7623-pinfunc.h
-+++ b/include/dt-bindings/pinctrl/mt7623-pinfunc.h
-@@ -505,6 +505,9 @@
- #define MT7623_PIN_272_G2_RXD3_FUNC_GPIO272 (MTK_PIN_NO(272) | 0)
- #define MT7623_PIN_272_G2_RXD3_FUNC_G2_RXD3 (MTK_PIN_NO(272) | 1)
- 
-+#define MT7623_PIN_273_ESW_INT_FUNC_GPIO273 (MTK_PIN_NO(273) | 0)
-+#define MT7623_PIN_273_ESW_INT_FUNC_ESW_INT (MTK_PIN_NO(273) | 1)
-+
- #define MT7623_PIN_274_G2_RXDV_FUNC_GPIO274 (MTK_PIN_NO(274) | 0)
- #define MT7623_PIN_274_G2_RXDV_FUNC_G2_RXDV (MTK_PIN_NO(274) | 1)
- 
diff --git a/target/linux/mediatek/patches-4.4/0018-dt-bindings-Add-a-binding-for-Mediatek-xHCI-host-con.patch b/target/linux/mediatek/patches-4.4/0018-dt-bindings-Add-a-binding-for-Mediatek-xHCI-host-con.patch
deleted file mode 100644
index 9c178f2..0000000
--- a/target/linux/mediatek/patches-4.4/0018-dt-bindings-Add-a-binding-for-Mediatek-xHCI-host-con.patch
+++ /dev/null
@@ -1,69 +0,0 @@
-From ba126a519da8a036dae0032e9d5a89e47570e5fb Mon Sep 17 00:00:00 2001
-From: "chunfeng.yun at mediatek.com" <chunfeng.yun at mediatek.com>
-Date: Tue, 17 Nov 2015 17:18:39 +0800
-Subject: [PATCH 018/102] dt-bindings: Add a binding for Mediatek xHCI host
- controller
-
-add a DT binding documentation of xHCI host controller for the
-MT8173 SoC from Mediatek.
-
-Signed-off-by: Chunfeng Yun <chunfeng.yun at mediatek.com>
----
- .../devicetree/bindings/usb/mt8173-xhci.txt        |   51 ++++++++++++++++++++
- 1 file changed, 51 insertions(+)
- create mode 100644 Documentation/devicetree/bindings/usb/mt8173-xhci.txt
-
---- /dev/null
-+++ b/Documentation/devicetree/bindings/usb/mt8173-xhci.txt
-@@ -0,0 +1,51 @@
-+MT8173 xHCI
-+
-+The device node for Mediatek SOC USB3.0 host controller
-+
-+Required properties:
-+ - compatible : should contain "mediatek,mt8173-xhci"
-+ - reg : specifies physical base address and size of the registers,
-+	the first one for MAC, the second for IPPC
-+ - interrupts : interrupt used by the controller
-+ - power-domains : a phandle to USB power domain node to control USB's
-+	mtcmos
-+ - vusb33-supply : regulator of USB avdd3.3v
-+
-+ - clocks : a list of phandle + clock-specifier pairs, one for each
-+	entry in clock-names
-+ - clock-names : must contain
-+	"sys_ck": for clock of xHCI MAC
-+	"wakeup_deb_p0": for USB wakeup debounce clock of port0
-+	"wakeup_deb_p0": for USB wakeup debounce clock of port1
-+
-+ - phys : a list of phandle + phy specifier pairs
-+
-+Optional properties:
-+ - mediatek,wakeup-src : 1: ip sleep wakeup mode; 2: line state wakeup
-+	mode;
-+ - mediatek,syscon-wakeup : phandle to syscon used to access USB wakeup
-+	control register, it depends on "mediatek,wakeup-src".
-+ - vbus-supply : reference to the VBUS regulator;
-+ - usb3-lpm-capable : supports USB3.0 LPM
-+
-+Example:
-+usb30: usb at 11270000 {
-+	compatible = "mediatek,mt8173-xhci";
-+	reg = <0 0x11270000 0 0x1000>,
-+	      <0 0x11280700 0 0x0100>;
-+	interrupts = <GIC_SPI 115 IRQ_TYPE_LEVEL_LOW>;
-+	power-domains = <&scpsys MT8173_POWER_DOMAIN_USB>;
-+	clocks = <&topckgen CLK_TOP_USB30_SEL>,
-+		 <&pericfg CLK_PERI_USB0>,
-+		 <&pericfg CLK_PERI_USB1>;
-+	clock-names = "sys_ck",
-+		      "wakeup_deb_p0",
-+		      "wakeup_deb_p1";
-+	phys = <&phy_port0 PHY_TYPE_USB3>,
-+	       <&phy_port1 PHY_TYPE_USB2>;
-+	vusb33-supply = <&mt6397_vusb_reg>;
-+	vbus-supply = <&usb_p1_vbus>;
-+	usb3-lpm-capable;
-+	mediatek,syscon-wakeup = <&pericfg>;
-+	mediatek,wakeup-src = <1>;
-+};
diff --git a/target/linux/mediatek/patches-4.4/0019-xhci-mediatek-support-MTK-xHCI-host-controller.patch b/target/linux/mediatek/patches-4.4/0019-xhci-mediatek-support-MTK-xHCI-host-controller.patch
deleted file mode 100644
index f081439..0000000
--- a/target/linux/mediatek/patches-4.4/0019-xhci-mediatek-support-MTK-xHCI-host-controller.patch
+++ /dev/null
@@ -1,1525 +0,0 @@
-From 8b8185586a13ebbd760e80bbe5f22f9417b50fd2 Mon Sep 17 00:00:00 2001
-From: "chunfeng.yun at mediatek.com" <chunfeng.yun at mediatek.com>
-Date: Tue, 17 Nov 2015 17:18:40 +0800
-Subject: [PATCH 019/102] xhci: mediatek: support MTK xHCI host controller
-
-There some vendor quirks for MTK xhci host controller:
-1. It defines some extra SW scheduling parameters for HW
-  to minimize the scheduling effort for synchronous and
-  interrupt endpoints. The parameters are put into reseved
-  DWs of slot context and endpoint context.
-2. Its IMODI unit for Interrupter Moderation register is
-  8 times as much as that defined in xHCI spec.
-3. Its TDS in  Normal TRB defines a number of packets that
-  remains to be transferred for a TD after processing all
-  Max packets in all previous TRBs.
-
-Signed-off-by: Chunfeng Yun <chunfeng.yun at mediatek.com>
-Tested-by: Daniel Thompson <daniel.thompson at linaro.org>
-Reviewed-by: Daniel Thompson <daniel.thompson at linaro.org>
----
- drivers/usb/host/Kconfig        |    9 +
- drivers/usb/host/Makefile       |    4 +
- drivers/usb/host/xhci-mtk-sch.c |  415 +++++++++++++++++++++
- drivers/usb/host/xhci-mtk.c     |  763 +++++++++++++++++++++++++++++++++++++++
- drivers/usb/host/xhci-mtk.h     |  162 +++++++++
- drivers/usb/host/xhci-ring.c    |   16 +-
- drivers/usb/host/xhci.c         |   19 +-
- drivers/usb/host/xhci.h         |    1 +
- 8 files changed, 1383 insertions(+), 6 deletions(-)
- create mode 100644 drivers/usb/host/xhci-mtk-sch.c
- create mode 100644 drivers/usb/host/xhci-mtk.c
- create mode 100644 drivers/usb/host/xhci-mtk.h
-
---- a/drivers/usb/host/Kconfig
-+++ b/drivers/usb/host/Kconfig
-@@ -41,6 +41,15 @@ config USB_XHCI_PLATFORM
- 
- 	  If unsure, say N.
- 
-+config USB_XHCI_MTK
-+	tristate "xHCI support for Mediatek MT65xx"
-+	select MFD_SYSCON
-+	depends on ARCH_MEDIATEK || COMPILE_TEST
-+	---help---
-+	  Say 'Y' to enable the support for the xHCI host controller
-+	  found in Mediatek MT65xx SoCs.
-+	  If unsure, say N.
-+
- config USB_XHCI_MVEBU
- 	tristate "xHCI support for Marvell Armada 375/38x"
- 	select USB_XHCI_PLATFORM
---- a/drivers/usb/host/Makefile
-+++ b/drivers/usb/host/Makefile
-@@ -13,6 +13,9 @@ fhci-$(CONFIG_FHCI_DEBUG) += fhci-dbg.o
- xhci-hcd-y := xhci.o xhci-mem.o
- xhci-hcd-y += xhci-ring.o xhci-hub.o xhci-dbg.o
- xhci-hcd-y += xhci-trace.o
-+ifneq ($(CONFIG_USB_XHCI_MTK), )
-+	xhci-hcd-y += xhci-mtk-sch.o
-+endif
- 
- xhci-plat-hcd-y := xhci-plat.o
- ifneq ($(CONFIG_USB_XHCI_MVEBU), )
-@@ -64,6 +67,7 @@ obj-$(CONFIG_USB_FHCI_HCD)	+= fhci.o
- obj-$(CONFIG_USB_XHCI_HCD)	+= xhci-hcd.o
- obj-$(CONFIG_USB_XHCI_PCI)	+= xhci-pci.o
- obj-$(CONFIG_USB_XHCI_PLATFORM) += xhci-plat-hcd.o
-+obj-$(CONFIG_USB_XHCI_MTK)	+= xhci-mtk.o
- obj-$(CONFIG_USB_SL811_HCD)	+= sl811-hcd.o
- obj-$(CONFIG_USB_SL811_CS)	+= sl811_cs.o
- obj-$(CONFIG_USB_U132_HCD)	+= u132-hcd.o
---- /dev/null
-+++ b/drivers/usb/host/xhci-mtk-sch.c
-@@ -0,0 +1,415 @@
-+/*
-+ * Copyright (c) 2015 MediaTek Inc.
-+ * Author:
-+ *  Zhigang.Wei <zhigang.wei at mediatek.com>
-+ *  Chunfeng.Yun <chunfeng.yun at mediatek.com>
-+ *
-+ * This software is licensed under the terms of the GNU General Public
-+ * License version 2, as published by the Free Software Foundation, and
-+ * may be copied, distributed, and modified under those terms.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ */
-+
-+#include <linux/kernel.h>
-+#include <linux/module.h>
-+#include <linux/slab.h>
-+
-+#include "xhci.h"
-+#include "xhci-mtk.h"
-+
-+#define SS_BW_BOUNDARY	51000
-+/* table 5-5. High-speed Isoc Transaction Limits in usb_20 spec */
-+#define HS_BW_BOUNDARY	6144
-+/* usb2 spec section11.18.1: at most 188 FS bytes per microframe */
-+#define FS_PAYLOAD_MAX 188
-+
-+/* mtk scheduler bitmasks */
-+#define EP_BPKTS(p)	((p) & 0x3f)
-+#define EP_BCSCOUNT(p)	(((p) & 0x7) << 8)
-+#define EP_BBM(p)	((p) << 11)
-+#define EP_BOFFSET(p)	((p) & 0x3fff)
-+#define EP_BREPEAT(p)	(((p) & 0x7fff) << 16)
-+
-+static int is_fs_or_ls(enum usb_device_speed speed)
-+{
-+	return speed == USB_SPEED_FULL || speed == USB_SPEED_LOW;
-+}
-+
-+/*
-+* get the index of bandwidth domains array which @ep belongs to.
-+*
-+* the bandwidth domain array is saved to @sch_array of struct xhci_hcd_mtk,
-+* each HS root port is treated as a single bandwidth domain,
-+* but each SS root port is treated as two bandwidth domains, one for IN eps,
-+* one for OUT eps.
-+* @real_port value is defined as follow according to xHCI spec:
-+* 1 for SSport0, ..., N+1 for SSportN, N+2 for HSport0, N+3 for HSport1, etc
-+* so the bandwidth domain array is organized as follow for simplification:
-+* SSport0-OUT, SSport0-IN, ..., SSportX-OUT, SSportX-IN, HSport0, ..., HSportY
-+*/
-+static int get_bw_index(struct xhci_hcd *xhci, struct usb_device *udev,
-+	struct usb_host_endpoint *ep)
-+{
-+	struct xhci_virt_device *virt_dev;
-+	int bw_index;
-+
-+	virt_dev = xhci->devs[udev->slot_id];
-+
-+	if (udev->speed == USB_SPEED_SUPER) {
-+		if (usb_endpoint_dir_out(&ep->desc))
-+			bw_index = (virt_dev->real_port - 1) * 2;
-+		else
-+			bw_index = (virt_dev->real_port - 1) * 2 + 1;
-+	} else {
-+		/* add one more for each SS port */
-+		bw_index = virt_dev->real_port + xhci->num_usb3_ports - 1;
-+	}
-+
-+	return bw_index;
-+}
-+
-+static void setup_sch_info(struct usb_device *udev,
-+		struct xhci_ep_ctx *ep_ctx, struct mu3h_sch_ep_info *sch_ep)
-+{
-+	u32 ep_type;
-+	u32 ep_interval;
-+	u32 max_packet_size;
-+	u32 max_burst;
-+	u32 mult;
-+	u32 esit_pkts;
-+
-+	ep_type = CTX_TO_EP_TYPE(le32_to_cpu(ep_ctx->ep_info2));
-+	ep_interval = CTX_TO_EP_INTERVAL(le32_to_cpu(ep_ctx->ep_info));
-+	max_packet_size = MAX_PACKET_DECODED(le32_to_cpu(ep_ctx->ep_info2));
-+	max_burst = CTX_TO_MAX_BURST(le32_to_cpu(ep_ctx->ep_info2));
-+	mult = CTX_TO_EP_MULT(le32_to_cpu(ep_ctx->ep_info));
-+
-+	sch_ep->esit = 1 << ep_interval;
-+	sch_ep->offset = 0;
-+	sch_ep->burst_mode = 0;
-+
-+	if (udev->speed == USB_SPEED_HIGH) {
-+		sch_ep->cs_count = 0;
-+
-+		/*
-+		 * usb_20 spec section5.9
-+		 * a single microframe is enough for HS synchromous endpoints
-+		 * in a interval
-+		 */
-+		sch_ep->num_budget_microframes = 1;
-+		sch_ep->repeat = 0;
-+
-+		/*
-+		 * xHCI spec section6.2.3.4
-+		 * @max_burst is the number of additional transactions
-+		 * opportunities per microframe
-+		 */
-+		sch_ep->pkts = max_burst + 1;
-+		sch_ep->bw_cost_per_microframe = max_packet_size * sch_ep->pkts;
-+	} else if (udev->speed == USB_SPEED_SUPER) {
-+		/* usb3_r1 spec section4.4.7 & 4.4.8 */
-+		sch_ep->cs_count = 0;
-+		esit_pkts = (mult + 1) * (max_burst + 1);
-+		if (ep_type == INT_IN_EP || ep_type == INT_OUT_EP) {
-+			sch_ep->pkts = esit_pkts;
-+			sch_ep->num_budget_microframes = 1;
-+			sch_ep->repeat = 0;
-+		}
-+
-+		if (ep_type == ISOC_IN_EP || ep_type == ISOC_OUT_EP) {
-+			if (esit_pkts <= sch_ep->esit)
-+				sch_ep->pkts = 1;
-+			else
-+				sch_ep->pkts = roundup_pow_of_two(esit_pkts)
-+					/ sch_ep->esit;
-+
-+			sch_ep->num_budget_microframes =
-+				DIV_ROUND_UP(esit_pkts, sch_ep->pkts);
-+
-+			if (sch_ep->num_budget_microframes > 1)
-+				sch_ep->repeat = 1;
-+			else
-+				sch_ep->repeat = 0;
-+		}
-+		sch_ep->bw_cost_per_microframe = max_packet_size * sch_ep->pkts;
-+	} else if (is_fs_or_ls(udev->speed)) {
-+
-+		/*
-+		 * usb_20 spec section11.18.4
-+		 * assume worst cases
-+		 */
-+		sch_ep->repeat = 0;
-+		sch_ep->pkts = 1; /* at most one packet for each microframe */
-+		if (ep_type == INT_IN_EP || ep_type == INT_OUT_EP) {
-+			sch_ep->cs_count = 3; /* at most need 3 CS*/
-+			/* one for SS and one for budgeted transaction */
-+			sch_ep->num_budget_microframes = sch_ep->cs_count + 2;
-+			sch_ep->bw_cost_per_microframe = max_packet_size;
-+		}
-+		if (ep_type == ISOC_OUT_EP) {
-+
-+			/*
-+			 * the best case FS budget assumes that 188 FS bytes
-+			 * occur in each microframe
-+			 */
-+			sch_ep->num_budget_microframes = DIV_ROUND_UP(
-+				max_packet_size, FS_PAYLOAD_MAX);
-+			sch_ep->bw_cost_per_microframe = FS_PAYLOAD_MAX;
-+			sch_ep->cs_count = sch_ep->num_budget_microframes;
-+		}
-+		if (ep_type == ISOC_IN_EP) {
-+			/* at most need additional two CS. */
-+			sch_ep->cs_count = DIV_ROUND_UP(
-+				max_packet_size, FS_PAYLOAD_MAX) + 2;
-+			sch_ep->num_budget_microframes = sch_ep->cs_count + 2;
-+			sch_ep->bw_cost_per_microframe = FS_PAYLOAD_MAX;
-+		}
-+	}
-+}
-+
-+/* Get maximum bandwidth when we schedule at offset slot. */
-+static u32 get_max_bw(struct mu3h_sch_bw_info *sch_bw,
-+	struct mu3h_sch_ep_info *sch_ep, u32 offset)
-+{
-+	u32 num_esit;
-+	u32 max_bw = 0;
-+	int i;
-+	int j;
-+
-+	num_esit = XHCI_MTK_MAX_ESIT / sch_ep->esit;
-+	for (i = 0; i < num_esit; i++) {
-+		u32 base = offset + i * sch_ep->esit;
-+
-+		for (j = 0; j < sch_ep->num_budget_microframes; j++) {
-+			if (sch_bw->bus_bw[base + j] > max_bw)
-+				max_bw = sch_bw->bus_bw[base + j];
-+		}
-+	}
-+	return max_bw;
-+}
-+
-+static void update_bus_bw(struct mu3h_sch_bw_info *sch_bw,
-+	struct mu3h_sch_ep_info *sch_ep, int bw_cost)
-+{
-+	u32 num_esit;
-+	u32 base;
-+	int i;
-+	int j;
-+
-+	num_esit = XHCI_MTK_MAX_ESIT / sch_ep->esit;
-+	for (i = 0; i < num_esit; i++) {
-+		base = sch_ep->offset + i * sch_ep->esit;
-+		for (j = 0; j < sch_ep->num_budget_microframes; j++)
-+			sch_bw->bus_bw[base + j] += bw_cost;
-+	}
-+}
-+
-+static int check_sch_bw(struct usb_device *udev,
-+	struct mu3h_sch_bw_info *sch_bw, struct mu3h_sch_ep_info *sch_ep)
-+{
-+	u32 offset;
-+	u32 esit;
-+	u32 num_budget_microframes;
-+	u32 min_bw;
-+	u32 min_index;
-+	u32 worst_bw;
-+	u32 bw_boundary;
-+
-+	if (sch_ep->esit > XHCI_MTK_MAX_ESIT)
-+		sch_ep->esit = XHCI_MTK_MAX_ESIT;
-+
-+	esit = sch_ep->esit;
-+	num_budget_microframes = sch_ep->num_budget_microframes;
-+
-+	/*
-+	 * Search through all possible schedule microframes.
-+	 * and find a microframe where its worst bandwidth is minimum.
-+	 */
-+	min_bw = ~0;
-+	min_index = 0;
-+	for (offset = 0; offset < esit; offset++) {
-+		if ((offset + num_budget_microframes) > sch_ep->esit)
-+			break;
-+
-+		/*
-+		 * usb_20 spec section11.18:
-+		 * must never schedule Start-Split in Y6
-+		 */
-+		if (is_fs_or_ls(udev->speed) && (offset % 8 == 6))
-+			continue;
-+
-+		worst_bw = get_max_bw(sch_bw, sch_ep, offset);
-+		if (min_bw > worst_bw) {
-+			min_bw = worst_bw;
-+			min_index = offset;
-+		}
-+		if (min_bw == 0)
-+			break;
-+	}
-+	sch_ep->offset = min_index;
-+
-+	bw_boundary = (udev->speed == USB_SPEED_SUPER)
-+				? SS_BW_BOUNDARY : HS_BW_BOUNDARY;
-+
-+	/* check bandwidth */
-+	if (min_bw + sch_ep->bw_cost_per_microframe > bw_boundary)
-+		return -ERANGE;
-+
-+	/* update bus bandwidth info */
-+	update_bus_bw(sch_bw, sch_ep, sch_ep->bw_cost_per_microframe);
-+
-+	return 0;
-+}
-+
-+static bool need_bw_sch(struct usb_host_endpoint *ep,
-+	enum usb_device_speed speed, int has_tt)
-+{
-+	/* only for periodic endpoints */
-+	if (usb_endpoint_xfer_control(&ep->desc)
-+		|| usb_endpoint_xfer_bulk(&ep->desc))
-+		return false;
-+
-+	/*
-+	 * for LS & FS periodic endpoints which its device don't attach
-+	 * to TT are also ignored, root-hub will schedule them directly
-+	 */
-+	if (is_fs_or_ls(speed) && !has_tt)
-+		return false;
-+
-+	return true;
-+}
-+
-+int xhci_mtk_sch_init(struct xhci_hcd_mtk *mtk)
-+{
-+	struct mu3h_sch_bw_info *sch_array;
-+	int num_usb_bus;
-+	int i;
-+
-+	/* ss IN and OUT are separated */
-+	num_usb_bus = mtk->num_u3_ports * 2 + mtk->num_u2_ports;
-+
-+	sch_array = kcalloc(num_usb_bus, sizeof(*sch_array), GFP_KERNEL);
-+	if (sch_array == NULL)
-+		return -ENOMEM;
-+
-+	for (i = 0; i < num_usb_bus; i++)
-+		INIT_LIST_HEAD(&sch_array[i].bw_ep_list);
-+
-+	mtk->sch_array = sch_array;
-+
-+	return 0;
-+}
-+EXPORT_SYMBOL_GPL(xhci_mtk_sch_init);
-+
-+void xhci_mtk_sch_exit(struct xhci_hcd_mtk *mtk)
-+{
-+	kfree(mtk->sch_array);
-+}
-+EXPORT_SYMBOL_GPL(xhci_mtk_sch_exit);
-+
-+int xhci_mtk_add_ep_quirk(struct usb_hcd *hcd, struct usb_device *udev,
-+		struct usb_host_endpoint *ep)
-+{
-+	struct xhci_hcd_mtk *mtk = hcd_to_mtk(hcd);
-+	struct xhci_hcd *xhci;
-+	struct xhci_ep_ctx *ep_ctx;
-+	struct xhci_slot_ctx *slot_ctx;
-+	struct xhci_virt_device *virt_dev;
-+	struct mu3h_sch_bw_info *sch_bw;
-+	struct mu3h_sch_ep_info *sch_ep;
-+	struct mu3h_sch_bw_info *sch_array;
-+	unsigned int ep_index;
-+	int bw_index;
-+	int ret = 0;
-+
-+	xhci = hcd_to_xhci(hcd);
-+	virt_dev = xhci->devs[udev->slot_id];
-+	ep_index = xhci_get_endpoint_index(&ep->desc);
-+	slot_ctx = xhci_get_slot_ctx(xhci, virt_dev->in_ctx);
-+	ep_ctx = xhci_get_ep_ctx(xhci, virt_dev->in_ctx, ep_index);
-+	sch_array = mtk->sch_array;
-+
-+	xhci_dbg(xhci, "%s() type:%d, speed:%d, mpkt:%d, dir:%d, ep:%p\n",
-+		__func__, usb_endpoint_type(&ep->desc), udev->speed,
-+		GET_MAX_PACKET(usb_endpoint_maxp(&ep->desc)),
-+		usb_endpoint_dir_in(&ep->desc), ep);
-+
-+	if (!need_bw_sch(ep, udev->speed, slot_ctx->tt_info & TT_SLOT))
-+		return 0;
-+
-+	bw_index = get_bw_index(xhci, udev, ep);
-+	sch_bw = &sch_array[bw_index];
-+
-+	sch_ep = kzalloc(sizeof(struct mu3h_sch_ep_info), GFP_NOIO);
-+	if (!sch_ep)
-+		return -ENOMEM;
-+
-+	setup_sch_info(udev, ep_ctx, sch_ep);
-+
-+	ret = check_sch_bw(udev, sch_bw, sch_ep);
-+	if (ret) {
-+		xhci_err(xhci, "Not enough bandwidth!\n");
-+		kfree(sch_ep);
-+		return -ENOSPC;
-+	}
-+
-+	list_add_tail(&sch_ep->endpoint, &sch_bw->bw_ep_list);
-+	sch_ep->ep = ep;
-+
-+	ep_ctx->reserved[0] |= cpu_to_le32(EP_BPKTS(sch_ep->pkts)
-+		| EP_BCSCOUNT(sch_ep->cs_count) | EP_BBM(sch_ep->burst_mode));
-+	ep_ctx->reserved[1] |= cpu_to_le32(EP_BOFFSET(sch_ep->offset)
-+		| EP_BREPEAT(sch_ep->repeat));
-+
-+	xhci_dbg(xhci, " PKTS:%x, CSCOUNT:%x, BM:%x, OFFSET:%x, REPEAT:%x\n",
-+			sch_ep->pkts, sch_ep->cs_count, sch_ep->burst_mode,
-+			sch_ep->offset, sch_ep->repeat);
-+
-+	return 0;
-+}
-+EXPORT_SYMBOL_GPL(xhci_mtk_add_ep_quirk);
-+
-+void xhci_mtk_drop_ep_quirk(struct usb_hcd *hcd, struct usb_device *udev,
-+		struct usb_host_endpoint *ep)
-+{
-+	struct xhci_hcd_mtk *mtk = hcd_to_mtk(hcd);
-+	struct xhci_hcd *xhci;
-+	struct xhci_slot_ctx *slot_ctx;
-+	struct xhci_virt_device *virt_dev;
-+	struct mu3h_sch_bw_info *sch_array;
-+	struct mu3h_sch_bw_info *sch_bw;
-+	struct mu3h_sch_ep_info *sch_ep;
-+	int bw_index;
-+
-+	xhci = hcd_to_xhci(hcd);
-+	virt_dev = xhci->devs[udev->slot_id];
-+	slot_ctx = xhci_get_slot_ctx(xhci, virt_dev->in_ctx);
-+	sch_array = mtk->sch_array;
-+
-+	xhci_dbg(xhci, "%s() type:%d, speed:%d, mpks:%d, dir:%d, ep:%p\n",
-+		__func__, usb_endpoint_type(&ep->desc), udev->speed,
-+		GET_MAX_PACKET(usb_endpoint_maxp(&ep->desc)),
-+		usb_endpoint_dir_in(&ep->desc), ep);
-+
-+	if (!need_bw_sch(ep, udev->speed, slot_ctx->tt_info & TT_SLOT))
-+		return;
-+
-+	bw_index = get_bw_index(xhci, udev, ep);
-+	sch_bw = &sch_array[bw_index];
-+
-+	list_for_each_entry(sch_ep, &sch_bw->bw_ep_list, endpoint) {
-+		if (sch_ep->ep == ep) {
-+			update_bus_bw(sch_bw, sch_ep,
-+				-sch_ep->bw_cost_per_microframe);
-+			list_del(&sch_ep->endpoint);
-+			kfree(sch_ep);
-+			break;
-+		}
-+	}
-+}
-+EXPORT_SYMBOL_GPL(xhci_mtk_drop_ep_quirk);
---- /dev/null
-+++ b/drivers/usb/host/xhci-mtk.c
-@@ -0,0 +1,763 @@
-+/*
-+ * MediaTek xHCI Host Controller Driver
-+ *
-+ * Copyright (c) 2015 MediaTek Inc.
-+ * Author:
-+ *  Chunfeng Yun <chunfeng.yun at mediatek.com>
-+ *
-+ * This software is licensed under the terms of the GNU General Public
-+ * License version 2, as published by the Free Software Foundation, and
-+ * may be copied, distributed, and modified under those terms.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ */
-+
-+#include <linux/clk.h>
-+#include <linux/dma-mapping.h>
-+#include <linux/iopoll.h>
-+#include <linux/kernel.h>
-+#include <linux/mfd/syscon.h>
-+#include <linux/module.h>
-+#include <linux/of.h>
-+#include <linux/phy/phy.h>
-+#include <linux/platform_device.h>
-+#include <linux/pm_runtime.h>
-+#include <linux/regmap.h>
-+#include <linux/regulator/consumer.h>
-+
-+#include "xhci.h"
-+#include "xhci-mtk.h"
-+
-+/* ip_pw_ctrl0 register */
-+#define CTRL0_IP_SW_RST	BIT(0)
-+
-+/* ip_pw_ctrl1 register */
-+#define CTRL1_IP_HOST_PDN	BIT(0)
-+
-+/* ip_pw_ctrl2 register */
-+#define CTRL2_IP_DEV_PDN	BIT(0)
-+
-+/* ip_pw_sts1 register */
-+#define STS1_IP_SLEEP_STS	BIT(30)
-+#define STS1_XHCI_RST		BIT(11)
-+#define STS1_SYS125_RST	BIT(10)
-+#define STS1_REF_RST		BIT(8)
-+#define STS1_SYSPLL_STABLE	BIT(0)
-+
-+/* ip_xhci_cap register */
-+#define CAP_U3_PORT_NUM(p)	((p) & 0xff)
-+#define CAP_U2_PORT_NUM(p)	(((p) >> 8) & 0xff)
-+
-+/* u3_ctrl_p register */
-+#define CTRL_U3_PORT_HOST_SEL	BIT(2)
-+#define CTRL_U3_PORT_PDN	BIT(1)
-+#define CTRL_U3_PORT_DIS	BIT(0)
-+
-+/* u2_ctrl_p register */
-+#define CTRL_U2_PORT_HOST_SEL	BIT(2)
-+#define CTRL_U2_PORT_PDN	BIT(1)
-+#define CTRL_U2_PORT_DIS	BIT(0)
-+
-+/* u2_phy_pll register */
-+#define CTRL_U2_FORCE_PLL_STB	BIT(28)
-+
-+#define PERI_WK_CTRL0		0x400
-+#define UWK_CTR0_0P_LS_PE	BIT(8)  /* posedge */
-+#define UWK_CTR0_0P_LS_NE	BIT(7)  /* negedge for 0p linestate*/
-+#define UWK_CTL1_1P_LS_C(x)	(((x) & 0xf) << 1)
-+#define UWK_CTL1_1P_LS_E	BIT(0)
-+
-+#define PERI_WK_CTRL1		0x404
-+#define UWK_CTL1_IS_C(x)	(((x) & 0xf) << 26)
-+#define UWK_CTL1_IS_E		BIT(25)
-+#define UWK_CTL1_0P_LS_C(x)	(((x) & 0xf) << 21)
-+#define UWK_CTL1_0P_LS_E	BIT(20)
-+#define UWK_CTL1_IDDIG_C(x)	(((x) & 0xf) << 11)  /* cycle debounce */
-+#define UWK_CTL1_IDDIG_E	BIT(10) /* enable debounce */
-+#define UWK_CTL1_IDDIG_P	BIT(9)  /* polarity */
-+#define UWK_CTL1_0P_LS_P	BIT(7)
-+#define UWK_CTL1_IS_P		BIT(6)  /* polarity for ip sleep */
-+
-+enum ssusb_wakeup_src {
-+	SSUSB_WK_IP_SLEEP = 1,
-+	SSUSB_WK_LINE_STATE = 2,
-+};
-+
-+static int xhci_mtk_host_enable(struct xhci_hcd_mtk *mtk)
-+{
-+	struct mu3c_ippc_regs __iomem *ippc = mtk->ippc_regs;
-+	u32 value, check_val;
-+	int ret;
-+	int i;
-+
-+	/* power on host ip */
-+	value = readl(&ippc->ip_pw_ctr1);
-+	value &= ~CTRL1_IP_HOST_PDN;
-+	writel(value, &ippc->ip_pw_ctr1);
-+
-+	/* power on and enable all u3 ports */
-+	for (i = 0; i < mtk->num_u3_ports; i++) {
-+		value = readl(&ippc->u3_ctrl_p[i]);
-+		value &= ~(CTRL_U3_PORT_PDN | CTRL_U3_PORT_DIS);
-+		value |= CTRL_U3_PORT_HOST_SEL;
-+		writel(value, &ippc->u3_ctrl_p[i]);
-+	}
-+
-+	/* power on and enable all u2 ports */
-+	for (i = 0; i < mtk->num_u2_ports; i++) {
-+		value = readl(&ippc->u2_ctrl_p[i]);
-+		value &= ~(CTRL_U2_PORT_PDN | CTRL_U2_PORT_DIS);
-+		value |= CTRL_U2_PORT_HOST_SEL;
-+		writel(value, &ippc->u2_ctrl_p[i]);
-+	}
-+
-+	/*
-+	 * wait for clocks to be stable, and clock domains reset to
-+	 * be inactive after power on and enable ports
-+	 */
-+	check_val = STS1_SYSPLL_STABLE | STS1_REF_RST |
-+			STS1_SYS125_RST | STS1_XHCI_RST;
-+
-+	ret = readl_poll_timeout(&ippc->ip_pw_sts1, value,
-+			  (check_val == (value & check_val)), 100, 20000);
-+	if (ret) {
-+		dev_err(mtk->dev, "clocks are not stable (0x%x)\n", value);
-+		return ret;
-+	}
-+
-+	return 0;
-+}
-+
-+static int xhci_mtk_host_disable(struct xhci_hcd_mtk *mtk)
-+{
-+	struct mu3c_ippc_regs __iomem *ippc = mtk->ippc_regs;
-+	u32 value;
-+	int ret;
-+	int i;
-+
-+	/* power down all u3 ports */
-+	for (i = 0; i < mtk->num_u3_ports; i++) {
-+		value = readl(&ippc->u3_ctrl_p[i]);
-+		value |= CTRL_U3_PORT_PDN;
-+		writel(value, &ippc->u3_ctrl_p[i]);
-+	}
-+
-+	/* power down all u2 ports */
-+	for (i = 0; i < mtk->num_u2_ports; i++) {
-+		value = readl(&ippc->u2_ctrl_p[i]);
-+		value |= CTRL_U2_PORT_PDN;
-+		writel(value, &ippc->u2_ctrl_p[i]);
-+	}
-+
-+	/* power down host ip */
-+	value = readl(&ippc->ip_pw_ctr1);
-+	value |= CTRL1_IP_HOST_PDN;
-+	writel(value, &ippc->ip_pw_ctr1);
-+
-+	/* wait for host ip to sleep */
-+	ret = readl_poll_timeout(&ippc->ip_pw_sts1, value,
-+			  (value & STS1_IP_SLEEP_STS), 100, 100000);
-+	if (ret) {
-+		dev_err(mtk->dev, "ip sleep failed!!!\n");
-+		return ret;
-+	}
-+	return 0;
-+}
-+
-+static int xhci_mtk_ssusb_config(struct xhci_hcd_mtk *mtk)
-+{
-+	struct mu3c_ippc_regs __iomem *ippc = mtk->ippc_regs;
-+	u32 value;
-+
-+	/* reset whole ip */
-+	value = readl(&ippc->ip_pw_ctr0);
-+	value |= CTRL0_IP_SW_RST;
-+	writel(value, &ippc->ip_pw_ctr0);
-+	udelay(1);
-+	value = readl(&ippc->ip_pw_ctr0);
-+	value &= ~CTRL0_IP_SW_RST;
-+	writel(value, &ippc->ip_pw_ctr0);
-+
-+	/*
-+	 * device ip is default power-on in fact
-+	 * power down device ip, otherwise ip-sleep will fail
-+	 */
-+	value = readl(&ippc->ip_pw_ctr2);
-+	value |= CTRL2_IP_DEV_PDN;
-+	writel(value, &ippc->ip_pw_ctr2);
-+
-+	value = readl(&ippc->ip_xhci_cap);
-+	mtk->num_u3_ports = CAP_U3_PORT_NUM(value);
-+	mtk->num_u2_ports = CAP_U2_PORT_NUM(value);
-+	dev_dbg(mtk->dev, "%s u2p:%d, u3p:%d\n", __func__,
-+			mtk->num_u2_ports, mtk->num_u3_ports);
-+
-+	return xhci_mtk_host_enable(mtk);
-+}
-+
-+static int xhci_mtk_clks_enable(struct xhci_hcd_mtk *mtk)
-+{
-+	int ret;
-+
-+	ret = clk_prepare_enable(mtk->sys_clk);
-+	if (ret) {
-+		dev_err(mtk->dev, "failed to enable sys_clk\n");
-+		goto sys_clk_err;
-+	}
-+
-+	if (mtk->wakeup_src) {
-+		ret = clk_prepare_enable(mtk->wk_deb_p0);
-+		if (ret) {
-+			dev_err(mtk->dev, "failed to enable wk_deb_p0\n");
-+			goto usb_p0_err;
-+		}
-+
-+		ret = clk_prepare_enable(mtk->wk_deb_p1);
-+		if (ret) {
-+			dev_err(mtk->dev, "failed to enable wk_deb_p1\n");
-+			goto usb_p1_err;
-+		}
-+	}
-+	return 0;
-+
-+usb_p1_err:
-+	clk_disable_unprepare(mtk->wk_deb_p0);
-+usb_p0_err:
-+	clk_disable_unprepare(mtk->sys_clk);
-+sys_clk_err:
-+	return -EINVAL;
-+}
-+
-+static void xhci_mtk_clks_disable(struct xhci_hcd_mtk *mtk)
-+{
-+	if (mtk->wakeup_src) {
-+		clk_disable_unprepare(mtk->wk_deb_p1);
-+		clk_disable_unprepare(mtk->wk_deb_p0);
-+	}
-+	clk_disable_unprepare(mtk->sys_clk);
-+}
-+
-+/* only clocks can be turn off for ip-sleep wakeup mode */
-+static void usb_wakeup_ip_sleep_en(struct xhci_hcd_mtk *mtk)
-+{
-+	u32 tmp;
-+	struct regmap *pericfg = mtk->pericfg;
-+
-+	regmap_read(pericfg, PERI_WK_CTRL1, &tmp);
-+	tmp &= ~UWK_CTL1_IS_P;
-+	tmp &= ~(UWK_CTL1_IS_C(0xf));
-+	tmp |= UWK_CTL1_IS_C(0x8);
-+	regmap_write(pericfg, PERI_WK_CTRL1, tmp);
-+	regmap_write(pericfg, PERI_WK_CTRL1, tmp | UWK_CTL1_IS_E);
-+
-+	regmap_read(pericfg, PERI_WK_CTRL1, &tmp);
-+	dev_dbg(mtk->dev, "%s(): WK_CTRL1[P6,E25,C26:29]=%#x\n",
-+		__func__, tmp);
-+}
-+
-+static void usb_wakeup_ip_sleep_dis(struct xhci_hcd_mtk *mtk)
-+{
-+	u32 tmp;
-+
-+	regmap_read(mtk->pericfg, PERI_WK_CTRL1, &tmp);
-+	tmp &= ~UWK_CTL1_IS_E;
-+	regmap_write(mtk->pericfg, PERI_WK_CTRL1, tmp);
-+}
-+
-+/*
-+* for line-state wakeup mode, phy's power should not power-down
-+* and only support cable plug in/out
-+*/
-+static void usb_wakeup_line_state_en(struct xhci_hcd_mtk *mtk)
-+{
-+	u32 tmp;
-+	struct regmap *pericfg = mtk->pericfg;
-+
-+	/* line-state of u2-port0 */
-+	regmap_read(pericfg, PERI_WK_CTRL1, &tmp);
-+	tmp &= ~UWK_CTL1_0P_LS_P;
-+	tmp &= ~(UWK_CTL1_0P_LS_C(0xf));
-+	tmp |= UWK_CTL1_0P_LS_C(0x8);
-+	regmap_write(pericfg, PERI_WK_CTRL1, tmp);
-+	regmap_read(pericfg, PERI_WK_CTRL1, &tmp);
-+	regmap_write(pericfg, PERI_WK_CTRL1, tmp | UWK_CTL1_0P_LS_E);
-+
-+	/* line-state of u2-port1 */
-+	regmap_read(pericfg, PERI_WK_CTRL0, &tmp);
-+	tmp &= ~(UWK_CTL1_1P_LS_C(0xf));
-+	tmp |= UWK_CTL1_1P_LS_C(0x8);
-+	regmap_write(pericfg, PERI_WK_CTRL0, tmp);
-+	regmap_write(pericfg, PERI_WK_CTRL0, tmp | UWK_CTL1_1P_LS_E);
-+}
-+
-+static void usb_wakeup_line_state_dis(struct xhci_hcd_mtk *mtk)
-+{
-+	u32 tmp;
-+	struct regmap *pericfg = mtk->pericfg;
-+
-+	/* line-state of u2-port0 */
-+	regmap_read(pericfg, PERI_WK_CTRL1, &tmp);
-+	tmp &= ~UWK_CTL1_0P_LS_E;
-+	regmap_write(pericfg, PERI_WK_CTRL1, tmp);
-+
-+	/* line-state of u2-port1 */
-+	regmap_read(pericfg, PERI_WK_CTRL0, &tmp);
-+	tmp &= ~UWK_CTL1_1P_LS_E;
-+	regmap_write(pericfg, PERI_WK_CTRL0, tmp);
-+}
-+
-+static void usb_wakeup_enable(struct xhci_hcd_mtk *mtk)
-+{
-+	if (mtk->wakeup_src == SSUSB_WK_IP_SLEEP)
-+		usb_wakeup_ip_sleep_en(mtk);
-+	else if (mtk->wakeup_src == SSUSB_WK_LINE_STATE)
-+		usb_wakeup_line_state_en(mtk);
-+}
-+
-+static void usb_wakeup_disable(struct xhci_hcd_mtk *mtk)
-+{
-+	if (mtk->wakeup_src == SSUSB_WK_IP_SLEEP)
-+		usb_wakeup_ip_sleep_dis(mtk);
-+	else if (mtk->wakeup_src == SSUSB_WK_LINE_STATE)
-+		usb_wakeup_line_state_dis(mtk);
-+}
-+
-+static int usb_wakeup_of_property_parse(struct xhci_hcd_mtk *mtk,
-+				struct device_node *dn)
-+{
-+	struct device *dev = mtk->dev;
-+
-+	/*
-+	* wakeup function is optional, so it is not an error if this property
-+	* does not exist, and in such case, no need to get relative
-+	* properties anymore.
-+	*/
-+	of_property_read_u32(dn, "mediatek,wakeup-src", &mtk->wakeup_src);
-+	if (!mtk->wakeup_src)
-+		return 0;
-+
-+	mtk->wk_deb_p0 = devm_clk_get(dev, "wakeup_deb_p0");
-+	if (IS_ERR(mtk->wk_deb_p0)) {
-+		dev_err(dev, "fail to get wakeup_deb_p0\n");
-+		return PTR_ERR(mtk->wk_deb_p0);
-+	}
-+
-+	mtk->wk_deb_p1 = devm_clk_get(dev, "wakeup_deb_p1");
-+	if (IS_ERR(mtk->wk_deb_p1)) {
-+		dev_err(dev, "fail to get wakeup_deb_p1\n");
-+		return PTR_ERR(mtk->wk_deb_p1);
-+	}
-+
-+	mtk->pericfg = syscon_regmap_lookup_by_phandle(dn,
-+						"mediatek,syscon-wakeup");
-+	if (IS_ERR(mtk->pericfg)) {
-+		dev_err(dev, "fail to get pericfg regs\n");
-+		return PTR_ERR(mtk->pericfg);
-+	}
-+
-+	return 0;
-+}
-+
-+static int xhci_mtk_setup(struct usb_hcd *hcd);
-+static const struct xhci_driver_overrides xhci_mtk_overrides __initconst = {
-+	.extra_priv_size = sizeof(struct xhci_hcd),
-+	.reset = xhci_mtk_setup,
-+};
-+
-+static struct hc_driver __read_mostly xhci_mtk_hc_driver;
-+
-+static int xhci_mtk_phy_init(struct xhci_hcd_mtk *mtk)
-+{
-+	int i;
-+	int ret;
-+
-+	for (i = 0; i < mtk->num_phys; i++) {
-+		ret = phy_init(mtk->phys[i]);
-+		if (ret)
-+			goto exit_phy;
-+	}
-+	return 0;
-+
-+exit_phy:
-+	for (; i > 0; i--)
-+		phy_exit(mtk->phys[i - 1]);
-+
-+	return ret;
-+}
-+
-+static int xhci_mtk_phy_exit(struct xhci_hcd_mtk *mtk)
-+{
-+	int i;
-+
-+	for (i = 0; i < mtk->num_phys; i++)
-+		phy_exit(mtk->phys[i]);
-+
-+	return 0;
-+}
-+
-+static int xhci_mtk_phy_power_on(struct xhci_hcd_mtk *mtk)
-+{
-+	int i;
-+	int ret;
-+
-+	for (i = 0; i < mtk->num_phys; i++) {
-+		ret = phy_power_on(mtk->phys[i]);
-+		if (ret)
-+			goto power_off_phy;
-+	}
-+	return 0;
-+
-+power_off_phy:
-+	for (; i > 0; i--)
-+		phy_power_off(mtk->phys[i - 1]);
-+
-+	return ret;
-+}
-+
-+static void xhci_mtk_phy_power_off(struct xhci_hcd_mtk *mtk)
-+{
-+	unsigned int i;
-+
-+	for (i = 0; i < mtk->num_phys; i++)
-+		phy_power_off(mtk->phys[i]);
-+}
-+
-+static int xhci_mtk_ldos_enable(struct xhci_hcd_mtk *mtk)
-+{
-+	int ret;
-+
-+	ret = regulator_enable(mtk->vbus);
-+	if (ret) {
-+		dev_err(mtk->dev, "failed to enable vbus\n");
-+		return ret;
-+	}
-+
-+	ret = regulator_enable(mtk->vusb33);
-+	if (ret) {
-+		dev_err(mtk->dev, "failed to enable vusb33\n");
-+		regulator_disable(mtk->vbus);
-+		return ret;
-+	}
-+	return 0;
-+}
-+
-+static void xhci_mtk_ldos_disable(struct xhci_hcd_mtk *mtk)
-+{
-+	regulator_disable(mtk->vbus);
-+	regulator_disable(mtk->vusb33);
-+}
-+
-+static void xhci_mtk_quirks(struct device *dev, struct xhci_hcd *xhci)
-+{
-+	struct usb_hcd *hcd = xhci_to_hcd(xhci);
-+	struct xhci_hcd_mtk *mtk = hcd_to_mtk(hcd);
-+
-+	/*
-+	 * As of now platform drivers don't provide MSI support so we ensure
-+	 * here that the generic code does not try to make a pci_dev from our
-+	 * dev struct in order to setup MSI
-+	 */
-+	xhci->quirks |= XHCI_PLAT;
-+	xhci->quirks |= XHCI_MTK_HOST;
-+	/*
-+	 * MTK host controller gives a spurious successful event after a
-+	 * short transfer. Ignore it.
-+	 */
-+	xhci->quirks |= XHCI_SPURIOUS_SUCCESS;
-+	if (mtk->lpm_support)
-+		xhci->quirks |= XHCI_LPM_SUPPORT;
-+}
-+
-+/* called during probe() after chip reset completes */
-+static int xhci_mtk_setup(struct usb_hcd *hcd)
-+{
-+	struct xhci_hcd_mtk *mtk = hcd_to_mtk(hcd);
-+	int ret;
-+
-+	if (usb_hcd_is_primary_hcd(hcd)) {
-+		ret = xhci_mtk_ssusb_config(mtk);
-+		if (ret)
-+			return ret;
-+		ret = xhci_mtk_sch_init(mtk);
-+		if (ret)
-+			return ret;
-+	}
-+
-+	return xhci_gen_setup(hcd, xhci_mtk_quirks);
-+}
-+
-+static int xhci_mtk_probe(struct platform_device *pdev)
-+{
-+	struct device *dev = &pdev->dev;
-+	struct device_node *node = dev->of_node;
-+	struct xhci_hcd_mtk *mtk;
-+	const struct hc_driver *driver;
-+	struct xhci_hcd *xhci;
-+	struct resource *res;
-+	struct usb_hcd *hcd;
-+	struct phy *phy;
-+	int phy_num;
-+	int ret = -ENODEV;
-+	int irq;
-+
-+	if (usb_disabled())
-+		return -ENODEV;
-+
-+	driver = &xhci_mtk_hc_driver;
-+	mtk = devm_kzalloc(dev, sizeof(*mtk), GFP_KERNEL);
-+	if (!mtk)
-+		return -ENOMEM;
-+
-+	mtk->dev = dev;
-+	mtk->vbus = devm_regulator_get(dev, "vbus");
-+	if (IS_ERR(mtk->vbus)) {
-+		dev_err(dev, "fail to get vbus\n");
-+		return PTR_ERR(mtk->vbus);
-+	}
-+
-+	mtk->vusb33 = devm_regulator_get(dev, "vusb33");
-+	if (IS_ERR(mtk->vusb33)) {
-+		dev_err(dev, "fail to get vusb33\n");
-+		return PTR_ERR(mtk->vusb33);
-+	}
-+
-+	mtk->sys_clk = devm_clk_get(dev, "sys_ck");
-+	if (IS_ERR(mtk->sys_clk)) {
-+		dev_err(dev, "fail to get sys_ck\n");
-+		return PTR_ERR(mtk->sys_clk);
-+	}
-+
-+	mtk->lpm_support = of_property_read_bool(node, "usb3-lpm-capable");
-+
-+	ret = usb_wakeup_of_property_parse(mtk, node);
-+	if (ret)
-+		return ret;
-+
-+	mtk->num_phys = of_count_phandle_with_args(node,
-+			"phys", "#phy-cells");
-+	if (mtk->num_phys > 0) {
-+		mtk->phys = devm_kcalloc(dev, mtk->num_phys,
-+					sizeof(*mtk->phys), GFP_KERNEL);
-+		if (!mtk->phys)
-+			return -ENOMEM;
-+	} else {
-+		mtk->num_phys = 0;
-+	}
-+	pm_runtime_enable(dev);
-+	pm_runtime_get_sync(dev);
-+	device_enable_async_suspend(dev);
-+
-+	ret = xhci_mtk_ldos_enable(mtk);
-+	if (ret)
-+		goto disable_pm;
-+
-+	ret = xhci_mtk_clks_enable(mtk);
-+	if (ret)
-+		goto disable_ldos;
-+
-+	irq = platform_get_irq(pdev, 0);
-+	if (irq < 0)
-+		goto disable_clk;
-+
-+	/* Initialize dma_mask and coherent_dma_mask to 32-bits */
-+	ret = dma_set_coherent_mask(dev, DMA_BIT_MASK(32));
-+	if (ret)
-+		goto disable_clk;
-+
-+	if (!dev->dma_mask)
-+		dev->dma_mask = &dev->coherent_dma_mask;
-+	else
-+		dma_set_mask(dev, DMA_BIT_MASK(32));
-+
-+	hcd = usb_create_hcd(driver, dev, dev_name(dev));
-+	if (!hcd) {
-+		ret = -ENOMEM;
-+		goto disable_clk;
-+	}
-+
-+	/*
-+	 * USB 2.0 roothub is stored in the platform_device.
-+	 * Swap it with mtk HCD.
-+	 */
-+	mtk->hcd = platform_get_drvdata(pdev);
-+	platform_set_drvdata(pdev, mtk);
-+
-+	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-+	hcd->regs = devm_ioremap_resource(dev, res);
-+	if (IS_ERR(hcd->regs)) {
-+		ret = PTR_ERR(hcd->regs);
-+		goto put_usb2_hcd;
-+	}
-+	hcd->rsrc_start = res->start;
-+	hcd->rsrc_len = resource_size(res);
-+
-+	res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
-+	mtk->ippc_regs = devm_ioremap_resource(dev, res);
-+	if (IS_ERR(mtk->ippc_regs)) {
-+		ret = PTR_ERR(mtk->ippc_regs);
-+		goto put_usb2_hcd;
-+	}
-+
-+	for (phy_num = 0; phy_num < mtk->num_phys; phy_num++) {
-+		phy = devm_of_phy_get_by_index(dev, node, phy_num);
-+		if (IS_ERR(phy)) {
-+			ret = PTR_ERR(phy);
-+			goto put_usb2_hcd;
-+		}
-+		mtk->phys[phy_num] = phy;
-+	}
-+
-+	ret = xhci_mtk_phy_init(mtk);
-+	if (ret)
-+		goto put_usb2_hcd;
-+
-+	ret = xhci_mtk_phy_power_on(mtk);
-+	if (ret)
-+		goto exit_phys;
-+
-+	device_init_wakeup(dev, true);
-+
-+	xhci = hcd_to_xhci(hcd);
-+	xhci->main_hcd = hcd;
-+	xhci->shared_hcd = usb_create_shared_hcd(driver, dev,
-+			dev_name(dev), hcd);
-+	if (!xhci->shared_hcd) {
-+		ret = -ENOMEM;
-+		goto power_off_phys;
-+	}
-+
-+	if (HCC_MAX_PSA(xhci->hcc_params) >= 4)
-+		xhci->shared_hcd->can_do_streams = 1;
-+
-+	ret = usb_add_hcd(hcd, irq, IRQF_SHARED);
-+	if (ret)
-+		goto put_usb3_hcd;
-+
-+	ret = usb_add_hcd(xhci->shared_hcd, irq, IRQF_SHARED);
-+	if (ret)
-+		goto dealloc_usb2_hcd;
-+
-+	return 0;
-+
-+dealloc_usb2_hcd:
-+	usb_remove_hcd(hcd);
-+
-+put_usb3_hcd:
-+	xhci_mtk_sch_exit(mtk);
-+	usb_put_hcd(xhci->shared_hcd);
-+
-+power_off_phys:
-+	xhci_mtk_phy_power_off(mtk);
-+	device_init_wakeup(dev, false);
-+
-+exit_phys:
-+	xhci_mtk_phy_exit(mtk);
-+
-+put_usb2_hcd:
-+	usb_put_hcd(hcd);
-+
-+disable_clk:
-+	xhci_mtk_clks_disable(mtk);
-+
-+disable_ldos:
-+	xhci_mtk_ldos_disable(mtk);
-+
-+disable_pm:
-+	pm_runtime_put_sync(dev);
-+	pm_runtime_disable(dev);
-+	return ret;
-+}
-+
-+static int xhci_mtk_remove(struct platform_device *dev)
-+{
-+	struct xhci_hcd_mtk *mtk = platform_get_drvdata(dev);
-+	struct usb_hcd	*hcd = mtk->hcd;
-+	struct xhci_hcd	*xhci = hcd_to_xhci(hcd);
-+
-+	usb_remove_hcd(xhci->shared_hcd);
-+	xhci_mtk_phy_power_off(mtk);
-+	xhci_mtk_phy_exit(mtk);
-+	device_init_wakeup(&dev->dev, false);
-+
-+	usb_remove_hcd(hcd);
-+	usb_put_hcd(xhci->shared_hcd);
-+	usb_put_hcd(hcd);
-+	xhci_mtk_sch_exit(mtk);
-+	xhci_mtk_clks_disable(mtk);
-+	xhci_mtk_ldos_disable(mtk);
-+	pm_runtime_put_sync(&dev->dev);
-+	pm_runtime_disable(&dev->dev);
-+
-+	return 0;
-+}
-+
-+#ifdef CONFIG_PM_SLEEP
-+static int xhci_mtk_suspend(struct device *dev)
-+{
-+	struct xhci_hcd_mtk *mtk = dev_get_drvdata(dev);
-+
-+	xhci_mtk_host_disable(mtk);
-+	xhci_mtk_phy_power_off(mtk);
-+	xhci_mtk_clks_disable(mtk);
-+	usb_wakeup_enable(mtk);
-+	return 0;
-+}
-+
-+static int xhci_mtk_resume(struct device *dev)
-+{
-+	struct xhci_hcd_mtk *mtk = dev_get_drvdata(dev);
-+
-+	usb_wakeup_disable(mtk);
-+	xhci_mtk_clks_enable(mtk);
-+	xhci_mtk_phy_power_on(mtk);
-+	xhci_mtk_host_enable(mtk);
-+	return 0;
-+}
-+
-+static const struct dev_pm_ops xhci_mtk_pm_ops = {
-+	SET_SYSTEM_SLEEP_PM_OPS(xhci_mtk_suspend, xhci_mtk_resume)
-+};
-+#define DEV_PM_OPS	(&xhci_mtk_pm_ops)
-+#else
-+#define DEV_PM_OPS	NULL
-+#endif /* CONFIG_PM */
-+
-+#ifdef CONFIG_OF
-+static const struct of_device_id mtk_xhci_of_match[] = {
-+	{ .compatible = "mediatek,mt8173-xhci"},
-+	{ },
-+};
-+MODULE_DEVICE_TABLE(of, mtk_xhci_of_match);
-+#endif
-+
-+static struct platform_driver mtk_xhci_driver = {
-+	.probe	= xhci_mtk_probe,
-+	.remove	= xhci_mtk_remove,
-+	.driver	= {
-+		.name = "xhci-mtk",
-+		.pm = DEV_PM_OPS,
-+		.of_match_table = of_match_ptr(mtk_xhci_of_match),
-+	},
-+};
-+MODULE_ALIAS("platform:xhci-mtk");
-+
-+static int __init xhci_mtk_init(void)
-+{
-+	xhci_init_driver(&xhci_mtk_hc_driver, &xhci_mtk_overrides);
-+	return platform_driver_register(&mtk_xhci_driver);
-+}
-+module_init(xhci_mtk_init);
-+
-+static void __exit xhci_mtk_exit(void)
-+{
-+	platform_driver_unregister(&mtk_xhci_driver);
-+}
-+module_exit(xhci_mtk_exit);
-+
-+MODULE_AUTHOR("Chunfeng Yun <chunfeng.yun at mediatek.com>");
-+MODULE_DESCRIPTION("MediaTek xHCI Host Controller Driver");
-+MODULE_LICENSE("GPL v2");
---- /dev/null
-+++ b/drivers/usb/host/xhci-mtk.h
-@@ -0,0 +1,162 @@
-+/*
-+ * Copyright (c) 2015 MediaTek Inc.
-+ * Author:
-+ *  Zhigang.Wei <zhigang.wei at mediatek.com>
-+ *  Chunfeng.Yun <chunfeng.yun at mediatek.com>
-+ *
-+ * This software is licensed under the terms of the GNU General Public
-+ * License version 2, as published by the Free Software Foundation, and
-+ * may be copied, distributed, and modified under those terms.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ */
-+
-+#ifndef _XHCI_MTK_H_
-+#define _XHCI_MTK_H_
-+
-+#include "xhci.h"
-+
-+/**
-+ * To simplify scheduler algorithm, set a upper limit for ESIT,
-+ * if a synchromous ep's ESIT is larger than @XHCI_MTK_MAX_ESIT,
-+ * round down to the limit value, that means allocating more
-+ * bandwidth to it.
-+ */
-+#define XHCI_MTK_MAX_ESIT	64
-+
-+/**
-+ * struct mu3h_sch_bw_info: schedule information for bandwidth domain
-+ *
-+ * @bus_bw: array to keep track of bandwidth already used at each uframes
-+ * @bw_ep_list: eps in the bandwidth domain
-+ *
-+ * treat a HS root port as a bandwidth domain, but treat a SS root port as
-+ * two bandwidth domains, one for IN eps and another for OUT eps.
-+ */
-+struct mu3h_sch_bw_info {
-+	u32 bus_bw[XHCI_MTK_MAX_ESIT];
-+	struct list_head bw_ep_list;
-+};
-+
-+/**
-+ * struct mu3h_sch_ep_info: schedule information for endpoint
-+ *
-+ * @esit: unit is 125us, equal to 2 << Interval field in ep-context
-+ * @num_budget_microframes: number of continuous uframes
-+ *		(@repeat==1) scheduled within the interval
-+ * @bw_cost_per_microframe: bandwidth cost per microframe
-+ * @endpoint: linked into bandwidth domain which it belongs to
-+ * @ep: address of usb_host_endpoint struct
-+ * @offset: which uframe of the interval that transfer should be
-+ *		scheduled first time within the interval
-+ * @repeat: the time gap between two uframes that transfers are
-+ *		scheduled within a interval. in the simple algorithm, only
-+ *		assign 0 or 1 to it; 0 means using only one uframe in a
-+ *		interval, and 1 means using @num_budget_microframes
-+ *		continuous uframes
-+ * @pkts: number of packets to be transferred in the scheduled uframes
-+ * @cs_count: number of CS that host will trigger
-+ * @burst_mode: burst mode for scheduling. 0: normal burst mode,
-+ *		distribute the bMaxBurst+1 packets for a single burst
-+ *		according to @pkts and @repeat, repeate the burst multiple
-+ *		times; 1: distribute the (bMaxBurst+1)*(Mult+1) packets
-+ *		according to @pkts and @repeat. normal mode is used by
-+ *		default
-+ */
-+struct mu3h_sch_ep_info {
-+	u32 esit;
-+	u32 num_budget_microframes;
-+	u32 bw_cost_per_microframe;
-+	struct list_head endpoint;
-+	void *ep;
-+	/*
-+	 * mtk xHCI scheduling information put into reserved DWs
-+	 * in ep context
-+	 */
-+	u32 offset;
-+	u32 repeat;
-+	u32 pkts;
-+	u32 cs_count;
-+	u32 burst_mode;
-+};
-+
-+#define MU3C_U3_PORT_MAX 4
-+#define MU3C_U2_PORT_MAX 5
-+
-+/**
-+ * struct mu3c_ippc_regs: MTK ssusb ip port control registers
-+ * @ip_pw_ctr0~3: ip power and clock control registers
-+ * @ip_pw_sts1~2: ip power and clock status registers
-+ * @ip_xhci_cap: ip xHCI capability register
-+ * @u3_ctrl_p[x]: ip usb3 port x control register, only low 4bytes are used
-+ * @u2_ctrl_p[x]: ip usb2 port x control register, only low 4bytes are used
-+ * @u2_phy_pll: usb2 phy pll control register
-+ */
-+struct mu3c_ippc_regs {
-+	__le32 ip_pw_ctr0;
-+	__le32 ip_pw_ctr1;
-+	__le32 ip_pw_ctr2;
-+	__le32 ip_pw_ctr3;
-+	__le32 ip_pw_sts1;
-+	__le32 ip_pw_sts2;
-+	__le32 reserved0[3];
-+	__le32 ip_xhci_cap;
-+	__le32 reserved1[2];
-+	__le64 u3_ctrl_p[MU3C_U3_PORT_MAX];
-+	__le64 u2_ctrl_p[MU3C_U2_PORT_MAX];
-+	__le32 reserved2;
-+	__le32 u2_phy_pll;
-+	__le32 reserved3[33]; /* 0x80 ~ 0xff */
-+};
-+
-+struct xhci_hcd_mtk {
-+	struct device *dev;
-+	struct usb_hcd *hcd;
-+	struct mu3h_sch_bw_info *sch_array;
-+	struct mu3c_ippc_regs __iomem *ippc_regs;
-+	int num_u2_ports;
-+	int num_u3_ports;
-+	struct regulator *vusb33;
-+	struct regulator *vbus;
-+	struct clk *sys_clk;	/* sys and mac clock */
-+	struct clk *wk_deb_p0;	/* port0's wakeup debounce clock */
-+	struct clk *wk_deb_p1;
-+	struct regmap *pericfg;
-+	struct phy **phys;
-+	int num_phys;
-+	int wakeup_src;
-+	bool lpm_support;
-+};
-+
-+static inline struct xhci_hcd_mtk *hcd_to_mtk(struct usb_hcd *hcd)
-+{
-+	return dev_get_drvdata(hcd->self.controller);
-+}
-+
-+#if IS_ENABLED(CONFIG_USB_XHCI_MTK)
-+int xhci_mtk_sch_init(struct xhci_hcd_mtk *mtk);
-+void xhci_mtk_sch_exit(struct xhci_hcd_mtk *mtk);
-+int xhci_mtk_add_ep_quirk(struct usb_hcd *hcd, struct usb_device *udev,
-+		struct usb_host_endpoint *ep);
-+void xhci_mtk_drop_ep_quirk(struct usb_hcd *hcd, struct usb_device *udev,
-+		struct usb_host_endpoint *ep);
-+
-+#else
-+static inline int xhci_mtk_add_ep_quirk(struct usb_hcd *hcd,
-+	struct usb_device *udev, struct usb_host_endpoint *ep)
-+{
-+	return 0;
-+}
-+
-+static inline void xhci_mtk_drop_ep_quirk(struct usb_hcd *hcd,
-+	struct usb_device *udev, struct usb_host_endpoint *ep)
-+{
-+}
-+
-+#endif
-+
-+#endif		/* _XHCI_MTK_H_ */
---- a/drivers/usb/host/xhci-ring.c
-+++ b/drivers/usb/host/xhci-ring.c
-@@ -68,6 +68,7 @@
- #include <linux/slab.h>
- #include "xhci.h"
- #include "xhci-trace.h"
-+#include "xhci-mtk.h"
- 
- /*
-  * Returns zero if the TRB isn't in this segment, otherwise it returns the DMA
-@@ -3110,17 +3111,22 @@ static u32 xhci_td_remainder(struct xhci
- {
- 	u32 maxp, total_packet_count;
- 
--	if (xhci->hci_version < 0x100)
-+	/* MTK xHCI is mostly 0.97 but contains some features from 1.0 */
-+	if (xhci->hci_version < 0x100 && !(xhci->quirks & XHCI_MTK_HOST))
- 		return ((td_total_len - transferred) >> 10);
- 
--	maxp = GET_MAX_PACKET(usb_endpoint_maxp(&urb->ep->desc));
--	total_packet_count = DIV_ROUND_UP(td_total_len, maxp);
--
- 	/* One TRB with a zero-length data packet. */
- 	if (num_trbs_left == 0 || (transferred == 0 && trb_buff_len == 0) ||
- 	    trb_buff_len == td_total_len)
- 		return 0;
- 
-+	/* for MTK xHCI, TD size doesn't include this TRB */
-+	if (xhci->quirks & XHCI_MTK_HOST)
-+		trb_buff_len = 0;
-+
-+	maxp = GET_MAX_PACKET(usb_endpoint_maxp(&urb->ep->desc));
-+	total_packet_count = DIV_ROUND_UP(td_total_len, maxp);
-+
- 	/* Queueing functions don't count the current TRB into transferred */
- 	return (total_packet_count - ((transferred + trb_buff_len) / maxp));
- }
-@@ -3508,7 +3514,7 @@ int xhci_queue_ctrl_tx(struct xhci_hcd *
- 		field |= 0x1;
- 
- 	/* xHCI 1.0/1.1 6.4.1.2.1: Transfer Type field */
--	if (xhci->hci_version >= 0x100) {
-+	if ((xhci->hci_version >= 0x100) || (xhci->quirks & XHCI_MTK_HOST)) {
- 		if (urb->transfer_buffer_length > 0) {
- 			if (setup->bRequestType & USB_DIR_IN)
- 				field |= TRB_TX_TYPE(TRB_DATA_IN);
---- a/drivers/usb/host/xhci.c
-+++ b/drivers/usb/host/xhci.c
-@@ -31,6 +31,7 @@
- 
- #include "xhci.h"
- #include "xhci-trace.h"
-+#include "xhci-mtk.h"
- 
- #define DRIVER_AUTHOR "Sarah Sharp"
- #define DRIVER_DESC "'eXtensible' Host Controller (xHC) Driver"
-@@ -635,7 +636,11 @@ int xhci_run(struct usb_hcd *hcd)
- 			"// Set the interrupt modulation register");
- 	temp = readl(&xhci->ir_set->irq_control);
- 	temp &= ~ER_IRQ_INTERVAL_MASK;
--	temp |= (u32) 160;
-+	/*
-+	 * the increment interval is 8 times as much as that defined
-+	 * in xHCI spec on MTK's controller
-+	 */
-+	temp |= (u32) ((xhci->quirks & XHCI_MTK_HOST) ? 20 : 160);
- 	writel(temp, &xhci->ir_set->irq_control);
- 
- 	/* Set the HCD state before we enable the irqs */
-@@ -1691,6 +1696,9 @@ int xhci_drop_endpoint(struct usb_hcd *h
- 
- 	xhci_endpoint_zero(xhci, xhci->devs[udev->slot_id], ep);
- 
-+	if (xhci->quirks & XHCI_MTK_HOST)
-+		xhci_mtk_drop_ep_quirk(hcd, udev, ep);
-+
- 	xhci_dbg(xhci, "drop ep 0x%x, slot id %d, new drop flags = %#x, new add flags = %#x\n",
- 			(unsigned int) ep->desc.bEndpointAddress,
- 			udev->slot_id,
-@@ -1786,6 +1794,15 @@ int xhci_add_endpoint(struct usb_hcd *hc
- 		return -ENOMEM;
- 	}
- 
-+	if (xhci->quirks & XHCI_MTK_HOST) {
-+		ret = xhci_mtk_add_ep_quirk(hcd, udev, ep);
-+		if (ret < 0) {
-+			xhci_free_or_cache_endpoint_ring(xhci,
-+				virt_dev, ep_index);
-+			return ret;
-+		}
-+	}
-+
- 	ctrl_ctx->add_flags |= cpu_to_le32(added_ctxs);
- 	new_add_flags = le32_to_cpu(ctrl_ctx->add_flags);
- 
---- a/drivers/usb/host/xhci.h
-+++ b/drivers/usb/host/xhci.h
-@@ -1634,6 +1634,7 @@ struct xhci_hcd {
- /* For controllers with a broken beyond repair streams implementation */
- #define XHCI_BROKEN_STREAMS	(1 << 19)
- #define XHCI_PME_STUCK_QUIRK	(1 << 20)
-+#define XHCI_MTK_HOST		(1 << 21)
- #define XHCI_MISSING_CAS	(1 << 24)
- 	unsigned int		num_active_eps;
- 	unsigned int		limit_active_eps;
diff --git a/target/linux/mediatek/patches-4.4/0020-arm64-dts-mediatek-add-xHCI-usb-phy-for-mt8173.patch b/target/linux/mediatek/patches-4.4/0020-arm64-dts-mediatek-add-xHCI-usb-phy-for-mt8173.patch
deleted file mode 100644
index 50c03ee..0000000
--- a/target/linux/mediatek/patches-4.4/0020-arm64-dts-mediatek-add-xHCI-usb-phy-for-mt8173.patch
+++ /dev/null
@@ -1,107 +0,0 @@
-From 645465d4c6dd46c5e6c9ac25cd42608b4201fde0 Mon Sep 17 00:00:00 2001
-From: "chunfeng.yun at mediatek.com" <chunfeng.yun at mediatek.com>
-Date: Tue, 17 Nov 2015 17:18:41 +0800
-Subject: [PATCH 020/102] arm64: dts: mediatek: add xHCI & usb phy for mt8173
-
-add xHCI and phy drivers for MT8173-EVB
-
-Signed-off-by: Chunfeng Yun <chunfeng.yun at mediatek.com>
----
- arch/arm64/boot/dts/mediatek/mt8173-evb.dts |   16 ++++++++++
- arch/arm64/boot/dts/mediatek/mt8173.dtsi    |   42 +++++++++++++++++++++++++++
- 2 files changed, 58 insertions(+)
-
---- a/arch/arm64/boot/dts/mediatek/mt8173-evb.dts
-+++ b/arch/arm64/boot/dts/mediatek/mt8173-evb.dts
-@@ -13,6 +13,7 @@
-  */
- 
- /dts-v1/;
-+#include <dt-bindings/gpio/gpio.h>
- #include "mt8173.dtsi"
- 
- / {
-@@ -32,6 +33,15 @@
- 	};
- 
- 	chosen { };
-+
-+	usb_p1_vbus: regulator at 0 {
-+		compatible = "regulator-fixed";
-+		regulator-name = "usb_vbus";
-+		regulator-min-microvolt = <5000000>;
-+		regulator-max-microvolt = <5000000>;
-+		gpio = <&pio 130 GPIO_ACTIVE_HIGH>;
-+		enable-active-high;
-+	};
- };
- 
- &i2c1 {
-@@ -408,3 +418,9 @@
- &uart0 {
- 	status = "okay";
- };
-+
-+&usb30 {
-+	vusb33-supply = <&mt6397_vusb_reg>;
-+	vbus-supply = <&usb_p1_vbus>;
-+	mediatek,wakeup-src = <1>;
-+};
---- a/arch/arm64/boot/dts/mediatek/mt8173.dtsi
-+++ b/arch/arm64/boot/dts/mediatek/mt8173.dtsi
-@@ -14,6 +14,7 @@
- #include <dt-bindings/clock/mt8173-clk.h>
- #include <dt-bindings/interrupt-controller/irq.h>
- #include <dt-bindings/interrupt-controller/arm-gic.h>
-+#include <dt-bindings/phy/phy.h>
- #include <dt-bindings/power/mt8173-power.h>
- #include <dt-bindings/reset-controller/mt8173-resets.h>
- #include "mt8173-pinfunc.h"
-@@ -510,6 +511,47 @@
- 			status = "disabled";
- 		};
- 
-+		usb30: usb at 11270000 {
-+			compatible = "mediatek,mt8173-xhci";
-+			reg = <0 0x11270000 0 0x1000>,
-+			      <0 0x11280700 0 0x0100>;
-+			interrupts = <GIC_SPI 115 IRQ_TYPE_LEVEL_LOW>;
-+			power-domains = <&scpsys MT8173_POWER_DOMAIN_USB>;
-+			clocks = <&topckgen CLK_TOP_USB30_SEL>,
-+				 <&pericfg CLK_PERI_USB0>,
-+				 <&pericfg CLK_PERI_USB1>;
-+			clock-names = "sys_ck",
-+				      "wakeup_deb_p0",
-+				      "wakeup_deb_p1";
-+			phys = <&phy_port0 PHY_TYPE_USB3>,
-+			       <&phy_port1 PHY_TYPE_USB2>;
-+			mediatek,syscon-wakeup = <&pericfg>;
-+			status = "okay";
-+		};
-+
-+		u3phy: usb-phy at 11290000 {
-+			compatible = "mediatek,mt8173-u3phy";
-+			reg = <0 0x11290000 0 0x800>;
-+			clocks = <&apmixedsys CLK_APMIXED_REF2USB_TX>;
-+			clock-names = "u3phya_ref";
-+			#address-cells = <2>;
-+			#size-cells = <2>;
-+			ranges;
-+			status = "okay";
-+
-+			phy_port0: port at 11290800 {
-+				reg = <0 0x11290800 0 0x800>;
-+				#phy-cells = <1>;
-+				status = "okay";
-+			};
-+
-+			phy_port1: port at 11291000 {
-+				reg = <0 0x11291000 0 0x800>;
-+				#phy-cells = <1>;
-+				status = "okay";
-+			};
-+		};
-+
- 		mmsys: clock-controller at 14000000 {
- 			compatible = "mediatek,mt8173-mmsys", "syscon";
- 			reg = <0 0x14000000 0 0x1000>;
diff --git a/target/linux/mediatek/patches-4.4/0021-Document-DT-Add-bindings-for-mediatek-MT7623-SoC-Pla.patch b/target/linux/mediatek/patches-4.4/0021-Document-DT-Add-bindings-for-mediatek-MT7623-SoC-Pla.patch
deleted file mode 100644
index 223c226..0000000
--- a/target/linux/mediatek/patches-4.4/0021-Document-DT-Add-bindings-for-mediatek-MT7623-SoC-Pla.patch
+++ /dev/null
@@ -1,55 +0,0 @@
-From e111a35542ac14712026fe1a55236f76c7fc9048 Mon Sep 17 00:00:00 2001
-From: John Crispin <blogic at openwrt.org>
-Date: Tue, 5 Jan 2016 12:13:54 +0100
-Subject: [PATCH 021/102] Document: DT: Add bindings for mediatek MT7623 SoC
- Platform
-
-This adds a DT binding documentation for the MT7623 SoC from Mediatek.
-
-Signed-off-by: John Crispin <blogic at openwrt.org>
----
- Documentation/devicetree/bindings/arm/mediatek.txt             |    4 ++++
- Documentation/devicetree/bindings/serial/mtk-uart.txt          |    1 +
- Documentation/devicetree/bindings/timer/mediatek,mtk-timer.txt |    1 +
- 3 files changed, 6 insertions(+)
-
---- a/Documentation/devicetree/bindings/arm/mediatek.txt
-+++ b/Documentation/devicetree/bindings/arm/mediatek.txt
-@@ -10,6 +10,7 @@ compatible: Must contain one of
-    "mediatek,mt6589"
-    "mediatek,mt6592"
-    "mediatek,mt6795"
-+   "mediatek,mt7623"
-    "mediatek,mt8127"
-    "mediatek,mt8135"
-    "mediatek,mt8173"
-@@ -29,6 +30,9 @@ Supported boards:
- - Evaluation board for MT6795(Helio X10):
-     Required root node properties:
-       - compatible = "mediatek,mt6795-evb", "mediatek,mt6795";
-+- Evaluation board for MT7623:
-+    Required root node properties:
-+      - compatible = "mediatek,mt7623-evb", "mediatek,mt7623";
- - MTK mt8127 tablet moose EVB:
-     Required root node properties:
-       - compatible = "mediatek,mt8127-moose", "mediatek,mt8127";
---- a/Documentation/devicetree/bindings/serial/mtk-uart.txt
-+++ b/Documentation/devicetree/bindings/serial/mtk-uart.txt
-@@ -2,6 +2,7 @@
- 
- Required properties:
- - compatible should contain:
-+  * "mediatek,mt7623-uart" for MT7623 compatible UARTS
-   * "mediatek,mt8135-uart" for MT8135 compatible UARTS
-   * "mediatek,mt8127-uart" for MT8127 compatible UARTS
-   * "mediatek,mt8173-uart" for MT8173 compatible UARTS
---- a/Documentation/devicetree/bindings/timer/mediatek,mtk-timer.txt
-+++ b/Documentation/devicetree/bindings/timer/mediatek,mtk-timer.txt
-@@ -5,6 +5,7 @@ Required properties:
- - compatible should contain:
- 	* "mediatek,mt6580-timer" for MT6580 compatible timers
- 	* "mediatek,mt6589-timer" for MT6589 compatible timers
-+	* "mediatek,mt7623-timer" for MT7623 compatible timers
- 	* "mediatek,mt8127-timer" for MT8127 compatible timers
- 	* "mediatek,mt8135-timer" for MT8135 compatible timers
- 	* "mediatek,mt8173-timer" for MT8173 compatible timers
diff --git a/target/linux/mediatek/patches-4.4/0022-soc-mediatek-add-compat-string-for-mt7623-to-scpsys.patch b/target/linux/mediatek/patches-4.4/0022-soc-mediatek-add-compat-string-for-mt7623-to-scpsys.patch
deleted file mode 100644
index 453b612..0000000
--- a/target/linux/mediatek/patches-4.4/0022-soc-mediatek-add-compat-string-for-mt7623-to-scpsys.patch
+++ /dev/null
@@ -1,22 +0,0 @@
-From f232c3b36355974bf3442de3a4726d2e499ed3fe Mon Sep 17 00:00:00 2001
-From: John Crispin <blogic at openwrt.org>
-Date: Tue, 5 Jan 2016 16:52:31 +0100
-Subject: [PATCH 022/102] soc: mediatek: add compat string for mt7623 to
- scpsys
-
-Signed-off-by: John Crispin <blogic at openwrt.org>
----
- drivers/soc/mediatek/mtk-scpsys-mt2701.c |    2 ++
- 1 file changed, 2 insertions(+)
-
---- a/drivers/soc/mediatek/mtk-scpsys-mt2701.c
-+++ b/drivers/soc/mediatek/mtk-scpsys-mt2701.c
-@@ -136,6 +136,8 @@ static const struct of_device_id of_scps
- 	{
- 		.compatible = "mediatek,mt2701-scpsys",
- 	}, {
-+		.compatible = "mediatek,mt7623-scpsys",
-+	}, {
- 		/* sentinel */
- 	}
- };
diff --git a/target/linux/mediatek/patches-4.4/0023-ARM-dts-mediatek-add-MT7623-basic-support.patch b/target/linux/mediatek/patches-4.4/0023-ARM-dts-mediatek-add-MT7623-basic-support.patch
deleted file mode 100644
index c1f2690..0000000
--- a/target/linux/mediatek/patches-4.4/0023-ARM-dts-mediatek-add-MT7623-basic-support.patch
+++ /dev/null
@@ -1,1079 +0,0 @@
-From 51d5ca9e151eb323bd965e72ad1e1dc93fcf7b13 Mon Sep 17 00:00:00 2001
-From: John Crispin <blogic at openwrt.org>
-Date: Tue, 5 Jan 2016 12:16:17 +0100
-Subject: [PATCH 023/102] ARM: dts: mediatek: add MT7623 basic support
-
-This adds basic chip support for Mediatek MT7623.
-
-Signed-off-by: John Crispin <blogic at openwrt.org>
----
- arch/arm/boot/dts/Makefile        |    1 +
- arch/arm/boot/dts/mt7623-evb.dts  |  421 ++++++++++++++++++++++++++
- arch/arm/boot/dts/mt7623.dtsi     |  601 +++++++++++++++++++++++++++++++++++++
- arch/arm/mach-mediatek/Kconfig    |    4 +
- arch/arm/mach-mediatek/mediatek.c |    1 +
- 5 files changed, 1028 insertions(+)
- create mode 100644 arch/arm/boot/dts/mt7623-evb.dts
- create mode 100644 arch/arm/boot/dts/mt7623.dtsi
-
---- a/arch/arm/boot/dts/Makefile
-+++ b/arch/arm/boot/dts/Makefile
-@@ -774,6 +774,7 @@ dtb-$(CONFIG_ARCH_MEDIATEK) += \
- 	mt6580-evbp1.dtb \
- 	mt6589-aquaris5.dtb \
- 	mt6592-evb.dtb \
-+	mt7623-evb.dtb \
- 	mt8127-moose.dtb \
- 	mt8135-evbp1.dtb
- dtb-$(CONFIG_ARCH_ZX) += zx296702-ad1.dtb
---- /dev/null
-+++ b/arch/arm/boot/dts/mt7623-evb.dts
-@@ -0,0 +1,421 @@
-+/*
-+ * Copyright (c) 2016 MediaTek Inc.
-+ * Author: John Crispin <blogic at openwrt.org>
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 as
-+ * published by the Free Software Foundation.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ */
-+
-+/dts-v1/;
-+
-+#include "mt7623.dtsi"
-+#include <dt-bindings/gpio/gpio.h>
-+
-+/ {
-+	model = "MediaTek MT7623 evaluation board";
-+	compatible = "mediatek,mt7623-evb", "mediatek,mt7623";
-+
-+	chosen {
-+		stdout-path = &uart2;
-+	};
-+
-+	memory {
-+		reg = <0 0x80000000 0 0x20000000>;
-+	};
-+
-+	usb_p1_vbus: regulator at 0 {
-+		compatible = "regulator-fixed";
-+		regulator-name = "usb_vbus";
-+		regulator-min-microvolt = <5000000>;
-+		regulator-max-microvolt = <5000000>;
-+		gpio = <&pio 135 GPIO_ACTIVE_HIGH>;
-+		enable-active-high;
-+	};
-+};
-+
-+&cpu0 {
-+	proc-supply = <&mt6323_vproc_reg>;
-+};
-+
-+&cpu1 {
-+	proc-supply = <&mt6323_vproc_reg>;
-+};
-+
-+&cpu2 {
-+	proc-supply = <&mt6323_vproc_reg>;
-+};
-+
-+&cpu3 {
-+	proc-supply = <&mt6323_vproc_reg>;
-+};
-+
-+&pwrap {
-+	pmic: mt6323 {
-+		compatible = "mediatek,mt6323";
-+		interrupt-parent = <&pio>;
-+		interrupts = <150 IRQ_TYPE_LEVEL_HIGH>;
-+		interrupt-controller;
-+		#interrupt-cells = <2>;
-+
-+		mt6323regulator: mt6323regulator{
-+			compatible = "mediatek,mt6323-regulator";
-+
-+			mt6323_vproc_reg: buck_vproc{
-+				regulator-name = "vproc";
-+				regulator-min-microvolt = < 700000>;
-+				regulator-max-microvolt = <1350000>;
-+				regulator-ramp-delay = <12500>;
-+				regulator-always-on;
-+				regulator-boot-on;
-+			};
-+
-+			mt6323_vsys_reg: buck_vsys{
-+				regulator-name = "vsys";
-+				regulator-min-microvolt = <1400000>;
-+				regulator-max-microvolt = <2987500>;
-+				regulator-ramp-delay = <25000>;
-+				regulator-always-on;
-+				regulator-boot-on;
-+			};
-+
-+			mt6323_vpa_reg: buck_vpa{
-+				regulator-name = "vpa";
-+				regulator-min-microvolt = < 500000>;
-+				regulator-max-microvolt = <3650000>;
-+			};
-+
-+			mt6323_vtcxo_reg: ldo_vtcxo{
-+				regulator-name = "vtcxo";
-+				regulator-min-microvolt = <2800000>;
-+				regulator-max-microvolt = <2800000>;
-+				regulator-enable-ramp-delay = <90>;
-+				regulator-always-on;
-+				regulator-boot-on;
-+			};
-+
-+			mt6323_vcn28_reg: ldo_vcn28{
-+				regulator-name = "vcn28";
-+				regulator-min-microvolt = <2800000>;
-+				regulator-max-microvolt = <2800000>;
-+				regulator-enable-ramp-delay = <185>;
-+			};
-+
-+			mt6323_vcn33_bt_reg: ldo_vcn33_bt{
-+				regulator-name = "vcn33_bt";
-+				regulator-min-microvolt = <3300000>;
-+				regulator-max-microvolt = <3600000>;
-+				regulator-enable-ramp-delay = <185>;
-+			};
-+
-+			mt6323_vcn33_wifi_reg: ldo_vcn33_wifi{
-+				regulator-name = "vcn33_wifi";
-+				regulator-min-microvolt = <3300000>;
-+				regulator-max-microvolt = <3600000>;
-+				regulator-enable-ramp-delay = <185>;
-+			};
-+
-+			mt6323_va_reg: ldo_va{
-+				regulator-name = "va";
-+				regulator-min-microvolt = <2800000>;
-+				regulator-max-microvolt = <2800000>;
-+				regulator-enable-ramp-delay = <216>;
-+				regulator-always-on;
-+				regulator-boot-on;
-+			};
-+
-+			mt6323_vcama_reg: ldo_vcama{
-+				regulator-name = "vcama";
-+				regulator-min-microvolt = <1500000>;
-+				regulator-max-microvolt = <2800000>;
-+				regulator-enable-ramp-delay = <216>;
-+			};
-+
-+			mt6323_vio28_reg: ldo_vio28{
-+				regulator-name = "vio28";
-+				regulator-min-microvolt = <2800000>;
-+				regulator-max-microvolt = <2800000>;
-+				regulator-enable-ramp-delay = <216>;
-+				regulator-always-on;
-+				regulator-boot-on;
-+			};
-+
-+			mt6323_vusb_reg: ldo_vusb{
-+				regulator-name = "vusb";
-+				regulator-min-microvolt = <3300000>;
-+				regulator-max-microvolt = <3300000>;
-+				regulator-enable-ramp-delay = <216>;
-+				regulator-boot-on;
-+			};
-+
-+			mt6323_vmc_reg: ldo_vmc{
-+				regulator-name = "vmc";
-+				regulator-min-microvolt = <1800000>;
-+				regulator-max-microvolt = <3300000>;
-+				regulator-enable-ramp-delay = <36>;
-+				regulator-boot-on;
-+			};
-+
-+			mt6323_vmch_reg: ldo_vmch{
-+				regulator-name = "vmch";
-+				regulator-min-microvolt = <3000000>;
-+				regulator-max-microvolt = <3300000>;
-+				regulator-enable-ramp-delay = <36>;
-+				regulator-boot-on;
-+			};
-+
-+			mt6323_vemc3v3_reg: ldo_vemc3v3{
-+				regulator-name = "vemc3v3";
-+				regulator-min-microvolt = <3000000>;
-+				regulator-max-microvolt = <3300000>;
-+				regulator-enable-ramp-delay = <36>;
-+				regulator-boot-on;
-+			};
-+
-+			mt6323_vgp1_reg: ldo_vgp1{
-+				regulator-name = "vgp1";
-+				regulator-min-microvolt = <1200000>;
-+				regulator-max-microvolt = <3300000>;
-+				regulator-enable-ramp-delay = <216>;
-+			};
-+
-+			mt6323_vgp2_reg: ldo_vgp2{
-+				regulator-name = "vgp2";
-+				regulator-min-microvolt = <1200000>;
-+				regulator-max-microvolt = <3000000>;
-+				regulator-enable-ramp-delay = <216>;
-+			};
-+
-+			mt6323_vgp3_reg: ldo_vgp3{
-+				regulator-name = "vgp3";
-+				regulator-min-microvolt = <1200000>;
-+				regulator-max-microvolt = <1800000>;
-+				regulator-enable-ramp-delay = <216>;
-+			};
-+
-+			mt6323_vcn18_reg: ldo_vcn18{
-+				regulator-name = "vcn18";
-+				regulator-min-microvolt = <1800000>;
-+				regulator-max-microvolt = <1800000>;
-+				regulator-enable-ramp-delay = <216>;
-+			};
-+
-+			mt6323_vsim1_reg: ldo_vsim1{
-+				regulator-name = "vsim1";
-+				regulator-min-microvolt = <1800000>;
-+				regulator-max-microvolt = <3000000>;
-+				regulator-enable-ramp-delay = <216>;
-+			};
-+
-+			mt6323_vsim2_reg: ldo_vsim2{
-+				regulator-name = "vsim2";
-+				regulator-min-microvolt = <1800000>;
-+				regulator-max-microvolt = <3000000>;
-+				regulator-enable-ramp-delay = <216>;
-+			};
-+
-+			mt6323_vrtc_reg: ldo_vrtc{
-+				regulator-name = "vrtc";
-+				regulator-min-microvolt = <2800000>;
-+				regulator-max-microvolt = <2800000>;
-+				regulator-always-on;
-+				regulator-boot-on;
-+			};
-+
-+			mt6323_vcamaf_reg: ldo_vcamaf{
-+				regulator-name = "vcamaf";
-+				regulator-min-microvolt = <1200000>;
-+				regulator-max-microvolt = <3300000>;
-+				regulator-enable-ramp-delay = <216>;
-+			};
-+
-+			mt6323_vibr_reg: ldo_vibr{
-+				regulator-name = "vibr";
-+				regulator-min-microvolt = <1200000>;
-+				regulator-max-microvolt = <3300000>;
-+				regulator-enable-ramp-delay = <36>;
-+			};
-+
-+			mt6323_vrf18_reg: ldo_vrf18{
-+				regulator-name = "vrf18";
-+				regulator-min-microvolt = <1825000>;
-+				regulator-max-microvolt = <1825000>;
-+				regulator-enable-ramp-delay = <187>;
-+			};
-+
-+			mt6323_vm_reg: ldo_vm{
-+				regulator-name = "vm";
-+				regulator-min-microvolt = <1200000>;
-+				regulator-max-microvolt = <1800000>;
-+				regulator-enable-ramp-delay = <216>;
-+				regulator-always-on;
-+				regulator-boot-on;
-+			};
-+
-+			mt6323_vio18_reg: ldo_vio18{
-+				regulator-name = "vio18";
-+				regulator-min-microvolt = <1800000>;
-+				regulator-max-microvolt = <1800000>;
-+				regulator-enable-ramp-delay = <216>;
-+				regulator-always-on;
-+				regulator-boot-on;
-+			};
-+
-+			mt6323_vcamd_reg: ldo_vcamd{
-+				regulator-name = "vcamd";
-+				regulator-min-microvolt = <1200000>;
-+				regulator-max-microvolt = <1800000>;
-+				regulator-enable-ramp-delay = <216>;
-+			};
-+
-+			mt6323_vcamio_reg: ldo_vcamio{
-+				regulator-name = "vcamio";
-+				regulator-min-microvolt = <1800000>;
-+				regulator-max-microvolt = <1800000>;
-+				regulator-enable-ramp-delay = <216>;
-+			};
-+		};
-+	};
-+};
-+
-+&uart2 {
-+	status = "okay";
-+};
-+
-+&pio {
-+	nand_pins_default: nanddefault {
-+		pins_dat {
-+			pinmux = <MT7623_PIN_111_MSDC0_DAT7_FUNC_NLD7>,
-+				 <MT7623_PIN_112_MSDC0_DAT6_FUNC_NLD6>,
-+				 <MT7623_PIN_114_MSDC0_DAT4_FUNC_NLD4>,
-+				 <MT7623_PIN_118_MSDC0_DAT3_FUNC_NLD3>,
-+				 <MT7623_PIN_121_MSDC0_DAT0_FUNC_NLD0>,
-+				 <MT7623_PIN_120_MSDC0_DAT1_FUNC_NLD1>,
-+				 <MT7623_PIN_113_MSDC0_DAT5_FUNC_NLD5>,
-+				 <MT7623_PIN_115_MSDC0_RSTB_FUNC_NLD8>,
-+				 <MT7623_PIN_119_MSDC0_DAT2_FUNC_NLD2>;
-+				input-enable;
-+				drive-strength = <MTK_DRIVE_8mA>;
-+				bias-pull-up;
-+		};
-+
-+		pins_we {
-+			pinmux = <MT7623_PIN_117_MSDC0_CLK_FUNC_NWEB>;
-+			drive-strength = <MTK_DRIVE_8mA>;
-+			bias-pull-up = <MTK_PUPD_SET_R1R0_10>;
-+		};
-+
-+		pins_ale {
-+			pinmux = <MT7623_PIN_116_MSDC0_CMD_FUNC_NALE>;
-+			drive-strength = <MTK_DRIVE_8mA>;
-+			bias-pull-down = <MTK_PUPD_SET_R1R0_10>;
-+		};
-+	};
-+
-+	eth_default: eth {
-+		pins_eth {
-+			pinmux = <MT7623_PIN_275_G2_MDC_FUNC_MDC>,
-+				 <MT7623_PIN_276_G2_MDIO_FUNC_MDIO>,
-+				 <MT7623_PIN_262_G2_TXEN_FUNC_G2_TXEN>,
-+				 <MT7623_PIN_263_G2_TXD3_FUNC_G2_TXD3>,
-+				 <MT7623_PIN_264_G2_TXD2_FUNC_G2_TXD2>,
-+				 <MT7623_PIN_265_G2_TXD1_FUNC_G2_TXD1>,
-+				 <MT7623_PIN_266_G2_TXD0_FUNC_G2_TXD0>,
-+				 <MT7623_PIN_267_G2_TXCLK_FUNC_G2_TXC>,
-+				 <MT7623_PIN_268_G2_RXCLK_FUNC_G2_RXC>,
-+				 <MT7623_PIN_269_G2_RXD0_FUNC_G2_RXD0>,
-+				 <MT7623_PIN_270_G2_RXD1_FUNC_G2_RXD1>,
-+				 <MT7623_PIN_271_G2_RXD2_FUNC_G2_RXD2>,
-+				 <MT7623_PIN_272_G2_RXD3_FUNC_G2_RXD3>,
-+				 <MT7623_PIN_273_ESW_INT_FUNC_ESW_INT>,
-+				 <MT7623_PIN_274_G2_RXDV_FUNC_G2_RXDV>;
-+		};
-+		
-+		pins_eth_rst {
-+			pinmux = <MT7623_PIN_15_GPIO15_FUNC_GPIO15>;
-+			output-low;
-+		};
-+	};
-+};
-+
-+&nandc {
-+	status = "okay";
-+	pinctrl-names = "default";
-+	pinctrl-0 = <&nand_pins_default>;
-+	nand at 0 {
-+		reg = <0>;
-+		partitions {
-+			compatible = "fixed-partitions";
-+			#address-cells = <1>;
-+			#size-cells = <1>;
-+
-+			partition at C0000 {
-+				label = "uboot-env";
-+				reg = <0xC0000 0x40000>;
-+			};
-+
-+			partition at 100000 {
-+				label = "factory";
-+				reg = <0x100000 0x40000>;
-+			};
-+
-+			partition at 140000 {
-+				label = "kernel";
-+				reg = <0x140000 0x2000000>;
-+			};
-+
-+			partition at 2140000 {
-+				label = "recovery";
-+				reg = <0x2140000 0x2000000>;
-+			};
-+
-+			partition at 4140000 {
-+				label = "rootfs";
-+				reg = <0x4140000 0x1000000>;
-+			};
-+		};
-+	};
-+};
-+&bch {
-+	status = "okay";
-+};
-+
-+&usb1 {
-+	vusb33-supply = <&mt6323_vusb_reg>;
-+	vbus-supply = <&usb_p1_vbus>;
-+	status = "okay";
-+};
-+
-+&u3phy1 {
-+	status = "okay";
-+};
-+
-+&pcie {
-+	status = "okay";
-+};
-+
-+&eth {
-+	status = "okay";
-+};
-+
-+&gmac1 {
-+	mac-address = [00 11 22 33 44 56];
-+	status = "okay";
-+};
-+
-+&gmac2 {
-+	mac-address = [00 11 22 33 44 55];
-+	status = "okay";
-+};
-+
-+&gsw {
-+	pinctrl-names = "default";
-+	pinctrl-0 = <&eth_default>;
-+	mediatek,reset-pin = <&pio 15 0>;
-+	status = "okay";
-+};
---- /dev/null
-+++ b/arch/arm/boot/dts/mt7623.dtsi
-@@ -0,0 +1,601 @@
-+/*
-+ * Copyright (c) 2016 MediaTek Inc.
-+ * Author: John Crispin <blogic at openwrt.org>
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 as
-+ * published by the Free Software Foundation.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ */
-+
-+#include <dt-bindings/interrupt-controller/irq.h>
-+#include <dt-bindings/interrupt-controller/arm-gic.h>
-+#include <dt-bindings/clock/mt2701-clk.h>
-+#include <dt-bindings/power/mt2701-power.h>
-+#include <dt-bindings/phy/phy.h>
-+#include <dt-bindings/reset-controller/mt2701-resets.h>
-+#include <dt-bindings/pinctrl/mt7623-pinfunc.h>
-+#include "skeleton64.dtsi"
-+
-+
-+/ {
-+	compatible = "mediatek,mt7623";
-+	interrupt-parent = <&sysirq>;
-+
-+	cpus {
-+		#address-cells = <1>;
-+		#size-cells = <0>;
-+		enable-method = "mediatek,mt6589-smp";
-+
-+		cpu0: cpu at 0 {
-+			device_type = "cpu";
-+			compatible = "arm,cortex-a7";
-+			reg = <0x0>;
-+			clocks = <&infracfg CLK_INFRA_CPUSEL>,
-+				 <&apmixedsys CLK_APMIXED_MAINPLL>;
-+			clock-names = "cpu", "intermediate";
-+			operating-points = <
-+				598000 1150000
-+				747500 1150000
-+				1040000 1150000
-+				1196000 1200000
-+				1300000 1300000
-+			>;
-+		};
-+		cpu1: cpu at 1 {
-+			device_type = "cpu";
-+			compatible = "arm,cortex-a7";
-+			reg = <0x1>;
-+			clocks = <&infracfg CLK_INFRA_CPUSEL>,
-+				 <&apmixedsys CLK_APMIXED_MAINPLL>;
-+			clock-names = "cpu", "intermediate";
-+			operating-points = <
-+				598000 1150000
-+				747500 1150000
-+				1040000 1150000
-+				1196000 1200000
-+				1300000 1300000
-+			>;
-+		};
-+		cpu2: cpu at 2 {
-+			device_type = "cpu";
-+			compatible = "arm,cortex-a7";
-+			reg = <0x2>;
-+			clocks = <&infracfg CLK_INFRA_CPUSEL>,
-+				 <&apmixedsys CLK_APMIXED_MAINPLL>;
-+			clock-names = "cpu", "intermediate";
-+			operating-points = <
-+				598000 1150000
-+				747500 1150000
-+				1040000 1150000
-+				1196000 1200000
-+				1300000 1300000
-+			>;
-+		};
-+		cpu3: cpu at 3 {
-+			device_type = "cpu";
-+			compatible = "arm,cortex-a7";
-+			reg = <0x3>;
-+			clocks = <&infracfg CLK_INFRA_CPUSEL>,
-+				 <&apmixedsys CLK_APMIXED_MAINPLL>;
-+			clock-names = "cpu", "intermediate";
-+			operating-points = <
-+				598000 1150000
-+				747500 1150000
-+				1040000 1150000
-+				1196000 1200000
-+				1300000 1300000
-+			>;
-+		};
-+	};
-+
-+	system_clk: dummy13m {
-+		compatible = "fixed-clock";
-+		clock-frequency = <13000000>;
-+		#clock-cells = <0>;
-+	};
-+
-+	rtc_clk: dummy32k {
-+		compatible = "fixed-clock";
-+		clock-frequency = <32000>;
-+		#clock-cells = <0>;
-+		clock-output-names = "clk32k";
-+	};
-+
-+	clk26m: dummy26m {
-+		compatible = "fixed-clock";
-+		clock-frequency = <26000000>;
-+		#clock-cells = <0>;
-+		clock-output-names = "clk26m";
-+	};
-+
-+	timer {
-+		compatible = "arm,armv7-timer";
-+		interrupt-parent = <&gic>;
-+		interrupts = <GIC_PPI 13 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_HIGH)>,
-+			     <GIC_PPI 14 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_HIGH)>,
-+			     <GIC_PPI 11 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_HIGH)>,
-+			     <GIC_PPI 10 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_HIGH)>;
-+		clock-frequency = <13000000>;
-+		arm,cpu-registers-not-fw-configured;
-+	};
-+
-+	topckgen: power-controller at 10000000 {
-+		compatible = "mediatek,mt7623-topckgen",
-+			     "mediatek,mt2701-topckgen",
-+			     "syscon";
-+		reg = <0 0x10000000 0 0x1000>;
-+		#clock-cells = <1>;
-+	};
-+
-+	infracfg: power-controller at 10001000 {
-+		compatible = "mediatek,mt7623-infracfg",
-+			     "mediatek,mt2701-infracfg",
-+			     "syscon";
-+		reg = <0 0x10001000 0 0x1000>;
-+		#clock-cells = <1>;
-+		#reset-cells = <1>;
-+	};
-+
-+	pericfg: pericfg at 10003000 {
-+		compatible = "mediatek,mt7623-pericfg",
-+			     "mediatek,mt2701-pericfg",
-+			     "syscon";
-+		reg = <0 0x10003000 0 0x1000>;
-+		#clock-cells = <1>;
-+		#reset-cells = <1>;
-+	};
-+
-+	pio: pinctrl at 10005000 {
-+		compatible = "mediatek,mt7623-pinctrl";
-+		reg = <0 0x1000b000 0 0x1000>;
-+		mediatek,pctl-regmap = <&syscfg_pctl_a>;
-+		pins-are-numbered;
-+		gpio-controller;
-+		#gpio-cells = <2>;
-+		interrupt-controller;
-+		interrupt-parent = <&gic>;
-+		#interrupt-cells = <2>;
-+		interrupts = <GIC_SPI 113 IRQ_TYPE_LEVEL_HIGH>,
-+			     <GIC_SPI 114 IRQ_TYPE_LEVEL_HIGH>;
-+	};
-+
-+	syscfg_pctl_a: syscfg at 10005000 {
-+		compatible = "mediatek,mt7623-pctl-a-syscfg", "syscon";
-+		reg = <0 0x10005000 0 0x1000>;
-+	};
-+
-+	scpsys: scpsys at 10006000 {
-+		#power-domain-cells = <1>;
-+		compatible = "mediatek,mt7623-scpsys",
-+			     "mediatek,mt2701-scpsys";
-+		reg = <0 0x10006000 0 0x1000>;
-+		infracfg = <&infracfg>;
-+		clocks = <&clk26m>,
-+			 <&topckgen CLK_TOP_MM_SEL>;
-+		clock-names = "mfg", "mm";
-+	};
-+
-+	watchdog: watchdog at 10007000 {
-+		compatible = "mediatek,mt7623-wdt",
-+			     "mediatek,mt6589-wdt";
-+		reg = <0 0x10007000 0 0x100>;
-+	};
-+
-+	timer: timer at 10008000 {
-+		compatible = "mediatek,mt7623-timer",
-+			     "mediatek,mt6577-timer";
-+		reg = <0 0x10008000 0 0x80>;
-+		interrupts = <GIC_SPI 112 IRQ_TYPE_LEVEL_LOW>;
-+		clocks = <&system_clk>, <&rtc_clk>;
-+		clock-names = "system-clk", "rtc-clk";
-+	};
-+
-+	pwrap: pwrap at 1000d000 {
-+		compatible = "mediatek,mt7623-pwrap",
-+			     "mediatek,mt2701-pwrap";
-+		reg = <0 0x1000d000 0 0x1000>;
-+		reg-names = "pwrap";
-+		interrupts = <GIC_SPI 115 IRQ_TYPE_LEVEL_HIGH>;
-+		resets = <&infracfg MT2701_INFRA_PMIC_WRAP_RST>;
-+		reset-names = "pwrap";
-+		clocks = <&infracfg CLK_INFRA_PMICSPI>,
-+			 <&infracfg CLK_INFRA_PMICWRAP>;
-+		clock-names = "spi", "wrap";
-+	};
-+
-+	sysirq: interrupt-controller at 10200100 {
-+		compatible = "mediatek,mt7623-sysirq",
-+			     "mediatek,mt6577-sysirq";
-+		interrupt-controller;
-+		#interrupt-cells = <3>;
-+		interrupt-parent = <&gic>;
-+		reg = <0 0x10200100 0 0x1c>;
-+	};
-+
-+	apmixedsys: apmixedsys at 10209000 {
-+		compatible = "mediatek,mt7623-apmixedsys",
-+			     "mediatek,mt2701-apmixedsys";
-+		reg = <0 0x10209000 0 0x1000>;
-+		#clock-cells = <1>;
-+	};
-+
-+	gic: interrupt-controller at 10211000 {
-+		compatible = "arm,cortex-a7-gic";
-+		interrupt-controller;
-+		#interrupt-cells = <3>;
-+		interrupt-parent = <&gic>;
-+		reg = <0 0x10211000 0 0x1000>,
-+		      <0 0x10212000 0 0x1000>,
-+		      <0 0x10214000 0 0x2000>,
-+		      <0 0x10216000 0 0x2000>;
-+	};
-+
-+	i2c0: i2c at 11007000 {
-+		compatible = "mediatek,mt7623-i2c",
-+			     "mediatek,mt6577-i2c";
-+		reg = <0 0x11007000 0 0x70>,
-+		      <0 0x11000200 0 0x80>;
-+		interrupts = <GIC_SPI 44 IRQ_TYPE_LEVEL_LOW>;
-+		clock-div = <16>;
-+		clocks = <&pericfg CLK_PERI_I2C0>,
-+			 <&pericfg CLK_PERI_AP_DMA>;
-+		clock-names = "main", "dma";
-+		#address-cells = <1>;
-+		#size-cells = <0>;
-+		status = "disabled";
-+	};
-+
-+	i2c1: i2c at 11008000 {
-+		compatible = "mediatek,mt7623-i2c",
-+			     "mediatek,mt6577-i2c";
-+		reg = <0 0x11008000 0 0x70>,
-+		      <0 0x11000280 0 0x80>;
-+		interrupts = <GIC_SPI 45 IRQ_TYPE_LEVEL_LOW>;
-+		clock-div = <16>;
-+		clocks = <&pericfg CLK_PERI_I2C1>,
-+			 <&pericfg CLK_PERI_AP_DMA>;
-+		clock-names = "main", "dma";
-+		#address-cells = <1>;
-+		#size-cells = <0>;
-+		status = "disabled";
-+	};
-+
-+	i2c2: i2c at 11009000 {
-+		compatible = "mediatek,mt7623-i2c",
-+			     "mediatek,mt6577-i2c";
-+		reg = <0 0x11009000 0 0x70>,
-+		      <0 0x11000300 0 0x80>;
-+		interrupts = <GIC_SPI 46 IRQ_TYPE_LEVEL_LOW>;
-+		clock-div = <16>;
-+		clocks = <&pericfg CLK_PERI_I2C2>,
-+			 <&pericfg CLK_PERI_AP_DMA>;
-+		clock-names = "main", "dma";
-+		#address-cells = <1>;
-+		#size-cells = <0>;
-+		status = "disabled";
-+	};
-+
-+	uart0: serial at 11002000 {
-+		compatible = "mediatek,mt7623-uart",
-+			     "mediatek,mt6577-uart";
-+		reg = <0 0x11002000 0 0x400>;
-+		interrupts = <GIC_SPI 51 IRQ_TYPE_LEVEL_LOW>;
-+		clocks = <&pericfg CLK_PERI_UART0_SEL>,
-+			 <&pericfg CLK_PERI_UART0>;
-+		clock-names = "baud", "bus";
-+		status = "disabled";
-+	};
-+
-+	uart1: serial at 11003000 {
-+		compatible = "mediatek,mt7623-uart",
-+			     "mediatek,mt6577-uart";
-+		reg = <0 0x11003000 0 0x400>;
-+		interrupts = <GIC_SPI 52 IRQ_TYPE_LEVEL_LOW>;
-+		clocks = <&pericfg CLK_PERI_UART1_SEL>,
-+			 <&pericfg CLK_PERI_UART1>;
-+		clock-names = "baud", "bus";
-+		status = "disabled";
-+	};
-+
-+	uart2: serial at 11004000 {
-+		compatible = "mediatek,mt7623-uart",
-+			     "mediatek,mt6577-uart";
-+		reg = <0 0x11004000 0 0x400>;
-+		interrupts = <GIC_SPI 53 IRQ_TYPE_LEVEL_LOW>;
-+		clocks = <&pericfg CLK_PERI_UART2_SEL>,
-+			 <&pericfg CLK_PERI_UART2>;
-+		clock-names = "baud", "bus";
-+		status = "disabled";
-+	};
-+
-+	uart3: serial at 11005000 {
-+		compatible = "mediatek,mt7623-uart",
-+			     "mediatek,mt6577-uart";
-+		reg = <0 0x11005000 0 0x400>;
-+		interrupts = <GIC_SPI 54 IRQ_TYPE_LEVEL_LOW>;
-+		clocks = <&pericfg CLK_PERI_UART3_SEL>,
-+			 <&pericfg CLK_PERI_UART3>;
-+		clock-names = "baud", "bus";
-+		status = "disabled";
-+	};
-+
-+	spi: spi at 1100a000 {
-+		compatible = "mediatek,mt7623-spi", "mediatek,mt6589-spi";
-+		reg = <0 0x1100a000 0 0x1000>;
-+		interrupts = <GIC_SPI 78 IRQ_TYPE_LEVEL_LOW>;
-+		clocks = <&pericfg CLK_PERI_SPI0>;
-+		clock-names = "main";
-+
-+		status = "disabled";
-+	};
-+
-+	nandc: nfi at 1100d000 {
-+		compatible = "mediatek,mt2701-nfc";
-+		reg = <0 0x1100d000 0 0x1000>;
-+		interrupts = <GIC_SPI 56 IRQ_TYPE_LEVEL_LOW>;
-+		power-domains = <&scpsys MT2701_POWER_DOMAIN_IFR_MSC>;
-+		clocks = <&pericfg CLK_PERI_NFI>,
-+			 <&pericfg CLK_PERI_NFI_PAD>;
-+		clock-names = "nfi_clk", "pad_clk";
-+		status = "disabled";
-+		ecc-engine = <&bch>;
-+		#address-cells = <1>;
-+		#size-cells = <0>;
-+	};
-+
-+	bch: ecc at 1100e000 {
-+		compatible = "mediatek,mt2701-ecc";
-+		reg = <0 0x1100e000 0 0x1000>;
-+		interrupts = <GIC_SPI 55 IRQ_TYPE_LEVEL_LOW>;
-+		clocks = <&pericfg CLK_PERI_NFI_ECC>;
-+		clock-names = "nfiecc_clk";
-+		status = "disabled";
-+	};
-+
-+	mmc0: mmc at 11230000 {
-+		compatible = "mediatek,mt7623-mmc",
-+			     "mediatek,mt8135-mmc";
-+		reg = <0 0x11230000 0 0x1000>;
-+		interrupts = <GIC_SPI 39 IRQ_TYPE_LEVEL_LOW>;
-+		clocks = <&pericfg CLK_PERI_MSDC30_0>,
-+			 <&topckgen CLK_TOP_MSDC30_0_SEL>;
-+		clock-names = "source", "hclk";
-+		status = "disabled";
-+	};
-+
-+	mmc1: mmc at 11240000 {
-+		compatible = "mediatek,mt7623-mmc",
-+			     "mediatek,mt8135-mmc";
-+		reg = <0 0x11240000 0 0x1000>;
-+		interrupts = <GIC_SPI 72 IRQ_TYPE_LEVEL_LOW>;
-+		clocks = <&pericfg CLK_PERI_MSDC30_1>,
-+			 <&topckgen CLK_TOP_MSDC30_1_SEL>;
-+		clock-names = "source", "hclk";
-+		status = "disabled";
-+	};
-+
-+	usb1: usb at 1a1c0000 {
-+		compatible = "mediatek,mt2701-xhci",
-+			     "mediatek,mt8173-xhci";
-+		reg = <0 0x1a1c0000 0 0x1000>,
-+		      <0 0x1a1c4700 0 0x0100>;
-+		interrupts = <GIC_SPI 196 IRQ_TYPE_LEVEL_LOW>;
-+		clocks = <&hifsys CLK_HIFSYS_USB0PHY>,
-+			 <&topckgen CLK_TOP_ETHIF_SEL>;
-+		clock-names = "sys_ck", "ethif";
-+		power-domains = <&scpsys MT2701_POWER_DOMAIN_HIF>;
-+		phys = <&phy_port0 PHY_TYPE_USB3>;
-+		status = "disabled";
-+	};
-+
-+	u3phy1: usb-phy at 1a1c4000 {
-+		compatible = "mediatek,mt2701-u3phy",
-+			     "mediatek,mt8173-u3phy";
-+		reg = <0 0x1a1c4000 0 0x0700>;
-+		clocks = <&clk26m>;
-+		clock-names = "u3phya_ref";
-+		#phy-cells = <1>;
-+		#address-cells = <2>;
-+		#size-cells = <2>;
-+		ranges;
-+		status = "disabled";
-+
-+		phy_port0: phy_port0: port at 1a1c4800 {
-+			reg = <0 0x1a1c4800 0 0x800>;
-+			#phy-cells = <1>;
-+			status = "okay";
-+		};
-+	};
-+
-+	usb2: usb at 1a240000 {
-+		compatible = "mediatek,mt2701-xhci",
-+			     "mediatek,mt8173-xhci";
-+		reg = <0 0x1a240000 0 0x1000>,
-+		      <0 0x1a244700 0 0x0100>;
-+		interrupts = <GIC_SPI 197 IRQ_TYPE_LEVEL_LOW>;
-+		clocks = <&hifsys CLK_HIFSYS_USB1PHY>,
-+			 <&topckgen CLK_TOP_ETHIF_SEL>;
-+		clock-names = "sys_ck", "ethif";
-+		power-domains = <&scpsys MT2701_POWER_DOMAIN_HIF>;
-+		phys = <&u3phy2 0>;
-+		status = "disabled";
-+	};
-+
-+	u3phy2: usb-phy at 1a244000 {
-+		compatible = "mediatek,mt2701-u3phy",
-+			     "mediatek,mt8173-u3phy";
-+		reg = <0 0x1a244000 0 0x0700>,
-+		      <0 0x1a244800 0 0x0800>;
-+		clocks = <&clk26m>;
-+		clock-names = "u3phya_ref";
-+		#phy-cells = <1>;
-+		status = "disabled";
-+	};
-+
-+	hifsys: clock-controller at 1a000000 {
-+		compatible = "mediatek,mt7623-hifsys",
-+			     "mediatek,mt2701-hifsys",
-+			     "syscon";
-+		reg = <0 0x1a000000 0 0x1000>;
-+		#clock-cells = <1>;
-+		#reset-cells = <1>;
-+	};
-+
-+	pcie: pcie at 1a140000 {
-+		compatible = "mediatek,mt7623-pcie";
-+		device_type = "pci";
-+		reg = <0 0x1a140000 0 0x8000>, /* PCI-Express registers */
-+		      <0 0x1a149000 0 0x1000>, /* PCI-Express PHY0 */
-+		      <0 0x1a14a000 0 0x1000>, /* PCI-Express PHY1 */
-+		      <0 0x1a244000 0 0x1000>; /* PCI-Express PHY2 */
-+		reg-names = "pcie", "pcie phy0", "pcie phy1", "pcie phy2";
-+		interrupts = <GIC_SPI 193 IRQ_TYPE_LEVEL_LOW>,
-+			     <GIC_SPI 194 IRQ_TYPE_LEVEL_LOW>,
-+			     <GIC_SPI 195 IRQ_TYPE_LEVEL_LOW>;
-+		interrupt-names = "pcie0", "pcie1", "pcie2";
-+		clocks = <&topckgen CLK_TOP_ETHIF_SEL>;
-+		clock-names = "pcie";
-+		power-domains = <&scpsys MT2701_POWER_DOMAIN_HIF>;
-+		resets = <&hifsys MT2701_HIFSYS_PCIE0_RST>,
-+			 <&hifsys MT2701_HIFSYS_PCIE1_RST>,
-+			 <&hifsys MT2701_HIFSYS_PCIE2_RST>;
-+		reset-names = "pcie0", "pcie1", "pcie2";
-+
-+		mediatek,hifsys = <&hifsys>;
-+
-+		bus-range = <0x00 0xff>;
-+		#address-cells = <3>;
-+		#size-cells = <2>;
-+
-+		ranges = <0x81000000 0 0x1a160000 0 0x1a160000 0 0x00010000 /* io space */
-+			  0x83000000 0 0x60000000 0 0x60000000 0 0x10000000>; /* pci memory */
-+
-+		status = "disabled";
-+
-+		pcie at 1,0 {
-+			device_type = "pci";
-+			reg = <0x0800 0 0 0 0>;
-+
-+			#address-cells = <3>;
-+			#size-cells = <2>;
-+			ranges;
-+		};
-+
-+		pcie at 2,0{
-+			device_type = "pci";
-+			reg = <0x1000 0 0 0 0>;
-+
-+			#address-cells = <3>;
-+			#size-cells = <2>;
-+			ranges;
-+		};
-+
-+		pcie at 3,0{
-+			device_type = "pci";
-+			reg = <0x1800 0 0 0 0>;
-+
-+			#address-cells = <3>;
-+			#size-cells = <2>;
-+			ranges;
-+		};
-+	};
-+
-+	ethsys: syscon at 1b000000 {
-+		compatible = "mediatek,mt2701-ethsys", "syscon";
-+		reg = <0 0x1b000000 0 0x1000>;
-+		#reset-cells = <1>;
-+		#clock-cells = <1>;
-+	};
-+
-+	eth: ethernet at 1b100000 {
-+		compatible = "mediatek,mt2701-eth";
-+		reg = <0 0x1b100000 0 0x20000>;
-+	
-+		clocks = <&topckgen CLK_TOP_ETHIF_SEL>,
-+			 <&ethsys CLK_ETHSYS_ESW>,
-+			 <&ethsys CLK_ETHSYS_GP2>,
-+			 <&ethsys CLK_ETHSYS_GP1>;
-+		clock-names = "ethif", "esw", "gp2", "gp1";
-+		interrupts = <GIC_SPI 200 IRQ_TYPE_LEVEL_LOW
-+			      GIC_SPI 199 IRQ_TYPE_LEVEL_LOW
-+			      GIC_SPI 198 IRQ_TYPE_LEVEL_LOW>;
-+		power-domains = <&scpsys MT2701_POWER_DOMAIN_ETH>;
-+
-+		resets = <&ethsys 6>;
-+		reset-names = "eth";
-+
-+		mediatek,ethsys = <&ethsys>;
-+		mediatek,pctl = <&syscfg_pctl_a>;
-+
-+		mediatek,switch = <&gsw>;
-+
-+		#address-cells = <1>;
-+		#size-cells = <0>;
-+	
-+		status = "disabled";
-+
-+		gmac1: mac at 0 {
-+			compatible = "mediatek,eth-mac";
-+			reg = <0>;
-+
-+			status = "disabled";
-+			
-+			phy-mode = "rgmii";
-+			
-+			fixed-link {
-+				speed = <1000>;
-+				full-duplex;
-+				pause;
-+			};
-+		};
-+
-+		gmac2: mac at 1 {
-+			compatible = "mediatek,eth-mac";
-+			reg = <1>;
-+
-+			status = "disabled";
-+			
-+			phy-mode = "rgmii";
-+			
-+			fixed-link {
-+				speed = <1000>;
-+				full-duplex;
-+				pause;
-+			};
-+		};
-+	
-+		mdio-bus {
-+			#address-cells = <1>;
-+			#size-cells = <0>;
-+
-+			phy5: ethernet-phy at 5 {
-+				reg = <5>;
-+				phy-mode = "rgmii-rxid";
-+			};
-+
-+			phy1f: ethernet-phy at 1f {
-+				reg = <0x1f>;
-+				phy-mode = "rgmii";
-+			};
-+		};
-+	};
-+
-+	gsw: switch at 1b100000 {
-+		compatible = "mediatek,mt7623-gsw";
-+		interrupt-parent = <&pio>;
-+		interrupts = <168 IRQ_TYPE_EDGE_RISING>;
-+		resets = <&ethsys 2>;
-+		reset-names = "eth";
-+		clocks = <&apmixedsys CLK_APMIXED_TRGPLL>;
-+		clock-names = "trgpll";
-+		mt7530-supply = <&mt6323_vpa_reg>;
-+		mediatek,pctl-regmap = <&syscfg_pctl_a>;
-+		mediatek,ethsys = <&ethsys>;
-+		status = "disabled";
-+	};
-+};
---- a/arch/arm/mach-mediatek/Kconfig
-+++ b/arch/arm/mach-mediatek/Kconfig
-@@ -21,6 +21,10 @@ config MACH_MT6592
- 	bool "MediaTek MT6592 SoCs support"
- 	default ARCH_MEDIATEK
- 
-+config MACH_MT7623
-+	bool "MediaTek MT7623 SoCs support"
-+	default ARCH_MEDIATEK
-+
- config MACH_MT8127
- 	bool "MediaTek MT8127 SoCs support"
- 	default ARCH_MEDIATEK
---- a/arch/arm/mach-mediatek/mediatek.c
-+++ b/arch/arm/mach-mediatek/mediatek.c
-@@ -46,6 +46,7 @@ static void __init mediatek_timer_init(v
- static const char * const mediatek_board_dt_compat[] = {
- 	"mediatek,mt6589",
- 	"mediatek,mt6592",
-+	"mediatek,mt7623",
- 	"mediatek,mt8127",
- 	"mediatek,mt8135",
- 	NULL,
diff --git a/target/linux/mediatek/patches-4.4/0026-scpsys-various-fixes.patch b/target/linux/mediatek/patches-4.4/0026-scpsys-various-fixes.patch
deleted file mode 100644
index 7ec3033..0000000
--- a/target/linux/mediatek/patches-4.4/0026-scpsys-various-fixes.patch
+++ /dev/null
@@ -1,56 +0,0 @@
-From 59aafd667d2880c90776931b6102b8252214d93c Mon Sep 17 00:00:00 2001
-From: John Crispin <blogic at openwrt.org>
-Date: Sun, 21 Feb 2016 13:52:12 +0100
-Subject: [PATCH 026/102] scpsys: various fixes
-
----
- drivers/clk/mediatek/clk-mt2701.c        |    2 ++
- drivers/soc/mediatek/mtk-scpsys-mt2701.c |    8 --------
- include/dt-bindings/power/mt2701-power.h |    4 ++--
- 3 files changed, 4 insertions(+), 10 deletions(-)
-
---- a/drivers/clk/mediatek/clk-mt2701.c
-+++ b/drivers/clk/mediatek/clk-mt2701.c
-@@ -1043,6 +1043,8 @@ static void __init mtk_ethsys_init(struc
- 	if (r)
- 		pr_err("%s(): could not register clock provider: %d\n",
- 			__func__, r);
-+
-+	mtk_register_reset_controller(node, 1, 0x34);
- }
- CLK_OF_DECLARE(mtk_ethsys, "mediatek,mt2701-ethsys", mtk_ethsys_init);
- 
---- a/drivers/soc/mediatek/mtk-scpsys-mt2701.c
-+++ b/drivers/soc/mediatek/mtk-scpsys-mt2701.c
-@@ -61,14 +61,6 @@ static const struct scp_domain_data scp_
- 		.bus_prot_mask = MT2701_TOP_AXI_PROT_EN_DISP,
- 		.active_wakeup = true,
- 	},
--	[MT2701_POWER_DOMAIN_MFG] = {
--		.name = "mfg",
--		.sta_mask = MFG_PWR_STA_MASK,
--		.ctl_offs = SPM_MFG_PWR_CON,
--		.sram_pdn_bits = GENMASK(11, 8),
--		.sram_pdn_ack_bits = GENMASK(12, 12),
--		.active_wakeup = true,
--	},
- 	[MT2701_POWER_DOMAIN_VDEC] = {
- 		.name = "vdec",
- 		.sta_mask = VDE_PWR_STA_MASK,
---- a/include/dt-bindings/power/mt2701-power.h
-+++ b/include/dt-bindings/power/mt2701-power.h
-@@ -16,12 +16,12 @@
- 
- #define MT2701_POWER_DOMAIN_CONN	0
- #define MT2701_POWER_DOMAIN_DISP	1
--#define MT2701_POWER_DOMAIN_MFG		2
-+//#define MT2701_POWER_DOMAIN_MFG		2
- #define MT2701_POWER_DOMAIN_VDEC	3
- #define MT2701_POWER_DOMAIN_ISP		4
- #define MT2701_POWER_DOMAIN_BDP		5
- #define MT2701_POWER_DOMAIN_ETH		6
- #define MT2701_POWER_DOMAIN_HIF		7
--#define MT2701_POWER_DOMAIN_IFR_MSC	8
-+#define MT2701_POWER_DOMAIN_IFR_MSC	2
- 
- #endif /* _DT_BINDINGS_POWER_MT2701_POWER_H */
diff --git a/target/linux/mediatek/patches-4.4/0027-soc-mediatek-PMIC-wrap-Clear-the-vldclr-if-state-mac.patch b/target/linux/mediatek/patches-4.4/0027-soc-mediatek-PMIC-wrap-Clear-the-vldclr-if-state-mac.patch
deleted file mode 100644
index 964373b..0000000
--- a/target/linux/mediatek/patches-4.4/0027-soc-mediatek-PMIC-wrap-Clear-the-vldclr-if-state-mac.patch
+++ /dev/null
@@ -1,69 +0,0 @@
-From 55231d8299d3dccde8588ed2e86c2bc0ef2e12ce Mon Sep 17 00:00:00 2001
-From: Henry Chen <henryc.chen at mediatek.com>
-Date: Mon, 4 Jan 2016 20:02:52 +0800
-Subject: [PATCH 027/102] soc: mediatek: PMIC wrap: Clear the vldclr if state
- machine stay on FSM_VLDCLR state.
-
-Sometimes PMIC is too busy to send data in time to cause pmic wrap timeout,
-because pmic wrap is waiting for FSM_VLDCLR after finishing WACS2_CMD. It
-just return error when issue happened, so the state machine will stay on
-FSM_VLDCLR state when data send back later by PMIC and timeout again in next
-time because pmic wrap waiting for FSM_IDLE state at the beginning of the
-read/write function.
-
-Clear the vldclr when timeout if state machine stay on FSM_VLDCLR.
-
-Signed-off-by: Henry Chen <henryc.chen at mediatek.com>
-Tested-by: Ricky Liang <jcliang at chromium.org>
-Signed-off-by: Matthias Brugger <matthias.bgg at gmail.com>
----
- drivers/soc/mediatek/mtk-pmic-wrap.c |   22 ++++++++++++++++++++--
- 1 file changed, 20 insertions(+), 2 deletions(-)
-
---- a/drivers/soc/mediatek/mtk-pmic-wrap.c
-+++ b/drivers/soc/mediatek/mtk-pmic-wrap.c
-@@ -412,6 +412,20 @@ static bool pwrap_is_fsm_vldclr(struct p
- 	return PWRAP_GET_WACS_FSM(val) == PWRAP_WACS_FSM_WFVLDCLR;
- }
- 
-+/*
-+ * Timeout issue sometimes caused by the last read command
-+ * failed because pmic wrap could not got the FSM_VLDCLR
-+ * in time after finishing WACS2_CMD. It made state machine
-+ * still on FSM_VLDCLR and timeout next time.
-+ * Check the status of FSM and clear the vldclr to recovery the
-+ * error.
-+ */
-+static inline void pwrap_leave_fsm_vldclr(struct pmic_wrapper *wrp)
-+{
-+	if (pwrap_is_fsm_vldclr(wrp))
-+		pwrap_writel(wrp, 1, PWRAP_WACS2_VLDCLR);
-+}
-+
- static bool pwrap_is_sync_idle(struct pmic_wrapper *wrp)
- {
- 	return pwrap_readl(wrp, PWRAP_WACS2_RDATA) & PWRAP_STATE_SYNC_IDLE0;
-@@ -445,8 +459,10 @@ static int pwrap_write(struct pmic_wrapp
- 	int ret;
- 
- 	ret = pwrap_wait_for_state(wrp, pwrap_is_fsm_idle);
--	if (ret)
-+	if (ret) {
-+		pwrap_leave_fsm_vldclr(wrp);
- 		return ret;
-+	}
- 
- 	pwrap_writel(wrp, (1 << 31) | ((adr >> 1) << 16) | wdata,
- 			PWRAP_WACS2_CMD);
-@@ -459,8 +475,10 @@ static int pwrap_read(struct pmic_wrappe
- 	int ret;
- 
- 	ret = pwrap_wait_for_state(wrp, pwrap_is_fsm_idle);
--	if (ret)
-+	if (ret) {
-+		pwrap_leave_fsm_vldclr(wrp);
- 		return ret;
-+	}
- 
- 	pwrap_writel(wrp, (adr >> 1) << 16, PWRAP_WACS2_CMD);
- 
diff --git a/target/linux/mediatek/patches-4.4/0028-ARM-mediatek-add-MT7623-smp-bringup-code.patch b/target/linux/mediatek/patches-4.4/0028-ARM-mediatek-add-MT7623-smp-bringup-code.patch
deleted file mode 100644
index 4aacd26..0000000
--- a/target/linux/mediatek/patches-4.4/0028-ARM-mediatek-add-MT7623-smp-bringup-code.patch
+++ /dev/null
@@ -1,36 +0,0 @@
-From d088a94afc768683a881b627b6737442158e7db6 Mon Sep 17 00:00:00 2001
-From: John Crispin <blogic at openwrt.org>
-Date: Tue, 5 Jan 2016 17:24:28 +0100
-Subject: [PATCH 028/102] ARM: mediatek: add MT7623 smp bringup code
-
-Add support for booting secondary CPUs on MT7623.
-
-Signed-off-by: John Crispin <blogic at openwrt.org>
-Signed-off-by: Matthias Brugger <matthias.bgg at gmail.com>
----
- arch/arm/mach-mediatek/platsmp.c |    7 +++++++
- 1 file changed, 7 insertions(+)
-
---- a/arch/arm/mach-mediatek/platsmp.c
-+++ b/arch/arm/mach-mediatek/platsmp.c
-@@ -44,6 +44,12 @@ static const struct mtk_smp_boot_info mt
- 	{ 0x38, 0x3c, 0x40 },
- };
- 
-+static const struct mtk_smp_boot_info mtk_mt7623_boot = {
-+	0x10202000, 0x34,
-+	{ 0x534c4131, 0x4c415332, 0x41534c33 },
-+	{ 0x38, 0x3c, 0x40 },
-+};
-+
- static const struct of_device_id mtk_tz_smp_boot_infos[] __initconst = {
- 	{ .compatible   = "mediatek,mt8135", .data = &mtk_mt8135_tz_boot },
- 	{ .compatible   = "mediatek,mt8127", .data = &mtk_mt8135_tz_boot },
-@@ -51,6 +57,7 @@ static const struct of_device_id mtk_tz_
- 
- static const struct of_device_id mtk_smp_boot_infos[] __initconst = {
- 	{ .compatible   = "mediatek,mt6589", .data = &mtk_mt6589_boot },
-+	{ .compatible   = "mediatek,mt7623", .data = &mtk_mt7623_boot },
- };
- 
- static void __iomem *mtk_smp_base;
diff --git a/target/linux/mediatek/patches-4.4/0029-soc-mediatek-PMIC-wrap-clear-the-STAUPD_TRIG-bit-of-.patch b/target/linux/mediatek/patches-4.4/0029-soc-mediatek-PMIC-wrap-clear-the-STAUPD_TRIG-bit-of-.patch
deleted file mode 100644
index eb936a7..0000000
--- a/target/linux/mediatek/patches-4.4/0029-soc-mediatek-PMIC-wrap-clear-the-STAUPD_TRIG-bit-of-.patch
+++ /dev/null
@@ -1,58 +0,0 @@
-From b92861fbc79b3a7a9bc1c51e2dbfa2c191cc27ea Mon Sep 17 00:00:00 2001
-From: Henry Chen <henryc.chen at mediatek.com>
-Date: Thu, 21 Jan 2016 19:04:00 +0800
-Subject: [PATCH 029/102] soc: mediatek: PMIC wrap: clear the STAUPD_TRIG bit
- of WDT_SRC_EN
-
-Since STAUPD interrupts aren't handled on mt8173, disable watchdog timeout
-monitor of STAUPD to avoid WDT_INT triggered by STAUPD.
-
-Signed-off-by: Henry Chen <henryc.chen at mediatek.com>
-Reviewed-by: Daniel Kurtz <djkurtz at chromium.org>
-Signed-off-by: Matthias Brugger <matthias.bgg at gmail.com>
----
- drivers/soc/mediatek/mtk-pmic-wrap.c |   19 +++++++++++++++++--
- 1 file changed, 17 insertions(+), 2 deletions(-)
-
---- a/drivers/soc/mediatek/mtk-pmic-wrap.c
-+++ b/drivers/soc/mediatek/mtk-pmic-wrap.c
-@@ -60,6 +60,15 @@
- #define PWRAP_MAN_CMD_OP_OUTD		(0x9 << 8)
- #define PWRAP_MAN_CMD_OP_OUTQ		(0xa << 8)
- 
-+/* macro for Watch Dog Timer Source */
-+#define PWRAP_WDT_SRC_EN_STAUPD_TRIG		(1 << 25)
-+#define PWRAP_WDT_SRC_EN_HARB_STAUPD_DLE	(1 << 20)
-+#define PWRAP_WDT_SRC_EN_HARB_STAUPD_ALE	(1 << 6)
-+#define PWRAP_WDT_SRC_MASK_ALL			0xffffffff
-+#define PWRAP_WDT_SRC_MASK_NO_STAUPD	~(PWRAP_WDT_SRC_EN_STAUPD_TRIG | \
-+					  PWRAP_WDT_SRC_EN_HARB_STAUPD_DLE | \
-+					  PWRAP_WDT_SRC_EN_HARB_STAUPD_ALE)
-+
- /* macro for slave device wrapper registers */
- #define PWRAP_DEW_BASE			0xbc00
- #define PWRAP_DEW_EVENT_OUT_EN		(PWRAP_DEW_BASE + 0x0)
-@@ -822,7 +831,7 @@ MODULE_DEVICE_TABLE(of, of_pwrap_match_t
- 
- static int pwrap_probe(struct platform_device *pdev)
- {
--	int ret, irq;
-+	int ret, irq, wdt_src;
- 	struct pmic_wrapper *wrp;
- 	struct device_node *np = pdev->dev.of_node;
- 	const struct of_device_id *of_id =
-@@ -912,7 +921,13 @@ static int pwrap_probe(struct platform_d
- 
- 	/* Initialize watchdog, may not be done by the bootloader */
- 	pwrap_writel(wrp, 0xf, PWRAP_WDT_UNIT);
--	pwrap_writel(wrp, 0xffffffff, PWRAP_WDT_SRC_EN);
-+	/*
-+	 * Since STAUPD was not used on mt8173 platform,
-+	 * so STAUPD of WDT_SRC which should be turned off
-+	 */
-+	wdt_src = pwrap_is_mt8173(wrp) ?
-+			PWRAP_WDT_SRC_MASK_NO_STAUPD : PWRAP_WDT_SRC_MASK_ALL;
-+	pwrap_writel(wrp, wdt_src, PWRAP_WDT_SRC_EN);
- 	pwrap_writel(wrp, 0x1, PWRAP_TIMER_EN);
- 	pwrap_writel(wrp, ~((1 << 31) | (1 << 1)), PWRAP_INT_EN);
- 
diff --git a/target/linux/mediatek/patches-4.4/0030-ARM-mediatek-add-mt2701-smp-bringup-code.patch b/target/linux/mediatek/patches-4.4/0030-ARM-mediatek-add-mt2701-smp-bringup-code.patch
deleted file mode 100644
index 790ccca..0000000
--- a/target/linux/mediatek/patches-4.4/0030-ARM-mediatek-add-mt2701-smp-bringup-code.patch
+++ /dev/null
@@ -1,23 +0,0 @@
-From f88ec31c6ba3a006d0be87ff1d99145f8cc85bee Mon Sep 17 00:00:00 2001
-From: Louis Yu <louis.yu at mediatek.com>
-Date: Thu, 7 Jan 2016 20:09:43 +0800
-Subject: [PATCH 030/102] ARM: mediatek: add mt2701 smp bringup code
-
-Add support for booting secondary CPUs on mt2701.
-
-Signed-off-by: Louis Yu <louis.yu at mediatek.com>
-Signed-off-by: Matthias Brugger <matthias.bgg at gmail.com>
----
- arch/arm/mach-mediatek/platsmp.c |    1 +
- 1 file changed, 1 insertion(+)
-
---- a/arch/arm/mach-mediatek/platsmp.c
-+++ b/arch/arm/mach-mediatek/platsmp.c
-@@ -53,6 +53,7 @@ static const struct mtk_smp_boot_info mt
- static const struct of_device_id mtk_tz_smp_boot_infos[] __initconst = {
- 	{ .compatible   = "mediatek,mt8135", .data = &mtk_mt8135_tz_boot },
- 	{ .compatible   = "mediatek,mt8127", .data = &mtk_mt8135_tz_boot },
-+	{ .compatible   = "mediatek,mt2701", .data = &mtk_mt8135_tz_boot },
- };
- 
- static const struct of_device_id mtk_smp_boot_infos[] __initconst = {
diff --git a/target/linux/mediatek/patches-4.4/0031-dt-bindings-ARM-Mediatek-add-MT2701-7623-string-to-t.patch b/target/linux/mediatek/patches-4.4/0031-dt-bindings-ARM-Mediatek-add-MT2701-7623-string-to-t.patch
deleted file mode 100644
index 186b2f4..0000000
--- a/target/linux/mediatek/patches-4.4/0031-dt-bindings-ARM-Mediatek-add-MT2701-7623-string-to-t.patch
+++ /dev/null
@@ -1,23 +0,0 @@
-From 15f4d895578f02cbaed10b0f5f6853b873aba10b Mon Sep 17 00:00:00 2001
-From: John Crispin <blogic at openwrt.org>
-Date: Wed, 20 Jan 2016 13:12:19 +0100
-Subject: [PATCH 031/102] dt-bindings: ARM: Mediatek: add MT2701/7623 string
- to the PMIC wrapper doc
-
-Signed-off-by: John Crispin <blogic at openwrt.org>
-Acked-by: Rob Herring <robh at kernel.org>
-Cc: devicetree at vger.kernel.org
----
- Documentation/devicetree/bindings/soc/mediatek/pwrap.txt |    1 +
- 1 file changed, 1 insertion(+)
-
---- a/Documentation/devicetree/bindings/soc/mediatek/pwrap.txt
-+++ b/Documentation/devicetree/bindings/soc/mediatek/pwrap.txt
-@@ -18,6 +18,7 @@ IP Pairing
- 
- Required properties in pwrap device node.
- - compatible:
-+	"mediatek,mt2701-pwrap" for MT2701/7623 SoCs
- 	"mediatek,mt8135-pwrap" for MT8135 SoCs
- 	"mediatek,mt8173-pwrap" for MT8173 SoCs
- - interrupts: IRQ for pwrap in SOC
diff --git a/target/linux/mediatek/patches-4.4/0032-soc-mediatek-PMIC-wrap-don-t-duplicate-the-wrapper-d.patch b/target/linux/mediatek/patches-4.4/0032-soc-mediatek-PMIC-wrap-don-t-duplicate-the-wrapper-d.patch
deleted file mode 100644
index 8092e96..0000000
--- a/target/linux/mediatek/patches-4.4/0032-soc-mediatek-PMIC-wrap-don-t-duplicate-the-wrapper-d.patch
+++ /dev/null
@@ -1,93 +0,0 @@
-From 64e8091be39c3f0a7bf4651bd2045b8c86429d55 Mon Sep 17 00:00:00 2001
-From: John Crispin <blogic at openwrt.org>
-Date: Wed, 20 Jan 2016 06:42:01 +0100
-Subject: [PATCH 032/102] soc: mediatek: PMIC wrap: don't duplicate the
- wrapper data
-
-As we add support for more devices struct pmic_wrapper_type will grow and
-we do not really want to start duplicating all the elements in
-struct pmic_wrapper.
-
-Signed-off-by: John Crispin <blogic at openwrt.org>
----
- drivers/soc/mediatek/mtk-pmic-wrap.c |   22 ++++++++--------------
- 1 file changed, 8 insertions(+), 14 deletions(-)
-
---- a/drivers/soc/mediatek/mtk-pmic-wrap.c
-+++ b/drivers/soc/mediatek/mtk-pmic-wrap.c
-@@ -376,9 +376,7 @@ struct pmic_wrapper {
- 	struct device *dev;
- 	void __iomem *base;
- 	struct regmap *regmap;
--	int *regs;
--	enum pwrap_type type;
--	u32 arb_en_all;
-+	const struct pmic_wrapper_type *master;
- 	struct clk *clk_spi;
- 	struct clk *clk_wrap;
- 	struct reset_control *rstc;
-@@ -389,22 +387,22 @@ struct pmic_wrapper {
- 
- static inline int pwrap_is_mt8135(struct pmic_wrapper *wrp)
- {
--	return wrp->type == PWRAP_MT8135;
-+	return wrp->master->type == PWRAP_MT8135;
- }
- 
- static inline int pwrap_is_mt8173(struct pmic_wrapper *wrp)
- {
--	return wrp->type == PWRAP_MT8173;
-+	return wrp->master->type == PWRAP_MT8173;
- }
- 
- static u32 pwrap_readl(struct pmic_wrapper *wrp, enum pwrap_regs reg)
- {
--	return readl(wrp->base + wrp->regs[reg]);
-+	return readl(wrp->base + wrp->master->regs[reg]);
- }
- 
- static void pwrap_writel(struct pmic_wrapper *wrp, u32 val, enum pwrap_regs reg)
- {
--	writel(val, wrp->base + wrp->regs[reg]);
-+	writel(val, wrp->base + wrp->master->regs[reg]);
- }
- 
- static bool pwrap_is_fsm_idle(struct pmic_wrapper *wrp)
-@@ -697,7 +695,7 @@ static int pwrap_init(struct pmic_wrappe
- 
- 	pwrap_writel(wrp, 1, PWRAP_WRAP_EN);
- 
--	pwrap_writel(wrp, wrp->arb_en_all, PWRAP_HIPRIO_ARB_EN);
-+	pwrap_writel(wrp, wrp->master->arb_en_all, PWRAP_HIPRIO_ARB_EN);
- 
- 	pwrap_writel(wrp, 1, PWRAP_WACS2_EN);
- 
-@@ -742,7 +740,7 @@ static int pwrap_init(struct pmic_wrappe
- 	pwrap_writel(wrp, 0x1, PWRAP_CRC_EN);
- 	pwrap_writel(wrp, 0x0, PWRAP_SIG_MODE);
- 	pwrap_writel(wrp, PWRAP_DEW_CRC_VAL, PWRAP_SIG_ADR);
--	pwrap_writel(wrp, wrp->arb_en_all, PWRAP_HIPRIO_ARB_EN);
-+	pwrap_writel(wrp, wrp->master->arb_en_all, PWRAP_HIPRIO_ARB_EN);
- 
- 	if (pwrap_is_mt8135(wrp))
- 		pwrap_writel(wrp, 0x7, PWRAP_RRARB_EN);
-@@ -836,7 +834,6 @@ static int pwrap_probe(struct platform_d
- 	struct device_node *np = pdev->dev.of_node;
- 	const struct of_device_id *of_id =
- 		of_match_device(of_pwrap_match_tbl, &pdev->dev);
--	const struct pmic_wrapper_type *type;
- 	struct resource *res;
- 
- 	wrp = devm_kzalloc(&pdev->dev, sizeof(*wrp), GFP_KERNEL);
-@@ -845,10 +842,7 @@ static int pwrap_probe(struct platform_d
- 
- 	platform_set_drvdata(pdev, wrp);
- 
--	type = of_id->data;
--	wrp->regs = type->regs;
--	wrp->type = type->type;
--	wrp->arb_en_all = type->arb_en_all;
-+	wrp->master = of_id->data;
- 	wrp->dev = &pdev->dev;
- 
- 	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "pwrap");
diff --git a/target/linux/mediatek/patches-4.4/0033-soc-mediatek-PMIC-wrap-add-wrapper-callbacks-for-ini.patch b/target/linux/mediatek/patches-4.4/0033-soc-mediatek-PMIC-wrap-add-wrapper-callbacks-for-ini.patch
deleted file mode 100644
index 9368a85..0000000
--- a/target/linux/mediatek/patches-4.4/0033-soc-mediatek-PMIC-wrap-add-wrapper-callbacks-for-ini.patch
+++ /dev/null
@@ -1,122 +0,0 @@
-From 756b919b7874cc241a276b4fc5bbec5b3fb4bca8 Mon Sep 17 00:00:00 2001
-From: John Crispin <blogic at openwrt.org>
-Date: Wed, 20 Jan 2016 05:27:17 +0100
-Subject: [PATCH 033/102] soc: mediatek: PMIC wrap: add wrapper callbacks for
- init_reg_clock
-
-Split init_reg_clock up into SoC specific callbacks. The patch also
-reorders the code to avoid the need for callback function prototypes.
-
-Signed-off-by: John Crispin <blogic at openwrt.org>
----
- drivers/soc/mediatek/mtk-pmic-wrap.c |   70 ++++++++++++++++++----------------
- 1 file changed, 38 insertions(+), 32 deletions(-)
-
---- a/drivers/soc/mediatek/mtk-pmic-wrap.c
-+++ b/drivers/soc/mediatek/mtk-pmic-wrap.c
-@@ -354,24 +354,6 @@ enum pwrap_type {
- 	PWRAP_MT8173,
- };
- 
--struct pmic_wrapper_type {
--	int *regs;
--	enum pwrap_type type;
--	u32 arb_en_all;
--};
--
--static struct pmic_wrapper_type pwrap_mt8135 = {
--	.regs = mt8135_regs,
--	.type = PWRAP_MT8135,
--	.arb_en_all = 0x1ff,
--};
--
--static struct pmic_wrapper_type pwrap_mt8173 = {
--	.regs = mt8173_regs,
--	.type = PWRAP_MT8173,
--	.arb_en_all = 0x3f,
--};
--
- struct pmic_wrapper {
- 	struct device *dev;
- 	void __iomem *base;
-@@ -385,6 +367,13 @@ struct pmic_wrapper {
- 	void __iomem *bridge_base;
- };
- 
-+struct pmic_wrapper_type {
-+	int *regs;
-+	enum pwrap_type type;
-+	u32 arb_en_all;
-+	int (*init_reg_clock)(struct pmic_wrapper *wrp);
-+};
-+
- static inline int pwrap_is_mt8135(struct pmic_wrapper *wrp)
- {
- 	return wrp->master->type == PWRAP_MT8135;
-@@ -578,20 +567,23 @@ static int pwrap_init_sidly(struct pmic_
- 	return 0;
- }
- 
--static int pwrap_init_reg_clock(struct pmic_wrapper *wrp)
-+static int pwrap_mt8135_init_reg_clock(struct pmic_wrapper *wrp)
- {
--	if (pwrap_is_mt8135(wrp)) {
--		pwrap_writel(wrp, 0x4, PWRAP_CSHEXT);
--		pwrap_writel(wrp, 0x0, PWRAP_CSHEXT_WRITE);
--		pwrap_writel(wrp, 0x4, PWRAP_CSHEXT_READ);
--		pwrap_writel(wrp, 0x0, PWRAP_CSLEXT_START);
--		pwrap_writel(wrp, 0x0, PWRAP_CSLEXT_END);
--	} else {
--		pwrap_writel(wrp, 0x0, PWRAP_CSHEXT_WRITE);
--		pwrap_writel(wrp, 0x4, PWRAP_CSHEXT_READ);
--		pwrap_writel(wrp, 0x2, PWRAP_CSLEXT_START);
--		pwrap_writel(wrp, 0x2, PWRAP_CSLEXT_END);
--	}
-+	pwrap_writel(wrp, 0x4, PWRAP_CSHEXT);
-+	pwrap_writel(wrp, 0x0, PWRAP_CSHEXT_WRITE);
-+	pwrap_writel(wrp, 0x4, PWRAP_CSHEXT_READ);
-+	pwrap_writel(wrp, 0x0, PWRAP_CSLEXT_START);
-+	pwrap_writel(wrp, 0x0, PWRAP_CSLEXT_END);
-+
-+	return 0;
-+}
-+
-+static int pwrap_mt8173_init_reg_clock(struct pmic_wrapper *wrp)
-+{
-+	pwrap_writel(wrp, 0x0, PWRAP_CSHEXT_WRITE);
-+	pwrap_writel(wrp, 0x4, PWRAP_CSHEXT_READ);
-+	pwrap_writel(wrp, 0x2, PWRAP_CSLEXT_START);
-+	pwrap_writel(wrp, 0x2, PWRAP_CSLEXT_END);
- 
- 	return 0;
- }
-@@ -699,7 +691,7 @@ static int pwrap_init(struct pmic_wrappe
- 
- 	pwrap_writel(wrp, 1, PWRAP_WACS2_EN);
- 
--	ret = pwrap_init_reg_clock(wrp);
-+	ret = wrp->master->init_reg_clock(wrp);
- 	if (ret)
- 		return ret;
- 
-@@ -814,6 +806,20 @@ static const struct regmap_config pwrap_
- 	.max_register = 0xffff,
- };
- 
-+static struct pmic_wrapper_type pwrap_mt8135 = {
-+	.regs = mt8135_regs,
-+	.type = PWRAP_MT8135,
-+	.arb_en_all = 0x1ff,
-+	.init_reg_clock = pwrap_mt8135_init_reg_clock,
-+};
-+
-+static struct pmic_wrapper_type pwrap_mt8173 = {
-+	.regs = mt8173_regs,
-+	.type = PWRAP_MT8173,
-+	.arb_en_all = 0x3f,
-+	.init_reg_clock = pwrap_mt8173_init_reg_clock,
-+};
-+
- static struct of_device_id of_pwrap_match_tbl[] = {
- 	{
- 		.compatible = "mediatek,mt8135-pwrap",
diff --git a/target/linux/mediatek/patches-4.4/0034-soc-mediatek-PMIC-wrap-split-SoC-specific-init-into-.patch b/target/linux/mediatek/patches-4.4/0034-soc-mediatek-PMIC-wrap-split-SoC-specific-init-into-.patch
deleted file mode 100644
index 6d9c99a..0000000
--- a/target/linux/mediatek/patches-4.4/0034-soc-mediatek-PMIC-wrap-split-SoC-specific-init-into-.patch
+++ /dev/null
@@ -1,122 +0,0 @@
-From a1bbd630710d5da89a9c347c84d7badd30e7e68a Mon Sep 17 00:00:00 2001
-From: John Crispin <blogic at openwrt.org>
-Date: Wed, 20 Jan 2016 10:12:00 +0100
-Subject: [PATCH 034/102] soc: mediatek: PMIC wrap: split SoC specific init
- into callback
-
-This patch moves the SoC specific wrapper init code into separate callback
-to avoid pwrap_init() getting too large. This is done by adding a new
-element called init_special to pmic_wrapper_type. Each currently supported
-SoC gets its own version of the callback and we copy the code that was
-previously inside pwrap_init() to these new callbacks. Finally we point the
-2 instances of pmic_wrapper_type at the 2 new functions.
-
-Signed-off-by: John Crispin <blogic at openwrt.org>
----
- drivers/soc/mediatek/mtk-pmic-wrap.c |   67 +++++++++++++++++++++-------------
- 1 file changed, 42 insertions(+), 25 deletions(-)
-
---- a/drivers/soc/mediatek/mtk-pmic-wrap.c
-+++ b/drivers/soc/mediatek/mtk-pmic-wrap.c
-@@ -372,6 +372,7 @@ struct pmic_wrapper_type {
- 	enum pwrap_type type;
- 	u32 arb_en_all;
- 	int (*init_reg_clock)(struct pmic_wrapper *wrp);
-+	int (*init_soc_specific)(struct pmic_wrapper *wrp);
- };
- 
- static inline int pwrap_is_mt8135(struct pmic_wrapper *wrp)
-@@ -665,6 +666,41 @@ static int pwrap_init_cipher(struct pmic
- 	return 0;
- }
- 
-+static int pwrap_mt8135_init_soc_specific(struct pmic_wrapper *wrp)
-+{
-+	/* enable pwrap events and pwrap bridge in AP side */
-+	pwrap_writel(wrp, 0x1, PWRAP_EVENT_IN_EN);
-+	pwrap_writel(wrp, 0xffff, PWRAP_EVENT_DST_EN);
-+	writel(0x7f, wrp->bridge_base + PWRAP_MT8135_BRIDGE_IORD_ARB_EN);
-+	writel(0x1, wrp->bridge_base + PWRAP_MT8135_BRIDGE_WACS3_EN);
-+	writel(0x1, wrp->bridge_base + PWRAP_MT8135_BRIDGE_WACS4_EN);
-+	writel(0x1, wrp->bridge_base + PWRAP_MT8135_BRIDGE_WDT_UNIT);
-+	writel(0xffff, wrp->bridge_base + PWRAP_MT8135_BRIDGE_WDT_SRC_EN);
-+	writel(0x1, wrp->bridge_base + PWRAP_MT8135_BRIDGE_TIMER_EN);
-+	writel(0x7ff, wrp->bridge_base + PWRAP_MT8135_BRIDGE_INT_EN);
-+
-+	/* enable PMIC event out and sources */
-+	if (pwrap_write(wrp, PWRAP_DEW_EVENT_OUT_EN, 0x1) ||
-+		pwrap_write(wrp, PWRAP_DEW_EVENT_SRC_EN, 0xffff)) {
-+		dev_err(wrp->dev, "enable dewrap fail\n");
-+		return -EFAULT;
-+	}
-+
-+	return 0;
-+}
-+
-+static int pwrap_mt8173_init_soc_specific(struct pmic_wrapper *wrp)
-+{
-+	/* PMIC_DEWRAP enables */
-+	if (pwrap_write(wrp, PWRAP_DEW_EVENT_OUT_EN, 0x1) ||
-+		pwrap_write(wrp, PWRAP_DEW_EVENT_SRC_EN, 0xffff)) {
-+		dev_err(wrp->dev, "enable dewrap fail\n");
-+		return -EFAULT;
-+	}
-+
-+	return 0;
-+}
-+
- static int pwrap_init(struct pmic_wrapper *wrp)
- {
- 	int ret;
-@@ -743,31 +779,10 @@ static int pwrap_init(struct pmic_wrappe
- 	pwrap_writel(wrp, 0x5, PWRAP_STAUPD_PRD);
- 	pwrap_writel(wrp, 0xff, PWRAP_STAUPD_GRPEN);
- 
--	if (pwrap_is_mt8135(wrp)) {
--		/* enable pwrap events and pwrap bridge in AP side */
--		pwrap_writel(wrp, 0x1, PWRAP_EVENT_IN_EN);
--		pwrap_writel(wrp, 0xffff, PWRAP_EVENT_DST_EN);
--		writel(0x7f, wrp->bridge_base + PWRAP_MT8135_BRIDGE_IORD_ARB_EN);
--		writel(0x1, wrp->bridge_base + PWRAP_MT8135_BRIDGE_WACS3_EN);
--		writel(0x1, wrp->bridge_base + PWRAP_MT8135_BRIDGE_WACS4_EN);
--		writel(0x1, wrp->bridge_base + PWRAP_MT8135_BRIDGE_WDT_UNIT);
--		writel(0xffff, wrp->bridge_base + PWRAP_MT8135_BRIDGE_WDT_SRC_EN);
--		writel(0x1, wrp->bridge_base + PWRAP_MT8135_BRIDGE_TIMER_EN);
--		writel(0x7ff, wrp->bridge_base + PWRAP_MT8135_BRIDGE_INT_EN);
--
--		/* enable PMIC event out and sources */
--		if (pwrap_write(wrp, PWRAP_DEW_EVENT_OUT_EN, 0x1) ||
--				pwrap_write(wrp, PWRAP_DEW_EVENT_SRC_EN, 0xffff)) {
--			dev_err(wrp->dev, "enable dewrap fail\n");
--			return -EFAULT;
--		}
--	} else {
--		/* PMIC_DEWRAP enables */
--		if (pwrap_write(wrp, PWRAP_DEW_EVENT_OUT_EN, 0x1) ||
--				pwrap_write(wrp, PWRAP_DEW_EVENT_SRC_EN, 0xffff)) {
--			dev_err(wrp->dev, "enable dewrap fail\n");
--			return -EFAULT;
--		}
-+	if (wrp->master->init_soc_specific) {
-+		ret = wrp->master->init_soc_specific(wrp);
-+		if (ret)
-+			return ret;
- 	}
- 
- 	/* Setup the init done registers */
-@@ -811,6 +826,7 @@ static struct pmic_wrapper_type pwrap_mt
- 	.type = PWRAP_MT8135,
- 	.arb_en_all = 0x1ff,
- 	.init_reg_clock = pwrap_mt8135_init_reg_clock,
-+	.init_soc_specific = pwrap_mt8135_init_soc_specific,
- };
- 
- static struct pmic_wrapper_type pwrap_mt8173 = {
-@@ -818,6 +834,7 @@ static struct pmic_wrapper_type pwrap_mt
- 	.type = PWRAP_MT8173,
- 	.arb_en_all = 0x3f,
- 	.init_reg_clock = pwrap_mt8173_init_reg_clock,
-+	.init_soc_specific = pwrap_mt8173_init_soc_specific,
- };
- 
- static struct of_device_id of_pwrap_match_tbl[] = {
diff --git a/target/linux/mediatek/patches-4.4/0035-soc-mediatek-PMIC-wrap-WRAP_INT_EN-needs-a-different.patch b/target/linux/mediatek/patches-4.4/0035-soc-mediatek-PMIC-wrap-WRAP_INT_EN-needs-a-different.patch
deleted file mode 100644
index 42fbe2e..0000000
--- a/target/linux/mediatek/patches-4.4/0035-soc-mediatek-PMIC-wrap-WRAP_INT_EN-needs-a-different.patch
+++ /dev/null
@@ -1,48 +0,0 @@
-From 274fd9ba57170de88bbdf522cbd6c290c2e51fb8 Mon Sep 17 00:00:00 2001
-From: John Crispin <blogic at openwrt.org>
-Date: Wed, 20 Jan 2016 10:14:39 +0100
-Subject: [PATCH 035/102] soc: mediatek: PMIC wrap: WRAP_INT_EN needs a
- different bitmask for MT2701/7623
-
-MT2701 and MT7623 use a different bitmask for PWRAP_INT_EN.
-
-Signed-off-by: John Crispin <blogic at openwrt.org>
----
- drivers/soc/mediatek/mtk-pmic-wrap.c |    5 ++++-
- 1 file changed, 4 insertions(+), 1 deletion(-)
-
---- a/drivers/soc/mediatek/mtk-pmic-wrap.c
-+++ b/drivers/soc/mediatek/mtk-pmic-wrap.c
-@@ -371,6 +371,7 @@ struct pmic_wrapper_type {
- 	int *regs;
- 	enum pwrap_type type;
- 	u32 arb_en_all;
-+	u32 int_en_all;
- 	int (*init_reg_clock)(struct pmic_wrapper *wrp);
- 	int (*init_soc_specific)(struct pmic_wrapper *wrp);
- };
-@@ -825,6 +826,7 @@ static struct pmic_wrapper_type pwrap_mt
- 	.regs = mt8135_regs,
- 	.type = PWRAP_MT8135,
- 	.arb_en_all = 0x1ff,
-+	.int_en_all = ~(BIT(31) | BIT(1)),
- 	.init_reg_clock = pwrap_mt8135_init_reg_clock,
- 	.init_soc_specific = pwrap_mt8135_init_soc_specific,
- };
-@@ -833,6 +835,7 @@ static struct pmic_wrapper_type pwrap_mt
- 	.regs = mt8173_regs,
- 	.type = PWRAP_MT8173,
- 	.arb_en_all = 0x3f,
-+	.int_en_all = ~(BIT(31) | BIT(1)),
- 	.init_reg_clock = pwrap_mt8173_init_reg_clock,
- 	.init_soc_specific = pwrap_mt8173_init_soc_specific,
- };
-@@ -946,7 +949,7 @@ static int pwrap_probe(struct platform_d
- 			PWRAP_WDT_SRC_MASK_NO_STAUPD : PWRAP_WDT_SRC_MASK_ALL;
- 	pwrap_writel(wrp, wdt_src, PWRAP_WDT_SRC_EN);
- 	pwrap_writel(wrp, 0x1, PWRAP_TIMER_EN);
--	pwrap_writel(wrp, ~((1 << 31) | (1 << 1)), PWRAP_INT_EN);
-+	pwrap_writel(wrp, wrp->master->int_en_all, PWRAP_INT_EN);
- 
- 	irq = platform_get_irq(pdev, 0);
- 	ret = devm_request_irq(wrp->dev, irq, pwrap_interrupt, IRQF_TRIGGER_HIGH,
diff --git a/target/linux/mediatek/patches-4.4/0036-soc-mediatek-PMIC-wrap-SPI_WRITE-needs-a-different-b.patch b/target/linux/mediatek/patches-4.4/0036-soc-mediatek-PMIC-wrap-SPI_WRITE-needs-a-different-b.patch
deleted file mode 100644
index a80bd73..0000000
--- a/target/linux/mediatek/patches-4.4/0036-soc-mediatek-PMIC-wrap-SPI_WRITE-needs-a-different-b.patch
+++ /dev/null
@@ -1,61 +0,0 @@
-From 511e697282c6425950b95373ac8dc59a42fd2485 Mon Sep 17 00:00:00 2001
-From: John Crispin <blogic at openwrt.org>
-Date: Wed, 20 Jan 2016 10:21:42 +0100
-Subject: [PATCH 036/102] soc: mediatek: PMIC wrap: SPI_WRITE needs a
- different bitmask for MT2701/7623
-
-Different SoCs will use different bitmask for the SPI_WRITE command. This
-patch defines the bitmask in the pmic_wrapper_type struct. This allows us
-to support new SoCs with a different bitmask to the one currently used.
-
-Signed-off-by: John Crispin <blogic at openwrt.org>
----
- drivers/soc/mediatek/mtk-pmic-wrap.c |   11 +++++++----
- 1 file changed, 7 insertions(+), 4 deletions(-)
-
---- a/drivers/soc/mediatek/mtk-pmic-wrap.c
-+++ b/drivers/soc/mediatek/mtk-pmic-wrap.c
-@@ -372,6 +372,7 @@ struct pmic_wrapper_type {
- 	enum pwrap_type type;
- 	u32 arb_en_all;
- 	u32 int_en_all;
-+	u32 spi_w;
- 	int (*init_reg_clock)(struct pmic_wrapper *wrp);
- 	int (*init_soc_specific)(struct pmic_wrapper *wrp);
- };
-@@ -511,15 +512,15 @@ static int pwrap_reset_spislave(struct p
- 	pwrap_writel(wrp, 1, PWRAP_MAN_EN);
- 	pwrap_writel(wrp, 0, PWRAP_DIO_EN);
- 
--	pwrap_writel(wrp, PWRAP_MAN_CMD_SPI_WRITE | PWRAP_MAN_CMD_OP_CSL,
-+	pwrap_writel(wrp, wrp->master->spi_w | PWRAP_MAN_CMD_OP_CSL,
- 			PWRAP_MAN_CMD);
--	pwrap_writel(wrp, PWRAP_MAN_CMD_SPI_WRITE | PWRAP_MAN_CMD_OP_OUTS,
-+	pwrap_writel(wrp, wrp->master->spi_w | PWRAP_MAN_CMD_OP_OUTS,
- 			PWRAP_MAN_CMD);
--	pwrap_writel(wrp, PWRAP_MAN_CMD_SPI_WRITE | PWRAP_MAN_CMD_OP_CSH,
-+	pwrap_writel(wrp, wrp->master->spi_w | PWRAP_MAN_CMD_OP_CSH,
- 			PWRAP_MAN_CMD);
- 
- 	for (i = 0; i < 4; i++)
--		pwrap_writel(wrp, PWRAP_MAN_CMD_SPI_WRITE | PWRAP_MAN_CMD_OP_OUTS,
-+		pwrap_writel(wrp, wrp->master->spi_w | PWRAP_MAN_CMD_OP_OUTS,
- 				PWRAP_MAN_CMD);
- 
- 	ret = pwrap_wait_for_state(wrp, pwrap_is_sync_idle);
-@@ -827,6 +828,7 @@ static struct pmic_wrapper_type pwrap_mt
- 	.type = PWRAP_MT8135,
- 	.arb_en_all = 0x1ff,
- 	.int_en_all = ~(BIT(31) | BIT(1)),
-+	.spi_w = PWRAP_MAN_CMD_SPI_WRITE,
- 	.init_reg_clock = pwrap_mt8135_init_reg_clock,
- 	.init_soc_specific = pwrap_mt8135_init_soc_specific,
- };
-@@ -836,6 +838,7 @@ static struct pmic_wrapper_type pwrap_mt
- 	.type = PWRAP_MT8173,
- 	.arb_en_all = 0x3f,
- 	.int_en_all = ~(BIT(31) | BIT(1)),
-+	.spi_w = PWRAP_MAN_CMD_SPI_WRITE,
- 	.init_reg_clock = pwrap_mt8173_init_reg_clock,
- 	.init_soc_specific = pwrap_mt8173_init_soc_specific,
- };
diff --git a/target/linux/mediatek/patches-4.4/0037-soc-mediatek-PMIC-wrap-move-wdt_src-into-the-pmic_wr.patch b/target/linux/mediatek/patches-4.4/0037-soc-mediatek-PMIC-wrap-move-wdt_src-into-the-pmic_wr.patch
deleted file mode 100644
index 1e2c587..0000000
--- a/target/linux/mediatek/patches-4.4/0037-soc-mediatek-PMIC-wrap-move-wdt_src-into-the-pmic_wr.patch
+++ /dev/null
@@ -1,61 +0,0 @@
-From 6aecbc79322efd3068c6140f74a68654fbe5b5f6 Mon Sep 17 00:00:00 2001
-From: John Crispin <blogic at openwrt.org>
-Date: Wed, 20 Jan 2016 10:48:35 +0100
-Subject: [PATCH 037/102] soc: mediatek: PMIC wrap: move wdt_src into the
- pmic_wrapper_type struct
-
-Different SoCs will use different bitmask for the wdt_src. This patch
-defines the bitmask in the pmic_wrapper_type struct. This allows us to
-support new SoCs with a different bitmask to the one currently used.
-
-Signed-off-by: John Crispin <blogic at openwrt.org>
----
- drivers/soc/mediatek/mtk-pmic-wrap.c |    9 +++++----
- 1 file changed, 5 insertions(+), 4 deletions(-)
-
---- a/drivers/soc/mediatek/mtk-pmic-wrap.c
-+++ b/drivers/soc/mediatek/mtk-pmic-wrap.c
-@@ -373,6 +373,7 @@ struct pmic_wrapper_type {
- 	u32 arb_en_all;
- 	u32 int_en_all;
- 	u32 spi_w;
-+	u32 wdt_src;
- 	int (*init_reg_clock)(struct pmic_wrapper *wrp);
- 	int (*init_soc_specific)(struct pmic_wrapper *wrp);
- };
-@@ -829,6 +830,7 @@ static struct pmic_wrapper_type pwrap_mt
- 	.arb_en_all = 0x1ff,
- 	.int_en_all = ~(BIT(31) | BIT(1)),
- 	.spi_w = PWRAP_MAN_CMD_SPI_WRITE,
-+	.wdt_src = PWRAP_WDT_SRC_MASK_ALL,
- 	.init_reg_clock = pwrap_mt8135_init_reg_clock,
- 	.init_soc_specific = pwrap_mt8135_init_soc_specific,
- };
-@@ -839,6 +841,7 @@ static struct pmic_wrapper_type pwrap_mt
- 	.arb_en_all = 0x3f,
- 	.int_en_all = ~(BIT(31) | BIT(1)),
- 	.spi_w = PWRAP_MAN_CMD_SPI_WRITE,
-+	.wdt_src = PWRAP_WDT_SRC_MASK_NO_STAUPD,
- 	.init_reg_clock = pwrap_mt8173_init_reg_clock,
- 	.init_soc_specific = pwrap_mt8173_init_soc_specific,
- };
-@@ -858,7 +861,7 @@ MODULE_DEVICE_TABLE(of, of_pwrap_match_t
- 
- static int pwrap_probe(struct platform_device *pdev)
- {
--	int ret, irq, wdt_src;
-+	int ret, irq;
- 	struct pmic_wrapper *wrp;
- 	struct device_node *np = pdev->dev.of_node;
- 	const struct of_device_id *of_id =
-@@ -948,9 +951,7 @@ static int pwrap_probe(struct platform_d
- 	 * Since STAUPD was not used on mt8173 platform,
- 	 * so STAUPD of WDT_SRC which should be turned off
- 	 */
--	wdt_src = pwrap_is_mt8173(wrp) ?
--			PWRAP_WDT_SRC_MASK_NO_STAUPD : PWRAP_WDT_SRC_MASK_ALL;
--	pwrap_writel(wrp, wdt_src, PWRAP_WDT_SRC_EN);
-+	pwrap_writel(wrp, wrp->master->wdt_src, PWRAP_WDT_SRC_EN);
- 	pwrap_writel(wrp, 0x1, PWRAP_TIMER_EN);
- 	pwrap_writel(wrp, wrp->master->int_en_all, PWRAP_INT_EN);
- 
diff --git a/target/linux/mediatek/patches-4.4/0038-soc-mediatek-PMIC-wrap-remove-pwrap_is_mt8135-and-pw.patch b/target/linux/mediatek/patches-4.4/0038-soc-mediatek-PMIC-wrap-remove-pwrap_is_mt8135-and-pw.patch
deleted file mode 100644
index 001793f..0000000
--- a/target/linux/mediatek/patches-4.4/0038-soc-mediatek-PMIC-wrap-remove-pwrap_is_mt8135-and-pw.patch
+++ /dev/null
@@ -1,113 +0,0 @@
-From da09b34ad22e8f065a02af114668f7d86357244a Mon Sep 17 00:00:00 2001
-From: John Crispin <blogic at openwrt.org>
-Date: Wed, 20 Jan 2016 10:54:18 +0100
-Subject: [PATCH 038/102] soc: mediatek: PMIC wrap: remove pwrap_is_mt8135()
- and pwrap_is_mt8173()
-
-With more SoCs being added the list of helper functions like these would
-grow. To mitigate this problem we remove the existing helpers and change
-the code to test against the pmic type stored inside the pmic specific
-datastructure that our context structure points at. There is one usage of
-pwrap_is_mt8135() that is ambiguous as the test should not be dependent on
-mt8135, but rather on the existence of a bridge. Add a new element to
-pmic_wrapper_type to indicate if a bridge is present and use this where
-appropriate.
-
-Signed-off-by: John Crispin <blogic at openwrt.org>
----
- drivers/soc/mediatek/mtk-pmic-wrap.c |   28 ++++++++++++----------------
- 1 file changed, 12 insertions(+), 16 deletions(-)
-
---- a/drivers/soc/mediatek/mtk-pmic-wrap.c
-+++ b/drivers/soc/mediatek/mtk-pmic-wrap.c
-@@ -374,20 +374,11 @@ struct pmic_wrapper_type {
- 	u32 int_en_all;
- 	u32 spi_w;
- 	u32 wdt_src;
-+	int has_bridge:1;
- 	int (*init_reg_clock)(struct pmic_wrapper *wrp);
- 	int (*init_soc_specific)(struct pmic_wrapper *wrp);
- };
- 
--static inline int pwrap_is_mt8135(struct pmic_wrapper *wrp)
--{
--	return wrp->master->type == PWRAP_MT8135;
--}
--
--static inline int pwrap_is_mt8173(struct pmic_wrapper *wrp)
--{
--	return wrp->master->type == PWRAP_MT8173;
--}
--
- static u32 pwrap_readl(struct pmic_wrapper *wrp, enum pwrap_regs reg)
- {
- 	return readl(wrp->base + wrp->master->regs[reg]);
-@@ -619,11 +610,14 @@ static int pwrap_init_cipher(struct pmic
- 	pwrap_writel(wrp, 0x1, PWRAP_CIPHER_KEY_SEL);
- 	pwrap_writel(wrp, 0x2, PWRAP_CIPHER_IV_SEL);
- 
--	if (pwrap_is_mt8135(wrp)) {
-+	switch (wrp->master->type) {
-+	case PWRAP_MT8135:
- 		pwrap_writel(wrp, 1, PWRAP_CIPHER_LOAD);
- 		pwrap_writel(wrp, 1, PWRAP_CIPHER_START);
--	} else {
-+		break;
-+	case PWRAP_MT8173:
- 		pwrap_writel(wrp, 1, PWRAP_CIPHER_EN);
-+		break;
- 	}
- 
- 	/* Config cipher mode @PMIC */
-@@ -713,7 +707,7 @@ static int pwrap_init(struct pmic_wrappe
- 	if (wrp->rstc_bridge)
- 		reset_control_reset(wrp->rstc_bridge);
- 
--	if (pwrap_is_mt8173(wrp)) {
-+	if (wrp->master->type == PWRAP_MT8173) {
- 		/* Enable DCM */
- 		pwrap_writel(wrp, 3, PWRAP_DCM_EN);
- 		pwrap_writel(wrp, 0, PWRAP_DCM_DBC_PRD);
-@@ -773,7 +767,7 @@ static int pwrap_init(struct pmic_wrappe
- 	pwrap_writel(wrp, PWRAP_DEW_CRC_VAL, PWRAP_SIG_ADR);
- 	pwrap_writel(wrp, wrp->master->arb_en_all, PWRAP_HIPRIO_ARB_EN);
- 
--	if (pwrap_is_mt8135(wrp))
-+	if (wrp->master->type == PWRAP_MT8135)
- 		pwrap_writel(wrp, 0x7, PWRAP_RRARB_EN);
- 
- 	pwrap_writel(wrp, 0x1, PWRAP_WACS0_EN);
-@@ -793,7 +787,7 @@ static int pwrap_init(struct pmic_wrappe
- 	pwrap_writel(wrp, 1, PWRAP_INIT_DONE0);
- 	pwrap_writel(wrp, 1, PWRAP_INIT_DONE1);
- 
--	if (pwrap_is_mt8135(wrp)) {
-+	if (wrp->master->has_bridge) {
- 		writel(1, wrp->bridge_base + PWRAP_MT8135_BRIDGE_INIT_DONE3);
- 		writel(1, wrp->bridge_base + PWRAP_MT8135_BRIDGE_INIT_DONE4);
- 	}
-@@ -831,6 +825,7 @@ static struct pmic_wrapper_type pwrap_mt
- 	.int_en_all = ~(BIT(31) | BIT(1)),
- 	.spi_w = PWRAP_MAN_CMD_SPI_WRITE,
- 	.wdt_src = PWRAP_WDT_SRC_MASK_ALL,
-+	.has_bridge = 1,
- 	.init_reg_clock = pwrap_mt8135_init_reg_clock,
- 	.init_soc_specific = pwrap_mt8135_init_soc_specific,
- };
-@@ -842,6 +837,7 @@ static struct pmic_wrapper_type pwrap_mt
- 	.int_en_all = ~(BIT(31) | BIT(1)),
- 	.spi_w = PWRAP_MAN_CMD_SPI_WRITE,
- 	.wdt_src = PWRAP_WDT_SRC_MASK_NO_STAUPD,
-+	.has_bridge = 0,
- 	.init_reg_clock = pwrap_mt8173_init_reg_clock,
- 	.init_soc_specific = pwrap_mt8173_init_soc_specific,
- };
-@@ -889,7 +885,7 @@ static int pwrap_probe(struct platform_d
- 		return ret;
- 	}
- 
--	if (pwrap_is_mt8135(wrp)) {
-+	if (wrp->master->has_bridge) {
- 		res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
- 				"pwrap-bridge");
- 		wrp->bridge_base = devm_ioremap_resource(wrp->dev, res);
diff --git a/target/linux/mediatek/patches-4.4/0039-soc-mediatek-PMIC-wrap-add-a-slave-specific-struct.patch b/target/linux/mediatek/patches-4.4/0039-soc-mediatek-PMIC-wrap-add-a-slave-specific-struct.patch
deleted file mode 100644
index dea271a..0000000
--- a/target/linux/mediatek/patches-4.4/0039-soc-mediatek-PMIC-wrap-add-a-slave-specific-struct.patch
+++ /dev/null
@@ -1,297 +0,0 @@
-From 21bdcd324f769545b1765fe391d939a1edd07cbb Mon Sep 17 00:00:00 2001
-From: John Crispin <blogic at openwrt.org>
-Date: Wed, 20 Jan 2016 09:55:08 +0100
-Subject: [PATCH 039/102] soc: mediatek: PMIC wrap: add a slave specific
- struct
-
-This patch adds a new struct pwrap_slv_type that we use to store the slave
-specific data. The patch adds 2 new helper functions to access the dew
-registers. The slave type is looked up via the wrappers child node.
-
-Signed-off-by: John Crispin <blogic at openwrt.org>
----
- drivers/soc/mediatek/mtk-pmic-wrap.c |  159 ++++++++++++++++++++++++----------
- 1 file changed, 112 insertions(+), 47 deletions(-)
-
---- a/drivers/soc/mediatek/mtk-pmic-wrap.c
-+++ b/drivers/soc/mediatek/mtk-pmic-wrap.c
-@@ -69,33 +69,54 @@
- 					  PWRAP_WDT_SRC_EN_HARB_STAUPD_DLE | \
- 					  PWRAP_WDT_SRC_EN_HARB_STAUPD_ALE)
- 
--/* macro for slave device wrapper registers */
--#define PWRAP_DEW_BASE			0xbc00
--#define PWRAP_DEW_EVENT_OUT_EN		(PWRAP_DEW_BASE + 0x0)
--#define PWRAP_DEW_DIO_EN		(PWRAP_DEW_BASE + 0x2)
--#define PWRAP_DEW_EVENT_SRC_EN		(PWRAP_DEW_BASE + 0x4)
--#define PWRAP_DEW_EVENT_SRC		(PWRAP_DEW_BASE + 0x6)
--#define PWRAP_DEW_EVENT_FLAG		(PWRAP_DEW_BASE + 0x8)
--#define PWRAP_DEW_READ_TEST		(PWRAP_DEW_BASE + 0xa)
--#define PWRAP_DEW_WRITE_TEST		(PWRAP_DEW_BASE + 0xc)
--#define PWRAP_DEW_CRC_EN		(PWRAP_DEW_BASE + 0xe)
--#define PWRAP_DEW_CRC_VAL		(PWRAP_DEW_BASE + 0x10)
--#define PWRAP_DEW_MON_GRP_SEL		(PWRAP_DEW_BASE + 0x12)
--#define PWRAP_DEW_MON_FLAG_SEL		(PWRAP_DEW_BASE + 0x14)
--#define PWRAP_DEW_EVENT_TEST		(PWRAP_DEW_BASE + 0x16)
--#define PWRAP_DEW_CIPHER_KEY_SEL	(PWRAP_DEW_BASE + 0x18)
--#define PWRAP_DEW_CIPHER_IV_SEL		(PWRAP_DEW_BASE + 0x1a)
--#define PWRAP_DEW_CIPHER_LOAD		(PWRAP_DEW_BASE + 0x1c)
--#define PWRAP_DEW_CIPHER_START		(PWRAP_DEW_BASE + 0x1e)
--#define PWRAP_DEW_CIPHER_RDY		(PWRAP_DEW_BASE + 0x20)
--#define PWRAP_DEW_CIPHER_MODE		(PWRAP_DEW_BASE + 0x22)
--#define PWRAP_DEW_CIPHER_SWRST		(PWRAP_DEW_BASE + 0x24)
--#define PWRAP_MT8173_DEW_CIPHER_IV0	(PWRAP_DEW_BASE + 0x26)
--#define PWRAP_MT8173_DEW_CIPHER_IV1	(PWRAP_DEW_BASE + 0x28)
--#define PWRAP_MT8173_DEW_CIPHER_IV2	(PWRAP_DEW_BASE + 0x2a)
--#define PWRAP_MT8173_DEW_CIPHER_IV3	(PWRAP_DEW_BASE + 0x2c)
--#define PWRAP_MT8173_DEW_CIPHER_IV4	(PWRAP_DEW_BASE + 0x2e)
--#define PWRAP_MT8173_DEW_CIPHER_IV5	(PWRAP_DEW_BASE + 0x30)
-+/* defines for slave device wrapper registers */
-+enum dew_regs {
-+	PWRAP_DEW_BASE,
-+	PWRAP_DEW_DIO_EN,
-+	PWRAP_DEW_READ_TEST,
-+	PWRAP_DEW_WRITE_TEST,
-+	PWRAP_DEW_CRC_EN,
-+	PWRAP_DEW_CRC_VAL,
-+	PWRAP_DEW_MON_GRP_SEL,
-+	PWRAP_DEW_CIPHER_KEY_SEL,
-+	PWRAP_DEW_CIPHER_IV_SEL,
-+	PWRAP_DEW_CIPHER_RDY,
-+	PWRAP_DEW_CIPHER_MODE,
-+	PWRAP_DEW_CIPHER_SWRST,
-+
-+	/* MT6397 only regs */
-+	PWRAP_DEW_EVENT_OUT_EN,
-+	PWRAP_DEW_EVENT_SRC_EN,
-+	PWRAP_DEW_EVENT_SRC,
-+	PWRAP_DEW_EVENT_FLAG,
-+	PWRAP_DEW_MON_FLAG_SEL,
-+	PWRAP_DEW_EVENT_TEST,
-+	PWRAP_DEW_CIPHER_LOAD,
-+	PWRAP_DEW_CIPHER_START,
-+};
-+
-+static const u32 mt6397_regs[] = {
-+	[PWRAP_DEW_BASE] =		0xbc00,
-+	[PWRAP_DEW_EVENT_OUT_EN] =	0xbc00,
-+	[PWRAP_DEW_DIO_EN] =		0xbc02,
-+	[PWRAP_DEW_EVENT_SRC_EN] =	0xbc04,
-+	[PWRAP_DEW_EVENT_SRC] =		0xbc06,
-+	[PWRAP_DEW_EVENT_FLAG] =	0xbc08,
-+	[PWRAP_DEW_READ_TEST] =		0xbc0a,
-+	[PWRAP_DEW_WRITE_TEST] =	0xbc0c,
-+	[PWRAP_DEW_CRC_EN] =		0xbc0e,
-+	[PWRAP_DEW_CRC_VAL] =		0xbc10,
-+	[PWRAP_DEW_MON_GRP_SEL] =	0xbc12,
-+	[PWRAP_DEW_MON_FLAG_SEL] =	0xbc14,
-+	[PWRAP_DEW_EVENT_TEST] =	0xbc16,
-+	[PWRAP_DEW_CIPHER_KEY_SEL] =	0xbc18,
-+	[PWRAP_DEW_CIPHER_IV_SEL] =	0xbc1a,
-+	[PWRAP_DEW_CIPHER_LOAD] =	0xbc1c,
-+	[PWRAP_DEW_CIPHER_START] =	0xbc1e,
-+	[PWRAP_DEW_CIPHER_RDY] =	0xbc20,
-+	[PWRAP_DEW_CIPHER_MODE] =	0xbc22,
-+	[PWRAP_DEW_CIPHER_SWRST] =	0xbc24,
-+};
- 
- enum pwrap_regs {
- 	PWRAP_MUX_SEL,
-@@ -349,16 +370,26 @@ static int mt8135_regs[] = {
- 	[PWRAP_DCM_DBC_PRD] =		0x160,
- };
- 
-+enum pmic_type {
-+	PMIC_MT6397,
-+};
-+
- enum pwrap_type {
- 	PWRAP_MT8135,
- 	PWRAP_MT8173,
- };
- 
-+struct pwrap_slv_type {
-+	const u32 *dew_regs;
-+	enum pmic_type type;
-+};
-+
- struct pmic_wrapper {
- 	struct device *dev;
- 	void __iomem *base;
- 	struct regmap *regmap;
- 	const struct pmic_wrapper_type *master;
-+	const struct pwrap_slv_type *slave;
- 	struct clk *clk_spi;
- 	struct clk *clk_wrap;
- 	struct reset_control *rstc;
-@@ -544,7 +575,8 @@ static int pwrap_init_sidly(struct pmic_
- 
- 	for (i = 0; i < 4; i++) {
- 		pwrap_writel(wrp, i, PWRAP_SIDLY);
--		pwrap_read(wrp, PWRAP_DEW_READ_TEST, &rdata);
-+		pwrap_read(wrp, wrp->slave->dew_regs[PWRAP_DEW_READ_TEST],
-+			   &rdata);
- 		if (rdata == PWRAP_DEW_READ_TEST_VAL) {
- 			dev_dbg(wrp->dev, "[Read Test] pass, SIDLY=%x\n", i);
- 			pass |= 1 << i;
-@@ -593,7 +625,8 @@ static bool pwrap_is_pmic_cipher_ready(s
- 	u32 rdata;
- 	int ret;
- 
--	ret = pwrap_read(wrp, PWRAP_DEW_CIPHER_RDY, &rdata);
-+	ret = pwrap_read(wrp, wrp->slave->dew_regs[PWRAP_DEW_CIPHER_RDY],
-+			 &rdata);
- 	if (ret)
- 		return 0;
- 
-@@ -621,12 +654,12 @@ static int pwrap_init_cipher(struct pmic
- 	}
- 
- 	/* Config cipher mode @PMIC */
--	pwrap_write(wrp, PWRAP_DEW_CIPHER_SWRST, 0x1);
--	pwrap_write(wrp, PWRAP_DEW_CIPHER_SWRST, 0x0);
--	pwrap_write(wrp, PWRAP_DEW_CIPHER_KEY_SEL, 0x1);
--	pwrap_write(wrp, PWRAP_DEW_CIPHER_IV_SEL, 0x2);
--	pwrap_write(wrp, PWRAP_DEW_CIPHER_LOAD, 0x1);
--	pwrap_write(wrp, PWRAP_DEW_CIPHER_START, 0x1);
-+	pwrap_write(wrp, wrp->slave->dew_regs[PWRAP_DEW_CIPHER_SWRST], 0x1);
-+	pwrap_write(wrp, wrp->slave->dew_regs[PWRAP_DEW_CIPHER_SWRST], 0x0);
-+	pwrap_write(wrp, wrp->slave->dew_regs[PWRAP_DEW_CIPHER_KEY_SEL], 0x1);
-+	pwrap_write(wrp, wrp->slave->dew_regs[PWRAP_DEW_CIPHER_IV_SEL], 0x2);
-+	pwrap_write(wrp, wrp->slave->dew_regs[PWRAP_DEW_CIPHER_LOAD], 0x1);
-+	pwrap_write(wrp, wrp->slave->dew_regs[PWRAP_DEW_CIPHER_START], 0x1);
- 
- 	/* wait for cipher data ready at AP */
- 	ret = pwrap_wait_for_state(wrp, pwrap_is_cipher_ready);
-@@ -643,7 +676,7 @@ static int pwrap_init_cipher(struct pmic
- 	}
- 
- 	/* wait for cipher mode idle */
--	pwrap_write(wrp, PWRAP_DEW_CIPHER_MODE, 0x1);
-+	pwrap_write(wrp, wrp->slave->dew_regs[PWRAP_DEW_CIPHER_MODE], 0x1);
- 	ret = pwrap_wait_for_state(wrp, pwrap_is_fsm_idle_and_sync_idle);
- 	if (ret) {
- 		dev_err(wrp->dev, "cipher mode idle fail, ret=%d\n", ret);
-@@ -653,9 +686,11 @@ static int pwrap_init_cipher(struct pmic
- 	pwrap_writel(wrp, 1, PWRAP_CIPHER_MODE);
- 
- 	/* Write Test */
--	if (pwrap_write(wrp, PWRAP_DEW_WRITE_TEST, PWRAP_DEW_WRITE_TEST_VAL) ||
--	    pwrap_read(wrp, PWRAP_DEW_WRITE_TEST, &rdata) ||
--			(rdata != PWRAP_DEW_WRITE_TEST_VAL)) {
-+	if (pwrap_write(wrp, wrp->slave->dew_regs[PWRAP_DEW_WRITE_TEST],
-+			PWRAP_DEW_WRITE_TEST_VAL) ||
-+	    pwrap_read(wrp, wrp->slave->dew_regs[PWRAP_DEW_WRITE_TEST],
-+		       &rdata) ||
-+	    (rdata != PWRAP_DEW_WRITE_TEST_VAL)) {
- 		dev_err(wrp->dev, "rdata=0x%04X\n", rdata);
- 		return -EFAULT;
- 	}
-@@ -677,8 +712,10 @@ static int pwrap_mt8135_init_soc_specifi
- 	writel(0x7ff, wrp->bridge_base + PWRAP_MT8135_BRIDGE_INT_EN);
- 
- 	/* enable PMIC event out and sources */
--	if (pwrap_write(wrp, PWRAP_DEW_EVENT_OUT_EN, 0x1) ||
--		pwrap_write(wrp, PWRAP_DEW_EVENT_SRC_EN, 0xffff)) {
-+	if (pwrap_write(wrp, wrp->slave->dew_regs[PWRAP_DEW_EVENT_OUT_EN],
-+			0x1) ||
-+	    pwrap_write(wrp, wrp->slave->dew_regs[PWRAP_DEW_EVENT_SRC_EN],
-+			0xffff)) {
- 		dev_err(wrp->dev, "enable dewrap fail\n");
- 		return -EFAULT;
- 	}
-@@ -689,8 +726,10 @@ static int pwrap_mt8135_init_soc_specifi
- static int pwrap_mt8173_init_soc_specific(struct pmic_wrapper *wrp)
- {
- 	/* PMIC_DEWRAP enables */
--	if (pwrap_write(wrp, PWRAP_DEW_EVENT_OUT_EN, 0x1) ||
--		pwrap_write(wrp, PWRAP_DEW_EVENT_SRC_EN, 0xffff)) {
-+	if (pwrap_write(wrp, wrp->slave->dew_regs[PWRAP_DEW_EVENT_OUT_EN],
-+			0x1) ||
-+	    pwrap_write(wrp, wrp->slave->dew_regs[PWRAP_DEW_EVENT_SRC_EN],
-+			0xffff)) {
- 		dev_err(wrp->dev, "enable dewrap fail\n");
- 		return -EFAULT;
- 	}
-@@ -734,7 +773,7 @@ static int pwrap_init(struct pmic_wrappe
- 		return ret;
- 
- 	/* Enable dual IO mode */
--	pwrap_write(wrp, PWRAP_DEW_DIO_EN, 1);
-+	pwrap_write(wrp, wrp->slave->dew_regs[PWRAP_DEW_DIO_EN], 1);
- 
- 	/* Check IDLE & INIT_DONE in advance */
- 	ret = pwrap_wait_for_state(wrp, pwrap_is_fsm_idle_and_sync_idle);
-@@ -746,7 +785,7 @@ static int pwrap_init(struct pmic_wrappe
- 	pwrap_writel(wrp, 1, PWRAP_DIO_EN);
- 
- 	/* Read Test */
--	pwrap_read(wrp, PWRAP_DEW_READ_TEST, &rdata);
-+	pwrap_read(wrp, wrp->slave->dew_regs[PWRAP_DEW_READ_TEST], &rdata);
- 	if (rdata != PWRAP_DEW_READ_TEST_VAL) {
- 		dev_err(wrp->dev, "Read test failed after switch to DIO mode: 0x%04x != 0x%04x\n",
- 				PWRAP_DEW_READ_TEST_VAL, rdata);
-@@ -759,12 +798,13 @@ static int pwrap_init(struct pmic_wrappe
- 		return ret;
- 
- 	/* Signature checking - using CRC */
--	if (pwrap_write(wrp, PWRAP_DEW_CRC_EN, 0x1))
-+	if (pwrap_write(wrp, wrp->slave->dew_regs[PWRAP_DEW_CRC_EN], 0x1))
- 		return -EFAULT;
- 
- 	pwrap_writel(wrp, 0x1, PWRAP_CRC_EN);
- 	pwrap_writel(wrp, 0x0, PWRAP_SIG_MODE);
--	pwrap_writel(wrp, PWRAP_DEW_CRC_VAL, PWRAP_SIG_ADR);
-+	pwrap_writel(wrp, wrp->slave->dew_regs[PWRAP_DEW_CRC_VAL],
-+		     PWRAP_SIG_ADR);
- 	pwrap_writel(wrp, wrp->master->arb_en_all, PWRAP_HIPRIO_ARB_EN);
- 
- 	if (wrp->master->type == PWRAP_MT8135)
-@@ -818,6 +858,21 @@ static const struct regmap_config pwrap_
- 	.max_register = 0xffff,
- };
- 
-+static const struct pwrap_slv_type pmic_mt6397 = {
-+	.dew_regs = mt6397_regs,
-+	.type = PMIC_MT6397,
-+};
-+
-+static const struct of_device_id of_slave_match_tbl[] = {
-+	{
-+		.compatible = "mediatek,mt6397",
-+		.data = &pmic_mt6397,
-+	}, {
-+		/* sentinel */
-+	}
-+};
-+MODULE_DEVICE_TABLE(of, of_slave_match_tbl);
-+
- static struct pmic_wrapper_type pwrap_mt8135 = {
- 	.regs = mt8135_regs,
- 	.type = PWRAP_MT8135,
-@@ -862,8 +917,17 @@ static int pwrap_probe(struct platform_d
- 	struct device_node *np = pdev->dev.of_node;
- 	const struct of_device_id *of_id =
- 		of_match_device(of_pwrap_match_tbl, &pdev->dev);
-+	const struct of_device_id *of_slave_id = NULL;
- 	struct resource *res;
- 
-+	if (pdev->dev.of_node->child)
-+		of_slave_id = of_match_node(of_slave_match_tbl,
-+					    pdev->dev.of_node->child);
-+	if (!of_slave_id) {
-+		dev_dbg(&pdev->dev, "slave pmic should be defined in dts\n");
-+		return -EINVAL;
-+	}
-+
- 	wrp = devm_kzalloc(&pdev->dev, sizeof(*wrp), GFP_KERNEL);
- 	if (!wrp)
- 		return -ENOMEM;
-@@ -871,6 +935,7 @@ static int pwrap_probe(struct platform_d
- 	platform_set_drvdata(pdev, wrp);
- 
- 	wrp->master = of_id->data;
-+	wrp->slave = of_slave_id->data;
- 	wrp->dev = &pdev->dev;
- 
- 	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "pwrap");
diff --git a/target/linux/mediatek/patches-4.4/0040-soc-mediatek-PMIC-wrap-add-mt6323-slave-support.patch b/target/linux/mediatek/patches-4.4/0040-soc-mediatek-PMIC-wrap-add-mt6323-slave-support.patch
deleted file mode 100644
index 51f0628..0000000
--- a/target/linux/mediatek/patches-4.4/0040-soc-mediatek-PMIC-wrap-add-mt6323-slave-support.patch
+++ /dev/null
@@ -1,93 +0,0 @@
-From 4418ba9a0bb105f00259d10ceb16f9e27199e9b0 Mon Sep 17 00:00:00 2001
-From: John Crispin <blogic at openwrt.org>
-Date: Wed, 20 Jan 2016 11:40:43 +0100
-Subject: [PATCH 040/102] soc: mediatek: PMIC wrap: add mt6323 slave support
-
-Add support for MT6323 slaves. This PMIC can be found on MT2701 and MT7623
-EVB. The only function that we need to touch is pwrap_init_cipher().
-
-Signed-off-by: John Crispin <blogic at openwrt.org>
----
- drivers/soc/mediatek/mtk-pmic-wrap.c |   43 ++++++++++++++++++++++++++++++++++
- 1 file changed, 43 insertions(+)
-
---- a/drivers/soc/mediatek/mtk-pmic-wrap.c
-+++ b/drivers/soc/mediatek/mtk-pmic-wrap.c
-@@ -93,6 +93,27 @@ enum dew_regs {
- 	PWRAP_DEW_EVENT_TEST,
- 	PWRAP_DEW_CIPHER_LOAD,
- 	PWRAP_DEW_CIPHER_START,
-+
-+	/* MT6323 only regs */
-+	PWRAP_DEW_CIPHER_EN,
-+	PWRAP_DEW_RDDMY_NO,
-+};
-+
-+static const u32 mt6323_regs[] = {
-+	[PWRAP_DEW_BASE] =		0x0000,
-+	[PWRAP_DEW_DIO_EN] =		0x018a,
-+	[PWRAP_DEW_READ_TEST] =		0x018c,
-+	[PWRAP_DEW_WRITE_TEST] =	0x018e,
-+	[PWRAP_DEW_CRC_EN] =		0x0192,
-+	[PWRAP_DEW_CRC_VAL] =		0x0194,
-+	[PWRAP_DEW_MON_GRP_SEL] =	0x0196,
-+	[PWRAP_DEW_CIPHER_KEY_SEL] =	0x0198,
-+	[PWRAP_DEW_CIPHER_IV_SEL] =	0x019a,
-+	[PWRAP_DEW_CIPHER_EN] =		0x019c,
-+	[PWRAP_DEW_CIPHER_RDY] =	0x019e,
-+	[PWRAP_DEW_CIPHER_MODE] =	0x01a0,
-+	[PWRAP_DEW_CIPHER_SWRST] =	0x01a2,
-+	[PWRAP_DEW_RDDMY_NO] =		0x01a4,
- };
- 
- static const u32 mt6397_regs[] = {
-@@ -371,6 +392,7 @@ static int mt8135_regs[] = {
- };
- 
- enum pmic_type {
-+	PMIC_MT6323,
- 	PMIC_MT6397,
- };
- 
-@@ -661,6 +683,19 @@ static int pwrap_init_cipher(struct pmic
- 	pwrap_write(wrp, wrp->slave->dew_regs[PWRAP_DEW_CIPHER_LOAD], 0x1);
- 	pwrap_write(wrp, wrp->slave->dew_regs[PWRAP_DEW_CIPHER_START], 0x1);
- 
-+	switch (wrp->slave->type) {
-+	case PMIC_MT6397:
-+		pwrap_write(wrp, wrp->slave->dew_regs[PWRAP_DEW_CIPHER_LOAD],
-+			    0x1);
-+		pwrap_write(wrp, wrp->slave->dew_regs[PWRAP_DEW_CIPHER_START],
-+			    0x1);
-+		break;
-+	case PMIC_MT6323:
-+		pwrap_write(wrp, wrp->slave->dew_regs[PWRAP_DEW_CIPHER_EN],
-+			    0x1);
-+		break;
-+	}
-+
- 	/* wait for cipher data ready at AP */
- 	ret = pwrap_wait_for_state(wrp, pwrap_is_cipher_ready);
- 	if (ret) {
-@@ -858,6 +893,11 @@ static const struct regmap_config pwrap_
- 	.max_register = 0xffff,
- };
- 
-+static const struct pwrap_slv_type pmic_mt6323 = {
-+	.dew_regs = mt6323_regs,
-+	.type = PMIC_MT6323,
-+};
-+
- static const struct pwrap_slv_type pmic_mt6397 = {
- 	.dew_regs = mt6397_regs,
- 	.type = PMIC_MT6397,
-@@ -865,6 +905,9 @@ static const struct pwrap_slv_type pmic_
- 
- static const struct of_device_id of_slave_match_tbl[] = {
- 	{
-+		.compatible = "mediatek,mt6323",
-+		.data = &pmic_mt6323,
-+	}, {
- 		.compatible = "mediatek,mt6397",
- 		.data = &pmic_mt6397,
- 	}, {
diff --git a/target/linux/mediatek/patches-4.4/0041-soc-mediatek-PMIC-wrap-add-MT2701-7623-support.patch b/target/linux/mediatek/patches-4.4/0041-soc-mediatek-PMIC-wrap-add-MT2701-7623-support.patch
deleted file mode 100644
index a50a34a..0000000
--- a/target/linux/mediatek/patches-4.4/0041-soc-mediatek-PMIC-wrap-add-MT2701-7623-support.patch
+++ /dev/null
@@ -1,232 +0,0 @@
-From 7736d97fe2c6c71c9009a1b45a94de06bfc94a37 Mon Sep 17 00:00:00 2001
-From: John Crispin <blogic at openwrt.org>
-Date: Wed, 20 Jan 2016 12:09:14 +0100
-Subject: [PATCH 041/102] soc: mediatek: PMIC wrap: add MT2701/7623 support
-
-Add the registers, callbacks and data structures required to make the
-wrapper work on MT2701 and MT7623.
-
-Signed-off-by: John Crispin <blogic at openwrt.org>
----
- drivers/soc/mediatek/mtk-pmic-wrap.c |  154 ++++++++++++++++++++++++++++++++++
- 1 file changed, 154 insertions(+)
-
---- a/drivers/soc/mediatek/mtk-pmic-wrap.c
-+++ b/drivers/soc/mediatek/mtk-pmic-wrap.c
-@@ -52,6 +52,7 @@
- #define PWRAP_DEW_WRITE_TEST_VAL	0xa55a
- 
- /* macro for manual command */
-+#define PWRAP_MAN_CMD_SPI_WRITE_NEW	(1 << 14)
- #define PWRAP_MAN_CMD_SPI_WRITE		(1 << 13)
- #define PWRAP_MAN_CMD_OP_CSH		(0x0 << 8)
- #define PWRAP_MAN_CMD_OP_CSL		(0x1 << 8)
-@@ -200,6 +201,13 @@ enum pwrap_regs {
- 	PWRAP_DCM_EN,
- 	PWRAP_DCM_DBC_PRD,
- 
-+	/* MT2701 only regs */
-+	PWRAP_ADC_CMD_ADDR,
-+	PWRAP_PWRAP_ADC_CMD,
-+	PWRAP_ADC_RDY_ADDR,
-+	PWRAP_ADC_RDATA_ADDR1,
-+	PWRAP_ADC_RDATA_ADDR2,
-+
- 	/* MT8135 only regs */
- 	PWRAP_CSHEXT,
- 	PWRAP_EVENT_IN_EN,
-@@ -236,6 +244,92 @@ enum pwrap_regs {
- 	PWRAP_CIPHER_EN,
- };
- 
-+static int mt2701_regs[] = {
-+	[PWRAP_MUX_SEL] =		0x0,
-+	[PWRAP_WRAP_EN] =		0x4,
-+	[PWRAP_DIO_EN] =		0x8,
-+	[PWRAP_SIDLY] =			0xc,
-+	[PWRAP_RDDMY] =			0x18,
-+	[PWRAP_SI_CK_CON] =		0x1c,
-+	[PWRAP_CSHEXT_WRITE] =		0x20,
-+	[PWRAP_CSHEXT_READ] =		0x24,
-+	[PWRAP_CSLEXT_START] =		0x28,
-+	[PWRAP_CSLEXT_END] =		0x2c,
-+	[PWRAP_STAUPD_PRD] =		0x30,
-+	[PWRAP_STAUPD_GRPEN] =		0x34,
-+	[PWRAP_STAUPD_MAN_TRIG] =	0x38,
-+	[PWRAP_STAUPD_STA] =		0x3c,
-+	[PWRAP_WRAP_STA] =		0x44,
-+	[PWRAP_HARB_INIT] =		0x48,
-+	[PWRAP_HARB_HPRIO] =		0x4c,
-+	[PWRAP_HIPRIO_ARB_EN] =		0x50,
-+	[PWRAP_HARB_STA0] =		0x54,
-+	[PWRAP_HARB_STA1] =		0x58,
-+	[PWRAP_MAN_EN] =		0x5c,
-+	[PWRAP_MAN_CMD] =		0x60,
-+	[PWRAP_MAN_RDATA] =		0x64,
-+	[PWRAP_MAN_VLDCLR] =		0x68,
-+	[PWRAP_WACS0_EN] =		0x6c,
-+	[PWRAP_INIT_DONE0] =		0x70,
-+	[PWRAP_WACS0_CMD] =		0x74,
-+	[PWRAP_WACS0_RDATA] =		0x78,
-+	[PWRAP_WACS0_VLDCLR] =		0x7c,
-+	[PWRAP_WACS1_EN] =		0x80,
-+	[PWRAP_INIT_DONE1] =		0x84,
-+	[PWRAP_WACS1_CMD] =		0x88,
-+	[PWRAP_WACS1_RDATA] =		0x8c,
-+	[PWRAP_WACS1_VLDCLR] =		0x90,
-+	[PWRAP_WACS2_EN] =		0x94,
-+	[PWRAP_INIT_DONE2] =		0x98,
-+	[PWRAP_WACS2_CMD] =		0x9c,
-+	[PWRAP_WACS2_RDATA] =		0xa0,
-+	[PWRAP_WACS2_VLDCLR] =		0xa4,
-+	[PWRAP_INT_EN] =		0xa8,
-+	[PWRAP_INT_FLG_RAW] =		0xac,
-+	[PWRAP_INT_FLG] =		0xb0,
-+	[PWRAP_INT_CLR] =		0xb4,
-+	[PWRAP_SIG_ADR] =		0xb8,
-+	[PWRAP_SIG_MODE] =		0xbc,
-+	[PWRAP_SIG_VALUE] =		0xc0,
-+	[PWRAP_SIG_ERRVAL] =		0xc4,
-+	[PWRAP_CRC_EN] =		0xc8,
-+	[PWRAP_TIMER_EN] =		0xcc,
-+	[PWRAP_TIMER_STA] =		0xd0,
-+	[PWRAP_WDT_UNIT] =		0xd4,
-+	[PWRAP_WDT_SRC_EN] =		0xd8,
-+	[PWRAP_WDT_FLG] =		0xdc,
-+	[PWRAP_DEBUG_INT_SEL] =		0xe0,
-+	[PWRAP_DVFS_ADR0] =		0xe4,
-+	[PWRAP_DVFS_WDATA0] =		0xe8,
-+	[PWRAP_DVFS_ADR1] =		0xec,
-+	[PWRAP_DVFS_WDATA1] =		0xf0,
-+	[PWRAP_DVFS_ADR2] =		0xf4,
-+	[PWRAP_DVFS_WDATA2] =		0xf8,
-+	[PWRAP_DVFS_ADR3] =		0xfc,
-+	[PWRAP_DVFS_WDATA3] =		0x100,
-+	[PWRAP_DVFS_ADR4] =		0x104,
-+	[PWRAP_DVFS_WDATA4] =		0x108,
-+	[PWRAP_DVFS_ADR5] =		0x10c,
-+	[PWRAP_DVFS_WDATA5] =		0x110,
-+	[PWRAP_DVFS_ADR6] =		0x114,
-+	[PWRAP_DVFS_WDATA6] =		0x118,
-+	[PWRAP_DVFS_ADR7] =		0x11c,
-+	[PWRAP_DVFS_WDATA7] =		0x120,
-+	[PWRAP_CIPHER_KEY_SEL] =	0x124,
-+	[PWRAP_CIPHER_IV_SEL] =		0x128,
-+	[PWRAP_CIPHER_EN] =		0x12c,
-+	[PWRAP_CIPHER_RDY] =		0x130,
-+	[PWRAP_CIPHER_MODE] =		0x134,
-+	[PWRAP_CIPHER_SWRST] =		0x138,
-+	[PWRAP_DCM_EN] =		0x13c,
-+	[PWRAP_DCM_DBC_PRD] =		0x140,
-+	[PWRAP_ADC_CMD_ADDR] =		0x144,
-+	[PWRAP_PWRAP_ADC_CMD] =		0x148,
-+	[PWRAP_ADC_RDY_ADDR] =		0x14c,
-+	[PWRAP_ADC_RDATA_ADDR1] =	0x150,
-+	[PWRAP_ADC_RDATA_ADDR2] =	0x154,
-+};
-+
- static int mt8173_regs[] = {
- 	[PWRAP_MUX_SEL] =		0x0,
- 	[PWRAP_WRAP_EN] =		0x4,
-@@ -397,6 +491,7 @@ enum pmic_type {
- };
- 
- enum pwrap_type {
-+	PWRAP_MT2701,
- 	PWRAP_MT8135,
- 	PWRAP_MT8173,
- };
-@@ -637,6 +732,31 @@ static int pwrap_mt8173_init_reg_clock(s
- 	return 0;
- }
- 
-+static int pwrap_mt2701_init_reg_clock(struct pmic_wrapper *wrp)
-+{
-+	switch (wrp->slave->type) {
-+	case PMIC_MT6397:
-+		pwrap_writel(wrp, 0xc, PWRAP_RDDMY);
-+		pwrap_writel(wrp, 0x4, PWRAP_CSHEXT_WRITE);
-+		pwrap_writel(wrp, 0x0, PWRAP_CSHEXT_READ);
-+		pwrap_writel(wrp, 0x2, PWRAP_CSLEXT_START);
-+		pwrap_writel(wrp, 0x2, PWRAP_CSLEXT_END);
-+		break;
-+
-+	case PMIC_MT6323:
-+		pwrap_writel(wrp, 0x8, PWRAP_RDDMY);
-+		pwrap_write(wrp, wrp->slave->dew_regs[PWRAP_DEW_RDDMY_NO],
-+			    0x8);
-+		pwrap_writel(wrp, 0x5, PWRAP_CSHEXT_WRITE);
-+		pwrap_writel(wrp, 0x0, PWRAP_CSHEXT_READ);
-+		pwrap_writel(wrp, 0x2, PWRAP_CSLEXT_START);
-+		pwrap_writel(wrp, 0x2, PWRAP_CSLEXT_END);
-+		break;
-+	}
-+
-+	return 0;
-+}
-+
- static bool pwrap_is_cipher_ready(struct pmic_wrapper *wrp)
- {
- 	return pwrap_readl(wrp, PWRAP_CIPHER_RDY) & 1;
-@@ -670,6 +790,7 @@ static int pwrap_init_cipher(struct pmic
- 		pwrap_writel(wrp, 1, PWRAP_CIPHER_LOAD);
- 		pwrap_writel(wrp, 1, PWRAP_CIPHER_START);
- 		break;
-+	case PWRAP_MT2701:
- 	case PWRAP_MT8173:
- 		pwrap_writel(wrp, 1, PWRAP_CIPHER_EN);
- 		break;
-@@ -772,6 +893,24 @@ static int pwrap_mt8173_init_soc_specifi
- 	return 0;
- }
- 
-+static int pwrap_mt2701_init_soc_specific(struct pmic_wrapper *wrp)
-+{
-+	/* GPS_INTF initialization */
-+	switch (wrp->slave->type) {
-+	case PMIC_MT6323:
-+		pwrap_writel(wrp, 0x076c, PWRAP_ADC_CMD_ADDR);
-+		pwrap_writel(wrp, 0x8000, PWRAP_PWRAP_ADC_CMD);
-+		pwrap_writel(wrp, 0x072c, PWRAP_ADC_RDY_ADDR);
-+		pwrap_writel(wrp, 0x072e, PWRAP_ADC_RDATA_ADDR1);
-+		pwrap_writel(wrp, 0x0730, PWRAP_ADC_RDATA_ADDR2);
-+		break;
-+	default:
-+		break;
-+	}
-+
-+	return 0;
-+}
-+
- static int pwrap_init(struct pmic_wrapper *wrp)
- {
- 	int ret;
-@@ -916,6 +1055,18 @@ static const struct of_device_id of_slav
- };
- MODULE_DEVICE_TABLE(of, of_slave_match_tbl);
- 
-+static const struct pmic_wrapper_type pwrap_mt2701 = {
-+	.regs = mt2701_regs,
-+	.type = PWRAP_MT2701,
-+	.arb_en_all = 0x3f,
-+	.int_en_all = ~(BIT(31) | BIT(2)),
-+	.spi_w = PWRAP_MAN_CMD_SPI_WRITE_NEW,
-+	.wdt_src = PWRAP_WDT_SRC_MASK_ALL,
-+	.has_bridge = 0,
-+	.init_reg_clock = pwrap_mt2701_init_reg_clock,
-+	.init_soc_specific = pwrap_mt2701_init_soc_specific,
-+};
-+
- static struct pmic_wrapper_type pwrap_mt8135 = {
- 	.regs = mt8135_regs,
- 	.type = PWRAP_MT8135,
-@@ -942,6 +1093,9 @@ static struct pmic_wrapper_type pwrap_mt
- 
- static struct of_device_id of_pwrap_match_tbl[] = {
- 	{
-+		.compatible = "mediatek,mt2701-pwrap",
-+		.data = &pwrap_mt2701,
-+	}, {
- 		.compatible = "mediatek,mt8135-pwrap",
- 		.data = &pwrap_mt8135,
- 	}, {
diff --git a/target/linux/mediatek/patches-4.4/0042-dt-bindings-mfd-Add-bindings-for-the-MediaTek-MT6323.patch b/target/linux/mediatek/patches-4.4/0042-dt-bindings-mfd-Add-bindings-for-the-MediaTek-MT6323.patch
deleted file mode 100644
index 701ee67..0000000
--- a/target/linux/mediatek/patches-4.4/0042-dt-bindings-mfd-Add-bindings-for-the-MediaTek-MT6323.patch
+++ /dev/null
@@ -1,50 +0,0 @@
-From c14dc2993a272c706650502ec579ceabe5f2355e Mon Sep 17 00:00:00 2001
-From: John Crispin <blogic at openwrt.org>
-Date: Sun, 10 Jan 2016 17:12:37 +0100
-Subject: [PATCH 042/102] dt-bindings: mfd: Add bindings for the MediaTek
- MT6323 PMIC
-
-Signed-off-by: John Crispin <blogic at openwrt.org>
-Acked-by: Rob Herring <robh at kernel.org>
-Cc: devicetree at vger.kernel.org
----
- Documentation/devicetree/bindings/mfd/mt6397.txt |   10 ++++++----
- 1 file changed, 6 insertions(+), 4 deletions(-)
-
---- a/Documentation/devicetree/bindings/mfd/mt6397.txt
-+++ b/Documentation/devicetree/bindings/mfd/mt6397.txt
-@@ -1,6 +1,6 @@
--MediaTek MT6397 Multifunction Device Driver
-+MediaTek MT6397/MT6323 Multifunction Device Driver
- 
--MT6397 is a multifunction device with the following sub modules:
-+MT6397/MT6323 is a multifunction device with the following sub modules:
- - Regulator
- - RTC
- - Audio codec
-@@ -8,14 +8,14 @@ MT6397 is a multifunction device with th
- - Clock
- 
- It is interfaced to host controller using SPI interface by a proprietary hardware
--called PMIC wrapper or pwrap. MT6397 MFD is a child device of pwrap.
-+called PMIC wrapper or pwrap. MT6397/MT6323 MFD is a child device of pwrap.
- See the following for pwarp node definitions:
- Documentation/devicetree/bindings/soc/pwrap.txt
- 
- This document describes the binding for MFD device and its sub module.
- 
- Required properties:
--compatible: "mediatek,mt6397"
-+compatible: "mediatek,mt6397" or "mediatek,mt6323"
- 
- Optional subnodes:
- 
-@@ -26,6 +26,8 @@ Optional subnodes:
- 	Required properties:
- 		- compatible: "mediatek,mt6397-regulator"
- 	see Documentation/devicetree/bindings/regulator/mt6397-regulator.txt
-+		- compatible: "mediatek,mt6323-regulator"
-+	see Documentation/devicetree/bindings/regulator/mt6323-regulator.txt
- - codec
- 	Required properties:
- 		- compatible: "mediatek,mt6397-codec"
diff --git a/target/linux/mediatek/patches-4.4/0043-mfd-mt6397-int_con-and-int_status-may-vary-in-locati.patch b/target/linux/mediatek/patches-4.4/0043-mfd-mt6397-int_con-and-int_status-may-vary-in-locati.patch
deleted file mode 100644
index 6b433b0..0000000
--- a/target/linux/mediatek/patches-4.4/0043-mfd-mt6397-int_con-and-int_status-may-vary-in-locati.patch
+++ /dev/null
@@ -1,97 +0,0 @@
-From 8269ed007349714e9ef0e3408a68159d763145dd Mon Sep 17 00:00:00 2001
-From: John Crispin <blogic at openwrt.org>
-Date: Fri, 8 Jan 2016 08:33:17 +0100
-Subject: [PATCH 043/102] mfd: mt6397: int_con and int_status may vary in
- location
-
-MT6323 has the INT_CON and INT_STATUS located at a different position.
-Make the registers locations configurable.
-
-Signed-off-by: John Crispin <blogic at openwrt.org>
----
- drivers/mfd/mt6397-core.c       |   27 +++++++++++++++++----------
- include/linux/mfd/mt6397/core.h |    2 ++
- 2 files changed, 19 insertions(+), 10 deletions(-)
-
---- a/drivers/mfd/mt6397-core.c
-+++ b/drivers/mfd/mt6397-core.c
-@@ -69,8 +69,10 @@ static void mt6397_irq_sync_unlock(struc
- {
- 	struct mt6397_chip *mt6397 = irq_data_get_irq_chip_data(data);
- 
--	regmap_write(mt6397->regmap, MT6397_INT_CON0, mt6397->irq_masks_cur[0]);
--	regmap_write(mt6397->regmap, MT6397_INT_CON1, mt6397->irq_masks_cur[1]);
-+	regmap_write(mt6397->regmap, mt6397->int_con[0],
-+		     mt6397->irq_masks_cur[0]);
-+	regmap_write(mt6397->regmap, mt6397->int_con[1],
-+		     mt6397->irq_masks_cur[1]);
- 
- 	mutex_unlock(&mt6397->irqlock);
- }
-@@ -147,8 +149,8 @@ static irqreturn_t mt6397_irq_thread(int
- {
- 	struct mt6397_chip *mt6397 = data;
- 
--	mt6397_irq_handle_reg(mt6397, MT6397_INT_STATUS0, 0);
--	mt6397_irq_handle_reg(mt6397, MT6397_INT_STATUS1, 16);
-+	mt6397_irq_handle_reg(mt6397, mt6397->int_status[0], 0);
-+	mt6397_irq_handle_reg(mt6397, mt6397->int_status[1], 16);
- 
- 	return IRQ_HANDLED;
- }
-@@ -177,8 +179,8 @@ static int mt6397_irq_init(struct mt6397
- 	mutex_init(&mt6397->irqlock);
- 
- 	/* Mask all interrupt sources */
--	regmap_write(mt6397->regmap, MT6397_INT_CON0, 0x0);
--	regmap_write(mt6397->regmap, MT6397_INT_CON1, 0x0);
-+	regmap_write(mt6397->regmap, mt6397->int_con[0], 0x0);
-+	regmap_write(mt6397->regmap, mt6397->int_con[1], 0x0);
- 
- 	mt6397->irq_domain = irq_domain_add_linear(mt6397->dev->of_node,
- 		MT6397_IRQ_NR, &mt6397_irq_domain_ops, mt6397);
-@@ -203,8 +205,8 @@ static int mt6397_irq_suspend(struct dev
- {
- 	struct mt6397_chip *chip = dev_get_drvdata(dev);
- 
--	regmap_write(chip->regmap, MT6397_INT_CON0, chip->wake_mask[0]);
--	regmap_write(chip->regmap, MT6397_INT_CON1, chip->wake_mask[1]);
-+	regmap_write(chip->regmap, chip->int_con[0], chip->wake_mask[0]);
-+	regmap_write(chip->regmap, chip->int_con[1], chip->wake_mask[1]);
- 
- 	enable_irq_wake(chip->irq);
- 
-@@ -215,8 +217,8 @@ static int mt6397_irq_resume(struct devi
- {
- 	struct mt6397_chip *chip = dev_get_drvdata(dev);
- 
--	regmap_write(chip->regmap, MT6397_INT_CON0, chip->irq_masks_cur[0]);
--	regmap_write(chip->regmap, MT6397_INT_CON1, chip->irq_masks_cur[1]);
-+	regmap_write(chip->regmap, chip->int_con[0], chip->irq_masks_cur[0]);
-+	regmap_write(chip->regmap, chip->int_con[1], chip->irq_masks_cur[1]);
- 
- 	disable_irq_wake(chip->irq);
- 
-@@ -237,6 +239,11 @@ static int mt6397_probe(struct platform_
- 		return -ENOMEM;
- 
- 	mt6397->dev = &pdev->dev;
-+	mt6397->int_con[0] = MT6397_INT_CON0;
-+	mt6397->int_con[1] = MT6397_INT_CON1;
-+	mt6397->int_status[0] = MT6397_INT_STATUS0;
-+	mt6397->int_status[1] = MT6397_INT_STATUS1;
-+
- 	/*
- 	 * mt6397 MFD is child device of soc pmic wrapper.
- 	 * Regmap is set from its parent.
---- a/include/linux/mfd/mt6397/core.h
-+++ b/include/linux/mfd/mt6397/core.h
-@@ -60,6 +60,8 @@ struct mt6397_chip {
- 	u16 wake_mask[2];
- 	u16 irq_masks_cur[2];
- 	u16 irq_masks_cache[2];
-+	u16 int_con[2];
-+	u16 int_status[2];
- };
- 
- #endif /* __MFD_MT6397_CORE_H__ */
diff --git a/target/linux/mediatek/patches-4.4/0044-mfd-mt6397-add-support-for-different-Slave-types.patch b/target/linux/mediatek/patches-4.4/0044-mfd-mt6397-add-support-for-different-Slave-types.patch
deleted file mode 100644
index bae05fb..0000000
--- a/target/linux/mediatek/patches-4.4/0044-mfd-mt6397-add-support-for-different-Slave-types.patch
+++ /dev/null
@@ -1,100 +0,0 @@
-From c6c447480e51301faa2254c7316ab075e20c4b0c Mon Sep 17 00:00:00 2001
-From: John Crispin <blogic at openwrt.org>
-Date: Fri, 8 Jan 2016 08:41:52 +0100
-Subject: [PATCH 044/102] mfd: mt6397: add support for different Slave types
-
-Signed-off-by: John Crispin <blogic at openwrt.org>
----
- drivers/mfd/mt6397-core.c |   58 ++++++++++++++++++++++++++++++++-------------
- 1 file changed, 41 insertions(+), 17 deletions(-)
-
---- a/drivers/mfd/mt6397-core.c
-+++ b/drivers/mfd/mt6397-core.c
-@@ -24,6 +24,9 @@
- #define MT6397_RTC_BASE		0xe000
- #define MT6397_RTC_SIZE		0x3e
- 
-+#define MT6391_CID_CODE		0x91
-+#define MT6397_CID_CODE		0x97
-+
- static const struct resource mt6397_rtc_resources[] = {
- 	{
- 		.start = MT6397_RTC_BASE,
-@@ -232,39 +235,60 @@ static SIMPLE_DEV_PM_OPS(mt6397_pm_ops,
- static int mt6397_probe(struct platform_device *pdev)
- {
- 	int ret;
--	struct mt6397_chip *mt6397;
-+	unsigned int id;
-+	struct mt6397_chip *pmic;
- 
--	mt6397 = devm_kzalloc(&pdev->dev, sizeof(*mt6397), GFP_KERNEL);
--	if (!mt6397)
-+	pmic = devm_kzalloc(&pdev->dev, sizeof(*pmic), GFP_KERNEL);
-+	if (!pmic)
- 		return -ENOMEM;
- 
--	mt6397->dev = &pdev->dev;
--	mt6397->int_con[0] = MT6397_INT_CON0;
--	mt6397->int_con[1] = MT6397_INT_CON1;
--	mt6397->int_status[0] = MT6397_INT_STATUS0;
--	mt6397->int_status[1] = MT6397_INT_STATUS1;
-+	pmic->dev = &pdev->dev;
- 
- 	/*
- 	 * mt6397 MFD is child device of soc pmic wrapper.
- 	 * Regmap is set from its parent.
- 	 */
--	mt6397->regmap = dev_get_regmap(pdev->dev.parent, NULL);
--	if (!mt6397->regmap)
-+	pmic->regmap = dev_get_regmap(pdev->dev.parent, NULL);
-+	if (!pmic->regmap)
- 		return -ENODEV;
- 
--	platform_set_drvdata(pdev, mt6397);
-+	platform_set_drvdata(pdev, pmic);
-+
-+	ret = regmap_read(pmic->regmap, MT6397_CID, &id);
-+	if (ret) {
-+		dev_err(pmic->dev, "Failed to read chip id: %d\n", ret);
-+		goto fail_irq;
-+	}
-+
-+	switch (id & 0xff) {
-+	case MT6397_CID_CODE:
-+	case MT6391_CID_CODE:
-+		pmic->int_con[0] = MT6397_INT_CON0;
-+		pmic->int_con[1] = MT6397_INT_CON1;
-+		pmic->int_status[0] = MT6397_INT_STATUS0;
-+		pmic->int_status[1] = MT6397_INT_STATUS1;
-+		ret = mfd_add_devices(&pdev->dev, -1, mt6397_devs,
-+				ARRAY_SIZE(mt6397_devs), NULL, 0, NULL);
-+		break;
-+
-+	default:
-+		dev_err(&pdev->dev, "unsupported chip: %d\n", id);
-+		ret = -ENODEV;
-+		break;
-+	}
- 
--	mt6397->irq = platform_get_irq(pdev, 0);
--	if (mt6397->irq > 0) {
--		ret = mt6397_irq_init(mt6397);
-+	pmic->irq = platform_get_irq(pdev, 0);
-+	if (pmic->irq > 0) {
-+		ret = mt6397_irq_init(pmic);
- 		if (ret)
- 			return ret;
- 	}
- 
--	ret = mfd_add_devices(&pdev->dev, -1, mt6397_devs,
--			ARRAY_SIZE(mt6397_devs), NULL, 0, NULL);
--	if (ret)
-+fail_irq:
-+	if (ret) {
-+		irq_domain_remove(pmic->irq_domain);
- 		dev_err(&pdev->dev, "failed to add child devices: %d\n", ret);
-+	}
- 
- 	return ret;
- }
diff --git a/target/linux/mediatek/patches-4.4/0045-mfd-mt6397-add-MT6323-support-to-MT6397-driver.patch b/target/linux/mediatek/patches-4.4/0045-mfd-mt6397-add-MT6323-support-to-MT6397-driver.patch
deleted file mode 100644
index d673a0a..0000000
--- a/target/linux/mediatek/patches-4.4/0045-mfd-mt6397-add-MT6323-support-to-MT6397-driver.patch
+++ /dev/null
@@ -1,519 +0,0 @@
-From 0ae7153c9f00361c3e6dac9da0c2d994557953f5 Mon Sep 17 00:00:00 2001
-From: John Crispin <blogic at openwrt.org>
-Date: Fri, 8 Jan 2016 04:09:43 +0100
-Subject: [PATCH 045/102] mfd: mt6397: add MT6323 support to MT6397 driver
-
-Signed-off-by: John Crispin <blogic at openwrt.org>
----
- drivers/mfd/mt6397-core.c            |   20 ++
- include/linux/mfd/mt6323/core.h      |   36 +++
- include/linux/mfd/mt6323/registers.h |  408 ++++++++++++++++++++++++++++++++++
- 3 files changed, 464 insertions(+)
- create mode 100644 include/linux/mfd/mt6323/core.h
- create mode 100644 include/linux/mfd/mt6323/registers.h
-
---- a/drivers/mfd/mt6397-core.c
-+++ b/drivers/mfd/mt6397-core.c
-@@ -19,11 +19,14 @@
- #include <linux/regmap.h>
- #include <linux/mfd/core.h>
- #include <linux/mfd/mt6397/core.h>
-+#include <linux/mfd/mt6323/core.h>
- #include <linux/mfd/mt6397/registers.h>
-+#include <linux/mfd/mt6323/registers.h>
- 
- #define MT6397_RTC_BASE		0xe000
- #define MT6397_RTC_SIZE		0x3e
- 
-+#define MT6323_CID_CODE		0x23
- #define MT6391_CID_CODE		0x91
- #define MT6397_CID_CODE		0x97
- 
-@@ -40,6 +43,13 @@ static const struct resource mt6397_rtc_
- 	},
- };
- 
-+static const struct mfd_cell mt6323_devs[] = {
-+	{
-+		.name = "mt6323-regulator",
-+		.of_compatible = "mediatek,mt6323-regulator"
-+	},
-+};
-+
- static const struct mfd_cell mt6397_devs[] = {
- 	{
- 		.name = "mt6397-rtc",
-@@ -261,6 +271,15 @@ static int mt6397_probe(struct platform_
- 	}
- 
- 	switch (id & 0xff) {
-+	case MT6323_CID_CODE:
-+		pmic->int_con[0] = MT6323_INT_CON0;
-+		pmic->int_con[1] = MT6323_INT_CON1;
-+		pmic->int_status[0] = MT6323_INT_STATUS0;
-+		pmic->int_status[1] = MT6323_INT_STATUS1;
-+		ret = mfd_add_devices(&pdev->dev, -1, mt6323_devs,
-+				ARRAY_SIZE(mt6323_devs), NULL, 0, NULL);
-+		break;
-+
- 	case MT6397_CID_CODE:
- 	case MT6391_CID_CODE:
- 		pmic->int_con[0] = MT6397_INT_CON0;
-@@ -302,6 +321,7 @@ static int mt6397_remove(struct platform
- 
- static const struct of_device_id mt6397_of_match[] = {
- 	{ .compatible = "mediatek,mt6397" },
-+	{ .compatible = "mediatek,mt6323" },
- 	{ }
- };
- MODULE_DEVICE_TABLE(of, mt6397_of_match);
---- /dev/null
-+++ b/include/linux/mfd/mt6323/core.h
-@@ -0,0 +1,36 @@
-+/*
-+ * Copyright (c) 2016 Chen Zhong <chen.zhong at mediatek.com>
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 as
-+ * published by the Free Software Foundation.
-+ */
-+
-+#ifndef __MFD_MT6323_CORE_H__
-+#define __MFD_MT6323_CORE_H__
-+
-+enum MT6323_IRQ_STATUS_numbers {
-+	MT6323_IRQ_STATUS_SPKL_AB = 0,
-+	MT6323_IRQ_STATUS_SPKL,
-+	MT6323_IRQ_STATUS_BAT_L,
-+	MT6323_IRQ_STATUS_BAT_H,
-+	MT6323_IRQ_STATUS_WATCHDOG,
-+	MT6323_IRQ_STATUS_PWRKEY,
-+	MT6323_IRQ_STATUS_THR_L,
-+	MT6323_IRQ_STATUS_THR_H,
-+	MT6323_IRQ_STATUS_VBATON_UNDET,
-+	MT6323_IRQ_STATUS_BVALID_DET,
-+	MT6323_IRQ_STATUS_CHRDET,
-+	MT6323_IRQ_STATUS_OV,
-+	MT6323_IRQ_STATUS_LDO = 16,
-+	MT6323_IRQ_STATUS_FCHRKEY,
-+	MT6323_IRQ_STATUS_ACCDET,
-+	MT6323_IRQ_STATUS_AUDIO,
-+	MT6323_IRQ_STATUS_RTC,
-+	MT6323_IRQ_STATUS_VPROC,
-+	MT6323_IRQ_STATUS_VSYS,
-+	MT6323_IRQ_STATUS_VPA,
-+	MT6323_IRQ_STATUS_NR,
-+};
-+
-+#endif /* __MFD_MT6323_CORE_H__ */
---- /dev/null
-+++ b/include/linux/mfd/mt6323/registers.h
-@@ -0,0 +1,408 @@
-+/*
-+ * Copyright (c) 2016 Chen Zhong <chen.zhong at mediatek.com>
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 as
-+ * published by the Free Software Foundation.
-+ */
-+
-+#ifndef __MFD_MT6323_REGISTERS_H__
-+#define __MFD_MT6323_REGISTERS_H__
-+
-+/* PMIC Registers */
-+#define MT6323_CHR_CON0           0x0000
-+#define MT6323_CHR_CON1           0x0002
-+#define MT6323_CHR_CON2           0x0004
-+#define MT6323_CHR_CON3           0x0006
-+#define MT6323_CHR_CON4           0x0008
-+#define MT6323_CHR_CON5           0x000A
-+#define MT6323_CHR_CON6           0x000C
-+#define MT6323_CHR_CON7           0x000E
-+#define MT6323_CHR_CON8           0x0010
-+#define MT6323_CHR_CON9           0x0012
-+#define MT6323_CHR_CON10          0x0014
-+#define MT6323_CHR_CON11          0x0016
-+#define MT6323_CHR_CON12          0x0018
-+#define MT6323_CHR_CON13          0x001A
-+#define MT6323_CHR_CON14          0x001C
-+#define MT6323_CHR_CON15          0x001E
-+#define MT6323_CHR_CON16          0x0020
-+#define MT6323_CHR_CON17          0x0022
-+#define MT6323_CHR_CON18          0x0024
-+#define MT6323_CHR_CON19          0x0026
-+#define MT6323_CHR_CON20          0x0028
-+#define MT6323_CHR_CON21          0x002A
-+#define MT6323_CHR_CON22          0x002C
-+#define MT6323_CHR_CON23          0x002E
-+#define MT6323_CHR_CON24          0x0030
-+#define MT6323_CHR_CON25          0x0032
-+#define MT6323_CHR_CON26          0x0034
-+#define MT6323_CHR_CON27          0x0036
-+#define MT6323_CHR_CON28          0x0038
-+#define MT6323_CHR_CON29          0x003A
-+#define MT6323_STRUP_CON0         0x003C
-+#define MT6323_STRUP_CON2         0x003E
-+#define MT6323_STRUP_CON3         0x0040
-+#define MT6323_STRUP_CON4         0x0042
-+#define MT6323_STRUP_CON5         0x0044
-+#define MT6323_STRUP_CON6         0x0046
-+#define MT6323_STRUP_CON7         0x0048
-+#define MT6323_STRUP_CON8         0x004A
-+#define MT6323_STRUP_CON9         0x004C
-+#define MT6323_STRUP_CON10        0x004E
-+#define MT6323_STRUP_CON11        0x0050
-+#define MT6323_SPK_CON0           0x0052
-+#define MT6323_SPK_CON1           0x0054
-+#define MT6323_SPK_CON2           0x0056
-+#define MT6323_SPK_CON6           0x005E
-+#define MT6323_SPK_CON7           0x0060
-+#define MT6323_SPK_CON8           0x0062
-+#define MT6323_SPK_CON9           0x0064
-+#define MT6323_SPK_CON10          0x0066
-+#define MT6323_SPK_CON11          0x0068
-+#define MT6323_SPK_CON12          0x006A
-+#define MT6323_CID                0x0100
-+#define MT6323_TOP_CKPDN0         0x0102
-+#define MT6323_TOP_CKPDN0_SET     0x0104
-+#define MT6323_TOP_CKPDN0_CLR     0x0106
-+#define MT6323_TOP_CKPDN1         0x0108
-+#define MT6323_TOP_CKPDN1_SET     0x010A
-+#define MT6323_TOP_CKPDN1_CLR     0x010C
-+#define MT6323_TOP_CKPDN2         0x010E
-+#define MT6323_TOP_CKPDN2_SET     0x0110
-+#define MT6323_TOP_CKPDN2_CLR     0x0112
-+#define MT6323_TOP_RST_CON        0x0114
-+#define MT6323_TOP_RST_CON_SET    0x0116
-+#define MT6323_TOP_RST_CON_CLR    0x0118
-+#define MT6323_TOP_RST_MISC       0x011A
-+#define MT6323_TOP_RST_MISC_SET   0x011C
-+#define MT6323_TOP_RST_MISC_CLR   0x011E
-+#define MT6323_TOP_CKCON0         0x0120
-+#define MT6323_TOP_CKCON0_SET     0x0122
-+#define MT6323_TOP_CKCON0_CLR     0x0124
-+#define MT6323_TOP_CKCON1         0x0126
-+#define MT6323_TOP_CKCON1_SET     0x0128
-+#define MT6323_TOP_CKCON1_CLR     0x012A
-+#define MT6323_TOP_CKTST0         0x012C
-+#define MT6323_TOP_CKTST1         0x012E
-+#define MT6323_TOP_CKTST2         0x0130
-+#define MT6323_TEST_OUT           0x0132
-+#define MT6323_TEST_CON0          0x0134
-+#define MT6323_TEST_CON1          0x0136
-+#define MT6323_EN_STATUS0         0x0138
-+#define MT6323_EN_STATUS1         0x013A
-+#define MT6323_OCSTATUS0          0x013C
-+#define MT6323_OCSTATUS1          0x013E
-+#define MT6323_PGSTATUS           0x0140
-+#define MT6323_CHRSTATUS          0x0142
-+#define MT6323_TDSEL_CON          0x0144
-+#define MT6323_RDSEL_CON          0x0146
-+#define MT6323_SMT_CON0           0x0148
-+#define MT6323_SMT_CON1           0x014A
-+#define MT6323_SMT_CON2           0x014C
-+#define MT6323_SMT_CON3           0x014E
-+#define MT6323_SMT_CON4           0x0150
-+#define MT6323_DRV_CON0           0x0152
-+#define MT6323_DRV_CON1           0x0154
-+#define MT6323_DRV_CON2           0x0156
-+#define MT6323_DRV_CON3           0x0158
-+#define MT6323_DRV_CON4           0x015A
-+#define MT6323_SIMLS1_CON         0x015C
-+#define MT6323_SIMLS2_CON         0x015E
-+#define MT6323_INT_CON0           0x0160
-+#define MT6323_INT_CON0_SET       0x0162
-+#define MT6323_INT_CON0_CLR       0x0164
-+#define MT6323_INT_CON1           0x0166
-+#define MT6323_INT_CON1_SET       0x0168
-+#define MT6323_INT_CON1_CLR       0x016A
-+#define MT6323_INT_MISC_CON       0x016C
-+#define MT6323_INT_MISC_CON_SET   0x016E
-+#define MT6323_INT_MISC_CON_CLR   0x0170
-+#define MT6323_INT_STATUS0        0x0172
-+#define MT6323_INT_STATUS1        0x0174
-+#define MT6323_OC_GEAR_0          0x0176
-+#define MT6323_OC_GEAR_1          0x0178
-+#define MT6323_OC_GEAR_2          0x017A
-+#define MT6323_OC_CTL_VPROC       0x017C
-+#define MT6323_OC_CTL_VSYS        0x017E
-+#define MT6323_OC_CTL_VPA         0x0180
-+#define MT6323_FQMTR_CON0         0x0182
-+#define MT6323_FQMTR_CON1         0x0184
-+#define MT6323_FQMTR_CON2         0x0186
-+#define MT6323_RG_SPI_CON         0x0188
-+#define MT6323_DEW_DIO_EN         0x018A
-+#define MT6323_DEW_READ_TEST      0x018C
-+#define MT6323_DEW_WRITE_TEST     0x018E
-+#define MT6323_DEW_CRC_SWRST      0x0190
-+#define MT6323_DEW_CRC_EN         0x0192
-+#define MT6323_DEW_CRC_VAL        0x0194
-+#define MT6323_DEW_DBG_MON_SEL    0x0196
-+#define MT6323_DEW_CIPHER_KEY_SEL 0x0198
-+#define MT6323_DEW_CIPHER_IV_SEL  0x019A
-+#define MT6323_DEW_CIPHER_EN      0x019C
-+#define MT6323_DEW_CIPHER_RDY     0x019E
-+#define MT6323_DEW_CIPHER_MODE    0x01A0
-+#define MT6323_DEW_CIPHER_SWRST   0x01A2
-+#define MT6323_DEW_RDDMY_NO       0x01A4
-+#define MT6323_DEW_RDATA_DLY_SEL  0x01A6
-+#define MT6323_BUCK_CON0          0x0200
-+#define MT6323_BUCK_CON1          0x0202
-+#define MT6323_BUCK_CON2          0x0204
-+#define MT6323_BUCK_CON3          0x0206
-+#define MT6323_BUCK_CON4          0x0208
-+#define MT6323_BUCK_CON5          0x020A
-+#define MT6323_VPROC_CON0         0x020C
-+#define MT6323_VPROC_CON1         0x020E
-+#define MT6323_VPROC_CON2         0x0210
-+#define MT6323_VPROC_CON3         0x0212
-+#define MT6323_VPROC_CON4         0x0214
-+#define MT6323_VPROC_CON5         0x0216
-+#define MT6323_VPROC_CON7         0x021A
-+#define MT6323_VPROC_CON8         0x021C
-+#define MT6323_VPROC_CON9         0x021E
-+#define MT6323_VPROC_CON10        0x0220
-+#define MT6323_VPROC_CON11        0x0222
-+#define MT6323_VPROC_CON12        0x0224
-+#define MT6323_VPROC_CON13        0x0226
-+#define MT6323_VPROC_CON14        0x0228
-+#define MT6323_VPROC_CON15        0x022A
-+#define MT6323_VPROC_CON18        0x0230
-+#define MT6323_VSYS_CON0          0x0232
-+#define MT6323_VSYS_CON1          0x0234
-+#define MT6323_VSYS_CON2          0x0236
-+#define MT6323_VSYS_CON3          0x0238
-+#define MT6323_VSYS_CON4          0x023A
-+#define MT6323_VSYS_CON5          0x023C
-+#define MT6323_VSYS_CON7          0x0240
-+#define MT6323_VSYS_CON8          0x0242
-+#define MT6323_VSYS_CON9          0x0244
-+#define MT6323_VSYS_CON10         0x0246
-+#define MT6323_VSYS_CON11         0x0248
-+#define MT6323_VSYS_CON12         0x024A
-+#define MT6323_VSYS_CON13         0x024C
-+#define MT6323_VSYS_CON14         0x024E
-+#define MT6323_VSYS_CON15         0x0250
-+#define MT6323_VSYS_CON18         0x0256
-+#define MT6323_VPA_CON0           0x0300
-+#define MT6323_VPA_CON1           0x0302
-+#define MT6323_VPA_CON2           0x0304
-+#define MT6323_VPA_CON3           0x0306
-+#define MT6323_VPA_CON4           0x0308
-+#define MT6323_VPA_CON5           0x030A
-+#define MT6323_VPA_CON7           0x030E
-+#define MT6323_VPA_CON8           0x0310
-+#define MT6323_VPA_CON9           0x0312
-+#define MT6323_VPA_CON10          0x0314
-+#define MT6323_VPA_CON11          0x0316
-+#define MT6323_VPA_CON12          0x0318
-+#define MT6323_VPA_CON14          0x031C
-+#define MT6323_VPA_CON16          0x0320
-+#define MT6323_VPA_CON17          0x0322
-+#define MT6323_VPA_CON18          0x0324
-+#define MT6323_VPA_CON19          0x0326
-+#define MT6323_VPA_CON20          0x0328
-+#define MT6323_BUCK_K_CON0        0x032A
-+#define MT6323_BUCK_K_CON1        0x032C
-+#define MT6323_BUCK_K_CON2        0x032E
-+#define MT6323_ISINK0_CON0        0x0330
-+#define MT6323_ISINK0_CON1        0x0332
-+#define MT6323_ISINK0_CON2        0x0334
-+#define MT6323_ISINK0_CON3        0x0336
-+#define MT6323_ISINK1_CON0        0x0338
-+#define MT6323_ISINK1_CON1        0x033A
-+#define MT6323_ISINK1_CON2        0x033C
-+#define MT6323_ISINK1_CON3        0x033E
-+#define MT6323_ISINK2_CON0        0x0340
-+#define MT6323_ISINK2_CON1        0x0342
-+#define MT6323_ISINK2_CON2        0x0344
-+#define MT6323_ISINK2_CON3        0x0346
-+#define MT6323_ISINK3_CON0        0x0348
-+#define MT6323_ISINK3_CON1        0x034A
-+#define MT6323_ISINK3_CON2        0x034C
-+#define MT6323_ISINK3_CON3        0x034E
-+#define MT6323_ISINK_ANA0         0x0350
-+#define MT6323_ISINK_ANA1         0x0352
-+#define MT6323_ISINK_PHASE_DLY    0x0354
-+#define MT6323_ISINK_EN_CTRL      0x0356
-+#define MT6323_ANALDO_CON0        0x0400
-+#define MT6323_ANALDO_CON1        0x0402
-+#define MT6323_ANALDO_CON2        0x0404
-+#define MT6323_ANALDO_CON3        0x0406
-+#define MT6323_ANALDO_CON4        0x0408
-+#define MT6323_ANALDO_CON5        0x040A
-+#define MT6323_ANALDO_CON6        0x040C
-+#define MT6323_ANALDO_CON7        0x040E
-+#define MT6323_ANALDO_CON8        0x0410
-+#define MT6323_ANALDO_CON10       0x0412
-+#define MT6323_ANALDO_CON15       0x0414
-+#define MT6323_ANALDO_CON16       0x0416
-+#define MT6323_ANALDO_CON17       0x0418
-+#define MT6323_ANALDO_CON18       0x041A
-+#define MT6323_ANALDO_CON19       0x041C
-+#define MT6323_ANALDO_CON20       0x041E
-+#define MT6323_ANALDO_CON21       0x0420
-+#define MT6323_DIGLDO_CON0        0x0500
-+#define MT6323_DIGLDO_CON2        0x0502
-+#define MT6323_DIGLDO_CON3        0x0504
-+#define MT6323_DIGLDO_CON5        0x0506
-+#define MT6323_DIGLDO_CON6        0x0508
-+#define MT6323_DIGLDO_CON7        0x050A
-+#define MT6323_DIGLDO_CON8        0x050C
-+#define MT6323_DIGLDO_CON9        0x050E
-+#define MT6323_DIGLDO_CON10       0x0510
-+#define MT6323_DIGLDO_CON11       0x0512
-+#define MT6323_DIGLDO_CON12       0x0514
-+#define MT6323_DIGLDO_CON13       0x0516
-+#define MT6323_DIGLDO_CON14       0x0518
-+#define MT6323_DIGLDO_CON15       0x051A
-+#define MT6323_DIGLDO_CON16       0x051C
-+#define MT6323_DIGLDO_CON17       0x051E
-+#define MT6323_DIGLDO_CON18       0x0520
-+#define MT6323_DIGLDO_CON19       0x0522
-+#define MT6323_DIGLDO_CON20       0x0524
-+#define MT6323_DIGLDO_CON21       0x0526
-+#define MT6323_DIGLDO_CON23       0x0528
-+#define MT6323_DIGLDO_CON24       0x052A
-+#define MT6323_DIGLDO_CON26       0x052C
-+#define MT6323_DIGLDO_CON27       0x052E
-+#define MT6323_DIGLDO_CON28       0x0530
-+#define MT6323_DIGLDO_CON29       0x0532
-+#define MT6323_DIGLDO_CON30       0x0534
-+#define MT6323_DIGLDO_CON31       0x0536
-+#define MT6323_DIGLDO_CON32       0x0538
-+#define MT6323_DIGLDO_CON33       0x053A
-+#define MT6323_DIGLDO_CON34       0x053C
-+#define MT6323_DIGLDO_CON35       0x053E
-+#define MT6323_DIGLDO_CON36       0x0540
-+#define MT6323_DIGLDO_CON39       0x0542
-+#define MT6323_DIGLDO_CON40       0x0544
-+#define MT6323_DIGLDO_CON41       0x0546
-+#define MT6323_DIGLDO_CON42       0x0548
-+#define MT6323_DIGLDO_CON43       0x054A
-+#define MT6323_DIGLDO_CON44       0x054C
-+#define MT6323_DIGLDO_CON45       0x054E
-+#define MT6323_DIGLDO_CON46       0x0550
-+#define MT6323_DIGLDO_CON47       0x0552
-+#define MT6323_DIGLDO_CON48       0x0554
-+#define MT6323_DIGLDO_CON49       0x0556
-+#define MT6323_DIGLDO_CON50       0x0558
-+#define MT6323_DIGLDO_CON51       0x055A
-+#define MT6323_DIGLDO_CON52       0x055C
-+#define MT6323_DIGLDO_CON53       0x055E
-+#define MT6323_DIGLDO_CON54       0x0560
-+#define MT6323_EFUSE_CON0         0x0600
-+#define MT6323_EFUSE_CON1         0x0602
-+#define MT6323_EFUSE_CON2         0x0604
-+#define MT6323_EFUSE_CON3         0x0606
-+#define MT6323_EFUSE_CON4         0x0608
-+#define MT6323_EFUSE_CON5         0x060A
-+#define MT6323_EFUSE_CON6         0x060C
-+#define MT6323_EFUSE_VAL_0_15     0x060E
-+#define MT6323_EFUSE_VAL_16_31    0x0610
-+#define MT6323_EFUSE_VAL_32_47    0x0612
-+#define MT6323_EFUSE_VAL_48_63    0x0614
-+#define MT6323_EFUSE_VAL_64_79    0x0616
-+#define MT6323_EFUSE_VAL_80_95    0x0618
-+#define MT6323_EFUSE_VAL_96_111   0x061A
-+#define MT6323_EFUSE_VAL_112_127  0x061C
-+#define MT6323_EFUSE_VAL_128_143  0x061E
-+#define MT6323_EFUSE_VAL_144_159  0x0620
-+#define MT6323_EFUSE_VAL_160_175  0x0622
-+#define MT6323_EFUSE_VAL_176_191  0x0624
-+#define MT6323_EFUSE_DOUT_0_15    0x0626
-+#define MT6323_EFUSE_DOUT_16_31   0x0628
-+#define MT6323_EFUSE_DOUT_32_47   0x062A
-+#define MT6323_EFUSE_DOUT_48_63   0x062C
-+#define MT6323_EFUSE_DOUT_64_79   0x062E
-+#define MT6323_EFUSE_DOUT_80_95   0x0630
-+#define MT6323_EFUSE_DOUT_96_111  0x0632
-+#define MT6323_EFUSE_DOUT_112_127 0x0634
-+#define MT6323_EFUSE_DOUT_128_143 0x0636
-+#define MT6323_EFUSE_DOUT_144_159 0x0638
-+#define MT6323_EFUSE_DOUT_160_175 0x063A
-+#define MT6323_EFUSE_DOUT_176_191 0x063C
-+#define MT6323_EFUSE_CON7         0x063E
-+#define MT6323_EFUSE_CON8         0x0640
-+#define MT6323_EFUSE_CON9         0x0642
-+#define MT6323_RTC_MIX_CON0       0x0644
-+#define MT6323_RTC_MIX_CON1       0x0646
-+#define MT6323_AUDTOP_CON0        0x0700
-+#define MT6323_AUDTOP_CON1        0x0702
-+#define MT6323_AUDTOP_CON2        0x0704
-+#define MT6323_AUDTOP_CON3        0x0706
-+#define MT6323_AUDTOP_CON4        0x0708
-+#define MT6323_AUDTOP_CON5        0x070A
-+#define MT6323_AUDTOP_CON6        0x070C
-+#define MT6323_AUDTOP_CON7        0x070E
-+#define MT6323_AUDTOP_CON8        0x0710
-+#define MT6323_AUDTOP_CON9        0x0712
-+#define MT6323_AUXADC_ADC0        0x0714
-+#define MT6323_AUXADC_ADC1        0x0716
-+#define MT6323_AUXADC_ADC2        0x0718
-+#define MT6323_AUXADC_ADC3        0x071A
-+#define MT6323_AUXADC_ADC4        0x071C
-+#define MT6323_AUXADC_ADC5        0x071E
-+#define MT6323_AUXADC_ADC6        0x0720
-+#define MT6323_AUXADC_ADC7        0x0722
-+#define MT6323_AUXADC_ADC8        0x0724
-+#define MT6323_AUXADC_ADC9        0x0726
-+#define MT6323_AUXADC_ADC10       0x0728
-+#define MT6323_AUXADC_ADC11       0x072A
-+#define MT6323_AUXADC_ADC12       0x072C
-+#define MT6323_AUXADC_ADC13       0x072E
-+#define MT6323_AUXADC_ADC14       0x0730
-+#define MT6323_AUXADC_ADC15       0x0732
-+#define MT6323_AUXADC_ADC16       0x0734
-+#define MT6323_AUXADC_ADC17       0x0736
-+#define MT6323_AUXADC_ADC18       0x0738
-+#define MT6323_AUXADC_ADC19       0x073A
-+#define MT6323_AUXADC_ADC20       0x073C
-+#define MT6323_AUXADC_RSV1        0x073E
-+#define MT6323_AUXADC_RSV2        0x0740
-+#define MT6323_AUXADC_CON0        0x0742
-+#define MT6323_AUXADC_CON1        0x0744
-+#define MT6323_AUXADC_CON2        0x0746
-+#define MT6323_AUXADC_CON3        0x0748
-+#define MT6323_AUXADC_CON4        0x074A
-+#define MT6323_AUXADC_CON5        0x074C
-+#define MT6323_AUXADC_CON6        0x074E
-+#define MT6323_AUXADC_CON7        0x0750
-+#define MT6323_AUXADC_CON8        0x0752
-+#define MT6323_AUXADC_CON9        0x0754
-+#define MT6323_AUXADC_CON10       0x0756
-+#define MT6323_AUXADC_CON11       0x0758
-+#define MT6323_AUXADC_CON12       0x075A
-+#define MT6323_AUXADC_CON13       0x075C
-+#define MT6323_AUXADC_CON14       0x075E
-+#define MT6323_AUXADC_CON15       0x0760
-+#define MT6323_AUXADC_CON16       0x0762
-+#define MT6323_AUXADC_CON17       0x0764
-+#define MT6323_AUXADC_CON18       0x0766
-+#define MT6323_AUXADC_CON19       0x0768
-+#define MT6323_AUXADC_CON20       0x076A
-+#define MT6323_AUXADC_CON21       0x076C
-+#define MT6323_AUXADC_CON22       0x076E
-+#define MT6323_AUXADC_CON23       0x0770
-+#define MT6323_AUXADC_CON24       0x0772
-+#define MT6323_AUXADC_CON25       0x0774
-+#define MT6323_AUXADC_CON26       0x0776
-+#define MT6323_AUXADC_CON27       0x0778
-+#define MT6323_ACCDET_CON0        0x077A
-+#define MT6323_ACCDET_CON1        0x077C
-+#define MT6323_ACCDET_CON2        0x077E
-+#define MT6323_ACCDET_CON3        0x0780
-+#define MT6323_ACCDET_CON4        0x0782
-+#define MT6323_ACCDET_CON5        0x0784
-+#define MT6323_ACCDET_CON6        0x0786
-+#define MT6323_ACCDET_CON7        0x0788
-+#define MT6323_ACCDET_CON8        0x078A
-+#define MT6323_ACCDET_CON9        0x078C
-+#define MT6323_ACCDET_CON10       0x078E
-+#define MT6323_ACCDET_CON11       0x0790
-+#define MT6323_ACCDET_CON12       0x0792
-+#define MT6323_ACCDET_CON13       0x0794
-+#define MT6323_ACCDET_CON14       0x0796
-+#define MT6323_ACCDET_CON15       0x0798
-+#define MT6323_ACCDET_CON16       0x079A
-+
-+#endif /* __MFD_MT6323_REGISTERS_H__ */
diff --git a/target/linux/mediatek/patches-4.4/0046-regulator-Add-document-for-MT6323-regulator.patch b/target/linux/mediatek/patches-4.4/0046-regulator-Add-document-for-MT6323-regulator.patch
deleted file mode 100644
index d706314..0000000
--- a/target/linux/mediatek/patches-4.4/0046-regulator-Add-document-for-MT6323-regulator.patch
+++ /dev/null
@@ -1,254 +0,0 @@
-From f536a600e0e20fd57475415ce5b3d909441d53b6 Mon Sep 17 00:00:00 2001
-From: John Crispin <blogic at openwrt.org>
-Date: Sun, 10 Jan 2016 17:31:46 +0100
-Subject: [PATCH 046/102] regulator: Add document for MT6323 regulator
-
-Signed-off-by: John Crispin <blogic at openwrt.org>
-Cc: devicetree at vger.kernel.org
----
- .../bindings/regulator/mt6323-regulator.txt        |  239 ++++++++++++++++++++
- 1 file changed, 239 insertions(+)
- create mode 100644 Documentation/devicetree/bindings/regulator/mt6323-regulator.txt
-
---- /dev/null
-+++ b/Documentation/devicetree/bindings/regulator/mt6323-regulator.txt
-@@ -0,0 +1,239 @@
-+Mediatek MT6323 Regulator Driver
-+
-+All voltage regulators are defined as subnodes of the regulators node. A list
-+of regulators provided by this controller are defined as subnodes of the
-+PMIC's node. Each regulator is named according to its regulator type,
-+buck_<name> and ldo_<name>. The definition for each of these nodes is defined
-+using the standard binding for regulators at
-+Documentation/devicetree/bindings/regulator/regulator.txt.
-+
-+The valid names for regulators are::
-+BUCK:
-+  buck_vproc, buck_vsys, buck_vpa
-+LDO:
-+  ldo_vtcxo, ldo_vcn28, ldo_vcn33_bt, ldo_vcn33_wifi, ldo_va, ldo_vcama,
-+  ldo_vio28, ldo_vusb, ldo_vmc, ldo_vmch, ldo_vemc3v3, ldo_vgp1, ldo_vgp2,
-+  ldo_vgp3, ldo_vcn18, ldo_vsim1, ldo_vsim2, ldo_vrtc, ldo_vcamaf, ldo_vibr,
-+  ldo_vrf18, ldo_vm, ldo_vio18, ldo_vcamd, ldo_vcamio
-+
-+Example:
-+
-+	pmic: mt6323 {
-+		compatible = "mediatek,mt6323";
-+
-+		mt6323regulator: regulators {
-+			mt6323_vproc_reg: buck_vproc{
-+				regulator-name = "vproc";
-+				regulator-min-microvolt = < 700000>;
-+				regulator-max-microvolt = <1350000>;
-+				regulator-ramp-delay = <12500>;
-+				regulator-always-on;
-+				regulator-boot-on;
-+			};
-+
-+			mt6323_vsys_reg: buck_vsys{
-+				regulator-name = "vsys";
-+				regulator-min-microvolt = <1400000>;
-+				regulator-max-microvolt = <2987500>;
-+				regulator-ramp-delay = <25000>;
-+				regulator-always-on;
-+				regulator-boot-on;
-+			};
-+
-+			mt6323_vpa_reg: buck_vpa{
-+				regulator-name = "vpa";
-+				regulator-min-microvolt = < 500000>;
-+				regulator-max-microvolt = <3650000>;
-+			};
-+
-+			mt6323_vtcxo_reg: ldo_vtcxo{
-+				regulator-name = "vtcxo";
-+				regulator-min-microvolt = <2800000>;
-+				regulator-max-microvolt = <2800000>;
-+				regulator-enable-ramp-delay = <90>;
-+				regulator-always-on;
-+				regulator-boot-on;
-+			};
-+
-+			mt6323_vcn28_reg: ldo_vcn28{
-+				regulator-name = "vcn28";
-+				regulator-min-microvolt = <2800000>;
-+				regulator-max-microvolt = <2800000>;
-+				regulator-enable-ramp-delay = <185>;
-+			};
-+
-+			mt6323_vcn33_bt_reg: ldo_vcn33_bt{
-+				regulator-name = "vcn33_bt";
-+				regulator-min-microvolt = <3300000>;
-+				regulator-max-microvolt = <3600000>;
-+				regulator-enable-ramp-delay = <185>;
-+			};
-+
-+			mt6323_vcn33_wifi_reg: ldo_vcn33_wifi{
-+				regulator-name = "vcn33_wifi";
-+				regulator-min-microvolt = <3300000>;
-+				regulator-max-microvolt = <3600000>;
-+				regulator-enable-ramp-delay = <185>;
-+			};
-+
-+			mt6323_va_reg: ldo_va{
-+				regulator-name = "va";
-+				regulator-min-microvolt = <2800000>;
-+				regulator-max-microvolt = <2800000>;
-+				regulator-enable-ramp-delay = <216>;
-+				regulator-always-on;
-+				regulator-boot-on;
-+			};
-+
-+			mt6323_vcama_reg: ldo_vcama{
-+				regulator-name = "vcama";
-+				regulator-min-microvolt = <1500000>;
-+				regulator-max-microvolt = <2800000>;
-+				regulator-enable-ramp-delay = <216>;
-+			};
-+
-+			mt6323_vio28_reg: ldo_vio28{
-+				regulator-name = "vio28";
-+				regulator-min-microvolt = <2800000>;
-+				regulator-max-microvolt = <2800000>;
-+				regulator-enable-ramp-delay = <216>;
-+				regulator-always-on;
-+				regulator-boot-on;
-+			};
-+
-+			mt6323_vusb_reg: ldo_vusb{
-+				regulator-name = "vusb";
-+				regulator-min-microvolt = <3300000>;
-+				regulator-max-microvolt = <3300000>;
-+				regulator-enable-ramp-delay = <216>;
-+				regulator-boot-on;
-+			};
-+
-+			mt6323_vmc_reg: ldo_vmc{
-+				regulator-name = "vmc";
-+				regulator-min-microvolt = <1800000>;
-+				regulator-max-microvolt = <3300000>;
-+				regulator-enable-ramp-delay = <36>;
-+				regulator-boot-on;
-+			};
-+
-+			mt6323_vmch_reg: ldo_vmch{
-+				regulator-name = "vmch";
-+				regulator-min-microvolt = <3000000>;
-+				regulator-max-microvolt = <3300000>;
-+				regulator-enable-ramp-delay = <36>;
-+				regulator-boot-on;
-+			};
-+
-+			mt6323_vemc3v3_reg: ldo_vemc3v3{
-+				regulator-name = "vemc3v3";
-+				regulator-min-microvolt = <3000000>;
-+				regulator-max-microvolt = <3300000>;
-+				regulator-enable-ramp-delay = <36>;
-+				regulator-boot-on;
-+			};
-+
-+			mt6323_vgp1_reg: ldo_vgp1{
-+				regulator-name = "vgp1";
-+				regulator-min-microvolt = <1200000>;
-+				regulator-max-microvolt = <3300000>;
-+				regulator-enable-ramp-delay = <216>;
-+			};
-+
-+			mt6323_vgp2_reg: ldo_vgp2{
-+				regulator-name = "vgp2";
-+				regulator-min-microvolt = <1200000>;
-+				regulator-max-microvolt = <3000000>;
-+				regulator-enable-ramp-delay = <216>;
-+			};
-+
-+			mt6323_vgp3_reg: ldo_vgp3{
-+				regulator-name = "vgp3";
-+				regulator-min-microvolt = <1200000>;
-+				regulator-max-microvolt = <1800000>;
-+				regulator-enable-ramp-delay = <216>;
-+			};
-+
-+			mt6323_vcn18_reg: ldo_vcn18{
-+				regulator-name = "vcn18";
-+				regulator-min-microvolt = <1800000>;
-+				regulator-max-microvolt = <1800000>;
-+				regulator-enable-ramp-delay = <216>;
-+			};
-+
-+			mt6323_vsim1_reg: ldo_vsim1{
-+				regulator-name = "vsim1";
-+				regulator-min-microvolt = <1800000>;
-+				regulator-max-microvolt = <3000000>;
-+				regulator-enable-ramp-delay = <216>;
-+			};
-+
-+			mt6323_vsim2_reg: ldo_vsim2{
-+				regulator-name = "vsim2";
-+				regulator-min-microvolt = <1800000>;
-+				regulator-max-microvolt = <3000000>;
-+				regulator-enable-ramp-delay = <216>;
-+			};
-+
-+			mt6323_vrtc_reg: ldo_vrtc{
-+				regulator-name = "vrtc";
-+				regulator-min-microvolt = <2800000>;
-+				regulator-max-microvolt = <2800000>;
-+				regulator-always-on;
-+				regulator-boot-on;
-+			};
-+
-+			mt6323_vcamaf_reg: ldo_vcamaf{
-+				regulator-name = "vcamaf";
-+				regulator-min-microvolt = <1200000>;
-+				regulator-max-microvolt = <3300000>;
-+				regulator-enable-ramp-delay = <216>;
-+			};
-+
-+			mt6323_vibr_reg: ldo_vibr{
-+				regulator-name = "vibr";
-+				regulator-min-microvolt = <1200000>;
-+				regulator-max-microvolt = <3300000>;
-+				regulator-enable-ramp-delay = <36>;
-+			};
-+
-+			mt6323_vrf18_reg: ldo_vrf18{
-+				regulator-name = "vrf18";
-+				regulator-min-microvolt = <1825000>;
-+				regulator-max-microvolt = <1825000>;
-+				regulator-enable-ramp-delay = <187>;
-+			};
-+
-+			mt6323_vm_reg: ldo_vm{
-+				regulator-name = "vm";
-+				regulator-min-microvolt = <1200000>;
-+				regulator-max-microvolt = <1800000>;
-+				regulator-enable-ramp-delay = <216>;
-+				regulator-always-on;
-+				regulator-boot-on;
-+			};
-+
-+			mt6323_vio18_reg: ldo_vio18{
-+				regulator-name = "vio18";
-+				regulator-min-microvolt = <1800000>;
-+				regulator-max-microvolt = <1800000>;
-+				regulator-enable-ramp-delay = <216>;
-+				regulator-always-on;
-+				regulator-boot-on;
-+			};
-+
-+			mt6323_vcamd_reg: ldo_vcamd{
-+				regulator-name = "vcamd";
-+				regulator-min-microvolt = <1200000>;
-+				regulator-max-microvolt = <1800000>;
-+				regulator-enable-ramp-delay = <216>;
-+			};
-+
-+			mt6323_vcamio_reg: ldo_vcamio{
-+				regulator-name = "vcamio";
-+				regulator-min-microvolt = <1800000>;
-+				regulator-max-microvolt = <1800000>;
-+				regulator-enable-ramp-delay = <216>;
-+			};
-+		};
-+	};
diff --git a/target/linux/mediatek/patches-4.4/0047-regulator-mt6323-Add-support-for-MT6323-regulator.patch b/target/linux/mediatek/patches-4.4/0047-regulator-mt6323-Add-support-for-MT6323-regulator.patch
deleted file mode 100644
index 6456c27..0000000
--- a/target/linux/mediatek/patches-4.4/0047-regulator-mt6323-Add-support-for-MT6323-regulator.patch
+++ /dev/null
@@ -1,538 +0,0 @@
-From 94c08223cd696d872cda7d9aa4e817956d0a0b84 Mon Sep 17 00:00:00 2001
-From: Chen Zhong <chen.zhong at mediatek.com>
-Date: Fri, 8 Jan 2016 04:17:37 +0100
-Subject: [PATCH 047/102] regulator: mt6323: Add support for MT6323 regulator
-
-The MT6323 is a regulator found on boards based on MediaTek MT7623 and
-probably other SoCs. It is a so called pmic and connects as a slave to
-SoC using SPI, wrapped inside the pmic-wrapper.
-
-Signed-off-by: Chen Zhong <chen.zhong at mediatek.com>
-Signed-off-by: John Crispin <blogic at openwrt.org>
----
- drivers/regulator/Kconfig                  |    9 +
- drivers/regulator/Makefile                 |    1 +
- drivers/regulator/mt6323-regulator.c       |  432 ++++++++++++++++++++++++++++
- include/linux/regulator/mt6323-regulator.h |   52 ++++
- 4 files changed, 494 insertions(+)
- create mode 100644 drivers/regulator/mt6323-regulator.c
- create mode 100644 include/linux/regulator/mt6323-regulator.h
-
---- a/drivers/regulator/Kconfig
-+++ b/drivers/regulator/Kconfig
-@@ -453,6 +453,15 @@ config REGULATOR_MT6311
- 	  This driver supports the control of different power rails of device
- 	  through regulator interface.
- 
-+config REGULATOR_MT6323
-+	tristate "MediaTek MT6323 PMIC"
-+	depends on MFD_MT6397
-+	help
-+	  Say y here to select this option to enable the power regulator of
-+	  MediaTek MT6323 PMIC.
-+	  This driver supports the control of different power rails of device
-+	  through regulator interface.
-+
- config REGULATOR_MT6397
- 	tristate "MediaTek MT6397 PMIC"
- 	depends on MFD_MT6397
---- a/drivers/regulator/Makefile
-+++ b/drivers/regulator/Makefile
-@@ -60,6 +60,7 @@ obj-$(CONFIG_REGULATOR_MC13783) += mc137
- obj-$(CONFIG_REGULATOR_MC13892) += mc13892-regulator.o
- obj-$(CONFIG_REGULATOR_MC13XXX_CORE) +=  mc13xxx-regulator-core.o
- obj-$(CONFIG_REGULATOR_MT6311) += mt6311-regulator.o
-+obj-$(CONFIG_REGULATOR_MT6323)	+= mt6323-regulator.o
- obj-$(CONFIG_REGULATOR_MT6397)	+= mt6397-regulator.o
- obj-$(CONFIG_REGULATOR_QCOM_RPM) += qcom_rpm-regulator.o
- obj-$(CONFIG_REGULATOR_QCOM_SMD_RPM) += qcom_smd-regulator.o
---- /dev/null
-+++ b/drivers/regulator/mt6323-regulator.c
-@@ -0,0 +1,432 @@
-+/*
-+ * Copyright (c) 2016 MediaTek Inc.
-+ * Author: Chen Zhong <chen.zhong at mediatek.com>
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 as
-+ * published by the Free Software Foundation.
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/of.h>
-+#include <linux/platform_device.h>
-+#include <linux/regmap.h>
-+#include <linux/mfd/mt6397/core.h>
-+#include <linux/mfd/mt6323/registers.h>
-+#include <linux/regulator/driver.h>
-+#include <linux/regulator/machine.h>
-+#include <linux/regulator/mt6323-regulator.h>
-+#include <linux/regulator/of_regulator.h>
-+
-+#define MT6323_LDO_MODE_NORMAL	0
-+#define MT6323_LDO_MODE_LP	1
-+
-+/*
-+ * MT6323 regulators' information
-+ *
-+ * @desc: standard fields of regulator description.
-+ * @qi: Mask for query enable signal status of regulators
-+ * @vselon_reg: Register sections for hardware control mode of bucks
-+ * @vselctrl_reg: Register for controlling the buck control mode.
-+ * @vselctrl_mask: Mask for query buck's voltage control mode.
-+ */
-+struct mt6323_regulator_info {
-+	struct regulator_desc desc;
-+	u32 qi;
-+	u32 vselon_reg;
-+	u32 vselctrl_reg;
-+	u32 vselctrl_mask;
-+	u32 modeset_reg;
-+	u32 modeset_mask;
-+};
-+
-+#define MT6323_BUCK(match, vreg, min, max, step, volt_ranges, enreg,	\
-+		vosel, vosel_mask, voselon, vosel_ctrl)			\
-+[MT6323_ID_##vreg] = {							\
-+	.desc = {							\
-+		.name = #vreg,						\
-+		.of_match = of_match_ptr(match),			\
-+		.ops = &mt6323_volt_range_ops,				\
-+		.type = REGULATOR_VOLTAGE,				\
-+		.id = MT6323_ID_##vreg,					\
-+		.owner = THIS_MODULE,					\
-+		.n_voltages = (max - min)/step + 1,			\
-+		.linear_ranges = volt_ranges,				\
-+		.n_linear_ranges = ARRAY_SIZE(volt_ranges),		\
-+		.vsel_reg = vosel,					\
-+		.vsel_mask = vosel_mask,				\
-+		.enable_reg = enreg,					\
-+		.enable_mask = BIT(0),					\
-+	},								\
-+	.qi = BIT(13),							\
-+	.vselon_reg = voselon,						\
-+	.vselctrl_reg = vosel_ctrl,					\
-+	.vselctrl_mask = BIT(1),					\
-+}
-+
-+#define MT6323_LDO(match, vreg, ldo_volt_table, enreg, enbit, vosel,	\
-+		vosel_mask, _modeset_reg, _modeset_mask)		\
-+[MT6323_ID_##vreg] = {							\
-+	.desc = {							\
-+		.name = #vreg,						\
-+		.of_match = of_match_ptr(match),			\
-+		.ops = &mt6323_volt_table_ops,				\
-+		.type = REGULATOR_VOLTAGE,				\
-+		.id = MT6323_ID_##vreg,					\
-+		.owner = THIS_MODULE,					\
-+		.n_voltages = ARRAY_SIZE(ldo_volt_table),		\
-+		.volt_table = ldo_volt_table,				\
-+		.vsel_reg = vosel,					\
-+		.vsel_mask = vosel_mask,				\
-+		.enable_reg = enreg,					\
-+		.enable_mask = BIT(enbit),				\
-+	},								\
-+	.qi = BIT(15),							\
-+	.modeset_reg = _modeset_reg,					\
-+	.modeset_mask = _modeset_mask,					\
-+}
-+
-+#define MT6323_REG_FIXED(match, vreg, enreg, enbit, volt,		\
-+		_modeset_reg, _modeset_mask)				\
-+[MT6323_ID_##vreg] = {							\
-+	.desc = {							\
-+		.name = #vreg,						\
-+		.of_match = of_match_ptr(match),			\
-+		.ops = &mt6323_volt_fixed_ops,				\
-+		.type = REGULATOR_VOLTAGE,				\
-+		.id = MT6323_ID_##vreg,					\
-+		.owner = THIS_MODULE,					\
-+		.n_voltages = 1,					\
-+		.enable_reg = enreg,					\
-+		.enable_mask = BIT(enbit),				\
-+		.min_uV = volt,						\
-+	},								\
-+	.qi = BIT(15),							\
-+	.modeset_reg = _modeset_reg,					\
-+	.modeset_mask = _modeset_mask,					\
-+}
-+
-+static const struct regulator_linear_range buck_volt_range1[] = {
-+	REGULATOR_LINEAR_RANGE(700000, 0, 0x7f, 6250),
-+};
-+
-+static const struct regulator_linear_range buck_volt_range2[] = {
-+	REGULATOR_LINEAR_RANGE(1400000, 0, 0x7f, 12500),
-+};
-+
-+static const struct regulator_linear_range buck_volt_range3[] = {
-+	REGULATOR_LINEAR_RANGE(500000, 0, 0x3f, 50000),
-+};
-+
-+static const u32 ldo_volt_table1[] = {
-+	3300000, 3400000, 3500000, 3600000,
-+};
-+
-+static const u32 ldo_volt_table2[] = {
-+	1500000, 1800000, 2500000, 2800000,
-+};
-+
-+static const u32 ldo_volt_table3[] = {
-+	1800000, 3300000,
-+};
-+
-+static const u32 ldo_volt_table4[] = {
-+	3000000, 3300000,
-+};
-+
-+static const u32 ldo_volt_table5[] = {
-+	1200000, 1300000, 1500000, 1800000, 2000000, 2800000, 3000000, 3300000,
-+};
-+
-+static const u32 ldo_volt_table6[] = {
-+	1200000, 1300000, 1500000, 1800000, 2500000, 2800000, 3000000, 2000000,
-+};
-+
-+static const u32 ldo_volt_table7[] = {
-+	1200000, 1300000, 1500000, 1800000,
-+};
-+
-+static const u32 ldo_volt_table8[] = {
-+	1800000, 3000000,
-+};
-+
-+static const u32 ldo_volt_table9[] = {
-+	1200000, 1350000, 1500000, 1800000,
-+};
-+
-+static const u32 ldo_volt_table10[] = {
-+	1200000, 1300000, 1500000, 1800000,
-+};
-+
-+static int mt6323_get_status(struct regulator_dev *rdev)
-+{
-+	int ret;
-+	u32 regval;
-+	struct mt6323_regulator_info *info = rdev_get_drvdata(rdev);
-+
-+	ret = regmap_read(rdev->regmap, info->desc.enable_reg, &regval);
-+	if (ret != 0) {
-+		dev_err(&rdev->dev, "Failed to get enable reg: %d\n", ret);
-+		return ret;
-+	}
-+
-+	return (regval & info->qi) ? REGULATOR_STATUS_ON : REGULATOR_STATUS_OFF;
-+}
-+
-+static int mt6323_ldo_set_mode(struct regulator_dev *rdev, unsigned int mode)
-+{
-+	int ret, val = 0;
-+	struct mt6323_regulator_info *info = rdev_get_drvdata(rdev);
-+
-+	if (!info->modeset_mask) {
-+		dev_err(&rdev->dev, "regulator %s doesn't support set_mode\n",
-+			info->desc.name);
-+		return -EINVAL;
-+	}
-+
-+	switch (mode) {
-+	case REGULATOR_MODE_STANDBY:
-+		val = MT6323_LDO_MODE_LP;
-+		break;
-+	case REGULATOR_MODE_NORMAL:
-+		val = MT6323_LDO_MODE_NORMAL;
-+		break;
-+	default:
-+		return -EINVAL;
-+	}
-+
-+	val <<= ffs(info->modeset_mask) - 1;
-+
-+	ret = regmap_update_bits(rdev->regmap, info->modeset_reg,
-+				  info->modeset_mask, val);
-+
-+	return ret;
-+}
-+
-+static unsigned int mt6323_ldo_get_mode(struct regulator_dev *rdev)
-+{
-+	unsigned int val;
-+	unsigned int mode;
-+	int ret;
-+	struct mt6323_regulator_info *info = rdev_get_drvdata(rdev);
-+
-+	if (!info->modeset_mask) {
-+		dev_err(&rdev->dev, "regulator %s doesn't support get_mode\n",
-+			info->desc.name);
-+		return -EINVAL;
-+	}
-+
-+	ret = regmap_read(rdev->regmap, info->modeset_reg, &val);
-+	if (ret < 0)
-+		return ret;
-+
-+	val &= info->modeset_mask;
-+	val >>= ffs(info->modeset_mask) - 1;
-+
-+	if (val & 0x1)
-+		mode = REGULATOR_MODE_STANDBY;
-+	else
-+		mode = REGULATOR_MODE_NORMAL;
-+
-+	return mode;
-+}
-+
-+static struct regulator_ops mt6323_volt_range_ops = {
-+	.list_voltage = regulator_list_voltage_linear_range,
-+	.map_voltage = regulator_map_voltage_linear_range,
-+	.set_voltage_sel = regulator_set_voltage_sel_regmap,
-+	.get_voltage_sel = regulator_get_voltage_sel_regmap,
-+	.set_voltage_time_sel = regulator_set_voltage_time_sel,
-+	.enable = regulator_enable_regmap,
-+	.disable = regulator_disable_regmap,
-+	.is_enabled = regulator_is_enabled_regmap,
-+	.get_status = mt6323_get_status,
-+};
-+
-+static struct regulator_ops mt6323_volt_table_ops = {
-+	.list_voltage = regulator_list_voltage_table,
-+	.map_voltage = regulator_map_voltage_iterate,
-+	.set_voltage_sel = regulator_set_voltage_sel_regmap,
-+	.get_voltage_sel = regulator_get_voltage_sel_regmap,
-+	.set_voltage_time_sel = regulator_set_voltage_time_sel,
-+	.enable = regulator_enable_regmap,
-+	.disable = regulator_disable_regmap,
-+	.is_enabled = regulator_is_enabled_regmap,
-+	.get_status = mt6323_get_status,
-+	.set_mode = mt6323_ldo_set_mode,
-+	.get_mode = mt6323_ldo_get_mode,
-+};
-+
-+static struct regulator_ops mt6323_volt_fixed_ops = {
-+	.list_voltage = regulator_list_voltage_linear,
-+	.enable = regulator_enable_regmap,
-+	.disable = regulator_disable_regmap,
-+	.is_enabled = regulator_is_enabled_regmap,
-+	.get_status = mt6323_get_status,
-+	.set_mode = mt6323_ldo_set_mode,
-+	.get_mode = mt6323_ldo_get_mode,
-+};
-+
-+/* The array is indexed by id(MT6323_ID_XXX) */
-+static struct mt6323_regulator_info mt6323_regulators[] = {
-+	MT6323_BUCK("buck_vproc", VPROC, 700000, 1493750, 6250,
-+		buck_volt_range1, MT6323_VPROC_CON7, MT6323_VPROC_CON9, 0x7f,
-+		MT6323_VPROC_CON10, MT6323_VPROC_CON5),
-+	MT6323_BUCK("buck_vsys", VSYS, 1400000, 2987500, 12500,
-+		buck_volt_range2, MT6323_VSYS_CON7, MT6323_VSYS_CON9, 0x7f,
-+		MT6323_VSYS_CON10, MT6323_VSYS_CON5),
-+	MT6323_BUCK("buck_vpa", VPA, 500000, 3650000, 50000,
-+		buck_volt_range3, MT6323_VPA_CON7, MT6323_VPA_CON9,
-+		0x3f, MT6323_VPA_CON10, MT6323_VPA_CON5),
-+	MT6323_REG_FIXED("ldo_vtcxo", VTCXO, MT6323_ANALDO_CON1, 10, 2800000,
-+		MT6323_ANALDO_CON1, 0x2),
-+	MT6323_REG_FIXED("ldo_vcn28", VCN28, MT6323_ANALDO_CON19, 12, 2800000,
-+		MT6323_ANALDO_CON20, 0x2),
-+	MT6323_LDO("ldo_vcn33_bt", VCN33_BT, ldo_volt_table1,
-+		MT6323_ANALDO_CON16, 7, MT6323_ANALDO_CON16, 0xC,
-+		MT6323_ANALDO_CON21, 0x2),
-+	MT6323_LDO("ldo_vcn33_wifi", VCN33_WIFI, ldo_volt_table1,
-+		MT6323_ANALDO_CON17, 12, MT6323_ANALDO_CON16, 0xC,
-+		MT6323_ANALDO_CON21, 0x2),
-+	MT6323_REG_FIXED("ldo_va", VA, MT6323_ANALDO_CON2, 14, 2800000,
-+		MT6323_ANALDO_CON2, 0x2),
-+	MT6323_LDO("ldo_vcama", VCAMA, ldo_volt_table2,
-+		MT6323_ANALDO_CON4, 15, MT6323_ANALDO_CON10, 0x60, -1, 0),
-+	MT6323_REG_FIXED("ldo_vio28", VIO28, MT6323_DIGLDO_CON0, 14, 2800000,
-+		MT6323_DIGLDO_CON0, 0x2),
-+	MT6323_REG_FIXED("ldo_vusb", VUSB, MT6323_DIGLDO_CON2, 14, 3300000,
-+		MT6323_DIGLDO_CON2, 0x2),
-+	MT6323_LDO("ldo_vmc", VMC, ldo_volt_table3,
-+		MT6323_DIGLDO_CON3, 12, MT6323_DIGLDO_CON24, 0x10,
-+		MT6323_DIGLDO_CON3, 0x2),
-+	MT6323_LDO("ldo_vmch", VMCH, ldo_volt_table4,
-+		MT6323_DIGLDO_CON5, 14, MT6323_DIGLDO_CON26, 0x80,
-+		MT6323_DIGLDO_CON5, 0x2),
-+	MT6323_LDO("ldo_vemc3v3", VEMC3V3, ldo_volt_table4,
-+		MT6323_DIGLDO_CON6, 14, MT6323_DIGLDO_CON27, 0x80,
-+		MT6323_DIGLDO_CON6, 0x2),
-+	MT6323_LDO("ldo_vgp1", VGP1, ldo_volt_table5,
-+		MT6323_DIGLDO_CON7, 15, MT6323_DIGLDO_CON28, 0xE0,
-+		MT6323_DIGLDO_CON7, 0x2),
-+	MT6323_LDO("ldo_vgp2", VGP2, ldo_volt_table6,
-+		MT6323_DIGLDO_CON8, 15, MT6323_DIGLDO_CON29, 0xE0,
-+		MT6323_DIGLDO_CON8, 0x2),
-+	MT6323_LDO("ldo_vgp3", VGP3, ldo_volt_table7,
-+		MT6323_DIGLDO_CON9, 15, MT6323_DIGLDO_CON30, 0x60,
-+		MT6323_DIGLDO_CON9, 0x2),
-+	MT6323_REG_FIXED("ldo_vcn18", VCN18, MT6323_DIGLDO_CON11, 14, 1800000,
-+		MT6323_DIGLDO_CON11, 0x2),
-+	MT6323_LDO("ldo_vsim1", VSIM1, ldo_volt_table8,
-+		MT6323_DIGLDO_CON13, 15, MT6323_DIGLDO_CON34, 0x20,
-+		MT6323_DIGLDO_CON13, 0x2),
-+	MT6323_LDO("ldo_vsim2", VSIM2, ldo_volt_table8,
-+		MT6323_DIGLDO_CON14, 15, MT6323_DIGLDO_CON35, 0x20,
-+		MT6323_DIGLDO_CON14, 0x2),
-+	MT6323_REG_FIXED("ldo_vrtc", VRTC, MT6323_DIGLDO_CON15, 8, 2800000,
-+		-1, 0),
-+	MT6323_LDO("ldo_vcamaf", VCAMAF, ldo_volt_table5,
-+		MT6323_DIGLDO_CON31, 15, MT6323_DIGLDO_CON32, 0xE0,
-+		MT6323_DIGLDO_CON31, 0x2),
-+	MT6323_LDO("ldo_vibr", VIBR, ldo_volt_table5,
-+		MT6323_DIGLDO_CON39, 15, MT6323_DIGLDO_CON40, 0xE0,
-+		MT6323_DIGLDO_CON39, 0x2),
-+	MT6323_REG_FIXED("ldo_vrf18", VRF18, MT6323_DIGLDO_CON45, 15, 1825000,
-+		MT6323_DIGLDO_CON45, 0x2),
-+	MT6323_LDO("ldo_vm", VM, ldo_volt_table9,
-+		MT6323_DIGLDO_CON47, 14, MT6323_DIGLDO_CON48, 0x30,
-+		MT6323_DIGLDO_CON47, 0x2),
-+	MT6323_REG_FIXED("ldo_vio18", VIO18, MT6323_DIGLDO_CON49, 14, 1800000,
-+		MT6323_DIGLDO_CON49, 0x2),
-+	MT6323_LDO("ldo_vcamd", VCAMD, ldo_volt_table10,
-+		MT6323_DIGLDO_CON51, 14, MT6323_DIGLDO_CON52, 0x60,
-+		MT6323_DIGLDO_CON51, 0x2),
-+	MT6323_REG_FIXED("ldo_vcamio", VCAMIO, MT6323_DIGLDO_CON53, 14, 1800000,
-+		MT6323_DIGLDO_CON53, 0x2),
-+};
-+
-+static int mt6323_set_buck_vosel_reg(struct platform_device *pdev)
-+{
-+	struct mt6397_chip *mt6323 = dev_get_drvdata(pdev->dev.parent);
-+	int i;
-+	u32 regval;
-+
-+	for (i = 0; i < MT6323_MAX_REGULATOR; i++) {
-+		if (mt6323_regulators[i].vselctrl_reg) {
-+			if (regmap_read(mt6323->regmap,
-+				mt6323_regulators[i].vselctrl_reg,
-+				&regval) < 0) {
-+				dev_err(&pdev->dev,
-+					"Failed to read buck ctrl\n");
-+				return -EIO;
-+			}
-+
-+			if (regval & mt6323_regulators[i].vselctrl_mask) {
-+				mt6323_regulators[i].desc.vsel_reg =
-+				mt6323_regulators[i].vselon_reg;
-+			}
-+		}
-+	}
-+
-+	return 0;
-+}
-+
-+static int mt6323_regulator_probe(struct platform_device *pdev)
-+{
-+	struct mt6397_chip *mt6323 = dev_get_drvdata(pdev->dev.parent);
-+	struct regulator_config config = {};
-+	struct regulator_dev *rdev;
-+	int i;
-+	u32 reg_value;
-+
-+	/* Query buck controller to select activated voltage register part */
-+	if (mt6323_set_buck_vosel_reg(pdev))
-+		return -EIO;
-+
-+	/* Read PMIC chip revision to update constraints and voltage table */
-+	if (regmap_read(mt6323->regmap, MT6323_CID, &reg_value) < 0) {
-+		dev_err(&pdev->dev, "Failed to read Chip ID\n");
-+		return -EIO;
-+	}
-+	dev_info(&pdev->dev, "Chip ID = 0x%x\n", reg_value);
-+
-+	for (i = 0; i < MT6323_MAX_REGULATOR; i++) {
-+		config.dev = &pdev->dev;
-+		config.driver_data = &mt6323_regulators[i];
-+		config.regmap = mt6323->regmap;
-+		rdev = devm_regulator_register(&pdev->dev,
-+				&mt6323_regulators[i].desc, &config);
-+		if (IS_ERR(rdev)) {
-+			dev_err(&pdev->dev, "failed to register %s\n",
-+				mt6323_regulators[i].desc.name);
-+			return PTR_ERR(rdev);
-+		}
-+	}
-+	return 0;
-+}
-+
-+static const struct platform_device_id mt6323_platform_ids[] = {
-+	{"mt6323-regulator", 0},
-+	{ /* sentinel */ },
-+};
-+MODULE_DEVICE_TABLE(platform, mt6323_platform_ids);
-+
-+static const struct of_device_id mt6323_of_match[] = {
-+	{ .compatible = "mediatek,mt6323-regulator", },
-+	{ /* sentinel */ },
-+};
-+MODULE_DEVICE_TABLE(of, mt6323_of_match);
-+
-+static struct platform_driver mt6323_regulator_driver = {
-+	.driver = {
-+		.name = "mt6323-regulator",
-+		.of_match_table = of_match_ptr(mt6323_of_match),
-+	},
-+	.probe = mt6323_regulator_probe,
-+	.id_table = mt6323_platform_ids,
-+};
-+
-+module_platform_driver(mt6323_regulator_driver);
-+
-+MODULE_AUTHOR("Chen Zhong <chen.zhong at mediatek.com>");
-+MODULE_DESCRIPTION("Regulator Driver for MediaTek MT6397 PMIC");
-+MODULE_LICENSE("GPL v2");
---- /dev/null
-+++ b/include/linux/regulator/mt6323-regulator.h
-@@ -0,0 +1,52 @@
-+/*
-+ * Copyright (c) 2016 MediaTek Inc.
-+ * Author: Chen Zhong <chen.zhong at mediatek.com>
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 as
-+ * published by the Free Software Foundation.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ */
-+
-+#ifndef __LINUX_REGULATOR_MT6323_H
-+#define __LINUX_REGULATOR_MT6323_H
-+
-+enum {
-+	MT6323_ID_VPROC = 0,
-+	MT6323_ID_VSYS,
-+	MT6323_ID_VPA,
-+	MT6323_ID_VTCXO,
-+	MT6323_ID_VCN28,
-+	MT6323_ID_VCN33_BT,
-+	MT6323_ID_VCN33_WIFI,
-+	MT6323_ID_VA,
-+	MT6323_ID_VCAMA,
-+	MT6323_ID_VIO28 = 9,
-+	MT6323_ID_VUSB,
-+	MT6323_ID_VMC,
-+	MT6323_ID_VMCH,
-+	MT6323_ID_VEMC3V3,
-+	MT6323_ID_VGP1,
-+	MT6323_ID_VGP2,
-+	MT6323_ID_VGP3,
-+	MT6323_ID_VCN18,
-+	MT6323_ID_VSIM1,
-+	MT6323_ID_VSIM2,
-+	MT6323_ID_VRTC,
-+	MT6323_ID_VCAMAF,
-+	MT6323_ID_VIBR,
-+	MT6323_ID_VRF18,
-+	MT6323_ID_VM,
-+	MT6323_ID_VIO18,
-+	MT6323_ID_VCAMD,
-+	MT6323_ID_VCAMIO,
-+	MT6323_ID_RG_MAX,
-+};
-+
-+#define MT6323_MAX_REGULATOR	MT6323_ID_RG_MAX
-+
-+#endif /* __LINUX_REGULATOR_MT6323_H */
diff --git a/target/linux/mediatek/patches-4.4/0048-net-next-mediatek-document-MediaTek-SoC-ethernet-bin.patch b/target/linux/mediatek/patches-4.4/0048-net-next-mediatek-document-MediaTek-SoC-ethernet-bin.patch
deleted file mode 100644
index 8721d77..0000000
--- a/target/linux/mediatek/patches-4.4/0048-net-next-mediatek-document-MediaTek-SoC-ethernet-bin.patch
+++ /dev/null
@@ -1,97 +0,0 @@
-From 6efc8d9081b70dcf71d7e8efd7b51d48ee2541be Mon Sep 17 00:00:00 2001
-From: John Crispin <blogic at openwrt.org>
-Date: Wed, 2 Mar 2016 07:18:52 +0100
-Subject: [PATCH 048/102] net-next: mediatek: document MediaTek SoC ethernet
- binding
-
-This adds the binding documentation for the MediaTek Ethernet
-controller.
-
-Signed-off-by: John Crispin <blogic at openwrt.org>
-Acked-by: Rob Herring <robh at kernel.org>
-Cc: devicetree at vger.kernel.org
----
- .../devicetree/bindings/net/mediatek-net.txt       |   77 ++++++++++++++++++++
- 1 file changed, 77 insertions(+)
- create mode 100644 Documentation/devicetree/bindings/net/mediatek-net.txt
-
---- /dev/null
-+++ b/Documentation/devicetree/bindings/net/mediatek-net.txt
-@@ -0,0 +1,77 @@
-+MediaTek Frame Engine Ethernet controller
-+=========================================
-+
-+The frame engine ethernet controller can be found on MediaTek SoCs. These SoCs
-+have dual GMAC each represented by a child node..
-+
-+* Ethernet controller node
-+
-+Required properties:
-+- compatible: Should be "mediatek,mt2701-eth"
-+- reg: Address and length of the register set for the device
-+- interrupts: Should contain the frame engines interrupt
-+- clocks: the clock used by the core
-+- clock-names: the names of the clock listed in the clocks property. These are
-+	"ethif", "esw", "gp2", "gp1"
-+- power-domains: phandle to the power domain that the ethernet is part of
-+- resets: Should contain a phandle to the ethsys reset signal
-+- reset-names: Should contain the reset signal name "eth"
-+- mediatek,ethsys: phandle to the syscon node that handles the port setup
-+- mediatek,pctl: phandle to the syscon node that handles the ports slew rate
-+	and driver current
-+
-+Optional properties:
-+- interrupt-parent: Should be the phandle for the interrupt controller
-+  that services interrupts for this device
-+
-+
-+* Ethernet MAC node
-+
-+Required properties:
-+- compatible: Should be "mediatek,eth-mac"
-+- reg: The number of the MAC
-+- phy-handle: see ethernet.txt file in the same directory.
-+
-+Example:
-+
-+eth: ethernet at 1b100000 {
-+	compatible = "mediatek,mt2701-eth";
-+	reg = <0 0x1b100000 0 0x20000>;
-+	clocks = <&topckgen CLK_TOP_ETHIF_SEL>,
-+		 <&ethsys CLK_ETHSYS_ESW>,
-+		 <&ethsys CLK_ETHSYS_GP2>,
-+		 <&ethsys CLK_ETHSYS_GP1>;
-+	clock-names = "ethif", "esw", "gp2", "gp1";
-+	interrupts = <GIC_SPI 200 IRQ_TYPE_LEVEL_LOW>;
-+	power-domains = <&scpsys MT2701_POWER_DOMAIN_ETH>;
-+	resets = <&ethsys MT2701_ETHSYS_ETH_RST>;
-+	reset-names = "eth";
-+	mediatek,ethsys = <&ethsys>;
-+	mediatek,pctl = <&syscfg_pctl_a>;
-+	#address-cells = <1>;
-+	#size-cells = <0>;
-+
-+	gmac1: mac at 0 {
-+		compatible = "mediatek,eth-mac";
-+		reg = <0>;
-+		phy-handle = <&phy0>;
-+	};
-+
-+	gmac2: mac at 1 {
-+		compatible = "mediatek,eth-mac";
-+		reg = <1>;
-+		phy-handle = <&phy1>;
-+	};
-+
-+	mdio-bus {
-+		phy0: ethernet-phy at 0 {
-+			reg = <0>;
-+			phy-mode = "rgmii";
-+		};
-+
-+		phy1: ethernet-phy at 1 {
-+			reg = <1>;
-+			phy-mode = "rgmii";
-+		};
-+	};
-+};
diff --git a/target/linux/mediatek/patches-4.4/0049-net-next-mediatek-add-support-for-MT7623-ethernet.patch b/target/linux/mediatek/patches-4.4/0049-net-next-mediatek-add-support-for-MT7623-ethernet.patch
deleted file mode 100644
index 9d44592..0000000
--- a/target/linux/mediatek/patches-4.4/0049-net-next-mediatek-add-support-for-MT7623-ethernet.patch
+++ /dev/null
@@ -1,2262 +0,0 @@
-From 8cc84aa65121135d7b120ce71b4f10f81230c818 Mon Sep 17 00:00:00 2001
-From: John Crispin <blogic at openwrt.org>
-Date: Wed, 2 Mar 2016 04:27:10 +0100
-Subject: [PATCH 049/102] net-next: mediatek: add support for MT7623 ethernet
-
-Add ethernet support for MediaTek SoCs from the MT7623 family. These have
-dual GMAC. Depending on the exact version, there might be a built-in
-Gigabit switch (MT7530). The core does not have the typical DMA ring setup.
-Instead there is a linked list that we add descriptors to. There is only
-one linked list that both MACs use together. There is a special field
-inside the TX descriptors called the VQID. This allows us to assign packets
-to different internal queues. By using a separate id for each MAC we are
-able to get deterministic results for BQL. Additionally we need to
-provide the core with a block of scratch memory that is the same size as
-the RX ring and data buffer. This is really needed to make the HW datapath
-work. Although the driver does not support this yet, we still need to
-assign the memory and tell the core about it for RX to work.
-
-Signed-off-by: Felix Fietkau <nbd at nbd.name>
-Signed-off-by: Michael Lee <igvtee at gmail.com>
-Signed-off-by: John Crispin <blogic at openwrt.org>
----
- drivers/net/ethernet/mediatek/mtk_eth_soc.c | 1807 +++++++++++++++++++++++++++
- drivers/net/ethernet/mediatek/mtk_eth_soc.h |  421 +++++++
- 2 files changed, 2228 insertions(+)
- create mode 100644 drivers/net/ethernet/mediatek/mtk_eth_soc.c
- create mode 100644 drivers/net/ethernet/mediatek/mtk_eth_soc.h
-
---- /dev/null
-+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-@@ -0,0 +1,1807 @@
-+/*   This program is free software; you can redistribute it and/or modify
-+ *   it under the terms of the GNU General Public License as published by
-+ *   the Free Software Foundation; version 2 of the License
-+ *
-+ *   This program is distributed in the hope that it will be useful,
-+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ *   GNU General Public License for more details.
-+ *
-+ *   Copyright (C) 2009-2016 John Crispin <blogic at openwrt.org>
-+ *   Copyright (C) 2009-2016 Felix Fietkau <nbd at nbd.name>
-+ *   Copyright (C) 2013-2016 Michael Lee <igvtee at gmail.com>
-+ */
-+
-+#include <linux/of_device.h>
-+#include <linux/of_mdio.h>
-+#include <linux/of_net.h>
-+#include <linux/mfd/syscon.h>
-+#include <linux/regmap.h>
-+#include <linux/clk.h>
-+#include <linux/if_vlan.h>
-+#include <linux/reset.h>
-+#include <linux/tcp.h>
-+
-+#include "mtk_eth_soc.h"
-+
-+static int mtk_msg_level = -1;
-+module_param_named(msg_level, mtk_msg_level, int, 0);
-+MODULE_PARM_DESC(msg_level, "Message level (-1=defaults,0=none,...,16=all)");
-+
-+#define MTK_ETHTOOL_STAT(x) { #x, \
-+			      offsetof(struct mtk_hw_stats, x) / sizeof(u64) }
-+
-+/* strings used by ethtool */
-+static const struct mtk_ethtool_stats {
-+	char str[ETH_GSTRING_LEN];
-+	u32 offset;
-+} mtk_ethtool_stats[] = {
-+	MTK_ETHTOOL_STAT(tx_bytes),
-+	MTK_ETHTOOL_STAT(tx_packets),
-+	MTK_ETHTOOL_STAT(tx_skip),
-+	MTK_ETHTOOL_STAT(tx_collisions),
-+	MTK_ETHTOOL_STAT(rx_bytes),
-+	MTK_ETHTOOL_STAT(rx_packets),
-+	MTK_ETHTOOL_STAT(rx_overflow),
-+	MTK_ETHTOOL_STAT(rx_fcs_errors),
-+	MTK_ETHTOOL_STAT(rx_short_errors),
-+	MTK_ETHTOOL_STAT(rx_long_errors),
-+	MTK_ETHTOOL_STAT(rx_checksum_errors),
-+	MTK_ETHTOOL_STAT(rx_flow_control_packets),
-+};
-+
-+void mtk_w32(struct mtk_eth *eth, u32 val, unsigned reg)
-+{
-+	__raw_writel(val, eth->base + reg);
-+}
-+
-+u32 mtk_r32(struct mtk_eth *eth, unsigned reg)
-+{
-+	return __raw_readl(eth->base + reg);
-+}
-+
-+static int mtk_mdio_busy_wait(struct mtk_eth *eth)
-+{
-+	unsigned long t_start = jiffies;
-+
-+	while (1) {
-+		if (!(mtk_r32(eth, MTK_PHY_IAC) & PHY_IAC_ACCESS))
-+			return 0;
-+		if (time_after(jiffies, t_start + PHY_IAC_TIMEOUT))
-+			break;
-+		usleep_range(10, 20);
-+	}
-+
-+	dev_err(eth->dev, "mdio: MDIO timeout\n");
-+	return -1;
-+}
-+
-+u32 _mtk_mdio_write(struct mtk_eth *eth, u32 phy_addr,
-+		    u32 phy_register, u32 write_data)
-+{
-+	if (mtk_mdio_busy_wait(eth))
-+		return -1;
-+
-+	write_data &= 0xffff;
-+
-+	mtk_w32(eth, PHY_IAC_ACCESS | PHY_IAC_START | PHY_IAC_WRITE |
-+		(phy_register << PHY_IAC_REG_SHIFT) |
-+		(phy_addr << PHY_IAC_ADDR_SHIFT) | write_data,
-+		MTK_PHY_IAC);
-+
-+	if (mtk_mdio_busy_wait(eth))
-+		return -1;
-+
-+	return 0;
-+}
-+
-+u32 _mtk_mdio_read(struct mtk_eth *eth, int phy_addr, int phy_reg)
-+{
-+	u32 d;
-+
-+	if (mtk_mdio_busy_wait(eth))
-+		return 0xffff;
-+
-+	mtk_w32(eth, PHY_IAC_ACCESS | PHY_IAC_START | PHY_IAC_READ |
-+		(phy_reg << PHY_IAC_REG_SHIFT) |
-+		(phy_addr << PHY_IAC_ADDR_SHIFT),
-+		MTK_PHY_IAC);
-+
-+	if (mtk_mdio_busy_wait(eth))
-+		return 0xffff;
-+
-+	d = mtk_r32(eth, MTK_PHY_IAC) & 0xffff;
-+
-+	return d;
-+}
-+
-+static int mtk_mdio_write(struct mii_bus *bus, int phy_addr,
-+			  int phy_reg, u16 val)
-+{
-+	struct mtk_eth *eth = bus->priv;
-+
-+	return _mtk_mdio_write(eth, phy_addr, phy_reg, val);
-+}
-+
-+static int mtk_mdio_read(struct mii_bus *bus, int phy_addr, int phy_reg)
-+{
-+	struct mtk_eth *eth = bus->priv;
-+
-+	return _mtk_mdio_read(eth, phy_addr, phy_reg);
-+}
-+
-+static void mtk_phy_link_adjust(struct net_device *dev)
-+{
-+	struct mtk_mac *mac = netdev_priv(dev);
-+	u32 mcr = MAC_MCR_MAX_RX_1536 | MAC_MCR_IPG_CFG |
-+		  MAC_MCR_FORCE_MODE | MAC_MCR_TX_EN |
-+		  MAC_MCR_RX_EN | MAC_MCR_BACKOFF_EN |
-+		  MAC_MCR_BACKPR_EN;
-+
-+	switch (mac->phy_dev->speed) {
-+	case SPEED_1000:
-+		mcr |= MAC_MCR_SPEED_1000;
-+		break;
-+	case SPEED_100:
-+		mcr |= MAC_MCR_SPEED_100;
-+		break;
-+	};
-+
-+	if (mac->phy_dev->link)
-+		mcr |= MAC_MCR_FORCE_LINK;
-+
-+	if (mac->phy_dev->duplex)
-+		mcr |= MAC_MCR_FORCE_DPX;
-+
-+	if (mac->phy_dev->pause)
-+		mcr |= MAC_MCR_FORCE_RX_FC | MAC_MCR_FORCE_TX_FC;
-+
-+	mtk_w32(mac->hw, mcr, MTK_MAC_MCR(mac->id));
-+
-+	if (mac->phy_dev->link)
-+		netif_carrier_on(dev);
-+	else
-+		netif_carrier_off(dev);
-+}
-+
-+static int mtk_phy_connect_node(struct mtk_eth *eth, struct mtk_mac *mac,
-+				struct device_node *phy_node)
-+{
-+	const __be32 *_addr = NULL;
-+	struct phy_device *phydev;
-+	int phy_mode, addr;
-+
-+	_addr = of_get_property(phy_node, "reg", NULL);
-+
-+	if (!_addr || (be32_to_cpu(*_addr) >= 0x20)) {
-+		pr_err("%s: invalid phy address\n", phy_node->name);
-+		return -EINVAL;
-+	}
-+	addr = be32_to_cpu(*_addr);
-+	phy_mode = of_get_phy_mode(phy_node);
-+	if (phy_mode < 0) {
-+		dev_err(eth->dev, "incorrect phy-mode %d\n", phy_mode);
-+		return -EINVAL;
-+	}
-+
-+	phydev = of_phy_connect(eth->netdev[mac->id], phy_node,
-+				mtk_phy_link_adjust, 0, phy_mode);
-+	if (IS_ERR(phydev)) {
-+		dev_err(eth->dev, "could not connect to PHY\n");
-+		return PTR_ERR(phydev);
-+	}
-+
-+	dev_info(eth->dev,
-+		 "connected mac %d to PHY at %s [uid=%08x, driver=%s]\n",
-+		 mac->id, phydev_name(phydev), phydev->phy_id,
-+		 phydev->drv->name);
-+
-+	mac->phy_dev = phydev;
-+
-+	return 0;
-+}
-+
-+static int mtk_phy_connect(struct mtk_mac *mac)
-+{
-+	struct mtk_eth *eth = mac->hw;
-+	struct device_node *np;
-+	u32 val, ge_mode;
-+
-+	np = of_parse_phandle(mac->of_node, "phy-handle", 0);
-+	if (!np)
-+		return -ENODEV;
-+
-+	switch (of_get_phy_mode(np)) {
-+	case PHY_INTERFACE_MODE_RGMII:
-+		ge_mode = 0;
-+		break;
-+	case PHY_INTERFACE_MODE_MII:
-+		ge_mode = 1;
-+		break;
-+	case PHY_INTERFACE_MODE_RMII:
-+		ge_mode = 2;
-+		break;
-+	default:
-+		dev_err(eth->dev, "invalid phy_mode\n");
-+		return -1;
-+	}
-+
-+	/* put the gmac into the right mode */
-+	regmap_read(eth->ethsys, ETHSYS_SYSCFG0, &val);
-+	val &= ~SYSCFG0_GE_MODE(SYSCFG0_GE_MASK, mac->id);
-+	val |= SYSCFG0_GE_MODE(ge_mode, mac->id);
-+	regmap_write(eth->ethsys, ETHSYS_SYSCFG0, val);
-+
-+	mtk_phy_connect_node(eth, mac, np);
-+	mac->phy_dev->autoneg = AUTONEG_ENABLE;
-+	mac->phy_dev->speed = 0;
-+	mac->phy_dev->duplex = 0;
-+	mac->phy_dev->supported &= PHY_BASIC_FEATURES;
-+	mac->phy_dev->advertising = mac->phy_dev->supported |
-+				    ADVERTISED_Autoneg;
-+	phy_start_aneg(mac->phy_dev);
-+
-+	return 0;
-+}
-+
-+static int mtk_mdio_init(struct mtk_eth *eth)
-+{
-+	struct device_node *mii_np;
-+	int err;
-+
-+	mii_np = of_get_child_by_name(eth->dev->of_node, "mdio-bus");
-+	if (!mii_np) {
-+		dev_err(eth->dev, "no %s child node found", "mdio-bus");
-+		return -ENODEV;
-+	}
-+
-+	if (!of_device_is_available(mii_np)) {
-+		err = 0;
-+		goto err_put_node;
-+	}
-+
-+	eth->mii_bus = mdiobus_alloc();
-+	if (!eth->mii_bus) {
-+		err = -ENOMEM;
-+		goto err_put_node;
-+	}
-+
-+	eth->mii_bus->name = "mdio";
-+	eth->mii_bus->read = mtk_mdio_read;
-+	eth->mii_bus->write = mtk_mdio_write;
-+	eth->mii_bus->priv = eth;
-+	eth->mii_bus->parent = eth->dev;
-+
-+	snprintf(eth->mii_bus->id, MII_BUS_ID_SIZE, "%s", mii_np->name);
-+	err = of_mdiobus_register(eth->mii_bus, mii_np);
-+	if (err)
-+		goto err_free_bus;
-+
-+	return 0;
-+
-+err_free_bus:
-+	kfree(eth->mii_bus);
-+
-+err_put_node:
-+	of_node_put(mii_np);
-+	eth->mii_bus = NULL;
-+	return err;
-+}
-+
-+static void mtk_mdio_cleanup(struct mtk_eth *eth)
-+{
-+	if (!eth->mii_bus)
-+		return;
-+
-+	mdiobus_unregister(eth->mii_bus);
-+	of_node_put(eth->mii_bus->dev.of_node);
-+	kfree(eth->mii_bus);
-+}
-+
-+static inline void mtk_irq_disable(struct mtk_eth *eth, u32 mask)
-+{
-+	u32 val;
-+
-+	val = mtk_r32(eth, MTK_QDMA_INT_MASK);
-+	mtk_w32(eth, val & ~mask, MTK_QDMA_INT_MASK);
-+	/* flush write */
-+	mtk_r32(eth, MTK_QDMA_INT_MASK);
-+}
-+
-+static inline void mtk_irq_enable(struct mtk_eth *eth, u32 mask)
-+{
-+	u32 val;
-+
-+	val = mtk_r32(eth, MTK_QDMA_INT_MASK);
-+	mtk_w32(eth, val | mask, MTK_QDMA_INT_MASK);
-+	/* flush write */
-+	mtk_r32(eth, MTK_QDMA_INT_MASK);
-+}
-+
-+static int mtk_set_mac_address(struct net_device *dev, void *p)
-+{
-+	int ret = eth_mac_addr(dev, p);
-+	struct mtk_mac *mac = netdev_priv(dev);
-+	const char *macaddr = dev->dev_addr;
-+	unsigned long flags;
-+
-+	if (ret)
-+		return ret;
-+
-+	spin_lock_irqsave(&mac->hw->page_lock, flags);
-+	mtk_w32(mac->hw, (macaddr[0] << 8) | macaddr[1],
-+		MTK_GDMA_MAC_ADRH(mac->id));
-+	mtk_w32(mac->hw, (macaddr[2] << 24) | (macaddr[3] << 16) |
-+		(macaddr[4] << 8) | macaddr[5],
-+		MTK_GDMA_MAC_ADRL(mac->id));
-+	spin_unlock_irqrestore(&mac->hw->page_lock, flags);
-+
-+	return 0;
-+}
-+
-+void mtk_stats_update_mac(struct mtk_mac *mac)
-+{
-+	struct mtk_hw_stats *hw_stats = mac->hw_stats;
-+	unsigned int base = MTK_GDM1_TX_GBCNT;
-+	u64 stats;
-+
-+	base += hw_stats->reg_offset;
-+
-+	u64_stats_update_begin(&hw_stats->syncp);
-+
-+	hw_stats->rx_bytes += mtk_r32(mac->hw, base);
-+	stats =  mtk_r32(mac->hw, base + 0x04);
-+	if (stats)
-+		hw_stats->rx_bytes += (stats << 32);
-+	hw_stats->rx_packets += mtk_r32(mac->hw, base + 0x08);
-+	hw_stats->rx_overflow += mtk_r32(mac->hw, base + 0x10);
-+	hw_stats->rx_fcs_errors += mtk_r32(mac->hw, base + 0x14);
-+	hw_stats->rx_short_errors += mtk_r32(mac->hw, base + 0x18);
-+	hw_stats->rx_long_errors += mtk_r32(mac->hw, base + 0x1c);
-+	hw_stats->rx_checksum_errors += mtk_r32(mac->hw, base + 0x20);
-+	hw_stats->rx_flow_control_packets +=
-+					mtk_r32(mac->hw, base + 0x24);
-+	hw_stats->tx_skip += mtk_r32(mac->hw, base + 0x28);
-+	hw_stats->tx_collisions += mtk_r32(mac->hw, base + 0x2c);
-+	hw_stats->tx_bytes += mtk_r32(mac->hw, base + 0x30);
-+	stats =  mtk_r32(mac->hw, base + 0x34);
-+	if (stats)
-+		hw_stats->tx_bytes += (stats << 32);
-+	hw_stats->tx_packets += mtk_r32(mac->hw, base + 0x38);
-+	u64_stats_update_end(&hw_stats->syncp);
-+}
-+
-+static void mtk_stats_update(struct mtk_eth *eth)
-+{
-+	int i;
-+
-+	for (i = 0; i < MTK_MAC_COUNT; i++) {
-+		if (!eth->mac[i] || !eth->mac[i]->hw_stats)
-+			continue;
-+		if (spin_trylock(&eth->mac[i]->hw_stats->stats_lock)) {
-+			mtk_stats_update_mac(eth->mac[i]);
-+			spin_unlock(&eth->mac[i]->hw_stats->stats_lock);
-+		}
-+	}
-+}
-+
-+static struct rtnl_link_stats64 *mtk_get_stats64(struct net_device *dev,
-+					struct rtnl_link_stats64 *storage)
-+{
-+	struct mtk_mac *mac = netdev_priv(dev);
-+	struct mtk_hw_stats *hw_stats = mac->hw_stats;
-+	unsigned int start;
-+
-+	if (netif_running(dev) && netif_device_present(dev)) {
-+		if (spin_trylock(&hw_stats->stats_lock)) {
-+			mtk_stats_update_mac(mac);
-+			spin_unlock(&hw_stats->stats_lock);
-+		}
-+	}
-+
-+	do {
-+		start = u64_stats_fetch_begin_irq(&hw_stats->syncp);
-+		storage->rx_packets = hw_stats->rx_packets;
-+		storage->tx_packets = hw_stats->tx_packets;
-+		storage->rx_bytes = hw_stats->rx_bytes;
-+		storage->tx_bytes = hw_stats->tx_bytes;
-+		storage->collisions = hw_stats->tx_collisions;
-+		storage->rx_length_errors = hw_stats->rx_short_errors +
-+			hw_stats->rx_long_errors;
-+		storage->rx_over_errors = hw_stats->rx_overflow;
-+		storage->rx_crc_errors = hw_stats->rx_fcs_errors;
-+		storage->rx_errors = hw_stats->rx_checksum_errors;
-+		storage->tx_aborted_errors = hw_stats->tx_skip;
-+	} while (u64_stats_fetch_retry_irq(&hw_stats->syncp, start));
-+
-+	storage->tx_errors = dev->stats.tx_errors;
-+	storage->rx_dropped = dev->stats.rx_dropped;
-+	storage->tx_dropped = dev->stats.tx_dropped;
-+
-+	return storage;
-+}
-+
-+static inline int mtk_max_frag_size(int mtu)
-+{
-+	/* make sure buf_size will be at least MTK_MAX_RX_LENGTH */
-+	if (mtu + MTK_RX_ETH_HLEN < MTK_MAX_RX_LENGTH)
-+		mtu = MTK_MAX_RX_LENGTH - MTK_RX_ETH_HLEN;
-+
-+	return SKB_DATA_ALIGN(MTK_RX_HLEN + mtu) +
-+		SKB_DATA_ALIGN(sizeof(struct skb_shared_info));
-+}
-+
-+static inline int mtk_max_buf_size(int frag_size)
-+{
-+	int buf_size = frag_size - NET_SKB_PAD - NET_IP_ALIGN -
-+		       SKB_DATA_ALIGN(sizeof(struct skb_shared_info));
-+
-+	WARN_ON(buf_size < MTK_MAX_RX_LENGTH);
-+
-+	return buf_size;
-+}
-+
-+static inline void mtk_rx_get_desc(struct mtk_rx_dma *rxd,
-+				   struct mtk_rx_dma *dma_rxd)
-+{
-+	rxd->rxd1 = READ_ONCE(dma_rxd->rxd1);
-+	rxd->rxd2 = READ_ONCE(dma_rxd->rxd2);
-+	rxd->rxd3 = READ_ONCE(dma_rxd->rxd3);
-+	rxd->rxd4 = READ_ONCE(dma_rxd->rxd4);
-+}
-+
-+/* the qdma core needs scratch memory to be setup */
-+static int mtk_init_fq_dma(struct mtk_eth *eth)
-+{
-+	unsigned int phy_ring_head, phy_ring_tail;
-+	int cnt = MTK_DMA_SIZE;
-+	dma_addr_t dma_addr;
-+	int i;
-+
-+	eth->scratch_ring = dma_alloc_coherent(eth->dev,
-+					       cnt * sizeof(struct mtk_tx_dma),
-+					       &phy_ring_head,
-+					       GFP_ATOMIC | __GFP_ZERO);
-+	if (unlikely(!eth->scratch_ring))
-+		return -ENOMEM;
-+
-+	eth->scratch_head = kcalloc(cnt, MTK_QDMA_PAGE_SIZE,
-+				    GFP_KERNEL);
-+	dma_addr = dma_map_single(eth->dev,
-+				  eth->scratch_head, cnt * MTK_QDMA_PAGE_SIZE,
-+				  DMA_FROM_DEVICE);
-+	if (unlikely(dma_mapping_error(eth->dev, dma_addr)))
-+		return -ENOMEM;
-+
-+	memset(eth->scratch_ring, 0x0, sizeof(struct mtk_tx_dma) * cnt);
-+	phy_ring_tail = phy_ring_head +
-+			(sizeof(struct mtk_tx_dma) * (cnt - 1));
-+
-+	for (i = 0; i < cnt; i++) {
-+		eth->scratch_ring[i].txd1 =
-+					(dma_addr + (i * MTK_QDMA_PAGE_SIZE));
-+		if (i < cnt - 1)
-+			eth->scratch_ring[i].txd2 = (phy_ring_head +
-+				((i + 1) * sizeof(struct mtk_tx_dma)));
-+		eth->scratch_ring[i].txd3 = TX_DMA_SDL(MTK_QDMA_PAGE_SIZE);
-+	}
-+
-+	mtk_w32(eth, phy_ring_head, MTK_QDMA_FQ_HEAD);
-+	mtk_w32(eth, phy_ring_tail, MTK_QDMA_FQ_TAIL);
-+	mtk_w32(eth, (cnt << 16) | cnt, MTK_QDMA_FQ_CNT);
-+	mtk_w32(eth, MTK_QDMA_PAGE_SIZE << 16, MTK_QDMA_FQ_BLEN);
-+
-+	return 0;
-+}
-+
-+static inline void *mtk_qdma_phys_to_virt(struct mtk_tx_ring *ring, u32 desc)
-+{
-+	void *ret = ring->dma;
-+
-+	return ret + (desc - ring->phys);
-+}
-+
-+static inline struct mtk_tx_buf *mtk_desc_to_tx_buf(struct mtk_tx_ring *ring,
-+						    struct mtk_tx_dma *txd)
-+{
-+	int idx = txd - ring->dma;
-+
-+	return &ring->buf[idx];
-+}
-+
-+static void mtk_tx_unmap(struct device *dev, struct mtk_tx_buf *tx_buf)
-+{
-+	if (tx_buf->flags & MTK_TX_FLAGS_SINGLE0) {
-+		dma_unmap_single(dev,
-+				 dma_unmap_addr(tx_buf, dma_addr0),
-+				 dma_unmap_len(tx_buf, dma_len0),
-+				 DMA_TO_DEVICE);
-+	} else if (tx_buf->flags & MTK_TX_FLAGS_PAGE0) {
-+		dma_unmap_page(dev,
-+			       dma_unmap_addr(tx_buf, dma_addr0),
-+			       dma_unmap_len(tx_buf, dma_len0),
-+			       DMA_TO_DEVICE);
-+	}
-+	tx_buf->flags = 0;
-+	if (tx_buf->skb &&
-+	    (tx_buf->skb != (struct sk_buff *)MTK_DMA_DUMMY_DESC))
-+		dev_kfree_skb_any(tx_buf->skb);
-+	tx_buf->skb = NULL;
-+}
-+
-+static int mtk_tx_map(struct sk_buff *skb, struct net_device *dev,
-+		      int tx_num, struct mtk_tx_ring *ring, bool gso)
-+{
-+	struct mtk_mac *mac = netdev_priv(dev);
-+	struct mtk_eth *eth = mac->hw;
-+	struct mtk_tx_dma *itxd, *txd;
-+	struct mtk_tx_buf *tx_buf;
-+	unsigned long flags;
-+	dma_addr_t mapped_addr;
-+	unsigned int nr_frags;
-+	int i, n_desc = 1;
-+	u32 txd4 = 0;
-+
-+	itxd = ring->next_free;
-+	if (itxd == ring->last_free)
-+		return -ENOMEM;
-+
-+	/* set the forward port */
-+	txd4 |= (mac->id + 1) << TX_DMA_FPORT_SHIFT;
-+
-+	tx_buf = mtk_desc_to_tx_buf(ring, itxd);
-+	memset(tx_buf, 0, sizeof(*tx_buf));
-+
-+	if (gso)
-+		txd4 |= TX_DMA_TSO;
-+
-+	/* TX Checksum offload */
-+	if (skb->ip_summed == CHECKSUM_PARTIAL)
-+		txd4 |= TX_DMA_CHKSUM;
-+
-+	/* VLAN header offload */
-+	if (skb_vlan_tag_present(skb))
-+		txd4 |= TX_DMA_INS_VLAN | skb_vlan_tag_get(skb);
-+
-+	mapped_addr = dma_map_single(&dev->dev, skb->data,
-+				     skb_headlen(skb), DMA_TO_DEVICE);
-+	if (unlikely(dma_mapping_error(&dev->dev, mapped_addr)))
-+		return -ENOMEM;
-+
-+	/* normally we can rely on the stack not calling this more than once,
-+	 * however we have 2 queues running ont he same ring so we need to lock
-+	 * the ring access
-+	 */
-+	spin_lock_irqsave(&eth->page_lock, flags);
-+	WRITE_ONCE(itxd->txd1, mapped_addr);
-+	tx_buf->flags |= MTK_TX_FLAGS_SINGLE0;
-+	dma_unmap_addr_set(tx_buf, dma_addr0, mapped_addr);
-+	dma_unmap_len_set(tx_buf, dma_len0, skb_headlen(skb));
-+
-+	/* TX SG offload */
-+	txd = itxd;
-+	nr_frags = skb_shinfo(skb)->nr_frags;
-+	for (i = 0; i < nr_frags; i++) {
-+		struct skb_frag_struct *frag = &skb_shinfo(skb)->frags[i];
-+		unsigned int offset = 0;
-+		int frag_size = skb_frag_size(frag);
-+
-+		while (frag_size) {
-+			bool last_frag = false;
-+			unsigned int frag_map_size;
-+
-+			txd = mtk_qdma_phys_to_virt(ring, txd->txd2);
-+			if (txd == ring->last_free)
-+				goto err_dma;
-+
-+			n_desc++;
-+			frag_map_size = min(frag_size, MTK_TX_DMA_BUF_LEN);
-+			mapped_addr = skb_frag_dma_map(&dev->dev, frag, offset,
-+						       frag_map_size,
-+						       DMA_TO_DEVICE);
-+			if (unlikely(dma_mapping_error(&dev->dev, mapped_addr)))
-+				goto err_dma;
-+
-+			if (i == nr_frags - 1 &&
-+			    (frag_size - frag_map_size) == 0)
-+				last_frag = true;
-+
-+			WRITE_ONCE(txd->txd1, mapped_addr);
-+			WRITE_ONCE(txd->txd3, (TX_DMA_SWC |
-+					       TX_DMA_PLEN0(frag_map_size) |
-+					       last_frag * TX_DMA_LS0) |
-+					       mac->id);
-+			WRITE_ONCE(txd->txd4, 0);
-+
-+			tx_buf->skb = (struct sk_buff *)MTK_DMA_DUMMY_DESC;
-+			tx_buf = mtk_desc_to_tx_buf(ring, txd);
-+			memset(tx_buf, 0, sizeof(*tx_buf));
-+
-+			tx_buf->flags |= MTK_TX_FLAGS_PAGE0;
-+			dma_unmap_addr_set(tx_buf, dma_addr0, mapped_addr);
-+			dma_unmap_len_set(tx_buf, dma_len0, frag_map_size);
-+			frag_size -= frag_map_size;
-+			offset += frag_map_size;
-+		}
-+	}
-+
-+	/* store skb to cleanup */
-+	tx_buf->skb = skb;
-+
-+	WRITE_ONCE(itxd->txd4, txd4);
-+	WRITE_ONCE(itxd->txd3, (TX_DMA_SWC | TX_DMA_PLEN0(skb_headlen(skb)) |
-+				(!nr_frags * TX_DMA_LS0)));
-+
-+	spin_unlock_irqrestore(&eth->page_lock, flags);
-+
-+	netdev_sent_queue(dev, skb->len);
-+	skb_tx_timestamp(skb);
-+
-+	ring->next_free = mtk_qdma_phys_to_virt(ring, txd->txd2);
-+	atomic_sub(n_desc, &ring->free_count);
-+
-+	/* make sure that all changes to the dma ring are flushed before we
-+	 * continue
-+	 */
-+	wmb();
-+
-+	if (netif_xmit_stopped(netdev_get_tx_queue(dev, 0)) || !skb->xmit_more)
-+		mtk_w32(eth, txd->txd2, MTK_QTX_CTX_PTR);
-+
-+	return 0;
-+
-+err_dma:
-+	do {
-+		tx_buf = mtk_desc_to_tx_buf(ring, txd);
-+
-+		/* unmap dma */
-+		mtk_tx_unmap(&dev->dev, tx_buf);
-+
-+		itxd->txd3 = TX_DMA_LS0 | TX_DMA_OWNER_CPU;
-+		itxd = mtk_qdma_phys_to_virt(ring, itxd->txd2);
-+	} while (itxd != txd);
-+
-+	return -ENOMEM;
-+}
-+
-+static inline int mtk_cal_txd_req(struct sk_buff *skb)
-+{
-+	int i, nfrags;
-+	struct skb_frag_struct *frag;
-+
-+	nfrags = 1;
-+	if (skb_is_gso(skb)) {
-+		for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
-+			frag = &skb_shinfo(skb)->frags[i];
-+			nfrags += DIV_ROUND_UP(frag->size, MTK_TX_DMA_BUF_LEN);
-+		}
-+	} else {
-+		nfrags += skb_shinfo(skb)->nr_frags;
-+	}
-+
-+	return DIV_ROUND_UP(nfrags, 2);
-+}
-+
-+static int mtk_start_xmit(struct sk_buff *skb, struct net_device *dev)
-+{
-+	struct mtk_mac *mac = netdev_priv(dev);
-+	struct mtk_eth *eth = mac->hw;
-+	struct mtk_tx_ring *ring = &eth->tx_ring;
-+	struct net_device_stats *stats = &dev->stats;
-+	bool gso = false;
-+	int tx_num;
-+
-+	tx_num = mtk_cal_txd_req(skb);
-+	if (unlikely(atomic_read(&ring->free_count) <= tx_num)) {
-+		netif_stop_queue(dev);
-+		netif_err(eth, tx_queued, dev,
-+			  "Tx Ring full when queue awake!\n");
-+		return NETDEV_TX_BUSY;
-+	}
-+
-+	/* TSO: fill MSS info in tcp checksum field */
-+	if (skb_is_gso(skb)) {
-+		if (skb_cow_head(skb, 0)) {
-+			netif_warn(eth, tx_err, dev,
-+				   "GSO expand head fail.\n");
-+			goto drop;
-+		}
-+
-+		if (skb_shinfo(skb)->gso_type &
-+				(SKB_GSO_TCPV4 | SKB_GSO_TCPV6)) {
-+			gso = true;
-+			tcp_hdr(skb)->check = htons(skb_shinfo(skb)->gso_size);
-+		}
-+	}
-+
-+	if (mtk_tx_map(skb, dev, tx_num, ring, gso) < 0)
-+		goto drop;
-+
-+	if (unlikely(atomic_read(&ring->free_count) <= ring->thresh)) {
-+		netif_stop_queue(dev);
-+		if (unlikely(atomic_read(&ring->free_count) >
-+			     ring->thresh))
-+			netif_wake_queue(dev);
-+	}
-+
-+	return NETDEV_TX_OK;
-+
-+drop:
-+	stats->tx_dropped++;
-+	dev_kfree_skb(skb);
-+	return NETDEV_TX_OK;
-+}
-+
-+static int mtk_poll_rx(struct napi_struct *napi, int budget,
-+		       struct mtk_eth *eth, u32 rx_intr)
-+{
-+	struct mtk_rx_ring *ring = &eth->rx_ring;
-+	int idx = ring->calc_idx;
-+	struct sk_buff *skb;
-+	u8 *data, *new_data;
-+	struct mtk_rx_dma *rxd, trxd;
-+	int done = 0;
-+
-+	while (done < budget) {
-+		struct net_device *netdev;
-+		unsigned int pktlen;
-+		dma_addr_t dma_addr;
-+		int mac = 0;
-+
-+		idx = NEXT_RX_DESP_IDX(idx);
-+		rxd = &ring->dma[idx];
-+		data = ring->data[idx];
-+
-+		mtk_rx_get_desc(&trxd, rxd);
-+		if (!(trxd.rxd2 & RX_DMA_DONE))
-+			break;
-+
-+		/* find out which mac the packet come from. values start at 1 */
-+		mac = (trxd.rxd4 >> RX_DMA_FPORT_SHIFT) &
-+		      RX_DMA_FPORT_MASK;
-+		mac--;
-+
-+		netdev = eth->netdev[mac];
-+
-+		/* alloc new buffer */
-+		new_data = napi_alloc_frag(ring->frag_size);
-+		if (unlikely(!new_data)) {
-+			netdev->stats.rx_dropped++;
-+			goto release_desc;
-+		}
-+		dma_addr = dma_map_single(&eth->netdev[mac]->dev,
-+					  new_data + NET_SKB_PAD,
-+					  ring->buf_size,
-+					  DMA_FROM_DEVICE);
-+		if (unlikely(dma_mapping_error(&netdev->dev, dma_addr))) {
-+			skb_free_frag(new_data);
-+			goto release_desc;
-+		}
-+
-+		/* receive data */
-+		skb = build_skb(data, ring->frag_size);
-+		if (unlikely(!skb)) {
-+			put_page(virt_to_head_page(new_data));
-+			goto release_desc;
-+		}
-+		skb_reserve(skb, NET_SKB_PAD + NET_IP_ALIGN);
-+
-+		dma_unmap_single(&netdev->dev, trxd.rxd1,
-+				 ring->buf_size, DMA_FROM_DEVICE);
-+		pktlen = RX_DMA_GET_PLEN0(trxd.rxd2);
-+		skb->dev = netdev;
-+		skb_put(skb, pktlen);
-+		if (trxd.rxd4 & RX_DMA_L4_VALID)
-+			skb->ip_summed = CHECKSUM_UNNECESSARY;
-+		else
-+			skb_checksum_none_assert(skb);
-+		skb->protocol = eth_type_trans(skb, netdev);
-+
-+		if (netdev->features & NETIF_F_HW_VLAN_CTAG_RX &&
-+		    RX_DMA_VID(trxd.rxd3))
-+			__vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q),
-+					       RX_DMA_VID(trxd.rxd3));
-+		napi_gro_receive(napi, skb);
-+
-+		ring->data[idx] = new_data;
-+		rxd->rxd1 = (unsigned int)dma_addr;
-+
-+release_desc:
-+		rxd->rxd2 = RX_DMA_PLEN0(ring->buf_size);
-+
-+		ring->calc_idx = idx;
-+		/* make sure that all changes to the dma ring are flushed before
-+		 * we continue
-+		 */
-+		wmb();
-+		mtk_w32(eth, ring->calc_idx, MTK_QRX_CRX_IDX0);
-+		done++;
-+	}
-+
-+	if (done < budget)
-+		mtk_w32(eth, rx_intr, MTK_QMTK_INT_STATUS);
-+
-+	return done;
-+}
-+
-+static int mtk_poll_tx(struct mtk_eth *eth, int budget, bool *tx_again)
-+{
-+	struct mtk_tx_ring *ring = &eth->tx_ring;
-+	struct mtk_tx_dma *desc;
-+	struct sk_buff *skb;
-+	struct mtk_tx_buf *tx_buf;
-+	int total = 0, done[MTK_MAX_DEVS];
-+	unsigned int bytes[MTK_MAX_DEVS];
-+	u32 cpu, dma;
-+	static int condition;
-+	int i;
-+
-+	memset(done, 0, sizeof(done));
-+	memset(bytes, 0, sizeof(bytes));
-+
-+	cpu = mtk_r32(eth, MTK_QTX_CRX_PTR);
-+	dma = mtk_r32(eth, MTK_QTX_DRX_PTR);
-+
-+	desc = mtk_qdma_phys_to_virt(ring, cpu);
-+
-+	while ((cpu != dma) && budget) {
-+		u32 next_cpu = desc->txd2;
-+		int mac;
-+
-+		desc = mtk_qdma_phys_to_virt(ring, desc->txd2);
-+		if ((desc->txd3 & TX_DMA_OWNER_CPU) == 0)
-+			break;
-+
-+		mac = (desc->txd4 >> TX_DMA_FPORT_SHIFT) &
-+		       TX_DMA_FPORT_MASK;
-+		mac--;
-+
-+		tx_buf = mtk_desc_to_tx_buf(ring, desc);
-+		skb = tx_buf->skb;
-+		if (!skb) {
-+			condition = 1;
-+			break;
-+		}
-+
-+		if (skb != (struct sk_buff *)MTK_DMA_DUMMY_DESC) {
-+			bytes[mac] += skb->len;
-+			done[mac]++;
-+			budget--;
-+		}
-+		mtk_tx_unmap(eth->dev, tx_buf);
-+
-+		ring->last_free->txd2 = next_cpu;
-+		ring->last_free = desc;
-+		atomic_inc(&ring->free_count);
-+
-+		cpu = next_cpu;
-+	}
-+
-+	mtk_w32(eth, cpu, MTK_QTX_CRX_PTR);
-+
-+	for (i = 0; i < MTK_MAC_COUNT; i++) {
-+		if (!eth->netdev[i] || !done[i])
-+			continue;
-+		netdev_completed_queue(eth->netdev[i], done[i], bytes[i]);
-+		total += done[i];
-+	}
-+
-+	/* read hw index again make sure no new tx packet */
-+	if (cpu != dma || cpu != mtk_r32(eth, MTK_QTX_DRX_PTR))
-+		*tx_again = true;
-+	else
-+		mtk_w32(eth, MTK_TX_DONE_INT, MTK_QMTK_INT_STATUS);
-+
-+	if (!total)
-+		return 0;
-+
-+	for (i = 0; i < MTK_MAC_COUNT; i++) {
-+		if (!eth->netdev[i] ||
-+		    unlikely(!netif_queue_stopped(eth->netdev[i])))
-+			continue;
-+		if (atomic_read(&ring->free_count) > ring->thresh)
-+			netif_wake_queue(eth->netdev[i]);
-+	}
-+
-+	return total;
-+}
-+
-+static int mtk_poll(struct napi_struct *napi, int budget)
-+{
-+	struct mtk_eth *eth = container_of(napi, struct mtk_eth, rx_napi);
-+	u32 status, status2, mask, tx_intr, rx_intr, status_intr;
-+	int tx_done, rx_done;
-+	bool tx_again = false;
-+
-+	status = mtk_r32(eth, MTK_QMTK_INT_STATUS);
-+	status2 = mtk_r32(eth, MTK_INT_STATUS2);
-+	tx_intr = MTK_TX_DONE_INT;
-+	rx_intr = MTK_RX_DONE_INT;
-+	status_intr = (MTK_GDM1_AF | MTK_GDM2_AF);
-+	tx_done = 0;
-+	rx_done = 0;
-+	tx_again = 0;
-+
-+	if (status & tx_intr)
-+		tx_done = mtk_poll_tx(eth, budget, &tx_again);
-+
-+	if (status & rx_intr)
-+		rx_done = mtk_poll_rx(napi, budget, eth, rx_intr);
-+
-+	if (unlikely(status2 & status_intr)) {
-+		mtk_stats_update(eth);
-+		mtk_w32(eth, status_intr, MTK_INT_STATUS2);
-+	}
-+
-+	if (unlikely(netif_msg_intr(eth))) {
-+		mask = mtk_r32(eth, MTK_QDMA_INT_MASK);
-+		netdev_info(eth->netdev[0],
-+			    "done tx %d, rx %d, intr 0x%08x/0x%x\n",
-+			    tx_done, rx_done, status, mask);
-+	}
-+
-+	if (tx_again || rx_done == budget)
-+		return budget;
-+
-+	status = mtk_r32(eth, MTK_QMTK_INT_STATUS);
-+	if (status & (tx_intr | rx_intr))
-+		return budget;
-+
-+	napi_complete(napi);
-+	mtk_irq_enable(eth, tx_intr | rx_intr);
-+
-+	return rx_done;
-+}
-+
-+static int mtk_tx_alloc(struct mtk_eth *eth)
-+{
-+	struct mtk_tx_ring *ring = &eth->tx_ring;
-+	int i, sz = sizeof(*ring->dma);
-+
-+	ring->buf = kcalloc(MTK_DMA_SIZE, sizeof(*ring->buf),
-+			       GFP_KERNEL);
-+	if (!ring->buf)
-+		goto no_tx_mem;
-+
-+	ring->dma = dma_alloc_coherent(eth->dev,
-+					  MTK_DMA_SIZE * sz,
-+					  &ring->phys,
-+					  GFP_ATOMIC | __GFP_ZERO);
-+	if (!ring->dma)
-+		goto no_tx_mem;
-+
-+	memset(ring->dma, 0, MTK_DMA_SIZE * sz);
-+	for (i = 0; i < MTK_DMA_SIZE; i++) {
-+		int next = (i + 1) % MTK_DMA_SIZE;
-+		u32 next_ptr = ring->phys + next * sz;
-+
-+		ring->dma[i].txd2 = next_ptr;
-+		ring->dma[i].txd3 = TX_DMA_LS0 | TX_DMA_OWNER_CPU;
-+	}
-+
-+	atomic_set(&ring->free_count, MTK_DMA_SIZE - 2);
-+	ring->next_free = &ring->dma[0];
-+	ring->last_free = &ring->dma[MTK_DMA_SIZE - 2];
-+	ring->thresh = max((unsigned long)MTK_DMA_SIZE >> 2,
-+			      MAX_SKB_FRAGS);
-+
-+	/* make sure that all changes to the dma ring are flushed before we
-+	 * continue
-+	 */
-+	wmb();
-+
-+	mtk_w32(eth, ring->phys, MTK_QTX_CTX_PTR);
-+	mtk_w32(eth, ring->phys, MTK_QTX_DTX_PTR);
-+	mtk_w32(eth,
-+		ring->phys + ((MTK_DMA_SIZE - 1) * sz),
-+		MTK_QTX_CRX_PTR);
-+	mtk_w32(eth,
-+		ring->phys + ((MTK_DMA_SIZE - 1) * sz),
-+		MTK_QTX_DRX_PTR);
-+
-+	return 0;
-+
-+no_tx_mem:
-+	return -ENOMEM;
-+}
-+
-+static void mtk_tx_clean(struct mtk_eth *eth)
-+{
-+	struct mtk_tx_ring *ring = &eth->tx_ring;
-+	int i;
-+
-+	if (ring->buf) {
-+		for (i = 0; i < MTK_DMA_SIZE; i++)
-+			mtk_tx_unmap(eth->dev, &ring->buf[i]);
-+		kfree(ring->buf);
-+		ring->buf = NULL;
-+	}
-+
-+	if (ring->dma) {
-+		dma_free_coherent(eth->dev,
-+				  MTK_DMA_SIZE * sizeof(*ring->dma),
-+				  ring->dma,
-+				  ring->phys);
-+		ring->dma = NULL;
-+	}
-+}
-+
-+static int mtk_rx_alloc(struct mtk_eth *eth)
-+{
-+	struct mtk_rx_ring *ring = &eth->rx_ring;
-+	int i;
-+
-+	ring->frag_size = mtk_max_frag_size(ETH_DATA_LEN);
-+	ring->buf_size = mtk_max_buf_size(ring->frag_size);
-+	ring->data = kcalloc(MTK_DMA_SIZE, sizeof(*ring->data),
-+			     GFP_KERNEL);
-+	if (!ring->data)
-+		return -ENOMEM;
-+
-+	for (i = 0; i < MTK_DMA_SIZE; i++) {
-+		ring->data[i] = netdev_alloc_frag(ring->frag_size);
-+		if (!ring->data[i])
-+			return -ENOMEM;
-+	}
-+
-+	ring->dma = dma_alloc_coherent(eth->dev,
-+				       MTK_DMA_SIZE * sizeof(*ring->dma),
-+				       &ring->phys,
-+				       GFP_ATOMIC | __GFP_ZERO);
-+	if (!ring->dma)
-+		return -ENOMEM;
-+
-+	for (i = 0; i < MTK_DMA_SIZE; i++) {
-+		dma_addr_t dma_addr = dma_map_single(eth->dev,
-+				ring->data[i] + NET_SKB_PAD,
-+				ring->buf_size,
-+				DMA_FROM_DEVICE);
-+		if (unlikely(dma_mapping_error(eth->dev, dma_addr)))
-+			return -ENOMEM;
-+		ring->dma[i].rxd1 = (unsigned int)dma_addr;
-+
-+		ring->dma[i].rxd2 = RX_DMA_PLEN0(ring->buf_size);
-+	}
-+	ring->calc_idx = MTK_DMA_SIZE - 1;
-+	/* make sure that all changes to the dma ring are flushed before we
-+	 * continue
-+	 */
-+	wmb();
-+
-+	mtk_w32(eth, eth->rx_ring.phys, MTK_QRX_BASE_PTR0);
-+	mtk_w32(eth, MTK_DMA_SIZE, MTK_QRX_MAX_CNT0);
-+	mtk_w32(eth, eth->rx_ring.calc_idx, MTK_QRX_CRX_IDX0);
-+	mtk_w32(eth, MTK_PST_DRX_IDX0, MTK_QDMA_RST_IDX);
-+	mtk_w32(eth, (QDMA_RES_THRES << 8) | QDMA_RES_THRES, MTK_QTX_CFG(0));
-+
-+	return 0;
-+}
-+
-+static void mtk_rx_clean(struct mtk_eth *eth)
-+{
-+	struct mtk_rx_ring *ring = &eth->rx_ring;
-+	int i;
-+
-+	if (ring->data && ring->dma) {
-+		for (i = 0; i < MTK_DMA_SIZE; i++) {
-+			if (!ring->data[i])
-+				continue;
-+			if (!ring->dma[i].rxd1)
-+				continue;
-+			dma_unmap_single(eth->dev,
-+					 ring->dma[i].rxd1,
-+					 ring->buf_size,
-+					 DMA_FROM_DEVICE);
-+			skb_free_frag(ring->data[i]);
-+		}
-+		kfree(ring->data);
-+		ring->data = NULL;
-+	}
-+
-+	if (ring->dma) {
-+		dma_free_coherent(eth->dev,
-+				  MTK_DMA_SIZE * sizeof(*ring->dma),
-+				  ring->dma,
-+				  ring->phys);
-+		ring->dma = NULL;
-+	}
-+}
-+
-+/* wait for DMA to finish whatever it is doing before we start using it again */
-+static int mtk_dma_busy_wait(struct mtk_eth *eth)
-+{
-+	unsigned long t_start = jiffies;
-+
-+	while (1) {
-+		if (!(mtk_r32(eth, MTK_QDMA_GLO_CFG) &
-+		      (MTK_RX_DMA_BUSY | MTK_TX_DMA_BUSY)))
-+			return 0;
-+		if (time_after(jiffies, t_start + MTK_DMA_BUSY_TIMEOUT))
-+			break;
-+	}
-+
-+	dev_err(eth->dev, "DMA init timeout\n");
-+	return -1;
-+}
-+
-+static int mtk_dma_init(struct mtk_eth *eth)
-+{
-+	int err;
-+
-+	if (mtk_dma_busy_wait(eth))
-+		return -EBUSY;
-+
-+	/* QDMA needs scratch memory for internal reordering of the
-+	 * descriptors
-+	 */
-+	err = mtk_init_fq_dma(eth);
-+	if (err)
-+		return err;
-+
-+	err = mtk_tx_alloc(eth);
-+	if (err)
-+		return err;
-+
-+	err = mtk_rx_alloc(eth);
-+	if (err)
-+		return err;
-+
-+	/* Enable random early drop and set drop threshold automatically */
-+	mtk_w32(eth, FC_THRES_DROP_MODE | FC_THRES_DROP_EN | FC_THRES_MIN,
-+		MTK_QDMA_FC_THRES);
-+	mtk_w32(eth, 0x0, MTK_QDMA_HRED2);
-+
-+	return 0;
-+}
-+
-+static void mtk_dma_free(struct mtk_eth *eth)
-+{
-+	int i;
-+
-+	for (i = 0; i < MTK_MAC_COUNT; i++)
-+		if (eth->netdev[i])
-+			netdev_reset_queue(eth->netdev[i]);
-+	mtk_tx_clean(eth);
-+	mtk_rx_clean(eth);
-+	kfree(eth->scratch_head);
-+}
-+
-+static void mtk_tx_timeout(struct net_device *dev)
-+{
-+	struct mtk_mac *mac = netdev_priv(dev);
-+	struct mtk_eth *eth = mac->hw;
-+
-+	eth->netdev[mac->id]->stats.tx_errors++;
-+	netif_err(eth, tx_err, dev,
-+		  "transmit timed out\n");
-+	schedule_work(&mac->pending_work);
-+}
-+
-+static irqreturn_t mtk_handle_irq(int irq, void *_eth)
-+{
-+	struct mtk_eth *eth = _eth;
-+	u32 status;
-+
-+	status = mtk_r32(eth, MTK_QMTK_INT_STATUS);
-+	if (unlikely(!status))
-+		return IRQ_NONE;
-+
-+	if (likely(status & (MTK_RX_DONE_INT | MTK_TX_DONE_INT))) {
-+		if (likely(napi_schedule_prep(&eth->rx_napi)))
-+			__napi_schedule(&eth->rx_napi);
-+	} else {
-+		mtk_w32(eth, status, MTK_QMTK_INT_STATUS);
-+	}
-+	mtk_irq_disable(eth, (MTK_RX_DONE_INT | MTK_TX_DONE_INT));
-+
-+	return IRQ_HANDLED;
-+}
-+
-+#ifdef CONFIG_NET_POLL_CONTROLLER
-+static void mtk_poll_controller(struct net_device *dev)
-+{
-+	struct mtk_mac *mac = netdev_priv(dev);
-+	struct mtk_eth *eth = mac->hw;
-+	u32 int_mask = MTK_TX_DONE_INT | MTK_RX_DONE_INT;
-+
-+	mtk_irq_disable(eth, int_mask);
-+	mtk_handle_irq(dev->irq, dev);
-+	mtk_irq_enable(eth, int_mask);
-+}
-+#endif
-+
-+static int mtk_start_dma(struct mtk_eth *eth)
-+{
-+	int err;
-+
-+	err = mtk_dma_init(eth);
-+	if (err) {
-+		mtk_dma_free(eth);
-+		return err;
-+	}
-+
-+	mtk_w32(eth,
-+		MTK_TX_WB_DDONE | MTK_RX_DMA_EN | MTK_TX_DMA_EN |
-+		MTK_RX_2B_OFFSET | MTK_DMA_SIZE_16DWORDS |
-+		MTK_RX_BT_32DWORDS,
-+		MTK_QDMA_GLO_CFG);
-+
-+	return 0;
-+}
-+
-+static int mtk_open(struct net_device *dev)
-+{
-+	struct mtk_mac *mac = netdev_priv(dev);
-+	struct mtk_eth *eth = mac->hw;
-+
-+	/* we run 2 netdevs on the same dma ring so we only bring it up once */
-+	if (!atomic_read(&eth->dma_refcnt)) {
-+		int err = mtk_start_dma(eth);
-+
-+		if (err)
-+			return err;
-+
-+		napi_enable(&eth->rx_napi);
-+		mtk_irq_enable(eth, MTK_TX_DONE_INT | MTK_RX_DONE_INT);
-+	}
-+	atomic_inc(&eth->dma_refcnt);
-+
-+	phy_start(mac->phy_dev);
-+	netif_start_queue(dev);
-+
-+	return 0;
-+}
-+
-+static void mtk_stop_dma(struct mtk_eth *eth, u32 glo_cfg)
-+{
-+	unsigned long flags;
-+	u32 val;
-+	int i;
-+
-+	/* stop the dma engine */
-+	spin_lock_irqsave(&eth->page_lock, flags);
-+	val = mtk_r32(eth, glo_cfg);
-+	mtk_w32(eth, val & ~(MTK_TX_WB_DDONE | MTK_RX_DMA_EN | MTK_TX_DMA_EN),
-+		glo_cfg);
-+	spin_unlock_irqrestore(&eth->page_lock, flags);
-+
-+	/* wait for dma stop */
-+	for (i = 0; i < 10; i++) {
-+		val = mtk_r32(eth, glo_cfg);
-+		if (val & (MTK_TX_DMA_BUSY | MTK_RX_DMA_BUSY)) {
-+			msleep(20);
-+			continue;
-+		}
-+		break;
-+	}
-+}
-+
-+static int mtk_stop(struct net_device *dev)
-+{
-+	struct mtk_mac *mac = netdev_priv(dev);
-+	struct mtk_eth *eth = mac->hw;
-+
-+	netif_tx_disable(dev);
-+	phy_stop(mac->phy_dev);
-+
-+	/* only shutdown DMA if this is the last user */
-+	if (!atomic_dec_and_test(&eth->dma_refcnt))
-+		return 0;
-+
-+	mtk_irq_disable(eth, MTK_TX_DONE_INT | MTK_RX_DONE_INT);
-+	napi_disable(&eth->rx_napi);
-+
-+	mtk_stop_dma(eth, MTK_QDMA_GLO_CFG);
-+
-+	mtk_dma_free(eth);
-+
-+	return 0;
-+}
-+
-+static int __init mtk_hw_init(struct mtk_eth *eth)
-+{
-+	int err, i;
-+
-+	/* reset the frame engine */
-+	reset_control_assert(eth->rstc);
-+	usleep_range(10, 20);
-+	reset_control_deassert(eth->rstc);
-+	usleep_range(10, 20);
-+
-+	/* Set GE2 driving and slew rate */
-+	regmap_write(eth->pctl, GPIO_DRV_SEL10, 0xa00);
-+
-+	/* set GE2 TDSEL */
-+	regmap_write(eth->pctl, GPIO_OD33_CTRL8, 0x5);
-+
-+	/* set GE2 TUNE */
-+	regmap_write(eth->pctl, GPIO_BIAS_CTRL, 0x0);
-+
-+	/* GE1, Force 1000M/FD, FC ON */
-+	mtk_w32(eth, MAC_MCR_FIXED_LINK, MTK_MAC_MCR(0));
-+
-+	/* GE2, Force 1000M/FD, FC ON */
-+	mtk_w32(eth, MAC_MCR_FIXED_LINK, MTK_MAC_MCR(1));
-+
-+	/* Enable RX VLan Offloading */
-+	mtk_w32(eth, 1, MTK_CDMP_EG_CTRL);
-+
-+	err = devm_request_irq(eth->dev, eth->irq, mtk_handle_irq, 0,
-+			       dev_name(eth->dev), eth);
-+	if (err)
-+		return err;
-+
-+	err = mtk_mdio_init(eth);
-+	if (err)
-+		return err;
-+
-+	/* disable delay and normal interrupt */
-+	mtk_w32(eth, 0, MTK_QDMA_DELAY_INT);
-+	mtk_irq_disable(eth, MTK_TX_DONE_INT | MTK_RX_DONE_INT);
-+	mtk_w32(eth, RST_GL_PSE, MTK_RST_GL);
-+	mtk_w32(eth, 0, MTK_RST_GL);
-+
-+	/* FE int grouping */
-+	mtk_w32(eth, 0, MTK_FE_INT_GRP);
-+
-+	for (i = 0; i < 2; i++) {
-+		u32 val = mtk_r32(eth, MTK_GDMA_FWD_CFG(i));
-+
-+		/* setup the forward port to send frame to QDMA */
-+		val &= ~0xffff;
-+		val |= 0x5555;
-+
-+		/* Enable RX checksum */
-+		val |= MTK_GDMA_ICS_EN | MTK_GDMA_TCS_EN | MTK_GDMA_UCS_EN;
-+
-+		/* setup the mac dma */
-+		mtk_w32(eth, val, MTK_GDMA_FWD_CFG(i));
-+	}
-+
-+	return 0;
-+}
-+
-+static int __init mtk_init(struct net_device *dev)
-+{
-+	struct mtk_mac *mac = netdev_priv(dev);
-+	struct mtk_eth *eth = mac->hw;
-+	const char *mac_addr;
-+
-+	mac_addr = of_get_mac_address(mac->of_node);
-+	if (mac_addr)
-+		ether_addr_copy(dev->dev_addr, mac_addr);
-+
-+	/* If the mac address is invalid, use random mac address  */
-+	if (!is_valid_ether_addr(dev->dev_addr)) {
-+		random_ether_addr(dev->dev_addr);
-+		dev_err(eth->dev, "generated random MAC address %pM\n",
-+			dev->dev_addr);
-+		dev->addr_assign_type = NET_ADDR_RANDOM;
-+	}
-+
-+	return mtk_phy_connect(mac);
-+}
-+
-+static void mtk_uninit(struct net_device *dev)
-+{
-+	struct mtk_mac *mac = netdev_priv(dev);
-+	struct mtk_eth *eth = mac->hw;
-+
-+	phy_disconnect(mac->phy_dev);
-+	mtk_mdio_cleanup(eth);
-+	mtk_irq_disable(eth, ~0);
-+	free_irq(dev->irq, dev);
-+}
-+
-+static int mtk_do_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
-+{
-+	struct mtk_mac *mac = netdev_priv(dev);
-+
-+	switch (cmd) {
-+	case SIOCGMIIPHY:
-+	case SIOCGMIIREG:
-+	case SIOCSMIIREG:
-+		return phy_mii_ioctl(mac->phy_dev, ifr, cmd);
-+	default:
-+		break;
-+	}
-+
-+	return -EOPNOTSUPP;
-+}
-+
-+static void mtk_pending_work(struct work_struct *work)
-+{
-+	struct mtk_mac *mac = container_of(work, struct mtk_mac, pending_work);
-+	struct mtk_eth *eth = mac->hw;
-+	struct net_device *dev = eth->netdev[mac->id];
-+	int err;
-+
-+	rtnl_lock();
-+	mtk_stop(dev);
-+
-+	err = mtk_open(dev);
-+	if (err) {
-+		netif_alert(eth, ifup, dev,
-+			    "Driver up/down cycle failed, closing device.\n");
-+		dev_close(dev);
-+	}
-+	rtnl_unlock();
-+}
-+
-+static int mtk_cleanup(struct mtk_eth *eth)
-+{
-+	int i;
-+
-+	for (i = 0; i < MTK_MAC_COUNT; i++) {
-+		struct mtk_mac *mac = netdev_priv(eth->netdev[i]);
-+
-+		if (!eth->netdev[i])
-+			continue;
-+
-+		unregister_netdev(eth->netdev[i]);
-+		free_netdev(eth->netdev[i]);
-+		cancel_work_sync(&mac->pending_work);
-+	}
-+
-+	return 0;
-+}
-+
-+static int mtk_get_settings(struct net_device *dev,
-+			    struct ethtool_cmd *cmd)
-+{
-+	struct mtk_mac *mac = netdev_priv(dev);
-+	int err;
-+
-+	err = phy_read_status(mac->phy_dev);
-+	if (err)
-+		return -ENODEV;
-+
-+	return phy_ethtool_gset(mac->phy_dev, cmd);
-+}
-+
-+static int mtk_set_settings(struct net_device *dev,
-+			    struct ethtool_cmd *cmd)
-+{
-+	struct mtk_mac *mac = netdev_priv(dev);
-+
-+	if (cmd->phy_address != mac->phy_dev->mdio.addr) {
-+		mac->phy_dev = mdiobus_get_phy(mac->hw->mii_bus,
-+					       cmd->phy_address);
-+		if (!mac->phy_dev)
-+			return -ENODEV;
-+	}
-+
-+	return phy_ethtool_sset(mac->phy_dev, cmd);
-+}
-+
-+static void mtk_get_drvinfo(struct net_device *dev,
-+			    struct ethtool_drvinfo *info)
-+{
-+	struct mtk_mac *mac = netdev_priv(dev);
-+
-+	strlcpy(info->driver, mac->hw->dev->driver->name, sizeof(info->driver));
-+	strlcpy(info->bus_info, dev_name(mac->hw->dev), sizeof(info->bus_info));
-+	info->n_stats = ARRAY_SIZE(mtk_ethtool_stats);
-+}
-+
-+static u32 mtk_get_msglevel(struct net_device *dev)
-+{
-+	struct mtk_mac *mac = netdev_priv(dev);
-+
-+	return mac->hw->msg_enable;
-+}
-+
-+static void mtk_set_msglevel(struct net_device *dev, u32 value)
-+{
-+	struct mtk_mac *mac = netdev_priv(dev);
-+
-+	mac->hw->msg_enable = value;
-+}
-+
-+static int mtk_nway_reset(struct net_device *dev)
-+{
-+	struct mtk_mac *mac = netdev_priv(dev);
-+
-+	return genphy_restart_aneg(mac->phy_dev);
-+}
-+
-+static u32 mtk_get_link(struct net_device *dev)
-+{
-+	struct mtk_mac *mac = netdev_priv(dev);
-+	int err;
-+
-+	err = genphy_update_link(mac->phy_dev);
-+	if (err)
-+		return ethtool_op_get_link(dev);
-+
-+	return mac->phy_dev->link;
-+}
-+
-+static void mtk_get_strings(struct net_device *dev, u32 stringset, u8 *data)
-+{
-+	int i;
-+
-+	switch (stringset) {
-+	case ETH_SS_STATS:
-+		for (i = 0; i < ARRAY_SIZE(mtk_ethtool_stats); i++) {
-+			memcpy(data, mtk_ethtool_stats[i].str, ETH_GSTRING_LEN);
-+			data += ETH_GSTRING_LEN;
-+		}
-+		break;
-+	}
-+}
-+
-+static int mtk_get_sset_count(struct net_device *dev, int sset)
-+{
-+	switch (sset) {
-+	case ETH_SS_STATS:
-+		return ARRAY_SIZE(mtk_ethtool_stats);
-+	default:
-+		return -EOPNOTSUPP;
-+	}
-+}
-+
-+static void mtk_get_ethtool_stats(struct net_device *dev,
-+				  struct ethtool_stats *stats, u64 *data)
-+{
-+	struct mtk_mac *mac = netdev_priv(dev);
-+	struct mtk_hw_stats *hwstats = mac->hw_stats;
-+	u64 *data_src, *data_dst;
-+	unsigned int start;
-+	int i;
-+
-+	if (netif_running(dev) && netif_device_present(dev)) {
-+		if (spin_trylock(&hwstats->stats_lock)) {
-+			mtk_stats_update_mac(mac);
-+			spin_unlock(&hwstats->stats_lock);
-+		}
-+	}
-+
-+	do {
-+		data_src = (u64*)hwstats;
-+		data_dst = data;
-+		start = u64_stats_fetch_begin_irq(&hwstats->syncp);
-+
-+		for (i = 0; i < ARRAY_SIZE(mtk_ethtool_stats); i++)
-+			*data_dst++ = *(data_src + mtk_ethtool_stats[i].offset);
-+	} while (u64_stats_fetch_retry_irq(&hwstats->syncp, start));
-+}
-+
-+static struct ethtool_ops mtk_ethtool_ops = {
-+	.get_settings		= mtk_get_settings,
-+	.set_settings		= mtk_set_settings,
-+	.get_drvinfo		= mtk_get_drvinfo,
-+	.get_msglevel		= mtk_get_msglevel,
-+	.set_msglevel		= mtk_set_msglevel,
-+	.nway_reset		= mtk_nway_reset,
-+	.get_link		= mtk_get_link,
-+	.get_strings		= mtk_get_strings,
-+	.get_sset_count		= mtk_get_sset_count,
-+	.get_ethtool_stats	= mtk_get_ethtool_stats,
-+};
-+
-+static const struct net_device_ops mtk_netdev_ops = {
-+	.ndo_init		= mtk_init,
-+	.ndo_uninit		= mtk_uninit,
-+	.ndo_open		= mtk_open,
-+	.ndo_stop		= mtk_stop,
-+	.ndo_start_xmit		= mtk_start_xmit,
-+	.ndo_set_mac_address	= mtk_set_mac_address,
-+	.ndo_validate_addr	= eth_validate_addr,
-+	.ndo_do_ioctl		= mtk_do_ioctl,
-+	.ndo_change_mtu		= eth_change_mtu,
-+	.ndo_tx_timeout		= mtk_tx_timeout,
-+	.ndo_get_stats64        = mtk_get_stats64,
-+#ifdef CONFIG_NET_POLL_CONTROLLER
-+	.ndo_poll_controller	= mtk_poll_controller,
-+#endif
-+};
-+
-+static int mtk_add_mac(struct mtk_eth *eth, struct device_node *np)
-+{
-+	struct mtk_mac *mac;
-+	const __be32 *_id = of_get_property(np, "reg", NULL);
-+	int id, err;
-+
-+	if (!_id) {
-+		dev_err(eth->dev, "missing mac id\n");
-+		return -EINVAL;
-+	}
-+
-+	id = be32_to_cpup(_id);
-+	if (id >= MTK_MAC_COUNT) {
-+		dev_err(eth->dev, "%d is not a valid mac id\n", id);
-+		return -EINVAL;
-+	}
-+
-+	if (eth->netdev[id]) {
-+		dev_err(eth->dev, "duplicate mac id found: %d\n", id);
-+		return -EINVAL;
-+	}
-+
-+	eth->netdev[id] = alloc_etherdev(sizeof(*mac));
-+	if (!eth->netdev[id]) {
-+		dev_err(eth->dev, "alloc_etherdev failed\n");
-+		return -ENOMEM;
-+	}
-+	mac = netdev_priv(eth->netdev[id]);
-+	eth->mac[id] = mac;
-+	mac->id = id;
-+	mac->hw = eth;
-+	mac->of_node = np;
-+	INIT_WORK(&mac->pending_work, mtk_pending_work);
-+
-+	mac->hw_stats = devm_kzalloc(eth->dev,
-+				     sizeof(*mac->hw_stats),
-+				     GFP_KERNEL);
-+	if (!mac->hw_stats) {
-+		dev_err(eth->dev, "failed to allocate counter memory\n");
-+		err = -ENOMEM;
-+		goto free_netdev;
-+	}
-+	spin_lock_init(&mac->hw_stats->stats_lock);
-+	mac->hw_stats->reg_offset = id * MTK_STAT_OFFSET;
-+
-+	SET_NETDEV_DEV(eth->netdev[id], eth->dev);
-+	eth->netdev[id]->netdev_ops = &mtk_netdev_ops;
-+	eth->netdev[id]->base_addr = (unsigned long)eth->base;
-+	eth->netdev[id]->vlan_features = MTK_HW_FEATURES &
-+		~(NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_HW_VLAN_CTAG_RX);
-+	eth->netdev[id]->features |= MTK_HW_FEATURES;
-+	eth->netdev[id]->ethtool_ops = &mtk_ethtool_ops;
-+
-+	err = register_netdev(eth->netdev[id]);
-+	if (err) {
-+		dev_err(eth->dev, "error bringing up device\n");
-+		goto free_netdev;
-+	}
-+	eth->netdev[id]->irq = eth->irq;
-+	netif_info(eth, probe, eth->netdev[id],
-+		   "mediatek frame engine at 0x%08lx, irq %d\n",
-+		   eth->netdev[id]->base_addr, eth->netdev[id]->irq);
-+
-+	return 0;
-+
-+free_netdev:
-+	free_netdev(eth->netdev[id]);
-+	return err;
-+}
-+
-+static int mtk_probe(struct platform_device *pdev)
-+{
-+	struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-+	struct device_node *mac_np;
-+	const struct of_device_id *match;
-+	struct mtk_soc_data *soc;
-+	struct mtk_eth *eth;
-+	int err;
-+
-+	pdev->dev.coherent_dma_mask = DMA_BIT_MASK(32);
-+	pdev->dev.dma_mask = &pdev->dev.coherent_dma_mask;
-+
-+	device_reset(&pdev->dev);
-+
-+	match = of_match_device(of_mtk_match, &pdev->dev);
-+	soc = (struct mtk_soc_data *)match->data;
-+
-+	eth = devm_kzalloc(&pdev->dev, sizeof(*eth), GFP_KERNEL);
-+	if (!eth)
-+		return -ENOMEM;
-+
-+	eth->base = devm_ioremap_resource(&pdev->dev, res);
-+	if (!eth->base)
-+		return -EADDRNOTAVAIL;
-+
-+	spin_lock_init(&eth->page_lock);
-+
-+	eth->ethsys = syscon_regmap_lookup_by_phandle(pdev->dev.of_node,
-+						      "mediatek,ethsys");
-+	if (IS_ERR(eth->ethsys)) {
-+		dev_err(&pdev->dev, "no ethsys regmap found\n");
-+		return PTR_ERR(eth->ethsys);
-+	}
-+
-+	eth->pctl = syscon_regmap_lookup_by_phandle(pdev->dev.of_node,
-+						    "mediatek,pctl");
-+	if (IS_ERR(eth->pctl)) {
-+		dev_err(&pdev->dev, "no pctl regmap found\n");
-+		return PTR_ERR(eth->pctl);
-+	}
-+
-+	eth->rstc = devm_reset_control_get(&pdev->dev, "eth");
-+	if (IS_ERR(eth->rstc)) {
-+		dev_err(&pdev->dev, "no eth reset found\n");
-+		return PTR_ERR(eth->rstc);
-+	}
-+
-+	eth->irq = platform_get_irq(pdev, 0);
-+	if (eth->irq < 0) {
-+		dev_err(&pdev->dev, "no IRQ resource found\n");
-+		return -ENXIO;
-+	}
-+
-+	eth->clk_ethif = devm_clk_get(&pdev->dev, "ethif");
-+	eth->clk_esw = devm_clk_get(&pdev->dev, "esw");
-+	eth->clk_gp1 = devm_clk_get(&pdev->dev, "gp1");
-+	eth->clk_gp2 = devm_clk_get(&pdev->dev, "gp2");
-+	if (IS_ERR(eth->clk_esw) || IS_ERR(eth->clk_gp1) ||
-+	    IS_ERR(eth->clk_gp2) || IS_ERR(eth->clk_ethif))
-+		return -ENODEV;
-+
-+	clk_prepare_enable(eth->clk_ethif);
-+	clk_prepare_enable(eth->clk_esw);
-+	clk_prepare_enable(eth->clk_gp1);
-+	clk_prepare_enable(eth->clk_gp2);
-+
-+	eth->dev = &pdev->dev;
-+	eth->msg_enable = netif_msg_init(mtk_msg_level, MTK_DEFAULT_MSG_ENABLE);
-+
-+	err = mtk_hw_init(eth);
-+	if (err)
-+		return err;
-+
-+	for_each_child_of_node(pdev->dev.of_node, mac_np) {
-+		if (!of_device_is_compatible(mac_np,
-+					     "mediatek,eth-mac"))
-+			continue;
-+
-+		if (!of_device_is_available(mac_np))
-+			continue;
-+
-+		err = mtk_add_mac(eth, mac_np);
-+		if (err)
-+			goto err_free_dev;
-+	}
-+
-+	/* we run 2 devices on the same DMA ring so we need a dummy device
-+	 * for NAPI to work
-+	 */
-+	init_dummy_netdev(&eth->dummy_dev);
-+	netif_napi_add(&eth->dummy_dev, &eth->rx_napi, mtk_poll,
-+		       MTK_NAPI_WEIGHT);
-+
-+	platform_set_drvdata(pdev, eth);
-+
-+	return 0;
-+
-+err_free_dev:
-+	mtk_cleanup(eth);
-+	return err;
-+}
-+
-+static int mtk_remove(struct platform_device *pdev)
-+{
-+	struct mtk_eth *eth = platform_get_drvdata(pdev);
-+
-+	clk_disable_unprepare(eth->clk_ethif);
-+	clk_disable_unprepare(eth->clk_esw);
-+	clk_disable_unprepare(eth->clk_gp1);
-+	clk_disable_unprepare(eth->clk_gp2);
-+
-+	netif_napi_del(&eth->rx_napi);
-+	mtk_cleanup(eth);
-+	platform_set_drvdata(pdev, NULL);
-+
-+	return 0;
-+}
-+
-+const struct of_device_id of_mtk_match[] = {
-+	{ .compatible = "mediatek,mt2701-eth" },
-+	{},
-+};
-+
-+static struct platform_driver mtk_driver = {
-+	.probe = mtk_probe,
-+	.remove = mtk_remove,
-+	.driver = {
-+		.name = "mtk_soc_eth",
-+		.owner = THIS_MODULE,
-+		.of_match_table = of_mtk_match,
-+	},
-+};
-+
-+module_platform_driver(mtk_driver);
-+
-+MODULE_LICENSE("GPL");
-+MODULE_AUTHOR("John Crispin <blogic at openwrt.org>");
-+MODULE_DESCRIPTION("Ethernet driver for MediaTek SoC");
---- /dev/null
-+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
-@@ -0,0 +1,421 @@
-+/*   This program is free software; you can redistribute it and/or modify
-+ *   it under the terms of the GNU General Public License as published by
-+ *   the Free Software Foundation; version 2 of the License
-+ *
-+ *   This program is distributed in the hope that it will be useful,
-+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ *   GNU General Public License for more details.
-+ *
-+ *   Copyright (C) 2009-2016 John Crispin <blogic at openwrt.org>
-+ *   Copyright (C) 2009-2016 Felix Fietkau <nbd at nbd.name>
-+ *   Copyright (C) 2013-2016 Michael Lee <igvtee at gmail.com>
-+ */
-+
-+#ifndef MTK_ETH_H
-+#define MTK_ETH_H
-+
-+#define MTK_QDMA_PAGE_SIZE	2048
-+#define	MTK_MAX_RX_LENGTH	1536
-+#define MTK_TX_DMA_BUF_LEN	0x3fff
-+#define MTK_DMA_SIZE		256
-+#define MTK_NAPI_WEIGHT		64
-+#define MTK_MAC_COUNT		2
-+#define MTK_RX_ETH_HLEN		(VLAN_ETH_HLEN + VLAN_HLEN + ETH_FCS_LEN)
-+#define MTK_RX_HLEN		(NET_SKB_PAD + MTK_RX_ETH_HLEN + NET_IP_ALIGN)
-+#define MTK_DMA_DUMMY_DESC	0xffffffff
-+#define MTK_DEFAULT_MSG_ENABLE	(NETIF_MSG_DRV | \
-+				 NETIF_MSG_PROBE | \
-+				 NETIF_MSG_LINK | \
-+				 NETIF_MSG_TIMER | \
-+				 NETIF_MSG_IFDOWN | \
-+				 NETIF_MSG_IFUP | \
-+				 NETIF_MSG_RX_ERR | \
-+				 NETIF_MSG_TX_ERR)
-+#define MTK_HW_FEATURES		(NETIF_F_IP_CSUM | \
-+				 NETIF_F_RXCSUM | \
-+				 NETIF_F_HW_VLAN_CTAG_TX | \
-+				 NETIF_F_HW_VLAN_CTAG_RX | \
-+				 NETIF_F_SG | NETIF_F_TSO | \
-+				 NETIF_F_TSO6 | \
-+				 NETIF_F_IPV6_CSUM)
-+#define NEXT_RX_DESP_IDX(X)	(((X) + 1) & (MTK_DMA_SIZE - 1))
-+
-+/* Frame Engine Global Reset Register */
-+#define MTK_RST_GL		0x04
-+#define RST_GL_PSE		BIT(0)
-+
-+/* Frame Engine Interrupt Status Register */
-+#define MTK_INT_STATUS2		0x08
-+#define MTK_GDM1_AF		BIT(28)
-+#define MTK_GDM2_AF		BIT(29)
-+
-+/* Frame Engine Interrupt Grouping Register */
-+#define MTK_FE_INT_GRP		0x20
-+
-+/* CDMP Exgress Control Register */
-+#define MTK_CDMP_EG_CTRL	0x404
-+
-+/* GDM Exgress Control Register */
-+#define MTK_GDMA_FWD_CFG(x)	(0x500 + (x * 0x1000))
-+#define MTK_GDMA_ICS_EN		BIT(22)
-+#define MTK_GDMA_TCS_EN		BIT(21)
-+#define MTK_GDMA_UCS_EN		BIT(20)
-+
-+/* Unicast Filter MAC Address Register - Low */
-+#define MTK_GDMA_MAC_ADRL(x)	(0x508 + (x * 0x1000))
-+
-+/* Unicast Filter MAC Address Register - High */
-+#define MTK_GDMA_MAC_ADRH(x)	(0x50C + (x * 0x1000))
-+
-+/* QDMA TX Queue Configuration Registers */
-+#define MTK_QTX_CFG(x)		(0x1800 + (x * 0x10))
-+#define QDMA_RES_THRES		4
-+
-+/* QDMA TX Queue Scheduler Registers */
-+#define MTK_QTX_SCH(x)		(0x1804 + (x * 0x10))
-+
-+/* QDMA RX Base Pointer Register */
-+#define MTK_QRX_BASE_PTR0	0x1900
-+
-+/* QDMA RX Maximum Count Register */
-+#define MTK_QRX_MAX_CNT0	0x1904
-+
-+/* QDMA RX CPU Pointer Register */
-+#define MTK_QRX_CRX_IDX0	0x1908
-+
-+/* QDMA RX DMA Pointer Register */
-+#define MTK_QRX_DRX_IDX0	0x190C
-+
-+/* QDMA Global Configuration Register */
-+#define MTK_QDMA_GLO_CFG	0x1A04
-+#define MTK_RX_2B_OFFSET	BIT(31)
-+#define MTK_RX_BT_32DWORDS	(3 << 11)
-+#define MTK_TX_WB_DDONE		BIT(6)
-+#define MTK_DMA_SIZE_16DWORDS	(2 << 4)
-+#define MTK_RX_DMA_BUSY		BIT(3)
-+#define MTK_TX_DMA_BUSY		BIT(1)
-+#define MTK_RX_DMA_EN		BIT(2)
-+#define MTK_TX_DMA_EN		BIT(0)
-+#define MTK_DMA_BUSY_TIMEOUT	HZ
-+
-+/* QDMA Reset Index Register */
-+#define MTK_QDMA_RST_IDX	0x1A08
-+#define MTK_PST_DRX_IDX0	BIT(16)
-+
-+/* QDMA Delay Interrupt Register */
-+#define MTK_QDMA_DELAY_INT	0x1A0C
-+
-+/* QDMA Flow Control Register */
-+#define MTK_QDMA_FC_THRES	0x1A10
-+#define FC_THRES_DROP_MODE	BIT(20)
-+#define FC_THRES_DROP_EN	(7 << 16)
-+#define FC_THRES_MIN		0x4444
-+
-+/* QDMA Interrupt Status Register */
-+#define MTK_QMTK_INT_STATUS	0x1A18
-+#define MTK_RX_DONE_INT1	BIT(17)
-+#define MTK_RX_DONE_INT0	BIT(16)
-+#define MTK_TX_DONE_INT3	BIT(3)
-+#define MTK_TX_DONE_INT2	BIT(2)
-+#define MTK_TX_DONE_INT1	BIT(1)
-+#define MTK_TX_DONE_INT0	BIT(0)
-+#define MTK_RX_DONE_INT		(MTK_RX_DONE_INT0 | MTK_RX_DONE_INT1)
-+#define MTK_TX_DONE_INT		(MTK_TX_DONE_INT0 | MTK_TX_DONE_INT1 | \
-+				 MTK_TX_DONE_INT2 | MTK_TX_DONE_INT3)
-+
-+/* QDMA Interrupt Status Register */
-+#define MTK_QDMA_INT_MASK	0x1A1C
-+
-+/* QDMA Interrupt Mask Register */
-+#define MTK_QDMA_HRED2		0x1A44
-+
-+/* QDMA TX Forward CPU Pointer Register */
-+#define MTK_QTX_CTX_PTR		0x1B00
-+
-+/* QDMA TX Forward DMA Pointer Register */
-+#define MTK_QTX_DTX_PTR		0x1B04
-+
-+/* QDMA TX Release CPU Pointer Register */
-+#define MTK_QTX_CRX_PTR		0x1B10
-+
-+/* QDMA TX Release DMA Pointer Register */
-+#define MTK_QTX_DRX_PTR		0x1B14
-+
-+/* QDMA FQ Head Pointer Register */
-+#define MTK_QDMA_FQ_HEAD	0x1B20
-+
-+/* QDMA FQ Head Pointer Register */
-+#define MTK_QDMA_FQ_TAIL	0x1B24
-+
-+/* QDMA FQ Free Page Counter Register */
-+#define MTK_QDMA_FQ_CNT		0x1B28
-+
-+/* QDMA FQ Free Page Buffer Length Register */
-+#define MTK_QDMA_FQ_BLEN	0x1B2C
-+
-+/* GMA1 Received Good Byte Count Register */
-+#define MTK_GDM1_TX_GBCNT	0x2400
-+#define MTK_STAT_OFFSET		0x40
-+
-+/* QDMA descriptor txd4 */
-+#define TX_DMA_CHKSUM		(0x7 << 29)
-+#define TX_DMA_TSO		BIT(28)
-+#define TX_DMA_FPORT_SHIFT	25
-+#define TX_DMA_FPORT_MASK	0x7
-+#define TX_DMA_INS_VLAN		BIT(16)
-+
-+/* QDMA descriptor txd3 */
-+#define TX_DMA_OWNER_CPU	BIT(31)
-+#define TX_DMA_LS0		BIT(30)
-+#define TX_DMA_PLEN0(_x)	(((_x) & MTK_TX_DMA_BUF_LEN) << 16)
-+#define TX_DMA_SWC		BIT(14)
-+#define TX_DMA_SDL(_x)		(((_x) & 0x3fff) << 16)
-+
-+/* QDMA descriptor rxd2 */
-+#define RX_DMA_DONE		BIT(31)
-+#define RX_DMA_PLEN0(_x)	(((_x) & 0x3fff) << 16)
-+#define RX_DMA_GET_PLEN0(_x)	(((_x) >> 16) & 0x3fff)
-+
-+/* QDMA descriptor rxd3 */
-+#define RX_DMA_VID(_x)		((_x) & 0xfff)
-+
-+/* QDMA descriptor rxd4 */
-+#define RX_DMA_L4_VALID		BIT(24)
-+#define RX_DMA_FPORT_SHIFT	19
-+#define RX_DMA_FPORT_MASK	0x7
-+
-+/* PHY Indirect Access Control registers */
-+#define MTK_PHY_IAC		0x10004
-+#define PHY_IAC_ACCESS		BIT(31)
-+#define PHY_IAC_READ		BIT(19)
-+#define PHY_IAC_WRITE		BIT(18)
-+#define PHY_IAC_START		BIT(16)
-+#define PHY_IAC_ADDR_SHIFT	20
-+#define PHY_IAC_REG_SHIFT	25
-+#define PHY_IAC_TIMEOUT		HZ
-+
-+/* Mac control registers */
-+#define MTK_MAC_MCR(x)		(0x10100 + (x * 0x100))
-+#define MAC_MCR_MAX_RX_1536	BIT(24)
-+#define MAC_MCR_IPG_CFG		(BIT(18) | BIT(16))
-+#define MAC_MCR_FORCE_MODE	BIT(15)
-+#define MAC_MCR_TX_EN		BIT(14)
-+#define MAC_MCR_RX_EN		BIT(13)
-+#define MAC_MCR_BACKOFF_EN	BIT(9)
-+#define MAC_MCR_BACKPR_EN	BIT(8)
-+#define MAC_MCR_FORCE_RX_FC	BIT(5)
-+#define MAC_MCR_FORCE_TX_FC	BIT(4)
-+#define MAC_MCR_SPEED_1000	BIT(3)
-+#define MAC_MCR_SPEED_100	BIT(2)
-+#define MAC_MCR_FORCE_DPX	BIT(1)
-+#define MAC_MCR_FORCE_LINK	BIT(0)
-+#define MAC_MCR_FIXED_LINK	(MAC_MCR_MAX_RX_1536 | MAC_MCR_IPG_CFG | \
-+				 MAC_MCR_FORCE_MODE | MAC_MCR_TX_EN | \
-+				 MAC_MCR_RX_EN | MAC_MCR_BACKOFF_EN | \
-+				 MAC_MCR_BACKPR_EN | MAC_MCR_FORCE_RX_FC | \
-+				 MAC_MCR_FORCE_TX_FC | MAC_MCR_SPEED_1000 | \
-+				 MAC_MCR_FORCE_DPX | MAC_MCR_FORCE_LINK)
-+
-+/* GPIO port control registers for GMAC 2*/
-+#define GPIO_OD33_CTRL8		0x4c0
-+#define GPIO_BIAS_CTRL		0xed0
-+#define GPIO_DRV_SEL10		0xf00
-+
-+/* ethernet subsystem config register */
-+#define ETHSYS_SYSCFG0		0x14
-+#define SYSCFG0_GE_MASK		0x3
-+#define SYSCFG0_GE_MODE(x, y)	(x << (12 + (y * 2)))
-+
-+struct mtk_rx_dma {
-+	unsigned int rxd1;
-+	unsigned int rxd2;
-+	unsigned int rxd3;
-+	unsigned int rxd4;
-+} __packed __aligned(4);
-+
-+struct mtk_tx_dma {
-+	unsigned int txd1;
-+	unsigned int txd2;
-+	unsigned int txd3;
-+	unsigned int txd4;
-+} __packed __aligned(4);
-+
-+struct mtk_eth;
-+struct mtk_mac;
-+
-+/* struct mtk_hw_stats - the structure that holds the traffic statistics.
-+ * @stats_lock:		make sure that stats operations are atomic
-+ * @reg_offset:		the status register offset of the SoC
-+ * @syncp:		the refcount
-+ *
-+ * All of the supported SoCs have hardware counters for traffic statistics.
-+ * Whenever the status IRQ triggers we can read the latest stats from these
-+ * counters and store them in this struct.
-+ */
-+struct mtk_hw_stats {
-+	u64 tx_bytes;
-+	u64 tx_packets;
-+	u64 tx_skip;
-+	u64 tx_collisions;
-+	u64 rx_bytes;
-+	u64 rx_packets;
-+	u64 rx_overflow;
-+	u64 rx_fcs_errors;
-+	u64 rx_short_errors;
-+	u64 rx_long_errors;
-+	u64 rx_checksum_errors;
-+	u64 rx_flow_control_packets;
-+
-+	spinlock_t		stats_lock;
-+	u32			reg_offset;
-+	struct u64_stats_sync	syncp;
-+};
-+
-+/* PDMA descriptor can point at 1-2 segments. This enum allows us to track how
-+ * memory was allocated so that it can be freed properly
-+ */
-+enum mtk_tx_flags {
-+	MTK_TX_FLAGS_SINGLE0	= 0x01,
-+	MTK_TX_FLAGS_PAGE0	= 0x02,
-+};
-+
-+/* struct mtk_tx_buf -	This struct holds the pointers to the memory pointed at
-+ *			by the TX descriptor	s
-+ * @skb:		The SKB pointer of the packet being sent
-+ * @dma_addr0:		The base addr of the first segment
-+ * @dma_len0:		The length of the first segment
-+ * @dma_addr1:		The base addr of the second segment
-+ * @dma_len1:		The length of the second segment
-+ */
-+struct mtk_tx_buf {
-+	struct sk_buff *skb;
-+	u32 flags;
-+	DEFINE_DMA_UNMAP_ADDR(dma_addr0);
-+	DEFINE_DMA_UNMAP_LEN(dma_len0);
-+	DEFINE_DMA_UNMAP_ADDR(dma_addr1);
-+	DEFINE_DMA_UNMAP_LEN(dma_len1);
-+};
-+
-+/* struct mtk_tx_ring -	This struct holds info describing a TX ring
-+ * @dma:		The descriptor ring
-+ * @buf:		The memory pointed at by the ring
-+ * @phys:		The physical addr of tx_buf
-+ * @next_free:		Pointer to the next free descriptor
-+ * @last_free:		Pointer to the last free descriptor
-+ * @thresh:		The threshold of minimum amount of free descriptors
-+ * @free_count:		QDMA uses a linked list. Track how many free descriptors
-+ *			are present
-+ */
-+struct mtk_tx_ring {
-+	struct mtk_tx_dma *dma;
-+	struct mtk_tx_buf *buf;
-+	dma_addr_t phys;
-+	struct mtk_tx_dma *next_free;
-+	struct mtk_tx_dma *last_free;
-+	u16 thresh;
-+	atomic_t free_count;
-+};
-+
-+/* struct mtk_rx_ring -	This struct holds info describing a RX ring
-+ * @dma:		The descriptor ring
-+ * @data:		The memory pointed at by the ring
-+ * @phys:		The physical addr of rx_buf
-+ * @frag_size:		How big can each fragment be
-+ * @buf_size:		The size of each packet buffer
-+ * @calc_idx:		The current head of ring
-+ */
-+struct mtk_rx_ring {
-+	struct mtk_rx_dma *dma;
-+	u8 **data;
-+	dma_addr_t phys;
-+	u16 frag_size;
-+	u16 buf_size;
-+	u16 calc_idx;
-+};
-+
-+/* currently no SoC has more than 2 macs */
-+#define MTK_MAX_DEVS			2
-+
-+/* struct mtk_eth -	This is the main datasructure for holding the state
-+ *			of the driver
-+ * @dev:		The device pointer
-+ * @base:		The mapped register i/o base
-+ * @page_lock:		Make sure that register operations are atomic
-+ * @dummy_dev:		we run 2 netdevs on 1 physical DMA ring and need a
-+ *			dummy for NAPI to work
-+ * @netdev:		The netdev instances
-+ * @mac:		Each netdev is linked to a physical MAC
-+ * @irq:		The IRQ that we are using
-+ * @msg_enable:		Ethtool msg level
-+ * @ethsys:		The register map pointing at the range used to setup
-+ *			MII modes
-+ * @pctl:		The register map pointing at the range used to setup
-+ *			GMAC port drive/slew values
-+ * @dma_refcnt:		track how many netdevs are using the DMA engine
-+ * @tx_ring:		Pointer to the memore holding info about the TX ring
-+ * @rx_ring:		Pointer to the memore holding info about the RX ring
-+ * @rx_napi:		The NAPI struct
-+ * @scratch_ring:	Newer SoCs need memory for a second HW managed TX ring
-+ * @scratch_head:	The scratch memory that scratch_ring points to.
-+ * @clk_ethif:		The ethif clock
-+ * @clk_esw:		The switch clock
-+ * @clk_gp1:		The gmac1 clock
-+ * @clk_gp2:		The gmac2 clock
-+ * @mii_bus:		If there is a bus we need to create an instance for it
-+ */
-+
-+struct mtk_eth {
-+	struct device			*dev;
-+	void __iomem			*base;
-+	struct reset_control		*rstc;
-+	spinlock_t			page_lock;
-+	struct net_device		dummy_dev;
-+	struct net_device		*netdev[MTK_MAX_DEVS];
-+	struct mtk_mac			*mac[MTK_MAX_DEVS];
-+	int				irq;
-+	u32				msg_enable;
-+	unsigned long			sysclk;
-+	struct regmap			*ethsys;
-+	struct regmap			*pctl;
-+	atomic_t			dma_refcnt;
-+	struct mtk_tx_ring		tx_ring;
-+	struct mtk_rx_ring		rx_ring;
-+	struct napi_struct		rx_napi;
-+	struct mtk_tx_dma		*scratch_ring;
-+	void				*scratch_head;
-+	struct clk			*clk_ethif;
-+	struct clk			*clk_esw;
-+	struct clk			*clk_gp1;
-+	struct clk			*clk_gp2;
-+	struct mii_bus			*mii_bus;
-+};
-+
-+/* struct mtk_mac -	the structure that holds the info about the MACs of the
-+ *			SoC
-+ * @id:			The number of the MAC
-+ * @of_node:		Our devicetree node
-+ * @hw:			Backpointer to our main datastruture
-+ * @hw_stats:		Packet statistics counter
-+ * @phy_dev:		The attached PHY if available
-+ * @pending_work:	The workqueue used to reset the dma ring
-+ */
-+struct mtk_mac {
-+	int				id;
-+	struct device_node		*of_node;
-+	struct mtk_eth			*hw;
-+	struct mtk_hw_stats		*hw_stats;
-+	struct phy_device		*phy_dev;
-+	struct work_struct		pending_work;
-+};
-+
-+/* the struct describing the SoC. these are declared in the soc_xyz.c files */
-+extern const struct of_device_id of_mtk_match[];
-+
-+/* read the hardware status register */
-+void mtk_stats_update_mac(struct mtk_mac *mac);
-+
-+void mtk_w32(struct mtk_eth *eth, u32 val, unsigned reg);
-+u32 mtk_r32(struct mtk_eth *eth, unsigned reg);
-+
-+#endif /* MTK_ETH_H */
diff --git a/target/linux/mediatek/patches-4.4/0050-net-next-mediatek-add-Kconfig-and-Makefile.patch b/target/linux/mediatek/patches-4.4/0050-net-next-mediatek-add-Kconfig-and-Makefile.patch
deleted file mode 100644
index 0c7a89e..0000000
--- a/target/linux/mediatek/patches-4.4/0050-net-next-mediatek-add-Kconfig-and-Makefile.patch
+++ /dev/null
@@ -1,65 +0,0 @@
-From 31e907e5c3c2fc1c94d005bfccdd4a32b5a05f82 Mon Sep 17 00:00:00 2001
-From: John Crispin <blogic at openwrt.org>
-Date: Wed, 2 Mar 2016 04:32:43 +0100
-Subject: [PATCH 050/102] net-next: mediatek: add Kconfig and Makefile
-
-This patch adds the Makefile and Kconfig required to make the driver build.
-
-Signed-off-by: John Crispin <blogic at openwrt.org>
----
- drivers/net/ethernet/Kconfig           |    1 +
- drivers/net/ethernet/Makefile          |    1 +
- drivers/net/ethernet/mediatek/Kconfig  |   17 +++++++++++++++++
- drivers/net/ethernet/mediatek/Makefile |    5 +++++
- 4 files changed, 24 insertions(+)
- create mode 100644 drivers/net/ethernet/mediatek/Kconfig
- create mode 100644 drivers/net/ethernet/mediatek/Makefile
-
---- a/drivers/net/ethernet/Kconfig
-+++ b/drivers/net/ethernet/Kconfig
-@@ -106,6 +106,7 @@ config LANTIQ_ETOP
- 	  Support for the MII0 inside the Lantiq SoC
- 
- source "drivers/net/ethernet/marvell/Kconfig"
-+source "drivers/net/ethernet/mediatek/Kconfig"
- source "drivers/net/ethernet/mellanox/Kconfig"
- source "drivers/net/ethernet/micrel/Kconfig"
- source "drivers/net/ethernet/microchip/Kconfig"
---- a/drivers/net/ethernet/Makefile
-+++ b/drivers/net/ethernet/Makefile
-@@ -46,6 +46,7 @@ obj-$(CONFIG_JME) += jme.o
- obj-$(CONFIG_KORINA) += korina.o
- obj-$(CONFIG_LANTIQ_ETOP) += lantiq_etop.o
- obj-$(CONFIG_NET_VENDOR_MARVELL) += marvell/
-+obj-$(CONFIG_NET_VENDOR_MEDIATEK) += mediatek/
- obj-$(CONFIG_NET_VENDOR_MELLANOX) += mellanox/
- obj-$(CONFIG_NET_VENDOR_MICREL) += micrel/
- obj-$(CONFIG_NET_VENDOR_MICROCHIP) += microchip/
---- /dev/null
-+++ b/drivers/net/ethernet/mediatek/Kconfig
-@@ -0,0 +1,17 @@
-+config NET_VENDOR_MEDIATEK
-+	bool "MediaTek ethernet driver"
-+	depends on ARCH_MEDIATEK
-+	---help---
-+	  If you have a Mediatek SoC with ethernet, say Y.
-+
-+if NET_VENDOR_MEDIATEK
-+
-+config NET_MEDIATEK_SOC
-+	tristate "MediaTek MT7623 Gigabit ethernet support"
-+	depends on NET_VENDOR_MEDIATEK #&& (MACH_MT7623 || MACH_MT2701)
-+	select PHYLIB
-+	---help---
-+	  This driver supports the gigabit ethernet MACs in the
-+	  MediaTek MT2701/MT7623 chipset family.
-+
-+endif #NET_VENDOR_MEDIATEK
---- /dev/null
-+++ b/drivers/net/ethernet/mediatek/Makefile
-@@ -0,0 +1,5 @@
-+#
-+# Makefile for the Mediatek SoCs built-in ethernet macs
-+#
-+
-+obj-$(CONFIG_NET_MEDIATEK_SOC)			+= mtk_eth_soc.o
diff --git a/target/linux/mediatek/patches-4.4/0051-net-next-mediatek-add-an-entry-to-MAINTAINERS.patch b/target/linux/mediatek/patches-4.4/0051-net-next-mediatek-add-an-entry-to-MAINTAINERS.patch
deleted file mode 100644
index 10690b2..0000000
--- a/target/linux/mediatek/patches-4.4/0051-net-next-mediatek-add-an-entry-to-MAINTAINERS.patch
+++ /dev/null
@@ -1,29 +0,0 @@
-From 514e4ce65a5f1b5bfa3cbca153f672844f093f0e Mon Sep 17 00:00:00 2001
-From: John Crispin <blogic at openwrt.org>
-Date: Wed, 2 Mar 2016 04:34:04 +0100
-Subject: [PATCH 051/102] net-next: mediatek: add an entry to MAINTAINERS
-
-Add myself and Felix as the Maintainers for the MediaTek ethernet driver.
-
-Signed-off-by: Felix Fietkau <nbd at nbd.name>
-Signed-off-by: John Crispin <blogic at openwrt.org>
----
- MAINTAINERS |    7 +++++++
- 1 file changed, 7 insertions(+)
-
---- a/MAINTAINERS
-+++ b/MAINTAINERS
-@@ -6902,6 +6902,13 @@ F:	include/uapi/linux/meye.h
- F:	include/uapi/linux/ivtv*
- F:	include/uapi/linux/uvcvideo.h
- 
-+MEDIATEK ETHERNET DRIVER
-+M:	Felix Fietkau <nbd at nbd.name>
-+M:	John Crispin <blogic at openwrt.org>
-+L:	netdev at vger.kernel.org
-+S:	Maintained
-+F:	drivers/net/ethernet/mediatek/
-+
- MEDIATEK MT7601U WIRELESS LAN DRIVER
- M:	Jakub Kicinski <kubakici at wp.pl>
- L:	linux-wireless at vger.kernel.org
diff --git a/target/linux/mediatek/patches-4.4/0056-arm-mediatek-make-a7-timer-work-Signed-off-by-John-C.patch b/target/linux/mediatek/patches-4.4/0056-arm-mediatek-make-a7-timer-work-Signed-off-by-John-C.patch
deleted file mode 100644
index fe81b47..0000000
--- a/target/linux/mediatek/patches-4.4/0056-arm-mediatek-make-a7-timer-work-Signed-off-by-John-C.patch
+++ /dev/null
@@ -1,31 +0,0 @@
-From f8cda0bc698706413b5dd6fde827f9a2601ac61b Mon Sep 17 00:00:00 2001
-From: John Crispin <blogic at openwrt.org>
-Date: Thu, 31 Mar 2016 06:07:01 +0200
-Subject: [PATCH 056/102] arm: mediatek: make a7 timer work Signed-off-by:
- John Crispin <blogic at openwrt.org>
-
----
- arch/arm/mach-mediatek/Kconfig    |    1 +
- arch/arm/mach-mediatek/mediatek.c |    1 +
- 2 files changed, 2 insertions(+)
-
---- a/arch/arm/mach-mediatek/Kconfig
-+++ b/arch/arm/mach-mediatek/Kconfig
-@@ -24,6 +24,7 @@ config MACH_MT6592
- config MACH_MT7623
- 	bool "MediaTek MT7623 SoCs support"
- 	default ARCH_MEDIATEK
-+	select HAVE_ARM_ARCH_TIMER
- 	select MIGHT_HAVE_PCI
- 
- config MACH_MT8127
---- a/arch/arm/mach-mediatek/mediatek.c
-+++ b/arch/arm/mach-mediatek/mediatek.c
-@@ -29,6 +29,7 @@ static void __init mediatek_timer_init(v
- 	void __iomem *gpt_base;
- 
- 	if (of_machine_is_compatible("mediatek,mt6589") ||
-+	    of_machine_is_compatible("mediatek,mt7623") ||
- 	    of_machine_is_compatible("mediatek,mt8135") ||
- 	    of_machine_is_compatible("mediatek,mt8127")) {
- 		/* turn on GPT6 which ungates arch timer clocks */
diff --git a/target/linux/mediatek/patches-4.4/0057-net-mediatek-checking-for-IS_ERR-instead-of-NULL.patch b/target/linux/mediatek/patches-4.4/0057-net-mediatek-checking-for-IS_ERR-instead-of-NULL.patch
deleted file mode 100644
index f00e968..0000000
--- a/target/linux/mediatek/patches-4.4/0057-net-mediatek-checking-for-IS_ERR-instead-of-NULL.patch
+++ /dev/null
@@ -1,27 +0,0 @@
-From b9f9b937dd12dc57bd54a6c89b18eb40d4508424 Mon Sep 17 00:00:00 2001
-From: Dan Carpenter <dan.carpenter at oracle.com>
-Date: Tue, 15 Mar 2016 10:18:49 +0300
-Subject: [PATCH 057/102] net: mediatek: checking for IS_ERR() instead of NULL
-
-of_phy_connect() returns NULL on error, it never returns error pointers.
-
-Fixes: 656e705243fd ('net-next: mediatek: add support for MT7623 ethernet')
-Signed-off-by: Dan Carpenter <dan.carpenter at oracle.com>
----
- drivers/net/ethernet/mediatek/mtk_eth_soc.c |    4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-@@ -186,9 +186,9 @@ static int mtk_phy_connect_node(struct m
- 
- 	phydev = of_phy_connect(eth->netdev[mac->id], phy_node,
- 				mtk_phy_link_adjust, 0, phy_mode);
--	if (IS_ERR(phydev)) {
-+	if (!phydev) {
- 		dev_err(eth->dev, "could not connect to PHY\n");
--		return PTR_ERR(phydev);
-+		return -ENODEV;
- 	}
- 
- 	dev_info(eth->dev,
diff --git a/target/linux/mediatek/patches-4.4/0058-net-mediatek-unlock-on-error-in-mtk_tx_map.patch b/target/linux/mediatek/patches-4.4/0058-net-mediatek-unlock-on-error-in-mtk_tx_map.patch
deleted file mode 100644
index a3f861b..0000000
--- a/target/linux/mediatek/patches-4.4/0058-net-mediatek-unlock-on-error-in-mtk_tx_map.patch
+++ /dev/null
@@ -1,24 +0,0 @@
-From 6c12340c0c307d18b8d6120f64a8275b6d4d3e67 Mon Sep 17 00:00:00 2001
-From: Dan Carpenter <dan.carpenter at oracle.com>
-Date: Tue, 15 Mar 2016 10:19:04 +0300
-Subject: [PATCH 058/102] net: mediatek: unlock on error in mtk_tx_map()
-
-There was a missing unlock on the error path.
-
-Fixes: 656e705243fd ('net-next: mediatek: add support for MT7623 ethernet')
-Signed-off-by: Dan Carpenter <dan.carpenter at oracle.com>
----
- drivers/net/ethernet/mediatek/mtk_eth_soc.c |    2 ++
- 1 file changed, 2 insertions(+)
-
---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-@@ -661,6 +661,8 @@ err_dma:
- 		itxd = mtk_qdma_phys_to_virt(ring, itxd->txd2);
- 	} while (itxd != txd);
- 
-+	spin_unlock_irqrestore(&eth->page_lock, flags);
-+
- 	return -ENOMEM;
- }
- 
diff --git a/target/linux/mediatek/patches-4.4/0059-net-mediatek-use-dma_addr_t-correctly.patch b/target/linux/mediatek/patches-4.4/0059-net-mediatek-use-dma_addr_t-correctly.patch
deleted file mode 100644
index 0dd5f2d..0000000
--- a/target/linux/mediatek/patches-4.4/0059-net-mediatek-use-dma_addr_t-correctly.patch
+++ /dev/null
@@ -1,30 +0,0 @@
-From a572747434b6153e75812c5466c0557e5ed69284 Mon Sep 17 00:00:00 2001
-From: Arnd Bergmann <arnd at arndb.de>
-Date: Mon, 14 Mar 2016 15:07:10 +0100
-Subject: [PATCH 059/102] net: mediatek: use dma_addr_t correctly
-
-dma_alloc_coherent() expects a dma_addr_t pointer as its argument,
-not an 'unsigned int', and gcc correctly warns about broken
-code in the mtk_init_fq_dma function:
-
-drivers/net/ethernet/mediatek/mtk_eth_soc.c: In function 'mtk_init_fq_dma':
-drivers/net/ethernet/mediatek/mtk_eth_soc.c:463:13: error: passing argument 3 of 'dma_alloc_coherent' from incompatible pointer type [-Werror=incompatible-pointer-types]
-
-This changes the type of the local variable to dma_addr_t.
-
-Signed-off-by: Arnd Bergmann <arnd at arndb.de>
----
- drivers/net/ethernet/mediatek/mtk_eth_soc.c |    2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-@@ -453,7 +453,7 @@ static inline void mtk_rx_get_desc(struc
- /* the qdma core needs scratch memory to be setup */
- static int mtk_init_fq_dma(struct mtk_eth *eth)
- {
--	unsigned int phy_ring_head, phy_ring_tail;
-+	dma_addr_t phy_ring_head, phy_ring_tail;
- 	int cnt = MTK_DMA_SIZE;
- 	dma_addr_t dma_addr;
- 	int i;
diff --git a/target/linux/mediatek/patches-4.4/0060-net-mediatek-remove-incorrect-dma_mask-assignment.patch b/target/linux/mediatek/patches-4.4/0060-net-mediatek-remove-incorrect-dma_mask-assignment.patch
deleted file mode 100644
index d1df732..0000000
--- a/target/linux/mediatek/patches-4.4/0060-net-mediatek-remove-incorrect-dma_mask-assignment.patch
+++ /dev/null
@@ -1,31 +0,0 @@
-From 8473af12d5aa34613070447d6fd8f785f31301de Mon Sep 17 00:00:00 2001
-From: Arnd Bergmann <arnd at arndb.de>
-Date: Mon, 14 Mar 2016 15:07:11 +0100
-Subject: [PATCH 060/102] net: mediatek: remove incorrect dma_mask assignment
-
-Device drivers should not mess with the DMA mask directly,
-but instead call dma_set_mask() etc if needed.
-
-In case of the mtk_eth_soc driver, the mask already gets set
-correctly when the device is created, and setting it again
-is against the documented API.
-
-This removes the incorrect setting.
-
-Signed-off-by: Arnd Bergmann <arnd at arndb.de>
----
- drivers/net/ethernet/mediatek/mtk_eth_soc.c |    3 ---
- 1 file changed, 3 deletions(-)
-
---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-@@ -1678,9 +1678,6 @@ static int mtk_probe(struct platform_dev
- 	struct mtk_eth *eth;
- 	int err;
- 
--	pdev->dev.coherent_dma_mask = DMA_BIT_MASK(32);
--	pdev->dev.dma_mask = &pdev->dev.coherent_dma_mask;
--
- 	device_reset(&pdev->dev);
- 
- 	match = of_match_device(of_mtk_match, &pdev->dev);
diff --git a/target/linux/mediatek/patches-4.4/0061-net-mediatek-check-device_reset-return-code.patch b/target/linux/mediatek/patches-4.4/0061-net-mediatek-check-device_reset-return-code.patch
deleted file mode 100644
index ebc6d9b..0000000
--- a/target/linux/mediatek/patches-4.4/0061-net-mediatek-check-device_reset-return-code.patch
+++ /dev/null
@@ -1,33 +0,0 @@
-From 99159791184752ece724b741f9fa6334fdc67123 Mon Sep 17 00:00:00 2001
-From: Arnd Bergmann <arnd at arndb.de>
-Date: Mon, 14 Mar 2016 15:07:12 +0100
-Subject: [PATCH 061/102] net: mediatek: check device_reset return code
-
-The device_reset() function may fail, so we have to check
-its return value, e.g. to make deferred probing work correctly.
-gcc warns about it because of the warn_unused_result attribute:
-
-drivers/net/ethernet/mediatek/mtk_eth_soc.c: In function 'mtk_probe':
-drivers/net/ethernet/mediatek/mtk_eth_soc.c:1679:2: error: ignoring return value of 'device_reset', declared with attribute warn_unused_result [-Werror=unused-result]
-
-This adds the trivial error check to propagate the return value
-to the generic platform device probe code.
-
-Signed-off-by: Arnd Bergmann <arnd at arndb.de>
----
- drivers/net/ethernet/mediatek/mtk_eth_soc.c |    4 +++-
- 1 file changed, 3 insertions(+), 1 deletion(-)
-
---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-@@ -1678,7 +1678,9 @@ static int mtk_probe(struct platform_dev
- 	struct mtk_eth *eth;
- 	int err;
- 
--	device_reset(&pdev->dev);
-+	err = device_reset(&pdev->dev);
-+	if (err)
-+		return err;
- 
- 	match = of_match_device(of_mtk_match, &pdev->dev);
- 	soc = (struct mtk_soc_data *)match->data;
diff --git a/target/linux/mediatek/patches-4.4/0062-net-mediatek-watchdog_timeo-was-not-set.patch b/target/linux/mediatek/patches-4.4/0062-net-mediatek-watchdog_timeo-was-not-set.patch
deleted file mode 100644
index ca2e791..0000000
--- a/target/linux/mediatek/patches-4.4/0062-net-mediatek-watchdog_timeo-was-not-set.patch
+++ /dev/null
@@ -1,23 +0,0 @@
-From 387257cbd6f3f92de71e2f578d3a9414d0dada27 Mon Sep 17 00:00:00 2001
-From: John Crispin <blogic at openwrt.org>
-Date: Wed, 30 Mar 2016 03:18:17 +0200
-Subject: [PATCH 062/102] net: mediatek: watchdog_timeo was not set
-
-The original commit failed to set watchdog_timeo. This patch sets
-watchdog_timeo to HZ.
-
-Signed-off-by: John Crispin <blogic at openwrt.org>
----
- drivers/net/ethernet/mediatek/mtk_eth_soc.c |    1 +
- 1 file changed, 1 insertion(+)
-
---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-@@ -1645,6 +1645,7 @@ static int mtk_add_mac(struct mtk_eth *e
- 	mac->hw_stats->reg_offset = id * MTK_STAT_OFFSET;
- 
- 	SET_NETDEV_DEV(eth->netdev[id], eth->dev);
-+	eth->netdev[id]->watchdog_timeo = HZ;
- 	eth->netdev[id]->netdev_ops = &mtk_netdev_ops;
- 	eth->netdev[id]->base_addr = (unsigned long)eth->base;
- 	eth->netdev[id]->vlan_features = MTK_HW_FEATURES &
diff --git a/target/linux/mediatek/patches-4.4/0063-net-mediatek-mtk_cal_txd_req-returns-bad-value.patch b/target/linux/mediatek/patches-4.4/0063-net-mediatek-mtk_cal_txd_req-returns-bad-value.patch
deleted file mode 100644
index a81f165..0000000
--- a/target/linux/mediatek/patches-4.4/0063-net-mediatek-mtk_cal_txd_req-returns-bad-value.patch
+++ /dev/null
@@ -1,25 +0,0 @@
-From d8f3e96943334c91ecc0827ed0d3232068c389e6 Mon Sep 17 00:00:00 2001
-From: John Crispin <blogic at openwrt.org>
-Date: Tue, 22 Mar 2016 04:42:27 +0100
-Subject: [PATCH 063/102] net: mediatek: mtk_cal_txd_req() returns bad value
-
-The code used to also support the PDMA engine, which had 2 packet pointers
-per descriptor. Because of this we have to divide the result by 2 and round
-it up. This is no longer needed as the code only supports QDMA.
-
-Signed-off-by: John Crispin <blogic at openwrt.org>
----
- drivers/net/ethernet/mediatek/mtk_eth_soc.c |    2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-@@ -681,7 +681,7 @@ static inline int mtk_cal_txd_req(struct
- 		nfrags += skb_shinfo(skb)->nr_frags;
- 	}
- 
--	return DIV_ROUND_UP(nfrags, 2);
-+	return nfrags;
- }
- 
- static int mtk_start_xmit(struct sk_buff *skb, struct net_device *dev)
diff --git a/target/linux/mediatek/patches-4.4/0064-net-mediatek-remove-superflous-reset-call.patch b/target/linux/mediatek/patches-4.4/0064-net-mediatek-remove-superflous-reset-call.patch
deleted file mode 100644
index 434a6e3..0000000
--- a/target/linux/mediatek/patches-4.4/0064-net-mediatek-remove-superflous-reset-call.patch
+++ /dev/null
@@ -1,26 +0,0 @@
-From 2597d2cedba62b2a3fdca9c044187705f98a0372 Mon Sep 17 00:00:00 2001
-From: John Crispin <blogic at openwrt.org>
-Date: Fri, 25 Mar 2016 04:24:27 +0100
-Subject: [PATCH 064/102] net: mediatek: remove superflous reset call
-
-HW reset is triggered int he mtk_hw_init() function. There is no need to
-reset the core during probe.
-
-Signed-off-by: John Crispin <blogic at openwrt.org>
----
- drivers/net/ethernet/mediatek/mtk_eth_soc.c |    4 ----
- 1 file changed, 4 deletions(-)
-
---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-@@ -1679,10 +1679,6 @@ static int mtk_probe(struct platform_dev
- 	struct mtk_eth *eth;
- 	int err;
- 
--	err = device_reset(&pdev->dev);
--	if (err)
--		return err;
--
- 	match = of_match_device(of_mtk_match, &pdev->dev);
- 	soc = (struct mtk_soc_data *)match->data;
- 
diff --git a/target/linux/mediatek/patches-4.4/0065-net-mediatek-fix-stop-and-wakeup-of-queue.patch b/target/linux/mediatek/patches-4.4/0065-net-mediatek-fix-stop-and-wakeup-of-queue.patch
deleted file mode 100644
index 1660e42..0000000
--- a/target/linux/mediatek/patches-4.4/0065-net-mediatek-fix-stop-and-wakeup-of-queue.patch
+++ /dev/null
@@ -1,84 +0,0 @@
-From afc838dde560ab584d3fb0e4b011e4a6770dab3d Mon Sep 17 00:00:00 2001
-From: John Crispin <blogic at openwrt.org>
-Date: Tue, 29 Mar 2016 16:41:07 +0200
-Subject: [PATCH 065/102] net: mediatek: fix stop and wakeup of queue
-
-The driver supports 2 MACs. Both run on the same DMA ring. If we go
-above/below the TX rings thershold value, we always need to wake/stop
-the queu of both devices. Not doing to can cause TX stalls and packet
-drops on one of the devices.
-
-Signed-off-by: John Crispin <blogic at openwrt.org>
----
- drivers/net/ethernet/mediatek/mtk_eth_soc.c |   37 +++++++++++++++++++--------
- 1 file changed, 27 insertions(+), 10 deletions(-)
-
---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-@@ -684,6 +684,28 @@ static inline int mtk_cal_txd_req(struct
- 	return nfrags;
- }
- 
-+static void mtk_wake_queue(struct mtk_eth *eth)
-+{
-+	int i;
-+
-+	for (i = 0; i < MTK_MAC_COUNT; i++) {
-+		if (!eth->netdev[i])
-+			continue;
-+		netif_wake_queue(eth->netdev[i]);
-+	}
-+}
-+
-+static void mtk_stop_queue(struct mtk_eth *eth)
-+{
-+	int i;
-+
-+	for (i = 0; i < MTK_MAC_COUNT; i++) {
-+		if (!eth->netdev[i])
-+			continue;
-+		netif_stop_queue(eth->netdev[i]);
-+	}
-+}
-+
- static int mtk_start_xmit(struct sk_buff *skb, struct net_device *dev)
- {
- 	struct mtk_mac *mac = netdev_priv(dev);
-@@ -695,7 +717,7 @@ static int mtk_start_xmit(struct sk_buff
- 
- 	tx_num = mtk_cal_txd_req(skb);
- 	if (unlikely(atomic_read(&ring->free_count) <= tx_num)) {
--		netif_stop_queue(dev);
-+		mtk_stop_queue(eth);
- 		netif_err(eth, tx_queued, dev,
- 			  "Tx Ring full when queue awake!\n");
- 		return NETDEV_TX_BUSY;
-@@ -720,10 +742,10 @@ static int mtk_start_xmit(struct sk_buff
- 		goto drop;
- 
- 	if (unlikely(atomic_read(&ring->free_count) <= ring->thresh)) {
--		netif_stop_queue(dev);
-+		mtk_stop_queue(eth);
- 		if (unlikely(atomic_read(&ring->free_count) >
- 			     ring->thresh))
--			netif_wake_queue(dev);
-+			mtk_wake_queue(eth);
- 	}
- 
- 	return NETDEV_TX_OK;
-@@ -897,13 +919,8 @@ static int mtk_poll_tx(struct mtk_eth *e
- 	if (!total)
- 		return 0;
- 
--	for (i = 0; i < MTK_MAC_COUNT; i++) {
--		if (!eth->netdev[i] ||
--		    unlikely(!netif_queue_stopped(eth->netdev[i])))
--			continue;
--		if (atomic_read(&ring->free_count) > ring->thresh)
--			netif_wake_queue(eth->netdev[i]);
--	}
-+	if (atomic_read(&ring->free_count) > ring->thresh)
-+		mtk_wake_queue(eth);
- 
- 	return total;
- }
diff --git a/target/linux/mediatek/patches-4.4/0066-net-mediatek-fix-mtk_pending_work.patch b/target/linux/mediatek/patches-4.4/0066-net-mediatek-fix-mtk_pending_work.patch
deleted file mode 100644
index b233578..0000000
--- a/target/linux/mediatek/patches-4.4/0066-net-mediatek-fix-mtk_pending_work.patch
+++ /dev/null
@@ -1,58 +0,0 @@
-From e2cc73e6ddb0cc39b8f58654a449651a621916a9 Mon Sep 17 00:00:00 2001
-From: John Crispin <blogic at openwrt.org>
-Date: Tue, 29 Mar 2016 17:00:47 +0200
-Subject: [PATCH 066/102] net: mediatek: fix mtk_pending_work
-
-The driver supports 2 MACs. Both run on the same DMA ring. If we hit a TX
-timeout we need to stop both netdevs before retarting them again. If we
-dont do thsi, mtk_stop() wont shutdown DMA and the consecutive call to
-mtk_open() wont restart DMA and enable IRQs.
-
-Signed-off-by: John Crispin <blogic at openwrt.org>
----
- drivers/net/ethernet/mediatek/mtk_eth_soc.c |   30 +++++++++++++++++++--------
- 1 file changed, 21 insertions(+), 9 deletions(-)
-
---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-@@ -1430,19 +1430,31 @@ static int mtk_do_ioctl(struct net_devic
- 
- static void mtk_pending_work(struct work_struct *work)
- {
--	struct mtk_mac *mac = container_of(work, struct mtk_mac, pending_work);
--	struct mtk_eth *eth = mac->hw;
--	struct net_device *dev = eth->netdev[mac->id];
--	int err;
-+	struct mtk_eth *eth = container_of(work, struct mtk_eth, pending_work);
-+	int err, i;
-+	unsigned long restart = 0;
- 
- 	rtnl_lock();
--	mtk_stop(dev);
- 
--	err = mtk_open(dev);
--	if (err) {
--		netif_alert(eth, ifup, dev,
-+	/* stop all devices to make sure that dma is properly shut down */
-+	for (i = 0; i < MTK_MAC_COUNT; i++) {
-+		if (!netif_oper_up(eth->netdev[i]))
-+			continue;
-+		mtk_stop(eth->netdev[i]);
-+		__set_bit(i, &restart);
-+	}
-+
-+
-+	/* restart DMA and enable IRQs */
-+	for (i = 0; i < MTK_MAC_COUNT; i++) {
-+		if (!test_bit(i, &restart))
-+			continue;
-+		err = mtk_open(eth->netdev[i]);
-+		if (err) {
-+			netif_alert(eth, ifup, eth->netdev[i],
- 			    "Driver up/down cycle failed, closing device.\n");
--		dev_close(dev);
-+			dev_close(eth->netdev[i]);
-+		}
- 	}
- 	rtnl_unlock();
- }
diff --git a/target/linux/mediatek/patches-4.4/0067-net-mediatek-fix-TX-locking.patch b/target/linux/mediatek/patches-4.4/0067-net-mediatek-fix-TX-locking.patch
deleted file mode 100644
index d750de6..0000000
--- a/target/linux/mediatek/patches-4.4/0067-net-mediatek-fix-TX-locking.patch
+++ /dev/null
@@ -1,93 +0,0 @@
-From 6f152b2bdb295d86beb746494ef6fddf17986f8e Mon Sep 17 00:00:00 2001
-From: John Crispin <blogic at openwrt.org>
-Date: Tue, 29 Mar 2016 17:20:01 +0200
-Subject: [PATCH 067/102] net: mediatek: fix TX locking
-
-Inside the TX path there is a lock inside the tx_map function. This is
-however too late. The patch moves the lock to the start of the xmit
-function right before the free count check of the DMA ring happens.
-If we do not do this, the code becomes racy leading to TX stalls and
-dropped packets. This happens as there are 2 netdevs running on the
-same physical DMA ring.
-
-Signed-off-by: John Crispin <blogic at openwrt.org>
----
- drivers/net/ethernet/mediatek/mtk_eth_soc.c |   20 ++++++++++----------
- 1 file changed, 10 insertions(+), 10 deletions(-)
-
---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-@@ -536,7 +536,6 @@ static int mtk_tx_map(struct sk_buff *sk
- 	struct mtk_eth *eth = mac->hw;
- 	struct mtk_tx_dma *itxd, *txd;
- 	struct mtk_tx_buf *tx_buf;
--	unsigned long flags;
- 	dma_addr_t mapped_addr;
- 	unsigned int nr_frags;
- 	int i, n_desc = 1;
-@@ -568,11 +567,6 @@ static int mtk_tx_map(struct sk_buff *sk
- 	if (unlikely(dma_mapping_error(&dev->dev, mapped_addr)))
- 		return -ENOMEM;
- 
--	/* normally we can rely on the stack not calling this more than once,
--	 * however we have 2 queues running ont he same ring so we need to lock
--	 * the ring access
--	 */
--	spin_lock_irqsave(&eth->page_lock, flags);
- 	WRITE_ONCE(itxd->txd1, mapped_addr);
- 	tx_buf->flags |= MTK_TX_FLAGS_SINGLE0;
- 	dma_unmap_addr_set(tx_buf, dma_addr0, mapped_addr);
-@@ -632,8 +626,6 @@ static int mtk_tx_map(struct sk_buff *sk
- 	WRITE_ONCE(itxd->txd3, (TX_DMA_SWC | TX_DMA_PLEN0(skb_headlen(skb)) |
- 				(!nr_frags * TX_DMA_LS0)));
- 
--	spin_unlock_irqrestore(&eth->page_lock, flags);
--
- 	netdev_sent_queue(dev, skb->len);
- 	skb_tx_timestamp(skb);
- 
-@@ -661,8 +653,6 @@ err_dma:
- 		itxd = mtk_qdma_phys_to_virt(ring, itxd->txd2);
- 	} while (itxd != txd);
- 
--	spin_unlock_irqrestore(&eth->page_lock, flags);
--
- 	return -ENOMEM;
- }
- 
-@@ -712,14 +702,22 @@ static int mtk_start_xmit(struct sk_buff
- 	struct mtk_eth *eth = mac->hw;
- 	struct mtk_tx_ring *ring = &eth->tx_ring;
- 	struct net_device_stats *stats = &dev->stats;
-+	unsigned long flags;
- 	bool gso = false;
- 	int tx_num;
- 
-+	/* normally we can rely on the stack not calling this more than once,
-+	 * however we have 2 queues running ont he same ring so we need to lock
-+	 * the ring access
-+	 */
-+	spin_lock_irqsave(&eth->page_lock, flags);
-+
- 	tx_num = mtk_cal_txd_req(skb);
- 	if (unlikely(atomic_read(&ring->free_count) <= tx_num)) {
- 		mtk_stop_queue(eth);
- 		netif_err(eth, tx_queued, dev,
- 			  "Tx Ring full when queue awake!\n");
-+		spin_unlock_irqrestore(&eth->page_lock, flags);
- 		return NETDEV_TX_BUSY;
- 	}
- 
-@@ -747,10 +745,12 @@ static int mtk_start_xmit(struct sk_buff
- 			     ring->thresh))
- 			mtk_wake_queue(eth);
- 	}
-+	spin_unlock_irqrestore(&eth->page_lock, flags);
- 
- 	return NETDEV_TX_OK;
- 
- drop:
-+	spin_unlock_irqrestore(&eth->page_lock, flags);
- 	stats->tx_dropped++;
- 	dev_kfree_skb(skb);
- 	return NETDEV_TX_OK;
diff --git a/target/linux/mediatek/patches-4.4/0068-net-mediatek-move-the-pending_work-struct-to-the-dev.patch b/target/linux/mediatek/patches-4.4/0068-net-mediatek-move-the-pending_work-struct-to-the-dev.patch
deleted file mode 100644
index 4973091..0000000
--- a/target/linux/mediatek/patches-4.4/0068-net-mediatek-move-the-pending_work-struct-to-the-dev.patch
+++ /dev/null
@@ -1,102 +0,0 @@
-From 29bc7a1e374425937b5dd2f316dbeef343d4c68a Mon Sep 17 00:00:00 2001
-From: John Crispin <blogic at openwrt.org>
-Date: Tue, 29 Mar 2016 17:24:24 +0200
-Subject: [PATCH 068/102] net: mediatek: move the pending_work struct to the
- device generic struct
-
-The worker always touches both netdevs. It is ethernet core and not MAC
-specific. We only need one worker, which belongs into the ethernets core struct.
-
-Signed-off-by: John Crispin <blogic at openwrt.org>
----
- drivers/net/ethernet/mediatek/mtk_eth_soc.c |   10 ++++------
- drivers/net/ethernet/mediatek/mtk_eth_soc.h |    4 ++--
- 2 files changed, 6 insertions(+), 8 deletions(-)
-
---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-@@ -1193,7 +1193,7 @@ static void mtk_tx_timeout(struct net_de
- 	eth->netdev[mac->id]->stats.tx_errors++;
- 	netif_err(eth, tx_err, dev,
- 		  "transmit timed out\n");
--	schedule_work(&mac->pending_work);
-+	schedule_work(&eth->pending_work);
- }
- 
- static irqreturn_t mtk_handle_irq(int irq, void *_eth)
-@@ -1438,7 +1438,7 @@ static void mtk_pending_work(struct work
- 
- 	/* stop all devices to make sure that dma is properly shut down */
- 	for (i = 0; i < MTK_MAC_COUNT; i++) {
--		if (!netif_oper_up(eth->netdev[i]))
-+		if (!eth->netdev[i])
- 			continue;
- 		mtk_stop(eth->netdev[i]);
- 		__set_bit(i, &restart);
-@@ -1464,15 +1464,13 @@ static int mtk_cleanup(struct mtk_eth *e
- 	int i;
- 
- 	for (i = 0; i < MTK_MAC_COUNT; i++) {
--		struct mtk_mac *mac = netdev_priv(eth->netdev[i]);
--
- 		if (!eth->netdev[i])
- 			continue;
- 
- 		unregister_netdev(eth->netdev[i]);
- 		free_netdev(eth->netdev[i]);
--		cancel_work_sync(&mac->pending_work);
- 	}
-+	cancel_work_sync(&eth->pending_work);
- 
- 	return 0;
- }
-@@ -1660,7 +1658,6 @@ static int mtk_add_mac(struct mtk_eth *e
- 	mac->id = id;
- 	mac->hw = eth;
- 	mac->of_node = np;
--	INIT_WORK(&mac->pending_work, mtk_pending_work);
- 
- 	mac->hw_stats = devm_kzalloc(eth->dev,
- 				     sizeof(*mac->hw_stats),
-@@ -1762,6 +1759,7 @@ static int mtk_probe(struct platform_dev
- 
- 	eth->dev = &pdev->dev;
- 	eth->msg_enable = netif_msg_init(mtk_msg_level, MTK_DEFAULT_MSG_ENABLE);
-+	INIT_WORK(&eth->pending_work, mtk_pending_work);
- 
- 	err = mtk_hw_init(eth);
- 	if (err)
---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h
-+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
-@@ -363,6 +363,7 @@ struct mtk_rx_ring {
-  * @clk_gp1:		The gmac1 clock
-  * @clk_gp2:		The gmac2 clock
-  * @mii_bus:		If there is a bus we need to create an instance for it
-+ * @pending_work:	The workqueue used to reset the dma ring
-  */
- 
- struct mtk_eth {
-@@ -389,6 +390,7 @@ struct mtk_eth {
- 	struct clk			*clk_gp1;
- 	struct clk			*clk_gp2;
- 	struct mii_bus			*mii_bus;
-+	struct work_struct		pending_work;
- };
- 
- /* struct mtk_mac -	the structure that holds the info about the MACs of the
-@@ -398,7 +400,6 @@ struct mtk_eth {
-  * @hw:			Backpointer to our main datastruture
-  * @hw_stats:		Packet statistics counter
-  * @phy_dev:		The attached PHY if available
-- * @pending_work:	The workqueue used to reset the dma ring
-  */
- struct mtk_mac {
- 	int				id;
-@@ -406,7 +407,6 @@ struct mtk_mac {
- 	struct mtk_eth			*hw;
- 	struct mtk_hw_stats		*hw_stats;
- 	struct phy_device		*phy_dev;
--	struct work_struct		pending_work;
- };
- 
- /* the struct describing the SoC. these are declared in the soc_xyz.c files */
diff --git a/target/linux/mediatek/patches-4.4/0069-net-mediatek-do-not-set-the-QID-field-in-the-TX-DMA-.patch b/target/linux/mediatek/patches-4.4/0069-net-mediatek-do-not-set-the-QID-field-in-the-TX-DMA-.patch
deleted file mode 100644
index 72f96e2..0000000
--- a/target/linux/mediatek/patches-4.4/0069-net-mediatek-do-not-set-the-QID-field-in-the-TX-DMA-.patch
+++ /dev/null
@@ -1,32 +0,0 @@
-From 4742349c1595d38b3e3b463e66cf21af4217c869 Mon Sep 17 00:00:00 2001
-From: John Crispin <blogic at openwrt.org>
-Date: Thu, 7 Apr 2016 17:36:23 +0200
-Subject: [PATCH 069/102] net: mediatek: do not set the QID field in the TX
- DMA descriptors
-
-The QID field gets set to the mac id. This made the DMA linked list queue
-the traffic of each MAC on a different internal queue. However during long
-term testing we found that this will cause traffic stalls as the multi
-queue setup requires a more complete initialisation which is not part of
-the upstream driver yet.
-
-This patch removes the code setting the QID field, resulting in all
-traffic ending up in queue 0 which works without any special setup.
-
-Signed-off-by: John Crispin <blogic at openwrt.org>
----
- drivers/net/ethernet/mediatek/mtk_eth_soc.c |    3 +--
- 1 file changed, 1 insertion(+), 2 deletions(-)
-
---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-@@ -603,8 +603,7 @@ static int mtk_tx_map(struct sk_buff *sk
- 			WRITE_ONCE(txd->txd1, mapped_addr);
- 			WRITE_ONCE(txd->txd3, (TX_DMA_SWC |
- 					       TX_DMA_PLEN0(frag_map_size) |
--					       last_frag * TX_DMA_LS0) |
--					       mac->id);
-+					       last_frag * TX_DMA_LS0));
- 			WRITE_ONCE(txd->txd4, 0);
- 
- 			tx_buf->skb = (struct sk_buff *)MTK_DMA_DUMMY_DESC;
diff --git a/target/linux/mediatek/patches-4.4/0070-net-mediatek-update-the-IRQ-part-of-the-binding-docu.patch b/target/linux/mediatek/patches-4.4/0070-net-mediatek-update-the-IRQ-part-of-the-binding-docu.patch
deleted file mode 100644
index afb0174..0000000
--- a/target/linux/mediatek/patches-4.4/0070-net-mediatek-update-the-IRQ-part-of-the-binding-docu.patch
+++ /dev/null
@@ -1,41 +0,0 @@
-From 297ef52cd21e28da671996d7b4f39f268d2d0ec1 Mon Sep 17 00:00:00 2001
-From: John Crispin <blogic at openwrt.org>
-Date: Tue, 29 Mar 2016 14:32:07 +0200
-Subject: [PATCH 070/102] net: mediatek: update the IRQ part of the binding
- document
-
-The current binding document only describes a single interrupt. Update the
-document by adding the 2 other interrupts.
-
-The driver currently only uses a single interrupt. The HW is however able
-to using IRQ grouping to split TX and RX onto separate GIC irqs.
-
-Signed-off-by: John Crispin <blogic at openwrt.org>
- Acked-by: Rob Herring <robh at kernel.org>
----
- Documentation/devicetree/bindings/net/mediatek-net.txt |    7 +++++--
- 1 file changed, 5 insertions(+), 2 deletions(-)
-
---- a/Documentation/devicetree/bindings/net/mediatek-net.txt
-+++ b/Documentation/devicetree/bindings/net/mediatek-net.txt
-@@ -9,7 +9,8 @@ have dual GMAC each represented by a chi
- Required properties:
- - compatible: Should be "mediatek,mt2701-eth"
- - reg: Address and length of the register set for the device
--- interrupts: Should contain the frame engines interrupt
-+- interrupts: Should contain the three frame engines interrupts in numeric
-+	order. These are fe_int0, fe_int1 and fe_int2.
- - clocks: the clock used by the core
- - clock-names: the names of the clock listed in the clocks property. These are
- 	"ethif", "esw", "gp2", "gp1"
-@@ -42,7 +43,9 @@ eth: ethernet at 1b100000 {
- 		 <&ethsys CLK_ETHSYS_GP2>,
- 		 <&ethsys CLK_ETHSYS_GP1>;
- 	clock-names = "ethif", "esw", "gp2", "gp1";
--	interrupts = <GIC_SPI 200 IRQ_TYPE_LEVEL_LOW>;
-+	interrupts = <GIC_SPI 200 IRQ_TYPE_LEVEL_LOW
-+		      GIC_SPI 199 IRQ_TYPE_LEVEL_LOW
-+		      GIC_SPI 198 IRQ_TYPE_LEVEL_LOW>;
- 	power-domains = <&scpsys MT2701_POWER_DOMAIN_ETH>;
- 	resets = <&ethsys MT2701_ETHSYS_ETH_RST>;
- 	reset-names = "eth";
diff --git a/target/linux/mediatek/patches-4.4/0072-mtd-backport-v4.7-0day-patches-from-Boris.patch b/target/linux/mediatek/patches-4.4/0072-mtd-backport-v4.7-0day-patches-from-Boris.patch
deleted file mode 100644
index b45d3aa..0000000
--- a/target/linux/mediatek/patches-4.4/0072-mtd-backport-v4.7-0day-patches-from-Boris.patch
+++ /dev/null
@@ -1,5286 +0,0 @@
-From a369af5149e6eb442b22ce89b564dd7a76e03638 Mon Sep 17 00:00:00 2001
-From: John Crispin <blogic at openwrt.org>
-Date: Tue, 26 Apr 2016 19:05:01 +0200
-Subject: [PATCH 072/102] mtd: backport v4.7-0day patches from Boris
-
-Signed-off-by: John Crispin <blogic at openwrt.org>
----
- drivers/mtd/Kconfig                 |    4 +-
- drivers/mtd/cmdlinepart.c           |    3 +-
- drivers/mtd/devices/m25p80.c        |   44 +--
- drivers/mtd/maps/physmap_of.c       |    6 +-
- drivers/mtd/mtdchar.c               |  123 ++++++--
- drivers/mtd/mtdconcat.c             |    2 +-
- drivers/mtd/mtdcore.c               |  428 ++++++++++++++++++++++++--
- drivers/mtd/mtdcore.h               |    7 +-
- drivers/mtd/mtdpart.c               |  161 ++++++----
- drivers/mtd/mtdswap.c               |   24 +-
- drivers/mtd/nand/Kconfig            |   21 +-
- drivers/mtd/nand/Makefile           |    2 +
- drivers/mtd/nand/nand_base.c        |  571 +++++++++++++++++++----------------
- drivers/mtd/nand/nand_bbt.c         |   34 +--
- drivers/mtd/nand/nand_bch.c         |   52 ++--
- drivers/mtd/nand/nand_ecc.c         |    6 +-
- drivers/mtd/nand/nand_ids.c         |    4 +-
- drivers/mtd/nand/nandsim.c          |   43 +--
- drivers/mtd/ofpart.c                |   53 ++--
- drivers/mtd/spi-nor/Kconfig         |   10 +-
- drivers/mtd/spi-nor/Makefile        |    1 +
- drivers/mtd/spi-nor/mtk-quadspi.c   |  485 +++++++++++++++++++++++++++++
- drivers/mtd/spi-nor/spi-nor.c       |  321 +++++++++++++-------
- drivers/mtd/tests/mtd_nandecctest.c |    2 +-
- drivers/mtd/tests/oobtest.c         |   49 ++-
- drivers/mtd/tests/pagetest.c        |    3 +-
- include/linux/mtd/bbm.h             |    1 -
- include/linux/mtd/fsmc.h            |   18 --
- include/linux/mtd/inftl.h           |    1 -
- include/linux/mtd/map.h             |    9 +-
- include/linux/mtd/mtd.h             |   80 ++++-
- include/linux/mtd/nand.h            |   94 ++++--
- include/linux/mtd/nand_bch.h        |   10 +-
- include/linux/mtd/nftl.h            |    1 -
- include/linux/mtd/onenand.h         |    2 -
- include/linux/mtd/partitions.h      |   27 +-
- include/linux/mtd/sh_flctl.h        |    4 +-
- include/linux/mtd/sharpsl.h         |    2 +-
- include/linux/mtd/spi-nor.h         |   23 +-
- include/uapi/mtd/mtd-abi.h          |    2 +-
- 45 files changed, 2077 insertions(+), 748 deletions(-)
- create mode 100644 drivers/mtd/spi-nor/mtk-quadspi.c
-
---- a/drivers/mtd/Kconfig
-+++ b/drivers/mtd/Kconfig
-@@ -131,7 +131,7 @@ config MTD_CMDLINE_PARTS
- 
- config MTD_AFS_PARTS
- 	tristate "ARM Firmware Suite partition parsing"
--	depends on ARM
-+	depends on (ARM || ARM64)
- 	---help---
- 	  The ARM Firmware Suite allows the user to divide flash devices into
- 	  multiple 'images'. Each such image has a header containing its name
-@@ -161,7 +161,7 @@ config MTD_AR7_PARTS
- 
- config MTD_BCM63XX_PARTS
- 	tristate "BCM63XX CFE partitioning support"
--	depends on BCM63XX
-+	depends on BCM63XX || BMIPS_GENERIC || COMPILE_TEST
- 	select CRC32
- 	help
- 	  This provides partions parsing for BCM63xx devices with CFE
---- a/drivers/mtd/cmdlinepart.c
-+++ b/drivers/mtd/cmdlinepart.c
-@@ -304,7 +304,7 @@ static int mtdpart_setup_real(char *s)
-  * the first one in the chain if a NULL mtd_id is passed in.
-  */
- static int parse_cmdline_partitions(struct mtd_info *master,
--				    struct mtd_partition **pparts,
-+				    const struct mtd_partition **pparts,
- 				    struct mtd_part_parser_data *data)
- {
- 	unsigned long long offset;
-@@ -382,7 +382,6 @@ static int __init mtdpart_setup(char *s)
- __setup("mtdparts=", mtdpart_setup);
- 
- static struct mtd_part_parser cmdline_parser = {
--	.owner = THIS_MODULE,
- 	.parse_fn = parse_cmdline_partitions,
- 	.name = "cmdlinepart",
- };
---- a/drivers/mtd/devices/m25p80.c
-+++ b/drivers/mtd/devices/m25p80.c
-@@ -174,22 +174,6 @@ static int m25p80_read(struct spi_nor *n
- 	return 0;
- }
- 
--static int m25p80_erase(struct spi_nor *nor, loff_t offset)
--{
--	struct m25p *flash = nor->priv;
--
--	dev_dbg(nor->dev, "%dKiB at 0x%08x\n",
--		flash->spi_nor.mtd.erasesize / 1024, (u32)offset);
--
--	/* Set up command buffer. */
--	flash->command[0] = nor->erase_opcode;
--	m25p_addr2cmd(nor, offset, flash->command);
--
--	spi_write(flash->spi, flash->command, m25p_cmdsz(nor));
--
--	return 0;
--}
--
- /*
-  * board specific setup should have ensured the SPI clock used here
-  * matches what the READ command supports, at least until this driver
-@@ -197,12 +181,11 @@ static int m25p80_erase(struct spi_nor *
-  */
- static int m25p_probe(struct spi_device *spi)
- {
--	struct mtd_part_parser_data	ppdata;
- 	struct flash_platform_data	*data;
- 	struct m25p *flash;
- 	struct spi_nor *nor;
- 	enum read_mode mode = SPI_NOR_NORMAL;
--	char *flash_name = NULL;
-+	char *flash_name;
- 	int ret;
- 
- 	data = dev_get_platdata(&spi->dev);
-@@ -216,12 +199,11 @@ static int m25p_probe(struct spi_device
- 	/* install the hooks */
- 	nor->read = m25p80_read;
- 	nor->write = m25p80_write;
--	nor->erase = m25p80_erase;
- 	nor->write_reg = m25p80_write_reg;
- 	nor->read_reg = m25p80_read_reg;
- 
- 	nor->dev = &spi->dev;
--	nor->flash_node = spi->dev.of_node;
-+	spi_nor_set_flash_node(nor, spi->dev.of_node);
- 	nor->priv = flash;
- 
- 	spi_set_drvdata(spi, flash);
-@@ -242,6 +224,8 @@ static int m25p_probe(struct spi_device
- 	 */
- 	if (data && data->type)
- 		flash_name = data->type;
-+	else if (!strcmp(spi->modalias, "spi-nor"))
-+		flash_name = NULL; /* auto-detect */
- 	else
- 		flash_name = spi->modalias;
- 
-@@ -249,11 +233,8 @@ static int m25p_probe(struct spi_device
- 	if (ret)
- 		return ret;
- 
--	ppdata.of_node = spi->dev.of_node;
--
--	return mtd_device_parse_register(&nor->mtd, NULL, &ppdata,
--			data ? data->parts : NULL,
--			data ? data->nr_parts : 0);
-+	return mtd_device_register(&nor->mtd, data ? data->parts : NULL,
-+				   data ? data->nr_parts : 0);
- }
- 
- 
-@@ -279,14 +260,21 @@ static int m25p_remove(struct spi_device
-  */
- static const struct spi_device_id m25p_ids[] = {
- 	/*
-+	 * Allow non-DT platform devices to bind to the "spi-nor" modalias, and
-+	 * hack around the fact that the SPI core does not provide uevent
-+	 * matching for .of_match_table
-+	 */
-+	{"spi-nor"},
-+
-+	/*
- 	 * Entries not used in DTs that should be safe to drop after replacing
--	 * them with "nor-jedec" in platform data.
-+	 * them with "spi-nor" in platform data.
- 	 */
- 	{"s25sl064a"},	{"w25x16"},	{"m25p10"},	{"m25px64"},
- 
- 	/*
--	 * Entries that were used in DTs without "nor-jedec" fallback and should
--	 * be kept for backward compatibility.
-+	 * Entries that were used in DTs without "jedec,spi-nor" fallback and
-+	 * should be kept for backward compatibility.
- 	 */
- 	{"at25df321a"},	{"at25df641"},	{"at26df081a"},
- 	{"mr25h256"},
---- a/drivers/mtd/maps/physmap_of.c
-+++ b/drivers/mtd/maps/physmap_of.c
-@@ -128,7 +128,6 @@ static int of_flash_probe(struct platfor
- 	int reg_tuple_size;
- 	struct mtd_info **mtd_list = NULL;
- 	resource_size_t res_size;
--	struct mtd_part_parser_data ppdata;
- 	bool map_indirect;
- 	const char *mtd_name = NULL;
- 
-@@ -272,8 +271,9 @@ static int of_flash_probe(struct platfor
- 	if (err)
- 		goto err_out;
- 
--	ppdata.of_node = dp;
--	mtd_device_parse_register(info->cmtd, part_probe_types_def, &ppdata,
-+	info->cmtd->dev.parent = &dev->dev;
-+	mtd_set_of_node(info->cmtd, dp);
-+	mtd_device_parse_register(info->cmtd, part_probe_types_def, NULL,
- 			NULL, 0);
- 
- 	kfree(mtd_list);
---- a/drivers/mtd/mtdchar.c
-+++ b/drivers/mtd/mtdchar.c
-@@ -465,38 +465,111 @@ static int mtdchar_readoob(struct file *
- }
- 
- /*
-- * Copies (and truncates, if necessary) data from the larger struct,
-- * nand_ecclayout, to the smaller, deprecated layout struct,
-- * nand_ecclayout_user. This is necessary only to support the deprecated
-- * API ioctl ECCGETLAYOUT while allowing all new functionality to use
-- * nand_ecclayout flexibly (i.e. the struct may change size in new
-- * releases without requiring major rewrites).
-+ * Copies (and truncates, if necessary) OOB layout information to the
-+ * deprecated layout struct, nand_ecclayout_user. This is necessary only to
-+ * support the deprecated API ioctl ECCGETLAYOUT while allowing all new
-+ * functionality to use mtd_ooblayout_ops flexibly (i.e. mtd_ooblayout_ops
-+ * can describe any kind of OOB layout with almost zero overhead from a
-+ * memory usage point of view).
-  */
--static int shrink_ecclayout(const struct nand_ecclayout *from,
--		struct nand_ecclayout_user *to)
-+static int shrink_ecclayout(struct mtd_info *mtd,
-+			    struct nand_ecclayout_user *to)
- {
--	int i;
-+	struct mtd_oob_region oobregion;
-+	int i, section = 0, ret;
- 
--	if (!from || !to)
-+	if (!mtd || !to)
- 		return -EINVAL;
- 
- 	memset(to, 0, sizeof(*to));
- 
--	to->eccbytes = min((int)from->eccbytes, MTD_MAX_ECCPOS_ENTRIES);
--	for (i = 0; i < to->eccbytes; i++)
--		to->eccpos[i] = from->eccpos[i];
-+	to->eccbytes = 0;
-+	for (i = 0; i < MTD_MAX_ECCPOS_ENTRIES;) {
-+		u32 eccpos;
-+
-+		ret = mtd_ooblayout_ecc(mtd, section, &oobregion);
-+		if (ret < 0) {
-+			if (ret != -ERANGE)
-+				return ret;
-+
-+			break;
-+		}
-+
-+		eccpos = oobregion.offset;
-+		for (; i < MTD_MAX_ECCPOS_ENTRIES &&
-+		       eccpos < oobregion.offset + oobregion.length; i++) {
-+			to->eccpos[i] = eccpos++;
-+			to->eccbytes++;
-+		}
-+	}
- 
- 	for (i = 0; i < MTD_MAX_OOBFREE_ENTRIES; i++) {
--		if (from->oobfree[i].length == 0 &&
--				from->oobfree[i].offset == 0)
-+		ret = mtd_ooblayout_free(mtd, i, &oobregion);
-+		if (ret < 0) {
-+			if (ret != -ERANGE)
-+				return ret;
-+
- 			break;
--		to->oobavail += from->oobfree[i].length;
--		to->oobfree[i] = from->oobfree[i];
-+		}
-+
-+		to->oobfree[i].offset = oobregion.offset;
-+		to->oobfree[i].length = oobregion.length;
-+		to->oobavail += to->oobfree[i].length;
- 	}
- 
- 	return 0;
- }
- 
-+static int get_oobinfo(struct mtd_info *mtd, struct nand_oobinfo *to)
-+{
-+	struct mtd_oob_region oobregion;
-+	int i, section = 0, ret;
-+
-+	if (!mtd || !to)
-+		return -EINVAL;
-+
-+	memset(to, 0, sizeof(*to));
-+
-+	to->eccbytes = 0;
-+	for (i = 0; i < ARRAY_SIZE(to->eccpos);) {
-+		u32 eccpos;
-+
-+		ret = mtd_ooblayout_ecc(mtd, section, &oobregion);
-+		if (ret < 0) {
-+			if (ret != -ERANGE)
-+				return ret;
-+
-+			break;
-+		}
-+
-+		if (oobregion.length + i > ARRAY_SIZE(to->eccpos))
-+			return -EINVAL;
-+
-+		eccpos = oobregion.offset;
-+		for (; eccpos < oobregion.offset + oobregion.length; i++) {
-+			to->eccpos[i] = eccpos++;
-+			to->eccbytes++;
-+		}
-+	}
-+
-+	for (i = 0; i < 8; i++) {
-+		ret = mtd_ooblayout_free(mtd, i, &oobregion);
-+		if (ret < 0) {
-+			if (ret != -ERANGE)
-+				return ret;
-+
-+			break;
-+		}
-+
-+		to->oobfree[i][0] = oobregion.offset;
-+		to->oobfree[i][1] = oobregion.length;
-+	}
-+
-+	to->useecc = MTD_NANDECC_AUTOPLACE;
-+
-+	return 0;
-+}
-+
- static int mtdchar_blkpg_ioctl(struct mtd_info *mtd,
- 			       struct blkpg_ioctl_arg *arg)
- {
-@@ -815,16 +888,12 @@ static int mtdchar_ioctl(struct file *fi
- 	{
- 		struct nand_oobinfo oi;
- 
--		if (!mtd->ecclayout)
-+		if (!mtd->ooblayout)
- 			return -EOPNOTSUPP;
--		if (mtd->ecclayout->eccbytes > ARRAY_SIZE(oi.eccpos))
--			return -EINVAL;
- 
--		oi.useecc = MTD_NANDECC_AUTOPLACE;
--		memcpy(&oi.eccpos, mtd->ecclayout->eccpos, sizeof(oi.eccpos));
--		memcpy(&oi.oobfree, mtd->ecclayout->oobfree,
--		       sizeof(oi.oobfree));
--		oi.eccbytes = mtd->ecclayout->eccbytes;
-+		ret = get_oobinfo(mtd, &oi);
-+		if (ret)
-+			return ret;
- 
- 		if (copy_to_user(argp, &oi, sizeof(struct nand_oobinfo)))
- 			return -EFAULT;
-@@ -913,14 +982,14 @@ static int mtdchar_ioctl(struct file *fi
- 	{
- 		struct nand_ecclayout_user *usrlay;
- 
--		if (!mtd->ecclayout)
-+		if (!mtd->ooblayout)
- 			return -EOPNOTSUPP;
- 
- 		usrlay = kmalloc(sizeof(*usrlay), GFP_KERNEL);
- 		if (!usrlay)
- 			return -ENOMEM;
- 
--		shrink_ecclayout(mtd->ecclayout, usrlay);
-+		shrink_ecclayout(mtd, usrlay);
- 
- 		if (copy_to_user(argp, usrlay, sizeof(*usrlay)))
- 			ret = -EFAULT;
---- a/drivers/mtd/mtdconcat.c
-+++ b/drivers/mtd/mtdconcat.c
-@@ -777,7 +777,7 @@ struct mtd_info *mtd_concat_create(struc
- 
- 	}
- 
--	concat->mtd.ecclayout = subdev[0]->ecclayout;
-+	mtd_set_ooblayout(&concat->mtd, subdev[0]->ooblayout);
- 
- 	concat->num_subdev = num_devs;
- 	concat->mtd.name = name;
---- a/drivers/mtd/mtdcore.c
-+++ b/drivers/mtd/mtdcore.c
-@@ -32,6 +32,7 @@
- #include <linux/err.h>
- #include <linux/ioctl.h>
- #include <linux/init.h>
-+#include <linux/of.h>
- #include <linux/proc_fs.h>
- #include <linux/idr.h>
- #include <linux/backing-dev.h>
-@@ -446,6 +447,7 @@ int add_mtd_device(struct mtd_info *mtd)
- 	mtd->dev.devt = MTD_DEVT(i);
- 	dev_set_name(&mtd->dev, "mtd%d", i);
- 	dev_set_drvdata(&mtd->dev, mtd);
-+	of_node_get(mtd_get_of_node(mtd));
- 	error = device_register(&mtd->dev);
- 	if (error)
- 		goto fail_added;
-@@ -477,6 +479,7 @@ int add_mtd_device(struct mtd_info *mtd)
- 	return 0;
- 
- fail_added:
-+	of_node_put(mtd_get_of_node(mtd));
- 	idr_remove(&mtd_idr, i);
- fail_locked:
- 	mutex_unlock(&mtd_table_mutex);
-@@ -518,6 +521,7 @@ int del_mtd_device(struct mtd_info *mtd)
- 		device_unregister(&mtd->dev);
- 
- 		idr_remove(&mtd_idr, mtd->index);
-+		of_node_put(mtd_get_of_node(mtd));
- 
- 		module_put(THIS_MODULE);
- 		ret = 0;
-@@ -529,9 +533,10 @@ out_error:
- }
- 
- static int mtd_add_device_partitions(struct mtd_info *mtd,
--				     struct mtd_partition *real_parts,
--				     int nbparts)
-+				     struct mtd_partitions *parts)
- {
-+	const struct mtd_partition *real_parts = parts->parts;
-+	int nbparts = parts->nr_parts;
- 	int ret;
- 
- 	if (nbparts == 0 || IS_ENABLED(CONFIG_MTD_PARTITIONED_MASTER)) {
-@@ -600,29 +605,29 @@ int mtd_device_parse_register(struct mtd
- 			      const struct mtd_partition *parts,
- 			      int nr_parts)
- {
-+	struct mtd_partitions parsed;
- 	int ret;
--	struct mtd_partition *real_parts = NULL;
- 
- 	mtd_set_dev_defaults(mtd);
- 
--	ret = parse_mtd_partitions(mtd, types, &real_parts, parser_data);
--	if (ret <= 0 && nr_parts && parts) {
--		real_parts = kmemdup(parts, sizeof(*parts) * nr_parts,
--				     GFP_KERNEL);
--		if (!real_parts)
--			ret = -ENOMEM;
--		else
--			ret = nr_parts;
--	}
--	/* Didn't come up with either parsed OR fallback partitions */
--	if (ret < 0) {
--		pr_info("mtd: failed to find partitions; one or more parsers reports errors (%d)\n",
-+	memset(&parsed, 0, sizeof(parsed));
-+
-+	ret = parse_mtd_partitions(mtd, types, &parsed, parser_data);
-+	if ((ret < 0 || parsed.nr_parts == 0) && parts && nr_parts) {
-+		/* Fall back to driver-provided partitions */
-+		parsed = (struct mtd_partitions){
-+			.parts		= parts,
-+			.nr_parts	= nr_parts,
-+		};
-+	} else if (ret < 0) {
-+		/* Didn't come up with parsed OR fallback partitions */
-+			pr_info("mtd: failed to find partitions; one or more parsers reports errors (%d)\n",
- 			ret);
- 		/* Don't abort on errors; we can still use unpartitioned MTD */
--		ret = 0;
-+		memset(&parsed, 0, sizeof(parsed));
- 	}
- 
--	ret = mtd_add_device_partitions(mtd, real_parts, ret);
-+	ret = mtd_add_device_partitions(mtd, &parsed);
- 	if (ret)
- 		goto out;
- 
-@@ -642,7 +647,8 @@ int mtd_device_parse_register(struct mtd
- 	}
- 
- out:
--	kfree(real_parts);
-+	/* Cleanup any parsed partitions */
-+	mtd_part_parser_cleanup(&parsed);
- 	return ret;
- }
- EXPORT_SYMBOL_GPL(mtd_device_parse_register);
-@@ -767,7 +773,6 @@ out:
- }
- EXPORT_SYMBOL_GPL(get_mtd_device);
- 
--
- int __get_mtd_device(struct mtd_info *mtd)
- {
- 	int err;
-@@ -1001,6 +1006,366 @@ int mtd_read_oob(struct mtd_info *mtd, l
- }
- EXPORT_SYMBOL_GPL(mtd_read_oob);
- 
-+/**
-+ * mtd_ooblayout_ecc - Get the OOB region definition of a specific ECC section
-+ * @mtd: MTD device structure
-+ * @section: ECC section. Depending on the layout you may have all the ECC
-+ *	     bytes stored in a single contiguous section, or one section
-+ *	     per ECC chunk (and sometime several sections for a single ECC
-+ *	     ECC chunk)
-+ * @oobecc: OOB region struct filled with the appropriate ECC position
-+ *	    information
-+ *
-+ * This functions return ECC section information in the OOB area. I you want
-+ * to get all the ECC bytes information, then you should call
-+ * mtd_ooblayout_ecc(mtd, section++, oobecc) until it returns -ERANGE.
-+ *
-+ * Returns zero on success, a negative error code otherwise.
-+ */
-+int mtd_ooblayout_ecc(struct mtd_info *mtd, int section,
-+		      struct mtd_oob_region *oobecc)
-+{
-+	memset(oobecc, 0, sizeof(*oobecc));
-+
-+	if (!mtd || section < 0)
-+		return -EINVAL;
-+
-+	if (!mtd->ooblayout || !mtd->ooblayout->ecc)
-+		return -ENOTSUPP;
-+
-+	return mtd->ooblayout->ecc(mtd, section, oobecc);
-+}
-+EXPORT_SYMBOL_GPL(mtd_ooblayout_ecc);
-+
-+/**
-+ * mtd_ooblayout_free - Get the OOB region definition of a specific free
-+ *			section
-+ * @mtd: MTD device structure
-+ * @section: Free section you are interested in. Depending on the layout
-+ *	     you may have all the free bytes stored in a single contiguous
-+ *	     section, or one section per ECC chunk plus an extra section
-+ *	     for the remaining bytes (or other funky layout).
-+ * @oobfree: OOB region struct filled with the appropriate free position
-+ *	     information
-+ *
-+ * This functions return free bytes position in the OOB area. I you want
-+ * to get all the free bytes information, then you should call
-+ * mtd_ooblayout_free(mtd, section++, oobfree) until it returns -ERANGE.
-+ *
-+ * Returns zero on success, a negative error code otherwise.
-+ */
-+int mtd_ooblayout_free(struct mtd_info *mtd, int section,
-+		       struct mtd_oob_region *oobfree)
-+{
-+	memset(oobfree, 0, sizeof(*oobfree));
-+
-+	if (!mtd || section < 0)
-+		return -EINVAL;
-+
-+	if (!mtd->ooblayout || !mtd->ooblayout->free)
-+		return -ENOTSUPP;
-+
-+	return mtd->ooblayout->free(mtd, section, oobfree);
-+}
-+EXPORT_SYMBOL_GPL(mtd_ooblayout_free);
-+
-+/**
-+ * mtd_ooblayout_find_region - Find the region attached to a specific byte
-+ * @mtd: mtd info structure
-+ * @byte: the byte we are searching for
-+ * @sectionp: pointer where the section id will be stored
-+ * @oobregion: used to retrieve the ECC position
-+ * @iter: iterator function. Should be either mtd_ooblayout_free or
-+ *	  mtd_ooblayout_ecc depending on the region type you're searching for
-+ *
-+ * This functions returns the section id and oobregion information of a
-+ * specific byte. For example, say you want to know where the 4th ECC byte is
-+ * stored, you'll use:
-+ *
-+ * mtd_ooblayout_find_region(mtd, 3, &section, &oobregion, mtd_ooblayout_ecc);
-+ *
-+ * Returns zero on success, a negative error code otherwise.
-+ */
-+static int mtd_ooblayout_find_region(struct mtd_info *mtd, int byte,
-+				int *sectionp, struct mtd_oob_region *oobregion,
-+				int (*iter)(struct mtd_info *,
-+					    int section,
-+					    struct mtd_oob_region *oobregion))
-+{
-+	int pos = 0, ret, section = 0;
-+
-+	memset(oobregion, 0, sizeof(*oobregion));
-+
-+	while (1) {
-+		ret = iter(mtd, section, oobregion);
-+		if (ret)
-+			return ret;
-+
-+		if (pos + oobregion->length > byte)
-+			break;
-+
-+		pos += oobregion->length;
-+		section++;
-+	}
-+
-+	/*
-+	 * Adjust region info to make it start at the beginning at the
-+	 * 'start' ECC byte.
-+	 */
-+	oobregion->offset += byte - pos;
-+	oobregion->length -= byte - pos;
-+	*sectionp = section;
-+
-+	return 0;
-+}
-+
-+/**
-+ * mtd_ooblayout_find_eccregion - Find the ECC region attached to a specific
-+ *				  ECC byte
-+ * @mtd: mtd info structure
-+ * @eccbyte: the byte we are searching for
-+ * @sectionp: pointer where the section id will be stored
-+ * @oobregion: OOB region information
-+ *
-+ * Works like mtd_ooblayout_find_region() except it searches for a specific ECC
-+ * byte.
-+ *
-+ * Returns zero on success, a negative error code otherwise.
-+ */
-+int mtd_ooblayout_find_eccregion(struct mtd_info *mtd, int eccbyte,
-+				 int *section,
-+				 struct mtd_oob_region *oobregion)
-+{
-+	return mtd_ooblayout_find_region(mtd, eccbyte, section, oobregion,
-+					 mtd_ooblayout_ecc);
-+}
-+EXPORT_SYMBOL_GPL(mtd_ooblayout_find_eccregion);
-+
-+/**
-+ * mtd_ooblayout_get_bytes - Extract OOB bytes from the oob buffer
-+ * @mtd: mtd info structure
-+ * @buf: destination buffer to store OOB bytes
-+ * @oobbuf: OOB buffer
-+ * @start: first byte to retrieve
-+ * @nbytes: number of bytes to retrieve
-+ * @iter: section iterator
-+ *
-+ * Extract bytes attached to a specific category (ECC or free)
-+ * from the OOB buffer and copy them into buf.
-+ *
-+ * Returns zero on success, a negative error code otherwise.
-+ */
-+static int mtd_ooblayout_get_bytes(struct mtd_info *mtd, u8 *buf,
-+				const u8 *oobbuf, int start, int nbytes,
-+				int (*iter)(struct mtd_info *,
-+					    int section,
-+					    struct mtd_oob_region *oobregion))
-+{
-+	struct mtd_oob_region oobregion = { };
-+	int section = 0, ret;
-+
-+	ret = mtd_ooblayout_find_region(mtd, start, &section,
-+					&oobregion, iter);
-+
-+	while (!ret) {
-+		int cnt;
-+
-+		cnt = oobregion.length > nbytes ? nbytes : oobregion.length;
-+		memcpy(buf, oobbuf + oobregion.offset, cnt);
-+		buf += cnt;
-+		nbytes -= cnt;
-+
-+		if (!nbytes)
-+			break;
-+
-+		ret = iter(mtd, ++section, &oobregion);
-+	}
-+
-+	return ret;
-+}
-+
-+/**
-+ * mtd_ooblayout_set_bytes - put OOB bytes into the oob buffer
-+ * @mtd: mtd info structure
-+ * @buf: source buffer to get OOB bytes from
-+ * @oobbuf: OOB buffer
-+ * @start: first OOB byte to set
-+ * @nbytes: number of OOB bytes to set
-+ * @iter: section iterator
-+ *
-+ * Fill the OOB buffer with data provided in buf. The category (ECC or free)
-+ * is selected by passing the appropriate iterator.
-+ *
-+ * Returns zero on success, a negative error code otherwise.
-+ */
-+static int mtd_ooblayout_set_bytes(struct mtd_info *mtd, const u8 *buf,
-+				u8 *oobbuf, int start, int nbytes,
-+				int (*iter)(struct mtd_info *,
-+					    int section,
-+					    struct mtd_oob_region *oobregion))
-+{
-+	struct mtd_oob_region oobregion = { };
-+	int section = 0, ret;
-+
-+	ret = mtd_ooblayout_find_region(mtd, start, &section,
-+					&oobregion, iter);
-+
-+	while (!ret) {
-+		int cnt;
-+
-+		cnt = oobregion.length > nbytes ? nbytes : oobregion.length;
-+		memcpy(oobbuf + oobregion.offset, buf, cnt);
-+		buf += cnt;
-+		nbytes -= cnt;
-+
-+		if (!nbytes)
-+			break;
-+
-+		ret = iter(mtd, ++section, &oobregion);
-+	}
-+
-+	return ret;
-+}
-+
-+/**
-+ * mtd_ooblayout_count_bytes - count the number of bytes in a OOB category
-+ * @mtd: mtd info structure
-+ * @iter: category iterator
-+ *
-+ * Count the number of bytes in a given category.
-+ *
-+ * Returns a positive value on success, a negative error code otherwise.
-+ */
-+static int mtd_ooblayout_count_bytes(struct mtd_info *mtd,
-+				int (*iter)(struct mtd_info *,
-+					    int section,
-+					    struct mtd_oob_region *oobregion))
-+{
-+	struct mtd_oob_region oobregion = { };
-+	int section = 0, ret, nbytes = 0;
-+
-+	while (1) {
-+		ret = iter(mtd, section++, &oobregion);
-+		if (ret) {
-+			if (ret == -ERANGE)
-+				ret = nbytes;
-+			break;
-+		}
-+
-+		nbytes += oobregion.length;
-+	}
-+
-+	return ret;
-+}
-+
-+/**
-+ * mtd_ooblayout_get_eccbytes - extract ECC bytes from the oob buffer
-+ * @mtd: mtd info structure
-+ * @eccbuf: destination buffer to store ECC bytes
-+ * @oobbuf: OOB buffer
-+ * @start: first ECC byte to retrieve
-+ * @nbytes: number of ECC bytes to retrieve
-+ *
-+ * Works like mtd_ooblayout_get_bytes(), except it acts on ECC bytes.
-+ *
-+ * Returns zero on success, a negative error code otherwise.
-+ */
-+int mtd_ooblayout_get_eccbytes(struct mtd_info *mtd, u8 *eccbuf,
-+			       const u8 *oobbuf, int start, int nbytes)
-+{
-+	return mtd_ooblayout_get_bytes(mtd, eccbuf, oobbuf, start, nbytes,
-+				       mtd_ooblayout_ecc);
-+}
-+EXPORT_SYMBOL_GPL(mtd_ooblayout_get_eccbytes);
-+
-+/**
-+ * mtd_ooblayout_set_eccbytes - set ECC bytes into the oob buffer
-+ * @mtd: mtd info structure
-+ * @eccbuf: source buffer to get ECC bytes from
-+ * @oobbuf: OOB buffer
-+ * @start: first ECC byte to set
-+ * @nbytes: number of ECC bytes to set
-+ *
-+ * Works like mtd_ooblayout_set_bytes(), except it acts on ECC bytes.
-+ *
-+ * Returns zero on success, a negative error code otherwise.
-+ */
-+int mtd_ooblayout_set_eccbytes(struct mtd_info *mtd, const u8 *eccbuf,
-+			       u8 *oobbuf, int start, int nbytes)
-+{
-+	return mtd_ooblayout_set_bytes(mtd, eccbuf, oobbuf, start, nbytes,
-+				       mtd_ooblayout_ecc);
-+}
-+EXPORT_SYMBOL_GPL(mtd_ooblayout_set_eccbytes);
-+
-+/**
-+ * mtd_ooblayout_get_databytes - extract data bytes from the oob buffer
-+ * @mtd: mtd info structure
-+ * @databuf: destination buffer to store ECC bytes
-+ * @oobbuf: OOB buffer
-+ * @start: first ECC byte to retrieve
-+ * @nbytes: number of ECC bytes to retrieve
-+ *
-+ * Works like mtd_ooblayout_get_bytes(), except it acts on free bytes.
-+ *
-+ * Returns zero on success, a negative error code otherwise.
-+ */
-+int mtd_ooblayout_get_databytes(struct mtd_info *mtd, u8 *databuf,
-+				const u8 *oobbuf, int start, int nbytes)
-+{
-+	return mtd_ooblayout_get_bytes(mtd, databuf, oobbuf, start, nbytes,
-+				       mtd_ooblayout_free);
-+}
-+EXPORT_SYMBOL_GPL(mtd_ooblayout_get_databytes);
-+
-+/**
-+ * mtd_ooblayout_get_eccbytes - set data bytes into the oob buffer
-+ * @mtd: mtd info structure
-+ * @eccbuf: source buffer to get data bytes from
-+ * @oobbuf: OOB buffer
-+ * @start: first ECC byte to set
-+ * @nbytes: number of ECC bytes to set
-+ *
-+ * Works like mtd_ooblayout_get_bytes(), except it acts on free bytes.
-+ *
-+ * Returns zero on success, a negative error code otherwise.
-+ */
-+int mtd_ooblayout_set_databytes(struct mtd_info *mtd, const u8 *databuf,
-+				u8 *oobbuf, int start, int nbytes)
-+{
-+	return mtd_ooblayout_set_bytes(mtd, databuf, oobbuf, start, nbytes,
-+				       mtd_ooblayout_free);
-+}
-+EXPORT_SYMBOL_GPL(mtd_ooblayout_set_databytes);
-+
-+/**
-+ * mtd_ooblayout_count_freebytes - count the number of free bytes in OOB
-+ * @mtd: mtd info structure
-+ *
-+ * Works like mtd_ooblayout_count_bytes(), except it count free bytes.
-+ *
-+ * Returns zero on success, a negative error code otherwise.
-+ */
-+int mtd_ooblayout_count_freebytes(struct mtd_info *mtd)
-+{
-+	return mtd_ooblayout_count_bytes(mtd, mtd_ooblayout_free);
-+}
-+EXPORT_SYMBOL_GPL(mtd_ooblayout_count_freebytes);
-+
-+/**
-+ * mtd_ooblayout_count_freebytes - count the number of ECC bytes in OOB
-+ * @mtd: mtd info structure
-+ *
-+ * Works like mtd_ooblayout_count_bytes(), except it count ECC bytes.
-+ *
-+ * Returns zero on success, a negative error code otherwise.
-+ */
-+int mtd_ooblayout_count_eccbytes(struct mtd_info *mtd)
-+{
-+	return mtd_ooblayout_count_bytes(mtd, mtd_ooblayout_ecc);
-+}
-+EXPORT_SYMBOL_GPL(mtd_ooblayout_count_eccbytes);
-+
- /*
-  * Method to access the protection register area, present in some flash
-  * devices. The user data is one time programmable but the factory data is read
---- a/drivers/mtd/mtdcore.h
-+++ b/drivers/mtd/mtdcore.h
-@@ -10,10 +10,15 @@ int add_mtd_device(struct mtd_info *mtd)
- int del_mtd_device(struct mtd_info *mtd);
- int add_mtd_partitions(struct mtd_info *, const struct mtd_partition *, int);
- int del_mtd_partitions(struct mtd_info *);
-+
-+struct mtd_partitions;
-+
- int parse_mtd_partitions(struct mtd_info *master, const char * const *types,
--			 struct mtd_partition **pparts,
-+			 struct mtd_partitions *pparts,
- 			 struct mtd_part_parser_data *data);
- 
-+void mtd_part_parser_cleanup(struct mtd_partitions *parts);
-+
- int __init init_mtdchar(void);
- void __exit cleanup_mtdchar(void);
- 
---- a/drivers/mtd/mtdpart.c
-+++ b/drivers/mtd/mtdpart.c
-@@ -55,9 +55,12 @@ static void mtd_partition_split(struct m
- 
- /*
-  * Given a pointer to the MTD object in the mtd_part structure, we can retrieve
-- * the pointer to that structure with this macro.
-+ * the pointer to that structure.
-  */
--#define PART(x)  ((struct mtd_part *)(x))
-+static inline struct mtd_part *mtd_to_part(const struct mtd_info *mtd)
-+{
-+	return container_of(mtd, struct mtd_part, mtd);
-+}
- 
- 
- /*
-@@ -68,7 +71,7 @@ static void mtd_partition_split(struct m
- static int part_read(struct mtd_info *mtd, loff_t from, size_t len,
- 		size_t *retlen, u_char *buf)
- {
--	struct mtd_part *part = PART(mtd);
-+	struct mtd_part *part = mtd_to_part(mtd);
- 	struct mtd_ecc_stats stats;
- 	int res;
- 
-@@ -87,7 +90,7 @@ static int part_read(struct mtd_info *mt
- static int part_point(struct mtd_info *mtd, loff_t from, size_t len,
- 		size_t *retlen, void **virt, resource_size_t *phys)
- {
--	struct mtd_part *part = PART(mtd);
-+	struct mtd_part *part = mtd_to_part(mtd);
- 
- 	return part->master->_point(part->master, from + part->offset, len,
- 				    retlen, virt, phys);
-@@ -95,7 +98,7 @@ static int part_point(struct mtd_info *m
- 
- static int part_unpoint(struct mtd_info *mtd, loff_t from, size_t len)
- {
--	struct mtd_part *part = PART(mtd);
-+	struct mtd_part *part = mtd_to_part(mtd);
- 
- 	return part->master->_unpoint(part->master, from + part->offset, len);
- }
-@@ -105,7 +108,7 @@ static unsigned long part_get_unmapped_a
- 					    unsigned long offset,
- 					    unsigned long flags)
- {
--	struct mtd_part *part = PART(mtd);
-+	struct mtd_part *part = mtd_to_part(mtd);
- 
- 	offset += part->offset;
- 	return part->master->_get_unmapped_area(part->master, len, offset,
-@@ -115,7 +118,7 @@ static unsigned long part_get_unmapped_a
- static int part_read_oob(struct mtd_info *mtd, loff_t from,
- 		struct mtd_oob_ops *ops)
- {
--	struct mtd_part *part = PART(mtd);
-+	struct mtd_part *part = mtd_to_part(mtd);
- 	int res;
- 
- 	if (from >= mtd->size)
-@@ -130,10 +133,7 @@ static int part_read_oob(struct mtd_info
- 	if (ops->oobbuf) {
- 		size_t len, pages;
- 
--		if (ops->mode == MTD_OPS_AUTO_OOB)
--			len = mtd->oobavail;
--		else
--			len = mtd->oobsize;
-+		len = mtd_oobavail(mtd, ops);
- 		pages = mtd_div_by_ws(mtd->size, mtd);
- 		pages -= mtd_div_by_ws(from, mtd);
- 		if (ops->ooboffs + ops->ooblen > pages * len)
-@@ -153,7 +153,7 @@ static int part_read_oob(struct mtd_info
- static int part_read_user_prot_reg(struct mtd_info *mtd, loff_t from,
- 		size_t len, size_t *retlen, u_char *buf)
- {
--	struct mtd_part *part = PART(mtd);
-+	struct mtd_part *part = mtd_to_part(mtd);
- 	return part->master->_read_user_prot_reg(part->master, from, len,
- 						 retlen, buf);
- }
-@@ -161,7 +161,7 @@ static int part_read_user_prot_reg(struc
- static int part_get_user_prot_info(struct mtd_info *mtd, size_t len,
- 				   size_t *retlen, struct otp_info *buf)
- {
--	struct mtd_part *part = PART(mtd);
-+	struct mtd_part *part = mtd_to_part(mtd);
- 	return part->master->_get_user_prot_info(part->master, len, retlen,
- 						 buf);
- }
-@@ -169,7 +169,7 @@ static int part_get_user_prot_info(struc
- static int part_read_fact_prot_reg(struct mtd_info *mtd, loff_t from,
- 		size_t len, size_t *retlen, u_char *buf)
- {
--	struct mtd_part *part = PART(mtd);
-+	struct mtd_part *part = mtd_to_part(mtd);
- 	return part->master->_read_fact_prot_reg(part->master, from, len,
- 						 retlen, buf);
- }
-@@ -177,7 +177,7 @@ static int part_read_fact_prot_reg(struc
- static int part_get_fact_prot_info(struct mtd_info *mtd, size_t len,
- 				   size_t *retlen, struct otp_info *buf)
- {
--	struct mtd_part *part = PART(mtd);
-+	struct mtd_part *part = mtd_to_part(mtd);
- 	return part->master->_get_fact_prot_info(part->master, len, retlen,
- 						 buf);
- }
-@@ -185,7 +185,7 @@ static int part_get_fact_prot_info(struc
- static int part_write(struct mtd_info *mtd, loff_t to, size_t len,
- 		size_t *retlen, const u_char *buf)
- {
--	struct mtd_part *part = PART(mtd);
-+	struct mtd_part *part = mtd_to_part(mtd);
- 	return part->master->_write(part->master, to + part->offset, len,
- 				    retlen, buf);
- }
-@@ -193,7 +193,7 @@ static int part_write(struct mtd_info *m
- static int part_panic_write(struct mtd_info *mtd, loff_t to, size_t len,
- 		size_t *retlen, const u_char *buf)
- {
--	struct mtd_part *part = PART(mtd);
-+	struct mtd_part *part = mtd_to_part(mtd);
- 	return part->master->_panic_write(part->master, to + part->offset, len,
- 					  retlen, buf);
- }
-@@ -201,7 +201,7 @@ static int part_panic_write(struct mtd_i
- static int part_write_oob(struct mtd_info *mtd, loff_t to,
- 		struct mtd_oob_ops *ops)
- {
--	struct mtd_part *part = PART(mtd);
-+	struct mtd_part *part = mtd_to_part(mtd);
- 
- 	if (to >= mtd->size)
- 		return -EINVAL;
-@@ -213,7 +213,7 @@ static int part_write_oob(struct mtd_inf
- static int part_write_user_prot_reg(struct mtd_info *mtd, loff_t from,
- 		size_t len, size_t *retlen, u_char *buf)
- {
--	struct mtd_part *part = PART(mtd);
-+	struct mtd_part *part = mtd_to_part(mtd);
- 	return part->master->_write_user_prot_reg(part->master, from, len,
- 						  retlen, buf);
- }
-@@ -221,21 +221,21 @@ static int part_write_user_prot_reg(stru
- static int part_lock_user_prot_reg(struct mtd_info *mtd, loff_t from,
- 		size_t len)
- {
--	struct mtd_part *part = PART(mtd);
-+	struct mtd_part *part = mtd_to_part(mtd);
- 	return part->master->_lock_user_prot_reg(part->master, from, len);
- }
- 
- static int part_writev(struct mtd_info *mtd, const struct kvec *vecs,
- 		unsigned long count, loff_t to, size_t *retlen)
- {
--	struct mtd_part *part = PART(mtd);
-+	struct mtd_part *part = mtd_to_part(mtd);
- 	return part->master->_writev(part->master, vecs, count,
- 				     to + part->offset, retlen);
- }
- 
- static int part_erase(struct mtd_info *mtd, struct erase_info *instr)
- {
--	struct mtd_part *part = PART(mtd);
-+	struct mtd_part *part = mtd_to_part(mtd);
- 	int ret;
- 
- 
-@@ -299,7 +299,7 @@ static int part_erase(struct mtd_info *m
- void mtd_erase_callback(struct erase_info *instr)
- {
- 	if (instr->mtd->_erase == part_erase) {
--		struct mtd_part *part = PART(instr->mtd);
-+		struct mtd_part *part = mtd_to_part(instr->mtd);
- 		size_t wrlen = 0;
- 
- 		if (instr->mtd->flags & MTD_ERASE_PARTIAL) {
-@@ -330,13 +330,13 @@ EXPORT_SYMBOL_GPL(mtd_erase_callback);
- 
- static int part_lock(struct mtd_info *mtd, loff_t ofs, uint64_t len)
- {
--	struct mtd_part *part = PART(mtd);
-+	struct mtd_part *part = mtd_to_part(mtd);
- 	return part->master->_lock(part->master, ofs + part->offset, len);
- }
- 
- static int part_unlock(struct mtd_info *mtd, loff_t ofs, uint64_t len)
- {
--	struct mtd_part *part = PART(mtd);
-+	struct mtd_part *part = mtd_to_part(mtd);
- 
- 	ofs += part->offset;
- 	if (mtd->flags & MTD_ERASE_PARTIAL) {
-@@ -349,45 +349,45 @@ static int part_unlock(struct mtd_info *
- 
- static int part_is_locked(struct mtd_info *mtd, loff_t ofs, uint64_t len)
- {
--	struct mtd_part *part = PART(mtd);
-+	struct mtd_part *part = mtd_to_part(mtd);
- 	return part->master->_is_locked(part->master, ofs + part->offset, len);
- }
- 
- static void part_sync(struct mtd_info *mtd)
- {
--	struct mtd_part *part = PART(mtd);
-+	struct mtd_part *part = mtd_to_part(mtd);
- 	part->master->_sync(part->master);
- }
- 
- static int part_suspend(struct mtd_info *mtd)
- {
--	struct mtd_part *part = PART(mtd);
-+	struct mtd_part *part = mtd_to_part(mtd);
- 	return part->master->_suspend(part->master);
- }
- 
- static void part_resume(struct mtd_info *mtd)
- {
--	struct mtd_part *part = PART(mtd);
-+	struct mtd_part *part = mtd_to_part(mtd);
- 	part->master->_resume(part->master);
- }
- 
- static int part_block_isreserved(struct mtd_info *mtd, loff_t ofs)
- {
--	struct mtd_part *part = PART(mtd);
-+	struct mtd_part *part = mtd_to_part(mtd);
- 	ofs += part->offset;
- 	return part->master->_block_isreserved(part->master, ofs);
- }
- 
- static int part_block_isbad(struct mtd_info *mtd, loff_t ofs)
- {
--	struct mtd_part *part = PART(mtd);
-+	struct mtd_part *part = mtd_to_part(mtd);
- 	ofs += part->offset;
- 	return part->master->_block_isbad(part->master, ofs);
- }
- 
- static int part_block_markbad(struct mtd_info *mtd, loff_t ofs)
- {
--	struct mtd_part *part = PART(mtd);
-+	struct mtd_part *part = mtd_to_part(mtd);
- 	int res;
- 
- 	ofs += part->offset;
-@@ -397,6 +397,27 @@ static int part_block_markbad(struct mtd
- 	return res;
- }
- 
-+static int part_ooblayout_ecc(struct mtd_info *mtd, int section,
-+			      struct mtd_oob_region *oobregion)
-+{
-+	struct mtd_part *part = mtd_to_part(mtd);
-+
-+	return mtd_ooblayout_ecc(part->master, section, oobregion);
-+}
-+
-+static int part_ooblayout_free(struct mtd_info *mtd, int section,
-+			       struct mtd_oob_region *oobregion)
-+{
-+	struct mtd_part *part = mtd_to_part(mtd);
-+
-+	return mtd_ooblayout_free(part->master, section, oobregion);
-+}
-+
-+static const struct mtd_ooblayout_ops part_ooblayout_ops = {
-+	.ecc = part_ooblayout_ecc,
-+	.free = part_ooblayout_free,
-+};
-+
- static inline void free_partition(struct mtd_part *p)
- {
- 	kfree(p->mtd.name);
-@@ -614,7 +635,7 @@ static struct mtd_part *allocate_partiti
- 			slave->mtd.erasesize = slave->mtd.size;
- 	}
- 
--	slave->mtd.ecclayout = master->ecclayout;
-+	mtd_set_ooblayout(&slave->mtd, &part_ooblayout_ops);
- 	slave->mtd.ecc_step_size = master->ecc_step_size;
- 	slave->mtd.ecc_strength = master->ecc_strength;
- 	slave->mtd.bitflip_threshold = master->bitflip_threshold;
-@@ -639,7 +660,7 @@ static ssize_t mtd_partition_offset_show
- 		struct device_attribute *attr, char *buf)
- {
- 	struct mtd_info *mtd = dev_get_drvdata(dev);
--	struct mtd_part *part = PART(mtd);
-+	struct mtd_part *part = mtd_to_part(mtd);
- 	return snprintf(buf, PAGE_SIZE, "%lld\n", part->offset);
- }
- 
-@@ -677,11 +698,10 @@ int mtd_add_partition(struct mtd_info *m
- 	if (length <= 0)
- 		return -EINVAL;
- 
-+	memset(&part, 0, sizeof(part));
- 	part.name = name;
- 	part.size = length;
- 	part.offset = offset;
--	part.mask_flags = 0;
--	part.ecclayout = NULL;
- 
- 	new = allocate_partition(master, &part, -1, offset);
- 	if (IS_ERR(new))
-@@ -845,7 +865,7 @@ int add_mtd_partitions(struct mtd_info *
- static DEFINE_SPINLOCK(part_parser_lock);
- static LIST_HEAD(part_parsers);
- 
--static struct mtd_part_parser *get_partition_parser(const char *name)
-+static struct mtd_part_parser *mtd_part_parser_get(const char *name)
- {
- 	struct mtd_part_parser *p, *ret = NULL;
- 
-@@ -862,7 +882,20 @@ static struct mtd_part_parser *get_parti
- 	return ret;
- }
- 
--#define put_partition_parser(p) do { module_put((p)->owner); } while (0)
-+static inline void mtd_part_parser_put(const struct mtd_part_parser *p)
-+{
-+	module_put(p->owner);
-+}
-+
-+/*
-+ * Many partition parsers just expected the core to kfree() all their data in
-+ * one chunk. Do that by default.
-+ */
-+static void mtd_part_parser_cleanup_default(const struct mtd_partition *pparts,
-+					    int nr_parts)
-+{
-+	kfree(pparts);
-+}
- 
- static struct mtd_part_parser *
- get_partition_parser_by_type(enum mtd_parser_type type,
-@@ -874,7 +907,7 @@ get_partition_parser_by_type(enum mtd_pa
- 
- 	p = list_prepare_entry(start, &part_parsers, list);
- 	if (start)
--		put_partition_parser(start);
-+		mtd_part_parser_put(start);
- 
- 	list_for_each_entry_continue(p, &part_parsers, list) {
- 		if (p->type == type && try_module_get(p->owner)) {
-@@ -888,13 +921,19 @@ get_partition_parser_by_type(enum mtd_pa
- 	return ret;
- }
- 
--void register_mtd_parser(struct mtd_part_parser *p)
--{
-+int __register_mtd_parser(struct mtd_part_parser *p, struct module *owner)
-+ {
-+	p->owner = owner;
-+
-+	if (!p->cleanup)
-+		p->cleanup = &mtd_part_parser_cleanup_default;
-+
- 	spin_lock(&part_parser_lock);
- 	list_add(&p->list, &part_parsers);
- 	spin_unlock(&part_parser_lock);
-+	return 0;
- }
--EXPORT_SYMBOL_GPL(register_mtd_parser);
-+EXPORT_SYMBOL_GPL(__register_mtd_parser);
- 
- void deregister_mtd_parser(struct mtd_part_parser *p)
- {
-@@ -954,7 +993,7 @@ static const char * const default_mtd_pa
-  * parse_mtd_partitions - parse MTD partitions
-  * @master: the master partition (describes whole MTD device)
-  * @types: names of partition parsers to try or %NULL
-- * @pparts: array of partitions found is returned here
-+ * @pparts: info about partitions found is returned here
-  * @data: MTD partition parser-specific data
-  *
-  * This function tries to find partition on MTD device @master. It uses MTD
-@@ -966,45 +1005,42 @@ static const char * const default_mtd_pa
-  *
-  * This function may return:
-  * o a negative error code in case of failure
-- * o zero if no partitions were found
-- * o a positive number of found partitions, in which case on exit @pparts will
-- *   point to an array containing this number of &struct mtd_info objects.
-+ * o zero otherwise, and @pparts will describe the partitions, number of
-+ *   partitions, and the parser which parsed them. Caller must release
-+ *   resources with mtd_part_parser_cleanup() when finished with the returned
-+ *   data.
-  */
- int parse_mtd_partitions(struct mtd_info *master, const char *const *types,
--			 struct mtd_partition **pparts,
-+			 struct mtd_partitions *pparts,
- 			 struct mtd_part_parser_data *data)
- {
- 	struct mtd_part_parser *parser;
- 	int ret, err = 0;
- 	const char *const *types_of = NULL;
- 
--	if (data && data->of_node) {
--		types_of = of_get_probes(data->of_node);
--		if (types_of != NULL)
--			types = types_of;
--	}
--
- 	if (!types)
- 		types = default_mtd_part_types;
- 
- 	for ( ; *types; types++) {
- 		pr_debug("%s: parsing partitions %s\n", master->name, *types);
--		parser = get_partition_parser(*types);
-+		parser = mtd_part_parser_get(*types);
- 		if (!parser && !request_module("%s", *types))
--			parser = get_partition_parser(*types);
-+			parser = mtd_part_parser_get(*types);
- 		pr_debug("%s: got parser %s\n", master->name,
- 			 parser ? parser->name : NULL);
- 		if (!parser)
- 			continue;
--		ret = (*parser->parse_fn)(master, pparts, data);
-+		ret = (*parser->parse_fn)(master, &pparts->parts, data);
- 		pr_debug("%s: parser %s: %i\n",
- 			 master->name, parser->name, ret);
--		put_partition_parser(parser);
- 		if (ret > 0) {
- 			printk(KERN_NOTICE "%d %s partitions found on MTD device %s\n",
- 			       ret, parser->name, master->name);
--			return ret;
-+			pparts->nr_parts = ret;
-+			pparts->parser = parser;
-+			return 0;
- 		}
-+		mtd_part_parser_put(parser);
- 		/*
- 		 * Stash the first error we see; only report it if no parser
- 		 * succeeds
-@@ -1034,7 +1070,7 @@ int parse_mtd_partitions_by_type(struct
- 		ret = (*parser->parse_fn)(master, pparts, data);
- 
- 		if (ret > 0) {
--			put_partition_parser(parser);
-+			mtd_part_parser_put(parser);
- 			printk(KERN_NOTICE
- 			       "%d %s partitions found on MTD device %s\n",
- 			       ret, parser->name, master->name);
-@@ -1048,6 +1084,22 @@ int parse_mtd_partitions_by_type(struct
- }
- EXPORT_SYMBOL_GPL(parse_mtd_partitions_by_type);
- 
-+void mtd_part_parser_cleanup(struct mtd_partitions *parts)
-+{
-+	const struct mtd_part_parser *parser;
-+
-+	if (!parts)
-+		return;
-+
-+	parser = parts->parser;
-+	if (parser) {
-+		if (parser->cleanup)
-+			parser->cleanup(parts->parts, parts->nr_parts);
-+
-+		mtd_part_parser_put(parser);
-+	}
-+}
-+
- int mtd_is_partition(const struct mtd_info *mtd)
- {
- 	struct mtd_part *part;
-@@ -1070,7 +1122,7 @@ struct mtd_info *mtdpart_get_master(cons
- 	if (!mtd_is_partition(mtd))
- 		return (struct mtd_info *)mtd;
- 
--	return PART(mtd)->master;
-+	return mtd_to_part(mtd)->master;
- }
- EXPORT_SYMBOL_GPL(mtdpart_get_master);
- 
-@@ -1079,7 +1131,7 @@ uint64_t mtdpart_get_offset(const struct
- 	if (!mtd_is_partition(mtd))
- 		return 0;
- 
--	return PART(mtd)->offset;
-+	return mtd_to_part(mtd)->offset;
- }
- EXPORT_SYMBOL_GPL(mtdpart_get_offset);
- 
-@@ -1089,6 +1141,6 @@ uint64_t mtd_get_device_size(const struc
- 	if (!mtd_is_partition(mtd))
- 		return mtd->size;
- 
--	return PART(mtd)->master->size;
-+	return mtd_to_part(mtd)->master->size;
- }
- EXPORT_SYMBOL_GPL(mtd_get_device_size);
---- a/drivers/mtd/mtdswap.c
-+++ b/drivers/mtd/mtdswap.c
-@@ -346,7 +346,7 @@ static int mtdswap_read_markers(struct m
- 	if (mtd_can_have_bb(d->mtd) && mtd_block_isbad(d->mtd, offset))
- 		return MTDSWAP_SCANNED_BAD;
- 
--	ops.ooblen = 2 * d->mtd->ecclayout->oobavail;
-+	ops.ooblen = 2 * d->mtd->oobavail;
- 	ops.oobbuf = d->oob_buf;
- 	ops.ooboffs = 0;
- 	ops.datbuf = NULL;
-@@ -359,7 +359,7 @@ static int mtdswap_read_markers(struct m
- 
- 	data = (struct mtdswap_oobdata *)d->oob_buf;
- 	data2 = (struct mtdswap_oobdata *)
--		(d->oob_buf + d->mtd->ecclayout->oobavail);
-+		(d->oob_buf + d->mtd->oobavail);
- 
- 	if (le16_to_cpu(data->magic) == MTDSWAP_MAGIC_CLEAN) {
- 		eb->erase_count = le32_to_cpu(data->count);
-@@ -933,7 +933,7 @@ static unsigned int mtdswap_eblk_passes(
- 
- 	ops.mode = MTD_OPS_AUTO_OOB;
- 	ops.len = mtd->writesize;
--	ops.ooblen = mtd->ecclayout->oobavail;
-+	ops.ooblen = mtd->oobavail;
- 	ops.ooboffs = 0;
- 	ops.datbuf = d->page_buf;
- 	ops.oobbuf = d->oob_buf;
-@@ -945,7 +945,7 @@ static unsigned int mtdswap_eblk_passes(
- 		for (i = 0; i < mtd_pages; i++) {
- 			patt = mtdswap_test_patt(test + i);
- 			memset(d->page_buf, patt, mtd->writesize);
--			memset(d->oob_buf, patt, mtd->ecclayout->oobavail);
-+			memset(d->oob_buf, patt, mtd->oobavail);
- 			ret = mtd_write_oob(mtd, pos, &ops);
- 			if (ret)
- 				goto error;
-@@ -964,7 +964,7 @@ static unsigned int mtdswap_eblk_passes(
- 				if (p1[j] != patt)
- 					goto error;
- 
--			for (j = 0; j < mtd->ecclayout->oobavail; j++)
-+			for (j = 0; j < mtd->oobavail; j++)
- 				if (p2[j] != (unsigned char)patt)
- 					goto error;
- 
-@@ -1387,7 +1387,7 @@ static int mtdswap_init(struct mtdswap_d
- 	if (!d->page_buf)
- 		goto page_buf_fail;
- 
--	d->oob_buf = kmalloc(2 * mtd->ecclayout->oobavail, GFP_KERNEL);
-+	d->oob_buf = kmalloc(2 * mtd->oobavail, GFP_KERNEL);
- 	if (!d->oob_buf)
- 		goto oob_buf_fail;
- 
-@@ -1417,7 +1417,6 @@ static void mtdswap_add_mtd(struct mtd_b
- 	unsigned long part;
- 	unsigned int eblocks, eavailable, bad_blocks, spare_cnt;
- 	uint64_t swap_size, use_size, size_limit;
--	struct nand_ecclayout *oinfo;
- 	int ret;
- 
- 	parts = &partitions[0];
-@@ -1447,17 +1446,10 @@ static void mtdswap_add_mtd(struct mtd_b
- 		return;
- 	}
- 
--	oinfo = mtd->ecclayout;
--	if (!oinfo) {
--		printk(KERN_ERR "%s: mtd%d does not have OOB\n",
--			MTDSWAP_PREFIX, mtd->index);
--		return;
--	}
--
--	if (!mtd->oobsize || oinfo->oobavail < MTDSWAP_OOBSIZE) {
-+	if (!mtd->oobsize || mtd->oobavail < MTDSWAP_OOBSIZE) {
- 		printk(KERN_ERR "%s: Not enough free bytes in OOB, "
- 			"%d available, %zu needed.\n",
--			MTDSWAP_PREFIX, oinfo->oobavail, MTDSWAP_OOBSIZE);
-+			MTDSWAP_PREFIX, mtd->oobavail, MTDSWAP_OOBSIZE);
- 		return;
- 	}
- 
---- a/drivers/mtd/nand/Kconfig
-+++ b/drivers/mtd/nand/Kconfig
-@@ -55,7 +55,7 @@ config MTD_NAND_DENALI_PCI
- config MTD_NAND_DENALI_DT
- 	tristate "Support Denali NAND controller as a DT device"
- 	select MTD_NAND_DENALI
--	depends on HAS_DMA && HAVE_CLK
-+	depends on HAS_DMA && HAVE_CLK && OF
- 	help
- 	  Enable the driver for NAND flash on platforms using a Denali NAND
- 	  controller as a DT device.
-@@ -74,6 +74,7 @@ config MTD_NAND_DENALI_SCRATCH_REG_ADDR
- config MTD_NAND_GPIO
- 	tristate "GPIO assisted NAND Flash driver"
- 	depends on GPIOLIB || COMPILE_TEST
-+	depends on HAS_IOMEM
- 	help
- 	  This enables a NAND flash driver where control signals are
- 	  connected to GPIO pins, and commands and data are communicated
-@@ -310,6 +311,7 @@ config MTD_NAND_CAFE
- config MTD_NAND_CS553X
- 	tristate "NAND support for CS5535/CS5536 (AMD Geode companion chip)"
- 	depends on X86_32
-+	depends on !UML && HAS_IOMEM
- 	help
- 	  The CS553x companion chips for the AMD Geode processor
- 	  include NAND flash controllers with built-in hardware ECC
-@@ -463,6 +465,7 @@ config MTD_NAND_MPC5121_NFC
- config MTD_NAND_VF610_NFC
- 	tristate "Support for Freescale NFC for VF610/MPC5125"
- 	depends on (SOC_VF610 || COMPILE_TEST)
-+	depends on HAS_IOMEM
- 	help
- 	  Enables support for NAND Flash Controller on some Freescale
- 	  processors like the VF610, MPC5125, MCF54418 or Kinetis K70.
-@@ -480,7 +483,7 @@ config MTD_NAND_MXC
- 
- config MTD_NAND_SH_FLCTL
- 	tristate "Support for NAND on Renesas SuperH FLCTL"
--	depends on SUPERH || ARCH_SHMOBILE || COMPILE_TEST
-+	depends on SUPERH || COMPILE_TEST
- 	depends on HAS_IOMEM
- 	depends on HAS_DMA
- 	help
-@@ -519,6 +522,13 @@ config MTD_NAND_JZ4740
- 	help
- 		Enables support for NAND Flash on JZ4740 SoC based boards.
- 
-+config MTD_NAND_JZ4780
-+	tristate "Support for NAND on JZ4780 SoC"
-+	depends on MACH_JZ4780 && JZ4780_NEMC
-+	help
-+	  Enables support for NAND Flash connected to the NEMC on JZ4780 SoC
-+	  based boards, using the BCH controller for hardware error correction.
-+
- config MTD_NAND_FSMC
- 	tristate "Support for NAND on ST Micros FSMC"
- 	depends on PLAT_SPEAR || ARCH_NOMADIK || ARCH_U8500 || MACH_U300
-@@ -546,4 +556,11 @@ config MTD_NAND_HISI504
- 	help
- 	  Enables support for NAND controller on Hisilicon SoC Hip04.
- 
-+config MTD_NAND_QCOM
-+	tristate "Support for NAND on QCOM SoCs"
-+	depends on ARCH_QCOM
-+	help
-+	  Enables support for NAND flash chips on SoCs containing the EBI2 NAND
-+	  controller. This controller is found on IPQ806x SoC.
-+
- endif # MTD_NAND
---- a/drivers/mtd/nand/Makefile
-+++ b/drivers/mtd/nand/Makefile
-@@ -49,11 +49,13 @@ obj-$(CONFIG_MTD_NAND_MPC5121_NFC)	+= mp
- obj-$(CONFIG_MTD_NAND_VF610_NFC)	+= vf610_nfc.o
- obj-$(CONFIG_MTD_NAND_RICOH)		+= r852.o
- obj-$(CONFIG_MTD_NAND_JZ4740)		+= jz4740_nand.o
-+obj-$(CONFIG_MTD_NAND_JZ4780)		+= jz4780_nand.o jz4780_bch.o
- obj-$(CONFIG_MTD_NAND_GPMI_NAND)	+= gpmi-nand/
- obj-$(CONFIG_MTD_NAND_XWAY)		+= xway_nand.o
- obj-$(CONFIG_MTD_NAND_BCM47XXNFLASH)	+= bcm47xxnflash/
- obj-$(CONFIG_MTD_NAND_SUNXI)		+= sunxi_nand.o
- obj-$(CONFIG_MTD_NAND_HISI504)	        += hisi504_nand.o
- obj-$(CONFIG_MTD_NAND_BRCMNAND)		+= brcmnand/
-+obj-$(CONFIG_MTD_NAND_QCOM)		+= qcom_nandc.o
- 
- nand-objs := nand_base.o nand_bbt.o nand_timings.o
---- a/drivers/mtd/nand/nand_base.c
-+++ b/drivers/mtd/nand/nand_base.c
-@@ -48,50 +48,6 @@
- #include <linux/mtd/partitions.h>
- #include <linux/of_mtd.h>
- 
--/* Define default oob placement schemes for large and small page devices */
--static struct nand_ecclayout nand_oob_8 = {
--	.eccbytes = 3,
--	.eccpos = {0, 1, 2},
--	.oobfree = {
--		{.offset = 3,
--		 .length = 2},
--		{.offset = 6,
--		 .length = 2} }
--};
--
--static struct nand_ecclayout nand_oob_16 = {
--	.eccbytes = 6,
--	.eccpos = {0, 1, 2, 3, 6, 7},
--	.oobfree = {
--		{.offset = 8,
--		 . length = 8} }
--};
--
--static struct nand_ecclayout nand_oob_64 = {
--	.eccbytes = 24,
--	.eccpos = {
--		   40, 41, 42, 43, 44, 45, 46, 47,
--		   48, 49, 50, 51, 52, 53, 54, 55,
--		   56, 57, 58, 59, 60, 61, 62, 63},
--	.oobfree = {
--		{.offset = 2,
--		 .length = 38} }
--};
--
--static struct nand_ecclayout nand_oob_128 = {
--	.eccbytes = 48,
--	.eccpos = {
--		   80, 81, 82, 83, 84, 85, 86, 87,
--		   88, 89, 90, 91, 92, 93, 94, 95,
--		   96, 97, 98, 99, 100, 101, 102, 103,
--		   104, 105, 106, 107, 108, 109, 110, 111,
--		   112, 113, 114, 115, 116, 117, 118, 119,
--		   120, 121, 122, 123, 124, 125, 126, 127},
--	.oobfree = {
--		{.offset = 2,
--		 .length = 78} }
--};
--
- static int nand_get_device(struct mtd_info *mtd, int new_state);
- 
- static int nand_do_write_oob(struct mtd_info *mtd, loff_t to,
-@@ -103,10 +59,96 @@ static int nand_do_write_oob(struct mtd_
-  */
- DEFINE_LED_TRIGGER(nand_led_trigger);
- 
-+/* Define default oob placement schemes for large and small page devices */
-+static int nand_ooblayout_ecc_sp(struct mtd_info *mtd, int section,
-+				 struct mtd_oob_region *oobregion)
-+{
-+	struct nand_chip *chip = mtd_to_nand(mtd);
-+	struct nand_ecc_ctrl *ecc = &chip->ecc;
-+
-+	if (section > 1)
-+		return -ERANGE;
-+
-+	if (!section) {
-+		oobregion->offset = 0;
-+		oobregion->length = 4;
-+	} else {
-+		oobregion->offset = 6;
-+		oobregion->length = ecc->total - 4;
-+	}
-+
-+	return 0;
-+}
-+
-+static int nand_ooblayout_free_sp(struct mtd_info *mtd, int section,
-+				  struct mtd_oob_region *oobregion)
-+{
-+	if (section > 1)
-+		return -ERANGE;
-+
-+	if (mtd->oobsize == 16) {
-+		if (section)
-+			return -ERANGE;
-+
-+		oobregion->length = 8;
-+		oobregion->offset = 8;
-+	} else {
-+		oobregion->length = 2;
-+		if (!section)
-+			oobregion->offset = 3;
-+		else
-+			oobregion->offset = 6;
-+	}
-+
-+	return 0;
-+}
-+
-+const struct mtd_ooblayout_ops nand_ooblayout_sp_ops = {
-+	.ecc = nand_ooblayout_ecc_sp,
-+	.free = nand_ooblayout_free_sp,
-+};
-+EXPORT_SYMBOL_GPL(nand_ooblayout_sp_ops);
-+
-+static int nand_ooblayout_ecc_lp(struct mtd_info *mtd, int section,
-+				 struct mtd_oob_region *oobregion)
-+{
-+	struct nand_chip *chip = mtd_to_nand(mtd);
-+	struct nand_ecc_ctrl *ecc = &chip->ecc;
-+
-+	if (section)
-+		return -ERANGE;
-+
-+	oobregion->length = ecc->total;
-+	oobregion->offset = mtd->oobsize - oobregion->length;
-+
-+	return 0;
-+}
-+
-+static int nand_ooblayout_free_lp(struct mtd_info *mtd, int section,
-+				  struct mtd_oob_region *oobregion)
-+{
-+	struct nand_chip *chip = mtd_to_nand(mtd);
-+	struct nand_ecc_ctrl *ecc = &chip->ecc;
-+
-+	if (section)
-+		return -ERANGE;
-+
-+	oobregion->length = mtd->oobsize - ecc->total - 2;
-+	oobregion->offset = 2;
-+
-+	return 0;
-+}
-+
-+const struct mtd_ooblayout_ops nand_ooblayout_lp_ops = {
-+	.ecc = nand_ooblayout_ecc_lp,
-+	.free = nand_ooblayout_free_lp,
-+};
-+EXPORT_SYMBOL_GPL(nand_ooblayout_lp_ops);
-+
- static int check_offs_len(struct mtd_info *mtd,
- 					loff_t ofs, uint64_t len)
- {
--	struct nand_chip *chip = mtd->priv;
-+	struct nand_chip *chip = mtd_to_nand(mtd);
- 	int ret = 0;
- 
- 	/* Start address must align on block boundary */
-@@ -132,7 +174,7 @@ static int check_offs_len(struct mtd_inf
-  */
- static void nand_release_device(struct mtd_info *mtd)
- {
--	struct nand_chip *chip = mtd->priv;
-+	struct nand_chip *chip = mtd_to_nand(mtd);
- 
- 	/* Release the controller and the chip */
- 	spin_lock(&chip->controller->lock);
-@@ -150,7 +192,7 @@ static void nand_release_device(struct m
-  */
- static uint8_t nand_read_byte(struct mtd_info *mtd)
- {
--	struct nand_chip *chip = mtd->priv;
-+	struct nand_chip *chip = mtd_to_nand(mtd);
- 	return readb(chip->IO_ADDR_R);
- }
- 
-@@ -163,7 +205,7 @@ static uint8_t nand_read_byte(struct mtd
-  */
- static uint8_t nand_read_byte16(struct mtd_info *mtd)
- {
--	struct nand_chip *chip = mtd->priv;
-+	struct nand_chip *chip = mtd_to_nand(mtd);
- 	return (uint8_t) cpu_to_le16(readw(chip->IO_ADDR_R));
- }
- 
-@@ -175,7 +217,7 @@ static uint8_t nand_read_byte16(struct m
-  */
- static u16 nand_read_word(struct mtd_info *mtd)
- {
--	struct nand_chip *chip = mtd->priv;
-+	struct nand_chip *chip = mtd_to_nand(mtd);
- 	return readw(chip->IO_ADDR_R);
- }
- 
-@@ -188,7 +230,7 @@ static u16 nand_read_word(struct mtd_inf
-  */
- static void nand_select_chip(struct mtd_info *mtd, int chipnr)
- {
--	struct nand_chip *chip = mtd->priv;
-+	struct nand_chip *chip = mtd_to_nand(mtd);
- 
- 	switch (chipnr) {
- 	case -1:
-@@ -211,7 +253,7 @@ static void nand_select_chip(struct mtd_
-  */
- static void nand_write_byte(struct mtd_info *mtd, uint8_t byte)
- {
--	struct nand_chip *chip = mtd->priv;
-+	struct nand_chip *chip = mtd_to_nand(mtd);
- 
- 	chip->write_buf(mtd, &byte, 1);
- }
-@@ -225,7 +267,7 @@ static void nand_write_byte(struct mtd_i
-  */
- static void nand_write_byte16(struct mtd_info *mtd, uint8_t byte)
- {
--	struct nand_chip *chip = mtd->priv;
-+	struct nand_chip *chip = mtd_to_nand(mtd);
- 	uint16_t word = byte;
- 
- 	/*
-@@ -257,7 +299,7 @@ static void nand_write_byte16(struct mtd
-  */
- static void nand_write_buf(struct mtd_info *mtd, const uint8_t *buf, int len)
- {
--	struct nand_chip *chip = mtd->priv;
-+	struct nand_chip *chip = mtd_to_nand(mtd);
- 
- 	iowrite8_rep(chip->IO_ADDR_W, buf, len);
- }
-@@ -272,7 +314,7 @@ static void nand_write_buf(struct mtd_in
-  */
- static void nand_read_buf(struct mtd_info *mtd, uint8_t *buf, int len)
- {
--	struct nand_chip *chip = mtd->priv;
-+	struct nand_chip *chip = mtd_to_nand(mtd);
- 
- 	ioread8_rep(chip->IO_ADDR_R, buf, len);
- }
-@@ -287,7 +329,7 @@ static void nand_read_buf(struct mtd_inf
-  */
- static void nand_write_buf16(struct mtd_info *mtd, const uint8_t *buf, int len)
- {
--	struct nand_chip *chip = mtd->priv;
-+	struct nand_chip *chip = mtd_to_nand(mtd);
- 	u16 *p = (u16 *) buf;
- 
- 	iowrite16_rep(chip->IO_ADDR_W, p, len >> 1);
-@@ -303,7 +345,7 @@ static void nand_write_buf16(struct mtd_
-  */
- static void nand_read_buf16(struct mtd_info *mtd, uint8_t *buf, int len)
- {
--	struct nand_chip *chip = mtd->priv;
-+	struct nand_chip *chip = mtd_to_nand(mtd);
- 	u16 *p = (u16 *) buf;
- 
- 	ioread16_rep(chip->IO_ADDR_R, p, len >> 1);
-@@ -313,14 +355,13 @@ static void nand_read_buf16(struct mtd_i
-  * nand_block_bad - [DEFAULT] Read bad block marker from the chip
-  * @mtd: MTD device structure
-  * @ofs: offset from device start
-- * @getchip: 0, if the chip is already selected
-  *
-  * Check, if the block is bad.
-  */
--static int nand_block_bad(struct mtd_info *mtd, loff_t ofs, int getchip)
-+static int nand_block_bad(struct mtd_info *mtd, loff_t ofs)
- {
--	int page, chipnr, res = 0, i = 0;
--	struct nand_chip *chip = mtd->priv;
-+	int page, res = 0, i = 0;
-+	struct nand_chip *chip = mtd_to_nand(mtd);
- 	u16 bad;
- 
- 	if (chip->bbt_options & NAND_BBT_SCANLASTPAGE)
-@@ -328,15 +369,6 @@ static int nand_block_bad(struct mtd_inf
- 
- 	page = (int)(ofs >> chip->page_shift) & chip->pagemask;
- 
--	if (getchip) {
--		chipnr = (int)(ofs >> chip->chip_shift);
--
--		nand_get_device(mtd, FL_READING);
--
--		/* Select the NAND device */
--		chip->select_chip(mtd, chipnr);
--	}
--
- 	do {
- 		if (chip->options & NAND_BUSWIDTH_16) {
- 			chip->cmdfunc(mtd, NAND_CMD_READOOB,
-@@ -361,11 +393,6 @@ static int nand_block_bad(struct mtd_inf
- 		i++;
- 	} while (!res && i < 2 && (chip->bbt_options & NAND_BBT_SCAN2NDPAGE));
- 
--	if (getchip) {
--		chip->select_chip(mtd, -1);
--		nand_release_device(mtd);
--	}
--
- 	return res;
- }
- 
-@@ -380,7 +407,7 @@ static int nand_block_bad(struct mtd_inf
-  */
- static int nand_default_block_markbad(struct mtd_info *mtd, loff_t ofs)
- {
--	struct nand_chip *chip = mtd->priv;
-+	struct nand_chip *chip = mtd_to_nand(mtd);
- 	struct mtd_oob_ops ops;
- 	uint8_t buf[2] = { 0, 0 };
- 	int ret = 0, res, i = 0;
-@@ -430,7 +457,7 @@ static int nand_default_block_markbad(st
- */
- static int nand_block_markbad_lowlevel(struct mtd_info *mtd, loff_t ofs)
- {
--	struct nand_chip *chip = mtd->priv;
-+	struct nand_chip *chip = mtd_to_nand(mtd);
- 	int res, ret = 0;
- 
- 	if (!(chip->bbt_options & NAND_BBT_NO_OOB_BBM)) {
-@@ -471,7 +498,7 @@ static int nand_block_markbad_lowlevel(s
-  */
- static int nand_check_wp(struct mtd_info *mtd)
- {
--	struct nand_chip *chip = mtd->priv;
-+	struct nand_chip *chip = mtd_to_nand(mtd);
- 
- 	/* Broken xD cards report WP despite being writable */
- 	if (chip->options & NAND_BROKEN_XD)
-@@ -491,7 +518,7 @@ static int nand_check_wp(struct mtd_info
-  */
- static int nand_block_isreserved(struct mtd_info *mtd, loff_t ofs)
- {
--	struct nand_chip *chip = mtd->priv;
-+	struct nand_chip *chip = mtd_to_nand(mtd);
- 
- 	if (!chip->bbt)
- 		return 0;
-@@ -503,19 +530,17 @@ static int nand_block_isreserved(struct
-  * nand_block_checkbad - [GENERIC] Check if a block is marked bad
-  * @mtd: MTD device structure
-  * @ofs: offset from device start
-- * @getchip: 0, if the chip is already selected
-  * @allowbbt: 1, if its allowed to access the bbt area
-  *
-  * Check, if the block is bad. Either by reading the bad block table or
-  * calling of the scan function.
-  */
--static int nand_block_checkbad(struct mtd_info *mtd, loff_t ofs, int getchip,
--			       int allowbbt)
-+static int nand_block_checkbad(struct mtd_info *mtd, loff_t ofs, int allowbbt)
- {
--	struct nand_chip *chip = mtd->priv;
-+	struct nand_chip *chip = mtd_to_nand(mtd);
- 
- 	if (!chip->bbt)
--		return chip->block_bad(mtd, ofs, getchip);
-+		return chip->block_bad(mtd, ofs);
- 
- 	/* Return info from the table */
- 	return nand_isbad_bbt(mtd, ofs, allowbbt);
-@@ -531,7 +556,7 @@ static int nand_block_checkbad(struct mt
-  */
- static void panic_nand_wait_ready(struct mtd_info *mtd, unsigned long timeo)
- {
--	struct nand_chip *chip = mtd->priv;
-+	struct nand_chip *chip = mtd_to_nand(mtd);
- 	int i;
- 
- 	/* Wait for the device to get ready */
-@@ -551,7 +576,7 @@ static void panic_nand_wait_ready(struct
-  */
- void nand_wait_ready(struct mtd_info *mtd)
- {
--	struct nand_chip *chip = mtd->priv;
-+	struct nand_chip *chip = mtd_to_nand(mtd);
- 	unsigned long timeo = 400;
- 
- 	if (in_interrupt() || oops_in_progress)
-@@ -566,8 +591,8 @@ void nand_wait_ready(struct mtd_info *mt
- 		cond_resched();
- 	} while (time_before(jiffies, timeo));
- 
--	pr_warn_ratelimited(
--		"timeout while waiting for chip to become ready\n");
-+	if (!chip->dev_ready(mtd))
-+		pr_warn_ratelimited("timeout while waiting for chip to become ready\n");
- out:
- 	led_trigger_event(nand_led_trigger, LED_OFF);
- }
-@@ -582,7 +607,7 @@ EXPORT_SYMBOL_GPL(nand_wait_ready);
-  */
- static void nand_wait_status_ready(struct mtd_info *mtd, unsigned long timeo)
- {
--	register struct nand_chip *chip = mtd->priv;
-+	register struct nand_chip *chip = mtd_to_nand(mtd);
- 
- 	timeo = jiffies + msecs_to_jiffies(timeo);
- 	do {
-@@ -605,7 +630,7 @@ static void nand_wait_status_ready(struc
- static void nand_command(struct mtd_info *mtd, unsigned int command,
- 			 int column, int page_addr)
- {
--	register struct nand_chip *chip = mtd->priv;
-+	register struct nand_chip *chip = mtd_to_nand(mtd);
- 	int ctrl = NAND_CTRL_CLE | NAND_CTRL_CHANGE;
- 
- 	/* Write out the command to the device */
-@@ -708,7 +733,7 @@ static void nand_command(struct mtd_info
- static void nand_command_lp(struct mtd_info *mtd, unsigned int command,
- 			    int column, int page_addr)
- {
--	register struct nand_chip *chip = mtd->priv;
-+	register struct nand_chip *chip = mtd_to_nand(mtd);
- 
- 	/* Emulate NAND_CMD_READOOB */
- 	if (command == NAND_CMD_READOOB) {
-@@ -832,7 +857,7 @@ static void panic_nand_get_device(struct
- static int
- nand_get_device(struct mtd_info *mtd, int new_state)
- {
--	struct nand_chip *chip = mtd->priv;
-+	struct nand_chip *chip = mtd_to_nand(mtd);
- 	spinlock_t *lock = &chip->controller->lock;
- 	wait_queue_head_t *wq = &chip->controller->wq;
- 	DECLARE_WAITQUEUE(wait, current);
-@@ -952,7 +977,7 @@ static int __nand_unlock(struct mtd_info
- {
- 	int ret = 0;
- 	int status, page;
--	struct nand_chip *chip = mtd->priv;
-+	struct nand_chip *chip = mtd_to_nand(mtd);
- 
- 	/* Submit address of first page to unlock */
- 	page = ofs >> chip->page_shift;
-@@ -987,7 +1012,7 @@ int nand_unlock(struct mtd_info *mtd, lo
- {
- 	int ret = 0;
- 	int chipnr;
--	struct nand_chip *chip = mtd->priv;
-+	struct nand_chip *chip = mtd_to_nand(mtd);
- 
- 	pr_debug("%s: start = 0x%012llx, len = %llu\n",
- 			__func__, (unsigned long long)ofs, len);
-@@ -1050,7 +1075,7 @@ int nand_lock(struct mtd_info *mtd, loff
- {
- 	int ret = 0;
- 	int chipnr, status, page;
--	struct nand_chip *chip = mtd->priv;
-+	struct nand_chip *chip = mtd_to_nand(mtd);
- 
- 	pr_debug("%s: start = 0x%012llx, len = %llu\n",
- 			__func__, (unsigned long long)ofs, len);
-@@ -1309,13 +1334,12 @@ static int nand_read_page_raw_syndrome(s
- static int nand_read_page_swecc(struct mtd_info *mtd, struct nand_chip *chip,
- 				uint8_t *buf, int oob_required, int page)
- {
--	int i, eccsize = chip->ecc.size;
-+	int i, eccsize = chip->ecc.size, ret;
- 	int eccbytes = chip->ecc.bytes;
- 	int eccsteps = chip->ecc.steps;
- 	uint8_t *p = buf;
- 	uint8_t *ecc_calc = chip->buffers->ecccalc;
- 	uint8_t *ecc_code = chip->buffers->ecccode;
--	uint32_t *eccpos = chip->ecc.layout->eccpos;
- 	unsigned int max_bitflips = 0;
- 
- 	chip->ecc.read_page_raw(mtd, chip, buf, 1, page);
-@@ -1323,8 +1347,10 @@ static int nand_read_page_swecc(struct m
- 	for (i = 0; eccsteps; eccsteps--, i += eccbytes, p += eccsize)
- 		chip->ecc.calculate(mtd, p, &ecc_calc[i]);
- 
--	for (i = 0; i < chip->ecc.total; i++)
--		ecc_code[i] = chip->oob_poi[eccpos[i]];
-+	ret = mtd_ooblayout_get_eccbytes(mtd, ecc_code, chip->oob_poi, 0,
-+					 chip->ecc.total);
-+	if (ret)
-+		return ret;
- 
- 	eccsteps = chip->ecc.steps;
- 	p = buf;
-@@ -1356,14 +1382,14 @@ static int nand_read_subpage(struct mtd_
- 			uint32_t data_offs, uint32_t readlen, uint8_t *bufpoi,
- 			int page)
- {
--	int start_step, end_step, num_steps;
--	uint32_t *eccpos = chip->ecc.layout->eccpos;
-+	int start_step, end_step, num_steps, ret;
- 	uint8_t *p;
- 	int data_col_addr, i, gaps = 0;
- 	int datafrag_len, eccfrag_len, aligned_len, aligned_pos;
- 	int busw = (chip->options & NAND_BUSWIDTH_16) ? 2 : 1;
--	int index;
-+	int index, section = 0;
- 	unsigned int max_bitflips = 0;
-+	struct mtd_oob_region oobregion = { };
- 
- 	/* Column address within the page aligned to ECC size (256bytes) */
- 	start_step = data_offs / chip->ecc.size;
-@@ -1391,12 +1417,13 @@ static int nand_read_subpage(struct mtd_
- 	 * The performance is faster if we position offsets according to
- 	 * ecc.pos. Let's make sure that there are no gaps in ECC positions.
- 	 */
--	for (i = 0; i < eccfrag_len - 1; i++) {
--		if (eccpos[i + index] + 1 != eccpos[i + index + 1]) {
--			gaps = 1;
--			break;
--		}
--	}
-+	ret = mtd_ooblayout_find_eccregion(mtd, index, &section, &oobregion);
-+	if (ret)
-+		return ret;
-+
-+	if (oobregion.length < eccfrag_len)
-+		gaps = 1;
-+
- 	if (gaps) {
- 		chip->cmdfunc(mtd, NAND_CMD_RNDOUT, mtd->writesize, -1);
- 		chip->read_buf(mtd, chip->oob_poi, mtd->oobsize);
-@@ -1405,20 +1432,23 @@ static int nand_read_subpage(struct mtd_
- 		 * Send the command to read the particular ECC bytes take care
- 		 * about buswidth alignment in read_buf.
- 		 */
--		aligned_pos = eccpos[index] & ~(busw - 1);
-+		aligned_pos = oobregion.offset & ~(busw - 1);
- 		aligned_len = eccfrag_len;
--		if (eccpos[index] & (busw - 1))
-+		if (oobregion.offset & (busw - 1))
- 			aligned_len++;
--		if (eccpos[index + (num_steps * chip->ecc.bytes)] & (busw - 1))
-+		if ((oobregion.offset + (num_steps * chip->ecc.bytes)) &
-+		    (busw - 1))
- 			aligned_len++;
- 
- 		chip->cmdfunc(mtd, NAND_CMD_RNDOUT,
--					mtd->writesize + aligned_pos, -1);
-+			      mtd->writesize + aligned_pos, -1);
- 		chip->read_buf(mtd, &chip->oob_poi[aligned_pos], aligned_len);
- 	}
- 
--	for (i = 0; i < eccfrag_len; i++)
--		chip->buffers->ecccode[i] = chip->oob_poi[eccpos[i + index]];
-+	ret = mtd_ooblayout_get_eccbytes(mtd, chip->buffers->ecccode,
-+					 chip->oob_poi, index, eccfrag_len);
-+	if (ret)
-+		return ret;
- 
- 	p = bufpoi + data_col_addr;
- 	for (i = 0; i < eccfrag_len ; i += chip->ecc.bytes, p += chip->ecc.size) {
-@@ -1426,6 +1456,16 @@ static int nand_read_subpage(struct mtd_
- 
- 		stat = chip->ecc.correct(mtd, p,
- 			&chip->buffers->ecccode[i], &chip->buffers->ecccalc[i]);
-+		if (stat == -EBADMSG &&
-+		    (chip->ecc.options & NAND_ECC_GENERIC_ERASED_CHECK)) {
-+			/* check for empty pages with bitflips */
-+			stat = nand_check_erased_ecc_chunk(p, chip->ecc.size,
-+						&chip->buffers->ecccode[i],
-+						chip->ecc.bytes,
-+						NULL, 0,
-+						chip->ecc.strength);
-+		}
-+
- 		if (stat < 0) {
- 			mtd->ecc_stats.failed++;
- 		} else {
-@@ -1449,13 +1489,12 @@ static int nand_read_subpage(struct mtd_
- static int nand_read_page_hwecc(struct mtd_info *mtd, struct nand_chip *chip,
- 				uint8_t *buf, int oob_required, int page)
- {
--	int i, eccsize = chip->ecc.size;
-+	int i, eccsize = chip->ecc.size, ret;
- 	int eccbytes = chip->ecc.bytes;
- 	int eccsteps = chip->ecc.steps;
- 	uint8_t *p = buf;
- 	uint8_t *ecc_calc = chip->buffers->ecccalc;
- 	uint8_t *ecc_code = chip->buffers->ecccode;
--	uint32_t *eccpos = chip->ecc.layout->eccpos;
- 	unsigned int max_bitflips = 0;
- 
- 	for (i = 0; eccsteps; eccsteps--, i += eccbytes, p += eccsize) {
-@@ -1465,8 +1504,10 @@ static int nand_read_page_hwecc(struct m
- 	}
- 	chip->read_buf(mtd, chip->oob_poi, mtd->oobsize);
- 
--	for (i = 0; i < chip->ecc.total; i++)
--		ecc_code[i] = chip->oob_poi[eccpos[i]];
-+	ret = mtd_ooblayout_get_eccbytes(mtd, ecc_code, chip->oob_poi, 0,
-+					 chip->ecc.total);
-+	if (ret)
-+		return ret;
- 
- 	eccsteps = chip->ecc.steps;
- 	p = buf;
-@@ -1475,6 +1516,15 @@ static int nand_read_page_hwecc(struct m
- 		int stat;
- 
- 		stat = chip->ecc.correct(mtd, p, &ecc_code[i], &ecc_calc[i]);
-+		if (stat == -EBADMSG &&
-+		    (chip->ecc.options & NAND_ECC_GENERIC_ERASED_CHECK)) {
-+			/* check for empty pages with bitflips */
-+			stat = nand_check_erased_ecc_chunk(p, eccsize,
-+						&ecc_code[i], eccbytes,
-+						NULL, 0,
-+						chip->ecc.strength);
-+		}
-+
- 		if (stat < 0) {
- 			mtd->ecc_stats.failed++;
- 		} else {
-@@ -1502,12 +1552,11 @@ static int nand_read_page_hwecc(struct m
- static int nand_read_page_hwecc_oob_first(struct mtd_info *mtd,
- 	struct nand_chip *chip, uint8_t *buf, int oob_required, int page)
- {
--	int i, eccsize = chip->ecc.size;
-+	int i, eccsize = chip->ecc.size, ret;
- 	int eccbytes = chip->ecc.bytes;
- 	int eccsteps = chip->ecc.steps;
- 	uint8_t *p = buf;
- 	uint8_t *ecc_code = chip->buffers->ecccode;
--	uint32_t *eccpos = chip->ecc.layout->eccpos;
- 	uint8_t *ecc_calc = chip->buffers->ecccalc;
- 	unsigned int max_bitflips = 0;
- 
-@@ -1516,8 +1565,10 @@ static int nand_read_page_hwecc_oob_firs
- 	chip->read_buf(mtd, chip->oob_poi, mtd->oobsize);
- 	chip->cmdfunc(mtd, NAND_CMD_READ0, 0, page);
- 
--	for (i = 0; i < chip->ecc.total; i++)
--		ecc_code[i] = chip->oob_poi[eccpos[i]];
-+	ret = mtd_ooblayout_get_eccbytes(mtd, ecc_code, chip->oob_poi, 0,
-+					 chip->ecc.total);
-+	if (ret)
-+		return ret;
- 
- 	for (i = 0; eccsteps; eccsteps--, i += eccbytes, p += eccsize) {
- 		int stat;
-@@ -1527,6 +1578,15 @@ static int nand_read_page_hwecc_oob_firs
- 		chip->ecc.calculate(mtd, p, &ecc_calc[i]);
- 
- 		stat = chip->ecc.correct(mtd, p, &ecc_code[i], NULL);
-+		if (stat == -EBADMSG &&
-+		    (chip->ecc.options & NAND_ECC_GENERIC_ERASED_CHECK)) {
-+			/* check for empty pages with bitflips */
-+			stat = nand_check_erased_ecc_chunk(p, eccsize,
-+						&ecc_code[i], eccbytes,
-+						NULL, 0,
-+						chip->ecc.strength);
-+		}
-+
- 		if (stat < 0) {
- 			mtd->ecc_stats.failed++;
- 		} else {
-@@ -1554,6 +1614,7 @@ static int nand_read_page_syndrome(struc
- 	int i, eccsize = chip->ecc.size;
- 	int eccbytes = chip->ecc.bytes;
- 	int eccsteps = chip->ecc.steps;
-+	int eccpadbytes = eccbytes + chip->ecc.prepad + chip->ecc.postpad;
- 	uint8_t *p = buf;
- 	uint8_t *oob = chip->oob_poi;
- 	unsigned int max_bitflips = 0;
-@@ -1573,19 +1634,29 @@ static int nand_read_page_syndrome(struc
- 		chip->read_buf(mtd, oob, eccbytes);
- 		stat = chip->ecc.correct(mtd, p, oob, NULL);
- 
--		if (stat < 0) {
--			mtd->ecc_stats.failed++;
--		} else {
--			mtd->ecc_stats.corrected += stat;
--			max_bitflips = max_t(unsigned int, max_bitflips, stat);
--		}
--
- 		oob += eccbytes;
- 
- 		if (chip->ecc.postpad) {
- 			chip->read_buf(mtd, oob, chip->ecc.postpad);
- 			oob += chip->ecc.postpad;
- 		}
-+
-+		if (stat == -EBADMSG &&
-+		    (chip->ecc.options & NAND_ECC_GENERIC_ERASED_CHECK)) {
-+			/* check for empty pages with bitflips */
-+			stat = nand_check_erased_ecc_chunk(p, chip->ecc.size,
-+							   oob - eccpadbytes,
-+							   eccpadbytes,
-+							   NULL, 0,
-+							   chip->ecc.strength);
-+		}
-+
-+		if (stat < 0) {
-+			mtd->ecc_stats.failed++;
-+		} else {
-+			mtd->ecc_stats.corrected += stat;
-+			max_bitflips = max_t(unsigned int, max_bitflips, stat);
-+		}
- 	}
- 
- 	/* Calculate remaining oob bytes */
-@@ -1598,14 +1669,17 @@ static int nand_read_page_syndrome(struc
- 
- /**
-  * nand_transfer_oob - [INTERN] Transfer oob to client buffer
-- * @chip: nand chip structure
-+ * @mtd: mtd info structure
-  * @oob: oob destination address
-  * @ops: oob ops structure
-  * @len: size of oob to transfer
-  */
--static uint8_t *nand_transfer_oob(struct nand_chip *chip, uint8_t *oob,
-+static uint8_t *nand_transfer_oob(struct mtd_info *mtd, uint8_t *oob,
- 				  struct mtd_oob_ops *ops, size_t len)
- {
-+	struct nand_chip *chip = mtd_to_nand(mtd);
-+	int ret;
-+
- 	switch (ops->mode) {
- 
- 	case MTD_OPS_PLACE_OOB:
-@@ -1613,31 +1687,12 @@ static uint8_t *nand_transfer_oob(struct
- 		memcpy(oob, chip->oob_poi + ops->ooboffs, len);
- 		return oob + len;
- 
--	case MTD_OPS_AUTO_OOB: {
--		struct nand_oobfree *free = chip->ecc.layout->oobfree;
--		uint32_t boffs = 0, roffs = ops->ooboffs;
--		size_t bytes = 0;
--
--		for (; free->length && len; free++, len -= bytes) {
--			/* Read request not from offset 0? */
--			if (unlikely(roffs)) {
--				if (roffs >= free->length) {
--					roffs -= free->length;
--					continue;
--				}
--				boffs = free->offset + roffs;
--				bytes = min_t(size_t, len,
--					      (free->length - roffs));
--				roffs = 0;
--			} else {
--				bytes = min_t(size_t, len, free->length);
--				boffs = free->offset;
--			}
--			memcpy(oob, chip->oob_poi + boffs, bytes);
--			oob += bytes;
--		}
--		return oob;
--	}
-+	case MTD_OPS_AUTO_OOB:
-+		ret = mtd_ooblayout_get_databytes(mtd, oob, chip->oob_poi,
-+						  ops->ooboffs, len);
-+		BUG_ON(ret);
-+		return oob + len;
-+
- 	default:
- 		BUG();
- 	}
-@@ -1655,7 +1710,7 @@ static uint8_t *nand_transfer_oob(struct
-  */
- static int nand_setup_read_retry(struct mtd_info *mtd, int retry_mode)
- {
--	struct nand_chip *chip = mtd->priv;
-+	struct nand_chip *chip = mtd_to_nand(mtd);
- 
- 	pr_debug("setting READ RETRY mode %d\n", retry_mode);
- 
-@@ -1680,12 +1735,11 @@ static int nand_do_read_ops(struct mtd_i
- 			    struct mtd_oob_ops *ops)
- {
- 	int chipnr, page, realpage, col, bytes, aligned, oob_required;
--	struct nand_chip *chip = mtd->priv;
-+	struct nand_chip *chip = mtd_to_nand(mtd);
- 	int ret = 0;
- 	uint32_t readlen = ops->len;
- 	uint32_t oobreadlen = ops->ooblen;
--	uint32_t max_oobsize = ops->mode == MTD_OPS_AUTO_OOB ?
--		mtd->oobavail : mtd->oobsize;
-+	uint32_t max_oobsize = mtd_oobavail(mtd, ops);
- 
- 	uint8_t *bufpoi, *oob, *buf;
- 	int use_bufpoi;
-@@ -1772,7 +1826,7 @@ read_retry:
- 				int toread = min(oobreadlen, max_oobsize);
- 
- 				if (toread) {
--					oob = nand_transfer_oob(chip,
-+					oob = nand_transfer_oob(mtd,
- 						oob, ops, toread);
- 					oobreadlen -= toread;
- 				}
-@@ -2024,7 +2078,7 @@ static int nand_do_read_oob(struct mtd_i
- 			    struct mtd_oob_ops *ops)
- {
- 	int page, realpage, chipnr;
--	struct nand_chip *chip = mtd->priv;
-+	struct nand_chip *chip = mtd_to_nand(mtd);
- 	struct mtd_ecc_stats stats;
- 	int readlen = ops->ooblen;
- 	int len;
-@@ -2036,10 +2090,7 @@ static int nand_do_read_oob(struct mtd_i
- 
- 	stats = mtd->ecc_stats;
- 
--	if (ops->mode == MTD_OPS_AUTO_OOB)
--		len = chip->ecc.layout->oobavail;
--	else
--		len = mtd->oobsize;
-+	len = mtd_oobavail(mtd, ops);
- 
- 	if (unlikely(ops->ooboffs >= len)) {
- 		pr_debug("%s: attempt to start read outside oob\n",
-@@ -2073,7 +2124,7 @@ static int nand_do_read_oob(struct mtd_i
- 			break;
- 
- 		len = min(len, readlen);
--		buf = nand_transfer_oob(chip, buf, ops, len);
-+		buf = nand_transfer_oob(mtd, buf, ops, len);
- 
- 		if (chip->options & NAND_NEED_READRDY) {
- 			/* Apply delay or wait for ready/busy pin */
-@@ -2232,19 +2283,20 @@ static int nand_write_page_swecc(struct
- 				 const uint8_t *buf, int oob_required,
- 				 int page)
- {
--	int i, eccsize = chip->ecc.size;
-+	int i, eccsize = chip->ecc.size, ret;
- 	int eccbytes = chip->ecc.bytes;
- 	int eccsteps = chip->ecc.steps;
- 	uint8_t *ecc_calc = chip->buffers->ecccalc;
- 	const uint8_t *p = buf;
--	uint32_t *eccpos = chip->ecc.layout->eccpos;
- 
- 	/* Software ECC calculation */
- 	for (i = 0; eccsteps; eccsteps--, i += eccbytes, p += eccsize)
- 		chip->ecc.calculate(mtd, p, &ecc_calc[i]);
- 
--	for (i = 0; i < chip->ecc.total; i++)
--		chip->oob_poi[eccpos[i]] = ecc_calc[i];
-+	ret = mtd_ooblayout_set_eccbytes(mtd, ecc_calc, chip->oob_poi, 0,
-+					 chip->ecc.total);
-+	if (ret)
-+		return ret;
- 
- 	return chip->ecc.write_page_raw(mtd, chip, buf, 1, page);
- }
-@@ -2261,12 +2313,11 @@ static int nand_write_page_hwecc(struct
- 				  const uint8_t *buf, int oob_required,
- 				  int page)
- {
--	int i, eccsize = chip->ecc.size;
-+	int i, eccsize = chip->ecc.size, ret;
- 	int eccbytes = chip->ecc.bytes;
- 	int eccsteps = chip->ecc.steps;
- 	uint8_t *ecc_calc = chip->buffers->ecccalc;
- 	const uint8_t *p = buf;
--	uint32_t *eccpos = chip->ecc.layout->eccpos;
- 
- 	for (i = 0; eccsteps; eccsteps--, i += eccbytes, p += eccsize) {
- 		chip->ecc.hwctl(mtd, NAND_ECC_WRITE);
-@@ -2274,8 +2325,10 @@ static int nand_write_page_hwecc(struct
- 		chip->ecc.calculate(mtd, p, &ecc_calc[i]);
- 	}
- 
--	for (i = 0; i < chip->ecc.total; i++)
--		chip->oob_poi[eccpos[i]] = ecc_calc[i];
-+	ret = mtd_ooblayout_set_eccbytes(mtd, ecc_calc, chip->oob_poi, 0,
-+					 chip->ecc.total);
-+	if (ret)
-+		return ret;
- 
- 	chip->write_buf(mtd, chip->oob_poi, mtd->oobsize);
- 
-@@ -2303,11 +2356,10 @@ static int nand_write_subpage_hwecc(stru
- 	int ecc_size      = chip->ecc.size;
- 	int ecc_bytes     = chip->ecc.bytes;
- 	int ecc_steps     = chip->ecc.steps;
--	uint32_t *eccpos  = chip->ecc.layout->eccpos;
- 	uint32_t start_step = offset / ecc_size;
- 	uint32_t end_step   = (offset + data_len - 1) / ecc_size;
- 	int oob_bytes       = mtd->oobsize / ecc_steps;
--	int step, i;
-+	int step, ret;
- 
- 	for (step = 0; step < ecc_steps; step++) {
- 		/* configure controller for WRITE access */
-@@ -2335,8 +2387,10 @@ static int nand_write_subpage_hwecc(stru
- 	/* copy calculated ECC for whole page to chip->buffer->oob */
- 	/* this include masked-value(0xFF) for unwritten subpages */
- 	ecc_calc = chip->buffers->ecccalc;
--	for (i = 0; i < chip->ecc.total; i++)
--		chip->oob_poi[eccpos[i]] = ecc_calc[i];
-+	ret = mtd_ooblayout_set_eccbytes(mtd, ecc_calc, chip->oob_poi, 0,
-+					 chip->ecc.total);
-+	if (ret)
-+		return ret;
- 
- 	/* write OOB buffer to NAND device */
- 	chip->write_buf(mtd, chip->oob_poi, mtd->oobsize);
-@@ -2472,7 +2526,8 @@ static int nand_write_page(struct mtd_in
- static uint8_t *nand_fill_oob(struct mtd_info *mtd, uint8_t *oob, size_t len,
- 			      struct mtd_oob_ops *ops)
- {
--	struct nand_chip *chip = mtd->priv;
-+	struct nand_chip *chip = mtd_to_nand(mtd);
-+	int ret;
- 
- 	/*
- 	 * Initialise to all 0xFF, to avoid the possibility of left over OOB
-@@ -2487,31 +2542,12 @@ static uint8_t *nand_fill_oob(struct mtd
- 		memcpy(chip->oob_poi + ops->ooboffs, oob, len);
- 		return oob + len;
- 
--	case MTD_OPS_AUTO_OOB: {
--		struct nand_oobfree *free = chip->ecc.layout->oobfree;
--		uint32_t boffs = 0, woffs = ops->ooboffs;
--		size_t bytes = 0;
--
--		for (; free->length && len; free++, len -= bytes) {
--			/* Write request not from offset 0? */
--			if (unlikely(woffs)) {
--				if (woffs >= free->length) {
--					woffs -= free->length;
--					continue;
--				}
--				boffs = free->offset + woffs;
--				bytes = min_t(size_t, len,
--					      (free->length - woffs));
--				woffs = 0;
--			} else {
--				bytes = min_t(size_t, len, free->length);
--				boffs = free->offset;
--			}
--			memcpy(chip->oob_poi + boffs, oob, bytes);
--			oob += bytes;
--		}
--		return oob;
--	}
-+	case MTD_OPS_AUTO_OOB:
-+		ret = mtd_ooblayout_set_databytes(mtd, oob, chip->oob_poi,
-+						  ops->ooboffs, len);
-+		BUG_ON(ret);
-+		return oob + len;
-+
- 	default:
- 		BUG();
- 	}
-@@ -2532,12 +2568,11 @@ static int nand_do_write_ops(struct mtd_
- 			     struct mtd_oob_ops *ops)
- {
- 	int chipnr, realpage, page, blockmask, column;
--	struct nand_chip *chip = mtd->priv;
-+	struct nand_chip *chip = mtd_to_nand(mtd);
- 	uint32_t writelen = ops->len;
- 
- 	uint32_t oobwritelen = ops->ooblen;
--	uint32_t oobmaxlen = ops->mode == MTD_OPS_AUTO_OOB ?
--				mtd->oobavail : mtd->oobsize;
-+	uint32_t oobmaxlen = mtd_oobavail(mtd, ops);
- 
- 	uint8_t *oob = ops->oobbuf;
- 	uint8_t *buf = ops->datbuf;
-@@ -2662,7 +2697,7 @@ err_out:
- static int panic_nand_write(struct mtd_info *mtd, loff_t to, size_t len,
- 			    size_t *retlen, const uint8_t *buf)
- {
--	struct nand_chip *chip = mtd->priv;
-+	struct nand_chip *chip = mtd_to_nand(mtd);
- 	struct mtd_oob_ops ops;
- 	int ret;
- 
-@@ -2722,15 +2757,12 @@ static int nand_do_write_oob(struct mtd_
- 			     struct mtd_oob_ops *ops)
- {
- 	int chipnr, page, status, len;
--	struct nand_chip *chip = mtd->priv;
-+	struct nand_chip *chip = mtd_to_nand(mtd);
- 
- 	pr_debug("%s: to = 0x%08x, len = %i\n",
- 			 __func__, (unsigned int)to, (int)ops->ooblen);
- 
--	if (ops->mode == MTD_OPS_AUTO_OOB)
--		len = chip->ecc.layout->oobavail;
--	else
--		len = mtd->oobsize;
-+	len = mtd_oobavail(mtd, ops);
- 
- 	/* Do not allow write past end of page */
- 	if ((ops->ooboffs + ops->ooblen) > len) {
-@@ -2847,7 +2879,7 @@ out:
-  */
- static int single_erase(struct mtd_info *mtd, int page)
- {
--	struct nand_chip *chip = mtd->priv;
-+	struct nand_chip *chip = mtd_to_nand(mtd);
- 	/* Send commands to erase a block */
- 	chip->cmdfunc(mtd, NAND_CMD_ERASE1, -1, page);
- 	chip->cmdfunc(mtd, NAND_CMD_ERASE2, -1, -1);
-@@ -2879,7 +2911,7 @@ int nand_erase_nand(struct mtd_info *mtd
- 		    int allowbbt)
- {
- 	int page, status, pages_per_block, ret, chipnr;
--	struct nand_chip *chip = mtd->priv;
-+	struct nand_chip *chip = mtd_to_nand(mtd);
- 	loff_t len;
- 
- 	pr_debug("%s: start = 0x%012llx, len = %llu\n",
-@@ -2918,7 +2950,7 @@ int nand_erase_nand(struct mtd_info *mtd
- 	while (len) {
- 		/* Check if we have a bad block, we do not erase bad blocks! */
- 		if (nand_block_checkbad(mtd, ((loff_t) page) <<
--					chip->page_shift, 0, allowbbt)) {
-+					chip->page_shift, allowbbt)) {
- 			pr_warn("%s: attempt to erase a bad block at page 0x%08x\n",
- 				    __func__, page);
- 			instr->state = MTD_ERASE_FAILED;
-@@ -3005,7 +3037,20 @@ static void nand_sync(struct mtd_info *m
-  */
- static int nand_block_isbad(struct mtd_info *mtd, loff_t offs)
- {
--	return nand_block_checkbad(mtd, offs, 1, 0);
-+	struct nand_chip *chip = mtd_to_nand(mtd);
-+	int chipnr = (int)(offs >> chip->chip_shift);
-+	int ret;
-+
-+	/* Select the NAND device */
-+	nand_get_device(mtd, FL_READING);
-+	chip->select_chip(mtd, chipnr);
-+
-+	ret = nand_block_checkbad(mtd, offs, 0);
-+
-+	chip->select_chip(mtd, -1);
-+	nand_release_device(mtd);
-+
-+	return ret;
- }
- 
- /**
-@@ -3094,7 +3139,7 @@ static int nand_suspend(struct mtd_info
-  */
- static void nand_resume(struct mtd_info *mtd)
- {
--	struct nand_chip *chip = mtd->priv;
-+	struct nand_chip *chip = mtd_to_nand(mtd);
- 
- 	if (chip->state == FL_PM_SUSPENDED)
- 		nand_release_device(mtd);
-@@ -3266,7 +3311,7 @@ ext_out:
- 
- static int nand_setup_read_retry_micron(struct mtd_info *mtd, int retry_mode)
- {
--	struct nand_chip *chip = mtd->priv;
-+	struct nand_chip *chip = mtd_to_nand(mtd);
- 	uint8_t feature[ONFI_SUBFEATURE_PARAM_LEN] = {retry_mode};
- 
- 	return chip->onfi_set_features(mtd, chip, ONFI_FEATURE_ADDR_READ_RETRY,
-@@ -3937,10 +3982,13 @@ ident_done:
- 	return type;
- }
- 
--static int nand_dt_init(struct mtd_info *mtd, struct nand_chip *chip,
--			struct device_node *dn)
-+static int nand_dt_init(struct nand_chip *chip)
- {
--	int ecc_mode, ecc_strength, ecc_step;
-+	struct device_node *dn = nand_get_flash_node(chip);
-+	int ecc_mode, ecc_algo, ecc_strength, ecc_step;
-+
-+	if (!dn)
-+		return 0;
- 
- 	if (of_get_nand_bus_width(dn) == 16)
- 		chip->options |= NAND_BUSWIDTH_16;
-@@ -3949,6 +3997,7 @@ static int nand_dt_init(struct mtd_info
- 		chip->bbt_options |= NAND_BBT_USE_FLASH;
- 
- 	ecc_mode = of_get_nand_ecc_mode(dn);
-+	ecc_algo = of_get_nand_ecc_algo(dn);
- 	ecc_strength = of_get_nand_ecc_strength(dn);
- 	ecc_step = of_get_nand_ecc_step_size(dn);
- 
-@@ -3961,6 +4010,9 @@ static int nand_dt_init(struct mtd_info
- 	if (ecc_mode >= 0)
- 		chip->ecc.mode = ecc_mode;
- 
-+	if (ecc_algo >= 0)
-+		chip->ecc.algo = ecc_algo;
-+
- 	if (ecc_strength >= 0)
- 		chip->ecc.strength = ecc_strength;
- 
-@@ -3984,15 +4036,16 @@ int nand_scan_ident(struct mtd_info *mtd
- 		    struct nand_flash_dev *table)
- {
- 	int i, nand_maf_id, nand_dev_id;
--	struct nand_chip *chip = mtd->priv;
-+	struct nand_chip *chip = mtd_to_nand(mtd);
- 	struct nand_flash_dev *type;
- 	int ret;
- 
--	if (chip->flash_node) {
--		ret = nand_dt_init(mtd, chip, chip->flash_node);
--		if (ret)
--			return ret;
--	}
-+	ret = nand_dt_init(chip);
-+	if (ret)
-+		return ret;
-+
-+	if (!mtd->name && mtd->dev.parent)
-+		mtd->name = dev_name(mtd->dev.parent);
- 
- 	if (!mtd->name && mtd->dev.parent)
- 		mtd->name = dev_name(mtd->dev.parent);
-@@ -4055,7 +4108,7 @@ EXPORT_SYMBOL(nand_scan_ident);
-  */
- static bool nand_ecc_strength_good(struct mtd_info *mtd)
- {
--	struct nand_chip *chip = mtd->priv;
-+	struct nand_chip *chip = mtd_to_nand(mtd);
- 	struct nand_ecc_ctrl *ecc = &chip->ecc;
- 	int corr, ds_corr;
- 
-@@ -4083,10 +4136,10 @@ static bool nand_ecc_strength_good(struc
-  */
- int nand_scan_tail(struct mtd_info *mtd)
- {
--	int i;
--	struct nand_chip *chip = mtd->priv;
-+	struct nand_chip *chip = mtd_to_nand(mtd);
- 	struct nand_ecc_ctrl *ecc = &chip->ecc;
- 	struct nand_buffers *nbuf;
-+	int ret;
- 
- 	/* New bad blocks should be marked in OOB, flash-based BBT, or both */
- 	BUG_ON((chip->bbt_options & NAND_BBT_NO_OOB_BBM) &&
-@@ -4113,19 +4166,15 @@ int nand_scan_tail(struct mtd_info *mtd)
- 	/*
- 	 * If no default placement scheme is given, select an appropriate one.
- 	 */
--	if (!ecc->layout && (ecc->mode != NAND_ECC_SOFT_BCH)) {
-+	if (!mtd->ooblayout && (ecc->mode != NAND_ECC_SOFT_BCH)) {
- 		switch (mtd->oobsize) {
- 		case 8:
--			ecc->layout = &nand_oob_8;
--			break;
- 		case 16:
--			ecc->layout = &nand_oob_16;
-+			mtd_set_ooblayout(mtd, &nand_ooblayout_sp_ops);
- 			break;
- 		case 64:
--			ecc->layout = &nand_oob_64;
--			break;
- 		case 128:
--			ecc->layout = &nand_oob_128;
-+			mtd_set_ooblayout(mtd, &nand_ooblayout_lp_ops);
- 			break;
- 		default:
- 			pr_warn("No oob scheme defined for oobsize %d\n",
-@@ -4168,7 +4217,7 @@ int nand_scan_tail(struct mtd_info *mtd)
- 			ecc->write_oob = nand_write_oob_std;
- 		if (!ecc->read_subpage)
- 			ecc->read_subpage = nand_read_subpage;
--		if (!ecc->write_subpage)
-+		if (!ecc->write_subpage && ecc->hwctl && ecc->calculate)
- 			ecc->write_subpage = nand_write_subpage_hwecc;
- 
- 	case NAND_ECC_HW_SYNDROME:
-@@ -4246,10 +4295,8 @@ int nand_scan_tail(struct mtd_info *mtd)
- 		}
- 
- 		/* See nand_bch_init() for details. */
--		ecc->bytes = DIV_ROUND_UP(
--				ecc->strength * fls(8 * ecc->size), 8);
--		ecc->priv = nand_bch_init(mtd, ecc->size, ecc->bytes,
--					       &ecc->layout);
-+		ecc->bytes = 0;
-+		ecc->priv = nand_bch_init(mtd);
- 		if (!ecc->priv) {
- 			pr_warn("BCH ECC initialization failed!\n");
- 			BUG();
-@@ -4280,20 +4327,9 @@ int nand_scan_tail(struct mtd_info *mtd)
- 	if (!ecc->write_oob_raw)
- 		ecc->write_oob_raw = ecc->write_oob;
- 
--	/*
--	 * The number of bytes available for a client to place data into
--	 * the out of band area.
--	 */
--	ecc->layout->oobavail = 0;
--	for (i = 0; ecc->layout->oobfree[i].length
--			&& i < ARRAY_SIZE(ecc->layout->oobfree); i++)
--		ecc->layout->oobavail += ecc->layout->oobfree[i].length;
--	mtd->oobavail = ecc->layout->oobavail;
--
--	/* ECC sanity check: warn if it's too weak */
--	if (!nand_ecc_strength_good(mtd))
--		pr_warn("WARNING: %s: the ECC used on your system is too weak compared to the one required by the NAND chip\n",
--			mtd->name);
-+	/* propagate ecc info to mtd_info */
-+	mtd->ecc_strength = ecc->strength;
-+	mtd->ecc_step_size = ecc->size;
- 
- 	/*
- 	 * Set the number of read / write steps for one page depending on ECC
-@@ -4306,6 +4342,21 @@ int nand_scan_tail(struct mtd_info *mtd)
- 	}
- 	ecc->total = ecc->steps * ecc->bytes;
- 
-+	/*
-+	 * The number of bytes available for a client to place data into
-+	 * the out of band area.
-+	 */
-+	ret = mtd_ooblayout_count_freebytes(mtd);
-+	if (ret < 0)
-+		ret = 0;
-+
-+	mtd->oobavail = ret;
-+
-+	/* ECC sanity check: warn if it's too weak */
-+	if (!nand_ecc_strength_good(mtd))
-+		pr_warn("WARNING: %s: the ECC used on your system is too weak compared to the one required by the NAND chip\n",
-+			mtd->name);
-+
- 	/* Allow subpage writes up to ecc.steps. Not possible for MLC flash */
- 	if (!(chip->options & NAND_NO_SUBPAGE_WRITE) && nand_is_slc(chip)) {
- 		switch (ecc->steps) {
-@@ -4362,10 +4413,6 @@ int nand_scan_tail(struct mtd_info *mtd)
- 	mtd->_block_markbad = nand_block_markbad;
- 	mtd->writebufsize = mtd->writesize;
- 
--	/* propagate ecc info to mtd_info */
--	mtd->ecclayout = ecc->layout;
--	mtd->ecc_strength = ecc->strength;
--	mtd->ecc_step_size = ecc->size;
- 	/*
- 	 * Initialize bitflip_threshold to its default prior scan_bbt() call.
- 	 * scan_bbt() might invoke mtd_read(), thus bitflip_threshold must be
-@@ -4421,7 +4468,7 @@ EXPORT_SYMBOL(nand_scan);
-  */
- void nand_release(struct mtd_info *mtd)
- {
--	struct nand_chip *chip = mtd->priv;
-+	struct nand_chip *chip = mtd_to_nand(mtd);
- 
- 	if (chip->ecc.mode == NAND_ECC_SOFT_BCH)
- 		nand_bch_free((struct nand_bch_control *)chip->ecc.priv);
---- a/drivers/mtd/nand/nand_bbt.c
-+++ b/drivers/mtd/nand/nand_bbt.c
-@@ -172,7 +172,7 @@ static int read_bbt(struct mtd_info *mtd
- 		struct nand_bbt_descr *td, int offs)
- {
- 	int res, ret = 0, i, j, act = 0;
--	struct nand_chip *this = mtd->priv;
-+	struct nand_chip *this = mtd_to_nand(mtd);
- 	size_t retlen, len, totlen;
- 	loff_t from;
- 	int bits = td->options & NAND_BBT_NRBITS_MSK;
-@@ -263,7 +263,7 @@ static int read_bbt(struct mtd_info *mtd
-  */
- static int read_abs_bbt(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr *td, int chip)
- {
--	struct nand_chip *this = mtd->priv;
-+	struct nand_chip *this = mtd_to_nand(mtd);
- 	int res = 0, i;
- 
- 	if (td->options & NAND_BBT_PERCHIP) {
-@@ -388,7 +388,7 @@ static u32 bbt_get_ver_offs(struct mtd_i
- static void read_abs_bbts(struct mtd_info *mtd, uint8_t *buf,
- 			  struct nand_bbt_descr *td, struct nand_bbt_descr *md)
- {
--	struct nand_chip *this = mtd->priv;
-+	struct nand_chip *this = mtd_to_nand(mtd);
- 
- 	/* Read the primary version, if available */
- 	if (td->options & NAND_BBT_VERSION) {
-@@ -454,7 +454,7 @@ static int scan_block_fast(struct mtd_in
- static int create_bbt(struct mtd_info *mtd, uint8_t *buf,
- 	struct nand_bbt_descr *bd, int chip)
- {
--	struct nand_chip *this = mtd->priv;
-+	struct nand_chip *this = mtd_to_nand(mtd);
- 	int i, numblocks, numpages;
- 	int startblock;
- 	loff_t from;
-@@ -523,7 +523,7 @@ static int create_bbt(struct mtd_info *m
-  */
- static int search_bbt(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr *td)
- {
--	struct nand_chip *this = mtd->priv;
-+	struct nand_chip *this = mtd_to_nand(mtd);
- 	int i, chips;
- 	int startblock, block, dir;
- 	int scanlen = mtd->writesize + mtd->oobsize;
-@@ -618,7 +618,7 @@ static int write_bbt(struct mtd_info *mt
- 		     struct nand_bbt_descr *td, struct nand_bbt_descr *md,
- 		     int chipsel)
- {
--	struct nand_chip *this = mtd->priv;
-+	struct nand_chip *this = mtd_to_nand(mtd);
- 	struct erase_info einfo;
- 	int i, res, chip = 0;
- 	int bits, startblock, dir, page, offs, numblocks, sft, sftmsk;
-@@ -819,7 +819,7 @@ static int write_bbt(struct mtd_info *mt
-  */
- static inline int nand_memory_bbt(struct mtd_info *mtd, struct nand_bbt_descr *bd)
- {
--	struct nand_chip *this = mtd->priv;
-+	struct nand_chip *this = mtd_to_nand(mtd);
- 
- 	return create_bbt(mtd, this->buffers->databuf, bd, -1);
- }
-@@ -838,7 +838,7 @@ static inline int nand_memory_bbt(struct
- static int check_create(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr *bd)
- {
- 	int i, chips, writeops, create, chipsel, res, res2;
--	struct nand_chip *this = mtd->priv;
-+	struct nand_chip *this = mtd_to_nand(mtd);
- 	struct nand_bbt_descr *td = this->bbt_td;
- 	struct nand_bbt_descr *md = this->bbt_md;
- 	struct nand_bbt_descr *rd, *rd2;
-@@ -962,7 +962,7 @@ static int check_create(struct mtd_info
-  */
- static void mark_bbt_region(struct mtd_info *mtd, struct nand_bbt_descr *td)
- {
--	struct nand_chip *this = mtd->priv;
-+	struct nand_chip *this = mtd_to_nand(mtd);
- 	int i, j, chips, block, nrblocks, update;
- 	uint8_t oldval;
- 
-@@ -1022,7 +1022,7 @@ static void mark_bbt_region(struct mtd_i
-  */
- static void verify_bbt_descr(struct mtd_info *mtd, struct nand_bbt_descr *bd)
- {
--	struct nand_chip *this = mtd->priv;
-+	struct nand_chip *this = mtd_to_nand(mtd);
- 	u32 pattern_len;
- 	u32 bits;
- 	u32 table_size;
-@@ -1074,7 +1074,7 @@ static void verify_bbt_descr(struct mtd_
-  */
- static int nand_scan_bbt(struct mtd_info *mtd, struct nand_bbt_descr *bd)
- {
--	struct nand_chip *this = mtd->priv;
-+	struct nand_chip *this = mtd_to_nand(mtd);
- 	int len, res;
- 	uint8_t *buf;
- 	struct nand_bbt_descr *td = this->bbt_td;
-@@ -1147,7 +1147,7 @@ err:
-  */
- static int nand_update_bbt(struct mtd_info *mtd, loff_t offs)
- {
--	struct nand_chip *this = mtd->priv;
-+	struct nand_chip *this = mtd_to_nand(mtd);
- 	int len, res = 0;
- 	int chip, chipsel;
- 	uint8_t *buf;
-@@ -1281,7 +1281,7 @@ static int nand_create_badblock_pattern(
-  */
- int nand_default_bbt(struct mtd_info *mtd)
- {
--	struct nand_chip *this = mtd->priv;
-+	struct nand_chip *this = mtd_to_nand(mtd);
- 	int ret;
- 
- 	/* Is a flash based bad block table requested? */
-@@ -1317,7 +1317,7 @@ int nand_default_bbt(struct mtd_info *mt
-  */
- int nand_isreserved_bbt(struct mtd_info *mtd, loff_t offs)
- {
--	struct nand_chip *this = mtd->priv;
-+	struct nand_chip *this = mtd_to_nand(mtd);
- 	int block;
- 
- 	block = (int)(offs >> this->bbt_erase_shift);
-@@ -1332,7 +1332,7 @@ int nand_isreserved_bbt(struct mtd_info
-  */
- int nand_isbad_bbt(struct mtd_info *mtd, loff_t offs, int allowbbt)
- {
--	struct nand_chip *this = mtd->priv;
-+	struct nand_chip *this = mtd_to_nand(mtd);
- 	int block, res;
- 
- 	block = (int)(offs >> this->bbt_erase_shift);
-@@ -1359,7 +1359,7 @@ int nand_isbad_bbt(struct mtd_info *mtd,
-  */
- int nand_markbad_bbt(struct mtd_info *mtd, loff_t offs)
- {
--	struct nand_chip *this = mtd->priv;
-+	struct nand_chip *this = mtd_to_nand(mtd);
- 	int block, ret = 0;
- 
- 	block = (int)(offs >> this->bbt_erase_shift);
-@@ -1373,5 +1373,3 @@ int nand_markbad_bbt(struct mtd_info *mt
- 
- 	return ret;
- }
--
--EXPORT_SYMBOL(nand_scan_bbt);
---- a/drivers/mtd/nand/nand_bch.c
-+++ b/drivers/mtd/nand/nand_bch.c
-@@ -32,13 +32,11 @@
- /**
-  * struct nand_bch_control - private NAND BCH control structure
-  * @bch:       BCH control structure
-- * @ecclayout: private ecc layout for this BCH configuration
-  * @errloc:    error location array
-  * @eccmask:   XOR ecc mask, allows erased pages to be decoded as valid
-  */
- struct nand_bch_control {
- 	struct bch_control   *bch;
--	struct nand_ecclayout ecclayout;
- 	unsigned int         *errloc;
- 	unsigned char        *eccmask;
- };
-@@ -52,7 +50,7 @@ struct nand_bch_control {
- int nand_bch_calculate_ecc(struct mtd_info *mtd, const unsigned char *buf,
- 			   unsigned char *code)
- {
--	const struct nand_chip *chip = mtd->priv;
-+	const struct nand_chip *chip = mtd_to_nand(mtd);
- 	struct nand_bch_control *nbc = chip->ecc.priv;
- 	unsigned int i;
- 
-@@ -79,7 +77,7 @@ EXPORT_SYMBOL(nand_bch_calculate_ecc);
- int nand_bch_correct_data(struct mtd_info *mtd, unsigned char *buf,
- 			  unsigned char *read_ecc, unsigned char *calc_ecc)
- {
--	const struct nand_chip *chip = mtd->priv;
-+	const struct nand_chip *chip = mtd_to_nand(mtd);
- 	struct nand_bch_control *nbc = chip->ecc.priv;
- 	unsigned int *errloc = nbc->errloc;
- 	int i, count;
-@@ -98,7 +96,7 @@ int nand_bch_correct_data(struct mtd_inf
- 		}
- 	} else if (count < 0) {
- 		printk(KERN_ERR "ecc unrecoverable error\n");
--		count = -1;
-+		count = -EBADMSG;
- 	}
- 	return count;
- }
-@@ -107,9 +105,6 @@ EXPORT_SYMBOL(nand_bch_correct_data);
- /**
-  * nand_bch_init - [NAND Interface] Initialize NAND BCH error correction
-  * @mtd:	MTD block structure
-- * @eccsize:	ecc block size in bytes
-- * @eccbytes:	ecc length in bytes
-- * @ecclayout:	output default layout
-  *
-  * Returns:
-  *  a pointer to a new NAND BCH control structure, or NULL upon failure
-@@ -123,14 +118,20 @@ EXPORT_SYMBOL(nand_bch_correct_data);
-  * @eccsize = 512  (thus, m=13 is the smallest integer such that 2^m-1 > 512*8)
-  * @eccbytes = 7   (7 bytes are required to store m*t = 13*4 = 52 bits)
-  */
--struct nand_bch_control *
--nand_bch_init(struct mtd_info *mtd, unsigned int eccsize, unsigned int eccbytes,
--	      struct nand_ecclayout **ecclayout)
-+struct nand_bch_control *nand_bch_init(struct mtd_info *mtd)
- {
-+	struct nand_chip *nand = mtd_to_nand(mtd);
- 	unsigned int m, t, eccsteps, i;
--	struct nand_ecclayout *layout;
- 	struct nand_bch_control *nbc = NULL;
- 	unsigned char *erased_page;
-+	unsigned int eccsize = nand->ecc.size;
-+	unsigned int eccbytes = nand->ecc.bytes;
-+	unsigned int eccstrength = nand->ecc.strength;
-+
-+	if (!eccbytes && eccstrength) {
-+		eccbytes = DIV_ROUND_UP(eccstrength * fls(8 * eccsize), 8);
-+		nand->ecc.bytes = eccbytes;
-+	}
- 
- 	if (!eccsize || !eccbytes) {
- 		printk(KERN_WARNING "ecc parameters not supplied\n");
-@@ -158,7 +159,7 @@ nand_bch_init(struct mtd_info *mtd, unsi
- 	eccsteps = mtd->writesize/eccsize;
- 
- 	/* if no ecc placement scheme was provided, build one */
--	if (!*ecclayout) {
-+	if (!mtd->ooblayout) {
- 
- 		/* handle large page devices only */
- 		if (mtd->oobsize < 64) {
-@@ -167,24 +168,7 @@ nand_bch_init(struct mtd_info *mtd, unsi
- 			goto fail;
- 		}
- 
--		layout = &nbc->ecclayout;
--		layout->eccbytes = eccsteps*eccbytes;
--
--		/* reserve 2 bytes for bad block marker */
--		if (layout->eccbytes+2 > mtd->oobsize) {
--			printk(KERN_WARNING "no suitable oob scheme available "
--			       "for oobsize %d eccbytes %u\n", mtd->oobsize,
--			       eccbytes);
--			goto fail;
--		}
--		/* put ecc bytes at oob tail */
--		for (i = 0; i < layout->eccbytes; i++)
--			layout->eccpos[i] = mtd->oobsize-layout->eccbytes+i;
--
--		layout->oobfree[0].offset = 2;
--		layout->oobfree[0].length = mtd->oobsize-2-layout->eccbytes;
--
--		*ecclayout = layout;
-+		mtd_set_ooblayout(mtd, &nand_ooblayout_lp_ops);
- 	}
- 
- 	/* sanity checks */
-@@ -192,7 +176,8 @@ nand_bch_init(struct mtd_info *mtd, unsi
- 		printk(KERN_WARNING "eccsize %u is too large\n", eccsize);
- 		goto fail;
- 	}
--	if ((*ecclayout)->eccbytes != (eccsteps*eccbytes)) {
-+
-+	if (mtd_ooblayout_count_eccbytes(mtd) != (eccsteps*eccbytes)) {
- 		printk(KERN_WARNING "invalid ecc layout\n");
- 		goto fail;
- 	}
-@@ -216,6 +201,9 @@ nand_bch_init(struct mtd_info *mtd, unsi
- 	for (i = 0; i < eccbytes; i++)
- 		nbc->eccmask[i] ^= 0xff;
- 
-+	if (!eccstrength)
-+		nand->ecc.strength = (eccbytes * 8) / fls(8 * eccsize);
-+
- 	return nbc;
- fail:
- 	nand_bch_free(nbc);
---- a/drivers/mtd/nand/nand_ecc.c
-+++ b/drivers/mtd/nand/nand_ecc.c
-@@ -424,7 +424,7 @@ int nand_calculate_ecc(struct mtd_info *
- 		       unsigned char *code)
- {
- 	__nand_calculate_ecc(buf,
--			((struct nand_chip *)mtd->priv)->ecc.size, code);
-+			mtd_to_nand(mtd)->ecc.size, code);
- 
- 	return 0;
- }
-@@ -524,7 +524,7 @@ int nand_correct_data(struct mtd_info *m
- 		      unsigned char *read_ecc, unsigned char *calc_ecc)
- {
- 	return __nand_correct_data(buf, read_ecc, calc_ecc,
--				   ((struct nand_chip *)mtd->priv)->ecc.size);
-+				   mtd_to_nand(mtd)->ecc.size);
- }
- EXPORT_SYMBOL(nand_correct_data);
- 
---- a/drivers/mtd/nand/nand_ids.c
-+++ b/drivers/mtd/nand/nand_ids.c
-@@ -50,8 +50,8 @@ struct nand_flash_dev nand_flash_ids[] =
- 		  SZ_16K, SZ_8K, SZ_4M, 0, 6, 1280, NAND_ECC_INFO(40, SZ_1K) },
- 	{"H27UCG8T2ATR-BC 64G 3.3V 8-bit",
- 		{ .id = {0xad, 0xde, 0x94, 0xda, 0x74, 0xc4} },
--		  SZ_8K, SZ_8K, SZ_2M, 0, 6, 640, NAND_ECC_INFO(40, SZ_1K),
--		  4 },
-+		  SZ_8K, SZ_8K, SZ_2M, NAND_NEED_SCRAMBLING, 6, 640,
-+		  NAND_ECC_INFO(40, SZ_1K), 4 },
- 
- 	LEGACY_ID_NAND("NAND 4MiB 5V 8-bit",   0x6B, 4, SZ_8K, SP_OPTIONS),
- 	LEGACY_ID_NAND("NAND 4MiB 3,3V 8-bit", 0xE3, 4, SZ_8K, SP_OPTIONS),
---- a/drivers/mtd/nand/nandsim.c
-+++ b/drivers/mtd/nand/nandsim.c
-@@ -666,8 +666,8 @@ static char *get_partition_name(int i)
-  */
- static int init_nandsim(struct mtd_info *mtd)
- {
--	struct nand_chip *chip = mtd->priv;
--	struct nandsim   *ns   = chip->priv;
-+	struct nand_chip *chip = mtd_to_nand(mtd);
-+	struct nandsim   *ns   = nand_get_controller_data(chip);
- 	int i, ret = 0;
- 	uint64_t remains;
- 	uint64_t next_offset;
-@@ -1908,7 +1908,8 @@ static void switch_state(struct nandsim
- 
- static u_char ns_nand_read_byte(struct mtd_info *mtd)
- {
--	struct nandsim *ns = ((struct nand_chip *)mtd->priv)->priv;
-+	struct nand_chip *chip = mtd_to_nand(mtd);
-+	struct nandsim *ns = nand_get_controller_data(chip);
- 	u_char outb = 0x00;
- 
- 	/* Sanity and correctness checks */
-@@ -1969,7 +1970,8 @@ static u_char ns_nand_read_byte(struct m
- 
- static void ns_nand_write_byte(struct mtd_info *mtd, u_char byte)
- {
--	struct nandsim *ns = ((struct nand_chip *)mtd->priv)->priv;
-+	struct nand_chip *chip = mtd_to_nand(mtd);
-+	struct nandsim *ns = nand_get_controller_data(chip);
- 
- 	/* Sanity and correctness checks */
- 	if (!ns->lines.ce) {
-@@ -2123,7 +2125,8 @@ static void ns_nand_write_byte(struct mt
- 
- static void ns_hwcontrol(struct mtd_info *mtd, int cmd, unsigned int bitmask)
- {
--	struct nandsim *ns = ((struct nand_chip *)mtd->priv)->priv;
-+	struct nand_chip *chip = mtd_to_nand(mtd);
-+	struct nandsim *ns = nand_get_controller_data(chip);
- 
- 	ns->lines.cle = bitmask & NAND_CLE ? 1 : 0;
- 	ns->lines.ale = bitmask & NAND_ALE ? 1 : 0;
-@@ -2141,7 +2144,7 @@ static int ns_device_ready(struct mtd_in
- 
- static uint16_t ns_nand_read_word(struct mtd_info *mtd)
- {
--	struct nand_chip *chip = (struct nand_chip *)mtd->priv;
-+	struct nand_chip *chip = mtd_to_nand(mtd);
- 
- 	NS_DBG("read_word\n");
- 
-@@ -2150,7 +2153,8 @@ static uint16_t ns_nand_read_word(struct
- 
- static void ns_nand_write_buf(struct mtd_info *mtd, const u_char *buf, int len)
- {
--	struct nandsim *ns = ((struct nand_chip *)mtd->priv)->priv;
-+	struct nand_chip *chip = mtd_to_nand(mtd);
-+	struct nandsim *ns = nand_get_controller_data(chip);
- 
- 	/* Check that chip is expecting data input */
- 	if (!(ns->state & STATE_DATAIN_MASK)) {
-@@ -2177,7 +2181,8 @@ static void ns_nand_write_buf(struct mtd
- 
- static void ns_nand_read_buf(struct mtd_info *mtd, u_char *buf, int len)
- {
--	struct nandsim *ns = ((struct nand_chip *)mtd->priv)->priv;
-+	struct nand_chip *chip = mtd_to_nand(mtd);
-+	struct nandsim *ns = nand_get_controller_data(chip);
- 
- 	/* Sanity and correctness checks */
- 	if (!ns->lines.ce) {
-@@ -2198,7 +2203,7 @@ static void ns_nand_read_buf(struct mtd_
- 		int i;
- 
- 		for (i = 0; i < len; i++)
--			buf[i] = ((struct nand_chip *)mtd->priv)->read_byte(mtd);
-+			buf[i] = mtd_to_nand(mtd)->read_byte(mtd);
- 
- 		return;
- 	}
-@@ -2236,16 +2241,15 @@ static int __init ns_init_module(void)
- 	}
- 
- 	/* Allocate and initialize mtd_info, nand_chip and nandsim structures */
--	nsmtd = kzalloc(sizeof(struct mtd_info) + sizeof(struct nand_chip)
--				+ sizeof(struct nandsim), GFP_KERNEL);
--	if (!nsmtd) {
-+	chip = kzalloc(sizeof(struct nand_chip) + sizeof(struct nandsim),
-+		       GFP_KERNEL);
-+	if (!chip) {
- 		NS_ERR("unable to allocate core structures.\n");
- 		return -ENOMEM;
- 	}
--	chip        = (struct nand_chip *)(nsmtd + 1);
--        nsmtd->priv = (void *)chip;
-+	nsmtd       = nand_to_mtd(chip);
- 	nand        = (struct nandsim *)(chip + 1);
--	chip->priv  = (void *)nand;
-+	nand_set_controller_data(chip, (void *)nand);
- 
- 	/*
- 	 * Register simulator's callbacks.
-@@ -2257,6 +2261,7 @@ static int __init ns_init_module(void)
- 	chip->read_buf   = ns_nand_read_buf;
- 	chip->read_word  = ns_nand_read_word;
- 	chip->ecc.mode   = NAND_ECC_SOFT;
-+	chip->ecc.algo   = NAND_ECC_HAMMING;
- 	/* The NAND_SKIP_BBTSCAN option is necessary for 'overridesize' */
- 	/* and 'badblocks' parameters to work */
- 	chip->options   |= NAND_SKIP_BBTSCAN;
-@@ -2335,6 +2340,7 @@ static int __init ns_init_module(void)
- 			goto error;
- 		}
- 		chip->ecc.mode = NAND_ECC_SOFT_BCH;
-+		chip->ecc.algo = NAND_ECC_BCH;
- 		chip->ecc.size = 512;
- 		chip->ecc.strength = bch;
- 		chip->ecc.bytes = eccbytes;
-@@ -2392,7 +2398,7 @@ err_exit:
- 	for (i = 0;i < ARRAY_SIZE(nand->partitions); ++i)
- 		kfree(nand->partitions[i].name);
- error:
--	kfree(nsmtd);
-+	kfree(chip);
- 	free_lists();
- 
- 	return retval;
-@@ -2405,7 +2411,8 @@ module_init(ns_init_module);
-  */
- static void __exit ns_cleanup_module(void)
- {
--	struct nandsim *ns = ((struct nand_chip *)nsmtd->priv)->priv;
-+	struct nand_chip *chip = mtd_to_nand(nsmtd);
-+	struct nandsim *ns = nand_get_controller_data(chip);
- 	int i;
- 
- 	nandsim_debugfs_remove(ns);
-@@ -2413,7 +2420,7 @@ static void __exit ns_cleanup_module(voi
- 	nand_release(nsmtd); /* Unregister driver */
- 	for (i = 0;i < ARRAY_SIZE(ns->partitions); ++i)
- 		kfree(ns->partitions[i].name);
--	kfree(nsmtd);        /* Free other structures */
-+	kfree(mtd_to_nand(nsmtd));        /* Free other structures */
- 	free_lists();
- }
- 
---- a/drivers/mtd/ofpart.c
-+++ b/drivers/mtd/ofpart.c
-@@ -26,9 +26,10 @@ static bool node_has_compatible(struct d
- }
- 
- static int parse_ofpart_partitions(struct mtd_info *master,
--				   struct mtd_partition **pparts,
-+				   const struct mtd_partition **pparts,
- 				   struct mtd_part_parser_data *data)
- {
-+	struct mtd_partition *parts;
- 	struct device_node *mtd_node;
- 	struct device_node *ofpart_node;
- 	const char *partname;
-@@ -37,10 +38,8 @@ static int parse_ofpart_partitions(struc
- 	bool dedicated = true;
- 
- 
--	if (!data)
--		return 0;
--
--	mtd_node = data->of_node;
-+	/* Pull of_node from the master device node */
-+	mtd_node = mtd_get_of_node(master);
- 	if (!mtd_node)
- 		return 0;
- 
-@@ -72,8 +71,8 @@ static int parse_ofpart_partitions(struc
- 	if (nr_parts == 0)
- 		return 0;
- 
--	*pparts = kzalloc(nr_parts * sizeof(**pparts), GFP_KERNEL);
--	if (!*pparts)
-+	parts = kzalloc(nr_parts * sizeof(*parts), GFP_KERNEL);
-+	if (!parts)
- 		return -ENOMEM;
- 
- 	i = 0;
-@@ -107,19 +106,19 @@ static int parse_ofpart_partitions(struc
- 			goto ofpart_fail;
- 		}
- 
--		(*pparts)[i].offset = of_read_number(reg, a_cells);
--		(*pparts)[i].size = of_read_number(reg + a_cells, s_cells);
-+		parts[i].offset = of_read_number(reg, a_cells);
-+		parts[i].size = of_read_number(reg + a_cells, s_cells);
- 
- 		partname = of_get_property(pp, "label", &len);
- 		if (!partname)
- 			partname = of_get_property(pp, "name", &len);
--		(*pparts)[i].name = partname;
-+		parts[i].name = partname;
- 
- 		if (of_get_property(pp, "read-only", &len))
--			(*pparts)[i].mask_flags |= MTD_WRITEABLE;
-+			parts[i].mask_flags |= MTD_WRITEABLE;
- 
- 		if (of_get_property(pp, "lock", &len))
--			(*pparts)[i].mask_flags |= MTD_POWERUP_LOCK;
-+			parts[i].mask_flags |= MTD_POWERUP_LOCK;
- 
- 		i++;
- 	}
-@@ -127,6 +126,7 @@ static int parse_ofpart_partitions(struc
- 	if (!nr_parts)
- 		goto ofpart_none;
- 
-+	*pparts = parts;
- 	return nr_parts;
- 
- ofpart_fail:
-@@ -135,21 +135,20 @@ ofpart_fail:
- 	ret = -EINVAL;
- ofpart_none:
- 	of_node_put(pp);
--	kfree(*pparts);
--	*pparts = NULL;
-+	kfree(parts);
- 	return ret;
- }
- 
- static struct mtd_part_parser ofpart_parser = {
--	.owner = THIS_MODULE,
- 	.parse_fn = parse_ofpart_partitions,
- 	.name = "ofpart",
- };
- 
- static int parse_ofoldpart_partitions(struct mtd_info *master,
--				      struct mtd_partition **pparts,
-+				      const struct mtd_partition **pparts,
- 				      struct mtd_part_parser_data *data)
- {
-+	struct mtd_partition *parts;
- 	struct device_node *dp;
- 	int i, plen, nr_parts;
- 	const struct {
-@@ -157,10 +156,8 @@ static int parse_ofoldpart_partitions(st
- 	} *part;
- 	const char *names;
- 
--	if (!data)
--		return 0;
--
--	dp = data->of_node;
-+	/* Pull of_node from the master device node */
-+	dp = mtd_get_of_node(master);
- 	if (!dp)
- 		return 0;
- 
-@@ -173,37 +170,37 @@ static int parse_ofoldpart_partitions(st
- 
- 	nr_parts = plen / sizeof(part[0]);
- 
--	*pparts = kzalloc(nr_parts * sizeof(*(*pparts)), GFP_KERNEL);
--	if (!*pparts)
-+	parts = kzalloc(nr_parts * sizeof(*parts), GFP_KERNEL);
-+	if (!parts)
- 		return -ENOMEM;
- 
- 	names = of_get_property(dp, "partition-names", &plen);
- 
- 	for (i = 0; i < nr_parts; i++) {
--		(*pparts)[i].offset = be32_to_cpu(part->offset);
--		(*pparts)[i].size   = be32_to_cpu(part->len) & ~1;
-+		parts[i].offset = be32_to_cpu(part->offset);
-+		parts[i].size   = be32_to_cpu(part->len) & ~1;
- 		/* bit 0 set signifies read only partition */
- 		if (be32_to_cpu(part->len) & 1)
--			(*pparts)[i].mask_flags = MTD_WRITEABLE;
-+			parts[i].mask_flags = MTD_WRITEABLE;
- 
- 		if (names && (plen > 0)) {
- 			int len = strlen(names) + 1;
- 
--			(*pparts)[i].name = names;
-+			parts[i].name = names;
- 			plen -= len;
- 			names += len;
- 		} else {
--			(*pparts)[i].name = "unnamed";
-+			parts[i].name = "unnamed";
- 		}
- 
- 		part++;
- 	}
- 
-+	*pparts = parts;
- 	return nr_parts;
- }
- 
- static struct mtd_part_parser ofoldpart_parser = {
--	.owner = THIS_MODULE,
- 	.parse_fn = parse_ofoldpart_partitions,
- 	.name = "ofoldpart",
- };
---- a/drivers/mtd/spi-nor/Kconfig
-+++ b/drivers/mtd/spi-nor/Kconfig
-@@ -7,6 +7,14 @@ menuconfig MTD_SPI_NOR
- 
- if MTD_SPI_NOR
- 
-+config MTD_MT81xx_NOR
-+	tristate "Mediatek MT81xx SPI NOR flash controller"
-+	depends on HAS_IOMEM
-+	help
-+	  This enables access to SPI NOR flash, using MT81xx SPI NOR flash
-+	  controller. This controller does not support generic SPI BUS, it only
-+	  supports SPI NOR Flash.
-+
- config MTD_SPI_NOR_USE_4K_SECTORS
- 	bool "Use small 4096 B erase sectors"
- 	default y
-@@ -23,7 +31,7 @@ config MTD_SPI_NOR_USE_4K_SECTORS
- 
- config SPI_FSL_QUADSPI
- 	tristate "Freescale Quad SPI controller"
--	depends on ARCH_MXC || COMPILE_TEST
-+	depends on ARCH_MXC || SOC_LS1021A || ARCH_LAYERSCAPE || COMPILE_TEST
- 	depends on HAS_IOMEM
- 	help
- 	  This enables support for the Quad SPI controller in master mode.
---- a/drivers/mtd/spi-nor/Makefile
-+++ b/drivers/mtd/spi-nor/Makefile
-@@ -1,3 +1,4 @@
- obj-$(CONFIG_MTD_SPI_NOR)	+= spi-nor.o
- obj-$(CONFIG_SPI_FSL_QUADSPI)	+= fsl-quadspi.o
-+obj-$(CONFIG_MTD_MT81xx_NOR)    += mtk-quadspi.o
- obj-$(CONFIG_SPI_NXP_SPIFI)	+= nxp-spifi.o
---- /dev/null
-+++ b/drivers/mtd/spi-nor/mtk-quadspi.c
-@@ -0,0 +1,485 @@
-+/*
-+ * Copyright (c) 2015 MediaTek Inc.
-+ * Author: Bayi Cheng <bayi.cheng at mediatek.com>
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 as
-+ * published by the Free Software Foundation.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ */
-+
-+#include <linux/clk.h>
-+#include <linux/delay.h>
-+#include <linux/device.h>
-+#include <linux/init.h>
-+#include <linux/io.h>
-+#include <linux/iopoll.h>
-+#include <linux/ioport.h>
-+#include <linux/math64.h>
-+#include <linux/module.h>
-+#include <linux/mtd/mtd.h>
-+#include <linux/mutex.h>
-+#include <linux/of.h>
-+#include <linux/of_device.h>
-+#include <linux/pinctrl/consumer.h>
-+#include <linux/platform_device.h>
-+#include <linux/slab.h>
-+#include <linux/mtd/mtd.h>
-+#include <linux/mtd/partitions.h>
-+#include <linux/mtd/spi-nor.h>
-+
-+#define MTK_NOR_CMD_REG			0x00
-+#define MTK_NOR_CNT_REG			0x04
-+#define MTK_NOR_RDSR_REG		0x08
-+#define MTK_NOR_RDATA_REG		0x0c
-+#define MTK_NOR_RADR0_REG		0x10
-+#define MTK_NOR_RADR1_REG		0x14
-+#define MTK_NOR_RADR2_REG		0x18
-+#define MTK_NOR_WDATA_REG		0x1c
-+#define MTK_NOR_PRGDATA0_REG		0x20
-+#define MTK_NOR_PRGDATA1_REG		0x24
-+#define MTK_NOR_PRGDATA2_REG		0x28
-+#define MTK_NOR_PRGDATA3_REG		0x2c
-+#define MTK_NOR_PRGDATA4_REG		0x30
-+#define MTK_NOR_PRGDATA5_REG		0x34
-+#define MTK_NOR_SHREG0_REG		0x38
-+#define MTK_NOR_SHREG1_REG		0x3c
-+#define MTK_NOR_SHREG2_REG		0x40
-+#define MTK_NOR_SHREG3_REG		0x44
-+#define MTK_NOR_SHREG4_REG		0x48
-+#define MTK_NOR_SHREG5_REG		0x4c
-+#define MTK_NOR_SHREG6_REG		0x50
-+#define MTK_NOR_SHREG7_REG		0x54
-+#define MTK_NOR_SHREG8_REG		0x58
-+#define MTK_NOR_SHREG9_REG		0x5c
-+#define MTK_NOR_CFG1_REG		0x60
-+#define MTK_NOR_CFG2_REG		0x64
-+#define MTK_NOR_CFG3_REG		0x68
-+#define MTK_NOR_STATUS0_REG		0x70
-+#define MTK_NOR_STATUS1_REG		0x74
-+#define MTK_NOR_STATUS2_REG		0x78
-+#define MTK_NOR_STATUS3_REG		0x7c
-+#define MTK_NOR_FLHCFG_REG		0x84
-+#define MTK_NOR_TIME_REG		0x94
-+#define MTK_NOR_PP_DATA_REG		0x98
-+#define MTK_NOR_PREBUF_STUS_REG		0x9c
-+#define MTK_NOR_DELSEL0_REG		0xa0
-+#define MTK_NOR_DELSEL1_REG		0xa4
-+#define MTK_NOR_INTRSTUS_REG		0xa8
-+#define MTK_NOR_INTREN_REG		0xac
-+#define MTK_NOR_CHKSUM_CTL_REG		0xb8
-+#define MTK_NOR_CHKSUM_REG		0xbc
-+#define MTK_NOR_CMD2_REG		0xc0
-+#define MTK_NOR_WRPROT_REG		0xc4
-+#define MTK_NOR_RADR3_REG		0xc8
-+#define MTK_NOR_DUAL_REG		0xcc
-+#define MTK_NOR_DELSEL2_REG		0xd0
-+#define MTK_NOR_DELSEL3_REG		0xd4
-+#define MTK_NOR_DELSEL4_REG		0xd8
-+
-+/* commands for mtk nor controller */
-+#define MTK_NOR_READ_CMD		0x0
-+#define MTK_NOR_RDSR_CMD		0x2
-+#define MTK_NOR_PRG_CMD			0x4
-+#define MTK_NOR_WR_CMD			0x10
-+#define MTK_NOR_PIO_WR_CMD		0x90
-+#define MTK_NOR_WRSR_CMD		0x20
-+#define MTK_NOR_PIO_READ_CMD		0x81
-+#define MTK_NOR_WR_BUF_ENABLE		0x1
-+#define MTK_NOR_WR_BUF_DISABLE		0x0
-+#define MTK_NOR_ENABLE_SF_CMD		0x30
-+#define MTK_NOR_DUAD_ADDR_EN		0x8
-+#define MTK_NOR_QUAD_READ_EN		0x4
-+#define MTK_NOR_DUAL_ADDR_EN		0x2
-+#define MTK_NOR_DUAL_READ_EN		0x1
-+#define MTK_NOR_DUAL_DISABLE		0x0
-+#define MTK_NOR_FAST_READ		0x1
-+
-+#define SFLASH_WRBUF_SIZE		128
-+
-+/* Can shift up to 48 bits (6 bytes) of TX/RX */
-+#define MTK_NOR_MAX_RX_TX_SHIFT		6
-+/* can shift up to 56 bits (7 bytes) transfer by MTK_NOR_PRG_CMD */
-+#define MTK_NOR_MAX_SHIFT		7
-+
-+/* Helpers for accessing the program data / shift data registers */
-+#define MTK_NOR_PRG_REG(n)		(MTK_NOR_PRGDATA0_REG + 4 * (n))
-+#define MTK_NOR_SHREG(n)		(MTK_NOR_SHREG0_REG + 4 * (n))
-+
-+struct mt8173_nor {
-+	struct spi_nor nor;
-+	struct device *dev;
-+	void __iomem *base;	/* nor flash base address */
-+	struct clk *spi_clk;
-+	struct clk *nor_clk;
-+};
-+
-+static void mt8173_nor_set_read_mode(struct mt8173_nor *mt8173_nor)
-+{
-+	struct spi_nor *nor = &mt8173_nor->nor;
-+
-+	switch (nor->flash_read) {
-+	case SPI_NOR_FAST:
-+		writeb(nor->read_opcode, mt8173_nor->base +
-+		       MTK_NOR_PRGDATA3_REG);
-+		writeb(MTK_NOR_FAST_READ, mt8173_nor->base +
-+		       MTK_NOR_CFG1_REG);
-+		break;
-+	case SPI_NOR_DUAL:
-+		writeb(nor->read_opcode, mt8173_nor->base +
-+		       MTK_NOR_PRGDATA3_REG);
-+		writeb(MTK_NOR_DUAL_READ_EN, mt8173_nor->base +
-+		       MTK_NOR_DUAL_REG);
-+		break;
-+	case SPI_NOR_QUAD:
-+		writeb(nor->read_opcode, mt8173_nor->base +
-+		       MTK_NOR_PRGDATA4_REG);
-+		writeb(MTK_NOR_QUAD_READ_EN, mt8173_nor->base +
-+		       MTK_NOR_DUAL_REG);
-+		break;
-+	default:
-+		writeb(MTK_NOR_DUAL_DISABLE, mt8173_nor->base +
-+		       MTK_NOR_DUAL_REG);
-+		break;
-+	}
-+}
-+
-+static int mt8173_nor_execute_cmd(struct mt8173_nor *mt8173_nor, u8 cmdval)
-+{
-+	int reg;
-+	u8 val = cmdval & 0x1f;
-+
-+	writeb(cmdval, mt8173_nor->base + MTK_NOR_CMD_REG);
-+	return readl_poll_timeout(mt8173_nor->base + MTK_NOR_CMD_REG, reg,
-+				  !(reg & val), 100, 10000);
-+}
-+
-+static int mt8173_nor_do_tx_rx(struct mt8173_nor *mt8173_nor, u8 op,
-+			       u8 *tx, int txlen, u8 *rx, int rxlen)
-+{
-+	int len = 1 + txlen + rxlen;
-+	int i, ret, idx;
-+
-+	if (len > MTK_NOR_MAX_SHIFT)
-+		return -EINVAL;
-+
-+	writeb(len * 8, mt8173_nor->base + MTK_NOR_CNT_REG);
-+
-+	/* start at PRGDATA5, go down to PRGDATA0 */
-+	idx = MTK_NOR_MAX_RX_TX_SHIFT - 1;
-+
-+	/* opcode */
-+	writeb(op, mt8173_nor->base + MTK_NOR_PRG_REG(idx));
-+	idx--;
-+
-+	/* program TX data */
-+	for (i = 0; i < txlen; i++, idx--)
-+		writeb(tx[i], mt8173_nor->base + MTK_NOR_PRG_REG(idx));
-+
-+	/* clear out rest of TX registers */
-+	while (idx >= 0) {
-+		writeb(0, mt8173_nor->base + MTK_NOR_PRG_REG(idx));
-+		idx--;
-+	}
-+
-+	ret = mt8173_nor_execute_cmd(mt8173_nor, MTK_NOR_PRG_CMD);
-+	if (ret)
-+		return ret;
-+
-+	/* restart at first RX byte */
-+	idx = rxlen - 1;
-+
-+	/* read out RX data */
-+	for (i = 0; i < rxlen; i++, idx--)
-+		rx[i] = readb(mt8173_nor->base + MTK_NOR_SHREG(idx));
-+
-+	return 0;
-+}
-+
-+/* Do a WRSR (Write Status Register) command */
-+static int mt8173_nor_wr_sr(struct mt8173_nor *mt8173_nor, u8 sr)
-+{
-+	writeb(sr, mt8173_nor->base + MTK_NOR_PRGDATA5_REG);
-+	writeb(8, mt8173_nor->base + MTK_NOR_CNT_REG);
-+	return mt8173_nor_execute_cmd(mt8173_nor, MTK_NOR_WRSR_CMD);
-+}
-+
-+static int mt8173_nor_write_buffer_enable(struct mt8173_nor *mt8173_nor)
-+{
-+	u8 reg;
-+
-+	/* the bit0 of MTK_NOR_CFG2_REG is pre-fetch buffer
-+	 * 0: pre-fetch buffer use for read
-+	 * 1: pre-fetch buffer use for page program
-+	 */
-+	writel(MTK_NOR_WR_BUF_ENABLE, mt8173_nor->base + MTK_NOR_CFG2_REG);
-+	return readb_poll_timeout(mt8173_nor->base + MTK_NOR_CFG2_REG, reg,
-+				  0x01 == (reg & 0x01), 100, 10000);
-+}
-+
-+static int mt8173_nor_write_buffer_disable(struct mt8173_nor *mt8173_nor)
-+{
-+	u8 reg;
-+
-+	writel(MTK_NOR_WR_BUF_DISABLE, mt8173_nor->base + MTK_NOR_CFG2_REG);
-+	return readb_poll_timeout(mt8173_nor->base + MTK_NOR_CFG2_REG, reg,
-+				  MTK_NOR_WR_BUF_DISABLE == (reg & 0x1), 100,
-+				  10000);
-+}
-+
-+static void mt8173_nor_set_addr(struct mt8173_nor *mt8173_nor, u32 addr)
-+{
-+	int i;
-+
-+	for (i = 0; i < 3; i++) {
-+		writeb(addr & 0xff, mt8173_nor->base + MTK_NOR_RADR0_REG + i * 4);
-+		addr >>= 8;
-+	}
-+	/* Last register is non-contiguous */
-+	writeb(addr & 0xff, mt8173_nor->base + MTK_NOR_RADR3_REG);
-+}
-+
-+static int mt8173_nor_read(struct spi_nor *nor, loff_t from, size_t length,
-+			   size_t *retlen, u_char *buffer)
-+{
-+	int i, ret;
-+	int addr = (int)from;
-+	u8 *buf = (u8 *)buffer;
-+	struct mt8173_nor *mt8173_nor = nor->priv;
-+
-+	/* set mode for fast read mode ,dual mode or quad mode */
-+	mt8173_nor_set_read_mode(mt8173_nor);
-+	mt8173_nor_set_addr(mt8173_nor, addr);
-+
-+	for (i = 0; i < length; i++, (*retlen)++) {
-+		ret = mt8173_nor_execute_cmd(mt8173_nor, MTK_NOR_PIO_READ_CMD);
-+		if (ret < 0)
-+			return ret;
-+		buf[i] = readb(mt8173_nor->base + MTK_NOR_RDATA_REG);
-+	}
-+	return 0;
-+}
-+
-+static int mt8173_nor_write_single_byte(struct mt8173_nor *mt8173_nor,
-+					int addr, int length, u8 *data)
-+{
-+	int i, ret;
-+
-+	mt8173_nor_set_addr(mt8173_nor, addr);
-+
-+	for (i = 0; i < length; i++) {
-+		writeb(*data++, mt8173_nor->base + MTK_NOR_WDATA_REG);
-+		ret = mt8173_nor_execute_cmd(mt8173_nor, MTK_NOR_PIO_WR_CMD);
-+		if (ret < 0)
-+			return ret;
-+	}
-+	return 0;
-+}
-+
-+static int mt8173_nor_write_buffer(struct mt8173_nor *mt8173_nor, int addr,
-+				   const u8 *buf)
-+{
-+	int i, bufidx, data;
-+
-+	mt8173_nor_set_addr(mt8173_nor, addr);
-+
-+	bufidx = 0;
-+	for (i = 0; i < SFLASH_WRBUF_SIZE; i += 4) {
-+		data = buf[bufidx + 3]<<24 | buf[bufidx + 2]<<16 |
-+		       buf[bufidx + 1]<<8 | buf[bufidx];
-+		bufidx += 4;
-+		writel(data, mt8173_nor->base + MTK_NOR_PP_DATA_REG);
-+	}
-+	return mt8173_nor_execute_cmd(mt8173_nor, MTK_NOR_WR_CMD);
-+}
-+
-+static void mt8173_nor_write(struct spi_nor *nor, loff_t to, size_t len,
-+			     size_t *retlen, const u_char *buf)
-+{
-+	int ret;
-+	struct mt8173_nor *mt8173_nor = nor->priv;
-+
-+	ret = mt8173_nor_write_buffer_enable(mt8173_nor);
-+	if (ret < 0)
-+		dev_warn(mt8173_nor->dev, "write buffer enable failed!\n");
-+
-+	while (len >= SFLASH_WRBUF_SIZE) {
-+		ret = mt8173_nor_write_buffer(mt8173_nor, to, buf);
-+		if (ret < 0)
-+			dev_err(mt8173_nor->dev, "write buffer failed!\n");
-+		len -= SFLASH_WRBUF_SIZE;
-+		to += SFLASH_WRBUF_SIZE;
-+		buf += SFLASH_WRBUF_SIZE;
-+		(*retlen) += SFLASH_WRBUF_SIZE;
-+	}
-+	ret = mt8173_nor_write_buffer_disable(mt8173_nor);
-+	if (ret < 0)
-+		dev_warn(mt8173_nor->dev, "write buffer disable failed!\n");
-+
-+	if (len) {
-+		ret = mt8173_nor_write_single_byte(mt8173_nor, to, (int)len,
-+						   (u8 *)buf);
-+		if (ret < 0)
-+			dev_err(mt8173_nor->dev, "write single byte failed!\n");
-+		(*retlen) += len;
-+	}
-+}
-+
-+static int mt8173_nor_read_reg(struct spi_nor *nor, u8 opcode, u8 *buf, int len)
-+{
-+	int ret;
-+	struct mt8173_nor *mt8173_nor = nor->priv;
-+
-+	switch (opcode) {
-+	case SPINOR_OP_RDSR:
-+		ret = mt8173_nor_execute_cmd(mt8173_nor, MTK_NOR_RDSR_CMD);
-+		if (ret < 0)
-+			return ret;
-+		if (len == 1)
-+			*buf = readb(mt8173_nor->base + MTK_NOR_RDSR_REG);
-+		else
-+			dev_err(mt8173_nor->dev, "len should be 1 for read status!\n");
-+		break;
-+	default:
-+		ret = mt8173_nor_do_tx_rx(mt8173_nor, opcode, NULL, 0, buf, len);
-+		break;
-+	}
-+	return ret;
-+}
-+
-+static int mt8173_nor_write_reg(struct spi_nor *nor, u8 opcode, u8 *buf,
-+				int len)
-+{
-+	int ret;
-+	struct mt8173_nor *mt8173_nor = nor->priv;
-+
-+	switch (opcode) {
-+	case SPINOR_OP_WRSR:
-+		/* We only handle 1 byte */
-+		ret = mt8173_nor_wr_sr(mt8173_nor, *buf);
-+		break;
-+	default:
-+		ret = mt8173_nor_do_tx_rx(mt8173_nor, opcode, buf, len, NULL, 0);
-+		if (ret)
-+			dev_warn(mt8173_nor->dev, "write reg failure!\n");
-+		break;
-+	}
-+	return ret;
-+}
-+
-+static int mtk_nor_init(struct mt8173_nor *mt8173_nor,
-+			struct device_node *flash_node)
-+{
-+	int ret;
-+	struct spi_nor *nor;
-+
-+	/* initialize controller to accept commands */
-+	writel(MTK_NOR_ENABLE_SF_CMD, mt8173_nor->base + MTK_NOR_WRPROT_REG);
-+
-+	nor = &mt8173_nor->nor;
-+	nor->dev = mt8173_nor->dev;
-+	nor->priv = mt8173_nor;
-+	spi_nor_set_flash_node(nor, flash_node);
-+
-+	/* fill the hooks to spi nor */
-+	nor->read = mt8173_nor_read;
-+	nor->read_reg = mt8173_nor_read_reg;
-+	nor->write = mt8173_nor_write;
-+	nor->write_reg = mt8173_nor_write_reg;
-+	nor->mtd.name = "mtk_nor";
-+	/* initialized with NULL */
-+	ret = spi_nor_scan(nor, NULL, SPI_NOR_DUAL);
-+	if (ret)
-+		return ret;
-+
-+	return mtd_device_register(&nor->mtd, NULL, 0);
-+}
-+
-+static int mtk_nor_drv_probe(struct platform_device *pdev)
-+{
-+	struct device_node *flash_np;
-+	struct resource *res;
-+	int ret;
-+	struct mt8173_nor *mt8173_nor;
-+
-+	if (!pdev->dev.of_node) {
-+		dev_err(&pdev->dev, "No DT found\n");
-+		return -EINVAL;
-+	}
-+
-+	mt8173_nor = devm_kzalloc(&pdev->dev, sizeof(*mt8173_nor), GFP_KERNEL);
-+	if (!mt8173_nor)
-+		return -ENOMEM;
-+	platform_set_drvdata(pdev, mt8173_nor);
-+
-+	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-+	mt8173_nor->base = devm_ioremap_resource(&pdev->dev, res);
-+	if (IS_ERR(mt8173_nor->base))
-+		return PTR_ERR(mt8173_nor->base);
-+
-+	mt8173_nor->spi_clk = devm_clk_get(&pdev->dev, "spi");
-+	if (IS_ERR(mt8173_nor->spi_clk))
-+		return PTR_ERR(mt8173_nor->spi_clk);
-+
-+	mt8173_nor->nor_clk = devm_clk_get(&pdev->dev, "sf");
-+	if (IS_ERR(mt8173_nor->nor_clk))
-+		return PTR_ERR(mt8173_nor->nor_clk);
-+
-+	mt8173_nor->dev = &pdev->dev;
-+	ret = clk_prepare_enable(mt8173_nor->spi_clk);
-+	if (ret)
-+		return ret;
-+
-+	ret = clk_prepare_enable(mt8173_nor->nor_clk);
-+	if (ret) {
-+		clk_disable_unprepare(mt8173_nor->spi_clk);
-+		return ret;
-+	}
-+	/* only support one attached flash */
-+	flash_np = of_get_next_available_child(pdev->dev.of_node, NULL);
-+	if (!flash_np) {
-+		dev_err(&pdev->dev, "no SPI flash device to configure\n");
-+		ret = -ENODEV;
-+		goto nor_free;
-+	}
-+	ret = mtk_nor_init(mt8173_nor, flash_np);
-+
-+nor_free:
-+	if (ret) {
-+		clk_disable_unprepare(mt8173_nor->spi_clk);
-+		clk_disable_unprepare(mt8173_nor->nor_clk);
-+	}
-+	return ret;
-+}
-+
-+static int mtk_nor_drv_remove(struct platform_device *pdev)
-+{
-+	struct mt8173_nor *mt8173_nor = platform_get_drvdata(pdev);
-+
-+	clk_disable_unprepare(mt8173_nor->spi_clk);
-+	clk_disable_unprepare(mt8173_nor->nor_clk);
-+	return 0;
-+}
-+
-+static const struct of_device_id mtk_nor_of_ids[] = {
-+	{ .compatible = "mediatek,mt8173-nor"},
-+	{ /* sentinel */ }
-+};
-+MODULE_DEVICE_TABLE(of, mtk_nor_of_ids);
-+
-+static struct platform_driver mtk_nor_driver = {
-+	.probe = mtk_nor_drv_probe,
-+	.remove = mtk_nor_drv_remove,
-+	.driver = {
-+		.name = "mtk-nor",
-+		.of_match_table = mtk_nor_of_ids,
-+	},
-+};
-+
-+module_platform_driver(mtk_nor_driver);
-+MODULE_LICENSE("GPL v2");
-+MODULE_DESCRIPTION("MediaTek SPI NOR Flash Driver");
---- a/drivers/mtd/spi-nor/spi-nor.c
-+++ b/drivers/mtd/spi-nor/spi-nor.c
-@@ -38,6 +38,7 @@
- #define CHIP_ERASE_2MB_READY_WAIT_JIFFIES	(40UL * HZ)
- 
- #define SPI_NOR_MAX_ID_LEN	6
-+#define SPI_NOR_MAX_ADDR_WIDTH	4
- 
- struct flash_info {
- 	char		*name;
-@@ -60,15 +61,20 @@ struct flash_info {
- 	u16		addr_width;
- 
- 	u16		flags;
--#define	SECT_4K			0x01	/* SPINOR_OP_BE_4K works uniformly */
--#define	SPI_NOR_NO_ERASE	0x02	/* No erase command needed */
--#define	SST_WRITE		0x04	/* use SST byte programming */
--#define	SPI_NOR_NO_FR		0x08	/* Can't do fastread */
--#define	SECT_4K_PMC		0x10	/* SPINOR_OP_BE_4K_PMC works uniformly */
--#define	SPI_NOR_DUAL_READ	0x20    /* Flash supports Dual Read */
--#define	SPI_NOR_QUAD_READ	0x40    /* Flash supports Quad Read */
--#define	USE_FSR			0x80	/* use flag status register */
--#define	SPI_NOR_HAS_LOCK	0x100	/* Flash supports lock/unlock via SR */
-+#define SECT_4K			BIT(0)	/* SPINOR_OP_BE_4K works uniformly */
-+#define SPI_NOR_NO_ERASE	BIT(1)	/* No erase command needed */
-+#define SST_WRITE		BIT(2)	/* use SST byte programming */
-+#define SPI_NOR_NO_FR		BIT(3)	/* Can't do fastread */
-+#define SECT_4K_PMC		BIT(4)	/* SPINOR_OP_BE_4K_PMC works uniformly */
-+#define SPI_NOR_DUAL_READ	BIT(5)	/* Flash supports Dual Read */
-+#define SPI_NOR_QUAD_READ	BIT(6)	/* Flash supports Quad Read */
-+#define USE_FSR			BIT(7)	/* use flag status register */
-+#define SPI_NOR_HAS_LOCK	BIT(8)	/* Flash supports lock/unlock via SR */
-+#define SPI_NOR_HAS_TB		BIT(9)	/*
-+					 * Flash SR has Top/Bottom (TB) protect
-+					 * bit. Must be used with
-+					 * SPI_NOR_HAS_LOCK.
-+					 */
- };
- 
- #define JEDEC_MFR(info)	((info)->id[0])
-@@ -314,6 +320,29 @@ static void spi_nor_unlock_and_unprep(st
- }
- 
- /*
-+ * Initiate the erasure of a single sector
-+ */
-+static int spi_nor_erase_sector(struct spi_nor *nor, u32 addr)
-+{
-+	u8 buf[SPI_NOR_MAX_ADDR_WIDTH];
-+	int i;
-+
-+	if (nor->erase)
-+		return nor->erase(nor, addr);
-+
-+	/*
-+	 * Default implementation, if driver doesn't have a specialized HW
-+	 * control
-+	 */
-+	for (i = nor->addr_width - 1; i >= 0; i--) {
-+		buf[i] = addr & 0xff;
-+		addr >>= 8;
-+	}
-+
-+	return nor->write_reg(nor, nor->erase_opcode, buf, nor->addr_width);
-+}
-+
-+/*
-  * Erase an address range on the nor chip.  The address range may extend
-  * one or more erase sectors.  Return an error is there is a problem erasing.
-  */
-@@ -372,10 +401,9 @@ static int spi_nor_erase(struct mtd_info
- 		while (len) {
- 			write_enable(nor);
- 
--			if (nor->erase(nor, addr)) {
--				ret = -EIO;
-+			ret = spi_nor_erase_sector(nor, addr);
-+			if (ret)
- 				goto erase_err;
--			}
- 
- 			addr += mtd->erasesize;
- 			len -= mtd->erasesize;
-@@ -388,17 +416,13 @@ static int spi_nor_erase(struct mtd_info
- 
- 	write_disable(nor);
- 
-+erase_err:
- 	spi_nor_unlock_and_unprep(nor, SPI_NOR_OPS_ERASE);
- 
--	instr->state = MTD_ERASE_DONE;
-+	instr->state = ret ? MTD_ERASE_FAILED : MTD_ERASE_DONE;
- 	mtd_erase_callback(instr);
- 
- 	return ret;
--
--erase_err:
--	spi_nor_unlock_and_unprep(nor, SPI_NOR_OPS_ERASE);
--	instr->state = MTD_ERASE_FAILED;
--	return ret;
- }
- 
- static void stm_get_locked_range(struct spi_nor *nor, u8 sr, loff_t *ofs,
-@@ -416,32 +440,58 @@ static void stm_get_locked_range(struct
- 	} else {
- 		pow = ((sr & mask) ^ mask) >> shift;
- 		*len = mtd->size >> pow;
--		*ofs = mtd->size - *len;
-+		if (nor->flags & SNOR_F_HAS_SR_TB && sr & SR_TB)
-+			*ofs = 0;
-+		else
-+			*ofs = mtd->size - *len;
- 	}
- }
- 
- /*
-- * Return 1 if the entire region is locked, 0 otherwise
-+ * Return 1 if the entire region is locked (if @locked is true) or unlocked (if
-+ * @locked is false); 0 otherwise
-  */
--static int stm_is_locked_sr(struct spi_nor *nor, loff_t ofs, uint64_t len,
--			    u8 sr)
-+static int stm_check_lock_status_sr(struct spi_nor *nor, loff_t ofs, uint64_t len,
-+				    u8 sr, bool locked)
- {
- 	loff_t lock_offs;
- 	uint64_t lock_len;
- 
-+	if (!len)
-+		return 1;
-+
- 	stm_get_locked_range(nor, sr, &lock_offs, &lock_len);
- 
--	return (ofs + len <= lock_offs + lock_len) && (ofs >= lock_offs);
-+	if (locked)
-+		/* Requested range is a sub-range of locked range */
-+		return (ofs + len <= lock_offs + lock_len) && (ofs >= lock_offs);
-+	else
-+		/* Requested range does not overlap with locked range */
-+		return (ofs >= lock_offs + lock_len) || (ofs + len <= lock_offs);
-+}
-+
-+static int stm_is_locked_sr(struct spi_nor *nor, loff_t ofs, uint64_t len,
-+			    u8 sr)
-+{
-+	return stm_check_lock_status_sr(nor, ofs, len, sr, true);
-+}
-+
-+static int stm_is_unlocked_sr(struct spi_nor *nor, loff_t ofs, uint64_t len,
-+			      u8 sr)
-+{
-+	return stm_check_lock_status_sr(nor, ofs, len, sr, false);
- }
- 
- /*
-  * Lock a region of the flash. Compatible with ST Micro and similar flash.
-- * Supports only the block protection bits BP{0,1,2} in the status register
-+ * Supports the block protection bits BP{0,1,2} in the status register
-  * (SR). Does not support these features found in newer SR bitfields:
-- *   - TB: top/bottom protect - only handle TB=0 (top protect)
-  *   - SEC: sector/block protect - only handle SEC=0 (block protect)
-  *   - CMP: complement protect - only support CMP=0 (range is not complemented)
-  *
-+ * Support for the following is provided conditionally for some flash:
-+ *   - TB: top/bottom protect
-+ *
-  * Sample table portion for 8MB flash (Winbond w25q64fw):
-  *
-  *   SEC  |  TB   |  BP2  |  BP1  |  BP0  |  Prot Length  | Protected Portion
-@@ -454,26 +504,55 @@ static int stm_is_locked_sr(struct spi_n
-  *    0   |   0   |   1   |   0   |   1   |  2 MB         | Upper 1/4
-  *    0   |   0   |   1   |   1   |   0   |  4 MB         | Upper 1/2
-  *    X   |   X   |   1   |   1   |   1   |  8 MB         | ALL
-+ *  ------|-------|-------|-------|-------|---------------|-------------------
-+ *    0   |   1   |   0   |   0   |   1   |  128 KB       | Lower 1/64
-+ *    0   |   1   |   0   |   1   |   0   |  256 KB       | Lower 1/32
-+ *    0   |   1   |   0   |   1   |   1   |  512 KB       | Lower 1/16
-+ *    0   |   1   |   1   |   0   |   0   |  1 MB         | Lower 1/8
-+ *    0   |   1   |   1   |   0   |   1   |  2 MB         | Lower 1/4
-+ *    0   |   1   |   1   |   1   |   0   |  4 MB         | Lower 1/2
-  *
-  * Returns negative on errors, 0 on success.
-  */
- static int stm_lock(struct spi_nor *nor, loff_t ofs, uint64_t len)
- {
- 	struct mtd_info *mtd = &nor->mtd;
--	u8 status_old, status_new;
-+	int status_old, status_new;
- 	u8 mask = SR_BP2 | SR_BP1 | SR_BP0;
- 	u8 shift = ffs(mask) - 1, pow, val;
-+	loff_t lock_len;
-+	bool can_be_top = true, can_be_bottom = nor->flags & SNOR_F_HAS_SR_TB;
-+	bool use_top;
-+	int ret;
- 
- 	status_old = read_sr(nor);
-+	if (status_old < 0)
-+		return status_old;
- 
--	/* SPI NOR always locks to the end */
--	if (ofs + len != mtd->size) {
--		/* Does combined region extend to end? */
--		if (!stm_is_locked_sr(nor, ofs + len, mtd->size - ofs - len,
--				      status_old))
--			return -EINVAL;
--		len = mtd->size - ofs;
--	}
-+	/* If nothing in our range is unlocked, we don't need to do anything */
-+	if (stm_is_locked_sr(nor, ofs, len, status_old))
-+		return 0;
-+
-+	/* If anything below us is unlocked, we can't use 'bottom' protection */
-+	if (!stm_is_locked_sr(nor, 0, ofs, status_old))
-+		can_be_bottom = false;
-+
-+	/* If anything above us is unlocked, we can't use 'top' protection */
-+	if (!stm_is_locked_sr(nor, ofs + len, mtd->size - (ofs + len),
-+				status_old))
-+		can_be_top = false;
-+
-+	if (!can_be_bottom && !can_be_top)
-+		return -EINVAL;
-+
-+	/* Prefer top, if both are valid */
-+	use_top = can_be_top;
-+
-+	/* lock_len: length of region that should end up locked */
-+	if (use_top)
-+		lock_len = mtd->size - ofs;
-+	else
-+		lock_len = ofs + len;
- 
- 	/*
- 	 * Need smallest pow such that:
-@@ -484,7 +563,7 @@ static int stm_lock(struct spi_nor *nor,
- 	 *
- 	 *   pow = ceil(log2(size / len)) = log2(size) - floor(log2(len))
- 	 */
--	pow = ilog2(mtd->size) - ilog2(len);
-+	pow = ilog2(mtd->size) - ilog2(lock_len);
- 	val = mask - (pow << shift);
- 	if (val & ~mask)
- 		return -EINVAL;
-@@ -492,14 +571,27 @@ static int stm_lock(struct spi_nor *nor,
- 	if (!(val & mask))
- 		return -EINVAL;
- 
--	status_new = (status_old & ~mask) | val;
-+	status_new = (status_old & ~mask & ~SR_TB) | val;
-+
-+	/* Disallow further writes if WP pin is asserted */
-+	status_new |= SR_SRWD;
-+
-+	if (!use_top)
-+		status_new |= SR_TB;
-+
-+	/* Don't bother if they're the same */
-+	if (status_new == status_old)
-+		return 0;
- 
- 	/* Only modify protection if it will not unlock other areas */
--	if ((status_new & mask) <= (status_old & mask))
-+	if ((status_new & mask) < (status_old & mask))
- 		return -EINVAL;
- 
- 	write_enable(nor);
--	return write_sr(nor, status_new);
-+	ret = write_sr(nor, status_new);
-+	if (ret)
-+		return ret;
-+	return spi_nor_wait_till_ready(nor);
- }
- 
- /*
-@@ -510,17 +602,43 @@ static int stm_lock(struct spi_nor *nor,
- static int stm_unlock(struct spi_nor *nor, loff_t ofs, uint64_t len)
- {
- 	struct mtd_info *mtd = &nor->mtd;
--	uint8_t status_old, status_new;
-+	int status_old, status_new;
- 	u8 mask = SR_BP2 | SR_BP1 | SR_BP0;
- 	u8 shift = ffs(mask) - 1, pow, val;
-+	loff_t lock_len;
-+	bool can_be_top = true, can_be_bottom = nor->flags & SNOR_F_HAS_SR_TB;
-+	bool use_top;
-+	int ret;
- 
- 	status_old = read_sr(nor);
-+	if (status_old < 0)
-+		return status_old;
-+
-+	/* If nothing in our range is locked, we don't need to do anything */
-+	if (stm_is_unlocked_sr(nor, ofs, len, status_old))
-+		return 0;
-+
-+	/* If anything below us is locked, we can't use 'top' protection */
-+	if (!stm_is_unlocked_sr(nor, 0, ofs, status_old))
-+		can_be_top = false;
-+
-+	/* If anything above us is locked, we can't use 'bottom' protection */
-+	if (!stm_is_unlocked_sr(nor, ofs + len, mtd->size - (ofs + len),
-+				status_old))
-+		can_be_bottom = false;
- 
--	/* Cannot unlock; would unlock larger region than requested */
--	if (stm_is_locked_sr(nor, ofs - mtd->erasesize, mtd->erasesize,
--			     status_old))
-+	if (!can_be_bottom && !can_be_top)
- 		return -EINVAL;
- 
-+	/* Prefer top, if both are valid */
-+	use_top = can_be_top;
-+
-+	/* lock_len: length of region that should remain locked */
-+	if (use_top)
-+		lock_len = mtd->size - (ofs + len);
-+	else
-+		lock_len = ofs;
-+
- 	/*
- 	 * Need largest pow such that:
- 	 *
-@@ -530,8 +648,8 @@ static int stm_unlock(struct spi_nor *no
- 	 *
- 	 *   pow = floor(log2(size / len)) = log2(size) - ceil(log2(len))
- 	 */
--	pow = ilog2(mtd->size) - order_base_2(mtd->size - (ofs + len));
--	if (ofs + len == mtd->size) {
-+	pow = ilog2(mtd->size) - order_base_2(lock_len);
-+	if (lock_len == 0) {
- 		val = 0; /* fully unlocked */
- 	} else {
- 		val = mask - (pow << shift);
-@@ -540,14 +658,28 @@ static int stm_unlock(struct spi_nor *no
- 			return -EINVAL;
- 	}
- 
--	status_new = (status_old & ~mask) | val;
-+	status_new = (status_old & ~mask & ~SR_TB) | val;
-+
-+	/* Don't protect status register if we're fully unlocked */
-+	if (lock_len == mtd->size)
-+		status_new &= ~SR_SRWD;
-+
-+	if (!use_top)
-+		status_new |= SR_TB;
-+
-+	/* Don't bother if they're the same */
-+	if (status_new == status_old)
-+		return 0;
- 
- 	/* Only modify protection if it will not lock other areas */
--	if ((status_new & mask) >= (status_old & mask))
-+	if ((status_new & mask) > (status_old & mask))
- 		return -EINVAL;
- 
- 	write_enable(nor);
--	return write_sr(nor, status_new);
-+	ret = write_sr(nor, status_new);
-+	if (ret)
-+		return ret;
-+	return spi_nor_wait_till_ready(nor);
- }
- 
- /*
-@@ -737,8 +869,8 @@ static const struct flash_info spi_nor_i
- 	{ "n25q032a",	 INFO(0x20bb16, 0, 64 * 1024,   64, SPI_NOR_QUAD_READ) },
- 	{ "n25q064",     INFO(0x20ba17, 0, 64 * 1024,  128, SECT_4K | SPI_NOR_QUAD_READ) },
- 	{ "n25q064a",    INFO(0x20bb17, 0, 64 * 1024,  128, SECT_4K | SPI_NOR_QUAD_READ) },
--	{ "n25q128a11",  INFO(0x20bb18, 0, 64 * 1024,  256, SPI_NOR_QUAD_READ) },
--	{ "n25q128a13",  INFO(0x20ba18, 0, 64 * 1024,  256, SPI_NOR_QUAD_READ) },
-+	{ "n25q128a11",  INFO(0x20bb18, 0, 64 * 1024,  256, SECT_4K | SPI_NOR_QUAD_READ) },
-+	{ "n25q128a13",  INFO(0x20ba18, 0, 64 * 1024,  256, SECT_4K | SPI_NOR_QUAD_READ) },
- 	{ "n25q256a",    INFO(0x20ba19, 0, 64 * 1024,  512, SECT_4K | SPI_NOR_QUAD_READ) },
- 	{ "n25q512a",    INFO(0x20bb20, 0, 64 * 1024, 1024, SECT_4K | USE_FSR | SPI_NOR_QUAD_READ) },
- 	{ "n25q512ax3",  INFO(0x20ba20, 0, 64 * 1024, 1024, SECT_4K | USE_FSR | SPI_NOR_QUAD_READ) },
-@@ -772,6 +904,7 @@ static const struct flash_info spi_nor_i
- 	{ "s25fl008k",  INFO(0xef4014,      0,  64 * 1024,  16, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
- 	{ "s25fl016k",  INFO(0xef4015,      0,  64 * 1024,  32, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
- 	{ "s25fl064k",  INFO(0xef4017,      0,  64 * 1024, 128, SECT_4K) },
-+	{ "s25fl116k",  INFO(0x014015,      0,  64 * 1024,  32, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
- 	{ "s25fl132k",  INFO(0x014016,      0,  64 * 1024,  64, SECT_4K) },
- 	{ "s25fl164k",  INFO(0x014017,      0,  64 * 1024, 128, SECT_4K) },
- 	{ "s25fl204k",  INFO(0x014013,      0,  64 * 1024,   8, SECT_4K | SPI_NOR_DUAL_READ) },
-@@ -835,11 +968,23 @@ static const struct flash_info spi_nor_i
- 	{ "w25x16", INFO(0xef3015, 0, 64 * 1024,  32, SECT_4K) },
- 	{ "w25x32", INFO(0xef3016, 0, 64 * 1024,  64, SECT_4K) },
- 	{ "w25q32", INFO(0xef4016, 0, 64 * 1024,  64, SECT_4K) },
--	{ "w25q32dw", INFO(0xef6016, 0, 64 * 1024,  64, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
-+	{
-+		"w25q32dw", INFO(0xef6016, 0, 64 * 1024,  64,
-+			SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ |
-+			SPI_NOR_HAS_LOCK | SPI_NOR_HAS_TB)
-+	},
- 	{ "w25x64", INFO(0xef3017, 0, 64 * 1024, 128, SECT_4K) },
- 	{ "w25q64", INFO(0xef4017, 0, 64 * 1024, 128, SECT_4K) },
--	{ "w25q64dw", INFO(0xef6017, 0, 64 * 1024, 128, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
--	{ "w25q128fw", INFO(0xef6018, 0, 64 * 1024, 256, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
-+	{
-+		"w25q64dw", INFO(0xef6017, 0, 64 * 1024, 128,
-+			SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ |
-+			SPI_NOR_HAS_LOCK | SPI_NOR_HAS_TB)
-+	},
-+	{
-+		"w25q128fw", INFO(0xef6018, 0, 64 * 1024, 256,
-+			SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ |
-+			SPI_NOR_HAS_LOCK | SPI_NOR_HAS_TB)
-+	},
- 	{ "w25q80", INFO(0xef5014, 0, 64 * 1024,  16, SECT_4K) },
- 	{ "w25q80bl", INFO(0xef4014, 0, 64 * 1024,  16, SECT_4K) },
- 	{ "w25q128", INFO(0xef4018, 0, 64 * 1024, 256, SECT_4K) },
-@@ -862,7 +1007,7 @@ static const struct flash_info *spi_nor_
- 
- 	tmp = nor->read_reg(nor, SPINOR_OP_RDID, id, SPI_NOR_MAX_ID_LEN);
- 	if (tmp < 0) {
--		dev_dbg(nor->dev, " error %d reading JEDEC ID\n", tmp);
-+		dev_dbg(nor->dev, "error %d reading JEDEC ID\n", tmp);
- 		return ERR_PTR(tmp);
- 	}
- 
-@@ -873,7 +1018,7 @@ static const struct flash_info *spi_nor_
- 				return &spi_nor_ids[tmp];
- 		}
- 	}
--	dev_err(nor->dev, "unrecognized JEDEC id bytes: %02x, %2x, %2x\n",
-+	dev_err(nor->dev, "unrecognized JEDEC id bytes: %02x, %02x, %02x\n",
- 		id[0], id[1], id[2]);
- 	return ERR_PTR(-ENODEV);
- }
-@@ -1019,6 +1164,8 @@ static int macronix_quad_enable(struct s
- 	int ret, val;
- 
- 	val = read_sr(nor);
-+	if (val < 0)
-+		return val;
- 	write_enable(nor);
- 
- 	write_sr(nor, val | SR_QUAD_EN_MX);
-@@ -1100,7 +1247,7 @@ static int set_quad_mode(struct spi_nor
- static int spi_nor_check(struct spi_nor *nor)
- {
- 	if (!nor->dev || !nor->read || !nor->write ||
--		!nor->read_reg || !nor->write_reg || !nor->erase) {
-+		!nor->read_reg || !nor->write_reg) {
- 		pr_err("spi-nor: please fill all the necessary fields!\n");
- 		return -EINVAL;
- 	}
-@@ -1113,7 +1260,7 @@ int spi_nor_scan(struct spi_nor *nor, co
- 	const struct flash_info *info = NULL;
- 	struct device *dev = nor->dev;
- 	struct mtd_info *mtd = &nor->mtd;
--	struct device_node *np = nor->flash_node;
-+	struct device_node *np = spi_nor_get_flash_node(nor);
- 	int ret;
- 	int i;
- 
-@@ -1167,6 +1314,7 @@ int spi_nor_scan(struct spi_nor *nor, co
- 	    info->flags & SPI_NOR_HAS_LOCK) {
- 		write_enable(nor);
- 		write_sr(nor, 0);
-+		spi_nor_wait_till_ready(nor);
- 	}
- 
- 	if (!mtd->name)
-@@ -1201,6 +1349,8 @@ int spi_nor_scan(struct spi_nor *nor, co
- 
- 	if (info->flags & USE_FSR)
- 		nor->flags |= SNOR_F_USE_FSR;
-+	if (info->flags & SPI_NOR_HAS_TB)
-+		nor->flags |= SNOR_F_HAS_SR_TB;
- 
- #ifdef CONFIG_MTD_SPI_NOR_USE_4K_SECTORS
- 	/* prefer "small sector" erase if possible */
-@@ -1303,6 +1453,12 @@ int spi_nor_scan(struct spi_nor *nor, co
- 		nor->addr_width = 3;
- 	}
- 
-+	if (nor->addr_width > SPI_NOR_MAX_ADDR_WIDTH) {
-+		dev_err(dev, "address width is too large: %u\n",
-+			nor->addr_width);
-+		return -EINVAL;
-+	}
-+
- 	nor->read_dummy = spi_nor_read_dummy_cycles(nor);
- 
- 	dev_info(dev, "%s (%lld Kbytes)\n", info->name,
---- a/drivers/mtd/tests/mtd_nandecctest.c
-+++ b/drivers/mtd/tests/mtd_nandecctest.c
-@@ -187,7 +187,7 @@ static int double_bit_error_detect(void
- 	__nand_calculate_ecc(error_data, size, calc_ecc);
- 	ret = __nand_correct_data(error_data, error_ecc, calc_ecc, size);
- 
--	return (ret == -1) ? 0 : -EINVAL;
-+	return (ret == -EBADMSG) ? 0 : -EINVAL;
- }
- 
- static const struct nand_ecc_test nand_ecc_test[] = {
---- a/drivers/mtd/tests/oobtest.c
-+++ b/drivers/mtd/tests/oobtest.c
-@@ -215,19 +215,19 @@ static int verify_eraseblock(int ebnum)
- 			pr_info("ignoring error as within bitflip_limit\n");
- 		}
- 
--		if (use_offset != 0 || use_len < mtd->ecclayout->oobavail) {
-+		if (use_offset != 0 || use_len < mtd->oobavail) {
- 			int k;
- 
- 			ops.mode      = MTD_OPS_AUTO_OOB;
- 			ops.len       = 0;
- 			ops.retlen    = 0;
--			ops.ooblen    = mtd->ecclayout->oobavail;
-+			ops.ooblen    = mtd->oobavail;
- 			ops.oobretlen = 0;
- 			ops.ooboffs   = 0;
- 			ops.datbuf    = NULL;
- 			ops.oobbuf    = readbuf;
- 			err = mtd_read_oob(mtd, addr, &ops);
--			if (err || ops.oobretlen != mtd->ecclayout->oobavail) {
-+			if (err || ops.oobretlen != mtd->oobavail) {
- 				pr_err("error: readoob failed at %#llx\n",
- 						(long long)addr);
- 				errcnt += 1;
-@@ -244,7 +244,7 @@ static int verify_eraseblock(int ebnum)
- 			/* verify post-(use_offset + use_len) area for 0xff */
- 			k = use_offset + use_len;
- 			bitflips += memffshow(addr, k, readbuf + k,
--					      mtd->ecclayout->oobavail - k);
-+					      mtd->oobavail - k);
- 
- 			if (bitflips > bitflip_limit) {
- 				pr_err("error: verify failed at %#llx\n",
-@@ -269,8 +269,8 @@ static int verify_eraseblock_in_one_go(i
- 	struct mtd_oob_ops ops;
- 	int err = 0;
- 	loff_t addr = (loff_t)ebnum * mtd->erasesize;
--	size_t len = mtd->ecclayout->oobavail * pgcnt;
--	size_t oobavail = mtd->ecclayout->oobavail;
-+	size_t len = mtd->oobavail * pgcnt;
-+	size_t oobavail = mtd->oobavail;
- 	size_t bitflips;
- 	int i;
- 
-@@ -394,8 +394,8 @@ static int __init mtd_oobtest_init(void)
- 		goto out;
- 
- 	use_offset = 0;
--	use_len = mtd->ecclayout->oobavail;
--	use_len_max = mtd->ecclayout->oobavail;
-+	use_len = mtd->oobavail;
-+	use_len_max = mtd->oobavail;
- 	vary_offset = 0;
- 
- 	/* First test: write all OOB, read it back and verify */
-@@ -460,8 +460,8 @@ static int __init mtd_oobtest_init(void)
- 
- 	/* Write all eraseblocks */
- 	use_offset = 0;
--	use_len = mtd->ecclayout->oobavail;
--	use_len_max = mtd->ecclayout->oobavail;
-+	use_len = mtd->oobavail;
-+	use_len_max = mtd->oobavail;
- 	vary_offset = 1;
- 	prandom_seed_state(&rnd_state, 5);
- 
-@@ -471,8 +471,8 @@ static int __init mtd_oobtest_init(void)
- 
- 	/* Check all eraseblocks */
- 	use_offset = 0;
--	use_len = mtd->ecclayout->oobavail;
--	use_len_max = mtd->ecclayout->oobavail;
-+	use_len = mtd->oobavail;
-+	use_len_max = mtd->oobavail;
- 	vary_offset = 1;
- 	prandom_seed_state(&rnd_state, 5);
- 	err = verify_all_eraseblocks();
-@@ -480,8 +480,8 @@ static int __init mtd_oobtest_init(void)
- 		goto out;
- 
- 	use_offset = 0;
--	use_len = mtd->ecclayout->oobavail;
--	use_len_max = mtd->ecclayout->oobavail;
-+	use_len = mtd->oobavail;
-+	use_len_max = mtd->oobavail;
- 	vary_offset = 0;
- 
- 	/* Fourth test: try to write off end of device */
-@@ -501,7 +501,7 @@ static int __init mtd_oobtest_init(void)
- 	ops.retlen    = 0;
- 	ops.ooblen    = 1;
- 	ops.oobretlen = 0;
--	ops.ooboffs   = mtd->ecclayout->oobavail;
-+	ops.ooboffs   = mtd->oobavail;
- 	ops.datbuf    = NULL;
- 	ops.oobbuf    = writebuf;
- 	pr_info("attempting to start write past end of OOB\n");
-@@ -521,7 +521,7 @@ static int __init mtd_oobtest_init(void)
- 	ops.retlen    = 0;
- 	ops.ooblen    = 1;
- 	ops.oobretlen = 0;
--	ops.ooboffs   = mtd->ecclayout->oobavail;
-+	ops.ooboffs   = mtd->oobavail;
- 	ops.datbuf    = NULL;
- 	ops.oobbuf    = readbuf;
- 	pr_info("attempting to start read past end of OOB\n");
-@@ -543,7 +543,7 @@ static int __init mtd_oobtest_init(void)
- 		ops.mode      = MTD_OPS_AUTO_OOB;
- 		ops.len       = 0;
- 		ops.retlen    = 0;
--		ops.ooblen    = mtd->ecclayout->oobavail + 1;
-+		ops.ooblen    = mtd->oobavail + 1;
- 		ops.oobretlen = 0;
- 		ops.ooboffs   = 0;
- 		ops.datbuf    = NULL;
-@@ -563,7 +563,7 @@ static int __init mtd_oobtest_init(void)
- 		ops.mode      = MTD_OPS_AUTO_OOB;
- 		ops.len       = 0;
- 		ops.retlen    = 0;
--		ops.ooblen    = mtd->ecclayout->oobavail + 1;
-+		ops.ooblen    = mtd->oobavail + 1;
- 		ops.oobretlen = 0;
- 		ops.ooboffs   = 0;
- 		ops.datbuf    = NULL;
-@@ -587,7 +587,7 @@ static int __init mtd_oobtest_init(void)
- 		ops.mode      = MTD_OPS_AUTO_OOB;
- 		ops.len       = 0;
- 		ops.retlen    = 0;
--		ops.ooblen    = mtd->ecclayout->oobavail;
-+		ops.ooblen    = mtd->oobavail;
- 		ops.oobretlen = 0;
- 		ops.ooboffs   = 1;
- 		ops.datbuf    = NULL;
-@@ -607,7 +607,7 @@ static int __init mtd_oobtest_init(void)
- 		ops.mode      = MTD_OPS_AUTO_OOB;
- 		ops.len       = 0;
- 		ops.retlen    = 0;
--		ops.ooblen    = mtd->ecclayout->oobavail;
-+		ops.ooblen    = mtd->oobavail;
- 		ops.oobretlen = 0;
- 		ops.ooboffs   = 1;
- 		ops.datbuf    = NULL;
-@@ -638,7 +638,7 @@ static int __init mtd_oobtest_init(void)
- 	for (i = 0; i < ebcnt - 1; ++i) {
- 		int cnt = 2;
- 		int pg;
--		size_t sz = mtd->ecclayout->oobavail;
-+		size_t sz = mtd->oobavail;
- 		if (bbt[i] || bbt[i + 1])
- 			continue;
- 		addr = (loff_t)(i + 1) * mtd->erasesize - mtd->writesize;
-@@ -673,13 +673,12 @@ static int __init mtd_oobtest_init(void)
- 	for (i = 0; i < ebcnt - 1; ++i) {
- 		if (bbt[i] || bbt[i + 1])
- 			continue;
--		prandom_bytes_state(&rnd_state, writebuf,
--					mtd->ecclayout->oobavail * 2);
-+		prandom_bytes_state(&rnd_state, writebuf, mtd->oobavail * 2);
- 		addr = (loff_t)(i + 1) * mtd->erasesize - mtd->writesize;
- 		ops.mode      = MTD_OPS_AUTO_OOB;
- 		ops.len       = 0;
- 		ops.retlen    = 0;
--		ops.ooblen    = mtd->ecclayout->oobavail * 2;
-+		ops.ooblen    = mtd->oobavail * 2;
- 		ops.oobretlen = 0;
- 		ops.ooboffs   = 0;
- 		ops.datbuf    = NULL;
-@@ -688,7 +687,7 @@ static int __init mtd_oobtest_init(void)
- 		if (err)
- 			goto out;
- 		if (memcmpshow(addr, readbuf, writebuf,
--			       mtd->ecclayout->oobavail * 2)) {
-+			       mtd->oobavail * 2)) {
- 			pr_err("error: verify failed at %#llx\n",
- 			       (long long)addr);
- 			errcnt += 1;
---- a/drivers/mtd/tests/pagetest.c
-+++ b/drivers/mtd/tests/pagetest.c
-@@ -127,13 +127,12 @@ static int crosstest(void)
- 	unsigned char *pp1, *pp2, *pp3, *pp4;
- 
- 	pr_info("crosstest\n");
--	pp1 = kmalloc(pgsize * 4, GFP_KERNEL);
-+	pp1 = kzalloc(pgsize * 4, GFP_KERNEL);
- 	if (!pp1)
- 		return -ENOMEM;
- 	pp2 = pp1 + pgsize;
- 	pp3 = pp2 + pgsize;
- 	pp4 = pp3 + pgsize;
--	memset(pp1, 0, pgsize * 4);
- 
- 	addr0 = 0;
- 	for (i = 0; i < ebcnt && bbt[i]; ++i)
---- a/include/linux/mtd/bbm.h
-+++ b/include/linux/mtd/bbm.h
-@@ -166,7 +166,6 @@ struct bbm_info {
- };
- 
- /* OneNAND BBT interface */
--extern int onenand_scan_bbt(struct mtd_info *mtd, struct nand_bbt_descr *bd);
- extern int onenand_default_bbt(struct mtd_info *mtd);
- 
- #endif	/* __LINUX_MTD_BBM_H */
---- a/include/linux/mtd/fsmc.h
-+++ b/include/linux/mtd/fsmc.h
-@@ -103,24 +103,6 @@
- 
- #define FSMC_BUSY_WAIT_TIMEOUT	(1 * HZ)
- 
--/*
-- * There are 13 bytes of ecc for every 512 byte block in FSMC version 8
-- * and it has to be read consecutively and immediately after the 512
-- * byte data block for hardware to generate the error bit offsets
-- * Managing the ecc bytes in the following way is easier. This way is
-- * similar to oobfree structure maintained already in u-boot nand driver
-- */
--#define MAX_ECCPLACE_ENTRIES	32
--
--struct fsmc_nand_eccplace {
--	uint8_t offset;
--	uint8_t length;
--};
--
--struct fsmc_eccplace {
--	struct fsmc_nand_eccplace eccplace[MAX_ECCPLACE_ENTRIES];
--};
--
- struct fsmc_nand_timings {
- 	uint8_t tclr;
- 	uint8_t tar;
---- a/include/linux/mtd/inftl.h
-+++ b/include/linux/mtd/inftl.h
-@@ -44,7 +44,6 @@ struct INFTLrecord {
- 	unsigned int nb_blocks;		/* number of physical blocks */
- 	unsigned int nb_boot_blocks;	/* number of blocks used by the bios */
- 	struct erase_info instr;
--	struct nand_ecclayout oobinfo;
- };
- 
- int INFTL_mount(struct INFTLrecord *s);
---- a/include/linux/mtd/map.h
-+++ b/include/linux/mtd/map.h
-@@ -142,7 +142,9 @@
- #endif
- 
- #ifndef map_bankwidth
-+#ifdef CONFIG_MTD
- #warning "No CONFIG_MTD_MAP_BANK_WIDTH_xx selected. No NOR chip support can work"
-+#endif
- static inline int map_bankwidth(void *map)
- {
- 	BUG();
-@@ -238,8 +240,11 @@ struct map_info {
- 	   If there is no cache to care about this can be set to NULL. */
- 	void (*inval_cache)(struct map_info *, unsigned long, ssize_t);
- 
--	/* set_vpp() must handle being reentered -- enable, enable, disable
--	   must leave it enabled. */
-+	/* This will be called with 1 as parameter when the first map user
-+	 * needs VPP, and called with 0 when the last user exits. The map
-+	 * core maintains a reference counter, and assumes that VPP is a
-+	 * global resource applying to all mapped flash chips on the system.
-+	 */
- 	void (*set_vpp)(struct map_info *, int);
- 
- 	unsigned long pfow_base;
---- a/include/linux/mtd/mtd.h
-+++ b/include/linux/mtd/mtd.h
-@@ -100,17 +100,35 @@ struct mtd_oob_ops {
- 
- #define MTD_MAX_OOBFREE_ENTRIES_LARGE	32
- #define MTD_MAX_ECCPOS_ENTRIES_LARGE	640
-+/**
-+ * struct mtd_oob_region - oob region definition
-+ * @offset: region offset
-+ * @length: region length
-+ *
-+ * This structure describes a region of the OOB area, and is used
-+ * to retrieve ECC or free bytes sections.
-+ * Each section is defined by an offset within the OOB area and a
-+ * length.
-+ */
-+struct mtd_oob_region {
-+	u32 offset;
-+	u32 length;
-+};
-+
- /*
-- * Internal ECC layout control structure. For historical reasons, there is a
-- * similar, smaller struct nand_ecclayout_user (in mtd-abi.h) that is retained
-- * for export to user-space via the ECCGETLAYOUT ioctl.
-- * nand_ecclayout should be expandable in the future simply by the above macros.
-+ * struct mtd_ooblayout_ops - NAND OOB layout operations
-+ * @ecc: function returning an ECC region in the OOB area.
-+ *	 Should return -ERANGE if %section exceeds the total number of
-+ *	 ECC sections.
-+ * @free: function returning a free region in the OOB area.
-+ *	  Should return -ERANGE if %section exceeds the total number of
-+ *	  free sections.
-  */
--struct nand_ecclayout {
--	__u32 eccbytes;
--	__u32 eccpos[MTD_MAX_ECCPOS_ENTRIES_LARGE];
--	__u32 oobavail;
--	struct nand_oobfree oobfree[MTD_MAX_OOBFREE_ENTRIES_LARGE];
-+struct mtd_ooblayout_ops {
-+	int (*ecc)(struct mtd_info *mtd, int section,
-+		   struct mtd_oob_region *oobecc);
-+	int (*free)(struct mtd_info *mtd, int section,
-+		    struct mtd_oob_region *oobfree);
- };
- 
- struct module;	/* only needed for owner field in mtd_info */
-@@ -171,8 +189,8 @@ struct mtd_info {
- 	const char *name;
- 	int index;
- 
--	/* ECC layout structure pointer - read only! */
--	struct nand_ecclayout *ecclayout;
-+	/* OOB layout description */
-+	const struct mtd_ooblayout_ops *ooblayout;
- 
- 	/* the ecc step size. */
- 	unsigned int ecc_step_size;
-@@ -258,6 +276,46 @@ struct mtd_info {
- 	int usecount;
- };
- 
-+int mtd_ooblayout_ecc(struct mtd_info *mtd, int section,
-+		      struct mtd_oob_region *oobecc);
-+int mtd_ooblayout_find_eccregion(struct mtd_info *mtd, int eccbyte,
-+				 int *section,
-+				 struct mtd_oob_region *oobregion);
-+int mtd_ooblayout_get_eccbytes(struct mtd_info *mtd, u8 *eccbuf,
-+			       const u8 *oobbuf, int start, int nbytes);
-+int mtd_ooblayout_set_eccbytes(struct mtd_info *mtd, const u8 *eccbuf,
-+			       u8 *oobbuf, int start, int nbytes);
-+int mtd_ooblayout_free(struct mtd_info *mtd, int section,
-+		       struct mtd_oob_region *oobfree);
-+int mtd_ooblayout_get_databytes(struct mtd_info *mtd, u8 *databuf,
-+				const u8 *oobbuf, int start, int nbytes);
-+int mtd_ooblayout_set_databytes(struct mtd_info *mtd, const u8 *databuf,
-+				u8 *oobbuf, int start, int nbytes);
-+int mtd_ooblayout_count_freebytes(struct mtd_info *mtd);
-+int mtd_ooblayout_count_eccbytes(struct mtd_info *mtd);
-+
-+static inline void mtd_set_ooblayout(struct mtd_info *mtd,
-+				     const struct mtd_ooblayout_ops *ooblayout)
-+{
-+	mtd->ooblayout = ooblayout;
-+}
-+
-+static inline void mtd_set_of_node(struct mtd_info *mtd,
-+				   struct device_node *np)
-+{
-+	mtd->dev.of_node = np;
-+}
-+
-+static inline struct device_node *mtd_get_of_node(struct mtd_info *mtd)
-+{
-+	return mtd->dev.of_node;
-+}
-+
-+static inline int mtd_oobavail(struct mtd_info *mtd, struct mtd_oob_ops *ops)
-+{
-+	return ops->mode == MTD_OPS_AUTO_OOB ? mtd->oobavail : mtd->oobsize;
-+}
-+
- int mtd_erase(struct mtd_info *mtd, struct erase_info *instr);
- int mtd_point(struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen,
- 	      void **virt, resource_size_t *phys);
---- a/include/linux/mtd/nand.h
-+++ b/include/linux/mtd/nand.h
-@@ -119,6 +119,12 @@ typedef enum {
- 	NAND_ECC_SOFT_BCH,
- } nand_ecc_modes_t;
- 
-+enum nand_ecc_algo {
-+	NAND_ECC_UNKNOWN,
-+	NAND_ECC_HAMMING,
-+	NAND_ECC_BCH,
-+};
-+
- /*
-  * Constants for Hardware ECC
-  */
-@@ -129,6 +135,14 @@ typedef enum {
- /* Enable Hardware ECC before syndrome is read back from flash */
- #define NAND_ECC_READSYN	2
- 
-+/*
-+ * Enable generic NAND 'page erased' check. This check is only done when
-+ * ecc.correct() returns -EBADMSG.
-+ * Set this flag if your implementation does not fix bitflips in erased
-+ * pages and you want to rely on the default implementation.
-+ */
-+#define NAND_ECC_GENERIC_ERASED_CHECK	BIT(0)
-+
- /* Bit mask for flags passed to do_nand_read_ecc */
- #define NAND_GET_DEVICE		0x80
- 
-@@ -160,6 +174,12 @@ typedef enum {
- /* Device supports subpage reads */
- #define NAND_SUBPAGE_READ	0x00001000
- 
-+/*
-+ * Some MLC NANDs need data scrambling to limit bitflips caused by repeated
-+ * patterns.
-+ */
-+#define NAND_NEED_SCRAMBLING	0x00002000
-+
- /* Options valid for Samsung large page devices */
- #define NAND_SAMSUNG_LP_OPTIONS NAND_CACHEPRG
- 
-@@ -276,15 +296,15 @@ struct nand_onfi_params {
- 	__le16 t_r;
- 	__le16 t_ccs;
- 	__le16 src_sync_timing_mode;
--	__le16 src_ssync_features;
-+	u8 src_ssync_features;
- 	__le16 clk_pin_capacitance_typ;
- 	__le16 io_pin_capacitance_typ;
- 	__le16 input_pin_capacitance_typ;
- 	u8 input_pin_capacitance_max;
- 	u8 driver_strength_support;
- 	__le16 t_int_r;
--	__le16 t_ald;
--	u8 reserved4[7];
-+	__le16 t_adl;
-+	u8 reserved4[8];
- 
- 	/* vendor */
- 	__le16 vendor_revision;
-@@ -407,7 +427,7 @@ struct nand_jedec_params {
- 	__le16 input_pin_capacitance_typ;
- 	__le16 clk_pin_capacitance_typ;
- 	u8 driver_strength_support;
--	__le16 t_ald;
-+	__le16 t_adl;
- 	u8 reserved4[36];
- 
- 	/* ECC and endurance block */
-@@ -444,6 +464,7 @@ struct nand_hw_control {
- /**
-  * struct nand_ecc_ctrl - Control structure for ECC
-  * @mode:	ECC mode
-+ * @algo:	ECC algorithm
-  * @steps:	number of ECC steps per page
-  * @size:	data bytes per ECC step
-  * @bytes:	ECC bytes per step
-@@ -451,12 +472,18 @@ struct nand_hw_control {
-  * @total:	total number of ECC bytes per page
-  * @prepad:	padding information for syndrome based ECC generators
-  * @postpad:	padding information for syndrome based ECC generators
-- * @layout:	ECC layout control struct pointer
-+ * @options:	ECC specific options (see NAND_ECC_XXX flags defined above)
-  * @priv:	pointer to private ECC control data
-  * @hwctl:	function to control hardware ECC generator. Must only
-  *		be provided if an hardware ECC is available
-  * @calculate:	function for ECC calculation or readback from ECC hardware
-- * @correct:	function for ECC correction, matching to ECC generator (sw/hw)
-+ * @correct:	function for ECC correction, matching to ECC generator (sw/hw).
-+ *		Should return a positive number representing the number of
-+ *		corrected bitflips, -EBADMSG if the number of bitflips exceed
-+ *		ECC strength, or any other error code if the error is not
-+ *		directly related to correction.
-+ *		If -EBADMSG is returned the input buffers should be left
-+ *		untouched.
-  * @read_page_raw:	function to read a raw page without ECC. This function
-  *			should hide the specific layout used by the ECC
-  *			controller and always return contiguous in-band and
-@@ -487,6 +514,7 @@ struct nand_hw_control {
-  */
- struct nand_ecc_ctrl {
- 	nand_ecc_modes_t mode;
-+	enum nand_ecc_algo algo;
- 	int steps;
- 	int size;
- 	int bytes;
-@@ -494,7 +522,7 @@ struct nand_ecc_ctrl {
- 	int strength;
- 	int prepad;
- 	int postpad;
--	struct nand_ecclayout	*layout;
-+	unsigned int options;
- 	void *priv;
- 	void (*hwctl)(struct mtd_info *mtd, int mode);
- 	int (*calculate)(struct mtd_info *mtd, const uint8_t *dat,
-@@ -540,11 +568,11 @@ struct nand_buffers {
- 
- /**
-  * struct nand_chip - NAND Private Flash Chip Data
-+ * @mtd:		MTD device registered to the MTD framework
-  * @IO_ADDR_R:		[BOARDSPECIFIC] address to read the 8 I/O lines of the
-  *			flash device
-  * @IO_ADDR_W:		[BOARDSPECIFIC] address to write the 8 I/O lines of the
-  *			flash device.
-- * @flash_node:		[BOARDSPECIFIC] device node describing this instance
-  * @read_byte:		[REPLACEABLE] read one byte from the chip
-  * @read_word:		[REPLACEABLE] read one word from the chip
-  * @write_byte:		[REPLACEABLE] write a single byte to the chip on the
-@@ -640,18 +668,17 @@ struct nand_buffers {
-  */
- 
- struct nand_chip {
-+	struct mtd_info mtd;
- 	void __iomem *IO_ADDR_R;
- 	void __iomem *IO_ADDR_W;
- 
--	struct device_node *flash_node;
--
- 	uint8_t (*read_byte)(struct mtd_info *mtd);
- 	u16 (*read_word)(struct mtd_info *mtd);
- 	void (*write_byte)(struct mtd_info *mtd, uint8_t byte);
- 	void (*write_buf)(struct mtd_info *mtd, const uint8_t *buf, int len);
- 	void (*read_buf)(struct mtd_info *mtd, uint8_t *buf, int len);
- 	void (*select_chip)(struct mtd_info *mtd, int chip);
--	int (*block_bad)(struct mtd_info *mtd, loff_t ofs, int getchip);
-+	int (*block_bad)(struct mtd_info *mtd, loff_t ofs);
- 	int (*block_markbad)(struct mtd_info *mtd, loff_t ofs);
- 	void (*cmd_ctrl)(struct mtd_info *mtd, int dat, unsigned int ctrl);
- 	int (*dev_ready)(struct mtd_info *mtd);
-@@ -719,6 +746,40 @@ struct nand_chip {
- 	void *priv;
- };
- 
-+extern const struct mtd_ooblayout_ops nand_ooblayout_sp_ops;
-+extern const struct mtd_ooblayout_ops nand_ooblayout_lp_ops;
-+
-+static inline void nand_set_flash_node(struct nand_chip *chip,
-+				       struct device_node *np)
-+{
-+	mtd_set_of_node(&chip->mtd, np);
-+}
-+
-+static inline struct device_node *nand_get_flash_node(struct nand_chip *chip)
-+{
-+	return mtd_get_of_node(&chip->mtd);
-+}
-+
-+static inline struct nand_chip *mtd_to_nand(struct mtd_info *mtd)
-+{
-+	return container_of(mtd, struct nand_chip, mtd);
-+}
-+
-+static inline struct mtd_info *nand_to_mtd(struct nand_chip *chip)
-+{
-+	return &chip->mtd;
-+}
-+
-+static inline void *nand_get_controller_data(struct nand_chip *chip)
-+{
-+	return chip->priv;
-+}
-+
-+static inline void nand_set_controller_data(struct nand_chip *chip, void *priv)
-+{
-+	chip->priv = priv;
-+}
-+
- /*
-  * NAND Flash Manufacturer ID Codes
-  */
-@@ -850,7 +911,6 @@ extern int nand_do_read(struct mtd_info
-  * @chip_delay:		R/B delay value in us
-  * @options:		Option flags, e.g. 16bit buswidth
-  * @bbt_options:	BBT option flags, e.g. NAND_BBT_USE_FLASH
-- * @ecclayout:		ECC layout info structure
-  * @part_probe_types:	NULL-terminated array of probe types
-  */
- struct platform_nand_chip {
-@@ -858,7 +918,6 @@ struct platform_nand_chip {
- 	int chip_offset;
- 	int nr_partitions;
- 	struct mtd_partition *partitions;
--	struct nand_ecclayout *ecclayout;
- 	int chip_delay;
- 	unsigned int options;
- 	unsigned int bbt_options;
-@@ -908,15 +967,6 @@ struct platform_nand_data {
- 	struct platform_nand_ctrl ctrl;
- };
- 
--/* Some helpers to access the data structures */
--static inline
--struct platform_nand_chip *get_platform_nandchip(struct mtd_info *mtd)
--{
--	struct nand_chip *chip = mtd->priv;
--
--	return chip->priv;
--}
--
- /* return the supported features. */
- static inline int onfi_feature(struct nand_chip *chip)
- {
---- a/include/linux/mtd/nand_bch.h
-+++ b/include/linux/mtd/nand_bch.h
-@@ -32,9 +32,7 @@ int nand_bch_correct_data(struct mtd_inf
- /*
-  * Initialize BCH encoder/decoder
-  */
--struct nand_bch_control *
--nand_bch_init(struct mtd_info *mtd, unsigned int eccsize,
--	      unsigned int eccbytes, struct nand_ecclayout **ecclayout);
-+struct nand_bch_control *nand_bch_init(struct mtd_info *mtd);
- /*
-  * Release BCH encoder/decoder resources
-  */
-@@ -55,12 +53,10 @@ static inline int
- nand_bch_correct_data(struct mtd_info *mtd, unsigned char *buf,
- 		      unsigned char *read_ecc, unsigned char *calc_ecc)
- {
--	return -1;
-+	return -ENOTSUPP;
- }
- 
--static inline struct nand_bch_control *
--nand_bch_init(struct mtd_info *mtd, unsigned int eccsize,
--	      unsigned int eccbytes, struct nand_ecclayout **ecclayout)
-+static inline struct nand_bch_control *nand_bch_init(struct mtd_info *mtd)
- {
- 	return NULL;
- }
---- a/include/linux/mtd/nftl.h
-+++ b/include/linux/mtd/nftl.h
-@@ -50,7 +50,6 @@ struct NFTLrecord {
-         unsigned int nb_blocks;		/* number of physical blocks */
-         unsigned int nb_boot_blocks;	/* number of blocks used by the bios */
-         struct erase_info instr;
--	struct nand_ecclayout oobinfo;
- };
- 
- int NFTL_mount(struct NFTLrecord *s);
---- a/include/linux/mtd/onenand.h
-+++ b/include/linux/mtd/onenand.h
-@@ -80,7 +80,6 @@ struct onenand_bufferram {
-  * @page_buf:		[INTERN] page main data buffer
-  * @oob_buf:		[INTERN] page oob data buffer
-  * @subpagesize:	[INTERN] holds the subpagesize
-- * @ecclayout:		[REPLACEABLE] the default ecc placement scheme
-  * @bbm:		[REPLACEABLE] pointer to Bad Block Management
-  * @priv:		[OPTIONAL] pointer to private chip date
-  */
-@@ -134,7 +133,6 @@ struct onenand_chip {
- #endif
- 
- 	int			subpagesize;
--	struct nand_ecclayout	*ecclayout;
- 
- 	void			*bbm;
- 
---- a/include/linux/mtd/partitions.h
-+++ b/include/linux/mtd/partitions.h
-@@ -42,7 +42,6 @@ struct mtd_partition {
- 	uint64_t size;			/* partition size */
- 	uint64_t offset;		/* offset within the master MTD space */
- 	uint32_t mask_flags;		/* master MTD flags to mask out for this partition */
--	struct nand_ecclayout *ecclayout;	/* out of band layout for this partition (NAND only) */
- };
- 
- #define MTDPART_OFS_RETAIN	(-3)
-@@ -56,11 +55,9 @@ struct device_node;
- /**
-  * struct mtd_part_parser_data - used to pass data to MTD partition parsers.
-  * @origin: for RedBoot, start address of MTD device
-- * @of_node: for OF parsers, device node containing partitioning information
-  */
- struct mtd_part_parser_data {
- 	unsigned long origin;
--	struct device_node *of_node;
- };
- 
- 
-@@ -78,14 +75,34 @@ struct mtd_part_parser {
- 	struct list_head list;
- 	struct module *owner;
- 	const char *name;
--	int (*parse_fn)(struct mtd_info *, struct mtd_partition **,
-+	int (*parse_fn)(struct mtd_info *, const struct mtd_partition **,
- 			struct mtd_part_parser_data *);
-+	void (*cleanup)(const struct mtd_partition *pparts, int nr_parts);
- 	enum mtd_parser_type type;
- };
- 
--extern void register_mtd_parser(struct mtd_part_parser *parser);
-+/* Container for passing around a set of parsed partitions */
-+struct mtd_partitions {
-+	const struct mtd_partition *parts;
-+	int nr_parts;
-+	const struct mtd_part_parser *parser;
-+};
-+
-+extern int __register_mtd_parser(struct mtd_part_parser *parser,
-+				 struct module *owner);
-+#define register_mtd_parser(parser) __register_mtd_parser(parser, THIS_MODULE)
-+
- extern void deregister_mtd_parser(struct mtd_part_parser *parser);
- 
-+/*
-+ * module_mtd_part_parser() - Helper macro for MTD partition parsers that don't
-+ * do anything special in module init/exit. Each driver may only use this macro
-+ * once, and calling it replaces module_init() and module_exit().
-+ */
-+#define module_mtd_part_parser(__mtd_part_parser) \
-+	module_driver(__mtd_part_parser, register_mtd_parser, \
-+		      deregister_mtd_parser)
-+
- int mtd_is_partition(const struct mtd_info *mtd);
- int mtd_add_partition(struct mtd_info *master, const char *name,
- 		      long long offset, long long length);
---- a/include/linux/mtd/sh_flctl.h
-+++ b/include/linux/mtd/sh_flctl.h
-@@ -143,11 +143,11 @@ enum flctl_ecc_res_t {
- struct dma_chan;
- 
- struct sh_flctl {
--	struct mtd_info		mtd;
- 	struct nand_chip	chip;
- 	struct platform_device	*pdev;
- 	struct dev_pm_qos_request pm_qos;
- 	void __iomem		*reg;
-+	resource_size_t		fifo;
- 
- 	uint8_t	done_buff[2048 + 64];	/* max size 2048 + 64 */
- 	int	read_bytes;
-@@ -186,7 +186,7 @@ struct sh_flctl_platform_data {
- 
- static inline struct sh_flctl *mtd_to_flctl(struct mtd_info *mtdinfo)
- {
--	return container_of(mtdinfo, struct sh_flctl, mtd);
-+	return container_of(mtd_to_nand(mtdinfo), struct sh_flctl, chip);
- }
- 
- #endif	/* __SH_FLCTL_H__ */
---- a/include/linux/mtd/sharpsl.h
-+++ b/include/linux/mtd/sharpsl.h
-@@ -14,7 +14,7 @@
- 
- struct sharpsl_nand_platform_data {
- 	struct nand_bbt_descr	*badblock_pattern;
--	struct nand_ecclayout	*ecc_layout;
-+	const struct mtd_ooblayout_ops *ecc_layout;
- 	struct mtd_partition	*partitions;
- 	unsigned int		nr_partitions;
- };
---- a/include/uapi/mtd/mtd-abi.h
-+++ b/include/uapi/mtd/mtd-abi.h
-@@ -228,7 +228,7 @@ struct nand_oobfree {
-  * complete set of ECC information. The ioctl truncates the larger internal
-  * structure to retain binary compatibility with the static declaration of the
-  * ioctl. Note that the "MTD_MAX_..._ENTRIES" macros represent the max size of
-- * the user struct, not the MAX size of the internal struct nand_ecclayout.
-+ * the user struct, not the MAX size of the internal OOB layout representation.
-  */
- struct nand_ecclayout_user {
- 	__u32 eccbytes;
---- a/fs/jffs2/wbuf.c
-+++ b/fs/jffs2/wbuf.c
-@@ -1153,7 +1153,7 @@ static struct jffs2_sb_info *work_to_sb(
- {
- 	struct delayed_work *dwork;
- 
--	dwork = container_of(work, struct delayed_work, work);
-+	dwork = to_delayed_work(work);
- 	return container_of(dwork, struct jffs2_sb_info, wbuf_dwork);
- }
- 
-@@ -1183,22 +1183,20 @@ void jffs2_dirty_trigger(struct jffs2_sb
- 
- int jffs2_nand_flash_setup(struct jffs2_sb_info *c)
- {
--	struct nand_ecclayout *oinfo = c->mtd->ecclayout;
--
- 	if (!c->mtd->oobsize)
- 		return 0;
- 
- 	/* Cleanmarker is out-of-band, so inline size zero */
- 	c->cleanmarker_size = 0;
- 
--	if (!oinfo || oinfo->oobavail == 0) {
-+	if (c->mtd->oobavail == 0) {
- 		pr_err("inconsistent device description\n");
- 		return -EINVAL;
- 	}
- 
- 	jffs2_dbg(1, "using OOB on NAND\n");
- 
--	c->oobavail = oinfo->oobavail;
-+	c->oobavail = c->mtd->oobavail;
- 
- 	/* Initialise write buffer */
- 	init_rwsem(&c->wbuf_sem);
---- a/include/linux/mtd/spi-nor.h
-+++ b/include/linux/mtd/spi-nor.h
-@@ -85,6 +85,7 @@
- #define SR_BP0			BIT(2)	/* Block protect 0 */
- #define SR_BP1			BIT(3)	/* Block protect 1 */
- #define SR_BP2			BIT(4)	/* Block protect 2 */
-+#define SR_TB			BIT(5)	/* Top/Bottom protect */
- #define SR_SRWD			BIT(7)	/* SR write protect */
- 
- #define SR_QUAD_EN_MX		BIT(6)	/* Macronix Quad I/O */
-@@ -116,6 +117,7 @@ enum spi_nor_ops {
- 
- enum spi_nor_option_flags {
- 	SNOR_F_USE_FSR		= BIT(0),
-+	SNOR_F_HAS_SR_TB	= BIT(1),
- };
- 
- /**
-@@ -123,7 +125,6 @@ enum spi_nor_option_flags {
-  * @mtd:		point to a mtd_info structure
-  * @lock:		the lock for the read/write/erase/lock/unlock operations
-  * @dev:		point to a spi device, or a spi nor controller device.
-- * @flash_node:		point to a device node describing this flash instance.
-  * @page_size:		the page size of the SPI NOR
-  * @addr_width:		number of address bytes
-  * @erase_opcode:	the opcode for erasing a sector
-@@ -143,7 +144,8 @@ enum spi_nor_option_flags {
-  * @read:		[DRIVER-SPECIFIC] read data from the SPI NOR
-  * @write:		[DRIVER-SPECIFIC] write data to the SPI NOR
-  * @erase:		[DRIVER-SPECIFIC] erase a sector of the SPI NOR
-- *			at the offset @offs
-+ *			at the offset @offs; if not provided by the driver,
-+ *			spi-nor will send the erase opcode via write_reg()
-  * @flash_lock:		[FLASH-SPECIFIC] lock a region of the SPI NOR
-  * @flash_unlock:	[FLASH-SPECIFIC] unlock a region of the SPI NOR
-  * @flash_is_locked:	[FLASH-SPECIFIC] check if a region of the SPI NOR is
-@@ -154,7 +156,6 @@ struct spi_nor {
- 	struct mtd_info		mtd;
- 	struct mutex		lock;
- 	struct device		*dev;
--	struct device_node	*flash_node;
- 	u32			page_size;
- 	u8			addr_width;
- 	u8			erase_opcode;
-@@ -184,6 +185,17 @@ struct spi_nor {
- 	void *priv;
- };
- 
-+static inline void spi_nor_set_flash_node(struct spi_nor *nor,
-+					  struct device_node *np)
-+{
-+	mtd_set_of_node(&nor->mtd, np);
-+}
-+
-+static inline struct device_node *spi_nor_get_flash_node(struct spi_nor *nor)
-+{
-+	return mtd_get_of_node(&nor->mtd);
-+}
-+
- /**
-  * spi_nor_scan() - scan the SPI NOR
-  * @nor:	the spi_nor structure
diff --git a/target/linux/mediatek/patches-4.4/0073-of-mtd-prepare-helper-reading-NAND-ECC-algo-from-DT.patch b/target/linux/mediatek/patches-4.4/0073-of-mtd-prepare-helper-reading-NAND-ECC-algo-from-DT.patch
deleted file mode 100644
index aa45441..0000000
--- a/target/linux/mediatek/patches-4.4/0073-of-mtd-prepare-helper-reading-NAND-ECC-algo-from-DT.patch
+++ /dev/null
@@ -1,91 +0,0 @@
-From 410a91f6efa1c4c3c4369d1dd2c31286749dff33 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5 at gmail.com>
-Date: Wed, 23 Mar 2016 11:19:01 +0100
-Subject: [PATCH 073/102] of: mtd: prepare helper reading NAND ECC algo from
- DT
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-NAND subsystem is being slightly reworked to store ECC details in
-separated fields. In future we'll want to add support for more DT
-properties as specifying every possible setup with a single
-"nand-ecc-mode" is a pretty bad idea.
-To allow this let's add a helper that will support something like
-"nand-ecc-algo" in future. Right now we use it for keeping backward
-compatibility.
-
-Signed-off-by: Rafał Miłecki <zajec5 at gmail.com>
-Signed-off-by: Boris Brezillon <boris.brezillon at free-electrons.com>
----
- drivers/of/of_mtd.c    |   36 ++++++++++++++++++++++++++++++++++++
- include/linux/of_mtd.h |    6 ++++++
- 2 files changed, 42 insertions(+)
-
---- a/drivers/of/of_mtd.c
-+++ b/drivers/of/of_mtd.c
-@@ -50,6 +50,42 @@ int of_get_nand_ecc_mode(struct device_n
- EXPORT_SYMBOL_GPL(of_get_nand_ecc_mode);
- 
- /**
-+ * of_get_nand_ecc_algo - Get nand ecc algorithm for given device_node
-+ * @np:	Pointer to the given device_node
-+ *
-+ * The function gets ecc algorithm and returns its enum value, or errno in error
-+ * case.
-+ */
-+int of_get_nand_ecc_algo(struct device_node *np)
-+{
-+	const char *pm;
-+	int err;
-+
-+	/*
-+	 * TODO: Read ECC algo OF property and map it to enum nand_ecc_algo.
-+	 * It's not implemented yet as currently NAND subsystem ignores
-+	 * algorithm explicitly set this way. Once it's handled we should
-+	 * document & support new property.
-+	 */
-+
-+	/*
-+	 * For backward compatibility we also read "nand-ecc-mode" checking
-+	 * for some obsoleted values that were specifying ECC algorithm.
-+	 */
-+	err = of_property_read_string(np, "nand-ecc-mode", &pm);
-+	if (err < 0)
-+		return err;
-+
-+	if (!strcasecmp(pm, "soft"))
-+		return NAND_ECC_HAMMING;
-+	else if (!strcasecmp(pm, "soft_bch"))
-+		return NAND_ECC_BCH;
-+
-+	return -ENODEV;
-+}
-+EXPORT_SYMBOL_GPL(of_get_nand_ecc_algo);
-+
-+/**
-  * of_get_nand_ecc_step_size - Get ECC step size associated to
-  * the required ECC strength (see below).
-  * @np:	Pointer to the given device_node
---- a/include/linux/of_mtd.h
-+++ b/include/linux/of_mtd.h
-@@ -13,6 +13,7 @@
- 
- #include <linux/of.h>
- int of_get_nand_ecc_mode(struct device_node *np);
-+int of_get_nand_ecc_algo(struct device_node *np);
- int of_get_nand_ecc_step_size(struct device_node *np);
- int of_get_nand_ecc_strength(struct device_node *np);
- int of_get_nand_bus_width(struct device_node *np);
-@@ -24,6 +25,11 @@ static inline int of_get_nand_ecc_mode(s
- {
- 	return -ENOSYS;
- }
-+
-+static inline int of_get_nand_ecc_algo(struct device_node *np)
-+{
-+	return -ENOSYS;
-+}
- 
- static inline int of_get_nand_ecc_step_size(struct device_node *np)
- {
diff --git a/target/linux/mediatek/patches-4.4/0074-mtd-mediatek-device-tree-docs-for-MTK-Smart-Device-G.patch b/target/linux/mediatek/patches-4.4/0074-mtd-mediatek-device-tree-docs-for-MTK-Smart-Device-G.patch
deleted file mode 100644
index 5f260e3..0000000
--- a/target/linux/mediatek/patches-4.4/0074-mtd-mediatek-device-tree-docs-for-MTK-Smart-Device-G.patch
+++ /dev/null
@@ -1,179 +0,0 @@
-From 5e1c00983efeca4522ac2e8574e3e3997d26a203 Mon Sep 17 00:00:00 2001
-From: Jorge Ramirez-Ortiz <jorge.ramirez-ortiz at linaro.org>
-Date: Fri, 29 Apr 2016 12:17:21 -0400
-Subject: [PATCH 074/102] mtd: mediatek: device tree docs for MTK Smart Device
- Gen1 NAND
-
-This patch adds documentation support for Smart Device Gen1 type of
-NAND controllers.
-
-Signed-off-by: Jorge Ramirez-Ortiz <jorge.ramirez-ortiz at linaro.org>
----
- Documentation/devicetree/bindings/mtd/mtk-nand.txt |  161 ++++++++++++++++++++
- 1 file changed, 161 insertions(+)
- create mode 100644 Documentation/devicetree/bindings/mtd/mtk-nand.txt
-
---- /dev/null
-+++ b/Documentation/devicetree/bindings/mtd/mtk-nand.txt
-@@ -0,0 +1,161 @@
-+MTK SoCs NAND FLASH controller (NFC) DT binding
-+
-+This file documents the device tree bindings for MTK SoCs NAND controllers.
-+The functional split of the controller requires two drivers to operate:
-+the nand controller interface driver and the ECC engine driver.
-+
-+The hardware description for both devices must be captured as device
-+tree nodes.
-+
-+1) NFC NAND Controller Interface (NFI):
-+=======================================
-+
-+The first part of NFC is NAND Controller Interface (NFI) HW.
-+Required NFI properties:
-+- compatible:			Should be "mediatek,mtxxxx-nfc".
-+- reg:				Base physical address and size of NFI.
-+- interrupts:			Interrupts of NFI.
-+- clocks:			NFI required clocks.
-+- clock-names:			NFI clocks internal name.
-+- status:			Disabled default. Then set "okay" by platform.
-+- ecc-engine:			Required ECC Engine node.
-+- #address-cells:		NAND chip index, should be 1.
-+- #size-cells:			Should be 0.
-+
-+Example:
-+
-+	nandc: nfi at 1100d000 {
-+		compatible = "mediatek,mt2701-nfc";
-+		reg = <0 0x1100d000 0 0x1000>;
-+		interrupts = <GIC_SPI 56 IRQ_TYPE_LEVEL_LOW>;
-+		clocks = <&pericfg CLK_PERI_NFI>,
-+			 <&pericfg CLK_PERI_NFI_PAD>;
-+		clock-names = "nfi_clk", "pad_clk";
-+		status = "disabled";
-+		ecc-engine = <&bch>;
-+		#address-cells = <1>;
-+		#size-cells = <0>;
-+        };
-+
-+Platform related properties, should be set in {platform_name}.dts:
-+- children nodes:	NAND chips.
-+
-+Children nodes properties:
-+- reg:			Chip Select Signal, default 0.
-+			Set as reg = <0>, <1> when need 2 CS.
-+Optional:
-+- nand-on-flash-bbt:	Store BBT on NAND Flash.
-+- nand-ecc-mode:	the NAND ecc mode (check driver for supported modes)
-+- nand-ecc-step-size:	Number of data bytes covered by a single ECC step.
-+			The controller only supports 512 and 1024.
-+			For large page NANDs ther recommended value is 1024.
-+- nand-ecc-strength:	Number of bits to correct per ECC step.
-+			The valid values that the controller supports are: 4, 6,
-+			8, 10, 12, 14, 16, 18, 20, 22, 24, 28, 32, 36, 40, 44,
-+			48, 52, 56, 60.
-+			The strength should be calculated as follows:
-+			E = (S - F) * 8 / 14
-+			S = O / (P / Q)
-+				E :nand-ecc-strength;
-+				S :spare size per sector;
-+				F : FDM size, should be in the range [1,8].
-+				    It is used to store free oob data.
-+				O : oob size;
-+				P : page size;
-+				Q :nand-ecc-step-size
-+			If the result does not match any one of the listed
-+			choices above, please select the smaller valid value from
-+			the list.
-+			(otherwise the driver will do the clamping at runtime).
-+- vmch-supply:		NAND power supply.
-+- pinctrl-names:	Default NAND pin GPIO setting name.
-+- pinctrl-0:		GPIO setting node.
-+
-+Example:
-+	&pio {
-+		nand_pins_default: nanddefault {
-+			pins_dat {
-+				pinmux = <MT2701_PIN_111_MSDC0_DAT7__FUNC_NLD7>,
-+					 <MT2701_PIN_112_MSDC0_DAT6__FUNC_NLD6>,
-+					 <MT2701_PIN_114_MSDC0_DAT4__FUNC_NLD4>,
-+					 <MT2701_PIN_118_MSDC0_DAT3__FUNC_NLD3>,
-+					 <MT2701_PIN_121_MSDC0_DAT0__FUNC_NLD0>,
-+					 <MT2701_PIN_120_MSDC0_DAT1__FUNC_NLD1>,
-+					 <MT2701_PIN_113_MSDC0_DAT5__FUNC_NLD5>,
-+					 <MT2701_PIN_115_MSDC0_RSTB__FUNC_NLD8>,
-+					 <MT2701_PIN_119_MSDC0_DAT2__FUNC_NLD2>;
-+				input-enable;
-+				drive-strength = <MTK_DRIVE_8mA>;
-+				bias-pull-up;
-+			};
-+
-+			pins_we {
-+				pinmux = <MT2701_PIN_117_MSDC0_CLK__FUNC_NWEB>;
-+				drive-strength = <MTK_DRIVE_8mA>;
-+				bias-pull-up = <MTK_PUPD_SET_R1R0_10>;
-+			};
-+
-+			pins_ale {
-+				pinmux = <MT2701_PIN_116_MSDC0_CMD__FUNC_NALE>;
-+				drive-strength = <MTK_DRIVE_8mA>;
-+				bias-pull-down = <MTK_PUPD_SET_R1R0_10>;
-+			};
-+		};
-+	};
-+
-+	&nandc {
-+		status = "okay";
-+		pinctrl-names = "default";
-+		pinctrl-0 = <&nand_pins_default>;
-+		nand at 0 {
-+			reg = <0>;
-+			nand-on-flash-bbt;
-+			nand-ecc-mode = "hw";
-+			nand-ecc-strength = <24>;
-+			nand-ecc-step-size = <1024>;
-+		};
-+	};
-+
-+NAND chip optional subnodes:
-+- Partitions, see Documentation/devicetree/bindings/mtd/partition.txt
-+
-+Example:
-+	nand at 0 {
-+		partitions {
-+			compatible = "fixed-partitions";
-+			#address-cells = <1>;
-+			#size-cells = <1>;
-+
-+			preloader at 0 {
-+				label = "pl";
-+				read-only;
-+				reg = <0x00000000 0x00400000>;
-+			};
-+			android at 0x00400000 {
-+				label = "android";
-+				reg = <0x00400000 0x12c00000>;
-+			};
-+		};
-+	};
-+
-+2) ECC Engine:
-+==============
-+
-+Required BCH properties:
-+- compatible:	Should be "mediatek,mtxxxx-ecc".
-+- reg:		Base physical address and size of ECC.
-+- interrupts:	Interrupts of ECC.
-+- clocks:	ECC required clocks.
-+- clock-names:	ECC clocks internal name.
-+- status:	Disabled default. Then set "okay" by platform.
-+
-+Example:
-+
-+	bch: ecc at 1100e000 {
-+		compatible = "mediatek,mt2701-ecc";
-+		reg = <0 0x1100e000 0 0x1000>;
-+		interrupts = <GIC_SPI 55 IRQ_TYPE_LEVEL_LOW>;
-+		clocks = <&pericfg CLK_PERI_NFI_ECC>;
-+		clock-names = "nfiecc_clk";
-+		status = "disabled";
-+	};
diff --git a/target/linux/mediatek/patches-4.4/0075-mtd-mediatek-driver-for-MTK-Smart-Device-Gen1-NAND.patch b/target/linux/mediatek/patches-4.4/0075-mtd-mediatek-driver-for-MTK-Smart-Device-Gen1-NAND.patch
deleted file mode 100644
index e5312eb..0000000
--- a/target/linux/mediatek/patches-4.4/0075-mtd-mediatek-driver-for-MTK-Smart-Device-Gen1-NAND.patch
+++ /dev/null
@@ -1,2064 +0,0 @@
-From de18239fc971cfc17c53320c66ae64dd5ade032d Mon Sep 17 00:00:00 2001
-From: Jorge Ramirez-Ortiz <jorge.ramirez-ortiz at linaro.org>
-Date: Fri, 29 Apr 2016 12:17:22 -0400
-Subject: [PATCH 075/102] mtd: mediatek: driver for MTK Smart Device Gen1 NAND
-
-This patch adds support for mediatek's SDG1 NFC nand controller
-embedded in SoC 2701
-
-Signed-off-by: Jorge Ramirez-Ortiz <jorge.ramirez-ortiz at linaro.org>
----
- drivers/mtd/nand/Kconfig    |    7 +
- drivers/mtd/nand/Makefile   |    1 +
- drivers/mtd/nand/mtk_ecc.c  |  527 ++++++++++++++++
- drivers/mtd/nand/mtk_ecc.h  |   53 ++
- drivers/mtd/nand/mtk_nand.c | 1432 +++++++++++++++++++++++++++++++++++++++++++
- 5 files changed, 2020 insertions(+)
- create mode 100644 drivers/mtd/nand/mtk_ecc.c
- create mode 100644 drivers/mtd/nand/mtk_ecc.h
- create mode 100644 drivers/mtd/nand/mtk_nand.c
-
---- a/drivers/mtd/nand/Kconfig
-+++ b/drivers/mtd/nand/Kconfig
-@@ -563,4 +563,11 @@ config MTD_NAND_QCOM
- 	  Enables support for NAND flash chips on SoCs containing the EBI2 NAND
- 	  controller. This controller is found on IPQ806x SoC.
- 
-+config MTD_NAND_MTK
-+	tristate "Support for NAND controller on MTK SoCs"
-+	depends on HAS_DMA
-+	help
-+	  Enables support for NAND controller on MTK SoCs.
-+	  This controller is found on mt27xx, mt81xx, mt65xx SoCs.
-+
- endif # MTD_NAND
---- a/drivers/mtd/nand/Makefile
-+++ b/drivers/mtd/nand/Makefile
-@@ -57,5 +57,6 @@ obj-$(CONFIG_MTD_NAND_SUNXI)		+= sunxi_n
- obj-$(CONFIG_MTD_NAND_HISI504)	        += hisi504_nand.o
- obj-$(CONFIG_MTD_NAND_BRCMNAND)		+= brcmnand/
- obj-$(CONFIG_MTD_NAND_QCOM)		+= qcom_nandc.o
-+obj-$(CONFIG_MTD_NAND_MTK)		+= mtk_nand.o mtk_ecc.o
- 
- nand-objs := nand_base.o nand_bbt.o nand_timings.o
---- /dev/null
-+++ b/drivers/mtd/nand/mtk_ecc.c
-@@ -0,0 +1,527 @@
-+/*
-+ * MTK ECC controller driver.
-+ * Copyright (C) 2016  MediaTek Inc.
-+ * Authors:	Xiaolei Li		<xiaolei.li at mediatek.com>
-+ *		Jorge Ramirez-Ortiz	<jorge.ramirez-ortiz at linaro.org>
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 as
-+ * published by the Free Software Foundation.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ */
-+
-+#include <linux/platform_device.h>
-+#include <linux/dma-mapping.h>
-+#include <linux/interrupt.h>
-+#include <linux/clk.h>
-+#include <linux/module.h>
-+#include <linux/iopoll.h>
-+#include <linux/of.h>
-+#include <linux/of_platform.h>
-+#include <linux/semaphore.h>
-+
-+#include "mtk_ecc.h"
-+
-+#define ECC_ENCCON		(0x00)
-+#define		ENC_EN			(1)
-+#define		ENC_DE			(0)
-+#define ECC_ENCCNFG		(0x04)
-+#define		ECC_CNFG_4BIT		(0)
-+#define		ECC_CNFG_6BIT		(1)
-+#define		ECC_CNFG_8BIT		(2)
-+#define		ECC_CNFG_10BIT		(3)
-+#define		ECC_CNFG_12BIT		(4)
-+#define		ECC_CNFG_14BIT		(5)
-+#define		ECC_CNFG_16BIT		(6)
-+#define		ECC_CNFG_18BIT		(7)
-+#define		ECC_CNFG_20BIT		(8)
-+#define		ECC_CNFG_22BIT		(9)
-+#define		ECC_CNFG_24BIT		(0xa)
-+#define		ECC_CNFG_28BIT		(0xb)
-+#define		ECC_CNFG_32BIT		(0xc)
-+#define		ECC_CNFG_36BIT		(0xd)
-+#define		ECC_CNFG_40BIT		(0xe)
-+#define		ECC_CNFG_44BIT		(0xf)
-+#define		ECC_CNFG_48BIT		(0x10)
-+#define		ECC_CNFG_52BIT		(0x11)
-+#define		ECC_CNFG_56BIT		(0x12)
-+#define		ECC_CNFG_60BIT		(0x13)
-+#define		ECC_MODE_SHIFT		(5)
-+#define		ECC_MS_SHIFT		(16)
-+#define ECC_ENCDIADDR		(0x08)
-+#define ECC_ENCIDLE		(0x0C)
-+#define		ENC_IDLE		BIT(0)
-+#define ECC_ENCPAR(x)		(0x10 + (x) * sizeof(u32))
-+#define ECC_ENCIRQ_EN		(0x80)
-+#define		ENC_IRQEN		BIT(0)
-+#define ECC_ENCIRQ_STA		(0x84)
-+#define ECC_DECCON		(0x100)
-+#define		DEC_EN			(1)
-+#define		DEC_DE			(0)
-+#define ECC_DECCNFG		(0x104)
-+#define		DEC_EMPTY_EN		BIT(31)
-+#define		DEC_CNFG_CORRECT	(0x3 << 12)
-+#define ECC_DECIDLE		(0x10C)
-+#define		DEC_IDLE		BIT(0)
-+#define ECC_DECENUM0		(0x114)
-+#define		ERR_MASK		(0x3f)
-+#define ECC_DECDONE		(0x124)
-+#define ECC_DECIRQ_EN		(0x200)
-+#define		DEC_IRQEN		BIT(0)
-+#define ECC_DECIRQ_STA		(0x204)
-+
-+#define ECC_TIMEOUT		(500000)
-+
-+#define ECC_IDLE_REG(x)		((x) == ECC_ENC ? ECC_ENCIDLE : ECC_DECIDLE)
-+#define ECC_IDLE_MASK(x)	((x) == ECC_ENC ? ENC_IDLE : DEC_IDLE)
-+#define ECC_IRQ_REG(x)		((x) == ECC_ENC ? ECC_ENCIRQ_EN : ECC_DECIRQ_EN)
-+#define ECC_IRQ_EN(x)		((x) == ECC_ENC ? ENC_IRQEN : DEC_IRQEN)
-+#define ECC_CTL_REG(x)		((x) == ECC_ENC ? ECC_ENCCON : ECC_DECCON)
-+#define ECC_CODEC_ENABLE(x)	((x) == ECC_ENC ? ENC_EN : DEC_EN)
-+#define ECC_CODEC_DISABLE(x)	((x) == ECC_ENC ? ENC_DE : DEC_DE)
-+
-+struct mtk_ecc {
-+	struct device *dev;
-+	void __iomem *regs;
-+	struct clk *clk;
-+
-+	struct completion done;
-+	struct semaphore sem;
-+	u32 sec_mask;
-+};
-+
-+static inline void mtk_ecc_codec_wait_idle(struct mtk_ecc *ecc,
-+					enum mtk_ecc_codec codec)
-+{
-+	struct device *dev = ecc->dev;
-+	u32 val;
-+	int ret;
-+
-+	ret = readl_poll_timeout_atomic(ecc->regs + ECC_IDLE_REG(codec), val,
-+					val & ECC_IDLE_MASK(codec),
-+					10, ECC_TIMEOUT);
-+	if (ret)
-+		dev_warn(dev, "%s NOT idle\n",
-+			codec == ECC_ENC ? "encoder" : "decoder");
-+}
-+
-+static irqreturn_t mtk_ecc_irq(int irq, void *id)
-+{
-+	struct mtk_ecc *ecc = id;
-+	enum mtk_ecc_codec codec;
-+	u32 dec, enc;
-+
-+	dec = readw(ecc->regs + ECC_DECIRQ_STA) & DEC_IRQEN;
-+	if (dec) {
-+		codec = ECC_DEC;
-+		dec = readw(ecc->regs + ECC_DECDONE);
-+		if (dec & ecc->sec_mask) {
-+			ecc->sec_mask = 0;
-+			complete(&ecc->done);
-+		} else
-+			return IRQ_HANDLED;
-+	} else {
-+		enc = readl(ecc->regs + ECC_ENCIRQ_STA) & ENC_IRQEN;
-+		if (enc) {
-+			codec = ECC_ENC;
-+			complete(&ecc->done);
-+		} else
-+			return IRQ_NONE;
-+	}
-+
-+	writel(0, ecc->regs + ECC_IRQ_REG(codec));
-+
-+	return IRQ_HANDLED;
-+}
-+
-+static void mtk_ecc_config(struct mtk_ecc *ecc, struct mtk_ecc_config *config)
-+{
-+	u32 ecc_bit = ECC_CNFG_4BIT, dec_sz, enc_sz;
-+	u32 reg;
-+
-+	switch (config->strength) {
-+	case 4:
-+		ecc_bit = ECC_CNFG_4BIT;
-+		break;
-+	case 6:
-+		ecc_bit = ECC_CNFG_6BIT;
-+		break;
-+	case 8:
-+		ecc_bit = ECC_CNFG_8BIT;
-+		break;
-+	case 10:
-+		ecc_bit = ECC_CNFG_10BIT;
-+		break;
-+	case 12:
-+		ecc_bit = ECC_CNFG_12BIT;
-+		break;
-+	case 14:
-+		ecc_bit = ECC_CNFG_14BIT;
-+		break;
-+	case 16:
-+		ecc_bit = ECC_CNFG_16BIT;
-+		break;
-+	case 18:
-+		ecc_bit = ECC_CNFG_18BIT;
-+		break;
-+	case 20:
-+		ecc_bit = ECC_CNFG_20BIT;
-+		break;
-+	case 22:
-+		ecc_bit = ECC_CNFG_22BIT;
-+		break;
-+	case 24:
-+		ecc_bit = ECC_CNFG_24BIT;
-+		break;
-+	case 28:
-+		ecc_bit = ECC_CNFG_28BIT;
-+		break;
-+	case 32:
-+		ecc_bit = ECC_CNFG_32BIT;
-+		break;
-+	case 36:
-+		ecc_bit = ECC_CNFG_36BIT;
-+		break;
-+	case 40:
-+		ecc_bit = ECC_CNFG_40BIT;
-+		break;
-+	case 44:
-+		ecc_bit = ECC_CNFG_44BIT;
-+		break;
-+	case 48:
-+		ecc_bit = ECC_CNFG_48BIT;
-+		break;
-+	case 52:
-+		ecc_bit = ECC_CNFG_52BIT;
-+		break;
-+	case 56:
-+		ecc_bit = ECC_CNFG_56BIT;
-+		break;
-+	case 60:
-+		ecc_bit = ECC_CNFG_60BIT;
-+		break;
-+	default:
-+		dev_err(ecc->dev, "invalid strength %d\n", config->strength);
-+	}
-+
-+	if (config->codec == ECC_ENC) {
-+		/* configure ECC encoder (in bits) */
-+		enc_sz = config->enc_len << 3;
-+
-+		reg = ecc_bit | (config->ecc_mode << ECC_MODE_SHIFT);
-+		reg |= (enc_sz << ECC_MS_SHIFT);
-+		writel(reg, ecc->regs + ECC_ENCCNFG);
-+
-+		if (config->ecc_mode != ECC_NFI_MODE)
-+			writel(lower_32_bits(config->addr),
-+				ecc->regs + ECC_ENCDIADDR);
-+
-+	} else {
-+		/* configure ECC decoder (in bits) */
-+		dec_sz = config->dec_len;
-+
-+		reg = ecc_bit | (config->ecc_mode << ECC_MODE_SHIFT);
-+		reg |= (dec_sz << ECC_MS_SHIFT) | DEC_CNFG_CORRECT;
-+		reg |= DEC_EMPTY_EN;
-+		writel(reg, ecc->regs + ECC_DECCNFG);
-+
-+		if (config->sec_mask)
-+			ecc->sec_mask = 1 << (config->sec_mask - 1);
-+	}
-+}
-+
-+void mtk_ecc_get_stats(struct mtk_ecc *ecc, struct mtk_ecc_stats *stats,
-+			int sectors)
-+{
-+	u32 offset, i, err;
-+	u32 bitflips = 0;
-+
-+	stats->corrected = 0;
-+	stats->failed = 0;
-+
-+	for (i = 0; i < sectors; i++) {
-+		offset = (i >> 2) << 2;
-+		err = readl(ecc->regs + ECC_DECENUM0 + offset);
-+		err = err >> ((i % 4) * 8);
-+		err &= ERR_MASK;
-+		if (err == ERR_MASK) {
-+			/* uncorrectable errors */
-+			stats->failed++;
-+			continue;
-+		}
-+
-+		stats->corrected += err;
-+		bitflips = max_t(u32, bitflips, err);
-+	}
-+
-+	stats->bitflips = bitflips;
-+}
-+EXPORT_SYMBOL(mtk_ecc_get_stats);
-+
-+void mtk_ecc_release(struct mtk_ecc *ecc)
-+{
-+	clk_disable_unprepare(ecc->clk);
-+	put_device(ecc->dev);
-+}
-+EXPORT_SYMBOL(mtk_ecc_release);
-+
-+static struct mtk_ecc *mtk_ecc_get(struct device_node *np)
-+{
-+	struct platform_device *pdev;
-+	struct mtk_ecc *ecc;
-+
-+	pdev = of_find_device_by_node(np);
-+	if (!pdev || !platform_get_drvdata(pdev))
-+		return ERR_PTR(-EPROBE_DEFER);
-+
-+	get_device(&pdev->dev);
-+	ecc = platform_get_drvdata(pdev);
-+	clk_prepare_enable(ecc->clk);
-+	mtk_ecc_hw_init(ecc);
-+
-+	return ecc;
-+}
-+
-+struct mtk_ecc *of_mtk_ecc_get(struct device_node *of_node)
-+{
-+	struct mtk_ecc *ecc = NULL;
-+	struct device_node *np;
-+
-+	np = of_parse_phandle(of_node, "ecc-engine", 0);
-+	if (np) {
-+		ecc = mtk_ecc_get(np);
-+		of_node_put(np);
-+	}
-+
-+	return ecc;
-+}
-+EXPORT_SYMBOL(of_mtk_ecc_get);
-+
-+int mtk_ecc_enable(struct mtk_ecc *ecc, struct mtk_ecc_config *config)
-+{
-+	enum mtk_ecc_codec codec = config->codec;
-+	int ret;
-+
-+	ret = down_interruptible(&ecc->sem);
-+	if (ret) {
-+		dev_err(ecc->dev, "interrupted when attempting to lock\n");
-+		return ret;
-+	}
-+
-+	mtk_ecc_codec_wait_idle(ecc, codec);
-+	mtk_ecc_config(ecc, config);
-+	writew(ECC_CODEC_ENABLE(codec), ecc->regs + ECC_CTL_REG(codec));
-+
-+	init_completion(&ecc->done);
-+	writew(ECC_IRQ_EN(codec), ecc->regs + ECC_IRQ_REG(codec));
-+
-+	return 0;
-+}
-+EXPORT_SYMBOL(mtk_ecc_enable);
-+
-+void mtk_ecc_disable(struct mtk_ecc *ecc, struct mtk_ecc_config *config)
-+{
-+	enum mtk_ecc_codec codec = config->codec;
-+
-+	mtk_ecc_codec_wait_idle(ecc, codec);
-+	writew(0, ecc->regs + ECC_IRQ_REG(codec));
-+	writew(ECC_CODEC_DISABLE(codec), ecc->regs + ECC_CTL_REG(codec));
-+	up(&ecc->sem);
-+}
-+EXPORT_SYMBOL(mtk_ecc_disable);
-+
-+int mtk_ecc_wait_irq_done(struct mtk_ecc *ecc, enum mtk_ecc_codec codec)
-+{
-+	int ret;
-+
-+	ret = wait_for_completion_timeout(&ecc->done, msecs_to_jiffies(500));
-+	if (!ret) {
-+		dev_err(ecc->dev, "%s timeout - interrupt did not arrive)\n",
-+				(codec == ECC_ENC) ? "encoder" : "decoder");
-+		return -ETIMEDOUT;
-+	}
-+
-+	return 0;
-+}
-+EXPORT_SYMBOL(mtk_ecc_wait_irq_done);
-+
-+int mtk_ecc_encode_non_nfi_mode(struct mtk_ecc *ecc,
-+			struct mtk_ecc_config *config, u8 *data, u32 bytes)
-+{
-+	dma_addr_t addr;
-+	u32 *p, len, i;
-+	int ret = 0;
-+
-+	addr = dma_map_single(ecc->dev, data, bytes, DMA_TO_DEVICE);
-+	ret = dma_mapping_error(ecc->dev, addr);
-+	if (ret) {
-+		dev_err(ecc->dev, "dma mapping error\n");
-+		return -EINVAL;
-+	}
-+
-+	config->codec = ECC_ENC;
-+	config->addr = addr;
-+	ret = mtk_ecc_enable(ecc, config);
-+	if (ret) {
-+		dma_unmap_single(ecc->dev, addr, bytes, DMA_TO_DEVICE);
-+		return ret;
-+	}
-+
-+	ret = mtk_ecc_wait_irq_done(ecc, ECC_ENC);
-+	if (ret)
-+		goto timeout;
-+
-+	mtk_ecc_codec_wait_idle(ecc, ECC_ENC);
-+
-+	/* Program ECC bytes to OOB: per sector oob = FDM + ECC + SPARE */
-+	len = (config->strength * ECC_PARITY_BITS + 7) >> 3;
-+	p = (u32 *) (data + bytes);
-+
-+	/* write the parity bytes generated by the ECC back to the OOB region */
-+	for (i = 0; i < len; i++)
-+		p[i] = readl(ecc->regs + ECC_ENCPAR(i));
-+timeout:
-+
-+	dma_unmap_single(ecc->dev, addr, bytes, DMA_TO_DEVICE);
-+	mtk_ecc_disable(ecc, config);
-+
-+	return ret;
-+}
-+EXPORT_SYMBOL(mtk_ecc_encode_non_nfi_mode);
-+
-+void mtk_ecc_hw_init(struct mtk_ecc *ecc)
-+{
-+	mtk_ecc_codec_wait_idle(ecc, ECC_ENC);
-+	writew(ENC_DE, ecc->regs + ECC_ENCCON);
-+
-+	mtk_ecc_codec_wait_idle(ecc, ECC_DEC);
-+	writel(DEC_DE, ecc->regs + ECC_DECCON);
-+}
-+
-+void mtk_ecc_update_strength(u32 *p)
-+{
-+	u32 ecc[] = {4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 28, 32, 36,
-+			40, 44, 48, 52, 56, 60};
-+	int i;
-+
-+	for (i = 0; i < ARRAY_SIZE(ecc); i++) {
-+		if (*p <= ecc[i]) {
-+			if (!i)
-+				*p = ecc[i];
-+			else if (*p != ecc[i])
-+				*p = ecc[i - 1];
-+			return;
-+		}
-+	}
-+
-+	*p = ecc[ARRAY_SIZE(ecc) - 1];
-+}
-+EXPORT_SYMBOL(mtk_ecc_update_strength);
-+
-+static int mtk_ecc_probe(struct platform_device *pdev)
-+{
-+	struct device *dev = &pdev->dev;
-+	struct mtk_ecc *ecc;
-+	struct resource *res;
-+	int irq, ret;
-+
-+	ecc = devm_kzalloc(dev, sizeof(*ecc), GFP_KERNEL);
-+	if (!ecc)
-+		return -ENOMEM;
-+
-+	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-+	ecc->regs = devm_ioremap_resource(dev, res);
-+	if (IS_ERR(ecc->regs)) {
-+		dev_err(dev, "failed to map regs: %ld\n", PTR_ERR(ecc->regs));
-+		return PTR_ERR(ecc->regs);
-+	}
-+
-+	ecc->clk = devm_clk_get(dev, NULL);
-+	if (IS_ERR(ecc->clk)) {
-+		dev_err(dev, "failed to get clock: %ld\n", PTR_ERR(ecc->clk));
-+		return PTR_ERR(ecc->clk);
-+	}
-+
-+	irq = platform_get_irq(pdev, 0);
-+	if (irq < 0) {
-+		dev_err(dev, "failed to get irq\n");
-+		return -EINVAL;
-+	}
-+
-+	ret = dma_set_mask(dev, DMA_BIT_MASK(32));
-+	if (ret) {
-+		dev_err(dev, "failed to set DMA mask\n");
-+		return ret;
-+	}
-+
-+	ret = devm_request_irq(dev, irq, mtk_ecc_irq, 0x0, "mtk-ecc", ecc);
-+	if (ret) {
-+		dev_err(dev, "failed to request irq\n");
-+		return -EINVAL;
-+	}
-+
-+	ecc->dev = dev;
-+	sema_init(&ecc->sem, 1);
-+	platform_set_drvdata(pdev, ecc);
-+	dev_info(dev, "probed\n");
-+
-+	return 0;
-+}
-+
-+#ifdef CONFIG_PM_SLEEP
-+static int mtk_ecc_suspend(struct device *dev)
-+{
-+	struct mtk_ecc *ecc = dev_get_drvdata(dev);
-+
-+	clk_disable_unprepare(ecc->clk);
-+
-+	return 0;
-+}
-+
-+static int mtk_ecc_resume(struct device *dev)
-+{
-+	struct mtk_ecc *ecc = dev_get_drvdata(dev);
-+	int ret;
-+
-+	ret = clk_prepare_enable(ecc->clk);
-+	if (ret) {
-+		dev_err(dev, "failed to enable clk\n");
-+		return ret;
-+	}
-+
-+	mtk_ecc_hw_init(ecc);
-+
-+	return 0;
-+}
-+
-+static SIMPLE_DEV_PM_OPS(mtk_ecc_pm_ops, mtk_ecc_suspend, mtk_ecc_resume);
-+#endif
-+
-+static const struct of_device_id mtk_ecc_dt_match[] = {
-+	{ .compatible = "mediatek,mt2701-ecc" },
-+	{},
-+};
-+
-+MODULE_DEVICE_TABLE(of, mtk_ecc_dt_match);
-+
-+static struct platform_driver mtk_ecc_driver = {
-+	.probe  = mtk_ecc_probe,
-+	.driver = {
-+		.name  = "mtk-ecc",
-+		.of_match_table = of_match_ptr(mtk_ecc_dt_match),
-+#ifdef CONFIG_PM_SLEEP
-+		.pm = &mtk_ecc_pm_ops,
-+#endif
-+	},
-+};
-+
-+module_platform_driver(mtk_ecc_driver);
-+
-+MODULE_AUTHOR("Xiaolei Li <xiaolei.li at mediatek.com>");
-+MODULE_AUTHOR("Jorge Ramirez-Ortiz <jorge.ramirez-ortiz at linaro.org>");
-+MODULE_DESCRIPTION("MTK Nand ECC Driver");
-+MODULE_LICENSE("GPL");
---- /dev/null
-+++ b/drivers/mtd/nand/mtk_ecc.h
-@@ -0,0 +1,53 @@
-+/*
-+ * MTK SDG1 ECC controller
-+ *
-+ * Copyright (c) 2016 Mediatek
-+ * Authors:	Xiaolei Li		<xiaolei.li at mediatek.com>
-+ *		Jorge Ramirez-Ortiz	<jorge.ramirez-ortiz at linaro.org>
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published
-+ * by the Free Software Foundation.
-+ */
-+
-+#ifndef __DRIVERS_MTD_NAND_MTK_ECC_H__
-+#define __DRIVERS_MTD_NAND_MTK_ECC_H__
-+
-+#include <linux/types.h>
-+
-+#define ECC_PARITY_BITS		(14)
-+
-+enum mtk_ecc_mode {ECC_DMA_MODE = 0, ECC_NFI_MODE = 1};
-+enum mtk_ecc_codec {ECC_ENC, ECC_DEC};
-+
-+struct device_node;
-+struct mtk_ecc;
-+
-+struct mtk_ecc_stats {
-+	u32 corrected;
-+	u32 bitflips;
-+	u32 failed;
-+};
-+
-+struct mtk_ecc_config {
-+	enum mtk_ecc_mode ecc_mode;
-+	enum mtk_ecc_codec codec;
-+	dma_addr_t addr;
-+	u32 sec_mask;
-+	u32 strength;
-+	u32 enc_len;
-+	u32 dec_len;
-+};
-+
-+int mtk_ecc_enable(struct mtk_ecc *, struct mtk_ecc_config *);
-+void mtk_ecc_disable(struct mtk_ecc *, struct mtk_ecc_config *);
-+int mtk_ecc_encode_non_nfi_mode(struct mtk_ecc *, struct mtk_ecc_config *,
-+				u8 *, u32);
-+void mtk_ecc_get_stats(struct mtk_ecc *, struct mtk_ecc_stats *, int);
-+int mtk_ecc_wait_irq_done(struct mtk_ecc *, enum mtk_ecc_codec);
-+void mtk_ecc_hw_init(struct mtk_ecc *);
-+void mtk_ecc_update_strength(u32 *);
-+
-+struct mtk_ecc *of_mtk_ecc_get(struct device_node *);
-+void mtk_ecc_release(struct mtk_ecc *);
-+
-+#endif
---- /dev/null
-+++ b/drivers/mtd/nand/mtk_nand.c
-@@ -0,0 +1,1432 @@
-+/*
-+ * MTK NAND Flash controller driver.
-+ * Copyright (C) 2016 MediaTek Inc.
-+ * Authors:	Xiaolei Li		<xiaolei.li at mediatek.com>
-+ *		Jorge Ramirez-Ortiz	<jorge.ramirez-ortiz at linaro.org>
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 as
-+ * published by the Free Software Foundation.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ */
-+
-+#include <linux/platform_device.h>
-+#include <linux/dma-mapping.h>
-+#include <linux/interrupt.h>
-+#include <linux/delay.h>
-+#include <linux/clk.h>
-+#include <linux/mtd/nand.h>
-+#include <linux/mtd/mtd.h>
-+#include <linux/module.h>
-+#include <linux/iopoll.h>
-+#include <linux/of.h>
-+#include "mtk_ecc.h"
-+
-+/* NAND controller register definition */
-+#define NFI_CNFG		(0x00)
-+#define		CNFG_AHB		BIT(0)
-+#define		CNFG_READ_EN		BIT(1)
-+#define		CNFG_DMA_BURST_EN	BIT(2)
-+#define		CNFG_BYTE_RW		BIT(6)
-+#define		CNFG_HW_ECC_EN		BIT(8)
-+#define		CNFG_AUTO_FMT_EN	BIT(9)
-+#define		CNFG_OP_CUST		(6 << 12)
-+#define NFI_PAGEFMT		(0x04)
-+#define		PAGEFMT_FDM_ECC_SHIFT	(12)
-+#define		PAGEFMT_FDM_SHIFT	(8)
-+#define		PAGEFMT_SPARE_16	(0)
-+#define		PAGEFMT_SPARE_26	(1)
-+#define		PAGEFMT_SPARE_27	(2)
-+#define		PAGEFMT_SPARE_28	(3)
-+#define		PAGEFMT_SPARE_32	(4)
-+#define		PAGEFMT_SPARE_36	(5)
-+#define		PAGEFMT_SPARE_40	(6)
-+#define		PAGEFMT_SPARE_44	(7)
-+#define		PAGEFMT_SPARE_48	(8)
-+#define		PAGEFMT_SPARE_49	(9)
-+#define		PAGEFMT_SPARE_50	(0xa)
-+#define		PAGEFMT_SPARE_51	(0xb)
-+#define		PAGEFMT_SPARE_52	(0xc)
-+#define		PAGEFMT_SPARE_62	(0xd)
-+#define		PAGEFMT_SPARE_63	(0xe)
-+#define		PAGEFMT_SPARE_64	(0xf)
-+#define		PAGEFMT_SPARE_SHIFT	(4)
-+#define		PAGEFMT_SEC_SEL_512	BIT(2)
-+#define		PAGEFMT_512_2K		(0)
-+#define		PAGEFMT_2K_4K		(1)
-+#define		PAGEFMT_4K_8K		(2)
-+#define		PAGEFMT_8K_16K		(3)
-+/* NFI control */
-+#define NFI_CON			(0x08)
-+#define		CON_FIFO_FLUSH		BIT(0)
-+#define		CON_NFI_RST		BIT(1)
-+#define		CON_BRD			BIT(8)  /* burst  read */
-+#define		CON_BWR			BIT(9)	/* burst  write */
-+#define		CON_SEC_SHIFT		(12)
-+/* Timming control register */
-+#define NFI_ACCCON		(0x0C)
-+#define NFI_INTR_EN		(0x10)
-+#define		INTR_AHB_DONE_EN	BIT(6)
-+#define NFI_INTR_STA		(0x14)
-+#define NFI_CMD			(0x20)
-+#define NFI_ADDRNOB		(0x30)
-+#define NFI_COLADDR		(0x34)
-+#define NFI_ROWADDR		(0x38)
-+#define NFI_STRDATA		(0x40)
-+#define		STAR_EN			(1)
-+#define		STAR_DE			(0)
-+#define NFI_CNRNB		(0x44)
-+#define NFI_DATAW		(0x50)
-+#define NFI_DATAR		(0x54)
-+#define NFI_PIO_DIRDY		(0x58)
-+#define		PIO_DI_RDY		(0x01)
-+#define NFI_STA			(0x60)
-+#define		STA_CMD			BIT(0)
-+#define		STA_ADDR		BIT(1)
-+#define		STA_BUSY		BIT(8)
-+#define		STA_EMP_PAGE		BIT(12)
-+#define		NFI_FSM_CUSTDATA	(0xe << 16)
-+#define		NFI_FSM_MASK		(0xf << 16)
-+#define NFI_ADDRCNTR		(0x70)
-+#define		CNTR_MASK		GENMASK(16, 12)
-+#define NFI_STRADDR		(0x80)
-+#define NFI_BYTELEN		(0x84)
-+#define NFI_CSEL		(0x90)
-+#define NFI_FDML(x)		(0xA0 + (x) * sizeof(u32) * 2)
-+#define NFI_FDMM(x)		(0xA4 + (x) * sizeof(u32) * 2)
-+#define NFI_FDM_MAX_SIZE	(8)
-+#define NFI_MASTER_STA		(0x224)
-+#define		MASTER_STA_MASK		(0x0FFF)
-+#define NFI_EMPTY_THRESH	(0x23C)
-+
-+#define MTK_NAME		"mtk-nand"
-+#define KB(x)			((x) * 1024UL)
-+#define MB(x)			(KB(x) * 1024UL)
-+
-+#define MTK_TIMEOUT		(500000)
-+#define MTK_RESET_TIMEOUT	(1000000)
-+#define MTK_MAX_SECTOR		(16)
-+#define MTK_NAND_MAX_NSELS	(2)
-+
-+typedef void (*bad_mark_swap)(struct mtd_info *, uint8_t *buf, int raw);
-+struct mtk_nfc_bad_mark_ctl {
-+	bad_mark_swap bm_swap;
-+	u32 sec;
-+	u32 pos;
-+};
-+
-+/*
-+ * FDM: region used to store free OOB data
-+ */
-+struct mtk_nfc_fdm {
-+	u32 reg_size;
-+	u32 ecc_size;
-+};
-+
-+struct mtk_nfc_nand_chip {
-+	struct list_head node;
-+	struct nand_chip nand;
-+
-+	struct mtk_nfc_bad_mark_ctl bad_mark;
-+	struct mtk_nfc_fdm fdm;
-+	u32 spare_per_sector;
-+
-+	int nsels;
-+	u8 sels[0];
-+	/* nothing after this field */
-+};
-+
-+struct mtk_nfc_clk {
-+	struct clk *nfi_clk;
-+	struct clk *pad_clk;
-+};
-+
-+struct mtk_nfc {
-+	struct nand_hw_control controller;
-+	struct mtk_ecc_config ecc_cfg;
-+	struct mtk_nfc_clk clk;
-+	struct mtk_ecc *ecc;
-+
-+	struct device *dev;
-+	void __iomem *regs;
-+
-+	struct completion done;
-+	struct list_head chips;
-+
-+	u8 *buffer;
-+};
-+
-+static inline struct mtk_nfc_nand_chip *to_mtk_nand(struct nand_chip *nand)
-+{
-+	return container_of(nand, struct mtk_nfc_nand_chip, nand);
-+}
-+
-+static inline uint8_t *data_ptr(struct nand_chip *chip, const uint8_t *p, int i)
-+{
-+	return (uint8_t *) p + i * chip->ecc.size;
-+}
-+
-+static inline uint8_t *oob_ptr(struct nand_chip *chip, int i)
-+{
-+	struct mtk_nfc_nand_chip *mtk_nand = to_mtk_nand(chip);
-+	uint8_t *poi;
-+
-+	if (i < mtk_nand->bad_mark.sec)
-+		poi = chip->oob_poi + (i + 1) * mtk_nand->fdm.reg_size;
-+	else if (i == mtk_nand->bad_mark.sec)
-+		poi = chip->oob_poi;
-+	else
-+		poi = chip->oob_poi + i * mtk_nand->fdm.reg_size;
-+
-+	return poi;
-+}
-+
-+static inline int mtk_data_len(struct nand_chip *chip)
-+{
-+	struct mtk_nfc_nand_chip *mtk_nand = to_mtk_nand(chip);
-+
-+	return chip->ecc.size + mtk_nand->spare_per_sector;
-+}
-+
-+static inline uint8_t *mtk_data_ptr(struct nand_chip *chip,  int i)
-+{
-+	struct mtk_nfc *nfc = nand_get_controller_data(chip);
-+
-+	return nfc->buffer + i * mtk_data_len(chip);
-+}
-+
-+static inline uint8_t *mtk_oob_ptr(struct nand_chip *chip, int i)
-+{
-+	struct mtk_nfc *nfc = nand_get_controller_data(chip);
-+
-+	return nfc->buffer + i * mtk_data_len(chip) + chip->ecc.size;
-+}
-+
-+static inline void nfi_writel(struct mtk_nfc *nfc, u32 val, u32 reg)
-+{
-+	writel(val, nfc->regs + reg);
-+}
-+
-+static inline void nfi_writew(struct mtk_nfc *nfc, u16 val, u32 reg)
-+{
-+	writew(val, nfc->regs + reg);
-+}
-+
-+static inline void nfi_writeb(struct mtk_nfc *nfc, u8 val, u32 reg)
-+{
-+	writeb(val, nfc->regs + reg);
-+}
-+
-+static inline u32 nfi_readl(struct mtk_nfc *nfc, u32 reg)
-+{
-+	return readl_relaxed(nfc->regs + reg);
-+}
-+
-+static inline u16 nfi_readw(struct mtk_nfc *nfc, u32 reg)
-+{
-+	return readw_relaxed(nfc->regs + reg);
-+}
-+
-+static inline u8 nfi_readb(struct mtk_nfc *nfc, u32 reg)
-+{
-+	return readb_relaxed(nfc->regs + reg);
-+}
-+
-+static void mtk_nfc_hw_reset(struct mtk_nfc *nfc)
-+{
-+	struct device *dev = nfc->dev;
-+	u32 val;
-+	int ret;
-+
-+	/* reset all registers and force the NFI master to terminate */
-+	nfi_writel(nfc, CON_FIFO_FLUSH | CON_NFI_RST, NFI_CON);
-+
-+	/* wait for the master to finish the last transaction */
-+	ret = readl_poll_timeout(nfc->regs + NFI_MASTER_STA, val,
-+			!(val & MASTER_STA_MASK), 50, MTK_RESET_TIMEOUT);
-+	if (ret)
-+		dev_warn(dev, "master active in reset [0x%x] = 0x%x\n",
-+			NFI_MASTER_STA, val);
-+
-+	/* ensure any status register affected by the NFI master is reset */
-+	nfi_writel(nfc, CON_FIFO_FLUSH | CON_NFI_RST, NFI_CON);
-+	nfi_writew(nfc, STAR_DE, NFI_STRDATA);
-+}
-+
-+static int mtk_nfc_send_command(struct mtk_nfc *nfc, u8 command)
-+{
-+	struct device *dev = nfc->dev;
-+	u32 val;
-+	int ret;
-+
-+	nfi_writel(nfc, command, NFI_CMD);
-+
-+	ret = readl_poll_timeout_atomic(nfc->regs + NFI_STA, val,
-+					!(val & STA_CMD), 10,  MTK_TIMEOUT);
-+	if (ret) {
-+		dev_warn(dev, "nfi core timed out entering command mode\n");
-+		return -EIO;
-+	}
-+
-+	return 0;
-+}
-+
-+static int mtk_nfc_send_address(struct mtk_nfc *nfc, int addr)
-+{
-+	struct device *dev = nfc->dev;
-+	u32 val;
-+	int ret;
-+
-+	nfi_writel(nfc, addr, NFI_COLADDR);
-+	nfi_writel(nfc, 0, NFI_ROWADDR);
-+	nfi_writew(nfc, 1, NFI_ADDRNOB);
-+
-+	ret = readl_poll_timeout_atomic(nfc->regs + NFI_STA, val,
-+					!(val & STA_ADDR), 10, MTK_TIMEOUT);
-+	if (ret) {
-+		dev_warn(dev, "nfi core timed out entering address mode\n");
-+		return -EIO;
-+	}
-+
-+	return 0;
-+}
-+
-+static int mtk_nfc_hw_runtime_config(struct mtd_info *mtd)
-+{
-+	struct nand_chip *chip = mtd_to_nand(mtd);
-+	struct mtk_nfc_nand_chip *mtk_nand = to_mtk_nand(chip);
-+	struct mtk_nfc *nfc = nand_get_controller_data(chip);
-+	u32 fmt, spare;
-+
-+	if (!mtd->writesize)
-+		return 0;
-+
-+	spare = mtk_nand->spare_per_sector;
-+
-+	switch (mtd->writesize) {
-+	case 512:
-+		fmt = PAGEFMT_512_2K | PAGEFMT_SEC_SEL_512;
-+		break;
-+	case KB(2):
-+		if (chip->ecc.size == 512)
-+			fmt = PAGEFMT_2K_4K | PAGEFMT_SEC_SEL_512;
-+		else
-+			fmt = PAGEFMT_512_2K;
-+		break;
-+	case KB(4):
-+		if (chip->ecc.size == 512)
-+			fmt = PAGEFMT_4K_8K | PAGEFMT_SEC_SEL_512;
-+		else
-+			fmt = PAGEFMT_2K_4K;
-+		break;
-+	case KB(8):
-+		if (chip->ecc.size == 512)
-+			fmt = PAGEFMT_8K_16K | PAGEFMT_SEC_SEL_512;
-+		else
-+			fmt = PAGEFMT_4K_8K;
-+		break;
-+	case KB(16):
-+		fmt = PAGEFMT_8K_16K;
-+		break;
-+	default:
-+		dev_err(nfc->dev, "invalid page len: %d\n", mtd->writesize);
-+		return -EINVAL;
-+	}
-+
-+	/* the hardware doubles the value for this eccsize so let's halve it */
-+	if (chip->ecc.size == 1024)
-+		spare >>= 1;
-+
-+	switch (spare) {
-+	case 16:
-+		fmt |= (PAGEFMT_SPARE_16 << PAGEFMT_SPARE_SHIFT);
-+		break;
-+	case 26:
-+		fmt |= (PAGEFMT_SPARE_26 << PAGEFMT_SPARE_SHIFT);
-+		break;
-+	case 27:
-+		fmt |= (PAGEFMT_SPARE_27 << PAGEFMT_SPARE_SHIFT);
-+		break;
-+	case 28:
-+		fmt |= (PAGEFMT_SPARE_28 << PAGEFMT_SPARE_SHIFT);
-+		break;
-+	case 32:
-+		fmt |= (PAGEFMT_SPARE_32 << PAGEFMT_SPARE_SHIFT);
-+		break;
-+	case 36:
-+		fmt |= (PAGEFMT_SPARE_36 << PAGEFMT_SPARE_SHIFT);
-+		break;
-+	case 40:
-+		fmt |= (PAGEFMT_SPARE_40 << PAGEFMT_SPARE_SHIFT);
-+		break;
-+	case 44:
-+		fmt |= (PAGEFMT_SPARE_44 << PAGEFMT_SPARE_SHIFT);
-+		break;
-+	case 48:
-+		fmt |= (PAGEFMT_SPARE_48 << PAGEFMT_SPARE_SHIFT);
-+		break;
-+	case 49:
-+		fmt |= (PAGEFMT_SPARE_49 << PAGEFMT_SPARE_SHIFT);
-+		break;
-+	case 50:
-+		fmt |= (PAGEFMT_SPARE_50 << PAGEFMT_SPARE_SHIFT);
-+		break;
-+	case 51:
-+		fmt |= (PAGEFMT_SPARE_51 << PAGEFMT_SPARE_SHIFT);
-+		break;
-+	case 52:
-+		fmt |= (PAGEFMT_SPARE_52 << PAGEFMT_SPARE_SHIFT);
-+		break;
-+	case 62:
-+		fmt |= (PAGEFMT_SPARE_62 << PAGEFMT_SPARE_SHIFT);
-+		break;
-+	case 63:
-+		fmt |= (PAGEFMT_SPARE_63 << PAGEFMT_SPARE_SHIFT);
-+		break;
-+	case 64:
-+		fmt |= (PAGEFMT_SPARE_64 << PAGEFMT_SPARE_SHIFT);
-+		break;
-+	default:
-+		dev_err(nfc->dev, "invalid spare per sector %d\n", spare);
-+		return -EINVAL;
-+	}
-+
-+	fmt |= mtk_nand->fdm.reg_size << PAGEFMT_FDM_SHIFT;
-+	fmt |= mtk_nand->fdm.ecc_size << PAGEFMT_FDM_ECC_SHIFT;
-+	nfi_writew(nfc, fmt, NFI_PAGEFMT);
-+
-+	nfc->ecc_cfg.strength = chip->ecc.strength;
-+	nfc->ecc_cfg.enc_len = chip->ecc.size + mtk_nand->fdm.ecc_size;
-+	nfc->ecc_cfg.dec_len = (nfc->ecc_cfg.enc_len << 3)
-+				+ chip->ecc.strength * ECC_PARITY_BITS;
-+
-+	return 0;
-+}
-+
-+static void mtk_nfc_select_chip(struct mtd_info *mtd, int chip)
-+{
-+	struct nand_chip *nand = mtd_to_nand(mtd);
-+	struct mtk_nfc *nfc = nand_get_controller_data(nand);
-+	struct mtk_nfc_nand_chip *mtk_nand = to_mtk_nand(nand);
-+
-+	if (chip < 0)
-+		return;
-+
-+	mtk_nfc_hw_runtime_config(mtd);
-+
-+	nfi_writel(nfc, mtk_nand->sels[chip], NFI_CSEL);
-+}
-+
-+static int mtk_nfc_dev_ready(struct mtd_info *mtd)
-+{
-+	struct mtk_nfc *nfc = nand_get_controller_data(mtd_to_nand(mtd));
-+
-+	if (nfi_readl(nfc, NFI_STA) & STA_BUSY)
-+		return 0;
-+
-+	return 1;
-+}
-+
-+static void mtk_nfc_cmd_ctrl(struct mtd_info *mtd, int dat, unsigned int ctrl)
-+{
-+	struct mtk_nfc *nfc = nand_get_controller_data(mtd_to_nand(mtd));
-+
-+	if (ctrl & NAND_ALE)
-+		mtk_nfc_send_address(nfc, dat);
-+	else if (ctrl & NAND_CLE) {
-+		mtk_nfc_hw_reset(nfc);
-+
-+		nfi_writew(nfc, CNFG_OP_CUST, NFI_CNFG);
-+		mtk_nfc_send_command(nfc, dat);
-+	}
-+}
-+
-+static inline void mtk_nfc_wait_ioready(struct mtk_nfc *nfc)
-+{
-+	int rc;
-+	u8 val;
-+
-+	rc = readb_poll_timeout_atomic(nfc->regs + NFI_PIO_DIRDY, val,
-+					val & PIO_DI_RDY, 10, MTK_TIMEOUT);
-+	if (rc < 0)
-+		dev_err(nfc->dev, "data not ready\n");
-+}
-+
-+static inline uint8_t mtk_nfc_read_byte(struct mtd_info *mtd)
-+{
-+	struct nand_chip *chip = mtd_to_nand(mtd);
-+	struct mtk_nfc *nfc = nand_get_controller_data(chip);
-+	u32 reg;
-+
-+	reg = nfi_readl(nfc, NFI_STA) & NFI_FSM_MASK;
-+	if (reg != NFI_FSM_CUSTDATA) {
-+		reg = nfi_readw(nfc, NFI_CNFG);
-+		reg |= CNFG_BYTE_RW | CNFG_READ_EN;
-+		nfi_writew(nfc, reg, NFI_CNFG);
-+
-+		reg = (MTK_MAX_SECTOR << CON_SEC_SHIFT) | CON_BRD;
-+		nfi_writel(nfc, reg, NFI_CON);
-+
-+		/* trigger to fetch data */
-+		nfi_writew(nfc, STAR_EN, NFI_STRDATA);
-+	}
-+
-+	mtk_nfc_wait_ioready(nfc);
-+
-+	return nfi_readb(nfc, NFI_DATAR);
-+}
-+
-+static void mtk_nfc_read_buf(struct mtd_info *mtd, uint8_t *buf, int len)
-+{
-+	int i;
-+
-+	for (i = 0; i < len; i++)
-+		buf[i] = mtk_nfc_read_byte(mtd);
-+}
-+
-+static void mtk_nfc_write_byte(struct mtd_info *mtd, uint8_t byte)
-+{
-+	struct mtk_nfc *nfc = nand_get_controller_data(mtd_to_nand(mtd));
-+	u32 reg;
-+
-+	reg = nfi_readl(nfc, NFI_STA) & NFI_FSM_MASK;
-+
-+	if (reg != NFI_FSM_CUSTDATA) {
-+		reg = nfi_readw(nfc, NFI_CNFG) | CNFG_BYTE_RW;
-+		nfi_writew(nfc, reg, NFI_CNFG);
-+
-+		reg = MTK_MAX_SECTOR << CON_SEC_SHIFT | CON_BWR;
-+		nfi_writel(nfc, reg, NFI_CON);
-+
-+		nfi_writew(nfc, STAR_EN, NFI_STRDATA);
-+	}
-+
-+	mtk_nfc_wait_ioready(nfc);
-+	nfi_writeb(nfc, byte, NFI_DATAW);
-+}
-+
-+static void mtk_nfc_write_buf(struct mtd_info *mtd, const uint8_t *buf, int len)
-+{
-+	int i;
-+
-+	for (i = 0; i < len; i++)
-+		mtk_nfc_write_byte(mtd, buf[i]);
-+}
-+
-+static int mtk_nfc_sector_encode(struct nand_chip *chip, u8 *data)
-+{
-+	struct mtk_nfc *nfc = nand_get_controller_data(chip);
-+	struct mtk_nfc_nand_chip *mtk_nand = to_mtk_nand(chip);
-+	int size = chip->ecc.size + mtk_nand->fdm.reg_size;
-+
-+	nfc->ecc_cfg.ecc_mode = ECC_DMA_MODE;
-+	nfc->ecc_cfg.codec = ECC_ENC;
-+	return mtk_ecc_encode_non_nfi_mode(nfc->ecc, &nfc->ecc_cfg, data, size);
-+}
-+
-+static void mtk_nfc_no_bad_mark_swap(struct mtd_info *a, uint8_t *b, int c)
-+{
-+	/* nope */
-+}
-+
-+static void mtk_nfc_bad_mark_swap(struct mtd_info *mtd, uint8_t *buf, int raw)
-+{
-+	struct nand_chip *chip = mtd_to_nand(mtd);
-+	struct mtk_nfc_nand_chip *nand = to_mtk_nand(chip);
-+	u32 bad_pos = nand->bad_mark.pos;
-+
-+	if (raw)
-+		bad_pos += nand->bad_mark.sec * mtk_data_len(chip);
-+	else
-+		bad_pos += nand->bad_mark.sec * chip->ecc.size;
-+
-+	swap(chip->oob_poi[0], buf[bad_pos]);
-+}
-+
-+static int mtk_nfc_format_subpage(struct mtd_info *mtd, uint32_t offset,
-+			uint32_t len, const uint8_t *buf)
-+{
-+	struct nand_chip *chip = mtd_to_nand(mtd);
-+	struct mtk_nfc_nand_chip *mtk_nand = to_mtk_nand(chip);
-+	struct mtk_nfc *nfc = nand_get_controller_data(chip);
-+	struct mtk_nfc_fdm *fdm = &mtk_nand->fdm;
-+	u32 start, end;
-+	int i, ret;
-+
-+	start = offset / chip->ecc.size;
-+	end = DIV_ROUND_UP(offset + len, chip->ecc.size);
-+
-+	memset(nfc->buffer, 0xff, mtd->writesize + mtd->oobsize);
-+	for (i = 0; i < chip->ecc.steps; i++) {
-+
-+		memcpy(mtk_data_ptr(chip, i), data_ptr(chip, buf, i),
-+			chip->ecc.size);
-+
-+		if (start > i || i >= end)
-+			continue;
-+
-+		if (i == mtk_nand->bad_mark.sec)
-+			mtk_nand->bad_mark.bm_swap(mtd, nfc->buffer, 1);
-+
-+		memcpy(mtk_oob_ptr(chip, i), oob_ptr(chip, i), fdm->reg_size);
-+
-+		/* program the CRC back to the OOB */
-+		ret = mtk_nfc_sector_encode(chip, mtk_data_ptr(chip, i));
-+		if (ret < 0)
-+			return ret;
-+	}
-+
-+	return 0;
-+}
-+
-+static void mtk_nfc_format_page(struct mtd_info *mtd, const uint8_t *buf)
-+{
-+	struct nand_chip *chip = mtd_to_nand(mtd);
-+	struct mtk_nfc_nand_chip *mtk_nand = to_mtk_nand(chip);
-+	struct mtk_nfc *nfc = nand_get_controller_data(chip);
-+	struct mtk_nfc_fdm *fdm = &mtk_nand->fdm;
-+	u32 i;
-+
-+	memset(nfc->buffer, 0xff, mtd->writesize + mtd->oobsize);
-+	for (i = 0; i < chip->ecc.steps; i++) {
-+		if (buf)
-+			memcpy(mtk_data_ptr(chip, i), data_ptr(chip, buf, i),
-+				chip->ecc.size);
-+
-+		if (i == mtk_nand->bad_mark.sec)
-+			mtk_nand->bad_mark.bm_swap(mtd, nfc->buffer, 1);
-+
-+		memcpy(mtk_oob_ptr(chip, i), oob_ptr(chip, i), fdm->reg_size);
-+	}
-+}
-+
-+static inline void mtk_nfc_read_fdm(struct nand_chip *chip, u32 start,
-+					u32 sectors)
-+{
-+	struct mtk_nfc *nfc = nand_get_controller_data(chip);
-+	u32 *p;
-+	int i;
-+
-+	for (i = 0; i < sectors; i++) {
-+		p = (u32 *) oob_ptr(chip, start + i);
-+		p[0] = nfi_readl(nfc, NFI_FDML(i));
-+		p[1] = nfi_readl(nfc, NFI_FDMM(i));
-+	}
-+}
-+
-+static inline void mtk_nfc_write_fdm(struct nand_chip *chip)
-+{
-+	struct mtk_nfc *nfc = nand_get_controller_data(chip);
-+	u32 *p;
-+	int i;
-+
-+	for (i = 0; i < chip->ecc.steps ; i++) {
-+		p = (u32 *) oob_ptr(chip, i);
-+		nfi_writel(nfc, p[0], NFI_FDML(i));
-+		nfi_writel(nfc, p[1], NFI_FDMM(i));
-+	}
-+}
-+
-+static int mtk_nfc_do_write_page(struct mtd_info *mtd, struct nand_chip *chip,
-+				const uint8_t *buf, int page, int len)
-+{
-+
-+	struct mtk_nfc *nfc = nand_get_controller_data(chip);
-+	struct device *dev = nfc->dev;
-+	dma_addr_t addr;
-+	u32 reg;
-+	int ret;
-+
-+	addr = dma_map_single(dev, (void *) buf, len, DMA_TO_DEVICE);
-+	ret = dma_mapping_error(nfc->dev, addr);
-+	if (ret) {
-+		dev_err(nfc->dev, "dma mapping error\n");
-+		return -EINVAL;
-+	}
-+
-+	reg = nfi_readw(nfc, NFI_CNFG) | CNFG_AHB | CNFG_DMA_BURST_EN;
-+	nfi_writew(nfc, reg, NFI_CNFG);
-+
-+	nfi_writel(nfc, chip->ecc.steps << CON_SEC_SHIFT, NFI_CON);
-+	nfi_writel(nfc, lower_32_bits(addr), NFI_STRADDR);
-+	nfi_writew(nfc, INTR_AHB_DONE_EN, NFI_INTR_EN);
-+
-+	init_completion(&nfc->done);
-+
-+	reg = nfi_readl(nfc, NFI_CON) | CON_BWR;
-+	nfi_writel(nfc, reg, NFI_CON);
-+	nfi_writew(nfc, STAR_EN, NFI_STRDATA);
-+
-+	ret = wait_for_completion_timeout(&nfc->done, msecs_to_jiffies(500));
-+	if (!ret) {
-+		dev_err(dev, "program ahb done timeout\n");
-+		nfi_writew(nfc, 0, NFI_INTR_EN);
-+		ret = -ETIMEDOUT;
-+		goto timeout;
-+	}
-+
-+	ret = readl_poll_timeout_atomic(nfc->regs + NFI_ADDRCNTR, reg,
-+			(reg & CNTR_MASK) >= chip->ecc.steps, 10, MTK_TIMEOUT);
-+	if (ret)
-+		dev_err(dev, "hwecc write timeout\n");
-+
-+timeout:
-+
-+	dma_unmap_single(nfc->dev, addr, len, DMA_TO_DEVICE);
-+	nfi_writel(nfc, 0, NFI_CON);
-+
-+	return ret;
-+}
-+
-+static int mtk_nfc_write_page(struct mtd_info *mtd, struct nand_chip *chip,
-+			const uint8_t *buf, int page, int raw)
-+{
-+	struct mtk_nfc *nfc = nand_get_controller_data(chip);
-+	struct mtk_nfc_nand_chip *mtk_nand = to_mtk_nand(chip);
-+	size_t len;
-+	const u8 *bufpoi;
-+	u32 reg;
-+	int ret;
-+
-+	if (!raw) {
-+		/* OOB => FDM: from register,  ECC: from HW */
-+		reg = nfi_readw(nfc, NFI_CNFG) | CNFG_AUTO_FMT_EN;
-+		nfi_writew(nfc, reg | CNFG_HW_ECC_EN, NFI_CNFG);
-+
-+		nfc->ecc_cfg.codec = ECC_ENC;
-+		nfc->ecc_cfg.ecc_mode = ECC_NFI_MODE;
-+		ret = mtk_ecc_enable(nfc->ecc, &nfc->ecc_cfg);
-+		if (ret) {
-+			/* clear NFI config */
-+			reg = nfi_readw(nfc, NFI_CNFG);
-+			reg &= ~(CNFG_AUTO_FMT_EN | CNFG_HW_ECC_EN);
-+			nfi_writew(nfc, reg, NFI_CNFG);
-+
-+			return ret;
-+		}
-+
-+		memcpy(nfc->buffer, buf, mtd->writesize);
-+		mtk_nand->bad_mark.bm_swap(mtd, nfc->buffer, raw);
-+		bufpoi = nfc->buffer;
-+
-+		/* write OOB into the FDM registers (OOB area in MTK NAND) */
-+		mtk_nfc_write_fdm(chip);
-+	} else
-+		bufpoi = buf;
-+
-+	len = mtd->writesize + (raw ? mtd->oobsize : 0);
-+	ret = mtk_nfc_do_write_page(mtd, chip, bufpoi, page, len);
-+
-+	if (!raw)
-+		mtk_ecc_disable(nfc->ecc, &nfc->ecc_cfg);
-+
-+	return ret;
-+}
-+
-+static int mtk_nfc_write_page_hwecc(struct mtd_info *mtd,
-+	struct nand_chip *chip, const uint8_t *buf, int oob_on, int page)
-+{
-+	return mtk_nfc_write_page(mtd, chip, buf, page, 0);
-+}
-+
-+static int mtk_nfc_write_page_raw(struct mtd_info *mtd, struct nand_chip *chip,
-+				const uint8_t *buf, int oob_on, int pg)
-+{
-+	struct mtk_nfc *nfc = nand_get_controller_data(chip);
-+
-+	mtk_nfc_format_page(mtd, buf);
-+	return mtk_nfc_write_page(mtd, chip, nfc->buffer, pg, 1);
-+}
-+
-+static int mtk_nfc_write_subpage_hwecc(struct mtd_info *mtd,
-+		struct nand_chip *chip, uint32_t offset, uint32_t data_len,
-+		const uint8_t *buf, int oob_on, int page)
-+{
-+	struct mtk_nfc *nfc = nand_get_controller_data(chip);
-+	int ret;
-+
-+	ret = mtk_nfc_format_subpage(mtd, offset, data_len, buf);
-+	if (ret < 0)
-+		return ret;
-+
-+	/* use the data in the private buffer (now with FDM and CRC) */
-+	return mtk_nfc_write_page(mtd, chip, nfc->buffer, page, 1);
-+}
-+
-+static int mtk_nfc_write_oob_std(struct mtd_info *mtd, struct nand_chip *chip,
-+					int page)
-+{
-+	int ret;
-+
-+	chip->cmdfunc(mtd, NAND_CMD_SEQIN, 0x00, page);
-+
-+	ret = mtk_nfc_write_page_raw(mtd, chip, NULL, 1, page);
-+	if (ret < 0)
-+		return -EIO;
-+
-+	chip->cmdfunc(mtd, NAND_CMD_PAGEPROG, -1, -1);
-+	ret = chip->waitfunc(mtd, chip);
-+
-+	return ret & NAND_STATUS_FAIL ? -EIO : 0;
-+}
-+
-+static int mtk_nfc_update_ecc_stats(struct mtd_info *mtd, u8 *buf, u32 sectors)
-+{
-+	struct nand_chip *chip = mtd_to_nand(mtd);
-+	struct mtk_nfc *nfc = nand_get_controller_data(chip);
-+	struct mtk_nfc_nand_chip *mtk_nand = to_mtk_nand(chip);
-+	struct mtk_ecc_stats stats;
-+	int rc, i;
-+
-+	rc = nfi_readl(nfc, NFI_STA) & STA_EMP_PAGE;
-+	if (rc) {
-+		memset(buf, 0xff, sectors * chip->ecc.size);
-+		for (i = 0; i < sectors; i++)
-+			memset(oob_ptr(chip, i), 0xff, mtk_nand->fdm.reg_size);
-+		return 0;
-+	}
-+
-+	mtk_ecc_get_stats(nfc->ecc, &stats, sectors);
-+	mtd->ecc_stats.corrected += stats.corrected;
-+	mtd->ecc_stats.failed += stats.failed;
-+
-+	return stats.bitflips;
-+}
-+
-+static int mtk_nfc_read_subpage(struct mtd_info *mtd, struct nand_chip *chip,
-+		uint32_t data_offs, uint32_t readlen, uint8_t *bufpoi,
-+		int page, int raw)
-+{
-+	struct mtk_nfc *nfc = nand_get_controller_data(chip);
-+	struct mtk_nfc_nand_chip *mtk_nand = to_mtk_nand(chip);
-+	u32 spare = mtk_nand->spare_per_sector;
-+	u32 column, sectors, start, end, reg;
-+	dma_addr_t addr;
-+	int bitflips;
-+	size_t len;
-+	u8 *buf;
-+	int rc;
-+
-+	start = data_offs / chip->ecc.size;
-+	end = DIV_ROUND_UP(data_offs + readlen, chip->ecc.size);
-+
-+	sectors = end - start;
-+	column = start * (chip->ecc.size + spare);
-+
-+	len = sectors * chip->ecc.size + (raw ? sectors * spare : 0);
-+	buf = bufpoi + start * chip->ecc.size;
-+
-+	if (column != 0)
-+		chip->cmdfunc(mtd, NAND_CMD_RNDOUT, column, -1);
-+
-+	addr = dma_map_single(nfc->dev, buf, len, DMA_FROM_DEVICE);
-+	rc = dma_mapping_error(nfc->dev, addr);
-+	if (rc) {
-+		dev_err(nfc->dev, "dma mapping error\n");
-+
-+		return -EINVAL;
-+	}
-+
-+	reg = nfi_readw(nfc, NFI_CNFG);
-+	reg |= CNFG_READ_EN | CNFG_DMA_BURST_EN | CNFG_AHB;
-+	if (!raw) {
-+		reg |= CNFG_AUTO_FMT_EN | CNFG_HW_ECC_EN;
-+		nfi_writew(nfc, reg, NFI_CNFG);
-+
-+		nfc->ecc_cfg.ecc_mode = ECC_NFI_MODE;
-+		nfc->ecc_cfg.sec_mask = sectors;
-+		nfc->ecc_cfg.codec = ECC_DEC;
-+		rc = mtk_ecc_enable(nfc->ecc, &nfc->ecc_cfg);
-+		if (rc) {
-+			dev_err(nfc->dev, "ecc enable\n");
-+			/* clear NFI_CNFG */
-+			reg &= ~(CNFG_DMA_BURST_EN | CNFG_AHB | CNFG_READ_EN |
-+				CNFG_AUTO_FMT_EN | CNFG_HW_ECC_EN);
-+			nfi_writew(nfc, reg, NFI_CNFG);
-+			dma_unmap_single(nfc->dev, addr, len, DMA_FROM_DEVICE);
-+
-+			return rc;
-+		}
-+	} else
-+		nfi_writew(nfc, reg, NFI_CNFG);
-+
-+	nfi_writel(nfc, sectors << CON_SEC_SHIFT, NFI_CON);
-+	nfi_writew(nfc, INTR_AHB_DONE_EN, NFI_INTR_EN);
-+	nfi_writel(nfc, lower_32_bits(addr), NFI_STRADDR);
-+
-+	init_completion(&nfc->done);
-+	reg = nfi_readl(nfc, NFI_CON) | CON_BRD;
-+	nfi_writel(nfc, reg, NFI_CON);
-+	nfi_writew(nfc, STAR_EN, NFI_STRDATA);
-+
-+	rc = wait_for_completion_timeout(&nfc->done, msecs_to_jiffies(500));
-+	if (!rc)
-+		dev_warn(nfc->dev, "read ahb/dma done timeout\n");
-+
-+	rc = readl_poll_timeout_atomic(nfc->regs + NFI_BYTELEN, reg,
-+				(reg & CNTR_MASK) >= sectors, 10, MTK_TIMEOUT);
-+	if (rc < 0) {
-+		dev_err(nfc->dev, "subpage done timeout\n");
-+		bitflips = -EIO;
-+	} else {
-+		bitflips = 0;
-+		if (!raw) {
-+			rc = mtk_ecc_wait_irq_done(nfc->ecc, ECC_DEC);
-+			bitflips = rc < 0 ? -ETIMEDOUT :
-+				mtk_nfc_update_ecc_stats(mtd, buf, sectors);
-+			mtk_nfc_read_fdm(chip, start, sectors);
-+		}
-+	}
-+
-+	dma_unmap_single(nfc->dev, addr, len, DMA_FROM_DEVICE);
-+
-+	if (raw)
-+		goto done;
-+
-+	mtk_ecc_disable(nfc->ecc, &nfc->ecc_cfg);
-+
-+	if (clamp(mtk_nand->bad_mark.sec, start, end) == mtk_nand->bad_mark.sec)
-+		mtk_nand->bad_mark.bm_swap(mtd, bufpoi, raw);
-+done:
-+	nfi_writel(nfc, 0, NFI_CON);
-+
-+	return bitflips;
-+}
-+
-+static int mtk_nfc_read_subpage_hwecc(struct mtd_info *mtd,
-+	struct nand_chip *chip, uint32_t off, uint32_t len, uint8_t *p, int pg)
-+{
-+	return mtk_nfc_read_subpage(mtd, chip, off, len, p, pg, 0);
-+}
-+
-+static int mtk_nfc_read_page_hwecc(struct mtd_info *mtd,
-+	struct nand_chip *chip, uint8_t *p, int oob_on, int pg)
-+{
-+	return mtk_nfc_read_subpage(mtd, chip, 0, mtd->writesize, p, pg, 0);
-+}
-+
-+static int mtk_nfc_read_page_raw(struct mtd_info *mtd, struct nand_chip *chip,
-+				uint8_t *buf, int oob_on, int page)
-+{
-+	struct mtk_nfc_nand_chip *mtk_nand = to_mtk_nand(chip);
-+	struct mtk_nfc *nfc = nand_get_controller_data(chip);
-+	struct mtk_nfc_fdm *fdm = &mtk_nand->fdm;
-+	int i, ret;
-+
-+	memset(nfc->buffer, 0xff, mtd->writesize + mtd->oobsize);
-+	ret = mtk_nfc_read_subpage(mtd, chip, 0, mtd->writesize, nfc->buffer,
-+					page, 1);
-+	if (ret < 0)
-+		return ret;
-+
-+	for (i = 0; i < chip->ecc.steps; i++) {
-+		memcpy(oob_ptr(chip, i), mtk_oob_ptr(chip, i), fdm->reg_size);
-+		if (i == mtk_nand->bad_mark.sec)
-+			mtk_nand->bad_mark.bm_swap(mtd, nfc->buffer, 1);
-+
-+		if (buf)
-+			memcpy(data_ptr(chip, buf, i), mtk_data_ptr(chip, i),
-+				chip->ecc.size);
-+	}
-+
-+	return ret;
-+}
-+
-+static int mtk_nfc_read_oob_std(struct mtd_info *mtd, struct nand_chip *chip,
-+				int page)
-+{
-+	chip->cmdfunc(mtd, NAND_CMD_READ0, 0, page);
-+
-+	return mtk_nfc_read_page_raw(mtd, chip, NULL, 1, page);
-+}
-+
-+static inline void mtk_nfc_hw_init(struct mtk_nfc *nfc)
-+{
-+	nfi_writel(nfc, 0x10804211, NFI_ACCCON);
-+	nfi_writew(nfc, 0xf1, NFI_CNRNB);
-+	nfi_writew(nfc, PAGEFMT_8K_16K, NFI_PAGEFMT);
-+
-+	mtk_nfc_hw_reset(nfc);
-+
-+	nfi_readl(nfc, NFI_INTR_STA);
-+	nfi_writel(nfc, 0, NFI_INTR_EN);
-+}
-+
-+static irqreturn_t mtk_nfc_irq(int irq, void *id)
-+{
-+	struct mtk_nfc *nfc = id;
-+	u16 sta, ien;
-+
-+	sta = nfi_readw(nfc, NFI_INTR_STA);
-+	ien = nfi_readw(nfc, NFI_INTR_EN);
-+
-+	if (!(sta & ien))
-+		return IRQ_NONE;
-+
-+	nfi_writew(nfc, ~sta & ien, NFI_INTR_EN);
-+	complete(&nfc->done);
-+
-+	return IRQ_HANDLED;
-+}
-+
-+static int mtk_nfc_enable_clk(struct device *dev, struct mtk_nfc_clk *clk)
-+{
-+	int ret;
-+
-+	ret = clk_prepare_enable(clk->nfi_clk);
-+	if (ret) {
-+		dev_err(dev, "failed to enable nfi clk\n");
-+		return ret;
-+	}
-+
-+	ret = clk_prepare_enable(clk->pad_clk);
-+	if (ret) {
-+		dev_err(dev, "failed to enable pad clk\n");
-+		clk_disable_unprepare(clk->nfi_clk);
-+		return ret;
-+	}
-+
-+	return 0;
-+}
-+
-+static void mtk_nfc_disable_clk(struct mtk_nfc_clk *clk)
-+{
-+	clk_disable_unprepare(clk->nfi_clk);
-+	clk_disable_unprepare(clk->pad_clk);
-+}
-+
-+static int mtk_nfc_ooblayout_free(struct mtd_info *mtd, int section,
-+				struct mtd_oob_region *oob_region)
-+{
-+	struct nand_chip *chip = mtd_to_nand(mtd);
-+	struct mtk_nfc_nand_chip *mtk_nand = to_mtk_nand(chip);
-+	struct mtk_nfc_fdm *fdm = &mtk_nand->fdm;
-+	u32 eccsteps;
-+
-+	eccsteps = mtd->writesize / chip->ecc.size;
-+
-+	if (section >= eccsteps)
-+		return -ERANGE;
-+
-+	oob_region->length = fdm->reg_size - fdm->ecc_size;
-+	oob_region->offset = section * fdm->reg_size + fdm->ecc_size;
-+
-+	return 0;
-+}
-+
-+static int mtk_nfc_ooblayout_ecc(struct mtd_info *mtd, int section,
-+				struct mtd_oob_region *oob_region)
-+{
-+	struct nand_chip *chip = mtd_to_nand(mtd);
-+	struct mtk_nfc_nand_chip *mtk_nand = to_mtk_nand(chip);
-+	u32 eccsteps;
-+
-+	if (section)
-+		return -ERANGE;
-+
-+	eccsteps = mtd->writesize / chip->ecc.size;
-+	oob_region->offset = mtk_nand->fdm.reg_size * eccsteps;
-+	oob_region->length = mtd->oobsize - oob_region->offset;
-+
-+	return 0;
-+}
-+
-+static const struct mtd_ooblayout_ops mtk_nfc_ooblayout_ops = {
-+	.free = mtk_nfc_ooblayout_free,
-+	.ecc = mtk_nfc_ooblayout_ecc,
-+};
-+
-+static void mtk_nfc_set_fdm(struct mtk_nfc_fdm *fdm, struct mtd_info *mtd)
-+{
-+	struct nand_chip *nand = mtd_to_nand(mtd);
-+	struct mtk_nfc_nand_chip *chip = to_mtk_nand(nand);
-+	u32 ecc_bytes;
-+
-+	ecc_bytes = DIV_ROUND_UP(nand->ecc.strength * ECC_PARITY_BITS, 8);
-+
-+	fdm->reg_size = chip->spare_per_sector - ecc_bytes;
-+	if (fdm->reg_size > NFI_FDM_MAX_SIZE)
-+		fdm->reg_size = NFI_FDM_MAX_SIZE;
-+
-+	/* bad block mark storage */
-+	fdm->ecc_size = 1;
-+}
-+
-+static void mtk_nfc_set_bad_mark_ctl(struct mtk_nfc_bad_mark_ctl *bm_ctl,
-+				struct mtd_info *mtd)
-+{
-+	struct nand_chip *nand = mtd_to_nand(mtd);
-+
-+	if (mtd->writesize == 512)
-+		bm_ctl->bm_swap = mtk_nfc_no_bad_mark_swap;
-+	else {
-+		bm_ctl->bm_swap = mtk_nfc_bad_mark_swap;
-+		bm_ctl->sec = mtd->writesize / mtk_data_len(nand);
-+		bm_ctl->pos = mtd->writesize % mtk_data_len(nand);
-+	}
-+}
-+
-+static void mtk_nfc_set_spare_per_sector(u32 *sps, struct mtd_info *mtd)
-+{
-+	struct nand_chip *nand = mtd_to_nand(mtd);
-+	u32 spare[] = {16, 26, 27, 28, 32, 36, 40, 44,
-+			48, 49, 50, 51, 52, 62, 63, 64};
-+	u32 eccsteps, i;
-+
-+	eccsteps = mtd->writesize / nand->ecc.size;
-+	*sps = mtd->oobsize / eccsteps;
-+
-+	if (nand->ecc.size == 1024)
-+		*sps >>= 1;
-+
-+	for (i = 0; i < ARRAY_SIZE(spare); i++) {
-+		if (*sps <= spare[i]) {
-+			if (!i)
-+				*sps = spare[i];
-+			else if (*sps != spare[i])
-+				*sps = spare[i - 1];
-+			break;
-+		}
-+	}
-+
-+	if (i >= ARRAY_SIZE(spare))
-+		*sps = spare[ARRAY_SIZE(spare) - 1];
-+
-+	if (nand->ecc.size == 1024)
-+		*sps <<= 1;
-+}
-+
-+static int mtk_nfc_ecc_init(struct device *dev, struct mtd_info *mtd)
-+{
-+	struct nand_chip *nand = mtd_to_nand(mtd);
-+	u32 spare;
-+
-+	/* support only ecc hw mode */
-+	if (nand->ecc.mode != NAND_ECC_HW) {
-+		dev_err(dev, "ecc.mode not supported\n");
-+		return -EINVAL;
-+	}
-+
-+	/* if optional DT settings are not present */
-+	if (!nand->ecc.size || !nand->ecc.strength) {
-+
-+		/* controller only supports sizes 512 and 1024 */
-+		nand->ecc.size = (mtd->writesize > 512) ? 1024 : 512;
-+
-+		/* get controller valid values */
-+		mtk_nfc_set_spare_per_sector(&spare, mtd);
-+		spare = spare - NFI_FDM_MAX_SIZE;
-+		nand->ecc.strength = (spare << 3) / ECC_PARITY_BITS;
-+	}
-+
-+	mtk_ecc_update_strength(&nand->ecc.strength);
-+
-+	dev_info(dev, "eccsize %d eccstrength %d\n",
-+		nand->ecc.size, nand->ecc.strength);
-+
-+	return 0;
-+}
-+
-+static int mtk_nfc_nand_chip_init(struct device *dev, struct mtk_nfc *nfc,
-+				struct device_node *np)
-+{
-+	struct mtk_nfc_nand_chip *chip;
-+	struct nand_chip *nand;
-+	struct mtd_info *mtd;
-+	int nsels, len;
-+	u32 tmp;
-+	int ret;
-+	int i;
-+
-+	if (!of_get_property(np, "reg", &nsels))
-+		return -ENODEV;
-+
-+	nsels /= sizeof(u32);
-+	if (!nsels || nsels > MTK_NAND_MAX_NSELS) {
-+		dev_err(dev, "invalid reg property size %d\n", nsels);
-+		return -EINVAL;
-+	}
-+
-+	chip = devm_kzalloc(dev,
-+			sizeof(*chip) + nsels * sizeof(u8), GFP_KERNEL);
-+	if (!chip)
-+		return -ENOMEM;
-+
-+	chip->nsels = nsels;
-+	for (i = 0; i < nsels; i++) {
-+		ret = of_property_read_u32_index(np, "reg", i, &tmp);
-+		if (ret) {
-+			dev_err(dev, "reg property failure : %d\n", ret);
-+			return ret;
-+		}
-+		chip->sels[i] = tmp;
-+	}
-+
-+	nand = &chip->nand;
-+	nand->controller = &nfc->controller;
-+
-+	nand_set_flash_node(nand, np);
-+	nand_set_controller_data(nand, nfc);
-+
-+	nand->options |= NAND_USE_BOUNCE_BUFFER | NAND_SUBPAGE_READ;
-+	nand->dev_ready = mtk_nfc_dev_ready;
-+	nand->select_chip = mtk_nfc_select_chip;
-+	nand->write_byte = mtk_nfc_write_byte;
-+	nand->write_buf = mtk_nfc_write_buf;
-+	nand->read_byte = mtk_nfc_read_byte;
-+	nand->read_buf = mtk_nfc_read_buf;
-+	nand->cmd_ctrl = mtk_nfc_cmd_ctrl;
-+
-+	/* set default mode in case dt entry is missing */
-+	nand->ecc.mode = NAND_ECC_HW;
-+
-+	nand->ecc.write_subpage = mtk_nfc_write_subpage_hwecc;
-+	nand->ecc.write_page_raw = mtk_nfc_write_page_raw;
-+	nand->ecc.write_page = mtk_nfc_write_page_hwecc;
-+	nand->ecc.write_oob_raw = mtk_nfc_write_oob_std;
-+	nand->ecc.write_oob = mtk_nfc_write_oob_std;
-+
-+	nand->ecc.read_subpage = mtk_nfc_read_subpage_hwecc;
-+	nand->ecc.read_page_raw = mtk_nfc_read_page_raw;
-+	nand->ecc.read_page = mtk_nfc_read_page_hwecc;
-+	nand->ecc.read_oob_raw = mtk_nfc_read_oob_std;
-+	nand->ecc.read_oob = mtk_nfc_read_oob_std;
-+
-+	mtd = nand_to_mtd(nand);
-+	mtd->owner = THIS_MODULE;
-+	mtd->dev.parent = dev;
-+	mtd->name = MTK_NAME;
-+	mtd_set_ooblayout(mtd, &mtk_nfc_ooblayout_ops);
-+
-+	mtk_nfc_hw_init(nfc);
-+
-+	ret = nand_scan_ident(mtd, nsels, NULL);
-+	if (ret)
-+		return -ENODEV;
-+
-+	/* store bbt magic in page, cause OOB is not protected */
-+	if (nand->bbt_options & NAND_BBT_USE_FLASH)
-+		nand->bbt_options |= NAND_BBT_NO_OOB;
-+
-+	ret = mtk_nfc_ecc_init(dev, mtd);
-+	if (ret)
-+		return -EINVAL;
-+
-+	mtk_nfc_set_spare_per_sector(&chip->spare_per_sector, mtd);
-+	mtk_nfc_set_fdm(&chip->fdm, mtd);
-+	mtk_nfc_set_bad_mark_ctl(&chip->bad_mark, mtd);
-+
-+	len = mtd->writesize + mtd->oobsize;
-+	nfc->buffer = devm_kzalloc(dev, len, GFP_KERNEL);
-+	if (!nfc->buffer)
-+		return  -ENOMEM;
-+
-+	ret = nand_scan_tail(mtd);
-+	if (ret)
-+		return -ENODEV;
-+
-+	ret = mtd_device_parse_register(mtd, NULL, NULL, NULL, 0);
-+	if (ret) {
-+		dev_err(dev, "mtd parse partition error\n");
-+		nand_release(mtd);
-+		return ret;
-+	}
-+
-+	list_add_tail(&chip->node, &nfc->chips);
-+
-+	return 0;
-+}
-+
-+static int mtk_nfc_nand_chips_init(struct device *dev, struct mtk_nfc *nfc)
-+{
-+	struct device_node *np = dev->of_node;
-+	struct device_node *nand_np;
-+	int ret;
-+
-+	for_each_child_of_node(np, nand_np) {
-+		ret = mtk_nfc_nand_chip_init(dev, nfc, nand_np);
-+		if (ret) {
-+			of_node_put(nand_np);
-+			return ret;
-+		}
-+	}
-+
-+	return 0;
-+}
-+
-+static int mtk_nfc_probe(struct platform_device *pdev)
-+{
-+	struct device *dev = &pdev->dev;
-+	struct device_node *np = dev->of_node;
-+	struct mtk_nfc *nfc;
-+	struct resource *res;
-+	int ret, irq;
-+
-+	nfc = devm_kzalloc(dev, sizeof(*nfc), GFP_KERNEL);
-+	if (!nfc)
-+		return -ENOMEM;
-+
-+	spin_lock_init(&nfc->controller.lock);
-+	init_waitqueue_head(&nfc->controller.wq);
-+	INIT_LIST_HEAD(&nfc->chips);
-+
-+	/* probe defer if not ready */
-+	nfc->ecc = of_mtk_ecc_get(np);
-+	if (IS_ERR(nfc->ecc))
-+		return PTR_ERR(nfc->ecc);
-+	else if (!nfc->ecc)
-+		return -ENODEV;
-+
-+	nfc->dev = dev;
-+
-+	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-+	nfc->regs = devm_ioremap_resource(dev, res);
-+	if (IS_ERR(nfc->regs)) {
-+		ret = PTR_ERR(nfc->regs);
-+		dev_err(dev, "no nfi base\n");
-+		goto release_ecc;
-+	}
-+
-+	nfc->clk.nfi_clk = devm_clk_get(dev, "nfi_clk");
-+	if (IS_ERR(nfc->clk.nfi_clk)) {
-+		dev_err(dev, "no clk\n");
-+		ret = PTR_ERR(nfc->clk.nfi_clk);
-+		goto release_ecc;
-+	}
-+
-+	nfc->clk.pad_clk = devm_clk_get(dev, "pad_clk");
-+	if (IS_ERR(nfc->clk.pad_clk)) {
-+		dev_err(dev, "no pad clk\n");
-+		ret = PTR_ERR(nfc->clk.pad_clk);
-+		goto release_ecc;
-+	}
-+
-+	ret = mtk_nfc_enable_clk(dev, &nfc->clk);
-+	if (ret)
-+		goto release_ecc;
-+
-+	irq = platform_get_irq(pdev, 0);
-+	if (irq < 0) {
-+		dev_err(dev, "no nfi irq resource\n");
-+		ret = -EINVAL;
-+		goto clk_disable;
-+	}
-+
-+	ret = devm_request_irq(dev, irq, mtk_nfc_irq, 0x0, "mtk-nand", nfc);
-+	if (ret) {
-+		dev_err(dev, "failed to request nfi irq\n");
-+		goto clk_disable;
-+	}
-+
-+	ret = dma_set_mask(dev, DMA_BIT_MASK(32));
-+	if (ret) {
-+		dev_err(dev, "failed to set dma mask\n");
-+		goto clk_disable;
-+	}
-+
-+	platform_set_drvdata(pdev, nfc);
-+
-+	ret = mtk_nfc_nand_chips_init(dev, nfc);
-+	if (ret) {
-+		dev_err(dev, "failed to init nand chips\n");
-+		goto clk_disable;
-+	}
-+
-+	return 0;
-+
-+clk_disable:
-+	mtk_nfc_disable_clk(&nfc->clk);
-+
-+release_ecc:
-+	mtk_ecc_release(nfc->ecc);
-+
-+	return ret;
-+}
-+
-+static int mtk_nfc_remove(struct platform_device *pdev)
-+{
-+	struct mtk_nfc *nfc = platform_get_drvdata(pdev);
-+	struct mtk_nfc_nand_chip *chip;
-+
-+	while (!list_empty(&nfc->chips)) {
-+		chip = list_first_entry(&nfc->chips, struct mtk_nfc_nand_chip,
-+					node);
-+		nand_release(nand_to_mtd(&chip->nand));
-+		list_del(&chip->node);
-+	}
-+
-+	mtk_ecc_release(nfc->ecc);
-+	mtk_nfc_disable_clk(&nfc->clk);
-+
-+	return 0;
-+}
-+
-+#ifdef CONFIG_PM_SLEEP
-+static int mtk_nfc_suspend(struct device *dev)
-+{
-+	struct mtk_nfc *nfc = dev_get_drvdata(dev);
-+
-+	mtk_nfc_disable_clk(&nfc->clk);
-+
-+	return 0;
-+}
-+
-+static int mtk_nfc_resume(struct device *dev)
-+{
-+	struct mtk_nfc *nfc = dev_get_drvdata(dev);
-+	struct mtk_nfc_nand_chip *chip;
-+	struct nand_chip *nand;
-+	struct mtd_info *mtd;
-+	int ret;
-+	u32 i;
-+
-+	udelay(200);
-+
-+	ret = mtk_nfc_enable_clk(dev, &nfc->clk);
-+	if (ret)
-+		return ret;
-+
-+	mtk_nfc_hw_init(nfc);
-+
-+	list_for_each_entry(chip, &nfc->chips, node) {
-+		nand = &chip->nand;
-+		mtd = nand_to_mtd(nand);
-+		for (i = 0; i < chip->nsels; i++) {
-+			nand->select_chip(mtd, i);
-+			nand->cmdfunc(mtd, NAND_CMD_RESET, -1, -1);
-+		}
-+	}
-+
-+	return 0;
-+}
-+static SIMPLE_DEV_PM_OPS(mtk_nfc_pm_ops, mtk_nfc_suspend, mtk_nfc_resume);
-+#endif
-+
-+static const struct of_device_id mtk_nfc_id_table[] = {
-+	{ .compatible = "mediatek,mt2701-nfc" },
-+	{}
-+};
-+MODULE_DEVICE_TABLE(of, mtk_nfc_id_table);
-+
-+static struct platform_driver mtk_nfc_driver = {
-+	.probe  = mtk_nfc_probe,
-+	.remove = mtk_nfc_remove,
-+	.driver = {
-+		.name  = MTK_NAME,
-+		.of_match_table = mtk_nfc_id_table,
-+#ifdef CONFIG_PM_SLEEP
-+		.pm = &mtk_nfc_pm_ops,
-+#endif
-+	},
-+};
-+
-+module_platform_driver(mtk_nfc_driver);
-+
-+MODULE_LICENSE("GPL");
-+MODULE_AUTHOR("Xiaolei Li <xiaolei.li at mediatek.com>");
-+MODULE_AUTHOR("Jorge Ramirez-Ortiz <jorge.ramirez-ortiz at linaro.org>");
-+MODULE_DESCRIPTION("MTK Nand Flash Controller Driver");
diff --git a/target/linux/mediatek/patches-4.4/0076-mtd-nand-add-power-domains-to-the-mediatek-driver.patch b/target/linux/mediatek/patches-4.4/0076-mtd-nand-add-power-domains-to-the-mediatek-driver.patch
deleted file mode 100644
index 7702246..0000000
--- a/target/linux/mediatek/patches-4.4/0076-mtd-nand-add-power-domains-to-the-mediatek-driver.patch
+++ /dev/null
@@ -1,67 +0,0 @@
-From 5dc0d474396e04e6c140d71f0e113eb1c03501c5 Mon Sep 17 00:00:00 2001
-From: John Crispin <john at phrozen.org>
-Date: Tue, 17 May 2016 05:44:10 +0200
-Subject: [PATCH 076/102] mtd: nand: add power domains to the mediatek driver
-
-Signed-off-by: John Crispin <john at phrozen.org>
----
- drivers/mtd/nand/mtk_nand.c |   13 ++++++++++++-
- 1 file changed, 12 insertions(+), 1 deletion(-)
-
---- a/drivers/mtd/nand/mtk_nand.c
-+++ b/drivers/mtd/nand/mtk_nand.c
-@@ -16,6 +16,7 @@
- 
- #include <linux/platform_device.h>
- #include <linux/dma-mapping.h>
-+#include <linux/pm_runtime.h>
- #include <linux/interrupt.h>
- #include <linux/delay.h>
- #include <linux/clk.h>
-@@ -102,6 +103,7 @@
- #define NFI_MASTER_STA		(0x224)
- #define		MASTER_STA_MASK		(0x0FFF)
- #define NFI_EMPTY_THRESH	(0x23C)
-+#define NFI_ACCCON1		(0x244)
- 
- #define MTK_NAME		"mtk-nand"
- #define KB(x)			((x) * 1024UL)
-@@ -539,6 +541,8 @@ static void mtk_nfc_bad_mark_swap(struct
- 	struct mtk_nfc_nand_chip *nand = to_mtk_nand(chip);
- 	u32 bad_pos = nand->bad_mark.pos;
- 
-+	return;
-+
- 	if (raw)
- 		bad_pos += nand->bad_mark.sec * mtk_data_len(chip);
- 	else
-@@ -946,7 +950,8 @@ static int mtk_nfc_read_oob_std(struct m
- 
- static inline void mtk_nfc_hw_init(struct mtk_nfc *nfc)
- {
--	nfi_writel(nfc, 0x10804211, NFI_ACCCON);
-+	nfi_writel(nfc, 0x30c77fff, NFI_ACCCON);
-+	nfi_writel(nfc, 0xC03222, NFI_ACCCON1);
- 	nfi_writew(nfc, 0xf1, NFI_CNRNB);
- 	nfi_writew(nfc, PAGEFMT_8K_16K, NFI_PAGEFMT);
- 
-@@ -1328,6 +1333,9 @@ static int mtk_nfc_probe(struct platform
- 		goto clk_disable;
- 	}
- 
-+	pm_runtime_enable(dev);
-+	pm_runtime_get_sync(dev);
-+
- 	platform_set_drvdata(pdev, nfc);
- 
- 	ret = mtk_nfc_nand_chips_init(dev, nfc);
-@@ -1362,6 +1370,9 @@ static int mtk_nfc_remove(struct platfor
- 	mtk_ecc_release(nfc->ecc);
- 	mtk_nfc_disable_clk(&nfc->clk);
- 
-+	pm_runtime_put_sync(&pdev->dev);
-+	pm_runtime_disable(&pdev->dev);
-+
- 	return 0;
- }
- 
diff --git a/target/linux/mediatek/patches-4.4/0077-net-next-mediatek-use-mdiobus_free-in-favour-of-kfre.patch b/target/linux/mediatek/patches-4.4/0077-net-next-mediatek-use-mdiobus_free-in-favour-of-kfre.patch
deleted file mode 100644
index c2fe218..0000000
--- a/target/linux/mediatek/patches-4.4/0077-net-next-mediatek-use-mdiobus_free-in-favour-of-kfre.patch
+++ /dev/null
@@ -1,36 +0,0 @@
-From b1c85818c3fb00022dc125bb62d657d3fd3cf49c Mon Sep 17 00:00:00 2001
-From: John Crispin <john at phrozen.org>
-Date: Sat, 7 May 2016 06:31:08 +0200
-Subject: [PATCH 077/102] net-next: mediatek: use mdiobus_free() in favour of
- kfree()
-
-The driver currently uses kfree() to clear the mii_bus. This is not the
-correct way to clear the memory and mdiobus_free() should be used instead.
-This patch fixes the two instances where this happens in the driver.
-
-Reviewed-by: Andrew Lunn <andrew at lunn.ch>
-Signed-off-by: John Crispin <john at phrozen.org>
----
- drivers/net/ethernet/mediatek/mtk_eth_soc.c |    4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-@@ -280,7 +280,7 @@ static int mtk_mdio_init(struct mtk_eth
- 	return 0;
- 
- err_free_bus:
--	kfree(eth->mii_bus);
-+	mdiobus_free(eth->mii_bus);
- 
- err_put_node:
- 	of_node_put(mii_np);
-@@ -295,7 +295,7 @@ static void mtk_mdio_cleanup(struct mtk_
- 
- 	mdiobus_unregister(eth->mii_bus);
- 	of_node_put(eth->mii_bus->dev.of_node);
--	kfree(eth->mii_bus);
-+	mdiobus_free(eth->mii_bus);
- }
- 
- static inline void mtk_irq_disable(struct mtk_eth *eth, u32 mask)
diff --git a/target/linux/mediatek/patches-4.4/0078-net-next-mediatek-fix-gigabit-and-flow-control-adver.patch b/target/linux/mediatek/patches-4.4/0078-net-next-mediatek-fix-gigabit-and-flow-control-adver.patch
deleted file mode 100644
index 42adb9e..0000000
--- a/target/linux/mediatek/patches-4.4/0078-net-next-mediatek-fix-gigabit-and-flow-control-adver.patch
+++ /dev/null
@@ -1,71 +0,0 @@
-From 09313f26999e2685e0b9434374e7308e1f447e55 Mon Sep 17 00:00:00 2001
-From: John Crispin <john at phrozen.org>
-Date: Fri, 22 Apr 2016 11:05:23 +0200
-Subject: [PATCH 078/102] net-next: mediatek: fix gigabit and flow control
- advertisement
-
-The current code will not setup the PHYs advertisement features correctly.
-Fix this and properly advertise Gigabit features and properly handle
-asymmetric pause frames.
-
-Signed-off-by: Sean Wang <keyhaede at gmail.com>
-Signed-off-by: John Crispin <john at phrozen.org>
----
- drivers/net/ethernet/mediatek/mtk_eth_soc.c |   30 +++++++++++++++++++++++----
- 1 file changed, 26 insertions(+), 4 deletions(-)
-
---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-@@ -133,6 +133,8 @@ static int mtk_mdio_read(struct mii_bus
- static void mtk_phy_link_adjust(struct net_device *dev)
- {
- 	struct mtk_mac *mac = netdev_priv(dev);
-+	u16 lcl_adv = 0, rmt_adv = 0;
-+	u8 flowctrl;
- 	u32 mcr = MAC_MCR_MAX_RX_1536 | MAC_MCR_IPG_CFG |
- 		  MAC_MCR_FORCE_MODE | MAC_MCR_TX_EN |
- 		  MAC_MCR_RX_EN | MAC_MCR_BACKOFF_EN |
-@@ -150,11 +152,30 @@ static void mtk_phy_link_adjust(struct n
- 	if (mac->phy_dev->link)
- 		mcr |= MAC_MCR_FORCE_LINK;
- 
--	if (mac->phy_dev->duplex)
-+	if (mac->phy_dev->duplex) {
- 		mcr |= MAC_MCR_FORCE_DPX;
- 
--	if (mac->phy_dev->pause)
--		mcr |= MAC_MCR_FORCE_RX_FC | MAC_MCR_FORCE_TX_FC;
-+		if (mac->phy_dev->pause)
-+			rmt_adv = LPA_PAUSE_CAP;
-+		if (mac->phy_dev->asym_pause)
-+			rmt_adv |= LPA_PAUSE_ASYM;
-+
-+		if (mac->phy_dev->advertising & ADVERTISED_Pause)
-+			lcl_adv |= ADVERTISE_PAUSE_CAP;
-+		if (mac->phy_dev->advertising & ADVERTISED_Asym_Pause)
-+			lcl_adv |= ADVERTISE_PAUSE_ASYM;
-+
-+		flowctrl = mii_resolve_flowctrl_fdx(lcl_adv, rmt_adv);
-+
-+		if (flowctrl & FLOW_CTRL_TX)
-+			mcr |= MAC_MCR_FORCE_TX_FC;
-+		if (flowctrl & FLOW_CTRL_RX)
-+			mcr |= MAC_MCR_FORCE_RX_FC;
-+
-+		netif_dbg(mac->hw, link, dev, "rx pause %s, tx pause %s\n",
-+			  flowctrl & FLOW_CTRL_RX ? "enabled" : "disabled",
-+			  flowctrl & FLOW_CTRL_TX ? "enabled" : "disabled");
-+	}
- 
- 	mtk_w32(mac->hw, mcr, MTK_MAC_MCR(mac->id));
- 
-@@ -236,7 +257,8 @@ static int mtk_phy_connect(struct mtk_ma
- 	mac->phy_dev->autoneg = AUTONEG_ENABLE;
- 	mac->phy_dev->speed = 0;
- 	mac->phy_dev->duplex = 0;
--	mac->phy_dev->supported &= PHY_BASIC_FEATURES;
-+	mac->phy_dev->supported &= PHY_GBIT_FEATURES | SUPPORTED_Pause |
-+				   SUPPORTED_Asym_Pause;
- 	mac->phy_dev->advertising = mac->phy_dev->supported |
- 				    ADVERTISED_Autoneg;
- 	phy_start_aneg(mac->phy_dev);
diff --git a/target/linux/mediatek/patches-4.4/0079-net-next-mediatek-add-fixed-phy-support.patch b/target/linux/mediatek/patches-4.4/0079-net-next-mediatek-add-fixed-phy-support.patch
deleted file mode 100644
index 669febb..0000000
--- a/target/linux/mediatek/patches-4.4/0079-net-next-mediatek-add-fixed-phy-support.patch
+++ /dev/null
@@ -1,38 +0,0 @@
-From 09f0b50ae838bd6e2bbf0aa22de9f352122297de Mon Sep 17 00:00:00 2001
-From: John Crispin <john at phrozen.org>
-Date: Fri, 22 Apr 2016 11:06:03 +0200
-Subject: [PATCH 079/102] net-next: mediatek: add fixed-phy support
-
-The MT7623 SoC has a builtin gigabit switch. If we want to use it, GMAC1
-needs to be configured using a fixed link speed and flow control settings.
-The easiest way to do this is to used the fixed-phy driver, allowing us to
-reuse the existing mdio polling code to setup the MAC.
-
-Reviewed-by: Andrew Lunn <andrew at lunn.ch>
-Signed-off-by: John Crispin <john at phrozen.org>
----
- drivers/net/ethernet/mediatek/mtk_eth_soc.c |    6 ++++++
- 1 file changed, 6 insertions(+)
-
---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-@@ -229,6 +229,9 @@ static int mtk_phy_connect(struct mtk_ma
- 	u32 val, ge_mode;
- 
- 	np = of_parse_phandle(mac->of_node, "phy-handle", 0);
-+	if (!np && of_phy_is_fixed_link(mac->of_node))
-+		if (!of_phy_register_fixed_link(mac->of_node))
-+			np = of_node_get(mac->of_node);
- 	if (!np)
- 		return -ENODEV;
- 
-@@ -257,6 +260,9 @@ static int mtk_phy_connect(struct mtk_ma
- 	mac->phy_dev->autoneg = AUTONEG_ENABLE;
- 	mac->phy_dev->speed = 0;
- 	mac->phy_dev->duplex = 0;
-+	if (of_phy_is_fixed_link(mac->of_node))
-+		mac->phy_dev->supported |= SUPPORTED_Pause |
-+					   SUPPORTED_Asym_Pause;
- 	mac->phy_dev->supported &= PHY_GBIT_FEATURES | SUPPORTED_Pause |
- 				   SUPPORTED_Asym_Pause;
- 	mac->phy_dev->advertising = mac->phy_dev->supported |
diff --git a/target/linux/mediatek/patches-4.4/0080-net-next-mediatek-properly-handle-RGMII-modes.patch b/target/linux/mediatek/patches-4.4/0080-net-next-mediatek-properly-handle-RGMII-modes.patch
deleted file mode 100644
index 1d176f2..0000000
--- a/target/linux/mediatek/patches-4.4/0080-net-next-mediatek-properly-handle-RGMII-modes.patch
+++ /dev/null
@@ -1,31 +0,0 @@
-From 25eaa5d6483a5899e6bf48b47f762f05c186b4b6 Mon Sep 17 00:00:00 2001
-From: John Crispin <john at phrozen.org>
-Date: Fri, 22 Apr 2016 11:08:43 +0200
-Subject: [PATCH 080/102] net-next: mediatek: properly handle RGMII modes
-
-If an external Gigabit PHY is connected to either of the MACs we need to
-be able to tell the PHY to use a delay. Not doing so will result in heavy
-packet loss and/or data corruption when using PHYs such as the IC+ IP1001.
-We tell the PHY which MII delay mode to use via the devictree.
-
-The ethernet driver needs to be adapted to handle all 3 rgmii-*id modes
-in the same way as normal rgmii when setting up the MAC.
-
-Reviewed-by: Andrew Lunn <andrew at lunn.ch>
-Signed-off-by: John Crispin <john at phrozen.org>
----
- drivers/net/ethernet/mediatek/mtk_eth_soc.c |    3 +++
- 1 file changed, 3 insertions(+)
-
---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-@@ -236,6 +236,9 @@ static int mtk_phy_connect(struct mtk_ma
- 		return -ENODEV;
- 
- 	switch (of_get_phy_mode(np)) {
-+	case PHY_INTERFACE_MODE_RGMII_TXID:
-+	case PHY_INTERFACE_MODE_RGMII_RXID:
-+	case PHY_INTERFACE_MODE_RGMII_ID:
- 	case PHY_INTERFACE_MODE_RGMII:
- 		ge_mode = 0;
- 		break;
diff --git a/target/linux/mediatek/patches-4.4/0081-net-next-mediatek-fix-DQL-support.patch b/target/linux/mediatek/patches-4.4/0081-net-next-mediatek-fix-DQL-support.patch
deleted file mode 100644
index f1c7290..0000000
--- a/target/linux/mediatek/patches-4.4/0081-net-next-mediatek-fix-DQL-support.patch
+++ /dev/null
@@ -1,92 +0,0 @@
-From 81cdbda2a08375b9d5915567d2210bf2433e7332 Mon Sep 17 00:00:00 2001
-From: John Crispin <john at phrozen.org>
-Date: Sat, 23 Apr 2016 11:57:21 +0200
-Subject: [PATCH 081/102] net-next: mediatek: fix DQL support
-
-The MTK ethernet core has 2 MACs both sitting on the same DMA ring. The
-current code will assign the TX traffic of each MAC to its own DQL. This
-results in the amount of data, that DQL says is in the queue incorrect. As
-the data from multiple devices is infact enqueued. This makes any decision
-based on these value non deterministic. Fix this by tracking all TX
-traffic, regardless of the MAC it belongs to in the DQL of all devices
-using the DMA.
-
-Signed-off-by: John Crispin <john at phrozen.org>
----
- drivers/net/ethernet/mediatek/mtk_eth_soc.c |   33 ++++++++++++++++-----------
- 1 file changed, 20 insertions(+), 13 deletions(-)
-
---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-@@ -656,7 +656,16 @@ static int mtk_tx_map(struct sk_buff *sk
- 	WRITE_ONCE(itxd->txd3, (TX_DMA_SWC | TX_DMA_PLEN0(skb_headlen(skb)) |
- 				(!nr_frags * TX_DMA_LS0)));
- 
--	netdev_sent_queue(dev, skb->len);
-+	/* we have a single DMA ring so BQL needs to be updated for all devices
-+	 * sitting on this ring
-+	 */
-+	for (i = 0; i < MTK_MAC_COUNT; i++) {
-+		if (!eth->netdev[i])
-+			continue;
-+
-+		netdev_sent_queue(eth->netdev[i], skb->len);
-+	}
-+
- 	skb_tx_timestamp(skb);
- 
- 	ring->next_free = mtk_qdma_phys_to_virt(ring, txd->txd2);
-@@ -884,21 +893,18 @@ static int mtk_poll_tx(struct mtk_eth *e
- 	struct mtk_tx_dma *desc;
- 	struct sk_buff *skb;
- 	struct mtk_tx_buf *tx_buf;
--	int total = 0, done[MTK_MAX_DEVS];
--	unsigned int bytes[MTK_MAX_DEVS];
-+	int total = 0, done = 0;
-+	unsigned int bytes = 0;
- 	u32 cpu, dma;
- 	static int condition;
- 	int i;
- 
--	memset(done, 0, sizeof(done));
--	memset(bytes, 0, sizeof(bytes));
--
- 	cpu = mtk_r32(eth, MTK_QTX_CRX_PTR);
- 	dma = mtk_r32(eth, MTK_QTX_DRX_PTR);
- 
- 	desc = mtk_qdma_phys_to_virt(ring, cpu);
- 
--	while ((cpu != dma) && budget) {
-+	while ((cpu != dma) && done < budget) {
- 		u32 next_cpu = desc->txd2;
- 		int mac;
- 
-@@ -918,9 +924,8 @@ static int mtk_poll_tx(struct mtk_eth *e
- 		}
- 
- 		if (skb != (struct sk_buff *)MTK_DMA_DUMMY_DESC) {
--			bytes[mac] += skb->len;
--			done[mac]++;
--			budget--;
-+			bytes += skb->len;
-+			done++;
- 		}
- 		mtk_tx_unmap(eth->dev, tx_buf);
- 
-@@ -933,11 +938,13 @@ static int mtk_poll_tx(struct mtk_eth *e
- 
- 	mtk_w32(eth, cpu, MTK_QTX_CRX_PTR);
- 
-+	/* we have a single DMA ring so BQL needs to be updated for all devices
-+	 * sitting on this ring
-+	 */
- 	for (i = 0; i < MTK_MAC_COUNT; i++) {
--		if (!eth->netdev[i] || !done[i])
-+		if (!eth->netdev[i])
- 			continue;
--		netdev_completed_queue(eth->netdev[i], done[i], bytes[i]);
--		total += done[i];
-+		netdev_completed_queue(eth->netdev[i], done, bytes);
- 	}
- 
- 	/* read hw index again make sure no new tx packet */
diff --git a/target/linux/mediatek/patches-4.4/0082-net-next-mediatek-add-missing-return-code-check.patch b/target/linux/mediatek/patches-4.4/0082-net-next-mediatek-add-missing-return-code-check.patch
deleted file mode 100644
index 19cdbf0..0000000
--- a/target/linux/mediatek/patches-4.4/0082-net-next-mediatek-add-missing-return-code-check.patch
+++ /dev/null
@@ -1,26 +0,0 @@
-From 51ca1e9f141499fd7c95bff5401215b706656754 Mon Sep 17 00:00:00 2001
-From: John Crispin <john at phrozen.org>
-Date: Sat, 23 Apr 2016 09:06:05 +0200
-Subject: [PATCH 082/102] net-next: mediatek: add missing return code check
-
-The code fails to check if the scratch memory was properly allocated. Add
-this check and return with an error if the allocation failed.
-
-Signed-off-by: Sean Wang <keyhaede at gmail.com>
-Signed-off-by: John Crispin <john at phrozen.org>
----
- drivers/net/ethernet/mediatek/mtk_eth_soc.c |    3 +++
- 1 file changed, 3 insertions(+)
-
---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-@@ -498,6 +498,9 @@ static int mtk_init_fq_dma(struct mtk_et
- 
- 	eth->scratch_head = kcalloc(cnt, MTK_QDMA_PAGE_SIZE,
- 				    GFP_KERNEL);
-+	if (unlikely(!eth->scratch_head))
-+		return -ENOMEM;
-+
- 	dma_addr = dma_map_single(eth->dev,
- 				  eth->scratch_head, cnt * MTK_QDMA_PAGE_SIZE,
- 				  DMA_FROM_DEVICE);
diff --git a/target/linux/mediatek/patches-4.4/0083-net-next-mediatek-fix-missing-free-of-scratch-memory.patch b/target/linux/mediatek/patches-4.4/0083-net-next-mediatek-fix-missing-free-of-scratch-memory.patch
deleted file mode 100644
index 793875f..0000000
--- a/target/linux/mediatek/patches-4.4/0083-net-next-mediatek-fix-missing-free-of-scratch-memory.patch
+++ /dev/null
@@ -1,92 +0,0 @@
-From b48745c534ced06005d2ba57198b54a6a160b39d Mon Sep 17 00:00:00 2001
-From: John Crispin <john at phrozen.org>
-Date: Sat, 23 Apr 2016 09:18:28 +0200
-Subject: [PATCH 083/102] net-next: mediatek: fix missing free of scratch
- memory
-
-Scratch memory gets allocated in mtk_init_fq_dma() but the corresponding
-code to free it is missing inside mtk_dma_free() causing a memory leak.
-With this patch applied, we can run ifconfig/up/down several thousand
-times without any problems.
-
-Signed-off-by: John Crispin <john at phrozen.org>
----
- drivers/net/ethernet/mediatek/mtk_eth_soc.c |   18 +++++++++++++-----
- drivers/net/ethernet/mediatek/mtk_eth_soc.h |    2 ++
- 2 files changed, 15 insertions(+), 5 deletions(-)
-
---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-@@ -484,14 +484,14 @@ static inline void mtk_rx_get_desc(struc
- /* the qdma core needs scratch memory to be setup */
- static int mtk_init_fq_dma(struct mtk_eth *eth)
- {
--	dma_addr_t phy_ring_head, phy_ring_tail;
-+	dma_addr_t phy_ring_tail;
- 	int cnt = MTK_DMA_SIZE;
- 	dma_addr_t dma_addr;
- 	int i;
- 
- 	eth->scratch_ring = dma_alloc_coherent(eth->dev,
- 					       cnt * sizeof(struct mtk_tx_dma),
--					       &phy_ring_head,
-+					       &eth->phy_scratch_ring,
- 					       GFP_ATOMIC | __GFP_ZERO);
- 	if (unlikely(!eth->scratch_ring))
- 		return -ENOMEM;
-@@ -508,19 +508,19 @@ static int mtk_init_fq_dma(struct mtk_et
- 		return -ENOMEM;
- 
- 	memset(eth->scratch_ring, 0x0, sizeof(struct mtk_tx_dma) * cnt);
--	phy_ring_tail = phy_ring_head +
-+	phy_ring_tail = eth->phy_scratch_ring +
- 			(sizeof(struct mtk_tx_dma) * (cnt - 1));
- 
- 	for (i = 0; i < cnt; i++) {
- 		eth->scratch_ring[i].txd1 =
- 					(dma_addr + (i * MTK_QDMA_PAGE_SIZE));
- 		if (i < cnt - 1)
--			eth->scratch_ring[i].txd2 = (phy_ring_head +
-+			eth->scratch_ring[i].txd2 = (eth->phy_scratch_ring +
- 				((i + 1) * sizeof(struct mtk_tx_dma)));
- 		eth->scratch_ring[i].txd3 = TX_DMA_SDL(MTK_QDMA_PAGE_SIZE);
- 	}
- 
--	mtk_w32(eth, phy_ring_head, MTK_QDMA_FQ_HEAD);
-+	mtk_w32(eth, eth->phy_scratch_ring, MTK_QDMA_FQ_HEAD);
- 	mtk_w32(eth, phy_ring_tail, MTK_QDMA_FQ_TAIL);
- 	mtk_w32(eth, (cnt << 16) | cnt, MTK_QDMA_FQ_CNT);
- 	mtk_w32(eth, MTK_QDMA_PAGE_SIZE << 16, MTK_QDMA_FQ_BLEN);
-@@ -1220,6 +1220,14 @@ static void mtk_dma_free(struct mtk_eth
- 	for (i = 0; i < MTK_MAC_COUNT; i++)
- 		if (eth->netdev[i])
- 			netdev_reset_queue(eth->netdev[i]);
-+	if (eth->scratch_ring) {
-+		dma_free_coherent(eth->dev,
-+				  MTK_DMA_SIZE * sizeof(struct mtk_tx_dma),
-+				  eth->scratch_ring,
-+				  eth->phy_scratch_ring);
-+		eth->scratch_ring = NULL;
-+		eth->phy_scratch_ring = 0;
-+	}
- 	mtk_tx_clean(eth);
- 	mtk_rx_clean(eth);
- 	kfree(eth->scratch_head);
---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h
-+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
-@@ -357,6 +357,7 @@ struct mtk_rx_ring {
-  * @rx_ring:		Pointer to the memore holding info about the RX ring
-  * @rx_napi:		The NAPI struct
-  * @scratch_ring:	Newer SoCs need memory for a second HW managed TX ring
-+ * @phy_scratch_ring:	physical address of scratch_ring
-  * @scratch_head:	The scratch memory that scratch_ring points to.
-  * @clk_ethif:		The ethif clock
-  * @clk_esw:		The switch clock
-@@ -384,6 +385,7 @@ struct mtk_eth {
- 	struct mtk_rx_ring		rx_ring;
- 	struct napi_struct		rx_napi;
- 	struct mtk_tx_dma		*scratch_ring;
-+	dma_addr_t			phy_scratch_ring;
- 	void				*scratch_head;
- 	struct clk			*clk_ethif;
- 	struct clk			*clk_esw;
diff --git a/target/linux/mediatek/patches-4.4/0084-net-next-mediatek-invalid-buffer-lookup-in-mtk_tx_ma.patch b/target/linux/mediatek/patches-4.4/0084-net-next-mediatek-invalid-buffer-lookup-in-mtk_tx_ma.patch
deleted file mode 100644
index eb44af6..0000000
--- a/target/linux/mediatek/patches-4.4/0084-net-next-mediatek-invalid-buffer-lookup-in-mtk_tx_ma.patch
+++ /dev/null
@@ -1,27 +0,0 @@
-From 1eea1536dbbbfda418751ec6f5387acb521ddb97 Mon Sep 17 00:00:00 2001
-From: John Crispin <john at phrozen.org>
-Date: Sat, 23 Apr 2016 09:25:00 +0200
-Subject: [PATCH 084/102] net-next: mediatek: invalid buffer lookup in
- mtk_tx_map()
-
-The lookup of the tx_buffer in the error path inside mtk_tx_map() uses the
-wrong descriptor pointer. This looks like a copy & paste error. Change the
-code to use the correct pointer.
-
-Signed-off-by: Sean Wang <keyhaede at gmail.com>
-Signed-off-by: John Crispin <john at phrozen.org>
----
- drivers/net/ethernet/mediatek/mtk_eth_soc.c |    2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-@@ -686,7 +686,7 @@ static int mtk_tx_map(struct sk_buff *sk
- 
- err_dma:
- 	do {
--		tx_buf = mtk_desc_to_tx_buf(ring, txd);
-+		tx_buf = mtk_desc_to_tx_buf(ring, itxd);
- 
- 		/* unmap dma */
- 		mtk_tx_unmap(&dev->dev, tx_buf);
diff --git a/target/linux/mediatek/patches-4.4/0085-net-next-mediatek-dropped-rx-packets-are-not-being-c.patch b/target/linux/mediatek/patches-4.4/0085-net-next-mediatek-dropped-rx-packets-are-not-being-c.patch
deleted file mode 100644
index 2b2a011..0000000
--- a/target/linux/mediatek/patches-4.4/0085-net-next-mediatek-dropped-rx-packets-are-not-being-c.patch
+++ /dev/null
@@ -1,34 +0,0 @@
-From 98aac832925a99afee8722cdfd5a848dd6086b8f Mon Sep 17 00:00:00 2001
-From: John Crispin <john at phrozen.org>
-Date: Sat, 23 Apr 2016 09:28:25 +0200
-Subject: [PATCH 085/102] net-next: mediatek: dropped rx packets are not being
- counted properly
-
-There are 2 places inside mtk_poll_rx where rx_dropped is not being
-incremented properly. Fix this by adding the missing code to increment
-the counter.
-
-Signed-off-by: Sean Wang <keyhaede at gmail.com>
-Signed-off-by: John Crispin <john at phrozen.org>
----
- drivers/net/ethernet/mediatek/mtk_eth_soc.c |    2 ++
- 1 file changed, 2 insertions(+)
-
---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-@@ -841,6 +841,7 @@ static int mtk_poll_rx(struct napi_struc
- 					  DMA_FROM_DEVICE);
- 		if (unlikely(dma_mapping_error(&netdev->dev, dma_addr))) {
- 			skb_free_frag(new_data);
-+			netdev->stats.rx_dropped++;
- 			goto release_desc;
- 		}
- 
-@@ -848,6 +849,7 @@ static int mtk_poll_rx(struct napi_struc
- 		skb = build_skb(data, ring->frag_size);
- 		if (unlikely(!skb)) {
- 			put_page(virt_to_head_page(new_data));
-+			netdev->stats.rx_dropped++;
- 			goto release_desc;
- 		}
- 		skb_reserve(skb, NET_SKB_PAD + NET_IP_ALIGN);
diff --git a/target/linux/mediatek/patches-4.4/0086-net-next-mediatek-add-next-data-pointer-coherency-pr.patch b/target/linux/mediatek/patches-4.4/0086-net-next-mediatek-add-next-data-pointer-coherency-pr.patch
deleted file mode 100644
index cd4bdf8..0000000
--- a/target/linux/mediatek/patches-4.4/0086-net-next-mediatek-add-next-data-pointer-coherency-pr.patch
+++ /dev/null
@@ -1,39 +0,0 @@
-From 5077ac38a86023124ebbe24cd1b7ecbd0f8edaff Mon Sep 17 00:00:00 2001
-From: John Crispin <john at phrozen.org>
-Date: Tue, 3 May 2016 03:06:59 +0200
-Subject: [PATCH 086/102] net-next: mediatek: add next data pointer coherency
- protection
-
-The QDMA engine can fail to update the register pointing to the next TX
-descriptor if this bit does not get set in the QDMA configuration register.
-Not setting this bit can result in invalid values inside the TX rings
-registers which will causes TX stalls.
-
-Signed-off-by: Sean Wang <keyhaede at gmail.com>
-Signed-off-by: John Crispin <john at phrozen.org>
----
- drivers/net/ethernet/mediatek/mtk_eth_soc.c |    2 +-
- drivers/net/ethernet/mediatek/mtk_eth_soc.h |    1 +
- 2 files changed, 2 insertions(+), 1 deletion(-)
-
---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-@@ -1292,7 +1292,7 @@ static int mtk_start_dma(struct mtk_eth
- 	mtk_w32(eth,
- 		MTK_TX_WB_DDONE | MTK_RX_DMA_EN | MTK_TX_DMA_EN |
- 		MTK_RX_2B_OFFSET | MTK_DMA_SIZE_16DWORDS |
--		MTK_RX_BT_32DWORDS,
-+		MTK_RX_BT_32DWORDS | MTK_NDP_CO_PRO,
- 		MTK_QDMA_GLO_CFG);
- 
- 	return 0;
---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h
-+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
-@@ -91,6 +91,7 @@
- #define MTK_QDMA_GLO_CFG	0x1A04
- #define MTK_RX_2B_OFFSET	BIT(31)
- #define MTK_RX_BT_32DWORDS	(3 << 11)
-+#define MTK_NDP_CO_PRO		BIT(10)
- #define MTK_TX_WB_DDONE		BIT(6)
- #define MTK_DMA_SIZE_16DWORDS	(2 << 4)
- #define MTK_RX_DMA_BUSY		BIT(3)
diff --git a/target/linux/mediatek/patches-4.4/0087-net-next-mediatek-disable-all-interrupts-during-prob.patch b/target/linux/mediatek/patches-4.4/0087-net-next-mediatek-disable-all-interrupts-during-prob.patch
deleted file mode 100644
index 6e809b9..0000000
--- a/target/linux/mediatek/patches-4.4/0087-net-next-mediatek-disable-all-interrupts-during-prob.patch
+++ /dev/null
@@ -1,26 +0,0 @@
-From f9a08e142fd87c72a7803203ce4ecc94806046ca Mon Sep 17 00:00:00 2001
-From: John Crispin <john at phrozen.org>
-Date: Tue, 3 May 2016 03:14:07 +0200
-Subject: [PATCH 087/102] net-next: mediatek: disable all interrupts during
- probe
-
-The current code only disables those IRQs that we will later use. To
-ensure that we have a predefined state, we really want to disable all IRQs.
-Change the code to disable all IRQs to achieve this.
-
-Signed-off-by: John Crispin <john at phrozen.org>
----
- drivers/net/ethernet/mediatek/mtk_eth_soc.c |    2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-@@ -1406,7 +1406,7 @@ static int __init mtk_hw_init(struct mtk
- 
- 	/* disable delay and normal interrupt */
- 	mtk_w32(eth, 0, MTK_QDMA_DELAY_INT);
--	mtk_irq_disable(eth, MTK_TX_DONE_INT | MTK_RX_DONE_INT);
-+	mtk_irq_disable(eth, ~0);
- 	mtk_w32(eth, RST_GL_PSE, MTK_RST_GL);
- 	mtk_w32(eth, 0, MTK_RST_GL);
- 
diff --git a/target/linux/mediatek/patches-4.4/0088-net-next-mediatek-fix-threshold-value.patch b/target/linux/mediatek/patches-4.4/0088-net-next-mediatek-fix-threshold-value.patch
deleted file mode 100644
index c35975b..0000000
--- a/target/linux/mediatek/patches-4.4/0088-net-next-mediatek-fix-threshold-value.patch
+++ /dev/null
@@ -1,30 +0,0 @@
-From 34ea0f209e0759158e363039852a04b1facc3acd Mon Sep 17 00:00:00 2001
-From: John Crispin <john at phrozen.org>
-Date: Tue, 3 May 2016 02:55:27 +0200
-Subject: [PATCH 088/102] net-next: mediatek: fix threshold value
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-The logic to calculate the threshold value for stopping the TX queue is
-bad. Currently it will always use 1/2 of the rings size, which is way too
-much. Set the threshold to MAX_SKB_FRAGS. This makes sure that the queue
-is stopped when there is not enough room to accept an additional segment. 
-
-Signed-off-by: John Crispin <john at phrozen.org>
----
- drivers/net/ethernet/mediatek/mtk_eth_soc.c |    3 +--
- 1 file changed, 1 insertion(+), 2 deletions(-)
-
---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-@@ -1043,8 +1043,7 @@ static int mtk_tx_alloc(struct mtk_eth *
- 	atomic_set(&ring->free_count, MTK_DMA_SIZE - 2);
- 	ring->next_free = &ring->dma[0];
- 	ring->last_free = &ring->dma[MTK_DMA_SIZE - 2];
--	ring->thresh = max((unsigned long)MTK_DMA_SIZE >> 2,
--			      MAX_SKB_FRAGS);
-+	ring->thresh = MAX_SKB_FRAGS;
- 
- 	/* make sure that all changes to the dma ring are flushed before we
- 	 * continue
diff --git a/target/linux/mediatek/patches-4.4/0089-net-next-mediatek-increase-watchdog_timeo.patch b/target/linux/mediatek/patches-4.4/0089-net-next-mediatek-increase-watchdog_timeo.patch
deleted file mode 100644
index 96928d2..0000000
--- a/target/linux/mediatek/patches-4.4/0089-net-next-mediatek-increase-watchdog_timeo.patch
+++ /dev/null
@@ -1,26 +0,0 @@
-From 2cbf3f95a49925317ef4138ceaf7f7f30f353f0f Mon Sep 17 00:00:00 2001
-From: John Crispin <john at phrozen.org>
-Date: Tue, 3 May 2016 03:17:53 +0200
-Subject: [PATCH 089/102] net-next: mediatek: increase watchdog_timeo
-
-During stress testing, after reducing the threshold value, we have seen
-TX timeouts that were caused by the watchdog_timeo value being too low.
-Increase the value to 5 * HZ which is a value commonly used by many other
-drivers.
-
-Signed-off-by: John Crispin <john at phrozen.org>
----
- drivers/net/ethernet/mediatek/mtk_eth_soc.c |    2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-@@ -1720,7 +1720,7 @@ static int mtk_add_mac(struct mtk_eth *e
- 	mac->hw_stats->reg_offset = id * MTK_STAT_OFFSET;
- 
- 	SET_NETDEV_DEV(eth->netdev[id], eth->dev);
--	eth->netdev[id]->watchdog_timeo = HZ;
-+	eth->netdev[id]->watchdog_timeo = 5 * HZ;
- 	eth->netdev[id]->netdev_ops = &mtk_netdev_ops;
- 	eth->netdev[id]->base_addr = (unsigned long)eth->base;
- 	eth->netdev[id]->vlan_features = MTK_HW_FEATURES &
diff --git a/target/linux/mediatek/patches-4.4/0090-net-next-mediatek-fix-off-by-one-in-the-TX-ring-allo.patch b/target/linux/mediatek/patches-4.4/0090-net-next-mediatek-fix-off-by-one-in-the-TX-ring-allo.patch
deleted file mode 100644
index b6f32fc..0000000
--- a/target/linux/mediatek/patches-4.4/0090-net-next-mediatek-fix-off-by-one-in-the-TX-ring-allo.patch
+++ /dev/null
@@ -1,36 +0,0 @@
-From 94425de9ede5ef0eafbfced65140c30e7c0b6c0d Mon Sep 17 00:00:00 2001
-From: John Crispin <john at phrozen.org>
-Date: Tue, 3 May 2016 03:01:13 +0200
-Subject: [PATCH 090/102] net-next: mediatek: fix off by one in the TX ring
- allocation
-
-The TX ring setup has an off by one error causing it to not utilise all
-descriptors. This has the side effect that we need to reset the next
-pointer at runtime to make it work. Fix the off by one and remove the
-code fixing the ring at runtime.
-
-Signed-off-by: Sean Wang <keyhaede at gmail.com>
-Signed-off-by: John Crispin <john at phrozen.org>
----
- drivers/net/ethernet/mediatek/mtk_eth_soc.c |    3 +--
- 1 file changed, 1 insertion(+), 2 deletions(-)
-
---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-@@ -934,7 +934,6 @@ static int mtk_poll_tx(struct mtk_eth *e
- 		}
- 		mtk_tx_unmap(eth->dev, tx_buf);
- 
--		ring->last_free->txd2 = next_cpu;
- 		ring->last_free = desc;
- 		atomic_inc(&ring->free_count);
- 
-@@ -1042,7 +1041,7 @@ static int mtk_tx_alloc(struct mtk_eth *
- 
- 	atomic_set(&ring->free_count, MTK_DMA_SIZE - 2);
- 	ring->next_free = &ring->dma[0];
--	ring->last_free = &ring->dma[MTK_DMA_SIZE - 2];
-+	ring->last_free = &ring->dma[MTK_DMA_SIZE - 1];
- 	ring->thresh = MAX_SKB_FRAGS;
- 
- 	/* make sure that all changes to the dma ring are flushed before we
diff --git a/target/linux/mediatek/patches-4.4/0091-net-next-mediatek-only-wake-the-queue-if-it-is-stopp.patch b/target/linux/mediatek/patches-4.4/0091-net-next-mediatek-only-wake-the-queue-if-it-is-stopp.patch
deleted file mode 100644
index 257634c..0000000
--- a/target/linux/mediatek/patches-4.4/0091-net-next-mediatek-only-wake-the-queue-if-it-is-stopp.patch
+++ /dev/null
@@ -1,48 +0,0 @@
-From 1473b4cce85760c0202a08e6a48ec51867dc1bf7 Mon Sep 17 00:00:00 2001
-From: John Crispin <john at phrozen.org>
-Date: Tue, 3 May 2016 04:01:38 +0200
-Subject: [PATCH 091/102] net-next: mediatek: only wake the queue if it is
- stopped
-
-The current code unconditionally wakes up the queue at the end of each
-tx_poll action. Change the code to only wake up the queues if any of
-them have actually been stopped before.
-
-Signed-off-by: John Crispin <john at phrozen.org>
----
- drivers/net/ethernet/mediatek/mtk_eth_soc.c |   17 ++++++++++++++++-
- 1 file changed, 16 insertions(+), 1 deletion(-)
-
---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-@@ -716,6 +716,20 @@ static inline int mtk_cal_txd_req(struct
- 	return nfrags;
- }
- 
-+static int mtk_queue_stopped(struct mtk_eth *eth)
-+{
-+	int i;
-+
-+	for (i = 0; i < MTK_MAC_COUNT; i++) {
-+		if (!eth->netdev[i])
-+			continue;
-+		if (netif_queue_stopped(eth->netdev[i]))
-+			return 1;
-+	}
-+
-+	return 0;
-+}
-+
- static void mtk_wake_queue(struct mtk_eth *eth)
- {
- 	int i;
-@@ -960,7 +974,8 @@ static int mtk_poll_tx(struct mtk_eth *e
- 	if (!total)
- 		return 0;
- 
--	if (atomic_read(&ring->free_count) > ring->thresh)
-+	if (mtk_queue_stopped(eth) &&
-+	    (atomic_read(&ring->free_count) > ring->thresh))
- 		mtk_wake_queue(eth);
- 
- 	return total;
diff --git a/target/linux/mediatek/patches-4.4/0092-net-next-mediatek-remove-superfluous-queue-wake-up-c.patch b/target/linux/mediatek/patches-4.4/0092-net-next-mediatek-remove-superfluous-queue-wake-up-c.patch
deleted file mode 100644
index fe08958..0000000
--- a/target/linux/mediatek/patches-4.4/0092-net-next-mediatek-remove-superfluous-queue-wake-up-c.patch
+++ /dev/null
@@ -1,36 +0,0 @@
-From 538020913db04d199ce4d7e845444880e8200b5f Mon Sep 17 00:00:00 2001
-From: John Crispin <john at phrozen.org>
-Date: Tue, 3 May 2016 05:40:38 +0200
-Subject: [PATCH 092/102] net-next: mediatek: remove superfluous queue wake up
- call
-
-The code checks if the queue should be stopped because we are below the
-threshold of free descriptors only to check if it should be started again.
-If we do end up in a state where we are at the threshold limit, it makes
-more sense to just stop the queue and wait for the next IRQ to trigger the
-TX housekeeping again. There is no rush in enqueuing the next packet, it
-needs to wait for all the others in the queue to be dispatched first
-anyway.
-
-Signed-off-by: John Crispin <john at phrozen.org>
----
- drivers/net/ethernet/mediatek/mtk_eth_soc.c |    7 ++-----
- 1 file changed, 2 insertions(+), 5 deletions(-)
-
---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-@@ -795,12 +795,9 @@ static int mtk_start_xmit(struct sk_buff
- 	if (mtk_tx_map(skb, dev, tx_num, ring, gso) < 0)
- 		goto drop;
- 
--	if (unlikely(atomic_read(&ring->free_count) <= ring->thresh)) {
-+	if (unlikely(atomic_read(&ring->free_count) <= ring->thresh))
- 		mtk_stop_queue(eth);
--		if (unlikely(atomic_read(&ring->free_count) >
--			     ring->thresh))
--			mtk_wake_queue(eth);
--	}
-+
- 	spin_unlock_irqrestore(&eth->page_lock, flags);
- 
- 	return NETDEV_TX_OK;
diff --git a/target/linux/mediatek/patches-4.4/0093-net-next-mediatek-remove-superfluous-register-reads.patch b/target/linux/mediatek/patches-4.4/0093-net-next-mediatek-remove-superfluous-register-reads.patch
deleted file mode 100644
index 3ddbbc6..0000000
--- a/target/linux/mediatek/patches-4.4/0093-net-next-mediatek-remove-superfluous-register-reads.patch
+++ /dev/null
@@ -1,37 +0,0 @@
-From 31428406bf4b9da2a322ae947096414ff0489fb5 Mon Sep 17 00:00:00 2001
-From: John Crispin <john at phrozen.org>
-Date: Tue, 3 May 2016 03:57:01 +0200
-Subject: [PATCH 093/102] net-next: mediatek: remove superfluous register
- reads
-
-The driver was originally written for MIPS based SoC. These required the
-IRQ mask register to be read after writing it to ensure that the content
-was actually applied. As this version only works on ARM based SoC, we can
-safely remove the 2 reads as they ware not required.
-
-Signed-off-by: Sean Wang <keyhaede at gmail.com>
-Signed-off-by: John Crispin <john at phrozen.org>
----
- drivers/net/ethernet/mediatek/mtk_eth_soc.c |    4 ----
- 1 file changed, 4 deletions(-)
-
---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-@@ -335,8 +335,6 @@ static inline void mtk_irq_disable(struc
- 
- 	val = mtk_r32(eth, MTK_QDMA_INT_MASK);
- 	mtk_w32(eth, val & ~mask, MTK_QDMA_INT_MASK);
--	/* flush write */
--	mtk_r32(eth, MTK_QDMA_INT_MASK);
- }
- 
- static inline void mtk_irq_enable(struct mtk_eth *eth, u32 mask)
-@@ -345,8 +343,6 @@ static inline void mtk_irq_enable(struct
- 
- 	val = mtk_r32(eth, MTK_QDMA_INT_MASK);
- 	mtk_w32(eth, val | mask, MTK_QDMA_INT_MASK);
--	/* flush write */
--	mtk_r32(eth, MTK_QDMA_INT_MASK);
- }
- 
- static int mtk_set_mac_address(struct net_device *dev, void *p)
diff --git a/target/linux/mediatek/patches-4.4/0094-net-next-mediatek-don-t-use-intermediate-variables-t.patch b/target/linux/mediatek/patches-4.4/0094-net-next-mediatek-don-t-use-intermediate-variables-t.patch
deleted file mode 100644
index 983d0c2..0000000
--- a/target/linux/mediatek/patches-4.4/0094-net-next-mediatek-don-t-use-intermediate-variables-t.patch
+++ /dev/null
@@ -1,82 +0,0 @@
-From 441d87495f33fd444a2b2a16f6df07892dac3f89 Mon Sep 17 00:00:00 2001
-From: John Crispin <john at phrozen.org>
-Date: Tue, 3 May 2016 04:12:35 +0200
-Subject: [PATCH 094/102] net-next: mediatek: don't use intermediate variables
- to store IRQ masks
-
-The code currently uses variables to store and never modify the bit masks
-of interrupts. This is legacy code from an early version of the driver
-that supported MIPS based SoCs where the IRQ bits depended on the actual
-SoC. As the bits are the same for all ARM based SoC using this driver we
-can remove the intermediate variables.
-
-Signed-off-by: John Crispin <john at phrozen.org>
----
- drivers/net/ethernet/mediatek/mtk_eth_soc.c |   22 ++++++++++------------
- 1 file changed, 10 insertions(+), 12 deletions(-)
-
---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-@@ -806,7 +806,7 @@ drop:
- }
- 
- static int mtk_poll_rx(struct napi_struct *napi, int budget,
--		       struct mtk_eth *eth, u32 rx_intr)
-+		       struct mtk_eth *eth)
- {
- 	struct mtk_rx_ring *ring = &eth->rx_ring;
- 	int idx = ring->calc_idx;
-@@ -894,7 +894,7 @@ release_desc:
- 	}
- 
- 	if (done < budget)
--		mtk_w32(eth, rx_intr, MTK_QMTK_INT_STATUS);
-+		mtk_w32(eth, MTK_RX_DONE_INT, MTK_QMTK_INT_STATUS);
- 
- 	return done;
- }
-@@ -977,28 +977,26 @@ static int mtk_poll_tx(struct mtk_eth *e
- static int mtk_poll(struct napi_struct *napi, int budget)
- {
- 	struct mtk_eth *eth = container_of(napi, struct mtk_eth, rx_napi);
--	u32 status, status2, mask, tx_intr, rx_intr, status_intr;
-+	u32 status, status2, mask;
- 	int tx_done, rx_done;
- 	bool tx_again = false;
- 
- 	status = mtk_r32(eth, MTK_QMTK_INT_STATUS);
- 	status2 = mtk_r32(eth, MTK_INT_STATUS2);
--	tx_intr = MTK_TX_DONE_INT;
--	rx_intr = MTK_RX_DONE_INT;
--	status_intr = (MTK_GDM1_AF | MTK_GDM2_AF);
- 	tx_done = 0;
- 	rx_done = 0;
- 	tx_again = 0;
- 
--	if (status & tx_intr)
-+	if (status & MTK_TX_DONE_INT)
- 		tx_done = mtk_poll_tx(eth, budget, &tx_again);
- 
--	if (status & rx_intr)
--		rx_done = mtk_poll_rx(napi, budget, eth, rx_intr);
-+	if (status & MTK_RX_DONE_INT)
-+		rx_done = mtk_poll_rx(napi, budget, eth);
- 
--	if (unlikely(status2 & status_intr)) {
-+	if (unlikely(status2 & (MTK_GDM1_AF | MTK_GDM2_AF))) {
- 		mtk_stats_update(eth);
--		mtk_w32(eth, status_intr, MTK_INT_STATUS2);
-+		mtk_w32(eth, (MTK_GDM1_AF | MTK_GDM2_AF),
-+			MTK_INT_STATUS2);
- 	}
- 
- 	if (unlikely(netif_msg_intr(eth))) {
-@@ -1016,7 +1014,7 @@ static int mtk_poll(struct napi_struct *
- 		return budget;
- 
- 	napi_complete(napi);
--	mtk_irq_enable(eth, tx_intr | rx_intr);
-+	mtk_irq_enable(eth, MTK_RX_DONE_INT | MTK_RX_DONE_INT);
- 
- 	return rx_done;
- }
diff --git a/target/linux/mediatek/patches-4.4/0095-net-next-mediatek-add-IRQ-locking.patch b/target/linux/mediatek/patches-4.4/0095-net-next-mediatek-add-IRQ-locking.patch
deleted file mode 100644
index bf27aac..0000000
--- a/target/linux/mediatek/patches-4.4/0095-net-next-mediatek-add-IRQ-locking.patch
+++ /dev/null
@@ -1,64 +0,0 @@
-From dd08d1ac4cfc86fbea5ee207b9615922ede88ec6 Mon Sep 17 00:00:00 2001
-From: John Crispin <john at phrozen.org>
-Date: Tue, 17 May 2016 06:01:45 +0200
-Subject: [PATCH 095/102] net-next: mediatek: add IRQ locking
-
-The code that enables and disables IRQs is missing proper locking. After
-adding the IRQ separation patch and routing the putting the RX and TX IRQs
-on different cores we experienced IRQ stalls. Fix this by adding proper
-locking. We use a dedicated lock to reduce the latency if the IRQ code.
-Otherwise it might wait for bottom code to finish before reenabling or
-disabling IRQs.
-
-Signed-off-by: Sean Wang <keyhaede at gmail.com>
-Signed-off-by: John Crispin <john at phrozen.org>
----
- drivers/net/ethernet/mediatek/mtk_eth_soc.c |    7 +++++++
- drivers/net/ethernet/mediatek/mtk_eth_soc.h |    1 +
- 2 files changed, 8 insertions(+)
-
---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-@@ -331,18 +331,24 @@ static void mtk_mdio_cleanup(struct mtk_
- 
- static inline void mtk_irq_disable(struct mtk_eth *eth, u32 mask)
- {
-+	unsigned long flags;
- 	u32 val;
- 
-+	spin_lock_irqsave(&eth->irq_lock, flags);
- 	val = mtk_r32(eth, MTK_QDMA_INT_MASK);
- 	mtk_w32(eth, val & ~mask, MTK_QDMA_INT_MASK);
-+	spin_unlock_irqrestore(&eth->irq_lock, flags);
- }
- 
- static inline void mtk_irq_enable(struct mtk_eth *eth, u32 mask)
- {
-+	unsigned long flags;
- 	u32 val;
- 
-+	spin_lock_irqsave(&eth->irq_lock, flags);
- 	val = mtk_r32(eth, MTK_QDMA_INT_MASK);
- 	mtk_w32(eth, val | mask, MTK_QDMA_INT_MASK);
-+	spin_unlock_irqrestore(&eth->irq_lock, flags);
- }
- 
- static int mtk_set_mac_address(struct net_device *dev, void *p)
-@@ -1771,6 +1777,7 @@ static int mtk_probe(struct platform_dev
- 		return -EADDRNOTAVAIL;
- 
- 	spin_lock_init(&eth->page_lock);
-+	spin_lock_init(&eth->irq_lock);
- 
- 	eth->ethsys = syscon_regmap_lookup_by_phandle(pdev->dev.of_node,
- 						      "mediatek,ethsys");
---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h
-+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
-@@ -373,6 +373,7 @@ struct mtk_eth {
- 	void __iomem			*base;
- 	struct reset_control		*rstc;
- 	spinlock_t			page_lock;
-+	spinlock_t			irq_lock;
- 	struct net_device		dummy_dev;
- 	struct net_device		*netdev[MTK_MAX_DEVS];
- 	struct mtk_mac			*mac[MTK_MAX_DEVS];
diff --git a/target/linux/mediatek/patches-4.4/0096-net-next-mediatek-add-support-for-IRQ-grouping.patch b/target/linux/mediatek/patches-4.4/0096-net-next-mediatek-add-support-for-IRQ-grouping.patch
deleted file mode 100644
index 727073e..0000000
--- a/target/linux/mediatek/patches-4.4/0096-net-next-mediatek-add-support-for-IRQ-grouping.patch
+++ /dev/null
@@ -1,361 +0,0 @@
-From 190df1a9dbf4d8809b7f991194ce60e47f2290a2 Mon Sep 17 00:00:00 2001
-From: John Crispin <john at phrozen.org>
-Date: Wed, 23 Mar 2016 18:31:48 +0100
-Subject: [PATCH 096/102] net-next: mediatek: add support for IRQ grouping
-
-The ethernet core has 3 IRQs. using the IRQ grouping registers we are able
-to separate TX and RX IRQs, which allows us to service them on separate
-cores. This patch splits the irq handler into 2 separate functions, one for
-TX and another for RX. The TX housekeeping is split out into its own NAPI
-handler.
-
-Signed-off-by: John Crispin <john at phrozen.org>
----
- drivers/net/ethernet/mediatek/mtk_eth_soc.c |  156 +++++++++++++++++----------
- drivers/net/ethernet/mediatek/mtk_eth_soc.h |   15 ++-
- 2 files changed, 111 insertions(+), 60 deletions(-)
-
---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-@@ -905,14 +905,13 @@ release_desc:
- 	return done;
- }
- 
--static int mtk_poll_tx(struct mtk_eth *eth, int budget, bool *tx_again)
-+static int mtk_poll_tx(struct mtk_eth *eth, int budget)
- {
- 	struct mtk_tx_ring *ring = &eth->tx_ring;
- 	struct mtk_tx_dma *desc;
- 	struct sk_buff *skb;
- 	struct mtk_tx_buf *tx_buf;
--	int total = 0, done = 0;
--	unsigned int bytes = 0;
-+	unsigned int bytes = 0, done = 0;
- 	u32 cpu, dma;
- 	static int condition;
- 	int i;
-@@ -964,63 +963,82 @@ static int mtk_poll_tx(struct mtk_eth *e
- 		netdev_completed_queue(eth->netdev[i], done, bytes);
- 	}
- 
--	/* read hw index again make sure no new tx packet */
--	if (cpu != dma || cpu != mtk_r32(eth, MTK_QTX_DRX_PTR))
--		*tx_again = true;
--	else
--		mtk_w32(eth, MTK_TX_DONE_INT, MTK_QMTK_INT_STATUS);
--
--	if (!total)
--		return 0;
--
- 	if (mtk_queue_stopped(eth) &&
- 	    (atomic_read(&ring->free_count) > ring->thresh))
- 		mtk_wake_queue(eth);
- 
--	return total;
-+	return done;
- }
- 
--static int mtk_poll(struct napi_struct *napi, int budget)
-+static void mtk_handle_status_irq(struct mtk_eth *eth)
- {
--	struct mtk_eth *eth = container_of(napi, struct mtk_eth, rx_napi);
--	u32 status, status2, mask;
--	int tx_done, rx_done;
--	bool tx_again = false;
--
--	status = mtk_r32(eth, MTK_QMTK_INT_STATUS);
--	status2 = mtk_r32(eth, MTK_INT_STATUS2);
--	tx_done = 0;
--	rx_done = 0;
--	tx_again = 0;
--
--	if (status & MTK_TX_DONE_INT)
--		tx_done = mtk_poll_tx(eth, budget, &tx_again);
--
--	if (status & MTK_RX_DONE_INT)
--		rx_done = mtk_poll_rx(napi, budget, eth);
-+	u32 status2 = mtk_r32(eth, MTK_INT_STATUS2);
- 
- 	if (unlikely(status2 & (MTK_GDM1_AF | MTK_GDM2_AF))) {
- 		mtk_stats_update(eth);
- 		mtk_w32(eth, (MTK_GDM1_AF | MTK_GDM2_AF),
- 			MTK_INT_STATUS2);
- 	}
-+}
-+
-+static int mtk_napi_tx(struct napi_struct *napi, int budget)
-+{
-+	struct mtk_eth *eth = container_of(napi, struct mtk_eth, tx_napi);
-+	u32 status, mask;
-+	int tx_done = 0;
-+
-+	mtk_handle_status_irq(eth);
-+	mtk_w32(eth, MTK_TX_DONE_INT, MTK_QMTK_INT_STATUS);
-+	tx_done = mtk_poll_tx(eth, budget);
- 
- 	if (unlikely(netif_msg_intr(eth))) {
-+		status = mtk_r32(eth, MTK_QMTK_INT_STATUS);
- 		mask = mtk_r32(eth, MTK_QDMA_INT_MASK);
--		netdev_info(eth->netdev[0],
--			    "done tx %d, rx %d, intr 0x%08x/0x%x\n",
--			    tx_done, rx_done, status, mask);
-+		dev_info(eth->dev,
-+			 "done tx %d, intr 0x%08x/0x%x\n",
-+			 tx_done, status, mask);
- 	}
- 
--	if (tx_again || rx_done == budget)
-+	if (tx_done == budget)
- 		return budget;
- 
- 	status = mtk_r32(eth, MTK_QMTK_INT_STATUS);
--	if (status & (tx_intr | rx_intr))
-+	if (status & MTK_TX_DONE_INT)
- 		return budget;
- 
- 	napi_complete(napi);
--	mtk_irq_enable(eth, MTK_RX_DONE_INT | MTK_RX_DONE_INT);
-+	mtk_irq_enable(eth, MTK_TX_DONE_INT);
-+
-+	return tx_done;
-+}
-+
-+static int mtk_napi_rx(struct napi_struct *napi, int budget)
-+{
-+	struct mtk_eth *eth = container_of(napi, struct mtk_eth, rx_napi);
-+	u32 status, mask;
-+	int rx_done = 0;
-+
-+	mtk_handle_status_irq(eth);
-+	mtk_w32(eth, MTK_RX_DONE_INT, MTK_QMTK_INT_STATUS);
-+	rx_done = mtk_poll_rx(napi, budget, eth);
-+
-+	if (unlikely(netif_msg_intr(eth))) {
-+		status = mtk_r32(eth, MTK_QMTK_INT_STATUS);
-+		mask = mtk_r32(eth, MTK_QDMA_INT_MASK);
-+		dev_info(eth->dev,
-+			 "done rx %d, intr 0x%08x/0x%x\n",
-+			 rx_done, status, mask);
-+	}
-+
-+	if (rx_done == budget)
-+		return budget;
-+
-+	status = mtk_r32(eth, MTK_QMTK_INT_STATUS);
-+	if (status & MTK_RX_DONE_INT)
-+		return budget;
-+
-+	napi_complete(napi);
-+	mtk_irq_enable(eth, MTK_RX_DONE_INT);
- 
- 	return rx_done;
- }
-@@ -1256,22 +1274,26 @@ static void mtk_tx_timeout(struct net_de
- 	schedule_work(&eth->pending_work);
- }
- 
--static irqreturn_t mtk_handle_irq(int irq, void *_eth)
-+static irqreturn_t mtk_handle_irq_rx(int irq, void *_eth)
- {
- 	struct mtk_eth *eth = _eth;
--	u32 status;
- 
--	status = mtk_r32(eth, MTK_QMTK_INT_STATUS);
--	if (unlikely(!status))
--		return IRQ_NONE;
-+	if (likely(napi_schedule_prep(&eth->rx_napi))) {
-+		__napi_schedule(&eth->rx_napi);
-+		mtk_irq_disable(eth, MTK_RX_DONE_INT);
-+	}
- 
--	if (likely(status & (MTK_RX_DONE_INT | MTK_TX_DONE_INT))) {
--		if (likely(napi_schedule_prep(&eth->rx_napi)))
--			__napi_schedule(&eth->rx_napi);
--	} else {
--		mtk_w32(eth, status, MTK_QMTK_INT_STATUS);
-+	return IRQ_HANDLED;
-+}
-+
-+static irqreturn_t mtk_handle_irq_tx(int irq, void *_eth)
-+{
-+	struct mtk_eth *eth = _eth;
-+
-+	if (likely(napi_schedule_prep(&eth->tx_napi))) {
-+		__napi_schedule(&eth->tx_napi);
-+		mtk_irq_disable(eth, MTK_TX_DONE_INT);
- 	}
--	mtk_irq_disable(eth, (MTK_RX_DONE_INT | MTK_TX_DONE_INT));
- 
- 	return IRQ_HANDLED;
- }
-@@ -1284,7 +1306,7 @@ static void mtk_poll_controller(struct n
- 	u32 int_mask = MTK_TX_DONE_INT | MTK_RX_DONE_INT;
- 
- 	mtk_irq_disable(eth, int_mask);
--	mtk_handle_irq(dev->irq, dev);
-+	mtk_handle_irq(dev->irq[0], dev);
- 	mtk_irq_enable(eth, int_mask);
- }
- #endif
-@@ -1320,6 +1342,7 @@ static int mtk_open(struct net_device *d
- 		if (err)
- 			return err;
- 
-+		napi_enable(&eth->tx_napi);
- 		napi_enable(&eth->rx_napi);
- 		mtk_irq_enable(eth, MTK_TX_DONE_INT | MTK_RX_DONE_INT);
- 	}
-@@ -1368,6 +1391,7 @@ static int mtk_stop(struct net_device *d
- 		return 0;
- 
- 	mtk_irq_disable(eth, MTK_TX_DONE_INT | MTK_RX_DONE_INT);
-+	napi_disable(&eth->tx_napi);
- 	napi_disable(&eth->rx_napi);
- 
- 	mtk_stop_dma(eth, MTK_QDMA_GLO_CFG);
-@@ -1405,7 +1429,11 @@ static int __init mtk_hw_init(struct mtk
- 	/* Enable RX VLan Offloading */
- 	mtk_w32(eth, 1, MTK_CDMP_EG_CTRL);
- 
--	err = devm_request_irq(eth->dev, eth->irq, mtk_handle_irq, 0,
-+	err = devm_request_irq(eth->dev, eth->irq[1], mtk_handle_irq_tx, 0,
-+			       dev_name(eth->dev), eth);
-+	if (err)
-+		return err;
-+	err = devm_request_irq(eth->dev, eth->irq[2], mtk_handle_irq_rx, 0,
- 			       dev_name(eth->dev), eth);
- 	if (err)
- 		return err;
-@@ -1421,7 +1449,11 @@ static int __init mtk_hw_init(struct mtk
- 	mtk_w32(eth, 0, MTK_RST_GL);
- 
- 	/* FE int grouping */
--	mtk_w32(eth, 0, MTK_FE_INT_GRP);
-+	mtk_w32(eth, MTK_TX_DONE_INT, MTK_PDMA_INT_GRP1);
-+	mtk_w32(eth, MTK_RX_DONE_INT, MTK_PDMA_INT_GRP2);
-+	mtk_w32(eth, MTK_TX_DONE_INT, MTK_QDMA_INT_GRP1);
-+	mtk_w32(eth, MTK_RX_DONE_INT, MTK_QDMA_INT_GRP2);
-+	mtk_w32(eth, 0x21021000, MTK_FE_INT_GRP);
- 
- 	for (i = 0; i < 2; i++) {
- 		u32 val = mtk_r32(eth, MTK_GDMA_FWD_CFG(i));
-@@ -1469,7 +1501,9 @@ static void mtk_uninit(struct net_device
- 	phy_disconnect(mac->phy_dev);
- 	mtk_mdio_cleanup(eth);
- 	mtk_irq_disable(eth, ~0);
--	free_irq(dev->irq, dev);
-+	free_irq(eth->irq[0], dev);
-+	free_irq(eth->irq[1], dev);
-+	free_irq(eth->irq[2], dev);
- }
- 
- static int mtk_do_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
-@@ -1744,10 +1778,10 @@ static int mtk_add_mac(struct mtk_eth *e
- 		dev_err(eth->dev, "error bringing up device\n");
- 		goto free_netdev;
- 	}
--	eth->netdev[id]->irq = eth->irq;
-+	eth->netdev[id]->irq = eth->irq[0];
- 	netif_info(eth, probe, eth->netdev[id],
- 		   "mediatek frame engine at 0x%08lx, irq %d\n",
--		   eth->netdev[id]->base_addr, eth->netdev[id]->irq);
-+		   eth->netdev[id]->base_addr, eth->irq[0]);
- 
- 	return 0;
- 
-@@ -1764,6 +1798,7 @@ static int mtk_probe(struct platform_dev
- 	struct mtk_soc_data *soc;
- 	struct mtk_eth *eth;
- 	int err;
-+	int i;
- 
- 	match = of_match_device(of_mtk_match, &pdev->dev);
- 	soc = (struct mtk_soc_data *)match->data;
-@@ -1799,10 +1834,12 @@ static int mtk_probe(struct platform_dev
- 		return PTR_ERR(eth->rstc);
- 	}
- 
--	eth->irq = platform_get_irq(pdev, 0);
--	if (eth->irq < 0) {
--		dev_err(&pdev->dev, "no IRQ resource found\n");
--		return -ENXIO;
-+	for (i = 0; i < 3; i++) {
-+		eth->irq[i] = platform_get_irq(pdev, i);
-+		if (eth->irq[i] < 0) {
-+			dev_err(&pdev->dev, "no IRQ%d resource found\n", i);
-+			return -ENXIO;
-+		}
- 	}
- 
- 	eth->clk_ethif = devm_clk_get(&pdev->dev, "ethif");
-@@ -1843,7 +1880,9 @@ static int mtk_probe(struct platform_dev
- 	 * for NAPI to work
- 	 */
- 	init_dummy_netdev(&eth->dummy_dev);
--	netif_napi_add(&eth->dummy_dev, &eth->rx_napi, mtk_poll,
-+	netif_napi_add(&eth->dummy_dev, &eth->tx_napi, mtk_napi_tx,
-+		       MTK_NAPI_WEIGHT);
-+	netif_napi_add(&eth->dummy_dev, &eth->rx_napi, mtk_napi_rx,
- 		       MTK_NAPI_WEIGHT);
- 
- 	platform_set_drvdata(pdev, eth);
-@@ -1864,6 +1903,7 @@ static int mtk_remove(struct platform_de
- 	clk_disable_unprepare(eth->clk_gp1);
- 	clk_disable_unprepare(eth->clk_gp2);
- 
-+	netif_napi_del(&eth->tx_napi);
- 	netif_napi_del(&eth->rx_napi);
- 	mtk_cleanup(eth);
- 	platform_set_drvdata(pdev, NULL);
---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h
-+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
-@@ -68,6 +68,10 @@
- /* Unicast Filter MAC Address Register - High */
- #define MTK_GDMA_MAC_ADRH(x)	(0x50C + (x * 0x1000))
- 
-+/* PDMA Interrupt grouping registers */
-+#define MTK_PDMA_INT_GRP1	0xa50
-+#define MTK_PDMA_INT_GRP2	0xa54
-+
- /* QDMA TX Queue Configuration Registers */
- #define MTK_QTX_CFG(x)		(0x1800 + (x * 0x10))
- #define QDMA_RES_THRES		4
-@@ -125,6 +129,11 @@
- #define MTK_TX_DONE_INT		(MTK_TX_DONE_INT0 | MTK_TX_DONE_INT1 | \
- 				 MTK_TX_DONE_INT2 | MTK_TX_DONE_INT3)
- 
-+/* QDMA Interrupt grouping registers */
-+#define MTK_QDMA_INT_GRP1	0x1a20
-+#define MTK_QDMA_INT_GRP2	0x1a24
-+#define MTK_RLS_DONE_INT	BIT(0)
-+
- /* QDMA Interrupt Status Register */
- #define MTK_QDMA_INT_MASK	0x1A1C
- 
-@@ -356,7 +365,8 @@ struct mtk_rx_ring {
-  * @dma_refcnt:		track how many netdevs are using the DMA engine
-  * @tx_ring:		Pointer to the memore holding info about the TX ring
-  * @rx_ring:		Pointer to the memore holding info about the RX ring
-- * @rx_napi:		The NAPI struct
-+ * @tx_napi:		The TX NAPI struct
-+ * @rx_napi:		The RX NAPI struct
-  * @scratch_ring:	Newer SoCs need memory for a second HW managed TX ring
-  * @phy_scratch_ring:	physical address of scratch_ring
-  * @scratch_head:	The scratch memory that scratch_ring points to.
-@@ -377,7 +387,7 @@ struct mtk_eth {
- 	struct net_device		dummy_dev;
- 	struct net_device		*netdev[MTK_MAX_DEVS];
- 	struct mtk_mac			*mac[MTK_MAX_DEVS];
--	int				irq;
-+	int				irq[3];
- 	u32				msg_enable;
- 	unsigned long			sysclk;
- 	struct regmap			*ethsys;
-@@ -385,6 +395,7 @@ struct mtk_eth {
- 	atomic_t			dma_refcnt;
- 	struct mtk_tx_ring		tx_ring;
- 	struct mtk_rx_ring		rx_ring;
-+	struct napi_struct		tx_napi;
- 	struct napi_struct		rx_napi;
- 	struct mtk_tx_dma		*scratch_ring;
- 	dma_addr_t			phy_scratch_ring;
diff --git a/target/linux/mediatek/patches-4.4/0097-net-next-mediatek-change-my-email-address.patch b/target/linux/mediatek/patches-4.4/0097-net-next-mediatek-change-my-email-address.patch
deleted file mode 100644
index 472d58b..0000000
--- a/target/linux/mediatek/patches-4.4/0097-net-next-mediatek-change-my-email-address.patch
+++ /dev/null
@@ -1,30 +0,0 @@
-From 7c955062aaa563b1894671af3ae250460b3fa82d Mon Sep 17 00:00:00 2001
-From: John Crispin <john at phrozen.org>
-Date: Thu, 5 May 2016 10:01:56 +0200
-Subject: [PATCH 097/102] net-next: mediatek: change my email address
-
-The old address is no longer valid. Use the my new one instead.
-
-Signed-off-by: John Crispin <john at phrozen.org>
----
- drivers/net/ethernet/mediatek/mtk_eth_soc.c |    4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-@@ -7,7 +7,7 @@
-  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  *   GNU General Public License for more details.
-  *
-- *   Copyright (C) 2009-2016 John Crispin <blogic at openwrt.org>
-+ *   Copyright (C) 2009-2016 John Crispin <john at phrozen.org>
-  *   Copyright (C) 2009-2016 Felix Fietkau <nbd at nbd.name>
-  *   Copyright (C) 2013-2016 Michael Lee <igvtee at gmail.com>
-  */
-@@ -1929,5 +1929,5 @@ static struct platform_driver mtk_driver
- module_platform_driver(mtk_driver);
- 
- MODULE_LICENSE("GPL");
--MODULE_AUTHOR("John Crispin <blogic at openwrt.org>");
-+MODULE_AUTHOR("John Crispin <john at phrozen.org>");
- MODULE_DESCRIPTION("Ethernet driver for MediaTek SoC");
diff --git a/target/linux/mediatek/patches-4.4/0098-net-next-mediatek-only-trigger-the-tx-watchdog-reset.patch b/target/linux/mediatek/patches-4.4/0098-net-next-mediatek-only-trigger-the-tx-watchdog-reset.patch
deleted file mode 100644
index cc18be5..0000000
--- a/target/linux/mediatek/patches-4.4/0098-net-next-mediatek-only-trigger-the-tx-watchdog-reset.patch
+++ /dev/null
@@ -1,57 +0,0 @@
-From cd1343c14328a5de1a58c47b81b8a2febb31d542 Mon Sep 17 00:00:00 2001
-From: John Crispin <john at phrozen.org>
-Date: Tue, 10 May 2016 11:16:30 +0200
-Subject: [PATCH 098/102] net-next: mediatek: only trigger the tx watchdog
- reset when all devices are stalled
-
-Signed-off-by: Sean Wang <keyhaede at gmail.com>
-Signed-off-by: John Crispin <john at phrozen.org>
----
- drivers/net/ethernet/mediatek/mtk_eth_soc.c |   14 ++++++++++++--
- drivers/net/ethernet/mediatek/mtk_eth_soc.h |    1 +
- 2 files changed, 13 insertions(+), 2 deletions(-)
-
---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-@@ -1267,11 +1267,21 @@ static void mtk_tx_timeout(struct net_de
- {
- 	struct mtk_mac *mac = netdev_priv(dev);
- 	struct mtk_eth *eth = mac->hw;
-+	int i, reset = 0;
- 
- 	eth->netdev[mac->id]->stats.tx_errors++;
- 	netif_err(eth, tx_err, dev,
- 		  "transmit timed out\n");
--	schedule_work(&eth->pending_work);
-+
-+	for (i = 0; i < MTK_MAC_COUNT; i++) {
-+		if (!eth->netdev[i] ||
-+		    time_after(jiffies, dev_trans_start(eth->netdev[i]) +
-+							MTK_WDT_TIMEOUT))
-+			reset++;
-+	}
-+
-+	if (reset == MTK_MAC_COUNT)
-+		schedule_work(&eth->pending_work);
- }
- 
- static irqreturn_t mtk_handle_irq_rx(int irq, void *_eth)
-@@ -1765,7 +1775,7 @@ static int mtk_add_mac(struct mtk_eth *e
- 	mac->hw_stats->reg_offset = id * MTK_STAT_OFFSET;
- 
- 	SET_NETDEV_DEV(eth->netdev[id], eth->dev);
--	eth->netdev[id]->watchdog_timeo = 5 * HZ;
-+	eth->netdev[id]->watchdog_timeo = MTK_WDT_TIMEOUT;
- 	eth->netdev[id]->netdev_ops = &mtk_netdev_ops;
- 	eth->netdev[id]->base_addr = (unsigned long)eth->base;
- 	eth->netdev[id]->vlan_features = MTK_HW_FEATURES &
---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h
-+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
-@@ -15,6 +15,7 @@
- #ifndef MTK_ETH_H
- #define MTK_ETH_H
- 
-+#define MTK_WDT_TIMEOUT		(4 * HZ)
- #define MTK_QDMA_PAGE_SIZE	2048
- #define	MTK_MAX_RX_LENGTH	1536
- #define MTK_TX_DMA_BUF_LEN	0x3fff
diff --git a/target/linux/mediatek/patches-4.4/0099-MAINTAINERS-change-my-email-address.patch b/target/linux/mediatek/patches-4.4/0099-MAINTAINERS-change-my-email-address.patch
deleted file mode 100644
index 1bad613..0000000
--- a/target/linux/mediatek/patches-4.4/0099-MAINTAINERS-change-my-email-address.patch
+++ /dev/null
@@ -1,23 +0,0 @@
-From 2023b1652745fec5e691a5c9a9742ba6dd45e466 Mon Sep 17 00:00:00 2001
-From: John Crispin <john at phrozen.org>
-Date: Wed, 4 May 2016 15:44:01 +0200
-Subject: [PATCH 099/102] MAINTAINERS: change my email address
-
-The old address is no longer valid. Use the my new one instead.
-
-Signed-off-by: John Crispin <john at phrozen.org>
----
- MAINTAINERS |    2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
---- a/MAINTAINERS
-+++ b/MAINTAINERS
-@@ -6904,7 +6904,7 @@ F:	include/uapi/linux/uvcvideo.h
- 
- MEDIATEK ETHERNET DRIVER
- M:	Felix Fietkau <nbd at nbd.name>
--M:	John Crispin <blogic at openwrt.org>
-+M:	John Crispin <john at phrozen.org>
- L:	netdev at vger.kernel.org
- S:	Maintained
- F:	drivers/net/ethernet/mediatek/
diff --git a/target/linux/mediatek/patches-4.4/0100-MAINTAINERS-add-Sean-as-mediatek-ethernet-maintainer.patch b/target/linux/mediatek/patches-4.4/0100-MAINTAINERS-add-Sean-as-mediatek-ethernet-maintainer.patch
deleted file mode 100644
index 145868c..0000000
--- a/target/linux/mediatek/patches-4.4/0100-MAINTAINERS-add-Sean-as-mediatek-ethernet-maintainer.patch
+++ /dev/null
@@ -1,25 +0,0 @@
-From 69c89cb453c0beac5d8349108cee8f6806e5db19 Mon Sep 17 00:00:00 2001
-From: John Crispin <john at phrozen.org>
-Date: Tue, 17 May 2016 05:49:17 +0200
-Subject: [PATCH 100/102] MAINTAINERS: add Sean as mediatek ethernet
- maintainer
-
-Sean has been busy doing most of the QA and stress testing of the driver.
-Add him to the list of maintainers.
-
-Signed-off-by: Sean Wang <keyhaede at gmail.com>
-Signed-off-by: John Crispin <john at phrozen.org>
----
- MAINTAINERS |    1 +
- 1 file changed, 1 insertion(+)
-
---- a/MAINTAINERS
-+++ b/MAINTAINERS
-@@ -6905,6 +6905,7 @@ F:	include/uapi/linux/uvcvideo.h
- MEDIATEK ETHERNET DRIVER
- M:	Felix Fietkau <nbd at nbd.name>
- M:	John Crispin <john at phrozen.org>
-+M:	Sean Wang <keyhaede at gmail.com>
- L:	netdev at vger.kernel.org
- S:	Maintained
- F:	drivers/net/ethernet/mediatek/
diff --git a/target/linux/mediatek/patches-4.4/0102-net-mediatek-v4.4-backports.patch b/target/linux/mediatek/patches-4.4/0102-net-mediatek-v4.4-backports.patch
deleted file mode 100644
index 3561b40..0000000
--- a/target/linux/mediatek/patches-4.4/0102-net-mediatek-v4.4-backports.patch
+++ /dev/null
@@ -1,46 +0,0 @@
-From c1ff5519a7fd849da5d169036d8175383f807962 Mon Sep 17 00:00:00 2001
-From: John Crispin <blogic at openwrt.org>
-Date: Mon, 11 Apr 2016 06:00:23 +0200
-Subject: [PATCH 102/102] net: mediatek: v4.4 backports
-
----
- drivers/net/ethernet/mediatek/mtk_eth_soc.c |   13 ++++++++-----
- 1 file changed, 8 insertions(+), 5 deletions(-)
-
---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-@@ -217,7 +217,7 @@ static int mtk_phy_connect_node(struct m
- 
- 	dev_info(eth->dev,
- 		 "connected mac %d to PHY at %s [uid=%08x, driver=%s]\n",
--		 mac->id, phydev_name(phydev), phydev->phy_id,
-+		 mac->id, dev_name(&phydev->dev), phydev->phy_id,
- 		 phydev->drv->name);
- 
- 	mac->phy_dev = phydev;
-@@ -1396,6 +1396,7 @@ static int mtk_stop(struct net_device *d
- 	struct mtk_mac *mac = netdev_priv(dev);
- 	struct mtk_eth *eth = mac->hw;
- 
-+	netif_carrier_off(dev);
- 	netif_tx_disable(dev);
- 	phy_stop(mac->phy_dev);
- 
-@@ -1595,11 +1596,13 @@ static int mtk_set_settings(struct net_d
- {
- 	struct mtk_mac *mac = netdev_priv(dev);
- 
--	if (cmd->phy_address != mac->phy_dev->mdio.addr) {
--		mac->phy_dev = mdiobus_get_phy(mac->hw->mii_bus,
--					       cmd->phy_address);
--		if (!mac->phy_dev)
-+	if (cmd->phy_address != mac->phy_dev->addr) {
-+		if (mac->hw->mii_bus->phy_map[cmd->phy_address]) {
-+			mac->phy_dev =
-+				mac->hw->mii_bus->phy_map[cmd->phy_address];
-+		} else {
- 			return -ENODEV;
-+		}
- 	}
- 
- 	return phy_ethtool_sset(mac->phy_dev, cmd);
diff --git a/target/linux/mediatek/patches-4.9/0000-pinctrl-esw.patch b/target/linux/mediatek/patches-4.9/0000-pinctrl-esw.patch
new file mode 100644
index 0000000..2fedae7
--- /dev/null
+++ b/target/linux/mediatek/patches-4.9/0000-pinctrl-esw.patch
@@ -0,0 +1,12 @@
+--- a/include/dt-bindings/pinctrl/mt7623-pinfunc.h
++++ b/include/dt-bindings/pinctrl/mt7623-pinfunc.h
+@@ -505,6 +505,9 @@
+ #define MT7623_PIN_272_G2_RXD3_FUNC_GPIO272 (MTK_PIN_NO(272) | 0)
+ #define MT7623_PIN_272_G2_RXD3_FUNC_G2_RXD3 (MTK_PIN_NO(272) | 1)
+ 
++#define MT7623_PIN_273_ESW_INT_FUNC_GPIO273 (MTK_PIN_NO(273) | 0)
++#define MT7623_PIN_273_ESW_INT_FUNC_ESW_INT (MTK_PIN_NO(273) | 1)
++
+ #define MT7623_PIN_274_G2_RXDV_FUNC_GPIO274 (MTK_PIN_NO(274) | 0)
+ #define MT7623_PIN_274_G2_RXDV_FUNC_G2_RXDV (MTK_PIN_NO(274) | 1)
+ 
diff --git a/target/linux/mediatek/patches-4.4/0001-NET-multi-phy-support.patch b/target/linux/mediatek/patches-4.9/0001-NET-multi-phy-support.patch
similarity index 100%
rename from target/linux/mediatek/patches-4.4/0001-NET-multi-phy-support.patch
rename to target/linux/mediatek/patches-4.9/0001-NET-multi-phy-support.patch
diff --git a/target/linux/mediatek/patches-4.4/0004-soc-mediatek-Add-MT2701-power-dt-bindings.patch b/target/linux/mediatek/patches-4.9/0004-soc-mediatek-Add-MT2701-power-dt-bindings.patch
similarity index 100%
rename from target/linux/mediatek/patches-4.4/0004-soc-mediatek-Add-MT2701-power-dt-bindings.patch
rename to target/linux/mediatek/patches-4.9/0004-soc-mediatek-Add-MT2701-power-dt-bindings.patch
diff --git a/target/linux/mediatek/patches-4.4/0009-clk-mediatek-Add-MT2701-clock-support.patch b/target/linux/mediatek/patches-4.9/0009-clk-mediatek-Add-MT2701-clock-support.patch
similarity index 98%
rename from target/linux/mediatek/patches-4.4/0009-clk-mediatek-Add-MT2701-clock-support.patch
rename to target/linux/mediatek/patches-4.9/0009-clk-mediatek-Add-MT2701-clock-support.patch
index 6f8f68a..552b46e 100644
--- a/target/linux/mediatek/patches-4.4/0009-clk-mediatek-Add-MT2701-clock-support.patch
+++ b/target/linux/mediatek/patches-4.9/0009-clk-mediatek-Add-MT2701-clock-support.patch
@@ -21,7 +21,7 @@ Signed-off-by: James Liao <jamesjj.liao at mediatek.com>
 
 --- a/drivers/clk/mediatek/Kconfig
 +++ b/drivers/clk/mediatek/Kconfig
-@@ -6,6 +6,14 @@ config COMMON_CLK_MEDIATEK
+@@ -6,6 +6,14 @@
  	---help---
  	  Mediatek SoCs' clock support.
  
@@ -35,7 +35,7 @@ Signed-off-by: James Liao <jamesjj.liao at mediatek.com>
 +
  config COMMON_CLK_MT8135
  	bool "Clock driver for Mediatek MT8135"
- 	depends on COMMON_CLK
+ 	depends on ARCH_MEDIATEK || COMPILE_TEST
 --- a/drivers/clk/mediatek/Makefile
 +++ b/drivers/clk/mediatek/Makefile
 @@ -1,4 +1,5 @@
@@ -46,13 +46,13 @@ Signed-off-by: James Liao <jamesjj.liao at mediatek.com>
  obj-$(CONFIG_COMMON_CLK_MT8173) += clk-mt8173.o
 --- a/drivers/clk/mediatek/clk-gate.c
 +++ b/drivers/clk/mediatek/clk-gate.c
-@@ -61,6 +61,26 @@ static void mtk_cg_clr_bit(struct clk_hw
+@@ -61,6 +61,26 @@
  	regmap_write(cg->regmap, cg->clr_ofs, BIT(cg->bit));
  }
  
 +static void mtk_cg_set_bit_no_setclr(struct clk_hw *hw)
 +{
-+	struct mtk_clk_gate *cg = to_clk_gate(hw);
++	struct mtk_clk_gate *cg = to_mtk_clk_gate(hw);
 +	u32 val;
 +
 +	regmap_read(cg->regmap, cg->sta_ofs, &val);
@@ -62,7 +62,7 @@ Signed-off-by: James Liao <jamesjj.liao at mediatek.com>
 +
 +static void mtk_cg_clr_bit_no_setclr(struct clk_hw *hw)
 +{
-+	struct mtk_clk_gate *cg = to_clk_gate(hw);
++	struct mtk_clk_gate *cg = to_mtk_clk_gate(hw);
 +	u32 val;
 +
 +	regmap_read(cg->regmap, cg->sta_ofs, &val);
@@ -73,7 +73,7 @@ Signed-off-by: James Liao <jamesjj.liao at mediatek.com>
  static int mtk_cg_enable(struct clk_hw *hw)
  {
  	mtk_cg_clr_bit(hw);
-@@ -85,6 +105,30 @@ static void mtk_cg_disable_inv(struct cl
+@@ -85,6 +105,30 @@
  	mtk_cg_clr_bit(hw);
  }
  
@@ -104,7 +104,7 @@ Signed-off-by: James Liao <jamesjj.liao at mediatek.com>
  const struct clk_ops mtk_clk_gate_ops_setclr = {
  	.is_enabled	= mtk_cg_bit_is_cleared,
  	.enable		= mtk_cg_enable,
-@@ -97,6 +141,18 @@ const struct clk_ops mtk_clk_gate_ops_se
+@@ -97,6 +141,18 @@
  	.disable	= mtk_cg_disable_inv,
  };
  
@@ -120,12 +120,12 @@ Signed-off-by: James Liao <jamesjj.liao at mediatek.com>
 +	.disable	= mtk_cg_disable_inv_no_setclr,
 +};
 +
- struct clk * __init mtk_clk_register_gate(
+ struct clk *mtk_clk_register_gate(
  		const char *name,
  		const char *parent_name,
 --- a/drivers/clk/mediatek/clk-gate.h
 +++ b/drivers/clk/mediatek/clk-gate.h
-@@ -36,6 +36,8 @@ static inline struct mtk_clk_gate *to_cl
+@@ -36,6 +36,8 @@
  
  extern const struct clk_ops mtk_clk_gate_ops_setclr;
  extern const struct clk_ops mtk_clk_gate_ops_setclr_inv;
@@ -1349,7 +1349,7 @@ Signed-off-by: James Liao <jamesjj.liao at mediatek.com>
 +							mtk_apmixedsys_init);
 --- a/drivers/clk/mediatek/clk-mtk.c
 +++ b/drivers/clk/mediatek/clk-mtk.c
-@@ -242,3 +242,28 @@ void __init mtk_clk_register_composites(
+@@ -244,3 +244,28 @@
  			clk_data->clks[mc->id] = clk;
  	}
  }
@@ -1380,7 +1380,7 @@ Signed-off-by: James Liao <jamesjj.liao at mediatek.com>
 +}
 --- a/drivers/clk/mediatek/clk-mtk.h
 +++ b/drivers/clk/mediatek/clk-mtk.h
-@@ -110,7 +110,8 @@ struct mtk_composite {
+@@ -121,7 +121,8 @@
  		.flags = CLK_SET_RATE_PARENT,				\
  	}
  
@@ -1390,7 +1390,7 @@ Signed-off-by: James Liao <jamesjj.liao at mediatek.com>
  		.id = _id,						\
  		.parent = _parent,					\
  		.name = _name,						\
-@@ -145,8 +146,36 @@ struct mtk_gate {
+@@ -156,8 +157,36 @@
  	const struct clk_ops *ops;
  };
  
diff --git a/target/linux/mediatek/patches-4.4/0011-reset-mediatek-mt2701-reset-driver.patch b/target/linux/mediatek/patches-4.9/0011-reset-mediatek-mt2701-reset-driver.patch
similarity index 100%
rename from target/linux/mediatek/patches-4.4/0011-reset-mediatek-mt2701-reset-driver.patch
rename to target/linux/mediatek/patches-4.9/0011-reset-mediatek-mt2701-reset-driver.patch
diff --git a/target/linux/mediatek/patches-4.4/0012-ARM-mediatek-Add-MT2701-config-options-for-mediatek-.patch b/target/linux/mediatek/patches-4.9/0012-ARM-mediatek-Add-MT2701-config-options-for-mediatek-.patch
similarity index 91%
rename from target/linux/mediatek/patches-4.4/0012-ARM-mediatek-Add-MT2701-config-options-for-mediatek-.patch
rename to target/linux/mediatek/patches-4.9/0012-ARM-mediatek-Add-MT2701-config-options-for-mediatek-.patch
index 479334a..696dea6 100644
--- a/target/linux/mediatek/patches-4.4/0012-ARM-mediatek-Add-MT2701-config-options-for-mediatek-.patch
+++ b/target/linux/mediatek/patches-4.9/0012-ARM-mediatek-Add-MT2701-config-options-for-mediatek-.patch
@@ -16,9 +16,9 @@ Acked-by: Linus Walleij <linus.walleij at linaro.org>
 
 --- a/arch/arm/mach-mediatek/Kconfig
 +++ b/arch/arm/mach-mediatek/Kconfig
-@@ -9,6 +9,10 @@ menuconfig ARCH_MEDIATEK
- 
- if ARCH_MEDIATEK
+@@ -14,6 +14,10 @@
+ 	bool "MediaTek MT2701 SoCs support"
+ 	default ARCH_MEDIATEK
  
 +config MACH_MT2701
 +	bool "MediaTek MT2701 SoCs support"
diff --git a/target/linux/mediatek/patches-4.4/0017-clk-add-hifsys-reset.patch b/target/linux/mediatek/patches-4.9/0017-clk-add-hifsys-reset.patch
similarity index 59%
rename from target/linux/mediatek/patches-4.4/0017-clk-add-hifsys-reset.patch
rename to target/linux/mediatek/patches-4.9/0017-clk-add-hifsys-reset.patch
index d7d151c..60940f3 100644
--- a/target/linux/mediatek/patches-4.4/0017-clk-add-hifsys-reset.patch
+++ b/target/linux/mediatek/patches-4.9/0017-clk-add-hifsys-reset.patch
@@ -20,7 +20,7 @@ Signed-off-by: John Crispin <blogic at openwrt.org>
 
 --- a/drivers/clk/mediatek/clk-mt2701.c
 +++ b/drivers/clk/mediatek/clk-mt2701.c
-@@ -1000,6 +1000,8 @@ static void __init mtk_hifsys_init(struc
+@@ -1000,6 +1000,8 @@
  	if (r)
  		pr_err("%s(): could not register clock provider: %d\n",
  			__func__, r);
@@ -29,19 +29,3 @@ Signed-off-by: John Crispin <blogic at openwrt.org>
  }
  CLK_OF_DECLARE(mtk_hifsys, "mediatek,mt2701-hifsys", mtk_hifsys_init);
  
---- a/include/dt-bindings/reset-controller/mt2701-resets.h
-+++ b/include/dt-bindings/reset-controller/mt2701-resets.h
-@@ -71,4 +71,13 @@
- #define MT2701_TOPRGU_CONN_MCU_RST		12
- #define MT2701_TOPRGU_BDP_DISP_RST		13
- 
-+/* HIFSYS resets */
-+#define MT2701_HIFSYS_UHOST0_RST		3
-+#define MT2701_HIFSYS_UHOST1_RST		4
-+#define MT2701_HIFSYS_UPHY0_RST			21
-+#define MT2701_HIFSYS_UPHY1_RST			22
-+#define MT2701_HIFSYS_PCIE0_RST			24
-+#define MT2701_HIFSYS_PCIE1_RST			25
-+#define MT2701_HIFSYS_PCIE2_RST			26
-+
- #endif  /* _DT_BINDINGS_RESET_CONTROLLER_MT2701 */
diff --git a/target/linux/mediatek/patches-4.4/0024-dt-bindings-add-MediaTek-PCIe-binding-documentation.patch b/target/linux/mediatek/patches-4.9/0024-dt-bindings-add-MediaTek-PCIe-binding-documentation.patch
similarity index 100%
rename from target/linux/mediatek/patches-4.4/0024-dt-bindings-add-MediaTek-PCIe-binding-documentation.patch
rename to target/linux/mediatek/patches-4.9/0024-dt-bindings-add-MediaTek-PCIe-binding-documentation.patch
diff --git a/target/linux/mediatek/patches-4.4/0025-PCI-mediatek-add-support-for-PCIe-found-on-MT7623-MT.patch b/target/linux/mediatek/patches-4.9/0025-PCI-mediatek-add-support-for-PCIe-found-on-MT7623-MT.patch
similarity index 98%
rename from target/linux/mediatek/patches-4.4/0025-PCI-mediatek-add-support-for-PCIe-found-on-MT7623-MT.patch
rename to target/linux/mediatek/patches-4.9/0025-PCI-mediatek-add-support-for-PCIe-found-on-MT7623-MT.patch
index bcb109d..71081fb 100644
--- a/target/linux/mediatek/patches-4.4/0025-PCI-mediatek-add-support-for-PCIe-found-on-MT7623-MT.patch
+++ b/target/linux/mediatek/patches-4.9/0025-PCI-mediatek-add-support-for-PCIe-found-on-MT7623-MT.patch
@@ -19,7 +19,7 @@ Signed-off-by: John Crispin <blogic at openwrt.org>
 
 --- a/arch/arm/mach-mediatek/Kconfig
 +++ b/arch/arm/mach-mediatek/Kconfig
-@@ -24,6 +24,7 @@ config MACH_MT6592
+@@ -29,6 +29,7 @@
  config MACH_MT7623
  	bool "MediaTek MT7623 SoCs support"
  	default ARCH_MEDIATEK
@@ -29,9 +29,9 @@ Signed-off-by: John Crispin <blogic at openwrt.org>
  	bool "MediaTek MT8127 SoCs support"
 --- a/drivers/pci/host/Kconfig
 +++ b/drivers/pci/host/Kconfig
-@@ -173,4 +173,15 @@ config PCI_HISI
- 	help
- 	  Say Y here if you want PCIe controller support on HiSilicon HIP05 SoC
+@@ -301,4 +301,15 @@
+ 	  To compile this driver as a module, choose M here: the
+ 	  module will be called vmd.
  
 +config PCIE_MTK
 +	bool "Mediatek PCIe Controller"
@@ -47,10 +47,10 @@ Signed-off-by: John Crispin <blogic at openwrt.org>
  endmenu
 --- a/drivers/pci/host/Makefile
 +++ b/drivers/pci/host/Makefile
-@@ -20,3 +20,4 @@ obj-$(CONFIG_PCIE_IPROC_BCMA) += pcie-ip
- obj-$(CONFIG_PCIE_ALTERA) += pcie-altera.o
- obj-$(CONFIG_PCIE_ALTERA_MSI) += pcie-altera-msi.o
- obj-$(CONFIG_PCI_HISI) += pcie-hisi.o
+@@ -33,3 +33,4 @@
+ obj-$(CONFIG_PCIE_ARTPEC6) += pcie-artpec6.o
+ obj-$(CONFIG_PCIE_ROCKCHIP) += pcie-rockchip.o
+ obj-$(CONFIG_VMD) += vmd.o
 +obj-$(CONFIG_PCIE_MTK) += pcie-mediatek.o
 --- /dev/null
 +++ b/drivers/pci/host/pcie-mediatek.c
diff --git a/target/linux/mediatek/patches-4.9/0026-scpsys-various-fixes.patch b/target/linux/mediatek/patches-4.9/0026-scpsys-various-fixes.patch
new file mode 100644
index 0000000..b5047f7
--- /dev/null
+++ b/target/linux/mediatek/patches-4.9/0026-scpsys-various-fixes.patch
@@ -0,0 +1,22 @@
+From 59aafd667d2880c90776931b6102b8252214d93c Mon Sep 17 00:00:00 2001
+From: John Crispin <blogic at openwrt.org>
+Date: Sun, 21 Feb 2016 13:52:12 +0100
+Subject: [PATCH 026/102] scpsys: various fixes
+
+---
+ drivers/clk/mediatek/clk-mt2701.c        |    2 ++
+ drivers/soc/mediatek/mtk-scpsys-mt2701.c |    8 --------
+ include/dt-bindings/power/mt2701-power.h |    4 ++--
+ 3 files changed, 4 insertions(+), 10 deletions(-)
+
+--- a/drivers/clk/mediatek/clk-mt2701.c
++++ b/drivers/clk/mediatek/clk-mt2701.c
+@@ -1043,6 +1043,8 @@
+ 	if (r)
+ 		pr_err("%s(): could not register clock provider: %d\n",
+ 			__func__, r);
++
++	mtk_register_reset_controller(node, 1, 0x34);
+ }
+ CLK_OF_DECLARE(mtk_ethsys, "mediatek,mt2701-ethsys", mtk_ethsys_init);
+ 
diff --git a/target/linux/mediatek/patches-4.4/0052-clk-dont-disable-unused-clocks.patch b/target/linux/mediatek/patches-4.9/0052-clk-dont-disable-unused-clocks.patch
similarity index 100%
rename from target/linux/mediatek/patches-4.4/0052-clk-dont-disable-unused-clocks.patch
rename to target/linux/mediatek/patches-4.9/0052-clk-dont-disable-unused-clocks.patch
diff --git a/target/linux/mediatek/patches-4.4/0053-clk-mediatek-enable-critical-clocks.patch b/target/linux/mediatek/patches-4.9/0053-clk-mediatek-enable-critical-clocks.patch
similarity index 100%
rename from target/linux/mediatek/patches-4.4/0053-clk-mediatek-enable-critical-clocks.patch
rename to target/linux/mediatek/patches-4.9/0053-clk-mediatek-enable-critical-clocks.patch
diff --git a/target/linux/mediatek/patches-4.4/0054-clk-mediatek-Export-CPU-mux-clocks-for-CPU-frequency.patch b/target/linux/mediatek/patches-4.9/0054-clk-mediatek-Export-CPU-mux-clocks-for-CPU-frequency.patch
similarity index 93%
rename from target/linux/mediatek/patches-4.4/0054-clk-mediatek-Export-CPU-mux-clocks-for-CPU-frequency.patch
rename to target/linux/mediatek/patches-4.9/0054-clk-mediatek-Export-CPU-mux-clocks-for-CPU-frequency.patch
index d5af5f0..2ff6990 100644
--- a/target/linux/mediatek/patches-4.4/0054-clk-mediatek-Export-CPU-mux-clocks-for-CPU-frequency.patch
+++ b/target/linux/mediatek/patches-4.9/0054-clk-mediatek-Export-CPU-mux-clocks-for-CPU-frequency.patch
@@ -60,14 +60,14 @@ Signed-off-by: Pi-Cheng Chen <pi-cheng.chen at linaro.org>
 +	u8		shift;
 +};
 +
-+static inline struct mtk_clk_cpumux *to_clk_mux(struct clk_hw *_hw)
++static inline struct mtk_clk_cpumux *to_mtk_clk_mux(struct clk_hw *_hw)
 +{
 +	return container_of(_hw, struct mtk_clk_cpumux, hw);
 +}
 +
 +static u8 clk_cpumux_get_parent(struct clk_hw *hw)
 +{
-+	struct mtk_clk_cpumux *mux = to_clk_mux(hw);
++	struct mtk_clk_cpumux *mux = to_mtk_clk_mux(hw);
 +	int num_parents = clk_hw_get_num_parents(hw);
 +	unsigned int val;
 +
@@ -84,7 +84,7 @@ Signed-off-by: Pi-Cheng Chen <pi-cheng.chen at linaro.org>
 +
 +static int clk_cpumux_set_parent(struct clk_hw *hw, u8 index)
 +{
-+	struct mtk_clk_cpumux *mux = to_clk_mux(hw);
++	struct mtk_clk_cpumux *mux = to_mtk_clk_mux(hw);
 +	u32 mask, val;
 +
 +	val = index << mux->shift;
@@ -193,7 +193,7 @@ Signed-off-by: Pi-Cheng Chen <pi-cheng.chen at linaro.org>
  
  #include <dt-bindings/clock/mt2701-clk.h>
  
-@@ -465,6 +466,10 @@ static const char * const cpu_parents[]
+@@ -465,6 +466,10 @@
  	"mmpll"
  };
  
@@ -204,7 +204,7 @@ Signed-off-by: Pi-Cheng Chen <pi-cheng.chen at linaro.org>
  static const struct mtk_composite top_muxes[] __initconst = {
  	MUX_GATE(CLK_TOP_AXI_SEL, "axi_sel", axi_parents,
  		0x0040, 0, 3, INVALID_MUX_GATE_BIT),
-@@ -677,6 +682,9 @@ static void __init mtk_infrasys_init(str
+@@ -677,6 +682,9 @@
  	mtk_clk_register_factors(infra_fixed_divs, ARRAY_SIZE(infra_fixed_divs),
  						clk_data);
  
@@ -224,7 +224,7 @@ Signed-off-by: Pi-Cheng Chen <pi-cheng.chen at linaro.org>
  
  #include <dt-bindings/clock/mt8173-clk.h>
  
-@@ -526,6 +527,25 @@ static const char * const i2s3_b_ck_pare
+@@ -525,6 +526,25 @@
  	"apll2_div5"
  };
  
@@ -250,7 +250,7 @@ Signed-off-by: Pi-Cheng Chen <pi-cheng.chen at linaro.org>
  static const struct mtk_composite top_muxes[] __initconst = {
  	/* CLK_CFG_0 */
  	MUX(CLK_TOP_AXI_SEL, "axi_sel", axi_parents, 0x0040, 0, 3),
-@@ -945,6 +965,9 @@ static void __init mtk_infrasys_init(str
+@@ -948,6 +968,9 @@
  						clk_data);
  	mtk_clk_register_factors(infra_divs, ARRAY_SIZE(infra_divs), clk_data);
  
@@ -262,10 +262,10 @@ Signed-off-by: Pi-Cheng Chen <pi-cheng.chen at linaro.org>
  		pr_err("%s(): could not register clock provider: %d\n",
 --- a/include/dt-bindings/clock/mt2701-clk.h
 +++ b/include/dt-bindings/clock/mt2701-clk.h
-@@ -217,7 +217,8 @@
+@@ -221,7 +221,8 @@
  #define CLK_INFRA_PMICWRAP			17
  #define CLK_INFRA_DDCCI				18
- #define CLK_INFRA_CLK_13M                       19
+ #define CLK_INFRA_CLK_13M			19
 -#define CLK_INFRA_NR				20
 +#define CLK_INFRA_CPUSEL			20
 +#define CLK_INFRA_NR				21
@@ -274,7 +274,7 @@ Signed-off-by: Pi-Cheng Chen <pi-cheng.chen at linaro.org>
  
 --- a/include/dt-bindings/clock/mt8173-clk.h
 +++ b/include/dt-bindings/clock/mt8173-clk.h
-@@ -192,7 +192,9 @@
+@@ -193,7 +193,9 @@
  #define CLK_INFRA_PMICSPI		10
  #define CLK_INFRA_PMICWRAP		11
  #define CLK_INFRA_CLK_13M		12
diff --git a/target/linux/mediatek/patches-4.4/0055-cpufreq-mediatek-add-driver.patch b/target/linux/mediatek/patches-4.9/0055-cpufreq-mediatek-add-driver.patch
similarity index 100%
rename from target/linux/mediatek/patches-4.4/0055-cpufreq-mediatek-add-driver.patch
rename to target/linux/mediatek/patches-4.9/0055-cpufreq-mediatek-add-driver.patch
diff --git a/target/linux/mediatek/patches-4.4/0071-pwm-add-pwm-mediatek.patch b/target/linux/mediatek/patches-4.9/0071-pwm-add-pwm-mediatek.patch
similarity index 87%
rename from target/linux/mediatek/patches-4.4/0071-pwm-add-pwm-mediatek.patch
rename to target/linux/mediatek/patches-4.9/0071-pwm-add-pwm-mediatek.patch
index 8ca6c49..75796ab 100644
--- a/target/linux/mediatek/patches-4.4/0071-pwm-add-pwm-mediatek.patch
+++ b/target/linux/mediatek/patches-4.9/0071-pwm-add-pwm-mediatek.patch
@@ -15,11 +15,11 @@ Signed-off-by: John Crispin <john at phrozen.org>
 
 --- a/arch/arm/boot/dts/mt7623-evb.dts
 +++ b/arch/arm/boot/dts/mt7623-evb.dts
-@@ -341,6 +341,17 @@
- 			output-low;
- 		};
+@@ -26,8 +26,25 @@
+ 	memory {
+ 		reg = <0 0x80000000 0 0x40000000>;
  	};
-+
++/*
 +	pwm_pins: pwm {
 +		pins_pwm1 {
 +			pinmux = <MT7623_PIN_204_PWM1_FUNC_PWM1>;
@@ -28,55 +28,22 @@ Signed-off-by: John Crispin <john at phrozen.org>
 +		pins_pwm2 {
 +			pinmux = <MT7623_PIN_205_PWM2_FUNC_PWM2>;
 +		};
-+	};
++	};*/
 +
  };
  
- &nandc {
-@@ -419,3 +430,9 @@
- 	mediatek,reset-pin = <&pio 15 0>;
+ &uart2 {
  	status = "okay";
  };
 +
-+&pwm {
++/*&pwm {
 +	pinctrl-names = "default";
 +	pinctrl-0 = <&pwm_pins>;
 +	status = "okay";
-+};
---- a/arch/arm/boot/dts/mt7623.dtsi
-+++ b/arch/arm/boot/dts/mt7623.dtsi
-@@ -324,6 +324,28 @@
- 		status = "disabled";
- 	};
- 
-+	pwm: pwm at 11006000 {
-+		compatible = "mediatek,mt7623-pwm";
-+	
-+		reg = <0 0x11006000 0 0x1000>;
-+		
-+		resets = <&pericfg MT2701_PERI_PWM_SW_RST>;
-+		reset-names = "pwm";
-+
-+		#pwm-cells = <2>;
-+		clocks = <&topckgen CLK_TOP_PWM_SEL>,
-+			 <&pericfg CLK_PERI_PWM>,
-+			 <&pericfg CLK_PERI_PWM1>,
-+			 <&pericfg CLK_PERI_PWM2>,
-+			 <&pericfg CLK_PERI_PWM3>,
-+			 <&pericfg CLK_PERI_PWM4>,
-+			 <&pericfg CLK_PERI_PWM5>;
-+		clock-names = "top", "main", "pwm1", "pwm2",
-+			      "pwm3", "pwm4", "pwm5";
-+	
-+		status = "disabled";
-+	};
-+
- 	spi: spi at 1100a000 {
- 		compatible = "mediatek,mt7623-spi", "mediatek,mt6589-spi";
- 		reg = <0 0x1100a000 0 0x1000>;
++};*/
 --- a/drivers/pwm/Kconfig
 +++ b/drivers/pwm/Kconfig
-@@ -260,6 +260,15 @@ config PWM_MTK_DISP
+@@ -282,6 +282,15 @@
  	  To compile this driver as a module, choose M here: the module
  	  will be called pwm-mtk-disp.
  
@@ -94,14 +61,14 @@ Signed-off-by: John Crispin <john at phrozen.org>
  	depends on ARCH_MXS && OF
 --- a/drivers/pwm/Makefile
 +++ b/drivers/pwm/Makefile
-@@ -22,6 +22,7 @@ obj-$(CONFIG_PWM_LPC32XX)	+= pwm-lpc32xx
- obj-$(CONFIG_PWM_LPSS)		+= pwm-lpss.o
+@@ -25,6 +25,7 @@
  obj-$(CONFIG_PWM_LPSS_PCI)	+= pwm-lpss-pci.o
  obj-$(CONFIG_PWM_LPSS_PLATFORM)	+= pwm-lpss-platform.o
+ obj-$(CONFIG_PWM_MESON)		+= pwm-meson.o
 +obj-$(CONFIG_PWM_MEDIATEK)	+= pwm-mediatek.o
  obj-$(CONFIG_PWM_MTK_DISP)	+= pwm-mtk-disp.o
  obj-$(CONFIG_PWM_MXS)		+= pwm-mxs.o
- obj-$(CONFIG_PWM_PCA9685)	+= pwm-pca9685.o
+ obj-$(CONFIG_PWM_OMAP_DMTIMER)	+= pwm-omap-dmtimer.o
 --- /dev/null
 +++ b/drivers/pwm/pwm-mediatek.c
 @@ -0,0 +1,230 @@
diff --git a/target/linux/mediatek/patches-4.4/0101-net-mediatek-add-gsw-mt7530-driver.patch b/target/linux/mediatek/patches-4.9/0101-net-mediatek-add-gsw-mt7530-driver.patch
similarity index 95%
rename from target/linux/mediatek/patches-4.4/0101-net-mediatek-add-gsw-mt7530-driver.patch
rename to target/linux/mediatek/patches-4.9/0101-net-mediatek-add-gsw-mt7530-driver.patch
index 4d931fc..a90f490 100644
--- a/target/linux/mediatek/patches-4.4/0101-net-mediatek-add-gsw-mt7530-driver.patch
+++ b/target/linux/mediatek/patches-4.9/0101-net-mediatek-add-gsw-mt7530-driver.patch
@@ -376,7 +376,7 @@ Signed-off-by: John Crispin <blogic at openwrt.org>
 +
 +int mt7623_gsw_config(struct mtk_eth *eth)
 +{
-+	if (eth->mii_bus && eth->mii_bus->phy_map[0x1f])
++	if (eth->mii_bus && mdiobus_get_phy(eth->mii_bus, 0x1f))
 +		mt7530_probe(eth->dev, NULL, eth->mii_bus, 1);
 +
 +	return 0;
@@ -2203,7 +2203,7 @@ Signed-off-by: John Crispin <blogic at openwrt.org>
 +#endif
 --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
 +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-@@ -24,6 +24,9 @@
+@@ -25,6 +25,9 @@
  
  #include "mtk_eth_soc.h"
  
@@ -2213,7 +2213,7 @@ Signed-off-by: John Crispin <blogic at openwrt.org>
  static int mtk_msg_level = -1;
  module_param_named(msg_level, mtk_msg_level, int, 0);
  MODULE_PARM_DESC(msg_level, "Message level (-1=defaults,0=none,...,16=all)");
-@@ -69,7 +72,7 @@ static int mtk_mdio_busy_wait(struct mtk
+@@ -74,14 +77,14 @@
  			return 0;
  		if (time_after(jiffies, t_start + PHY_IAC_TIMEOUT))
  			break;
@@ -2222,9 +2222,35 @@ Signed-off-by: John Crispin <blogic at openwrt.org>
  	}
  
  	dev_err(eth->dev, "mdio: MDIO timeout\n");
-@@ -1421,15 +1424,6 @@ static int __init mtk_hw_init(struct mtk
- 	reset_control_deassert(eth->rstc);
- 	usleep_range(10, 20);
+ 	return -1;
+ }
+ 
+-static u32 _mtk_mdio_write(struct mtk_eth *eth, u32 phy_addr,
++u32 _mtk_mdio_write(struct mtk_eth *eth, u32 phy_addr,
+ 			   u32 phy_register, u32 write_data)
+ {
+ 	if (mtk_mdio_busy_wait(eth))
+@@ -100,7 +103,7 @@
+ 	return 0;
+ }
+ 
+-static u32 _mtk_mdio_read(struct mtk_eth *eth, int phy_addr, int phy_reg)
++u32 _mtk_mdio_read(struct mtk_eth *eth, int phy_addr, int phy_reg)
+ {
+ 	u32 d;
+ 
+@@ -155,7 +158,7 @@
+ 
+ 	val = (speed == SPEED_1000) ?
+ 		RCK_CTRL_RGMII_1000 : RCK_CTRL_RGMII_10_100;
+-	mtk_w32(eth, val, TRGMII_RCK_CTRL);
++	mtk_w32(eth, val, _TRGMII_RCK_CTRL);
+ 
+ 	val = (speed == SPEED_1000) ?
+ 		TCK_CTRL_RGMII_1000 : TCK_CTRL_RGMII_10_100;
+@@ -1833,15 +1836,6 @@
+ 	}
+ 	regmap_write(eth->ethsys, ETHSYS_SYSCFG0, val);
  
 -	/* Set GE2 driving and slew rate */
 -	regmap_write(eth->pctl, GPIO_DRV_SEL10, 0xa00);
@@ -2238,16 +2264,16 @@ Signed-off-by: John Crispin <blogic at openwrt.org>
  	/* GE1, Force 1000M/FD, FC ON */
  	mtk_w32(eth, MAC_MCR_FIXED_LINK, MTK_MAC_MCR(0));
  
-@@ -1452,6 +1446,8 @@ static int __init mtk_hw_init(struct mtk
- 	if (err)
- 		return err;
+@@ -1851,6 +1845,8 @@
+ 	/* Enable RX VLan Offloading */
+ 	mtk_w32(eth, 1, MTK_CDMP_EG_CTRL);
  
 +	mtk_gsw_init(eth);
 +
  	/* disable delay and normal interrupt */
  	mtk_w32(eth, 0, MTK_QDMA_DELAY_INT);
- 	mtk_irq_disable(eth, ~0);
-@@ -1479,6 +1475,8 @@ static int __init mtk_hw_init(struct mtk
+ 	mtk_w32(eth, 0, MTK_PDMA_DELAY_INT);
+@@ -1879,6 +1875,8 @@
  		mtk_w32(eth, val, MTK_GDMA_FWD_CFG(i));
  	}
  
@@ -2256,102 +2282,38 @@ Signed-off-by: John Crispin <blogic at openwrt.org>
  	return 0;
  }
  
-@@ -1734,7 +1732,7 @@ static int mtk_add_mac(struct mtk_eth *e
- {
- 	struct mtk_mac *mac;
- 	const __be32 *_id = of_get_property(np, "reg", NULL);
--	int id, err;
-+	int id;
- 
- 	if (!_id) {
- 		dev_err(eth->dev, "missing mac id\n");
-@@ -1768,8 +1766,8 @@ static int mtk_add_mac(struct mtk_eth *e
- 				     GFP_KERNEL);
- 	if (!mac->hw_stats) {
- 		dev_err(eth->dev, "failed to allocate counter memory\n");
--		err = -ENOMEM;
--		goto free_netdev;
-+		free_netdev(eth->netdev[id]);
-+		return -ENOMEM;
- 	}
- 	spin_lock_init(&mac->hw_stats->stats_lock);
- 	mac->hw_stats->reg_offset = id * MTK_STAT_OFFSET;
-@@ -1783,21 +1781,9 @@ static int mtk_add_mac(struct mtk_eth *e
- 	eth->netdev[id]->features |= MTK_HW_FEATURES;
- 	eth->netdev[id]->ethtool_ops = &mtk_ethtool_ops;
- 
--	err = register_netdev(eth->netdev[id]);
--	if (err) {
--		dev_err(eth->dev, "error bringing up device\n");
--		goto free_netdev;
--	}
- 	eth->netdev[id]->irq = eth->irq[0];
--	netif_info(eth, probe, eth->netdev[id],
--		   "mediatek frame engine at 0x%08lx, irq %d\n",
--		   eth->netdev[id]->base_addr, eth->irq[0]);
- 
- 	return 0;
--
--free_netdev:
--	free_netdev(eth->netdev[id]);
--	return err;
- }
- 
- static int mtk_probe(struct platform_device *pdev)
-@@ -1865,14 +1851,13 @@ static int mtk_probe(struct platform_dev
- 	clk_prepare_enable(eth->clk_gp1);
- 	clk_prepare_enable(eth->clk_gp2);
+@@ -2379,6 +2377,9 @@
+ 	if (!eth)
+ 		return -ENOMEM;
  
 +	eth->switch_np = of_parse_phandle(pdev->dev.of_node,
 +					  "mediatek,switch", 0);
 +
  	eth->dev = &pdev->dev;
- 	eth->msg_enable = netif_msg_init(mtk_msg_level, MTK_DEFAULT_MSG_ENABLE);
- 	INIT_WORK(&eth->pending_work, mtk_pending_work);
- 
--	err = mtk_hw_init(eth);
--	if (err)
--		return err;
--
- 	for_each_child_of_node(pdev->dev.of_node, mac_np) {
- 		if (!of_device_is_compatible(mac_np,
- 					     "mediatek,eth-mac"))
-@@ -1886,6 +1871,22 @@ static int mtk_probe(struct platform_dev
- 			goto err_free_dev;
- 	}
- 
-+	err = mtk_hw_init(eth);
-+	if (err)
-+		return err;
-+
-+	for (i = 0; i < MTK_MAX_DEVS; i++) {
-+		if (!eth->netdev[i])
-+			continue;
-+		err = register_netdev(eth->netdev[i]);
-+		if (err)
-+			dev_err(eth->dev, "error bringing up device\n");
-+		else
-+			netif_info(eth, probe, eth->netdev[i],
-+				   "mediatek frame engine at 0x%08lx, irq %d\n",
-+				   eth->netdev[i]->base_addr, eth->irq[0]);
-+	}
-+
- 	/* we run 2 devices on the same DMA ring so we need a dummy device
- 	 * for NAPI to work
- 	 */
+ 	eth->base = devm_ioremap_resource(&pdev->dev, res);
+ 	if (IS_ERR(eth->base))
 --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h
 +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
-@@ -407,6 +407,9 @@ struct mtk_eth {
- 	struct clk			*clk_gp2;
+@@ -314,7 +314,7 @@
+ 				 MAC_MCR_FORCE_DPX | MAC_MCR_FORCE_LINK)
+ 
+ /* TRGMII RXC control register */
+-#define TRGMII_RCK_CTRL		0x10300
++#define _TRGMII_RCK_CTRL		0x10300
+ #define DQSI0(x)		((x << 0) & GENMASK(6, 0))
+ #define DQSI1(x)		((x << 8) & GENMASK(14, 8))
+ #define RXCTL_DMWTLAT(x)	((x << 16) & GENMASK(18, 16))
+@@ -554,6 +554,9 @@
  	struct mii_bus			*mii_bus;
  	struct work_struct		pending_work;
+ 	unsigned long			state;
 +
 +	struct device_node		*switch_np;
 +	void				*sw_priv;
  };
  
  /* struct mtk_mac -	the structure that holds the info about the MACs of the
-@@ -434,4 +437,6 @@ void mtk_stats_update_mac(struct mtk_mac
+@@ -586,4 +589,6 @@
  void mtk_w32(struct mtk_eth *eth, u32 val, unsigned reg);
  u32 mtk_r32(struct mtk_eth *eth, unsigned reg);
  
diff --git a/target/linux/mediatek/patches-4.4/0103-nand_fixes.patch b/target/linux/mediatek/patches-4.9/0103-nand_fixes.patch
similarity index 100%
rename from target/linux/mediatek/patches-4.4/0103-nand_fixes.patch
rename to target/linux/mediatek/patches-4.9/0103-nand_fixes.patch
diff --git a/target/linux/mediatek/patches-4.4/0200-devicetree.patch b/target/linux/mediatek/patches-4.9/0200-devicetree.patch
similarity index 100%
rename from target/linux/mediatek/patches-4.4/0200-devicetree.patch
rename to target/linux/mediatek/patches-4.9/0200-devicetree.patch
diff --git a/target/linux/mediatek/patches-4.4/0201-block2mtd.patch b/target/linux/mediatek/patches-4.9/0201-block2mtd.patch
similarity index 100%
rename from target/linux/mediatek/patches-4.4/0201-block2mtd.patch
rename to target/linux/mediatek/patches-4.9/0201-block2mtd.patch



More information about the lede-commits mailing list