mirror of
https://github.com/coolsnowwolf/lede.git
synced 2025-04-16 04:13:31 +00:00
qualcommax: add ipq50xx target init support
This commit is contained in:
parent
c5a7f6cde1
commit
105f4fd96a
@ -6,7 +6,7 @@ BOARDNAME:=Qualcomm Atheros 802.11ax WiSoC-s
|
|||||||
FEATURES:=squashfs ramdisk fpu nand rtc emmc
|
FEATURES:=squashfs ramdisk fpu nand rtc emmc
|
||||||
KERNELNAME:=Image dtbs
|
KERNELNAME:=Image dtbs
|
||||||
CPU_TYPE:=cortex-a53
|
CPU_TYPE:=cortex-a53
|
||||||
SUBTARGETS:=ipq60xx ipq807x
|
SUBTARGETS:=ipq50xx ipq60xx ipq807x
|
||||||
|
|
||||||
KERNEL_PATCHVER:=6.1
|
KERNEL_PATCHVER:=6.1
|
||||||
|
|
||||||
|
582
target/linux/qualcommax/config-6.6
Normal file
582
target/linux/qualcommax/config-6.6
Normal file
@ -0,0 +1,582 @@
|
|||||||
|
CONFIG_64BIT=y
|
||||||
|
CONFIG_ARCH_BINFMT_ELF_EXTRA_PHDRS=y
|
||||||
|
CONFIG_ARCH_CORRECT_STACKTRACE_ON_KRETPROBE=y
|
||||||
|
CONFIG_ARCH_DEFAULT_KEXEC_IMAGE_VERIFY_SIG=y
|
||||||
|
CONFIG_ARCH_DMA_ADDR_T_64BIT=y
|
||||||
|
CONFIG_ARCH_FORCE_MAX_ORDER=10
|
||||||
|
CONFIG_ARCH_HIBERNATION_POSSIBLE=y
|
||||||
|
CONFIG_ARCH_KEEP_MEMBLOCK=y
|
||||||
|
CONFIG_ARCH_MHP_MEMMAP_ON_MEMORY_ENABLE=y
|
||||||
|
CONFIG_ARCH_MMAP_RND_BITS=18
|
||||||
|
CONFIG_ARCH_MMAP_RND_BITS_MAX=24
|
||||||
|
CONFIG_ARCH_MMAP_RND_BITS_MIN=18
|
||||||
|
CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MIN=11
|
||||||
|
CONFIG_ARCH_PROC_KCORE_TEXT=y
|
||||||
|
CONFIG_ARCH_QCOM=y
|
||||||
|
CONFIG_ARCH_SPARSEMEM_ENABLE=y
|
||||||
|
CONFIG_ARCH_STACKWALK=y
|
||||||
|
CONFIG_ARCH_SUSPEND_POSSIBLE=y
|
||||||
|
CONFIG_ARCH_WANTS_NO_INSTR=y
|
||||||
|
CONFIG_ARCH_WANTS_THP_SWAP=y
|
||||||
|
CONFIG_ARM64=y
|
||||||
|
CONFIG_ARM64_4K_PAGES=y
|
||||||
|
CONFIG_ARM64_ERRATUM_1165522=y
|
||||||
|
CONFIG_ARM64_ERRATUM_1286807=y
|
||||||
|
CONFIG_ARM64_ERRATUM_2051678=y
|
||||||
|
CONFIG_ARM64_ERRATUM_2054223=y
|
||||||
|
CONFIG_ARM64_ERRATUM_2067961=y
|
||||||
|
CONFIG_ARM64_ERRATUM_2077057=y
|
||||||
|
CONFIG_ARM64_ERRATUM_2658417=y
|
||||||
|
CONFIG_ARM64_LD_HAS_FIX_ERRATUM_843419=y
|
||||||
|
CONFIG_ARM64_PAGE_SHIFT=12
|
||||||
|
CONFIG_ARM64_PA_BITS=48
|
||||||
|
CONFIG_ARM64_PA_BITS_48=y
|
||||||
|
CONFIG_ARM64_PTR_AUTH=y
|
||||||
|
CONFIG_ARM64_PTR_AUTH_KERNEL=y
|
||||||
|
CONFIG_ARM64_SME=y
|
||||||
|
CONFIG_ARM64_SVE=y
|
||||||
|
CONFIG_ARM64_TAGGED_ADDR_ABI=y
|
||||||
|
CONFIG_ARM64_VA_BITS=39
|
||||||
|
CONFIG_ARM64_VA_BITS_39=y
|
||||||
|
CONFIG_ARM64_WORKAROUND_REPEAT_TLBI=y
|
||||||
|
CONFIG_ARM64_WORKAROUND_SPECULATIVE_AT=y
|
||||||
|
CONFIG_ARM64_WORKAROUND_TSB_FLUSH_FAILURE=y
|
||||||
|
CONFIG_ARM_AMBA=y
|
||||||
|
CONFIG_ARM_ARCH_TIMER=y
|
||||||
|
CONFIG_ARM_ARCH_TIMER_EVTSTREAM=y
|
||||||
|
CONFIG_ARM_GIC=y
|
||||||
|
CONFIG_ARM_GIC_V2M=y
|
||||||
|
CONFIG_ARM_GIC_V3=y
|
||||||
|
CONFIG_ARM_GIC_V3_ITS=y
|
||||||
|
CONFIG_ARM_GIC_V3_ITS_PCI=y
|
||||||
|
# CONFIG_ARM_MHU_V2 is not set
|
||||||
|
CONFIG_ARM_PSCI_CPUIDLE=y
|
||||||
|
CONFIG_ARM_PSCI_FW=y
|
||||||
|
# CONFIG_ARM_QCOM_CPUFREQ_HW is not set
|
||||||
|
CONFIG_ARM_QCOM_CPUFREQ_NVMEM=y
|
||||||
|
CONFIG_AT803X_PHY=y
|
||||||
|
CONFIG_AUDIT_ARCH_COMPAT_GENERIC=y
|
||||||
|
CONFIG_BLK_DEV_LOOP=y
|
||||||
|
CONFIG_BLK_DEV_SD=y
|
||||||
|
CONFIG_BLK_MQ_PCI=y
|
||||||
|
CONFIG_BLK_MQ_VIRTIO=y
|
||||||
|
CONFIG_BLK_PM=y
|
||||||
|
CONFIG_BUILTIN_RETURN_ADDRESS_STRIPS_PAC=y
|
||||||
|
CONFIG_CAVIUM_TX2_ERRATUM_219=y
|
||||||
|
CONFIG_CC_HAVE_SHADOW_CALL_STACK=y
|
||||||
|
CONFIG_CC_HAVE_STACKPROTECTOR_SYSREG=y
|
||||||
|
CONFIG_CC_IMPLICIT_FALLTHROUGH="-Wimplicit-fallthrough=5"
|
||||||
|
CONFIG_CC_NO_ARRAY_BOUNDS=y
|
||||||
|
CONFIG_CLONE_BACKWARDS=y
|
||||||
|
CONFIG_COMMON_CLK=y
|
||||||
|
CONFIG_COMMON_CLK_QCOM=y
|
||||||
|
CONFIG_COMPACT_UNEVICTABLE_DEFAULT=1
|
||||||
|
# CONFIG_COMPAT_32BIT_TIME is not set
|
||||||
|
CONFIG_CONTEXT_TRACKING=y
|
||||||
|
CONFIG_CONTEXT_TRACKING_IDLE=y
|
||||||
|
CONFIG_COREDUMP=y
|
||||||
|
CONFIG_CPUFREQ_DT=y
|
||||||
|
CONFIG_CPUFREQ_DT_PLATDEV=y
|
||||||
|
CONFIG_CPU_FREQ=y
|
||||||
|
# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set
|
||||||
|
CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL=y
|
||||||
|
CONFIG_CPU_FREQ_GOV_ATTR_SET=y
|
||||||
|
# CONFIG_CPU_FREQ_GOV_CONSERVATIVE is not set
|
||||||
|
# CONFIG_CPU_FREQ_GOV_ONDEMAND is not set
|
||||||
|
CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
|
||||||
|
# CONFIG_CPU_FREQ_GOV_POWERSAVE is not set
|
||||||
|
CONFIG_CPU_FREQ_GOV_SCHEDUTIL=y
|
||||||
|
# CONFIG_CPU_FREQ_GOV_USERSPACE is not set
|
||||||
|
CONFIG_CPU_FREQ_STAT=y
|
||||||
|
CONFIG_CPU_FREQ_THERMAL=y
|
||||||
|
CONFIG_CPU_IDLE=y
|
||||||
|
CONFIG_CPU_IDLE_GOV_MENU=y
|
||||||
|
CONFIG_CPU_IDLE_MULTIPLE_DRIVERS=y
|
||||||
|
CONFIG_CPU_LITTLE_ENDIAN=y
|
||||||
|
CONFIG_CPU_PM=y
|
||||||
|
CONFIG_CPU_RMAP=y
|
||||||
|
CONFIG_CPU_THERMAL=y
|
||||||
|
CONFIG_CRC16=y
|
||||||
|
CONFIG_CRC8=y
|
||||||
|
CONFIG_CRYPTO_AUTHENC=y
|
||||||
|
CONFIG_CRYPTO_CBC=y
|
||||||
|
CONFIG_CRYPTO_DEFLATE=y
|
||||||
|
CONFIG_CRYPTO_DEV_QCE=y
|
||||||
|
CONFIG_CRYPTO_DEV_QCE_AEAD=y
|
||||||
|
# CONFIG_CRYPTO_DEV_QCE_ENABLE_AEAD is not set
|
||||||
|
CONFIG_CRYPTO_DEV_QCE_ENABLE_ALL=y
|
||||||
|
# CONFIG_CRYPTO_DEV_QCE_ENABLE_SHA is not set
|
||||||
|
# CONFIG_CRYPTO_DEV_QCE_ENABLE_SKCIPHER is not set
|
||||||
|
CONFIG_CRYPTO_DEV_QCE_SHA=y
|
||||||
|
CONFIG_CRYPTO_DEV_QCE_SKCIPHER=y
|
||||||
|
CONFIG_CRYPTO_DEV_QCE_SW_MAX_LEN=512
|
||||||
|
CONFIG_CRYPTO_DEV_QCOM_RNG=y
|
||||||
|
CONFIG_CRYPTO_ECB=y
|
||||||
|
CONFIG_CRYPTO_HASH_INFO=y
|
||||||
|
CONFIG_CRYPTO_HW=y
|
||||||
|
CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y
|
||||||
|
CONFIG_CRYPTO_LIB_DES=y
|
||||||
|
CONFIG_CRYPTO_LIB_GF128MUL=y
|
||||||
|
CONFIG_CRYPTO_LIB_SHA1=y
|
||||||
|
CONFIG_CRYPTO_LIB_SHA256=y
|
||||||
|
CONFIG_CRYPTO_LIB_UTILS=y
|
||||||
|
CONFIG_CRYPTO_LZO=y
|
||||||
|
CONFIG_CRYPTO_RNG=y
|
||||||
|
CONFIG_CRYPTO_RNG2=y
|
||||||
|
CONFIG_CRYPTO_SHA1=y
|
||||||
|
CONFIG_CRYPTO_SHA256=y
|
||||||
|
CONFIG_CRYPTO_XTS=y
|
||||||
|
CONFIG_CRYPTO_ZSTD=y
|
||||||
|
CONFIG_DCACHE_WORD_ACCESS=y
|
||||||
|
CONFIG_DEBUG_BUGVERBOSE=y
|
||||||
|
CONFIG_DEBUG_INFO=y
|
||||||
|
CONFIG_DEV_COREDUMP=y
|
||||||
|
CONFIG_DMADEVICES=y
|
||||||
|
CONFIG_DMA_BOUNCE_UNALIGNED_KMALLOC=y
|
||||||
|
CONFIG_DMA_DIRECT_REMAP=y
|
||||||
|
CONFIG_DMA_ENGINE=y
|
||||||
|
CONFIG_DMA_OF=y
|
||||||
|
CONFIG_DMA_VIRTUAL_CHANNELS=y
|
||||||
|
CONFIG_DTC=y
|
||||||
|
CONFIG_DT_IDLE_STATES=y
|
||||||
|
CONFIG_EDAC_SUPPORT=y
|
||||||
|
CONFIG_EXCLUSIVE_SYSTEM_RAM=y
|
||||||
|
CONFIG_FIXED_PHY=y
|
||||||
|
CONFIG_FIX_EARLYCON_MEM=y
|
||||||
|
CONFIG_FRAME_POINTER=y
|
||||||
|
CONFIG_FS_IOMAP=y
|
||||||
|
CONFIG_FUJITSU_ERRATUM_010001=y
|
||||||
|
CONFIG_FUNCTION_ALIGNMENT=4
|
||||||
|
CONFIG_FUNCTION_ALIGNMENT_4B=y
|
||||||
|
CONFIG_FWNODE_MDIO=y
|
||||||
|
CONFIG_FW_LOADER_PAGED_BUF=y
|
||||||
|
CONFIG_FW_LOADER_SYSFS=y
|
||||||
|
CONFIG_GCC11_NO_ARRAY_BOUNDS=y
|
||||||
|
CONFIG_GCC_ASM_GOTO_OUTPUT_WORKAROUND=y
|
||||||
|
CONFIG_GCC_SUPPORTS_DYNAMIC_FTRACE_WITH_ARGS=y
|
||||||
|
CONFIG_GENERIC_ALLOCATOR=y
|
||||||
|
CONFIG_GENERIC_ARCH_TOPOLOGY=y
|
||||||
|
CONFIG_GENERIC_BUG=y
|
||||||
|
CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y
|
||||||
|
CONFIG_GENERIC_CLOCKEVENTS=y
|
||||||
|
CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y
|
||||||
|
CONFIG_GENERIC_CPU_AUTOPROBE=y
|
||||||
|
CONFIG_GENERIC_CPU_VULNERABILITIES=y
|
||||||
|
CONFIG_GENERIC_CSUM=y
|
||||||
|
CONFIG_GENERIC_EARLY_IOREMAP=y
|
||||||
|
CONFIG_GENERIC_GETTIMEOFDAY=y
|
||||||
|
CONFIG_GENERIC_IDLE_POLL_SETUP=y
|
||||||
|
CONFIG_GENERIC_IOREMAP=y
|
||||||
|
CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y
|
||||||
|
CONFIG_GENERIC_IRQ_SHOW=y
|
||||||
|
CONFIG_GENERIC_IRQ_SHOW_LEVEL=y
|
||||||
|
CONFIG_GENERIC_LIB_DEVMEM_IS_ALLOWED=y
|
||||||
|
CONFIG_GENERIC_MSI_IRQ=y
|
||||||
|
CONFIG_GENERIC_PCI_IOMAP=y
|
||||||
|
CONFIG_GENERIC_PHY=y
|
||||||
|
CONFIG_GENERIC_PINCONF=y
|
||||||
|
CONFIG_GENERIC_PINCTRL_GROUPS=y
|
||||||
|
CONFIG_GENERIC_PINMUX_FUNCTIONS=y
|
||||||
|
CONFIG_GENERIC_SCHED_CLOCK=y
|
||||||
|
CONFIG_GENERIC_SMP_IDLE_THREAD=y
|
||||||
|
CONFIG_GENERIC_STRNCPY_FROM_USER=y
|
||||||
|
CONFIG_GENERIC_STRNLEN_USER=y
|
||||||
|
CONFIG_GENERIC_TIME_VSYSCALL=y
|
||||||
|
CONFIG_GLOB=y
|
||||||
|
CONFIG_GPIOLIB_IRQCHIP=y
|
||||||
|
CONFIG_GPIO_CDEV=y
|
||||||
|
CONFIG_HARDIRQS_SW_RESEND=y
|
||||||
|
CONFIG_HAS_DMA=y
|
||||||
|
CONFIG_HAS_IOMEM=y
|
||||||
|
CONFIG_HAS_IOPORT=y
|
||||||
|
CONFIG_HAS_IOPORT_MAP=y
|
||||||
|
CONFIG_HWSPINLOCK=y
|
||||||
|
CONFIG_HWSPINLOCK_QCOM=y
|
||||||
|
CONFIG_I2C=y
|
||||||
|
CONFIG_I2C_BOARDINFO=y
|
||||||
|
CONFIG_I2C_CHARDEV=y
|
||||||
|
CONFIG_I2C_HELPER_AUTO=y
|
||||||
|
# CONFIG_I2C_QCOM_CCI is not set
|
||||||
|
CONFIG_I2C_QUP=y
|
||||||
|
CONFIG_IIO=y
|
||||||
|
CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000
|
||||||
|
CONFIG_INITRAMFS_SOURCE=""
|
||||||
|
CONFIG_IPQ_APSS_6018=y
|
||||||
|
CONFIG_IPQ_APSS_PLL=y
|
||||||
|
# CONFIG_IPQ_GCC_4019 is not set
|
||||||
|
# CONFIG_IPQ_GCC_5018 is not set
|
||||||
|
# CONFIG_IPQ_GCC_5332 is not set
|
||||||
|
# CONFIG_IPQ_GCC_6018 is not set
|
||||||
|
# CONFIG_IPQ_GCC_8074 is not set
|
||||||
|
# CONFIG_IPQ_GCC_9574 is not set
|
||||||
|
CONFIG_IRQCHIP=y
|
||||||
|
CONFIG_IRQ_DOMAIN=y
|
||||||
|
CONFIG_IRQ_DOMAIN_HIERARCHY=y
|
||||||
|
CONFIG_IRQ_FASTEOI_HIERARCHY_HANDLERS=y
|
||||||
|
CONFIG_IRQ_FORCED_THREADING=y
|
||||||
|
CONFIG_IRQ_WORK=y
|
||||||
|
# CONFIG_KPSS_XCC is not set
|
||||||
|
CONFIG_LEDS_TLC591XX=y
|
||||||
|
CONFIG_LIBFDT=y
|
||||||
|
CONFIG_LOCK_DEBUGGING_SUPPORT=y
|
||||||
|
CONFIG_LOCK_SPIN_ON_OWNER=y
|
||||||
|
CONFIG_LZO_COMPRESS=y
|
||||||
|
CONFIG_LZO_DECOMPRESS=y
|
||||||
|
CONFIG_MAILBOX=y
|
||||||
|
# CONFIG_MAILBOX_TEST is not set
|
||||||
|
CONFIG_MDIO_BUS=y
|
||||||
|
CONFIG_MDIO_DEVICE=y
|
||||||
|
CONFIG_MDIO_DEVRES=y
|
||||||
|
CONFIG_MDIO_IPQ4019=y
|
||||||
|
# CONFIG_MFD_QCOM_RPM is not set
|
||||||
|
CONFIG_MFD_SYSCON=y
|
||||||
|
CONFIG_MIGRATION=y
|
||||||
|
# CONFIG_MITIGATE_SPECTRE_BRANCH_HISTORY is not set
|
||||||
|
CONFIG_MMC=y
|
||||||
|
CONFIG_MMC_BLOCK=y
|
||||||
|
CONFIG_MMC_BLOCK_MINORS=32
|
||||||
|
CONFIG_MMC_CQHCI=y
|
||||||
|
CONFIG_MMC_SDHCI=y
|
||||||
|
CONFIG_MMC_SDHCI_IO_ACCESSORS=y
|
||||||
|
CONFIG_MMC_SDHCI_MSM=y
|
||||||
|
# CONFIG_MMC_SDHCI_PCI is not set
|
||||||
|
CONFIG_MMC_SDHCI_PLTFM=y
|
||||||
|
CONFIG_MMU_LAZY_TLB_REFCOUNT=y
|
||||||
|
CONFIG_MODULES_USE_ELF_RELA=y
|
||||||
|
# CONFIG_MSM_GCC_8916 is not set
|
||||||
|
# CONFIG_MSM_GCC_8917 is not set
|
||||||
|
# CONFIG_MSM_GCC_8939 is not set
|
||||||
|
# CONFIG_MSM_GCC_8976 is not set
|
||||||
|
# CONFIG_MSM_GCC_8994 is not set
|
||||||
|
# CONFIG_MSM_GCC_8996 is not set
|
||||||
|
# CONFIG_MSM_GCC_8998 is not set
|
||||||
|
# CONFIG_MSM_GPUCC_8998 is not set
|
||||||
|
# CONFIG_MSM_MMCC_8996 is not set
|
||||||
|
# CONFIG_MSM_MMCC_8998 is not set
|
||||||
|
CONFIG_MTD_NAND_CORE=y
|
||||||
|
CONFIG_MTD_NAND_ECC=y
|
||||||
|
CONFIG_MTD_NAND_ECC_SW_HAMMING=y
|
||||||
|
CONFIG_MTD_NAND_QCOM=y
|
||||||
|
CONFIG_MTD_QCOMSMEM_PARTS=y
|
||||||
|
CONFIG_MTD_RAW_NAND=y
|
||||||
|
CONFIG_MTD_SPI_NOR=y
|
||||||
|
CONFIG_MTD_UBI=y
|
||||||
|
CONFIG_MTD_UBI_BEB_LIMIT=20
|
||||||
|
CONFIG_MTD_UBI_BLOCK=y
|
||||||
|
CONFIG_MTD_UBI_WL_THRESHOLD=4096
|
||||||
|
CONFIG_MUTEX_SPIN_ON_OWNER=y
|
||||||
|
CONFIG_NEED_DMA_MAP_STATE=y
|
||||||
|
CONFIG_NEED_SG_DMA_LENGTH=y
|
||||||
|
CONFIG_NET_EGRESS=y
|
||||||
|
CONFIG_NET_FLOW_LIMIT=y
|
||||||
|
CONFIG_NET_INGRESS=y
|
||||||
|
CONFIG_NET_SELFTESTS=y
|
||||||
|
CONFIG_NET_SWITCHDEV=y
|
||||||
|
CONFIG_NET_XGRESS=y
|
||||||
|
CONFIG_NLS=y
|
||||||
|
CONFIG_NO_HZ_COMMON=y
|
||||||
|
CONFIG_NO_HZ_IDLE=y
|
||||||
|
CONFIG_NR_CPUS=4
|
||||||
|
CONFIG_NVIDIA_CARMEL_CNP_ERRATUM=y
|
||||||
|
CONFIG_NVMEM=y
|
||||||
|
CONFIG_NVMEM_LAYOUTS=y
|
||||||
|
CONFIG_NVMEM_QCOM_QFPROM=y
|
||||||
|
# CONFIG_NVMEM_QCOM_SEC_QFPROM is not set
|
||||||
|
CONFIG_NVMEM_SYSFS=y
|
||||||
|
CONFIG_NVMEM_U_BOOT_ENV=y
|
||||||
|
CONFIG_OF=y
|
||||||
|
CONFIG_OF_ADDRESS=y
|
||||||
|
CONFIG_OF_EARLY_FLATTREE=y
|
||||||
|
CONFIG_OF_FLATTREE=y
|
||||||
|
CONFIG_OF_GPIO=y
|
||||||
|
CONFIG_OF_IRQ=y
|
||||||
|
CONFIG_OF_KOBJ=y
|
||||||
|
CONFIG_OF_MDIO=y
|
||||||
|
CONFIG_PADATA=y
|
||||||
|
CONFIG_PAGE_POOL=y
|
||||||
|
CONFIG_PAGE_SIZE_LESS_THAN_256KB=y
|
||||||
|
CONFIG_PAGE_SIZE_LESS_THAN_64KB=y
|
||||||
|
CONFIG_PAHOLE_HAS_LANG_EXCLUDE=y
|
||||||
|
CONFIG_PARTITION_PERCPU=y
|
||||||
|
CONFIG_PCI=y
|
||||||
|
CONFIG_PCIEAER=y
|
||||||
|
CONFIG_PCIEASPM=y
|
||||||
|
CONFIG_PCIEASPM_DEFAULT=y
|
||||||
|
# CONFIG_PCIEASPM_PERFORMANCE is not set
|
||||||
|
# CONFIG_PCIEASPM_POWERSAVE is not set
|
||||||
|
# CONFIG_PCIEASPM_POWER_SUPERSAVE is not set
|
||||||
|
CONFIG_PCIEPORTBUS=y
|
||||||
|
CONFIG_PCIE_DW=y
|
||||||
|
CONFIG_PCIE_DW_HOST=y
|
||||||
|
CONFIG_PCIE_PME=y
|
||||||
|
CONFIG_PCIE_QCOM=y
|
||||||
|
CONFIG_PCI_DOMAINS=y
|
||||||
|
CONFIG_PCI_DOMAINS_GENERIC=y
|
||||||
|
CONFIG_PCI_MSI=y
|
||||||
|
CONFIG_PER_VMA_LOCK=y
|
||||||
|
CONFIG_PGTABLE_LEVELS=3
|
||||||
|
CONFIG_PHYLIB=y
|
||||||
|
CONFIG_PHYLIB_LEDS=y
|
||||||
|
CONFIG_PHYS_ADDR_T_64BIT=y
|
||||||
|
# CONFIG_PHY_QCOM_APQ8064_SATA is not set
|
||||||
|
# CONFIG_PHY_QCOM_EDP is not set
|
||||||
|
# CONFIG_PHY_QCOM_EUSB2_REPEATER is not set
|
||||||
|
# CONFIG_PHY_QCOM_IPQ4019_USB is not set
|
||||||
|
# CONFIG_PHY_QCOM_IPQ806X_SATA is not set
|
||||||
|
# CONFIG_PHY_QCOM_IPQ806X_USB is not set
|
||||||
|
# CONFIG_PHY_QCOM_M31_USB is not set
|
||||||
|
# CONFIG_PHY_QCOM_PCIE2 is not set
|
||||||
|
CONFIG_PHY_QCOM_QMP=y
|
||||||
|
CONFIG_PHY_QCOM_QMP_COMBO=y
|
||||||
|
CONFIG_PHY_QCOM_QMP_PCIE=y
|
||||||
|
CONFIG_PHY_QCOM_QMP_PCIE_8996=y
|
||||||
|
CONFIG_PHY_QCOM_QMP_UFS=y
|
||||||
|
CONFIG_PHY_QCOM_QMP_USB=y
|
||||||
|
# CONFIG_PHY_QCOM_QMP_USB_LEGACY is not set
|
||||||
|
CONFIG_PHY_QCOM_QUSB2=y
|
||||||
|
# CONFIG_PHY_QCOM_SGMII_ETH is not set
|
||||||
|
# CONFIG_PHY_QCOM_SNPS_EUSB2 is not set
|
||||||
|
# CONFIG_PHY_QCOM_USB_HS_28NM is not set
|
||||||
|
# CONFIG_PHY_QCOM_USB_SNPS_FEMTO_V2 is not set
|
||||||
|
# CONFIG_PHY_QCOM_USB_SS is not set
|
||||||
|
CONFIG_PINCTRL=y
|
||||||
|
# CONFIG_PINCTRL_IPQ5018 is not set
|
||||||
|
# CONFIG_PINCTRL_IPQ5332 is not set
|
||||||
|
# CONFIG_PINCTRL_IPQ6018 is not set
|
||||||
|
# CONFIG_PINCTRL_IPQ8074 is not set
|
||||||
|
# CONFIG_PINCTRL_IPQ9574 is not set
|
||||||
|
CONFIG_PINCTRL_MSM=y
|
||||||
|
# CONFIG_PINCTRL_MSM8916 is not set
|
||||||
|
# CONFIG_PINCTRL_MSM8976 is not set
|
||||||
|
# CONFIG_PINCTRL_MSM8994 is not set
|
||||||
|
# CONFIG_PINCTRL_MSM8996 is not set
|
||||||
|
# CONFIG_PINCTRL_MSM8998 is not set
|
||||||
|
# CONFIG_PINCTRL_QCM2290 is not set
|
||||||
|
# CONFIG_PINCTRL_QCOM_SSBI_PMIC is not set
|
||||||
|
# CONFIG_PINCTRL_QCS404 is not set
|
||||||
|
# CONFIG_PINCTRL_QDU1000 is not set
|
||||||
|
# CONFIG_PINCTRL_SA8775P is not set
|
||||||
|
# CONFIG_PINCTRL_SC7180 is not set
|
||||||
|
# CONFIG_PINCTRL_SC8280XP is not set
|
||||||
|
# CONFIG_PINCTRL_SDM660 is not set
|
||||||
|
# CONFIG_PINCTRL_SDM670 is not set
|
||||||
|
# CONFIG_PINCTRL_SDM845 is not set
|
||||||
|
# CONFIG_PINCTRL_SDX75 is not set
|
||||||
|
# CONFIG_PINCTRL_SM6350 is not set
|
||||||
|
# CONFIG_PINCTRL_SM6375 is not set
|
||||||
|
# CONFIG_PINCTRL_SM7150 is not set
|
||||||
|
# CONFIG_PINCTRL_SM8150 is not set
|
||||||
|
# CONFIG_PINCTRL_SM8250 is not set
|
||||||
|
# CONFIG_PINCTRL_SM8450 is not set
|
||||||
|
# CONFIG_PINCTRL_SM8550 is not set
|
||||||
|
CONFIG_PM=y
|
||||||
|
CONFIG_PM_CLK=y
|
||||||
|
CONFIG_PM_OPP=y
|
||||||
|
CONFIG_POSIX_CPU_TIMERS_TASK_WORK=y
|
||||||
|
CONFIG_POWER_RESET=y
|
||||||
|
# CONFIG_POWER_RESET_MSM is not set
|
||||||
|
CONFIG_POWER_SUPPLY=y
|
||||||
|
CONFIG_PREEMPT_NONE_BUILD=y
|
||||||
|
CONFIG_PRINTK_TIME=y
|
||||||
|
CONFIG_PTP_1588_CLOCK_OPTIONAL=y
|
||||||
|
CONFIG_QCA807X_PHY=y
|
||||||
|
CONFIG_QCA808X_PHY=y
|
||||||
|
# CONFIG_QCM_DISPCC_2290 is not set
|
||||||
|
# CONFIG_QCM_GCC_2290 is not set
|
||||||
|
# CONFIG_QCOM_A53PLL is not set
|
||||||
|
# CONFIG_QCOM_AOSS_QMP is not set
|
||||||
|
CONFIG_QCOM_APCS_IPC=y
|
||||||
|
# CONFIG_QCOM_APM is not set
|
||||||
|
# CONFIG_QCOM_APR is not set
|
||||||
|
CONFIG_QCOM_BAM_DMA=y
|
||||||
|
# CONFIG_QCOM_CLK_APCC_MSM8996 is not set
|
||||||
|
# CONFIG_QCOM_CLK_APCS_MSM8916 is not set
|
||||||
|
# CONFIG_QCOM_COMMAND_DB is not set
|
||||||
|
# CONFIG_QCOM_CPR is not set
|
||||||
|
# CONFIG_QCOM_EBI2 is not set
|
||||||
|
# CONFIG_QCOM_FASTRPC is not set
|
||||||
|
# CONFIG_QCOM_GENI_SE is not set
|
||||||
|
# CONFIG_QCOM_GSBI is not set
|
||||||
|
# CONFIG_QCOM_HFPLL is not set
|
||||||
|
# CONFIG_QCOM_ICC_BWMON is not set
|
||||||
|
# CONFIG_QCOM_IPCC is not set
|
||||||
|
# CONFIG_QCOM_LLCC is not set
|
||||||
|
CONFIG_QCOM_MDT_LOADER=y
|
||||||
|
# CONFIG_QCOM_MPM is not set
|
||||||
|
CONFIG_QCOM_NET_PHYLIB=y
|
||||||
|
# CONFIG_QCOM_OCMEM is not set
|
||||||
|
# CONFIG_QCOM_PDC is not set
|
||||||
|
CONFIG_QCOM_PIL_INFO=y
|
||||||
|
# CONFIG_QCOM_Q6V5_ADSP is not set
|
||||||
|
CONFIG_QCOM_Q6V5_COMMON=y
|
||||||
|
# CONFIG_QCOM_Q6V5_MSS is not set
|
||||||
|
# CONFIG_QCOM_Q6V5_PAS is not set
|
||||||
|
CONFIG_QCOM_Q6V5_WCSS=y
|
||||||
|
# CONFIG_QCOM_RAMP_CTRL is not set
|
||||||
|
# CONFIG_QCOM_RMTFS_MEM is not set
|
||||||
|
# CONFIG_QCOM_RPMH is not set
|
||||||
|
# CONFIG_QCOM_RPM_MASTER_STATS is not set
|
||||||
|
CONFIG_QCOM_RPROC_COMMON=y
|
||||||
|
CONFIG_QCOM_SCM=y
|
||||||
|
# CONFIG_QCOM_SCM_DOWNLOAD_MODE_DEFAULT is not set
|
||||||
|
# CONFIG_QCOM_SMD_RPM is not set
|
||||||
|
CONFIG_QCOM_SMEM=y
|
||||||
|
CONFIG_QCOM_SMEM_STATE=y
|
||||||
|
CONFIG_QCOM_SMP2P=y
|
||||||
|
# CONFIG_QCOM_SMSM is not set
|
||||||
|
CONFIG_QCOM_SOCINFO=y
|
||||||
|
# CONFIG_QCOM_SPM is not set
|
||||||
|
# CONFIG_QCOM_STATS is not set
|
||||||
|
# CONFIG_QCOM_SYSMON is not set
|
||||||
|
CONFIG_QCOM_TSENS=y
|
||||||
|
# CONFIG_QCOM_WCNSS_CTRL is not set
|
||||||
|
# CONFIG_QCOM_WCNSS_PIL is not set
|
||||||
|
CONFIG_QCOM_WDT=y
|
||||||
|
# CONFIG_QCS_GCC_404 is not set
|
||||||
|
# CONFIG_QCS_Q6SSTOP_404 is not set
|
||||||
|
# CONFIG_QCS_TURING_404 is not set
|
||||||
|
# CONFIG_QDU_GCC_1000 is not set
|
||||||
|
CONFIG_QUEUED_RWLOCKS=y
|
||||||
|
CONFIG_QUEUED_SPINLOCKS=y
|
||||||
|
CONFIG_RANDSTRUCT_NONE=y
|
||||||
|
CONFIG_RAS=y
|
||||||
|
CONFIG_RATIONAL=y
|
||||||
|
CONFIG_REGMAP=y
|
||||||
|
CONFIG_REGMAP_I2C=y
|
||||||
|
CONFIG_REGMAP_MMIO=y
|
||||||
|
CONFIG_REGULATOR=y
|
||||||
|
# CONFIG_REGULATOR_CPR3 is not set
|
||||||
|
CONFIG_REGULATOR_FIXED_VOLTAGE=y
|
||||||
|
# CONFIG_REGULATOR_QCOM_REFGEN is not set
|
||||||
|
# CONFIG_REGULATOR_VQMMC_IPQ4019 is not set
|
||||||
|
CONFIG_RELOCATABLE=y
|
||||||
|
CONFIG_REMOTEPROC=y
|
||||||
|
CONFIG_REMOTEPROC_CDEV=y
|
||||||
|
CONFIG_RESET_CONTROLLER=y
|
||||||
|
# CONFIG_RESET_QCOM_AOSS is not set
|
||||||
|
# CONFIG_RESET_QCOM_PDC is not set
|
||||||
|
CONFIG_RFS_ACCEL=y
|
||||||
|
CONFIG_RODATA_FULL_DEFAULT_ENABLED=y
|
||||||
|
CONFIG_RPMSG=y
|
||||||
|
CONFIG_RPMSG_CHAR=y
|
||||||
|
# CONFIG_RPMSG_CTRL is not set
|
||||||
|
# CONFIG_RPMSG_NS is not set
|
||||||
|
CONFIG_RPMSG_QCOM_GLINK=y
|
||||||
|
CONFIG_RPMSG_QCOM_GLINK_RPM=y
|
||||||
|
CONFIG_RPMSG_QCOM_GLINK_SMEM=y
|
||||||
|
CONFIG_RPMSG_QCOM_SMD=y
|
||||||
|
# CONFIG_RPMSG_TTY is not set
|
||||||
|
CONFIG_RPS=y
|
||||||
|
CONFIG_RTC_CLASS=y
|
||||||
|
CONFIG_RTC_I2C_AND_SPI=y
|
||||||
|
CONFIG_RWSEM_SPIN_ON_OWNER=y
|
||||||
|
# CONFIG_SA_GCC_8775P is not set
|
||||||
|
# CONFIG_SA_GPUCC_8775P is not set
|
||||||
|
# CONFIG_SCHED_CORE is not set
|
||||||
|
CONFIG_SCHED_MC=y
|
||||||
|
CONFIG_SCHED_SMT=y
|
||||||
|
CONFIG_SCHED_THERMAL_PRESSURE=y
|
||||||
|
CONFIG_SCSI=y
|
||||||
|
CONFIG_SCSI_COMMON=y
|
||||||
|
# CONFIG_SCSI_LOWLEVEL is not set
|
||||||
|
# CONFIG_SCSI_PROC_FS is not set
|
||||||
|
# CONFIG_SC_CAMCC_7280 is not set
|
||||||
|
# CONFIG_SC_DISPCC_7180 is not set
|
||||||
|
# CONFIG_SC_DISPCC_8280XP is not set
|
||||||
|
# CONFIG_SC_GCC_7180 is not set
|
||||||
|
# CONFIG_SC_GCC_8280XP is not set
|
||||||
|
# CONFIG_SC_GPUCC_7180 is not set
|
||||||
|
# CONFIG_SC_LPASSCC_7280 is not set
|
||||||
|
# CONFIG_SC_LPASSCC_8280XP is not set
|
||||||
|
# CONFIG_SC_LPASS_CORECC_7180 is not set
|
||||||
|
# CONFIG_SC_LPASS_CORECC_7280 is not set
|
||||||
|
# CONFIG_SC_MSS_7180 is not set
|
||||||
|
# CONFIG_SC_VIDEOCC_7180 is not set
|
||||||
|
# CONFIG_SDM_CAMCC_845 is not set
|
||||||
|
# CONFIG_SDM_DISPCC_845 is not set
|
||||||
|
# CONFIG_SDM_GCC_660 is not set
|
||||||
|
# CONFIG_SDM_GCC_845 is not set
|
||||||
|
# CONFIG_SDM_GPUCC_845 is not set
|
||||||
|
# CONFIG_SDM_LPASSCC_845 is not set
|
||||||
|
# CONFIG_SDM_VIDEOCC_845 is not set
|
||||||
|
# CONFIG_SDX_GCC_75 is not set
|
||||||
|
CONFIG_SERIAL_8250_FSL=y
|
||||||
|
CONFIG_SERIAL_MCTRL_GPIO=y
|
||||||
|
CONFIG_SERIAL_MSM=y
|
||||||
|
CONFIG_SERIAL_MSM_CONSOLE=y
|
||||||
|
CONFIG_SGL_ALLOC=y
|
||||||
|
CONFIG_SG_POOL=y
|
||||||
|
CONFIG_SMP=y
|
||||||
|
# CONFIG_SM_CAMCC_6350 is not set
|
||||||
|
# CONFIG_SM_CAMCC_8450 is not set
|
||||||
|
# CONFIG_SM_GCC_7150 is not set
|
||||||
|
# CONFIG_SM_GCC_8150 is not set
|
||||||
|
# CONFIG_SM_GCC_8250 is not set
|
||||||
|
# CONFIG_SM_GCC_8450 is not set
|
||||||
|
# CONFIG_SM_GCC_8550 is not set
|
||||||
|
# CONFIG_SM_GPUCC_6115 is not set
|
||||||
|
# CONFIG_SM_GPUCC_6125 is not set
|
||||||
|
# CONFIG_SM_GPUCC_6350 is not set
|
||||||
|
# CONFIG_SM_GPUCC_6375 is not set
|
||||||
|
# CONFIG_SM_GPUCC_8150 is not set
|
||||||
|
# CONFIG_SM_GPUCC_8250 is not set
|
||||||
|
# CONFIG_SM_GPUCC_8350 is not set
|
||||||
|
# CONFIG_SM_GPUCC_8450 is not set
|
||||||
|
# CONFIG_SM_GPUCC_8550 is not set
|
||||||
|
# CONFIG_SM_TCSRCC_8550 is not set
|
||||||
|
# CONFIG_SM_VIDEOCC_8150 is not set
|
||||||
|
# CONFIG_SM_VIDEOCC_8250 is not set
|
||||||
|
# CONFIG_SM_VIDEOCC_8350 is not set
|
||||||
|
# CONFIG_SM_VIDEOCC_8450 is not set
|
||||||
|
# CONFIG_SM_VIDEOCC_8550 is not set
|
||||||
|
CONFIG_SOCK_RX_QUEUE_MAPPING=y
|
||||||
|
CONFIG_SOC_BUS=y
|
||||||
|
CONFIG_SOFTIRQ_ON_OWN_STACK=y
|
||||||
|
CONFIG_SPARSEMEM=y
|
||||||
|
CONFIG_SPARSEMEM_EXTREME=y
|
||||||
|
CONFIG_SPARSEMEM_VMEMMAP=y
|
||||||
|
CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y
|
||||||
|
CONFIG_SPARSE_IRQ=y
|
||||||
|
CONFIG_SPI=y
|
||||||
|
CONFIG_SPI_MASTER=y
|
||||||
|
CONFIG_SPI_MEM=y
|
||||||
|
CONFIG_SPI_QUP=y
|
||||||
|
CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU=y
|
||||||
|
CONFIG_SWIOTLB=y
|
||||||
|
CONFIG_SWPHY=y
|
||||||
|
CONFIG_SYSCTL_EXCEPTION_TRACE=y
|
||||||
|
CONFIG_THERMAL=y
|
||||||
|
CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y
|
||||||
|
CONFIG_THERMAL_EMERGENCY_POWEROFF_DELAY_MS=0
|
||||||
|
CONFIG_THERMAL_GOV_STEP_WISE=y
|
||||||
|
CONFIG_THERMAL_OF=y
|
||||||
|
CONFIG_THREAD_INFO_IN_TASK=y
|
||||||
|
CONFIG_TICK_CPU_ACCOUNTING=y
|
||||||
|
CONFIG_TIMER_OF=y
|
||||||
|
CONFIG_TIMER_PROBE=y
|
||||||
|
CONFIG_TRACE_IRQFLAGS_NMI_SUPPORT=y
|
||||||
|
CONFIG_TREE_RCU=y
|
||||||
|
CONFIG_TREE_SRCU=y
|
||||||
|
CONFIG_UBIFS_FS=y
|
||||||
|
CONFIG_UBIFS_FS_ADVANCED_COMPR=y
|
||||||
|
# CONFIG_UCLAMP_TASK is not set
|
||||||
|
CONFIG_UNMAP_KERNEL_AT_EL0=y
|
||||||
|
CONFIG_USB=y
|
||||||
|
CONFIG_USB_COMMON=y
|
||||||
|
CONFIG_USB_SUPPORT=y
|
||||||
|
CONFIG_VIRTIO=y
|
||||||
|
CONFIG_VIRTIO_ANCHOR=y
|
||||||
|
# CONFIG_VIRTIO_BLK is not set
|
||||||
|
# CONFIG_VIRTIO_NET is not set
|
||||||
|
CONFIG_VMAP_STACK=y
|
||||||
|
CONFIG_WANT_DEV_COREDUMP=y
|
||||||
|
CONFIG_WATCHDOG_CORE=y
|
||||||
|
CONFIG_WATCHDOG_SYSFS=y
|
||||||
|
CONFIG_XPS=y
|
||||||
|
CONFIG_XXHASH=y
|
||||||
|
CONFIG_ZLIB_DEFLATE=y
|
||||||
|
CONFIG_ZLIB_INFLATE=y
|
||||||
|
CONFIG_ZONE_DMA32=y
|
||||||
|
CONFIG_ZSTD_COMMON=y
|
||||||
|
CONFIG_ZSTD_COMPRESS=y
|
||||||
|
CONFIG_ZSTD_DECOMPRESS=y
|
50
target/linux/qualcommax/image/ipq50xx.mk
Normal file
50
target/linux/qualcommax/image/ipq50xx.mk
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
define Device/glinet_gl-b3000
|
||||||
|
$(call Device/FitImage)
|
||||||
|
$(call Device/UbiFit)
|
||||||
|
SOC := ipq5000
|
||||||
|
DEVICE_VENDOR := GL.iNET
|
||||||
|
DEVICE_MODEL := GL-B3000
|
||||||
|
BLOCKSIZE := 128k
|
||||||
|
PAGESIZE := 2048
|
||||||
|
DEVICE_DTS_CONFIG := config@mp03.5-c1
|
||||||
|
UBINIZE_OPTS := -E 5
|
||||||
|
DEVICE_PACKAGES := ath11k-firmware-qcn6122 ipq-wifi-gl-b3000
|
||||||
|
endef
|
||||||
|
TARGET_DEVICES += glinet_gl-b3000
|
||||||
|
|
||||||
|
define Device/linksys_mx2000
|
||||||
|
$(call Device/FitImageLzma)
|
||||||
|
DEVICE_VENDOR := Linksys
|
||||||
|
DEVICE_MODEL := MX2000
|
||||||
|
BLOCKSIZE := 128k
|
||||||
|
PAGESIZE := 2048
|
||||||
|
KERNEL_SIZE := 8192k
|
||||||
|
IMAGE_SIZE := 83968k
|
||||||
|
DEVICE_DTS_CONFIG := config@mp03.5-c1
|
||||||
|
SOC := ipq5018
|
||||||
|
UBINIZE_OPTS := -E 5 # EOD marks to "hide" factory sig at EOF
|
||||||
|
IMAGES += factory.bin
|
||||||
|
IMAGE/factory.bin := append-kernel | pad-to $$$$(KERNEL_SIZE) | append-ubi | linksys-image type=MX2000
|
||||||
|
DEVICE_PACKAGES := ath11k-firmware-qcn6122 \
|
||||||
|
ipq-wifi-linksys_mx2000
|
||||||
|
endef
|
||||||
|
TARGET_DEVICES += linksys_mx2000
|
||||||
|
|
||||||
|
define Device/linksys_mx5500
|
||||||
|
$(call Device/FitImageLzma)
|
||||||
|
DEVICE_VENDOR := Linksys
|
||||||
|
DEVICE_MODEL := MX5500
|
||||||
|
BLOCKSIZE := 128k
|
||||||
|
PAGESIZE := 2048
|
||||||
|
KERNEL_SIZE := 8192k
|
||||||
|
IMAGE_SIZE := 83968k
|
||||||
|
DEVICE_DTS_CONFIG := config@mp03.1
|
||||||
|
SOC := ipq5018
|
||||||
|
UBINIZE_OPTS := -E 5 # EOD marks to "hide" factory sig at EOF
|
||||||
|
IMAGES += factory.bin
|
||||||
|
IMAGE/factory.bin := append-kernel | pad-to $$$$(KERNEL_SIZE) | append-ubi | linksys-image type=MX5500
|
||||||
|
DEVICE_PACKAGES := kmod-ath11k-pci \
|
||||||
|
ath11k-firmware-qcn9074 \
|
||||||
|
ipq-wifi-linksys_mx5500
|
||||||
|
endef
|
||||||
|
TARGET_DEVICES += linksys_mx5500
|
@ -0,0 +1,48 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
. /lib/functions/uci-defaults.sh
|
||||||
|
. /lib/functions/system.sh
|
||||||
|
|
||||||
|
ipq50xx_setup_interfaces()
|
||||||
|
{
|
||||||
|
local board="$1"
|
||||||
|
case $board in
|
||||||
|
glinet,gl-b3000)
|
||||||
|
ucidef_set_interfaces_lan_wan "lan1 lan2" "wan"
|
||||||
|
;;
|
||||||
|
linksys,mx2000|\
|
||||||
|
linksys,mx5500)
|
||||||
|
ucidef_set_interfaces_lan_wan "lan1 lan2 lan3" "wan"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
ipq50xx_setup_macs()
|
||||||
|
{
|
||||||
|
local board="$1"
|
||||||
|
local lan_mac=""
|
||||||
|
local wan_mac=""
|
||||||
|
local label_mac=""
|
||||||
|
|
||||||
|
case "$board" in
|
||||||
|
linksys,mx2000|\
|
||||||
|
linksys,mx5500)
|
||||||
|
label_mac=$(mtd_get_mac_ascii devinfo hw_mac_addr)
|
||||||
|
lan_mac=$label_mac
|
||||||
|
wan_mac=$label_mac
|
||||||
|
ucidef_set_network_device_mac eth1 $label_mac
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
[ -n "$lan_mac" ] && ucidef_set_interface_macaddr "lan" $lan_mac
|
||||||
|
[ -n "$wan_mac" ] && ucidef_set_interface_macaddr "wan" $wan_mac
|
||||||
|
[ -n "$label_mac" ] && ucidef_set_label_macaddr $label_mac
|
||||||
|
}
|
||||||
|
|
||||||
|
board_config_update
|
||||||
|
board=$(board_name)
|
||||||
|
ipq50xx_setup_interfaces $board
|
||||||
|
ipq50xx_setup_macs $board
|
||||||
|
board_config_flush
|
||||||
|
|
||||||
|
exit 0
|
@ -0,0 +1,55 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
[ -e /lib/firmware/$FIRMWARE ] && exit 0
|
||||||
|
|
||||||
|
. /lib/functions/caldata.sh
|
||||||
|
|
||||||
|
board=$(board_name)
|
||||||
|
|
||||||
|
case "$FIRMWARE" in
|
||||||
|
"ath11k/IPQ5018/hw1.0/cal-ahb-c000000.wifi.bin")
|
||||||
|
case "$board" in
|
||||||
|
linksys,mx2000|\
|
||||||
|
linksys,mx5500)
|
||||||
|
caldata_extract "0:ART" 0x1000 0x20000
|
||||||
|
label_mac=$(mtd_get_mac_ascii devinfo hw_mac_addr)
|
||||||
|
ath11k_patch_mac $(macaddr_add $label_mac 1) 0
|
||||||
|
ath11k_remove_regdomain
|
||||||
|
ath11k_set_macflag
|
||||||
|
;;
|
||||||
|
glinet,gl-b3000)
|
||||||
|
caldata_extract "0:ART" 0x1000 0x20000
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
"ath11k/qcn6122/hw1.0/cal-ahb-soc@0:wifi1@c000000.bin")
|
||||||
|
case "$board" in
|
||||||
|
linksys,mx2000)
|
||||||
|
caldata_extract "0:ART" 0x26800 0x20000
|
||||||
|
label_mac=$(mtd_get_mac_ascii devinfo hw_mac_addr)
|
||||||
|
ath11k_patch_mac $(macaddr_add $label_mac 2) 0
|
||||||
|
ath11k_remove_regdomain
|
||||||
|
ath11k_set_macflag
|
||||||
|
;;
|
||||||
|
glinet,gl-b3000)
|
||||||
|
caldata_extract "0:ART" 0x26800 0x20000
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
"ath11k/QCN9074/hw1.0/cal-pci-0001:01:00.0.bin")
|
||||||
|
case "$board" in
|
||||||
|
linksys,mx5500)
|
||||||
|
caldata_extract "0:ART" 0x26800 0x20000
|
||||||
|
label_mac=$(mtd_get_mac_ascii devinfo hw_mac_addr)
|
||||||
|
ath11k_patch_mac $(macaddr_add $label_mac 2) 0
|
||||||
|
ath11k_remove_regdomain
|
||||||
|
ath11k_set_macflag
|
||||||
|
;;
|
||||||
|
glinet,gl-b3000)
|
||||||
|
caldata_extract "0:ART" 0x26800 0x20000
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
12
target/linux/qualcommax/ipq50xx/base-files/etc/init.d/bootcount
Executable file
12
target/linux/qualcommax/ipq50xx/base-files/etc/init.d/bootcount
Executable file
@ -0,0 +1,12 @@
|
|||||||
|
#!/bin/sh /etc/rc.common
|
||||||
|
|
||||||
|
START=99
|
||||||
|
|
||||||
|
boot() {
|
||||||
|
case $(board_name) in
|
||||||
|
linksys,mx2000|\
|
||||||
|
linksys,mx5500)
|
||||||
|
mtd resetbc s_env || true
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
@ -0,0 +1,125 @@
|
|||||||
|
linksys_get_target_firmware() {
|
||||||
|
local cur_boot_part mtd_ubi0
|
||||||
|
|
||||||
|
cur_boot_part="$(/usr/sbin/fw_printenv -n boot_part)"
|
||||||
|
if [ -z "${cur_boot_part}" ]; then
|
||||||
|
mtd_ubi0=$(cat /sys/class/ubi/ubi0/mtd_num)
|
||||||
|
case "$(grep -E "^mtd${mtd_ubi0}:" /proc/mtd | cut -d '"' -f 2)" in
|
||||||
|
kernel|rootfs)
|
||||||
|
cur_boot_part=1
|
||||||
|
;;
|
||||||
|
alt_kernel|alt_rootfs)
|
||||||
|
cur_boot_part=2
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
>&2 printf "Current boot_part='%s' selected from ubi0/mtd_num='%s'" \
|
||||||
|
"${cur_boot_part}" "${mtd_ubi0}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# OEM U-Boot for EA6350v3, EA8300 and MR8300; bootcmd=
|
||||||
|
# if test $auto_recovery = no;
|
||||||
|
# then bootipq;
|
||||||
|
# elif test $boot_part = 1;
|
||||||
|
# then run bootpart1;
|
||||||
|
# else run bootpart2;
|
||||||
|
# fi
|
||||||
|
|
||||||
|
case "$cur_boot_part" in
|
||||||
|
1)
|
||||||
|
fw_setenv -s - <<-EOF
|
||||||
|
boot_part 2
|
||||||
|
auto_recovery yes
|
||||||
|
EOF
|
||||||
|
printf "alt_kernel"
|
||||||
|
return
|
||||||
|
;;
|
||||||
|
2)
|
||||||
|
fw_setenv -s - <<-EOF
|
||||||
|
boot_part 1
|
||||||
|
auto_recovery yes
|
||||||
|
EOF
|
||||||
|
printf "kernel"
|
||||||
|
return
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
return
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
linksys_is_factory_image() {
|
||||||
|
local board=$(board_name)
|
||||||
|
board=${board##*,}
|
||||||
|
|
||||||
|
# check matching footer signature
|
||||||
|
tail -c 256 $1 | grep -q -i "\.LINKSYS\.........${board}"
|
||||||
|
}
|
||||||
|
|
||||||
|
platform_do_upgrade_linksys() {
|
||||||
|
local magic_long="$(get_magic_long "$1")"
|
||||||
|
|
||||||
|
local rm_oem_fw_vols="squashfs ubifs" # from OEM [alt_]rootfs UBI
|
||||||
|
local vol
|
||||||
|
|
||||||
|
mkdir -p /var/lock
|
||||||
|
local part_label="$(linksys_get_target_firmware)"
|
||||||
|
touch /var/lock/fw_printenv.lock
|
||||||
|
|
||||||
|
if [ -z "$part_label" ]; then
|
||||||
|
echo "cannot find target partition"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
local target_mtd=$(find_mtd_part "$part_label")
|
||||||
|
|
||||||
|
[ "$magic_long" = "73797375" ] && {
|
||||||
|
CI_KERNPART="$part_label"
|
||||||
|
if [ "$part_label" = "kernel" ]; then
|
||||||
|
CI_UBIPART="rootfs"
|
||||||
|
else
|
||||||
|
CI_UBIPART="alt_rootfs"
|
||||||
|
fi
|
||||||
|
|
||||||
|
local mtdnum="$(find_mtd_index "$CI_UBIPART")"
|
||||||
|
if [ ! "$mtdnum" ]; then
|
||||||
|
echo "cannot find ubi mtd partition $CI_UBIPART"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
local ubidev="$(nand_find_ubi "$CI_UBIPART")"
|
||||||
|
if [ ! "$ubidev" ]; then
|
||||||
|
ubiattach -m "$mtdnum"
|
||||||
|
sync
|
||||||
|
ubidev="$(nand_find_ubi "$CI_UBIPART")"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$ubidev" ]; then
|
||||||
|
for vol in $rm_oem_fw_vols; do
|
||||||
|
ubirmvol "/dev/$ubidev" -N "$vol" 2>/dev/null
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
# complete std upgrade
|
||||||
|
if nand_upgrade_tar "$1" ; then
|
||||||
|
nand_do_upgrade_success
|
||||||
|
else
|
||||||
|
nand_do_upgrade_failed
|
||||||
|
fi
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
[ "$magic_long" = "27051956" ] && {
|
||||||
|
echo "writing \"$1\" image to \"$part_label\""
|
||||||
|
get_image "$1" | mtd write - "$part_label"
|
||||||
|
}
|
||||||
|
|
||||||
|
[ "$magic_long" = "d00dfeed" ] && {
|
||||||
|
if ! linksys_is_factory_image "$1"; then
|
||||||
|
echo "factory image doesn't match device"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "writing \"$1\" factory image to \"$part_label\""
|
||||||
|
get_image "$1" | mtd -e "$part_label" write - "$part_label"
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,35 @@
|
|||||||
|
PART_NAME=firmware
|
||||||
|
REQUIRE_IMAGE_METADATA=1
|
||||||
|
|
||||||
|
RAMFS_COPY_BIN='fw_printenv fw_setenv head'
|
||||||
|
RAMFS_COPY_DATA='/etc/fw_env.config /var/lock/fw_printenv.lock'
|
||||||
|
|
||||||
|
platform_check_image() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
platform_do_upgrade() {
|
||||||
|
case "$(board_name)" in
|
||||||
|
glinet,gl-b3000)
|
||||||
|
nand_do_upgrade "$1"
|
||||||
|
;;
|
||||||
|
linksys,mx2000|\
|
||||||
|
linksys,mx5500)
|
||||||
|
boot_part="$(fw_printenv -n boot_part)"
|
||||||
|
if [ "$boot_part" -eq "1" ]; then
|
||||||
|
fw_setenv boot_part 2
|
||||||
|
CI_KERNPART="alt_kernel"
|
||||||
|
CI_UBIPART="alt_rootfs"
|
||||||
|
else
|
||||||
|
fw_setenv boot_part 1
|
||||||
|
CI_UBIPART="rootfs"
|
||||||
|
fi
|
||||||
|
fw_setenv boot_part_ready 3
|
||||||
|
fw_setenv auto_recovery yes
|
||||||
|
nand_do_upgrade "$1"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
default_do_upgrade "$1"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
23
target/linux/qualcommax/ipq50xx/config-default
Normal file
23
target/linux/qualcommax/ipq50xx/config-default
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
CONFIG_QCOM_APM=y
|
||||||
|
CONFIG_IPQ_GCC_5018=y
|
||||||
|
CONFIG_PINCTRL_IPQ5018=y
|
||||||
|
|
||||||
|
CONFIG_MTD_SPI_NAND=y
|
||||||
|
CONFIG_SPI_QPIC_SNAND=y
|
||||||
|
|
||||||
|
CONFIG_IPQ_CMN_PLL=y
|
||||||
|
CONFIG_IPQ5018_PHY=y
|
||||||
|
CONFIG_NET_DSA=y
|
||||||
|
CONFIG_NET_DSA_QCA8K=y
|
||||||
|
CONFIG_NET_DSA_TAG_QCA=y
|
||||||
|
CONFIG_QCA83XX_PHY=y
|
||||||
|
|
||||||
|
CONFIG_QCOM_Q6V5_MPD=y
|
||||||
|
CONFIG_QCOM_QMI_HELPERS=y
|
||||||
|
|
||||||
|
CONFIG_PHY_QCOM_IPQ5018_UNIPHY_PCIE=y
|
||||||
|
CONFIG_PCIE_QCOM=y
|
||||||
|
|
||||||
|
CONFIG_PWM=y
|
||||||
|
CONFIG_PWM_IPQ=y
|
||||||
|
CONFIG_LEDS_PWM=y
|
7
target/linux/qualcommax/ipq50xx/target.mk
Normal file
7
target/linux/qualcommax/ipq50xx/target.mk
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
SUBTARGET:=ipq50xx
|
||||||
|
BOARDNAME:=Qualcomm Atheros IPQ50xx
|
||||||
|
DEFAULT_PACKAGES += ath11k-firmware-ipq5018
|
||||||
|
|
||||||
|
define Target/Description
|
||||||
|
Build firmware images for Qualcomm Atheros IPQ50xx based boards.
|
||||||
|
endef
|
@ -0,0 +1,29 @@
|
|||||||
|
From 93e161c8f4b9b051e5e746814138cb5520b4b897 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Robert Marko <robimarko@gmail.com>
|
||||||
|
Date: Fri, 1 Sep 2023 20:10:04 +0200
|
||||||
|
Subject: [PATCH] dt-bindings: arm: qcom,ids: Add IDs for IPQ8174 family
|
||||||
|
|
||||||
|
IPQ8174 (Oak) family is part of the IPQ8074 family, but the ID-s for it
|
||||||
|
are missing so lets add them.
|
||||||
|
|
||||||
|
Signed-off-by: Robert Marko <robimarko@gmail.com>
|
||||||
|
Reviewed-by: Kathiravan T <quic_kathirav@quicinc.com>
|
||||||
|
Acked-by: Conor Dooley <conor.dooley@microchip.com>
|
||||||
|
Link: https://lore.kernel.org/r/20230901181041.1538999-1-robimarko@gmail.com
|
||||||
|
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||||
|
---
|
||||||
|
include/dt-bindings/arm/qcom,ids.h | 3 +++
|
||||||
|
1 file changed, 3 insertions(+)
|
||||||
|
|
||||||
|
--- a/include/dt-bindings/arm/qcom,ids.h
|
||||||
|
+++ b/include/dt-bindings/arm/qcom,ids.h
|
||||||
|
@@ -203,6 +203,9 @@
|
||||||
|
#define QCOM_ID_SM6125 394
|
||||||
|
#define QCOM_ID_IPQ8070A 395
|
||||||
|
#define QCOM_ID_IPQ8071A 396
|
||||||
|
+#define QCOM_ID_IPQ8172 397
|
||||||
|
+#define QCOM_ID_IPQ8173 398
|
||||||
|
+#define QCOM_ID_IPQ8174 399
|
||||||
|
#define QCOM_ID_IPQ6018 402
|
||||||
|
#define QCOM_ID_IPQ6028 403
|
||||||
|
#define QCOM_ID_SDM429W 416
|
@ -0,0 +1,123 @@
|
|||||||
|
From 47e161a7873b0891f4e01a69a839f6161d816ea8 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Robert Marko <robimarko@gmail.com>
|
||||||
|
Date: Wed, 25 Oct 2023 14:57:57 +0530
|
||||||
|
Subject: [PATCH] cpufreq: qcom-nvmem: add support for IPQ6018
|
||||||
|
|
||||||
|
IPQ6018 SoC series comes in multiple SKU-s, and not all of them support
|
||||||
|
high frequency OPP points.
|
||||||
|
|
||||||
|
SoC itself does however have a single bit in QFPROM to indicate the CPU
|
||||||
|
speed-bin.
|
||||||
|
That bit is used to indicate frequency limit of 1.5GHz, but that alone is
|
||||||
|
not enough as IPQ6000 only goes up to 1.2GHz, but SMEM ID can be used to
|
||||||
|
limit it further.
|
||||||
|
|
||||||
|
IPQ6018 compatible is blacklisted from DT platdev as the cpufreq device
|
||||||
|
will get created by NVMEM CPUFreq driver.
|
||||||
|
|
||||||
|
Signed-off-by: Robert Marko <robimarko@gmail.com>
|
||||||
|
[ Viresh: Fixed rebase conflict. ]
|
||||||
|
Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
|
||||||
|
---
|
||||||
|
drivers/cpufreq/cpufreq-dt-platdev.c | 1 +
|
||||||
|
drivers/cpufreq/qcom-cpufreq-nvmem.c | 58 ++++++++++++++++++++++++++++
|
||||||
|
2 files changed, 59 insertions(+)
|
||||||
|
|
||||||
|
--- a/drivers/cpufreq/cpufreq-dt-platdev.c
|
||||||
|
+++ b/drivers/cpufreq/cpufreq-dt-platdev.c
|
||||||
|
@@ -177,6 +177,7 @@ static const struct of_device_id blockli
|
||||||
|
{ .compatible = "ti,am625", },
|
||||||
|
{ .compatible = "ti,am62a7", },
|
||||||
|
|
||||||
|
+ { .compatible = "qcom,ipq6018", },
|
||||||
|
{ .compatible = "qcom,ipq8064", },
|
||||||
|
{ .compatible = "qcom,apq8064", },
|
||||||
|
{ .compatible = "qcom,msm8974", },
|
||||||
|
--- a/drivers/cpufreq/qcom-cpufreq-nvmem.c
|
||||||
|
+++ b/drivers/cpufreq/qcom-cpufreq-nvmem.c
|
||||||
|
@@ -30,6 +30,8 @@
|
||||||
|
|
||||||
|
#include <dt-bindings/arm/qcom,ids.h>
|
||||||
|
|
||||||
|
+#define IPQ6000_VERSION BIT(2)
|
||||||
|
+
|
||||||
|
struct qcom_cpufreq_drv;
|
||||||
|
|
||||||
|
struct qcom_cpufreq_match_data {
|
||||||
|
@@ -207,6 +209,57 @@ len_error:
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static int qcom_cpufreq_ipq6018_name_version(struct device *cpu_dev,
|
||||||
|
+ struct nvmem_cell *speedbin_nvmem,
|
||||||
|
+ char **pvs_name,
|
||||||
|
+ struct qcom_cpufreq_drv *drv)
|
||||||
|
+{
|
||||||
|
+ u32 msm_id;
|
||||||
|
+ int ret;
|
||||||
|
+ u8 *speedbin;
|
||||||
|
+ *pvs_name = NULL;
|
||||||
|
+
|
||||||
|
+ ret = qcom_smem_get_soc_id(&msm_id);
|
||||||
|
+ if (ret)
|
||||||
|
+ return ret;
|
||||||
|
+
|
||||||
|
+ speedbin = nvmem_cell_read(speedbin_nvmem, NULL);
|
||||||
|
+ if (IS_ERR(speedbin))
|
||||||
|
+ return PTR_ERR(speedbin);
|
||||||
|
+
|
||||||
|
+ switch (msm_id) {
|
||||||
|
+ case QCOM_ID_IPQ6005:
|
||||||
|
+ case QCOM_ID_IPQ6010:
|
||||||
|
+ case QCOM_ID_IPQ6018:
|
||||||
|
+ case QCOM_ID_IPQ6028:
|
||||||
|
+ /* Fuse Value Freq BIT to set
|
||||||
|
+ * ---------------------------------
|
||||||
|
+ * 2’b0 No Limit BIT(0)
|
||||||
|
+ * 2’b1 1.5 GHz BIT(1)
|
||||||
|
+ */
|
||||||
|
+ drv->versions = 1 << (unsigned int)(*speedbin);
|
||||||
|
+ break;
|
||||||
|
+ case QCOM_ID_IPQ6000:
|
||||||
|
+ /*
|
||||||
|
+ * IPQ6018 family only has one bit to advertise the CPU
|
||||||
|
+ * speed-bin, but that is not enough for IPQ6000 which
|
||||||
|
+ * is only rated up to 1.2GHz.
|
||||||
|
+ * So for IPQ6000 manually set BIT(2) based on SMEM ID.
|
||||||
|
+ */
|
||||||
|
+ drv->versions = IPQ6000_VERSION;
|
||||||
|
+ break;
|
||||||
|
+ default:
|
||||||
|
+ dev_err(cpu_dev,
|
||||||
|
+ "SoC ID %u is not part of IPQ6018 family, limiting to 1.2GHz!\n",
|
||||||
|
+ msm_id);
|
||||||
|
+ drv->versions = IPQ6000_VERSION;
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ kfree(speedbin);
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static const struct qcom_cpufreq_match_data match_data_kryo = {
|
||||||
|
.get_version = qcom_cpufreq_kryo_name_version,
|
||||||
|
};
|
||||||
|
@@ -221,6 +274,10 @@ static const struct qcom_cpufreq_match_d
|
||||||
|
.genpd_names = qcs404_genpd_names,
|
||||||
|
};
|
||||||
|
|
||||||
|
+static const struct qcom_cpufreq_match_data match_data_ipq6018 = {
|
||||||
|
+ .get_version = qcom_cpufreq_ipq6018_name_version,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
static int qcom_cpufreq_probe(struct platform_device *pdev)
|
||||||
|
{
|
||||||
|
struct qcom_cpufreq_drv *drv;
|
||||||
|
@@ -353,6 +410,7 @@ static const struct of_device_id qcom_cp
|
||||||
|
{ .compatible = "qcom,apq8096", .data = &match_data_kryo },
|
||||||
|
{ .compatible = "qcom,msm8996", .data = &match_data_kryo },
|
||||||
|
{ .compatible = "qcom,qcs404", .data = &match_data_qcs404 },
|
||||||
|
+ { .compatible = "qcom,ipq6018", .data = &match_data_ipq6018 },
|
||||||
|
{ .compatible = "qcom,ipq8064", .data = &match_data_krait },
|
||||||
|
{ .compatible = "qcom,apq8064", .data = &match_data_krait },
|
||||||
|
{ .compatible = "qcom,msm8974", .data = &match_data_krait },
|
@ -0,0 +1,113 @@
|
|||||||
|
From 0b9cd949136f1b63f7aa9424b6e583a1ab261e36 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Robert Marko <robimarko@gmail.com>
|
||||||
|
Date: Fri, 13 Oct 2023 19:20:02 +0200
|
||||||
|
Subject: [PATCH] cpufreq: qcom-nvmem: add support for IPQ8074
|
||||||
|
|
||||||
|
IPQ8074 comes in 3 families:
|
||||||
|
* IPQ8070A/IPQ8071A (Acorn) up to 1.4GHz
|
||||||
|
* IPQ8172/IPQ8173/IPQ8174 (Oak) up to 1.4GHz
|
||||||
|
* IPQ8072A/IPQ8074A/IPQ8076A/IPQ8078A (Hawkeye) up to 2.2GHz
|
||||||
|
|
||||||
|
So, in order to be able to share one OPP table lets add support for IPQ8074
|
||||||
|
family based of SMEM SoC ID-s as speedbin fuse is always 0 on IPQ8074.
|
||||||
|
|
||||||
|
IPQ8074 compatible is blacklisted from DT platdev as the cpufreq device
|
||||||
|
will get created by NVMEM CPUFreq driver.
|
||||||
|
|
||||||
|
Signed-off-by: Robert Marko <robimarko@gmail.com>
|
||||||
|
Acked-by: Konrad Dybcio <konrad.dybcio@linaro.org>
|
||||||
|
[ Viresh: Fixed rebase conflict. ]
|
||||||
|
Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
|
||||||
|
---
|
||||||
|
drivers/cpufreq/cpufreq-dt-platdev.c | 1 +
|
||||||
|
drivers/cpufreq/qcom-cpufreq-nvmem.c | 48 ++++++++++++++++++++++++++++
|
||||||
|
2 files changed, 49 insertions(+)
|
||||||
|
|
||||||
|
--- a/drivers/cpufreq/cpufreq-dt-platdev.c
|
||||||
|
+++ b/drivers/cpufreq/cpufreq-dt-platdev.c
|
||||||
|
@@ -179,6 +179,7 @@ static const struct of_device_id blockli
|
||||||
|
|
||||||
|
{ .compatible = "qcom,ipq6018", },
|
||||||
|
{ .compatible = "qcom,ipq8064", },
|
||||||
|
+ { .compatible = "qcom,ipq8074", },
|
||||||
|
{ .compatible = "qcom,apq8064", },
|
||||||
|
{ .compatible = "qcom,msm8974", },
|
||||||
|
{ .compatible = "qcom,msm8960", },
|
||||||
|
--- a/drivers/cpufreq/qcom-cpufreq-nvmem.c
|
||||||
|
+++ b/drivers/cpufreq/qcom-cpufreq-nvmem.c
|
||||||
|
@@ -32,6 +32,11 @@
|
||||||
|
|
||||||
|
#define IPQ6000_VERSION BIT(2)
|
||||||
|
|
||||||
|
+enum ipq8074_versions {
|
||||||
|
+ IPQ8074_HAWKEYE_VERSION = 0,
|
||||||
|
+ IPQ8074_ACORN_VERSION,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
struct qcom_cpufreq_drv;
|
||||||
|
|
||||||
|
struct qcom_cpufreq_match_data {
|
||||||
|
@@ -260,6 +265,44 @@ static int qcom_cpufreq_ipq6018_name_ver
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static int qcom_cpufreq_ipq8074_name_version(struct device *cpu_dev,
|
||||||
|
+ struct nvmem_cell *speedbin_nvmem,
|
||||||
|
+ char **pvs_name,
|
||||||
|
+ struct qcom_cpufreq_drv *drv)
|
||||||
|
+{
|
||||||
|
+ u32 msm_id;
|
||||||
|
+ int ret;
|
||||||
|
+ *pvs_name = NULL;
|
||||||
|
+
|
||||||
|
+ ret = qcom_smem_get_soc_id(&msm_id);
|
||||||
|
+ if (ret)
|
||||||
|
+ return ret;
|
||||||
|
+
|
||||||
|
+ switch (msm_id) {
|
||||||
|
+ case QCOM_ID_IPQ8070A:
|
||||||
|
+ case QCOM_ID_IPQ8071A:
|
||||||
|
+ case QCOM_ID_IPQ8172:
|
||||||
|
+ case QCOM_ID_IPQ8173:
|
||||||
|
+ case QCOM_ID_IPQ8174:
|
||||||
|
+ drv->versions = BIT(IPQ8074_ACORN_VERSION);
|
||||||
|
+ break;
|
||||||
|
+ case QCOM_ID_IPQ8072A:
|
||||||
|
+ case QCOM_ID_IPQ8074A:
|
||||||
|
+ case QCOM_ID_IPQ8076A:
|
||||||
|
+ case QCOM_ID_IPQ8078A:
|
||||||
|
+ drv->versions = BIT(IPQ8074_HAWKEYE_VERSION);
|
||||||
|
+ break;
|
||||||
|
+ default:
|
||||||
|
+ dev_err(cpu_dev,
|
||||||
|
+ "SoC ID %u is not part of IPQ8074 family, limiting to 1.4GHz!\n",
|
||||||
|
+ msm_id);
|
||||||
|
+ drv->versions = BIT(IPQ8074_ACORN_VERSION);
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static const struct qcom_cpufreq_match_data match_data_kryo = {
|
||||||
|
.get_version = qcom_cpufreq_kryo_name_version,
|
||||||
|
};
|
||||||
|
@@ -278,6 +321,10 @@ static const struct qcom_cpufreq_match_d
|
||||||
|
.get_version = qcom_cpufreq_ipq6018_name_version,
|
||||||
|
};
|
||||||
|
|
||||||
|
+static const struct qcom_cpufreq_match_data match_data_ipq8074 = {
|
||||||
|
+ .get_version = qcom_cpufreq_ipq8074_name_version,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
static int qcom_cpufreq_probe(struct platform_device *pdev)
|
||||||
|
{
|
||||||
|
struct qcom_cpufreq_drv *drv;
|
||||||
|
@@ -412,6 +459,7 @@ static const struct of_device_id qcom_cp
|
||||||
|
{ .compatible = "qcom,qcs404", .data = &match_data_qcs404 },
|
||||||
|
{ .compatible = "qcom,ipq6018", .data = &match_data_ipq6018 },
|
||||||
|
{ .compatible = "qcom,ipq8064", .data = &match_data_krait },
|
||||||
|
+ { .compatible = "qcom,ipq8074", .data = &match_data_ipq8074 },
|
||||||
|
{ .compatible = "qcom,apq8064", .data = &match_data_krait },
|
||||||
|
{ .compatible = "qcom,msm8974", .data = &match_data_krait },
|
||||||
|
{ .compatible = "qcom,msm8960", .data = &match_data_krait },
|
@ -0,0 +1,43 @@
|
|||||||
|
From c917237a7cb17b97cc48e073881a9873f3caeaa2 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Kathiravan Thirumoorthy <quic_kathirav@quicinc.com>
|
||||||
|
Date: Thu, 14 Sep 2023 12:29:57 +0530
|
||||||
|
Subject: [PATCH] clk: qcom: apss-ipq6018: add the GPLL0 clock also as clock
|
||||||
|
provider
|
||||||
|
|
||||||
|
While the kernel is booting up, APSS PLL will be running at 800MHz with
|
||||||
|
GPLL0 as source. Once the cpufreq driver is available, APSS PLL will be
|
||||||
|
configured and select the rate based on the opp table and the source will
|
||||||
|
be changed to APSS_PLL_EARLY.
|
||||||
|
|
||||||
|
Without this patch, CPU Freq driver reports that CPU is running at 24MHz
|
||||||
|
instead of the 800MHz.
|
||||||
|
|
||||||
|
Reviewed-by: Konrad Dybcio <konrad.dybcio@linaro.org>
|
||||||
|
Tested-by: Robert Marko <robimarko@gmail.com>
|
||||||
|
Signed-off-by: Kathiravan Thirumoorthy <quic_kathirav@quicinc.com>
|
||||||
|
---
|
||||||
|
drivers/clk/qcom/apss-ipq6018.c | 3 +++
|
||||||
|
1 file changed, 3 insertions(+)
|
||||||
|
|
||||||
|
--- a/drivers/clk/qcom/apss-ipq6018.c
|
||||||
|
+++ b/drivers/clk/qcom/apss-ipq6018.c
|
||||||
|
@@ -20,16 +20,19 @@
|
||||||
|
|
||||||
|
enum {
|
||||||
|
P_XO,
|
||||||
|
+ P_GPLL0,
|
||||||
|
P_APSS_PLL_EARLY,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct clk_parent_data parents_apcs_alias0_clk_src[] = {
|
||||||
|
{ .fw_name = "xo" },
|
||||||
|
+ { .fw_name = "gpll0" },
|
||||||
|
{ .fw_name = "pll" },
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct parent_map parents_apcs_alias0_clk_src_map[] = {
|
||||||
|
{ P_XO, 0 },
|
||||||
|
+ { P_GPLL0, 4 },
|
||||||
|
{ P_APSS_PLL_EARLY, 5 },
|
||||||
|
};
|
||||||
|
|
@ -0,0 +1,32 @@
|
|||||||
|
From 3b48a7d925a757b3fa53c04baaf68bb8313c3ffb Mon Sep 17 00:00:00 2001
|
||||||
|
From: Kathiravan Thirumoorthy <quic_kathirav@quicinc.com>
|
||||||
|
Date: Thu, 14 Sep 2023 12:29:58 +0530
|
||||||
|
Subject: [PATCH] arm64: dts: qcom: ipq8074: include the GPLL0 as clock
|
||||||
|
provider for mailbox
|
||||||
|
|
||||||
|
While the kernel is booting up, APSS PLL will be running at 800MHz with
|
||||||
|
GPLL0 as source. Once the cpufreq driver is available, APSS PLL will be
|
||||||
|
configured to the rate based on the opp table and the source also will
|
||||||
|
be changed to APSS_PLL_EARLY. So allow the mailbox to consume the GPLL0,
|
||||||
|
with this inclusion, CPU Freq correctly reports that CPU is running at
|
||||||
|
800MHz rather than 24MHz.
|
||||||
|
|
||||||
|
Signed-off-by: Kathiravan Thirumoorthy <quic_kathirav@quicinc.com>
|
||||||
|
Reviewed-by: Konrad Dybcio <konrad.dybcio@linaro.org>
|
||||||
|
---
|
||||||
|
arch/arm64/boot/dts/qcom/ipq8074.dtsi | 4 ++--
|
||||||
|
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
--- a/arch/arm64/boot/dts/qcom/ipq8074.dtsi
|
||||||
|
+++ b/arch/arm64/boot/dts/qcom/ipq8074.dtsi
|
||||||
|
@@ -723,8 +723,8 @@
|
||||||
|
compatible = "qcom,ipq8074-apcs-apps-global",
|
||||||
|
"qcom,ipq6018-apcs-apps-global";
|
||||||
|
reg = <0x0b111000 0x1000>;
|
||||||
|
- clocks = <&a53pll>, <&xo>;
|
||||||
|
- clock-names = "pll", "xo";
|
||||||
|
+ clocks = <&a53pll>, <&xo>, <&gcc GPLL0>;
|
||||||
|
+ clock-names = "pll", "xo", "gpll0";
|
||||||
|
|
||||||
|
#clock-cells = <1>;
|
||||||
|
#mbox-cells = <1>;
|
@ -0,0 +1,35 @@
|
|||||||
|
From 0133c7af3aa0420778d106cb90db708cfa45f2c6 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Kathiravan Thirumoorthy <quic_kathirav@quicinc.com>
|
||||||
|
Date: Thu, 14 Sep 2023 12:29:59 +0530
|
||||||
|
Subject: [PATCH] arm64: dts: qcom: ipq6018: include the GPLL0 as clock
|
||||||
|
provider for mailbox
|
||||||
|
|
||||||
|
While the kernel is booting up, APSS clock / CPU clock will be running
|
||||||
|
at 800MHz with GPLL0 as source. Once the cpufreq driver is available,
|
||||||
|
APSS PLL will be configured to the rate based on the opp table and the
|
||||||
|
source also will be changed to APSS_PLL_EARLY. So allow the mailbox to
|
||||||
|
consume the GPLL0, with this inclusion, CPU Freq correctly reports that
|
||||||
|
CPU is running at 800MHz rather than 24MHz.
|
||||||
|
|
||||||
|
Signed-off-by: Kathiravan Thirumoorthy <quic_kathirav@quicinc.com>
|
||||||
|
Reviewed-by: Konrad Dybcio <konrad.dybcio@linaro.org>
|
||||||
|
Link: https://lore.kernel.org/r/20230913-gpll_cleanup-v2-9-c8ceb1a37680@quicinc.com
|
||||||
|
[bjorn: Updated commit message, as requested by Kathiravan]
|
||||||
|
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||||
|
---
|
||||||
|
arch/arm64/boot/dts/qcom/ipq6018.dtsi | 4 ++--
|
||||||
|
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
--- a/arch/arm64/boot/dts/qcom/ipq6018.dtsi
|
||||||
|
+++ b/arch/arm64/boot/dts/qcom/ipq6018.dtsi
|
||||||
|
@@ -620,8 +620,8 @@
|
||||||
|
compatible = "qcom,ipq6018-apcs-apps-global";
|
||||||
|
reg = <0x0 0x0b111000 0x0 0x1000>;
|
||||||
|
#clock-cells = <1>;
|
||||||
|
- clocks = <&a53pll>, <&xo>;
|
||||||
|
- clock-names = "pll", "xo";
|
||||||
|
+ clocks = <&a53pll>, <&xo>, <&gcc GPLL0>;
|
||||||
|
+ clock-names = "pll", "xo", "gpll0";
|
||||||
|
#mbox-cells = <1>;
|
||||||
|
};
|
||||||
|
|
@ -0,0 +1,57 @@
|
|||||||
|
From 3dcf7b59393812a5fbd83f8cd8d34b94afb4c4d1 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Robert Marko <robimarko@gmail.com>
|
||||||
|
Date: Sat, 21 Oct 2023 13:55:18 +0200
|
||||||
|
Subject: [PATCH] clk: qcom: gcc-ipq6018: add QUP6 I2C clock
|
||||||
|
|
||||||
|
QUP6 I2C clock is listed in the dt bindings but it was never included in
|
||||||
|
the GCC driver.
|
||||||
|
So lets add support for it, it is marked as criticial as it is used by RPM
|
||||||
|
to communicate to the external PMIC over I2C so this clock must not be
|
||||||
|
disabled.
|
||||||
|
|
||||||
|
Signed-off-by: Robert Marko <robimarko@gmail.com>
|
||||||
|
Reviewed-by: Kathiravan Thirumoorthy <quic_kathirav@quicinc.com>
|
||||||
|
Reviewed-by: Konrad Dybcio <konrad.dybcio@linaro.org>
|
||||||
|
Link: https://lore.kernel.org/r/20231021115545.229060-1-robimarko@gmail.com
|
||||||
|
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||||
|
---
|
||||||
|
drivers/clk/qcom/gcc-ipq6018.c | 21 +++++++++++++++++++++
|
||||||
|
1 file changed, 21 insertions(+)
|
||||||
|
|
||||||
|
--- a/drivers/clk/qcom/gcc-ipq6018.c
|
||||||
|
+++ b/drivers/clk/qcom/gcc-ipq6018.c
|
||||||
|
@@ -2121,6 +2121,26 @@ static struct clk_branch gcc_blsp1_qup5_
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
+static struct clk_branch gcc_blsp1_qup6_i2c_apps_clk = {
|
||||||
|
+ .halt_reg = 0x07010,
|
||||||
|
+ .clkr = {
|
||||||
|
+ .enable_reg = 0x07010,
|
||||||
|
+ .enable_mask = BIT(0),
|
||||||
|
+ .hw.init = &(struct clk_init_data){
|
||||||
|
+ .name = "gcc_blsp1_qup6_i2c_apps_clk",
|
||||||
|
+ .parent_hws = (const struct clk_hw *[]){
|
||||||
|
+ &blsp1_qup6_i2c_apps_clk_src.clkr.hw },
|
||||||
|
+ .num_parents = 1,
|
||||||
|
+ /*
|
||||||
|
+ * RPM uses QUP6 I2C to communicate with the external
|
||||||
|
+ * PMIC so it must not be disabled.
|
||||||
|
+ */
|
||||||
|
+ .flags = CLK_SET_RATE_PARENT | CLK_IS_CRITICAL,
|
||||||
|
+ .ops = &clk_branch2_ops,
|
||||||
|
+ },
|
||||||
|
+ },
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
static struct clk_branch gcc_blsp1_qup6_spi_apps_clk = {
|
||||||
|
.halt_reg = 0x0700c,
|
||||||
|
.clkr = {
|
||||||
|
@@ -4277,6 +4297,7 @@ static struct clk_regmap *gcc_ipq6018_cl
|
||||||
|
[GCC_BLSP1_QUP4_SPI_APPS_CLK] = &gcc_blsp1_qup4_spi_apps_clk.clkr,
|
||||||
|
[GCC_BLSP1_QUP5_I2C_APPS_CLK] = &gcc_blsp1_qup5_i2c_apps_clk.clkr,
|
||||||
|
[GCC_BLSP1_QUP5_SPI_APPS_CLK] = &gcc_blsp1_qup5_spi_apps_clk.clkr,
|
||||||
|
+ [GCC_BLSP1_QUP6_I2C_APPS_CLK] = &gcc_blsp1_qup6_i2c_apps_clk.clkr,
|
||||||
|
[GCC_BLSP1_QUP6_SPI_APPS_CLK] = &gcc_blsp1_qup6_spi_apps_clk.clkr,
|
||||||
|
[GCC_BLSP1_UART1_APPS_CLK] = &gcc_blsp1_uart1_apps_clk.clkr,
|
||||||
|
[GCC_BLSP1_UART2_APPS_CLK] = &gcc_blsp1_uart2_apps_clk.clkr,
|
@ -0,0 +1,85 @@
|
|||||||
|
From 83afcf14edb9217e58837eb119da96d734a4b3b1 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Robert Marko <robimarko@gmail.com>
|
||||||
|
Date: Sat, 21 Oct 2023 14:00:07 +0200
|
||||||
|
Subject: [PATCH] arm64: dts: qcom: ipq6018: use CPUFreq NVMEM
|
||||||
|
|
||||||
|
IPQ6018 comes in multiple SKU-s and some of them dont support all of the
|
||||||
|
OPP-s that are current set, so lets utilize CPUFreq NVMEM to allow only
|
||||||
|
supported OPP-s based on the SoC dynamically.
|
||||||
|
|
||||||
|
As an example, IPQ6018 is generaly rated at 1.8GHz but some silicon only
|
||||||
|
goes up to 1.5GHz and is marked as such via an eFuse.
|
||||||
|
|
||||||
|
Signed-off-by: Robert Marko <robimarko@gmail.com>
|
||||||
|
Reviewed-by: Konrad Dybcio <konrad.dybcio@linaro.org>
|
||||||
|
Link: https://lore.kernel.org/r/20231021120048.231239-1-robimarko@gmail.com
|
||||||
|
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||||
|
---
|
||||||
|
arch/arm64/boot/dts/qcom/ipq6018.dtsi | 14 +++++++++++++-
|
||||||
|
1 file changed, 13 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
--- a/arch/arm64/boot/dts/qcom/ipq6018.dtsi
|
||||||
|
+++ b/arch/arm64/boot/dts/qcom/ipq6018.dtsi
|
||||||
|
@@ -96,42 +96,49 @@
|
||||||
|
};
|
||||||
|
|
||||||
|
cpu_opp_table: opp-table-cpu {
|
||||||
|
- compatible = "operating-points-v2";
|
||||||
|
+ compatible = "operating-points-v2-kryo-cpu";
|
||||||
|
+ nvmem-cells = <&cpu_speed_bin>;
|
||||||
|
opp-shared;
|
||||||
|
|
||||||
|
opp-864000000 {
|
||||||
|
opp-hz = /bits/ 64 <864000000>;
|
||||||
|
opp-microvolt = <725000>;
|
||||||
|
+ opp-supported-hw = <0xf>;
|
||||||
|
clock-latency-ns = <200000>;
|
||||||
|
};
|
||||||
|
|
||||||
|
opp-1056000000 {
|
||||||
|
opp-hz = /bits/ 64 <1056000000>;
|
||||||
|
opp-microvolt = <787500>;
|
||||||
|
+ opp-supported-hw = <0xf>;
|
||||||
|
clock-latency-ns = <200000>;
|
||||||
|
};
|
||||||
|
|
||||||
|
opp-1320000000 {
|
||||||
|
opp-hz = /bits/ 64 <1320000000>;
|
||||||
|
opp-microvolt = <862500>;
|
||||||
|
+ opp-supported-hw = <0x3>;
|
||||||
|
clock-latency-ns = <200000>;
|
||||||
|
};
|
||||||
|
|
||||||
|
opp-1440000000 {
|
||||||
|
opp-hz = /bits/ 64 <1440000000>;
|
||||||
|
opp-microvolt = <925000>;
|
||||||
|
+ opp-supported-hw = <0x3>;
|
||||||
|
clock-latency-ns = <200000>;
|
||||||
|
};
|
||||||
|
|
||||||
|
opp-1608000000 {
|
||||||
|
opp-hz = /bits/ 64 <1608000000>;
|
||||||
|
opp-microvolt = <987500>;
|
||||||
|
+ opp-supported-hw = <0x1>;
|
||||||
|
clock-latency-ns = <200000>;
|
||||||
|
};
|
||||||
|
|
||||||
|
opp-1800000000 {
|
||||||
|
opp-hz = /bits/ 64 <1800000000>;
|
||||||
|
opp-microvolt = <1062500>;
|
||||||
|
+ opp-supported-hw = <0x1>;
|
||||||
|
clock-latency-ns = <200000>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
@@ -322,6 +329,11 @@
|
||||||
|
reg = <0x0 0x000a4000 0x0 0x2000>;
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <1>;
|
||||||
|
+
|
||||||
|
+ cpu_speed_bin: cpu-speed-bin@135 {
|
||||||
|
+ reg = <0x135 0x1>;
|
||||||
|
+ bits = <7 1>;
|
||||||
|
+ };
|
||||||
|
};
|
||||||
|
|
||||||
|
prng: qrng@e3000 {
|
@ -0,0 +1,81 @@
|
|||||||
|
From e6c32770ef83f3e8cc057f3920b1c06aa9d1c9c2 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Chukun Pan <amadeus@jmu.edu.cn>
|
||||||
|
Date: Sun, 3 Dec 2023 23:39:14 +0800
|
||||||
|
Subject: [PATCH] arm64: dts: qcom: ipq6018: Add remaining QUP UART node
|
||||||
|
|
||||||
|
Add node to support all the QUP UART node controller inside of IPQ6018.
|
||||||
|
Some routers use these bus to connect Bluetooth chips.
|
||||||
|
|
||||||
|
Signed-off-by: Chukun Pan <amadeus@jmu.edu.cn>
|
||||||
|
Link: https://lore.kernel.org/r/20231203153914.532654-1-amadeus@jmu.edu.cn
|
||||||
|
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||||
|
---
|
||||||
|
arch/arm64/boot/dts/qcom/ipq6018.dtsi | 50 +++++++++++++++++++++++++++
|
||||||
|
1 file changed, 50 insertions(+)
|
||||||
|
|
||||||
|
--- a/arch/arm64/boot/dts/qcom/ipq6018.dtsi
|
||||||
|
+++ b/arch/arm64/boot/dts/qcom/ipq6018.dtsi
|
||||||
|
@@ -459,6 +459,26 @@
|
||||||
|
qcom,ee = <0>;
|
||||||
|
};
|
||||||
|
|
||||||
|
+ blsp1_uart1: serial@78af000 {
|
||||||
|
+ compatible = "qcom,msm-uartdm-v1.4", "qcom,msm-uartdm";
|
||||||
|
+ reg = <0x0 0x78af000 0x0 0x200>;
|
||||||
|
+ interrupts = <GIC_SPI 107 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
+ clocks = <&gcc GCC_BLSP1_UART1_APPS_CLK>,
|
||||||
|
+ <&gcc GCC_BLSP1_AHB_CLK>;
|
||||||
|
+ clock-names = "core", "iface";
|
||||||
|
+ status = "disabled";
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ blsp1_uart2: serial@78b0000 {
|
||||||
|
+ compatible = "qcom,msm-uartdm-v1.4", "qcom,msm-uartdm";
|
||||||
|
+ reg = <0x0 0x78b0000 0x0 0x200>;
|
||||||
|
+ interrupts = <GIC_SPI 108 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
+ clocks = <&gcc GCC_BLSP1_UART2_APPS_CLK>,
|
||||||
|
+ <&gcc GCC_BLSP1_AHB_CLK>;
|
||||||
|
+ clock-names = "core", "iface";
|
||||||
|
+ status = "disabled";
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
blsp1_uart3: serial@78b1000 {
|
||||||
|
compatible = "qcom,msm-uartdm-v1.4", "qcom,msm-uartdm";
|
||||||
|
reg = <0x0 0x078b1000 0x0 0x200>;
|
||||||
|
@@ -467,6 +487,36 @@
|
||||||
|
<&gcc GCC_BLSP1_AHB_CLK>;
|
||||||
|
clock-names = "core", "iface";
|
||||||
|
status = "disabled";
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ blsp1_uart4: serial@78b2000 {
|
||||||
|
+ compatible = "qcom,msm-uartdm-v1.4", "qcom,msm-uartdm";
|
||||||
|
+ reg = <0x0 0x078b2000 0x0 0x200>;
|
||||||
|
+ interrupts = <GIC_SPI 307 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
+ clocks = <&gcc GCC_BLSP1_UART4_APPS_CLK>,
|
||||||
|
+ <&gcc GCC_BLSP1_AHB_CLK>;
|
||||||
|
+ clock-names = "core", "iface";
|
||||||
|
+ status = "disabled";
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ blsp1_uart5: serial@78b3000 {
|
||||||
|
+ compatible = "qcom,msm-uartdm-v1.4", "qcom,msm-uartdm";
|
||||||
|
+ reg = <0x0 0x78b3000 0x0 0x200>;
|
||||||
|
+ interrupts = <GIC_SPI 308 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
+ clocks = <&gcc GCC_BLSP1_UART5_APPS_CLK>,
|
||||||
|
+ <&gcc GCC_BLSP1_AHB_CLK>;
|
||||||
|
+ clock-names = "core", "iface";
|
||||||
|
+ status = "disabled";
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ blsp1_uart6: serial@78b4000 {
|
||||||
|
+ compatible = "qcom,msm-uartdm-v1.4", "qcom,msm-uartdm";
|
||||||
|
+ reg = <0x0 0x078b4000 0x0 0x200>;
|
||||||
|
+ interrupts = <GIC_SPI 309 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
+ clocks = <&gcc GCC_BLSP1_UART6_APPS_CLK>,
|
||||||
|
+ <&gcc GCC_BLSP1_AHB_CLK>;
|
||||||
|
+ clock-names = "core", "iface";
|
||||||
|
+ status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
|
blsp1_spi1: spi@78b5000 {
|
@ -0,0 +1,95 @@
|
|||||||
|
From 2c6597c72e9722ac020102d5af40126df0437b82 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Krishna Kurapati <quic_kriskura@quicinc.com>
|
||||||
|
Date: Fri, 26 Jan 2024 00:29:18 +0530
|
||||||
|
Subject: [PATCH] arm64: dts: qcom: Fix hs_phy_irq for QUSB2 targets
|
||||||
|
|
||||||
|
On several QUSB2 Targets, the hs_phy_irq mentioned is actually
|
||||||
|
qusb2_phy interrupt specific to QUSB2 PHY's. Rename hs_phy_irq
|
||||||
|
to qusb2_phy for such targets.
|
||||||
|
|
||||||
|
In actuality, the hs_phy_irq is also present in these targets, but
|
||||||
|
kept in for debug purposes in hw test environments. This is not
|
||||||
|
triggered by default and its functionality is mutually exclusive
|
||||||
|
to that of qusb2_phy interrupt.
|
||||||
|
|
||||||
|
Add missing hs_phy_irq's, pwr_event irq's for QUSB2 PHY targets.
|
||||||
|
Add missing ss_phy_irq on some targets which allows for remote
|
||||||
|
wakeup to work on a Super Speed link.
|
||||||
|
|
||||||
|
Also modify order of interrupts in accordance to bindings update.
|
||||||
|
Since driver looks up for interrupts by name and not by index, it
|
||||||
|
is safe to modify order of these interrupts in the DT.
|
||||||
|
|
||||||
|
Signed-off-by: Krishna Kurapati <quic_kriskura@quicinc.com>
|
||||||
|
Link: https://lore.kernel.org/r/20240125185921.5062-2-quic_kriskura@quicinc.com
|
||||||
|
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||||
|
---
|
||||||
|
arch/arm64/boot/dts/qcom/ipq6018.dtsi | 13 +++++++++++++
|
||||||
|
arch/arm64/boot/dts/qcom/ipq8074.dtsi | 14 ++++++++++++++
|
||||||
|
arch/arm64/boot/dts/qcom/msm8953.dtsi | 7 +++++--
|
||||||
|
arch/arm64/boot/dts/qcom/msm8996.dtsi | 8 ++++++--
|
||||||
|
arch/arm64/boot/dts/qcom/msm8998.dtsi | 7 +++++--
|
||||||
|
arch/arm64/boot/dts/qcom/sdm630.dtsi | 17 +++++++++++++----
|
||||||
|
arch/arm64/boot/dts/qcom/sm6115.dtsi | 9 +++++++--
|
||||||
|
arch/arm64/boot/dts/qcom/sm6125.dtsi | 9 +++++++--
|
||||||
|
8 files changed, 70 insertions(+), 14 deletions(-)
|
||||||
|
|
||||||
|
--- a/arch/arm64/boot/dts/qcom/ipq6018.dtsi
|
||||||
|
+++ b/arch/arm64/boot/dts/qcom/ipq6018.dtsi
|
||||||
|
@@ -431,6 +431,12 @@
|
||||||
|
<&gcc GCC_USB1_MOCK_UTMI_CLK>;
|
||||||
|
assigned-clock-rates = <133330000>,
|
||||||
|
<24000000>;
|
||||||
|
+
|
||||||
|
+ interrupts = <GIC_SPI 128 IRQ_TYPE_LEVEL_HIGH>,
|
||||||
|
+ <GIC_SPI 130 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
+ interrupt-names = "pwr_event",
|
||||||
|
+ "qusb2_phy";
|
||||||
|
+
|
||||||
|
resets = <&gcc GCC_USB1_BCR>;
|
||||||
|
status = "disabled";
|
||||||
|
|
||||||
|
@@ -629,6 +635,13 @@
|
||||||
|
<133330000>,
|
||||||
|
<24000000>;
|
||||||
|
|
||||||
|
+ interrupts = <GIC_SPI 134 IRQ_TYPE_LEVEL_HIGH>,
|
||||||
|
+ <GIC_SPI 136 IRQ_TYPE_LEVEL_HIGH>,
|
||||||
|
+ <GIC_SPI 220 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
+ interrupt-names = "pwr_event",
|
||||||
|
+ "qusb2_phy",
|
||||||
|
+ "ss_phy_irq";
|
||||||
|
+
|
||||||
|
resets = <&gcc GCC_USB0_BCR>;
|
||||||
|
status = "disabled";
|
||||||
|
|
||||||
|
--- a/arch/arm64/boot/dts/qcom/ipq8074.dtsi
|
||||||
|
+++ b/arch/arm64/boot/dts/qcom/ipq8074.dtsi
|
||||||
|
@@ -632,6 +632,13 @@
|
||||||
|
<133330000>,
|
||||||
|
<19200000>;
|
||||||
|
|
||||||
|
+ interrupts = <GIC_SPI 134 IRQ_TYPE_LEVEL_HIGH>,
|
||||||
|
+ <GIC_SPI 130 IRQ_TYPE_LEVEL_HIGH>,
|
||||||
|
+ <GIC_SPI 220 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
+ interrupt-names = "pwr_event",
|
||||||
|
+ "qusb2_phy",
|
||||||
|
+ "ss_phy_irq";
|
||||||
|
+
|
||||||
|
power-domains = <&gcc USB0_GDSC>;
|
||||||
|
|
||||||
|
resets = <&gcc GCC_USB0_BCR>;
|
||||||
|
@@ -675,6 +682,13 @@
|
||||||
|
<133330000>,
|
||||||
|
<19200000>;
|
||||||
|
|
||||||
|
+ interrupts = <GIC_SPI 128 IRQ_TYPE_LEVEL_HIGH>,
|
||||||
|
+ <GIC_SPI 136 IRQ_TYPE_LEVEL_HIGH>,
|
||||||
|
+ <GIC_SPI 225 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
+ interrupt-names = "pwr_event",
|
||||||
|
+ "qusb2_phy",
|
||||||
|
+ "ss_phy_irq";
|
||||||
|
+
|
||||||
|
power-domains = <&gcc USB1_GDSC>;
|
||||||
|
|
||||||
|
resets = <&gcc GCC_USB1_BCR>;
|
@ -0,0 +1,32 @@
|
|||||||
|
From c3dc3d079d191c9149496b3c7fe1ece909386d93 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Vignesh Viswanathan <quic_viswanat@quicinc.com>
|
||||||
|
Date: Tue, 5 Sep 2023 15:25:35 +0530
|
||||||
|
Subject: [PATCH] hwspinlock: qcom: Remove IPQ6018 SOC specific compatible
|
||||||
|
|
||||||
|
IPQ6018 has 32 tcsr_mutex hwlock registers with stride 0x1000.
|
||||||
|
The compatible string qcom,ipq6018-tcsr-mutex is mapped to
|
||||||
|
of_msm8226_tcsr_mutex which has 32 locks configured with stride of 0x80
|
||||||
|
and doesn't match the HW present in IPQ6018.
|
||||||
|
|
||||||
|
Remove IPQ6018 specific compatible string so that it fallsback to
|
||||||
|
of_tcsr_mutex data which maps to the correct configuration for IPQ6018.
|
||||||
|
|
||||||
|
Fixes: 5d4753f741d8 ("hwspinlock: qcom: add support for MMIO on older SoCs")
|
||||||
|
Signed-off-by: Vignesh Viswanathan <quic_viswanat@quicinc.com>
|
||||||
|
Reviewed-by: Konrad Dybcio <konrad.dybcio@linaro.org>
|
||||||
|
Link: https://lore.kernel.org/r/20230905095535.1263113-3-quic_viswanat@quicinc.com
|
||||||
|
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||||
|
---
|
||||||
|
drivers/hwspinlock/qcom_hwspinlock.c | 1 -
|
||||||
|
1 file changed, 1 deletion(-)
|
||||||
|
|
||||||
|
--- a/drivers/hwspinlock/qcom_hwspinlock.c
|
||||||
|
+++ b/drivers/hwspinlock/qcom_hwspinlock.c
|
||||||
|
@@ -115,7 +115,6 @@ static const struct of_device_id qcom_hw
|
||||||
|
{ .compatible = "qcom,sfpb-mutex", .data = &of_sfpb_mutex },
|
||||||
|
{ .compatible = "qcom,tcsr-mutex", .data = &of_tcsr_mutex },
|
||||||
|
{ .compatible = "qcom,apq8084-tcsr-mutex", .data = &of_msm8226_tcsr_mutex },
|
||||||
|
- { .compatible = "qcom,ipq6018-tcsr-mutex", .data = &of_msm8226_tcsr_mutex },
|
||||||
|
{ .compatible = "qcom,msm8226-tcsr-mutex", .data = &of_msm8226_tcsr_mutex },
|
||||||
|
{ .compatible = "qcom,msm8974-tcsr-mutex", .data = &of_msm8226_tcsr_mutex },
|
||||||
|
{ .compatible = "qcom,msm8994-tcsr-mutex", .data = &of_msm8226_tcsr_mutex },
|
@ -0,0 +1,34 @@
|
|||||||
|
From 0b17197055b528da22e9385200e61b847b499d48 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Mantas Pucka <mantas@8devices.com>
|
||||||
|
Date: Thu, 25 Jan 2024 11:04:11 +0200
|
||||||
|
Subject: [PATCH] arm64: dts: qcom: ipq6018: add tsens node
|
||||||
|
|
||||||
|
IPQ6018 has temperature sensing HW block compatible with IPQ8074. Add
|
||||||
|
node for it.
|
||||||
|
|
||||||
|
Signed-off-by: Mantas Pucka <mantas@8devices.com>
|
||||||
|
Link: https://lore.kernel.org/r/1706173452-1017-3-git-send-email-mantas@8devices.com
|
||||||
|
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||||
|
---
|
||||||
|
arch/arm64/boot/dts/qcom/ipq6018.dtsi | 10 ++++++++++
|
||||||
|
1 file changed, 10 insertions(+)
|
||||||
|
|
||||||
|
--- a/arch/arm64/boot/dts/qcom/ipq6018.dtsi
|
||||||
|
+++ b/arch/arm64/boot/dts/qcom/ipq6018.dtsi
|
||||||
|
@@ -343,6 +343,16 @@
|
||||||
|
clock-names = "core";
|
||||||
|
};
|
||||||
|
|
||||||
|
+ tsens: thermal-sensor@4a9000 {
|
||||||
|
+ compatible = "qcom,ipq6018-tsens", "qcom,ipq8074-tsens";
|
||||||
|
+ reg = <0x0 0x004a9000 0x0 0x1000>,
|
||||||
|
+ <0x0 0x004a8000 0x0 0x1000>;
|
||||||
|
+ interrupts = <GIC_SPI 184 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
+ interrupt-names = "combined";
|
||||||
|
+ #qcom,sensors = <16>;
|
||||||
|
+ #thermal-sensor-cells = <1>;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
cryptobam: dma-controller@704000 {
|
||||||
|
compatible = "qcom,bam-v1.7.0";
|
||||||
|
reg = <0x0 0x00704000 0x0 0x20000>;
|
@ -0,0 +1,180 @@
|
|||||||
|
From 8f053e5616352943e16966f195f5a7a161e6fe7d Mon Sep 17 00:00:00 2001
|
||||||
|
From: Mantas Pucka <mantas@8devices.com>
|
||||||
|
Date: Thu, 25 Jan 2024 11:04:12 +0200
|
||||||
|
Subject: [PATCH] arm64: dts: qcom: ipq6018: add thermal zones
|
||||||
|
|
||||||
|
Add thermal zones to make use of thermal sensors data. For CPU zone,
|
||||||
|
add cooling device that uses CPU frequency scaling.
|
||||||
|
|
||||||
|
Signed-off-by: Mantas Pucka <mantas@8devices.com>
|
||||||
|
Link: https://lore.kernel.org/r/1706173452-1017-4-git-send-email-mantas@8devices.com
|
||||||
|
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||||
|
---
|
||||||
|
arch/arm64/boot/dts/qcom/ipq6018.dtsi | 121 ++++++++++++++++++++++++++
|
||||||
|
1 file changed, 121 insertions(+)
|
||||||
|
|
||||||
|
--- a/arch/arm64/boot/dts/qcom/ipq6018.dtsi
|
||||||
|
+++ b/arch/arm64/boot/dts/qcom/ipq6018.dtsi
|
||||||
|
@@ -9,6 +9,7 @@
|
||||||
|
#include <dt-bindings/clock/qcom,gcc-ipq6018.h>
|
||||||
|
#include <dt-bindings/reset/qcom,gcc-ipq6018.h>
|
||||||
|
#include <dt-bindings/clock/qcom,apss-ipq.h>
|
||||||
|
+#include <dt-bindings/thermal/thermal.h>
|
||||||
|
|
||||||
|
/ {
|
||||||
|
#address-cells = <2>;
|
||||||
|
@@ -43,6 +44,7 @@
|
||||||
|
clock-names = "cpu";
|
||||||
|
operating-points-v2 = <&cpu_opp_table>;
|
||||||
|
cpu-supply = <&ipq6018_s2>;
|
||||||
|
+ #cooling-cells = <2>;
|
||||||
|
};
|
||||||
|
|
||||||
|
CPU1: cpu@1 {
|
||||||
|
@@ -55,6 +57,7 @@
|
||||||
|
clock-names = "cpu";
|
||||||
|
operating-points-v2 = <&cpu_opp_table>;
|
||||||
|
cpu-supply = <&ipq6018_s2>;
|
||||||
|
+ #cooling-cells = <2>;
|
||||||
|
};
|
||||||
|
|
||||||
|
CPU2: cpu@2 {
|
||||||
|
@@ -67,6 +70,7 @@
|
||||||
|
clock-names = "cpu";
|
||||||
|
operating-points-v2 = <&cpu_opp_table>;
|
||||||
|
cpu-supply = <&ipq6018_s2>;
|
||||||
|
+ #cooling-cells = <2>;
|
||||||
|
};
|
||||||
|
|
||||||
|
CPU3: cpu@3 {
|
||||||
|
@@ -79,6 +83,7 @@
|
||||||
|
clock-names = "cpu";
|
||||||
|
operating-points-v2 = <&cpu_opp_table>;
|
||||||
|
cpu-supply = <&ipq6018_s2>;
|
||||||
|
+ #cooling-cells = <2>;
|
||||||
|
};
|
||||||
|
|
||||||
|
L2_0: l2-cache {
|
||||||
|
@@ -890,6 +895,122 @@
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
+ thermal-zones {
|
||||||
|
+ nss-top-thermal {
|
||||||
|
+ polling-delay-passive = <250>;
|
||||||
|
+ polling-delay = <1000>;
|
||||||
|
+ thermal-sensors = <&tsens 4>;
|
||||||
|
+
|
||||||
|
+ trips {
|
||||||
|
+ nss-top-critical {
|
||||||
|
+ temperature = <125000>;
|
||||||
|
+ hysteresis = <1000>;
|
||||||
|
+ type = "critical";
|
||||||
|
+ };
|
||||||
|
+ };
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ nss-thermal {
|
||||||
|
+ polling-delay-passive = <250>;
|
||||||
|
+ polling-delay = <1000>;
|
||||||
|
+ thermal-sensors = <&tsens 5>;
|
||||||
|
+
|
||||||
|
+ trips {
|
||||||
|
+ nss-critical {
|
||||||
|
+ temperature = <125000>;
|
||||||
|
+ hysteresis = <1000>;
|
||||||
|
+ type = "critical";
|
||||||
|
+ };
|
||||||
|
+ };
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ wcss-phya0-thermal {
|
||||||
|
+ polling-delay-passive = <250>;
|
||||||
|
+ polling-delay = <1000>;
|
||||||
|
+ thermal-sensors = <&tsens 7>;
|
||||||
|
+
|
||||||
|
+ trips {
|
||||||
|
+ wcss-phya0-critical {
|
||||||
|
+ temperature = <125000>;
|
||||||
|
+ hysteresis = <1000>;
|
||||||
|
+ type = "critical";
|
||||||
|
+ };
|
||||||
|
+ };
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ wcss-phya1-thermal {
|
||||||
|
+ polling-delay-passive = <250>;
|
||||||
|
+ polling-delay = <1000>;
|
||||||
|
+ thermal-sensors = <&tsens 8>;
|
||||||
|
+
|
||||||
|
+ trips {
|
||||||
|
+ wcss-phya1-critical {
|
||||||
|
+ temperature = <125000>;
|
||||||
|
+ hysteresis = <1000>;
|
||||||
|
+ type = "critical";
|
||||||
|
+ };
|
||||||
|
+ };
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ cpu-thermal {
|
||||||
|
+ polling-delay-passive = <250>;
|
||||||
|
+ polling-delay = <1000>;
|
||||||
|
+ thermal-sensors = <&tsens 13>;
|
||||||
|
+
|
||||||
|
+ trips {
|
||||||
|
+ cpu-critical {
|
||||||
|
+ temperature = <125000>;
|
||||||
|
+ hysteresis = <1000>;
|
||||||
|
+ type = "critical";
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ cpu_alert: cpu-passive {
|
||||||
|
+ temperature = <110000>;
|
||||||
|
+ hysteresis = <1000>;
|
||||||
|
+ type = "passive";
|
||||||
|
+ };
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ cooling-maps {
|
||||||
|
+ map0 {
|
||||||
|
+ trip = <&cpu_alert>;
|
||||||
|
+ cooling-device = <&CPU0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
|
||||||
|
+ <&CPU1 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
|
||||||
|
+ <&CPU2 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
|
||||||
|
+ <&CPU3 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
|
||||||
|
+ };
|
||||||
|
+ };
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ lpass-thermal {
|
||||||
|
+ polling-delay-passive = <250>;
|
||||||
|
+ polling-delay = <1000>;
|
||||||
|
+ thermal-sensors = <&tsens 14>;
|
||||||
|
+
|
||||||
|
+ trips {
|
||||||
|
+ lpass-critical {
|
||||||
|
+ temperature = <125000>;
|
||||||
|
+ hysteresis = <1000>;
|
||||||
|
+ type = "critical";
|
||||||
|
+ };
|
||||||
|
+ };
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ ddrss-top-thermal {
|
||||||
|
+ polling-delay-passive = <250>;
|
||||||
|
+ polling-delay = <1000>;
|
||||||
|
+ thermal-sensors = <&tsens 15>;
|
||||||
|
+
|
||||||
|
+ trips {
|
||||||
|
+ ddrss-top-critical {
|
||||||
|
+ temperature = <125000>;
|
||||||
|
+ hysteresis = <1000>;
|
||||||
|
+ type = "critical";
|
||||||
|
+ };
|
||||||
|
+ };
|
||||||
|
+ };
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
timer {
|
||||||
|
compatible = "arm,armv8-timer";
|
||||||
|
interrupts = <GIC_PPI 2 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>,
|
@ -0,0 +1,50 @@
|
|||||||
|
From fd712118aa1aa758da1fd1546b3f8a1b00e42cbc Mon Sep 17 00:00:00 2001
|
||||||
|
From: Mantas Pucka <mantas@8devices.com>
|
||||||
|
Date: Tue, 23 Jan 2024 11:26:09 +0200
|
||||||
|
Subject: [PATCH] clk: qcom: gcc-ipq6018: add qdss_at clock needed for wifi
|
||||||
|
operation
|
||||||
|
|
||||||
|
Without it system hangs upon wifi firmware load. It should be enabled by
|
||||||
|
remoteproc/wifi driver. Bindings already exist for it, so add it based
|
||||||
|
on vendor code.
|
||||||
|
|
||||||
|
Signed-off-by: Mantas Pucka <mantas@8devices.com>
|
||||||
|
Link: https://lore.kernel.org/r/1706001970-26032-1-git-send-email-mantas@8devices.com
|
||||||
|
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||||
|
---
|
||||||
|
drivers/clk/qcom/gcc-ipq6018.c | 17 +++++++++++++++++
|
||||||
|
1 file changed, 17 insertions(+)
|
||||||
|
|
||||||
|
--- a/drivers/clk/qcom/gcc-ipq6018.c
|
||||||
|
+++ b/drivers/clk/qcom/gcc-ipq6018.c
|
||||||
|
@@ -3524,6 +3524,22 @@ static struct clk_branch gcc_prng_ahb_cl
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
+static struct clk_branch gcc_qdss_at_clk = {
|
||||||
|
+ .halt_reg = 0x29024,
|
||||||
|
+ .clkr = {
|
||||||
|
+ .enable_reg = 0x29024,
|
||||||
|
+ .enable_mask = BIT(0),
|
||||||
|
+ .hw.init = &(struct clk_init_data){
|
||||||
|
+ .name = "gcc_qdss_at_clk",
|
||||||
|
+ .parent_hws = (const struct clk_hw *[]){
|
||||||
|
+ &qdss_at_clk_src.clkr.hw },
|
||||||
|
+ .num_parents = 1,
|
||||||
|
+ .flags = CLK_SET_RATE_PARENT,
|
||||||
|
+ .ops = &clk_branch2_ops,
|
||||||
|
+ },
|
||||||
|
+ },
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
static struct clk_branch gcc_qdss_dap_clk = {
|
||||||
|
.halt_reg = 0x29084,
|
||||||
|
.clkr = {
|
||||||
|
@@ -4363,6 +4379,7 @@ static struct clk_regmap *gcc_ipq6018_cl
|
||||||
|
[GCC_SYS_NOC_PCIE0_AXI_CLK] = &gcc_sys_noc_pcie0_axi_clk.clkr,
|
||||||
|
[GCC_PCIE0_PIPE_CLK] = &gcc_pcie0_pipe_clk.clkr,
|
||||||
|
[GCC_PRNG_AHB_CLK] = &gcc_prng_ahb_clk.clkr,
|
||||||
|
+ [GCC_QDSS_AT_CLK] = &gcc_qdss_at_clk.clkr,
|
||||||
|
[GCC_QDSS_DAP_CLK] = &gcc_qdss_dap_clk.clkr,
|
||||||
|
[GCC_QPIC_AHB_CLK] = &gcc_qpic_ahb_clk.clkr,
|
||||||
|
[GCC_QPIC_CLK] = &gcc_qpic_clk.clkr,
|
@ -0,0 +1,58 @@
|
|||||||
|
From 62a5df451ab911421da96655fcc4d1e269ff6e2f Mon Sep 17 00:00:00 2001
|
||||||
|
From: Mantas Pucka <mantas@8devices.com>
|
||||||
|
Date: Tue, 23 Jan 2024 18:09:20 +0200
|
||||||
|
Subject: [PATCH] phy: qcom-qmp-usb: fix serdes init sequence for IPQ6018
|
||||||
|
|
||||||
|
Commit 23fd679249df ("phy: qcom-qmp: add USB3 PHY support for IPQ6018")
|
||||||
|
noted that IPQ6018 init is identical to IPQ8074. Yet downstream uses
|
||||||
|
separate serdes init sequence for IPQ6018. Since already existing IPQ9574
|
||||||
|
serdes init sequence is identical, just reuse it and fix failing USB3 mode
|
||||||
|
in IPQ6018.
|
||||||
|
|
||||||
|
Fixes: 23fd679249df ("phy: qcom-qmp: add USB3 PHY support for IPQ6018")
|
||||||
|
Signed-off-by: Mantas Pucka <mantas@8devices.com>
|
||||||
|
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
|
||||||
|
Link: https://lore.kernel.org/r/1706026160-17520-3-git-send-email-mantas@8devices.com
|
||||||
|
Signed-off-by: Vinod Koul <vkoul@kernel.org>
|
||||||
|
---
|
||||||
|
drivers/phy/qualcomm/phy-qcom-qmp-usb.c | 20 +++++++++++++++++++-
|
||||||
|
1 file changed, 19 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
--- a/drivers/phy/qualcomm/phy-qcom-qmp-usb.c
|
||||||
|
+++ b/drivers/phy/qualcomm/phy-qcom-qmp-usb.c
|
||||||
|
@@ -1314,6 +1314,26 @@ static const struct qmp_usb_offsets qmp_
|
||||||
|
.rx = 0x1000,
|
||||||
|
};
|
||||||
|
|
||||||
|
+static const struct qmp_phy_cfg ipq6018_usb3phy_cfg = {
|
||||||
|
+ .lanes = 1,
|
||||||
|
+
|
||||||
|
+ .serdes_tbl = ipq9574_usb3_serdes_tbl,
|
||||||
|
+ .serdes_tbl_num = ARRAY_SIZE(ipq9574_usb3_serdes_tbl),
|
||||||
|
+ .tx_tbl = msm8996_usb3_tx_tbl,
|
||||||
|
+ .tx_tbl_num = ARRAY_SIZE(msm8996_usb3_tx_tbl),
|
||||||
|
+ .rx_tbl = ipq8074_usb3_rx_tbl,
|
||||||
|
+ .rx_tbl_num = ARRAY_SIZE(ipq8074_usb3_rx_tbl),
|
||||||
|
+ .pcs_tbl = ipq8074_usb3_pcs_tbl,
|
||||||
|
+ .pcs_tbl_num = ARRAY_SIZE(ipq8074_usb3_pcs_tbl),
|
||||||
|
+ .clk_list = msm8996_phy_clk_l,
|
||||||
|
+ .num_clks = ARRAY_SIZE(msm8996_phy_clk_l),
|
||||||
|
+ .reset_list = msm8996_usb3phy_reset_l,
|
||||||
|
+ .num_resets = ARRAY_SIZE(msm8996_usb3phy_reset_l),
|
||||||
|
+ .vreg_list = qmp_phy_vreg_l,
|
||||||
|
+ .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
|
||||||
|
+ .regs = qmp_v3_usb3phy_regs_layout,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
static const struct qmp_phy_cfg ipq8074_usb3phy_cfg = {
|
||||||
|
.lanes = 1,
|
||||||
|
|
||||||
|
@@ -2238,7 +2258,7 @@ err_node_put:
|
||||||
|
static const struct of_device_id qmp_usb_of_match_table[] = {
|
||||||
|
{
|
||||||
|
.compatible = "qcom,ipq6018-qmp-usb3-phy",
|
||||||
|
- .data = &ipq8074_usb3phy_cfg,
|
||||||
|
+ .data = &ipq6018_usb3phy_cfg,
|
||||||
|
}, {
|
||||||
|
.compatible = "qcom,ipq8074-qmp-usb3-phy",
|
||||||
|
.data = &ipq8074_usb3phy_cfg,
|
@ -0,0 +1,38 @@
|
|||||||
|
From 6a25e70214fde6dcf900271c819c8d7fe7b9a4b0 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Robert Marko <robimarko@gmail.com>
|
||||||
|
Date: Thu, 23 Nov 2023 13:12:54 +0100
|
||||||
|
Subject: [PATCH] arm64: dts: qcom: ipq8074: Add QUP4 SPI node
|
||||||
|
|
||||||
|
Add node to support the QUP4 SPI controller inside of IPQ8074.
|
||||||
|
Some devices use this bus to communicate to a Bluetooth controller.
|
||||||
|
|
||||||
|
Signed-off-by: Robert Marko <robimarko@gmail.com>
|
||||||
|
Link: https://lore.kernel.org/r/20231123121324.1046164-1-robimarko@gmail.com
|
||||||
|
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||||
|
---
|
||||||
|
arch/arm64/boot/dts/qcom/ipq8074.dtsi | 14 ++++++++++++++
|
||||||
|
1 file changed, 14 insertions(+)
|
||||||
|
|
||||||
|
--- a/arch/arm64/boot/dts/qcom/ipq8074.dtsi
|
||||||
|
+++ b/arch/arm64/boot/dts/qcom/ipq8074.dtsi
|
||||||
|
@@ -536,6 +536,20 @@
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
|
+ blsp1_spi4: spi@78b8000 {
|
||||||
|
+ compatible = "qcom,spi-qup-v2.2.1";
|
||||||
|
+ #address-cells = <1>;
|
||||||
|
+ #size-cells = <0>;
|
||||||
|
+ reg = <0x78b8000 0x600>;
|
||||||
|
+ interrupts = <GIC_SPI 98 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
+ clocks = <&gcc GCC_BLSP1_QUP4_SPI_APPS_CLK>,
|
||||||
|
+ <&gcc GCC_BLSP1_AHB_CLK>;
|
||||||
|
+ clock-names = "core", "iface";
|
||||||
|
+ dmas = <&blsp_dma 18>, <&blsp_dma 19>;
|
||||||
|
+ dma-names = "tx", "rx";
|
||||||
|
+ status = "disabled";
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
blsp1_i2c5: i2c@78b9000 {
|
||||||
|
compatible = "qcom,i2c-qup-v2.2.1";
|
||||||
|
#address-cells = <1>;
|
@ -0,0 +1,32 @@
|
|||||||
|
From 5f78d9213ae753e2242b0f6a5d4a5e98e55ddc76 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Paweł Owoc <frut3k7@gmail.com>
|
||||||
|
Date: Wed, 13 Mar 2024 11:27:06 +0100
|
||||||
|
Subject: [PATCH] arm64: dts: qcom: ipq8074: Remove unused gpio from QPIC pins
|
||||||
|
|
||||||
|
gpio16 will only be used for LCD support, as its NAND/LCDC data[8]
|
||||||
|
so its bit 9 of the parallel QPIC interface, and ONFI NAND is only 8
|
||||||
|
or 16-bit with only 8-bit one being supported in our case so that pin
|
||||||
|
is unused.
|
||||||
|
|
||||||
|
It should be dropped from the default NAND pinctrl configuration
|
||||||
|
as its unused and only needed for LCD.
|
||||||
|
|
||||||
|
Signed-off-by: Paweł Owoc <frut3k7@gmail.com>
|
||||||
|
Reviewed-by: Kathiravan Thirumoorthy <quic_kathirav@quicinc.com>
|
||||||
|
Link: https://lore.kernel.org/r/20240313102713.1727458-1-frut3k7@gmail.com
|
||||||
|
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||||
|
---
|
||||||
|
arch/arm64/boot/dts/qcom/ipq8074.dtsi | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
--- a/arch/arm64/boot/dts/qcom/ipq8074.dtsi
|
||||||
|
+++ b/arch/arm64/boot/dts/qcom/ipq8074.dtsi
|
||||||
|
@@ -372,7 +372,7 @@
|
||||||
|
"gpio5", "gpio6", "gpio7",
|
||||||
|
"gpio8", "gpio10", "gpio11",
|
||||||
|
"gpio12", "gpio13", "gpio14",
|
||||||
|
- "gpio15", "gpio16", "gpio17";
|
||||||
|
+ "gpio15", "gpio17";
|
||||||
|
function = "qpic";
|
||||||
|
drive-strength = <8>;
|
||||||
|
bias-disable;
|
@ -0,0 +1,33 @@
|
|||||||
|
From 9cbaee8379e620f82112002f973adde19679df31 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Robert Marko <robimarko@gmail.com>
|
||||||
|
Date: Wed, 16 Aug 2023 18:14:00 +0200
|
||||||
|
Subject: [PATCH] arm64: dts: qcom: ipq5018: add watchdog
|
||||||
|
|
||||||
|
Add the required DT node for watchdog operation.
|
||||||
|
|
||||||
|
Signed-off-by: Robert Marko <robimarko@gmail.com>
|
||||||
|
Reviewed-by: Konrad Dybcio <konrad.dybcio@linaro.org>
|
||||||
|
Link: https://lore.kernel.org/r/20230816161455.3310629-2-robimarko@gmail.com
|
||||||
|
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||||
|
---
|
||||||
|
arch/arm64/boot/dts/qcom/ipq5018.dtsi | 7 +++++++
|
||||||
|
1 file changed, 7 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/arch/arm64/boot/dts/qcom/ipq5018.dtsi b/arch/arm64/boot/dts/qcom/ipq5018.dtsi
|
||||||
|
index 9f13d2dcdfd589..288758c91379df 100644
|
||||||
|
--- a/arch/arm64/boot/dts/qcom/ipq5018.dtsi
|
||||||
|
+++ b/arch/arm64/boot/dts/qcom/ipq5018.dtsi
|
||||||
|
@@ -181,6 +181,13 @@
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
+ watchdog: watchdog@b017000 {
|
||||||
|
+ compatible = "qcom,apss-wdt-ipq5018", "qcom,kpss-wdt";
|
||||||
|
+ reg = <0x0b017000 0x40>;
|
||||||
|
+ interrupts = <GIC_SPI 3 IRQ_TYPE_EDGE_RISING>;
|
||||||
|
+ clocks = <&sleep_clk>;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
timer@b120000 {
|
||||||
|
compatible = "arm,armv7-timer-mem";
|
||||||
|
reg = <0x0b120000 0x1000>;
|
@ -0,0 +1,41 @@
|
|||||||
|
From 92dab9ea5f389c12828283146c60054642453a91 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Robert Marko <robimarko@gmail.com>
|
||||||
|
Date: Wed, 16 Aug 2023 18:45:38 +0200
|
||||||
|
Subject: [PATCH] dt-bindings: firmware: qcom,scm: support indicating SDI
|
||||||
|
default state
|
||||||
|
|
||||||
|
IPQ5018 has SDI (Secure Debug Image) enabled by TZ by default, and that
|
||||||
|
means that WDT being asserted or just trying to reboot will hang the board
|
||||||
|
in the debug mode and only pulling the power and repowering will help.
|
||||||
|
Some IPQ4019 boards like Google WiFI have it enabled as well.
|
||||||
|
|
||||||
|
So, lets add a boolean property to indicate that SDI is enabled by default
|
||||||
|
and thus needs to be disabled by the kernel.
|
||||||
|
|
||||||
|
Signed-off-by: Robert Marko <robimarko@gmail.com>
|
||||||
|
Acked-by: Mukesh Ojha <quic_mojha@quicinc.com>
|
||||||
|
Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
|
||||||
|
Reviewed-by: Brian Norris <computersforpeace@gmail.com>
|
||||||
|
Link: https://lore.kernel.org/r/20230816164641.3371878-1-robimarko@gmail.com
|
||||||
|
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||||
|
---
|
||||||
|
Documentation/devicetree/bindings/firmware/qcom,scm.yaml | 8 ++++++++
|
||||||
|
1 file changed, 8 insertions(+)
|
||||||
|
|
||||||
|
--- a/Documentation/devicetree/bindings/firmware/qcom,scm.yaml
|
||||||
|
+++ b/Documentation/devicetree/bindings/firmware/qcom,scm.yaml
|
||||||
|
@@ -89,6 +89,14 @@ properties:
|
||||||
|
protocol to handle sleeping SCM calls.
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
+ qcom,sdi-enabled:
|
||||||
|
+ description:
|
||||||
|
+ Indicates that the SDI (Secure Debug Image) has been enabled by TZ
|
||||||
|
+ by default and it needs to be disabled.
|
||||||
|
+ If not disabled WDT assertion or reboot will cause the board to hang
|
||||||
|
+ in the debug mode.
|
||||||
|
+ type: boolean
|
||||||
|
+
|
||||||
|
qcom,dload-mode:
|
||||||
|
$ref: /schemas/types.yaml#/definitions/phandle-array
|
||||||
|
items:
|
@ -0,0 +1,83 @@
|
|||||||
|
From ff4aa3bc98258a240b9bbab53fd8d2fb8184c485 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Robert Marko <robimarko@gmail.com>
|
||||||
|
Date: Wed, 16 Aug 2023 18:45:39 +0200
|
||||||
|
Subject: [PATCH] firmware: qcom_scm: disable SDI if required
|
||||||
|
|
||||||
|
IPQ5018 has SDI (Secure Debug Image) enabled by TZ by default, and that
|
||||||
|
means that WDT being asserted or just trying to reboot will hang the board
|
||||||
|
in the debug mode and only pulling the power and repowering will help.
|
||||||
|
Some IPQ4019 boards like Google WiFI have it enabled as well.
|
||||||
|
|
||||||
|
Luckily, SDI can be disabled via an SCM call.
|
||||||
|
|
||||||
|
So, lets use the boolean DT property to identify boards that have SDI
|
||||||
|
enabled by default and use the SCM call to disable SDI during SCM probe.
|
||||||
|
It is important to disable it as soon as possible as we might have a WDT
|
||||||
|
assertion at any time which would then leave the board in debug mode,
|
||||||
|
thus disabling it during SCM removal is not enough.
|
||||||
|
|
||||||
|
Signed-off-by: Robert Marko <robimarko@gmail.com>
|
||||||
|
Reviewed-by: Guru Das Srinagesh <quic_gurus@quicinc.com>
|
||||||
|
Link: https://lore.kernel.org/r/20230816164641.3371878-2-robimarko@gmail.com
|
||||||
|
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||||
|
---
|
||||||
|
drivers/firmware/qcom_scm.c | 30 ++++++++++++++++++++++++++++++
|
||||||
|
drivers/firmware/qcom_scm.h | 1 +
|
||||||
|
2 files changed, 31 insertions(+)
|
||||||
|
|
||||||
|
--- a/drivers/firmware/qcom_scm.c
|
||||||
|
+++ b/drivers/firmware/qcom_scm.c
|
||||||
|
@@ -410,6 +410,29 @@ int qcom_scm_set_remote_state(u32 state,
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(qcom_scm_set_remote_state);
|
||||||
|
|
||||||
|
+static int qcom_scm_disable_sdi(void)
|
||||||
|
+{
|
||||||
|
+ int ret;
|
||||||
|
+ struct qcom_scm_desc desc = {
|
||||||
|
+ .svc = QCOM_SCM_SVC_BOOT,
|
||||||
|
+ .cmd = QCOM_SCM_BOOT_SDI_CONFIG,
|
||||||
|
+ .args[0] = 1, /* Disable watchdog debug */
|
||||||
|
+ .args[1] = 0, /* Disable SDI */
|
||||||
|
+ .arginfo = QCOM_SCM_ARGS(2),
|
||||||
|
+ .owner = ARM_SMCCC_OWNER_SIP,
|
||||||
|
+ };
|
||||||
|
+ struct qcom_scm_res res;
|
||||||
|
+
|
||||||
|
+ ret = qcom_scm_clk_enable();
|
||||||
|
+ if (ret)
|
||||||
|
+ return ret;
|
||||||
|
+ ret = qcom_scm_call(__scm->dev, &desc, &res);
|
||||||
|
+
|
||||||
|
+ qcom_scm_clk_disable();
|
||||||
|
+
|
||||||
|
+ return ret ? : res.result[0];
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static int __qcom_scm_set_dload_mode(struct device *dev, bool enable)
|
||||||
|
{
|
||||||
|
struct qcom_scm_desc desc = {
|
||||||
|
@@ -1473,6 +1496,13 @@ static int qcom_scm_probe(struct platfor
|
||||||
|
|
||||||
|
__get_convention();
|
||||||
|
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
+ * Disable SDI if indicated by DT that it is enabled by default.
|
||||||
|
+ */
|
||||||
|
+ if (of_property_read_bool(pdev->dev.of_node, "qcom,sdi-enabled"))
|
||||||
|
+ qcom_scm_disable_sdi();
|
||||||
|
+
|
||||||
|
/*
|
||||||
|
* If requested enable "download mode", from this point on warmboot
|
||||||
|
* will cause the boot stages to enter download mode, unless
|
||||||
|
--- a/drivers/firmware/qcom_scm.h
|
||||||
|
+++ b/drivers/firmware/qcom_scm.h
|
||||||
|
@@ -80,6 +80,7 @@ extern int scm_legacy_call(struct device
|
||||||
|
#define QCOM_SCM_SVC_BOOT 0x01
|
||||||
|
#define QCOM_SCM_BOOT_SET_ADDR 0x01
|
||||||
|
#define QCOM_SCM_BOOT_TERMINATE_PC 0x02
|
||||||
|
+#define QCOM_SCM_BOOT_SDI_CONFIG 0x09
|
||||||
|
#define QCOM_SCM_BOOT_SET_DLOAD_MODE 0x10
|
||||||
|
#define QCOM_SCM_BOOT_SET_ADDR_MC 0x11
|
||||||
|
#define QCOM_SCM_BOOT_SET_REMOTE_STATE 0x0a
|
@ -0,0 +1,27 @@
|
|||||||
|
From f6aa7386bc40b552eea8ec1b1d2168afe3b31110 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Robert Marko <robimarko@gmail.com>
|
||||||
|
Date: Wed, 16 Aug 2023 18:45:40 +0200
|
||||||
|
Subject: [PATCH] dt-bindings: firmware: qcom,scm: document IPQ5018 compatible
|
||||||
|
|
||||||
|
It seems that IPQ5018 compatible was never documented in the bindings.
|
||||||
|
|
||||||
|
Signed-off-by: Robert Marko <robimarko@gmail.com>
|
||||||
|
Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
|
||||||
|
Link: https://lore.kernel.org/r/20230816164641.3371878-3-robimarko@gmail.com
|
||||||
|
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||||
|
---
|
||||||
|
Documentation/devicetree/bindings/firmware/qcom,scm.yaml | 1 +
|
||||||
|
1 file changed, 1 insertion(+)
|
||||||
|
|
||||||
|
diff --git a/Documentation/devicetree/bindings/firmware/qcom,scm.yaml b/Documentation/devicetree/bindings/firmware/qcom,scm.yaml
|
||||||
|
index cb706145ae04c1..0613a37a851af4 100644
|
||||||
|
--- a/Documentation/devicetree/bindings/firmware/qcom,scm.yaml
|
||||||
|
+++ b/Documentation/devicetree/bindings/firmware/qcom,scm.yaml
|
||||||
|
@@ -24,6 +24,7 @@ properties:
|
||||||
|
- qcom,scm-apq8064
|
||||||
|
- qcom,scm-apq8084
|
||||||
|
- qcom,scm-ipq4019
|
||||||
|
+ - qcom,scm-ipq5018
|
||||||
|
- qcom,scm-ipq5332
|
||||||
|
- qcom,scm-ipq6018
|
||||||
|
- qcom,scm-ipq806x
|
@ -0,0 +1,28 @@
|
|||||||
|
From 79796e87215db9587d6c66ec6f6781e091bc6464 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Robert Marko <robimarko@gmail.com>
|
||||||
|
Date: Wed, 16 Aug 2023 18:45:41 +0200
|
||||||
|
Subject: [PATCH] arm64: dts: qcom: ipq5018: indicate that SDI should be
|
||||||
|
disabled
|
||||||
|
|
||||||
|
Now that SCM has support for indicating that SDI has been enabled by
|
||||||
|
default, lets set the property so SCM disables it during probing.
|
||||||
|
|
||||||
|
Signed-off-by: Robert Marko <robimarko@gmail.com>
|
||||||
|
Link: https://lore.kernel.org/r/20230816164641.3371878-4-robimarko@gmail.com
|
||||||
|
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||||
|
---
|
||||||
|
arch/arm64/boot/dts/qcom/ipq5018.dtsi | 1 +
|
||||||
|
1 file changed, 1 insertion(+)
|
||||||
|
|
||||||
|
diff --git a/arch/arm64/boot/dts/qcom/ipq5018.dtsi b/arch/arm64/boot/dts/qcom/ipq5018.dtsi
|
||||||
|
index 288758c91379df..38ffdc3cbdcd7c 100644
|
||||||
|
--- a/arch/arm64/boot/dts/qcom/ipq5018.dtsi
|
||||||
|
+++ b/arch/arm64/boot/dts/qcom/ipq5018.dtsi
|
||||||
|
@@ -57,6 +57,7 @@
|
||||||
|
firmware {
|
||||||
|
scm {
|
||||||
|
compatible = "qcom,scm-ipq5018", "qcom,scm";
|
||||||
|
+ qcom,sdi-enabled;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
@ -0,0 +1,30 @@
|
|||||||
|
From 1852dfaacd3f4358bbfca134b63a02bbb30c1136 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Nitheesh Sekar <quic_nsekar@quicinc.com>
|
||||||
|
Date: Mon, 4 Sep 2023 12:06:32 +0530
|
||||||
|
Subject: [PATCH] dt-bindings: phy: qcom,m31: Add IPQ5018 compatible
|
||||||
|
|
||||||
|
IPQ5332 qcom,m31 phy driver can support IPQ5018.
|
||||||
|
|
||||||
|
Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
|
||||||
|
Signed-off-by: Nitheesh Sekar <quic_nsekar@quicinc.com>
|
||||||
|
Link: https://lore.kernel.org/r/20230904063635.24975-2-quic_nsekar@quicinc.com
|
||||||
|
Signed-off-by: Vinod Koul <vkoul@kernel.org>
|
||||||
|
---
|
||||||
|
.../devicetree/bindings/phy/qcom,ipq5332-usb-hsphy.yaml | 4 +++-
|
||||||
|
1 file changed, 3 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/Documentation/devicetree/bindings/phy/qcom,ipq5332-usb-hsphy.yaml b/Documentation/devicetree/bindings/phy/qcom,ipq5332-usb-hsphy.yaml
|
||||||
|
index 2671a048c926c2..e77576d06c0e4e 100644
|
||||||
|
--- a/Documentation/devicetree/bindings/phy/qcom,ipq5332-usb-hsphy.yaml
|
||||||
|
+++ b/Documentation/devicetree/bindings/phy/qcom,ipq5332-usb-hsphy.yaml
|
||||||
|
@@ -17,7 +17,9 @@ description:
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
items:
|
||||||
|
- - const: qcom,ipq5332-usb-hsphy
|
||||||
|
+ - enum:
|
||||||
|
+ - qcom,ipq5018-usb-hsphy
|
||||||
|
+ - qcom,ipq5332-usb-hsphy
|
||||||
|
|
||||||
|
"#phy-cells":
|
||||||
|
const: 0
|
@ -0,0 +1,89 @@
|
|||||||
|
From 68320e35f8cb1987b4ad34347fc7033832da99e3 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Nitheesh Sekar <quic_nsekar@quicinc.com>
|
||||||
|
Date: Mon, 4 Sep 2023 12:06:33 +0530
|
||||||
|
Subject: [PATCH] phy: qcom-m31: Add compatible, phy init sequence for IPQ5018
|
||||||
|
|
||||||
|
Add phy init sequence and compatible string for IPQ5018
|
||||||
|
chipset.
|
||||||
|
|
||||||
|
Signed-off-by: Nitheesh Sekar <quic_nsekar@quicinc.com>
|
||||||
|
Link: https://lore.kernel.org/r/20230904063635.24975-3-quic_nsekar@quicinc.com
|
||||||
|
Signed-off-by: Vinod Koul <vkoul@kernel.org>
|
||||||
|
---
|
||||||
|
drivers/phy/qualcomm/phy-qcom-m31.c | 51 +++++++++++++++++++++++++++++
|
||||||
|
1 file changed, 51 insertions(+)
|
||||||
|
|
||||||
|
--- a/drivers/phy/qualcomm/phy-qcom-m31.c
|
||||||
|
+++ b/drivers/phy/qualcomm/phy-qcom-m31.c
|
||||||
|
@@ -82,6 +82,50 @@ struct m31_priv_data {
|
||||||
|
unsigned int nregs;
|
||||||
|
};
|
||||||
|
|
||||||
|
+static const struct m31_phy_regs m31_ipq5018_regs[] = {
|
||||||
|
+ {
|
||||||
|
+ .off = USB_PHY_CFG0,
|
||||||
|
+ .val = UTMI_PHY_OVERRIDE_EN
|
||||||
|
+ },
|
||||||
|
+ {
|
||||||
|
+ .off = USB_PHY_UTMI_CTRL5,
|
||||||
|
+ .val = POR_EN,
|
||||||
|
+ .delay = 15
|
||||||
|
+ },
|
||||||
|
+ {
|
||||||
|
+ .off = USB_PHY_FSEL_SEL,
|
||||||
|
+ .val = FREQ_SEL
|
||||||
|
+ },
|
||||||
|
+ {
|
||||||
|
+ .off = USB_PHY_HS_PHY_CTRL_COMMON0,
|
||||||
|
+ .val = COMMONONN | FSEL | RETENABLEN
|
||||||
|
+ },
|
||||||
|
+ {
|
||||||
|
+ .off = USB_PHY_REFCLK_CTRL,
|
||||||
|
+ .val = CLKCORE
|
||||||
|
+ },
|
||||||
|
+ {
|
||||||
|
+ .off = USB_PHY_UTMI_CTRL5,
|
||||||
|
+ .val = POR_EN
|
||||||
|
+ },
|
||||||
|
+ {
|
||||||
|
+ .off = USB_PHY_HS_PHY_CTRL2,
|
||||||
|
+ .val = USB2_SUSPEND_N_SEL | USB2_SUSPEND_N | USB2_UTMI_CLK_EN
|
||||||
|
+ },
|
||||||
|
+ {
|
||||||
|
+ .off = USB_PHY_UTMI_CTRL5,
|
||||||
|
+ .val = 0x0
|
||||||
|
+ },
|
||||||
|
+ {
|
||||||
|
+ .off = USB_PHY_HS_PHY_CTRL2,
|
||||||
|
+ .val = USB2_SUSPEND_N | USB2_UTMI_CLK_EN
|
||||||
|
+ },
|
||||||
|
+ {
|
||||||
|
+ .off = USB_PHY_CFG0,
|
||||||
|
+ .val = 0x0
|
||||||
|
+ },
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
static struct m31_phy_regs m31_ipq5332_regs[] = {
|
||||||
|
{
|
||||||
|
USB_PHY_CFG0,
|
||||||
|
@@ -267,6 +311,12 @@ static int m31usb_phy_probe(struct platf
|
||||||
|
return PTR_ERR_OR_ZERO(phy_provider);
|
||||||
|
}
|
||||||
|
|
||||||
|
+static const struct m31_priv_data m31_ipq5018_data = {
|
||||||
|
+ .ulpi_mode = false,
|
||||||
|
+ .regs = m31_ipq5018_regs,
|
||||||
|
+ .nregs = ARRAY_SIZE(m31_ipq5018_regs),
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
static const struct m31_priv_data m31_ipq5332_data = {
|
||||||
|
.ulpi_mode = false,
|
||||||
|
.regs = m31_ipq5332_regs,
|
||||||
|
@@ -274,6 +324,7 @@ static const struct m31_priv_data m31_ip
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct of_device_id m31usb_phy_id_table[] = {
|
||||||
|
+ { .compatible = "qcom,ipq5018-usb-hsphy", .data = &m31_ipq5018_data },
|
||||||
|
{ .compatible = "qcom,ipq5332-usb-hsphy", .data = &m31_ipq5332_data },
|
||||||
|
{ },
|
||||||
|
};
|
@ -0,0 +1,43 @@
|
|||||||
|
From 3865a64284cc4845c61cf3dc6c7246349d80cc49 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Nitheesh Sekar <quic_nsekar@quicinc.com>
|
||||||
|
Date: Thu, 31 Aug 2023 08:35:03 +0530
|
||||||
|
Subject: [PATCH] dt-bindings: usb: dwc3: Add IPQ5018 compatible
|
||||||
|
|
||||||
|
Document the IPQ5018 dwc3 compatible.
|
||||||
|
|
||||||
|
Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
|
||||||
|
Signed-off-by: Nitheesh Sekar <quic_nsekar@quicinc.com>
|
||||||
|
Link: https://lore.kernel.org/r/20230831030503.17100-1-quic_nsekar@quicinc.com
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
|
---
|
||||||
|
Documentation/devicetree/bindings/usb/qcom,dwc3.yaml | 3 +++
|
||||||
|
1 file changed, 3 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/Documentation/devicetree/bindings/usb/qcom,dwc3.yaml b/Documentation/devicetree/bindings/usb/qcom,dwc3.yaml
|
||||||
|
index 67591057f2349b..1ad62e55dfe2e2 100644
|
||||||
|
--- a/Documentation/devicetree/bindings/usb/qcom,dwc3.yaml
|
||||||
|
+++ b/Documentation/devicetree/bindings/usb/qcom,dwc3.yaml
|
||||||
|
@@ -14,6 +14,7 @@ properties:
|
||||||
|
items:
|
||||||
|
- enum:
|
||||||
|
- qcom,ipq4019-dwc3
|
||||||
|
+ - qcom,ipq5018-dwc3
|
||||||
|
- qcom,ipq5332-dwc3
|
||||||
|
- qcom,ipq6018-dwc3
|
||||||
|
- qcom,ipq8064-dwc3
|
||||||
|
@@ -238,6 +239,7 @@ allOf:
|
||||||
|
compatible:
|
||||||
|
contains:
|
||||||
|
enum:
|
||||||
|
+ - qcom,ipq5018-dwc3
|
||||||
|
- qcom,ipq5332-dwc3
|
||||||
|
- qcom,msm8994-dwc3
|
||||||
|
- qcom,qcs404-dwc3
|
||||||
|
@@ -411,6 +413,7 @@ allOf:
|
||||||
|
compatible:
|
||||||
|
contains:
|
||||||
|
enum:
|
||||||
|
+ - qcom,ipq5018-dwc3
|
||||||
|
- qcom,ipq5332-dwc3
|
||||||
|
- qcom,sdm660-dwc3
|
||||||
|
then:
|
@ -0,0 +1,88 @@
|
|||||||
|
From e7166f2774aafefd29ff26ffbbb7f6d40ac8ea1c Mon Sep 17 00:00:00 2001
|
||||||
|
From: Nitheesh Sekar <quic_nsekar@quicinc.com>
|
||||||
|
Date: Mon, 4 Sep 2023 12:06:34 +0530
|
||||||
|
Subject: [PATCH] arm64: dts: qcom: ipq5018: Add USB related nodes
|
||||||
|
|
||||||
|
Add USB phy and controller nodes.
|
||||||
|
|
||||||
|
Co-developed-by: Amandeep Singh <quic_amansing@quicinc.com>
|
||||||
|
Signed-off-by: Amandeep Singh <quic_amansing@quicinc.com>
|
||||||
|
Signed-off-by: Nitheesh Sekar <quic_nsekar@quicinc.com>
|
||||||
|
Link: https://lore.kernel.org/r/20230904063635.24975-4-quic_nsekar@quicinc.com
|
||||||
|
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||||
|
---
|
||||||
|
arch/arm64/boot/dts/qcom/ipq5018.dtsi | 54 +++++++++++++++++++++++++++
|
||||||
|
1 file changed, 54 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/arch/arm64/boot/dts/qcom/ipq5018.dtsi b/arch/arm64/boot/dts/qcom/ipq5018.dtsi
|
||||||
|
index 38ffdc3cbdcd7c..340b90cc17db85 100644
|
||||||
|
--- a/arch/arm64/boot/dts/qcom/ipq5018.dtsi
|
||||||
|
+++ b/arch/arm64/boot/dts/qcom/ipq5018.dtsi
|
||||||
|
@@ -94,6 +94,19 @@
|
||||||
|
#size-cells = <1>;
|
||||||
|
ranges = <0 0 0 0xffffffff>;
|
||||||
|
|
||||||
|
+ usbphy0: phy@5b000 {
|
||||||
|
+ compatible = "qcom,ipq5018-usb-hsphy";
|
||||||
|
+ reg = <0x0005b000 0x120>;
|
||||||
|
+
|
||||||
|
+ clocks = <&gcc GCC_USB0_PHY_CFG_AHB_CLK>;
|
||||||
|
+
|
||||||
|
+ resets = <&gcc GCC_QUSB2_0_PHY_BCR>;
|
||||||
|
+
|
||||||
|
+ #phy-cells = <0>;
|
||||||
|
+
|
||||||
|
+ status = "disabled";
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
tlmm: pinctrl@1000000 {
|
||||||
|
compatible = "qcom,ipq5018-tlmm";
|
||||||
|
reg = <0x01000000 0x300000>;
|
||||||
|
@@ -156,6 +169,47 @@
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
|
+ usb: usb@8af8800 {
|
||||||
|
+ compatible = "qcom,ipq5018-dwc3", "qcom,dwc3";
|
||||||
|
+ reg = <0x08af8800 0x400>;
|
||||||
|
+
|
||||||
|
+ interrupts = <GIC_SPI 62 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
+ interrupt-names = "hs_phy_irq";
|
||||||
|
+
|
||||||
|
+ clocks = <&gcc GCC_USB0_MASTER_CLK>,
|
||||||
|
+ <&gcc GCC_SYS_NOC_USB0_AXI_CLK>,
|
||||||
|
+ <&gcc GCC_USB0_SLEEP_CLK>,
|
||||||
|
+ <&gcc GCC_USB0_MOCK_UTMI_CLK>;
|
||||||
|
+ clock-names = "core",
|
||||||
|
+ "iface",
|
||||||
|
+ "sleep",
|
||||||
|
+ "mock_utmi";
|
||||||
|
+
|
||||||
|
+ resets = <&gcc GCC_USB0_BCR>;
|
||||||
|
+
|
||||||
|
+ qcom,select-utmi-as-pipe-clk;
|
||||||
|
+ #address-cells = <1>;
|
||||||
|
+ #size-cells = <1>;
|
||||||
|
+ ranges;
|
||||||
|
+
|
||||||
|
+ status = "disabled";
|
||||||
|
+
|
||||||
|
+ usb_dwc: usb@8a00000 {
|
||||||
|
+ compatible = "snps,dwc3";
|
||||||
|
+ reg = <0x08a00000 0xe000>;
|
||||||
|
+ clocks = <&gcc GCC_USB0_MOCK_UTMI_CLK>;
|
||||||
|
+ clock-names = "ref";
|
||||||
|
+ interrupts = <GIC_SPI 140 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
+ phy-names = "usb2-phy";
|
||||||
|
+ phys = <&usbphy0>;
|
||||||
|
+ tx-fifo-resize;
|
||||||
|
+ snps,is-utmi-l1-suspend;
|
||||||
|
+ snps,hird-threshold = /bits/ 8 <0x0>;
|
||||||
|
+ snps,dis_u2_susphy_quirk;
|
||||||
|
+ snps,dis_u3_susphy_quirk;
|
||||||
|
+ };
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
intc: interrupt-controller@b000000 {
|
||||||
|
compatible = "qcom,msm-qgic2";
|
||||||
|
reg = <0x0b000000 0x1000>, /* GICD */
|
@ -0,0 +1,58 @@
|
|||||||
|
From a1f42e08f0f04b72a6597f080db4bfbb3737910c Mon Sep 17 00:00:00 2001
|
||||||
|
From: Robert Marko <robimarko@gmail.com>
|
||||||
|
Date: Wed, 4 Oct 2023 21:12:30 +0200
|
||||||
|
Subject: [PATCH] arm64: dts: qcom: ipq5018: add QUP1 SPI controller
|
||||||
|
|
||||||
|
Add the required BAM and QUP nodes for the QUP1 SPI controller on IPQ5018.
|
||||||
|
|
||||||
|
Signed-off-by: Robert Marko <robimarko@gmail.com>
|
||||||
|
Reviewed-by: Kathiravan Thirumoorthy <quic_kathirav@quicinc.com>
|
||||||
|
Link: https://lore.kernel.org/r/20231004191303.331055-1-robimarko@gmail.com
|
||||||
|
[bjorn: Padded address to 8 digits, fixed node sort order]
|
||||||
|
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||||
|
---
|
||||||
|
arch/arm64/boot/dts/qcom/ipq5018.dtsi | 24 ++++++++++++++++++++++++
|
||||||
|
1 file changed, 24 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/arch/arm64/boot/dts/qcom/ipq5018.dtsi b/arch/arm64/boot/dts/qcom/ipq5018.dtsi
|
||||||
|
index 340b90cc17db85..0b739077ed7079 100644
|
||||||
|
--- a/arch/arm64/boot/dts/qcom/ipq5018.dtsi
|
||||||
|
+++ b/arch/arm64/boot/dts/qcom/ipq5018.dtsi
|
||||||
|
@@ -159,6 +159,16 @@
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
|
+ blsp_dma: dma-controller@7884000 {
|
||||||
|
+ compatible = "qcom,bam-v1.7.0";
|
||||||
|
+ reg = <0x07884000 0x1d000>;
|
||||||
|
+ interrupts = <GIC_SPI 238 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
+ clocks = <&gcc GCC_BLSP1_AHB_CLK>;
|
||||||
|
+ clock-names = "bam_clk";
|
||||||
|
+ #dma-cells = <1>;
|
||||||
|
+ qcom,ee = <0>;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
blsp1_uart1: serial@78af000 {
|
||||||
|
compatible = "qcom,msm-uartdm-v1.4", "qcom,msm-uartdm";
|
||||||
|
reg = <0x078af000 0x200>;
|
||||||
|
@@ -169,6 +179,20 @@
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
|
+ blsp1_spi1: spi@78b5000 {
|
||||||
|
+ compatible = "qcom,spi-qup-v2.2.1";
|
||||||
|
+ #address-cells = <1>;
|
||||||
|
+ #size-cells = <0>;
|
||||||
|
+ reg = <0x078b5000 0x600>;
|
||||||
|
+ interrupts = <GIC_SPI 95 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
+ clocks = <&gcc GCC_BLSP1_QUP1_SPI_APPS_CLK>,
|
||||||
|
+ <&gcc GCC_BLSP1_AHB_CLK>;
|
||||||
|
+ clock-names = "core", "iface";
|
||||||
|
+ dmas = <&blsp_dma 4>, <&blsp_dma 5>;
|
||||||
|
+ dma-names = "tx", "rx";
|
||||||
|
+ status = "disabled";
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
usb: usb@8af8800 {
|
||||||
|
compatible = "qcom,ipq5018-dwc3", "qcom,dwc3";
|
||||||
|
reg = <0x08af8800 0x400>;
|
@ -0,0 +1,27 @@
|
|||||||
|
From 4d45d56e17348c6b6bb2bce126a4a5ea97b19900 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Gokul Sriram Palanisamy <quic_gokulsri@quicinc.com>
|
||||||
|
Date: Mon, 25 Sep 2023 15:58:24 +0530
|
||||||
|
Subject: [PATCH] dt-bindings: clock: qcom,a53pll: add IPQ5018 compatible
|
||||||
|
|
||||||
|
Add IPQ5018 compatible to A53 PLL bindings.
|
||||||
|
|
||||||
|
Signed-off-by: Gokul Sriram Palanisamy <quic_gokulsri@quicinc.com>
|
||||||
|
Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
|
||||||
|
Link: https://lore.kernel.org/r/20230925102826.405446-2-quic_gokulsri@quicinc.com
|
||||||
|
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||||
|
---
|
||||||
|
Documentation/devicetree/bindings/clock/qcom,a53pll.yaml | 1 +
|
||||||
|
1 file changed, 1 insertion(+)
|
||||||
|
|
||||||
|
diff --git a/Documentation/devicetree/bindings/clock/qcom,a53pll.yaml b/Documentation/devicetree/bindings/clock/qcom,a53pll.yaml
|
||||||
|
index 9436266828afaf..5ca927a8b1d538 100644
|
||||||
|
--- a/Documentation/devicetree/bindings/clock/qcom,a53pll.yaml
|
||||||
|
+++ b/Documentation/devicetree/bindings/clock/qcom,a53pll.yaml
|
||||||
|
@@ -16,6 +16,7 @@ description:
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
enum:
|
||||||
|
+ - qcom,ipq5018-a53pll
|
||||||
|
- qcom,ipq5332-a53pll
|
||||||
|
- qcom,ipq6018-a53pll
|
||||||
|
- qcom,ipq8074-a53pll
|
@ -0,0 +1,64 @@
|
|||||||
|
From 50492f929486c044b43cb3e2c0e040aa9b61ea2b Mon Sep 17 00:00:00 2001
|
||||||
|
From: Gokul Sriram Palanisamy <quic_gokulsri@quicinc.com>
|
||||||
|
Date: Mon, 25 Sep 2023 15:58:25 +0530
|
||||||
|
Subject: [PATCH] clk: qcom: apss-ipq-pll: add support for IPQ5018
|
||||||
|
|
||||||
|
IPQ5018 APSS PLL is of type Stromer. Reuse Stromer Plus PLL offsets,
|
||||||
|
add configuration values and the compatible.
|
||||||
|
|
||||||
|
Co-developed-by: Sricharan Ramabadhran <quic_srichara@quicinc.com>
|
||||||
|
Signed-off-by: Sricharan Ramabadhran <quic_srichara@quicinc.com>
|
||||||
|
Signed-off-by: Gokul Sriram Palanisamy <quic_gokulsri@quicinc.com>
|
||||||
|
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
|
||||||
|
Link: https://lore.kernel.org/r/20230925102826.405446-3-quic_gokulsri@quicinc.com
|
||||||
|
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||||
|
---
|
||||||
|
drivers/clk/qcom/apss-ipq-pll.c | 21 +++++++++++++++++++++
|
||||||
|
1 file changed, 21 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/drivers/clk/qcom/apss-ipq-pll.c b/drivers/clk/qcom/apss-ipq-pll.c
|
||||||
|
index 41279e5437a620..678b805f13d455 100644
|
||||||
|
--- a/drivers/clk/qcom/apss-ipq-pll.c
|
||||||
|
+++ b/drivers/clk/qcom/apss-ipq-pll.c
|
||||||
|
@@ -73,6 +73,20 @@ static struct clk_alpha_pll ipq_pll_stromer_plus = {
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
+static const struct alpha_pll_config ipq5018_pll_config = {
|
||||||
|
+ .l = 0x32,
|
||||||
|
+ .config_ctl_val = 0x4001075b,
|
||||||
|
+ .config_ctl_hi_val = 0x304,
|
||||||
|
+ .main_output_mask = BIT(0),
|
||||||
|
+ .aux_output_mask = BIT(1),
|
||||||
|
+ .early_output_mask = BIT(3),
|
||||||
|
+ .alpha_en_mask = BIT(24),
|
||||||
|
+ .status_val = 0x3,
|
||||||
|
+ .status_mask = GENMASK(10, 8),
|
||||||
|
+ .lock_det = BIT(2),
|
||||||
|
+ .test_ctl_hi_val = 0x00400003,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
static const struct alpha_pll_config ipq5332_pll_config = {
|
||||||
|
.l = 0x2d,
|
||||||
|
.config_ctl_val = 0x4001075b,
|
||||||
|
@@ -129,6 +143,12 @@ struct apss_pll_data {
|
||||||
|
const struct alpha_pll_config *pll_config;
|
||||||
|
};
|
||||||
|
|
||||||
|
+static const struct apss_pll_data ipq5018_pll_data = {
|
||||||
|
+ .pll_type = CLK_ALPHA_PLL_TYPE_STROMER_PLUS,
|
||||||
|
+ .pll = &ipq_pll_stromer_plus,
|
||||||
|
+ .pll_config = &ipq5018_pll_config,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
static struct apss_pll_data ipq5332_pll_data = {
|
||||||
|
.pll_type = CLK_ALPHA_PLL_TYPE_STROMER_PLUS,
|
||||||
|
.pll = &ipq_pll_stromer_plus,
|
||||||
|
@@ -195,6 +215,7 @@ static int apss_ipq_pll_probe(struct platform_device *pdev)
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct of_device_id apss_ipq_pll_match_table[] = {
|
||||||
|
+ { .compatible = "qcom,ipq5018-a53pll", .data = &ipq5018_pll_data },
|
||||||
|
{ .compatible = "qcom,ipq5332-a53pll", .data = &ipq5332_pll_data },
|
||||||
|
{ .compatible = "qcom,ipq6018-a53pll", .data = &ipq6018_pll_data },
|
||||||
|
{ .compatible = "qcom,ipq8074-a53pll", .data = &ipq8074_pll_data },
|
@ -0,0 +1,100 @@
|
|||||||
|
From 3e4b53e04281ed3d9c7a4329c027097265c04d54 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Gokul Sriram Palanisamy <quic_gokulsri@quicinc.com>
|
||||||
|
Date: Mon, 25 Sep 2023 15:58:26 +0530
|
||||||
|
Subject: [PATCH] arm64: dts: qcom: ipq5018: enable the CPUFreq support
|
||||||
|
|
||||||
|
Add the APCS, A53 PLL, cpu-opp-table nodes to set
|
||||||
|
the CPU frequency at 800MHz (idle) or 1.008GHz.
|
||||||
|
|
||||||
|
Co-developed-by: Sricharan Ramabadhran <quic_srichara@quicinc.com>
|
||||||
|
Signed-off-by: Sricharan Ramabadhran <quic_srichara@quicinc.com>
|
||||||
|
Signed-off-by: Gokul Sriram Palanisamy <quic_gokulsri@quicinc.com>
|
||||||
|
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
|
||||||
|
Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
|
||||||
|
Link: https://lore.kernel.org/r/20230925102826.405446-4-quic_gokulsri@quicinc.com
|
||||||
|
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||||
|
---
|
||||||
|
arch/arm64/boot/dts/qcom/ipq5018.dtsi | 40 +++++++++++++++++++++++++++
|
||||||
|
1 file changed, 40 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/arch/arm64/boot/dts/qcom/ipq5018.dtsi b/arch/arm64/boot/dts/qcom/ipq5018.dtsi
|
||||||
|
index 0b739077ed7079..ae31bd72f0b739 100644
|
||||||
|
--- a/arch/arm64/boot/dts/qcom/ipq5018.dtsi
|
||||||
|
+++ b/arch/arm64/boot/dts/qcom/ipq5018.dtsi
|
||||||
|
@@ -5,6 +5,7 @@
|
||||||
|
* Copyright (c) 2023 The Linux Foundation. All rights reserved.
|
||||||
|
*/
|
||||||
|
|
||||||
|
+#include <dt-bindings/clock/qcom,apss-ipq.h>
|
||||||
|
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||||
|
#include <dt-bindings/clock/qcom,gcc-ipq5018.h>
|
||||||
|
#include <dt-bindings/reset/qcom,gcc-ipq5018.h>
|
||||||
|
@@ -36,6 +37,8 @@
|
||||||
|
reg = <0x0>;
|
||||||
|
enable-method = "psci";
|
||||||
|
next-level-cache = <&L2_0>;
|
||||||
|
+ clocks = <&apcs_glb APCS_ALIAS0_CORE_CLK>;
|
||||||
|
+ operating-points-v2 = <&cpu_opp_table>;
|
||||||
|
};
|
||||||
|
|
||||||
|
CPU1: cpu@1 {
|
||||||
|
@@ -44,6 +47,8 @@
|
||||||
|
reg = <0x1>;
|
||||||
|
enable-method = "psci";
|
||||||
|
next-level-cache = <&L2_0>;
|
||||||
|
+ clocks = <&apcs_glb APCS_ALIAS0_CORE_CLK>;
|
||||||
|
+ operating-points-v2 = <&cpu_opp_table>;
|
||||||
|
};
|
||||||
|
|
||||||
|
L2_0: l2-cache {
|
||||||
|
@@ -54,6 +59,25 @@
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
+ cpu_opp_table: opp-table-cpu {
|
||||||
|
+ compatible = "operating-points-v2";
|
||||||
|
+ opp-shared;
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
+ opp-800000000 {
|
||||||
|
+ opp-hz = /bits/ 64 <800000000>;
|
||||||
|
+ opp-microvolt = <1100000>;
|
||||||
|
+ clock-latency-ns = <200000>;
|
||||||
|
+ };
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+ opp-1008000000 {
|
||||||
|
+ opp-hz = /bits/ 64 <1008000000>;
|
||||||
|
+ opp-microvolt = <1100000>;
|
||||||
|
+ clock-latency-ns = <200000>;
|
||||||
|
+ };
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
firmware {
|
||||||
|
scm {
|
||||||
|
compatible = "qcom,scm-ipq5018", "qcom,scm";
|
||||||
|
@@ -267,6 +291,24 @@
|
||||||
|
clocks = <&sleep_clk>;
|
||||||
|
};
|
||||||
|
|
||||||
|
+ apcs_glb: mailbox@b111000 {
|
||||||
|
+ compatible = "qcom,ipq5018-apcs-apps-global",
|
||||||
|
+ "qcom,ipq6018-apcs-apps-global";
|
||||||
|
+ reg = <0x0b111000 0x1000>;
|
||||||
|
+ #clock-cells = <1>;
|
||||||
|
+ clocks = <&a53pll>, <&xo_board_clk>, <&gcc GPLL0>;
|
||||||
|
+ clock-names = "pll", "xo", "gpll0";
|
||||||
|
+ #mbox-cells = <1>;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ a53pll: clock@b116000 {
|
||||||
|
+ compatible = "qcom,ipq5018-a53pll";
|
||||||
|
+ reg = <0x0b116000 0x40>;
|
||||||
|
+ #clock-cells = <0>;
|
||||||
|
+ clocks = <&xo_board_clk>;
|
||||||
|
+ clock-names = "xo";
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
timer@b120000 {
|
||||||
|
compatible = "arm,armv7-timer-mem";
|
||||||
|
reg = <0x0b120000 0x1000>;
|
@ -0,0 +1,66 @@
|
|||||||
|
From a427dd16e61f3d145bc24f0ed09692fc25931250 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Kathiravan Thirumoorthy <quic_kathirav@quicinc.com>
|
||||||
|
Date: Wed, 25 Oct 2023 22:12:12 +0530
|
||||||
|
Subject: [PATCH] arm64: dts: qcom: ipq5018: add few more reserved memory
|
||||||
|
regions
|
||||||
|
|
||||||
|
Like all other IPQ SoCs, bootloader will collect the system RAM contents
|
||||||
|
upon crash for the post morterm analysis. If we don't reserve the memory
|
||||||
|
region used by bootloader, obviously linux will consume it and upon next
|
||||||
|
boot on crash, bootloader will be loaded in the same region, which will
|
||||||
|
lead to loose some of the data, sometimes we may miss out critical
|
||||||
|
information. So lets reserve the region used by the bootloader.
|
||||||
|
|
||||||
|
Similarly SBL copies some data into the reserved region and it will be
|
||||||
|
used in the crash scenario. So reserve 1MB for SBL as well.
|
||||||
|
|
||||||
|
While at it, enable the SMEM support along with TCSR mutex.
|
||||||
|
|
||||||
|
Signed-off-by: Kathiravan Thirumoorthy <quic_kathirav@quicinc.com>
|
||||||
|
Reviewed-by: Konrad Dybcio <konrad.dybcio@linaro.org>
|
||||||
|
Link: https://lore.kernel.org/r/20231025-ipq5018-misc-v1-1-7d14fde97fe7@quicinc.com
|
||||||
|
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||||
|
---
|
||||||
|
arch/arm64/boot/dts/qcom/ipq5018.dtsi | 24 ++++++++++++++++++++++++
|
||||||
|
1 file changed, 24 insertions(+)
|
||||||
|
|
||||||
|
--- a/arch/arm64/boot/dts/qcom/ipq5018.dtsi
|
||||||
|
+++ b/arch/arm64/boot/dts/qcom/ipq5018.dtsi
|
||||||
|
@@ -106,6 +106,24 @@
|
||||||
|
#size-cells = <2>;
|
||||||
|
ranges;
|
||||||
|
|
||||||
|
+ bootloader@4a800000 {
|
||||||
|
+ reg = <0x0 0x4a800000 0x0 0x200000>;
|
||||||
|
+ no-map;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ sbl@4aa00000 {
|
||||||
|
+ reg = <0x0 0x4aa00000 0x0 0x100000>;
|
||||||
|
+ no-map;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ smem@4ab00000 {
|
||||||
|
+ compatible = "qcom,smem";
|
||||||
|
+ reg = <0x0 0x4ab00000 0x0 0x100000>;
|
||||||
|
+ no-map;
|
||||||
|
+
|
||||||
|
+ hwlocks = <&tcsr_mutex 3>;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
tz_region: tz@4ac00000 {
|
||||||
|
reg = <0x0 0x4ac00000 0x0 0x200000>;
|
||||||
|
no-map;
|
||||||
|
@@ -166,6 +184,12 @@
|
||||||
|
#power-domain-cells = <1>;
|
||||||
|
};
|
||||||
|
|
||||||
|
+ tcsr_mutex: hwlock@1905000 {
|
||||||
|
+ compatible = "qcom,tcsr-mutex";
|
||||||
|
+ reg = <0x01905000 0x20000>;
|
||||||
|
+ #hwlock-cells = <1>;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
sdhc_1: mmc@7804000 {
|
||||||
|
compatible = "qcom,ipq5018-sdhci", "qcom,sdhci-msm-v5";
|
||||||
|
reg = <0x7804000 0x1000>;
|
@ -0,0 +1,203 @@
|
|||||||
|
From 032be4f49dda786fea9e1501212f6cd09a7ded96 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Christian Marangi <ansuelsmth@gmail.com>
|
||||||
|
Date: Thu, 3 Nov 2022 14:49:43 +0100
|
||||||
|
Subject: [PATCH] clk: qcom: clk-rcg2: introduce support for multiple conf for
|
||||||
|
same freq
|
||||||
|
|
||||||
|
Some RCG frequency can be reached by multiple configuration.
|
||||||
|
|
||||||
|
We currently declare multiple configuration for the same frequency but
|
||||||
|
that is not supported and always the first configuration will be taken.
|
||||||
|
|
||||||
|
These multiple configuration are needed as based on the current parent
|
||||||
|
configuration, it may be needed to use a different configuration to
|
||||||
|
reach the same frequency.
|
||||||
|
|
||||||
|
To handle this introduce 2 new macro, FM and C.
|
||||||
|
|
||||||
|
- FM is used to declare an empty freq_tbl with just the frequency and an
|
||||||
|
array of confs to insert all the config for the provided frequency.
|
||||||
|
|
||||||
|
- C is used to declare a fre_conf where src, pre_div, m and n are
|
||||||
|
provided.
|
||||||
|
|
||||||
|
The driver is changed to handle this special freq_tbl and select the
|
||||||
|
correct config by calculating the final rate and deciding based on the
|
||||||
|
one that is less different than the requested one.
|
||||||
|
|
||||||
|
Tested-by: Robert Marko <robimarko@gmail.com>
|
||||||
|
Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
||||||
|
---
|
||||||
|
drivers/clk/qcom/clk-rcg.h | 14 ++++++-
|
||||||
|
drivers/clk/qcom/clk-rcg2.c | 84 +++++++++++++++++++++++++++++++++----
|
||||||
|
2 files changed, 88 insertions(+), 10 deletions(-)
|
||||||
|
|
||||||
|
--- a/drivers/clk/qcom/clk-rcg.h
|
||||||
|
+++ b/drivers/clk/qcom/clk-rcg.h
|
||||||
|
@@ -7,7 +7,17 @@
|
||||||
|
#include <linux/clk-provider.h>
|
||||||
|
#include "clk-regmap.h"
|
||||||
|
|
||||||
|
-#define F(f, s, h, m, n) { (f), (s), (2 * (h) - 1), (m), (n) }
|
||||||
|
+#define F(f, s, h, m, n) { (f), (s), (2 * (h) - 1), (m), (n), 0, NULL }
|
||||||
|
+
|
||||||
|
+#define FM(_f, _confs) { .freq = (_f), .confs_num = ARRAY_SIZE(_confs), .confs = (_confs) }
|
||||||
|
+#define C(s, h, m, n) { (s), (2 * (h) - 1), (m), (n) }
|
||||||
|
+
|
||||||
|
+struct freq_conf {
|
||||||
|
+ u8 src;
|
||||||
|
+ u8 pre_div;
|
||||||
|
+ u16 m;
|
||||||
|
+ u16 n;
|
||||||
|
+};
|
||||||
|
|
||||||
|
struct freq_tbl {
|
||||||
|
unsigned long freq;
|
||||||
|
@@ -15,6 +25,8 @@ struct freq_tbl {
|
||||||
|
u8 pre_div;
|
||||||
|
u16 m;
|
||||||
|
u16 n;
|
||||||
|
+ int confs_num;
|
||||||
|
+ const struct freq_conf *confs;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
--- a/drivers/clk/qcom/clk-rcg2.c
|
||||||
|
+++ b/drivers/clk/qcom/clk-rcg2.c
|
||||||
|
@@ -203,11 +203,60 @@ clk_rcg2_recalc_rate(struct clk_hw *hw,
|
||||||
|
return __clk_rcg2_recalc_rate(hw, parent_rate, cfg);
|
||||||
|
}
|
||||||
|
|
||||||
|
+static void
|
||||||
|
+clk_rcg2_select_conf(struct clk_hw *hw, struct freq_tbl *f_tbl,
|
||||||
|
+ const struct freq_tbl *f, unsigned long req_rate)
|
||||||
|
+{
|
||||||
|
+ unsigned long best_rate = 0, parent_rate, rate;
|
||||||
|
+ const struct freq_conf *conf, *best_conf;
|
||||||
|
+ struct clk_rcg2 *rcg = to_clk_rcg2(hw);
|
||||||
|
+ struct clk_hw *p;
|
||||||
|
+ int index, i;
|
||||||
|
+
|
||||||
|
+ /* Search in each provided config the one that is near the wanted rate */
|
||||||
|
+ for (i = 0, conf = f->confs; i < f->confs_num; i++, conf++) {
|
||||||
|
+ index = qcom_find_src_index(hw, rcg->parent_map, conf->src);
|
||||||
|
+ if (index < 0)
|
||||||
|
+ continue;
|
||||||
|
+
|
||||||
|
+ p = clk_hw_get_parent_by_index(hw, index);
|
||||||
|
+ if (!p)
|
||||||
|
+ continue;
|
||||||
|
+
|
||||||
|
+ parent_rate = clk_hw_get_rate(p);
|
||||||
|
+ rate = calc_rate(parent_rate, conf->n, conf->m, conf->n, conf->pre_div);
|
||||||
|
+
|
||||||
|
+ if (rate == req_rate) {
|
||||||
|
+ best_conf = conf;
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (abs(req_rate - rate) < abs(best_rate - rate)) {
|
||||||
|
+ best_rate = rate;
|
||||||
|
+ best_conf = conf;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
+ * Very unlikely.
|
||||||
|
+ * Force the first conf if we can't find a correct config.
|
||||||
|
+ */
|
||||||
|
+ if (unlikely(i == f->confs_num))
|
||||||
|
+ best_conf = f->confs;
|
||||||
|
+
|
||||||
|
+ /* Apply the config */
|
||||||
|
+ f_tbl->src = best_conf->src;
|
||||||
|
+ f_tbl->pre_div = best_conf->pre_div;
|
||||||
|
+ f_tbl->m = best_conf->m;
|
||||||
|
+ f_tbl->n = best_conf->n;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static int _freq_tbl_determine_rate(struct clk_hw *hw, const struct freq_tbl *f,
|
||||||
|
struct clk_rate_request *req,
|
||||||
|
enum freq_policy policy)
|
||||||
|
{
|
||||||
|
unsigned long clk_flags, rate = req->rate;
|
||||||
|
+ struct freq_tbl f_tbl;
|
||||||
|
struct clk_hw *p;
|
||||||
|
struct clk_rcg2 *rcg = to_clk_rcg2(hw);
|
||||||
|
int index;
|
||||||
|
@@ -226,7 +275,15 @@ static int _freq_tbl_determine_rate(stru
|
||||||
|
if (!f)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
- index = qcom_find_src_index(hw, rcg->parent_map, f->src);
|
||||||
|
+ f_tbl = *f;
|
||||||
|
+ /*
|
||||||
|
+ * A single freq may be reached by multiple configuration.
|
||||||
|
+ * Try to find the bast one if we have this kind of freq_table.
|
||||||
|
+ */
|
||||||
|
+ if (f->confs)
|
||||||
|
+ clk_rcg2_select_conf(hw, &f_tbl, f, rate);
|
||||||
|
+
|
||||||
|
+ index = qcom_find_src_index(hw, rcg->parent_map, f_tbl.src);
|
||||||
|
if (index < 0)
|
||||||
|
return index;
|
||||||
|
|
||||||
|
@@ -236,18 +293,18 @@ static int _freq_tbl_determine_rate(stru
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
if (clk_flags & CLK_SET_RATE_PARENT) {
|
||||||
|
- rate = f->freq;
|
||||||
|
- if (f->pre_div) {
|
||||||
|
+ rate = f_tbl.freq;
|
||||||
|
+ if (f_tbl.pre_div) {
|
||||||
|
if (!rate)
|
||||||
|
rate = req->rate;
|
||||||
|
rate /= 2;
|
||||||
|
- rate *= f->pre_div + 1;
|
||||||
|
+ rate *= f_tbl.pre_div + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (f->n) {
|
||||||
|
+ if (f_tbl.n) {
|
||||||
|
u64 tmp = rate;
|
||||||
|
- tmp = tmp * f->n;
|
||||||
|
- do_div(tmp, f->m);
|
||||||
|
+ tmp = tmp * f_tbl.n;
|
||||||
|
+ do_div(tmp, f_tbl.m);
|
||||||
|
rate = tmp;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
@@ -255,7 +312,7 @@ static int _freq_tbl_determine_rate(stru
|
||||||
|
}
|
||||||
|
req->best_parent_hw = p;
|
||||||
|
req->best_parent_rate = rate;
|
||||||
|
- req->rate = f->freq;
|
||||||
|
+ req->rate = f_tbl.freq;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
@@ -353,6 +410,7 @@ static int __clk_rcg2_set_rate(struct cl
|
||||||
|
{
|
||||||
|
struct clk_rcg2 *rcg = to_clk_rcg2(hw);
|
||||||
|
const struct freq_tbl *f;
|
||||||
|
+ struct freq_tbl f_tbl;
|
||||||
|
|
||||||
|
switch (policy) {
|
||||||
|
case FLOOR:
|
||||||
|
@@ -368,7 +426,15 @@ static int __clk_rcg2_set_rate(struct cl
|
||||||
|
if (!f)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
- return clk_rcg2_configure(rcg, f);
|
||||||
|
+ f_tbl = *f;
|
||||||
|
+ /*
|
||||||
|
+ * A single freq may be reached by multiple configuration.
|
||||||
|
+ * Try to find the best one if we have this kind of freq_table.
|
||||||
|
+ */
|
||||||
|
+ if (f->confs)
|
||||||
|
+ clk_rcg2_select_conf(hw, &f_tbl, f, rate);
|
||||||
|
+
|
||||||
|
+ return clk_rcg2_configure(rcg, &f_tbl);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int clk_rcg2_set_rate(struct clk_hw *hw, unsigned long rate,
|
@ -0,0 +1,129 @@
|
|||||||
|
From f778553f296792f4d1e8b3552603ad6116ea3eb3 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Christian Marangi <ansuelsmth@gmail.com>
|
||||||
|
Date: Thu, 3 Nov 2022 14:49:44 +0100
|
||||||
|
Subject: [PATCH] clk: qcom: gcc-ipq8074: rework nss_port5/6 clock to multiple
|
||||||
|
conf
|
||||||
|
|
||||||
|
Rework nss_port5/6 to use the new multiple configuration implementation
|
||||||
|
and correctly fix the clocks for these port under some corner case.
|
||||||
|
|
||||||
|
This is particularly relevant for device that have 2.5G or 10G port
|
||||||
|
connected to port5 or port 6 on ipq8074. As the parent are shared
|
||||||
|
across multiple port it may be required to select the correct
|
||||||
|
configuration to accomplish the desired clock. Without this patch such
|
||||||
|
port doesn't work in some specific ethernet speed as the clock will be
|
||||||
|
set to the wrong frequency as we just select the first configuration for
|
||||||
|
the related frequency instead of selecting the best one.
|
||||||
|
|
||||||
|
Tested-by: Robert Marko <robimarko@gmail.com> # ipq8074 Qnap QHora-301W
|
||||||
|
Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
||||||
|
---
|
||||||
|
drivers/clk/qcom/gcc-ipq8074.c | 64 +++++++++++++++++++++++++---------
|
||||||
|
1 file changed, 48 insertions(+), 16 deletions(-)
|
||||||
|
|
||||||
|
--- a/drivers/clk/qcom/gcc-ipq8074.c
|
||||||
|
+++ b/drivers/clk/qcom/gcc-ipq8074.c
|
||||||
|
@@ -1677,13 +1677,21 @@ static struct clk_regmap_div nss_port4_t
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
+static const struct freq_conf ftbl_nss_port5_rx_clk_src_25[] = {
|
||||||
|
+ C(P_UNIPHY1_RX, 12.5, 0, 0),
|
||||||
|
+ C(P_UNIPHY0_RX, 5, 0, 0),
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static const struct freq_conf ftbl_nss_port5_rx_clk_src_125[] = {
|
||||||
|
+ C(P_UNIPHY1_RX, 2.5, 0, 0),
|
||||||
|
+ C(P_UNIPHY0_RX, 1, 0, 0),
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
static const struct freq_tbl ftbl_nss_port5_rx_clk_src[] = {
|
||||||
|
F(19200000, P_XO, 1, 0, 0),
|
||||||
|
- F(25000000, P_UNIPHY1_RX, 12.5, 0, 0),
|
||||||
|
- F(25000000, P_UNIPHY0_RX, 5, 0, 0),
|
||||||
|
+ FM(25000000, ftbl_nss_port5_rx_clk_src_25),
|
||||||
|
F(78125000, P_UNIPHY1_RX, 4, 0, 0),
|
||||||
|
- F(125000000, P_UNIPHY1_RX, 2.5, 0, 0),
|
||||||
|
- F(125000000, P_UNIPHY0_RX, 1, 0, 0),
|
||||||
|
+ FM(125000000, ftbl_nss_port5_rx_clk_src_125),
|
||||||
|
F(156250000, P_UNIPHY1_RX, 2, 0, 0),
|
||||||
|
F(312500000, P_UNIPHY1_RX, 1, 0, 0),
|
||||||
|
{ }
|
||||||
|
@@ -1739,13 +1747,21 @@ static struct clk_regmap_div nss_port5_r
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
+static struct freq_conf ftbl_nss_port5_tx_clk_src_25[] = {
|
||||||
|
+ C(P_UNIPHY1_TX, 12.5, 0, 0),
|
||||||
|
+ C(P_UNIPHY0_TX, 5, 0, 0),
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static struct freq_conf ftbl_nss_port5_tx_clk_src_125[] = {
|
||||||
|
+ C(P_UNIPHY1_TX, 2.5, 0, 0),
|
||||||
|
+ C(P_UNIPHY0_TX, 1, 0, 0),
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
static const struct freq_tbl ftbl_nss_port5_tx_clk_src[] = {
|
||||||
|
F(19200000, P_XO, 1, 0, 0),
|
||||||
|
- F(25000000, P_UNIPHY1_TX, 12.5, 0, 0),
|
||||||
|
- F(25000000, P_UNIPHY0_TX, 5, 0, 0),
|
||||||
|
+ FM(25000000, ftbl_nss_port5_tx_clk_src_25),
|
||||||
|
F(78125000, P_UNIPHY1_TX, 4, 0, 0),
|
||||||
|
- F(125000000, P_UNIPHY1_TX, 2.5, 0, 0),
|
||||||
|
- F(125000000, P_UNIPHY0_TX, 1, 0, 0),
|
||||||
|
+ FM(125000000, ftbl_nss_port5_tx_clk_src_125),
|
||||||
|
F(156250000, P_UNIPHY1_TX, 2, 0, 0),
|
||||||
|
F(312500000, P_UNIPHY1_TX, 1, 0, 0),
|
||||||
|
{ }
|
||||||
|
@@ -1801,13 +1817,21 @@ static struct clk_regmap_div nss_port5_t
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
+static struct freq_conf ftbl_nss_port6_rx_clk_src_25[] = {
|
||||||
|
+ C(P_UNIPHY2_RX, 5, 0, 0),
|
||||||
|
+ C(P_UNIPHY2_RX, 12.5, 0, 0),
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static struct freq_conf ftbl_nss_port6_rx_clk_src_125[] = {
|
||||||
|
+ C(P_UNIPHY2_RX, 1, 0, 0),
|
||||||
|
+ C(P_UNIPHY2_RX, 2.5, 0, 0),
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
static const struct freq_tbl ftbl_nss_port6_rx_clk_src[] = {
|
||||||
|
F(19200000, P_XO, 1, 0, 0),
|
||||||
|
- F(25000000, P_UNIPHY2_RX, 5, 0, 0),
|
||||||
|
- F(25000000, P_UNIPHY2_RX, 12.5, 0, 0),
|
||||||
|
+ FM(25000000, ftbl_nss_port6_rx_clk_src_25),
|
||||||
|
F(78125000, P_UNIPHY2_RX, 4, 0, 0),
|
||||||
|
- F(125000000, P_UNIPHY2_RX, 1, 0, 0),
|
||||||
|
- F(125000000, P_UNIPHY2_RX, 2.5, 0, 0),
|
||||||
|
+ FM(125000000, ftbl_nss_port6_rx_clk_src_125),
|
||||||
|
F(156250000, P_UNIPHY2_RX, 2, 0, 0),
|
||||||
|
F(312500000, P_UNIPHY2_RX, 1, 0, 0),
|
||||||
|
{ }
|
||||||
|
@@ -1858,13 +1882,21 @@ static struct clk_regmap_div nss_port6_r
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
+static struct freq_conf ftbl_nss_port6_tx_clk_src_25[] = {
|
||||||
|
+ C(P_UNIPHY2_TX, 5, 0, 0),
|
||||||
|
+ C(P_UNIPHY2_TX, 12.5, 0, 0),
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static struct freq_conf ftbl_nss_port6_tx_clk_src_125[] = {
|
||||||
|
+ C(P_UNIPHY2_TX, 1, 0, 0),
|
||||||
|
+ C(P_UNIPHY2_TX, 2.5, 0, 0),
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
static const struct freq_tbl ftbl_nss_port6_tx_clk_src[] = {
|
||||||
|
F(19200000, P_XO, 1, 0, 0),
|
||||||
|
- F(25000000, P_UNIPHY2_TX, 5, 0, 0),
|
||||||
|
- F(25000000, P_UNIPHY2_TX, 12.5, 0, 0),
|
||||||
|
+ FM(25000000, ftbl_nss_port6_tx_clk_src_25),
|
||||||
|
F(78125000, P_UNIPHY2_TX, 4, 0, 0),
|
||||||
|
- F(125000000, P_UNIPHY2_TX, 1, 0, 0),
|
||||||
|
- F(125000000, P_UNIPHY2_TX, 2.5, 0, 0),
|
||||||
|
+ FM(125000000, ftbl_nss_port6_tx_clk_src_125),
|
||||||
|
F(156250000, P_UNIPHY2_TX, 2, 0, 0),
|
||||||
|
F(312500000, P_UNIPHY2_TX, 1, 0, 0),
|
||||||
|
{ }
|
@ -0,0 +1,60 @@
|
|||||||
|
From ad2d07f71739351eeea1d8a120c0918e2c4b265f Mon Sep 17 00:00:00 2001
|
||||||
|
From: Robert Marko <robimarko@gmail.com>
|
||||||
|
Date: Wed, 22 Dec 2021 12:23:34 +0100
|
||||||
|
Subject: [PATCH] arm64: dts: ipq8074: add reserved memory nodes
|
||||||
|
|
||||||
|
IPQ8074 has multiple reserved memory ranges, if they are not defined
|
||||||
|
then weird things tend to happen, board hangs and resets when PCI or
|
||||||
|
WLAN is used etc.
|
||||||
|
|
||||||
|
So, to avoid all of that add the reserved memory nodes from the downstream
|
||||||
|
5.4 kernel from QCA.
|
||||||
|
This is their default layout meant for devices with 1GB of RAM, but
|
||||||
|
devices with lower ammounts can override the Q6 node.
|
||||||
|
|
||||||
|
Signed-off-by: Robert Marko <robimarko@gmail.com>
|
||||||
|
---
|
||||||
|
arch/arm64/boot/dts/qcom/ipq8074.dtsi | 35 +++++++++++++++++++++++++++
|
||||||
|
1 file changed, 35 insertions(+)
|
||||||
|
|
||||||
|
--- a/arch/arm64/boot/dts/qcom/ipq8074.dtsi
|
||||||
|
+++ b/arch/arm64/boot/dts/qcom/ipq8074.dtsi
|
||||||
|
@@ -86,6 +86,16 @@
|
||||||
|
#size-cells = <2>;
|
||||||
|
ranges;
|
||||||
|
|
||||||
|
+ nss@40000000 {
|
||||||
|
+ no-map;
|
||||||
|
+ reg = <0x0 0x40000000 0x0 0x01000000>;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ tzapp_region: tzapp@4a400000 {
|
||||||
|
+ no-map;
|
||||||
|
+ reg = <0x0 0x4a400000 0x0 0x00200000>;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
bootloader@4a600000 {
|
||||||
|
reg = <0x0 0x4a600000 0x0 0x400000>;
|
||||||
|
no-map;
|
||||||
|
@@ -108,6 +118,21 @@
|
||||||
|
reg = <0x0 0x4ac00000 0x0 0x400000>;
|
||||||
|
no-map;
|
||||||
|
};
|
||||||
|
+
|
||||||
|
+ q6_region: wcnss@4b000000 {
|
||||||
|
+ no-map;
|
||||||
|
+ reg = <0x0 0x4b000000 0x0 0x05f00000>;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ q6_etr_region: q6_etr_dump@50f00000 {
|
||||||
|
+ no-map;
|
||||||
|
+ reg = <0x0 0x50f00000 0x0 0x00100000>;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ m3_dump_region: m3_dump@51000000 {
|
||||||
|
+ no-map;
|
||||||
|
+ reg = <0x0 0x51000000 0x0 0x100000>;
|
||||||
|
+ };
|
||||||
|
};
|
||||||
|
|
||||||
|
firmware {
|
@ -0,0 +1,30 @@
|
|||||||
|
From 8a576b5bc9f0555d1d970cacabcaa24a3b74fa57 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Robert Marko <robimarko@gmail.com>
|
||||||
|
Date: Wed, 16 Nov 2022 22:15:01 +0100
|
||||||
|
Subject: [PATCH] arm64: dts: qcom: ipq8074: pass QMP PCI PHY PIPE clocks to
|
||||||
|
GCC
|
||||||
|
|
||||||
|
Pass QMP PCI PHY PIPE clocks to the GCC controller so it does not have to
|
||||||
|
find them by matching globaly by name.
|
||||||
|
|
||||||
|
If not passed directly, driver maintains backwards compatibility by then
|
||||||
|
falling back to global lookup.
|
||||||
|
|
||||||
|
Signed-off-by: Robert Marko <robimarko@gmail.com>
|
||||||
|
---
|
||||||
|
arch/arm64/boot/dts/qcom/ipq8074.dtsi | 4 ++--
|
||||||
|
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
--- a/arch/arm64/boot/dts/qcom/ipq8074.dtsi
|
||||||
|
+++ b/arch/arm64/boot/dts/qcom/ipq8074.dtsi
|
||||||
|
@@ -407,8 +407,8 @@
|
||||||
|
gcc: gcc@1800000 {
|
||||||
|
compatible = "qcom,gcc-ipq8074";
|
||||||
|
reg = <0x01800000 0x80000>;
|
||||||
|
- clocks = <&xo>, <&sleep_clk>;
|
||||||
|
- clock-names = "xo", "sleep_clk";
|
||||||
|
+ clocks = <&xo>, <&sleep_clk>, <&pcie_phy0>, <&pcie_phy1>;
|
||||||
|
+ clock-names = "xo", "sleep_clk", "pcie0_pipe", "pcie1_pipe";
|
||||||
|
#clock-cells = <1>;
|
||||||
|
#power-domain-cells = <1>;
|
||||||
|
#reset-cells = <1>;
|
@ -0,0 +1,43 @@
|
|||||||
|
From fb1f6850be00d8dd8a54017be4c1336e224069ac Mon Sep 17 00:00:00 2001
|
||||||
|
From: Robert Marko <robimarko@gmail.com>
|
||||||
|
Date: Wed, 16 Nov 2022 22:26:25 +0100
|
||||||
|
Subject: [PATCH] arm64: dts: qcom: ipq8074: use msi-parent for PCIe
|
||||||
|
|
||||||
|
Instead of hardcoding the IRQ, simply use msi-parent instead.
|
||||||
|
|
||||||
|
Signed-off-by: Robert Marko <robimarko@gmail.com>
|
||||||
|
---
|
||||||
|
arch/arm64/boot/dts/qcom/ipq8074.dtsi | 8 +++-----
|
||||||
|
1 file changed, 3 insertions(+), 5 deletions(-)
|
||||||
|
|
||||||
|
--- a/arch/arm64/boot/dts/qcom/ipq8074.dtsi
|
||||||
|
+++ b/arch/arm64/boot/dts/qcom/ipq8074.dtsi
|
||||||
|
@@ -757,7 +757,7 @@
|
||||||
|
reg = <0x0b000000 0x1000>, <0x0b002000 0x1000>;
|
||||||
|
ranges = <0 0xb00a000 0xffd>;
|
||||||
|
|
||||||
|
- v2m@0 {
|
||||||
|
+ gic_v2m0: v2m@0 {
|
||||||
|
compatible = "arm,gic-v2m-frame";
|
||||||
|
msi-controller;
|
||||||
|
reg = <0x0 0xffd>;
|
||||||
|
@@ -870,8 +870,7 @@
|
||||||
|
ranges = <0x81000000 0x0 0x00000000 0x10200000 0x0 0x10000>, /* I/O */
|
||||||
|
<0x82000000 0x0 0x10220000 0x10220000 0x0 0xfde0000>; /* MEM */
|
||||||
|
|
||||||
|
- interrupts = <GIC_SPI 85 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
- interrupt-names = "msi";
|
||||||
|
+ msi-parent = <&gic_v2m0>;
|
||||||
|
#interrupt-cells = <1>;
|
||||||
|
interrupt-map-mask = <0 0 0 0x7>;
|
||||||
|
interrupt-map = <0 0 0 1 &intc 0 0 142
|
||||||
|
@@ -932,8 +931,7 @@
|
||||||
|
ranges = <0x81000000 0x0 0x00000000 0x20200000 0x0 0x10000>, /* I/O */
|
||||||
|
<0x82000000 0x0 0x20220000 0x20220000 0x0 0xfde0000>; /* MEM */
|
||||||
|
|
||||||
|
- interrupts = <GIC_SPI 52 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
- interrupt-names = "msi";
|
||||||
|
+ msi-parent = <&gic_v2m0>;
|
||||||
|
#interrupt-cells = <1>;
|
||||||
|
interrupt-map-mask = <0 0 0 0x7>;
|
||||||
|
interrupt-map = <0 0 0 1 &intc 0 0 75
|
@ -0,0 +1,155 @@
|
|||||||
|
From 125681433c8e526356947acf572fe8ca8ad32291 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Gokul Sriram Palanisamy <gokulsri@codeaurora.org>
|
||||||
|
Date: Sat, 30 Jan 2021 10:50:05 +0530
|
||||||
|
Subject: [PATCH] remoteproc: qcom: Add PRNG proxy clock
|
||||||
|
|
||||||
|
PRNG clock is needed by the secure PIL, support for the same
|
||||||
|
is added in subsequent patches.
|
||||||
|
|
||||||
|
Signed-off-by: Gokul Sriram Palanisamy <gokulsri@codeaurora.org>
|
||||||
|
Signed-off-by: Sricharan R <sricharan@codeaurora.org>
|
||||||
|
Signed-off-by: Nikhil Prakash V <nprakash@codeaurora.org>
|
||||||
|
---
|
||||||
|
drivers/remoteproc/qcom_q6v5_wcss.c | 65 +++++++++++++++++++++--------
|
||||||
|
1 file changed, 47 insertions(+), 18 deletions(-)
|
||||||
|
|
||||||
|
--- a/drivers/remoteproc/qcom_q6v5_wcss.c
|
||||||
|
+++ b/drivers/remoteproc/qcom_q6v5_wcss.c
|
||||||
|
@@ -91,19 +91,6 @@ enum {
|
||||||
|
WCSS_QCS404,
|
||||||
|
};
|
||||||
|
|
||||||
|
-struct wcss_data {
|
||||||
|
- const char *firmware_name;
|
||||||
|
- unsigned int crash_reason_smem;
|
||||||
|
- u32 version;
|
||||||
|
- bool aon_reset_required;
|
||||||
|
- bool wcss_q6_reset_required;
|
||||||
|
- const char *ssr_name;
|
||||||
|
- const char *sysmon_name;
|
||||||
|
- int ssctl_id;
|
||||||
|
- const struct rproc_ops *ops;
|
||||||
|
- bool requires_force_stop;
|
||||||
|
-};
|
||||||
|
-
|
||||||
|
struct q6v5_wcss {
|
||||||
|
struct device *dev;
|
||||||
|
|
||||||
|
@@ -128,6 +115,7 @@ struct q6v5_wcss {
|
||||||
|
struct clk *qdsp6ss_xo_cbcr;
|
||||||
|
struct clk *qdsp6ss_core_gfmux;
|
||||||
|
struct clk *lcc_bcr_sleep;
|
||||||
|
+ struct clk *prng_clk;
|
||||||
|
struct regulator *cx_supply;
|
||||||
|
struct qcom_sysmon *sysmon;
|
||||||
|
|
||||||
|
@@ -151,6 +139,21 @@ struct q6v5_wcss {
|
||||||
|
struct qcom_rproc_ssr ssr_subdev;
|
||||||
|
};
|
||||||
|
|
||||||
|
+struct wcss_data {
|
||||||
|
+ int (*init_clock)(struct q6v5_wcss *wcss);
|
||||||
|
+ int (*init_regulator)(struct q6v5_wcss *wcss);
|
||||||
|
+ const char *firmware_name;
|
||||||
|
+ unsigned int crash_reason_smem;
|
||||||
|
+ u32 version;
|
||||||
|
+ bool aon_reset_required;
|
||||||
|
+ bool wcss_q6_reset_required;
|
||||||
|
+ const char *ssr_name;
|
||||||
|
+ const char *sysmon_name;
|
||||||
|
+ int ssctl_id;
|
||||||
|
+ const struct rproc_ops *ops;
|
||||||
|
+ bool requires_force_stop;
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
static int q6v5_wcss_reset(struct q6v5_wcss *wcss)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
@@ -240,6 +243,12 @@ static int q6v5_wcss_start(struct rproc
|
||||||
|
struct q6v5_wcss *wcss = rproc->priv;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
+ ret = clk_prepare_enable(wcss->prng_clk);
|
||||||
|
+ if (ret) {
|
||||||
|
+ dev_err(wcss->dev, "prng clock enable failed\n");
|
||||||
|
+ return ret;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
qcom_q6v5_prepare(&wcss->q6v5);
|
||||||
|
|
||||||
|
/* Release Q6 and WCSS reset */
|
||||||
|
@@ -733,6 +742,7 @@ static int q6v5_wcss_stop(struct rproc *
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ clk_disable_unprepare(wcss->prng_clk);
|
||||||
|
qcom_q6v5_unprepare(&wcss->q6v5);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
@@ -899,7 +909,21 @@ static int q6v5_alloc_memory_region(stru
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
-static int q6v5_wcss_init_clock(struct q6v5_wcss *wcss)
|
||||||
|
+static int ipq8074_init_clock(struct q6v5_wcss *wcss)
|
||||||
|
+{
|
||||||
|
+ int ret;
|
||||||
|
+
|
||||||
|
+ wcss->prng_clk = devm_clk_get(wcss->dev, "prng");
|
||||||
|
+ if (IS_ERR(wcss->prng_clk)) {
|
||||||
|
+ ret = PTR_ERR(wcss->prng_clk);
|
||||||
|
+ if (ret != -EPROBE_DEFER)
|
||||||
|
+ dev_err(wcss->dev, "Failed to get prng clock\n");
|
||||||
|
+ return ret;
|
||||||
|
+ }
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int qcs404_init_clock(struct q6v5_wcss *wcss)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
@@ -989,7 +1013,7 @@ static int q6v5_wcss_init_clock(struct q
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
-static int q6v5_wcss_init_regulator(struct q6v5_wcss *wcss)
|
||||||
|
+static int qcs404_init_regulator(struct q6v5_wcss *wcss)
|
||||||
|
{
|
||||||
|
wcss->cx_supply = devm_regulator_get(wcss->dev, "cx");
|
||||||
|
if (IS_ERR(wcss->cx_supply))
|
||||||
|
@@ -1033,12 +1057,14 @@ static int q6v5_wcss_probe(struct platfo
|
||||||
|
if (ret)
|
||||||
|
goto free_rproc;
|
||||||
|
|
||||||
|
- if (wcss->version == WCSS_QCS404) {
|
||||||
|
- ret = q6v5_wcss_init_clock(wcss);
|
||||||
|
+ if (desc->init_clock) {
|
||||||
|
+ ret = desc->init_clock(wcss);
|
||||||
|
if (ret)
|
||||||
|
goto free_rproc;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
- ret = q6v5_wcss_init_regulator(wcss);
|
||||||
|
+ if (desc->init_regulator) {
|
||||||
|
+ ret = desc->init_regulator(wcss);
|
||||||
|
if (ret)
|
||||||
|
goto free_rproc;
|
||||||
|
}
|
||||||
|
@@ -1084,6 +1110,7 @@ static void q6v5_wcss_remove(struct plat
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct wcss_data wcss_ipq8074_res_init = {
|
||||||
|
+ .init_clock = ipq8074_init_clock,
|
||||||
|
.firmware_name = "IPQ8074/q6_fw.mdt",
|
||||||
|
.crash_reason_smem = WCSS_CRASH_REASON,
|
||||||
|
.aon_reset_required = true,
|
||||||
|
@@ -1093,6 +1120,8 @@ static const struct wcss_data wcss_ipq80
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct wcss_data wcss_qcs404_res_init = {
|
||||||
|
+ .init_clock = qcs404_init_clock,
|
||||||
|
+ .init_regulator = qcs404_init_regulator,
|
||||||
|
.crash_reason_smem = WCSS_CRASH_REASON,
|
||||||
|
.firmware_name = "wcnss.mdt",
|
||||||
|
.version = WCSS_QCS404,
|
@ -0,0 +1,143 @@
|
|||||||
|
From 7358d42dfbdfdb5d4f1d0d4c2e5c2bb4143a29b0 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Gokul Sriram Palanisamy <gokulsri@codeaurora.org>
|
||||||
|
Date: Sat, 30 Jan 2021 10:50:06 +0530
|
||||||
|
Subject: [PATCH] remoteproc: qcom: Add secure PIL support
|
||||||
|
|
||||||
|
IPQ8074 uses secure PIL. Hence, adding the support for the same.
|
||||||
|
|
||||||
|
Signed-off-by: Gokul Sriram Palanisamy <gokulsri@codeaurora.org>
|
||||||
|
Signed-off-by: Sricharan R <sricharan@codeaurora.org>
|
||||||
|
Signed-off-by: Nikhil Prakash V <nprakash@codeaurora.org>
|
||||||
|
---
|
||||||
|
drivers/remoteproc/qcom_q6v5_wcss.c | 43 +++++++++++++++++++++++++++--
|
||||||
|
1 file changed, 40 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
|
--- a/drivers/remoteproc/qcom_q6v5_wcss.c
|
||||||
|
+++ b/drivers/remoteproc/qcom_q6v5_wcss.c
|
||||||
|
@@ -18,6 +18,7 @@
|
||||||
|
#include <linux/regulator/consumer.h>
|
||||||
|
#include <linux/reset.h>
|
||||||
|
#include <linux/soc/qcom/mdt_loader.h>
|
||||||
|
+#include <linux/firmware/qcom/qcom_scm.h>
|
||||||
|
#include "qcom_common.h"
|
||||||
|
#include "qcom_pil_info.h"
|
||||||
|
#include "qcom_q6v5.h"
|
||||||
|
@@ -86,6 +87,9 @@
|
||||||
|
#define TCSR_WCSS_CLK_ENABLE 0x14
|
||||||
|
|
||||||
|
#define MAX_HALT_REG 3
|
||||||
|
+
|
||||||
|
+#define WCNSS_PAS_ID 6
|
||||||
|
+
|
||||||
|
enum {
|
||||||
|
WCSS_IPQ8074,
|
||||||
|
WCSS_QCS404,
|
||||||
|
@@ -134,6 +138,7 @@ struct q6v5_wcss {
|
||||||
|
unsigned int crash_reason_smem;
|
||||||
|
u32 version;
|
||||||
|
bool requires_force_stop;
|
||||||
|
+ bool need_mem_protection;
|
||||||
|
|
||||||
|
struct qcom_rproc_glink glink_subdev;
|
||||||
|
struct qcom_rproc_ssr ssr_subdev;
|
||||||
|
@@ -152,6 +157,7 @@ struct wcss_data {
|
||||||
|
int ssctl_id;
|
||||||
|
const struct rproc_ops *ops;
|
||||||
|
bool requires_force_stop;
|
||||||
|
+ bool need_mem_protection;
|
||||||
|
};
|
||||||
|
|
||||||
|
static int q6v5_wcss_reset(struct q6v5_wcss *wcss)
|
||||||
|
@@ -251,6 +257,15 @@ static int q6v5_wcss_start(struct rproc
|
||||||
|
|
||||||
|
qcom_q6v5_prepare(&wcss->q6v5);
|
||||||
|
|
||||||
|
+ if (wcss->need_mem_protection) {
|
||||||
|
+ ret = qcom_scm_pas_auth_and_reset(WCNSS_PAS_ID);
|
||||||
|
+ if (ret) {
|
||||||
|
+ dev_err(wcss->dev, "wcss_reset failed\n");
|
||||||
|
+ return ret;
|
||||||
|
+ }
|
||||||
|
+ goto wait_for_reset;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
/* Release Q6 and WCSS reset */
|
||||||
|
ret = reset_control_deassert(wcss->wcss_reset);
|
||||||
|
if (ret) {
|
||||||
|
@@ -285,6 +300,7 @@ static int q6v5_wcss_start(struct rproc
|
||||||
|
if (ret)
|
||||||
|
goto wcss_q6_reset;
|
||||||
|
|
||||||
|
+wait_for_reset:
|
||||||
|
ret = qcom_q6v5_wait_for_start(&wcss->q6v5, 5 * HZ);
|
||||||
|
if (ret == -ETIMEDOUT)
|
||||||
|
dev_err(wcss->dev, "start timed out\n");
|
||||||
|
@@ -718,6 +734,15 @@ static int q6v5_wcss_stop(struct rproc *
|
||||||
|
struct q6v5_wcss *wcss = rproc->priv;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
+ if (wcss->need_mem_protection) {
|
||||||
|
+ ret = qcom_scm_pas_shutdown(WCNSS_PAS_ID);
|
||||||
|
+ if (ret) {
|
||||||
|
+ dev_err(wcss->dev, "not able to shutdown\n");
|
||||||
|
+ return ret;
|
||||||
|
+ }
|
||||||
|
+ goto pas_done;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
/* WCSS powerdown */
|
||||||
|
if (wcss->requires_force_stop) {
|
||||||
|
ret = qcom_q6v5_request_stop(&wcss->q6v5, NULL);
|
||||||
|
@@ -742,6 +767,7 @@ static int q6v5_wcss_stop(struct rproc *
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
+pas_done:
|
||||||
|
clk_disable_unprepare(wcss->prng_clk);
|
||||||
|
qcom_q6v5_unprepare(&wcss->q6v5);
|
||||||
|
|
||||||
|
@@ -765,9 +791,15 @@ static int q6v5_wcss_load(struct rproc *
|
||||||
|
struct q6v5_wcss *wcss = rproc->priv;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
- ret = qcom_mdt_load_no_init(wcss->dev, fw, rproc->firmware,
|
||||||
|
- 0, wcss->mem_region, wcss->mem_phys,
|
||||||
|
- wcss->mem_size, &wcss->mem_reloc);
|
||||||
|
+ if (wcss->need_mem_protection)
|
||||||
|
+ ret = qcom_mdt_load(wcss->dev, fw, rproc->firmware,
|
||||||
|
+ WCNSS_PAS_ID, wcss->mem_region,
|
||||||
|
+ wcss->mem_phys, wcss->mem_size,
|
||||||
|
+ &wcss->mem_reloc);
|
||||||
|
+ else
|
||||||
|
+ ret = qcom_mdt_load_no_init(wcss->dev, fw, rproc->firmware,
|
||||||
|
+ 0, wcss->mem_region, wcss->mem_phys,
|
||||||
|
+ wcss->mem_size, &wcss->mem_reloc);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
@@ -1035,6 +1067,9 @@ static int q6v5_wcss_probe(struct platfo
|
||||||
|
if (!desc)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
+ if (desc->need_mem_protection && !qcom_scm_is_available())
|
||||||
|
+ return -EPROBE_DEFER;
|
||||||
|
+
|
||||||
|
rproc = rproc_alloc(&pdev->dev, pdev->name, desc->ops,
|
||||||
|
desc->firmware_name, sizeof(*wcss));
|
||||||
|
if (!rproc) {
|
||||||
|
@@ -1048,6 +1083,7 @@ static int q6v5_wcss_probe(struct platfo
|
||||||
|
|
||||||
|
wcss->version = desc->version;
|
||||||
|
wcss->requires_force_stop = desc->requires_force_stop;
|
||||||
|
+ wcss->need_mem_protection = desc->need_mem_protection;
|
||||||
|
|
||||||
|
ret = q6v5_wcss_init_mmio(wcss, pdev);
|
||||||
|
if (ret)
|
||||||
|
@@ -1117,6 +1153,7 @@ static const struct wcss_data wcss_ipq80
|
||||||
|
.wcss_q6_reset_required = true,
|
||||||
|
.ops = &q6v5_wcss_ipq8074_ops,
|
||||||
|
.requires_force_stop = true,
|
||||||
|
+ .need_mem_protection = true,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct wcss_data wcss_qcs404_res_init = {
|
@ -0,0 +1,103 @@
|
|||||||
|
From b422c9d4f048b086ce83f44a7cfcddcce162897f Mon Sep 17 00:00:00 2001
|
||||||
|
From: Gokul Sriram Palanisamy <gokulsri@codeaurora.org>
|
||||||
|
Date: Sat, 30 Jan 2021 10:50:07 +0530
|
||||||
|
Subject: [PATCH] remoteproc: qcom: Add support for split q6 + m3 wlan firmware
|
||||||
|
|
||||||
|
IPQ8074 supports split firmware for q6 and m3 as well.
|
||||||
|
So add support for loading the m3 firmware before q6.
|
||||||
|
Now the drivers works fine for both split and unified
|
||||||
|
firmwares.
|
||||||
|
|
||||||
|
Signed-off-by: Gokul Sriram Palanisamy <gokulsri@codeaurora.org>
|
||||||
|
Signed-off-by: Sricharan R <sricharan@codeaurora.org>
|
||||||
|
Signed-off-by: Nikhil Prakash V <nprakash@codeaurora.org>
|
||||||
|
---
|
||||||
|
drivers/remoteproc/qcom_q6v5_wcss.c | 33 +++++++++++++++++++++++++----
|
||||||
|
1 file changed, 29 insertions(+), 4 deletions(-)
|
||||||
|
|
||||||
|
--- a/drivers/remoteproc/qcom_q6v5_wcss.c
|
||||||
|
+++ b/drivers/remoteproc/qcom_q6v5_wcss.c
|
||||||
|
@@ -139,6 +139,7 @@ struct q6v5_wcss {
|
||||||
|
u32 version;
|
||||||
|
bool requires_force_stop;
|
||||||
|
bool need_mem_protection;
|
||||||
|
+ const char *m3_firmware_name;
|
||||||
|
|
||||||
|
struct qcom_rproc_glink glink_subdev;
|
||||||
|
struct qcom_rproc_ssr ssr_subdev;
|
||||||
|
@@ -147,7 +148,8 @@ struct q6v5_wcss {
|
||||||
|
struct wcss_data {
|
||||||
|
int (*init_clock)(struct q6v5_wcss *wcss);
|
||||||
|
int (*init_regulator)(struct q6v5_wcss *wcss);
|
||||||
|
- const char *firmware_name;
|
||||||
|
+ const char *q6_firmware_name;
|
||||||
|
+ const char *m3_firmware_name;
|
||||||
|
unsigned int crash_reason_smem;
|
||||||
|
u32 version;
|
||||||
|
bool aon_reset_required;
|
||||||
|
@@ -789,8 +791,29 @@ static void *q6v5_wcss_da_to_va(struct r
|
||||||
|
static int q6v5_wcss_load(struct rproc *rproc, const struct firmware *fw)
|
||||||
|
{
|
||||||
|
struct q6v5_wcss *wcss = rproc->priv;
|
||||||
|
+ const struct firmware *m3_fw;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
+ if (wcss->m3_firmware_name) {
|
||||||
|
+ ret = request_firmware(&m3_fw, wcss->m3_firmware_name,
|
||||||
|
+ wcss->dev);
|
||||||
|
+ if (ret)
|
||||||
|
+ goto skip_m3;
|
||||||
|
+
|
||||||
|
+ ret = qcom_mdt_load_no_init(wcss->dev, m3_fw,
|
||||||
|
+ wcss->m3_firmware_name, 0,
|
||||||
|
+ wcss->mem_region, wcss->mem_phys,
|
||||||
|
+ wcss->mem_size, &wcss->mem_reloc);
|
||||||
|
+
|
||||||
|
+ release_firmware(m3_fw);
|
||||||
|
+
|
||||||
|
+ if (ret) {
|
||||||
|
+ dev_err(wcss->dev, "can't load m3_fw.bXX\n");
|
||||||
|
+ return ret;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+skip_m3:
|
||||||
|
if (wcss->need_mem_protection)
|
||||||
|
ret = qcom_mdt_load(wcss->dev, fw, rproc->firmware,
|
||||||
|
WCNSS_PAS_ID, wcss->mem_region,
|
||||||
|
@@ -1071,7 +1094,7 @@ static int q6v5_wcss_probe(struct platfo
|
||||||
|
return -EPROBE_DEFER;
|
||||||
|
|
||||||
|
rproc = rproc_alloc(&pdev->dev, pdev->name, desc->ops,
|
||||||
|
- desc->firmware_name, sizeof(*wcss));
|
||||||
|
+ desc->q6_firmware_name, sizeof(*wcss));
|
||||||
|
if (!rproc) {
|
||||||
|
dev_err(&pdev->dev, "failed to allocate rproc\n");
|
||||||
|
return -ENOMEM;
|
||||||
|
@@ -1084,6 +1107,7 @@ static int q6v5_wcss_probe(struct platfo
|
||||||
|
wcss->version = desc->version;
|
||||||
|
wcss->requires_force_stop = desc->requires_force_stop;
|
||||||
|
wcss->need_mem_protection = desc->need_mem_protection;
|
||||||
|
+ wcss->m3_firmware_name = desc->m3_firmware_name;
|
||||||
|
|
||||||
|
ret = q6v5_wcss_init_mmio(wcss, pdev);
|
||||||
|
if (ret)
|
||||||
|
@@ -1147,7 +1171,8 @@ static void q6v5_wcss_remove(struct plat
|
||||||
|
|
||||||
|
static const struct wcss_data wcss_ipq8074_res_init = {
|
||||||
|
.init_clock = ipq8074_init_clock,
|
||||||
|
- .firmware_name = "IPQ8074/q6_fw.mdt",
|
||||||
|
+ .q6_firmware_name = "IPQ8074/q6_fw.mdt",
|
||||||
|
+ .m3_firmware_name = "IPQ8074/m3_fw.mdt",
|
||||||
|
.crash_reason_smem = WCSS_CRASH_REASON,
|
||||||
|
.aon_reset_required = true,
|
||||||
|
.wcss_q6_reset_required = true,
|
||||||
|
@@ -1160,7 +1185,7 @@ static const struct wcss_data wcss_qcs40
|
||||||
|
.init_clock = qcs404_init_clock,
|
||||||
|
.init_regulator = qcs404_init_regulator,
|
||||||
|
.crash_reason_smem = WCSS_CRASH_REASON,
|
||||||
|
- .firmware_name = "wcnss.mdt",
|
||||||
|
+ .q6_firmware_name = "wcnss.mdt",
|
||||||
|
.version = WCSS_QCS404,
|
||||||
|
.aon_reset_required = false,
|
||||||
|
.wcss_q6_reset_required = false,
|
@ -0,0 +1,24 @@
|
|||||||
|
From 3a8f67b4770c817b04794c9a02e3f88f85d86280 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Gokul Sriram Palanisamy <gokulsri@codeaurora.org>
|
||||||
|
Date: Sat, 30 Jan 2021 10:50:08 +0530
|
||||||
|
Subject: [PATCH] remoteproc: qcom: Add ssr subdevice identifier
|
||||||
|
|
||||||
|
Add name for ssr subdevice on IPQ8074 SoC.
|
||||||
|
|
||||||
|
Signed-off-by: Gokul Sriram Palanisamy <gokulsri@codeaurora.org>
|
||||||
|
Signed-off-by: Sricharan R <sricharan@codeaurora.org>
|
||||||
|
Signed-off-by: Nikhil Prakash V <nprakash@codeaurora.org>
|
||||||
|
---
|
||||||
|
drivers/remoteproc/qcom_q6v5_wcss.c | 1 +
|
||||||
|
1 file changed, 1 insertion(+)
|
||||||
|
|
||||||
|
--- a/drivers/remoteproc/qcom_q6v5_wcss.c
|
||||||
|
+++ b/drivers/remoteproc/qcom_q6v5_wcss.c
|
||||||
|
@@ -1176,6 +1176,7 @@ static const struct wcss_data wcss_ipq80
|
||||||
|
.crash_reason_smem = WCSS_CRASH_REASON,
|
||||||
|
.aon_reset_required = true,
|
||||||
|
.wcss_q6_reset_required = true,
|
||||||
|
+ .ssr_name = "q6wcss",
|
||||||
|
.ops = &q6v5_wcss_ipq8074_ops,
|
||||||
|
.requires_force_stop = true,
|
||||||
|
.need_mem_protection = true,
|
@ -0,0 +1,79 @@
|
|||||||
|
From 8c73af6e8d78c66cfef0f551b00d375ec0b67ff3 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Gokul Sriram Palanisamy <gokulsri@codeaurora.org>
|
||||||
|
Date: Sat, 30 Jan 2021 10:50:09 +0530
|
||||||
|
Subject: [PATCH] remoteproc: qcom: Update regmap offsets for halt register
|
||||||
|
|
||||||
|
Fixed issue in reading halt-regs parameter from device-tree.
|
||||||
|
|
||||||
|
Signed-off-by: Gokul Sriram Palanisamy <gokulsri@codeaurora.org>
|
||||||
|
Signed-off-by: Sricharan R <sricharan@codeaurora.org>
|
||||||
|
---
|
||||||
|
drivers/remoteproc/qcom_q6v5_wcss.c | 22 ++++++++++++++--------
|
||||||
|
1 file changed, 14 insertions(+), 8 deletions(-)
|
||||||
|
|
||||||
|
--- a/drivers/remoteproc/qcom_q6v5_wcss.c
|
||||||
|
+++ b/drivers/remoteproc/qcom_q6v5_wcss.c
|
||||||
|
@@ -86,7 +86,7 @@
|
||||||
|
#define TCSR_WCSS_CLK_MASK 0x1F
|
||||||
|
#define TCSR_WCSS_CLK_ENABLE 0x14
|
||||||
|
|
||||||
|
-#define MAX_HALT_REG 3
|
||||||
|
+#define MAX_HALT_REG 4
|
||||||
|
|
||||||
|
#define WCNSS_PAS_ID 6
|
||||||
|
|
||||||
|
@@ -154,6 +154,7 @@ struct wcss_data {
|
||||||
|
u32 version;
|
||||||
|
bool aon_reset_required;
|
||||||
|
bool wcss_q6_reset_required;
|
||||||
|
+ bool bcr_reset_required;
|
||||||
|
const char *ssr_name;
|
||||||
|
const char *sysmon_name;
|
||||||
|
int ssctl_id;
|
||||||
|
@@ -875,10 +876,13 @@ static int q6v5_wcss_init_reset(struct q
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- wcss->wcss_q6_bcr_reset = devm_reset_control_get_exclusive(dev, "wcss_q6_bcr_reset");
|
||||||
|
- if (IS_ERR(wcss->wcss_q6_bcr_reset)) {
|
||||||
|
- dev_err(wcss->dev, "unable to acquire wcss_q6_bcr_reset\n");
|
||||||
|
- return PTR_ERR(wcss->wcss_q6_bcr_reset);
|
||||||
|
+ if (desc->bcr_reset_required) {
|
||||||
|
+ wcss->wcss_q6_bcr_reset = devm_reset_control_get_exclusive(dev,
|
||||||
|
+ "wcss_q6_bcr_reset");
|
||||||
|
+ if (IS_ERR(wcss->wcss_q6_bcr_reset)) {
|
||||||
|
+ dev_err(wcss->dev, "unable to acquire wcss_q6_bcr_reset\n");
|
||||||
|
+ return PTR_ERR(wcss->wcss_q6_bcr_reset);
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
@@ -928,9 +932,9 @@ static int q6v5_wcss_init_mmio(struct q6
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
- wcss->halt_q6 = halt_reg[0];
|
||||||
|
- wcss->halt_wcss = halt_reg[1];
|
||||||
|
- wcss->halt_nc = halt_reg[2];
|
||||||
|
+ wcss->halt_q6 = halt_reg[1];
|
||||||
|
+ wcss->halt_wcss = halt_reg[2];
|
||||||
|
+ wcss->halt_nc = halt_reg[3];
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
@@ -1176,6 +1180,7 @@ static const struct wcss_data wcss_ipq80
|
||||||
|
.crash_reason_smem = WCSS_CRASH_REASON,
|
||||||
|
.aon_reset_required = true,
|
||||||
|
.wcss_q6_reset_required = true,
|
||||||
|
+ .bcr_reset_required = false,
|
||||||
|
.ssr_name = "q6wcss",
|
||||||
|
.ops = &q6v5_wcss_ipq8074_ops,
|
||||||
|
.requires_force_stop = true,
|
||||||
|
@@ -1190,6 +1195,7 @@ static const struct wcss_data wcss_qcs40
|
||||||
|
.version = WCSS_QCS404,
|
||||||
|
.aon_reset_required = false,
|
||||||
|
.wcss_q6_reset_required = false,
|
||||||
|
+ .bcr_reset_required = true,
|
||||||
|
.ssr_name = "mpss",
|
||||||
|
.sysmon_name = "wcnss",
|
||||||
|
.ssctl_id = 0x12,
|
@ -0,0 +1,26 @@
|
|||||||
|
From ff7c6533ed8c4de58ed6c8aab03ea59c03eb4f31 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Gokul Sriram Palanisamy <gokulsri@codeaurora.org>
|
||||||
|
Date: Sat, 30 Jan 2021 10:50:10 +0530
|
||||||
|
Subject: [PATCH] dt-bindings: clock: qcom: Add reset for WCSSAON
|
||||||
|
|
||||||
|
Add binding for WCSSAON reset required for Q6v5 reset on IPQ8074 SoC.
|
||||||
|
|
||||||
|
Signed-off-by: Gokul Sriram Palanisamy <gokulsri@codeaurora.org>
|
||||||
|
Signed-off-by: Sricharan R <sricharan@codeaurora.org>
|
||||||
|
Signed-off-by: Nikhil Prakash V <nprakash@codeaurora.org>
|
||||||
|
Acked-by: Rob Herring <robh@kernel.org>
|
||||||
|
Acked-by: Stephen Boyd <sboyd@kernel.org>
|
||||||
|
---
|
||||||
|
include/dt-bindings/clock/qcom,gcc-ipq8074.h | 1 +
|
||||||
|
1 file changed, 1 insertion(+)
|
||||||
|
|
||||||
|
--- a/include/dt-bindings/clock/qcom,gcc-ipq8074.h
|
||||||
|
+++ b/include/dt-bindings/clock/qcom,gcc-ipq8074.h
|
||||||
|
@@ -381,6 +381,7 @@
|
||||||
|
#define GCC_NSSPORT4_RESET 143
|
||||||
|
#define GCC_NSSPORT5_RESET 144
|
||||||
|
#define GCC_NSSPORT6_RESET 145
|
||||||
|
+#define GCC_WCSSAON_RESET 146
|
||||||
|
|
||||||
|
#define USB0_GDSC 0
|
||||||
|
#define USB1_GDSC 1
|
@ -0,0 +1,25 @@
|
|||||||
|
From 43d9788f546d24df22d8ba3fcc2497d7ccc198f3 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Gokul Sriram Palanisamy <gokulsri@codeaurora.org>
|
||||||
|
Date: Sat, 30 Jan 2021 10:50:11 +0530
|
||||||
|
Subject: [PATCH] clk: qcom: Add WCSSAON reset
|
||||||
|
|
||||||
|
Add WCSSAON reset required for Q6v5 on IPQ8074 SoC.
|
||||||
|
|
||||||
|
Signed-off-by: Gokul Sriram Palanisamy <gokulsri@codeaurora.org>
|
||||||
|
Signed-off-by: Sricharan R <sricharan@codeaurora.org>
|
||||||
|
Signed-off-by: Nikhil Prakash V <nprakash@codeaurora.org>
|
||||||
|
Acked-by: Stephen Boyd <sboyd@kernel.org>
|
||||||
|
---
|
||||||
|
drivers/clk/qcom/gcc-ipq8074.c | 1 +
|
||||||
|
1 file changed, 1 insertion(+)
|
||||||
|
|
||||||
|
--- a/drivers/clk/qcom/gcc-ipq8074.c
|
||||||
|
+++ b/drivers/clk/qcom/gcc-ipq8074.c
|
||||||
|
@@ -4712,6 +4712,7 @@ static const struct qcom_reset_map gcc_i
|
||||||
|
[GCC_NSSPORT4_RESET] = { .reg = 0x68014, .bitmask = BIT(27) | GENMASK(9, 8) },
|
||||||
|
[GCC_NSSPORT5_RESET] = { .reg = 0x68014, .bitmask = BIT(28) | GENMASK(11, 10) },
|
||||||
|
[GCC_NSSPORT6_RESET] = { .reg = 0x68014, .bitmask = BIT(29) | GENMASK(13, 12) },
|
||||||
|
+ [GCC_WCSSAON_RESET] = { 0x59010, 0 },
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct gdsc *gcc_ipq8074_gdscs[] = {
|
@ -0,0 +1,48 @@
|
|||||||
|
From 406a332fd1bcc4e18d73cce390f56272fe9111d7 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Sivaprakash Murugesan <sivaprak@codeaurora.org>
|
||||||
|
Date: Fri, 17 Apr 2020 16:37:10 +0530
|
||||||
|
Subject: [PATCH] remoteproc: wcss: disable auto boot for IPQ8074
|
||||||
|
|
||||||
|
There is no need for remoteproc to boot automatically, ath11k will trigger
|
||||||
|
booting when its probing.
|
||||||
|
|
||||||
|
Signed-off-by: Sivaprakash Murugesan <sivaprak@codeaurora.org>
|
||||||
|
Signed-off-by: Robert Marko <robimarko@gmail.com>
|
||||||
|
---
|
||||||
|
drivers/remoteproc/qcom_q6v5_wcss.c | 4 ++++
|
||||||
|
1 file changed, 4 insertions(+)
|
||||||
|
|
||||||
|
--- a/drivers/remoteproc/qcom_q6v5_wcss.c
|
||||||
|
+++ b/drivers/remoteproc/qcom_q6v5_wcss.c
|
||||||
|
@@ -161,6 +161,7 @@ struct wcss_data {
|
||||||
|
const struct rproc_ops *ops;
|
||||||
|
bool requires_force_stop;
|
||||||
|
bool need_mem_protection;
|
||||||
|
+ bool need_auto_boot;
|
||||||
|
};
|
||||||
|
|
||||||
|
static int q6v5_wcss_reset(struct q6v5_wcss *wcss)
|
||||||
|
@@ -1149,6 +1150,7 @@ static int q6v5_wcss_probe(struct platfo
|
||||||
|
desc->sysmon_name,
|
||||||
|
desc->ssctl_id);
|
||||||
|
|
||||||
|
+ rproc->auto_boot = desc->need_auto_boot;
|
||||||
|
ret = rproc_add(rproc);
|
||||||
|
if (ret)
|
||||||
|
goto free_rproc;
|
||||||
|
@@ -1185,6 +1187,7 @@ static const struct wcss_data wcss_ipq80
|
||||||
|
.ops = &q6v5_wcss_ipq8074_ops,
|
||||||
|
.requires_force_stop = true,
|
||||||
|
.need_mem_protection = true,
|
||||||
|
+ .need_auto_boot = false,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct wcss_data wcss_qcs404_res_init = {
|
||||||
|
@@ -1201,6 +1204,7 @@ static const struct wcss_data wcss_qcs40
|
||||||
|
.ssctl_id = 0x12,
|
||||||
|
.ops = &q6v5_wcss_qcs404_ops,
|
||||||
|
.requires_force_stop = false,
|
||||||
|
+ .need_auto_boot = true,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct of_device_id q6v5_wcss_of_match[] = {
|
@ -0,0 +1,120 @@
|
|||||||
|
From 7388400b8bd42f71d040dbf2fdbdcb834fcc0ede Mon Sep 17 00:00:00 2001
|
||||||
|
From: Gokul Sriram Palanisamy <gokulsri@codeaurora.org>
|
||||||
|
Date: Sat, 30 Jan 2021 10:50:13 +0530
|
||||||
|
Subject: [PATCH] arm64: dts: qcom: Enable Q6v5 WCSS for ipq8074 SoC
|
||||||
|
|
||||||
|
Enable remoteproc WCSS PIL driver with glink and ssr subdevices.
|
||||||
|
Also enables smp2p and mailboxes required for IPC.
|
||||||
|
|
||||||
|
Signed-off-by: Gokul Sriram Palanisamy <gokulsri@codeaurora.org>
|
||||||
|
Signed-off-by: Sricharan R <sricharan@codeaurora.org>
|
||||||
|
Signed-off-by: Nikhil Prakash V <nprakash@codeaurora.org>
|
||||||
|
Signed-off-by: Robert Marko <robimarko@gmail.com>
|
||||||
|
---
|
||||||
|
arch/arm64/boot/dts/qcom/ipq8074.dtsi | 81 +++++++++++++++++++++++++++
|
||||||
|
1 file changed, 81 insertions(+)
|
||||||
|
|
||||||
|
--- a/arch/arm64/boot/dts/qcom/ipq8074.dtsi
|
||||||
|
+++ b/arch/arm64/boot/dts/qcom/ipq8074.dtsi
|
||||||
|
@@ -142,6 +142,32 @@
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
+ wcss: smp2p-wcss {
|
||||||
|
+ compatible = "qcom,smp2p";
|
||||||
|
+ qcom,smem = <435>, <428>;
|
||||||
|
+
|
||||||
|
+ interrupt-parent = <&intc>;
|
||||||
|
+ interrupts = <0 322 1>;
|
||||||
|
+
|
||||||
|
+ mboxes = <&apcs_glb 9>;
|
||||||
|
+
|
||||||
|
+ qcom,local-pid = <0>;
|
||||||
|
+ qcom,remote-pid = <1>;
|
||||||
|
+
|
||||||
|
+ wcss_smp2p_out: master-kernel {
|
||||||
|
+ qcom,entry-name = "master-kernel";
|
||||||
|
+ qcom,smp2p-feature-ssr-ack;
|
||||||
|
+ #qcom,smem-state-cells = <1>;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ wcss_smp2p_in: slave-kernel {
|
||||||
|
+ qcom,entry-name = "slave-kernel";
|
||||||
|
+
|
||||||
|
+ interrupt-controller;
|
||||||
|
+ #interrupt-cells = <2>;
|
||||||
|
+ };
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
soc: soc@0 {
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <1>;
|
||||||
|
@@ -425,6 +451,11 @@
|
||||||
|
reg = <0x01937000 0x21000>;
|
||||||
|
};
|
||||||
|
|
||||||
|
+ tcsr_q6: syscon@1945000 {
|
||||||
|
+ compatible = "syscon";
|
||||||
|
+ reg = <0x01945000 0xe000>;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
spmi_bus: spmi@200f000 {
|
||||||
|
compatible = "qcom,spmi-pmic-arb";
|
||||||
|
reg = <0x0200f000 0x001000>,
|
||||||
|
@@ -972,6 +1003,56 @@
|
||||||
|
"axi_s_sticky";
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
+
|
||||||
|
+ q6v5_wcss: q6v5_wcss@cd00000 {
|
||||||
|
+ compatible = "qcom,ipq8074-wcss-pil";
|
||||||
|
+ reg = <0x0cd00000 0x4040>,
|
||||||
|
+ <0x004ab000 0x20>;
|
||||||
|
+ reg-names = "qdsp6",
|
||||||
|
+ "rmb";
|
||||||
|
+ qca,auto-restart;
|
||||||
|
+ qca,extended-intc;
|
||||||
|
+ interrupts-extended = <&intc 0 325 1>,
|
||||||
|
+ <&wcss_smp2p_in 0 0>,
|
||||||
|
+ <&wcss_smp2p_in 1 0>,
|
||||||
|
+ <&wcss_smp2p_in 2 0>,
|
||||||
|
+ <&wcss_smp2p_in 3 0>;
|
||||||
|
+ interrupt-names = "wdog",
|
||||||
|
+ "fatal",
|
||||||
|
+ "ready",
|
||||||
|
+ "handover",
|
||||||
|
+ "stop-ack";
|
||||||
|
+
|
||||||
|
+ resets = <&gcc GCC_WCSSAON_RESET>,
|
||||||
|
+ <&gcc GCC_WCSS_BCR>,
|
||||||
|
+ <&gcc GCC_WCSS_Q6_BCR>;
|
||||||
|
+
|
||||||
|
+ reset-names = "wcss_aon_reset",
|
||||||
|
+ "wcss_reset",
|
||||||
|
+ "wcss_q6_reset";
|
||||||
|
+
|
||||||
|
+ clocks = <&gcc GCC_PRNG_AHB_CLK>;
|
||||||
|
+ clock-names = "prng";
|
||||||
|
+
|
||||||
|
+ qcom,halt-regs = <&tcsr_q6 0xa000 0xd000 0x0>;
|
||||||
|
+
|
||||||
|
+ qcom,smem-states = <&wcss_smp2p_out 0>,
|
||||||
|
+ <&wcss_smp2p_out 1>;
|
||||||
|
+ qcom,smem-state-names = "shutdown",
|
||||||
|
+ "stop";
|
||||||
|
+
|
||||||
|
+ memory-region = <&q6_region>;
|
||||||
|
+
|
||||||
|
+ glink-edge {
|
||||||
|
+ interrupts = <GIC_SPI 321 IRQ_TYPE_EDGE_RISING>;
|
||||||
|
+ qcom,remote-pid = <1>;
|
||||||
|
+ mboxes = <&apcs_glb 8>;
|
||||||
|
+
|
||||||
|
+ rpm_requests {
|
||||||
|
+ qcom,glink-channels = "IPCRTR";
|
||||||
|
+ };
|
||||||
|
+ };
|
||||||
|
+ };
|
||||||
|
};
|
||||||
|
|
||||||
|
timer {
|
@ -0,0 +1,135 @@
|
|||||||
|
From a67d1901741c162645eda0dbdc3a2c0c2aff5cf4 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Robert Marko <robimarko@gmail.com>
|
||||||
|
Date: Tue, 21 Dec 2021 14:49:36 +0100
|
||||||
|
Subject: [PATCH] arm64: dts: ipq8074: Add WLAN node
|
||||||
|
|
||||||
|
IPQ8074 has a AHB based Q6v5 802.11ax radios that are supported
|
||||||
|
by the ath11k.
|
||||||
|
|
||||||
|
Add the required DT node to enable the built-in radios.
|
||||||
|
|
||||||
|
Signed-off-by: Robert Marko <robimarko@gmail.com>
|
||||||
|
---
|
||||||
|
arch/arm64/boot/dts/qcom/ipq8074.dtsi | 111 ++++++++++++++++++++++++++
|
||||||
|
1 file changed, 111 insertions(+)
|
||||||
|
|
||||||
|
--- a/arch/arm64/boot/dts/qcom/ipq8074.dtsi
|
||||||
|
+++ b/arch/arm64/boot/dts/qcom/ipq8074.dtsi
|
||||||
|
@@ -1053,6 +1053,117 @@
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
+
|
||||||
|
+ wifi: wifi@c0000000 {
|
||||||
|
+ compatible = "qcom,ipq8074-wifi";
|
||||||
|
+ reg = <0xc000000 0x2000000>;
|
||||||
|
+
|
||||||
|
+ interrupts = <GIC_SPI 320 IRQ_TYPE_EDGE_RISING>,
|
||||||
|
+ <GIC_SPI 319 IRQ_TYPE_EDGE_RISING>,
|
||||||
|
+ <GIC_SPI 318 IRQ_TYPE_EDGE_RISING>,
|
||||||
|
+ <GIC_SPI 316 IRQ_TYPE_EDGE_RISING>,
|
||||||
|
+ <GIC_SPI 315 IRQ_TYPE_EDGE_RISING>,
|
||||||
|
+ <GIC_SPI 314 IRQ_TYPE_EDGE_RISING>,
|
||||||
|
+ <GIC_SPI 311 IRQ_TYPE_EDGE_RISING>,
|
||||||
|
+ <GIC_SPI 310 IRQ_TYPE_EDGE_RISING>,
|
||||||
|
+ <GIC_SPI 411 IRQ_TYPE_EDGE_RISING>,
|
||||||
|
+ <GIC_SPI 410 IRQ_TYPE_EDGE_RISING>,
|
||||||
|
+ <GIC_SPI 40 IRQ_TYPE_EDGE_RISING>,
|
||||||
|
+ <GIC_SPI 39 IRQ_TYPE_EDGE_RISING>,
|
||||||
|
+ <GIC_SPI 302 IRQ_TYPE_EDGE_RISING>,
|
||||||
|
+ <GIC_SPI 301 IRQ_TYPE_EDGE_RISING>,
|
||||||
|
+ <GIC_SPI 37 IRQ_TYPE_EDGE_RISING>,
|
||||||
|
+ <GIC_SPI 36 IRQ_TYPE_EDGE_RISING>,
|
||||||
|
+ <GIC_SPI 296 IRQ_TYPE_EDGE_RISING>,
|
||||||
|
+ <GIC_SPI 295 IRQ_TYPE_EDGE_RISING>,
|
||||||
|
+ <GIC_SPI 294 IRQ_TYPE_EDGE_RISING>,
|
||||||
|
+ <GIC_SPI 293 IRQ_TYPE_EDGE_RISING>,
|
||||||
|
+ <GIC_SPI 292 IRQ_TYPE_EDGE_RISING>,
|
||||||
|
+ <GIC_SPI 291 IRQ_TYPE_EDGE_RISING>,
|
||||||
|
+ <GIC_SPI 290 IRQ_TYPE_EDGE_RISING>,
|
||||||
|
+ <GIC_SPI 289 IRQ_TYPE_EDGE_RISING>,
|
||||||
|
+ <GIC_SPI 288 IRQ_TYPE_EDGE_RISING>,
|
||||||
|
+ <GIC_SPI 239 IRQ_TYPE_EDGE_RISING>,
|
||||||
|
+ <GIC_SPI 236 IRQ_TYPE_EDGE_RISING>,
|
||||||
|
+ <GIC_SPI 235 IRQ_TYPE_EDGE_RISING>,
|
||||||
|
+ <GIC_SPI 234 IRQ_TYPE_EDGE_RISING>,
|
||||||
|
+ <GIC_SPI 233 IRQ_TYPE_EDGE_RISING>,
|
||||||
|
+ <GIC_SPI 232 IRQ_TYPE_EDGE_RISING>,
|
||||||
|
+ <GIC_SPI 231 IRQ_TYPE_EDGE_RISING>,
|
||||||
|
+ <GIC_SPI 230 IRQ_TYPE_EDGE_RISING>,
|
||||||
|
+ <GIC_SPI 229 IRQ_TYPE_EDGE_RISING>,
|
||||||
|
+ <GIC_SPI 228 IRQ_TYPE_EDGE_RISING>,
|
||||||
|
+ <GIC_SPI 224 IRQ_TYPE_EDGE_RISING>,
|
||||||
|
+ <GIC_SPI 223 IRQ_TYPE_EDGE_RISING>,
|
||||||
|
+ <GIC_SPI 203 IRQ_TYPE_EDGE_RISING>,
|
||||||
|
+ <GIC_SPI 183 IRQ_TYPE_EDGE_RISING>,
|
||||||
|
+ <GIC_SPI 180 IRQ_TYPE_EDGE_RISING>,
|
||||||
|
+ <GIC_SPI 179 IRQ_TYPE_EDGE_RISING>,
|
||||||
|
+ <GIC_SPI 178 IRQ_TYPE_EDGE_RISING>,
|
||||||
|
+ <GIC_SPI 177 IRQ_TYPE_EDGE_RISING>,
|
||||||
|
+ <GIC_SPI 176 IRQ_TYPE_EDGE_RISING>,
|
||||||
|
+ <GIC_SPI 163 IRQ_TYPE_EDGE_RISING>,
|
||||||
|
+ <GIC_SPI 162 IRQ_TYPE_EDGE_RISING>,
|
||||||
|
+ <GIC_SPI 160 IRQ_TYPE_EDGE_RISING>,
|
||||||
|
+ <GIC_SPI 159 IRQ_TYPE_EDGE_RISING>,
|
||||||
|
+ <GIC_SPI 158 IRQ_TYPE_EDGE_RISING>,
|
||||||
|
+ <GIC_SPI 157 IRQ_TYPE_EDGE_RISING>,
|
||||||
|
+ <GIC_SPI 156 IRQ_TYPE_EDGE_RISING>;
|
||||||
|
+
|
||||||
|
+ interrupt-names = "misc-pulse1",
|
||||||
|
+ "misc-latch",
|
||||||
|
+ "sw-exception",
|
||||||
|
+ "ce0",
|
||||||
|
+ "ce1",
|
||||||
|
+ "ce2",
|
||||||
|
+ "ce3",
|
||||||
|
+ "ce4",
|
||||||
|
+ "ce5",
|
||||||
|
+ "ce6",
|
||||||
|
+ "ce7",
|
||||||
|
+ "ce8",
|
||||||
|
+ "ce9",
|
||||||
|
+ "ce10",
|
||||||
|
+ "ce11",
|
||||||
|
+ "host2wbm-desc-feed",
|
||||||
|
+ "host2reo-re-injection",
|
||||||
|
+ "host2reo-command",
|
||||||
|
+ "host2rxdma-monitor-ring3",
|
||||||
|
+ "host2rxdma-monitor-ring2",
|
||||||
|
+ "host2rxdma-monitor-ring1",
|
||||||
|
+ "reo2ost-exception",
|
||||||
|
+ "wbm2host-rx-release",
|
||||||
|
+ "reo2host-status",
|
||||||
|
+ "reo2host-destination-ring4",
|
||||||
|
+ "reo2host-destination-ring3",
|
||||||
|
+ "reo2host-destination-ring2",
|
||||||
|
+ "reo2host-destination-ring1",
|
||||||
|
+ "rxdma2host-monitor-destination-mac3",
|
||||||
|
+ "rxdma2host-monitor-destination-mac2",
|
||||||
|
+ "rxdma2host-monitor-destination-mac1",
|
||||||
|
+ "ppdu-end-interrupts-mac3",
|
||||||
|
+ "ppdu-end-interrupts-mac2",
|
||||||
|
+ "ppdu-end-interrupts-mac1",
|
||||||
|
+ "rxdma2host-monitor-status-ring-mac3",
|
||||||
|
+ "rxdma2host-monitor-status-ring-mac2",
|
||||||
|
+ "rxdma2host-monitor-status-ring-mac1",
|
||||||
|
+ "host2rxdma-host-buf-ring-mac3",
|
||||||
|
+ "host2rxdma-host-buf-ring-mac2",
|
||||||
|
+ "host2rxdma-host-buf-ring-mac1",
|
||||||
|
+ "rxdma2host-destination-ring-mac3",
|
||||||
|
+ "rxdma2host-destination-ring-mac2",
|
||||||
|
+ "rxdma2host-destination-ring-mac1",
|
||||||
|
+ "host2tcl-input-ring4",
|
||||||
|
+ "host2tcl-input-ring3",
|
||||||
|
+ "host2tcl-input-ring2",
|
||||||
|
+ "host2tcl-input-ring1",
|
||||||
|
+ "wbm2host-tx-completions-ring3",
|
||||||
|
+ "wbm2host-tx-completions-ring2",
|
||||||
|
+ "wbm2host-tx-completions-ring1",
|
||||||
|
+ "tcl2host-status-ring";
|
||||||
|
+ qcom,rproc = <&q6v5_wcss>;
|
||||||
|
+ status = "disabled";
|
||||||
|
+ };
|
||||||
|
};
|
||||||
|
|
||||||
|
timer {
|
@ -0,0 +1,59 @@
|
|||||||
|
From cb3ef99c1553565e1dc0301ccd5c1c0fa2d15c15 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Robert Marko <robimarko@gmail.com>
|
||||||
|
Date: Fri, 31 Dec 2021 17:56:14 +0100
|
||||||
|
Subject: [PATCH] arm64: dts: ipq8074: add CPU clock
|
||||||
|
|
||||||
|
Now that CPU clock is exposed and can be controlled, add the necessary
|
||||||
|
properties to the CPU nodes.
|
||||||
|
|
||||||
|
Signed-off-by: Robert Marko <robimarko@gmail.com>
|
||||||
|
---
|
||||||
|
arch/arm64/boot/dts/qcom/ipq8074.dtsi | 9 +++++++++
|
||||||
|
1 file changed, 9 insertions(+)
|
||||||
|
|
||||||
|
--- a/arch/arm64/boot/dts/qcom/ipq8074.dtsi
|
||||||
|
+++ b/arch/arm64/boot/dts/qcom/ipq8074.dtsi
|
||||||
|
@@ -5,6 +5,7 @@
|
||||||
|
|
||||||
|
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||||
|
#include <dt-bindings/clock/qcom,gcc-ipq8074.h>
|
||||||
|
+#include <dt-bindings/clock/qcom,apss-ipq.h>
|
||||||
|
|
||||||
|
/ {
|
||||||
|
#address-cells = <2>;
|
||||||
|
@@ -38,6 +39,8 @@
|
||||||
|
reg = <0x0>;
|
||||||
|
next-level-cache = <&L2_0>;
|
||||||
|
enable-method = "psci";
|
||||||
|
+ clocks = <&apcs_glb APCS_ALIAS0_CORE_CLK>;
|
||||||
|
+ clock-names = "cpu";
|
||||||
|
};
|
||||||
|
|
||||||
|
CPU1: cpu@1 {
|
||||||
|
@@ -46,6 +49,8 @@
|
||||||
|
enable-method = "psci";
|
||||||
|
reg = <0x1>;
|
||||||
|
next-level-cache = <&L2_0>;
|
||||||
|
+ clocks = <&apcs_glb APCS_ALIAS0_CORE_CLK>;
|
||||||
|
+ clock-names = "cpu";
|
||||||
|
};
|
||||||
|
|
||||||
|
CPU2: cpu@2 {
|
||||||
|
@@ -54,6 +59,8 @@
|
||||||
|
enable-method = "psci";
|
||||||
|
reg = <0x2>;
|
||||||
|
next-level-cache = <&L2_0>;
|
||||||
|
+ clocks = <&apcs_glb APCS_ALIAS0_CORE_CLK>;
|
||||||
|
+ clock-names = "cpu";
|
||||||
|
};
|
||||||
|
|
||||||
|
CPU3: cpu@3 {
|
||||||
|
@@ -62,6 +69,8 @@
|
||||||
|
enable-method = "psci";
|
||||||
|
reg = <0x3>;
|
||||||
|
next-level-cache = <&L2_0>;
|
||||||
|
+ clocks = <&apcs_glb APCS_ALIAS0_CORE_CLK>;
|
||||||
|
+ clock-names = "cpu";
|
||||||
|
};
|
||||||
|
|
||||||
|
L2_0: l2-cache {
|
@ -0,0 +1,48 @@
|
|||||||
|
From 347ca56e86c99021fad059b9a8ef101245b8507e Mon Sep 17 00:00:00 2001
|
||||||
|
From: Robert Marko <robimarko@gmail.com>
|
||||||
|
Date: Fri, 31 Dec 2021 20:38:06 +0100
|
||||||
|
Subject: [PATCH] arm64: dts: ipq8074: add cooling cells to CPU nodes
|
||||||
|
|
||||||
|
Since there is CPU Freq support as well as thermal sensor support
|
||||||
|
now for the IPQ8074, add cooling cells to CPU nodes so that they can
|
||||||
|
be used as cooling devices using CPU Freq.
|
||||||
|
|
||||||
|
Signed-off-by: Robert Marko <robimarko@gmail.com>
|
||||||
|
---
|
||||||
|
arch/arm64/boot/dts/qcom/ipq8074.dtsi | 4 ++++
|
||||||
|
1 file changed, 4 insertions(+)
|
||||||
|
|
||||||
|
--- a/arch/arm64/boot/dts/qcom/ipq8074.dtsi
|
||||||
|
+++ b/arch/arm64/boot/dts/qcom/ipq8074.dtsi
|
||||||
|
@@ -41,6 +41,7 @@
|
||||||
|
enable-method = "psci";
|
||||||
|
clocks = <&apcs_glb APCS_ALIAS0_CORE_CLK>;
|
||||||
|
clock-names = "cpu";
|
||||||
|
+ #cooling-cells = <2>;
|
||||||
|
};
|
||||||
|
|
||||||
|
CPU1: cpu@1 {
|
||||||
|
@@ -51,6 +52,7 @@
|
||||||
|
next-level-cache = <&L2_0>;
|
||||||
|
clocks = <&apcs_glb APCS_ALIAS0_CORE_CLK>;
|
||||||
|
clock-names = "cpu";
|
||||||
|
+ #cooling-cells = <2>;
|
||||||
|
};
|
||||||
|
|
||||||
|
CPU2: cpu@2 {
|
||||||
|
@@ -61,6 +63,7 @@
|
||||||
|
next-level-cache = <&L2_0>;
|
||||||
|
clocks = <&apcs_glb APCS_ALIAS0_CORE_CLK>;
|
||||||
|
clock-names = "cpu";
|
||||||
|
+ #cooling-cells = <2>;
|
||||||
|
};
|
||||||
|
|
||||||
|
CPU3: cpu@3 {
|
||||||
|
@@ -71,6 +74,7 @@
|
||||||
|
next-level-cache = <&L2_0>;
|
||||||
|
clocks = <&apcs_glb APCS_ALIAS0_CORE_CLK>;
|
||||||
|
clock-names = "cpu";
|
||||||
|
+ #cooling-cells = <2>;
|
||||||
|
};
|
||||||
|
|
||||||
|
L2_0: l2-cache {
|
@ -0,0 +1,121 @@
|
|||||||
|
From 04d2fc6a551bbd972a6428059b45ce79cb9de9d7 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Robert Marko <robimarko@gmail.com>
|
||||||
|
Date: Fri, 6 May 2022 22:38:24 +0200
|
||||||
|
Subject: [PATCH] arm64: dts: qcom: ipq8074: add QFPROM fuses
|
||||||
|
|
||||||
|
Add the QFPROM node and CPR fuses.
|
||||||
|
|
||||||
|
Signed-off-by: Robert Marko <robimarko@gmail.com>
|
||||||
|
---
|
||||||
|
arch/arm64/boot/dts/qcom/ipq8074.dtsi | 107 ++++++++++++++++++++++++++
|
||||||
|
1 file changed, 107 insertions(+)
|
||||||
|
|
||||||
|
--- a/arch/arm64/boot/dts/qcom/ipq8074.dtsi
|
||||||
|
+++ b/arch/arm64/boot/dts/qcom/ipq8074.dtsi
|
||||||
|
@@ -349,6 +349,106 @@
|
||||||
|
reg = <0x000a4000 0x2000>;
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <1>;
|
||||||
|
+
|
||||||
|
+ cpr_efuse_speedbin: speedbin@125 {
|
||||||
|
+ reg = <0x125 0x1>;
|
||||||
|
+ bits = <0 3>;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ cpr_efuse_boost_cfg: boost_cfg@125 {
|
||||||
|
+ reg = <0x125 0x1>;
|
||||||
|
+ bits = <3 3>;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ cpr_efuse_misc_volt_adj: misc_volt_adj@125 {
|
||||||
|
+ reg = <0x125 0x1>;
|
||||||
|
+ bits = <3 3>;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ cpr_efuse_boost_volt: boost_volt@126 {
|
||||||
|
+ reg = <0x126 0x1>;
|
||||||
|
+ bits = <6 1>;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ cpr_efuse_revision: revision@23e {
|
||||||
|
+ reg = <0x23e 0x1>;
|
||||||
|
+ bits = <5 3>;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ cpr_efuse_ro_sel0: rosel0@249 {
|
||||||
|
+ reg = <0x249 0x1>;
|
||||||
|
+ bits = <0 4>;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ cpr_efuse_ro_sel1: rosel1@248 {
|
||||||
|
+ reg = <0x248 0x1>;
|
||||||
|
+ bits = <4 4>;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ cpr_efuse_ro_sel2: rosel2@248 {
|
||||||
|
+ reg = <0x248 0x2>;
|
||||||
|
+ bits = <0 4>;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ cpr_efuse_ro_sel3: rosel3@249 {
|
||||||
|
+ reg = <0x249 0x1>;
|
||||||
|
+ bits = <4 4>;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ cpr_efuse_init_voltage0: ivoltage0@23a {
|
||||||
|
+ reg = <0x23a 0x1>;
|
||||||
|
+ bits = <2 6>;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ cpr_efuse_init_voltage1: ivoltage1@239 {
|
||||||
|
+ reg = <0x239 0x2>;
|
||||||
|
+ bits = <4 6>;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ cpr_efuse_init_voltage2: ivoltage2@238 {
|
||||||
|
+ reg = <0x238 0x2>;
|
||||||
|
+ bits = <6 6>;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ cpr_efuse_init_voltage3: ivoltage3@238 {
|
||||||
|
+ reg = <0x238 0x1>;
|
||||||
|
+ bits = <0 6>;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ cpr_efuse_quot0: quot0@244 {
|
||||||
|
+ reg = <0x244 0x2>;
|
||||||
|
+ bits = <0 12>;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ cpr_efuse_quot1: quot1@242 {
|
||||||
|
+ reg = <0x242 0x2>;
|
||||||
|
+ bits = <4 12>;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ cpr_efuse_quot2: quot2@241 {
|
||||||
|
+ reg = <0x241 0x2>;
|
||||||
|
+ bits = <0 12>;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ cpr_efuse_quot3: quot3@245 {
|
||||||
|
+ reg = <0x245 0x2>;
|
||||||
|
+ bits = <4 12>;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ cpr_efuse_quot0_offset: quot0_offset@23d {
|
||||||
|
+ reg = <0x23d 0x2>;
|
||||||
|
+ bits = <6 7>;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ cpr_efuse_quot1_offset: quot1_offset@23c {
|
||||||
|
+ reg = <0x23c 0x2>;
|
||||||
|
+ bits = <7 7>;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ cpr_efuse_quot2_offset: quot2_offset@23c {
|
||||||
|
+ reg = <0x23c 0x1>;
|
||||||
|
+ bits = <0 7>;
|
||||||
|
+ };
|
||||||
|
};
|
||||||
|
|
||||||
|
prng: rng@e3000 {
|
@ -0,0 +1,102 @@
|
|||||||
|
From a20c4e8738a00087aa5d53fe5148ed484e23d229 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Robert Marko <robimarko@gmail.com>
|
||||||
|
Date: Sat, 31 Dec 2022 13:56:26 +0100
|
||||||
|
Subject: [PATCH] arm64: dts: qcom: ipq8074: add CPU OPP table
|
||||||
|
|
||||||
|
Now that there is NVMEM CPUFreq support for IPQ8074, we can add the OPP
|
||||||
|
table for SoC.
|
||||||
|
|
||||||
|
Signed-off-by: Robert Marko <robimarko@gmail.com>
|
||||||
|
---
|
||||||
|
arch/arm64/boot/dts/qcom/ipq8074.dtsi | 52 +++++++++++++++++++++++++++
|
||||||
|
1 file changed, 52 insertions(+)
|
||||||
|
|
||||||
|
--- a/arch/arm64/boot/dts/qcom/ipq8074.dtsi
|
||||||
|
+++ b/arch/arm64/boot/dts/qcom/ipq8074.dtsi
|
||||||
|
@@ -42,6 +42,7 @@
|
||||||
|
clocks = <&apcs_glb APCS_ALIAS0_CORE_CLK>;
|
||||||
|
clock-names = "cpu";
|
||||||
|
#cooling-cells = <2>;
|
||||||
|
+ operating-points-v2 = <&cpu_opp_table>;
|
||||||
|
};
|
||||||
|
|
||||||
|
CPU1: cpu@1 {
|
||||||
|
@@ -53,6 +54,7 @@
|
||||||
|
clocks = <&apcs_glb APCS_ALIAS0_CORE_CLK>;
|
||||||
|
clock-names = "cpu";
|
||||||
|
#cooling-cells = <2>;
|
||||||
|
+ operating-points-v2 = <&cpu_opp_table>;
|
||||||
|
};
|
||||||
|
|
||||||
|
CPU2: cpu@2 {
|
||||||
|
@@ -64,6 +66,7 @@
|
||||||
|
clocks = <&apcs_glb APCS_ALIAS0_CORE_CLK>;
|
||||||
|
clock-names = "cpu";
|
||||||
|
#cooling-cells = <2>;
|
||||||
|
+ operating-points-v2 = <&cpu_opp_table>;
|
||||||
|
};
|
||||||
|
|
||||||
|
CPU3: cpu@3 {
|
||||||
|
@@ -75,6 +78,7 @@
|
||||||
|
clocks = <&apcs_glb APCS_ALIAS0_CORE_CLK>;
|
||||||
|
clock-names = "cpu";
|
||||||
|
#cooling-cells = <2>;
|
||||||
|
+ operating-points-v2 = <&cpu_opp_table>;
|
||||||
|
};
|
||||||
|
|
||||||
|
L2_0: l2-cache {
|
||||||
|
@@ -84,6 +88,54 @@
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
+ cpu_opp_table: opp-table {
|
||||||
|
+ compatible = "operating-points-v2-kryo-cpu";
|
||||||
|
+ nvmem-cells = <&cpr_efuse_speedbin>;
|
||||||
|
+ opp-shared;
|
||||||
|
+
|
||||||
|
+ opp-1017600000 {
|
||||||
|
+ opp-hz = /bits/ 64 <1017600000>;
|
||||||
|
+ opp-microvolt = <1>;
|
||||||
|
+ opp-supported-hw = <0xf>;
|
||||||
|
+ clock-latency-ns = <200000>;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ opp-1382400000 {
|
||||||
|
+ opp-hz = /bits/ 64 <1382400000>;
|
||||||
|
+ opp-microvolt = <2>;
|
||||||
|
+ opp-supported-hw = <0xf>;
|
||||||
|
+ clock-latency-ns = <200000>;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ opp-1651200000 {
|
||||||
|
+ opp-hz = /bits/ 64 <1651200000>;
|
||||||
|
+ opp-microvolt = <3>;
|
||||||
|
+ opp-supported-hw = <0x1>;
|
||||||
|
+ clock-latency-ns = <200000>;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ opp-1843200000 {
|
||||||
|
+ opp-hz = /bits/ 64 <1843200000>;
|
||||||
|
+ opp-microvolt = <4>;
|
||||||
|
+ opp-supported-hw = <0x1>;
|
||||||
|
+ clock-latency-ns = <200000>;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ opp-1920000000 {
|
||||||
|
+ opp-hz = /bits/ 64 <1920000000>;
|
||||||
|
+ opp-microvolt = <5>;
|
||||||
|
+ opp-supported-hw = <0x1>;
|
||||||
|
+ clock-latency-ns = <200000>;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ opp-2208000000 {
|
||||||
|
+ opp-hz = /bits/ 64 <2208000000>;
|
||||||
|
+ opp-microvolt = <6>;
|
||||||
|
+ opp-supported-hw = <0x1>;
|
||||||
|
+ clock-latency-ns = <200000>;
|
||||||
|
+ };
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
pmu {
|
||||||
|
compatible = "arm,cortex-a53-pmu";
|
||||||
|
interrupts = <GIC_PPI 7 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_HIGH)>;
|
@ -0,0 +1,61 @@
|
|||||||
|
From 9dd19a9ae36bc60d58287d0c52e53024d484e64d Mon Sep 17 00:00:00 2001
|
||||||
|
From: Gokul Sriram Palanisamy <gokulsri@codeaurora.org>
|
||||||
|
Date: Fri, 29 Jan 2021 22:41:59 +0530
|
||||||
|
Subject: [PATCH 2/3] remoteproc: qcom: wcss: populate driver data for IPQ6018
|
||||||
|
|
||||||
|
Populate hardcoded param using driver data for IPQ6018 SoCs.
|
||||||
|
|
||||||
|
Signed-off-by: Gokul Sriram Palanisamy <gokulsri@codeaurora.org>
|
||||||
|
---
|
||||||
|
drivers/remoteproc/qcom_q6v5_wcss.c | 19 +++++++++++++++++--
|
||||||
|
1 file changed, 17 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
--- a/drivers/remoteproc/qcom_q6v5_wcss.c
|
||||||
|
+++ b/drivers/remoteproc/qcom_q6v5_wcss.c
|
||||||
|
@@ -969,7 +969,7 @@ static int q6v5_alloc_memory_region(stru
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
-static int ipq8074_init_clock(struct q6v5_wcss *wcss)
|
||||||
|
+static int ipq_init_clock(struct q6v5_wcss *wcss)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
@@ -1176,7 +1176,7 @@ static void q6v5_wcss_remove(struct plat
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct wcss_data wcss_ipq8074_res_init = {
|
||||||
|
- .init_clock = ipq8074_init_clock,
|
||||||
|
+ .init_clock = ipq_init_clock,
|
||||||
|
.q6_firmware_name = "IPQ8074/q6_fw.mdt",
|
||||||
|
.m3_firmware_name = "IPQ8074/m3_fw.mdt",
|
||||||
|
.crash_reason_smem = WCSS_CRASH_REASON,
|
||||||
|
@@ -1190,6 +1190,20 @@ static const struct wcss_data wcss_ipq80
|
||||||
|
.need_auto_boot = false,
|
||||||
|
};
|
||||||
|
|
||||||
|
+static const struct wcss_data wcss_ipq6018_res_init = {
|
||||||
|
+ .init_clock = ipq_init_clock,
|
||||||
|
+ .q6_firmware_name = "IPQ6018/q6_fw.mdt",
|
||||||
|
+ .m3_firmware_name = "IPQ6018/m3_fw.mdt",
|
||||||
|
+ .crash_reason_smem = WCSS_CRASH_REASON,
|
||||||
|
+ .aon_reset_required = true,
|
||||||
|
+ .wcss_q6_reset_required = true,
|
||||||
|
+ .bcr_reset_required = false,
|
||||||
|
+ .ssr_name = "q6wcss",
|
||||||
|
+ .ops = &q6v5_wcss_ipq8074_ops,
|
||||||
|
+ .requires_force_stop = true,
|
||||||
|
+ .need_mem_protection = true,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
static const struct wcss_data wcss_qcs404_res_init = {
|
||||||
|
.init_clock = qcs404_init_clock,
|
||||||
|
.init_regulator = qcs404_init_regulator,
|
||||||
|
@@ -1209,6 +1223,7 @@ static const struct wcss_data wcss_qcs40
|
||||||
|
|
||||||
|
static const struct of_device_id q6v5_wcss_of_match[] = {
|
||||||
|
{ .compatible = "qcom,ipq8074-wcss-pil", .data = &wcss_ipq8074_res_init },
|
||||||
|
+ { .compatible = "qcom,ipq6018-wcss-pil", .data = &wcss_ipq6018_res_init },
|
||||||
|
{ .compatible = "qcom,qcs404-wcss-pil", .data = &wcss_qcs404_res_init },
|
||||||
|
{ },
|
||||||
|
};
|
@ -0,0 +1,45 @@
|
|||||||
|
From e4d7544ce092807e8c5aeb618cec30e2eb9b40c2 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Mantas Pucka <mantas@8devices.com>
|
||||||
|
Date: Mon, 24 Apr 2023 15:13:32 +0300
|
||||||
|
Subject: [PATCH 3/3] arm64: dts: qcom: ipq6018: add SDHCI node
|
||||||
|
|
||||||
|
IPQ6018 has one SD/eMMC controller, add node for it.
|
||||||
|
|
||||||
|
Signed-off-by: Mantas Pucka <mantas@8devices.com>
|
||||||
|
Tested-by: Robert Marko <robimarko@gmail.com>
|
||||||
|
---
|
||||||
|
arch/arm64/boot/dts/qcom/ipq6018.dtsi | 23 +++++++++++++++++++++++
|
||||||
|
1 file changed, 23 insertions(+)
|
||||||
|
|
||||||
|
--- a/arch/arm64/boot/dts/qcom/ipq6018.dtsi
|
||||||
|
+++ b/arch/arm64/boot/dts/qcom/ipq6018.dtsi
|
||||||
|
@@ -470,6 +470,29 @@
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
+ sdhc_1: mmc@7804000 {
|
||||||
|
+ compatible = "qcom,ipq6018-sdhci", "qcom,sdhci-msm-v5";
|
||||||
|
+ reg = <0x0 0x07804000 0x0 0x1000>,
|
||||||
|
+ <0x0 0x07805000 0x0 0x1000>,
|
||||||
|
+ <0x0 0x07808000 0x0 0x2000>;
|
||||||
|
+ reg-names = "hc", "cqhci", "ice";
|
||||||
|
+
|
||||||
|
+ interrupts = <GIC_SPI 123 IRQ_TYPE_LEVEL_HIGH>,
|
||||||
|
+ <GIC_SPI 138 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
+ interrupt-names = "hc_irq", "pwr_irq";
|
||||||
|
+
|
||||||
|
+ clocks = <&gcc GCC_SDCC1_AHB_CLK>,
|
||||||
|
+ <&gcc GCC_SDCC1_APPS_CLK>,
|
||||||
|
+ <&xo>,
|
||||||
|
+ <&gcc GCC_SDCC1_ICE_CORE_CLK>;
|
||||||
|
+ clock-names = "iface", "core", "xo", "ice";
|
||||||
|
+
|
||||||
|
+ resets = <&gcc GCC_SDCC1_BCR>;
|
||||||
|
+ supports-cqe;
|
||||||
|
+ bus-width = <8>;
|
||||||
|
+ status = "disabled";
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
blsp_dma: dma-controller@7884000 {
|
||||||
|
compatible = "qcom,bam-v1.7.0";
|
||||||
|
reg = <0x0 0x07884000 0x0 0x2b000>;
|
@ -0,0 +1,27 @@
|
|||||||
|
From d24bc08bfc66f47d6e0a294a080d62893a7696b5 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Chukun Pan <amadeus@jmu.edu.cn>
|
||||||
|
Date: Thu, 18 Jan 2024 21:30:21 +0800
|
||||||
|
Subject: [PATCH] arm64: dts: qcom: ipq6018: add LDOA2 regulator
|
||||||
|
|
||||||
|
Add LDOA2 regulator of MP5496 to support SDCC voltage scaling.
|
||||||
|
|
||||||
|
Suggested-by: Robert Marko <robimarko@gmail.com>
|
||||||
|
Signed-off-by: Chukun Pan <amadeus@jmu.edu.cn>
|
||||||
|
---
|
||||||
|
arch/arm64/boot/dts/qcom/ipq6018.dtsi | 5 +++++
|
||||||
|
1 file changed, 5 insertions(+)
|
||||||
|
|
||||||
|
--- a/arch/arm64/boot/dts/qcom/ipq6018.dtsi
|
||||||
|
+++ b/arch/arm64/boot/dts/qcom/ipq6018.dtsi
|
||||||
|
@@ -179,6 +179,11 @@
|
||||||
|
regulator-max-microvolt = <1062500>;
|
||||||
|
regulator-always-on;
|
||||||
|
};
|
||||||
|
+
|
||||||
|
+ ipq6018_l2: l2 {
|
||||||
|
+ regulator-min-microvolt = <1800000>;
|
||||||
|
+ regulator-max-microvolt = <3300000>;
|
||||||
|
+ };
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
@ -0,0 +1,63 @@
|
|||||||
|
From: Devi Priya <quic_devipriy@quicinc.com>
|
||||||
|
Date: Thu, 5 Oct 2023 21:35:48 +0530
|
||||||
|
Subject: [PATCH] dt-bindings: pwm: add IPQ6018 binding
|
||||||
|
|
||||||
|
DT binding for the PWM block in Qualcomm IPQ6018 SoC.
|
||||||
|
|
||||||
|
Reviewed-by: Bjorn Andersson <bjorn.andersson@linaro.org>
|
||||||
|
Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
|
||||||
|
Co-developed-by: Baruch Siach <baruch.siach@siklu.com>
|
||||||
|
Signed-off-by: Baruch Siach <baruch.siach@siklu.com>
|
||||||
|
Signed-off-by: Devi Priya <quic_devipriy@quicinc.com>
|
||||||
|
---
|
||||||
|
diff --git a/Documentation/devicetree/bindings/pwm/qcom,ipq6018-pwm.yaml b/Documentation/devicetree/bindings/pwm/qcom,ipq6018-pwm.yaml
|
||||||
|
new file mode 100644
|
||||||
|
index 000000000000..6d0d7ed271f7
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/Documentation/devicetree/bindings/pwm/qcom,ipq6018-pwm.yaml
|
||||||
|
@@ -0,0 +1,45 @@
|
||||||
|
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||||
|
+%YAML 1.2
|
||||||
|
+---
|
||||||
|
+$id: http://devicetree.org/schemas/pwm/qcom,ipq6018-pwm.yaml#
|
||||||
|
+$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
|
+
|
||||||
|
+title: Qualcomm IPQ6018 PWM controller
|
||||||
|
+
|
||||||
|
+maintainers:
|
||||||
|
+ - Baruch Siach <baruch@tkos.co.il>
|
||||||
|
+
|
||||||
|
+properties:
|
||||||
|
+ compatible:
|
||||||
|
+ const: qcom,ipq6018-pwm
|
||||||
|
+
|
||||||
|
+ reg:
|
||||||
|
+ description: Offset of PWM register in the TCSR block.
|
||||||
|
+ maxItems: 1
|
||||||
|
+
|
||||||
|
+ clocks:
|
||||||
|
+ maxItems: 1
|
||||||
|
+
|
||||||
|
+ "#pwm-cells":
|
||||||
|
+ const: 2
|
||||||
|
+
|
||||||
|
+required:
|
||||||
|
+ - compatible
|
||||||
|
+ - reg
|
||||||
|
+ - clocks
|
||||||
|
+ - "#pwm-cells"
|
||||||
|
+
|
||||||
|
+additionalProperties: false
|
||||||
|
+
|
||||||
|
+examples:
|
||||||
|
+ - |
|
||||||
|
+ #include <dt-bindings/clock/qcom,gcc-ipq6018.h>
|
||||||
|
+
|
||||||
|
+ pwm: pwm@a010 {
|
||||||
|
+ compatible = "qcom,ipq6018-pwm";
|
||||||
|
+ reg = <0xa010 0x20>;
|
||||||
|
+ clocks = <&gcc GCC_ADSS_PWM_CLK>;
|
||||||
|
+ assigned-clocks = <&gcc GCC_ADSS_PWM_CLK>;
|
||||||
|
+ assigned-clock-rates = <100000000>;
|
||||||
|
+ #pwm-cells = <2>;
|
||||||
|
+ };
|
@ -0,0 +1,337 @@
|
|||||||
|
From: Devi Priya <quic_devipriy@quicinc.com>
|
||||||
|
Date: Thu, 5 Oct 2023 21:35:47 +0530
|
||||||
|
Subject: [PATCH] pwm: driver for qualcomm ipq6018 pwm block
|
||||||
|
|
||||||
|
Driver for the PWM block in Qualcomm IPQ6018 line of SoCs. Based on
|
||||||
|
driver from downstream Codeaurora kernel tree. Removed support for older
|
||||||
|
(V1) variants because I have no access to that hardware.
|
||||||
|
|
||||||
|
Tested on IPQ6010 based hardware.
|
||||||
|
|
||||||
|
Co-developed-by: Baruch Siach <baruch.siach@siklu.com>
|
||||||
|
Signed-off-by: Baruch Siach <baruch.siach@siklu.com>
|
||||||
|
Signed-off-by: Devi Priya <quic_devipriy@quicinc.com>
|
||||||
|
---
|
||||||
|
diff --git a/drivers/pwm/Kconfig b/drivers/pwm/Kconfig
|
||||||
|
index 8ebcddf91f7b..c2d51680823a 100644
|
||||||
|
--- a/drivers/pwm/Kconfig
|
||||||
|
+++ b/drivers/pwm/Kconfig
|
||||||
|
@@ -282,6 +282,18 @@ config PWM_INTEL_LGM
|
||||||
|
To compile this driver as a module, choose M here: the module
|
||||||
|
will be called pwm-intel-lgm.
|
||||||
|
|
||||||
|
+config PWM_IPQ
|
||||||
|
+ tristate "IPQ PWM support"
|
||||||
|
+ depends on ARCH_QCOM || COMPILE_TEST
|
||||||
|
+ depends on HAVE_CLK && HAS_IOMEM
|
||||||
|
+ help
|
||||||
|
+ Generic PWM framework driver for IPQ PWM block which supports
|
||||||
|
+ 4 pwm channels. Each of the these channels can be configured
|
||||||
|
+ independent of each other.
|
||||||
|
+
|
||||||
|
+ To compile this driver as a module, choose M here: the module
|
||||||
|
+ will be called pwm-ipq.
|
||||||
|
+
|
||||||
|
config PWM_IQS620A
|
||||||
|
tristate "Azoteq IQS620A PWM support"
|
||||||
|
depends on MFD_IQS62X || COMPILE_TEST
|
||||||
|
diff --git a/drivers/pwm/Makefile b/drivers/pwm/Makefile
|
||||||
|
index c822389c2a24..1b69e8cb2b91 100644
|
||||||
|
--- a/drivers/pwm/Makefile
|
||||||
|
+++ b/drivers/pwm/Makefile
|
||||||
|
@@ -24,6 +24,7 @@ obj-$(CONFIG_PWM_IMX1) += pwm-imx1.o
|
||||||
|
obj-$(CONFIG_PWM_IMX27) += pwm-imx27.o
|
||||||
|
obj-$(CONFIG_PWM_IMX_TPM) += pwm-imx-tpm.o
|
||||||
|
obj-$(CONFIG_PWM_INTEL_LGM) += pwm-intel-lgm.o
|
||||||
|
+obj-$(CONFIG_PWM_IPQ) += pwm-ipq.o
|
||||||
|
obj-$(CONFIG_PWM_IQS620A) += pwm-iqs620a.o
|
||||||
|
obj-$(CONFIG_PWM_JZ4740) += pwm-jz4740.o
|
||||||
|
obj-$(CONFIG_PWM_KEEMBAY) += pwm-keembay.o
|
||||||
|
diff --git a/drivers/pwm/pwm-ipq.c b/drivers/pwm/pwm-ipq.c
|
||||||
|
new file mode 100644
|
||||||
|
index 000000000000..5dbe46bb56d6
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/drivers/pwm/pwm-ipq.c
|
||||||
|
@@ -0,0 +1,282 @@
|
||||||
|
+// SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
|
||||||
|
+/*
|
||||||
|
+ * Copyright (c) 2016-2017, 2020 The Linux Foundation. All rights reserved.
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+#include <linux/module.h>
|
||||||
|
+#include <linux/platform_device.h>
|
||||||
|
+#include <linux/pwm.h>
|
||||||
|
+#include <linux/clk.h>
|
||||||
|
+#include <linux/io.h>
|
||||||
|
+#include <linux/of.h>
|
||||||
|
+#include <linux/math64.h>
|
||||||
|
+#include <linux/of_device.h>
|
||||||
|
+#include <linux/bitfield.h>
|
||||||
|
+#include <linux/units.h>
|
||||||
|
+
|
||||||
|
+/* The frequency range supported is 1 Hz to clock rate */
|
||||||
|
+#define IPQ_PWM_MAX_PERIOD_NS ((u64)NSEC_PER_SEC)
|
||||||
|
+
|
||||||
|
+/*
|
||||||
|
+ * The max value specified for each field is based on the number of bits
|
||||||
|
+ * in the pwm control register for that field
|
||||||
|
+ */
|
||||||
|
+#define IPQ_PWM_MAX_DIV 0xFFFF
|
||||||
|
+
|
||||||
|
+/*
|
||||||
|
+ * Two 32-bit registers for each PWM: REG0, and REG1.
|
||||||
|
+ * Base offset for PWM #i is at 8 * #i.
|
||||||
|
+ */
|
||||||
|
+#define IPQ_PWM_REG0 0
|
||||||
|
+#define IPQ_PWM_REG0_PWM_DIV GENMASK(15, 0)
|
||||||
|
+#define IPQ_PWM_REG0_HI_DURATION GENMASK(31, 16)
|
||||||
|
+
|
||||||
|
+#define IPQ_PWM_REG1 4
|
||||||
|
+#define IPQ_PWM_REG1_PRE_DIV GENMASK(15, 0)
|
||||||
|
+/*
|
||||||
|
+ * Enable bit is set to enable output toggling in pwm device.
|
||||||
|
+ * Update bit is set to reflect the changed divider and high duration
|
||||||
|
+ * values in register.
|
||||||
|
+ */
|
||||||
|
+#define IPQ_PWM_REG1_UPDATE BIT(30)
|
||||||
|
+#define IPQ_PWM_REG1_ENABLE BIT(31)
|
||||||
|
+
|
||||||
|
+struct ipq_pwm_chip {
|
||||||
|
+ struct pwm_chip chip;
|
||||||
|
+ struct clk *clk;
|
||||||
|
+ void __iomem *mem;
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static struct ipq_pwm_chip *ipq_pwm_from_chip(struct pwm_chip *chip)
|
||||||
|
+{
|
||||||
|
+ return container_of(chip, struct ipq_pwm_chip, chip);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static unsigned int ipq_pwm_reg_read(struct pwm_device *pwm, unsigned int reg)
|
||||||
|
+{
|
||||||
|
+ struct ipq_pwm_chip *ipq_chip = ipq_pwm_from_chip(pwm->chip);
|
||||||
|
+ unsigned int off = 8 * pwm->hwpwm + reg;
|
||||||
|
+
|
||||||
|
+ return readl(ipq_chip->mem + off);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void ipq_pwm_reg_write(struct pwm_device *pwm, unsigned int reg,
|
||||||
|
+ unsigned int val)
|
||||||
|
+{
|
||||||
|
+ struct ipq_pwm_chip *ipq_chip = ipq_pwm_from_chip(pwm->chip);
|
||||||
|
+ unsigned int off = 8 * pwm->hwpwm + reg;
|
||||||
|
+
|
||||||
|
+ writel(val, ipq_chip->mem + off);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void config_div_and_duty(struct pwm_device *pwm, unsigned int pre_div,
|
||||||
|
+ unsigned int pwm_div, unsigned long rate, u64 duty_ns,
|
||||||
|
+ bool enable)
|
||||||
|
+{
|
||||||
|
+ unsigned long hi_dur;
|
||||||
|
+ unsigned long val = 0;
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
+ * high duration = pwm duty * (pwm div + 1)
|
||||||
|
+ * pwm duty = duty_ns / period_ns
|
||||||
|
+ */
|
||||||
|
+ hi_dur = div64_u64(duty_ns * rate, (pre_div + 1) * NSEC_PER_SEC);
|
||||||
|
+
|
||||||
|
+ val = FIELD_PREP(IPQ_PWM_REG0_HI_DURATION, hi_dur) |
|
||||||
|
+ FIELD_PREP(IPQ_PWM_REG0_PWM_DIV, pwm_div);
|
||||||
|
+ ipq_pwm_reg_write(pwm, IPQ_PWM_REG0, val);
|
||||||
|
+
|
||||||
|
+ val = FIELD_PREP(IPQ_PWM_REG1_PRE_DIV, pre_div);
|
||||||
|
+ ipq_pwm_reg_write(pwm, IPQ_PWM_REG1, val);
|
||||||
|
+
|
||||||
|
+ /* PWM enable toggle needs a separate write to REG1 */
|
||||||
|
+ val |= IPQ_PWM_REG1_UPDATE;
|
||||||
|
+ if (enable)
|
||||||
|
+ val |= IPQ_PWM_REG1_ENABLE;
|
||||||
|
+ ipq_pwm_reg_write(pwm, IPQ_PWM_REG1, val);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int ipq_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm,
|
||||||
|
+ const struct pwm_state *state)
|
||||||
|
+{
|
||||||
|
+ struct ipq_pwm_chip *ipq_chip = ipq_pwm_from_chip(chip);
|
||||||
|
+ unsigned int pre_div, pwm_div, best_pre_div, best_pwm_div;
|
||||||
|
+ unsigned long rate = clk_get_rate(ipq_chip->clk);
|
||||||
|
+ u64 period_ns, duty_ns, period_rate;
|
||||||
|
+ u64 min_diff;
|
||||||
|
+
|
||||||
|
+ if (state->polarity != PWM_POLARITY_NORMAL)
|
||||||
|
+ return -EINVAL;
|
||||||
|
+
|
||||||
|
+ if (state->period < DIV64_U64_ROUND_UP(NSEC_PER_SEC, rate))
|
||||||
|
+ return -ERANGE;
|
||||||
|
+
|
||||||
|
+ period_ns = min(state->period, IPQ_PWM_MAX_PERIOD_NS);
|
||||||
|
+ duty_ns = min(state->duty_cycle, period_ns);
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
+ * period_ns is 1G or less. As long as rate is less than 16 GHz,
|
||||||
|
+ * period_rate does not overflow. Make that explicit.
|
||||||
|
+ */
|
||||||
|
+ if ((unsigned long long)rate > 16ULL * GIGA)
|
||||||
|
+ return -EINVAL;
|
||||||
|
+ period_rate = period_ns * rate;
|
||||||
|
+ best_pre_div = IPQ_PWM_MAX_DIV;
|
||||||
|
+ best_pwm_div = IPQ_PWM_MAX_DIV;
|
||||||
|
+ /*
|
||||||
|
+ * We don't need to consider pre_div values smaller than
|
||||||
|
+ *
|
||||||
|
+ * period_rate
|
||||||
|
+ * pre_div_min := ------------------------------------
|
||||||
|
+ * NSEC_PER_SEC * (IPQ_PWM_MAX_DIV + 1)
|
||||||
|
+ *
|
||||||
|
+ * because pre_div = pre_div_min results in a better
|
||||||
|
+ * approximation.
|
||||||
|
+ */
|
||||||
|
+ pre_div = div64_u64(period_rate,
|
||||||
|
+ (u64)NSEC_PER_SEC * (IPQ_PWM_MAX_DIV + 1));
|
||||||
|
+ min_diff = period_rate;
|
||||||
|
+
|
||||||
|
+ for (; pre_div <= IPQ_PWM_MAX_DIV; pre_div++) {
|
||||||
|
+ u64 remainder;
|
||||||
|
+
|
||||||
|
+ pwm_div = div64_u64_rem(period_rate,
|
||||||
|
+ (u64)NSEC_PER_SEC * (pre_div + 1), &remainder);
|
||||||
|
+ /* pwm_div is unsigned; the check below catches underflow */
|
||||||
|
+ pwm_div--;
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
+ * Swapping values for pre_div and pwm_div produces the same
|
||||||
|
+ * period length. So we can skip all settings with pre_div >
|
||||||
|
+ * pwm_div which results in bigger constraints for selecting
|
||||||
|
+ * the duty_cycle than with the two values swapped.
|
||||||
|
+ */
|
||||||
|
+ if (pre_div > pwm_div)
|
||||||
|
+ break;
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
+ * Make sure we can do 100% duty cycle where
|
||||||
|
+ * hi_dur == pwm_div + 1
|
||||||
|
+ */
|
||||||
|
+ if (pwm_div > IPQ_PWM_MAX_DIV - 1)
|
||||||
|
+ continue;
|
||||||
|
+
|
||||||
|
+ if (remainder < min_diff) {
|
||||||
|
+ best_pre_div = pre_div;
|
||||||
|
+ best_pwm_div = pwm_div;
|
||||||
|
+ min_diff = remainder;
|
||||||
|
+
|
||||||
|
+ if (min_diff == 0) /* bingo */
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ /* config divider values for the closest possible frequency */
|
||||||
|
+ config_div_and_duty(pwm, best_pre_div, best_pwm_div,
|
||||||
|
+ rate, duty_ns, state->enabled);
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int ipq_pwm_get_state(struct pwm_chip *chip, struct pwm_device *pwm,
|
||||||
|
+ struct pwm_state *state)
|
||||||
|
+{
|
||||||
|
+ struct ipq_pwm_chip *ipq_chip = ipq_pwm_from_chip(chip);
|
||||||
|
+ unsigned long rate = clk_get_rate(ipq_chip->clk);
|
||||||
|
+ unsigned int pre_div, pwm_div, hi_dur;
|
||||||
|
+ u64 effective_div, hi_div;
|
||||||
|
+ u32 reg0, reg1;
|
||||||
|
+
|
||||||
|
+ reg0 = ipq_pwm_reg_read(pwm, IPQ_PWM_REG0);
|
||||||
|
+ reg1 = ipq_pwm_reg_read(pwm, IPQ_PWM_REG1);
|
||||||
|
+
|
||||||
|
+ state->polarity = PWM_POLARITY_NORMAL;
|
||||||
|
+ state->enabled = reg1 & IPQ_PWM_REG1_ENABLE;
|
||||||
|
+
|
||||||
|
+ pwm_div = FIELD_GET(IPQ_PWM_REG0_PWM_DIV, reg0);
|
||||||
|
+ hi_dur = FIELD_GET(IPQ_PWM_REG0_HI_DURATION, reg0);
|
||||||
|
+ pre_div = FIELD_GET(IPQ_PWM_REG1_PRE_DIV, reg1);
|
||||||
|
+
|
||||||
|
+ /* No overflow here, both pre_div and pwm_div <= 0xffff */
|
||||||
|
+ effective_div = (u64)(pre_div + 1) * (pwm_div + 1);
|
||||||
|
+ state->period = DIV64_U64_ROUND_UP(effective_div * NSEC_PER_SEC, rate);
|
||||||
|
+
|
||||||
|
+ hi_div = hi_dur * (pre_div + 1);
|
||||||
|
+ state->duty_cycle = DIV64_U64_ROUND_UP(hi_div * NSEC_PER_SEC, rate);
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static const struct pwm_ops ipq_pwm_ops = {
|
||||||
|
+ .apply = ipq_pwm_apply,
|
||||||
|
+ .get_state = ipq_pwm_get_state,
|
||||||
|
+ .owner = THIS_MODULE,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static int ipq_pwm_probe(struct platform_device *pdev)
|
||||||
|
+{
|
||||||
|
+ struct ipq_pwm_chip *pwm;
|
||||||
|
+ struct device *dev = &pdev->dev;
|
||||||
|
+ int ret;
|
||||||
|
+
|
||||||
|
+ pwm = devm_kzalloc(dev, sizeof(*pwm), GFP_KERNEL);
|
||||||
|
+ if (!pwm)
|
||||||
|
+ return -ENOMEM;
|
||||||
|
+
|
||||||
|
+ platform_set_drvdata(pdev, pwm);
|
||||||
|
+
|
||||||
|
+ pwm->mem = devm_platform_ioremap_resource(pdev, 0);
|
||||||
|
+ if (IS_ERR(pwm->mem))
|
||||||
|
+ return dev_err_probe(dev, PTR_ERR(pwm->mem),
|
||||||
|
+ "regs map failed");
|
||||||
|
+
|
||||||
|
+ pwm->clk = devm_clk_get(dev, NULL);
|
||||||
|
+ if (IS_ERR(pwm->clk))
|
||||||
|
+ return dev_err_probe(dev, PTR_ERR(pwm->clk),
|
||||||
|
+ "failed to get clock");
|
||||||
|
+
|
||||||
|
+ ret = clk_prepare_enable(pwm->clk);
|
||||||
|
+ if (ret)
|
||||||
|
+ return dev_err_probe(dev, ret, "clock enable failed");
|
||||||
|
+
|
||||||
|
+ pwm->chip.dev = dev;
|
||||||
|
+ pwm->chip.ops = &ipq_pwm_ops;
|
||||||
|
+ pwm->chip.npwm = 4;
|
||||||
|
+
|
||||||
|
+ ret = pwmchip_add(&pwm->chip);
|
||||||
|
+ if (ret < 0) {
|
||||||
|
+ dev_err_probe(dev, ret, "pwmchip_add() failed\n");
|
||||||
|
+ clk_disable_unprepare(pwm->clk);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return ret;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int ipq_pwm_remove(struct platform_device *pdev)
|
||||||
|
+{
|
||||||
|
+ struct ipq_pwm_chip *pwm = platform_get_drvdata(pdev);
|
||||||
|
+
|
||||||
|
+ pwmchip_remove(&pwm->chip);
|
||||||
|
+ clk_disable_unprepare(pwm->clk);
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static const struct of_device_id pwm_ipq_dt_match[] = {
|
||||||
|
+ { .compatible = "qcom,ipq6018-pwm", },
|
||||||
|
+ {}
|
||||||
|
+};
|
||||||
|
+MODULE_DEVICE_TABLE(of, pwm_ipq_dt_match);
|
||||||
|
+
|
||||||
|
+static struct platform_driver ipq_pwm_driver = {
|
||||||
|
+ .driver = {
|
||||||
|
+ .name = "ipq-pwm",
|
||||||
|
+ .of_match_table = pwm_ipq_dt_match,
|
||||||
|
+ },
|
||||||
|
+ .probe = ipq_pwm_probe,
|
||||||
|
+ .remove = ipq_pwm_remove,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+module_platform_driver(ipq_pwm_driver);
|
||||||
|
+
|
||||||
|
+MODULE_LICENSE("Dual BSD/GPL");
|
@ -0,0 +1,148 @@
|
|||||||
|
From: Devi Priya <quic_devipriy@quicinc.com>
|
||||||
|
Subject: [PATCH] dt-bindings: mfd: qcom,tcsr: Add simple-mfd support for IPQ6018
|
||||||
|
Date: Thu, 5 Oct 2023 21:35:49 +0530
|
||||||
|
|
||||||
|
Update the binding to include pwm as the child node to TCSR block and
|
||||||
|
add simple-mfd support for IPQ6018.
|
||||||
|
|
||||||
|
Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
|
||||||
|
Signed-off-by: Devi Priya <quic_devipriy@quicinc.com>
|
||||||
|
---
|
||||||
|
.../devicetree/bindings/mfd/qcom,tcsr.yaml | 112 +++++++++++++-----
|
||||||
|
1 file changed, 81 insertions(+), 31 deletions(-)
|
||||||
|
|
||||||
|
--- a/Documentation/devicetree/bindings/mfd/qcom,tcsr.yaml
|
||||||
|
+++ b/Documentation/devicetree/bindings/mfd/qcom,tcsr.yaml
|
||||||
|
@@ -15,49 +15,101 @@ description:
|
||||||
|
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
- items:
|
||||||
|
- - enum:
|
||||||
|
- - qcom,msm8976-tcsr
|
||||||
|
- - qcom,msm8998-tcsr
|
||||||
|
- - qcom,qcs404-tcsr
|
||||||
|
- - qcom,sc7180-tcsr
|
||||||
|
- - qcom,sc7280-tcsr
|
||||||
|
- - qcom,sc8280xp-tcsr
|
||||||
|
- - qcom,sdm630-tcsr
|
||||||
|
- - qcom,sdm845-tcsr
|
||||||
|
- - qcom,sdx55-tcsr
|
||||||
|
- - qcom,sdx65-tcsr
|
||||||
|
- - qcom,sm8150-tcsr
|
||||||
|
- - qcom,sm8450-tcsr
|
||||||
|
- - qcom,tcsr-apq8064
|
||||||
|
- - qcom,tcsr-apq8084
|
||||||
|
- - qcom,tcsr-ipq5332
|
||||||
|
- - qcom,tcsr-ipq6018
|
||||||
|
- - qcom,tcsr-ipq8064
|
||||||
|
- - qcom,tcsr-ipq8074
|
||||||
|
- - qcom,tcsr-ipq9574
|
||||||
|
- - qcom,tcsr-mdm9615
|
||||||
|
- - qcom,tcsr-msm8226
|
||||||
|
- - qcom,tcsr-msm8660
|
||||||
|
- - qcom,tcsr-msm8916
|
||||||
|
- - qcom,tcsr-msm8953
|
||||||
|
- - qcom,tcsr-msm8960
|
||||||
|
- - qcom,tcsr-msm8974
|
||||||
|
- - qcom,tcsr-msm8996
|
||||||
|
- - const: syscon
|
||||||
|
+ oneOf:
|
||||||
|
+ - items:
|
||||||
|
+ - enum:
|
||||||
|
+ - qcom,msm8976-tcsr
|
||||||
|
+ - qcom,msm8998-tcsr
|
||||||
|
+ - qcom,qcs404-tcsr
|
||||||
|
+ - qcom,sc7180-tcsr
|
||||||
|
+ - qcom,sc7280-tcsr
|
||||||
|
+ - qcom,sc8280xp-tcsr
|
||||||
|
+ - qcom,sdm630-tcsr
|
||||||
|
+ - qcom,sdm845-tcsr
|
||||||
|
+ - qcom,sdx55-tcsr
|
||||||
|
+ - qcom,sdx65-tcsr
|
||||||
|
+ - qcom,sm4450-tcsr
|
||||||
|
+ - qcom,sm8150-tcsr
|
||||||
|
+ - qcom,sm8450-tcsr
|
||||||
|
+ - qcom,tcsr-apq8064
|
||||||
|
+ - qcom,tcsr-apq8084
|
||||||
|
+ - qcom,tcsr-ipq5332
|
||||||
|
+ - qcom,tcsr-ipq8064
|
||||||
|
+ - qcom,tcsr-ipq8074
|
||||||
|
+ - qcom,tcsr-ipq9574
|
||||||
|
+ - qcom,tcsr-mdm9615
|
||||||
|
+ - qcom,tcsr-msm8226
|
||||||
|
+ - qcom,tcsr-msm8660
|
||||||
|
+ - qcom,tcsr-msm8916
|
||||||
|
+ - qcom,tcsr-msm8953
|
||||||
|
+ - qcom,tcsr-msm8960
|
||||||
|
+ - qcom,tcsr-msm8974
|
||||||
|
+ - qcom,tcsr-msm8996
|
||||||
|
+ - const: syscon
|
||||||
|
+ - items:
|
||||||
|
+ - const: qcom,tcsr-ipq6018
|
||||||
|
+ - const: syscon
|
||||||
|
+ - const: simple-mfd
|
||||||
|
|
||||||
|
reg:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
+ ranges: true
|
||||||
|
+
|
||||||
|
+ "#address-cells":
|
||||||
|
+ const: 1
|
||||||
|
+
|
||||||
|
+ "#size-cells":
|
||||||
|
+ const: 1
|
||||||
|
+
|
||||||
|
+patternProperties:
|
||||||
|
+ "pwm@[a-f0-9]+$":
|
||||||
|
+ type: object
|
||||||
|
+ $ref: /schemas/pwm/qcom,ipq6018-pwm.yaml
|
||||||
|
+
|
||||||
|
+
|
||||||
|
required:
|
||||||
|
- compatible
|
||||||
|
- reg
|
||||||
|
|
||||||
|
+allOf:
|
||||||
|
+ - if:
|
||||||
|
+ not:
|
||||||
|
+ properties:
|
||||||
|
+ compatible:
|
||||||
|
+ contains:
|
||||||
|
+ enum:
|
||||||
|
+ - qcom,tcsr-ipq6018
|
||||||
|
+ then:
|
||||||
|
+ patternProperties:
|
||||||
|
+ "pwm@[a-f0-9]+$": false
|
||||||
|
+
|
||||||
|
additionalProperties: false
|
||||||
|
|
||||||
|
examples:
|
||||||
|
+ # Example 1 - Syscon node found on MSM8960
|
||||||
|
- |
|
||||||
|
syscon@1a400000 {
|
||||||
|
compatible = "qcom,tcsr-msm8960", "syscon";
|
||||||
|
reg = <0x1a400000 0x100>;
|
||||||
|
};
|
||||||
|
+ # Example 2 - Syscon node found on IPQ6018
|
||||||
|
+ - |
|
||||||
|
+ #include <dt-bindings/clock/qcom,gcc-ipq6018.h>
|
||||||
|
+
|
||||||
|
+ syscon@1937000 {
|
||||||
|
+ compatible = "qcom,tcsr-ipq6018", "syscon", "simple-mfd";
|
||||||
|
+ reg = <0x01937000 0x21000>;
|
||||||
|
+ ranges = <0 0x1937000 0x21000>;
|
||||||
|
+ #address-cells = <1>;
|
||||||
|
+ #size-cells = <1>;
|
||||||
|
+
|
||||||
|
+ pwm: pwm@a010 {
|
||||||
|
+ compatible = "qcom,ipq6018-pwm";
|
||||||
|
+ reg = <0xa010 0x20>;
|
||||||
|
+ clocks = <&gcc GCC_ADSS_PWM_CLK>;
|
||||||
|
+ assigned-clocks = <&gcc GCC_ADSS_PWM_CLK>;
|
||||||
|
+ assigned-clock-rates = <100000000>;
|
||||||
|
+ #pwm-cells = <2>;
|
||||||
|
+ };
|
||||||
|
+ };
|
||||||
|
\ No newline at end of file
|
@ -0,0 +1,22 @@
|
|||||||
|
From: Sricharan Ramabadhran <quic_srichara@quicinc.com>
|
||||||
|
Subject: [PATCH V2 1/1] dt-bindings: nvmem: Add compatible for IPQ5018
|
||||||
|
Date: Fri, 15 Sep 2023 17:31:20 +0530
|
||||||
|
|
||||||
|
Document the QFPROM on IPQ5018.
|
||||||
|
|
||||||
|
Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
|
||||||
|
Signed-off-by: Sricharan Ramabadhran <quic_srichara@quicinc.com>
|
||||||
|
---
|
||||||
|
Documentation/devicetree/bindings/nvmem/qcom,qfprom.yaml | 1 +
|
||||||
|
1 file changed, 1 insertion(+)
|
||||||
|
|
||||||
|
--- a/Documentation/devicetree/bindings/nvmem/qcom,qfprom.yaml
|
||||||
|
+++ b/Documentation/devicetree/bindings/nvmem/qcom,qfprom.yaml
|
||||||
|
@@ -18,6 +18,7 @@ properties:
|
||||||
|
- enum:
|
||||||
|
- qcom,apq8064-qfprom
|
||||||
|
- qcom,apq8084-qfprom
|
||||||
|
+ - qcom,ipq5018-qfprom
|
||||||
|
- qcom,ipq5332-qfprom
|
||||||
|
- qcom,ipq6018-qfprom
|
||||||
|
- qcom,ipq8064-qfprom
|
@ -0,0 +1,26 @@
|
|||||||
|
From: Sricharan Ramabadhran <quic_srichara@quicinc.com>
|
||||||
|
Date: Fri, 22 Sep 2023 17:21:13 +0530
|
||||||
|
Subject: [PATCH] dt-bindings: thermal: qcom-tsens: Add ipq5018 compatible
|
||||||
|
|
||||||
|
IPQ5018 has tsens v1.0 block with 4 sensors and 1 interrupt.
|
||||||
|
|
||||||
|
Signed-off-by: Sricharan Ramabadhran <quic_srichara@quicinc.com>
|
||||||
|
---
|
||||||
|
--- a/Documentation/devicetree/bindings/thermal/qcom-tsens.yaml
|
||||||
|
+++ b/Documentation/devicetree/bindings/thermal/qcom-tsens.yaml
|
||||||
|
@@ -39,6 +39,7 @@ properties:
|
||||||
|
- description: v1 of TSENS
|
||||||
|
items:
|
||||||
|
- enum:
|
||||||
|
+ - qcom,ipq5018-tsens
|
||||||
|
- qcom,msm8956-tsens
|
||||||
|
- qcom,msm8976-tsens
|
||||||
|
- qcom,qcs404-tsens
|
||||||
|
@@ -232,6 +233,7 @@ allOf:
|
||||||
|
compatible:
|
||||||
|
contains:
|
||||||
|
enum:
|
||||||
|
+ - qcom,ipq5018-tsens
|
||||||
|
- qcom,ipq8064-tsens
|
||||||
|
- qcom,msm8960-tsens
|
||||||
|
- qcom,tsens-v0_1
|
@ -0,0 +1,45 @@
|
|||||||
|
From: Sricharan Ramabadhran <quic_srichara@quicinc.com>
|
||||||
|
Subject: [PATCH] thermal/drivers/qcom: Add new feat for soc without rpm
|
||||||
|
Date: Fri, 22 Sep 2023 17:21:14 +0530
|
||||||
|
|
||||||
|
In IPQ5018, Tsens IP doesn't have RPM. Hence the early init to
|
||||||
|
enable tsens would not be done. So add a flag for that in feat
|
||||||
|
and skip enable checks. Without this, tsens probe fails.
|
||||||
|
|
||||||
|
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
|
||||||
|
Signed-off-by: Sricharan Ramabadhran <quic_srichara@quicinc.com>
|
||||||
|
---
|
||||||
|
drivers/thermal/qcom/tsens.c | 2 +-
|
||||||
|
drivers/thermal/qcom/tsens.h | 3 +++
|
||||||
|
2 files changed, 4 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
--- a/drivers/thermal/qcom/tsens.c
|
||||||
|
+++ b/drivers/thermal/qcom/tsens.c
|
||||||
|
@@ -974,7 +974,7 @@ int __init init_common(struct tsens_priv
|
||||||
|
ret = regmap_field_read(priv->rf[TSENS_EN], &enabled);
|
||||||
|
if (ret)
|
||||||
|
goto err_put_device;
|
||||||
|
- if (!enabled) {
|
||||||
|
+ if (!enabled && !(priv->feat->ignore_enable)) {
|
||||||
|
dev_err(dev, "%s: device not enabled\n", __func__);
|
||||||
|
ret = -ENODEV;
|
||||||
|
goto err_put_device;
|
||||||
|
--- a/drivers/thermal/qcom/tsens.h
|
||||||
|
+++ b/drivers/thermal/qcom/tsens.h
|
||||||
|
@@ -505,6 +505,8 @@ enum regfield_ids {
|
||||||
|
* @srot_split: does the IP neatly splits the register space into SROT and TM,
|
||||||
|
* with SROT only being available to secure boot firmware?
|
||||||
|
* @has_watchdog: does this IP support watchdog functionality?
|
||||||
|
+ * @ignore_enable: does this IP reside in a soc that does not have rpm to
|
||||||
|
+ * do pre-init.
|
||||||
|
* @max_sensors: maximum sensors supported by this version of the IP
|
||||||
|
* @trip_min_temp: minimum trip temperature supported by this version of the IP
|
||||||
|
* @trip_max_temp: maximum trip temperature supported by this version of the IP
|
||||||
|
@@ -516,6 +518,7 @@ struct tsens_features {
|
||||||
|
unsigned int adc:1;
|
||||||
|
unsigned int srot_split:1;
|
||||||
|
unsigned int has_watchdog:1;
|
||||||
|
+ unsigned int ignore_enable:1;
|
||||||
|
unsigned int max_sensors;
|
||||||
|
int trip_min_temp;
|
||||||
|
int trip_max_temp;
|
@ -0,0 +1,124 @@
|
|||||||
|
From: Sricharan Ramabadhran <quic_srichara@quicinc.com>
|
||||||
|
Subject: [PATCH] thermal/drivers/tsens: Add support for IPQ5018 tsens
|
||||||
|
Date: Fri, 22 Sep 2023 17:21:15 +0530
|
||||||
|
|
||||||
|
IPQ5018 has tsens IP V1.0, 4 sensors and 1 interrupt.
|
||||||
|
The soc does not have a RPM, hence tsens has to be reset and
|
||||||
|
enabled in the driver init. Adding the driver support for same.
|
||||||
|
|
||||||
|
Signed-off-by: Sricharan Ramabadhran <quic_srichara@quicinc.com>
|
||||||
|
---
|
||||||
|
drivers/thermal/qcom/tsens-v1.c | 60 +++++++++++++++++++++++++++++++++
|
||||||
|
drivers/thermal/qcom/tsens.c | 3 ++
|
||||||
|
drivers/thermal/qcom/tsens.h | 2 +-
|
||||||
|
3 files changed, 64 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/thermal/qcom/tsens-v1.c b/drivers/thermal/qcom/tsens-v1.c
|
||||||
|
index dc1c4ae2d8b0..acee2064f83e 100644
|
||||||
|
--- a/drivers/thermal/qcom/tsens-v1.c
|
||||||
|
+++ b/drivers/thermal/qcom/tsens-v1.c
|
||||||
|
@@ -79,6 +79,18 @@ static struct tsens_features tsens_v1_feat = {
|
||||||
|
.trip_max_temp = 120000,
|
||||||
|
};
|
||||||
|
|
||||||
|
+static struct tsens_features tsens_v1_ipq5018_feat = {
|
||||||
|
+ .ver_major = VER_1_X,
|
||||||
|
+ .crit_int = 0,
|
||||||
|
+ .combo_int = 0,
|
||||||
|
+ .adc = 1,
|
||||||
|
+ .srot_split = 1,
|
||||||
|
+ .max_sensors = 11,
|
||||||
|
+ .trip_min_temp = -40000,
|
||||||
|
+ .trip_max_temp = 120000,
|
||||||
|
+ .ignore_enable = 1,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
static const struct reg_field tsens_v1_regfields[MAX_REGFIELDS] = {
|
||||||
|
/* ----- SROT ------ */
|
||||||
|
/* VERSION */
|
||||||
|
@@ -150,6 +162,41 @@ static int __init init_8956(struct tsens_priv *priv) {
|
||||||
|
return init_common(priv);
|
||||||
|
}
|
||||||
|
|
||||||
|
+static int __init init_ipq5018(struct tsens_priv *priv)
|
||||||
|
+{
|
||||||
|
+ int ret;
|
||||||
|
+ u32 mask;
|
||||||
|
+
|
||||||
|
+ ret = init_common(priv);
|
||||||
|
+ if (ret < 0) {
|
||||||
|
+ dev_err(priv->dev, "Init common failed %d\n", ret);
|
||||||
|
+ return ret;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ ret = regmap_field_write(priv->rf[TSENS_SW_RST], 1);
|
||||||
|
+ if (ret) {
|
||||||
|
+ dev_err(priv->dev, "Reset failed\n");
|
||||||
|
+ return ret;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ mask = GENMASK(priv->num_sensors, 0);
|
||||||
|
+ ret = regmap_field_update_bits(priv->rf[SENSOR_EN], mask, mask);
|
||||||
|
+ if (ret) {
|
||||||
|
+ dev_err(priv->dev, "Sensor Enable failed\n");
|
||||||
|
+ return ret;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ ret = regmap_field_write(priv->rf[TSENS_EN], 1);
|
||||||
|
+ if (ret) {
|
||||||
|
+ dev_err(priv->dev, "Enable failed\n");
|
||||||
|
+ return ret;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ ret = regmap_field_write(priv->rf[TSENS_SW_RST], 0);
|
||||||
|
+
|
||||||
|
+ return ret;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static const struct tsens_ops ops_generic_v1 = {
|
||||||
|
.init = init_common,
|
||||||
|
.calibrate = calibrate_v1,
|
||||||
|
@@ -187,3 +234,16 @@ struct tsens_plat_data data_8976 = {
|
||||||
|
.feat = &tsens_v1_feat,
|
||||||
|
.fields = tsens_v1_regfields,
|
||||||
|
};
|
||||||
|
+
|
||||||
|
+const struct tsens_ops ops_ipq5018 = {
|
||||||
|
+ .init = init_ipq5018,
|
||||||
|
+ .calibrate = tsens_calibrate_common,
|
||||||
|
+ .get_temp = get_temp_tsens_valid,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+struct tsens_plat_data data_ipq5018 = {
|
||||||
|
+ .num_sensors = 5,
|
||||||
|
+ .ops = &ops_ipq5018,
|
||||||
|
+ .feat = &tsens_v1_ipq5018_feat,
|
||||||
|
+ .fields = tsens_v1_regfields,
|
||||||
|
+};
|
||||||
|
diff --git a/drivers/thermal/qcom/tsens.c b/drivers/thermal/qcom/tsens.c
|
||||||
|
index 0a43ccf02ec4..c792b9dc6676 100644
|
||||||
|
--- a/drivers/thermal/qcom/tsens.c
|
||||||
|
+++ b/drivers/thermal/qcom/tsens.c
|
||||||
|
@@ -1101,6 +1101,9 @@ static SIMPLE_DEV_PM_OPS(tsens_pm_ops, tsens_suspend, tsens_resume);
|
||||||
|
|
||||||
|
static const struct of_device_id tsens_table[] = {
|
||||||
|
{
|
||||||
|
+ .compatible = "qcom,ipq5018-tsens",
|
||||||
|
+ .data = &data_ipq5018,
|
||||||
|
+ }, {
|
||||||
|
.compatible = "qcom,ipq8064-tsens",
|
||||||
|
.data = &data_8960,
|
||||||
|
}, {
|
||||||
|
diff --git a/drivers/thermal/qcom/tsens.h b/drivers/thermal/qcom/tsens.h
|
||||||
|
index e254cd2df904..b6594b546d11 100644
|
||||||
|
--- a/drivers/thermal/qcom/tsens.h
|
||||||
|
+++ b/drivers/thermal/qcom/tsens.h
|
||||||
|
@@ -645,7 +645,7 @@ extern struct tsens_plat_data data_8960;
|
||||||
|
extern struct tsens_plat_data data_8226, data_8909, data_8916, data_8939, data_8974, data_9607;
|
||||||
|
|
||||||
|
/* TSENS v1 targets */
|
||||||
|
-extern struct tsens_plat_data data_tsens_v1, data_8976, data_8956;
|
||||||
|
+extern struct tsens_plat_data data_tsens_v1, data_8976, data_8956, data_ipq5018;
|
||||||
|
|
||||||
|
/* TSENS v2 targets */
|
||||||
|
extern struct tsens_plat_data data_8996, data_ipq8074, data_tsens_v2;
|
@ -0,0 +1,200 @@
|
|||||||
|
From: Sricharan Ramabadhran <quic_srichara@quicinc.com>
|
||||||
|
Subject: [PATCH] arm64: dts: qcom: ipq5018: Add tsens node
|
||||||
|
Date: Fri, 22 Sep 2023 17:21:16 +0530
|
||||||
|
|
||||||
|
IPQ5018 has tsens V1.0 IP with 4 sensors.
|
||||||
|
There is no RPM, so tsens has to be manually enabled. Adding the tsens
|
||||||
|
and nvmem node and IPQ5018 has 4 thermal sensors (zones). With the
|
||||||
|
critical temperature being 120'C and action is to reboot. Adding all
|
||||||
|
the 4 zones here.
|
||||||
|
|
||||||
|
Signed-off-by: Sricharan Ramabadhran <quic_srichara@quicinc.com>
|
||||||
|
---
|
||||||
|
arch/arm64/boot/dts/qcom/ipq5018.dtsi | 169 ++++++++++++++++++++++++++
|
||||||
|
1 file changed, 169 insertions(+)
|
||||||
|
|
||||||
|
--- a/arch/arm64/boot/dts/qcom/ipq5018.dtsi
|
||||||
|
+++ b/arch/arm64/boot/dts/qcom/ipq5018.dtsi
|
||||||
|
@@ -149,6 +149,117 @@
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
|
+ qfprom: qfprom@a0000 {
|
||||||
|
+ compatible = "qcom,ipq5018-qfprom", "qcom,qfprom";
|
||||||
|
+ reg = <0xa0000 0x1000>;
|
||||||
|
+ #address-cells = <1>;
|
||||||
|
+ #size-cells = <1>;
|
||||||
|
+
|
||||||
|
+ tsens_mode: mode@249 {
|
||||||
|
+ reg = <0x249 1>;
|
||||||
|
+ bits = <0 3>;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ tsens_base1: base1@249 {
|
||||||
|
+ reg = <0x249 2>;
|
||||||
|
+ bits = <3 8>;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ tsens_base2: base2@24a {
|
||||||
|
+ reg = <0x24a 2>;
|
||||||
|
+ bits = <3 8>;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ tsens_s0_p1: s0-p1@24b {
|
||||||
|
+ reg = <0x24b 0x2>;
|
||||||
|
+ bits = <2 6>;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ tsens_s0_p2: s0-p2@24c {
|
||||||
|
+ reg = <0x24c 0x1>;
|
||||||
|
+ bits = <1 6>;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ tsens_s1_p1: s1-p1@24c {
|
||||||
|
+ reg = <0x24c 0x2>;
|
||||||
|
+ bits = <7 6>;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ tsens_s1_p2: s1-p2@24d {
|
||||||
|
+ reg = <0x24d 0x2>;
|
||||||
|
+ bits = <5 6>;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ tsens_s2_p1: s2-p1@24e {
|
||||||
|
+ reg = <0x24e 0x2>;
|
||||||
|
+ bits = <3 6>;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ tsens_s2_p2: s2-p2@24f {
|
||||||
|
+ reg = <0x24f 0x1>;
|
||||||
|
+ bits = <1 6>;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ tsens_s3_p1: s3-p1@24f {
|
||||||
|
+ reg = <0x24f 0x2>;
|
||||||
|
+ bits = <7 6>;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ tsens_s3_p2: s3-p2@250 {
|
||||||
|
+ reg = <0x250 0x2>;
|
||||||
|
+ bits = <5 6>;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ tsens_s4_p1: s4-p1@251 {
|
||||||
|
+ reg = <0x251 0x2>;
|
||||||
|
+ bits = <3 6>;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ tsens_s4_p2: s4-p2@254 {
|
||||||
|
+ reg = <0x254 0x1>;
|
||||||
|
+ bits = <0 6>;
|
||||||
|
+ };
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ tsens: thermal-sensor@4a9000 {
|
||||||
|
+ compatible = "qcom,ipq5018-tsens";
|
||||||
|
+ reg = <0x4a9000 0x1000>, /* TM */
|
||||||
|
+ <0x4a8000 0x1000>; /* SROT */
|
||||||
|
+
|
||||||
|
+ nvmem-cells = <&tsens_mode>,
|
||||||
|
+ <&tsens_base1>,
|
||||||
|
+ <&tsens_base2>,
|
||||||
|
+ <&tsens_s0_p1>,
|
||||||
|
+ <&tsens_s0_p2>,
|
||||||
|
+ <&tsens_s1_p1>,
|
||||||
|
+ <&tsens_s1_p2>,
|
||||||
|
+ <&tsens_s2_p1>,
|
||||||
|
+ <&tsens_s2_p2>,
|
||||||
|
+ <&tsens_s3_p1>,
|
||||||
|
+ <&tsens_s3_p2>,
|
||||||
|
+ <&tsens_s4_p1>,
|
||||||
|
+ <&tsens_s4_p2>;
|
||||||
|
+
|
||||||
|
+ nvmem-cell-names = "mode",
|
||||||
|
+ "base1",
|
||||||
|
+ "base2",
|
||||||
|
+ "s0_p1",
|
||||||
|
+ "s0_p2",
|
||||||
|
+ "s1_p1",
|
||||||
|
+ "s1_p2",
|
||||||
|
+ "s2_p1",
|
||||||
|
+ "s2_p2",
|
||||||
|
+ "s3_p1",
|
||||||
|
+ "s3_p2",
|
||||||
|
+ "s4_p1",
|
||||||
|
+ "s4_p2";
|
||||||
|
+
|
||||||
|
+ interrupts = <GIC_SPI 184 IRQ_TYPE_EDGE_RISING>;
|
||||||
|
+ interrupt-names = "uplow";
|
||||||
|
+ #qcom,sensors = <5>;
|
||||||
|
+ #thermal-sensor-cells = <1>;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
tlmm: pinctrl@1000000 {
|
||||||
|
compatible = "qcom,ipq5018-tlmm";
|
||||||
|
reg = <0x01000000 0x300000>;
|
||||||
|
@@ -391,6 +502,64 @@
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
+
|
||||||
|
+ thermal-zones {
|
||||||
|
+ cpu-thermal {
|
||||||
|
+ polling-delay-passive = <0>;
|
||||||
|
+ polling-delay = <0>;
|
||||||
|
+ thermal-sensors = <&tsens 2>;
|
||||||
|
+
|
||||||
|
+ trips {
|
||||||
|
+ cpu-critical {
|
||||||
|
+ temperature = <120000>;
|
||||||
|
+ hysteresis = <2>;
|
||||||
|
+ type = "critical";
|
||||||
|
+ };
|
||||||
|
+ };
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ gephy-thermal {
|
||||||
|
+ polling-delay-passive = <0>;
|
||||||
|
+ polling-delay = <0>;
|
||||||
|
+ thermal-sensors = <&tsens 4>;
|
||||||
|
+
|
||||||
|
+ trips {
|
||||||
|
+ gephy-critical {
|
||||||
|
+ temperature = <120000>;
|
||||||
|
+ hysteresis = <2>;
|
||||||
|
+ type = "critical";
|
||||||
|
+ };
|
||||||
|
+ };
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ top-glue-thermal {
|
||||||
|
+ polling-delay-passive = <0>;
|
||||||
|
+ polling-delay = <0>;
|
||||||
|
+ thermal-sensors = <&tsens 3>;
|
||||||
|
+
|
||||||
|
+ trips {
|
||||||
|
+ top_glue-critical {
|
||||||
|
+ temperature = <120000>;
|
||||||
|
+ hysteresis = <2>;
|
||||||
|
+ type = "critical";
|
||||||
|
+ };
|
||||||
|
+ };
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ ubi32-thermal {
|
||||||
|
+ polling-delay-passive = <0>;
|
||||||
|
+ polling-delay = <0>;
|
||||||
|
+ thermal-sensors = <&tsens 1>;
|
||||||
|
+
|
||||||
|
+ trips {
|
||||||
|
+ ubi32-critical {
|
||||||
|
+ temperature = <120000>;
|
||||||
|
+ hysteresis = <2>;
|
||||||
|
+ type = "critical";
|
||||||
|
+ };
|
||||||
|
+ };
|
||||||
|
+ };
|
||||||
|
+ };
|
||||||
|
|
||||||
|
timer {
|
||||||
|
compatible = "arm,armv8-timer";
|
@ -0,0 +1,95 @@
|
|||||||
|
From: Nitheesh Sekar <quic_nsekar@quicinc.com>
|
||||||
|
Subject: [PATCH] dt-bindings: phy: qcom,uniphy-pcie: Document PCIe uniphy
|
||||||
|
Date: Tue, 3 Oct 2023 17:38:41 +0530
|
||||||
|
|
||||||
|
Document the Qualcomm UNIPHY PCIe 28LP present in IPQ5018.
|
||||||
|
|
||||||
|
Signed-off-by: Nitheesh Sekar <quic_nsekar@quicinc.com>
|
||||||
|
---
|
||||||
|
.../bindings/phy/qcom,uniphy-pcie-28lp.yaml | 77 +++++++++++++++++++
|
||||||
|
1 file changed, 77 insertions(+)
|
||||||
|
create mode 100644 Documentation/devicetree/bindings/phy/qcom,uniphy-pcie-28lp.yaml
|
||||||
|
|
||||||
|
diff --git a/Documentation/devicetree/bindings/phy/qcom,ipq5018-uniphy-pcie.yaml b/Documentation/devicetree/bindings/phy/qcom,ipq5018-uniphy-pcie.yaml
|
||||||
|
new file mode 100644
|
||||||
|
index 000000000000..6b2574f9532e
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/Documentation/devicetree/bindings/phy/qcom,ipq5018-uniphy-pcie.yaml
|
||||||
|
@@ -0,0 +1,77 @@
|
||||||
|
+# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
|
||||||
|
+%YAML 1.2
|
||||||
|
+---
|
||||||
|
+$id: http://devicetree.org/schemas/phy/qcom,ipq5018-uniphy-pcie.yaml#
|
||||||
|
+$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
|
+
|
||||||
|
+title: Qualcomm IPQ5018 UNIPHY PCIe PHY driver
|
||||||
|
+
|
||||||
|
+maintainers:
|
||||||
|
+ - Nitheesh Sekar <quic_nsekar@quicinc.com>
|
||||||
|
+ - Sricharan Ramabadhran <quic_srichara@quicinc.com>
|
||||||
|
+
|
||||||
|
+properties:
|
||||||
|
+ compatible:
|
||||||
|
+ enum:
|
||||||
|
+ - qcom,ipq5018-uniphy-pcie-gen2x1
|
||||||
|
+ - qcom,ipq5018-uniphy-pcie-gen2x2
|
||||||
|
+
|
||||||
|
+ reg:
|
||||||
|
+ maxItems: 1
|
||||||
|
+
|
||||||
|
+ clocks:
|
||||||
|
+ maxItems: 1
|
||||||
|
+
|
||||||
|
+ clock-names:
|
||||||
|
+ items:
|
||||||
|
+ - const: pipe_clk
|
||||||
|
+
|
||||||
|
+ resets:
|
||||||
|
+ maxItems: 2
|
||||||
|
+
|
||||||
|
+ reset-names:
|
||||||
|
+ items:
|
||||||
|
+ - const: phy
|
||||||
|
+ - const: phy_phy
|
||||||
|
+
|
||||||
|
+ "#phy-cells":
|
||||||
|
+ const: 0
|
||||||
|
+
|
||||||
|
+ "#clock-cells":
|
||||||
|
+ const: 0
|
||||||
|
+
|
||||||
|
+ clock-output-names:
|
||||||
|
+ maxItems: 1
|
||||||
|
+
|
||||||
|
+required:
|
||||||
|
+ - compatible
|
||||||
|
+ - reg
|
||||||
|
+ - resets
|
||||||
|
+ - reset-names
|
||||||
|
+ - clocks
|
||||||
|
+ - clock-names
|
||||||
|
+ - "#phy-cells"
|
||||||
|
+ - "#clock-cells"
|
||||||
|
+ - clock-output-names
|
||||||
|
+
|
||||||
|
+additionalProperties: false
|
||||||
|
+
|
||||||
|
+examples:
|
||||||
|
+ - |
|
||||||
|
+ #include <dt-bindings/clock/qcom,gcc-ipq5018.h>
|
||||||
|
+ #include <dt-bindings/reset/qcom,gcc-ipq5018.h>
|
||||||
|
+
|
||||||
|
+ phy@86000 {
|
||||||
|
+ compatible = "qcom,ipq5018-uniphy-pcie-gen2x2";
|
||||||
|
+ reg = <0x86000 0x800>;
|
||||||
|
+ #phy-cells = <0>;
|
||||||
|
+ #clock-cells = <0>;
|
||||||
|
+ clocks = <&gcc GCC_PCIE0_PIPE_CLK>;
|
||||||
|
+ clock-names = "pipe_clk";
|
||||||
|
+ clock-output-names = "pcie0_pipe_clk";
|
||||||
|
+ assigned-clocks = <&gcc GCC_PCIE1_PIPE_CLK>;
|
||||||
|
+ assigned-clock-rates = <125000000>;
|
||||||
|
+ resets = <&gcc GCC_PCIE0_PHY_BCR>,
|
||||||
|
+ <&gcc GCC_PCIE0PHY_PHY_BCR>;
|
||||||
|
+ reset-names = "phy", "phy_phy";
|
||||||
|
+ };
|
@ -0,0 +1,78 @@
|
|||||||
|
From: Nitheesh Sekar <quic_nsekar@quicinc.com>
|
||||||
|
Subject: [PATCH] dt-bindings: PCI: qcom: Add IPQ5108 SoC
|
||||||
|
Date: Tue, 3 Oct 2023 17:38:42 +0530
|
||||||
|
|
||||||
|
Add support for the PCIe controller on the Qualcomm
|
||||||
|
IPQ5108 SoC to the bindings.
|
||||||
|
|
||||||
|
Signed-off-by: Nitheesh Sekar <quic_nsekar@quicinc.com>
|
||||||
|
---
|
||||||
|
.../devicetree/bindings/pci/qcom,pcie.yaml | 36 +++++++++++++++++++
|
||||||
|
1 file changed, 36 insertions(+)
|
||||||
|
|
||||||
|
--- a/Documentation/devicetree/bindings/pci/qcom,pcie.yaml
|
||||||
|
+++ b/Documentation/devicetree/bindings/pci/qcom,pcie.yaml
|
||||||
|
@@ -21,6 +21,7 @@ properties:
|
||||||
|
- qcom,pcie-apq8064
|
||||||
|
- qcom,pcie-apq8084
|
||||||
|
- qcom,pcie-ipq4019
|
||||||
|
+ - qcom,pcie-ipq5018
|
||||||
|
- qcom,pcie-ipq6018
|
||||||
|
- qcom,pcie-ipq8064
|
||||||
|
- qcom,pcie-ipq8064-v2
|
||||||
|
@@ -170,6 +171,7 @@ allOf:
|
||||||
|
compatible:
|
||||||
|
contains:
|
||||||
|
enum:
|
||||||
|
+ - qcom,pcie-ipq5018
|
||||||
|
- qcom,pcie-ipq6018
|
||||||
|
- qcom,pcie-ipq8074-gen3
|
||||||
|
then:
|
||||||
|
@@ -337,6 +339,39 @@ allOf:
|
||||||
|
compatible:
|
||||||
|
contains:
|
||||||
|
enum:
|
||||||
|
+ - qcom,pcie-ipq5018
|
||||||
|
+ then:
|
||||||
|
+ properties:
|
||||||
|
+ clocks:
|
||||||
|
+ minItems: 6
|
||||||
|
+ maxItems: 6
|
||||||
|
+ clock-names:
|
||||||
|
+ items:
|
||||||
|
+ - const: iface # PCIe to SysNOC BIU clock
|
||||||
|
+ - const: axi_m # AXI Master clock
|
||||||
|
+ - const: axi_s # AXI Slave clock
|
||||||
|
+ - const: ahb # AHB clock
|
||||||
|
+ - const: aux # Auxiliary clock
|
||||||
|
+ - const: axi_bridge # AXI bridge clock
|
||||||
|
+ resets:
|
||||||
|
+ minItems: 8
|
||||||
|
+ maxItems: 8
|
||||||
|
+ reset-names:
|
||||||
|
+ items:
|
||||||
|
+ - const: pipe # PIPE reset
|
||||||
|
+ - const: sleep # Sleep reset
|
||||||
|
+ - const: sticky # Core sticky reset
|
||||||
|
+ - const: axi_m # AXI master reset
|
||||||
|
+ - const: axi_s # AXI slave reset
|
||||||
|
+ - const: ahb # AHB reset
|
||||||
|
+ - const: axi_m_sticky # AXI master sticky reset
|
||||||
|
+ - const: axi_s_sticky # AXI slave sticky reset
|
||||||
|
+
|
||||||
|
+ - if:
|
||||||
|
+ properties:
|
||||||
|
+ compatible:
|
||||||
|
+ contains:
|
||||||
|
+ enum:
|
||||||
|
- qcom,pcie-msm8996
|
||||||
|
then:
|
||||||
|
properties:
|
||||||
|
@@ -875,6 +910,7 @@ allOf:
|
||||||
|
- qcom,pcie-apq8064
|
||||||
|
- qcom,pcie-apq8084
|
||||||
|
- qcom,pcie-ipq4019
|
||||||
|
+ - qcom,pcie-ipq5018
|
||||||
|
- qcom,pcie-ipq6018
|
||||||
|
- qcom,pcie-ipq8064
|
||||||
|
- qcom,pcie-ipq8064-v2
|
@ -0,0 +1,381 @@
|
|||||||
|
From: Nitheesh Sekar <quic_nsekar@quicinc.com>
|
||||||
|
Subject: [PATCH] phy: qcom: Introduce PCIe UNIPHY 28LP driver
|
||||||
|
Date: Tue, 3 Oct 2023 17:38:43 +0530
|
||||||
|
|
||||||
|
Add Qualcomm PCIe UNIPHY 28LP driver support present
|
||||||
|
in Qualcomm IPQ5018 SoC and the phy init sequence.
|
||||||
|
|
||||||
|
Signed-off-by: Nitheesh Sekar <quic_nsekar@quicinc.com>
|
||||||
|
---
|
||||||
|
drivers/phy/qualcomm/Kconfig | 12 +
|
||||||
|
drivers/phy/qualcomm/Makefile | 1 +
|
||||||
|
.../phy/qualcomm/phy-qcom-uniphy-pcie-28lp.c | 336 ++++++++++++++++++
|
||||||
|
3 files changed, 349 insertions(+)
|
||||||
|
create mode 100644 drivers/phy/qualcomm/phy-qcom-uniphy-pcie-28lp.c
|
||||||
|
|
||||||
|
--- a/drivers/phy/qualcomm/Kconfig
|
||||||
|
+++ b/drivers/phy/qualcomm/Kconfig
|
||||||
|
@@ -35,6 +35,18 @@ config PHY_QCOM_IPQ4019_USB
|
||||||
|
help
|
||||||
|
Support for the USB PHY-s on Qualcomm IPQ40xx SoC-s.
|
||||||
|
|
||||||
|
+config PHY_QCOM_IPQ5018_UNIPHY_PCIE
|
||||||
|
+ bool "PCIE IPQ5018 UNIPHY PHY driver"
|
||||||
|
+ depends on ARCH_QCOM
|
||||||
|
+ depends on HAS_IOMEM
|
||||||
|
+ depends on OF
|
||||||
|
+ select GENERIC_PHY
|
||||||
|
+ help
|
||||||
|
+ Enable this to support the IPQ5018 PCIe UNIPHY phy transceiver that
|
||||||
|
+ is used with PCIe controllers on Qualcomm IPQ5018 chips. It
|
||||||
|
+ handles PHY initialization, clock management required after
|
||||||
|
+ resetting the hardware and power management.
|
||||||
|
+
|
||||||
|
config PHY_QCOM_IPQ806X_SATA
|
||||||
|
tristate "Qualcomm IPQ806x SATA SerDes/PHY driver"
|
||||||
|
depends on ARCH_QCOM
|
||||||
|
--- a/drivers/phy/qualcomm/Makefile
|
||||||
|
+++ b/drivers/phy/qualcomm/Makefile
|
||||||
|
@@ -3,6 +3,7 @@ obj-$(CONFIG_PHY_ATH79_USB) += phy-ath7
|
||||||
|
obj-$(CONFIG_PHY_QCOM_APQ8064_SATA) += phy-qcom-apq8064-sata.o
|
||||||
|
obj-$(CONFIG_PHY_QCOM_EDP) += phy-qcom-edp.o
|
||||||
|
obj-$(CONFIG_PHY_QCOM_IPQ4019_USB) += phy-qcom-ipq4019-usb.o
|
||||||
|
+obj-$(CONFIG_PHY_QCOM_IPQ5018_UNIPHY_PCIE) += phy-qcom-ipq5018-uniphy-pcie.o
|
||||||
|
obj-$(CONFIG_PHY_QCOM_IPQ806X_SATA) += phy-qcom-ipq806x-sata.o
|
||||||
|
obj-$(CONFIG_PHY_QCOM_M31_USB) += phy-qcom-m31.o
|
||||||
|
obj-$(CONFIG_PHY_QCOM_PCIE2) += phy-qcom-pcie2.o
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/drivers/phy/qualcomm/phy-qcom-ipq5018-uniphy-pcie.c
|
||||||
|
@@ -0,0 +1,332 @@
|
||||||
|
+// SPDX-License-Identifier: GPL-2.0+
|
||||||
|
+/*
|
||||||
|
+ * Copyright (c) 2023, The Linux Foundation. All rights reserved.
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+#include <linux/clk.h>
|
||||||
|
+#include <linux/clk-provider.h>
|
||||||
|
+#include <linux/err.h>
|
||||||
|
+#include <linux/io.h>
|
||||||
|
+#include <linux/module.h>
|
||||||
|
+#include <linux/of.h>
|
||||||
|
+#include <linux/platform_device.h>
|
||||||
|
+#include <linux/phy/phy.h>
|
||||||
|
+#include <linux/reset.h>
|
||||||
|
+#include <linux/of_device.h>
|
||||||
|
+#include <linux/delay.h>
|
||||||
|
+#include <linux/mfd/syscon.h>
|
||||||
|
+#include <linux/regmap.h>
|
||||||
|
+
|
||||||
|
+#define PIPE_CLK_DELAY_MIN_US 5000
|
||||||
|
+#define PIPE_CLK_DELAY_MAX_US 5100
|
||||||
|
+#define CDR_CTRL_REG_1 0x80
|
||||||
|
+#define CDR_CTRL_REG_2 0x84
|
||||||
|
+#define CDR_CTRL_REG_3 0x88
|
||||||
|
+#define CDR_CTRL_REG_4 0x8C
|
||||||
|
+#define CDR_CTRL_REG_5 0x90
|
||||||
|
+#define CDR_CTRL_REG_6 0x94
|
||||||
|
+#define CDR_CTRL_REG_7 0x98
|
||||||
|
+#define SSCG_CTRL_REG_1 0x9c
|
||||||
|
+#define SSCG_CTRL_REG_2 0xa0
|
||||||
|
+#define SSCG_CTRL_REG_3 0xa4
|
||||||
|
+#define SSCG_CTRL_REG_4 0xa8
|
||||||
|
+#define SSCG_CTRL_REG_5 0xac
|
||||||
|
+#define SSCG_CTRL_REG_6 0xb0
|
||||||
|
+#define PCS_INTERNAL_CONTROL_2 0x2d8
|
||||||
|
+
|
||||||
|
+#define PHY_MODE_FIXED 0x1
|
||||||
|
+
|
||||||
|
+enum qcom_uniphy_pcie_type {
|
||||||
|
+ PHY_TYPE_PCIE = 1,
|
||||||
|
+ PHY_TYPE_PCIE_GEN2,
|
||||||
|
+ PHY_TYPE_PCIE_GEN3,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+struct uniphy_regs {
|
||||||
|
+ unsigned int offset;
|
||||||
|
+ unsigned int val;
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+struct uniphy_pcie_data {
|
||||||
|
+ int lanes;
|
||||||
|
+ /* 2nd lane offset */
|
||||||
|
+ int lane_offset;
|
||||||
|
+ unsigned int phy_type;
|
||||||
|
+ const struct uniphy_regs *init_seq;
|
||||||
|
+ unsigned int init_seq_num;
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+struct qcom_uniphy_pcie {
|
||||||
|
+ struct phy phy;
|
||||||
|
+ struct device *dev;
|
||||||
|
+ const struct uniphy_pcie_data *data;
|
||||||
|
+ struct clk_bulk_data *clks;
|
||||||
|
+ int num_clks;
|
||||||
|
+ struct reset_control *resets;
|
||||||
|
+ void __iomem *base;
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+#define phy_to_dw_phy(x) container_of((x), struct qca_uni_pcie_phy, phy)
|
||||||
|
+
|
||||||
|
+static const struct uniphy_regs ipq5018_regs[] = {
|
||||||
|
+ {
|
||||||
|
+ .offset = SSCG_CTRL_REG_4,
|
||||||
|
+ .val = 0x1cb9,
|
||||||
|
+ }, {
|
||||||
|
+ .offset = SSCG_CTRL_REG_5,
|
||||||
|
+ .val = 0x023a,
|
||||||
|
+ }, {
|
||||||
|
+ .offset = SSCG_CTRL_REG_3,
|
||||||
|
+ .val = 0xd360,
|
||||||
|
+ }, {
|
||||||
|
+ .offset = SSCG_CTRL_REG_1,
|
||||||
|
+ .val = 0x1,
|
||||||
|
+ }, {
|
||||||
|
+ .offset = SSCG_CTRL_REG_2,
|
||||||
|
+ .val = 0xeb,
|
||||||
|
+ }, {
|
||||||
|
+ .offset = CDR_CTRL_REG_4,
|
||||||
|
+ .val = 0x3f9,
|
||||||
|
+ }, {
|
||||||
|
+ .offset = CDR_CTRL_REG_5,
|
||||||
|
+ .val = 0x1c9,
|
||||||
|
+ }, {
|
||||||
|
+ .offset = CDR_CTRL_REG_2,
|
||||||
|
+ .val = 0x419,
|
||||||
|
+ }, {
|
||||||
|
+ .offset = CDR_CTRL_REG_1,
|
||||||
|
+ .val = 0x200,
|
||||||
|
+ }, {
|
||||||
|
+ .offset = PCS_INTERNAL_CONTROL_2,
|
||||||
|
+ .val = 0xf101,
|
||||||
|
+ },
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static const struct uniphy_pcie_data ipq5018_2x1_data = {
|
||||||
|
+ .lanes = 1,
|
||||||
|
+ .lane_offset = 0x800,
|
||||||
|
+ .phy_type = PHY_TYPE_PCIE_GEN2,
|
||||||
|
+ .init_seq = ipq5018_regs,
|
||||||
|
+ .init_seq_num = ARRAY_SIZE(ipq5018_regs),
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static const struct uniphy_pcie_data ipq5018_2x2_data = {
|
||||||
|
+ .lanes = 2,
|
||||||
|
+ .lane_offset = 0x800,
|
||||||
|
+ .phy_type = PHY_TYPE_PCIE_GEN2,
|
||||||
|
+ .init_seq = ipq5018_regs,
|
||||||
|
+ .init_seq_num = ARRAY_SIZE(ipq5018_regs),
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static void qcom_uniphy_pcie_init(struct qcom_uniphy_pcie *phy)
|
||||||
|
+{
|
||||||
|
+ const struct uniphy_pcie_data *data = phy->data;
|
||||||
|
+ const struct uniphy_regs *init_seq;
|
||||||
|
+ void __iomem *base = phy->base;
|
||||||
|
+
|
||||||
|
+ for (int lane = 0; lane < data->lanes; lane++) {
|
||||||
|
+ init_seq = data->init_seq;
|
||||||
|
+
|
||||||
|
+ for (int i = 0; i < data->init_seq_num; i++, init_seq++)
|
||||||
|
+ writel(init_seq->val, base + init_seq->offset);
|
||||||
|
+
|
||||||
|
+ base += data->lane_offset;
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int qcom_uniphy_pcie_power_off(struct phy *x)
|
||||||
|
+{
|
||||||
|
+ struct qcom_uniphy_pcie *phy = phy_get_drvdata(x);
|
||||||
|
+
|
||||||
|
+ clk_bulk_disable_unprepare(phy->num_clks, phy->clks);
|
||||||
|
+
|
||||||
|
+ reset_control_assert(phy->resets);
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int qcom_uniphy_pcie_power_on(struct phy *x)
|
||||||
|
+{
|
||||||
|
+ int ret;
|
||||||
|
+ struct qcom_uniphy_pcie *phy = phy_get_drvdata(x);
|
||||||
|
+
|
||||||
|
+ ret = reset_control_assert(phy->resets);
|
||||||
|
+ if (ret) {
|
||||||
|
+ dev_err(phy->dev, "reset assert failed (%d)\n", ret);
|
||||||
|
+ return ret;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
+ * Delay periods before and after reset deassert are working values
|
||||||
|
+ * from downstream Codeaurora kernel
|
||||||
|
+ */
|
||||||
|
+ usleep_range(100, 150);
|
||||||
|
+
|
||||||
|
+ ret = reset_control_deassert(phy->resets);
|
||||||
|
+ if (ret) {
|
||||||
|
+ dev_err(phy->dev, "reset deassert failed (%d)\n", ret);
|
||||||
|
+ return ret;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ usleep_range(PIPE_CLK_DELAY_MIN_US, PIPE_CLK_DELAY_MAX_US);
|
||||||
|
+
|
||||||
|
+ ret = clk_bulk_prepare_enable(phy->num_clks, phy->clks);
|
||||||
|
+ if (ret) {
|
||||||
|
+ dev_err(phy->dev, "clk prepare and enable failed %d\n", ret);
|
||||||
|
+ return ret;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ usleep_range(30, 50);
|
||||||
|
+
|
||||||
|
+ qcom_uniphy_pcie_init(phy);
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static inline int qcom_uniphy_pcie_get_resources(struct platform_device *pdev,
|
||||||
|
+ struct qcom_uniphy_pcie *phy)
|
||||||
|
+{
|
||||||
|
+ struct resource *res;
|
||||||
|
+
|
||||||
|
+ phy->base = devm_platform_get_and_ioremap_resource(pdev, 0, &res);
|
||||||
|
+ if (IS_ERR(phy->base)) {
|
||||||
|
+ dev_err(phy->dev, "cannot get phy registers\n");
|
||||||
|
+ return PTR_ERR(phy->base);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ phy->num_clks = devm_clk_bulk_get_all(phy->dev, &phy->clks);
|
||||||
|
+ if (phy->num_clks < 0)
|
||||||
|
+ return phy->num_clks;
|
||||||
|
+
|
||||||
|
+ phy->resets = devm_reset_control_array_get_exclusive(phy->dev);
|
||||||
|
+ if (IS_ERR(phy->resets))
|
||||||
|
+ return PTR_ERR(phy->resets);
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/*
|
||||||
|
+ * Register a fixed rate pipe clock.
|
||||||
|
+ *
|
||||||
|
+ * The <s>_pipe_clksrc generated by PHY goes to the GCC that gate
|
||||||
|
+ * controls it. The <s>_pipe_clk coming out of the GCC is requested
|
||||||
|
+ * by the PHY driver for its operations.
|
||||||
|
+ * We register the <s>_pipe_clksrc here. The gcc driver takes care
|
||||||
|
+ * of assigning this <s>_pipe_clksrc as parent to <s>_pipe_clk.
|
||||||
|
+ * Below picture shows this relationship.
|
||||||
|
+ *
|
||||||
|
+ * +---------------+
|
||||||
|
+ * | PHY block |<<---------------------------------------+
|
||||||
|
+ * | | |
|
||||||
|
+ * | +-------+ | +-----+ |
|
||||||
|
+ * I/P---^-->| PLL |---^--->pipe_clksrc--->| GCC |--->pipe_clk---+
|
||||||
|
+ * clk | +-------+ | +-----+
|
||||||
|
+ * +---------------+
|
||||||
|
+ */
|
||||||
|
+static int phy_pipe_clk_register(struct qcom_uniphy_pcie *phy,
|
||||||
|
+ struct device_node *np)
|
||||||
|
+{
|
||||||
|
+ struct clk_fixed_rate *fixed;
|
||||||
|
+ struct clk_init_data init = { };
|
||||||
|
+ int ret;
|
||||||
|
+
|
||||||
|
+ ret = of_property_read_string(np, "clock-output-names", &init.name);
|
||||||
|
+ if (ret) {
|
||||||
|
+ dev_err(phy->dev, "%pOFn: No clock-output-names\n", np);
|
||||||
|
+ return ret;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ fixed = devm_kzalloc(phy->dev, sizeof(*fixed), GFP_KERNEL);
|
||||||
|
+ if (!fixed)
|
||||||
|
+ return -ENOMEM;
|
||||||
|
+
|
||||||
|
+ init.ops = &clk_fixed_rate_ops;
|
||||||
|
+ fixed->fixed_rate = 125000000;
|
||||||
|
+ fixed->hw.init = &init;
|
||||||
|
+
|
||||||
|
+ ret = devm_clk_hw_register(phy->dev, &fixed->hw);
|
||||||
|
+ if (ret)
|
||||||
|
+ return ret;
|
||||||
|
+
|
||||||
|
+ ret = devm_of_clk_add_hw_provider(phy->dev, of_clk_hw_simple_get,
|
||||||
|
+ &fixed->hw);
|
||||||
|
+ if (ret)
|
||||||
|
+ return ret;
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static const struct of_device_id qcom_uniphy_pcie_id_table[] = {
|
||||||
|
+ {
|
||||||
|
+ .compatible = "qcom,ipq5018-uniphy-pcie-gen2x1",
|
||||||
|
+ .data = &ipq5018_2x1_data,
|
||||||
|
+ },
|
||||||
|
+ {
|
||||||
|
+ .compatible = "qcom,ipq5018-uniphy-pcie-gen2x2",
|
||||||
|
+ .data = &ipq5018_2x2_data,
|
||||||
|
+ },
|
||||||
|
+ { /* Sentinel */ },
|
||||||
|
+};
|
||||||
|
+MODULE_DEVICE_TABLE(of, qcom_uniphy_pcie_id_table);
|
||||||
|
+
|
||||||
|
+static const struct phy_ops pcie_ops = {
|
||||||
|
+ .power_on = qcom_uniphy_pcie_power_on,
|
||||||
|
+ .power_off = qcom_uniphy_pcie_power_off,
|
||||||
|
+ .owner = THIS_MODULE,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static int qcom_uniphy_pcie_probe(struct platform_device *pdev)
|
||||||
|
+{
|
||||||
|
+ struct qcom_uniphy_pcie *phy;
|
||||||
|
+ int ret;
|
||||||
|
+ struct phy *generic_phy;
|
||||||
|
+ struct phy_provider *phy_provider;
|
||||||
|
+ struct device *dev = &pdev->dev;
|
||||||
|
+ struct device_node *np = of_node_get(dev->of_node);
|
||||||
|
+
|
||||||
|
+ phy = devm_kzalloc(&pdev->dev, sizeof(*phy), GFP_KERNEL);
|
||||||
|
+ if (!phy)
|
||||||
|
+ return -ENOMEM;
|
||||||
|
+
|
||||||
|
+ platform_set_drvdata(pdev, phy);
|
||||||
|
+ phy->dev = &pdev->dev;
|
||||||
|
+
|
||||||
|
+ phy->data = of_device_get_match_data(dev);
|
||||||
|
+ if (!phy->data)
|
||||||
|
+ return -EINVAL;
|
||||||
|
+
|
||||||
|
+ ret = qcom_uniphy_pcie_get_resources(pdev, phy);
|
||||||
|
+ if (ret < 0) {
|
||||||
|
+ dev_err_probe(&pdev->dev, ret, "failed to get resources: %d\n", ret);
|
||||||
|
+ return ret;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ ret = phy_pipe_clk_register(phy, np);
|
||||||
|
+ if (ret)
|
||||||
|
+ dev_err_probe(&pdev->dev, ret, "failed to register phy pipe clk\n");
|
||||||
|
+
|
||||||
|
+ generic_phy = devm_phy_create(phy->dev, NULL, &pcie_ops);
|
||||||
|
+ if (IS_ERR(generic_phy))
|
||||||
|
+ return PTR_ERR(generic_phy);
|
||||||
|
+
|
||||||
|
+ phy_set_drvdata(generic_phy, phy);
|
||||||
|
+ phy_provider = devm_of_phy_provider_register(phy->dev,
|
||||||
|
+ of_phy_simple_xlate);
|
||||||
|
+ if (IS_ERR(phy_provider))
|
||||||
|
+ return PTR_ERR(phy_provider);
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static struct platform_driver qcom_uniphy_pcie_driver = {
|
||||||
|
+ .probe = qcom_uniphy_pcie_probe,
|
||||||
|
+ .driver = {
|
||||||
|
+ .name = "qcom-ipq5018-uniphy-pcie",
|
||||||
|
+ .owner = THIS_MODULE,
|
||||||
|
+ .of_match_table = qcom_uniphy_pcie_id_table,
|
||||||
|
+ },
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+module_platform_driver(qcom_uniphy_pcie_driver);
|
||||||
|
+
|
||||||
|
+MODULE_LICENSE("Dual BSD/GPL");
|
||||||
|
+MODULE_DESCRIPTION("PCIE QCOM IPQ5018 UNIPHY driver");
|
@ -0,0 +1,77 @@
|
|||||||
|
From: Nitheesh Sekar <quic_nsekar@quicinc.com>
|
||||||
|
Subject: [PATCH] PCI: qcom: Add support for IPQ5018
|
||||||
|
Date: Tue, 3 Oct 2023 17:38:44 +0530
|
||||||
|
|
||||||
|
Added a new compatible 'qcom,pcie-ipq5018' and modified
|
||||||
|
get_resources of 'ops 2_9_0' to get the clocks from the
|
||||||
|
device-tree.
|
||||||
|
|
||||||
|
Co-developed-by: Anusha Rao <quic_anusha@quicinc.com>
|
||||||
|
Signed-off-by: Anusha Rao <quic_anusha@quicinc.com>
|
||||||
|
Co-developed-by: Devi Priya <quic_devipriy@quicinc.com>
|
||||||
|
Signed-off-by: Devi Priya <quic_devipriy@quicinc.com>
|
||||||
|
Signed-off-by: Nitheesh Sekar <quic_nsekar@quicinc.com>
|
||||||
|
---
|
||||||
|
drivers/pci/controller/dwc/pcie-qcom.c | 22 ++++++++--------------
|
||||||
|
1 file changed, 8 insertions(+), 14 deletions(-)
|
||||||
|
|
||||||
|
--- a/drivers/pci/controller/dwc/pcie-qcom.c
|
||||||
|
+++ b/drivers/pci/controller/dwc/pcie-qcom.c
|
||||||
|
@@ -202,8 +202,9 @@ struct qcom_pcie_resources_2_7_0 {
|
||||||
|
|
||||||
|
#define QCOM_PCIE_2_9_0_MAX_CLOCKS 5
|
||||||
|
struct qcom_pcie_resources_2_9_0 {
|
||||||
|
- struct clk_bulk_data clks[QCOM_PCIE_2_9_0_MAX_CLOCKS];
|
||||||
|
+ struct clk_bulk_data *clks;
|
||||||
|
struct reset_control *rst;
|
||||||
|
+ int num_clks;
|
||||||
|
};
|
||||||
|
|
||||||
|
union qcom_pcie_resources {
|
||||||
|
@@ -1056,17 +1057,10 @@ static int qcom_pcie_get_resources_2_9_0
|
||||||
|
struct qcom_pcie_resources_2_9_0 *res = &pcie->res.v2_9_0;
|
||||||
|
struct dw_pcie *pci = pcie->pci;
|
||||||
|
struct device *dev = pci->dev;
|
||||||
|
- int ret;
|
||||||
|
-
|
||||||
|
- res->clks[0].id = "iface";
|
||||||
|
- res->clks[1].id = "axi_m";
|
||||||
|
- res->clks[2].id = "axi_s";
|
||||||
|
- res->clks[3].id = "axi_bridge";
|
||||||
|
- res->clks[4].id = "rchng";
|
||||||
|
|
||||||
|
- ret = devm_clk_bulk_get(dev, ARRAY_SIZE(res->clks), res->clks);
|
||||||
|
- if (ret < 0)
|
||||||
|
- return ret;
|
||||||
|
+ res->num_clks = devm_clk_bulk_get_all(dev, &res->clks);
|
||||||
|
+ if (res->num_clks < 0)
|
||||||
|
+ return res->num_clks;
|
||||||
|
|
||||||
|
res->rst = devm_reset_control_array_get_exclusive(dev);
|
||||||
|
if (IS_ERR(res->rst))
|
||||||
|
@@ -1079,7 +1073,7 @@ static void qcom_pcie_deinit_2_9_0(struc
|
||||||
|
{
|
||||||
|
struct qcom_pcie_resources_2_9_0 *res = &pcie->res.v2_9_0;
|
||||||
|
|
||||||
|
- clk_bulk_disable_unprepare(ARRAY_SIZE(res->clks), res->clks);
|
||||||
|
+ clk_bulk_disable_unprepare(res->num_clks, res->clks);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int qcom_pcie_init_2_9_0(struct qcom_pcie *pcie)
|
||||||
|
@@ -1108,7 +1102,7 @@ static int qcom_pcie_init_2_9_0(struct q
|
||||||
|
|
||||||
|
usleep_range(2000, 2500);
|
||||||
|
|
||||||
|
- return clk_bulk_prepare_enable(ARRAY_SIZE(res->clks), res->clks);
|
||||||
|
+ return clk_bulk_prepare_enable(res->num_clks, res->clks);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int qcom_pcie_post_init_2_9_0(struct qcom_pcie *pcie)
|
||||||
|
@@ -1613,6 +1607,7 @@ static const struct of_device_id qcom_pc
|
||||||
|
{ .compatible = "qcom,pcie-apq8064", .data = &cfg_2_1_0 },
|
||||||
|
{ .compatible = "qcom,pcie-apq8084", .data = &cfg_1_0_0 },
|
||||||
|
{ .compatible = "qcom,pcie-ipq4019", .data = &cfg_2_4_0 },
|
||||||
|
+ { .compatible = "qcom,pcie-ipq5018", .data = &cfg_2_9_0 },
|
||||||
|
{ .compatible = "qcom,pcie-ipq6018", .data = &cfg_2_9_0 },
|
||||||
|
{ .compatible = "qcom,pcie-ipq8064", .data = &cfg_2_1_0 },
|
||||||
|
{ .compatible = "qcom,pcie-ipq8064-v2", .data = &cfg_2_1_0 },
|
@ -0,0 +1,207 @@
|
|||||||
|
From: Nitheesh Sekar <quic_nsekar@quicinc.com>
|
||||||
|
Subject: [PATCH] arm64: dts: qcom: ipq5018: Add PCIe related nodes
|
||||||
|
Date: Tue, 3 Oct 2023 17:38:45 +0530
|
||||||
|
|
||||||
|
Add phy and controller nodes for PCIe_x2 and PCIe_x1.
|
||||||
|
PCIe_x2 is 2-lane Gen2 and PCIe_x1 is 1-lane Gen2.
|
||||||
|
|
||||||
|
Signed-off-by: Nitheesh Sekar <quic_nsekar@quicinc.com>
|
||||||
|
---
|
||||||
|
arch/arm64/boot/dts/qcom/ipq5018.dtsi | 186 +++++++++++++++++++++++++-
|
||||||
|
1 file changed, 184 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
--- a/arch/arm64/boot/dts/qcom/ipq5018.dtsi
|
||||||
|
+++ b/arch/arm64/boot/dts/qcom/ipq5018.dtsi
|
||||||
|
@@ -149,6 +149,38 @@
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
|
+ pcie_x1phy: phy@7e000{
|
||||||
|
+ compatible = "qcom,ipq5018-uniphy-pcie-gen2x1";
|
||||||
|
+ reg = <0x0007e000 0x800>;
|
||||||
|
+ #phy-cells = <0>;
|
||||||
|
+ #clock-cells = <0>;
|
||||||
|
+ clocks = <&gcc GCC_PCIE1_PIPE_CLK>;
|
||||||
|
+ clock-names = "pipe_clk";
|
||||||
|
+ clock-output-names = "pcie1_pipe_clk";
|
||||||
|
+ assigned-clocks = <&gcc GCC_PCIE1_PIPE_CLK>;
|
||||||
|
+ assigned-clock-rates = <125000000>;
|
||||||
|
+ resets = <&gcc GCC_PCIE1_PHY_BCR>,
|
||||||
|
+ <&gcc GCC_PCIE1PHY_PHY_BCR>;
|
||||||
|
+ reset-names = "phy", "phy_phy";
|
||||||
|
+ status = "disabled";
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ pcie_x2phy: phy@86000{
|
||||||
|
+ compatible = "qcom,ipq5018-uniphy-pcie-gen2x2";
|
||||||
|
+ reg = <0x00086000 0x800>;
|
||||||
|
+ #phy-cells = <0>;
|
||||||
|
+ #clock-cells = <0>;
|
||||||
|
+ clocks = <&gcc GCC_PCIE0_PIPE_CLK>;
|
||||||
|
+ clock-names = "pipe_clk";
|
||||||
|
+ clock-output-names = "pcie0_pipe_clk";
|
||||||
|
+ assigned-clocks = <&gcc GCC_PCIE0_PIPE_CLK>;
|
||||||
|
+ assigned-clock-rates = <125000000>;
|
||||||
|
+ resets = <&gcc GCC_PCIE0_PHY_BCR>,
|
||||||
|
+ <&gcc GCC_PCIE0PHY_PHY_BCR>;
|
||||||
|
+ reset-names = "phy", "phy_phy";
|
||||||
|
+ status = "disabled";
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
qfprom: qfprom@a0000 {
|
||||||
|
compatible = "qcom,ipq5018-qfprom", "qcom,qfprom";
|
||||||
|
reg = <0xa0000 0x1000>;
|
||||||
|
@@ -283,8 +315,8 @@
|
||||||
|
reg = <0x01800000 0x80000>;
|
||||||
|
clocks = <&xo_board_clk>,
|
||||||
|
<&sleep_clk>,
|
||||||
|
- <0>,
|
||||||
|
- <0>,
|
||||||
|
+ <&pcie_x2phy>,
|
||||||
|
+ <&pcie_x1phy>,
|
||||||
|
<0>,
|
||||||
|
<0>,
|
||||||
|
<0>,
|
||||||
|
@@ -501,6 +533,142 @@
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
+
|
||||||
|
+ pcie_x1: pcie@80000000 {
|
||||||
|
+ compatible = "qcom,pcie-ipq5018";
|
||||||
|
+ reg = <0x80000000 0xf1d>,
|
||||||
|
+ <0x80000f20 0xa8>,
|
||||||
|
+ <0x80001000 0x1000>,
|
||||||
|
+ <0x00078000 0x3000>,
|
||||||
|
+ <0x80100000 0x1000>;
|
||||||
|
+ reg-names = "dbi", "elbi", "atu", "parf", "config";
|
||||||
|
+ device_type = "pci";
|
||||||
|
+ linux,pci-domain = <0>;
|
||||||
|
+ bus-range = <0x00 0xff>;
|
||||||
|
+ num-lanes = <1>;
|
||||||
|
+ max-link-speed = <2>;
|
||||||
|
+ #address-cells = <3>;
|
||||||
|
+ #size-cells = <2>;
|
||||||
|
+
|
||||||
|
+ phys = <&pcie_x1phy>;
|
||||||
|
+ phy-names ="pciephy";
|
||||||
|
+
|
||||||
|
+ ranges = <0x81000000 0 0x80200000 0x80200000 0 0x00100000>, /* I/O */
|
||||||
|
+ <0x82000000 0 0x80300000 0x80300000 0 0x10000000>; /* MEM */
|
||||||
|
+
|
||||||
|
+ #interrupt-cells = <1>;
|
||||||
|
+ interrupt-map-mask = <0 0 0 0x7>;
|
||||||
|
+ interrupt-map = <0 0 0 1 &intc 0 142 IRQ_TYPE_LEVEL_HIGH>, /* int_a */
|
||||||
|
+ <0 0 0 2 &intc 0 143 IRQ_TYPE_LEVEL_HIGH>, /* int_b */
|
||||||
|
+ <0 0 0 3 &intc 0 144 IRQ_TYPE_LEVEL_HIGH>, /* int_c */
|
||||||
|
+ <0 0 0 4 &intc 0 145 IRQ_TYPE_LEVEL_HIGH>; /* int_d */
|
||||||
|
+
|
||||||
|
+ interrupts = <GIC_SPI 119 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
+ interrupt-names = "global_irq";
|
||||||
|
+
|
||||||
|
+ clocks = <&gcc GCC_SYS_NOC_PCIE1_AXI_CLK>,
|
||||||
|
+ <&gcc GCC_PCIE1_AXI_M_CLK>,
|
||||||
|
+ <&gcc GCC_PCIE1_AXI_S_CLK>,
|
||||||
|
+ <&gcc GCC_PCIE1_AHB_CLK>,
|
||||||
|
+ <&gcc GCC_PCIE1_AUX_CLK>,
|
||||||
|
+ <&gcc GCC_PCIE1_AXI_S_BRIDGE_CLK>;
|
||||||
|
+
|
||||||
|
+ clock-names = "iface",
|
||||||
|
+ "axi_m",
|
||||||
|
+ "axi_s",
|
||||||
|
+ "ahb",
|
||||||
|
+ "aux",
|
||||||
|
+ "axi_bridge";
|
||||||
|
+
|
||||||
|
+ resets = <&gcc GCC_PCIE1_PIPE_ARES>,
|
||||||
|
+ <&gcc GCC_PCIE1_SLEEP_ARES>,
|
||||||
|
+ <&gcc GCC_PCIE1_CORE_STICKY_ARES>,
|
||||||
|
+ <&gcc GCC_PCIE1_AXI_MASTER_ARES>,
|
||||||
|
+ <&gcc GCC_PCIE1_AXI_SLAVE_ARES>,
|
||||||
|
+ <&gcc GCC_PCIE1_AHB_ARES>,
|
||||||
|
+ <&gcc GCC_PCIE1_AXI_MASTER_STICKY_ARES>,
|
||||||
|
+ <&gcc GCC_PCIE1_AXI_SLAVE_STICKY_ARES>;
|
||||||
|
+
|
||||||
|
+ reset-names = "pipe",
|
||||||
|
+ "sleep",
|
||||||
|
+ "sticky",
|
||||||
|
+ "axi_m",
|
||||||
|
+ "axi_s",
|
||||||
|
+ "ahb",
|
||||||
|
+ "axi_m_sticky",
|
||||||
|
+ "axi_s_sticky";
|
||||||
|
+
|
||||||
|
+ msi-map = <0x0 &v2m0 0x0 0xff8>;
|
||||||
|
+ status = "disabled";
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ pcie_x2: pcie@a0000000 {
|
||||||
|
+ compatible = "qcom,pcie-ipq5018";
|
||||||
|
+ reg = <0xa0000000 0xf1d>,
|
||||||
|
+ <0xa0000f20 0xa8>,
|
||||||
|
+ <0xa0001000 0x1000>,
|
||||||
|
+ <0x00080000 0x3000>,
|
||||||
|
+ <0xa0100000 0x1000>;
|
||||||
|
+ reg-names = "dbi", "elbi", "atu", "parf", "config";
|
||||||
|
+ device_type = "pci";
|
||||||
|
+ linux,pci-domain = <1>;
|
||||||
|
+ bus-range = <0x00 0xff>;
|
||||||
|
+ num-lanes = <2>;
|
||||||
|
+ max-link-speed = <2>;
|
||||||
|
+ #address-cells = <3>;
|
||||||
|
+ #size-cells = <2>;
|
||||||
|
+
|
||||||
|
+ phys = <&pcie_x2phy>;
|
||||||
|
+ phy-names ="pciephy";
|
||||||
|
+
|
||||||
|
+ ranges = <0x81000000 0 0xa0200000 0xa0200000 0 0x00100000>, /* I/O */
|
||||||
|
+ <0x82000000 0 0xa0300000 0xa0300000 0 0x10000000>; /* MEM */
|
||||||
|
+
|
||||||
|
+ #interrupt-cells = <1>;
|
||||||
|
+ interrupt-map-mask = <0 0 0 0x7>;
|
||||||
|
+ interrupt-map = <0 0 0 1 &intc 0 75 IRQ_TYPE_LEVEL_HIGH>, /* int_a */
|
||||||
|
+ <0 0 0 2 &intc 0 78 IRQ_TYPE_LEVEL_HIGH>, /* int_b */
|
||||||
|
+ <0 0 0 3 &intc 0 79 IRQ_TYPE_LEVEL_HIGH>, /* int_c */
|
||||||
|
+ <0 0 0 4 &intc 0 83 IRQ_TYPE_LEVEL_HIGH>; /* int_d */
|
||||||
|
+
|
||||||
|
+ interrupts = <GIC_SPI 51 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
+ interrupt-names = "global_irq";
|
||||||
|
+
|
||||||
|
+ clocks = <&gcc GCC_SYS_NOC_PCIE0_AXI_CLK>,
|
||||||
|
+ <&gcc GCC_PCIE0_AXI_M_CLK>,
|
||||||
|
+ <&gcc GCC_PCIE0_AXI_S_CLK>,
|
||||||
|
+ <&gcc GCC_PCIE0_AHB_CLK>,
|
||||||
|
+ <&gcc GCC_PCIE0_AUX_CLK>,
|
||||||
|
+ <&gcc GCC_PCIE0_AXI_S_BRIDGE_CLK>;
|
||||||
|
+
|
||||||
|
+ clock-names = "iface",
|
||||||
|
+ "axi_m",
|
||||||
|
+ "axi_s",
|
||||||
|
+ "ahb",
|
||||||
|
+ "aux",
|
||||||
|
+ "axi_bridge";
|
||||||
|
+
|
||||||
|
+ resets = <&gcc GCC_PCIE0_PIPE_ARES>,
|
||||||
|
+ <&gcc GCC_PCIE0_SLEEP_ARES>,
|
||||||
|
+ <&gcc GCC_PCIE0_CORE_STICKY_ARES>,
|
||||||
|
+ <&gcc GCC_PCIE0_AXI_MASTER_ARES>,
|
||||||
|
+ <&gcc GCC_PCIE0_AXI_SLAVE_ARES>,
|
||||||
|
+ <&gcc GCC_PCIE0_AHB_ARES>,
|
||||||
|
+ <&gcc GCC_PCIE0_AXI_MASTER_STICKY_ARES>,
|
||||||
|
+ <&gcc GCC_PCIE0_AXI_SLAVE_STICKY_ARES>;
|
||||||
|
+
|
||||||
|
+ reset-names = "pipe",
|
||||||
|
+ "sleep",
|
||||||
|
+ "sticky",
|
||||||
|
+ "axi_m",
|
||||||
|
+ "axi_s",
|
||||||
|
+ "ahb",
|
||||||
|
+ "axi_m_sticky",
|
||||||
|
+ "axi_s_sticky";
|
||||||
|
+
|
||||||
|
+ msi-map = <0x0 &v2m0 0x0 0xff8>;
|
||||||
|
+ status = "disabled";
|
||||||
|
+ };
|
||||||
|
};
|
||||||
|
|
||||||
|
thermal-zones {
|
@ -0,0 +1,85 @@
|
|||||||
|
From: Gabor Juhos <j4g8y7@gmail.com>
|
||||||
|
Subject: [PATCH] clk: qcom: apss-ipq-pll: use stromer ops for IPQ5018 to fix boot failure
|
||||||
|
Date: Fri, 15 Mar 2024 17:16:41 +0100
|
||||||
|
|
||||||
|
Booting v6.8 results in a hang on various IPQ5018 based boards.
|
||||||
|
Investigating the problem showed that the hang happens when the
|
||||||
|
clk_alpha_pll_stromer_plus_set_rate() function tries to write
|
||||||
|
into the PLL_MODE register of the APSS PLL.
|
||||||
|
|
||||||
|
Checking the downstream code revealed that it uses [1] stromer
|
||||||
|
specific operations for IPQ5018, whereas in the current code
|
||||||
|
the stromer plus specific operations are used.
|
||||||
|
|
||||||
|
The ops in the 'ipq_pll_stromer_plus' clock definition can't be
|
||||||
|
changed since that is needed for IPQ5332, so add a new alpha pll
|
||||||
|
clock declaration which uses the correct stromer ops and use this
|
||||||
|
new clock for IPQ5018 to avoid the boot failure.
|
||||||
|
|
||||||
|
Also, change pll_type in 'ipq5018_pll_data' to
|
||||||
|
CLK_ALPHA_PLL_TYPE_STROMER to better reflect that it is a Stromer
|
||||||
|
PLL and change the apss_ipq_pll_probe() function accordingly.
|
||||||
|
|
||||||
|
1. https://git.codelinaro.org/clo/qsdk/oss/kernel/linux-ipq-5.4/-/blob/NHSS.QSDK.12.4/drivers/clk/qcom/apss-ipq5018.c#L67
|
||||||
|
|
||||||
|
Fixes: 50492f929486 ("clk: qcom: apss-ipq-pll: add support for IPQ5018")
|
||||||
|
Signed-off-by: Gabor Juhos <j4g8y7@gmail.com>
|
||||||
|
---
|
||||||
|
drivers/clk/qcom/apss-ipq-pll.c | 30 +++++++++++++++++++++++++++---
|
||||||
|
1 file changed, 27 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/clk/qcom/apss-ipq-pll.c b/drivers/clk/qcom/apss-ipq-pll.c
|
||||||
|
index 678b805f13d45..dfffec2f06ae7 100644
|
||||||
|
--- a/drivers/clk/qcom/apss-ipq-pll.c
|
||||||
|
+++ b/drivers/clk/qcom/apss-ipq-pll.c
|
||||||
|
@@ -55,6 +55,29 @@ static struct clk_alpha_pll ipq_pll_huay
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
+static struct clk_alpha_pll ipq_pll_stromer = {
|
||||||
|
+ .offset = 0x0,
|
||||||
|
+ /*
|
||||||
|
+ * Reuse CLK_ALPHA_PLL_TYPE_STROMER_PLUS register offsets.
|
||||||
|
+ * Although this is a bit confusing, but the offset values
|
||||||
|
+ * are correct nevertheless.
|
||||||
|
+ */
|
||||||
|
+ .regs = ipq_pll_offsets[CLK_ALPHA_PLL_TYPE_STROMER_PLUS],
|
||||||
|
+ .flags = SUPPORTS_DYNAMIC_UPDATE,
|
||||||
|
+ .clkr = {
|
||||||
|
+ .enable_reg = 0x0,
|
||||||
|
+ .enable_mask = BIT(0),
|
||||||
|
+ .hw.init = &(const struct clk_init_data) {
|
||||||
|
+ .name = "a53pll",
|
||||||
|
+ .parent_data = &(const struct clk_parent_data) {
|
||||||
|
+ .fw_name = "xo",
|
||||||
|
+ },
|
||||||
|
+ .num_parents = 1,
|
||||||
|
+ .ops = &clk_alpha_pll_stromer_ops,
|
||||||
|
+ },
|
||||||
|
+ },
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
static struct clk_alpha_pll ipq_pll_stromer_plus = {
|
||||||
|
.offset = 0x0,
|
||||||
|
.regs = ipq_pll_offsets[CLK_ALPHA_PLL_TYPE_STROMER_PLUS],
|
||||||
|
@@ -144,8 +167,8 @@ struct apss_pll_data {
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct apss_pll_data ipq5018_pll_data = {
|
||||||
|
- .pll_type = CLK_ALPHA_PLL_TYPE_STROMER_PLUS,
|
||||||
|
- .pll = &ipq_pll_stromer_plus,
|
||||||
|
+ .pll_type = CLK_ALPHA_PLL_TYPE_STROMER,
|
||||||
|
+ .pll = &ipq_pll_stromer,
|
||||||
|
.pll_config = &ipq5018_pll_config,
|
||||||
|
};
|
||||||
|
|
||||||
|
@@ -203,7 +226,8 @@ static int apss_ipq_pll_probe(struct pla
|
||||||
|
|
||||||
|
if (data->pll_type == CLK_ALPHA_PLL_TYPE_HUAYRA)
|
||||||
|
clk_alpha_pll_configure(data->pll, regmap, data->pll_config);
|
||||||
|
- else if (data->pll_type == CLK_ALPHA_PLL_TYPE_STROMER_PLUS)
|
||||||
|
+ else if (data->pll_type == CLK_ALPHA_PLL_TYPE_STROMER ||
|
||||||
|
+ data->pll_type == CLK_ALPHA_PLL_TYPE_STROMER_PLUS)
|
||||||
|
clk_stromer_pll_configure(data->pll, regmap, data->pll_config);
|
||||||
|
|
||||||
|
ret = devm_clk_register_regmap(dev, &data->pll->clkr);
|
@ -0,0 +1,34 @@
|
|||||||
|
From: Gabor Juhos <j4g8y7@gmail.com>
|
||||||
|
Subject: [PATCH] clk: qcom: apss-ipq-pll: fix PLL rate for IPQ5018
|
||||||
|
Date: Tue, 26 Mar 2024 14:34:11 +0100
|
||||||
|
|
||||||
|
According to ipq5018.dtsi, the maximum supported rate by the
|
||||||
|
CPU is 1.008 GHz on the IPQ5018 platform, however the current
|
||||||
|
configuration of the PLL results in 1.2 GHz rate.
|
||||||
|
|
||||||
|
Change the 'L' value in the PLL configuration to limit the
|
||||||
|
rate to 1.008 GHz. The downstream kernel also uses the same
|
||||||
|
value [1]. Also add a comment to indicate the desired
|
||||||
|
frequency.
|
||||||
|
|
||||||
|
[1] https://git.codelinaro.org/clo/qsdk/oss/kernel/linux-ipq-5.4/-/blob/NHSS.QSDK.12.4/drivers/clk/qcom/apss-ipq5018.c?ref_type=heads#L151
|
||||||
|
|
||||||
|
Fixes: 50492f929486 ("clk: qcom: apss-ipq-pll: add support for IPQ5018")
|
||||||
|
Signed-off-by: Gabor Juhos <j4g8y7@gmail.com>
|
||||||
|
---
|
||||||
|
drivers/clk/qcom/apss-ipq-pll.c | 3 ++-
|
||||||
|
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/clk/qcom/apss-ipq-pll.c b/drivers/clk/qcom/apss-ipq-pll.c
|
||||||
|
index 678b805f13d45..5e3da5558f4e0 100644
|
||||||
|
--- a/drivers/clk/qcom/apss-ipq-pll.c
|
||||||
|
+++ b/drivers/clk/qcom/apss-ipq-pll.c
|
||||||
|
@@ -97,7 +97,7 @@ static struct clk_alpha_pll ipq_pll_stro
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct alpha_pll_config ipq5018_pll_config = {
|
||||||
|
- .l = 0x32,
|
||||||
|
+ .l = 0x2a,
|
||||||
|
.config_ctl_val = 0x4001075b,
|
||||||
|
.config_ctl_hi_val = 0x304,
|
||||||
|
.main_output_mask = BIT(0),
|
@ -0,0 +1,18 @@
|
|||||||
|
From: George Moussalem <george.moussalem@outlook.com>
|
||||||
|
Subject: [PATCH] dt-bindings: mfd: qcom,tcsr: Add IPQ5018 compatible
|
||||||
|
Date: Sun, 06 Oct 2024 16:34:11 +0400
|
||||||
|
|
||||||
|
Document the qcom,tcsr-ipq5018 compatible.
|
||||||
|
|
||||||
|
Signed-off-by: George Moussalem <george.moussalem@outlook.com>
|
||||||
|
---
|
||||||
|
--- a/Documentation/devicetree/bindings/mfd/qcom,tcsr.yaml
|
||||||
|
+++ b/Documentation/devicetree/bindings/mfd/qcom,tcsr.yaml
|
||||||
|
@@ -33,6 +33,7 @@ properties:
|
||||||
|
- qcom,sm8450-tcsr
|
||||||
|
- qcom,tcsr-apq8064
|
||||||
|
- qcom,tcsr-apq8084
|
||||||
|
+ - qcom,tcsr-ipq5018
|
||||||
|
- qcom,tcsr-ipq5332
|
||||||
|
- qcom,tcsr-ipq8064
|
||||||
|
- qcom,tcsr-ipq8074
|
@ -0,0 +1,22 @@
|
|||||||
|
From: George Moussalem <george.moussalem@outlook.com>
|
||||||
|
Subject: [PATCH] arm64: dts: qcom: ipq5018: Add TCSR node
|
||||||
|
Date: Sun, 06 Oct 2024 16:34:11 +0400
|
||||||
|
|
||||||
|
Add TCSR node.
|
||||||
|
|
||||||
|
Signed-off-by: George Moussalem <george.moussalem@outlook.com>
|
||||||
|
---
|
||||||
|
--- a/arch/arm64/boot/dts/qcom/ipq5018.dtsi
|
||||||
|
+++ b/arch/arm64/boot/dts/qcom/ipq5018.dtsi
|
||||||
|
@@ -333,6 +333,11 @@
|
||||||
|
#hwlock-cells = <1>;
|
||||||
|
};
|
||||||
|
|
||||||
|
+ tcsr: syscon@1937000 {
|
||||||
|
+ compatible = "qcom,tcsr-ipq5018", "syscon", "simple-mfd";
|
||||||
|
+ reg = <0x01937000 0x21000>;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
sdhc_1: mmc@7804000 {
|
||||||
|
compatible = "qcom,ipq5018-sdhci", "qcom,sdhci-msm-v5";
|
||||||
|
reg = <0x7804000 0x1000>;
|
@ -0,0 +1,19 @@
|
|||||||
|
From: George Moussalem <george.moussalem@outlook.com>
|
||||||
|
Subject: [PATCH] arm64: dts: qcom: ipq5018: enable the download mode support
|
||||||
|
Date: Sun, 06 Oct 2024 16:34:11 +0400
|
||||||
|
|
||||||
|
IPQ5018 also supports the download mode to collect the RAM dumps if system crashes, to perform
|
||||||
|
the post mortem analysis. Add support for the same.
|
||||||
|
|
||||||
|
Signed-off-by: George Moussalem <george.moussalem@outlook.com>
|
||||||
|
---
|
||||||
|
--- a/arch/arm64/boot/dts/qcom/ipq5018.dtsi
|
||||||
|
+++ b/arch/arm64/boot/dts/qcom/ipq5018.dtsi
|
||||||
|
@@ -82,6 +82,7 @@
|
||||||
|
scm {
|
||||||
|
compatible = "qcom,scm-ipq5018", "qcom,scm";
|
||||||
|
qcom,sdi-enabled;
|
||||||
|
+ qcom,dload-mode = <&tcsr 0x6100>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
@ -0,0 +1,22 @@
|
|||||||
|
From: George Moussalem <george.moussalem@outlook.com>
|
||||||
|
Subject: [PATCH] dt-bindings: mfd: qcom,tcsr: Add IPQ5018 compatible
|
||||||
|
Date: Sun, 06 Oct 2024 16:34:11 +0400
|
||||||
|
|
||||||
|
Add compatible for IPQ5018.
|
||||||
|
|
||||||
|
Signed-off-by: George Moussalem <george.moussalem@outlook.com>
|
||||||
|
---
|
||||||
|
--- a/Documentation/devicetree/bindings/pwm/qcom,ipq6018-pwm.yaml
|
||||||
|
+++ b/Documentation/devicetree/bindings/pwm/qcom,ipq6018-pwm.yaml
|
||||||
|
@@ -11,7 +11,10 @@ maintainers:
|
||||||
|
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
- const: qcom,ipq6018-pwm
|
||||||
|
+ items:
|
||||||
|
+ - enum:
|
||||||
|
+ - qcom,ipq5018-pwm
|
||||||
|
+ - const: qcom,ipq6018-pwm
|
||||||
|
|
||||||
|
reg:
|
||||||
|
description: Offset of PWM register in the TCSR block.
|
@ -0,0 +1,56 @@
|
|||||||
|
--- a/drivers/pinctrl/qcom/pinctrl-ipq5018.c
|
||||||
|
+++ b/drivers/pinctrl/qcom/pinctrl-ipq5018.c
|
||||||
|
@@ -541,7 +541,7 @@ static const char * const qdss_tracectl_
|
||||||
|
};
|
||||||
|
|
||||||
|
static const char * const pwm0_groups[] = {
|
||||||
|
- "gpio42",
|
||||||
|
+ "gpio42", "gpio46",
|
||||||
|
};
|
||||||
|
|
||||||
|
static const char * const qdss_cti_trig_out_b0_groups[] = {
|
||||||
|
@@ -549,7 +549,7 @@ static const char * const qdss_cti_trig_
|
||||||
|
};
|
||||||
|
|
||||||
|
static const char * const pwm1_groups[] = {
|
||||||
|
- "gpio43",
|
||||||
|
+ "gpio43", "gpio1",
|
||||||
|
};
|
||||||
|
|
||||||
|
static const char * const qdss_cti_trig_in_b0_groups[] = {
|
||||||
|
@@ -565,7 +565,7 @@ static const char * const qdss_cti_trig_
|
||||||
|
};
|
||||||
|
|
||||||
|
static const char * const pwm3_groups[] = {
|
||||||
|
- "gpio45",
|
||||||
|
+ "gpio45", "gpio30",
|
||||||
|
};
|
||||||
|
|
||||||
|
static const char * const qdss_cti_trig_in_b1_groups[] = {
|
||||||
|
@@ -679,7 +679,7 @@ static const struct pinfunction ipq5018_
|
||||||
|
|
||||||
|
static const struct msm_pingroup ipq5018_groups[] = {
|
||||||
|
PINGROUP(0, atest_char, _, qdss_cti_trig_out_a0, wci_txd, wci_rxd, xfem, _, _, _),
|
||||||
|
- PINGROUP(1, atest_char, _, qdss_cti_trig_in_a0, wci_txd, wci_rxd, xfem, _, _, _),
|
||||||
|
+ PINGROUP(1, atest_char, pwm1, qdss_cti_trig_in_a0, wci_txd, wci_rxd, xfem, _, _, _),
|
||||||
|
PINGROUP(2, atest_char, _, qdss_cti_trig_out_a1, wci_txd, wci_rxd, xfem, _, _, _),
|
||||||
|
PINGROUP(3, atest_char, _, qdss_cti_trig_in_a1, wci_txd, wci_rxd, xfem, _, _, _),
|
||||||
|
PINGROUP(4, sdc1_data, qspi_data, blsp1_spi1, btss, dbg_out, qdss_traceclk_a, _, burn0, _),
|
||||||
|
@@ -708,7 +708,7 @@ static const struct msm_pingroup ipq5018
|
||||||
|
PINGROUP(27, audio_txmclk, wsa_swrm, audio_txmclk, blsp2_spi, btss, _, qdss_tracedata_b, _, _),
|
||||||
|
PINGROUP(28, audio_txbclk, wsa_swrm, blsp0_uart1, btss, qdss_tracedata_b, _, _, _, _),
|
||||||
|
PINGROUP(29, audio_txfsync, _, blsp0_uart1, _, qdss_tracedata_b, _, _, _, _),
|
||||||
|
- PINGROUP(30, audio_txd, led2, led0, _, _, _, _, _, _),
|
||||||
|
+ PINGROUP(30, audio_txd, led2, led0, pwm3, _, _, _, _, _),
|
||||||
|
PINGROUP(31, blsp2_spi0, blsp1_uart1, _, qdss_tracedata_b, eud_gpio, _, _, _, _),
|
||||||
|
PINGROUP(32, blsp2_spi0, blsp1_uart1, _, qdss_tracedata_b, eud_gpio, _, _, _, _),
|
||||||
|
PINGROUP(33, blsp2_i2c0, blsp2_spi0, blsp1_uart1, _, qdss_tracedata_b, eud_gpio, _, _, _),
|
||||||
|
@@ -724,7 +724,7 @@ static const struct msm_pingroup ipq5018
|
||||||
|
PINGROUP(43, pwm1, qdss_cti_trig_in_b0, wci_txd, wci_rxd, xfem, _, _, _, _),
|
||||||
|
PINGROUP(44, pwm2, qdss_cti_trig_out_b1, wci_txd, wci_rxd, xfem, _, _, _, _),
|
||||||
|
PINGROUP(45, pwm3, qdss_cti_trig_in_b1, wci_txd, wci_rxd, xfem, _, _, _, _),
|
||||||
|
- PINGROUP(46, led0, _, _, _, _, _, _, _, _),
|
||||||
|
+ PINGROUP(46, led0, pwm0, _, _, _, _, _, _, _),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct msm_pinctrl_soc_data ipq5018_pinctrl = {
|
@ -0,0 +1,27 @@
|
|||||||
|
From: George Moussalem <george.moussalem@outlook.com>
|
||||||
|
Subject: [PATCH] arm64: dts: qcom: ipq5018: Add PWM node
|
||||||
|
Date: Sun, 06 Oct 2024 16:34:11 +0400
|
||||||
|
|
||||||
|
Add PWM node.
|
||||||
|
|
||||||
|
Signed-off-by: George Moussalem <george.moussalem@outlook.com>
|
||||||
|
---
|
||||||
|
--- a/arch/arm64/boot/dts/qcom/ipq5018.dtsi
|
||||||
|
+++ b/arch/arm64/boot/dts/qcom/ipq5018.dtsi
|
||||||
|
@@ -339,6 +339,16 @@
|
||||||
|
reg = <0x01937000 0x21000>;
|
||||||
|
};
|
||||||
|
|
||||||
|
+ pwm: pwm@1941010 {
|
||||||
|
+ compatible = "qcom,ipq5018-pwm", "qcom,ipq6018-pwm";
|
||||||
|
+ reg = <0x01941010 0x20>;
|
||||||
|
+ clocks = <&gcc GCC_ADSS_PWM_CLK>;
|
||||||
|
+ assigned-clocks = <&gcc GCC_ADSS_PWM_CLK>;
|
||||||
|
+ assigned-clock-rates = <100000000>;
|
||||||
|
+ #pwm-cells = <2>;
|
||||||
|
+ status = "disabled";
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
sdhc_1: mmc@7804000 {
|
||||||
|
compatible = "qcom,ipq5018-sdhci", "qcom,sdhci-msm-v5";
|
||||||
|
reg = <0x7804000 0x1000>;
|
@ -0,0 +1,41 @@
|
|||||||
|
From: George Moussalem <george.moussalem@outlook.com>
|
||||||
|
Subject: [PATCH] arm64: dts: qcom: ipq5018: Add crypto nodes
|
||||||
|
Date: Sun, 06 Oct 2024 16:34:11 +0400
|
||||||
|
|
||||||
|
Add dma controller and crypto nodes.
|
||||||
|
|
||||||
|
Signed-off-by: George Moussalem <george.moussalem@outlook.com>
|
||||||
|
---
|
||||||
|
--- a/arch/arm64/boot/dts/qcom/ipq5018.dtsi
|
||||||
|
+++ b/arch/arm64/boot/dts/qcom/ipq5018.dtsi
|
||||||
|
@@ -293,6 +293,30 @@
|
||||||
|
#thermal-sensor-cells = <1>;
|
||||||
|
};
|
||||||
|
|
||||||
|
+ cryptobam: dma-controller@704000 {
|
||||||
|
+ compatible = "qcom,bam-v1.7.0";
|
||||||
|
+ reg = <0x00704000 0x20000>;
|
||||||
|
+ interrupts = <GIC_SPI 207 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
+ clocks = <&gcc GCC_CRYPTO_AHB_CLK>;
|
||||||
|
+ clock-names = "bam_clk";
|
||||||
|
+ #dma-cells = <1>;
|
||||||
|
+ qcom,ee = <1>;
|
||||||
|
+ qcom,controlled-remotely;
|
||||||
|
+ status = "disabled";
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ crypto: crypto@73a000 {
|
||||||
|
+ compatible = "qcom,crypto-v5.1";
|
||||||
|
+ reg = <0x0073a000 0x6000>;
|
||||||
|
+ clocks = <&gcc GCC_CRYPTO_AHB_CLK>,
|
||||||
|
+ <&gcc GCC_CRYPTO_AXI_CLK>,
|
||||||
|
+ <&gcc GCC_CRYPTO_CLK>;
|
||||||
|
+ clock-names = "iface", "bus", "core";
|
||||||
|
+ dmas = <&cryptobam 2>, <&cryptobam 3>;
|
||||||
|
+ dma-names = "rx", "tx";
|
||||||
|
+ status = "disabled";
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
tlmm: pinctrl@1000000 {
|
||||||
|
compatible = "qcom,ipq5018-tlmm";
|
||||||
|
reg = <0x01000000 0x300000>;
|
@ -0,0 +1,25 @@
|
|||||||
|
From: George Moussalem <george.moussalem@outlook.com>
|
||||||
|
Subject: [PATCH] arm64: dts: qcom: ipq5018: Add PRNG node
|
||||||
|
Date: Sun, 06 Oct 2024 16:34:11 +0400
|
||||||
|
|
||||||
|
Add PRNG node.
|
||||||
|
|
||||||
|
Signed-off-by: George Moussalem <george.moussalem@outlook.com>
|
||||||
|
---
|
||||||
|
--- a/arch/arm64/boot/dts/qcom/ipq5018.dtsi
|
||||||
|
+++ b/arch/arm64/boot/dts/qcom/ipq5018.dtsi
|
||||||
|
@@ -254,6 +254,14 @@
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
+ prng: rng@e3000 {
|
||||||
|
+ compatible = "qcom,prng-ee";
|
||||||
|
+ reg = <0x000e3000 0x1000>;
|
||||||
|
+ clocks = <&gcc GCC_PRNG_AHB_CLK>;
|
||||||
|
+ clock-names = "core";
|
||||||
|
+ status = "disabled";
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
tsens: thermal-sensor@4a9000 {
|
||||||
|
compatible = "qcom,ipq5018-tsens";
|
||||||
|
reg = <0x4a9000 0x1000>, /* TM */
|
@ -0,0 +1,27 @@
|
|||||||
|
From: George Moussalem <george.moussalem@outlook.com>
|
||||||
|
Subject: [PATCH] arm64: dts: qcom: ipq5018: Add QUP1-UART2 node
|
||||||
|
Date: Sun, 06 Oct 2024 16:34:11 +0400
|
||||||
|
|
||||||
|
Add QUP1-UART2 node.
|
||||||
|
|
||||||
|
Signed-off-by: George Moussalem <george.moussalem@outlook.com>
|
||||||
|
---
|
||||||
|
--- a/arch/arm64/boot/dts/qcom/ipq5018.dtsi
|
||||||
|
+++ b/arch/arm64/boot/dts/qcom/ipq5018.dtsi
|
||||||
|
@@ -418,6 +418,16 @@
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
|
+ blsp1_uart2: serial@78b0000 {
|
||||||
|
+ compatible = "qcom,msm-uartdm-v1.4", "qcom,msm-uartdm";
|
||||||
|
+ reg = <0x078b0000 0x200>;
|
||||||
|
+ interrupts = <GIC_SPI 108 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
+ clocks = <&gcc GCC_BLSP1_UART2_APPS_CLK>,
|
||||||
|
+ <&gcc GCC_BLSP1_AHB_CLK>;
|
||||||
|
+ clock-names = "core", "iface";
|
||||||
|
+ status = "disabled";
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
blsp1_spi1: spi@78b5000 {
|
||||||
|
compatible = "qcom,spi-qup-v2.2.1";
|
||||||
|
#address-cells = <1>;
|
@ -0,0 +1,32 @@
|
|||||||
|
From: George Moussalem <george.moussalem@outlook.com>
|
||||||
|
Subject: [PATCH] arm64: dts: qcom: ipq5018: Add QUP3 I2C node
|
||||||
|
Date: Sun, 06 Oct 2024 16:34:11 +0400
|
||||||
|
|
||||||
|
Add QUP3-I2C node.
|
||||||
|
|
||||||
|
Signed-off-by: George Moussalem <george.moussalem@outlook.com>
|
||||||
|
---
|
||||||
|
--- a/arch/arm64/boot/dts/qcom/ipq5018.dtsi
|
||||||
|
+++ b/arch/arm64/boot/dts/qcom/ipq5018.dtsi
|
||||||
|
@@ -442,6 +442,21 @@
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
|
+ blsp1_i2c3: i2c@78b7000 {
|
||||||
|
+ compatible = "qcom,i2c-qup-v2.2.1";
|
||||||
|
+ #address-cells = <1>;
|
||||||
|
+ #size-cells = <0>;
|
||||||
|
+ reg = <0x078b7000 0x600>;
|
||||||
|
+ interrupts = <GIC_SPI 97 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
+ clocks = <&gcc GCC_BLSP1_QUP3_I2C_APPS_CLK>,
|
||||||
|
+ <&gcc GCC_BLSP1_AHB_CLK>;
|
||||||
|
+ clock-names = "core", "iface";
|
||||||
|
+ clock-frequency = <400000>;
|
||||||
|
+ dmas = <&blsp_dma 9>, <&blsp_dma 8>;
|
||||||
|
+ dma-names = "tx", "rx";
|
||||||
|
+ status = "disabled";
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
usb: usb@8af8800 {
|
||||||
|
compatible = "qcom,ipq5018-dwc3", "qcom,dwc3";
|
||||||
|
reg = <0x08af8800 0x400>;
|
@ -0,0 +1,42 @@
|
|||||||
|
From 8d8b37d3af2bdccf0a37d2017d876bfc6ce42552 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Chukun Pan <amadeus@jmu.edu.cn>
|
||||||
|
Date: Fri, 20 Oct 2023 23:18:21 +0800
|
||||||
|
Subject: [PATCH 1/1] mtd: rawnand: add support for TH58NYG3S0HBAI4 NAND flash
|
||||||
|
|
||||||
|
The Toshiba TH58NYG3S0HBAI4 is detected with 128 byte OOB while the flash
|
||||||
|
has 256 bytes OOB. Since it is not an ONFI compliant NAND, the model name
|
||||||
|
cannot be read from anywhere, add a static NAND ID entry to correct this.
|
||||||
|
|
||||||
|
However, the NAND ID of this flash is inconsistent with the datasheet.
|
||||||
|
The actual NAND ID is only 4 ID bytes, the last ID byte is missing.
|
||||||
|
|
||||||
|
Datasheet available at (the ID table is on page 50):
|
||||||
|
https://europe.kioxia.com/content/dam/kioxia/newidr/productinfo/datasheet/201910/DST_TH58NYG3S0HBAI4-TDE_EN_31565.pdf
|
||||||
|
|
||||||
|
Datasheet NAND ID: {0x98, 0xa3, 0x91, 0x26, 0x76}
|
||||||
|
Actual NAND ID: {0x98, 0xa3, 0x91, 0x26}
|
||||||
|
|
||||||
|
It seems that this flash may be counterfeit, but another Toshiba flash
|
||||||
|
also has the same problem. Maybe the driver has a bug, or some Toshiba
|
||||||
|
nand flash is like this. Anyway, add a static NAND ID entry with only
|
||||||
|
4 ID bytes as a hack to make sure it works.
|
||||||
|
|
||||||
|
Tested on Arcadyan AW1000 flashed with OpenWrt.
|
||||||
|
|
||||||
|
Signed-off-by: Chukun Pan <amadeus@jmu.edu.cn>
|
||||||
|
---
|
||||||
|
drivers/mtd/nand/raw/nand_ids.c | 3 +++
|
||||||
|
1 file changed, 3 insertions(+)
|
||||||
|
|
||||||
|
--- a/drivers/mtd/nand/raw/nand_ids.c
|
||||||
|
+++ b/drivers/mtd/nand/raw/nand_ids.c
|
||||||
|
@@ -58,6 +58,9 @@ struct nand_flash_dev nand_flash_ids[] =
|
||||||
|
{ .id = {0xad, 0xde, 0x14, 0xa7, 0x42, 0x4a} },
|
||||||
|
SZ_16K, SZ_8K, SZ_4M, NAND_NEED_SCRAMBLING, 6, 1664,
|
||||||
|
NAND_ECC_INFO(40, SZ_1K) },
|
||||||
|
+ {"TH58NYG3S0HBAI4 8G 1.8V 8-bit", /* Last ID bytes missing */
|
||||||
|
+ { .id = {0x98, 0xa3, 0x91, 0x26} },
|
||||||
|
+ SZ_4K, SZ_1K, SZ_256K, 0, 4, 256, NAND_ECC_INFO(8, SZ_512) },
|
||||||
|
{"TH58NVG2S3HBAI4 4G 3.3V 8-bit",
|
||||||
|
{ .id = {0x98, 0xdc, 0x91, 0x15, 0x76} },
|
||||||
|
SZ_2K, SZ_512, SZ_128K, 0, 5, 128, NAND_ECC_INFO(8, SZ_512) },
|
@ -0,0 +1,100 @@
|
|||||||
|
From: Md Sadre Alam <quic_mdalam@quicinc.com>
|
||||||
|
Date: Sun, 22 Sep 2024 17:03:44 +0530
|
||||||
|
Subject: [PATCH] spi: dt-bindings: Introduce qcom,spi-qpic-snand
|
||||||
|
|
||||||
|
Document the QPIC-SPI-NAND flash controller present in the IPQ SoCs.
|
||||||
|
It can work both in serial and parallel mode and supports typical
|
||||||
|
SPI-NAND page cache operations.
|
||||||
|
|
||||||
|
Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
|
||||||
|
Signed-off-by: Md Sadre Alam <quic_mdalam@quicinc.com>
|
||||||
|
---
|
||||||
|
diff --git a/Documentation/devicetree/bindings/spi/qcom,spi-qpic-snand.yaml b/Documentation/devicetree/bindings/spi/qcom,spi-qpic-snand.yaml
|
||||||
|
new file mode 100644
|
||||||
|
index 000000000000..f0d9f7643849
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/Documentation/devicetree/bindings/spi/qcom,spi-qpic-snand.yaml
|
||||||
|
@@ -0,0 +1,83 @@
|
||||||
|
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||||
|
+%YAML 1.2
|
||||||
|
+---
|
||||||
|
+$id: http://devicetree.org/schemas/spi/qcom,spi-qpic-snand.yaml#
|
||||||
|
+$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
|
+
|
||||||
|
+title: Qualcomm QPIC NAND controller
|
||||||
|
+
|
||||||
|
+maintainers:
|
||||||
|
+ - Md sadre Alam <quic_mdalam@quicinc.com>
|
||||||
|
+
|
||||||
|
+description:
|
||||||
|
+ The QCOM QPIC-SPI-NAND flash controller is an extended version of
|
||||||
|
+ the QCOM QPIC NAND flash controller. It can work both in serial
|
||||||
|
+ and parallel mode. It supports typical SPI-NAND page cache
|
||||||
|
+ operations in single, dual or quad IO mode with pipelined ECC
|
||||||
|
+ encoding/decoding using the QPIC ECC HW engine.
|
||||||
|
+
|
||||||
|
+allOf:
|
||||||
|
+ - $ref: /schemas/spi/spi-controller.yaml#
|
||||||
|
+
|
||||||
|
+properties:
|
||||||
|
+ compatible:
|
||||||
|
+ enum:
|
||||||
|
+ - qcom,spi-qpic-snand
|
||||||
|
+
|
||||||
|
+ reg:
|
||||||
|
+ maxItems: 1
|
||||||
|
+
|
||||||
|
+ clocks:
|
||||||
|
+ maxItems: 3
|
||||||
|
+
|
||||||
|
+ clock-names:
|
||||||
|
+ items:
|
||||||
|
+ - const: core
|
||||||
|
+ - const: aon
|
||||||
|
+ - const: iom
|
||||||
|
+
|
||||||
|
+ dmas:
|
||||||
|
+ items:
|
||||||
|
+ - description: tx DMA channel
|
||||||
|
+ - description: rx DMA channel
|
||||||
|
+ - description: cmd DMA channel
|
||||||
|
+
|
||||||
|
+ dma-names:
|
||||||
|
+ items:
|
||||||
|
+ - const: tx
|
||||||
|
+ - const: rx
|
||||||
|
+ - const: cmd
|
||||||
|
+
|
||||||
|
+required:
|
||||||
|
+ - compatible
|
||||||
|
+ - reg
|
||||||
|
+ - clocks
|
||||||
|
+ - clock-names
|
||||||
|
+
|
||||||
|
+unevaluatedProperties: false
|
||||||
|
+
|
||||||
|
+examples:
|
||||||
|
+ - |
|
||||||
|
+ #include <dt-bindings/clock/qcom,ipq9574-gcc.h>
|
||||||
|
+ spi@79b0000 {
|
||||||
|
+ compatible = "qcom,spi-qpic-snand";
|
||||||
|
+ reg = <0x1ac00000 0x800>;
|
||||||
|
+
|
||||||
|
+ clocks = <&gcc GCC_QPIC_CLK>,
|
||||||
|
+ <&gcc GCC_QPIC_AHB_CLK>,
|
||||||
|
+ <&gcc GCC_QPIC_IO_MACRO_CLK>;
|
||||||
|
+ clock-names = "core", "aon", "iom";
|
||||||
|
+
|
||||||
|
+ #address-cells = <1>;
|
||||||
|
+ #size-cells = <0>;
|
||||||
|
+
|
||||||
|
+ flash@0 {
|
||||||
|
+ compatible = "spi-nand";
|
||||||
|
+ reg = <0>;
|
||||||
|
+ #address-cells = <1>;
|
||||||
|
+ #size-cells = <1>;
|
||||||
|
+ nand-ecc-engine = <&qpic_nand>;
|
||||||
|
+ nand-ecc-strength = <4>;
|
||||||
|
+ nand-ecc-step-size = <512>;
|
||||||
|
+ };
|
||||||
|
+ };
|
@ -0,0 +1,983 @@
|
|||||||
|
From: Md Sadre Alam <quic_mdalam@quicinc.com>
|
||||||
|
Date: Sun, 22 Sep 2024 17:03:45 +0530
|
||||||
|
Subject: [PATCH] mtd: rawnand: qcom: cleanup qcom_nandc driver
|
||||||
|
|
||||||
|
cleanup qcom_nandc driver as below
|
||||||
|
|
||||||
|
- Remove register value indirection api
|
||||||
|
|
||||||
|
- Remove set_reg() api
|
||||||
|
|
||||||
|
- Convert read_loc_first & read_loc_last macro to function
|
||||||
|
|
||||||
|
- Renamed multiple variables
|
||||||
|
|
||||||
|
Signed-off-by: Md Sadre Alam <quic_mdalam@quicinc.com>
|
||||||
|
---
|
||||||
|
diff --git a/drivers/mtd/nand/raw/qcom_nandc.c b/drivers/mtd/nand/raw/qcom_nandc.c
|
||||||
|
index b8cff9240b28..d134329330fe 100644
|
||||||
|
--- a/drivers/mtd/nand/raw/qcom_nandc.c
|
||||||
|
+++ b/drivers/mtd/nand/raw/qcom_nandc.c
|
||||||
|
@@ -189,17 +189,6 @@
|
||||||
|
#define ECC_BCH_4BIT BIT(2)
|
||||||
|
#define ECC_BCH_8BIT BIT(3)
|
||||||
|
|
||||||
|
-#define nandc_set_read_loc_first(chip, reg, cw_offset, read_size, is_last_read_loc) \
|
||||||
|
-nandc_set_reg(chip, reg, \
|
||||||
|
- ((cw_offset) << READ_LOCATION_OFFSET) | \
|
||||||
|
- ((read_size) << READ_LOCATION_SIZE) | \
|
||||||
|
- ((is_last_read_loc) << READ_LOCATION_LAST))
|
||||||
|
-
|
||||||
|
-#define nandc_set_read_loc_last(chip, reg, cw_offset, read_size, is_last_read_loc) \
|
||||||
|
-nandc_set_reg(chip, reg, \
|
||||||
|
- ((cw_offset) << READ_LOCATION_OFFSET) | \
|
||||||
|
- ((read_size) << READ_LOCATION_SIZE) | \
|
||||||
|
- ((is_last_read_loc) << READ_LOCATION_LAST))
|
||||||
|
/*
|
||||||
|
* Returns the actual register address for all NAND_DEV_ registers
|
||||||
|
* (i.e. NAND_DEV_CMD0, NAND_DEV_CMD1, NAND_DEV_CMD2 and NAND_DEV_CMD_VLD)
|
||||||
|
@@ -257,8 +246,6 @@ nandc_set_reg(chip, reg, \
|
||||||
|
* @tx_sgl_start - start index in data sgl for tx.
|
||||||
|
* @rx_sgl_pos - current index in data sgl for rx.
|
||||||
|
* @rx_sgl_start - start index in data sgl for rx.
|
||||||
|
- * @wait_second_completion - wait for second DMA desc completion before making
|
||||||
|
- * the NAND transfer completion.
|
||||||
|
*/
|
||||||
|
struct bam_transaction {
|
||||||
|
struct bam_cmd_element *bam_ce;
|
||||||
|
@@ -275,7 +262,6 @@ struct bam_transaction {
|
||||||
|
u32 tx_sgl_start;
|
||||||
|
u32 rx_sgl_pos;
|
||||||
|
u32 rx_sgl_start;
|
||||||
|
- bool wait_second_completion;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
@@ -471,9 +457,9 @@ struct qcom_op {
|
||||||
|
unsigned int data_instr_idx;
|
||||||
|
unsigned int rdy_timeout_ms;
|
||||||
|
unsigned int rdy_delay_ns;
|
||||||
|
- u32 addr1_reg;
|
||||||
|
- u32 addr2_reg;
|
||||||
|
- u32 cmd_reg;
|
||||||
|
+ __le32 addr1_reg;
|
||||||
|
+ __le32 addr2_reg;
|
||||||
|
+ __le32 cmd_reg;
|
||||||
|
u8 flag;
|
||||||
|
};
|
||||||
|
|
||||||
|
@@ -549,17 +535,17 @@ struct qcom_nand_host {
|
||||||
|
* among different NAND controllers.
|
||||||
|
* @ecc_modes - ecc mode for NAND
|
||||||
|
* @dev_cmd_reg_start - NAND_DEV_CMD_* registers starting offset
|
||||||
|
- * @is_bam - whether NAND controller is using BAM
|
||||||
|
- * @is_qpic - whether NAND CTRL is part of qpic IP
|
||||||
|
- * @qpic_v2 - flag to indicate QPIC IP version 2
|
||||||
|
+ * @supports_bam - whether NAND controller is using BAM
|
||||||
|
+ * @nandc_part_of_qpic - whether NAND controller is part of qpic IP
|
||||||
|
+ * @qpic_version2 - flag to indicate QPIC IP version 2
|
||||||
|
* @use_codeword_fixup - whether NAND has different layout for boot partitions
|
||||||
|
*/
|
||||||
|
struct qcom_nandc_props {
|
||||||
|
u32 ecc_modes;
|
||||||
|
u32 dev_cmd_reg_start;
|
||||||
|
- bool is_bam;
|
||||||
|
- bool is_qpic;
|
||||||
|
- bool qpic_v2;
|
||||||
|
+ bool supports_bam;
|
||||||
|
+ bool nandc_part_of_qpic;
|
||||||
|
+ bool qpic_version2;
|
||||||
|
bool use_codeword_fixup;
|
||||||
|
};
|
||||||
|
|
||||||
|
@@ -613,19 +599,11 @@ static void clear_bam_transaction(struct qcom_nand_controller *nandc)
|
||||||
|
{
|
||||||
|
struct bam_transaction *bam_txn = nandc->bam_txn;
|
||||||
|
|
||||||
|
- if (!nandc->props->is_bam)
|
||||||
|
+ if (!nandc->props->supports_bam)
|
||||||
|
return;
|
||||||
|
|
||||||
|
- bam_txn->bam_ce_pos = 0;
|
||||||
|
- bam_txn->bam_ce_start = 0;
|
||||||
|
- bam_txn->cmd_sgl_pos = 0;
|
||||||
|
- bam_txn->cmd_sgl_start = 0;
|
||||||
|
- bam_txn->tx_sgl_pos = 0;
|
||||||
|
- bam_txn->tx_sgl_start = 0;
|
||||||
|
- bam_txn->rx_sgl_pos = 0;
|
||||||
|
- bam_txn->rx_sgl_start = 0;
|
||||||
|
+ memset(&bam_txn->bam_ce_pos, 0, sizeof(u32) * 8);
|
||||||
|
bam_txn->last_data_desc = NULL;
|
||||||
|
- bam_txn->wait_second_completion = false;
|
||||||
|
|
||||||
|
sg_init_table(bam_txn->cmd_sgl, nandc->max_cwperpage *
|
||||||
|
QPIC_PER_CW_CMD_SGL);
|
||||||
|
@@ -640,17 +618,7 @@ static void qpic_bam_dma_done(void *data)
|
||||||
|
{
|
||||||
|
struct bam_transaction *bam_txn = data;
|
||||||
|
|
||||||
|
- /*
|
||||||
|
- * In case of data transfer with NAND, 2 callbacks will be generated.
|
||||||
|
- * One for command channel and another one for data channel.
|
||||||
|
- * If current transaction has data descriptors
|
||||||
|
- * (i.e. wait_second_completion is true), then set this to false
|
||||||
|
- * and wait for second DMA descriptor completion.
|
||||||
|
- */
|
||||||
|
- if (bam_txn->wait_second_completion)
|
||||||
|
- bam_txn->wait_second_completion = false;
|
||||||
|
- else
|
||||||
|
- complete(&bam_txn->txn_done);
|
||||||
|
+ complete(&bam_txn->txn_done);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline struct qcom_nand_host *to_qcom_nand_host(struct nand_chip *chip)
|
||||||
|
@@ -676,10 +644,9 @@ static inline void nandc_write(struct qcom_nand_controller *nandc, int offset,
|
||||||
|
iowrite32(val, nandc->base + offset);
|
||||||
|
}
|
||||||
|
|
||||||
|
-static inline void nandc_read_buffer_sync(struct qcom_nand_controller *nandc,
|
||||||
|
- bool is_cpu)
|
||||||
|
+static inline void nandc_dev_to_mem(struct qcom_nand_controller *nandc, bool is_cpu)
|
||||||
|
{
|
||||||
|
- if (!nandc->props->is_bam)
|
||||||
|
+ if (!nandc->props->supports_bam)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (is_cpu)
|
||||||
|
@@ -694,93 +661,90 @@ static inline void nandc_read_buffer_sync(struct qcom_nand_controller *nandc,
|
||||||
|
DMA_FROM_DEVICE);
|
||||||
|
}
|
||||||
|
|
||||||
|
-static __le32 *offset_to_nandc_reg(struct nandc_regs *regs, int offset)
|
||||||
|
-{
|
||||||
|
- switch (offset) {
|
||||||
|
- case NAND_FLASH_CMD:
|
||||||
|
- return ®s->cmd;
|
||||||
|
- case NAND_ADDR0:
|
||||||
|
- return ®s->addr0;
|
||||||
|
- case NAND_ADDR1:
|
||||||
|
- return ®s->addr1;
|
||||||
|
- case NAND_FLASH_CHIP_SELECT:
|
||||||
|
- return ®s->chip_sel;
|
||||||
|
- case NAND_EXEC_CMD:
|
||||||
|
- return ®s->exec;
|
||||||
|
- case NAND_FLASH_STATUS:
|
||||||
|
- return ®s->clrflashstatus;
|
||||||
|
- case NAND_DEV0_CFG0:
|
||||||
|
- return ®s->cfg0;
|
||||||
|
- case NAND_DEV0_CFG1:
|
||||||
|
- return ®s->cfg1;
|
||||||
|
- case NAND_DEV0_ECC_CFG:
|
||||||
|
- return ®s->ecc_bch_cfg;
|
||||||
|
- case NAND_READ_STATUS:
|
||||||
|
- return ®s->clrreadstatus;
|
||||||
|
- case NAND_DEV_CMD1:
|
||||||
|
- return ®s->cmd1;
|
||||||
|
- case NAND_DEV_CMD1_RESTORE:
|
||||||
|
- return ®s->orig_cmd1;
|
||||||
|
- case NAND_DEV_CMD_VLD:
|
||||||
|
- return ®s->vld;
|
||||||
|
- case NAND_DEV_CMD_VLD_RESTORE:
|
||||||
|
- return ®s->orig_vld;
|
||||||
|
- case NAND_EBI2_ECC_BUF_CFG:
|
||||||
|
- return ®s->ecc_buf_cfg;
|
||||||
|
- case NAND_READ_LOCATION_0:
|
||||||
|
- return ®s->read_location0;
|
||||||
|
- case NAND_READ_LOCATION_1:
|
||||||
|
- return ®s->read_location1;
|
||||||
|
- case NAND_READ_LOCATION_2:
|
||||||
|
- return ®s->read_location2;
|
||||||
|
- case NAND_READ_LOCATION_3:
|
||||||
|
- return ®s->read_location3;
|
||||||
|
- case NAND_READ_LOCATION_LAST_CW_0:
|
||||||
|
- return ®s->read_location_last0;
|
||||||
|
- case NAND_READ_LOCATION_LAST_CW_1:
|
||||||
|
- return ®s->read_location_last1;
|
||||||
|
- case NAND_READ_LOCATION_LAST_CW_2:
|
||||||
|
- return ®s->read_location_last2;
|
||||||
|
- case NAND_READ_LOCATION_LAST_CW_3:
|
||||||
|
- return ®s->read_location_last3;
|
||||||
|
- default:
|
||||||
|
- return NULL;
|
||||||
|
- }
|
||||||
|
+/* Helper to check the code word, whether it is last cw or not */
|
||||||
|
+static bool qcom_nandc_is_last_cw(struct nand_ecc_ctrl *ecc, int cw)
|
||||||
|
+{
|
||||||
|
+ return cw == (ecc->steps - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
-static void nandc_set_reg(struct nand_chip *chip, int offset,
|
||||||
|
- u32 val)
|
||||||
|
+/**
|
||||||
|
+ * nandc_set_read_loc_first() - to set read location first register
|
||||||
|
+ * @chip: NAND Private Flash Chip Data
|
||||||
|
+ * @reg_base: location register base
|
||||||
|
+ * @cw_offset: code word offset
|
||||||
|
+ * @read_size: code word read length
|
||||||
|
+ * @is_last_read_loc: is this the last read location
|
||||||
|
+ *
|
||||||
|
+ * This function will set location register value
|
||||||
|
+ */
|
||||||
|
+static void nandc_set_read_loc_first(struct nand_chip *chip,
|
||||||
|
+ int reg_base, u32 cw_offset,
|
||||||
|
+ u32 read_size, u32 is_last_read_loc)
|
||||||
|
{
|
||||||
|
struct qcom_nand_controller *nandc = get_qcom_nand_controller(chip);
|
||||||
|
- struct nandc_regs *regs = nandc->regs;
|
||||||
|
- __le32 *reg;
|
||||||
|
-
|
||||||
|
- reg = offset_to_nandc_reg(regs, offset);
|
||||||
|
+ __le32 locreg_val;
|
||||||
|
+ u32 val = (((cw_offset) << READ_LOCATION_OFFSET) |
|
||||||
|
+ ((read_size) << READ_LOCATION_SIZE) |
|
||||||
|
+ ((is_last_read_loc) << READ_LOCATION_LAST));
|
||||||
|
+
|
||||||
|
+ locreg_val = cpu_to_le32(val);
|
||||||
|
+
|
||||||
|
+ if (reg_base == NAND_READ_LOCATION_0)
|
||||||
|
+ nandc->regs->read_location0 = locreg_val;
|
||||||
|
+ else if (reg_base == NAND_READ_LOCATION_1)
|
||||||
|
+ nandc->regs->read_location1 = locreg_val;
|
||||||
|
+ else if (reg_base == NAND_READ_LOCATION_2)
|
||||||
|
+ nandc->regs->read_location2 = locreg_val;
|
||||||
|
+ else if (reg_base == NAND_READ_LOCATION_3)
|
||||||
|
+ nandc->regs->read_location3 = locreg_val;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
+ * nandc_set_read_loc_last - to set read location last register
|
||||||
|
+ * @chip: NAND Private Flash Chip Data
|
||||||
|
+ * @reg_base: location register base
|
||||||
|
+ * @cw_offset: code word offset
|
||||||
|
+ * @read_size: code word read length
|
||||||
|
+ * @is_last_read_loc: is this the last read location
|
||||||
|
+ *
|
||||||
|
+ * This function will set location last register value
|
||||||
|
+ */
|
||||||
|
+static void nandc_set_read_loc_last(struct nand_chip *chip,
|
||||||
|
+ int reg_base, u32 cw_offset,
|
||||||
|
+ u32 read_size, u32 is_last_read_loc)
|
||||||
|
+{
|
||||||
|
+ struct qcom_nand_controller *nandc = get_qcom_nand_controller(chip);
|
||||||
|
+ __le32 locreg_val;
|
||||||
|
+ u32 val = (((cw_offset) << READ_LOCATION_OFFSET) |
|
||||||
|
+ ((read_size) << READ_LOCATION_SIZE) |
|
||||||
|
+ ((is_last_read_loc) << READ_LOCATION_LAST));
|
||||||
|
|
||||||
|
- if (reg)
|
||||||
|
- *reg = cpu_to_le32(val);
|
||||||
|
-}
|
||||||
|
+ locreg_val = cpu_to_le32(val);
|
||||||
|
|
||||||
|
-/* Helper to check the code word, whether it is last cw or not */
|
||||||
|
-static bool qcom_nandc_is_last_cw(struct nand_ecc_ctrl *ecc, int cw)
|
||||||
|
-{
|
||||||
|
- return cw == (ecc->steps - 1);
|
||||||
|
+ if (reg_base == NAND_READ_LOCATION_LAST_CW_0)
|
||||||
|
+ nandc->regs->read_location_last0 = locreg_val;
|
||||||
|
+ else if (reg_base == NAND_READ_LOCATION_LAST_CW_1)
|
||||||
|
+ nandc->regs->read_location_last1 = locreg_val;
|
||||||
|
+ else if (reg_base == NAND_READ_LOCATION_LAST_CW_2)
|
||||||
|
+ nandc->regs->read_location_last2 = locreg_val;
|
||||||
|
+ else if (reg_base == NAND_READ_LOCATION_LAST_CW_3)
|
||||||
|
+ nandc->regs->read_location_last3 = locreg_val;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* helper to configure location register values */
|
||||||
|
static void nandc_set_read_loc(struct nand_chip *chip, int cw, int reg,
|
||||||
|
- int cw_offset, int read_size, int is_last_read_loc)
|
||||||
|
+ u32 cw_offset, u32 read_size, u32 is_last_read_loc)
|
||||||
|
{
|
||||||
|
struct qcom_nand_controller *nandc = get_qcom_nand_controller(chip);
|
||||||
|
struct nand_ecc_ctrl *ecc = &chip->ecc;
|
||||||
|
int reg_base = NAND_READ_LOCATION_0;
|
||||||
|
|
||||||
|
- if (nandc->props->qpic_v2 && qcom_nandc_is_last_cw(ecc, cw))
|
||||||
|
+ if (nandc->props->qpic_version2 && qcom_nandc_is_last_cw(ecc, cw))
|
||||||
|
reg_base = NAND_READ_LOCATION_LAST_CW_0;
|
||||||
|
|
||||||
|
reg_base += reg * 4;
|
||||||
|
|
||||||
|
- if (nandc->props->qpic_v2 && qcom_nandc_is_last_cw(ecc, cw))
|
||||||
|
+ if (nandc->props->qpic_version2 && qcom_nandc_is_last_cw(ecc, cw))
|
||||||
|
return nandc_set_read_loc_last(chip, reg_base, cw_offset,
|
||||||
|
read_size, is_last_read_loc);
|
||||||
|
else
|
||||||
|
@@ -792,12 +756,13 @@ static void nandc_set_read_loc(struct nand_chip *chip, int cw, int reg,
|
||||||
|
static void set_address(struct qcom_nand_host *host, u16 column, int page)
|
||||||
|
{
|
||||||
|
struct nand_chip *chip = &host->chip;
|
||||||
|
+ struct qcom_nand_controller *nandc = get_qcom_nand_controller(chip);
|
||||||
|
|
||||||
|
if (chip->options & NAND_BUSWIDTH_16)
|
||||||
|
column >>= 1;
|
||||||
|
|
||||||
|
- nandc_set_reg(chip, NAND_ADDR0, page << 16 | column);
|
||||||
|
- nandc_set_reg(chip, NAND_ADDR1, page >> 16 & 0xff);
|
||||||
|
+ nandc->regs->addr0 = cpu_to_le32(page << 16 | column);
|
||||||
|
+ nandc->regs->addr1 = cpu_to_le32(page >> 16 & 0xff);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
@@ -811,41 +776,43 @@ static void set_address(struct qcom_nand_host *host, u16 column, int page)
|
||||||
|
static void update_rw_regs(struct qcom_nand_host *host, int num_cw, bool read, int cw)
|
||||||
|
{
|
||||||
|
struct nand_chip *chip = &host->chip;
|
||||||
|
- u32 cmd, cfg0, cfg1, ecc_bch_cfg;
|
||||||
|
+ __le32 cmd, cfg0, cfg1, ecc_bch_cfg;
|
||||||
|
struct qcom_nand_controller *nandc = get_qcom_nand_controller(chip);
|
||||||
|
|
||||||
|
if (read) {
|
||||||
|
if (host->use_ecc)
|
||||||
|
- cmd = OP_PAGE_READ_WITH_ECC | PAGE_ACC | LAST_PAGE;
|
||||||
|
+ cmd = cpu_to_le32(OP_PAGE_READ_WITH_ECC | PAGE_ACC | LAST_PAGE);
|
||||||
|
else
|
||||||
|
- cmd = OP_PAGE_READ | PAGE_ACC | LAST_PAGE;
|
||||||
|
+ cmd = cpu_to_le32(OP_PAGE_READ | PAGE_ACC | LAST_PAGE);
|
||||||
|
} else {
|
||||||
|
- cmd = OP_PROGRAM_PAGE | PAGE_ACC | LAST_PAGE;
|
||||||
|
+ cmd = cpu_to_le32(OP_PROGRAM_PAGE | PAGE_ACC | LAST_PAGE);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (host->use_ecc) {
|
||||||
|
- cfg0 = (host->cfg0 & ~(7U << CW_PER_PAGE)) |
|
||||||
|
- (num_cw - 1) << CW_PER_PAGE;
|
||||||
|
+ cfg0 = cpu_to_le32((host->cfg0 & ~(7U << CW_PER_PAGE)) |
|
||||||
|
+ (num_cw - 1) << CW_PER_PAGE);
|
||||||
|
|
||||||
|
- cfg1 = host->cfg1;
|
||||||
|
- ecc_bch_cfg = host->ecc_bch_cfg;
|
||||||
|
+ cfg1 = cpu_to_le32(host->cfg1);
|
||||||
|
+ ecc_bch_cfg = cpu_to_le32(host->ecc_bch_cfg);
|
||||||
|
} else {
|
||||||
|
- cfg0 = (host->cfg0_raw & ~(7U << CW_PER_PAGE)) |
|
||||||
|
- (num_cw - 1) << CW_PER_PAGE;
|
||||||
|
+ cfg0 = cpu_to_le32((host->cfg0_raw & ~(7U << CW_PER_PAGE)) |
|
||||||
|
+ (num_cw - 1) << CW_PER_PAGE);
|
||||||
|
|
||||||
|
- cfg1 = host->cfg1_raw;
|
||||||
|
- ecc_bch_cfg = 1 << ECC_CFG_ECC_DISABLE;
|
||||||
|
+ cfg1 = cpu_to_le32(host->cfg1_raw);
|
||||||
|
+ ecc_bch_cfg = cpu_to_le32(1 << ECC_CFG_ECC_DISABLE);
|
||||||
|
}
|
||||||
|
|
||||||
|
- nandc_set_reg(chip, NAND_FLASH_CMD, cmd);
|
||||||
|
- nandc_set_reg(chip, NAND_DEV0_CFG0, cfg0);
|
||||||
|
- nandc_set_reg(chip, NAND_DEV0_CFG1, cfg1);
|
||||||
|
- nandc_set_reg(chip, NAND_DEV0_ECC_CFG, ecc_bch_cfg);
|
||||||
|
- if (!nandc->props->qpic_v2)
|
||||||
|
- nandc_set_reg(chip, NAND_EBI2_ECC_BUF_CFG, host->ecc_buf_cfg);
|
||||||
|
- nandc_set_reg(chip, NAND_FLASH_STATUS, host->clrflashstatus);
|
||||||
|
- nandc_set_reg(chip, NAND_READ_STATUS, host->clrreadstatus);
|
||||||
|
- nandc_set_reg(chip, NAND_EXEC_CMD, 1);
|
||||||
|
+ nandc->regs->cmd = cmd;
|
||||||
|
+ nandc->regs->cfg0 = cfg0;
|
||||||
|
+ nandc->regs->cfg1 = cfg1;
|
||||||
|
+ nandc->regs->ecc_bch_cfg = ecc_bch_cfg;
|
||||||
|
+
|
||||||
|
+ if (!nandc->props->qpic_version2)
|
||||||
|
+ nandc->regs->ecc_buf_cfg = cpu_to_le32(host->ecc_buf_cfg);
|
||||||
|
+
|
||||||
|
+ nandc->regs->clrflashstatus = cpu_to_le32(host->clrflashstatus);
|
||||||
|
+ nandc->regs->clrreadstatus = cpu_to_le32(host->clrreadstatus);
|
||||||
|
+ nandc->regs->exec = cpu_to_le32(1);
|
||||||
|
|
||||||
|
if (read)
|
||||||
|
nandc_set_read_loc(chip, cw, 0, 0, host->use_ecc ?
|
||||||
|
@@ -1121,7 +1088,7 @@ static int read_reg_dma(struct qcom_nand_controller *nandc, int first,
|
||||||
|
if (first == NAND_DEV_CMD_VLD || first == NAND_DEV_CMD1)
|
||||||
|
first = dev_cmd_reg_addr(nandc, first);
|
||||||
|
|
||||||
|
- if (nandc->props->is_bam)
|
||||||
|
+ if (nandc->props->supports_bam)
|
||||||
|
return prep_bam_dma_desc_cmd(nandc, true, first, vaddr,
|
||||||
|
num_regs, flags);
|
||||||
|
|
||||||
|
@@ -1136,25 +1103,16 @@ static int read_reg_dma(struct qcom_nand_controller *nandc, int first,
|
||||||
|
* write_reg_dma: prepares a descriptor to write a given number of
|
||||||
|
* contiguous registers
|
||||||
|
*
|
||||||
|
+ * @vaddr: contnigeous memory from where register value will
|
||||||
|
+ * be written
|
||||||
|
* @first: offset of the first register in the contiguous block
|
||||||
|
* @num_regs: number of registers to write
|
||||||
|
* @flags: flags to control DMA descriptor preparation
|
||||||
|
*/
|
||||||
|
-static int write_reg_dma(struct qcom_nand_controller *nandc, int first,
|
||||||
|
- int num_regs, unsigned int flags)
|
||||||
|
+static int write_reg_dma(struct qcom_nand_controller *nandc, __le32 *vaddr,
|
||||||
|
+ int first, int num_regs, unsigned int flags)
|
||||||
|
{
|
||||||
|
bool flow_control = false;
|
||||||
|
- struct nandc_regs *regs = nandc->regs;
|
||||||
|
- void *vaddr;
|
||||||
|
-
|
||||||
|
- vaddr = offset_to_nandc_reg(regs, first);
|
||||||
|
-
|
||||||
|
- if (first == NAND_ERASED_CW_DETECT_CFG) {
|
||||||
|
- if (flags & NAND_ERASED_CW_SET)
|
||||||
|
- vaddr = ®s->erased_cw_detect_cfg_set;
|
||||||
|
- else
|
||||||
|
- vaddr = ®s->erased_cw_detect_cfg_clr;
|
||||||
|
- }
|
||||||
|
|
||||||
|
if (first == NAND_EXEC_CMD)
|
||||||
|
flags |= NAND_BAM_NWD;
|
||||||
|
@@ -1165,7 +1123,7 @@ static int write_reg_dma(struct qcom_nand_controller *nandc, int first,
|
||||||
|
if (first == NAND_DEV_CMD_VLD_RESTORE || first == NAND_DEV_CMD_VLD)
|
||||||
|
first = dev_cmd_reg_addr(nandc, NAND_DEV_CMD_VLD);
|
||||||
|
|
||||||
|
- if (nandc->props->is_bam)
|
||||||
|
+ if (nandc->props->supports_bam)
|
||||||
|
return prep_bam_dma_desc_cmd(nandc, false, first, vaddr,
|
||||||
|
num_regs, flags);
|
||||||
|
|
||||||
|
@@ -1188,7 +1146,7 @@ static int write_reg_dma(struct qcom_nand_controller *nandc, int first,
|
||||||
|
static int read_data_dma(struct qcom_nand_controller *nandc, int reg_off,
|
||||||
|
const u8 *vaddr, int size, unsigned int flags)
|
||||||
|
{
|
||||||
|
- if (nandc->props->is_bam)
|
||||||
|
+ if (nandc->props->supports_bam)
|
||||||
|
return prep_bam_dma_desc_data(nandc, true, vaddr, size, flags);
|
||||||
|
|
||||||
|
return prep_adm_dma_desc(nandc, true, reg_off, vaddr, size, false);
|
||||||
|
@@ -1206,7 +1164,7 @@ static int read_data_dma(struct qcom_nand_controller *nandc, int reg_off,
|
||||||
|
static int write_data_dma(struct qcom_nand_controller *nandc, int reg_off,
|
||||||
|
const u8 *vaddr, int size, unsigned int flags)
|
||||||
|
{
|
||||||
|
- if (nandc->props->is_bam)
|
||||||
|
+ if (nandc->props->supports_bam)
|
||||||
|
return prep_bam_dma_desc_data(nandc, false, vaddr, size, flags);
|
||||||
|
|
||||||
|
return prep_adm_dma_desc(nandc, false, reg_off, vaddr, size, false);
|
||||||
|
@@ -1220,13 +1178,14 @@ static void config_nand_page_read(struct nand_chip *chip)
|
||||||
|
{
|
||||||
|
struct qcom_nand_controller *nandc = get_qcom_nand_controller(chip);
|
||||||
|
|
||||||
|
- write_reg_dma(nandc, NAND_ADDR0, 2, 0);
|
||||||
|
- write_reg_dma(nandc, NAND_DEV0_CFG0, 3, 0);
|
||||||
|
- if (!nandc->props->qpic_v2)
|
||||||
|
- write_reg_dma(nandc, NAND_EBI2_ECC_BUF_CFG, 1, 0);
|
||||||
|
- write_reg_dma(nandc, NAND_ERASED_CW_DETECT_CFG, 1, 0);
|
||||||
|
- write_reg_dma(nandc, NAND_ERASED_CW_DETECT_CFG, 1,
|
||||||
|
- NAND_ERASED_CW_SET | NAND_BAM_NEXT_SGL);
|
||||||
|
+ write_reg_dma(nandc, &nandc->regs->addr0, NAND_ADDR0, 2, 0);
|
||||||
|
+ write_reg_dma(nandc, &nandc->regs->cfg0, NAND_DEV0_CFG0, 3, 0);
|
||||||
|
+ if (!nandc->props->qpic_version2)
|
||||||
|
+ write_reg_dma(nandc, &nandc->regs->ecc_buf_cfg, NAND_EBI2_ECC_BUF_CFG, 1, 0);
|
||||||
|
+ write_reg_dma(nandc, &nandc->regs->erased_cw_detect_cfg_clr,
|
||||||
|
+ NAND_ERASED_CW_DETECT_CFG, 1, 0);
|
||||||
|
+ write_reg_dma(nandc, &nandc->regs->erased_cw_detect_cfg_set,
|
||||||
|
+ NAND_ERASED_CW_DETECT_CFG, 1, NAND_ERASED_CW_SET | NAND_BAM_NEXT_SGL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
@@ -1239,16 +1198,16 @@ config_nand_cw_read(struct nand_chip *chip, bool use_ecc, int cw)
|
||||||
|
struct qcom_nand_controller *nandc = get_qcom_nand_controller(chip);
|
||||||
|
struct nand_ecc_ctrl *ecc = &chip->ecc;
|
||||||
|
|
||||||
|
- int reg = NAND_READ_LOCATION_0;
|
||||||
|
+ __le32 *reg = &nandc->regs->read_location0;
|
||||||
|
|
||||||
|
- if (nandc->props->qpic_v2 && qcom_nandc_is_last_cw(ecc, cw))
|
||||||
|
- reg = NAND_READ_LOCATION_LAST_CW_0;
|
||||||
|
+ if (nandc->props->qpic_version2 && qcom_nandc_is_last_cw(ecc, cw))
|
||||||
|
+ reg = &nandc->regs->read_location_last0;
|
||||||
|
|
||||||
|
- if (nandc->props->is_bam)
|
||||||
|
- write_reg_dma(nandc, reg, 4, NAND_BAM_NEXT_SGL);
|
||||||
|
+ if (nandc->props->supports_bam)
|
||||||
|
+ write_reg_dma(nandc, reg, NAND_READ_LOCATION_0, 4, NAND_BAM_NEXT_SGL);
|
||||||
|
|
||||||
|
- write_reg_dma(nandc, NAND_FLASH_CMD, 1, NAND_BAM_NEXT_SGL);
|
||||||
|
- write_reg_dma(nandc, NAND_EXEC_CMD, 1, NAND_BAM_NEXT_SGL);
|
||||||
|
+ write_reg_dma(nandc, &nandc->regs->cmd, NAND_FLASH_CMD, 1, NAND_BAM_NEXT_SGL);
|
||||||
|
+ write_reg_dma(nandc, &nandc->regs->exec, NAND_EXEC_CMD, 1, NAND_BAM_NEXT_SGL);
|
||||||
|
|
||||||
|
if (use_ecc) {
|
||||||
|
read_reg_dma(nandc, NAND_FLASH_STATUS, 2, 0);
|
||||||
|
@@ -1279,10 +1238,10 @@ static void config_nand_page_write(struct nand_chip *chip)
|
||||||
|
{
|
||||||
|
struct qcom_nand_controller *nandc = get_qcom_nand_controller(chip);
|
||||||
|
|
||||||
|
- write_reg_dma(nandc, NAND_ADDR0, 2, 0);
|
||||||
|
- write_reg_dma(nandc, NAND_DEV0_CFG0, 3, 0);
|
||||||
|
- if (!nandc->props->qpic_v2)
|
||||||
|
- write_reg_dma(nandc, NAND_EBI2_ECC_BUF_CFG, 1,
|
||||||
|
+ write_reg_dma(nandc, &nandc->regs->addr0, NAND_ADDR0, 2, 0);
|
||||||
|
+ write_reg_dma(nandc, &nandc->regs->cfg0, NAND_DEV0_CFG0, 3, 0);
|
||||||
|
+ if (!nandc->props->qpic_version2)
|
||||||
|
+ write_reg_dma(nandc, &nandc->regs->ecc_buf_cfg, NAND_EBI2_ECC_BUF_CFG, 1,
|
||||||
|
NAND_BAM_NEXT_SGL);
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -1294,13 +1253,13 @@ static void config_nand_cw_write(struct nand_chip *chip)
|
||||||
|
{
|
||||||
|
struct qcom_nand_controller *nandc = get_qcom_nand_controller(chip);
|
||||||
|
|
||||||
|
- write_reg_dma(nandc, NAND_FLASH_CMD, 1, NAND_BAM_NEXT_SGL);
|
||||||
|
- write_reg_dma(nandc, NAND_EXEC_CMD, 1, NAND_BAM_NEXT_SGL);
|
||||||
|
+ write_reg_dma(nandc, &nandc->regs->cmd, NAND_FLASH_CMD, 1, NAND_BAM_NEXT_SGL);
|
||||||
|
+ write_reg_dma(nandc, &nandc->regs->exec, NAND_EXEC_CMD, 1, NAND_BAM_NEXT_SGL);
|
||||||
|
|
||||||
|
read_reg_dma(nandc, NAND_FLASH_STATUS, 1, NAND_BAM_NEXT_SGL);
|
||||||
|
|
||||||
|
- write_reg_dma(nandc, NAND_FLASH_STATUS, 1, 0);
|
||||||
|
- write_reg_dma(nandc, NAND_READ_STATUS, 1, NAND_BAM_NEXT_SGL);
|
||||||
|
+ write_reg_dma(nandc, &nandc->regs->clrflashstatus, NAND_FLASH_STATUS, 1, 0);
|
||||||
|
+ write_reg_dma(nandc, &nandc->regs->clrreadstatus, NAND_READ_STATUS, 1, NAND_BAM_NEXT_SGL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* helpers to submit/free our list of dma descriptors */
|
||||||
|
@@ -1311,7 +1270,7 @@ static int submit_descs(struct qcom_nand_controller *nandc)
|
||||||
|
struct bam_transaction *bam_txn = nandc->bam_txn;
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
- if (nandc->props->is_bam) {
|
||||||
|
+ if (nandc->props->supports_bam) {
|
||||||
|
if (bam_txn->rx_sgl_pos > bam_txn->rx_sgl_start) {
|
||||||
|
ret = prepare_bam_async_desc(nandc, nandc->rx_chan, 0);
|
||||||
|
if (ret)
|
||||||
|
@@ -1336,14 +1295,9 @@ static int submit_descs(struct qcom_nand_controller *nandc)
|
||||||
|
list_for_each_entry(desc, &nandc->desc_list, node)
|
||||||
|
cookie = dmaengine_submit(desc->dma_desc);
|
||||||
|
|
||||||
|
- if (nandc->props->is_bam) {
|
||||||
|
+ if (nandc->props->supports_bam) {
|
||||||
|
bam_txn->last_cmd_desc->callback = qpic_bam_dma_done;
|
||||||
|
bam_txn->last_cmd_desc->callback_param = bam_txn;
|
||||||
|
- if (bam_txn->last_data_desc) {
|
||||||
|
- bam_txn->last_data_desc->callback = qpic_bam_dma_done;
|
||||||
|
- bam_txn->last_data_desc->callback_param = bam_txn;
|
||||||
|
- bam_txn->wait_second_completion = true;
|
||||||
|
- }
|
||||||
|
|
||||||
|
dma_async_issue_pending(nandc->tx_chan);
|
||||||
|
dma_async_issue_pending(nandc->rx_chan);
|
||||||
|
@@ -1365,7 +1319,7 @@ static int submit_descs(struct qcom_nand_controller *nandc)
|
||||||
|
list_for_each_entry_safe(desc, n, &nandc->desc_list, node) {
|
||||||
|
list_del(&desc->node);
|
||||||
|
|
||||||
|
- if (nandc->props->is_bam)
|
||||||
|
+ if (nandc->props->supports_bam)
|
||||||
|
dma_unmap_sg(nandc->dev, desc->bam_sgl,
|
||||||
|
desc->sgl_cnt, desc->dir);
|
||||||
|
else
|
||||||
|
@@ -1382,7 +1336,7 @@ static int submit_descs(struct qcom_nand_controller *nandc)
|
||||||
|
static void clear_read_regs(struct qcom_nand_controller *nandc)
|
||||||
|
{
|
||||||
|
nandc->reg_read_pos = 0;
|
||||||
|
- nandc_read_buffer_sync(nandc, false);
|
||||||
|
+ nandc_dev_to_mem(nandc, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
@@ -1446,7 +1400,7 @@ static int check_flash_errors(struct qcom_nand_host *host, int cw_cnt)
|
||||||
|
struct qcom_nand_controller *nandc = get_qcom_nand_controller(chip);
|
||||||
|
int i;
|
||||||
|
|
||||||
|
- nandc_read_buffer_sync(nandc, true);
|
||||||
|
+ nandc_dev_to_mem(nandc, true);
|
||||||
|
|
||||||
|
for (i = 0; i < cw_cnt; i++) {
|
||||||
|
u32 flash = le32_to_cpu(nandc->reg_read_buf[i]);
|
||||||
|
@@ -1476,7 +1430,7 @@ qcom_nandc_read_cw_raw(struct mtd_info *mtd, struct nand_chip *chip,
|
||||||
|
clear_read_regs(nandc);
|
||||||
|
host->use_ecc = false;
|
||||||
|
|
||||||
|
- if (nandc->props->qpic_v2)
|
||||||
|
+ if (nandc->props->qpic_version2)
|
||||||
|
raw_cw = ecc->steps - 1;
|
||||||
|
|
||||||
|
clear_bam_transaction(nandc);
|
||||||
|
@@ -1497,7 +1451,7 @@ qcom_nandc_read_cw_raw(struct mtd_info *mtd, struct nand_chip *chip,
|
||||||
|
oob_size2 = host->ecc_bytes_hw + host->spare_bytes;
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (nandc->props->is_bam) {
|
||||||
|
+ if (nandc->props->supports_bam) {
|
||||||
|
nandc_set_read_loc(chip, cw, 0, read_loc, data_size1, 0);
|
||||||
|
read_loc += data_size1;
|
||||||
|
|
||||||
|
@@ -1621,7 +1575,7 @@ static int parse_read_errors(struct qcom_nand_host *host, u8 *data_buf,
|
||||||
|
u8 *data_buf_start = data_buf, *oob_buf_start = oob_buf;
|
||||||
|
|
||||||
|
buf = (struct read_stats *)nandc->reg_read_buf;
|
||||||
|
- nandc_read_buffer_sync(nandc, true);
|
||||||
|
+ nandc_dev_to_mem(nandc, true);
|
||||||
|
|
||||||
|
for (i = 0; i < ecc->steps; i++, buf++) {
|
||||||
|
u32 flash, buffer, erased_cw;
|
||||||
|
@@ -1734,7 +1688,7 @@ static int read_page_ecc(struct qcom_nand_host *host, u8 *data_buf,
|
||||||
|
oob_size = host->ecc_bytes_hw + host->spare_bytes;
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (nandc->props->is_bam) {
|
||||||
|
+ if (nandc->props->supports_bam) {
|
||||||
|
if (data_buf && oob_buf) {
|
||||||
|
nandc_set_read_loc(chip, i, 0, 0, data_size, 0);
|
||||||
|
nandc_set_read_loc(chip, i, 1, data_size,
|
||||||
|
@@ -2455,14 +2409,14 @@ static int qcom_nand_attach_chip(struct nand_chip *chip)
|
||||||
|
|
||||||
|
mtd_set_ooblayout(mtd, &qcom_nand_ooblayout_ops);
|
||||||
|
/* Free the initially allocated BAM transaction for reading the ONFI params */
|
||||||
|
- if (nandc->props->is_bam)
|
||||||
|
+ if (nandc->props->supports_bam)
|
||||||
|
free_bam_transaction(nandc);
|
||||||
|
|
||||||
|
nandc->max_cwperpage = max_t(unsigned int, nandc->max_cwperpage,
|
||||||
|
cwperpage);
|
||||||
|
|
||||||
|
/* Now allocate the BAM transaction based on updated max_cwperpage */
|
||||||
|
- if (nandc->props->is_bam) {
|
||||||
|
+ if (nandc->props->supports_bam) {
|
||||||
|
nandc->bam_txn = alloc_bam_transaction(nandc);
|
||||||
|
if (!nandc->bam_txn) {
|
||||||
|
dev_err(nandc->dev,
|
||||||
|
@@ -2522,7 +2476,7 @@ static int qcom_nand_attach_chip(struct nand_chip *chip)
|
||||||
|
| ecc_mode << ECC_MODE
|
||||||
|
| host->ecc_bytes_hw << ECC_PARITY_SIZE_BYTES_BCH;
|
||||||
|
|
||||||
|
- if (!nandc->props->qpic_v2)
|
||||||
|
+ if (!nandc->props->qpic_version2)
|
||||||
|
host->ecc_buf_cfg = 0x203 << NUM_STEPS;
|
||||||
|
|
||||||
|
host->clrflashstatus = FS_READY_BSY_N;
|
||||||
|
@@ -2556,7 +2510,7 @@ static int qcom_op_cmd_mapping(struct nand_chip *chip, u8 opcode,
|
||||||
|
cmd = OP_FETCH_ID;
|
||||||
|
break;
|
||||||
|
case NAND_CMD_PARAM:
|
||||||
|
- if (nandc->props->qpic_v2)
|
||||||
|
+ if (nandc->props->qpic_version2)
|
||||||
|
cmd = OP_PAGE_READ_ONFI_READ;
|
||||||
|
else
|
||||||
|
cmd = OP_PAGE_READ;
|
||||||
|
@@ -2609,7 +2563,7 @@ static int qcom_parse_instructions(struct nand_chip *chip,
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
- q_op->cmd_reg = ret;
|
||||||
|
+ q_op->cmd_reg = cpu_to_le32(ret);
|
||||||
|
q_op->rdy_delay_ns = instr->delay_ns;
|
||||||
|
break;
|
||||||
|
|
||||||
|
@@ -2619,10 +2573,10 @@ static int qcom_parse_instructions(struct nand_chip *chip,
|
||||||
|
addrs = &instr->ctx.addr.addrs[offset];
|
||||||
|
|
||||||
|
for (i = 0; i < min_t(unsigned int, 4, naddrs); i++)
|
||||||
|
- q_op->addr1_reg |= addrs[i] << (i * 8);
|
||||||
|
+ q_op->addr1_reg |= cpu_to_le32(addrs[i] << (i * 8));
|
||||||
|
|
||||||
|
if (naddrs > 4)
|
||||||
|
- q_op->addr2_reg |= addrs[4];
|
||||||
|
+ q_op->addr2_reg |= cpu_to_le32(addrs[4]);
|
||||||
|
|
||||||
|
q_op->rdy_delay_ns = instr->delay_ns;
|
||||||
|
break;
|
||||||
|
@@ -2663,7 +2617,7 @@ static int qcom_wait_rdy_poll(struct nand_chip *chip, unsigned int time_ms)
|
||||||
|
unsigned long start = jiffies + msecs_to_jiffies(time_ms);
|
||||||
|
u32 flash;
|
||||||
|
|
||||||
|
- nandc_read_buffer_sync(nandc, true);
|
||||||
|
+ nandc_dev_to_mem(nandc, true);
|
||||||
|
|
||||||
|
do {
|
||||||
|
flash = le32_to_cpu(nandc->reg_read_buf[0]);
|
||||||
|
@@ -2706,11 +2660,11 @@ static int qcom_read_status_exec(struct nand_chip *chip,
|
||||||
|
clear_read_regs(nandc);
|
||||||
|
clear_bam_transaction(nandc);
|
||||||
|
|
||||||
|
- nandc_set_reg(chip, NAND_FLASH_CMD, q_op.cmd_reg);
|
||||||
|
- nandc_set_reg(chip, NAND_EXEC_CMD, 1);
|
||||||
|
+ nandc->regs->cmd = q_op.cmd_reg;
|
||||||
|
+ nandc->regs->exec = cpu_to_le32(1);
|
||||||
|
|
||||||
|
- write_reg_dma(nandc, NAND_FLASH_CMD, 1, NAND_BAM_NEXT_SGL);
|
||||||
|
- write_reg_dma(nandc, NAND_EXEC_CMD, 1, NAND_BAM_NEXT_SGL);
|
||||||
|
+ write_reg_dma(nandc, &nandc->regs->cmd, NAND_FLASH_CMD, 1, NAND_BAM_NEXT_SGL);
|
||||||
|
+ write_reg_dma(nandc, &nandc->regs->exec, NAND_EXEC_CMD, 1, NAND_BAM_NEXT_SGL);
|
||||||
|
read_reg_dma(nandc, NAND_FLASH_STATUS, 1, NAND_BAM_NEXT_SGL);
|
||||||
|
|
||||||
|
ret = submit_descs(nandc);
|
||||||
|
@@ -2719,7 +2673,7 @@ static int qcom_read_status_exec(struct nand_chip *chip,
|
||||||
|
goto err_out;
|
||||||
|
}
|
||||||
|
|
||||||
|
- nandc_read_buffer_sync(nandc, true);
|
||||||
|
+ nandc_dev_to_mem(nandc, true);
|
||||||
|
|
||||||
|
for (i = 0; i < num_cw; i++) {
|
||||||
|
flash_status = le32_to_cpu(nandc->reg_read_buf[i]);
|
||||||
|
@@ -2763,16 +2717,14 @@ static int qcom_read_id_type_exec(struct nand_chip *chip, const struct nand_subo
|
||||||
|
clear_read_regs(nandc);
|
||||||
|
clear_bam_transaction(nandc);
|
||||||
|
|
||||||
|
- nandc_set_reg(chip, NAND_FLASH_CMD, q_op.cmd_reg);
|
||||||
|
- nandc_set_reg(chip, NAND_ADDR0, q_op.addr1_reg);
|
||||||
|
- nandc_set_reg(chip, NAND_ADDR1, q_op.addr2_reg);
|
||||||
|
- nandc_set_reg(chip, NAND_FLASH_CHIP_SELECT,
|
||||||
|
- nandc->props->is_bam ? 0 : DM_EN);
|
||||||
|
-
|
||||||
|
- nandc_set_reg(chip, NAND_EXEC_CMD, 1);
|
||||||
|
+ nandc->regs->cmd = q_op.cmd_reg;
|
||||||
|
+ nandc->regs->addr0 = q_op.addr1_reg;
|
||||||
|
+ nandc->regs->addr1 = q_op.addr2_reg;
|
||||||
|
+ nandc->regs->chip_sel = cpu_to_le32(nandc->props->supports_bam ? 0 : DM_EN);
|
||||||
|
+ nandc->regs->exec = cpu_to_le32(1);
|
||||||
|
|
||||||
|
- write_reg_dma(nandc, NAND_FLASH_CMD, 4, NAND_BAM_NEXT_SGL);
|
||||||
|
- write_reg_dma(nandc, NAND_EXEC_CMD, 1, NAND_BAM_NEXT_SGL);
|
||||||
|
+ write_reg_dma(nandc, &nandc->regs->cmd, NAND_FLASH_CMD, 4, NAND_BAM_NEXT_SGL);
|
||||||
|
+ write_reg_dma(nandc, &nandc->regs->exec, NAND_EXEC_CMD, 1, NAND_BAM_NEXT_SGL);
|
||||||
|
|
||||||
|
read_reg_dma(nandc, NAND_READ_ID, 1, NAND_BAM_NEXT_SGL);
|
||||||
|
|
||||||
|
@@ -2786,7 +2738,7 @@ static int qcom_read_id_type_exec(struct nand_chip *chip, const struct nand_subo
|
||||||
|
op_id = q_op.data_instr_idx;
|
||||||
|
len = nand_subop_get_data_len(subop, op_id);
|
||||||
|
|
||||||
|
- nandc_read_buffer_sync(nandc, true);
|
||||||
|
+ nandc_dev_to_mem(nandc, true);
|
||||||
|
memcpy(instr->ctx.data.buf.in, nandc->reg_read_buf, len);
|
||||||
|
|
||||||
|
err_out:
|
||||||
|
@@ -2807,15 +2759,14 @@ static int qcom_misc_cmd_type_exec(struct nand_chip *chip, const struct nand_sub
|
||||||
|
|
||||||
|
if (q_op.flag == OP_PROGRAM_PAGE) {
|
||||||
|
goto wait_rdy;
|
||||||
|
- } else if (q_op.cmd_reg == OP_BLOCK_ERASE) {
|
||||||
|
- q_op.cmd_reg |= PAGE_ACC | LAST_PAGE;
|
||||||
|
- nandc_set_reg(chip, NAND_ADDR0, q_op.addr1_reg);
|
||||||
|
- nandc_set_reg(chip, NAND_ADDR1, q_op.addr2_reg);
|
||||||
|
- nandc_set_reg(chip, NAND_DEV0_CFG0,
|
||||||
|
- host->cfg0_raw & ~(7 << CW_PER_PAGE));
|
||||||
|
- nandc_set_reg(chip, NAND_DEV0_CFG1, host->cfg1_raw);
|
||||||
|
+ } else if (q_op.cmd_reg == cpu_to_le32(OP_BLOCK_ERASE)) {
|
||||||
|
+ q_op.cmd_reg |= cpu_to_le32(PAGE_ACC | LAST_PAGE);
|
||||||
|
+ nandc->regs->addr0 = q_op.addr1_reg;
|
||||||
|
+ nandc->regs->addr1 = q_op.addr2_reg;
|
||||||
|
+ nandc->regs->cfg0 = cpu_to_le32(host->cfg0_raw & ~(7 << CW_PER_PAGE));
|
||||||
|
+ nandc->regs->cfg1 = cpu_to_le32(host->cfg1_raw);
|
||||||
|
instrs = 3;
|
||||||
|
- } else if (q_op.cmd_reg != OP_RESET_DEVICE) {
|
||||||
|
+ } else if (q_op.cmd_reg != cpu_to_le32(OP_RESET_DEVICE)) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -2826,14 +2777,14 @@ static int qcom_misc_cmd_type_exec(struct nand_chip *chip, const struct nand_sub
|
||||||
|
clear_read_regs(nandc);
|
||||||
|
clear_bam_transaction(nandc);
|
||||||
|
|
||||||
|
- nandc_set_reg(chip, NAND_FLASH_CMD, q_op.cmd_reg);
|
||||||
|
- nandc_set_reg(chip, NAND_EXEC_CMD, 1);
|
||||||
|
+ nandc->regs->cmd = q_op.cmd_reg;
|
||||||
|
+ nandc->regs->exec = cpu_to_le32(1);
|
||||||
|
|
||||||
|
- write_reg_dma(nandc, NAND_FLASH_CMD, instrs, NAND_BAM_NEXT_SGL);
|
||||||
|
- if (q_op.cmd_reg == OP_BLOCK_ERASE)
|
||||||
|
- write_reg_dma(nandc, NAND_DEV0_CFG0, 2, NAND_BAM_NEXT_SGL);
|
||||||
|
+ write_reg_dma(nandc, &nandc->regs->cmd, NAND_FLASH_CMD, instrs, NAND_BAM_NEXT_SGL);
|
||||||
|
+ if (q_op.cmd_reg == cpu_to_le32(OP_BLOCK_ERASE))
|
||||||
|
+ write_reg_dma(nandc, &nandc->regs->cfg0, NAND_DEV0_CFG0, 2, NAND_BAM_NEXT_SGL);
|
||||||
|
|
||||||
|
- write_reg_dma(nandc, NAND_EXEC_CMD, 1, NAND_BAM_NEXT_SGL);
|
||||||
|
+ write_reg_dma(nandc, &nandc->regs->exec, NAND_EXEC_CMD, 1, NAND_BAM_NEXT_SGL);
|
||||||
|
read_reg_dma(nandc, NAND_FLASH_STATUS, 1, NAND_BAM_NEXT_SGL);
|
||||||
|
|
||||||
|
ret = submit_descs(nandc);
|
||||||
|
@@ -2864,7 +2815,7 @@ static int qcom_param_page_type_exec(struct nand_chip *chip, const struct nand_
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
- q_op.cmd_reg |= PAGE_ACC | LAST_PAGE;
|
||||||
|
+ q_op.cmd_reg |= cpu_to_le32(PAGE_ACC | LAST_PAGE);
|
||||||
|
|
||||||
|
nandc->buf_count = 0;
|
||||||
|
nandc->buf_start = 0;
|
||||||
|
@@ -2872,38 +2823,38 @@ static int qcom_param_page_type_exec(struct nand_chip *chip, const struct nand_
|
||||||
|
clear_read_regs(nandc);
|
||||||
|
clear_bam_transaction(nandc);
|
||||||
|
|
||||||
|
- nandc_set_reg(chip, NAND_FLASH_CMD, q_op.cmd_reg);
|
||||||
|
-
|
||||||
|
- nandc_set_reg(chip, NAND_ADDR0, 0);
|
||||||
|
- nandc_set_reg(chip, NAND_ADDR1, 0);
|
||||||
|
- nandc_set_reg(chip, NAND_DEV0_CFG0, 0 << CW_PER_PAGE
|
||||||
|
- | 512 << UD_SIZE_BYTES
|
||||||
|
- | 5 << NUM_ADDR_CYCLES
|
||||||
|
- | 0 << SPARE_SIZE_BYTES);
|
||||||
|
- nandc_set_reg(chip, NAND_DEV0_CFG1, 7 << NAND_RECOVERY_CYCLES
|
||||||
|
- | 0 << CS_ACTIVE_BSY
|
||||||
|
- | 17 << BAD_BLOCK_BYTE_NUM
|
||||||
|
- | 1 << BAD_BLOCK_IN_SPARE_AREA
|
||||||
|
- | 2 << WR_RD_BSY_GAP
|
||||||
|
- | 0 << WIDE_FLASH
|
||||||
|
- | 1 << DEV0_CFG1_ECC_DISABLE);
|
||||||
|
- if (!nandc->props->qpic_v2)
|
||||||
|
- nandc_set_reg(chip, NAND_EBI2_ECC_BUF_CFG, 1 << ECC_CFG_ECC_DISABLE);
|
||||||
|
+ nandc->regs->cmd = q_op.cmd_reg;
|
||||||
|
+ nandc->regs->addr0 = 0;
|
||||||
|
+ nandc->regs->addr1 = 0;
|
||||||
|
+
|
||||||
|
+ nandc->regs->cfg0 = cpu_to_le32(0 << CW_PER_PAGE
|
||||||
|
+ | 512 << UD_SIZE_BYTES
|
||||||
|
+ | 5 << NUM_ADDR_CYCLES
|
||||||
|
+ | 0 << SPARE_SIZE_BYTES);
|
||||||
|
+
|
||||||
|
+ nandc->regs->cfg1 = cpu_to_le32(7 << NAND_RECOVERY_CYCLES
|
||||||
|
+ | 0 << CS_ACTIVE_BSY
|
||||||
|
+ | 17 << BAD_BLOCK_BYTE_NUM
|
||||||
|
+ | 1 << BAD_BLOCK_IN_SPARE_AREA
|
||||||
|
+ | 2 << WR_RD_BSY_GAP
|
||||||
|
+ | 0 << WIDE_FLASH
|
||||||
|
+ | 1 << DEV0_CFG1_ECC_DISABLE);
|
||||||
|
+
|
||||||
|
+ if (!nandc->props->qpic_version2)
|
||||||
|
+ nandc->regs->ecc_buf_cfg = cpu_to_le32(1 << ECC_CFG_ECC_DISABLE);
|
||||||
|
|
||||||
|
/* configure CMD1 and VLD for ONFI param probing in QPIC v1 */
|
||||||
|
- if (!nandc->props->qpic_v2) {
|
||||||
|
- nandc_set_reg(chip, NAND_DEV_CMD_VLD,
|
||||||
|
- (nandc->vld & ~READ_START_VLD));
|
||||||
|
- nandc_set_reg(chip, NAND_DEV_CMD1,
|
||||||
|
- (nandc->cmd1 & ~(0xFF << READ_ADDR))
|
||||||
|
- | NAND_CMD_PARAM << READ_ADDR);
|
||||||
|
+ if (!nandc->props->qpic_version2) {
|
||||||
|
+ nandc->regs->vld = cpu_to_le32((nandc->vld & ~READ_START_VLD));
|
||||||
|
+ nandc->regs->cmd1 = cpu_to_le32((nandc->cmd1 & ~(0xFF << READ_ADDR))
|
||||||
|
+ | NAND_CMD_PARAM << READ_ADDR);
|
||||||
|
}
|
||||||
|
|
||||||
|
- nandc_set_reg(chip, NAND_EXEC_CMD, 1);
|
||||||
|
+ nandc->regs->exec = cpu_to_le32(1);
|
||||||
|
|
||||||
|
- if (!nandc->props->qpic_v2) {
|
||||||
|
- nandc_set_reg(chip, NAND_DEV_CMD1_RESTORE, nandc->cmd1);
|
||||||
|
- nandc_set_reg(chip, NAND_DEV_CMD_VLD_RESTORE, nandc->vld);
|
||||||
|
+ if (!nandc->props->qpic_version2) {
|
||||||
|
+ nandc->regs->orig_cmd1 = cpu_to_le32(nandc->cmd1);
|
||||||
|
+ nandc->regs->orig_vld = cpu_to_le32(nandc->vld);
|
||||||
|
}
|
||||||
|
|
||||||
|
instr = q_op.data_instr;
|
||||||
|
@@ -2912,9 +2863,9 @@ static int qcom_param_page_type_exec(struct nand_chip *chip, const struct nand_
|
||||||
|
|
||||||
|
nandc_set_read_loc(chip, 0, 0, 0, len, 1);
|
||||||
|
|
||||||
|
- if (!nandc->props->qpic_v2) {
|
||||||
|
- write_reg_dma(nandc, NAND_DEV_CMD_VLD, 1, 0);
|
||||||
|
- write_reg_dma(nandc, NAND_DEV_CMD1, 1, NAND_BAM_NEXT_SGL);
|
||||||
|
+ if (!nandc->props->qpic_version2) {
|
||||||
|
+ write_reg_dma(nandc, &nandc->regs->vld, NAND_DEV_CMD_VLD, 1, 0);
|
||||||
|
+ write_reg_dma(nandc, &nandc->regs->cmd1, NAND_DEV_CMD1, 1, NAND_BAM_NEXT_SGL);
|
||||||
|
}
|
||||||
|
|
||||||
|
nandc->buf_count = len;
|
||||||
|
@@ -2926,9 +2877,10 @@ static int qcom_param_page_type_exec(struct nand_chip *chip, const struct nand_
|
||||||
|
nandc->buf_count, 0);
|
||||||
|
|
||||||
|
/* restore CMD1 and VLD regs */
|
||||||
|
- if (!nandc->props->qpic_v2) {
|
||||||
|
- write_reg_dma(nandc, NAND_DEV_CMD1_RESTORE, 1, 0);
|
||||||
|
- write_reg_dma(nandc, NAND_DEV_CMD_VLD_RESTORE, 1, NAND_BAM_NEXT_SGL);
|
||||||
|
+ if (!nandc->props->qpic_version2) {
|
||||||
|
+ write_reg_dma(nandc, &nandc->regs->orig_cmd1, NAND_DEV_CMD1_RESTORE, 1, 0);
|
||||||
|
+ write_reg_dma(nandc, &nandc->regs->orig_vld, NAND_DEV_CMD_VLD_RESTORE, 1,
|
||||||
|
+ NAND_BAM_NEXT_SGL);
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = submit_descs(nandc);
|
||||||
|
@@ -3017,7 +2969,7 @@ static const struct nand_controller_ops qcom_nandc_ops = {
|
||||||
|
|
||||||
|
static void qcom_nandc_unalloc(struct qcom_nand_controller *nandc)
|
||||||
|
{
|
||||||
|
- if (nandc->props->is_bam) {
|
||||||
|
+ if (nandc->props->supports_bam) {
|
||||||
|
if (!dma_mapping_error(nandc->dev, nandc->reg_read_dma))
|
||||||
|
dma_unmap_single(nandc->dev, nandc->reg_read_dma,
|
||||||
|
MAX_REG_RD *
|
||||||
|
@@ -3070,7 +3022,7 @@ static int qcom_nandc_alloc(struct qcom_nand_controller *nandc)
|
||||||
|
if (!nandc->reg_read_buf)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
- if (nandc->props->is_bam) {
|
||||||
|
+ if (nandc->props->supports_bam) {
|
||||||
|
nandc->reg_read_dma =
|
||||||
|
dma_map_single(nandc->dev, nandc->reg_read_buf,
|
||||||
|
MAX_REG_RD *
|
||||||
|
@@ -3151,15 +3103,15 @@ static int qcom_nandc_setup(struct qcom_nand_controller *nandc)
|
||||||
|
u32 nand_ctrl;
|
||||||
|
|
||||||
|
/* kill onenand */
|
||||||
|
- if (!nandc->props->is_qpic)
|
||||||
|
+ if (!nandc->props->nandc_part_of_qpic)
|
||||||
|
nandc_write(nandc, SFLASHC_BURST_CFG, 0);
|
||||||
|
|
||||||
|
- if (!nandc->props->qpic_v2)
|
||||||
|
+ if (!nandc->props->qpic_version2)
|
||||||
|
nandc_write(nandc, dev_cmd_reg_addr(nandc, NAND_DEV_CMD_VLD),
|
||||||
|
NAND_DEV_CMD_VLD_VAL);
|
||||||
|
|
||||||
|
/* enable ADM or BAM DMA */
|
||||||
|
- if (nandc->props->is_bam) {
|
||||||
|
+ if (nandc->props->supports_bam) {
|
||||||
|
nand_ctrl = nandc_read(nandc, NAND_CTRL);
|
||||||
|
|
||||||
|
/*
|
||||||
|
@@ -3176,7 +3128,7 @@ static int qcom_nandc_setup(struct qcom_nand_controller *nandc)
|
||||||
|
}
|
||||||
|
|
||||||
|
/* save the original values of these registers */
|
||||||
|
- if (!nandc->props->qpic_v2) {
|
||||||
|
+ if (!nandc->props->qpic_version2) {
|
||||||
|
nandc->cmd1 = nandc_read(nandc, dev_cmd_reg_addr(nandc, NAND_DEV_CMD1));
|
||||||
|
nandc->vld = NAND_DEV_CMD_VLD_VAL;
|
||||||
|
}
|
||||||
|
@@ -3349,7 +3301,7 @@ static int qcom_nandc_parse_dt(struct platform_device *pdev)
|
||||||
|
struct device_node *np = nandc->dev->of_node;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
- if (!nandc->props->is_bam) {
|
||||||
|
+ if (!nandc->props->supports_bam) {
|
||||||
|
ret = of_property_read_u32(np, "qcom,cmd-crci",
|
||||||
|
&nandc->cmd_crci);
|
||||||
|
if (ret) {
|
||||||
|
@@ -3474,30 +3426,30 @@ static void qcom_nandc_remove(struct platform_device *pdev)
|
||||||
|
|
||||||
|
static const struct qcom_nandc_props ipq806x_nandc_props = {
|
||||||
|
.ecc_modes = (ECC_RS_4BIT | ECC_BCH_8BIT),
|
||||||
|
- .is_bam = false,
|
||||||
|
+ .supports_bam = false,
|
||||||
|
.use_codeword_fixup = true,
|
||||||
|
.dev_cmd_reg_start = 0x0,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct qcom_nandc_props ipq4019_nandc_props = {
|
||||||
|
.ecc_modes = (ECC_BCH_4BIT | ECC_BCH_8BIT),
|
||||||
|
- .is_bam = true,
|
||||||
|
- .is_qpic = true,
|
||||||
|
+ .supports_bam = true,
|
||||||
|
+ .nandc_part_of_qpic = true,
|
||||||
|
.dev_cmd_reg_start = 0x0,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct qcom_nandc_props ipq8074_nandc_props = {
|
||||||
|
.ecc_modes = (ECC_BCH_4BIT | ECC_BCH_8BIT),
|
||||||
|
- .is_bam = true,
|
||||||
|
- .is_qpic = true,
|
||||||
|
+ .supports_bam = true,
|
||||||
|
+ .nandc_part_of_qpic = true,
|
||||||
|
.dev_cmd_reg_start = 0x7000,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct qcom_nandc_props sdx55_nandc_props = {
|
||||||
|
.ecc_modes = (ECC_BCH_4BIT | ECC_BCH_8BIT),
|
||||||
|
- .is_bam = true,
|
||||||
|
- .is_qpic = true,
|
||||||
|
- .qpic_v2 = true,
|
||||||
|
+ .supports_bam = true,
|
||||||
|
+ .nandc_part_of_qpic = true,
|
||||||
|
+ .qpic_version2 = true,
|
||||||
|
.dev_cmd_reg_start = 0x7000,
|
||||||
|
};
|
||||||
|
|
@ -0,0 +1,876 @@
|
|||||||
|
From: Md Sadre Alam <quic_mdalam@quicinc.com>
|
||||||
|
Date: Sun, 22 Sep 2024 17:03:46 +0530
|
||||||
|
Subject: [PATCH] mtd: rawnand: qcom: Add qcom prefix to common api
|
||||||
|
|
||||||
|
Add qcom prefix to all the api which will be commonly
|
||||||
|
used by spi nand driver and raw nand driver.
|
||||||
|
|
||||||
|
Signed-off-by: Md Sadre Alam <quic_mdalam@quicinc.com>
|
||||||
|
---
|
||||||
|
diff --git a/drivers/mtd/nand/raw/qcom_nandc.c b/drivers/mtd/nand/raw/qcom_nandc.c
|
||||||
|
index d134329330fe..daf8f73b25bc 100644
|
||||||
|
--- a/drivers/mtd/nand/raw/qcom_nandc.c
|
||||||
|
+++ b/drivers/mtd/nand/raw/qcom_nandc.c
|
||||||
|
@@ -53,7 +53,7 @@
|
||||||
|
#define NAND_READ_LOCATION_LAST_CW_2 0xf48
|
||||||
|
#define NAND_READ_LOCATION_LAST_CW_3 0xf4c
|
||||||
|
|
||||||
|
-/* dummy register offsets, used by write_reg_dma */
|
||||||
|
+/* dummy register offsets, used by qcom_write_reg_dma */
|
||||||
|
#define NAND_DEV_CMD1_RESTORE 0xdead
|
||||||
|
#define NAND_DEV_CMD_VLD_RESTORE 0xbeef
|
||||||
|
|
||||||
|
@@ -211,7 +211,7 @@
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Flags used in DMA descriptor preparation helper functions
|
||||||
|
- * (i.e. read_reg_dma/write_reg_dma/read_data_dma/write_data_dma)
|
||||||
|
+ * (i.e. qcom_read_reg_dma/qcom_write_reg_dma/qcom_read_data_dma/qcom_write_data_dma)
|
||||||
|
*/
|
||||||
|
/* Don't set the EOT in current tx BAM sgl */
|
||||||
|
#define NAND_BAM_NO_EOT BIT(0)
|
||||||
|
@@ -550,7 +550,7 @@ struct qcom_nandc_props {
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Frees the BAM transaction memory */
|
||||||
|
-static void free_bam_transaction(struct qcom_nand_controller *nandc)
|
||||||
|
+static void qcom_free_bam_transaction(struct qcom_nand_controller *nandc)
|
||||||
|
{
|
||||||
|
struct bam_transaction *bam_txn = nandc->bam_txn;
|
||||||
|
|
||||||
|
@@ -559,7 +559,7 @@ static void free_bam_transaction(struct qcom_nand_controller *nandc)
|
||||||
|
|
||||||
|
/* Allocates and Initializes the BAM transaction */
|
||||||
|
static struct bam_transaction *
|
||||||
|
-alloc_bam_transaction(struct qcom_nand_controller *nandc)
|
||||||
|
+qcom_alloc_bam_transaction(struct qcom_nand_controller *nandc)
|
||||||
|
{
|
||||||
|
struct bam_transaction *bam_txn;
|
||||||
|
size_t bam_txn_size;
|
||||||
|
@@ -595,7 +595,7 @@ alloc_bam_transaction(struct qcom_nand_controller *nandc)
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Clears the BAM transaction indexes */
|
||||||
|
-static void clear_bam_transaction(struct qcom_nand_controller *nandc)
|
||||||
|
+static void qcom_clear_bam_transaction(struct qcom_nand_controller *nandc)
|
||||||
|
{
|
||||||
|
struct bam_transaction *bam_txn = nandc->bam_txn;
|
||||||
|
|
||||||
|
@@ -614,7 +614,7 @@ static void clear_bam_transaction(struct qcom_nand_controller *nandc)
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Callback for DMA descriptor completion */
|
||||||
|
-static void qpic_bam_dma_done(void *data)
|
||||||
|
+static void qcom_qpic_bam_dma_done(void *data)
|
||||||
|
{
|
||||||
|
struct bam_transaction *bam_txn = data;
|
||||||
|
|
||||||
|
@@ -644,7 +644,7 @@ static inline void nandc_write(struct qcom_nand_controller *nandc, int offset,
|
||||||
|
iowrite32(val, nandc->base + offset);
|
||||||
|
}
|
||||||
|
|
||||||
|
-static inline void nandc_dev_to_mem(struct qcom_nand_controller *nandc, bool is_cpu)
|
||||||
|
+static inline void qcom_nandc_dev_to_mem(struct qcom_nand_controller *nandc, bool is_cpu)
|
||||||
|
{
|
||||||
|
if (!nandc->props->supports_bam)
|
||||||
|
return;
|
||||||
|
@@ -824,9 +824,9 @@ static void update_rw_regs(struct qcom_nand_host *host, int num_cw, bool read, i
|
||||||
|
* for BAM. This descriptor will be added in the NAND DMA descriptor queue
|
||||||
|
* which will be submitted to DMA engine.
|
||||||
|
*/
|
||||||
|
-static int prepare_bam_async_desc(struct qcom_nand_controller *nandc,
|
||||||
|
- struct dma_chan *chan,
|
||||||
|
- unsigned long flags)
|
||||||
|
+static int qcom_prepare_bam_async_desc(struct qcom_nand_controller *nandc,
|
||||||
|
+ struct dma_chan *chan,
|
||||||
|
+ unsigned long flags)
|
||||||
|
{
|
||||||
|
struct desc_info *desc;
|
||||||
|
struct scatterlist *sgl;
|
||||||
|
@@ -903,9 +903,9 @@ static int prepare_bam_async_desc(struct qcom_nand_controller *nandc,
|
||||||
|
* NAND_BAM_NEXT_SGL will be used for starting the separate SGL
|
||||||
|
* after the current command element.
|
||||||
|
*/
|
||||||
|
-static int prep_bam_dma_desc_cmd(struct qcom_nand_controller *nandc, bool read,
|
||||||
|
- int reg_off, const void *vaddr,
|
||||||
|
- int size, unsigned int flags)
|
||||||
|
+static int qcom_prep_bam_dma_desc_cmd(struct qcom_nand_controller *nandc, bool read,
|
||||||
|
+ int reg_off, const void *vaddr,
|
||||||
|
+ int size, unsigned int flags)
|
||||||
|
{
|
||||||
|
int bam_ce_size;
|
||||||
|
int i, ret;
|
||||||
|
@@ -943,9 +943,9 @@ static int prep_bam_dma_desc_cmd(struct qcom_nand_controller *nandc, bool read,
|
||||||
|
bam_txn->bam_ce_start = bam_txn->bam_ce_pos;
|
||||||
|
|
||||||
|
if (flags & NAND_BAM_NWD) {
|
||||||
|
- ret = prepare_bam_async_desc(nandc, nandc->cmd_chan,
|
||||||
|
- DMA_PREP_FENCE |
|
||||||
|
- DMA_PREP_CMD);
|
||||||
|
+ ret = qcom_prepare_bam_async_desc(nandc, nandc->cmd_chan,
|
||||||
|
+ DMA_PREP_FENCE |
|
||||||
|
+ DMA_PREP_CMD);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
@@ -958,9 +958,8 @@ static int prep_bam_dma_desc_cmd(struct qcom_nand_controller *nandc, bool read,
|
||||||
|
* Prepares the data descriptor for BAM DMA which will be used for NAND
|
||||||
|
* data reads and writes.
|
||||||
|
*/
|
||||||
|
-static int prep_bam_dma_desc_data(struct qcom_nand_controller *nandc, bool read,
|
||||||
|
- const void *vaddr,
|
||||||
|
- int size, unsigned int flags)
|
||||||
|
+static int qcom_prep_bam_dma_desc_data(struct qcom_nand_controller *nandc, bool read,
|
||||||
|
+ const void *vaddr, int size, unsigned int flags)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
struct bam_transaction *bam_txn = nandc->bam_txn;
|
||||||
|
@@ -979,8 +978,8 @@ static int prep_bam_dma_desc_data(struct qcom_nand_controller *nandc, bool read,
|
||||||
|
* is not set, form the DMA descriptor
|
||||||
|
*/
|
||||||
|
if (!(flags & NAND_BAM_NO_EOT)) {
|
||||||
|
- ret = prepare_bam_async_desc(nandc, nandc->tx_chan,
|
||||||
|
- DMA_PREP_INTERRUPT);
|
||||||
|
+ ret = qcom_prepare_bam_async_desc(nandc, nandc->tx_chan,
|
||||||
|
+ DMA_PREP_INTERRUPT);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
@@ -989,9 +988,9 @@ static int prep_bam_dma_desc_data(struct qcom_nand_controller *nandc, bool read,
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
-static int prep_adm_dma_desc(struct qcom_nand_controller *nandc, bool read,
|
||||||
|
- int reg_off, const void *vaddr, int size,
|
||||||
|
- bool flow_control)
|
||||||
|
+static int qcom_prep_adm_dma_desc(struct qcom_nand_controller *nandc, bool read,
|
||||||
|
+ int reg_off, const void *vaddr, int size,
|
||||||
|
+ bool flow_control)
|
||||||
|
{
|
||||||
|
struct desc_info *desc;
|
||||||
|
struct dma_async_tx_descriptor *dma_desc;
|
||||||
|
@@ -1069,15 +1068,15 @@ static int prep_adm_dma_desc(struct qcom_nand_controller *nandc, bool read,
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
- * read_reg_dma: prepares a descriptor to read a given number of
|
||||||
|
+ * qcom_read_reg_dma: prepares a descriptor to read a given number of
|
||||||
|
* contiguous registers to the reg_read_buf pointer
|
||||||
|
*
|
||||||
|
* @first: offset of the first register in the contiguous block
|
||||||
|
* @num_regs: number of registers to read
|
||||||
|
* @flags: flags to control DMA descriptor preparation
|
||||||
|
*/
|
||||||
|
-static int read_reg_dma(struct qcom_nand_controller *nandc, int first,
|
||||||
|
- int num_regs, unsigned int flags)
|
||||||
|
+static int qcom_read_reg_dma(struct qcom_nand_controller *nandc, int first,
|
||||||
|
+ int num_regs, unsigned int flags)
|
||||||
|
{
|
||||||
|
bool flow_control = false;
|
||||||
|
void *vaddr;
|
||||||
|
@@ -1089,18 +1088,18 @@ static int read_reg_dma(struct qcom_nand_controller *nandc, int first,
|
||||||
|
first = dev_cmd_reg_addr(nandc, first);
|
||||||
|
|
||||||
|
if (nandc->props->supports_bam)
|
||||||
|
- return prep_bam_dma_desc_cmd(nandc, true, first, vaddr,
|
||||||
|
+ return qcom_prep_bam_dma_desc_cmd(nandc, true, first, vaddr,
|
||||||
|
num_regs, flags);
|
||||||
|
|
||||||
|
if (first == NAND_READ_ID || first == NAND_FLASH_STATUS)
|
||||||
|
flow_control = true;
|
||||||
|
|
||||||
|
- return prep_adm_dma_desc(nandc, true, first, vaddr,
|
||||||
|
+ return qcom_prep_adm_dma_desc(nandc, true, first, vaddr,
|
||||||
|
num_regs * sizeof(u32), flow_control);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
- * write_reg_dma: prepares a descriptor to write a given number of
|
||||||
|
+ * qcom_write_reg_dma: prepares a descriptor to write a given number of
|
||||||
|
* contiguous registers
|
||||||
|
*
|
||||||
|
* @vaddr: contnigeous memory from where register value will
|
||||||
|
@@ -1109,8 +1108,8 @@ static int read_reg_dma(struct qcom_nand_controller *nandc, int first,
|
||||||
|
* @num_regs: number of registers to write
|
||||||
|
* @flags: flags to control DMA descriptor preparation
|
||||||
|
*/
|
||||||
|
-static int write_reg_dma(struct qcom_nand_controller *nandc, __le32 *vaddr,
|
||||||
|
- int first, int num_regs, unsigned int flags)
|
||||||
|
+static int qcom_write_reg_dma(struct qcom_nand_controller *nandc, __le32 *vaddr,
|
||||||
|
+ int first, int num_regs, unsigned int flags)
|
||||||
|
{
|
||||||
|
bool flow_control = false;
|
||||||
|
|
||||||
|
@@ -1124,18 +1123,18 @@ static int write_reg_dma(struct qcom_nand_controller *nandc, __le32 *vaddr,
|
||||||
|
first = dev_cmd_reg_addr(nandc, NAND_DEV_CMD_VLD);
|
||||||
|
|
||||||
|
if (nandc->props->supports_bam)
|
||||||
|
- return prep_bam_dma_desc_cmd(nandc, false, first, vaddr,
|
||||||
|
+ return qcom_prep_bam_dma_desc_cmd(nandc, false, first, vaddr,
|
||||||
|
num_regs, flags);
|
||||||
|
|
||||||
|
if (first == NAND_FLASH_CMD)
|
||||||
|
flow_control = true;
|
||||||
|
|
||||||
|
- return prep_adm_dma_desc(nandc, false, first, vaddr,
|
||||||
|
+ return qcom_prep_adm_dma_desc(nandc, false, first, vaddr,
|
||||||
|
num_regs * sizeof(u32), flow_control);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
- * read_data_dma: prepares a DMA descriptor to transfer data from the
|
||||||
|
+ * qcom_read_data_dma: prepares a DMA descriptor to transfer data from the
|
||||||
|
* controller's internal buffer to the buffer 'vaddr'
|
||||||
|
*
|
||||||
|
* @reg_off: offset within the controller's data buffer
|
||||||
|
@@ -1143,17 +1142,17 @@ static int write_reg_dma(struct qcom_nand_controller *nandc, __le32 *vaddr,
|
||||||
|
* @size: DMA transaction size in bytes
|
||||||
|
* @flags: flags to control DMA descriptor preparation
|
||||||
|
*/
|
||||||
|
-static int read_data_dma(struct qcom_nand_controller *nandc, int reg_off,
|
||||||
|
- const u8 *vaddr, int size, unsigned int flags)
|
||||||
|
+static int qcom_read_data_dma(struct qcom_nand_controller *nandc, int reg_off,
|
||||||
|
+ const u8 *vaddr, int size, unsigned int flags)
|
||||||
|
{
|
||||||
|
if (nandc->props->supports_bam)
|
||||||
|
- return prep_bam_dma_desc_data(nandc, true, vaddr, size, flags);
|
||||||
|
+ return qcom_prep_bam_dma_desc_data(nandc, true, vaddr, size, flags);
|
||||||
|
|
||||||
|
- return prep_adm_dma_desc(nandc, true, reg_off, vaddr, size, false);
|
||||||
|
+ return qcom_prep_adm_dma_desc(nandc, true, reg_off, vaddr, size, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
- * write_data_dma: prepares a DMA descriptor to transfer data from
|
||||||
|
+ * qcom_write_data_dma: prepares a DMA descriptor to transfer data from
|
||||||
|
* 'vaddr' to the controller's internal buffer
|
||||||
|
*
|
||||||
|
* @reg_off: offset within the controller's data buffer
|
||||||
|
@@ -1161,13 +1160,13 @@ static int read_data_dma(struct qcom_nand_controller *nandc, int reg_off,
|
||||||
|
* @size: DMA transaction size in bytes
|
||||||
|
* @flags: flags to control DMA descriptor preparation
|
||||||
|
*/
|
||||||
|
-static int write_data_dma(struct qcom_nand_controller *nandc, int reg_off,
|
||||||
|
- const u8 *vaddr, int size, unsigned int flags)
|
||||||
|
+static int qcom_write_data_dma(struct qcom_nand_controller *nandc, int reg_off,
|
||||||
|
+ const u8 *vaddr, int size, unsigned int flags)
|
||||||
|
{
|
||||||
|
if (nandc->props->supports_bam)
|
||||||
|
- return prep_bam_dma_desc_data(nandc, false, vaddr, size, flags);
|
||||||
|
+ return qcom_prep_bam_dma_desc_data(nandc, false, vaddr, size, flags);
|
||||||
|
|
||||||
|
- return prep_adm_dma_desc(nandc, false, reg_off, vaddr, size, false);
|
||||||
|
+ return qcom_prep_adm_dma_desc(nandc, false, reg_off, vaddr, size, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
@@ -1178,14 +1177,14 @@ static void config_nand_page_read(struct nand_chip *chip)
|
||||||
|
{
|
||||||
|
struct qcom_nand_controller *nandc = get_qcom_nand_controller(chip);
|
||||||
|
|
||||||
|
- write_reg_dma(nandc, &nandc->regs->addr0, NAND_ADDR0, 2, 0);
|
||||||
|
- write_reg_dma(nandc, &nandc->regs->cfg0, NAND_DEV0_CFG0, 3, 0);
|
||||||
|
+ qcom_write_reg_dma(nandc, &nandc->regs->addr0, NAND_ADDR0, 2, 0);
|
||||||
|
+ qcom_write_reg_dma(nandc, &nandc->regs->cfg0, NAND_DEV0_CFG0, 3, 0);
|
||||||
|
if (!nandc->props->qpic_version2)
|
||||||
|
- write_reg_dma(nandc, &nandc->regs->ecc_buf_cfg, NAND_EBI2_ECC_BUF_CFG, 1, 0);
|
||||||
|
- write_reg_dma(nandc, &nandc->regs->erased_cw_detect_cfg_clr,
|
||||||
|
- NAND_ERASED_CW_DETECT_CFG, 1, 0);
|
||||||
|
- write_reg_dma(nandc, &nandc->regs->erased_cw_detect_cfg_set,
|
||||||
|
- NAND_ERASED_CW_DETECT_CFG, 1, NAND_ERASED_CW_SET | NAND_BAM_NEXT_SGL);
|
||||||
|
+ qcom_write_reg_dma(nandc, &nandc->regs->ecc_buf_cfg, NAND_EBI2_ECC_BUF_CFG, 1, 0);
|
||||||
|
+ qcom_write_reg_dma(nandc, &nandc->regs->erased_cw_detect_cfg_clr,
|
||||||
|
+ NAND_ERASED_CW_DETECT_CFG, 1, 0);
|
||||||
|
+ qcom_write_reg_dma(nandc, &nandc->regs->erased_cw_detect_cfg_set,
|
||||||
|
+ NAND_ERASED_CW_DETECT_CFG, 1, NAND_ERASED_CW_SET | NAND_BAM_NEXT_SGL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
@@ -1204,17 +1203,17 @@ config_nand_cw_read(struct nand_chip *chip, bool use_ecc, int cw)
|
||||||
|
reg = &nandc->regs->read_location_last0;
|
||||||
|
|
||||||
|
if (nandc->props->supports_bam)
|
||||||
|
- write_reg_dma(nandc, reg, NAND_READ_LOCATION_0, 4, NAND_BAM_NEXT_SGL);
|
||||||
|
+ qcom_write_reg_dma(nandc, reg, NAND_READ_LOCATION_0, 4, NAND_BAM_NEXT_SGL);
|
||||||
|
|
||||||
|
- write_reg_dma(nandc, &nandc->regs->cmd, NAND_FLASH_CMD, 1, NAND_BAM_NEXT_SGL);
|
||||||
|
- write_reg_dma(nandc, &nandc->regs->exec, NAND_EXEC_CMD, 1, NAND_BAM_NEXT_SGL);
|
||||||
|
+ qcom_write_reg_dma(nandc, &nandc->regs->cmd, NAND_FLASH_CMD, 1, NAND_BAM_NEXT_SGL);
|
||||||
|
+ qcom_write_reg_dma(nandc, &nandc->regs->exec, NAND_EXEC_CMD, 1, NAND_BAM_NEXT_SGL);
|
||||||
|
|
||||||
|
if (use_ecc) {
|
||||||
|
- read_reg_dma(nandc, NAND_FLASH_STATUS, 2, 0);
|
||||||
|
- read_reg_dma(nandc, NAND_ERASED_CW_DETECT_STATUS, 1,
|
||||||
|
- NAND_BAM_NEXT_SGL);
|
||||||
|
+ qcom_read_reg_dma(nandc, NAND_FLASH_STATUS, 2, 0);
|
||||||
|
+ qcom_read_reg_dma(nandc, NAND_ERASED_CW_DETECT_STATUS, 1,
|
||||||
|
+ NAND_BAM_NEXT_SGL);
|
||||||
|
} else {
|
||||||
|
- read_reg_dma(nandc, NAND_FLASH_STATUS, 1, NAND_BAM_NEXT_SGL);
|
||||||
|
+ qcom_read_reg_dma(nandc, NAND_FLASH_STATUS, 1, NAND_BAM_NEXT_SGL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -1238,11 +1237,11 @@ static void config_nand_page_write(struct nand_chip *chip)
|
||||||
|
{
|
||||||
|
struct qcom_nand_controller *nandc = get_qcom_nand_controller(chip);
|
||||||
|
|
||||||
|
- write_reg_dma(nandc, &nandc->regs->addr0, NAND_ADDR0, 2, 0);
|
||||||
|
- write_reg_dma(nandc, &nandc->regs->cfg0, NAND_DEV0_CFG0, 3, 0);
|
||||||
|
+ qcom_write_reg_dma(nandc, &nandc->regs->addr0, NAND_ADDR0, 2, 0);
|
||||||
|
+ qcom_write_reg_dma(nandc, &nandc->regs->cfg0, NAND_DEV0_CFG0, 3, 0);
|
||||||
|
if (!nandc->props->qpic_version2)
|
||||||
|
- write_reg_dma(nandc, &nandc->regs->ecc_buf_cfg, NAND_EBI2_ECC_BUF_CFG, 1,
|
||||||
|
- NAND_BAM_NEXT_SGL);
|
||||||
|
+ qcom_write_reg_dma(nandc, &nandc->regs->ecc_buf_cfg, NAND_EBI2_ECC_BUF_CFG, 1,
|
||||||
|
+ NAND_BAM_NEXT_SGL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
@@ -1253,17 +1252,18 @@ static void config_nand_cw_write(struct nand_chip *chip)
|
||||||
|
{
|
||||||
|
struct qcom_nand_controller *nandc = get_qcom_nand_controller(chip);
|
||||||
|
|
||||||
|
- write_reg_dma(nandc, &nandc->regs->cmd, NAND_FLASH_CMD, 1, NAND_BAM_NEXT_SGL);
|
||||||
|
- write_reg_dma(nandc, &nandc->regs->exec, NAND_EXEC_CMD, 1, NAND_BAM_NEXT_SGL);
|
||||||
|
+ qcom_write_reg_dma(nandc, &nandc->regs->cmd, NAND_FLASH_CMD, 1, NAND_BAM_NEXT_SGL);
|
||||||
|
+ qcom_write_reg_dma(nandc, &nandc->regs->exec, NAND_EXEC_CMD, 1, NAND_BAM_NEXT_SGL);
|
||||||
|
|
||||||
|
- read_reg_dma(nandc, NAND_FLASH_STATUS, 1, NAND_BAM_NEXT_SGL);
|
||||||
|
+ qcom_read_reg_dma(nandc, NAND_FLASH_STATUS, 1, NAND_BAM_NEXT_SGL);
|
||||||
|
|
||||||
|
- write_reg_dma(nandc, &nandc->regs->clrflashstatus, NAND_FLASH_STATUS, 1, 0);
|
||||||
|
- write_reg_dma(nandc, &nandc->regs->clrreadstatus, NAND_READ_STATUS, 1, NAND_BAM_NEXT_SGL);
|
||||||
|
+ qcom_write_reg_dma(nandc, &nandc->regs->clrflashstatus, NAND_FLASH_STATUS, 1, 0);
|
||||||
|
+ qcom_write_reg_dma(nandc, &nandc->regs->clrreadstatus, NAND_READ_STATUS, 1,
|
||||||
|
+ NAND_BAM_NEXT_SGL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* helpers to submit/free our list of dma descriptors */
|
||||||
|
-static int submit_descs(struct qcom_nand_controller *nandc)
|
||||||
|
+static int qcom_submit_descs(struct qcom_nand_controller *nandc)
|
||||||
|
{
|
||||||
|
struct desc_info *desc, *n;
|
||||||
|
dma_cookie_t cookie = 0;
|
||||||
|
@@ -1272,21 +1272,21 @@ static int submit_descs(struct qcom_nand_controller *nandc)
|
||||||
|
|
||||||
|
if (nandc->props->supports_bam) {
|
||||||
|
if (bam_txn->rx_sgl_pos > bam_txn->rx_sgl_start) {
|
||||||
|
- ret = prepare_bam_async_desc(nandc, nandc->rx_chan, 0);
|
||||||
|
+ ret = qcom_prepare_bam_async_desc(nandc, nandc->rx_chan, 0);
|
||||||
|
if (ret)
|
||||||
|
goto err_unmap_free_desc;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bam_txn->tx_sgl_pos > bam_txn->tx_sgl_start) {
|
||||||
|
- ret = prepare_bam_async_desc(nandc, nandc->tx_chan,
|
||||||
|
- DMA_PREP_INTERRUPT);
|
||||||
|
+ ret = qcom_prepare_bam_async_desc(nandc, nandc->tx_chan,
|
||||||
|
+ DMA_PREP_INTERRUPT);
|
||||||
|
if (ret)
|
||||||
|
goto err_unmap_free_desc;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bam_txn->cmd_sgl_pos > bam_txn->cmd_sgl_start) {
|
||||||
|
- ret = prepare_bam_async_desc(nandc, nandc->cmd_chan,
|
||||||
|
- DMA_PREP_CMD);
|
||||||
|
+ ret = qcom_prepare_bam_async_desc(nandc, nandc->cmd_chan,
|
||||||
|
+ DMA_PREP_CMD);
|
||||||
|
if (ret)
|
||||||
|
goto err_unmap_free_desc;
|
||||||
|
}
|
||||||
|
@@ -1296,7 +1296,7 @@ static int submit_descs(struct qcom_nand_controller *nandc)
|
||||||
|
cookie = dmaengine_submit(desc->dma_desc);
|
||||||
|
|
||||||
|
if (nandc->props->supports_bam) {
|
||||||
|
- bam_txn->last_cmd_desc->callback = qpic_bam_dma_done;
|
||||||
|
+ bam_txn->last_cmd_desc->callback = qcom_qpic_bam_dma_done;
|
||||||
|
bam_txn->last_cmd_desc->callback_param = bam_txn;
|
||||||
|
|
||||||
|
dma_async_issue_pending(nandc->tx_chan);
|
||||||
|
@@ -1314,7 +1314,7 @@ static int submit_descs(struct qcom_nand_controller *nandc)
|
||||||
|
err_unmap_free_desc:
|
||||||
|
/*
|
||||||
|
* Unmap the dma sg_list and free the desc allocated by both
|
||||||
|
- * prepare_bam_async_desc() and prep_adm_dma_desc() functions.
|
||||||
|
+ * qcom_prepare_bam_async_desc() and qcom_prep_adm_dma_desc() functions.
|
||||||
|
*/
|
||||||
|
list_for_each_entry_safe(desc, n, &nandc->desc_list, node) {
|
||||||
|
list_del(&desc->node);
|
||||||
|
@@ -1333,10 +1333,10 @@ static int submit_descs(struct qcom_nand_controller *nandc)
|
||||||
|
}
|
||||||
|
|
||||||
|
/* reset the register read buffer for next NAND operation */
|
||||||
|
-static void clear_read_regs(struct qcom_nand_controller *nandc)
|
||||||
|
+static void qcom_clear_read_regs(struct qcom_nand_controller *nandc)
|
||||||
|
{
|
||||||
|
nandc->reg_read_pos = 0;
|
||||||
|
- nandc_dev_to_mem(nandc, false);
|
||||||
|
+ qcom_nandc_dev_to_mem(nandc, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
@@ -1400,7 +1400,7 @@ static int check_flash_errors(struct qcom_nand_host *host, int cw_cnt)
|
||||||
|
struct qcom_nand_controller *nandc = get_qcom_nand_controller(chip);
|
||||||
|
int i;
|
||||||
|
|
||||||
|
- nandc_dev_to_mem(nandc, true);
|
||||||
|
+ qcom_nandc_dev_to_mem(nandc, true);
|
||||||
|
|
||||||
|
for (i = 0; i < cw_cnt; i++) {
|
||||||
|
u32 flash = le32_to_cpu(nandc->reg_read_buf[i]);
|
||||||
|
@@ -1427,13 +1427,13 @@ qcom_nandc_read_cw_raw(struct mtd_info *mtd, struct nand_chip *chip,
|
||||||
|
nand_read_page_op(chip, page, 0, NULL, 0);
|
||||||
|
nandc->buf_count = 0;
|
||||||
|
nandc->buf_start = 0;
|
||||||
|
- clear_read_regs(nandc);
|
||||||
|
+ qcom_clear_read_regs(nandc);
|
||||||
|
host->use_ecc = false;
|
||||||
|
|
||||||
|
if (nandc->props->qpic_version2)
|
||||||
|
raw_cw = ecc->steps - 1;
|
||||||
|
|
||||||
|
- clear_bam_transaction(nandc);
|
||||||
|
+ qcom_clear_bam_transaction(nandc);
|
||||||
|
set_address(host, host->cw_size * cw, page);
|
||||||
|
update_rw_regs(host, 1, true, raw_cw);
|
||||||
|
config_nand_page_read(chip);
|
||||||
|
@@ -1466,18 +1466,18 @@ qcom_nandc_read_cw_raw(struct mtd_info *mtd, struct nand_chip *chip,
|
||||||
|
|
||||||
|
config_nand_cw_read(chip, false, raw_cw);
|
||||||
|
|
||||||
|
- read_data_dma(nandc, reg_off, data_buf, data_size1, 0);
|
||||||
|
+ qcom_read_data_dma(nandc, reg_off, data_buf, data_size1, 0);
|
||||||
|
reg_off += data_size1;
|
||||||
|
|
||||||
|
- read_data_dma(nandc, reg_off, oob_buf, oob_size1, 0);
|
||||||
|
+ qcom_read_data_dma(nandc, reg_off, oob_buf, oob_size1, 0);
|
||||||
|
reg_off += oob_size1;
|
||||||
|
|
||||||
|
- read_data_dma(nandc, reg_off, data_buf + data_size1, data_size2, 0);
|
||||||
|
+ qcom_read_data_dma(nandc, reg_off, data_buf + data_size1, data_size2, 0);
|
||||||
|
reg_off += data_size2;
|
||||||
|
|
||||||
|
- read_data_dma(nandc, reg_off, oob_buf + oob_size1, oob_size2, 0);
|
||||||
|
+ qcom_read_data_dma(nandc, reg_off, oob_buf + oob_size1, oob_size2, 0);
|
||||||
|
|
||||||
|
- ret = submit_descs(nandc);
|
||||||
|
+ ret = qcom_submit_descs(nandc);
|
||||||
|
if (ret) {
|
||||||
|
dev_err(nandc->dev, "failure to read raw cw %d\n", cw);
|
||||||
|
return ret;
|
||||||
|
@@ -1575,7 +1575,7 @@ static int parse_read_errors(struct qcom_nand_host *host, u8 *data_buf,
|
||||||
|
u8 *data_buf_start = data_buf, *oob_buf_start = oob_buf;
|
||||||
|
|
||||||
|
buf = (struct read_stats *)nandc->reg_read_buf;
|
||||||
|
- nandc_dev_to_mem(nandc, true);
|
||||||
|
+ qcom_nandc_dev_to_mem(nandc, true);
|
||||||
|
|
||||||
|
for (i = 0; i < ecc->steps; i++, buf++) {
|
||||||
|
u32 flash, buffer, erased_cw;
|
||||||
|
@@ -1704,8 +1704,8 @@ static int read_page_ecc(struct qcom_nand_host *host, u8 *data_buf,
|
||||||
|
config_nand_cw_read(chip, true, i);
|
||||||
|
|
||||||
|
if (data_buf)
|
||||||
|
- read_data_dma(nandc, FLASH_BUF_ACC, data_buf,
|
||||||
|
- data_size, 0);
|
||||||
|
+ qcom_read_data_dma(nandc, FLASH_BUF_ACC, data_buf,
|
||||||
|
+ data_size, 0);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* when ecc is enabled, the controller doesn't read the real
|
||||||
|
@@ -1720,8 +1720,8 @@ static int read_page_ecc(struct qcom_nand_host *host, u8 *data_buf,
|
||||||
|
for (j = 0; j < host->bbm_size; j++)
|
||||||
|
*oob_buf++ = 0xff;
|
||||||
|
|
||||||
|
- read_data_dma(nandc, FLASH_BUF_ACC + data_size,
|
||||||
|
- oob_buf, oob_size, 0);
|
||||||
|
+ qcom_read_data_dma(nandc, FLASH_BUF_ACC + data_size,
|
||||||
|
+ oob_buf, oob_size, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data_buf)
|
||||||
|
@@ -1730,7 +1730,7 @@ static int read_page_ecc(struct qcom_nand_host *host, u8 *data_buf,
|
||||||
|
oob_buf += oob_size;
|
||||||
|
}
|
||||||
|
|
||||||
|
- ret = submit_descs(nandc);
|
||||||
|
+ ret = qcom_submit_descs(nandc);
|
||||||
|
if (ret) {
|
||||||
|
dev_err(nandc->dev, "failure to read page/oob\n");
|
||||||
|
return ret;
|
||||||
|
@@ -1751,7 +1751,7 @@ static int copy_last_cw(struct qcom_nand_host *host, int page)
|
||||||
|
int size;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
- clear_read_regs(nandc);
|
||||||
|
+ qcom_clear_read_regs(nandc);
|
||||||
|
|
||||||
|
size = host->use_ecc ? host->cw_data : host->cw_size;
|
||||||
|
|
||||||
|
@@ -1763,9 +1763,9 @@ static int copy_last_cw(struct qcom_nand_host *host, int page)
|
||||||
|
|
||||||
|
config_nand_single_cw_page_read(chip, host->use_ecc, ecc->steps - 1);
|
||||||
|
|
||||||
|
- read_data_dma(nandc, FLASH_BUF_ACC, nandc->data_buffer, size, 0);
|
||||||
|
+ qcom_read_data_dma(nandc, FLASH_BUF_ACC, nandc->data_buffer, size, 0);
|
||||||
|
|
||||||
|
- ret = submit_descs(nandc);
|
||||||
|
+ ret = qcom_submit_descs(nandc);
|
||||||
|
if (ret)
|
||||||
|
dev_err(nandc->dev, "failed to copy last codeword\n");
|
||||||
|
|
||||||
|
@@ -1851,14 +1851,14 @@ static int qcom_nandc_read_page(struct nand_chip *chip, u8 *buf,
|
||||||
|
nandc->buf_count = 0;
|
||||||
|
nandc->buf_start = 0;
|
||||||
|
host->use_ecc = true;
|
||||||
|
- clear_read_regs(nandc);
|
||||||
|
+ qcom_clear_read_regs(nandc);
|
||||||
|
set_address(host, 0, page);
|
||||||
|
update_rw_regs(host, ecc->steps, true, 0);
|
||||||
|
|
||||||
|
data_buf = buf;
|
||||||
|
oob_buf = oob_required ? chip->oob_poi : NULL;
|
||||||
|
|
||||||
|
- clear_bam_transaction(nandc);
|
||||||
|
+ qcom_clear_bam_transaction(nandc);
|
||||||
|
|
||||||
|
return read_page_ecc(host, data_buf, oob_buf, page);
|
||||||
|
}
|
||||||
|
@@ -1899,8 +1899,8 @@ static int qcom_nandc_read_oob(struct nand_chip *chip, int page)
|
||||||
|
if (host->nr_boot_partitions)
|
||||||
|
qcom_nandc_codeword_fixup(host, page);
|
||||||
|
|
||||||
|
- clear_read_regs(nandc);
|
||||||
|
- clear_bam_transaction(nandc);
|
||||||
|
+ qcom_clear_read_regs(nandc);
|
||||||
|
+ qcom_clear_bam_transaction(nandc);
|
||||||
|
|
||||||
|
host->use_ecc = true;
|
||||||
|
set_address(host, 0, page);
|
||||||
|
@@ -1927,8 +1927,8 @@ static int qcom_nandc_write_page(struct nand_chip *chip, const u8 *buf,
|
||||||
|
set_address(host, 0, page);
|
||||||
|
nandc->buf_count = 0;
|
||||||
|
nandc->buf_start = 0;
|
||||||
|
- clear_read_regs(nandc);
|
||||||
|
- clear_bam_transaction(nandc);
|
||||||
|
+ qcom_clear_read_regs(nandc);
|
||||||
|
+ qcom_clear_bam_transaction(nandc);
|
||||||
|
|
||||||
|
data_buf = (u8 *)buf;
|
||||||
|
oob_buf = chip->oob_poi;
|
||||||
|
@@ -1949,8 +1949,8 @@ static int qcom_nandc_write_page(struct nand_chip *chip, const u8 *buf,
|
||||||
|
oob_size = ecc->bytes;
|
||||||
|
}
|
||||||
|
|
||||||
|
- write_data_dma(nandc, FLASH_BUF_ACC, data_buf, data_size,
|
||||||
|
- i == (ecc->steps - 1) ? NAND_BAM_NO_EOT : 0);
|
||||||
|
+ qcom_write_data_dma(nandc, FLASH_BUF_ACC, data_buf, data_size,
|
||||||
|
+ i == (ecc->steps - 1) ? NAND_BAM_NO_EOT : 0);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* when ECC is enabled, we don't really need to write anything
|
||||||
|
@@ -1962,8 +1962,8 @@ static int qcom_nandc_write_page(struct nand_chip *chip, const u8 *buf,
|
||||||
|
if (qcom_nandc_is_last_cw(ecc, i)) {
|
||||||
|
oob_buf += host->bbm_size;
|
||||||
|
|
||||||
|
- write_data_dma(nandc, FLASH_BUF_ACC + data_size,
|
||||||
|
- oob_buf, oob_size, 0);
|
||||||
|
+ qcom_write_data_dma(nandc, FLASH_BUF_ACC + data_size,
|
||||||
|
+ oob_buf, oob_size, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
config_nand_cw_write(chip);
|
||||||
|
@@ -1972,7 +1972,7 @@ static int qcom_nandc_write_page(struct nand_chip *chip, const u8 *buf,
|
||||||
|
oob_buf += oob_size;
|
||||||
|
}
|
||||||
|
|
||||||
|
- ret = submit_descs(nandc);
|
||||||
|
+ ret = qcom_submit_descs(nandc);
|
||||||
|
if (ret) {
|
||||||
|
dev_err(nandc->dev, "failure to write page\n");
|
||||||
|
return ret;
|
||||||
|
@@ -1997,8 +1997,8 @@ static int qcom_nandc_write_page_raw(struct nand_chip *chip,
|
||||||
|
qcom_nandc_codeword_fixup(host, page);
|
||||||
|
|
||||||
|
nand_prog_page_begin_op(chip, page, 0, NULL, 0);
|
||||||
|
- clear_read_regs(nandc);
|
||||||
|
- clear_bam_transaction(nandc);
|
||||||
|
+ qcom_clear_read_regs(nandc);
|
||||||
|
+ qcom_clear_bam_transaction(nandc);
|
||||||
|
|
||||||
|
data_buf = (u8 *)buf;
|
||||||
|
oob_buf = chip->oob_poi;
|
||||||
|
@@ -2024,28 +2024,28 @@ static int qcom_nandc_write_page_raw(struct nand_chip *chip,
|
||||||
|
oob_size2 = host->ecc_bytes_hw + host->spare_bytes;
|
||||||
|
}
|
||||||
|
|
||||||
|
- write_data_dma(nandc, reg_off, data_buf, data_size1,
|
||||||
|
- NAND_BAM_NO_EOT);
|
||||||
|
+ qcom_write_data_dma(nandc, reg_off, data_buf, data_size1,
|
||||||
|
+ NAND_BAM_NO_EOT);
|
||||||
|
reg_off += data_size1;
|
||||||
|
data_buf += data_size1;
|
||||||
|
|
||||||
|
- write_data_dma(nandc, reg_off, oob_buf, oob_size1,
|
||||||
|
- NAND_BAM_NO_EOT);
|
||||||
|
+ qcom_write_data_dma(nandc, reg_off, oob_buf, oob_size1,
|
||||||
|
+ NAND_BAM_NO_EOT);
|
||||||
|
reg_off += oob_size1;
|
||||||
|
oob_buf += oob_size1;
|
||||||
|
|
||||||
|
- write_data_dma(nandc, reg_off, data_buf, data_size2,
|
||||||
|
- NAND_BAM_NO_EOT);
|
||||||
|
+ qcom_write_data_dma(nandc, reg_off, data_buf, data_size2,
|
||||||
|
+ NAND_BAM_NO_EOT);
|
||||||
|
reg_off += data_size2;
|
||||||
|
data_buf += data_size2;
|
||||||
|
|
||||||
|
- write_data_dma(nandc, reg_off, oob_buf, oob_size2, 0);
|
||||||
|
+ qcom_write_data_dma(nandc, reg_off, oob_buf, oob_size2, 0);
|
||||||
|
oob_buf += oob_size2;
|
||||||
|
|
||||||
|
config_nand_cw_write(chip);
|
||||||
|
}
|
||||||
|
|
||||||
|
- ret = submit_descs(nandc);
|
||||||
|
+ ret = qcom_submit_descs(nandc);
|
||||||
|
if (ret) {
|
||||||
|
dev_err(nandc->dev, "failure to write raw page\n");
|
||||||
|
return ret;
|
||||||
|
@@ -2075,7 +2075,7 @@ static int qcom_nandc_write_oob(struct nand_chip *chip, int page)
|
||||||
|
qcom_nandc_codeword_fixup(host, page);
|
||||||
|
|
||||||
|
host->use_ecc = true;
|
||||||
|
- clear_bam_transaction(nandc);
|
||||||
|
+ qcom_clear_bam_transaction(nandc);
|
||||||
|
|
||||||
|
/* calculate the data and oob size for the last codeword/step */
|
||||||
|
data_size = ecc->size - ((ecc->steps - 1) << 2);
|
||||||
|
@@ -2090,11 +2090,11 @@ static int qcom_nandc_write_oob(struct nand_chip *chip, int page)
|
||||||
|
update_rw_regs(host, 1, false, 0);
|
||||||
|
|
||||||
|
config_nand_page_write(chip);
|
||||||
|
- write_data_dma(nandc, FLASH_BUF_ACC,
|
||||||
|
- nandc->data_buffer, data_size + oob_size, 0);
|
||||||
|
+ qcom_write_data_dma(nandc, FLASH_BUF_ACC,
|
||||||
|
+ nandc->data_buffer, data_size + oob_size, 0);
|
||||||
|
config_nand_cw_write(chip);
|
||||||
|
|
||||||
|
- ret = submit_descs(nandc);
|
||||||
|
+ ret = qcom_submit_descs(nandc);
|
||||||
|
if (ret) {
|
||||||
|
dev_err(nandc->dev, "failure to write oob\n");
|
||||||
|
return ret;
|
||||||
|
@@ -2121,7 +2121,7 @@ static int qcom_nandc_block_bad(struct nand_chip *chip, loff_t ofs)
|
||||||
|
*/
|
||||||
|
host->use_ecc = false;
|
||||||
|
|
||||||
|
- clear_bam_transaction(nandc);
|
||||||
|
+ qcom_clear_bam_transaction(nandc);
|
||||||
|
ret = copy_last_cw(host, page);
|
||||||
|
if (ret)
|
||||||
|
goto err;
|
||||||
|
@@ -2148,8 +2148,8 @@ static int qcom_nandc_block_markbad(struct nand_chip *chip, loff_t ofs)
|
||||||
|
struct nand_ecc_ctrl *ecc = &chip->ecc;
|
||||||
|
int page, ret;
|
||||||
|
|
||||||
|
- clear_read_regs(nandc);
|
||||||
|
- clear_bam_transaction(nandc);
|
||||||
|
+ qcom_clear_read_regs(nandc);
|
||||||
|
+ qcom_clear_bam_transaction(nandc);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* to mark the BBM as bad, we flash the entire last codeword with 0s.
|
||||||
|
@@ -2166,11 +2166,11 @@ static int qcom_nandc_block_markbad(struct nand_chip *chip, loff_t ofs)
|
||||||
|
update_rw_regs(host, 1, false, ecc->steps - 1);
|
||||||
|
|
||||||
|
config_nand_page_write(chip);
|
||||||
|
- write_data_dma(nandc, FLASH_BUF_ACC,
|
||||||
|
- nandc->data_buffer, host->cw_size, 0);
|
||||||
|
+ qcom_write_data_dma(nandc, FLASH_BUF_ACC,
|
||||||
|
+ nandc->data_buffer, host->cw_size, 0);
|
||||||
|
config_nand_cw_write(chip);
|
||||||
|
|
||||||
|
- ret = submit_descs(nandc);
|
||||||
|
+ ret = qcom_submit_descs(nandc);
|
||||||
|
if (ret) {
|
||||||
|
dev_err(nandc->dev, "failure to update BBM\n");
|
||||||
|
return ret;
|
||||||
|
@@ -2410,14 +2410,14 @@ static int qcom_nand_attach_chip(struct nand_chip *chip)
|
||||||
|
mtd_set_ooblayout(mtd, &qcom_nand_ooblayout_ops);
|
||||||
|
/* Free the initially allocated BAM transaction for reading the ONFI params */
|
||||||
|
if (nandc->props->supports_bam)
|
||||||
|
- free_bam_transaction(nandc);
|
||||||
|
+ qcom_free_bam_transaction(nandc);
|
||||||
|
|
||||||
|
nandc->max_cwperpage = max_t(unsigned int, nandc->max_cwperpage,
|
||||||
|
cwperpage);
|
||||||
|
|
||||||
|
/* Now allocate the BAM transaction based on updated max_cwperpage */
|
||||||
|
if (nandc->props->supports_bam) {
|
||||||
|
- nandc->bam_txn = alloc_bam_transaction(nandc);
|
||||||
|
+ nandc->bam_txn = qcom_alloc_bam_transaction(nandc);
|
||||||
|
if (!nandc->bam_txn) {
|
||||||
|
dev_err(nandc->dev,
|
||||||
|
"failed to allocate bam transaction\n");
|
||||||
|
@@ -2617,7 +2617,7 @@ static int qcom_wait_rdy_poll(struct nand_chip *chip, unsigned int time_ms)
|
||||||
|
unsigned long start = jiffies + msecs_to_jiffies(time_ms);
|
||||||
|
u32 flash;
|
||||||
|
|
||||||
|
- nandc_dev_to_mem(nandc, true);
|
||||||
|
+ qcom_nandc_dev_to_mem(nandc, true);
|
||||||
|
|
||||||
|
do {
|
||||||
|
flash = le32_to_cpu(nandc->reg_read_buf[0]);
|
||||||
|
@@ -2657,23 +2657,23 @@ static int qcom_read_status_exec(struct nand_chip *chip,
|
||||||
|
nandc->buf_start = 0;
|
||||||
|
host->use_ecc = false;
|
||||||
|
|
||||||
|
- clear_read_regs(nandc);
|
||||||
|
- clear_bam_transaction(nandc);
|
||||||
|
+ qcom_clear_read_regs(nandc);
|
||||||
|
+ qcom_clear_bam_transaction(nandc);
|
||||||
|
|
||||||
|
nandc->regs->cmd = q_op.cmd_reg;
|
||||||
|
nandc->regs->exec = cpu_to_le32(1);
|
||||||
|
|
||||||
|
- write_reg_dma(nandc, &nandc->regs->cmd, NAND_FLASH_CMD, 1, NAND_BAM_NEXT_SGL);
|
||||||
|
- write_reg_dma(nandc, &nandc->regs->exec, NAND_EXEC_CMD, 1, NAND_BAM_NEXT_SGL);
|
||||||
|
- read_reg_dma(nandc, NAND_FLASH_STATUS, 1, NAND_BAM_NEXT_SGL);
|
||||||
|
+ qcom_write_reg_dma(nandc, &nandc->regs->cmd, NAND_FLASH_CMD, 1, NAND_BAM_NEXT_SGL);
|
||||||
|
+ qcom_write_reg_dma(nandc, &nandc->regs->exec, NAND_EXEC_CMD, 1, NAND_BAM_NEXT_SGL);
|
||||||
|
+ qcom_read_reg_dma(nandc, NAND_FLASH_STATUS, 1, NAND_BAM_NEXT_SGL);
|
||||||
|
|
||||||
|
- ret = submit_descs(nandc);
|
||||||
|
+ ret = qcom_submit_descs(nandc);
|
||||||
|
if (ret) {
|
||||||
|
dev_err(nandc->dev, "failure in submitting status descriptor\n");
|
||||||
|
goto err_out;
|
||||||
|
}
|
||||||
|
|
||||||
|
- nandc_dev_to_mem(nandc, true);
|
||||||
|
+ qcom_nandc_dev_to_mem(nandc, true);
|
||||||
|
|
||||||
|
for (i = 0; i < num_cw; i++) {
|
||||||
|
flash_status = le32_to_cpu(nandc->reg_read_buf[i]);
|
||||||
|
@@ -2714,8 +2714,8 @@ static int qcom_read_id_type_exec(struct nand_chip *chip, const struct nand_subo
|
||||||
|
nandc->buf_start = 0;
|
||||||
|
host->use_ecc = false;
|
||||||
|
|
||||||
|
- clear_read_regs(nandc);
|
||||||
|
- clear_bam_transaction(nandc);
|
||||||
|
+ qcom_clear_read_regs(nandc);
|
||||||
|
+ qcom_clear_bam_transaction(nandc);
|
||||||
|
|
||||||
|
nandc->regs->cmd = q_op.cmd_reg;
|
||||||
|
nandc->regs->addr0 = q_op.addr1_reg;
|
||||||
|
@@ -2723,12 +2723,12 @@ static int qcom_read_id_type_exec(struct nand_chip *chip, const struct nand_subo
|
||||||
|
nandc->regs->chip_sel = cpu_to_le32(nandc->props->supports_bam ? 0 : DM_EN);
|
||||||
|
nandc->regs->exec = cpu_to_le32(1);
|
||||||
|
|
||||||
|
- write_reg_dma(nandc, &nandc->regs->cmd, NAND_FLASH_CMD, 4, NAND_BAM_NEXT_SGL);
|
||||||
|
- write_reg_dma(nandc, &nandc->regs->exec, NAND_EXEC_CMD, 1, NAND_BAM_NEXT_SGL);
|
||||||
|
+ qcom_write_reg_dma(nandc, &nandc->regs->cmd, NAND_FLASH_CMD, 4, NAND_BAM_NEXT_SGL);
|
||||||
|
+ qcom_write_reg_dma(nandc, &nandc->regs->exec, NAND_EXEC_CMD, 1, NAND_BAM_NEXT_SGL);
|
||||||
|
|
||||||
|
- read_reg_dma(nandc, NAND_READ_ID, 1, NAND_BAM_NEXT_SGL);
|
||||||
|
+ qcom_read_reg_dma(nandc, NAND_READ_ID, 1, NAND_BAM_NEXT_SGL);
|
||||||
|
|
||||||
|
- ret = submit_descs(nandc);
|
||||||
|
+ ret = qcom_submit_descs(nandc);
|
||||||
|
if (ret) {
|
||||||
|
dev_err(nandc->dev, "failure in submitting read id descriptor\n");
|
||||||
|
goto err_out;
|
||||||
|
@@ -2738,7 +2738,7 @@ static int qcom_read_id_type_exec(struct nand_chip *chip, const struct nand_subo
|
||||||
|
op_id = q_op.data_instr_idx;
|
||||||
|
len = nand_subop_get_data_len(subop, op_id);
|
||||||
|
|
||||||
|
- nandc_dev_to_mem(nandc, true);
|
||||||
|
+ qcom_nandc_dev_to_mem(nandc, true);
|
||||||
|
memcpy(instr->ctx.data.buf.in, nandc->reg_read_buf, len);
|
||||||
|
|
||||||
|
err_out:
|
||||||
|
@@ -2774,20 +2774,20 @@ static int qcom_misc_cmd_type_exec(struct nand_chip *chip, const struct nand_sub
|
||||||
|
nandc->buf_start = 0;
|
||||||
|
host->use_ecc = false;
|
||||||
|
|
||||||
|
- clear_read_regs(nandc);
|
||||||
|
- clear_bam_transaction(nandc);
|
||||||
|
+ qcom_clear_read_regs(nandc);
|
||||||
|
+ qcom_clear_bam_transaction(nandc);
|
||||||
|
|
||||||
|
nandc->regs->cmd = q_op.cmd_reg;
|
||||||
|
nandc->regs->exec = cpu_to_le32(1);
|
||||||
|
|
||||||
|
- write_reg_dma(nandc, &nandc->regs->cmd, NAND_FLASH_CMD, instrs, NAND_BAM_NEXT_SGL);
|
||||||
|
+ qcom_write_reg_dma(nandc, &nandc->regs->cmd, NAND_FLASH_CMD, instrs, NAND_BAM_NEXT_SGL);
|
||||||
|
if (q_op.cmd_reg == cpu_to_le32(OP_BLOCK_ERASE))
|
||||||
|
- write_reg_dma(nandc, &nandc->regs->cfg0, NAND_DEV0_CFG0, 2, NAND_BAM_NEXT_SGL);
|
||||||
|
+ qcom_write_reg_dma(nandc, &nandc->regs->cfg0, NAND_DEV0_CFG0, 2, NAND_BAM_NEXT_SGL);
|
||||||
|
|
||||||
|
- write_reg_dma(nandc, &nandc->regs->exec, NAND_EXEC_CMD, 1, NAND_BAM_NEXT_SGL);
|
||||||
|
- read_reg_dma(nandc, NAND_FLASH_STATUS, 1, NAND_BAM_NEXT_SGL);
|
||||||
|
+ qcom_write_reg_dma(nandc, &nandc->regs->exec, NAND_EXEC_CMD, 1, NAND_BAM_NEXT_SGL);
|
||||||
|
+ qcom_read_reg_dma(nandc, NAND_FLASH_STATUS, 1, NAND_BAM_NEXT_SGL);
|
||||||
|
|
||||||
|
- ret = submit_descs(nandc);
|
||||||
|
+ ret = qcom_submit_descs(nandc);
|
||||||
|
if (ret) {
|
||||||
|
dev_err(nandc->dev, "failure in submitting misc descriptor\n");
|
||||||
|
goto err_out;
|
||||||
|
@@ -2820,8 +2820,8 @@ static int qcom_param_page_type_exec(struct nand_chip *chip, const struct nand_
|
||||||
|
nandc->buf_count = 0;
|
||||||
|
nandc->buf_start = 0;
|
||||||
|
host->use_ecc = false;
|
||||||
|
- clear_read_regs(nandc);
|
||||||
|
- clear_bam_transaction(nandc);
|
||||||
|
+ qcom_clear_read_regs(nandc);
|
||||||
|
+ qcom_clear_bam_transaction(nandc);
|
||||||
|
|
||||||
|
nandc->regs->cmd = q_op.cmd_reg;
|
||||||
|
nandc->regs->addr0 = 0;
|
||||||
|
@@ -2864,8 +2864,8 @@ static int qcom_param_page_type_exec(struct nand_chip *chip, const struct nand_
|
||||||
|
nandc_set_read_loc(chip, 0, 0, 0, len, 1);
|
||||||
|
|
||||||
|
if (!nandc->props->qpic_version2) {
|
||||||
|
- write_reg_dma(nandc, &nandc->regs->vld, NAND_DEV_CMD_VLD, 1, 0);
|
||||||
|
- write_reg_dma(nandc, &nandc->regs->cmd1, NAND_DEV_CMD1, 1, NAND_BAM_NEXT_SGL);
|
||||||
|
+ qcom_write_reg_dma(nandc, &nandc->regs->vld, NAND_DEV_CMD_VLD, 1, 0);
|
||||||
|
+ qcom_write_reg_dma(nandc, &nandc->regs->cmd1, NAND_DEV_CMD1, 1, NAND_BAM_NEXT_SGL);
|
||||||
|
}
|
||||||
|
|
||||||
|
nandc->buf_count = len;
|
||||||
|
@@ -2873,17 +2873,17 @@ static int qcom_param_page_type_exec(struct nand_chip *chip, const struct nand_
|
||||||
|
|
||||||
|
config_nand_single_cw_page_read(chip, false, 0);
|
||||||
|
|
||||||
|
- read_data_dma(nandc, FLASH_BUF_ACC, nandc->data_buffer,
|
||||||
|
- nandc->buf_count, 0);
|
||||||
|
+ qcom_read_data_dma(nandc, FLASH_BUF_ACC, nandc->data_buffer,
|
||||||
|
+ nandc->buf_count, 0);
|
||||||
|
|
||||||
|
/* restore CMD1 and VLD regs */
|
||||||
|
if (!nandc->props->qpic_version2) {
|
||||||
|
- write_reg_dma(nandc, &nandc->regs->orig_cmd1, NAND_DEV_CMD1_RESTORE, 1, 0);
|
||||||
|
- write_reg_dma(nandc, &nandc->regs->orig_vld, NAND_DEV_CMD_VLD_RESTORE, 1,
|
||||||
|
- NAND_BAM_NEXT_SGL);
|
||||||
|
+ qcom_write_reg_dma(nandc, &nandc->regs->orig_cmd1, NAND_DEV_CMD1_RESTORE, 1, 0);
|
||||||
|
+ qcom_write_reg_dma(nandc, &nandc->regs->orig_vld, NAND_DEV_CMD_VLD_RESTORE, 1,
|
||||||
|
+ NAND_BAM_NEXT_SGL);
|
||||||
|
}
|
||||||
|
|
||||||
|
- ret = submit_descs(nandc);
|
||||||
|
+ ret = qcom_submit_descs(nandc);
|
||||||
|
if (ret) {
|
||||||
|
dev_err(nandc->dev, "failure in submitting param page descriptor\n");
|
||||||
|
goto err_out;
|
||||||
|
@@ -3067,7 +3067,7 @@ static int qcom_nandc_alloc(struct qcom_nand_controller *nandc)
|
||||||
|
* maximum codeword size
|
||||||
|
*/
|
||||||
|
nandc->max_cwperpage = 1;
|
||||||
|
- nandc->bam_txn = alloc_bam_transaction(nandc);
|
||||||
|
+ nandc->bam_txn = qcom_alloc_bam_transaction(nandc);
|
||||||
|
if (!nandc->bam_txn) {
|
||||||
|
dev_err(nandc->dev,
|
||||||
|
"failed to allocate bam transaction\n");
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,194 @@
|
|||||||
|
From: Md Sadre Alam <quic_mdalam@quicinc.com>
|
||||||
|
Date: Sun, 22 Sep 2024 17:03:48 +0530
|
||||||
|
Subject: [PATCH] mtd: rawnand: qcom: use FIELD_PREP and GENMASK
|
||||||
|
|
||||||
|
Use the bitfield macro FIELD_PREP, and GENMASK to
|
||||||
|
do the shift and mask in one go. This makes the code
|
||||||
|
more readable.
|
||||||
|
|
||||||
|
Signed-off-by: Md Sadre Alam <quic_mdalam@quicinc.com>
|
||||||
|
---
|
||||||
|
diff --git a/drivers/mtd/nand/raw/qcom_nandc.c b/drivers/mtd/nand/raw/qcom_nandc.c
|
||||||
|
index 91f1eb781cb2..c1159dbc8eba 100644
|
||||||
|
--- a/drivers/mtd/nand/raw/qcom_nandc.c
|
||||||
|
+++ b/drivers/mtd/nand/raw/qcom_nandc.c
|
||||||
|
@@ -281,7 +281,7 @@ static void update_rw_regs(struct qcom_nand_host *host, int num_cw, bool read, i
|
||||||
|
(num_cw - 1) << CW_PER_PAGE);
|
||||||
|
|
||||||
|
cfg1 = cpu_to_le32(host->cfg1_raw);
|
||||||
|
- ecc_bch_cfg = cpu_to_le32(1 << ECC_CFG_ECC_DISABLE);
|
||||||
|
+ ecc_bch_cfg = cpu_to_le32(ECC_CFG_ECC_DISABLE);
|
||||||
|
}
|
||||||
|
|
||||||
|
nandc->regs->cmd = cmd;
|
||||||
|
@@ -1494,42 +1494,41 @@ static int qcom_nand_attach_chip(struct nand_chip *chip)
|
||||||
|
host->cw_size = host->cw_data + ecc->bytes;
|
||||||
|
bad_block_byte = mtd->writesize - host->cw_size * (cwperpage - 1) + 1;
|
||||||
|
|
||||||
|
- host->cfg0 = (cwperpage - 1) << CW_PER_PAGE
|
||||||
|
- | host->cw_data << UD_SIZE_BYTES
|
||||||
|
- | 0 << DISABLE_STATUS_AFTER_WRITE
|
||||||
|
- | 5 << NUM_ADDR_CYCLES
|
||||||
|
- | host->ecc_bytes_hw << ECC_PARITY_SIZE_BYTES_RS
|
||||||
|
- | 0 << STATUS_BFR_READ
|
||||||
|
- | 1 << SET_RD_MODE_AFTER_STATUS
|
||||||
|
- | host->spare_bytes << SPARE_SIZE_BYTES;
|
||||||
|
-
|
||||||
|
- host->cfg1 = 7 << NAND_RECOVERY_CYCLES
|
||||||
|
- | 0 << CS_ACTIVE_BSY
|
||||||
|
- | bad_block_byte << BAD_BLOCK_BYTE_NUM
|
||||||
|
- | 0 << BAD_BLOCK_IN_SPARE_AREA
|
||||||
|
- | 2 << WR_RD_BSY_GAP
|
||||||
|
- | wide_bus << WIDE_FLASH
|
||||||
|
- | host->bch_enabled << ENABLE_BCH_ECC;
|
||||||
|
-
|
||||||
|
- host->cfg0_raw = (cwperpage - 1) << CW_PER_PAGE
|
||||||
|
- | host->cw_size << UD_SIZE_BYTES
|
||||||
|
- | 5 << NUM_ADDR_CYCLES
|
||||||
|
- | 0 << SPARE_SIZE_BYTES;
|
||||||
|
-
|
||||||
|
- host->cfg1_raw = 7 << NAND_RECOVERY_CYCLES
|
||||||
|
- | 0 << CS_ACTIVE_BSY
|
||||||
|
- | 17 << BAD_BLOCK_BYTE_NUM
|
||||||
|
- | 1 << BAD_BLOCK_IN_SPARE_AREA
|
||||||
|
- | 2 << WR_RD_BSY_GAP
|
||||||
|
- | wide_bus << WIDE_FLASH
|
||||||
|
- | 1 << DEV0_CFG1_ECC_DISABLE;
|
||||||
|
-
|
||||||
|
- host->ecc_bch_cfg = !host->bch_enabled << ECC_CFG_ECC_DISABLE
|
||||||
|
- | 0 << ECC_SW_RESET
|
||||||
|
- | host->cw_data << ECC_NUM_DATA_BYTES
|
||||||
|
- | 1 << ECC_FORCE_CLK_OPEN
|
||||||
|
- | ecc_mode << ECC_MODE
|
||||||
|
- | host->ecc_bytes_hw << ECC_PARITY_SIZE_BYTES_BCH;
|
||||||
|
+ host->cfg0 = FIELD_PREP(CW_PER_PAGE_MASK, (cwperpage - 1)) |
|
||||||
|
+ FIELD_PREP(UD_SIZE_BYTES_MASK, host->cw_data) |
|
||||||
|
+ FIELD_PREP(DISABLE_STATUS_AFTER_WRITE, 0) |
|
||||||
|
+ FIELD_PREP(NUM_ADDR_CYCLES_MASK, 5) |
|
||||||
|
+ FIELD_PREP(ECC_PARITY_SIZE_BYTES_RS, host->ecc_bytes_hw) |
|
||||||
|
+ FIELD_PREP(STATUS_BFR_READ, 0) |
|
||||||
|
+ FIELD_PREP(SET_RD_MODE_AFTER_STATUS, 1) |
|
||||||
|
+ FIELD_PREP(SPARE_SIZE_BYTES_MASK, host->spare_bytes);
|
||||||
|
+
|
||||||
|
+ host->cfg1 = FIELD_PREP(NAND_RECOVERY_CYCLES_MASK, 7) |
|
||||||
|
+ FIELD_PREP(BAD_BLOCK_BYTE_NUM_MASK, bad_block_byte) |
|
||||||
|
+ FIELD_PREP(BAD_BLOCK_IN_SPARE_AREA, 0) |
|
||||||
|
+ FIELD_PREP(WR_RD_BSY_GAP_MASK, 2) |
|
||||||
|
+ FIELD_PREP(WIDE_FLASH, wide_bus) |
|
||||||
|
+ FIELD_PREP(ENABLE_BCH_ECC, host->bch_enabled);
|
||||||
|
+
|
||||||
|
+ host->cfg0_raw = FIELD_PREP(CW_PER_PAGE_MASK, (cwperpage - 1)) |
|
||||||
|
+ FIELD_PREP(UD_SIZE_BYTES_MASK, host->cw_size) |
|
||||||
|
+ FIELD_PREP(NUM_ADDR_CYCLES_MASK, 5) |
|
||||||
|
+ FIELD_PREP(SPARE_SIZE_BYTES_MASK, 0);
|
||||||
|
+
|
||||||
|
+ host->cfg1_raw = FIELD_PREP(NAND_RECOVERY_CYCLES_MASK, 7) |
|
||||||
|
+ FIELD_PREP(CS_ACTIVE_BSY, 0) |
|
||||||
|
+ FIELD_PREP(BAD_BLOCK_BYTE_NUM_MASK, 17) |
|
||||||
|
+ FIELD_PREP(BAD_BLOCK_IN_SPARE_AREA, 1) |
|
||||||
|
+ FIELD_PREP(WR_RD_BSY_GAP_MASK, 2) |
|
||||||
|
+ FIELD_PREP(WIDE_FLASH, wide_bus) |
|
||||||
|
+ FIELD_PREP(DEV0_CFG1_ECC_DISABLE, 1);
|
||||||
|
+
|
||||||
|
+ host->ecc_bch_cfg = FIELD_PREP(ECC_CFG_ECC_DISABLE, !host->bch_enabled) |
|
||||||
|
+ FIELD_PREP(ECC_SW_RESET, 0) |
|
||||||
|
+ FIELD_PREP(ECC_NUM_DATA_BYTES_MASK, host->cw_data) |
|
||||||
|
+ FIELD_PREP(ECC_FORCE_CLK_OPEN, 1) |
|
||||||
|
+ FIELD_PREP(ECC_MODE_MASK, ecc_mode) |
|
||||||
|
+ FIELD_PREP(ECC_PARITY_SIZE_BYTES_BCH_MASK, host->ecc_bytes_hw);
|
||||||
|
|
||||||
|
if (!nandc->props->qpic_version2)
|
||||||
|
host->ecc_buf_cfg = 0x203 << NUM_STEPS;
|
||||||
|
@@ -1882,21 +1881,21 @@ static int qcom_param_page_type_exec(struct nand_chip *chip, const struct nand_
|
||||||
|
nandc->regs->addr0 = 0;
|
||||||
|
nandc->regs->addr1 = 0;
|
||||||
|
|
||||||
|
- nandc->regs->cfg0 = cpu_to_le32(0 << CW_PER_PAGE
|
||||||
|
- | 512 << UD_SIZE_BYTES
|
||||||
|
- | 5 << NUM_ADDR_CYCLES
|
||||||
|
- | 0 << SPARE_SIZE_BYTES);
|
||||||
|
+ host->cfg0 = FIELD_PREP(CW_PER_PAGE_MASK, 0) |
|
||||||
|
+ FIELD_PREP(UD_SIZE_BYTES_MASK, 512) |
|
||||||
|
+ FIELD_PREP(NUM_ADDR_CYCLES_MASK, 5) |
|
||||||
|
+ FIELD_PREP(SPARE_SIZE_BYTES_MASK, 0);
|
||||||
|
|
||||||
|
- nandc->regs->cfg1 = cpu_to_le32(7 << NAND_RECOVERY_CYCLES
|
||||||
|
- | 0 << CS_ACTIVE_BSY
|
||||||
|
- | 17 << BAD_BLOCK_BYTE_NUM
|
||||||
|
- | 1 << BAD_BLOCK_IN_SPARE_AREA
|
||||||
|
- | 2 << WR_RD_BSY_GAP
|
||||||
|
- | 0 << WIDE_FLASH
|
||||||
|
- | 1 << DEV0_CFG1_ECC_DISABLE);
|
||||||
|
+ host->cfg1 = FIELD_PREP(NAND_RECOVERY_CYCLES_MASK, 7) |
|
||||||
|
+ FIELD_PREP(BAD_BLOCK_BYTE_NUM_MASK, 17) |
|
||||||
|
+ FIELD_PREP(CS_ACTIVE_BSY, 0) |
|
||||||
|
+ FIELD_PREP(BAD_BLOCK_IN_SPARE_AREA, 1) |
|
||||||
|
+ FIELD_PREP(WR_RD_BSY_GAP_MASK, 2) |
|
||||||
|
+ FIELD_PREP(WIDE_FLASH, 0) |
|
||||||
|
+ FIELD_PREP(DEV0_CFG1_ECC_DISABLE, 1);
|
||||||
|
|
||||||
|
if (!nandc->props->qpic_version2)
|
||||||
|
- nandc->regs->ecc_buf_cfg = cpu_to_le32(1 << ECC_CFG_ECC_DISABLE);
|
||||||
|
+ nandc->regs->ecc_buf_cfg = cpu_to_le32(ECC_CFG_ECC_DISABLE);
|
||||||
|
|
||||||
|
/* configure CMD1 and VLD for ONFI param probing in QPIC v1 */
|
||||||
|
if (!nandc->props->qpic_version2) {
|
||||||
|
diff --git a/include/linux/mtd/nand-qpic-common.h b/include/linux/mtd/nand-qpic-common.h
|
||||||
|
index 425994429387..e79c79775eb8 100644
|
||||||
|
--- a/include/linux/mtd/nand-qpic-common.h
|
||||||
|
+++ b/include/linux/mtd/nand-qpic-common.h
|
||||||
|
@@ -70,35 +70,42 @@
|
||||||
|
#define BS_CORRECTABLE_ERR_MSK 0x1f
|
||||||
|
|
||||||
|
/* NAND_DEVn_CFG0 bits */
|
||||||
|
-#define DISABLE_STATUS_AFTER_WRITE 4
|
||||||
|
+#define DISABLE_STATUS_AFTER_WRITE BIT(4)
|
||||||
|
#define CW_PER_PAGE 6
|
||||||
|
+#define CW_PER_PAGE_MASK GENMASK(8, 6)
|
||||||
|
#define UD_SIZE_BYTES 9
|
||||||
|
#define UD_SIZE_BYTES_MASK GENMASK(18, 9)
|
||||||
|
-#define ECC_PARITY_SIZE_BYTES_RS 19
|
||||||
|
+#define ECC_PARITY_SIZE_BYTES_RS GENMASK(22, 19)
|
||||||
|
#define SPARE_SIZE_BYTES 23
|
||||||
|
#define SPARE_SIZE_BYTES_MASK GENMASK(26, 23)
|
||||||
|
#define NUM_ADDR_CYCLES 27
|
||||||
|
-#define STATUS_BFR_READ 30
|
||||||
|
-#define SET_RD_MODE_AFTER_STATUS 31
|
||||||
|
+#define NUM_ADDR_CYCLES_MASK GENMASK(29, 27)
|
||||||
|
+#define STATUS_BFR_READ BIT(30)
|
||||||
|
+#define SET_RD_MODE_AFTER_STATUS BIT(31)
|
||||||
|
|
||||||
|
/* NAND_DEVn_CFG0 bits */
|
||||||
|
-#define DEV0_CFG1_ECC_DISABLE 0
|
||||||
|
-#define WIDE_FLASH 1
|
||||||
|
+#define DEV0_CFG1_ECC_DISABLE BIT(0)
|
||||||
|
+#define WIDE_FLASH BIT(1)
|
||||||
|
#define NAND_RECOVERY_CYCLES 2
|
||||||
|
-#define CS_ACTIVE_BSY 5
|
||||||
|
+#define NAND_RECOVERY_CYCLES_MASK GENMASK(4, 2)
|
||||||
|
+#define CS_ACTIVE_BSY BIT(5)
|
||||||
|
#define BAD_BLOCK_BYTE_NUM 6
|
||||||
|
-#define BAD_BLOCK_IN_SPARE_AREA 16
|
||||||
|
+#define BAD_BLOCK_BYTE_NUM_MASK GENMASK(15, 6)
|
||||||
|
+#define BAD_BLOCK_IN_SPARE_AREA BIT(16)
|
||||||
|
#define WR_RD_BSY_GAP 17
|
||||||
|
-#define ENABLE_BCH_ECC 27
|
||||||
|
+#define WR_RD_BSY_GAP_MASK GENMASK(22, 17)
|
||||||
|
+#define ENABLE_BCH_ECC BIT(27)
|
||||||
|
|
||||||
|
/* NAND_DEV0_ECC_CFG bits */
|
||||||
|
-#define ECC_CFG_ECC_DISABLE 0
|
||||||
|
-#define ECC_SW_RESET 1
|
||||||
|
+#define ECC_CFG_ECC_DISABLE BIT(0)
|
||||||
|
+#define ECC_SW_RESET BIT(1)
|
||||||
|
#define ECC_MODE 4
|
||||||
|
+#define ECC_MODE_MASK GENMASK(5, 4)
|
||||||
|
#define ECC_PARITY_SIZE_BYTES_BCH 8
|
||||||
|
+#define ECC_PARITY_SIZE_BYTES_BCH_MASK GENMASK(12, 8)
|
||||||
|
#define ECC_NUM_DATA_BYTES 16
|
||||||
|
#define ECC_NUM_DATA_BYTES_MASK GENMASK(25, 16)
|
||||||
|
-#define ECC_FORCE_CLK_OPEN 30
|
||||||
|
+#define ECC_FORCE_CLK_OPEN BIT(30)
|
||||||
|
|
||||||
|
/* NAND_DEV_CMD1 bits */
|
||||||
|
#define READ_ADDR 0
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,29 @@
|
|||||||
|
--- a/drivers/mtd/nand/qpic_common.c
|
||||||
|
+++ b/drivers/mtd/nand/qpic_common.c
|
||||||
|
@@ -82,7 +82,15 @@ void qcom_clear_bam_transaction(struct q
|
||||||
|
if (!nandc->props->supports_bam)
|
||||||
|
return;
|
||||||
|
|
||||||
|
- memset(&bam_txn->bam_ce_pos, 0, sizeof(u32) * 8);
|
||||||
|
+ // memset(&bam_txn->bam_ce_pos, 0, sizeof(u32) * 8);
|
||||||
|
+ bam_txn->bam_ce_pos = 0;
|
||||||
|
+ bam_txn->bam_ce_start = 0;
|
||||||
|
+ bam_txn->cmd_sgl_pos = 0;
|
||||||
|
+ bam_txn->cmd_sgl_start = 0;
|
||||||
|
+ bam_txn->tx_sgl_pos = 0;
|
||||||
|
+ bam_txn->tx_sgl_start = 0;
|
||||||
|
+ bam_txn->rx_sgl_pos = 0;
|
||||||
|
+ bam_txn->rx_sgl_start = 0;
|
||||||
|
bam_txn->last_data_desc = NULL;
|
||||||
|
|
||||||
|
sg_init_table(bam_txn->cmd_sgl, nandc->max_cwperpage *
|
||||||
|
--- a/drivers/spi/spi-qpic-snand.c
|
||||||
|
+++ b/drivers/spi/spi-qpic-snand.c
|
||||||
|
@@ -1624,7 +1624,7 @@ static struct platform_driver qcom_spi_d
|
||||||
|
.of_match_table = qcom_snandc_of_match,
|
||||||
|
},
|
||||||
|
.probe = qcom_spi_probe,
|
||||||
|
- .remove = qcom_spi_remove,
|
||||||
|
+ .remove_new = qcom_spi_remove,
|
||||||
|
};
|
||||||
|
module_platform_driver(qcom_spi_driver);
|
@ -0,0 +1,50 @@
|
|||||||
|
From 396886e8644d5b601126b97e0b36c40c5fb5cecf Mon Sep 17 00:00:00 2001
|
||||||
|
From: Ziyang Huang <hzyitc@outlook.com>
|
||||||
|
Date: Sun, 8 Sep 2024 16:40:11 +0800
|
||||||
|
Subject: [PATCH 1/2] spi: spi-qpic-snand: support BCH8
|
||||||
|
|
||||||
|
Signed-off-by: hzy <hzyitc@outlook.com>
|
||||||
|
---
|
||||||
|
drivers/spi/spi-qpic-snand.c | 12 ++++++++----
|
||||||
|
1 file changed, 8 insertions(+), 4 deletions(-)
|
||||||
|
|
||||||
|
--- a/drivers/spi/spi-qpic-snand.c
|
||||||
|
+++ b/drivers/spi/spi-qpic-snand.c
|
||||||
|
@@ -252,6 +252,7 @@ static int qcom_spi_ecc_init_ctx_pipelin
|
||||||
|
struct nand_ecc_props *conf = &nand->ecc.ctx.conf;
|
||||||
|
struct mtd_info *mtd = nanddev_to_mtd(nand);
|
||||||
|
int cwperpage, bad_block_byte;
|
||||||
|
+ int ecc_mode;
|
||||||
|
struct qpic_ecc *ecc_cfg;
|
||||||
|
|
||||||
|
cwperpage = mtd->writesize / NANDC_STEP_SIZE;
|
||||||
|
@@ -270,14 +271,17 @@ static int qcom_spi_ecc_init_ctx_pipelin
|
||||||
|
nand->ecc.ctx.priv = ecc_cfg;
|
||||||
|
snandc->qspi->mtd = mtd;
|
||||||
|
|
||||||
|
- ecc_cfg->ecc_bytes_hw = 7;
|
||||||
|
- ecc_cfg->spare_bytes = 4;
|
||||||
|
+ /* BCH8 or BCH4 */
|
||||||
|
+ ecc_mode = mtd->oobsize > 64 ? 1 : 0;
|
||||||
|
+
|
||||||
|
+ ecc_cfg->ecc_bytes_hw = ecc_mode ? 13 : 7;
|
||||||
|
+ ecc_cfg->spare_bytes = ecc_mode ? 2 : 4;
|
||||||
|
ecc_cfg->bbm_size = 1;
|
||||||
|
ecc_cfg->bch_enabled = true;
|
||||||
|
ecc_cfg->bytes = ecc_cfg->ecc_bytes_hw + ecc_cfg->spare_bytes + ecc_cfg->bbm_size;
|
||||||
|
|
||||||
|
ecc_cfg->steps = 4;
|
||||||
|
- ecc_cfg->strength = 4;
|
||||||
|
+ ecc_cfg->strength = ecc_mode ? 8 : 4;
|
||||||
|
ecc_cfg->step_size = 512;
|
||||||
|
ecc_cfg->cw_data = 516;
|
||||||
|
ecc_cfg->cw_size = ecc_cfg->cw_data + ecc_cfg->bytes;
|
||||||
|
@@ -319,7 +323,7 @@ static int qcom_spi_ecc_init_ctx_pipelin
|
||||||
|
FIELD_PREP(ECC_SW_RESET, 0) |
|
||||||
|
FIELD_PREP(ECC_NUM_DATA_BYTES_MASK, ecc_cfg->cw_data) |
|
||||||
|
FIELD_PREP(ECC_FORCE_CLK_OPEN, 1) |
|
||||||
|
- FIELD_PREP(ECC_MODE_MASK, 0) |
|
||||||
|
+ FIELD_PREP(ECC_MODE_MASK, ecc_mode) |
|
||||||
|
FIELD_PREP(ECC_PARITY_SIZE_BYTES_BCH_MASK, ecc_cfg->ecc_bytes_hw);
|
||||||
|
|
||||||
|
ecc_cfg->ecc_buf_cfg = 0x203 << NUM_STEPS;
|
@ -0,0 +1,26 @@
|
|||||||
|
From 3d550dc3eb4eaa2fe1d0668ed67e835c91487d61 Mon Sep 17 00:00:00 2001
|
||||||
|
From: hzy <hzyitc@outlook.com>
|
||||||
|
Date: Sun, 8 Sep 2024 16:40:11 +0800
|
||||||
|
Subject: [PATCH 2/2] mtd: spinand: qpic only support max 4 bytes ID
|
||||||
|
|
||||||
|
Signed-off-by: hzy <hzyitc@outlook.com>
|
||||||
|
---
|
||||||
|
drivers/mtd/nand/spi/core.c | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/mtd/nand/spi/core.c b/drivers/mtd/nand/spi/core.c
|
||||||
|
index 4c54a962c5d6..1a8ac8e20f6e 100644
|
||||||
|
--- a/drivers/mtd/nand/spi/core.c
|
||||||
|
+++ b/drivers/mtd/nand/spi/core.c
|
||||||
|
@@ -1086,7 +1086,7 @@ int spinand_match_and_init(struct spinand_device *spinand,
|
||||||
|
if (rdid_method != info->devid.method)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
- if (memcmp(id + 1, info->devid.id, info->devid.len))
|
||||||
|
+ if (memcmp(id + 1, info->devid.id, min(3, info->devid.len)))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
nand->memorg = table[i].memorg;
|
||||||
|
--
|
||||||
|
2.40.1
|
||||||
|
|
@ -0,0 +1,49 @@
|
|||||||
|
From c2019f64539dd24e6e0da3cea2219d6f9e6b03e4 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Ziyang Huang <hzyitc@outlook.com>
|
||||||
|
Date: Sun, 8 Sep 2024 16:40:11 +0800
|
||||||
|
Subject: [PATCH] arm64: dts: qcom: ipq5018: Add nand node
|
||||||
|
|
||||||
|
Signed-off-by: hzy <hzyitc@outlook.com>
|
||||||
|
---
|
||||||
|
arch/arm64/boot/dts/qcom/ipq5018.dtsi | 40 +++++++++++++++++++++++++++
|
||||||
|
1 file changed, 40 insertions(+)
|
||||||
|
|
||||||
|
--- a/arch/arm64/boot/dts/qcom/ipq5018.dtsi
|
||||||
|
+++ b/arch/arm64/boot/dts/qcom/ipq5018.dtsi
|
||||||
|
@@ -457,6 +457,36 @@
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
|
+ qpic_bam: dma@7984000 {
|
||||||
|
+ compatible = "qcom,bam-v1.7.0";
|
||||||
|
+ reg = <0x07984000 0x1c000>;
|
||||||
|
+ interrupts = <GIC_SPI 146 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
+ clocks = <&gcc GCC_QPIC_AHB_CLK>;
|
||||||
|
+ clock-names = "bam_clk";
|
||||||
|
+ #dma-cells = <1>;
|
||||||
|
+ qcom,ee = <0>;
|
||||||
|
+ status = "disabled";
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ qpic_nand: qpic-nand@79b0000 {
|
||||||
|
+ compatible = "qcom,spi-qpic-snand";
|
||||||
|
+ reg = <0x079b0000 0x10000>;
|
||||||
|
+ #address-cells = <1>;
|
||||||
|
+ #size-cells = <0>;
|
||||||
|
+ clocks = <&gcc GCC_QPIC_CLK>,
|
||||||
|
+ <&gcc GCC_QPIC_AHB_CLK>,
|
||||||
|
+ <&gcc GCC_QPIC_IO_MACRO_CLK>;
|
||||||
|
+ clock-names = "core", "aon", "iom";
|
||||||
|
+
|
||||||
|
+ dmas = <&qpic_bam 0>,
|
||||||
|
+ <&qpic_bam 1>,
|
||||||
|
+ <&qpic_bam 2>,
|
||||||
|
+ <&qpic_bam 3>;
|
||||||
|
+ dma-names = "tx", "rx", "cmd", "status";
|
||||||
|
+
|
||||||
|
+ status = "disabled";
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
usb: usb@8af8800 {
|
||||||
|
compatible = "qcom,ipq5018-dwc3", "qcom,dwc3";
|
||||||
|
reg = <0x08af8800 0x400>;
|
@ -0,0 +1,22 @@
|
|||||||
|
From b76a7649402d3eb1245ab463832133fc7efda194 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Ziyang Huang <hzyitc@outlook.com>
|
||||||
|
Date: Sun, 8 Sep 2024 16:40:11 +0800
|
||||||
|
Subject: [PATCH] arm64: dts: qcom: ipq5018: Add more nand compatible for
|
||||||
|
uboot to fix partitions
|
||||||
|
|
||||||
|
Signed-off-by: hzy <hzyitc@outlook.com>
|
||||||
|
---
|
||||||
|
arch/arm64/boot/dts/qcom/ipq5018.dtsi | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
--- a/arch/arm64/boot/dts/qcom/ipq5018.dtsi
|
||||||
|
+++ b/arch/arm64/boot/dts/qcom/ipq5018.dtsi
|
||||||
|
@@ -469,7 +469,7 @@
|
||||||
|
};
|
||||||
|
|
||||||
|
qpic_nand: qpic-nand@79b0000 {
|
||||||
|
- compatible = "qcom,spi-qpic-snand";
|
||||||
|
+ compatible = "qcom,spi-qpic-snand", "qcom,ebi2-nandc-bam-v2.1.1";
|
||||||
|
reg = <0x079b0000 0x10000>;
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user