mirror of
https://github.com/coolsnowwolf/lede.git
synced 2025-04-16 04:13:31 +00:00
Merge branch 'master' of https://github.com/coolsnowwolf/lede
This commit is contained in:
commit
ef5585ee83
@ -69,10 +69,13 @@ define Build/Trusted-Firmware-A/Target
|
|||||||
endef
|
endef
|
||||||
|
|
||||||
|
|
||||||
|
DTC=$(wildcard $(LINUX_DIR)/scripts/dtc/dtc)
|
||||||
|
|
||||||
define Build/Compile/Trusted-Firmware-A
|
define Build/Compile/Trusted-Firmware-A
|
||||||
+$(MAKE) $(PKG_JOBS) -C $(PKG_BUILD_DIR) \
|
+$(MAKE) $(PKG_JOBS) -C $(PKG_BUILD_DIR) \
|
||||||
CROSS_COMPILE=$(TARGET_CROSS) \
|
CROSS_COMPILE=$(TARGET_CROSS) \
|
||||||
OPENSSL_DIR=$(STAGING_DIR_HOST) \
|
OPENSSL_DIR=$(STAGING_DIR_HOST) \
|
||||||
|
$(if $(DTC),DTC="$(DTC)") \
|
||||||
PLAT=$(PLAT) \
|
PLAT=$(PLAT) \
|
||||||
BUILD_STRING="OpenWrt v$(PKG_VERSION)-$(PKG_RELEASE) ($(VARIANT))" \
|
BUILD_STRING="OpenWrt v$(PKG_VERSION)-$(PKG_RELEASE) ($(VARIANT))" \
|
||||||
$(TFA_MAKE_FLAGS)
|
$(TFA_MAKE_FLAGS)
|
||||||
|
@ -13,68 +13,166 @@ PKG_RELEASE:=$(AUTORELEASE)
|
|||||||
|
|
||||||
PKG_SOURCE_PROTO:=git
|
PKG_SOURCE_PROTO:=git
|
||||||
PKG_SOURCE_URL=https://github.com/mtk-openwrt/arm-trusted-firmware.git
|
PKG_SOURCE_URL=https://github.com/mtk-openwrt/arm-trusted-firmware.git
|
||||||
PKG_SOURCE_DATE:=2021-05-08
|
PKG_SOURCE_DATE:=2022-08-18
|
||||||
PKG_SOURCE_VERSION:=d2c75b2139be003887af9cc5a94da5e9bdc59de7
|
PKG_SOURCE_VERSION:=9c9c49945c24634e4ae6cd924dbb88cf85c7926d
|
||||||
PKG_MIRROR_HASH:=4af9ce8e11511afee7f588cc982946c06339edbfa47afef6a7f3e2231ac9f34d
|
PKG_MIRROR_HASH:=26b474f40c02da12b7bed56597aeef209757ad1b40a4f0a652794954018b2198
|
||||||
|
|
||||||
PKG_MAINTAINER:=Daniel Golle <daniel@makrotopia.org>
|
PKG_MAINTAINER:=Daniel Golle <daniel@makrotopia.org>
|
||||||
|
|
||||||
|
include $(INCLUDE_DIR)/kernel.mk
|
||||||
include $(INCLUDE_DIR)/trusted-firmware-a.mk
|
include $(INCLUDE_DIR)/trusted-firmware-a.mk
|
||||||
include $(INCLUDE_DIR)/package.mk
|
include $(INCLUDE_DIR)/package.mk
|
||||||
|
|
||||||
define Trusted-Firmware-A/Default
|
define Trusted-Firmware-A/Default
|
||||||
BUILD_TARGET:=mediatek
|
BUILD_TARGET:=mediatek
|
||||||
BUILD_SUBTARGET:=mt7622
|
|
||||||
PLAT:=mt7622
|
|
||||||
TFA_IMAGE:=bl2.img bl31.bin
|
TFA_IMAGE:=bl2.img bl31.bin
|
||||||
BOOT_DEVICE:=
|
BOOT_DEVICE:=
|
||||||
DDR3_FLYBY:=
|
DDR3_FLYBY:=
|
||||||
|
DDR_TYPE:=
|
||||||
|
NAND_TYPE:=
|
||||||
endef
|
endef
|
||||||
|
|
||||||
define Trusted-Firmware-A/mt7622-nor-1ddr
|
define Trusted-Firmware-A/mt7622-nor-1ddr
|
||||||
NAME:=MediaTek MT7622 (SPI-NOR, 1x DDR3)
|
NAME:=MediaTek MT7622 (SPI-NOR, 1x DDR3)
|
||||||
|
BUILD_SUBTARGET:=mt7622
|
||||||
|
PLAT:=mt7622
|
||||||
BOOT_DEVICE:=nor
|
BOOT_DEVICE:=nor
|
||||||
endef
|
endef
|
||||||
|
|
||||||
define Trusted-Firmware-A/mt7622-nor-2ddr
|
define Trusted-Firmware-A/mt7622-nor-2ddr
|
||||||
NAME:=MediaTek MT7622 (SPI-NOR, 2x DDR3)
|
NAME:=MediaTek MT7622 (SPI-NOR, 2x DDR3)
|
||||||
|
BUILD_SUBTARGET:=mt7622
|
||||||
|
PLAT:=mt7622
|
||||||
BOOT_DEVICE:=nor
|
BOOT_DEVICE:=nor
|
||||||
DDR3_FLYBY:=1
|
DDR3_FLYBY:=1
|
||||||
endef
|
endef
|
||||||
|
|
||||||
define Trusted-Firmware-A/mt7622-snand-1ddr
|
define Trusted-Firmware-A/mt7622-snand-1ddr
|
||||||
NAME:=MediaTek MT7622 (SPI-NAND, 1x DDR3)
|
NAME:=MediaTek MT7622 (SPI-NAND, 1x DDR3)
|
||||||
|
BUILD_SUBTARGET:=mt7622
|
||||||
|
PLAT:=mt7622
|
||||||
BOOT_DEVICE:=snand
|
BOOT_DEVICE:=snand
|
||||||
endef
|
endef
|
||||||
|
|
||||||
define Trusted-Firmware-A/mt7622-snand-2ddr
|
define Trusted-Firmware-A/mt7622-snand-2ddr
|
||||||
NAME:=MediaTek MT7622 (SPI-NAND, 2x DDR3)
|
NAME:=MediaTek MT7622 (SPI-NAND, 2x DDR3)
|
||||||
|
BUILD_SUBTARGET:=mt7622
|
||||||
|
PLAT:=mt7622
|
||||||
BOOT_DEVICE:=snand
|
BOOT_DEVICE:=snand
|
||||||
DDR3_FLYBY:=1
|
DDR3_FLYBY:=1
|
||||||
endef
|
endef
|
||||||
|
|
||||||
define Trusted-Firmware-A/mt7622-emmc-1ddr
|
define Trusted-Firmware-A/mt7622-emmc-1ddr
|
||||||
NAME:=MediaTek MT7622 (eMMC, 1x DDR3)
|
NAME:=MediaTek MT7622 (eMMC, 1x DDR3)
|
||||||
|
BUILD_SUBTARGET:=mt7622
|
||||||
|
PLAT:=mt7622
|
||||||
BOOT_DEVICE:=emmc
|
BOOT_DEVICE:=emmc
|
||||||
endef
|
endef
|
||||||
|
|
||||||
define Trusted-Firmware-A/mt7622-emmc-2ddr
|
define Trusted-Firmware-A/mt7622-emmc-2ddr
|
||||||
NAME:=MediaTek MT7622 (eMMC, 2x DDR3)
|
NAME:=MediaTek MT7622 (eMMC, 2x DDR3)
|
||||||
|
BUILD_SUBTARGET:=mt7622
|
||||||
|
PLAT:=mt7622
|
||||||
BOOT_DEVICE:=emmc
|
BOOT_DEVICE:=emmc
|
||||||
DDR3_FLYBY:=1
|
DDR3_FLYBY:=1
|
||||||
endef
|
endef
|
||||||
|
|
||||||
define Trusted-Firmware-A/mt7622-sdmmc-1ddr
|
define Trusted-Firmware-A/mt7622-sdmmc-1ddr
|
||||||
NAME:=MediaTek MT7622 (SDcard, 1x DDR3)
|
NAME:=MediaTek MT7622 (SD card, 1x DDR3)
|
||||||
|
BUILD_SUBTARGET:=mt7622
|
||||||
|
PLAT:=mt7622
|
||||||
BOOT_DEVICE:=sdmmc
|
BOOT_DEVICE:=sdmmc
|
||||||
endef
|
endef
|
||||||
|
|
||||||
define Trusted-Firmware-A/mt7622-sdmmc-2ddr
|
define Trusted-Firmware-A/mt7622-sdmmc-2ddr
|
||||||
NAME:=MediaTek MT7622 (SDcard, 2x DDR3)
|
NAME:=MediaTek MT7622 (SD card, 2x DDR3)
|
||||||
|
BUILD_SUBTARGET:=mt7622
|
||||||
|
PLAT:=mt7622
|
||||||
BOOT_DEVICE:=sdmmc
|
BOOT_DEVICE:=sdmmc
|
||||||
DDR3_FLYBY:=1
|
DDR3_FLYBY:=1
|
||||||
endef
|
endef
|
||||||
|
|
||||||
|
define Trusted-Firmware-A/mt7986-nor-ddr4
|
||||||
|
NAME:=MediaTek MT7986 (SPI-NOR, DDR4)
|
||||||
|
BOOT_DEVICE:=nor
|
||||||
|
BUILD_SUBTARGET:=filogic
|
||||||
|
PLAT:=mt7986
|
||||||
|
DDR_TYPE:=ddr4
|
||||||
|
endef
|
||||||
|
|
||||||
|
define Trusted-Firmware-A/mt7986-emmc-ddr4
|
||||||
|
NAME:=MediaTek MT7986 (eMMC, DDR4)
|
||||||
|
BOOT_DEVICE:=emmc
|
||||||
|
BUILD_SUBTARGET:=filogic
|
||||||
|
PLAT:=mt7986
|
||||||
|
DDR_TYPE:=ddr4
|
||||||
|
endef
|
||||||
|
|
||||||
|
define Trusted-Firmware-A/mt7986-sdmmc-ddr4
|
||||||
|
NAME:=MediaTek MT7986 (SD card, DDR4)
|
||||||
|
BOOT_DEVICE:=sdmmc
|
||||||
|
BUILD_SUBTARGET:=filogic
|
||||||
|
PLAT:=mt7986
|
||||||
|
DDR_TYPE:=ddr4
|
||||||
|
endef
|
||||||
|
|
||||||
|
define Trusted-Firmware-A/mt7986-snand-ddr4
|
||||||
|
NAME:=MediaTek MT7986 (SPI-NAND via SNFI, DDR4)
|
||||||
|
BOOT_DEVICE:=snand
|
||||||
|
BUILD_SUBTARGET:=filogic
|
||||||
|
PLAT:=mt7986
|
||||||
|
DDR_TYPE:=ddr4
|
||||||
|
endef
|
||||||
|
|
||||||
|
define Trusted-Firmware-A/mt7986-spim-nand-ddr4
|
||||||
|
NAME:=MediaTek MT7986 (SPI-NAND via SPIM, DDR4)
|
||||||
|
BOOT_DEVICE:=spim-nand
|
||||||
|
BUILD_SUBTARGET:=filogic
|
||||||
|
PLAT:=mt7986
|
||||||
|
DDR_TYPE:=ddr4
|
||||||
|
NAND_TYPE:=spim:2k+64
|
||||||
|
endef
|
||||||
|
|
||||||
|
define Trusted-Firmware-A/mt7986-nor-ddr3
|
||||||
|
NAME:=MediaTek MT7986 (SPI-NOR, DDR3)
|
||||||
|
BOOT_DEVICE:=nor
|
||||||
|
BUILD_SUBTARGET:=filogic
|
||||||
|
PLAT:=mt7986
|
||||||
|
DDR_TYPE:=ddr3
|
||||||
|
endef
|
||||||
|
|
||||||
|
define Trusted-Firmware-A/mt7986-emmc-ddr3
|
||||||
|
NAME:=MediaTek MT7986 (eMMC, DDR3)
|
||||||
|
BOOT_DEVICE:=emmc
|
||||||
|
BUILD_SUBTARGET:=filogic
|
||||||
|
PLAT:=mt7986
|
||||||
|
DDR_TYPE:=ddr3
|
||||||
|
endef
|
||||||
|
|
||||||
|
define Trusted-Firmware-A/mt7986-sdmmc-ddr3
|
||||||
|
NAME:=MediaTek MT7986 (SD card, DDR3)
|
||||||
|
BOOT_DEVICE:=sdmmc
|
||||||
|
BUILD_SUBTARGET:=filogic
|
||||||
|
PLAT:=mt7986
|
||||||
|
DDR_TYPE:=ddr3
|
||||||
|
endef
|
||||||
|
|
||||||
|
define Trusted-Firmware-A/mt7986-snand-ddr3
|
||||||
|
NAME:=MediaTek MT7986 (SPI-NAND via SNFI, DDR3)
|
||||||
|
BOOT_DEVICE:=snand
|
||||||
|
BUILD_SUBTARGET:=filogic
|
||||||
|
PLAT:=mt7986
|
||||||
|
DDR_TYPE:=ddr3
|
||||||
|
endef
|
||||||
|
|
||||||
|
define Trusted-Firmware-A/mt7986-spim-nand-ddr3
|
||||||
|
NAME:=MediaTek MT7986 (SPI-NAND via SPIM, DDR3)
|
||||||
|
BOOT_DEVICE:=spim-nand
|
||||||
|
BUILD_SUBTARGET:=filogic
|
||||||
|
PLAT:=mt7986
|
||||||
|
DDR_TYPE:=ddr3
|
||||||
|
endef
|
||||||
|
|
||||||
TFA_TARGETS:= \
|
TFA_TARGETS:= \
|
||||||
mt7622-nor-1ddr \
|
mt7622-nor-1ddr \
|
||||||
mt7622-nor-2ddr \
|
mt7622-nor-2ddr \
|
||||||
@ -83,22 +181,31 @@ TFA_TARGETS:= \
|
|||||||
mt7622-emmc-1ddr \
|
mt7622-emmc-1ddr \
|
||||||
mt7622-emmc-2ddr \
|
mt7622-emmc-2ddr \
|
||||||
mt7622-sdmmc-1ddr \
|
mt7622-sdmmc-1ddr \
|
||||||
mt7622-sdmmc-2ddr
|
mt7622-sdmmc-2ddr \
|
||||||
|
mt7986-emmc-ddr3 \
|
||||||
|
mt7986-nor-ddr3 \
|
||||||
|
mt7986-sdmmc-ddr3 \
|
||||||
|
mt7986-snand-ddr3 \
|
||||||
|
mt7986-spim-nand-ddr3 \
|
||||||
|
mt7986-emmc-ddr4 \
|
||||||
|
mt7986-nor-ddr4 \
|
||||||
|
mt7986-sdmmc-ddr4 \
|
||||||
|
mt7986-snand-ddr4 \
|
||||||
|
mt7986-spim-nand-ddr4
|
||||||
|
|
||||||
TFA_MAKE_FLAGS += \
|
TFA_MAKE_FLAGS += \
|
||||||
BOOT_DEVICE=$(BOOT_DEVICE) \
|
BOOT_DEVICE=$(BOOT_DEVICE) \
|
||||||
USE_MKIMAGE=1 MKIMAGE=$(STAGING_DIR_HOST)/bin/mkimage \
|
USE_MKIMAGE=1 MKIMAGE=$(STAGING_DIR_HOST)/bin/mkimage \
|
||||||
|
$(if $(findstring ddr4,$(DDR_TYPE)),DRAM_USE_DDR4=1) \
|
||||||
|
$(if $(NAND_TYPE),NAND_TYPE=$(NAND_TYPE)) \
|
||||||
|
HAVE_DRAM_OBJ_FILE=yes \
|
||||||
$(if $(DDR3_FLYBY),DDR3_FLYBY=1) \
|
$(if $(DDR3_FLYBY),DDR3_FLYBY=1) \
|
||||||
all
|
all
|
||||||
|
|
||||||
define Build/Configure
|
|
||||||
$(call Build/Configure/Default)
|
|
||||||
endef
|
|
||||||
|
|
||||||
define Package/trusted-firmware-a/install
|
define Package/trusted-firmware-a/install
|
||||||
$(INSTALL_DIR) $(STAGING_DIR_IMAGE)
|
$(INSTALL_DIR) $(STAGING_DIR_IMAGE)
|
||||||
$(INSTALL_DATA) $(PKG_BUILD_DIR)/build/mt7622/release/bl2.img $(STAGING_DIR_IMAGE)/$(BUILD_VARIANT)-bl2.img
|
$(INSTALL_DATA) $(PKG_BUILD_DIR)/build/$(PLAT)/release/bl2.img $(STAGING_DIR_IMAGE)/$(BUILD_VARIANT)-bl2.img
|
||||||
$(INSTALL_DATA) $(PKG_BUILD_DIR)/build/mt7622/release/bl31.bin $(STAGING_DIR_IMAGE)/$(BUILD_VARIANT)-bl31.bin
|
$(INSTALL_DATA) $(PKG_BUILD_DIR)/build/$(PLAT)/release/bl31.bin $(STAGING_DIR_IMAGE)/$(BUILD_VARIANT)-bl31.bin
|
||||||
endef
|
endef
|
||||||
|
|
||||||
$(eval $(call BuildPackage/Trusted-Firmware-A))
|
$(eval $(call BuildPackage/Trusted-Firmware-A))
|
||||||
|
@ -0,0 +1,32 @@
|
|||||||
|
From daaac60b504e6d5e77156ad0dc3dceca8b786e2d Mon Sep 17 00:00:00 2001
|
||||||
|
From: Daniel Golle <daniel@makrotopia.org>
|
||||||
|
Date: Sat, 27 Aug 2022 03:41:57 +0100
|
||||||
|
Subject: [PATCH] spi-nor: add more Winbond device IDs
|
||||||
|
|
||||||
|
Add device IDs for Winbond W25Q256 and W25Q512 variants.
|
||||||
|
|
||||||
|
Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
||||||
|
---
|
||||||
|
drivers/mtd/nor/spi_nor.c | 11 +++++++++--
|
||||||
|
1 file changed, 9 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
--- a/drivers/mtd/nor/spi_nor.c
|
||||||
|
+++ b/drivers/mtd/nor/spi_nor.c
|
||||||
|
@@ -327,8 +327,15 @@ int spi_nor_read(unsigned int offset, ui
|
||||||
|
|
||||||
|
struct nor_device_info nor_flash_info_table[] = {
|
||||||
|
{"MX25L51245G", {0xC2, 0x20, 0x1A}, 0x4000000, 0},
|
||||||
|
- {"W25Q256JW",{0xEF,0x80, 0x19}, 0x2000000, 0},
|
||||||
|
- {"MX25U25635",{0xC2, 0x25, 0x39}, 0x2000000, 0}
|
||||||
|
+ {"W25Q256JV-IM", {0xEF, 0x70, 0x19}, 0x2000000, 0},
|
||||||
|
+ {"W25Q256JV-IQ", {0xEF, 0x40, 0x19}, 0x2000000, 0},
|
||||||
|
+ {"W25Q256JW", {0xEF, 0x60, 0x19}, 0x2000000, 0},
|
||||||
|
+ {"W25Q256JW-IM", {0xEF, 0x80, 0x19}, 0x2000000, 0},
|
||||||
|
+ {"W25Q512JV-IM", {0xEF, 0x70, 0x20}, 0x4000000, 0},
|
||||||
|
+ {"W25Q512JV-IQ", {0xEF, 0x40, 0x20}, 0x4000000, 0},
|
||||||
|
+ {"W25Q512NW-IM", {0xEF, 0x80, 0x20}, 0x4000000, 0},
|
||||||
|
+ {"W25Q512NW-IQ/IN", {0xEF, 0x60, 0x20}, 0x4000000, 0},
|
||||||
|
+ {"MX25U25635", {0xC2, 0x25, 0x39}, 0x2000000, 0}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
@ -0,0 +1,40 @@
|
|||||||
|
From 2a012775b3ab6e72091c8be1c2d4bf5972407eb5 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Daniel Golle <daniel@makrotopia.org>
|
||||||
|
Date: Sat, 27 Aug 2022 21:38:33 +0100
|
||||||
|
Subject: [PATCH] mediatek: mt7622: initialize watchdog after DDR init
|
||||||
|
|
||||||
|
Initializing the WDT before memory calibration breaks reboot at least
|
||||||
|
on some MT7622 boards like the Bananapi BPi-R64:
|
||||||
|
NOTICE: BL2: v2.7(release):OpenWrt v2022-08-18-9c9c4994-2 (mt7622-emmc-2ddr)
|
||||||
|
NOTICE: BL2: Built : 04:00:25, Aug 27 2022
|
||||||
|
ERROR: Cannot find any pass-window
|
||||||
|
ERROR: no DATLAT taps pass, DATLAT calibration fail!
|
||||||
|
ERROR: DATLAT calibration fail, write back to 20!
|
||||||
|
ERROR: EMI: complex R/W mem test failed: -2
|
||||||
|
|
||||||
|
Move watchdog initialization to happen only after memory initialization
|
||||||
|
has completed to avoid the problem.
|
||||||
|
|
||||||
|
Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
||||||
|
---
|
||||||
|
plat/mediatek/mt7622/bl2_plat_setup.c | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
--- a/plat/mediatek/mt7622/bl2_plat_setup.c
|
||||||
|
+++ b/plat/mediatek/mt7622/bl2_plat_setup.c
|
||||||
|
@@ -277,7 +277,6 @@ void bl2_platform_setup(void)
|
||||||
|
plat_mt_cpuxgpt_init();
|
||||||
|
generic_delay_timer_init();
|
||||||
|
|
||||||
|
- mtk_wdt_init();
|
||||||
|
mtk_pin_init();
|
||||||
|
#ifndef USING_BL2PL
|
||||||
|
mtk_pll_init();
|
||||||
|
@@ -285,6 +284,7 @@ void bl2_platform_setup(void)
|
||||||
|
mtk_pwrap_init();
|
||||||
|
mtk_pmic_init();
|
||||||
|
mtk_mem_init();
|
||||||
|
+ mtk_wdt_init();
|
||||||
|
|
||||||
|
mtk_io_setup();
|
||||||
|
}
|
@ -1,11 +0,0 @@
|
|||||||
--- a/plat/mediatek/mt7622/bl2_boot_nor.c
|
|
||||||
+++ b/plat/mediatek/mt7622/bl2_boot_nor.c
|
|
||||||
@@ -12,7 +12,7 @@
|
|
||||||
#define MT7622_NOR_MAP_BASE 0x30000000
|
|
||||||
|
|
||||||
#define FIP_BASE 0x20000
|
|
||||||
-#define FIP_SIZE 0x80000
|
|
||||||
+#define FIP_SIZE 0xa0000
|
|
||||||
|
|
||||||
const io_block_spec_t mtk_boot_dev_fip_spec = {
|
|
||||||
.offset = MT7622_NOR_MAP_BASE + FIP_BASE,
|
|
@ -1,40 +0,0 @@
|
|||||||
--- a/plat/mediatek/mt7622/bl2_boot_snand.c
|
|
||||||
+++ b/plat/mediatek/mt7622/bl2_boot_snand.c
|
|
||||||
@@ -21,6 +21,10 @@
|
|
||||||
#define FIP_BASE 0x80000
|
|
||||||
#define FIP_SIZE 0x200000
|
|
||||||
|
|
||||||
+#ifndef NMBM
|
|
||||||
+#define SNAND_MAX_BAD_BLOCK 3
|
|
||||||
+#endif
|
|
||||||
+
|
|
||||||
struct snfi_gpio_mux_info {
|
|
||||||
const uint32_t *pins;
|
|
||||||
uint32_t count;
|
|
||||||
@@ -45,12 +49,26 @@ static size_t snand_read_range(int lba,
|
|
||||||
size_t sizeremain = size, chunksize;
|
|
||||||
uint64_t off = lba * cinfo.pagesize;
|
|
||||||
uint8_t *ptr = (uint8_t *)buf;
|
|
||||||
+ struct mtk_snand_chip_info info;
|
|
||||||
+ unsigned int bad_blocks = 0;
|
|
||||||
int ret = 0;
|
|
||||||
|
|
||||||
if (!snf)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
+ ret = mtk_snand_get_chip_info(snf, &info);
|
|
||||||
+ if (ret)
|
|
||||||
+ return 0;
|
|
||||||
+
|
|
||||||
while (sizeremain) {
|
|
||||||
+ while (mtk_snand_block_isbad(snf, off)) {
|
|
||||||
+ if (bad_blocks > SNAND_MAX_BAD_BLOCK)
|
|
||||||
+ return size - sizeremain;
|
|
||||||
+
|
|
||||||
+ off += info.blocksize;
|
|
||||||
+ ++bad_blocks;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
chunksize = cinfo.pagesize;
|
|
||||||
if (chunksize > sizeremain)
|
|
||||||
chunksize = sizeremain;
|
|
@ -13,6 +13,7 @@ PKG_HASH:=bf3eb3617a74cddd7fb0e0eacbfe38c3258ee07d4c8ed730deef7a175cc3d55b
|
|||||||
|
|
||||||
PKG_MAINTAINER:=Vladimir Vid <vladimir.vid@sartura.hr>
|
PKG_MAINTAINER:=Vladimir Vid <vladimir.vid@sartura.hr>
|
||||||
|
|
||||||
|
include $(INCLUDE_DIR)/kernel.mk
|
||||||
include $(INCLUDE_DIR)/trusted-firmware-a.mk
|
include $(INCLUDE_DIR)/trusted-firmware-a.mk
|
||||||
include $(INCLUDE_DIR)/package.mk
|
include $(INCLUDE_DIR)/package.mk
|
||||||
|
|
||||||
|
@ -21,6 +21,7 @@ PKG_LICENSE_FILES:=license.md
|
|||||||
|
|
||||||
PKG_MAINTAINER:=Hauke Mehrtens <hauke@hauke-m.de>
|
PKG_MAINTAINER:=Hauke Mehrtens <hauke@hauke-m.de>
|
||||||
|
|
||||||
|
include $(INCLUDE_DIR)/kernel.mk
|
||||||
include $(INCLUDE_DIR)/trusted-firmware-a.mk
|
include $(INCLUDE_DIR)/trusted-firmware-a.mk
|
||||||
include $(INCLUDE_DIR)/package.mk
|
include $(INCLUDE_DIR)/package.mk
|
||||||
|
|
||||||
|
@ -74,6 +74,7 @@ define U-Boot/mt7622_ubnt_unifi-6-lr
|
|||||||
BL2_BOOTDEV:=nor
|
BL2_BOOTDEV:=nor
|
||||||
BL2_DDRBLOB:=2
|
BL2_DDRBLOB:=2
|
||||||
DEPENDS:=+trusted-firmware-a-mt7622-nor-2ddr
|
DEPENDS:=+trusted-firmware-a-mt7622-nor-2ddr
|
||||||
|
FIP_COMPRESS:=1
|
||||||
endef
|
endef
|
||||||
|
|
||||||
define U-Boot/mt7623a_unielec_u7623
|
define U-Boot/mt7623a_unielec_u7623
|
||||||
@ -114,9 +115,13 @@ UBOOT_MAKE_FLAGS += $(UBOOT_IMAGE:.fip=.bin)
|
|||||||
Build/Exports:=$(Host/Exports)
|
Build/Exports:=$(Host/Exports)
|
||||||
|
|
||||||
define Build/fip-image
|
define Build/fip-image
|
||||||
|
$(if $(FIP_COMPRESS),\
|
||||||
|
xz -f -e -k -9 -C crc32 $(STAGING_DIR_IMAGE)/$(BUILD_SUBTARGET)-$(BL2_BOOTDEV)-$(BL2_DDRBLOB)ddr-bl31.bin ;\
|
||||||
|
xz -f -e -k -9 -C crc32 $(PKG_BUILD_DIR)/u-boot.bin \
|
||||||
|
)
|
||||||
$(STAGING_DIR_HOST)/bin/fiptool create \
|
$(STAGING_DIR_HOST)/bin/fiptool create \
|
||||||
--soc-fw $(STAGING_DIR_IMAGE)/$(BUILD_SUBTARGET)-$(BL2_BOOTDEV)-$(BL2_DDRBLOB)ddr-bl31.bin \
|
--soc-fw $(STAGING_DIR_IMAGE)/$(BUILD_SUBTARGET)-$(BL2_BOOTDEV)-$(BL2_DDRBLOB)ddr-bl31.bin$(if $(FIP_COMPRESS),.xz) \
|
||||||
--nt-fw $(PKG_BUILD_DIR)/u-boot.bin \
|
--nt-fw $(PKG_BUILD_DIR)/u-boot.bin$(if $(FIP_COMPRESS),.xz) \
|
||||||
$(PKG_BUILD_DIR)/u-boot.fip
|
$(PKG_BUILD_DIR)/u-boot.fip
|
||||||
endef
|
endef
|
||||||
|
|
||||||
|
@ -393,8 +393,9 @@ $(eval $(call KernelPackage,crypto-hw-padlock))
|
|||||||
|
|
||||||
define KernelPackage/crypto-hw-safexcel
|
define KernelPackage/crypto-hw-safexcel
|
||||||
TITLE:= MVEBU SafeXcel Crypto Engine module
|
TITLE:= MVEBU SafeXcel Crypto Engine module
|
||||||
DEPENDS:=@(TARGET_mvebu_cortexa53||TARGET_mvebu_cortexa72) +eip197-mini-firmware \
|
DEPENDS:=@(TARGET_mvebu_cortexa53||TARGET_mvebu_cortexa72||TARGET_mediatek_filogic||TARGET_mediatek_mt7623) \
|
||||||
+kmod-crypto-authenc +kmod-crypto-md5 +kmod-crypto-hmac +kmod-crypto-sha256 +kmod-crypto-sha512
|
+eip197-mini-firmware +kmod-crypto-authenc +kmod-crypto-des +kmod-crypto-md5 +kmod-crypto-hmac \
|
||||||
|
+kmod-crypto-sha1 +kmod-crypto-sha256 +kmod-crypto-sha512
|
||||||
KCONFIG:= \
|
KCONFIG:= \
|
||||||
CONFIG_CRYPTO_HW=y \
|
CONFIG_CRYPTO_HW=y \
|
||||||
CONFIG_CRYPTO_DEV_SAFEXCEL
|
CONFIG_CRYPTO_DEV_SAFEXCEL
|
||||||
|
@ -226,6 +226,12 @@ define KernelPackage/mt7915e
|
|||||||
AUTOLOAD:=$(call AutoProbe,mt7915e)
|
AUTOLOAD:=$(call AutoProbe,mt7915e)
|
||||||
endef
|
endef
|
||||||
|
|
||||||
|
define KernelPackage/mt7986-firmware
|
||||||
|
$(KernelPackage/mt76-default)
|
||||||
|
DEPENDS:=@TARGET_mediatek_filogic
|
||||||
|
TITLE:=MediaTek MT7986 firmware
|
||||||
|
endef
|
||||||
|
|
||||||
define KernelPackage/mt7921-common
|
define KernelPackage/mt7921-common
|
||||||
$(KernelPackage/mt76-default)
|
$(KernelPackage/mt76-default)
|
||||||
TITLE:=MediaTek MT7615 wireless driver common code
|
TITLE:=MediaTek MT7615 wireless driver common code
|
||||||
@ -343,6 +349,10 @@ ifdef CONFIG_PACKAGE_kmod-mt7663u
|
|||||||
endif
|
endif
|
||||||
ifdef CONFIG_PACKAGE_kmod-mt7915e
|
ifdef CONFIG_PACKAGE_kmod-mt7915e
|
||||||
PKG_MAKE_FLAGS += CONFIG_MT7915E=m
|
PKG_MAKE_FLAGS += CONFIG_MT7915E=m
|
||||||
|
ifdef CONFIG_TARGET_mediatek_filogic
|
||||||
|
PKG_MAKE_FLAGS += CONFIG_MT7986_WMAC=y
|
||||||
|
NOSTDINC_FLAGS += -DCONFIG_MT7986_WMAC
|
||||||
|
endif
|
||||||
endif
|
endif
|
||||||
ifdef CONFIG_PACKAGE_kmod-mt7921-common
|
ifdef CONFIG_PACKAGE_kmod-mt7921-common
|
||||||
PKG_MAKE_FLAGS += CONFIG_MT7921_COMMON=m
|
PKG_MAKE_FLAGS += CONFIG_MT7921_COMMON=m
|
||||||
@ -450,6 +460,19 @@ define KernelPackage/mt7915e/install
|
|||||||
$(1)/lib/firmware/mediatek
|
$(1)/lib/firmware/mediatek
|
||||||
endef
|
endef
|
||||||
|
|
||||||
|
define KernelPackage/mt7986-firmware/install
|
||||||
|
$(INSTALL_DIR) $(1)/lib/firmware/mediatek
|
||||||
|
cp \
|
||||||
|
$(PKG_BUILD_DIR)/firmware/mt7986_wa.bin \
|
||||||
|
$(PKG_BUILD_DIR)/firmware/mt7986_wm_mt7975.bin \
|
||||||
|
$(PKG_BUILD_DIR)/firmware/mt7986_wm.bin \
|
||||||
|
$(PKG_BUILD_DIR)/firmware/mt7986_rom_patch_mt7975.bin \
|
||||||
|
$(PKG_BUILD_DIR)/firmware/mt7986_rom_patch.bin \
|
||||||
|
$(PKG_BUILD_DIR)/firmware/mt7986_eeprom_mt7975_dual.bin \
|
||||||
|
$(PKG_BUILD_DIR)/firmware/mt7986_eeprom_mt7976_dual.bin \
|
||||||
|
$(1)/lib/firmware/mediatek
|
||||||
|
endef
|
||||||
|
|
||||||
define KernelPackage/mt7921e/install
|
define KernelPackage/mt7921e/install
|
||||||
$(INSTALL_DIR) $(1)/lib/firmware/mediatek
|
$(INSTALL_DIR) $(1)/lib/firmware/mediatek
|
||||||
cp \
|
cp \
|
||||||
@ -487,6 +510,7 @@ $(eval $(call KernelPackage,mt7663-usb-sdio))
|
|||||||
$(eval $(call KernelPackage,mt7663u))
|
$(eval $(call KernelPackage,mt7663u))
|
||||||
$(eval $(call KernelPackage,mt7663s))
|
$(eval $(call KernelPackage,mt7663s))
|
||||||
$(eval $(call KernelPackage,mt7915e))
|
$(eval $(call KernelPackage,mt7915e))
|
||||||
|
$(eval $(call KernelPackage,mt7986-firmware))
|
||||||
$(eval $(call KernelPackage,mt7921-common))
|
$(eval $(call KernelPackage,mt7921-common))
|
||||||
$(eval $(call KernelPackage,mt7921u))
|
$(eval $(call KernelPackage,mt7921u))
|
||||||
$(eval $(call KernelPackage,mt7921s))
|
$(eval $(call KernelPackage,mt7921s))
|
||||||
|
@ -25,6 +25,7 @@ PKG_MAINTAINER:=Eneas U de Queiroz <cotequeiroz@gmail.com>
|
|||||||
PKG_CPE_ID:=cpe:/a:wolfssl:wolfssl
|
PKG_CPE_ID:=cpe:/a:wolfssl:wolfssl
|
||||||
|
|
||||||
PKG_CONFIG_DEPENDS:=\
|
PKG_CONFIG_DEPENDS:=\
|
||||||
|
CONFIG_PACKAGE_libwolfssl-benchmark \
|
||||||
CONFIG_WOLFSSL_HAS_AES_CCM \
|
CONFIG_WOLFSSL_HAS_AES_CCM \
|
||||||
CONFIG_WOLFSSL_HAS_ARC4 \
|
CONFIG_WOLFSSL_HAS_ARC4 \
|
||||||
CONFIG_WOLFSSL_HAS_CERTGEN \
|
CONFIG_WOLFSSL_HAS_CERTGEN \
|
||||||
|
@ -5,7 +5,7 @@ include $(TOPDIR)/rules.mk
|
|||||||
ARCH:=arm
|
ARCH:=arm
|
||||||
BOARD:=mediatek
|
BOARD:=mediatek
|
||||||
BOARDNAME:=MediaTek Ralink ARM
|
BOARDNAME:=MediaTek Ralink ARM
|
||||||
SUBTARGETS:=mt7622 mt7623 mt7629
|
SUBTARGETS:=mt7622 mt7623 mt7629 filogic
|
||||||
FEATURES:=dt-overlay emmc fpu gpio nand pci pcie rootfs-part separate_ramdisk squashfs usb
|
FEATURES:=dt-overlay emmc fpu gpio nand pci pcie rootfs-part separate_ramdisk squashfs usb
|
||||||
|
|
||||||
KERNEL_PATCHVER:=5.10
|
KERNEL_PATCHVER:=5.10
|
||||||
|
@ -0,0 +1,51 @@
|
|||||||
|
/* SPDX-License-Identifier: (GPL-2.0-only OR MIT) */
|
||||||
|
|
||||||
|
/dts-v1/;
|
||||||
|
/plugin/;
|
||||||
|
|
||||||
|
/ {
|
||||||
|
compatible = "mediatek,mt7986a-spim-snand-rfb";
|
||||||
|
|
||||||
|
fragment@0 {
|
||||||
|
target-path = "/soc/spi@1100a000";
|
||||||
|
__overlay__ {
|
||||||
|
status = "okay";
|
||||||
|
spi_nand: spi_nand@0 {
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <1>;
|
||||||
|
compatible = "spi-nand";
|
||||||
|
reg = <1>;
|
||||||
|
spi-max-frequency = <10000000>;
|
||||||
|
spi-tx-buswidth = <4>;
|
||||||
|
spi-rx-buswidth = <4>;
|
||||||
|
|
||||||
|
partitions {
|
||||||
|
compatible = "fixed-partitions";
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <1>;
|
||||||
|
partition@0 {
|
||||||
|
label = "BL2";
|
||||||
|
reg = <0x00000 0x0100000>;
|
||||||
|
read-only;
|
||||||
|
};
|
||||||
|
partition@100000 {
|
||||||
|
label = "u-boot-env";
|
||||||
|
reg = <0x0100000 0x0080000>;
|
||||||
|
};
|
||||||
|
factory: partition@180000 {
|
||||||
|
label = "Factory";
|
||||||
|
reg = <0x180000 0x0200000>;
|
||||||
|
};
|
||||||
|
partition@380000 {
|
||||||
|
label = "FIP";
|
||||||
|
reg = <0x380000 0x0200000>;
|
||||||
|
};
|
||||||
|
partition@580000 {
|
||||||
|
label = "ubi";
|
||||||
|
reg = <0x580000 0x4000000>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
@ -0,0 +1,50 @@
|
|||||||
|
/* SPDX-License-Identifier: (GPL-2.0-only OR MIT) */
|
||||||
|
|
||||||
|
/dts-v1/;
|
||||||
|
/plugin/;
|
||||||
|
|
||||||
|
/ {
|
||||||
|
compatible = "mediatek,mt7986a-snor-rfb";
|
||||||
|
|
||||||
|
fragment@0 {
|
||||||
|
target-path = "/soc/spi@1100a000";
|
||||||
|
__overlay__ {
|
||||||
|
status = "okay";
|
||||||
|
spi_nor: spi_nor@0 {
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <1>;
|
||||||
|
compatible = "jedec,spi-nor";
|
||||||
|
reg = <0>;
|
||||||
|
spi-max-frequency = <52000000>;
|
||||||
|
spi-tx-buswidth = <4>;
|
||||||
|
spi-rx-buswidth = <4>;
|
||||||
|
partitions {
|
||||||
|
compatible = "fixed-partitions";
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <1>;
|
||||||
|
|
||||||
|
partition@00000 {
|
||||||
|
label = "BL2";
|
||||||
|
reg = <0x00000 0x0040000>;
|
||||||
|
};
|
||||||
|
partition@40000 {
|
||||||
|
label = "u-boot-env";
|
||||||
|
reg = <0x40000 0x0010000>;
|
||||||
|
};
|
||||||
|
factory: partition@50000 {
|
||||||
|
label = "Factory";
|
||||||
|
reg = <0x50000 0x00B0000>;
|
||||||
|
};
|
||||||
|
partition@100000 {
|
||||||
|
label = "FIP";
|
||||||
|
reg = <0x100000 0x0080000>;
|
||||||
|
};
|
||||||
|
partition@180000 {
|
||||||
|
label = "firmware";
|
||||||
|
reg = <0x180000 0xE00000>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
@ -0,0 +1,378 @@
|
|||||||
|
// SPDX-License-Identifier: (GPL-2.0 OR MIT)
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2021 MediaTek Inc.
|
||||||
|
* Author: Sam.Shih <sam.shih@mediatek.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
/dts-v1/;
|
||||||
|
#include "mt7986a.dtsi"
|
||||||
|
|
||||||
|
/ {
|
||||||
|
model = "MediaTek MT7986a RFB";
|
||||||
|
compatible = "mediatek,mt7986a-rfb";
|
||||||
|
|
||||||
|
aliases {
|
||||||
|
serial0 = &uart0;
|
||||||
|
};
|
||||||
|
|
||||||
|
chosen {
|
||||||
|
stdout-path = "serial0:115200n8";
|
||||||
|
};
|
||||||
|
|
||||||
|
memory {
|
||||||
|
reg = <0 0x40000000 0 0x40000000>;
|
||||||
|
};
|
||||||
|
|
||||||
|
reg_1p8v: regulator-1p8v {
|
||||||
|
compatible = "regulator-fixed";
|
||||||
|
regulator-name = "fixed-1.8V";
|
||||||
|
regulator-min-microvolt = <1800000>;
|
||||||
|
regulator-max-microvolt = <1800000>;
|
||||||
|
regulator-boot-on;
|
||||||
|
regulator-always-on;
|
||||||
|
};
|
||||||
|
|
||||||
|
reg_3p3v: regulator-3p3v {
|
||||||
|
compatible = "regulator-fixed";
|
||||||
|
regulator-name = "fixed-3.3V";
|
||||||
|
regulator-min-microvolt = <3300000>;
|
||||||
|
regulator-max-microvolt = <3300000>;
|
||||||
|
regulator-boot-on;
|
||||||
|
regulator-always-on;
|
||||||
|
};
|
||||||
|
|
||||||
|
reg_5v: regulator-5v {
|
||||||
|
compatible = "regulator-fixed";
|
||||||
|
regulator-name = "fixed-5V";
|
||||||
|
regulator-min-microvolt = <5000000>;
|
||||||
|
regulator-max-microvolt = <5000000>;
|
||||||
|
regulator-boot-on;
|
||||||
|
regulator-always-on;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
ð {
|
||||||
|
status = "okay";
|
||||||
|
|
||||||
|
gmac0: mac@0 {
|
||||||
|
compatible = "mediatek,eth-mac";
|
||||||
|
reg = <0>;
|
||||||
|
phy-mode = "2500base-x";
|
||||||
|
|
||||||
|
fixed-link {
|
||||||
|
speed = <2500>;
|
||||||
|
full-duplex;
|
||||||
|
pause;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
gmac1: mac@1 {
|
||||||
|
compatible = "mediatek,eth-mac";
|
||||||
|
reg = <1>;
|
||||||
|
phy-mode = "2500base-x";
|
||||||
|
|
||||||
|
fixed-link {
|
||||||
|
speed = <2500>;
|
||||||
|
full-duplex;
|
||||||
|
pause;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
mdio: mdio-bus {
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
&wmac {
|
||||||
|
status = "okay";
|
||||||
|
pinctrl-names = "default", "dbdc";
|
||||||
|
pinctrl-0 = <&wf_2g_5g_pins>;
|
||||||
|
pinctrl-1 = <&wf_dbdc_pins>;
|
||||||
|
};
|
||||||
|
|
||||||
|
&mdio {
|
||||||
|
phy5: phy@5 {
|
||||||
|
compatible = "ethernet-phy-id67c9.de0a";
|
||||||
|
reg = <5>;
|
||||||
|
reset-gpios = <&pio 6 1>;
|
||||||
|
reset-deassert-us = <20000>;
|
||||||
|
phy-mode = "2500base-x";
|
||||||
|
};
|
||||||
|
|
||||||
|
phy6: phy@6 {
|
||||||
|
compatible = "ethernet-phy-id67c9.de0a";
|
||||||
|
reg = <6>;
|
||||||
|
phy-mode = "2500base-x";
|
||||||
|
};
|
||||||
|
|
||||||
|
switch: switch@0 {
|
||||||
|
compatible = "mediatek,mt7531";
|
||||||
|
reg = <31>;
|
||||||
|
reset-gpios = <&pio 5 0>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
&crypto {
|
||||||
|
status = "okay";
|
||||||
|
};
|
||||||
|
|
||||||
|
&mmc0 {
|
||||||
|
pinctrl-names = "default", "state_uhs";
|
||||||
|
pinctrl-0 = <&mmc0_pins_default>;
|
||||||
|
pinctrl-1 = <&mmc0_pins_uhs>;
|
||||||
|
bus-width = <8>;
|
||||||
|
max-frequency = <200000000>;
|
||||||
|
cap-mmc-highspeed;
|
||||||
|
mmc-hs200-1_8v;
|
||||||
|
mmc-hs400-1_8v;
|
||||||
|
hs400-ds-delay = <0x14014>;
|
||||||
|
vmmc-supply = <®_3p3v>;
|
||||||
|
vqmmc-supply = <®_1p8v>;
|
||||||
|
non-removable;
|
||||||
|
no-sd;
|
||||||
|
no-sdio;
|
||||||
|
status = "okay";
|
||||||
|
};
|
||||||
|
|
||||||
|
&pcie {
|
||||||
|
pinctrl-names = "default";
|
||||||
|
pinctrl-0 = <&pcie_pins>;
|
||||||
|
status = "okay";
|
||||||
|
};
|
||||||
|
|
||||||
|
&pcie_phy {
|
||||||
|
status = "okay";
|
||||||
|
};
|
||||||
|
|
||||||
|
&pio {
|
||||||
|
mmc0_pins_default: mmc0-pins {
|
||||||
|
mux {
|
||||||
|
function = "emmc";
|
||||||
|
groups = "emmc_51";
|
||||||
|
};
|
||||||
|
conf-cmd-dat {
|
||||||
|
pins = "EMMC_DATA_0", "EMMC_DATA_1", "EMMC_DATA_2",
|
||||||
|
"EMMC_DATA_3", "EMMC_DATA_4", "EMMC_DATA_5",
|
||||||
|
"EMMC_DATA_6", "EMMC_DATA_7", "EMMC_CMD";
|
||||||
|
input-enable;
|
||||||
|
drive-strength = <4>;
|
||||||
|
mediatek,pull-up-adv = <1>; /* pull-up 10K */
|
||||||
|
};
|
||||||
|
conf-clk {
|
||||||
|
pins = "EMMC_CK";
|
||||||
|
drive-strength = <6>;
|
||||||
|
mediatek,pull-down-adv = <2>; /* pull-down 50K */
|
||||||
|
};
|
||||||
|
conf-ds {
|
||||||
|
pins = "EMMC_DSL";
|
||||||
|
mediatek,pull-down-adv = <2>; /* pull-down 50K */
|
||||||
|
};
|
||||||
|
conf-rst {
|
||||||
|
pins = "EMMC_RSTB";
|
||||||
|
drive-strength = <4>;
|
||||||
|
mediatek,pull-up-adv = <1>; /* pull-up 10K */
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
mmc0_pins_uhs: mmc0-uhs-pins {
|
||||||
|
mux {
|
||||||
|
function = "emmc";
|
||||||
|
groups = "emmc_51";
|
||||||
|
};
|
||||||
|
conf-cmd-dat {
|
||||||
|
pins = "EMMC_DATA_0", "EMMC_DATA_1", "EMMC_DATA_2",
|
||||||
|
"EMMC_DATA_3", "EMMC_DATA_4", "EMMC_DATA_5",
|
||||||
|
"EMMC_DATA_6", "EMMC_DATA_7", "EMMC_CMD";
|
||||||
|
input-enable;
|
||||||
|
drive-strength = <4>;
|
||||||
|
mediatek,pull-up-adv = <1>; /* pull-up 10K */
|
||||||
|
};
|
||||||
|
conf-clk {
|
||||||
|
pins = "EMMC_CK";
|
||||||
|
drive-strength = <6>;
|
||||||
|
mediatek,pull-down-adv = <2>; /* pull-down 50K */
|
||||||
|
};
|
||||||
|
conf-ds {
|
||||||
|
pins = "EMMC_DSL";
|
||||||
|
mediatek,pull-down-adv = <2>; /* pull-down 50K */
|
||||||
|
};
|
||||||
|
conf-rst {
|
||||||
|
pins = "EMMC_RSTB";
|
||||||
|
drive-strength = <4>;
|
||||||
|
mediatek,pull-up-adv = <1>; /* pull-up 10K */
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
pcie_pins: pcie-pins {
|
||||||
|
mux {
|
||||||
|
function = "pcie";
|
||||||
|
groups = "pcie_clk", "pcie_wake", "pcie_pereset";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
spic_pins_g2: spic-pins-29-to-32 {
|
||||||
|
mux {
|
||||||
|
function = "spi";
|
||||||
|
groups = "spi1_2";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
spi_flash_pins: spi-flash-pins-33-to-38 {
|
||||||
|
mux {
|
||||||
|
function = "spi";
|
||||||
|
groups = "spi0", "spi0_wp_hold";
|
||||||
|
};
|
||||||
|
conf-pu {
|
||||||
|
pins = "SPI2_CS", "SPI2_HOLD", "SPI2_WP";
|
||||||
|
drive-strength = <8>;
|
||||||
|
mediatek,pull-up-adv = <0>; /* bias-disable */
|
||||||
|
};
|
||||||
|
conf-pd {
|
||||||
|
pins = "SPI2_CLK", "SPI2_MOSI", "SPI2_MISO";
|
||||||
|
drive-strength = <8>;
|
||||||
|
mediatek,pull-down-adv = <0>; /* bias-disable */
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
uart1_pins: uart1-pins {
|
||||||
|
mux {
|
||||||
|
function = "uart";
|
||||||
|
groups = "uart1";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
uart2_pins: uart2-pins {
|
||||||
|
mux {
|
||||||
|
function = "uart";
|
||||||
|
groups = "uart2";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
wf_2g_5g_pins: wf_2g_5g-pins {
|
||||||
|
mux {
|
||||||
|
function = "wifi";
|
||||||
|
groups = "wf_2g", "wf_5g";
|
||||||
|
};
|
||||||
|
conf {
|
||||||
|
pins = "WF0_HB1", "WF0_HB2", "WF0_HB3", "WF0_HB4",
|
||||||
|
"WF0_HB0", "WF0_HB0_B", "WF0_HB5", "WF0_HB6",
|
||||||
|
"WF0_HB7", "WF0_HB8", "WF0_HB9", "WF0_HB10",
|
||||||
|
"WF0_TOP_CLK", "WF0_TOP_DATA", "WF1_HB1",
|
||||||
|
"WF1_HB2", "WF1_HB3", "WF1_HB4", "WF1_HB0",
|
||||||
|
"WF1_HB5", "WF1_HB6", "WF1_HB7", "WF1_HB8",
|
||||||
|
"WF1_TOP_CLK", "WF1_TOP_DATA";
|
||||||
|
drive-strength = <4>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
wf_dbdc_pins: wf_dbdc-pins {
|
||||||
|
mux {
|
||||||
|
function = "wifi";
|
||||||
|
groups = "wf_dbdc";
|
||||||
|
};
|
||||||
|
conf {
|
||||||
|
pins = "WF0_HB1", "WF0_HB2", "WF0_HB3", "WF0_HB4",
|
||||||
|
"WF0_HB0", "WF0_HB0_B", "WF0_HB5", "WF0_HB6",
|
||||||
|
"WF0_HB7", "WF0_HB8", "WF0_HB9", "WF0_HB10",
|
||||||
|
"WF0_TOP_CLK", "WF0_TOP_DATA", "WF1_HB1",
|
||||||
|
"WF1_HB2", "WF1_HB3", "WF1_HB4", "WF1_HB0",
|
||||||
|
"WF1_HB5", "WF1_HB6", "WF1_HB7", "WF1_HB8",
|
||||||
|
"WF1_TOP_CLK", "WF1_TOP_DATA";
|
||||||
|
drive-strength = <4>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
&spi0 {
|
||||||
|
pinctrl-names = "default";
|
||||||
|
pinctrl-0 = <&spi_flash_pins>;
|
||||||
|
cs-gpios = <0>, <0>;
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
|
&spi1 {
|
||||||
|
pinctrl-names = "default";
|
||||||
|
pinctrl-0 = <&spic_pins_g2>;
|
||||||
|
status = "okay";
|
||||||
|
|
||||||
|
proslic_spi: proslic_spi@0 {
|
||||||
|
compatible = "silabs,proslic_spi";
|
||||||
|
reg = <0>;
|
||||||
|
spi-max-frequency = <10000000>;
|
||||||
|
spi-cpha = <1>;
|
||||||
|
spi-cpol = <1>;
|
||||||
|
channel_count = <1>;
|
||||||
|
debug_level = <4>; /* 1 = TRC, 2 = DBG, 4 = ERR */
|
||||||
|
reset_gpio = <&pio 7 0>;
|
||||||
|
ig,enable-spi = <1>; /* 1: Enable, 0: Disable */
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
&switch {
|
||||||
|
ports {
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
|
||||||
|
port@0 {
|
||||||
|
reg = <0>;
|
||||||
|
label = "lan0";
|
||||||
|
};
|
||||||
|
|
||||||
|
port@1 {
|
||||||
|
reg = <1>;
|
||||||
|
label = "lan1";
|
||||||
|
};
|
||||||
|
|
||||||
|
port@2 {
|
||||||
|
reg = <2>;
|
||||||
|
label = "lan2";
|
||||||
|
};
|
||||||
|
|
||||||
|
port@3 {
|
||||||
|
reg = <3>;
|
||||||
|
label = "lan3";
|
||||||
|
};
|
||||||
|
|
||||||
|
port@6 {
|
||||||
|
reg = <6>;
|
||||||
|
label = "cpu";
|
||||||
|
ethernet = <&gmac0>;
|
||||||
|
phy-mode = "2500base-x";
|
||||||
|
|
||||||
|
fixed-link {
|
||||||
|
speed = <2500>;
|
||||||
|
full-duplex;
|
||||||
|
pause;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
&ssusb {
|
||||||
|
vusb33-supply = <®_3p3v>;
|
||||||
|
vbus-supply = <®_5v>;
|
||||||
|
status = "okay";
|
||||||
|
};
|
||||||
|
|
||||||
|
&uart0 {
|
||||||
|
status = "okay";
|
||||||
|
};
|
||||||
|
|
||||||
|
&uart1 {
|
||||||
|
pinctrl-names = "default";
|
||||||
|
pinctrl-0 = <&uart1_pins>;
|
||||||
|
status = "okay";
|
||||||
|
};
|
||||||
|
|
||||||
|
&uart2 {
|
||||||
|
pinctrl-names = "default";
|
||||||
|
pinctrl-0 = <&uart2_pins>;
|
||||||
|
status = "okay";
|
||||||
|
};
|
||||||
|
|
||||||
|
&usb_phy {
|
||||||
|
status = "okay";
|
||||||
|
};
|
@ -0,0 +1,465 @@
|
|||||||
|
// SPDX-License-Identifier: (GPL-2.0 OR MIT)
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2021 MediaTek Inc.
|
||||||
|
* Author: Sam.Shih <sam.shih@mediatek.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <dt-bindings/clock/mt7986-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/reset/mt7986-resets.h>
|
||||||
|
|
||||||
|
/ {
|
||||||
|
interrupt-parent = <&gic>;
|
||||||
|
#address-cells = <2>;
|
||||||
|
#size-cells = <2>;
|
||||||
|
|
||||||
|
clk40m: oscillator@0 {
|
||||||
|
compatible = "fixed-clock";
|
||||||
|
clock-frequency = <40000000>;
|
||||||
|
#clock-cells = <0>;
|
||||||
|
clock-output-names = "clkxtal";
|
||||||
|
};
|
||||||
|
|
||||||
|
cpus {
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
cpu0: cpu@0 {
|
||||||
|
device_type = "cpu";
|
||||||
|
compatible = "arm,cortex-a53";
|
||||||
|
enable-method = "psci";
|
||||||
|
reg = <0x0>;
|
||||||
|
#cooling-cells = <2>;
|
||||||
|
};
|
||||||
|
|
||||||
|
cpu1: cpu@1 {
|
||||||
|
device_type = "cpu";
|
||||||
|
compatible = "arm,cortex-a53";
|
||||||
|
enable-method = "psci";
|
||||||
|
reg = <0x1>;
|
||||||
|
#cooling-cells = <2>;
|
||||||
|
};
|
||||||
|
|
||||||
|
cpu2: cpu@2 {
|
||||||
|
device_type = "cpu";
|
||||||
|
compatible = "arm,cortex-a53";
|
||||||
|
enable-method = "psci";
|
||||||
|
reg = <0x2>;
|
||||||
|
#cooling-cells = <2>;
|
||||||
|
};
|
||||||
|
|
||||||
|
cpu3: cpu@3 {
|
||||||
|
device_type = "cpu";
|
||||||
|
enable-method = "psci";
|
||||||
|
compatible = "arm,cortex-a53";
|
||||||
|
reg = <0x3>;
|
||||||
|
#cooling-cells = <2>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
psci {
|
||||||
|
compatible = "arm,psci-0.2";
|
||||||
|
method = "smc";
|
||||||
|
};
|
||||||
|
|
||||||
|
reserved-memory {
|
||||||
|
#address-cells = <2>;
|
||||||
|
#size-cells = <2>;
|
||||||
|
ranges;
|
||||||
|
|
||||||
|
/* 64 KiB reserved for ramoops/pstore */
|
||||||
|
ramoops@42ff0000 {
|
||||||
|
compatible = "ramoops";
|
||||||
|
reg = <0 0x42ff0000 0 0x10000>;
|
||||||
|
record-size = <0x1000>;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* 192 KiB reserved for ARM Trusted Firmware (BL31) */
|
||||||
|
secmon_reserved: secmon@43000000 {
|
||||||
|
reg = <0 0x43000000 0 0x30000>;
|
||||||
|
no-map;
|
||||||
|
};
|
||||||
|
|
||||||
|
wmcpu_emi: wmcpu-reserved@4fc00000 {
|
||||||
|
no-map;
|
||||||
|
reg = <0 0x4fc00000 0 0x00100000>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
timer {
|
||||||
|
compatible = "arm,armv8-timer";
|
||||||
|
interrupt-parent = <&gic>;
|
||||||
|
interrupts = <GIC_PPI 13 IRQ_TYPE_LEVEL_LOW>,
|
||||||
|
<GIC_PPI 14 IRQ_TYPE_LEVEL_LOW>,
|
||||||
|
<GIC_PPI 11 IRQ_TYPE_LEVEL_LOW>,
|
||||||
|
<GIC_PPI 10 IRQ_TYPE_LEVEL_LOW>;
|
||||||
|
};
|
||||||
|
|
||||||
|
soc {
|
||||||
|
#address-cells = <2>;
|
||||||
|
#size-cells = <2>;
|
||||||
|
compatible = "simple-bus";
|
||||||
|
ranges;
|
||||||
|
|
||||||
|
gic: interrupt-controller@c000000 {
|
||||||
|
compatible = "arm,gic-v3";
|
||||||
|
#interrupt-cells = <3>;
|
||||||
|
interrupt-parent = <&gic>;
|
||||||
|
interrupt-controller;
|
||||||
|
reg = <0 0x0c000000 0 0x10000>, /* GICD */
|
||||||
|
<0 0x0c080000 0 0x80000>, /* GICR */
|
||||||
|
<0 0x0c400000 0 0x2000>, /* GICC */
|
||||||
|
<0 0x0c410000 0 0x1000>, /* GICH */
|
||||||
|
<0 0x0c420000 0 0x2000>; /* GICV */
|
||||||
|
interrupts = <GIC_PPI 9 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
};
|
||||||
|
|
||||||
|
infracfg: infracfg@10001000 {
|
||||||
|
compatible = "mediatek,mt7986-infracfg", "syscon";
|
||||||
|
reg = <0 0x10001000 0 0x1000>;
|
||||||
|
#clock-cells = <1>;
|
||||||
|
};
|
||||||
|
|
||||||
|
topckgen: topckgen@1001b000 {
|
||||||
|
compatible = "mediatek,mt7986-topckgen", "syscon";
|
||||||
|
reg = <0 0x1001B000 0 0x1000>;
|
||||||
|
#clock-cells = <1>;
|
||||||
|
};
|
||||||
|
|
||||||
|
watchdog: watchdog@1001c000 {
|
||||||
|
compatible = "mediatek,mt7986-wdt",
|
||||||
|
"mediatek,mt6589-wdt";
|
||||||
|
reg = <0 0x1001c000 0 0x1000>;
|
||||||
|
interrupts = <GIC_SPI 110 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
#reset-cells = <1>;
|
||||||
|
};
|
||||||
|
|
||||||
|
pio: pinctrl@1001f000 {
|
||||||
|
compatible = "mediatek,mt7986a-pinctrl";
|
||||||
|
reg = <0 0x1001f000 0 0x1000>,
|
||||||
|
<0 0x11c30000 0 0x1000>,
|
||||||
|
<0 0x11c40000 0 0x1000>,
|
||||||
|
<0 0x11e20000 0 0x1000>,
|
||||||
|
<0 0x11e30000 0 0x1000>,
|
||||||
|
<0 0x11f00000 0 0x1000>,
|
||||||
|
<0 0x11f10000 0 0x1000>,
|
||||||
|
<0 0x1000b000 0 0x1000>;
|
||||||
|
reg-names = "gpio", "iocfg_rt", "iocfg_rb", "iocfg_lt",
|
||||||
|
"iocfg_lb", "iocfg_tr", "iocfg_tl", "eint";
|
||||||
|
gpio-controller;
|
||||||
|
#gpio-cells = <2>;
|
||||||
|
gpio-ranges = <&pio 0 0 100>;
|
||||||
|
interrupt-controller;
|
||||||
|
interrupts = <GIC_SPI 225 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
interrupt-parent = <&gic>;
|
||||||
|
#interrupt-cells = <2>;
|
||||||
|
};
|
||||||
|
|
||||||
|
apmixedsys: apmixedsys@1001e000 {
|
||||||
|
compatible = "mediatek,mt7986-apmixedsys";
|
||||||
|
reg = <0 0x1001E000 0 0x1000>;
|
||||||
|
#clock-cells = <1>;
|
||||||
|
};
|
||||||
|
|
||||||
|
sgmiisys0: syscon@10060000 {
|
||||||
|
compatible = "mediatek,mt7986-sgmiisys_0",
|
||||||
|
"syscon";
|
||||||
|
reg = <0 0x10060000 0 0x1000>;
|
||||||
|
#clock-cells = <1>;
|
||||||
|
};
|
||||||
|
|
||||||
|
sgmiisys1: syscon@10070000 {
|
||||||
|
compatible = "mediatek,mt7986-sgmiisys_1",
|
||||||
|
"syscon";
|
||||||
|
reg = <0 0x10070000 0 0x1000>;
|
||||||
|
#clock-cells = <1>;
|
||||||
|
};
|
||||||
|
|
||||||
|
trng: trng@1020f000 {
|
||||||
|
compatible = "mediatek,mt7986-rng";
|
||||||
|
reg = <0 0x1020f000 0 0x100>;
|
||||||
|
clocks = <&infracfg CLK_INFRA_TRNG_CK>;
|
||||||
|
clock-names = "rng";
|
||||||
|
status = "okay";
|
||||||
|
};
|
||||||
|
|
||||||
|
crypto: crypto@10320000 {
|
||||||
|
compatible = "inside-secure,safexcel-eip97";
|
||||||
|
reg = <0 0x10320000 0 0x40000>;
|
||||||
|
interrupts = <GIC_SPI 116 IRQ_TYPE_LEVEL_HIGH>,
|
||||||
|
<GIC_SPI 117 IRQ_TYPE_LEVEL_HIGH>,
|
||||||
|
<GIC_SPI 118 IRQ_TYPE_LEVEL_HIGH>,
|
||||||
|
<GIC_SPI 119 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
interrupt-names = "ring0", "ring1", "ring2", "ring3";
|
||||||
|
clocks = <&infracfg CLK_INFRA_EIP97_CK>;
|
||||||
|
clock-names = "infra_eip97_ck";
|
||||||
|
assigned-clocks = <&topckgen CLK_TOP_EIP_B_SEL>;
|
||||||
|
assigned-clock-parents = <&apmixedsys CLK_APMIXED_NET2PLL>;
|
||||||
|
status = "okay";
|
||||||
|
};
|
||||||
|
|
||||||
|
uart0: serial@11002000 {
|
||||||
|
compatible = "mediatek,mt7986-uart",
|
||||||
|
"mediatek,mt6577-uart";
|
||||||
|
reg = <0 0x11002000 0 0x400>;
|
||||||
|
interrupts = <GIC_SPI 123 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
clocks = <&infracfg CLK_INFRA_UART0_SEL>,
|
||||||
|
<&infracfg CLK_INFRA_UART0_CK>;
|
||||||
|
clock-names = "baud", "bus";
|
||||||
|
assigned-clocks = <&topckgen CLK_TOP_UART_SEL>,
|
||||||
|
<&infracfg CLK_INFRA_UART0_SEL>;
|
||||||
|
assigned-clock-parents = <&topckgen CLK_TOP_XTAL>,
|
||||||
|
<&topckgen CLK_TOP_UART_SEL>;
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
|
uart1: serial@11003000 {
|
||||||
|
compatible = "mediatek,mt7986-uart",
|
||||||
|
"mediatek,mt6577-uart";
|
||||||
|
reg = <0 0x11003000 0 0x400>;
|
||||||
|
interrupts = <GIC_SPI 124 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
clocks = <&infracfg CLK_INFRA_UART1_SEL>,
|
||||||
|
<&infracfg CLK_INFRA_UART1_CK>;
|
||||||
|
clock-names = "baud", "bus";
|
||||||
|
assigned-clocks = <&infracfg CLK_INFRA_UART1_SEL>;
|
||||||
|
assigned-clock-parents = <&topckgen CLK_TOP_F26M_SEL>;
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
|
uart2: serial@11004000 {
|
||||||
|
compatible = "mediatek,mt7986-uart",
|
||||||
|
"mediatek,mt6577-uart";
|
||||||
|
reg = <0 0x11004000 0 0x400>;
|
||||||
|
interrupts = <GIC_SPI 125 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
clocks = <&infracfg CLK_INFRA_UART2_SEL>,
|
||||||
|
<&infracfg CLK_INFRA_UART2_CK>;
|
||||||
|
clock-names = "baud", "bus";
|
||||||
|
assigned-clocks = <&infracfg CLK_INFRA_UART2_SEL>;
|
||||||
|
assigned-clock-parents = <&topckgen CLK_TOP_F26M_SEL>;
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
|
spi0: spi@1100a000 {
|
||||||
|
compatible = "mediatek,mt7986-spi-ipm", "mediatek,spi-ipm";
|
||||||
|
reg = <0 0x1100a000 0 0x100>;
|
||||||
|
interrupts = <GIC_SPI 140 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
clocks = <&topckgen CLK_TOP_MPLL_D2>,
|
||||||
|
<&topckgen CLK_TOP_SPI_SEL>,
|
||||||
|
<&infracfg CLK_INFRA_SPI0_CK>,
|
||||||
|
<&infracfg CLK_INFRA_SPI0_HCK_CK>;
|
||||||
|
clock-names = "parent-clk", "sel-clk", "spi-clk", "hclk";
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
|
spi1: spi@1100b000 {
|
||||||
|
compatible = "mediatek,mt7986-spi-ipm", "mediatek,spi-ipm";
|
||||||
|
reg = <0 0x1100b000 0 0x100>;
|
||||||
|
interrupts = <GIC_SPI 141 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
clocks = <&topckgen CLK_TOP_MPLL_D2>,
|
||||||
|
<&topckgen CLK_TOP_SPIM_MST_SEL>,
|
||||||
|
<&infracfg CLK_INFRA_SPI1_CK>,
|
||||||
|
<&infracfg CLK_INFRA_SPI1_HCK_CK>;
|
||||||
|
clock-names = "parent-clk", "sel-clk", "spi-clk", "hclk";
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
|
ssusb: usb@11200000 {
|
||||||
|
compatible = "mediatek,mt7986-xhci",
|
||||||
|
"mediatek,mtk-xhci";
|
||||||
|
reg = <0 0x11200000 0 0x2e00>,
|
||||||
|
<0 0x11203e00 0 0x0100>;
|
||||||
|
reg-names = "mac", "ippc";
|
||||||
|
interrupts = <GIC_SPI 173 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
clocks = <&infracfg CLK_INFRA_IUSB_SYS_CK>,
|
||||||
|
<&topckgen CLK_TOP_U2U3_XHCI_SEL>,
|
||||||
|
<&infracfg CLK_INFRA_IUSB_CK>,
|
||||||
|
<&infracfg CLK_INFRA_IUSB_133_CK>,
|
||||||
|
<&infracfg CLK_INFRA_IUSB_66M_CK>;
|
||||||
|
clock-names = "sys_ck",
|
||||||
|
"xhci_ck",
|
||||||
|
"ref_ck",
|
||||||
|
"mcu_ck",
|
||||||
|
"dma_ck";
|
||||||
|
phys = <&u2port0 PHY_TYPE_USB2>,
|
||||||
|
<&u3port0 PHY_TYPE_USB3>,
|
||||||
|
<&u2port1 PHY_TYPE_USB2>;
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
|
mmc0: mmc@11230000 {
|
||||||
|
compatible = "mediatek,mt7986-mmc";
|
||||||
|
reg = <0 0x11230000 0 0x1000>,
|
||||||
|
<0 0x11c20000 0 0x1000>;
|
||||||
|
interrupts = <GIC_SPI 143 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
clocks = <&infracfg CLK_INFRA_MSDC_CK>,
|
||||||
|
<&infracfg CLK_INFRA_MSDC_HCK_CK>,
|
||||||
|
<&infracfg CLK_INFRA_MSDC_66M_CK>,
|
||||||
|
<&infracfg CLK_INFRA_MSDC_133M_CK>;
|
||||||
|
clock-names = "source", "hclk", "axi_cg", "ahb_cg";
|
||||||
|
assigned-clocks = <&topckgen CLK_TOP_EMMC_416M_SEL>,
|
||||||
|
<&topckgen CLK_TOP_EMMC_250M_SEL>;
|
||||||
|
assigned-clock-parents = <&apmixedsys CLK_APMIXED_MPLL>,
|
||||||
|
<&topckgen CLK_TOP_NET1PLL_D5_D2>;
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
|
pcie: pcie@11280000 {
|
||||||
|
compatible = "mediatek,mt7986-pcie",
|
||||||
|
"mediatek,mt8192-pcie";
|
||||||
|
device_type = "pci";
|
||||||
|
#address-cells = <3>;
|
||||||
|
#size-cells = <2>;
|
||||||
|
reg = <0x00 0x11280000 0x00 0x4000>;
|
||||||
|
reg-names = "pcie-mac";
|
||||||
|
interrupts = <GIC_SPI 168 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
bus-range = <0x00 0xff>;
|
||||||
|
ranges = <0x82000000 0x00 0x20000000 0x00
|
||||||
|
0x20000000 0x00 0x10000000>;
|
||||||
|
clocks = <&infracfg CLK_INFRA_PCIE_SEL>,
|
||||||
|
<&infracfg CLK_INFRA_IPCIE_CK>,
|
||||||
|
<&infracfg CLK_INFRA_IPCIE_PIPE_CK>,
|
||||||
|
<&infracfg CLK_INFRA_IPCIER_CK>,
|
||||||
|
<&infracfg CLK_INFRA_IPCIEB_CK>;
|
||||||
|
status = "disabled";
|
||||||
|
|
||||||
|
phys = <&pcie_port PHY_TYPE_PCIE>;
|
||||||
|
phy-names = "pcie-phy";
|
||||||
|
|
||||||
|
#interrupt-cells = <1>;
|
||||||
|
interrupt-map-mask = <0 0 0 0x7>;
|
||||||
|
interrupt-map = <0 0 0 1 &pcie_intc 0>,
|
||||||
|
<0 0 0 2 &pcie_intc 1>,
|
||||||
|
<0 0 0 3 &pcie_intc 2>,
|
||||||
|
<0 0 0 4 &pcie_intc 3>;
|
||||||
|
pcie_intc: interrupt-controller {
|
||||||
|
#address-cells = <0>;
|
||||||
|
#interrupt-cells = <1>;
|
||||||
|
interrupt-controller;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
pcie_phy: t-phy@11c00000 {
|
||||||
|
compatible = "mediatek,mt7986-tphy",
|
||||||
|
"mediatek,generic-tphy-v2";
|
||||||
|
#address-cells = <2>;
|
||||||
|
#size-cells = <2>;
|
||||||
|
ranges;
|
||||||
|
status = "disabled";
|
||||||
|
|
||||||
|
pcie_port: pcie-phy@11c00000 {
|
||||||
|
reg = <0 0x11c00000 0 0x20000>;
|
||||||
|
clocks = <&clk40m>;
|
||||||
|
clock-names = "ref";
|
||||||
|
#phy-cells = <1>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
usb_phy: t-phy@11e10000 {
|
||||||
|
compatible = "mediatek,mt7986-tphy",
|
||||||
|
"mediatek,generic-tphy-v2";
|
||||||
|
#address-cells = <2>;
|
||||||
|
#size-cells = <2>;
|
||||||
|
ranges;
|
||||||
|
status = "disabled";
|
||||||
|
|
||||||
|
u2port0: usb-phy@11e10000 {
|
||||||
|
reg = <0 0x11e10000 0 0x700>;
|
||||||
|
clocks = <&topckgen CLK_TOP_DA_U2_REFSEL>,
|
||||||
|
<&topckgen CLK_TOP_DA_U2_CK_1P_SEL>;
|
||||||
|
clock-names = "ref", "da_ref";
|
||||||
|
#phy-cells = <1>;
|
||||||
|
};
|
||||||
|
|
||||||
|
u3port0: usb-phy@11e10700 {
|
||||||
|
reg = <0 0x11e10700 0 0x900>;
|
||||||
|
clocks = <&topckgen CLK_TOP_USB3_PHY_SEL>;
|
||||||
|
clock-names = "ref";
|
||||||
|
#phy-cells = <1>;
|
||||||
|
};
|
||||||
|
|
||||||
|
u2port1: usb-phy@11e11000 {
|
||||||
|
reg = <0 0x11e11000 0 0x700>;
|
||||||
|
clocks = <&topckgen CLK_TOP_DA_U2_REFSEL>,
|
||||||
|
<&topckgen CLK_TOP_DA_U2_CK_1P_SEL>;
|
||||||
|
clock-names = "ref", "da_ref";
|
||||||
|
#phy-cells = <1>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
ethsys: syscon@15000000 {
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <1>;
|
||||||
|
compatible = "mediatek,mt7986-ethsys_ck",
|
||||||
|
"syscon";
|
||||||
|
reg = <0 0x15000000 0 0x1000>;
|
||||||
|
#clock-cells = <1>;
|
||||||
|
#reset-cells = <1>;
|
||||||
|
};
|
||||||
|
|
||||||
|
eth: ethernet@15100000 {
|
||||||
|
compatible = "mediatek,mt7986-eth";
|
||||||
|
reg = <0 0x15100000 0 0x80000>;
|
||||||
|
interrupts = <GIC_SPI 196 IRQ_TYPE_LEVEL_HIGH>,
|
||||||
|
<GIC_SPI 197 IRQ_TYPE_LEVEL_HIGH>,
|
||||||
|
<GIC_SPI 198 IRQ_TYPE_LEVEL_HIGH>,
|
||||||
|
<GIC_SPI 199 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
clocks = <ðsys CLK_ETH_FE_EN>,
|
||||||
|
<ðsys CLK_ETH_GP2_EN>,
|
||||||
|
<ðsys CLK_ETH_GP1_EN>,
|
||||||
|
<ðsys CLK_ETH_WOCPU1_EN>,
|
||||||
|
<ðsys CLK_ETH_WOCPU0_EN>,
|
||||||
|
<&sgmiisys0 CLK_SGMII0_TX250M_EN>,
|
||||||
|
<&sgmiisys0 CLK_SGMII0_RX250M_EN>,
|
||||||
|
<&sgmiisys0 CLK_SGMII0_CDR_REF>,
|
||||||
|
<&sgmiisys0 CLK_SGMII0_CDR_FB>,
|
||||||
|
<&sgmiisys1 CLK_SGMII1_TX250M_EN>,
|
||||||
|
<&sgmiisys1 CLK_SGMII1_RX250M_EN>,
|
||||||
|
<&sgmiisys1 CLK_SGMII1_CDR_REF>,
|
||||||
|
<&sgmiisys1 CLK_SGMII1_CDR_FB>,
|
||||||
|
<&topckgen CLK_TOP_NETSYS_SEL>,
|
||||||
|
<&topckgen CLK_TOP_NETSYS_500M_SEL>;
|
||||||
|
clock-names = "fe", "gp2", "gp1", "wocpu1", "wocpu0",
|
||||||
|
"sgmii_tx250m", "sgmii_rx250m",
|
||||||
|
"sgmii_cdr_ref", "sgmii_cdr_fb",
|
||||||
|
"sgmii2_tx250m", "sgmii2_rx250m",
|
||||||
|
"sgmii2_cdr_ref", "sgmii2_cdr_fb",
|
||||||
|
"netsys0", "netsys1";
|
||||||
|
assigned-clocks = <&topckgen CLK_TOP_NETSYS_2X_SEL>,
|
||||||
|
<&topckgen CLK_TOP_SGM_325M_SEL>;
|
||||||
|
assigned-clock-parents = <&apmixedsys CLK_APMIXED_NET2PLL>,
|
||||||
|
<&apmixedsys CLK_APMIXED_SGMPLL>;
|
||||||
|
mediatek,ethsys = <ðsys>;
|
||||||
|
mediatek,sgmiisys = <&sgmiisys0>, <&sgmiisys1>;
|
||||||
|
#reset-cells = <1>;
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
|
consys: consys@10000000 {
|
||||||
|
compatible = "mediatek,mt7986-consys";
|
||||||
|
reg = <0 0x10000000 0 0x8600000>;
|
||||||
|
memory-region = <&wmcpu_emi>;
|
||||||
|
};
|
||||||
|
|
||||||
|
wmac: wmac@18000000 {
|
||||||
|
compatible = "mediatek,mt7986-wmac", "mediatek,wbsys";
|
||||||
|
resets = <&watchdog MT7986_TOPRGU_CONSYS_RST>;
|
||||||
|
reset-names = "consys";
|
||||||
|
reg = <0 0x18000000 0 0x1000000>,
|
||||||
|
<0 0x10003000 0 0x1000>,
|
||||||
|
<0 0x11d10000 0 0x1000>;
|
||||||
|
interrupts = <GIC_SPI 213 IRQ_TYPE_LEVEL_HIGH>,
|
||||||
|
<GIC_SPI 214 IRQ_TYPE_LEVEL_HIGH>,
|
||||||
|
<GIC_SPI 215 IRQ_TYPE_LEVEL_HIGH>,
|
||||||
|
<GIC_SPI 217 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
clocks = <&topckgen CLK_TOP_CONN_MCUSYS_SEL>,
|
||||||
|
<&topckgen CLK_TOP_AP2CNN_HOST_SEL>;
|
||||||
|
clock-names = "mcu", "ap2conn";
|
||||||
|
memory-region = <&wmcpu_emi>;
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
};
|
@ -0,0 +1,195 @@
|
|||||||
|
// SPDX-License-Identifier: (GPL-2.0 OR MIT)
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2021 MediaTek Inc.
|
||||||
|
* Author: Sam.Shih <sam.shih@mediatek.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
/dts-v1/;
|
||||||
|
#include "mt7986b.dtsi"
|
||||||
|
|
||||||
|
/ {
|
||||||
|
model = "MediaTek MT7986b RFB";
|
||||||
|
compatible = "mediatek,mt7986b-rfb";
|
||||||
|
|
||||||
|
aliases {
|
||||||
|
serial0 = &uart0;
|
||||||
|
};
|
||||||
|
|
||||||
|
chosen {
|
||||||
|
stdout-path = "serial0:115200n8";
|
||||||
|
};
|
||||||
|
|
||||||
|
memory {
|
||||||
|
reg = <0 0x40000000 0 0x40000000>;
|
||||||
|
};
|
||||||
|
|
||||||
|
reg_3p3v: regulator-3p3v {
|
||||||
|
compatible = "regulator-fixed";
|
||||||
|
regulator-name = "fixed-3.3V";
|
||||||
|
regulator-min-microvolt = <3300000>;
|
||||||
|
regulator-max-microvolt = <3300000>;
|
||||||
|
regulator-boot-on;
|
||||||
|
regulator-always-on;
|
||||||
|
};
|
||||||
|
|
||||||
|
reg_5v: regulator-5v {
|
||||||
|
compatible = "regulator-fixed";
|
||||||
|
regulator-name = "fixed-5V";
|
||||||
|
regulator-min-microvolt = <5000000>;
|
||||||
|
regulator-max-microvolt = <5000000>;
|
||||||
|
regulator-boot-on;
|
||||||
|
regulator-always-on;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
&ssusb {
|
||||||
|
vusb33-supply = <®_3p3v>;
|
||||||
|
vbus-supply = <®_5v>;
|
||||||
|
status = "okay";
|
||||||
|
};
|
||||||
|
|
||||||
|
&uart0 {
|
||||||
|
status = "okay";
|
||||||
|
};
|
||||||
|
|
||||||
|
&usb_phy {
|
||||||
|
status = "okay";
|
||||||
|
};
|
||||||
|
|
||||||
|
&wmac {
|
||||||
|
status = "okay";
|
||||||
|
pinctrl-names = "default", "dbdc";
|
||||||
|
pinctrl-0 = <&wf_2g_5g_pins>;
|
||||||
|
pinctrl-1 = <&wf_dbdc_pins>;
|
||||||
|
};
|
||||||
|
|
||||||
|
ð {
|
||||||
|
status = "okay";
|
||||||
|
|
||||||
|
gmac0: mac@0 {
|
||||||
|
compatible = "mediatek,eth-mac";
|
||||||
|
reg = <0>;
|
||||||
|
phy-mode = "2500base-x";
|
||||||
|
|
||||||
|
fixed-link {
|
||||||
|
speed = <2500>;
|
||||||
|
full-duplex;
|
||||||
|
pause;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
gmac1: mac@1 {
|
||||||
|
compatible = "mediatek,eth-mac";
|
||||||
|
reg = <1>;
|
||||||
|
phy-mode = "2500base-x";
|
||||||
|
|
||||||
|
fixed-link {
|
||||||
|
speed = <2500>;
|
||||||
|
full-duplex;
|
||||||
|
pause;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
mdio: mdio-bus {
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
|
||||||
|
phy5: phy@5 {
|
||||||
|
compatible = "ethernet-phy-id67c9.de0a";
|
||||||
|
reg = <5>;
|
||||||
|
reset-gpios = <&pio 6 1>;
|
||||||
|
reset-deassert-us = <20000>;
|
||||||
|
phy-mode = "2500base-x";
|
||||||
|
};
|
||||||
|
|
||||||
|
phy6: phy@6 {
|
||||||
|
compatible = "ethernet-phy-id67c9.de0a";
|
||||||
|
reg = <6>;
|
||||||
|
phy-mode = "2500base-x";
|
||||||
|
};
|
||||||
|
|
||||||
|
switch@0 {
|
||||||
|
compatible = "mediatek,mt7531";
|
||||||
|
reg = <31>;
|
||||||
|
reset-gpios = <&pio 5 0>;
|
||||||
|
|
||||||
|
ports {
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
|
||||||
|
port@0 {
|
||||||
|
reg = <0>;
|
||||||
|
label = "lan0";
|
||||||
|
};
|
||||||
|
|
||||||
|
port@1 {
|
||||||
|
reg = <1>;
|
||||||
|
label = "lan1";
|
||||||
|
};
|
||||||
|
|
||||||
|
port@2 {
|
||||||
|
reg = <2>;
|
||||||
|
label = "lan2";
|
||||||
|
};
|
||||||
|
|
||||||
|
port@3 {
|
||||||
|
reg = <3>;
|
||||||
|
label = "lan3";
|
||||||
|
};
|
||||||
|
|
||||||
|
port@6 {
|
||||||
|
reg = <6>;
|
||||||
|
label = "cpu";
|
||||||
|
ethernet = <&gmac0>;
|
||||||
|
phy-mode = "2500base-x";
|
||||||
|
|
||||||
|
fixed-link {
|
||||||
|
speed = <2500>;
|
||||||
|
full-duplex;
|
||||||
|
pause;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
&crypto {
|
||||||
|
status = "okay";
|
||||||
|
};
|
||||||
|
|
||||||
|
&pio {
|
||||||
|
wf_2g_5g_pins: wf_2g_5g-pins {
|
||||||
|
mux {
|
||||||
|
function = "wifi";
|
||||||
|
groups = "wf_2g", "wf_5g";
|
||||||
|
};
|
||||||
|
conf {
|
||||||
|
pins = "WF0_HB1", "WF0_HB2", "WF0_HB3", "WF0_HB4",
|
||||||
|
"WF0_HB0", "WF0_HB0_B", "WF0_HB5", "WF0_HB6",
|
||||||
|
"WF0_HB7", "WF0_HB8", "WF0_HB9", "WF0_HB10",
|
||||||
|
"WF0_TOP_CLK", "WF0_TOP_DATA", "WF1_HB1",
|
||||||
|
"WF1_HB2", "WF1_HB3", "WF1_HB4", "WF1_HB0",
|
||||||
|
"WF1_HB5", "WF1_HB6", "WF1_HB7", "WF1_HB8",
|
||||||
|
"WF1_TOP_CLK", "WF1_TOP_DATA";
|
||||||
|
drive-strength = <4>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
wf_dbdc_pins: wf_dbdc-pins {
|
||||||
|
mux {
|
||||||
|
function = "wifi";
|
||||||
|
groups = "wf_dbdc";
|
||||||
|
};
|
||||||
|
conf {
|
||||||
|
pins = "WF0_HB1", "WF0_HB2", "WF0_HB3", "WF0_HB4",
|
||||||
|
"WF0_HB0", "WF0_HB0_B", "WF0_HB5", "WF0_HB6",
|
||||||
|
"WF0_HB7", "WF0_HB8", "WF0_HB9", "WF0_HB10",
|
||||||
|
"WF0_TOP_CLK", "WF0_TOP_DATA", "WF1_HB1",
|
||||||
|
"WF1_HB2", "WF1_HB3", "WF1_HB4", "WF1_HB0",
|
||||||
|
"WF1_HB5", "WF1_HB6", "WF1_HB7", "WF1_HB8",
|
||||||
|
"WF1_TOP_CLK", "WF1_TOP_DATA";
|
||||||
|
drive-strength = <4>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
@ -0,0 +1,12 @@
|
|||||||
|
// SPDX-License-Identifier: (GPL-2.0 OR MIT)
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2021 MediaTek Inc.
|
||||||
|
* Author: Sam.Shih <sam.shih@mediatek.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "mt7986a.dtsi"
|
||||||
|
|
||||||
|
&pio {
|
||||||
|
compatible = "mediatek,mt7986b-pinctrl";
|
||||||
|
gpio-ranges = <&pio 0 0 41>, <&pio 66 66 35>;
|
||||||
|
};
|
@ -0,0 +1,100 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-1.0
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2021 MediaTek Inc.
|
||||||
|
* Author: Sam Shih <sam.shih@mediatek.com>
|
||||||
|
* Author: Wenzhen Yu <wenzhen.yu@mediatek.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <linux/clk-provider.h>
|
||||||
|
#include <linux/of.h>
|
||||||
|
#include <linux/of_address.h>
|
||||||
|
#include <linux/of_device.h>
|
||||||
|
#include <linux/platform_device.h>
|
||||||
|
#include "clk-mtk.h"
|
||||||
|
#include "clk-gate.h"
|
||||||
|
#include "clk-mux.h"
|
||||||
|
|
||||||
|
#include <dt-bindings/clock/mt7986-clk.h>
|
||||||
|
#include <linux/clk.h>
|
||||||
|
|
||||||
|
#define MT7986_PLL_FMAX (2500UL * MHZ)
|
||||||
|
#define CON0_MT7986_RST_BAR BIT(27)
|
||||||
|
|
||||||
|
#define PLL_xtal(_id, _name, _reg, _pwr_reg, _en_mask, _flags, _pcwbits, \
|
||||||
|
_pd_reg, _pd_shift, _tuner_reg, _pcw_reg, _pcw_shift, \
|
||||||
|
_div_table, _parent_name) \
|
||||||
|
{ \
|
||||||
|
.id = _id, .name = _name, .reg = _reg, .pwr_reg = _pwr_reg, \
|
||||||
|
.en_mask = _en_mask, .flags = _flags, \
|
||||||
|
.rst_bar_mask = CON0_MT7986_RST_BAR, .fmax = MT7986_PLL_FMAX, \
|
||||||
|
.pcwbits = _pcwbits, .pd_reg = _pd_reg, .pd_shift = _pd_shift, \
|
||||||
|
.tuner_reg = _tuner_reg, .pcw_reg = _pcw_reg, \
|
||||||
|
.pcw_shift = _pcw_shift, .div_table = _div_table, \
|
||||||
|
.parent_name = _parent_name, \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define PLL(_id, _name, _reg, _pwr_reg, _en_mask, _flags, _pcwbits, _pd_reg, \
|
||||||
|
_pd_shift, _tuner_reg, _pcw_reg, _pcw_shift) \
|
||||||
|
PLL_xtal(_id, _name, _reg, _pwr_reg, _en_mask, _flags, _pcwbits, \
|
||||||
|
_pd_reg, _pd_shift, _tuner_reg, _pcw_reg, _pcw_shift, NULL, \
|
||||||
|
"clkxtal")
|
||||||
|
|
||||||
|
static const struct mtk_pll_data plls[] = {
|
||||||
|
PLL(CLK_APMIXED_ARMPLL, "armpll", 0x0200, 0x020C, 0x00000001, 0, 32,
|
||||||
|
0x0200, 4, 0, 0x0204, 0),
|
||||||
|
PLL(CLK_APMIXED_NET2PLL, "net2pll", 0x0210, 0x021C, 0x00000001, 0, 32,
|
||||||
|
0x0210, 4, 0, 0x0214, 0),
|
||||||
|
PLL(CLK_APMIXED_MMPLL, "mmpll", 0x0220, 0x022C, 0x00000001, 0, 32,
|
||||||
|
0x0220, 4, 0, 0x0224, 0),
|
||||||
|
PLL(CLK_APMIXED_SGMPLL, "sgmpll", 0x0230, 0x023c, 0x00000001, 0, 32,
|
||||||
|
0x0230, 4, 0, 0x0234, 0),
|
||||||
|
PLL(CLK_APMIXED_WEDMCUPLL, "wedmcupll", 0x0240, 0x024c, 0x00000001, 0,
|
||||||
|
32, 0x0240, 4, 0, 0x0244, 0),
|
||||||
|
PLL(CLK_APMIXED_NET1PLL, "net1pll", 0x0250, 0x025c, 0x00000001, 0, 32,
|
||||||
|
0x0250, 4, 0, 0x0254, 0),
|
||||||
|
PLL(CLK_APMIXED_MPLL, "mpll", 0x0260, 0x0270, 0x00000001, 0, 32, 0x0260,
|
||||||
|
4, 0, 0x0264, 0),
|
||||||
|
PLL(CLK_APMIXED_APLL2, "apll2", 0x0278, 0x0288, 0x00000001, 0, 32,
|
||||||
|
0x0278, 4, 0, 0x027c, 0),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct of_device_id of_match_clk_mt7986_apmixed[] = {
|
||||||
|
{ .compatible = "mediatek,mt7986-apmixedsys", },
|
||||||
|
{}
|
||||||
|
};
|
||||||
|
|
||||||
|
static int clk_mt7986_apmixed_probe(struct platform_device *pdev)
|
||||||
|
{
|
||||||
|
struct clk_onecell_data *clk_data;
|
||||||
|
struct device_node *node = pdev->dev.of_node;
|
||||||
|
int r;
|
||||||
|
|
||||||
|
clk_data = mtk_alloc_clk_data(ARRAY_SIZE(plls));
|
||||||
|
if (!clk_data)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
mtk_clk_register_plls(node, plls, ARRAY_SIZE(plls), clk_data);
|
||||||
|
|
||||||
|
clk_prepare_enable(clk_data->clks[CLK_APMIXED_ARMPLL]);
|
||||||
|
|
||||||
|
r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
|
||||||
|
if (r) {
|
||||||
|
pr_err("%s(): could not register clock provider: %d\n",
|
||||||
|
__func__, r);
|
||||||
|
goto free_apmixed_data;
|
||||||
|
}
|
||||||
|
return r;
|
||||||
|
|
||||||
|
free_apmixed_data:
|
||||||
|
mtk_free_clk_data(clk_data);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct platform_driver clk_mt7986_apmixed_drv = {
|
||||||
|
.probe = clk_mt7986_apmixed_probe,
|
||||||
|
.driver = {
|
||||||
|
.name = "clk-mt7986-apmixed",
|
||||||
|
.of_match_table = of_match_clk_mt7986_apmixed,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
builtin_platform_driver(clk_mt7986_apmixed_drv);
|
@ -0,0 +1,132 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2021 MediaTek Inc.
|
||||||
|
* Author: Sam Shih <sam.shih@mediatek.com>
|
||||||
|
* Author: Wenzhen Yu <wenzhen.yu@mediatek.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <linux/clk-provider.h>
|
||||||
|
#include <linux/of.h>
|
||||||
|
#include <linux/of_address.h>
|
||||||
|
#include <linux/of_device.h>
|
||||||
|
#include <linux/platform_device.h>
|
||||||
|
|
||||||
|
#include "clk-mtk.h"
|
||||||
|
#include "clk-gate.h"
|
||||||
|
|
||||||
|
#include <dt-bindings/clock/mt7986-clk.h>
|
||||||
|
|
||||||
|
static const struct mtk_gate_regs sgmii0_cg_regs = {
|
||||||
|
.set_ofs = 0xe4,
|
||||||
|
.clr_ofs = 0xe4,
|
||||||
|
.sta_ofs = 0xe4,
|
||||||
|
};
|
||||||
|
|
||||||
|
#define GATE_SGMII0(_id, _name, _parent, _shift) \
|
||||||
|
{ \
|
||||||
|
.id = _id, .name = _name, .parent_name = _parent, \
|
||||||
|
.regs = &sgmii0_cg_regs, .shift = _shift, \
|
||||||
|
.ops = &mtk_clk_gate_ops_no_setclr_inv, \
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct mtk_gate sgmii0_clks[] __initconst = {
|
||||||
|
GATE_SGMII0(CLK_SGMII0_TX250M_EN, "sgmii0_tx250m_en", "top_xtal", 2),
|
||||||
|
GATE_SGMII0(CLK_SGMII0_RX250M_EN, "sgmii0_rx250m_en", "top_xtal", 3),
|
||||||
|
GATE_SGMII0(CLK_SGMII0_CDR_REF, "sgmii0_cdr_ref", "top_xtal", 4),
|
||||||
|
GATE_SGMII0(CLK_SGMII0_CDR_FB, "sgmii0_cdr_fb", "top_xtal", 5),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct mtk_gate_regs sgmii1_cg_regs = {
|
||||||
|
.set_ofs = 0xe4,
|
||||||
|
.clr_ofs = 0xe4,
|
||||||
|
.sta_ofs = 0xe4,
|
||||||
|
};
|
||||||
|
|
||||||
|
#define GATE_SGMII1(_id, _name, _parent, _shift) \
|
||||||
|
{ \
|
||||||
|
.id = _id, .name = _name, .parent_name = _parent, \
|
||||||
|
.regs = &sgmii1_cg_regs, .shift = _shift, \
|
||||||
|
.ops = &mtk_clk_gate_ops_no_setclr_inv, \
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct mtk_gate sgmii1_clks[] __initconst = {
|
||||||
|
GATE_SGMII1(CLK_SGMII1_TX250M_EN, "sgmii1_tx250m_en", "top_xtal", 2),
|
||||||
|
GATE_SGMII1(CLK_SGMII1_RX250M_EN, "sgmii1_rx250m_en", "top_xtal", 3),
|
||||||
|
GATE_SGMII1(CLK_SGMII1_CDR_REF, "sgmii1_cdr_ref", "top_xtal", 4),
|
||||||
|
GATE_SGMII1(CLK_SGMII1_CDR_FB, "sgmii1_cdr_fb", "top_xtal", 5),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct mtk_gate_regs eth_cg_regs = {
|
||||||
|
.set_ofs = 0x30,
|
||||||
|
.clr_ofs = 0x30,
|
||||||
|
.sta_ofs = 0x30,
|
||||||
|
};
|
||||||
|
|
||||||
|
#define GATE_ETH(_id, _name, _parent, _shift) \
|
||||||
|
{ \
|
||||||
|
.id = _id, .name = _name, .parent_name = _parent, \
|
||||||
|
.regs = ð_cg_regs, .shift = _shift, \
|
||||||
|
.ops = &mtk_clk_gate_ops_no_setclr_inv, \
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct mtk_gate eth_clks[] __initconst = {
|
||||||
|
GATE_ETH(CLK_ETH_FE_EN, "eth_fe_en", "netsys_2x_sel", 6),
|
||||||
|
GATE_ETH(CLK_ETH_GP2_EN, "eth_gp2_en", "sgm_325m_sel", 7),
|
||||||
|
GATE_ETH(CLK_ETH_GP1_EN, "eth_gp1_en", "sgm_325m_sel", 8),
|
||||||
|
GATE_ETH(CLK_ETH_WOCPU1_EN, "eth_wocpu1_en", "netsys_mcu_sel", 14),
|
||||||
|
GATE_ETH(CLK_ETH_WOCPU0_EN, "eth_wocpu0_en", "netsys_mcu_sel", 15),
|
||||||
|
};
|
||||||
|
|
||||||
|
static void __init mtk_sgmiisys_0_init(struct device_node *node)
|
||||||
|
{
|
||||||
|
struct clk_onecell_data *clk_data;
|
||||||
|
int r;
|
||||||
|
|
||||||
|
clk_data = mtk_alloc_clk_data(ARRAY_SIZE(sgmii0_clks));
|
||||||
|
|
||||||
|
mtk_clk_register_gates(node, sgmii0_clks, ARRAY_SIZE(sgmii0_clks),
|
||||||
|
clk_data);
|
||||||
|
|
||||||
|
r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
|
||||||
|
if (r)
|
||||||
|
pr_err("%s(): could not register clock provider: %d\n",
|
||||||
|
__func__, r);
|
||||||
|
}
|
||||||
|
CLK_OF_DECLARE(mtk_sgmiisys_0, "mediatek,mt7986-sgmiisys_0",
|
||||||
|
mtk_sgmiisys_0_init);
|
||||||
|
|
||||||
|
static void __init mtk_sgmiisys_1_init(struct device_node *node)
|
||||||
|
{
|
||||||
|
struct clk_onecell_data *clk_data;
|
||||||
|
int r;
|
||||||
|
|
||||||
|
clk_data = mtk_alloc_clk_data(ARRAY_SIZE(sgmii1_clks));
|
||||||
|
|
||||||
|
mtk_clk_register_gates(node, sgmii1_clks, ARRAY_SIZE(sgmii1_clks),
|
||||||
|
clk_data);
|
||||||
|
|
||||||
|
r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
|
||||||
|
|
||||||
|
if (r)
|
||||||
|
pr_err("%s(): could not register clock provider: %d\n",
|
||||||
|
__func__, r);
|
||||||
|
}
|
||||||
|
CLK_OF_DECLARE(mtk_sgmiisys_1, "mediatek,mt7986-sgmiisys_1",
|
||||||
|
mtk_sgmiisys_1_init);
|
||||||
|
|
||||||
|
static void __init mtk_ethsys_init(struct device_node *node)
|
||||||
|
{
|
||||||
|
struct clk_onecell_data *clk_data;
|
||||||
|
int r;
|
||||||
|
|
||||||
|
clk_data = mtk_alloc_clk_data(ARRAY_SIZE(eth_clks));
|
||||||
|
|
||||||
|
mtk_clk_register_gates(node, eth_clks, ARRAY_SIZE(eth_clks), clk_data);
|
||||||
|
|
||||||
|
r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
|
||||||
|
|
||||||
|
if (r)
|
||||||
|
pr_err("%s(): could not register clock provider: %d\n",
|
||||||
|
__func__, r);
|
||||||
|
}
|
||||||
|
CLK_OF_DECLARE(mtk_ethsys, "mediatek,mt7986-ethsys_ck", mtk_ethsys_init);
|
@ -0,0 +1,224 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-1.0
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2021 MediaTek Inc.
|
||||||
|
* Author: Sam Shih <sam.shih@mediatek.com>
|
||||||
|
* Author: Wenzhen Yu <wenzhen.yu@mediatek.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <linux/clk-provider.h>
|
||||||
|
#include <linux/of.h>
|
||||||
|
#include <linux/of_address.h>
|
||||||
|
#include <linux/of_device.h>
|
||||||
|
#include <linux/platform_device.h>
|
||||||
|
#include "clk-mtk.h"
|
||||||
|
#include "clk-gate.h"
|
||||||
|
#include "clk-mux.h"
|
||||||
|
|
||||||
|
#include <dt-bindings/clock/mt7986-clk.h>
|
||||||
|
#include <linux/clk.h>
|
||||||
|
|
||||||
|
static DEFINE_SPINLOCK(mt7986_clk_lock);
|
||||||
|
|
||||||
|
static const struct mtk_fixed_factor infra_divs[] = {
|
||||||
|
FACTOR(CLK_INFRA_SYSAXI_D2, "infra_sysaxi_d2", "sysaxi_sel", 1, 2),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const char *const infra_uart_parent[] __initconst = { "csw_f26m_sel",
|
||||||
|
"uart_sel" };
|
||||||
|
|
||||||
|
static const char *const infra_spi_parents[] __initconst = { "i2c_sel",
|
||||||
|
"spi_sel" };
|
||||||
|
|
||||||
|
static const char *const infra_pwm_bsel_parents[] __initconst = {
|
||||||
|
"top_rtc_32p7k", "csw_f26m_sel", "infra_sysaxi_d2", "pwm_sel"
|
||||||
|
};
|
||||||
|
|
||||||
|
static const char *const infra_pcie_parents[] __initconst = {
|
||||||
|
"top_rtc_32p7k", "csw_f26m_sel", "top_xtal", "pextp_tl_ck_sel"
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct mtk_mux infra_muxes[] = {
|
||||||
|
/* MODULE_CLK_SEL_0 */
|
||||||
|
MUX_GATE_CLR_SET_UPD(CLK_INFRA_UART0_SEL, "infra_uart0_sel",
|
||||||
|
infra_uart_parent, 0x0018, 0x0010, 0x0014, 0, 1,
|
||||||
|
-1, -1, -1),
|
||||||
|
MUX_GATE_CLR_SET_UPD(CLK_INFRA_UART1_SEL, "infra_uart1_sel",
|
||||||
|
infra_uart_parent, 0x0018, 0x0010, 0x0014, 1, 1,
|
||||||
|
-1, -1, -1),
|
||||||
|
MUX_GATE_CLR_SET_UPD(CLK_INFRA_UART2_SEL, "infra_uart2_sel",
|
||||||
|
infra_uart_parent, 0x0018, 0x0010, 0x0014, 2, 1,
|
||||||
|
-1, -1, -1),
|
||||||
|
MUX_GATE_CLR_SET_UPD(CLK_INFRA_SPI0_SEL, "infra_spi0_sel",
|
||||||
|
infra_spi_parents, 0x0018, 0x0010, 0x0014, 4, 1,
|
||||||
|
-1, -1, -1),
|
||||||
|
MUX_GATE_CLR_SET_UPD(CLK_INFRA_SPI1_SEL, "infra_spi1_sel",
|
||||||
|
infra_spi_parents, 0x0018, 0x0010, 0x0014, 5, 1,
|
||||||
|
-1, -1, -1),
|
||||||
|
MUX_GATE_CLR_SET_UPD(CLK_INFRA_PWM1_SEL, "infra_pwm1_sel",
|
||||||
|
infra_pwm_bsel_parents, 0x0018, 0x0010, 0x0014, 9,
|
||||||
|
2, -1, -1, -1),
|
||||||
|
MUX_GATE_CLR_SET_UPD(CLK_INFRA_PWM2_SEL, "infra_pwm2_sel",
|
||||||
|
infra_pwm_bsel_parents, 0x0018, 0x0010, 0x0014, 11,
|
||||||
|
2, -1, -1, -1),
|
||||||
|
MUX_GATE_CLR_SET_UPD(CLK_INFRA_PWM_BSEL, "infra_pwm_bsel",
|
||||||
|
infra_pwm_bsel_parents, 0x0018, 0x0010, 0x0014, 13,
|
||||||
|
2, -1, -1, -1),
|
||||||
|
/* MODULE_CLK_SEL_1 */
|
||||||
|
MUX_GATE_CLR_SET_UPD(CLK_INFRA_PCIE_SEL, "infra_pcie_sel",
|
||||||
|
infra_pcie_parents, 0x0028, 0x0020, 0x0024, 0, 2,
|
||||||
|
-1, -1, -1),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct mtk_gate_regs infra0_cg_regs = {
|
||||||
|
.set_ofs = 0x40,
|
||||||
|
.clr_ofs = 0x44,
|
||||||
|
.sta_ofs = 0x48,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct mtk_gate_regs infra1_cg_regs = {
|
||||||
|
.set_ofs = 0x50,
|
||||||
|
.clr_ofs = 0x54,
|
||||||
|
.sta_ofs = 0x58,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct mtk_gate_regs infra2_cg_regs = {
|
||||||
|
.set_ofs = 0x60,
|
||||||
|
.clr_ofs = 0x64,
|
||||||
|
.sta_ofs = 0x68,
|
||||||
|
};
|
||||||
|
|
||||||
|
#define GATE_INFRA0(_id, _name, _parent, _shift) \
|
||||||
|
{ \
|
||||||
|
.id = _id, .name = _name, .parent_name = _parent, \
|
||||||
|
.regs = &infra0_cg_regs, .shift = _shift, \
|
||||||
|
.ops = &mtk_clk_gate_ops_setclr, \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define GATE_INFRA1(_id, _name, _parent, _shift) \
|
||||||
|
{ \
|
||||||
|
.id = _id, .name = _name, .parent_name = _parent, \
|
||||||
|
.regs = &infra1_cg_regs, .shift = _shift, \
|
||||||
|
.ops = &mtk_clk_gate_ops_setclr, \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define GATE_INFRA2(_id, _name, _parent, _shift) \
|
||||||
|
{ \
|
||||||
|
.id = _id, .name = _name, .parent_name = _parent, \
|
||||||
|
.regs = &infra2_cg_regs, .shift = _shift, \
|
||||||
|
.ops = &mtk_clk_gate_ops_setclr, \
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct mtk_gate infra_clks[] = {
|
||||||
|
/* INFRA0 */
|
||||||
|
GATE_INFRA0(CLK_INFRA_GPT_STA, "infra_gpt_sta", "infra_sysaxi_d2", 0),
|
||||||
|
GATE_INFRA0(CLK_INFRA_PWM_HCK, "infra_pwm_hck", "infra_sysaxi_d2", 1),
|
||||||
|
GATE_INFRA0(CLK_INFRA_PWM_STA, "infra_pwm_sta", "infra_pwm_bsel", 2),
|
||||||
|
GATE_INFRA0(CLK_INFRA_PWM1_CK, "infra_pwm1", "infra_pwm1_sel", 3),
|
||||||
|
GATE_INFRA0(CLK_INFRA_PWM2_CK, "infra_pwm2", "infra_pwm2_sel", 4),
|
||||||
|
GATE_INFRA0(CLK_INFRA_CQ_DMA_CK, "infra_cq_dma", "sysaxi_sel", 6),
|
||||||
|
GATE_INFRA0(CLK_INFRA_EIP97_CK, "infra_eip97", "eip_b_sel", 7),
|
||||||
|
GATE_INFRA0(CLK_INFRA_AUD_BUS_CK, "infra_aud_bus", "sysaxi_sel", 8),
|
||||||
|
GATE_INFRA0(CLK_INFRA_AUD_26M_CK, "infra_aud_26m", "csw_f26m_sel", 9),
|
||||||
|
GATE_INFRA0(CLK_INFRA_AUD_L_CK, "infra_aud_l", "aud_l_sel", 10),
|
||||||
|
GATE_INFRA0(CLK_INFRA_AUD_AUD_CK, "infra_aud_aud", "a1sys_sel", 11),
|
||||||
|
GATE_INFRA0(CLK_INFRA_AUD_EG2_CK, "infra_aud_eg2", "a_tuner_sel", 13),
|
||||||
|
GATE_INFRA0(CLK_INFRA_DRAMC_26M_CK, "infra_dramc_26m", "csw_f26m_sel",
|
||||||
|
14),
|
||||||
|
GATE_INFRA0(CLK_INFRA_DBG_CK, "infra_dbg", "infra_sysaxi_d2", 15),
|
||||||
|
GATE_INFRA0(CLK_INFRA_AP_DMA_CK, "infra_ap_dma", "infra_sysaxi_d2", 16),
|
||||||
|
GATE_INFRA0(CLK_INFRA_SEJ_CK, "infra_sej", "infra_sysaxi_d2", 24),
|
||||||
|
GATE_INFRA0(CLK_INFRA_SEJ_13M_CK, "infra_sej_13m", "csw_f26m_sel", 25),
|
||||||
|
GATE_INFRA0(CLK_INFRA_TRNG_CK, "infra_trng", "sysaxi_sel", 26),
|
||||||
|
/* INFRA1 */
|
||||||
|
GATE_INFRA1(CLK_INFRA_THERM_CK, "infra_therm", "csw_f26m_sel", 0),
|
||||||
|
GATE_INFRA1(CLK_INFRA_I2C0_CK, "infra_i2c0", "i2c_sel", 1),
|
||||||
|
GATE_INFRA1(CLK_INFRA_UART0_CK, "infra_uart0", "infra_uart0_sel", 2),
|
||||||
|
GATE_INFRA1(CLK_INFRA_UART1_CK, "infra_uart1", "infra_uart1_sel", 3),
|
||||||
|
GATE_INFRA1(CLK_INFRA_UART2_CK, "infra_uart2", "infra_uart2_sel", 4),
|
||||||
|
GATE_INFRA1(CLK_INFRA_NFI1_CK, "infra_nfi1", "nfi1x_sel", 8),
|
||||||
|
GATE_INFRA1(CLK_INFRA_SPINFI1_CK, "infra_spinfi1", "spinfi_sel", 9),
|
||||||
|
GATE_INFRA1(CLK_INFRA_NFI_HCK_CK, "infra_nfi_hck", "infra_sysaxi_d2",
|
||||||
|
10),
|
||||||
|
GATE_INFRA1(CLK_INFRA_SPI0_CK, "infra_spi0", "infra_spi0_sel", 11),
|
||||||
|
GATE_INFRA1(CLK_INFRA_SPI1_CK, "infra_spi1", "infra_spi1_sel", 12),
|
||||||
|
GATE_INFRA1(CLK_INFRA_SPI0_HCK_CK, "infra_spi0_hck", "infra_sysaxi_d2",
|
||||||
|
13),
|
||||||
|
GATE_INFRA1(CLK_INFRA_SPI1_HCK_CK, "infra_spi1_hck", "infra_sysaxi_d2",
|
||||||
|
14),
|
||||||
|
GATE_INFRA1(CLK_INFRA_FRTC_CK, "infra_frtc", "top_rtc_32k", 15),
|
||||||
|
GATE_INFRA1(CLK_INFRA_MSDC_CK, "infra_msdc", "emmc_416m_sel", 16),
|
||||||
|
GATE_INFRA1(CLK_INFRA_MSDC_HCK_CK, "infra_msdc_hck", "emmc_250m_sel",
|
||||||
|
17),
|
||||||
|
GATE_INFRA1(CLK_INFRA_MSDC_133M_CK, "infra_msdc_133m", "sysaxi_sel",
|
||||||
|
18),
|
||||||
|
GATE_INFRA1(CLK_INFRA_MSDC_66M_CK, "infra_msdc_66m", "infra_sysaxi_d2",
|
||||||
|
19),
|
||||||
|
GATE_INFRA1(CLK_INFRA_ADC_26M_CK, "infra_adc_26m", "csw_f26m_sel", 20),
|
||||||
|
GATE_INFRA1(CLK_INFRA_ADC_FRC_CK, "infra_adc_frc", "csw_f26m_sel", 21),
|
||||||
|
GATE_INFRA1(CLK_INFRA_FBIST2FPC_CK, "infra_fbist2fpc", "nfi1x_sel", 23),
|
||||||
|
/* INFRA2 */
|
||||||
|
GATE_INFRA2(CLK_INFRA_IUSB_133_CK, "infra_iusb_133", "sysaxi_sel", 0),
|
||||||
|
GATE_INFRA2(CLK_INFRA_IUSB_66M_CK, "infra_iusb_66m", "infra_sysaxi_d2",
|
||||||
|
1),
|
||||||
|
GATE_INFRA2(CLK_INFRA_IUSB_SYS_CK, "infra_iusb_sys", "u2u3_sys_sel", 2),
|
||||||
|
GATE_INFRA2(CLK_INFRA_IUSB_CK, "infra_iusb", "u2u3_sel", 3),
|
||||||
|
GATE_INFRA2(CLK_INFRA_IPCIE_CK, "infra_ipcie", "pextp_tl_ck_sel", 12),
|
||||||
|
GATE_INFRA2(CLK_INFRA_IPCIE_PIPE_CK, "infra_ipcie_pipe", "top_xtal",
|
||||||
|
13),
|
||||||
|
GATE_INFRA2(CLK_INFRA_IPCIER_CK, "infra_ipcier", "csw_f26m_sel", 14),
|
||||||
|
GATE_INFRA2(CLK_INFRA_IPCIEB_CK, "infra_ipcieb", "sysaxi_sel", 15),
|
||||||
|
};
|
||||||
|
|
||||||
|
static int clk_mt7986_infracfg_probe(struct platform_device *pdev)
|
||||||
|
{
|
||||||
|
struct clk_onecell_data *clk_data;
|
||||||
|
struct device_node *node = pdev->dev.of_node;
|
||||||
|
int r;
|
||||||
|
void __iomem *base;
|
||||||
|
int nr = ARRAY_SIZE(infra_divs) + ARRAY_SIZE(infra_muxes) +
|
||||||
|
ARRAY_SIZE(infra_clks);
|
||||||
|
|
||||||
|
base = of_iomap(node, 0);
|
||||||
|
if (!base) {
|
||||||
|
pr_err("%s(): ioremap failed\n", __func__);
|
||||||
|
return -ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
|
clk_data = mtk_alloc_clk_data(nr);
|
||||||
|
|
||||||
|
if (!clk_data)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
mtk_clk_register_factors(infra_divs, ARRAY_SIZE(infra_divs), clk_data);
|
||||||
|
mtk_clk_register_muxes(infra_muxes, ARRAY_SIZE(infra_muxes), node,
|
||||||
|
&mt7986_clk_lock, clk_data);
|
||||||
|
mtk_clk_register_gates(node, infra_clks, ARRAY_SIZE(infra_clks),
|
||||||
|
clk_data);
|
||||||
|
|
||||||
|
r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
|
||||||
|
if (r) {
|
||||||
|
pr_err("%s(): could not register clock provider: %d\n",
|
||||||
|
__func__, r);
|
||||||
|
goto free_infracfg_data;
|
||||||
|
}
|
||||||
|
return r;
|
||||||
|
|
||||||
|
free_infracfg_data:
|
||||||
|
mtk_free_clk_data(clk_data);
|
||||||
|
return r;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct of_device_id of_match_clk_mt7986_infracfg[] = {
|
||||||
|
{ .compatible = "mediatek,mt7986-infracfg", },
|
||||||
|
{}
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_driver clk_mt7986_infracfg_drv = {
|
||||||
|
.probe = clk_mt7986_infracfg_probe,
|
||||||
|
.driver = {
|
||||||
|
.name = "clk-mt7986-infracfg",
|
||||||
|
.of_match_table = of_match_clk_mt7986_infracfg,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
builtin_platform_driver(clk_mt7986_infracfg_drv);
|
@ -0,0 +1,342 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-1.0
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2021 MediaTek Inc.
|
||||||
|
* Author: Sam Shih <sam.shih@mediatek.com>
|
||||||
|
* Author: Wenzhen Yu <wenzhen.yu@mediatek.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <linux/clk-provider.h>
|
||||||
|
#include <linux/of.h>
|
||||||
|
#include <linux/of_address.h>
|
||||||
|
#include <linux/of_device.h>
|
||||||
|
#include <linux/platform_device.h>
|
||||||
|
#include "clk-mtk.h"
|
||||||
|
#include "clk-gate.h"
|
||||||
|
#include "clk-mux.h"
|
||||||
|
|
||||||
|
#include <dt-bindings/clock/mt7986-clk.h>
|
||||||
|
#include <linux/clk.h>
|
||||||
|
|
||||||
|
static DEFINE_SPINLOCK(mt7986_clk_lock);
|
||||||
|
|
||||||
|
static const struct mtk_fixed_clk top_fixed_clks[] = {
|
||||||
|
FIXED_CLK(CLK_TOP_XTAL, "top_xtal", "clkxtal", 40000000),
|
||||||
|
FIXED_CLK(CLK_TOP_JTAG, "top_jtag", "clkxtal", 50000000),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct mtk_fixed_factor top_divs[] = {
|
||||||
|
/* XTAL */
|
||||||
|
FACTOR(CLK_TOP_XTAL_D2, "top_xtal_d2", "top_xtal", 1, 2),
|
||||||
|
FACTOR(CLK_TOP_RTC_32K, "top_rtc_32k", "top_xtal", 1, 1250),
|
||||||
|
FACTOR(CLK_TOP_RTC_32P7K, "top_rtc_32p7k", "top_xtal", 1, 1220),
|
||||||
|
/* MPLL */
|
||||||
|
FACTOR(CLK_TOP_MPLL_D2, "top_mpll_d2", "mpll", 1, 2),
|
||||||
|
FACTOR(CLK_TOP_MPLL_D4, "top_mpll_d4", "mpll", 1, 4),
|
||||||
|
FACTOR(CLK_TOP_MPLL_D8, "top_mpll_d8", "mpll", 1, 8),
|
||||||
|
FACTOR(CLK_TOP_MPLL_D8_D2, "top_mpll_d8_d2", "mpll", 1, 16),
|
||||||
|
FACTOR(CLK_TOP_MPLL_D3_D2, "top_mpll_d3_d2", "mpll", 1, 6),
|
||||||
|
/* MMPLL */
|
||||||
|
FACTOR(CLK_TOP_MMPLL_D2, "top_mmpll_d2", "mmpll", 1, 2),
|
||||||
|
FACTOR(CLK_TOP_MMPLL_D4, "top_mmpll_d4", "mmpll", 1, 4),
|
||||||
|
FACTOR(CLK_TOP_MMPLL_D8, "top_mmpll_d8", "mmpll", 1, 8),
|
||||||
|
FACTOR(CLK_TOP_MMPLL_D8_D2, "top_mmpll_d8_d2", "mmpll", 1, 16),
|
||||||
|
FACTOR(CLK_TOP_MMPLL_D3_D8, "top_mmpll_d3_d8", "mmpll", 1, 24),
|
||||||
|
FACTOR(CLK_TOP_MMPLL_U2PHY, "top_mmpll_u2phy", "mmpll", 1, 30),
|
||||||
|
/* APLL2 */
|
||||||
|
FACTOR(CLK_TOP_APLL2_D4, "top_apll2_d4", "apll2", 1, 4),
|
||||||
|
/* NET1PLL */
|
||||||
|
FACTOR(CLK_TOP_NET1PLL_D4, "top_net1pll_d4", "net1pll", 1, 4),
|
||||||
|
FACTOR(CLK_TOP_NET1PLL_D5, "top_net1pll_d5", "net1pll", 1, 5),
|
||||||
|
FACTOR(CLK_TOP_NET1PLL_D5_D2, "top_net1pll_d5_d2", "net1pll", 1, 10),
|
||||||
|
FACTOR(CLK_TOP_NET1PLL_D5_D4, "top_net1pll_d5_d4", "net1pll", 1, 20),
|
||||||
|
FACTOR(CLK_TOP_NET1PLL_D8_D2, "top_net1pll_d8_d2", "net1pll", 1, 16),
|
||||||
|
FACTOR(CLK_TOP_NET1PLL_D8_D4, "top_net1pll_d8_d4", "net1pll", 1, 32),
|
||||||
|
/* NET2PLL */
|
||||||
|
FACTOR(CLK_TOP_NET2PLL_D4, "top_net2pll_d4", "net2pll", 1, 4),
|
||||||
|
FACTOR(CLK_TOP_NET2PLL_D4_D2, "top_net2pll_d4_d2", "net2pll", 1, 8),
|
||||||
|
FACTOR(CLK_TOP_NET2PLL_D3_D2, "top_net2pll_d3_d2", "net2pll", 1, 2),
|
||||||
|
/* WEDMCUPLL */
|
||||||
|
FACTOR(CLK_TOP_WEDMCUPLL_D5_D2, "top_wedmcupll_d5_d2", "wedmcupll", 1,
|
||||||
|
10),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const char *const nfi1x_parents[] __initconst = { "top_xtal",
|
||||||
|
"top_mmpll_d8",
|
||||||
|
"top_net1pll_d8_d2",
|
||||||
|
"top_net2pll_d3_d2",
|
||||||
|
"top_mpll_d4",
|
||||||
|
"top_mmpll_d8_d2",
|
||||||
|
"top_wedmcupll_d5_d2",
|
||||||
|
"top_mpll_d8" };
|
||||||
|
|
||||||
|
static const char *const spinfi_parents[] __initconst = {
|
||||||
|
"top_xtal_d2", "top_xtal", "top_net1pll_d5_d4",
|
||||||
|
"top_mpll_d4", "top_mmpll_d8_d2", "top_wedmcupll_d5_d2",
|
||||||
|
"top_mmpll_d3_d8", "top_mpll_d8"
|
||||||
|
};
|
||||||
|
|
||||||
|
static const char *const spi_parents[] __initconst = {
|
||||||
|
"top_xtal", "top_mpll_d2", "top_mmpll_d8",
|
||||||
|
"top_net1pll_d8_d2", "top_net2pll_d3_d2", "top_net1pll_d5_d4",
|
||||||
|
"top_mpll_d4", "top_wedmcupll_d5_d2"
|
||||||
|
};
|
||||||
|
|
||||||
|
static const char *const uart_parents[] __initconst = { "top_xtal",
|
||||||
|
"top_mpll_d8",
|
||||||
|
"top_mpll_d8_d2" };
|
||||||
|
|
||||||
|
static const char *const pwm_parents[] __initconst = {
|
||||||
|
"top_xtal", "top_net1pll_d8_d2", "top_net1pll_d5_d4", "top_mpll_d4"
|
||||||
|
};
|
||||||
|
|
||||||
|
static const char *const i2c_parents[] __initconst = {
|
||||||
|
"top_xtal", "top_net1pll_d5_d4", "top_mpll_d4", "top_net1pll_d8_d4"
|
||||||
|
};
|
||||||
|
|
||||||
|
static const char *const pextp_tl_ck_parents[] __initconst = {
|
||||||
|
"top_xtal", "top_net1pll_d5_d4", "top_net2pll_d4_d2", "top_rtc_32k"
|
||||||
|
};
|
||||||
|
|
||||||
|
static const char *const emmc_250m_parents[] __initconst = {
|
||||||
|
"top_xtal", "top_net1pll_d5_d2"
|
||||||
|
};
|
||||||
|
|
||||||
|
static const char *const emmc_416m_parents[] __initconst = { "top_xtal",
|
||||||
|
"mpll" };
|
||||||
|
|
||||||
|
static const char *const f_26m_adc_parents[] __initconst = { "top_xtal",
|
||||||
|
"top_mpll_d8_d2" };
|
||||||
|
|
||||||
|
static const char *const dramc_md32_parents[] __initconst = { "top_xtal",
|
||||||
|
"top_mpll_d2" };
|
||||||
|
|
||||||
|
static const char *const sysaxi_parents[] __initconst = { "top_xtal",
|
||||||
|
"top_net1pll_d8_d2",
|
||||||
|
"top_net2pll_d4" };
|
||||||
|
|
||||||
|
static const char *const sysapb_parents[] __initconst = { "top_xtal",
|
||||||
|
"top_mpll_d3_d2",
|
||||||
|
"top_net2pll_d4_d2" };
|
||||||
|
|
||||||
|
static const char *const arm_db_main_parents[] __initconst = {
|
||||||
|
"top_xtal", "top_net2pll_d3_d2"
|
||||||
|
};
|
||||||
|
|
||||||
|
static const char *const arm_db_jtsel_parents[] __initconst = { "top_jtag",
|
||||||
|
"top_xtal" };
|
||||||
|
|
||||||
|
static const char *const netsys_parents[] __initconst = { "top_xtal",
|
||||||
|
"top_mmpll_d4" };
|
||||||
|
|
||||||
|
static const char *const netsys_500m_parents[] __initconst = {
|
||||||
|
"top_xtal", "top_net1pll_d5"
|
||||||
|
};
|
||||||
|
|
||||||
|
static const char *const netsys_mcu_parents[] __initconst = {
|
||||||
|
"top_xtal", "wedmcupll", "top_mmpll_d2", "top_net1pll_d4",
|
||||||
|
"top_net1pll_d5"
|
||||||
|
};
|
||||||
|
|
||||||
|
static const char *const netsys_2x_parents[] __initconst = {
|
||||||
|
"top_xtal", "net2pll", "wedmcupll", "top_mmpll_d2"
|
||||||
|
};
|
||||||
|
|
||||||
|
static const char *const sgm_325m_parents[] __initconst = { "top_xtal",
|
||||||
|
"sgmpll" };
|
||||||
|
|
||||||
|
static const char *const sgm_reg_parents[] __initconst = {
|
||||||
|
"top_xtal", "top_net1pll_d8_d4"
|
||||||
|
};
|
||||||
|
|
||||||
|
static const char *const a1sys_parents[] __initconst = { "top_xtal",
|
||||||
|
"top_apll2_d4" };
|
||||||
|
|
||||||
|
static const char *const conn_mcusys_parents[] __initconst = { "top_xtal",
|
||||||
|
"top_mmpll_d2" };
|
||||||
|
|
||||||
|
static const char *const eip_b_parents[] __initconst = { "top_xtal",
|
||||||
|
"net2pll" };
|
||||||
|
|
||||||
|
static const char *const aud_l_parents[] __initconst = { "top_xtal", "apll2",
|
||||||
|
"top_mpll_d8_d2" };
|
||||||
|
|
||||||
|
static const char *const a_tuner_parents[] __initconst = { "top_xtal",
|
||||||
|
"top_apll2_d4",
|
||||||
|
"top_mpll_d8_d2" };
|
||||||
|
|
||||||
|
static const char *const u2u3_sys_parents[] __initconst = {
|
||||||
|
"top_xtal", "top_net1pll_d5_d4"
|
||||||
|
};
|
||||||
|
|
||||||
|
static const char *const da_u2_refsel_parents[] __initconst = {
|
||||||
|
"top_xtal", "top_mmpll_u2phy"
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct mtk_mux top_muxes[] = {
|
||||||
|
/* CLK_CFG_0 */
|
||||||
|
MUX_GATE_CLR_SET_UPD(CLK_TOP_NFI1X_SEL, "nfi1x_sel", nfi1x_parents,
|
||||||
|
0x000, 0x004, 0x008, 0, 3, 7, 0x1C0, 0),
|
||||||
|
MUX_GATE_CLR_SET_UPD(CLK_TOP_SPINFI_SEL, "spinfi_sel", spinfi_parents,
|
||||||
|
0x000, 0x004, 0x008, 8, 3, 15, 0x1C0, 1),
|
||||||
|
MUX_GATE_CLR_SET_UPD(CLK_TOP_SPI_SEL, "spi_sel", spi_parents, 0x000,
|
||||||
|
0x004, 0x008, 16, 3, 23, 0x1C0, 2),
|
||||||
|
MUX_GATE_CLR_SET_UPD(CLK_TOP_SPIM_MST_SEL, "spim_mst_sel", spi_parents,
|
||||||
|
0x000, 0x004, 0x008, 24, 3, 31, 0x1C0, 3),
|
||||||
|
/* CLK_CFG_1 */
|
||||||
|
MUX_GATE_CLR_SET_UPD(CLK_TOP_UART_SEL, "uart_sel", uart_parents, 0x010,
|
||||||
|
0x014, 0x018, 0, 2, 7, 0x1C0, 4),
|
||||||
|
MUX_GATE_CLR_SET_UPD(CLK_TOP_PWM_SEL, "pwm_sel", pwm_parents, 0x010,
|
||||||
|
0x014, 0x018, 8, 2, 15, 0x1C0, 5),
|
||||||
|
MUX_GATE_CLR_SET_UPD(CLK_TOP_I2C_SEL, "i2c_sel", i2c_parents, 0x010,
|
||||||
|
0x014, 0x018, 16, 2, 23, 0x1C0, 6),
|
||||||
|
MUX_GATE_CLR_SET_UPD(CLK_TOP_PEXTP_TL_SEL, "pextp_tl_ck_sel",
|
||||||
|
pextp_tl_ck_parents, 0x010, 0x014, 0x018, 24, 2,
|
||||||
|
31, 0x1C0, 7),
|
||||||
|
/* CLK_CFG_2 */
|
||||||
|
MUX_GATE_CLR_SET_UPD(CLK_TOP_EMMC_250M_SEL, "emmc_250m_sel",
|
||||||
|
emmc_250m_parents, 0x020, 0x024, 0x028, 0, 1, 7,
|
||||||
|
0x1C0, 8),
|
||||||
|
MUX_GATE_CLR_SET_UPD(CLK_TOP_EMMC_416M_SEL, "emmc_416m_sel",
|
||||||
|
emmc_416m_parents, 0x020, 0x024, 0x028, 8, 1, 15,
|
||||||
|
0x1C0, 9),
|
||||||
|
MUX_GATE_CLR_SET_UPD(CLK_TOP_F_26M_ADC_SEL, "f_26m_adc_sel",
|
||||||
|
f_26m_adc_parents, 0x020, 0x024, 0x028, 16, 1, 23,
|
||||||
|
0x1C0, 10),
|
||||||
|
MUX_GATE_CLR_SET_UPD(CLK_TOP_DRAMC_SEL, "dramc_sel", f_26m_adc_parents,
|
||||||
|
0x020, 0x024, 0x028, 24, 1, 31, 0x1C0, 11),
|
||||||
|
/* CLK_CFG_3 */
|
||||||
|
MUX_GATE_CLR_SET_UPD(CLK_TOP_DRAMC_MD32_SEL, "dramc_md32_sel",
|
||||||
|
dramc_md32_parents, 0x030, 0x034, 0x038, 0, 1, 7,
|
||||||
|
0x1C0, 12),
|
||||||
|
MUX_GATE_CLR_SET_UPD(CLK_TOP_SYSAXI_SEL, "sysaxi_sel", sysaxi_parents,
|
||||||
|
0x030, 0x034, 0x038, 8, 2, 15, 0x1C0, 13),
|
||||||
|
MUX_GATE_CLR_SET_UPD(CLK_TOP_SYSAPB_SEL, "sysapb_sel", sysapb_parents,
|
||||||
|
0x030, 0x034, 0x038, 16, 2, 23, 0x1C0, 14),
|
||||||
|
MUX_GATE_CLR_SET_UPD(CLK_TOP_ARM_DB_MAIN_SEL, "arm_db_main_sel",
|
||||||
|
arm_db_main_parents, 0x030, 0x034, 0x038, 24, 1,
|
||||||
|
31, 0x1C0, 15),
|
||||||
|
/* CLK_CFG_4 */
|
||||||
|
MUX_GATE_CLR_SET_UPD(CLK_TOP_ARM_DB_JTSEL, "arm_db_jtsel",
|
||||||
|
arm_db_jtsel_parents, 0x040, 0x044, 0x048, 0, 1, 7,
|
||||||
|
0x1C0, 16),
|
||||||
|
MUX_GATE_CLR_SET_UPD(CLK_TOP_NETSYS_SEL, "netsys_sel", netsys_parents,
|
||||||
|
0x040, 0x044, 0x048, 8, 1, 15, 0x1C0, 17),
|
||||||
|
MUX_GATE_CLR_SET_UPD(CLK_TOP_NETSYS_500M_SEL, "netsys_500m_sel",
|
||||||
|
netsys_500m_parents, 0x040, 0x044, 0x048, 16, 1,
|
||||||
|
23, 0x1C0, 18),
|
||||||
|
MUX_GATE_CLR_SET_UPD(CLK_TOP_NETSYS_MCU_SEL, "netsys_mcu_sel",
|
||||||
|
netsys_mcu_parents, 0x040, 0x044, 0x048, 24, 3, 31,
|
||||||
|
0x1C0, 19),
|
||||||
|
/* CLK_CFG_5 */
|
||||||
|
MUX_GATE_CLR_SET_UPD(CLK_TOP_NETSYS_2X_SEL, "netsys_2x_sel",
|
||||||
|
netsys_2x_parents, 0x050, 0x054, 0x058, 0, 2, 7,
|
||||||
|
0x1C0, 20),
|
||||||
|
MUX_GATE_CLR_SET_UPD(CLK_TOP_SGM_325M_SEL, "sgm_325m_sel",
|
||||||
|
sgm_325m_parents, 0x050, 0x054, 0x058, 8, 1, 15,
|
||||||
|
0x1C0, 21),
|
||||||
|
MUX_GATE_CLR_SET_UPD(CLK_TOP_SGM_REG_SEL, "sgm_reg_sel",
|
||||||
|
sgm_reg_parents, 0x050, 0x054, 0x058, 16, 1, 23,
|
||||||
|
0x1C0, 22),
|
||||||
|
MUX_GATE_CLR_SET_UPD(CLK_TOP_A1SYS_SEL, "a1sys_sel", a1sys_parents,
|
||||||
|
0x050, 0x054, 0x058, 24, 1, 31, 0x1C0, 23),
|
||||||
|
/* CLK_CFG_6 */
|
||||||
|
MUX_GATE_CLR_SET_UPD(CLK_TOP_CONN_MCUSYS_SEL, "conn_mcusys_sel",
|
||||||
|
conn_mcusys_parents, 0x060, 0x064, 0x068, 0, 1, 7,
|
||||||
|
0x1C0, 24),
|
||||||
|
MUX_GATE_CLR_SET_UPD(CLK_TOP_EIP_B_SEL, "eip_b_sel", eip_b_parents,
|
||||||
|
0x060, 0x064, 0x068, 8, 1, 15, 0x1C0, 25),
|
||||||
|
MUX_GATE_CLR_SET_UPD(CLK_TOP_PCIE_PHY_SEL, "pcie_phy_sel",
|
||||||
|
f_26m_adc_parents, 0x060, 0x064, 0x068, 16, 1, 23,
|
||||||
|
0x1C0, 26),
|
||||||
|
MUX_GATE_CLR_SET_UPD(CLK_TOP_USB3_PHY_SEL, "usb3_phy_sel",
|
||||||
|
f_26m_adc_parents, 0x060, 0x064, 0x068, 24, 1, 31,
|
||||||
|
0x1C0, 27),
|
||||||
|
/* CLK_CFG_7 */
|
||||||
|
MUX_GATE_CLR_SET_UPD(CLK_TOP_F26M_SEL, "csw_f26m_sel",
|
||||||
|
f_26m_adc_parents, 0x070, 0x074, 0x078, 0, 1, 7,
|
||||||
|
0x1C0, 28),
|
||||||
|
MUX_GATE_CLR_SET_UPD(CLK_TOP_AUD_L_SEL, "aud_l_sel", aud_l_parents,
|
||||||
|
0x070, 0x074, 0x078, 8, 2, 15, 0x1C0, 29),
|
||||||
|
MUX_GATE_CLR_SET_UPD(CLK_TOP_A_TUNER_SEL, "a_tuner_sel",
|
||||||
|
a_tuner_parents, 0x070, 0x074, 0x078, 16, 2, 23,
|
||||||
|
0x1C0, 30),
|
||||||
|
MUX_GATE_CLR_SET_UPD(CLK_TOP_U2U3_SEL, "u2u3_sel", f_26m_adc_parents,
|
||||||
|
0x070, 0x074, 0x078, 24, 1, 31, 0x1C4, 0),
|
||||||
|
/* CLK_CFG_8 */
|
||||||
|
MUX_GATE_CLR_SET_UPD(CLK_TOP_U2U3_SYS_SEL, "u2u3_sys_sel",
|
||||||
|
u2u3_sys_parents, 0x080, 0x084, 0x088, 0, 1, 7,
|
||||||
|
0x1C4, 1),
|
||||||
|
MUX_GATE_CLR_SET_UPD(CLK_TOP_U2U3_XHCI_SEL, "u2u3_xhci_sel",
|
||||||
|
u2u3_sys_parents, 0x080, 0x084, 0x088, 8, 1, 15,
|
||||||
|
0x1C4, 2),
|
||||||
|
MUX_GATE_CLR_SET_UPD(CLK_TOP_DA_U2_REFSEL, "da_u2_refsel",
|
||||||
|
da_u2_refsel_parents, 0x080, 0x084, 0x088, 16, 1,
|
||||||
|
23, 0x1C4, 3),
|
||||||
|
MUX_GATE_CLR_SET_UPD(CLK_TOP_DA_U2_CK_1P_SEL, "da_u2_ck_1p_sel",
|
||||||
|
da_u2_refsel_parents, 0x080, 0x084, 0x088, 24, 1,
|
||||||
|
31, 0x1C4, 4),
|
||||||
|
/* CLK_CFG_9 */
|
||||||
|
MUX_GATE_CLR_SET_UPD(CLK_TOP_AP2CNN_HOST_SEL, "ap2cnn_host_sel",
|
||||||
|
sgm_reg_parents, 0x090, 0x094, 0x098, 0, 1, 7,
|
||||||
|
0x1C4, 5),
|
||||||
|
};
|
||||||
|
|
||||||
|
static int clk_mt7986_topckgen_probe(struct platform_device *pdev)
|
||||||
|
{
|
||||||
|
struct clk_onecell_data *clk_data;
|
||||||
|
struct device_node *node = pdev->dev.of_node;
|
||||||
|
int r;
|
||||||
|
void __iomem *base;
|
||||||
|
int nr = ARRAY_SIZE(top_fixed_clks) + ARRAY_SIZE(top_divs) +
|
||||||
|
ARRAY_SIZE(top_muxes);
|
||||||
|
|
||||||
|
base = of_iomap(node, 0);
|
||||||
|
if (!base) {
|
||||||
|
pr_err("%s(): ioremap failed\n", __func__);
|
||||||
|
return -ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
|
clk_data = mtk_alloc_clk_data(nr);
|
||||||
|
if (!clk_data)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
mtk_clk_register_fixed_clks(top_fixed_clks, ARRAY_SIZE(top_fixed_clks),
|
||||||
|
clk_data);
|
||||||
|
mtk_clk_register_factors(top_divs, ARRAY_SIZE(top_divs), clk_data);
|
||||||
|
mtk_clk_register_muxes(top_muxes, ARRAY_SIZE(top_muxes), node,
|
||||||
|
&mt7986_clk_lock, clk_data);
|
||||||
|
|
||||||
|
clk_prepare_enable(clk_data->clks[CLK_TOP_SYSAXI_SEL]);
|
||||||
|
clk_prepare_enable(clk_data->clks[CLK_TOP_SYSAPB_SEL]);
|
||||||
|
clk_prepare_enable(clk_data->clks[CLK_TOP_DRAMC_SEL]);
|
||||||
|
clk_prepare_enable(clk_data->clks[CLK_TOP_DRAMC_MD32_SEL]);
|
||||||
|
clk_prepare_enable(clk_data->clks[CLK_TOP_F26M_SEL]);
|
||||||
|
clk_prepare_enable(clk_data->clks[CLK_TOP_SGM_REG_SEL]);
|
||||||
|
|
||||||
|
r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
|
||||||
|
|
||||||
|
if (r) {
|
||||||
|
pr_err("%s(): could not register clock provider: %d\n",
|
||||||
|
__func__, r);
|
||||||
|
goto free_topckgen_data;
|
||||||
|
}
|
||||||
|
return r;
|
||||||
|
|
||||||
|
free_topckgen_data:
|
||||||
|
mtk_free_clk_data(clk_data);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct of_device_id of_match_clk_mt7986_topckgen[] = {
|
||||||
|
{ .compatible = "mediatek,mt7986-topckgen", },
|
||||||
|
{}
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_driver clk_mt7986_topckgen_drv = {
|
||||||
|
.probe = clk_mt7986_topckgen_probe,
|
||||||
|
.driver = {
|
||||||
|
.name = "clk-mt7986-topckgen",
|
||||||
|
.of_match_table = of_match_clk_mt7986_topckgen,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
builtin_platform_driver(clk_mt7986_topckgen_drv);
|
@ -0,0 +1,933 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
|
/*
|
||||||
|
* The MT7986 driver based on Linux generic pinctrl binding.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2021 MediaTek Inc.
|
||||||
|
* Author: Sam Shih <sam.shih@mediatek.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "pinctrl-moore.h"
|
||||||
|
|
||||||
|
#define MT7986_PIN(_number, _name) MTK_PIN(_number, _name, 0, _number, DRV_GRP4)
|
||||||
|
#define MT7986_NOT_BALLOUT_PIN(_number) { .number = _number, .name = NULL }
|
||||||
|
|
||||||
|
#define PIN_FIELD_BASE(_s_pin, _e_pin, _i_base, _s_addr, _x_addrs, _s_bit, \
|
||||||
|
_x_bits) \
|
||||||
|
PIN_FIELD_CALC(_s_pin, _e_pin, _i_base, _s_addr, _x_addrs, _s_bit, \
|
||||||
|
_x_bits, 32, 0)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* enum - Locking variants of the iocfg bases
|
||||||
|
*
|
||||||
|
* MT7986 have multiple bases to program pin configuration listed as the below:
|
||||||
|
* iocfg_rt:0x11c30000, iocfg_rb:0x11c40000, iocfg_lt:0x11e20000,
|
||||||
|
* iocfg_lb:0x11e30000, iocfg_tr:0x11f00000, iocfg_tl:0x11f10000,
|
||||||
|
* _i_based could be used to indicate what base the pin should be mapped into.
|
||||||
|
*
|
||||||
|
* Each iocfg register base control different group of pads on the SoC
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* chip carrier
|
||||||
|
*
|
||||||
|
* A B C D E F G H
|
||||||
|
* +------------------------+
|
||||||
|
* 8 | o o o o o o o o |
|
||||||
|
* 7 | o o o o o o o o |
|
||||||
|
* 6 | o o o o o o o o |
|
||||||
|
* 5 | o o o o o o o o |
|
||||||
|
* 4 | o o o o o o o o |
|
||||||
|
* 3 | o o o o o o o o |
|
||||||
|
* 2 | o o o o o o o o |
|
||||||
|
* 1 | o o o o o o o o |
|
||||||
|
* +------------------------+
|
||||||
|
*
|
||||||
|
* inside Chip carrier
|
||||||
|
*
|
||||||
|
* A B C D E F G H
|
||||||
|
* +------------------------+
|
||||||
|
* 8 | |
|
||||||
|
* 7 | TL TR |
|
||||||
|
* 6 | +---------+ |
|
||||||
|
* 5 | LT | | RT |
|
||||||
|
* 4 | | | |
|
||||||
|
* 3 | LB | | RB |
|
||||||
|
* 2 | +---------+ |
|
||||||
|
* 1 | |
|
||||||
|
* +------------------------+
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
enum {
|
||||||
|
GPIO_BASE,
|
||||||
|
IOCFG_RT_BASE,
|
||||||
|
IOCFG_RB_BASE,
|
||||||
|
IOCFG_LT_BASE,
|
||||||
|
IOCFG_LB_BASE,
|
||||||
|
IOCFG_TR_BASE,
|
||||||
|
IOCFG_TL_BASE,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const char *const mt7986_pinctrl_register_base_names[] = {
|
||||||
|
"gpio", "iocfg_rt", "iocfg_rb", "iocfg_lt", "iocfg_lb", "iocfg_tr",
|
||||||
|
"iocfg_tl",
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct mtk_pin_field_calc mt7986_pin_mode_range[] = {
|
||||||
|
PIN_FIELD(0, 100, 0x300, 0x10, 0, 4),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct mtk_pin_field_calc mt7986_pin_dir_range[] = {
|
||||||
|
PIN_FIELD(0, 100, 0x0, 0x10, 0, 1),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct mtk_pin_field_calc mt7986_pin_di_range[] = {
|
||||||
|
PIN_FIELD(0, 100, 0x200, 0x10, 0, 1),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct mtk_pin_field_calc mt7986_pin_do_range[] = {
|
||||||
|
PIN_FIELD(0, 100, 0x100, 0x10, 0, 1),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct mtk_pin_field_calc mt7986_pin_ies_range[] = {
|
||||||
|
PIN_FIELD_BASE(0, 0, IOCFG_RB_BASE, 0x40, 0x10, 17, 1),
|
||||||
|
PIN_FIELD_BASE(1, 2, IOCFG_LT_BASE, 0x20, 0x10, 10, 1),
|
||||||
|
PIN_FIELD_BASE(3, 4, IOCFG_LB_BASE, 0x20, 0x10, 0, 1),
|
||||||
|
PIN_FIELD_BASE(5, 6, IOCFG_RB_BASE, 0x40, 0x10, 0, 1),
|
||||||
|
PIN_FIELD_BASE(7, 10, IOCFG_LT_BASE, 0x20, 0x10, 0, 1),
|
||||||
|
PIN_FIELD_BASE(11, 14, IOCFG_RB_BASE, 0x40, 0x10, 8, 1),
|
||||||
|
PIN_FIELD_BASE(15, 20, IOCFG_RB_BASE, 0x40, 0x10, 2, 1),
|
||||||
|
PIN_FIELD_BASE(21, 23, IOCFG_RT_BASE, 0x30, 0x10, 12, 1),
|
||||||
|
PIN_FIELD_BASE(24, 24, IOCFG_RT_BASE, 0x30, 0x10, 18, 1),
|
||||||
|
PIN_FIELD_BASE(25, 25, IOCFG_RT_BASE, 0x30, 0x10, 17, 1),
|
||||||
|
PIN_FIELD_BASE(26, 27, IOCFG_RT_BASE, 0x30, 0x10, 15, 1),
|
||||||
|
PIN_FIELD_BASE(28, 29, IOCFG_RT_BASE, 0x30, 0x10, 19, 1),
|
||||||
|
PIN_FIELD_BASE(30, 30, IOCFG_RT_BASE, 0x30, 0x10, 23, 1),
|
||||||
|
PIN_FIELD_BASE(31, 31, IOCFG_RT_BASE, 0x30, 0x10, 22, 1),
|
||||||
|
PIN_FIELD_BASE(32, 32, IOCFG_RT_BASE, 0x30, 0x10, 21, 1),
|
||||||
|
PIN_FIELD_BASE(33, 33, IOCFG_LT_BASE, 0x20, 0x10, 4, 1),
|
||||||
|
PIN_FIELD_BASE(34, 34, IOCFG_LT_BASE, 0x20, 0x10, 8, 1),
|
||||||
|
PIN_FIELD_BASE(35, 35, IOCFG_LT_BASE, 0x20, 0x10, 7, 1),
|
||||||
|
PIN_FIELD_BASE(36, 37, IOCFG_LT_BASE, 0x20, 0x10, 5, 1),
|
||||||
|
PIN_FIELD_BASE(38, 38, IOCFG_LT_BASE, 0x20, 0x10, 9, 1),
|
||||||
|
PIN_FIELD_BASE(39, 40, IOCFG_RB_BASE, 0x40, 0x10, 18, 1),
|
||||||
|
PIN_FIELD_BASE(41, 41, IOCFG_RB_BASE, 0x40, 0x10, 12, 1),
|
||||||
|
PIN_FIELD_BASE(42, 43, IOCFG_RB_BASE, 0x40, 0x10, 22, 1),
|
||||||
|
PIN_FIELD_BASE(44, 45, IOCFG_RB_BASE, 0x40, 0x10, 20, 1),
|
||||||
|
PIN_FIELD_BASE(46, 47, IOCFG_RB_BASE, 0x40, 0x10, 26, 1),
|
||||||
|
PIN_FIELD_BASE(48, 49, IOCFG_RB_BASE, 0x40, 0x10, 24, 1),
|
||||||
|
PIN_FIELD_BASE(50, 57, IOCFG_RT_BASE, 0x30, 0x10, 2, 1),
|
||||||
|
PIN_FIELD_BASE(58, 58, IOCFG_RT_BASE, 0x30, 0x10, 1, 1),
|
||||||
|
PIN_FIELD_BASE(59, 59, IOCFG_RT_BASE, 0x30, 0x10, 0, 1),
|
||||||
|
PIN_FIELD_BASE(60, 61, IOCFG_RT_BASE, 0x30, 0x10, 10, 1),
|
||||||
|
PIN_FIELD_BASE(62, 62, IOCFG_RB_BASE, 0x40, 0x10, 15, 1),
|
||||||
|
PIN_FIELD_BASE(63, 63, IOCFG_RB_BASE, 0x40, 0x10, 14, 1),
|
||||||
|
PIN_FIELD_BASE(64, 64, IOCFG_RB_BASE, 0x40, 0x10, 13, 1),
|
||||||
|
PIN_FIELD_BASE(65, 65, IOCFG_RB_BASE, 0x40, 0x10, 16, 1),
|
||||||
|
PIN_FIELD_BASE(66, 68, IOCFG_LB_BASE, 0x20, 0x10, 2, 1),
|
||||||
|
PIN_FIELD_BASE(69, 69, IOCFG_TR_BASE, 0x30, 0x10, 1, 1),
|
||||||
|
PIN_FIELD_BASE(70, 70, IOCFG_TR_BASE, 0x30, 0x10, 0, 1),
|
||||||
|
PIN_FIELD_BASE(71, 71, IOCFG_TR_BASE, 0x30, 0x10, 16, 1),
|
||||||
|
PIN_FIELD_BASE(72, 73, IOCFG_TR_BASE, 0x30, 0x10, 14, 1),
|
||||||
|
PIN_FIELD_BASE(74, 74, IOCFG_TR_BASE, 0x30, 0x10, 4, 1),
|
||||||
|
PIN_FIELD_BASE(75, 77, IOCFG_TR_BASE, 0x30, 0x10, 6, 1),
|
||||||
|
PIN_FIELD_BASE(78, 79, IOCFG_TR_BASE, 0x30, 0x10, 2, 1),
|
||||||
|
PIN_FIELD_BASE(80, 84, IOCFG_TR_BASE, 0x30, 0x10, 9, 1),
|
||||||
|
PIN_FIELD_BASE(85, 85, IOCFG_TR_BASE, 0x30, 0x10, 5, 1),
|
||||||
|
PIN_FIELD_BASE(86, 86, IOCFG_TL_BASE, 0x30, 0x10, 1, 1),
|
||||||
|
PIN_FIELD_BASE(87, 87, IOCFG_TL_BASE, 0x30, 0x10, 0, 1),
|
||||||
|
PIN_FIELD_BASE(88, 88, IOCFG_TL_BASE, 0x30, 0x10, 14, 1),
|
||||||
|
PIN_FIELD_BASE(89, 90, IOCFG_TL_BASE, 0x30, 0x10, 12, 1),
|
||||||
|
PIN_FIELD_BASE(91, 94, IOCFG_TL_BASE, 0x30, 0x10, 4, 1),
|
||||||
|
PIN_FIELD_BASE(95, 96, IOCFG_TL_BASE, 0x30, 0x10, 2, 1),
|
||||||
|
PIN_FIELD_BASE(97, 100, IOCFG_TL_BASE, 0x30, 0x10, 8, 1),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct mtk_pin_field_calc mt7986_pin_smt_range[] = {
|
||||||
|
PIN_FIELD_BASE(0, 0, IOCFG_RB_BASE, 0xf0, 0x10, 17, 1),
|
||||||
|
PIN_FIELD_BASE(1, 2, IOCFG_LT_BASE, 0x90, 0x10, 10, 1),
|
||||||
|
PIN_FIELD_BASE(3, 4, IOCFG_LB_BASE, 0x90, 0x10, 0, 1),
|
||||||
|
PIN_FIELD_BASE(5, 6, IOCFG_RB_BASE, 0xf0, 0x10, 0, 1),
|
||||||
|
PIN_FIELD_BASE(7, 10, IOCFG_LT_BASE, 0x90, 0x10, 0, 1),
|
||||||
|
PIN_FIELD_BASE(11, 14, IOCFG_RB_BASE, 0xf0, 0x10, 8, 1),
|
||||||
|
PIN_FIELD_BASE(15, 20, IOCFG_RB_BASE, 0xf0, 0x10, 2, 1),
|
||||||
|
PIN_FIELD_BASE(21, 23, IOCFG_RT_BASE, 0xc0, 0x10, 12, 1),
|
||||||
|
PIN_FIELD_BASE(24, 24, IOCFG_RT_BASE, 0xc0, 0x10, 18, 1),
|
||||||
|
PIN_FIELD_BASE(25, 25, IOCFG_RT_BASE, 0xc0, 0x10, 17, 1),
|
||||||
|
PIN_FIELD_BASE(26, 27, IOCFG_RT_BASE, 0xc0, 0x10, 15, 1),
|
||||||
|
PIN_FIELD_BASE(28, 29, IOCFG_RT_BASE, 0xc0, 0x10, 19, 1),
|
||||||
|
PIN_FIELD_BASE(30, 30, IOCFG_RT_BASE, 0xc0, 0x10, 23, 1),
|
||||||
|
PIN_FIELD_BASE(31, 31, IOCFG_RT_BASE, 0xc0, 0x10, 22, 1),
|
||||||
|
PIN_FIELD_BASE(32, 32, IOCFG_RT_BASE, 0xc0, 0x10, 21, 1),
|
||||||
|
PIN_FIELD_BASE(33, 33, IOCFG_LT_BASE, 0x90, 0x10, 4, 1),
|
||||||
|
PIN_FIELD_BASE(34, 34, IOCFG_LT_BASE, 0x90, 0x10, 8, 1),
|
||||||
|
PIN_FIELD_BASE(35, 35, IOCFG_LT_BASE, 0x90, 0x10, 7, 1),
|
||||||
|
PIN_FIELD_BASE(36, 37, IOCFG_LT_BASE, 0x90, 0x10, 5, 1),
|
||||||
|
PIN_FIELD_BASE(38, 38, IOCFG_LT_BASE, 0x90, 0x10, 9, 1),
|
||||||
|
PIN_FIELD_BASE(39, 40, IOCFG_RB_BASE, 0xf0, 0x10, 18, 1),
|
||||||
|
PIN_FIELD_BASE(41, 41, IOCFG_RB_BASE, 0xf0, 0x10, 12, 1),
|
||||||
|
PIN_FIELD_BASE(42, 43, IOCFG_RB_BASE, 0xf0, 0x10, 22, 1),
|
||||||
|
PIN_FIELD_BASE(44, 45, IOCFG_RB_BASE, 0xf0, 0x10, 20, 1),
|
||||||
|
PIN_FIELD_BASE(46, 47, IOCFG_RB_BASE, 0xf0, 0x10, 26, 1),
|
||||||
|
PIN_FIELD_BASE(48, 49, IOCFG_RB_BASE, 0xf0, 0x10, 24, 1),
|
||||||
|
PIN_FIELD_BASE(50, 57, IOCFG_RT_BASE, 0xc0, 0x10, 2, 1),
|
||||||
|
PIN_FIELD_BASE(58, 58, IOCFG_RT_BASE, 0xc0, 0x10, 1, 1),
|
||||||
|
PIN_FIELD_BASE(59, 59, IOCFG_RT_BASE, 0xc0, 0x10, 0, 1),
|
||||||
|
PIN_FIELD_BASE(60, 61, IOCFG_RT_BASE, 0xc0, 0x10, 10, 1),
|
||||||
|
PIN_FIELD_BASE(62, 62, IOCFG_RB_BASE, 0xf0, 0x10, 15, 1),
|
||||||
|
PIN_FIELD_BASE(63, 63, IOCFG_RB_BASE, 0xf0, 0x10, 14, 1),
|
||||||
|
PIN_FIELD_BASE(64, 64, IOCFG_RB_BASE, 0xf0, 0x10, 13, 1),
|
||||||
|
PIN_FIELD_BASE(65, 65, IOCFG_RB_BASE, 0xf0, 0x10, 16, 1),
|
||||||
|
PIN_FIELD_BASE(66, 68, IOCFG_LB_BASE, 0x90, 0x10, 2, 1),
|
||||||
|
PIN_FIELD_BASE(69, 69, IOCFG_TR_BASE, 0x80, 0x10, 1, 1),
|
||||||
|
PIN_FIELD_BASE(70, 70, IOCFG_TR_BASE, 0x80, 0x10, 0, 1),
|
||||||
|
PIN_FIELD_BASE(71, 71, IOCFG_TR_BASE, 0x80, 0x10, 16, 1),
|
||||||
|
PIN_FIELD_BASE(72, 73, IOCFG_TR_BASE, 0x80, 0x10, 14, 1),
|
||||||
|
PIN_FIELD_BASE(74, 74, IOCFG_TR_BASE, 0x80, 0x10, 4, 1),
|
||||||
|
PIN_FIELD_BASE(75, 77, IOCFG_TR_BASE, 0x80, 0x10, 6, 1),
|
||||||
|
PIN_FIELD_BASE(78, 79, IOCFG_TR_BASE, 0x80, 0x10, 2, 1),
|
||||||
|
PIN_FIELD_BASE(80, 84, IOCFG_TR_BASE, 0x80, 0x10, 9, 1),
|
||||||
|
PIN_FIELD_BASE(85, 85, IOCFG_TR_BASE, 0x80, 0x10, 5, 1),
|
||||||
|
PIN_FIELD_BASE(86, 86, IOCFG_TL_BASE, 0x70, 0x10, 1, 1),
|
||||||
|
PIN_FIELD_BASE(87, 87, IOCFG_TL_BASE, 0x70, 0x10, 0, 1),
|
||||||
|
PIN_FIELD_BASE(88, 88, IOCFG_TL_BASE, 0x70, 0x10, 14, 1),
|
||||||
|
PIN_FIELD_BASE(89, 90, IOCFG_TL_BASE, 0x70, 0x10, 12, 1),
|
||||||
|
PIN_FIELD_BASE(91, 94, IOCFG_TL_BASE, 0x70, 0x10, 4, 1),
|
||||||
|
PIN_FIELD_BASE(95, 96, IOCFG_TL_BASE, 0x70, 0x10, 2, 1),
|
||||||
|
PIN_FIELD_BASE(97, 100, IOCFG_TL_BASE, 0x70, 0x10, 8, 1),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct mtk_pin_field_calc mt7986_pin_pu_range[] = {
|
||||||
|
PIN_FIELD_BASE(69, 69, IOCFG_TR_BASE, 0x50, 0x10, 1, 1),
|
||||||
|
PIN_FIELD_BASE(70, 70, IOCFG_TR_BASE, 0x50, 0x10, 0, 1),
|
||||||
|
PIN_FIELD_BASE(71, 71, IOCFG_TR_BASE, 0x50, 0x10, 16, 1),
|
||||||
|
PIN_FIELD_BASE(72, 73, IOCFG_TR_BASE, 0x50, 0x10, 14, 1),
|
||||||
|
PIN_FIELD_BASE(74, 74, IOCFG_TR_BASE, 0x50, 0x10, 4, 1),
|
||||||
|
PIN_FIELD_BASE(75, 77, IOCFG_TR_BASE, 0x50, 0x10, 6, 1),
|
||||||
|
PIN_FIELD_BASE(78, 79, IOCFG_TR_BASE, 0x50, 0x10, 2, 1),
|
||||||
|
PIN_FIELD_BASE(80, 84, IOCFG_TR_BASE, 0x50, 0x10, 9, 1),
|
||||||
|
PIN_FIELD_BASE(85, 85, IOCFG_TR_BASE, 0x50, 0x10, 5, 1),
|
||||||
|
PIN_FIELD_BASE(86, 86, IOCFG_TL_BASE, 0x50, 0x10, 1, 1),
|
||||||
|
PIN_FIELD_BASE(87, 87, IOCFG_TL_BASE, 0x50, 0x10, 0, 1),
|
||||||
|
PIN_FIELD_BASE(88, 88, IOCFG_TL_BASE, 0x50, 0x10, 14, 1),
|
||||||
|
PIN_FIELD_BASE(89, 90, IOCFG_TL_BASE, 0x50, 0x10, 12, 1),
|
||||||
|
PIN_FIELD_BASE(91, 94, IOCFG_TL_BASE, 0x50, 0x10, 4, 1),
|
||||||
|
PIN_FIELD_BASE(95, 96, IOCFG_TL_BASE, 0x50, 0x10, 2, 1),
|
||||||
|
PIN_FIELD_BASE(97, 100, IOCFG_TL_BASE, 0x50, 0x10, 8, 1),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct mtk_pin_field_calc mt7986_pin_pd_range[] = {
|
||||||
|
PIN_FIELD_BASE(69, 69, IOCFG_TR_BASE, 0x40, 0x10, 1, 1),
|
||||||
|
PIN_FIELD_BASE(70, 70, IOCFG_TR_BASE, 0x40, 0x10, 0, 1),
|
||||||
|
PIN_FIELD_BASE(71, 71, IOCFG_TR_BASE, 0x40, 0x10, 16, 1),
|
||||||
|
PIN_FIELD_BASE(72, 73, IOCFG_TR_BASE, 0x40, 0x10, 14, 1),
|
||||||
|
PIN_FIELD_BASE(74, 74, IOCFG_TR_BASE, 0x40, 0x10, 4, 1),
|
||||||
|
PIN_FIELD_BASE(75, 77, IOCFG_TR_BASE, 0x40, 0x10, 6, 1),
|
||||||
|
PIN_FIELD_BASE(78, 79, IOCFG_TR_BASE, 0x40, 0x10, 2, 1),
|
||||||
|
PIN_FIELD_BASE(80, 84, IOCFG_TR_BASE, 0x40, 0x10, 9, 1),
|
||||||
|
PIN_FIELD_BASE(85, 85, IOCFG_TR_BASE, 0x40, 0x10, 5, 1),
|
||||||
|
PIN_FIELD_BASE(86, 86, IOCFG_TL_BASE, 0x40, 0x10, 1, 1),
|
||||||
|
PIN_FIELD_BASE(87, 87, IOCFG_TL_BASE, 0x40, 0x10, 0, 1),
|
||||||
|
PIN_FIELD_BASE(88, 88, IOCFG_TL_BASE, 0x40, 0x10, 14, 1),
|
||||||
|
PIN_FIELD_BASE(89, 90, IOCFG_TL_BASE, 0x40, 0x10, 12, 1),
|
||||||
|
PIN_FIELD_BASE(91, 94, IOCFG_TL_BASE, 0x40, 0x10, 4, 1),
|
||||||
|
PIN_FIELD_BASE(95, 96, IOCFG_TL_BASE, 0x40, 0x10, 2, 1),
|
||||||
|
PIN_FIELD_BASE(97, 100, IOCFG_TL_BASE, 0x40, 0x10, 8, 1),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct mtk_pin_field_calc mt7986_pin_drv_range[] = {
|
||||||
|
PIN_FIELD_BASE(0, 0, IOCFG_RB_BASE, 0x10, 0x10, 21, 3),
|
||||||
|
PIN_FIELD_BASE(1, 2, IOCFG_LT_BASE, 0x10, 0x10, 0, 3),
|
||||||
|
PIN_FIELD_BASE(3, 4, IOCFG_LB_BASE, 0x00, 0x10, 0, 1),
|
||||||
|
PIN_FIELD_BASE(5, 5, IOCFG_RB_BASE, 0x00, 0x10, 0, 3),
|
||||||
|
PIN_FIELD_BASE(6, 6, IOCFG_RB_BASE, 0x00, 0x10, 21, 3),
|
||||||
|
PIN_FIELD_BASE(7, 10, IOCFG_LT_BASE, 0x00, 0x10, 0, 3),
|
||||||
|
PIN_FIELD_BASE(11, 12, IOCFG_RB_BASE, 0x00, 0x10, 24, 3),
|
||||||
|
PIN_FIELD_BASE(13, 14, IOCFG_RB_BASE, 0x10, 0x10, 0, 3),
|
||||||
|
PIN_FIELD_BASE(15, 20, IOCFG_RB_BASE, 0x00, 0x10, 3, 3),
|
||||||
|
PIN_FIELD_BASE(21, 23, IOCFG_RT_BASE, 0x10, 0x10, 6, 3),
|
||||||
|
PIN_FIELD_BASE(24, 24, IOCFG_RT_BASE, 0x10, 0x10, 24, 3),
|
||||||
|
PIN_FIELD_BASE(25, 25, IOCFG_RT_BASE, 0x10, 0x10, 21, 3),
|
||||||
|
PIN_FIELD_BASE(26, 27, IOCFG_RT_BASE, 0x10, 0x10, 15, 3),
|
||||||
|
PIN_FIELD_BASE(28, 28, IOCFG_RT_BASE, 0x10, 0x10, 27, 3),
|
||||||
|
PIN_FIELD_BASE(29, 29, IOCFG_RT_BASE, 0x20, 0x10, 0, 3),
|
||||||
|
PIN_FIELD_BASE(30, 30, IOCFG_RT_BASE, 0x20, 0x10, 9, 3),
|
||||||
|
PIN_FIELD_BASE(31, 31, IOCFG_RT_BASE, 0x20, 0x10, 6, 3),
|
||||||
|
PIN_FIELD_BASE(32, 32, IOCFG_RT_BASE, 0x20, 0x10, 3, 3),
|
||||||
|
PIN_FIELD_BASE(33, 33, IOCFG_LT_BASE, 0x00, 0x10, 12, 3),
|
||||||
|
PIN_FIELD_BASE(34, 34, IOCFG_LT_BASE, 0x00, 0x10, 24, 3),
|
||||||
|
PIN_FIELD_BASE(35, 35, IOCFG_LT_BASE, 0x00, 0x10, 21, 3),
|
||||||
|
PIN_FIELD_BASE(36, 37, IOCFG_LT_BASE, 0x00, 0x10, 15, 3),
|
||||||
|
PIN_FIELD_BASE(38, 38, IOCFG_LT_BASE, 0x00, 0x10, 27, 3),
|
||||||
|
PIN_FIELD_BASE(39, 39, IOCFG_RB_BASE, 0x10, 0x10, 27, 3),
|
||||||
|
PIN_FIELD_BASE(40, 40, IOCFG_RB_BASE, 0x20, 0x10, 0, 3),
|
||||||
|
PIN_FIELD_BASE(41, 41, IOCFG_RB_BASE, 0x10, 0x10, 6, 3),
|
||||||
|
PIN_FIELD_BASE(42, 43, IOCFG_RB_BASE, 0x20, 0x10, 9, 3),
|
||||||
|
PIN_FIELD_BASE(44, 45, IOCFG_RB_BASE, 0x20, 0x10, 3, 3),
|
||||||
|
PIN_FIELD_BASE(46, 47, IOCFG_RB_BASE, 0x20, 0x10, 21, 3),
|
||||||
|
PIN_FIELD_BASE(48, 49, IOCFG_RB_BASE, 0x20, 0x10, 15, 3),
|
||||||
|
PIN_FIELD_BASE(50, 57, IOCFG_RT_BASE, 0x00, 0x10, 6, 3),
|
||||||
|
PIN_FIELD_BASE(58, 58, IOCFG_RT_BASE, 0x00, 0x10, 3, 3),
|
||||||
|
PIN_FIELD_BASE(59, 59, IOCFG_RT_BASE, 0x00, 0x10, 0, 3),
|
||||||
|
PIN_FIELD_BASE(60, 61, IOCFG_RT_BASE, 0x10, 0x10, 0, 3),
|
||||||
|
PIN_FIELD_BASE(62, 62, IOCFG_RB_BASE, 0x10, 0x10, 15, 3),
|
||||||
|
PIN_FIELD_BASE(63, 63, IOCFG_RB_BASE, 0x10, 0x10, 12, 3),
|
||||||
|
PIN_FIELD_BASE(64, 64, IOCFG_RB_BASE, 0x10, 0x10, 9, 3),
|
||||||
|
PIN_FIELD_BASE(65, 65, IOCFG_RB_BASE, 0x10, 0x10, 18, 3),
|
||||||
|
PIN_FIELD_BASE(66, 68, IOCFG_LB_BASE, 0x00, 0x10, 2, 3),
|
||||||
|
PIN_FIELD_BASE(69, 69, IOCFG_TR_BASE, 0x00, 0x10, 3, 3),
|
||||||
|
PIN_FIELD_BASE(70, 70, IOCFG_TR_BASE, 0x00, 0x10, 0, 3),
|
||||||
|
PIN_FIELD_BASE(71, 71, IOCFG_TR_BASE, 0x10, 0x10, 18, 3),
|
||||||
|
PIN_FIELD_BASE(72, 73, IOCFG_TR_BASE, 0x10, 0x10, 12, 3),
|
||||||
|
PIN_FIELD_BASE(74, 77, IOCFG_TR_BASE, 0x00, 0x10, 15, 3),
|
||||||
|
PIN_FIELD_BASE(78, 79, IOCFG_TR_BASE, 0x00, 0x10, 6, 3),
|
||||||
|
PIN_FIELD_BASE(80, 80, IOCFG_TR_BASE, 0x00, 0x10, 27, 3),
|
||||||
|
PIN_FIELD_BASE(81, 84, IOCFG_TR_BASE, 0x10, 0x10, 0, 3),
|
||||||
|
PIN_FIELD_BASE(85, 85, IOCFG_TR_BASE, 0x00, 0x10, 12, 3),
|
||||||
|
PIN_FIELD_BASE(86, 86, IOCFG_TL_BASE, 0x00, 0x10, 3, 3),
|
||||||
|
PIN_FIELD_BASE(87, 87, IOCFG_TL_BASE, 0x00, 0x10, 0, 3),
|
||||||
|
PIN_FIELD_BASE(88, 88, IOCFG_TL_BASE, 0x10, 0x10, 12, 3),
|
||||||
|
PIN_FIELD_BASE(89, 90, IOCFG_TL_BASE, 0x10, 0x10, 6, 3),
|
||||||
|
PIN_FIELD_BASE(91, 94, IOCFG_TL_BASE, 0x00, 0x10, 12, 3),
|
||||||
|
PIN_FIELD_BASE(95, 96, IOCFG_TL_BASE, 0x00, 0x10, 6, 3),
|
||||||
|
PIN_FIELD_BASE(97, 98, IOCFG_TL_BASE, 0x00, 0x10, 24, 3),
|
||||||
|
PIN_FIELD_BASE(99, 100, IOCFG_TL_BASE, 0x10, 0x10, 2, 3),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct mtk_pin_field_calc mt7986_pin_pupd_range[] = {
|
||||||
|
PIN_FIELD_BASE(0, 0, IOCFG_RB_BASE, 0x60, 0x10, 17, 1),
|
||||||
|
PIN_FIELD_BASE(1, 2, IOCFG_LT_BASE, 0x30, 0x10, 10, 1),
|
||||||
|
PIN_FIELD_BASE(3, 4, IOCFG_LB_BASE, 0x40, 0x10, 0, 1),
|
||||||
|
PIN_FIELD_BASE(5, 6, IOCFG_RB_BASE, 0x60, 0x10, 0, 1),
|
||||||
|
PIN_FIELD_BASE(7, 10, IOCFG_LT_BASE, 0x30, 0x10, 0, 1),
|
||||||
|
PIN_FIELD_BASE(11, 14, IOCFG_RB_BASE, 0x60, 0x10, 8, 1),
|
||||||
|
PIN_FIELD_BASE(15, 20, IOCFG_RB_BASE, 0x60, 0x10, 2, 1),
|
||||||
|
PIN_FIELD_BASE(21, 23, IOCFG_RT_BASE, 0x40, 0x10, 12, 1),
|
||||||
|
PIN_FIELD_BASE(24, 24, IOCFG_RT_BASE, 0x40, 0x10, 18, 1),
|
||||||
|
PIN_FIELD_BASE(25, 25, IOCFG_RT_BASE, 0x40, 0x10, 17, 1),
|
||||||
|
PIN_FIELD_BASE(26, 27, IOCFG_RT_BASE, 0x40, 0x10, 15, 1),
|
||||||
|
PIN_FIELD_BASE(28, 29, IOCFG_RT_BASE, 0x40, 0x10, 19, 1),
|
||||||
|
PIN_FIELD_BASE(30, 30, IOCFG_RT_BASE, 0x40, 0x10, 23, 1),
|
||||||
|
PIN_FIELD_BASE(31, 31, IOCFG_RT_BASE, 0x40, 0x10, 22, 1),
|
||||||
|
PIN_FIELD_BASE(32, 32, IOCFG_RT_BASE, 0x40, 0x10, 21, 1),
|
||||||
|
PIN_FIELD_BASE(33, 33, IOCFG_LT_BASE, 0x30, 0x10, 4, 1),
|
||||||
|
PIN_FIELD_BASE(34, 34, IOCFG_LT_BASE, 0x30, 0x10, 8, 1),
|
||||||
|
PIN_FIELD_BASE(35, 35, IOCFG_LT_BASE, 0x30, 0x10, 7, 1),
|
||||||
|
PIN_FIELD_BASE(36, 37, IOCFG_LT_BASE, 0x30, 0x10, 5, 1),
|
||||||
|
PIN_FIELD_BASE(38, 38, IOCFG_LT_BASE, 0x30, 0x10, 9, 1),
|
||||||
|
PIN_FIELD_BASE(39, 40, IOCFG_RB_BASE, 0x60, 0x10, 18, 1),
|
||||||
|
PIN_FIELD_BASE(41, 41, IOCFG_RB_BASE, 0x60, 0x10, 12, 1),
|
||||||
|
PIN_FIELD_BASE(42, 43, IOCFG_RB_BASE, 0x60, 0x10, 22, 1),
|
||||||
|
PIN_FIELD_BASE(44, 45, IOCFG_RB_BASE, 0x60, 0x10, 20, 1),
|
||||||
|
PIN_FIELD_BASE(46, 47, IOCFG_RB_BASE, 0x60, 0x10, 26, 1),
|
||||||
|
PIN_FIELD_BASE(48, 49, IOCFG_RB_BASE, 0x60, 0x10, 24, 1),
|
||||||
|
PIN_FIELD_BASE(50, 57, IOCFG_RT_BASE, 0x40, 0x10, 2, 1),
|
||||||
|
PIN_FIELD_BASE(58, 58, IOCFG_RT_BASE, 0x40, 0x10, 1, 1),
|
||||||
|
PIN_FIELD_BASE(59, 59, IOCFG_RT_BASE, 0x40, 0x10, 0, 1),
|
||||||
|
PIN_FIELD_BASE(60, 61, IOCFG_RT_BASE, 0x40, 0x10, 10, 1),
|
||||||
|
PIN_FIELD_BASE(62, 62, IOCFG_RB_BASE, 0x60, 0x10, 15, 1),
|
||||||
|
PIN_FIELD_BASE(63, 63, IOCFG_RB_BASE, 0x60, 0x10, 14, 1),
|
||||||
|
PIN_FIELD_BASE(64, 64, IOCFG_RB_BASE, 0x60, 0x10, 13, 1),
|
||||||
|
PIN_FIELD_BASE(65, 65, IOCFG_RB_BASE, 0x60, 0x10, 16, 1),
|
||||||
|
PIN_FIELD_BASE(66, 68, IOCFG_LB_BASE, 0x40, 0x10, 2, 1),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct mtk_pin_field_calc mt7986_pin_r0_range[] = {
|
||||||
|
PIN_FIELD_BASE(0, 0, IOCFG_RB_BASE, 0x70, 0x10, 17, 1),
|
||||||
|
PIN_FIELD_BASE(1, 2, IOCFG_LT_BASE, 0x40, 0x10, 10, 1),
|
||||||
|
PIN_FIELD_BASE(3, 4, IOCFG_LB_BASE, 0x50, 0x10, 0, 1),
|
||||||
|
PIN_FIELD_BASE(5, 6, IOCFG_RB_BASE, 0x70, 0x10, 0, 1),
|
||||||
|
PIN_FIELD_BASE(7, 10, IOCFG_LT_BASE, 0x40, 0x10, 0, 1),
|
||||||
|
PIN_FIELD_BASE(11, 14, IOCFG_RB_BASE, 0x70, 0x10, 8, 1),
|
||||||
|
PIN_FIELD_BASE(15, 20, IOCFG_RB_BASE, 0x70, 0x10, 2, 1),
|
||||||
|
PIN_FIELD_BASE(21, 23, IOCFG_RT_BASE, 0x50, 0x10, 12, 1),
|
||||||
|
PIN_FIELD_BASE(24, 24, IOCFG_RT_BASE, 0x50, 0x10, 18, 1),
|
||||||
|
PIN_FIELD_BASE(25, 25, IOCFG_RT_BASE, 0x50, 0x10, 17, 1),
|
||||||
|
PIN_FIELD_BASE(26, 27, IOCFG_RT_BASE, 0x50, 0x10, 15, 1),
|
||||||
|
PIN_FIELD_BASE(28, 29, IOCFG_RT_BASE, 0x50, 0x10, 19, 1),
|
||||||
|
PIN_FIELD_BASE(30, 30, IOCFG_RT_BASE, 0x50, 0x10, 23, 1),
|
||||||
|
PIN_FIELD_BASE(31, 31, IOCFG_RT_BASE, 0x50, 0x10, 22, 1),
|
||||||
|
PIN_FIELD_BASE(32, 32, IOCFG_RT_BASE, 0x50, 0x10, 21, 1),
|
||||||
|
PIN_FIELD_BASE(33, 33, IOCFG_LT_BASE, 0x40, 0x10, 4, 1),
|
||||||
|
PIN_FIELD_BASE(34, 34, IOCFG_LT_BASE, 0x40, 0x10, 8, 1),
|
||||||
|
PIN_FIELD_BASE(35, 35, IOCFG_LT_BASE, 0x40, 0x10, 7, 1),
|
||||||
|
PIN_FIELD_BASE(36, 37, IOCFG_LT_BASE, 0x40, 0x10, 5, 1),
|
||||||
|
PIN_FIELD_BASE(38, 38, IOCFG_LT_BASE, 0x40, 0x10, 9, 1),
|
||||||
|
PIN_FIELD_BASE(39, 40, IOCFG_RB_BASE, 0x70, 0x10, 18, 1),
|
||||||
|
PIN_FIELD_BASE(41, 41, IOCFG_RB_BASE, 0x70, 0x10, 12, 1),
|
||||||
|
PIN_FIELD_BASE(42, 43, IOCFG_RB_BASE, 0x70, 0x10, 22, 1),
|
||||||
|
PIN_FIELD_BASE(44, 45, IOCFG_RB_BASE, 0x70, 0x10, 20, 1),
|
||||||
|
PIN_FIELD_BASE(46, 47, IOCFG_RB_BASE, 0x70, 0x10, 26, 1),
|
||||||
|
PIN_FIELD_BASE(48, 49, IOCFG_RB_BASE, 0x70, 0x10, 24, 1),
|
||||||
|
PIN_FIELD_BASE(50, 57, IOCFG_RT_BASE, 0x50, 0x10, 2, 1),
|
||||||
|
PIN_FIELD_BASE(58, 58, IOCFG_RT_BASE, 0x50, 0x10, 1, 1),
|
||||||
|
PIN_FIELD_BASE(59, 59, IOCFG_RT_BASE, 0x50, 0x10, 0, 1),
|
||||||
|
PIN_FIELD_BASE(60, 61, IOCFG_RT_BASE, 0x50, 0x10, 10, 1),
|
||||||
|
PIN_FIELD_BASE(62, 62, IOCFG_RB_BASE, 0x70, 0x10, 15, 1),
|
||||||
|
PIN_FIELD_BASE(63, 63, IOCFG_RB_BASE, 0x70, 0x10, 14, 1),
|
||||||
|
PIN_FIELD_BASE(64, 64, IOCFG_RB_BASE, 0x70, 0x10, 13, 1),
|
||||||
|
PIN_FIELD_BASE(65, 65, IOCFG_RB_BASE, 0x70, 0x10, 16, 1),
|
||||||
|
PIN_FIELD_BASE(66, 68, IOCFG_LB_BASE, 0x50, 0x10, 2, 1),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct mtk_pin_field_calc mt7986_pin_r1_range[] = {
|
||||||
|
PIN_FIELD_BASE(0, 0, IOCFG_RB_BASE, 0x80, 0x10, 17, 1),
|
||||||
|
PIN_FIELD_BASE(1, 2, IOCFG_LT_BASE, 0x50, 0x10, 10, 1),
|
||||||
|
PIN_FIELD_BASE(3, 4, IOCFG_LB_BASE, 0x60, 0x10, 0, 1),
|
||||||
|
PIN_FIELD_BASE(5, 6, IOCFG_RB_BASE, 0x80, 0x10, 0, 1),
|
||||||
|
PIN_FIELD_BASE(7, 10, IOCFG_LT_BASE, 0x50, 0x10, 0, 1),
|
||||||
|
PIN_FIELD_BASE(11, 14, IOCFG_RB_BASE, 0x80, 0x10, 8, 1),
|
||||||
|
PIN_FIELD_BASE(15, 20, IOCFG_RB_BASE, 0x80, 0x10, 2, 1),
|
||||||
|
PIN_FIELD_BASE(21, 23, IOCFG_RT_BASE, 0x60, 0x10, 12, 1),
|
||||||
|
PIN_FIELD_BASE(24, 24, IOCFG_RT_BASE, 0x60, 0x10, 18, 1),
|
||||||
|
PIN_FIELD_BASE(25, 25, IOCFG_RT_BASE, 0x60, 0x10, 17, 1),
|
||||||
|
PIN_FIELD_BASE(26, 27, IOCFG_RT_BASE, 0x60, 0x10, 15, 1),
|
||||||
|
PIN_FIELD_BASE(28, 29, IOCFG_RT_BASE, 0x60, 0x10, 19, 1),
|
||||||
|
PIN_FIELD_BASE(30, 30, IOCFG_RT_BASE, 0x60, 0x10, 23, 1),
|
||||||
|
PIN_FIELD_BASE(31, 31, IOCFG_RT_BASE, 0x60, 0x10, 22, 1),
|
||||||
|
PIN_FIELD_BASE(32, 32, IOCFG_RT_BASE, 0x60, 0x10, 21, 1),
|
||||||
|
PIN_FIELD_BASE(33, 33, IOCFG_LT_BASE, 0x50, 0x10, 4, 1),
|
||||||
|
PIN_FIELD_BASE(34, 34, IOCFG_LT_BASE, 0x50, 0x10, 8, 1),
|
||||||
|
PIN_FIELD_BASE(35, 35, IOCFG_LT_BASE, 0x50, 0x10, 7, 1),
|
||||||
|
PIN_FIELD_BASE(36, 37, IOCFG_LT_BASE, 0x50, 0x10, 5, 1),
|
||||||
|
PIN_FIELD_BASE(38, 38, IOCFG_LT_BASE, 0x50, 0x10, 9, 1),
|
||||||
|
PIN_FIELD_BASE(39, 40, IOCFG_RB_BASE, 0x80, 0x10, 18, 1),
|
||||||
|
PIN_FIELD_BASE(41, 41, IOCFG_RB_BASE, 0x80, 0x10, 12, 1),
|
||||||
|
PIN_FIELD_BASE(42, 43, IOCFG_RB_BASE, 0x80, 0x10, 22, 1),
|
||||||
|
PIN_FIELD_BASE(44, 45, IOCFG_RB_BASE, 0x80, 0x10, 20, 1),
|
||||||
|
PIN_FIELD_BASE(46, 47, IOCFG_RB_BASE, 0x80, 0x10, 26, 1),
|
||||||
|
PIN_FIELD_BASE(48, 49, IOCFG_RB_BASE, 0x80, 0x10, 24, 1),
|
||||||
|
PIN_FIELD_BASE(50, 57, IOCFG_RT_BASE, 0x60, 0x10, 2, 1),
|
||||||
|
PIN_FIELD_BASE(58, 58, IOCFG_RT_BASE, 0x60, 0x10, 1, 1),
|
||||||
|
PIN_FIELD_BASE(59, 59, IOCFG_RT_BASE, 0x60, 0x10, 0, 1),
|
||||||
|
PIN_FIELD_BASE(60, 61, IOCFG_RT_BASE, 0x60, 0x10, 10, 1),
|
||||||
|
PIN_FIELD_BASE(62, 62, IOCFG_RB_BASE, 0x80, 0x10, 15, 1),
|
||||||
|
PIN_FIELD_BASE(63, 63, IOCFG_RB_BASE, 0x80, 0x10, 14, 1),
|
||||||
|
PIN_FIELD_BASE(64, 64, IOCFG_RB_BASE, 0x80, 0x10, 13, 1),
|
||||||
|
PIN_FIELD_BASE(65, 65, IOCFG_RB_BASE, 0x80, 0x10, 16, 1),
|
||||||
|
PIN_FIELD_BASE(66, 68, IOCFG_LB_BASE, 0x60, 0x10, 2, 1),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct mtk_pin_reg_calc mt7986_reg_cals[] = {
|
||||||
|
[PINCTRL_PIN_REG_MODE] = MTK_RANGE(mt7986_pin_mode_range),
|
||||||
|
[PINCTRL_PIN_REG_DIR] = MTK_RANGE(mt7986_pin_dir_range),
|
||||||
|
[PINCTRL_PIN_REG_DI] = MTK_RANGE(mt7986_pin_di_range),
|
||||||
|
[PINCTRL_PIN_REG_DO] = MTK_RANGE(mt7986_pin_do_range),
|
||||||
|
[PINCTRL_PIN_REG_SMT] = MTK_RANGE(mt7986_pin_smt_range),
|
||||||
|
[PINCTRL_PIN_REG_IES] = MTK_RANGE(mt7986_pin_ies_range),
|
||||||
|
[PINCTRL_PIN_REG_DRV] = MTK_RANGE(mt7986_pin_drv_range),
|
||||||
|
[PINCTRL_PIN_REG_PU] = MTK_RANGE(mt7986_pin_pu_range),
|
||||||
|
[PINCTRL_PIN_REG_PD] = MTK_RANGE(mt7986_pin_pd_range),
|
||||||
|
[PINCTRL_PIN_REG_PUPD] = MTK_RANGE(mt7986_pin_pupd_range),
|
||||||
|
[PINCTRL_PIN_REG_R0] = MTK_RANGE(mt7986_pin_r0_range),
|
||||||
|
[PINCTRL_PIN_REG_R1] = MTK_RANGE(mt7986_pin_r1_range),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct mtk_pin_desc mt7986a_pins[] = {
|
||||||
|
MT7986_PIN(0, "SYS_WATCHDOG"),
|
||||||
|
MT7986_PIN(1, "WF2G_LED"),
|
||||||
|
MT7986_PIN(2, "WF5G_LED"),
|
||||||
|
MT7986_PIN(3, "I2C_SCL"),
|
||||||
|
MT7986_PIN(4, "I2C_SDA"),
|
||||||
|
MT7986_PIN(5, "GPIO_0"),
|
||||||
|
MT7986_PIN(6, "GPIO_1"),
|
||||||
|
MT7986_PIN(7, "GPIO_2"),
|
||||||
|
MT7986_PIN(8, "GPIO_3"),
|
||||||
|
MT7986_PIN(9, "GPIO_4"),
|
||||||
|
MT7986_PIN(10, "GPIO_5"),
|
||||||
|
MT7986_PIN(11, "GPIO_6"),
|
||||||
|
MT7986_PIN(12, "GPIO_7"),
|
||||||
|
MT7986_PIN(13, "GPIO_8"),
|
||||||
|
MT7986_PIN(14, "GPIO_9"),
|
||||||
|
MT7986_PIN(15, "GPIO_10"),
|
||||||
|
MT7986_PIN(16, "GPIO_11"),
|
||||||
|
MT7986_PIN(17, "GPIO_12"),
|
||||||
|
MT7986_PIN(18, "GPIO_13"),
|
||||||
|
MT7986_PIN(19, "GPIO_14"),
|
||||||
|
MT7986_PIN(20, "GPIO_15"),
|
||||||
|
MT7986_PIN(21, "PWM0"),
|
||||||
|
MT7986_PIN(22, "PWM1"),
|
||||||
|
MT7986_PIN(23, "SPI0_CLK"),
|
||||||
|
MT7986_PIN(24, "SPI0_MOSI"),
|
||||||
|
MT7986_PIN(25, "SPI0_MISO"),
|
||||||
|
MT7986_PIN(26, "SPI0_CS"),
|
||||||
|
MT7986_PIN(27, "SPI0_HOLD"),
|
||||||
|
MT7986_PIN(28, "SPI0_WP"),
|
||||||
|
MT7986_PIN(29, "SPI1_CLK"),
|
||||||
|
MT7986_PIN(30, "SPI1_MOSI"),
|
||||||
|
MT7986_PIN(31, "SPI1_MISO"),
|
||||||
|
MT7986_PIN(32, "SPI1_CS"),
|
||||||
|
MT7986_PIN(33, "SPI2_CLK"),
|
||||||
|
MT7986_PIN(34, "SPI2_MOSI"),
|
||||||
|
MT7986_PIN(35, "SPI2_MISO"),
|
||||||
|
MT7986_PIN(36, "SPI2_CS"),
|
||||||
|
MT7986_PIN(37, "SPI2_HOLD"),
|
||||||
|
MT7986_PIN(38, "SPI2_WP"),
|
||||||
|
MT7986_PIN(39, "UART0_RXD"),
|
||||||
|
MT7986_PIN(40, "UART0_TXD"),
|
||||||
|
MT7986_PIN(41, "PCIE_PERESET_N"),
|
||||||
|
MT7986_PIN(42, "UART1_RXD"),
|
||||||
|
MT7986_PIN(43, "UART1_TXD"),
|
||||||
|
MT7986_PIN(44, "UART1_CTS"),
|
||||||
|
MT7986_PIN(45, "UART1_RTS"),
|
||||||
|
MT7986_PIN(46, "UART2_RXD"),
|
||||||
|
MT7986_PIN(47, "UART2_TXD"),
|
||||||
|
MT7986_PIN(48, "UART2_CTS"),
|
||||||
|
MT7986_PIN(49, "UART2_RTS"),
|
||||||
|
MT7986_PIN(50, "EMMC_DATA_0"),
|
||||||
|
MT7986_PIN(51, "EMMC_DATA_1"),
|
||||||
|
MT7986_PIN(52, "EMMC_DATA_2"),
|
||||||
|
MT7986_PIN(53, "EMMC_DATA_3"),
|
||||||
|
MT7986_PIN(54, "EMMC_DATA_4"),
|
||||||
|
MT7986_PIN(55, "EMMC_DATA_5"),
|
||||||
|
MT7986_PIN(56, "EMMC_DATA_6"),
|
||||||
|
MT7986_PIN(57, "EMMC_DATA_7"),
|
||||||
|
MT7986_PIN(58, "EMMC_CMD"),
|
||||||
|
MT7986_PIN(59, "EMMC_CK"),
|
||||||
|
MT7986_PIN(60, "EMMC_DSL"),
|
||||||
|
MT7986_PIN(61, "EMMC_RSTB"),
|
||||||
|
MT7986_PIN(62, "PCM_DTX"),
|
||||||
|
MT7986_PIN(63, "PCM_DRX"),
|
||||||
|
MT7986_PIN(64, "PCM_CLK"),
|
||||||
|
MT7986_PIN(65, "PCM_FS"),
|
||||||
|
MT7986_PIN(66, "MT7531_INT"),
|
||||||
|
MT7986_PIN(67, "SMI_MDC"),
|
||||||
|
MT7986_PIN(68, "SMI_MDIO"),
|
||||||
|
MT7986_PIN(69, "WF0_DIG_RESETB"),
|
||||||
|
MT7986_PIN(70, "WF0_CBA_RESETB"),
|
||||||
|
MT7986_PIN(71, "WF0_XO_REQ"),
|
||||||
|
MT7986_PIN(72, "WF0_TOP_CLK"),
|
||||||
|
MT7986_PIN(73, "WF0_TOP_DATA"),
|
||||||
|
MT7986_PIN(74, "WF0_HB1"),
|
||||||
|
MT7986_PIN(75, "WF0_HB2"),
|
||||||
|
MT7986_PIN(76, "WF0_HB3"),
|
||||||
|
MT7986_PIN(77, "WF0_HB4"),
|
||||||
|
MT7986_PIN(78, "WF0_HB0"),
|
||||||
|
MT7986_PIN(79, "WF0_HB0_B"),
|
||||||
|
MT7986_PIN(80, "WF0_HB5"),
|
||||||
|
MT7986_PIN(81, "WF0_HB6"),
|
||||||
|
MT7986_PIN(82, "WF0_HB7"),
|
||||||
|
MT7986_PIN(83, "WF0_HB8"),
|
||||||
|
MT7986_PIN(84, "WF0_HB9"),
|
||||||
|
MT7986_PIN(85, "WF0_HB10"),
|
||||||
|
MT7986_PIN(86, "WF1_DIG_RESETB"),
|
||||||
|
MT7986_PIN(87, "WF1_CBA_RESETB"),
|
||||||
|
MT7986_PIN(88, "WF1_XO_REQ"),
|
||||||
|
MT7986_PIN(89, "WF1_TOP_CLK"),
|
||||||
|
MT7986_PIN(90, "WF1_TOP_DATA"),
|
||||||
|
MT7986_PIN(91, "WF1_HB1"),
|
||||||
|
MT7986_PIN(92, "WF1_HB2"),
|
||||||
|
MT7986_PIN(93, "WF1_HB3"),
|
||||||
|
MT7986_PIN(94, "WF1_HB4"),
|
||||||
|
MT7986_PIN(95, "WF1_HB0"),
|
||||||
|
MT7986_PIN(96, "WF1_HB0_B"),
|
||||||
|
MT7986_PIN(97, "WF1_HB5"),
|
||||||
|
MT7986_PIN(98, "WF1_HB6"),
|
||||||
|
MT7986_PIN(99, "WF1_HB7"),
|
||||||
|
MT7986_PIN(100, "WF1_HB8"),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct mtk_pin_desc mt7986b_pins[] = {
|
||||||
|
MT7986_PIN(0, "SYS_WATCHDOG"),
|
||||||
|
MT7986_PIN(1, "WF2G_LED"),
|
||||||
|
MT7986_PIN(2, "WF5G_LED"),
|
||||||
|
MT7986_PIN(3, "I2C_SCL"),
|
||||||
|
MT7986_PIN(4, "I2C_SDA"),
|
||||||
|
MT7986_PIN(5, "GPIO_0"),
|
||||||
|
MT7986_PIN(6, "GPIO_1"),
|
||||||
|
MT7986_PIN(7, "GPIO_2"),
|
||||||
|
MT7986_PIN(8, "GPIO_3"),
|
||||||
|
MT7986_PIN(9, "GPIO_4"),
|
||||||
|
MT7986_PIN(10, "GPIO_5"),
|
||||||
|
MT7986_PIN(11, "GPIO_6"),
|
||||||
|
MT7986_PIN(12, "GPIO_7"),
|
||||||
|
MT7986_PIN(13, "GPIO_8"),
|
||||||
|
MT7986_PIN(14, "GPIO_9"),
|
||||||
|
MT7986_PIN(15, "GPIO_10"),
|
||||||
|
MT7986_PIN(16, "GPIO_11"),
|
||||||
|
MT7986_PIN(17, "GPIO_12"),
|
||||||
|
MT7986_PIN(18, "GPIO_13"),
|
||||||
|
MT7986_PIN(19, "GPIO_14"),
|
||||||
|
MT7986_PIN(20, "GPIO_15"),
|
||||||
|
MT7986_PIN(21, "PWM0"),
|
||||||
|
MT7986_PIN(22, "PWM1"),
|
||||||
|
MT7986_PIN(23, "SPI0_CLK"),
|
||||||
|
MT7986_PIN(24, "SPI0_MOSI"),
|
||||||
|
MT7986_PIN(25, "SPI0_MISO"),
|
||||||
|
MT7986_PIN(26, "SPI0_CS"),
|
||||||
|
MT7986_PIN(27, "SPI0_HOLD"),
|
||||||
|
MT7986_PIN(28, "SPI0_WP"),
|
||||||
|
MT7986_PIN(29, "SPI1_CLK"),
|
||||||
|
MT7986_PIN(30, "SPI1_MOSI"),
|
||||||
|
MT7986_PIN(31, "SPI1_MISO"),
|
||||||
|
MT7986_PIN(32, "SPI1_CS"),
|
||||||
|
MT7986_PIN(33, "SPI2_CLK"),
|
||||||
|
MT7986_PIN(34, "SPI2_MOSI"),
|
||||||
|
MT7986_PIN(35, "SPI2_MISO"),
|
||||||
|
MT7986_PIN(36, "SPI2_CS"),
|
||||||
|
MT7986_PIN(37, "SPI2_HOLD"),
|
||||||
|
MT7986_PIN(38, "SPI2_WP"),
|
||||||
|
MT7986_PIN(39, "UART0_RXD"),
|
||||||
|
MT7986_PIN(40, "UART0_TXD"),
|
||||||
|
MT7986_NOT_BALLOUT_PIN(41),
|
||||||
|
MT7986_NOT_BALLOUT_PIN(42),
|
||||||
|
MT7986_NOT_BALLOUT_PIN(43),
|
||||||
|
MT7986_NOT_BALLOUT_PIN(44),
|
||||||
|
MT7986_NOT_BALLOUT_PIN(45),
|
||||||
|
MT7986_NOT_BALLOUT_PIN(46),
|
||||||
|
MT7986_NOT_BALLOUT_PIN(47),
|
||||||
|
MT7986_NOT_BALLOUT_PIN(48),
|
||||||
|
MT7986_NOT_BALLOUT_PIN(49),
|
||||||
|
MT7986_NOT_BALLOUT_PIN(50),
|
||||||
|
MT7986_NOT_BALLOUT_PIN(51),
|
||||||
|
MT7986_NOT_BALLOUT_PIN(52),
|
||||||
|
MT7986_NOT_BALLOUT_PIN(53),
|
||||||
|
MT7986_NOT_BALLOUT_PIN(54),
|
||||||
|
MT7986_NOT_BALLOUT_PIN(55),
|
||||||
|
MT7986_NOT_BALLOUT_PIN(56),
|
||||||
|
MT7986_NOT_BALLOUT_PIN(57),
|
||||||
|
MT7986_NOT_BALLOUT_PIN(58),
|
||||||
|
MT7986_NOT_BALLOUT_PIN(59),
|
||||||
|
MT7986_NOT_BALLOUT_PIN(60),
|
||||||
|
MT7986_NOT_BALLOUT_PIN(61),
|
||||||
|
MT7986_NOT_BALLOUT_PIN(62),
|
||||||
|
MT7986_NOT_BALLOUT_PIN(63),
|
||||||
|
MT7986_NOT_BALLOUT_PIN(64),
|
||||||
|
MT7986_NOT_BALLOUT_PIN(65),
|
||||||
|
MT7986_PIN(66, "MT7531_INT"),
|
||||||
|
MT7986_PIN(67, "SMI_MDC"),
|
||||||
|
MT7986_PIN(68, "SMI_MDIO"),
|
||||||
|
MT7986_PIN(69, "WF0_DIG_RESETB"),
|
||||||
|
MT7986_PIN(70, "WF0_CBA_RESETB"),
|
||||||
|
MT7986_PIN(71, "WF0_XO_REQ"),
|
||||||
|
MT7986_PIN(72, "WF0_TOP_CLK"),
|
||||||
|
MT7986_PIN(73, "WF0_TOP_DATA"),
|
||||||
|
MT7986_PIN(74, "WF0_HB1"),
|
||||||
|
MT7986_PIN(75, "WF0_HB2"),
|
||||||
|
MT7986_PIN(76, "WF0_HB3"),
|
||||||
|
MT7986_PIN(77, "WF0_HB4"),
|
||||||
|
MT7986_PIN(78, "WF0_HB0"),
|
||||||
|
MT7986_PIN(79, "WF0_HB0_B"),
|
||||||
|
MT7986_PIN(80, "WF0_HB5"),
|
||||||
|
MT7986_PIN(81, "WF0_HB6"),
|
||||||
|
MT7986_PIN(82, "WF0_HB7"),
|
||||||
|
MT7986_PIN(83, "WF0_HB8"),
|
||||||
|
MT7986_PIN(84, "WF0_HB9"),
|
||||||
|
MT7986_PIN(85, "WF0_HB10"),
|
||||||
|
MT7986_PIN(86, "WF1_DIG_RESETB"),
|
||||||
|
MT7986_PIN(87, "WF1_CBA_RESETB"),
|
||||||
|
MT7986_PIN(88, "WF1_XO_REQ"),
|
||||||
|
MT7986_PIN(89, "WF1_TOP_CLK"),
|
||||||
|
MT7986_PIN(90, "WF1_TOP_DATA"),
|
||||||
|
MT7986_PIN(91, "WF1_HB1"),
|
||||||
|
MT7986_PIN(92, "WF1_HB2"),
|
||||||
|
MT7986_PIN(93, "WF1_HB3"),
|
||||||
|
MT7986_PIN(94, "WF1_HB4"),
|
||||||
|
MT7986_PIN(95, "WF1_HB0"),
|
||||||
|
MT7986_PIN(96, "WF1_HB0_B"),
|
||||||
|
MT7986_PIN(97, "WF1_HB5"),
|
||||||
|
MT7986_PIN(98, "WF1_HB6"),
|
||||||
|
MT7986_PIN(99, "WF1_HB7"),
|
||||||
|
MT7986_PIN(100, "WF1_HB8"),
|
||||||
|
};
|
||||||
|
|
||||||
|
/* List all groups consisting of these pins dedicated to the enablement of
|
||||||
|
* certain hardware block and the corresponding mode for all of the pins.
|
||||||
|
* The hardware probably has multiple combinations of these pinouts.
|
||||||
|
*/
|
||||||
|
|
||||||
|
static int mt7986_watchdog_pins[] = { 0, };
|
||||||
|
static int mt7986_watchdog_funcs[] = { 1, };
|
||||||
|
|
||||||
|
static int mt7986_wifi_led_pins[] = { 1, 2, };
|
||||||
|
static int mt7986_wifi_led_funcs[] = { 1, 1, };
|
||||||
|
|
||||||
|
static int mt7986_i2c_pins[] = { 3, 4, };
|
||||||
|
static int mt7986_i2c_funcs[] = { 1, 1, };
|
||||||
|
|
||||||
|
static int mt7986_uart1_0_pins[] = { 7, 8, 9, 10, };
|
||||||
|
static int mt7986_uart1_0_funcs[] = { 3, 3, 3, 3, };
|
||||||
|
|
||||||
|
static int mt7986_spi1_0_pins[] = { 11, 12, 13, 14, };
|
||||||
|
static int mt7986_spi1_0_funcs[] = { 3, 3, 3, 3, };
|
||||||
|
|
||||||
|
static int mt7986_pwm1_1_pins[] = { 20, };
|
||||||
|
static int mt7986_pwm1_1_funcs[] = { 2, };
|
||||||
|
|
||||||
|
static int mt7986_pwm0_pins[] = { 21, };
|
||||||
|
static int mt7986_pwm0_funcs[] = { 1, };
|
||||||
|
|
||||||
|
static int mt7986_pwm1_0_pins[] = { 22, };
|
||||||
|
static int mt7986_pwm1_0_funcs[] = { 1, };
|
||||||
|
|
||||||
|
static int mt7986_emmc_45_pins[] = {
|
||||||
|
22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, };
|
||||||
|
static int mt7986_emmc_45_funcs[] = { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, };
|
||||||
|
|
||||||
|
static int mt7986_snfi_pins[] = { 23, 24, 25, 26, 27, 28, };
|
||||||
|
static int mt7986_snfi_funcs[] = { 1, 1, 1, 1, 1, 1, };
|
||||||
|
|
||||||
|
static int mt7986_spi1_1_pins[] = { 23, 24, 25, 26, };
|
||||||
|
static int mt7986_spi1_1_funcs[] = { 3, 3, 3, 3, };
|
||||||
|
|
||||||
|
static int mt7986_uart1_1_pins[] = { 23, 24, 25, 26, };
|
||||||
|
static int mt7986_uart1_1_funcs[] = { 4, 4, 4, 4, };
|
||||||
|
|
||||||
|
static int mt7986_spi1_2_pins[] = { 29, 30, 31, 32, };
|
||||||
|
static int mt7986_spi1_2_funcs[] = { 1, 1, 1, 1, };
|
||||||
|
|
||||||
|
static int mt7986_uart1_2_pins[] = { 29, 30, 31, 32, };
|
||||||
|
static int mt7986_uart1_2_funcs[] = { 3, 3, 3, 3, };
|
||||||
|
|
||||||
|
static int mt7986_uart2_0_pins[] = { 29, 30, 31, 32, };
|
||||||
|
static int mt7986_uart2_0_funcs[] = { 4, 4, 4, 4, };
|
||||||
|
|
||||||
|
static int mt7986_spi0_pins[] = { 33, 34, 35, 36, };
|
||||||
|
static int mt7986_spi0_funcs[] = { 1, 1, 1, 1, };
|
||||||
|
|
||||||
|
static int mt7986_spi0_wp_hold_pins[] = { 37, 38, };
|
||||||
|
static int mt7986_spi0_wp_hold_funcs[] = { 1, 1, };
|
||||||
|
|
||||||
|
static int mt7986_uart2_1_pins[] = { 33, 34, 35, 36, };
|
||||||
|
static int mt7986_uart2_1_funcs[] = { 3, 3, 3, 3, };
|
||||||
|
|
||||||
|
static int mt7986_uart1_3_rx_tx_pins[] = { 35, 36, };
|
||||||
|
static int mt7986_uart1_3_rx_tx_funcs[] = { 2, 2, };
|
||||||
|
|
||||||
|
static int mt7986_uart1_3_cts_rts_pins[] = { 37, 38, };
|
||||||
|
static int mt7986_uart1_3_cts_rts_funcs[] = { 2, 2, };
|
||||||
|
|
||||||
|
static int mt7986_spi1_3_pins[] = { 33, 34, 35, 36, };
|
||||||
|
static int mt7986_spi1_3_funcs[] = { 4, 4, 4, 4, };
|
||||||
|
|
||||||
|
static int mt7986_uart0_pins[] = { 39, 40, };
|
||||||
|
static int mt7986_uart0_funcs[] = { 1, 1, };
|
||||||
|
|
||||||
|
static int mt7986_pcie_reset_pins[] = { 41, };
|
||||||
|
static int mt7986_pcie_reset_funcs[] = { 1, };
|
||||||
|
|
||||||
|
static int mt7986_uart1_pins[] = { 42, 43, 44, 45, };
|
||||||
|
static int mt7986_uart1_funcs[] = { 1, 1, 1, 1, };
|
||||||
|
|
||||||
|
static int mt7986_uart2_pins[] = { 46, 47, 48, 49, };
|
||||||
|
static int mt7986_uart2_funcs[] = { 1, 1, 1, 1, };
|
||||||
|
|
||||||
|
static int mt7986_emmc_51_pins[] = {
|
||||||
|
50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, };
|
||||||
|
static int mt7986_emmc_51_funcs[] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, };
|
||||||
|
|
||||||
|
static int mt7986_pcm_pins[] = { 62, 63, 64, 65, };
|
||||||
|
static int mt7986_pcm_funcs[] = { 1, 1, 1, 1, };
|
||||||
|
|
||||||
|
static int mt7986_i2s_pins[] = { 62, 63, 64, 65, };
|
||||||
|
static int mt7986_i2s_funcs[] = { 1, 1, 1, 1, };
|
||||||
|
|
||||||
|
static int mt7986_switch_int_pins[] = { 66, };
|
||||||
|
static int mt7986_switch_int_funcs[] = { 1, };
|
||||||
|
|
||||||
|
static int mt7986_mdc_mdio_pins[] = { 67, 68, };
|
||||||
|
static int mt7986_mdc_mdio_funcs[] = { 1, 1, };
|
||||||
|
|
||||||
|
static int mt7986_wf_2g_pins[] = {74, 75, 76, 77, 78, 79, 80, 81, 82, 83, };
|
||||||
|
static int mt7986_wf_2g_funcs[] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, };
|
||||||
|
|
||||||
|
static int mt7986_wf_5g_pins[] = {91, 92, 93, 94, 95, 96, 97, 98, 99, 100, };
|
||||||
|
static int mt7986_wf_5g_funcs[] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, };
|
||||||
|
|
||||||
|
static int mt7986_wf_dbdc_pins[] = {
|
||||||
|
74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, };
|
||||||
|
static int mt7986_wf_dbdc_funcs[] = {
|
||||||
|
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, };
|
||||||
|
|
||||||
|
static int mt7986_pcie_clk_pins[] = { 9, };
|
||||||
|
static int mt7986_pcie_clk_funcs[] = { 1, };
|
||||||
|
|
||||||
|
static int mt7986_pcie_wake_pins[] = { 10, };
|
||||||
|
static int mt7986_pcie_wake_funcs[] = { 1, };
|
||||||
|
|
||||||
|
static int mt7986_jtag_pins[] = { 11, 12, 13, 14, 15};
|
||||||
|
static int mt7986_jtag_funcs[] = { 1, 1, 1, 1, 1};
|
||||||
|
|
||||||
|
static const struct group_desc mt7986_groups[] = {
|
||||||
|
PINCTRL_PIN_GROUP("watchdog", mt7986_watchdog),
|
||||||
|
PINCTRL_PIN_GROUP("wifi_led", mt7986_wifi_led),
|
||||||
|
PINCTRL_PIN_GROUP("i2c", mt7986_i2c),
|
||||||
|
PINCTRL_PIN_GROUP("uart1_0", mt7986_uart1_0),
|
||||||
|
PINCTRL_PIN_GROUP("pcie_clk", mt7986_pcie_clk),
|
||||||
|
PINCTRL_PIN_GROUP("pcie_wake", mt7986_pcie_wake),
|
||||||
|
PINCTRL_PIN_GROUP("spi1_0", mt7986_spi1_0),
|
||||||
|
PINCTRL_PIN_GROUP("pwm1_1", mt7986_pwm1_1),
|
||||||
|
PINCTRL_PIN_GROUP("pwm0", mt7986_pwm0),
|
||||||
|
PINCTRL_PIN_GROUP("pwm1_0", mt7986_pwm1_0),
|
||||||
|
PINCTRL_PIN_GROUP("emmc_45", mt7986_emmc_45),
|
||||||
|
PINCTRL_PIN_GROUP("snfi", mt7986_snfi),
|
||||||
|
PINCTRL_PIN_GROUP("spi1_1", mt7986_spi1_1),
|
||||||
|
PINCTRL_PIN_GROUP("uart1_1", mt7986_uart1_1),
|
||||||
|
PINCTRL_PIN_GROUP("spi1_2", mt7986_spi1_2),
|
||||||
|
PINCTRL_PIN_GROUP("uart1_2", mt7986_uart1_2),
|
||||||
|
PINCTRL_PIN_GROUP("uart2_0", mt7986_uart2_0),
|
||||||
|
PINCTRL_PIN_GROUP("spi0", mt7986_spi0),
|
||||||
|
PINCTRL_PIN_GROUP("spi0_wp_hold", mt7986_spi0_wp_hold),
|
||||||
|
PINCTRL_PIN_GROUP("uart2_1", mt7986_uart2_1),
|
||||||
|
PINCTRL_PIN_GROUP("uart1_3_rx_tx", mt7986_uart1_3_rx_tx),
|
||||||
|
PINCTRL_PIN_GROUP("uart1_3_cts_rts", mt7986_uart1_3_cts_rts),
|
||||||
|
PINCTRL_PIN_GROUP("spi1_3", mt7986_spi1_3),
|
||||||
|
PINCTRL_PIN_GROUP("uart0", mt7986_uart0),
|
||||||
|
PINCTRL_PIN_GROUP("switch_int", mt7986_switch_int),
|
||||||
|
PINCTRL_PIN_GROUP("mdc_mdio", mt7986_mdc_mdio),
|
||||||
|
PINCTRL_PIN_GROUP("pcie_pereset", mt7986_pcie_reset),
|
||||||
|
PINCTRL_PIN_GROUP("uart1", mt7986_uart1),
|
||||||
|
PINCTRL_PIN_GROUP("uart2", mt7986_uart2),
|
||||||
|
PINCTRL_PIN_GROUP("emmc_51", mt7986_emmc_51),
|
||||||
|
PINCTRL_PIN_GROUP("pcm", mt7986_pcm),
|
||||||
|
PINCTRL_PIN_GROUP("i2s", mt7986_i2s),
|
||||||
|
PINCTRL_PIN_GROUP("wf_2g", mt7986_wf_2g),
|
||||||
|
PINCTRL_PIN_GROUP("wf_5g", mt7986_wf_5g),
|
||||||
|
PINCTRL_PIN_GROUP("wf_dbdc", mt7986_wf_dbdc),
|
||||||
|
PINCTRL_PIN_GROUP("jtag", mt7986_jtag),
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Joint those groups owning the same capability in user point of view which
|
||||||
|
* allows that people tend to use through the device tree.
|
||||||
|
*/
|
||||||
|
|
||||||
|
static const char *mt7986_audio_groups[] = { "pcm", "i2s" };
|
||||||
|
static const char *mt7986_emmc_groups[] = {
|
||||||
|
"emmc_45", "emmc_51", };
|
||||||
|
static const char *mt7986_ethernet_groups[] = {
|
||||||
|
"switch_int", "mdc_mdio", };
|
||||||
|
static const char *mt7986_i2c_groups[] = { "i2c", };
|
||||||
|
static const char *mt7986_led_groups[] = { "wifi_led", };
|
||||||
|
static const char *mt7986_flash_groups[] = { "snfi", };
|
||||||
|
static const char *mt7986_pcie_groups[] = {
|
||||||
|
"pcie_clk", "pcie_wake", "pcie_pereset" };
|
||||||
|
static const char *mt7986_pwm_groups[] = { "pwm0", "pwm1_0", "pwm1_1", };
|
||||||
|
static const char *mt7986_spi_groups[] = {
|
||||||
|
"spi0", "spi0_wp_hold", "spi1_0", "spi1_1", "spi1_2", "spi1_3", };
|
||||||
|
static const char *mt7986_uart_groups[] = {
|
||||||
|
"uart1_0", "uart1_1", "uart1_2", "uart1_3_rx_tx", "uart1_3_cts_rts",
|
||||||
|
"uart2_0", "uart2_1", "uart0", "uart1", "uart2",
|
||||||
|
};
|
||||||
|
static const char *mt7986_wdt_groups[] = { "watchdog", };
|
||||||
|
static const char *mt7986_wf_groups[] = { "wf_2g", "wf_5g", "wf_dbdc", };
|
||||||
|
static const char *mt7986_jtag_groups[] = { "jtag", };
|
||||||
|
|
||||||
|
static const struct function_desc mt7986_functions[] = {
|
||||||
|
{"audio", mt7986_audio_groups, ARRAY_SIZE(mt7986_audio_groups)},
|
||||||
|
{"emmc", mt7986_emmc_groups, ARRAY_SIZE(mt7986_emmc_groups)},
|
||||||
|
{"eth", mt7986_ethernet_groups, ARRAY_SIZE(mt7986_ethernet_groups)},
|
||||||
|
{"i2c", mt7986_i2c_groups, ARRAY_SIZE(mt7986_i2c_groups)},
|
||||||
|
{"led", mt7986_led_groups, ARRAY_SIZE(mt7986_led_groups)},
|
||||||
|
{"flash", mt7986_flash_groups, ARRAY_SIZE(mt7986_flash_groups)},
|
||||||
|
{"pcie", mt7986_pcie_groups, ARRAY_SIZE(mt7986_pcie_groups)},
|
||||||
|
{"pwm", mt7986_pwm_groups, ARRAY_SIZE(mt7986_pwm_groups)},
|
||||||
|
{"spi", mt7986_spi_groups, ARRAY_SIZE(mt7986_spi_groups)},
|
||||||
|
{"uart", mt7986_uart_groups, ARRAY_SIZE(mt7986_uart_groups)},
|
||||||
|
{"watchdog", mt7986_wdt_groups, ARRAY_SIZE(mt7986_wdt_groups)},
|
||||||
|
{"wifi", mt7986_wf_groups, ARRAY_SIZE(mt7986_wf_groups)},
|
||||||
|
{"jtag", mt7986_jtag_groups, ARRAY_SIZE(mt7986_jtag_groups)},
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct mtk_eint_hw mt7986a_eint_hw = {
|
||||||
|
.port_mask = 7,
|
||||||
|
.ports = 7,
|
||||||
|
.ap_num = ARRAY_SIZE(mt7986a_pins),
|
||||||
|
.db_cnt = 16,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct mtk_eint_hw mt7986b_eint_hw = {
|
||||||
|
.port_mask = 7,
|
||||||
|
.ports = 7,
|
||||||
|
.ap_num = ARRAY_SIZE(mt7986b_pins),
|
||||||
|
.db_cnt = 16,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct mtk_pin_soc mt7986a_data = {
|
||||||
|
.reg_cal = mt7986_reg_cals,
|
||||||
|
.pins = mt7986a_pins,
|
||||||
|
.npins = ARRAY_SIZE(mt7986a_pins),
|
||||||
|
.grps = mt7986_groups,
|
||||||
|
.ngrps = ARRAY_SIZE(mt7986_groups),
|
||||||
|
.funcs = mt7986_functions,
|
||||||
|
.nfuncs = ARRAY_SIZE(mt7986_functions),
|
||||||
|
.eint_hw = &mt7986a_eint_hw,
|
||||||
|
.gpio_m = 0,
|
||||||
|
.ies_present = false,
|
||||||
|
.base_names = mt7986_pinctrl_register_base_names,
|
||||||
|
.nbase_names = ARRAY_SIZE(mt7986_pinctrl_register_base_names),
|
||||||
|
.bias_set_combo = mtk_pinconf_bias_set_combo,
|
||||||
|
.bias_get_combo = mtk_pinconf_bias_get_combo,
|
||||||
|
.drive_set = mtk_pinconf_drive_set_rev1,
|
||||||
|
.drive_get = mtk_pinconf_drive_get_rev1,
|
||||||
|
.adv_pull_get = mtk_pinconf_adv_pull_get,
|
||||||
|
.adv_pull_set = mtk_pinconf_adv_pull_set,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct mtk_pin_soc mt7986b_data = {
|
||||||
|
.reg_cal = mt7986_reg_cals,
|
||||||
|
.pins = mt7986b_pins,
|
||||||
|
.npins = ARRAY_SIZE(mt7986b_pins),
|
||||||
|
.grps = mt7986_groups,
|
||||||
|
.ngrps = ARRAY_SIZE(mt7986_groups),
|
||||||
|
.funcs = mt7986_functions,
|
||||||
|
.nfuncs = ARRAY_SIZE(mt7986_functions),
|
||||||
|
.eint_hw = &mt7986b_eint_hw,
|
||||||
|
.gpio_m = 0,
|
||||||
|
.ies_present = false,
|
||||||
|
.base_names = mt7986_pinctrl_register_base_names,
|
||||||
|
.nbase_names = ARRAY_SIZE(mt7986_pinctrl_register_base_names),
|
||||||
|
.bias_set_combo = mtk_pinconf_bias_set_combo,
|
||||||
|
.bias_get_combo = mtk_pinconf_bias_get_combo,
|
||||||
|
.drive_set = mtk_pinconf_drive_set_rev1,
|
||||||
|
.drive_get = mtk_pinconf_drive_get_rev1,
|
||||||
|
.adv_pull_get = mtk_pinconf_adv_pull_get,
|
||||||
|
.adv_pull_set = mtk_pinconf_adv_pull_set,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct of_device_id mt7986a_pinctrl_of_match[] = {
|
||||||
|
{.compatible = "mediatek,mt7986a-pinctrl",},
|
||||||
|
{}
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct of_device_id mt7986b_pinctrl_of_match[] = {
|
||||||
|
{.compatible = "mediatek,mt7986b-pinctrl",},
|
||||||
|
{}
|
||||||
|
};
|
||||||
|
|
||||||
|
static int mt7986a_pinctrl_probe(struct platform_device *pdev)
|
||||||
|
{
|
||||||
|
return mtk_moore_pinctrl_probe(pdev, &mt7986a_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int mt7986b_pinctrl_probe(struct platform_device *pdev)
|
||||||
|
{
|
||||||
|
return mtk_moore_pinctrl_probe(pdev, &mt7986b_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct platform_driver mt7986a_pinctrl_driver = {
|
||||||
|
.driver = {
|
||||||
|
.name = "mt7986a-pinctrl",
|
||||||
|
.of_match_table = mt7986a_pinctrl_of_match,
|
||||||
|
},
|
||||||
|
.probe = mt7986a_pinctrl_probe,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_driver mt7986b_pinctrl_driver = {
|
||||||
|
.driver = {
|
||||||
|
.name = "mt7986b-pinctrl",
|
||||||
|
.of_match_table = mt7986b_pinctrl_of_match,
|
||||||
|
},
|
||||||
|
.probe = mt7986b_pinctrl_probe,
|
||||||
|
};
|
||||||
|
|
||||||
|
static int __init mt7986a_pinctrl_init(void)
|
||||||
|
{
|
||||||
|
return platform_driver_register(&mt7986a_pinctrl_driver);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int __init mt7986b_pinctrl_init(void)
|
||||||
|
{
|
||||||
|
return platform_driver_register(&mt7986b_pinctrl_driver);
|
||||||
|
}
|
||||||
|
|
||||||
|
arch_initcall(mt7986a_pinctrl_init);
|
||||||
|
arch_initcall(mt7986b_pinctrl_init);
|
@ -0,0 +1,169 @@
|
|||||||
|
/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2021 MediaTek Inc.
|
||||||
|
* Author: Sam Shih <sam.shih@mediatek.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _DT_BINDINGS_CLK_MT7986_H
|
||||||
|
#define _DT_BINDINGS_CLK_MT7986_H
|
||||||
|
|
||||||
|
/* APMIXEDSYS */
|
||||||
|
|
||||||
|
#define CLK_APMIXED_ARMPLL 0
|
||||||
|
#define CLK_APMIXED_NET2PLL 1
|
||||||
|
#define CLK_APMIXED_MMPLL 2
|
||||||
|
#define CLK_APMIXED_SGMPLL 3
|
||||||
|
#define CLK_APMIXED_WEDMCUPLL 4
|
||||||
|
#define CLK_APMIXED_NET1PLL 5
|
||||||
|
#define CLK_APMIXED_MPLL 6
|
||||||
|
#define CLK_APMIXED_APLL2 7
|
||||||
|
|
||||||
|
/* TOPCKGEN */
|
||||||
|
|
||||||
|
#define CLK_TOP_XTAL 0
|
||||||
|
#define CLK_TOP_XTAL_D2 1
|
||||||
|
#define CLK_TOP_RTC_32K 2
|
||||||
|
#define CLK_TOP_RTC_32P7K 3
|
||||||
|
#define CLK_TOP_MPLL_D2 4
|
||||||
|
#define CLK_TOP_MPLL_D4 5
|
||||||
|
#define CLK_TOP_MPLL_D8 6
|
||||||
|
#define CLK_TOP_MPLL_D8_D2 7
|
||||||
|
#define CLK_TOP_MPLL_D3_D2 8
|
||||||
|
#define CLK_TOP_MMPLL_D2 9
|
||||||
|
#define CLK_TOP_MMPLL_D4 10
|
||||||
|
#define CLK_TOP_MMPLL_D8 11
|
||||||
|
#define CLK_TOP_MMPLL_D8_D2 12
|
||||||
|
#define CLK_TOP_MMPLL_D3_D8 13
|
||||||
|
#define CLK_TOP_MMPLL_U2PHY 14
|
||||||
|
#define CLK_TOP_APLL2_D4 15
|
||||||
|
#define CLK_TOP_NET1PLL_D4 16
|
||||||
|
#define CLK_TOP_NET1PLL_D5 17
|
||||||
|
#define CLK_TOP_NET1PLL_D5_D2 18
|
||||||
|
#define CLK_TOP_NET1PLL_D5_D4 19
|
||||||
|
#define CLK_TOP_NET1PLL_D8_D2 20
|
||||||
|
#define CLK_TOP_NET1PLL_D8_D4 21
|
||||||
|
#define CLK_TOP_NET2PLL_D4 22
|
||||||
|
#define CLK_TOP_NET2PLL_D4_D2 23
|
||||||
|
#define CLK_TOP_NET2PLL_D3_D2 24
|
||||||
|
#define CLK_TOP_WEDMCUPLL_D5_D2 25
|
||||||
|
#define CLK_TOP_NFI1X_SEL 26
|
||||||
|
#define CLK_TOP_SPINFI_SEL 27
|
||||||
|
#define CLK_TOP_SPI_SEL 28
|
||||||
|
#define CLK_TOP_SPIM_MST_SEL 29
|
||||||
|
#define CLK_TOP_UART_SEL 30
|
||||||
|
#define CLK_TOP_PWM_SEL 31
|
||||||
|
#define CLK_TOP_I2C_SEL 32
|
||||||
|
#define CLK_TOP_PEXTP_TL_SEL 33
|
||||||
|
#define CLK_TOP_EMMC_250M_SEL 34
|
||||||
|
#define CLK_TOP_EMMC_416M_SEL 35
|
||||||
|
#define CLK_TOP_F_26M_ADC_SEL 36
|
||||||
|
#define CLK_TOP_DRAMC_SEL 37
|
||||||
|
#define CLK_TOP_DRAMC_MD32_SEL 38
|
||||||
|
#define CLK_TOP_SYSAXI_SEL 39
|
||||||
|
#define CLK_TOP_SYSAPB_SEL 40
|
||||||
|
#define CLK_TOP_ARM_DB_MAIN_SEL 41
|
||||||
|
#define CLK_TOP_ARM_DB_JTSEL 42
|
||||||
|
#define CLK_TOP_NETSYS_SEL 43
|
||||||
|
#define CLK_TOP_NETSYS_500M_SEL 44
|
||||||
|
#define CLK_TOP_NETSYS_MCU_SEL 45
|
||||||
|
#define CLK_TOP_NETSYS_2X_SEL 46
|
||||||
|
#define CLK_TOP_SGM_325M_SEL 47
|
||||||
|
#define CLK_TOP_SGM_REG_SEL 48
|
||||||
|
#define CLK_TOP_A1SYS_SEL 49
|
||||||
|
#define CLK_TOP_CONN_MCUSYS_SEL 50
|
||||||
|
#define CLK_TOP_EIP_B_SEL 51
|
||||||
|
#define CLK_TOP_PCIE_PHY_SEL 52
|
||||||
|
#define CLK_TOP_USB3_PHY_SEL 53
|
||||||
|
#define CLK_TOP_F26M_SEL 54
|
||||||
|
#define CLK_TOP_AUD_L_SEL 55
|
||||||
|
#define CLK_TOP_A_TUNER_SEL 56
|
||||||
|
#define CLK_TOP_U2U3_SEL 57
|
||||||
|
#define CLK_TOP_U2U3_SYS_SEL 58
|
||||||
|
#define CLK_TOP_U2U3_XHCI_SEL 59
|
||||||
|
#define CLK_TOP_DA_U2_REFSEL 60
|
||||||
|
#define CLK_TOP_DA_U2_CK_1P_SEL 61
|
||||||
|
#define CLK_TOP_AP2CNN_HOST_SEL 62
|
||||||
|
#define CLK_TOP_JTAG 63
|
||||||
|
|
||||||
|
/* INFRACFG */
|
||||||
|
|
||||||
|
#define CLK_INFRA_SYSAXI_D2 0
|
||||||
|
#define CLK_INFRA_UART0_SEL 1
|
||||||
|
#define CLK_INFRA_UART1_SEL 2
|
||||||
|
#define CLK_INFRA_UART2_SEL 3
|
||||||
|
#define CLK_INFRA_SPI0_SEL 4
|
||||||
|
#define CLK_INFRA_SPI1_SEL 5
|
||||||
|
#define CLK_INFRA_PWM1_SEL 6
|
||||||
|
#define CLK_INFRA_PWM2_SEL 7
|
||||||
|
#define CLK_INFRA_PWM_BSEL 8
|
||||||
|
#define CLK_INFRA_PCIE_SEL 9
|
||||||
|
#define CLK_INFRA_GPT_STA 10
|
||||||
|
#define CLK_INFRA_PWM_HCK 11
|
||||||
|
#define CLK_INFRA_PWM_STA 12
|
||||||
|
#define CLK_INFRA_PWM1_CK 13
|
||||||
|
#define CLK_INFRA_PWM2_CK 14
|
||||||
|
#define CLK_INFRA_CQ_DMA_CK 15
|
||||||
|
#define CLK_INFRA_EIP97_CK 16
|
||||||
|
#define CLK_INFRA_AUD_BUS_CK 17
|
||||||
|
#define CLK_INFRA_AUD_26M_CK 18
|
||||||
|
#define CLK_INFRA_AUD_L_CK 19
|
||||||
|
#define CLK_INFRA_AUD_AUD_CK 20
|
||||||
|
#define CLK_INFRA_AUD_EG2_CK 21
|
||||||
|
#define CLK_INFRA_DRAMC_26M_CK 22
|
||||||
|
#define CLK_INFRA_DBG_CK 23
|
||||||
|
#define CLK_INFRA_AP_DMA_CK 24
|
||||||
|
#define CLK_INFRA_SEJ_CK 25
|
||||||
|
#define CLK_INFRA_SEJ_13M_CK 26
|
||||||
|
#define CLK_INFRA_THERM_CK 27
|
||||||
|
#define CLK_INFRA_I2C0_CK 28
|
||||||
|
#define CLK_INFRA_UART0_CK 29
|
||||||
|
#define CLK_INFRA_UART1_CK 30
|
||||||
|
#define CLK_INFRA_UART2_CK 31
|
||||||
|
#define CLK_INFRA_NFI1_CK 32
|
||||||
|
#define CLK_INFRA_SPINFI1_CK 33
|
||||||
|
#define CLK_INFRA_NFI_HCK_CK 34
|
||||||
|
#define CLK_INFRA_SPI0_CK 35
|
||||||
|
#define CLK_INFRA_SPI1_CK 36
|
||||||
|
#define CLK_INFRA_SPI0_HCK_CK 37
|
||||||
|
#define CLK_INFRA_SPI1_HCK_CK 38
|
||||||
|
#define CLK_INFRA_FRTC_CK 39
|
||||||
|
#define CLK_INFRA_MSDC_CK 40
|
||||||
|
#define CLK_INFRA_MSDC_HCK_CK 41
|
||||||
|
#define CLK_INFRA_MSDC_133M_CK 42
|
||||||
|
#define CLK_INFRA_MSDC_66M_CK 43
|
||||||
|
#define CLK_INFRA_ADC_26M_CK 44
|
||||||
|
#define CLK_INFRA_ADC_FRC_CK 45
|
||||||
|
#define CLK_INFRA_FBIST2FPC_CK 46
|
||||||
|
#define CLK_INFRA_IUSB_133_CK 47
|
||||||
|
#define CLK_INFRA_IUSB_66M_CK 48
|
||||||
|
#define CLK_INFRA_IUSB_SYS_CK 49
|
||||||
|
#define CLK_INFRA_IUSB_CK 50
|
||||||
|
#define CLK_INFRA_IPCIE_CK 51
|
||||||
|
#define CLK_INFRA_IPCIE_PIPE_CK 52
|
||||||
|
#define CLK_INFRA_IPCIER_CK 53
|
||||||
|
#define CLK_INFRA_IPCIEB_CK 54
|
||||||
|
#define CLK_INFRA_TRNG_CK 55
|
||||||
|
|
||||||
|
/* SGMIISYS_0 */
|
||||||
|
|
||||||
|
#define CLK_SGMII0_TX250M_EN 0
|
||||||
|
#define CLK_SGMII0_RX250M_EN 1
|
||||||
|
#define CLK_SGMII0_CDR_REF 2
|
||||||
|
#define CLK_SGMII0_CDR_FB 3
|
||||||
|
|
||||||
|
/* SGMIISYS_1 */
|
||||||
|
|
||||||
|
#define CLK_SGMII1_TX250M_EN 0
|
||||||
|
#define CLK_SGMII1_RX250M_EN 1
|
||||||
|
#define CLK_SGMII1_CDR_REF 2
|
||||||
|
#define CLK_SGMII1_CDR_FB 3
|
||||||
|
|
||||||
|
/* ETHSYS */
|
||||||
|
|
||||||
|
#define CLK_ETH_FE_EN 0
|
||||||
|
#define CLK_ETH_GP2_EN 1
|
||||||
|
#define CLK_ETH_GP1_EN 2
|
||||||
|
#define CLK_ETH_WOCPU1_EN 3
|
||||||
|
#define CLK_ETH_WOCPU0_EN 4
|
||||||
|
|
||||||
|
#endif /* _DT_BINDINGS_CLK_MT7986_H */
|
@ -0,0 +1,10 @@
|
|||||||
|
/* SPDX-License-Identifier: GPL-2.0 */
|
||||||
|
/* Copyright (c) 2021 MediaTek Inc. */
|
||||||
|
|
||||||
|
#ifndef _DT_BINDINGS_RESET_MT7986
|
||||||
|
#define _DT_BINDINGS_RESET_MT7986
|
||||||
|
|
||||||
|
#define MT7986_TOPRGU_CONSYS_RST 23
|
||||||
|
#define MT7986_TOPRGU_SW_RST_NUM 32
|
||||||
|
|
||||||
|
#endif /* _DT_BINDINGS_RESET_MT7986 */
|
@ -0,0 +1,26 @@
|
|||||||
|
|
||||||
|
. /lib/functions.sh
|
||||||
|
. /lib/functions/uci-defaults.sh
|
||||||
|
. /lib/functions/system.sh
|
||||||
|
|
||||||
|
mediatek_setup_interfaces()
|
||||||
|
{
|
||||||
|
local board="$1"
|
||||||
|
|
||||||
|
case $board in
|
||||||
|
mediatek,mt7986a-rfb|\
|
||||||
|
mediatek,mt7986b-rfb)
|
||||||
|
ucidef_set_interfaces_lan_wan "lan1 lan2 lan3 lan4" wan
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
ucidef_set_interfaces_lan_wan "lan1 lan2 lan3 lan4" wan
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
board_config_update
|
||||||
|
board=$(board_name)
|
||||||
|
mediatek_setup_interfaces $board
|
||||||
|
board_config_flush
|
||||||
|
|
||||||
|
exit 0
|
30
target/linux/mediatek/filogic/base-files/lib/upgrade/platform.sh
Executable file
30
target/linux/mediatek/filogic/base-files/lib/upgrade/platform.sh
Executable file
@ -0,0 +1,30 @@
|
|||||||
|
REQUIRE_IMAGE_METADATA=1
|
||||||
|
|
||||||
|
platform_do_upgrade() {
|
||||||
|
local board=$(board_name)
|
||||||
|
local file_type=$(identify $1)
|
||||||
|
|
||||||
|
case "$board" in
|
||||||
|
*)
|
||||||
|
nand_do_upgrade "$1"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
PART_NAME=firmware
|
||||||
|
|
||||||
|
platform_check_image() {
|
||||||
|
local board=$(board_name)
|
||||||
|
local magic="$(get_magic_long "$1")"
|
||||||
|
|
||||||
|
[ "$#" -gt 1 ] && return 1
|
||||||
|
|
||||||
|
case "$board" in
|
||||||
|
*)
|
||||||
|
nand_do_platform_check "$board" "$1"
|
||||||
|
return 0
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
return 0
|
||||||
|
}
|
434
target/linux/mediatek/filogic/config-5.15
Normal file
434
target/linux/mediatek/filogic/config-5.15
Normal file
@ -0,0 +1,434 @@
|
|||||||
|
CONFIG_64BIT=y
|
||||||
|
# CONFIG_AHCI_MTK is not set
|
||||||
|
CONFIG_AQUANTIA_PHY=y
|
||||||
|
CONFIG_ARCH_DMA_ADDR_T_64BIT=y
|
||||||
|
CONFIG_ARCH_KEEP_MEMBLOCK=y
|
||||||
|
CONFIG_ARCH_MEDIATEK=y
|
||||||
|
CONFIG_ARCH_MHP_MEMMAP_ON_MEMORY_ENABLE=y
|
||||||
|
CONFIG_ARCH_MMAP_RND_BITS=18
|
||||||
|
CONFIG_ARCH_MMAP_RND_BITS_MAX=24
|
||||||
|
CONFIG_ARCH_MMAP_RND_BITS_MIN=18
|
||||||
|
CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MIN=11
|
||||||
|
CONFIG_ARCH_PROC_KCORE_TEXT=y
|
||||||
|
CONFIG_ARCH_SPARSEMEM_ENABLE=y
|
||||||
|
CONFIG_ARCH_STACKWALK=y
|
||||||
|
CONFIG_ARCH_SUSPEND_POSSIBLE=y
|
||||||
|
CONFIG_ARCH_WANTS_NO_INSTR=y
|
||||||
|
CONFIG_ARM64=y
|
||||||
|
CONFIG_ARM64_4K_PAGES=y
|
||||||
|
# CONFIG_ARM64_CNP is not set
|
||||||
|
CONFIG_ARM64_CRYPTO=y
|
||||||
|
CONFIG_ARM64_ERRATUM_843419=y
|
||||||
|
CONFIG_ARM64_LD_HAS_FIX_ERRATUM_843419=y
|
||||||
|
CONFIG_ARM64_MODULE_PLTS=y
|
||||||
|
CONFIG_ARM64_PAGE_SHIFT=12
|
||||||
|
CONFIG_ARM64_PA_BITS=48
|
||||||
|
CONFIG_ARM64_PA_BITS_48=y
|
||||||
|
# CONFIG_ARM64_SW_TTBR0_PAN is not set
|
||||||
|
CONFIG_ARM64_TAGGED_ADDR_ABI=y
|
||||||
|
CONFIG_ARM64_VA_BITS=39
|
||||||
|
CONFIG_ARM64_VA_BITS_39=y
|
||||||
|
CONFIG_ARM_AMBA=y
|
||||||
|
CONFIG_ARM_ARCH_TIMER=y
|
||||||
|
CONFIG_ARM_ARCH_TIMER_EVTSTREAM=y
|
||||||
|
CONFIG_ARM_GIC=y
|
||||||
|
CONFIG_ARM_GIC_V2M=y
|
||||||
|
CONFIG_ARM_GIC_V3=y
|
||||||
|
CONFIG_ARM_GIC_V3_ITS=y
|
||||||
|
CONFIG_ARM_GIC_V3_ITS_PCI=y
|
||||||
|
CONFIG_ARM_MEDIATEK_CPUFREQ=y
|
||||||
|
CONFIG_ARM_PMU=y
|
||||||
|
CONFIG_ARM_PSCI_FW=y
|
||||||
|
CONFIG_ATA=y
|
||||||
|
CONFIG_AUDIT_ARCH_COMPAT_GENERIC=y
|
||||||
|
CONFIG_BLK_DEV_LOOP=y
|
||||||
|
CONFIG_BLK_DEV_SD=y
|
||||||
|
CONFIG_BLK_MQ_PCI=y
|
||||||
|
CONFIG_BLK_PM=y
|
||||||
|
CONFIG_BSD_PROCESS_ACCT=y
|
||||||
|
CONFIG_BSD_PROCESS_ACCT_V3=y
|
||||||
|
CONFIG_CC_HAVE_STACKPROTECTOR_SYSREG=y
|
||||||
|
CONFIG_CLKSRC_MMIO=y
|
||||||
|
CONFIG_CLONE_BACKWARDS=y
|
||||||
|
CONFIG_COMMON_CLK=y
|
||||||
|
CONFIG_COMMON_CLK_MEDIATEK=y
|
||||||
|
# CONFIG_COMMON_CLK_MT2712 is not set
|
||||||
|
# CONFIG_COMMON_CLK_MT6779 is not set
|
||||||
|
# CONFIG_COMMON_CLK_MT6797 is not set
|
||||||
|
# CONFIG_COMMON_CLK_MT7622 is not set
|
||||||
|
CONFIG_COMMON_CLK_MT7986=y
|
||||||
|
CONFIG_COMMON_CLK_MT7986_ETHSYS=y
|
||||||
|
# CONFIG_COMMON_CLK_MT8173 is not set
|
||||||
|
# CONFIG_COMMON_CLK_MT8183 is not set
|
||||||
|
# CONFIG_COMMON_CLK_MT8516 is not set
|
||||||
|
# CONFIG_COMPAT_32BIT_TIME is not set
|
||||||
|
CONFIG_CONFIGFS_FS=y
|
||||||
|
CONFIG_CONSOLE_LOGLEVEL_DEFAULT=15
|
||||||
|
# CONFIG_CPUFREQ_DT is not set
|
||||||
|
CONFIG_CPU_FREQ=y
|
||||||
|
# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set
|
||||||
|
CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE=y
|
||||||
|
CONFIG_CPU_FREQ_GOV_ATTR_SET=y
|
||||||
|
CONFIG_CPU_FREQ_GOV_COMMON=y
|
||||||
|
CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y
|
||||||
|
CONFIG_CPU_FREQ_GOV_ONDEMAND=y
|
||||||
|
CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
|
||||||
|
CONFIG_CPU_FREQ_GOV_POWERSAVE=y
|
||||||
|
CONFIG_CPU_FREQ_GOV_SCHEDUTIL=y
|
||||||
|
CONFIG_CPU_FREQ_GOV_USERSPACE=y
|
||||||
|
CONFIG_CPU_FREQ_STAT=y
|
||||||
|
CONFIG_CPU_RMAP=y
|
||||||
|
CONFIG_CPU_THERMAL=y
|
||||||
|
CONFIG_CRC16=y
|
||||||
|
CONFIG_CRYPTO_AES_ARM64=y
|
||||||
|
CONFIG_CRYPTO_AES_ARM64_CE=y
|
||||||
|
CONFIG_CRYPTO_AES_ARM64_CE_BLK=y
|
||||||
|
CONFIG_CRYPTO_AES_ARM64_CE_CCM=y
|
||||||
|
CONFIG_CRYPTO_BLAKE2S=y
|
||||||
|
CONFIG_CRYPTO_CMAC=y
|
||||||
|
CONFIG_CRYPTO_CRC32=y
|
||||||
|
CONFIG_CRYPTO_CRC32C=y
|
||||||
|
CONFIG_CRYPTO_CRYPTD=y
|
||||||
|
CONFIG_CRYPTO_DEFLATE=y
|
||||||
|
CONFIG_CRYPTO_DRBG=y
|
||||||
|
CONFIG_CRYPTO_DRBG_HMAC=y
|
||||||
|
CONFIG_CRYPTO_DRBG_MENU=y
|
||||||
|
CONFIG_CRYPTO_ECB=y
|
||||||
|
CONFIG_CRYPTO_ECC=y
|
||||||
|
CONFIG_CRYPTO_ECDH=y
|
||||||
|
CONFIG_CRYPTO_GHASH_ARM64_CE=y
|
||||||
|
CONFIG_CRYPTO_HASH_INFO=y
|
||||||
|
CONFIG_CRYPTO_HMAC=y
|
||||||
|
CONFIG_CRYPTO_JITTERENTROPY=y
|
||||||
|
CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y
|
||||||
|
CONFIG_CRYPTO_LIB_SHA256=y
|
||||||
|
CONFIG_CRYPTO_LZO=y
|
||||||
|
CONFIG_CRYPTO_RNG=y
|
||||||
|
CONFIG_CRYPTO_RNG2=y
|
||||||
|
CONFIG_CRYPTO_RNG_DEFAULT=y
|
||||||
|
CONFIG_CRYPTO_SHA256=y
|
||||||
|
CONFIG_CRYPTO_SHA256_ARM64=y
|
||||||
|
CONFIG_CRYPTO_SHA2_ARM64_CE=y
|
||||||
|
CONFIG_CRYPTO_SHA512=y
|
||||||
|
CONFIG_CRYPTO_SIMD=y
|
||||||
|
CONFIG_CRYPTO_ZSTD=y
|
||||||
|
CONFIG_DCACHE_WORD_ACCESS=y
|
||||||
|
CONFIG_DEBUG_MISC=y
|
||||||
|
CONFIG_DIMLIB=y
|
||||||
|
CONFIG_DMADEVICES=y
|
||||||
|
CONFIG_DMATEST=y
|
||||||
|
CONFIG_DMA_DIRECT_REMAP=y
|
||||||
|
CONFIG_DMA_ENGINE=y
|
||||||
|
CONFIG_DMA_ENGINE_RAID=y
|
||||||
|
CONFIG_DMA_OF=y
|
||||||
|
CONFIG_DMA_REMAP=y
|
||||||
|
CONFIG_DMA_VIRTUAL_CHANNELS=y
|
||||||
|
CONFIG_DTC=y
|
||||||
|
CONFIG_DYNAMIC_DEBUG=y
|
||||||
|
CONFIG_EDAC_SUPPORT=y
|
||||||
|
CONFIG_EINT_MTK=y
|
||||||
|
CONFIG_EXT4_FS=y
|
||||||
|
CONFIG_F2FS_FS=y
|
||||||
|
CONFIG_FIT_PARTITION=y
|
||||||
|
CONFIG_FIXED_PHY=y
|
||||||
|
CONFIG_FIX_EARLYCON_MEM=y
|
||||||
|
CONFIG_FRAME_POINTER=y
|
||||||
|
CONFIG_FS_IOMAP=y
|
||||||
|
CONFIG_FS_MBCACHE=y
|
||||||
|
CONFIG_FWNODE_MDIO=y
|
||||||
|
CONFIG_FW_LOADER_PAGED_BUF=y
|
||||||
|
CONFIG_GENERIC_ALLOCATOR=y
|
||||||
|
CONFIG_GENERIC_ARCH_TOPOLOGY=y
|
||||||
|
CONFIG_GENERIC_BUG=y
|
||||||
|
CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y
|
||||||
|
CONFIG_GENERIC_CLOCKEVENTS=y
|
||||||
|
CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y
|
||||||
|
CONFIG_GENERIC_CPU_AUTOPROBE=y
|
||||||
|
CONFIG_GENERIC_CPU_VULNERABILITIES=y
|
||||||
|
CONFIG_GENERIC_CSUM=y
|
||||||
|
CONFIG_GENERIC_EARLY_IOREMAP=y
|
||||||
|
CONFIG_GENERIC_FIND_FIRST_BIT=y
|
||||||
|
CONFIG_GENERIC_GETTIMEOFDAY=y
|
||||||
|
CONFIG_GENERIC_IDLE_POLL_SETUP=y
|
||||||
|
CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y
|
||||||
|
CONFIG_GENERIC_IRQ_SHOW=y
|
||||||
|
CONFIG_GENERIC_IRQ_SHOW_LEVEL=y
|
||||||
|
CONFIG_GENERIC_LIB_DEVMEM_IS_ALLOWED=y
|
||||||
|
CONFIG_GENERIC_MSI_IRQ=y
|
||||||
|
CONFIG_GENERIC_MSI_IRQ_DOMAIN=y
|
||||||
|
CONFIG_GENERIC_PCI_IOMAP=y
|
||||||
|
CONFIG_GENERIC_PHY=y
|
||||||
|
CONFIG_GENERIC_PINCONF=y
|
||||||
|
CONFIG_GENERIC_PINCTRL_GROUPS=y
|
||||||
|
CONFIG_GENERIC_PINMUX_FUNCTIONS=y
|
||||||
|
CONFIG_GENERIC_SCHED_CLOCK=y
|
||||||
|
CONFIG_GENERIC_SMP_IDLE_THREAD=y
|
||||||
|
CONFIG_GENERIC_STRNCPY_FROM_USER=y
|
||||||
|
CONFIG_GENERIC_STRNLEN_USER=y
|
||||||
|
CONFIG_GENERIC_TIME_VSYSCALL=y
|
||||||
|
CONFIG_GLOB=y
|
||||||
|
CONFIG_GPIOLIB=y
|
||||||
|
CONFIG_GPIO_CDEV=y
|
||||||
|
CONFIG_GRO_CELLS=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_HW_RANDOM=y
|
||||||
|
CONFIG_HW_RANDOM_MTK=y
|
||||||
|
CONFIG_I2C=y
|
||||||
|
CONFIG_I2C_BOARDINFO=y
|
||||||
|
CONFIG_I2C_CHARDEV=y
|
||||||
|
CONFIG_I2C_MT65XX=y
|
||||||
|
CONFIG_ICPLUS_PHY=y
|
||||||
|
CONFIG_IIO=y
|
||||||
|
CONFIG_IKCONFIG=y
|
||||||
|
CONFIG_IKCONFIG_PROC=y
|
||||||
|
CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000
|
||||||
|
CONFIG_INITRAMFS_SOURCE=""
|
||||||
|
CONFIG_IO_URING=y
|
||||||
|
CONFIG_IRQCHIP=y
|
||||||
|
CONFIG_IRQ_DOMAIN=y
|
||||||
|
CONFIG_IRQ_DOMAIN_HIERARCHY=y
|
||||||
|
CONFIG_IRQ_FORCED_THREADING=y
|
||||||
|
CONFIG_IRQ_TIME_ACCOUNTING=y
|
||||||
|
CONFIG_IRQ_WORK=y
|
||||||
|
CONFIG_JBD2=y
|
||||||
|
CONFIG_JUMP_LABEL=y
|
||||||
|
# CONFIG_LEDS_UBNT_LEDBAR is not set
|
||||||
|
CONFIG_LIBFDT=y
|
||||||
|
CONFIG_LOCK_DEBUGGING_SUPPORT=y
|
||||||
|
CONFIG_LOCK_SPIN_ON_OWNER=y
|
||||||
|
CONFIG_LZO_COMPRESS=y
|
||||||
|
CONFIG_LZO_DECOMPRESS=y
|
||||||
|
CONFIG_MAGIC_SYSRQ=y
|
||||||
|
CONFIG_MDIO_BUS=y
|
||||||
|
CONFIG_MDIO_DEVICE=y
|
||||||
|
CONFIG_MDIO_DEVRES=y
|
||||||
|
CONFIG_MEDIATEK_GE_PHY=y
|
||||||
|
CONFIG_MEDIATEK_MT6577_AUXADC=y
|
||||||
|
CONFIG_MEDIATEK_WATCHDOG=y
|
||||||
|
CONFIG_MEMFD_CREATE=y
|
||||||
|
CONFIG_MESSAGE_LOGLEVEL_DEFAULT=7
|
||||||
|
CONFIG_MFD_SYSCON=y
|
||||||
|
CONFIG_MIGRATION=y
|
||||||
|
CONFIG_MMC=y
|
||||||
|
CONFIG_MMC_BLOCK=y
|
||||||
|
CONFIG_MMC_CQHCI=y
|
||||||
|
CONFIG_MMC_MTK=y
|
||||||
|
CONFIG_MODULES_TREE_LOOKUP=y
|
||||||
|
CONFIG_MODULES_USE_ELF_RELA=y
|
||||||
|
CONFIG_MTD_NAND_CORE=y
|
||||||
|
CONFIG_MTD_NAND_ECC=y
|
||||||
|
CONFIG_MTD_NAND_ECC_MEDIATEK=y
|
||||||
|
CONFIG_MTD_NAND_ECC_SW_HAMMING=y
|
||||||
|
CONFIG_MTD_NAND_MTK=y
|
||||||
|
CONFIG_MTD_NAND_MTK_BMT=y
|
||||||
|
CONFIG_MTD_PARSER_TRX=y
|
||||||
|
CONFIG_MTD_RAW_NAND=y
|
||||||
|
CONFIG_MTD_SPI_NAND=y
|
||||||
|
CONFIG_MTD_SPI_NOR=y
|
||||||
|
CONFIG_MTD_SPLIT_FIRMWARE=y
|
||||||
|
CONFIG_MTD_SPLIT_FIT_FW=y
|
||||||
|
CONFIG_MTD_UBI=y
|
||||||
|
CONFIG_MTD_UBI_BEB_LIMIT=20
|
||||||
|
CONFIG_MTD_UBI_BLOCK=y
|
||||||
|
CONFIG_MTD_UBI_WL_THRESHOLD=4096
|
||||||
|
# CONFIG_MTK_CMDQ is not set
|
||||||
|
# CONFIG_MTK_CQDMA is not set
|
||||||
|
CONFIG_MTK_EFUSE=y
|
||||||
|
CONFIG_MTK_HSDMA=y
|
||||||
|
CONFIG_MTK_INFRACFG=y
|
||||||
|
CONFIG_MTK_PMIC_WRAP=y
|
||||||
|
CONFIG_MTK_SCPSYS=y
|
||||||
|
CONFIG_MTK_SCPSYS_PM_DOMAINS=y
|
||||||
|
CONFIG_MTK_THERMAL=y
|
||||||
|
CONFIG_MTK_TIMER=y
|
||||||
|
# CONFIG_MTK_UART_APDMA is not set
|
||||||
|
CONFIG_MUTEX_SPIN_ON_OWNER=y
|
||||||
|
CONFIG_NEED_DMA_MAP_STATE=y
|
||||||
|
CONFIG_NEED_SG_DMA_LENGTH=y
|
||||||
|
CONFIG_NET_DEVLINK=y
|
||||||
|
CONFIG_NET_DSA=y
|
||||||
|
CONFIG_NET_DSA_MT7530=y
|
||||||
|
CONFIG_NET_DSA_TAG_MTK=y
|
||||||
|
CONFIG_NET_FLOW_LIMIT=y
|
||||||
|
CONFIG_NET_MEDIATEK_SOC=y
|
||||||
|
CONFIG_NET_MEDIATEK_SOC_WED=y
|
||||||
|
CONFIG_NET_SELFTESTS=y
|
||||||
|
CONFIG_NET_SWITCHDEV=y
|
||||||
|
CONFIG_NET_VENDOR_MEDIATEK=y
|
||||||
|
CONFIG_NLS=y
|
||||||
|
CONFIG_NO_HZ_COMMON=y
|
||||||
|
CONFIG_NO_HZ_IDLE=y
|
||||||
|
CONFIG_NR_CPUS=4
|
||||||
|
CONFIG_NVMEM=y
|
||||||
|
CONFIG_NVMEM_SYSFS=y
|
||||||
|
CONFIG_OF=y
|
||||||
|
CONFIG_OF_ADDRESS=y
|
||||||
|
CONFIG_OF_DYNAMIC=y
|
||||||
|
CONFIG_OF_EARLY_FLATTREE=y
|
||||||
|
CONFIG_OF_FLATTREE=y
|
||||||
|
CONFIG_OF_GPIO=y
|
||||||
|
CONFIG_OF_IRQ=y
|
||||||
|
CONFIG_OF_KOBJ=y
|
||||||
|
CONFIG_OF_MDIO=y
|
||||||
|
CONFIG_OF_OVERLAY=y
|
||||||
|
CONFIG_OF_RESOLVE=y
|
||||||
|
CONFIG_PADATA=y
|
||||||
|
CONFIG_PARTITION_PERCPU=y
|
||||||
|
CONFIG_PCI=y
|
||||||
|
CONFIG_PCIEAER=y
|
||||||
|
CONFIG_PCIEASPM=y
|
||||||
|
# CONFIG_PCIEASPM_DEFAULT is not set
|
||||||
|
CONFIG_PCIEASPM_PERFORMANCE=y
|
||||||
|
# CONFIG_PCIEASPM_POWERSAVE is not set
|
||||||
|
# CONFIG_PCIEASPM_POWER_SUPERSAVE is not set
|
||||||
|
CONFIG_PCIEPORTBUS=y
|
||||||
|
# CONFIG_PCIE_MEDIATEK is not set
|
||||||
|
CONFIG_PCIE_MEDIATEK_GEN3=y
|
||||||
|
CONFIG_PCIE_PME=y
|
||||||
|
CONFIG_PCI_DEBUG=y
|
||||||
|
CONFIG_PCI_DOMAINS=y
|
||||||
|
CONFIG_PCI_DOMAINS_GENERIC=y
|
||||||
|
CONFIG_PCI_MSI=y
|
||||||
|
CONFIG_PCI_MSI_IRQ_DOMAIN=y
|
||||||
|
CONFIG_PERF_EVENTS=y
|
||||||
|
CONFIG_PGTABLE_LEVELS=3
|
||||||
|
CONFIG_PHYLIB=y
|
||||||
|
CONFIG_PHYLINK=y
|
||||||
|
CONFIG_PHYS_ADDR_T_64BIT=y
|
||||||
|
CONFIG_PHY_MTK_TPHY=y
|
||||||
|
# CONFIG_PHY_MTK_UFS is not set
|
||||||
|
# CONFIG_PHY_MTK_XSPHY is not set
|
||||||
|
CONFIG_PINCTRL=y
|
||||||
|
# CONFIG_PINCTRL_MT2712 is not set
|
||||||
|
# CONFIG_PINCTRL_MT6765 is not set
|
||||||
|
# CONFIG_PINCTRL_MT6797 is not set
|
||||||
|
# CONFIG_PINCTRL_MT7622 is not set
|
||||||
|
CONFIG_PINCTRL_MT7986=y
|
||||||
|
# CONFIG_PINCTRL_MT8173 is not set
|
||||||
|
# CONFIG_PINCTRL_MT8183 is not set
|
||||||
|
CONFIG_PINCTRL_MT8516=y
|
||||||
|
CONFIG_PINCTRL_MTK=y
|
||||||
|
CONFIG_PINCTRL_MTK_MOORE=y
|
||||||
|
CONFIG_PINCTRL_MTK_V2=y
|
||||||
|
CONFIG_PM=y
|
||||||
|
CONFIG_PM_CLK=y
|
||||||
|
CONFIG_PM_GENERIC_DOMAINS=y
|
||||||
|
CONFIG_PM_GENERIC_DOMAINS_OF=y
|
||||||
|
CONFIG_PM_OPP=y
|
||||||
|
CONFIG_POWER_RESET=y
|
||||||
|
CONFIG_POWER_RESET_SYSCON=y
|
||||||
|
CONFIG_POWER_SUPPLY=y
|
||||||
|
CONFIG_PRINTK_TIME=y
|
||||||
|
CONFIG_PSTORE=y
|
||||||
|
CONFIG_PSTORE_COMPRESS=y
|
||||||
|
CONFIG_PSTORE_COMPRESS_DEFAULT="deflate"
|
||||||
|
CONFIG_PSTORE_CONSOLE=y
|
||||||
|
CONFIG_PSTORE_DEFLATE_COMPRESS=y
|
||||||
|
CONFIG_PSTORE_DEFLATE_COMPRESS_DEFAULT=y
|
||||||
|
CONFIG_PSTORE_PMSG=y
|
||||||
|
CONFIG_PSTORE_RAM=y
|
||||||
|
CONFIG_PTP_1588_CLOCK_OPTIONAL=y
|
||||||
|
CONFIG_PWM=y
|
||||||
|
CONFIG_PWM_MEDIATEK=y
|
||||||
|
# CONFIG_PWM_MTK_DISP is not set
|
||||||
|
CONFIG_PWM_SYSFS=y
|
||||||
|
CONFIG_QUEUED_RWLOCKS=y
|
||||||
|
CONFIG_QUEUED_SPINLOCKS=y
|
||||||
|
CONFIG_RAS=y
|
||||||
|
CONFIG_RATIONAL=y
|
||||||
|
# CONFIG_RAVE_SP_CORE is not set
|
||||||
|
CONFIG_REALTEK_PHY=y
|
||||||
|
CONFIG_REED_SOLOMON=y
|
||||||
|
CONFIG_REED_SOLOMON_DEC8=y
|
||||||
|
CONFIG_REED_SOLOMON_ENC8=y
|
||||||
|
CONFIG_REGMAP=y
|
||||||
|
CONFIG_REGMAP_MMIO=y
|
||||||
|
CONFIG_REGULATOR=y
|
||||||
|
CONFIG_REGULATOR_FIXED_VOLTAGE=y
|
||||||
|
CONFIG_REGULATOR_MT6380=y
|
||||||
|
CONFIG_RESET_CONTROLLER=y
|
||||||
|
CONFIG_RFS_ACCEL=y
|
||||||
|
CONFIG_RODATA_FULL_DEFAULT_ENABLED=y
|
||||||
|
CONFIG_RPS=y
|
||||||
|
CONFIG_RTC_CLASS=y
|
||||||
|
CONFIG_RTC_DRV_MT7622=y
|
||||||
|
CONFIG_RTC_I2C_AND_SPI=y
|
||||||
|
CONFIG_RTL8367S_GSW=y
|
||||||
|
CONFIG_RWSEM_SPIN_ON_OWNER=y
|
||||||
|
CONFIG_SCHED_MC=y
|
||||||
|
CONFIG_SCSI=y
|
||||||
|
CONFIG_SCSI_COMMON=y
|
||||||
|
# CONFIG_SECTION_MISMATCH_WARN_ONLY is not set
|
||||||
|
CONFIG_SERIAL_8250_FSL=y
|
||||||
|
CONFIG_SERIAL_8250_MT6577=y
|
||||||
|
CONFIG_SERIAL_8250_NR_UARTS=3
|
||||||
|
CONFIG_SERIAL_8250_RUNTIME_UARTS=3
|
||||||
|
CONFIG_SERIAL_DEV_BUS=y
|
||||||
|
CONFIG_SERIAL_DEV_CTRL_TTYPORT=y
|
||||||
|
CONFIG_SERIAL_MCTRL_GPIO=y
|
||||||
|
CONFIG_SERIAL_OF_PLATFORM=y
|
||||||
|
CONFIG_SGL_ALLOC=y
|
||||||
|
CONFIG_SG_POOL=y
|
||||||
|
CONFIG_SMP=y
|
||||||
|
CONFIG_SOCK_RX_QUEUE_MAPPING=y
|
||||||
|
CONFIG_SPARSEMEM=y
|
||||||
|
CONFIG_SPARSEMEM_EXTREME=y
|
||||||
|
CONFIG_SPARSEMEM_VMEMMAP=y
|
||||||
|
CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y
|
||||||
|
CONFIG_SPARSE_IRQ=y
|
||||||
|
CONFIG_SPI=y
|
||||||
|
CONFIG_SPI_DYNAMIC=y
|
||||||
|
CONFIG_SPI_MASTER=y
|
||||||
|
CONFIG_SPI_MEM=y
|
||||||
|
CONFIG_SPI_MT65XX=y
|
||||||
|
CONFIG_SPI_MTK_NOR=y
|
||||||
|
CONFIG_SPI_MTK_SNFI=y
|
||||||
|
CONFIG_SRCU=y
|
||||||
|
CONFIG_SWCONFIG=y
|
||||||
|
CONFIG_SWIOTLB=y
|
||||||
|
CONFIG_SWPHY=y
|
||||||
|
CONFIG_SYSCTL_EXCEPTION_TRACE=y
|
||||||
|
CONFIG_THERMAL=y
|
||||||
|
CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y
|
||||||
|
CONFIG_THERMAL_EMERGENCY_POWEROFF_DELAY_MS=0
|
||||||
|
CONFIG_THERMAL_EMULATION=y
|
||||||
|
CONFIG_THERMAL_GOV_BANG_BANG=y
|
||||||
|
CONFIG_THERMAL_GOV_FAIR_SHARE=y
|
||||||
|
CONFIG_THERMAL_GOV_STEP_WISE=y
|
||||||
|
CONFIG_THERMAL_GOV_USER_SPACE=y
|
||||||
|
CONFIG_THERMAL_OF=y
|
||||||
|
CONFIG_THERMAL_WRITABLE_TRIPS=y
|
||||||
|
CONFIG_THREAD_INFO_IN_TASK=y
|
||||||
|
CONFIG_TICK_CPU_ACCOUNTING=y
|
||||||
|
CONFIG_TIMER_OF=y
|
||||||
|
CONFIG_TIMER_PROBE=y
|
||||||
|
CONFIG_TREE_RCU=y
|
||||||
|
CONFIG_TREE_SRCU=y
|
||||||
|
CONFIG_UBIFS_FS=y
|
||||||
|
# CONFIG_UCLAMP_TASK is not set
|
||||||
|
# CONFIG_UNMAP_KERNEL_AT_EL0 is not set
|
||||||
|
CONFIG_USB=y
|
||||||
|
CONFIG_USB_COMMON=y
|
||||||
|
CONFIG_USB_SUPPORT=y
|
||||||
|
CONFIG_USB_XHCI_HCD=y
|
||||||
|
CONFIG_USB_XHCI_MTK=y
|
||||||
|
# CONFIG_USB_XHCI_PLATFORM is not set
|
||||||
|
CONFIG_VMAP_STACK=y
|
||||||
|
CONFIG_WATCHDOG_CORE=y
|
||||||
|
CONFIG_WATCHDOG_PRETIMEOUT_DEFAULT_GOV_PANIC=y
|
||||||
|
CONFIG_WATCHDOG_PRETIMEOUT_GOV=y
|
||||||
|
# CONFIG_WATCHDOG_PRETIMEOUT_GOV_NOOP is not set
|
||||||
|
CONFIG_WATCHDOG_PRETIMEOUT_GOV_PANIC=y
|
||||||
|
CONFIG_WATCHDOG_PRETIMEOUT_GOV_SEL=m
|
||||||
|
CONFIG_WATCHDOG_SYSFS=y
|
||||||
|
CONFIG_XPS=y
|
||||||
|
CONFIG_XXHASH=y
|
||||||
|
CONFIG_ZLIB_DEFLATE=y
|
||||||
|
CONFIG_ZLIB_INFLATE=y
|
||||||
|
CONFIG_ZONE_DMA32=y
|
||||||
|
CONFIG_ZSTD_COMPRESS=y
|
||||||
|
CONFIG_ZSTD_DECOMPRESS=y
|
10
target/linux/mediatek/filogic/target.mk
Normal file
10
target/linux/mediatek/filogic/target.mk
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
ARCH:=aarch64
|
||||||
|
SUBTARGET:=filogic
|
||||||
|
BOARDNAME:=Filogic 830 (MT7986)
|
||||||
|
CPU_TYPE:=cortex-a53
|
||||||
|
DEFAULT_PACKAGES += kmod-crypto-hw-safexcel kmod-mt7915e kmod-mt7986-firmware wpad-basic-wolfssl uboot-envtools
|
||||||
|
KERNELNAME:=Image dtbs
|
||||||
|
|
||||||
|
define Target/Description
|
||||||
|
Build firmware images for MediaTek Filogic ARM based boards.
|
||||||
|
endef
|
51
target/linux/mediatek/image/filogic.mk
Normal file
51
target/linux/mediatek/image/filogic.mk
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
DTS_DIR := $(DTS_DIR)/mediatek
|
||||||
|
|
||||||
|
KERNEL_LOADADDR := 0x44000000
|
||||||
|
|
||||||
|
define Image/Prepare
|
||||||
|
# For UBI we want only one extra block
|
||||||
|
rm -f $(KDIR)/ubi_mark
|
||||||
|
echo -ne '\xde\xad\xc0\xde' > $(KDIR)/ubi_mark
|
||||||
|
endef
|
||||||
|
|
||||||
|
define Device/mediatek_mt7986a-rfb
|
||||||
|
DEVICE_VENDOR := MediaTek
|
||||||
|
DEVICE_MODEL := MTK7986 rfba AP
|
||||||
|
DEVICE_DTS := mt7986a-rfb
|
||||||
|
DEVICE_DTS_DIR := $(DTS_DIR)/
|
||||||
|
KERNEL_LOADADDR := 0x48000000
|
||||||
|
DEVICE_DTS_OVERLAY := mt7986a-rfb-spim-nand mt7986a-rfb-spim-nor
|
||||||
|
SUPPORTED_DEVICES := mediatek,mt7986a-rfb
|
||||||
|
UBINIZE_OPTS := -E 5
|
||||||
|
BLOCKSIZE := 128k
|
||||||
|
PAGESIZE := 2048
|
||||||
|
IMAGE_SIZE := 65536k
|
||||||
|
KERNEL_IN_UBI := 1
|
||||||
|
IMAGES += factory.bin
|
||||||
|
IMAGE/factory.bin := append-ubi | check-size $$$$(IMAGE_SIZE)
|
||||||
|
IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata
|
||||||
|
KERNEL = kernel-bin | lzma | \
|
||||||
|
fit lzma $$(KDIR)/$$(firstword $$(DEVICE_DTS)).dtb
|
||||||
|
KERNEL_INITRAMFS = kernel-bin | lzma | \
|
||||||
|
fit lzma $$(KDIR)/$$(firstword $$(DEVICE_DTS)).dtb with-initrd
|
||||||
|
DTC_FLAGS += -@ --space 32768
|
||||||
|
endef
|
||||||
|
TARGET_DEVICES += mediatek_mt7986a-rfb
|
||||||
|
|
||||||
|
define Device/mediatek_mt7986b-rfb
|
||||||
|
DEVICE_VENDOR := MediaTek
|
||||||
|
DEVICE_MODEL := MTK7986 rfbb AP
|
||||||
|
DEVICE_DTS := mt7986b-rfb
|
||||||
|
DEVICE_DTS_DIR := $(DTS_DIR)/
|
||||||
|
KERNEL_LOADADDR := 0x48000000
|
||||||
|
SUPPORTED_DEVICES := mediatek,mt7986b-rfb
|
||||||
|
UBINIZE_OPTS := -E 5
|
||||||
|
BLOCKSIZE := 128k
|
||||||
|
PAGESIZE := 2048
|
||||||
|
IMAGE_SIZE := 65536k
|
||||||
|
KERNEL_IN_UBI := 1
|
||||||
|
IMAGES += factory.bin
|
||||||
|
IMAGE/factory.bin := append-ubi | check-size $$$$(IMAGE_SIZE)
|
||||||
|
IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata
|
||||||
|
endef
|
||||||
|
TARGET_DEVICES += mediatek_mt7986b-rfb
|
@ -38,26 +38,3 @@ define KernelPackage/sdhci-mtk
|
|||||||
endef
|
endef
|
||||||
|
|
||||||
$(eval $(call KernelPackage,sdhci-mtk))
|
$(eval $(call KernelPackage,sdhci-mtk))
|
||||||
|
|
||||||
define KernelPackage/crypto-hw-mtk
|
|
||||||
TITLE:= MediaTek's Crypto Engine module
|
|
||||||
DEPENDS:=@TARGET_mediatek
|
|
||||||
KCONFIG:= \
|
|
||||||
CONFIG_CRYPTO_HW=y \
|
|
||||||
CONFIG_CRYPTO_AES=y \
|
|
||||||
CONFIG_CRYPTO_AEAD=y \
|
|
||||||
CONFIG_CRYPTO_SHA1=y \
|
|
||||||
CONFIG_CRYPTO_SHA256=y \
|
|
||||||
CONFIG_CRYPTO_SHA512=y \
|
|
||||||
CONFIG_CRYPTO_HMAC=y \
|
|
||||||
CONFIG_CRYPTO_DEV_MEDIATEK
|
|
||||||
FILES:=$(LINUX_DIR)/drivers/crypto/mediatek/mtk-crypto.ko
|
|
||||||
AUTOLOAD:=$(call AutoLoad,90,mtk-crypto)
|
|
||||||
$(call AddDepends/crypto)
|
|
||||||
endef
|
|
||||||
|
|
||||||
define KernelPackage/crypto-hw-mtk/description
|
|
||||||
MediaTek's EIP97 Cryptographic Engine driver.
|
|
||||||
endef
|
|
||||||
|
|
||||||
$(eval $(call KernelPackage,crypto-hw-mtk))
|
|
||||||
|
@ -70,6 +70,7 @@ CONFIG_COMMON_CLK_MT7622=y
|
|||||||
CONFIG_COMMON_CLK_MT7622_AUDSYS=y
|
CONFIG_COMMON_CLK_MT7622_AUDSYS=y
|
||||||
CONFIG_COMMON_CLK_MT7622_ETHSYS=y
|
CONFIG_COMMON_CLK_MT7622_ETHSYS=y
|
||||||
CONFIG_COMMON_CLK_MT7622_HIFSYS=y
|
CONFIG_COMMON_CLK_MT7622_HIFSYS=y
|
||||||
|
# CONFIG_COMMON_CLK_MT7986 is not set
|
||||||
# CONFIG_COMMON_CLK_MT8173 is not set
|
# CONFIG_COMMON_CLK_MT8173 is not set
|
||||||
CONFIG_COMMON_CLK_MT8183=y
|
CONFIG_COMMON_CLK_MT8183=y
|
||||||
# CONFIG_COMMON_CLK_MT8183_AUDIOSYS is not set
|
# CONFIG_COMMON_CLK_MT8183_AUDIOSYS is not set
|
||||||
@ -333,6 +334,7 @@ CONFIG_PINCTRL=y
|
|||||||
# CONFIG_PINCTRL_MT6765 is not set
|
# CONFIG_PINCTRL_MT6765 is not set
|
||||||
# CONFIG_PINCTRL_MT6797 is not set
|
# CONFIG_PINCTRL_MT6797 is not set
|
||||||
CONFIG_PINCTRL_MT7622=y
|
CONFIG_PINCTRL_MT7622=y
|
||||||
|
# CONFIG_PINCTRL_MT7986 is not set
|
||||||
# CONFIG_PINCTRL_MT8173 is not set
|
# CONFIG_PINCTRL_MT8173 is not set
|
||||||
# CONFIG_PINCTRL_MT8183 is not set
|
# CONFIG_PINCTRL_MT8183 is not set
|
||||||
CONFIG_PINCTRL_MT8516=y
|
CONFIG_PINCTRL_MT8516=y
|
||||||
|
@ -65,6 +65,7 @@ CONFIG_COMMON_CLK_MT2701_MMSYS=y
|
|||||||
CONFIG_COMMON_CLK_MT2701_VDECSYS=y
|
CONFIG_COMMON_CLK_MT2701_VDECSYS=y
|
||||||
# CONFIG_COMMON_CLK_MT7622 is not set
|
# CONFIG_COMMON_CLK_MT7622 is not set
|
||||||
# CONFIG_COMMON_CLK_MT7629 is not set
|
# CONFIG_COMMON_CLK_MT7629 is not set
|
||||||
|
# CONFIG_COMMON_CLK_MT7986 is not set
|
||||||
# CONFIG_COMMON_CLK_MT8135 is not set
|
# CONFIG_COMMON_CLK_MT8135 is not set
|
||||||
# CONFIG_COMMON_CLK_MT8173 is not set
|
# CONFIG_COMMON_CLK_MT8173 is not set
|
||||||
CONFIG_COMMON_CLK_MT8516=y
|
CONFIG_COMMON_CLK_MT8516=y
|
||||||
@ -470,6 +471,7 @@ CONFIG_PINCTRL=y
|
|||||||
CONFIG_PINCTRL_MT2701=y
|
CONFIG_PINCTRL_MT2701=y
|
||||||
CONFIG_PINCTRL_MT6397=y
|
CONFIG_PINCTRL_MT6397=y
|
||||||
CONFIG_PINCTRL_MT7623=y
|
CONFIG_PINCTRL_MT7623=y
|
||||||
|
# CONFIG_PINCTRL_MT7986 is not set
|
||||||
CONFIG_PINCTRL_MTK=y
|
CONFIG_PINCTRL_MTK=y
|
||||||
CONFIG_PINCTRL_MTK_MOORE=y
|
CONFIG_PINCTRL_MTK_MOORE=y
|
||||||
CONFIG_PINCTRL_MTK_V2=y
|
CONFIG_PINCTRL_MTK_V2=y
|
||||||
|
@ -9,7 +9,7 @@ CPU_TYPE:=cortex-a7
|
|||||||
CPU_SUBTYPE:=neon-vfpv4
|
CPU_SUBTYPE:=neon-vfpv4
|
||||||
KERNELNAME:=Image dtbs zImage
|
KERNELNAME:=Image dtbs zImage
|
||||||
FEATURES+=display usbgadget
|
FEATURES+=display usbgadget
|
||||||
DEFAULT_PACKAGES+=uboot-envtools
|
DEFAULT_PACKAGES+=kmod-crypto-hw-safexcel uboot-envtools
|
||||||
|
|
||||||
define Target/Description
|
define Target/Description
|
||||||
Build firmware images for MediaTek mt7623 ARM based boards.
|
Build firmware images for MediaTek mt7623 ARM based boards.
|
||||||
|
@ -49,6 +49,7 @@ CONFIG_COMMON_CLK_MEDIATEK=y
|
|||||||
CONFIG_COMMON_CLK_MT7629=y
|
CONFIG_COMMON_CLK_MT7629=y
|
||||||
CONFIG_COMMON_CLK_MT7629_ETHSYS=y
|
CONFIG_COMMON_CLK_MT7629_ETHSYS=y
|
||||||
CONFIG_COMMON_CLK_MT7629_HIFSYS=y
|
CONFIG_COMMON_CLK_MT7629_HIFSYS=y
|
||||||
|
# CONFIG_COMMON_CLK_MT7986 is not set
|
||||||
# CONFIG_COMMON_CLK_MT8135 is not set
|
# CONFIG_COMMON_CLK_MT8135 is not set
|
||||||
# CONFIG_COMMON_CLK_MT8173 is not set
|
# CONFIG_COMMON_CLK_MT8173 is not set
|
||||||
CONFIG_COMMON_CLK_MT8516=y
|
CONFIG_COMMON_CLK_MT8516=y
|
||||||
@ -233,6 +234,7 @@ CONFIG_PHY_MTK_TPHY=y
|
|||||||
# CONFIG_PHY_MTK_XSPHY is not set
|
# CONFIG_PHY_MTK_XSPHY is not set
|
||||||
CONFIG_PINCTRL=y
|
CONFIG_PINCTRL=y
|
||||||
CONFIG_PINCTRL_MT7629=y
|
CONFIG_PINCTRL_MT7629=y
|
||||||
|
# CONFIG_PINCTRL_MT7986 is not set
|
||||||
CONFIG_PINCTRL_MTK_MOORE=y
|
CONFIG_PINCTRL_MTK_MOORE=y
|
||||||
CONFIG_PINCTRL_MTK_V2=y
|
CONFIG_PINCTRL_MTK_V2=y
|
||||||
CONFIG_PM=y
|
CONFIG_PM=y
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
--- a/arch/arm/boot/dts/mt7623.dtsi
|
--- a/arch/arm/boot/dts/mt7623.dtsi
|
||||||
+++ b/arch/arm/boot/dts/mt7623.dtsi
|
+++ b/arch/arm/boot/dts/mt7623.dtsi
|
||||||
@@ -951,17 +951,14 @@
|
@@ -951,17 +951,15 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
crypto: crypto@1b240000 {
|
crypto: crypto@1b240000 {
|
||||||
@ -18,6 +18,7 @@
|
|||||||
- clock-names = "cryp";
|
- clock-names = "cryp";
|
||||||
- power-domains = <&scpsys MT2701_POWER_DOMAIN_ETH>;
|
- power-domains = <&scpsys MT2701_POWER_DOMAIN_ETH>;
|
||||||
- status = "disabled";
|
- status = "disabled";
|
||||||
|
+ status = "okay";
|
||||||
};
|
};
|
||||||
|
|
||||||
bdpsys: syscon@1c000000 {
|
bdpsys: syscon@1c000000 {
|
||||||
|
@ -0,0 +1,26 @@
|
|||||||
|
--- a/drivers/pinctrl/mediatek/Kconfig
|
||||||
|
+++ b/drivers/pinctrl/mediatek/Kconfig
|
||||||
|
@@ -120,6 +120,13 @@ config PINCTRL_MT7622
|
||||||
|
default ARM64 && ARCH_MEDIATEK
|
||||||
|
select PINCTRL_MTK_MOORE
|
||||||
|
|
||||||
|
+config PINCTRL_MT7986
|
||||||
|
+ bool "Mediatek MT7986 pin control"
|
||||||
|
+ depends on OF
|
||||||
|
+ depends on ARM64 || COMPILE_TEST
|
||||||
|
+ default ARM64 && ARCH_MEDIATEK
|
||||||
|
+ select PINCTRL_MTK_MOORE
|
||||||
|
+
|
||||||
|
config PINCTRL_MT8167
|
||||||
|
bool "Mediatek MT8167 pin control"
|
||||||
|
depends on OF
|
||||||
|
--- a/drivers/pinctrl/mediatek/Makefile
|
||||||
|
+++ b/drivers/pinctrl/mediatek/Makefile
|
||||||
|
@@ -17,6 +17,7 @@ obj-$(CONFIG_PINCTRL_MT6797) += pinctrl-
|
||||||
|
obj-$(CONFIG_PINCTRL_MT7622) += pinctrl-mt7622.o
|
||||||
|
obj-$(CONFIG_PINCTRL_MT7623) += pinctrl-mt7623.o
|
||||||
|
obj-$(CONFIG_PINCTRL_MT7629) += pinctrl-mt7629.o
|
||||||
|
+obj-$(CONFIG_PINCTRL_MT7986) += pinctrl-mt7986.o
|
||||||
|
obj-$(CONFIG_PINCTRL_MT8167) += pinctrl-mt8167.o
|
||||||
|
obj-$(CONFIG_PINCTRL_MT8173) += pinctrl-mt8173.o
|
||||||
|
obj-$(CONFIG_PINCTRL_MT8183) += pinctrl-mt8183.o
|
@ -0,0 +1,28 @@
|
|||||||
|
--- a/drivers/clk/mediatek/clk-mtk.c
|
||||||
|
+++ b/drivers/clk/mediatek/clk-mtk.c
|
||||||
|
@@ -43,6 +43,15 @@ err_out:
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
+void mtk_free_clk_data(struct clk_onecell_data *clk_data)
|
||||||
|
+{
|
||||||
|
+ if (!clk_data)
|
||||||
|
+ return;
|
||||||
|
+
|
||||||
|
+ kfree(clk_data->clks);
|
||||||
|
+ kfree(clk_data);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
void mtk_clk_register_fixed_clks(const struct mtk_fixed_clk *clks,
|
||||||
|
int num, struct clk_onecell_data *clk_data)
|
||||||
|
{
|
||||||
|
--- a/drivers/clk/mediatek/clk-mtk.h
|
||||||
|
+++ b/drivers/clk/mediatek/clk-mtk.h
|
||||||
|
@@ -202,6 +202,7 @@ void mtk_clk_register_dividers(const str
|
||||||
|
struct clk_onecell_data *clk_data);
|
||||||
|
|
||||||
|
struct clk_onecell_data *mtk_alloc_clk_data(unsigned int clk_num);
|
||||||
|
+void mtk_free_clk_data(struct clk_onecell_data *clk_data);
|
||||||
|
|
||||||
|
#define HAVE_RST_BAR BIT(0)
|
||||||
|
#define PLL_AO BIT(1)
|
@ -0,0 +1,39 @@
|
|||||||
|
--- a/drivers/clk/mediatek/Kconfig
|
||||||
|
+++ b/drivers/clk/mediatek/Kconfig
|
||||||
|
@@ -344,6 +344,23 @@ config COMMON_CLK_MT7629_HIFSYS
|
||||||
|
This driver supports MediaTek MT7629 HIFSYS clocks providing
|
||||||
|
to PCI-E and USB.
|
||||||
|
|
||||||
|
+config COMMON_CLK_MT7986
|
||||||
|
+ bool "Clock driver for MediaTek MT7986"
|
||||||
|
+ depends on ARCH_MEDIATEK || COMPILE_TEST
|
||||||
|
+ select COMMON_CLK_MEDIATEK
|
||||||
|
+ default ARCH_MEDIATEK
|
||||||
|
+ help
|
||||||
|
+ This driver supports MediaTek MT7986 basic clocks and clocks
|
||||||
|
+ required for various periperals found on MediaTek.
|
||||||
|
+
|
||||||
|
+config COMMON_CLK_MT7986_ETHSYS
|
||||||
|
+ bool "Clock driver for MediaTek MT7986 ETHSYS"
|
||||||
|
+ depends on COMMON_CLK_MT7986
|
||||||
|
+ default COMMON_CLK_MT7986
|
||||||
|
+ help
|
||||||
|
+ This driver add support for clocks for Ethernet and SGMII
|
||||||
|
+ required on MediaTek MT7986 SoC.
|
||||||
|
+
|
||||||
|
config COMMON_CLK_MT8135
|
||||||
|
bool "Clock driver for MediaTek MT8135"
|
||||||
|
depends on (ARCH_MEDIATEK && ARM) || COMPILE_TEST
|
||||||
|
--- a/drivers/clk/mediatek/Makefile
|
||||||
|
+++ b/drivers/clk/mediatek/Makefile
|
||||||
|
@@ -46,6 +46,10 @@ obj-$(CONFIG_COMMON_CLK_MT7622_AUDSYS) +
|
||||||
|
obj-$(CONFIG_COMMON_CLK_MT7629) += clk-mt7629.o
|
||||||
|
obj-$(CONFIG_COMMON_CLK_MT7629_ETHSYS) += clk-mt7629-eth.o
|
||||||
|
obj-$(CONFIG_COMMON_CLK_MT7629_HIFSYS) += clk-mt7629-hif.o
|
||||||
|
+obj-$(CONFIG_COMMON_CLK_MT7986) += clk-mt7986-apmixed.o
|
||||||
|
+obj-$(CONFIG_COMMON_CLK_MT7986) += clk-mt7986-topckgen.o
|
||||||
|
+obj-$(CONFIG_COMMON_CLK_MT7986) += clk-mt7986-infracfg.o
|
||||||
|
+obj-$(CONFIG_COMMON_CLK_MT7986_ETHSYS) += clk-mt7986-eth.o
|
||||||
|
obj-$(CONFIG_COMMON_CLK_MT8135) += clk-mt8135.o
|
||||||
|
obj-$(CONFIG_COMMON_CLK_MT8167) += clk-mt8167.o
|
||||||
|
obj-$(CONFIG_COMMON_CLK_MT8167_AUDSYS) += clk-mt8167-aud.o
|
@ -0,0 +1,917 @@
|
|||||||
|
From 7d99750f96fc6904d54affebdc8c9b0bfae1e9e8 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Sam Shih <sam.shih@mediatek.com>
|
||||||
|
Date: Sun, 17 Apr 2022 11:40:22 +0800
|
||||||
|
Subject: [PATCH] spi: mediatek: backport document and driver to support mt7986
|
||||||
|
spi design
|
||||||
|
|
||||||
|
this patch add the support of ipm design and upgrade devicetree binding
|
||||||
|
|
||||||
|
The patch is comming from following threads
|
||||||
|
- https://lore.kernel.org/all/20220315032411.2826-1-leilk.liu@mediatek.com/
|
||||||
|
- https://lore.kernel.org/all/20220401071616.8874-1-leilk.liu@mediatek.com/
|
||||||
|
|
||||||
|
Signed-off-by: Sam Shih <sam.shih@mediatek.com>
|
||||||
|
---
|
||||||
|
.../bindings/spi/mediatek,spi-mt65xx.yaml | 111 ++++
|
||||||
|
drivers/spi/spi-mt65xx.c | 509 ++++++++++++++++--
|
||||||
|
2 files changed, 572 insertions(+), 48 deletions(-)
|
||||||
|
create mode 100644 Documentation/devicetree/bindings/spi/mediatek,spi-mt65xx.yaml
|
||||||
|
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/Documentation/devicetree/bindings/spi/mediatek,spi-mt65xx.yaml
|
||||||
|
@@ -0,0 +1,111 @@
|
||||||
|
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||||
|
+%YAML 1.2
|
||||||
|
+---
|
||||||
|
+$id: http://devicetree.org/schemas/spi/mediatek,spi-mt65xx.yaml#
|
||||||
|
+$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
|
+
|
||||||
|
+title: SPI Bus controller for MediaTek ARM SoCs
|
||||||
|
+
|
||||||
|
+maintainers:
|
||||||
|
+ - Leilk Liu <leilk.liu@mediatek.com>
|
||||||
|
+
|
||||||
|
+allOf:
|
||||||
|
+ - $ref: "/schemas/spi/spi-controller.yaml#"
|
||||||
|
+
|
||||||
|
+properties:
|
||||||
|
+ compatible:
|
||||||
|
+ oneOf:
|
||||||
|
+ - items:
|
||||||
|
+ - enum:
|
||||||
|
+ - mediatek,mt7629-spi
|
||||||
|
+ - const: mediatek,mt7622-spi
|
||||||
|
+ - items:
|
||||||
|
+ - enum:
|
||||||
|
+ - mediatek,mt8516-spi
|
||||||
|
+ - const: mediatek,mt2712-spi
|
||||||
|
+ - items:
|
||||||
|
+ - enum:
|
||||||
|
+ - mediatek,mt6779-spi
|
||||||
|
+ - mediatek,mt8186-spi
|
||||||
|
+ - mediatek,mt8192-spi
|
||||||
|
+ - mediatek,mt8195-spi
|
||||||
|
+ - const: mediatek,mt6765-spi
|
||||||
|
+ - items:
|
||||||
|
+ - enum:
|
||||||
|
+ - mediatek,mt7986-spi-ipm
|
||||||
|
+ - const: mediatek,spi-ipm
|
||||||
|
+ - items:
|
||||||
|
+ - enum:
|
||||||
|
+ - mediatek,mt2701-spi
|
||||||
|
+ - mediatek,mt2712-spi
|
||||||
|
+ - mediatek,mt6589-spi
|
||||||
|
+ - mediatek,mt6765-spi
|
||||||
|
+ - mediatek,mt6893-spi
|
||||||
|
+ - mediatek,mt7622-spi
|
||||||
|
+ - mediatek,mt8135-spi
|
||||||
|
+ - mediatek,mt8173-spi
|
||||||
|
+ - mediatek,mt8183-spi
|
||||||
|
+
|
||||||
|
+ reg:
|
||||||
|
+ maxItems: 1
|
||||||
|
+
|
||||||
|
+ interrupts:
|
||||||
|
+ maxItems: 1
|
||||||
|
+
|
||||||
|
+ clocks:
|
||||||
|
+ minItems: 3
|
||||||
|
+ items:
|
||||||
|
+ - description: clock used for the parent clock
|
||||||
|
+ - description: clock used for the muxes clock
|
||||||
|
+ - description: clock used for the clock gate
|
||||||
|
+ - description: clock used for the AHB bus, this clock is optional
|
||||||
|
+
|
||||||
|
+ clock-names:
|
||||||
|
+ minItems: 3
|
||||||
|
+ items:
|
||||||
|
+ - const: parent-clk
|
||||||
|
+ - const: sel-clk
|
||||||
|
+ - const: spi-clk
|
||||||
|
+ - const: hclk
|
||||||
|
+
|
||||||
|
+ mediatek,pad-select:
|
||||||
|
+ $ref: /schemas/types.yaml#/definitions/uint32-array
|
||||||
|
+ minItems: 1
|
||||||
|
+ maxItems: 4
|
||||||
|
+ items:
|
||||||
|
+ enum: [0, 1, 2, 3]
|
||||||
|
+ description:
|
||||||
|
+ specify which pins group(ck/mi/mo/cs) spi controller used.
|
||||||
|
+ This is an array.
|
||||||
|
+
|
||||||
|
+required:
|
||||||
|
+ - compatible
|
||||||
|
+ - reg
|
||||||
|
+ - interrupts
|
||||||
|
+ - clocks
|
||||||
|
+ - clock-names
|
||||||
|
+ - '#address-cells'
|
||||||
|
+ - '#size-cells'
|
||||||
|
+
|
||||||
|
+unevaluatedProperties: false
|
||||||
|
+
|
||||||
|
+examples:
|
||||||
|
+ - |
|
||||||
|
+ #include <dt-bindings/clock/mt8173-clk.h>
|
||||||
|
+ #include <dt-bindings/gpio/gpio.h>
|
||||||
|
+ #include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||||
|
+ #include <dt-bindings/interrupt-controller/irq.h>
|
||||||
|
+
|
||||||
|
+ spi@1100a000 {
|
||||||
|
+ compatible = "mediatek,mt8173-spi";
|
||||||
|
+ #address-cells = <1>;
|
||||||
|
+ #size-cells = <0>;
|
||||||
|
+ reg = <0x1100a000 0x1000>;
|
||||||
|
+ interrupts = <GIC_SPI 110 IRQ_TYPE_LEVEL_LOW>;
|
||||||
|
+ clocks = <&topckgen CLK_TOP_SYSPLL3_D2>,
|
||||||
|
+ <&topckgen CLK_TOP_SPI_SEL>,
|
||||||
|
+ <&pericfg CLK_PERI_SPI0>;
|
||||||
|
+ clock-names = "parent-clk", "sel-clk", "spi-clk";
|
||||||
|
+ cs-gpios = <&pio 105 GPIO_ACTIVE_LOW>, <&pio 72 GPIO_ACTIVE_LOW>;
|
||||||
|
+ mediatek,pad-select = <1>, <0>;
|
||||||
|
+ };
|
||||||
|
--- a/drivers/spi/spi-mt65xx.c
|
||||||
|
+++ b/drivers/spi/spi-mt65xx.c
|
||||||
|
@@ -12,11 +12,12 @@
|
||||||
|
#include <linux/ioport.h>
|
||||||
|
#include <linux/module.h>
|
||||||
|
#include <linux/of.h>
|
||||||
|
-#include <linux/of_gpio.h>
|
||||||
|
+#include <linux/gpio/consumer.h>
|
||||||
|
#include <linux/platform_device.h>
|
||||||
|
#include <linux/platform_data/spi-mt65xx.h>
|
||||||
|
#include <linux/pm_runtime.h>
|
||||||
|
#include <linux/spi/spi.h>
|
||||||
|
+#include <linux/spi/spi-mem.h>
|
||||||
|
#include <linux/dma-mapping.h>
|
||||||
|
|
||||||
|
#define SPI_CFG0_REG 0x0000
|
||||||
|
@@ -31,6 +32,7 @@
|
||||||
|
#define SPI_CFG2_REG 0x0028
|
||||||
|
#define SPI_TX_SRC_REG_64 0x002c
|
||||||
|
#define SPI_RX_DST_REG_64 0x0030
|
||||||
|
+#define SPI_CFG3_IPM_REG 0x0040
|
||||||
|
|
||||||
|
#define SPI_CFG0_SCK_HIGH_OFFSET 0
|
||||||
|
#define SPI_CFG0_SCK_LOW_OFFSET 8
|
||||||
|
@@ -51,6 +53,7 @@
|
||||||
|
#define SPI_CFG1_CS_IDLE_MASK 0xff
|
||||||
|
#define SPI_CFG1_PACKET_LOOP_MASK 0xff00
|
||||||
|
#define SPI_CFG1_PACKET_LENGTH_MASK 0x3ff0000
|
||||||
|
+#define SPI_CFG1_IPM_PACKET_LENGTH_MASK GENMASK(31, 16)
|
||||||
|
#define SPI_CFG2_SCK_HIGH_OFFSET 0
|
||||||
|
#define SPI_CFG2_SCK_LOW_OFFSET 16
|
||||||
|
|
||||||
|
@@ -71,6 +74,24 @@
|
||||||
|
#define SPI_CMD_TX_ENDIAN BIT(15)
|
||||||
|
#define SPI_CMD_FINISH_IE BIT(16)
|
||||||
|
#define SPI_CMD_PAUSE_IE BIT(17)
|
||||||
|
+#define SPI_CMD_IPM_NONIDLE_MODE BIT(19)
|
||||||
|
+#define SPI_CMD_IPM_SPIM_LOOP BIT(21)
|
||||||
|
+#define SPI_CMD_IPM_GET_TICKDLY_OFFSET 22
|
||||||
|
+
|
||||||
|
+#define SPI_CMD_IPM_GET_TICKDLY_MASK GENMASK(24, 22)
|
||||||
|
+
|
||||||
|
+#define PIN_MODE_CFG(x) ((x) / 2)
|
||||||
|
+
|
||||||
|
+#define SPI_CFG3_IPM_HALF_DUPLEX_DIR BIT(2)
|
||||||
|
+#define SPI_CFG3_IPM_HALF_DUPLEX_EN BIT(3)
|
||||||
|
+#define SPI_CFG3_IPM_XMODE_EN BIT(4)
|
||||||
|
+#define SPI_CFG3_IPM_NODATA_FLAG BIT(5)
|
||||||
|
+#define SPI_CFG3_IPM_CMD_BYTELEN_OFFSET 8
|
||||||
|
+#define SPI_CFG3_IPM_ADDR_BYTELEN_OFFSET 12
|
||||||
|
+
|
||||||
|
+#define SPI_CFG3_IPM_CMD_PIN_MODE_MASK GENMASK(1, 0)
|
||||||
|
+#define SPI_CFG3_IPM_CMD_BYTELEN_MASK GENMASK(11, 8)
|
||||||
|
+#define SPI_CFG3_IPM_ADDR_BYTELEN_MASK GENMASK(15, 12)
|
||||||
|
|
||||||
|
#define MT8173_SPI_MAX_PAD_SEL 3
|
||||||
|
|
||||||
|
@@ -81,6 +102,9 @@
|
||||||
|
|
||||||
|
#define MTK_SPI_MAX_FIFO_SIZE 32U
|
||||||
|
#define MTK_SPI_PACKET_SIZE 1024
|
||||||
|
+#define MTK_SPI_IPM_PACKET_SIZE SZ_64K
|
||||||
|
+#define MTK_SPI_IPM_PACKET_LOOP SZ_256
|
||||||
|
+
|
||||||
|
#define MTK_SPI_32BITS_MASK (0xffffffff)
|
||||||
|
|
||||||
|
#define DMA_ADDR_EXT_BITS (36)
|
||||||
|
@@ -96,6 +120,8 @@ struct mtk_spi_compatible {
|
||||||
|
bool dma_ext;
|
||||||
|
/* some IC no need unprepare SPI clk */
|
||||||
|
bool no_need_unprepare;
|
||||||
|
+ /* IPM design adjust and extend register to support more features */
|
||||||
|
+ bool ipm_design;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct mtk_spi {
|
||||||
|
@@ -103,7 +129,7 @@ struct mtk_spi {
|
||||||
|
u32 state;
|
||||||
|
int pad_num;
|
||||||
|
u32 *pad_sel;
|
||||||
|
- struct clk *parent_clk, *sel_clk, *spi_clk;
|
||||||
|
+ struct clk *parent_clk, *sel_clk, *spi_clk, *spi_hclk;
|
||||||
|
struct spi_transfer *cur_transfer;
|
||||||
|
u32 xfer_len;
|
||||||
|
u32 num_xfered;
|
||||||
|
@@ -111,6 +137,11 @@ struct mtk_spi {
|
||||||
|
u32 tx_sgl_len, rx_sgl_len;
|
||||||
|
const struct mtk_spi_compatible *dev_comp;
|
||||||
|
u32 spi_clk_hz;
|
||||||
|
+ struct completion spimem_done;
|
||||||
|
+ bool use_spimem;
|
||||||
|
+ struct device *dev;
|
||||||
|
+ dma_addr_t tx_dma;
|
||||||
|
+ dma_addr_t rx_dma;
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct mtk_spi_compatible mtk_common_compat;
|
||||||
|
@@ -119,6 +150,12 @@ static const struct mtk_spi_compatible m
|
||||||
|
.must_tx = true,
|
||||||
|
};
|
||||||
|
|
||||||
|
+static const struct mtk_spi_compatible mtk_ipm_compat = {
|
||||||
|
+ .enhance_timing = true,
|
||||||
|
+ .dma_ext = true,
|
||||||
|
+ .ipm_design = true,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
static const struct mtk_spi_compatible mt6765_compat = {
|
||||||
|
.need_pad_sel = true,
|
||||||
|
.must_tx = true,
|
||||||
|
@@ -160,6 +197,9 @@ static const struct mtk_chip_config mtk_
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct of_device_id mtk_spi_of_match[] = {
|
||||||
|
+ { .compatible = "mediatek,spi-ipm",
|
||||||
|
+ .data = (void *)&mtk_ipm_compat,
|
||||||
|
+ },
|
||||||
|
{ .compatible = "mediatek,mt2701-spi",
|
||||||
|
.data = (void *)&mtk_common_compat,
|
||||||
|
},
|
||||||
|
@@ -278,12 +318,11 @@ static int mtk_spi_set_hw_cs_timing(stru
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
-static int mtk_spi_prepare_message(struct spi_master *master,
|
||||||
|
- struct spi_message *msg)
|
||||||
|
+static int mtk_spi_hw_init(struct spi_master *master,
|
||||||
|
+ struct spi_device *spi)
|
||||||
|
{
|
||||||
|
u16 cpha, cpol;
|
||||||
|
u32 reg_val;
|
||||||
|
- struct spi_device *spi = msg->spi;
|
||||||
|
struct mtk_chip_config *chip_config = spi->controller_data;
|
||||||
|
struct mtk_spi *mdata = spi_master_get_devdata(master);
|
||||||
|
|
||||||
|
@@ -291,6 +330,15 @@ static int mtk_spi_prepare_message(struc
|
||||||
|
cpol = spi->mode & SPI_CPOL ? 1 : 0;
|
||||||
|
|
||||||
|
reg_val = readl(mdata->base + SPI_CMD_REG);
|
||||||
|
+ if (mdata->dev_comp->ipm_design) {
|
||||||
|
+ /* SPI transfer without idle time until packet length done */
|
||||||
|
+ reg_val |= SPI_CMD_IPM_NONIDLE_MODE;
|
||||||
|
+ if (spi->mode & SPI_LOOP)
|
||||||
|
+ reg_val |= SPI_CMD_IPM_SPIM_LOOP;
|
||||||
|
+ else
|
||||||
|
+ reg_val &= ~SPI_CMD_IPM_SPIM_LOOP;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
if (cpha)
|
||||||
|
reg_val |= SPI_CMD_CPHA;
|
||||||
|
else
|
||||||
|
@@ -348,23 +396,39 @@ static int mtk_spi_prepare_message(struc
|
||||||
|
mdata->base + SPI_PAD_SEL_REG);
|
||||||
|
|
||||||
|
/* tick delay */
|
||||||
|
- reg_val = readl(mdata->base + SPI_CFG1_REG);
|
||||||
|
if (mdata->dev_comp->enhance_timing) {
|
||||||
|
- reg_val &= ~SPI_CFG1_GET_TICK_DLY_MASK;
|
||||||
|
- reg_val |= ((chip_config->tick_delay & 0x7)
|
||||||
|
- << SPI_CFG1_GET_TICK_DLY_OFFSET);
|
||||||
|
+ if (mdata->dev_comp->ipm_design) {
|
||||||
|
+ reg_val = readl(mdata->base + SPI_CMD_REG);
|
||||||
|
+ reg_val &= ~SPI_CMD_IPM_GET_TICKDLY_MASK;
|
||||||
|
+ reg_val |= ((chip_config->tick_delay & 0x7)
|
||||||
|
+ << SPI_CMD_IPM_GET_TICKDLY_OFFSET);
|
||||||
|
+ writel(reg_val, mdata->base + SPI_CMD_REG);
|
||||||
|
+ } else {
|
||||||
|
+ reg_val = readl(mdata->base + SPI_CFG1_REG);
|
||||||
|
+ reg_val &= ~SPI_CFG1_GET_TICK_DLY_MASK;
|
||||||
|
+ reg_val |= ((chip_config->tick_delay & 0x7)
|
||||||
|
+ << SPI_CFG1_GET_TICK_DLY_OFFSET);
|
||||||
|
+ writel(reg_val, mdata->base + SPI_CFG1_REG);
|
||||||
|
+ }
|
||||||
|
} else {
|
||||||
|
+ reg_val = readl(mdata->base + SPI_CFG1_REG);
|
||||||
|
reg_val &= ~SPI_CFG1_GET_TICK_DLY_MASK_V1;
|
||||||
|
reg_val |= ((chip_config->tick_delay & 0x3)
|
||||||
|
<< SPI_CFG1_GET_TICK_DLY_OFFSET_V1);
|
||||||
|
+ writel(reg_val, mdata->base + SPI_CFG1_REG);
|
||||||
|
}
|
||||||
|
- writel(reg_val, mdata->base + SPI_CFG1_REG);
|
||||||
|
|
||||||
|
/* set hw cs timing */
|
||||||
|
mtk_spi_set_hw_cs_timing(spi);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static int mtk_spi_prepare_message(struct spi_master *master,
|
||||||
|
+ struct spi_message *msg)
|
||||||
|
+{
|
||||||
|
+ return mtk_spi_hw_init(master, msg->spi);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static void mtk_spi_set_cs(struct spi_device *spi, bool enable)
|
||||||
|
{
|
||||||
|
u32 reg_val;
|
||||||
|
@@ -386,13 +450,13 @@ static void mtk_spi_set_cs(struct spi_de
|
||||||
|
}
|
||||||
|
|
||||||
|
static void mtk_spi_prepare_transfer(struct spi_master *master,
|
||||||
|
- struct spi_transfer *xfer)
|
||||||
|
+ u32 speed_hz)
|
||||||
|
{
|
||||||
|
u32 div, sck_time, reg_val;
|
||||||
|
struct mtk_spi *mdata = spi_master_get_devdata(master);
|
||||||
|
|
||||||
|
- if (xfer->speed_hz < mdata->spi_clk_hz / 2)
|
||||||
|
- div = DIV_ROUND_UP(mdata->spi_clk_hz, xfer->speed_hz);
|
||||||
|
+ if (speed_hz < mdata->spi_clk_hz / 2)
|
||||||
|
+ div = DIV_ROUND_UP(mdata->spi_clk_hz, speed_hz);
|
||||||
|
else
|
||||||
|
div = 1;
|
||||||
|
|
||||||
|
@@ -423,12 +487,24 @@ static void mtk_spi_setup_packet(struct
|
||||||
|
u32 packet_size, packet_loop, reg_val;
|
||||||
|
struct mtk_spi *mdata = spi_master_get_devdata(master);
|
||||||
|
|
||||||
|
- packet_size = min_t(u32, mdata->xfer_len, MTK_SPI_PACKET_SIZE);
|
||||||
|
+ if (mdata->dev_comp->ipm_design)
|
||||||
|
+ packet_size = min_t(u32,
|
||||||
|
+ mdata->xfer_len,
|
||||||
|
+ MTK_SPI_IPM_PACKET_SIZE);
|
||||||
|
+ else
|
||||||
|
+ packet_size = min_t(u32,
|
||||||
|
+ mdata->xfer_len,
|
||||||
|
+ MTK_SPI_PACKET_SIZE);
|
||||||
|
+
|
||||||
|
packet_loop = mdata->xfer_len / packet_size;
|
||||||
|
|
||||||
|
reg_val = readl(mdata->base + SPI_CFG1_REG);
|
||||||
|
- reg_val &= ~(SPI_CFG1_PACKET_LENGTH_MASK | SPI_CFG1_PACKET_LOOP_MASK);
|
||||||
|
+ if (mdata->dev_comp->ipm_design)
|
||||||
|
+ reg_val &= ~SPI_CFG1_IPM_PACKET_LENGTH_MASK;
|
||||||
|
+ else
|
||||||
|
+ reg_val &= ~SPI_CFG1_PACKET_LENGTH_MASK;
|
||||||
|
reg_val |= (packet_size - 1) << SPI_CFG1_PACKET_LENGTH_OFFSET;
|
||||||
|
+ reg_val &= ~SPI_CFG1_PACKET_LOOP_MASK;
|
||||||
|
reg_val |= (packet_loop - 1) << SPI_CFG1_PACKET_LOOP_OFFSET;
|
||||||
|
writel(reg_val, mdata->base + SPI_CFG1_REG);
|
||||||
|
}
|
||||||
|
@@ -523,7 +599,7 @@ static int mtk_spi_fifo_transfer(struct
|
||||||
|
mdata->cur_transfer = xfer;
|
||||||
|
mdata->xfer_len = min(MTK_SPI_MAX_FIFO_SIZE, xfer->len);
|
||||||
|
mdata->num_xfered = 0;
|
||||||
|
- mtk_spi_prepare_transfer(master, xfer);
|
||||||
|
+ mtk_spi_prepare_transfer(master, xfer->speed_hz);
|
||||||
|
mtk_spi_setup_packet(master);
|
||||||
|
|
||||||
|
if (xfer->tx_buf) {
|
||||||
|
@@ -556,7 +632,7 @@ static int mtk_spi_dma_transfer(struct s
|
||||||
|
mdata->cur_transfer = xfer;
|
||||||
|
mdata->num_xfered = 0;
|
||||||
|
|
||||||
|
- mtk_spi_prepare_transfer(master, xfer);
|
||||||
|
+ mtk_spi_prepare_transfer(master, xfer->speed_hz);
|
||||||
|
|
||||||
|
cmd = readl(mdata->base + SPI_CMD_REG);
|
||||||
|
if (xfer->tx_buf)
|
||||||
|
@@ -591,6 +667,19 @@ static int mtk_spi_transfer_one(struct s
|
||||||
|
struct spi_device *spi,
|
||||||
|
struct spi_transfer *xfer)
|
||||||
|
{
|
||||||
|
+ struct mtk_spi *mdata = spi_master_get_devdata(spi->master);
|
||||||
|
+ u32 reg_val = 0;
|
||||||
|
+
|
||||||
|
+ /* prepare xfer direction and duplex mode */
|
||||||
|
+ if (mdata->dev_comp->ipm_design) {
|
||||||
|
+ if (!xfer->tx_buf || !xfer->rx_buf) {
|
||||||
|
+ reg_val |= SPI_CFG3_IPM_HALF_DUPLEX_EN;
|
||||||
|
+ if (xfer->rx_buf)
|
||||||
|
+ reg_val |= SPI_CFG3_IPM_HALF_DUPLEX_DIR;
|
||||||
|
+ }
|
||||||
|
+ writel(reg_val, mdata->base + SPI_CFG3_IPM_REG);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
if (master->can_dma(master, spi, xfer))
|
||||||
|
return mtk_spi_dma_transfer(master, spi, xfer);
|
||||||
|
else
|
||||||
|
@@ -614,8 +703,9 @@ static int mtk_spi_setup(struct spi_devi
|
||||||
|
if (!spi->controller_data)
|
||||||
|
spi->controller_data = (void *)&mtk_default_chip_info;
|
||||||
|
|
||||||
|
- if (mdata->dev_comp->need_pad_sel && gpio_is_valid(spi->cs_gpio))
|
||||||
|
- gpio_direction_output(spi->cs_gpio, !(spi->mode & SPI_CS_HIGH));
|
||||||
|
+ if (mdata->dev_comp->need_pad_sel && spi->cs_gpiod)
|
||||||
|
+ /* CS de-asserted, gpiolib will handle inversion */
|
||||||
|
+ gpiod_direction_output(spi->cs_gpiod, 0);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
@@ -633,6 +723,12 @@ static irqreturn_t mtk_spi_interrupt(int
|
||||||
|
else
|
||||||
|
mdata->state = MTK_SPI_IDLE;
|
||||||
|
|
||||||
|
+ /* SPI-MEM ops */
|
||||||
|
+ if (mdata->use_spimem) {
|
||||||
|
+ complete(&mdata->spimem_done);
|
||||||
|
+ return IRQ_HANDLED;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
if (!master->can_dma(master, NULL, trans)) {
|
||||||
|
if (trans->rx_buf) {
|
||||||
|
cnt = mdata->xfer_len / 4;
|
||||||
|
@@ -716,6 +812,274 @@ static irqreturn_t mtk_spi_interrupt(int
|
||||||
|
return IRQ_HANDLED;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static int mtk_spi_mem_adjust_op_size(struct spi_mem *mem,
|
||||||
|
+ struct spi_mem_op *op)
|
||||||
|
+{
|
||||||
|
+ int opcode_len;
|
||||||
|
+
|
||||||
|
+ if (op->data.dir != SPI_MEM_NO_DATA) {
|
||||||
|
+ opcode_len = 1 + op->addr.nbytes + op->dummy.nbytes;
|
||||||
|
+ if (opcode_len + op->data.nbytes > MTK_SPI_IPM_PACKET_SIZE) {
|
||||||
|
+ op->data.nbytes = MTK_SPI_IPM_PACKET_SIZE - opcode_len;
|
||||||
|
+ /* force data buffer dma-aligned. */
|
||||||
|
+ op->data.nbytes -= op->data.nbytes % 4;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static bool mtk_spi_mem_supports_op(struct spi_mem *mem,
|
||||||
|
+ const struct spi_mem_op *op)
|
||||||
|
+{
|
||||||
|
+ if (!spi_mem_default_supports_op(mem, op))
|
||||||
|
+ return false;
|
||||||
|
+
|
||||||
|
+ if (op->addr.nbytes && op->dummy.nbytes &&
|
||||||
|
+ op->addr.buswidth != op->dummy.buswidth)
|
||||||
|
+ return false;
|
||||||
|
+
|
||||||
|
+ if (op->addr.nbytes + op->dummy.nbytes > 16)
|
||||||
|
+ return false;
|
||||||
|
+
|
||||||
|
+ if (op->data.nbytes > MTK_SPI_IPM_PACKET_SIZE) {
|
||||||
|
+ if (op->data.nbytes / MTK_SPI_IPM_PACKET_SIZE >
|
||||||
|
+ MTK_SPI_IPM_PACKET_LOOP ||
|
||||||
|
+ op->data.nbytes % MTK_SPI_IPM_PACKET_SIZE != 0)
|
||||||
|
+ return false;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return true;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void mtk_spi_mem_setup_dma_xfer(struct spi_master *master,
|
||||||
|
+ const struct spi_mem_op *op)
|
||||||
|
+{
|
||||||
|
+ struct mtk_spi *mdata = spi_master_get_devdata(master);
|
||||||
|
+
|
||||||
|
+ writel((u32)(mdata->tx_dma & MTK_SPI_32BITS_MASK),
|
||||||
|
+ mdata->base + SPI_TX_SRC_REG);
|
||||||
|
+#ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT
|
||||||
|
+ if (mdata->dev_comp->dma_ext)
|
||||||
|
+ writel((u32)(mdata->tx_dma >> 32),
|
||||||
|
+ mdata->base + SPI_TX_SRC_REG_64);
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
+ if (op->data.dir == SPI_MEM_DATA_IN) {
|
||||||
|
+ writel((u32)(mdata->rx_dma & MTK_SPI_32BITS_MASK),
|
||||||
|
+ mdata->base + SPI_RX_DST_REG);
|
||||||
|
+#ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT
|
||||||
|
+ if (mdata->dev_comp->dma_ext)
|
||||||
|
+ writel((u32)(mdata->rx_dma >> 32),
|
||||||
|
+ mdata->base + SPI_RX_DST_REG_64);
|
||||||
|
+#endif
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int mtk_spi_transfer_wait(struct spi_mem *mem,
|
||||||
|
+ const struct spi_mem_op *op)
|
||||||
|
+{
|
||||||
|
+ struct mtk_spi *mdata = spi_master_get_devdata(mem->spi->master);
|
||||||
|
+ /*
|
||||||
|
+ * For each byte we wait for 8 cycles of the SPI clock.
|
||||||
|
+ * Since speed is defined in Hz and we want milliseconds,
|
||||||
|
+ * so it should be 8 * 1000.
|
||||||
|
+ */
|
||||||
|
+ u64 ms = 8000LL;
|
||||||
|
+
|
||||||
|
+ if (op->data.dir == SPI_MEM_NO_DATA)
|
||||||
|
+ ms *= 32; /* prevent we may get 0 for short transfers. */
|
||||||
|
+ else
|
||||||
|
+ ms *= op->data.nbytes;
|
||||||
|
+ ms = div_u64(ms, mem->spi->max_speed_hz);
|
||||||
|
+ ms += ms + 1000; /* 1s tolerance */
|
||||||
|
+
|
||||||
|
+ if (ms > UINT_MAX)
|
||||||
|
+ ms = UINT_MAX;
|
||||||
|
+
|
||||||
|
+ if (!wait_for_completion_timeout(&mdata->spimem_done,
|
||||||
|
+ msecs_to_jiffies(ms))) {
|
||||||
|
+ dev_err(mdata->dev, "spi-mem transfer timeout\n");
|
||||||
|
+ return -ETIMEDOUT;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int mtk_spi_mem_exec_op(struct spi_mem *mem,
|
||||||
|
+ const struct spi_mem_op *op)
|
||||||
|
+{
|
||||||
|
+ struct mtk_spi *mdata = spi_master_get_devdata(mem->spi->master);
|
||||||
|
+ u32 reg_val, nio, tx_size;
|
||||||
|
+ char *tx_tmp_buf, *rx_tmp_buf;
|
||||||
|
+ int ret = 0;
|
||||||
|
+
|
||||||
|
+ mdata->use_spimem = true;
|
||||||
|
+ reinit_completion(&mdata->spimem_done);
|
||||||
|
+
|
||||||
|
+ mtk_spi_reset(mdata);
|
||||||
|
+ mtk_spi_hw_init(mem->spi->master, mem->spi);
|
||||||
|
+ mtk_spi_prepare_transfer(mem->spi->master, mem->spi->max_speed_hz);
|
||||||
|
+
|
||||||
|
+ reg_val = readl(mdata->base + SPI_CFG3_IPM_REG);
|
||||||
|
+ /* opcode byte len */
|
||||||
|
+ reg_val &= ~SPI_CFG3_IPM_CMD_BYTELEN_MASK;
|
||||||
|
+ reg_val |= 1 << SPI_CFG3_IPM_CMD_BYTELEN_OFFSET;
|
||||||
|
+
|
||||||
|
+ /* addr & dummy byte len */
|
||||||
|
+ reg_val &= ~SPI_CFG3_IPM_ADDR_BYTELEN_MASK;
|
||||||
|
+ if (op->addr.nbytes || op->dummy.nbytes)
|
||||||
|
+ reg_val |= (op->addr.nbytes + op->dummy.nbytes) <<
|
||||||
|
+ SPI_CFG3_IPM_ADDR_BYTELEN_OFFSET;
|
||||||
|
+
|
||||||
|
+ /* data byte len */
|
||||||
|
+ if (op->data.dir == SPI_MEM_NO_DATA) {
|
||||||
|
+ reg_val |= SPI_CFG3_IPM_NODATA_FLAG;
|
||||||
|
+ writel(0, mdata->base + SPI_CFG1_REG);
|
||||||
|
+ } else {
|
||||||
|
+ reg_val &= ~SPI_CFG3_IPM_NODATA_FLAG;
|
||||||
|
+ mdata->xfer_len = op->data.nbytes;
|
||||||
|
+ mtk_spi_setup_packet(mem->spi->master);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (op->addr.nbytes || op->dummy.nbytes) {
|
||||||
|
+ if (op->addr.buswidth == 1 || op->dummy.buswidth == 1)
|
||||||
|
+ reg_val |= SPI_CFG3_IPM_XMODE_EN;
|
||||||
|
+ else
|
||||||
|
+ reg_val &= ~SPI_CFG3_IPM_XMODE_EN;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (op->addr.buswidth == 2 ||
|
||||||
|
+ op->dummy.buswidth == 2 ||
|
||||||
|
+ op->data.buswidth == 2)
|
||||||
|
+ nio = 2;
|
||||||
|
+ else if (op->addr.buswidth == 4 ||
|
||||||
|
+ op->dummy.buswidth == 4 ||
|
||||||
|
+ op->data.buswidth == 4)
|
||||||
|
+ nio = 4;
|
||||||
|
+ else
|
||||||
|
+ nio = 1;
|
||||||
|
+
|
||||||
|
+ reg_val &= ~SPI_CFG3_IPM_CMD_PIN_MODE_MASK;
|
||||||
|
+ reg_val |= PIN_MODE_CFG(nio);
|
||||||
|
+
|
||||||
|
+ reg_val |= SPI_CFG3_IPM_HALF_DUPLEX_EN;
|
||||||
|
+ if (op->data.dir == SPI_MEM_DATA_IN)
|
||||||
|
+ reg_val |= SPI_CFG3_IPM_HALF_DUPLEX_DIR;
|
||||||
|
+ else
|
||||||
|
+ reg_val &= ~SPI_CFG3_IPM_HALF_DUPLEX_DIR;
|
||||||
|
+ writel(reg_val, mdata->base + SPI_CFG3_IPM_REG);
|
||||||
|
+
|
||||||
|
+ tx_size = 1 + op->addr.nbytes + op->dummy.nbytes;
|
||||||
|
+ if (op->data.dir == SPI_MEM_DATA_OUT)
|
||||||
|
+ tx_size += op->data.nbytes;
|
||||||
|
+
|
||||||
|
+ tx_size = max_t(u32, tx_size, 32);
|
||||||
|
+
|
||||||
|
+ tx_tmp_buf = kzalloc(tx_size, GFP_KERNEL | GFP_DMA);
|
||||||
|
+ if (!tx_tmp_buf) {
|
||||||
|
+ mdata->use_spimem = false;
|
||||||
|
+ return -ENOMEM;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ tx_tmp_buf[0] = op->cmd.opcode;
|
||||||
|
+
|
||||||
|
+ if (op->addr.nbytes) {
|
||||||
|
+ int i;
|
||||||
|
+
|
||||||
|
+ for (i = 0; i < op->addr.nbytes; i++)
|
||||||
|
+ tx_tmp_buf[i + 1] = op->addr.val >>
|
||||||
|
+ (8 * (op->addr.nbytes - i - 1));
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (op->dummy.nbytes)
|
||||||
|
+ memset(tx_tmp_buf + op->addr.nbytes + 1,
|
||||||
|
+ 0xff,
|
||||||
|
+ op->dummy.nbytes);
|
||||||
|
+
|
||||||
|
+ if (op->data.nbytes && op->data.dir == SPI_MEM_DATA_OUT)
|
||||||
|
+ memcpy(tx_tmp_buf + op->dummy.nbytes + op->addr.nbytes + 1,
|
||||||
|
+ op->data.buf.out,
|
||||||
|
+ op->data.nbytes);
|
||||||
|
+
|
||||||
|
+ mdata->tx_dma = dma_map_single(mdata->dev, tx_tmp_buf,
|
||||||
|
+ tx_size, DMA_TO_DEVICE);
|
||||||
|
+ if (dma_mapping_error(mdata->dev, mdata->tx_dma)) {
|
||||||
|
+ ret = -ENOMEM;
|
||||||
|
+ goto err_exit;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (op->data.dir == SPI_MEM_DATA_IN) {
|
||||||
|
+ if (!IS_ALIGNED((size_t)op->data.buf.in, 4)) {
|
||||||
|
+ rx_tmp_buf = kzalloc(op->data.nbytes,
|
||||||
|
+ GFP_KERNEL | GFP_DMA);
|
||||||
|
+ if (!rx_tmp_buf) {
|
||||||
|
+ ret = -ENOMEM;
|
||||||
|
+ goto unmap_tx_dma;
|
||||||
|
+ }
|
||||||
|
+ } else {
|
||||||
|
+ rx_tmp_buf = op->data.buf.in;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ mdata->rx_dma = dma_map_single(mdata->dev,
|
||||||
|
+ rx_tmp_buf,
|
||||||
|
+ op->data.nbytes,
|
||||||
|
+ DMA_FROM_DEVICE);
|
||||||
|
+ if (dma_mapping_error(mdata->dev, mdata->rx_dma)) {
|
||||||
|
+ ret = -ENOMEM;
|
||||||
|
+ goto kfree_rx_tmp_buf;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ reg_val = readl(mdata->base + SPI_CMD_REG);
|
||||||
|
+ reg_val |= SPI_CMD_TX_DMA;
|
||||||
|
+ if (op->data.dir == SPI_MEM_DATA_IN)
|
||||||
|
+ reg_val |= SPI_CMD_RX_DMA;
|
||||||
|
+ writel(reg_val, mdata->base + SPI_CMD_REG);
|
||||||
|
+
|
||||||
|
+ mtk_spi_mem_setup_dma_xfer(mem->spi->master, op);
|
||||||
|
+
|
||||||
|
+ mtk_spi_enable_transfer(mem->spi->master);
|
||||||
|
+
|
||||||
|
+ /* Wait for the interrupt. */
|
||||||
|
+ ret = mtk_spi_transfer_wait(mem, op);
|
||||||
|
+ if (ret)
|
||||||
|
+ goto unmap_rx_dma;
|
||||||
|
+
|
||||||
|
+ /* spi disable dma */
|
||||||
|
+ reg_val = readl(mdata->base + SPI_CMD_REG);
|
||||||
|
+ reg_val &= ~SPI_CMD_TX_DMA;
|
||||||
|
+ if (op->data.dir == SPI_MEM_DATA_IN)
|
||||||
|
+ reg_val &= ~SPI_CMD_RX_DMA;
|
||||||
|
+ writel(reg_val, mdata->base + SPI_CMD_REG);
|
||||||
|
+
|
||||||
|
+unmap_rx_dma:
|
||||||
|
+ if (op->data.dir == SPI_MEM_DATA_IN) {
|
||||||
|
+ dma_unmap_single(mdata->dev, mdata->rx_dma,
|
||||||
|
+ op->data.nbytes, DMA_FROM_DEVICE);
|
||||||
|
+ if (!IS_ALIGNED((size_t)op->data.buf.in, 4))
|
||||||
|
+ memcpy(op->data.buf.in, rx_tmp_buf, op->data.nbytes);
|
||||||
|
+ }
|
||||||
|
+kfree_rx_tmp_buf:
|
||||||
|
+ if (op->data.dir == SPI_MEM_DATA_IN &&
|
||||||
|
+ !IS_ALIGNED((size_t)op->data.buf.in, 4))
|
||||||
|
+ kfree(rx_tmp_buf);
|
||||||
|
+unmap_tx_dma:
|
||||||
|
+ dma_unmap_single(mdata->dev, mdata->tx_dma,
|
||||||
|
+ tx_size, DMA_TO_DEVICE);
|
||||||
|
+err_exit:
|
||||||
|
+ kfree(tx_tmp_buf);
|
||||||
|
+ mdata->use_spimem = false;
|
||||||
|
+
|
||||||
|
+ return ret;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static const struct spi_controller_mem_ops mtk_spi_mem_ops = {
|
||||||
|
+ .adjust_op_size = mtk_spi_mem_adjust_op_size,
|
||||||
|
+ .supports_op = mtk_spi_mem_supports_op,
|
||||||
|
+ .exec_op = mtk_spi_mem_exec_op,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
static int mtk_spi_probe(struct platform_device *pdev)
|
||||||
|
{
|
||||||
|
struct spi_master *master;
|
||||||
|
@@ -739,6 +1103,7 @@ static int mtk_spi_probe(struct platform
|
||||||
|
master->can_dma = mtk_spi_can_dma;
|
||||||
|
master->setup = mtk_spi_setup;
|
||||||
|
master->set_cs_timing = mtk_spi_set_hw_cs_timing;
|
||||||
|
+ master->use_gpio_descriptors = true;
|
||||||
|
|
||||||
|
of_id = of_match_node(mtk_spi_of_match, pdev->dev.of_node);
|
||||||
|
if (!of_id) {
|
||||||
|
@@ -755,6 +1120,14 @@ static int mtk_spi_probe(struct platform
|
||||||
|
|
||||||
|
if (mdata->dev_comp->must_tx)
|
||||||
|
master->flags = SPI_MASTER_MUST_TX;
|
||||||
|
+ if (mdata->dev_comp->ipm_design)
|
||||||
|
+ master->mode_bits |= SPI_LOOP;
|
||||||
|
+
|
||||||
|
+ if (mdata->dev_comp->ipm_design) {
|
||||||
|
+ mdata->dev = &pdev->dev;
|
||||||
|
+ master->mem_ops = &mtk_spi_mem_ops;
|
||||||
|
+ init_completion(&mdata->spimem_done);
|
||||||
|
+ }
|
||||||
|
|
||||||
|
if (mdata->dev_comp->need_pad_sel) {
|
||||||
|
mdata->pad_num = of_property_count_u32_elems(
|
||||||
|
@@ -831,25 +1204,40 @@ static int mtk_spi_probe(struct platform
|
||||||
|
goto err_put_master;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ mdata->spi_hclk = devm_clk_get_optional(&pdev->dev, "hclk");
|
||||||
|
+ if (IS_ERR(mdata->spi_hclk)) {
|
||||||
|
+ ret = PTR_ERR(mdata->spi_hclk);
|
||||||
|
+ dev_err(&pdev->dev, "failed to get hclk: %d\n", ret);
|
||||||
|
+ goto err_put_master;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ ret = clk_prepare_enable(mdata->spi_hclk);
|
||||||
|
+ if (ret < 0) {
|
||||||
|
+ dev_err(&pdev->dev, "failed to enable hclk (%d)\n", ret);
|
||||||
|
+ goto err_put_master;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
ret = clk_prepare_enable(mdata->spi_clk);
|
||||||
|
if (ret < 0) {
|
||||||
|
dev_err(&pdev->dev, "failed to enable spi_clk (%d)\n", ret);
|
||||||
|
- goto err_put_master;
|
||||||
|
+ goto err_disable_spi_hclk;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = clk_set_parent(mdata->sel_clk, mdata->parent_clk);
|
||||||
|
if (ret < 0) {
|
||||||
|
dev_err(&pdev->dev, "failed to clk_set_parent (%d)\n", ret);
|
||||||
|
- clk_disable_unprepare(mdata->spi_clk);
|
||||||
|
- goto err_put_master;
|
||||||
|
+ goto err_disable_spi_clk;
|
||||||
|
}
|
||||||
|
|
||||||
|
mdata->spi_clk_hz = clk_get_rate(mdata->spi_clk);
|
||||||
|
|
||||||
|
- if (mdata->dev_comp->no_need_unprepare)
|
||||||
|
+ if (mdata->dev_comp->no_need_unprepare) {
|
||||||
|
clk_disable(mdata->spi_clk);
|
||||||
|
- else
|
||||||
|
+ clk_disable(mdata->spi_hclk);
|
||||||
|
+ } else {
|
||||||
|
clk_disable_unprepare(mdata->spi_clk);
|
||||||
|
+ clk_disable_unprepare(mdata->spi_hclk);
|
||||||
|
+ }
|
||||||
|
|
||||||
|
pm_runtime_enable(&pdev->dev);
|
||||||
|
|
||||||
|
@@ -862,25 +1250,12 @@ static int mtk_spi_probe(struct platform
|
||||||
|
goto err_disable_runtime_pm;
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (!master->cs_gpios && master->num_chipselect > 1) {
|
||||||
|
+ if (!master->cs_gpiods && master->num_chipselect > 1) {
|
||||||
|
dev_err(&pdev->dev,
|
||||||
|
"cs_gpios not specified and num_chipselect > 1\n");
|
||||||
|
ret = -EINVAL;
|
||||||
|
goto err_disable_runtime_pm;
|
||||||
|
}
|
||||||
|
-
|
||||||
|
- if (master->cs_gpios) {
|
||||||
|
- for (i = 0; i < master->num_chipselect; i++) {
|
||||||
|
- ret = devm_gpio_request(&pdev->dev,
|
||||||
|
- master->cs_gpios[i],
|
||||||
|
- dev_name(&pdev->dev));
|
||||||
|
- if (ret) {
|
||||||
|
- dev_err(&pdev->dev,
|
||||||
|
- "can't get CS GPIO %i\n", i);
|
||||||
|
- goto err_disable_runtime_pm;
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mdata->dev_comp->dma_ext)
|
||||||
|
@@ -902,6 +1277,10 @@ static int mtk_spi_probe(struct platform
|
||||||
|
|
||||||
|
err_disable_runtime_pm:
|
||||||
|
pm_runtime_disable(&pdev->dev);
|
||||||
|
+err_disable_spi_clk:
|
||||||
|
+ clk_disable_unprepare(mdata->spi_clk);
|
||||||
|
+err_disable_spi_hclk:
|
||||||
|
+ clk_disable_unprepare(mdata->spi_hclk);
|
||||||
|
err_put_master:
|
||||||
|
spi_master_put(master);
|
||||||
|
|
||||||
|
@@ -917,8 +1296,10 @@ static int mtk_spi_remove(struct platfor
|
||||||
|
|
||||||
|
mtk_spi_reset(mdata);
|
||||||
|
|
||||||
|
- if (mdata->dev_comp->no_need_unprepare)
|
||||||
|
+ if (mdata->dev_comp->no_need_unprepare) {
|
||||||
|
clk_unprepare(mdata->spi_clk);
|
||||||
|
+ clk_unprepare(mdata->spi_hclk);
|
||||||
|
+ }
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
@@ -934,8 +1315,10 @@ static int mtk_spi_suspend(struct device
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
- if (!pm_runtime_suspended(dev))
|
||||||
|
+ if (!pm_runtime_suspended(dev)) {
|
||||||
|
clk_disable_unprepare(mdata->spi_clk);
|
||||||
|
+ clk_disable_unprepare(mdata->spi_hclk);
|
||||||
|
+ }
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
@@ -952,11 +1335,20 @@ static int mtk_spi_resume(struct device
|
||||||
|
dev_err(dev, "failed to enable spi_clk (%d)\n", ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+ ret = clk_prepare_enable(mdata->spi_hclk);
|
||||||
|
+ if (ret < 0) {
|
||||||
|
+ dev_err(dev, "failed to enable spi_hclk (%d)\n", ret);
|
||||||
|
+ clk_disable_unprepare(mdata->spi_clk);
|
||||||
|
+ return ret;
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = spi_master_resume(master);
|
||||||
|
- if (ret < 0)
|
||||||
|
+ if (ret < 0) {
|
||||||
|
clk_disable_unprepare(mdata->spi_clk);
|
||||||
|
+ clk_disable_unprepare(mdata->spi_hclk);
|
||||||
|
+ }
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
@@ -968,10 +1360,13 @@ static int mtk_spi_runtime_suspend(struc
|
||||||
|
struct spi_master *master = dev_get_drvdata(dev);
|
||||||
|
struct mtk_spi *mdata = spi_master_get_devdata(master);
|
||||||
|
|
||||||
|
- if (mdata->dev_comp->no_need_unprepare)
|
||||||
|
+ if (mdata->dev_comp->no_need_unprepare) {
|
||||||
|
clk_disable(mdata->spi_clk);
|
||||||
|
- else
|
||||||
|
+ clk_disable(mdata->spi_hclk);
|
||||||
|
+ } else {
|
||||||
|
clk_disable_unprepare(mdata->spi_clk);
|
||||||
|
+ clk_disable_unprepare(mdata->spi_hclk);
|
||||||
|
+ }
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
@@ -982,13 +1377,31 @@ static int mtk_spi_runtime_resume(struct
|
||||||
|
struct mtk_spi *mdata = spi_master_get_devdata(master);
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
- if (mdata->dev_comp->no_need_unprepare)
|
||||||
|
+ if (mdata->dev_comp->no_need_unprepare) {
|
||||||
|
ret = clk_enable(mdata->spi_clk);
|
||||||
|
- else
|
||||||
|
+ if (ret < 0) {
|
||||||
|
+ dev_err(dev, "failed to enable spi_clk (%d)\n", ret);
|
||||||
|
+ return ret;
|
||||||
|
+ }
|
||||||
|
+ ret = clk_enable(mdata->spi_hclk);
|
||||||
|
+ if (ret < 0) {
|
||||||
|
+ dev_err(dev, "failed to enable spi_hclk (%d)\n", ret);
|
||||||
|
+ clk_disable(mdata->spi_clk);
|
||||||
|
+ return ret;
|
||||||
|
+ }
|
||||||
|
+ } else {
|
||||||
|
ret = clk_prepare_enable(mdata->spi_clk);
|
||||||
|
- if (ret < 0) {
|
||||||
|
- dev_err(dev, "failed to enable spi_clk (%d)\n", ret);
|
||||||
|
- return ret;
|
||||||
|
+ if (ret < 0) {
|
||||||
|
+ dev_err(dev, "failed to prepare_enable spi_clk (%d)\n", ret);
|
||||||
|
+ return ret;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ ret = clk_prepare_enable(mdata->spi_hclk);
|
||||||
|
+ if (ret < 0) {
|
||||||
|
+ dev_err(dev, "failed to prepare_enable spi_hclk (%d)\n", ret);
|
||||||
|
+ clk_disable_unprepare(mdata->spi_clk);
|
||||||
|
+ return ret;
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
@ -0,0 +1,44 @@
|
|||||||
|
From 1a7963e9843f6f1e4b02a30926d20b314c03e4df Mon Sep 17 00:00:00 2001
|
||||||
|
From: Sam Shih <sam.shih@mediatek.com>
|
||||||
|
Date: Sat, 25 Jun 2022 02:10:13 +0800
|
||||||
|
Subject: [PATCH] mmc: mediatek: add support for MT7986 SoC
|
||||||
|
|
||||||
|
Adding mt7986 own characteristics and of_device_id to have support
|
||||||
|
of MT7986 SoC.
|
||||||
|
|
||||||
|
Signed-off-by: Sam Shih <sam.shih@mediatek.com>
|
||||||
|
Change-Id: I07cf8406cbe8c1a7114b304f35fc3e689e512e5a
|
||||||
|
---
|
||||||
|
drivers/mmc/host/mtk-sd.c | 14 ++++++++++++++
|
||||||
|
1 file changed, 14 insertions(+)
|
||||||
|
|
||||||
|
--- a/drivers/mmc/host/mtk-sd.c
|
||||||
|
+++ b/drivers/mmc/host/mtk-sd.c
|
||||||
|
@@ -540,6 +540,19 @@ static const struct mtk_mmc_compatible m
|
||||||
|
.support_64g = false,
|
||||||
|
};
|
||||||
|
|
||||||
|
+static const struct mtk_mmc_compatible mt7986_compat = {
|
||||||
|
+ .clk_div_bits = 12,
|
||||||
|
+ .recheck_sdio_irq = true,
|
||||||
|
+ .hs400_tune = false,
|
||||||
|
+ .pad_tune_reg = MSDC_PAD_TUNE0,
|
||||||
|
+ .async_fifo = true,
|
||||||
|
+ .data_tune = true,
|
||||||
|
+ .busy_check = true,
|
||||||
|
+ .stop_clk_fix = true,
|
||||||
|
+ .enhance_rx = true,
|
||||||
|
+ .support_64g = true,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
static const struct mtk_mmc_compatible mt8516_compat = {
|
||||||
|
.clk_div_bits = 12,
|
||||||
|
.recheck_sdio_irq = true,
|
||||||
|
@@ -584,6 +597,7 @@ static const struct of_device_id msdc_of
|
||||||
|
{ .compatible = "mediatek,mt2701-mmc", .data = &mt2701_compat},
|
||||||
|
{ .compatible = "mediatek,mt2712-mmc", .data = &mt2712_compat},
|
||||||
|
{ .compatible = "mediatek,mt7622-mmc", .data = &mt7622_compat},
|
||||||
|
+ { .compatible = "mediatek,mt7986-mmc", .data = &mt7986_compat},
|
||||||
|
{ .compatible = "mediatek,mt8516-mmc", .data = &mt8516_compat},
|
||||||
|
{ .compatible = "mediatek,mt7620-mmc", .data = &mt7620_compat},
|
||||||
|
{ .compatible = "mediatek,mt6779-mmc", .data = &mt6779_compat},
|
@ -0,0 +1,41 @@
|
|||||||
|
From f6ba5e17bee38f8ffe118c47fbfef3cf90eb87ff Mon Sep 17 00:00:00 2001
|
||||||
|
From: "Mingming.Su" <Mingming.Su@mediatek.com>
|
||||||
|
Date: Wed, 30 Jun 2021 16:59:32 +0800
|
||||||
|
Subject: [PATCH] mt7986: trng: add rng support
|
||||||
|
|
||||||
|
1. Add trng compatible name for MT7986
|
||||||
|
2. Fix mtk_rng_wait_ready() function
|
||||||
|
|
||||||
|
Signed-off-by: Mingming.Su <Mingming.Su@mediatek.com>
|
||||||
|
---
|
||||||
|
drivers/char/hw_random/mtk-rng.c | 5 +++--
|
||||||
|
1 file changed, 3 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
--- a/drivers/char/hw_random/mtk-rng.c
|
||||||
|
+++ b/drivers/char/hw_random/mtk-rng.c
|
||||||
|
@@ -22,7 +22,7 @@
|
||||||
|
#define RNG_AUTOSUSPEND_TIMEOUT 100
|
||||||
|
|
||||||
|
#define USEC_POLL 2
|
||||||
|
-#define TIMEOUT_POLL 20
|
||||||
|
+#define TIMEOUT_POLL 60
|
||||||
|
|
||||||
|
#define RNG_CTRL 0x00
|
||||||
|
#define RNG_EN BIT(0)
|
||||||
|
@@ -77,7 +77,7 @@ static bool mtk_rng_wait_ready(struct hw
|
||||||
|
readl_poll_timeout_atomic(priv->base + RNG_CTRL, ready,
|
||||||
|
ready & RNG_READY, USEC_POLL,
|
||||||
|
TIMEOUT_POLL);
|
||||||
|
- return !!ready;
|
||||||
|
+ return !!(ready & RNG_READY);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int mtk_rng_read(struct hwrng *rng, void *buf, size_t max, bool wait)
|
||||||
|
@@ -179,6 +179,7 @@ static const struct dev_pm_ops mtk_rng_p
|
||||||
|
#endif /* CONFIG_PM */
|
||||||
|
|
||||||
|
static const struct of_device_id mtk_rng_match[] = {
|
||||||
|
+ { .compatible = "mediatek,mt7986-rng" },
|
||||||
|
{ .compatible = "mediatek,mt7623-rng" },
|
||||||
|
{},
|
||||||
|
};
|
@ -0,0 +1,57 @@
|
|||||||
|
--- a/drivers/watchdog/mtk_wdt.c
|
||||||
|
+++ b/drivers/watchdog/mtk_wdt.c
|
||||||
|
@@ -9,6 +9,7 @@
|
||||||
|
* Based on sunxi_wdt.c
|
||||||
|
*/
|
||||||
|
|
||||||
|
+#include <dt-bindings/reset/mt7986-resets.h>
|
||||||
|
#include <dt-bindings/reset-controller/mt2712-resets.h>
|
||||||
|
#include <dt-bindings/reset-controller/mt8183-resets.h>
|
||||||
|
#include <dt-bindings/reset-controller/mt8192-resets.h>
|
||||||
|
@@ -65,6 +66,7 @@ struct mtk_wdt_dev {
|
||||||
|
void __iomem *wdt_base;
|
||||||
|
spinlock_t lock; /* protects WDT_SWSYSRST reg */
|
||||||
|
struct reset_controller_dev rcdev;
|
||||||
|
+ bool disable_wdt_extrst;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct mtk_wdt_data {
|
||||||
|
@@ -87,6 +89,10 @@ static const struct mtk_wdt_data mt8195_
|
||||||
|
.toprgu_sw_rst_num = MT8195_TOPRGU_SW_RST_NUM,
|
||||||
|
};
|
||||||
|
|
||||||
|
+static const struct mtk_wdt_data mt7986_data = {
|
||||||
|
+ .toprgu_sw_rst_num = MT7986_TOPRGU_SW_RST_NUM,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
static int toprgu_reset_update(struct reset_controller_dev *rcdev,
|
||||||
|
unsigned long id, bool assert)
|
||||||
|
{
|
||||||
|
@@ -256,6 +262,8 @@ static int mtk_wdt_start(struct watchdog
|
||||||
|
reg |= (WDT_MODE_IRQ_EN | WDT_MODE_DUAL_EN);
|
||||||
|
else
|
||||||
|
reg &= ~(WDT_MODE_IRQ_EN | WDT_MODE_DUAL_EN);
|
||||||
|
+ if (mtk_wdt->disable_wdt_extrst)
|
||||||
|
+ reg &= ~WDT_MODE_EXRST_EN;
|
||||||
|
reg |= (WDT_MODE_EN | WDT_MODE_KEY);
|
||||||
|
iowrite32(reg, wdt_base + WDT_MODE);
|
||||||
|
|
||||||
|
@@ -381,6 +389,10 @@ static int mtk_wdt_probe(struct platform
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+ mtk_wdt->disable_wdt_extrst =
|
||||||
|
+ of_property_read_bool(dev->of_node, "mediatek,disable-extrst");
|
||||||
|
+
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -414,6 +426,7 @@ static const struct of_device_id mtk_wdt
|
||||||
|
{ .compatible = "mediatek,mt8183-wdt", .data = &mt8183_data },
|
||||||
|
{ .compatible = "mediatek,mt8192-wdt", .data = &mt8192_data },
|
||||||
|
{ .compatible = "mediatek,mt8195-wdt", .data = &mt8195_data },
|
||||||
|
+ { .compatible = "mediatek,mt7986-wdt", .data = &mt7986_data },
|
||||||
|
{ /* sentinel */ }
|
||||||
|
};
|
||||||
|
MODULE_DEVICE_TABLE(of, mtk_wdt_dt_ids);
|
@ -0,0 +1,47 @@
|
|||||||
|
From 0f8a0dd620b2fb5f9c852844ce5f445bb0bd6d52 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Sam Shih <sam.shih@mediatek.com>
|
||||||
|
Date: Wed, 4 May 2022 10:27:43 +0800
|
||||||
|
Subject: [PATCH 5/5] mediatek: add mt7986a mmc support
|
||||||
|
|
||||||
|
Add mt7986a boot mmc support
|
||||||
|
|
||||||
|
Signed-off-by: Sam Shih <sam.shih@mediatek.com>
|
||||||
|
---
|
||||||
|
...-mmc-mediatek-add-mt7986-mmc-support.patch | 31 +++++++++++++++++++
|
||||||
|
1 file changed, 31 insertions(+)
|
||||||
|
create mode 100644 target/linux/mediatek/patches-5.15/0704-mmc-mediatek-add-mt7986-mmc-support.patch
|
||||||
|
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/target/linux/mediatek/patches-5.15/0704-mmc-mediatek-add-mt7986-mmc-support.patch
|
||||||
|
@@ -0,0 +1,31 @@
|
||||||
|
+diff --git a/drivers/mmc/host/mtk-sd.c b/drivers/mmc/host/mtk-sd.c
|
||||||
|
+index 1ac9201..a32349c 100644
|
||||||
|
+--- a/drivers/mmc/host/mtk-sd.c
|
||||||
|
++++ b/drivers/mmc/host/mtk-sd.c
|
||||||
|
+@@ -540,6 +540,18 @@ static const struct mtk_mmc_compatible mt7622_compat = {
|
||||||
|
+ .support_64g = false,
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
++static const struct mtk_mmc_compatible mt7986_compat = {
|
||||||
|
++ .clk_div_bits = 12,
|
||||||
|
++ .hs400_tune = false,
|
||||||
|
++ .pad_tune_reg = MSDC_PAD_TUNE0,
|
||||||
|
++ .async_fifo = true,
|
||||||
|
++ .data_tune = true,
|
||||||
|
++ .busy_check = true,
|
||||||
|
++ .stop_clk_fix = true,
|
||||||
|
++ .enhance_rx = true,
|
||||||
|
++ .support_64g = true,
|
||||||
|
++};
|
||||||
|
++
|
||||||
|
+ static const struct mtk_mmc_compatible mt8516_compat = {
|
||||||
|
+ .clk_div_bits = 12,
|
||||||
|
+ .recheck_sdio_irq = true,
|
||||||
|
+@@ -584,6 +596,7 @@ static const struct of_device_id msdc_of_ids[] = {
|
||||||
|
+ { .compatible = "mediatek,mt2701-mmc", .data = &mt2701_compat},
|
||||||
|
+ { .compatible = "mediatek,mt2712-mmc", .data = &mt2712_compat},
|
||||||
|
+ { .compatible = "mediatek,mt7622-mmc", .data = &mt7622_compat},
|
||||||
|
++ { .compatible = "mediatek,mt7986-mmc", .data = &mt7986_compat},
|
||||||
|
+ { .compatible = "mediatek,mt8516-mmc", .data = &mt8516_compat},
|
||||||
|
+ { .compatible = "mediatek,mt7620-mmc", .data = &mt7620_compat},
|
||||||
|
+ { .compatible = "mediatek,mt6779-mmc", .data = &mt6779_compat},
|
@ -0,0 +1,20 @@
|
|||||||
|
From: Felix Fietkau <nbd@nbd.name>
|
||||||
|
Date: Wed, 4 May 2022 12:03:42 +0200
|
||||||
|
Subject: [PATCH] PCI: mediatek-gen3: change driver name to mtk-pcie-gen3
|
||||||
|
|
||||||
|
This allows it to coexist with the other mtk pcie driver in the same kernel
|
||||||
|
|
||||||
|
Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||||
|
---
|
||||||
|
|
||||||
|
--- a/drivers/pci/controller/pcie-mediatek-gen3.c
|
||||||
|
+++ b/drivers/pci/controller/pcie-mediatek-gen3.c
|
||||||
|
@@ -1025,7 +1025,7 @@ static struct platform_driver mtk_pcie_d
|
||||||
|
.probe = mtk_pcie_probe,
|
||||||
|
.remove = mtk_pcie_remove,
|
||||||
|
.driver = {
|
||||||
|
- .name = "mtk-pcie",
|
||||||
|
+ .name = "mtk-pcie-gen3",
|
||||||
|
.of_match_table = mtk_pcie_of_match,
|
||||||
|
.pm = &mtk_pcie_pm_ops,
|
||||||
|
},
|
@ -0,0 +1,89 @@
|
|||||||
|
From b6bb61fd3818f4a3025fedbe4d15dbeeaef6ee82 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Weijie Gao <weijie.gao@mediatek.com>
|
||||||
|
Date: Tue, 2 Aug 2022 17:21:34 +0800
|
||||||
|
Subject: [PATCH 28/31] tools: mtk_image: split gfh header verification into a
|
||||||
|
new function
|
||||||
|
|
||||||
|
The verification code of gfh header for NAND and non-NAND are identical.
|
||||||
|
It's better to define a individual function to reduce redundancy.
|
||||||
|
|
||||||
|
Reviewed-by: Simon Glass <sjg@chromium.org>
|
||||||
|
Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
|
||||||
|
---
|
||||||
|
tools/mtk_image.c | 51 +++++++++++++++++++----------------------------
|
||||||
|
1 file changed, 21 insertions(+), 30 deletions(-)
|
||||||
|
|
||||||
|
--- a/tools/mtk_image.c
|
||||||
|
+++ b/tools/mtk_image.c
|
||||||
|
@@ -432,6 +432,25 @@ static int mtk_image_vrec_header(struct
|
||||||
|
return SHA256_SUM_LEN;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static int mtk_image_verify_gfh(struct gfh_header *gfh, uint32_t type, int print)
|
||||||
|
+{
|
||||||
|
+ if (strcmp(gfh->file_info.name, GFH_FILE_INFO_NAME))
|
||||||
|
+ return -1;
|
||||||
|
+
|
||||||
|
+ if (le32_to_cpu(gfh->file_info.flash_type) != type)
|
||||||
|
+ return -1;
|
||||||
|
+
|
||||||
|
+ if (print)
|
||||||
|
+ printf("Load Address: %08x\n",
|
||||||
|
+ le32_to_cpu(gfh->file_info.load_addr) +
|
||||||
|
+ le32_to_cpu(gfh->file_info.jump_offset));
|
||||||
|
+
|
||||||
|
+ if (print)
|
||||||
|
+ printf("Architecture: %s\n", is_arm64_image ? "ARM64" : "ARM");
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static int mtk_image_verify_gen_header(const uint8_t *ptr, int print)
|
||||||
|
{
|
||||||
|
union gen_boot_header *gbh = (union gen_boot_header *)ptr;
|
||||||
|
@@ -494,21 +513,7 @@ static int mtk_image_verify_gen_header(c
|
||||||
|
|
||||||
|
gfh = (struct gfh_header *)(ptr + gfh_offset);
|
||||||
|
|
||||||
|
- if (strcmp(gfh->file_info.name, GFH_FILE_INFO_NAME))
|
||||||
|
- return -1;
|
||||||
|
-
|
||||||
|
- if (le32_to_cpu(gfh->file_info.flash_type) != GFH_FLASH_TYPE_GEN)
|
||||||
|
- return -1;
|
||||||
|
-
|
||||||
|
- if (print)
|
||||||
|
- printf("Load Address: %08x\n",
|
||||||
|
- le32_to_cpu(gfh->file_info.load_addr) +
|
||||||
|
- le32_to_cpu(gfh->file_info.jump_offset));
|
||||||
|
-
|
||||||
|
- if (print)
|
||||||
|
- printf("Architecture: %s\n", is_arm64_image ? "ARM64" : "ARM");
|
||||||
|
-
|
||||||
|
- return 0;
|
||||||
|
+ return mtk_image_verify_gfh(gfh, GFH_FLASH_TYPE_GEN, print);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int mtk_image_verify_nand_header(const uint8_t *ptr, int print)
|
||||||
|
@@ -562,21 +567,7 @@ static int mtk_image_verify_nand_header(
|
||||||
|
|
||||||
|
gfh = (struct gfh_header *)(ptr + 2 * le16_to_cpu(nh->pagesize));
|
||||||
|
|
||||||
|
- if (strcmp(gfh->file_info.name, GFH_FILE_INFO_NAME))
|
||||||
|
- return -1;
|
||||||
|
-
|
||||||
|
- if (le32_to_cpu(gfh->file_info.flash_type) != GFH_FLASH_TYPE_NAND)
|
||||||
|
- return -1;
|
||||||
|
-
|
||||||
|
- if (print)
|
||||||
|
- printf("Load Address: %08x\n",
|
||||||
|
- le32_to_cpu(gfh->file_info.load_addr) +
|
||||||
|
- le32_to_cpu(gfh->file_info.jump_offset));
|
||||||
|
-
|
||||||
|
- if (print)
|
||||||
|
- printf("Architecture: %s\n", is_arm64_image ? "ARM64" : "ARM");
|
||||||
|
-
|
||||||
|
- return 0;
|
||||||
|
+ return mtk_image_verify_gfh(gfh, GFH_FLASH_TYPE_NAND, print);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int mtk_image_verify_header(unsigned char *ptr, int image_size,
|
@ -0,0 +1,821 @@
|
|||||||
|
From 20ebf03eab571b25e9f62b2764ab84932111dcd6 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Weijie Gao <weijie.gao@mediatek.com>
|
||||||
|
Date: Tue, 2 Aug 2022 17:23:57 +0800
|
||||||
|
Subject: [PATCH 29/31] tools: mtk_image: split the code of generating NAND
|
||||||
|
header into a new file
|
||||||
|
|
||||||
|
The predefined NAND headers take too much spaces in the mtk_image.c.
|
||||||
|
Moving them into a new file can significantly improve the readability of
|
||||||
|
both mtk_image.c and the new mtk_nand_headers.c.
|
||||||
|
|
||||||
|
This is a preparation for adding more NAND headers.
|
||||||
|
|
||||||
|
Reviewed-by: Simon Glass <sjg@chromium.org>
|
||||||
|
Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
|
||||||
|
---
|
||||||
|
tools/Makefile | 1 +
|
||||||
|
tools/mtk_image.c | 305 ++++++---------------------------------
|
||||||
|
tools/mtk_image.h | 25 ----
|
||||||
|
tools/mtk_nand_headers.c | 286 ++++++++++++++++++++++++++++++++++++
|
||||||
|
tools/mtk_nand_headers.h | 61 ++++++++
|
||||||
|
5 files changed, 389 insertions(+), 289 deletions(-)
|
||||||
|
create mode 100644 tools/mtk_nand_headers.c
|
||||||
|
create mode 100644 tools/mtk_nand_headers.h
|
||||||
|
|
||||||
|
--- a/tools/Makefile
|
||||||
|
+++ b/tools/Makefile
|
||||||
|
@@ -147,6 +147,7 @@ dumpimage-mkimage-objs := aisimage.o \
|
||||||
|
gpimage.o \
|
||||||
|
gpimage-common.o \
|
||||||
|
mtk_image.o \
|
||||||
|
+ mtk_nand_headers.o \
|
||||||
|
$(ECDSA_OBJS-y) \
|
||||||
|
$(RSA_OBJS-y) \
|
||||||
|
$(AES_OBJS-y)
|
||||||
|
--- a/tools/mtk_image.c
|
||||||
|
+++ b/tools/mtk_image.c
|
||||||
|
@@ -10,216 +10,7 @@
|
||||||
|
#include <u-boot/sha256.h>
|
||||||
|
#include "imagetool.h"
|
||||||
|
#include "mtk_image.h"
|
||||||
|
-
|
||||||
|
-/* NAND header for SPI-NAND with 2KB page + 64B spare */
|
||||||
|
-static const union nand_boot_header snand_hdr_2k_64_data = {
|
||||||
|
- .data = {
|
||||||
|
- 0x42, 0x4F, 0x4F, 0x54, 0x4C, 0x4F, 0x41, 0x44,
|
||||||
|
- 0x45, 0x52, 0x21, 0x00, 0x56, 0x30, 0x30, 0x36,
|
||||||
|
- 0x4E, 0x46, 0x49, 0x49, 0x4E, 0x46, 0x4F, 0x00,
|
||||||
|
- 0x00, 0x00, 0x00, 0x08, 0x03, 0x00, 0x40, 0x00,
|
||||||
|
- 0x40, 0x00, 0x00, 0x08, 0x10, 0x00, 0x16, 0x00,
|
||||||
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
- 0x00, 0x00, 0x00, 0x00, 0x7B, 0xC4, 0x17, 0x9D,
|
||||||
|
- 0xCA, 0x42, 0x90, 0xD0, 0x98, 0xD0, 0xE0, 0xF7,
|
||||||
|
- 0xDB, 0xCD, 0x16, 0xF6, 0x03, 0x73, 0xD2, 0xB8,
|
||||||
|
- 0x93, 0xB2, 0x56, 0x5A, 0x84, 0x6E, 0x00, 0x00
|
||||||
|
- }
|
||||||
|
-};
|
||||||
|
-
|
||||||
|
-/* NAND header for SPI-NAND with 2KB page + 120B/128B spare */
|
||||||
|
-static const union nand_boot_header snand_hdr_2k_128_data = {
|
||||||
|
- .data = {
|
||||||
|
- 0x42, 0x4F, 0x4F, 0x54, 0x4C, 0x4F, 0x41, 0x44,
|
||||||
|
- 0x45, 0x52, 0x21, 0x00, 0x56, 0x30, 0x30, 0x36,
|
||||||
|
- 0x4E, 0x46, 0x49, 0x49, 0x4E, 0x46, 0x4F, 0x00,
|
||||||
|
- 0x00, 0x00, 0x00, 0x08, 0x05, 0x00, 0x70, 0x00,
|
||||||
|
- 0x40, 0x00, 0x00, 0x08, 0x10, 0x00, 0x16, 0x00,
|
||||||
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
- 0x00, 0x00, 0x00, 0x00, 0x90, 0x28, 0xED, 0x13,
|
||||||
|
- 0x7F, 0x12, 0x22, 0xCD, 0x3D, 0x06, 0xF1, 0xB3,
|
||||||
|
- 0x6F, 0x2E, 0xD9, 0xA0, 0x9D, 0x7A, 0xBD, 0xD7,
|
||||||
|
- 0xB3, 0x28, 0x3C, 0x13, 0xDB, 0x4E, 0x00, 0x00
|
||||||
|
- }
|
||||||
|
-};
|
||||||
|
-
|
||||||
|
-/* NAND header for SPI-NAND with 4KB page + 256B spare */
|
||||||
|
-static const union nand_boot_header snand_hdr_4k_256_data = {
|
||||||
|
- .data = {
|
||||||
|
- 0x42, 0x4F, 0x4F, 0x54, 0x4C, 0x4F, 0x41, 0x44,
|
||||||
|
- 0x45, 0x52, 0x21, 0x00, 0x56, 0x30, 0x30, 0x36,
|
||||||
|
- 0x4E, 0x46, 0x49, 0x49, 0x4E, 0x46, 0x4F, 0x00,
|
||||||
|
- 0x00, 0x00, 0x00, 0x10, 0x05, 0x00, 0xE0, 0x00,
|
||||||
|
- 0x40, 0x00, 0x00, 0x08, 0x10, 0x00, 0x16, 0x00,
|
||||||
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
- 0x00, 0x00, 0x00, 0x00, 0x47, 0xED, 0x0E, 0xC3,
|
||||||
|
- 0x83, 0xBF, 0x41, 0xD2, 0x85, 0x21, 0x97, 0x57,
|
||||||
|
- 0xC4, 0x2E, 0x6B, 0x7A, 0x40, 0xE0, 0xCF, 0x8F,
|
||||||
|
- 0x37, 0xBD, 0x17, 0xB6, 0xC7, 0xFE, 0x00, 0x00
|
||||||
|
- }
|
||||||
|
-};
|
||||||
|
-
|
||||||
|
-/* NAND header for Parallel NAND 1Gb with 2KB page + 64B spare */
|
||||||
|
-static const union nand_boot_header nand_hdr_1gb_2k_64_data = {
|
||||||
|
- .data = {
|
||||||
|
- 0x42, 0x4F, 0x4F, 0x54, 0x4C, 0x4F, 0x41, 0x44,
|
||||||
|
- 0x45, 0x52, 0x21, 0x00, 0x56, 0x30, 0x30, 0x36,
|
||||||
|
- 0x4E, 0x46, 0x49, 0x49, 0x4E, 0x46, 0x4F, 0x00,
|
||||||
|
- 0x00, 0x00, 0x00, 0x08, 0x05, 0x00, 0x40, 0x00,
|
||||||
|
- 0x40, 0x00, 0x00, 0x04, 0x0B, 0x00, 0x11, 0x00,
|
||||||
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
- 0x00, 0x00, 0x00, 0x00, 0x12, 0x28, 0x1C, 0x12,
|
||||||
|
- 0x8F, 0xFD, 0xF8, 0x32, 0x6F, 0x6D, 0xCF, 0x6C,
|
||||||
|
- 0xDA, 0x21, 0x70, 0x8C, 0xDA, 0x0A, 0x22, 0x82,
|
||||||
|
- 0xAA, 0x59, 0xFA, 0x7C, 0x42, 0x2D, 0x00, 0x00
|
||||||
|
- }
|
||||||
|
-};
|
||||||
|
-
|
||||||
|
-/* NAND header for Parallel NAND 2Gb with 2KB page + 64B spare */
|
||||||
|
-static const union nand_boot_header nand_hdr_2gb_2k_64_data = {
|
||||||
|
- .data = {
|
||||||
|
- 0x42, 0x4F, 0x4F, 0x54, 0x4C, 0x4F, 0x41, 0x44,
|
||||||
|
- 0x45, 0x52, 0x21, 0x00, 0x56, 0x30, 0x30, 0x36,
|
||||||
|
- 0x4E, 0x46, 0x49, 0x49, 0x4E, 0x46, 0x4F, 0x00,
|
||||||
|
- 0x00, 0x00, 0x00, 0x08, 0x05, 0x00, 0x40, 0x00,
|
||||||
|
- 0x40, 0x00, 0x00, 0x08, 0x0B, 0x00, 0x11, 0x00,
|
||||||
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
- 0x00, 0x00, 0x00, 0x00, 0x20, 0x9C, 0x3D, 0x2D,
|
||||||
|
- 0x7B, 0x68, 0x63, 0x52, 0x2E, 0x04, 0x63, 0xF1,
|
||||||
|
- 0x35, 0x4E, 0x44, 0x3E, 0xF8, 0xAC, 0x9B, 0x95,
|
||||||
|
- 0xAB, 0xFE, 0xE4, 0xE1, 0xD5, 0xF9, 0x00, 0x00
|
||||||
|
- }
|
||||||
|
-};
|
||||||
|
-
|
||||||
|
-/* NAND header for Parallel NAND 4Gb with 2KB page + 64B spare */
|
||||||
|
-static const union nand_boot_header nand_hdr_4gb_2k_64_data = {
|
||||||
|
- .data = {
|
||||||
|
- 0x42, 0x4F, 0x4F, 0x54, 0x4C, 0x4F, 0x41, 0x44,
|
||||||
|
- 0x45, 0x52, 0x21, 0x00, 0x56, 0x30, 0x30, 0x36,
|
||||||
|
- 0x4E, 0x46, 0x49, 0x49, 0x4E, 0x46, 0x4F, 0x00,
|
||||||
|
- 0x00, 0x00, 0x00, 0x08, 0x05, 0x00, 0x40, 0x00,
|
||||||
|
- 0x40, 0x00, 0x00, 0x10, 0x0B, 0x00, 0x11, 0x00,
|
||||||
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
- 0x00, 0x00, 0x00, 0x00, 0xE3, 0x0F, 0x86, 0x32,
|
||||||
|
- 0x68, 0x05, 0xD9, 0xC8, 0x13, 0xDF, 0xC5, 0x0B,
|
||||||
|
- 0x35, 0x3A, 0x68, 0xA5, 0x3C, 0x0C, 0x73, 0x87,
|
||||||
|
- 0x63, 0xB0, 0xBE, 0xCC, 0x84, 0x47, 0x00, 0x00
|
||||||
|
- }
|
||||||
|
-};
|
||||||
|
-
|
||||||
|
-/* NAND header for Parallel NAND 2Gb with 2KB page + 128B spare */
|
||||||
|
-static const union nand_boot_header nand_hdr_2gb_2k_128_data = {
|
||||||
|
- .data = {
|
||||||
|
- 0x42, 0x4F, 0x4F, 0x54, 0x4C, 0x4F, 0x41, 0x44,
|
||||||
|
- 0x45, 0x52, 0x21, 0x00, 0x56, 0x30, 0x30, 0x36,
|
||||||
|
- 0x4E, 0x46, 0x49, 0x49, 0x4E, 0x46, 0x4F, 0x00,
|
||||||
|
- 0x00, 0x00, 0x00, 0x08, 0x05, 0x00, 0x70, 0x00,
|
||||||
|
- 0x40, 0x00, 0x00, 0x08, 0x0B, 0x00, 0x11, 0x00,
|
||||||
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
- 0x00, 0x00, 0x00, 0x00, 0x01, 0xA5, 0xE9, 0x5A,
|
||||||
|
- 0xDF, 0x58, 0x62, 0x41, 0xD6, 0x26, 0x77, 0xBC,
|
||||||
|
- 0x76, 0x1F, 0x27, 0x4E, 0x4F, 0x6C, 0xC3, 0xF0,
|
||||||
|
- 0x36, 0xDE, 0xD9, 0xB3, 0xFF, 0x93, 0x00, 0x00
|
||||||
|
- }
|
||||||
|
-};
|
||||||
|
-
|
||||||
|
-/* NAND header for Parallel NAND 4Gb with 2KB page + 128B spare */
|
||||||
|
-static const union nand_boot_header nand_hdr_4gb_2k_128_data = {
|
||||||
|
- .data = {
|
||||||
|
- 0x42, 0x4F, 0x4F, 0x54, 0x4C, 0x4F, 0x41, 0x44,
|
||||||
|
- 0x45, 0x52, 0x21, 0x00, 0x56, 0x30, 0x30, 0x36,
|
||||||
|
- 0x4E, 0x46, 0x49, 0x49, 0x4E, 0x46, 0x4F, 0x00,
|
||||||
|
- 0x00, 0x00, 0x00, 0x08, 0x05, 0x00, 0x70, 0x00,
|
||||||
|
- 0x40, 0x00, 0x00, 0x10, 0x0B, 0x00, 0x11, 0x00,
|
||||||
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
- 0x00, 0x00, 0x00, 0x00, 0xC2, 0x36, 0x52, 0x45,
|
||||||
|
- 0xCC, 0x35, 0xD8, 0xDB, 0xEB, 0xFD, 0xD1, 0x46,
|
||||||
|
- 0x76, 0x6B, 0x0B, 0xD5, 0x8B, 0xCC, 0x2B, 0xE2,
|
||||||
|
- 0xFE, 0x90, 0x83, 0x9E, 0xAE, 0x2D, 0x00, 0x00
|
||||||
|
- }
|
||||||
|
-};
|
||||||
|
-
|
||||||
|
-static const struct nand_header_type {
|
||||||
|
- const char *name;
|
||||||
|
- const union nand_boot_header *data;
|
||||||
|
-} nand_headers[] = {
|
||||||
|
- {
|
||||||
|
- .name = "2k+64",
|
||||||
|
- .data = &snand_hdr_2k_64_data
|
||||||
|
- }, {
|
||||||
|
- .name = "2k+120",
|
||||||
|
- .data = &snand_hdr_2k_128_data
|
||||||
|
- }, {
|
||||||
|
- .name = "2k+128",
|
||||||
|
- .data = &snand_hdr_2k_128_data
|
||||||
|
- }, {
|
||||||
|
- .name = "4k+256",
|
||||||
|
- .data = &snand_hdr_4k_256_data
|
||||||
|
- }, {
|
||||||
|
- .name = "1g:2k+64",
|
||||||
|
- .data = &nand_hdr_1gb_2k_64_data
|
||||||
|
- }, {
|
||||||
|
- .name = "2g:2k+64",
|
||||||
|
- .data = &nand_hdr_2gb_2k_64_data
|
||||||
|
- }, {
|
||||||
|
- .name = "4g:2k+64",
|
||||||
|
- .data = &nand_hdr_4gb_2k_64_data
|
||||||
|
- }, {
|
||||||
|
- .name = "2g:2k+128",
|
||||||
|
- .data = &nand_hdr_2gb_2k_128_data
|
||||||
|
- }, {
|
||||||
|
- .name = "4g:2k+128",
|
||||||
|
- .data = &nand_hdr_4gb_2k_128_data
|
||||||
|
- }
|
||||||
|
-};
|
||||||
|
+#include "mtk_nand_headers.h"
|
||||||
|
|
||||||
|
static const struct brom_img_type {
|
||||||
|
const char *name;
|
||||||
|
@@ -258,6 +49,7 @@ static char lk_name[32] = "U-Boot";
|
||||||
|
|
||||||
|
/* NAND header selected by user */
|
||||||
|
static const union nand_boot_header *hdr_nand;
|
||||||
|
+static uint32_t hdr_nand_size;
|
||||||
|
|
||||||
|
/* GFH header + 2 * 4KB pages of NAND */
|
||||||
|
static char hdr_tmp[sizeof(struct gfh_header) + 0x2000];
|
||||||
|
@@ -361,12 +153,7 @@ static int mtk_brom_parse_imagename(cons
|
||||||
|
}
|
||||||
|
|
||||||
|
/* parse nand header type */
|
||||||
|
- for (i = 0; i < ARRAY_SIZE(nand_headers); i++) {
|
||||||
|
- if (!strcmp(nand_headers[i].name, nandinfo)) {
|
||||||
|
- hdr_nand = nand_headers[i].data;
|
||||||
|
- break;
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
+ hdr_nand = mtk_nand_header_find(nandinfo);
|
||||||
|
|
||||||
|
/* parse device header offset */
|
||||||
|
if (hdr_offs && hdr_offs[0])
|
||||||
|
@@ -391,6 +178,9 @@ static int mtk_brom_parse_imagename(cons
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ if (hdr_media == BRLYT_TYPE_NAND || hdr_media == BRLYT_TYPE_SNAND)
|
||||||
|
+ hdr_nand_size = mtk_nand_header_size(hdr_nand);
|
||||||
|
+
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -420,7 +210,7 @@ static int mtk_image_vrec_header(struct
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hdr_media == BRLYT_TYPE_NAND || hdr_media == BRLYT_TYPE_SNAND)
|
||||||
|
- tparams->header_size = 2 * le16_to_cpu(hdr_nand->pagesize);
|
||||||
|
+ tparams->header_size = hdr_nand_size;
|
||||||
|
else
|
||||||
|
tparams->header_size = sizeof(struct gen_device_header);
|
||||||
|
|
||||||
|
@@ -518,16 +308,17 @@ static int mtk_image_verify_gen_header(c
|
||||||
|
|
||||||
|
static int mtk_image_verify_nand_header(const uint8_t *ptr, int print)
|
||||||
|
{
|
||||||
|
- union nand_boot_header *nh = (union nand_boot_header *)ptr;
|
||||||
|
struct brom_layout_header *bh;
|
||||||
|
+ struct nand_header_info info;
|
||||||
|
struct gfh_header *gfh;
|
||||||
|
const char *bootmedia;
|
||||||
|
+ int ret;
|
||||||
|
|
||||||
|
- if (strncmp(nh->version, NAND_BOOT_VERSION, sizeof(nh->version)) ||
|
||||||
|
- strcmp(nh->id, NAND_BOOT_ID))
|
||||||
|
- return -1;
|
||||||
|
+ ret = mtk_nand_header_info(ptr, &info);
|
||||||
|
+ if (ret < 0)
|
||||||
|
+ return ret;
|
||||||
|
|
||||||
|
- bh = (struct brom_layout_header *)(ptr + le16_to_cpu(nh->pagesize));
|
||||||
|
+ bh = (struct brom_layout_header *)(ptr + info.page_size);
|
||||||
|
|
||||||
|
if (strcmp(bh->name, BRLYT_NAME))
|
||||||
|
return -1;
|
||||||
|
@@ -538,34 +329,23 @@ static int mtk_image_verify_nand_header(
|
||||||
|
if (le32_to_cpu(bh->type) == BRLYT_TYPE_NAND)
|
||||||
|
bootmedia = "Parallel NAND";
|
||||||
|
else if (le32_to_cpu(bh->type) == BRLYT_TYPE_SNAND)
|
||||||
|
- bootmedia = "Serial NAND";
|
||||||
|
+ bootmedia = "Serial NAND (SNFI/AP)";
|
||||||
|
else
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (print) {
|
||||||
|
- printf("Boot Media: %s\n", bootmedia);
|
||||||
|
-
|
||||||
|
- if (le32_to_cpu(bh->type) == BRLYT_TYPE_NAND) {
|
||||||
|
- uint64_t capacity =
|
||||||
|
- (uint64_t)le16_to_cpu(nh->numblocks) *
|
||||||
|
- (uint64_t)le16_to_cpu(nh->pages_of_block) *
|
||||||
|
- (uint64_t)le16_to_cpu(nh->pagesize) * 8;
|
||||||
|
- printf("Capacity: %dGb\n",
|
||||||
|
- (uint32_t)(capacity >> 30));
|
||||||
|
- }
|
||||||
|
+ printf("Boot Media: %s\n", bootmedia);
|
||||||
|
|
||||||
|
- if (le16_to_cpu(nh->pagesize) >= 1024)
|
||||||
|
- printf("Page Size: %dKB\n",
|
||||||
|
- le16_to_cpu(nh->pagesize) >> 10);
|
||||||
|
+ if (info.page_size >= 1024)
|
||||||
|
+ printf("Page Size: %dKB\n", info.page_size >> 10);
|
||||||
|
else
|
||||||
|
- printf("Page Size: %dB\n",
|
||||||
|
- le16_to_cpu(nh->pagesize));
|
||||||
|
+ printf("Page Size: %dB\n", info.page_size);
|
||||||
|
|
||||||
|
- printf("Spare Size: %dB\n", le16_to_cpu(nh->oobsize));
|
||||||
|
+ printf("Spare Size: %dB\n", info.spare_size);
|
||||||
|
}
|
||||||
|
|
||||||
|
- gfh = (struct gfh_header *)(ptr + 2 * le16_to_cpu(nh->pagesize));
|
||||||
|
+ gfh = (struct gfh_header *)(ptr + info.gfh_offset);
|
||||||
|
|
||||||
|
return mtk_image_verify_gfh(gfh, GFH_FLASH_TYPE_NAND, print);
|
||||||
|
}
|
||||||
|
@@ -581,7 +361,7 @@ static int mtk_image_verify_header(unsig
|
||||||
|
|
||||||
|
img_size = image_size;
|
||||||
|
|
||||||
|
- if (!strcmp((char *)ptr, NAND_BOOT_NAME))
|
||||||
|
+ if (is_mtk_nand_header(ptr))
|
||||||
|
return mtk_image_verify_nand_header(ptr, 0);
|
||||||
|
else
|
||||||
|
return mtk_image_verify_gen_header(ptr, 0);
|
||||||
|
@@ -601,7 +381,7 @@ static void mtk_image_print_header(const
|
||||||
|
|
||||||
|
printf("Image Type: MediaTek BootROM Loadable Image\n");
|
||||||
|
|
||||||
|
- if (!strcmp((char *)ptr, NAND_BOOT_NAME))
|
||||||
|
+ if (is_mtk_nand_header(ptr))
|
||||||
|
mtk_image_verify_nand_header(ptr, 1);
|
||||||
|
else
|
||||||
|
mtk_image_verify_gen_header(ptr, 1);
|
||||||
|
@@ -732,36 +512,33 @@ static void mtk_image_set_gen_header(voi
|
||||||
|
static void mtk_image_set_nand_header(void *ptr, off_t filesize,
|
||||||
|
uint32_t loadaddr)
|
||||||
|
{
|
||||||
|
- union nand_boot_header *nh = (union nand_boot_header *)ptr;
|
||||||
|
struct brom_layout_header *brlyt;
|
||||||
|
struct gfh_header *gfh;
|
||||||
|
- uint32_t payload_pages;
|
||||||
|
- int i;
|
||||||
|
+ uint32_t payload_pages, nand_page_size;
|
||||||
|
|
||||||
|
- /* NAND device header, repeat 4 times */
|
||||||
|
- for (i = 0; i < 4; i++)
|
||||||
|
- memcpy(nh + i, hdr_nand, sizeof(union nand_boot_header));
|
||||||
|
+ /* NAND header */
|
||||||
|
+ nand_page_size = mtk_nand_header_put(hdr_nand, ptr);
|
||||||
|
|
||||||
|
- /* BRLYT header */
|
||||||
|
- payload_pages = (filesize + le16_to_cpu(hdr_nand->pagesize) - 1) /
|
||||||
|
- le16_to_cpu(hdr_nand->pagesize);
|
||||||
|
- brlyt = (struct brom_layout_header *)
|
||||||
|
- (ptr + le16_to_cpu(hdr_nand->pagesize));
|
||||||
|
- put_brom_layout_header(brlyt, hdr_media);
|
||||||
|
- brlyt->header_size = cpu_to_le32(2);
|
||||||
|
- brlyt->total_size = cpu_to_le32(payload_pages);
|
||||||
|
- brlyt->header_size_2 = brlyt->header_size;
|
||||||
|
- brlyt->total_size_2 = brlyt->total_size;
|
||||||
|
- brlyt->unused = cpu_to_le32(1);
|
||||||
|
+ if (nand_page_size) {
|
||||||
|
+ /* BRLYT header */
|
||||||
|
+ payload_pages = (filesize + nand_page_size - 1) /
|
||||||
|
+ nand_page_size;
|
||||||
|
+ brlyt = (struct brom_layout_header *)(ptr + nand_page_size);
|
||||||
|
+ put_brom_layout_header(brlyt, hdr_media);
|
||||||
|
+ brlyt->header_size = cpu_to_le32(2);
|
||||||
|
+ brlyt->total_size = cpu_to_le32(payload_pages);
|
||||||
|
+ brlyt->header_size_2 = brlyt->header_size;
|
||||||
|
+ brlyt->total_size_2 = brlyt->total_size;
|
||||||
|
+ brlyt->unused = cpu_to_le32(1);
|
||||||
|
+ }
|
||||||
|
|
||||||
|
/* GFH header */
|
||||||
|
- gfh = (struct gfh_header *)(ptr + 2 * le16_to_cpu(hdr_nand->pagesize));
|
||||||
|
- put_ghf_header(gfh, filesize, 2 * le16_to_cpu(hdr_nand->pagesize),
|
||||||
|
- loadaddr, GFH_FLASH_TYPE_NAND);
|
||||||
|
+ gfh = (struct gfh_header *)(ptr + hdr_nand_size);
|
||||||
|
+ put_ghf_header(gfh, filesize, hdr_nand_size, loadaddr,
|
||||||
|
+ GFH_FLASH_TYPE_NAND);
|
||||||
|
|
||||||
|
/* Generate SHA256 hash */
|
||||||
|
- put_hash((uint8_t *)gfh,
|
||||||
|
- filesize - 2 * le16_to_cpu(hdr_nand->pagesize) - SHA256_SUM_LEN);
|
||||||
|
+ put_hash((uint8_t *)gfh, filesize - hdr_nand_size - SHA256_SUM_LEN);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void mtk_image_set_header(void *ptr, struct stat *sbuf, int ifd,
|
||||||
|
--- a/tools/mtk_image.h
|
||||||
|
+++ b/tools/mtk_image.h
|
||||||
|
@@ -26,31 +26,6 @@ union gen_boot_header {
|
||||||
|
#define SF_BOOT_NAME "SF_BOOT"
|
||||||
|
#define SDMMC_BOOT_NAME "SDMMC_BOOT"
|
||||||
|
|
||||||
|
-/* Header for NAND */
|
||||||
|
-union nand_boot_header {
|
||||||
|
- struct {
|
||||||
|
- char name[12];
|
||||||
|
- char version[4];
|
||||||
|
- char id[8];
|
||||||
|
- uint16_t ioif;
|
||||||
|
- uint16_t pagesize;
|
||||||
|
- uint16_t addrcycles;
|
||||||
|
- uint16_t oobsize;
|
||||||
|
- uint16_t pages_of_block;
|
||||||
|
- uint16_t numblocks;
|
||||||
|
- uint16_t writesize_shift;
|
||||||
|
- uint16_t erasesize_shift;
|
||||||
|
- uint8_t dummy[60];
|
||||||
|
- uint8_t ecc_parity[28];
|
||||||
|
- };
|
||||||
|
-
|
||||||
|
- uint8_t data[0x80];
|
||||||
|
-};
|
||||||
|
-
|
||||||
|
-#define NAND_BOOT_NAME "BOOTLOADER!"
|
||||||
|
-#define NAND_BOOT_VERSION "V006"
|
||||||
|
-#define NAND_BOOT_ID "NFIINFO"
|
||||||
|
-
|
||||||
|
/* BootROM layout header */
|
||||||
|
struct brom_layout_header {
|
||||||
|
char name[8];
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/tools/mtk_nand_headers.c
|
||||||
|
@@ -0,0 +1,286 @@
|
||||||
|
+// SPDX-License-Identifier: GPL-2.0+
|
||||||
|
+/*
|
||||||
|
+ * MediaTek BootROM NAND header definitions
|
||||||
|
+ *
|
||||||
|
+ * Copyright (C) 2022 MediaTek Inc.
|
||||||
|
+ * Author: Weijie Gao <weijie.gao@mediatek.com>
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+#include <stdint.h>
|
||||||
|
+#include <string.h>
|
||||||
|
+#include "imagetool.h"
|
||||||
|
+#include "mtk_image.h"
|
||||||
|
+#include "mtk_nand_headers.h"
|
||||||
|
+
|
||||||
|
+/* NAND header for SPI-NAND with 2KB page + 64B spare */
|
||||||
|
+static const union nand_boot_header snand_hdr_2k_64_data = {
|
||||||
|
+ .data = {
|
||||||
|
+ 0x42, 0x4F, 0x4F, 0x54, 0x4C, 0x4F, 0x41, 0x44,
|
||||||
|
+ 0x45, 0x52, 0x21, 0x00, 0x56, 0x30, 0x30, 0x36,
|
||||||
|
+ 0x4E, 0x46, 0x49, 0x49, 0x4E, 0x46, 0x4F, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x08, 0x03, 0x00, 0x40, 0x00,
|
||||||
|
+ 0x40, 0x00, 0x00, 0x08, 0x10, 0x00, 0x16, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x7B, 0xC4, 0x17, 0x9D,
|
||||||
|
+ 0xCA, 0x42, 0x90, 0xD0, 0x98, 0xD0, 0xE0, 0xF7,
|
||||||
|
+ 0xDB, 0xCD, 0x16, 0xF6, 0x03, 0x73, 0xD2, 0xB8,
|
||||||
|
+ 0x93, 0xB2, 0x56, 0x5A, 0x84, 0x6E, 0x00, 0x00
|
||||||
|
+ }
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+/* NAND header for SPI-NAND with 2KB page + 120B/128B spare */
|
||||||
|
+static const union nand_boot_header snand_hdr_2k_128_data = {
|
||||||
|
+ .data = {
|
||||||
|
+ 0x42, 0x4F, 0x4F, 0x54, 0x4C, 0x4F, 0x41, 0x44,
|
||||||
|
+ 0x45, 0x52, 0x21, 0x00, 0x56, 0x30, 0x30, 0x36,
|
||||||
|
+ 0x4E, 0x46, 0x49, 0x49, 0x4E, 0x46, 0x4F, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x08, 0x05, 0x00, 0x70, 0x00,
|
||||||
|
+ 0x40, 0x00, 0x00, 0x08, 0x10, 0x00, 0x16, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x90, 0x28, 0xED, 0x13,
|
||||||
|
+ 0x7F, 0x12, 0x22, 0xCD, 0x3D, 0x06, 0xF1, 0xB3,
|
||||||
|
+ 0x6F, 0x2E, 0xD9, 0xA0, 0x9D, 0x7A, 0xBD, 0xD7,
|
||||||
|
+ 0xB3, 0x28, 0x3C, 0x13, 0xDB, 0x4E, 0x00, 0x00
|
||||||
|
+ }
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+/* NAND header for SPI-NAND with 4KB page + 256B spare */
|
||||||
|
+static const union nand_boot_header snand_hdr_4k_256_data = {
|
||||||
|
+ .data = {
|
||||||
|
+ 0x42, 0x4F, 0x4F, 0x54, 0x4C, 0x4F, 0x41, 0x44,
|
||||||
|
+ 0x45, 0x52, 0x21, 0x00, 0x56, 0x30, 0x30, 0x36,
|
||||||
|
+ 0x4E, 0x46, 0x49, 0x49, 0x4E, 0x46, 0x4F, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x10, 0x05, 0x00, 0xE0, 0x00,
|
||||||
|
+ 0x40, 0x00, 0x00, 0x08, 0x10, 0x00, 0x16, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x47, 0xED, 0x0E, 0xC3,
|
||||||
|
+ 0x83, 0xBF, 0x41, 0xD2, 0x85, 0x21, 0x97, 0x57,
|
||||||
|
+ 0xC4, 0x2E, 0x6B, 0x7A, 0x40, 0xE0, 0xCF, 0x8F,
|
||||||
|
+ 0x37, 0xBD, 0x17, 0xB6, 0xC7, 0xFE, 0x00, 0x00
|
||||||
|
+ }
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+/* NAND header for Parallel NAND 1Gb with 2KB page + 64B spare */
|
||||||
|
+static const union nand_boot_header nand_hdr_1gb_2k_64_data = {
|
||||||
|
+ .data = {
|
||||||
|
+ 0x42, 0x4F, 0x4F, 0x54, 0x4C, 0x4F, 0x41, 0x44,
|
||||||
|
+ 0x45, 0x52, 0x21, 0x00, 0x56, 0x30, 0x30, 0x36,
|
||||||
|
+ 0x4E, 0x46, 0x49, 0x49, 0x4E, 0x46, 0x4F, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x08, 0x05, 0x00, 0x40, 0x00,
|
||||||
|
+ 0x40, 0x00, 0x00, 0x04, 0x0B, 0x00, 0x11, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x12, 0x28, 0x1C, 0x12,
|
||||||
|
+ 0x8F, 0xFD, 0xF8, 0x32, 0x6F, 0x6D, 0xCF, 0x6C,
|
||||||
|
+ 0xDA, 0x21, 0x70, 0x8C, 0xDA, 0x0A, 0x22, 0x82,
|
||||||
|
+ 0xAA, 0x59, 0xFA, 0x7C, 0x42, 0x2D, 0x00, 0x00
|
||||||
|
+ }
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+/* NAND header for Parallel NAND 2Gb with 2KB page + 64B spare */
|
||||||
|
+static const union nand_boot_header nand_hdr_2gb_2k_64_data = {
|
||||||
|
+ .data = {
|
||||||
|
+ 0x42, 0x4F, 0x4F, 0x54, 0x4C, 0x4F, 0x41, 0x44,
|
||||||
|
+ 0x45, 0x52, 0x21, 0x00, 0x56, 0x30, 0x30, 0x36,
|
||||||
|
+ 0x4E, 0x46, 0x49, 0x49, 0x4E, 0x46, 0x4F, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x08, 0x05, 0x00, 0x40, 0x00,
|
||||||
|
+ 0x40, 0x00, 0x00, 0x08, 0x0B, 0x00, 0x11, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x20, 0x9C, 0x3D, 0x2D,
|
||||||
|
+ 0x7B, 0x68, 0x63, 0x52, 0x2E, 0x04, 0x63, 0xF1,
|
||||||
|
+ 0x35, 0x4E, 0x44, 0x3E, 0xF8, 0xAC, 0x9B, 0x95,
|
||||||
|
+ 0xAB, 0xFE, 0xE4, 0xE1, 0xD5, 0xF9, 0x00, 0x00
|
||||||
|
+ }
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+/* NAND header for Parallel NAND 4Gb with 2KB page + 64B spare */
|
||||||
|
+static const union nand_boot_header nand_hdr_4gb_2k_64_data = {
|
||||||
|
+ .data = {
|
||||||
|
+ 0x42, 0x4F, 0x4F, 0x54, 0x4C, 0x4F, 0x41, 0x44,
|
||||||
|
+ 0x45, 0x52, 0x21, 0x00, 0x56, 0x30, 0x30, 0x36,
|
||||||
|
+ 0x4E, 0x46, 0x49, 0x49, 0x4E, 0x46, 0x4F, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x08, 0x05, 0x00, 0x40, 0x00,
|
||||||
|
+ 0x40, 0x00, 0x00, 0x10, 0x0B, 0x00, 0x11, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0xE3, 0x0F, 0x86, 0x32,
|
||||||
|
+ 0x68, 0x05, 0xD9, 0xC8, 0x13, 0xDF, 0xC5, 0x0B,
|
||||||
|
+ 0x35, 0x3A, 0x68, 0xA5, 0x3C, 0x0C, 0x73, 0x87,
|
||||||
|
+ 0x63, 0xB0, 0xBE, 0xCC, 0x84, 0x47, 0x00, 0x00
|
||||||
|
+ }
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+/* NAND header for Parallel NAND 2Gb with 2KB page + 128B spare */
|
||||||
|
+static const union nand_boot_header nand_hdr_2gb_2k_128_data = {
|
||||||
|
+ .data = {
|
||||||
|
+ 0x42, 0x4F, 0x4F, 0x54, 0x4C, 0x4F, 0x41, 0x44,
|
||||||
|
+ 0x45, 0x52, 0x21, 0x00, 0x56, 0x30, 0x30, 0x36,
|
||||||
|
+ 0x4E, 0x46, 0x49, 0x49, 0x4E, 0x46, 0x4F, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x08, 0x05, 0x00, 0x70, 0x00,
|
||||||
|
+ 0x40, 0x00, 0x00, 0x08, 0x0B, 0x00, 0x11, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x01, 0xA5, 0xE9, 0x5A,
|
||||||
|
+ 0xDF, 0x58, 0x62, 0x41, 0xD6, 0x26, 0x77, 0xBC,
|
||||||
|
+ 0x76, 0x1F, 0x27, 0x4E, 0x4F, 0x6C, 0xC3, 0xF0,
|
||||||
|
+ 0x36, 0xDE, 0xD9, 0xB3, 0xFF, 0x93, 0x00, 0x00
|
||||||
|
+ }
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+/* NAND header for Parallel NAND 4Gb with 2KB page + 128B spare */
|
||||||
|
+static const union nand_boot_header nand_hdr_4gb_2k_128_data = {
|
||||||
|
+ .data = {
|
||||||
|
+ 0x42, 0x4F, 0x4F, 0x54, 0x4C, 0x4F, 0x41, 0x44,
|
||||||
|
+ 0x45, 0x52, 0x21, 0x00, 0x56, 0x30, 0x30, 0x36,
|
||||||
|
+ 0x4E, 0x46, 0x49, 0x49, 0x4E, 0x46, 0x4F, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x08, 0x05, 0x00, 0x70, 0x00,
|
||||||
|
+ 0x40, 0x00, 0x00, 0x10, 0x0B, 0x00, 0x11, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0xC2, 0x36, 0x52, 0x45,
|
||||||
|
+ 0xCC, 0x35, 0xD8, 0xDB, 0xEB, 0xFD, 0xD1, 0x46,
|
||||||
|
+ 0x76, 0x6B, 0x0B, 0xD5, 0x8B, 0xCC, 0x2B, 0xE2,
|
||||||
|
+ 0xFE, 0x90, 0x83, 0x9E, 0xAE, 0x2D, 0x00, 0x00
|
||||||
|
+ }
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static const struct nand_header_type {
|
||||||
|
+ const char *name;
|
||||||
|
+ const union nand_boot_header *data;
|
||||||
|
+} nand_headers[] = {
|
||||||
|
+ {
|
||||||
|
+ .name = "2k+64",
|
||||||
|
+ .data = &snand_hdr_2k_64_data
|
||||||
|
+ }, {
|
||||||
|
+ .name = "2k+120",
|
||||||
|
+ .data = &snand_hdr_2k_128_data
|
||||||
|
+ }, {
|
||||||
|
+ .name = "2k+128",
|
||||||
|
+ .data = &snand_hdr_2k_128_data
|
||||||
|
+ }, {
|
||||||
|
+ .name = "4k+256",
|
||||||
|
+ .data = &snand_hdr_4k_256_data
|
||||||
|
+ }, {
|
||||||
|
+ .name = "1g:2k+64",
|
||||||
|
+ .data = &nand_hdr_1gb_2k_64_data
|
||||||
|
+ }, {
|
||||||
|
+ .name = "2g:2k+64",
|
||||||
|
+ .data = &nand_hdr_2gb_2k_64_data
|
||||||
|
+ }, {
|
||||||
|
+ .name = "4g:2k+64",
|
||||||
|
+ .data = &nand_hdr_4gb_2k_64_data
|
||||||
|
+ }, {
|
||||||
|
+ .name = "2g:2k+128",
|
||||||
|
+ .data = &nand_hdr_2gb_2k_128_data
|
||||||
|
+ }, {
|
||||||
|
+ .name = "4g:2k+128",
|
||||||
|
+ .data = &nand_hdr_4gb_2k_128_data
|
||||||
|
+ }
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+const union nand_boot_header *mtk_nand_header_find(const char *name)
|
||||||
|
+{
|
||||||
|
+ uint32_t i;
|
||||||
|
+
|
||||||
|
+ for (i = 0; i < ARRAY_SIZE(nand_headers); i++) {
|
||||||
|
+ if (!strcmp(nand_headers[i].name, name))
|
||||||
|
+ return nand_headers[i].data;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return NULL;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+uint32_t mtk_nand_header_size(const union nand_boot_header *hdr_nand)
|
||||||
|
+{
|
||||||
|
+ return 2 * le16_to_cpu(hdr_nand->pagesize);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int mtk_nand_header_ap_info(const void *ptr,
|
||||||
|
+ struct nand_header_info *info)
|
||||||
|
+{
|
||||||
|
+ union nand_boot_header *nh = (union nand_boot_header *)ptr;
|
||||||
|
+
|
||||||
|
+ if (strncmp(nh->version, NAND_BOOT_VERSION, sizeof(nh->version)) ||
|
||||||
|
+ strcmp(nh->id, NAND_BOOT_ID))
|
||||||
|
+ return -1;
|
||||||
|
+
|
||||||
|
+ info->page_size = le16_to_cpu(nh->pagesize);
|
||||||
|
+ info->spare_size = le16_to_cpu(nh->oobsize);
|
||||||
|
+ info->gfh_offset = 2 * info->page_size;
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+int mtk_nand_header_info(const void *ptr, struct nand_header_info *info)
|
||||||
|
+{
|
||||||
|
+ if (!strcmp((char *)ptr, NAND_BOOT_NAME))
|
||||||
|
+ return mtk_nand_header_ap_info(ptr, info);
|
||||||
|
+
|
||||||
|
+ return -1;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+bool is_mtk_nand_header(const void *ptr)
|
||||||
|
+{
|
||||||
|
+ struct nand_header_info info;
|
||||||
|
+
|
||||||
|
+ if (mtk_nand_header_info(ptr, &info) >= 0)
|
||||||
|
+ return true;
|
||||||
|
+
|
||||||
|
+ return false;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+uint32_t mtk_nand_header_put(const union nand_boot_header *hdr_nand, void *ptr)
|
||||||
|
+{
|
||||||
|
+ union nand_boot_header *nh = (union nand_boot_header *)ptr;
|
||||||
|
+ int i;
|
||||||
|
+
|
||||||
|
+ /* NAND device header, repeat 4 times */
|
||||||
|
+ for (i = 0; i < 4; i++)
|
||||||
|
+ memcpy(nh + i, hdr_nand, sizeof(union nand_boot_header));
|
||||||
|
+
|
||||||
|
+ return le16_to_cpu(hdr_nand->pagesize);
|
||||||
|
+}
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/tools/mtk_nand_headers.h
|
||||||
|
@@ -0,0 +1,61 @@
|
||||||
|
+/* SPDX-License-Identifier: GPL-2.0+ */
|
||||||
|
+/*
|
||||||
|
+ * MediaTek BootROM NAND header definitions
|
||||||
|
+ *
|
||||||
|
+ * Copyright (C) 2022 MediaTek Inc.
|
||||||
|
+ * Author: Weijie Gao <weijie.gao@mediatek.com>
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+#ifndef _MTK_NAND_HEADERS_H
|
||||||
|
+#define _MTK_NAND_HEADERS_H
|
||||||
|
+
|
||||||
|
+#include <stdint.h>
|
||||||
|
+#include <stdbool.h>
|
||||||
|
+
|
||||||
|
+struct nand_header_info {
|
||||||
|
+ uint32_t page_size;
|
||||||
|
+ uint32_t spare_size;
|
||||||
|
+ uint32_t gfh_offset;
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+/* AP BROM Header for NAND */
|
||||||
|
+union nand_boot_header {
|
||||||
|
+ struct {
|
||||||
|
+ char name[12];
|
||||||
|
+ char version[4];
|
||||||
|
+ char id[8];
|
||||||
|
+ uint16_t ioif; /* I/O interface */
|
||||||
|
+ uint16_t pagesize; /* NAND page size */
|
||||||
|
+ uint16_t addrcycles; /* Address cycles */
|
||||||
|
+ uint16_t oobsize; /* NAND page spare size */
|
||||||
|
+ uint16_t pages_of_block; /* Pages of one block */
|
||||||
|
+ uint16_t numblocks; /* Total blocks of NAND chip */
|
||||||
|
+ uint16_t writesize_shift;
|
||||||
|
+ uint16_t erasesize_shift;
|
||||||
|
+ uint8_t dummy[60];
|
||||||
|
+ uint8_t ecc_parity[28]; /* ECC parity of this header */
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ uint8_t data[0x80];
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+#define NAND_BOOT_NAME "BOOTLOADER!"
|
||||||
|
+#define NAND_BOOT_VERSION "V006"
|
||||||
|
+#define NAND_BOOT_ID "NFIINFO"
|
||||||
|
+
|
||||||
|
+/* Find nand header data by name */
|
||||||
|
+const union nand_boot_header *mtk_nand_header_find(const char *name);
|
||||||
|
+
|
||||||
|
+/* Device header size using this nand header */
|
||||||
|
+uint32_t mtk_nand_header_size(const union nand_boot_header *hdr_nand);
|
||||||
|
+
|
||||||
|
+/* Get nand info from nand header (page size, spare size, ...) */
|
||||||
|
+int mtk_nand_header_info(const void *ptr, struct nand_header_info *info);
|
||||||
|
+
|
||||||
|
+/* Whether given header data is valid */
|
||||||
|
+bool is_mtk_nand_header(const void *ptr);
|
||||||
|
+
|
||||||
|
+/* Generate Device header using give nand header */
|
||||||
|
+uint32_t mtk_nand_header_put(const union nand_boot_header *hdr_nand, void *ptr);
|
||||||
|
+
|
||||||
|
+#endif /* _MTK_NAND_HEADERS_H */
|
@ -0,0 +1,702 @@
|
|||||||
|
From fbf296f9ed5daab70020686e9ba072efe663bbab Mon Sep 17 00:00:00 2001
|
||||||
|
From: Weijie Gao <weijie.gao@mediatek.com>
|
||||||
|
Date: Wed, 3 Aug 2022 11:14:36 +0800
|
||||||
|
Subject: [PATCH 30/31] tools: mtk_image: add support for nand headers used by
|
||||||
|
newer chips
|
||||||
|
|
||||||
|
This patch adds more nand headers in two new types:
|
||||||
|
1. HSM header, used for spi-nand thru SNFI interface
|
||||||
|
2. SPIM header, used for spi-nand thru spi-mem interface
|
||||||
|
|
||||||
|
The original nand header is renamed to AP header.
|
||||||
|
|
||||||
|
Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
|
||||||
|
---
|
||||||
|
tools/mtk_image.c | 23 ++-
|
||||||
|
tools/mtk_nand_headers.c | 422 +++++++++++++++++++++++++++++++++++++--
|
||||||
|
tools/mtk_nand_headers.h | 110 +++++++++-
|
||||||
|
3 files changed, 525 insertions(+), 30 deletions(-)
|
||||||
|
|
||||||
|
--- a/tools/mtk_image.c
|
||||||
|
+++ b/tools/mtk_image.c
|
||||||
|
@@ -31,6 +31,9 @@ static const struct brom_img_type {
|
||||||
|
}, {
|
||||||
|
.name = "snand",
|
||||||
|
.type = BRLYT_TYPE_SNAND
|
||||||
|
+ }, {
|
||||||
|
+ .name = "spim-nand",
|
||||||
|
+ .type = BRLYT_TYPE_SNAND
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
@@ -48,7 +51,7 @@ static bool is_arm64_image;
|
||||||
|
static char lk_name[32] = "U-Boot";
|
||||||
|
|
||||||
|
/* NAND header selected by user */
|
||||||
|
-static const union nand_boot_header *hdr_nand;
|
||||||
|
+static const struct nand_header_type *hdr_nand;
|
||||||
|
static uint32_t hdr_nand_size;
|
||||||
|
|
||||||
|
/* GFH header + 2 * 4KB pages of NAND */
|
||||||
|
@@ -318,20 +321,26 @@ static int mtk_image_verify_nand_header(
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
- bh = (struct brom_layout_header *)(ptr + info.page_size);
|
||||||
|
+ if (!ret) {
|
||||||
|
+ bh = (struct brom_layout_header *)(ptr + info.page_size);
|
||||||
|
|
||||||
|
- if (strcmp(bh->name, BRLYT_NAME))
|
||||||
|
- return -1;
|
||||||
|
+ if (strcmp(bh->name, BRLYT_NAME))
|
||||||
|
+ return -1;
|
||||||
|
+
|
||||||
|
+ if (le32_to_cpu(bh->magic) != BRLYT_MAGIC)
|
||||||
|
+ return -1;
|
||||||
|
|
||||||
|
- if (le32_to_cpu(bh->magic) != BRLYT_MAGIC) {
|
||||||
|
- return -1;
|
||||||
|
- } else {
|
||||||
|
if (le32_to_cpu(bh->type) == BRLYT_TYPE_NAND)
|
||||||
|
bootmedia = "Parallel NAND";
|
||||||
|
else if (le32_to_cpu(bh->type) == BRLYT_TYPE_SNAND)
|
||||||
|
bootmedia = "Serial NAND (SNFI/AP)";
|
||||||
|
else
|
||||||
|
return -1;
|
||||||
|
+ } else {
|
||||||
|
+ if (info.snfi)
|
||||||
|
+ bootmedia = "Serial NAND (SNFI/HSM)";
|
||||||
|
+ else
|
||||||
|
+ bootmedia = "Serial NAND (SPIM)";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (print) {
|
||||||
|
--- a/tools/mtk_nand_headers.c
|
||||||
|
+++ b/tools/mtk_nand_headers.c
|
||||||
|
@@ -188,55 +188,346 @@ static const union nand_boot_header nand
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
-static const struct nand_header_type {
|
||||||
|
+/* HSM BROM NAND header for SPI NAND with 2KB page + 64B spare */
|
||||||
|
+static const union hsm_nand_boot_header hsm_nand_hdr_2k_64_data = {
|
||||||
|
+ .data = {
|
||||||
|
+ 0x4E, 0x41, 0x4E, 0x44, 0x43, 0x46, 0x47, 0x21,
|
||||||
|
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x08, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x40, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00,
|
||||||
|
+ 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
|
||||||
|
+ 0xFF, 0x00, 0x00, 0x00, 0x21, 0xD2, 0xEE, 0xF6,
|
||||||
|
+ 0xAE, 0xDD, 0x5E, 0xC2, 0x82, 0x8E, 0x9A, 0x62,
|
||||||
|
+ 0x09, 0x8E, 0x80, 0xE2, 0x37, 0x0D, 0xC9, 0xFA,
|
||||||
|
+ 0xA9, 0xDD, 0xFC, 0x92, 0x34, 0x2A, 0xED, 0x51,
|
||||||
|
+ 0xA4, 0x1B, 0xF7, 0x63, 0xCC, 0x5A, 0xC7, 0xFB,
|
||||||
|
+ 0xED, 0x21, 0x02, 0x23, 0x51, 0x31
|
||||||
|
+ }
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+/* HSM BROM NAND header for SPI NAND with 2KB page + 128B spare */
|
||||||
|
+static const union hsm_nand_boot_header hsm_nand_hdr_2k_128_data = {
|
||||||
|
+ .data = {
|
||||||
|
+ 0x4E, 0x41, 0x4E, 0x44, 0x43, 0x46, 0x47, 0x21,
|
||||||
|
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x08, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x40, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00,
|
||||||
|
+ 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
|
||||||
|
+ 0xFF, 0x00, 0x00, 0x00, 0x71, 0x7f, 0x71, 0xAC,
|
||||||
|
+ 0x42, 0xD0, 0x5B, 0xD2, 0x12, 0x81, 0x15, 0x0A,
|
||||||
|
+ 0x0C, 0xD4, 0xF6, 0x32, 0x1E, 0x63, 0xE7, 0x81,
|
||||||
|
+ 0x8A, 0x7F, 0xDE, 0xF9, 0x4B, 0x91, 0xEC, 0xC2,
|
||||||
|
+ 0x70, 0x00, 0x7F, 0x57, 0xAF, 0xDC, 0xE4, 0x24,
|
||||||
|
+ 0x57, 0x09, 0xBC, 0xC5, 0x35, 0xDC
|
||||||
|
+ }
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+/* HSM BROM NAND header for SPI NAND with 4KB page + 256B spare */
|
||||||
|
+static const union hsm_nand_boot_header hsm_nand_hdr_4k_256_data = {
|
||||||
|
+ .data = {
|
||||||
|
+ 0x4E, 0x41, 0x4E, 0x44, 0x43, 0x46, 0x47, 0x21,
|
||||||
|
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
|
||||||
|
+ 0x40, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00,
|
||||||
|
+ 0x0C, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
|
||||||
|
+ 0xFF, 0x00, 0x00, 0x00, 0x62, 0x04, 0xD6, 0x1F,
|
||||||
|
+ 0x2B, 0x57, 0x7A, 0x2D, 0xFE, 0xBB, 0x4A, 0x50,
|
||||||
|
+ 0xEC, 0xF8, 0x70, 0x1A, 0x44, 0x15, 0xF6, 0xA2,
|
||||||
|
+ 0x8E, 0xB0, 0xFD, 0xFA, 0xDC, 0xAA, 0x5A, 0x4E,
|
||||||
|
+ 0xCB, 0x8E, 0xC9, 0x72, 0x08, 0xDC, 0x20, 0xB9,
|
||||||
|
+ 0x98, 0xC8, 0x82, 0xD8, 0xBE, 0x44
|
||||||
|
+ }
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+/* HSM2.0 BROM NAND header for SPI NAND with 2KB page + 64B spare */
|
||||||
|
+static const union hsm20_nand_boot_header hsm20_nand_hdr_2k_64_data = {
|
||||||
|
+ .data = {
|
||||||
|
+ 0x4E, 0x41, 0x4E, 0x44, 0x43, 0x46, 0x47, 0x21,
|
||||||
|
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00,
|
||||||
|
+ 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x08, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x40, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00,
|
||||||
|
+ 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
+ 0x01, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x5F, 0x4B, 0xB2, 0x5B, 0x8B, 0x1C, 0x35, 0xDA,
|
||||||
|
+ 0x83, 0xE6, 0x6C, 0xC3, 0xFB, 0x8C, 0x78, 0x23,
|
||||||
|
+ 0xD0, 0x89, 0x24, 0xD9, 0x6C, 0x35, 0x2C, 0x5D,
|
||||||
|
+ 0x8F, 0xBB, 0xFC, 0x10, 0xD0, 0xE2, 0x22, 0x7D,
|
||||||
|
+ 0xC8, 0x97, 0x9A, 0xEF, 0xC6, 0xB5, 0xA7, 0x4E,
|
||||||
|
+ 0x4E, 0x0E
|
||||||
|
+ }
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+/* HSM2.0 BROM NAND header for SPI NAND with 2KB page + 128B spare */
|
||||||
|
+static const union hsm20_nand_boot_header hsm20_nand_hdr_2k_128_data = {
|
||||||
|
+ .data = {
|
||||||
|
+ 0x4E, 0x41, 0x4E, 0x44, 0x43, 0x46, 0x47, 0x21,
|
||||||
|
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00,
|
||||||
|
+ 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x08, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x40, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00,
|
||||||
|
+ 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
+ 0x01, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0xF8, 0x7E, 0xC1, 0x5D, 0x61, 0x54, 0xEA, 0x9F,
|
||||||
|
+ 0x5E, 0x66, 0x39, 0x66, 0x21, 0xFF, 0x8C, 0x3B,
|
||||||
|
+ 0xBE, 0xA7, 0x5A, 0x9E, 0xD7, 0xBD, 0x9E, 0x89,
|
||||||
|
+ 0xEE, 0x7E, 0x10, 0x31, 0x9A, 0x1D, 0x82, 0x49,
|
||||||
|
+ 0xA3, 0x4E, 0xD8, 0x47, 0xD7, 0x19, 0xF4, 0x2D,
|
||||||
|
+ 0x8E, 0x53
|
||||||
|
+ }
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+/* HSM2.0 BROM NAND header for SPI NAND with 4KB page + 256B spare */
|
||||||
|
+static const union hsm20_nand_boot_header hsm20_nand_hdr_4k_256_data = {
|
||||||
|
+ .data = {
|
||||||
|
+ 0x4E, 0x41, 0x4E, 0x44, 0x43, 0x46, 0x47, 0x21,
|
||||||
|
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00,
|
||||||
|
+ 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
|
||||||
|
+ 0x40, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00,
|
||||||
|
+ 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
+ 0x01, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x79, 0x01, 0x1F, 0x86, 0x62, 0x6A, 0x43, 0xAE,
|
||||||
|
+ 0xE6, 0xF8, 0xDD, 0x5B, 0x29, 0xB7, 0xA2, 0x7F,
|
||||||
|
+ 0x29, 0x72, 0x54, 0x37, 0xBE, 0x50, 0xD4, 0x24,
|
||||||
|
+ 0xAB, 0x60, 0xF4, 0x44, 0x97, 0x3B, 0x65, 0x21,
|
||||||
|
+ 0x73, 0x24, 0x1F, 0x93, 0x0E, 0x9E, 0x96, 0x88,
|
||||||
|
+ 0x78, 0x6C
|
||||||
|
+ }
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+/* SPIM-NAND header for SPI NAND with 2KB page + 64B spare */
|
||||||
|
+static const union spim_nand_boot_header spim_nand_hdr_2k_64_data = {
|
||||||
|
+ .data = {
|
||||||
|
+ 0x53, 0x50, 0x49, 0x4e, 0x41, 0x4e, 0x44, 0x21,
|
||||||
|
+ 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x08, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x40, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x20, 0x30,
|
||||||
|
+ 0x01, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
||||||
|
+ }
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+/* SPIM-NAND header for SPI NAND with 2KB page + 128B spare */
|
||||||
|
+static const union spim_nand_boot_header spim_nand_hdr_2k_128_data = {
|
||||||
|
+ .data = {
|
||||||
|
+ 0x53, 0x50, 0x49, 0x4e, 0x41, 0x4e, 0x44, 0x21,
|
||||||
|
+ 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x08, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x40, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x20, 0x30,
|
||||||
|
+ 0x01, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
||||||
|
+ }
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+/* SPIM-NAND header for SPI NAND with 4KB page + 256B spare */
|
||||||
|
+static const union spim_nand_boot_header spim_nand_hdr_4k_256_data = {
|
||||||
|
+ .data = {
|
||||||
|
+ 0x53, 0x50, 0x49, 0x4e, 0x41, 0x4e, 0x44, 0x21,
|
||||||
|
+ 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
|
||||||
|
+ 0x40, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x20, 0x30,
|
||||||
|
+ 0x01, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
||||||
|
+ }
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+struct nand_header_type {
|
||||||
|
const char *name;
|
||||||
|
- const union nand_boot_header *data;
|
||||||
|
+ enum nand_boot_header_type type;
|
||||||
|
+ union {
|
||||||
|
+ const union nand_boot_header *ap;
|
||||||
|
+ const union hsm_nand_boot_header *hsm;
|
||||||
|
+ const union hsm20_nand_boot_header *hsm20;
|
||||||
|
+ const union spim_nand_boot_header *spim;
|
||||||
|
+ };
|
||||||
|
} nand_headers[] = {
|
||||||
|
{
|
||||||
|
.name = "2k+64",
|
||||||
|
- .data = &snand_hdr_2k_64_data
|
||||||
|
+ .type = NAND_BOOT_AP_HEADER,
|
||||||
|
+ .ap = &snand_hdr_2k_64_data,
|
||||||
|
}, {
|
||||||
|
.name = "2k+120",
|
||||||
|
- .data = &snand_hdr_2k_128_data
|
||||||
|
+ .type = NAND_BOOT_AP_HEADER,
|
||||||
|
+ .ap = &snand_hdr_2k_128_data,
|
||||||
|
}, {
|
||||||
|
.name = "2k+128",
|
||||||
|
- .data = &snand_hdr_2k_128_data
|
||||||
|
+ .type = NAND_BOOT_AP_HEADER,
|
||||||
|
+ .ap = &snand_hdr_2k_128_data,
|
||||||
|
}, {
|
||||||
|
.name = "4k+256",
|
||||||
|
- .data = &snand_hdr_4k_256_data
|
||||||
|
+ .type = NAND_BOOT_AP_HEADER,
|
||||||
|
+ .ap = &snand_hdr_4k_256_data,
|
||||||
|
}, {
|
||||||
|
.name = "1g:2k+64",
|
||||||
|
- .data = &nand_hdr_1gb_2k_64_data
|
||||||
|
+ .type = NAND_BOOT_AP_HEADER,
|
||||||
|
+ .ap = &nand_hdr_1gb_2k_64_data,
|
||||||
|
}, {
|
||||||
|
.name = "2g:2k+64",
|
||||||
|
- .data = &nand_hdr_2gb_2k_64_data
|
||||||
|
+ .type = NAND_BOOT_AP_HEADER,
|
||||||
|
+ .ap = &nand_hdr_2gb_2k_64_data,
|
||||||
|
}, {
|
||||||
|
.name = "4g:2k+64",
|
||||||
|
- .data = &nand_hdr_4gb_2k_64_data
|
||||||
|
+ .type = NAND_BOOT_AP_HEADER,
|
||||||
|
+ .ap = &nand_hdr_4gb_2k_64_data,
|
||||||
|
}, {
|
||||||
|
.name = "2g:2k+128",
|
||||||
|
- .data = &nand_hdr_2gb_2k_128_data
|
||||||
|
+ .type = NAND_BOOT_AP_HEADER,
|
||||||
|
+ .ap = &nand_hdr_2gb_2k_128_data,
|
||||||
|
}, {
|
||||||
|
.name = "4g:2k+128",
|
||||||
|
- .data = &nand_hdr_4gb_2k_128_data
|
||||||
|
+ .type = NAND_BOOT_AP_HEADER,
|
||||||
|
+ .ap = &nand_hdr_4gb_2k_128_data,
|
||||||
|
+ }, {
|
||||||
|
+ .name = "hsm:2k+64",
|
||||||
|
+ .type = NAND_BOOT_HSM_HEADER,
|
||||||
|
+ .hsm = &hsm_nand_hdr_2k_64_data,
|
||||||
|
+ }, {
|
||||||
|
+ .name = "hsm:2k+128",
|
||||||
|
+ .type = NAND_BOOT_HSM_HEADER,
|
||||||
|
+ .hsm = &hsm_nand_hdr_2k_128_data,
|
||||||
|
+ }, {
|
||||||
|
+ .name = "hsm:4k+256",
|
||||||
|
+ .type = NAND_BOOT_HSM_HEADER,
|
||||||
|
+ .hsm = &hsm_nand_hdr_4k_256_data,
|
||||||
|
+ }, {
|
||||||
|
+ .name = "hsm20:2k+64",
|
||||||
|
+ .type = NAND_BOOT_HSM20_HEADER,
|
||||||
|
+ .hsm20 = &hsm20_nand_hdr_2k_64_data,
|
||||||
|
+ }, {
|
||||||
|
+ .name = "hsm20:2k+128",
|
||||||
|
+ .type = NAND_BOOT_HSM20_HEADER,
|
||||||
|
+ .hsm20 = &hsm20_nand_hdr_2k_128_data,
|
||||||
|
+ }, {
|
||||||
|
+ .name = "hsm20:4k+256",
|
||||||
|
+ .type = NAND_BOOT_HSM20_HEADER,
|
||||||
|
+ .hsm20 = &hsm20_nand_hdr_4k_256_data,
|
||||||
|
+ }, {
|
||||||
|
+ .name = "spim:2k+64",
|
||||||
|
+ .type = NAND_BOOT_SPIM_HEADER,
|
||||||
|
+ .spim = &spim_nand_hdr_2k_64_data,
|
||||||
|
+ }, {
|
||||||
|
+ .name = "spim:2k+128",
|
||||||
|
+ .type = NAND_BOOT_SPIM_HEADER,
|
||||||
|
+ .spim = &spim_nand_hdr_2k_128_data,
|
||||||
|
+ }, {
|
||||||
|
+ .name = "spim:4k+256",
|
||||||
|
+ .type = NAND_BOOT_SPIM_HEADER,
|
||||||
|
+ .spim = &spim_nand_hdr_4k_256_data,
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
-const union nand_boot_header *mtk_nand_header_find(const char *name)
|
||||||
|
+const struct nand_header_type *mtk_nand_header_find(const char *name)
|
||||||
|
{
|
||||||
|
uint32_t i;
|
||||||
|
|
||||||
|
for (i = 0; i < ARRAY_SIZE(nand_headers); i++) {
|
||||||
|
if (!strcmp(nand_headers[i].name, name))
|
||||||
|
- return nand_headers[i].data;
|
||||||
|
+ return &nand_headers[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
-uint32_t mtk_nand_header_size(const union nand_boot_header *hdr_nand)
|
||||||
|
+uint32_t mtk_nand_header_size(const struct nand_header_type *hdr_nand)
|
||||||
|
{
|
||||||
|
- return 2 * le16_to_cpu(hdr_nand->pagesize);
|
||||||
|
+ switch (hdr_nand->type) {
|
||||||
|
+ case NAND_BOOT_HSM_HEADER:
|
||||||
|
+ return le32_to_cpu(hdr_nand->hsm->page_size);
|
||||||
|
+
|
||||||
|
+ case NAND_BOOT_HSM20_HEADER:
|
||||||
|
+ return le32_to_cpu(hdr_nand->hsm20->page_size);
|
||||||
|
+
|
||||||
|
+ case NAND_BOOT_SPIM_HEADER:
|
||||||
|
+ return le32_to_cpu(hdr_nand->spim->page_size);
|
||||||
|
+
|
||||||
|
+ default:
|
||||||
|
+ return 2 * le16_to_cpu(hdr_nand->ap->pagesize);
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
static int mtk_nand_header_ap_info(const void *ptr,
|
||||||
|
@@ -251,14 +542,45 @@ static int mtk_nand_header_ap_info(const
|
||||||
|
info->page_size = le16_to_cpu(nh->pagesize);
|
||||||
|
info->spare_size = le16_to_cpu(nh->oobsize);
|
||||||
|
info->gfh_offset = 2 * info->page_size;
|
||||||
|
+ info->snfi = true;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static int mtk_nand_header_hsm_info(const void *ptr,
|
||||||
|
+ struct nand_header_info *info)
|
||||||
|
+{
|
||||||
|
+ union hsm_nand_boot_header *nh = (union hsm_nand_boot_header *)ptr;
|
||||||
|
+
|
||||||
|
+ info->page_size = le16_to_cpu(nh->page_size);
|
||||||
|
+ info->spare_size = le16_to_cpu(nh->spare_size);
|
||||||
|
+ info->gfh_offset = info->page_size;
|
||||||
|
+ info->snfi = true;
|
||||||
|
+
|
||||||
|
+ return 1;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int mtk_nand_header_spim_info(const void *ptr,
|
||||||
|
+ struct nand_header_info *info)
|
||||||
|
+{
|
||||||
|
+ union spim_nand_boot_header *nh = (union spim_nand_boot_header *)ptr;
|
||||||
|
+
|
||||||
|
+ info->page_size = le16_to_cpu(nh->page_size);
|
||||||
|
+ info->spare_size = le16_to_cpu(nh->spare_size);
|
||||||
|
+ info->gfh_offset = info->page_size;
|
||||||
|
+ info->snfi = false;
|
||||||
|
+
|
||||||
|
+ return 1;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
int mtk_nand_header_info(const void *ptr, struct nand_header_info *info)
|
||||||
|
{
|
||||||
|
if (!strcmp((char *)ptr, NAND_BOOT_NAME))
|
||||||
|
return mtk_nand_header_ap_info(ptr, info);
|
||||||
|
+ else if (!strncmp((char *)ptr, HSM_NAND_BOOT_NAME, 8))
|
||||||
|
+ return mtk_nand_header_hsm_info(ptr, info);
|
||||||
|
+ else if (!strncmp((char *)ptr, SPIM_NAND_BOOT_NAME, 8))
|
||||||
|
+ return mtk_nand_header_spim_info(ptr, info);
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
@@ -273,14 +595,74 @@ bool is_mtk_nand_header(const void *ptr)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
-uint32_t mtk_nand_header_put(const union nand_boot_header *hdr_nand, void *ptr)
|
||||||
|
+static uint16_t crc16(const uint8_t *p, uint32_t len)
|
||||||
|
+{
|
||||||
|
+ uint16_t crc = 0x4f4e;
|
||||||
|
+ uint32_t i;
|
||||||
|
+
|
||||||
|
+ while (len--) {
|
||||||
|
+ crc ^= *p++ << 8;
|
||||||
|
+ for (i = 0; i < 8; i++)
|
||||||
|
+ crc = (crc << 1) ^ ((crc & 0x8000) ? 0x8005 : 0);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return crc;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static uint32_t mtk_nand_header_put_ap(const struct nand_header_type *hdr_nand,
|
||||||
|
+ void *ptr)
|
||||||
|
{
|
||||||
|
- union nand_boot_header *nh = (union nand_boot_header *)ptr;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
/* NAND device header, repeat 4 times */
|
||||||
|
- for (i = 0; i < 4; i++)
|
||||||
|
- memcpy(nh + i, hdr_nand, sizeof(union nand_boot_header));
|
||||||
|
+ for (i = 0; i < 4; i++) {
|
||||||
|
+ memcpy(ptr, hdr_nand->ap, sizeof(*hdr_nand->ap));
|
||||||
|
+ ptr += sizeof(*hdr_nand->ap);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return le16_to_cpu(hdr_nand->ap->pagesize);
|
||||||
|
+}
|
||||||
|
|
||||||
|
- return le16_to_cpu(hdr_nand->pagesize);
|
||||||
|
+static uint32_t mtk_nand_header_put_hsm(const struct nand_header_type *hdr_nand,
|
||||||
|
+ void *ptr)
|
||||||
|
+{
|
||||||
|
+ memcpy(ptr, hdr_nand->hsm, sizeof(*hdr_nand->hsm));
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static uint32_t mtk_nand_header_put_hsm20(const struct nand_header_type *hdr_nand,
|
||||||
|
+ void *ptr)
|
||||||
|
+{
|
||||||
|
+ memcpy(ptr, hdr_nand->hsm20, sizeof(*hdr_nand->hsm20));
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static uint32_t mtk_nand_header_put_spim(const struct nand_header_type *hdr_nand,
|
||||||
|
+ void *ptr)
|
||||||
|
+{
|
||||||
|
+ uint16_t crc;
|
||||||
|
+
|
||||||
|
+ memcpy(ptr, hdr_nand->spim, sizeof(*hdr_nand->spim));
|
||||||
|
+
|
||||||
|
+ crc = crc16(ptr, 0x4e);
|
||||||
|
+ memcpy(ptr + 0x4e, &crc, sizeof(uint16_t));
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+uint32_t mtk_nand_header_put(const struct nand_header_type *hdr_nand, void *ptr)
|
||||||
|
+{
|
||||||
|
+ switch (hdr_nand->type) {
|
||||||
|
+ case NAND_BOOT_HSM_HEADER:
|
||||||
|
+ return mtk_nand_header_put_hsm(hdr_nand, ptr);
|
||||||
|
+
|
||||||
|
+ case NAND_BOOT_HSM20_HEADER:
|
||||||
|
+ return mtk_nand_header_put_hsm20(hdr_nand, ptr);
|
||||||
|
+
|
||||||
|
+ case NAND_BOOT_SPIM_HEADER:
|
||||||
|
+ return mtk_nand_header_put_spim(hdr_nand, ptr);
|
||||||
|
+
|
||||||
|
+ default:
|
||||||
|
+ return mtk_nand_header_put_ap(hdr_nand, ptr);
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
--- a/tools/mtk_nand_headers.h
|
||||||
|
+++ b/tools/mtk_nand_headers.h
|
||||||
|
@@ -16,6 +16,7 @@ struct nand_header_info {
|
||||||
|
uint32_t page_size;
|
||||||
|
uint32_t spare_size;
|
||||||
|
uint32_t gfh_offset;
|
||||||
|
+ bool snfi;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* AP BROM Header for NAND */
|
||||||
|
@@ -39,15 +40,117 @@ union nand_boot_header {
|
||||||
|
uint8_t data[0x80];
|
||||||
|
};
|
||||||
|
|
||||||
|
+/* HSM BROM Header for NAND */
|
||||||
|
+union hsm_nand_boot_header {
|
||||||
|
+ struct {
|
||||||
|
+ char id[8];
|
||||||
|
+ uint32_t version; /* Header version */
|
||||||
|
+ uint32_t config; /* Header config */
|
||||||
|
+ uint32_t sector_size; /* ECC step size */
|
||||||
|
+ uint32_t fdm_size; /* User OOB size of a step */
|
||||||
|
+ uint32_t fdm_ecc_size; /* ECC parity size of a step */
|
||||||
|
+ uint32_t lbs;
|
||||||
|
+ uint32_t page_size; /* NAND page size */
|
||||||
|
+ uint32_t spare_size; /* NAND page spare size */
|
||||||
|
+ uint32_t page_per_block; /* Pages of one block */
|
||||||
|
+ uint32_t blocks; /* Total blocks of NAND chip */
|
||||||
|
+ uint32_t plane_sel_position; /* Plane bit position */
|
||||||
|
+ uint32_t pll; /* Value of pll reg */
|
||||||
|
+ uint32_t acccon; /* Value of access timing reg */
|
||||||
|
+ uint32_t strobe_sel; /* Value of DQS selection reg*/
|
||||||
|
+ uint32_t acccon1; /* Value of access timing reg */
|
||||||
|
+ uint32_t dqs_mux; /* Value of DQS mux reg */
|
||||||
|
+ uint32_t dqs_ctrl; /* Value of DQS control reg */
|
||||||
|
+ uint32_t delay_ctrl; /* Value of delay ctrl reg */
|
||||||
|
+ uint32_t latch_lat; /* Value of latch latency reg */
|
||||||
|
+ uint32_t sample_delay; /* Value of sample delay reg */
|
||||||
|
+ uint32_t driving; /* Value of driving reg */
|
||||||
|
+ uint32_t bl_start; /* Bootloader start addr */
|
||||||
|
+ uint32_t bl_end; /* Bootloader end addr */
|
||||||
|
+ uint8_t ecc_parity[42]; /* ECC parity of this header */
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ uint8_t data[0x8E];
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+/* HSM2.0 BROM Header for NAND */
|
||||||
|
+union hsm20_nand_boot_header {
|
||||||
|
+ struct {
|
||||||
|
+ char id[8];
|
||||||
|
+ uint32_t version; /* Header version */
|
||||||
|
+ uint32_t config; /* Header config */
|
||||||
|
+ uint32_t sector_size; /* ECC step size */
|
||||||
|
+ uint32_t fdm_size; /* User OOB size of a step */
|
||||||
|
+ uint32_t fdm_ecc_size; /* ECC parity size of a step */
|
||||||
|
+ uint32_t lbs;
|
||||||
|
+ uint32_t page_size; /* NAND page size */
|
||||||
|
+ uint32_t spare_size; /* NAND page spare size */
|
||||||
|
+ uint32_t page_per_block; /* Pages of one block */
|
||||||
|
+ uint32_t blocks; /* Total blocks of NAND chip */
|
||||||
|
+ uint32_t plane_sel_position; /* Plane bit position */
|
||||||
|
+ uint32_t pll; /* Value of pll reg */
|
||||||
|
+ uint32_t acccon; /* Value of access timing reg */
|
||||||
|
+ uint32_t strobe_sel; /* Value of DQS selection reg*/
|
||||||
|
+ uint32_t acccon1; /* Value of access timing reg */
|
||||||
|
+ uint32_t dqs_mux; /* Value of DQS mux reg */
|
||||||
|
+ uint32_t dqs_ctrl; /* Value of DQS control reg */
|
||||||
|
+ uint32_t delay_ctrl; /* Value of delay ctrl reg */
|
||||||
|
+ uint32_t latch_lat; /* Value of latch latency reg */
|
||||||
|
+ uint32_t sample_delay; /* Value of sample delay reg */
|
||||||
|
+ uint32_t driving; /* Value of driving reg */
|
||||||
|
+ uint32_t reserved;
|
||||||
|
+ uint32_t bl0_start; /* Bootloader start addr */
|
||||||
|
+ uint32_t bl0_end; /* Bootloader end addr */
|
||||||
|
+ uint32_t bl0_type; /* Bootloader type */
|
||||||
|
+ uint8_t bl_reserve[84];
|
||||||
|
+ uint8_t ecc_parity[42]; /* ECC parity of this header */
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ uint8_t data[0xEA];
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+/* SPIM BROM Header for SPI-NAND */
|
||||||
|
+union spim_nand_boot_header {
|
||||||
|
+ struct {
|
||||||
|
+ char id[8];
|
||||||
|
+ uint32_t version; /* Header version */
|
||||||
|
+ uint32_t config; /* Header config */
|
||||||
|
+ uint32_t page_size; /* NAND page size */
|
||||||
|
+ uint32_t spare_size; /* NAND page spare size */
|
||||||
|
+ uint16_t page_per_block; /* Pages of one block */
|
||||||
|
+ uint16_t plane_sel_position; /* Plane bit position */
|
||||||
|
+ uint16_t reserve_reg;
|
||||||
|
+ uint16_t reserve_val;
|
||||||
|
+ uint16_t ecc_error; /* ECC error reg addr */
|
||||||
|
+ uint16_t ecc_mask; /* ECC error bit mask */
|
||||||
|
+ uint32_t bl_start; /* Bootloader start addr */
|
||||||
|
+ uint32_t bl_end; /* Bootloader end addr */
|
||||||
|
+ uint8_t ecc_parity[32]; /* ECC parity of this header */
|
||||||
|
+ uint32_t integrity_crc; /* CRC of this header */
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ uint8_t data[0x50];
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+enum nand_boot_header_type {
|
||||||
|
+ NAND_BOOT_AP_HEADER,
|
||||||
|
+ NAND_BOOT_HSM_HEADER,
|
||||||
|
+ NAND_BOOT_HSM20_HEADER,
|
||||||
|
+ NAND_BOOT_SPIM_HEADER
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
#define NAND_BOOT_NAME "BOOTLOADER!"
|
||||||
|
#define NAND_BOOT_VERSION "V006"
|
||||||
|
#define NAND_BOOT_ID "NFIINFO"
|
||||||
|
|
||||||
|
+#define HSM_NAND_BOOT_NAME "NANDCFG!"
|
||||||
|
+#define SPIM_NAND_BOOT_NAME "SPINAND!"
|
||||||
|
+
|
||||||
|
/* Find nand header data by name */
|
||||||
|
-const union nand_boot_header *mtk_nand_header_find(const char *name);
|
||||||
|
+const struct nand_header_type *mtk_nand_header_find(const char *name);
|
||||||
|
|
||||||
|
/* Device header size using this nand header */
|
||||||
|
-uint32_t mtk_nand_header_size(const union nand_boot_header *hdr_nand);
|
||||||
|
+uint32_t mtk_nand_header_size(const struct nand_header_type *hdr_nand);
|
||||||
|
|
||||||
|
/* Get nand info from nand header (page size, spare size, ...) */
|
||||||
|
int mtk_nand_header_info(const void *ptr, struct nand_header_info *info);
|
||||||
|
@@ -56,6 +159,7 @@ int mtk_nand_header_info(const void *ptr
|
||||||
|
bool is_mtk_nand_header(const void *ptr);
|
||||||
|
|
||||||
|
/* Generate Device header using give nand header */
|
||||||
|
-uint32_t mtk_nand_header_put(const union nand_boot_header *hdr_nand, void *ptr);
|
||||||
|
+uint32_t mtk_nand_header_put(const struct nand_header_type *hdr_nand,
|
||||||
|
+ void *ptr);
|
||||||
|
|
||||||
|
#endif /* _MTK_NAND_HEADERS_H */
|
Loading…
Reference in New Issue
Block a user