mediatek: bump to v4.9
Signed-off-by: John Crispin <john@phrozen.org>
This commit is contained in:
parent
f885edef5a
commit
53f5d59fa1
110 changed files with 136 additions and 27215 deletions
|
@ -10,7 +10,7 @@ CPU_TYPE:=cortex-a7
|
|||
CPU_SUBTYPE:=neon-vfpv4
|
||||
MAINTAINER:=John Crispin <john@phrozen.org>
|
||||
|
||||
KERNEL_PATCHVER:=4.4
|
||||
KERNEL_PATCHVER:=4.9
|
||||
|
||||
KERNELNAME:=Image dtbs zImage
|
||||
|
||||
|
|
|
@ -1,415 +0,0 @@
|
|||
# CONFIG_AIO is not set
|
||||
CONFIG_ALIGNMENT_TRAP=y
|
||||
# CONFIG_APM_EMULATION is not set
|
||||
CONFIG_ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE=y
|
||||
CONFIG_ARCH_HAS_ELF_RANDOMIZE=y
|
||||
CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y
|
||||
CONFIG_ARCH_HAS_SG_CHAIN=y
|
||||
CONFIG_ARCH_HAS_TICK_BROADCAST=y
|
||||
CONFIG_ARCH_HAVE_CUSTOM_GPIO_H=y
|
||||
CONFIG_ARCH_HIBERNATION_POSSIBLE=y
|
||||
CONFIG_ARCH_MEDIATEK=y
|
||||
CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y
|
||||
CONFIG_ARCH_MULTIPLATFORM=y
|
||||
# CONFIG_ARCH_MULTI_CPU_AUTO is not set
|
||||
CONFIG_ARCH_MULTI_V6_V7=y
|
||||
CONFIG_ARCH_MULTI_V7=y
|
||||
CONFIG_ARCH_NR_GPIO=0
|
||||
# CONFIG_ARCH_SELECT_MEMORY_MODEL is not set
|
||||
# CONFIG_ARCH_SPARSEMEM_DEFAULT is not set
|
||||
CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y
|
||||
CONFIG_ARCH_SUPPORTS_UPROBES=y
|
||||
CONFIG_ARCH_SUSPEND_POSSIBLE=y
|
||||
CONFIG_ARCH_USE_BUILTIN_BSWAP=y
|
||||
CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y
|
||||
CONFIG_ARCH_WANT_GENERAL_HUGETLB=y
|
||||
CONFIG_ARCH_WANT_IPC_PARSE_VERSION=y
|
||||
CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y
|
||||
CONFIG_ARM=y
|
||||
CONFIG_ARM_APPENDED_DTB=y
|
||||
CONFIG_ARM_ARCH_TIMER=y
|
||||
CONFIG_ARM_ARCH_TIMER_EVTSTREAM=y
|
||||
# CONFIG_ARM_ATAG_DTB_COMPAT is not set
|
||||
CONFIG_ARM_CPU_SUSPEND=y
|
||||
# CONFIG_ARM_CPU_TOPOLOGY is not set
|
||||
CONFIG_ARM_GIC=y
|
||||
CONFIG_ARM_HAS_SG_CHAIN=y
|
||||
CONFIG_ARM_L1_CACHE_SHIFT=6
|
||||
CONFIG_ARM_L1_CACHE_SHIFT_6=y
|
||||
# CONFIG_ARM_LPAE is not set
|
||||
CONFIG_ARM_MT7623_CPUFREQ=y
|
||||
CONFIG_ARM_PATCH_PHYS_VIRT=y
|
||||
# CONFIG_ARM_SMMU is not set
|
||||
CONFIG_ARM_THUMB=y
|
||||
CONFIG_ARM_THUMBEE=y
|
||||
CONFIG_ARM_UNWIND=y
|
||||
CONFIG_ARM_VIRT_EXT=y
|
||||
CONFIG_ATAGS=y
|
||||
CONFIG_AUTO_ZRELADDR=y
|
||||
# CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set
|
||||
CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0
|
||||
CONFIG_BOUNCE=y
|
||||
# CONFIG_CACHE_L2X0 is not set
|
||||
CONFIG_CC_STACKPROTECTOR=y
|
||||
# CONFIG_CC_STACKPROTECTOR_NONE is not set
|
||||
CONFIG_CC_STACKPROTECTOR_REGULAR=y
|
||||
CONFIG_CLEANCACHE=y
|
||||
CONFIG_CLKDEV_LOOKUP=y
|
||||
CONFIG_CLKSRC_MMIO=y
|
||||
CONFIG_CLKSRC_OF=y
|
||||
CONFIG_CLKSRC_PROBE=y
|
||||
CONFIG_CLONE_BACKWARDS=y
|
||||
CONFIG_CMDLINE="earlyprintk console=ttyS0,115200 block2mtd.block2mtd=/dev/mmcblk0,65536,eMMC,5 mtdparts=eMMC:256k(mbr)ro,512k(uboot)ro,256k(config)ro,256k(factory)ro,32M(kernel),32M(recovery),1024M(rootfs),2048M(usrdata),-(bmtpool) rootfstype=squashfs,jffs2"
|
||||
CONFIG_CMDLINE_FORCE=y
|
||||
CONFIG_COMMON_CLK=y
|
||||
CONFIG_COMMON_CLK_MEDIATEK=y
|
||||
CONFIG_COMMON_CLK_MT2701=y
|
||||
# CONFIG_COMMON_CLK_MT8135 is not set
|
||||
# CONFIG_COMMON_CLK_MT8173 is not set
|
||||
CONFIG_COMPACTION=y
|
||||
CONFIG_COREDUMP=y
|
||||
# CONFIG_CPUFREQ_DT is not set
|
||||
CONFIG_CPU_32v6K=y
|
||||
CONFIG_CPU_32v7=y
|
||||
CONFIG_CPU_ABRT_EV7=y
|
||||
# CONFIG_CPU_BPREDICT_DISABLE is not set
|
||||
CONFIG_CPU_CACHE_V7=y
|
||||
CONFIG_CPU_CACHE_VIPT=y
|
||||
CONFIG_CPU_COPY_V6=y
|
||||
CONFIG_CPU_CP15=y
|
||||
CONFIG_CPU_CP15_MMU=y
|
||||
CONFIG_CPU_FREQ=y
|
||||
CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y
|
||||
CONFIG_CPU_FREQ_GOV_COMMON=y
|
||||
CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y
|
||||
CONFIG_CPU_FREQ_GOV_ONDEMAND=y
|
||||
CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
|
||||
CONFIG_CPU_FREQ_GOV_POWERSAVE=y
|
||||
# CONFIG_CPU_FREQ_GOV_USERSPACE is not set
|
||||
CONFIG_CPU_FREQ_STAT=y
|
||||
CONFIG_CPU_HAS_ASID=y
|
||||
# CONFIG_CPU_ICACHE_DISABLE is not set
|
||||
CONFIG_CPU_PABRT_V7=y
|
||||
CONFIG_CPU_PM=y
|
||||
CONFIG_CPU_RMAP=y
|
||||
CONFIG_CPU_TLB_V7=y
|
||||
CONFIG_CPU_V7=y
|
||||
CONFIG_CRC16=y
|
||||
# CONFIG_CRC32_SARWATE is not set
|
||||
CONFIG_CRC32_SLICEBY8=y
|
||||
CONFIG_CROSS_MEMORY_ATTACH=y
|
||||
CONFIG_CRYPTO_DEFLATE=y
|
||||
CONFIG_CRYPTO_LZO=y
|
||||
CONFIG_CRYPTO_RNG2=y
|
||||
CONFIG_CRYPTO_WORKQUEUE=y
|
||||
CONFIG_DCACHE_WORD_ACCESS=y
|
||||
CONFIG_DEBUG_BUGVERBOSE=y
|
||||
CONFIG_DEBUG_GPIO=y
|
||||
CONFIG_DEBUG_INFO=y
|
||||
CONFIG_DEBUG_LL=y
|
||||
CONFIG_DEBUG_LL_INCLUDE="debug/8250.S"
|
||||
CONFIG_DEBUG_MT6589_UART0=y
|
||||
# CONFIG_DEBUG_MT8127_UART0 is not set
|
||||
# CONFIG_DEBUG_MT8135_UART3 is not set
|
||||
CONFIG_DEBUG_PREEMPT=y
|
||||
CONFIG_DEBUG_UART_8250=y
|
||||
# CONFIG_DEBUG_UART_8250_FLOW_CONTROL is not set
|
||||
CONFIG_DEBUG_UART_8250_SHIFT=2
|
||||
# CONFIG_DEBUG_UART_8250_WORD is not set
|
||||
CONFIG_DEBUG_UART_PHYS=0x11004000
|
||||
CONFIG_DEBUG_UART_VIRT=0xf1004000
|
||||
CONFIG_DEBUG_UNCOMPRESS=y
|
||||
# CONFIG_DEBUG_USER is not set
|
||||
CONFIG_DMADEVICES=y
|
||||
CONFIG_DMA_ENGINE=y
|
||||
CONFIG_DMA_OF=y
|
||||
CONFIG_DTC=y
|
||||
# CONFIG_DW_DMAC_PCI is not set
|
||||
CONFIG_EARLY_PRINTK=y
|
||||
CONFIG_EDAC_ATOMIC_SCRUB=y
|
||||
CONFIG_EDAC_SUPPORT=y
|
||||
CONFIG_ELF_CORE=y
|
||||
CONFIG_FIXED_PHY=y
|
||||
CONFIG_FIX_EARLYCON_MEM=y
|
||||
CONFIG_FREEZER=y
|
||||
CONFIG_GENERIC_ALLOCATOR=y
|
||||
CONFIG_GENERIC_BUG=y
|
||||
CONFIG_GENERIC_CLOCKEVENTS=y
|
||||
CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y
|
||||
CONFIG_GENERIC_IDLE_POLL_SETUP=y
|
||||
CONFIG_GENERIC_IO=y
|
||||
CONFIG_GENERIC_IRQ_SHOW=y
|
||||
CONFIG_GENERIC_IRQ_SHOW_LEVEL=y
|
||||
CONFIG_GENERIC_MSI_IRQ=y
|
||||
CONFIG_GENERIC_PCI_IOMAP=y
|
||||
CONFIG_GENERIC_PHY=y
|
||||
CONFIG_GENERIC_PINCONF=y
|
||||
CONFIG_GENERIC_SCHED_CLOCK=y
|
||||
CONFIG_GENERIC_SMP_IDLE_THREAD=y
|
||||
CONFIG_GENERIC_STRNCPY_FROM_USER=y
|
||||
CONFIG_GENERIC_STRNLEN_USER=y
|
||||
CONFIG_GPIOLIB=y
|
||||
CONFIG_GPIO_DEVRES=y
|
||||
CONFIG_GPIO_SYSFS=y
|
||||
CONFIG_HANDLE_DOMAIN_IRQ=y
|
||||
CONFIG_HARDIRQS_SW_RESEND=y
|
||||
CONFIG_HAS_DMA=y
|
||||
CONFIG_HAS_IOMEM=y
|
||||
CONFIG_HAS_IOPORT_MAP=y
|
||||
# CONFIG_HAVE_64BIT_ALIGNED_ACCESS is not set
|
||||
CONFIG_HAVE_ARCH_AUDITSYSCALL=y
|
||||
CONFIG_HAVE_ARCH_BITREVERSE=y
|
||||
CONFIG_HAVE_ARCH_JUMP_LABEL=y
|
||||
CONFIG_HAVE_ARCH_KGDB=y
|
||||
CONFIG_HAVE_ARCH_PFN_VALID=y
|
||||
CONFIG_HAVE_ARCH_SECCOMP_FILTER=y
|
||||
CONFIG_HAVE_ARCH_TRACEHOOK=y
|
||||
CONFIG_HAVE_ARM_ARCH_TIMER=y
|
||||
# CONFIG_HAVE_BOOTMEM_INFO_NODE is not set
|
||||
CONFIG_HAVE_BPF_JIT=y
|
||||
CONFIG_HAVE_CC_STACKPROTECTOR=y
|
||||
CONFIG_HAVE_CLK=y
|
||||
CONFIG_HAVE_CLK_PREPARE=y
|
||||
CONFIG_HAVE_CONTEXT_TRACKING=y
|
||||
CONFIG_HAVE_C_RECORDMCOUNT=y
|
||||
CONFIG_HAVE_DEBUG_KMEMLEAK=y
|
||||
CONFIG_HAVE_DMA_API_DEBUG=y
|
||||
CONFIG_HAVE_DMA_ATTRS=y
|
||||
CONFIG_HAVE_DMA_CONTIGUOUS=y
|
||||
CONFIG_HAVE_DYNAMIC_FTRACE=y
|
||||
CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y
|
||||
CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y
|
||||
CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y
|
||||
CONFIG_HAVE_FUNCTION_TRACER=y
|
||||
CONFIG_HAVE_GENERIC_DMA_COHERENT=y
|
||||
CONFIG_HAVE_IDE=y
|
||||
CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y
|
||||
CONFIG_HAVE_MEMBLOCK=y
|
||||
CONFIG_HAVE_MOD_ARCH_SPECIFIC=y
|
||||
CONFIG_HAVE_NET_DSA=y
|
||||
CONFIG_HAVE_OPROFILE=y
|
||||
CONFIG_HAVE_OPTPROBES=y
|
||||
CONFIG_HAVE_PERF_EVENTS=y
|
||||
CONFIG_HAVE_PERF_REGS=y
|
||||
CONFIG_HAVE_PERF_USER_STACK_DUMP=y
|
||||
CONFIG_HAVE_PROC_CPU=y
|
||||
CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y
|
||||
CONFIG_HAVE_SMP=y
|
||||
CONFIG_HAVE_SYSCALL_TRACEPOINTS=y
|
||||
CONFIG_HAVE_UID16=y
|
||||
CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y
|
||||
CONFIG_HIGHMEM=y
|
||||
# CONFIG_HIGHPTE is not set
|
||||
CONFIG_HOTPLUG_CPU=y
|
||||
CONFIG_HWMON=y
|
||||
CONFIG_HW_RANDOM=y
|
||||
CONFIG_HZ_FIXED=0
|
||||
CONFIG_I2C=y
|
||||
CONFIG_I2C_BOARDINFO=y
|
||||
CONFIG_I2C_CHARDEV=y
|
||||
CONFIG_I2C_MT65XX=y
|
||||
CONFIG_INITRAMFS_ROOT_GID=1000
|
||||
CONFIG_INITRAMFS_ROOT_UID=1000
|
||||
CONFIG_INITRAMFS_SOURCE="/openwrt/trunk/build_dir/target-arm_cortex-a7_musl-1.1.14_eabi/root-mediatek /openwrt/trunk/target/linux/generic/image/initramfs-base-files.txt"
|
||||
CONFIG_IOMMU_HELPER=y
|
||||
# CONFIG_IOMMU_IO_PGTABLE_LPAE is not set
|
||||
CONFIG_IOMMU_SUPPORT=y
|
||||
CONFIG_IRQCHIP=y
|
||||
CONFIG_IRQ_DOMAIN=y
|
||||
CONFIG_IRQ_DOMAIN_HIERARCHY=y
|
||||
CONFIG_IRQ_FORCED_THREADING=y
|
||||
CONFIG_IRQ_WORK=y
|
||||
CONFIG_KALLSYMS=y
|
||||
CONFIG_LIBFDT=y
|
||||
CONFIG_LOCKUP_DETECTOR=y
|
||||
CONFIG_LOCK_SPIN_ON_OWNER=y
|
||||
CONFIG_LZO_COMPRESS=y
|
||||
CONFIG_LZO_DECOMPRESS=y
|
||||
CONFIG_MACH_MT2701=y
|
||||
# CONFIG_MACH_MT6589 is not set
|
||||
# CONFIG_MACH_MT6592 is not set
|
||||
CONFIG_MACH_MT7623=y
|
||||
CONFIG_MACH_MT8127=y
|
||||
# CONFIG_MACH_MT8135 is not set
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_MDIO_BITBANG=y
|
||||
CONFIG_MDIO_BOARDINFO=y
|
||||
CONFIG_MDIO_GPIO=y
|
||||
CONFIG_MEDIATEK_WATCHDOG=y
|
||||
CONFIG_MFD_CORE=y
|
||||
CONFIG_MFD_MT6397=y
|
||||
CONFIG_MFD_SYSCON=y
|
||||
CONFIG_MIGHT_HAVE_CACHE_L2X0=y
|
||||
CONFIG_MIGHT_HAVE_PCI=y
|
||||
CONFIG_MIGRATION=y
|
||||
CONFIG_MMC=y
|
||||
CONFIG_MMC_BLOCK=y
|
||||
CONFIG_MMC_MTK=y
|
||||
CONFIG_MMC_SDHCI=y
|
||||
# CONFIG_MMC_SDHCI_PCI is not set
|
||||
CONFIG_MMC_SDHCI_PLTFM=y
|
||||
# CONFIG_MMC_TIFM_SD is not set
|
||||
CONFIG_MODULES_USE_ELF_REL=y
|
||||
CONFIG_MTD_BLOCK2MTD=y
|
||||
CONFIG_MTD_CMDLINE_PARTS=y
|
||||
CONFIG_MTD_M25P80=y
|
||||
CONFIG_MTD_MT81xx_NOR=y
|
||||
CONFIG_MTD_NAND=y
|
||||
CONFIG_MTD_NAND_ECC=y
|
||||
CONFIG_MTD_NAND_MTK=y
|
||||
CONFIG_MTD_SPI_NOR=y
|
||||
CONFIG_MTD_UBI=y
|
||||
CONFIG_MTD_UBI_BEB_LIMIT=20
|
||||
CONFIG_MTD_UBI_BLOCK=y
|
||||
# CONFIG_MTD_UBI_FASTMAP is not set
|
||||
# CONFIG_MTD_UBI_GLUEBI is not set
|
||||
CONFIG_MTD_UBI_WL_THRESHOLD=4096
|
||||
CONFIG_MTK_INFRACFG=y
|
||||
CONFIG_MTK_PMIC_WRAP=y
|
||||
CONFIG_MTK_SCPSYS=y
|
||||
CONFIG_MTK_SCPSYS_MT2701=y
|
||||
CONFIG_MTK_SCPSYS_MT8173=y
|
||||
CONFIG_MTK_TIMER=y
|
||||
CONFIG_MULTI_IRQ_HANDLER=y
|
||||
CONFIG_MUTEX_SPIN_ON_OWNER=y
|
||||
CONFIG_NEED_DMA_MAP_STATE=y
|
||||
# CONFIG_NEON is not set
|
||||
CONFIG_NET_FLOW_LIMIT=y
|
||||
CONFIG_NET_MEDIATEK_SOC=y
|
||||
# CONFIG_NET_VENDOR_AURORA is not set
|
||||
CONFIG_NET_VENDOR_MEDIATEK=y
|
||||
# CONFIG_NET_VENDOR_WIZNET is not set
|
||||
CONFIG_NLS=y
|
||||
CONFIG_NO_BOOTMEM=y
|
||||
CONFIG_NO_HZ=y
|
||||
CONFIG_NO_HZ_COMMON=y
|
||||
CONFIG_NO_HZ_IDLE=y
|
||||
CONFIG_NR_CPUS=4
|
||||
CONFIG_OF=y
|
||||
CONFIG_OF_ADDRESS=y
|
||||
CONFIG_OF_ADDRESS_PCI=y
|
||||
CONFIG_OF_EARLY_FLATTREE=y
|
||||
CONFIG_OF_FLATTREE=y
|
||||
CONFIG_OF_GPIO=y
|
||||
CONFIG_OF_IRQ=y
|
||||
CONFIG_OF_MDIO=y
|
||||
CONFIG_OF_MTD=y
|
||||
CONFIG_OF_NET=y
|
||||
CONFIG_OF_PCI=y
|
||||
CONFIG_OF_PCI_IRQ=y
|
||||
CONFIG_OF_RESERVED_MEM=y
|
||||
CONFIG_OLD_SIGACTION=y
|
||||
CONFIG_OLD_SIGSUSPEND3=y
|
||||
CONFIG_PAGE_OFFSET=0xC0000000
|
||||
CONFIG_PCI=y
|
||||
CONFIG_PCIE_MTK=y
|
||||
# CONFIG_PCI_DOMAINS_GENERIC is not set
|
||||
CONFIG_PCI_MSI=y
|
||||
CONFIG_PERF_USE_VMALLOC=y
|
||||
CONFIG_PGTABLE_LEVELS=2
|
||||
CONFIG_PHYLIB=y
|
||||
CONFIG_PHY_MT65XX_USB3=y
|
||||
CONFIG_PINCTRL=y
|
||||
CONFIG_PINCTRL_MT2701=y
|
||||
CONFIG_PINCTRL_MT6397=y
|
||||
CONFIG_PINCTRL_MT7623=y
|
||||
CONFIG_PINCTRL_MT8127=y
|
||||
# CONFIG_PINCTRL_MT8135 is not set
|
||||
CONFIG_PINCTRL_MTK_COMMON=y
|
||||
CONFIG_PM=y
|
||||
CONFIG_PM_CLK=y
|
||||
# CONFIG_PM_DEBUG is not set
|
||||
CONFIG_PM_GENERIC_DOMAINS=y
|
||||
CONFIG_PM_GENERIC_DOMAINS_OF=y
|
||||
CONFIG_PM_GENERIC_DOMAINS_SLEEP=y
|
||||
CONFIG_PM_OPP=y
|
||||
CONFIG_PM_SLEEP=y
|
||||
CONFIG_PM_SLEEP_SMP=y
|
||||
CONFIG_POWER_RESET=y
|
||||
CONFIG_POWER_SUPPLY=y
|
||||
CONFIG_PREEMPT=y
|
||||
CONFIG_PREEMPT_COUNT=y
|
||||
# CONFIG_PREEMPT_NONE is not set
|
||||
CONFIG_PREEMPT_RCU=y
|
||||
CONFIG_PRINTK_TIME=y
|
||||
CONFIG_PWM=y
|
||||
CONFIG_PWM_MEDIATEK=y
|
||||
# CONFIG_PWM_MTK_DISP is not set
|
||||
CONFIG_PWM_SYSFS=y
|
||||
CONFIG_RATIONAL=y
|
||||
CONFIG_RCU_CPU_STALL_TIMEOUT=21
|
||||
# CONFIG_RCU_EXPERT is not set
|
||||
CONFIG_RCU_STALL_COMMON=y
|
||||
CONFIG_REGMAP=y
|
||||
CONFIG_REGMAP_MMIO=y
|
||||
CONFIG_REGULATOR=y
|
||||
CONFIG_REGULATOR_FIXED_VOLTAGE=y
|
||||
CONFIG_REGULATOR_GPIO=y
|
||||
CONFIG_REGULATOR_MT6323=y
|
||||
# CONFIG_REGULATOR_MT6397 is not set
|
||||
# CONFIG_REGULATOR_QCOM_SPMI is not set
|
||||
CONFIG_RESET_CONTROLLER=y
|
||||
CONFIG_RFS_ACCEL=y
|
||||
CONFIG_RPS=y
|
||||
CONFIG_RTC_CLASS=y
|
||||
# CONFIG_RTC_DRV_CMOS is not set
|
||||
# CONFIG_RTC_DRV_MT6397 is not set
|
||||
CONFIG_RWSEM_SPIN_ON_OWNER=y
|
||||
CONFIG_RWSEM_XCHGADD_ALGORITHM=y
|
||||
CONFIG_SCHED_HRTICK=y
|
||||
# CONFIG_SCHED_INFO is not set
|
||||
# CONFIG_SCSI_DMA is not set
|
||||
# CONFIG_SERIAL_8250_DMA is not set
|
||||
CONFIG_SERIAL_8250_FSL=y
|
||||
CONFIG_SERIAL_8250_MT6577=y
|
||||
CONFIG_SERIAL_8250_NR_UARTS=4
|
||||
CONFIG_SERIAL_8250_RUNTIME_UARTS=4
|
||||
CONFIG_SMP=y
|
||||
# CONFIG_SMP_ON_UP is not set
|
||||
CONFIG_SPARSE_IRQ=y
|
||||
CONFIG_SPI=y
|
||||
CONFIG_SPI_BITBANG=y
|
||||
CONFIG_SPI_MASTER=y
|
||||
CONFIG_SPI_MT65XX=y
|
||||
CONFIG_SPMI=y
|
||||
CONFIG_SRCU=y
|
||||
# CONFIG_STRIP_ASM_SYMS is not set
|
||||
CONFIG_SUSPEND=y
|
||||
CONFIG_SUSPEND_FREEZER=y
|
||||
CONFIG_SWCONFIG=y
|
||||
CONFIG_SWIOTLB=y
|
||||
CONFIG_SWP_EMULATE=y
|
||||
CONFIG_SYS_SUPPORTS_APM_EMULATION=y
|
||||
# CONFIG_THUMB2_KERNEL is not set
|
||||
CONFIG_TICK_CPU_ACCOUNTING=y
|
||||
CONFIG_TIMER_STATS=y
|
||||
CONFIG_UBIFS_FS=y
|
||||
# CONFIG_UBIFS_FS_ADVANCED_COMPR is not set
|
||||
CONFIG_UBIFS_FS_LZO=y
|
||||
CONFIG_UBIFS_FS_ZLIB=y
|
||||
CONFIG_UEVENT_HELPER_PATH=""
|
||||
CONFIG_UNCOMPRESS_INCLUDE="debug/uncompress.h"
|
||||
CONFIG_UNINLINE_SPIN_UNLOCK=y
|
||||
CONFIG_USB=y
|
||||
CONFIG_USB_COMMON=y
|
||||
# CONFIG_USB_EHCI_HCD is not set
|
||||
CONFIG_USB_SUPPORT=y
|
||||
# CONFIG_USB_UHCI_HCD is not set
|
||||
CONFIG_USB_XHCI_HCD=y
|
||||
CONFIG_USB_XHCI_MTK=y
|
||||
CONFIG_USB_XHCI_PCI=y
|
||||
CONFIG_USB_XHCI_PLATFORM=y
|
||||
CONFIG_USE_OF=y
|
||||
CONFIG_VECTORS_BASE=0xffff0000
|
||||
CONFIG_VFP=y
|
||||
CONFIG_VFPv3=y
|
||||
CONFIG_VM_EVENT_COUNTERS=y
|
||||
CONFIG_WATCHDOG_CORE=y
|
||||
CONFIG_XPS=y
|
||||
CONFIG_XZ_DEC_ARM=y
|
||||
CONFIG_XZ_DEC_BCJ=y
|
||||
CONFIG_ZBOOT_ROM_BSS=0
|
||||
CONFIG_ZBOOT_ROM_TEXT=0
|
||||
CONFIG_ZLIB_DEFLATE=y
|
||||
CONFIG_ZLIB_INFLATE=y
|
||||
CONFIG_ZONE_DMA_FLAG=0
|
|
@ -17,7 +17,7 @@
|
|||
#include <dt-bindings/clock/mt2701-clk.h>
|
||||
#include <dt-bindings/power/mt2701-power.h>
|
||||
#include <dt-bindings/phy/phy.h>
|
||||
#include <dt-bindings/reset-controller/mt2701-resets.h>
|
||||
#include <dt-bindings/reset/mt2701-resets.h>
|
||||
#include <dt-bindings/pinctrl/mt7623-pinfunc.h>
|
||||
#include "skeleton64.dtsi"
|
||||
|
||||
|
|
|
@ -1,665 +0,0 @@
|
|||
From 1892fcf687116720d07135c83d489a23ec56a166 Mon Sep 17 00:00:00 2001
|
||||
From: James Liao <jamesjj.liao@mediatek.com>
|
||||
Date: Wed, 30 Dec 2015 14:41:43 +0800
|
||||
Subject: [PATCH 002/102] soc: mediatek: Separate scpsys driver common code
|
||||
|
||||
Separate scpsys driver common code to mtk-scpsys.c, and move MT8173
|
||||
platform code to mtk-scpsys-mt8173.c.
|
||||
|
||||
Signed-off-by: James Liao <jamesjj.liao@mediatek.com>
|
||||
---
|
||||
drivers/soc/mediatek/Kconfig | 13 +-
|
||||
drivers/soc/mediatek/Makefile | 1 +
|
||||
drivers/soc/mediatek/mtk-scpsys-mt8173.c | 179 ++++++++++++++++++
|
||||
drivers/soc/mediatek/mtk-scpsys.c | 301 ++++++++----------------------
|
||||
drivers/soc/mediatek/mtk-scpsys.h | 54 ++++++
|
||||
5 files changed, 320 insertions(+), 228 deletions(-)
|
||||
create mode 100644 drivers/soc/mediatek/mtk-scpsys-mt8173.c
|
||||
create mode 100644 drivers/soc/mediatek/mtk-scpsys.h
|
||||
|
||||
--- a/drivers/soc/mediatek/Kconfig
|
||||
+++ b/drivers/soc/mediatek/Kconfig
|
||||
@@ -22,11 +22,20 @@ config MTK_PMIC_WRAP
|
||||
|
||||
config MTK_SCPSYS
|
||||
bool "MediaTek SCPSYS Support"
|
||||
- depends on ARCH_MEDIATEK || COMPILE_TEST
|
||||
- default ARM64 && ARCH_MEDIATEK
|
||||
select REGMAP
|
||||
select MTK_INFRACFG
|
||||
select PM_GENERIC_DOMAINS if PM
|
||||
help
|
||||
Say yes here to add support for the MediaTek SCPSYS power domain
|
||||
driver.
|
||||
+
|
||||
+config MTK_SCPSYS_MT8173
|
||||
+ bool "MediaTek MT8173 SCPSYS Support"
|
||||
+ depends on ARCH_MEDIATEK || COMPILE_TEST
|
||||
+ select MTK_SCPSYS
|
||||
+ default ARCH_MEDIATEK
|
||||
+ help
|
||||
+ Say yes here to add support for the MT8173 SCPSYS power domain
|
||||
+ driver.
|
||||
+ The System Control Processor System (SCPSYS) has several power
|
||||
+ management related tasks in the system.
|
||||
--- a/drivers/soc/mediatek/Makefile
|
||||
+++ b/drivers/soc/mediatek/Makefile
|
||||
@@ -1,3 +1,4 @@
|
||||
obj-$(CONFIG_MTK_INFRACFG) += mtk-infracfg.o
|
||||
obj-$(CONFIG_MTK_PMIC_WRAP) += mtk-pmic-wrap.o
|
||||
obj-$(CONFIG_MTK_SCPSYS) += mtk-scpsys.o
|
||||
+obj-$(CONFIG_MTK_SCPSYS_MT8173) += mtk-scpsys-mt8173.o
|
||||
--- /dev/null
|
||||
+++ b/drivers/soc/mediatek/mtk-scpsys-mt8173.c
|
||||
@@ -0,0 +1,179 @@
|
||||
+/*
|
||||
+ * Copyright (c) 2015 Pengutronix, Sascha Hauer <kernel@pengutronix.de>
|
||||
+ *
|
||||
+ * This program is free software; you can redistribute it and/or modify
|
||||
+ * it under the terms of the GNU General Public License version 2 as
|
||||
+ * published by the Free Software Foundation.
|
||||
+ *
|
||||
+ * This program is distributed in the hope that it will be useful,
|
||||
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
+ * GNU General Public License for more details.
|
||||
+ */
|
||||
+#include <linux/mfd/syscon.h>
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/of_device.h>
|
||||
+#include <linux/pm_domain.h>
|
||||
+#include <linux/soc/mediatek/infracfg.h>
|
||||
+#include <dt-bindings/power/mt8173-power.h>
|
||||
+
|
||||
+#include "mtk-scpsys.h"
|
||||
+
|
||||
+#define SPM_VDE_PWR_CON 0x0210
|
||||
+#define SPM_MFG_PWR_CON 0x0214
|
||||
+#define SPM_VEN_PWR_CON 0x0230
|
||||
+#define SPM_ISP_PWR_CON 0x0238
|
||||
+#define SPM_DIS_PWR_CON 0x023c
|
||||
+#define SPM_VEN2_PWR_CON 0x0298
|
||||
+#define SPM_AUDIO_PWR_CON 0x029c
|
||||
+#define SPM_MFG_2D_PWR_CON 0x02c0
|
||||
+#define SPM_MFG_ASYNC_PWR_CON 0x02c4
|
||||
+#define SPM_USB_PWR_CON 0x02cc
|
||||
+
|
||||
+#define PWR_STATUS_DISP BIT(3)
|
||||
+#define PWR_STATUS_MFG BIT(4)
|
||||
+#define PWR_STATUS_ISP BIT(5)
|
||||
+#define PWR_STATUS_VDEC BIT(7)
|
||||
+#define PWR_STATUS_VENC_LT BIT(20)
|
||||
+#define PWR_STATUS_VENC BIT(21)
|
||||
+#define PWR_STATUS_MFG_2D BIT(22)
|
||||
+#define PWR_STATUS_MFG_ASYNC BIT(23)
|
||||
+#define PWR_STATUS_AUDIO BIT(24)
|
||||
+#define PWR_STATUS_USB BIT(25)
|
||||
+
|
||||
+static const struct scp_domain_data scp_domain_data[] __initconst = {
|
||||
+ [MT8173_POWER_DOMAIN_VDEC] = {
|
||||
+ .name = "vdec",
|
||||
+ .sta_mask = PWR_STATUS_VDEC,
|
||||
+ .ctl_offs = SPM_VDE_PWR_CON,
|
||||
+ .sram_pdn_bits = GENMASK(11, 8),
|
||||
+ .sram_pdn_ack_bits = GENMASK(12, 12),
|
||||
+ .clk_id = {CLK_MM},
|
||||
+ },
|
||||
+ [MT8173_POWER_DOMAIN_VENC] = {
|
||||
+ .name = "venc",
|
||||
+ .sta_mask = PWR_STATUS_VENC,
|
||||
+ .ctl_offs = SPM_VEN_PWR_CON,
|
||||
+ .sram_pdn_bits = GENMASK(11, 8),
|
||||
+ .sram_pdn_ack_bits = GENMASK(15, 12),
|
||||
+ .clk_id = {CLK_MM, CLK_VENC},
|
||||
+ },
|
||||
+ [MT8173_POWER_DOMAIN_ISP] = {
|
||||
+ .name = "isp",
|
||||
+ .sta_mask = PWR_STATUS_ISP,
|
||||
+ .ctl_offs = SPM_ISP_PWR_CON,
|
||||
+ .sram_pdn_bits = GENMASK(11, 8),
|
||||
+ .sram_pdn_ack_bits = GENMASK(13, 12),
|
||||
+ .clk_id = {CLK_MM},
|
||||
+ },
|
||||
+ [MT8173_POWER_DOMAIN_MM] = {
|
||||
+ .name = "mm",
|
||||
+ .sta_mask = PWR_STATUS_DISP,
|
||||
+ .ctl_offs = SPM_DIS_PWR_CON,
|
||||
+ .sram_pdn_bits = GENMASK(11, 8),
|
||||
+ .sram_pdn_ack_bits = GENMASK(12, 12),
|
||||
+ .clk_id = {CLK_MM},
|
||||
+ .bus_prot_mask = MT8173_TOP_AXI_PROT_EN_MM_M0 |
|
||||
+ MT8173_TOP_AXI_PROT_EN_MM_M1,
|
||||
+ },
|
||||
+ [MT8173_POWER_DOMAIN_VENC_LT] = {
|
||||
+ .name = "venc_lt",
|
||||
+ .sta_mask = PWR_STATUS_VENC_LT,
|
||||
+ .ctl_offs = SPM_VEN2_PWR_CON,
|
||||
+ .sram_pdn_bits = GENMASK(11, 8),
|
||||
+ .sram_pdn_ack_bits = GENMASK(15, 12),
|
||||
+ .clk_id = {CLK_MM, CLK_VENC_LT},
|
||||
+ },
|
||||
+ [MT8173_POWER_DOMAIN_AUDIO] = {
|
||||
+ .name = "audio",
|
||||
+ .sta_mask = PWR_STATUS_AUDIO,
|
||||
+ .ctl_offs = SPM_AUDIO_PWR_CON,
|
||||
+ .sram_pdn_bits = GENMASK(11, 8),
|
||||
+ .sram_pdn_ack_bits = GENMASK(15, 12),
|
||||
+ .clk_id = {CLK_NONE},
|
||||
+ },
|
||||
+ [MT8173_POWER_DOMAIN_USB] = {
|
||||
+ .name = "usb",
|
||||
+ .sta_mask = PWR_STATUS_USB,
|
||||
+ .ctl_offs = SPM_USB_PWR_CON,
|
||||
+ .sram_pdn_bits = GENMASK(11, 8),
|
||||
+ .sram_pdn_ack_bits = GENMASK(15, 12),
|
||||
+ .clk_id = {CLK_NONE},
|
||||
+ .active_wakeup = true,
|
||||
+ },
|
||||
+ [MT8173_POWER_DOMAIN_MFG_ASYNC] = {
|
||||
+ .name = "mfg_async",
|
||||
+ .sta_mask = PWR_STATUS_MFG_ASYNC,
|
||||
+ .ctl_offs = SPM_MFG_ASYNC_PWR_CON,
|
||||
+ .sram_pdn_bits = GENMASK(11, 8),
|
||||
+ .sram_pdn_ack_bits = 0,
|
||||
+ .clk_id = {CLK_MFG},
|
||||
+ },
|
||||
+ [MT8173_POWER_DOMAIN_MFG_2D] = {
|
||||
+ .name = "mfg_2d",
|
||||
+ .sta_mask = PWR_STATUS_MFG_2D,
|
||||
+ .ctl_offs = SPM_MFG_2D_PWR_CON,
|
||||
+ .sram_pdn_bits = GENMASK(11, 8),
|
||||
+ .sram_pdn_ack_bits = GENMASK(13, 12),
|
||||
+ .clk_id = {CLK_NONE},
|
||||
+ },
|
||||
+ [MT8173_POWER_DOMAIN_MFG] = {
|
||||
+ .name = "mfg",
|
||||
+ .sta_mask = PWR_STATUS_MFG,
|
||||
+ .ctl_offs = SPM_MFG_PWR_CON,
|
||||
+ .sram_pdn_bits = GENMASK(13, 8),
|
||||
+ .sram_pdn_ack_bits = GENMASK(21, 16),
|
||||
+ .clk_id = {CLK_NONE},
|
||||
+ .bus_prot_mask = MT8173_TOP_AXI_PROT_EN_MFG_S |
|
||||
+ MT8173_TOP_AXI_PROT_EN_MFG_M0 |
|
||||
+ MT8173_TOP_AXI_PROT_EN_MFG_M1 |
|
||||
+ MT8173_TOP_AXI_PROT_EN_MFG_SNOOP_OUT,
|
||||
+ },
|
||||
+};
|
||||
+
|
||||
+#define NUM_DOMAINS ARRAY_SIZE(scp_domain_data)
|
||||
+
|
||||
+static int __init scpsys_probe(struct platform_device *pdev)
|
||||
+{
|
||||
+ struct scp *scp;
|
||||
+ struct genpd_onecell_data *pd_data;
|
||||
+ int ret;
|
||||
+
|
||||
+ scp = init_scp(pdev, scp_domain_data, NUM_DOMAINS);
|
||||
+ if (IS_ERR(scp))
|
||||
+ return PTR_ERR(scp);
|
||||
+
|
||||
+ mtk_register_power_domains(pdev, scp, NUM_DOMAINS);
|
||||
+
|
||||
+ pd_data = &scp->pd_data;
|
||||
+
|
||||
+ ret = pm_genpd_add_subdomain(pd_data->domains[MT8173_POWER_DOMAIN_MFG_ASYNC],
|
||||
+ pd_data->domains[MT8173_POWER_DOMAIN_MFG_2D]);
|
||||
+ if (ret && IS_ENABLED(CONFIG_PM))
|
||||
+ dev_err(&pdev->dev, "Failed to add subdomain: %d\n", ret);
|
||||
+
|
||||
+ ret = pm_genpd_add_subdomain(pd_data->domains[MT8173_POWER_DOMAIN_MFG_2D],
|
||||
+ pd_data->domains[MT8173_POWER_DOMAIN_MFG]);
|
||||
+ if (ret && IS_ENABLED(CONFIG_PM))
|
||||
+ dev_err(&pdev->dev, "Failed to add subdomain: %d\n", ret);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static const struct of_device_id of_scpsys_match_tbl[] = {
|
||||
+ {
|
||||
+ .compatible = "mediatek,mt8173-scpsys",
|
||||
+ }, {
|
||||
+ /* sentinel */
|
||||
+ }
|
||||
+};
|
||||
+
|
||||
+static struct platform_driver scpsys_drv = {
|
||||
+ .driver = {
|
||||
+ .name = "mtk-scpsys-mt8173",
|
||||
+ .owner = THIS_MODULE,
|
||||
+ .of_match_table = of_match_ptr(of_scpsys_match_tbl),
|
||||
+ },
|
||||
+};
|
||||
+
|
||||
+module_platform_driver_probe(scpsys_drv, scpsys_probe);
|
||||
--- a/drivers/soc/mediatek/mtk-scpsys.c
|
||||
+++ b/drivers/soc/mediatek/mtk-scpsys.c
|
||||
@@ -11,28 +11,14 @@
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
#include <linux/clk.h>
|
||||
-#include <linux/delay.h>
|
||||
#include <linux/io.h>
|
||||
-#include <linux/kernel.h>
|
||||
#include <linux/mfd/syscon.h>
|
||||
-#include <linux/module.h>
|
||||
-#include <linux/of_device.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/pm_domain.h>
|
||||
-#include <linux/regmap.h>
|
||||
#include <linux/soc/mediatek/infracfg.h>
|
||||
-#include <dt-bindings/power/mt8173-power.h>
|
||||
|
||||
-#define SPM_VDE_PWR_CON 0x0210
|
||||
-#define SPM_MFG_PWR_CON 0x0214
|
||||
-#define SPM_VEN_PWR_CON 0x0230
|
||||
-#define SPM_ISP_PWR_CON 0x0238
|
||||
-#define SPM_DIS_PWR_CON 0x023c
|
||||
-#define SPM_VEN2_PWR_CON 0x0298
|
||||
-#define SPM_AUDIO_PWR_CON 0x029c
|
||||
-#define SPM_MFG_2D_PWR_CON 0x02c0
|
||||
-#define SPM_MFG_ASYNC_PWR_CON 0x02c4
|
||||
-#define SPM_USB_PWR_CON 0x02cc
|
||||
+#include "mtk-scpsys.h"
|
||||
+
|
||||
#define SPM_PWR_STATUS 0x060c
|
||||
#define SPM_PWR_STATUS_2ND 0x0610
|
||||
|
||||
@@ -42,153 +28,6 @@
|
||||
#define PWR_ON_2ND_BIT BIT(3)
|
||||
#define PWR_CLK_DIS_BIT BIT(4)
|
||||
|
||||
-#define PWR_STATUS_DISP BIT(3)
|
||||
-#define PWR_STATUS_MFG BIT(4)
|
||||
-#define PWR_STATUS_ISP BIT(5)
|
||||
-#define PWR_STATUS_VDEC BIT(7)
|
||||
-#define PWR_STATUS_VENC_LT BIT(20)
|
||||
-#define PWR_STATUS_VENC BIT(21)
|
||||
-#define PWR_STATUS_MFG_2D BIT(22)
|
||||
-#define PWR_STATUS_MFG_ASYNC BIT(23)
|
||||
-#define PWR_STATUS_AUDIO BIT(24)
|
||||
-#define PWR_STATUS_USB BIT(25)
|
||||
-
|
||||
-enum clk_id {
|
||||
- MT8173_CLK_NONE,
|
||||
- MT8173_CLK_MM,
|
||||
- MT8173_CLK_MFG,
|
||||
- MT8173_CLK_VENC,
|
||||
- MT8173_CLK_VENC_LT,
|
||||
- MT8173_CLK_MAX,
|
||||
-};
|
||||
-
|
||||
-#define MAX_CLKS 2
|
||||
-
|
||||
-struct scp_domain_data {
|
||||
- const char *name;
|
||||
- u32 sta_mask;
|
||||
- int ctl_offs;
|
||||
- u32 sram_pdn_bits;
|
||||
- u32 sram_pdn_ack_bits;
|
||||
- u32 bus_prot_mask;
|
||||
- enum clk_id clk_id[MAX_CLKS];
|
||||
- bool active_wakeup;
|
||||
-};
|
||||
-
|
||||
-static const struct scp_domain_data scp_domain_data[] __initconst = {
|
||||
- [MT8173_POWER_DOMAIN_VDEC] = {
|
||||
- .name = "vdec",
|
||||
- .sta_mask = PWR_STATUS_VDEC,
|
||||
- .ctl_offs = SPM_VDE_PWR_CON,
|
||||
- .sram_pdn_bits = GENMASK(11, 8),
|
||||
- .sram_pdn_ack_bits = GENMASK(12, 12),
|
||||
- .clk_id = {MT8173_CLK_MM},
|
||||
- },
|
||||
- [MT8173_POWER_DOMAIN_VENC] = {
|
||||
- .name = "venc",
|
||||
- .sta_mask = PWR_STATUS_VENC,
|
||||
- .ctl_offs = SPM_VEN_PWR_CON,
|
||||
- .sram_pdn_bits = GENMASK(11, 8),
|
||||
- .sram_pdn_ack_bits = GENMASK(15, 12),
|
||||
- .clk_id = {MT8173_CLK_MM, MT8173_CLK_VENC},
|
||||
- },
|
||||
- [MT8173_POWER_DOMAIN_ISP] = {
|
||||
- .name = "isp",
|
||||
- .sta_mask = PWR_STATUS_ISP,
|
||||
- .ctl_offs = SPM_ISP_PWR_CON,
|
||||
- .sram_pdn_bits = GENMASK(11, 8),
|
||||
- .sram_pdn_ack_bits = GENMASK(13, 12),
|
||||
- .clk_id = {MT8173_CLK_MM},
|
||||
- },
|
||||
- [MT8173_POWER_DOMAIN_MM] = {
|
||||
- .name = "mm",
|
||||
- .sta_mask = PWR_STATUS_DISP,
|
||||
- .ctl_offs = SPM_DIS_PWR_CON,
|
||||
- .sram_pdn_bits = GENMASK(11, 8),
|
||||
- .sram_pdn_ack_bits = GENMASK(12, 12),
|
||||
- .clk_id = {MT8173_CLK_MM},
|
||||
- .bus_prot_mask = MT8173_TOP_AXI_PROT_EN_MM_M0 |
|
||||
- MT8173_TOP_AXI_PROT_EN_MM_M1,
|
||||
- },
|
||||
- [MT8173_POWER_DOMAIN_VENC_LT] = {
|
||||
- .name = "venc_lt",
|
||||
- .sta_mask = PWR_STATUS_VENC_LT,
|
||||
- .ctl_offs = SPM_VEN2_PWR_CON,
|
||||
- .sram_pdn_bits = GENMASK(11, 8),
|
||||
- .sram_pdn_ack_bits = GENMASK(15, 12),
|
||||
- .clk_id = {MT8173_CLK_MM, MT8173_CLK_VENC_LT},
|
||||
- },
|
||||
- [MT8173_POWER_DOMAIN_AUDIO] = {
|
||||
- .name = "audio",
|
||||
- .sta_mask = PWR_STATUS_AUDIO,
|
||||
- .ctl_offs = SPM_AUDIO_PWR_CON,
|
||||
- .sram_pdn_bits = GENMASK(11, 8),
|
||||
- .sram_pdn_ack_bits = GENMASK(15, 12),
|
||||
- .clk_id = {MT8173_CLK_NONE},
|
||||
- },
|
||||
- [MT8173_POWER_DOMAIN_USB] = {
|
||||
- .name = "usb",
|
||||
- .sta_mask = PWR_STATUS_USB,
|
||||
- .ctl_offs = SPM_USB_PWR_CON,
|
||||
- .sram_pdn_bits = GENMASK(11, 8),
|
||||
- .sram_pdn_ack_bits = GENMASK(15, 12),
|
||||
- .clk_id = {MT8173_CLK_NONE},
|
||||
- .active_wakeup = true,
|
||||
- },
|
||||
- [MT8173_POWER_DOMAIN_MFG_ASYNC] = {
|
||||
- .name = "mfg_async",
|
||||
- .sta_mask = PWR_STATUS_MFG_ASYNC,
|
||||
- .ctl_offs = SPM_MFG_ASYNC_PWR_CON,
|
||||
- .sram_pdn_bits = GENMASK(11, 8),
|
||||
- .sram_pdn_ack_bits = 0,
|
||||
- .clk_id = {MT8173_CLK_MFG},
|
||||
- },
|
||||
- [MT8173_POWER_DOMAIN_MFG_2D] = {
|
||||
- .name = "mfg_2d",
|
||||
- .sta_mask = PWR_STATUS_MFG_2D,
|
||||
- .ctl_offs = SPM_MFG_2D_PWR_CON,
|
||||
- .sram_pdn_bits = GENMASK(11, 8),
|
||||
- .sram_pdn_ack_bits = GENMASK(13, 12),
|
||||
- .clk_id = {MT8173_CLK_NONE},
|
||||
- },
|
||||
- [MT8173_POWER_DOMAIN_MFG] = {
|
||||
- .name = "mfg",
|
||||
- .sta_mask = PWR_STATUS_MFG,
|
||||
- .ctl_offs = SPM_MFG_PWR_CON,
|
||||
- .sram_pdn_bits = GENMASK(13, 8),
|
||||
- .sram_pdn_ack_bits = GENMASK(21, 16),
|
||||
- .clk_id = {MT8173_CLK_NONE},
|
||||
- .bus_prot_mask = MT8173_TOP_AXI_PROT_EN_MFG_S |
|
||||
- MT8173_TOP_AXI_PROT_EN_MFG_M0 |
|
||||
- MT8173_TOP_AXI_PROT_EN_MFG_M1 |
|
||||
- MT8173_TOP_AXI_PROT_EN_MFG_SNOOP_OUT,
|
||||
- },
|
||||
-};
|
||||
-
|
||||
-#define NUM_DOMAINS ARRAY_SIZE(scp_domain_data)
|
||||
-
|
||||
-struct scp;
|
||||
-
|
||||
-struct scp_domain {
|
||||
- struct generic_pm_domain genpd;
|
||||
- struct scp *scp;
|
||||
- struct clk *clk[MAX_CLKS];
|
||||
- u32 sta_mask;
|
||||
- void __iomem *ctl_addr;
|
||||
- u32 sram_pdn_bits;
|
||||
- u32 sram_pdn_ack_bits;
|
||||
- u32 bus_prot_mask;
|
||||
- bool active_wakeup;
|
||||
-};
|
||||
-
|
||||
-struct scp {
|
||||
- struct scp_domain domains[NUM_DOMAINS];
|
||||
- struct genpd_onecell_data pd_data;
|
||||
- struct device *dev;
|
||||
- void __iomem *base;
|
||||
- struct regmap *infracfg;
|
||||
-};
|
||||
-
|
||||
static int scpsys_domain_is_on(struct scp_domain *scpd)
|
||||
{
|
||||
struct scp *scp = scpd->scp;
|
||||
@@ -398,63 +237,89 @@ static bool scpsys_active_wakeup(struct
|
||||
return scpd->active_wakeup;
|
||||
}
|
||||
|
||||
-static int __init scpsys_probe(struct platform_device *pdev)
|
||||
+static void init_clks(struct platform_device *pdev, struct clk *clk[CLK_MAX])
|
||||
+{
|
||||
+ enum clk_id clk_ids[] = {
|
||||
+ CLK_MM,
|
||||
+ CLK_MFG,
|
||||
+ CLK_VENC,
|
||||
+ CLK_VENC_LT
|
||||
+ };
|
||||
+
|
||||
+ static const char * const clk_names[] = {
|
||||
+ "mm",
|
||||
+ "mfg",
|
||||
+ "venc",
|
||||
+ "venc_lt",
|
||||
+ };
|
||||
+
|
||||
+ int i;
|
||||
+
|
||||
+ for (i = 0; i < ARRAY_SIZE(clk_ids); i++)
|
||||
+ clk[clk_ids[i]] = devm_clk_get(&pdev->dev, clk_names[i]);
|
||||
+}
|
||||
+
|
||||
+struct scp *init_scp(struct platform_device *pdev,
|
||||
+ const struct scp_domain_data *scp_domain_data, int num)
|
||||
{
|
||||
struct genpd_onecell_data *pd_data;
|
||||
struct resource *res;
|
||||
- int i, j, ret;
|
||||
+ int i, j;
|
||||
struct scp *scp;
|
||||
- struct clk *clk[MT8173_CLK_MAX];
|
||||
+ struct clk *clk[CLK_MAX];
|
||||
|
||||
scp = devm_kzalloc(&pdev->dev, sizeof(*scp), GFP_KERNEL);
|
||||
if (!scp)
|
||||
- return -ENOMEM;
|
||||
+ return ERR_PTR(-ENOMEM);
|
||||
|
||||
scp->dev = &pdev->dev;
|
||||
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
scp->base = devm_ioremap_resource(&pdev->dev, res);
|
||||
if (IS_ERR(scp->base))
|
||||
- return PTR_ERR(scp->base);
|
||||
-
|
||||
- pd_data = &scp->pd_data;
|
||||
-
|
||||
- pd_data->domains = devm_kzalloc(&pdev->dev,
|
||||
- sizeof(*pd_data->domains) * NUM_DOMAINS, GFP_KERNEL);
|
||||
- if (!pd_data->domains)
|
||||
- return -ENOMEM;
|
||||
-
|
||||
- clk[MT8173_CLK_MM] = devm_clk_get(&pdev->dev, "mm");
|
||||
- if (IS_ERR(clk[MT8173_CLK_MM]))
|
||||
- return PTR_ERR(clk[MT8173_CLK_MM]);
|
||||
-
|
||||
- clk[MT8173_CLK_MFG] = devm_clk_get(&pdev->dev, "mfg");
|
||||
- if (IS_ERR(clk[MT8173_CLK_MFG]))
|
||||
- return PTR_ERR(clk[MT8173_CLK_MFG]);
|
||||
-
|
||||
- clk[MT8173_CLK_VENC] = devm_clk_get(&pdev->dev, "venc");
|
||||
- if (IS_ERR(clk[MT8173_CLK_VENC]))
|
||||
- return PTR_ERR(clk[MT8173_CLK_VENC]);
|
||||
-
|
||||
- clk[MT8173_CLK_VENC_LT] = devm_clk_get(&pdev->dev, "venc_lt");
|
||||
- if (IS_ERR(clk[MT8173_CLK_VENC_LT]))
|
||||
- return PTR_ERR(clk[MT8173_CLK_VENC_LT]);
|
||||
+ return ERR_CAST(scp->base);
|
||||
|
||||
scp->infracfg = syscon_regmap_lookup_by_phandle(pdev->dev.of_node,
|
||||
"infracfg");
|
||||
if (IS_ERR(scp->infracfg)) {
|
||||
dev_err(&pdev->dev, "Cannot find infracfg controller: %ld\n",
|
||||
PTR_ERR(scp->infracfg));
|
||||
- return PTR_ERR(scp->infracfg);
|
||||
+ return ERR_CAST(scp->infracfg);
|
||||
}
|
||||
|
||||
- pd_data->num_domains = NUM_DOMAINS;
|
||||
+ scp->domains = devm_kzalloc(&pdev->dev,
|
||||
+ sizeof(*scp->domains) * num, GFP_KERNEL);
|
||||
+ if (!scp->domains)
|
||||
+ return ERR_PTR(-ENOMEM);
|
||||
+
|
||||
+ pd_data = &scp->pd_data;
|
||||
|
||||
- for (i = 0; i < NUM_DOMAINS; i++) {
|
||||
+ pd_data->domains = devm_kzalloc(&pdev->dev,
|
||||
+ sizeof(*pd_data->domains) * num, GFP_KERNEL);
|
||||
+ if (!pd_data->domains)
|
||||
+ return ERR_PTR(-ENOMEM);
|
||||
+
|
||||
+ pd_data->num_domains = num;
|
||||
+
|
||||
+ init_clks(pdev, clk);
|
||||
+
|
||||
+ for (i = 0; i < num; i++) {
|
||||
struct scp_domain *scpd = &scp->domains[i];
|
||||
struct generic_pm_domain *genpd = &scpd->genpd;
|
||||
const struct scp_domain_data *data = &scp_domain_data[i];
|
||||
|
||||
+ for (j = 0; j < MAX_CLKS && data->clk_id[j]; j++) {
|
||||
+ struct clk *c = clk[data->clk_id[j]];
|
||||
+
|
||||
+ if (IS_ERR(c)) {
|
||||
+ dev_err(&pdev->dev, "%s: clk unavailable\n",
|
||||
+ data->name);
|
||||
+ return ERR_CAST(c);
|
||||
+ }
|
||||
+
|
||||
+ scpd->clk[j] = c;
|
||||
+ }
|
||||
+
|
||||
pd_data->domains[i] = genpd;
|
||||
scpd->scp = scp;
|
||||
|
||||
@@ -464,13 +329,25 @@ static int __init scpsys_probe(struct pl
|
||||
scpd->sram_pdn_ack_bits = data->sram_pdn_ack_bits;
|
||||
scpd->bus_prot_mask = data->bus_prot_mask;
|
||||
scpd->active_wakeup = data->active_wakeup;
|
||||
- for (j = 0; j < MAX_CLKS && data->clk_id[j]; j++)
|
||||
- scpd->clk[j] = clk[data->clk_id[j]];
|
||||
|
||||
genpd->name = data->name;
|
||||
genpd->power_off = scpsys_power_off;
|
||||
genpd->power_on = scpsys_power_on;
|
||||
genpd->dev_ops.active_wakeup = scpsys_active_wakeup;
|
||||
+ }
|
||||
+
|
||||
+ return scp;
|
||||
+}
|
||||
+
|
||||
+void mtk_register_power_domains(struct platform_device *pdev,
|
||||
+ struct scp *scp, int num)
|
||||
+{
|
||||
+ struct genpd_onecell_data *pd_data;
|
||||
+ int i, ret;
|
||||
+
|
||||
+ for (i = 0; i < num; i++) {
|
||||
+ struct scp_domain *scpd = &scp->domains[i];
|
||||
+ struct generic_pm_domain *genpd = &scpd->genpd;
|
||||
|
||||
/*
|
||||
* Initially turn on all domains to make the domains usable
|
||||
@@ -489,37 +366,9 @@ static int __init scpsys_probe(struct pl
|
||||
* valid.
|
||||
*/
|
||||
|
||||
- ret = pm_genpd_add_subdomain(pd_data->domains[MT8173_POWER_DOMAIN_MFG_ASYNC],
|
||||
- pd_data->domains[MT8173_POWER_DOMAIN_MFG_2D]);
|
||||
- if (ret && IS_ENABLED(CONFIG_PM))
|
||||
- dev_err(&pdev->dev, "Failed to add subdomain: %d\n", ret);
|
||||
-
|
||||
- ret = pm_genpd_add_subdomain(pd_data->domains[MT8173_POWER_DOMAIN_MFG_2D],
|
||||
- pd_data->domains[MT8173_POWER_DOMAIN_MFG]);
|
||||
- if (ret && IS_ENABLED(CONFIG_PM))
|
||||
- dev_err(&pdev->dev, "Failed to add subdomain: %d\n", ret);
|
||||
+ pd_data = &scp->pd_data;
|
||||
|
||||
ret = of_genpd_add_provider_onecell(pdev->dev.of_node, pd_data);
|
||||
if (ret)
|
||||
dev_err(&pdev->dev, "Failed to add OF provider: %d\n", ret);
|
||||
-
|
||||
- return 0;
|
||||
}
|
||||
-
|
||||
-static const struct of_device_id of_scpsys_match_tbl[] = {
|
||||
- {
|
||||
- .compatible = "mediatek,mt8173-scpsys",
|
||||
- }, {
|
||||
- /* sentinel */
|
||||
- }
|
||||
-};
|
||||
-
|
||||
-static struct platform_driver scpsys_drv = {
|
||||
- .driver = {
|
||||
- .name = "mtk-scpsys",
|
||||
- .owner = THIS_MODULE,
|
||||
- .of_match_table = of_match_ptr(of_scpsys_match_tbl),
|
||||
- },
|
||||
-};
|
||||
-
|
||||
-module_platform_driver_probe(scpsys_drv, scpsys_probe);
|
||||
--- /dev/null
|
||||
+++ b/drivers/soc/mediatek/mtk-scpsys.h
|
||||
@@ -0,0 +1,54 @@
|
||||
+#ifndef __DRV_SOC_MTK_H
|
||||
+#define __DRV_SOC_MTK_H
|
||||
+
|
||||
+enum clk_id {
|
||||
+ CLK_NONE,
|
||||
+ CLK_MM,
|
||||
+ CLK_MFG,
|
||||
+ CLK_VENC,
|
||||
+ CLK_VENC_LT,
|
||||
+ CLK_MAX,
|
||||
+};
|
||||
+
|
||||
+#define MAX_CLKS 2
|
||||
+
|
||||
+struct scp_domain_data {
|
||||
+ const char *name;
|
||||
+ u32 sta_mask;
|
||||
+ int ctl_offs;
|
||||
+ u32 sram_pdn_bits;
|
||||
+ u32 sram_pdn_ack_bits;
|
||||
+ u32 bus_prot_mask;
|
||||
+ enum clk_id clk_id[MAX_CLKS];
|
||||
+ bool active_wakeup;
|
||||
+};
|
||||
+
|
||||
+struct scp;
|
||||
+
|
||||
+struct scp_domain {
|
||||
+ struct generic_pm_domain genpd;
|
||||
+ struct scp *scp;
|
||||
+ struct clk *clk[MAX_CLKS];
|
||||
+ u32 sta_mask;
|
||||
+ void __iomem *ctl_addr;
|
||||
+ u32 sram_pdn_bits;
|
||||
+ u32 sram_pdn_ack_bits;
|
||||
+ u32 bus_prot_mask;
|
||||
+ bool active_wakeup;
|
||||
+};
|
||||
+
|
||||
+struct scp {
|
||||
+ struct scp_domain *domains;
|
||||
+ struct genpd_onecell_data pd_data;
|
||||
+ struct device *dev;
|
||||
+ void __iomem *base;
|
||||
+ struct regmap *infracfg;
|
||||
+};
|
||||
+
|
||||
+struct scp *init_scp(struct platform_device *pdev,
|
||||
+ const struct scp_domain_data *scp_domain_data, int num);
|
||||
+
|
||||
+void mtk_register_power_domains(struct platform_device *pdev,
|
||||
+ struct scp *scp, int num);
|
||||
+
|
||||
+#endif /* __DRV_SOC_MTK_H */
|
|
@ -1,33 +0,0 @@
|
|||
From 6f87948c3a58f02f6a64eadda719317016739d5e Mon Sep 17 00:00:00 2001
|
||||
From: James Liao <jamesjj.liao@mediatek.com>
|
||||
Date: Wed, 30 Dec 2015 14:41:44 +0800
|
||||
Subject: [PATCH 003/102] soc: mediatek: Init MT8173 scpsys driver earlier
|
||||
|
||||
Some power domain comsumers may init before module_init.
|
||||
So the power domain provider (scpsys) need to be initialized
|
||||
earlier too.
|
||||
|
||||
Signed-off-by: James Liao <jamesjj.liao@mediatek.com>
|
||||
---
|
||||
drivers/soc/mediatek/mtk-scpsys-mt8173.c | 13 ++++++++++++-
|
||||
1 file changed, 12 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/soc/mediatek/mtk-scpsys-mt8173.c
|
||||
+++ b/drivers/soc/mediatek/mtk-scpsys-mt8173.c
|
||||
@@ -176,4 +176,15 @@ static struct platform_driver scpsys_drv
|
||||
},
|
||||
};
|
||||
|
||||
-module_platform_driver_probe(scpsys_drv, scpsys_probe);
|
||||
+static int __init scpsys_drv_init(void)
|
||||
+{
|
||||
+ return platform_driver_probe(&scpsys_drv, scpsys_probe);
|
||||
+}
|
||||
+
|
||||
+static void __exit scpsys_drv_exit(void)
|
||||
+{
|
||||
+ platform_driver_unregister(&scpsys_drv);
|
||||
+}
|
||||
+
|
||||
+subsys_initcall(scpsys_drv_init);
|
||||
+module_exit(scpsys_drv_exit);
|
|
@ -1,204 +0,0 @@
|
|||
From 8aa49d107d8a22fd6cbf37174614baf32d0976e2 Mon Sep 17 00:00:00 2001
|
||||
From: Shunli Wang <shunli.wang@mediatek.com>
|
||||
Date: Wed, 30 Dec 2015 14:41:46 +0800
|
||||
Subject: [PATCH 005/102] soc: mediatek: Add MT2701/MT7623 scpsys driver
|
||||
|
||||
Add scpsys driver for MT2701 and MT7623.
|
||||
|
||||
Signed-off-by: Shunli Wang <shunli.wang@mediatek.com>
|
||||
Signed-off-by: James Liao <jamesjj.liao@mediatek.com>
|
||||
---
|
||||
drivers/soc/mediatek/Kconfig | 11 ++
|
||||
drivers/soc/mediatek/Makefile | 1 +
|
||||
drivers/soc/mediatek/mtk-scpsys-mt2701.c | 161 ++++++++++++++++++++++++++++++
|
||||
3 files changed, 173 insertions(+)
|
||||
create mode 100644 drivers/soc/mediatek/mtk-scpsys-mt2701.c
|
||||
|
||||
--- a/drivers/soc/mediatek/Kconfig
|
||||
+++ b/drivers/soc/mediatek/Kconfig
|
||||
@@ -39,3 +39,14 @@ config MTK_SCPSYS_MT8173
|
||||
driver.
|
||||
The System Control Processor System (SCPSYS) has several power
|
||||
management related tasks in the system.
|
||||
+
|
||||
+config MTK_SCPSYS_MT2701
|
||||
+ bool "SCPSYS Support MediaTek MT2701 and MT7623"
|
||||
+ depends on ARCH_MEDIATEK || COMPILE_TEST
|
||||
+ select MTK_SCPSYS
|
||||
+ default ARCH_MEDIATEK
|
||||
+ help
|
||||
+ Say yes here to add support for the MT2701/MT7623 SCPSYS power
|
||||
+ domain driver.
|
||||
+ The System Control Processor System (SCPSYS) has several power
|
||||
+ management related tasks in the system.
|
||||
--- a/drivers/soc/mediatek/Makefile
|
||||
+++ b/drivers/soc/mediatek/Makefile
|
||||
@@ -2,3 +2,4 @@ obj-$(CONFIG_MTK_INFRACFG) += mtk-infrac
|
||||
obj-$(CONFIG_MTK_PMIC_WRAP) += mtk-pmic-wrap.o
|
||||
obj-$(CONFIG_MTK_SCPSYS) += mtk-scpsys.o
|
||||
obj-$(CONFIG_MTK_SCPSYS_MT8173) += mtk-scpsys-mt8173.o
|
||||
+obj-$(CONFIG_MTK_SCPSYS_MT2701) += mtk-scpsys-mt2701.o
|
||||
--- /dev/null
|
||||
+++ b/drivers/soc/mediatek/mtk-scpsys-mt2701.c
|
||||
@@ -0,0 +1,161 @@
|
||||
+/*
|
||||
+ * Copyright (c) 2015 Mediatek, Shunli Wang <shunli.wang@mediatek.com>
|
||||
+ *
|
||||
+ * This program is free software; you can redistribute it and/or modify
|
||||
+ * it under the terms of the GNU General Public License version 2 as
|
||||
+ * published by the Free Software Foundation.
|
||||
+ *
|
||||
+ * This program is distributed in the hope that it will be useful,
|
||||
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
+ * GNU General Public License for more details.
|
||||
+ */
|
||||
+#include <linux/mfd/syscon.h>
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/of_device.h>
|
||||
+#include <linux/pm_domain.h>
|
||||
+#include <linux/soc/mediatek/infracfg.h>
|
||||
+#include <dt-bindings/power/mt2701-power.h>
|
||||
+
|
||||
+#include "mtk-scpsys.h"
|
||||
+
|
||||
+#define SPM_VDE_PWR_CON 0x0210
|
||||
+#define SPM_MFG_PWR_CON 0x0214
|
||||
+#define SPM_ISP_PWR_CON 0x0238
|
||||
+#define SPM_DIS_PWR_CON 0x023C
|
||||
+#define SPM_CONN_PWR_CON 0x0280
|
||||
+#define SPM_BDP_PWR_CON 0x029C
|
||||
+#define SPM_ETH_PWR_CON 0x02A0
|
||||
+#define SPM_HIF_PWR_CON 0x02A4
|
||||
+#define SPM_IFR_MSC_PWR_CON 0x02A8
|
||||
+#define SPM_PWR_STATUS 0x060c
|
||||
+#define SPM_PWR_STATUS_2ND 0x0610
|
||||
+
|
||||
+#define CONN_PWR_STA_MASK BIT(1)
|
||||
+#define DIS_PWR_STA_MASK BIT(3)
|
||||
+#define MFG_PWR_STA_MASK BIT(4)
|
||||
+#define ISP_PWR_STA_MASK BIT(5)
|
||||
+#define VDE_PWR_STA_MASK BIT(7)
|
||||
+#define BDP_PWR_STA_MASK BIT(14)
|
||||
+#define ETH_PWR_STA_MASK BIT(15)
|
||||
+#define HIF_PWR_STA_MASK BIT(16)
|
||||
+#define IFR_MSC_PWR_STA_MASK BIT(17)
|
||||
+
|
||||
+#define MT2701_TOP_AXI_PROT_EN_CONN 0x0104
|
||||
+#define MT2701_TOP_AXI_PROT_EN_DISP 0x0002
|
||||
+
|
||||
+static const struct scp_domain_data scp_domain_data[] = {
|
||||
+ [MT2701_POWER_DOMAIN_CONN] = {
|
||||
+ .name = "conn",
|
||||
+ .sta_mask = CONN_PWR_STA_MASK,
|
||||
+ .ctl_offs = SPM_CONN_PWR_CON,
|
||||
+ .bus_prot_mask = MT2701_TOP_AXI_PROT_EN_CONN,
|
||||
+ .active_wakeup = true,
|
||||
+ },
|
||||
+ [MT2701_POWER_DOMAIN_DISP] = {
|
||||
+ .name = "disp",
|
||||
+ .sta_mask = DIS_PWR_STA_MASK,
|
||||
+ .ctl_offs = SPM_DIS_PWR_CON,
|
||||
+ .sram_pdn_bits = GENMASK(11, 8),
|
||||
+ .clk_id = {CLK_MM},
|
||||
+ .bus_prot_mask = MT2701_TOP_AXI_PROT_EN_DISP,
|
||||
+ .active_wakeup = true,
|
||||
+ },
|
||||
+ [MT2701_POWER_DOMAIN_MFG] = {
|
||||
+ .name = "mfg",
|
||||
+ .sta_mask = MFG_PWR_STA_MASK,
|
||||
+ .ctl_offs = SPM_MFG_PWR_CON,
|
||||
+ .sram_pdn_bits = GENMASK(11, 8),
|
||||
+ .sram_pdn_ack_bits = GENMASK(12, 12),
|
||||
+ .active_wakeup = true,
|
||||
+ },
|
||||
+ [MT2701_POWER_DOMAIN_VDEC] = {
|
||||
+ .name = "vdec",
|
||||
+ .sta_mask = VDE_PWR_STA_MASK,
|
||||
+ .ctl_offs = SPM_VDE_PWR_CON,
|
||||
+ .sram_pdn_bits = GENMASK(11, 8),
|
||||
+ .sram_pdn_ack_bits = GENMASK(12, 12),
|
||||
+ .clk_id = {CLK_MM},
|
||||
+ .active_wakeup = true,
|
||||
+ },
|
||||
+ [MT2701_POWER_DOMAIN_ISP] = {
|
||||
+ .name = "isp",
|
||||
+ .sta_mask = ISP_PWR_STA_MASK,
|
||||
+ .ctl_offs = SPM_ISP_PWR_CON,
|
||||
+ .sram_pdn_bits = GENMASK(11, 8),
|
||||
+ .sram_pdn_ack_bits = GENMASK(13, 12),
|
||||
+ .active_wakeup = true,
|
||||
+ },
|
||||
+ [MT2701_POWER_DOMAIN_BDP] = {
|
||||
+ .name = "bdp",
|
||||
+ .sta_mask = BDP_PWR_STA_MASK,
|
||||
+ .ctl_offs = SPM_BDP_PWR_CON,
|
||||
+ .sram_pdn_bits = GENMASK(11, 8),
|
||||
+ .active_wakeup = true,
|
||||
+ },
|
||||
+ [MT2701_POWER_DOMAIN_ETH] = {
|
||||
+ .name = "eth",
|
||||
+ .sta_mask = ETH_PWR_STA_MASK,
|
||||
+ .ctl_offs = SPM_ETH_PWR_CON,
|
||||
+ .sram_pdn_bits = GENMASK(11, 8),
|
||||
+ .sram_pdn_ack_bits = GENMASK(15, 12),
|
||||
+ .active_wakeup = true,
|
||||
+ },
|
||||
+ [MT2701_POWER_DOMAIN_HIF] = {
|
||||
+ .name = "hif",
|
||||
+ .sta_mask = HIF_PWR_STA_MASK,
|
||||
+ .ctl_offs = SPM_HIF_PWR_CON,
|
||||
+ .sram_pdn_bits = GENMASK(11, 8),
|
||||
+ .sram_pdn_ack_bits = GENMASK(15, 12),
|
||||
+ .active_wakeup = true,
|
||||
+ },
|
||||
+ [MT2701_POWER_DOMAIN_IFR_MSC] = {
|
||||
+ .name = "ifr_msc",
|
||||
+ .sta_mask = IFR_MSC_PWR_STA_MASK,
|
||||
+ .ctl_offs = SPM_IFR_MSC_PWR_CON,
|
||||
+ .active_wakeup = true,
|
||||
+ },
|
||||
+};
|
||||
+
|
||||
+#define NUM_DOMAINS ARRAY_SIZE(scp_domain_data)
|
||||
+
|
||||
+static int __init scpsys_probe(struct platform_device *pdev)
|
||||
+{
|
||||
+ struct scp *scp;
|
||||
+
|
||||
+ scp = init_scp(pdev, scp_domain_data, NUM_DOMAINS);
|
||||
+ if (IS_ERR(scp))
|
||||
+ return PTR_ERR(scp);
|
||||
+
|
||||
+ mtk_register_power_domains(pdev, scp, NUM_DOMAINS);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static const struct of_device_id of_scpsys_match_tbl[] = {
|
||||
+ {
|
||||
+ .compatible = "mediatek,mt2701-scpsys",
|
||||
+ }, {
|
||||
+ /* sentinel */
|
||||
+ }
|
||||
+};
|
||||
+MODULE_DEVICE_TABLE(of, of_scpsys_match_tbl);
|
||||
+
|
||||
+static struct platform_driver scpsys_drv = {
|
||||
+ .driver = {
|
||||
+ .name = "mtk-scpsys-mt2701",
|
||||
+ .owner = THIS_MODULE,
|
||||
+ .of_match_table = of_match_ptr(of_scpsys_match_tbl),
|
||||
+ },
|
||||
+ .probe = scpsys_probe,
|
||||
+};
|
||||
+
|
||||
+static int __init scpsys_init(void)
|
||||
+{
|
||||
+ return platform_driver_register(&scpsys_drv);
|
||||
+}
|
||||
+
|
||||
+subsys_initcall(scpsys_init);
|
||||
+
|
||||
+MODULE_DESCRIPTION("MediaTek MT2701 scpsys driver");
|
||||
+MODULE_LICENSE("GPL v2");
|
|
@ -1,61 +0,0 @@
|
|||
From 69d4e250847f82a5896c41bcb5f1e793c5a8fbac Mon Sep 17 00:00:00 2001
|
||||
From: James Liao <jamesjj.liao@mediatek.com>
|
||||
Date: Tue, 5 Jan 2016 14:30:17 +0800
|
||||
Subject: [PATCH 006/102] clk: mediatek: Refine the makefile to support
|
||||
multiple clock drivers
|
||||
|
||||
Add a Kconfig to define clock configuration for each SoC, and
|
||||
modify the Makefile to build drivers that only selected in config.
|
||||
|
||||
Signed-off-by: Shunli Wang <shunli.wang@mediatek.com>
|
||||
Signed-off-by: James Liao <jamesjj.liao@mediatek.com>
|
||||
---
|
||||
drivers/clk/Kconfig | 1 +
|
||||
drivers/clk/mediatek/Kconfig | 23 +++++++++++++++++++++++
|
||||
drivers/clk/mediatek/Makefile | 6 +++---
|
||||
3 files changed, 27 insertions(+), 3 deletions(-)
|
||||
create mode 100644 drivers/clk/mediatek/Kconfig
|
||||
|
||||
--- a/drivers/clk/Kconfig
|
||||
+++ b/drivers/clk/Kconfig
|
||||
@@ -198,3 +198,4 @@ source "drivers/clk/mvebu/Kconfig"
|
||||
|
||||
source "drivers/clk/samsung/Kconfig"
|
||||
source "drivers/clk/tegra/Kconfig"
|
||||
+source "drivers/clk/mediatek/Kconfig"
|
||||
--- /dev/null
|
||||
+++ b/drivers/clk/mediatek/Kconfig
|
||||
@@ -0,0 +1,23 @@
|
||||
+#
|
||||
+# MediaTek SoC drivers
|
||||
+#
|
||||
+config COMMON_CLK_MEDIATEK
|
||||
+ bool
|
||||
+ ---help---
|
||||
+ Mediatek SoCs' clock support.
|
||||
+
|
||||
+config COMMON_CLK_MT8135
|
||||
+ bool "Clock driver for Mediatek MT8135"
|
||||
+ depends on COMMON_CLK
|
||||
+ select COMMON_CLK_MEDIATEK
|
||||
+ default ARCH_MEDIATEK
|
||||
+ ---help---
|
||||
+ This driver supports Mediatek MT8135 clocks.
|
||||
+
|
||||
+config COMMON_CLK_MT8173
|
||||
+ bool "Clock driver for Mediatek MT8173"
|
||||
+ depends on COMMON_CLK
|
||||
+ select COMMON_CLK_MEDIATEK
|
||||
+ default ARCH_MEDIATEK
|
||||
+ ---help---
|
||||
+ This driver supports Mediatek MT8173 clocks.
|
||||
--- a/drivers/clk/mediatek/Makefile
|
||||
+++ b/drivers/clk/mediatek/Makefile
|
||||
@@ -1,4 +1,4 @@
|
||||
-obj-y += clk-mtk.o clk-pll.o clk-gate.o clk-apmixed.o
|
||||
+obj-$(CONFIG_COMMON_CLK_MEDIATEK) += clk-mtk.o clk-pll.o clk-gate.o clk-apmixed.o
|
||||
obj-$(CONFIG_RESET_CONTROLLER) += reset.o
|
||||
-obj-y += clk-mt8135.o
|
||||
-obj-y += clk-mt8173.o
|
||||
+obj-$(CONFIG_COMMON_CLK_MT8135) += clk-mt8135.o
|
||||
+obj-$(CONFIG_COMMON_CLK_MT8173) += clk-mt8173.o
|
|
@ -1,172 +0,0 @@
|
|||
From 7c98b20fa68a2a64bca69822eb7be4fa9b668fab Mon Sep 17 00:00:00 2001
|
||||
From: James Liao <jamesjj.liao@mediatek.com>
|
||||
Date: Tue, 5 Jan 2016 14:30:18 +0800
|
||||
Subject: [PATCH 007/102] dt-bindings: ARM: Mediatek: Document bindings for
|
||||
MT2701
|
||||
|
||||
This patch adds the binding documentation for apmixedsys, bdpsys,
|
||||
ethsys, hifsys, imgsys, infracfg, mmsys, pericfg, topckgen and
|
||||
vdecsys for Mediatek MT2701.
|
||||
|
||||
Signed-off-by: James Liao <jamesjj.liao@mediatek.com>
|
||||
---
|
||||
.../bindings/arm/mediatek/mediatek,apmixedsys.txt | 1 +
|
||||
.../bindings/arm/mediatek/mediatek,bdpsys.txt | 22 ++++++++++++++++++++
|
||||
.../bindings/arm/mediatek/mediatek,ethsys.txt | 22 ++++++++++++++++++++
|
||||
.../bindings/arm/mediatek/mediatek,hifsys.txt | 22 ++++++++++++++++++++
|
||||
.../bindings/arm/mediatek/mediatek,imgsys.txt | 1 +
|
||||
.../bindings/arm/mediatek/mediatek,infracfg.txt | 1 +
|
||||
.../bindings/arm/mediatek/mediatek,mmsys.txt | 1 +
|
||||
.../bindings/arm/mediatek/mediatek,pericfg.txt | 1 +
|
||||
.../bindings/arm/mediatek/mediatek,topckgen.txt | 1 +
|
||||
.../bindings/arm/mediatek/mediatek,vdecsys.txt | 1 +
|
||||
10 files changed, 73 insertions(+)
|
||||
create mode 100644 Documentation/devicetree/bindings/arm/mediatek/mediatek,bdpsys.txt
|
||||
create mode 100644 Documentation/devicetree/bindings/arm/mediatek/mediatek,ethsys.txt
|
||||
create mode 100644 Documentation/devicetree/bindings/arm/mediatek/mediatek,hifsys.txt
|
||||
|
||||
--- a/Documentation/devicetree/bindings/arm/mediatek/mediatek,apmixedsys.txt
|
||||
+++ b/Documentation/devicetree/bindings/arm/mediatek/mediatek,apmixedsys.txt
|
||||
@@ -6,6 +6,7 @@ The Mediatek apmixedsys controller provi
|
||||
Required Properties:
|
||||
|
||||
- compatible: Should be:
|
||||
+ - "mediatek,mt2701-apmixedsys"
|
||||
- "mediatek,mt8135-apmixedsys"
|
||||
- "mediatek,mt8173-apmixedsys"
|
||||
- #clock-cells: Must be 1
|
||||
--- /dev/null
|
||||
+++ b/Documentation/devicetree/bindings/arm/mediatek/mediatek,bdpsys.txt
|
||||
@@ -0,0 +1,22 @@
|
||||
+Mediatek bdpsys controller
|
||||
+============================
|
||||
+
|
||||
+The Mediatek bdpsys controller provides various clocks to the system.
|
||||
+
|
||||
+Required Properties:
|
||||
+
|
||||
+- compatible: Should be:
|
||||
+ - "mediatek,mt2701-bdpsys", "syscon"
|
||||
+- #clock-cells: Must be 1
|
||||
+
|
||||
+The bdpsys controller uses the common clk binding from
|
||||
+Documentation/devicetree/bindings/clock/clock-bindings.txt
|
||||
+The available clocks are defined in dt-bindings/clock/mt*-clk.h.
|
||||
+
|
||||
+Example:
|
||||
+
|
||||
+bdpsys: clock-controller@1c000000 {
|
||||
+ compatible = "mediatek,mt2701-bdpsys", "syscon";
|
||||
+ reg = <0 0x1c000000 0 0x1000>;
|
||||
+ #clock-cells = <1>;
|
||||
+};
|
||||
--- /dev/null
|
||||
+++ b/Documentation/devicetree/bindings/arm/mediatek/mediatek,ethsys.txt
|
||||
@@ -0,0 +1,22 @@
|
||||
+Mediatek ethsys controller
|
||||
+============================
|
||||
+
|
||||
+The Mediatek ethsys controller provides various clocks to the system.
|
||||
+
|
||||
+Required Properties:
|
||||
+
|
||||
+- compatible: Should be:
|
||||
+ - "mediatek,mt2701-ethsys", "syscon"
|
||||
+- #clock-cells: Must be 1
|
||||
+
|
||||
+The ethsys controller uses the common clk binding from
|
||||
+Documentation/devicetree/bindings/clock/clock-bindings.txt
|
||||
+The available clocks are defined in dt-bindings/clock/mt*-clk.h.
|
||||
+
|
||||
+Example:
|
||||
+
|
||||
+ethsys: clock-controller@1b000000 {
|
||||
+ compatible = "mediatek,mt2701-ethsys", "syscon";
|
||||
+ reg = <0 0x1b000000 0 0x1000>;
|
||||
+ #clock-cells = <1>;
|
||||
+};
|
||||
--- /dev/null
|
||||
+++ b/Documentation/devicetree/bindings/arm/mediatek/mediatek,hifsys.txt
|
||||
@@ -0,0 +1,22 @@
|
||||
+Mediatek hifsys controller
|
||||
+============================
|
||||
+
|
||||
+The Mediatek hifsys controller provides various clocks to the system.
|
||||
+
|
||||
+Required Properties:
|
||||
+
|
||||
+- compatible: Should be:
|
||||
+ - "mediatek,mt2701-hifsys", "syscon"
|
||||
+- #clock-cells: Must be 1
|
||||
+
|
||||
+The hifsys controller uses the common clk binding from
|
||||
+Documentation/devicetree/bindings/clock/clock-bindings.txt
|
||||
+The available clocks are defined in dt-bindings/clock/mt*-clk.h.
|
||||
+
|
||||
+Example:
|
||||
+
|
||||
+hifsys: clock-controller@1a000000 {
|
||||
+ compatible = "mediatek,mt2701-hifsys", "syscon";
|
||||
+ reg = <0 0x1a000000 0 0x1000>;
|
||||
+ #clock-cells = <1>;
|
||||
+};
|
||||
--- a/Documentation/devicetree/bindings/arm/mediatek/mediatek,imgsys.txt
|
||||
+++ b/Documentation/devicetree/bindings/arm/mediatek/mediatek,imgsys.txt
|
||||
@@ -6,6 +6,7 @@ The Mediatek imgsys controller provides
|
||||
Required Properties:
|
||||
|
||||
- compatible: Should be:
|
||||
+ - "mediatek,mt2701-imgsys", "syscon"
|
||||
- "mediatek,mt8173-imgsys", "syscon"
|
||||
- #clock-cells: Must be 1
|
||||
|
||||
--- a/Documentation/devicetree/bindings/arm/mediatek/mediatek,infracfg.txt
|
||||
+++ b/Documentation/devicetree/bindings/arm/mediatek/mediatek,infracfg.txt
|
||||
@@ -7,6 +7,7 @@ outputs to the system.
|
||||
Required Properties:
|
||||
|
||||
- compatible: Should be:
|
||||
+ - "mediatek,mt2701-infracfg", "syscon"
|
||||
- "mediatek,mt8135-infracfg", "syscon"
|
||||
- "mediatek,mt8173-infracfg", "syscon"
|
||||
- #clock-cells: Must be 1
|
||||
--- a/Documentation/devicetree/bindings/arm/mediatek/mediatek,mmsys.txt
|
||||
+++ b/Documentation/devicetree/bindings/arm/mediatek/mediatek,mmsys.txt
|
||||
@@ -6,6 +6,7 @@ The Mediatek mmsys controller provides v
|
||||
Required Properties:
|
||||
|
||||
- compatible: Should be:
|
||||
+ - "mediatek,mt2701-mmsys", "syscon"
|
||||
- "mediatek,mt8173-mmsys", "syscon"
|
||||
- #clock-cells: Must be 1
|
||||
|
||||
--- a/Documentation/devicetree/bindings/arm/mediatek/mediatek,pericfg.txt
|
||||
+++ b/Documentation/devicetree/bindings/arm/mediatek/mediatek,pericfg.txt
|
||||
@@ -7,6 +7,7 @@ outputs to the system.
|
||||
Required Properties:
|
||||
|
||||
- compatible: Should be:
|
||||
+ - "mediatek,mt2701-pericfg", "syscon"
|
||||
- "mediatek,mt8135-pericfg", "syscon"
|
||||
- "mediatek,mt8173-pericfg", "syscon"
|
||||
- #clock-cells: Must be 1
|
||||
--- a/Documentation/devicetree/bindings/arm/mediatek/mediatek,topckgen.txt
|
||||
+++ b/Documentation/devicetree/bindings/arm/mediatek/mediatek,topckgen.txt
|
||||
@@ -6,6 +6,7 @@ The Mediatek topckgen controller provide
|
||||
Required Properties:
|
||||
|
||||
- compatible: Should be:
|
||||
+ - "mediatek,mt2701-topckgen"
|
||||
- "mediatek,mt8135-topckgen"
|
||||
- "mediatek,mt8173-topckgen"
|
||||
- #clock-cells: Must be 1
|
||||
--- a/Documentation/devicetree/bindings/arm/mediatek/mediatek,vdecsys.txt
|
||||
+++ b/Documentation/devicetree/bindings/arm/mediatek/mediatek,vdecsys.txt
|
||||
@@ -6,6 +6,7 @@ The Mediatek vdecsys controller provides
|
||||
Required Properties:
|
||||
|
||||
- compatible: Should be:
|
||||
+ - "mediatek,mt2701-vdecsys", "syscon"
|
||||
- "mediatek,mt8173-vdecsys", "syscon"
|
||||
- #clock-cells: Must be 1
|
||||
|
|
@ -1,499 +0,0 @@
|
|||
From 190696e3995be38fa01490e4ab88ea2c859829c9 Mon Sep 17 00:00:00 2001
|
||||
From: Shunli Wang <shunli.wang@mediatek.com>
|
||||
Date: Tue, 5 Jan 2016 14:30:19 +0800
|
||||
Subject: [PATCH 008/102] clk: mediatek: Add dt-bindings for MT2701 clocks
|
||||
|
||||
Add MT2701 clock dt-bindings, include topckgen, apmixedsys,
|
||||
infracfg, pericfg and subsystem clocks.
|
||||
|
||||
Signed-off-by: Shunli Wang <shunli.wang@mediatek.com>
|
||||
Signed-off-by: James Liao <jamesjj.liao@mediatek.com>
|
||||
---
|
||||
include/dt-bindings/clock/mt2701-clk.h | 481 ++++++++++++++++++++++++++++++++
|
||||
1 file changed, 481 insertions(+)
|
||||
create mode 100644 include/dt-bindings/clock/mt2701-clk.h
|
||||
|
||||
--- /dev/null
|
||||
+++ b/include/dt-bindings/clock/mt2701-clk.h
|
||||
@@ -0,0 +1,481 @@
|
||||
+/*
|
||||
+ * Copyright (c) 2014 MediaTek Inc.
|
||||
+ * Author: Shunli Wang <shunli.wang@mediatek.com>
|
||||
+ *
|
||||
+ * This program is free software; you can redistribute it and/or modify
|
||||
+ * it under the terms of the GNU General Public License version 2 as
|
||||
+ * published by the Free Software Foundation.
|
||||
+ *
|
||||
+ * This program is distributed in the hope that it will be useful,
|
||||
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
+ * GNU General Public License for more details.
|
||||
+ */
|
||||
+
|
||||
+#ifndef _DT_BINDINGS_CLK_MT2701_H
|
||||
+#define _DT_BINDINGS_CLK_MT2701_H
|
||||
+
|
||||
+/* TOPCKGEN */
|
||||
+#define CLK_TOP_SYSPLL 1
|
||||
+#define CLK_TOP_SYSPLL_D2 2
|
||||
+#define CLK_TOP_SYSPLL_D3 3
|
||||
+#define CLK_TOP_SYSPLL_D5 4
|
||||
+#define CLK_TOP_SYSPLL_D7 5
|
||||
+#define CLK_TOP_SYSPLL1_D2 6
|
||||
+#define CLK_TOP_SYSPLL1_D4 7
|
||||
+#define CLK_TOP_SYSPLL1_D8 8
|
||||
+#define CLK_TOP_SYSPLL1_D16 9
|
||||
+#define CLK_TOP_SYSPLL2_D2 10
|
||||
+#define CLK_TOP_SYSPLL2_D4 11
|
||||
+#define CLK_TOP_SYSPLL2_D8 12
|
||||
+#define CLK_TOP_SYSPLL3_D2 13
|
||||
+#define CLK_TOP_SYSPLL3_D4 14
|
||||
+#define CLK_TOP_SYSPLL4_D2 15
|
||||
+#define CLK_TOP_SYSPLL4_D4 16
|
||||
+#define CLK_TOP_UNIVPLL 17
|
||||
+#define CLK_TOP_UNIVPLL_D2 18
|
||||
+#define CLK_TOP_UNIVPLL_D3 19
|
||||
+#define CLK_TOP_UNIVPLL_D5 20
|
||||
+#define CLK_TOP_UNIVPLL_D7 21
|
||||
+#define CLK_TOP_UNIVPLL_D26 22
|
||||
+#define CLK_TOP_UNIVPLL_D52 23
|
||||
+#define CLK_TOP_UNIVPLL_D108 24
|
||||
+#define CLK_TOP_USB_PHY48M 25
|
||||
+#define CLK_TOP_UNIVPLL1_D2 26
|
||||
+#define CLK_TOP_UNIVPLL1_D4 27
|
||||
+#define CLK_TOP_UNIVPLL1_D8 28
|
||||
+#define CLK_TOP_UNIVPLL2_D2 29
|
||||
+#define CLK_TOP_UNIVPLL2_D4 30
|
||||
+#define CLK_TOP_UNIVPLL2_D8 31
|
||||
+#define CLK_TOP_UNIVPLL2_D16 32
|
||||
+#define CLK_TOP_UNIVPLL2_D32 33
|
||||
+#define CLK_TOP_UNIVPLL3_D2 34
|
||||
+#define CLK_TOP_UNIVPLL3_D4 35
|
||||
+#define CLK_TOP_UNIVPLL3_D8 36
|
||||
+#define CLK_TOP_MSDCPLL 37
|
||||
+#define CLK_TOP_MSDCPLL_D2 38
|
||||
+#define CLK_TOP_MSDCPLL_D4 39
|
||||
+#define CLK_TOP_MSDCPLL_D8 40
|
||||
+#define CLK_TOP_MMPLL 41
|
||||
+#define CLK_TOP_MMPLL_D2 42
|
||||
+#define CLK_TOP_DMPLL 43
|
||||
+#define CLK_TOP_DMPLL_D2 44
|
||||
+#define CLK_TOP_DMPLL_D4 45
|
||||
+#define CLK_TOP_DMPLL_X2 46
|
||||
+#define CLK_TOP_TVDPLL 47
|
||||
+#define CLK_TOP_TVDPLL_D2 48
|
||||
+#define CLK_TOP_TVDPLL_D4 49
|
||||
+#define CLK_TOP_TVD2PLL 50
|
||||
+#define CLK_TOP_TVD2PLL_D2 51
|
||||
+#define CLK_TOP_HADDS2PLL_98M 52
|
||||
+#define CLK_TOP_HADDS2PLL_294M 53
|
||||
+#define CLK_TOP_HADDS2_FB 54
|
||||
+#define CLK_TOP_MIPIPLL_D2 55
|
||||
+#define CLK_TOP_MIPIPLL_D4 56
|
||||
+#define CLK_TOP_HDMIPLL 57
|
||||
+#define CLK_TOP_HDMIPLL_D2 58
|
||||
+#define CLK_TOP_HDMIPLL_D3 59
|
||||
+#define CLK_TOP_HDMI_SCL_RX 60
|
||||
+#define CLK_TOP_HDMI_0_PIX340M 61
|
||||
+#define CLK_TOP_HDMI_0_DEEP340M 62
|
||||
+#define CLK_TOP_HDMI_0_PLL340M 63
|
||||
+#define CLK_TOP_AUD1PLL_98M 64
|
||||
+#define CLK_TOP_AUD2PLL_90M 65
|
||||
+#define CLK_TOP_AUDPLL 66
|
||||
+#define CLK_TOP_AUDPLL_D4 67
|
||||
+#define CLK_TOP_AUDPLL_D8 68
|
||||
+#define CLK_TOP_AUDPLL_D16 69
|
||||
+#define CLK_TOP_AUDPLL_D24 70
|
||||
+#define CLK_TOP_ETHPLL_500M 71
|
||||
+#define CLK_TOP_VDECPLL 72
|
||||
+#define CLK_TOP_VENCPLL 73
|
||||
+#define CLK_TOP_MIPIPLL 74
|
||||
+#define CLK_TOP_ARMPLL_1P3G 75
|
||||
+
|
||||
+#define CLK_TOP_MM_SEL 76
|
||||
+#define CLK_TOP_DDRPHYCFG_SEL 77
|
||||
+#define CLK_TOP_MEM_SEL 78
|
||||
+#define CLK_TOP_AXI_SEL 79
|
||||
+#define CLK_TOP_CAMTG_SEL 80
|
||||
+#define CLK_TOP_MFG_SEL 81
|
||||
+#define CLK_TOP_VDEC_SEL 82
|
||||
+#define CLK_TOP_PWM_SEL 83
|
||||
+#define CLK_TOP_MSDC30_0_SEL 84
|
||||
+#define CLK_TOP_USB20_SEL 85
|
||||
+#define CLK_TOP_SPI0_SEL 86
|
||||
+#define CLK_TOP_UART_SEL 87
|
||||
+#define CLK_TOP_AUDINTBUS_SEL 88
|
||||
+#define CLK_TOP_AUDIO_SEL 89
|
||||
+#define CLK_TOP_MSDC30_2_SEL 90
|
||||
+#define CLK_TOP_MSDC30_1_SEL 91
|
||||
+#define CLK_TOP_DPI1_SEL 92
|
||||
+#define CLK_TOP_DPI0_SEL 93
|
||||
+#define CLK_TOP_SCP_SEL 94
|
||||
+#define CLK_TOP_PMICSPI_SEL 95
|
||||
+#define CLK_TOP_APLL_SEL 96
|
||||
+#define CLK_TOP_HDMI_SEL 97
|
||||
+#define CLK_TOP_TVE_SEL 98
|
||||
+#define CLK_TOP_EMMC_HCLK_SEL 99
|
||||
+#define CLK_TOP_NFI2X_SEL 100
|
||||
+#define CLK_TOP_RTC_SEL 101
|
||||
+#define CLK_TOP_OSD_SEL 102
|
||||
+#define CLK_TOP_NR_SEL 103
|
||||
+#define CLK_TOP_DI_SEL 104
|
||||
+#define CLK_TOP_FLASH_SEL 105
|
||||
+#define CLK_TOP_ASM_M_SEL 106
|
||||
+#define CLK_TOP_ASM_I_SEL 107
|
||||
+#define CLK_TOP_INTDIR_SEL 108
|
||||
+#define CLK_TOP_HDMIRX_BIST_SEL 109
|
||||
+#define CLK_TOP_ETHIF_SEL 110
|
||||
+#define CLK_TOP_MS_CARD_SEL 111
|
||||
+#define CLK_TOP_ASM_H_SEL 112
|
||||
+#define CLK_TOP_SPI1_SEL 113
|
||||
+#define CLK_TOP_CMSYS_SEL 114
|
||||
+#define CLK_TOP_MSDC30_3_SEL 115
|
||||
+#define CLK_TOP_HDMIRX26_24_SEL 116
|
||||
+#define CLK_TOP_AUD2DVD_SEL 117
|
||||
+#define CLK_TOP_8BDAC_SEL 118
|
||||
+#define CLK_TOP_SPI2_SEL 119
|
||||
+#define CLK_TOP_AUD_MUX1_SEL 120
|
||||
+#define CLK_TOP_AUD_MUX2_SEL 121
|
||||
+#define CLK_TOP_AUDPLL_MUX_SEL 122
|
||||
+#define CLK_TOP_AUD_K1_SRC_SEL 123
|
||||
+#define CLK_TOP_AUD_K2_SRC_SEL 124
|
||||
+#define CLK_TOP_AUD_K3_SRC_SEL 125
|
||||
+#define CLK_TOP_AUD_K4_SRC_SEL 126
|
||||
+#define CLK_TOP_AUD_K5_SRC_SEL 127
|
||||
+#define CLK_TOP_AUD_K6_SRC_SEL 128
|
||||
+#define CLK_TOP_PADMCLK_SEL 129
|
||||
+#define CLK_TOP_AUD_EXTCK1_DIV 130
|
||||
+#define CLK_TOP_AUD_EXTCK2_DIV 131
|
||||
+#define CLK_TOP_AUD_MUX1_DIV 132
|
||||
+#define CLK_TOP_AUD_MUX2_DIV 133
|
||||
+#define CLK_TOP_AUD_K1_SRC_DIV 134
|
||||
+#define CLK_TOP_AUD_K2_SRC_DIV 135
|
||||
+#define CLK_TOP_AUD_K3_SRC_DIV 136
|
||||
+#define CLK_TOP_AUD_K4_SRC_DIV 137
|
||||
+#define CLK_TOP_AUD_K5_SRC_DIV 138
|
||||
+#define CLK_TOP_AUD_K6_SRC_DIV 139
|
||||
+#define CLK_TOP_AUD_I2S1_MCLK 140
|
||||
+#define CLK_TOP_AUD_I2S2_MCLK 141
|
||||
+#define CLK_TOP_AUD_I2S3_MCLK 142
|
||||
+#define CLK_TOP_AUD_I2S4_MCLK 143
|
||||
+#define CLK_TOP_AUD_I2S5_MCLK 144
|
||||
+#define CLK_TOP_AUD_I2S6_MCLK 145
|
||||
+#define CLK_TOP_AUD_48K_TIMING 146
|
||||
+#define CLK_TOP_AUD_44K_TIMING 147
|
||||
+
|
||||
+#define CLK_TOP_32K_INTERNAL 148
|
||||
+#define CLK_TOP_32K_EXTERNAL 149
|
||||
+#define CLK_TOP_CLK26M_D8 150
|
||||
+#define CLK_TOP_8BDAC 151
|
||||
+#define CLK_TOP_WBG_DIG_416M 152
|
||||
+#define CLK_TOP_DPI 153
|
||||
+#define CLK_TOP_HDMITX_CLKDIG_CTS 154
|
||||
+#define CLK_TOP_NR 155
|
||||
+
|
||||
+/* APMIXEDSYS */
|
||||
+
|
||||
+#define CLK_APMIXED_ARMPLL 1
|
||||
+#define CLK_APMIXED_MAINPLL 2
|
||||
+#define CLK_APMIXED_UNIVPLL 3
|
||||
+#define CLK_APMIXED_MMPLL 4
|
||||
+#define CLK_APMIXED_MSDCPLL 5
|
||||
+#define CLK_APMIXED_TVDPLL 6
|
||||
+#define CLK_APMIXED_AUD1PLL 7
|
||||
+#define CLK_APMIXED_TRGPLL 8
|
||||
+#define CLK_APMIXED_ETHPLL 9
|
||||
+#define CLK_APMIXED_VDECPLL 10
|
||||
+#define CLK_APMIXED_HADDS2PLL 11
|
||||
+#define CLK_APMIXED_AUD2PLL 12
|
||||
+#define CLK_APMIXED_TVD2PLL 13
|
||||
+#define CLK_APMIXED_NR 14
|
||||
+
|
||||
+/* DDRPHY */
|
||||
+
|
||||
+#define CLK_DDRPHY_VENCPLL 1
|
||||
+#define CLK_DDRPHY_NR 2
|
||||
+
|
||||
+/* INFRACFG */
|
||||
+
|
||||
+#define CLK_INFRA_DBG 1
|
||||
+#define CLK_INFRA_SMI 2
|
||||
+#define CLK_INFRA_QAXI_CM4 3
|
||||
+#define CLK_INFRA_AUD_SPLIN_B 4
|
||||
+#define CLK_INFRA_AUDIO 5
|
||||
+#define CLK_INFRA_EFUSE 6
|
||||
+#define CLK_INFRA_L2C_SRAM 7
|
||||
+#define CLK_INFRA_M4U 8
|
||||
+#define CLK_INFRA_CONNMCU 9
|
||||
+#define CLK_INFRA_TRNG 10
|
||||
+#define CLK_INFRA_RAMBUFIF 11
|
||||
+#define CLK_INFRA_CPUM 12
|
||||
+#define CLK_INFRA_KP 13
|
||||
+#define CLK_INFRA_CEC 14
|
||||
+#define CLK_INFRA_IRRX 15
|
||||
+#define CLK_INFRA_PMICSPI 16
|
||||
+#define CLK_INFRA_PMICWRAP 17
|
||||
+#define CLK_INFRA_DDCCI 18
|
||||
+#define CLK_INFRA_CLK_13M 19
|
||||
+#define CLK_INFRA_NR 20
|
||||
+
|
||||
+/* PERICFG */
|
||||
+
|
||||
+#define CLK_PERI_NFI 1
|
||||
+#define CLK_PERI_THERM 2
|
||||
+#define CLK_PERI_PWM1 3
|
||||
+#define CLK_PERI_PWM2 4
|
||||
+#define CLK_PERI_PWM3 5
|
||||
+#define CLK_PERI_PWM4 6
|
||||
+#define CLK_PERI_PWM5 7
|
||||
+#define CLK_PERI_PWM6 8
|
||||
+#define CLK_PERI_PWM7 9
|
||||
+#define CLK_PERI_PWM 10
|
||||
+#define CLK_PERI_USB0 11
|
||||
+#define CLK_PERI_USB1 12
|
||||
+#define CLK_PERI_AP_DMA 13
|
||||
+#define CLK_PERI_MSDC30_0 14
|
||||
+#define CLK_PERI_MSDC30_1 15
|
||||
+#define CLK_PERI_MSDC30_2 16
|
||||
+#define CLK_PERI_MSDC30_3 17
|
||||
+#define CLK_PERI_MSDC50_3 18
|
||||
+#define CLK_PERI_NLI 19
|
||||
+#define CLK_PERI_UART0 20
|
||||
+#define CLK_PERI_UART1 21
|
||||
+#define CLK_PERI_UART2 22
|
||||
+#define CLK_PERI_UART3 23
|
||||
+#define CLK_PERI_BTIF 24
|
||||
+#define CLK_PERI_I2C0 25
|
||||
+#define CLK_PERI_I2C1 26
|
||||
+#define CLK_PERI_I2C2 27
|
||||
+#define CLK_PERI_I2C3 28
|
||||
+#define CLK_PERI_AUXADC 29
|
||||
+#define CLK_PERI_SPI0 30
|
||||
+#define CLK_PERI_ETH 31
|
||||
+#define CLK_PERI_USB0_MCU 32
|
||||
+
|
||||
+#define CLK_PERI_USB1_MCU 33
|
||||
+#define CLK_PERI_USB_SLV 34
|
||||
+#define CLK_PERI_GCPU 35
|
||||
+#define CLK_PERI_NFI_ECC 36
|
||||
+#define CLK_PERI_NFI_PAD 37
|
||||
+#define CLK_PERI_FLASH 38
|
||||
+#define CLK_PERI_HOST89_INT 39
|
||||
+#define CLK_PERI_HOST89_SPI 40
|
||||
+#define CLK_PERI_HOST89_DVD 41
|
||||
+#define CLK_PERI_SPI1 42
|
||||
+#define CLK_PERI_SPI2 43
|
||||
+#define CLK_PERI_FCI 44
|
||||
+
|
||||
+#define CLK_PERI_UART0_SEL 45
|
||||
+#define CLK_PERI_UART1_SEL 46
|
||||
+#define CLK_PERI_UART2_SEL 47
|
||||
+#define CLK_PERI_UART3_SEL 48
|
||||
+#define CLK_PERI_NR 49
|
||||
+
|
||||
+/* AUDIO */
|
||||
+
|
||||
+#define CLK_AUD_AFE 1
|
||||
+#define CLK_AUD_LRCK_DETECT 2
|
||||
+#define CLK_AUD_I2S 3
|
||||
+#define CLK_AUD_APLL_TUNER 4
|
||||
+#define CLK_AUD_HDMI 5
|
||||
+#define CLK_AUD_SPDF 6
|
||||
+#define CLK_AUD_SPDF2 7
|
||||
+#define CLK_AUD_APLL 8
|
||||
+#define CLK_AUD_TML 9
|
||||
+#define CLK_AUD_AHB_IDLE_EXT 10
|
||||
+#define CLK_AUD_AHB_IDLE_INT 11
|
||||
+
|
||||
+#define CLK_AUD_I2SIN1 12
|
||||
+#define CLK_AUD_I2SIN2 13
|
||||
+#define CLK_AUD_I2SIN3 14
|
||||
+#define CLK_AUD_I2SIN4 15
|
||||
+#define CLK_AUD_I2SIN5 16
|
||||
+#define CLK_AUD_I2SIN6 17
|
||||
+#define CLK_AUD_I2SO1 18
|
||||
+#define CLK_AUD_I2SO2 19
|
||||
+#define CLK_AUD_I2SO3 20
|
||||
+#define CLK_AUD_I2SO4 21
|
||||
+#define CLK_AUD_I2SO5 22
|
||||
+#define CLK_AUD_I2SO6 23
|
||||
+#define CLK_AUD_ASRCI1 24
|
||||
+#define CLK_AUD_ASRCI2 25
|
||||
+#define CLK_AUD_ASRCO1 26
|
||||
+#define CLK_AUD_ASRCO2 27
|
||||
+#define CLK_AUD_ASRC11 28
|
||||
+#define CLK_AUD_ASRC12 29
|
||||
+#define CLK_AUD_HDMIRX 30
|
||||
+#define CLK_AUD_INTDIR 31
|
||||
+#define CLK_AUD_A1SYS 32
|
||||
+#define CLK_AUD_A2SYS 33
|
||||
+#define CLK_AUD_AFE_CONN 34
|
||||
+#define CLK_AUD_AFE_PCMIF 35
|
||||
+#define CLK_AUD_AFE_MRGIF 36
|
||||
+
|
||||
+#define CLK_AUD_MMIF_UL1 37
|
||||
+#define CLK_AUD_MMIF_UL2 38
|
||||
+#define CLK_AUD_MMIF_UL3 39
|
||||
+#define CLK_AUD_MMIF_UL4 40
|
||||
+#define CLK_AUD_MMIF_UL5 41
|
||||
+#define CLK_AUD_MMIF_UL6 42
|
||||
+#define CLK_AUD_MMIF_DL1 43
|
||||
+#define CLK_AUD_MMIF_DL2 44
|
||||
+#define CLK_AUD_MMIF_DL3 45
|
||||
+#define CLK_AUD_MMIF_DL4 46
|
||||
+#define CLK_AUD_MMIF_DL5 47
|
||||
+#define CLK_AUD_MMIF_DL6 48
|
||||
+#define CLK_AUD_MMIF_DLMCH 49
|
||||
+#define CLK_AUD_MMIF_ARB1 50
|
||||
+#define CLK_AUD_MMIF_AWB1 51
|
||||
+#define CLK_AUD_MMIF_AWB2 52
|
||||
+#define CLK_AUD_MMIF_DAI 53
|
||||
+
|
||||
+#define CLK_AUD_DMIC1 54
|
||||
+#define CLK_AUD_DMIC2 55
|
||||
+#define CLK_AUD_ASRCI3 56
|
||||
+#define CLK_AUD_ASRCI4 57
|
||||
+#define CLK_AUD_ASRCI5 58
|
||||
+#define CLK_AUD_ASRCI6 59
|
||||
+#define CLK_AUD_ASRCO3 60
|
||||
+#define CLK_AUD_ASRCO4 61
|
||||
+#define CLK_AUD_ASRCO5 62
|
||||
+#define CLK_AUD_ASRCO6 63
|
||||
+#define CLK_AUD_MEM_ASRC1 64
|
||||
+#define CLK_AUD_MEM_ASRC2 65
|
||||
+#define CLK_AUD_MEM_ASRC3 66
|
||||
+#define CLK_AUD_MEM_ASRC4 67
|
||||
+#define CLK_AUD_MEM_ASRC5 68
|
||||
+#define CLK_AUD_DSD_ENC 69
|
||||
+#define CLK_AUD_ASRC_BRG 70
|
||||
+#define CLK_AUD_NR 71
|
||||
+
|
||||
+/* MMSYS */
|
||||
+
|
||||
+#define CLK_MM_SMI_COMMON 1
|
||||
+#define CLK_MM_SMI_LARB0 2
|
||||
+#define CLK_MM_CMDQ 3
|
||||
+#define CLK_MM_MUTEX 4
|
||||
+#define CLK_MM_DISP_COLOR 5
|
||||
+#define CLK_MM_DISP_BLS 6
|
||||
+#define CLK_MM_DISP_WDMA 7
|
||||
+#define CLK_MM_DISP_RDMA 8
|
||||
+#define CLK_MM_DISP_OVL 9
|
||||
+#define CLK_MM_MDP_TDSHP 10
|
||||
+#define CLK_MM_MDP_WROT 11
|
||||
+#define CLK_MM_MDP_WDMA 12
|
||||
+#define CLK_MM_MDP_RSZ1 13
|
||||
+#define CLK_MM_MDP_RSZ0 14
|
||||
+#define CLK_MM_MDP_RDMA 15
|
||||
+#define CLK_MM_MDP_BLS_26M 16
|
||||
+#define CLK_MM_CAM_MDP 17
|
||||
+#define CLK_MM_FAKE_ENG 18
|
||||
+#define CLK_MM_MUTEX_32K 19
|
||||
+#define CLK_MM_DISP_RDMA1 20
|
||||
+#define CLK_MM_DISP_UFOE 21
|
||||
+
|
||||
+#define CLK_MM_DSI_ENGINE 22
|
||||
+#define CLK_MM_DSI_DIG 23
|
||||
+#define CLK_MM_DPI_DIGL 24
|
||||
+#define CLK_MM_DPI_ENGINE 25
|
||||
+#define CLK_MM_DPI1_DIGL 26
|
||||
+#define CLK_MM_DPI1_ENGINE 27
|
||||
+#define CLK_MM_TVE_OUTPUT 28
|
||||
+#define CLK_MM_TVE_INPUT 29
|
||||
+#define CLK_MM_HDMI_PIXEL 30
|
||||
+#define CLK_MM_HDMI_PLL 31
|
||||
+#define CLK_MM_HDMI_AUDIO 32
|
||||
+#define CLK_MM_HDMI_SPDIF 33
|
||||
+#define CLK_MM_TVE_FMM 34
|
||||
+#define CLK_MM_NR 35
|
||||
+
|
||||
+/* IMGSYS */
|
||||
+
|
||||
+#define CLK_IMG_SMI_COMM 1
|
||||
+#define CLK_IMG_RESZ 2
|
||||
+#define CLK_IMG_JPGDEC 3
|
||||
+#define CLK_IMG_VENC_LT 4
|
||||
+#define CLK_IMG_VENC 5
|
||||
+#define CLK_IMG_NR 6
|
||||
+
|
||||
+/* VDEC */
|
||||
+
|
||||
+#define CLK_VDEC_CKGEN 1
|
||||
+#define CLK_VDEC_LARB 2
|
||||
+#define CLK_VDEC_NR 3
|
||||
+
|
||||
+/* HIFSYS */
|
||||
+
|
||||
+#define CLK_HIFSYS_USB0PHY 1
|
||||
+#define CLK_HIFSYS_USB1PHY 2
|
||||
+#define CLK_HIFSYS_PCIE0 3
|
||||
+#define CLK_HIFSYS_PCIE1 4
|
||||
+#define CLK_HIFSYS_PCIE2 5
|
||||
+#define CLK_HIFSYS_NR 6
|
||||
+
|
||||
+/* ETHSYS */
|
||||
+#define CLK_ETHSYS_HSDMA 1
|
||||
+#define CLK_ETHSYS_ESW 2
|
||||
+#define CLK_ETHSYS_GP2 3
|
||||
+#define CLK_ETHSYS_GP1 4
|
||||
+#define CLK_ETHSYS_PCM 5
|
||||
+#define CLK_ETHSYS_GDMA 6
|
||||
+#define CLK_ETHSYS_I2S 7
|
||||
+#define CLK_ETHSYS_CRYPTO 8
|
||||
+#define CLK_ETHSYS_NR 9
|
||||
+
|
||||
+/* BDP */
|
||||
+
|
||||
+#define CLK_BDP_BRG_BA 1
|
||||
+#define CLK_BDP_BRG_DRAM 2
|
||||
+#define CLK_BDP_LARB_DRAM 3
|
||||
+#define CLK_BDP_WR_VDI_PXL 4
|
||||
+#define CLK_BDP_WR_VDI_DRAM 5
|
||||
+#define CLK_BDP_WR_B 6
|
||||
+#define CLK_BDP_DGI_IN 7
|
||||
+#define CLK_BDP_DGI_OUT 8
|
||||
+#define CLK_BDP_FMT_MAST_27 9
|
||||
+#define CLK_BDP_FMT_B 10
|
||||
+#define CLK_BDP_OSD_B 11
|
||||
+#define CLK_BDP_OSD_DRAM 12
|
||||
+#define CLK_BDP_OSD_AGENT 13
|
||||
+#define CLK_BDP_OSD_PXL 14
|
||||
+#define CLK_BDP_RLE_B 15
|
||||
+#define CLK_BDP_RLE_AGENT 16
|
||||
+#define CLK_BDP_RLE_DRAM 17
|
||||
+#define CLK_BDP_F27M 18
|
||||
+#define CLK_BDP_F27M_VDOUT 19
|
||||
+#define CLK_BDP_F27_74_74 20
|
||||
+#define CLK_BDP_F2FS 21
|
||||
+#define CLK_BDP_F2FS74_148 22
|
||||
+#define CLK_BDP_FB 23
|
||||
+#define CLK_BDP_VDO_DRAM 24
|
||||
+#define CLK_BDP_VDO_2FS 25
|
||||
+#define CLK_BDP_VDO_B 26
|
||||
+#define CLK_BDP_WR_DI_PXL 27
|
||||
+#define CLK_BDP_WR_DI_DRAM 28
|
||||
+#define CLK_BDP_WR_DI_B 29
|
||||
+#define CLK_BDP_NR_PXL 30
|
||||
+#define CLK_BDP_NR_DRAM 31
|
||||
+#define CLK_BDP_NR_B 32
|
||||
+
|
||||
+#define CLK_BDP_RX_F 33
|
||||
+#define CLK_BDP_RX_X 34
|
||||
+#define CLK_BDP_RXPDT 35
|
||||
+#define CLK_BDP_RX_CSCL_N 36
|
||||
+#define CLK_BDP_RX_CSCL 37
|
||||
+#define CLK_BDP_RX_DDCSCL_N 38
|
||||
+#define CLK_BDP_RX_DDCSCL 39
|
||||
+#define CLK_BDP_RX_VCO 40
|
||||
+#define CLK_BDP_RX_DP 41
|
||||
+#define CLK_BDP_RX_P 42
|
||||
+#define CLK_BDP_RX_M 43
|
||||
+#define CLK_BDP_RX_PLL 44
|
||||
+#define CLK_BDP_BRG_RT_B 45
|
||||
+#define CLK_BDP_BRG_RT_DRAM 46
|
||||
+#define CLK_BDP_LARBRT_DRAM 47
|
||||
+#define CLK_BDP_TMDS_SYN 48
|
||||
+#define CLK_BDP_HDMI_MON 49
|
||||
+#define CLK_BDP_NR 50
|
||||
+
|
||||
+#endif /* _DT_BINDINGS_CLK_MT2701_H */
|
|
@ -1,93 +0,0 @@
|
|||
From 8bf0f2a1e8ff082de3f650211abd985ef68abe1b Mon Sep 17 00:00:00 2001
|
||||
From: Shunli Wang <shunli.wang@mediatek.com>
|
||||
Date: Tue, 5 Jan 2016 14:30:21 +0800
|
||||
Subject: [PATCH 010/102] reset: mediatek: mt2701 reset controller dt-binding
|
||||
file
|
||||
|
||||
Dt-binding file about reset controller is used to provide
|
||||
kinds of definition, which is referenced by dts file and
|
||||
IC-specified reset controller driver code.
|
||||
|
||||
Signed-off-by: Shunli Wang <shunli.wang@mediatek.com>
|
||||
---
|
||||
.../dt-bindings/reset-controller/mt2701-resets.h | 74 ++++++++++++++++++++
|
||||
1 file changed, 74 insertions(+)
|
||||
create mode 100644 include/dt-bindings/reset-controller/mt2701-resets.h
|
||||
|
||||
--- /dev/null
|
||||
+++ b/include/dt-bindings/reset-controller/mt2701-resets.h
|
||||
@@ -0,0 +1,74 @@
|
||||
+/*
|
||||
+ * Copyright (c) 2015 MediaTek, Shunli Wang <shunli.wang@mediatek.com>
|
||||
+ *
|
||||
+ * This program is free software; you can redistribute it and/or modify
|
||||
+ * it under the terms of the GNU General Public License version 2 as
|
||||
+ * published by the Free Software Foundation.
|
||||
+ *
|
||||
+ * This program is distributed in the hope that it will be useful,
|
||||
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
+ * GNU General Public License for more details.
|
||||
+ */
|
||||
+
|
||||
+#ifndef _DT_BINDINGS_RESET_CONTROLLER_MT2701
|
||||
+#define _DT_BINDINGS_RESET_CONTROLLER_MT2701
|
||||
+
|
||||
+/* INFRACFG resets */
|
||||
+#define MT2701_INFRA_EMI_REG_RST 0
|
||||
+#define MT2701_INFRA_DRAMC0_A0_RST 1
|
||||
+#define MT2701_INFRA_FHCTL_RST 2
|
||||
+#define MT2701_INFRA_APCIRQ_EINT_RST 3
|
||||
+#define MT2701_INFRA_APXGPT_RST 4
|
||||
+#define MT2701_INFRA_SCPSYS_RST 5
|
||||
+#define MT2701_INFRA_KP_RST 6
|
||||
+#define MT2701_INFRA_PMIC_WRAP_RST 7
|
||||
+#define MT2701_INFRA_MIPI_RST 8
|
||||
+#define MT2701_INFRA_IRRX_RST 9
|
||||
+#define MT2701_INFRA_CEC_RST 10
|
||||
+#define MT2701_INFRA_EMI_RST 32
|
||||
+#define MT2701_INFRA_DRAMC0_RST 34
|
||||
+#define MT2701_INFRA_TRNG_RST 37
|
||||
+#define MT2701_INFRA_SYSIRQ_RST 38
|
||||
+
|
||||
+/* PERICFG resets */
|
||||
+#define MT2701_PERI_UART0_SW_RST 0
|
||||
+#define MT2701_PERI_UART1_SW_RST 1
|
||||
+#define MT2701_PERI_UART2_SW_RST 2
|
||||
+#define MT2701_PERI_UART3_SW_RST 3
|
||||
+#define MT2701_PERI_GCPU_SW_RST 5
|
||||
+#define MT2701_PERI_BTIF_SW_RST 6
|
||||
+#define MT2701_PERI_PWM_SW_RST 8
|
||||
+#define MT2701_PERI_AUXADC_SW_RST 10
|
||||
+#define MT2701_PERI_DMA_SW_RST 11
|
||||
+#define MT2701_PERI_NFI_SW_RST 14
|
||||
+#define MT2701_PERI_NLI_SW_RST 15
|
||||
+#define MT2701_PERI_THERM_SW_RST 16
|
||||
+#define MT2701_PERI_MSDC2_SW_RST 17
|
||||
+#define MT2701_PERI_MSDC0_SW_RST 19
|
||||
+#define MT2701_PERI_MSDC1_SW_RST 20
|
||||
+#define MT2701_PERI_I2C0_SW_RST 22
|
||||
+#define MT2701_PERI_I2C1_SW_RST 23
|
||||
+#define MT2701_PERI_I2C2_SW_RST 24
|
||||
+#define MT2701_PERI_I2C3_SW_RST 25
|
||||
+#define MT2701_PERI_USB_SW_RST 28
|
||||
+#define MT2701_PERI_ETH_SW_RST 29
|
||||
+#define MT2701_PERI_SPI0_SW_RST 33
|
||||
+
|
||||
+/* TOPRGU resets */
|
||||
+#define MT2701_TOPRGU_INFRA_RST 0
|
||||
+#define MT2701_TOPRGU_MM_RST 1
|
||||
+#define MT2701_TOPRGU_MFG_RST 2
|
||||
+#define MT2701_TOPRGU_ETHDMA_RST 3
|
||||
+#define MT2701_TOPRGU_VDEC_RST 4
|
||||
+#define MT2701_TOPRGU_VENC_IMG_RST 5
|
||||
+#define MT2701_TOPRGU_DDRPHY_RST 6
|
||||
+#define MT2701_TOPRGU_MD_RST 7
|
||||
+#define MT2701_TOPRGU_INFRA_AO_RST 8
|
||||
+#define MT2701_TOPRGU_CONN_RST 9
|
||||
+#define MT2701_TOPRGU_APMIXED_RST 10
|
||||
+#define MT2701_TOPRGU_HIFSYS_RST 11
|
||||
+#define MT2701_TOPRGU_CONN_MCU_RST 12
|
||||
+#define MT2701_TOPRGU_BDP_DISP_RST 13
|
||||
+
|
||||
+#endif /* _DT_BINDINGS_RESET_CONTROLLER_MT2701 */
|
|
@ -1,31 +0,0 @@
|
|||
From afcbed6f51e8c3a9195952b27c8aad047c314ed0 Mon Sep 17 00:00:00 2001
|
||||
From: Biao Huang <biao.huang@mediatek.com>
|
||||
Date: Mon, 28 Dec 2015 15:09:03 +0800
|
||||
Subject: [PATCH 013/102] dt-bindings: mediatek: Modify pinctrl bindings for
|
||||
mt2701
|
||||
|
||||
Signed-off-by: Biao Huang <biao.huang@mediatek.com>
|
||||
Acked-by: Rob Herring <robh@kernel.org>
|
||||
Reviewed-by: Mathias Brugger <matthias.bgg@gmail.com>
|
||||
---
|
||||
Documentation/devicetree/bindings/pinctrl/pinctrl-mt65xx.txt | 9 +++++----
|
||||
1 file changed, 5 insertions(+), 4 deletions(-)
|
||||
|
||||
--- a/Documentation/devicetree/bindings/pinctrl/pinctrl-mt65xx.txt
|
||||
+++ b/Documentation/devicetree/bindings/pinctrl/pinctrl-mt65xx.txt
|
||||
@@ -4,10 +4,11 @@ The Mediatek's Pin controller is used to
|
||||
|
||||
Required properties:
|
||||
- compatible: value should be one of the following.
|
||||
- (a) "mediatek,mt8135-pinctrl", compatible with mt8135 pinctrl.
|
||||
- (b) "mediatek,mt8173-pinctrl", compatible with mt8173 pinctrl.
|
||||
- (c) "mediatek,mt6397-pinctrl", compatible with mt6397 pinctrl.
|
||||
- (d) "mediatek,mt8127-pinctrl", compatible with mt8127 pinctrl.
|
||||
+ "mediatek,mt2701-pinctrl", compatible with mt2701 pinctrl.
|
||||
+ "mediatek,mt6397-pinctrl", compatible with mt6397 pinctrl.
|
||||
+ "mediatek,mt8127-pinctrl", compatible with mt8127 pinctrl.
|
||||
+ "mediatek,mt8135-pinctrl", compatible with mt8135 pinctrl.
|
||||
+ "mediatek,mt8173-pinctrl", compatible with mt8173 pinctrl.
|
||||
- pins-are-numbered: Specify the subnodes are using numbered pinmux to
|
||||
specify pins.
|
||||
- gpio-controller : Marks the device node as a gpio controller.
|
File diff suppressed because it is too large
Load diff
|
@ -1,547 +0,0 @@
|
|||
From 3800e5c33e5becbb56c6694008d1f3435fd78707 Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <blogic@openwrt.org>
|
||||
Date: Thu, 7 Jan 2016 23:42:06 +0100
|
||||
Subject: [PATCH 015/102] dt-bindings: mediatek: Modify pinctrl bindings for
|
||||
mt7623
|
||||
|
||||
Signed-off-by: John Crispin <blogic@openwrt.org>
|
||||
---
|
||||
.../devicetree/bindings/pinctrl/pinctrl-mt65xx.txt | 1 +
|
||||
include/dt-bindings/pinctrl/mt7623-pinfunc.h | 521 ++++++++++++++++++++
|
||||
2 files changed, 522 insertions(+)
|
||||
create mode 100644 include/dt-bindings/pinctrl/mt7623-pinfunc.h
|
||||
|
||||
--- a/Documentation/devicetree/bindings/pinctrl/pinctrl-mt65xx.txt
|
||||
+++ b/Documentation/devicetree/bindings/pinctrl/pinctrl-mt65xx.txt
|
||||
@@ -6,6 +6,7 @@ Required properties:
|
||||
- compatible: value should be one of the following.
|
||||
"mediatek,mt2701-pinctrl", compatible with mt2701 pinctrl.
|
||||
"mediatek,mt6397-pinctrl", compatible with mt6397 pinctrl.
|
||||
+ "mediatek,mt7623-pinctrl", compatible with mt7623 pinctrl.
|
||||
"mediatek,mt8127-pinctrl", compatible with mt8127 pinctrl.
|
||||
"mediatek,mt8135-pinctrl", compatible with mt8135 pinctrl.
|
||||
"mediatek,mt8173-pinctrl", compatible with mt8173 pinctrl.
|
||||
--- /dev/null
|
||||
+++ b/include/dt-bindings/pinctrl/mt7623-pinfunc.h
|
||||
@@ -0,0 +1,521 @@
|
||||
+#ifndef __DTS_MT7623_PINFUNC_H
|
||||
+#define __DTS_MT7623_PINFUNC_H
|
||||
+
|
||||
+#include <dt-bindings/pinctrl/mt65xx.h>
|
||||
+
|
||||
+#define MT7623_PIN_0_PWRAP_SPI0_MI_FUNC_GPIO0 (MTK_PIN_NO(0) | 0)
|
||||
+#define MT7623_PIN_0_PWRAP_SPI0_MI_FUNC_PWRAP_SPIDO (MTK_PIN_NO(0) | 1)
|
||||
+#define MT7623_PIN_0_PWRAP_SPI0_MI_FUNC_PWRAP_SPIDI (MTK_PIN_NO(0) | 2)
|
||||
+
|
||||
+#define MT7623_PIN_1_PWRAP_SPI0_MO_FUNC_GPIO1 (MTK_PIN_NO(1) | 0)
|
||||
+#define MT7623_PIN_1_PWRAP_SPI0_MO_FUNC_PWRAP_SPIDI (MTK_PIN_NO(1) | 1)
|
||||
+#define MT7623_PIN_1_PWRAP_SPI0_MO_FUNC_PWRAP_SPIDO (MTK_PIN_NO(1) | 2)
|
||||
+
|
||||
+#define MT7623_PIN_2_PWRAP_INT_FUNC_GPIO2 (MTK_PIN_NO(2) | 0)
|
||||
+#define MT7623_PIN_2_PWRAP_INT_FUNC_PWRAP_INT (MTK_PIN_NO(2) | 1)
|
||||
+
|
||||
+#define MT7623_PIN_3_PWRAP_SPI0_CK_FUNC_GPIO3 (MTK_PIN_NO(3) | 0)
|
||||
+#define MT7623_PIN_3_PWRAP_SPI0_CK_FUNC_PWRAP_SPICK_I (MTK_PIN_NO(3) | 1)
|
||||
+
|
||||
+#define MT7623_PIN_4_PWRAP_SPI0_CSN_FUNC_GPIO4 (MTK_PIN_NO(4) | 0)
|
||||
+#define MT7623_PIN_4_PWRAP_SPI0_CSN_FUNC_PWRAP_SPICS_B_I (MTK_PIN_NO(4) | 1)
|
||||
+
|
||||
+#define MT7623_PIN_5_PWRAP_SPI0_CK2_FUNC_GPIO5 (MTK_PIN_NO(5) | 0)
|
||||
+#define MT7623_PIN_5_PWRAP_SPI0_CK2_FUNC_PWRAP_SPICK2_I (MTK_PIN_NO(5) | 1)
|
||||
+
|
||||
+#define MT7623_PIN_6_PWRAP_SPI0_CSN2_FUNC_GPIO6 (MTK_PIN_NO(6) | 0)
|
||||
+#define MT7623_PIN_6_PWRAP_SPI0_CSN2_FUNC_PWRAP_SPICS2_B_I (MTK_PIN_NO(6) | 1)
|
||||
+
|
||||
+#define MT7623_PIN_7_SPI1_CSN_FUNC_GPIO7 (MTK_PIN_NO(7) | 0)
|
||||
+#define MT7623_PIN_7_SPI1_CSN_FUNC_SPI1_CS (MTK_PIN_NO(7) | 1)
|
||||
+
|
||||
+#define MT7623_PIN_8_SPI1_MI_FUNC_GPIO8 (MTK_PIN_NO(8) | 0)
|
||||
+#define MT7623_PIN_8_SPI1_MI_FUNC_SPI1_MI (MTK_PIN_NO(8) | 1)
|
||||
+#define MT7623_PIN_8_SPI1_MI_FUNC_SPI1_MO (MTK_PIN_NO(8) | 2)
|
||||
+
|
||||
+#define MT7623_PIN_9_SPI1_MO_FUNC_GPIO9 (MTK_PIN_NO(9) | 0)
|
||||
+#define MT7623_PIN_9_SPI1_MO_FUNC_SPI1_MO (MTK_PIN_NO(9) | 1)
|
||||
+#define MT7623_PIN_9_SPI1_MO_FUNC_SPI1_MI (MTK_PIN_NO(9) | 2)
|
||||
+
|
||||
+#define MT7623_PIN_10_RTC32K_CK_FUNC_GPIO10 (MTK_PIN_NO(10) | 0)
|
||||
+#define MT7623_PIN_10_RTC32K_CK_FUNC_RTC32K_CK (MTK_PIN_NO(10) | 1)
|
||||
+
|
||||
+#define MT7623_PIN_11_WATCHDOG_FUNC_GPIO11 (MTK_PIN_NO(11) | 0)
|
||||
+#define MT7623_PIN_11_WATCHDOG_FUNC_WATCHDOG (MTK_PIN_NO(11) | 1)
|
||||
+
|
||||
+#define MT7623_PIN_12_SRCLKENA_FUNC_GPIO12 (MTK_PIN_NO(12) | 0)
|
||||
+#define MT7623_PIN_12_SRCLKENA_FUNC_SRCLKENA (MTK_PIN_NO(12) | 1)
|
||||
+
|
||||
+#define MT7623_PIN_13_SRCLKENAI_FUNC_GPIO13 (MTK_PIN_NO(13) | 0)
|
||||
+#define MT7623_PIN_13_SRCLKENAI_FUNC_SRCLKENAI (MTK_PIN_NO(13) | 1)
|
||||
+
|
||||
+#define MT7623_PIN_14_GPIO14_FUNC_GPIO14 (MTK_PIN_NO(14) | 0)
|
||||
+#define MT7623_PIN_14_GPIO14_FUNC_URXD2 (MTK_PIN_NO(14) | 1)
|
||||
+#define MT7623_PIN_14_GPIO14_FUNC_UTXD2 (MTK_PIN_NO(14) | 2)
|
||||
+
|
||||
+#define MT7623_PIN_15_GPIO15_FUNC_GPIO15 (MTK_PIN_NO(15) | 0)
|
||||
+#define MT7623_PIN_15_GPIO15_FUNC_UTXD2 (MTK_PIN_NO(15) | 1)
|
||||
+#define MT7623_PIN_15_GPIO15_FUNC_URXD2 (MTK_PIN_NO(15) | 2)
|
||||
+
|
||||
+#define MT7623_PIN_18_PCM_CLK_FUNC_GPIO18 (MTK_PIN_NO(18) | 0)
|
||||
+#define MT7623_PIN_18_PCM_CLK_FUNC_PCM_CLK0 (MTK_PIN_NO(18) | 1)
|
||||
+#define MT7623_PIN_18_PCM_CLK_FUNC_AP_PCM_CLKO (MTK_PIN_NO(18) | 6)
|
||||
+
|
||||
+#define MT7623_PIN_19_PCM_SYNC_FUNC_GPIO19 (MTK_PIN_NO(19) | 0)
|
||||
+#define MT7623_PIN_19_PCM_SYNC_FUNC_PCM_SYNC (MTK_PIN_NO(19) | 1)
|
||||
+#define MT7623_PIN_19_PCM_SYNC_FUNC_AP_PCM_SYNC (MTK_PIN_NO(19) | 6)
|
||||
+
|
||||
+#define MT7623_PIN_20_PCM_RX_FUNC_GPIO20 (MTK_PIN_NO(20) | 0)
|
||||
+#define MT7623_PIN_20_PCM_RX_FUNC_PCM_RX (MTK_PIN_NO(20) | 1)
|
||||
+#define MT7623_PIN_20_PCM_RX_FUNC_PCM_TX (MTK_PIN_NO(20) | 4)
|
||||
+#define MT7623_PIN_20_PCM_RX_FUNC_AP_PCM_RX (MTK_PIN_NO(20) | 6)
|
||||
+
|
||||
+#define MT7623_PIN_21_PCM_TX_FUNC_GPIO21 (MTK_PIN_NO(21) | 0)
|
||||
+#define MT7623_PIN_21_PCM_TX_FUNC_PCM_TX (MTK_PIN_NO(21) | 1)
|
||||
+#define MT7623_PIN_21_PCM_TX_FUNC_PCM_RX (MTK_PIN_NO(21) | 4)
|
||||
+#define MT7623_PIN_21_PCM_TX_FUNC_AP_PCM_TX (MTK_PIN_NO(21) | 6)
|
||||
+
|
||||
+#define MT7623_PIN_22_EINT0_FUNC_GPIO22 (MTK_PIN_NO(22) | 0)
|
||||
+#define MT7623_PIN_22_EINT0_FUNC_UCTS0 (MTK_PIN_NO(22) | 1)
|
||||
+#define MT7623_PIN_22_EINT0_FUNC_PCIE0_PERST_N (MTK_PIN_NO(22) | 2)
|
||||
+
|
||||
+#define MT7623_PIN_23_EINT1_FUNC_GPIO23 (MTK_PIN_NO(23) | 0)
|
||||
+#define MT7623_PIN_23_EINT1_FUNC_URTS0 (MTK_PIN_NO(23) | 1)
|
||||
+#define MT7623_PIN_23_EINT1_FUNC_PCIE1_PERST_N (MTK_PIN_NO(23) | 2)
|
||||
+
|
||||
+#define MT7623_PIN_24_EINT2_FUNC_GPIO24 (MTK_PIN_NO(24) | 0)
|
||||
+#define MT7623_PIN_24_EINT2_FUNC_UCTS1 (MTK_PIN_NO(24) | 1)
|
||||
+#define MT7623_PIN_24_EINT2_FUNC_PCIE2_PERST_N (MTK_PIN_NO(24) | 2)
|
||||
+
|
||||
+#define MT7623_PIN_25_EINT3_FUNC_GPIO25 (MTK_PIN_NO(25) | 0)
|
||||
+#define MT7623_PIN_25_EINT3_FUNC_URTS1 (MTK_PIN_NO(25) | 1)
|
||||
+
|
||||
+#define MT7623_PIN_26_EINT4_FUNC_GPIO26 (MTK_PIN_NO(26) | 0)
|
||||
+#define MT7623_PIN_26_EINT4_FUNC_UCTS3 (MTK_PIN_NO(26) | 1)
|
||||
+#define MT7623_PIN_26_EINT4_FUNC_PCIE2_WAKE_N (MTK_PIN_NO(26) | 6)
|
||||
+
|
||||
+#define MT7623_PIN_27_EINT5_FUNC_GPIO27 (MTK_PIN_NO(27) | 0)
|
||||
+#define MT7623_PIN_27_EINT5_FUNC_URTS3 (MTK_PIN_NO(27) | 1)
|
||||
+#define MT7623_PIN_27_EINT5_FUNC_PCIE1_WAKE_N (MTK_PIN_NO(27) | 6)
|
||||
+
|
||||
+#define MT7623_PIN_28_EINT6_FUNC_GPIO28 (MTK_PIN_NO(28) | 0)
|
||||
+#define MT7623_PIN_28_EINT6_FUNC_DRV_VBUS (MTK_PIN_NO(28) | 1)
|
||||
+#define MT7623_PIN_28_EINT6_FUNC_PCIE0_WAKE_N (MTK_PIN_NO(28) | 6)
|
||||
+
|
||||
+#define MT7623_PIN_29_EINT7_FUNC_GPIO29 (MTK_PIN_NO(29) | 0)
|
||||
+#define MT7623_PIN_29_EINT7_FUNC_IDDIG (MTK_PIN_NO(29) | 1)
|
||||
+#define MT7623_PIN_29_EINT7_FUNC_MSDC1_WP (MTK_PIN_NO(29) | 2)
|
||||
+#define MT7623_PIN_29_EINT7_FUNC_PCIE2_PERST_N (MTK_PIN_NO(29) | 6)
|
||||
+
|
||||
+#define MT7623_PIN_33_I2S1_DATA_FUNC_GPIO33 (MTK_PIN_NO(33) | 0)
|
||||
+#define MT7623_PIN_33_I2S1_DATA_FUNC_I2S1_DATA (MTK_PIN_NO(33) | 1)
|
||||
+#define MT7623_PIN_33_I2S1_DATA_FUNC_PCM_TX (MTK_PIN_NO(33) | 3)
|
||||
+#define MT7623_PIN_33_I2S1_DATA_FUNC_AP_PCM_TX (MTK_PIN_NO(33) | 6)
|
||||
+
|
||||
+#define MT7623_PIN_34_I2S1_DATA_IN_FUNC_GPIO34 (MTK_PIN_NO(34) | 0)
|
||||
+#define MT7623_PIN_34_I2S1_DATA_IN_FUNC_I2S1_DATA_IN (MTK_PIN_NO(34) | 1)
|
||||
+#define MT7623_PIN_34_I2S1_DATA_IN_FUNC_PCM_RX (MTK_PIN_NO(34) | 3)
|
||||
+#define MT7623_PIN_34_I2S1_DATA_IN_FUNC_AP_PCM_RX (MTK_PIN_NO(34) | 6)
|
||||
+
|
||||
+#define MT7623_PIN_35_I2S1_BCK_FUNC_GPIO35 (MTK_PIN_NO(35) | 0)
|
||||
+#define MT7623_PIN_35_I2S1_BCK_FUNC_I2S1_BCK (MTK_PIN_NO(35) | 1)
|
||||
+#define MT7623_PIN_35_I2S1_BCK_FUNC_PCM_CLK0 (MTK_PIN_NO(35) | 3)
|
||||
+#define MT7623_PIN_35_I2S1_BCK_FUNC_AP_PCM_CLKO (MTK_PIN_NO(35) | 6)
|
||||
+
|
||||
+#define MT7623_PIN_36_I2S1_LRCK_FUNC_GPIO36 (MTK_PIN_NO(36) | 0)
|
||||
+#define MT7623_PIN_36_I2S1_LRCK_FUNC_I2S1_LRCK (MTK_PIN_NO(36) | 1)
|
||||
+#define MT7623_PIN_36_I2S1_LRCK_FUNC_PCM_SYNC (MTK_PIN_NO(36) | 3)
|
||||
+#define MT7623_PIN_36_I2S1_LRCK_FUNC_AP_PCM_SYNC (MTK_PIN_NO(36) | 6)
|
||||
+
|
||||
+#define MT7623_PIN_37_I2S1_MCLK_FUNC_GPIO37 (MTK_PIN_NO(37) | 0)
|
||||
+#define MT7623_PIN_37_I2S1_MCLK_FUNC_I2S1_MCLK (MTK_PIN_NO(37) | 1)
|
||||
+
|
||||
+#define MT7623_PIN_39_JTMS_FUNC_GPIO39 (MTK_PIN_NO(39) | 0)
|
||||
+#define MT7623_PIN_39_JTMS_FUNC_JTMS (MTK_PIN_NO(39) | 1)
|
||||
+
|
||||
+#define MT7623_PIN_40_JTCK_FUNC_GPIO40 (MTK_PIN_NO(40) | 0)
|
||||
+#define MT7623_PIN_40_JTCK_FUNC_JTCK (MTK_PIN_NO(40) | 1)
|
||||
+
|
||||
+#define MT7623_PIN_41_JTDI_FUNC_GPIO41 (MTK_PIN_NO(41) | 0)
|
||||
+#define MT7623_PIN_41_JTDI_FUNC_JTDI (MTK_PIN_NO(41) | 1)
|
||||
+
|
||||
+#define MT7623_PIN_42_JTDO_FUNC_GPIO42 (MTK_PIN_NO(42) | 0)
|
||||
+#define MT7623_PIN_42_JTDO_FUNC_JTDO (MTK_PIN_NO(42) | 1)
|
||||
+
|
||||
+#define MT7623_PIN_43_NCLE_FUNC_GPIO43 (MTK_PIN_NO(43) | 0)
|
||||
+#define MT7623_PIN_43_NCLE_FUNC_NCLE (MTK_PIN_NO(43) | 1)
|
||||
+#define MT7623_PIN_43_NCLE_FUNC_EXT_XCS2 (MTK_PIN_NO(43) | 2)
|
||||
+
|
||||
+#define MT7623_PIN_44_NCEB1_FUNC_GPIO44 (MTK_PIN_NO(44) | 0)
|
||||
+#define MT7623_PIN_44_NCEB1_FUNC_NCEB1 (MTK_PIN_NO(44) | 1)
|
||||
+#define MT7623_PIN_44_NCEB1_FUNC_IDDIG (MTK_PIN_NO(44) | 2)
|
||||
+
|
||||
+#define MT7623_PIN_45_NCEB0_FUNC_GPIO45 (MTK_PIN_NO(45) | 0)
|
||||
+#define MT7623_PIN_45_NCEB0_FUNC_NCEB0 (MTK_PIN_NO(45) | 1)
|
||||
+#define MT7623_PIN_45_NCEB0_FUNC_DRV_VBUS (MTK_PIN_NO(45) | 2)
|
||||
+
|
||||
+#define MT7623_PIN_46_IR_FUNC_GPIO46 (MTK_PIN_NO(46) | 0)
|
||||
+#define MT7623_PIN_46_IR_FUNC_IR (MTK_PIN_NO(46) | 1)
|
||||
+
|
||||
+#define MT7623_PIN_47_NREB_FUNC_GPIO47 (MTK_PIN_NO(47) | 0)
|
||||
+#define MT7623_PIN_47_NREB_FUNC_NREB (MTK_PIN_NO(47) | 1)
|
||||
+
|
||||
+#define MT7623_PIN_48_NRNB_FUNC_GPIO48 (MTK_PIN_NO(48) | 0)
|
||||
+#define MT7623_PIN_48_NRNB_FUNC_NRNB (MTK_PIN_NO(48) | 1)
|
||||
+
|
||||
+#define MT7623_PIN_49_I2S0_DATA_FUNC_GPIO49 (MTK_PIN_NO(49) | 0)
|
||||
+#define MT7623_PIN_49_I2S0_DATA_FUNC_I2S0_DATA (MTK_PIN_NO(49) | 1)
|
||||
+#define MT7623_PIN_49_I2S0_DATA_FUNC_PCM_TX (MTK_PIN_NO(49) | 3)
|
||||
+#define MT7623_PIN_49_I2S0_DATA_FUNC_AP_I2S_DO (MTK_PIN_NO(49) | 6)
|
||||
+
|
||||
+#define MT7623_PIN_53_SPI0_CSN_FUNC_GPIO53 (MTK_PIN_NO(53) | 0)
|
||||
+#define MT7623_PIN_53_SPI0_CSN_FUNC_SPI0_CS (MTK_PIN_NO(53) | 1)
|
||||
+#define MT7623_PIN_53_SPI0_CSN_FUNC_PWM1 (MTK_PIN_NO(53) | 5)
|
||||
+
|
||||
+#define MT7623_PIN_54_SPI0_CK_FUNC_GPIO54 (MTK_PIN_NO(54) | 0)
|
||||
+#define MT7623_PIN_54_SPI0_CK_FUNC_SPI0_CK (MTK_PIN_NO(54) | 1)
|
||||
+
|
||||
+#define MT7623_PIN_55_SPI0_MI_FUNC_GPIO55 (MTK_PIN_NO(55) | 0)
|
||||
+#define MT7623_PIN_55_SPI0_MI_FUNC_SPI0_MI (MTK_PIN_NO(55) | 1)
|
||||
+#define MT7623_PIN_55_SPI0_MI_FUNC_SPI0_MO (MTK_PIN_NO(55) | 2)
|
||||
+#define MT7623_PIN_55_SPI0_MI_FUNC_MSDC1_WP (MTK_PIN_NO(55) | 3)
|
||||
+#define MT7623_PIN_55_SPI0_MI_FUNC_PWM2 (MTK_PIN_NO(55) | 5)
|
||||
+
|
||||
+#define MT7623_PIN_56_SPI0_MO_FUNC_GPIO56 (MTK_PIN_NO(56) | 0)
|
||||
+#define MT7623_PIN_56_SPI0_MO_FUNC_SPI0_MO (MTK_PIN_NO(56) | 1)
|
||||
+#define MT7623_PIN_56_SPI0_MO_FUNC_SPI0_MI (MTK_PIN_NO(56) | 2)
|
||||
+
|
||||
+#define MT7623_PIN_60_WB_RSTB_FUNC_GPIO60 (MTK_PIN_NO(60) | 0)
|
||||
+#define MT7623_PIN_60_WB_RSTB_FUNC_WB_RSTB (MTK_PIN_NO(60) | 1)
|
||||
+
|
||||
+#define MT7623_PIN_61_GPIO61_FUNC_GPIO61 (MTK_PIN_NO(61) | 0)
|
||||
+#define MT7623_PIN_61_GPIO61_FUNC_TEST_FD (MTK_PIN_NO(61) | 1)
|
||||
+
|
||||
+#define MT7623_PIN_62_GPIO62_FUNC_GPIO62 (MTK_PIN_NO(62) | 0)
|
||||
+#define MT7623_PIN_62_GPIO62_FUNC_TEST_FC (MTK_PIN_NO(62) | 1)
|
||||
+
|
||||
+#define MT7623_PIN_63_WB_SCLK_FUNC_GPIO63 (MTK_PIN_NO(63) | 0)
|
||||
+#define MT7623_PIN_63_WB_SCLK_FUNC_WB_SCLK (MTK_PIN_NO(63) | 1)
|
||||
+
|
||||
+#define MT7623_PIN_64_WB_SDATA_FUNC_GPIO64 (MTK_PIN_NO(64) | 0)
|
||||
+#define MT7623_PIN_64_WB_SDATA_FUNC_WB_SDATA (MTK_PIN_NO(64) | 1)
|
||||
+
|
||||
+#define MT7623_PIN_65_WB_SEN_FUNC_GPIO65 (MTK_PIN_NO(65) | 0)
|
||||
+#define MT7623_PIN_65_WB_SEN_FUNC_WB_SEN (MTK_PIN_NO(65) | 1)
|
||||
+
|
||||
+#define MT7623_PIN_66_WB_CRTL0_FUNC_GPIO66 (MTK_PIN_NO(66) | 0)
|
||||
+#define MT7623_PIN_66_WB_CRTL0_FUNC_WB_CRTL0 (MTK_PIN_NO(66) | 1)
|
||||
+
|
||||
+#define MT7623_PIN_67_WB_CRTL1_FUNC_GPIO67 (MTK_PIN_NO(67) | 0)
|
||||
+#define MT7623_PIN_67_WB_CRTL1_FUNC_WB_CRTL1 (MTK_PIN_NO(67) | 1)
|
||||
+
|
||||
+#define MT7623_PIN_68_WB_CRTL2_FUNC_GPIO68 (MTK_PIN_NO(68) | 0)
|
||||
+#define MT7623_PIN_68_WB_CRTL2_FUNC_WB_CRTL2 (MTK_PIN_NO(68) | 1)
|
||||
+
|
||||
+#define MT7623_PIN_69_WB_CRTL3_FUNC_GPIO69 (MTK_PIN_NO(69) | 0)
|
||||
+#define MT7623_PIN_69_WB_CRTL3_FUNC_WB_CRTL3 (MTK_PIN_NO(69) | 1)
|
||||
+
|
||||
+#define MT7623_PIN_70_WB_CRTL4_FUNC_GPIO70 (MTK_PIN_NO(70) | 0)
|
||||
+#define MT7623_PIN_70_WB_CRTL4_FUNC_WB_CRTL4 (MTK_PIN_NO(70) | 1)
|
||||
+
|
||||
+#define MT7623_PIN_71_WB_CRTL5_FUNC_GPIO71 (MTK_PIN_NO(71) | 0)
|
||||
+#define MT7623_PIN_71_WB_CRTL5_FUNC_WB_CRTL5 (MTK_PIN_NO(71) | 1)
|
||||
+
|
||||
+#define MT7623_PIN_72_I2S0_DATA_IN_FUNC_GPIO72 (MTK_PIN_NO(72) | 0)
|
||||
+#define MT7623_PIN_72_I2S0_DATA_IN_FUNC_I2S0_DATA_IN (MTK_PIN_NO(72) | 1)
|
||||
+#define MT7623_PIN_72_I2S0_DATA_IN_FUNC_PCM_RX (MTK_PIN_NO(72) | 3)
|
||||
+#define MT7623_PIN_72_I2S0_DATA_IN_FUNC_PWM0 (MTK_PIN_NO(72) | 4)
|
||||
+#define MT7623_PIN_72_I2S0_DATA_IN_FUNC_DISP_PWM (MTK_PIN_NO(72) | 5)
|
||||
+#define MT7623_PIN_72_I2S0_DATA_IN_FUNC_AP_I2S_DI (MTK_PIN_NO(72) | 6)
|
||||
+
|
||||
+#define MT7623_PIN_73_I2S0_LRCK_FUNC_GPIO73 (MTK_PIN_NO(73) | 0)
|
||||
+#define MT7623_PIN_73_I2S0_LRCK_FUNC_I2S0_LRCK (MTK_PIN_NO(73) | 1)
|
||||
+#define MT7623_PIN_73_I2S0_LRCK_FUNC_PCM_SYNC (MTK_PIN_NO(73) | 3)
|
||||
+#define MT7623_PIN_73_I2S0_LRCK_FUNC_AP_I2S_LRCK (MTK_PIN_NO(73) | 6)
|
||||
+
|
||||
+#define MT7623_PIN_74_I2S0_BCK_FUNC_GPIO74 (MTK_PIN_NO(74) | 0)
|
||||
+#define MT7623_PIN_74_I2S0_BCK_FUNC_I2S0_BCK (MTK_PIN_NO(74) | 1)
|
||||
+#define MT7623_PIN_74_I2S0_BCK_FUNC_PCM_CLK0 (MTK_PIN_NO(74) | 3)
|
||||
+#define MT7623_PIN_74_I2S0_BCK_FUNC_AP_I2S_BCK (MTK_PIN_NO(74) | 6)
|
||||
+
|
||||
+#define MT7623_PIN_75_SDA0_FUNC_GPIO75 (MTK_PIN_NO(75) | 0)
|
||||
+#define MT7623_PIN_75_SDA0_FUNC_SDA0 (MTK_PIN_NO(75) | 1)
|
||||
+
|
||||
+#define MT7623_PIN_76_SCL0_FUNC_GPIO76 (MTK_PIN_NO(76) | 0)
|
||||
+#define MT7623_PIN_76_SCL0_FUNC_SCL0 (MTK_PIN_NO(76) | 1)
|
||||
+
|
||||
+#define MT7623_PIN_83_LCM_RST_FUNC_GPIO83 (MTK_PIN_NO(83) | 0)
|
||||
+#define MT7623_PIN_83_LCM_RST_FUNC_LCM_RST (MTK_PIN_NO(83) | 1)
|
||||
+
|
||||
+#define MT7623_PIN_84_DSI_TE_FUNC_GPIO84 (MTK_PIN_NO(84) | 0)
|
||||
+#define MT7623_PIN_84_DSI_TE_FUNC_DSI_TE (MTK_PIN_NO(84) | 1)
|
||||
+
|
||||
+#define MT7623_PIN_95_MIPI_TCN_FUNC_GPIO95 (MTK_PIN_NO(95) | 0)
|
||||
+#define MT7623_PIN_95_MIPI_TCN_FUNC_TCN (MTK_PIN_NO(95) | 1)
|
||||
+
|
||||
+#define MT7623_PIN_96_MIPI_TCP_FUNC_GPIO96 (MTK_PIN_NO(96) | 0)
|
||||
+#define MT7623_PIN_96_MIPI_TCP_FUNC_TCP (MTK_PIN_NO(96) | 1)
|
||||
+
|
||||
+#define MT7623_PIN_97_MIPI_TDN1_FUNC_GPIO97 (MTK_PIN_NO(97) | 0)
|
||||
+#define MT7623_PIN_97_MIPI_TDN1_FUNC_TDN1 (MTK_PIN_NO(97) | 1)
|
||||
+
|
||||
+#define MT7623_PIN_98_MIPI_TDP1_FUNC_GPIO98 (MTK_PIN_NO(98) | 0)
|
||||
+#define MT7623_PIN_98_MIPI_TDP1_FUNC_TDP1 (MTK_PIN_NO(98) | 1)
|
||||
+
|
||||
+#define MT7623_PIN_99_MIPI_TDN0_FUNC_GPIO99 (MTK_PIN_NO(99) | 0)
|
||||
+#define MT7623_PIN_99_MIPI_TDN0_FUNC_TDN0 (MTK_PIN_NO(99) | 1)
|
||||
+
|
||||
+#define MT7623_PIN_100_MIPI_TDP0_FUNC_GPIO100 (MTK_PIN_NO(100) | 0)
|
||||
+#define MT7623_PIN_100_MIPI_TDP0_FUNC_TDP0 (MTK_PIN_NO(100) | 1)
|
||||
+
|
||||
+#define MT7623_PIN_105_MSDC1_CMD_FUNC_GPIO105 (MTK_PIN_NO(105) | 0)
|
||||
+#define MT7623_PIN_105_MSDC1_CMD_FUNC_MSDC1_CMD (MTK_PIN_NO(105) | 1)
|
||||
+#define MT7623_PIN_105_MSDC1_CMD_FUNC_SDA1 (MTK_PIN_NO(105) | 3)
|
||||
+#define MT7623_PIN_105_MSDC1_CMD_FUNC_I2SOUT_BCK (MTK_PIN_NO(105) | 6)
|
||||
+
|
||||
+#define MT7623_PIN_106_MSDC1_CLK_FUNC_GPIO106 (MTK_PIN_NO(106) | 0)
|
||||
+#define MT7623_PIN_106_MSDC1_CLK_FUNC_MSDC1_CLK (MTK_PIN_NO(106) | 1)
|
||||
+#define MT7623_PIN_106_MSDC1_CLK_FUNC_SCL1 (MTK_PIN_NO(106) | 3)
|
||||
+#define MT7623_PIN_106_MSDC1_CLK_FUNC_I2SOUT_LRCK (MTK_PIN_NO(106) | 6)
|
||||
+
|
||||
+#define MT7623_PIN_107_MSDC1_DAT0_FUNC_GPIO107 (MTK_PIN_NO(107) | 0)
|
||||
+#define MT7623_PIN_107_MSDC1_DAT0_FUNC_MSDC1_DAT0 (MTK_PIN_NO(107) | 1)
|
||||
+#define MT7623_PIN_107_MSDC1_DAT0_FUNC_UTXD0 (MTK_PIN_NO(107) | 5)
|
||||
+#define MT7623_PIN_107_MSDC1_DAT0_FUNC_I2SOUT_DATA_OUT (MTK_PIN_NO(107) | 6)
|
||||
+
|
||||
+#define MT7623_PIN_108_MSDC1_DAT1_FUNC_GPIO108 (MTK_PIN_NO(108) | 0)
|
||||
+#define MT7623_PIN_108_MSDC1_DAT1_FUNC_MSDC1_DAT1 (MTK_PIN_NO(108) | 1)
|
||||
+#define MT7623_PIN_108_MSDC1_DAT1_FUNC_PWM0 (MTK_PIN_NO(108) | 3)
|
||||
+#define MT7623_PIN_108_MSDC1_DAT1_FUNC_URXD0 (MTK_PIN_NO(108) | 5)
|
||||
+#define MT7623_PIN_108_MSDC1_DAT1_FUNC_PWM1 (MTK_PIN_NO(108) | 6)
|
||||
+
|
||||
+#define MT7623_PIN_109_MSDC1_DAT2_FUNC_GPIO109 (MTK_PIN_NO(109) | 0)
|
||||
+#define MT7623_PIN_109_MSDC1_DAT2_FUNC_MSDC1_DAT2 (MTK_PIN_NO(109) | 1)
|
||||
+#define MT7623_PIN_109_MSDC1_DAT2_FUNC_SDA2 (MTK_PIN_NO(109) | 3)
|
||||
+#define MT7623_PIN_109_MSDC1_DAT2_FUNC_UTXD1 (MTK_PIN_NO(109) | 5)
|
||||
+#define MT7623_PIN_109_MSDC1_DAT2_FUNC_PWM2 (MTK_PIN_NO(109) | 6)
|
||||
+
|
||||
+#define MT7623_PIN_110_MSDC1_DAT3_FUNC_GPIO110 (MTK_PIN_NO(110) | 0)
|
||||
+#define MT7623_PIN_110_MSDC1_DAT3_FUNC_MSDC1_DAT3 (MTK_PIN_NO(110) | 1)
|
||||
+#define MT7623_PIN_110_MSDC1_DAT3_FUNC_SCL2 (MTK_PIN_NO(110) | 3)
|
||||
+#define MT7623_PIN_110_MSDC1_DAT3_FUNC_URXD1 (MTK_PIN_NO(110) | 5)
|
||||
+#define MT7623_PIN_110_MSDC1_DAT3_FUNC_PWM3 (MTK_PIN_NO(110) | 6)
|
||||
+
|
||||
+#define MT7623_PIN_111_MSDC0_DAT7_FUNC_GPIO111 (MTK_PIN_NO(111) | 0)
|
||||
+#define MT7623_PIN_111_MSDC0_DAT7_FUNC_MSDC0_DAT7 (MTK_PIN_NO(111) | 1)
|
||||
+#define MT7623_PIN_111_MSDC0_DAT7_FUNC_NLD7 (MTK_PIN_NO(111) | 4)
|
||||
+
|
||||
+#define MT7623_PIN_112_MSDC0_DAT6_FUNC_GPIO112 (MTK_PIN_NO(112) | 0)
|
||||
+#define MT7623_PIN_112_MSDC0_DAT6_FUNC_MSDC0_DAT6 (MTK_PIN_NO(112) | 1)
|
||||
+#define MT7623_PIN_112_MSDC0_DAT6_FUNC_NLD6 (MTK_PIN_NO(112) | 4)
|
||||
+
|
||||
+#define MT7623_PIN_113_MSDC0_DAT5_FUNC_GPIO113 (MTK_PIN_NO(113) | 0)
|
||||
+#define MT7623_PIN_113_MSDC0_DAT5_FUNC_MSDC0_DAT5 (MTK_PIN_NO(113) | 1)
|
||||
+#define MT7623_PIN_113_MSDC0_DAT5_FUNC_NLD5 (MTK_PIN_NO(113) | 4)
|
||||
+
|
||||
+#define MT7623_PIN_114_MSDC0_DAT4_FUNC_GPIO114 (MTK_PIN_NO(114) | 0)
|
||||
+#define MT7623_PIN_114_MSDC0_DAT4_FUNC_MSDC0_DAT4 (MTK_PIN_NO(114) | 1)
|
||||
+#define MT7623_PIN_114_MSDC0_DAT4_FUNC_NLD4 (MTK_PIN_NO(114) | 4)
|
||||
+
|
||||
+#define MT7623_PIN_115_MSDC0_RSTB_FUNC_GPIO115 (MTK_PIN_NO(115) | 0)
|
||||
+#define MT7623_PIN_115_MSDC0_RSTB_FUNC_MSDC0_RSTB (MTK_PIN_NO(115) | 1)
|
||||
+#define MT7623_PIN_115_MSDC0_RSTB_FUNC_NLD8 (MTK_PIN_NO(115) | 4)
|
||||
+
|
||||
+#define MT7623_PIN_116_MSDC0_CMD_FUNC_GPIO116 (MTK_PIN_NO(116) | 0)
|
||||
+#define MT7623_PIN_116_MSDC0_CMD_FUNC_MSDC0_CMD (MTK_PIN_NO(116) | 1)
|
||||
+#define MT7623_PIN_116_MSDC0_CMD_FUNC_NALE (MTK_PIN_NO(116) | 4)
|
||||
+
|
||||
+#define MT7623_PIN_117_MSDC0_CLK_FUNC_GPIO117 (MTK_PIN_NO(117) | 0)
|
||||
+#define MT7623_PIN_117_MSDC0_CLK_FUNC_MSDC0_CLK (MTK_PIN_NO(117) | 1)
|
||||
+#define MT7623_PIN_117_MSDC0_CLK_FUNC_NWEB (MTK_PIN_NO(117) | 4)
|
||||
+
|
||||
+#define MT7623_PIN_118_MSDC0_DAT3_FUNC_GPIO118 (MTK_PIN_NO(118) | 0)
|
||||
+#define MT7623_PIN_118_MSDC0_DAT3_FUNC_MSDC0_DAT3 (MTK_PIN_NO(118) | 1)
|
||||
+#define MT7623_PIN_118_MSDC0_DAT3_FUNC_NLD3 (MTK_PIN_NO(118) | 4)
|
||||
+
|
||||
+#define MT7623_PIN_119_MSDC0_DAT2_FUNC_GPIO119 (MTK_PIN_NO(119) | 0)
|
||||
+#define MT7623_PIN_119_MSDC0_DAT2_FUNC_MSDC0_DAT2 (MTK_PIN_NO(119) | 1)
|
||||
+#define MT7623_PIN_119_MSDC0_DAT2_FUNC_NLD2 (MTK_PIN_NO(119) | 4)
|
||||
+
|
||||
+#define MT7623_PIN_120_MSDC0_DAT1_FUNC_GPIO120 (MTK_PIN_NO(120) | 0)
|
||||
+#define MT7623_PIN_120_MSDC0_DAT1_FUNC_MSDC0_DAT1 (MTK_PIN_NO(120) | 1)
|
||||
+#define MT7623_PIN_120_MSDC0_DAT1_FUNC_NLD1 (MTK_PIN_NO(120) | 4)
|
||||
+
|
||||
+#define MT7623_PIN_121_MSDC0_DAT0_FUNC_GPIO121 (MTK_PIN_NO(121) | 0)
|
||||
+#define MT7623_PIN_121_MSDC0_DAT0_FUNC_MSDC0_DAT0 (MTK_PIN_NO(121) | 1)
|
||||
+#define MT7623_PIN_121_MSDC0_DAT0_FUNC_NLD0 (MTK_PIN_NO(121) | 4)
|
||||
+#define MT7623_PIN_121_MSDC0_DAT0_FUNC_WATCHDOG (MTK_PIN_NO(121) | 5)
|
||||
+
|
||||
+#define MT7623_PIN_122_GPIO122_FUNC_GPIO122 (MTK_PIN_NO(122) | 0)
|
||||
+#define MT7623_PIN_122_GPIO122_FUNC_TEST (MTK_PIN_NO(122) | 1)
|
||||
+#define MT7623_PIN_122_GPIO122_FUNC_SDA2 (MTK_PIN_NO(122) | 4)
|
||||
+#define MT7623_PIN_122_GPIO122_FUNC_URXD0 (MTK_PIN_NO(122) | 5)
|
||||
+
|
||||
+#define MT7623_PIN_123_GPIO123_FUNC_GPIO123 (MTK_PIN_NO(123) | 0)
|
||||
+#define MT7623_PIN_123_GPIO123_FUNC_TEST (MTK_PIN_NO(123) | 1)
|
||||
+#define MT7623_PIN_123_GPIO123_FUNC_SCL2 (MTK_PIN_NO(123) | 4)
|
||||
+#define MT7623_PIN_123_GPIO123_FUNC_UTXD0 (MTK_PIN_NO(123) | 5)
|
||||
+
|
||||
+#define MT7623_PIN_124_GPIO124_FUNC_GPIO124 (MTK_PIN_NO(124) | 0)
|
||||
+#define MT7623_PIN_124_GPIO124_FUNC_TEST (MTK_PIN_NO(124) | 1)
|
||||
+#define MT7623_PIN_124_GPIO124_FUNC_SDA1 (MTK_PIN_NO(124) | 4)
|
||||
+#define MT7623_PIN_124_GPIO124_FUNC_PWM3 (MTK_PIN_NO(124) | 5)
|
||||
+
|
||||
+#define MT7623_PIN_125_GPIO125_FUNC_GPIO125 (MTK_PIN_NO(125) | 0)
|
||||
+#define MT7623_PIN_125_GPIO125_FUNC_TEST (MTK_PIN_NO(125) | 1)
|
||||
+#define MT7623_PIN_125_GPIO125_FUNC_SCL1 (MTK_PIN_NO(125) | 4)
|
||||
+#define MT7623_PIN_125_GPIO125_FUNC_PWM4 (MTK_PIN_NO(125) | 5)
|
||||
+
|
||||
+#define MT7623_PIN_126_I2S0_MCLK_FUNC_GPIO126 (MTK_PIN_NO(126) | 0)
|
||||
+#define MT7623_PIN_126_I2S0_MCLK_FUNC_I2S0_MCLK (MTK_PIN_NO(126) | 1)
|
||||
+#define MT7623_PIN_126_I2S0_MCLK_FUNC_AP_I2S_MCLK (MTK_PIN_NO(126) | 6)
|
||||
+
|
||||
+#define MT7623_PIN_199_SPI1_CK_FUNC_GPIO199 (MTK_PIN_NO(199) | 0)
|
||||
+#define MT7623_PIN_199_SPI1_CK_FUNC_SPI1_CK (MTK_PIN_NO(199) | 1)
|
||||
+
|
||||
+#define MT7623_PIN_200_URXD2_FUNC_GPIO200 (MTK_PIN_NO(200) | 0)
|
||||
+#define MT7623_PIN_200_URXD2_FUNC_URXD2 (MTK_PIN_NO(200) | 6)
|
||||
+
|
||||
+#define MT7623_PIN_201_UTXD2_FUNC_GPIO201 (MTK_PIN_NO(201) | 0)
|
||||
+#define MT7623_PIN_201_UTXD2_FUNC_UTXD2 (MTK_PIN_NO(201) | 6)
|
||||
+
|
||||
+#define MT7623_PIN_203_PWM0_FUNC_GPIO203 (MTK_PIN_NO(203) | 0)
|
||||
+#define MT7623_PIN_203_PWM0_FUNC_PWM0 (MTK_PIN_NO(203) | 1)
|
||||
+#define MT7623_PIN_203_PWM0_FUNC_DISP_PWM (MTK_PIN_NO(203) | 2)
|
||||
+
|
||||
+#define MT7623_PIN_204_PWM1_FUNC_GPIO204 (MTK_PIN_NO(204) | 0)
|
||||
+#define MT7623_PIN_204_PWM1_FUNC_PWM1 (MTK_PIN_NO(204) | 1)
|
||||
+
|
||||
+#define MT7623_PIN_205_PWM2_FUNC_GPIO205 (MTK_PIN_NO(205) | 0)
|
||||
+#define MT7623_PIN_205_PWM2_FUNC_PWM2 (MTK_PIN_NO(205) | 1)
|
||||
+
|
||||
+#define MT7623_PIN_206_PWM3_FUNC_GPIO206 (MTK_PIN_NO(206) | 0)
|
||||
+#define MT7623_PIN_206_PWM3_FUNC_PWM3 (MTK_PIN_NO(206) | 1)
|
||||
+
|
||||
+#define MT7623_PIN_207_PWM4_FUNC_GPIO207 (MTK_PIN_NO(207) | 0)
|
||||
+#define MT7623_PIN_207_PWM4_FUNC_PWM4 (MTK_PIN_NO(207) | 1)
|
||||
+
|
||||
+#define MT7623_PIN_208_AUD_EXT_CK1_FUNC_GPIO208 (MTK_PIN_NO(208) | 0)
|
||||
+#define MT7623_PIN_208_AUD_EXT_CK1_FUNC_AUD_EXT_CK1 (MTK_PIN_NO(208) | 1)
|
||||
+#define MT7623_PIN_208_AUD_EXT_CK1_FUNC_PWM0 (MTK_PIN_NO(208) | 2)
|
||||
+#define MT7623_PIN_208_AUD_EXT_CK1_FUNC_PCIE0_PERST_N (MTK_PIN_NO(208) | 3)
|
||||
+#define MT7623_PIN_208_AUD_EXT_CK1_FUNC_DISP_PWM (MTK_PIN_NO(208) | 5)
|
||||
+
|
||||
+#define MT7623_PIN_209_AUD_EXT_CK2_FUNC_GPIO209 (MTK_PIN_NO(209) | 0)
|
||||
+#define MT7623_PIN_209_AUD_EXT_CK2_FUNC_AUD_EXT_CK2 (MTK_PIN_NO(209) | 1)
|
||||
+#define MT7623_PIN_209_AUD_EXT_CK2_FUNC_MSDC1_WP (MTK_PIN_NO(209) | 2)
|
||||
+#define MT7623_PIN_209_AUD_EXT_CK2_FUNC_PCIE1_PERST_N (MTK_PIN_NO(209) | 3)
|
||||
+#define MT7623_PIN_209_AUD_EXT_CK2_FUNC_PWM1 (MTK_PIN_NO(209) | 5)
|
||||
+
|
||||
+#define MT7623_PIN_236_EXT_SDIO3_FUNC_GPIO236 (MTK_PIN_NO(236) | 0)
|
||||
+#define MT7623_PIN_236_EXT_SDIO3_FUNC_EXT_SDIO3 (MTK_PIN_NO(236) | 1)
|
||||
+#define MT7623_PIN_236_EXT_SDIO3_FUNC_IDDIG (MTK_PIN_NO(236) | 2)
|
||||
+
|
||||
+#define MT7623_PIN_237_EXT_SDIO2_FUNC_GPIO237 (MTK_PIN_NO(237) | 0)
|
||||
+#define MT7623_PIN_237_EXT_SDIO2_FUNC_EXT_SDIO2 (MTK_PIN_NO(237) | 1)
|
||||
+#define MT7623_PIN_237_EXT_SDIO2_FUNC_DRV_VBUS (MTK_PIN_NO(237) | 2)
|
||||
+
|
||||
+#define MT7623_PIN_238_EXT_SDIO1_FUNC_GPIO238 (MTK_PIN_NO(238) | 0)
|
||||
+#define MT7623_PIN_238_EXT_SDIO1_FUNC_EXT_SDIO1 (MTK_PIN_NO(238) | 1)
|
||||
+
|
||||
+#define MT7623_PIN_239_EXT_SDIO0_FUNC_GPIO239 (MTK_PIN_NO(239) | 0)
|
||||
+#define MT7623_PIN_239_EXT_SDIO0_FUNC_EXT_SDIO0 (MTK_PIN_NO(239) | 1)
|
||||
+
|
||||
+#define MT7623_PIN_240_EXT_XCS_FUNC_GPIO240 (MTK_PIN_NO(240) | 0)
|
||||
+#define MT7623_PIN_240_EXT_XCS_FUNC_EXT_XCS (MTK_PIN_NO(240) | 1)
|
||||
+
|
||||
+#define MT7623_PIN_241_EXT_SCK_FUNC_GPIO241 (MTK_PIN_NO(241) | 0)
|
||||
+#define MT7623_PIN_241_EXT_SCK_FUNC_EXT_SCK (MTK_PIN_NO(241) | 1)
|
||||
+
|
||||
+#define MT7623_PIN_242_URTS2_FUNC_GPIO242 (MTK_PIN_NO(242) | 0)
|
||||
+#define MT7623_PIN_242_URTS2_FUNC_URTS2 (MTK_PIN_NO(242) | 1)
|
||||
+#define MT7623_PIN_242_URTS2_FUNC_UTXD3 (MTK_PIN_NO(242) | 2)
|
||||
+#define MT7623_PIN_242_URTS2_FUNC_URXD3 (MTK_PIN_NO(242) | 3)
|
||||
+#define MT7623_PIN_242_URTS2_FUNC_SCL1 (MTK_PIN_NO(242) | 4)
|
||||
+
|
||||
+#define MT7623_PIN_243_UCTS2_FUNC_GPIO243 (MTK_PIN_NO(243) | 0)
|
||||
+#define MT7623_PIN_243_UCTS2_FUNC_UCTS2 (MTK_PIN_NO(243) | 1)
|
||||
+#define MT7623_PIN_243_UCTS2_FUNC_URXD3 (MTK_PIN_NO(243) | 2)
|
||||
+#define MT7623_PIN_243_UCTS2_FUNC_UTXD3 (MTK_PIN_NO(243) | 3)
|
||||
+#define MT7623_PIN_243_UCTS2_FUNC_SDA1 (MTK_PIN_NO(243) | 4)
|
||||
+
|
||||
+#define MT7623_PIN_250_GPIO250_FUNC_GPIO250 (MTK_PIN_NO(250) | 0)
|
||||
+#define MT7623_PIN_250_GPIO250_FUNC_TEST_MD7 (MTK_PIN_NO(250) | 1)
|
||||
+#define MT7623_PIN_250_GPIO250_FUNC_PCIE0_CLKREQ_N (MTK_PIN_NO(250) | 6)
|
||||
+
|
||||
+#define MT7623_PIN_251_GPIO251_FUNC_GPIO251 (MTK_PIN_NO(251) | 0)
|
||||
+#define MT7623_PIN_251_GPIO251_FUNC_TEST_MD6 (MTK_PIN_NO(251) | 1)
|
||||
+#define MT7623_PIN_251_GPIO251_FUNC_PCIE0_WAKE_N (MTK_PIN_NO(251) | 6)
|
||||
+
|
||||
+#define MT7623_PIN_252_GPIO252_FUNC_GPIO252 (MTK_PIN_NO(252) | 0)
|
||||
+#define MT7623_PIN_252_GPIO252_FUNC_TEST_MD5 (MTK_PIN_NO(252) | 1)
|
||||
+#define MT7623_PIN_252_GPIO252_FUNC_PCIE1_CLKREQ_N (MTK_PIN_NO(252) | 6)
|
||||
+
|
||||
+#define MT7623_PIN_253_GPIO253_FUNC_GPIO253 (MTK_PIN_NO(253) | 0)
|
||||
+#define MT7623_PIN_253_GPIO253_FUNC_TEST_MD4 (MTK_PIN_NO(253) | 1)
|
||||
+#define MT7623_PIN_253_GPIO253_FUNC_PCIE1_WAKE_N (MTK_PIN_NO(253) | 6)
|
||||
+
|
||||
+#define MT7623_PIN_254_GPIO254_FUNC_GPIO254 (MTK_PIN_NO(254) | 0)
|
||||
+#define MT7623_PIN_254_GPIO254_FUNC_TEST_MD3 (MTK_PIN_NO(254) | 1)
|
||||
+#define MT7623_PIN_254_GPIO254_FUNC_PCIE2_CLKREQ_N (MTK_PIN_NO(254) | 6)
|
||||
+
|
||||
+#define MT7623_PIN_255_GPIO255_FUNC_GPIO255 (MTK_PIN_NO(255) | 0)
|
||||
+#define MT7623_PIN_255_GPIO255_FUNC_TEST_MD2 (MTK_PIN_NO(255) | 1)
|
||||
+#define MT7623_PIN_255_GPIO255_FUNC_PCIE2_WAKE_N (MTK_PIN_NO(255) | 6)
|
||||
+
|
||||
+#define MT7623_PIN_256_GPIO256_FUNC_GPIO256 (MTK_PIN_NO(256) | 0)
|
||||
+#define MT7623_PIN_256_GPIO256_FUNC_TEST_MD1 (MTK_PIN_NO(256) | 1)
|
||||
+
|
||||
+#define MT7623_PIN_257_GPIO257_FUNC_GPIO257 (MTK_PIN_NO(257) | 0)
|
||||
+#define MT7623_PIN_257_GPIO257_FUNC_TEST_MD0 (MTK_PIN_NO(257) | 1)
|
||||
+
|
||||
+#define MT7623_PIN_261_MSDC1_INS_FUNC_GPIO261 (MTK_PIN_NO(261) | 0)
|
||||
+#define MT7623_PIN_261_MSDC1_INS_FUNC_MSDC1_INS (MTK_PIN_NO(261) | 1)
|
||||
+
|
||||
+#define MT7623_PIN_262_G2_TXEN_FUNC_GPIO262 (MTK_PIN_NO(262) | 0)
|
||||
+#define MT7623_PIN_262_G2_TXEN_FUNC_G2_TXEN (MTK_PIN_NO(262) | 1)
|
||||
+
|
||||
+#define MT7623_PIN_263_G2_TXD3_FUNC_GPIO263 (MTK_PIN_NO(263) | 0)
|
||||
+#define MT7623_PIN_263_G2_TXD3_FUNC_G2_TXD3 (MTK_PIN_NO(263) | 1)
|
||||
+
|
||||
+#define MT7623_PIN_264_G2_TXD2_FUNC_GPIO264 (MTK_PIN_NO(264) | 0)
|
||||
+#define MT7623_PIN_264_G2_TXD2_FUNC_G2_TXD2 (MTK_PIN_NO(264) | 1)
|
||||
+
|
||||
+#define MT7623_PIN_265_G2_TXD1_FUNC_GPIO265 (MTK_PIN_NO(265) | 0)
|
||||
+#define MT7623_PIN_265_G2_TXD1_FUNC_G2_TXD1 (MTK_PIN_NO(265) | 1)
|
||||
+
|
||||
+#define MT7623_PIN_266_G2_TXD0_FUNC_GPIO266 (MTK_PIN_NO(266) | 0)
|
||||
+#define MT7623_PIN_266_G2_TXD0_FUNC_G2_TXD0 (MTK_PIN_NO(266) | 1)
|
||||
+
|
||||
+#define MT7623_PIN_267_G2_TXCLK_FUNC_GPIO267 (MTK_PIN_NO(267) | 0)
|
||||
+#define MT7623_PIN_267_G2_TXCLK_FUNC_G2_TXC (MTK_PIN_NO(267) | 1)
|
||||
+
|
||||
+#define MT7623_PIN_268_G2_RXCLK_FUNC_GPIO268 (MTK_PIN_NO(268) | 0)
|
||||
+#define MT7623_PIN_268_G2_RXCLK_FUNC_G2_RXC (MTK_PIN_NO(268) | 1)
|
||||
+
|
||||
+#define MT7623_PIN_269_G2_RXD0_FUNC_GPIO269 (MTK_PIN_NO(269) | 0)
|
||||
+#define MT7623_PIN_269_G2_RXD0_FUNC_G2_RXD0 (MTK_PIN_NO(269) | 1)
|
||||
+
|
||||
+#define MT7623_PIN_270_G2_RXD1_FUNC_GPIO270 (MTK_PIN_NO(270) | 0)
|
||||
+#define MT7623_PIN_270_G2_RXD1_FUNC_G2_RXD1 (MTK_PIN_NO(270) | 1)
|
||||
+
|
||||
+#define MT7623_PIN_271_G2_RXD2_FUNC_GPIO271 (MTK_PIN_NO(271) | 0)
|
||||
+#define MT7623_PIN_271_G2_RXD2_FUNC_G2_RXD2 (MTK_PIN_NO(271) | 1)
|
||||
+
|
||||
+#define MT7623_PIN_272_G2_RXD3_FUNC_GPIO272 (MTK_PIN_NO(272) | 0)
|
||||
+#define MT7623_PIN_272_G2_RXD3_FUNC_G2_RXD3 (MTK_PIN_NO(272) | 1)
|
||||
+
|
||||
+#define MT7623_PIN_274_G2_RXDV_FUNC_GPIO274 (MTK_PIN_NO(274) | 0)
|
||||
+#define MT7623_PIN_274_G2_RXDV_FUNC_G2_RXDV (MTK_PIN_NO(274) | 1)
|
||||
+
|
||||
+#define MT7623_PIN_275_G2_MDC_FUNC_GPIO275 (MTK_PIN_NO(275) | 0)
|
||||
+#define MT7623_PIN_275_G2_MDC_FUNC_MDC (MTK_PIN_NO(275) | 1)
|
||||
+
|
||||
+#define MT7623_PIN_276_G2_MDIO_FUNC_GPIO276 (MTK_PIN_NO(276) | 0)
|
||||
+#define MT7623_PIN_276_G2_MDIO_FUNC_MDIO (MTK_PIN_NO(276) | 1)
|
||||
+
|
||||
+#define MT7623_PIN_278_JTAG_RESET_FUNC_GPIO278 (MTK_PIN_NO(278) | 0)
|
||||
+#define MT7623_PIN_278_JTAG_RESET_FUNC_JTAG_RESET (MTK_PIN_NO(278) | 1)
|
||||
+
|
||||
+#endif /* __DTS_MT7623_PINFUNC_H */
|
||||
+
|
File diff suppressed because it is too large
Load diff
|
@ -1,69 +0,0 @@
|
|||
From ba126a519da8a036dae0032e9d5a89e47570e5fb Mon Sep 17 00:00:00 2001
|
||||
From: "chunfeng.yun@mediatek.com" <chunfeng.yun@mediatek.com>
|
||||
Date: Tue, 17 Nov 2015 17:18:39 +0800
|
||||
Subject: [PATCH 018/102] dt-bindings: Add a binding for Mediatek xHCI host
|
||||
controller
|
||||
|
||||
add a DT binding documentation of xHCI host controller for the
|
||||
MT8173 SoC from Mediatek.
|
||||
|
||||
Signed-off-by: Chunfeng Yun <chunfeng.yun@mediatek.com>
|
||||
---
|
||||
.../devicetree/bindings/usb/mt8173-xhci.txt | 51 ++++++++++++++++++++
|
||||
1 file changed, 51 insertions(+)
|
||||
create mode 100644 Documentation/devicetree/bindings/usb/mt8173-xhci.txt
|
||||
|
||||
--- /dev/null
|
||||
+++ b/Documentation/devicetree/bindings/usb/mt8173-xhci.txt
|
||||
@@ -0,0 +1,51 @@
|
||||
+MT8173 xHCI
|
||||
+
|
||||
+The device node for Mediatek SOC USB3.0 host controller
|
||||
+
|
||||
+Required properties:
|
||||
+ - compatible : should contain "mediatek,mt8173-xhci"
|
||||
+ - reg : specifies physical base address and size of the registers,
|
||||
+ the first one for MAC, the second for IPPC
|
||||
+ - interrupts : interrupt used by the controller
|
||||
+ - power-domains : a phandle to USB power domain node to control USB's
|
||||
+ mtcmos
|
||||
+ - vusb33-supply : regulator of USB avdd3.3v
|
||||
+
|
||||
+ - clocks : a list of phandle + clock-specifier pairs, one for each
|
||||
+ entry in clock-names
|
||||
+ - clock-names : must contain
|
||||
+ "sys_ck": for clock of xHCI MAC
|
||||
+ "wakeup_deb_p0": for USB wakeup debounce clock of port0
|
||||
+ "wakeup_deb_p0": for USB wakeup debounce clock of port1
|
||||
+
|
||||
+ - phys : a list of phandle + phy specifier pairs
|
||||
+
|
||||
+Optional properties:
|
||||
+ - mediatek,wakeup-src : 1: ip sleep wakeup mode; 2: line state wakeup
|
||||
+ mode;
|
||||
+ - mediatek,syscon-wakeup : phandle to syscon used to access USB wakeup
|
||||
+ control register, it depends on "mediatek,wakeup-src".
|
||||
+ - vbus-supply : reference to the VBUS regulator;
|
||||
+ - usb3-lpm-capable : supports USB3.0 LPM
|
||||
+
|
||||
+Example:
|
||||
+usb30: usb@11270000 {
|
||||
+ compatible = "mediatek,mt8173-xhci";
|
||||
+ reg = <0 0x11270000 0 0x1000>,
|
||||
+ <0 0x11280700 0 0x0100>;
|
||||
+ interrupts = <GIC_SPI 115 IRQ_TYPE_LEVEL_LOW>;
|
||||
+ power-domains = <&scpsys MT8173_POWER_DOMAIN_USB>;
|
||||
+ clocks = <&topckgen CLK_TOP_USB30_SEL>,
|
||||
+ <&pericfg CLK_PERI_USB0>,
|
||||
+ <&pericfg CLK_PERI_USB1>;
|
||||
+ clock-names = "sys_ck",
|
||||
+ "wakeup_deb_p0",
|
||||
+ "wakeup_deb_p1";
|
||||
+ phys = <&phy_port0 PHY_TYPE_USB3>,
|
||||
+ <&phy_port1 PHY_TYPE_USB2>;
|
||||
+ vusb33-supply = <&mt6397_vusb_reg>;
|
||||
+ vbus-supply = <&usb_p1_vbus>;
|
||||
+ usb3-lpm-capable;
|
||||
+ mediatek,syscon-wakeup = <&pericfg>;
|
||||
+ mediatek,wakeup-src = <1>;
|
||||
+};
|
File diff suppressed because it is too large
Load diff
|
@ -1,107 +0,0 @@
|
|||
From 645465d4c6dd46c5e6c9ac25cd42608b4201fde0 Mon Sep 17 00:00:00 2001
|
||||
From: "chunfeng.yun@mediatek.com" <chunfeng.yun@mediatek.com>
|
||||
Date: Tue, 17 Nov 2015 17:18:41 +0800
|
||||
Subject: [PATCH 020/102] arm64: dts: mediatek: add xHCI & usb phy for mt8173
|
||||
|
||||
add xHCI and phy drivers for MT8173-EVB
|
||||
|
||||
Signed-off-by: Chunfeng Yun <chunfeng.yun@mediatek.com>
|
||||
---
|
||||
arch/arm64/boot/dts/mediatek/mt8173-evb.dts | 16 ++++++++++
|
||||
arch/arm64/boot/dts/mediatek/mt8173.dtsi | 42 +++++++++++++++++++++++++++
|
||||
2 files changed, 58 insertions(+)
|
||||
|
||||
--- a/arch/arm64/boot/dts/mediatek/mt8173-evb.dts
|
||||
+++ b/arch/arm64/boot/dts/mediatek/mt8173-evb.dts
|
||||
@@ -13,6 +13,7 @@
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
+#include <dt-bindings/gpio/gpio.h>
|
||||
#include "mt8173.dtsi"
|
||||
|
||||
/ {
|
||||
@@ -32,6 +33,15 @@
|
||||
};
|
||||
|
||||
chosen { };
|
||||
+
|
||||
+ usb_p1_vbus: regulator@0 {
|
||||
+ compatible = "regulator-fixed";
|
||||
+ regulator-name = "usb_vbus";
|
||||
+ regulator-min-microvolt = <5000000>;
|
||||
+ regulator-max-microvolt = <5000000>;
|
||||
+ gpio = <&pio 130 GPIO_ACTIVE_HIGH>;
|
||||
+ enable-active-high;
|
||||
+ };
|
||||
};
|
||||
|
||||
&i2c1 {
|
||||
@@ -408,3 +418,9 @@
|
||||
&uart0 {
|
||||
status = "okay";
|
||||
};
|
||||
+
|
||||
+&usb30 {
|
||||
+ vusb33-supply = <&mt6397_vusb_reg>;
|
||||
+ vbus-supply = <&usb_p1_vbus>;
|
||||
+ mediatek,wakeup-src = <1>;
|
||||
+};
|
||||
--- a/arch/arm64/boot/dts/mediatek/mt8173.dtsi
|
||||
+++ b/arch/arm64/boot/dts/mediatek/mt8173.dtsi
|
||||
@@ -14,6 +14,7 @@
|
||||
#include <dt-bindings/clock/mt8173-clk.h>
|
||||
#include <dt-bindings/interrupt-controller/irq.h>
|
||||
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||
+#include <dt-bindings/phy/phy.h>
|
||||
#include <dt-bindings/power/mt8173-power.h>
|
||||
#include <dt-bindings/reset-controller/mt8173-resets.h>
|
||||
#include "mt8173-pinfunc.h"
|
||||
@@ -510,6 +511,47 @@
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
+ usb30: usb@11270000 {
|
||||
+ compatible = "mediatek,mt8173-xhci";
|
||||
+ reg = <0 0x11270000 0 0x1000>,
|
||||
+ <0 0x11280700 0 0x0100>;
|
||||
+ interrupts = <GIC_SPI 115 IRQ_TYPE_LEVEL_LOW>;
|
||||
+ power-domains = <&scpsys MT8173_POWER_DOMAIN_USB>;
|
||||
+ clocks = <&topckgen CLK_TOP_USB30_SEL>,
|
||||
+ <&pericfg CLK_PERI_USB0>,
|
||||
+ <&pericfg CLK_PERI_USB1>;
|
||||
+ clock-names = "sys_ck",
|
||||
+ "wakeup_deb_p0",
|
||||
+ "wakeup_deb_p1";
|
||||
+ phys = <&phy_port0 PHY_TYPE_USB3>,
|
||||
+ <&phy_port1 PHY_TYPE_USB2>;
|
||||
+ mediatek,syscon-wakeup = <&pericfg>;
|
||||
+ status = "okay";
|
||||
+ };
|
||||
+
|
||||
+ u3phy: usb-phy@11290000 {
|
||||
+ compatible = "mediatek,mt8173-u3phy";
|
||||
+ reg = <0 0x11290000 0 0x800>;
|
||||
+ clocks = <&apmixedsys CLK_APMIXED_REF2USB_TX>;
|
||||
+ clock-names = "u3phya_ref";
|
||||
+ #address-cells = <2>;
|
||||
+ #size-cells = <2>;
|
||||
+ ranges;
|
||||
+ status = "okay";
|
||||
+
|
||||
+ phy_port0: port@11290800 {
|
||||
+ reg = <0 0x11290800 0 0x800>;
|
||||
+ #phy-cells = <1>;
|
||||
+ status = "okay";
|
||||
+ };
|
||||
+
|
||||
+ phy_port1: port@11291000 {
|
||||
+ reg = <0 0x11291000 0 0x800>;
|
||||
+ #phy-cells = <1>;
|
||||
+ status = "okay";
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
mmsys: clock-controller@14000000 {
|
||||
compatible = "mediatek,mt8173-mmsys", "syscon";
|
||||
reg = <0 0x14000000 0 0x1000>;
|
|
@ -1,55 +0,0 @@
|
|||
From e111a35542ac14712026fe1a55236f76c7fc9048 Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <blogic@openwrt.org>
|
||||
Date: Tue, 5 Jan 2016 12:13:54 +0100
|
||||
Subject: [PATCH 021/102] Document: DT: Add bindings for mediatek MT7623 SoC
|
||||
Platform
|
||||
|
||||
This adds a DT binding documentation for the MT7623 SoC from Mediatek.
|
||||
|
||||
Signed-off-by: John Crispin <blogic@openwrt.org>
|
||||
---
|
||||
Documentation/devicetree/bindings/arm/mediatek.txt | 4 ++++
|
||||
Documentation/devicetree/bindings/serial/mtk-uart.txt | 1 +
|
||||
Documentation/devicetree/bindings/timer/mediatek,mtk-timer.txt | 1 +
|
||||
3 files changed, 6 insertions(+)
|
||||
|
||||
--- a/Documentation/devicetree/bindings/arm/mediatek.txt
|
||||
+++ b/Documentation/devicetree/bindings/arm/mediatek.txt
|
||||
@@ -10,6 +10,7 @@ compatible: Must contain one of
|
||||
"mediatek,mt6589"
|
||||
"mediatek,mt6592"
|
||||
"mediatek,mt6795"
|
||||
+ "mediatek,mt7623"
|
||||
"mediatek,mt8127"
|
||||
"mediatek,mt8135"
|
||||
"mediatek,mt8173"
|
||||
@@ -29,6 +30,9 @@ Supported boards:
|
||||
- Evaluation board for MT6795(Helio X10):
|
||||
Required root node properties:
|
||||
- compatible = "mediatek,mt6795-evb", "mediatek,mt6795";
|
||||
+- Evaluation board for MT7623:
|
||||
+ Required root node properties:
|
||||
+ - compatible = "mediatek,mt7623-evb", "mediatek,mt7623";
|
||||
- MTK mt8127 tablet moose EVB:
|
||||
Required root node properties:
|
||||
- compatible = "mediatek,mt8127-moose", "mediatek,mt8127";
|
||||
--- a/Documentation/devicetree/bindings/serial/mtk-uart.txt
|
||||
+++ b/Documentation/devicetree/bindings/serial/mtk-uart.txt
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
Required properties:
|
||||
- compatible should contain:
|
||||
+ * "mediatek,mt7623-uart" for MT7623 compatible UARTS
|
||||
* "mediatek,mt8135-uart" for MT8135 compatible UARTS
|
||||
* "mediatek,mt8127-uart" for MT8127 compatible UARTS
|
||||
* "mediatek,mt8173-uart" for MT8173 compatible UARTS
|
||||
--- a/Documentation/devicetree/bindings/timer/mediatek,mtk-timer.txt
|
||||
+++ b/Documentation/devicetree/bindings/timer/mediatek,mtk-timer.txt
|
||||
@@ -5,6 +5,7 @@ Required properties:
|
||||
- compatible should contain:
|
||||
* "mediatek,mt6580-timer" for MT6580 compatible timers
|
||||
* "mediatek,mt6589-timer" for MT6589 compatible timers
|
||||
+ * "mediatek,mt7623-timer" for MT7623 compatible timers
|
||||
* "mediatek,mt8127-timer" for MT8127 compatible timers
|
||||
* "mediatek,mt8135-timer" for MT8135 compatible timers
|
||||
* "mediatek,mt8173-timer" for MT8173 compatible timers
|
|
@ -1,22 +0,0 @@
|
|||
From f232c3b36355974bf3442de3a4726d2e499ed3fe Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <blogic@openwrt.org>
|
||||
Date: Tue, 5 Jan 2016 16:52:31 +0100
|
||||
Subject: [PATCH 022/102] soc: mediatek: add compat string for mt7623 to
|
||||
scpsys
|
||||
|
||||
Signed-off-by: John Crispin <blogic@openwrt.org>
|
||||
---
|
||||
drivers/soc/mediatek/mtk-scpsys-mt2701.c | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
--- a/drivers/soc/mediatek/mtk-scpsys-mt2701.c
|
||||
+++ b/drivers/soc/mediatek/mtk-scpsys-mt2701.c
|
||||
@@ -136,6 +136,8 @@ static const struct of_device_id of_scps
|
||||
{
|
||||
.compatible = "mediatek,mt2701-scpsys",
|
||||
}, {
|
||||
+ .compatible = "mediatek,mt7623-scpsys",
|
||||
+ }, {
|
||||
/* sentinel */
|
||||
}
|
||||
};
|
File diff suppressed because it is too large
Load diff
|
@ -1,56 +0,0 @@
|
|||
From 59aafd667d2880c90776931b6102b8252214d93c Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <blogic@openwrt.org>
|
||||
Date: Sun, 21 Feb 2016 13:52:12 +0100
|
||||
Subject: [PATCH 026/102] scpsys: various fixes
|
||||
|
||||
---
|
||||
drivers/clk/mediatek/clk-mt2701.c | 2 ++
|
||||
drivers/soc/mediatek/mtk-scpsys-mt2701.c | 8 --------
|
||||
include/dt-bindings/power/mt2701-power.h | 4 ++--
|
||||
3 files changed, 4 insertions(+), 10 deletions(-)
|
||||
|
||||
--- a/drivers/clk/mediatek/clk-mt2701.c
|
||||
+++ b/drivers/clk/mediatek/clk-mt2701.c
|
||||
@@ -1043,6 +1043,8 @@ static void __init mtk_ethsys_init(struc
|
||||
if (r)
|
||||
pr_err("%s(): could not register clock provider: %d\n",
|
||||
__func__, r);
|
||||
+
|
||||
+ mtk_register_reset_controller(node, 1, 0x34);
|
||||
}
|
||||
CLK_OF_DECLARE(mtk_ethsys, "mediatek,mt2701-ethsys", mtk_ethsys_init);
|
||||
|
||||
--- a/drivers/soc/mediatek/mtk-scpsys-mt2701.c
|
||||
+++ b/drivers/soc/mediatek/mtk-scpsys-mt2701.c
|
||||
@@ -61,14 +61,6 @@ static const struct scp_domain_data scp_
|
||||
.bus_prot_mask = MT2701_TOP_AXI_PROT_EN_DISP,
|
||||
.active_wakeup = true,
|
||||
},
|
||||
- [MT2701_POWER_DOMAIN_MFG] = {
|
||||
- .name = "mfg",
|
||||
- .sta_mask = MFG_PWR_STA_MASK,
|
||||
- .ctl_offs = SPM_MFG_PWR_CON,
|
||||
- .sram_pdn_bits = GENMASK(11, 8),
|
||||
- .sram_pdn_ack_bits = GENMASK(12, 12),
|
||||
- .active_wakeup = true,
|
||||
- },
|
||||
[MT2701_POWER_DOMAIN_VDEC] = {
|
||||
.name = "vdec",
|
||||
.sta_mask = VDE_PWR_STA_MASK,
|
||||
--- a/include/dt-bindings/power/mt2701-power.h
|
||||
+++ b/include/dt-bindings/power/mt2701-power.h
|
||||
@@ -16,12 +16,12 @@
|
||||
|
||||
#define MT2701_POWER_DOMAIN_CONN 0
|
||||
#define MT2701_POWER_DOMAIN_DISP 1
|
||||
-#define MT2701_POWER_DOMAIN_MFG 2
|
||||
+//#define MT2701_POWER_DOMAIN_MFG 2
|
||||
#define MT2701_POWER_DOMAIN_VDEC 3
|
||||
#define MT2701_POWER_DOMAIN_ISP 4
|
||||
#define MT2701_POWER_DOMAIN_BDP 5
|
||||
#define MT2701_POWER_DOMAIN_ETH 6
|
||||
#define MT2701_POWER_DOMAIN_HIF 7
|
||||
-#define MT2701_POWER_DOMAIN_IFR_MSC 8
|
||||
+#define MT2701_POWER_DOMAIN_IFR_MSC 2
|
||||
|
||||
#endif /* _DT_BINDINGS_POWER_MT2701_POWER_H */
|
|
@ -1,69 +0,0 @@
|
|||
From 55231d8299d3dccde8588ed2e86c2bc0ef2e12ce Mon Sep 17 00:00:00 2001
|
||||
From: Henry Chen <henryc.chen@mediatek.com>
|
||||
Date: Mon, 4 Jan 2016 20:02:52 +0800
|
||||
Subject: [PATCH 027/102] soc: mediatek: PMIC wrap: Clear the vldclr if state
|
||||
machine stay on FSM_VLDCLR state.
|
||||
|
||||
Sometimes PMIC is too busy to send data in time to cause pmic wrap timeout,
|
||||
because pmic wrap is waiting for FSM_VLDCLR after finishing WACS2_CMD. It
|
||||
just return error when issue happened, so the state machine will stay on
|
||||
FSM_VLDCLR state when data send back later by PMIC and timeout again in next
|
||||
time because pmic wrap waiting for FSM_IDLE state at the beginning of the
|
||||
read/write function.
|
||||
|
||||
Clear the vldclr when timeout if state machine stay on FSM_VLDCLR.
|
||||
|
||||
Signed-off-by: Henry Chen <henryc.chen@mediatek.com>
|
||||
Tested-by: Ricky Liang <jcliang@chromium.org>
|
||||
Signed-off-by: Matthias Brugger <matthias.bgg@gmail.com>
|
||||
---
|
||||
drivers/soc/mediatek/mtk-pmic-wrap.c | 22 ++++++++++++++++++++--
|
||||
1 file changed, 20 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/soc/mediatek/mtk-pmic-wrap.c
|
||||
+++ b/drivers/soc/mediatek/mtk-pmic-wrap.c
|
||||
@@ -412,6 +412,20 @@ static bool pwrap_is_fsm_vldclr(struct p
|
||||
return PWRAP_GET_WACS_FSM(val) == PWRAP_WACS_FSM_WFVLDCLR;
|
||||
}
|
||||
|
||||
+/*
|
||||
+ * Timeout issue sometimes caused by the last read command
|
||||
+ * failed because pmic wrap could not got the FSM_VLDCLR
|
||||
+ * in time after finishing WACS2_CMD. It made state machine
|
||||
+ * still on FSM_VLDCLR and timeout next time.
|
||||
+ * Check the status of FSM and clear the vldclr to recovery the
|
||||
+ * error.
|
||||
+ */
|
||||
+static inline void pwrap_leave_fsm_vldclr(struct pmic_wrapper *wrp)
|
||||
+{
|
||||
+ if (pwrap_is_fsm_vldclr(wrp))
|
||||
+ pwrap_writel(wrp, 1, PWRAP_WACS2_VLDCLR);
|
||||
+}
|
||||
+
|
||||
static bool pwrap_is_sync_idle(struct pmic_wrapper *wrp)
|
||||
{
|
||||
return pwrap_readl(wrp, PWRAP_WACS2_RDATA) & PWRAP_STATE_SYNC_IDLE0;
|
||||
@@ -445,8 +459,10 @@ static int pwrap_write(struct pmic_wrapp
|
||||
int ret;
|
||||
|
||||
ret = pwrap_wait_for_state(wrp, pwrap_is_fsm_idle);
|
||||
- if (ret)
|
||||
+ if (ret) {
|
||||
+ pwrap_leave_fsm_vldclr(wrp);
|
||||
return ret;
|
||||
+ }
|
||||
|
||||
pwrap_writel(wrp, (1 << 31) | ((adr >> 1) << 16) | wdata,
|
||||
PWRAP_WACS2_CMD);
|
||||
@@ -459,8 +475,10 @@ static int pwrap_read(struct pmic_wrappe
|
||||
int ret;
|
||||
|
||||
ret = pwrap_wait_for_state(wrp, pwrap_is_fsm_idle);
|
||||
- if (ret)
|
||||
+ if (ret) {
|
||||
+ pwrap_leave_fsm_vldclr(wrp);
|
||||
return ret;
|
||||
+ }
|
||||
|
||||
pwrap_writel(wrp, (adr >> 1) << 16, PWRAP_WACS2_CMD);
|
||||
|
|
@ -1,36 +0,0 @@
|
|||
From d088a94afc768683a881b627b6737442158e7db6 Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <blogic@openwrt.org>
|
||||
Date: Tue, 5 Jan 2016 17:24:28 +0100
|
||||
Subject: [PATCH 028/102] ARM: mediatek: add MT7623 smp bringup code
|
||||
|
||||
Add support for booting secondary CPUs on MT7623.
|
||||
|
||||
Signed-off-by: John Crispin <blogic@openwrt.org>
|
||||
Signed-off-by: Matthias Brugger <matthias.bgg@gmail.com>
|
||||
---
|
||||
arch/arm/mach-mediatek/platsmp.c | 7 +++++++
|
||||
1 file changed, 7 insertions(+)
|
||||
|
||||
--- a/arch/arm/mach-mediatek/platsmp.c
|
||||
+++ b/arch/arm/mach-mediatek/platsmp.c
|
||||
@@ -44,6 +44,12 @@ static const struct mtk_smp_boot_info mt
|
||||
{ 0x38, 0x3c, 0x40 },
|
||||
};
|
||||
|
||||
+static const struct mtk_smp_boot_info mtk_mt7623_boot = {
|
||||
+ 0x10202000, 0x34,
|
||||
+ { 0x534c4131, 0x4c415332, 0x41534c33 },
|
||||
+ { 0x38, 0x3c, 0x40 },
|
||||
+};
|
||||
+
|
||||
static const struct of_device_id mtk_tz_smp_boot_infos[] __initconst = {
|
||||
{ .compatible = "mediatek,mt8135", .data = &mtk_mt8135_tz_boot },
|
||||
{ .compatible = "mediatek,mt8127", .data = &mtk_mt8135_tz_boot },
|
||||
@@ -51,6 +57,7 @@ static const struct of_device_id mtk_tz_
|
||||
|
||||
static const struct of_device_id mtk_smp_boot_infos[] __initconst = {
|
||||
{ .compatible = "mediatek,mt6589", .data = &mtk_mt6589_boot },
|
||||
+ { .compatible = "mediatek,mt7623", .data = &mtk_mt7623_boot },
|
||||
};
|
||||
|
||||
static void __iomem *mtk_smp_base;
|
|
@ -1,58 +0,0 @@
|
|||
From b92861fbc79b3a7a9bc1c51e2dbfa2c191cc27ea Mon Sep 17 00:00:00 2001
|
||||
From: Henry Chen <henryc.chen@mediatek.com>
|
||||
Date: Thu, 21 Jan 2016 19:04:00 +0800
|
||||
Subject: [PATCH 029/102] soc: mediatek: PMIC wrap: clear the STAUPD_TRIG bit
|
||||
of WDT_SRC_EN
|
||||
|
||||
Since STAUPD interrupts aren't handled on mt8173, disable watchdog timeout
|
||||
monitor of STAUPD to avoid WDT_INT triggered by STAUPD.
|
||||
|
||||
Signed-off-by: Henry Chen <henryc.chen@mediatek.com>
|
||||
Reviewed-by: Daniel Kurtz <djkurtz@chromium.org>
|
||||
Signed-off-by: Matthias Brugger <matthias.bgg@gmail.com>
|
||||
---
|
||||
drivers/soc/mediatek/mtk-pmic-wrap.c | 19 +++++++++++++++++--
|
||||
1 file changed, 17 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/soc/mediatek/mtk-pmic-wrap.c
|
||||
+++ b/drivers/soc/mediatek/mtk-pmic-wrap.c
|
||||
@@ -60,6 +60,15 @@
|
||||
#define PWRAP_MAN_CMD_OP_OUTD (0x9 << 8)
|
||||
#define PWRAP_MAN_CMD_OP_OUTQ (0xa << 8)
|
||||
|
||||
+/* macro for Watch Dog Timer Source */
|
||||
+#define PWRAP_WDT_SRC_EN_STAUPD_TRIG (1 << 25)
|
||||
+#define PWRAP_WDT_SRC_EN_HARB_STAUPD_DLE (1 << 20)
|
||||
+#define PWRAP_WDT_SRC_EN_HARB_STAUPD_ALE (1 << 6)
|
||||
+#define PWRAP_WDT_SRC_MASK_ALL 0xffffffff
|
||||
+#define PWRAP_WDT_SRC_MASK_NO_STAUPD ~(PWRAP_WDT_SRC_EN_STAUPD_TRIG | \
|
||||
+ PWRAP_WDT_SRC_EN_HARB_STAUPD_DLE | \
|
||||
+ PWRAP_WDT_SRC_EN_HARB_STAUPD_ALE)
|
||||
+
|
||||
/* macro for slave device wrapper registers */
|
||||
#define PWRAP_DEW_BASE 0xbc00
|
||||
#define PWRAP_DEW_EVENT_OUT_EN (PWRAP_DEW_BASE + 0x0)
|
||||
@@ -822,7 +831,7 @@ MODULE_DEVICE_TABLE(of, of_pwrap_match_t
|
||||
|
||||
static int pwrap_probe(struct platform_device *pdev)
|
||||
{
|
||||
- int ret, irq;
|
||||
+ int ret, irq, wdt_src;
|
||||
struct pmic_wrapper *wrp;
|
||||
struct device_node *np = pdev->dev.of_node;
|
||||
const struct of_device_id *of_id =
|
||||
@@ -912,7 +921,13 @@ static int pwrap_probe(struct platform_d
|
||||
|
||||
/* Initialize watchdog, may not be done by the bootloader */
|
||||
pwrap_writel(wrp, 0xf, PWRAP_WDT_UNIT);
|
||||
- pwrap_writel(wrp, 0xffffffff, PWRAP_WDT_SRC_EN);
|
||||
+ /*
|
||||
+ * Since STAUPD was not used on mt8173 platform,
|
||||
+ * so STAUPD of WDT_SRC which should be turned off
|
||||
+ */
|
||||
+ wdt_src = pwrap_is_mt8173(wrp) ?
|
||||
+ PWRAP_WDT_SRC_MASK_NO_STAUPD : PWRAP_WDT_SRC_MASK_ALL;
|
||||
+ pwrap_writel(wrp, wdt_src, PWRAP_WDT_SRC_EN);
|
||||
pwrap_writel(wrp, 0x1, PWRAP_TIMER_EN);
|
||||
pwrap_writel(wrp, ~((1 << 31) | (1 << 1)), PWRAP_INT_EN);
|
||||
|
|
@ -1,23 +0,0 @@
|
|||
From f88ec31c6ba3a006d0be87ff1d99145f8cc85bee Mon Sep 17 00:00:00 2001
|
||||
From: Louis Yu <louis.yu@mediatek.com>
|
||||
Date: Thu, 7 Jan 2016 20:09:43 +0800
|
||||
Subject: [PATCH 030/102] ARM: mediatek: add mt2701 smp bringup code
|
||||
|
||||
Add support for booting secondary CPUs on mt2701.
|
||||
|
||||
Signed-off-by: Louis Yu <louis.yu@mediatek.com>
|
||||
Signed-off-by: Matthias Brugger <matthias.bgg@gmail.com>
|
||||
---
|
||||
arch/arm/mach-mediatek/platsmp.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
--- a/arch/arm/mach-mediatek/platsmp.c
|
||||
+++ b/arch/arm/mach-mediatek/platsmp.c
|
||||
@@ -53,6 +53,7 @@ static const struct mtk_smp_boot_info mt
|
||||
static const struct of_device_id mtk_tz_smp_boot_infos[] __initconst = {
|
||||
{ .compatible = "mediatek,mt8135", .data = &mtk_mt8135_tz_boot },
|
||||
{ .compatible = "mediatek,mt8127", .data = &mtk_mt8135_tz_boot },
|
||||
+ { .compatible = "mediatek,mt2701", .data = &mtk_mt8135_tz_boot },
|
||||
};
|
||||
|
||||
static const struct of_device_id mtk_smp_boot_infos[] __initconst = {
|
|
@ -1,23 +0,0 @@
|
|||
From 15f4d895578f02cbaed10b0f5f6853b873aba10b Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <blogic@openwrt.org>
|
||||
Date: Wed, 20 Jan 2016 13:12:19 +0100
|
||||
Subject: [PATCH 031/102] dt-bindings: ARM: Mediatek: add MT2701/7623 string
|
||||
to the PMIC wrapper doc
|
||||
|
||||
Signed-off-by: John Crispin <blogic@openwrt.org>
|
||||
Acked-by: Rob Herring <robh@kernel.org>
|
||||
Cc: devicetree@vger.kernel.org
|
||||
---
|
||||
Documentation/devicetree/bindings/soc/mediatek/pwrap.txt | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
--- a/Documentation/devicetree/bindings/soc/mediatek/pwrap.txt
|
||||
+++ b/Documentation/devicetree/bindings/soc/mediatek/pwrap.txt
|
||||
@@ -18,6 +18,7 @@ IP Pairing
|
||||
|
||||
Required properties in pwrap device node.
|
||||
- compatible:
|
||||
+ "mediatek,mt2701-pwrap" for MT2701/7623 SoCs
|
||||
"mediatek,mt8135-pwrap" for MT8135 SoCs
|
||||
"mediatek,mt8173-pwrap" for MT8173 SoCs
|
||||
- interrupts: IRQ for pwrap in SOC
|
|
@ -1,93 +0,0 @@
|
|||
From 64e8091be39c3f0a7bf4651bd2045b8c86429d55 Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <blogic@openwrt.org>
|
||||
Date: Wed, 20 Jan 2016 06:42:01 +0100
|
||||
Subject: [PATCH 032/102] soc: mediatek: PMIC wrap: don't duplicate the
|
||||
wrapper data
|
||||
|
||||
As we add support for more devices struct pmic_wrapper_type will grow and
|
||||
we do not really want to start duplicating all the elements in
|
||||
struct pmic_wrapper.
|
||||
|
||||
Signed-off-by: John Crispin <blogic@openwrt.org>
|
||||
---
|
||||
drivers/soc/mediatek/mtk-pmic-wrap.c | 22 ++++++++--------------
|
||||
1 file changed, 8 insertions(+), 14 deletions(-)
|
||||
|
||||
--- a/drivers/soc/mediatek/mtk-pmic-wrap.c
|
||||
+++ b/drivers/soc/mediatek/mtk-pmic-wrap.c
|
||||
@@ -376,9 +376,7 @@ struct pmic_wrapper {
|
||||
struct device *dev;
|
||||
void __iomem *base;
|
||||
struct regmap *regmap;
|
||||
- int *regs;
|
||||
- enum pwrap_type type;
|
||||
- u32 arb_en_all;
|
||||
+ const struct pmic_wrapper_type *master;
|
||||
struct clk *clk_spi;
|
||||
struct clk *clk_wrap;
|
||||
struct reset_control *rstc;
|
||||
@@ -389,22 +387,22 @@ struct pmic_wrapper {
|
||||
|
||||
static inline int pwrap_is_mt8135(struct pmic_wrapper *wrp)
|
||||
{
|
||||
- return wrp->type == PWRAP_MT8135;
|
||||
+ return wrp->master->type == PWRAP_MT8135;
|
||||
}
|
||||
|
||||
static inline int pwrap_is_mt8173(struct pmic_wrapper *wrp)
|
||||
{
|
||||
- return wrp->type == PWRAP_MT8173;
|
||||
+ return wrp->master->type == PWRAP_MT8173;
|
||||
}
|
||||
|
||||
static u32 pwrap_readl(struct pmic_wrapper *wrp, enum pwrap_regs reg)
|
||||
{
|
||||
- return readl(wrp->base + wrp->regs[reg]);
|
||||
+ return readl(wrp->base + wrp->master->regs[reg]);
|
||||
}
|
||||
|
||||
static void pwrap_writel(struct pmic_wrapper *wrp, u32 val, enum pwrap_regs reg)
|
||||
{
|
||||
- writel(val, wrp->base + wrp->regs[reg]);
|
||||
+ writel(val, wrp->base + wrp->master->regs[reg]);
|
||||
}
|
||||
|
||||
static bool pwrap_is_fsm_idle(struct pmic_wrapper *wrp)
|
||||
@@ -697,7 +695,7 @@ static int pwrap_init(struct pmic_wrappe
|
||||
|
||||
pwrap_writel(wrp, 1, PWRAP_WRAP_EN);
|
||||
|
||||
- pwrap_writel(wrp, wrp->arb_en_all, PWRAP_HIPRIO_ARB_EN);
|
||||
+ pwrap_writel(wrp, wrp->master->arb_en_all, PWRAP_HIPRIO_ARB_EN);
|
||||
|
||||
pwrap_writel(wrp, 1, PWRAP_WACS2_EN);
|
||||
|
||||
@@ -742,7 +740,7 @@ static int pwrap_init(struct pmic_wrappe
|
||||
pwrap_writel(wrp, 0x1, PWRAP_CRC_EN);
|
||||
pwrap_writel(wrp, 0x0, PWRAP_SIG_MODE);
|
||||
pwrap_writel(wrp, PWRAP_DEW_CRC_VAL, PWRAP_SIG_ADR);
|
||||
- pwrap_writel(wrp, wrp->arb_en_all, PWRAP_HIPRIO_ARB_EN);
|
||||
+ pwrap_writel(wrp, wrp->master->arb_en_all, PWRAP_HIPRIO_ARB_EN);
|
||||
|
||||
if (pwrap_is_mt8135(wrp))
|
||||
pwrap_writel(wrp, 0x7, PWRAP_RRARB_EN);
|
||||
@@ -836,7 +834,6 @@ static int pwrap_probe(struct platform_d
|
||||
struct device_node *np = pdev->dev.of_node;
|
||||
const struct of_device_id *of_id =
|
||||
of_match_device(of_pwrap_match_tbl, &pdev->dev);
|
||||
- const struct pmic_wrapper_type *type;
|
||||
struct resource *res;
|
||||
|
||||
wrp = devm_kzalloc(&pdev->dev, sizeof(*wrp), GFP_KERNEL);
|
||||
@@ -845,10 +842,7 @@ static int pwrap_probe(struct platform_d
|
||||
|
||||
platform_set_drvdata(pdev, wrp);
|
||||
|
||||
- type = of_id->data;
|
||||
- wrp->regs = type->regs;
|
||||
- wrp->type = type->type;
|
||||
- wrp->arb_en_all = type->arb_en_all;
|
||||
+ wrp->master = of_id->data;
|
||||
wrp->dev = &pdev->dev;
|
||||
|
||||
res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "pwrap");
|
|
@ -1,122 +0,0 @@
|
|||
From 756b919b7874cc241a276b4fc5bbec5b3fb4bca8 Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <blogic@openwrt.org>
|
||||
Date: Wed, 20 Jan 2016 05:27:17 +0100
|
||||
Subject: [PATCH 033/102] soc: mediatek: PMIC wrap: add wrapper callbacks for
|
||||
init_reg_clock
|
||||
|
||||
Split init_reg_clock up into SoC specific callbacks. The patch also
|
||||
reorders the code to avoid the need for callback function prototypes.
|
||||
|
||||
Signed-off-by: John Crispin <blogic@openwrt.org>
|
||||
---
|
||||
drivers/soc/mediatek/mtk-pmic-wrap.c | 70 ++++++++++++++++++----------------
|
||||
1 file changed, 38 insertions(+), 32 deletions(-)
|
||||
|
||||
--- a/drivers/soc/mediatek/mtk-pmic-wrap.c
|
||||
+++ b/drivers/soc/mediatek/mtk-pmic-wrap.c
|
||||
@@ -354,24 +354,6 @@ enum pwrap_type {
|
||||
PWRAP_MT8173,
|
||||
};
|
||||
|
||||
-struct pmic_wrapper_type {
|
||||
- int *regs;
|
||||
- enum pwrap_type type;
|
||||
- u32 arb_en_all;
|
||||
-};
|
||||
-
|
||||
-static struct pmic_wrapper_type pwrap_mt8135 = {
|
||||
- .regs = mt8135_regs,
|
||||
- .type = PWRAP_MT8135,
|
||||
- .arb_en_all = 0x1ff,
|
||||
-};
|
||||
-
|
||||
-static struct pmic_wrapper_type pwrap_mt8173 = {
|
||||
- .regs = mt8173_regs,
|
||||
- .type = PWRAP_MT8173,
|
||||
- .arb_en_all = 0x3f,
|
||||
-};
|
||||
-
|
||||
struct pmic_wrapper {
|
||||
struct device *dev;
|
||||
void __iomem *base;
|
||||
@@ -385,6 +367,13 @@ struct pmic_wrapper {
|
||||
void __iomem *bridge_base;
|
||||
};
|
||||
|
||||
+struct pmic_wrapper_type {
|
||||
+ int *regs;
|
||||
+ enum pwrap_type type;
|
||||
+ u32 arb_en_all;
|
||||
+ int (*init_reg_clock)(struct pmic_wrapper *wrp);
|
||||
+};
|
||||
+
|
||||
static inline int pwrap_is_mt8135(struct pmic_wrapper *wrp)
|
||||
{
|
||||
return wrp->master->type == PWRAP_MT8135;
|
||||
@@ -578,20 +567,23 @@ static int pwrap_init_sidly(struct pmic_
|
||||
return 0;
|
||||
}
|
||||
|
||||
-static int pwrap_init_reg_clock(struct pmic_wrapper *wrp)
|
||||
+static int pwrap_mt8135_init_reg_clock(struct pmic_wrapper *wrp)
|
||||
{
|
||||
- if (pwrap_is_mt8135(wrp)) {
|
||||
- pwrap_writel(wrp, 0x4, PWRAP_CSHEXT);
|
||||
- pwrap_writel(wrp, 0x0, PWRAP_CSHEXT_WRITE);
|
||||
- pwrap_writel(wrp, 0x4, PWRAP_CSHEXT_READ);
|
||||
- pwrap_writel(wrp, 0x0, PWRAP_CSLEXT_START);
|
||||
- pwrap_writel(wrp, 0x0, PWRAP_CSLEXT_END);
|
||||
- } else {
|
||||
- pwrap_writel(wrp, 0x0, PWRAP_CSHEXT_WRITE);
|
||||
- pwrap_writel(wrp, 0x4, PWRAP_CSHEXT_READ);
|
||||
- pwrap_writel(wrp, 0x2, PWRAP_CSLEXT_START);
|
||||
- pwrap_writel(wrp, 0x2, PWRAP_CSLEXT_END);
|
||||
- }
|
||||
+ pwrap_writel(wrp, 0x4, PWRAP_CSHEXT);
|
||||
+ pwrap_writel(wrp, 0x0, PWRAP_CSHEXT_WRITE);
|
||||
+ pwrap_writel(wrp, 0x4, PWRAP_CSHEXT_READ);
|
||||
+ pwrap_writel(wrp, 0x0, PWRAP_CSLEXT_START);
|
||||
+ pwrap_writel(wrp, 0x0, PWRAP_CSLEXT_END);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int pwrap_mt8173_init_reg_clock(struct pmic_wrapper *wrp)
|
||||
+{
|
||||
+ pwrap_writel(wrp, 0x0, PWRAP_CSHEXT_WRITE);
|
||||
+ pwrap_writel(wrp, 0x4, PWRAP_CSHEXT_READ);
|
||||
+ pwrap_writel(wrp, 0x2, PWRAP_CSLEXT_START);
|
||||
+ pwrap_writel(wrp, 0x2, PWRAP_CSLEXT_END);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -699,7 +691,7 @@ static int pwrap_init(struct pmic_wrappe
|
||||
|
||||
pwrap_writel(wrp, 1, PWRAP_WACS2_EN);
|
||||
|
||||
- ret = pwrap_init_reg_clock(wrp);
|
||||
+ ret = wrp->master->init_reg_clock(wrp);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
@@ -814,6 +806,20 @@ static const struct regmap_config pwrap_
|
||||
.max_register = 0xffff,
|
||||
};
|
||||
|
||||
+static struct pmic_wrapper_type pwrap_mt8135 = {
|
||||
+ .regs = mt8135_regs,
|
||||
+ .type = PWRAP_MT8135,
|
||||
+ .arb_en_all = 0x1ff,
|
||||
+ .init_reg_clock = pwrap_mt8135_init_reg_clock,
|
||||
+};
|
||||
+
|
||||
+static struct pmic_wrapper_type pwrap_mt8173 = {
|
||||
+ .regs = mt8173_regs,
|
||||
+ .type = PWRAP_MT8173,
|
||||
+ .arb_en_all = 0x3f,
|
||||
+ .init_reg_clock = pwrap_mt8173_init_reg_clock,
|
||||
+};
|
||||
+
|
||||
static struct of_device_id of_pwrap_match_tbl[] = {
|
||||
{
|
||||
.compatible = "mediatek,mt8135-pwrap",
|
|
@ -1,122 +0,0 @@
|
|||
From a1bbd630710d5da89a9c347c84d7badd30e7e68a Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <blogic@openwrt.org>
|
||||
Date: Wed, 20 Jan 2016 10:12:00 +0100
|
||||
Subject: [PATCH 034/102] soc: mediatek: PMIC wrap: split SoC specific init
|
||||
into callback
|
||||
|
||||
This patch moves the SoC specific wrapper init code into separate callback
|
||||
to avoid pwrap_init() getting too large. This is done by adding a new
|
||||
element called init_special to pmic_wrapper_type. Each currently supported
|
||||
SoC gets its own version of the callback and we copy the code that was
|
||||
previously inside pwrap_init() to these new callbacks. Finally we point the
|
||||
2 instances of pmic_wrapper_type at the 2 new functions.
|
||||
|
||||
Signed-off-by: John Crispin <blogic@openwrt.org>
|
||||
---
|
||||
drivers/soc/mediatek/mtk-pmic-wrap.c | 67 +++++++++++++++++++++-------------
|
||||
1 file changed, 42 insertions(+), 25 deletions(-)
|
||||
|
||||
--- a/drivers/soc/mediatek/mtk-pmic-wrap.c
|
||||
+++ b/drivers/soc/mediatek/mtk-pmic-wrap.c
|
||||
@@ -372,6 +372,7 @@ struct pmic_wrapper_type {
|
||||
enum pwrap_type type;
|
||||
u32 arb_en_all;
|
||||
int (*init_reg_clock)(struct pmic_wrapper *wrp);
|
||||
+ int (*init_soc_specific)(struct pmic_wrapper *wrp);
|
||||
};
|
||||
|
||||
static inline int pwrap_is_mt8135(struct pmic_wrapper *wrp)
|
||||
@@ -665,6 +666,41 @@ static int pwrap_init_cipher(struct pmic
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static int pwrap_mt8135_init_soc_specific(struct pmic_wrapper *wrp)
|
||||
+{
|
||||
+ /* enable pwrap events and pwrap bridge in AP side */
|
||||
+ pwrap_writel(wrp, 0x1, PWRAP_EVENT_IN_EN);
|
||||
+ pwrap_writel(wrp, 0xffff, PWRAP_EVENT_DST_EN);
|
||||
+ writel(0x7f, wrp->bridge_base + PWRAP_MT8135_BRIDGE_IORD_ARB_EN);
|
||||
+ writel(0x1, wrp->bridge_base + PWRAP_MT8135_BRIDGE_WACS3_EN);
|
||||
+ writel(0x1, wrp->bridge_base + PWRAP_MT8135_BRIDGE_WACS4_EN);
|
||||
+ writel(0x1, wrp->bridge_base + PWRAP_MT8135_BRIDGE_WDT_UNIT);
|
||||
+ writel(0xffff, wrp->bridge_base + PWRAP_MT8135_BRIDGE_WDT_SRC_EN);
|
||||
+ writel(0x1, wrp->bridge_base + PWRAP_MT8135_BRIDGE_TIMER_EN);
|
||||
+ writel(0x7ff, wrp->bridge_base + PWRAP_MT8135_BRIDGE_INT_EN);
|
||||
+
|
||||
+ /* enable PMIC event out and sources */
|
||||
+ if (pwrap_write(wrp, PWRAP_DEW_EVENT_OUT_EN, 0x1) ||
|
||||
+ pwrap_write(wrp, PWRAP_DEW_EVENT_SRC_EN, 0xffff)) {
|
||||
+ dev_err(wrp->dev, "enable dewrap fail\n");
|
||||
+ return -EFAULT;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int pwrap_mt8173_init_soc_specific(struct pmic_wrapper *wrp)
|
||||
+{
|
||||
+ /* PMIC_DEWRAP enables */
|
||||
+ if (pwrap_write(wrp, PWRAP_DEW_EVENT_OUT_EN, 0x1) ||
|
||||
+ pwrap_write(wrp, PWRAP_DEW_EVENT_SRC_EN, 0xffff)) {
|
||||
+ dev_err(wrp->dev, "enable dewrap fail\n");
|
||||
+ return -EFAULT;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static int pwrap_init(struct pmic_wrapper *wrp)
|
||||
{
|
||||
int ret;
|
||||
@@ -743,31 +779,10 @@ static int pwrap_init(struct pmic_wrappe
|
||||
pwrap_writel(wrp, 0x5, PWRAP_STAUPD_PRD);
|
||||
pwrap_writel(wrp, 0xff, PWRAP_STAUPD_GRPEN);
|
||||
|
||||
- if (pwrap_is_mt8135(wrp)) {
|
||||
- /* enable pwrap events and pwrap bridge in AP side */
|
||||
- pwrap_writel(wrp, 0x1, PWRAP_EVENT_IN_EN);
|
||||
- pwrap_writel(wrp, 0xffff, PWRAP_EVENT_DST_EN);
|
||||
- writel(0x7f, wrp->bridge_base + PWRAP_MT8135_BRIDGE_IORD_ARB_EN);
|
||||
- writel(0x1, wrp->bridge_base + PWRAP_MT8135_BRIDGE_WACS3_EN);
|
||||
- writel(0x1, wrp->bridge_base + PWRAP_MT8135_BRIDGE_WACS4_EN);
|
||||
- writel(0x1, wrp->bridge_base + PWRAP_MT8135_BRIDGE_WDT_UNIT);
|
||||
- writel(0xffff, wrp->bridge_base + PWRAP_MT8135_BRIDGE_WDT_SRC_EN);
|
||||
- writel(0x1, wrp->bridge_base + PWRAP_MT8135_BRIDGE_TIMER_EN);
|
||||
- writel(0x7ff, wrp->bridge_base + PWRAP_MT8135_BRIDGE_INT_EN);
|
||||
-
|
||||
- /* enable PMIC event out and sources */
|
||||
- if (pwrap_write(wrp, PWRAP_DEW_EVENT_OUT_EN, 0x1) ||
|
||||
- pwrap_write(wrp, PWRAP_DEW_EVENT_SRC_EN, 0xffff)) {
|
||||
- dev_err(wrp->dev, "enable dewrap fail\n");
|
||||
- return -EFAULT;
|
||||
- }
|
||||
- } else {
|
||||
- /* PMIC_DEWRAP enables */
|
||||
- if (pwrap_write(wrp, PWRAP_DEW_EVENT_OUT_EN, 0x1) ||
|
||||
- pwrap_write(wrp, PWRAP_DEW_EVENT_SRC_EN, 0xffff)) {
|
||||
- dev_err(wrp->dev, "enable dewrap fail\n");
|
||||
- return -EFAULT;
|
||||
- }
|
||||
+ if (wrp->master->init_soc_specific) {
|
||||
+ ret = wrp->master->init_soc_specific(wrp);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
}
|
||||
|
||||
/* Setup the init done registers */
|
||||
@@ -811,6 +826,7 @@ static struct pmic_wrapper_type pwrap_mt
|
||||
.type = PWRAP_MT8135,
|
||||
.arb_en_all = 0x1ff,
|
||||
.init_reg_clock = pwrap_mt8135_init_reg_clock,
|
||||
+ .init_soc_specific = pwrap_mt8135_init_soc_specific,
|
||||
};
|
||||
|
||||
static struct pmic_wrapper_type pwrap_mt8173 = {
|
||||
@@ -818,6 +834,7 @@ static struct pmic_wrapper_type pwrap_mt
|
||||
.type = PWRAP_MT8173,
|
||||
.arb_en_all = 0x3f,
|
||||
.init_reg_clock = pwrap_mt8173_init_reg_clock,
|
||||
+ .init_soc_specific = pwrap_mt8173_init_soc_specific,
|
||||
};
|
||||
|
||||
static struct of_device_id of_pwrap_match_tbl[] = {
|
|
@ -1,48 +0,0 @@
|
|||
From 274fd9ba57170de88bbdf522cbd6c290c2e51fb8 Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <blogic@openwrt.org>
|
||||
Date: Wed, 20 Jan 2016 10:14:39 +0100
|
||||
Subject: [PATCH 035/102] soc: mediatek: PMIC wrap: WRAP_INT_EN needs a
|
||||
different bitmask for MT2701/7623
|
||||
|
||||
MT2701 and MT7623 use a different bitmask for PWRAP_INT_EN.
|
||||
|
||||
Signed-off-by: John Crispin <blogic@openwrt.org>
|
||||
---
|
||||
drivers/soc/mediatek/mtk-pmic-wrap.c | 5 ++++-
|
||||
1 file changed, 4 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/soc/mediatek/mtk-pmic-wrap.c
|
||||
+++ b/drivers/soc/mediatek/mtk-pmic-wrap.c
|
||||
@@ -371,6 +371,7 @@ struct pmic_wrapper_type {
|
||||
int *regs;
|
||||
enum pwrap_type type;
|
||||
u32 arb_en_all;
|
||||
+ u32 int_en_all;
|
||||
int (*init_reg_clock)(struct pmic_wrapper *wrp);
|
||||
int (*init_soc_specific)(struct pmic_wrapper *wrp);
|
||||
};
|
||||
@@ -825,6 +826,7 @@ static struct pmic_wrapper_type pwrap_mt
|
||||
.regs = mt8135_regs,
|
||||
.type = PWRAP_MT8135,
|
||||
.arb_en_all = 0x1ff,
|
||||
+ .int_en_all = ~(BIT(31) | BIT(1)),
|
||||
.init_reg_clock = pwrap_mt8135_init_reg_clock,
|
||||
.init_soc_specific = pwrap_mt8135_init_soc_specific,
|
||||
};
|
||||
@@ -833,6 +835,7 @@ static struct pmic_wrapper_type pwrap_mt
|
||||
.regs = mt8173_regs,
|
||||
.type = PWRAP_MT8173,
|
||||
.arb_en_all = 0x3f,
|
||||
+ .int_en_all = ~(BIT(31) | BIT(1)),
|
||||
.init_reg_clock = pwrap_mt8173_init_reg_clock,
|
||||
.init_soc_specific = pwrap_mt8173_init_soc_specific,
|
||||
};
|
||||
@@ -946,7 +949,7 @@ static int pwrap_probe(struct platform_d
|
||||
PWRAP_WDT_SRC_MASK_NO_STAUPD : PWRAP_WDT_SRC_MASK_ALL;
|
||||
pwrap_writel(wrp, wdt_src, PWRAP_WDT_SRC_EN);
|
||||
pwrap_writel(wrp, 0x1, PWRAP_TIMER_EN);
|
||||
- pwrap_writel(wrp, ~((1 << 31) | (1 << 1)), PWRAP_INT_EN);
|
||||
+ pwrap_writel(wrp, wrp->master->int_en_all, PWRAP_INT_EN);
|
||||
|
||||
irq = platform_get_irq(pdev, 0);
|
||||
ret = devm_request_irq(wrp->dev, irq, pwrap_interrupt, IRQF_TRIGGER_HIGH,
|
|
@ -1,61 +0,0 @@
|
|||
From 511e697282c6425950b95373ac8dc59a42fd2485 Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <blogic@openwrt.org>
|
||||
Date: Wed, 20 Jan 2016 10:21:42 +0100
|
||||
Subject: [PATCH 036/102] soc: mediatek: PMIC wrap: SPI_WRITE needs a
|
||||
different bitmask for MT2701/7623
|
||||
|
||||
Different SoCs will use different bitmask for the SPI_WRITE command. This
|
||||
patch defines the bitmask in the pmic_wrapper_type struct. This allows us
|
||||
to support new SoCs with a different bitmask to the one currently used.
|
||||
|
||||
Signed-off-by: John Crispin <blogic@openwrt.org>
|
||||
---
|
||||
drivers/soc/mediatek/mtk-pmic-wrap.c | 11 +++++++----
|
||||
1 file changed, 7 insertions(+), 4 deletions(-)
|
||||
|
||||
--- a/drivers/soc/mediatek/mtk-pmic-wrap.c
|
||||
+++ b/drivers/soc/mediatek/mtk-pmic-wrap.c
|
||||
@@ -372,6 +372,7 @@ struct pmic_wrapper_type {
|
||||
enum pwrap_type type;
|
||||
u32 arb_en_all;
|
||||
u32 int_en_all;
|
||||
+ u32 spi_w;
|
||||
int (*init_reg_clock)(struct pmic_wrapper *wrp);
|
||||
int (*init_soc_specific)(struct pmic_wrapper *wrp);
|
||||
};
|
||||
@@ -511,15 +512,15 @@ static int pwrap_reset_spislave(struct p
|
||||
pwrap_writel(wrp, 1, PWRAP_MAN_EN);
|
||||
pwrap_writel(wrp, 0, PWRAP_DIO_EN);
|
||||
|
||||
- pwrap_writel(wrp, PWRAP_MAN_CMD_SPI_WRITE | PWRAP_MAN_CMD_OP_CSL,
|
||||
+ pwrap_writel(wrp, wrp->master->spi_w | PWRAP_MAN_CMD_OP_CSL,
|
||||
PWRAP_MAN_CMD);
|
||||
- pwrap_writel(wrp, PWRAP_MAN_CMD_SPI_WRITE | PWRAP_MAN_CMD_OP_OUTS,
|
||||
+ pwrap_writel(wrp, wrp->master->spi_w | PWRAP_MAN_CMD_OP_OUTS,
|
||||
PWRAP_MAN_CMD);
|
||||
- pwrap_writel(wrp, PWRAP_MAN_CMD_SPI_WRITE | PWRAP_MAN_CMD_OP_CSH,
|
||||
+ pwrap_writel(wrp, wrp->master->spi_w | PWRAP_MAN_CMD_OP_CSH,
|
||||
PWRAP_MAN_CMD);
|
||||
|
||||
for (i = 0; i < 4; i++)
|
||||
- pwrap_writel(wrp, PWRAP_MAN_CMD_SPI_WRITE | PWRAP_MAN_CMD_OP_OUTS,
|
||||
+ pwrap_writel(wrp, wrp->master->spi_w | PWRAP_MAN_CMD_OP_OUTS,
|
||||
PWRAP_MAN_CMD);
|
||||
|
||||
ret = pwrap_wait_for_state(wrp, pwrap_is_sync_idle);
|
||||
@@ -827,6 +828,7 @@ static struct pmic_wrapper_type pwrap_mt
|
||||
.type = PWRAP_MT8135,
|
||||
.arb_en_all = 0x1ff,
|
||||
.int_en_all = ~(BIT(31) | BIT(1)),
|
||||
+ .spi_w = PWRAP_MAN_CMD_SPI_WRITE,
|
||||
.init_reg_clock = pwrap_mt8135_init_reg_clock,
|
||||
.init_soc_specific = pwrap_mt8135_init_soc_specific,
|
||||
};
|
||||
@@ -836,6 +838,7 @@ static struct pmic_wrapper_type pwrap_mt
|
||||
.type = PWRAP_MT8173,
|
||||
.arb_en_all = 0x3f,
|
||||
.int_en_all = ~(BIT(31) | BIT(1)),
|
||||
+ .spi_w = PWRAP_MAN_CMD_SPI_WRITE,
|
||||
.init_reg_clock = pwrap_mt8173_init_reg_clock,
|
||||
.init_soc_specific = pwrap_mt8173_init_soc_specific,
|
||||
};
|
|
@ -1,61 +0,0 @@
|
|||
From 6aecbc79322efd3068c6140f74a68654fbe5b5f6 Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <blogic@openwrt.org>
|
||||
Date: Wed, 20 Jan 2016 10:48:35 +0100
|
||||
Subject: [PATCH 037/102] soc: mediatek: PMIC wrap: move wdt_src into the
|
||||
pmic_wrapper_type struct
|
||||
|
||||
Different SoCs will use different bitmask for the wdt_src. This patch
|
||||
defines the bitmask in the pmic_wrapper_type struct. This allows us to
|
||||
support new SoCs with a different bitmask to the one currently used.
|
||||
|
||||
Signed-off-by: John Crispin <blogic@openwrt.org>
|
||||
---
|
||||
drivers/soc/mediatek/mtk-pmic-wrap.c | 9 +++++----
|
||||
1 file changed, 5 insertions(+), 4 deletions(-)
|
||||
|
||||
--- a/drivers/soc/mediatek/mtk-pmic-wrap.c
|
||||
+++ b/drivers/soc/mediatek/mtk-pmic-wrap.c
|
||||
@@ -373,6 +373,7 @@ struct pmic_wrapper_type {
|
||||
u32 arb_en_all;
|
||||
u32 int_en_all;
|
||||
u32 spi_w;
|
||||
+ u32 wdt_src;
|
||||
int (*init_reg_clock)(struct pmic_wrapper *wrp);
|
||||
int (*init_soc_specific)(struct pmic_wrapper *wrp);
|
||||
};
|
||||
@@ -829,6 +830,7 @@ static struct pmic_wrapper_type pwrap_mt
|
||||
.arb_en_all = 0x1ff,
|
||||
.int_en_all = ~(BIT(31) | BIT(1)),
|
||||
.spi_w = PWRAP_MAN_CMD_SPI_WRITE,
|
||||
+ .wdt_src = PWRAP_WDT_SRC_MASK_ALL,
|
||||
.init_reg_clock = pwrap_mt8135_init_reg_clock,
|
||||
.init_soc_specific = pwrap_mt8135_init_soc_specific,
|
||||
};
|
||||
@@ -839,6 +841,7 @@ static struct pmic_wrapper_type pwrap_mt
|
||||
.arb_en_all = 0x3f,
|
||||
.int_en_all = ~(BIT(31) | BIT(1)),
|
||||
.spi_w = PWRAP_MAN_CMD_SPI_WRITE,
|
||||
+ .wdt_src = PWRAP_WDT_SRC_MASK_NO_STAUPD,
|
||||
.init_reg_clock = pwrap_mt8173_init_reg_clock,
|
||||
.init_soc_specific = pwrap_mt8173_init_soc_specific,
|
||||
};
|
||||
@@ -858,7 +861,7 @@ MODULE_DEVICE_TABLE(of, of_pwrap_match_t
|
||||
|
||||
static int pwrap_probe(struct platform_device *pdev)
|
||||
{
|
||||
- int ret, irq, wdt_src;
|
||||
+ int ret, irq;
|
||||
struct pmic_wrapper *wrp;
|
||||
struct device_node *np = pdev->dev.of_node;
|
||||
const struct of_device_id *of_id =
|
||||
@@ -948,9 +951,7 @@ static int pwrap_probe(struct platform_d
|
||||
* Since STAUPD was not used on mt8173 platform,
|
||||
* so STAUPD of WDT_SRC which should be turned off
|
||||
*/
|
||||
- wdt_src = pwrap_is_mt8173(wrp) ?
|
||||
- PWRAP_WDT_SRC_MASK_NO_STAUPD : PWRAP_WDT_SRC_MASK_ALL;
|
||||
- pwrap_writel(wrp, wdt_src, PWRAP_WDT_SRC_EN);
|
||||
+ pwrap_writel(wrp, wrp->master->wdt_src, PWRAP_WDT_SRC_EN);
|
||||
pwrap_writel(wrp, 0x1, PWRAP_TIMER_EN);
|
||||
pwrap_writel(wrp, wrp->master->int_en_all, PWRAP_INT_EN);
|
||||
|
|
@ -1,113 +0,0 @@
|
|||
From da09b34ad22e8f065a02af114668f7d86357244a Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <blogic@openwrt.org>
|
||||
Date: Wed, 20 Jan 2016 10:54:18 +0100
|
||||
Subject: [PATCH 038/102] soc: mediatek: PMIC wrap: remove pwrap_is_mt8135()
|
||||
and pwrap_is_mt8173()
|
||||
|
||||
With more SoCs being added the list of helper functions like these would
|
||||
grow. To mitigate this problem we remove the existing helpers and change
|
||||
the code to test against the pmic type stored inside the pmic specific
|
||||
datastructure that our context structure points at. There is one usage of
|
||||
pwrap_is_mt8135() that is ambiguous as the test should not be dependent on
|
||||
mt8135, but rather on the existence of a bridge. Add a new element to
|
||||
pmic_wrapper_type to indicate if a bridge is present and use this where
|
||||
appropriate.
|
||||
|
||||
Signed-off-by: John Crispin <blogic@openwrt.org>
|
||||
---
|
||||
drivers/soc/mediatek/mtk-pmic-wrap.c | 28 ++++++++++++----------------
|
||||
1 file changed, 12 insertions(+), 16 deletions(-)
|
||||
|
||||
--- a/drivers/soc/mediatek/mtk-pmic-wrap.c
|
||||
+++ b/drivers/soc/mediatek/mtk-pmic-wrap.c
|
||||
@@ -374,20 +374,11 @@ struct pmic_wrapper_type {
|
||||
u32 int_en_all;
|
||||
u32 spi_w;
|
||||
u32 wdt_src;
|
||||
+ int has_bridge:1;
|
||||
int (*init_reg_clock)(struct pmic_wrapper *wrp);
|
||||
int (*init_soc_specific)(struct pmic_wrapper *wrp);
|
||||
};
|
||||
|
||||
-static inline int pwrap_is_mt8135(struct pmic_wrapper *wrp)
|
||||
-{
|
||||
- return wrp->master->type == PWRAP_MT8135;
|
||||
-}
|
||||
-
|
||||
-static inline int pwrap_is_mt8173(struct pmic_wrapper *wrp)
|
||||
-{
|
||||
- return wrp->master->type == PWRAP_MT8173;
|
||||
-}
|
||||
-
|
||||
static u32 pwrap_readl(struct pmic_wrapper *wrp, enum pwrap_regs reg)
|
||||
{
|
||||
return readl(wrp->base + wrp->master->regs[reg]);
|
||||
@@ -619,11 +610,14 @@ static int pwrap_init_cipher(struct pmic
|
||||
pwrap_writel(wrp, 0x1, PWRAP_CIPHER_KEY_SEL);
|
||||
pwrap_writel(wrp, 0x2, PWRAP_CIPHER_IV_SEL);
|
||||
|
||||
- if (pwrap_is_mt8135(wrp)) {
|
||||
+ switch (wrp->master->type) {
|
||||
+ case PWRAP_MT8135:
|
||||
pwrap_writel(wrp, 1, PWRAP_CIPHER_LOAD);
|
||||
pwrap_writel(wrp, 1, PWRAP_CIPHER_START);
|
||||
- } else {
|
||||
+ break;
|
||||
+ case PWRAP_MT8173:
|
||||
pwrap_writel(wrp, 1, PWRAP_CIPHER_EN);
|
||||
+ break;
|
||||
}
|
||||
|
||||
/* Config cipher mode @PMIC */
|
||||
@@ -713,7 +707,7 @@ static int pwrap_init(struct pmic_wrappe
|
||||
if (wrp->rstc_bridge)
|
||||
reset_control_reset(wrp->rstc_bridge);
|
||||
|
||||
- if (pwrap_is_mt8173(wrp)) {
|
||||
+ if (wrp->master->type == PWRAP_MT8173) {
|
||||
/* Enable DCM */
|
||||
pwrap_writel(wrp, 3, PWRAP_DCM_EN);
|
||||
pwrap_writel(wrp, 0, PWRAP_DCM_DBC_PRD);
|
||||
@@ -773,7 +767,7 @@ static int pwrap_init(struct pmic_wrappe
|
||||
pwrap_writel(wrp, PWRAP_DEW_CRC_VAL, PWRAP_SIG_ADR);
|
||||
pwrap_writel(wrp, wrp->master->arb_en_all, PWRAP_HIPRIO_ARB_EN);
|
||||
|
||||
- if (pwrap_is_mt8135(wrp))
|
||||
+ if (wrp->master->type == PWRAP_MT8135)
|
||||
pwrap_writel(wrp, 0x7, PWRAP_RRARB_EN);
|
||||
|
||||
pwrap_writel(wrp, 0x1, PWRAP_WACS0_EN);
|
||||
@@ -793,7 +787,7 @@ static int pwrap_init(struct pmic_wrappe
|
||||
pwrap_writel(wrp, 1, PWRAP_INIT_DONE0);
|
||||
pwrap_writel(wrp, 1, PWRAP_INIT_DONE1);
|
||||
|
||||
- if (pwrap_is_mt8135(wrp)) {
|
||||
+ if (wrp->master->has_bridge) {
|
||||
writel(1, wrp->bridge_base + PWRAP_MT8135_BRIDGE_INIT_DONE3);
|
||||
writel(1, wrp->bridge_base + PWRAP_MT8135_BRIDGE_INIT_DONE4);
|
||||
}
|
||||
@@ -831,6 +825,7 @@ static struct pmic_wrapper_type pwrap_mt
|
||||
.int_en_all = ~(BIT(31) | BIT(1)),
|
||||
.spi_w = PWRAP_MAN_CMD_SPI_WRITE,
|
||||
.wdt_src = PWRAP_WDT_SRC_MASK_ALL,
|
||||
+ .has_bridge = 1,
|
||||
.init_reg_clock = pwrap_mt8135_init_reg_clock,
|
||||
.init_soc_specific = pwrap_mt8135_init_soc_specific,
|
||||
};
|
||||
@@ -842,6 +837,7 @@ static struct pmic_wrapper_type pwrap_mt
|
||||
.int_en_all = ~(BIT(31) | BIT(1)),
|
||||
.spi_w = PWRAP_MAN_CMD_SPI_WRITE,
|
||||
.wdt_src = PWRAP_WDT_SRC_MASK_NO_STAUPD,
|
||||
+ .has_bridge = 0,
|
||||
.init_reg_clock = pwrap_mt8173_init_reg_clock,
|
||||
.init_soc_specific = pwrap_mt8173_init_soc_specific,
|
||||
};
|
||||
@@ -889,7 +885,7 @@ static int pwrap_probe(struct platform_d
|
||||
return ret;
|
||||
}
|
||||
|
||||
- if (pwrap_is_mt8135(wrp)) {
|
||||
+ if (wrp->master->has_bridge) {
|
||||
res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
|
||||
"pwrap-bridge");
|
||||
wrp->bridge_base = devm_ioremap_resource(wrp->dev, res);
|
|
@ -1,297 +0,0 @@
|
|||
From 21bdcd324f769545b1765fe391d939a1edd07cbb Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <blogic@openwrt.org>
|
||||
Date: Wed, 20 Jan 2016 09:55:08 +0100
|
||||
Subject: [PATCH 039/102] soc: mediatek: PMIC wrap: add a slave specific
|
||||
struct
|
||||
|
||||
This patch adds a new struct pwrap_slv_type that we use to store the slave
|
||||
specific data. The patch adds 2 new helper functions to access the dew
|
||||
registers. The slave type is looked up via the wrappers child node.
|
||||
|
||||
Signed-off-by: John Crispin <blogic@openwrt.org>
|
||||
---
|
||||
drivers/soc/mediatek/mtk-pmic-wrap.c | 159 ++++++++++++++++++++++++----------
|
||||
1 file changed, 112 insertions(+), 47 deletions(-)
|
||||
|
||||
--- a/drivers/soc/mediatek/mtk-pmic-wrap.c
|
||||
+++ b/drivers/soc/mediatek/mtk-pmic-wrap.c
|
||||
@@ -69,33 +69,54 @@
|
||||
PWRAP_WDT_SRC_EN_HARB_STAUPD_DLE | \
|
||||
PWRAP_WDT_SRC_EN_HARB_STAUPD_ALE)
|
||||
|
||||
-/* macro for slave device wrapper registers */
|
||||
-#define PWRAP_DEW_BASE 0xbc00
|
||||
-#define PWRAP_DEW_EVENT_OUT_EN (PWRAP_DEW_BASE + 0x0)
|
||||
-#define PWRAP_DEW_DIO_EN (PWRAP_DEW_BASE + 0x2)
|
||||
-#define PWRAP_DEW_EVENT_SRC_EN (PWRAP_DEW_BASE + 0x4)
|
||||
-#define PWRAP_DEW_EVENT_SRC (PWRAP_DEW_BASE + 0x6)
|
||||
-#define PWRAP_DEW_EVENT_FLAG (PWRAP_DEW_BASE + 0x8)
|
||||
-#define PWRAP_DEW_READ_TEST (PWRAP_DEW_BASE + 0xa)
|
||||
-#define PWRAP_DEW_WRITE_TEST (PWRAP_DEW_BASE + 0xc)
|
||||
-#define PWRAP_DEW_CRC_EN (PWRAP_DEW_BASE + 0xe)
|
||||
-#define PWRAP_DEW_CRC_VAL (PWRAP_DEW_BASE + 0x10)
|
||||
-#define PWRAP_DEW_MON_GRP_SEL (PWRAP_DEW_BASE + 0x12)
|
||||
-#define PWRAP_DEW_MON_FLAG_SEL (PWRAP_DEW_BASE + 0x14)
|
||||
-#define PWRAP_DEW_EVENT_TEST (PWRAP_DEW_BASE + 0x16)
|
||||
-#define PWRAP_DEW_CIPHER_KEY_SEL (PWRAP_DEW_BASE + 0x18)
|
||||
-#define PWRAP_DEW_CIPHER_IV_SEL (PWRAP_DEW_BASE + 0x1a)
|
||||
-#define PWRAP_DEW_CIPHER_LOAD (PWRAP_DEW_BASE + 0x1c)
|
||||
-#define PWRAP_DEW_CIPHER_START (PWRAP_DEW_BASE + 0x1e)
|
||||
-#define PWRAP_DEW_CIPHER_RDY (PWRAP_DEW_BASE + 0x20)
|
||||
-#define PWRAP_DEW_CIPHER_MODE (PWRAP_DEW_BASE + 0x22)
|
||||
-#define PWRAP_DEW_CIPHER_SWRST (PWRAP_DEW_BASE + 0x24)
|
||||
-#define PWRAP_MT8173_DEW_CIPHER_IV0 (PWRAP_DEW_BASE + 0x26)
|
||||
-#define PWRAP_MT8173_DEW_CIPHER_IV1 (PWRAP_DEW_BASE + 0x28)
|
||||
-#define PWRAP_MT8173_DEW_CIPHER_IV2 (PWRAP_DEW_BASE + 0x2a)
|
||||
-#define PWRAP_MT8173_DEW_CIPHER_IV3 (PWRAP_DEW_BASE + 0x2c)
|
||||
-#define PWRAP_MT8173_DEW_CIPHER_IV4 (PWRAP_DEW_BASE + 0x2e)
|
||||
-#define PWRAP_MT8173_DEW_CIPHER_IV5 (PWRAP_DEW_BASE + 0x30)
|
||||
+/* defines for slave device wrapper registers */
|
||||
+enum dew_regs {
|
||||
+ PWRAP_DEW_BASE,
|
||||
+ PWRAP_DEW_DIO_EN,
|
||||
+ PWRAP_DEW_READ_TEST,
|
||||
+ PWRAP_DEW_WRITE_TEST,
|
||||
+ PWRAP_DEW_CRC_EN,
|
||||
+ PWRAP_DEW_CRC_VAL,
|
||||
+ PWRAP_DEW_MON_GRP_SEL,
|
||||
+ PWRAP_DEW_CIPHER_KEY_SEL,
|
||||
+ PWRAP_DEW_CIPHER_IV_SEL,
|
||||
+ PWRAP_DEW_CIPHER_RDY,
|
||||
+ PWRAP_DEW_CIPHER_MODE,
|
||||
+ PWRAP_DEW_CIPHER_SWRST,
|
||||
+
|
||||
+ /* MT6397 only regs */
|
||||
+ PWRAP_DEW_EVENT_OUT_EN,
|
||||
+ PWRAP_DEW_EVENT_SRC_EN,
|
||||
+ PWRAP_DEW_EVENT_SRC,
|
||||
+ PWRAP_DEW_EVENT_FLAG,
|
||||
+ PWRAP_DEW_MON_FLAG_SEL,
|
||||
+ PWRAP_DEW_EVENT_TEST,
|
||||
+ PWRAP_DEW_CIPHER_LOAD,
|
||||
+ PWRAP_DEW_CIPHER_START,
|
||||
+};
|
||||
+
|
||||
+static const u32 mt6397_regs[] = {
|
||||
+ [PWRAP_DEW_BASE] = 0xbc00,
|
||||
+ [PWRAP_DEW_EVENT_OUT_EN] = 0xbc00,
|
||||
+ [PWRAP_DEW_DIO_EN] = 0xbc02,
|
||||
+ [PWRAP_DEW_EVENT_SRC_EN] = 0xbc04,
|
||||
+ [PWRAP_DEW_EVENT_SRC] = 0xbc06,
|
||||
+ [PWRAP_DEW_EVENT_FLAG] = 0xbc08,
|
||||
+ [PWRAP_DEW_READ_TEST] = 0xbc0a,
|
||||
+ [PWRAP_DEW_WRITE_TEST] = 0xbc0c,
|
||||
+ [PWRAP_DEW_CRC_EN] = 0xbc0e,
|
||||
+ [PWRAP_DEW_CRC_VAL] = 0xbc10,
|
||||
+ [PWRAP_DEW_MON_GRP_SEL] = 0xbc12,
|
||||
+ [PWRAP_DEW_MON_FLAG_SEL] = 0xbc14,
|
||||
+ [PWRAP_DEW_EVENT_TEST] = 0xbc16,
|
||||
+ [PWRAP_DEW_CIPHER_KEY_SEL] = 0xbc18,
|
||||
+ [PWRAP_DEW_CIPHER_IV_SEL] = 0xbc1a,
|
||||
+ [PWRAP_DEW_CIPHER_LOAD] = 0xbc1c,
|
||||
+ [PWRAP_DEW_CIPHER_START] = 0xbc1e,
|
||||
+ [PWRAP_DEW_CIPHER_RDY] = 0xbc20,
|
||||
+ [PWRAP_DEW_CIPHER_MODE] = 0xbc22,
|
||||
+ [PWRAP_DEW_CIPHER_SWRST] = 0xbc24,
|
||||
+};
|
||||
|
||||
enum pwrap_regs {
|
||||
PWRAP_MUX_SEL,
|
||||
@@ -349,16 +370,26 @@ static int mt8135_regs[] = {
|
||||
[PWRAP_DCM_DBC_PRD] = 0x160,
|
||||
};
|
||||
|
||||
+enum pmic_type {
|
||||
+ PMIC_MT6397,
|
||||
+};
|
||||
+
|
||||
enum pwrap_type {
|
||||
PWRAP_MT8135,
|
||||
PWRAP_MT8173,
|
||||
};
|
||||
|
||||
+struct pwrap_slv_type {
|
||||
+ const u32 *dew_regs;
|
||||
+ enum pmic_type type;
|
||||
+};
|
||||
+
|
||||
struct pmic_wrapper {
|
||||
struct device *dev;
|
||||
void __iomem *base;
|
||||
struct regmap *regmap;
|
||||
const struct pmic_wrapper_type *master;
|
||||
+ const struct pwrap_slv_type *slave;
|
||||
struct clk *clk_spi;
|
||||
struct clk *clk_wrap;
|
||||
struct reset_control *rstc;
|
||||
@@ -544,7 +575,8 @@ static int pwrap_init_sidly(struct pmic_
|
||||
|
||||
for (i = 0; i < 4; i++) {
|
||||
pwrap_writel(wrp, i, PWRAP_SIDLY);
|
||||
- pwrap_read(wrp, PWRAP_DEW_READ_TEST, &rdata);
|
||||
+ pwrap_read(wrp, wrp->slave->dew_regs[PWRAP_DEW_READ_TEST],
|
||||
+ &rdata);
|
||||
if (rdata == PWRAP_DEW_READ_TEST_VAL) {
|
||||
dev_dbg(wrp->dev, "[Read Test] pass, SIDLY=%x\n", i);
|
||||
pass |= 1 << i;
|
||||
@@ -593,7 +625,8 @@ static bool pwrap_is_pmic_cipher_ready(s
|
||||
u32 rdata;
|
||||
int ret;
|
||||
|
||||
- ret = pwrap_read(wrp, PWRAP_DEW_CIPHER_RDY, &rdata);
|
||||
+ ret = pwrap_read(wrp, wrp->slave->dew_regs[PWRAP_DEW_CIPHER_RDY],
|
||||
+ &rdata);
|
||||
if (ret)
|
||||
return 0;
|
||||
|
||||
@@ -621,12 +654,12 @@ static int pwrap_init_cipher(struct pmic
|
||||
}
|
||||
|
||||
/* Config cipher mode @PMIC */
|
||||
- pwrap_write(wrp, PWRAP_DEW_CIPHER_SWRST, 0x1);
|
||||
- pwrap_write(wrp, PWRAP_DEW_CIPHER_SWRST, 0x0);
|
||||
- pwrap_write(wrp, PWRAP_DEW_CIPHER_KEY_SEL, 0x1);
|
||||
- pwrap_write(wrp, PWRAP_DEW_CIPHER_IV_SEL, 0x2);
|
||||
- pwrap_write(wrp, PWRAP_DEW_CIPHER_LOAD, 0x1);
|
||||
- pwrap_write(wrp, PWRAP_DEW_CIPHER_START, 0x1);
|
||||
+ pwrap_write(wrp, wrp->slave->dew_regs[PWRAP_DEW_CIPHER_SWRST], 0x1);
|
||||
+ pwrap_write(wrp, wrp->slave->dew_regs[PWRAP_DEW_CIPHER_SWRST], 0x0);
|
||||
+ pwrap_write(wrp, wrp->slave->dew_regs[PWRAP_DEW_CIPHER_KEY_SEL], 0x1);
|
||||
+ pwrap_write(wrp, wrp->slave->dew_regs[PWRAP_DEW_CIPHER_IV_SEL], 0x2);
|
||||
+ pwrap_write(wrp, wrp->slave->dew_regs[PWRAP_DEW_CIPHER_LOAD], 0x1);
|
||||
+ pwrap_write(wrp, wrp->slave->dew_regs[PWRAP_DEW_CIPHER_START], 0x1);
|
||||
|
||||
/* wait for cipher data ready@AP */
|
||||
ret = pwrap_wait_for_state(wrp, pwrap_is_cipher_ready);
|
||||
@@ -643,7 +676,7 @@ static int pwrap_init_cipher(struct pmic
|
||||
}
|
||||
|
||||
/* wait for cipher mode idle */
|
||||
- pwrap_write(wrp, PWRAP_DEW_CIPHER_MODE, 0x1);
|
||||
+ pwrap_write(wrp, wrp->slave->dew_regs[PWRAP_DEW_CIPHER_MODE], 0x1);
|
||||
ret = pwrap_wait_for_state(wrp, pwrap_is_fsm_idle_and_sync_idle);
|
||||
if (ret) {
|
||||
dev_err(wrp->dev, "cipher mode idle fail, ret=%d\n", ret);
|
||||
@@ -653,9 +686,11 @@ static int pwrap_init_cipher(struct pmic
|
||||
pwrap_writel(wrp, 1, PWRAP_CIPHER_MODE);
|
||||
|
||||
/* Write Test */
|
||||
- if (pwrap_write(wrp, PWRAP_DEW_WRITE_TEST, PWRAP_DEW_WRITE_TEST_VAL) ||
|
||||
- pwrap_read(wrp, PWRAP_DEW_WRITE_TEST, &rdata) ||
|
||||
- (rdata != PWRAP_DEW_WRITE_TEST_VAL)) {
|
||||
+ if (pwrap_write(wrp, wrp->slave->dew_regs[PWRAP_DEW_WRITE_TEST],
|
||||
+ PWRAP_DEW_WRITE_TEST_VAL) ||
|
||||
+ pwrap_read(wrp, wrp->slave->dew_regs[PWRAP_DEW_WRITE_TEST],
|
||||
+ &rdata) ||
|
||||
+ (rdata != PWRAP_DEW_WRITE_TEST_VAL)) {
|
||||
dev_err(wrp->dev, "rdata=0x%04X\n", rdata);
|
||||
return -EFAULT;
|
||||
}
|
||||
@@ -677,8 +712,10 @@ static int pwrap_mt8135_init_soc_specifi
|
||||
writel(0x7ff, wrp->bridge_base + PWRAP_MT8135_BRIDGE_INT_EN);
|
||||
|
||||
/* enable PMIC event out and sources */
|
||||
- if (pwrap_write(wrp, PWRAP_DEW_EVENT_OUT_EN, 0x1) ||
|
||||
- pwrap_write(wrp, PWRAP_DEW_EVENT_SRC_EN, 0xffff)) {
|
||||
+ if (pwrap_write(wrp, wrp->slave->dew_regs[PWRAP_DEW_EVENT_OUT_EN],
|
||||
+ 0x1) ||
|
||||
+ pwrap_write(wrp, wrp->slave->dew_regs[PWRAP_DEW_EVENT_SRC_EN],
|
||||
+ 0xffff)) {
|
||||
dev_err(wrp->dev, "enable dewrap fail\n");
|
||||
return -EFAULT;
|
||||
}
|
||||
@@ -689,8 +726,10 @@ static int pwrap_mt8135_init_soc_specifi
|
||||
static int pwrap_mt8173_init_soc_specific(struct pmic_wrapper *wrp)
|
||||
{
|
||||
/* PMIC_DEWRAP enables */
|
||||
- if (pwrap_write(wrp, PWRAP_DEW_EVENT_OUT_EN, 0x1) ||
|
||||
- pwrap_write(wrp, PWRAP_DEW_EVENT_SRC_EN, 0xffff)) {
|
||||
+ if (pwrap_write(wrp, wrp->slave->dew_regs[PWRAP_DEW_EVENT_OUT_EN],
|
||||
+ 0x1) ||
|
||||
+ pwrap_write(wrp, wrp->slave->dew_regs[PWRAP_DEW_EVENT_SRC_EN],
|
||||
+ 0xffff)) {
|
||||
dev_err(wrp->dev, "enable dewrap fail\n");
|
||||
return -EFAULT;
|
||||
}
|
||||
@@ -734,7 +773,7 @@ static int pwrap_init(struct pmic_wrappe
|
||||
return ret;
|
||||
|
||||
/* Enable dual IO mode */
|
||||
- pwrap_write(wrp, PWRAP_DEW_DIO_EN, 1);
|
||||
+ pwrap_write(wrp, wrp->slave->dew_regs[PWRAP_DEW_DIO_EN], 1);
|
||||
|
||||
/* Check IDLE & INIT_DONE in advance */
|
||||
ret = pwrap_wait_for_state(wrp, pwrap_is_fsm_idle_and_sync_idle);
|
||||
@@ -746,7 +785,7 @@ static int pwrap_init(struct pmic_wrappe
|
||||
pwrap_writel(wrp, 1, PWRAP_DIO_EN);
|
||||
|
||||
/* Read Test */
|
||||
- pwrap_read(wrp, PWRAP_DEW_READ_TEST, &rdata);
|
||||
+ pwrap_read(wrp, wrp->slave->dew_regs[PWRAP_DEW_READ_TEST], &rdata);
|
||||
if (rdata != PWRAP_DEW_READ_TEST_VAL) {
|
||||
dev_err(wrp->dev, "Read test failed after switch to DIO mode: 0x%04x != 0x%04x\n",
|
||||
PWRAP_DEW_READ_TEST_VAL, rdata);
|
||||
@@ -759,12 +798,13 @@ static int pwrap_init(struct pmic_wrappe
|
||||
return ret;
|
||||
|
||||
/* Signature checking - using CRC */
|
||||
- if (pwrap_write(wrp, PWRAP_DEW_CRC_EN, 0x1))
|
||||
+ if (pwrap_write(wrp, wrp->slave->dew_regs[PWRAP_DEW_CRC_EN], 0x1))
|
||||
return -EFAULT;
|
||||
|
||||
pwrap_writel(wrp, 0x1, PWRAP_CRC_EN);
|
||||
pwrap_writel(wrp, 0x0, PWRAP_SIG_MODE);
|
||||
- pwrap_writel(wrp, PWRAP_DEW_CRC_VAL, PWRAP_SIG_ADR);
|
||||
+ pwrap_writel(wrp, wrp->slave->dew_regs[PWRAP_DEW_CRC_VAL],
|
||||
+ PWRAP_SIG_ADR);
|
||||
pwrap_writel(wrp, wrp->master->arb_en_all, PWRAP_HIPRIO_ARB_EN);
|
||||
|
||||
if (wrp->master->type == PWRAP_MT8135)
|
||||
@@ -818,6 +858,21 @@ static const struct regmap_config pwrap_
|
||||
.max_register = 0xffff,
|
||||
};
|
||||
|
||||
+static const struct pwrap_slv_type pmic_mt6397 = {
|
||||
+ .dew_regs = mt6397_regs,
|
||||
+ .type = PMIC_MT6397,
|
||||
+};
|
||||
+
|
||||
+static const struct of_device_id of_slave_match_tbl[] = {
|
||||
+ {
|
||||
+ .compatible = "mediatek,mt6397",
|
||||
+ .data = &pmic_mt6397,
|
||||
+ }, {
|
||||
+ /* sentinel */
|
||||
+ }
|
||||
+};
|
||||
+MODULE_DEVICE_TABLE(of, of_slave_match_tbl);
|
||||
+
|
||||
static struct pmic_wrapper_type pwrap_mt8135 = {
|
||||
.regs = mt8135_regs,
|
||||
.type = PWRAP_MT8135,
|
||||
@@ -862,8 +917,17 @@ static int pwrap_probe(struct platform_d
|
||||
struct device_node *np = pdev->dev.of_node;
|
||||
const struct of_device_id *of_id =
|
||||
of_match_device(of_pwrap_match_tbl, &pdev->dev);
|
||||
+ const struct of_device_id *of_slave_id = NULL;
|
||||
struct resource *res;
|
||||
|
||||
+ if (pdev->dev.of_node->child)
|
||||
+ of_slave_id = of_match_node(of_slave_match_tbl,
|
||||
+ pdev->dev.of_node->child);
|
||||
+ if (!of_slave_id) {
|
||||
+ dev_dbg(&pdev->dev, "slave pmic should be defined in dts\n");
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
wrp = devm_kzalloc(&pdev->dev, sizeof(*wrp), GFP_KERNEL);
|
||||
if (!wrp)
|
||||
return -ENOMEM;
|
||||
@@ -871,6 +935,7 @@ static int pwrap_probe(struct platform_d
|
||||
platform_set_drvdata(pdev, wrp);
|
||||
|
||||
wrp->master = of_id->data;
|
||||
+ wrp->slave = of_slave_id->data;
|
||||
wrp->dev = &pdev->dev;
|
||||
|
||||
res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "pwrap");
|
|
@ -1,93 +0,0 @@
|
|||
From 4418ba9a0bb105f00259d10ceb16f9e27199e9b0 Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <blogic@openwrt.org>
|
||||
Date: Wed, 20 Jan 2016 11:40:43 +0100
|
||||
Subject: [PATCH 040/102] soc: mediatek: PMIC wrap: add mt6323 slave support
|
||||
|
||||
Add support for MT6323 slaves. This PMIC can be found on MT2701 and MT7623
|
||||
EVB. The only function that we need to touch is pwrap_init_cipher().
|
||||
|
||||
Signed-off-by: John Crispin <blogic@openwrt.org>
|
||||
---
|
||||
drivers/soc/mediatek/mtk-pmic-wrap.c | 43 ++++++++++++++++++++++++++++++++++
|
||||
1 file changed, 43 insertions(+)
|
||||
|
||||
--- a/drivers/soc/mediatek/mtk-pmic-wrap.c
|
||||
+++ b/drivers/soc/mediatek/mtk-pmic-wrap.c
|
||||
@@ -93,6 +93,27 @@ enum dew_regs {
|
||||
PWRAP_DEW_EVENT_TEST,
|
||||
PWRAP_DEW_CIPHER_LOAD,
|
||||
PWRAP_DEW_CIPHER_START,
|
||||
+
|
||||
+ /* MT6323 only regs */
|
||||
+ PWRAP_DEW_CIPHER_EN,
|
||||
+ PWRAP_DEW_RDDMY_NO,
|
||||
+};
|
||||
+
|
||||
+static const u32 mt6323_regs[] = {
|
||||
+ [PWRAP_DEW_BASE] = 0x0000,
|
||||
+ [PWRAP_DEW_DIO_EN] = 0x018a,
|
||||
+ [PWRAP_DEW_READ_TEST] = 0x018c,
|
||||
+ [PWRAP_DEW_WRITE_TEST] = 0x018e,
|
||||
+ [PWRAP_DEW_CRC_EN] = 0x0192,
|
||||
+ [PWRAP_DEW_CRC_VAL] = 0x0194,
|
||||
+ [PWRAP_DEW_MON_GRP_SEL] = 0x0196,
|
||||
+ [PWRAP_DEW_CIPHER_KEY_SEL] = 0x0198,
|
||||
+ [PWRAP_DEW_CIPHER_IV_SEL] = 0x019a,
|
||||
+ [PWRAP_DEW_CIPHER_EN] = 0x019c,
|
||||
+ [PWRAP_DEW_CIPHER_RDY] = 0x019e,
|
||||
+ [PWRAP_DEW_CIPHER_MODE] = 0x01a0,
|
||||
+ [PWRAP_DEW_CIPHER_SWRST] = 0x01a2,
|
||||
+ [PWRAP_DEW_RDDMY_NO] = 0x01a4,
|
||||
};
|
||||
|
||||
static const u32 mt6397_regs[] = {
|
||||
@@ -371,6 +392,7 @@ static int mt8135_regs[] = {
|
||||
};
|
||||
|
||||
enum pmic_type {
|
||||
+ PMIC_MT6323,
|
||||
PMIC_MT6397,
|
||||
};
|
||||
|
||||
@@ -661,6 +683,19 @@ static int pwrap_init_cipher(struct pmic
|
||||
pwrap_write(wrp, wrp->slave->dew_regs[PWRAP_DEW_CIPHER_LOAD], 0x1);
|
||||
pwrap_write(wrp, wrp->slave->dew_regs[PWRAP_DEW_CIPHER_START], 0x1);
|
||||
|
||||
+ switch (wrp->slave->type) {
|
||||
+ case PMIC_MT6397:
|
||||
+ pwrap_write(wrp, wrp->slave->dew_regs[PWRAP_DEW_CIPHER_LOAD],
|
||||
+ 0x1);
|
||||
+ pwrap_write(wrp, wrp->slave->dew_regs[PWRAP_DEW_CIPHER_START],
|
||||
+ 0x1);
|
||||
+ break;
|
||||
+ case PMIC_MT6323:
|
||||
+ pwrap_write(wrp, wrp->slave->dew_regs[PWRAP_DEW_CIPHER_EN],
|
||||
+ 0x1);
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
/* wait for cipher data ready@AP */
|
||||
ret = pwrap_wait_for_state(wrp, pwrap_is_cipher_ready);
|
||||
if (ret) {
|
||||
@@ -858,6 +893,11 @@ static const struct regmap_config pwrap_
|
||||
.max_register = 0xffff,
|
||||
};
|
||||
|
||||
+static const struct pwrap_slv_type pmic_mt6323 = {
|
||||
+ .dew_regs = mt6323_regs,
|
||||
+ .type = PMIC_MT6323,
|
||||
+};
|
||||
+
|
||||
static const struct pwrap_slv_type pmic_mt6397 = {
|
||||
.dew_regs = mt6397_regs,
|
||||
.type = PMIC_MT6397,
|
||||
@@ -865,6 +905,9 @@ static const struct pwrap_slv_type pmic_
|
||||
|
||||
static const struct of_device_id of_slave_match_tbl[] = {
|
||||
{
|
||||
+ .compatible = "mediatek,mt6323",
|
||||
+ .data = &pmic_mt6323,
|
||||
+ }, {
|
||||
.compatible = "mediatek,mt6397",
|
||||
.data = &pmic_mt6397,
|
||||
}, {
|
|
@ -1,232 +0,0 @@
|
|||
From 7736d97fe2c6c71c9009a1b45a94de06bfc94a37 Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <blogic@openwrt.org>
|
||||
Date: Wed, 20 Jan 2016 12:09:14 +0100
|
||||
Subject: [PATCH 041/102] soc: mediatek: PMIC wrap: add MT2701/7623 support
|
||||
|
||||
Add the registers, callbacks and data structures required to make the
|
||||
wrapper work on MT2701 and MT7623.
|
||||
|
||||
Signed-off-by: John Crispin <blogic@openwrt.org>
|
||||
---
|
||||
drivers/soc/mediatek/mtk-pmic-wrap.c | 154 ++++++++++++++++++++++++++++++++++
|
||||
1 file changed, 154 insertions(+)
|
||||
|
||||
--- a/drivers/soc/mediatek/mtk-pmic-wrap.c
|
||||
+++ b/drivers/soc/mediatek/mtk-pmic-wrap.c
|
||||
@@ -52,6 +52,7 @@
|
||||
#define PWRAP_DEW_WRITE_TEST_VAL 0xa55a
|
||||
|
||||
/* macro for manual command */
|
||||
+#define PWRAP_MAN_CMD_SPI_WRITE_NEW (1 << 14)
|
||||
#define PWRAP_MAN_CMD_SPI_WRITE (1 << 13)
|
||||
#define PWRAP_MAN_CMD_OP_CSH (0x0 << 8)
|
||||
#define PWRAP_MAN_CMD_OP_CSL (0x1 << 8)
|
||||
@@ -200,6 +201,13 @@ enum pwrap_regs {
|
||||
PWRAP_DCM_EN,
|
||||
PWRAP_DCM_DBC_PRD,
|
||||
|
||||
+ /* MT2701 only regs */
|
||||
+ PWRAP_ADC_CMD_ADDR,
|
||||
+ PWRAP_PWRAP_ADC_CMD,
|
||||
+ PWRAP_ADC_RDY_ADDR,
|
||||
+ PWRAP_ADC_RDATA_ADDR1,
|
||||
+ PWRAP_ADC_RDATA_ADDR2,
|
||||
+
|
||||
/* MT8135 only regs */
|
||||
PWRAP_CSHEXT,
|
||||
PWRAP_EVENT_IN_EN,
|
||||
@@ -236,6 +244,92 @@ enum pwrap_regs {
|
||||
PWRAP_CIPHER_EN,
|
||||
};
|
||||
|
||||
+static int mt2701_regs[] = {
|
||||
+ [PWRAP_MUX_SEL] = 0x0,
|
||||
+ [PWRAP_WRAP_EN] = 0x4,
|
||||
+ [PWRAP_DIO_EN] = 0x8,
|
||||
+ [PWRAP_SIDLY] = 0xc,
|
||||
+ [PWRAP_RDDMY] = 0x18,
|
||||
+ [PWRAP_SI_CK_CON] = 0x1c,
|
||||
+ [PWRAP_CSHEXT_WRITE] = 0x20,
|
||||
+ [PWRAP_CSHEXT_READ] = 0x24,
|
||||
+ [PWRAP_CSLEXT_START] = 0x28,
|
||||
+ [PWRAP_CSLEXT_END] = 0x2c,
|
||||
+ [PWRAP_STAUPD_PRD] = 0x30,
|
||||
+ [PWRAP_STAUPD_GRPEN] = 0x34,
|
||||
+ [PWRAP_STAUPD_MAN_TRIG] = 0x38,
|
||||
+ [PWRAP_STAUPD_STA] = 0x3c,
|
||||
+ [PWRAP_WRAP_STA] = 0x44,
|
||||
+ [PWRAP_HARB_INIT] = 0x48,
|
||||
+ [PWRAP_HARB_HPRIO] = 0x4c,
|
||||
+ [PWRAP_HIPRIO_ARB_EN] = 0x50,
|
||||
+ [PWRAP_HARB_STA0] = 0x54,
|
||||
+ [PWRAP_HARB_STA1] = 0x58,
|
||||
+ [PWRAP_MAN_EN] = 0x5c,
|
||||
+ [PWRAP_MAN_CMD] = 0x60,
|
||||
+ [PWRAP_MAN_RDATA] = 0x64,
|
||||
+ [PWRAP_MAN_VLDCLR] = 0x68,
|
||||
+ [PWRAP_WACS0_EN] = 0x6c,
|
||||
+ [PWRAP_INIT_DONE0] = 0x70,
|
||||
+ [PWRAP_WACS0_CMD] = 0x74,
|
||||
+ [PWRAP_WACS0_RDATA] = 0x78,
|
||||
+ [PWRAP_WACS0_VLDCLR] = 0x7c,
|
||||
+ [PWRAP_WACS1_EN] = 0x80,
|
||||
+ [PWRAP_INIT_DONE1] = 0x84,
|
||||
+ [PWRAP_WACS1_CMD] = 0x88,
|
||||
+ [PWRAP_WACS1_RDATA] = 0x8c,
|
||||
+ [PWRAP_WACS1_VLDCLR] = 0x90,
|
||||
+ [PWRAP_WACS2_EN] = 0x94,
|
||||
+ [PWRAP_INIT_DONE2] = 0x98,
|
||||
+ [PWRAP_WACS2_CMD] = 0x9c,
|
||||
+ [PWRAP_WACS2_RDATA] = 0xa0,
|
||||
+ [PWRAP_WACS2_VLDCLR] = 0xa4,
|
||||
+ [PWRAP_INT_EN] = 0xa8,
|
||||
+ [PWRAP_INT_FLG_RAW] = 0xac,
|
||||
+ [PWRAP_INT_FLG] = 0xb0,
|
||||
+ [PWRAP_INT_CLR] = 0xb4,
|
||||
+ [PWRAP_SIG_ADR] = 0xb8,
|
||||
+ [PWRAP_SIG_MODE] = 0xbc,
|
||||
+ [PWRAP_SIG_VALUE] = 0xc0,
|
||||
+ [PWRAP_SIG_ERRVAL] = 0xc4,
|
||||
+ [PWRAP_CRC_EN] = 0xc8,
|
||||
+ [PWRAP_TIMER_EN] = 0xcc,
|
||||
+ [PWRAP_TIMER_STA] = 0xd0,
|
||||
+ [PWRAP_WDT_UNIT] = 0xd4,
|
||||
+ [PWRAP_WDT_SRC_EN] = 0xd8,
|
||||
+ [PWRAP_WDT_FLG] = 0xdc,
|
||||
+ [PWRAP_DEBUG_INT_SEL] = 0xe0,
|
||||
+ [PWRAP_DVFS_ADR0] = 0xe4,
|
||||
+ [PWRAP_DVFS_WDATA0] = 0xe8,
|
||||
+ [PWRAP_DVFS_ADR1] = 0xec,
|
||||
+ [PWRAP_DVFS_WDATA1] = 0xf0,
|
||||
+ [PWRAP_DVFS_ADR2] = 0xf4,
|
||||
+ [PWRAP_DVFS_WDATA2] = 0xf8,
|
||||
+ [PWRAP_DVFS_ADR3] = 0xfc,
|
||||
+ [PWRAP_DVFS_WDATA3] = 0x100,
|
||||
+ [PWRAP_DVFS_ADR4] = 0x104,
|
||||
+ [PWRAP_DVFS_WDATA4] = 0x108,
|
||||
+ [PWRAP_DVFS_ADR5] = 0x10c,
|
||||
+ [PWRAP_DVFS_WDATA5] = 0x110,
|
||||
+ [PWRAP_DVFS_ADR6] = 0x114,
|
||||
+ [PWRAP_DVFS_WDATA6] = 0x118,
|
||||
+ [PWRAP_DVFS_ADR7] = 0x11c,
|
||||
+ [PWRAP_DVFS_WDATA7] = 0x120,
|
||||
+ [PWRAP_CIPHER_KEY_SEL] = 0x124,
|
||||
+ [PWRAP_CIPHER_IV_SEL] = 0x128,
|
||||
+ [PWRAP_CIPHER_EN] = 0x12c,
|
||||
+ [PWRAP_CIPHER_RDY] = 0x130,
|
||||
+ [PWRAP_CIPHER_MODE] = 0x134,
|
||||
+ [PWRAP_CIPHER_SWRST] = 0x138,
|
||||
+ [PWRAP_DCM_EN] = 0x13c,
|
||||
+ [PWRAP_DCM_DBC_PRD] = 0x140,
|
||||
+ [PWRAP_ADC_CMD_ADDR] = 0x144,
|
||||
+ [PWRAP_PWRAP_ADC_CMD] = 0x148,
|
||||
+ [PWRAP_ADC_RDY_ADDR] = 0x14c,
|
||||
+ [PWRAP_ADC_RDATA_ADDR1] = 0x150,
|
||||
+ [PWRAP_ADC_RDATA_ADDR2] = 0x154,
|
||||
+};
|
||||
+
|
||||
static int mt8173_regs[] = {
|
||||
[PWRAP_MUX_SEL] = 0x0,
|
||||
[PWRAP_WRAP_EN] = 0x4,
|
||||
@@ -397,6 +491,7 @@ enum pmic_type {
|
||||
};
|
||||
|
||||
enum pwrap_type {
|
||||
+ PWRAP_MT2701,
|
||||
PWRAP_MT8135,
|
||||
PWRAP_MT8173,
|
||||
};
|
||||
@@ -637,6 +732,31 @@ static int pwrap_mt8173_init_reg_clock(s
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static int pwrap_mt2701_init_reg_clock(struct pmic_wrapper *wrp)
|
||||
+{
|
||||
+ switch (wrp->slave->type) {
|
||||
+ case PMIC_MT6397:
|
||||
+ pwrap_writel(wrp, 0xc, PWRAP_RDDMY);
|
||||
+ pwrap_writel(wrp, 0x4, PWRAP_CSHEXT_WRITE);
|
||||
+ pwrap_writel(wrp, 0x0, PWRAP_CSHEXT_READ);
|
||||
+ pwrap_writel(wrp, 0x2, PWRAP_CSLEXT_START);
|
||||
+ pwrap_writel(wrp, 0x2, PWRAP_CSLEXT_END);
|
||||
+ break;
|
||||
+
|
||||
+ case PMIC_MT6323:
|
||||
+ pwrap_writel(wrp, 0x8, PWRAP_RDDMY);
|
||||
+ pwrap_write(wrp, wrp->slave->dew_regs[PWRAP_DEW_RDDMY_NO],
|
||||
+ 0x8);
|
||||
+ pwrap_writel(wrp, 0x5, PWRAP_CSHEXT_WRITE);
|
||||
+ pwrap_writel(wrp, 0x0, PWRAP_CSHEXT_READ);
|
||||
+ pwrap_writel(wrp, 0x2, PWRAP_CSLEXT_START);
|
||||
+ pwrap_writel(wrp, 0x2, PWRAP_CSLEXT_END);
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static bool pwrap_is_cipher_ready(struct pmic_wrapper *wrp)
|
||||
{
|
||||
return pwrap_readl(wrp, PWRAP_CIPHER_RDY) & 1;
|
||||
@@ -670,6 +790,7 @@ static int pwrap_init_cipher(struct pmic
|
||||
pwrap_writel(wrp, 1, PWRAP_CIPHER_LOAD);
|
||||
pwrap_writel(wrp, 1, PWRAP_CIPHER_START);
|
||||
break;
|
||||
+ case PWRAP_MT2701:
|
||||
case PWRAP_MT8173:
|
||||
pwrap_writel(wrp, 1, PWRAP_CIPHER_EN);
|
||||
break;
|
||||
@@ -772,6 +893,24 @@ static int pwrap_mt8173_init_soc_specifi
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static int pwrap_mt2701_init_soc_specific(struct pmic_wrapper *wrp)
|
||||
+{
|
||||
+ /* GPS_INTF initialization */
|
||||
+ switch (wrp->slave->type) {
|
||||
+ case PMIC_MT6323:
|
||||
+ pwrap_writel(wrp, 0x076c, PWRAP_ADC_CMD_ADDR);
|
||||
+ pwrap_writel(wrp, 0x8000, PWRAP_PWRAP_ADC_CMD);
|
||||
+ pwrap_writel(wrp, 0x072c, PWRAP_ADC_RDY_ADDR);
|
||||
+ pwrap_writel(wrp, 0x072e, PWRAP_ADC_RDATA_ADDR1);
|
||||
+ pwrap_writel(wrp, 0x0730, PWRAP_ADC_RDATA_ADDR2);
|
||||
+ break;
|
||||
+ default:
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static int pwrap_init(struct pmic_wrapper *wrp)
|
||||
{
|
||||
int ret;
|
||||
@@ -916,6 +1055,18 @@ static const struct of_device_id of_slav
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, of_slave_match_tbl);
|
||||
|
||||
+static const struct pmic_wrapper_type pwrap_mt2701 = {
|
||||
+ .regs = mt2701_regs,
|
||||
+ .type = PWRAP_MT2701,
|
||||
+ .arb_en_all = 0x3f,
|
||||
+ .int_en_all = ~(BIT(31) | BIT(2)),
|
||||
+ .spi_w = PWRAP_MAN_CMD_SPI_WRITE_NEW,
|
||||
+ .wdt_src = PWRAP_WDT_SRC_MASK_ALL,
|
||||
+ .has_bridge = 0,
|
||||
+ .init_reg_clock = pwrap_mt2701_init_reg_clock,
|
||||
+ .init_soc_specific = pwrap_mt2701_init_soc_specific,
|
||||
+};
|
||||
+
|
||||
static struct pmic_wrapper_type pwrap_mt8135 = {
|
||||
.regs = mt8135_regs,
|
||||
.type = PWRAP_MT8135,
|
||||
@@ -942,6 +1093,9 @@ static struct pmic_wrapper_type pwrap_mt
|
||||
|
||||
static struct of_device_id of_pwrap_match_tbl[] = {
|
||||
{
|
||||
+ .compatible = "mediatek,mt2701-pwrap",
|
||||
+ .data = &pwrap_mt2701,
|
||||
+ }, {
|
||||
.compatible = "mediatek,mt8135-pwrap",
|
||||
.data = &pwrap_mt8135,
|
||||
}, {
|
|
@ -1,50 +0,0 @@
|
|||
From c14dc2993a272c706650502ec579ceabe5f2355e Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <blogic@openwrt.org>
|
||||
Date: Sun, 10 Jan 2016 17:12:37 +0100
|
||||
Subject: [PATCH 042/102] dt-bindings: mfd: Add bindings for the MediaTek
|
||||
MT6323 PMIC
|
||||
|
||||
Signed-off-by: John Crispin <blogic@openwrt.org>
|
||||
Acked-by: Rob Herring <robh@kernel.org>
|
||||
Cc: devicetree@vger.kernel.org
|
||||
---
|
||||
Documentation/devicetree/bindings/mfd/mt6397.txt | 10 ++++++----
|
||||
1 file changed, 6 insertions(+), 4 deletions(-)
|
||||
|
||||
--- a/Documentation/devicetree/bindings/mfd/mt6397.txt
|
||||
+++ b/Documentation/devicetree/bindings/mfd/mt6397.txt
|
||||
@@ -1,6 +1,6 @@
|
||||
-MediaTek MT6397 Multifunction Device Driver
|
||||
+MediaTek MT6397/MT6323 Multifunction Device Driver
|
||||
|
||||
-MT6397 is a multifunction device with the following sub modules:
|
||||
+MT6397/MT6323 is a multifunction device with the following sub modules:
|
||||
- Regulator
|
||||
- RTC
|
||||
- Audio codec
|
||||
@@ -8,14 +8,14 @@ MT6397 is a multifunction device with th
|
||||
- Clock
|
||||
|
||||
It is interfaced to host controller using SPI interface by a proprietary hardware
|
||||
-called PMIC wrapper or pwrap. MT6397 MFD is a child device of pwrap.
|
||||
+called PMIC wrapper or pwrap. MT6397/MT6323 MFD is a child device of pwrap.
|
||||
See the following for pwarp node definitions:
|
||||
Documentation/devicetree/bindings/soc/pwrap.txt
|
||||
|
||||
This document describes the binding for MFD device and its sub module.
|
||||
|
||||
Required properties:
|
||||
-compatible: "mediatek,mt6397"
|
||||
+compatible: "mediatek,mt6397" or "mediatek,mt6323"
|
||||
|
||||
Optional subnodes:
|
||||
|
||||
@@ -26,6 +26,8 @@ Optional subnodes:
|
||||
Required properties:
|
||||
- compatible: "mediatek,mt6397-regulator"
|
||||
see Documentation/devicetree/bindings/regulator/mt6397-regulator.txt
|
||||
+ - compatible: "mediatek,mt6323-regulator"
|
||||
+ see Documentation/devicetree/bindings/regulator/mt6323-regulator.txt
|
||||
- codec
|
||||
Required properties:
|
||||
- compatible: "mediatek,mt6397-codec"
|
|
@ -1,97 +0,0 @@
|
|||
From 8269ed007349714e9ef0e3408a68159d763145dd Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <blogic@openwrt.org>
|
||||
Date: Fri, 8 Jan 2016 08:33:17 +0100
|
||||
Subject: [PATCH 043/102] mfd: mt6397: int_con and int_status may vary in
|
||||
location
|
||||
|
||||
MT6323 has the INT_CON and INT_STATUS located at a different position.
|
||||
Make the registers locations configurable.
|
||||
|
||||
Signed-off-by: John Crispin <blogic@openwrt.org>
|
||||
---
|
||||
drivers/mfd/mt6397-core.c | 27 +++++++++++++++++----------
|
||||
include/linux/mfd/mt6397/core.h | 2 ++
|
||||
2 files changed, 19 insertions(+), 10 deletions(-)
|
||||
|
||||
--- a/drivers/mfd/mt6397-core.c
|
||||
+++ b/drivers/mfd/mt6397-core.c
|
||||
@@ -69,8 +69,10 @@ static void mt6397_irq_sync_unlock(struc
|
||||
{
|
||||
struct mt6397_chip *mt6397 = irq_data_get_irq_chip_data(data);
|
||||
|
||||
- regmap_write(mt6397->regmap, MT6397_INT_CON0, mt6397->irq_masks_cur[0]);
|
||||
- regmap_write(mt6397->regmap, MT6397_INT_CON1, mt6397->irq_masks_cur[1]);
|
||||
+ regmap_write(mt6397->regmap, mt6397->int_con[0],
|
||||
+ mt6397->irq_masks_cur[0]);
|
||||
+ regmap_write(mt6397->regmap, mt6397->int_con[1],
|
||||
+ mt6397->irq_masks_cur[1]);
|
||||
|
||||
mutex_unlock(&mt6397->irqlock);
|
||||
}
|
||||
@@ -147,8 +149,8 @@ static irqreturn_t mt6397_irq_thread(int
|
||||
{
|
||||
struct mt6397_chip *mt6397 = data;
|
||||
|
||||
- mt6397_irq_handle_reg(mt6397, MT6397_INT_STATUS0, 0);
|
||||
- mt6397_irq_handle_reg(mt6397, MT6397_INT_STATUS1, 16);
|
||||
+ mt6397_irq_handle_reg(mt6397, mt6397->int_status[0], 0);
|
||||
+ mt6397_irq_handle_reg(mt6397, mt6397->int_status[1], 16);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
@@ -177,8 +179,8 @@ static int mt6397_irq_init(struct mt6397
|
||||
mutex_init(&mt6397->irqlock);
|
||||
|
||||
/* Mask all interrupt sources */
|
||||
- regmap_write(mt6397->regmap, MT6397_INT_CON0, 0x0);
|
||||
- regmap_write(mt6397->regmap, MT6397_INT_CON1, 0x0);
|
||||
+ regmap_write(mt6397->regmap, mt6397->int_con[0], 0x0);
|
||||
+ regmap_write(mt6397->regmap, mt6397->int_con[1], 0x0);
|
||||
|
||||
mt6397->irq_domain = irq_domain_add_linear(mt6397->dev->of_node,
|
||||
MT6397_IRQ_NR, &mt6397_irq_domain_ops, mt6397);
|
||||
@@ -203,8 +205,8 @@ static int mt6397_irq_suspend(struct dev
|
||||
{
|
||||
struct mt6397_chip *chip = dev_get_drvdata(dev);
|
||||
|
||||
- regmap_write(chip->regmap, MT6397_INT_CON0, chip->wake_mask[0]);
|
||||
- regmap_write(chip->regmap, MT6397_INT_CON1, chip->wake_mask[1]);
|
||||
+ regmap_write(chip->regmap, chip->int_con[0], chip->wake_mask[0]);
|
||||
+ regmap_write(chip->regmap, chip->int_con[1], chip->wake_mask[1]);
|
||||
|
||||
enable_irq_wake(chip->irq);
|
||||
|
||||
@@ -215,8 +217,8 @@ static int mt6397_irq_resume(struct devi
|
||||
{
|
||||
struct mt6397_chip *chip = dev_get_drvdata(dev);
|
||||
|
||||
- regmap_write(chip->regmap, MT6397_INT_CON0, chip->irq_masks_cur[0]);
|
||||
- regmap_write(chip->regmap, MT6397_INT_CON1, chip->irq_masks_cur[1]);
|
||||
+ regmap_write(chip->regmap, chip->int_con[0], chip->irq_masks_cur[0]);
|
||||
+ regmap_write(chip->regmap, chip->int_con[1], chip->irq_masks_cur[1]);
|
||||
|
||||
disable_irq_wake(chip->irq);
|
||||
|
||||
@@ -237,6 +239,11 @@ static int mt6397_probe(struct platform_
|
||||
return -ENOMEM;
|
||||
|
||||
mt6397->dev = &pdev->dev;
|
||||
+ mt6397->int_con[0] = MT6397_INT_CON0;
|
||||
+ mt6397->int_con[1] = MT6397_INT_CON1;
|
||||
+ mt6397->int_status[0] = MT6397_INT_STATUS0;
|
||||
+ mt6397->int_status[1] = MT6397_INT_STATUS1;
|
||||
+
|
||||
/*
|
||||
* mt6397 MFD is child device of soc pmic wrapper.
|
||||
* Regmap is set from its parent.
|
||||
--- a/include/linux/mfd/mt6397/core.h
|
||||
+++ b/include/linux/mfd/mt6397/core.h
|
||||
@@ -60,6 +60,8 @@ struct mt6397_chip {
|
||||
u16 wake_mask[2];
|
||||
u16 irq_masks_cur[2];
|
||||
u16 irq_masks_cache[2];
|
||||
+ u16 int_con[2];
|
||||
+ u16 int_status[2];
|
||||
};
|
||||
|
||||
#endif /* __MFD_MT6397_CORE_H__ */
|
|
@ -1,100 +0,0 @@
|
|||
From c6c447480e51301faa2254c7316ab075e20c4b0c Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <blogic@openwrt.org>
|
||||
Date: Fri, 8 Jan 2016 08:41:52 +0100
|
||||
Subject: [PATCH 044/102] mfd: mt6397: add support for different Slave types
|
||||
|
||||
Signed-off-by: John Crispin <blogic@openwrt.org>
|
||||
---
|
||||
drivers/mfd/mt6397-core.c | 58 ++++++++++++++++++++++++++++++++-------------
|
||||
1 file changed, 41 insertions(+), 17 deletions(-)
|
||||
|
||||
--- a/drivers/mfd/mt6397-core.c
|
||||
+++ b/drivers/mfd/mt6397-core.c
|
||||
@@ -24,6 +24,9 @@
|
||||
#define MT6397_RTC_BASE 0xe000
|
||||
#define MT6397_RTC_SIZE 0x3e
|
||||
|
||||
+#define MT6391_CID_CODE 0x91
|
||||
+#define MT6397_CID_CODE 0x97
|
||||
+
|
||||
static const struct resource mt6397_rtc_resources[] = {
|
||||
{
|
||||
.start = MT6397_RTC_BASE,
|
||||
@@ -232,39 +235,60 @@ static SIMPLE_DEV_PM_OPS(mt6397_pm_ops,
|
||||
static int mt6397_probe(struct platform_device *pdev)
|
||||
{
|
||||
int ret;
|
||||
- struct mt6397_chip *mt6397;
|
||||
+ unsigned int id;
|
||||
+ struct mt6397_chip *pmic;
|
||||
|
||||
- mt6397 = devm_kzalloc(&pdev->dev, sizeof(*mt6397), GFP_KERNEL);
|
||||
- if (!mt6397)
|
||||
+ pmic = devm_kzalloc(&pdev->dev, sizeof(*pmic), GFP_KERNEL);
|
||||
+ if (!pmic)
|
||||
return -ENOMEM;
|
||||
|
||||
- mt6397->dev = &pdev->dev;
|
||||
- mt6397->int_con[0] = MT6397_INT_CON0;
|
||||
- mt6397->int_con[1] = MT6397_INT_CON1;
|
||||
- mt6397->int_status[0] = MT6397_INT_STATUS0;
|
||||
- mt6397->int_status[1] = MT6397_INT_STATUS1;
|
||||
+ pmic->dev = &pdev->dev;
|
||||
|
||||
/*
|
||||
* mt6397 MFD is child device of soc pmic wrapper.
|
||||
* Regmap is set from its parent.
|
||||
*/
|
||||
- mt6397->regmap = dev_get_regmap(pdev->dev.parent, NULL);
|
||||
- if (!mt6397->regmap)
|
||||
+ pmic->regmap = dev_get_regmap(pdev->dev.parent, NULL);
|
||||
+ if (!pmic->regmap)
|
||||
return -ENODEV;
|
||||
|
||||
- platform_set_drvdata(pdev, mt6397);
|
||||
+ platform_set_drvdata(pdev, pmic);
|
||||
+
|
||||
+ ret = regmap_read(pmic->regmap, MT6397_CID, &id);
|
||||
+ if (ret) {
|
||||
+ dev_err(pmic->dev, "Failed to read chip id: %d\n", ret);
|
||||
+ goto fail_irq;
|
||||
+ }
|
||||
+
|
||||
+ switch (id & 0xff) {
|
||||
+ case MT6397_CID_CODE:
|
||||
+ case MT6391_CID_CODE:
|
||||
+ pmic->int_con[0] = MT6397_INT_CON0;
|
||||
+ pmic->int_con[1] = MT6397_INT_CON1;
|
||||
+ pmic->int_status[0] = MT6397_INT_STATUS0;
|
||||
+ pmic->int_status[1] = MT6397_INT_STATUS1;
|
||||
+ ret = mfd_add_devices(&pdev->dev, -1, mt6397_devs,
|
||||
+ ARRAY_SIZE(mt6397_devs), NULL, 0, NULL);
|
||||
+ break;
|
||||
+
|
||||
+ default:
|
||||
+ dev_err(&pdev->dev, "unsupported chip: %d\n", id);
|
||||
+ ret = -ENODEV;
|
||||
+ break;
|
||||
+ }
|
||||
|
||||
- mt6397->irq = platform_get_irq(pdev, 0);
|
||||
- if (mt6397->irq > 0) {
|
||||
- ret = mt6397_irq_init(mt6397);
|
||||
+ pmic->irq = platform_get_irq(pdev, 0);
|
||||
+ if (pmic->irq > 0) {
|
||||
+ ret = mt6397_irq_init(pmic);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
- ret = mfd_add_devices(&pdev->dev, -1, mt6397_devs,
|
||||
- ARRAY_SIZE(mt6397_devs), NULL, 0, NULL);
|
||||
- if (ret)
|
||||
+fail_irq:
|
||||
+ if (ret) {
|
||||
+ irq_domain_remove(pmic->irq_domain);
|
||||
dev_err(&pdev->dev, "failed to add child devices: %d\n", ret);
|
||||
+ }
|
||||
|
||||
return ret;
|
||||
}
|
|
@ -1,519 +0,0 @@
|
|||
From 0ae7153c9f00361c3e6dac9da0c2d994557953f5 Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <blogic@openwrt.org>
|
||||
Date: Fri, 8 Jan 2016 04:09:43 +0100
|
||||
Subject: [PATCH 045/102] mfd: mt6397: add MT6323 support to MT6397 driver
|
||||
|
||||
Signed-off-by: John Crispin <blogic@openwrt.org>
|
||||
---
|
||||
drivers/mfd/mt6397-core.c | 20 ++
|
||||
include/linux/mfd/mt6323/core.h | 36 +++
|
||||
include/linux/mfd/mt6323/registers.h | 408 ++++++++++++++++++++++++++++++++++
|
||||
3 files changed, 464 insertions(+)
|
||||
create mode 100644 include/linux/mfd/mt6323/core.h
|
||||
create mode 100644 include/linux/mfd/mt6323/registers.h
|
||||
|
||||
--- a/drivers/mfd/mt6397-core.c
|
||||
+++ b/drivers/mfd/mt6397-core.c
|
||||
@@ -19,11 +19,14 @@
|
||||
#include <linux/regmap.h>
|
||||
#include <linux/mfd/core.h>
|
||||
#include <linux/mfd/mt6397/core.h>
|
||||
+#include <linux/mfd/mt6323/core.h>
|
||||
#include <linux/mfd/mt6397/registers.h>
|
||||
+#include <linux/mfd/mt6323/registers.h>
|
||||
|
||||
#define MT6397_RTC_BASE 0xe000
|
||||
#define MT6397_RTC_SIZE 0x3e
|
||||
|
||||
+#define MT6323_CID_CODE 0x23
|
||||
#define MT6391_CID_CODE 0x91
|
||||
#define MT6397_CID_CODE 0x97
|
||||
|
||||
@@ -40,6 +43,13 @@ static const struct resource mt6397_rtc_
|
||||
},
|
||||
};
|
||||
|
||||
+static const struct mfd_cell mt6323_devs[] = {
|
||||
+ {
|
||||
+ .name = "mt6323-regulator",
|
||||
+ .of_compatible = "mediatek,mt6323-regulator"
|
||||
+ },
|
||||
+};
|
||||
+
|
||||
static const struct mfd_cell mt6397_devs[] = {
|
||||
{
|
||||
.name = "mt6397-rtc",
|
||||
@@ -261,6 +271,15 @@ static int mt6397_probe(struct platform_
|
||||
}
|
||||
|
||||
switch (id & 0xff) {
|
||||
+ case MT6323_CID_CODE:
|
||||
+ pmic->int_con[0] = MT6323_INT_CON0;
|
||||
+ pmic->int_con[1] = MT6323_INT_CON1;
|
||||
+ pmic->int_status[0] = MT6323_INT_STATUS0;
|
||||
+ pmic->int_status[1] = MT6323_INT_STATUS1;
|
||||
+ ret = mfd_add_devices(&pdev->dev, -1, mt6323_devs,
|
||||
+ ARRAY_SIZE(mt6323_devs), NULL, 0, NULL);
|
||||
+ break;
|
||||
+
|
||||
case MT6397_CID_CODE:
|
||||
case MT6391_CID_CODE:
|
||||
pmic->int_con[0] = MT6397_INT_CON0;
|
||||
@@ -302,6 +321,7 @@ static int mt6397_remove(struct platform
|
||||
|
||||
static const struct of_device_id mt6397_of_match[] = {
|
||||
{ .compatible = "mediatek,mt6397" },
|
||||
+ { .compatible = "mediatek,mt6323" },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, mt6397_of_match);
|
||||
--- /dev/null
|
||||
+++ b/include/linux/mfd/mt6323/core.h
|
||||
@@ -0,0 +1,36 @@
|
||||
+/*
|
||||
+ * Copyright (c) 2016 Chen Zhong <chen.zhong@mediatek.com>
|
||||
+ *
|
||||
+ * This program is free software; you can redistribute it and/or modify
|
||||
+ * it under the terms of the GNU General Public License version 2 as
|
||||
+ * published by the Free Software Foundation.
|
||||
+ */
|
||||
+
|
||||
+#ifndef __MFD_MT6323_CORE_H__
|
||||
+#define __MFD_MT6323_CORE_H__
|
||||
+
|
||||
+enum MT6323_IRQ_STATUS_numbers {
|
||||
+ MT6323_IRQ_STATUS_SPKL_AB = 0,
|
||||
+ MT6323_IRQ_STATUS_SPKL,
|
||||
+ MT6323_IRQ_STATUS_BAT_L,
|
||||
+ MT6323_IRQ_STATUS_BAT_H,
|
||||
+ MT6323_IRQ_STATUS_WATCHDOG,
|
||||
+ MT6323_IRQ_STATUS_PWRKEY,
|
||||
+ MT6323_IRQ_STATUS_THR_L,
|
||||
+ MT6323_IRQ_STATUS_THR_H,
|
||||
+ MT6323_IRQ_STATUS_VBATON_UNDET,
|
||||
+ MT6323_IRQ_STATUS_BVALID_DET,
|
||||
+ MT6323_IRQ_STATUS_CHRDET,
|
||||
+ MT6323_IRQ_STATUS_OV,
|
||||
+ MT6323_IRQ_STATUS_LDO = 16,
|
||||
+ MT6323_IRQ_STATUS_FCHRKEY,
|
||||
+ MT6323_IRQ_STATUS_ACCDET,
|
||||
+ MT6323_IRQ_STATUS_AUDIO,
|
||||
+ MT6323_IRQ_STATUS_RTC,
|
||||
+ MT6323_IRQ_STATUS_VPROC,
|
||||
+ MT6323_IRQ_STATUS_VSYS,
|
||||
+ MT6323_IRQ_STATUS_VPA,
|
||||
+ MT6323_IRQ_STATUS_NR,
|
||||
+};
|
||||
+
|
||||
+#endif /* __MFD_MT6323_CORE_H__ */
|
||||
--- /dev/null
|
||||
+++ b/include/linux/mfd/mt6323/registers.h
|
||||
@@ -0,0 +1,408 @@
|
||||
+/*
|
||||
+ * Copyright (c) 2016 Chen Zhong <chen.zhong@mediatek.com>
|
||||
+ *
|
||||
+ * This program is free software; you can redistribute it and/or modify
|
||||
+ * it under the terms of the GNU General Public License version 2 as
|
||||
+ * published by the Free Software Foundation.
|
||||
+ */
|
||||
+
|
||||
+#ifndef __MFD_MT6323_REGISTERS_H__
|
||||
+#define __MFD_MT6323_REGISTERS_H__
|
||||
+
|
||||
+/* PMIC Registers */
|
||||
+#define MT6323_CHR_CON0 0x0000
|
||||
+#define MT6323_CHR_CON1 0x0002
|
||||
+#define MT6323_CHR_CON2 0x0004
|
||||
+#define MT6323_CHR_CON3 0x0006
|
||||
+#define MT6323_CHR_CON4 0x0008
|
||||
+#define MT6323_CHR_CON5 0x000A
|
||||
+#define MT6323_CHR_CON6 0x000C
|
||||
+#define MT6323_CHR_CON7 0x000E
|
||||
+#define MT6323_CHR_CON8 0x0010
|
||||
+#define MT6323_CHR_CON9 0x0012
|
||||
+#define MT6323_CHR_CON10 0x0014
|
||||
+#define MT6323_CHR_CON11 0x0016
|
||||
+#define MT6323_CHR_CON12 0x0018
|
||||
+#define MT6323_CHR_CON13 0x001A
|
||||
+#define MT6323_CHR_CON14 0x001C
|
||||
+#define MT6323_CHR_CON15 0x001E
|
||||
+#define MT6323_CHR_CON16 0x0020
|
||||
+#define MT6323_CHR_CON17 0x0022
|
||||
+#define MT6323_CHR_CON18 0x0024
|
||||
+#define MT6323_CHR_CON19 0x0026
|
||||
+#define MT6323_CHR_CON20 0x0028
|
||||
+#define MT6323_CHR_CON21 0x002A
|
||||
+#define MT6323_CHR_CON22 0x002C
|
||||
+#define MT6323_CHR_CON23 0x002E
|
||||
+#define MT6323_CHR_CON24 0x0030
|
||||
+#define MT6323_CHR_CON25 0x0032
|
||||
+#define MT6323_CHR_CON26 0x0034
|
||||
+#define MT6323_CHR_CON27 0x0036
|
||||
+#define MT6323_CHR_CON28 0x0038
|
||||
+#define MT6323_CHR_CON29 0x003A
|
||||
+#define MT6323_STRUP_CON0 0x003C
|
||||
+#define MT6323_STRUP_CON2 0x003E
|
||||
+#define MT6323_STRUP_CON3 0x0040
|
||||
+#define MT6323_STRUP_CON4 0x0042
|
||||
+#define MT6323_STRUP_CON5 0x0044
|
||||
+#define MT6323_STRUP_CON6 0x0046
|
||||
+#define MT6323_STRUP_CON7 0x0048
|
||||
+#define MT6323_STRUP_CON8 0x004A
|
||||
+#define MT6323_STRUP_CON9 0x004C
|
||||
+#define MT6323_STRUP_CON10 0x004E
|
||||
+#define MT6323_STRUP_CON11 0x0050
|
||||
+#define MT6323_SPK_CON0 0x0052
|
||||
+#define MT6323_SPK_CON1 0x0054
|
||||
+#define MT6323_SPK_CON2 0x0056
|
||||
+#define MT6323_SPK_CON6 0x005E
|
||||
+#define MT6323_SPK_CON7 0x0060
|
||||
+#define MT6323_SPK_CON8 0x0062
|
||||
+#define MT6323_SPK_CON9 0x0064
|
||||
+#define MT6323_SPK_CON10 0x0066
|
||||
+#define MT6323_SPK_CON11 0x0068
|
||||
+#define MT6323_SPK_CON12 0x006A
|
||||
+#define MT6323_CID 0x0100
|
||||
+#define MT6323_TOP_CKPDN0 0x0102
|
||||
+#define MT6323_TOP_CKPDN0_SET 0x0104
|
||||
+#define MT6323_TOP_CKPDN0_CLR 0x0106
|
||||
+#define MT6323_TOP_CKPDN1 0x0108
|
||||
+#define MT6323_TOP_CKPDN1_SET 0x010A
|
||||
+#define MT6323_TOP_CKPDN1_CLR 0x010C
|
||||
+#define MT6323_TOP_CKPDN2 0x010E
|
||||
+#define MT6323_TOP_CKPDN2_SET 0x0110
|
||||
+#define MT6323_TOP_CKPDN2_CLR 0x0112
|
||||
+#define MT6323_TOP_RST_CON 0x0114
|
||||
+#define MT6323_TOP_RST_CON_SET 0x0116
|
||||
+#define MT6323_TOP_RST_CON_CLR 0x0118
|
||||
+#define MT6323_TOP_RST_MISC 0x011A
|
||||
+#define MT6323_TOP_RST_MISC_SET 0x011C
|
||||
+#define MT6323_TOP_RST_MISC_CLR 0x011E
|
||||
+#define MT6323_TOP_CKCON0 0x0120
|
||||
+#define MT6323_TOP_CKCON0_SET 0x0122
|
||||
+#define MT6323_TOP_CKCON0_CLR 0x0124
|
||||
+#define MT6323_TOP_CKCON1 0x0126
|
||||
+#define MT6323_TOP_CKCON1_SET 0x0128
|
||||
+#define MT6323_TOP_CKCON1_CLR 0x012A
|
||||
+#define MT6323_TOP_CKTST0 0x012C
|
||||
+#define MT6323_TOP_CKTST1 0x012E
|
||||
+#define MT6323_TOP_CKTST2 0x0130
|
||||
+#define MT6323_TEST_OUT 0x0132
|
||||
+#define MT6323_TEST_CON0 0x0134
|
||||
+#define MT6323_TEST_CON1 0x0136
|
||||
+#define MT6323_EN_STATUS0 0x0138
|
||||
+#define MT6323_EN_STATUS1 0x013A
|
||||
+#define MT6323_OCSTATUS0 0x013C
|
||||
+#define MT6323_OCSTATUS1 0x013E
|
||||
+#define MT6323_PGSTATUS 0x0140
|
||||
+#define MT6323_CHRSTATUS 0x0142
|
||||
+#define MT6323_TDSEL_CON 0x0144
|
||||
+#define MT6323_RDSEL_CON 0x0146
|
||||
+#define MT6323_SMT_CON0 0x0148
|
||||
+#define MT6323_SMT_CON1 0x014A
|
||||
+#define MT6323_SMT_CON2 0x014C
|
||||
+#define MT6323_SMT_CON3 0x014E
|
||||
+#define MT6323_SMT_CON4 0x0150
|
||||
+#define MT6323_DRV_CON0 0x0152
|
||||
+#define MT6323_DRV_CON1 0x0154
|
||||
+#define MT6323_DRV_CON2 0x0156
|
||||
+#define MT6323_DRV_CON3 0x0158
|
||||
+#define MT6323_DRV_CON4 0x015A
|
||||
+#define MT6323_SIMLS1_CON 0x015C
|
||||
+#define MT6323_SIMLS2_CON 0x015E
|
||||
+#define MT6323_INT_CON0 0x0160
|
||||
+#define MT6323_INT_CON0_SET 0x0162
|
||||
+#define MT6323_INT_CON0_CLR 0x0164
|
||||
+#define MT6323_INT_CON1 0x0166
|
||||
+#define MT6323_INT_CON1_SET 0x0168
|
||||
+#define MT6323_INT_CON1_CLR 0x016A
|
||||
+#define MT6323_INT_MISC_CON 0x016C
|
||||
+#define MT6323_INT_MISC_CON_SET 0x016E
|
||||
+#define MT6323_INT_MISC_CON_CLR 0x0170
|
||||
+#define MT6323_INT_STATUS0 0x0172
|
||||
+#define MT6323_INT_STATUS1 0x0174
|
||||
+#define MT6323_OC_GEAR_0 0x0176
|
||||
+#define MT6323_OC_GEAR_1 0x0178
|
||||
+#define MT6323_OC_GEAR_2 0x017A
|
||||
+#define MT6323_OC_CTL_VPROC 0x017C
|
||||
+#define MT6323_OC_CTL_VSYS 0x017E
|
||||
+#define MT6323_OC_CTL_VPA 0x0180
|
||||
+#define MT6323_FQMTR_CON0 0x0182
|
||||
+#define MT6323_FQMTR_CON1 0x0184
|
||||
+#define MT6323_FQMTR_CON2 0x0186
|
||||
+#define MT6323_RG_SPI_CON 0x0188
|
||||
+#define MT6323_DEW_DIO_EN 0x018A
|
||||
+#define MT6323_DEW_READ_TEST 0x018C
|
||||
+#define MT6323_DEW_WRITE_TEST 0x018E
|
||||
+#define MT6323_DEW_CRC_SWRST 0x0190
|
||||
+#define MT6323_DEW_CRC_EN 0x0192
|
||||
+#define MT6323_DEW_CRC_VAL 0x0194
|
||||
+#define MT6323_DEW_DBG_MON_SEL 0x0196
|
||||
+#define MT6323_DEW_CIPHER_KEY_SEL 0x0198
|
||||
+#define MT6323_DEW_CIPHER_IV_SEL 0x019A
|
||||
+#define MT6323_DEW_CIPHER_EN 0x019C
|
||||
+#define MT6323_DEW_CIPHER_RDY 0x019E
|
||||
+#define MT6323_DEW_CIPHER_MODE 0x01A0
|
||||
+#define MT6323_DEW_CIPHER_SWRST 0x01A2
|
||||
+#define MT6323_DEW_RDDMY_NO 0x01A4
|
||||
+#define MT6323_DEW_RDATA_DLY_SEL 0x01A6
|
||||
+#define MT6323_BUCK_CON0 0x0200
|
||||
+#define MT6323_BUCK_CON1 0x0202
|
||||
+#define MT6323_BUCK_CON2 0x0204
|
||||
+#define MT6323_BUCK_CON3 0x0206
|
||||
+#define MT6323_BUCK_CON4 0x0208
|
||||
+#define MT6323_BUCK_CON5 0x020A
|
||||
+#define MT6323_VPROC_CON0 0x020C
|
||||
+#define MT6323_VPROC_CON1 0x020E
|
||||
+#define MT6323_VPROC_CON2 0x0210
|
||||
+#define MT6323_VPROC_CON3 0x0212
|
||||
+#define MT6323_VPROC_CON4 0x0214
|
||||
+#define MT6323_VPROC_CON5 0x0216
|
||||
+#define MT6323_VPROC_CON7 0x021A
|
||||
+#define MT6323_VPROC_CON8 0x021C
|
||||
+#define MT6323_VPROC_CON9 0x021E
|
||||
+#define MT6323_VPROC_CON10 0x0220
|
||||
+#define MT6323_VPROC_CON11 0x0222
|
||||
+#define MT6323_VPROC_CON12 0x0224
|
||||
+#define MT6323_VPROC_CON13 0x0226
|
||||
+#define MT6323_VPROC_CON14 0x0228
|
||||
+#define MT6323_VPROC_CON15 0x022A
|
||||
+#define MT6323_VPROC_CON18 0x0230
|
||||
+#define MT6323_VSYS_CON0 0x0232
|
||||
+#define MT6323_VSYS_CON1 0x0234
|
||||
+#define MT6323_VSYS_CON2 0x0236
|
||||
+#define MT6323_VSYS_CON3 0x0238
|
||||
+#define MT6323_VSYS_CON4 0x023A
|
||||
+#define MT6323_VSYS_CON5 0x023C
|
||||
+#define MT6323_VSYS_CON7 0x0240
|
||||
+#define MT6323_VSYS_CON8 0x0242
|
||||
+#define MT6323_VSYS_CON9 0x0244
|
||||
+#define MT6323_VSYS_CON10 0x0246
|
||||
+#define MT6323_VSYS_CON11 0x0248
|
||||
+#define MT6323_VSYS_CON12 0x024A
|
||||
+#define MT6323_VSYS_CON13 0x024C
|
||||
+#define MT6323_VSYS_CON14 0x024E
|
||||
+#define MT6323_VSYS_CON15 0x0250
|
||||
+#define MT6323_VSYS_CON18 0x0256
|
||||
+#define MT6323_VPA_CON0 0x0300
|
||||
+#define MT6323_VPA_CON1 0x0302
|
||||
+#define MT6323_VPA_CON2 0x0304
|
||||
+#define MT6323_VPA_CON3 0x0306
|
||||
+#define MT6323_VPA_CON4 0x0308
|
||||
+#define MT6323_VPA_CON5 0x030A
|
||||
+#define MT6323_VPA_CON7 0x030E
|
||||
+#define MT6323_VPA_CON8 0x0310
|
||||
+#define MT6323_VPA_CON9 0x0312
|
||||
+#define MT6323_VPA_CON10 0x0314
|
||||
+#define MT6323_VPA_CON11 0x0316
|
||||
+#define MT6323_VPA_CON12 0x0318
|
||||
+#define MT6323_VPA_CON14 0x031C
|
||||
+#define MT6323_VPA_CON16 0x0320
|
||||
+#define MT6323_VPA_CON17 0x0322
|
||||
+#define MT6323_VPA_CON18 0x0324
|
||||
+#define MT6323_VPA_CON19 0x0326
|
||||
+#define MT6323_VPA_CON20 0x0328
|
||||
+#define MT6323_BUCK_K_CON0 0x032A
|
||||
+#define MT6323_BUCK_K_CON1 0x032C
|
||||
+#define MT6323_BUCK_K_CON2 0x032E
|
||||
+#define MT6323_ISINK0_CON0 0x0330
|
||||
+#define MT6323_ISINK0_CON1 0x0332
|
||||
+#define MT6323_ISINK0_CON2 0x0334
|
||||
+#define MT6323_ISINK0_CON3 0x0336
|
||||
+#define MT6323_ISINK1_CON0 0x0338
|
||||
+#define MT6323_ISINK1_CON1 0x033A
|
||||
+#define MT6323_ISINK1_CON2 0x033C
|
||||
+#define MT6323_ISINK1_CON3 0x033E
|
||||
+#define MT6323_ISINK2_CON0 0x0340
|
||||
+#define MT6323_ISINK2_CON1 0x0342
|
||||
+#define MT6323_ISINK2_CON2 0x0344
|
||||
+#define MT6323_ISINK2_CON3 0x0346
|
||||
+#define MT6323_ISINK3_CON0 0x0348
|
||||
+#define MT6323_ISINK3_CON1 0x034A
|
||||
+#define MT6323_ISINK3_CON2 0x034C
|
||||
+#define MT6323_ISINK3_CON3 0x034E
|
||||
+#define MT6323_ISINK_ANA0 0x0350
|
||||
+#define MT6323_ISINK_ANA1 0x0352
|
||||
+#define MT6323_ISINK_PHASE_DLY 0x0354
|
||||
+#define MT6323_ISINK_EN_CTRL 0x0356
|
||||
+#define MT6323_ANALDO_CON0 0x0400
|
||||
+#define MT6323_ANALDO_CON1 0x0402
|
||||
+#define MT6323_ANALDO_CON2 0x0404
|
||||
+#define MT6323_ANALDO_CON3 0x0406
|
||||
+#define MT6323_ANALDO_CON4 0x0408
|
||||
+#define MT6323_ANALDO_CON5 0x040A
|
||||
+#define MT6323_ANALDO_CON6 0x040C
|
||||
+#define MT6323_ANALDO_CON7 0x040E
|
||||
+#define MT6323_ANALDO_CON8 0x0410
|
||||
+#define MT6323_ANALDO_CON10 0x0412
|
||||
+#define MT6323_ANALDO_CON15 0x0414
|
||||
+#define MT6323_ANALDO_CON16 0x0416
|
||||
+#define MT6323_ANALDO_CON17 0x0418
|
||||
+#define MT6323_ANALDO_CON18 0x041A
|
||||
+#define MT6323_ANALDO_CON19 0x041C
|
||||
+#define MT6323_ANALDO_CON20 0x041E
|
||||
+#define MT6323_ANALDO_CON21 0x0420
|
||||
+#define MT6323_DIGLDO_CON0 0x0500
|
||||
+#define MT6323_DIGLDO_CON2 0x0502
|
||||
+#define MT6323_DIGLDO_CON3 0x0504
|
||||
+#define MT6323_DIGLDO_CON5 0x0506
|
||||
+#define MT6323_DIGLDO_CON6 0x0508
|
||||
+#define MT6323_DIGLDO_CON7 0x050A
|
||||
+#define MT6323_DIGLDO_CON8 0x050C
|
||||
+#define MT6323_DIGLDO_CON9 0x050E
|
||||
+#define MT6323_DIGLDO_CON10 0x0510
|
||||
+#define MT6323_DIGLDO_CON11 0x0512
|
||||
+#define MT6323_DIGLDO_CON12 0x0514
|
||||
+#define MT6323_DIGLDO_CON13 0x0516
|
||||
+#define MT6323_DIGLDO_CON14 0x0518
|
||||
+#define MT6323_DIGLDO_CON15 0x051A
|
||||
+#define MT6323_DIGLDO_CON16 0x051C
|
||||
+#define MT6323_DIGLDO_CON17 0x051E
|
||||
+#define MT6323_DIGLDO_CON18 0x0520
|
||||
+#define MT6323_DIGLDO_CON19 0x0522
|
||||
+#define MT6323_DIGLDO_CON20 0x0524
|
||||
+#define MT6323_DIGLDO_CON21 0x0526
|
||||
+#define MT6323_DIGLDO_CON23 0x0528
|
||||
+#define MT6323_DIGLDO_CON24 0x052A
|
||||
+#define MT6323_DIGLDO_CON26 0x052C
|
||||
+#define MT6323_DIGLDO_CON27 0x052E
|
||||
+#define MT6323_DIGLDO_CON28 0x0530
|
||||
+#define MT6323_DIGLDO_CON29 0x0532
|
||||
+#define MT6323_DIGLDO_CON30 0x0534
|
||||
+#define MT6323_DIGLDO_CON31 0x0536
|
||||
+#define MT6323_DIGLDO_CON32 0x0538
|
||||
+#define MT6323_DIGLDO_CON33 0x053A
|
||||
+#define MT6323_DIGLDO_CON34 0x053C
|
||||
+#define MT6323_DIGLDO_CON35 0x053E
|
||||
+#define MT6323_DIGLDO_CON36 0x0540
|
||||
+#define MT6323_DIGLDO_CON39 0x0542
|
||||
+#define MT6323_DIGLDO_CON40 0x0544
|
||||
+#define MT6323_DIGLDO_CON41 0x0546
|
||||
+#define MT6323_DIGLDO_CON42 0x0548
|
||||
+#define MT6323_DIGLDO_CON43 0x054A
|
||||
+#define MT6323_DIGLDO_CON44 0x054C
|
||||
+#define MT6323_DIGLDO_CON45 0x054E
|
||||
+#define MT6323_DIGLDO_CON46 0x0550
|
||||
+#define MT6323_DIGLDO_CON47 0x0552
|
||||
+#define MT6323_DIGLDO_CON48 0x0554
|
||||
+#define MT6323_DIGLDO_CON49 0x0556
|
||||
+#define MT6323_DIGLDO_CON50 0x0558
|
||||
+#define MT6323_DIGLDO_CON51 0x055A
|
||||
+#define MT6323_DIGLDO_CON52 0x055C
|
||||
+#define MT6323_DIGLDO_CON53 0x055E
|
||||
+#define MT6323_DIGLDO_CON54 0x0560
|
||||
+#define MT6323_EFUSE_CON0 0x0600
|
||||
+#define MT6323_EFUSE_CON1 0x0602
|
||||
+#define MT6323_EFUSE_CON2 0x0604
|
||||
+#define MT6323_EFUSE_CON3 0x0606
|
||||
+#define MT6323_EFUSE_CON4 0x0608
|
||||
+#define MT6323_EFUSE_CON5 0x060A
|
||||
+#define MT6323_EFUSE_CON6 0x060C
|
||||
+#define MT6323_EFUSE_VAL_0_15 0x060E
|
||||
+#define MT6323_EFUSE_VAL_16_31 0x0610
|
||||
+#define MT6323_EFUSE_VAL_32_47 0x0612
|
||||
+#define MT6323_EFUSE_VAL_48_63 0x0614
|
||||
+#define MT6323_EFUSE_VAL_64_79 0x0616
|
||||
+#define MT6323_EFUSE_VAL_80_95 0x0618
|
||||
+#define MT6323_EFUSE_VAL_96_111 0x061A
|
||||
+#define MT6323_EFUSE_VAL_112_127 0x061C
|
||||
+#define MT6323_EFUSE_VAL_128_143 0x061E
|
||||
+#define MT6323_EFUSE_VAL_144_159 0x0620
|
||||
+#define MT6323_EFUSE_VAL_160_175 0x0622
|
||||
+#define MT6323_EFUSE_VAL_176_191 0x0624
|
||||
+#define MT6323_EFUSE_DOUT_0_15 0x0626
|
||||
+#define MT6323_EFUSE_DOUT_16_31 0x0628
|
||||
+#define MT6323_EFUSE_DOUT_32_47 0x062A
|
||||
+#define MT6323_EFUSE_DOUT_48_63 0x062C
|
||||
+#define MT6323_EFUSE_DOUT_64_79 0x062E
|
||||
+#define MT6323_EFUSE_DOUT_80_95 0x0630
|
||||
+#define MT6323_EFUSE_DOUT_96_111 0x0632
|
||||
+#define MT6323_EFUSE_DOUT_112_127 0x0634
|
||||
+#define MT6323_EFUSE_DOUT_128_143 0x0636
|
||||
+#define MT6323_EFUSE_DOUT_144_159 0x0638
|
||||
+#define MT6323_EFUSE_DOUT_160_175 0x063A
|
||||
+#define MT6323_EFUSE_DOUT_176_191 0x063C
|
||||
+#define MT6323_EFUSE_CON7 0x063E
|
||||
+#define MT6323_EFUSE_CON8 0x0640
|
||||
+#define MT6323_EFUSE_CON9 0x0642
|
||||
+#define MT6323_RTC_MIX_CON0 0x0644
|
||||
+#define MT6323_RTC_MIX_CON1 0x0646
|
||||
+#define MT6323_AUDTOP_CON0 0x0700
|
||||
+#define MT6323_AUDTOP_CON1 0x0702
|
||||
+#define MT6323_AUDTOP_CON2 0x0704
|
||||
+#define MT6323_AUDTOP_CON3 0x0706
|
||||
+#define MT6323_AUDTOP_CON4 0x0708
|
||||
+#define MT6323_AUDTOP_CON5 0x070A
|
||||
+#define MT6323_AUDTOP_CON6 0x070C
|
||||
+#define MT6323_AUDTOP_CON7 0x070E
|
||||
+#define MT6323_AUDTOP_CON8 0x0710
|
||||
+#define MT6323_AUDTOP_CON9 0x0712
|
||||
+#define MT6323_AUXADC_ADC0 0x0714
|
||||
+#define MT6323_AUXADC_ADC1 0x0716
|
||||
+#define MT6323_AUXADC_ADC2 0x0718
|
||||
+#define MT6323_AUXADC_ADC3 0x071A
|
||||
+#define MT6323_AUXADC_ADC4 0x071C
|
||||
+#define MT6323_AUXADC_ADC5 0x071E
|
||||
+#define MT6323_AUXADC_ADC6 0x0720
|
||||
+#define MT6323_AUXADC_ADC7 0x0722
|
||||
+#define MT6323_AUXADC_ADC8 0x0724
|
||||
+#define MT6323_AUXADC_ADC9 0x0726
|
||||
+#define MT6323_AUXADC_ADC10 0x0728
|
||||
+#define MT6323_AUXADC_ADC11 0x072A
|
||||
+#define MT6323_AUXADC_ADC12 0x072C
|
||||
+#define MT6323_AUXADC_ADC13 0x072E
|
||||
+#define MT6323_AUXADC_ADC14 0x0730
|
||||
+#define MT6323_AUXADC_ADC15 0x0732
|
||||
+#define MT6323_AUXADC_ADC16 0x0734
|
||||
+#define MT6323_AUXADC_ADC17 0x0736
|
||||
+#define MT6323_AUXADC_ADC18 0x0738
|
||||
+#define MT6323_AUXADC_ADC19 0x073A
|
||||
+#define MT6323_AUXADC_ADC20 0x073C
|
||||
+#define MT6323_AUXADC_RSV1 0x073E
|
||||
+#define MT6323_AUXADC_RSV2 0x0740
|
||||
+#define MT6323_AUXADC_CON0 0x0742
|
||||
+#define MT6323_AUXADC_CON1 0x0744
|
||||
+#define MT6323_AUXADC_CON2 0x0746
|
||||
+#define MT6323_AUXADC_CON3 0x0748
|
||||
+#define MT6323_AUXADC_CON4 0x074A
|
||||
+#define MT6323_AUXADC_CON5 0x074C
|
||||
+#define MT6323_AUXADC_CON6 0x074E
|
||||
+#define MT6323_AUXADC_CON7 0x0750
|
||||
+#define MT6323_AUXADC_CON8 0x0752
|
||||
+#define MT6323_AUXADC_CON9 0x0754
|
||||
+#define MT6323_AUXADC_CON10 0x0756
|
||||
+#define MT6323_AUXADC_CON11 0x0758
|
||||
+#define MT6323_AUXADC_CON12 0x075A
|
||||
+#define MT6323_AUXADC_CON13 0x075C
|
||||
+#define MT6323_AUXADC_CON14 0x075E
|
||||
+#define MT6323_AUXADC_CON15 0x0760
|
||||
+#define MT6323_AUXADC_CON16 0x0762
|
||||
+#define MT6323_AUXADC_CON17 0x0764
|
||||
+#define MT6323_AUXADC_CON18 0x0766
|
||||
+#define MT6323_AUXADC_CON19 0x0768
|
||||
+#define MT6323_AUXADC_CON20 0x076A
|
||||
+#define MT6323_AUXADC_CON21 0x076C
|
||||
+#define MT6323_AUXADC_CON22 0x076E
|
||||
+#define MT6323_AUXADC_CON23 0x0770
|
||||
+#define MT6323_AUXADC_CON24 0x0772
|
||||
+#define MT6323_AUXADC_CON25 0x0774
|
||||
+#define MT6323_AUXADC_CON26 0x0776
|
||||
+#define MT6323_AUXADC_CON27 0x0778
|
||||
+#define MT6323_ACCDET_CON0 0x077A
|
||||
+#define MT6323_ACCDET_CON1 0x077C
|
||||
+#define MT6323_ACCDET_CON2 0x077E
|
||||
+#define MT6323_ACCDET_CON3 0x0780
|
||||
+#define MT6323_ACCDET_CON4 0x0782
|
||||
+#define MT6323_ACCDET_CON5 0x0784
|
||||
+#define MT6323_ACCDET_CON6 0x0786
|
||||
+#define MT6323_ACCDET_CON7 0x0788
|
||||
+#define MT6323_ACCDET_CON8 0x078A
|
||||
+#define MT6323_ACCDET_CON9 0x078C
|
||||
+#define MT6323_ACCDET_CON10 0x078E
|
||||
+#define MT6323_ACCDET_CON11 0x0790
|
||||
+#define MT6323_ACCDET_CON12 0x0792
|
||||
+#define MT6323_ACCDET_CON13 0x0794
|
||||
+#define MT6323_ACCDET_CON14 0x0796
|
||||
+#define MT6323_ACCDET_CON15 0x0798
|
||||
+#define MT6323_ACCDET_CON16 0x079A
|
||||
+
|
||||
+#endif /* __MFD_MT6323_REGISTERS_H__ */
|
|
@ -1,254 +0,0 @@
|
|||
From f536a600e0e20fd57475415ce5b3d909441d53b6 Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <blogic@openwrt.org>
|
||||
Date: Sun, 10 Jan 2016 17:31:46 +0100
|
||||
Subject: [PATCH 046/102] regulator: Add document for MT6323 regulator
|
||||
|
||||
Signed-off-by: John Crispin <blogic@openwrt.org>
|
||||
Cc: devicetree@vger.kernel.org
|
||||
---
|
||||
.../bindings/regulator/mt6323-regulator.txt | 239 ++++++++++++++++++++
|
||||
1 file changed, 239 insertions(+)
|
||||
create mode 100644 Documentation/devicetree/bindings/regulator/mt6323-regulator.txt
|
||||
|
||||
--- /dev/null
|
||||
+++ b/Documentation/devicetree/bindings/regulator/mt6323-regulator.txt
|
||||
@@ -0,0 +1,239 @@
|
||||
+Mediatek MT6323 Regulator Driver
|
||||
+
|
||||
+All voltage regulators are defined as subnodes of the regulators node. A list
|
||||
+of regulators provided by this controller are defined as subnodes of the
|
||||
+PMIC's node. Each regulator is named according to its regulator type,
|
||||
+buck_<name> and ldo_<name>. The definition for each of these nodes is defined
|
||||
+using the standard binding for regulators at
|
||||
+Documentation/devicetree/bindings/regulator/regulator.txt.
|
||||
+
|
||||
+The valid names for regulators are::
|
||||
+BUCK:
|
||||
+ buck_vproc, buck_vsys, buck_vpa
|
||||
+LDO:
|
||||
+ ldo_vtcxo, ldo_vcn28, ldo_vcn33_bt, ldo_vcn33_wifi, ldo_va, ldo_vcama,
|
||||
+ ldo_vio28, ldo_vusb, ldo_vmc, ldo_vmch, ldo_vemc3v3, ldo_vgp1, ldo_vgp2,
|
||||
+ ldo_vgp3, ldo_vcn18, ldo_vsim1, ldo_vsim2, ldo_vrtc, ldo_vcamaf, ldo_vibr,
|
||||
+ ldo_vrf18, ldo_vm, ldo_vio18, ldo_vcamd, ldo_vcamio
|
||||
+
|
||||
+Example:
|
||||
+
|
||||
+ pmic: mt6323 {
|
||||
+ compatible = "mediatek,mt6323";
|
||||
+
|
||||
+ mt6323regulator: regulators {
|
||||
+ mt6323_vproc_reg: buck_vproc{
|
||||
+ regulator-name = "vproc";
|
||||
+ regulator-min-microvolt = < 700000>;
|
||||
+ regulator-max-microvolt = <1350000>;
|
||||
+ regulator-ramp-delay = <12500>;
|
||||
+ regulator-always-on;
|
||||
+ regulator-boot-on;
|
||||
+ };
|
||||
+
|
||||
+ mt6323_vsys_reg: buck_vsys{
|
||||
+ regulator-name = "vsys";
|
||||
+ regulator-min-microvolt = <1400000>;
|
||||
+ regulator-max-microvolt = <2987500>;
|
||||
+ regulator-ramp-delay = <25000>;
|
||||
+ regulator-always-on;
|
||||
+ regulator-boot-on;
|
||||
+ };
|
||||
+
|
||||
+ mt6323_vpa_reg: buck_vpa{
|
||||
+ regulator-name = "vpa";
|
||||
+ regulator-min-microvolt = < 500000>;
|
||||
+ regulator-max-microvolt = <3650000>;
|
||||
+ };
|
||||
+
|
||||
+ mt6323_vtcxo_reg: ldo_vtcxo{
|
||||
+ regulator-name = "vtcxo";
|
||||
+ regulator-min-microvolt = <2800000>;
|
||||
+ regulator-max-microvolt = <2800000>;
|
||||
+ regulator-enable-ramp-delay = <90>;
|
||||
+ regulator-always-on;
|
||||
+ regulator-boot-on;
|
||||
+ };
|
||||
+
|
||||
+ mt6323_vcn28_reg: ldo_vcn28{
|
||||
+ regulator-name = "vcn28";
|
||||
+ regulator-min-microvolt = <2800000>;
|
||||
+ regulator-max-microvolt = <2800000>;
|
||||
+ regulator-enable-ramp-delay = <185>;
|
||||
+ };
|
||||
+
|
||||
+ mt6323_vcn33_bt_reg: ldo_vcn33_bt{
|
||||
+ regulator-name = "vcn33_bt";
|
||||
+ regulator-min-microvolt = <3300000>;
|
||||
+ regulator-max-microvolt = <3600000>;
|
||||
+ regulator-enable-ramp-delay = <185>;
|
||||
+ };
|
||||
+
|
||||
+ mt6323_vcn33_wifi_reg: ldo_vcn33_wifi{
|
||||
+ regulator-name = "vcn33_wifi";
|
||||
+ regulator-min-microvolt = <3300000>;
|
||||
+ regulator-max-microvolt = <3600000>;
|
||||
+ regulator-enable-ramp-delay = <185>;
|
||||
+ };
|
||||
+
|
||||
+ mt6323_va_reg: ldo_va{
|
||||
+ regulator-name = "va";
|
||||
+ regulator-min-microvolt = <2800000>;
|
||||
+ regulator-max-microvolt = <2800000>;
|
||||
+ regulator-enable-ramp-delay = <216>;
|
||||
+ regulator-always-on;
|
||||
+ regulator-boot-on;
|
||||
+ };
|
||||
+
|
||||
+ mt6323_vcama_reg: ldo_vcama{
|
||||
+ regulator-name = "vcama";
|
||||
+ regulator-min-microvolt = <1500000>;
|
||||
+ regulator-max-microvolt = <2800000>;
|
||||
+ regulator-enable-ramp-delay = <216>;
|
||||
+ };
|
||||
+
|
||||
+ mt6323_vio28_reg: ldo_vio28{
|
||||
+ regulator-name = "vio28";
|
||||
+ regulator-min-microvolt = <2800000>;
|
||||
+ regulator-max-microvolt = <2800000>;
|
||||
+ regulator-enable-ramp-delay = <216>;
|
||||
+ regulator-always-on;
|
||||
+ regulator-boot-on;
|
||||
+ };
|
||||
+
|
||||
+ mt6323_vusb_reg: ldo_vusb{
|
||||
+ regulator-name = "vusb";
|
||||
+ regulator-min-microvolt = <3300000>;
|
||||
+ regulator-max-microvolt = <3300000>;
|
||||
+ regulator-enable-ramp-delay = <216>;
|
||||
+ regulator-boot-on;
|
||||
+ };
|
||||
+
|
||||
+ mt6323_vmc_reg: ldo_vmc{
|
||||
+ regulator-name = "vmc";
|
||||
+ regulator-min-microvolt = <1800000>;
|
||||
+ regulator-max-microvolt = <3300000>;
|
||||
+ regulator-enable-ramp-delay = <36>;
|
||||
+ regulator-boot-on;
|
||||
+ };
|
||||
+
|
||||
+ mt6323_vmch_reg: ldo_vmch{
|
||||
+ regulator-name = "vmch";
|
||||
+ regulator-min-microvolt = <3000000>;
|
||||
+ regulator-max-microvolt = <3300000>;
|
||||
+ regulator-enable-ramp-delay = <36>;
|
||||
+ regulator-boot-on;
|
||||
+ };
|
||||
+
|
||||
+ mt6323_vemc3v3_reg: ldo_vemc3v3{
|
||||
+ regulator-name = "vemc3v3";
|
||||
+ regulator-min-microvolt = <3000000>;
|
||||
+ regulator-max-microvolt = <3300000>;
|
||||
+ regulator-enable-ramp-delay = <36>;
|
||||
+ regulator-boot-on;
|
||||
+ };
|
||||
+
|
||||
+ mt6323_vgp1_reg: ldo_vgp1{
|
||||
+ regulator-name = "vgp1";
|
||||
+ regulator-min-microvolt = <1200000>;
|
||||
+ regulator-max-microvolt = <3300000>;
|
||||
+ regulator-enable-ramp-delay = <216>;
|
||||
+ };
|
||||
+
|
||||
+ mt6323_vgp2_reg: ldo_vgp2{
|
||||
+ regulator-name = "vgp2";
|
||||
+ regulator-min-microvolt = <1200000>;
|
||||
+ regulator-max-microvolt = <3000000>;
|
||||
+ regulator-enable-ramp-delay = <216>;
|
||||
+ };
|
||||
+
|
||||
+ mt6323_vgp3_reg: ldo_vgp3{
|
||||
+ regulator-name = "vgp3";
|
||||
+ regulator-min-microvolt = <1200000>;
|
||||
+ regulator-max-microvolt = <1800000>;
|
||||
+ regulator-enable-ramp-delay = <216>;
|
||||
+ };
|
||||
+
|
||||
+ mt6323_vcn18_reg: ldo_vcn18{
|
||||
+ regulator-name = "vcn18";
|
||||
+ regulator-min-microvolt = <1800000>;
|
||||
+ regulator-max-microvolt = <1800000>;
|
||||
+ regulator-enable-ramp-delay = <216>;
|
||||
+ };
|
||||
+
|
||||
+ mt6323_vsim1_reg: ldo_vsim1{
|
||||
+ regulator-name = "vsim1";
|
||||
+ regulator-min-microvolt = <1800000>;
|
||||
+ regulator-max-microvolt = <3000000>;
|
||||
+ regulator-enable-ramp-delay = <216>;
|
||||
+ };
|
||||
+
|
||||
+ mt6323_vsim2_reg: ldo_vsim2{
|
||||
+ regulator-name = "vsim2";
|
||||
+ regulator-min-microvolt = <1800000>;
|
||||
+ regulator-max-microvolt = <3000000>;
|
||||
+ regulator-enable-ramp-delay = <216>;
|
||||
+ };
|
||||
+
|
||||
+ mt6323_vrtc_reg: ldo_vrtc{
|
||||
+ regulator-name = "vrtc";
|
||||
+ regulator-min-microvolt = <2800000>;
|
||||
+ regulator-max-microvolt = <2800000>;
|
||||
+ regulator-always-on;
|
||||
+ regulator-boot-on;
|
||||
+ };
|
||||
+
|
||||
+ mt6323_vcamaf_reg: ldo_vcamaf{
|
||||
+ regulator-name = "vcamaf";
|
||||
+ regulator-min-microvolt = <1200000>;
|
||||
+ regulator-max-microvolt = <3300000>;
|
||||
+ regulator-enable-ramp-delay = <216>;
|
||||
+ };
|
||||
+
|
||||
+ mt6323_vibr_reg: ldo_vibr{
|
||||
+ regulator-name = "vibr";
|
||||
+ regulator-min-microvolt = <1200000>;
|
||||
+ regulator-max-microvolt = <3300000>;
|
||||
+ regulator-enable-ramp-delay = <36>;
|
||||
+ };
|
||||
+
|
||||
+ mt6323_vrf18_reg: ldo_vrf18{
|
||||
+ regulator-name = "vrf18";
|
||||
+ regulator-min-microvolt = <1825000>;
|
||||
+ regulator-max-microvolt = <1825000>;
|
||||
+ regulator-enable-ramp-delay = <187>;
|
||||
+ };
|
||||
+
|
||||
+ mt6323_vm_reg: ldo_vm{
|
||||
+ regulator-name = "vm";
|
||||
+ regulator-min-microvolt = <1200000>;
|
||||
+ regulator-max-microvolt = <1800000>;
|
||||
+ regulator-enable-ramp-delay = <216>;
|
||||
+ regulator-always-on;
|
||||
+ regulator-boot-on;
|
||||
+ };
|
||||
+
|
||||
+ mt6323_vio18_reg: ldo_vio18{
|
||||
+ regulator-name = "vio18";
|
||||
+ regulator-min-microvolt = <1800000>;
|
||||
+ regulator-max-microvolt = <1800000>;
|
||||
+ regulator-enable-ramp-delay = <216>;
|
||||
+ regulator-always-on;
|
||||
+ regulator-boot-on;
|
||||
+ };
|
||||
+
|
||||
+ mt6323_vcamd_reg: ldo_vcamd{
|
||||
+ regulator-name = "vcamd";
|
||||
+ regulator-min-microvolt = <1200000>;
|
||||
+ regulator-max-microvolt = <1800000>;
|
||||
+ regulator-enable-ramp-delay = <216>;
|
||||
+ };
|
||||
+
|
||||
+ mt6323_vcamio_reg: ldo_vcamio{
|
||||
+ regulator-name = "vcamio";
|
||||
+ regulator-min-microvolt = <1800000>;
|
||||
+ regulator-max-microvolt = <1800000>;
|
||||
+ regulator-enable-ramp-delay = <216>;
|
||||
+ };
|
||||
+ };
|
||||
+ };
|
|
@ -1,538 +0,0 @@
|
|||
From 94c08223cd696d872cda7d9aa4e817956d0a0b84 Mon Sep 17 00:00:00 2001
|
||||
From: Chen Zhong <chen.zhong@mediatek.com>
|
||||
Date: Fri, 8 Jan 2016 04:17:37 +0100
|
||||
Subject: [PATCH 047/102] regulator: mt6323: Add support for MT6323 regulator
|
||||
|
||||
The MT6323 is a regulator found on boards based on MediaTek MT7623 and
|
||||
probably other SoCs. It is a so called pmic and connects as a slave to
|
||||
SoC using SPI, wrapped inside the pmic-wrapper.
|
||||
|
||||
Signed-off-by: Chen Zhong <chen.zhong@mediatek.com>
|
||||
Signed-off-by: John Crispin <blogic@openwrt.org>
|
||||
---
|
||||
drivers/regulator/Kconfig | 9 +
|
||||
drivers/regulator/Makefile | 1 +
|
||||
drivers/regulator/mt6323-regulator.c | 432 ++++++++++++++++++++++++++++
|
||||
include/linux/regulator/mt6323-regulator.h | 52 ++++
|
||||
4 files changed, 494 insertions(+)
|
||||
create mode 100644 drivers/regulator/mt6323-regulator.c
|
||||
create mode 100644 include/linux/regulator/mt6323-regulator.h
|
||||
|
||||
--- a/drivers/regulator/Kconfig
|
||||
+++ b/drivers/regulator/Kconfig
|
||||
@@ -453,6 +453,15 @@ config REGULATOR_MT6311
|
||||
This driver supports the control of different power rails of device
|
||||
through regulator interface.
|
||||
|
||||
+config REGULATOR_MT6323
|
||||
+ tristate "MediaTek MT6323 PMIC"
|
||||
+ depends on MFD_MT6397
|
||||
+ help
|
||||
+ Say y here to select this option to enable the power regulator of
|
||||
+ MediaTek MT6323 PMIC.
|
||||
+ This driver supports the control of different power rails of device
|
||||
+ through regulator interface.
|
||||
+
|
||||
config REGULATOR_MT6397
|
||||
tristate "MediaTek MT6397 PMIC"
|
||||
depends on MFD_MT6397
|
||||
--- a/drivers/regulator/Makefile
|
||||
+++ b/drivers/regulator/Makefile
|
||||
@@ -60,6 +60,7 @@ obj-$(CONFIG_REGULATOR_MC13783) += mc137
|
||||
obj-$(CONFIG_REGULATOR_MC13892) += mc13892-regulator.o
|
||||
obj-$(CONFIG_REGULATOR_MC13XXX_CORE) += mc13xxx-regulator-core.o
|
||||
obj-$(CONFIG_REGULATOR_MT6311) += mt6311-regulator.o
|
||||
+obj-$(CONFIG_REGULATOR_MT6323) += mt6323-regulator.o
|
||||
obj-$(CONFIG_REGULATOR_MT6397) += mt6397-regulator.o
|
||||
obj-$(CONFIG_REGULATOR_QCOM_RPM) += qcom_rpm-regulator.o
|
||||
obj-$(CONFIG_REGULATOR_QCOM_SMD_RPM) += qcom_smd-regulator.o
|
||||
--- /dev/null
|
||||
+++ b/drivers/regulator/mt6323-regulator.c
|
||||
@@ -0,0 +1,432 @@
|
||||
+/*
|
||||
+ * Copyright (c) 2016 MediaTek Inc.
|
||||
+ * Author: Chen Zhong <chen.zhong@mediatek.com>
|
||||
+ *
|
||||
+ * This program is free software; you can redistribute it and/or modify
|
||||
+ * it under the terms of the GNU General Public License version 2 as
|
||||
+ * published by the Free Software Foundation.
|
||||
+ */
|
||||
+
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/of.h>
|
||||
+#include <linux/platform_device.h>
|
||||
+#include <linux/regmap.h>
|
||||
+#include <linux/mfd/mt6397/core.h>
|
||||
+#include <linux/mfd/mt6323/registers.h>
|
||||
+#include <linux/regulator/driver.h>
|
||||
+#include <linux/regulator/machine.h>
|
||||
+#include <linux/regulator/mt6323-regulator.h>
|
||||
+#include <linux/regulator/of_regulator.h>
|
||||
+
|
||||
+#define MT6323_LDO_MODE_NORMAL 0
|
||||
+#define MT6323_LDO_MODE_LP 1
|
||||
+
|
||||
+/*
|
||||
+ * MT6323 regulators' information
|
||||
+ *
|
||||
+ * @desc: standard fields of regulator description.
|
||||
+ * @qi: Mask for query enable signal status of regulators
|
||||
+ * @vselon_reg: Register sections for hardware control mode of bucks
|
||||
+ * @vselctrl_reg: Register for controlling the buck control mode.
|
||||
+ * @vselctrl_mask: Mask for query buck's voltage control mode.
|
||||
+ */
|
||||
+struct mt6323_regulator_info {
|
||||
+ struct regulator_desc desc;
|
||||
+ u32 qi;
|
||||
+ u32 vselon_reg;
|
||||
+ u32 vselctrl_reg;
|
||||
+ u32 vselctrl_mask;
|
||||
+ u32 modeset_reg;
|
||||
+ u32 modeset_mask;
|
||||
+};
|
||||
+
|
||||
+#define MT6323_BUCK(match, vreg, min, max, step, volt_ranges, enreg, \
|
||||
+ vosel, vosel_mask, voselon, vosel_ctrl) \
|
||||
+[MT6323_ID_##vreg] = { \
|
||||
+ .desc = { \
|
||||
+ .name = #vreg, \
|
||||
+ .of_match = of_match_ptr(match), \
|
||||
+ .ops = &mt6323_volt_range_ops, \
|
||||
+ .type = REGULATOR_VOLTAGE, \
|
||||
+ .id = MT6323_ID_##vreg, \
|
||||
+ .owner = THIS_MODULE, \
|
||||
+ .n_voltages = (max - min)/step + 1, \
|
||||
+ .linear_ranges = volt_ranges, \
|
||||
+ .n_linear_ranges = ARRAY_SIZE(volt_ranges), \
|
||||
+ .vsel_reg = vosel, \
|
||||
+ .vsel_mask = vosel_mask, \
|
||||
+ .enable_reg = enreg, \
|
||||
+ .enable_mask = BIT(0), \
|
||||
+ }, \
|
||||
+ .qi = BIT(13), \
|
||||
+ .vselon_reg = voselon, \
|
||||
+ .vselctrl_reg = vosel_ctrl, \
|
||||
+ .vselctrl_mask = BIT(1), \
|
||||
+}
|
||||
+
|
||||
+#define MT6323_LDO(match, vreg, ldo_volt_table, enreg, enbit, vosel, \
|
||||
+ vosel_mask, _modeset_reg, _modeset_mask) \
|
||||
+[MT6323_ID_##vreg] = { \
|
||||
+ .desc = { \
|
||||
+ .name = #vreg, \
|
||||
+ .of_match = of_match_ptr(match), \
|
||||
+ .ops = &mt6323_volt_table_ops, \
|
||||
+ .type = REGULATOR_VOLTAGE, \
|
||||
+ .id = MT6323_ID_##vreg, \
|
||||
+ .owner = THIS_MODULE, \
|
||||
+ .n_voltages = ARRAY_SIZE(ldo_volt_table), \
|
||||
+ .volt_table = ldo_volt_table, \
|
||||
+ .vsel_reg = vosel, \
|
||||
+ .vsel_mask = vosel_mask, \
|
||||
+ .enable_reg = enreg, \
|
||||
+ .enable_mask = BIT(enbit), \
|
||||
+ }, \
|
||||
+ .qi = BIT(15), \
|
||||
+ .modeset_reg = _modeset_reg, \
|
||||
+ .modeset_mask = _modeset_mask, \
|
||||
+}
|
||||
+
|
||||
+#define MT6323_REG_FIXED(match, vreg, enreg, enbit, volt, \
|
||||
+ _modeset_reg, _modeset_mask) \
|
||||
+[MT6323_ID_##vreg] = { \
|
||||
+ .desc = { \
|
||||
+ .name = #vreg, \
|
||||
+ .of_match = of_match_ptr(match), \
|
||||
+ .ops = &mt6323_volt_fixed_ops, \
|
||||
+ .type = REGULATOR_VOLTAGE, \
|
||||
+ .id = MT6323_ID_##vreg, \
|
||||
+ .owner = THIS_MODULE, \
|
||||
+ .n_voltages = 1, \
|
||||
+ .enable_reg = enreg, \
|
||||
+ .enable_mask = BIT(enbit), \
|
||||
+ .min_uV = volt, \
|
||||
+ }, \
|
||||
+ .qi = BIT(15), \
|
||||
+ .modeset_reg = _modeset_reg, \
|
||||
+ .modeset_mask = _modeset_mask, \
|
||||
+}
|
||||
+
|
||||
+static const struct regulator_linear_range buck_volt_range1[] = {
|
||||
+ REGULATOR_LINEAR_RANGE(700000, 0, 0x7f, 6250),
|
||||
+};
|
||||
+
|
||||
+static const struct regulator_linear_range buck_volt_range2[] = {
|
||||
+ REGULATOR_LINEAR_RANGE(1400000, 0, 0x7f, 12500),
|
||||
+};
|
||||
+
|
||||
+static const struct regulator_linear_range buck_volt_range3[] = {
|
||||
+ REGULATOR_LINEAR_RANGE(500000, 0, 0x3f, 50000),
|
||||
+};
|
||||
+
|
||||
+static const u32 ldo_volt_table1[] = {
|
||||
+ 3300000, 3400000, 3500000, 3600000,
|
||||
+};
|
||||
+
|
||||
+static const u32 ldo_volt_table2[] = {
|
||||
+ 1500000, 1800000, 2500000, 2800000,
|
||||
+};
|
||||
+
|
||||
+static const u32 ldo_volt_table3[] = {
|
||||
+ 1800000, 3300000,
|
||||
+};
|
||||
+
|
||||
+static const u32 ldo_volt_table4[] = {
|
||||
+ 3000000, 3300000,
|
||||
+};
|
||||
+
|
||||
+static const u32 ldo_volt_table5[] = {
|
||||
+ 1200000, 1300000, 1500000, 1800000, 2000000, 2800000, 3000000, 3300000,
|
||||
+};
|
||||
+
|
||||
+static const u32 ldo_volt_table6[] = {
|
||||
+ 1200000, 1300000, 1500000, 1800000, 2500000, 2800000, 3000000, 2000000,
|
||||
+};
|
||||
+
|
||||
+static const u32 ldo_volt_table7[] = {
|
||||
+ 1200000, 1300000, 1500000, 1800000,
|
||||
+};
|
||||
+
|
||||
+static const u32 ldo_volt_table8[] = {
|
||||
+ 1800000, 3000000,
|
||||
+};
|
||||
+
|
||||
+static const u32 ldo_volt_table9[] = {
|
||||
+ 1200000, 1350000, 1500000, 1800000,
|
||||
+};
|
||||
+
|
||||
+static const u32 ldo_volt_table10[] = {
|
||||
+ 1200000, 1300000, 1500000, 1800000,
|
||||
+};
|
||||
+
|
||||
+static int mt6323_get_status(struct regulator_dev *rdev)
|
||||
+{
|
||||
+ int ret;
|
||||
+ u32 regval;
|
||||
+ struct mt6323_regulator_info *info = rdev_get_drvdata(rdev);
|
||||
+
|
||||
+ ret = regmap_read(rdev->regmap, info->desc.enable_reg, ®val);
|
||||
+ if (ret != 0) {
|
||||
+ dev_err(&rdev->dev, "Failed to get enable reg: %d\n", ret);
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ return (regval & info->qi) ? REGULATOR_STATUS_ON : REGULATOR_STATUS_OFF;
|
||||
+}
|
||||
+
|
||||
+static int mt6323_ldo_set_mode(struct regulator_dev *rdev, unsigned int mode)
|
||||
+{
|
||||
+ int ret, val = 0;
|
||||
+ struct mt6323_regulator_info *info = rdev_get_drvdata(rdev);
|
||||
+
|
||||
+ if (!info->modeset_mask) {
|
||||
+ dev_err(&rdev->dev, "regulator %s doesn't support set_mode\n",
|
||||
+ info->desc.name);
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+ switch (mode) {
|
||||
+ case REGULATOR_MODE_STANDBY:
|
||||
+ val = MT6323_LDO_MODE_LP;
|
||||
+ break;
|
||||
+ case REGULATOR_MODE_NORMAL:
|
||||
+ val = MT6323_LDO_MODE_NORMAL;
|
||||
+ break;
|
||||
+ default:
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+ val <<= ffs(info->modeset_mask) - 1;
|
||||
+
|
||||
+ ret = regmap_update_bits(rdev->regmap, info->modeset_reg,
|
||||
+ info->modeset_mask, val);
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+static unsigned int mt6323_ldo_get_mode(struct regulator_dev *rdev)
|
||||
+{
|
||||
+ unsigned int val;
|
||||
+ unsigned int mode;
|
||||
+ int ret;
|
||||
+ struct mt6323_regulator_info *info = rdev_get_drvdata(rdev);
|
||||
+
|
||||
+ if (!info->modeset_mask) {
|
||||
+ dev_err(&rdev->dev, "regulator %s doesn't support get_mode\n",
|
||||
+ info->desc.name);
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+ ret = regmap_read(rdev->regmap, info->modeset_reg, &val);
|
||||
+ if (ret < 0)
|
||||
+ return ret;
|
||||
+
|
||||
+ val &= info->modeset_mask;
|
||||
+ val >>= ffs(info->modeset_mask) - 1;
|
||||
+
|
||||
+ if (val & 0x1)
|
||||
+ mode = REGULATOR_MODE_STANDBY;
|
||||
+ else
|
||||
+ mode = REGULATOR_MODE_NORMAL;
|
||||
+
|
||||
+ return mode;
|
||||
+}
|
||||
+
|
||||
+static struct regulator_ops mt6323_volt_range_ops = {
|
||||
+ .list_voltage = regulator_list_voltage_linear_range,
|
||||
+ .map_voltage = regulator_map_voltage_linear_range,
|
||||
+ .set_voltage_sel = regulator_set_voltage_sel_regmap,
|
||||
+ .get_voltage_sel = regulator_get_voltage_sel_regmap,
|
||||
+ .set_voltage_time_sel = regulator_set_voltage_time_sel,
|
||||
+ .enable = regulator_enable_regmap,
|
||||
+ .disable = regulator_disable_regmap,
|
||||
+ .is_enabled = regulator_is_enabled_regmap,
|
||||
+ .get_status = mt6323_get_status,
|
||||
+};
|
||||
+
|
||||
+static struct regulator_ops mt6323_volt_table_ops = {
|
||||
+ .list_voltage = regulator_list_voltage_table,
|
||||
+ .map_voltage = regulator_map_voltage_iterate,
|
||||
+ .set_voltage_sel = regulator_set_voltage_sel_regmap,
|
||||
+ .get_voltage_sel = regulator_get_voltage_sel_regmap,
|
||||
+ .set_voltage_time_sel = regulator_set_voltage_time_sel,
|
||||
+ .enable = regulator_enable_regmap,
|
||||
+ .disable = regulator_disable_regmap,
|
||||
+ .is_enabled = regulator_is_enabled_regmap,
|
||||
+ .get_status = mt6323_get_status,
|
||||
+ .set_mode = mt6323_ldo_set_mode,
|
||||
+ .get_mode = mt6323_ldo_get_mode,
|
||||
+};
|
||||
+
|
||||
+static struct regulator_ops mt6323_volt_fixed_ops = {
|
||||
+ .list_voltage = regulator_list_voltage_linear,
|
||||
+ .enable = regulator_enable_regmap,
|
||||
+ .disable = regulator_disable_regmap,
|
||||
+ .is_enabled = regulator_is_enabled_regmap,
|
||||
+ .get_status = mt6323_get_status,
|
||||
+ .set_mode = mt6323_ldo_set_mode,
|
||||
+ .get_mode = mt6323_ldo_get_mode,
|
||||
+};
|
||||
+
|
||||
+/* The array is indexed by id(MT6323_ID_XXX) */
|
||||
+static struct mt6323_regulator_info mt6323_regulators[] = {
|
||||
+ MT6323_BUCK("buck_vproc", VPROC, 700000, 1493750, 6250,
|
||||
+ buck_volt_range1, MT6323_VPROC_CON7, MT6323_VPROC_CON9, 0x7f,
|
||||
+ MT6323_VPROC_CON10, MT6323_VPROC_CON5),
|
||||
+ MT6323_BUCK("buck_vsys", VSYS, 1400000, 2987500, 12500,
|
||||
+ buck_volt_range2, MT6323_VSYS_CON7, MT6323_VSYS_CON9, 0x7f,
|
||||
+ MT6323_VSYS_CON10, MT6323_VSYS_CON5),
|
||||
+ MT6323_BUCK("buck_vpa", VPA, 500000, 3650000, 50000,
|
||||
+ buck_volt_range3, MT6323_VPA_CON7, MT6323_VPA_CON9,
|
||||
+ 0x3f, MT6323_VPA_CON10, MT6323_VPA_CON5),
|
||||
+ MT6323_REG_FIXED("ldo_vtcxo", VTCXO, MT6323_ANALDO_CON1, 10, 2800000,
|
||||
+ MT6323_ANALDO_CON1, 0x2),
|
||||
+ MT6323_REG_FIXED("ldo_vcn28", VCN28, MT6323_ANALDO_CON19, 12, 2800000,
|
||||
+ MT6323_ANALDO_CON20, 0x2),
|
||||
+ MT6323_LDO("ldo_vcn33_bt", VCN33_BT, ldo_volt_table1,
|
||||
+ MT6323_ANALDO_CON16, 7, MT6323_ANALDO_CON16, 0xC,
|
||||
+ MT6323_ANALDO_CON21, 0x2),
|
||||
+ MT6323_LDO("ldo_vcn33_wifi", VCN33_WIFI, ldo_volt_table1,
|
||||
+ MT6323_ANALDO_CON17, 12, MT6323_ANALDO_CON16, 0xC,
|
||||
+ MT6323_ANALDO_CON21, 0x2),
|
||||
+ MT6323_REG_FIXED("ldo_va", VA, MT6323_ANALDO_CON2, 14, 2800000,
|
||||
+ MT6323_ANALDO_CON2, 0x2),
|
||||
+ MT6323_LDO("ldo_vcama", VCAMA, ldo_volt_table2,
|
||||
+ MT6323_ANALDO_CON4, 15, MT6323_ANALDO_CON10, 0x60, -1, 0),
|
||||
+ MT6323_REG_FIXED("ldo_vio28", VIO28, MT6323_DIGLDO_CON0, 14, 2800000,
|
||||
+ MT6323_DIGLDO_CON0, 0x2),
|
||||
+ MT6323_REG_FIXED("ldo_vusb", VUSB, MT6323_DIGLDO_CON2, 14, 3300000,
|
||||
+ MT6323_DIGLDO_CON2, 0x2),
|
||||
+ MT6323_LDO("ldo_vmc", VMC, ldo_volt_table3,
|
||||
+ MT6323_DIGLDO_CON3, 12, MT6323_DIGLDO_CON24, 0x10,
|
||||
+ MT6323_DIGLDO_CON3, 0x2),
|
||||
+ MT6323_LDO("ldo_vmch", VMCH, ldo_volt_table4,
|
||||
+ MT6323_DIGLDO_CON5, 14, MT6323_DIGLDO_CON26, 0x80,
|
||||
+ MT6323_DIGLDO_CON5, 0x2),
|
||||
+ MT6323_LDO("ldo_vemc3v3", VEMC3V3, ldo_volt_table4,
|
||||
+ MT6323_DIGLDO_CON6, 14, MT6323_DIGLDO_CON27, 0x80,
|
||||
+ MT6323_DIGLDO_CON6, 0x2),
|
||||
+ MT6323_LDO("ldo_vgp1", VGP1, ldo_volt_table5,
|
||||
+ MT6323_DIGLDO_CON7, 15, MT6323_DIGLDO_CON28, 0xE0,
|
||||
+ MT6323_DIGLDO_CON7, 0x2),
|
||||
+ MT6323_LDO("ldo_vgp2", VGP2, ldo_volt_table6,
|
||||
+ MT6323_DIGLDO_CON8, 15, MT6323_DIGLDO_CON29, 0xE0,
|
||||
+ MT6323_DIGLDO_CON8, 0x2),
|
||||
+ MT6323_LDO("ldo_vgp3", VGP3, ldo_volt_table7,
|
||||
+ MT6323_DIGLDO_CON9, 15, MT6323_DIGLDO_CON30, 0x60,
|
||||
+ MT6323_DIGLDO_CON9, 0x2),
|
||||
+ MT6323_REG_FIXED("ldo_vcn18", VCN18, MT6323_DIGLDO_CON11, 14, 1800000,
|
||||
+ MT6323_DIGLDO_CON11, 0x2),
|
||||
+ MT6323_LDO("ldo_vsim1", VSIM1, ldo_volt_table8,
|
||||
+ MT6323_DIGLDO_CON13, 15, MT6323_DIGLDO_CON34, 0x20,
|
||||
+ MT6323_DIGLDO_CON13, 0x2),
|
||||
+ MT6323_LDO("ldo_vsim2", VSIM2, ldo_volt_table8,
|
||||
+ MT6323_DIGLDO_CON14, 15, MT6323_DIGLDO_CON35, 0x20,
|
||||
+ MT6323_DIGLDO_CON14, 0x2),
|
||||
+ MT6323_REG_FIXED("ldo_vrtc", VRTC, MT6323_DIGLDO_CON15, 8, 2800000,
|
||||
+ -1, 0),
|
||||
+ MT6323_LDO("ldo_vcamaf", VCAMAF, ldo_volt_table5,
|
||||
+ MT6323_DIGLDO_CON31, 15, MT6323_DIGLDO_CON32, 0xE0,
|
||||
+ MT6323_DIGLDO_CON31, 0x2),
|
||||
+ MT6323_LDO("ldo_vibr", VIBR, ldo_volt_table5,
|
||||
+ MT6323_DIGLDO_CON39, 15, MT6323_DIGLDO_CON40, 0xE0,
|
||||
+ MT6323_DIGLDO_CON39, 0x2),
|
||||
+ MT6323_REG_FIXED("ldo_vrf18", VRF18, MT6323_DIGLDO_CON45, 15, 1825000,
|
||||
+ MT6323_DIGLDO_CON45, 0x2),
|
||||
+ MT6323_LDO("ldo_vm", VM, ldo_volt_table9,
|
||||
+ MT6323_DIGLDO_CON47, 14, MT6323_DIGLDO_CON48, 0x30,
|
||||
+ MT6323_DIGLDO_CON47, 0x2),
|
||||
+ MT6323_REG_FIXED("ldo_vio18", VIO18, MT6323_DIGLDO_CON49, 14, 1800000,
|
||||
+ MT6323_DIGLDO_CON49, 0x2),
|
||||
+ MT6323_LDO("ldo_vcamd", VCAMD, ldo_volt_table10,
|
||||
+ MT6323_DIGLDO_CON51, 14, MT6323_DIGLDO_CON52, 0x60,
|
||||
+ MT6323_DIGLDO_CON51, 0x2),
|
||||
+ MT6323_REG_FIXED("ldo_vcamio", VCAMIO, MT6323_DIGLDO_CON53, 14, 1800000,
|
||||
+ MT6323_DIGLDO_CON53, 0x2),
|
||||
+};
|
||||
+
|
||||
+static int mt6323_set_buck_vosel_reg(struct platform_device *pdev)
|
||||
+{
|
||||
+ struct mt6397_chip *mt6323 = dev_get_drvdata(pdev->dev.parent);
|
||||
+ int i;
|
||||
+ u32 regval;
|
||||
+
|
||||
+ for (i = 0; i < MT6323_MAX_REGULATOR; i++) {
|
||||
+ if (mt6323_regulators[i].vselctrl_reg) {
|
||||
+ if (regmap_read(mt6323->regmap,
|
||||
+ mt6323_regulators[i].vselctrl_reg,
|
||||
+ ®val) < 0) {
|
||||
+ dev_err(&pdev->dev,
|
||||
+ "Failed to read buck ctrl\n");
|
||||
+ return -EIO;
|
||||
+ }
|
||||
+
|
||||
+ if (regval & mt6323_regulators[i].vselctrl_mask) {
|
||||
+ mt6323_regulators[i].desc.vsel_reg =
|
||||
+ mt6323_regulators[i].vselon_reg;
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int mt6323_regulator_probe(struct platform_device *pdev)
|
||||
+{
|
||||
+ struct mt6397_chip *mt6323 = dev_get_drvdata(pdev->dev.parent);
|
||||
+ struct regulator_config config = {};
|
||||
+ struct regulator_dev *rdev;
|
||||
+ int i;
|
||||
+ u32 reg_value;
|
||||
+
|
||||
+ /* Query buck controller to select activated voltage register part */
|
||||
+ if (mt6323_set_buck_vosel_reg(pdev))
|
||||
+ return -EIO;
|
||||
+
|
||||
+ /* Read PMIC chip revision to update constraints and voltage table */
|
||||
+ if (regmap_read(mt6323->regmap, MT6323_CID, ®_value) < 0) {
|
||||
+ dev_err(&pdev->dev, "Failed to read Chip ID\n");
|
||||
+ return -EIO;
|
||||
+ }
|
||||
+ dev_info(&pdev->dev, "Chip ID = 0x%x\n", reg_value);
|
||||
+
|
||||
+ for (i = 0; i < MT6323_MAX_REGULATOR; i++) {
|
||||
+ config.dev = &pdev->dev;
|
||||
+ config.driver_data = &mt6323_regulators[i];
|
||||
+ config.regmap = mt6323->regmap;
|
||||
+ rdev = devm_regulator_register(&pdev->dev,
|
||||
+ &mt6323_regulators[i].desc, &config);
|
||||
+ if (IS_ERR(rdev)) {
|
||||
+ dev_err(&pdev->dev, "failed to register %s\n",
|
||||
+ mt6323_regulators[i].desc.name);
|
||||
+ return PTR_ERR(rdev);
|
||||
+ }
|
||||
+ }
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static const struct platform_device_id mt6323_platform_ids[] = {
|
||||
+ {"mt6323-regulator", 0},
|
||||
+ { /* sentinel */ },
|
||||
+};
|
||||
+MODULE_DEVICE_TABLE(platform, mt6323_platform_ids);
|
||||
+
|
||||
+static const struct of_device_id mt6323_of_match[] = {
|
||||
+ { .compatible = "mediatek,mt6323-regulator", },
|
||||
+ { /* sentinel */ },
|
||||
+};
|
||||
+MODULE_DEVICE_TABLE(of, mt6323_of_match);
|
||||
+
|
||||
+static struct platform_driver mt6323_regulator_driver = {
|
||||
+ .driver = {
|
||||
+ .name = "mt6323-regulator",
|
||||
+ .of_match_table = of_match_ptr(mt6323_of_match),
|
||||
+ },
|
||||
+ .probe = mt6323_regulator_probe,
|
||||
+ .id_table = mt6323_platform_ids,
|
||||
+};
|
||||
+
|
||||
+module_platform_driver(mt6323_regulator_driver);
|
||||
+
|
||||
+MODULE_AUTHOR("Chen Zhong <chen.zhong@mediatek.com>");
|
||||
+MODULE_DESCRIPTION("Regulator Driver for MediaTek MT6397 PMIC");
|
||||
+MODULE_LICENSE("GPL v2");
|
||||
--- /dev/null
|
||||
+++ b/include/linux/regulator/mt6323-regulator.h
|
||||
@@ -0,0 +1,52 @@
|
||||
+/*
|
||||
+ * Copyright (c) 2016 MediaTek Inc.
|
||||
+ * Author: Chen Zhong <chen.zhong@mediatek.com>
|
||||
+ *
|
||||
+ * This program is free software; you can redistribute it and/or modify
|
||||
+ * it under the terms of the GNU General Public License version 2 as
|
||||
+ * published by the Free Software Foundation.
|
||||
+ *
|
||||
+ * This program is distributed in the hope that it will be useful,
|
||||
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
+ * GNU General Public License for more details.
|
||||
+ */
|
||||
+
|
||||
+#ifndef __LINUX_REGULATOR_MT6323_H
|
||||
+#define __LINUX_REGULATOR_MT6323_H
|
||||
+
|
||||
+enum {
|
||||
+ MT6323_ID_VPROC = 0,
|
||||
+ MT6323_ID_VSYS,
|
||||
+ MT6323_ID_VPA,
|
||||
+ MT6323_ID_VTCXO,
|
||||
+ MT6323_ID_VCN28,
|
||||
+ MT6323_ID_VCN33_BT,
|
||||
+ MT6323_ID_VCN33_WIFI,
|
||||
+ MT6323_ID_VA,
|
||||
+ MT6323_ID_VCAMA,
|
||||
+ MT6323_ID_VIO28 = 9,
|
||||
+ MT6323_ID_VUSB,
|
||||
+ MT6323_ID_VMC,
|
||||
+ MT6323_ID_VMCH,
|
||||
+ MT6323_ID_VEMC3V3,
|
||||
+ MT6323_ID_VGP1,
|
||||
+ MT6323_ID_VGP2,
|
||||
+ MT6323_ID_VGP3,
|
||||
+ MT6323_ID_VCN18,
|
||||
+ MT6323_ID_VSIM1,
|
||||
+ MT6323_ID_VSIM2,
|
||||
+ MT6323_ID_VRTC,
|
||||
+ MT6323_ID_VCAMAF,
|
||||
+ MT6323_ID_VIBR,
|
||||
+ MT6323_ID_VRF18,
|
||||
+ MT6323_ID_VM,
|
||||
+ MT6323_ID_VIO18,
|
||||
+ MT6323_ID_VCAMD,
|
||||
+ MT6323_ID_VCAMIO,
|
||||
+ MT6323_ID_RG_MAX,
|
||||
+};
|
||||
+
|
||||
+#define MT6323_MAX_REGULATOR MT6323_ID_RG_MAX
|
||||
+
|
||||
+#endif /* __LINUX_REGULATOR_MT6323_H */
|
|
@ -1,97 +0,0 @@
|
|||
From 6efc8d9081b70dcf71d7e8efd7b51d48ee2541be Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <blogic@openwrt.org>
|
||||
Date: Wed, 2 Mar 2016 07:18:52 +0100
|
||||
Subject: [PATCH 048/102] net-next: mediatek: document MediaTek SoC ethernet
|
||||
binding
|
||||
|
||||
This adds the binding documentation for the MediaTek Ethernet
|
||||
controller.
|
||||
|
||||
Signed-off-by: John Crispin <blogic@openwrt.org>
|
||||
Acked-by: Rob Herring <robh@kernel.org>
|
||||
Cc: devicetree@vger.kernel.org
|
||||
---
|
||||
.../devicetree/bindings/net/mediatek-net.txt | 77 ++++++++++++++++++++
|
||||
1 file changed, 77 insertions(+)
|
||||
create mode 100644 Documentation/devicetree/bindings/net/mediatek-net.txt
|
||||
|
||||
--- /dev/null
|
||||
+++ b/Documentation/devicetree/bindings/net/mediatek-net.txt
|
||||
@@ -0,0 +1,77 @@
|
||||
+MediaTek Frame Engine Ethernet controller
|
||||
+=========================================
|
||||
+
|
||||
+The frame engine ethernet controller can be found on MediaTek SoCs. These SoCs
|
||||
+have dual GMAC each represented by a child node..
|
||||
+
|
||||
+* Ethernet controller node
|
||||
+
|
||||
+Required properties:
|
||||
+- compatible: Should be "mediatek,mt2701-eth"
|
||||
+- reg: Address and length of the register set for the device
|
||||
+- interrupts: Should contain the frame engines interrupt
|
||||
+- clocks: the clock used by the core
|
||||
+- clock-names: the names of the clock listed in the clocks property. These are
|
||||
+ "ethif", "esw", "gp2", "gp1"
|
||||
+- power-domains: phandle to the power domain that the ethernet is part of
|
||||
+- resets: Should contain a phandle to the ethsys reset signal
|
||||
+- reset-names: Should contain the reset signal name "eth"
|
||||
+- mediatek,ethsys: phandle to the syscon node that handles the port setup
|
||||
+- mediatek,pctl: phandle to the syscon node that handles the ports slew rate
|
||||
+ and driver current
|
||||
+
|
||||
+Optional properties:
|
||||
+- interrupt-parent: Should be the phandle for the interrupt controller
|
||||
+ that services interrupts for this device
|
||||
+
|
||||
+
|
||||
+* Ethernet MAC node
|
||||
+
|
||||
+Required properties:
|
||||
+- compatible: Should be "mediatek,eth-mac"
|
||||
+- reg: The number of the MAC
|
||||
+- phy-handle: see ethernet.txt file in the same directory.
|
||||
+
|
||||
+Example:
|
||||
+
|
||||
+eth: ethernet@1b100000 {
|
||||
+ compatible = "mediatek,mt2701-eth";
|
||||
+ reg = <0 0x1b100000 0 0x20000>;
|
||||
+ clocks = <&topckgen CLK_TOP_ETHIF_SEL>,
|
||||
+ <ðsys CLK_ETHSYS_ESW>,
|
||||
+ <ðsys CLK_ETHSYS_GP2>,
|
||||
+ <ðsys CLK_ETHSYS_GP1>;
|
||||
+ clock-names = "ethif", "esw", "gp2", "gp1";
|
||||
+ interrupts = <GIC_SPI 200 IRQ_TYPE_LEVEL_LOW>;
|
||||
+ power-domains = <&scpsys MT2701_POWER_DOMAIN_ETH>;
|
||||
+ resets = <ðsys MT2701_ETHSYS_ETH_RST>;
|
||||
+ reset-names = "eth";
|
||||
+ mediatek,ethsys = <ðsys>;
|
||||
+ mediatek,pctl = <&syscfg_pctl_a>;
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+
|
||||
+ gmac1: mac@0 {
|
||||
+ compatible = "mediatek,eth-mac";
|
||||
+ reg = <0>;
|
||||
+ phy-handle = <&phy0>;
|
||||
+ };
|
||||
+
|
||||
+ gmac2: mac@1 {
|
||||
+ compatible = "mediatek,eth-mac";
|
||||
+ reg = <1>;
|
||||
+ phy-handle = <&phy1>;
|
||||
+ };
|
||||
+
|
||||
+ mdio-bus {
|
||||
+ phy0: ethernet-phy@0 {
|
||||
+ reg = <0>;
|
||||
+ phy-mode = "rgmii";
|
||||
+ };
|
||||
+
|
||||
+ phy1: ethernet-phy@1 {
|
||||
+ reg = <1>;
|
||||
+ phy-mode = "rgmii";
|
||||
+ };
|
||||
+ };
|
||||
+};
|
File diff suppressed because it is too large
Load diff
|
@ -1,65 +0,0 @@
|
|||
From 31e907e5c3c2fc1c94d005bfccdd4a32b5a05f82 Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <blogic@openwrt.org>
|
||||
Date: Wed, 2 Mar 2016 04:32:43 +0100
|
||||
Subject: [PATCH 050/102] net-next: mediatek: add Kconfig and Makefile
|
||||
|
||||
This patch adds the Makefile and Kconfig required to make the driver build.
|
||||
|
||||
Signed-off-by: John Crispin <blogic@openwrt.org>
|
||||
---
|
||||
drivers/net/ethernet/Kconfig | 1 +
|
||||
drivers/net/ethernet/Makefile | 1 +
|
||||
drivers/net/ethernet/mediatek/Kconfig | 17 +++++++++++++++++
|
||||
drivers/net/ethernet/mediatek/Makefile | 5 +++++
|
||||
4 files changed, 24 insertions(+)
|
||||
create mode 100644 drivers/net/ethernet/mediatek/Kconfig
|
||||
create mode 100644 drivers/net/ethernet/mediatek/Makefile
|
||||
|
||||
--- a/drivers/net/ethernet/Kconfig
|
||||
+++ b/drivers/net/ethernet/Kconfig
|
||||
@@ -106,6 +106,7 @@ config LANTIQ_ETOP
|
||||
Support for the MII0 inside the Lantiq SoC
|
||||
|
||||
source "drivers/net/ethernet/marvell/Kconfig"
|
||||
+source "drivers/net/ethernet/mediatek/Kconfig"
|
||||
source "drivers/net/ethernet/mellanox/Kconfig"
|
||||
source "drivers/net/ethernet/micrel/Kconfig"
|
||||
source "drivers/net/ethernet/microchip/Kconfig"
|
||||
--- a/drivers/net/ethernet/Makefile
|
||||
+++ b/drivers/net/ethernet/Makefile
|
||||
@@ -46,6 +46,7 @@ obj-$(CONFIG_JME) += jme.o
|
||||
obj-$(CONFIG_KORINA) += korina.o
|
||||
obj-$(CONFIG_LANTIQ_ETOP) += lantiq_etop.o
|
||||
obj-$(CONFIG_NET_VENDOR_MARVELL) += marvell/
|
||||
+obj-$(CONFIG_NET_VENDOR_MEDIATEK) += mediatek/
|
||||
obj-$(CONFIG_NET_VENDOR_MELLANOX) += mellanox/
|
||||
obj-$(CONFIG_NET_VENDOR_MICREL) += micrel/
|
||||
obj-$(CONFIG_NET_VENDOR_MICROCHIP) += microchip/
|
||||
--- /dev/null
|
||||
+++ b/drivers/net/ethernet/mediatek/Kconfig
|
||||
@@ -0,0 +1,17 @@
|
||||
+config NET_VENDOR_MEDIATEK
|
||||
+ bool "MediaTek ethernet driver"
|
||||
+ depends on ARCH_MEDIATEK
|
||||
+ ---help---
|
||||
+ If you have a Mediatek SoC with ethernet, say Y.
|
||||
+
|
||||
+if NET_VENDOR_MEDIATEK
|
||||
+
|
||||
+config NET_MEDIATEK_SOC
|
||||
+ tristate "MediaTek MT7623 Gigabit ethernet support"
|
||||
+ depends on NET_VENDOR_MEDIATEK #&& (MACH_MT7623 || MACH_MT2701)
|
||||
+ select PHYLIB
|
||||
+ ---help---
|
||||
+ This driver supports the gigabit ethernet MACs in the
|
||||
+ MediaTek MT2701/MT7623 chipset family.
|
||||
+
|
||||
+endif #NET_VENDOR_MEDIATEK
|
||||
--- /dev/null
|
||||
+++ b/drivers/net/ethernet/mediatek/Makefile
|
||||
@@ -0,0 +1,5 @@
|
||||
+#
|
||||
+# Makefile for the Mediatek SoCs built-in ethernet macs
|
||||
+#
|
||||
+
|
||||
+obj-$(CONFIG_NET_MEDIATEK_SOC) += mtk_eth_soc.o
|
|
@ -1,29 +0,0 @@
|
|||
From 514e4ce65a5f1b5bfa3cbca153f672844f093f0e Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <blogic@openwrt.org>
|
||||
Date: Wed, 2 Mar 2016 04:34:04 +0100
|
||||
Subject: [PATCH 051/102] net-next: mediatek: add an entry to MAINTAINERS
|
||||
|
||||
Add myself and Felix as the Maintainers for the MediaTek ethernet driver.
|
||||
|
||||
Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
Signed-off-by: John Crispin <blogic@openwrt.org>
|
||||
---
|
||||
MAINTAINERS | 7 +++++++
|
||||
1 file changed, 7 insertions(+)
|
||||
|
||||
--- a/MAINTAINERS
|
||||
+++ b/MAINTAINERS
|
||||
@@ -6902,6 +6902,13 @@ F: include/uapi/linux/meye.h
|
||||
F: include/uapi/linux/ivtv*
|
||||
F: include/uapi/linux/uvcvideo.h
|
||||
|
||||
+MEDIATEK ETHERNET DRIVER
|
||||
+M: Felix Fietkau <nbd@nbd.name>
|
||||
+M: John Crispin <blogic@openwrt.org>
|
||||
+L: netdev@vger.kernel.org
|
||||
+S: Maintained
|
||||
+F: drivers/net/ethernet/mediatek/
|
||||
+
|
||||
MEDIATEK MT7601U WIRELESS LAN DRIVER
|
||||
M: Jakub Kicinski <kubakici@wp.pl>
|
||||
L: linux-wireless@vger.kernel.org
|
|
@ -1,31 +0,0 @@
|
|||
From f8cda0bc698706413b5dd6fde827f9a2601ac61b Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <blogic@openwrt.org>
|
||||
Date: Thu, 31 Mar 2016 06:07:01 +0200
|
||||
Subject: [PATCH 056/102] arm: mediatek: make a7 timer work Signed-off-by:
|
||||
John Crispin <blogic@openwrt.org>
|
||||
|
||||
---
|
||||
arch/arm/mach-mediatek/Kconfig | 1 +
|
||||
arch/arm/mach-mediatek/mediatek.c | 1 +
|
||||
2 files changed, 2 insertions(+)
|
||||
|
||||
--- a/arch/arm/mach-mediatek/Kconfig
|
||||
+++ b/arch/arm/mach-mediatek/Kconfig
|
||||
@@ -24,6 +24,7 @@ config MACH_MT6592
|
||||
config MACH_MT7623
|
||||
bool "MediaTek MT7623 SoCs support"
|
||||
default ARCH_MEDIATEK
|
||||
+ select HAVE_ARM_ARCH_TIMER
|
||||
select MIGHT_HAVE_PCI
|
||||
|
||||
config MACH_MT8127
|
||||
--- a/arch/arm/mach-mediatek/mediatek.c
|
||||
+++ b/arch/arm/mach-mediatek/mediatek.c
|
||||
@@ -29,6 +29,7 @@ static void __init mediatek_timer_init(v
|
||||
void __iomem *gpt_base;
|
||||
|
||||
if (of_machine_is_compatible("mediatek,mt6589") ||
|
||||
+ of_machine_is_compatible("mediatek,mt7623") ||
|
||||
of_machine_is_compatible("mediatek,mt8135") ||
|
||||
of_machine_is_compatible("mediatek,mt8127")) {
|
||||
/* turn on GPT6 which ungates arch timer clocks */
|
|
@ -1,27 +0,0 @@
|
|||
From b9f9b937dd12dc57bd54a6c89b18eb40d4508424 Mon Sep 17 00:00:00 2001
|
||||
From: Dan Carpenter <dan.carpenter@oracle.com>
|
||||
Date: Tue, 15 Mar 2016 10:18:49 +0300
|
||||
Subject: [PATCH 057/102] net: mediatek: checking for IS_ERR() instead of NULL
|
||||
|
||||
of_phy_connect() returns NULL on error, it never returns error pointers.
|
||||
|
||||
Fixes: 656e705243fd ('net-next: mediatek: add support for MT7623 ethernet')
|
||||
Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
|
||||
---
|
||||
drivers/net/ethernet/mediatek/mtk_eth_soc.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||
@@ -186,9 +186,9 @@ static int mtk_phy_connect_node(struct m
|
||||
|
||||
phydev = of_phy_connect(eth->netdev[mac->id], phy_node,
|
||||
mtk_phy_link_adjust, 0, phy_mode);
|
||||
- if (IS_ERR(phydev)) {
|
||||
+ if (!phydev) {
|
||||
dev_err(eth->dev, "could not connect to PHY\n");
|
||||
- return PTR_ERR(phydev);
|
||||
+ return -ENODEV;
|
||||
}
|
||||
|
||||
dev_info(eth->dev,
|
|
@ -1,24 +0,0 @@
|
|||
From 6c12340c0c307d18b8d6120f64a8275b6d4d3e67 Mon Sep 17 00:00:00 2001
|
||||
From: Dan Carpenter <dan.carpenter@oracle.com>
|
||||
Date: Tue, 15 Mar 2016 10:19:04 +0300
|
||||
Subject: [PATCH 058/102] net: mediatek: unlock on error in mtk_tx_map()
|
||||
|
||||
There was a missing unlock on the error path.
|
||||
|
||||
Fixes: 656e705243fd ('net-next: mediatek: add support for MT7623 ethernet')
|
||||
Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
|
||||
---
|
||||
drivers/net/ethernet/mediatek/mtk_eth_soc.c | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||
@@ -661,6 +661,8 @@ err_dma:
|
||||
itxd = mtk_qdma_phys_to_virt(ring, itxd->txd2);
|
||||
} while (itxd != txd);
|
||||
|
||||
+ spin_unlock_irqrestore(ð->page_lock, flags);
|
||||
+
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
|
@ -1,30 +0,0 @@
|
|||
From a572747434b6153e75812c5466c0557e5ed69284 Mon Sep 17 00:00:00 2001
|
||||
From: Arnd Bergmann <arnd@arndb.de>
|
||||
Date: Mon, 14 Mar 2016 15:07:10 +0100
|
||||
Subject: [PATCH 059/102] net: mediatek: use dma_addr_t correctly
|
||||
|
||||
dma_alloc_coherent() expects a dma_addr_t pointer as its argument,
|
||||
not an 'unsigned int', and gcc correctly warns about broken
|
||||
code in the mtk_init_fq_dma function:
|
||||
|
||||
drivers/net/ethernet/mediatek/mtk_eth_soc.c: In function 'mtk_init_fq_dma':
|
||||
drivers/net/ethernet/mediatek/mtk_eth_soc.c:463:13: error: passing argument 3 of 'dma_alloc_coherent' from incompatible pointer type [-Werror=incompatible-pointer-types]
|
||||
|
||||
This changes the type of the local variable to dma_addr_t.
|
||||
|
||||
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
|
||||
---
|
||||
drivers/net/ethernet/mediatek/mtk_eth_soc.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||
@@ -453,7 +453,7 @@ static inline void mtk_rx_get_desc(struc
|
||||
/* the qdma core needs scratch memory to be setup */
|
||||
static int mtk_init_fq_dma(struct mtk_eth *eth)
|
||||
{
|
||||
- unsigned int phy_ring_head, phy_ring_tail;
|
||||
+ dma_addr_t phy_ring_head, phy_ring_tail;
|
||||
int cnt = MTK_DMA_SIZE;
|
||||
dma_addr_t dma_addr;
|
||||
int i;
|
|
@ -1,31 +0,0 @@
|
|||
From 8473af12d5aa34613070447d6fd8f785f31301de Mon Sep 17 00:00:00 2001
|
||||
From: Arnd Bergmann <arnd@arndb.de>
|
||||
Date: Mon, 14 Mar 2016 15:07:11 +0100
|
||||
Subject: [PATCH 060/102] net: mediatek: remove incorrect dma_mask assignment
|
||||
|
||||
Device drivers should not mess with the DMA mask directly,
|
||||
but instead call dma_set_mask() etc if needed.
|
||||
|
||||
In case of the mtk_eth_soc driver, the mask already gets set
|
||||
correctly when the device is created, and setting it again
|
||||
is against the documented API.
|
||||
|
||||
This removes the incorrect setting.
|
||||
|
||||
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
|
||||
---
|
||||
drivers/net/ethernet/mediatek/mtk_eth_soc.c | 3 ---
|
||||
1 file changed, 3 deletions(-)
|
||||
|
||||
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||
@@ -1678,9 +1678,6 @@ static int mtk_probe(struct platform_dev
|
||||
struct mtk_eth *eth;
|
||||
int err;
|
||||
|
||||
- pdev->dev.coherent_dma_mask = DMA_BIT_MASK(32);
|
||||
- pdev->dev.dma_mask = &pdev->dev.coherent_dma_mask;
|
||||
-
|
||||
device_reset(&pdev->dev);
|
||||
|
||||
match = of_match_device(of_mtk_match, &pdev->dev);
|
|
@ -1,33 +0,0 @@
|
|||
From 99159791184752ece724b741f9fa6334fdc67123 Mon Sep 17 00:00:00 2001
|
||||
From: Arnd Bergmann <arnd@arndb.de>
|
||||
Date: Mon, 14 Mar 2016 15:07:12 +0100
|
||||
Subject: [PATCH 061/102] net: mediatek: check device_reset return code
|
||||
|
||||
The device_reset() function may fail, so we have to check
|
||||
its return value, e.g. to make deferred probing work correctly.
|
||||
gcc warns about it because of the warn_unused_result attribute:
|
||||
|
||||
drivers/net/ethernet/mediatek/mtk_eth_soc.c: In function 'mtk_probe':
|
||||
drivers/net/ethernet/mediatek/mtk_eth_soc.c:1679:2: error: ignoring return value of 'device_reset', declared with attribute warn_unused_result [-Werror=unused-result]
|
||||
|
||||
This adds the trivial error check to propagate the return value
|
||||
to the generic platform device probe code.
|
||||
|
||||
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
|
||||
---
|
||||
drivers/net/ethernet/mediatek/mtk_eth_soc.c | 4 +++-
|
||||
1 file changed, 3 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||
@@ -1678,7 +1678,9 @@ static int mtk_probe(struct platform_dev
|
||||
struct mtk_eth *eth;
|
||||
int err;
|
||||
|
||||
- device_reset(&pdev->dev);
|
||||
+ err = device_reset(&pdev->dev);
|
||||
+ if (err)
|
||||
+ return err;
|
||||
|
||||
match = of_match_device(of_mtk_match, &pdev->dev);
|
||||
soc = (struct mtk_soc_data *)match->data;
|
|
@ -1,23 +0,0 @@
|
|||
From 387257cbd6f3f92de71e2f578d3a9414d0dada27 Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <blogic@openwrt.org>
|
||||
Date: Wed, 30 Mar 2016 03:18:17 +0200
|
||||
Subject: [PATCH 062/102] net: mediatek: watchdog_timeo was not set
|
||||
|
||||
The original commit failed to set watchdog_timeo. This patch sets
|
||||
watchdog_timeo to HZ.
|
||||
|
||||
Signed-off-by: John Crispin <blogic@openwrt.org>
|
||||
---
|
||||
drivers/net/ethernet/mediatek/mtk_eth_soc.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||
@@ -1645,6 +1645,7 @@ static int mtk_add_mac(struct mtk_eth *e
|
||||
mac->hw_stats->reg_offset = id * MTK_STAT_OFFSET;
|
||||
|
||||
SET_NETDEV_DEV(eth->netdev[id], eth->dev);
|
||||
+ eth->netdev[id]->watchdog_timeo = HZ;
|
||||
eth->netdev[id]->netdev_ops = &mtk_netdev_ops;
|
||||
eth->netdev[id]->base_addr = (unsigned long)eth->base;
|
||||
eth->netdev[id]->vlan_features = MTK_HW_FEATURES &
|
|
@ -1,25 +0,0 @@
|
|||
From d8f3e96943334c91ecc0827ed0d3232068c389e6 Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <blogic@openwrt.org>
|
||||
Date: Tue, 22 Mar 2016 04:42:27 +0100
|
||||
Subject: [PATCH 063/102] net: mediatek: mtk_cal_txd_req() returns bad value
|
||||
|
||||
The code used to also support the PDMA engine, which had 2 packet pointers
|
||||
per descriptor. Because of this we have to divide the result by 2 and round
|
||||
it up. This is no longer needed as the code only supports QDMA.
|
||||
|
||||
Signed-off-by: John Crispin <blogic@openwrt.org>
|
||||
---
|
||||
drivers/net/ethernet/mediatek/mtk_eth_soc.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||
@@ -681,7 +681,7 @@ static inline int mtk_cal_txd_req(struct
|
||||
nfrags += skb_shinfo(skb)->nr_frags;
|
||||
}
|
||||
|
||||
- return DIV_ROUND_UP(nfrags, 2);
|
||||
+ return nfrags;
|
||||
}
|
||||
|
||||
static int mtk_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|
@ -1,26 +0,0 @@
|
|||
From 2597d2cedba62b2a3fdca9c044187705f98a0372 Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <blogic@openwrt.org>
|
||||
Date: Fri, 25 Mar 2016 04:24:27 +0100
|
||||
Subject: [PATCH 064/102] net: mediatek: remove superflous reset call
|
||||
|
||||
HW reset is triggered int he mtk_hw_init() function. There is no need to
|
||||
reset the core during probe.
|
||||
|
||||
Signed-off-by: John Crispin <blogic@openwrt.org>
|
||||
---
|
||||
drivers/net/ethernet/mediatek/mtk_eth_soc.c | 4 ----
|
||||
1 file changed, 4 deletions(-)
|
||||
|
||||
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||
@@ -1679,10 +1679,6 @@ static int mtk_probe(struct platform_dev
|
||||
struct mtk_eth *eth;
|
||||
int err;
|
||||
|
||||
- err = device_reset(&pdev->dev);
|
||||
- if (err)
|
||||
- return err;
|
||||
-
|
||||
match = of_match_device(of_mtk_match, &pdev->dev);
|
||||
soc = (struct mtk_soc_data *)match->data;
|
||||
|
|
@ -1,84 +0,0 @@
|
|||
From afc838dde560ab584d3fb0e4b011e4a6770dab3d Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <blogic@openwrt.org>
|
||||
Date: Tue, 29 Mar 2016 16:41:07 +0200
|
||||
Subject: [PATCH 065/102] net: mediatek: fix stop and wakeup of queue
|
||||
|
||||
The driver supports 2 MACs. Both run on the same DMA ring. If we go
|
||||
above/below the TX rings thershold value, we always need to wake/stop
|
||||
the queu of both devices. Not doing to can cause TX stalls and packet
|
||||
drops on one of the devices.
|
||||
|
||||
Signed-off-by: John Crispin <blogic@openwrt.org>
|
||||
---
|
||||
drivers/net/ethernet/mediatek/mtk_eth_soc.c | 37 +++++++++++++++++++--------
|
||||
1 file changed, 27 insertions(+), 10 deletions(-)
|
||||
|
||||
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||
@@ -684,6 +684,28 @@ static inline int mtk_cal_txd_req(struct
|
||||
return nfrags;
|
||||
}
|
||||
|
||||
+static void mtk_wake_queue(struct mtk_eth *eth)
|
||||
+{
|
||||
+ int i;
|
||||
+
|
||||
+ for (i = 0; i < MTK_MAC_COUNT; i++) {
|
||||
+ if (!eth->netdev[i])
|
||||
+ continue;
|
||||
+ netif_wake_queue(eth->netdev[i]);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static void mtk_stop_queue(struct mtk_eth *eth)
|
||||
+{
|
||||
+ int i;
|
||||
+
|
||||
+ for (i = 0; i < MTK_MAC_COUNT; i++) {
|
||||
+ if (!eth->netdev[i])
|
||||
+ continue;
|
||||
+ netif_stop_queue(eth->netdev[i]);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
static int mtk_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
{
|
||||
struct mtk_mac *mac = netdev_priv(dev);
|
||||
@@ -695,7 +717,7 @@ static int mtk_start_xmit(struct sk_buff
|
||||
|
||||
tx_num = mtk_cal_txd_req(skb);
|
||||
if (unlikely(atomic_read(&ring->free_count) <= tx_num)) {
|
||||
- netif_stop_queue(dev);
|
||||
+ mtk_stop_queue(eth);
|
||||
netif_err(eth, tx_queued, dev,
|
||||
"Tx Ring full when queue awake!\n");
|
||||
return NETDEV_TX_BUSY;
|
||||
@@ -720,10 +742,10 @@ static int mtk_start_xmit(struct sk_buff
|
||||
goto drop;
|
||||
|
||||
if (unlikely(atomic_read(&ring->free_count) <= ring->thresh)) {
|
||||
- netif_stop_queue(dev);
|
||||
+ mtk_stop_queue(eth);
|
||||
if (unlikely(atomic_read(&ring->free_count) >
|
||||
ring->thresh))
|
||||
- netif_wake_queue(dev);
|
||||
+ mtk_wake_queue(eth);
|
||||
}
|
||||
|
||||
return NETDEV_TX_OK;
|
||||
@@ -897,13 +919,8 @@ static int mtk_poll_tx(struct mtk_eth *e
|
||||
if (!total)
|
||||
return 0;
|
||||
|
||||
- for (i = 0; i < MTK_MAC_COUNT; i++) {
|
||||
- if (!eth->netdev[i] ||
|
||||
- unlikely(!netif_queue_stopped(eth->netdev[i])))
|
||||
- continue;
|
||||
- if (atomic_read(&ring->free_count) > ring->thresh)
|
||||
- netif_wake_queue(eth->netdev[i]);
|
||||
- }
|
||||
+ if (atomic_read(&ring->free_count) > ring->thresh)
|
||||
+ mtk_wake_queue(eth);
|
||||
|
||||
return total;
|
||||
}
|
|
@ -1,58 +0,0 @@
|
|||
From e2cc73e6ddb0cc39b8f58654a449651a621916a9 Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <blogic@openwrt.org>
|
||||
Date: Tue, 29 Mar 2016 17:00:47 +0200
|
||||
Subject: [PATCH 066/102] net: mediatek: fix mtk_pending_work
|
||||
|
||||
The driver supports 2 MACs. Both run on the same DMA ring. If we hit a TX
|
||||
timeout we need to stop both netdevs before retarting them again. If we
|
||||
dont do thsi, mtk_stop() wont shutdown DMA and the consecutive call to
|
||||
mtk_open() wont restart DMA and enable IRQs.
|
||||
|
||||
Signed-off-by: John Crispin <blogic@openwrt.org>
|
||||
---
|
||||
drivers/net/ethernet/mediatek/mtk_eth_soc.c | 30 +++++++++++++++++++--------
|
||||
1 file changed, 21 insertions(+), 9 deletions(-)
|
||||
|
||||
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||
@@ -1430,19 +1430,31 @@ static int mtk_do_ioctl(struct net_devic
|
||||
|
||||
static void mtk_pending_work(struct work_struct *work)
|
||||
{
|
||||
- struct mtk_mac *mac = container_of(work, struct mtk_mac, pending_work);
|
||||
- struct mtk_eth *eth = mac->hw;
|
||||
- struct net_device *dev = eth->netdev[mac->id];
|
||||
- int err;
|
||||
+ struct mtk_eth *eth = container_of(work, struct mtk_eth, pending_work);
|
||||
+ int err, i;
|
||||
+ unsigned long restart = 0;
|
||||
|
||||
rtnl_lock();
|
||||
- mtk_stop(dev);
|
||||
|
||||
- err = mtk_open(dev);
|
||||
- if (err) {
|
||||
- netif_alert(eth, ifup, dev,
|
||||
+ /* stop all devices to make sure that dma is properly shut down */
|
||||
+ for (i = 0; i < MTK_MAC_COUNT; i++) {
|
||||
+ if (!netif_oper_up(eth->netdev[i]))
|
||||
+ continue;
|
||||
+ mtk_stop(eth->netdev[i]);
|
||||
+ __set_bit(i, &restart);
|
||||
+ }
|
||||
+
|
||||
+
|
||||
+ /* restart DMA and enable IRQs */
|
||||
+ for (i = 0; i < MTK_MAC_COUNT; i++) {
|
||||
+ if (!test_bit(i, &restart))
|
||||
+ continue;
|
||||
+ err = mtk_open(eth->netdev[i]);
|
||||
+ if (err) {
|
||||
+ netif_alert(eth, ifup, eth->netdev[i],
|
||||
"Driver up/down cycle failed, closing device.\n");
|
||||
- dev_close(dev);
|
||||
+ dev_close(eth->netdev[i]);
|
||||
+ }
|
||||
}
|
||||
rtnl_unlock();
|
||||
}
|
|
@ -1,93 +0,0 @@
|
|||
From 6f152b2bdb295d86beb746494ef6fddf17986f8e Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <blogic@openwrt.org>
|
||||
Date: Tue, 29 Mar 2016 17:20:01 +0200
|
||||
Subject: [PATCH 067/102] net: mediatek: fix TX locking
|
||||
|
||||
Inside the TX path there is a lock inside the tx_map function. This is
|
||||
however too late. The patch moves the lock to the start of the xmit
|
||||
function right before the free count check of the DMA ring happens.
|
||||
If we do not do this, the code becomes racy leading to TX stalls and
|
||||
dropped packets. This happens as there are 2 netdevs running on the
|
||||
same physical DMA ring.
|
||||
|
||||
Signed-off-by: John Crispin <blogic@openwrt.org>
|
||||
---
|
||||
drivers/net/ethernet/mediatek/mtk_eth_soc.c | 20 ++++++++++----------
|
||||
1 file changed, 10 insertions(+), 10 deletions(-)
|
||||
|
||||
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||
@@ -536,7 +536,6 @@ static int mtk_tx_map(struct sk_buff *sk
|
||||
struct mtk_eth *eth = mac->hw;
|
||||
struct mtk_tx_dma *itxd, *txd;
|
||||
struct mtk_tx_buf *tx_buf;
|
||||
- unsigned long flags;
|
||||
dma_addr_t mapped_addr;
|
||||
unsigned int nr_frags;
|
||||
int i, n_desc = 1;
|
||||
@@ -568,11 +567,6 @@ static int mtk_tx_map(struct sk_buff *sk
|
||||
if (unlikely(dma_mapping_error(&dev->dev, mapped_addr)))
|
||||
return -ENOMEM;
|
||||
|
||||
- /* normally we can rely on the stack not calling this more than once,
|
||||
- * however we have 2 queues running ont he same ring so we need to lock
|
||||
- * the ring access
|
||||
- */
|
||||
- spin_lock_irqsave(ð->page_lock, flags);
|
||||
WRITE_ONCE(itxd->txd1, mapped_addr);
|
||||
tx_buf->flags |= MTK_TX_FLAGS_SINGLE0;
|
||||
dma_unmap_addr_set(tx_buf, dma_addr0, mapped_addr);
|
||||
@@ -632,8 +626,6 @@ static int mtk_tx_map(struct sk_buff *sk
|
||||
WRITE_ONCE(itxd->txd3, (TX_DMA_SWC | TX_DMA_PLEN0(skb_headlen(skb)) |
|
||||
(!nr_frags * TX_DMA_LS0)));
|
||||
|
||||
- spin_unlock_irqrestore(ð->page_lock, flags);
|
||||
-
|
||||
netdev_sent_queue(dev, skb->len);
|
||||
skb_tx_timestamp(skb);
|
||||
|
||||
@@ -661,8 +653,6 @@ err_dma:
|
||||
itxd = mtk_qdma_phys_to_virt(ring, itxd->txd2);
|
||||
} while (itxd != txd);
|
||||
|
||||
- spin_unlock_irqrestore(ð->page_lock, flags);
|
||||
-
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
@@ -712,14 +702,22 @@ static int mtk_start_xmit(struct sk_buff
|
||||
struct mtk_eth *eth = mac->hw;
|
||||
struct mtk_tx_ring *ring = ð->tx_ring;
|
||||
struct net_device_stats *stats = &dev->stats;
|
||||
+ unsigned long flags;
|
||||
bool gso = false;
|
||||
int tx_num;
|
||||
|
||||
+ /* normally we can rely on the stack not calling this more than once,
|
||||
+ * however we have 2 queues running ont he same ring so we need to lock
|
||||
+ * the ring access
|
||||
+ */
|
||||
+ spin_lock_irqsave(ð->page_lock, flags);
|
||||
+
|
||||
tx_num = mtk_cal_txd_req(skb);
|
||||
if (unlikely(atomic_read(&ring->free_count) <= tx_num)) {
|
||||
mtk_stop_queue(eth);
|
||||
netif_err(eth, tx_queued, dev,
|
||||
"Tx Ring full when queue awake!\n");
|
||||
+ spin_unlock_irqrestore(ð->page_lock, flags);
|
||||
return NETDEV_TX_BUSY;
|
||||
}
|
||||
|
||||
@@ -747,10 +745,12 @@ static int mtk_start_xmit(struct sk_buff
|
||||
ring->thresh))
|
||||
mtk_wake_queue(eth);
|
||||
}
|
||||
+ spin_unlock_irqrestore(ð->page_lock, flags);
|
||||
|
||||
return NETDEV_TX_OK;
|
||||
|
||||
drop:
|
||||
+ spin_unlock_irqrestore(ð->page_lock, flags);
|
||||
stats->tx_dropped++;
|
||||
dev_kfree_skb(skb);
|
||||
return NETDEV_TX_OK;
|
|
@ -1,102 +0,0 @@
|
|||
From 29bc7a1e374425937b5dd2f316dbeef343d4c68a Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <blogic@openwrt.org>
|
||||
Date: Tue, 29 Mar 2016 17:24:24 +0200
|
||||
Subject: [PATCH 068/102] net: mediatek: move the pending_work struct to the
|
||||
device generic struct
|
||||
|
||||
The worker always touches both netdevs. It is ethernet core and not MAC
|
||||
specific. We only need one worker, which belongs into the ethernets core struct.
|
||||
|
||||
Signed-off-by: John Crispin <blogic@openwrt.org>
|
||||
---
|
||||
drivers/net/ethernet/mediatek/mtk_eth_soc.c | 10 ++++------
|
||||
drivers/net/ethernet/mediatek/mtk_eth_soc.h | 4 ++--
|
||||
2 files changed, 6 insertions(+), 8 deletions(-)
|
||||
|
||||
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||
@@ -1193,7 +1193,7 @@ static void mtk_tx_timeout(struct net_de
|
||||
eth->netdev[mac->id]->stats.tx_errors++;
|
||||
netif_err(eth, tx_err, dev,
|
||||
"transmit timed out\n");
|
||||
- schedule_work(&mac->pending_work);
|
||||
+ schedule_work(ð->pending_work);
|
||||
}
|
||||
|
||||
static irqreturn_t mtk_handle_irq(int irq, void *_eth)
|
||||
@@ -1438,7 +1438,7 @@ static void mtk_pending_work(struct work
|
||||
|
||||
/* stop all devices to make sure that dma is properly shut down */
|
||||
for (i = 0; i < MTK_MAC_COUNT; i++) {
|
||||
- if (!netif_oper_up(eth->netdev[i]))
|
||||
+ if (!eth->netdev[i])
|
||||
continue;
|
||||
mtk_stop(eth->netdev[i]);
|
||||
__set_bit(i, &restart);
|
||||
@@ -1464,15 +1464,13 @@ static int mtk_cleanup(struct mtk_eth *e
|
||||
int i;
|
||||
|
||||
for (i = 0; i < MTK_MAC_COUNT; i++) {
|
||||
- struct mtk_mac *mac = netdev_priv(eth->netdev[i]);
|
||||
-
|
||||
if (!eth->netdev[i])
|
||||
continue;
|
||||
|
||||
unregister_netdev(eth->netdev[i]);
|
||||
free_netdev(eth->netdev[i]);
|
||||
- cancel_work_sync(&mac->pending_work);
|
||||
}
|
||||
+ cancel_work_sync(ð->pending_work);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -1660,7 +1658,6 @@ static int mtk_add_mac(struct mtk_eth *e
|
||||
mac->id = id;
|
||||
mac->hw = eth;
|
||||
mac->of_node = np;
|
||||
- INIT_WORK(&mac->pending_work, mtk_pending_work);
|
||||
|
||||
mac->hw_stats = devm_kzalloc(eth->dev,
|
||||
sizeof(*mac->hw_stats),
|
||||
@@ -1762,6 +1759,7 @@ static int mtk_probe(struct platform_dev
|
||||
|
||||
eth->dev = &pdev->dev;
|
||||
eth->msg_enable = netif_msg_init(mtk_msg_level, MTK_DEFAULT_MSG_ENABLE);
|
||||
+ INIT_WORK(ð->pending_work, mtk_pending_work);
|
||||
|
||||
err = mtk_hw_init(eth);
|
||||
if (err)
|
||||
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h
|
||||
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
|
||||
@@ -363,6 +363,7 @@ struct mtk_rx_ring {
|
||||
* @clk_gp1: The gmac1 clock
|
||||
* @clk_gp2: The gmac2 clock
|
||||
* @mii_bus: If there is a bus we need to create an instance for it
|
||||
+ * @pending_work: The workqueue used to reset the dma ring
|
||||
*/
|
||||
|
||||
struct mtk_eth {
|
||||
@@ -389,6 +390,7 @@ struct mtk_eth {
|
||||
struct clk *clk_gp1;
|
||||
struct clk *clk_gp2;
|
||||
struct mii_bus *mii_bus;
|
||||
+ struct work_struct pending_work;
|
||||
};
|
||||
|
||||
/* struct mtk_mac - the structure that holds the info about the MACs of the
|
||||
@@ -398,7 +400,6 @@ struct mtk_eth {
|
||||
* @hw: Backpointer to our main datastruture
|
||||
* @hw_stats: Packet statistics counter
|
||||
* @phy_dev: The attached PHY if available
|
||||
- * @pending_work: The workqueue used to reset the dma ring
|
||||
*/
|
||||
struct mtk_mac {
|
||||
int id;
|
||||
@@ -406,7 +407,6 @@ struct mtk_mac {
|
||||
struct mtk_eth *hw;
|
||||
struct mtk_hw_stats *hw_stats;
|
||||
struct phy_device *phy_dev;
|
||||
- struct work_struct pending_work;
|
||||
};
|
||||
|
||||
/* the struct describing the SoC. these are declared in the soc_xyz.c files */
|
|
@ -1,32 +0,0 @@
|
|||
From 4742349c1595d38b3e3b463e66cf21af4217c869 Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <blogic@openwrt.org>
|
||||
Date: Thu, 7 Apr 2016 17:36:23 +0200
|
||||
Subject: [PATCH 069/102] net: mediatek: do not set the QID field in the TX
|
||||
DMA descriptors
|
||||
|
||||
The QID field gets set to the mac id. This made the DMA linked list queue
|
||||
the traffic of each MAC on a different internal queue. However during long
|
||||
term testing we found that this will cause traffic stalls as the multi
|
||||
queue setup requires a more complete initialisation which is not part of
|
||||
the upstream driver yet.
|
||||
|
||||
This patch removes the code setting the QID field, resulting in all
|
||||
traffic ending up in queue 0 which works without any special setup.
|
||||
|
||||
Signed-off-by: John Crispin <blogic@openwrt.org>
|
||||
---
|
||||
drivers/net/ethernet/mediatek/mtk_eth_soc.c | 3 +--
|
||||
1 file changed, 1 insertion(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||
@@ -603,8 +603,7 @@ static int mtk_tx_map(struct sk_buff *sk
|
||||
WRITE_ONCE(txd->txd1, mapped_addr);
|
||||
WRITE_ONCE(txd->txd3, (TX_DMA_SWC |
|
||||
TX_DMA_PLEN0(frag_map_size) |
|
||||
- last_frag * TX_DMA_LS0) |
|
||||
- mac->id);
|
||||
+ last_frag * TX_DMA_LS0));
|
||||
WRITE_ONCE(txd->txd4, 0);
|
||||
|
||||
tx_buf->skb = (struct sk_buff *)MTK_DMA_DUMMY_DESC;
|
|
@ -1,41 +0,0 @@
|
|||
From 297ef52cd21e28da671996d7b4f39f268d2d0ec1 Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <blogic@openwrt.org>
|
||||
Date: Tue, 29 Mar 2016 14:32:07 +0200
|
||||
Subject: [PATCH 070/102] net: mediatek: update the IRQ part of the binding
|
||||
document
|
||||
|
||||
The current binding document only describes a single interrupt. Update the
|
||||
document by adding the 2 other interrupts.
|
||||
|
||||
The driver currently only uses a single interrupt. The HW is however able
|
||||
to using IRQ grouping to split TX and RX onto separate GIC irqs.
|
||||
|
||||
Signed-off-by: John Crispin <blogic@openwrt.org>
|
||||
Acked-by: Rob Herring <robh@kernel.org>
|
||||
---
|
||||
Documentation/devicetree/bindings/net/mediatek-net.txt | 7 +++++--
|
||||
1 file changed, 5 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/Documentation/devicetree/bindings/net/mediatek-net.txt
|
||||
+++ b/Documentation/devicetree/bindings/net/mediatek-net.txt
|
||||
@@ -9,7 +9,8 @@ have dual GMAC each represented by a chi
|
||||
Required properties:
|
||||
- compatible: Should be "mediatek,mt2701-eth"
|
||||
- reg: Address and length of the register set for the device
|
||||
-- interrupts: Should contain the frame engines interrupt
|
||||
+- interrupts: Should contain the three frame engines interrupts in numeric
|
||||
+ order. These are fe_int0, fe_int1 and fe_int2.
|
||||
- clocks: the clock used by the core
|
||||
- clock-names: the names of the clock listed in the clocks property. These are
|
||||
"ethif", "esw", "gp2", "gp1"
|
||||
@@ -42,7 +43,9 @@ eth: ethernet@1b100000 {
|
||||
<ðsys CLK_ETHSYS_GP2>,
|
||||
<ðsys CLK_ETHSYS_GP1>;
|
||||
clock-names = "ethif", "esw", "gp2", "gp1";
|
||||
- interrupts = <GIC_SPI 200 IRQ_TYPE_LEVEL_LOW>;
|
||||
+ interrupts = <GIC_SPI 200 IRQ_TYPE_LEVEL_LOW
|
||||
+ GIC_SPI 199 IRQ_TYPE_LEVEL_LOW
|
||||
+ GIC_SPI 198 IRQ_TYPE_LEVEL_LOW>;
|
||||
power-domains = <&scpsys MT2701_POWER_DOMAIN_ETH>;
|
||||
resets = <ðsys MT2701_ETHSYS_ETH_RST>;
|
||||
reset-names = "eth";
|
File diff suppressed because it is too large
Load diff
|
@ -1,91 +0,0 @@
|
|||
From 410a91f6efa1c4c3c4369d1dd2c31286749dff33 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
|
||||
Date: Wed, 23 Mar 2016 11:19:01 +0100
|
||||
Subject: [PATCH 073/102] of: mtd: prepare helper reading NAND ECC algo from
|
||||
DT
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
NAND subsystem is being slightly reworked to store ECC details in
|
||||
separated fields. In future we'll want to add support for more DT
|
||||
properties as specifying every possible setup with a single
|
||||
"nand-ecc-mode" is a pretty bad idea.
|
||||
To allow this let's add a helper that will support something like
|
||||
"nand-ecc-algo" in future. Right now we use it for keeping backward
|
||||
compatibility.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
|
||||
Signed-off-by: Boris Brezillon <boris.brezillon@free-electrons.com>
|
||||
---
|
||||
drivers/of/of_mtd.c | 36 ++++++++++++++++++++++++++++++++++++
|
||||
include/linux/of_mtd.h | 6 ++++++
|
||||
2 files changed, 42 insertions(+)
|
||||
|
||||
--- a/drivers/of/of_mtd.c
|
||||
+++ b/drivers/of/of_mtd.c
|
||||
@@ -50,6 +50,42 @@ int of_get_nand_ecc_mode(struct device_n
|
||||
EXPORT_SYMBOL_GPL(of_get_nand_ecc_mode);
|
||||
|
||||
/**
|
||||
+ * of_get_nand_ecc_algo - Get nand ecc algorithm for given device_node
|
||||
+ * @np: Pointer to the given device_node
|
||||
+ *
|
||||
+ * The function gets ecc algorithm and returns its enum value, or errno in error
|
||||
+ * case.
|
||||
+ */
|
||||
+int of_get_nand_ecc_algo(struct device_node *np)
|
||||
+{
|
||||
+ const char *pm;
|
||||
+ int err;
|
||||
+
|
||||
+ /*
|
||||
+ * TODO: Read ECC algo OF property and map it to enum nand_ecc_algo.
|
||||
+ * It's not implemented yet as currently NAND subsystem ignores
|
||||
+ * algorithm explicitly set this way. Once it's handled we should
|
||||
+ * document & support new property.
|
||||
+ */
|
||||
+
|
||||
+ /*
|
||||
+ * For backward compatibility we also read "nand-ecc-mode" checking
|
||||
+ * for some obsoleted values that were specifying ECC algorithm.
|
||||
+ */
|
||||
+ err = of_property_read_string(np, "nand-ecc-mode", &pm);
|
||||
+ if (err < 0)
|
||||
+ return err;
|
||||
+
|
||||
+ if (!strcasecmp(pm, "soft"))
|
||||
+ return NAND_ECC_HAMMING;
|
||||
+ else if (!strcasecmp(pm, "soft_bch"))
|
||||
+ return NAND_ECC_BCH;
|
||||
+
|
||||
+ return -ENODEV;
|
||||
+}
|
||||
+EXPORT_SYMBOL_GPL(of_get_nand_ecc_algo);
|
||||
+
|
||||
+/**
|
||||
* of_get_nand_ecc_step_size - Get ECC step size associated to
|
||||
* the required ECC strength (see below).
|
||||
* @np: Pointer to the given device_node
|
||||
--- a/include/linux/of_mtd.h
|
||||
+++ b/include/linux/of_mtd.h
|
||||
@@ -13,6 +13,7 @@
|
||||
|
||||
#include <linux/of.h>
|
||||
int of_get_nand_ecc_mode(struct device_node *np);
|
||||
+int of_get_nand_ecc_algo(struct device_node *np);
|
||||
int of_get_nand_ecc_step_size(struct device_node *np);
|
||||
int of_get_nand_ecc_strength(struct device_node *np);
|
||||
int of_get_nand_bus_width(struct device_node *np);
|
||||
@@ -24,6 +25,11 @@ static inline int of_get_nand_ecc_mode(s
|
||||
{
|
||||
return -ENOSYS;
|
||||
}
|
||||
+
|
||||
+static inline int of_get_nand_ecc_algo(struct device_node *np)
|
||||
+{
|
||||
+ return -ENOSYS;
|
||||
+}
|
||||
|
||||
static inline int of_get_nand_ecc_step_size(struct device_node *np)
|
||||
{
|
|
@ -1,179 +0,0 @@
|
|||
From 5e1c00983efeca4522ac2e8574e3e3997d26a203 Mon Sep 17 00:00:00 2001
|
||||
From: Jorge Ramirez-Ortiz <jorge.ramirez-ortiz@linaro.org>
|
||||
Date: Fri, 29 Apr 2016 12:17:21 -0400
|
||||
Subject: [PATCH 074/102] mtd: mediatek: device tree docs for MTK Smart Device
|
||||
Gen1 NAND
|
||||
|
||||
This patch adds documentation support for Smart Device Gen1 type of
|
||||
NAND controllers.
|
||||
|
||||
Signed-off-by: Jorge Ramirez-Ortiz <jorge.ramirez-ortiz@linaro.org>
|
||||
---
|
||||
Documentation/devicetree/bindings/mtd/mtk-nand.txt | 161 ++++++++++++++++++++
|
||||
1 file changed, 161 insertions(+)
|
||||
create mode 100644 Documentation/devicetree/bindings/mtd/mtk-nand.txt
|
||||
|
||||
--- /dev/null
|
||||
+++ b/Documentation/devicetree/bindings/mtd/mtk-nand.txt
|
||||
@@ -0,0 +1,161 @@
|
||||
+MTK SoCs NAND FLASH controller (NFC) DT binding
|
||||
+
|
||||
+This file documents the device tree bindings for MTK SoCs NAND controllers.
|
||||
+The functional split of the controller requires two drivers to operate:
|
||||
+the nand controller interface driver and the ECC engine driver.
|
||||
+
|
||||
+The hardware description for both devices must be captured as device
|
||||
+tree nodes.
|
||||
+
|
||||
+1) NFC NAND Controller Interface (NFI):
|
||||
+=======================================
|
||||
+
|
||||
+The first part of NFC is NAND Controller Interface (NFI) HW.
|
||||
+Required NFI properties:
|
||||
+- compatible: Should be "mediatek,mtxxxx-nfc".
|
||||
+- reg: Base physical address and size of NFI.
|
||||
+- interrupts: Interrupts of NFI.
|
||||
+- clocks: NFI required clocks.
|
||||
+- clock-names: NFI clocks internal name.
|
||||
+- status: Disabled default. Then set "okay" by platform.
|
||||
+- ecc-engine: Required ECC Engine node.
|
||||
+- #address-cells: NAND chip index, should be 1.
|
||||
+- #size-cells: Should be 0.
|
||||
+
|
||||
+Example:
|
||||
+
|
||||
+ nandc: nfi@1100d000 {
|
||||
+ compatible = "mediatek,mt2701-nfc";
|
||||
+ reg = <0 0x1100d000 0 0x1000>;
|
||||
+ interrupts = <GIC_SPI 56 IRQ_TYPE_LEVEL_LOW>;
|
||||
+ clocks = <&pericfg CLK_PERI_NFI>,
|
||||
+ <&pericfg CLK_PERI_NFI_PAD>;
|
||||
+ clock-names = "nfi_clk", "pad_clk";
|
||||
+ status = "disabled";
|
||||
+ ecc-engine = <&bch>;
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+ };
|
||||
+
|
||||
+Platform related properties, should be set in {platform_name}.dts:
|
||||
+- children nodes: NAND chips.
|
||||
+
|
||||
+Children nodes properties:
|
||||
+- reg: Chip Select Signal, default 0.
|
||||
+ Set as reg = <0>, <1> when need 2 CS.
|
||||
+Optional:
|
||||
+- nand-on-flash-bbt: Store BBT on NAND Flash.
|
||||
+- nand-ecc-mode: the NAND ecc mode (check driver for supported modes)
|
||||
+- nand-ecc-step-size: Number of data bytes covered by a single ECC step.
|
||||
+ The controller only supports 512 and 1024.
|
||||
+ For large page NANDs ther recommended value is 1024.
|
||||
+- nand-ecc-strength: Number of bits to correct per ECC step.
|
||||
+ The valid values that the controller supports are: 4, 6,
|
||||
+ 8, 10, 12, 14, 16, 18, 20, 22, 24, 28, 32, 36, 40, 44,
|
||||
+ 48, 52, 56, 60.
|
||||
+ The strength should be calculated as follows:
|
||||
+ E = (S - F) * 8 / 14
|
||||
+ S = O / (P / Q)
|
||||
+ E :nand-ecc-strength;
|
||||
+ S :spare size per sector;
|
||||
+ F : FDM size, should be in the range [1,8].
|
||||
+ It is used to store free oob data.
|
||||
+ O : oob size;
|
||||
+ P : page size;
|
||||
+ Q :nand-ecc-step-size
|
||||
+ If the result does not match any one of the listed
|
||||
+ choices above, please select the smaller valid value from
|
||||
+ the list.
|
||||
+ (otherwise the driver will do the clamping at runtime).
|
||||
+- vmch-supply: NAND power supply.
|
||||
+- pinctrl-names: Default NAND pin GPIO setting name.
|
||||
+- pinctrl-0: GPIO setting node.
|
||||
+
|
||||
+Example:
|
||||
+ &pio {
|
||||
+ nand_pins_default: nanddefault {
|
||||
+ pins_dat {
|
||||
+ pinmux = <MT2701_PIN_111_MSDC0_DAT7__FUNC_NLD7>,
|
||||
+ <MT2701_PIN_112_MSDC0_DAT6__FUNC_NLD6>,
|
||||
+ <MT2701_PIN_114_MSDC0_DAT4__FUNC_NLD4>,
|
||||
+ <MT2701_PIN_118_MSDC0_DAT3__FUNC_NLD3>,
|
||||
+ <MT2701_PIN_121_MSDC0_DAT0__FUNC_NLD0>,
|
||||
+ <MT2701_PIN_120_MSDC0_DAT1__FUNC_NLD1>,
|
||||
+ <MT2701_PIN_113_MSDC0_DAT5__FUNC_NLD5>,
|
||||
+ <MT2701_PIN_115_MSDC0_RSTB__FUNC_NLD8>,
|
||||
+ <MT2701_PIN_119_MSDC0_DAT2__FUNC_NLD2>;
|
||||
+ input-enable;
|
||||
+ drive-strength = <MTK_DRIVE_8mA>;
|
||||
+ bias-pull-up;
|
||||
+ };
|
||||
+
|
||||
+ pins_we {
|
||||
+ pinmux = <MT2701_PIN_117_MSDC0_CLK__FUNC_NWEB>;
|
||||
+ drive-strength = <MTK_DRIVE_8mA>;
|
||||
+ bias-pull-up = <MTK_PUPD_SET_R1R0_10>;
|
||||
+ };
|
||||
+
|
||||
+ pins_ale {
|
||||
+ pinmux = <MT2701_PIN_116_MSDC0_CMD__FUNC_NALE>;
|
||||
+ drive-strength = <MTK_DRIVE_8mA>;
|
||||
+ bias-pull-down = <MTK_PUPD_SET_R1R0_10>;
|
||||
+ };
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ &nandc {
|
||||
+ status = "okay";
|
||||
+ pinctrl-names = "default";
|
||||
+ pinctrl-0 = <&nand_pins_default>;
|
||||
+ nand@0 {
|
||||
+ reg = <0>;
|
||||
+ nand-on-flash-bbt;
|
||||
+ nand-ecc-mode = "hw";
|
||||
+ nand-ecc-strength = <24>;
|
||||
+ nand-ecc-step-size = <1024>;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+NAND chip optional subnodes:
|
||||
+- Partitions, see Documentation/devicetree/bindings/mtd/partition.txt
|
||||
+
|
||||
+Example:
|
||||
+ nand@0 {
|
||||
+ partitions {
|
||||
+ compatible = "fixed-partitions";
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <1>;
|
||||
+
|
||||
+ preloader@0 {
|
||||
+ label = "pl";
|
||||
+ read-only;
|
||||
+ reg = <0x00000000 0x00400000>;
|
||||
+ };
|
||||
+ android@0x00400000 {
|
||||
+ label = "android";
|
||||
+ reg = <0x00400000 0x12c00000>;
|
||||
+ };
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+2) ECC Engine:
|
||||
+==============
|
||||
+
|
||||
+Required BCH properties:
|
||||
+- compatible: Should be "mediatek,mtxxxx-ecc".
|
||||
+- reg: Base physical address and size of ECC.
|
||||
+- interrupts: Interrupts of ECC.
|
||||
+- clocks: ECC required clocks.
|
||||
+- clock-names: ECC clocks internal name.
|
||||
+- status: Disabled default. Then set "okay" by platform.
|
||||
+
|
||||
+Example:
|
||||
+
|
||||
+ bch: ecc@1100e000 {
|
||||
+ compatible = "mediatek,mt2701-ecc";
|
||||
+ reg = <0 0x1100e000 0 0x1000>;
|
||||
+ interrupts = <GIC_SPI 55 IRQ_TYPE_LEVEL_LOW>;
|
||||
+ clocks = <&pericfg CLK_PERI_NFI_ECC>;
|
||||
+ clock-names = "nfiecc_clk";
|
||||
+ status = "disabled";
|
||||
+ };
|
File diff suppressed because it is too large
Load diff
|
@ -1,67 +0,0 @@
|
|||
From 5dc0d474396e04e6c140d71f0e113eb1c03501c5 Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <john@phrozen.org>
|
||||
Date: Tue, 17 May 2016 05:44:10 +0200
|
||||
Subject: [PATCH 076/102] mtd: nand: add power domains to the mediatek driver
|
||||
|
||||
Signed-off-by: John Crispin <john@phrozen.org>
|
||||
---
|
||||
drivers/mtd/nand/mtk_nand.c | 13 ++++++++++++-
|
||||
1 file changed, 12 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/mtd/nand/mtk_nand.c
|
||||
+++ b/drivers/mtd/nand/mtk_nand.c
|
||||
@@ -16,6 +16,7 @@
|
||||
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
+#include <linux/pm_runtime.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/clk.h>
|
||||
@@ -102,6 +103,7 @@
|
||||
#define NFI_MASTER_STA (0x224)
|
||||
#define MASTER_STA_MASK (0x0FFF)
|
||||
#define NFI_EMPTY_THRESH (0x23C)
|
||||
+#define NFI_ACCCON1 (0x244)
|
||||
|
||||
#define MTK_NAME "mtk-nand"
|
||||
#define KB(x) ((x) * 1024UL)
|
||||
@@ -539,6 +541,8 @@ static void mtk_nfc_bad_mark_swap(struct
|
||||
struct mtk_nfc_nand_chip *nand = to_mtk_nand(chip);
|
||||
u32 bad_pos = nand->bad_mark.pos;
|
||||
|
||||
+ return;
|
||||
+
|
||||
if (raw)
|
||||
bad_pos += nand->bad_mark.sec * mtk_data_len(chip);
|
||||
else
|
||||
@@ -946,7 +950,8 @@ static int mtk_nfc_read_oob_std(struct m
|
||||
|
||||
static inline void mtk_nfc_hw_init(struct mtk_nfc *nfc)
|
||||
{
|
||||
- nfi_writel(nfc, 0x10804211, NFI_ACCCON);
|
||||
+ nfi_writel(nfc, 0x30c77fff, NFI_ACCCON);
|
||||
+ nfi_writel(nfc, 0xC03222, NFI_ACCCON1);
|
||||
nfi_writew(nfc, 0xf1, NFI_CNRNB);
|
||||
nfi_writew(nfc, PAGEFMT_8K_16K, NFI_PAGEFMT);
|
||||
|
||||
@@ -1328,6 +1333,9 @@ static int mtk_nfc_probe(struct platform
|
||||
goto clk_disable;
|
||||
}
|
||||
|
||||
+ pm_runtime_enable(dev);
|
||||
+ pm_runtime_get_sync(dev);
|
||||
+
|
||||
platform_set_drvdata(pdev, nfc);
|
||||
|
||||
ret = mtk_nfc_nand_chips_init(dev, nfc);
|
||||
@@ -1362,6 +1370,9 @@ static int mtk_nfc_remove(struct platfor
|
||||
mtk_ecc_release(nfc->ecc);
|
||||
mtk_nfc_disable_clk(&nfc->clk);
|
||||
|
||||
+ pm_runtime_put_sync(&pdev->dev);
|
||||
+ pm_runtime_disable(&pdev->dev);
|
||||
+
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -1,36 +0,0 @@
|
|||
From b1c85818c3fb00022dc125bb62d657d3fd3cf49c Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <john@phrozen.org>
|
||||
Date: Sat, 7 May 2016 06:31:08 +0200
|
||||
Subject: [PATCH 077/102] net-next: mediatek: use mdiobus_free() in favour of
|
||||
kfree()
|
||||
|
||||
The driver currently uses kfree() to clear the mii_bus. This is not the
|
||||
correct way to clear the memory and mdiobus_free() should be used instead.
|
||||
This patch fixes the two instances where this happens in the driver.
|
||||
|
||||
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
|
||||
Signed-off-by: John Crispin <john@phrozen.org>
|
||||
---
|
||||
drivers/net/ethernet/mediatek/mtk_eth_soc.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||
@@ -280,7 +280,7 @@ static int mtk_mdio_init(struct mtk_eth
|
||||
return 0;
|
||||
|
||||
err_free_bus:
|
||||
- kfree(eth->mii_bus);
|
||||
+ mdiobus_free(eth->mii_bus);
|
||||
|
||||
err_put_node:
|
||||
of_node_put(mii_np);
|
||||
@@ -295,7 +295,7 @@ static void mtk_mdio_cleanup(struct mtk_
|
||||
|
||||
mdiobus_unregister(eth->mii_bus);
|
||||
of_node_put(eth->mii_bus->dev.of_node);
|
||||
- kfree(eth->mii_bus);
|
||||
+ mdiobus_free(eth->mii_bus);
|
||||
}
|
||||
|
||||
static inline void mtk_irq_disable(struct mtk_eth *eth, u32 mask)
|
|
@ -1,71 +0,0 @@
|
|||
From 09313f26999e2685e0b9434374e7308e1f447e55 Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <john@phrozen.org>
|
||||
Date: Fri, 22 Apr 2016 11:05:23 +0200
|
||||
Subject: [PATCH 078/102] net-next: mediatek: fix gigabit and flow control
|
||||
advertisement
|
||||
|
||||
The current code will not setup the PHYs advertisement features correctly.
|
||||
Fix this and properly advertise Gigabit features and properly handle
|
||||
asymmetric pause frames.
|
||||
|
||||
Signed-off-by: Sean Wang <keyhaede@gmail.com>
|
||||
Signed-off-by: John Crispin <john@phrozen.org>
|
||||
---
|
||||
drivers/net/ethernet/mediatek/mtk_eth_soc.c | 30 +++++++++++++++++++++++----
|
||||
1 file changed, 26 insertions(+), 4 deletions(-)
|
||||
|
||||
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||
@@ -133,6 +133,8 @@ static int mtk_mdio_read(struct mii_bus
|
||||
static void mtk_phy_link_adjust(struct net_device *dev)
|
||||
{
|
||||
struct mtk_mac *mac = netdev_priv(dev);
|
||||
+ u16 lcl_adv = 0, rmt_adv = 0;
|
||||
+ u8 flowctrl;
|
||||
u32 mcr = MAC_MCR_MAX_RX_1536 | MAC_MCR_IPG_CFG |
|
||||
MAC_MCR_FORCE_MODE | MAC_MCR_TX_EN |
|
||||
MAC_MCR_RX_EN | MAC_MCR_BACKOFF_EN |
|
||||
@@ -150,11 +152,30 @@ static void mtk_phy_link_adjust(struct n
|
||||
if (mac->phy_dev->link)
|
||||
mcr |= MAC_MCR_FORCE_LINK;
|
||||
|
||||
- if (mac->phy_dev->duplex)
|
||||
+ if (mac->phy_dev->duplex) {
|
||||
mcr |= MAC_MCR_FORCE_DPX;
|
||||
|
||||
- if (mac->phy_dev->pause)
|
||||
- mcr |= MAC_MCR_FORCE_RX_FC | MAC_MCR_FORCE_TX_FC;
|
||||
+ if (mac->phy_dev->pause)
|
||||
+ rmt_adv = LPA_PAUSE_CAP;
|
||||
+ if (mac->phy_dev->asym_pause)
|
||||
+ rmt_adv |= LPA_PAUSE_ASYM;
|
||||
+
|
||||
+ if (mac->phy_dev->advertising & ADVERTISED_Pause)
|
||||
+ lcl_adv |= ADVERTISE_PAUSE_CAP;
|
||||
+ if (mac->phy_dev->advertising & ADVERTISED_Asym_Pause)
|
||||
+ lcl_adv |= ADVERTISE_PAUSE_ASYM;
|
||||
+
|
||||
+ flowctrl = mii_resolve_flowctrl_fdx(lcl_adv, rmt_adv);
|
||||
+
|
||||
+ if (flowctrl & FLOW_CTRL_TX)
|
||||
+ mcr |= MAC_MCR_FORCE_TX_FC;
|
||||
+ if (flowctrl & FLOW_CTRL_RX)
|
||||
+ mcr |= MAC_MCR_FORCE_RX_FC;
|
||||
+
|
||||
+ netif_dbg(mac->hw, link, dev, "rx pause %s, tx pause %s\n",
|
||||
+ flowctrl & FLOW_CTRL_RX ? "enabled" : "disabled",
|
||||
+ flowctrl & FLOW_CTRL_TX ? "enabled" : "disabled");
|
||||
+ }
|
||||
|
||||
mtk_w32(mac->hw, mcr, MTK_MAC_MCR(mac->id));
|
||||
|
||||
@@ -236,7 +257,8 @@ static int mtk_phy_connect(struct mtk_ma
|
||||
mac->phy_dev->autoneg = AUTONEG_ENABLE;
|
||||
mac->phy_dev->speed = 0;
|
||||
mac->phy_dev->duplex = 0;
|
||||
- mac->phy_dev->supported &= PHY_BASIC_FEATURES;
|
||||
+ mac->phy_dev->supported &= PHY_GBIT_FEATURES | SUPPORTED_Pause |
|
||||
+ SUPPORTED_Asym_Pause;
|
||||
mac->phy_dev->advertising = mac->phy_dev->supported |
|
||||
ADVERTISED_Autoneg;
|
||||
phy_start_aneg(mac->phy_dev);
|
|
@ -1,38 +0,0 @@
|
|||
From 09f0b50ae838bd6e2bbf0aa22de9f352122297de Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <john@phrozen.org>
|
||||
Date: Fri, 22 Apr 2016 11:06:03 +0200
|
||||
Subject: [PATCH 079/102] net-next: mediatek: add fixed-phy support
|
||||
|
||||
The MT7623 SoC has a builtin gigabit switch. If we want to use it, GMAC1
|
||||
needs to be configured using a fixed link speed and flow control settings.
|
||||
The easiest way to do this is to used the fixed-phy driver, allowing us to
|
||||
reuse the existing mdio polling code to setup the MAC.
|
||||
|
||||
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
|
||||
Signed-off-by: John Crispin <john@phrozen.org>
|
||||
---
|
||||
drivers/net/ethernet/mediatek/mtk_eth_soc.c | 6 ++++++
|
||||
1 file changed, 6 insertions(+)
|
||||
|
||||
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||
@@ -229,6 +229,9 @@ static int mtk_phy_connect(struct mtk_ma
|
||||
u32 val, ge_mode;
|
||||
|
||||
np = of_parse_phandle(mac->of_node, "phy-handle", 0);
|
||||
+ if (!np && of_phy_is_fixed_link(mac->of_node))
|
||||
+ if (!of_phy_register_fixed_link(mac->of_node))
|
||||
+ np = of_node_get(mac->of_node);
|
||||
if (!np)
|
||||
return -ENODEV;
|
||||
|
||||
@@ -257,6 +260,9 @@ static int mtk_phy_connect(struct mtk_ma
|
||||
mac->phy_dev->autoneg = AUTONEG_ENABLE;
|
||||
mac->phy_dev->speed = 0;
|
||||
mac->phy_dev->duplex = 0;
|
||||
+ if (of_phy_is_fixed_link(mac->of_node))
|
||||
+ mac->phy_dev->supported |= SUPPORTED_Pause |
|
||||
+ SUPPORTED_Asym_Pause;
|
||||
mac->phy_dev->supported &= PHY_GBIT_FEATURES | SUPPORTED_Pause |
|
||||
SUPPORTED_Asym_Pause;
|
||||
mac->phy_dev->advertising = mac->phy_dev->supported |
|
|
@ -1,31 +0,0 @@
|
|||
From 25eaa5d6483a5899e6bf48b47f762f05c186b4b6 Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <john@phrozen.org>
|
||||
Date: Fri, 22 Apr 2016 11:08:43 +0200
|
||||
Subject: [PATCH 080/102] net-next: mediatek: properly handle RGMII modes
|
||||
|
||||
If an external Gigabit PHY is connected to either of the MACs we need to
|
||||
be able to tell the PHY to use a delay. Not doing so will result in heavy
|
||||
packet loss and/or data corruption when using PHYs such as the IC+ IP1001.
|
||||
We tell the PHY which MII delay mode to use via the devictree.
|
||||
|
||||
The ethernet driver needs to be adapted to handle all 3 rgmii-*id modes
|
||||
in the same way as normal rgmii when setting up the MAC.
|
||||
|
||||
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
|
||||
Signed-off-by: John Crispin <john@phrozen.org>
|
||||
---
|
||||
drivers/net/ethernet/mediatek/mtk_eth_soc.c | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||
@@ -236,6 +236,9 @@ static int mtk_phy_connect(struct mtk_ma
|
||||
return -ENODEV;
|
||||
|
||||
switch (of_get_phy_mode(np)) {
|
||||
+ case PHY_INTERFACE_MODE_RGMII_TXID:
|
||||
+ case PHY_INTERFACE_MODE_RGMII_RXID:
|
||||
+ case PHY_INTERFACE_MODE_RGMII_ID:
|
||||
case PHY_INTERFACE_MODE_RGMII:
|
||||
ge_mode = 0;
|
||||
break;
|
|
@ -1,92 +0,0 @@
|
|||
From 81cdbda2a08375b9d5915567d2210bf2433e7332 Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <john@phrozen.org>
|
||||
Date: Sat, 23 Apr 2016 11:57:21 +0200
|
||||
Subject: [PATCH 081/102] net-next: mediatek: fix DQL support
|
||||
|
||||
The MTK ethernet core has 2 MACs both sitting on the same DMA ring. The
|
||||
current code will assign the TX traffic of each MAC to its own DQL. This
|
||||
results in the amount of data, that DQL says is in the queue incorrect. As
|
||||
the data from multiple devices is infact enqueued. This makes any decision
|
||||
based on these value non deterministic. Fix this by tracking all TX
|
||||
traffic, regardless of the MAC it belongs to in the DQL of all devices
|
||||
using the DMA.
|
||||
|
||||
Signed-off-by: John Crispin <john@phrozen.org>
|
||||
---
|
||||
drivers/net/ethernet/mediatek/mtk_eth_soc.c | 33 ++++++++++++++++-----------
|
||||
1 file changed, 20 insertions(+), 13 deletions(-)
|
||||
|
||||
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||
@@ -656,7 +656,16 @@ static int mtk_tx_map(struct sk_buff *sk
|
||||
WRITE_ONCE(itxd->txd3, (TX_DMA_SWC | TX_DMA_PLEN0(skb_headlen(skb)) |
|
||||
(!nr_frags * TX_DMA_LS0)));
|
||||
|
||||
- netdev_sent_queue(dev, skb->len);
|
||||
+ /* we have a single DMA ring so BQL needs to be updated for all devices
|
||||
+ * sitting on this ring
|
||||
+ */
|
||||
+ for (i = 0; i < MTK_MAC_COUNT; i++) {
|
||||
+ if (!eth->netdev[i])
|
||||
+ continue;
|
||||
+
|
||||
+ netdev_sent_queue(eth->netdev[i], skb->len);
|
||||
+ }
|
||||
+
|
||||
skb_tx_timestamp(skb);
|
||||
|
||||
ring->next_free = mtk_qdma_phys_to_virt(ring, txd->txd2);
|
||||
@@ -884,21 +893,18 @@ static int mtk_poll_tx(struct mtk_eth *e
|
||||
struct mtk_tx_dma *desc;
|
||||
struct sk_buff *skb;
|
||||
struct mtk_tx_buf *tx_buf;
|
||||
- int total = 0, done[MTK_MAX_DEVS];
|
||||
- unsigned int bytes[MTK_MAX_DEVS];
|
||||
+ int total = 0, done = 0;
|
||||
+ unsigned int bytes = 0;
|
||||
u32 cpu, dma;
|
||||
static int condition;
|
||||
int i;
|
||||
|
||||
- memset(done, 0, sizeof(done));
|
||||
- memset(bytes, 0, sizeof(bytes));
|
||||
-
|
||||
cpu = mtk_r32(eth, MTK_QTX_CRX_PTR);
|
||||
dma = mtk_r32(eth, MTK_QTX_DRX_PTR);
|
||||
|
||||
desc = mtk_qdma_phys_to_virt(ring, cpu);
|
||||
|
||||
- while ((cpu != dma) && budget) {
|
||||
+ while ((cpu != dma) && done < budget) {
|
||||
u32 next_cpu = desc->txd2;
|
||||
int mac;
|
||||
|
||||
@@ -918,9 +924,8 @@ static int mtk_poll_tx(struct mtk_eth *e
|
||||
}
|
||||
|
||||
if (skb != (struct sk_buff *)MTK_DMA_DUMMY_DESC) {
|
||||
- bytes[mac] += skb->len;
|
||||
- done[mac]++;
|
||||
- budget--;
|
||||
+ bytes += skb->len;
|
||||
+ done++;
|
||||
}
|
||||
mtk_tx_unmap(eth->dev, tx_buf);
|
||||
|
||||
@@ -933,11 +938,13 @@ static int mtk_poll_tx(struct mtk_eth *e
|
||||
|
||||
mtk_w32(eth, cpu, MTK_QTX_CRX_PTR);
|
||||
|
||||
+ /* we have a single DMA ring so BQL needs to be updated for all devices
|
||||
+ * sitting on this ring
|
||||
+ */
|
||||
for (i = 0; i < MTK_MAC_COUNT; i++) {
|
||||
- if (!eth->netdev[i] || !done[i])
|
||||
+ if (!eth->netdev[i])
|
||||
continue;
|
||||
- netdev_completed_queue(eth->netdev[i], done[i], bytes[i]);
|
||||
- total += done[i];
|
||||
+ netdev_completed_queue(eth->netdev[i], done, bytes);
|
||||
}
|
||||
|
||||
/* read hw index again make sure no new tx packet */
|
|
@ -1,26 +0,0 @@
|
|||
From 51ca1e9f141499fd7c95bff5401215b706656754 Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <john@phrozen.org>
|
||||
Date: Sat, 23 Apr 2016 09:06:05 +0200
|
||||
Subject: [PATCH 082/102] net-next: mediatek: add missing return code check
|
||||
|
||||
The code fails to check if the scratch memory was properly allocated. Add
|
||||
this check and return with an error if the allocation failed.
|
||||
|
||||
Signed-off-by: Sean Wang <keyhaede@gmail.com>
|
||||
Signed-off-by: John Crispin <john@phrozen.org>
|
||||
---
|
||||
drivers/net/ethernet/mediatek/mtk_eth_soc.c | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||
@@ -498,6 +498,9 @@ static int mtk_init_fq_dma(struct mtk_et
|
||||
|
||||
eth->scratch_head = kcalloc(cnt, MTK_QDMA_PAGE_SIZE,
|
||||
GFP_KERNEL);
|
||||
+ if (unlikely(!eth->scratch_head))
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
dma_addr = dma_map_single(eth->dev,
|
||||
eth->scratch_head, cnt * MTK_QDMA_PAGE_SIZE,
|
||||
DMA_FROM_DEVICE);
|
|
@ -1,92 +0,0 @@
|
|||
From b48745c534ced06005d2ba57198b54a6a160b39d Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <john@phrozen.org>
|
||||
Date: Sat, 23 Apr 2016 09:18:28 +0200
|
||||
Subject: [PATCH 083/102] net-next: mediatek: fix missing free of scratch
|
||||
memory
|
||||
|
||||
Scratch memory gets allocated in mtk_init_fq_dma() but the corresponding
|
||||
code to free it is missing inside mtk_dma_free() causing a memory leak.
|
||||
With this patch applied, we can run ifconfig/up/down several thousand
|
||||
times without any problems.
|
||||
|
||||
Signed-off-by: John Crispin <john@phrozen.org>
|
||||
---
|
||||
drivers/net/ethernet/mediatek/mtk_eth_soc.c | 18 +++++++++++++-----
|
||||
drivers/net/ethernet/mediatek/mtk_eth_soc.h | 2 ++
|
||||
2 files changed, 15 insertions(+), 5 deletions(-)
|
||||
|
||||
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||
@@ -484,14 +484,14 @@ static inline void mtk_rx_get_desc(struc
|
||||
/* the qdma core needs scratch memory to be setup */
|
||||
static int mtk_init_fq_dma(struct mtk_eth *eth)
|
||||
{
|
||||
- dma_addr_t phy_ring_head, phy_ring_tail;
|
||||
+ dma_addr_t phy_ring_tail;
|
||||
int cnt = MTK_DMA_SIZE;
|
||||
dma_addr_t dma_addr;
|
||||
int i;
|
||||
|
||||
eth->scratch_ring = dma_alloc_coherent(eth->dev,
|
||||
cnt * sizeof(struct mtk_tx_dma),
|
||||
- &phy_ring_head,
|
||||
+ ð->phy_scratch_ring,
|
||||
GFP_ATOMIC | __GFP_ZERO);
|
||||
if (unlikely(!eth->scratch_ring))
|
||||
return -ENOMEM;
|
||||
@@ -508,19 +508,19 @@ static int mtk_init_fq_dma(struct mtk_et
|
||||
return -ENOMEM;
|
||||
|
||||
memset(eth->scratch_ring, 0x0, sizeof(struct mtk_tx_dma) * cnt);
|
||||
- phy_ring_tail = phy_ring_head +
|
||||
+ phy_ring_tail = eth->phy_scratch_ring +
|
||||
(sizeof(struct mtk_tx_dma) * (cnt - 1));
|
||||
|
||||
for (i = 0; i < cnt; i++) {
|
||||
eth->scratch_ring[i].txd1 =
|
||||
(dma_addr + (i * MTK_QDMA_PAGE_SIZE));
|
||||
if (i < cnt - 1)
|
||||
- eth->scratch_ring[i].txd2 = (phy_ring_head +
|
||||
+ eth->scratch_ring[i].txd2 = (eth->phy_scratch_ring +
|
||||
((i + 1) * sizeof(struct mtk_tx_dma)));
|
||||
eth->scratch_ring[i].txd3 = TX_DMA_SDL(MTK_QDMA_PAGE_SIZE);
|
||||
}
|
||||
|
||||
- mtk_w32(eth, phy_ring_head, MTK_QDMA_FQ_HEAD);
|
||||
+ mtk_w32(eth, eth->phy_scratch_ring, MTK_QDMA_FQ_HEAD);
|
||||
mtk_w32(eth, phy_ring_tail, MTK_QDMA_FQ_TAIL);
|
||||
mtk_w32(eth, (cnt << 16) | cnt, MTK_QDMA_FQ_CNT);
|
||||
mtk_w32(eth, MTK_QDMA_PAGE_SIZE << 16, MTK_QDMA_FQ_BLEN);
|
||||
@@ -1220,6 +1220,14 @@ static void mtk_dma_free(struct mtk_eth
|
||||
for (i = 0; i < MTK_MAC_COUNT; i++)
|
||||
if (eth->netdev[i])
|
||||
netdev_reset_queue(eth->netdev[i]);
|
||||
+ if (eth->scratch_ring) {
|
||||
+ dma_free_coherent(eth->dev,
|
||||
+ MTK_DMA_SIZE * sizeof(struct mtk_tx_dma),
|
||||
+ eth->scratch_ring,
|
||||
+ eth->phy_scratch_ring);
|
||||
+ eth->scratch_ring = NULL;
|
||||
+ eth->phy_scratch_ring = 0;
|
||||
+ }
|
||||
mtk_tx_clean(eth);
|
||||
mtk_rx_clean(eth);
|
||||
kfree(eth->scratch_head);
|
||||
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h
|
||||
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
|
||||
@@ -357,6 +357,7 @@ struct mtk_rx_ring {
|
||||
* @rx_ring: Pointer to the memore holding info about the RX ring
|
||||
* @rx_napi: The NAPI struct
|
||||
* @scratch_ring: Newer SoCs need memory for a second HW managed TX ring
|
||||
+ * @phy_scratch_ring: physical address of scratch_ring
|
||||
* @scratch_head: The scratch memory that scratch_ring points to.
|
||||
* @clk_ethif: The ethif clock
|
||||
* @clk_esw: The switch clock
|
||||
@@ -384,6 +385,7 @@ struct mtk_eth {
|
||||
struct mtk_rx_ring rx_ring;
|
||||
struct napi_struct rx_napi;
|
||||
struct mtk_tx_dma *scratch_ring;
|
||||
+ dma_addr_t phy_scratch_ring;
|
||||
void *scratch_head;
|
||||
struct clk *clk_ethif;
|
||||
struct clk *clk_esw;
|
|
@ -1,27 +0,0 @@
|
|||
From 1eea1536dbbbfda418751ec6f5387acb521ddb97 Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <john@phrozen.org>
|
||||
Date: Sat, 23 Apr 2016 09:25:00 +0200
|
||||
Subject: [PATCH 084/102] net-next: mediatek: invalid buffer lookup in
|
||||
mtk_tx_map()
|
||||
|
||||
The lookup of the tx_buffer in the error path inside mtk_tx_map() uses the
|
||||
wrong descriptor pointer. This looks like a copy & paste error. Change the
|
||||
code to use the correct pointer.
|
||||
|
||||
Signed-off-by: Sean Wang <keyhaede@gmail.com>
|
||||
Signed-off-by: John Crispin <john@phrozen.org>
|
||||
---
|
||||
drivers/net/ethernet/mediatek/mtk_eth_soc.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||
@@ -686,7 +686,7 @@ static int mtk_tx_map(struct sk_buff *sk
|
||||
|
||||
err_dma:
|
||||
do {
|
||||
- tx_buf = mtk_desc_to_tx_buf(ring, txd);
|
||||
+ tx_buf = mtk_desc_to_tx_buf(ring, itxd);
|
||||
|
||||
/* unmap dma */
|
||||
mtk_tx_unmap(&dev->dev, tx_buf);
|
|
@ -1,34 +0,0 @@
|
|||
From 98aac832925a99afee8722cdfd5a848dd6086b8f Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <john@phrozen.org>
|
||||
Date: Sat, 23 Apr 2016 09:28:25 +0200
|
||||
Subject: [PATCH 085/102] net-next: mediatek: dropped rx packets are not being
|
||||
counted properly
|
||||
|
||||
There are 2 places inside mtk_poll_rx where rx_dropped is not being
|
||||
incremented properly. Fix this by adding the missing code to increment
|
||||
the counter.
|
||||
|
||||
Signed-off-by: Sean Wang <keyhaede@gmail.com>
|
||||
Signed-off-by: John Crispin <john@phrozen.org>
|
||||
---
|
||||
drivers/net/ethernet/mediatek/mtk_eth_soc.c | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||
@@ -841,6 +841,7 @@ static int mtk_poll_rx(struct napi_struc
|
||||
DMA_FROM_DEVICE);
|
||||
if (unlikely(dma_mapping_error(&netdev->dev, dma_addr))) {
|
||||
skb_free_frag(new_data);
|
||||
+ netdev->stats.rx_dropped++;
|
||||
goto release_desc;
|
||||
}
|
||||
|
||||
@@ -848,6 +849,7 @@ static int mtk_poll_rx(struct napi_struc
|
||||
skb = build_skb(data, ring->frag_size);
|
||||
if (unlikely(!skb)) {
|
||||
put_page(virt_to_head_page(new_data));
|
||||
+ netdev->stats.rx_dropped++;
|
||||
goto release_desc;
|
||||
}
|
||||
skb_reserve(skb, NET_SKB_PAD + NET_IP_ALIGN);
|
|
@ -1,39 +0,0 @@
|
|||
From 5077ac38a86023124ebbe24cd1b7ecbd0f8edaff Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <john@phrozen.org>
|
||||
Date: Tue, 3 May 2016 03:06:59 +0200
|
||||
Subject: [PATCH 086/102] net-next: mediatek: add next data pointer coherency
|
||||
protection
|
||||
|
||||
The QDMA engine can fail to update the register pointing to the next TX
|
||||
descriptor if this bit does not get set in the QDMA configuration register.
|
||||
Not setting this bit can result in invalid values inside the TX rings
|
||||
registers which will causes TX stalls.
|
||||
|
||||
Signed-off-by: Sean Wang <keyhaede@gmail.com>
|
||||
Signed-off-by: John Crispin <john@phrozen.org>
|
||||
---
|
||||
drivers/net/ethernet/mediatek/mtk_eth_soc.c | 2 +-
|
||||
drivers/net/ethernet/mediatek/mtk_eth_soc.h | 1 +
|
||||
2 files changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||
@@ -1292,7 +1292,7 @@ static int mtk_start_dma(struct mtk_eth
|
||||
mtk_w32(eth,
|
||||
MTK_TX_WB_DDONE | MTK_RX_DMA_EN | MTK_TX_DMA_EN |
|
||||
MTK_RX_2B_OFFSET | MTK_DMA_SIZE_16DWORDS |
|
||||
- MTK_RX_BT_32DWORDS,
|
||||
+ MTK_RX_BT_32DWORDS | MTK_NDP_CO_PRO,
|
||||
MTK_QDMA_GLO_CFG);
|
||||
|
||||
return 0;
|
||||
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h
|
||||
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
|
||||
@@ -91,6 +91,7 @@
|
||||
#define MTK_QDMA_GLO_CFG 0x1A04
|
||||
#define MTK_RX_2B_OFFSET BIT(31)
|
||||
#define MTK_RX_BT_32DWORDS (3 << 11)
|
||||
+#define MTK_NDP_CO_PRO BIT(10)
|
||||
#define MTK_TX_WB_DDONE BIT(6)
|
||||
#define MTK_DMA_SIZE_16DWORDS (2 << 4)
|
||||
#define MTK_RX_DMA_BUSY BIT(3)
|
|
@ -1,26 +0,0 @@
|
|||
From f9a08e142fd87c72a7803203ce4ecc94806046ca Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <john@phrozen.org>
|
||||
Date: Tue, 3 May 2016 03:14:07 +0200
|
||||
Subject: [PATCH 087/102] net-next: mediatek: disable all interrupts during
|
||||
probe
|
||||
|
||||
The current code only disables those IRQs that we will later use. To
|
||||
ensure that we have a predefined state, we really want to disable all IRQs.
|
||||
Change the code to disable all IRQs to achieve this.
|
||||
|
||||
Signed-off-by: John Crispin <john@phrozen.org>
|
||||
---
|
||||
drivers/net/ethernet/mediatek/mtk_eth_soc.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||
@@ -1406,7 +1406,7 @@ static int __init mtk_hw_init(struct mtk
|
||||
|
||||
/* disable delay and normal interrupt */
|
||||
mtk_w32(eth, 0, MTK_QDMA_DELAY_INT);
|
||||
- mtk_irq_disable(eth, MTK_TX_DONE_INT | MTK_RX_DONE_INT);
|
||||
+ mtk_irq_disable(eth, ~0);
|
||||
mtk_w32(eth, RST_GL_PSE, MTK_RST_GL);
|
||||
mtk_w32(eth, 0, MTK_RST_GL);
|
||||
|
|
@ -1,30 +0,0 @@
|
|||
From 34ea0f209e0759158e363039852a04b1facc3acd Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <john@phrozen.org>
|
||||
Date: Tue, 3 May 2016 02:55:27 +0200
|
||||
Subject: [PATCH 088/102] net-next: mediatek: fix threshold value
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
The logic to calculate the threshold value for stopping the TX queue is
|
||||
bad. Currently it will always use 1/2 of the rings size, which is way too
|
||||
much. Set the threshold to MAX_SKB_FRAGS. This makes sure that the queue
|
||||
is stopped when there is not enough room to accept an additional segment.
|
||||
|
||||
Signed-off-by: John Crispin <john@phrozen.org>
|
||||
---
|
||||
drivers/net/ethernet/mediatek/mtk_eth_soc.c | 3 +--
|
||||
1 file changed, 1 insertion(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||
@@ -1043,8 +1043,7 @@ static int mtk_tx_alloc(struct mtk_eth *
|
||||
atomic_set(&ring->free_count, MTK_DMA_SIZE - 2);
|
||||
ring->next_free = &ring->dma[0];
|
||||
ring->last_free = &ring->dma[MTK_DMA_SIZE - 2];
|
||||
- ring->thresh = max((unsigned long)MTK_DMA_SIZE >> 2,
|
||||
- MAX_SKB_FRAGS);
|
||||
+ ring->thresh = MAX_SKB_FRAGS;
|
||||
|
||||
/* make sure that all changes to the dma ring are flushed before we
|
||||
* continue
|
|
@ -1,26 +0,0 @@
|
|||
From 2cbf3f95a49925317ef4138ceaf7f7f30f353f0f Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <john@phrozen.org>
|
||||
Date: Tue, 3 May 2016 03:17:53 +0200
|
||||
Subject: [PATCH 089/102] net-next: mediatek: increase watchdog_timeo
|
||||
|
||||
During stress testing, after reducing the threshold value, we have seen
|
||||
TX timeouts that were caused by the watchdog_timeo value being too low.
|
||||
Increase the value to 5 * HZ which is a value commonly used by many other
|
||||
drivers.
|
||||
|
||||
Signed-off-by: John Crispin <john@phrozen.org>
|
||||
---
|
||||
drivers/net/ethernet/mediatek/mtk_eth_soc.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||
@@ -1720,7 +1720,7 @@ static int mtk_add_mac(struct mtk_eth *e
|
||||
mac->hw_stats->reg_offset = id * MTK_STAT_OFFSET;
|
||||
|
||||
SET_NETDEV_DEV(eth->netdev[id], eth->dev);
|
||||
- eth->netdev[id]->watchdog_timeo = HZ;
|
||||
+ eth->netdev[id]->watchdog_timeo = 5 * HZ;
|
||||
eth->netdev[id]->netdev_ops = &mtk_netdev_ops;
|
||||
eth->netdev[id]->base_addr = (unsigned long)eth->base;
|
||||
eth->netdev[id]->vlan_features = MTK_HW_FEATURES &
|
|
@ -1,36 +0,0 @@
|
|||
From 94425de9ede5ef0eafbfced65140c30e7c0b6c0d Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <john@phrozen.org>
|
||||
Date: Tue, 3 May 2016 03:01:13 +0200
|
||||
Subject: [PATCH 090/102] net-next: mediatek: fix off by one in the TX ring
|
||||
allocation
|
||||
|
||||
The TX ring setup has an off by one error causing it to not utilise all
|
||||
descriptors. This has the side effect that we need to reset the next
|
||||
pointer at runtime to make it work. Fix the off by one and remove the
|
||||
code fixing the ring at runtime.
|
||||
|
||||
Signed-off-by: Sean Wang <keyhaede@gmail.com>
|
||||
Signed-off-by: John Crispin <john@phrozen.org>
|
||||
---
|
||||
drivers/net/ethernet/mediatek/mtk_eth_soc.c | 3 +--
|
||||
1 file changed, 1 insertion(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||
@@ -934,7 +934,6 @@ static int mtk_poll_tx(struct mtk_eth *e
|
||||
}
|
||||
mtk_tx_unmap(eth->dev, tx_buf);
|
||||
|
||||
- ring->last_free->txd2 = next_cpu;
|
||||
ring->last_free = desc;
|
||||
atomic_inc(&ring->free_count);
|
||||
|
||||
@@ -1042,7 +1041,7 @@ static int mtk_tx_alloc(struct mtk_eth *
|
||||
|
||||
atomic_set(&ring->free_count, MTK_DMA_SIZE - 2);
|
||||
ring->next_free = &ring->dma[0];
|
||||
- ring->last_free = &ring->dma[MTK_DMA_SIZE - 2];
|
||||
+ ring->last_free = &ring->dma[MTK_DMA_SIZE - 1];
|
||||
ring->thresh = MAX_SKB_FRAGS;
|
||||
|
||||
/* make sure that all changes to the dma ring are flushed before we
|
|
@ -1,48 +0,0 @@
|
|||
From 1473b4cce85760c0202a08e6a48ec51867dc1bf7 Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <john@phrozen.org>
|
||||
Date: Tue, 3 May 2016 04:01:38 +0200
|
||||
Subject: [PATCH 091/102] net-next: mediatek: only wake the queue if it is
|
||||
stopped
|
||||
|
||||
The current code unconditionally wakes up the queue at the end of each
|
||||
tx_poll action. Change the code to only wake up the queues if any of
|
||||
them have actually been stopped before.
|
||||
|
||||
Signed-off-by: John Crispin <john@phrozen.org>
|
||||
---
|
||||
drivers/net/ethernet/mediatek/mtk_eth_soc.c | 17 ++++++++++++++++-
|
||||
1 file changed, 16 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||
@@ -716,6 +716,20 @@ static inline int mtk_cal_txd_req(struct
|
||||
return nfrags;
|
||||
}
|
||||
|
||||
+static int mtk_queue_stopped(struct mtk_eth *eth)
|
||||
+{
|
||||
+ int i;
|
||||
+
|
||||
+ for (i = 0; i < MTK_MAC_COUNT; i++) {
|
||||
+ if (!eth->netdev[i])
|
||||
+ continue;
|
||||
+ if (netif_queue_stopped(eth->netdev[i]))
|
||||
+ return 1;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static void mtk_wake_queue(struct mtk_eth *eth)
|
||||
{
|
||||
int i;
|
||||
@@ -960,7 +974,8 @@ static int mtk_poll_tx(struct mtk_eth *e
|
||||
if (!total)
|
||||
return 0;
|
||||
|
||||
- if (atomic_read(&ring->free_count) > ring->thresh)
|
||||
+ if (mtk_queue_stopped(eth) &&
|
||||
+ (atomic_read(&ring->free_count) > ring->thresh))
|
||||
mtk_wake_queue(eth);
|
||||
|
||||
return total;
|
|
@ -1,36 +0,0 @@
|
|||
From 538020913db04d199ce4d7e845444880e8200b5f Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <john@phrozen.org>
|
||||
Date: Tue, 3 May 2016 05:40:38 +0200
|
||||
Subject: [PATCH 092/102] net-next: mediatek: remove superfluous queue wake up
|
||||
call
|
||||
|
||||
The code checks if the queue should be stopped because we are below the
|
||||
threshold of free descriptors only to check if it should be started again.
|
||||
If we do end up in a state where we are at the threshold limit, it makes
|
||||
more sense to just stop the queue and wait for the next IRQ to trigger the
|
||||
TX housekeeping again. There is no rush in enqueuing the next packet, it
|
||||
needs to wait for all the others in the queue to be dispatched first
|
||||
anyway.
|
||||
|
||||
Signed-off-by: John Crispin <john@phrozen.org>
|
||||
---
|
||||
drivers/net/ethernet/mediatek/mtk_eth_soc.c | 7 ++-----
|
||||
1 file changed, 2 insertions(+), 5 deletions(-)
|
||||
|
||||
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||
@@ -795,12 +795,9 @@ static int mtk_start_xmit(struct sk_buff
|
||||
if (mtk_tx_map(skb, dev, tx_num, ring, gso) < 0)
|
||||
goto drop;
|
||||
|
||||
- if (unlikely(atomic_read(&ring->free_count) <= ring->thresh)) {
|
||||
+ if (unlikely(atomic_read(&ring->free_count) <= ring->thresh))
|
||||
mtk_stop_queue(eth);
|
||||
- if (unlikely(atomic_read(&ring->free_count) >
|
||||
- ring->thresh))
|
||||
- mtk_wake_queue(eth);
|
||||
- }
|
||||
+
|
||||
spin_unlock_irqrestore(ð->page_lock, flags);
|
||||
|
||||
return NETDEV_TX_OK;
|
|
@ -1,37 +0,0 @@
|
|||
From 31428406bf4b9da2a322ae947096414ff0489fb5 Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <john@phrozen.org>
|
||||
Date: Tue, 3 May 2016 03:57:01 +0200
|
||||
Subject: [PATCH 093/102] net-next: mediatek: remove superfluous register
|
||||
reads
|
||||
|
||||
The driver was originally written for MIPS based SoC. These required the
|
||||
IRQ mask register to be read after writing it to ensure that the content
|
||||
was actually applied. As this version only works on ARM based SoC, we can
|
||||
safely remove the 2 reads as they ware not required.
|
||||
|
||||
Signed-off-by: Sean Wang <keyhaede@gmail.com>
|
||||
Signed-off-by: John Crispin <john@phrozen.org>
|
||||
---
|
||||
drivers/net/ethernet/mediatek/mtk_eth_soc.c | 4 ----
|
||||
1 file changed, 4 deletions(-)
|
||||
|
||||
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||
@@ -335,8 +335,6 @@ static inline void mtk_irq_disable(struc
|
||||
|
||||
val = mtk_r32(eth, MTK_QDMA_INT_MASK);
|
||||
mtk_w32(eth, val & ~mask, MTK_QDMA_INT_MASK);
|
||||
- /* flush write */
|
||||
- mtk_r32(eth, MTK_QDMA_INT_MASK);
|
||||
}
|
||||
|
||||
static inline void mtk_irq_enable(struct mtk_eth *eth, u32 mask)
|
||||
@@ -345,8 +343,6 @@ static inline void mtk_irq_enable(struct
|
||||
|
||||
val = mtk_r32(eth, MTK_QDMA_INT_MASK);
|
||||
mtk_w32(eth, val | mask, MTK_QDMA_INT_MASK);
|
||||
- /* flush write */
|
||||
- mtk_r32(eth, MTK_QDMA_INT_MASK);
|
||||
}
|
||||
|
||||
static int mtk_set_mac_address(struct net_device *dev, void *p)
|
|
@ -1,82 +0,0 @@
|
|||
From 441d87495f33fd444a2b2a16f6df07892dac3f89 Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <john@phrozen.org>
|
||||
Date: Tue, 3 May 2016 04:12:35 +0200
|
||||
Subject: [PATCH 094/102] net-next: mediatek: don't use intermediate variables
|
||||
to store IRQ masks
|
||||
|
||||
The code currently uses variables to store and never modify the bit masks
|
||||
of interrupts. This is legacy code from an early version of the driver
|
||||
that supported MIPS based SoCs where the IRQ bits depended on the actual
|
||||
SoC. As the bits are the same for all ARM based SoC using this driver we
|
||||
can remove the intermediate variables.
|
||||
|
||||
Signed-off-by: John Crispin <john@phrozen.org>
|
||||
---
|
||||
drivers/net/ethernet/mediatek/mtk_eth_soc.c | 22 ++++++++++------------
|
||||
1 file changed, 10 insertions(+), 12 deletions(-)
|
||||
|
||||
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||
@@ -806,7 +806,7 @@ drop:
|
||||
}
|
||||
|
||||
static int mtk_poll_rx(struct napi_struct *napi, int budget,
|
||||
- struct mtk_eth *eth, u32 rx_intr)
|
||||
+ struct mtk_eth *eth)
|
||||
{
|
||||
struct mtk_rx_ring *ring = ð->rx_ring;
|
||||
int idx = ring->calc_idx;
|
||||
@@ -894,7 +894,7 @@ release_desc:
|
||||
}
|
||||
|
||||
if (done < budget)
|
||||
- mtk_w32(eth, rx_intr, MTK_QMTK_INT_STATUS);
|
||||
+ mtk_w32(eth, MTK_RX_DONE_INT, MTK_QMTK_INT_STATUS);
|
||||
|
||||
return done;
|
||||
}
|
||||
@@ -977,28 +977,26 @@ static int mtk_poll_tx(struct mtk_eth *e
|
||||
static int mtk_poll(struct napi_struct *napi, int budget)
|
||||
{
|
||||
struct mtk_eth *eth = container_of(napi, struct mtk_eth, rx_napi);
|
||||
- u32 status, status2, mask, tx_intr, rx_intr, status_intr;
|
||||
+ u32 status, status2, mask;
|
||||
int tx_done, rx_done;
|
||||
bool tx_again = false;
|
||||
|
||||
status = mtk_r32(eth, MTK_QMTK_INT_STATUS);
|
||||
status2 = mtk_r32(eth, MTK_INT_STATUS2);
|
||||
- tx_intr = MTK_TX_DONE_INT;
|
||||
- rx_intr = MTK_RX_DONE_INT;
|
||||
- status_intr = (MTK_GDM1_AF | MTK_GDM2_AF);
|
||||
tx_done = 0;
|
||||
rx_done = 0;
|
||||
tx_again = 0;
|
||||
|
||||
- if (status & tx_intr)
|
||||
+ if (status & MTK_TX_DONE_INT)
|
||||
tx_done = mtk_poll_tx(eth, budget, &tx_again);
|
||||
|
||||
- if (status & rx_intr)
|
||||
- rx_done = mtk_poll_rx(napi, budget, eth, rx_intr);
|
||||
+ if (status & MTK_RX_DONE_INT)
|
||||
+ rx_done = mtk_poll_rx(napi, budget, eth);
|
||||
|
||||
- if (unlikely(status2 & status_intr)) {
|
||||
+ if (unlikely(status2 & (MTK_GDM1_AF | MTK_GDM2_AF))) {
|
||||
mtk_stats_update(eth);
|
||||
- mtk_w32(eth, status_intr, MTK_INT_STATUS2);
|
||||
+ mtk_w32(eth, (MTK_GDM1_AF | MTK_GDM2_AF),
|
||||
+ MTK_INT_STATUS2);
|
||||
}
|
||||
|
||||
if (unlikely(netif_msg_intr(eth))) {
|
||||
@@ -1016,7 +1014,7 @@ static int mtk_poll(struct napi_struct *
|
||||
return budget;
|
||||
|
||||
napi_complete(napi);
|
||||
- mtk_irq_enable(eth, tx_intr | rx_intr);
|
||||
+ mtk_irq_enable(eth, MTK_RX_DONE_INT | MTK_RX_DONE_INT);
|
||||
|
||||
return rx_done;
|
||||
}
|
|
@ -1,64 +0,0 @@
|
|||
From dd08d1ac4cfc86fbea5ee207b9615922ede88ec6 Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <john@phrozen.org>
|
||||
Date: Tue, 17 May 2016 06:01:45 +0200
|
||||
Subject: [PATCH 095/102] net-next: mediatek: add IRQ locking
|
||||
|
||||
The code that enables and disables IRQs is missing proper locking. After
|
||||
adding the IRQ separation patch and routing the putting the RX and TX IRQs
|
||||
on different cores we experienced IRQ stalls. Fix this by adding proper
|
||||
locking. We use a dedicated lock to reduce the latency if the IRQ code.
|
||||
Otherwise it might wait for bottom code to finish before reenabling or
|
||||
disabling IRQs.
|
||||
|
||||
Signed-off-by: Sean Wang <keyhaede@gmail.com>
|
||||
Signed-off-by: John Crispin <john@phrozen.org>
|
||||
---
|
||||
drivers/net/ethernet/mediatek/mtk_eth_soc.c | 7 +++++++
|
||||
drivers/net/ethernet/mediatek/mtk_eth_soc.h | 1 +
|
||||
2 files changed, 8 insertions(+)
|
||||
|
||||
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||
@@ -331,18 +331,24 @@ static void mtk_mdio_cleanup(struct mtk_
|
||||
|
||||
static inline void mtk_irq_disable(struct mtk_eth *eth, u32 mask)
|
||||
{
|
||||
+ unsigned long flags;
|
||||
u32 val;
|
||||
|
||||
+ spin_lock_irqsave(ð->irq_lock, flags);
|
||||
val = mtk_r32(eth, MTK_QDMA_INT_MASK);
|
||||
mtk_w32(eth, val & ~mask, MTK_QDMA_INT_MASK);
|
||||
+ spin_unlock_irqrestore(ð->irq_lock, flags);
|
||||
}
|
||||
|
||||
static inline void mtk_irq_enable(struct mtk_eth *eth, u32 mask)
|
||||
{
|
||||
+ unsigned long flags;
|
||||
u32 val;
|
||||
|
||||
+ spin_lock_irqsave(ð->irq_lock, flags);
|
||||
val = mtk_r32(eth, MTK_QDMA_INT_MASK);
|
||||
mtk_w32(eth, val | mask, MTK_QDMA_INT_MASK);
|
||||
+ spin_unlock_irqrestore(ð->irq_lock, flags);
|
||||
}
|
||||
|
||||
static int mtk_set_mac_address(struct net_device *dev, void *p)
|
||||
@@ -1771,6 +1777,7 @@ static int mtk_probe(struct platform_dev
|
||||
return -EADDRNOTAVAIL;
|
||||
|
||||
spin_lock_init(ð->page_lock);
|
||||
+ spin_lock_init(ð->irq_lock);
|
||||
|
||||
eth->ethsys = syscon_regmap_lookup_by_phandle(pdev->dev.of_node,
|
||||
"mediatek,ethsys");
|
||||
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h
|
||||
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
|
||||
@@ -373,6 +373,7 @@ struct mtk_eth {
|
||||
void __iomem *base;
|
||||
struct reset_control *rstc;
|
||||
spinlock_t page_lock;
|
||||
+ spinlock_t irq_lock;
|
||||
struct net_device dummy_dev;
|
||||
struct net_device *netdev[MTK_MAX_DEVS];
|
||||
struct mtk_mac *mac[MTK_MAX_DEVS];
|
|
@ -1,361 +0,0 @@
|
|||
From 190df1a9dbf4d8809b7f991194ce60e47f2290a2 Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <john@phrozen.org>
|
||||
Date: Wed, 23 Mar 2016 18:31:48 +0100
|
||||
Subject: [PATCH 096/102] net-next: mediatek: add support for IRQ grouping
|
||||
|
||||
The ethernet core has 3 IRQs. using the IRQ grouping registers we are able
|
||||
to separate TX and RX IRQs, which allows us to service them on separate
|
||||
cores. This patch splits the irq handler into 2 separate functions, one for
|
||||
TX and another for RX. The TX housekeeping is split out into its own NAPI
|
||||
handler.
|
||||
|
||||
Signed-off-by: John Crispin <john@phrozen.org>
|
||||
---
|
||||
drivers/net/ethernet/mediatek/mtk_eth_soc.c | 156 +++++++++++++++++----------
|
||||
drivers/net/ethernet/mediatek/mtk_eth_soc.h | 15 ++-
|
||||
2 files changed, 111 insertions(+), 60 deletions(-)
|
||||
|
||||
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||
@@ -905,14 +905,13 @@ release_desc:
|
||||
return done;
|
||||
}
|
||||
|
||||
-static int mtk_poll_tx(struct mtk_eth *eth, int budget, bool *tx_again)
|
||||
+static int mtk_poll_tx(struct mtk_eth *eth, int budget)
|
||||
{
|
||||
struct mtk_tx_ring *ring = ð->tx_ring;
|
||||
struct mtk_tx_dma *desc;
|
||||
struct sk_buff *skb;
|
||||
struct mtk_tx_buf *tx_buf;
|
||||
- int total = 0, done = 0;
|
||||
- unsigned int bytes = 0;
|
||||
+ unsigned int bytes = 0, done = 0;
|
||||
u32 cpu, dma;
|
||||
static int condition;
|
||||
int i;
|
||||
@@ -964,63 +963,82 @@ static int mtk_poll_tx(struct mtk_eth *e
|
||||
netdev_completed_queue(eth->netdev[i], done, bytes);
|
||||
}
|
||||
|
||||
- /* read hw index again make sure no new tx packet */
|
||||
- if (cpu != dma || cpu != mtk_r32(eth, MTK_QTX_DRX_PTR))
|
||||
- *tx_again = true;
|
||||
- else
|
||||
- mtk_w32(eth, MTK_TX_DONE_INT, MTK_QMTK_INT_STATUS);
|
||||
-
|
||||
- if (!total)
|
||||
- return 0;
|
||||
-
|
||||
if (mtk_queue_stopped(eth) &&
|
||||
(atomic_read(&ring->free_count) > ring->thresh))
|
||||
mtk_wake_queue(eth);
|
||||
|
||||
- return total;
|
||||
+ return done;
|
||||
}
|
||||
|
||||
-static int mtk_poll(struct napi_struct *napi, int budget)
|
||||
+static void mtk_handle_status_irq(struct mtk_eth *eth)
|
||||
{
|
||||
- struct mtk_eth *eth = container_of(napi, struct mtk_eth, rx_napi);
|
||||
- u32 status, status2, mask;
|
||||
- int tx_done, rx_done;
|
||||
- bool tx_again = false;
|
||||
-
|
||||
- status = mtk_r32(eth, MTK_QMTK_INT_STATUS);
|
||||
- status2 = mtk_r32(eth, MTK_INT_STATUS2);
|
||||
- tx_done = 0;
|
||||
- rx_done = 0;
|
||||
- tx_again = 0;
|
||||
-
|
||||
- if (status & MTK_TX_DONE_INT)
|
||||
- tx_done = mtk_poll_tx(eth, budget, &tx_again);
|
||||
-
|
||||
- if (status & MTK_RX_DONE_INT)
|
||||
- rx_done = mtk_poll_rx(napi, budget, eth);
|
||||
+ u32 status2 = mtk_r32(eth, MTK_INT_STATUS2);
|
||||
|
||||
if (unlikely(status2 & (MTK_GDM1_AF | MTK_GDM2_AF))) {
|
||||
mtk_stats_update(eth);
|
||||
mtk_w32(eth, (MTK_GDM1_AF | MTK_GDM2_AF),
|
||||
MTK_INT_STATUS2);
|
||||
}
|
||||
+}
|
||||
+
|
||||
+static int mtk_napi_tx(struct napi_struct *napi, int budget)
|
||||
+{
|
||||
+ struct mtk_eth *eth = container_of(napi, struct mtk_eth, tx_napi);
|
||||
+ u32 status, mask;
|
||||
+ int tx_done = 0;
|
||||
+
|
||||
+ mtk_handle_status_irq(eth);
|
||||
+ mtk_w32(eth, MTK_TX_DONE_INT, MTK_QMTK_INT_STATUS);
|
||||
+ tx_done = mtk_poll_tx(eth, budget);
|
||||
|
||||
if (unlikely(netif_msg_intr(eth))) {
|
||||
+ status = mtk_r32(eth, MTK_QMTK_INT_STATUS);
|
||||
mask = mtk_r32(eth, MTK_QDMA_INT_MASK);
|
||||
- netdev_info(eth->netdev[0],
|
||||
- "done tx %d, rx %d, intr 0x%08x/0x%x\n",
|
||||
- tx_done, rx_done, status, mask);
|
||||
+ dev_info(eth->dev,
|
||||
+ "done tx %d, intr 0x%08x/0x%x\n",
|
||||
+ tx_done, status, mask);
|
||||
}
|
||||
|
||||
- if (tx_again || rx_done == budget)
|
||||
+ if (tx_done == budget)
|
||||
return budget;
|
||||
|
||||
status = mtk_r32(eth, MTK_QMTK_INT_STATUS);
|
||||
- if (status & (tx_intr | rx_intr))
|
||||
+ if (status & MTK_TX_DONE_INT)
|
||||
return budget;
|
||||
|
||||
napi_complete(napi);
|
||||
- mtk_irq_enable(eth, MTK_RX_DONE_INT | MTK_RX_DONE_INT);
|
||||
+ mtk_irq_enable(eth, MTK_TX_DONE_INT);
|
||||
+
|
||||
+ return tx_done;
|
||||
+}
|
||||
+
|
||||
+static int mtk_napi_rx(struct napi_struct *napi, int budget)
|
||||
+{
|
||||
+ struct mtk_eth *eth = container_of(napi, struct mtk_eth, rx_napi);
|
||||
+ u32 status, mask;
|
||||
+ int rx_done = 0;
|
||||
+
|
||||
+ mtk_handle_status_irq(eth);
|
||||
+ mtk_w32(eth, MTK_RX_DONE_INT, MTK_QMTK_INT_STATUS);
|
||||
+ rx_done = mtk_poll_rx(napi, budget, eth);
|
||||
+
|
||||
+ if (unlikely(netif_msg_intr(eth))) {
|
||||
+ status = mtk_r32(eth, MTK_QMTK_INT_STATUS);
|
||||
+ mask = mtk_r32(eth, MTK_QDMA_INT_MASK);
|
||||
+ dev_info(eth->dev,
|
||||
+ "done rx %d, intr 0x%08x/0x%x\n",
|
||||
+ rx_done, status, mask);
|
||||
+ }
|
||||
+
|
||||
+ if (rx_done == budget)
|
||||
+ return budget;
|
||||
+
|
||||
+ status = mtk_r32(eth, MTK_QMTK_INT_STATUS);
|
||||
+ if (status & MTK_RX_DONE_INT)
|
||||
+ return budget;
|
||||
+
|
||||
+ napi_complete(napi);
|
||||
+ mtk_irq_enable(eth, MTK_RX_DONE_INT);
|
||||
|
||||
return rx_done;
|
||||
}
|
||||
@@ -1256,22 +1274,26 @@ static void mtk_tx_timeout(struct net_de
|
||||
schedule_work(ð->pending_work);
|
||||
}
|
||||
|
||||
-static irqreturn_t mtk_handle_irq(int irq, void *_eth)
|
||||
+static irqreturn_t mtk_handle_irq_rx(int irq, void *_eth)
|
||||
{
|
||||
struct mtk_eth *eth = _eth;
|
||||
- u32 status;
|
||||
|
||||
- status = mtk_r32(eth, MTK_QMTK_INT_STATUS);
|
||||
- if (unlikely(!status))
|
||||
- return IRQ_NONE;
|
||||
+ if (likely(napi_schedule_prep(ð->rx_napi))) {
|
||||
+ __napi_schedule(ð->rx_napi);
|
||||
+ mtk_irq_disable(eth, MTK_RX_DONE_INT);
|
||||
+ }
|
||||
|
||||
- if (likely(status & (MTK_RX_DONE_INT | MTK_TX_DONE_INT))) {
|
||||
- if (likely(napi_schedule_prep(ð->rx_napi)))
|
||||
- __napi_schedule(ð->rx_napi);
|
||||
- } else {
|
||||
- mtk_w32(eth, status, MTK_QMTK_INT_STATUS);
|
||||
+ return IRQ_HANDLED;
|
||||
+}
|
||||
+
|
||||
+static irqreturn_t mtk_handle_irq_tx(int irq, void *_eth)
|
||||
+{
|
||||
+ struct mtk_eth *eth = _eth;
|
||||
+
|
||||
+ if (likely(napi_schedule_prep(ð->tx_napi))) {
|
||||
+ __napi_schedule(ð->tx_napi);
|
||||
+ mtk_irq_disable(eth, MTK_TX_DONE_INT);
|
||||
}
|
||||
- mtk_irq_disable(eth, (MTK_RX_DONE_INT | MTK_TX_DONE_INT));
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
@@ -1284,7 +1306,7 @@ static void mtk_poll_controller(struct n
|
||||
u32 int_mask = MTK_TX_DONE_INT | MTK_RX_DONE_INT;
|
||||
|
||||
mtk_irq_disable(eth, int_mask);
|
||||
- mtk_handle_irq(dev->irq, dev);
|
||||
+ mtk_handle_irq(dev->irq[0], dev);
|
||||
mtk_irq_enable(eth, int_mask);
|
||||
}
|
||||
#endif
|
||||
@@ -1320,6 +1342,7 @@ static int mtk_open(struct net_device *d
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
+ napi_enable(ð->tx_napi);
|
||||
napi_enable(ð->rx_napi);
|
||||
mtk_irq_enable(eth, MTK_TX_DONE_INT | MTK_RX_DONE_INT);
|
||||
}
|
||||
@@ -1368,6 +1391,7 @@ static int mtk_stop(struct net_device *d
|
||||
return 0;
|
||||
|
||||
mtk_irq_disable(eth, MTK_TX_DONE_INT | MTK_RX_DONE_INT);
|
||||
+ napi_disable(ð->tx_napi);
|
||||
napi_disable(ð->rx_napi);
|
||||
|
||||
mtk_stop_dma(eth, MTK_QDMA_GLO_CFG);
|
||||
@@ -1405,7 +1429,11 @@ static int __init mtk_hw_init(struct mtk
|
||||
/* Enable RX VLan Offloading */
|
||||
mtk_w32(eth, 1, MTK_CDMP_EG_CTRL);
|
||||
|
||||
- err = devm_request_irq(eth->dev, eth->irq, mtk_handle_irq, 0,
|
||||
+ err = devm_request_irq(eth->dev, eth->irq[1], mtk_handle_irq_tx, 0,
|
||||
+ dev_name(eth->dev), eth);
|
||||
+ if (err)
|
||||
+ return err;
|
||||
+ err = devm_request_irq(eth->dev, eth->irq[2], mtk_handle_irq_rx, 0,
|
||||
dev_name(eth->dev), eth);
|
||||
if (err)
|
||||
return err;
|
||||
@@ -1421,7 +1449,11 @@ static int __init mtk_hw_init(struct mtk
|
||||
mtk_w32(eth, 0, MTK_RST_GL);
|
||||
|
||||
/* FE int grouping */
|
||||
- mtk_w32(eth, 0, MTK_FE_INT_GRP);
|
||||
+ mtk_w32(eth, MTK_TX_DONE_INT, MTK_PDMA_INT_GRP1);
|
||||
+ mtk_w32(eth, MTK_RX_DONE_INT, MTK_PDMA_INT_GRP2);
|
||||
+ mtk_w32(eth, MTK_TX_DONE_INT, MTK_QDMA_INT_GRP1);
|
||||
+ mtk_w32(eth, MTK_RX_DONE_INT, MTK_QDMA_INT_GRP2);
|
||||
+ mtk_w32(eth, 0x21021000, MTK_FE_INT_GRP);
|
||||
|
||||
for (i = 0; i < 2; i++) {
|
||||
u32 val = mtk_r32(eth, MTK_GDMA_FWD_CFG(i));
|
||||
@@ -1469,7 +1501,9 @@ static void mtk_uninit(struct net_device
|
||||
phy_disconnect(mac->phy_dev);
|
||||
mtk_mdio_cleanup(eth);
|
||||
mtk_irq_disable(eth, ~0);
|
||||
- free_irq(dev->irq, dev);
|
||||
+ free_irq(eth->irq[0], dev);
|
||||
+ free_irq(eth->irq[1], dev);
|
||||
+ free_irq(eth->irq[2], dev);
|
||||
}
|
||||
|
||||
static int mtk_do_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
|
||||
@@ -1744,10 +1778,10 @@ static int mtk_add_mac(struct mtk_eth *e
|
||||
dev_err(eth->dev, "error bringing up device\n");
|
||||
goto free_netdev;
|
||||
}
|
||||
- eth->netdev[id]->irq = eth->irq;
|
||||
+ eth->netdev[id]->irq = eth->irq[0];
|
||||
netif_info(eth, probe, eth->netdev[id],
|
||||
"mediatek frame engine at 0x%08lx, irq %d\n",
|
||||
- eth->netdev[id]->base_addr, eth->netdev[id]->irq);
|
||||
+ eth->netdev[id]->base_addr, eth->irq[0]);
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -1764,6 +1798,7 @@ static int mtk_probe(struct platform_dev
|
||||
struct mtk_soc_data *soc;
|
||||
struct mtk_eth *eth;
|
||||
int err;
|
||||
+ int i;
|
||||
|
||||
match = of_match_device(of_mtk_match, &pdev->dev);
|
||||
soc = (struct mtk_soc_data *)match->data;
|
||||
@@ -1799,10 +1834,12 @@ static int mtk_probe(struct platform_dev
|
||||
return PTR_ERR(eth->rstc);
|
||||
}
|
||||
|
||||
- eth->irq = platform_get_irq(pdev, 0);
|
||||
- if (eth->irq < 0) {
|
||||
- dev_err(&pdev->dev, "no IRQ resource found\n");
|
||||
- return -ENXIO;
|
||||
+ for (i = 0; i < 3; i++) {
|
||||
+ eth->irq[i] = platform_get_irq(pdev, i);
|
||||
+ if (eth->irq[i] < 0) {
|
||||
+ dev_err(&pdev->dev, "no IRQ%d resource found\n", i);
|
||||
+ return -ENXIO;
|
||||
+ }
|
||||
}
|
||||
|
||||
eth->clk_ethif = devm_clk_get(&pdev->dev, "ethif");
|
||||
@@ -1843,7 +1880,9 @@ static int mtk_probe(struct platform_dev
|
||||
* for NAPI to work
|
||||
*/
|
||||
init_dummy_netdev(ð->dummy_dev);
|
||||
- netif_napi_add(ð->dummy_dev, ð->rx_napi, mtk_poll,
|
||||
+ netif_napi_add(ð->dummy_dev, ð->tx_napi, mtk_napi_tx,
|
||||
+ MTK_NAPI_WEIGHT);
|
||||
+ netif_napi_add(ð->dummy_dev, ð->rx_napi, mtk_napi_rx,
|
||||
MTK_NAPI_WEIGHT);
|
||||
|
||||
platform_set_drvdata(pdev, eth);
|
||||
@@ -1864,6 +1903,7 @@ static int mtk_remove(struct platform_de
|
||||
clk_disable_unprepare(eth->clk_gp1);
|
||||
clk_disable_unprepare(eth->clk_gp2);
|
||||
|
||||
+ netif_napi_del(ð->tx_napi);
|
||||
netif_napi_del(ð->rx_napi);
|
||||
mtk_cleanup(eth);
|
||||
platform_set_drvdata(pdev, NULL);
|
||||
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h
|
||||
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
|
||||
@@ -68,6 +68,10 @@
|
||||
/* Unicast Filter MAC Address Register - High */
|
||||
#define MTK_GDMA_MAC_ADRH(x) (0x50C + (x * 0x1000))
|
||||
|
||||
+/* PDMA Interrupt grouping registers */
|
||||
+#define MTK_PDMA_INT_GRP1 0xa50
|
||||
+#define MTK_PDMA_INT_GRP2 0xa54
|
||||
+
|
||||
/* QDMA TX Queue Configuration Registers */
|
||||
#define MTK_QTX_CFG(x) (0x1800 + (x * 0x10))
|
||||
#define QDMA_RES_THRES 4
|
||||
@@ -125,6 +129,11 @@
|
||||
#define MTK_TX_DONE_INT (MTK_TX_DONE_INT0 | MTK_TX_DONE_INT1 | \
|
||||
MTK_TX_DONE_INT2 | MTK_TX_DONE_INT3)
|
||||
|
||||
+/* QDMA Interrupt grouping registers */
|
||||
+#define MTK_QDMA_INT_GRP1 0x1a20
|
||||
+#define MTK_QDMA_INT_GRP2 0x1a24
|
||||
+#define MTK_RLS_DONE_INT BIT(0)
|
||||
+
|
||||
/* QDMA Interrupt Status Register */
|
||||
#define MTK_QDMA_INT_MASK 0x1A1C
|
||||
|
||||
@@ -356,7 +365,8 @@ struct mtk_rx_ring {
|
||||
* @dma_refcnt: track how many netdevs are using the DMA engine
|
||||
* @tx_ring: Pointer to the memore holding info about the TX ring
|
||||
* @rx_ring: Pointer to the memore holding info about the RX ring
|
||||
- * @rx_napi: The NAPI struct
|
||||
+ * @tx_napi: The TX NAPI struct
|
||||
+ * @rx_napi: The RX NAPI struct
|
||||
* @scratch_ring: Newer SoCs need memory for a second HW managed TX ring
|
||||
* @phy_scratch_ring: physical address of scratch_ring
|
||||
* @scratch_head: The scratch memory that scratch_ring points to.
|
||||
@@ -377,7 +387,7 @@ struct mtk_eth {
|
||||
struct net_device dummy_dev;
|
||||
struct net_device *netdev[MTK_MAX_DEVS];
|
||||
struct mtk_mac *mac[MTK_MAX_DEVS];
|
||||
- int irq;
|
||||
+ int irq[3];
|
||||
u32 msg_enable;
|
||||
unsigned long sysclk;
|
||||
struct regmap *ethsys;
|
||||
@@ -385,6 +395,7 @@ struct mtk_eth {
|
||||
atomic_t dma_refcnt;
|
||||
struct mtk_tx_ring tx_ring;
|
||||
struct mtk_rx_ring rx_ring;
|
||||
+ struct napi_struct tx_napi;
|
||||
struct napi_struct rx_napi;
|
||||
struct mtk_tx_dma *scratch_ring;
|
||||
dma_addr_t phy_scratch_ring;
|
|
@ -1,30 +0,0 @@
|
|||
From 7c955062aaa563b1894671af3ae250460b3fa82d Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <john@phrozen.org>
|
||||
Date: Thu, 5 May 2016 10:01:56 +0200
|
||||
Subject: [PATCH 097/102] net-next: mediatek: change my email address
|
||||
|
||||
The old address is no longer valid. Use the my new one instead.
|
||||
|
||||
Signed-off-by: John Crispin <john@phrozen.org>
|
||||
---
|
||||
drivers/net/ethernet/mediatek/mtk_eth_soc.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||
@@ -7,7 +7,7 @@
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
- * Copyright (C) 2009-2016 John Crispin <blogic@openwrt.org>
|
||||
+ * Copyright (C) 2009-2016 John Crispin <john@phrozen.org>
|
||||
* Copyright (C) 2009-2016 Felix Fietkau <nbd@nbd.name>
|
||||
* Copyright (C) 2013-2016 Michael Lee <igvtee@gmail.com>
|
||||
*/
|
||||
@@ -1929,5 +1929,5 @@ static struct platform_driver mtk_driver
|
||||
module_platform_driver(mtk_driver);
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
-MODULE_AUTHOR("John Crispin <blogic@openwrt.org>");
|
||||
+MODULE_AUTHOR("John Crispin <john@phrozen.org>");
|
||||
MODULE_DESCRIPTION("Ethernet driver for MediaTek SoC");
|
|
@ -1,57 +0,0 @@
|
|||
From cd1343c14328a5de1a58c47b81b8a2febb31d542 Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <john@phrozen.org>
|
||||
Date: Tue, 10 May 2016 11:16:30 +0200
|
||||
Subject: [PATCH 098/102] net-next: mediatek: only trigger the tx watchdog
|
||||
reset when all devices are stalled
|
||||
|
||||
Signed-off-by: Sean Wang <keyhaede@gmail.com>
|
||||
Signed-off-by: John Crispin <john@phrozen.org>
|
||||
---
|
||||
drivers/net/ethernet/mediatek/mtk_eth_soc.c | 14 ++++++++++++--
|
||||
drivers/net/ethernet/mediatek/mtk_eth_soc.h | 1 +
|
||||
2 files changed, 13 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||
@@ -1267,11 +1267,21 @@ static void mtk_tx_timeout(struct net_de
|
||||
{
|
||||
struct mtk_mac *mac = netdev_priv(dev);
|
||||
struct mtk_eth *eth = mac->hw;
|
||||
+ int i, reset = 0;
|
||||
|
||||
eth->netdev[mac->id]->stats.tx_errors++;
|
||||
netif_err(eth, tx_err, dev,
|
||||
"transmit timed out\n");
|
||||
- schedule_work(ð->pending_work);
|
||||
+
|
||||
+ for (i = 0; i < MTK_MAC_COUNT; i++) {
|
||||
+ if (!eth->netdev[i] ||
|
||||
+ time_after(jiffies, dev_trans_start(eth->netdev[i]) +
|
||||
+ MTK_WDT_TIMEOUT))
|
||||
+ reset++;
|
||||
+ }
|
||||
+
|
||||
+ if (reset == MTK_MAC_COUNT)
|
||||
+ schedule_work(ð->pending_work);
|
||||
}
|
||||
|
||||
static irqreturn_t mtk_handle_irq_rx(int irq, void *_eth)
|
||||
@@ -1765,7 +1775,7 @@ static int mtk_add_mac(struct mtk_eth *e
|
||||
mac->hw_stats->reg_offset = id * MTK_STAT_OFFSET;
|
||||
|
||||
SET_NETDEV_DEV(eth->netdev[id], eth->dev);
|
||||
- eth->netdev[id]->watchdog_timeo = 5 * HZ;
|
||||
+ eth->netdev[id]->watchdog_timeo = MTK_WDT_TIMEOUT;
|
||||
eth->netdev[id]->netdev_ops = &mtk_netdev_ops;
|
||||
eth->netdev[id]->base_addr = (unsigned long)eth->base;
|
||||
eth->netdev[id]->vlan_features = MTK_HW_FEATURES &
|
||||
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h
|
||||
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
|
||||
@@ -15,6 +15,7 @@
|
||||
#ifndef MTK_ETH_H
|
||||
#define MTK_ETH_H
|
||||
|
||||
+#define MTK_WDT_TIMEOUT (4 * HZ)
|
||||
#define MTK_QDMA_PAGE_SIZE 2048
|
||||
#define MTK_MAX_RX_LENGTH 1536
|
||||
#define MTK_TX_DMA_BUF_LEN 0x3fff
|
|
@ -1,23 +0,0 @@
|
|||
From 2023b1652745fec5e691a5c9a9742ba6dd45e466 Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <john@phrozen.org>
|
||||
Date: Wed, 4 May 2016 15:44:01 +0200
|
||||
Subject: [PATCH 099/102] MAINTAINERS: change my email address
|
||||
|
||||
The old address is no longer valid. Use the my new one instead.
|
||||
|
||||
Signed-off-by: John Crispin <john@phrozen.org>
|
||||
---
|
||||
MAINTAINERS | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/MAINTAINERS
|
||||
+++ b/MAINTAINERS
|
||||
@@ -6904,7 +6904,7 @@ F: include/uapi/linux/uvcvideo.h
|
||||
|
||||
MEDIATEK ETHERNET DRIVER
|
||||
M: Felix Fietkau <nbd@nbd.name>
|
||||
-M: John Crispin <blogic@openwrt.org>
|
||||
+M: John Crispin <john@phrozen.org>
|
||||
L: netdev@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/net/ethernet/mediatek/
|
|
@ -1,25 +0,0 @@
|
|||
From 69c89cb453c0beac5d8349108cee8f6806e5db19 Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <john@phrozen.org>
|
||||
Date: Tue, 17 May 2016 05:49:17 +0200
|
||||
Subject: [PATCH 100/102] MAINTAINERS: add Sean as mediatek ethernet
|
||||
maintainer
|
||||
|
||||
Sean has been busy doing most of the QA and stress testing of the driver.
|
||||
Add him to the list of maintainers.
|
||||
|
||||
Signed-off-by: Sean Wang <keyhaede@gmail.com>
|
||||
Signed-off-by: John Crispin <john@phrozen.org>
|
||||
---
|
||||
MAINTAINERS | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
--- a/MAINTAINERS
|
||||
+++ b/MAINTAINERS
|
||||
@@ -6905,6 +6905,7 @@ F: include/uapi/linux/uvcvideo.h
|
||||
MEDIATEK ETHERNET DRIVER
|
||||
M: Felix Fietkau <nbd@nbd.name>
|
||||
M: John Crispin <john@phrozen.org>
|
||||
+M: Sean Wang <keyhaede@gmail.com>
|
||||
L: netdev@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/net/ethernet/mediatek/
|
|
@ -1,46 +0,0 @@
|
|||
From c1ff5519a7fd849da5d169036d8175383f807962 Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <blogic@openwrt.org>
|
||||
Date: Mon, 11 Apr 2016 06:00:23 +0200
|
||||
Subject: [PATCH 102/102] net: mediatek: v4.4 backports
|
||||
|
||||
---
|
||||
drivers/net/ethernet/mediatek/mtk_eth_soc.c | 13 ++++++++-----
|
||||
1 file changed, 8 insertions(+), 5 deletions(-)
|
||||
|
||||
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||
@@ -217,7 +217,7 @@ static int mtk_phy_connect_node(struct m
|
||||
|
||||
dev_info(eth->dev,
|
||||
"connected mac %d to PHY at %s [uid=%08x, driver=%s]\n",
|
||||
- mac->id, phydev_name(phydev), phydev->phy_id,
|
||||
+ mac->id, dev_name(&phydev->dev), phydev->phy_id,
|
||||
phydev->drv->name);
|
||||
|
||||
mac->phy_dev = phydev;
|
||||
@@ -1396,6 +1396,7 @@ static int mtk_stop(struct net_device *d
|
||||
struct mtk_mac *mac = netdev_priv(dev);
|
||||
struct mtk_eth *eth = mac->hw;
|
||||
|
||||
+ netif_carrier_off(dev);
|
||||
netif_tx_disable(dev);
|
||||
phy_stop(mac->phy_dev);
|
||||
|
||||
@@ -1595,11 +1596,13 @@ static int mtk_set_settings(struct net_d
|
||||
{
|
||||
struct mtk_mac *mac = netdev_priv(dev);
|
||||
|
||||
- if (cmd->phy_address != mac->phy_dev->mdio.addr) {
|
||||
- mac->phy_dev = mdiobus_get_phy(mac->hw->mii_bus,
|
||||
- cmd->phy_address);
|
||||
- if (!mac->phy_dev)
|
||||
+ if (cmd->phy_address != mac->phy_dev->addr) {
|
||||
+ if (mac->hw->mii_bus->phy_map[cmd->phy_address]) {
|
||||
+ mac->phy_dev =
|
||||
+ mac->hw->mii_bus->phy_map[cmd->phy_address];
|
||||
+ } else {
|
||||
return -ENODEV;
|
||||
+ }
|
||||
}
|
||||
|
||||
return phy_ethtool_sset(mac->phy_dev, cmd);
|
12
target/linux/mediatek/patches-4.9/0000-pinctrl-esw.patch
Normal file
12
target/linux/mediatek/patches-4.9/0000-pinctrl-esw.patch
Normal file
|
@ -0,0 +1,12 @@
|
|||
--- a/include/dt-bindings/pinctrl/mt7623-pinfunc.h
|
||||
+++ b/include/dt-bindings/pinctrl/mt7623-pinfunc.h
|
||||
@@ -505,6 +505,9 @@
|
||||
#define MT7623_PIN_272_G2_RXD3_FUNC_GPIO272 (MTK_PIN_NO(272) | 0)
|
||||
#define MT7623_PIN_272_G2_RXD3_FUNC_G2_RXD3 (MTK_PIN_NO(272) | 1)
|
||||
|
||||
+#define MT7623_PIN_273_ESW_INT_FUNC_GPIO273 (MTK_PIN_NO(273) | 0)
|
||||
+#define MT7623_PIN_273_ESW_INT_FUNC_ESW_INT (MTK_PIN_NO(273) | 1)
|
||||
+
|
||||
#define MT7623_PIN_274_G2_RXDV_FUNC_GPIO274 (MTK_PIN_NO(274) | 0)
|
||||
#define MT7623_PIN_274_G2_RXDV_FUNC_G2_RXDV (MTK_PIN_NO(274) | 1)
|
||||
|
|
@ -21,7 +21,7 @@ Signed-off-by: James Liao <jamesjj.liao@mediatek.com>
|
|||
|
||||
--- a/drivers/clk/mediatek/Kconfig
|
||||
+++ b/drivers/clk/mediatek/Kconfig
|
||||
@@ -6,6 +6,14 @@ config COMMON_CLK_MEDIATEK
|
||||
@@ -6,6 +6,14 @@
|
||||
---help---
|
||||
Mediatek SoCs' clock support.
|
||||
|
||||
|
@ -35,7 +35,7 @@ Signed-off-by: James Liao <jamesjj.liao@mediatek.com>
|
|||
+
|
||||
config COMMON_CLK_MT8135
|
||||
bool "Clock driver for Mediatek MT8135"
|
||||
depends on COMMON_CLK
|
||||
depends on ARCH_MEDIATEK || COMPILE_TEST
|
||||
--- a/drivers/clk/mediatek/Makefile
|
||||
+++ b/drivers/clk/mediatek/Makefile
|
||||
@@ -1,4 +1,5 @@
|
||||
|
@ -46,13 +46,13 @@ Signed-off-by: James Liao <jamesjj.liao@mediatek.com>
|
|||
obj-$(CONFIG_COMMON_CLK_MT8173) += clk-mt8173.o
|
||||
--- a/drivers/clk/mediatek/clk-gate.c
|
||||
+++ b/drivers/clk/mediatek/clk-gate.c
|
||||
@@ -61,6 +61,26 @@ static void mtk_cg_clr_bit(struct clk_hw
|
||||
@@ -61,6 +61,26 @@
|
||||
regmap_write(cg->regmap, cg->clr_ofs, BIT(cg->bit));
|
||||
}
|
||||
|
||||
+static void mtk_cg_set_bit_no_setclr(struct clk_hw *hw)
|
||||
+{
|
||||
+ struct mtk_clk_gate *cg = to_clk_gate(hw);
|
||||
+ struct mtk_clk_gate *cg = to_mtk_clk_gate(hw);
|
||||
+ u32 val;
|
||||
+
|
||||
+ regmap_read(cg->regmap, cg->sta_ofs, &val);
|
||||
|
@ -62,7 +62,7 @@ Signed-off-by: James Liao <jamesjj.liao@mediatek.com>
|
|||
+
|
||||
+static void mtk_cg_clr_bit_no_setclr(struct clk_hw *hw)
|
||||
+{
|
||||
+ struct mtk_clk_gate *cg = to_clk_gate(hw);
|
||||
+ struct mtk_clk_gate *cg = to_mtk_clk_gate(hw);
|
||||
+ u32 val;
|
||||
+
|
||||
+ regmap_read(cg->regmap, cg->sta_ofs, &val);
|
||||
|
@ -73,7 +73,7 @@ Signed-off-by: James Liao <jamesjj.liao@mediatek.com>
|
|||
static int mtk_cg_enable(struct clk_hw *hw)
|
||||
{
|
||||
mtk_cg_clr_bit(hw);
|
||||
@@ -85,6 +105,30 @@ static void mtk_cg_disable_inv(struct cl
|
||||
@@ -85,6 +105,30 @@
|
||||
mtk_cg_clr_bit(hw);
|
||||
}
|
||||
|
||||
|
@ -104,7 +104,7 @@ Signed-off-by: James Liao <jamesjj.liao@mediatek.com>
|
|||
const struct clk_ops mtk_clk_gate_ops_setclr = {
|
||||
.is_enabled = mtk_cg_bit_is_cleared,
|
||||
.enable = mtk_cg_enable,
|
||||
@@ -97,6 +141,18 @@ const struct clk_ops mtk_clk_gate_ops_se
|
||||
@@ -97,6 +141,18 @@
|
||||
.disable = mtk_cg_disable_inv,
|
||||
};
|
||||
|
||||
|
@ -120,12 +120,12 @@ Signed-off-by: James Liao <jamesjj.liao@mediatek.com>
|
|||
+ .disable = mtk_cg_disable_inv_no_setclr,
|
||||
+};
|
||||
+
|
||||
struct clk * __init mtk_clk_register_gate(
|
||||
struct clk *mtk_clk_register_gate(
|
||||
const char *name,
|
||||
const char *parent_name,
|
||||
--- a/drivers/clk/mediatek/clk-gate.h
|
||||
+++ b/drivers/clk/mediatek/clk-gate.h
|
||||
@@ -36,6 +36,8 @@ static inline struct mtk_clk_gate *to_cl
|
||||
@@ -36,6 +36,8 @@
|
||||
|
||||
extern const struct clk_ops mtk_clk_gate_ops_setclr;
|
||||
extern const struct clk_ops mtk_clk_gate_ops_setclr_inv;
|
||||
|
@ -1349,7 +1349,7 @@ Signed-off-by: James Liao <jamesjj.liao@mediatek.com>
|
|||
+ mtk_apmixedsys_init);
|
||||
--- a/drivers/clk/mediatek/clk-mtk.c
|
||||
+++ b/drivers/clk/mediatek/clk-mtk.c
|
||||
@@ -242,3 +242,28 @@ void __init mtk_clk_register_composites(
|
||||
@@ -244,3 +244,28 @@
|
||||
clk_data->clks[mc->id] = clk;
|
||||
}
|
||||
}
|
||||
|
@ -1380,7 +1380,7 @@ Signed-off-by: James Liao <jamesjj.liao@mediatek.com>
|
|||
+}
|
||||
--- a/drivers/clk/mediatek/clk-mtk.h
|
||||
+++ b/drivers/clk/mediatek/clk-mtk.h
|
||||
@@ -110,7 +110,8 @@ struct mtk_composite {
|
||||
@@ -121,7 +121,8 @@
|
||||
.flags = CLK_SET_RATE_PARENT, \
|
||||
}
|
||||
|
||||
|
@ -1390,7 +1390,7 @@ Signed-off-by: James Liao <jamesjj.liao@mediatek.com>
|
|||
.id = _id, \
|
||||
.parent = _parent, \
|
||||
.name = _name, \
|
||||
@@ -145,8 +146,36 @@ struct mtk_gate {
|
||||
@@ -156,8 +157,36 @@
|
||||
const struct clk_ops *ops;
|
||||
};
|
||||
|
|
@ -16,9 +16,9 @@ Acked-by: Linus Walleij <linus.walleij@linaro.org>
|
|||
|
||||
--- a/arch/arm/mach-mediatek/Kconfig
|
||||
+++ b/arch/arm/mach-mediatek/Kconfig
|
||||
@@ -9,6 +9,10 @@ menuconfig ARCH_MEDIATEK
|
||||
|
||||
if ARCH_MEDIATEK
|
||||
@@ -14,6 +14,10 @@
|
||||
bool "MediaTek MT2701 SoCs support"
|
||||
default ARCH_MEDIATEK
|
||||
|
||||
+config MACH_MT2701
|
||||
+ bool "MediaTek MT2701 SoCs support"
|
|
@ -20,7 +20,7 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
|
|||
|
||||
--- a/drivers/clk/mediatek/clk-mt2701.c
|
||||
+++ b/drivers/clk/mediatek/clk-mt2701.c
|
||||
@@ -1000,6 +1000,8 @@ static void __init mtk_hifsys_init(struc
|
||||
@@ -1000,6 +1000,8 @@
|
||||
if (r)
|
||||
pr_err("%s(): could not register clock provider: %d\n",
|
||||
__func__, r);
|
||||
|
@ -29,19 +29,3 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
|
|||
}
|
||||
CLK_OF_DECLARE(mtk_hifsys, "mediatek,mt2701-hifsys", mtk_hifsys_init);
|
||||
|
||||
--- a/include/dt-bindings/reset-controller/mt2701-resets.h
|
||||
+++ b/include/dt-bindings/reset-controller/mt2701-resets.h
|
||||
@@ -71,4 +71,13 @@
|
||||
#define MT2701_TOPRGU_CONN_MCU_RST 12
|
||||
#define MT2701_TOPRGU_BDP_DISP_RST 13
|
||||
|
||||
+/* HIFSYS resets */
|
||||
+#define MT2701_HIFSYS_UHOST0_RST 3
|
||||
+#define MT2701_HIFSYS_UHOST1_RST 4
|
||||
+#define MT2701_HIFSYS_UPHY0_RST 21
|
||||
+#define MT2701_HIFSYS_UPHY1_RST 22
|
||||
+#define MT2701_HIFSYS_PCIE0_RST 24
|
||||
+#define MT2701_HIFSYS_PCIE1_RST 25
|
||||
+#define MT2701_HIFSYS_PCIE2_RST 26
|
||||
+
|
||||
#endif /* _DT_BINDINGS_RESET_CONTROLLER_MT2701 */
|
|
@ -19,7 +19,7 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
|
|||
|
||||
--- a/arch/arm/mach-mediatek/Kconfig
|
||||
+++ b/arch/arm/mach-mediatek/Kconfig
|
||||
@@ -24,6 +24,7 @@ config MACH_MT6592
|
||||
@@ -29,6 +29,7 @@
|
||||
config MACH_MT7623
|
||||
bool "MediaTek MT7623 SoCs support"
|
||||
default ARCH_MEDIATEK
|
||||
|
@ -29,9 +29,9 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
|
|||
bool "MediaTek MT8127 SoCs support"
|
||||
--- a/drivers/pci/host/Kconfig
|
||||
+++ b/drivers/pci/host/Kconfig
|
||||
@@ -173,4 +173,15 @@ config PCI_HISI
|
||||
help
|
||||
Say Y here if you want PCIe controller support on HiSilicon HIP05 SoC
|
||||
@@ -301,4 +301,15 @@
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called vmd.
|
||||
|
||||
+config PCIE_MTK
|
||||
+ bool "Mediatek PCIe Controller"
|
||||
|
@ -47,10 +47,10 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
|
|||
endmenu
|
||||
--- a/drivers/pci/host/Makefile
|
||||
+++ b/drivers/pci/host/Makefile
|
||||
@@ -20,3 +20,4 @@ obj-$(CONFIG_PCIE_IPROC_BCMA) += pcie-ip
|
||||
obj-$(CONFIG_PCIE_ALTERA) += pcie-altera.o
|
||||
obj-$(CONFIG_PCIE_ALTERA_MSI) += pcie-altera-msi.o
|
||||
obj-$(CONFIG_PCI_HISI) += pcie-hisi.o
|
||||
@@ -33,3 +33,4 @@
|
||||
obj-$(CONFIG_PCIE_ARTPEC6) += pcie-artpec6.o
|
||||
obj-$(CONFIG_PCIE_ROCKCHIP) += pcie-rockchip.o
|
||||
obj-$(CONFIG_VMD) += vmd.o
|
||||
+obj-$(CONFIG_PCIE_MTK) += pcie-mediatek.o
|
||||
--- /dev/null
|
||||
+++ b/drivers/pci/host/pcie-mediatek.c
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue