bcm53xx: drop linux 4.4 and 4.9 support
Signed-off-by: Felix Fietkau <nbd@nbd.name>
This commit is contained in:
parent
50b0919628
commit
1de74df8b9
179 changed files with 0 additions and 21831 deletions
|
@ -1,339 +0,0 @@
|
|||
CONFIG_ALIGNMENT_TRAP=y
|
||||
CONFIG_ARCH_BCM=y
|
||||
# CONFIG_ARCH_BCM_21664 is not set
|
||||
# CONFIG_ARCH_BCM_281XX is not set
|
||||
CONFIG_ARCH_BCM_5301X=y
|
||||
CONFIG_ARCH_BCM_53573=y
|
||||
# CONFIG_ARCH_BCM_63XX is not set
|
||||
# CONFIG_ARCH_BCM_CYGNUS is not set
|
||||
CONFIG_ARCH_BCM_IPROC=y
|
||||
# CONFIG_ARCH_BCM_NSP is not set
|
||||
# CONFIG_ARCH_BRCMSTB is not set
|
||||
CONFIG_ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE=y
|
||||
CONFIG_ARCH_HAS_ELF_RANDOMIZE=y
|
||||
CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y
|
||||
CONFIG_ARCH_HAS_SG_CHAIN=y
|
||||
CONFIG_ARCH_HAS_TICK_BROADCAST=y
|
||||
CONFIG_ARCH_HAVE_CUSTOM_GPIO_H=y
|
||||
CONFIG_ARCH_HIBERNATION_POSSIBLE=y
|
||||
CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y
|
||||
CONFIG_ARCH_MULTIPLATFORM=y
|
||||
# CONFIG_ARCH_MULTI_CPU_AUTO is not set
|
||||
CONFIG_ARCH_MULTI_V6_V7=y
|
||||
CONFIG_ARCH_MULTI_V7=y
|
||||
CONFIG_ARCH_NR_GPIO=0
|
||||
CONFIG_ARCH_REQUIRE_GPIOLIB=y
|
||||
# CONFIG_ARCH_SELECT_MEMORY_MODEL is not set
|
||||
# CONFIG_ARCH_SPARSEMEM_DEFAULT is not set
|
||||
CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y
|
||||
CONFIG_ARCH_SUPPORTS_UPROBES=y
|
||||
CONFIG_ARCH_SUSPEND_POSSIBLE=y
|
||||
CONFIG_ARCH_USE_BUILTIN_BSWAP=y
|
||||
CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y
|
||||
CONFIG_ARCH_WANT_GENERAL_HUGETLB=y
|
||||
CONFIG_ARCH_WANT_IPC_PARSE_VERSION=y
|
||||
CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y
|
||||
CONFIG_ARM=y
|
||||
CONFIG_ARM_AMBA=y
|
||||
CONFIG_ARM_APPENDED_DTB=y
|
||||
CONFIG_ARM_ARCH_TIMER=y
|
||||
CONFIG_ARM_ARCH_TIMER_EVTSTREAM=y
|
||||
# CONFIG_ARM_ATAG_DTB_COMPAT is not set
|
||||
# CONFIG_ARM_CPU_SUSPEND is not set
|
||||
CONFIG_ARM_ERRATA_754322=y
|
||||
CONFIG_ARM_ERRATA_764369=y
|
||||
CONFIG_ARM_ERRATA_775420=y
|
||||
CONFIG_ARM_GIC=y
|
||||
CONFIG_ARM_GLOBAL_TIMER=y
|
||||
CONFIG_ARM_HAS_SG_CHAIN=y
|
||||
CONFIG_ARM_HEAVY_MB=y
|
||||
CONFIG_ARM_L1_CACHE_SHIFT=6
|
||||
CONFIG_ARM_L1_CACHE_SHIFT_6=y
|
||||
# CONFIG_ARM_LPAE is not set
|
||||
CONFIG_ARM_PATCH_PHYS_VIRT=y
|
||||
# CONFIG_ARM_SP805_WATCHDOG is not set
|
||||
CONFIG_ARM_THUMB=y
|
||||
# CONFIG_ARM_THUMBEE is not set
|
||||
CONFIG_ARM_VIRT_EXT=y
|
||||
CONFIG_ATAGS=y
|
||||
CONFIG_AUTO_ZRELADDR=y
|
||||
CONFIG_BCM47XX_NVRAM=y
|
||||
CONFIG_BCM47XX_SPROM=y
|
||||
CONFIG_BCM47XX_WDT=y
|
||||
CONFIG_BCMA=y
|
||||
CONFIG_BCMA_BLOCKIO=y
|
||||
CONFIG_BCMA_DEBUG=y
|
||||
CONFIG_BCMA_DRIVER_GMAC_CMN=y
|
||||
CONFIG_BCMA_DRIVER_GPIO=y
|
||||
CONFIG_BCMA_DRIVER_PCI=y
|
||||
CONFIG_BCMA_HOST_PCI=y
|
||||
CONFIG_BCMA_HOST_PCI_POSSIBLE=y
|
||||
CONFIG_BCMA_HOST_SOC=y
|
||||
CONFIG_BCMA_SFLASH=y
|
||||
CONFIG_BCM_NET_PHYLIB=y
|
||||
CONFIG_BCM_NS_THERMAL=y
|
||||
CONFIG_BGMAC=y
|
||||
CONFIG_BGMAC_BCMA=y
|
||||
# CONFIG_BGMAC_PLATFORM is not set
|
||||
CONFIG_BOUNCE=y
|
||||
CONFIG_BROADCOM_PHY=y
|
||||
CONFIG_CACHE_L2X0=y
|
||||
CONFIG_CC_OPTIMIZE_FOR_SIZE=y
|
||||
CONFIG_CLKDEV_LOOKUP=y
|
||||
CONFIG_CLKSRC_ARM_GLOBAL_TIMER_SCHED_CLOCK=y
|
||||
CONFIG_CLKSRC_MMIO=y
|
||||
CONFIG_CLKSRC_OF=y
|
||||
CONFIG_CLKSRC_PROBE=y
|
||||
CONFIG_CLONE_BACKWARDS=y
|
||||
CONFIG_COMMON_CLK=y
|
||||
CONFIG_COMMON_CLK_IPROC=y
|
||||
CONFIG_CPU_32v6K=y
|
||||
CONFIG_CPU_32v7=y
|
||||
CONFIG_CPU_ABRT_EV7=y
|
||||
# CONFIG_CPU_BPREDICT_DISABLE is not set
|
||||
CONFIG_CPU_CACHE_V7=y
|
||||
CONFIG_CPU_CACHE_VIPT=y
|
||||
CONFIG_CPU_COPY_V6=y
|
||||
CONFIG_CPU_CP15=y
|
||||
CONFIG_CPU_CP15_MMU=y
|
||||
CONFIG_CPU_HAS_ASID=y
|
||||
# CONFIG_CPU_ICACHE_DISABLE is not set
|
||||
CONFIG_CPU_PABRT_V7=y
|
||||
CONFIG_CPU_RMAP=y
|
||||
CONFIG_CPU_TLB_V7=y
|
||||
CONFIG_CPU_V7=y
|
||||
CONFIG_CRC16=y
|
||||
CONFIG_CRYPTO_AEAD=y
|
||||
CONFIG_CRYPTO_AEAD2=y
|
||||
CONFIG_CRYPTO_DEFLATE=y
|
||||
CONFIG_CRYPTO_HASH2=y
|
||||
CONFIG_CRYPTO_LZO=y
|
||||
CONFIG_CRYPTO_MANAGER=y
|
||||
CONFIG_CRYPTO_MANAGER2=y
|
||||
CONFIG_CRYPTO_NULL2=y
|
||||
CONFIG_CRYPTO_RNG2=y
|
||||
CONFIG_CRYPTO_WORKQUEUE=y
|
||||
CONFIG_DCACHE_WORD_ACCESS=y
|
||||
CONFIG_DEBUG_BCM_5301X=y
|
||||
CONFIG_DEBUG_INFO=y
|
||||
CONFIG_DEBUG_LL=y
|
||||
CONFIG_DEBUG_LL_INCLUDE="debug/8250.S"
|
||||
CONFIG_DEBUG_UART_8250=y
|
||||
# CONFIG_DEBUG_UART_8250_FLOW_CONTROL is not set
|
||||
CONFIG_DEBUG_UART_8250_SHIFT=0
|
||||
CONFIG_DEBUG_UART_PHYS=0x18000300
|
||||
CONFIG_DEBUG_UART_VIRT=0xf1000300
|
||||
CONFIG_DEBUG_UNCOMPRESS=y
|
||||
CONFIG_DEBUG_USER=y
|
||||
CONFIG_DTC=y
|
||||
CONFIG_EARLY_PRINTK=y
|
||||
CONFIG_EDAC_ATOMIC_SCRUB=y
|
||||
CONFIG_EDAC_SUPPORT=y
|
||||
CONFIG_FIXED_PHY=y
|
||||
CONFIG_FIX_EARLYCON_MEM=y
|
||||
CONFIG_FRAME_POINTER=y
|
||||
# CONFIG_FW_LOADER_USER_HELPER_FALLBACK is not set
|
||||
CONFIG_GENERIC_ALLOCATOR=y
|
||||
CONFIG_GENERIC_BUG=y
|
||||
CONFIG_GENERIC_CLOCKEVENTS=y
|
||||
CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y
|
||||
CONFIG_GENERIC_IDLE_POLL_SETUP=y
|
||||
CONFIG_GENERIC_IO=y
|
||||
CONFIG_GENERIC_IRQ_SHOW=y
|
||||
CONFIG_GENERIC_IRQ_SHOW_LEVEL=y
|
||||
CONFIG_GENERIC_PCI_IOMAP=y
|
||||
CONFIG_GENERIC_PINCONF=y
|
||||
CONFIG_GENERIC_SCHED_CLOCK=y
|
||||
CONFIG_GENERIC_SMP_IDLE_THREAD=y
|
||||
CONFIG_GENERIC_STRNCPY_FROM_USER=y
|
||||
CONFIG_GENERIC_STRNLEN_USER=y
|
||||
CONFIG_GPIOLIB=y
|
||||
CONFIG_GPIOLIB_IRQCHIP=y
|
||||
CONFIG_GPIO_74X164=y
|
||||
CONFIG_GPIO_DEVRES=y
|
||||
CONFIG_GPIO_SYSFS=y
|
||||
CONFIG_HANDLE_DOMAIN_IRQ=y
|
||||
CONFIG_HARDIRQS_SW_RESEND=y
|
||||
CONFIG_HAS_DMA=y
|
||||
CONFIG_HAS_IOMEM=y
|
||||
CONFIG_HAS_IOPORT_MAP=y
|
||||
# CONFIG_HAVE_64BIT_ALIGNED_ACCESS is not set
|
||||
CONFIG_HAVE_ARCH_AUDITSYSCALL=y
|
||||
CONFIG_HAVE_ARCH_BITREVERSE=y
|
||||
CONFIG_HAVE_ARCH_JUMP_LABEL=y
|
||||
CONFIG_HAVE_ARCH_KGDB=y
|
||||
CONFIG_HAVE_ARCH_PFN_VALID=y
|
||||
CONFIG_HAVE_ARCH_SECCOMP_FILTER=y
|
||||
CONFIG_HAVE_ARCH_TRACEHOOK=y
|
||||
CONFIG_HAVE_ARM_ARCH_TIMER=y
|
||||
CONFIG_HAVE_ARM_SCU=y
|
||||
CONFIG_HAVE_ARM_TWD=y
|
||||
# CONFIG_HAVE_BOOTMEM_INFO_NODE is not set
|
||||
CONFIG_HAVE_BPF_JIT=y
|
||||
CONFIG_HAVE_CC_STACKPROTECTOR=y
|
||||
CONFIG_HAVE_CLK=y
|
||||
CONFIG_HAVE_CLK_PREPARE=y
|
||||
CONFIG_HAVE_CONTEXT_TRACKING=y
|
||||
CONFIG_HAVE_C_RECORDMCOUNT=y
|
||||
CONFIG_HAVE_DEBUG_KMEMLEAK=y
|
||||
CONFIG_HAVE_DMA_API_DEBUG=y
|
||||
CONFIG_HAVE_DMA_ATTRS=y
|
||||
CONFIG_HAVE_DMA_CONTIGUOUS=y
|
||||
CONFIG_HAVE_DYNAMIC_FTRACE=y
|
||||
CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y
|
||||
CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y
|
||||
CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y
|
||||
CONFIG_HAVE_FUNCTION_TRACER=y
|
||||
CONFIG_HAVE_GENERIC_DMA_COHERENT=y
|
||||
CONFIG_HAVE_IDE=y
|
||||
CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y
|
||||
CONFIG_HAVE_MEMBLOCK=y
|
||||
CONFIG_HAVE_MOD_ARCH_SPECIFIC=y
|
||||
CONFIG_HAVE_NET_DSA=y
|
||||
CONFIG_HAVE_OPROFILE=y
|
||||
CONFIG_HAVE_OPTPROBES=y
|
||||
CONFIG_HAVE_PERF_EVENTS=y
|
||||
CONFIG_HAVE_PERF_REGS=y
|
||||
CONFIG_HAVE_PERF_USER_STACK_DUMP=y
|
||||
CONFIG_HAVE_PROC_CPU=y
|
||||
CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y
|
||||
CONFIG_HAVE_SMP=y
|
||||
CONFIG_HAVE_SYSCALL_TRACEPOINTS=y
|
||||
CONFIG_HAVE_UID16=y
|
||||
CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y
|
||||
CONFIG_HIGHMEM=y
|
||||
# CONFIG_HIGHPTE is not set
|
||||
CONFIG_HZ_FIXED=0
|
||||
CONFIG_HZ_PERIODIC=y
|
||||
CONFIG_INITRAMFS_SOURCE=""
|
||||
CONFIG_IOMMU_HELPER=y
|
||||
CONFIG_IRQCHIP=y
|
||||
CONFIG_IRQ_DOMAIN=y
|
||||
CONFIG_IRQ_DOMAIN_HIERARCHY=y
|
||||
CONFIG_IRQ_FORCED_THREADING=y
|
||||
CONFIG_IRQ_WORK=y
|
||||
CONFIG_LIBFDT=y
|
||||
CONFIG_LOCK_SPIN_ON_OWNER=y
|
||||
CONFIG_LZO_COMPRESS=y
|
||||
CONFIG_LZO_DECOMPRESS=y
|
||||
# CONFIG_MDIO_BCM_IPROC is not set
|
||||
CONFIG_MDIO_BOARDINFO=y
|
||||
CONFIG_MFD_SYSCON=y
|
||||
CONFIG_MIGHT_HAVE_CACHE_L2X0=y
|
||||
CONFIG_MIGHT_HAVE_PCI=y
|
||||
CONFIG_MODULES_USE_ELF_REL=y
|
||||
CONFIG_MTD_BCM47XXSFLASH=y
|
||||
CONFIG_MTD_BCM47XX_PARTS=y
|
||||
CONFIG_MTD_M25P80=y
|
||||
CONFIG_MTD_NAND=y
|
||||
CONFIG_MTD_NAND_BRCMNAND=y
|
||||
CONFIG_MTD_NAND_ECC=y
|
||||
# CONFIG_MTD_PHYSMAP_OF is not set
|
||||
CONFIG_MTD_SPI_NOR=y
|
||||
CONFIG_MTD_SPLIT_FIRMWARE=y
|
||||
CONFIG_MTD_SPLIT_SEAMA_FW=y
|
||||
CONFIG_MTD_UBI=y
|
||||
CONFIG_MTD_UBI_BEB_LIMIT=20
|
||||
CONFIG_MTD_UBI_BLOCK=y
|
||||
# CONFIG_MTD_UBI_FASTMAP is not set
|
||||
# CONFIG_MTD_UBI_GLUEBI is not set
|
||||
CONFIG_MTD_UBI_WL_THRESHOLD=4096
|
||||
CONFIG_MULTI_IRQ_HANDLER=y
|
||||
CONFIG_MUTEX_SPIN_ON_OWNER=y
|
||||
CONFIG_NEED_DMA_MAP_STATE=y
|
||||
CONFIG_NET_FLOW_LIMIT=y
|
||||
CONFIG_NO_BOOTMEM=y
|
||||
CONFIG_NR_CPUS=2
|
||||
CONFIG_OF=y
|
||||
CONFIG_OF_ADDRESS=y
|
||||
CONFIG_OF_ADDRESS_PCI=y
|
||||
CONFIG_OF_EARLY_FLATTREE=y
|
||||
CONFIG_OF_FLATTREE=y
|
||||
CONFIG_OF_GPIO=y
|
||||
CONFIG_OF_IRQ=y
|
||||
CONFIG_OF_MDIO=y
|
||||
CONFIG_OF_MTD=y
|
||||
CONFIG_OF_NET=y
|
||||
CONFIG_OF_PCI=y
|
||||
CONFIG_OF_PCI_IRQ=y
|
||||
CONFIG_OF_RESERVED_MEM=y
|
||||
CONFIG_OLD_SIGACTION=y
|
||||
CONFIG_OLD_SIGSUSPEND3=y
|
||||
CONFIG_OUTER_CACHE=y
|
||||
CONFIG_OUTER_CACHE_SYNC=y
|
||||
CONFIG_PADATA=y
|
||||
CONFIG_PAGE_OFFSET=0xC0000000
|
||||
CONFIG_PCI=y
|
||||
CONFIG_PCIE_IPROC=y
|
||||
CONFIG_PCIE_IPROC_BCMA=y
|
||||
# CONFIG_PCIE_IPROC_PLATFORM is not set
|
||||
CONFIG_PCI_DOMAINS=y
|
||||
CONFIG_PCI_DOMAINS_GENERIC=y
|
||||
CONFIG_PERF_USE_VMALLOC=y
|
||||
CONFIG_PGTABLE_LEVELS=2
|
||||
CONFIG_PHYLIB=y
|
||||
# CONFIG_PHY_BCM_NS_USB2 is not set
|
||||
# CONFIG_PHY_BCM_NS_USB3 is not set
|
||||
CONFIG_PINCTRL=y
|
||||
# CONFIG_PL310_ERRATA_588369 is not set
|
||||
# CONFIG_PL310_ERRATA_727915 is not set
|
||||
# CONFIG_PL310_ERRATA_753970 is not set
|
||||
# CONFIG_PL310_ERRATA_769419 is not set
|
||||
CONFIG_RATIONAL=y
|
||||
CONFIG_RCU_STALL_COMMON=y
|
||||
CONFIG_REGMAP=y
|
||||
CONFIG_REGMAP_MMIO=y
|
||||
CONFIG_RFS_ACCEL=y
|
||||
CONFIG_RPS=y
|
||||
CONFIG_RWSEM_SPIN_ON_OWNER=y
|
||||
CONFIG_RWSEM_XCHGADD_ALGORITHM=y
|
||||
# CONFIG_SCHED_INFO is not set
|
||||
# CONFIG_SCSI_DMA is not set
|
||||
CONFIG_SERIAL_8250_FSL=y
|
||||
# CONFIG_SERIAL_AMBA_PL010 is not set
|
||||
# CONFIG_SERIAL_AMBA_PL011 is not set
|
||||
CONFIG_SERIAL_OF_PLATFORM=y
|
||||
CONFIG_SMP=y
|
||||
CONFIG_SMP_ON_UP=y
|
||||
CONFIG_SPARSE_IRQ=y
|
||||
CONFIG_SPI=y
|
||||
CONFIG_SPI_BCM53XX=y
|
||||
# CONFIG_SPI_BCM_QSPI is not set
|
||||
CONFIG_SPI_BITBANG=y
|
||||
CONFIG_SPI_GPIO=y
|
||||
CONFIG_SPI_MASTER=y
|
||||
CONFIG_SRCU=y
|
||||
CONFIG_SWCONFIG=y
|
||||
CONFIG_SWCONFIG_B53=y
|
||||
# CONFIG_SWCONFIG_B53_MMAP_DRIVER is not set
|
||||
CONFIG_SWCONFIG_B53_PHY_DRIVER=y
|
||||
CONFIG_SWCONFIG_B53_PHY_FIXUP=y
|
||||
CONFIG_SWCONFIG_B53_SRAB_DRIVER=y
|
||||
CONFIG_SWIOTLB=y
|
||||
CONFIG_SWP_EMULATE=y
|
||||
CONFIG_SYS_SUPPORTS_APM_EMULATION=y
|
||||
CONFIG_THERMAL=y
|
||||
CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y
|
||||
CONFIG_THERMAL_GOV_STEP_WISE=y
|
||||
CONFIG_THERMAL_OF=y
|
||||
# CONFIG_THUMB2_KERNEL is not set
|
||||
CONFIG_TICK_CPU_ACCOUNTING=y
|
||||
CONFIG_TREE_RCU=y
|
||||
CONFIG_UBIFS_FS=y
|
||||
# CONFIG_UBIFS_FS_ADVANCED_COMPR is not set
|
||||
CONFIG_UBIFS_FS_LZO=y
|
||||
CONFIG_UBIFS_FS_ZLIB=y
|
||||
CONFIG_UNCOMPRESS_INCLUDE="debug/uncompress.h"
|
||||
CONFIG_USB_SUPPORT=y
|
||||
CONFIG_USE_OF=y
|
||||
CONFIG_VECTORS_BASE=0xffff0000
|
||||
# CONFIG_VFP is not set
|
||||
CONFIG_WATCHDOG_CORE=y
|
||||
CONFIG_XPS=y
|
||||
CONFIG_XZ_DEC_ARM=y
|
||||
CONFIG_XZ_DEC_BCJ=y
|
||||
CONFIG_ZBOOT_ROM_BSS=0x0
|
||||
CONFIG_ZBOOT_ROM_TEXT=0x0
|
||||
CONFIG_ZLIB_DEFLATE=y
|
||||
CONFIG_ZLIB_INFLATE=y
|
||||
CONFIG_ZONE_DMA_FLAG=0
|
|
@ -1,339 +0,0 @@
|
|||
CONFIG_ALIGNMENT_TRAP=y
|
||||
CONFIG_ARCH_BCM=y
|
||||
CONFIG_ARCH_BCM_5301X=y
|
||||
CONFIG_ARCH_BCM_53573=y
|
||||
CONFIG_ARCH_BCM_IPROC=y
|
||||
CONFIG_ARCH_CLOCKSOURCE_DATA=y
|
||||
CONFIG_ARCH_HAS_ELF_RANDOMIZE=y
|
||||
CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y
|
||||
CONFIG_ARCH_HAS_SG_CHAIN=y
|
||||
CONFIG_ARCH_HAS_TICK_BROADCAST=y
|
||||
CONFIG_ARCH_HAVE_CUSTOM_GPIO_H=y
|
||||
CONFIG_ARCH_HIBERNATION_POSSIBLE=y
|
||||
CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y
|
||||
CONFIG_ARCH_MULTIPLATFORM=y
|
||||
# CONFIG_ARCH_MULTI_CPU_AUTO is not set
|
||||
CONFIG_ARCH_MULTI_V6_V7=y
|
||||
CONFIG_ARCH_MULTI_V7=y
|
||||
CONFIG_ARCH_NR_GPIO=0
|
||||
# CONFIG_ARCH_SELECT_MEMORY_MODEL is not set
|
||||
# CONFIG_ARCH_SPARSEMEM_DEFAULT is not set
|
||||
CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y
|
||||
CONFIG_ARCH_SUPPORTS_UPROBES=y
|
||||
CONFIG_ARCH_SUSPEND_POSSIBLE=y
|
||||
CONFIG_ARCH_USE_BUILTIN_BSWAP=y
|
||||
CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y
|
||||
CONFIG_ARCH_WANT_GENERAL_HUGETLB=y
|
||||
CONFIG_ARCH_WANT_IPC_PARSE_VERSION=y
|
||||
CONFIG_ARM=y
|
||||
CONFIG_ARM_AMBA=y
|
||||
CONFIG_ARM_APPENDED_DTB=y
|
||||
CONFIG_ARM_ARCH_TIMER=y
|
||||
CONFIG_ARM_ARCH_TIMER_EVTSTREAM=y
|
||||
# CONFIG_ARM_ATAG_DTB_COMPAT is not set
|
||||
# CONFIG_ARM_CPU_SUSPEND is not set
|
||||
CONFIG_ARM_ERRATA_754322=y
|
||||
CONFIG_ARM_ERRATA_764369=y
|
||||
CONFIG_ARM_ERRATA_775420=y
|
||||
CONFIG_ARM_GIC=y
|
||||
CONFIG_ARM_GLOBAL_TIMER=y
|
||||
CONFIG_ARM_HAS_SG_CHAIN=y
|
||||
CONFIG_ARM_HEAVY_MB=y
|
||||
CONFIG_ARM_L1_CACHE_SHIFT=6
|
||||
CONFIG_ARM_L1_CACHE_SHIFT_6=y
|
||||
# CONFIG_ARM_LPAE is not set
|
||||
CONFIG_ARM_PATCH_IDIV=y
|
||||
CONFIG_ARM_PATCH_PHYS_VIRT=y
|
||||
# CONFIG_ARM_SP805_WATCHDOG is not set
|
||||
CONFIG_ARM_THUMB=y
|
||||
# CONFIG_ARM_THUMBEE is not set
|
||||
CONFIG_ARM_VIRT_EXT=y
|
||||
CONFIG_ATAGS=y
|
||||
CONFIG_AUTO_ZRELADDR=y
|
||||
CONFIG_BCM47XX_NVRAM=y
|
||||
CONFIG_BCM47XX_SPROM=y
|
||||
CONFIG_BCM47XX_WDT=y
|
||||
CONFIG_BCMA=y
|
||||
CONFIG_BCMA_BLOCKIO=y
|
||||
CONFIG_BCMA_DEBUG=y
|
||||
CONFIG_BCMA_DRIVER_GMAC_CMN=y
|
||||
CONFIG_BCMA_DRIVER_GPIO=y
|
||||
CONFIG_BCMA_DRIVER_PCI=y
|
||||
CONFIG_BCMA_HOST_PCI=y
|
||||
CONFIG_BCMA_HOST_PCI_POSSIBLE=y
|
||||
CONFIG_BCMA_HOST_SOC=y
|
||||
CONFIG_BCMA_SFLASH=y
|
||||
CONFIG_BCM_NET_PHYLIB=y
|
||||
CONFIG_BCM_NS_THERMAL=y
|
||||
CONFIG_BGMAC=y
|
||||
CONFIG_BGMAC_BCMA=y
|
||||
# CONFIG_BGMAC_PLATFORM is not set
|
||||
# CONFIG_BINFMT_FLAT is not set
|
||||
CONFIG_BLK_MQ_PCI=y
|
||||
CONFIG_BOUNCE=y
|
||||
CONFIG_BROADCOM_PHY=y
|
||||
CONFIG_CACHE_L2X0=y
|
||||
CONFIG_CLKDEV_LOOKUP=y
|
||||
CONFIG_CLKSRC_ARM_GLOBAL_TIMER_SCHED_CLOCK=y
|
||||
CONFIG_CLKSRC_MMIO=y
|
||||
CONFIG_CLKSRC_OF=y
|
||||
CONFIG_CLKSRC_PROBE=y
|
||||
# CONFIG_CLK_BCM_NS2 is not set
|
||||
CONFIG_CLK_BCM_NSP=y
|
||||
CONFIG_CLONE_BACKWARDS=y
|
||||
CONFIG_COMMON_CLK=y
|
||||
CONFIG_COMMON_CLK_IPROC=y
|
||||
CONFIG_CPU_32v6K=y
|
||||
CONFIG_CPU_32v7=y
|
||||
CONFIG_CPU_ABRT_EV7=y
|
||||
# CONFIG_CPU_BPREDICT_DISABLE is not set
|
||||
CONFIG_CPU_CACHE_V7=y
|
||||
CONFIG_CPU_CACHE_VIPT=y
|
||||
CONFIG_CPU_COPY_V6=y
|
||||
CONFIG_CPU_CP15=y
|
||||
CONFIG_CPU_CP15_MMU=y
|
||||
CONFIG_CPU_HAS_ASID=y
|
||||
# CONFIG_CPU_ICACHE_DISABLE is not set
|
||||
CONFIG_CPU_PABRT_V7=y
|
||||
CONFIG_CPU_RMAP=y
|
||||
CONFIG_CPU_TLB_V7=y
|
||||
CONFIG_CPU_V7=y
|
||||
CONFIG_CRC16=y
|
||||
CONFIG_CRYPTO_AEAD=y
|
||||
CONFIG_CRYPTO_AEAD2=y
|
||||
CONFIG_CRYPTO_DEFLATE=y
|
||||
CONFIG_CRYPTO_HASH2=y
|
||||
CONFIG_CRYPTO_LZO=y
|
||||
CONFIG_CRYPTO_MANAGER=y
|
||||
CONFIG_CRYPTO_MANAGER2=y
|
||||
CONFIG_CRYPTO_NULL2=y
|
||||
CONFIG_CRYPTO_RNG2=y
|
||||
CONFIG_CRYPTO_WORKQUEUE=y
|
||||
CONFIG_DCACHE_WORD_ACCESS=y
|
||||
CONFIG_DEBUG_BCM_5301X=y
|
||||
CONFIG_DEBUG_INFO=y
|
||||
CONFIG_DEBUG_LL=y
|
||||
CONFIG_DEBUG_LL_INCLUDE="debug/8250.S"
|
||||
CONFIG_DEBUG_UART_8250=y
|
||||
# CONFIG_DEBUG_UART_8250_FLOW_CONTROL is not set
|
||||
CONFIG_DEBUG_UART_8250_SHIFT=0
|
||||
CONFIG_DEBUG_UART_PHYS=0x18000300
|
||||
CONFIG_DEBUG_UART_VIRT=0xf1000300
|
||||
CONFIG_DEBUG_UNCOMPRESS=y
|
||||
CONFIG_DEBUG_USER=y
|
||||
CONFIG_DTC=y
|
||||
CONFIG_EARLY_PRINTK=y
|
||||
CONFIG_EDAC_ATOMIC_SCRUB=y
|
||||
CONFIG_EDAC_SUPPORT=y
|
||||
CONFIG_FIXED_PHY=y
|
||||
CONFIG_FIX_EARLYCON_MEM=y
|
||||
CONFIG_FRAME_POINTER=y
|
||||
# CONFIG_FW_LOADER_USER_HELPER_FALLBACK is not set
|
||||
CONFIG_GENERIC_ALLOCATOR=y
|
||||
CONFIG_GENERIC_BUG=y
|
||||
CONFIG_GENERIC_CLOCKEVENTS=y
|
||||
CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y
|
||||
CONFIG_GENERIC_EARLY_IOREMAP=y
|
||||
CONFIG_GENERIC_IDLE_POLL_SETUP=y
|
||||
CONFIG_GENERIC_IO=y
|
||||
CONFIG_GENERIC_IRQ_SHOW=y
|
||||
CONFIG_GENERIC_IRQ_SHOW_LEVEL=y
|
||||
CONFIG_GENERIC_PCI_IOMAP=y
|
||||
CONFIG_GENERIC_PINCONF=y
|
||||
CONFIG_GENERIC_SCHED_CLOCK=y
|
||||
CONFIG_GENERIC_SMP_IDLE_THREAD=y
|
||||
CONFIG_GENERIC_STRNCPY_FROM_USER=y
|
||||
CONFIG_GENERIC_STRNLEN_USER=y
|
||||
CONFIG_GPIOLIB=y
|
||||
CONFIG_GPIOLIB_IRQCHIP=y
|
||||
CONFIG_GPIO_74X164=y
|
||||
CONFIG_GPIO_SYSFS=y
|
||||
CONFIG_HANDLE_DOMAIN_IRQ=y
|
||||
CONFIG_HARDIRQS_SW_RESEND=y
|
||||
CONFIG_HAS_DMA=y
|
||||
CONFIG_HAS_IOMEM=y
|
||||
CONFIG_HAS_IOPORT_MAP=y
|
||||
# CONFIG_HAVE_64BIT_ALIGNED_ACCESS is not set
|
||||
CONFIG_HAVE_ARCH_AUDITSYSCALL=y
|
||||
CONFIG_HAVE_ARCH_BITREVERSE=y
|
||||
CONFIG_HAVE_ARCH_JUMP_LABEL=y
|
||||
CONFIG_HAVE_ARCH_KGDB=y
|
||||
CONFIG_HAVE_ARCH_PFN_VALID=y
|
||||
CONFIG_HAVE_ARCH_SECCOMP_FILTER=y
|
||||
CONFIG_HAVE_ARCH_TRACEHOOK=y
|
||||
CONFIG_HAVE_ARM_ARCH_TIMER=y
|
||||
CONFIG_HAVE_ARM_SCU=y
|
||||
CONFIG_HAVE_ARM_SMCCC=y
|
||||
CONFIG_HAVE_ARM_TWD=y
|
||||
# CONFIG_HAVE_BOOTMEM_INFO_NODE is not set
|
||||
CONFIG_HAVE_CBPF_JIT=y
|
||||
CONFIG_HAVE_CC_STACKPROTECTOR=y
|
||||
CONFIG_HAVE_CLK=y
|
||||
CONFIG_HAVE_CLK_PREPARE=y
|
||||
CONFIG_HAVE_CONTEXT_TRACKING=y
|
||||
CONFIG_HAVE_C_RECORDMCOUNT=y
|
||||
CONFIG_HAVE_DEBUG_KMEMLEAK=y
|
||||
CONFIG_HAVE_DMA_API_DEBUG=y
|
||||
CONFIG_HAVE_DMA_CONTIGUOUS=y
|
||||
CONFIG_HAVE_DYNAMIC_FTRACE=y
|
||||
CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y
|
||||
CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y
|
||||
CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y
|
||||
CONFIG_HAVE_FUNCTION_TRACER=y
|
||||
CONFIG_HAVE_GENERIC_DMA_COHERENT=y
|
||||
CONFIG_HAVE_IDE=y
|
||||
CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y
|
||||
CONFIG_HAVE_MEMBLOCK=y
|
||||
CONFIG_HAVE_MOD_ARCH_SPECIFIC=y
|
||||
CONFIG_HAVE_NET_DSA=y
|
||||
CONFIG_HAVE_OPROFILE=y
|
||||
CONFIG_HAVE_OPTPROBES=y
|
||||
CONFIG_HAVE_PERF_EVENTS=y
|
||||
CONFIG_HAVE_PERF_REGS=y
|
||||
CONFIG_HAVE_PERF_USER_STACK_DUMP=y
|
||||
CONFIG_HAVE_PROC_CPU=y
|
||||
CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y
|
||||
CONFIG_HAVE_SMP=y
|
||||
CONFIG_HAVE_SYSCALL_TRACEPOINTS=y
|
||||
CONFIG_HAVE_UID16=y
|
||||
CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y
|
||||
CONFIG_HIGHMEM=y
|
||||
# CONFIG_HIGHPTE is not set
|
||||
CONFIG_HZ_FIXED=0
|
||||
CONFIG_HZ_PERIODIC=y
|
||||
CONFIG_INITRAMFS_SOURCE=""
|
||||
CONFIG_IOMMU_HELPER=y
|
||||
CONFIG_IRQCHIP=y
|
||||
CONFIG_IRQ_DOMAIN=y
|
||||
CONFIG_IRQ_DOMAIN_HIERARCHY=y
|
||||
CONFIG_IRQ_FORCED_THREADING=y
|
||||
CONFIG_IRQ_WORK=y
|
||||
CONFIG_LIBFDT=y
|
||||
CONFIG_LOCK_SPIN_ON_OWNER=y
|
||||
CONFIG_LZO_COMPRESS=y
|
||||
CONFIG_LZO_DECOMPRESS=y
|
||||
# CONFIG_MDIO_BCM_IPROC is not set
|
||||
CONFIG_MDIO_BOARDINFO=y
|
||||
# CONFIG_MDIO_BUS_MUX_BCM_IPROC is not set
|
||||
CONFIG_MFD_SYSCON=y
|
||||
CONFIG_MIGHT_HAVE_CACHE_L2X0=y
|
||||
CONFIG_MIGHT_HAVE_PCI=y
|
||||
CONFIG_MODULES_USE_ELF_REL=y
|
||||
CONFIG_MTD_BCM47XXSFLASH=y
|
||||
CONFIG_MTD_BCM47XX_PARTS=y
|
||||
CONFIG_MTD_M25P80=y
|
||||
CONFIG_MTD_NAND=y
|
||||
CONFIG_MTD_NAND_BRCMNAND=y
|
||||
CONFIG_MTD_NAND_ECC=y
|
||||
CONFIG_MTD_PARSER_TRX=y
|
||||
# CONFIG_MTD_PHYSMAP_OF is not set
|
||||
CONFIG_MTD_SPI_NOR=y
|
||||
CONFIG_MTD_SPLIT_FIRMWARE=y
|
||||
CONFIG_MTD_SPLIT_SEAMA_FW=y
|
||||
CONFIG_MTD_UBI=y
|
||||
CONFIG_MTD_UBI_BEB_LIMIT=20
|
||||
CONFIG_MTD_UBI_BLOCK=y
|
||||
# CONFIG_MTD_UBI_FASTMAP is not set
|
||||
# CONFIG_MTD_UBI_GLUEBI is not set
|
||||
CONFIG_MTD_UBI_WL_THRESHOLD=4096
|
||||
CONFIG_MULTI_IRQ_HANDLER=y
|
||||
CONFIG_MUTEX_SPIN_ON_OWNER=y
|
||||
CONFIG_NEED_DMA_MAP_STATE=y
|
||||
CONFIG_NET_FLOW_LIMIT=y
|
||||
CONFIG_NO_BOOTMEM=y
|
||||
CONFIG_NR_CPUS=2
|
||||
CONFIG_OF=y
|
||||
CONFIG_OF_ADDRESS=y
|
||||
CONFIG_OF_ADDRESS_PCI=y
|
||||
CONFIG_OF_EARLY_FLATTREE=y
|
||||
CONFIG_OF_FLATTREE=y
|
||||
CONFIG_OF_GPIO=y
|
||||
CONFIG_OF_IRQ=y
|
||||
CONFIG_OF_MDIO=y
|
||||
CONFIG_OF_NET=y
|
||||
CONFIG_OF_PCI=y
|
||||
CONFIG_OF_PCI_IRQ=y
|
||||
CONFIG_OF_RESERVED_MEM=y
|
||||
CONFIG_OLD_SIGACTION=y
|
||||
CONFIG_OLD_SIGSUSPEND3=y
|
||||
CONFIG_OUTER_CACHE=y
|
||||
CONFIG_OUTER_CACHE_SYNC=y
|
||||
CONFIG_PADATA=y
|
||||
CONFIG_PAGE_OFFSET=0xC0000000
|
||||
CONFIG_PCI=y
|
||||
CONFIG_PCIE_IPROC=y
|
||||
CONFIG_PCIE_IPROC_BCMA=y
|
||||
# CONFIG_PCIE_IPROC_PLATFORM is not set
|
||||
CONFIG_PCI_DOMAINS=y
|
||||
CONFIG_PCI_DOMAINS_GENERIC=y
|
||||
CONFIG_PERF_USE_VMALLOC=y
|
||||
CONFIG_PGTABLE_LEVELS=2
|
||||
CONFIG_PHYLIB=y
|
||||
# CONFIG_PHY_BCM_NS_USB2 is not set
|
||||
# CONFIG_PHY_BCM_NS_USB3 is not set
|
||||
# CONFIG_PHY_BRCM_SATA is not set
|
||||
CONFIG_PINCTRL=y
|
||||
# CONFIG_PINCTRL_IPROC_GPIO is not set
|
||||
# CONFIG_PINCTRL_NS2_MUX is not set
|
||||
# CONFIG_PL310_ERRATA_588369 is not set
|
||||
# CONFIG_PL310_ERRATA_727915 is not set
|
||||
# CONFIG_PL310_ERRATA_753970 is not set
|
||||
# CONFIG_PL310_ERRATA_769419 is not set
|
||||
CONFIG_RATIONAL=y
|
||||
CONFIG_RCU_STALL_COMMON=y
|
||||
CONFIG_REGMAP=y
|
||||
CONFIG_REGMAP_MMIO=y
|
||||
CONFIG_RFS_ACCEL=y
|
||||
CONFIG_RPS=y
|
||||
CONFIG_RWSEM_SPIN_ON_OWNER=y
|
||||
CONFIG_RWSEM_XCHGADD_ALGORITHM=y
|
||||
# CONFIG_SCHED_INFO is not set
|
||||
# CONFIG_SCSI_DMA is not set
|
||||
CONFIG_SERIAL_8250_FSL=y
|
||||
# CONFIG_SERIAL_AMBA_PL010 is not set
|
||||
# CONFIG_SERIAL_AMBA_PL011 is not set
|
||||
CONFIG_SERIAL_OF_PLATFORM=y
|
||||
CONFIG_SMP=y
|
||||
CONFIG_SMP_ON_UP=y
|
||||
CONFIG_SPARSE_IRQ=y
|
||||
CONFIG_SPI=y
|
||||
CONFIG_SPI_BCM53XX=y
|
||||
CONFIG_SPI_BITBANG=y
|
||||
# CONFIG_SPI_CADENCE_QUADSPI is not set
|
||||
CONFIG_SPI_GPIO=y
|
||||
CONFIG_SPI_MASTER=y
|
||||
CONFIG_SRCU=y
|
||||
CONFIG_SWCONFIG=y
|
||||
CONFIG_SWCONFIG_B53=y
|
||||
# CONFIG_SWCONFIG_B53_MMAP_DRIVER is not set
|
||||
CONFIG_SWCONFIG_B53_PHY_DRIVER=y
|
||||
CONFIG_SWCONFIG_B53_PHY_FIXUP=y
|
||||
CONFIG_SWCONFIG_B53_SRAB_DRIVER=y
|
||||
CONFIG_SWIOTLB=y
|
||||
CONFIG_SWPHY=y
|
||||
CONFIG_SWP_EMULATE=y
|
||||
CONFIG_SYS_SUPPORTS_APM_EMULATION=y
|
||||
CONFIG_THERMAL=y
|
||||
CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y
|
||||
CONFIG_THERMAL_GOV_STEP_WISE=y
|
||||
CONFIG_THERMAL_OF=y
|
||||
# CONFIG_THUMB2_KERNEL is not set
|
||||
CONFIG_TICK_CPU_ACCOUNTING=y
|
||||
CONFIG_TREE_RCU=y
|
||||
CONFIG_UBIFS_FS=y
|
||||
# CONFIG_UBIFS_FS_ADVANCED_COMPR is not set
|
||||
CONFIG_UBIFS_FS_LZO=y
|
||||
CONFIG_UBIFS_FS_ZLIB=y
|
||||
CONFIG_UNCOMPRESS_INCLUDE="debug/uncompress.h"
|
||||
CONFIG_USB_SUPPORT=y
|
||||
CONFIG_USE_OF=y
|
||||
CONFIG_VECTORS_BASE=0xffff0000
|
||||
# CONFIG_VFP is not set
|
||||
CONFIG_WATCHDOG_CORE=y
|
||||
CONFIG_XPS=y
|
||||
CONFIG_XZ_DEC_ARM=y
|
||||
CONFIG_XZ_DEC_BCJ=y
|
||||
CONFIG_ZBOOT_ROM_BSS=0x0
|
||||
CONFIG_ZBOOT_ROM_TEXT=0x0
|
||||
CONFIG_ZLIB_DEFLATE=y
|
||||
CONFIG_ZLIB_INFLATE=y
|
|
@ -1,737 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2004 Florian Schirmer <jolt@tuxbox.org>
|
||||
* Copyright (C) 2006 Felix Fietkau <nbd@nbd.name>
|
||||
* Copyright (C) 2006 Michael Buesch <m@bues.ch>
|
||||
* Copyright (C) 2010 Waldemar Brodkorb <wbx@openadk.org>
|
||||
* Copyright (C) 2010-2012 Hauke Mehrtens <hauke@hauke-m.de>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation; either version 2 of the License, or (at your
|
||||
* option) any later version.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
|
||||
* NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
||||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#include <linux/bcm47xx_nvram.h>
|
||||
#include <linux/bcma/bcma.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/if_ether.h>
|
||||
#include <linux/ssb/ssb.h>
|
||||
|
||||
static void create_key(const char *prefix, const char *postfix,
|
||||
const char *name, char *buf, int len)
|
||||
{
|
||||
if (prefix && postfix)
|
||||
snprintf(buf, len, "%s%s%s", prefix, name, postfix);
|
||||
else if (prefix)
|
||||
snprintf(buf, len, "%s%s", prefix, name);
|
||||
else if (postfix)
|
||||
snprintf(buf, len, "%s%s", name, postfix);
|
||||
else
|
||||
snprintf(buf, len, "%s", name);
|
||||
}
|
||||
|
||||
static int get_nvram_var(const char *prefix, const char *postfix,
|
||||
const char *name, char *buf, int len, bool fallback)
|
||||
{
|
||||
char key[40];
|
||||
int err;
|
||||
|
||||
create_key(prefix, postfix, name, key, sizeof(key));
|
||||
|
||||
err = bcm47xx_nvram_getenv(key, buf, len);
|
||||
if (fallback && err == -ENOENT && prefix) {
|
||||
create_key(NULL, postfix, name, key, sizeof(key));
|
||||
err = bcm47xx_nvram_getenv(key, buf, len);
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
#define NVRAM_READ_VAL(type) \
|
||||
static void nvram_read_ ## type(const char *prefix, \
|
||||
const char *postfix, const char *name, \
|
||||
type *val, type allset, bool fallback) \
|
||||
{ \
|
||||
char buf[100]; \
|
||||
int err; \
|
||||
type var; \
|
||||
\
|
||||
err = get_nvram_var(prefix, postfix, name, buf, sizeof(buf), \
|
||||
fallback); \
|
||||
if (err < 0) \
|
||||
return; \
|
||||
err = kstrto ## type(strim(buf), 0, &var); \
|
||||
if (err) { \
|
||||
pr_warn("can not parse nvram name %s%s%s with value %s got %i\n", \
|
||||
prefix, name, postfix, buf, err); \
|
||||
return; \
|
||||
} \
|
||||
if (allset && var == allset) \
|
||||
return; \
|
||||
*val = var; \
|
||||
}
|
||||
|
||||
NVRAM_READ_VAL(u8)
|
||||
NVRAM_READ_VAL(s8)
|
||||
NVRAM_READ_VAL(u16)
|
||||
NVRAM_READ_VAL(u32)
|
||||
|
||||
#undef NVRAM_READ_VAL
|
||||
|
||||
static void nvram_read_u32_2(const char *prefix, const char *name,
|
||||
u16 *val_lo, u16 *val_hi, bool fallback)
|
||||
{
|
||||
char buf[100];
|
||||
int err;
|
||||
u32 val;
|
||||
|
||||
err = get_nvram_var(prefix, NULL, name, buf, sizeof(buf), fallback);
|
||||
if (err < 0)
|
||||
return;
|
||||
err = kstrtou32(strim(buf), 0, &val);
|
||||
if (err) {
|
||||
pr_warn("can not parse nvram name %s%s with value %s got %i\n",
|
||||
prefix, name, buf, err);
|
||||
return;
|
||||
}
|
||||
*val_lo = (val & 0x0000FFFFU);
|
||||
*val_hi = (val & 0xFFFF0000U) >> 16;
|
||||
}
|
||||
|
||||
static void nvram_read_leddc(const char *prefix, const char *name,
|
||||
u8 *leddc_on_time, u8 *leddc_off_time,
|
||||
bool fallback)
|
||||
{
|
||||
char buf[100];
|
||||
int err;
|
||||
u32 val;
|
||||
|
||||
err = get_nvram_var(prefix, NULL, name, buf, sizeof(buf), fallback);
|
||||
if (err < 0)
|
||||
return;
|
||||
err = kstrtou32(strim(buf), 0, &val);
|
||||
if (err) {
|
||||
pr_warn("can not parse nvram name %s%s with value %s got %i\n",
|
||||
prefix, name, buf, err);
|
||||
return;
|
||||
}
|
||||
|
||||
if (val == 0xffff || val == 0xffffffff)
|
||||
return;
|
||||
|
||||
*leddc_on_time = val & 0xff;
|
||||
*leddc_off_time = (val >> 16) & 0xff;
|
||||
}
|
||||
|
||||
static void bcm47xx_nvram_parse_macaddr(char *buf, u8 macaddr[6])
|
||||
{
|
||||
if (strchr(buf, ':'))
|
||||
sscanf(buf, "%hhx:%hhx:%hhx:%hhx:%hhx:%hhx", &macaddr[0],
|
||||
&macaddr[1], &macaddr[2], &macaddr[3], &macaddr[4],
|
||||
&macaddr[5]);
|
||||
else if (strchr(buf, '-'))
|
||||
sscanf(buf, "%hhx-%hhx-%hhx-%hhx-%hhx-%hhx", &macaddr[0],
|
||||
&macaddr[1], &macaddr[2], &macaddr[3], &macaddr[4],
|
||||
&macaddr[5]);
|
||||
else
|
||||
pr_warn("Can not parse mac address: %s\n", buf);
|
||||
}
|
||||
|
||||
static void nvram_read_macaddr(const char *prefix, const char *name,
|
||||
u8 val[6], bool fallback)
|
||||
{
|
||||
char buf[100];
|
||||
int err;
|
||||
|
||||
err = get_nvram_var(prefix, NULL, name, buf, sizeof(buf), fallback);
|
||||
if (err < 0)
|
||||
return;
|
||||
|
||||
bcm47xx_nvram_parse_macaddr(buf, val);
|
||||
}
|
||||
|
||||
static void nvram_read_alpha2(const char *prefix, const char *name,
|
||||
char val[2], bool fallback)
|
||||
{
|
||||
char buf[10];
|
||||
int err;
|
||||
|
||||
err = get_nvram_var(prefix, NULL, name, buf, sizeof(buf), fallback);
|
||||
if (err < 0)
|
||||
return;
|
||||
if (buf[0] == '0')
|
||||
return;
|
||||
if (strlen(buf) > 2) {
|
||||
pr_warn("alpha2 is too long %s\n", buf);
|
||||
return;
|
||||
}
|
||||
memcpy(val, buf, 2);
|
||||
}
|
||||
|
||||
/* This is one-function-only macro, it uses local "sprom" variable! */
|
||||
#define ENTRY(_revmask, _type, _prefix, _name, _val, _allset, _fallback) \
|
||||
if (_revmask & BIT(sprom->revision)) \
|
||||
nvram_read_ ## _type(_prefix, NULL, _name, &sprom->_val, \
|
||||
_allset, _fallback)
|
||||
/*
|
||||
* Special version of filling function that can be safely called for any SPROM
|
||||
* revision. For every NVRAM to SPROM mapping it contains bitmask of revisions
|
||||
* for which the mapping is valid.
|
||||
* It obviously requires some hexadecimal/bitmasks knowledge, but allows
|
||||
* writing cleaner code (easy revisions handling).
|
||||
* Note that while SPROM revision 0 was never used, we still keep BIT(0)
|
||||
* reserved for it, just to keep numbering sane.
|
||||
*/
|
||||
static void bcm47xx_sprom_fill_auto(struct ssb_sprom *sprom,
|
||||
const char *prefix, bool fallback)
|
||||
{
|
||||
const char *pre = prefix;
|
||||
bool fb = fallback;
|
||||
|
||||
/* Broadcom extracts it for rev 8+ but it was found on 2 and 4 too */
|
||||
ENTRY(0xfffffffe, u16, pre, "devid", dev_id, 0, fallback);
|
||||
|
||||
ENTRY(0xfffffffe, u16, pre, "boardrev", board_rev, 0, true);
|
||||
ENTRY(0xfffffffe, u32, pre, "boardflags", boardflags, 0, fb);
|
||||
ENTRY(0xfffffff0, u32, pre, "boardflags2", boardflags2, 0, fb);
|
||||
ENTRY(0xfffff800, u32, pre, "boardflags3", boardflags3, 0, fb);
|
||||
ENTRY(0x00000002, u16, pre, "boardflags", boardflags_lo, 0, fb);
|
||||
ENTRY(0xfffffffc, u16, pre, "boardtype", board_type, 0, true);
|
||||
ENTRY(0xfffffffe, u16, pre, "boardnum", board_num, 0, fb);
|
||||
ENTRY(0x00000002, u8, pre, "cc", country_code, 0, fb);
|
||||
ENTRY(0xfffffff8, u8, pre, "regrev", regrev, 0, fb);
|
||||
|
||||
ENTRY(0xfffffffe, u8, pre, "ledbh0", gpio0, 0xff, fb);
|
||||
ENTRY(0xfffffffe, u8, pre, "ledbh1", gpio1, 0xff, fb);
|
||||
ENTRY(0xfffffffe, u8, pre, "ledbh2", gpio2, 0xff, fb);
|
||||
ENTRY(0xfffffffe, u8, pre, "ledbh3", gpio3, 0xff, fb);
|
||||
|
||||
ENTRY(0x0000070e, u16, pre, "pa0b0", pa0b0, 0, fb);
|
||||
ENTRY(0x0000070e, u16, pre, "pa0b1", pa0b1, 0, fb);
|
||||
ENTRY(0x0000070e, u16, pre, "pa0b2", pa0b2, 0, fb);
|
||||
ENTRY(0x0000070e, u8, pre, "pa0itssit", itssi_bg, 0, fb);
|
||||
ENTRY(0x0000070e, u8, pre, "pa0maxpwr", maxpwr_bg, 0, fb);
|
||||
|
||||
ENTRY(0x0000070c, u8, pre, "opo", opo, 0, fb);
|
||||
ENTRY(0xfffffffe, u8, pre, "aa2g", ant_available_bg, 0, fb);
|
||||
ENTRY(0xfffffffe, u8, pre, "aa5g", ant_available_a, 0, fb);
|
||||
ENTRY(0x000007fe, s8, pre, "ag0", antenna_gain.a0, 0, fb);
|
||||
ENTRY(0x000007fe, s8, pre, "ag1", antenna_gain.a1, 0, fb);
|
||||
ENTRY(0x000007f0, s8, pre, "ag2", antenna_gain.a2, 0, fb);
|
||||
ENTRY(0x000007f0, s8, pre, "ag3", antenna_gain.a3, 0, fb);
|
||||
|
||||
ENTRY(0x0000070e, u16, pre, "pa1b0", pa1b0, 0, fb);
|
||||
ENTRY(0x0000070e, u16, pre, "pa1b1", pa1b1, 0, fb);
|
||||
ENTRY(0x0000070e, u16, pre, "pa1b2", pa1b2, 0, fb);
|
||||
ENTRY(0x0000070c, u16, pre, "pa1lob0", pa1lob0, 0, fb);
|
||||
ENTRY(0x0000070c, u16, pre, "pa1lob1", pa1lob1, 0, fb);
|
||||
ENTRY(0x0000070c, u16, pre, "pa1lob2", pa1lob2, 0, fb);
|
||||
ENTRY(0x0000070c, u16, pre, "pa1hib0", pa1hib0, 0, fb);
|
||||
ENTRY(0x0000070c, u16, pre, "pa1hib1", pa1hib1, 0, fb);
|
||||
ENTRY(0x0000070c, u16, pre, "pa1hib2", pa1hib2, 0, fb);
|
||||
ENTRY(0x0000070e, u8, pre, "pa1itssit", itssi_a, 0, fb);
|
||||
ENTRY(0x0000070e, u8, pre, "pa1maxpwr", maxpwr_a, 0, fb);
|
||||
ENTRY(0x0000070c, u8, pre, "pa1lomaxpwr", maxpwr_al, 0, fb);
|
||||
ENTRY(0x0000070c, u8, pre, "pa1himaxpwr", maxpwr_ah, 0, fb);
|
||||
|
||||
ENTRY(0x00000708, u8, pre, "bxa2g", bxa2g, 0, fb);
|
||||
ENTRY(0x00000708, u8, pre, "rssisav2g", rssisav2g, 0, fb);
|
||||
ENTRY(0x00000708, u8, pre, "rssismc2g", rssismc2g, 0, fb);
|
||||
ENTRY(0x00000708, u8, pre, "rssismf2g", rssismf2g, 0, fb);
|
||||
ENTRY(0x00000708, u8, pre, "bxa5g", bxa5g, 0, fb);
|
||||
ENTRY(0x00000708, u8, pre, "rssisav5g", rssisav5g, 0, fb);
|
||||
ENTRY(0x00000708, u8, pre, "rssismc5g", rssismc5g, 0, fb);
|
||||
ENTRY(0x00000708, u8, pre, "rssismf5g", rssismf5g, 0, fb);
|
||||
ENTRY(0x00000708, u8, pre, "tri2g", tri2g, 0, fb);
|
||||
ENTRY(0x00000708, u8, pre, "tri5g", tri5g, 0, fb);
|
||||
ENTRY(0x00000708, u8, pre, "tri5gl", tri5gl, 0, fb);
|
||||
ENTRY(0x00000708, u8, pre, "tri5gh", tri5gh, 0, fb);
|
||||
ENTRY(0x00000708, s8, pre, "rxpo2g", rxpo2g, 0, fb);
|
||||
ENTRY(0x00000708, s8, pre, "rxpo5g", rxpo5g, 0, fb);
|
||||
ENTRY(0xfffffff0, u8, pre, "txchain", txchain, 0xf, fb);
|
||||
ENTRY(0xfffffff0, u8, pre, "rxchain", rxchain, 0xf, fb);
|
||||
ENTRY(0xfffffff0, u8, pre, "antswitch", antswitch, 0xff, fb);
|
||||
ENTRY(0x00000700, u8, pre, "tssipos2g", fem.ghz2.tssipos, 0, fb);
|
||||
ENTRY(0x00000700, u8, pre, "extpagain2g", fem.ghz2.extpa_gain, 0, fb);
|
||||
ENTRY(0x00000700, u8, pre, "pdetrange2g", fem.ghz2.pdet_range, 0, fb);
|
||||
ENTRY(0x00000700, u8, pre, "triso2g", fem.ghz2.tr_iso, 0, fb);
|
||||
ENTRY(0x00000700, u8, pre, "antswctl2g", fem.ghz2.antswlut, 0, fb);
|
||||
ENTRY(0x00000700, u8, pre, "tssipos5g", fem.ghz5.tssipos, 0, fb);
|
||||
ENTRY(0x00000700, u8, pre, "extpagain5g", fem.ghz5.extpa_gain, 0, fb);
|
||||
ENTRY(0x00000700, u8, pre, "pdetrange5g", fem.ghz5.pdet_range, 0, fb);
|
||||
ENTRY(0x00000700, u8, pre, "triso5g", fem.ghz5.tr_iso, 0, fb);
|
||||
ENTRY(0x00000700, u8, pre, "antswctl5g", fem.ghz5.antswlut, 0, fb);
|
||||
ENTRY(0x000000f0, u8, pre, "txpid2ga0", txpid2g[0], 0, fb);
|
||||
ENTRY(0x000000f0, u8, pre, "txpid2ga1", txpid2g[1], 0, fb);
|
||||
ENTRY(0x000000f0, u8, pre, "txpid2ga2", txpid2g[2], 0, fb);
|
||||
ENTRY(0x000000f0, u8, pre, "txpid2ga3", txpid2g[3], 0, fb);
|
||||
ENTRY(0x000000f0, u8, pre, "txpid5ga0", txpid5g[0], 0, fb);
|
||||
ENTRY(0x000000f0, u8, pre, "txpid5ga1", txpid5g[1], 0, fb);
|
||||
ENTRY(0x000000f0, u8, pre, "txpid5ga2", txpid5g[2], 0, fb);
|
||||
ENTRY(0x000000f0, u8, pre, "txpid5ga3", txpid5g[3], 0, fb);
|
||||
ENTRY(0x000000f0, u8, pre, "txpid5gla0", txpid5gl[0], 0, fb);
|
||||
ENTRY(0x000000f0, u8, pre, "txpid5gla1", txpid5gl[1], 0, fb);
|
||||
ENTRY(0x000000f0, u8, pre, "txpid5gla2", txpid5gl[2], 0, fb);
|
||||
ENTRY(0x000000f0, u8, pre, "txpid5gla3", txpid5gl[3], 0, fb);
|
||||
ENTRY(0x000000f0, u8, pre, "txpid5gha0", txpid5gh[0], 0, fb);
|
||||
ENTRY(0x000000f0, u8, pre, "txpid5gha1", txpid5gh[1], 0, fb);
|
||||
ENTRY(0x000000f0, u8, pre, "txpid5gha2", txpid5gh[2], 0, fb);
|
||||
ENTRY(0x000000f0, u8, pre, "txpid5gha3", txpid5gh[3], 0, fb);
|
||||
|
||||
ENTRY(0xffffff00, u8, pre, "tempthresh", tempthresh, 0, fb);
|
||||
ENTRY(0xffffff00, u8, pre, "tempoffset", tempoffset, 0, fb);
|
||||
ENTRY(0xffffff00, u16, pre, "rawtempsense", rawtempsense, 0, fb);
|
||||
ENTRY(0xffffff00, u8, pre, "measpower", measpower, 0, fb);
|
||||
ENTRY(0xffffff00, u8, pre, "tempsense_slope", tempsense_slope, 0, fb);
|
||||
ENTRY(0xffffff00, u8, pre, "tempcorrx", tempcorrx, 0, fb);
|
||||
ENTRY(0xffffff00, u8, pre, "tempsense_option", tempsense_option, 0, fb);
|
||||
ENTRY(0x00000700, u8, pre, "freqoffset_corr", freqoffset_corr, 0, fb);
|
||||
ENTRY(0x00000700, u8, pre, "iqcal_swp_dis", iqcal_swp_dis, 0, fb);
|
||||
ENTRY(0x00000700, u8, pre, "hw_iqcal_en", hw_iqcal_en, 0, fb);
|
||||
ENTRY(0x00000700, u8, pre, "elna2g", elna2g, 0, fb);
|
||||
ENTRY(0x00000700, u8, pre, "elna5g", elna5g, 0, fb);
|
||||
ENTRY(0xffffff00, u8, pre, "phycal_tempdelta", phycal_tempdelta, 0, fb);
|
||||
ENTRY(0xffffff00, u8, pre, "temps_period", temps_period, 0, fb);
|
||||
ENTRY(0xffffff00, u8, pre, "temps_hysteresis", temps_hysteresis, 0, fb);
|
||||
ENTRY(0xffffff00, u8, pre, "measpower1", measpower1, 0, fb);
|
||||
ENTRY(0xffffff00, u8, pre, "measpower2", measpower2, 0, fb);
|
||||
|
||||
ENTRY(0x000001f0, u16, pre, "cck2gpo", cck2gpo, 0, fb);
|
||||
ENTRY(0x000001f0, u32, pre, "ofdm2gpo", ofdm2gpo, 0, fb);
|
||||
ENTRY(0x000001f0, u32, pre, "ofdm5gpo", ofdm5gpo, 0, fb);
|
||||
ENTRY(0x000001f0, u32, pre, "ofdm5glpo", ofdm5glpo, 0, fb);
|
||||
ENTRY(0x000001f0, u32, pre, "ofdm5ghpo", ofdm5ghpo, 0, fb);
|
||||
ENTRY(0x000001f0, u16, pre, "mcs2gpo0", mcs2gpo[0], 0, fb);
|
||||
ENTRY(0x000001f0, u16, pre, "mcs2gpo1", mcs2gpo[1], 0, fb);
|
||||
ENTRY(0x000001f0, u16, pre, "mcs2gpo2", mcs2gpo[2], 0, fb);
|
||||
ENTRY(0x000001f0, u16, pre, "mcs2gpo3", mcs2gpo[3], 0, fb);
|
||||
ENTRY(0x000001f0, u16, pre, "mcs2gpo4", mcs2gpo[4], 0, fb);
|
||||
ENTRY(0x000001f0, u16, pre, "mcs2gpo5", mcs2gpo[5], 0, fb);
|
||||
ENTRY(0x000001f0, u16, pre, "mcs2gpo6", mcs2gpo[6], 0, fb);
|
||||
ENTRY(0x000001f0, u16, pre, "mcs2gpo7", mcs2gpo[7], 0, fb);
|
||||
ENTRY(0x000001f0, u16, pre, "mcs5gpo0", mcs5gpo[0], 0, fb);
|
||||
ENTRY(0x000001f0, u16, pre, "mcs5gpo1", mcs5gpo[1], 0, fb);
|
||||
ENTRY(0x000001f0, u16, pre, "mcs5gpo2", mcs5gpo[2], 0, fb);
|
||||
ENTRY(0x000001f0, u16, pre, "mcs5gpo3", mcs5gpo[3], 0, fb);
|
||||
ENTRY(0x000001f0, u16, pre, "mcs5gpo4", mcs5gpo[4], 0, fb);
|
||||
ENTRY(0x000001f0, u16, pre, "mcs5gpo5", mcs5gpo[5], 0, fb);
|
||||
ENTRY(0x000001f0, u16, pre, "mcs5gpo6", mcs5gpo[6], 0, fb);
|
||||
ENTRY(0x000001f0, u16, pre, "mcs5gpo7", mcs5gpo[7], 0, fb);
|
||||
ENTRY(0x000001f0, u16, pre, "mcs5glpo0", mcs5glpo[0], 0, fb);
|
||||
ENTRY(0x000001f0, u16, pre, "mcs5glpo1", mcs5glpo[1], 0, fb);
|
||||
ENTRY(0x000001f0, u16, pre, "mcs5glpo2", mcs5glpo[2], 0, fb);
|
||||
ENTRY(0x000001f0, u16, pre, "mcs5glpo3", mcs5glpo[3], 0, fb);
|
||||
ENTRY(0x000001f0, u16, pre, "mcs5glpo4", mcs5glpo[4], 0, fb);
|
||||
ENTRY(0x000001f0, u16, pre, "mcs5glpo5", mcs5glpo[5], 0, fb);
|
||||
ENTRY(0x000001f0, u16, pre, "mcs5glpo6", mcs5glpo[6], 0, fb);
|
||||
ENTRY(0x000001f0, u16, pre, "mcs5glpo7", mcs5glpo[7], 0, fb);
|
||||
ENTRY(0x000001f0, u16, pre, "mcs5ghpo0", mcs5ghpo[0], 0, fb);
|
||||
ENTRY(0x000001f0, u16, pre, "mcs5ghpo1", mcs5ghpo[1], 0, fb);
|
||||
ENTRY(0x000001f0, u16, pre, "mcs5ghpo2", mcs5ghpo[2], 0, fb);
|
||||
ENTRY(0x000001f0, u16, pre, "mcs5ghpo3", mcs5ghpo[3], 0, fb);
|
||||
ENTRY(0x000001f0, u16, pre, "mcs5ghpo4", mcs5ghpo[4], 0, fb);
|
||||
ENTRY(0x000001f0, u16, pre, "mcs5ghpo5", mcs5ghpo[5], 0, fb);
|
||||
ENTRY(0x000001f0, u16, pre, "mcs5ghpo6", mcs5ghpo[6], 0, fb);
|
||||
ENTRY(0x000001f0, u16, pre, "mcs5ghpo7", mcs5ghpo[7], 0, fb);
|
||||
ENTRY(0x000001f0, u16, pre, "cddpo", cddpo, 0, fb);
|
||||
ENTRY(0x000001f0, u16, pre, "stbcpo", stbcpo, 0, fb);
|
||||
ENTRY(0x000001f0, u16, pre, "bw40po", bw40po, 0, fb);
|
||||
ENTRY(0x000001f0, u16, pre, "bwduppo", bwduppo, 0, fb);
|
||||
|
||||
ENTRY(0xfffffe00, u16, pre, "cckbw202gpo", cckbw202gpo, 0, fb);
|
||||
ENTRY(0xfffffe00, u16, pre, "cckbw20ul2gpo", cckbw20ul2gpo, 0, fb);
|
||||
ENTRY(0x00000600, u32, pre, "legofdmbw202gpo", legofdmbw202gpo, 0, fb);
|
||||
ENTRY(0x00000600, u32, pre, "legofdmbw20ul2gpo", legofdmbw20ul2gpo, 0, fb);
|
||||
ENTRY(0x00000600, u32, pre, "legofdmbw205glpo", legofdmbw205glpo, 0, fb);
|
||||
ENTRY(0x00000600, u32, pre, "legofdmbw20ul5glpo", legofdmbw20ul5glpo, 0, fb);
|
||||
ENTRY(0x00000600, u32, pre, "legofdmbw205gmpo", legofdmbw205gmpo, 0, fb);
|
||||
ENTRY(0x00000600, u32, pre, "legofdmbw20ul5gmpo", legofdmbw20ul5gmpo, 0, fb);
|
||||
ENTRY(0x00000600, u32, pre, "legofdmbw205ghpo", legofdmbw205ghpo, 0, fb);
|
||||
ENTRY(0x00000600, u32, pre, "legofdmbw20ul5ghpo", legofdmbw20ul5ghpo, 0, fb);
|
||||
ENTRY(0xfffffe00, u32, pre, "mcsbw202gpo", mcsbw202gpo, 0, fb);
|
||||
ENTRY(0x00000600, u32, pre, "mcsbw20ul2gpo", mcsbw20ul2gpo, 0, fb);
|
||||
ENTRY(0xfffffe00, u32, pre, "mcsbw402gpo", mcsbw402gpo, 0, fb);
|
||||
ENTRY(0xfffffe00, u32, pre, "mcsbw205glpo", mcsbw205glpo, 0, fb);
|
||||
ENTRY(0x00000600, u32, pre, "mcsbw20ul5glpo", mcsbw20ul5glpo, 0, fb);
|
||||
ENTRY(0xfffffe00, u32, pre, "mcsbw405glpo", mcsbw405glpo, 0, fb);
|
||||
ENTRY(0xfffffe00, u32, pre, "mcsbw205gmpo", mcsbw205gmpo, 0, fb);
|
||||
ENTRY(0x00000600, u32, pre, "mcsbw20ul5gmpo", mcsbw20ul5gmpo, 0, fb);
|
||||
ENTRY(0xfffffe00, u32, pre, "mcsbw405gmpo", mcsbw405gmpo, 0, fb);
|
||||
ENTRY(0xfffffe00, u32, pre, "mcsbw205ghpo", mcsbw205ghpo, 0, fb);
|
||||
ENTRY(0x00000600, u32, pre, "mcsbw20ul5ghpo", mcsbw20ul5ghpo, 0, fb);
|
||||
ENTRY(0xfffffe00, u32, pre, "mcsbw405ghpo", mcsbw405ghpo, 0, fb);
|
||||
ENTRY(0x00000600, u16, pre, "mcs32po", mcs32po, 0, fb);
|
||||
ENTRY(0x00000600, u16, pre, "legofdm40duppo", legofdm40duppo, 0, fb);
|
||||
ENTRY(0x00000700, u8, pre, "pcieingress_war", pcieingress_war, 0, fb);
|
||||
|
||||
/* TODO: rev 11 support */
|
||||
ENTRY(0x00000700, u8, pre, "rxgainerr2ga0", rxgainerr2ga[0], 0, fb);
|
||||
ENTRY(0x00000700, u8, pre, "rxgainerr2ga1", rxgainerr2ga[1], 0, fb);
|
||||
ENTRY(0x00000700, u8, pre, "rxgainerr2ga2", rxgainerr2ga[2], 0, fb);
|
||||
ENTRY(0x00000700, u8, pre, "rxgainerr5gla0", rxgainerr5gla[0], 0, fb);
|
||||
ENTRY(0x00000700, u8, pre, "rxgainerr5gla1", rxgainerr5gla[1], 0, fb);
|
||||
ENTRY(0x00000700, u8, pre, "rxgainerr5gla2", rxgainerr5gla[2], 0, fb);
|
||||
ENTRY(0x00000700, u8, pre, "rxgainerr5gma0", rxgainerr5gma[0], 0, fb);
|
||||
ENTRY(0x00000700, u8, pre, "rxgainerr5gma1", rxgainerr5gma[1], 0, fb);
|
||||
ENTRY(0x00000700, u8, pre, "rxgainerr5gma2", rxgainerr5gma[2], 0, fb);
|
||||
ENTRY(0x00000700, u8, pre, "rxgainerr5gha0", rxgainerr5gha[0], 0, fb);
|
||||
ENTRY(0x00000700, u8, pre, "rxgainerr5gha1", rxgainerr5gha[1], 0, fb);
|
||||
ENTRY(0x00000700, u8, pre, "rxgainerr5gha2", rxgainerr5gha[2], 0, fb);
|
||||
ENTRY(0x00000700, u8, pre, "rxgainerr5gua0", rxgainerr5gua[0], 0, fb);
|
||||
ENTRY(0x00000700, u8, pre, "rxgainerr5gua1", rxgainerr5gua[1], 0, fb);
|
||||
ENTRY(0x00000700, u8, pre, "rxgainerr5gua2", rxgainerr5gua[2], 0, fb);
|
||||
|
||||
ENTRY(0xfffffe00, u8, pre, "sar2g", sar2g, 0, fb);
|
||||
ENTRY(0xfffffe00, u8, pre, "sar5g", sar5g, 0, fb);
|
||||
|
||||
/* TODO: rev 11 support */
|
||||
ENTRY(0x00000700, u8, pre, "noiselvl2ga0", noiselvl2ga[0], 0, fb);
|
||||
ENTRY(0x00000700, u8, pre, "noiselvl2ga1", noiselvl2ga[1], 0, fb);
|
||||
ENTRY(0x00000700, u8, pre, "noiselvl2ga2", noiselvl2ga[2], 0, fb);
|
||||
ENTRY(0x00000700, u8, pre, "noiselvl5gla0", noiselvl5gla[0], 0, fb);
|
||||
ENTRY(0x00000700, u8, pre, "noiselvl5gla1", noiselvl5gla[1], 0, fb);
|
||||
ENTRY(0x00000700, u8, pre, "noiselvl5gla2", noiselvl5gla[2], 0, fb);
|
||||
ENTRY(0x00000700, u8, pre, "noiselvl5gma0", noiselvl5gma[0], 0, fb);
|
||||
ENTRY(0x00000700, u8, pre, "noiselvl5gma1", noiselvl5gma[1], 0, fb);
|
||||
ENTRY(0x00000700, u8, pre, "noiselvl5gma2", noiselvl5gma[2], 0, fb);
|
||||
ENTRY(0x00000700, u8, pre, "noiselvl5gha0", noiselvl5gha[0], 0, fb);
|
||||
ENTRY(0x00000700, u8, pre, "noiselvl5gha1", noiselvl5gha[1], 0, fb);
|
||||
ENTRY(0x00000700, u8, pre, "noiselvl5gha2", noiselvl5gha[2], 0, fb);
|
||||
ENTRY(0x00000700, u8, pre, "noiselvl5gua0", noiselvl5gua[0], 0, fb);
|
||||
ENTRY(0x00000700, u8, pre, "noiselvl5gua1", noiselvl5gua[1], 0, fb);
|
||||
ENTRY(0x00000700, u8, pre, "noiselvl5gua2", noiselvl5gua[2], 0, fb);
|
||||
}
|
||||
#undef ENTRY /* It's specififc, uses local variable, don't use it (again). */
|
||||
|
||||
static void bcm47xx_fill_sprom_path_r4589(struct ssb_sprom *sprom,
|
||||
const char *prefix, bool fallback)
|
||||
{
|
||||
char postfix[2];
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(sprom->core_pwr_info); i++) {
|
||||
struct ssb_sprom_core_pwr_info *pwr_info;
|
||||
|
||||
pwr_info = &sprom->core_pwr_info[i];
|
||||
|
||||
snprintf(postfix, sizeof(postfix), "%i", i);
|
||||
nvram_read_u8(prefix, postfix, "maxp2ga",
|
||||
&pwr_info->maxpwr_2g, 0, fallback);
|
||||
nvram_read_u8(prefix, postfix, "itt2ga",
|
||||
&pwr_info->itssi_2g, 0, fallback);
|
||||
nvram_read_u8(prefix, postfix, "itt5ga",
|
||||
&pwr_info->itssi_5g, 0, fallback);
|
||||
nvram_read_u16(prefix, postfix, "pa2gw0a",
|
||||
&pwr_info->pa_2g[0], 0, fallback);
|
||||
nvram_read_u16(prefix, postfix, "pa2gw1a",
|
||||
&pwr_info->pa_2g[1], 0, fallback);
|
||||
nvram_read_u16(prefix, postfix, "pa2gw2a",
|
||||
&pwr_info->pa_2g[2], 0, fallback);
|
||||
nvram_read_u8(prefix, postfix, "maxp5ga",
|
||||
&pwr_info->maxpwr_5g, 0, fallback);
|
||||
nvram_read_u8(prefix, postfix, "maxp5gha",
|
||||
&pwr_info->maxpwr_5gh, 0, fallback);
|
||||
nvram_read_u8(prefix, postfix, "maxp5gla",
|
||||
&pwr_info->maxpwr_5gl, 0, fallback);
|
||||
nvram_read_u16(prefix, postfix, "pa5gw0a",
|
||||
&pwr_info->pa_5g[0], 0, fallback);
|
||||
nvram_read_u16(prefix, postfix, "pa5gw1a",
|
||||
&pwr_info->pa_5g[1], 0, fallback);
|
||||
nvram_read_u16(prefix, postfix, "pa5gw2a",
|
||||
&pwr_info->pa_5g[2], 0, fallback);
|
||||
nvram_read_u16(prefix, postfix, "pa5glw0a",
|
||||
&pwr_info->pa_5gl[0], 0, fallback);
|
||||
nvram_read_u16(prefix, postfix, "pa5glw1a",
|
||||
&pwr_info->pa_5gl[1], 0, fallback);
|
||||
nvram_read_u16(prefix, postfix, "pa5glw2a",
|
||||
&pwr_info->pa_5gl[2], 0, fallback);
|
||||
nvram_read_u16(prefix, postfix, "pa5ghw0a",
|
||||
&pwr_info->pa_5gh[0], 0, fallback);
|
||||
nvram_read_u16(prefix, postfix, "pa5ghw1a",
|
||||
&pwr_info->pa_5gh[1], 0, fallback);
|
||||
nvram_read_u16(prefix, postfix, "pa5ghw2a",
|
||||
&pwr_info->pa_5gh[2], 0, fallback);
|
||||
}
|
||||
}
|
||||
|
||||
static void bcm47xx_fill_sprom_path_r45(struct ssb_sprom *sprom,
|
||||
const char *prefix, bool fallback)
|
||||
{
|
||||
char postfix[2];
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(sprom->core_pwr_info); i++) {
|
||||
struct ssb_sprom_core_pwr_info *pwr_info;
|
||||
|
||||
pwr_info = &sprom->core_pwr_info[i];
|
||||
|
||||
snprintf(postfix, sizeof(postfix), "%i", i);
|
||||
nvram_read_u16(prefix, postfix, "pa2gw3a",
|
||||
&pwr_info->pa_2g[3], 0, fallback);
|
||||
nvram_read_u16(prefix, postfix, "pa5gw3a",
|
||||
&pwr_info->pa_5g[3], 0, fallback);
|
||||
nvram_read_u16(prefix, postfix, "pa5glw3a",
|
||||
&pwr_info->pa_5gl[3], 0, fallback);
|
||||
nvram_read_u16(prefix, postfix, "pa5ghw3a",
|
||||
&pwr_info->pa_5gh[3], 0, fallback);
|
||||
}
|
||||
}
|
||||
|
||||
static bool bcm47xx_is_valid_mac(u8 *mac)
|
||||
{
|
||||
return mac && !(mac[0] == 0x00 && mac[1] == 0x90 && mac[2] == 0x4c);
|
||||
}
|
||||
|
||||
static int bcm47xx_increase_mac_addr(u8 *mac, u8 num)
|
||||
{
|
||||
u8 *oui = mac + ETH_ALEN/2 - 1;
|
||||
u8 *p = mac + ETH_ALEN - 1;
|
||||
|
||||
do {
|
||||
(*p) += num;
|
||||
if (*p > num)
|
||||
break;
|
||||
p--;
|
||||
num = 1;
|
||||
} while (p != oui);
|
||||
|
||||
if (p == oui) {
|
||||
pr_err("unable to fetch mac address\n");
|
||||
return -ENOENT;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int mac_addr_used = 2;
|
||||
|
||||
static void bcm47xx_fill_sprom_ethernet(struct ssb_sprom *sprom,
|
||||
const char *prefix, bool fallback)
|
||||
{
|
||||
bool fb = fallback;
|
||||
|
||||
nvram_read_macaddr(prefix, "et0macaddr", sprom->et0mac, fallback);
|
||||
nvram_read_u8(prefix, NULL, "et0mdcport", &sprom->et0mdcport, 0,
|
||||
fallback);
|
||||
nvram_read_u8(prefix, NULL, "et0phyaddr", &sprom->et0phyaddr, 0,
|
||||
fallback);
|
||||
|
||||
nvram_read_macaddr(prefix, "et1macaddr", sprom->et1mac, fallback);
|
||||
nvram_read_u8(prefix, NULL, "et1mdcport", &sprom->et1mdcport, 0,
|
||||
fallback);
|
||||
nvram_read_u8(prefix, NULL, "et1phyaddr", &sprom->et1phyaddr, 0,
|
||||
fallback);
|
||||
|
||||
nvram_read_macaddr(prefix, "et2macaddr", sprom->et2mac, fb);
|
||||
nvram_read_u8(prefix, NULL, "et2mdcport", &sprom->et2mdcport, 0, fb);
|
||||
nvram_read_u8(prefix, NULL, "et2phyaddr", &sprom->et2phyaddr, 0, fb);
|
||||
|
||||
nvram_read_macaddr(prefix, "macaddr", sprom->il0mac, fallback);
|
||||
nvram_read_macaddr(prefix, "il0macaddr", sprom->il0mac, fallback);
|
||||
|
||||
/* The address prefix 00:90:4C is used by Broadcom in their initial
|
||||
* configuration. When a mac address with the prefix 00:90:4C is used
|
||||
* all devices from the same series are sharing the same mac address.
|
||||
* To prevent mac address collisions we replace them with a mac address
|
||||
* based on the base address.
|
||||
*/
|
||||
if (!bcm47xx_is_valid_mac(sprom->il0mac)) {
|
||||
u8 mac[6];
|
||||
|
||||
nvram_read_macaddr(NULL, "et0macaddr", mac, false);
|
||||
if (bcm47xx_is_valid_mac(mac)) {
|
||||
int err = bcm47xx_increase_mac_addr(mac, mac_addr_used);
|
||||
|
||||
if (!err) {
|
||||
ether_addr_copy(sprom->il0mac, mac);
|
||||
mac_addr_used++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void bcm47xx_fill_board_data(struct ssb_sprom *sprom, const char *prefix,
|
||||
bool fallback)
|
||||
{
|
||||
nvram_read_u32_2(prefix, "boardflags", &sprom->boardflags_lo,
|
||||
&sprom->boardflags_hi, fallback);
|
||||
nvram_read_u32_2(prefix, "boardflags2", &sprom->boardflags2_lo,
|
||||
&sprom->boardflags2_hi, fallback);
|
||||
}
|
||||
|
||||
void bcm47xx_fill_sprom(struct ssb_sprom *sprom, const char *prefix,
|
||||
bool fallback)
|
||||
{
|
||||
bcm47xx_fill_sprom_ethernet(sprom, prefix, fallback);
|
||||
bcm47xx_fill_board_data(sprom, prefix, fallback);
|
||||
|
||||
nvram_read_u8(prefix, NULL, "sromrev", &sprom->revision, 0, fallback);
|
||||
|
||||
/* Entries requiring custom functions */
|
||||
nvram_read_alpha2(prefix, "ccode", sprom->alpha2, fallback);
|
||||
if (sprom->revision >= 3)
|
||||
nvram_read_leddc(prefix, "leddc", &sprom->leddc_on_time,
|
||||
&sprom->leddc_off_time, fallback);
|
||||
|
||||
switch (sprom->revision) {
|
||||
case 4:
|
||||
case 5:
|
||||
bcm47xx_fill_sprom_path_r4589(sprom, prefix, fallback);
|
||||
bcm47xx_fill_sprom_path_r45(sprom, prefix, fallback);
|
||||
break;
|
||||
case 8:
|
||||
case 9:
|
||||
bcm47xx_fill_sprom_path_r4589(sprom, prefix, fallback);
|
||||
break;
|
||||
}
|
||||
|
||||
bcm47xx_sprom_fill_auto(sprom, prefix, fallback);
|
||||
}
|
||||
|
||||
#if IS_BUILTIN(CONFIG_SSB) && IS_ENABLED(CONFIG_SSB_SPROM)
|
||||
static int bcm47xx_get_sprom_ssb(struct ssb_bus *bus, struct ssb_sprom *out)
|
||||
{
|
||||
char prefix[10];
|
||||
|
||||
switch (bus->bustype) {
|
||||
case SSB_BUSTYPE_SSB:
|
||||
bcm47xx_fill_sprom(out, NULL, false);
|
||||
return 0;
|
||||
case SSB_BUSTYPE_PCI:
|
||||
memset(out, 0, sizeof(struct ssb_sprom));
|
||||
snprintf(prefix, sizeof(prefix), "pci/%u/%u/",
|
||||
bus->host_pci->bus->number + 1,
|
||||
PCI_SLOT(bus->host_pci->devfn));
|
||||
bcm47xx_fill_sprom(out, prefix, false);
|
||||
return 0;
|
||||
default:
|
||||
pr_warn("Unable to fill SPROM for given bustype.\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#if IS_BUILTIN(CONFIG_BCMA)
|
||||
/*
|
||||
* Having many NVRAM entries for PCI devices led to repeating prefixes like
|
||||
* pci/1/1/ all the time and wasting flash space. So at some point Broadcom
|
||||
* decided to introduce prefixes like 0: 1: 2: etc.
|
||||
* If we find e.g. devpath0=pci/2/1 or devpath0=pci/2/1/ we should use 0:
|
||||
* instead of pci/2/1/.
|
||||
*/
|
||||
static void bcm47xx_sprom_apply_prefix_alias(char *prefix, size_t prefix_size)
|
||||
{
|
||||
size_t prefix_len = strlen(prefix);
|
||||
size_t short_len = prefix_len - 1;
|
||||
char nvram_var[10];
|
||||
char buf[20];
|
||||
int i;
|
||||
|
||||
/* Passed prefix has to end with a slash */
|
||||
if (prefix_len <= 0 || prefix[prefix_len - 1] != '/')
|
||||
return;
|
||||
|
||||
for (i = 0; i < 3; i++) {
|
||||
if (snprintf(nvram_var, sizeof(nvram_var), "devpath%d", i) <= 0)
|
||||
continue;
|
||||
if (bcm47xx_nvram_getenv(nvram_var, buf, sizeof(buf)) < 0)
|
||||
continue;
|
||||
if (!strcmp(buf, prefix) ||
|
||||
(short_len && strlen(buf) == short_len && !strncmp(buf, prefix, short_len))) {
|
||||
snprintf(prefix, prefix_size, "%d:", i);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static int bcm47xx_get_sprom_bcma(struct bcma_bus *bus, struct ssb_sprom *out)
|
||||
{
|
||||
struct bcma_boardinfo *binfo = &bus->boardinfo;
|
||||
struct bcma_device *core;
|
||||
char buf[10];
|
||||
char *prefix;
|
||||
bool fallback = false;
|
||||
|
||||
switch (bus->hosttype) {
|
||||
case BCMA_HOSTTYPE_PCI:
|
||||
memset(out, 0, sizeof(struct ssb_sprom));
|
||||
/* On BCM47XX all PCI buses share the same domain */
|
||||
if (config_enabled(CONFIG_BCM47XX))
|
||||
snprintf(buf, sizeof(buf), "pci/%u/%u/",
|
||||
bus->host_pci->bus->number + 1,
|
||||
PCI_SLOT(bus->host_pci->devfn));
|
||||
else
|
||||
snprintf(buf, sizeof(buf), "pci/%u/%u/",
|
||||
pci_domain_nr(bus->host_pci->bus) + 1,
|
||||
bus->host_pci->bus->number);
|
||||
bcm47xx_sprom_apply_prefix_alias(buf, sizeof(buf));
|
||||
prefix = buf;
|
||||
break;
|
||||
case BCMA_HOSTTYPE_SOC:
|
||||
memset(out, 0, sizeof(struct ssb_sprom));
|
||||
core = bcma_find_core(bus, BCMA_CORE_80211);
|
||||
if (core) {
|
||||
snprintf(buf, sizeof(buf), "sb/%u/",
|
||||
core->core_index);
|
||||
prefix = buf;
|
||||
fallback = true;
|
||||
} else {
|
||||
prefix = NULL;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
pr_warn("Unable to fill SPROM for given bustype.\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
nvram_read_u16(prefix, NULL, "boardvendor", &binfo->vendor, 0, true);
|
||||
if (!binfo->vendor)
|
||||
binfo->vendor = SSB_BOARDVENDOR_BCM;
|
||||
nvram_read_u16(prefix, NULL, "boardtype", &binfo->type, 0, true);
|
||||
|
||||
bcm47xx_fill_sprom(out, prefix, fallback);
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
static unsigned int bcm47xx_sprom_registered;
|
||||
|
||||
/*
|
||||
* On bcm47xx we need to register SPROM fallback handler very early, so we can't
|
||||
* use anything like platform device / driver for this.
|
||||
*/
|
||||
int bcm47xx_sprom_register_fallbacks(void)
|
||||
{
|
||||
if (bcm47xx_sprom_registered)
|
||||
return 0;
|
||||
|
||||
#if IS_BUILTIN(CONFIG_SSB) && IS_ENABLED(CONFIG_SSB_SPROM)
|
||||
if (ssb_arch_register_fallback_sprom(&bcm47xx_get_sprom_ssb))
|
||||
pr_warn("Failed to register ssb SPROM handler\n");
|
||||
#endif
|
||||
|
||||
#if IS_BUILTIN(CONFIG_BCMA)
|
||||
if (bcma_arch_register_fallback_sprom(&bcm47xx_get_sprom_bcma))
|
||||
pr_warn("Failed to register bcma SPROM handler\n");
|
||||
#endif
|
||||
|
||||
bcm47xx_sprom_registered = 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
fs_initcall(bcm47xx_sprom_register_fallbacks);
|
|
@ -1,68 +0,0 @@
|
|||
From 937b12306ea79044c86f2e69b3061c7279245825 Mon Sep 17 00:00:00 2001
|
||||
From: Lucas Stach <l.stach@pengutronix.de>
|
||||
Date: Thu, 15 Oct 2015 12:32:22 +0200
|
||||
Subject: [PATCH] ARM: BCM5301X: remove workaround imprecise abort fault
|
||||
handler
|
||||
|
||||
This is not needed anymore. Handling a potentially pending imprecise external
|
||||
abort left behind by the bootloader is now done in a slightly safer way inside
|
||||
the common ARM startup code.
|
||||
|
||||
Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
|
||||
Acked-by: Hauke Mehrtens <hauke@hauke-m.de>
|
||||
Tested-by: Tyler Baker <tyler.baker@linaro.org>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
arch/arm/mach-bcm/bcm_5301x.c | 35 -----------------------------------
|
||||
1 file changed, 35 deletions(-)
|
||||
|
||||
--- a/arch/arm/mach-bcm/bcm_5301x.c
|
||||
+++ b/arch/arm/mach-bcm/bcm_5301x.c
|
||||
@@ -9,40 +9,6 @@
|
||||
#include <asm/hardware/cache-l2x0.h>
|
||||
|
||||
#include <asm/mach/arch.h>
|
||||
-#include <asm/siginfo.h>
|
||||
-#include <asm/signal.h>
|
||||
-
|
||||
-
|
||||
-static bool first_fault = true;
|
||||
-
|
||||
-static int bcm5301x_abort_handler(unsigned long addr, unsigned int fsr,
|
||||
- struct pt_regs *regs)
|
||||
-{
|
||||
- if ((fsr == 0x1406 || fsr == 0x1c06) && first_fault) {
|
||||
- first_fault = false;
|
||||
-
|
||||
- /*
|
||||
- * These faults with codes 0x1406 (BCM4709) or 0x1c06 happens
|
||||
- * for no good reason, possibly left over from the CFE boot
|
||||
- * loader.
|
||||
- */
|
||||
- pr_warn("External imprecise Data abort at addr=%#lx, fsr=%#x ignored.\n",
|
||||
- addr, fsr);
|
||||
-
|
||||
- /* Returning non-zero causes fault display and panic */
|
||||
- return 0;
|
||||
- }
|
||||
-
|
||||
- /* Others should cause a fault */
|
||||
- return 1;
|
||||
-}
|
||||
-
|
||||
-static void __init bcm5301x_init_early(void)
|
||||
-{
|
||||
- /* Install our hook */
|
||||
- hook_fault_code(16 + 6, bcm5301x_abort_handler, SIGBUS, BUS_OBJERR,
|
||||
- "imprecise external abort");
|
||||
-}
|
||||
|
||||
static const char *const bcm5301x_dt_compat[] __initconst = {
|
||||
"brcm,bcm4708",
|
||||
@@ -52,6 +18,5 @@ static const char *const bcm5301x_dt_com
|
||||
DT_MACHINE_START(BCM5301X, "BCM5301X")
|
||||
.l2c_aux_val = 0,
|
||||
.l2c_aux_mask = ~0,
|
||||
- .init_early = bcm5301x_init_early,
|
||||
.dt_compat = bcm5301x_dt_compat,
|
||||
MACHINE_END
|
|
@ -1,31 +0,0 @@
|
|||
From f4ce7effe2253a325f8ba182903cbdf0d8698593 Mon Sep 17 00:00:00 2001
|
||||
From: Hauke Mehrtens <hauke@hauke-m.de>
|
||||
Date: Sat, 21 Nov 2015 15:29:47 +0100
|
||||
Subject: [PATCH] ARM: BCM5310X: activate erratas needed for SoC
|
||||
|
||||
The BCM4708 I have, which is probably the first generation which got
|
||||
to the consumer market, is using a ARM Cortex-A9 rev r3p0 and a
|
||||
L2C-310 rev r3p2 L2 cache controller. There are 3 workarounds for known
|
||||
erratas in the Linux kernel which could be activated and will be in
|
||||
this patch. There are currently no workarounds which have to be
|
||||
activated for the L2C-310 rev r3p2 in Linux.
|
||||
|
||||
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
arch/arm/mach-bcm/Kconfig | 4 ++++
|
||||
1 file changed, 4 insertions(+)
|
||||
|
||||
--- a/arch/arm/mach-bcm/Kconfig
|
||||
+++ b/arch/arm/mach-bcm/Kconfig
|
||||
@@ -52,6 +52,10 @@ config ARCH_BCM_NSP
|
||||
config ARCH_BCM_5301X
|
||||
bool "Broadcom BCM470X / BCM5301X ARM SoC" if ARCH_MULTI_V7
|
||||
select ARCH_BCM_IPROC
|
||||
+ select ARM_ERRATA_754322
|
||||
+ select ARM_ERRATA_775420
|
||||
+ select ARM_ERRATA_764369 if SMP
|
||||
+
|
||||
help
|
||||
Support for Broadcom BCM470X and BCM5301X SoCs with ARM CPU cores.
|
||||
|
|
@ -1,254 +0,0 @@
|
|||
From b5989f783de046577067fe356b1bb76cae07e867 Mon Sep 17 00:00:00 2001
|
||||
From: Kapil Hali <kapilh@broadcom.com>
|
||||
Date: Sat, 5 Dec 2015 06:53:41 -0500
|
||||
Subject: [PATCH] ARM: BCM: Clean up SMP support for Broadcom Kona
|
||||
|
||||
These changes cleans up SMP implementaion for Broadcom's
|
||||
Kona SoC which are required for handling SMP for iProc
|
||||
family of SoCs at a single place for BCM NSP and BCM Kona.
|
||||
|
||||
Signed-off-by: Kapil Hali <kapilh@broadcom.com>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
.../bindings/arm/bcm/brcm,bcm11351-cpu-method.txt | 12 ++--
|
||||
arch/arm/boot/dts/bcm11351.dtsi | 4 +-
|
||||
arch/arm/boot/dts/bcm21664.dtsi | 4 +-
|
||||
arch/arm/mach-bcm/kona_smp.c | 82 ++++++++++++++--------
|
||||
4 files changed, 64 insertions(+), 38 deletions(-)
|
||||
|
||||
--- a/Documentation/devicetree/bindings/arm/bcm/brcm,bcm11351-cpu-method.txt
|
||||
+++ b/Documentation/devicetree/bindings/arm/bcm/brcm,bcm11351-cpu-method.txt
|
||||
@@ -1,17 +1,17 @@
|
||||
Broadcom Kona Family CPU Enable Method
|
||||
--------------------------------------
|
||||
This binding defines the enable method used for starting secondary
|
||||
-CPUs in the following Broadcom SoCs:
|
||||
+CPU in the following Broadcom SoCs:
|
||||
BCM11130, BCM11140, BCM11351, BCM28145, BCM28155, BCM21664
|
||||
|
||||
The enable method is specified by defining the following required
|
||||
-properties in the "cpus" device tree node:
|
||||
+properties in the corresponding secondary "cpu" device tree node:
|
||||
- enable-method = "brcm,bcm11351-cpu-method";
|
||||
- secondary-boot-reg = <...>;
|
||||
|
||||
The secondary-boot-reg property is a u32 value that specifies the
|
||||
-physical address of the register used to request the ROM holding pen
|
||||
-code release a secondary CPU. The value written to the register is
|
||||
+physical address of the register used to request the ROM code
|
||||
+release a secondary CPU. The value written to the register is
|
||||
formed by encoding the target CPU id into the low bits of the
|
||||
physical start address it should jump to.
|
||||
|
||||
@@ -19,8 +19,6 @@ Example:
|
||||
cpus {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
- enable-method = "brcm,bcm11351-cpu-method";
|
||||
- secondary-boot-reg = <0x3500417c>;
|
||||
|
||||
cpu0: cpu@0 {
|
||||
device_type = "cpu";
|
||||
@@ -31,6 +29,8 @@ Example:
|
||||
cpu1: cpu@1 {
|
||||
device_type = "cpu";
|
||||
compatible = "arm,cortex-a9";
|
||||
+ enable-method = "brcm,bcm11351-cpu-method";
|
||||
+ secondary-boot-reg = <0x3500417c>;
|
||||
reg = <1>;
|
||||
};
|
||||
};
|
||||
--- a/arch/arm/boot/dts/bcm11351.dtsi
|
||||
+++ b/arch/arm/boot/dts/bcm11351.dtsi
|
||||
@@ -30,8 +30,6 @@
|
||||
cpus {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
- enable-method = "brcm,bcm11351-cpu-method";
|
||||
- secondary-boot-reg = <0x3500417c>;
|
||||
|
||||
cpu0: cpu@0 {
|
||||
device_type = "cpu";
|
||||
@@ -42,6 +40,8 @@
|
||||
cpu1: cpu@1 {
|
||||
device_type = "cpu";
|
||||
compatible = "arm,cortex-a9";
|
||||
+ enable-method = "brcm,bcm11351-cpu-method";
|
||||
+ secondary-boot-reg = <0x3500417c>;
|
||||
reg = <1>;
|
||||
};
|
||||
};
|
||||
--- a/arch/arm/boot/dts/bcm21664.dtsi
|
||||
+++ b/arch/arm/boot/dts/bcm21664.dtsi
|
||||
@@ -30,8 +30,6 @@
|
||||
cpus {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
- enable-method = "brcm,bcm11351-cpu-method";
|
||||
- secondary-boot-reg = <0x35004178>;
|
||||
|
||||
cpu0: cpu@0 {
|
||||
device_type = "cpu";
|
||||
@@ -42,6 +40,8 @@
|
||||
cpu1: cpu@1 {
|
||||
device_type = "cpu";
|
||||
compatible = "arm,cortex-a9";
|
||||
+ enable-method = "brcm,bcm11351-cpu-method";
|
||||
+ secondary-boot-reg = <0x35004178>;
|
||||
reg = <1>;
|
||||
};
|
||||
};
|
||||
--- a/arch/arm/mach-bcm/kona_smp.c
|
||||
+++ b/arch/arm/mach-bcm/kona_smp.c
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
- * Copyright (C) 2014 Broadcom Corporation
|
||||
+ * Copyright (C) 2014-2015 Broadcom Corporation
|
||||
* Copyright 2014 Linaro Limited
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
@@ -30,9 +30,10 @@
|
||||
|
||||
/* Name of device node property defining secondary boot register location */
|
||||
#define OF_SECONDARY_BOOT "secondary-boot-reg"
|
||||
+#define MPIDR_CPUID_BITMASK 0x3
|
||||
|
||||
/* I/O address of register used to coordinate secondary core startup */
|
||||
-static u32 secondary_boot;
|
||||
+static u32 secondary_boot_addr;
|
||||
|
||||
/*
|
||||
* Enable the Cortex A9 Snoop Control Unit
|
||||
@@ -78,44 +79,68 @@ static int __init scu_a9_enable(void)
|
||||
static void __init bcm_smp_prepare_cpus(unsigned int max_cpus)
|
||||
{
|
||||
static cpumask_t only_cpu_0 = { CPU_BITS_CPU0 };
|
||||
- struct device_node *node;
|
||||
+ struct device_node *cpus_node = NULL;
|
||||
+ struct device_node *cpu_node = NULL;
|
||||
int ret;
|
||||
|
||||
- BUG_ON(secondary_boot); /* We're called only once */
|
||||
-
|
||||
/*
|
||||
* This function is only called via smp_ops->smp_prepare_cpu().
|
||||
* That only happens if a "/cpus" device tree node exists
|
||||
* and has an "enable-method" property that selects the SMP
|
||||
* operations defined herein.
|
||||
*/
|
||||
- node = of_find_node_by_path("/cpus");
|
||||
- BUG_ON(!node);
|
||||
-
|
||||
- /*
|
||||
- * Our secondary enable method requires a "secondary-boot-reg"
|
||||
- * property to specify a register address used to request the
|
||||
- * ROM code boot a secondary code. If we have any trouble
|
||||
- * getting this we fall back to uniprocessor mode.
|
||||
- */
|
||||
- if (of_property_read_u32(node, OF_SECONDARY_BOOT, &secondary_boot)) {
|
||||
- pr_err("%s: missing/invalid " OF_SECONDARY_BOOT " property\n",
|
||||
- node->name);
|
||||
- ret = -ENOENT; /* Arrange to disable SMP */
|
||||
- goto out;
|
||||
+ cpus_node = of_find_node_by_path("/cpus");
|
||||
+ if (!cpus_node)
|
||||
+ return;
|
||||
+
|
||||
+ for_each_child_of_node(cpus_node, cpu_node) {
|
||||
+ u32 cpuid;
|
||||
+
|
||||
+ if (of_node_cmp(cpu_node->type, "cpu"))
|
||||
+ continue;
|
||||
+
|
||||
+ if (of_property_read_u32(cpu_node, "reg", &cpuid)) {
|
||||
+ pr_debug("%s: missing reg property\n",
|
||||
+ cpu_node->full_name);
|
||||
+ ret = -ENOENT;
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ /*
|
||||
+ * "secondary-boot-reg" property should be defined only
|
||||
+ * for secondary cpu
|
||||
+ */
|
||||
+ if ((cpuid & MPIDR_CPUID_BITMASK) == 1) {
|
||||
+ /*
|
||||
+ * Our secondary enable method requires a
|
||||
+ * "secondary-boot-reg" property to specify a register
|
||||
+ * address used to request the ROM code boot a secondary
|
||||
+ * core. If we have any trouble getting this we fall
|
||||
+ * back to uniprocessor mode.
|
||||
+ */
|
||||
+ if (of_property_read_u32(cpu_node,
|
||||
+ OF_SECONDARY_BOOT,
|
||||
+ &secondary_boot_addr)) {
|
||||
+ pr_warn("%s: no" OF_SECONDARY_BOOT "property\n",
|
||||
+ cpu_node->name);
|
||||
+ ret = -ENOENT;
|
||||
+ goto out;
|
||||
+ }
|
||||
+ }
|
||||
}
|
||||
|
||||
/*
|
||||
- * Enable the SCU on Cortex A9 based SoCs. If -ENOENT is
|
||||
+ * Enable the SCU on Cortex A9 based SoCs. If -ENOENT is
|
||||
* returned, the SoC reported a uniprocessor configuration.
|
||||
* We bail on any other error.
|
||||
*/
|
||||
ret = scu_a9_enable();
|
||||
out:
|
||||
- of_node_put(node);
|
||||
+ of_node_put(cpu_node);
|
||||
+ of_node_put(cpus_node);
|
||||
+
|
||||
if (ret) {
|
||||
/* Update the CPU present map to reflect uniprocessor mode */
|
||||
- BUG_ON(ret != -ENOENT);
|
||||
pr_warn("disabling SMP\n");
|
||||
init_cpu_present(&only_cpu_0);
|
||||
}
|
||||
@@ -139,7 +164,7 @@ out:
|
||||
* - Wait for the secondary boot register to be re-written, which
|
||||
* indicates the secondary core has started.
|
||||
*/
|
||||
-static int bcm_boot_secondary(unsigned int cpu, struct task_struct *idle)
|
||||
+static int kona_boot_secondary(unsigned int cpu, struct task_struct *idle)
|
||||
{
|
||||
void __iomem *boot_reg;
|
||||
phys_addr_t boot_func;
|
||||
@@ -154,15 +179,16 @@ static int bcm_boot_secondary(unsigned i
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
- if (!secondary_boot) {
|
||||
+ if (!secondary_boot_addr) {
|
||||
pr_err("required secondary boot register not specified\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
- boot_reg = ioremap_nocache((phys_addr_t)secondary_boot, sizeof(u32));
|
||||
+ boot_reg = ioremap_nocache(
|
||||
+ (phys_addr_t)secondary_boot_addr, sizeof(u32));
|
||||
if (!boot_reg) {
|
||||
pr_err("unable to map boot register for cpu %u\n", cpu_id);
|
||||
- return -ENOSYS;
|
||||
+ return -ENOMEM;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -191,12 +217,12 @@ static int bcm_boot_secondary(unsigned i
|
||||
|
||||
pr_err("timeout waiting for cpu %u to start\n", cpu_id);
|
||||
|
||||
- return -ENOSYS;
|
||||
+ return -ENXIO;
|
||||
}
|
||||
|
||||
static struct smp_operations bcm_smp_ops __initdata = {
|
||||
.smp_prepare_cpus = bcm_smp_prepare_cpus,
|
||||
- .smp_boot_secondary = bcm_boot_secondary,
|
||||
+ .smp_boot_secondary = kona_boot_secondary,
|
||||
};
|
||||
CPU_METHOD_OF_DECLARE(bcm_smp_bcm281xx, "brcm,bcm11351-cpu-method",
|
||||
&bcm_smp_ops);
|
|
@ -1,585 +0,0 @@
|
|||
From 55be958cd27439a58c4d9369d6fe2a1f83efdaa6 Mon Sep 17 00:00:00 2001
|
||||
From: Kapil Hali <kapilh@broadcom.com>
|
||||
Date: Sat, 5 Dec 2015 06:53:43 -0500
|
||||
Subject: [PATCH] ARM: BCM: Add SMP support for Broadcom NSP
|
||||
|
||||
Add SMP support for Broadcom's Northstar Plus SoC
|
||||
cpu enable method. This changes also consolidates
|
||||
iProc family's - BCM NSP and BCM Kona, platform
|
||||
SMP handling in a common file.
|
||||
|
||||
Northstar Plus SoC is based on ARM Cortex-A9
|
||||
revision r3p0 which requires configuration for ARM
|
||||
Errata 764369 for SMP. This change adds the needed
|
||||
configuration option.
|
||||
|
||||
Signed-off-by: Kapil Hali <kapilh@broadcom.com>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
arch/arm/mach-bcm/Kconfig | 2 +
|
||||
arch/arm/mach-bcm/Makefile | 8 +-
|
||||
arch/arm/mach-bcm/kona_smp.c | 228 ----------------------------------
|
||||
arch/arm/mach-bcm/platsmp.c | 290 +++++++++++++++++++++++++++++++++++++++++++
|
||||
4 files changed, 298 insertions(+), 230 deletions(-)
|
||||
delete mode 100644 arch/arm/mach-bcm/kona_smp.c
|
||||
create mode 100644 arch/arm/mach-bcm/platsmp.c
|
||||
|
||||
--- a/arch/arm/mach-bcm/Kconfig
|
||||
+++ b/arch/arm/mach-bcm/Kconfig
|
||||
@@ -40,6 +40,8 @@ config ARCH_BCM_NSP
|
||||
select ARCH_BCM_IPROC
|
||||
select ARM_ERRATA_754322
|
||||
select ARM_ERRATA_775420
|
||||
+ select ARM_ERRATA_764369 if SMP
|
||||
+ select HAVE_SMP
|
||||
help
|
||||
Support for Broadcom Northstar Plus SoC.
|
||||
Broadcom Northstar Plus family of SoCs are used for switching control
|
||||
--- a/arch/arm/mach-bcm/Makefile
|
||||
+++ b/arch/arm/mach-bcm/Makefile
|
||||
@@ -14,7 +14,11 @@
|
||||
obj-$(CONFIG_ARCH_BCM_CYGNUS) += bcm_cygnus.o
|
||||
|
||||
# Northstar Plus
|
||||
-obj-$(CONFIG_ARCH_BCM_NSP) += bcm_nsp.o
|
||||
+obj-$(CONFIG_ARCH_BCM_NSP) += bcm_nsp.o
|
||||
+
|
||||
+ifeq ($(CONFIG_ARCH_BCM_NSP),y)
|
||||
+obj-$(CONFIG_SMP) += platsmp.o
|
||||
+endif
|
||||
|
||||
# BCM281XX
|
||||
obj-$(CONFIG_ARCH_BCM_281XX) += board_bcm281xx.o
|
||||
@@ -23,7 +27,7 @@ obj-$(CONFIG_ARCH_BCM_281XX) += board_bc
|
||||
obj-$(CONFIG_ARCH_BCM_21664) += board_bcm21664.o
|
||||
|
||||
# BCM281XX and BCM21664 SMP support
|
||||
-obj-$(CONFIG_ARCH_BCM_MOBILE_SMP) += kona_smp.o
|
||||
+obj-$(CONFIG_ARCH_BCM_MOBILE_SMP) += platsmp.o
|
||||
|
||||
# BCM281XX and BCM21664 L2 cache control
|
||||
obj-$(CONFIG_ARCH_BCM_MOBILE_L2_CACHE) += kona_l2_cache.o
|
||||
--- a/arch/arm/mach-bcm/kona_smp.c
|
||||
+++ /dev/null
|
||||
@@ -1,228 +0,0 @@
|
||||
-/*
|
||||
- * Copyright (C) 2014-2015 Broadcom Corporation
|
||||
- * Copyright 2014 Linaro Limited
|
||||
- *
|
||||
- * This program is free software; you can redistribute it and/or
|
||||
- * modify it under the terms of the GNU General Public License as
|
||||
- * published by the Free Software Foundation version 2.
|
||||
- *
|
||||
- * This program is distributed "as is" WITHOUT ANY WARRANTY of any
|
||||
- * kind, whether express or implied; without even the implied warranty
|
||||
- * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
- * GNU General Public License for more details.
|
||||
- */
|
||||
-
|
||||
-#include <linux/init.h>
|
||||
-#include <linux/errno.h>
|
||||
-#include <linux/io.h>
|
||||
-#include <linux/of.h>
|
||||
-#include <linux/sched.h>
|
||||
-
|
||||
-#include <asm/smp.h>
|
||||
-#include <asm/smp_plat.h>
|
||||
-#include <asm/smp_scu.h>
|
||||
-
|
||||
-/* Size of mapped Cortex A9 SCU address space */
|
||||
-#define CORTEX_A9_SCU_SIZE 0x58
|
||||
-
|
||||
-#define SECONDARY_TIMEOUT_NS NSEC_PER_MSEC /* 1 msec (in nanoseconds) */
|
||||
-#define BOOT_ADDR_CPUID_MASK 0x3
|
||||
-
|
||||
-/* Name of device node property defining secondary boot register location */
|
||||
-#define OF_SECONDARY_BOOT "secondary-boot-reg"
|
||||
-#define MPIDR_CPUID_BITMASK 0x3
|
||||
-
|
||||
-/* I/O address of register used to coordinate secondary core startup */
|
||||
-static u32 secondary_boot_addr;
|
||||
-
|
||||
-/*
|
||||
- * Enable the Cortex A9 Snoop Control Unit
|
||||
- *
|
||||
- * By the time this is called we already know there are multiple
|
||||
- * cores present. We assume we're running on a Cortex A9 processor,
|
||||
- * so any trouble getting the base address register or getting the
|
||||
- * SCU base is a problem.
|
||||
- *
|
||||
- * Return 0 if successful or an error code otherwise.
|
||||
- */
|
||||
-static int __init scu_a9_enable(void)
|
||||
-{
|
||||
- unsigned long config_base;
|
||||
- void __iomem *scu_base;
|
||||
-
|
||||
- if (!scu_a9_has_base()) {
|
||||
- pr_err("no configuration base address register!\n");
|
||||
- return -ENXIO;
|
||||
- }
|
||||
-
|
||||
- /* Config base address register value is zero for uniprocessor */
|
||||
- config_base = scu_a9_get_base();
|
||||
- if (!config_base) {
|
||||
- pr_err("hardware reports only one core\n");
|
||||
- return -ENOENT;
|
||||
- }
|
||||
-
|
||||
- scu_base = ioremap((phys_addr_t)config_base, CORTEX_A9_SCU_SIZE);
|
||||
- if (!scu_base) {
|
||||
- pr_err("failed to remap config base (%lu/%u) for SCU\n",
|
||||
- config_base, CORTEX_A9_SCU_SIZE);
|
||||
- return -ENOMEM;
|
||||
- }
|
||||
-
|
||||
- scu_enable(scu_base);
|
||||
-
|
||||
- iounmap(scu_base); /* That's the last we'll need of this */
|
||||
-
|
||||
- return 0;
|
||||
-}
|
||||
-
|
||||
-static void __init bcm_smp_prepare_cpus(unsigned int max_cpus)
|
||||
-{
|
||||
- static cpumask_t only_cpu_0 = { CPU_BITS_CPU0 };
|
||||
- struct device_node *cpus_node = NULL;
|
||||
- struct device_node *cpu_node = NULL;
|
||||
- int ret;
|
||||
-
|
||||
- /*
|
||||
- * This function is only called via smp_ops->smp_prepare_cpu().
|
||||
- * That only happens if a "/cpus" device tree node exists
|
||||
- * and has an "enable-method" property that selects the SMP
|
||||
- * operations defined herein.
|
||||
- */
|
||||
- cpus_node = of_find_node_by_path("/cpus");
|
||||
- if (!cpus_node)
|
||||
- return;
|
||||
-
|
||||
- for_each_child_of_node(cpus_node, cpu_node) {
|
||||
- u32 cpuid;
|
||||
-
|
||||
- if (of_node_cmp(cpu_node->type, "cpu"))
|
||||
- continue;
|
||||
-
|
||||
- if (of_property_read_u32(cpu_node, "reg", &cpuid)) {
|
||||
- pr_debug("%s: missing reg property\n",
|
||||
- cpu_node->full_name);
|
||||
- ret = -ENOENT;
|
||||
- goto out;
|
||||
- }
|
||||
-
|
||||
- /*
|
||||
- * "secondary-boot-reg" property should be defined only
|
||||
- * for secondary cpu
|
||||
- */
|
||||
- if ((cpuid & MPIDR_CPUID_BITMASK) == 1) {
|
||||
- /*
|
||||
- * Our secondary enable method requires a
|
||||
- * "secondary-boot-reg" property to specify a register
|
||||
- * address used to request the ROM code boot a secondary
|
||||
- * core. If we have any trouble getting this we fall
|
||||
- * back to uniprocessor mode.
|
||||
- */
|
||||
- if (of_property_read_u32(cpu_node,
|
||||
- OF_SECONDARY_BOOT,
|
||||
- &secondary_boot_addr)) {
|
||||
- pr_warn("%s: no" OF_SECONDARY_BOOT "property\n",
|
||||
- cpu_node->name);
|
||||
- ret = -ENOENT;
|
||||
- goto out;
|
||||
- }
|
||||
- }
|
||||
- }
|
||||
-
|
||||
- /*
|
||||
- * Enable the SCU on Cortex A9 based SoCs. If -ENOENT is
|
||||
- * returned, the SoC reported a uniprocessor configuration.
|
||||
- * We bail on any other error.
|
||||
- */
|
||||
- ret = scu_a9_enable();
|
||||
-out:
|
||||
- of_node_put(cpu_node);
|
||||
- of_node_put(cpus_node);
|
||||
-
|
||||
- if (ret) {
|
||||
- /* Update the CPU present map to reflect uniprocessor mode */
|
||||
- pr_warn("disabling SMP\n");
|
||||
- init_cpu_present(&only_cpu_0);
|
||||
- }
|
||||
-}
|
||||
-
|
||||
-/*
|
||||
- * The ROM code has the secondary cores looping, waiting for an event.
|
||||
- * When an event occurs each core examines the bottom two bits of the
|
||||
- * secondary boot register. When a core finds those bits contain its
|
||||
- * own core id, it performs initialization, including computing its boot
|
||||
- * address by clearing the boot register value's bottom two bits. The
|
||||
- * core signals that it is beginning its execution by writing its boot
|
||||
- * address back to the secondary boot register, and finally jumps to
|
||||
- * that address.
|
||||
- *
|
||||
- * So to start a core executing we need to:
|
||||
- * - Encode the (hardware) CPU id with the bottom bits of the secondary
|
||||
- * start address.
|
||||
- * - Write that value into the secondary boot register.
|
||||
- * - Generate an event to wake up the secondary CPU(s).
|
||||
- * - Wait for the secondary boot register to be re-written, which
|
||||
- * indicates the secondary core has started.
|
||||
- */
|
||||
-static int kona_boot_secondary(unsigned int cpu, struct task_struct *idle)
|
||||
-{
|
||||
- void __iomem *boot_reg;
|
||||
- phys_addr_t boot_func;
|
||||
- u64 start_clock;
|
||||
- u32 cpu_id;
|
||||
- u32 boot_val;
|
||||
- bool timeout = false;
|
||||
-
|
||||
- cpu_id = cpu_logical_map(cpu);
|
||||
- if (cpu_id & ~BOOT_ADDR_CPUID_MASK) {
|
||||
- pr_err("bad cpu id (%u > %u)\n", cpu_id, BOOT_ADDR_CPUID_MASK);
|
||||
- return -EINVAL;
|
||||
- }
|
||||
-
|
||||
- if (!secondary_boot_addr) {
|
||||
- pr_err("required secondary boot register not specified\n");
|
||||
- return -EINVAL;
|
||||
- }
|
||||
-
|
||||
- boot_reg = ioremap_nocache(
|
||||
- (phys_addr_t)secondary_boot_addr, sizeof(u32));
|
||||
- if (!boot_reg) {
|
||||
- pr_err("unable to map boot register for cpu %u\n", cpu_id);
|
||||
- return -ENOMEM;
|
||||
- }
|
||||
-
|
||||
- /*
|
||||
- * Secondary cores will start in secondary_startup(),
|
||||
- * defined in "arch/arm/kernel/head.S"
|
||||
- */
|
||||
- boot_func = virt_to_phys(secondary_startup);
|
||||
- BUG_ON(boot_func & BOOT_ADDR_CPUID_MASK);
|
||||
- BUG_ON(boot_func > (phys_addr_t)U32_MAX);
|
||||
-
|
||||
- /* The core to start is encoded in the low bits */
|
||||
- boot_val = (u32)boot_func | cpu_id;
|
||||
- writel_relaxed(boot_val, boot_reg);
|
||||
-
|
||||
- sev();
|
||||
-
|
||||
- /* The low bits will be cleared once the core has started */
|
||||
- start_clock = local_clock();
|
||||
- while (!timeout && readl_relaxed(boot_reg) == boot_val)
|
||||
- timeout = local_clock() - start_clock > SECONDARY_TIMEOUT_NS;
|
||||
-
|
||||
- iounmap(boot_reg);
|
||||
-
|
||||
- if (!timeout)
|
||||
- return 0;
|
||||
-
|
||||
- pr_err("timeout waiting for cpu %u to start\n", cpu_id);
|
||||
-
|
||||
- return -ENXIO;
|
||||
-}
|
||||
-
|
||||
-static struct smp_operations bcm_smp_ops __initdata = {
|
||||
- .smp_prepare_cpus = bcm_smp_prepare_cpus,
|
||||
- .smp_boot_secondary = kona_boot_secondary,
|
||||
-};
|
||||
-CPU_METHOD_OF_DECLARE(bcm_smp_bcm281xx, "brcm,bcm11351-cpu-method",
|
||||
- &bcm_smp_ops);
|
||||
--- /dev/null
|
||||
+++ b/arch/arm/mach-bcm/platsmp.c
|
||||
@@ -0,0 +1,290 @@
|
||||
+/*
|
||||
+ * Copyright (C) 2014-2015 Broadcom Corporation
|
||||
+ * Copyright 2014 Linaro Limited
|
||||
+ *
|
||||
+ * This program is free software; you can redistribute it and/or
|
||||
+ * modify it under the terms of the GNU General Public License as
|
||||
+ * published by the Free Software Foundation version 2.
|
||||
+ *
|
||||
+ * This program is distributed "as is" WITHOUT ANY WARRANTY of any
|
||||
+ * kind, whether express or implied; without even the implied warranty
|
||||
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
+ * GNU General Public License for more details.
|
||||
+ */
|
||||
+
|
||||
+#include <linux/cpumask.h>
|
||||
+#include <linux/delay.h>
|
||||
+#include <linux/errno.h>
|
||||
+#include <linux/init.h>
|
||||
+#include <linux/io.h>
|
||||
+#include <linux/jiffies.h>
|
||||
+#include <linux/of.h>
|
||||
+#include <linux/sched.h>
|
||||
+#include <linux/smp.h>
|
||||
+
|
||||
+#include <asm/cacheflush.h>
|
||||
+#include <asm/smp.h>
|
||||
+#include <asm/smp_plat.h>
|
||||
+#include <asm/smp_scu.h>
|
||||
+
|
||||
+/* Size of mapped Cortex A9 SCU address space */
|
||||
+#define CORTEX_A9_SCU_SIZE 0x58
|
||||
+
|
||||
+#define SECONDARY_TIMEOUT_NS NSEC_PER_MSEC /* 1 msec (in nanoseconds) */
|
||||
+#define BOOT_ADDR_CPUID_MASK 0x3
|
||||
+
|
||||
+/* Name of device node property defining secondary boot register location */
|
||||
+#define OF_SECONDARY_BOOT "secondary-boot-reg"
|
||||
+#define MPIDR_CPUID_BITMASK 0x3
|
||||
+
|
||||
+/* I/O address of register used to coordinate secondary core startup */
|
||||
+static u32 secondary_boot_addr;
|
||||
+
|
||||
+/*
|
||||
+ * Enable the Cortex A9 Snoop Control Unit
|
||||
+ *
|
||||
+ * By the time this is called we already know there are multiple
|
||||
+ * cores present. We assume we're running on a Cortex A9 processor,
|
||||
+ * so any trouble getting the base address register or getting the
|
||||
+ * SCU base is a problem.
|
||||
+ *
|
||||
+ * Return 0 if successful or an error code otherwise.
|
||||
+ */
|
||||
+static int __init scu_a9_enable(void)
|
||||
+{
|
||||
+ unsigned long config_base;
|
||||
+ void __iomem *scu_base;
|
||||
+
|
||||
+ if (!scu_a9_has_base()) {
|
||||
+ pr_err("no configuration base address register!\n");
|
||||
+ return -ENXIO;
|
||||
+ }
|
||||
+
|
||||
+ /* Config base address register value is zero for uniprocessor */
|
||||
+ config_base = scu_a9_get_base();
|
||||
+ if (!config_base) {
|
||||
+ pr_err("hardware reports only one core\n");
|
||||
+ return -ENOENT;
|
||||
+ }
|
||||
+
|
||||
+ scu_base = ioremap((phys_addr_t)config_base, CORTEX_A9_SCU_SIZE);
|
||||
+ if (!scu_base) {
|
||||
+ pr_err("failed to remap config base (%lu/%u) for SCU\n",
|
||||
+ config_base, CORTEX_A9_SCU_SIZE);
|
||||
+ return -ENOMEM;
|
||||
+ }
|
||||
+
|
||||
+ scu_enable(scu_base);
|
||||
+
|
||||
+ iounmap(scu_base); /* That's the last we'll need of this */
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int nsp_write_lut(void)
|
||||
+{
|
||||
+ void __iomem *sku_rom_lut;
|
||||
+ phys_addr_t secondary_startup_phy;
|
||||
+
|
||||
+ if (!secondary_boot_addr) {
|
||||
+ pr_warn("required secondary boot register not specified\n");
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+ sku_rom_lut = ioremap_nocache((phys_addr_t)secondary_boot_addr,
|
||||
+ sizeof(secondary_boot_addr));
|
||||
+ if (!sku_rom_lut) {
|
||||
+ pr_warn("unable to ioremap SKU-ROM LUT register\n");
|
||||
+ return -ENOMEM;
|
||||
+ }
|
||||
+
|
||||
+ secondary_startup_phy = virt_to_phys(secondary_startup);
|
||||
+ BUG_ON(secondary_startup_phy > (phys_addr_t)U32_MAX);
|
||||
+
|
||||
+ writel_relaxed(secondary_startup_phy, sku_rom_lut);
|
||||
+
|
||||
+ /* Ensure the write is visible to the secondary core */
|
||||
+ smp_wmb();
|
||||
+
|
||||
+ iounmap(sku_rom_lut);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static void __init bcm_smp_prepare_cpus(unsigned int max_cpus)
|
||||
+{
|
||||
+ static cpumask_t only_cpu_0 = { CPU_BITS_CPU0 };
|
||||
+ struct device_node *cpus_node = NULL;
|
||||
+ struct device_node *cpu_node = NULL;
|
||||
+ int ret;
|
||||
+
|
||||
+ /*
|
||||
+ * This function is only called via smp_ops->smp_prepare_cpu().
|
||||
+ * That only happens if a "/cpus" device tree node exists
|
||||
+ * and has an "enable-method" property that selects the SMP
|
||||
+ * operations defined herein.
|
||||
+ */
|
||||
+ cpus_node = of_find_node_by_path("/cpus");
|
||||
+ if (!cpus_node)
|
||||
+ return;
|
||||
+
|
||||
+ for_each_child_of_node(cpus_node, cpu_node) {
|
||||
+ u32 cpuid;
|
||||
+
|
||||
+ if (of_node_cmp(cpu_node->type, "cpu"))
|
||||
+ continue;
|
||||
+
|
||||
+ if (of_property_read_u32(cpu_node, "reg", &cpuid)) {
|
||||
+ pr_debug("%s: missing reg property\n",
|
||||
+ cpu_node->full_name);
|
||||
+ ret = -ENOENT;
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ /*
|
||||
+ * "secondary-boot-reg" property should be defined only
|
||||
+ * for secondary cpu
|
||||
+ */
|
||||
+ if ((cpuid & MPIDR_CPUID_BITMASK) == 1) {
|
||||
+ /*
|
||||
+ * Our secondary enable method requires a
|
||||
+ * "secondary-boot-reg" property to specify a register
|
||||
+ * address used to request the ROM code boot a secondary
|
||||
+ * core. If we have any trouble getting this we fall
|
||||
+ * back to uniprocessor mode.
|
||||
+ */
|
||||
+ if (of_property_read_u32(cpu_node,
|
||||
+ OF_SECONDARY_BOOT,
|
||||
+ &secondary_boot_addr)) {
|
||||
+ pr_warn("%s: no" OF_SECONDARY_BOOT "property\n",
|
||||
+ cpu_node->name);
|
||||
+ ret = -ENOENT;
|
||||
+ goto out;
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ /*
|
||||
+ * Enable the SCU on Cortex A9 based SoCs. If -ENOENT is
|
||||
+ * returned, the SoC reported a uniprocessor configuration.
|
||||
+ * We bail on any other error.
|
||||
+ */
|
||||
+ ret = scu_a9_enable();
|
||||
+out:
|
||||
+ of_node_put(cpu_node);
|
||||
+ of_node_put(cpus_node);
|
||||
+
|
||||
+ if (ret) {
|
||||
+ /* Update the CPU present map to reflect uniprocessor mode */
|
||||
+ pr_warn("disabling SMP\n");
|
||||
+ init_cpu_present(&only_cpu_0);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+/*
|
||||
+ * The ROM code has the secondary cores looping, waiting for an event.
|
||||
+ * When an event occurs each core examines the bottom two bits of the
|
||||
+ * secondary boot register. When a core finds those bits contain its
|
||||
+ * own core id, it performs initialization, including computing its boot
|
||||
+ * address by clearing the boot register value's bottom two bits. The
|
||||
+ * core signals that it is beginning its execution by writing its boot
|
||||
+ * address back to the secondary boot register, and finally jumps to
|
||||
+ * that address.
|
||||
+ *
|
||||
+ * So to start a core executing we need to:
|
||||
+ * - Encode the (hardware) CPU id with the bottom bits of the secondary
|
||||
+ * start address.
|
||||
+ * - Write that value into the secondary boot register.
|
||||
+ * - Generate an event to wake up the secondary CPU(s).
|
||||
+ * - Wait for the secondary boot register to be re-written, which
|
||||
+ * indicates the secondary core has started.
|
||||
+ */
|
||||
+static int kona_boot_secondary(unsigned int cpu, struct task_struct *idle)
|
||||
+{
|
||||
+ void __iomem *boot_reg;
|
||||
+ phys_addr_t boot_func;
|
||||
+ u64 start_clock;
|
||||
+ u32 cpu_id;
|
||||
+ u32 boot_val;
|
||||
+ bool timeout = false;
|
||||
+
|
||||
+ cpu_id = cpu_logical_map(cpu);
|
||||
+ if (cpu_id & ~BOOT_ADDR_CPUID_MASK) {
|
||||
+ pr_err("bad cpu id (%u > %u)\n", cpu_id, BOOT_ADDR_CPUID_MASK);
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+ if (!secondary_boot_addr) {
|
||||
+ pr_err("required secondary boot register not specified\n");
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+ boot_reg = ioremap_nocache(
|
||||
+ (phys_addr_t)secondary_boot_addr, sizeof(u32));
|
||||
+ if (!boot_reg) {
|
||||
+ pr_err("unable to map boot register for cpu %u\n", cpu_id);
|
||||
+ return -ENOMEM;
|
||||
+ }
|
||||
+
|
||||
+ /*
|
||||
+ * Secondary cores will start in secondary_startup(),
|
||||
+ * defined in "arch/arm/kernel/head.S"
|
||||
+ */
|
||||
+ boot_func = virt_to_phys(secondary_startup);
|
||||
+ BUG_ON(boot_func & BOOT_ADDR_CPUID_MASK);
|
||||
+ BUG_ON(boot_func > (phys_addr_t)U32_MAX);
|
||||
+
|
||||
+ /* The core to start is encoded in the low bits */
|
||||
+ boot_val = (u32)boot_func | cpu_id;
|
||||
+ writel_relaxed(boot_val, boot_reg);
|
||||
+
|
||||
+ sev();
|
||||
+
|
||||
+ /* The low bits will be cleared once the core has started */
|
||||
+ start_clock = local_clock();
|
||||
+ while (!timeout && readl_relaxed(boot_reg) == boot_val)
|
||||
+ timeout = local_clock() - start_clock > SECONDARY_TIMEOUT_NS;
|
||||
+
|
||||
+ iounmap(boot_reg);
|
||||
+
|
||||
+ if (!timeout)
|
||||
+ return 0;
|
||||
+
|
||||
+ pr_err("timeout waiting for cpu %u to start\n", cpu_id);
|
||||
+
|
||||
+ return -ENXIO;
|
||||
+}
|
||||
+
|
||||
+static int nsp_boot_secondary(unsigned int cpu, struct task_struct *idle)
|
||||
+{
|
||||
+ int ret;
|
||||
+
|
||||
+ /*
|
||||
+ * After wake up, secondary core branches to the startup
|
||||
+ * address programmed at SKU ROM LUT location.
|
||||
+ */
|
||||
+ ret = nsp_write_lut();
|
||||
+ if (ret) {
|
||||
+ pr_err("unable to write startup addr to SKU ROM LUT\n");
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ /* Send a CPU wakeup interrupt to the secondary core */
|
||||
+ arch_send_wakeup_ipi_mask(cpumask_of(cpu));
|
||||
+
|
||||
+out:
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+static struct smp_operations bcm_smp_ops __initdata = {
|
||||
+ .smp_prepare_cpus = bcm_smp_prepare_cpus,
|
||||
+ .smp_boot_secondary = kona_boot_secondary,
|
||||
+};
|
||||
+CPU_METHOD_OF_DECLARE(bcm_smp_bcm281xx, "brcm,bcm11351-cpu-method",
|
||||
+ &bcm_smp_ops);
|
||||
+
|
||||
+struct smp_operations nsp_smp_ops __initdata = {
|
||||
+ .smp_prepare_cpus = bcm_smp_prepare_cpus,
|
||||
+ .smp_boot_secondary = nsp_boot_secondary,
|
||||
+};
|
||||
+CPU_METHOD_OF_DECLARE(bcm_smp_nsp, "brcm,bcm-nsp-smp", &nsp_smp_ops);
|
|
@ -1,58 +0,0 @@
|
|||
From 99498905ac1fbc73a97d27d21ea449fb939072e3 Mon Sep 17 00:00:00 2001
|
||||
From: Jon Mason <jonmason@broadcom.com>
|
||||
Date: Tue, 1 Dec 2015 11:24:09 -0500
|
||||
Subject: [PATCH] ARM: BCM: Add SMP support for Broadcom 4708
|
||||
|
||||
Add SMP support for Broadcom's 4708 SoCs.
|
||||
|
||||
Signed-off-by: Jon Mason <jonmason@broadcom.com>
|
||||
Acked-by: Hauke Mehrtens <hauke@hauke-m.de>
|
||||
Tested-by: Hauke Mehrtens <hauke@hauke-m.de>
|
||||
Signed-off-by: Kapil Hali <kapilh@broadcom.com>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/bcm4708.dtsi | 2 ++
|
||||
arch/arm/mach-bcm/Kconfig | 1 +
|
||||
arch/arm/mach-bcm/Makefile | 3 +++
|
||||
3 files changed, 6 insertions(+)
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm4708.dtsi
|
||||
+++ b/arch/arm/boot/dts/bcm4708.dtsi
|
||||
@@ -15,6 +15,7 @@
|
||||
cpus {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
+ enable-method = "brcm,bcm-nsp-smp";
|
||||
|
||||
cpu@0 {
|
||||
device_type = "cpu";
|
||||
@@ -27,6 +28,7 @@
|
||||
device_type = "cpu";
|
||||
compatible = "arm,cortex-a9";
|
||||
next-level-cache = <&L2>;
|
||||
+ secondary-boot-reg = <0xffff0400>;
|
||||
reg = <0x1>;
|
||||
};
|
||||
};
|
||||
--- a/arch/arm/mach-bcm/Kconfig
|
||||
+++ b/arch/arm/mach-bcm/Kconfig
|
||||
@@ -57,6 +57,7 @@ config ARCH_BCM_5301X
|
||||
select ARM_ERRATA_754322
|
||||
select ARM_ERRATA_775420
|
||||
select ARM_ERRATA_764369 if SMP
|
||||
+ select HAVE_SMP
|
||||
|
||||
help
|
||||
Support for Broadcom BCM470X and BCM5301X SoCs with ARM CPU cores.
|
||||
--- a/arch/arm/mach-bcm/Makefile
|
||||
+++ b/arch/arm/mach-bcm/Makefile
|
||||
@@ -43,6 +43,9 @@ obj-$(CONFIG_ARCH_BCM2835) += board_bcm2
|
||||
|
||||
# BCM5301X
|
||||
obj-$(CONFIG_ARCH_BCM_5301X) += bcm_5301x.o
|
||||
+ifeq ($(CONFIG_ARCH_BCM_5301X),y)
|
||||
+obj-$(CONFIG_SMP) += platsmp.o
|
||||
+endif
|
||||
|
||||
# BCM63XXx
|
||||
ifeq ($(CONFIG_ARCH_BCM_63XX),y)
|
|
@ -1,219 +0,0 @@
|
|||
From ccf0b5e37115f8675455632f583d06ea94f43539 Mon Sep 17 00:00:00 2001
|
||||
From: Jon Mason <jonmason@broadcom.com>
|
||||
Date: Mon, 2 Nov 2015 13:34:53 -0500
|
||||
Subject: [PATCH] ARM: dts: bcm5301x: Add BCM SVK DT files
|
||||
|
||||
Add device tree files for Broadcom Northstar based SVKs. Since the
|
||||
bcm5301x.dtsi already exists, all that is necessary is the dts files to
|
||||
enable the UARTs. With these files, the SVKs are able to boot to shell.
|
||||
|
||||
Signed-off-by: Jon Mason <jonmason@broadcom.com>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/Makefile | 5 +++-
|
||||
arch/arm/boot/dts/bcm94708.dts | 56 +++++++++++++++++++++++++++++++++++
|
||||
arch/arm/boot/dts/bcm94709.dts | 56 +++++++++++++++++++++++++++++++++++
|
||||
arch/arm/boot/dts/bcm953012k.dts | 63 ++++++++++++++++++++++++++++++++++++++++
|
||||
4 files changed, 179 insertions(+), 1 deletion(-)
|
||||
create mode 100644 arch/arm/boot/dts/bcm94708.dts
|
||||
create mode 100644 arch/arm/boot/dts/bcm94709.dts
|
||||
create mode 100644 arch/arm/boot/dts/bcm953012k.dts
|
||||
|
||||
--- a/arch/arm/boot/dts/Makefile
|
||||
+++ b/arch/arm/boot/dts/Makefile
|
||||
@@ -75,7 +75,10 @@ dtb-$(CONFIG_ARCH_BCM_5301X) += \
|
||||
bcm4709-asus-rt-ac87u.dtb \
|
||||
bcm4709-buffalo-wxr-1900dhp.dtb \
|
||||
bcm4709-netgear-r7000.dtb \
|
||||
- bcm4709-netgear-r8000.dtb
|
||||
+ bcm4709-netgear-r8000.dtb \
|
||||
+ bcm94708.dtb \
|
||||
+ bcm94709.dtb \
|
||||
+ bcm953012k.dtb
|
||||
dtb-$(CONFIG_ARCH_BCM_63XX) += \
|
||||
bcm963138dvt.dtb
|
||||
dtb-$(CONFIG_ARCH_BCM_CYGNUS) += \
|
||||
--- /dev/null
|
||||
+++ b/arch/arm/boot/dts/bcm94708.dts
|
||||
@@ -0,0 +1,56 @@
|
||||
+/*
|
||||
+ * BSD LICENSE
|
||||
+ *
|
||||
+ * Copyright(c) 2015 Broadcom Corporation. All rights reserved.
|
||||
+ *
|
||||
+ * Redistribution and use in source and binary forms, with or without
|
||||
+ * modification, are permitted provided that the following conditions
|
||||
+ * are met:
|
||||
+ *
|
||||
+ * * Redistributions of source code must retain the above copyright
|
||||
+ * notice, this list of conditions and the following disclaimer.
|
||||
+ * * Redistributions in binary form must reproduce the above copyright
|
||||
+ * notice, this list of conditions and the following disclaimer in
|
||||
+ * the documentation and/or other materials provided with the
|
||||
+ * distribution.
|
||||
+ * * Neither the name of Broadcom Corporation nor the names of its
|
||||
+ * contributors may be used to endorse or promote products derived
|
||||
+ * from this software without specific prior written permission.
|
||||
+ *
|
||||
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
+ */
|
||||
+
|
||||
+/dts-v1/;
|
||||
+
|
||||
+#include "bcm4708.dtsi"
|
||||
+
|
||||
+/ {
|
||||
+ model = "NorthStar SVK (BCM94708)";
|
||||
+ compatible = "brcm,bcm94708", "brcm,bcm4708";
|
||||
+
|
||||
+ aliases {
|
||||
+ serial0 = &uart0;
|
||||
+ };
|
||||
+
|
||||
+ chosen {
|
||||
+ stdout-path = "serial0:115200n8";
|
||||
+ };
|
||||
+
|
||||
+ memory {
|
||||
+ reg = <0x00000000 0x08000000>;
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&uart0 {
|
||||
+ status = "okay";
|
||||
+};
|
||||
--- /dev/null
|
||||
+++ b/arch/arm/boot/dts/bcm94709.dts
|
||||
@@ -0,0 +1,56 @@
|
||||
+/*
|
||||
+ * BSD LICENSE
|
||||
+ *
|
||||
+ * Copyright(c) 2015 Broadcom Corporation. All rights reserved.
|
||||
+ *
|
||||
+ * Redistribution and use in source and binary forms, with or without
|
||||
+ * modification, are permitted provided that the following conditions
|
||||
+ * are met:
|
||||
+ *
|
||||
+ * * Redistributions of source code must retain the above copyright
|
||||
+ * notice, this list of conditions and the following disclaimer.
|
||||
+ * * Redistributions in binary form must reproduce the above copyright
|
||||
+ * notice, this list of conditions and the following disclaimer in
|
||||
+ * the documentation and/or other materials provided with the
|
||||
+ * distribution.
|
||||
+ * * Neither the name of Broadcom Corporation nor the names of its
|
||||
+ * contributors may be used to endorse or promote products derived
|
||||
+ * from this software without specific prior written permission.
|
||||
+ *
|
||||
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
+ */
|
||||
+
|
||||
+/dts-v1/;
|
||||
+
|
||||
+#include "bcm4708.dtsi"
|
||||
+
|
||||
+/ {
|
||||
+ model = "NorthStar SVK (BCM94709)";
|
||||
+ compatible = "brcm,bcm94709", "brcm,bcm4709", "brcm,bcm4708";
|
||||
+
|
||||
+ aliases {
|
||||
+ serial0 = &uart0;
|
||||
+ };
|
||||
+
|
||||
+ chosen {
|
||||
+ stdout-path = "serial0:115200n8";
|
||||
+ };
|
||||
+
|
||||
+ memory {
|
||||
+ reg = <0x00000000 0x08000000>;
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&uart0 {
|
||||
+ status = "okay";
|
||||
+};
|
||||
--- /dev/null
|
||||
+++ b/arch/arm/boot/dts/bcm953012k.dts
|
||||
@@ -0,0 +1,63 @@
|
||||
+/*
|
||||
+ * BSD LICENSE
|
||||
+ *
|
||||
+ * Copyright(c) 2015 Broadcom Corporation. All rights reserved.
|
||||
+ *
|
||||
+ * Redistribution and use in source and binary forms, with or without
|
||||
+ * modification, are permitted provided that the following conditions
|
||||
+ * are met:
|
||||
+ *
|
||||
+ * * Redistributions of source code must retain the above copyright
|
||||
+ * notice, this list of conditions and the following disclaimer.
|
||||
+ * * Redistributions in binary form must reproduce the above copyright
|
||||
+ * notice, this list of conditions and the following disclaimer in
|
||||
+ * the documentation and/or other materials provided with the
|
||||
+ * distribution.
|
||||
+ * * Neither the name of Broadcom Corporation nor the names of its
|
||||
+ * contributors may be used to endorse or promote products derived
|
||||
+ * from this software without specific prior written permission.
|
||||
+ *
|
||||
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
+ */
|
||||
+
|
||||
+/dts-v1/;
|
||||
+
|
||||
+#include "bcm4708.dtsi"
|
||||
+
|
||||
+/ {
|
||||
+ model = "NorthStar SVK (BCM953012K)";
|
||||
+ compatible = "brcm,bcm953012k", "brcm,brcm53012", "brcm,bcm4708";
|
||||
+
|
||||
+ aliases {
|
||||
+ serial0 = &uart0;
|
||||
+ serial1 = &uart1;
|
||||
+ };
|
||||
+
|
||||
+ chosen {
|
||||
+ stdout-path = "serial0:115200n8";
|
||||
+ };
|
||||
+
|
||||
+ memory {
|
||||
+ reg = <0x00000000 0x10000000>;
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&uart0 {
|
||||
+ clock-frequency = <62499840>;
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&uart1 {
|
||||
+ clock-frequency = <62499840>;
|
||||
+ status = "okay";
|
||||
+};
|
|
@ -1,174 +0,0 @@
|
|||
From cdc36b22f0e4b8badf3db14395f0aa44dcbce4b3 Mon Sep 17 00:00:00 2001
|
||||
From: Jon Mason <jonmason@broadcom.com>
|
||||
Date: Fri, 20 Nov 2015 10:17:18 -0500
|
||||
Subject: [PATCH] ARM: dts: enable clock support for BCM5301X
|
||||
|
||||
Replace current device tree dummy clocks with real clock support for
|
||||
Broadcom Northstar SoCs.
|
||||
|
||||
Signed-off-by: Jon Mason <jonmason@broadcom.com>
|
||||
Reviewed-by: Ray Jui <rjui@broadcom.com>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/bcm5301x.dtsi | 92 +++++++++++++++++++++++++++++++----------
|
||||
1 file changed, 71 insertions(+), 21 deletions(-)
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm5301x.dtsi
|
||||
+++ b/arch/arm/boot/dts/bcm5301x.dtsi
|
||||
@@ -8,6 +8,7 @@
|
||||
* Licensed under the GNU/GPL. See COPYING for details.
|
||||
*/
|
||||
|
||||
+#include <dt-bindings/clock/bcm-nsp.h>
|
||||
#include <dt-bindings/gpio/gpio.h>
|
||||
#include <dt-bindings/input/input.h>
|
||||
#include <dt-bindings/interrupt-controller/irq.h>
|
||||
@@ -27,7 +28,7 @@
|
||||
compatible = "ns16550";
|
||||
reg = <0x0300 0x100>;
|
||||
interrupts = <GIC_SPI 85 IRQ_TYPE_LEVEL_HIGH>;
|
||||
- clock-frequency = <100000000>;
|
||||
+ clocks = <&iprocslow>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
@@ -35,48 +36,55 @@
|
||||
compatible = "ns16550";
|
||||
reg = <0x0400 0x100>;
|
||||
interrupts = <GIC_SPI 85 IRQ_TYPE_LEVEL_HIGH>;
|
||||
- clock-frequency = <100000000>;
|
||||
+ clocks = <&iprocslow>;
|
||||
status = "disabled";
|
||||
};
|
||||
};
|
||||
|
||||
mpcore {
|
||||
compatible = "simple-bus";
|
||||
- ranges = <0x00000000 0x19020000 0x00003000>;
|
||||
+ ranges = <0x00000000 0x19000000 0x00023000>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
- scu@0000 {
|
||||
+ a9pll: arm_clk@00000 {
|
||||
+ #clock-cells = <0>;
|
||||
+ compatible = "brcm,nsp-armpll";
|
||||
+ clocks = <&osc>;
|
||||
+ reg = <0x00000 0x1000>;
|
||||
+ };
|
||||
+
|
||||
+ scu@20000 {
|
||||
compatible = "arm,cortex-a9-scu";
|
||||
- reg = <0x0000 0x100>;
|
||||
+ reg = <0x20000 0x100>;
|
||||
};
|
||||
|
||||
- timer@0200 {
|
||||
+ timer@20200 {
|
||||
compatible = "arm,cortex-a9-global-timer";
|
||||
- reg = <0x0200 0x100>;
|
||||
+ reg = <0x20200 0x100>;
|
||||
interrupts = <GIC_PPI 11 IRQ_TYPE_EDGE_RISING>;
|
||||
- clocks = <&clk_periph>;
|
||||
+ clocks = <&periph_clk>;
|
||||
};
|
||||
|
||||
- local-timer@0600 {
|
||||
+ local-timer@20600 {
|
||||
compatible = "arm,cortex-a9-twd-timer";
|
||||
- reg = <0x0600 0x100>;
|
||||
+ reg = <0x20600 0x100>;
|
||||
interrupts = <GIC_PPI 13 IRQ_TYPE_EDGE_RISING>;
|
||||
- clocks = <&clk_periph>;
|
||||
+ clocks = <&periph_clk>;
|
||||
};
|
||||
|
||||
- gic: interrupt-controller@1000 {
|
||||
+ gic: interrupt-controller@21000 {
|
||||
compatible = "arm,cortex-a9-gic";
|
||||
#interrupt-cells = <3>;
|
||||
#address-cells = <0>;
|
||||
interrupt-controller;
|
||||
- reg = <0x1000 0x1000>,
|
||||
- <0x0100 0x100>;
|
||||
+ reg = <0x21000 0x1000>,
|
||||
+ <0x20100 0x100>;
|
||||
};
|
||||
|
||||
- L2: cache-controller@2000 {
|
||||
+ L2: cache-controller@22000 {
|
||||
compatible = "arm,pl310-cache";
|
||||
- reg = <0x2000 0x1000>;
|
||||
+ reg = <0x22000 0x1000>;
|
||||
cache-unified;
|
||||
arm,shared-override;
|
||||
prefetch-data = <1>;
|
||||
@@ -94,14 +102,37 @@
|
||||
|
||||
clocks {
|
||||
#address-cells = <1>;
|
||||
- #size-cells = <0>;
|
||||
+ #size-cells = <1>;
|
||||
+ ranges;
|
||||
|
||||
- /* As long as we do not have a real clock driver us this
|
||||
- * fixed clock */
|
||||
- clk_periph: periph {
|
||||
+ osc: oscillator {
|
||||
+ #clock-cells = <0>;
|
||||
compatible = "fixed-clock";
|
||||
+ clock-frequency = <25000000>;
|
||||
+ };
|
||||
+
|
||||
+ iprocmed: iprocmed {
|
||||
#clock-cells = <0>;
|
||||
- clock-frequency = <400000000>;
|
||||
+ compatible = "fixed-factor-clock";
|
||||
+ clocks = <&genpll BCM_NSP_GENPLL_IPROCFAST_CLK>;
|
||||
+ clock-div = <2>;
|
||||
+ clock-mult = <1>;
|
||||
+ };
|
||||
+
|
||||
+ iprocslow: iprocslow {
|
||||
+ #clock-cells = <0>;
|
||||
+ compatible = "fixed-factor-clock";
|
||||
+ clocks = <&genpll BCM_NSP_GENPLL_IPROCFAST_CLK>;
|
||||
+ clock-div = <4>;
|
||||
+ clock-mult = <1>;
|
||||
+ };
|
||||
+
|
||||
+ periph_clk: periph_clk {
|
||||
+ #clock-cells = <0>;
|
||||
+ compatible = "fixed-factor-clock";
|
||||
+ clocks = <&a9pll>;
|
||||
+ clock-div = <2>;
|
||||
+ clock-mult = <1>;
|
||||
};
|
||||
};
|
||||
|
||||
@@ -178,6 +209,25 @@
|
||||
};
|
||||
};
|
||||
|
||||
+ lcpll0: lcpll0@1800c100 {
|
||||
+ #clock-cells = <1>;
|
||||
+ compatible = "brcm,nsp-lcpll0";
|
||||
+ reg = <0x1800c100 0x14>;
|
||||
+ clocks = <&osc>;
|
||||
+ clock-output-names = "lcpll0", "pcie_phy", "sdio",
|
||||
+ "ddr_phy";
|
||||
+ };
|
||||
+
|
||||
+ genpll: genpll@1800c140 {
|
||||
+ #clock-cells = <1>;
|
||||
+ compatible = "brcm,nsp-genpll";
|
||||
+ reg = <0x1800c140 0x24>;
|
||||
+ clocks = <&osc>;
|
||||
+ clock-output-names = "genpll", "phy", "ethernetclk",
|
||||
+ "usbclk", "iprocfast", "sata1",
|
||||
+ "sata2";
|
||||
+ };
|
||||
+
|
||||
nand: nand@18028000 {
|
||||
compatible = "brcm,nand-iproc", "brcm,brcmnand-v6.1", "brcm,brcmnand";
|
||||
reg = <0x18028000 0x600>, <0x1811a408 0x600>, <0x18028f00 0x20>;
|
|
@ -1,56 +0,0 @@
|
|||
From 9789f1fd1fd1d0551132778414faf8e2254408c1 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
|
||||
Date: Fri, 30 Oct 2015 15:44:01 +0100
|
||||
Subject: [PATCH] ARM: BCM5301X: Add missing Netgear R8000 LEDs
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Add a bunch of LEDs missing for the Netgear R8000: wireless, wps, 5Ghz radio
|
||||
and USB LEDs.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/bcm4709-netgear-r8000.dts | 30 +++++++++++++++++++++++++++++
|
||||
1 file changed, 30 insertions(+)
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm4709-netgear-r8000.dts
|
||||
+++ b/arch/arm/boot/dts/bcm4709-netgear-r8000.dts
|
||||
@@ -50,6 +50,36 @@
|
||||
gpios = <&chipcommon 13 GPIO_ACTIVE_LOW>;
|
||||
linux,default-trigger = "default-off";
|
||||
};
|
||||
+
|
||||
+ wireless {
|
||||
+ label = "bcm53xx:white:wireless";
|
||||
+ gpios = <&chipcommon 14 GPIO_ACTIVE_HIGH>;
|
||||
+ linux,default-trigger = "default-off";
|
||||
+ };
|
||||
+
|
||||
+ wps {
|
||||
+ label = "bcm53xx:white:wps";
|
||||
+ gpios = <&chipcommon 15 GPIO_ACTIVE_HIGH>;
|
||||
+ linux,default-trigger = "default-off";
|
||||
+ };
|
||||
+
|
||||
+ 5ghz-2 {
|
||||
+ label = "bcm53xx:white:5ghz-2";
|
||||
+ gpios = <&chipcommon 16 GPIO_ACTIVE_LOW>;
|
||||
+ linux,default-trigger = "default-off";
|
||||
+ };
|
||||
+
|
||||
+ usb3 {
|
||||
+ label = "bcm53xx:white:usb3";
|
||||
+ gpios = <&chipcommon 17 GPIO_ACTIVE_LOW>;
|
||||
+ linux,default-trigger = "default-off";
|
||||
+ };
|
||||
+
|
||||
+ usb2 {
|
||||
+ label = "bcm53xx:white:usb2";
|
||||
+ gpios = <&chipcommon 18 GPIO_ACTIVE_LOW>;
|
||||
+ linux,default-trigger = "default-off";
|
||||
+ };
|
||||
};
|
||||
|
||||
gpio-keys {
|
|
@ -1,70 +0,0 @@
|
|||
From fa20071c74be69a1d84df85e5d1e72a40a156b89 Mon Sep 17 00:00:00 2001
|
||||
From: Kapil Hali <kapilh@broadcom.com>
|
||||
Date: Tue, 1 Dec 2015 11:24:05 -0500
|
||||
Subject: [PATCH] dt-bindings: add SMP enable-method for Broadcom NSP
|
||||
|
||||
Add a compatible string "brcm,bcm-nsp-smp" for Broadcom's
|
||||
Northstar Plus CPU to the 32-bit ARM CPU device tree binding
|
||||
documentation file and create a new binding documentation for
|
||||
Northstar Plus CPU.
|
||||
|
||||
Signed-off-by: Kapil Hali <kapilh@broadcom.com>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
.../bindings/arm/bcm/brcm,nsp-cpu-method.txt | 39 ++++++++++++++++++++++
|
||||
Documentation/devicetree/bindings/arm/cpus.txt | 1 +
|
||||
2 files changed, 40 insertions(+)
|
||||
create mode 100644 Documentation/devicetree/bindings/arm/bcm/brcm,nsp-cpu-method.txt
|
||||
|
||||
--- /dev/null
|
||||
+++ b/Documentation/devicetree/bindings/arm/bcm/brcm,nsp-cpu-method.txt
|
||||
@@ -0,0 +1,39 @@
|
||||
+Broadcom Northstar Plus SoC CPU Enable Method
|
||||
+---------------------------------------------
|
||||
+This binding defines the enable method used for starting secondary
|
||||
+CPUs in the following Broadcom SoCs:
|
||||
+ BCM58522, BCM58525, BCM58535, BCM58622, BCM58623, BCM58625, BCM88312
|
||||
+
|
||||
+The enable method is specified by defining the following required
|
||||
+properties in the "cpus" device tree node:
|
||||
+ - enable-method = "brcm,bcm-nsp-smp";
|
||||
+ - secondary-boot-reg = <...>;
|
||||
+
|
||||
+The secondary-boot-reg property is a u32 value that specifies the
|
||||
+physical address of the register which should hold the common
|
||||
+entry point for a secondary CPU. This entry is cpu node specific
|
||||
+and should be added per cpu. E.g., in case of NSP (BCM58625) which
|
||||
+is a dual core CPU SoC, this entry should be added to cpu1 node.
|
||||
+
|
||||
+
|
||||
+Example:
|
||||
+ cpus {
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+ enable-method = "brcm,bcm-nsp-smp";
|
||||
+
|
||||
+ cpu0: cpu@0 {
|
||||
+ device_type = "cpu";
|
||||
+ compatible = "arm,cortex-a9";
|
||||
+ next-level-cache = <&L2>;
|
||||
+ reg = <0>;
|
||||
+ };
|
||||
+
|
||||
+ cpu1: cpu@1 {
|
||||
+ device_type = "cpu";
|
||||
+ compatible = "arm,cortex-a9";
|
||||
+ next-level-cache = <&L2>;
|
||||
+ reg = <1>;
|
||||
+ secondary-boot-reg = <0xffff042c>;
|
||||
+ };
|
||||
+ };
|
||||
--- a/Documentation/devicetree/bindings/arm/cpus.txt
|
||||
+++ b/Documentation/devicetree/bindings/arm/cpus.txt
|
||||
@@ -190,6 +190,7 @@ nodes to be present and contain the prop
|
||||
"allwinner,sun6i-a31"
|
||||
"allwinner,sun8i-a23"
|
||||
"arm,psci"
|
||||
+ "brcm,bcm-nsp-smp"
|
||||
"brcm,brahma-b15"
|
||||
"marvell,armada-375-smp"
|
||||
"marvell,armada-380-smp"
|
|
@ -1,141 +0,0 @@
|
|||
From 3ea03a9d512ca19d59315492230e954a1653ff6e Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
|
||||
Date: Tue, 26 Jan 2016 23:35:16 +0100
|
||||
Subject: [PATCH] ARM: BCM5301X: Add DT for D-Link DIR-885L
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
It's device based on BCM47094 which is quite similar to BCM4709 except
|
||||
for higher CPU frequency. This device has 2 flash memories, it boots
|
||||
from serial one and stores firmware on NAND. Other than that we define
|
||||
standard stuff like LEDs, buttons and UART.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
|
||||
--- a/arch/arm/boot/dts/Makefile
|
||||
+++ b/arch/arm/boot/dts/Makefile
|
||||
@@ -76,6 +76,7 @@ dtb-$(CONFIG_ARCH_BCM_5301X) += \
|
||||
bcm4709-buffalo-wxr-1900dhp.dtb \
|
||||
bcm4709-netgear-r7000.dtb \
|
||||
bcm4709-netgear-r8000.dtb \
|
||||
+ bcm47094-dlink-dir-885l.dtb \
|
||||
bcm94708.dtb \
|
||||
bcm94709.dtb \
|
||||
bcm953012k.dtb
|
||||
--- /dev/null
|
||||
+++ b/arch/arm/boot/dts/bcm47094-dlink-dir-885l.dts
|
||||
@@ -0,0 +1,111 @@
|
||||
+/*
|
||||
+ * Broadcom BCM470X / BCM5301X ARM platform code.
|
||||
+ * DTS for D-Link DIR-885L
|
||||
+ *
|
||||
+ * Copyright (C) 2016 Rafał Miłecki <zajec5@gmail.com>
|
||||
+ *
|
||||
+ * Licensed under the GNU/GPL. See COPYING for details.
|
||||
+ */
|
||||
+
|
||||
+/dts-v1/;
|
||||
+
|
||||
+#include "bcm4708.dtsi"
|
||||
+#include "bcm5301x-nand-cs0-bch8.dtsi"
|
||||
+
|
||||
+/ {
|
||||
+ compatible = "dlink,dir-885l", "brcm,bcm47094", "brcm,bcm4708";
|
||||
+ model = "D-Link DIR-885L";
|
||||
+
|
||||
+ chosen {
|
||||
+ bootargs = "console=ttyS0,115200";
|
||||
+ };
|
||||
+
|
||||
+ memory {
|
||||
+ reg = <0x00000000 0x08000000>;
|
||||
+ };
|
||||
+
|
||||
+ nand: nand@18028000 {
|
||||
+ nandcs@0 {
|
||||
+ partition@0 {
|
||||
+ label = "firmware";
|
||||
+ reg = <0x00000000 0x08000000>;
|
||||
+ };
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ leds {
|
||||
+ compatible = "gpio-leds";
|
||||
+
|
||||
+ power-white {
|
||||
+ label = "bcm53xx:white:power";
|
||||
+ gpios = <&chipcommon 0 GPIO_ACTIVE_LOW>;
|
||||
+ linux,default-trigger = "default-on";
|
||||
+ };
|
||||
+
|
||||
+ wan-white {
|
||||
+ label = "bcm53xx:white:wan";
|
||||
+ gpios = <&chipcommon 1 GPIO_ACTIVE_LOW>;
|
||||
+ linux,default-trigger = "default-off";
|
||||
+ };
|
||||
+
|
||||
+ power-amber {
|
||||
+ label = "bcm53xx:amber:power";
|
||||
+ gpios = <&chipcommon 2 GPIO_ACTIVE_LOW>;
|
||||
+ linux,default-trigger = "default-off";
|
||||
+ };
|
||||
+
|
||||
+ wan-amber {
|
||||
+ label = "bcm53xx:amber:wan";
|
||||
+ gpios = <&chipcommon 3 GPIO_ACTIVE_LOW>;
|
||||
+ linux,default-trigger = "default-off";
|
||||
+ };
|
||||
+
|
||||
+ usb3-white {
|
||||
+ label = "bcm53xx:white:usb3";
|
||||
+ gpios = <&chipcommon 8 GPIO_ACTIVE_LOW>;
|
||||
+ linux,default-trigger = "default-off";
|
||||
+ };
|
||||
+
|
||||
+ 2ghz {
|
||||
+ label = "bcm53xx:white:2ghz";
|
||||
+ gpios = <&chipcommon 13 GPIO_ACTIVE_LOW>;
|
||||
+ linux,default-trigger = "default-off";
|
||||
+ };
|
||||
+
|
||||
+ 5ghz {
|
||||
+ label = "bcm53xx:white:5ghz";
|
||||
+ gpios = <&chipcommon 14 GPIO_ACTIVE_LOW>;
|
||||
+ linux,default-trigger = "default-off";
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ gpio-keys {
|
||||
+ compatible = "gpio-keys";
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+
|
||||
+ wps {
|
||||
+ label = "WPS";
|
||||
+ linux,code = <KEY_WPS_BUTTON>;
|
||||
+ gpios = <&chipcommon 7 GPIO_ACTIVE_LOW>;
|
||||
+ };
|
||||
+
|
||||
+ /* Switch: router / extender */
|
||||
+ extender {
|
||||
+ label = "Extender";
|
||||
+ linux,code = <BTN_0>;
|
||||
+ gpios = <&chipcommon 10 GPIO_ACTIVE_LOW>;
|
||||
+ };
|
||||
+
|
||||
+ restart {
|
||||
+ label = "Reset";
|
||||
+ linux,code = <KEY_RESTART>;
|
||||
+ gpios = <&chipcommon 17 GPIO_ACTIVE_LOW>;
|
||||
+ };
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&uart0 {
|
||||
+ status = "okay";
|
||||
+ clock-frequency = <125000000>;
|
||||
+};
|
|
@ -1,117 +0,0 @@
|
|||
From dd70ccfaa79189feaa78609d44f7c3e7fa1dc6ff Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
|
||||
Date: Wed, 23 Mar 2016 16:52:47 +0100
|
||||
Subject: [PATCH] ARM: BCM5301X: Set vcc-gpio for USB controllers of few
|
||||
devices
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
There are few devices that have USB power controlled using GPIO. Linux
|
||||
USB host driver (bcma-hcd) already supports this by reading vcc-gpio
|
||||
from DT. Set it properly for all known devices.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm4708-buffalo-wzr-1750dhp.dts
|
||||
+++ b/arch/arm/boot/dts/bcm4708-buffalo-wzr-1750dhp.dts
|
||||
@@ -139,3 +139,11 @@
|
||||
&uart0 {
|
||||
status = "okay";
|
||||
};
|
||||
+
|
||||
+&usb2 {
|
||||
+ vcc-gpio = <&chipcommon 9 GPIO_ACTIVE_HIGH>;
|
||||
+};
|
||||
+
|
||||
+&usb3 {
|
||||
+ vcc-gpio = <&chipcommon 10 GPIO_ACTIVE_LOW>;
|
||||
+};
|
||||
--- a/arch/arm/boot/dts/bcm4708-netgear-r6250.dts
|
||||
+++ b/arch/arm/boot/dts/bcm4708-netgear-r6250.dts
|
||||
@@ -24,17 +24,6 @@
|
||||
reg = <0x00000000 0x08000000>;
|
||||
};
|
||||
|
||||
- axi@18000000 {
|
||||
- usb3@23000 {
|
||||
- reg = <0x00023000 0x1000>;
|
||||
-
|
||||
- #address-cells = <1>;
|
||||
- #size-cells = <1>;
|
||||
-
|
||||
- vcc-gpio = <&chipcommon 0 GPIO_ACTIVE_HIGH>;
|
||||
- };
|
||||
- };
|
||||
-
|
||||
leds {
|
||||
compatible = "gpio-leds";
|
||||
|
||||
@@ -97,3 +86,7 @@
|
||||
&uart0 {
|
||||
status = "okay";
|
||||
};
|
||||
+
|
||||
+&usb3 {
|
||||
+ vcc-gpio = <&chipcommon 0 GPIO_ACTIVE_HIGH>;
|
||||
+};
|
||||
--- a/arch/arm/boot/dts/bcm4709-buffalo-wxr-1900dhp.dts
|
||||
+++ b/arch/arm/boot/dts/bcm4709-buffalo-wxr-1900dhp.dts
|
||||
@@ -126,3 +126,8 @@
|
||||
};
|
||||
};
|
||||
};
|
||||
+
|
||||
+
|
||||
+&usb2 {
|
||||
+ vcc-gpio = <&chipcommon 13 GPIO_ACTIVE_HIGH>;
|
||||
+};
|
||||
--- a/arch/arm/boot/dts/bcm4709-netgear-r8000.dts
|
||||
+++ b/arch/arm/boot/dts/bcm4709-netgear-r8000.dts
|
||||
@@ -106,3 +106,11 @@
|
||||
};
|
||||
};
|
||||
};
|
||||
+
|
||||
+&usb2 {
|
||||
+ vcc-gpio = <&chipcommon 0 GPIO_ACTIVE_HIGH>;
|
||||
+};
|
||||
+
|
||||
+&usb3 {
|
||||
+ vcc-gpio = <&chipcommon 0 GPIO_ACTIVE_HIGH>;
|
||||
+};
|
||||
--- a/arch/arm/boot/dts/bcm47094-dlink-dir-885l.dts
|
||||
+++ b/arch/arm/boot/dts/bcm47094-dlink-dir-885l.dts
|
||||
@@ -109,3 +109,7 @@
|
||||
status = "okay";
|
||||
clock-frequency = <125000000>;
|
||||
};
|
||||
+
|
||||
+&usb3 {
|
||||
+ vcc-gpio = <&chipcommon 18 GPIO_ACTIVE_HIGH>;
|
||||
+};
|
||||
--- a/arch/arm/boot/dts/bcm5301x.dtsi
|
||||
+++ b/arch/arm/boot/dts/bcm5301x.dtsi
|
||||
@@ -207,6 +207,20 @@
|
||||
gpio-controller;
|
||||
#gpio-cells = <2>;
|
||||
};
|
||||
+
|
||||
+ usb2: usb2@21000 {
|
||||
+ reg = <0x00021000 0x1000>;
|
||||
+
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <1>;
|
||||
+ };
|
||||
+
|
||||
+ usb3: usb3@23000 {
|
||||
+ reg = <0x00023000 0x1000>;
|
||||
+
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <1>;
|
||||
+ };
|
||||
};
|
||||
|
||||
lcpll0: lcpll0@1800c100 {
|
|
@ -1,95 +0,0 @@
|
|||
From 5a6516ff135555aa53c7d156cd3973b826e011f9 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
|
||||
Date: Wed, 6 Apr 2016 18:49:55 +0200
|
||||
Subject: [PATCH] ARM: BCM5301X: Enable earlycon on tested devices
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
This allows reporting & debugging problems occurring early in the boot
|
||||
process.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
|
||||
Acked-by: Hauke Mehrtens <hauke@hauke-m.de>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm4708-buffalo-wzr-1750dhp.dts
|
||||
+++ b/arch/arm/boot/dts/bcm4708-buffalo-wzr-1750dhp.dts
|
||||
@@ -17,7 +17,7 @@
|
||||
model = "Buffalo WZR-1750DHP (BCM4708)";
|
||||
|
||||
chosen {
|
||||
- bootargs = "console=ttyS0,115200";
|
||||
+ bootargs = "console=ttyS0,115200 earlycon";
|
||||
};
|
||||
|
||||
memory {
|
||||
--- a/arch/arm/boot/dts/bcm4708-luxul-xwc-1000.dts
|
||||
+++ b/arch/arm/boot/dts/bcm4708-luxul-xwc-1000.dts
|
||||
@@ -17,7 +17,7 @@
|
||||
model = "Luxul XWC-1000 (BCM4708)";
|
||||
|
||||
chosen {
|
||||
- bootargs = "console=ttyS0,115200";
|
||||
+ bootargs = "console=ttyS0,115200 earlycon";
|
||||
};
|
||||
|
||||
memory {
|
||||
--- a/arch/arm/boot/dts/bcm4708-netgear-r6250.dts
|
||||
+++ b/arch/arm/boot/dts/bcm4708-netgear-r6250.dts
|
||||
@@ -17,7 +17,7 @@
|
||||
model = "Netgear R6250 V1 (BCM4708)";
|
||||
|
||||
chosen {
|
||||
- bootargs = "console=ttyS0,115200";
|
||||
+ bootargs = "console=ttyS0,115200 earlycon";
|
||||
};
|
||||
|
||||
memory {
|
||||
--- a/arch/arm/boot/dts/bcm4708-smartrg-sr400ac.dts
|
||||
+++ b/arch/arm/boot/dts/bcm4708-smartrg-sr400ac.dts
|
||||
@@ -17,7 +17,7 @@
|
||||
model = "SmartRG SR400ac";
|
||||
|
||||
chosen {
|
||||
- bootargs = "console=ttyS0,115200";
|
||||
+ bootargs = "console=ttyS0,115200 earlycon";
|
||||
};
|
||||
|
||||
memory {
|
||||
--- a/arch/arm/boot/dts/bcm47081-buffalo-wzr-600dhp2.dts
|
||||
+++ b/arch/arm/boot/dts/bcm47081-buffalo-wzr-600dhp2.dts
|
||||
@@ -17,7 +17,7 @@
|
||||
model = "Buffalo WZR-600DHP2 (BCM47081)";
|
||||
|
||||
chosen {
|
||||
- bootargs = "console=ttyS0,115200";
|
||||
+ bootargs = "console=ttyS0,115200 earlycon";
|
||||
};
|
||||
|
||||
memory {
|
||||
--- a/arch/arm/boot/dts/bcm47094-dlink-dir-885l.dts
|
||||
+++ b/arch/arm/boot/dts/bcm47094-dlink-dir-885l.dts
|
||||
@@ -17,7 +17,7 @@
|
||||
model = "D-Link DIR-885L";
|
||||
|
||||
chosen {
|
||||
- bootargs = "console=ttyS0,115200";
|
||||
+ bootargs = "console=ttyS0,115200 earlycon";
|
||||
};
|
||||
|
||||
memory {
|
||||
--- a/arch/arm/boot/dts/bcm5301x.dtsi
|
||||
+++ b/arch/arm/boot/dts/bcm5301x.dtsi
|
||||
@@ -18,6 +18,10 @@
|
||||
/ {
|
||||
interrupt-parent = <&gic>;
|
||||
|
||||
+ chosen {
|
||||
+ stdout-path = &uart0;
|
||||
+ };
|
||||
+
|
||||
chipcommonA {
|
||||
compatible = "simple-bus";
|
||||
ranges = <0x00000000 0x18000000 0x00001000>;
|
|
@ -1,58 +0,0 @@
|
|||
From 1b47b98acce2db0da632d056821420b33205b8b2 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
|
||||
Date: Tue, 19 Apr 2016 08:56:46 +0200
|
||||
Subject: [PATCH] ARM: BCM5301X: Add DT entry for SPI controller and NOR flash
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Controller is present on every BCM4708* board but only few devices have
|
||||
serial flash attached so mark it as disabled by default.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm4708-luxul-xwc-1000.dts
|
||||
+++ b/arch/arm/boot/dts/bcm4708-luxul-xwc-1000.dts
|
||||
@@ -59,3 +59,7 @@
|
||||
&uart0 {
|
||||
status = "okay";
|
||||
};
|
||||
+
|
||||
+&spi_nor {
|
||||
+ status = "okay";
|
||||
+};
|
||||
--- a/arch/arm/boot/dts/bcm4708-smartrg-sr400ac.dts
|
||||
+++ b/arch/arm/boot/dts/bcm4708-smartrg-sr400ac.dts
|
||||
@@ -122,3 +122,7 @@
|
||||
&uart0 {
|
||||
status = "okay";
|
||||
};
|
||||
+
|
||||
+&spi_nor {
|
||||
+ status = "okay";
|
||||
+};
|
||||
--- a/arch/arm/boot/dts/bcm5301x.dtsi
|
||||
+++ b/arch/arm/boot/dts/bcm5301x.dtsi
|
||||
@@ -225,6 +225,20 @@
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
};
|
||||
+
|
||||
+ spi@29000 {
|
||||
+ reg = <0x00029000 0x1000>;
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+
|
||||
+ spi_nor: spi-nor@0 {
|
||||
+ compatible = "jedec,spi-nor";
|
||||
+ reg = <0>;
|
||||
+ spi-max-frequency = <20000000>;
|
||||
+ linux,part-probe = "ofpart", "bcm47xxpart";
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+ };
|
||||
};
|
||||
|
||||
lcpll0: lcpll0@1800c100 {
|
|
@ -1,75 +0,0 @@
|
|||
From 5f79985dcfec73d7a09ed99c40c28b64552518fe Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
|
||||
Date: Wed, 27 Apr 2016 09:05:03 +0200
|
||||
Subject: [PATCH] ARM: BCM5301X: Enable SPI-NOR on dual flash devices
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Commit 1b47b98acce2 ("ARM: BCM5301X: Add DT entry for SPI controller and
|
||||
NOR flash") enabled SPI-NOR device on routers using serial flash only.
|
||||
However there are also devices with two flash memories:
|
||||
1) Small SPI attached flash used mostly for booting
|
||||
2) Bigger NAND used mostly for storing firmware
|
||||
On such devices we still need SPI-NOR e.g. to access NVRAM data.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/bcm4708-buffalo-wzr-1750dhp.dts | 4 ++++
|
||||
arch/arm/boot/dts/bcm4708-netgear-r6250.dts | 4 ++++
|
||||
arch/arm/boot/dts/bcm4708-netgear-r6300-v2.dts | 4 ++++
|
||||
arch/arm/boot/dts/bcm4709-buffalo-wxr-1900dhp.dts | 4 ++++
|
||||
arch/arm/boot/dts/bcm47094-dlink-dir-885l.dts | 4 ++++
|
||||
5 files changed, 20 insertions(+)
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm4708-buffalo-wzr-1750dhp.dts
|
||||
+++ b/arch/arm/boot/dts/bcm4708-buffalo-wzr-1750dhp.dts
|
||||
@@ -147,3 +147,7 @@
|
||||
&usb3 {
|
||||
vcc-gpio = <&chipcommon 10 GPIO_ACTIVE_LOW>;
|
||||
};
|
||||
+
|
||||
+&spi_nor {
|
||||
+ status = "okay";
|
||||
+};
|
||||
--- a/arch/arm/boot/dts/bcm4708-netgear-r6250.dts
|
||||
+++ b/arch/arm/boot/dts/bcm4708-netgear-r6250.dts
|
||||
@@ -90,3 +90,7 @@
|
||||
&usb3 {
|
||||
vcc-gpio = <&chipcommon 0 GPIO_ACTIVE_HIGH>;
|
||||
};
|
||||
+
|
||||
+&spi_nor {
|
||||
+ status = "okay";
|
||||
+};
|
||||
--- a/arch/arm/boot/dts/bcm4708-netgear-r6300-v2.dts
|
||||
+++ b/arch/arm/boot/dts/bcm4708-netgear-r6300-v2.dts
|
||||
@@ -82,3 +82,7 @@
|
||||
};
|
||||
};
|
||||
};
|
||||
+
|
||||
+&spi_nor {
|
||||
+ status = "okay";
|
||||
+};
|
||||
--- a/arch/arm/boot/dts/bcm4709-buffalo-wxr-1900dhp.dts
|
||||
+++ b/arch/arm/boot/dts/bcm4709-buffalo-wxr-1900dhp.dts
|
||||
@@ -131,3 +131,7 @@
|
||||
&usb2 {
|
||||
vcc-gpio = <&chipcommon 13 GPIO_ACTIVE_HIGH>;
|
||||
};
|
||||
+
|
||||
+&spi_nor {
|
||||
+ status = "okay";
|
||||
+};
|
||||
--- a/arch/arm/boot/dts/bcm47094-dlink-dir-885l.dts
|
||||
+++ b/arch/arm/boot/dts/bcm47094-dlink-dir-885l.dts
|
||||
@@ -113,3 +113,7 @@
|
||||
&usb3 {
|
||||
vcc-gpio = <&chipcommon 18 GPIO_ACTIVE_HIGH>;
|
||||
};
|
||||
+
|
||||
+&spi_nor {
|
||||
+ status = "okay";
|
||||
+};
|
|
@ -1,63 +0,0 @@
|
|||
From 59f0ce1a3ebb9288fc8c1400aa503e923621161e Mon Sep 17 00:00:00 2001
|
||||
From: Florian Fainelli <f.fainelli@gmail.com>
|
||||
Date: Mon, 23 May 2016 16:38:00 -0700
|
||||
Subject: [PATCH 1/3] ARM: dts: Enable SRAB switch and GMACs on 5301x DTS
|
||||
|
||||
Add the Switch Register Access Block which is a special piece of
|
||||
hardware allowing us to perform indirect read/writes towards the
|
||||
integrated BCM5301X Ethernet switch.
|
||||
|
||||
We also add the 4 Gigabit MAC Device Tree nodes within the brcm,bus-axi
|
||||
bus node to get proper binding between the BCMA instantiated core and
|
||||
the Device Tree nodes. We will need that to be able to reference
|
||||
Ethernet Device Tree nodes in a future patch adding the switch ports
|
||||
layout.
|
||||
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/bcm5301x.dtsi | 27 +++++++++++++++++++++++++++
|
||||
1 file changed, 27 insertions(+)
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm5301x.dtsi
|
||||
+++ b/arch/arm/boot/dts/bcm5301x.dtsi
|
||||
@@ -239,6 +239,22 @@
|
||||
status = "disabled";
|
||||
};
|
||||
};
|
||||
+
|
||||
+ gmac0: ethernet@24000 {
|
||||
+ reg = <0x24000 0x800>;
|
||||
+ };
|
||||
+
|
||||
+ gmac1: ethernet@25000 {
|
||||
+ reg = <0x25000 0x800>;
|
||||
+ };
|
||||
+
|
||||
+ gmac2: ethernet@26000 {
|
||||
+ reg = <0x26000 0x800>;
|
||||
+ };
|
||||
+
|
||||
+ gmac3: ethernet@27000 {
|
||||
+ reg = <0x27000 0x800>;
|
||||
+ };
|
||||
};
|
||||
|
||||
lcpll0: lcpll0@1800c100 {
|
||||
@@ -260,6 +276,17 @@
|
||||
"sata2";
|
||||
};
|
||||
|
||||
+ srab: srab@18007000 {
|
||||
+ compatible = "brcm,bcm5301x-srab";
|
||||
+ reg = <0x18007000 0x1000>;
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+
|
||||
+ status = "disabled";
|
||||
+
|
||||
+ /* ports are defined in board DTS */
|
||||
+ };
|
||||
+
|
||||
nand: nand@18028000 {
|
||||
compatible = "brcm,nand-iproc", "brcm,brcmnand-v6.1", "brcm,brcmnand";
|
||||
reg = <0x18028000 0x600>, <0x1811a408 0x600>, <0x18028f00 0x20>;
|
|
@ -1,38 +0,0 @@
|
|||
From 2cd0c0202f138fa95b3fbb027e87b191ad0b1884 Mon Sep 17 00:00:00 2001
|
||||
From: Florian Fainelli <f.fainelli@gmail.com>
|
||||
Date: Tue, 24 May 2016 11:41:58 -0700
|
||||
Subject: [PATCH 2/3] ARM: dts: BCM5301X: Add SRAB interrupts
|
||||
|
||||
Add interrupt mapping for the Switch Register Access Block. Only 12
|
||||
interrupts are usable at the moment even though up to 32 are dedicated
|
||||
to the SRAB.
|
||||
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/bcm5301x.dtsi | 15 +++++++++++++++
|
||||
1 file changed, 15 insertions(+)
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm5301x.dtsi
|
||||
+++ b/arch/arm/boot/dts/bcm5301x.dtsi
|
||||
@@ -153,6 +153,21 @@
|
||||
/* ChipCommon */
|
||||
<0x00000000 0 &gic GIC_SPI 85 IRQ_TYPE_LEVEL_HIGH>,
|
||||
|
||||
+ /* Switch Register Access Block */
|
||||
+ <0x00007000 0 &gic GIC_SPI 95 IRQ_TYPE_LEVEL_HIGH>,
|
||||
+ <0x00007000 1 &gic GIC_SPI 96 IRQ_TYPE_LEVEL_HIGH>,
|
||||
+ <0x00007000 2 &gic GIC_SPI 97 IRQ_TYPE_LEVEL_HIGH>,
|
||||
+ <0x00007000 3 &gic GIC_SPI 98 IRQ_TYPE_LEVEL_HIGH>,
|
||||
+ <0x00007000 4 &gic GIC_SPI 99 IRQ_TYPE_LEVEL_HIGH>,
|
||||
+ <0x00007000 5 &gic GIC_SPI 100 IRQ_TYPE_LEVEL_HIGH>,
|
||||
+ <0x00007000 6 &gic GIC_SPI 101 IRQ_TYPE_LEVEL_HIGH>,
|
||||
+ <0x00007000 7 &gic GIC_SPI 102 IRQ_TYPE_LEVEL_HIGH>,
|
||||
+ <0x00007000 8 &gic GIC_SPI 103 IRQ_TYPE_LEVEL_HIGH>,
|
||||
+ <0x00007000 9 &gic GIC_SPI 104 IRQ_TYPE_LEVEL_HIGH>,
|
||||
+ <0x00007000 10 &gic GIC_SPI 105 IRQ_TYPE_LEVEL_HIGH>,
|
||||
+ <0x00007000 11 &gic GIC_SPI 106 IRQ_TYPE_LEVEL_HIGH>,
|
||||
+ <0x00007000 12 &gic GIC_SPI 107 IRQ_TYPE_LEVEL_HIGH>,
|
||||
+
|
||||
/* PCIe Controller 0 */
|
||||
<0x00012000 0 &gic GIC_SPI 126 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0x00012000 1 &gic GIC_SPI 127 IRQ_TYPE_LEVEL_HIGH>,
|
|
@ -1,60 +0,0 @@
|
|||
From 2df1808dc0e2b5358e13beb95192b15200017776 Mon Sep 17 00:00:00 2001
|
||||
From: Florian Fainelli <f.fainelli@gmail.com>
|
||||
Date: Wed, 25 May 2016 16:55:35 -0700
|
||||
Subject: [PATCH 3/3] ARM: dts: BCM5310x: Enable switch ports on SmartRG
|
||||
SR400AC
|
||||
|
||||
Define the port mapping for the SmartRG SR400ACE device.
|
||||
|
||||
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/bcm4708-smartrg-sr400ac.dts | 40 +++++++++++++++++++++++++++
|
||||
1 file changed, 40 insertions(+)
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm4708-smartrg-sr400ac.dts
|
||||
+++ b/arch/arm/boot/dts/bcm4708-smartrg-sr400ac.dts
|
||||
@@ -126,3 +126,43 @@
|
||||
&spi_nor {
|
||||
status = "okay";
|
||||
};
|
||||
+
|
||||
+&srab {
|
||||
+ status = "okay";
|
||||
+
|
||||
+ ports {
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+
|
||||
+ port@0 {
|
||||
+ reg = <0>;
|
||||
+ label = "lan4";
|
||||
+ };
|
||||
+
|
||||
+ port@1 {
|
||||
+ reg = <1>;
|
||||
+ label = "lan3";
|
||||
+ };
|
||||
+
|
||||
+ port@2 {
|
||||
+ reg = <2>;
|
||||
+ label = "lan2";
|
||||
+ };
|
||||
+
|
||||
+ port@3 {
|
||||
+ reg = <3>;
|
||||
+ label = "lan1";
|
||||
+ };
|
||||
+
|
||||
+ port@4 {
|
||||
+ reg = <4>;
|
||||
+ label = "wan";
|
||||
+ };
|
||||
+
|
||||
+ port@5 {
|
||||
+ reg = <5>;
|
||||
+ label = "cpu";
|
||||
+ ethernet = <&gmac0>;
|
||||
+ };
|
||||
+ };
|
||||
+};
|
|
@ -1,27 +0,0 @@
|
|||
From 36e55669ebdef9eaf3f4ab4e82a07bb4b95a4813 Mon Sep 17 00:00:00 2001
|
||||
From: Florian Fainelli <f.fainelli@gmail.com>
|
||||
Date: Wed, 22 Jun 2016 17:27:03 -0700
|
||||
Subject: [PATCH] ARM: dts: BCM5301x: Add RNG Device Tree node
|
||||
|
||||
Add the DT node for the random number generator peripheral.
|
||||
|
||||
Acked-by: Scott Branden <scott.branden@broadcom.com>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/bcm5301x.dtsi | 5 +++++
|
||||
1 file changed, 5 insertions(+)
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm5301x.dtsi
|
||||
+++ b/arch/arm/boot/dts/bcm5301x.dtsi
|
||||
@@ -302,6 +302,11 @@
|
||||
/* ports are defined in board DTS */
|
||||
};
|
||||
|
||||
+ rng: rng@18004000 {
|
||||
+ compatible = "brcm,bcm5301x-rng";
|
||||
+ reg = <0x18004000 0x14>;
|
||||
+ };
|
||||
+
|
||||
nand: nand@18028000 {
|
||||
compatible = "brcm,nand-iproc", "brcm,brcmnand-v6.1", "brcm,brcmnand";
|
||||
reg = <0x18028000 0x600>, <0x1811a408 0x600>, <0x18028f00 0x20>;
|
|
@ -1,139 +0,0 @@
|
|||
From f8c331bda6a90b239f600020eec1b0defe7249b5 Mon Sep 17 00:00:00 2001
|
||||
From: Florian Fainelli <f.fainelli@gmail.com>
|
||||
Date: Wed, 22 Jun 2016 17:00:35 -0700
|
||||
Subject: [PATCH] ARM: dts: BCM5301x: Add BCM953012ER board
|
||||
|
||||
Add support for the Broadcom BCM953012 Enterprise Router reference
|
||||
board, enable the following peripherals:
|
||||
|
||||
- UART0 (UART1 is not populated)
|
||||
- WPS and restart GPIO buttons
|
||||
- Ethernet switch w/ only two facing ports
|
||||
- NAND flash
|
||||
- SPI-NOR flash
|
||||
|
||||
Acked-by: Jon Mason <jon.mason@broadcom.com>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/Makefile | 1 +
|
||||
arch/arm/boot/dts/bcm953012er.dts | 104 ++++++++++++++++++++++++++++++++++++++
|
||||
2 files changed, 105 insertions(+)
|
||||
create mode 100644 arch/arm/boot/dts/bcm953012er.dts
|
||||
|
||||
--- a/arch/arm/boot/dts/Makefile
|
||||
+++ b/arch/arm/boot/dts/Makefile
|
||||
@@ -79,6 +79,7 @@ dtb-$(CONFIG_ARCH_BCM_5301X) += \
|
||||
bcm47094-dlink-dir-885l.dtb \
|
||||
bcm94708.dtb \
|
||||
bcm94709.dtb \
|
||||
+ bcm953012er.dtb \
|
||||
bcm953012k.dtb
|
||||
dtb-$(CONFIG_ARCH_BCM_63XX) += \
|
||||
bcm963138dvt.dtb
|
||||
--- /dev/null
|
||||
+++ b/arch/arm/boot/dts/bcm953012er.dts
|
||||
@@ -0,0 +1,104 @@
|
||||
+/*
|
||||
+ * BSD LICENSE
|
||||
+ *
|
||||
+ * Copyright(c) 2016 Broadcom. All rights reserved.
|
||||
+ *
|
||||
+ * Redistribution and use in source and binary forms, with or without
|
||||
+ * modification, are permitted provided that the following conditions
|
||||
+ * are met:
|
||||
+ *
|
||||
+ * * Redistributions of source code must retain the above copyright
|
||||
+ * notice, this list of conditions and the following disclaimer.
|
||||
+ * * Redistributions in binary form must reproduce the above copyright
|
||||
+ * notice, this list of conditions and the following disclaimer in
|
||||
+ * the documentation and/or other materials provided with the
|
||||
+ * distribution.
|
||||
+ * * Neither the name of Broadcom Corporation nor the names of its
|
||||
+ * contributors may be used to endorse or promote products derived
|
||||
+ * from this software without specific prior written permission.
|
||||
+ *
|
||||
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
+ */
|
||||
+
|
||||
+/dts-v1/;
|
||||
+
|
||||
+#include "bcm4708.dtsi"
|
||||
+#include "bcm5301x-nand-cs0-bch8.dtsi"
|
||||
+
|
||||
+/ {
|
||||
+ model = "NorthStar Enterprise Router (BCM953012ER)";
|
||||
+ compatible = "brcm,bcm953012er", "brcm,brcm53012", "brcm,bcm4708";
|
||||
+
|
||||
+ aliases {
|
||||
+ serial0 = &uart0;
|
||||
+ };
|
||||
+
|
||||
+ chosen {
|
||||
+ stdout-path = "serial0:115200n8";
|
||||
+ };
|
||||
+
|
||||
+ memory {
|
||||
+ reg = <0x00000000 0x8000000>;
|
||||
+ };
|
||||
+
|
||||
+ gpio-keys {
|
||||
+ compatible = "gpio-keys";
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+
|
||||
+ wps {
|
||||
+ label = "WPS";
|
||||
+ linux,code = <KEY_WPS_BUTTON>;
|
||||
+ gpios = <&chipcommon 6 GPIO_ACTIVE_LOW>;
|
||||
+ };
|
||||
+
|
||||
+ restart {
|
||||
+ label = "Reset";
|
||||
+ linux,code = <KEY_RESTART>;
|
||||
+ gpios = <&chipcommon 15 GPIO_ACTIVE_LOW>;
|
||||
+ };
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&uart0 {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&spi_nor {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&srab {
|
||||
+ status = "okay";
|
||||
+
|
||||
+ ports {
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+
|
||||
+ port@0 {
|
||||
+ reg = <0>;
|
||||
+ label = "port0";
|
||||
+ };
|
||||
+
|
||||
+ port@1 {
|
||||
+ reg = <1>;
|
||||
+ label = "port1";
|
||||
+ };
|
||||
+
|
||||
+ port@5 {
|
||||
+ reg = <5>;
|
||||
+ label = "cpu";
|
||||
+ ethernet = <&gmac0>;
|
||||
+ };
|
||||
+ };
|
||||
+};
|
|
@ -1,65 +0,0 @@
|
|||
From 8ab5f1fbd39c29125403678a0caf0a71046da361 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
|
||||
Date: Mon, 6 Jun 2016 09:43:49 +0200
|
||||
Subject: [PATCH 1/2] ARM: BCM5301X: Specify NAND chip select and ECC in
|
||||
separated files
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Using separated file with common chip select parameters will allow us
|
||||
adding other ECC setups without code duplication.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/bcm5301x-nand-cs0-bch8.dtsi | 16 +++++-----------
|
||||
arch/arm/boot/dts/bcm5301x-nand-cs0.dtsi | 18 ++++++++++++++++++
|
||||
2 files changed, 23 insertions(+), 11 deletions(-)
|
||||
create mode 100644 arch/arm/boot/dts/bcm5301x-nand-cs0.dtsi
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm5301x-nand-cs0-bch8.dtsi
|
||||
+++ b/arch/arm/boot/dts/bcm5301x-nand-cs0-bch8.dtsi
|
||||
@@ -9,16 +9,10 @@
|
||||
* Licensed under the GNU/GPL. See COPYING for details.
|
||||
*/
|
||||
|
||||
-/ {
|
||||
- nand@18028000 {
|
||||
- nandcs@0 {
|
||||
- compatible = "brcm,nandcs";
|
||||
- reg = <0>;
|
||||
- #address-cells = <1>;
|
||||
- #size-cells = <1>;
|
||||
+#include "bcm5301x-nand-cs0.dtsi"
|
||||
|
||||
- nand-ecc-strength = <8>;
|
||||
- nand-ecc-step-size = <512>;
|
||||
- };
|
||||
- };
|
||||
+&nandcs {
|
||||
+ nand-ecc-algo = "bch";
|
||||
+ nand-ecc-strength = <8>;
|
||||
+ nand-ecc-step-size = <512>;
|
||||
};
|
||||
--- /dev/null
|
||||
+++ b/arch/arm/boot/dts/bcm5301x-nand-cs0.dtsi
|
||||
@@ -0,0 +1,18 @@
|
||||
+/*
|
||||
+ * Broadcom Northstar NAND.
|
||||
+ *
|
||||
+ * Copyright (C) 2015 Hauke Mehrtens <hauke@hauke-m.de>
|
||||
+ *
|
||||
+ * Licensed under the GNU/GPL. See COPYING for details.
|
||||
+ */
|
||||
+
|
||||
+/ {
|
||||
+ nand@18028000 {
|
||||
+ nandcs: nandcs@0 {
|
||||
+ compatible = "brcm,nandcs";
|
||||
+ reg = <0>;
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <1>;
|
||||
+ };
|
||||
+ };
|
||||
+};
|
|
@ -1,49 +0,0 @@
|
|||
From 70a0ae1c33572f012b734d4b574f38136c57f1a0 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
|
||||
Date: Mon, 6 Jun 2016 09:43:50 +0200
|
||||
Subject: [PATCH 2/2] ARM: BCM5301X: Fix NAND ECC parameters for D-Link
|
||||
DIR-885L
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
This device uses BCH-1 instead of BCH-8. This fixes ECC errors and makes
|
||||
NAND usable with brcmnand.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/bcm47094-dlink-dir-885l.dts | 2 +-
|
||||
arch/arm/boot/dts/bcm5301x-nand-cs0-bch1.dtsi | 15 +++++++++++++++
|
||||
2 files changed, 16 insertions(+), 1 deletion(-)
|
||||
create mode 100644 arch/arm/boot/dts/bcm5301x-nand-cs0-bch1.dtsi
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm47094-dlink-dir-885l.dts
|
||||
+++ b/arch/arm/boot/dts/bcm47094-dlink-dir-885l.dts
|
||||
@@ -10,7 +10,7 @@
|
||||
/dts-v1/;
|
||||
|
||||
#include "bcm4708.dtsi"
|
||||
-#include "bcm5301x-nand-cs0-bch8.dtsi"
|
||||
+#include "bcm5301x-nand-cs0-bch1.dtsi"
|
||||
|
||||
/ {
|
||||
compatible = "dlink,dir-885l", "brcm,bcm47094", "brcm,bcm4708";
|
||||
--- /dev/null
|
||||
+++ b/arch/arm/boot/dts/bcm5301x-nand-cs0-bch1.dtsi
|
||||
@@ -0,0 +1,15 @@
|
||||
+/*
|
||||
+ * Broadcom Northstar NAND.
|
||||
+ *
|
||||
+ * Copyright (C) 2016 Rafał Miłecki <rafal.milecki@gmail.com>
|
||||
+ *
|
||||
+ * Licensed under the ISC license.
|
||||
+ */
|
||||
+
|
||||
+#include "bcm5301x-nand-cs0.dtsi"
|
||||
+
|
||||
+&nandcs {
|
||||
+ nand-ecc-algo = "bch";
|
||||
+ nand-ecc-strength = <1>;
|
||||
+ nand-ecc-step-size = <512>;
|
||||
+};
|
|
@ -1,46 +0,0 @@
|
|||
From 773880f77ae0a6782dd3da176bd25d85ff3a8c7f Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
|
||||
Date: Wed, 1 Jun 2016 22:07:07 +0200
|
||||
Subject: [PATCH] ARM: BCM5301X: Specify PHY of USB 2.0 in DT
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Driver for Northstar USB 2.0 PHY was added in 4.7-rc1 by:
|
||||
commit d3feb4067335 ("phy: bcm-ns-usb2: new driver for USB 2.0 PHY on
|
||||
Northstar").
|
||||
It should be used to let EHCI platform driver init PHY.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/bcm5301x.dtsi | 11 +++++++++++
|
||||
1 file changed, 11 insertions(+)
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm5301x.dtsi
|
||||
+++ b/arch/arm/boot/dts/bcm5301x.dtsi
|
||||
@@ -140,6 +140,15 @@
|
||||
};
|
||||
};
|
||||
|
||||
+ usb2_phy: usb2-phy {
|
||||
+ compatible = "brcm,ns-usb2-phy";
|
||||
+ reg = <0x1800c000 0x1000>;
|
||||
+ reg-names = "dmu";
|
||||
+ #phy-cells = <0>;
|
||||
+ clocks = <&genpll BCM_NSP_GENPLL_USB_PHY_REF_CLK>;
|
||||
+ clock-names = "phy-ref-clk";
|
||||
+ };
|
||||
+
|
||||
axi@18000000 {
|
||||
compatible = "brcm,bus-axi";
|
||||
reg = <0x18000000 0x1000>;
|
||||
@@ -232,6 +241,8 @@
|
||||
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
+
|
||||
+ phys = <&usb2_phy>;
|
||||
};
|
||||
|
||||
usb3: usb3@23000 {
|
|
@ -1,61 +0,0 @@
|
|||
From 4ebd50472899eb07d5dfc24f2015dce6fe3c5cb8 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Sun, 21 Aug 2016 19:01:38 +0200
|
||||
Subject: [PATCH] ARM: BCM53573: Initial support for Broadcom BCM53573 SoCs
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
BCM53573 series is a new family with embedded wireless. By marketing
|
||||
people it's sometimes called Northstar but it uses different CPU and has
|
||||
different architecture so we need a new symbol for it.
|
||||
Fortunately it shares some peripherals with other iProc based SoCs so we
|
||||
will be able to reuse some drivers/bindings.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Acked-by: Jon Mason <jon.mason@broadcom.com>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
MAINTAINERS | 7 +++++++
|
||||
arch/arm/mach-bcm/Kconfig | 14 ++++++++++++++
|
||||
2 files changed, 21 insertions(+)
|
||||
|
||||
--- a/MAINTAINERS
|
||||
+++ b/MAINTAINERS
|
||||
@@ -2338,6 +2338,13 @@ F: arch/arm/mach-bcm/bcm_5301x.c
|
||||
F: arch/arm/boot/dts/bcm5301x.dtsi
|
||||
F: arch/arm/boot/dts/bcm470*
|
||||
|
||||
+BROADCOM BCM53573 ARM ARCHITECTURE
|
||||
+M: Rafał Miłecki <rafal@milecki.pl>
|
||||
+L: linux-arm-kernel@lists.infradead.org
|
||||
+S: Maintained
|
||||
+F: arch/arm/boot/dts/bcm53573*
|
||||
+F: arch/arm/boot/dts/bcm47189*
|
||||
+
|
||||
BROADCOM BCM63XX ARM ARCHITECTURE
|
||||
M: Florian Fainelli <f.fainelli@gmail.com>
|
||||
L: linux-arm-kernel@lists.infradead.org
|
||||
--- a/arch/arm/mach-bcm/Kconfig
|
||||
+++ b/arch/arm/mach-bcm/Kconfig
|
||||
@@ -141,6 +141,20 @@ config ARCH_BCM2835
|
||||
This enables support for the Broadcom BCM2835 SoC. This SoC is
|
||||
used in the Raspberry Pi and Roku 2 devices.
|
||||
|
||||
+config ARCH_BCM_53573
|
||||
+ bool "Broadcom BCM53573 SoC series support"
|
||||
+ depends on ARCH_MULTI_V7
|
||||
+ select ARCH_BCM_IPROC
|
||||
+ select HAVE_ARM_ARCH_TIMER
|
||||
+ help
|
||||
+ BCM53573 series is set of SoCs using ARM Cortex-A7 CPUs with wireless
|
||||
+ embedded in the chipset.
|
||||
+ This SoC line is mostly used in home routers and is some cheaper
|
||||
+ alternative for Northstar family.
|
||||
+
|
||||
+ The base chip is BCM53573 and there are some packaging modifications
|
||||
+ like BCM47189 and BCM47452.
|
||||
+
|
||||
config ARCH_BCM_63XX
|
||||
bool "Broadcom BCM63xx DSL SoC" if ARCH_MULTI_V7
|
||||
depends on MMU
|
|
@ -1,136 +0,0 @@
|
|||
From b5057e498da8211ac3cc8ff5780034e5da61d077 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Tue, 23 Aug 2016 08:40:32 +0200
|
||||
Subject: [PATCH] ARM: BCM5301X: Add DT for Netgear R8500
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Netgear R8500 is another BCM47094 device, it just has three BCM4366
|
||||
wireless chipsets. It's a very standard DT with mostly GPIO devices.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/Makefile | 1 +
|
||||
arch/arm/boot/dts/bcm47094-netgear-r8500.dts | 104 +++++++++++++++++++++++++++
|
||||
2 files changed, 105 insertions(+)
|
||||
create mode 100644 arch/arm/boot/dts/bcm47094-netgear-r8500.dts
|
||||
|
||||
--- a/arch/arm/boot/dts/Makefile
|
||||
+++ b/arch/arm/boot/dts/Makefile
|
||||
@@ -77,6 +77,7 @@ dtb-$(CONFIG_ARCH_BCM_5301X) += \
|
||||
bcm4709-netgear-r7000.dtb \
|
||||
bcm4709-netgear-r8000.dtb \
|
||||
bcm47094-dlink-dir-885l.dtb \
|
||||
+ bcm47094-netgear-r8500.dtb \
|
||||
bcm94708.dtb \
|
||||
bcm94709.dtb \
|
||||
bcm953012er.dtb \
|
||||
--- /dev/null
|
||||
+++ b/arch/arm/boot/dts/bcm47094-netgear-r8500.dts
|
||||
@@ -0,0 +1,104 @@
|
||||
+/*
|
||||
+ * Copyright (C) 2016 Rafał Miłecki <rafal@milecki.pl>
|
||||
+ *
|
||||
+ * Licensed under the ISC license.
|
||||
+ */
|
||||
+
|
||||
+/dts-v1/;
|
||||
+
|
||||
+#include "bcm4708.dtsi"
|
||||
+#include "bcm5301x-nand-cs0-bch8.dtsi"
|
||||
+
|
||||
+/ {
|
||||
+ compatible = "netgear,r8500", "brcm,bcm47094", "brcm,bcm4708";
|
||||
+ model = "Netgear R8500";
|
||||
+
|
||||
+ chosen {
|
||||
+ bootargs = "console=ttyS0,115200";
|
||||
+ };
|
||||
+
|
||||
+ memory {
|
||||
+ reg = <0x00000000 0x08000000>;
|
||||
+ };
|
||||
+
|
||||
+ leds {
|
||||
+ compatible = "gpio-leds";
|
||||
+
|
||||
+ power0 {
|
||||
+ label = "bcm53xx:white:power";
|
||||
+ gpios = <&chipcommon 2 GPIO_ACTIVE_LOW>;
|
||||
+ linux,default-trigger = "default-on";
|
||||
+ };
|
||||
+
|
||||
+ power1 {
|
||||
+ label = "bcm53xx:amber:power";
|
||||
+ gpios = <&chipcommon 3 GPIO_ACTIVE_LOW>;
|
||||
+ linux,default-trigger = "default-off";
|
||||
+ };
|
||||
+
|
||||
+ 5ghz-1 {
|
||||
+ label = "bcm53xx:white:5ghz-1";
|
||||
+ gpios = <&chipcommon 11 GPIO_ACTIVE_LOW>;
|
||||
+ linux,default-trigger = "default-off";
|
||||
+ };
|
||||
+
|
||||
+ 5ghz-2 {
|
||||
+ label = "bcm53xx:white:5ghz-2";
|
||||
+ gpios = <&chipcommon 12 GPIO_ACTIVE_LOW>;
|
||||
+ linux,default-trigger = "default-off";
|
||||
+ };
|
||||
+
|
||||
+ 2ghz {
|
||||
+ label = "bcm53xx:white:2ghz";
|
||||
+ gpios = <&chipcommon 13 GPIO_ACTIVE_LOW>;
|
||||
+ linux,default-trigger = "default-off";
|
||||
+ };
|
||||
+
|
||||
+ usb2 {
|
||||
+ label = "bcm53xx:white:usb2";
|
||||
+ gpios = <&chipcommon 17 GPIO_ACTIVE_LOW>;
|
||||
+ linux,default-trigger = "default-off";
|
||||
+ };
|
||||
+
|
||||
+ usb3 {
|
||||
+ label = "bcm53xx:white:usb3";
|
||||
+ gpios = <&chipcommon 18 GPIO_ACTIVE_LOW>;
|
||||
+ linux,default-trigger = "default-off";
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ gpio-keys {
|
||||
+ compatible = "gpio-keys";
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+
|
||||
+ brightness {
|
||||
+ label = "Backlight";
|
||||
+ linux,code = <KEY_BRIGHTNESS_ZERO>;
|
||||
+ gpios = <&chipcommon 1 GPIO_ACTIVE_LOW>;
|
||||
+ };
|
||||
+
|
||||
+ restart {
|
||||
+ label = "Reset";
|
||||
+ linux,code = <KEY_RESTART>;
|
||||
+ gpios = <&chipcommon 10 GPIO_ACTIVE_LOW>;
|
||||
+ };
|
||||
+
|
||||
+ wps {
|
||||
+ label = "WPS";
|
||||
+ linux,code = <KEY_WPS_BUTTON>;
|
||||
+ gpios = <&chipcommon 14 GPIO_ACTIVE_LOW>;
|
||||
+ };
|
||||
+
|
||||
+ rfkill {
|
||||
+ label = "WiFi";
|
||||
+ linux,code = <KEY_RFKILL>;
|
||||
+ gpios = <&chipcommon 20 GPIO_ACTIVE_LOW>;
|
||||
+ };
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&uart0 {
|
||||
+ status = "okay";
|
||||
+ clock-frequency = <125000000>;
|
||||
+};
|
|
@ -1,264 +0,0 @@
|
|||
From 21c29be6a69d3ef4f5a2e16272deb4845f8208ad Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
|
||||
Date: Tue, 23 Aug 2016 07:37:43 +0200
|
||||
Subject: [PATCH] ARM: BCM5301X: Add basic dts for BCM53573 based Tenda AC9
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
BCM53573 seems to be low priced alternative for Northstar chipsts. It
|
||||
uses single core Cortex-A7 and doesn't have SDU or local (TWD) timer. It
|
||||
was also stripped out of independent SPI controller and 2 GMACs.
|
||||
|
||||
DTS for Tenda AC9 isn't completed yet. It misses e.g. switch entry (we
|
||||
still need some b53 fixes) and probably some clocks. It adds support for
|
||||
basic features however and can be improved later.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/Makefile | 2 +
|
||||
arch/arm/boot/dts/bcm47189-tenda-ac9.dts | 74 ++++++++++++++++
|
||||
arch/arm/boot/dts/bcm53573.dtsi | 147 +++++++++++++++++++++++++++++++
|
||||
3 files changed, 223 insertions(+)
|
||||
create mode 100644 arch/arm/boot/dts/bcm47189-tenda-ac9.dts
|
||||
create mode 100644 arch/arm/boot/dts/bcm53573.dtsi
|
||||
|
||||
--- a/arch/arm/boot/dts/Makefile
|
||||
+++ b/arch/arm/boot/dts/Makefile
|
||||
@@ -82,6 +82,8 @@ dtb-$(CONFIG_ARCH_BCM_5301X) += \
|
||||
bcm94709.dtb \
|
||||
bcm953012er.dtb \
|
||||
bcm953012k.dtb
|
||||
+dtb-$(CONFIG_ARCH_BCM_53573) += \
|
||||
+ bcm47189-tenda-ac9.dtb
|
||||
dtb-$(CONFIG_ARCH_BCM_63XX) += \
|
||||
bcm963138dvt.dtb
|
||||
dtb-$(CONFIG_ARCH_BCM_CYGNUS) += \
|
||||
--- /dev/null
|
||||
+++ b/arch/arm/boot/dts/bcm47189-tenda-ac9.dts
|
||||
@@ -0,0 +1,74 @@
|
||||
+/*
|
||||
+ * Copyright (C) 2016 Rafał Miłecki <rafal@milecki.pl>
|
||||
+ *
|
||||
+ * Licensed under the ISC license.
|
||||
+ */
|
||||
+
|
||||
+/dts-v1/;
|
||||
+
|
||||
+#include "bcm53573.dtsi"
|
||||
+
|
||||
+/ {
|
||||
+ compatible = "tenda,ac9", "brcm,bcm47189", "brcm,bcm53573";
|
||||
+ model = "Tenda AC9";
|
||||
+
|
||||
+ chosen {
|
||||
+ bootargs = "console=ttyS0,115200 earlycon";
|
||||
+ };
|
||||
+
|
||||
+ memory {
|
||||
+ reg = <0x00000000 0x08000000>;
|
||||
+ };
|
||||
+
|
||||
+ leds {
|
||||
+ compatible = "gpio-leds";
|
||||
+
|
||||
+ usb {
|
||||
+ label = "bcm53xx:blue:usb";
|
||||
+ gpios = <&chipcommon 1 GPIO_ACTIVE_HIGH>;
|
||||
+ linux,default-trigger = "default-off";
|
||||
+ };
|
||||
+
|
||||
+ wps {
|
||||
+ label = "bcm53xx:blue:wps";
|
||||
+ gpios = <&chipcommon 10 GPIO_ACTIVE_HIGH>;
|
||||
+ linux,default-trigger = "default-off";
|
||||
+ };
|
||||
+
|
||||
+ 5ghz {
|
||||
+ label = "bcm53xx:blue:5ghz";
|
||||
+ gpios = <&chipcommon 11 GPIO_ACTIVE_HIGH>;
|
||||
+ linux,default-trigger = "default-off";
|
||||
+ };
|
||||
+
|
||||
+ system {
|
||||
+ label = "bcm53xx:blue:system";
|
||||
+ gpios = <&chipcommon 15 GPIO_ACTIVE_HIGH>;
|
||||
+ linux,default-trigger = "timer";
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ gpio-keys {
|
||||
+ compatible = "gpio-keys";
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+
|
||||
+ rfkill {
|
||||
+ label = "WiFi";
|
||||
+ linux,code = <KEY_RFKILL>;
|
||||
+ gpios = <&chipcommon 3 GPIO_ACTIVE_LOW>;
|
||||
+ };
|
||||
+
|
||||
+ restart {
|
||||
+ label = "Reset";
|
||||
+ linux,code = <KEY_RESTART>;
|
||||
+ gpios = <&chipcommon 7 GPIO_ACTIVE_LOW>;
|
||||
+ };
|
||||
+
|
||||
+ wps {
|
||||
+ label = "WPS";
|
||||
+ linux,code = <KEY_WPS_BUTTON>;
|
||||
+ gpios = <&chipcommon 9 GPIO_ACTIVE_LOW>;
|
||||
+ };
|
||||
+ };
|
||||
+};
|
||||
--- /dev/null
|
||||
+++ b/arch/arm/boot/dts/bcm53573.dtsi
|
||||
@@ -0,0 +1,147 @@
|
||||
+/*
|
||||
+ * Copyright (C) 2016 Rafał Miłecki <rafal@milecki.pl>
|
||||
+ *
|
||||
+ * Licensed under the ISC license.
|
||||
+ */
|
||||
+
|
||||
+#include <dt-bindings/gpio/gpio.h>
|
||||
+#include <dt-bindings/input/input.h>
|
||||
+#include <dt-bindings/interrupt-controller/irq.h>
|
||||
+#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||
+#include "skeleton.dtsi"
|
||||
+
|
||||
+/ {
|
||||
+ interrupt-parent = <&gic>;
|
||||
+
|
||||
+ chosen {
|
||||
+ stdout-path = &uart0;
|
||||
+ };
|
||||
+
|
||||
+ cpus {
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+
|
||||
+ cpu@0 {
|
||||
+ device_type = "cpu";
|
||||
+ compatible = "arm,cortex-a7";
|
||||
+ reg = <0x0>;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ mpcore {
|
||||
+ compatible = "simple-bus";
|
||||
+ ranges = <0x00000000 0x18310000 0x00008000>;
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <1>;
|
||||
+
|
||||
+ gic: interrupt-controller@1000 {
|
||||
+ compatible = "arm,cortex-a7-gic";
|
||||
+ #interrupt-cells = <3>;
|
||||
+ #address-cells = <0>;
|
||||
+ interrupt-controller;
|
||||
+ reg = <0x1000 0x1000>,
|
||||
+ <0x2000 0x0100>;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ clocks {
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <1>;
|
||||
+ ranges;
|
||||
+
|
||||
+ alp: oscillator {
|
||||
+ #clock-cells = <0>;
|
||||
+ compatible = "fixed-clock";
|
||||
+ clock-frequency = <40000000>;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ axi@18000000 {
|
||||
+ compatible = "brcm,bus-axi";
|
||||
+ reg = <0x18000000 0x1000>;
|
||||
+ ranges = <0x00000000 0x18000000 0x00100000>;
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <1>;
|
||||
+
|
||||
+ #interrupt-cells = <1>;
|
||||
+ interrupt-map-mask = <0x000fffff 0xffff>;
|
||||
+ interrupt-map =
|
||||
+ /* ChipCommon */
|
||||
+ <0x00000000 0 &gic GIC_SPI 0 IRQ_TYPE_LEVEL_HIGH>,
|
||||
+
|
||||
+ /* IEEE 802.11 0 */
|
||||
+ <0x00001000 0 &gic GIC_SPI 1 IRQ_TYPE_LEVEL_HIGH>,
|
||||
+
|
||||
+ /* PCIe Controller 0 */
|
||||
+ <0x00002000 0 &gic GIC_SPI 2 IRQ_TYPE_LEVEL_HIGH>,
|
||||
+ <0x00002000 1 &gic GIC_SPI 2 IRQ_TYPE_LEVEL_HIGH>,
|
||||
+ <0x00002000 2 &gic GIC_SPI 2 IRQ_TYPE_LEVEL_HIGH>,
|
||||
+ <0x00002000 3 &gic GIC_SPI 2 IRQ_TYPE_LEVEL_HIGH>,
|
||||
+ <0x00002000 4 &gic GIC_SPI 2 IRQ_TYPE_LEVEL_HIGH>,
|
||||
+ <0x00002000 5 &gic GIC_SPI 2 IRQ_TYPE_LEVEL_HIGH>,
|
||||
+
|
||||
+ /* USB 2.0 Controller */
|
||||
+ <0x00004000 0 &gic GIC_SPI 4 IRQ_TYPE_LEVEL_HIGH>,
|
||||
+
|
||||
+ /* Ethernet Controller 0 */
|
||||
+ <0x00005000 0 &gic GIC_SPI 5 IRQ_TYPE_LEVEL_HIGH>,
|
||||
+
|
||||
+ /* IEEE 802.11 1 */
|
||||
+ <0x0000a000 0 &gic GIC_SPI 7 IRQ_TYPE_LEVEL_HIGH>,
|
||||
+
|
||||
+ /* Ethernet Controller 1 */
|
||||
+ <0x0000b000 0 &gic GIC_SPI 6 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+
|
||||
+ chipcommon: chipcommon@0 {
|
||||
+ compatible = "simple-bus";
|
||||
+ reg = <0x00000000 0x1000>;
|
||||
+ ranges;
|
||||
+
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <1>;
|
||||
+
|
||||
+ gpio-controller;
|
||||
+ #gpio-cells = <2>;
|
||||
+
|
||||
+ uart0: serial@0300 {
|
||||
+ compatible = "ns16550a";
|
||||
+ reg = <0x0300 0x100>;
|
||||
+ interrupt-parent = <&gic>;
|
||||
+ interrupts = <GIC_PPI 16 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+ clocks = <&alp>;
|
||||
+ status = "okay";
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ usb2: usb2@4000 {
|
||||
+ reg = <0x4000 0x1000>;
|
||||
+ ranges;
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <1>;
|
||||
+
|
||||
+ ehci: ehci@4000 {
|
||||
+ compatible = "generic-ehci";
|
||||
+ reg = <0x4000 0x1000>;
|
||||
+ interrupt-parent = <&gic>;
|
||||
+ interrupts = <GIC_SPI 4 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+ };
|
||||
+
|
||||
+ ohci: ohci@d000 {
|
||||
+ #usb-cells = <0>;
|
||||
+
|
||||
+ compatible = "generic-ohci";
|
||||
+ reg = <0xd000 0x1000>;
|
||||
+ interrupt-parent = <&gic>;
|
||||
+ interrupts = <GIC_SPI 4 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ gmac0: ethernet@5000 {
|
||||
+ reg = <0x5000 0x1000>;
|
||||
+ };
|
||||
+
|
||||
+ gmac1: ethernet@b000 {
|
||||
+ reg = <0xb000 0x1000>;
|
||||
+ };
|
||||
+ };
|
||||
+};
|
|
@ -1,70 +0,0 @@
|
|||
From 345fd105ff676ef672d1e41b31165b47aa040dab Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Wed, 21 Sep 2016 22:58:32 +0200
|
||||
Subject: [PATCH] ARM: BCM5301X: Add separated DTS include file for BCM47094
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Use it to store BCM47094 specific properties/values and avoid repeating
|
||||
them in device DTS files.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/bcm47094-dlink-dir-885l.dts | 3 +--
|
||||
arch/arm/boot/dts/bcm47094-netgear-r8500.dts | 3 +--
|
||||
arch/arm/boot/dts/bcm47094.dtsi | 11 +++++++++++
|
||||
3 files changed, 13 insertions(+), 4 deletions(-)
|
||||
create mode 100644 arch/arm/boot/dts/bcm47094.dtsi
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm47094-dlink-dir-885l.dts
|
||||
+++ b/arch/arm/boot/dts/bcm47094-dlink-dir-885l.dts
|
||||
@@ -9,7 +9,7 @@
|
||||
|
||||
/dts-v1/;
|
||||
|
||||
-#include "bcm4708.dtsi"
|
||||
+#include "bcm47094.dtsi"
|
||||
#include "bcm5301x-nand-cs0-bch1.dtsi"
|
||||
|
||||
/ {
|
||||
@@ -107,7 +107,6 @@
|
||||
|
||||
&uart0 {
|
||||
status = "okay";
|
||||
- clock-frequency = <125000000>;
|
||||
};
|
||||
|
||||
&usb3 {
|
||||
--- a/arch/arm/boot/dts/bcm47094-netgear-r8500.dts
|
||||
+++ b/arch/arm/boot/dts/bcm47094-netgear-r8500.dts
|
||||
@@ -6,7 +6,7 @@
|
||||
|
||||
/dts-v1/;
|
||||
|
||||
-#include "bcm4708.dtsi"
|
||||
+#include "bcm47094.dtsi"
|
||||
#include "bcm5301x-nand-cs0-bch8.dtsi"
|
||||
|
||||
/ {
|
||||
@@ -100,5 +100,4 @@
|
||||
|
||||
&uart0 {
|
||||
status = "okay";
|
||||
- clock-frequency = <125000000>;
|
||||
};
|
||||
--- /dev/null
|
||||
+++ b/arch/arm/boot/dts/bcm47094.dtsi
|
||||
@@ -0,0 +1,11 @@
|
||||
+/*
|
||||
+ * Copyright (C) 2016 Rafał Miłecki <rafal@milecki.pl>
|
||||
+ *
|
||||
+ * Licensed under the ISC license.
|
||||
+ */
|
||||
+
|
||||
+#include "bcm4708.dtsi"
|
||||
+
|
||||
+&uart0 {
|
||||
+ clock-frequency = <125000000>;
|
||||
+};
|
|
@ -1,92 +0,0 @@
|
|||
From 3ede027b3dce2fca07350b7587c7c8f44706c94c Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Wed, 21 Sep 2016 22:58:33 +0200
|
||||
Subject: [PATCH] ARM: BCM5301X: Enable UART on Netgear R8000
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
It was tested by LEDE users, all we need is to adjust clock frequency.
|
||||
While we're at it create a separated DTS include file to share code with
|
||||
other BCM4709 devices easier.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/bcm4709-asus-rt-ac87u.dts | 2 +-
|
||||
arch/arm/boot/dts/bcm4709-buffalo-wxr-1900dhp.dts | 2 +-
|
||||
arch/arm/boot/dts/bcm4709-netgear-r7000.dts | 2 +-
|
||||
arch/arm/boot/dts/bcm4709-netgear-r8000.dts | 6 +++++-
|
||||
arch/arm/boot/dts/bcm4709.dtsi | 11 +++++++++++
|
||||
5 files changed, 19 insertions(+), 4 deletions(-)
|
||||
create mode 100644 arch/arm/boot/dts/bcm4709.dtsi
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm4709-asus-rt-ac87u.dts
|
||||
+++ b/arch/arm/boot/dts/bcm4709-asus-rt-ac87u.dts
|
||||
@@ -9,7 +9,7 @@
|
||||
|
||||
/dts-v1/;
|
||||
|
||||
-#include "bcm4708.dtsi"
|
||||
+#include "bcm4709.dtsi"
|
||||
#include "bcm5301x-nand-cs0-bch8.dtsi"
|
||||
|
||||
/ {
|
||||
--- a/arch/arm/boot/dts/bcm4709-buffalo-wxr-1900dhp.dts
|
||||
+++ b/arch/arm/boot/dts/bcm4709-buffalo-wxr-1900dhp.dts
|
||||
@@ -9,7 +9,7 @@
|
||||
|
||||
/dts-v1/;
|
||||
|
||||
-#include "bcm4708.dtsi"
|
||||
+#include "bcm4709.dtsi"
|
||||
#include "bcm5301x-nand-cs0-bch8.dtsi"
|
||||
|
||||
/ {
|
||||
--- a/arch/arm/boot/dts/bcm4709-netgear-r7000.dts
|
||||
+++ b/arch/arm/boot/dts/bcm4709-netgear-r7000.dts
|
||||
@@ -9,7 +9,7 @@
|
||||
|
||||
/dts-v1/;
|
||||
|
||||
-#include "bcm4708.dtsi"
|
||||
+#include "bcm4709.dtsi"
|
||||
#include "bcm5301x-nand-cs0-bch8.dtsi"
|
||||
|
||||
/ {
|
||||
--- a/arch/arm/boot/dts/bcm4709-netgear-r8000.dts
|
||||
+++ b/arch/arm/boot/dts/bcm4709-netgear-r8000.dts
|
||||
@@ -9,7 +9,7 @@
|
||||
|
||||
/dts-v1/;
|
||||
|
||||
-#include "bcm4708.dtsi"
|
||||
+#include "bcm4709.dtsi"
|
||||
#include "bcm5301x-nand-cs0-bch8.dtsi"
|
||||
|
||||
/ {
|
||||
@@ -107,6 +107,10 @@
|
||||
};
|
||||
};
|
||||
|
||||
+&uart0 {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
&usb2 {
|
||||
vcc-gpio = <&chipcommon 0 GPIO_ACTIVE_HIGH>;
|
||||
};
|
||||
--- /dev/null
|
||||
+++ b/arch/arm/boot/dts/bcm4709.dtsi
|
||||
@@ -0,0 +1,11 @@
|
||||
+/*
|
||||
+ * Copyright (C) 2016 Rafał Miłecki <rafal@milecki.pl>
|
||||
+ *
|
||||
+ * Licensed under the ISC license.
|
||||
+ */
|
||||
+
|
||||
+#include "bcm4708.dtsi"
|
||||
+
|
||||
+&uart0 {
|
||||
+ clock-frequency = <125000000>;
|
||||
+};
|
|
@ -1,51 +0,0 @@
|
|||
From 5b92db97f4ae345bd6f045c9427471680a7fe2e7 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Wed, 21 Sep 2016 22:58:34 +0200
|
||||
Subject: [PATCH] ARM: BCM5301X: Specify USB 3.0 PHY in DT
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Driver for Northstar USB 3.0 PHY has been recently added under the name
|
||||
phy-bcm-ns-usb3. Add binding for it into the DT files.
|
||||
The only slightly tricky part is BCM47094 which uses different PHY
|
||||
version and requires different compatible value.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/bcm47094.dtsi | 6 ++++++
|
||||
arch/arm/boot/dts/bcm5301x.dtsi | 7 +++++++
|
||||
2 files changed, 13 insertions(+)
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm47094.dtsi
|
||||
+++ b/arch/arm/boot/dts/bcm47094.dtsi
|
||||
@@ -6,6 +6,12 @@
|
||||
|
||||
#include "bcm4708.dtsi"
|
||||
|
||||
+/ {
|
||||
+ usb3_phy: usb3-phy {
|
||||
+ compatible = "brcm,ns-bx-usb3-phy";
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
&uart0 {
|
||||
clock-frequency = <125000000>;
|
||||
};
|
||||
--- a/arch/arm/boot/dts/bcm5301x.dtsi
|
||||
+++ b/arch/arm/boot/dts/bcm5301x.dtsi
|
||||
@@ -149,6 +149,13 @@
|
||||
clock-names = "phy-ref-clk";
|
||||
};
|
||||
|
||||
+ usb3_phy: usb3-phy {
|
||||
+ compatible = "brcm,ns-ax-usb3-phy";
|
||||
+ reg = <0x18105000 0x1000>, <0x18003000 0x1000>;
|
||||
+ reg-names = "dmp", "ccb-mii";
|
||||
+ #phy-cells = <0>;
|
||||
+ };
|
||||
+
|
||||
axi@18000000 {
|
||||
compatible = "brcm,bus-axi";
|
||||
reg = <0x18000000 0x1000>;
|
|
@ -1,93 +0,0 @@
|
|||
From 46daccf62d1651bf8b09978478ca6465a7a81f47 Mon Sep 17 00:00:00 2001
|
||||
From: Dan Haab <dhaab@luxul.com>
|
||||
Date: Tue, 27 Sep 2016 11:27:10 -0600
|
||||
Subject: [PATCH] ARM: BCM5301X: Add DT for Luxul XAP-1510
|
||||
|
||||
Luxul XAP-1510 is an AP device based on BCM4708 SoC with 2 x BCM4360
|
||||
chipsets on PCB connected using PCIe.
|
||||
|
||||
Signed-off-by: Dan Haab <dhaab@luxul.com>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/Makefile | 1 +
|
||||
arch/arm/boot/dts/bcm4708-luxul-xap-1510.dts | 64 ++++++++++++++++++++++++++++
|
||||
2 files changed, 65 insertions(+)
|
||||
create mode 100644 arch/arm/boot/dts/bcm4708-luxul-xap-1510.dts
|
||||
|
||||
--- a/arch/arm/boot/dts/Makefile
|
||||
+++ b/arch/arm/boot/dts/Makefile
|
||||
@@ -65,6 +65,7 @@ dtb-$(CONFIG_ARCH_BCM_5301X) += \
|
||||
bcm4708-asus-rt-ac56u.dtb \
|
||||
bcm4708-asus-rt-ac68u.dtb \
|
||||
bcm4708-buffalo-wzr-1750dhp.dtb \
|
||||
+ bcm4708-luxul-xap-1510.dtb \
|
||||
bcm4708-luxul-xwc-1000.dtb \
|
||||
bcm4708-netgear-r6250.dtb \
|
||||
bcm4708-netgear-r6300-v2.dtb \
|
||||
--- /dev/null
|
||||
+++ b/arch/arm/boot/dts/bcm4708-luxul-xap-1510.dts
|
||||
@@ -0,0 +1,64 @@
|
||||
+/*
|
||||
+ * Copyright 2016 Luxul Inc.
|
||||
+ *
|
||||
+ * Licensed under the ISC license.
|
||||
+ */
|
||||
+
|
||||
+/dts-v1/;
|
||||
+
|
||||
+#include "bcm4708.dtsi"
|
||||
+
|
||||
+/ {
|
||||
+ compatible = "luxul,xap-1510v1", "brcm,bcm4708";
|
||||
+ model = "Luxul XAP-1510 V1";
|
||||
+
|
||||
+ chosen {
|
||||
+ bootargs = "console=ttyS0,115200 earlycon";
|
||||
+ };
|
||||
+
|
||||
+ memory {
|
||||
+ reg = <0x00000000 0x08000000>;
|
||||
+ };
|
||||
+
|
||||
+ leds {
|
||||
+ compatible = "gpio-leds";
|
||||
+
|
||||
+ 5ghz {
|
||||
+ label = "bcm53xx:blue:5ghz";
|
||||
+ gpios = <&chipcommon 13 GPIO_ACTIVE_LOW>;
|
||||
+ linux,default-trigger = "none";
|
||||
+ };
|
||||
+
|
||||
+ 2ghz {
|
||||
+ label = "bcm53xx:blue:2ghz";
|
||||
+ gpios = <&chipcommon 14 GPIO_ACTIVE_LOW>;
|
||||
+ linux,default-trigger = "none";
|
||||
+ };
|
||||
+
|
||||
+ status {
|
||||
+ label = "bcm53xx:green:status";
|
||||
+ gpios = <&chipcommon 15 GPIO_ACTIVE_LOW>;
|
||||
+ linux,default-trigger = "timer";
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ gpio-keys {
|
||||
+ compatible = "gpio-keys";
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+
|
||||
+ restart {
|
||||
+ label = "Reset";
|
||||
+ linux,code = <KEY_RESTART>;
|
||||
+ gpios = <&chipcommon 11 GPIO_ACTIVE_LOW>;
|
||||
+ };
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&uart0 {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&spi_nor {
|
||||
+ status = "okay";
|
||||
+};
|
|
@ -1,159 +0,0 @@
|
|||
From ef3bc318adeb15b38688df6a583bafea2befce43 Mon Sep 17 00:00:00 2001
|
||||
From: Dan Haab <dhaab@luxul.com>
|
||||
Date: Tue, 27 Sep 2016 11:27:11 -0600
|
||||
Subject: [PATCH] ARM: BCM5301X: Add DT for Luxul XWR-3100
|
||||
|
||||
Luxul XWR-3100 is a wireless router based on BCM47094 SoC with two
|
||||
4366c0 FullMAC PCIe cards on the PCB. It uses NAND with BCH-4 ECC
|
||||
algorithm.
|
||||
|
||||
Signed-off-by: Dan Haab <dhaab@luxul.com>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/Makefile | 1 +
|
||||
arch/arm/boot/dts/bcm47094-luxul-xwr-3100.dts | 111 ++++++++++++++++++++++++++
|
||||
arch/arm/boot/dts/bcm5301x-nand-cs0-bch4.dtsi | 13 +++
|
||||
3 files changed, 125 insertions(+)
|
||||
create mode 100644 arch/arm/boot/dts/bcm47094-luxul-xwr-3100.dts
|
||||
create mode 100644 arch/arm/boot/dts/bcm5301x-nand-cs0-bch4.dtsi
|
||||
|
||||
--- a/arch/arm/boot/dts/Makefile
|
||||
+++ b/arch/arm/boot/dts/Makefile
|
||||
@@ -78,6 +78,7 @@ dtb-$(CONFIG_ARCH_BCM_5301X) += \
|
||||
bcm4709-netgear-r7000.dtb \
|
||||
bcm4709-netgear-r8000.dtb \
|
||||
bcm47094-dlink-dir-885l.dtb \
|
||||
+ bcm47094-luxul-xwr-3100.dtb \
|
||||
bcm47094-netgear-r8500.dtb \
|
||||
bcm94708.dtb \
|
||||
bcm94709.dtb \
|
||||
--- /dev/null
|
||||
+++ b/arch/arm/boot/dts/bcm47094-luxul-xwr-3100.dts
|
||||
@@ -0,0 +1,111 @@
|
||||
+/*
|
||||
+ * Copyright 2016 Luxul Inc.
|
||||
+ *
|
||||
+ * Licensed under the ISC license.
|
||||
+ */
|
||||
+
|
||||
+/dts-v1/;
|
||||
+
|
||||
+#include "bcm47094.dtsi"
|
||||
+#include "bcm5301x-nand-cs0-bch4.dtsi"
|
||||
+
|
||||
+/ {
|
||||
+ compatible = "luxul,xwr-3100v1", "brcm,bcm47094", "brcm,bcm4708";
|
||||
+ model = "Luxul XWR-3100 V1";
|
||||
+
|
||||
+ chosen {
|
||||
+ bootargs = "console=ttyS0,115200 earlycon";
|
||||
+ };
|
||||
+
|
||||
+ memory {
|
||||
+ reg = <0x00000000 0x08000000>;
|
||||
+ };
|
||||
+
|
||||
+ leds {
|
||||
+ compatible = "gpio-leds";
|
||||
+
|
||||
+ power {
|
||||
+ label = "bcm53xx:green:power";
|
||||
+ gpios = <&chipcommon 0 GPIO_ACTIVE_LOW>;
|
||||
+ linux,default-trigger = "default-on";
|
||||
+ };
|
||||
+
|
||||
+ lan3 {
|
||||
+ label = "bcm53xx:green:lan1";
|
||||
+ gpios = <&chipcommon 1 GPIO_ACTIVE_LOW>;
|
||||
+ linux,default-trigger = "default-off";
|
||||
+ };
|
||||
+
|
||||
+ lan4 {
|
||||
+ label = "bcm53xx:green:lan0";
|
||||
+ gpios = <&chipcommon 2 GPIO_ACTIVE_LOW>;
|
||||
+ linux,default-trigger = "default-off";
|
||||
+ };
|
||||
+
|
||||
+ wan {
|
||||
+ label = "bcm53xx:green:wan";
|
||||
+ gpios = <&chipcommon 3 GPIO_ACTIVE_LOW>;
|
||||
+ linux,default-trigger = "default-off";
|
||||
+ };
|
||||
+
|
||||
+ lan1 {
|
||||
+ label = "bcm53xx:green:lan3";
|
||||
+ gpios = <&chipcommon 4 GPIO_ACTIVE_LOW>;
|
||||
+ linux,default-trigger = "default-off";
|
||||
+ };
|
||||
+
|
||||
+ lan2 {
|
||||
+ label = "bcm53xx:green:lan2";
|
||||
+ gpios = <&chipcommon 6 GPIO_ACTIVE_LOW>;
|
||||
+ linux,default-trigger = "default-off";
|
||||
+ };
|
||||
+
|
||||
+ usb3 {
|
||||
+ label = "bcm53xx:green:usb3";
|
||||
+ gpios = <&chipcommon 8 GPIO_ACTIVE_LOW>;
|
||||
+ linux,default-trigger = "default-off";
|
||||
+ };
|
||||
+
|
||||
+ status {
|
||||
+ label = "bcm53xx:green:status";
|
||||
+ gpios = <&chipcommon 10 GPIO_ACTIVE_LOW>;
|
||||
+ linux,default-trigger = "timer";
|
||||
+ };
|
||||
+
|
||||
+ 2ghz {
|
||||
+ label = "bcm53xx:green:2ghz";
|
||||
+ gpios = <&chipcommon 13 GPIO_ACTIVE_LOW>;
|
||||
+ linux,default-trigger = "default-off";
|
||||
+ };
|
||||
+
|
||||
+ 5ghz {
|
||||
+ label = "bcm53xx:green:5ghz";
|
||||
+ gpios = <&chipcommon 14 GPIO_ACTIVE_LOW>;
|
||||
+ linux,default-trigger = "default-off";
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ gpio-keys {
|
||||
+ compatible = "gpio-keys";
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+
|
||||
+ restart {
|
||||
+ label = "Reset";
|
||||
+ linux,code = <KEY_RESTART>;
|
||||
+ gpios = <&chipcommon 17 GPIO_ACTIVE_LOW>;
|
||||
+ };
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&uart0 {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&usb3 {
|
||||
+ vcc-gpio = <&chipcommon 18 GPIO_ACTIVE_HIGH>;
|
||||
+};
|
||||
+
|
||||
+&spi_nor {
|
||||
+ status = "okay";
|
||||
+};
|
||||
--- /dev/null
|
||||
+++ b/arch/arm/boot/dts/bcm5301x-nand-cs0-bch4.dtsi
|
||||
@@ -0,0 +1,13 @@
|
||||
+/*
|
||||
+ * Copyright 2016 Luxul Inc.
|
||||
+ *
|
||||
+ * Licensed under the ISC license.
|
||||
+ */
|
||||
+
|
||||
+#include "bcm5301x-nand-cs0.dtsi"
|
||||
+
|
||||
+&nandcs {
|
||||
+ nand-ecc-algo = "bch";
|
||||
+ nand-ecc-strength = <4>;
|
||||
+ nand-ecc-step-size = <512>;
|
||||
+};
|
|
@ -1,38 +0,0 @@
|
|||
From 547f23183d9d77b51754689a71e3e58d085ccaec Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Sat, 17 Sep 2016 22:13:46 +0200
|
||||
Subject: [PATCH] ARM: BCM53573: Specify PMU and its ILP clock in the DT
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
ILP clock (sometimes called a "slow clock") is a part of PMU (Power
|
||||
Management Unit). There has been recently added a driver for it, so add
|
||||
a proper entry in the DT as well.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/bcm53573.dtsi | 12 ++++++++++++
|
||||
1 file changed, 12 insertions(+)
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm53573.dtsi
|
||||
+++ b/arch/arm/boot/dts/bcm53573.dtsi
|
||||
@@ -143,5 +143,17 @@
|
||||
gmac1: ethernet@b000 {
|
||||
reg = <0xb000 0x1000>;
|
||||
};
|
||||
+
|
||||
+ pmu@12000 {
|
||||
+ compatible = "simple-mfd", "syscon";
|
||||
+ reg = <0x00012000 0x00001000>;
|
||||
+
|
||||
+ ilp: ilp {
|
||||
+ compatible = "brcm,bcm53573-ilp";
|
||||
+ clocks = <&alp>;
|
||||
+ #clock-cells = <0>;
|
||||
+ clock-output-names = "ilp";
|
||||
+ };
|
||||
+ };
|
||||
};
|
||||
};
|
|
@ -1,146 +0,0 @@
|
|||
From 41182beb217c47cfbaaf26a60f22a8b3943faa61 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Sun, 13 Nov 2016 11:12:09 +0100
|
||||
Subject: [PATCH] ARM: BCM5301X: Add DT for TP-LINK Archer C9 V1
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
It's BCM4709A0 based device with 16 MiB flash, 128 MiB of RAM and two
|
||||
PCIe based on-PCB BCM4360 chipsets.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/Makefile | 1 +
|
||||
arch/arm/boot/dts/bcm4709-tplink-archer-c9-v1.dts | 114 ++++++++++++++++++++++
|
||||
2 files changed, 115 insertions(+)
|
||||
create mode 100644 arch/arm/boot/dts/bcm4709-tplink-archer-c9-v1.dts
|
||||
|
||||
--- a/arch/arm/boot/dts/Makefile
|
||||
+++ b/arch/arm/boot/dts/Makefile
|
||||
@@ -77,6 +77,7 @@ dtb-$(CONFIG_ARCH_BCM_5301X) += \
|
||||
bcm4709-buffalo-wxr-1900dhp.dtb \
|
||||
bcm4709-netgear-r7000.dtb \
|
||||
bcm4709-netgear-r8000.dtb \
|
||||
+ bcm4709-tplink-archer-c9-v1.dtb \
|
||||
bcm47094-dlink-dir-885l.dtb \
|
||||
bcm47094-luxul-xwr-3100.dtb \
|
||||
bcm47094-netgear-r8500.dtb \
|
||||
--- /dev/null
|
||||
+++ b/arch/arm/boot/dts/bcm4709-tplink-archer-c9-v1.dts
|
||||
@@ -0,0 +1,114 @@
|
||||
+/*
|
||||
+ * Copyright (C) 2016 Rafał Miłecki <rafal@milecki.pl>
|
||||
+ *
|
||||
+ * Licensed under the ISC license.
|
||||
+ */
|
||||
+
|
||||
+/dts-v1/;
|
||||
+
|
||||
+#include "bcm4709.dtsi"
|
||||
+
|
||||
+/ {
|
||||
+ compatible = "tplink,archer-c9-v1", "brcm,bcm4709", "brcm,bcm4708";
|
||||
+ model = "TP-LINK Archer C9 V1";
|
||||
+
|
||||
+ chosen {
|
||||
+ bootargs = "console=ttyS0,115200 earlycon";
|
||||
+ };
|
||||
+
|
||||
+ memory {
|
||||
+ reg = <0x00000000 0x08000000>;
|
||||
+ };
|
||||
+
|
||||
+ leds {
|
||||
+ compatible = "gpio-leds";
|
||||
+
|
||||
+ lan {
|
||||
+ label = "bcm53xx:blue:lan";
|
||||
+ gpios = <&chipcommon 1 GPIO_ACTIVE_HIGH>;
|
||||
+ linux,default-trigger = "default-off";
|
||||
+ };
|
||||
+
|
||||
+ wps {
|
||||
+ label = "bcm53xx:blue:wps";
|
||||
+ gpios = <&chipcommon 2 GPIO_ACTIVE_HIGH>;
|
||||
+ linux,default-trigger = "default-off";
|
||||
+ };
|
||||
+
|
||||
+ 2ghz {
|
||||
+ label = "bcm53xx:blue:2ghz";
|
||||
+ gpios = <&chipcommon 4 GPIO_ACTIVE_HIGH>;
|
||||
+ linux,default-trigger = "default-off";
|
||||
+ };
|
||||
+
|
||||
+ 5ghz {
|
||||
+ label = "bcm53xx:blue:5ghz";
|
||||
+ gpios = <&chipcommon 5 GPIO_ACTIVE_HIGH>;
|
||||
+ linux,default-trigger = "default-off";
|
||||
+ };
|
||||
+
|
||||
+ usb3 {
|
||||
+ label = "bcm53xx:blue:usb3";
|
||||
+ gpios = <&chipcommon 6 GPIO_ACTIVE_HIGH>;
|
||||
+ linux,default-trigger = "default-off";
|
||||
+ };
|
||||
+
|
||||
+ usb2 {
|
||||
+ label = "bcm53xx:blue:usb2";
|
||||
+ gpios = <&chipcommon 7 GPIO_ACTIVE_HIGH>;
|
||||
+ linux,default-trigger = "default-off";
|
||||
+ };
|
||||
+
|
||||
+ wan-blue {
|
||||
+ label = "bcm53xx:blue:wan";
|
||||
+ gpios = <&chipcommon 14 GPIO_ACTIVE_HIGH>;
|
||||
+ linux,default-trigger = "default-off";
|
||||
+ };
|
||||
+
|
||||
+ wan-amber {
|
||||
+ label = "bcm53xx:amber:wan";
|
||||
+ gpios = <&chipcommon 15 GPIO_ACTIVE_HIGH>;
|
||||
+ linux,default-trigger = "default-off";
|
||||
+ };
|
||||
+
|
||||
+ power {
|
||||
+ label = "bcm53xx:blue:power";
|
||||
+ gpios = <&chipcommon 18 GPIO_ACTIVE_LOW>;
|
||||
+ linux,default-trigger = "default-on";
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ gpio-keys {
|
||||
+ compatible = "gpio-keys";
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+
|
||||
+ wps {
|
||||
+ label = "WPS";
|
||||
+ linux,code = <KEY_WPS_BUTTON>;
|
||||
+ gpios = <&chipcommon 0 GPIO_ACTIVE_LOW>;
|
||||
+ };
|
||||
+
|
||||
+ restart {
|
||||
+ label = "Reset";
|
||||
+ linux,code = <KEY_RESTART>;
|
||||
+ gpios = <&chipcommon 3 GPIO_ACTIVE_LOW>;
|
||||
+ };
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&uart0 {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&usb2 {
|
||||
+ vcc-gpio = <&chipcommon 13 GPIO_ACTIVE_HIGH>;
|
||||
+};
|
||||
+
|
||||
+&usb3 {
|
||||
+ vcc-gpio = <&chipcommon 12 GPIO_ACTIVE_HIGH>;
|
||||
+};
|
||||
+
|
||||
+&spi_nor {
|
||||
+ status = "okay";
|
||||
+};
|
|
@ -1,75 +0,0 @@
|
|||
From 09f3510fb70a46c8921f2cf4a90dbcae460a6820 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Sat, 29 Oct 2016 13:12:29 +0200
|
||||
Subject: [PATCH] ARM: BCM5301X: Add back handler ignoring external imprecise
|
||||
aborts
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Since early BCM5301X days we got abort handler that was removed by
|
||||
commit 937b12306ea79 ("ARM: BCM5301X: remove workaround imprecise abort
|
||||
fault handler"). It assumed we need to deal only with pending aborts
|
||||
left by the bootloader. Unfortunately this isn't true for BCM5301X.
|
||||
|
||||
When probing PCI config space (device enumeration) it is expected to
|
||||
have master aborts on the PCI bus. Most bridges don't forward (or they
|
||||
allow disabling it) these errors onto the AXI/AMBA bus but not the
|
||||
Northstar (BCM5301X) one.
|
||||
|
||||
iProc PCIe controller on Northstar seems to be some older one, without
|
||||
a control register for errors forwarding. It means we need to workaround
|
||||
this at platform level. All newer platforms are not affected by this
|
||||
issue.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
arch/arm/mach-bcm/bcm_5301x.c | 28 ++++++++++++++++++++++++++++
|
||||
1 file changed, 28 insertions(+)
|
||||
|
||||
--- a/arch/arm/mach-bcm/bcm_5301x.c
|
||||
+++ b/arch/arm/mach-bcm/bcm_5301x.c
|
||||
@@ -9,14 +9,42 @@
|
||||
#include <asm/hardware/cache-l2x0.h>
|
||||
|
||||
#include <asm/mach/arch.h>
|
||||
+#include <asm/siginfo.h>
|
||||
+#include <asm/signal.h>
|
||||
+
|
||||
+#define FSR_EXTERNAL (1 << 12)
|
||||
+#define FSR_READ (0 << 10)
|
||||
+#define FSR_IMPRECISE 0x0406
|
||||
|
||||
static const char *const bcm5301x_dt_compat[] __initconst = {
|
||||
"brcm,bcm4708",
|
||||
NULL,
|
||||
};
|
||||
|
||||
+static int bcm5301x_abort_handler(unsigned long addr, unsigned int fsr,
|
||||
+ struct pt_regs *regs)
|
||||
+{
|
||||
+ /*
|
||||
+ * We want to ignore aborts forwarded from the PCIe bus that are
|
||||
+ * expected and shouldn't really be passed by the PCIe controller.
|
||||
+ * The biggest disadvantage is the same FSR code may be reported when
|
||||
+ * reading non-existing APB register and we shouldn't ignore that.
|
||||
+ */
|
||||
+ if (fsr == (FSR_EXTERNAL | FSR_READ | FSR_IMPRECISE))
|
||||
+ return 0;
|
||||
+
|
||||
+ return 1;
|
||||
+}
|
||||
+
|
||||
+static void __init bcm5301x_init_early(void)
|
||||
+{
|
||||
+ hook_fault_code(16 + 6, bcm5301x_abort_handler, SIGBUS, BUS_OBJERR,
|
||||
+ "imprecise external abort");
|
||||
+}
|
||||
+
|
||||
DT_MACHINE_START(BCM5301X, "BCM5301X")
|
||||
.l2c_aux_val = 0,
|
||||
.l2c_aux_mask = ~0,
|
||||
.dt_compat = bcm5301x_dt_compat,
|
||||
+ .init_early = bcm5301x_init_early,
|
||||
MACHINE_END
|
|
@ -1,269 +0,0 @@
|
|||
From 2b354a7c56f375ba414b9b9c96f160f5749e5e64 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Thu, 1 Dec 2016 18:40:51 +0100
|
||||
Subject: [PATCH 1/6] ARM: BCM5301X: Enable UART by default for BCM4708(1),
|
||||
BCM4709(4) & BCM53012
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Every device tested so far got UART0 (at 0x18000300) working as serial
|
||||
console. It's most likely part of reference design and all vendors use
|
||||
it that way.
|
||||
|
||||
It seems to be easier to enable it by default and just disable it if we
|
||||
ever see a device with different hardware design.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Acked-by: Jon Mason <jon.mason@broadcom.com>
|
||||
Acked-by: Hauke Mehrtens <hauke@hauke-m.de>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/bcm4708-buffalo-wzr-1750dhp.dts | 4 ----
|
||||
arch/arm/boot/dts/bcm4708-luxul-xap-1510.dts | 4 ----
|
||||
arch/arm/boot/dts/bcm4708-luxul-xwc-1000.dts | 4 ----
|
||||
arch/arm/boot/dts/bcm4708-netgear-r6250.dts | 4 ----
|
||||
arch/arm/boot/dts/bcm4708-smartrg-sr400ac.dts | 4 ----
|
||||
arch/arm/boot/dts/bcm4708.dtsi | 4 ++++
|
||||
arch/arm/boot/dts/bcm47081-buffalo-wzr-600dhp2.dts | 4 ----
|
||||
arch/arm/boot/dts/bcm47081.dtsi | 4 ++++
|
||||
arch/arm/boot/dts/bcm4709-netgear-r7000.dts | 4 ----
|
||||
arch/arm/boot/dts/bcm4709-netgear-r8000.dts | 4 ----
|
||||
arch/arm/boot/dts/bcm4709-tplink-archer-c9-v1.dts | 4 ----
|
||||
arch/arm/boot/dts/bcm4709.dtsi | 1 +
|
||||
arch/arm/boot/dts/bcm47094-dlink-dir-885l.dts | 4 ----
|
||||
arch/arm/boot/dts/bcm47094-luxul-xwr-3100.dts | 4 ----
|
||||
arch/arm/boot/dts/bcm47094-netgear-r8500.dts | 4 ----
|
||||
arch/arm/boot/dts/bcm47094.dtsi | 1 +
|
||||
arch/arm/boot/dts/bcm94708.dts | 4 ----
|
||||
arch/arm/boot/dts/bcm94709.dts | 4 ----
|
||||
arch/arm/boot/dts/bcm953012er.dts | 4 ----
|
||||
arch/arm/boot/dts/bcm953012k.dts | 1 -
|
||||
20 files changed, 10 insertions(+), 61 deletions(-)
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm4708-buffalo-wzr-1750dhp.dts
|
||||
+++ b/arch/arm/boot/dts/bcm4708-buffalo-wzr-1750dhp.dts
|
||||
@@ -136,10 +136,6 @@
|
||||
};
|
||||
};
|
||||
|
||||
-&uart0 {
|
||||
- status = "okay";
|
||||
-};
|
||||
-
|
||||
&usb2 {
|
||||
vcc-gpio = <&chipcommon 9 GPIO_ACTIVE_HIGH>;
|
||||
};
|
||||
--- a/arch/arm/boot/dts/bcm4708-luxul-xap-1510.dts
|
||||
+++ b/arch/arm/boot/dts/bcm4708-luxul-xap-1510.dts
|
||||
@@ -55,10 +55,6 @@
|
||||
};
|
||||
};
|
||||
|
||||
-&uart0 {
|
||||
- status = "okay";
|
||||
-};
|
||||
-
|
||||
&spi_nor {
|
||||
status = "okay";
|
||||
};
|
||||
--- a/arch/arm/boot/dts/bcm4708-luxul-xwc-1000.dts
|
||||
+++ b/arch/arm/boot/dts/bcm4708-luxul-xwc-1000.dts
|
||||
@@ -56,10 +56,6 @@
|
||||
};
|
||||
};
|
||||
|
||||
-&uart0 {
|
||||
- status = "okay";
|
||||
-};
|
||||
-
|
||||
&spi_nor {
|
||||
status = "okay";
|
||||
};
|
||||
--- a/arch/arm/boot/dts/bcm4708-netgear-r6250.dts
|
||||
+++ b/arch/arm/boot/dts/bcm4708-netgear-r6250.dts
|
||||
@@ -83,10 +83,6 @@
|
||||
};
|
||||
};
|
||||
|
||||
-&uart0 {
|
||||
- status = "okay";
|
||||
-};
|
||||
-
|
||||
&usb3 {
|
||||
vcc-gpio = <&chipcommon 0 GPIO_ACTIVE_HIGH>;
|
||||
};
|
||||
--- a/arch/arm/boot/dts/bcm4708-smartrg-sr400ac.dts
|
||||
+++ b/arch/arm/boot/dts/bcm4708-smartrg-sr400ac.dts
|
||||
@@ -119,10 +119,6 @@
|
||||
};
|
||||
};
|
||||
|
||||
-&uart0 {
|
||||
- status = "okay";
|
||||
-};
|
||||
-
|
||||
&spi_nor {
|
||||
status = "okay";
|
||||
};
|
||||
--- a/arch/arm/boot/dts/bcm4708.dtsi
|
||||
+++ b/arch/arm/boot/dts/bcm4708.dtsi
|
||||
@@ -34,3 +34,7 @@
|
||||
};
|
||||
|
||||
};
|
||||
+
|
||||
+&uart0 {
|
||||
+ status = "okay";
|
||||
+};
|
||||
--- a/arch/arm/boot/dts/bcm47081-buffalo-wzr-600dhp2.dts
|
||||
+++ b/arch/arm/boot/dts/bcm47081-buffalo-wzr-600dhp2.dts
|
||||
@@ -122,7 +122,3 @@
|
||||
};
|
||||
};
|
||||
};
|
||||
-
|
||||
-&uart0 {
|
||||
- status = "okay";
|
||||
-};
|
||||
--- a/arch/arm/boot/dts/bcm47081.dtsi
|
||||
+++ b/arch/arm/boot/dts/bcm47081.dtsi
|
||||
@@ -24,3 +24,7 @@
|
||||
};
|
||||
};
|
||||
};
|
||||
+
|
||||
+&uart0 {
|
||||
+ status = "okay";
|
||||
+};
|
||||
--- a/arch/arm/boot/dts/bcm4709-netgear-r7000.dts
|
||||
+++ b/arch/arm/boot/dts/bcm4709-netgear-r7000.dts
|
||||
@@ -100,7 +100,3 @@
|
||||
};
|
||||
};
|
||||
};
|
||||
-
|
||||
-&uart0 {
|
||||
- status = "okay";
|
||||
-};
|
||||
--- a/arch/arm/boot/dts/bcm4709-netgear-r8000.dts
|
||||
+++ b/arch/arm/boot/dts/bcm4709-netgear-r8000.dts
|
||||
@@ -107,10 +107,6 @@
|
||||
};
|
||||
};
|
||||
|
||||
-&uart0 {
|
||||
- status = "okay";
|
||||
-};
|
||||
-
|
||||
&usb2 {
|
||||
vcc-gpio = <&chipcommon 0 GPIO_ACTIVE_HIGH>;
|
||||
};
|
||||
--- a/arch/arm/boot/dts/bcm4709-tplink-archer-c9-v1.dts
|
||||
+++ b/arch/arm/boot/dts/bcm4709-tplink-archer-c9-v1.dts
|
||||
@@ -97,10 +97,6 @@
|
||||
};
|
||||
};
|
||||
|
||||
-&uart0 {
|
||||
- status = "okay";
|
||||
-};
|
||||
-
|
||||
&usb2 {
|
||||
vcc-gpio = <&chipcommon 13 GPIO_ACTIVE_HIGH>;
|
||||
};
|
||||
--- a/arch/arm/boot/dts/bcm4709.dtsi
|
||||
+++ b/arch/arm/boot/dts/bcm4709.dtsi
|
||||
@@ -8,4 +8,5 @@
|
||||
|
||||
&uart0 {
|
||||
clock-frequency = <125000000>;
|
||||
+ status = "okay";
|
||||
};
|
||||
--- a/arch/arm/boot/dts/bcm47094-dlink-dir-885l.dts
|
||||
+++ b/arch/arm/boot/dts/bcm47094-dlink-dir-885l.dts
|
||||
@@ -105,10 +105,6 @@
|
||||
};
|
||||
};
|
||||
|
||||
-&uart0 {
|
||||
- status = "okay";
|
||||
-};
|
||||
-
|
||||
&usb3 {
|
||||
vcc-gpio = <&chipcommon 18 GPIO_ACTIVE_HIGH>;
|
||||
};
|
||||
--- a/arch/arm/boot/dts/bcm47094-luxul-xwr-3100.dts
|
||||
+++ b/arch/arm/boot/dts/bcm47094-luxul-xwr-3100.dts
|
||||
@@ -98,10 +98,6 @@
|
||||
};
|
||||
};
|
||||
|
||||
-&uart0 {
|
||||
- status = "okay";
|
||||
-};
|
||||
-
|
||||
&usb3 {
|
||||
vcc-gpio = <&chipcommon 18 GPIO_ACTIVE_HIGH>;
|
||||
};
|
||||
--- a/arch/arm/boot/dts/bcm47094-netgear-r8500.dts
|
||||
+++ b/arch/arm/boot/dts/bcm47094-netgear-r8500.dts
|
||||
@@ -97,7 +97,3 @@
|
||||
};
|
||||
};
|
||||
};
|
||||
-
|
||||
-&uart0 {
|
||||
- status = "okay";
|
||||
-};
|
||||
--- a/arch/arm/boot/dts/bcm47094.dtsi
|
||||
+++ b/arch/arm/boot/dts/bcm47094.dtsi
|
||||
@@ -14,4 +14,5 @@
|
||||
|
||||
&uart0 {
|
||||
clock-frequency = <125000000>;
|
||||
+ status = "okay";
|
||||
};
|
||||
--- a/arch/arm/boot/dts/bcm94708.dts
|
||||
+++ b/arch/arm/boot/dts/bcm94708.dts
|
||||
@@ -50,7 +50,3 @@
|
||||
reg = <0x00000000 0x08000000>;
|
||||
};
|
||||
};
|
||||
-
|
||||
-&uart0 {
|
||||
- status = "okay";
|
||||
-};
|
||||
--- a/arch/arm/boot/dts/bcm94709.dts
|
||||
+++ b/arch/arm/boot/dts/bcm94709.dts
|
||||
@@ -50,7 +50,3 @@
|
||||
reg = <0x00000000 0x08000000>;
|
||||
};
|
||||
};
|
||||
-
|
||||
-&uart0 {
|
||||
- status = "okay";
|
||||
-};
|
||||
--- a/arch/arm/boot/dts/bcm953012er.dts
|
||||
+++ b/arch/arm/boot/dts/bcm953012er.dts
|
||||
@@ -70,10 +70,6 @@
|
||||
};
|
||||
};
|
||||
|
||||
-&uart0 {
|
||||
- status = "okay";
|
||||
-};
|
||||
-
|
||||
&spi_nor {
|
||||
status = "okay";
|
||||
};
|
||||
--- a/arch/arm/boot/dts/bcm953012k.dts
|
||||
+++ b/arch/arm/boot/dts/bcm953012k.dts
|
||||
@@ -54,7 +54,6 @@
|
||||
|
||||
&uart0 {
|
||||
clock-frequency = <62499840>;
|
||||
- status = "okay";
|
||||
};
|
||||
|
||||
&uart1 {
|
|
@ -1,43 +0,0 @@
|
|||
From 24e24f72379638d598aec5d0525ef57d5bfc5c51 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Wed, 7 Dec 2016 08:56:51 +0100
|
||||
Subject: [PATCH 2/6] ARM: BCM5301X: Fix LAN LED labels for Luxul XWR-3100
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
They were named incorrectly most likely due to copy & paste mistake.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/bcm47094-luxul-xwr-3100.dts | 6 +++---
|
||||
1 file changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm47094-luxul-xwr-3100.dts
|
||||
+++ b/arch/arm/boot/dts/bcm47094-luxul-xwr-3100.dts
|
||||
@@ -31,13 +31,13 @@
|
||||
};
|
||||
|
||||
lan3 {
|
||||
- label = "bcm53xx:green:lan1";
|
||||
+ label = "bcm53xx:green:lan3";
|
||||
gpios = <&chipcommon 1 GPIO_ACTIVE_LOW>;
|
||||
linux,default-trigger = "default-off";
|
||||
};
|
||||
|
||||
lan4 {
|
||||
- label = "bcm53xx:green:lan0";
|
||||
+ label = "bcm53xx:green:lan4";
|
||||
gpios = <&chipcommon 2 GPIO_ACTIVE_LOW>;
|
||||
linux,default-trigger = "default-off";
|
||||
};
|
||||
@@ -49,7 +49,7 @@
|
||||
};
|
||||
|
||||
lan1 {
|
||||
- label = "bcm53xx:green:lan3";
|
||||
+ label = "bcm53xx:green:lan1";
|
||||
gpios = <&chipcommon 4 GPIO_ACTIVE_LOW>;
|
||||
linux,default-trigger = "default-off";
|
||||
};
|
|
@ -1,68 +0,0 @@
|
|||
From 45d2567b4b80a3f267502419aaad3d74b745dae7 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Wed, 7 Dec 2016 08:56:52 +0100
|
||||
Subject: [PATCH 3/6] ARM: BCM5301X: Specify USB controllers in DT
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
There are 3 separated controllers, one per USB /standard/. With PHY
|
||||
drivers in place they can be simply supported with generic drivers.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Reviewed-by: Ray Jui <ray.jui@broadcom.com>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/bcm5301x.dtsi | 33 ++++++++++++++++++++++++++++++++-
|
||||
1 file changed, 32 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm5301x.dtsi
|
||||
+++ b/arch/arm/boot/dts/bcm5301x.dtsi
|
||||
@@ -248,8 +248,26 @@
|
||||
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
+ ranges;
|
||||
|
||||
- phys = <&usb2_phy>;
|
||||
+ interrupt-parent = <&gic>;
|
||||
+
|
||||
+ ehci: ehci@21000 {
|
||||
+ #usb-cells = <0>;
|
||||
+
|
||||
+ compatible = "generic-ehci";
|
||||
+ reg = <0x00021000 0x1000>;
|
||||
+ interrupts = <GIC_SPI 79 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+ phys = <&usb2_phy>;
|
||||
+ };
|
||||
+
|
||||
+ ohci: ohci@22000 {
|
||||
+ #usb-cells = <0>;
|
||||
+
|
||||
+ compatible = "generic-ohci";
|
||||
+ reg = <0x00022000 0x1000>;
|
||||
+ interrupts = <GIC_SPI 79 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+ };
|
||||
};
|
||||
|
||||
usb3: usb3@23000 {
|
||||
@@ -257,6 +275,19 @@
|
||||
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
+ ranges;
|
||||
+
|
||||
+ interrupt-parent = <&gic>;
|
||||
+
|
||||
+ xhci: xhci@23000 {
|
||||
+ #usb-cells = <0>;
|
||||
+
|
||||
+ compatible = "generic-xhci";
|
||||
+ reg = <0x00023000 0x1000>;
|
||||
+ interrupts = <GIC_SPI 80 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+ phys = <&usb3_phy>;
|
||||
+ phy-names = "usb";
|
||||
+ };
|
||||
};
|
||||
|
||||
spi@29000 {
|
|
@ -1,31 +0,0 @@
|
|||
From 1aca202b721ce8643f87a8f85a686595c1be6b60 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Wed, 7 Dec 2016 08:56:53 +0100
|
||||
Subject: [PATCH 4/6] ARM: BCM5301X: Set GPIO enabling USB power on Netgear
|
||||
R7000
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
There is one GPIO controlling power for both USB ports.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/bcm4709-netgear-r7000.dts | 8 ++++++++
|
||||
1 file changed, 8 insertions(+)
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm4709-netgear-r7000.dts
|
||||
+++ b/arch/arm/boot/dts/bcm4709-netgear-r7000.dts
|
||||
@@ -100,3 +100,11 @@
|
||||
};
|
||||
};
|
||||
};
|
||||
+
|
||||
+&usb2 {
|
||||
+ vcc-gpio = <&chipcommon 0 GPIO_ACTIVE_HIGH>;
|
||||
+};
|
||||
+
|
||||
+&usb3 {
|
||||
+ vcc-gpio = <&chipcommon 0 GPIO_ACTIVE_HIGH>;
|
||||
+};
|
|
@ -1,236 +0,0 @@
|
|||
From 94afd3b99c65072b76edd25f73bad89587b83261 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Wed, 7 Dec 2016 08:56:54 +0100
|
||||
Subject: [PATCH 5/6] ARM: BCM5301X: Specify all RAM by including an extra
|
||||
block
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
The first 128 MiB of RAM can be accessed using an alias at address 0x0.
|
||||
|
||||
In theory we could access whole RAM using 0x80000000 - 0xbfffffff range
|
||||
(up to 1 GiB) but it doesn't seem to work on Northstar. For some reason
|
||||
(hardware setup left by the bootloader maybe?) 0x80000000 - 0x87ffffff
|
||||
range can't be used. I reproduced this problem on:
|
||||
1) Buffalo WZR-600DHP2 (BCM47081)
|
||||
2) Netgear R6250 (BCM4708)
|
||||
3) D-Link DIR-885L (BCM47094)
|
||||
|
||||
So it seems we're forced to access first 128 MiB using alias at 0x0 and
|
||||
the rest using real base address + 128 MiB offset which is 0x88000000.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Acked-by: Jon Mason <jon.mason@broadcom.com>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/bcm4708-asus-rt-ac56u.dts | 3 ++-
|
||||
arch/arm/boot/dts/bcm4708-asus-rt-ac68u.dts | 3 ++-
|
||||
arch/arm/boot/dts/bcm4708-buffalo-wzr-1750dhp.dts | 3 ++-
|
||||
arch/arm/boot/dts/bcm4708-netgear-r6250.dts | 3 ++-
|
||||
arch/arm/boot/dts/bcm4708-netgear-r6300-v2.dts | 3 ++-
|
||||
arch/arm/boot/dts/bcm4708-smartrg-sr400ac.dts | 3 ++-
|
||||
arch/arm/boot/dts/bcm47081-asus-rt-n18u.dts | 3 ++-
|
||||
arch/arm/boot/dts/bcm47081-buffalo-wzr-600dhp2.dts | 3 ++-
|
||||
arch/arm/boot/dts/bcm47081-buffalo-wzr-900dhp.dts | 3 ++-
|
||||
arch/arm/boot/dts/bcm4709-asus-rt-ac87u.dts | 3 ++-
|
||||
arch/arm/boot/dts/bcm4709-buffalo-wxr-1900dhp.dts | 3 ++-
|
||||
arch/arm/boot/dts/bcm4709-netgear-r7000.dts | 3 ++-
|
||||
arch/arm/boot/dts/bcm4709-netgear-r8000.dts | 3 ++-
|
||||
arch/arm/boot/dts/bcm47094-dlink-dir-885l.dts | 3 ++-
|
||||
arch/arm/boot/dts/bcm47094-luxul-xwr-3100.dts | 3 ++-
|
||||
arch/arm/boot/dts/bcm47094-netgear-r8500.dts | 3 ++-
|
||||
16 files changed, 32 insertions(+), 16 deletions(-)
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm4708-asus-rt-ac56u.dts
|
||||
+++ b/arch/arm/boot/dts/bcm4708-asus-rt-ac56u.dts
|
||||
@@ -21,7 +21,8 @@
|
||||
};
|
||||
|
||||
memory {
|
||||
- reg = <0x00000000 0x08000000>;
|
||||
+ reg = <0x00000000 0x08000000
|
||||
+ 0x88000000 0x08000000>;
|
||||
};
|
||||
|
||||
leds {
|
||||
--- a/arch/arm/boot/dts/bcm4708-asus-rt-ac68u.dts
|
||||
+++ b/arch/arm/boot/dts/bcm4708-asus-rt-ac68u.dts
|
||||
@@ -21,7 +21,8 @@
|
||||
};
|
||||
|
||||
memory {
|
||||
- reg = <0x00000000 0x08000000>;
|
||||
+ reg = <0x00000000 0x08000000
|
||||
+ 0x88000000 0x08000000>;
|
||||
};
|
||||
|
||||
leds {
|
||||
--- a/arch/arm/boot/dts/bcm4708-buffalo-wzr-1750dhp.dts
|
||||
+++ b/arch/arm/boot/dts/bcm4708-buffalo-wzr-1750dhp.dts
|
||||
@@ -21,7 +21,8 @@
|
||||
};
|
||||
|
||||
memory {
|
||||
- reg = <0x00000000 0x08000000>;
|
||||
+ reg = <0x00000000 0x08000000
|
||||
+ 0x88000000 0x18000000>;
|
||||
};
|
||||
|
||||
spi {
|
||||
--- a/arch/arm/boot/dts/bcm4708-netgear-r6250.dts
|
||||
+++ b/arch/arm/boot/dts/bcm4708-netgear-r6250.dts
|
||||
@@ -21,7 +21,8 @@
|
||||
};
|
||||
|
||||
memory {
|
||||
- reg = <0x00000000 0x08000000>;
|
||||
+ reg = <0x00000000 0x08000000
|
||||
+ 0x88000000 0x08000000>;
|
||||
};
|
||||
|
||||
leds {
|
||||
--- a/arch/arm/boot/dts/bcm4708-netgear-r6300-v2.dts
|
||||
+++ b/arch/arm/boot/dts/bcm4708-netgear-r6300-v2.dts
|
||||
@@ -21,7 +21,8 @@
|
||||
};
|
||||
|
||||
memory {
|
||||
- reg = <0x00000000 0x08000000>;
|
||||
+ reg = <0x00000000 0x08000000
|
||||
+ 0x88000000 0x08000000>;
|
||||
};
|
||||
|
||||
leds {
|
||||
--- a/arch/arm/boot/dts/bcm4708-smartrg-sr400ac.dts
|
||||
+++ b/arch/arm/boot/dts/bcm4708-smartrg-sr400ac.dts
|
||||
@@ -21,7 +21,8 @@
|
||||
};
|
||||
|
||||
memory {
|
||||
- reg = <0x00000000 0x08000000>;
|
||||
+ reg = <0x00000000 0x08000000
|
||||
+ 0x88000000 0x08000000>;
|
||||
};
|
||||
|
||||
leds {
|
||||
--- a/arch/arm/boot/dts/bcm47081-asus-rt-n18u.dts
|
||||
+++ b/arch/arm/boot/dts/bcm47081-asus-rt-n18u.dts
|
||||
@@ -21,7 +21,8 @@
|
||||
};
|
||||
|
||||
memory {
|
||||
- reg = <0x00000000 0x08000000>;
|
||||
+ reg = <0x00000000 0x08000000
|
||||
+ 0x88000000 0x08000000>;
|
||||
};
|
||||
|
||||
leds {
|
||||
--- a/arch/arm/boot/dts/bcm47081-buffalo-wzr-600dhp2.dts
|
||||
+++ b/arch/arm/boot/dts/bcm47081-buffalo-wzr-600dhp2.dts
|
||||
@@ -21,7 +21,8 @@
|
||||
};
|
||||
|
||||
memory {
|
||||
- reg = <0x00000000 0x08000000>;
|
||||
+ reg = <0x00000000 0x08000000
|
||||
+ 0x88000000 0x08000000>;
|
||||
};
|
||||
|
||||
spi {
|
||||
--- a/arch/arm/boot/dts/bcm47081-buffalo-wzr-900dhp.dts
|
||||
+++ b/arch/arm/boot/dts/bcm47081-buffalo-wzr-900dhp.dts
|
||||
@@ -21,7 +21,8 @@
|
||||
};
|
||||
|
||||
memory {
|
||||
- reg = <0x00000000 0x08000000>;
|
||||
+ reg = <0x00000000 0x08000000
|
||||
+ 0x88000000 0x08000000>;
|
||||
};
|
||||
|
||||
gpio-keys {
|
||||
--- a/arch/arm/boot/dts/bcm4709-asus-rt-ac87u.dts
|
||||
+++ b/arch/arm/boot/dts/bcm4709-asus-rt-ac87u.dts
|
||||
@@ -21,7 +21,8 @@
|
||||
};
|
||||
|
||||
memory {
|
||||
- reg = <0x00000000 0x08000000>;
|
||||
+ reg = <0x00000000 0x08000000
|
||||
+ 0x88000000 0x08000000>;
|
||||
};
|
||||
|
||||
leds {
|
||||
--- a/arch/arm/boot/dts/bcm4709-buffalo-wxr-1900dhp.dts
|
||||
+++ b/arch/arm/boot/dts/bcm4709-buffalo-wxr-1900dhp.dts
|
||||
@@ -21,7 +21,8 @@
|
||||
};
|
||||
|
||||
memory {
|
||||
- reg = <0x00000000 0x08000000>;
|
||||
+ reg = <0x00000000 0x08000000
|
||||
+ 0x88000000 0x18000000>;
|
||||
};
|
||||
|
||||
leds {
|
||||
--- a/arch/arm/boot/dts/bcm4709-netgear-r7000.dts
|
||||
+++ b/arch/arm/boot/dts/bcm4709-netgear-r7000.dts
|
||||
@@ -21,7 +21,8 @@
|
||||
};
|
||||
|
||||
memory {
|
||||
- reg = <0x00000000 0x08000000>;
|
||||
+ reg = <0x00000000 0x08000000
|
||||
+ 0x88000000 0x08000000>;
|
||||
};
|
||||
|
||||
leds {
|
||||
--- a/arch/arm/boot/dts/bcm4709-netgear-r8000.dts
|
||||
+++ b/arch/arm/boot/dts/bcm4709-netgear-r8000.dts
|
||||
@@ -21,7 +21,8 @@
|
||||
};
|
||||
|
||||
memory {
|
||||
- reg = <0x00000000 0x08000000>;
|
||||
+ reg = <0x00000000 0x08000000
|
||||
+ 0x88000000 0x08000000>;
|
||||
};
|
||||
|
||||
leds {
|
||||
--- a/arch/arm/boot/dts/bcm47094-dlink-dir-885l.dts
|
||||
+++ b/arch/arm/boot/dts/bcm47094-dlink-dir-885l.dts
|
||||
@@ -21,7 +21,8 @@
|
||||
};
|
||||
|
||||
memory {
|
||||
- reg = <0x00000000 0x08000000>;
|
||||
+ reg = <0x00000000 0x08000000
|
||||
+ 0x88000000 0x08000000>;
|
||||
};
|
||||
|
||||
nand: nand@18028000 {
|
||||
--- a/arch/arm/boot/dts/bcm47094-luxul-xwr-3100.dts
|
||||
+++ b/arch/arm/boot/dts/bcm47094-luxul-xwr-3100.dts
|
||||
@@ -18,7 +18,8 @@
|
||||
};
|
||||
|
||||
memory {
|
||||
- reg = <0x00000000 0x08000000>;
|
||||
+ reg = <0x00000000 0x08000000
|
||||
+ 0x88000000 0x08000000>;
|
||||
};
|
||||
|
||||
leds {
|
||||
--- a/arch/arm/boot/dts/bcm47094-netgear-r8500.dts
|
||||
+++ b/arch/arm/boot/dts/bcm47094-netgear-r8500.dts
|
||||
@@ -18,7 +18,8 @@
|
||||
};
|
||||
|
||||
memory {
|
||||
- reg = <0x00000000 0x08000000>;
|
||||
+ reg = <0x00000000 0x08000000
|
||||
+ 0x88000000 0x18000000>;
|
||||
};
|
||||
|
||||
leds {
|
|
@ -1,56 +0,0 @@
|
|||
From 92c6f000cb3a4280166d812d88cda3011717b548 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Wed, 7 Dec 2016 08:56:55 +0100
|
||||
Subject: [PATCH 6/6] ARM: BCM53573: Specify USB ports of on-SoC controllers
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Broadcom OHCI and EHCI controllers always have 2 ports each on the root
|
||||
hub. Describe them in DT to allow specifying extra info or referencing
|
||||
port nodes.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/bcm53573.dtsi | 22 ++++++++++++++++++++++
|
||||
1 file changed, 22 insertions(+)
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm53573.dtsi
|
||||
+++ b/arch/arm/boot/dts/bcm53573.dtsi
|
||||
@@ -124,6 +124,17 @@
|
||||
reg = <0x4000 0x1000>;
|
||||
interrupt-parent = <&gic>;
|
||||
interrupts = <GIC_SPI 4 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+
|
||||
+ ehci_port1: port@1 {
|
||||
+ reg = <1>;
|
||||
+ };
|
||||
+
|
||||
+ ehci_port2: port@2 {
|
||||
+ reg = <2>;
|
||||
+ };
|
||||
};
|
||||
|
||||
ohci: ohci@d000 {
|
||||
@@ -133,6 +144,17 @@
|
||||
reg = <0xd000 0x1000>;
|
||||
interrupt-parent = <&gic>;
|
||||
interrupts = <GIC_SPI 4 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+
|
||||
+ ohci_port1: port@1 {
|
||||
+ reg = <1>;
|
||||
+ };
|
||||
+
|
||||
+ ohci_port2: port@2 {
|
||||
+ reg = <2>;
|
||||
+ };
|
||||
};
|
||||
};
|
||||
|
|
@ -1,126 +0,0 @@
|
|||
From d3af86018715ebb19f4111f80e545405b208f09b Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Sat, 14 Jan 2017 00:58:57 +0100
|
||||
Subject: [PATCH] ARM: BCM5301X: Set 5 GHz wireless frequency limits on Netgear
|
||||
R8000
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Netgear R8000 is a tri-band home router. It has three BCM43602 chipsets
|
||||
two of them for 5 GHz band. Both seem the same and their firmwares
|
||||
report the same set of channels. The problem is due to hardware / board
|
||||
design there are extra limitations that should be respected.
|
||||
|
||||
First PHY should be used for U-NII-2 and U-NII-3. Third PHY should be
|
||||
used for U-NII-1. Using them in a different way may result in wireless
|
||||
not working or in noticeably reduced performance. Basic version of this
|
||||
info was provided by Broadcom employee, then it has been verified by me
|
||||
using original vendor firmware (which has limitations hardcoded in UI).
|
||||
|
||||
This patch uses recently introduced ieee80211-freq-limit property to
|
||||
describe these limitations at DT level.
|
||||
|
||||
Referencing PCIe devices in DT required specifying all related bridges.
|
||||
Below you can see (a bit complex) PCI tree from R8000 that explains all
|
||||
entries that I needed to put in DT.
|
||||
|
||||
0000:00:00.0 14e4:8012 Bridge Device
|
||||
└─ 0000:01:00.0 14e4:aa52 Network Controller
|
||||
|
||||
0001:00:00.0 14e4:8012 Bridge Device
|
||||
└─ 0001:01:00.0 10b5:8603 Bridge Device
|
||||
├─ 0001:02:01.0 10b5:8603 Bridge Device
|
||||
│ └─ 0001:03:00.0 14e4:aa52 Network Controller
|
||||
├─ 0001:02:02.0 10b5:8603 Bridge Device
|
||||
│ └─ 0001:04:00.0 14e4:aa52 Network Controller
|
||||
├─ 0001:02:03.0 000d:0000 0x000000
|
||||
├─ 0001:02:04.0 000d:0000 0x000000
|
||||
├─ 0001:02:05.0 000d:0000 0x000000
|
||||
├─ 0001:02:06.0 000d:0000 0x000000
|
||||
├─ (...)
|
||||
├─ 0001:02:1d.0 000d:0000 0x000000
|
||||
├─ 0001:02:1e.0 000d:0000 0x000000
|
||||
└─ 0001:02:1f.0 000d:0000 0x000000
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/bcm4709-netgear-r8000.dts | 48 +++++++++++++++++++++++++++++
|
||||
arch/arm/boot/dts/bcm5301x.dtsi | 8 +++++
|
||||
2 files changed, 56 insertions(+)
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm4709-netgear-r8000.dts
|
||||
+++ b/arch/arm/boot/dts/bcm4709-netgear-r8000.dts
|
||||
@@ -108,6 +108,54 @@
|
||||
};
|
||||
};
|
||||
|
||||
+&pcie0 {
|
||||
+ #address-cells = <3>;
|
||||
+ #size-cells = <2>;
|
||||
+
|
||||
+ bridge@0,0,0 {
|
||||
+ reg = <0x0000 0 0 0 0>;
|
||||
+
|
||||
+ #address-cells = <3>;
|
||||
+ #size-cells = <2>;
|
||||
+
|
||||
+ wifi@0,1,0 {
|
||||
+ reg = <0x0000 0 0 0 0>;
|
||||
+ ieee80211-freq-limit = <5735000 5835000>;
|
||||
+ };
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&pcie1 {
|
||||
+ #address-cells = <3>;
|
||||
+ #size-cells = <2>;
|
||||
+
|
||||
+ bridge@1,0,0 {
|
||||
+ reg = <0x0000 0 0 0 0>;
|
||||
+
|
||||
+ #address-cells = <3>;
|
||||
+ #size-cells = <2>;
|
||||
+
|
||||
+ bridge@1,1,0 {
|
||||
+ reg = <0x0000 0 0 0 0>;
|
||||
+
|
||||
+ #address-cells = <3>;
|
||||
+ #size-cells = <2>;
|
||||
+
|
||||
+ bridge@1,2,2 {
|
||||
+ reg = <0x1000 0 0 0 0>;
|
||||
+
|
||||
+ #address-cells = <3>;
|
||||
+ #size-cells = <2>;
|
||||
+
|
||||
+ wifi@1,4,0 {
|
||||
+ reg = <0x0000 0 0 0 0>;
|
||||
+ ieee80211-freq-limit = <5170000 5730000>;
|
||||
+ };
|
||||
+ };
|
||||
+ };
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
&usb2 {
|
||||
vcc-gpio = <&chipcommon 0 GPIO_ACTIVE_HIGH>;
|
||||
};
|
||||
--- a/arch/arm/boot/dts/bcm5301x.dtsi
|
||||
+++ b/arch/arm/boot/dts/bcm5301x.dtsi
|
||||
@@ -243,6 +243,14 @@
|
||||
#gpio-cells = <2>;
|
||||
};
|
||||
|
||||
+ pcie0: pcie@12000 {
|
||||
+ reg = <0x00012000 0x1000>;
|
||||
+ };
|
||||
+
|
||||
+ pcie1: pcie@13000 {
|
||||
+ reg = <0x00013000 0x1000>;
|
||||
+ };
|
||||
+
|
||||
usb2: usb2@21000 {
|
||||
reg = <0x00021000 0x1000>;
|
||||
|
|
@ -1,89 +0,0 @@
|
|||
From eeacbb3e30f220d5d775c61421f813d4e186a325 Mon Sep 17 00:00:00 2001
|
||||
From: Dan Haab <dhaab@luxul.com>
|
||||
Date: Sat, 14 Jan 2017 19:29:27 -0700
|
||||
Subject: [PATCH] ARM: BCM5301X: Add DT for Luxul XAP-1410
|
||||
|
||||
Luxul XAP-1410 in a dual-band access point device based on BCM47081 with
|
||||
serial flash. It has 3 LEDs and just one (reset) button.
|
||||
|
||||
Signed-off-by: Dan Haab <dhaab@luxul.com>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/Makefile | 1 +
|
||||
arch/arm/boot/dts/bcm47081-luxul-xap-1410.dts | 60 +++++++++++++++++++++++++++
|
||||
2 files changed, 61 insertions(+)
|
||||
create mode 100644 arch/arm/boot/dts/bcm47081-luxul-xap-1410.dts
|
||||
|
||||
--- a/arch/arm/boot/dts/Makefile
|
||||
+++ b/arch/arm/boot/dts/Makefile
|
||||
@@ -73,6 +73,7 @@ dtb-$(CONFIG_ARCH_BCM_5301X) += \
|
||||
bcm47081-asus-rt-n18u.dtb \
|
||||
bcm47081-buffalo-wzr-600dhp2.dtb \
|
||||
bcm47081-buffalo-wzr-900dhp.dtb \
|
||||
+ bcm47081-luxul-xap-1410.dtb \
|
||||
bcm4709-asus-rt-ac87u.dtb \
|
||||
bcm4709-buffalo-wxr-1900dhp.dtb \
|
||||
bcm4709-netgear-r7000.dtb \
|
||||
--- /dev/null
|
||||
+++ b/arch/arm/boot/dts/bcm47081-luxul-xap-1410.dts
|
||||
@@ -0,0 +1,60 @@
|
||||
+/*
|
||||
+ * Copyright 2017 Luxul Inc.
|
||||
+ *
|
||||
+ * Licensed under the ISC license.
|
||||
+ */
|
||||
+
|
||||
+/dts-v1/;
|
||||
+
|
||||
+#include "bcm47081.dtsi"
|
||||
+
|
||||
+/ {
|
||||
+ compatible = "luxul,xap-1410v1", "brcm,bcm47081", "brcm,bcm4708";
|
||||
+ model = "Luxul XAP-1410 V1";
|
||||
+
|
||||
+ chosen {
|
||||
+ bootargs = "console=ttyS0,115200";
|
||||
+ };
|
||||
+
|
||||
+ memory {
|
||||
+ reg = <0x00000000 0x08000000>;
|
||||
+ };
|
||||
+
|
||||
+ leds {
|
||||
+ compatible = "gpio-leds";
|
||||
+
|
||||
+ 5ghz {
|
||||
+ label = "bcm53xx:blue:5ghz";
|
||||
+ gpios = <&chipcommon 13 GPIO_ACTIVE_LOW>;
|
||||
+ linux,default-trigger = "none";
|
||||
+ };
|
||||
+
|
||||
+ 2ghz {
|
||||
+ label = "bcm53xx:blue:2ghz";
|
||||
+ gpios = <&chipcommon 14 GPIO_ACTIVE_LOW>;
|
||||
+ linux,default-trigger = "none";
|
||||
+ };
|
||||
+
|
||||
+ status {
|
||||
+ label = "bcm53xx:green:status";
|
||||
+ gpios = <&chipcommon 15 GPIO_ACTIVE_LOW>;
|
||||
+ linux,default-trigger = "timer";
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ gpio-keys {
|
||||
+ compatible = "gpio-keys";
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+
|
||||
+ restart {
|
||||
+ label = "Reset";
|
||||
+ linux,code = <KEY_RESTART>;
|
||||
+ gpios = <&chipcommon 11 GPIO_ACTIVE_LOW>;
|
||||
+ };
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&spi_nor {
|
||||
+ status = "okay";
|
||||
+};
|
|
@ -1,136 +0,0 @@
|
|||
From 514647c9af870bd2df2e579134a26bff8d17b6b9 Mon Sep 17 00:00:00 2001
|
||||
From: Dan Haab <dhaab@luxul.com>
|
||||
Date: Sat, 14 Jan 2017 19:29:28 -0700
|
||||
Subject: [PATCH] ARM: BCM5301X: Add DT for Luxul XWR-1200
|
||||
|
||||
Luxul XWR-1200 in a dual-band router based on BCM47081. It uses serial
|
||||
flash (for bootloader and NVRAM) and NAND flash (for firmware).
|
||||
|
||||
Signed-off-by: Dan Haab <dhaab@luxul.com>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/Makefile | 1 +
|
||||
arch/arm/boot/dts/bcm47081-luxul-xwr-1200.dts | 107 ++++++++++++++++++++++++++
|
||||
2 files changed, 108 insertions(+)
|
||||
create mode 100644 arch/arm/boot/dts/bcm47081-luxul-xwr-1200.dts
|
||||
|
||||
--- a/arch/arm/boot/dts/Makefile
|
||||
+++ b/arch/arm/boot/dts/Makefile
|
||||
@@ -74,6 +74,7 @@ dtb-$(CONFIG_ARCH_BCM_5301X) += \
|
||||
bcm47081-buffalo-wzr-600dhp2.dtb \
|
||||
bcm47081-buffalo-wzr-900dhp.dtb \
|
||||
bcm47081-luxul-xap-1410.dtb \
|
||||
+ bcm47081-luxul-xwr-1200.dtb \
|
||||
bcm4709-asus-rt-ac87u.dtb \
|
||||
bcm4709-buffalo-wxr-1900dhp.dtb \
|
||||
bcm4709-netgear-r7000.dtb \
|
||||
--- /dev/null
|
||||
+++ b/arch/arm/boot/dts/bcm47081-luxul-xwr-1200.dts
|
||||
@@ -0,0 +1,107 @@
|
||||
+/*
|
||||
+ * Copyright 2017 Luxul Inc.
|
||||
+ *
|
||||
+ * Licensed under the ISC license.
|
||||
+ */
|
||||
+
|
||||
+/dts-v1/;
|
||||
+
|
||||
+#include "bcm47081.dtsi"
|
||||
+#include "bcm5301x-nand-cs0-bch4.dtsi"
|
||||
+
|
||||
+/ {
|
||||
+ compatible = "luxul,xwr-1200v1", "brcm,bcm47081", "brcm,bcm4708";
|
||||
+ model = "Luxul XWR-1200 V1";
|
||||
+
|
||||
+ chosen {
|
||||
+ bootargs = "console=ttyS0,115200";
|
||||
+ };
|
||||
+
|
||||
+ memory {
|
||||
+ reg = <0x00000000 0x08000000>;
|
||||
+ };
|
||||
+
|
||||
+ leds {
|
||||
+ compatible = "gpio-leds";
|
||||
+
|
||||
+ power {
|
||||
+ label = "bcm53xx:green:power";
|
||||
+ gpios = <&chipcommon 0 GPIO_ACTIVE_LOW>;
|
||||
+ linux,default-trigger = "default-on";
|
||||
+ };
|
||||
+
|
||||
+ lan3 {
|
||||
+ label = "bcm53xx:green:lan3";
|
||||
+ gpios = <&chipcommon 1 GPIO_ACTIVE_LOW>;
|
||||
+ linux,default-trigger = "none";
|
||||
+ };
|
||||
+
|
||||
+ lan4 {
|
||||
+ label = "bcm53xx:green:lan4";
|
||||
+ gpios = <&chipcommon 2 GPIO_ACTIVE_LOW>;
|
||||
+ linux,default-trigger = "none";
|
||||
+ };
|
||||
+
|
||||
+ wan {
|
||||
+ label = "bcm53xx:green:wan";
|
||||
+ gpios = <&chipcommon 3 GPIO_ACTIVE_LOW>;
|
||||
+ linux,default-trigger = "none";
|
||||
+ };
|
||||
+
|
||||
+ lan2 {
|
||||
+ label = "bcm53xx:green:lan2";
|
||||
+ gpios = <&chipcommon 6 GPIO_ACTIVE_LOW>;
|
||||
+ linux,default-trigger = "none";
|
||||
+ };
|
||||
+
|
||||
+ usb {
|
||||
+ label = "bcm53xx:green:usb";
|
||||
+ gpios = <&chipcommon 8 GPIO_ACTIVE_LOW>;
|
||||
+ linux,default-trigger = "none";
|
||||
+ };
|
||||
+
|
||||
+ status {
|
||||
+ label = "bcm53xx:green:status";
|
||||
+ gpios = <&chipcommon 10 GPIO_ACTIVE_LOW>;
|
||||
+ linux,default-trigger = "timer";
|
||||
+ };
|
||||
+
|
||||
+ 2ghz {
|
||||
+ label = "bcm53xx:green:2ghz";
|
||||
+ gpios = <&chipcommon 13 GPIO_ACTIVE_LOW>;
|
||||
+ linux,default-trigger = "none";
|
||||
+ };
|
||||
+
|
||||
+ 5ghz {
|
||||
+ label = "bcm53xx:green:5ghz";
|
||||
+ gpios = <&chipcommon 14 GPIO_ACTIVE_LOW>;
|
||||
+ linux,default-trigger = "none";
|
||||
+ };
|
||||
+
|
||||
+ lan1 {
|
||||
+ label = "bcm53xx:green:lan1";
|
||||
+ gpios = <&chipcommon 15 GPIO_ACTIVE_LOW>;
|
||||
+ linux,default-trigger = "none";
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ gpio-keys {
|
||||
+ compatible = "gpio-keys";
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+
|
||||
+ restart {
|
||||
+ label = "Reset";
|
||||
+ linux,code = <KEY_RESTART>;
|
||||
+ gpios = <&chipcommon 11 GPIO_ACTIVE_LOW>;
|
||||
+ };
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&usb2 {
|
||||
+ vcc-gpio = <&chipcommon 9 GPIO_ACTIVE_HIGH>;
|
||||
+};
|
||||
+
|
||||
+&spi_nor {
|
||||
+ status = "okay";
|
||||
+};
|
|
@ -1,72 +0,0 @@
|
|||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Subject: [PATCH] ARM: dts: BCM5301X: Add basic DT for Linksys EA9200
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
It's tri-band wireless home router based on BCM4709A0 with 3 x BCM43602
|
||||
chipsets. LEDs will be hopefully added later to the DT.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/Makefile | 1 +
|
||||
arch/arm/boot/dts/bcm4709-linksys-ea9200.dts | 42 ++++++++++++++++++++++++++++
|
||||
2 files changed, 43 insertions(+)
|
||||
create mode 100644 arch/arm/boot/dts/bcm4709-linksys-ea9200.dts
|
||||
|
||||
--- a/arch/arm/boot/dts/Makefile
|
||||
+++ b/arch/arm/boot/dts/Makefile
|
||||
@@ -77,6 +77,7 @@ dtb-$(CONFIG_ARCH_BCM_5301X) += \
|
||||
bcm47081-luxul-xwr-1200.dtb \
|
||||
bcm4709-asus-rt-ac87u.dtb \
|
||||
bcm4709-buffalo-wxr-1900dhp.dtb \
|
||||
+ bcm4709-linksys-ea9200.dtb \
|
||||
bcm4709-netgear-r7000.dtb \
|
||||
bcm4709-netgear-r8000.dtb \
|
||||
bcm4709-tplink-archer-c9-v1.dtb \
|
||||
--- /dev/null
|
||||
+++ b/arch/arm/boot/dts/bcm4709-linksys-ea9200.dts
|
||||
@@ -0,0 +1,42 @@
|
||||
+/*
|
||||
+ * Copyright (C) 2017 Rafał Miłecki <rafal@milecki.pl>
|
||||
+ *
|
||||
+ * Licensed under the ISC license.
|
||||
+ */
|
||||
+
|
||||
+/dts-v1/;
|
||||
+
|
||||
+#include "bcm4709.dtsi"
|
||||
+#include "bcm5301x-nand-cs0-bch8.dtsi"
|
||||
+
|
||||
+/ {
|
||||
+ compatible = "linksys,ea9200", "brcm,bcm4709", "brcm,bcm4708";
|
||||
+ model = "Linksys EA9200";
|
||||
+
|
||||
+ chosen {
|
||||
+ bootargs = "console=ttyS0,115200";
|
||||
+ };
|
||||
+
|
||||
+ memory {
|
||||
+ reg = <0x00000000 0x08000000
|
||||
+ 0x88000000 0x08000000>;
|
||||
+ };
|
||||
+
|
||||
+ gpio-keys {
|
||||
+ compatible = "gpio-keys";
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+
|
||||
+ wps {
|
||||
+ label = "WPS";
|
||||
+ linux,code = <KEY_WPS_BUTTON>;
|
||||
+ gpios = <&chipcommon 3 GPIO_ACTIVE_LOW>;
|
||||
+ };
|
||||
+
|
||||
+ restart {
|
||||
+ label = "Reset";
|
||||
+ linux,code = <KEY_RESTART>;
|
||||
+ gpios = <&chipcommon 17 GPIO_ACTIVE_LOW>;
|
||||
+ };
|
||||
+ };
|
||||
+};
|
|
@ -1,73 +0,0 @@
|
|||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Subject: [PATCH] ARM: dts: BCM5301X: Add basic DT for Linksys EA6300 V1
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
It's wireless home router based on BCM4708A0 with BCM4360 + BCM43217
|
||||
wireless chipsets. LEDs will be hopefully added later to the DT.
|
||||
According to some sources it may use the same board as EA6400 and just
|
||||
differ by an original vendor firmware.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/Makefile | 1 +
|
||||
arch/arm/boot/dts/bcm4708-linksys-ea6300-v1.dts | 41 +++++++++++++++++++++++++
|
||||
2 files changed, 42 insertions(+)
|
||||
create mode 100644 arch/arm/boot/dts/bcm4708-linksys-ea6300-v1.dts
|
||||
|
||||
--- a/arch/arm/boot/dts/Makefile
|
||||
+++ b/arch/arm/boot/dts/Makefile
|
||||
@@ -65,6 +65,7 @@ dtb-$(CONFIG_ARCH_BCM_5301X) += \
|
||||
bcm4708-asus-rt-ac56u.dtb \
|
||||
bcm4708-asus-rt-ac68u.dtb \
|
||||
bcm4708-buffalo-wzr-1750dhp.dtb \
|
||||
+ bcm4708-linksys-ea6300-v1.dtb \
|
||||
bcm4708-luxul-xap-1510.dtb \
|
||||
bcm4708-luxul-xwc-1000.dtb \
|
||||
bcm4708-netgear-r6250.dtb \
|
||||
--- /dev/null
|
||||
+++ b/arch/arm/boot/dts/bcm4708-linksys-ea6300-v1.dts
|
||||
@@ -0,0 +1,41 @@
|
||||
+/*
|
||||
+ * Copyright (C) 2017 Rafał Miłecki <rafal@milecki.pl>
|
||||
+ *
|
||||
+ * Licensed under the ISC license.
|
||||
+ */
|
||||
+
|
||||
+/dts-v1/;
|
||||
+
|
||||
+#include "bcm4708.dtsi"
|
||||
+#include "bcm5301x-nand-cs0-bch8.dtsi"
|
||||
+
|
||||
+/ {
|
||||
+ compatible = "linksys,ea6300-v1", "brcm,bcm4708";
|
||||
+ model = "Linksys EA6300 V1";
|
||||
+
|
||||
+ chosen {
|
||||
+ bootargs = "console=ttyS0,115200";
|
||||
+ };
|
||||
+
|
||||
+ memory {
|
||||
+ reg = <0x00000000 0x08000000>;
|
||||
+ };
|
||||
+
|
||||
+ gpio-keys {
|
||||
+ compatible = "gpio-keys";
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+
|
||||
+ wps {
|
||||
+ label = "WPS";
|
||||
+ linux,code = <KEY_WPS_BUTTON>;
|
||||
+ gpios = <&chipcommon 7 GPIO_ACTIVE_LOW>;
|
||||
+ };
|
||||
+
|
||||
+ restart {
|
||||
+ label = "Reset";
|
||||
+ linux,code = <KEY_RESTART>;
|
||||
+ gpios = <&chipcommon 11 GPIO_ACTIVE_LOW>;
|
||||
+ };
|
||||
+ };
|
||||
+};
|
|
@ -1,54 +0,0 @@
|
|||
From 3344d946ff277425052383e0a7877baf39911046 Mon Sep 17 00:00:00 2001
|
||||
From: Jon Mason <jon.mason@broadcom.com>
|
||||
Date: Wed, 8 Feb 2017 15:45:15 -0500
|
||||
Subject: [PATCH] ARM: dts: BCM5301X: Add NAND entries to bcm953012k
|
||||
|
||||
Add the NAND entry in the DTS for the bcm953012k reference board.
|
||||
|
||||
Signed-off-by: Jon Mason <jon.mason@broadcom.com>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/bcm953012k.dts | 32 ++++++++++++++++++++++++++++++++
|
||||
1 file changed, 32 insertions(+)
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm953012k.dts
|
||||
+++ b/arch/arm/boot/dts/bcm953012k.dts
|
||||
@@ -52,6 +52,38 @@
|
||||
};
|
||||
};
|
||||
|
||||
+&nand {
|
||||
+ nandcs@0 {
|
||||
+ compatible = "brcm,nandcs";
|
||||
+ reg = <0>;
|
||||
+ nand-on-flash-bbt;
|
||||
+
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <1>;
|
||||
+
|
||||
+ nand-ecc-strength = <4>;
|
||||
+ nand-ecc-step-size = <512>;
|
||||
+
|
||||
+ partition@0 {
|
||||
+ label = "nboot";
|
||||
+ reg = <0x00000000 0x00200000>;
|
||||
+ read-only;
|
||||
+ };
|
||||
+ partition@200000 {
|
||||
+ label = "nenv";
|
||||
+ reg = <0x00200000 0x00400000>;
|
||||
+ };
|
||||
+ partition@600000 {
|
||||
+ label = "nsystem";
|
||||
+ reg = <0x00600000 0x00a00000>;
|
||||
+ };
|
||||
+ partition@1000000 {
|
||||
+ label = "nrootfs";
|
||||
+ reg = <0x01000000 0x07000000>;
|
||||
+ };
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
&uart0 {
|
||||
clock-frequency = <62499840>;
|
||||
};
|
|
@ -1,69 +0,0 @@
|
|||
From 3dc9eca8ece2934047f1d5c290fd36c0e8698756 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Thu, 23 Feb 2017 14:06:36 +0100
|
||||
Subject: [PATCH] ARM: dts: BCM5301X: Add basic DT for Linksys EA9500
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
It's tri-band wireless home router based on BCM47094 AKA BCM4709C0. It
|
||||
uses 3 x BCM4366 chipsets for wireless.
|
||||
Panamera seems to be board name used by Linksys.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/Makefile | 1 +
|
||||
arch/arm/boot/dts/bcm47094-linksys-panamera.dts | 36 +++++++++++++++++++++++++
|
||||
2 files changed, 37 insertions(+)
|
||||
create mode 100644 arch/arm/boot/dts/bcm47094-linksys-panamera.dts
|
||||
|
||||
--- a/arch/arm/boot/dts/Makefile
|
||||
+++ b/arch/arm/boot/dts/Makefile
|
||||
@@ -83,6 +83,7 @@ dtb-$(CONFIG_ARCH_BCM_5301X) += \
|
||||
bcm4709-netgear-r8000.dtb \
|
||||
bcm4709-tplink-archer-c9-v1.dtb \
|
||||
bcm47094-dlink-dir-885l.dtb \
|
||||
+ bcm47094-linksys-panamera.dtb \
|
||||
bcm47094-luxul-xwr-3100.dtb \
|
||||
bcm47094-netgear-r8500.dtb \
|
||||
bcm94708.dtb \
|
||||
--- /dev/null
|
||||
+++ b/arch/arm/boot/dts/bcm47094-linksys-panamera.dts
|
||||
@@ -0,0 +1,36 @@
|
||||
+/*
|
||||
+ * Copyright (C) 2017 Rafał Miłecki <rafal@milecki.pl>
|
||||
+ *
|
||||
+ * Licensed under the ISC license.
|
||||
+ */
|
||||
+
|
||||
+/dts-v1/;
|
||||
+
|
||||
+#include "bcm47094.dtsi"
|
||||
+#include "bcm5301x-nand-cs0-bch8.dtsi"
|
||||
+
|
||||
+/ {
|
||||
+ compatible = "linksys,panamera", "brcm,bcm47094", "brcm,bcm4708";
|
||||
+ model = "Linksys EA9500";
|
||||
+
|
||||
+ chosen {
|
||||
+ bootargs = "console=ttyS0,115200";
|
||||
+ };
|
||||
+
|
||||
+ memory {
|
||||
+ reg = <0x00000000 0x08000000
|
||||
+ 0x88000000 0x08000000>;
|
||||
+ };
|
||||
+
|
||||
+ gpio-keys {
|
||||
+ compatible = "gpio-keys";
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+
|
||||
+ wps {
|
||||
+ label = "WPS";
|
||||
+ linux,code = <KEY_WPS_BUTTON>;
|
||||
+ gpios = <&chipcommon 3 GPIO_ACTIVE_LOW>;
|
||||
+ };
|
||||
+ };
|
||||
+};
|
|
@ -1,129 +0,0 @@
|
|||
From 475dcdec8cd1bb1b73ddfd9f872822bf4ad9c242 Mon Sep 17 00:00:00 2001
|
||||
From: Steve Lin <steven.lin1@broadcom.com>
|
||||
Date: Thu, 23 Feb 2017 14:23:03 -0500
|
||||
Subject: [PATCH] ARM: dts: BCM5301X: Add support for BCM953012HR
|
||||
|
||||
Initial version of DTS to support Broadcom BCM953012HR Northstar
|
||||
HR platform, similar to, but not the same as existing 953012K.
|
||||
|
||||
Signed-off-by: Steve Lin <steven.lin1@broadcom.com>
|
||||
Acked-by: Jon Mason <jon.mason@broadcom.com>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/Makefile | 1 +
|
||||
arch/arm/boot/dts/bcm953012hr.dts | 99 +++++++++++++++++++++++++++++++++++++++
|
||||
2 files changed, 100 insertions(+)
|
||||
create mode 100644 arch/arm/boot/dts/bcm953012hr.dts
|
||||
|
||||
--- a/arch/arm/boot/dts/Makefile
|
||||
+++ b/arch/arm/boot/dts/Makefile
|
||||
@@ -89,6 +89,7 @@ dtb-$(CONFIG_ARCH_BCM_5301X) += \
|
||||
bcm94708.dtb \
|
||||
bcm94709.dtb \
|
||||
bcm953012er.dtb \
|
||||
+ bcm953012hr.dtb \
|
||||
bcm953012k.dtb
|
||||
dtb-$(CONFIG_ARCH_BCM_53573) += \
|
||||
bcm47189-tenda-ac9.dtb
|
||||
--- /dev/null
|
||||
+++ b/arch/arm/boot/dts/bcm953012hr.dts
|
||||
@@ -0,0 +1,99 @@
|
||||
+/*
|
||||
+ * SPDX-License-Identifier: BSD-3-Clause
|
||||
+ *
|
||||
+ * Copyright(c) 2017 Broadcom
|
||||
+ *
|
||||
+ * Redistribution and use in source and binary forms, with or without
|
||||
+ * modification, are permitted provided that the following conditions
|
||||
+ * are met:
|
||||
+ *
|
||||
+ * * Redistributions of source code must retain the above copyright
|
||||
+ * notice, this list of conditions and the following disclaimer.
|
||||
+ * * Redistributions in binary form must reproduce the above copyright
|
||||
+ * notice, this list of conditions and the following disclaimer in
|
||||
+ * the documentation and/or other materials provided with the
|
||||
+ * distribution.
|
||||
+ * * Neither the name of Broadcom nor the names of its contributors
|
||||
+ * may be used to endorse or promote products derived from this
|
||||
+ * software without specific prior written permission.
|
||||
+ *
|
||||
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
+ */
|
||||
+
|
||||
+/dts-v1/;
|
||||
+
|
||||
+#include "bcm4708.dtsi"
|
||||
+#include "bcm5301x-nand-cs0-bch4.dtsi"
|
||||
+
|
||||
+/ {
|
||||
+ model = "NorthStar HR (BCM953012HR)";
|
||||
+ compatible = "brcm,bcm953012hr", "brcm,brcm53012", "brcm,bcm4708";
|
||||
+
|
||||
+ aliases {
|
||||
+ serial0 = &uart0;
|
||||
+ };
|
||||
+
|
||||
+ chosen {
|
||||
+ stdout-path = "serial0:115200n8";
|
||||
+ };
|
||||
+
|
||||
+ memory@80000000 {
|
||||
+ reg = <0x80000000 0x10000000>;
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&nandcs {
|
||||
+ partition@0 {
|
||||
+ label = "nboot";
|
||||
+ reg = <0x00000000 0x00200000>;
|
||||
+ read-only;
|
||||
+ };
|
||||
+ partition@200000 {
|
||||
+ label = "nenv";
|
||||
+ reg = <0x00200000 0x00400000>;
|
||||
+ };
|
||||
+ partition@600000 {
|
||||
+ label = "nsystem";
|
||||
+ reg = <0x00600000 0x00a00000>;
|
||||
+ };
|
||||
+ partition@1000000 {
|
||||
+ label = "nrootfs";
|
||||
+ reg = <0x01000000 0x07000000>;
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&spi_nor {
|
||||
+ status = "okay";
|
||||
+ spi-max-frequency = <62500000>;
|
||||
+ m25p,default-addr-width = <3>;
|
||||
+
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <1>;
|
||||
+
|
||||
+ partition@0 {
|
||||
+ label = "boot";
|
||||
+ reg = <0x00000000 0x000d0000>;
|
||||
+ };
|
||||
+ partition@d000 {
|
||||
+ label = "env";
|
||||
+ reg = <0x000d0000 0x00030000>;
|
||||
+ };
|
||||
+ partition@100000 {
|
||||
+ label = "system";
|
||||
+ reg = <0x00100000 0x00600000>;
|
||||
+ };
|
||||
+ partition@700000 {
|
||||
+ label = "rootfs";
|
||||
+ reg = <0x00700000 0x00900000>;
|
||||
+ };
|
||||
+};
|
|
@ -1,70 +0,0 @@
|
|||
From 3ba1bae984e585f500b8406b1bf3e42e0ec752b7 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Tue, 14 Feb 2017 17:49:05 +0100
|
||||
Subject: [PATCH] ARM: dts: BCM53573: Describe Tenda AC9 PCIe card in DT
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Tenda AC9 has PCIe controller with just one device connected to it:
|
||||
0000:00:00.0 14e4:d145 Bridge Device
|
||||
└─ 0000:01:00.0 14e4:a8db Network Controller
|
||||
|
||||
This card is directly on SoC (doesn't use physical connector) and has
|
||||
BCM43217 chipset with bcma bus. One of its components is ChipCommon core
|
||||
which is also a GPIO controller. We need to describe it to be able to
|
||||
add devices using its GPIO pins.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/bcm47189-tenda-ac9.dts | 27 +++++++++++++++++++++++++++
|
||||
arch/arm/boot/dts/bcm53573.dtsi | 4 ++++
|
||||
2 files changed, 31 insertions(+)
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm47189-tenda-ac9.dts
|
||||
+++ b/arch/arm/boot/dts/bcm47189-tenda-ac9.dts
|
||||
@@ -72,3 +72,30 @@
|
||||
};
|
||||
};
|
||||
};
|
||||
+
|
||||
+&pcie0 {
|
||||
+ ranges = <0x00000000 0 0 0 0 0x00100000>;
|
||||
+ #address-cells = <3>;
|
||||
+ #size-cells = <2>;
|
||||
+
|
||||
+ bridge@0,0,0 {
|
||||
+ reg = <0x0000 0 0 0 0>;
|
||||
+ ranges = <0x00000000 0 0 0 0 0 0 0x00100000>;
|
||||
+ #address-cells = <3>;
|
||||
+ #size-cells = <2>;
|
||||
+
|
||||
+ wifi@0,1,0 {
|
||||
+ reg = <0x0000 0 0 0 0>;
|
||||
+ ranges = <0x00000000 0 0 0 0x00100000>;
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <1>;
|
||||
+
|
||||
+ pcie0_chipcommon: chipcommon@0 {
|
||||
+ reg = <0 0x1000>;
|
||||
+
|
||||
+ gpio-controller;
|
||||
+ #gpio-cells = <2>;
|
||||
+ };
|
||||
+ };
|
||||
+ };
|
||||
+};
|
||||
--- a/arch/arm/boot/dts/bcm53573.dtsi
|
||||
+++ b/arch/arm/boot/dts/bcm53573.dtsi
|
||||
@@ -113,6 +113,10 @@
|
||||
};
|
||||
};
|
||||
|
||||
+ pcie0: pcie@2000 {
|
||||
+ reg = <0x00002000 0x1000>;
|
||||
+ };
|
||||
+
|
||||
usb2: usb2@4000 {
|
||||
reg = <0x4000 0x1000>;
|
||||
ranges;
|
|
@ -1,36 +0,0 @@
|
|||
From 86cd47e761c773f2384ac2041730d7ccfeb40095 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Tue, 14 Feb 2017 17:49:06 +0100
|
||||
Subject: [PATCH] ARM: dts: BCM53573: Add Tenda AC9 2 GHz LED
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
It's connected to a GPIO pin of an extra controller placed on the PCIe
|
||||
card.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/bcm47189-tenda-ac9.dts | 10 ++++++++++
|
||||
1 file changed, 10 insertions(+)
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm47189-tenda-ac9.dts
|
||||
+++ b/arch/arm/boot/dts/bcm47189-tenda-ac9.dts
|
||||
@@ -48,6 +48,16 @@
|
||||
};
|
||||
};
|
||||
|
||||
+ pcie0_leds {
|
||||
+ compatible = "gpio-leds";
|
||||
+
|
||||
+ 2ghz {
|
||||
+ label = "bcm53xx:blue:2ghz";
|
||||
+ gpios = <&pcie0_chipcommon 3 GPIO_ACTIVE_HIGH>;
|
||||
+ linux,default-trigger = "default-off";
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
gpio-keys {
|
||||
compatible = "gpio-keys";
|
||||
#address-cells = <1>;
|
|
@ -1,265 +0,0 @@
|
|||
From 153580bd3e242c204bb8b1946d76da78e826f555 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Sat, 28 Jan 2017 12:51:35 +0100
|
||||
Subject: [PATCH] ARM: dts: BCM5301X: Relicense DTS files I created to the ISC
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
It's preferred to have DT source files licensed under BSD compatible
|
||||
license. All new BCM5301X DTS files use ISC so let's also relicense old
|
||||
ones to it.
|
||||
|
||||
Except for me only Hauke was ever touched these files in his commit
|
||||
9faa5960eef3 ("ARM: BCM5301X: add NAND flash chip description") and
|
||||
commit bb1d8fba1965 ("ARM: BCM5301X: add NAND flash chip description for
|
||||
Asus RT-AC87U").
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Acked-by: Hauke Mehrtens <hauke@hauke-m.de>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/bcm4708-asus-rt-ac56u.dts | 12 +++++++++++-
|
||||
arch/arm/boot/dts/bcm4708-asus-rt-ac68u.dts | 12 +++++++++++-
|
||||
arch/arm/boot/dts/bcm4708-netgear-r6300-v2.dts | 12 +++++++++++-
|
||||
arch/arm/boot/dts/bcm47081-asus-rt-n18u.dts | 12 +++++++++++-
|
||||
arch/arm/boot/dts/bcm47081-buffalo-wzr-600dhp2.dts | 12 +++++++++++-
|
||||
arch/arm/boot/dts/bcm47081-buffalo-wzr-900dhp.dts | 12 +++++++++++-
|
||||
arch/arm/boot/dts/bcm47081.dtsi | 12 +++++++++++-
|
||||
arch/arm/boot/dts/bcm4709-asus-rt-ac87u.dts | 12 +++++++++++-
|
||||
arch/arm/boot/dts/bcm4709-netgear-r7000.dts | 12 +++++++++++-
|
||||
arch/arm/boot/dts/bcm4709-netgear-r8000.dts | 12 +++++++++++-
|
||||
arch/arm/boot/dts/bcm47094-dlink-dir-885l.dts | 12 +++++++++++-
|
||||
11 files changed, 121 insertions(+), 11 deletions(-)
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm4708-asus-rt-ac56u.dts
|
||||
+++ b/arch/arm/boot/dts/bcm4708-asus-rt-ac56u.dts
|
||||
@@ -4,7 +4,17 @@
|
||||
*
|
||||
* Copyright (C) 2015 Rafał Miłecki <zajec5@gmail.com>
|
||||
*
|
||||
- * Licensed under the GNU/GPL. See COPYING for details.
|
||||
+ * Permission to use, copy, modify, and/or distribute this software for any
|
||||
+ * purpose with or without fee is hereby granted, provided that the above
|
||||
+ * copyright notice and this permission notice appear in all copies.
|
||||
+ *
|
||||
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
||||
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||
+ * AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
||||
+ * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
||||
+ * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
|
||||
+ * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
||||
+ * PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
--- a/arch/arm/boot/dts/bcm4708-asus-rt-ac68u.dts
|
||||
+++ b/arch/arm/boot/dts/bcm4708-asus-rt-ac68u.dts
|
||||
@@ -4,7 +4,17 @@
|
||||
*
|
||||
* Copyright (C) 2015 Rafał Miłecki <zajec5@gmail.com>
|
||||
*
|
||||
- * Licensed under the GNU/GPL. See COPYING for details.
|
||||
+ * Permission to use, copy, modify, and/or distribute this software for any
|
||||
+ * purpose with or without fee is hereby granted, provided that the above
|
||||
+ * copyright notice and this permission notice appear in all copies.
|
||||
+ *
|
||||
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
||||
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||
+ * AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
||||
+ * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
||||
+ * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
|
||||
+ * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
||||
+ * PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
--- a/arch/arm/boot/dts/bcm4708-netgear-r6300-v2.dts
|
||||
+++ b/arch/arm/boot/dts/bcm4708-netgear-r6300-v2.dts
|
||||
@@ -4,7 +4,17 @@
|
||||
*
|
||||
* Copyright (C) 2014 Rafał Miłecki <zajec5@gmail.com>
|
||||
*
|
||||
- * Licensed under the GNU/GPL. See COPYING for details.
|
||||
+ * Permission to use, copy, modify, and/or distribute this software for any
|
||||
+ * purpose with or without fee is hereby granted, provided that the above
|
||||
+ * copyright notice and this permission notice appear in all copies.
|
||||
+ *
|
||||
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
||||
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||
+ * AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
||||
+ * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
||||
+ * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
|
||||
+ * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
||||
+ * PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
--- a/arch/arm/boot/dts/bcm47081-asus-rt-n18u.dts
|
||||
+++ b/arch/arm/boot/dts/bcm47081-asus-rt-n18u.dts
|
||||
@@ -4,7 +4,17 @@
|
||||
*
|
||||
* Copyright (C) 2014 Rafał Miłecki <zajec5@gmail.com>
|
||||
*
|
||||
- * Licensed under the GNU/GPL. See COPYING for details.
|
||||
+ * Permission to use, copy, modify, and/or distribute this software for any
|
||||
+ * purpose with or without fee is hereby granted, provided that the above
|
||||
+ * copyright notice and this permission notice appear in all copies.
|
||||
+ *
|
||||
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
||||
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||
+ * AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
||||
+ * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
||||
+ * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
|
||||
+ * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
||||
+ * PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
--- a/arch/arm/boot/dts/bcm47081-buffalo-wzr-600dhp2.dts
|
||||
+++ b/arch/arm/boot/dts/bcm47081-buffalo-wzr-600dhp2.dts
|
||||
@@ -4,7 +4,17 @@
|
||||
*
|
||||
* Copyright (C) 2014 Rafał Miłecki <zajec5@gmail.com>
|
||||
*
|
||||
- * Licensed under the GNU/GPL. See COPYING for details.
|
||||
+ * Permission to use, copy, modify, and/or distribute this software for any
|
||||
+ * purpose with or without fee is hereby granted, provided that the above
|
||||
+ * copyright notice and this permission notice appear in all copies.
|
||||
+ *
|
||||
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
||||
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||
+ * AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
||||
+ * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
||||
+ * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
|
||||
+ * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
||||
+ * PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
--- a/arch/arm/boot/dts/bcm47081-buffalo-wzr-900dhp.dts
|
||||
+++ b/arch/arm/boot/dts/bcm47081-buffalo-wzr-900dhp.dts
|
||||
@@ -4,7 +4,17 @@
|
||||
*
|
||||
* Copyright (C) 2015 Rafał Miłecki <zajec5@gmail.com>
|
||||
*
|
||||
- * Licensed under the GNU/GPL. See COPYING for details.
|
||||
+ * Permission to use, copy, modify, and/or distribute this software for any
|
||||
+ * purpose with or without fee is hereby granted, provided that the above
|
||||
+ * copyright notice and this permission notice appear in all copies.
|
||||
+ *
|
||||
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
||||
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||
+ * AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
||||
+ * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
||||
+ * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
|
||||
+ * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
||||
+ * PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
--- a/arch/arm/boot/dts/bcm47081.dtsi
|
||||
+++ b/arch/arm/boot/dts/bcm47081.dtsi
|
||||
@@ -4,7 +4,17 @@
|
||||
*
|
||||
* Copyright © 2014 Rafał Miłecki <zajec5@gmail.com>
|
||||
*
|
||||
- * Licensed under the GNU/GPL. See COPYING for details.
|
||||
+ * Permission to use, copy, modify, and/or distribute this software for any
|
||||
+ * purpose with or without fee is hereby granted, provided that the above
|
||||
+ * copyright notice and this permission notice appear in all copies.
|
||||
+ *
|
||||
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
||||
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||
+ * AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
||||
+ * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
||||
+ * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
|
||||
+ * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
||||
+ * PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#include "bcm5301x.dtsi"
|
||||
--- a/arch/arm/boot/dts/bcm4709-asus-rt-ac87u.dts
|
||||
+++ b/arch/arm/boot/dts/bcm4709-asus-rt-ac87u.dts
|
||||
@@ -4,7 +4,17 @@
|
||||
*
|
||||
* Copyright (C) 2015 Rafał Miłecki <zajec5@gmail.com>
|
||||
*
|
||||
- * Licensed under the GNU/GPL. See COPYING for details.
|
||||
+ * Permission to use, copy, modify, and/or distribute this software for any
|
||||
+ * purpose with or without fee is hereby granted, provided that the above
|
||||
+ * copyright notice and this permission notice appear in all copies.
|
||||
+ *
|
||||
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
||||
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||
+ * AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
||||
+ * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
||||
+ * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
|
||||
+ * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
||||
+ * PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
--- a/arch/arm/boot/dts/bcm4709-netgear-r7000.dts
|
||||
+++ b/arch/arm/boot/dts/bcm4709-netgear-r7000.dts
|
||||
@@ -4,7 +4,17 @@
|
||||
*
|
||||
* Copyright (C) 2015 Rafał Miłecki <zajec5@gmail.com>
|
||||
*
|
||||
- * Licensed under the GNU/GPL. See COPYING for details.
|
||||
+ * Permission to use, copy, modify, and/or distribute this software for any
|
||||
+ * purpose with or without fee is hereby granted, provided that the above
|
||||
+ * copyright notice and this permission notice appear in all copies.
|
||||
+ *
|
||||
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
||||
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||
+ * AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
||||
+ * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
||||
+ * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
|
||||
+ * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
||||
+ * PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
--- a/arch/arm/boot/dts/bcm4709-netgear-r8000.dts
|
||||
+++ b/arch/arm/boot/dts/bcm4709-netgear-r8000.dts
|
||||
@@ -4,7 +4,17 @@
|
||||
*
|
||||
* Copyright (C) 2015 Rafał Miłecki <zajec5@gmail.com>
|
||||
*
|
||||
- * Licensed under the GNU/GPL. See COPYING for details.
|
||||
+ * Permission to use, copy, modify, and/or distribute this software for any
|
||||
+ * purpose with or without fee is hereby granted, provided that the above
|
||||
+ * copyright notice and this permission notice appear in all copies.
|
||||
+ *
|
||||
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
||||
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||
+ * AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
||||
+ * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
||||
+ * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
|
||||
+ * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
||||
+ * PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
--- a/arch/arm/boot/dts/bcm47094-dlink-dir-885l.dts
|
||||
+++ b/arch/arm/boot/dts/bcm47094-dlink-dir-885l.dts
|
||||
@@ -4,7 +4,17 @@
|
||||
*
|
||||
* Copyright (C) 2016 Rafał Miłecki <zajec5@gmail.com>
|
||||
*
|
||||
- * Licensed under the GNU/GPL. See COPYING for details.
|
||||
+ * Permission to use, copy, modify, and/or distribute this software for any
|
||||
+ * purpose with or without fee is hereby granted, provided that the above
|
||||
+ * copyright notice and this permission notice appear in all copies.
|
||||
+ *
|
||||
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
||||
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||
+ * AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
||||
+ * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
||||
+ * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
|
||||
+ * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
||||
+ * PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
|
@ -1,66 +0,0 @@
|
|||
From 4a5782a889cfbc8523d7097c3f147572ed5129a6 Mon Sep 17 00:00:00 2001
|
||||
From: Aditya Xavier <adityaxavier@gmail.com>
|
||||
Date: Sat, 28 Jan 2017 20:07:49 +0530
|
||||
Subject: [PATCH] ARM: dts: BCM5301X: Add missing Netgear R8000 LEDs and Keys
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Added two WAN status LEDs and a GPIO key for brightness which were
|
||||
missing.
|
||||
|
||||
Signed-off-by: Aditya Xavier <adityaxavier@gmail.com>
|
||||
Acked-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/bcm4709-netgear-r8000.dts | 22 ++++++++++++++++++++--
|
||||
1 file changed, 20 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm4709-netgear-r8000.dts
|
||||
+++ b/arch/arm/boot/dts/bcm4709-netgear-r8000.dts
|
||||
@@ -38,18 +38,30 @@
|
||||
leds {
|
||||
compatible = "gpio-leds";
|
||||
|
||||
- power0 {
|
||||
+ power-white {
|
||||
label = "bcm53xx:white:power";
|
||||
gpios = <&chipcommon 2 GPIO_ACTIVE_LOW>;
|
||||
linux,default-trigger = "default-on";
|
||||
};
|
||||
|
||||
- power1 {
|
||||
+ power-amber {
|
||||
label = "bcm53xx:amber:power";
|
||||
gpios = <&chipcommon 3 GPIO_ACTIVE_LOW>;
|
||||
linux,default-trigger = "default-off";
|
||||
};
|
||||
|
||||
+ wan-white {
|
||||
+ label = "bcm53xx:white:wan";
|
||||
+ gpios = <&chipcommon 8 GPIO_ACTIVE_LOW>;
|
||||
+ linux,default-trigger = "default-on";
|
||||
+ };
|
||||
+
|
||||
+ wan-amber {
|
||||
+ label = "bcm53xx:amber:wan";
|
||||
+ gpios = <&chipcommon 9 GPIO_ACTIVE_HIGH>;
|
||||
+ linux,default-trigger = "default-off";
|
||||
+ };
|
||||
+
|
||||
5ghz-1 {
|
||||
label = "bcm53xx:white:5ghz-1";
|
||||
gpios = <&chipcommon 12 GPIO_ACTIVE_LOW>;
|
||||
@@ -115,6 +127,12 @@
|
||||
linux,code = <KEY_RESTART>;
|
||||
gpios = <&chipcommon 6 GPIO_ACTIVE_LOW>;
|
||||
};
|
||||
+
|
||||
+ brightness {
|
||||
+ label = "Backlight";
|
||||
+ linux,code = <KEY_BRIGHTNESS_ZERO>;
|
||||
+ gpios = <&chipcommon 19 GPIO_ACTIVE_LOW>;
|
||||
+ };
|
||||
};
|
||||
};
|
||||
|
|
@ -1,50 +0,0 @@
|
|||
From 820a3e952b266d4355e89ed91c9b11945030321e Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Wed, 8 Mar 2017 07:41:04 +0100
|
||||
Subject: [PATCH] ARM: dts: BCM53573: Don't use nonexistent "default-off" LED
|
||||
trigger
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Such a trigger doesn't exist in Linux and is not needed as LED is being
|
||||
turned off by default. This could cause errors in LEDs core code when
|
||||
trying to set default trigger.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Acked-by: Pavel Machek <pavel@ucw.cz>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/bcm47189-tenda-ac9.dts | 4 ----
|
||||
1 file changed, 4 deletions(-)
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm47189-tenda-ac9.dts
|
||||
+++ b/arch/arm/boot/dts/bcm47189-tenda-ac9.dts
|
||||
@@ -26,19 +26,16 @@
|
||||
usb {
|
||||
label = "bcm53xx:blue:usb";
|
||||
gpios = <&chipcommon 1 GPIO_ACTIVE_HIGH>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
|
||||
wps {
|
||||
label = "bcm53xx:blue:wps";
|
||||
gpios = <&chipcommon 10 GPIO_ACTIVE_HIGH>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
|
||||
5ghz {
|
||||
label = "bcm53xx:blue:5ghz";
|
||||
gpios = <&chipcommon 11 GPIO_ACTIVE_HIGH>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
|
||||
system {
|
||||
@@ -54,7 +51,6 @@
|
||||
2ghz {
|
||||
label = "bcm53xx:blue:2ghz";
|
||||
gpios = <&pcie0_chipcommon 3 GPIO_ACTIVE_HIGH>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
};
|
||||
|
|
@ -1,651 +0,0 @@
|
|||
From 0b660259e927177dc0c6eb3b1c39f23c6a011c5f Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Wed, 8 Mar 2017 07:41:05 +0100
|
||||
Subject: [PATCH] ARM: dts: BCM5301X: Don't use nonexistent "default-off" LED
|
||||
trigger
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Such a trigger doesn't exist in Linux and is not needed as LED is being
|
||||
turned off by default. This could cause errors in LEDs core code when
|
||||
trying to set default trigger.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/bcm4708-asus-rt-ac56u.dts | 5 -----
|
||||
arch/arm/boot/dts/bcm4708-asus-rt-ac68u.dts | 2 --
|
||||
arch/arm/boot/dts/bcm4708-buffalo-wzr-1750dhp.dts | 5 -----
|
||||
arch/arm/boot/dts/bcm4708-netgear-r6250.dts | 3 ---
|
||||
arch/arm/boot/dts/bcm4708-netgear-r6300-v2.dts | 3 ---
|
||||
arch/arm/boot/dts/bcm4708-smartrg-sr400ac.dts | 10 ----------
|
||||
arch/arm/boot/dts/bcm47081-asus-rt-n18u.dts | 2 --
|
||||
arch/arm/boot/dts/bcm47081-buffalo-wzr-600dhp2.dts | 4 ----
|
||||
arch/arm/boot/dts/bcm4709-asus-rt-ac87u.dts | 2 --
|
||||
arch/arm/boot/dts/bcm4709-buffalo-wxr-1900dhp.dts | 8 --------
|
||||
arch/arm/boot/dts/bcm4709-netgear-r7000.dts | 7 -------
|
||||
arch/arm/boot/dts/bcm4709-netgear-r8000.dts | 9 ---------
|
||||
arch/arm/boot/dts/bcm4709-tplink-archer-c9-v1.dts | 8 --------
|
||||
arch/arm/boot/dts/bcm47094-dlink-dir-885l.dts | 6 ------
|
||||
arch/arm/boot/dts/bcm47094-luxul-xwr-3100.dts | 8 --------
|
||||
arch/arm/boot/dts/bcm47094-netgear-r8500.dts | 6 ------
|
||||
16 files changed, 88 deletions(-)
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm4708-asus-rt-ac56u.dts
|
||||
+++ b/arch/arm/boot/dts/bcm4708-asus-rt-ac56u.dts
|
||||
@@ -41,19 +41,16 @@
|
||||
usb3 {
|
||||
label = "bcm53xx:blue:usb3";
|
||||
gpios = <&chipcommon 0 GPIO_ACTIVE_LOW>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
|
||||
wan {
|
||||
label = "bcm53xx:blue:wan";
|
||||
gpios = <&chipcommon 1 GPIO_ACTIVE_LOW>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
|
||||
lan {
|
||||
label = "bcm53xx:blue:lan";
|
||||
gpios = <&chipcommon 2 GPIO_ACTIVE_LOW>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
|
||||
power {
|
||||
@@ -71,14 +68,12 @@
|
||||
2ghz {
|
||||
label = "bcm53xx:blue:2ghz";
|
||||
gpios = <&chipcommon 6 GPIO_ACTIVE_LOW>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
|
||||
|
||||
usb2 {
|
||||
label = "bcm53xx:blue:usb2";
|
||||
gpios = <&chipcommon 14 GPIO_ACTIVE_LOW>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
};
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm4708-asus-rt-ac68u.dts
|
||||
+++ b/arch/arm/boot/dts/bcm4708-asus-rt-ac68u.dts
|
||||
@@ -41,7 +41,6 @@
|
||||
usb2 {
|
||||
label = "bcm53xx:blue:usb2";
|
||||
gpios = <&chipcommon 0 GPIO_ACTIVE_LOW>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
|
||||
power {
|
||||
@@ -59,7 +58,6 @@
|
||||
usb3 {
|
||||
label = "bcm53xx:blue:usb3";
|
||||
gpios = <&chipcommon 14 GPIO_ACTIVE_LOW>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
};
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm4708-buffalo-wzr-1750dhp.dts
|
||||
+++ b/arch/arm/boot/dts/bcm4708-buffalo-wzr-1750dhp.dts
|
||||
@@ -52,13 +52,11 @@
|
||||
usb {
|
||||
label = "bcm53xx:blue:usb";
|
||||
gpios = <&hc595 0 GPIO_ACTIVE_HIGH>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
|
||||
power0 {
|
||||
label = "bcm53xx:red:power";
|
||||
gpios = <&hc595 1 GPIO_ACTIVE_HIGH>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
|
||||
power1 {
|
||||
@@ -76,7 +74,6 @@
|
||||
router1 {
|
||||
label = "bcm53xx:amber:router";
|
||||
gpios = <&hc595 4 GPIO_ACTIVE_HIGH>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
|
||||
wan {
|
||||
@@ -88,13 +85,11 @@
|
||||
wireless0 {
|
||||
label = "bcm53xx:blue:wireless";
|
||||
gpios = <&hc595 6 GPIO_ACTIVE_HIGH>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
|
||||
wireless1 {
|
||||
label = "bcm53xx:amber:wireless";
|
||||
gpios = <&hc595 7 GPIO_ACTIVE_HIGH>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
};
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm4708-netgear-r6250.dts
|
||||
+++ b/arch/arm/boot/dts/bcm4708-netgear-r6250.dts
|
||||
@@ -43,19 +43,16 @@
|
||||
power1 {
|
||||
label = "bcm53xx:amber:power";
|
||||
gpios = <&chipcommon 3 GPIO_ACTIVE_LOW>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
|
||||
usb {
|
||||
label = "bcm53xx:blue:usb";
|
||||
gpios = <&chipcommon 8 GPIO_ACTIVE_LOW>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
|
||||
wireless {
|
||||
label = "bcm53xx:blue:wireless";
|
||||
gpios = <&chipcommon 11 GPIO_ACTIVE_LOW>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
};
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm4708-netgear-r6300-v2.dts
|
||||
+++ b/arch/arm/boot/dts/bcm4708-netgear-r6300-v2.dts
|
||||
@@ -47,7 +47,6 @@
|
||||
power0 {
|
||||
label = "bcm53xx:green:power";
|
||||
gpios = <&chipcommon 2 GPIO_ACTIVE_LOW>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
|
||||
power1 {
|
||||
@@ -59,13 +58,11 @@
|
||||
usb {
|
||||
label = "bcm53xx:blue:usb";
|
||||
gpios = <&chipcommon 8 GPIO_ACTIVE_LOW>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
|
||||
wireless {
|
||||
label = "bcm53xx:blue:wireless";
|
||||
gpios = <&chipcommon 11 GPIO_ACTIVE_LOW>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
};
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm4708-smartrg-sr400ac.dts
|
||||
+++ b/arch/arm/boot/dts/bcm4708-smartrg-sr400ac.dts
|
||||
@@ -37,61 +37,51 @@
|
||||
power-amber {
|
||||
label = "bcm53xx:amber:power";
|
||||
gpios = <&chipcommon 2 GPIO_ACTIVE_HIGH>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
|
||||
usb2 {
|
||||
label = "bcm53xx:white:usb2";
|
||||
gpios = <&chipcommon 3 GPIO_ACTIVE_HIGH>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
|
||||
usb3-white {
|
||||
label = "bcm53xx:white:usb3";
|
||||
gpios = <&chipcommon 4 GPIO_ACTIVE_HIGH>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
|
||||
usb3-green {
|
||||
label = "bcm53xx:green:usb3";
|
||||
gpios = <&chipcommon 5 GPIO_ACTIVE_HIGH>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
|
||||
wps {
|
||||
label = "bcm53xx:white:wps";
|
||||
gpios = <&chipcommon 6 GPIO_ACTIVE_HIGH>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
|
||||
status-red {
|
||||
label = "bcm53xx:red:status";
|
||||
gpios = <&chipcommon 8 GPIO_ACTIVE_HIGH>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
|
||||
status-green {
|
||||
label = "bcm53xx:green:status";
|
||||
gpios = <&chipcommon 9 GPIO_ACTIVE_HIGH>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
|
||||
status-blue {
|
||||
label = "bcm53xx:blue:status";
|
||||
gpios = <&chipcommon 10 GPIO_ACTIVE_HIGH>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
|
||||
wan-white {
|
||||
label = "bcm53xx:white:wan";
|
||||
gpios = <&chipcommon 12 GPIO_ACTIVE_HIGH>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
|
||||
wan-red {
|
||||
label = "bcm53xx:red:wan";
|
||||
gpios = <&chipcommon 13 GPIO_ACTIVE_HIGH>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
};
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm47081-asus-rt-n18u.dts
|
||||
+++ b/arch/arm/boot/dts/bcm47081-asus-rt-n18u.dts
|
||||
@@ -47,7 +47,6 @@
|
||||
usb2 {
|
||||
label = "bcm53xx:blue:usb2";
|
||||
gpios = <&chipcommon 3 GPIO_ACTIVE_LOW>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
|
||||
wan {
|
||||
@@ -65,7 +64,6 @@
|
||||
usb3 {
|
||||
label = "bcm53xx:blue:usb3";
|
||||
gpios = <&chipcommon 14 GPIO_ACTIVE_LOW>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
};
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm47081-buffalo-wzr-600dhp2.dts
|
||||
+++ b/arch/arm/boot/dts/bcm47081-buffalo-wzr-600dhp2.dts
|
||||
@@ -68,7 +68,6 @@
|
||||
power1 {
|
||||
label = "bcm53xx:red:power";
|
||||
gpios = <&hc595 2 GPIO_ACTIVE_HIGH>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
|
||||
router0 {
|
||||
@@ -80,7 +79,6 @@
|
||||
router1 {
|
||||
label = "bcm53xx:amber:router";
|
||||
gpios = <&hc595 4 GPIO_ACTIVE_HIGH>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
|
||||
wan {
|
||||
@@ -92,13 +90,11 @@
|
||||
wireless0 {
|
||||
label = "bcm53xx:green:wireless";
|
||||
gpios = <&hc595 6 GPIO_ACTIVE_HIGH>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
|
||||
wireless1 {
|
||||
label = "bcm53xx:amber:wireless";
|
||||
gpios = <&hc595 7 GPIO_ACTIVE_HIGH>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
};
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm4709-asus-rt-ac87u.dts
|
||||
+++ b/arch/arm/boot/dts/bcm4709-asus-rt-ac87u.dts
|
||||
@@ -41,7 +41,6 @@
|
||||
wps {
|
||||
label = "bcm53xx:blue:wps";
|
||||
gpios = <&chipcommon 1 GPIO_ACTIVE_LOW>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
|
||||
power {
|
||||
@@ -53,7 +52,6 @@
|
||||
wan {
|
||||
label = "bcm53xx:red:wan";
|
||||
gpios = <&chipcommon 5 GPIO_ACTIVE_LOW>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
};
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm4709-buffalo-wxr-1900dhp.dts
|
||||
+++ b/arch/arm/boot/dts/bcm4709-buffalo-wxr-1900dhp.dts
|
||||
@@ -31,13 +31,11 @@
|
||||
usb {
|
||||
label = "bcm53xx:green:usb";
|
||||
gpios = <&chipcommon 4 GPIO_ACTIVE_HIGH>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
|
||||
power-amber {
|
||||
label = "bcm53xx:amber:power";
|
||||
gpios = <&chipcommon 5 GPIO_ACTIVE_HIGH>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
|
||||
power-white {
|
||||
@@ -49,37 +47,31 @@
|
||||
router-amber {
|
||||
label = "bcm53xx:amber:router";
|
||||
gpios = <&chipcommon 7 GPIO_ACTIVE_HIGH>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
|
||||
router-white {
|
||||
label = "bcm53xx:white:router";
|
||||
gpios = <&chipcommon 8 GPIO_ACTIVE_HIGH>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
|
||||
wan-amber {
|
||||
label = "bcm53xx:amber:wan";
|
||||
gpios = <&chipcommon 9 GPIO_ACTIVE_HIGH>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
|
||||
wan-white {
|
||||
label = "bcm53xx:white:wan";
|
||||
gpios = <&chipcommon 10 GPIO_ACTIVE_HIGH>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
|
||||
wireless-amber {
|
||||
label = "bcm53xx:amber:wireless";
|
||||
gpios = <&chipcommon 11 GPIO_ACTIVE_HIGH>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
|
||||
wireless-white {
|
||||
label = "bcm53xx:white:wireless";
|
||||
gpios = <&chipcommon 12 GPIO_ACTIVE_HIGH>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
};
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm4709-netgear-r7000.dts
|
||||
+++ b/arch/arm/boot/dts/bcm4709-netgear-r7000.dts
|
||||
@@ -47,43 +47,36 @@
|
||||
power-amber {
|
||||
label = "bcm53xx:amber:power";
|
||||
gpios = <&chipcommon 3 GPIO_ACTIVE_LOW>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
|
||||
5ghz {
|
||||
label = "bcm53xx:white:5ghz";
|
||||
gpios = <&chipcommon 12 GPIO_ACTIVE_LOW>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
|
||||
2ghz {
|
||||
label = "bcm53xx:white:2ghz";
|
||||
gpios = <&chipcommon 13 GPIO_ACTIVE_LOW>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
|
||||
wps {
|
||||
label = "bcm53xx:white:wps";
|
||||
gpios = <&chipcommon 14 GPIO_ACTIVE_HIGH>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
|
||||
wireless {
|
||||
label = "bcm53xx:white:wireless";
|
||||
gpios = <&chipcommon 15 GPIO_ACTIVE_HIGH>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
|
||||
usb3 {
|
||||
label = "bcm53xx:white:usb3";
|
||||
gpios = <&chipcommon 17 GPIO_ACTIVE_LOW>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
|
||||
usb2 {
|
||||
label = "bcm53xx:white:usb2";
|
||||
gpios = <&chipcommon 18 GPIO_ACTIVE_LOW>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
};
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm4709-netgear-r8000.dts
|
||||
+++ b/arch/arm/boot/dts/bcm4709-netgear-r8000.dts
|
||||
@@ -47,7 +47,6 @@
|
||||
power-amber {
|
||||
label = "bcm53xx:amber:power";
|
||||
gpios = <&chipcommon 3 GPIO_ACTIVE_LOW>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
|
||||
wan-white {
|
||||
@@ -59,49 +58,41 @@
|
||||
wan-amber {
|
||||
label = "bcm53xx:amber:wan";
|
||||
gpios = <&chipcommon 9 GPIO_ACTIVE_HIGH>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
|
||||
5ghz-1 {
|
||||
label = "bcm53xx:white:5ghz-1";
|
||||
gpios = <&chipcommon 12 GPIO_ACTIVE_LOW>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
|
||||
2ghz {
|
||||
label = "bcm53xx:white:2ghz";
|
||||
gpios = <&chipcommon 13 GPIO_ACTIVE_LOW>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
|
||||
wireless {
|
||||
label = "bcm53xx:white:wireless";
|
||||
gpios = <&chipcommon 14 GPIO_ACTIVE_HIGH>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
|
||||
wps {
|
||||
label = "bcm53xx:white:wps";
|
||||
gpios = <&chipcommon 15 GPIO_ACTIVE_HIGH>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
|
||||
5ghz-2 {
|
||||
label = "bcm53xx:white:5ghz-2";
|
||||
gpios = <&chipcommon 16 GPIO_ACTIVE_LOW>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
|
||||
usb3 {
|
||||
label = "bcm53xx:white:usb3";
|
||||
gpios = <&chipcommon 17 GPIO_ACTIVE_LOW>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
|
||||
usb2 {
|
||||
label = "bcm53xx:white:usb2";
|
||||
gpios = <&chipcommon 18 GPIO_ACTIVE_LOW>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
};
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm4709-tplink-archer-c9-v1.dts
|
||||
+++ b/arch/arm/boot/dts/bcm4709-tplink-archer-c9-v1.dts
|
||||
@@ -26,49 +26,41 @@
|
||||
lan {
|
||||
label = "bcm53xx:blue:lan";
|
||||
gpios = <&chipcommon 1 GPIO_ACTIVE_HIGH>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
|
||||
wps {
|
||||
label = "bcm53xx:blue:wps";
|
||||
gpios = <&chipcommon 2 GPIO_ACTIVE_HIGH>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
|
||||
2ghz {
|
||||
label = "bcm53xx:blue:2ghz";
|
||||
gpios = <&chipcommon 4 GPIO_ACTIVE_HIGH>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
|
||||
5ghz {
|
||||
label = "bcm53xx:blue:5ghz";
|
||||
gpios = <&chipcommon 5 GPIO_ACTIVE_HIGH>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
|
||||
usb3 {
|
||||
label = "bcm53xx:blue:usb3";
|
||||
gpios = <&chipcommon 6 GPIO_ACTIVE_HIGH>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
|
||||
usb2 {
|
||||
label = "bcm53xx:blue:usb2";
|
||||
gpios = <&chipcommon 7 GPIO_ACTIVE_HIGH>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
|
||||
wan-blue {
|
||||
label = "bcm53xx:blue:wan";
|
||||
gpios = <&chipcommon 14 GPIO_ACTIVE_HIGH>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
|
||||
wan-amber {
|
||||
label = "bcm53xx:amber:wan";
|
||||
gpios = <&chipcommon 15 GPIO_ACTIVE_HIGH>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
|
||||
power {
|
||||
--- a/arch/arm/boot/dts/bcm47094-dlink-dir-885l.dts
|
||||
+++ b/arch/arm/boot/dts/bcm47094-dlink-dir-885l.dts
|
||||
@@ -56,37 +56,31 @@
|
||||
wan-white {
|
||||
label = "bcm53xx:white:wan";
|
||||
gpios = <&chipcommon 1 GPIO_ACTIVE_LOW>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
|
||||
power-amber {
|
||||
label = "bcm53xx:amber:power";
|
||||
gpios = <&chipcommon 2 GPIO_ACTIVE_LOW>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
|
||||
wan-amber {
|
||||
label = "bcm53xx:amber:wan";
|
||||
gpios = <&chipcommon 3 GPIO_ACTIVE_LOW>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
|
||||
usb3-white {
|
||||
label = "bcm53xx:white:usb3";
|
||||
gpios = <&chipcommon 8 GPIO_ACTIVE_LOW>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
|
||||
2ghz {
|
||||
label = "bcm53xx:white:2ghz";
|
||||
gpios = <&chipcommon 13 GPIO_ACTIVE_LOW>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
|
||||
5ghz {
|
||||
label = "bcm53xx:white:5ghz";
|
||||
gpios = <&chipcommon 14 GPIO_ACTIVE_LOW>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
};
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm47094-luxul-xwr-3100.dts
|
||||
+++ b/arch/arm/boot/dts/bcm47094-luxul-xwr-3100.dts
|
||||
@@ -34,37 +34,31 @@
|
||||
lan3 {
|
||||
label = "bcm53xx:green:lan3";
|
||||
gpios = <&chipcommon 1 GPIO_ACTIVE_LOW>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
|
||||
lan4 {
|
||||
label = "bcm53xx:green:lan4";
|
||||
gpios = <&chipcommon 2 GPIO_ACTIVE_LOW>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
|
||||
wan {
|
||||
label = "bcm53xx:green:wan";
|
||||
gpios = <&chipcommon 3 GPIO_ACTIVE_LOW>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
|
||||
lan1 {
|
||||
label = "bcm53xx:green:lan1";
|
||||
gpios = <&chipcommon 4 GPIO_ACTIVE_LOW>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
|
||||
lan2 {
|
||||
label = "bcm53xx:green:lan2";
|
||||
gpios = <&chipcommon 6 GPIO_ACTIVE_LOW>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
|
||||
usb3 {
|
||||
label = "bcm53xx:green:usb3";
|
||||
gpios = <&chipcommon 8 GPIO_ACTIVE_LOW>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
|
||||
status {
|
||||
@@ -76,13 +70,11 @@
|
||||
2ghz {
|
||||
label = "bcm53xx:green:2ghz";
|
||||
gpios = <&chipcommon 13 GPIO_ACTIVE_LOW>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
|
||||
5ghz {
|
||||
label = "bcm53xx:green:5ghz";
|
||||
gpios = <&chipcommon 14 GPIO_ACTIVE_LOW>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
};
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm47094-netgear-r8500.dts
|
||||
+++ b/arch/arm/boot/dts/bcm47094-netgear-r8500.dts
|
||||
@@ -34,37 +34,31 @@
|
||||
power1 {
|
||||
label = "bcm53xx:amber:power";
|
||||
gpios = <&chipcommon 3 GPIO_ACTIVE_LOW>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
|
||||
5ghz-1 {
|
||||
label = "bcm53xx:white:5ghz-1";
|
||||
gpios = <&chipcommon 11 GPIO_ACTIVE_LOW>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
|
||||
5ghz-2 {
|
||||
label = "bcm53xx:white:5ghz-2";
|
||||
gpios = <&chipcommon 12 GPIO_ACTIVE_LOW>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
|
||||
2ghz {
|
||||
label = "bcm53xx:white:2ghz";
|
||||
gpios = <&chipcommon 13 GPIO_ACTIVE_LOW>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
|
||||
usb2 {
|
||||
label = "bcm53xx:white:usb2";
|
||||
gpios = <&chipcommon 17 GPIO_ACTIVE_LOW>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
|
||||
usb3 {
|
||||
label = "bcm53xx:white:usb3";
|
||||
gpios = <&chipcommon 18 GPIO_ACTIVE_LOW>;
|
||||
- linux,default-trigger = "default-off";
|
||||
};
|
||||
};
|
||||
|
|
@ -1,40 +0,0 @@
|
|||
From f22c635e585471d01a38b829c0753c1467b5058e Mon Sep 17 00:00:00 2001
|
||||
From: Jon Mason <jonmason@broadcom.com>
|
||||
Date: Mon, 6 Mar 2017 11:24:44 -0500
|
||||
Subject: [PATCH] ARM: dts: BCM5301X: Add TWD WD Support to DT
|
||||
|
||||
Add support for the ARM TWD Watchdog to the bcm5301x device tree. The
|
||||
ARM TWD timer allocated the register space for the WDT, so this patch
|
||||
necessitated shrinking that. Also, the GIC masks were added for these.
|
||||
|
||||
Signed-off-by: Jon Mason <jonmason@broadcom.com>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/bcm5301x.dtsi | 15 ++++++++++++---
|
||||
1 file changed, 12 insertions(+), 3 deletions(-)
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm5301x.dtsi
|
||||
+++ b/arch/arm/boot/dts/bcm5301x.dtsi
|
||||
@@ -70,10 +70,19 @@
|
||||
clocks = <&periph_clk>;
|
||||
};
|
||||
|
||||
- local-timer@20600 {
|
||||
+ timer@20600 {
|
||||
compatible = "arm,cortex-a9-twd-timer";
|
||||
- reg = <0x20600 0x100>;
|
||||
- interrupts = <GIC_PPI 13 IRQ_TYPE_EDGE_RISING>;
|
||||
+ reg = <0x20600 0x20>;
|
||||
+ interrupts = <GIC_PPI 13 (GIC_CPU_MASK_SIMPLE(2) |
|
||||
+ IRQ_TYPE_EDGE_RISING)>;
|
||||
+ clocks = <&periph_clk>;
|
||||
+ };
|
||||
+
|
||||
+ watchdog@20620 {
|
||||
+ compatible = "arm,cortex-a9-twd-wdt";
|
||||
+ reg = <0x20620 0x20>;
|
||||
+ interrupts = <GIC_PPI 14 (GIC_CPU_MASK_SIMPLE(2) |
|
||||
+ IRQ_TYPE_EDGE_RISING)>;
|
||||
clocks = <&periph_clk>;
|
||||
};
|
||||
|
|
@ -1,34 +0,0 @@
|
|||
From bb097e3e00457bd69ad3a767f6b99424e2e06411 Mon Sep 17 00:00:00 2001
|
||||
From: Jon Mason <jonmason@broadcom.com>
|
||||
Date: Mon, 6 Mar 2017 11:24:45 -0500
|
||||
Subject: [PATCH] ARM: dts: BCM5301X: Add I2C support to the DT
|
||||
|
||||
Add I2C support to the bcm5301x Device Tree. Since no driver changes
|
||||
are needed to enable this hardware, only the device tree changes are
|
||||
required to make this functional.
|
||||
|
||||
Signed-off-by: Jon Mason <jonmason@broadcom.com>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/bcm5301x.dtsi | 10 ++++++++++
|
||||
1 file changed, 10 insertions(+)
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm5301x.dtsi
|
||||
+++ b/arch/arm/boot/dts/bcm5301x.dtsi
|
||||
@@ -338,6 +338,16 @@
|
||||
};
|
||||
};
|
||||
|
||||
+ i2c0: i2c@18009000 {
|
||||
+ compatible = "brcm,iproc-i2c";
|
||||
+ reg = <0x18009000 0x50>;
|
||||
+ interrupts = <GIC_SPI 121 IRQ_TYPE_NONE>;
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+ clock-frequency = <100000>;
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
lcpll0: lcpll0@1800c100 {
|
||||
#clock-cells = <1>;
|
||||
compatible = "brcm,nsp-lcpll0";
|
|
@ -1,130 +0,0 @@
|
|||
From d6661da842bbeec2082b7263c9e682792e7951a9 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Tue, 14 Mar 2017 11:39:41 +0100
|
||||
Subject: [PATCH] ARM: dts: BCM5301X: Add support for TP-LINK Archer C5 V2
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
This is BCM47081A0 based home router with BCM43217 and BCM4352 wireless
|
||||
chipsets.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/Makefile | 1 +
|
||||
arch/arm/boot/dts/bcm47081-tplink-archer-c5-v2.dts | 98 ++++++++++++++++++++++
|
||||
2 files changed, 99 insertions(+)
|
||||
create mode 100644 arch/arm/boot/dts/bcm47081-tplink-archer-c5-v2.dts
|
||||
|
||||
--- a/arch/arm/boot/dts/Makefile
|
||||
+++ b/arch/arm/boot/dts/Makefile
|
||||
@@ -76,6 +76,7 @@ dtb-$(CONFIG_ARCH_BCM_5301X) += \
|
||||
bcm47081-buffalo-wzr-900dhp.dtb \
|
||||
bcm47081-luxul-xap-1410.dtb \
|
||||
bcm47081-luxul-xwr-1200.dtb \
|
||||
+ bcm47081-tplink-archer-c5-v2.dtb \
|
||||
bcm4709-asus-rt-ac87u.dtb \
|
||||
bcm4709-buffalo-wxr-1900dhp.dtb \
|
||||
bcm4709-linksys-ea9200.dtb \
|
||||
--- /dev/null
|
||||
+++ b/arch/arm/boot/dts/bcm47081-tplink-archer-c5-v2.dts
|
||||
@@ -0,0 +1,98 @@
|
||||
+/*
|
||||
+ * Copyright (C) 2017 Rafał Miłecki <rafal@milecki.pl>
|
||||
+ *
|
||||
+ * Licensed under the ISC license.
|
||||
+ */
|
||||
+
|
||||
+/dts-v1/;
|
||||
+
|
||||
+#include "bcm47081.dtsi"
|
||||
+
|
||||
+/ {
|
||||
+ compatible = "tplink,archer-c5-v2", "brcm,bcm47081", "brcm,bcm4708";
|
||||
+ model = "TP-LINK Archer C5 V2";
|
||||
+
|
||||
+ chosen {
|
||||
+ bootargs = "earlycon";
|
||||
+ };
|
||||
+
|
||||
+ memory {
|
||||
+ reg = <0x00000000 0x08000000>;
|
||||
+ };
|
||||
+
|
||||
+ leds {
|
||||
+ compatible = "gpio-leds";
|
||||
+
|
||||
+ 2ghz {
|
||||
+ label = "bcm53xx:green:2ghz";
|
||||
+ gpios = <&chipcommon 0 GPIO_ACTIVE_HIGH>;
|
||||
+ };
|
||||
+
|
||||
+ lan {
|
||||
+ label = "bcm53xx:green:lan";
|
||||
+ gpios = <&chipcommon 1 GPIO_ACTIVE_HIGH>;
|
||||
+ };
|
||||
+
|
||||
+ usb2-port1 {
|
||||
+ label = "bcm53xx:green:usb2-port1";
|
||||
+ gpios = <&chipcommon 2 GPIO_ACTIVE_HIGH>;
|
||||
+ };
|
||||
+
|
||||
+ power {
|
||||
+ label = "bcm53xx:green:power";
|
||||
+ gpios = <&chipcommon 4 GPIO_ACTIVE_HIGH>;
|
||||
+ linux,default-trigger = "default-on";
|
||||
+ };
|
||||
+
|
||||
+ wan-green {
|
||||
+ label = "bcm53xx:green:wan";
|
||||
+ gpios = <&chipcommon 5 GPIO_ACTIVE_HIGH>;
|
||||
+ };
|
||||
+
|
||||
+ wps {
|
||||
+ label = "bcm53xx:green:wps";
|
||||
+ gpios = <&chipcommon 6 GPIO_ACTIVE_HIGH>;
|
||||
+ };
|
||||
+
|
||||
+ wan-amber {
|
||||
+ label = "bcm53xx:amber:wan";
|
||||
+ gpios = <&chipcommon 8 GPIO_ACTIVE_HIGH>;
|
||||
+ };
|
||||
+
|
||||
+ 5ghz {
|
||||
+ label = "bcm53xx:green:5ghz";
|
||||
+ gpios = <&chipcommon 12 GPIO_ACTIVE_HIGH>;
|
||||
+ };
|
||||
+
|
||||
+ usb2-port2 {
|
||||
+ label = "bcm53xx:green:usb2-port2";
|
||||
+ gpios = <&chipcommon 13 GPIO_ACTIVE_HIGH>;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ gpio-keys {
|
||||
+ compatible = "gpio-keys";
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+
|
||||
+ rfkill {
|
||||
+ label = "WiFi";
|
||||
+ linux,code = <KEY_RFKILL>;
|
||||
+ gpios = <&chipcommon 3 GPIO_ACTIVE_LOW>;
|
||||
+ };
|
||||
+
|
||||
+ restart {
|
||||
+ label = "Reset";
|
||||
+ linux,code = <KEY_RESTART>;
|
||||
+ gpios = <&chipcommon 7 GPIO_ACTIVE_LOW>;
|
||||
+ };
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&spi_nor {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&usb2 {
|
||||
+ vcc-gpio = <&chipcommon 9 GPIO_ACTIVE_HIGH>;
|
||||
+};
|
|
@ -1,27 +0,0 @@
|
|||
From a7996761d1dacbac10c892c16faa90dfe46affcd Mon Sep 17 00:00:00 2001
|
||||
From: Steve Lin <steven.lin1@broadcom.com>
|
||||
Date: Wed, 15 Mar 2017 16:59:35 -0400
|
||||
Subject: [PATCH] ARM: dts: BCM953012HR: Add ethernet aliases
|
||||
|
||||
Adding ethernet aliases. These are used, for example, by bootloaders,
|
||||
to modify the MAC addresses in the device tree.
|
||||
|
||||
Signed-off-by: Steve Lin <steven.lin1@broadcom.com>
|
||||
Acked-by: Jon Mason <jon.mason@broadcom.com>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/bcm953012hr.dts | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm953012hr.dts
|
||||
+++ b/arch/arm/boot/dts/bcm953012hr.dts
|
||||
@@ -41,6 +41,9 @@
|
||||
|
||||
aliases {
|
||||
serial0 = &uart0;
|
||||
+ ethernet0 = &gmac0;
|
||||
+ ethernet1 = &gmac1;
|
||||
+ ethernet2 = &gmac2;
|
||||
};
|
||||
|
||||
chosen {
|
|
@ -1,161 +0,0 @@
|
|||
From 5be82d0475941dc96eeeee3c754baf48365f7bf5 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Wed, 15 Mar 2017 18:03:27 +0100
|
||||
Subject: [PATCH] ARM: dts: BCM5301X: Specify serial console params in dtsi
|
||||
files
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
So far every Northstar device we have seen was using the same serial
|
||||
console params (115200n8). It probably make the most sense to put it in
|
||||
some proper dtsi files instead of repeating over and over for every
|
||||
single device. As different boards may use different bootloaders it
|
||||
seems the safest idea is to use board specific dtsi files.
|
||||
|
||||
Just in case some vendor decides to use different UART (parameters) this
|
||||
can be always easily overwritten.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/bcm4708.dtsi | 8 ++++++++
|
||||
arch/arm/boot/dts/bcm47081.dtsi | 8 ++++++++
|
||||
arch/arm/boot/dts/bcm5301x.dtsi | 4 ----
|
||||
arch/arm/boot/dts/bcm94708.dts | 8 --------
|
||||
arch/arm/boot/dts/bcm94709.dts | 8 --------
|
||||
arch/arm/boot/dts/bcm953012er.dts | 8 --------
|
||||
arch/arm/boot/dts/bcm953012hr.dts | 5 -----
|
||||
arch/arm/boot/dts/bcm953012k.dts | 4 ----
|
||||
8 files changed, 16 insertions(+), 37 deletions(-)
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm4708.dtsi
|
||||
+++ b/arch/arm/boot/dts/bcm4708.dtsi
|
||||
@@ -12,6 +12,14 @@
|
||||
/ {
|
||||
compatible = "brcm,bcm4708";
|
||||
|
||||
+ aliases {
|
||||
+ serial0 = &uart0;
|
||||
+ };
|
||||
+
|
||||
+ chosen {
|
||||
+ stdout-path = "serial0:115200n8";
|
||||
+ };
|
||||
+
|
||||
cpus {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
--- a/arch/arm/boot/dts/bcm47081.dtsi
|
||||
+++ b/arch/arm/boot/dts/bcm47081.dtsi
|
||||
@@ -22,6 +22,14 @@
|
||||
/ {
|
||||
compatible = "brcm,bcm47081";
|
||||
|
||||
+ aliases {
|
||||
+ serial0 = &uart0;
|
||||
+ };
|
||||
+
|
||||
+ chosen {
|
||||
+ stdout-path = "serial0:115200n8";
|
||||
+ };
|
||||
+
|
||||
cpus {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
--- a/arch/arm/boot/dts/bcm5301x.dtsi
|
||||
+++ b/arch/arm/boot/dts/bcm5301x.dtsi
|
||||
@@ -18,10 +18,6 @@
|
||||
/ {
|
||||
interrupt-parent = <&gic>;
|
||||
|
||||
- chosen {
|
||||
- stdout-path = &uart0;
|
||||
- };
|
||||
-
|
||||
chipcommonA {
|
||||
compatible = "simple-bus";
|
||||
ranges = <0x00000000 0x18000000 0x00001000>;
|
||||
--- a/arch/arm/boot/dts/bcm94708.dts
|
||||
+++ b/arch/arm/boot/dts/bcm94708.dts
|
||||
@@ -38,14 +38,6 @@
|
||||
model = "NorthStar SVK (BCM94708)";
|
||||
compatible = "brcm,bcm94708", "brcm,bcm4708";
|
||||
|
||||
- aliases {
|
||||
- serial0 = &uart0;
|
||||
- };
|
||||
-
|
||||
- chosen {
|
||||
- stdout-path = "serial0:115200n8";
|
||||
- };
|
||||
-
|
||||
memory {
|
||||
reg = <0x00000000 0x08000000>;
|
||||
};
|
||||
--- a/arch/arm/boot/dts/bcm94709.dts
|
||||
+++ b/arch/arm/boot/dts/bcm94709.dts
|
||||
@@ -38,14 +38,6 @@
|
||||
model = "NorthStar SVK (BCM94709)";
|
||||
compatible = "brcm,bcm94709", "brcm,bcm4709", "brcm,bcm4708";
|
||||
|
||||
- aliases {
|
||||
- serial0 = &uart0;
|
||||
- };
|
||||
-
|
||||
- chosen {
|
||||
- stdout-path = "serial0:115200n8";
|
||||
- };
|
||||
-
|
||||
memory {
|
||||
reg = <0x00000000 0x08000000>;
|
||||
};
|
||||
--- a/arch/arm/boot/dts/bcm953012er.dts
|
||||
+++ b/arch/arm/boot/dts/bcm953012er.dts
|
||||
@@ -39,14 +39,6 @@
|
||||
model = "NorthStar Enterprise Router (BCM953012ER)";
|
||||
compatible = "brcm,bcm953012er", "brcm,brcm53012", "brcm,bcm4708";
|
||||
|
||||
- aliases {
|
||||
- serial0 = &uart0;
|
||||
- };
|
||||
-
|
||||
- chosen {
|
||||
- stdout-path = "serial0:115200n8";
|
||||
- };
|
||||
-
|
||||
memory {
|
||||
reg = <0x00000000 0x8000000>;
|
||||
};
|
||||
--- a/arch/arm/boot/dts/bcm953012hr.dts
|
||||
+++ b/arch/arm/boot/dts/bcm953012hr.dts
|
||||
@@ -40,16 +40,11 @@
|
||||
compatible = "brcm,bcm953012hr", "brcm,brcm53012", "brcm,bcm4708";
|
||||
|
||||
aliases {
|
||||
- serial0 = &uart0;
|
||||
ethernet0 = &gmac0;
|
||||
ethernet1 = &gmac1;
|
||||
ethernet2 = &gmac2;
|
||||
};
|
||||
|
||||
- chosen {
|
||||
- stdout-path = "serial0:115200n8";
|
||||
- };
|
||||
-
|
||||
memory@80000000 {
|
||||
reg = <0x80000000 0x10000000>;
|
||||
};
|
||||
--- a/arch/arm/boot/dts/bcm953012k.dts
|
||||
+++ b/arch/arm/boot/dts/bcm953012k.dts
|
||||
@@ -43,10 +43,6 @@
|
||||
serial1 = &uart1;
|
||||
};
|
||||
|
||||
- chosen {
|
||||
- stdout-path = "serial0:115200n8";
|
||||
- };
|
||||
-
|
||||
memory {
|
||||
reg = <0x00000000 0x10000000>;
|
||||
};
|
|
@ -1,33 +0,0 @@
|
|||
From 3a599e0dbc03ffc51568cf3376633d127451632d Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Wed, 15 Mar 2017 18:03:28 +0100
|
||||
Subject: [PATCH] ARM: dts: BCM53573: Specify serial console parameters
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
This adds baud rate, parity & number of data bits. It's required to get
|
||||
serial working correctly.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/bcm53573.dtsi | 6 +++++-
|
||||
1 file changed, 5 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm53573.dtsi
|
||||
+++ b/arch/arm/boot/dts/bcm53573.dtsi
|
||||
@@ -13,8 +13,12 @@
|
||||
/ {
|
||||
interrupt-parent = <&gic>;
|
||||
|
||||
+ aliases {
|
||||
+ serial0 = &uart0;
|
||||
+ };
|
||||
+
|
||||
chosen {
|
||||
- stdout-path = &uart0;
|
||||
+ stdout-path = "serial0:115200n8";
|
||||
};
|
||||
|
||||
cpus {
|
|
@ -1,59 +0,0 @@
|
|||
From e55d2c7272ff647efac4aecd895b20ee66e43519 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Fri, 14 Apr 2017 23:42:28 +0200
|
||||
Subject: [PATCH] ARM: dts: BCM5301X: Add CPU thermal sensor and zone
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
This uses CPU thermal sensor available on every Northstar chipset to
|
||||
monitor temperature. We don't have any cooling or throttling so only a
|
||||
critical trip was added.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Acked-by: Jon Mason <jon.mason@broadcom.com>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/bcm5301x.dtsi | 26 ++++++++++++++++++++++++++
|
||||
1 file changed, 26 insertions(+)
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm5301x.dtsi
|
||||
+++ b/arch/arm/boot/dts/bcm5301x.dtsi
|
||||
@@ -363,6 +363,12 @@
|
||||
"sata2";
|
||||
};
|
||||
|
||||
+ thermal: thermal@1800c2c0 {
|
||||
+ compatible = "brcm,ns-thermal";
|
||||
+ reg = <0x1800c2c0 0x10>;
|
||||
+ #thermal-sensor-cells = <0>;
|
||||
+ };
|
||||
+
|
||||
srab: srab@18007000 {
|
||||
compatible = "brcm,bcm5301x-srab";
|
||||
reg = <0x18007000 0x1000>;
|
||||
@@ -390,4 +396,24 @@
|
||||
|
||||
brcm,nand-has-wp;
|
||||
};
|
||||
+
|
||||
+ thermal-zones {
|
||||
+ cpu_thermal: cpu-thermal {
|
||||
+ polling-delay-passive = <0>;
|
||||
+ polling-delay = <1000>;
|
||||
+ coefficients = <(-556) 418000>;
|
||||
+ thermal-sensors = <&thermal>;
|
||||
+
|
||||
+ trips {
|
||||
+ cpu-crit {
|
||||
+ temperature = <125000>;
|
||||
+ hysteresis = <0>;
|
||||
+ type = "critical";
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ cooling-maps {
|
||||
+ };
|
||||
+ };
|
||||
+ };
|
||||
};
|
|
@ -1,34 +0,0 @@
|
|||
From c4b88e77c28fad5151a1a4eac516b947e2d51be5 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Wed, 19 Apr 2017 23:54:25 +0200
|
||||
Subject: [PATCH] ARM: dts: BCM5301X: Specify MDIO bus in the DT
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Northstar devices have MDIO bus that may contain various PHYs attached.
|
||||
A common example is USB 3.0 PHY (that doesn't have an MDIO driver yet).
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/bcm5301x.dtsi | 8 ++++++++
|
||||
1 file changed, 8 insertions(+)
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm5301x.dtsi
|
||||
+++ b/arch/arm/boot/dts/bcm5301x.dtsi
|
||||
@@ -334,6 +334,14 @@
|
||||
};
|
||||
};
|
||||
|
||||
+ mdio: mdio@18003000 {
|
||||
+ compatible = "brcm,iproc-mdio";
|
||||
+ reg = <0x18003000 0x8>;
|
||||
+ #size-cells = <1>;
|
||||
+ #address-cells = <0>;
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
i2c0: i2c@18009000 {
|
||||
compatible = "brcm,iproc-i2c";
|
||||
reg = <0x18009000 0x50>;
|
|
@ -1,74 +0,0 @@
|
|||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Tue, 27 Jun 2017 19:35:27 +0200
|
||||
Subject: [PATCH] ARM: dts: BCM5301X: Specify USB ports for each controller
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Northstar has 3 controllers: OHCI and EHCI (each with 2 ports) and XHCI
|
||||
(with just 1 port). Describe them in the DT. In future this will allow
|
||||
to reference them as trigger sources.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/bcm5301x.dtsi | 34 ++++++++++++++++++++++++++++++++++
|
||||
1 file changed, 34 insertions(+)
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm5301x.dtsi
|
||||
+++ b/arch/arm/boot/dts/bcm5301x.dtsi
|
||||
@@ -272,6 +272,19 @@
|
||||
reg = <0x00021000 0x1000>;
|
||||
interrupts = <GIC_SPI 79 IRQ_TYPE_LEVEL_HIGH>;
|
||||
phys = <&usb2_phy>;
|
||||
+
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+
|
||||
+ ehci_port1: port@1 {
|
||||
+ reg = <1>;
|
||||
+ #trigger-source-cells = <0>;
|
||||
+ };
|
||||
+
|
||||
+ ehci_port2: port@2 {
|
||||
+ reg = <2>;
|
||||
+ #trigger-source-cells = <0>;
|
||||
+ };
|
||||
};
|
||||
|
||||
ohci: ohci@22000 {
|
||||
@@ -280,6 +293,19 @@
|
||||
compatible = "generic-ohci";
|
||||
reg = <0x00022000 0x1000>;
|
||||
interrupts = <GIC_SPI 79 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+
|
||||
+ ohci_port1: port@1 {
|
||||
+ reg = <1>;
|
||||
+ #trigger-source-cells = <0>;
|
||||
+ };
|
||||
+
|
||||
+ ohci_port2: port@2 {
|
||||
+ reg = <2>;
|
||||
+ #trigger-source-cells = <0>;
|
||||
+ };
|
||||
};
|
||||
};
|
||||
|
||||
@@ -300,6 +326,14 @@
|
||||
interrupts = <GIC_SPI 80 IRQ_TYPE_LEVEL_HIGH>;
|
||||
phys = <&usb3_phy>;
|
||||
phy-names = "usb";
|
||||
+
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+
|
||||
+ xhci_port1: port@1 {
|
||||
+ reg = <1>;
|
||||
+ #trigger-source-cells = <0>;
|
||||
+ };
|
||||
};
|
||||
};
|
||||
|
|
@ -1,139 +0,0 @@
|
|||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Wed, 2 Aug 2017 06:40:41 +0200
|
||||
Subject: [PATCH] ARM: dts: BCM5301X: Specify USB ports for USB LEDs of few
|
||||
devices
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
This uses trigger-sources documented in commit 80dc6e1cd85fc ("dt-bindings:
|
||||
leds: document new trigger-sources property") to specify USB ports. Such an
|
||||
information can be used by operating system to setup LEDs behavior.
|
||||
|
||||
I updated dts files for 7 devices I own and I was able to test.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/bcm4708-buffalo-wzr-1750dhp.dts | 4 ++++
|
||||
arch/arm/boot/dts/bcm4708-netgear-r6250.dts | 3 +++
|
||||
arch/arm/boot/dts/bcm4708-smartrg-sr400ac.dts | 6 ++++++
|
||||
arch/arm/boot/dts/bcm47081-tplink-archer-c5-v2.dts | 4 ++++
|
||||
arch/arm/boot/dts/bcm4709-tplink-archer-c9-v1.dts | 5 +++++
|
||||
arch/arm/boot/dts/bcm47094-dlink-dir-885l.dts | 3 +++
|
||||
arch/arm/boot/dts/bcm47094-luxul-xwr-3100.dts | 3 +++
|
||||
7 files changed, 28 insertions(+)
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm4708-buffalo-wzr-1750dhp.dts
|
||||
+++ b/arch/arm/boot/dts/bcm4708-buffalo-wzr-1750dhp.dts
|
||||
@@ -52,6 +52,10 @@
|
||||
usb {
|
||||
label = "bcm53xx:blue:usb";
|
||||
gpios = <&hc595 0 GPIO_ACTIVE_HIGH>;
|
||||
+ trigger-sources = <&ohci_port1>, <&ehci_port1>,
|
||||
+ <&xhci_port1>, <&ohci_port2>,
|
||||
+ <&ehci_port2>;
|
||||
+ linux,default-trigger = "usbport";
|
||||
};
|
||||
|
||||
power0 {
|
||||
--- a/arch/arm/boot/dts/bcm4708-netgear-r6250.dts
|
||||
+++ b/arch/arm/boot/dts/bcm4708-netgear-r6250.dts
|
||||
@@ -48,6 +48,9 @@
|
||||
usb {
|
||||
label = "bcm53xx:blue:usb";
|
||||
gpios = <&chipcommon 8 GPIO_ACTIVE_LOW>;
|
||||
+ trigger-sources = <&ohci_port1>, <&ehci_port1>,
|
||||
+ <&xhci_port1>;
|
||||
+ linux,default-trigger = "usbport";
|
||||
};
|
||||
|
||||
wireless {
|
||||
--- a/arch/arm/boot/dts/bcm4708-smartrg-sr400ac.dts
|
||||
+++ b/arch/arm/boot/dts/bcm4708-smartrg-sr400ac.dts
|
||||
@@ -42,16 +42,22 @@
|
||||
usb2 {
|
||||
label = "bcm53xx:white:usb2";
|
||||
gpios = <&chipcommon 3 GPIO_ACTIVE_HIGH>;
|
||||
+ trigger-sources = <&ohci_port2>, <&ehci_port2>;
|
||||
+ linux,default-trigger = "usbport";
|
||||
};
|
||||
|
||||
usb3-white {
|
||||
label = "bcm53xx:white:usb3";
|
||||
gpios = <&chipcommon 4 GPIO_ACTIVE_HIGH>;
|
||||
+ trigger-sources = <&xhci_port1>;
|
||||
+ linux,default-trigger = "usbport";
|
||||
};
|
||||
|
||||
usb3-green {
|
||||
label = "bcm53xx:green:usb3";
|
||||
gpios = <&chipcommon 5 GPIO_ACTIVE_HIGH>;
|
||||
+ trigger-sources = <&ohci_port1>, <&ehci_port1>;
|
||||
+ linux,default-trigger = "usbport";
|
||||
};
|
||||
|
||||
wps {
|
||||
--- a/arch/arm/boot/dts/bcm47081-tplink-archer-c5-v2.dts
|
||||
+++ b/arch/arm/boot/dts/bcm47081-tplink-archer-c5-v2.dts
|
||||
@@ -36,6 +36,8 @@
|
||||
usb2-port1 {
|
||||
label = "bcm53xx:green:usb2-port1";
|
||||
gpios = <&chipcommon 2 GPIO_ACTIVE_HIGH>;
|
||||
+ trigger-sources = <&ohci_port1>, <&ehci_port1>;
|
||||
+ linux,default-trigger = "usbport";
|
||||
};
|
||||
|
||||
power {
|
||||
@@ -67,6 +69,8 @@
|
||||
usb2-port2 {
|
||||
label = "bcm53xx:green:usb2-port2";
|
||||
gpios = <&chipcommon 13 GPIO_ACTIVE_HIGH>;
|
||||
+ trigger-sources = <&ohci_port2>, <&ehci_port2>;
|
||||
+ linux,default-trigger = "usbport";
|
||||
};
|
||||
};
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm4709-tplink-archer-c9-v1.dts
|
||||
+++ b/arch/arm/boot/dts/bcm4709-tplink-archer-c9-v1.dts
|
||||
@@ -46,11 +46,16 @@
|
||||
usb3 {
|
||||
label = "bcm53xx:blue:usb3";
|
||||
gpios = <&chipcommon 6 GPIO_ACTIVE_HIGH>;
|
||||
+ trigger-sources = <&ohci_port1>, <&ehci_port1>,
|
||||
+ <&xhci_port1>;
|
||||
+ linux,default-trigger = "usbport";
|
||||
};
|
||||
|
||||
usb2 {
|
||||
label = "bcm53xx:blue:usb2";
|
||||
gpios = <&chipcommon 7 GPIO_ACTIVE_HIGH>;
|
||||
+ trigger-sources = <&ohci_port2>, <&ehci_port2>;
|
||||
+ linux,default-trigger = "usbport";
|
||||
};
|
||||
|
||||
wan-blue {
|
||||
--- a/arch/arm/boot/dts/bcm47094-dlink-dir-885l.dts
|
||||
+++ b/arch/arm/boot/dts/bcm47094-dlink-dir-885l.dts
|
||||
@@ -71,6 +71,9 @@
|
||||
usb3-white {
|
||||
label = "bcm53xx:white:usb3";
|
||||
gpios = <&chipcommon 8 GPIO_ACTIVE_LOW>;
|
||||
+ trigger-sources = <&ohci_port1>, <&ehci_port1>,
|
||||
+ <&xhci_port1>;
|
||||
+ linux,default-trigger = "usbport";
|
||||
};
|
||||
|
||||
2ghz {
|
||||
--- a/arch/arm/boot/dts/bcm47094-luxul-xwr-3100.dts
|
||||
+++ b/arch/arm/boot/dts/bcm47094-luxul-xwr-3100.dts
|
||||
@@ -59,6 +59,9 @@
|
||||
usb3 {
|
||||
label = "bcm53xx:green:usb3";
|
||||
gpios = <&chipcommon 8 GPIO_ACTIVE_LOW>;
|
||||
+ trigger-sources = <&ohci_port1>, <&ehci_port1>,
|
||||
+ <&xhci_port1>;
|
||||
+ linux,default-trigger = "usbport";
|
||||
};
|
||||
|
||||
status {
|
|
@ -1,135 +0,0 @@
|
|||
From 092ccf0415c720a1e9458a46fe75f77574027a55 Mon Sep 17 00:00:00 2001
|
||||
From: Florian Fainelli <f.fainelli@gmail.com>
|
||||
Date: Tue, 18 Jul 2017 12:37:37 -0700
|
||||
Subject: [PATCH] ARM: dts: BCM53573: Add Broadcom BCM947189ACDBMR board
|
||||
support
|
||||
|
||||
Adds support for the Broadcom reference board BCM947189ACDMBR which
|
||||
features the following:
|
||||
|
||||
* 128MB of DRAM
|
||||
* External MoCA support through a Broadcom BCM6802 chip
|
||||
* 1x external Gigabit PHY through the external BCM6802
|
||||
* 1x USB 2.0 port
|
||||
* 1x PCIE slot
|
||||
* Few configurable buttons and LEDs
|
||||
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/Makefile | 3 +-
|
||||
arch/arm/boot/dts/bcm947189acdbmr.dts | 97 +++++++++++++++++++++++++++++++++++
|
||||
2 files changed, 99 insertions(+), 1 deletion(-)
|
||||
create mode 100644 arch/arm/boot/dts/bcm947189acdbmr.dts
|
||||
|
||||
--- a/arch/arm/boot/dts/Makefile
|
||||
+++ b/arch/arm/boot/dts/Makefile
|
||||
@@ -93,7 +93,8 @@ dtb-$(CONFIG_ARCH_BCM_5301X) += \
|
||||
bcm953012hr.dtb \
|
||||
bcm953012k.dtb
|
||||
dtb-$(CONFIG_ARCH_BCM_53573) += \
|
||||
- bcm47189-tenda-ac9.dtb
|
||||
+ bcm47189-tenda-ac9.dtb \
|
||||
+ bcm947189acdbmr.dtb
|
||||
dtb-$(CONFIG_ARCH_BCM_63XX) += \
|
||||
bcm963138dvt.dtb
|
||||
dtb-$(CONFIG_ARCH_BCM_CYGNUS) += \
|
||||
--- /dev/null
|
||||
+++ b/arch/arm/boot/dts/bcm947189acdbmr.dts
|
||||
@@ -0,0 +1,97 @@
|
||||
+/*
|
||||
+ * Copyright (C) 2017 Broadcom
|
||||
+ * Author: Florian Fainelli <f.fainelli@gmail.com>
|
||||
+ *
|
||||
+ * Licensed under the ISC license.
|
||||
+ */
|
||||
+
|
||||
+/dts-v1/;
|
||||
+
|
||||
+#include "bcm53573.dtsi"
|
||||
+
|
||||
+/ {
|
||||
+ compatible = "brcm,bcm947189acdbmr", "brcm,bcm47189", "brcm,bcm53573";
|
||||
+ model = "Broadcom BCM947189ACDBMR";
|
||||
+
|
||||
+ chosen {
|
||||
+ bootargs = "console=ttyS0,115200 earlycon";
|
||||
+ };
|
||||
+
|
||||
+ memory {
|
||||
+ reg = <0x00000000 0x08000000>;
|
||||
+ };
|
||||
+
|
||||
+ leds {
|
||||
+ compatible = "gpio-leds";
|
||||
+
|
||||
+ wps {
|
||||
+ label = "bcm53xx:blue:wps";
|
||||
+ gpios = <&chipcommon 10 GPIO_ACTIVE_HIGH>;
|
||||
+ };
|
||||
+
|
||||
+ 5ghz {
|
||||
+ label = "bcm53xx:blue:5ghz";
|
||||
+ gpios = <&chipcommon 11 GPIO_ACTIVE_HIGH>;
|
||||
+ };
|
||||
+
|
||||
+ 2ghz {
|
||||
+ label = "bcm53xx:blue:2ghz";
|
||||
+ gpios = <&chipcommon 12 GPIO_ACTIVE_HIGH>;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ gpio-keys {
|
||||
+ compatible = "gpio-keys";
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+
|
||||
+ restart {
|
||||
+ label = "Reset";
|
||||
+ linux,code = <KEY_RESTART>;
|
||||
+ gpios = <&chipcommon 7 GPIO_ACTIVE_HIGH>;
|
||||
+ };
|
||||
+
|
||||
+ wps {
|
||||
+ label = "WPS";
|
||||
+ linux,code = <KEY_WPS_BUTTON>;
|
||||
+ gpios = <&chipcommon 9 GPIO_ACTIVE_LOW>;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ spi {
|
||||
+ compatible = "spi-gpio";
|
||||
+ num-chipselects = <1>;
|
||||
+ gpio-sck = <&chipcommon 21 0>;
|
||||
+ gpio-miso = <&chipcommon 22 0>;
|
||||
+ gpio-mosi = <&chipcommon 23 0>;
|
||||
+ cs-gpios = <&chipcommon 24 0>;
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+
|
||||
+ /* External BCM6802 MoCA chip is connected */
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&pcie0 {
|
||||
+ ranges = <0x00000000 0 0 0 0 0x00100000>;
|
||||
+ #address-cells = <3>;
|
||||
+ #size-cells = <2>;
|
||||
+
|
||||
+ bridge@0,0,0 {
|
||||
+ reg = <0x0000 0 0 0 0>;
|
||||
+ ranges = <0x00000000 0 0 0 0 0 0 0x00100000>;
|
||||
+ #address-cells = <3>;
|
||||
+ #size-cells = <2>;
|
||||
+
|
||||
+ wifi@0,1,0 {
|
||||
+ reg = <0x0000 0 0 0 0>;
|
||||
+ ranges = <0x00000000 0 0 0 0x00100000>;
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <1>;
|
||||
+ };
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&usb2 {
|
||||
+ vcc-gpio = <&chipcommon 8 GPIO_ACTIVE_HIGH>;
|
||||
+};
|
|
@ -1,58 +0,0 @@
|
|||
From 0173b2cd6948b5b96ac4e8dbc3bcb4dd0b45c296 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Thu, 17 Aug 2017 11:05:14 +0200
|
||||
Subject: [PATCH] ARM: BCM53573: Specify ports for USB LED for Tenda AC9
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
This uses trigger-sources documented in commit 80dc6e1cd85fc ("dt-bindings:
|
||||
leds: document new trigger-sources property") to specify USB ports. Such an
|
||||
information can be used by operating system to setup LEDs behavior.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/bcm47189-tenda-ac9.dts | 2 ++
|
||||
arch/arm/boot/dts/bcm53573.dtsi | 4 ++++
|
||||
2 files changed, 6 insertions(+)
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm47189-tenda-ac9.dts
|
||||
+++ b/arch/arm/boot/dts/bcm47189-tenda-ac9.dts
|
||||
@@ -26,6 +26,8 @@
|
||||
usb {
|
||||
label = "bcm53xx:blue:usb";
|
||||
gpios = <&chipcommon 1 GPIO_ACTIVE_HIGH>;
|
||||
+ trigger-sources = <&ohci_port1>, <&ehci_port1>;
|
||||
+ linux,default-trigger = "usbport";
|
||||
};
|
||||
|
||||
wps {
|
||||
--- a/arch/arm/boot/dts/bcm53573.dtsi
|
||||
+++ b/arch/arm/boot/dts/bcm53573.dtsi
|
||||
@@ -138,10 +138,12 @@
|
||||
|
||||
ehci_port1: port@1 {
|
||||
reg = <1>;
|
||||
+ #trigger-source-cells = <0>;
|
||||
};
|
||||
|
||||
ehci_port2: port@2 {
|
||||
reg = <2>;
|
||||
+ #trigger-source-cells = <0>;
|
||||
};
|
||||
};
|
||||
|
||||
@@ -158,10 +160,12 @@
|
||||
|
||||
ohci_port1: port@1 {
|
||||
reg = <1>;
|
||||
+ #trigger-source-cells = <0>;
|
||||
};
|
||||
|
||||
ohci_port2: port@2 {
|
||||
reg = <2>;
|
||||
+ #trigger-source-cells = <0>;
|
||||
};
|
||||
};
|
||||
};
|
|
@ -1,30 +0,0 @@
|
|||
From 2460266f21f140936e627f28f28d1a4f30887ae9 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Fri, 6 Oct 2017 10:52:35 +0200
|
||||
Subject: [PATCH] ARM: dts: BCM5301X: Specify USB ports for USB LED of Luxul
|
||||
XWR-1200
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
This info can be used by operating system to setup LED behavior.
|
||||
|
||||
Reported-by: Dan Haab <dhaab@luxul.com>
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/bcm47081-luxul-xwr-1200.dts | 3 ++-
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm47081-luxul-xwr-1200.dts
|
||||
+++ b/arch/arm/boot/dts/bcm47081-luxul-xwr-1200.dts
|
||||
@@ -57,7 +57,8 @@
|
||||
usb {
|
||||
label = "bcm53xx:green:usb";
|
||||
gpios = <&chipcommon 8 GPIO_ACTIVE_LOW>;
|
||||
- linux,default-trigger = "none";
|
||||
+ trigger-sources = <&ohci_port2>, <&ehci_port2>;
|
||||
+ linux,default-trigger = "usbport";
|
||||
};
|
||||
|
||||
status {
|
|
@ -1,96 +0,0 @@
|
|||
From 1f4b0d5596d2e3ea8e953d578ab8444ce860d35d Mon Sep 17 00:00:00 2001
|
||||
From: Dan Haab <dhaab@luxul.com>
|
||||
Date: Mon, 9 Oct 2017 09:46:22 -0600
|
||||
Subject: [PATCH] ARM: dts: BCM5301X: Add DT for Luxul XBR-4500
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
This is BCM47094 (AKA BCM4709C0) based router with ports-on-the-front
|
||||
board design.
|
||||
|
||||
Signed-off-by: Dan Haab <dhaab@luxul.com>
|
||||
Acked-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/Makefile | 1 +
|
||||
arch/arm/boot/dts/bcm47094-luxul-xbr-4500.dts | 63 +++++++++++++++++++++++++++
|
||||
2 files changed, 64 insertions(+)
|
||||
create mode 100644 arch/arm/boot/dts/bcm47094-luxul-xbr-4500.dts
|
||||
|
||||
--- a/arch/arm/boot/dts/Makefile
|
||||
+++ b/arch/arm/boot/dts/Makefile
|
||||
@@ -85,6 +85,7 @@ dtb-$(CONFIG_ARCH_BCM_5301X) += \
|
||||
bcm4709-tplink-archer-c9-v1.dtb \
|
||||
bcm47094-dlink-dir-885l.dtb \
|
||||
bcm47094-linksys-panamera.dtb \
|
||||
+ bcm47094-luxul-xbr-4500.dtb \
|
||||
bcm47094-luxul-xwr-3100.dtb \
|
||||
bcm47094-netgear-r8500.dtb \
|
||||
bcm94708.dtb \
|
||||
--- /dev/null
|
||||
+++ b/arch/arm/boot/dts/bcm47094-luxul-xbr-4500.dts
|
||||
@@ -0,0 +1,63 @@
|
||||
+/*
|
||||
+ * Copyright (C) 2017 Luxul Inc.
|
||||
+ *
|
||||
+ * Licensed under the ISC license.
|
||||
+ */
|
||||
+
|
||||
+/dts-v1/;
|
||||
+
|
||||
+#include "bcm4708.dtsi"
|
||||
+#include "bcm5301x-nand-cs0-bch8.dtsi"
|
||||
+
|
||||
+/ {
|
||||
+ compatible = "luxul,xbr-4500-v1", "brcm,bcm47094", "brcm,bcm4708";
|
||||
+ model = "Luxul XBR-4500 V1";
|
||||
+
|
||||
+ chosen {
|
||||
+ bootargs = "earlycon";
|
||||
+ };
|
||||
+
|
||||
+ memory {
|
||||
+ reg = <0x00000000 0x08000000
|
||||
+ 0x88000000 0x18000000>;
|
||||
+ };
|
||||
+
|
||||
+ leds {
|
||||
+ compatible = "gpio-leds";
|
||||
+
|
||||
+ status {
|
||||
+ label = "bcm53xx:green:status";
|
||||
+ gpios = <&chipcommon 20 GPIO_ACTIVE_HIGH>;
|
||||
+ linux,default-trigger = "timer";
|
||||
+ };
|
||||
+
|
||||
+ usb3 {
|
||||
+ label = "bcm53xx:green:usb3";
|
||||
+ gpios = <&chipcommon 19 GPIO_ACTIVE_HIGH>;
|
||||
+ trigger-sources = <&ohci_port1>, <&ehci_port1>,
|
||||
+ <&xhci_port1>;
|
||||
+ linux,default-trigger = "usbport";
|
||||
+ };
|
||||
+
|
||||
+ };
|
||||
+
|
||||
+ gpio-keys {
|
||||
+ compatible = "gpio-keys";
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+
|
||||
+ restart {
|
||||
+ label = "Reset";
|
||||
+ linux,code = <KEY_RESTART>;
|
||||
+ gpios = <&chipcommon 17 GPIO_ACTIVE_LOW>;
|
||||
+ };
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&usb3 {
|
||||
+ vcc-gpio = <&chipcommon 18 GPIO_ACTIVE_HIGH>;
|
||||
+};
|
||||
+
|
||||
+&spi_nor {
|
||||
+ status = "okay";
|
||||
+};
|
|
@ -1,96 +0,0 @@
|
|||
From 65f78c4c41a9b9a7637e1dda2d5e41cf26ea971c Mon Sep 17 00:00:00 2001
|
||||
From: Dan Haab <dhaab@luxul.com>
|
||||
Date: Mon, 9 Oct 2017 09:46:23 -0600
|
||||
Subject: [PATCH] ARM: dts: BCM5301X: Add DT for Luxul ABR-4500
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
This is BCM47094 (AKA BCM4709C0) based router with rear-facing ports
|
||||
board design.
|
||||
|
||||
Signed-off-by: Dan Haab <dhaab@luxul.com>
|
||||
Acked-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/Makefile | 1 +
|
||||
arch/arm/boot/dts/bcm47094-luxul-abr-4500.dts | 63 +++++++++++++++++++++++++++
|
||||
2 files changed, 64 insertions(+)
|
||||
create mode 100644 arch/arm/boot/dts/bcm47094-luxul-abr-4500.dts
|
||||
|
||||
--- a/arch/arm/boot/dts/Makefile
|
||||
+++ b/arch/arm/boot/dts/Makefile
|
||||
@@ -85,6 +85,7 @@ dtb-$(CONFIG_ARCH_BCM_5301X) += \
|
||||
bcm4709-tplink-archer-c9-v1.dtb \
|
||||
bcm47094-dlink-dir-885l.dtb \
|
||||
bcm47094-linksys-panamera.dtb \
|
||||
+ bcm47094-luxul-abr-4500.dtb \
|
||||
bcm47094-luxul-xbr-4500.dtb \
|
||||
bcm47094-luxul-xwr-3100.dtb \
|
||||
bcm47094-netgear-r8500.dtb \
|
||||
--- /dev/null
|
||||
+++ b/arch/arm/boot/dts/bcm47094-luxul-abr-4500.dts
|
||||
@@ -0,0 +1,63 @@
|
||||
+/*
|
||||
+ * Copyright (C) 2017 Luxul Inc.
|
||||
+ *
|
||||
+ * Licensed under the ISC license.
|
||||
+ */
|
||||
+
|
||||
+/dts-v1/;
|
||||
+
|
||||
+#include "bcm4708.dtsi"
|
||||
+#include "bcm5301x-nand-cs0-bch8.dtsi"
|
||||
+
|
||||
+/ {
|
||||
+ compatible = "luxul,abr-4500-v1", "brcm,bcm47094", "brcm,bcm4708";
|
||||
+ model = "Luxul ABR-4500 V1";
|
||||
+
|
||||
+ chosen {
|
||||
+ bootargs = "earlycon";
|
||||
+ };
|
||||
+
|
||||
+ memory {
|
||||
+ reg = <0x00000000 0x08000000
|
||||
+ 0x88000000 0x18000000>;
|
||||
+ };
|
||||
+
|
||||
+ leds {
|
||||
+ compatible = "gpio-leds";
|
||||
+
|
||||
+ status {
|
||||
+ label = "bcm53xx:green:status";
|
||||
+ gpios = <&chipcommon 20 GPIO_ACTIVE_LOW>;
|
||||
+ linux,default-trigger = "timer";
|
||||
+ };
|
||||
+
|
||||
+ usb3 {
|
||||
+ label = "bcm53xx:green:usb3";
|
||||
+ gpios = <&chipcommon 19 GPIO_ACTIVE_LOW>;
|
||||
+ trigger-sources = <&ohci_port1>, <&ehci_port1>,
|
||||
+ <&xhci_port1>;
|
||||
+ linux,default-trigger = "usbport";
|
||||
+ };
|
||||
+
|
||||
+ };
|
||||
+
|
||||
+ gpio-keys {
|
||||
+ compatible = "gpio-keys";
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+
|
||||
+ restart {
|
||||
+ label = "Reset";
|
||||
+ linux,code = <KEY_RESTART>;
|
||||
+ gpios = <&chipcommon 17 GPIO_ACTIVE_LOW>;
|
||||
+ };
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&usb3 {
|
||||
+ vcc-gpio = <&chipcommon 18 GPIO_ACTIVE_HIGH>;
|
||||
+};
|
||||
+
|
||||
+&spi_nor {
|
||||
+ status = "okay";
|
||||
+};
|
|
@ -1,120 +0,0 @@
|
|||
From 0aa052ce1c3340850a7e5980b6d24b3ea5779591 Mon Sep 17 00:00:00 2001
|
||||
From: Dan Haab <dhaab@luxul.com>
|
||||
Date: Mon, 9 Oct 2017 09:46:59 -0600
|
||||
Subject: [PATCH] ARM: dts: BCM53573: Add DT for Luxul XAP-810
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
This is BCM53573 WiSoC based access point with an extra BCM43217 chipset
|
||||
used for 2.4 GHz.
|
||||
|
||||
Signed-off-by: Dan Haab <dhaab@luxul.com>
|
||||
Acked-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/Makefile | 1 +
|
||||
arch/arm/boot/dts/bcm47189-luxul-xap-810.dts | 87 ++++++++++++++++++++++++++++
|
||||
2 files changed, 88 insertions(+)
|
||||
create mode 100644 arch/arm/boot/dts/bcm47189-luxul-xap-810.dts
|
||||
|
||||
--- a/arch/arm/boot/dts/Makefile
|
||||
+++ b/arch/arm/boot/dts/Makefile
|
||||
@@ -95,6 +95,7 @@ dtb-$(CONFIG_ARCH_BCM_5301X) += \
|
||||
bcm953012hr.dtb \
|
||||
bcm953012k.dtb
|
||||
dtb-$(CONFIG_ARCH_BCM_53573) += \
|
||||
+ bcm47189-luxul-xap-810.dtb \
|
||||
bcm47189-tenda-ac9.dtb \
|
||||
bcm947189acdbmr.dtb
|
||||
dtb-$(CONFIG_ARCH_BCM_63XX) += \
|
||||
--- /dev/null
|
||||
+++ b/arch/arm/boot/dts/bcm47189-luxul-xap-810.dts
|
||||
@@ -0,0 +1,87 @@
|
||||
+/*
|
||||
+ * Copyright 2017 Luxul Inc.
|
||||
+ *
|
||||
+ * Licensed under the ISC license.
|
||||
+ */
|
||||
+
|
||||
+/dts-v1/;
|
||||
+
|
||||
+#include "bcm53573.dtsi"
|
||||
+
|
||||
+/ {
|
||||
+ compatible = "luxul,xap-810-v1", "brcm,bcm47189", "brcm,bcm53573";
|
||||
+ model = "Luxul XAP-810 V1";
|
||||
+
|
||||
+ chosen {
|
||||
+ bootargs = "earlycon";
|
||||
+ };
|
||||
+
|
||||
+ memory {
|
||||
+ reg = <0x00000000 0x08000000>;
|
||||
+ };
|
||||
+
|
||||
+ leds {
|
||||
+ compatible = "gpio-leds";
|
||||
+
|
||||
+ 5ghz {
|
||||
+ label = "bcm53xx:blue:5ghz";
|
||||
+ gpios = <&chipcommon 11 GPIO_ACTIVE_HIGH>;
|
||||
+ linux,default-trigger = "default-off";
|
||||
+ };
|
||||
+
|
||||
+ system {
|
||||
+ label = "bcm53xx:green:system";
|
||||
+ gpios = <&chipcommon 15 GPIO_ACTIVE_HIGH>;
|
||||
+ linux,default-trigger = "timer";
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ pcie0_leds {
|
||||
+ compatible = "gpio-leds";
|
||||
+
|
||||
+ 2ghz {
|
||||
+ label = "bcm53xx:blue:2ghz";
|
||||
+ gpios = <&pcie0_chipcommon 3 GPIO_ACTIVE_HIGH>;
|
||||
+ linux,default-trigger = "default-off";
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ gpio-keys {
|
||||
+ compatible = "gpio-keys";
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+
|
||||
+ restart {
|
||||
+ label = "Reset";
|
||||
+ linux,code = <KEY_RESTART>;
|
||||
+ gpios = <&chipcommon 7 GPIO_ACTIVE_LOW>;
|
||||
+ };
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&pcie0 {
|
||||
+ ranges = <0x00000000 0 0 0 0 0x00100000>;
|
||||
+ #address-cells = <3>;
|
||||
+ #size-cells = <2>;
|
||||
+
|
||||
+ bridge@0,0,0 {
|
||||
+ reg = <0x0000 0 0 0 0>;
|
||||
+ ranges = <0x00000000 0 0 0 0 0 0 0x00100000>;
|
||||
+ #address-cells = <3>;
|
||||
+ #size-cells = <2>;
|
||||
+
|
||||
+ wifi@0,1,0 {
|
||||
+ reg = <0x0000 0 0 0 0>;
|
||||
+ ranges = <0x00000000 0 0 0 0x00100000>;
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <1>;
|
||||
+
|
||||
+ pcie0_chipcommon: chipcommon@0 {
|
||||
+ reg = <0 0x1000>;
|
||||
+
|
||||
+ gpio-controller;
|
||||
+ #gpio-cells = <2>;
|
||||
+ };
|
||||
+ };
|
||||
+ };
|
||||
+};
|
|
@ -1,83 +0,0 @@
|
|||
From 7030ea600d560026b91726f2eb79c856b813afa9 Mon Sep 17 00:00:00 2001
|
||||
From: Dan Haab <dhaab@luxul.com>
|
||||
Date: Mon, 9 Oct 2017 09:47:00 -0600
|
||||
Subject: [PATCH] ARM: dts: BCM53573: Add DT for Luxul XAP-1440
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
This is BCM53573 WiSoC based outdoor access point with an extra BCM43217
|
||||
chipset used for 2.4 GHz.
|
||||
|
||||
Signed-off-by: Dan Haab <dhaab@luxul.com>
|
||||
Acked-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/Makefile | 1 +
|
||||
arch/arm/boot/dts/bcm47189-luxul-xap-1440.dts | 50 +++++++++++++++++++++++++++
|
||||
2 files changed, 51 insertions(+)
|
||||
create mode 100644 arch/arm/boot/dts/bcm47189-luxul-xap-1440.dts
|
||||
|
||||
--- a/arch/arm/boot/dts/Makefile
|
||||
+++ b/arch/arm/boot/dts/Makefile
|
||||
@@ -95,6 +95,7 @@ dtb-$(CONFIG_ARCH_BCM_5301X) += \
|
||||
bcm953012hr.dtb \
|
||||
bcm953012k.dtb
|
||||
dtb-$(CONFIG_ARCH_BCM_53573) += \
|
||||
+ bcm47189-luxul-xap-1440.dtb \
|
||||
bcm47189-luxul-xap-810.dtb \
|
||||
bcm47189-tenda-ac9.dtb \
|
||||
bcm947189acdbmr.dtb
|
||||
--- /dev/null
|
||||
+++ b/arch/arm/boot/dts/bcm47189-luxul-xap-1440.dts
|
||||
@@ -0,0 +1,50 @@
|
||||
+/*
|
||||
+ * Copyright 2017 Luxul Inc.
|
||||
+ *
|
||||
+ * Licensed under the ISC license.
|
||||
+ */
|
||||
+
|
||||
+/dts-v1/;
|
||||
+
|
||||
+#include "bcm53573.dtsi"
|
||||
+
|
||||
+/ {
|
||||
+ compatible = "luxul,xap-1440-v1", "brcm,bcm47189", "brcm,bcm53573";
|
||||
+ model = "Luxul XAP-1440 V1";
|
||||
+
|
||||
+ chosen {
|
||||
+ bootargs = "earlycon";
|
||||
+ };
|
||||
+
|
||||
+ memory {
|
||||
+ reg = <0x00000000 0x08000000>;
|
||||
+ };
|
||||
+
|
||||
+ leds {
|
||||
+ compatible = "gpio-leds";
|
||||
+
|
||||
+ wlan {
|
||||
+ label = "bcm53xx:blue:wlan";
|
||||
+ gpios = <&chipcommon 10 GPIO_ACTIVE_LOW>;
|
||||
+ linux,default-trigger = "default-off";
|
||||
+ };
|
||||
+
|
||||
+ system {
|
||||
+ label = "bcm53xx:green:system";
|
||||
+ gpios = <&chipcommon 11 GPIO_ACTIVE_LOW>;
|
||||
+ linux,default-trigger = "timer";
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ gpio-keys {
|
||||
+ compatible = "gpio-keys";
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+
|
||||
+ restart {
|
||||
+ label = "Reset";
|
||||
+ linux,code = <KEY_RESTART>;
|
||||
+ gpios = <&chipcommon 7 GPIO_ACTIVE_LOW>;
|
||||
+ };
|
||||
+ };
|
||||
+};
|
|
@ -1,252 +0,0 @@
|
|||
From d3feb406733544dbf0e239ef945a09decdceac88 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
|
||||
Date: Thu, 14 Apr 2016 11:37:43 +0200
|
||||
Subject: [PATCH] phy: bcm-ns-usb2: new driver for USB 2.0 PHY on Northstar
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Northstar is a family of SoCs used in home routers. They have USB 2.0
|
||||
and 3.0 controllers with PHYs that need to be properly initialized.
|
||||
This driver provides PHY init support in a generic way and can be bound
|
||||
with an EHCI controller driver.
|
||||
There are (just a few) registers being defined in bcma header. It's
|
||||
because DMU/CRU registers will be also needed in other drivers. We will
|
||||
need them e.g. in PCIe controller/PHY driver and at some point probably
|
||||
in clock driver for BCM53573 chipset. By using include/linux/bcma/ we
|
||||
avoid code duplication.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
|
||||
Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
|
||||
---
|
||||
.../devicetree/bindings/phy/bcm-ns-usb2-phy.txt | 21 ++++
|
||||
drivers/phy/Kconfig | 9 ++
|
||||
drivers/phy/Makefile | 1 +
|
||||
drivers/phy/phy-bcm-ns-usb2.c | 137 +++++++++++++++++++++
|
||||
include/linux/bcma/bcma.h | 1 +
|
||||
include/linux/bcma/bcma_driver_arm_c9.h | 15 +++
|
||||
6 files changed, 184 insertions(+)
|
||||
create mode 100644 Documentation/devicetree/bindings/phy/bcm-ns-usb2-phy.txt
|
||||
create mode 100644 drivers/phy/phy-bcm-ns-usb2.c
|
||||
create mode 100644 include/linux/bcma/bcma_driver_arm_c9.h
|
||||
|
||||
--- /dev/null
|
||||
+++ b/Documentation/devicetree/bindings/phy/bcm-ns-usb2-phy.txt
|
||||
@@ -0,0 +1,21 @@
|
||||
+Driver for Broadcom Northstar USB 2.0 PHY
|
||||
+
|
||||
+Required properties:
|
||||
+- compatible: brcm,ns-usb2-phy
|
||||
+- reg: iomem address range of DMU (Device Management Unit)
|
||||
+- reg-names: "dmu", the only needed & supported reg right now
|
||||
+- clocks: USB PHY reference clock
|
||||
+- clock-names: "phy-ref-clk", the only needed & supported clock right now
|
||||
+
|
||||
+To initialize USB 2.0 PHY driver needs to setup PLL correctly. To do this it
|
||||
+requires passing phandle to the USB PHY reference clock.
|
||||
+
|
||||
+Example:
|
||||
+ usb2-phy {
|
||||
+ compatible = "brcm,ns-usb2-phy";
|
||||
+ reg = <0x1800c000 0x1000>;
|
||||
+ reg-names = "dmu";
|
||||
+ #phy-cells = <0>;
|
||||
+ clocks = <&genpll BCM_NSP_GENPLL_USB_PHY_REF_CLK>;
|
||||
+ clock-names = "phy-ref-clk";
|
||||
+ };
|
||||
--- a/drivers/phy/Kconfig
|
||||
+++ b/drivers/phy/Kconfig
|
||||
@@ -15,6 +15,15 @@ config GENERIC_PHY
|
||||
phy users can obtain reference to the PHY. All the users of this
|
||||
framework should select this config.
|
||||
|
||||
+config PHY_BCM_NS_USB2
|
||||
+ tristate "Broadcom Northstar USB 2.0 PHY Driver"
|
||||
+ depends on ARCH_BCM_IPROC || COMPILE_TEST
|
||||
+ depends on HAS_IOMEM && OF
|
||||
+ select GENERIC_PHY
|
||||
+ help
|
||||
+ Enable this to support Broadcom USB 2.0 PHY connected to the USB
|
||||
+ controller on Northstar family.
|
||||
+
|
||||
config PHY_BERLIN_USB
|
||||
tristate "Marvell Berlin USB PHY Driver"
|
||||
depends on ARCH_BERLIN && RESET_CONTROLLER && HAS_IOMEM && OF
|
||||
--- a/drivers/phy/Makefile
|
||||
+++ b/drivers/phy/Makefile
|
||||
@@ -3,6 +3,7 @@
|
||||
#
|
||||
|
||||
obj-$(CONFIG_GENERIC_PHY) += phy-core.o
|
||||
+obj-$(CONFIG_PHY_BCM_NS_USB2) += phy-bcm-ns-usb2.o
|
||||
obj-$(CONFIG_PHY_BERLIN_USB) += phy-berlin-usb.o
|
||||
obj-$(CONFIG_PHY_BERLIN_SATA) += phy-berlin-sata.o
|
||||
obj-$(CONFIG_PHY_DM816X_USB) += phy-dm816x-usb.o
|
||||
--- /dev/null
|
||||
+++ b/drivers/phy/phy-bcm-ns-usb2.c
|
||||
@@ -0,0 +1,137 @@
|
||||
+/*
|
||||
+ * Broadcom Northstar USB 2.0 PHY Driver
|
||||
+ *
|
||||
+ * Copyright (C) 2016 Rafał Miłecki <zajec5@gmail.com>
|
||||
+ *
|
||||
+ * This program is free software; you can redistribute it and/or modify
|
||||
+ * it under the terms of the GNU General Public License version 2 as
|
||||
+ * published by the Free Software Foundation.
|
||||
+ *
|
||||
+ */
|
||||
+
|
||||
+#include <linux/bcma/bcma.h>
|
||||
+#include <linux/clk.h>
|
||||
+#include <linux/delay.h>
|
||||
+#include <linux/err.h>
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/of_address.h>
|
||||
+#include <linux/of_platform.h>
|
||||
+#include <linux/phy/phy.h>
|
||||
+#include <linux/platform_device.h>
|
||||
+#include <linux/slab.h>
|
||||
+
|
||||
+struct bcm_ns_usb2 {
|
||||
+ struct device *dev;
|
||||
+ struct clk *ref_clk;
|
||||
+ struct phy *phy;
|
||||
+ void __iomem *dmu;
|
||||
+};
|
||||
+
|
||||
+static int bcm_ns_usb2_phy_init(struct phy *phy)
|
||||
+{
|
||||
+ struct bcm_ns_usb2 *usb2 = phy_get_drvdata(phy);
|
||||
+ struct device *dev = usb2->dev;
|
||||
+ void __iomem *dmu = usb2->dmu;
|
||||
+ u32 ref_clk_rate, usb2ctl, usb_pll_ndiv, usb_pll_pdiv;
|
||||
+ int err = 0;
|
||||
+
|
||||
+ err = clk_prepare_enable(usb2->ref_clk);
|
||||
+ if (err < 0) {
|
||||
+ dev_err(dev, "Failed to prepare ref clock: %d\n", err);
|
||||
+ goto err_out;
|
||||
+ }
|
||||
+
|
||||
+ ref_clk_rate = clk_get_rate(usb2->ref_clk);
|
||||
+ if (!ref_clk_rate) {
|
||||
+ dev_err(dev, "Failed to get ref clock rate\n");
|
||||
+ err = -EINVAL;
|
||||
+ goto err_clk_off;
|
||||
+ }
|
||||
+
|
||||
+ usb2ctl = readl(dmu + BCMA_DMU_CRU_USB2_CONTROL);
|
||||
+
|
||||
+ if (usb2ctl & BCMA_DMU_CRU_USB2_CONTROL_USB_PLL_PDIV_MASK) {
|
||||
+ usb_pll_pdiv = usb2ctl;
|
||||
+ usb_pll_pdiv &= BCMA_DMU_CRU_USB2_CONTROL_USB_PLL_PDIV_MASK;
|
||||
+ usb_pll_pdiv >>= BCMA_DMU_CRU_USB2_CONTROL_USB_PLL_PDIV_SHIFT;
|
||||
+ } else {
|
||||
+ usb_pll_pdiv = 1 << 3;
|
||||
+ }
|
||||
+
|
||||
+ /* Calculate ndiv based on a solid 1920 MHz that is for USB2 PHY */
|
||||
+ usb_pll_ndiv = (1920000000 * usb_pll_pdiv) / ref_clk_rate;
|
||||
+
|
||||
+ /* Unlock DMU PLL settings with some magic value */
|
||||
+ writel(0x0000ea68, dmu + BCMA_DMU_CRU_CLKSET_KEY);
|
||||
+
|
||||
+ /* Write USB 2.0 PLL control setting */
|
||||
+ usb2ctl &= ~BCMA_DMU_CRU_USB2_CONTROL_USB_PLL_NDIV_MASK;
|
||||
+ usb2ctl |= usb_pll_ndiv << BCMA_DMU_CRU_USB2_CONTROL_USB_PLL_NDIV_SHIFT;
|
||||
+ writel(usb2ctl, dmu + BCMA_DMU_CRU_USB2_CONTROL);
|
||||
+
|
||||
+ /* Lock DMU PLL settings */
|
||||
+ writel(0x00000000, dmu + BCMA_DMU_CRU_CLKSET_KEY);
|
||||
+
|
||||
+err_clk_off:
|
||||
+ clk_disable_unprepare(usb2->ref_clk);
|
||||
+err_out:
|
||||
+ return err;
|
||||
+}
|
||||
+
|
||||
+static const struct phy_ops ops = {
|
||||
+ .init = bcm_ns_usb2_phy_init,
|
||||
+ .owner = THIS_MODULE,
|
||||
+};
|
||||
+
|
||||
+static int bcm_ns_usb2_probe(struct platform_device *pdev)
|
||||
+{
|
||||
+ struct device *dev = &pdev->dev;
|
||||
+ struct bcm_ns_usb2 *usb2;
|
||||
+ struct resource *res;
|
||||
+ struct phy_provider *phy_provider;
|
||||
+
|
||||
+ usb2 = devm_kzalloc(&pdev->dev, sizeof(*usb2), GFP_KERNEL);
|
||||
+ if (!usb2)
|
||||
+ return -ENOMEM;
|
||||
+ usb2->dev = dev;
|
||||
+
|
||||
+ res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "dmu");
|
||||
+ usb2->dmu = devm_ioremap_resource(dev, res);
|
||||
+ if (IS_ERR(usb2->dmu)) {
|
||||
+ dev_err(dev, "Failed to map DMU regs\n");
|
||||
+ return PTR_ERR(usb2->dmu);
|
||||
+ }
|
||||
+
|
||||
+ usb2->ref_clk = devm_clk_get(dev, "phy-ref-clk");
|
||||
+ if (IS_ERR(usb2->ref_clk)) {
|
||||
+ dev_err(dev, "Clock not defined\n");
|
||||
+ return PTR_ERR(usb2->ref_clk);
|
||||
+ }
|
||||
+
|
||||
+ usb2->phy = devm_phy_create(dev, NULL, &ops);
|
||||
+ if (IS_ERR(dev))
|
||||
+ return PTR_ERR(dev);
|
||||
+
|
||||
+ phy_set_drvdata(usb2->phy, usb2);
|
||||
+ platform_set_drvdata(pdev, usb2);
|
||||
+
|
||||
+ phy_provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate);
|
||||
+ return PTR_ERR_OR_ZERO(phy_provider);
|
||||
+}
|
||||
+
|
||||
+static const struct of_device_id bcm_ns_usb2_id_table[] = {
|
||||
+ { .compatible = "brcm,ns-usb2-phy", },
|
||||
+ {},
|
||||
+};
|
||||
+MODULE_DEVICE_TABLE(of, bcm_ns_usb2_id_table);
|
||||
+
|
||||
+static struct platform_driver bcm_ns_usb2_driver = {
|
||||
+ .probe = bcm_ns_usb2_probe,
|
||||
+ .driver = {
|
||||
+ .name = "bcm_ns_usb2",
|
||||
+ .of_match_table = bcm_ns_usb2_id_table,
|
||||
+ },
|
||||
+};
|
||||
+module_platform_driver(bcm_ns_usb2_driver);
|
||||
+
|
||||
+MODULE_LICENSE("GPL v2");
|
||||
--- a/include/linux/bcma/bcma.h
|
||||
+++ b/include/linux/bcma/bcma.h
|
||||
@@ -4,6 +4,7 @@
|
||||
#include <linux/pci.h>
|
||||
#include <linux/mod_devicetable.h>
|
||||
|
||||
+#include <linux/bcma/bcma_driver_arm_c9.h>
|
||||
#include <linux/bcma/bcma_driver_chipcommon.h>
|
||||
#include <linux/bcma/bcma_driver_pci.h>
|
||||
#include <linux/bcma/bcma_driver_pcie2.h>
|
||||
--- /dev/null
|
||||
+++ b/include/linux/bcma/bcma_driver_arm_c9.h
|
||||
@@ -0,0 +1,15 @@
|
||||
+#ifndef LINUX_BCMA_DRIVER_ARM_C9_H_
|
||||
+#define LINUX_BCMA_DRIVER_ARM_C9_H_
|
||||
+
|
||||
+/* DMU (Device Management Unit) */
|
||||
+#define BCMA_DMU_CRU_USB2_CONTROL 0x0164
|
||||
+#define BCMA_DMU_CRU_USB2_CONTROL_USB_PLL_NDIV_MASK 0x00000FFC
|
||||
+#define BCMA_DMU_CRU_USB2_CONTROL_USB_PLL_NDIV_SHIFT 2
|
||||
+#define BCMA_DMU_CRU_USB2_CONTROL_USB_PLL_PDIV_MASK 0x00007000
|
||||
+#define BCMA_DMU_CRU_USB2_CONTROL_USB_PLL_PDIV_SHIFT 12
|
||||
+#define BCMA_DMU_CRU_CLKSET_KEY 0x0180
|
||||
+#define BCMA_DMU_CRU_STRAPS_CTRL 0x02A0
|
||||
+#define BCMA_DMU_CRU_STRAPS_CTRL_USB3 0x00000010
|
||||
+#define BCMA_DMU_CRU_STRAPS_CTRL_4BYTE 0x00008000
|
||||
+
|
||||
+#endif /* LINUX_BCMA_DRIVER_ARM_C9_H_ */
|
|
@ -1,27 +0,0 @@
|
|||
From 6c081ff6fd5abd621797570be43d5e3c6acfcd58 Mon Sep 17 00:00:00 2001
|
||||
From: Dan Carpenter <dan.carpenter@oracle.com>
|
||||
Date: Tue, 10 May 2016 11:01:33 +0300
|
||||
Subject: [PATCH] phy: bcm-ns-usb2: checking the wrong variable
|
||||
|
||||
We intended to test "usb2->phy" here instead of "dev".
|
||||
|
||||
Fixes: d3feb4067335 ('phy: bcm-ns-usb2: new driver for USB 2.0 PHY on Northstar')
|
||||
Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
|
||||
Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
|
||||
---
|
||||
drivers/phy/phy-bcm-ns-usb2.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/phy/phy-bcm-ns-usb2.c
|
||||
+++ b/drivers/phy/phy-bcm-ns-usb2.c
|
||||
@@ -109,8 +109,8 @@ static int bcm_ns_usb2_probe(struct plat
|
||||
}
|
||||
|
||||
usb2->phy = devm_phy_create(dev, NULL, &ops);
|
||||
- if (IS_ERR(dev))
|
||||
- return PTR_ERR(dev);
|
||||
+ if (IS_ERR(usb2->phy))
|
||||
+ return PTR_ERR(usb2->phy);
|
||||
|
||||
phy_set_drvdata(usb2->phy, usb2);
|
||||
platform_set_drvdata(pdev, usb2);
|
|
@ -1,361 +0,0 @@
|
|||
From b8d7478ecfec51b3430f677da44e662d5ff12444 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Fri, 12 Aug 2016 00:28:03 +0200
|
||||
Subject: [PATCH] phy: bcm-ns-usb3: new driver for USB 3.0 PHY on Northstar
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Northstar is a family of SoCs used in home routers. They have USB 2.0
|
||||
and 3.0 controllers with PHYs that need to be properly initialized.
|
||||
This driver provides PHY init support in a generic way and can be bound
|
||||
with XHCI controller driver.
|
||||
|
||||
There aren't any public datasheets from Broadcom so we can't have nice
|
||||
defines for all used bits. It means we just follow Broadcom's
|
||||
initialization procedure using their magic values. We were quite lucky
|
||||
actually that Broadcom put some comments in their SDK reference code
|
||||
explaining what given writes are responsible for.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
|
||||
---
|
||||
.../devicetree/bindings/phy/bcm-ns-usb3-phy.txt | 23 ++
|
||||
drivers/phy/Kconfig | 9 +
|
||||
drivers/phy/Makefile | 1 +
|
||||
drivers/phy/phy-bcm-ns-usb3.c | 274 +++++++++++++++++++++
|
||||
4 files changed, 307 insertions(+)
|
||||
create mode 100644 Documentation/devicetree/bindings/phy/bcm-ns-usb3-phy.txt
|
||||
create mode 100644 drivers/phy/phy-bcm-ns-usb3.c
|
||||
|
||||
--- /dev/null
|
||||
+++ b/Documentation/devicetree/bindings/phy/bcm-ns-usb3-phy.txt
|
||||
@@ -0,0 +1,23 @@
|
||||
+Driver for Broadcom Northstar USB 3.0 PHY
|
||||
+
|
||||
+Required properties:
|
||||
+
|
||||
+- compatible: one of: "brcm,ns-ax-usb3-phy", "brcm,ns-bx-usb3-phy".
|
||||
+- reg: register mappings for DMP (Device Management Plugin) and ChipCommon B
|
||||
+ MMI.
|
||||
+- reg-names: "dmp" and "ccb-mii"
|
||||
+
|
||||
+Initialization of USB 3.0 PHY depends on Northstar version. There are currently
|
||||
+three known series: Ax, Bx and Cx.
|
||||
+Known A0: BCM4707 rev 0
|
||||
+Known B0: BCM4707 rev 4, BCM53573 rev 2
|
||||
+Known B1: BCM4707 rev 6
|
||||
+Known C0: BCM47094 rev 0
|
||||
+
|
||||
+Example:
|
||||
+ usb3-phy {
|
||||
+ compatible = "brcm,ns-ax-usb3-phy";
|
||||
+ reg = <0x18105000 0x1000>, <0x18003000 0x1000>;
|
||||
+ reg-names = "dmp", "ccb-mii";
|
||||
+ #phy-cells = <0>;
|
||||
+ };
|
||||
--- a/drivers/phy/Kconfig
|
||||
+++ b/drivers/phy/Kconfig
|
||||
@@ -24,6 +24,15 @@ config PHY_BCM_NS_USB2
|
||||
Enable this to support Broadcom USB 2.0 PHY connected to the USB
|
||||
controller on Northstar family.
|
||||
|
||||
+config PHY_BCM_NS_USB3
|
||||
+ tristate "Broadcom Northstar USB 3.0 PHY Driver"
|
||||
+ depends on ARCH_BCM_IPROC || COMPILE_TEST
|
||||
+ depends on HAS_IOMEM && OF
|
||||
+ select GENERIC_PHY
|
||||
+ help
|
||||
+ Enable this to support Broadcom USB 3.0 PHY connected to the USB
|
||||
+ controller on Northstar family.
|
||||
+
|
||||
config PHY_BERLIN_USB
|
||||
tristate "Marvell Berlin USB PHY Driver"
|
||||
depends on ARCH_BERLIN && RESET_CONTROLLER && HAS_IOMEM && OF
|
||||
--- a/drivers/phy/Makefile
|
||||
+++ b/drivers/phy/Makefile
|
||||
@@ -4,6 +4,7 @@
|
||||
|
||||
obj-$(CONFIG_GENERIC_PHY) += phy-core.o
|
||||
obj-$(CONFIG_PHY_BCM_NS_USB2) += phy-bcm-ns-usb2.o
|
||||
+obj-$(CONFIG_PHY_BCM_NS_USB3) += phy-bcm-ns-usb3.o
|
||||
obj-$(CONFIG_PHY_BERLIN_USB) += phy-berlin-usb.o
|
||||
obj-$(CONFIG_PHY_BERLIN_SATA) += phy-berlin-sata.o
|
||||
obj-$(CONFIG_PHY_DM816X_USB) += phy-dm816x-usb.o
|
||||
--- /dev/null
|
||||
+++ b/drivers/phy/phy-bcm-ns-usb3.c
|
||||
@@ -0,0 +1,274 @@
|
||||
+/*
|
||||
+ * Broadcom Northstar USB 3.0 PHY Driver
|
||||
+ *
|
||||
+ * Copyright (C) 2016 Rafał Miłecki <rafal@milecki.pl>
|
||||
+ *
|
||||
+ * All magic values used for initialization (and related comments) were obtained
|
||||
+ * from Broadcom's SDK:
|
||||
+ * Copyright (c) Broadcom Corp, 2012
|
||||
+ *
|
||||
+ * This program is free software; you can redistribute it and/or modify
|
||||
+ * it under the terms of the GNU General Public License version 2 as
|
||||
+ * published by the Free Software Foundation.
|
||||
+ */
|
||||
+
|
||||
+#include <linux/bcma/bcma.h>
|
||||
+#include <linux/delay.h>
|
||||
+#include <linux/err.h>
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/of_platform.h>
|
||||
+#include <linux/platform_device.h>
|
||||
+#include <linux/phy/phy.h>
|
||||
+#include <linux/slab.h>
|
||||
+
|
||||
+#define BCM_NS_USB3_MII_MNG_TIMEOUT_US 1000 /* usecs */
|
||||
+
|
||||
+enum bcm_ns_family {
|
||||
+ BCM_NS_UNKNOWN,
|
||||
+ BCM_NS_AX,
|
||||
+ BCM_NS_BX,
|
||||
+};
|
||||
+
|
||||
+struct bcm_ns_usb3 {
|
||||
+ struct device *dev;
|
||||
+ enum bcm_ns_family family;
|
||||
+ void __iomem *dmp;
|
||||
+ void __iomem *ccb_mii;
|
||||
+ struct phy *phy;
|
||||
+};
|
||||
+
|
||||
+static const struct of_device_id bcm_ns_usb3_id_table[] = {
|
||||
+ {
|
||||
+ .compatible = "brcm,ns-ax-usb3-phy",
|
||||
+ .data = (int *)BCM_NS_AX,
|
||||
+ },
|
||||
+ {
|
||||
+ .compatible = "brcm,ns-bx-usb3-phy",
|
||||
+ .data = (int *)BCM_NS_BX,
|
||||
+ },
|
||||
+ {},
|
||||
+};
|
||||
+MODULE_DEVICE_TABLE(of, bcm_ns_usb3_id_table);
|
||||
+
|
||||
+static int bcm_ns_usb3_wait_reg(struct bcm_ns_usb3 *usb3, void __iomem *addr,
|
||||
+ u32 mask, u32 value, unsigned long timeout)
|
||||
+{
|
||||
+ unsigned long deadline = jiffies + timeout;
|
||||
+ u32 val;
|
||||
+
|
||||
+ do {
|
||||
+ val = readl(addr);
|
||||
+ if ((val & mask) == value)
|
||||
+ return 0;
|
||||
+ cpu_relax();
|
||||
+ udelay(10);
|
||||
+ } while (!time_after_eq(jiffies, deadline));
|
||||
+
|
||||
+ dev_err(usb3->dev, "Timeout waiting for register %p\n", addr);
|
||||
+
|
||||
+ return -EBUSY;
|
||||
+}
|
||||
+
|
||||
+static inline int bcm_ns_usb3_mii_mng_wait_idle(struct bcm_ns_usb3 *usb3)
|
||||
+{
|
||||
+ return bcm_ns_usb3_wait_reg(usb3, usb3->ccb_mii + BCMA_CCB_MII_MNG_CTL,
|
||||
+ 0x0100, 0x0000,
|
||||
+ usecs_to_jiffies(BCM_NS_USB3_MII_MNG_TIMEOUT_US));
|
||||
+}
|
||||
+
|
||||
+static int bcm_ns_usb3_mii_mng_write32(struct bcm_ns_usb3 *usb3, u32 value)
|
||||
+{
|
||||
+ int err;
|
||||
+
|
||||
+ err = bcm_ns_usb3_mii_mng_wait_idle(usb3);
|
||||
+ if (err < 0) {
|
||||
+ dev_err(usb3->dev, "Couldn't write 0x%08x value\n", value);
|
||||
+ return err;
|
||||
+ }
|
||||
+
|
||||
+ writel(value, usb3->ccb_mii + BCMA_CCB_MII_MNG_CMD_DATA);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int bcm_ns_usb3_phy_init_ns_bx(struct bcm_ns_usb3 *usb3)
|
||||
+{
|
||||
+ int err;
|
||||
+
|
||||
+ /* Enable MDIO. Setting MDCDIV as 26 */
|
||||
+ writel(0x0000009a, usb3->ccb_mii + BCMA_CCB_MII_MNG_CTL);
|
||||
+
|
||||
+ /* Wait for MDIO? */
|
||||
+ udelay(2);
|
||||
+
|
||||
+ /* USB3 PLL Block */
|
||||
+ err = bcm_ns_usb3_mii_mng_write32(usb3, 0x587e8000);
|
||||
+ if (err < 0)
|
||||
+ return err;
|
||||
+
|
||||
+ /* Assert Ana_Pllseq start */
|
||||
+ bcm_ns_usb3_mii_mng_write32(usb3, 0x58061000);
|
||||
+
|
||||
+ /* Assert CML Divider ratio to 26 */
|
||||
+ bcm_ns_usb3_mii_mng_write32(usb3, 0x582a6400);
|
||||
+
|
||||
+ /* Asserting PLL Reset */
|
||||
+ bcm_ns_usb3_mii_mng_write32(usb3, 0x582ec000);
|
||||
+
|
||||
+ /* Deaaserting PLL Reset */
|
||||
+ bcm_ns_usb3_mii_mng_write32(usb3, 0x582e8000);
|
||||
+
|
||||
+ /* Waiting MII Mgt interface idle */
|
||||
+ bcm_ns_usb3_mii_mng_wait_idle(usb3);
|
||||
+
|
||||
+ /* Deasserting USB3 system reset */
|
||||
+ writel(0, usb3->dmp + BCMA_RESET_CTL);
|
||||
+
|
||||
+ /* PLL frequency monitor enable */
|
||||
+ bcm_ns_usb3_mii_mng_write32(usb3, 0x58069000);
|
||||
+
|
||||
+ /* PIPE Block */
|
||||
+ bcm_ns_usb3_mii_mng_write32(usb3, 0x587e8060);
|
||||
+
|
||||
+ /* CMPMAX & CMPMINTH setting */
|
||||
+ bcm_ns_usb3_mii_mng_write32(usb3, 0x580af30d);
|
||||
+
|
||||
+ /* DEGLITCH MIN & MAX setting */
|
||||
+ bcm_ns_usb3_mii_mng_write32(usb3, 0x580e6302);
|
||||
+
|
||||
+ /* TXPMD block */
|
||||
+ bcm_ns_usb3_mii_mng_write32(usb3, 0x587e8040);
|
||||
+
|
||||
+ /* Enabling SSC */
|
||||
+ bcm_ns_usb3_mii_mng_write32(usb3, 0x58061003);
|
||||
+
|
||||
+ /* Waiting MII Mgt interface idle */
|
||||
+ bcm_ns_usb3_mii_mng_wait_idle(usb3);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int bcm_ns_usb3_phy_init_ns_ax(struct bcm_ns_usb3 *usb3)
|
||||
+{
|
||||
+ int err;
|
||||
+
|
||||
+ /* Enable MDIO. Setting MDCDIV as 26 */
|
||||
+ writel(0x0000009a, usb3->ccb_mii + BCMA_CCB_MII_MNG_CTL);
|
||||
+
|
||||
+ /* Wait for MDIO? */
|
||||
+ udelay(2);
|
||||
+
|
||||
+ /* PLL30 block */
|
||||
+ err = bcm_ns_usb3_mii_mng_write32(usb3, 0x587e8000);
|
||||
+ if (err < 0)
|
||||
+ return err;
|
||||
+
|
||||
+ bcm_ns_usb3_mii_mng_write32(usb3, 0x582a6400);
|
||||
+
|
||||
+ bcm_ns_usb3_mii_mng_write32(usb3, 0x587e80e0);
|
||||
+
|
||||
+ bcm_ns_usb3_mii_mng_write32(usb3, 0x580a009c);
|
||||
+
|
||||
+ /* Enable SSC */
|
||||
+ bcm_ns_usb3_mii_mng_write32(usb3, 0x587e8040);
|
||||
+
|
||||
+ bcm_ns_usb3_mii_mng_write32(usb3, 0x580a21d3);
|
||||
+
|
||||
+ bcm_ns_usb3_mii_mng_write32(usb3, 0x58061003);
|
||||
+
|
||||
+ /* Waiting MII Mgt interface idle */
|
||||
+ bcm_ns_usb3_mii_mng_wait_idle(usb3);
|
||||
+
|
||||
+ /* Deasserting USB3 system reset */
|
||||
+ writel(0, usb3->dmp + BCMA_RESET_CTL);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int bcm_ns_usb3_phy_init(struct phy *phy)
|
||||
+{
|
||||
+ struct bcm_ns_usb3 *usb3 = phy_get_drvdata(phy);
|
||||
+ int err;
|
||||
+
|
||||
+ /* Perform USB3 system soft reset */
|
||||
+ writel(BCMA_RESET_CTL_RESET, usb3->dmp + BCMA_RESET_CTL);
|
||||
+
|
||||
+ switch (usb3->family) {
|
||||
+ case BCM_NS_AX:
|
||||
+ err = bcm_ns_usb3_phy_init_ns_ax(usb3);
|
||||
+ break;
|
||||
+ case BCM_NS_BX:
|
||||
+ err = bcm_ns_usb3_phy_init_ns_bx(usb3);
|
||||
+ break;
|
||||
+ default:
|
||||
+ WARN_ON(1);
|
||||
+ err = -ENOTSUPP;
|
||||
+ }
|
||||
+
|
||||
+ return err;
|
||||
+}
|
||||
+
|
||||
+static const struct phy_ops ops = {
|
||||
+ .init = bcm_ns_usb3_phy_init,
|
||||
+ .owner = THIS_MODULE,
|
||||
+};
|
||||
+
|
||||
+static int bcm_ns_usb3_probe(struct platform_device *pdev)
|
||||
+{
|
||||
+ struct device *dev = &pdev->dev;
|
||||
+ const struct of_device_id *of_id;
|
||||
+ struct bcm_ns_usb3 *usb3;
|
||||
+ struct resource *res;
|
||||
+ struct phy_provider *phy_provider;
|
||||
+
|
||||
+ usb3 = devm_kzalloc(dev, sizeof(*usb3), GFP_KERNEL);
|
||||
+ if (!usb3)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ usb3->dev = dev;
|
||||
+
|
||||
+ of_id = of_match_device(bcm_ns_usb3_id_table, dev);
|
||||
+ if (!of_id)
|
||||
+ return -EINVAL;
|
||||
+ usb3->family = (enum bcm_ns_family)of_id->data;
|
||||
+
|
||||
+ res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "dmp");
|
||||
+ usb3->dmp = devm_ioremap_resource(dev, res);
|
||||
+ if (IS_ERR(usb3->dmp)) {
|
||||
+ dev_err(dev, "Failed to map DMP regs\n");
|
||||
+ return PTR_ERR(usb3->dmp);
|
||||
+ }
|
||||
+
|
||||
+ res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "ccb-mii");
|
||||
+ usb3->ccb_mii = devm_ioremap_resource(dev, res);
|
||||
+ if (IS_ERR(usb3->ccb_mii)) {
|
||||
+ dev_err(dev, "Failed to map ChipCommon B MII regs\n");
|
||||
+ return PTR_ERR(usb3->ccb_mii);
|
||||
+ }
|
||||
+
|
||||
+ usb3->phy = devm_phy_create(dev, NULL, &ops);
|
||||
+ if (IS_ERR(usb3->phy)) {
|
||||
+ dev_err(dev, "Failed to create PHY\n");
|
||||
+ return PTR_ERR(usb3->phy);
|
||||
+ }
|
||||
+
|
||||
+ phy_set_drvdata(usb3->phy, usb3);
|
||||
+ platform_set_drvdata(pdev, usb3);
|
||||
+
|
||||
+ phy_provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate);
|
||||
+ if (!IS_ERR(phy_provider))
|
||||
+ dev_info(dev, "Registered Broadcom Northstar USB 3.0 PHY driver\n");
|
||||
+
|
||||
+ return PTR_ERR_OR_ZERO(phy_provider);
|
||||
+}
|
||||
+
|
||||
+static struct platform_driver bcm_ns_usb3_driver = {
|
||||
+ .probe = bcm_ns_usb3_probe,
|
||||
+ .driver = {
|
||||
+ .name = "bcm_ns_usb3",
|
||||
+ .of_match_table = bcm_ns_usb3_id_table,
|
||||
+ },
|
||||
+};
|
||||
+module_platform_driver(bcm_ns_usb3_driver);
|
||||
+
|
||||
+MODULE_LICENSE("GPL v2");
|
|
@ -1,177 +0,0 @@
|
|||
From fff3364a637796611c06f59a6f2be61685d99bfe Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Sun, 2 Apr 2017 18:55:22 +0200
|
||||
Subject: [PATCH] phy: bcm-ns-usb3: split all writes into reg & val pairs
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
So far all the PHY initialization was implemented using some totally
|
||||
magic values. There was some pattern there but it wasn't clear what is
|
||||
it about.
|
||||
|
||||
Thanks to the patch submitted by Broadcom:
|
||||
[PATCH 5/6] phy: Add USB3 PHY support for Broadcom NSP SoC
|
||||
and the upstream "iproc-mdio" driver we now know there is a MDIO bus
|
||||
underneath with PHY(s) and their registers.
|
||||
|
||||
It allows us to clean the driver a bit by making all these values less
|
||||
magical. The next step is switching to using a proper MDIO layer.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Acked-by: Jon Mason <jon.mason@broadcom.com>
|
||||
Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
|
||||
---
|
||||
drivers/phy/phy-bcm-ns-usb3.c | 69 ++++++++++++++++++++++++++++++-------------
|
||||
1 file changed, 49 insertions(+), 20 deletions(-)
|
||||
|
||||
--- a/drivers/phy/phy-bcm-ns-usb3.c
|
||||
+++ b/drivers/phy/phy-bcm-ns-usb3.c
|
||||
@@ -2,6 +2,7 @@
|
||||
* Broadcom Northstar USB 3.0 PHY Driver
|
||||
*
|
||||
* Copyright (C) 2016 Rafał Miłecki <rafal@milecki.pl>
|
||||
+ * Copyright (C) 2016 Broadcom
|
||||
*
|
||||
* All magic values used for initialization (and related comments) were obtained
|
||||
* from Broadcom's SDK:
|
||||
@@ -23,6 +24,23 @@
|
||||
|
||||
#define BCM_NS_USB3_MII_MNG_TIMEOUT_US 1000 /* usecs */
|
||||
|
||||
+#define BCM_NS_USB3_PHY_BASE_ADDR_REG 0x1f
|
||||
+#define BCM_NS_USB3_PHY_PLL30_BLOCK 0x8000
|
||||
+#define BCM_NS_USB3_PHY_TX_PMD_BLOCK 0x8040
|
||||
+#define BCM_NS_USB3_PHY_PIPE_BLOCK 0x8060
|
||||
+
|
||||
+/* Registers of PLL30 block */
|
||||
+#define BCM_NS_USB3_PLL_CONTROL 0x01
|
||||
+#define BCM_NS_USB3_PLLA_CONTROL0 0x0a
|
||||
+#define BCM_NS_USB3_PLLA_CONTROL1 0x0b
|
||||
+
|
||||
+/* Registers of TX PMD block */
|
||||
+#define BCM_NS_USB3_TX_PMD_CONTROL1 0x01
|
||||
+
|
||||
+/* Registers of PIPE block */
|
||||
+#define BCM_NS_USB3_LFPS_CMP 0x02
|
||||
+#define BCM_NS_USB3_LFPS_DEGLITCH 0x03
|
||||
+
|
||||
enum bcm_ns_family {
|
||||
BCM_NS_UNKNOWN,
|
||||
BCM_NS_AX,
|
||||
@@ -76,8 +94,10 @@ static inline int bcm_ns_usb3_mii_mng_wa
|
||||
usecs_to_jiffies(BCM_NS_USB3_MII_MNG_TIMEOUT_US));
|
||||
}
|
||||
|
||||
-static int bcm_ns_usb3_mii_mng_write32(struct bcm_ns_usb3 *usb3, u32 value)
|
||||
+static int bcm_ns_usb3_mdio_phy_write(struct bcm_ns_usb3 *usb3, u16 reg,
|
||||
+ u16 value)
|
||||
{
|
||||
+ u32 tmp = 0;
|
||||
int err;
|
||||
|
||||
err = bcm_ns_usb3_mii_mng_wait_idle(usb3);
|
||||
@@ -86,7 +106,11 @@ static int bcm_ns_usb3_mii_mng_write32(s
|
||||
return err;
|
||||
}
|
||||
|
||||
- writel(value, usb3->ccb_mii + BCMA_CCB_MII_MNG_CMD_DATA);
|
||||
+ /* TODO: Use a proper MDIO bus layer */
|
||||
+ tmp |= 0x58020000; /* Magic value for MDIO PHY write */
|
||||
+ tmp |= reg << 18;
|
||||
+ tmp |= value;
|
||||
+ writel(tmp, usb3->ccb_mii + BCMA_CCB_MII_MNG_CMD_DATA);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -102,21 +126,22 @@ static int bcm_ns_usb3_phy_init_ns_bx(st
|
||||
udelay(2);
|
||||
|
||||
/* USB3 PLL Block */
|
||||
- err = bcm_ns_usb3_mii_mng_write32(usb3, 0x587e8000);
|
||||
+ err = bcm_ns_usb3_mdio_phy_write(usb3, BCM_NS_USB3_PHY_BASE_ADDR_REG,
|
||||
+ BCM_NS_USB3_PHY_PLL30_BLOCK);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
/* Assert Ana_Pllseq start */
|
||||
- bcm_ns_usb3_mii_mng_write32(usb3, 0x58061000);
|
||||
+ bcm_ns_usb3_mdio_phy_write(usb3, BCM_NS_USB3_PLL_CONTROL, 0x1000);
|
||||
|
||||
/* Assert CML Divider ratio to 26 */
|
||||
- bcm_ns_usb3_mii_mng_write32(usb3, 0x582a6400);
|
||||
+ bcm_ns_usb3_mdio_phy_write(usb3, BCM_NS_USB3_PLLA_CONTROL0, 0x6400);
|
||||
|
||||
/* Asserting PLL Reset */
|
||||
- bcm_ns_usb3_mii_mng_write32(usb3, 0x582ec000);
|
||||
+ bcm_ns_usb3_mdio_phy_write(usb3, BCM_NS_USB3_PLLA_CONTROL1, 0xc000);
|
||||
|
||||
/* Deaaserting PLL Reset */
|
||||
- bcm_ns_usb3_mii_mng_write32(usb3, 0x582e8000);
|
||||
+ bcm_ns_usb3_mdio_phy_write(usb3, BCM_NS_USB3_PLLA_CONTROL1, 0x8000);
|
||||
|
||||
/* Waiting MII Mgt interface idle */
|
||||
bcm_ns_usb3_mii_mng_wait_idle(usb3);
|
||||
@@ -125,22 +150,24 @@ static int bcm_ns_usb3_phy_init_ns_bx(st
|
||||
writel(0, usb3->dmp + BCMA_RESET_CTL);
|
||||
|
||||
/* PLL frequency monitor enable */
|
||||
- bcm_ns_usb3_mii_mng_write32(usb3, 0x58069000);
|
||||
+ bcm_ns_usb3_mdio_phy_write(usb3, BCM_NS_USB3_PLL_CONTROL, 0x9000);
|
||||
|
||||
/* PIPE Block */
|
||||
- bcm_ns_usb3_mii_mng_write32(usb3, 0x587e8060);
|
||||
+ bcm_ns_usb3_mdio_phy_write(usb3, BCM_NS_USB3_PHY_BASE_ADDR_REG,
|
||||
+ BCM_NS_USB3_PHY_PIPE_BLOCK);
|
||||
|
||||
/* CMPMAX & CMPMINTH setting */
|
||||
- bcm_ns_usb3_mii_mng_write32(usb3, 0x580af30d);
|
||||
+ bcm_ns_usb3_mdio_phy_write(usb3, BCM_NS_USB3_LFPS_CMP, 0xf30d);
|
||||
|
||||
/* DEGLITCH MIN & MAX setting */
|
||||
- bcm_ns_usb3_mii_mng_write32(usb3, 0x580e6302);
|
||||
+ bcm_ns_usb3_mdio_phy_write(usb3, BCM_NS_USB3_LFPS_DEGLITCH, 0x6302);
|
||||
|
||||
/* TXPMD block */
|
||||
- bcm_ns_usb3_mii_mng_write32(usb3, 0x587e8040);
|
||||
+ bcm_ns_usb3_mdio_phy_write(usb3, BCM_NS_USB3_PHY_BASE_ADDR_REG,
|
||||
+ BCM_NS_USB3_PHY_TX_PMD_BLOCK);
|
||||
|
||||
/* Enabling SSC */
|
||||
- bcm_ns_usb3_mii_mng_write32(usb3, 0x58061003);
|
||||
+ bcm_ns_usb3_mdio_phy_write(usb3, BCM_NS_USB3_TX_PMD_CONTROL1, 0x1003);
|
||||
|
||||
/* Waiting MII Mgt interface idle */
|
||||
bcm_ns_usb3_mii_mng_wait_idle(usb3);
|
||||
@@ -159,22 +186,24 @@ static int bcm_ns_usb3_phy_init_ns_ax(st
|
||||
udelay(2);
|
||||
|
||||
/* PLL30 block */
|
||||
- err = bcm_ns_usb3_mii_mng_write32(usb3, 0x587e8000);
|
||||
+ err = bcm_ns_usb3_mdio_phy_write(usb3, BCM_NS_USB3_PHY_BASE_ADDR_REG,
|
||||
+ BCM_NS_USB3_PHY_PLL30_BLOCK);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
- bcm_ns_usb3_mii_mng_write32(usb3, 0x582a6400);
|
||||
+ bcm_ns_usb3_mdio_phy_write(usb3, BCM_NS_USB3_PLLA_CONTROL0, 0x6400);
|
||||
|
||||
- bcm_ns_usb3_mii_mng_write32(usb3, 0x587e80e0);
|
||||
+ bcm_ns_usb3_mdio_phy_write(usb3, BCM_NS_USB3_PHY_BASE_ADDR_REG, 0x80e0);
|
||||
|
||||
- bcm_ns_usb3_mii_mng_write32(usb3, 0x580a009c);
|
||||
+ bcm_ns_usb3_mdio_phy_write(usb3, 0x02, 0x009c);
|
||||
|
||||
/* Enable SSC */
|
||||
- bcm_ns_usb3_mii_mng_write32(usb3, 0x587e8040);
|
||||
+ bcm_ns_usb3_mdio_phy_write(usb3, BCM_NS_USB3_PHY_BASE_ADDR_REG,
|
||||
+ BCM_NS_USB3_PHY_TX_PMD_BLOCK);
|
||||
|
||||
- bcm_ns_usb3_mii_mng_write32(usb3, 0x580a21d3);
|
||||
+ bcm_ns_usb3_mdio_phy_write(usb3, 0x02, 0x21d3);
|
||||
|
||||
- bcm_ns_usb3_mii_mng_write32(usb3, 0x58061003);
|
||||
+ bcm_ns_usb3_mdio_phy_write(usb3, BCM_NS_USB3_TX_PMD_CONTROL1, 0x1003);
|
||||
|
||||
/* Waiting MII Mgt interface idle */
|
||||
bcm_ns_usb3_mii_mng_wait_idle(usb3);
|
|
@ -1,75 +0,0 @@
|
|||
From 9faae5a37b266afca6914163316856c5ed4ec366 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
|
||||
Date: Sun, 1 Nov 2015 10:04:41 +0100
|
||||
Subject: [PATCH] USB: bcma: switch to GPIO descriptor for power control
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
So far we were using simple (legacy) GPIO functions & some poor logic to
|
||||
control power. It got many drawbacks: we were ignoring OF flags
|
||||
(GPIO_ACTIVE_LOW), we were not setting direction to output and we were
|
||||
assuming gpio_request success all the time.
|
||||
Fix it by switching to gpiod functions and adding appropriate checks.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
|
||||
Acked-by: Hauke Mehrtens <hauke@hauke-m.de>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/usb/host/bcma-hcd.c | 21 ++++++++++-----------
|
||||
1 file changed, 10 insertions(+), 11 deletions(-)
|
||||
|
||||
--- a/drivers/usb/host/bcma-hcd.c
|
||||
+++ b/drivers/usb/host/bcma-hcd.c
|
||||
@@ -21,6 +21,7 @@
|
||||
*/
|
||||
#include <linux/bcma/bcma.h>
|
||||
#include <linux/delay.h>
|
||||
+#include <linux/gpio/consumer.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/slab.h>
|
||||
@@ -36,6 +37,7 @@ MODULE_LICENSE("GPL");
|
||||
struct bcma_hcd_device {
|
||||
struct platform_device *ehci_dev;
|
||||
struct platform_device *ohci_dev;
|
||||
+ struct gpio_desc *gpio_desc;
|
||||
};
|
||||
|
||||
/* Wait for bitmask in a register to get set or cleared.
|
||||
@@ -228,19 +230,12 @@ static void bcma_hcd_init_chip_arm(struc
|
||||
|
||||
static void bcma_hci_platform_power_gpio(struct bcma_device *dev, bool val)
|
||||
{
|
||||
- int gpio;
|
||||
+ struct bcma_hcd_device *usb_dev = bcma_get_drvdata(dev);
|
||||
|
||||
- gpio = of_get_named_gpio(dev->dev.of_node, "vcc-gpio", 0);
|
||||
- if (!gpio_is_valid(gpio))
|
||||
+ if (IS_ERR_OR_NULL(usb_dev->gpio_desc))
|
||||
return;
|
||||
|
||||
- if (val) {
|
||||
- gpio_request(gpio, "bcma-hcd-gpio");
|
||||
- gpio_set_value(gpio, 1);
|
||||
- } else {
|
||||
- gpio_set_value(gpio, 0);
|
||||
- gpio_free(gpio);
|
||||
- }
|
||||
+ gpiod_set_value(usb_dev->gpio_desc, val);
|
||||
}
|
||||
|
||||
static const struct usb_ehci_pdata ehci_pdata = {
|
||||
@@ -314,7 +309,11 @@ static int bcma_hcd_probe(struct bcma_de
|
||||
if (!usb_dev)
|
||||
return -ENOMEM;
|
||||
|
||||
- bcma_hci_platform_power_gpio(dev, true);
|
||||
+ if (dev->dev.of_node)
|
||||
+ usb_dev->gpio_desc = devm_get_gpiod_from_child(&dev->dev, "vcc",
|
||||
+ &dev->dev.of_node->fwnode);
|
||||
+ if (!IS_ERR_OR_NULL(usb_dev->gpio_desc))
|
||||
+ gpiod_direction_output(usb_dev->gpio_desc, 1);
|
||||
|
||||
switch (dev->id.id) {
|
||||
case BCMA_CORE_NS_USB20:
|
|
@ -1,77 +0,0 @@
|
|||
From 352d9e2ee85b43170388599a17cd7b219f270163 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
|
||||
Date: Sat, 5 Dec 2015 13:15:06 +0100
|
||||
Subject: [PATCH] USB: bcma: make helper creating platform dev more generic
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Having "bool ohci" argument in bcma_hcd_create_pdev function limited it
|
||||
to support two cases only (OHCI and EHCI) and put too much logic in it.
|
||||
Lets make caller pass all required data. This adds few extra arguments
|
||||
to the function call but will allow us to reuse this code and handle
|
||||
more cases in the future (e.g. add XHCI support).
|
||||
|
||||
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/usb/host/bcma-hcd.c | 24 +++++++++++++-----------
|
||||
1 file changed, 13 insertions(+), 11 deletions(-)
|
||||
|
||||
--- a/drivers/usb/host/bcma-hcd.c
|
||||
+++ b/drivers/usb/host/bcma-hcd.c
|
||||
@@ -244,7 +244,10 @@ static const struct usb_ehci_pdata ehci_
|
||||
static const struct usb_ohci_pdata ohci_pdata = {
|
||||
};
|
||||
|
||||
-static struct platform_device *bcma_hcd_create_pdev(struct bcma_device *dev, bool ohci, u32 addr)
|
||||
+static struct platform_device *bcma_hcd_create_pdev(struct bcma_device *dev,
|
||||
+ const char *name, u32 addr,
|
||||
+ const void *data,
|
||||
+ size_t size)
|
||||
{
|
||||
struct platform_device *hci_dev;
|
||||
struct resource hci_res[2];
|
||||
@@ -259,8 +262,7 @@ static struct platform_device *bcma_hcd_
|
||||
hci_res[1].start = dev->irq;
|
||||
hci_res[1].flags = IORESOURCE_IRQ;
|
||||
|
||||
- hci_dev = platform_device_alloc(ohci ? "ohci-platform" :
|
||||
- "ehci-platform" , 0);
|
||||
+ hci_dev = platform_device_alloc(name, 0);
|
||||
if (!hci_dev)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
@@ -271,12 +273,8 @@ static struct platform_device *bcma_hcd_
|
||||
ARRAY_SIZE(hci_res));
|
||||
if (ret)
|
||||
goto err_alloc;
|
||||
- if (ohci)
|
||||
- ret = platform_device_add_data(hci_dev, &ohci_pdata,
|
||||
- sizeof(ohci_pdata));
|
||||
- else
|
||||
- ret = platform_device_add_data(hci_dev, &ehci_pdata,
|
||||
- sizeof(ehci_pdata));
|
||||
+ if (data)
|
||||
+ ret = platform_device_add_data(hci_dev, data, size);
|
||||
if (ret)
|
||||
goto err_alloc;
|
||||
ret = platform_device_add(hci_dev);
|
||||
@@ -333,11 +331,15 @@ static int bcma_hcd_probe(struct bcma_de
|
||||
&& chipinfo->rev == 0)
|
||||
ohci_addr = 0x18009000;
|
||||
|
||||
- usb_dev->ohci_dev = bcma_hcd_create_pdev(dev, true, ohci_addr);
|
||||
+ usb_dev->ohci_dev = bcma_hcd_create_pdev(dev, "ohci-platform",
|
||||
+ ohci_addr, &ohci_pdata,
|
||||
+ sizeof(ohci_pdata));
|
||||
if (IS_ERR(usb_dev->ohci_dev))
|
||||
return PTR_ERR(usb_dev->ohci_dev);
|
||||
|
||||
- usb_dev->ehci_dev = bcma_hcd_create_pdev(dev, false, dev->addr);
|
||||
+ usb_dev->ehci_dev = bcma_hcd_create_pdev(dev, "ehci-platform",
|
||||
+ dev->addr, &ehci_pdata,
|
||||
+ sizeof(ehci_pdata));
|
||||
if (IS_ERR(usb_dev->ehci_dev)) {
|
||||
err = PTR_ERR(usb_dev->ehci_dev);
|
||||
goto err_unregister_ohci_dev;
|
|
@ -1,116 +0,0 @@
|
|||
From adbff3a4f93d8501e8ae11906268e21b086d57ed Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
|
||||
Date: Sat, 5 Dec 2015 13:15:07 +0100
|
||||
Subject: [PATCH] USB: bcma: separate code initializing USB 2.0 core
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
This splits one big probing function into two smaller ones. The main one
|
||||
is now responsible for the generic stuff: allocating memory & enabling
|
||||
power using GPIO. The new one contains code that is specific to the USB
|
||||
2.0 bcma core.
|
||||
This will allow adding support for the USB 3.0 bcma core (handling XHCI)
|
||||
in the future.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/usb/host/bcma-hcd.c | 59 ++++++++++++++++++++++++++++++---------------
|
||||
1 file changed, 39 insertions(+), 20 deletions(-)
|
||||
|
||||
--- a/drivers/usb/host/bcma-hcd.c
|
||||
+++ b/drivers/usb/host/bcma-hcd.c
|
||||
@@ -35,6 +35,7 @@ MODULE_DESCRIPTION("Common USB driver fo
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
struct bcma_hcd_device {
|
||||
+ struct bcma_device *core;
|
||||
struct platform_device *ehci_dev;
|
||||
struct platform_device *ohci_dev;
|
||||
struct gpio_desc *gpio_desc;
|
||||
@@ -288,31 +289,16 @@ err_alloc:
|
||||
return ERR_PTR(ret);
|
||||
}
|
||||
|
||||
-static int bcma_hcd_probe(struct bcma_device *dev)
|
||||
+static int bcma_hcd_usb20_init(struct bcma_hcd_device *usb_dev)
|
||||
{
|
||||
- int err;
|
||||
+ struct bcma_device *dev = usb_dev->core;
|
||||
+ struct bcma_chipinfo *chipinfo = &dev->bus->chipinfo;
|
||||
u32 ohci_addr;
|
||||
- struct bcma_hcd_device *usb_dev;
|
||||
- struct bcma_chipinfo *chipinfo;
|
||||
-
|
||||
- chipinfo = &dev->bus->chipinfo;
|
||||
-
|
||||
- /* TODO: Probably need checks here; is the core connected? */
|
||||
+ int err;
|
||||
|
||||
if (dma_set_mask_and_coherent(dev->dma_dev, DMA_BIT_MASK(32)))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
- usb_dev = devm_kzalloc(&dev->dev, sizeof(struct bcma_hcd_device),
|
||||
- GFP_KERNEL);
|
||||
- if (!usb_dev)
|
||||
- return -ENOMEM;
|
||||
-
|
||||
- if (dev->dev.of_node)
|
||||
- usb_dev->gpio_desc = devm_get_gpiod_from_child(&dev->dev, "vcc",
|
||||
- &dev->dev.of_node->fwnode);
|
||||
- if (!IS_ERR_OR_NULL(usb_dev->gpio_desc))
|
||||
- gpiod_direction_output(usb_dev->gpio_desc, 1);
|
||||
-
|
||||
switch (dev->id.id) {
|
||||
case BCMA_CORE_NS_USB20:
|
||||
bcma_hcd_init_chip_arm(dev);
|
||||
@@ -345,7 +331,6 @@ static int bcma_hcd_probe(struct bcma_de
|
||||
goto err_unregister_ohci_dev;
|
||||
}
|
||||
|
||||
- bcma_set_drvdata(dev, usb_dev);
|
||||
return 0;
|
||||
|
||||
err_unregister_ohci_dev:
|
||||
@@ -353,6 +338,40 @@ err_unregister_ohci_dev:
|
||||
return err;
|
||||
}
|
||||
|
||||
+static int bcma_hcd_probe(struct bcma_device *core)
|
||||
+{
|
||||
+ int err;
|
||||
+ struct bcma_hcd_device *usb_dev;
|
||||
+
|
||||
+ /* TODO: Probably need checks here; is the core connected? */
|
||||
+
|
||||
+ usb_dev = devm_kzalloc(&core->dev, sizeof(struct bcma_hcd_device),
|
||||
+ GFP_KERNEL);
|
||||
+ if (!usb_dev)
|
||||
+ return -ENOMEM;
|
||||
+ usb_dev->core = core;
|
||||
+
|
||||
+ if (core->dev.of_node)
|
||||
+ usb_dev->gpio_desc = devm_get_gpiod_from_child(&core->dev, "vcc",
|
||||
+ &core->dev.of_node->fwnode);
|
||||
+ if (!IS_ERR_OR_NULL(usb_dev->gpio_desc))
|
||||
+ gpiod_direction_output(usb_dev->gpio_desc, 1);
|
||||
+
|
||||
+ switch (core->id.id) {
|
||||
+ case BCMA_CORE_USB20_HOST:
|
||||
+ case BCMA_CORE_NS_USB20:
|
||||
+ err = bcma_hcd_usb20_init(usb_dev);
|
||||
+ if (err)
|
||||
+ return err;
|
||||
+ break;
|
||||
+ default:
|
||||
+ return -ENODEV;
|
||||
+ }
|
||||
+
|
||||
+ bcma_set_drvdata(core, usb_dev);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static void bcma_hcd_remove(struct bcma_device *dev)
|
||||
{
|
||||
struct bcma_hcd_device *usb_dev = bcma_get_drvdata(dev);
|
|
@ -1,34 +0,0 @@
|
|||
From 1507372b97a098fd51b92c4dbdbbcd65cba26939 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
|
||||
Date: Wed, 23 Mar 2016 12:37:11 +0100
|
||||
Subject: [PATCH] USB: bcma: use simpler devm helper for getting vcc GPIO
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Thanks to switching to devm_gpiod_get:
|
||||
1) We don't have to pass fwnode pointer
|
||||
2) We can request initial GPIO value at getting call
|
||||
This was successfully tested on Netgear R6250 (BCM4708).
|
||||
|
||||
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/usb/host/bcma-hcd.c | 6 ++----
|
||||
1 file changed, 2 insertions(+), 4 deletions(-)
|
||||
|
||||
--- a/drivers/usb/host/bcma-hcd.c
|
||||
+++ b/drivers/usb/host/bcma-hcd.c
|
||||
@@ -352,10 +352,8 @@ static int bcma_hcd_probe(struct bcma_de
|
||||
usb_dev->core = core;
|
||||
|
||||
if (core->dev.of_node)
|
||||
- usb_dev->gpio_desc = devm_get_gpiod_from_child(&core->dev, "vcc",
|
||||
- &core->dev.of_node->fwnode);
|
||||
- if (!IS_ERR_OR_NULL(usb_dev->gpio_desc))
|
||||
- gpiod_direction_output(usb_dev->gpio_desc, 1);
|
||||
+ usb_dev->gpio_desc = devm_gpiod_get(&core->dev, "vcc",
|
||||
+ GPIOD_OUT_HIGH);
|
||||
|
||||
switch (core->id.id) {
|
||||
case BCMA_CORE_USB20_HOST:
|
|
@ -1,67 +0,0 @@
|
|||
From 3cc7e7b7872ebd0f200b5450f5471bc3700de141 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
|
||||
Date: Fri, 8 Jul 2016 14:02:50 +0200
|
||||
Subject: [PATCH] USB: bcma: initialize Northstar USB 3.0 controller
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
It's a rather simple controller, we just need to make sure USB is
|
||||
powered (using GPIO pin) and reset bus core. Once this is done it's
|
||||
safe to register XHCI controller and let it init PHY and do its magic.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/usb/host/bcma-hcd.c | 19 +++++++++++++++++++
|
||||
1 file changed, 19 insertions(+)
|
||||
|
||||
--- a/drivers/usb/host/bcma-hcd.c
|
||||
+++ b/drivers/usb/host/bcma-hcd.c
|
||||
@@ -27,6 +27,7 @@
|
||||
#include <linux/slab.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_gpio.h>
|
||||
+#include <linux/of_platform.h>
|
||||
#include <linux/usb/ehci_pdriver.h>
|
||||
#include <linux/usb/ohci_pdriver.h>
|
||||
|
||||
@@ -338,6 +339,18 @@ err_unregister_ohci_dev:
|
||||
return err;
|
||||
}
|
||||
|
||||
+static int bcma_hcd_usb30_init(struct bcma_hcd_device *bcma_hcd)
|
||||
+{
|
||||
+ struct bcma_device *core = bcma_hcd->core;
|
||||
+ struct device *dev = &core->dev;
|
||||
+
|
||||
+ bcma_core_enable(core, 0);
|
||||
+
|
||||
+ of_platform_default_populate(dev->of_node, NULL, dev);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static int bcma_hcd_probe(struct bcma_device *core)
|
||||
{
|
||||
int err;
|
||||
@@ -362,6 +375,11 @@ static int bcma_hcd_probe(struct bcma_de
|
||||
if (err)
|
||||
return err;
|
||||
break;
|
||||
+ case BCMA_CORE_NS_USB30:
|
||||
+ err = bcma_hcd_usb30_init(usb_dev);
|
||||
+ if (err)
|
||||
+ return err;
|
||||
+ break;
|
||||
default:
|
||||
return -ENODEV;
|
||||
}
|
||||
@@ -416,6 +434,7 @@ static int bcma_hcd_resume(struct bcma_d
|
||||
static const struct bcma_device_id bcma_hcd_table[] = {
|
||||
BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_USB20_HOST, BCMA_ANY_REV, BCMA_ANY_CLASS),
|
||||
BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_NS_USB20, BCMA_ANY_REV, BCMA_ANY_CLASS),
|
||||
+ BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_NS_USB30, BCMA_ANY_REV, BCMA_ANY_CLASS),
|
||||
{},
|
||||
};
|
||||
MODULE_DEVICE_TABLE(bcma, bcma_hcd_table);
|
|
@ -1,163 +0,0 @@
|
|||
From d6b76c4ddb124dd22c6e910ca9332e472e7b3273 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Wed, 10 Aug 2016 11:56:46 +0200
|
||||
Subject: [PATCH] USB: bcma: support old USB 2.0 controller on Northstar
|
||||
devices
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Currently bcma-hcd driver handles 3 different bcma cores:
|
||||
1) BCMA_CORE_USB20_HOST (0x819)
|
||||
2) BCMA_CORE_NS_USB20 (0x504)
|
||||
3) BCMA_CORE_NS_USB30 (0x505)
|
||||
|
||||
The first one was introduced years ago and so far was used on MIPS
|
||||
devices only. All Northstar (ARM) devices were using other two cores
|
||||
which allowed easy implementation of separated initialization paths.
|
||||
|
||||
It seems however Broadcom decided to reuse this old USB 2.0 controller
|
||||
on some recently introduced cheaper Northstar BCM53573 SoCs. I noticed
|
||||
this on Tenda AC9 (based on BCM47189B0 belonging to BCM53573 family).
|
||||
|
||||
There is no difference in this old controller core identification
|
||||
between MIPS and ARM devices: they share the same id and revision. We
|
||||
need different controller initialization procedure however.
|
||||
To handle this add a check for architecture and implement required
|
||||
initialization for ARM case.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/usb/host/bcma-hcd.c | 86 ++++++++++++++++++++++++++++++++++++++++--
|
||||
include/linux/bcma/bcma_regs.h | 1 +
|
||||
2 files changed, 83 insertions(+), 4 deletions(-)
|
||||
|
||||
--- a/drivers/usb/host/bcma-hcd.c
|
||||
+++ b/drivers/usb/host/bcma-hcd.c
|
||||
@@ -35,6 +35,9 @@ MODULE_AUTHOR("Hauke Mehrtens");
|
||||
MODULE_DESCRIPTION("Common USB driver for BCMA Bus");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
+/* See BCMA_CLKCTLST_EXTRESREQ and BCMA_CLKCTLST_EXTRESST */
|
||||
+#define USB_BCMA_CLKCTLST_USB_CLK_REQ 0x00000100
|
||||
+
|
||||
struct bcma_hcd_device {
|
||||
struct bcma_device *core;
|
||||
struct platform_device *ehci_dev;
|
||||
@@ -166,6 +169,76 @@ static void bcma_hcd_init_chip_mips(stru
|
||||
}
|
||||
}
|
||||
|
||||
+/**
|
||||
+ * bcma_hcd_usb20_old_arm_init - Initialize old USB 2.0 controller on ARM
|
||||
+ *
|
||||
+ * Old USB 2.0 core is identified as BCMA_CORE_USB20_HOST and was introduced
|
||||
+ * long before Northstar devices. It seems some cheaper chipsets like BCM53573
|
||||
+ * still use it.
|
||||
+ * Initialization of this old core differs between MIPS and ARM.
|
||||
+ */
|
||||
+static int bcma_hcd_usb20_old_arm_init(struct bcma_hcd_device *usb_dev)
|
||||
+{
|
||||
+ struct bcma_device *core = usb_dev->core;
|
||||
+ struct device *dev = &core->dev;
|
||||
+ struct bcma_device *pmu_core;
|
||||
+
|
||||
+ usleep_range(10000, 20000);
|
||||
+ if (core->id.rev < 5)
|
||||
+ return 0;
|
||||
+
|
||||
+ pmu_core = bcma_find_core(core->bus, BCMA_CORE_PMU);
|
||||
+ if (!pmu_core) {
|
||||
+ dev_err(dev, "Could not find PMU core\n");
|
||||
+ return -ENOENT;
|
||||
+ }
|
||||
+
|
||||
+ /* Take USB core out of reset */
|
||||
+ bcma_awrite32(core, BCMA_IOCTL, BCMA_IOCTL_CLK | BCMA_IOCTL_FGC);
|
||||
+ usleep_range(100, 200);
|
||||
+ bcma_awrite32(core, BCMA_RESET_CTL, BCMA_RESET_CTL_RESET);
|
||||
+ usleep_range(100, 200);
|
||||
+ bcma_awrite32(core, BCMA_RESET_CTL, 0);
|
||||
+ usleep_range(100, 200);
|
||||
+ bcma_awrite32(core, BCMA_IOCTL, BCMA_IOCTL_CLK);
|
||||
+ usleep_range(100, 200);
|
||||
+
|
||||
+ /* Enable Misc PLL */
|
||||
+ bcma_write32(core, BCMA_CLKCTLST, BCMA_CLKCTLST_FORCEHT |
|
||||
+ BCMA_CLKCTLST_HQCLKREQ |
|
||||
+ USB_BCMA_CLKCTLST_USB_CLK_REQ);
|
||||
+ usleep_range(100, 200);
|
||||
+
|
||||
+ bcma_write32(core, 0x510, 0xc7f85000);
|
||||
+ bcma_write32(core, 0x510, 0xc7f85003);
|
||||
+ usleep_range(300, 600);
|
||||
+
|
||||
+ /* Program USB PHY PLL parameters */
|
||||
+ bcma_write32(pmu_core, BCMA_CC_PMU_PLLCTL_ADDR, 0x6);
|
||||
+ bcma_write32(pmu_core, BCMA_CC_PMU_PLLCTL_DATA, 0x005360c1);
|
||||
+ usleep_range(100, 200);
|
||||
+ bcma_write32(pmu_core, BCMA_CC_PMU_PLLCTL_ADDR, 0x7);
|
||||
+ bcma_write32(pmu_core, BCMA_CC_PMU_PLLCTL_DATA, 0x0);
|
||||
+ usleep_range(100, 200);
|
||||
+ bcma_set32(pmu_core, BCMA_CC_PMU_CTL, BCMA_CC_PMU_CTL_PLL_UPD);
|
||||
+ usleep_range(100, 200);
|
||||
+
|
||||
+ bcma_write32(core, 0x510, 0x7f8d007);
|
||||
+ udelay(1000);
|
||||
+
|
||||
+ /* Take controller out of reset */
|
||||
+ bcma_write32(core, 0x200, 0x4ff);
|
||||
+ usleep_range(25, 50);
|
||||
+ bcma_write32(core, 0x200, 0x6ff);
|
||||
+ usleep_range(25, 50);
|
||||
+ bcma_write32(core, 0x200, 0x7ff);
|
||||
+ usleep_range(25, 50);
|
||||
+
|
||||
+ of_platform_default_populate(dev->of_node, NULL, dev);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static void bcma_hcd_init_chip_arm_phy(struct bcma_device *dev)
|
||||
{
|
||||
struct bcma_device *arm_core;
|
||||
@@ -370,19 +443,24 @@ static int bcma_hcd_probe(struct bcma_de
|
||||
|
||||
switch (core->id.id) {
|
||||
case BCMA_CORE_USB20_HOST:
|
||||
+ if (IS_ENABLED(CONFIG_ARM))
|
||||
+ err = bcma_hcd_usb20_old_arm_init(usb_dev);
|
||||
+ else if (IS_ENABLED(CONFIG_MIPS))
|
||||
+ err = bcma_hcd_usb20_init(usb_dev);
|
||||
+ else
|
||||
+ err = -ENOTSUPP;
|
||||
+ break;
|
||||
case BCMA_CORE_NS_USB20:
|
||||
err = bcma_hcd_usb20_init(usb_dev);
|
||||
- if (err)
|
||||
- return err;
|
||||
break;
|
||||
case BCMA_CORE_NS_USB30:
|
||||
err = bcma_hcd_usb30_init(usb_dev);
|
||||
- if (err)
|
||||
- return err;
|
||||
break;
|
||||
default:
|
||||
return -ENODEV;
|
||||
}
|
||||
+ if (err)
|
||||
+ return err;
|
||||
|
||||
bcma_set_drvdata(core, usb_dev);
|
||||
return 0;
|
||||
--- a/include/linux/bcma/bcma_regs.h
|
||||
+++ b/include/linux/bcma/bcma_regs.h
|
||||
@@ -10,6 +10,7 @@
|
||||
#define BCMA_CLKCTLST_HAVEALPREQ 0x00000008 /* ALP available request */
|
||||
#define BCMA_CLKCTLST_HAVEHTREQ 0x00000010 /* HT available request */
|
||||
#define BCMA_CLKCTLST_HWCROFF 0x00000020 /* Force HW clock request off */
|
||||
+#define BCMA_CLKCTLST_HQCLKREQ 0x00000040 /* HQ Clock */
|
||||
#define BCMA_CLKCTLST_EXTRESREQ 0x00000700 /* Mask of external resource requests */
|
||||
#define BCMA_CLKCTLST_EXTRESREQ_SHIFT 8
|
||||
#define BCMA_CLKCTLST_HAVEALP 0x00010000 /* ALP available */
|
|
@ -1,136 +0,0 @@
|
|||
From e8624859dde2ad07633dac7ec86629a516411ea1 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Wed, 21 Sep 2016 18:01:43 +0200
|
||||
Subject: [PATCH] USB: bcma: drop Northstar PHY 2.0 initialization code
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
This driver should initialize controller only, PHY initialization should
|
||||
be handled by separated PHY driver. We already have phy-bcm-ns-usb2 in
|
||||
place so let it makes its duty.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/usb/host/bcma-hcd.c | 80 ++++++++++++++-------------------------------
|
||||
1 file changed, 25 insertions(+), 55 deletions(-)
|
||||
|
||||
--- a/drivers/usb/host/bcma-hcd.c
|
||||
+++ b/drivers/usb/host/bcma-hcd.c
|
||||
@@ -239,44 +239,10 @@ static int bcma_hcd_usb20_old_arm_init(s
|
||||
return 0;
|
||||
}
|
||||
|
||||
-static void bcma_hcd_init_chip_arm_phy(struct bcma_device *dev)
|
||||
-{
|
||||
- struct bcma_device *arm_core;
|
||||
- void __iomem *dmu;
|
||||
-
|
||||
- arm_core = bcma_find_core(dev->bus, BCMA_CORE_ARMCA9);
|
||||
- if (!arm_core) {
|
||||
- dev_err(&dev->dev, "can not find ARM Cortex A9 ihost core\n");
|
||||
- return;
|
||||
- }
|
||||
-
|
||||
- dmu = ioremap_nocache(arm_core->addr_s[0], 0x1000);
|
||||
- if (!dmu) {
|
||||
- dev_err(&dev->dev, "can not map ARM Cortex A9 ihost core\n");
|
||||
- return;
|
||||
- }
|
||||
-
|
||||
- /* Unlock DMU PLL settings */
|
||||
- iowrite32(0x0000ea68, dmu + 0x180);
|
||||
-
|
||||
- /* Write USB 2.0 PLL control setting */
|
||||
- iowrite32(0x00dd10c3, dmu + 0x164);
|
||||
-
|
||||
- /* Lock DMU PLL settings */
|
||||
- iowrite32(0x00000000, dmu + 0x180);
|
||||
-
|
||||
- iounmap(dmu);
|
||||
-}
|
||||
-
|
||||
-static void bcma_hcd_init_chip_arm_hc(struct bcma_device *dev)
|
||||
+static void bcma_hcd_usb20_ns_init_hc(struct bcma_device *dev)
|
||||
{
|
||||
u32 val;
|
||||
|
||||
- /*
|
||||
- * Delay after PHY initialized to ensure HC is ready to be configured
|
||||
- */
|
||||
- usleep_range(1000, 2000);
|
||||
-
|
||||
/* Set packet buffer OUT threshold */
|
||||
val = bcma_read32(dev, 0x94);
|
||||
val &= 0xffff;
|
||||
@@ -287,20 +253,33 @@ static void bcma_hcd_init_chip_arm_hc(st
|
||||
val = bcma_read32(dev, 0x9c);
|
||||
val |= 1;
|
||||
bcma_write32(dev, 0x9c, val);
|
||||
+
|
||||
+ /*
|
||||
+ * Broadcom initializes PHY and then waits to ensure HC is ready to be
|
||||
+ * configured. In our case the order is reversed. We just initialized
|
||||
+ * controller and we let HCD initialize PHY, so let's wait (sleep) now.
|
||||
+ */
|
||||
+ usleep_range(1000, 2000);
|
||||
}
|
||||
|
||||
-static void bcma_hcd_init_chip_arm(struct bcma_device *dev)
|
||||
+/**
|
||||
+ * bcma_hcd_usb20_ns_init - Initialize Northstar USB 2.0 controller
|
||||
+ */
|
||||
+static int bcma_hcd_usb20_ns_init(struct bcma_hcd_device *bcma_hcd)
|
||||
{
|
||||
- bcma_core_enable(dev, 0);
|
||||
+ struct bcma_device *core = bcma_hcd->core;
|
||||
+ struct bcma_chipinfo *ci = &core->bus->chipinfo;
|
||||
+ struct device *dev = &core->dev;
|
||||
+
|
||||
+ bcma_core_enable(core, 0);
|
||||
|
||||
- if (dev->bus->chipinfo.id == BCMA_CHIP_ID_BCM4707 ||
|
||||
- dev->bus->chipinfo.id == BCMA_CHIP_ID_BCM53018) {
|
||||
- if (dev->bus->chipinfo.pkg == BCMA_PKG_ID_BCM4707 ||
|
||||
- dev->bus->chipinfo.pkg == BCMA_PKG_ID_BCM4708)
|
||||
- bcma_hcd_init_chip_arm_phy(dev);
|
||||
+ if (ci->id == BCMA_CHIP_ID_BCM4707 ||
|
||||
+ ci->id == BCMA_CHIP_ID_BCM53018)
|
||||
+ bcma_hcd_usb20_ns_init_hc(core);
|
||||
|
||||
- bcma_hcd_init_chip_arm_hc(dev);
|
||||
- }
|
||||
+ of_platform_default_populate(dev->of_node, NULL, dev);
|
||||
+
|
||||
+ return 0;
|
||||
}
|
||||
|
||||
static void bcma_hci_platform_power_gpio(struct bcma_device *dev, bool val)
|
||||
@@ -373,16 +352,7 @@ static int bcma_hcd_usb20_init(struct bc
|
||||
if (dma_set_mask_and_coherent(dev->dma_dev, DMA_BIT_MASK(32)))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
- switch (dev->id.id) {
|
||||
- case BCMA_CORE_NS_USB20:
|
||||
- bcma_hcd_init_chip_arm(dev);
|
||||
- break;
|
||||
- case BCMA_CORE_USB20_HOST:
|
||||
- bcma_hcd_init_chip_mips(dev);
|
||||
- break;
|
||||
- default:
|
||||
- return -ENODEV;
|
||||
- }
|
||||
+ bcma_hcd_init_chip_mips(dev);
|
||||
|
||||
/* In AI chips EHCI is addrspace 0, OHCI is 1 */
|
||||
ohci_addr = dev->addr_s[0];
|
||||
@@ -451,7 +421,7 @@ static int bcma_hcd_probe(struct bcma_de
|
||||
err = -ENOTSUPP;
|
||||
break;
|
||||
case BCMA_CORE_NS_USB20:
|
||||
- err = bcma_hcd_usb20_init(usb_dev);
|
||||
+ err = bcma_hcd_usb20_ns_init(usb_dev);
|
||||
break;
|
||||
case BCMA_CORE_NS_USB30:
|
||||
err = bcma_hcd_usb30_init(usb_dev);
|
|
@ -1,832 +0,0 @@
|
|||
From fa236a7ef24048bafaeed13f68df35a819794758 Mon Sep 17 00:00:00 2001
|
||||
From: Kamal Dasu <kdasu.kdev@gmail.com>
|
||||
Date: Wed, 24 Aug 2016 18:04:23 -0400
|
||||
Subject: [PATCH] spi: bcm-qspi: Add Broadcom MSPI driver
|
||||
|
||||
Master SPI driver for Broadcom settop, iProc SoCs. The driver
|
||||
is used for devices that use SPI protocol on BRCMSTB, NSP, NS2
|
||||
SoCs. SoC platform driver call exported porbe(), remove()
|
||||
and suspend/resume pm_ops implemented in this common driver.
|
||||
|
||||
Signed-off-by: Kamal Dasu <kdasu.kdev@gmail.com>
|
||||
Signed-off-by: Yendapally Reddy Dhananjaya Reddy
|
||||
Signed-off-by: Mark Brown <broonie@kernel.org>
|
||||
---
|
||||
drivers/spi/Kconfig | 10 +
|
||||
drivers/spi/Makefile | 1 +
|
||||
drivers/spi/spi-bcm-qspi.c | 712 +++++++++++++++++++++++++++++++++++++++++++++
|
||||
drivers/spi/spi-bcm-qspi.h | 63 ++++
|
||||
4 files changed, 786 insertions(+)
|
||||
create mode 100644 drivers/spi/spi-bcm-qspi.c
|
||||
create mode 100644 drivers/spi/spi-bcm-qspi.h
|
||||
|
||||
--- a/drivers/spi/Kconfig
|
||||
+++ b/drivers/spi/Kconfig
|
||||
@@ -147,6 +147,16 @@ config SPI_BCM63XX_HSSPI
|
||||
This enables support for the High Speed SPI controller present on
|
||||
newer Broadcom BCM63XX SoCs.
|
||||
|
||||
+config SPI_BCM_QSPI
|
||||
+ tristate "Broadcom BSPI and MSPI controller support"
|
||||
+ depends on ARCH_BRCMSTB || ARCH_BCM || ARCH_BCM_IPROC || COMPILE_TEST
|
||||
+ default ARCH_BCM_IPROC
|
||||
+ help
|
||||
+ Enables support for the Broadcom SPI flash and MSPI controller.
|
||||
+ Select this option for any one of BRCMSTB, iProc NSP and NS2 SoCs
|
||||
+ based platforms. This driver works for both SPI master for spi-nor
|
||||
+ flash device as well as MSPI device.
|
||||
+
|
||||
config SPI_BITBANG
|
||||
tristate "Utilities for Bitbanging SPI masters"
|
||||
help
|
||||
--- a/drivers/spi/Makefile
|
||||
+++ b/drivers/spi/Makefile
|
||||
@@ -19,6 +19,7 @@ obj-$(CONFIG_SPI_BCM2835AUX) += spi-bcm
|
||||
obj-$(CONFIG_SPI_BCM53XX) += spi-bcm53xx.o
|
||||
obj-$(CONFIG_SPI_BCM63XX) += spi-bcm63xx.o
|
||||
obj-$(CONFIG_SPI_BCM63XX_HSSPI) += spi-bcm63xx-hsspi.o
|
||||
+obj-$(CONFIG_SPI_BCM_QSPI) += spi-bcm-qspi.o
|
||||
obj-$(CONFIG_SPI_BFIN5XX) += spi-bfin5xx.o
|
||||
obj-$(CONFIG_SPI_ADI_V3) += spi-adi-v3.o
|
||||
obj-$(CONFIG_SPI_BFIN_SPORT) += spi-bfin-sport.o
|
||||
--- /dev/null
|
||||
+++ b/drivers/spi/spi-bcm-qspi.c
|
||||
@@ -0,0 +1,712 @@
|
||||
+/*
|
||||
+ * Driver for Broadcom BRCMSTB, NSP, NS2, Cygnus SPI Controllers
|
||||
+ *
|
||||
+ * Copyright 2016 Broadcom
|
||||
+ *
|
||||
+ * This program is free software; you can redistribute it and/or modify
|
||||
+ * it under the terms of the GNU General Public License, version 2, as
|
||||
+ * published by the Free Software Foundation (the "GPL").
|
||||
+ *
|
||||
+ * This program is distributed in the hope that it will be useful, but
|
||||
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
+ * General Public License version 2 (GPLv2) for more details.
|
||||
+ *
|
||||
+ * You should have received a copy of the GNU General Public License
|
||||
+ * version 2 (GPLv2) along with this source code.
|
||||
+ */
|
||||
+
|
||||
+#include <linux/clk.h>
|
||||
+#include <linux/delay.h>
|
||||
+#include <linux/device.h>
|
||||
+#include <linux/init.h>
|
||||
+#include <linux/interrupt.h>
|
||||
+#include <linux/io.h>
|
||||
+#include <linux/ioport.h>
|
||||
+#include <linux/kernel.h>
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/mtd/cfi.h>
|
||||
+#include <linux/mtd/spi-nor.h>
|
||||
+#include <linux/of.h>
|
||||
+#include <linux/of_irq.h>
|
||||
+#include <linux/platform_device.h>
|
||||
+#include <linux/slab.h>
|
||||
+#include <linux/spi/spi.h>
|
||||
+#include <linux/sysfs.h>
|
||||
+#include <linux/types.h>
|
||||
+#include "spi-bcm-qspi.h"
|
||||
+
|
||||
+#define DRIVER_NAME "bcm_qspi"
|
||||
+
|
||||
+/* MSPI register offsets */
|
||||
+#define MSPI_SPCR0_LSB 0x000
|
||||
+#define MSPI_SPCR0_MSB 0x004
|
||||
+#define MSPI_SPCR1_LSB 0x008
|
||||
+#define MSPI_SPCR1_MSB 0x00c
|
||||
+#define MSPI_NEWQP 0x010
|
||||
+#define MSPI_ENDQP 0x014
|
||||
+#define MSPI_SPCR2 0x018
|
||||
+#define MSPI_MSPI_STATUS 0x020
|
||||
+#define MSPI_CPTQP 0x024
|
||||
+#define MSPI_SPCR3 0x028
|
||||
+#define MSPI_TXRAM 0x040
|
||||
+#define MSPI_RXRAM 0x0c0
|
||||
+#define MSPI_CDRAM 0x140
|
||||
+#define MSPI_WRITE_LOCK 0x180
|
||||
+
|
||||
+#define MSPI_MASTER_BIT BIT(7)
|
||||
+
|
||||
+#define MSPI_NUM_CDRAM 16
|
||||
+#define MSPI_CDRAM_CONT_BIT BIT(7)
|
||||
+#define MSPI_CDRAM_BITSE_BIT BIT(6)
|
||||
+#define MSPI_CDRAM_PCS 0xf
|
||||
+
|
||||
+#define MSPI_SPCR2_SPE BIT(6)
|
||||
+#define MSPI_SPCR2_CONT_AFTER_CMD BIT(7)
|
||||
+
|
||||
+#define MSPI_MSPI_STATUS_SPIF BIT(0)
|
||||
+
|
||||
+#define INTR_BASE_BIT_SHIFT 0x02
|
||||
+#define INTR_COUNT 0x07
|
||||
+
|
||||
+#define NUM_CHIPSELECT 4
|
||||
+#define QSPI_SPBR_MIN 8U
|
||||
+#define QSPI_SPBR_MAX 255U
|
||||
+
|
||||
+#define OPCODE_DIOR 0xBB
|
||||
+#define OPCODE_QIOR 0xEB
|
||||
+#define OPCODE_DIOR_4B 0xBC
|
||||
+#define OPCODE_QIOR_4B 0xEC
|
||||
+
|
||||
+#define MAX_CMD_SIZE 6
|
||||
+
|
||||
+#define ADDR_4MB_MASK GENMASK(22, 0)
|
||||
+
|
||||
+/* stop at end of transfer, no other reason */
|
||||
+#define TRANS_STATUS_BREAK_NONE 0
|
||||
+/* stop at end of spi_message */
|
||||
+#define TRANS_STATUS_BREAK_EOM 1
|
||||
+/* stop at end of spi_transfer if delay */
|
||||
+#define TRANS_STATUS_BREAK_DELAY 2
|
||||
+/* stop at end of spi_transfer if cs_change */
|
||||
+#define TRANS_STATUS_BREAK_CS_CHANGE 4
|
||||
+/* stop if we run out of bytes */
|
||||
+#define TRANS_STATUS_BREAK_NO_BYTES 8
|
||||
+
|
||||
+/* events that make us stop filling TX slots */
|
||||
+#define TRANS_STATUS_BREAK_TX (TRANS_STATUS_BREAK_EOM | \
|
||||
+ TRANS_STATUS_BREAK_DELAY | \
|
||||
+ TRANS_STATUS_BREAK_CS_CHANGE)
|
||||
+
|
||||
+/* events that make us deassert CS */
|
||||
+#define TRANS_STATUS_BREAK_DESELECT (TRANS_STATUS_BREAK_EOM | \
|
||||
+ TRANS_STATUS_BREAK_CS_CHANGE)
|
||||
+
|
||||
+struct bcm_qspi_parms {
|
||||
+ u32 speed_hz;
|
||||
+ u8 mode;
|
||||
+ u8 bits_per_word;
|
||||
+};
|
||||
+
|
||||
+enum base_type {
|
||||
+ MSPI,
|
||||
+ CHIP_SELECT,
|
||||
+ BASEMAX,
|
||||
+};
|
||||
+
|
||||
+struct bcm_qspi_irq {
|
||||
+ const char *irq_name;
|
||||
+ const irq_handler_t irq_handler;
|
||||
+ u32 mask;
|
||||
+};
|
||||
+
|
||||
+struct bcm_qspi_dev_id {
|
||||
+ const struct bcm_qspi_irq *irqp;
|
||||
+ void *dev;
|
||||
+};
|
||||
+
|
||||
+struct qspi_trans {
|
||||
+ struct spi_transfer *trans;
|
||||
+ int byte;
|
||||
+};
|
||||
+
|
||||
+struct bcm_qspi {
|
||||
+ struct platform_device *pdev;
|
||||
+ struct spi_master *master;
|
||||
+ struct clk *clk;
|
||||
+ u32 base_clk;
|
||||
+ u32 max_speed_hz;
|
||||
+ void __iomem *base[BASEMAX];
|
||||
+ struct bcm_qspi_parms last_parms;
|
||||
+ struct qspi_trans trans_pos;
|
||||
+ int curr_cs;
|
||||
+ u32 s3_strap_override_ctrl;
|
||||
+ bool big_endian;
|
||||
+ int num_irqs;
|
||||
+ struct bcm_qspi_dev_id *dev_ids;
|
||||
+ struct completion mspi_done;
|
||||
+};
|
||||
+
|
||||
+/* Read qspi controller register*/
|
||||
+static inline u32 bcm_qspi_read(struct bcm_qspi *qspi, enum base_type type,
|
||||
+ unsigned int offset)
|
||||
+{
|
||||
+ return bcm_qspi_readl(qspi->big_endian, qspi->base[type] + offset);
|
||||
+}
|
||||
+
|
||||
+/* Write qspi controller register*/
|
||||
+static inline void bcm_qspi_write(struct bcm_qspi *qspi, enum base_type type,
|
||||
+ unsigned int offset, unsigned int data)
|
||||
+{
|
||||
+ bcm_qspi_writel(qspi->big_endian, data, qspi->base[type] + offset);
|
||||
+}
|
||||
+
|
||||
+static void bcm_qspi_chip_select(struct bcm_qspi *qspi, int cs)
|
||||
+{
|
||||
+ u32 data = 0;
|
||||
+
|
||||
+ if (qspi->curr_cs == cs)
|
||||
+ return;
|
||||
+ if (qspi->base[CHIP_SELECT]) {
|
||||
+ data = bcm_qspi_read(qspi, CHIP_SELECT, 0);
|
||||
+ data = (data & ~0xff) | (1 << cs);
|
||||
+ bcm_qspi_write(qspi, CHIP_SELECT, 0, data);
|
||||
+ usleep_range(10, 20);
|
||||
+ }
|
||||
+ qspi->curr_cs = cs;
|
||||
+}
|
||||
+
|
||||
+/* MSPI helpers */
|
||||
+static void bcm_qspi_hw_set_parms(struct bcm_qspi *qspi,
|
||||
+ const struct bcm_qspi_parms *xp)
|
||||
+{
|
||||
+ u32 spcr, spbr = 0;
|
||||
+
|
||||
+ if (xp->speed_hz)
|
||||
+ spbr = qspi->base_clk / (2 * xp->speed_hz);
|
||||
+
|
||||
+ spcr = clamp_val(spbr, QSPI_SPBR_MIN, QSPI_SPBR_MAX);
|
||||
+ bcm_qspi_write(qspi, MSPI, MSPI_SPCR0_LSB, spcr);
|
||||
+
|
||||
+ spcr = MSPI_MASTER_BIT;
|
||||
+ /* for 16 bit the data should be zero */
|
||||
+ if (xp->bits_per_word != 16)
|
||||
+ spcr |= xp->bits_per_word << 2;
|
||||
+ spcr |= xp->mode & 3;
|
||||
+ bcm_qspi_write(qspi, MSPI, MSPI_SPCR0_MSB, spcr);
|
||||
+
|
||||
+ qspi->last_parms = *xp;
|
||||
+}
|
||||
+
|
||||
+static void bcm_qspi_update_parms(struct bcm_qspi *qspi,
|
||||
+ struct spi_device *spi,
|
||||
+ struct spi_transfer *trans)
|
||||
+{
|
||||
+ struct bcm_qspi_parms xp;
|
||||
+
|
||||
+ xp.speed_hz = trans->speed_hz;
|
||||
+ xp.bits_per_word = trans->bits_per_word;
|
||||
+ xp.mode = spi->mode;
|
||||
+
|
||||
+ bcm_qspi_hw_set_parms(qspi, &xp);
|
||||
+}
|
||||
+
|
||||
+static int bcm_qspi_setup(struct spi_device *spi)
|
||||
+{
|
||||
+ struct bcm_qspi_parms *xp;
|
||||
+
|
||||
+ if (spi->bits_per_word > 16)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ xp = spi_get_ctldata(spi);
|
||||
+ if (!xp) {
|
||||
+ xp = kzalloc(sizeof(*xp), GFP_KERNEL);
|
||||
+ if (!xp)
|
||||
+ return -ENOMEM;
|
||||
+ spi_set_ctldata(spi, xp);
|
||||
+ }
|
||||
+ xp->speed_hz = spi->max_speed_hz;
|
||||
+ xp->mode = spi->mode;
|
||||
+
|
||||
+ if (spi->bits_per_word)
|
||||
+ xp->bits_per_word = spi->bits_per_word;
|
||||
+ else
|
||||
+ xp->bits_per_word = 8;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int update_qspi_trans_byte_count(struct bcm_qspi *qspi,
|
||||
+ struct qspi_trans *qt, int flags)
|
||||
+{
|
||||
+ int ret = TRANS_STATUS_BREAK_NONE;
|
||||
+
|
||||
+ /* count the last transferred bytes */
|
||||
+ if (qt->trans->bits_per_word <= 8)
|
||||
+ qt->byte++;
|
||||
+ else
|
||||
+ qt->byte += 2;
|
||||
+
|
||||
+ if (qt->byte >= qt->trans->len) {
|
||||
+ /* we're at the end of the spi_transfer */
|
||||
+
|
||||
+ /* in TX mode, need to pause for a delay or CS change */
|
||||
+ if (qt->trans->delay_usecs &&
|
||||
+ (flags & TRANS_STATUS_BREAK_DELAY))
|
||||
+ ret |= TRANS_STATUS_BREAK_DELAY;
|
||||
+ if (qt->trans->cs_change &&
|
||||
+ (flags & TRANS_STATUS_BREAK_CS_CHANGE))
|
||||
+ ret |= TRANS_STATUS_BREAK_CS_CHANGE;
|
||||
+ if (ret)
|
||||
+ goto done;
|
||||
+
|
||||
+ dev_dbg(&qspi->pdev->dev, "advance msg exit\n");
|
||||
+ if (spi_transfer_is_last(qspi->master, qt->trans))
|
||||
+ ret = TRANS_STATUS_BREAK_EOM;
|
||||
+ else
|
||||
+ ret = TRANS_STATUS_BREAK_NO_BYTES;
|
||||
+
|
||||
+ qt->trans = NULL;
|
||||
+ }
|
||||
+
|
||||
+done:
|
||||
+ dev_dbg(&qspi->pdev->dev, "trans %p len %d byte %d ret %x\n",
|
||||
+ qt->trans, qt->trans ? qt->trans->len : 0, qt->byte, ret);
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+static inline u8 read_rxram_slot_u8(struct bcm_qspi *qspi, int slot)
|
||||
+{
|
||||
+ u32 slot_offset = MSPI_RXRAM + (slot << 3) + 0x4;
|
||||
+
|
||||
+ /* mask out reserved bits */
|
||||
+ return bcm_qspi_read(qspi, MSPI, slot_offset) & 0xff;
|
||||
+}
|
||||
+
|
||||
+static inline u16 read_rxram_slot_u16(struct bcm_qspi *qspi, int slot)
|
||||
+{
|
||||
+ u32 reg_offset = MSPI_RXRAM;
|
||||
+ u32 lsb_offset = reg_offset + (slot << 3) + 0x4;
|
||||
+ u32 msb_offset = reg_offset + (slot << 3);
|
||||
+
|
||||
+ return (bcm_qspi_read(qspi, MSPI, lsb_offset) & 0xff) |
|
||||
+ ((bcm_qspi_read(qspi, MSPI, msb_offset) & 0xff) << 8);
|
||||
+}
|
||||
+
|
||||
+static void read_from_hw(struct bcm_qspi *qspi, int slots)
|
||||
+{
|
||||
+ struct qspi_trans tp;
|
||||
+ int slot;
|
||||
+
|
||||
+ if (slots > MSPI_NUM_CDRAM) {
|
||||
+ /* should never happen */
|
||||
+ dev_err(&qspi->pdev->dev, "%s: too many slots!\n", __func__);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ tp = qspi->trans_pos;
|
||||
+
|
||||
+ for (slot = 0; slot < slots; slot++) {
|
||||
+ if (tp.trans->bits_per_word <= 8) {
|
||||
+ u8 *buf = tp.trans->rx_buf;
|
||||
+
|
||||
+ if (buf)
|
||||
+ buf[tp.byte] = read_rxram_slot_u8(qspi, slot);
|
||||
+ dev_dbg(&qspi->pdev->dev, "RD %02x\n",
|
||||
+ buf ? buf[tp.byte] : 0xff);
|
||||
+ } else {
|
||||
+ u16 *buf = tp.trans->rx_buf;
|
||||
+
|
||||
+ if (buf)
|
||||
+ buf[tp.byte / 2] = read_rxram_slot_u16(qspi,
|
||||
+ slot);
|
||||
+ dev_dbg(&qspi->pdev->dev, "RD %04x\n",
|
||||
+ buf ? buf[tp.byte] : 0xffff);
|
||||
+ }
|
||||
+
|
||||
+ update_qspi_trans_byte_count(qspi, &tp,
|
||||
+ TRANS_STATUS_BREAK_NONE);
|
||||
+ }
|
||||
+
|
||||
+ qspi->trans_pos = tp;
|
||||
+}
|
||||
+
|
||||
+static inline void write_txram_slot_u8(struct bcm_qspi *qspi, int slot,
|
||||
+ u8 val)
|
||||
+{
|
||||
+ u32 reg_offset = MSPI_TXRAM + (slot << 3);
|
||||
+
|
||||
+ /* mask out reserved bits */
|
||||
+ bcm_qspi_write(qspi, MSPI, reg_offset, val);
|
||||
+}
|
||||
+
|
||||
+static inline void write_txram_slot_u16(struct bcm_qspi *qspi, int slot,
|
||||
+ u16 val)
|
||||
+{
|
||||
+ u32 reg_offset = MSPI_TXRAM;
|
||||
+ u32 msb_offset = reg_offset + (slot << 3);
|
||||
+ u32 lsb_offset = reg_offset + (slot << 3) + 0x4;
|
||||
+
|
||||
+ bcm_qspi_write(qspi, MSPI, msb_offset, (val >> 8));
|
||||
+ bcm_qspi_write(qspi, MSPI, lsb_offset, (val & 0xff));
|
||||
+}
|
||||
+
|
||||
+static inline u32 read_cdram_slot(struct bcm_qspi *qspi, int slot)
|
||||
+{
|
||||
+ return bcm_qspi_read(qspi, MSPI, MSPI_CDRAM + (slot << 2));
|
||||
+}
|
||||
+
|
||||
+static inline void write_cdram_slot(struct bcm_qspi *qspi, int slot, u32 val)
|
||||
+{
|
||||
+ bcm_qspi_write(qspi, MSPI, (MSPI_CDRAM + (slot << 2)), val);
|
||||
+}
|
||||
+
|
||||
+/* Return number of slots written */
|
||||
+static int write_to_hw(struct bcm_qspi *qspi, struct spi_device *spi)
|
||||
+{
|
||||
+ struct qspi_trans tp;
|
||||
+ int slot = 0, tstatus = 0;
|
||||
+ u32 mspi_cdram = 0;
|
||||
+
|
||||
+ tp = qspi->trans_pos;
|
||||
+ bcm_qspi_update_parms(qspi, spi, tp.trans);
|
||||
+
|
||||
+ /* Run until end of transfer or reached the max data */
|
||||
+ while (!tstatus && slot < MSPI_NUM_CDRAM) {
|
||||
+ if (tp.trans->bits_per_word <= 8) {
|
||||
+ const u8 *buf = tp.trans->tx_buf;
|
||||
+ u8 val = buf ? buf[tp.byte] : 0xff;
|
||||
+
|
||||
+ write_txram_slot_u8(qspi, slot, val);
|
||||
+ dev_dbg(&qspi->pdev->dev, "WR %02x\n", val);
|
||||
+ } else {
|
||||
+ const u16 *buf = tp.trans->tx_buf;
|
||||
+ u16 val = buf ? buf[tp.byte / 2] : 0xffff;
|
||||
+
|
||||
+ write_txram_slot_u16(qspi, slot, val);
|
||||
+ dev_dbg(&qspi->pdev->dev, "WR %04x\n", val);
|
||||
+ }
|
||||
+ mspi_cdram = MSPI_CDRAM_CONT_BIT;
|
||||
+ mspi_cdram |= (~(1 << spi->chip_select) &
|
||||
+ MSPI_CDRAM_PCS);
|
||||
+ mspi_cdram |= ((tp.trans->bits_per_word <= 8) ? 0 :
|
||||
+ MSPI_CDRAM_BITSE_BIT);
|
||||
+
|
||||
+ write_cdram_slot(qspi, slot, mspi_cdram);
|
||||
+
|
||||
+ tstatus = update_qspi_trans_byte_count(qspi, &tp,
|
||||
+ TRANS_STATUS_BREAK_TX);
|
||||
+ slot++;
|
||||
+ }
|
||||
+
|
||||
+ if (!slot) {
|
||||
+ dev_err(&qspi->pdev->dev, "%s: no data to send?", __func__);
|
||||
+ goto done;
|
||||
+ }
|
||||
+
|
||||
+ dev_dbg(&qspi->pdev->dev, "submitting %d slots\n", slot);
|
||||
+ bcm_qspi_write(qspi, MSPI, MSPI_NEWQP, 0);
|
||||
+ bcm_qspi_write(qspi, MSPI, MSPI_ENDQP, slot - 1);
|
||||
+
|
||||
+ if (tstatus & TRANS_STATUS_BREAK_DESELECT) {
|
||||
+ mspi_cdram = read_cdram_slot(qspi, slot - 1) &
|
||||
+ ~MSPI_CDRAM_CONT_BIT;
|
||||
+ write_cdram_slot(qspi, slot - 1, mspi_cdram);
|
||||
+ }
|
||||
+
|
||||
+ /* Must flush previous writes before starting MSPI operation */
|
||||
+ mb();
|
||||
+ /* Set cont | spe | spifie */
|
||||
+ bcm_qspi_write(qspi, MSPI, MSPI_SPCR2, 0xe0);
|
||||
+
|
||||
+done:
|
||||
+ return slot;
|
||||
+}
|
||||
+
|
||||
+static int bcm_qspi_transfer_one(struct spi_master *master,
|
||||
+ struct spi_device *spi,
|
||||
+ struct spi_transfer *trans)
|
||||
+{
|
||||
+ struct bcm_qspi *qspi = spi_master_get_devdata(master);
|
||||
+ int slots;
|
||||
+ unsigned long timeo = msecs_to_jiffies(100);
|
||||
+
|
||||
+ bcm_qspi_chip_select(qspi, spi->chip_select);
|
||||
+ qspi->trans_pos.trans = trans;
|
||||
+ qspi->trans_pos.byte = 0;
|
||||
+
|
||||
+ while (qspi->trans_pos.byte < trans->len) {
|
||||
+ reinit_completion(&qspi->mspi_done);
|
||||
+
|
||||
+ slots = write_to_hw(qspi, spi);
|
||||
+ if (!wait_for_completion_timeout(&qspi->mspi_done, timeo)) {
|
||||
+ dev_err(&qspi->pdev->dev, "timeout waiting for MSPI\n");
|
||||
+ return -ETIMEDOUT;
|
||||
+ }
|
||||
+
|
||||
+ read_from_hw(qspi, slots);
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static void bcm_qspi_cleanup(struct spi_device *spi)
|
||||
+{
|
||||
+ struct bcm_qspi_parms *xp = spi_get_ctldata(spi);
|
||||
+
|
||||
+ kfree(xp);
|
||||
+}
|
||||
+
|
||||
+static irqreturn_t bcm_qspi_mspi_l2_isr(int irq, void *dev_id)
|
||||
+{
|
||||
+ struct bcm_qspi_dev_id *qspi_dev_id = dev_id;
|
||||
+ struct bcm_qspi *qspi = qspi_dev_id->dev;
|
||||
+ u32 status = bcm_qspi_read(qspi, MSPI, MSPI_MSPI_STATUS);
|
||||
+
|
||||
+ if (status & MSPI_MSPI_STATUS_SPIF) {
|
||||
+ /* clear interrupt */
|
||||
+ status &= ~MSPI_MSPI_STATUS_SPIF;
|
||||
+ bcm_qspi_write(qspi, MSPI, MSPI_MSPI_STATUS, status);
|
||||
+ complete(&qspi->mspi_done);
|
||||
+ return IRQ_HANDLED;
|
||||
+ } else {
|
||||
+ return IRQ_NONE;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static const struct bcm_qspi_irq qspi_irq_tab[] = {
|
||||
+ {
|
||||
+ .irq_name = "mspi_done",
|
||||
+ .irq_handler = bcm_qspi_mspi_l2_isr,
|
||||
+ .mask = INTR_MSPI_DONE_MASK,
|
||||
+ },
|
||||
+ {
|
||||
+ .irq_name = "mspi_halted",
|
||||
+ .irq_handler = bcm_qspi_mspi_l2_isr,
|
||||
+ .mask = INTR_MSPI_HALTED_MASK,
|
||||
+ },
|
||||
+};
|
||||
+
|
||||
+static void bcm_qspi_hw_init(struct bcm_qspi *qspi)
|
||||
+{
|
||||
+ struct bcm_qspi_parms parms;
|
||||
+
|
||||
+ bcm_qspi_write(qspi, MSPI, MSPI_SPCR1_LSB, 0);
|
||||
+ bcm_qspi_write(qspi, MSPI, MSPI_SPCR1_MSB, 0);
|
||||
+ bcm_qspi_write(qspi, MSPI, MSPI_NEWQP, 0);
|
||||
+ bcm_qspi_write(qspi, MSPI, MSPI_ENDQP, 0);
|
||||
+ bcm_qspi_write(qspi, MSPI, MSPI_SPCR2, 0x20);
|
||||
+
|
||||
+ parms.mode = SPI_MODE_3;
|
||||
+ parms.bits_per_word = 8;
|
||||
+ parms.speed_hz = qspi->max_speed_hz;
|
||||
+ bcm_qspi_hw_set_parms(qspi, &parms);
|
||||
+}
|
||||
+
|
||||
+static void bcm_qspi_hw_uninit(struct bcm_qspi *qspi)
|
||||
+{
|
||||
+ bcm_qspi_write(qspi, MSPI, MSPI_SPCR2, 0);
|
||||
+}
|
||||
+
|
||||
+static const struct of_device_id bcm_qspi_of_match[] = {
|
||||
+ { .compatible = "brcm,spi-bcm-qspi" },
|
||||
+ {},
|
||||
+};
|
||||
+MODULE_DEVICE_TABLE(of, bcm_qspi_of_match);
|
||||
+
|
||||
+int bcm_qspi_probe(struct platform_device *pdev,
|
||||
+ struct bcm_qspi_soc_intc *soc)
|
||||
+{
|
||||
+ struct device *dev = &pdev->dev;
|
||||
+ struct bcm_qspi *qspi;
|
||||
+ struct spi_master *master;
|
||||
+ struct resource *res;
|
||||
+ int irq, ret = 0, num_ints = 0;
|
||||
+ u32 val;
|
||||
+ const char *name = NULL;
|
||||
+ int num_irqs = ARRAY_SIZE(qspi_irq_tab);
|
||||
+
|
||||
+ /* We only support device-tree instantiation */
|
||||
+ if (!dev->of_node)
|
||||
+ return -ENODEV;
|
||||
+
|
||||
+ if (!of_match_node(bcm_qspi_of_match, dev->of_node))
|
||||
+ return -ENODEV;
|
||||
+
|
||||
+ master = spi_alloc_master(dev, sizeof(struct bcm_qspi));
|
||||
+ if (!master) {
|
||||
+ dev_err(dev, "error allocating spi_master\n");
|
||||
+ return -ENOMEM;
|
||||
+ }
|
||||
+
|
||||
+ qspi = spi_master_get_devdata(master);
|
||||
+ qspi->pdev = pdev;
|
||||
+ qspi->trans_pos.trans = NULL;
|
||||
+ qspi->trans_pos.byte = 0;
|
||||
+ qspi->master = master;
|
||||
+
|
||||
+ master->bus_num = -1;
|
||||
+ master->mode_bits = SPI_CPHA | SPI_CPOL | SPI_RX_DUAL | SPI_RX_QUAD;
|
||||
+ master->setup = bcm_qspi_setup;
|
||||
+ master->transfer_one = bcm_qspi_transfer_one;
|
||||
+ master->cleanup = bcm_qspi_cleanup;
|
||||
+ master->dev.of_node = dev->of_node;
|
||||
+ master->num_chipselect = NUM_CHIPSELECT;
|
||||
+
|
||||
+ qspi->big_endian = of_device_is_big_endian(dev->of_node);
|
||||
+
|
||||
+ if (!of_property_read_u32(dev->of_node, "num-cs", &val))
|
||||
+ master->num_chipselect = val;
|
||||
+
|
||||
+ res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "hif_mspi");
|
||||
+ if (!res)
|
||||
+ res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
|
||||
+ "mspi");
|
||||
+
|
||||
+ if (res) {
|
||||
+ qspi->base[MSPI] = devm_ioremap_resource(dev, res);
|
||||
+ if (IS_ERR(qspi->base[MSPI])) {
|
||||
+ ret = PTR_ERR(qspi->base[MSPI]);
|
||||
+ goto qspi_probe_err;
|
||||
+ }
|
||||
+ } else {
|
||||
+ goto qspi_probe_err;
|
||||
+ }
|
||||
+
|
||||
+ res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "cs_reg");
|
||||
+ if (res) {
|
||||
+ qspi->base[CHIP_SELECT] = devm_ioremap_resource(dev, res);
|
||||
+ if (IS_ERR(qspi->base[CHIP_SELECT])) {
|
||||
+ ret = PTR_ERR(qspi->base[CHIP_SELECT]);
|
||||
+ goto qspi_probe_err;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ qspi->dev_ids = kcalloc(num_irqs, sizeof(struct bcm_qspi_dev_id),
|
||||
+ GFP_KERNEL);
|
||||
+ if (IS_ERR(qspi->dev_ids)) {
|
||||
+ ret = PTR_ERR(qspi->dev_ids);
|
||||
+ goto qspi_probe_err;
|
||||
+ }
|
||||
+
|
||||
+ for (val = 0; val < num_irqs; val++) {
|
||||
+ irq = -1;
|
||||
+ name = qspi_irq_tab[val].irq_name;
|
||||
+ irq = platform_get_irq_byname(pdev, name);
|
||||
+
|
||||
+ if (irq >= 0) {
|
||||
+ ret = devm_request_irq(&pdev->dev, irq,
|
||||
+ qspi_irq_tab[val].irq_handler, 0,
|
||||
+ name,
|
||||
+ &qspi->dev_ids[val]);
|
||||
+ if (ret < 0) {
|
||||
+ dev_err(&pdev->dev, "IRQ %s not found\n", name);
|
||||
+ goto qspi_probe_err;
|
||||
+ }
|
||||
+
|
||||
+ qspi->dev_ids[val].dev = qspi;
|
||||
+ qspi->dev_ids[val].irqp = &qspi_irq_tab[val];
|
||||
+ num_ints++;
|
||||
+ dev_dbg(&pdev->dev, "registered IRQ %s %d\n",
|
||||
+ qspi_irq_tab[val].irq_name,
|
||||
+ irq);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ if (!num_ints) {
|
||||
+ dev_err(&pdev->dev, "no IRQs registered, cannot init driver\n");
|
||||
+ goto qspi_probe_err;
|
||||
+ }
|
||||
+
|
||||
+ qspi->clk = devm_clk_get(&pdev->dev, NULL);
|
||||
+ if (IS_ERR(qspi->clk)) {
|
||||
+ dev_warn(dev, "unable to get clock\n");
|
||||
+ goto qspi_probe_err;
|
||||
+ }
|
||||
+
|
||||
+ ret = clk_prepare_enable(qspi->clk);
|
||||
+ if (ret) {
|
||||
+ dev_err(dev, "failed to prepare clock\n");
|
||||
+ goto qspi_probe_err;
|
||||
+ }
|
||||
+
|
||||
+ qspi->base_clk = clk_get_rate(qspi->clk);
|
||||
+ qspi->max_speed_hz = qspi->base_clk / (QSPI_SPBR_MIN * 2);
|
||||
+
|
||||
+ bcm_qspi_hw_init(qspi);
|
||||
+ init_completion(&qspi->mspi_done);
|
||||
+ qspi->curr_cs = -1;
|
||||
+
|
||||
+ platform_set_drvdata(pdev, qspi);
|
||||
+ ret = devm_spi_register_master(&pdev->dev, master);
|
||||
+ if (ret < 0) {
|
||||
+ dev_err(dev, "can't register master\n");
|
||||
+ goto qspi_reg_err;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+
|
||||
+qspi_reg_err:
|
||||
+ bcm_qspi_hw_uninit(qspi);
|
||||
+ clk_disable_unprepare(qspi->clk);
|
||||
+qspi_probe_err:
|
||||
+ spi_master_put(master);
|
||||
+ kfree(qspi->dev_ids);
|
||||
+ return ret;
|
||||
+}
|
||||
+/* probe function to be called by SoC specific platform driver probe */
|
||||
+EXPORT_SYMBOL_GPL(bcm_qspi_probe);
|
||||
+
|
||||
+int bcm_qspi_remove(struct platform_device *pdev)
|
||||
+{
|
||||
+ struct bcm_qspi *qspi = platform_get_drvdata(pdev);
|
||||
+
|
||||
+ platform_set_drvdata(pdev, NULL);
|
||||
+ bcm_qspi_hw_uninit(qspi);
|
||||
+ clk_disable_unprepare(qspi->clk);
|
||||
+ kfree(qspi->dev_ids);
|
||||
+ spi_unregister_master(qspi->master);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+/* function to be called by SoC specific platform driver remove() */
|
||||
+EXPORT_SYMBOL_GPL(bcm_qspi_remove);
|
||||
+
|
||||
+#ifdef CONFIG_PM_SLEEP
|
||||
+static int bcm_qspi_suspend(struct device *dev)
|
||||
+{
|
||||
+ struct bcm_qspi *qspi = dev_get_drvdata(dev);
|
||||
+
|
||||
+ spi_master_suspend(qspi->master);
|
||||
+ clk_disable(qspi->clk);
|
||||
+ bcm_qspi_hw_uninit(qspi);
|
||||
+
|
||||
+ return 0;
|
||||
+};
|
||||
+
|
||||
+static int bcm_qspi_resume(struct device *dev)
|
||||
+{
|
||||
+ struct bcm_qspi *qspi = dev_get_drvdata(dev);
|
||||
+ int ret = 0;
|
||||
+
|
||||
+ bcm_qspi_hw_init(qspi);
|
||||
+ bcm_qspi_chip_select(qspi, qspi->curr_cs);
|
||||
+ ret = clk_enable(qspi->clk);
|
||||
+ if (!ret)
|
||||
+ spi_master_resume(qspi->master);
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
+#endif /* CONFIG_PM_SLEEP */
|
||||
+
|
||||
+const struct dev_pm_ops bcm_qspi_pm_ops = {
|
||||
+ .suspend = bcm_qspi_suspend,
|
||||
+ .resume = bcm_qspi_resume,
|
||||
+};
|
||||
+/* pm_ops to be called by SoC specific platform driver */
|
||||
+EXPORT_SYMBOL_GPL(bcm_qspi_pm_ops);
|
||||
+
|
||||
+MODULE_AUTHOR("Kamal Dasu");
|
||||
+MODULE_DESCRIPTION("Broadcom QSPI driver");
|
||||
+MODULE_LICENSE("GPL v2");
|
||||
+MODULE_ALIAS("platform:" DRIVER_NAME);
|
||||
--- /dev/null
|
||||
+++ b/drivers/spi/spi-bcm-qspi.h
|
||||
@@ -0,0 +1,63 @@
|
||||
+/*
|
||||
+ * Copyright 2016 Broadcom
|
||||
+ *
|
||||
+ * This program is free software; you can redistribute it and/or modify
|
||||
+ * it under the terms of the GNU General Public License, version 2, as
|
||||
+ * published by the Free Software Foundation (the "GPL").
|
||||
+ *
|
||||
+ * This program is distributed in the hope that it will be useful, but
|
||||
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
+ * General Public License version 2 (GPLv2) for more details.
|
||||
+ *
|
||||
+ * You should have received a copy of the GNU General Public License
|
||||
+ * version 2 (GPLv2) along with this source code.
|
||||
+ */
|
||||
+
|
||||
+#ifndef __SPI_BCM_QSPI_H__
|
||||
+#define __SPI_BCM_QSPI_H__
|
||||
+
|
||||
+#include <linux/types.h>
|
||||
+#include <linux/io.h>
|
||||
+
|
||||
+/* MSPI Interrupt masks */
|
||||
+#define INTR_MSPI_HALTED_MASK BIT(6)
|
||||
+#define INTR_MSPI_DONE_MASK BIT(5)
|
||||
+
|
||||
+#define MSPI_INTERRUPTS_ALL \
|
||||
+ (INTR_MSPI_DONE_MASK | \
|
||||
+ INTR_MSPI_HALTED_MASK)
|
||||
+
|
||||
+struct platform_device;
|
||||
+struct dev_pm_ops;
|
||||
+
|
||||
+struct bcm_qspi_soc_intc;
|
||||
+
|
||||
+/* Read controller register*/
|
||||
+static inline u32 bcm_qspi_readl(bool be, void __iomem *addr)
|
||||
+{
|
||||
+ if (be)
|
||||
+ return ioread32be(addr);
|
||||
+ else
|
||||
+ return readl_relaxed(addr);
|
||||
+}
|
||||
+
|
||||
+/* Write controller register*/
|
||||
+static inline void bcm_qspi_writel(bool be,
|
||||
+ unsigned int data, void __iomem *addr)
|
||||
+{
|
||||
+ if (be)
|
||||
+ iowrite32be(data, addr);
|
||||
+ else
|
||||
+ writel_relaxed(data, addr);
|
||||
+}
|
||||
+
|
||||
+/* The common driver functions to be called by the SoC platform driver */
|
||||
+int bcm_qspi_probe(struct platform_device *pdev,
|
||||
+ struct bcm_qspi_soc_intc *soc_intc);
|
||||
+int bcm_qspi_remove(struct platform_device *pdev);
|
||||
+
|
||||
+/* pm_ops used by the SoC platform driver called on PM suspend/resume */
|
||||
+extern const struct dev_pm_ops bcm_qspi_pm_ops;
|
||||
+
|
||||
+#endif /* __SPI_BCM_QSPI_H__ */
|
|
@ -1,84 +0,0 @@
|
|||
From 44f95d87a6187f5027568bbcdce491713d7de5e5 Mon Sep 17 00:00:00 2001
|
||||
From: Kamal Dasu <kdasu.kdev@gmail.com>
|
||||
Date: Wed, 24 Aug 2016 18:04:24 -0400
|
||||
Subject: [PATCH] spi: brcmstb-qspi: Broadcom settop platform driver
|
||||
|
||||
Adding the settop SoC platfrom driver, this driver is compatible
|
||||
with the settop MSPI+BSPI and MSPI only blocks implemented on the
|
||||
SoCs. Driver calls the spi-bcm-qspi probe(), remove() and pm_ops.
|
||||
|
||||
Signed-off-by: Kamal Dasu <kdasu.kdev@gmail.com>
|
||||
Signed-off-by: Mark Brown <broonie@kernel.org>
|
||||
---
|
||||
drivers/spi/Makefile | 2 +-
|
||||
drivers/spi/spi-brcmstb-qspi.c | 53 ++++++++++++++++++++++++++++++++++++++++++
|
||||
2 files changed, 54 insertions(+), 1 deletion(-)
|
||||
create mode 100644 drivers/spi/spi-brcmstb-qspi.c
|
||||
|
||||
--- a/drivers/spi/Makefile
|
||||
+++ b/drivers/spi/Makefile
|
||||
@@ -19,7 +19,7 @@ obj-$(CONFIG_SPI_BCM2835AUX) += spi-bcm
|
||||
obj-$(CONFIG_SPI_BCM53XX) += spi-bcm53xx.o
|
||||
obj-$(CONFIG_SPI_BCM63XX) += spi-bcm63xx.o
|
||||
obj-$(CONFIG_SPI_BCM63XX_HSSPI) += spi-bcm63xx-hsspi.o
|
||||
-obj-$(CONFIG_SPI_BCM_QSPI) += spi-bcm-qspi.o
|
||||
+obj-$(CONFIG_SPI_BCM_QSPI) += spi-brcmstb-qspi.o spi-bcm-qspi.o
|
||||
obj-$(CONFIG_SPI_BFIN5XX) += spi-bfin5xx.o
|
||||
obj-$(CONFIG_SPI_ADI_V3) += spi-adi-v3.o
|
||||
obj-$(CONFIG_SPI_BFIN_SPORT) += spi-bfin-sport.o
|
||||
--- /dev/null
|
||||
+++ b/drivers/spi/spi-brcmstb-qspi.c
|
||||
@@ -0,0 +1,53 @@
|
||||
+/*
|
||||
+ * Copyright 2016 Broadcom
|
||||
+ *
|
||||
+ * This program is free software; you can redistribute it and/or modify
|
||||
+ * it under the terms of the GNU General Public License, version 2, as
|
||||
+ * published by the Free Software Foundation (the "GPL").
|
||||
+ *
|
||||
+ * This program is distributed in the hope that it will be useful, but
|
||||
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
+ * General Public License version 2 (GPLv2) for more details.
|
||||
+ *
|
||||
+ * You should have received a copy of the GNU General Public License
|
||||
+ * version 2 (GPLv2) along with this source code.
|
||||
+ */
|
||||
+
|
||||
+#include <linux/device.h>
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/platform_device.h>
|
||||
+#include <linux/of.h>
|
||||
+#include "spi-bcm-qspi.h"
|
||||
+
|
||||
+static const struct of_device_id brcmstb_qspi_of_match[] = {
|
||||
+ { .compatible = "brcm,spi-brcmstb-qspi" },
|
||||
+ { .compatible = "brcm,spi-brcmstb-mspi" },
|
||||
+ {},
|
||||
+};
|
||||
+MODULE_DEVICE_TABLE(of, brcmstb_qspi_of_match);
|
||||
+
|
||||
+static int brcmstb_qspi_probe(struct platform_device *pdev)
|
||||
+{
|
||||
+ return bcm_qspi_probe(pdev, NULL);
|
||||
+}
|
||||
+
|
||||
+static int brcmstb_qspi_remove(struct platform_device *pdev)
|
||||
+{
|
||||
+ return bcm_qspi_remove(pdev);
|
||||
+}
|
||||
+
|
||||
+static struct platform_driver brcmstb_qspi_driver = {
|
||||
+ .probe = brcmstb_qspi_probe,
|
||||
+ .remove = brcmstb_qspi_remove,
|
||||
+ .driver = {
|
||||
+ .name = "brcmstb_qspi",
|
||||
+ .pm = &bcm_qspi_pm_ops,
|
||||
+ .of_match_table = brcmstb_qspi_of_match,
|
||||
+ }
|
||||
+};
|
||||
+module_platform_driver(brcmstb_qspi_driver);
|
||||
+
|
||||
+MODULE_LICENSE("GPL v2");
|
||||
+MODULE_AUTHOR("Kamal Dasu");
|
||||
+MODULE_DESCRIPTION("Broadcom SPI driver for settop SoC");
|
|
@ -1,780 +0,0 @@
|
|||
From 4e3b2d236fe00f0e0b6c45dcb3cc7d84c2316424 Mon Sep 17 00:00:00 2001
|
||||
From: Kamal Dasu <kdasu.kdev@gmail.com>
|
||||
Date: Wed, 24 Aug 2016 18:04:25 -0400
|
||||
Subject: [PATCH] spi: bcm-qspi: Add BSPI spi-nor flash controller driver
|
||||
|
||||
This change implements BSPI driver for Broadcom BRCMSTB, NS2,
|
||||
NSP SoCs works in combination with the MSPI controller driver
|
||||
and implements flash read acceleration and implements the
|
||||
spi_flash_read() method. Both MSPI and BSPI controllers are
|
||||
needed to access spi-nor flash.
|
||||
|
||||
Signed-off-by: Kamal Dasu <kdasu.kdev@gmail.com>
|
||||
Signed-off-by: Yendapally Reddy Dhananjaya Reddy <yendapally.reddy@broadcom.com>
|
||||
Signed-off-by: Mark Brown <broonie@kernel.org>
|
||||
---
|
||||
drivers/spi/spi-bcm-qspi.c | 603 ++++++++++++++++++++++++++++++++++++++++++++-
|
||||
drivers/spi/spi-bcm-qspi.h | 20 ++
|
||||
2 files changed, 620 insertions(+), 3 deletions(-)
|
||||
|
||||
--- a/drivers/spi/spi-bcm-qspi.c
|
||||
+++ b/drivers/spi/spi-bcm-qspi.c
|
||||
@@ -38,6 +38,60 @@
|
||||
|
||||
#define DRIVER_NAME "bcm_qspi"
|
||||
|
||||
+
|
||||
+/* BSPI register offsets */
|
||||
+#define BSPI_REVISION_ID 0x000
|
||||
+#define BSPI_SCRATCH 0x004
|
||||
+#define BSPI_MAST_N_BOOT_CTRL 0x008
|
||||
+#define BSPI_BUSY_STATUS 0x00c
|
||||
+#define BSPI_INTR_STATUS 0x010
|
||||
+#define BSPI_B0_STATUS 0x014
|
||||
+#define BSPI_B0_CTRL 0x018
|
||||
+#define BSPI_B1_STATUS 0x01c
|
||||
+#define BSPI_B1_CTRL 0x020
|
||||
+#define BSPI_STRAP_OVERRIDE_CTRL 0x024
|
||||
+#define BSPI_FLEX_MODE_ENABLE 0x028
|
||||
+#define BSPI_BITS_PER_CYCLE 0x02c
|
||||
+#define BSPI_BITS_PER_PHASE 0x030
|
||||
+#define BSPI_CMD_AND_MODE_BYTE 0x034
|
||||
+#define BSPI_BSPI_FLASH_UPPER_ADDR_BYTE 0x038
|
||||
+#define BSPI_BSPI_XOR_VALUE 0x03c
|
||||
+#define BSPI_BSPI_XOR_ENABLE 0x040
|
||||
+#define BSPI_BSPI_PIO_MODE_ENABLE 0x044
|
||||
+#define BSPI_BSPI_PIO_IODIR 0x048
|
||||
+#define BSPI_BSPI_PIO_DATA 0x04c
|
||||
+
|
||||
+/* RAF register offsets */
|
||||
+#define BSPI_RAF_START_ADDR 0x100
|
||||
+#define BSPI_RAF_NUM_WORDS 0x104
|
||||
+#define BSPI_RAF_CTRL 0x108
|
||||
+#define BSPI_RAF_FULLNESS 0x10c
|
||||
+#define BSPI_RAF_WATERMARK 0x110
|
||||
+#define BSPI_RAF_STATUS 0x114
|
||||
+#define BSPI_RAF_READ_DATA 0x118
|
||||
+#define BSPI_RAF_WORD_CNT 0x11c
|
||||
+#define BSPI_RAF_CURR_ADDR 0x120
|
||||
+
|
||||
+/* Override mode masks */
|
||||
+#define BSPI_STRAP_OVERRIDE_CTRL_OVERRIDE BIT(0)
|
||||
+#define BSPI_STRAP_OVERRIDE_CTRL_DATA_DUAL BIT(1)
|
||||
+#define BSPI_STRAP_OVERRIDE_CTRL_ADDR_4BYTE BIT(2)
|
||||
+#define BSPI_STRAP_OVERRIDE_CTRL_DATA_QUAD BIT(3)
|
||||
+#define BSPI_STRAP_OVERRIDE_CTRL_ENDAIN_MODE BIT(4)
|
||||
+
|
||||
+#define BSPI_ADDRLEN_3BYTES 3
|
||||
+#define BSPI_ADDRLEN_4BYTES 4
|
||||
+
|
||||
+#define BSPI_RAF_STATUS_FIFO_EMPTY_MASK BIT(1)
|
||||
+
|
||||
+#define BSPI_RAF_CTRL_START_MASK BIT(0)
|
||||
+#define BSPI_RAF_CTRL_CLEAR_MASK BIT(1)
|
||||
+
|
||||
+#define BSPI_BPP_MODE_SELECT_MASK BIT(8)
|
||||
+#define BSPI_BPP_ADDR_SELECT_MASK BIT(16)
|
||||
+
|
||||
+#define BSPI_READ_LENGTH 256
|
||||
+
|
||||
/* MSPI register offsets */
|
||||
#define MSPI_SPCR0_LSB 0x000
|
||||
#define MSPI_SPCR0_MSB 0x004
|
||||
@@ -108,8 +162,16 @@ struct bcm_qspi_parms {
|
||||
u8 bits_per_word;
|
||||
};
|
||||
|
||||
+struct bcm_xfer_mode {
|
||||
+ bool flex_mode;
|
||||
+ unsigned int width;
|
||||
+ unsigned int addrlen;
|
||||
+ unsigned int hp;
|
||||
+};
|
||||
+
|
||||
enum base_type {
|
||||
MSPI,
|
||||
+ BSPI,
|
||||
CHIP_SELECT,
|
||||
BASEMAX,
|
||||
};
|
||||
@@ -140,13 +202,28 @@ struct bcm_qspi {
|
||||
struct bcm_qspi_parms last_parms;
|
||||
struct qspi_trans trans_pos;
|
||||
int curr_cs;
|
||||
+ int bspi_maj_rev;
|
||||
+ int bspi_min_rev;
|
||||
+ int bspi_enabled;
|
||||
+ struct spi_flash_read_message *bspi_rf_msg;
|
||||
+ u32 bspi_rf_msg_idx;
|
||||
+ u32 bspi_rf_msg_len;
|
||||
+ u32 bspi_rf_msg_status;
|
||||
+ struct bcm_xfer_mode xfer_mode;
|
||||
u32 s3_strap_override_ctrl;
|
||||
+ bool bspi_mode;
|
||||
bool big_endian;
|
||||
int num_irqs;
|
||||
struct bcm_qspi_dev_id *dev_ids;
|
||||
struct completion mspi_done;
|
||||
+ struct completion bspi_done;
|
||||
};
|
||||
|
||||
+static inline bool has_bspi(struct bcm_qspi *qspi)
|
||||
+{
|
||||
+ return qspi->bspi_mode;
|
||||
+}
|
||||
+
|
||||
/* Read qspi controller register*/
|
||||
static inline u32 bcm_qspi_read(struct bcm_qspi *qspi, enum base_type type,
|
||||
unsigned int offset)
|
||||
@@ -161,6 +238,300 @@ static inline void bcm_qspi_write(struct
|
||||
bcm_qspi_writel(qspi->big_endian, data, qspi->base[type] + offset);
|
||||
}
|
||||
|
||||
+/* BSPI helpers */
|
||||
+static int bcm_qspi_bspi_busy_poll(struct bcm_qspi *qspi)
|
||||
+{
|
||||
+ int i;
|
||||
+
|
||||
+ /* this should normally finish within 10us */
|
||||
+ for (i = 0; i < 1000; i++) {
|
||||
+ if (!(bcm_qspi_read(qspi, BSPI, BSPI_BUSY_STATUS) & 1))
|
||||
+ return 0;
|
||||
+ udelay(1);
|
||||
+ }
|
||||
+ dev_warn(&qspi->pdev->dev, "timeout waiting for !busy_status\n");
|
||||
+ return -EIO;
|
||||
+}
|
||||
+
|
||||
+static inline bool bcm_qspi_bspi_ver_three(struct bcm_qspi *qspi)
|
||||
+{
|
||||
+ if (qspi->bspi_maj_rev < 4)
|
||||
+ return true;
|
||||
+ return false;
|
||||
+}
|
||||
+
|
||||
+static void bcm_qspi_bspi_flush_prefetch_buffers(struct bcm_qspi *qspi)
|
||||
+{
|
||||
+ bcm_qspi_bspi_busy_poll(qspi);
|
||||
+ /* Force rising edge for the b0/b1 'flush' field */
|
||||
+ bcm_qspi_write(qspi, BSPI, BSPI_B0_CTRL, 1);
|
||||
+ bcm_qspi_write(qspi, BSPI, BSPI_B1_CTRL, 1);
|
||||
+ bcm_qspi_write(qspi, BSPI, BSPI_B0_CTRL, 0);
|
||||
+ bcm_qspi_write(qspi, BSPI, BSPI_B1_CTRL, 0);
|
||||
+}
|
||||
+
|
||||
+static int bcm_qspi_bspi_lr_is_fifo_empty(struct bcm_qspi *qspi)
|
||||
+{
|
||||
+ return (bcm_qspi_read(qspi, BSPI, BSPI_RAF_STATUS) &
|
||||
+ BSPI_RAF_STATUS_FIFO_EMPTY_MASK);
|
||||
+}
|
||||
+
|
||||
+static inline u32 bcm_qspi_bspi_lr_read_fifo(struct bcm_qspi *qspi)
|
||||
+{
|
||||
+ u32 data = bcm_qspi_read(qspi, BSPI, BSPI_RAF_READ_DATA);
|
||||
+
|
||||
+ /* BSPI v3 LR is LE only, convert data to host endianness */
|
||||
+ if (bcm_qspi_bspi_ver_three(qspi))
|
||||
+ data = le32_to_cpu(data);
|
||||
+
|
||||
+ return data;
|
||||
+}
|
||||
+
|
||||
+static inline void bcm_qspi_bspi_lr_start(struct bcm_qspi *qspi)
|
||||
+{
|
||||
+ bcm_qspi_bspi_busy_poll(qspi);
|
||||
+ bcm_qspi_write(qspi, BSPI, BSPI_RAF_CTRL,
|
||||
+ BSPI_RAF_CTRL_START_MASK);
|
||||
+}
|
||||
+
|
||||
+static inline void bcm_qspi_bspi_lr_clear(struct bcm_qspi *qspi)
|
||||
+{
|
||||
+ bcm_qspi_write(qspi, BSPI, BSPI_RAF_CTRL,
|
||||
+ BSPI_RAF_CTRL_CLEAR_MASK);
|
||||
+ bcm_qspi_bspi_flush_prefetch_buffers(qspi);
|
||||
+}
|
||||
+
|
||||
+static void bcm_qspi_bspi_lr_data_read(struct bcm_qspi *qspi)
|
||||
+{
|
||||
+ u32 *buf = (u32 *)qspi->bspi_rf_msg->buf;
|
||||
+ u32 data = 0;
|
||||
+
|
||||
+ dev_dbg(&qspi->pdev->dev, "xfer %p rx %p rxlen %d\n", qspi->bspi_rf_msg,
|
||||
+ qspi->bspi_rf_msg->buf, qspi->bspi_rf_msg_len);
|
||||
+ while (!bcm_qspi_bspi_lr_is_fifo_empty(qspi)) {
|
||||
+ data = bcm_qspi_bspi_lr_read_fifo(qspi);
|
||||
+ if (likely(qspi->bspi_rf_msg_len >= 4) &&
|
||||
+ IS_ALIGNED((uintptr_t)buf, 4)) {
|
||||
+ buf[qspi->bspi_rf_msg_idx++] = data;
|
||||
+ qspi->bspi_rf_msg_len -= 4;
|
||||
+ } else {
|
||||
+ /* Read out remaining bytes, make sure*/
|
||||
+ u8 *cbuf = (u8 *)&buf[qspi->bspi_rf_msg_idx];
|
||||
+
|
||||
+ data = cpu_to_le32(data);
|
||||
+ while (qspi->bspi_rf_msg_len) {
|
||||
+ *cbuf++ = (u8)data;
|
||||
+ data >>= 8;
|
||||
+ qspi->bspi_rf_msg_len--;
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static void bcm_qspi_bspi_set_xfer_params(struct bcm_qspi *qspi, u8 cmd_byte,
|
||||
+ int bpp, int bpc, int flex_mode)
|
||||
+{
|
||||
+ bcm_qspi_write(qspi, BSPI, BSPI_FLEX_MODE_ENABLE, 0);
|
||||
+ bcm_qspi_write(qspi, BSPI, BSPI_BITS_PER_CYCLE, bpc);
|
||||
+ bcm_qspi_write(qspi, BSPI, BSPI_BITS_PER_PHASE, bpp);
|
||||
+ bcm_qspi_write(qspi, BSPI, BSPI_CMD_AND_MODE_BYTE, cmd_byte);
|
||||
+ bcm_qspi_write(qspi, BSPI, BSPI_FLEX_MODE_ENABLE, flex_mode);
|
||||
+}
|
||||
+
|
||||
+static int bcm_qspi_bspi_set_flex_mode(struct bcm_qspi *qspi, int width,
|
||||
+ int addrlen, int hp)
|
||||
+{
|
||||
+ int bpc = 0, bpp = 0;
|
||||
+ u8 command = SPINOR_OP_READ_FAST;
|
||||
+ int flex_mode = 1, rv = 0;
|
||||
+ bool spans_4byte = false;
|
||||
+
|
||||
+ dev_dbg(&qspi->pdev->dev, "set flex mode w %x addrlen %x hp %d\n",
|
||||
+ width, addrlen, hp);
|
||||
+
|
||||
+ if (addrlen == BSPI_ADDRLEN_4BYTES) {
|
||||
+ bpp = BSPI_BPP_ADDR_SELECT_MASK;
|
||||
+ spans_4byte = true;
|
||||
+ }
|
||||
+
|
||||
+ bpp |= 8;
|
||||
+
|
||||
+ switch (width) {
|
||||
+ case SPI_NBITS_SINGLE:
|
||||
+ if (addrlen == BSPI_ADDRLEN_3BYTES)
|
||||
+ /* default mode, does not need flex_cmd */
|
||||
+ flex_mode = 0;
|
||||
+ else
|
||||
+ command = SPINOR_OP_READ4_FAST;
|
||||
+ break;
|
||||
+ case SPI_NBITS_DUAL:
|
||||
+ bpc = 0x00000001;
|
||||
+ if (hp) {
|
||||
+ bpc |= 0x00010100; /* address and mode are 2-bit */
|
||||
+ bpp = BSPI_BPP_MODE_SELECT_MASK;
|
||||
+ command = OPCODE_DIOR;
|
||||
+ if (spans_4byte)
|
||||
+ command = OPCODE_DIOR_4B;
|
||||
+ } else {
|
||||
+ command = SPINOR_OP_READ_1_1_2;
|
||||
+ if (spans_4byte)
|
||||
+ command = SPINOR_OP_READ4_1_1_2;
|
||||
+ }
|
||||
+ break;
|
||||
+ case SPI_NBITS_QUAD:
|
||||
+ bpc = 0x00000002;
|
||||
+ if (hp) {
|
||||
+ bpc |= 0x00020200; /* address and mode are 4-bit */
|
||||
+ bpp = 4; /* dummy cycles */
|
||||
+ bpp |= BSPI_BPP_ADDR_SELECT_MASK;
|
||||
+ command = OPCODE_QIOR;
|
||||
+ if (spans_4byte)
|
||||
+ command = OPCODE_QIOR_4B;
|
||||
+ } else {
|
||||
+ command = SPINOR_OP_READ_1_1_4;
|
||||
+ if (spans_4byte)
|
||||
+ command = SPINOR_OP_READ4_1_1_4;
|
||||
+ }
|
||||
+ break;
|
||||
+ default:
|
||||
+ rv = -EINVAL;
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
+ if (rv == 0)
|
||||
+ bcm_qspi_bspi_set_xfer_params(qspi, command, bpp, bpc,
|
||||
+ flex_mode);
|
||||
+
|
||||
+ return rv;
|
||||
+}
|
||||
+
|
||||
+static int bcm_qspi_bspi_set_override(struct bcm_qspi *qspi, int width,
|
||||
+ int addrlen, int hp)
|
||||
+{
|
||||
+ u32 data = bcm_qspi_read(qspi, BSPI, BSPI_STRAP_OVERRIDE_CTRL);
|
||||
+
|
||||
+ dev_dbg(&qspi->pdev->dev, "set override mode w %x addrlen %x hp %d\n",
|
||||
+ width, addrlen, hp);
|
||||
+
|
||||
+ switch (width) {
|
||||
+ case SPI_NBITS_SINGLE:
|
||||
+ /* clear quad/dual mode */
|
||||
+ data &= ~(BSPI_STRAP_OVERRIDE_CTRL_DATA_QUAD |
|
||||
+ BSPI_STRAP_OVERRIDE_CTRL_DATA_DUAL);
|
||||
+ break;
|
||||
+
|
||||
+ case SPI_NBITS_QUAD:
|
||||
+ /* clear dual mode and set quad mode */
|
||||
+ data &= ~BSPI_STRAP_OVERRIDE_CTRL_DATA_DUAL;
|
||||
+ data |= BSPI_STRAP_OVERRIDE_CTRL_DATA_QUAD;
|
||||
+ break;
|
||||
+ case SPI_NBITS_DUAL:
|
||||
+ /* clear quad mode set dual mode */
|
||||
+ data &= ~BSPI_STRAP_OVERRIDE_CTRL_DATA_QUAD;
|
||||
+ data |= BSPI_STRAP_OVERRIDE_CTRL_DATA_DUAL;
|
||||
+ break;
|
||||
+ default:
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+ if (addrlen == BSPI_ADDRLEN_4BYTES)
|
||||
+ /* set 4byte mode*/
|
||||
+ data |= BSPI_STRAP_OVERRIDE_CTRL_ADDR_4BYTE;
|
||||
+ else
|
||||
+ /* clear 4 byte mode */
|
||||
+ data &= ~BSPI_STRAP_OVERRIDE_CTRL_ADDR_4BYTE;
|
||||
+
|
||||
+ /* set the override mode */
|
||||
+ data |= BSPI_STRAP_OVERRIDE_CTRL_OVERRIDE;
|
||||
+ bcm_qspi_write(qspi, BSPI, BSPI_STRAP_OVERRIDE_CTRL, data);
|
||||
+ bcm_qspi_bspi_set_xfer_params(qspi, SPINOR_OP_READ_FAST, 0, 0, 0);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int bcm_qspi_bspi_set_mode(struct bcm_qspi *qspi,
|
||||
+ int width, int addrlen, int hp)
|
||||
+{
|
||||
+ int error = 0;
|
||||
+
|
||||
+ /* default mode */
|
||||
+ qspi->xfer_mode.flex_mode = true;
|
||||
+
|
||||
+ if (!bcm_qspi_bspi_ver_three(qspi)) {
|
||||
+ u32 val, mask;
|
||||
+
|
||||
+ val = bcm_qspi_read(qspi, BSPI, BSPI_STRAP_OVERRIDE_CTRL);
|
||||
+ mask = BSPI_STRAP_OVERRIDE_CTRL_OVERRIDE;
|
||||
+ if (val & mask || qspi->s3_strap_override_ctrl & mask) {
|
||||
+ qspi->xfer_mode.flex_mode = false;
|
||||
+ bcm_qspi_write(qspi, BSPI, BSPI_FLEX_MODE_ENABLE,
|
||||
+ 0);
|
||||
+
|
||||
+ if ((val | qspi->s3_strap_override_ctrl) &
|
||||
+ BSPI_STRAP_OVERRIDE_CTRL_DATA_DUAL)
|
||||
+ width = SPI_NBITS_DUAL;
|
||||
+ else if ((val | qspi->s3_strap_override_ctrl) &
|
||||
+ BSPI_STRAP_OVERRIDE_CTRL_DATA_QUAD)
|
||||
+ width = SPI_NBITS_QUAD;
|
||||
+
|
||||
+ error = bcm_qspi_bspi_set_override(qspi, width, addrlen,
|
||||
+ hp);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ if (qspi->xfer_mode.flex_mode)
|
||||
+ error = bcm_qspi_bspi_set_flex_mode(qspi, width, addrlen, hp);
|
||||
+
|
||||
+ if (error) {
|
||||
+ dev_warn(&qspi->pdev->dev,
|
||||
+ "INVALID COMBINATION: width=%d addrlen=%d hp=%d\n",
|
||||
+ width, addrlen, hp);
|
||||
+ } else if (qspi->xfer_mode.width != width ||
|
||||
+ qspi->xfer_mode.addrlen != addrlen ||
|
||||
+ qspi->xfer_mode.hp != hp) {
|
||||
+ qspi->xfer_mode.width = width;
|
||||
+ qspi->xfer_mode.addrlen = addrlen;
|
||||
+ qspi->xfer_mode.hp = hp;
|
||||
+ dev_dbg(&qspi->pdev->dev,
|
||||
+ "cs:%d %d-lane output, %d-byte address%s\n",
|
||||
+ qspi->curr_cs,
|
||||
+ qspi->xfer_mode.width,
|
||||
+ qspi->xfer_mode.addrlen,
|
||||
+ qspi->xfer_mode.hp != -1 ? ", hp mode" : "");
|
||||
+ }
|
||||
+
|
||||
+ return error;
|
||||
+}
|
||||
+
|
||||
+static void bcm_qspi_enable_bspi(struct bcm_qspi *qspi)
|
||||
+{
|
||||
+ if (!has_bspi(qspi) || (qspi->bspi_enabled))
|
||||
+ return;
|
||||
+
|
||||
+ qspi->bspi_enabled = 1;
|
||||
+ if ((bcm_qspi_read(qspi, BSPI, BSPI_MAST_N_BOOT_CTRL) & 1) == 0)
|
||||
+ return;
|
||||
+
|
||||
+ bcm_qspi_bspi_flush_prefetch_buffers(qspi);
|
||||
+ udelay(1);
|
||||
+ bcm_qspi_write(qspi, BSPI, BSPI_MAST_N_BOOT_CTRL, 0);
|
||||
+ udelay(1);
|
||||
+}
|
||||
+
|
||||
+static void bcm_qspi_disable_bspi(struct bcm_qspi *qspi)
|
||||
+{
|
||||
+ if (!has_bspi(qspi) || (!qspi->bspi_enabled))
|
||||
+ return;
|
||||
+
|
||||
+ qspi->bspi_enabled = 0;
|
||||
+ if ((bcm_qspi_read(qspi, BSPI, BSPI_MAST_N_BOOT_CTRL) & 1))
|
||||
+ return;
|
||||
+
|
||||
+ bcm_qspi_bspi_busy_poll(qspi);
|
||||
+ bcm_qspi_write(qspi, BSPI, BSPI_MAST_N_BOOT_CTRL, 1);
|
||||
+ udelay(1);
|
||||
+}
|
||||
+
|
||||
static void bcm_qspi_chip_select(struct bcm_qspi *qspi, int cs)
|
||||
{
|
||||
u32 data = 0;
|
||||
@@ -298,6 +669,8 @@ static void read_from_hw(struct bcm_qspi
|
||||
struct qspi_trans tp;
|
||||
int slot;
|
||||
|
||||
+ bcm_qspi_disable_bspi(qspi);
|
||||
+
|
||||
if (slots > MSPI_NUM_CDRAM) {
|
||||
/* should never happen */
|
||||
dev_err(&qspi->pdev->dev, "%s: too many slots!\n", __func__);
|
||||
@@ -368,6 +741,7 @@ static int write_to_hw(struct bcm_qspi *
|
||||
int slot = 0, tstatus = 0;
|
||||
u32 mspi_cdram = 0;
|
||||
|
||||
+ bcm_qspi_disable_bspi(qspi);
|
||||
tp = qspi->trans_pos;
|
||||
bcm_qspi_update_parms(qspi, spi, tp.trans);
|
||||
|
||||
@@ -414,6 +788,9 @@ static int write_to_hw(struct bcm_qspi *
|
||||
write_cdram_slot(qspi, slot - 1, mspi_cdram);
|
||||
}
|
||||
|
||||
+ if (has_bspi(qspi))
|
||||
+ bcm_qspi_write(qspi, MSPI, MSPI_WRITE_LOCK, 1);
|
||||
+
|
||||
/* Must flush previous writes before starting MSPI operation */
|
||||
mb();
|
||||
/* Set cont | spe | spifie */
|
||||
@@ -423,6 +800,118 @@ done:
|
||||
return slot;
|
||||
}
|
||||
|
||||
+static int bcm_qspi_bspi_flash_read(struct spi_device *spi,
|
||||
+ struct spi_flash_read_message *msg)
|
||||
+{
|
||||
+ struct bcm_qspi *qspi = spi_master_get_devdata(spi->master);
|
||||
+ u32 addr = 0, len, len_words;
|
||||
+ int ret = 0;
|
||||
+ unsigned long timeo = msecs_to_jiffies(100);
|
||||
+
|
||||
+ if (bcm_qspi_bspi_ver_three(qspi))
|
||||
+ if (msg->addr_width == BSPI_ADDRLEN_4BYTES)
|
||||
+ return -EIO;
|
||||
+
|
||||
+ bcm_qspi_chip_select(qspi, spi->chip_select);
|
||||
+ bcm_qspi_write(qspi, MSPI, MSPI_WRITE_LOCK, 0);
|
||||
+
|
||||
+ /*
|
||||
+ * when using flex mode mode we need to send
|
||||
+ * the upper address byte to bspi
|
||||
+ */
|
||||
+ if (bcm_qspi_bspi_ver_three(qspi) == false) {
|
||||
+ addr = msg->from & 0xff000000;
|
||||
+ bcm_qspi_write(qspi, BSPI,
|
||||
+ BSPI_BSPI_FLASH_UPPER_ADDR_BYTE, addr);
|
||||
+ }
|
||||
+
|
||||
+ if (!qspi->xfer_mode.flex_mode)
|
||||
+ addr = msg->from;
|
||||
+ else
|
||||
+ addr = msg->from & 0x00ffffff;
|
||||
+
|
||||
+ /* set BSPI RAF buffer max read length */
|
||||
+ len = msg->len;
|
||||
+ if (len > BSPI_READ_LENGTH)
|
||||
+ len = BSPI_READ_LENGTH;
|
||||
+
|
||||
+ if (bcm_qspi_bspi_ver_three(qspi) == true)
|
||||
+ addr = (addr + 0xc00000) & 0xffffff;
|
||||
+
|
||||
+ reinit_completion(&qspi->bspi_done);
|
||||
+ bcm_qspi_enable_bspi(qspi);
|
||||
+ len_words = (len + 3) >> 2;
|
||||
+ qspi->bspi_rf_msg = msg;
|
||||
+ qspi->bspi_rf_msg_status = 0;
|
||||
+ qspi->bspi_rf_msg_idx = 0;
|
||||
+ qspi->bspi_rf_msg_len = len;
|
||||
+ dev_dbg(&qspi->pdev->dev, "bspi xfr addr 0x%x len 0x%x", addr, len);
|
||||
+
|
||||
+ bcm_qspi_write(qspi, BSPI, BSPI_RAF_START_ADDR, addr);
|
||||
+ bcm_qspi_write(qspi, BSPI, BSPI_RAF_NUM_WORDS, len_words);
|
||||
+ bcm_qspi_write(qspi, BSPI, BSPI_RAF_WATERMARK, 0);
|
||||
+
|
||||
+ /* Must flush previous writes before starting BSPI operation */
|
||||
+ mb();
|
||||
+
|
||||
+ bcm_qspi_bspi_lr_start(qspi);
|
||||
+ if (!wait_for_completion_timeout(&qspi->bspi_done, timeo)) {
|
||||
+ dev_err(&qspi->pdev->dev, "timeout waiting for BSPI\n");
|
||||
+ ret = -ETIMEDOUT;
|
||||
+ } else {
|
||||
+ /* set the return length for the caller */
|
||||
+ msg->retlen = len;
|
||||
+ }
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+static int bcm_qspi_flash_read(struct spi_device *spi,
|
||||
+ struct spi_flash_read_message *msg)
|
||||
+{
|
||||
+ struct bcm_qspi *qspi = spi_master_get_devdata(spi->master);
|
||||
+ int ret = 0;
|
||||
+ bool mspi_read = false;
|
||||
+ u32 io_width, addrlen, addr, len;
|
||||
+ u_char *buf;
|
||||
+
|
||||
+ buf = msg->buf;
|
||||
+ addr = msg->from;
|
||||
+ len = msg->len;
|
||||
+
|
||||
+ if (bcm_qspi_bspi_ver_three(qspi) == true) {
|
||||
+ /*
|
||||
+ * The address coming into this function is a raw flash offset.
|
||||
+ * But for BSPI <= V3, we need to convert it to a remapped BSPI
|
||||
+ * address. If it crosses a 4MB boundary, just revert back to
|
||||
+ * using MSPI.
|
||||
+ */
|
||||
+ addr = (addr + 0xc00000) & 0xffffff;
|
||||
+
|
||||
+ if ((~ADDR_4MB_MASK & addr) ^
|
||||
+ (~ADDR_4MB_MASK & (addr + len - 1)))
|
||||
+ mspi_read = true;
|
||||
+ }
|
||||
+
|
||||
+ /* non-aligned and very short transfers are handled by MSPI */
|
||||
+ if (!IS_ALIGNED((uintptr_t)addr, 4) || !IS_ALIGNED((uintptr_t)buf, 4) ||
|
||||
+ len < 4)
|
||||
+ mspi_read = true;
|
||||
+
|
||||
+ if (mspi_read)
|
||||
+ /* this will make the m25p80 read to fallback to mspi read */
|
||||
+ return -EAGAIN;
|
||||
+
|
||||
+ io_width = msg->data_nbits ? msg->data_nbits : SPI_NBITS_SINGLE;
|
||||
+ addrlen = msg->addr_width;
|
||||
+ ret = bcm_qspi_bspi_set_mode(qspi, io_width, addrlen, -1);
|
||||
+
|
||||
+ if (!ret)
|
||||
+ ret = bcm_qspi_bspi_flash_read(spi, msg);
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
static int bcm_qspi_transfer_one(struct spi_master *master,
|
||||
struct spi_device *spi,
|
||||
struct spi_transfer *trans)
|
||||
@@ -469,13 +958,76 @@ static irqreturn_t bcm_qspi_mspi_l2_isr(
|
||||
bcm_qspi_write(qspi, MSPI, MSPI_MSPI_STATUS, status);
|
||||
complete(&qspi->mspi_done);
|
||||
return IRQ_HANDLED;
|
||||
- } else {
|
||||
- return IRQ_NONE;
|
||||
}
|
||||
+
|
||||
+ return IRQ_NONE;
|
||||
+}
|
||||
+
|
||||
+static irqreturn_t bcm_qspi_bspi_lr_l2_isr(int irq, void *dev_id)
|
||||
+{
|
||||
+ struct bcm_qspi_dev_id *qspi_dev_id = dev_id;
|
||||
+ struct bcm_qspi *qspi = qspi_dev_id->dev;
|
||||
+ u32 status;
|
||||
+
|
||||
+ if (qspi->bspi_enabled && qspi->bspi_rf_msg) {
|
||||
+ bcm_qspi_bspi_lr_data_read(qspi);
|
||||
+ if (qspi->bspi_rf_msg_len == 0) {
|
||||
+ qspi->bspi_rf_msg = NULL;
|
||||
+ if (qspi->bspi_rf_msg_status)
|
||||
+ bcm_qspi_bspi_lr_clear(qspi);
|
||||
+ else
|
||||
+ bcm_qspi_bspi_flush_prefetch_buffers(qspi);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ status = (qspi_dev_id->irqp->mask & INTR_BSPI_LR_SESSION_DONE_MASK);
|
||||
+ if (qspi->bspi_enabled && status && qspi->bspi_rf_msg_len == 0)
|
||||
+ complete(&qspi->bspi_done);
|
||||
+
|
||||
+ return IRQ_HANDLED;
|
||||
+}
|
||||
+
|
||||
+static irqreturn_t bcm_qspi_bspi_lr_err_l2_isr(int irq, void *dev_id)
|
||||
+{
|
||||
+ struct bcm_qspi_dev_id *qspi_dev_id = dev_id;
|
||||
+ struct bcm_qspi *qspi = qspi_dev_id->dev;
|
||||
+
|
||||
+ dev_err(&qspi->pdev->dev, "BSPI INT error\n");
|
||||
+ qspi->bspi_rf_msg_status = -EIO;
|
||||
+ complete(&qspi->bspi_done);
|
||||
+ return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static const struct bcm_qspi_irq qspi_irq_tab[] = {
|
||||
{
|
||||
+ .irq_name = "spi_lr_fullness_reached",
|
||||
+ .irq_handler = bcm_qspi_bspi_lr_l2_isr,
|
||||
+ .mask = INTR_BSPI_LR_FULLNESS_REACHED_MASK,
|
||||
+ },
|
||||
+ {
|
||||
+ .irq_name = "spi_lr_session_aborted",
|
||||
+ .irq_handler = bcm_qspi_bspi_lr_err_l2_isr,
|
||||
+ .mask = INTR_BSPI_LR_SESSION_ABORTED_MASK,
|
||||
+ },
|
||||
+ {
|
||||
+ .irq_name = "spi_lr_impatient",
|
||||
+ .irq_handler = bcm_qspi_bspi_lr_err_l2_isr,
|
||||
+ .mask = INTR_BSPI_LR_IMPATIENT_MASK,
|
||||
+ },
|
||||
+ {
|
||||
+ .irq_name = "spi_lr_session_done",
|
||||
+ .irq_handler = bcm_qspi_bspi_lr_l2_isr,
|
||||
+ .mask = INTR_BSPI_LR_SESSION_DONE_MASK,
|
||||
+ },
|
||||
+#ifdef QSPI_INT_DEBUG
|
||||
+ /* this interrupt is for debug purposes only, dont request irq */
|
||||
+ {
|
||||
+ .irq_name = "spi_lr_overread",
|
||||
+ .irq_handler = bcm_qspi_bspi_lr_err_l2_isr,
|
||||
+ .mask = INTR_BSPI_LR_OVERREAD_MASK,
|
||||
+ },
|
||||
+#endif
|
||||
+ {
|
||||
.irq_name = "mspi_done",
|
||||
.irq_handler = bcm_qspi_mspi_l2_isr,
|
||||
.mask = INTR_MSPI_DONE_MASK,
|
||||
@@ -487,6 +1039,24 @@ static const struct bcm_qspi_irq qspi_ir
|
||||
},
|
||||
};
|
||||
|
||||
+static void bcm_qspi_bspi_init(struct bcm_qspi *qspi)
|
||||
+{
|
||||
+ u32 val = 0;
|
||||
+
|
||||
+ val = bcm_qspi_read(qspi, BSPI, BSPI_REVISION_ID);
|
||||
+ qspi->bspi_maj_rev = (val >> 8) & 0xff;
|
||||
+ qspi->bspi_min_rev = val & 0xff;
|
||||
+ if (!(bcm_qspi_bspi_ver_three(qspi))) {
|
||||
+ /* Force mapping of BSPI address -> flash offset */
|
||||
+ bcm_qspi_write(qspi, BSPI, BSPI_BSPI_XOR_VALUE, 0);
|
||||
+ bcm_qspi_write(qspi, BSPI, BSPI_BSPI_XOR_ENABLE, 1);
|
||||
+ }
|
||||
+ qspi->bspi_enabled = 1;
|
||||
+ bcm_qspi_disable_bspi(qspi);
|
||||
+ bcm_qspi_write(qspi, BSPI, BSPI_B0_CTRL, 0);
|
||||
+ bcm_qspi_write(qspi, BSPI, BSPI_B1_CTRL, 0);
|
||||
+}
|
||||
+
|
||||
static void bcm_qspi_hw_init(struct bcm_qspi *qspi)
|
||||
{
|
||||
struct bcm_qspi_parms parms;
|
||||
@@ -501,11 +1071,17 @@ static void bcm_qspi_hw_init(struct bcm_
|
||||
parms.bits_per_word = 8;
|
||||
parms.speed_hz = qspi->max_speed_hz;
|
||||
bcm_qspi_hw_set_parms(qspi, &parms);
|
||||
+
|
||||
+ if (has_bspi(qspi))
|
||||
+ bcm_qspi_bspi_init(qspi);
|
||||
}
|
||||
|
||||
static void bcm_qspi_hw_uninit(struct bcm_qspi *qspi)
|
||||
{
|
||||
bcm_qspi_write(qspi, MSPI, MSPI_SPCR2, 0);
|
||||
+ if (has_bspi(qspi))
|
||||
+ bcm_qspi_write(qspi, MSPI, MSPI_WRITE_LOCK, 0);
|
||||
+
|
||||
}
|
||||
|
||||
static const struct of_device_id bcm_qspi_of_match[] = {
|
||||
@@ -515,7 +1091,7 @@ static const struct of_device_id bcm_qsp
|
||||
MODULE_DEVICE_TABLE(of, bcm_qspi_of_match);
|
||||
|
||||
int bcm_qspi_probe(struct platform_device *pdev,
|
||||
- struct bcm_qspi_soc_intc *soc)
|
||||
+ struct bcm_qspi_soc_intc *soc_intc)
|
||||
{
|
||||
struct device *dev = &pdev->dev;
|
||||
struct bcm_qspi *qspi;
|
||||
@@ -549,6 +1125,7 @@ int bcm_qspi_probe(struct platform_devic
|
||||
master->mode_bits = SPI_CPHA | SPI_CPOL | SPI_RX_DUAL | SPI_RX_QUAD;
|
||||
master->setup = bcm_qspi_setup;
|
||||
master->transfer_one = bcm_qspi_transfer_one;
|
||||
+ master->spi_flash_read = bcm_qspi_flash_read;
|
||||
master->cleanup = bcm_qspi_cleanup;
|
||||
master->dev.of_node = dev->of_node;
|
||||
master->num_chipselect = NUM_CHIPSELECT;
|
||||
@@ -573,6 +1150,20 @@ int bcm_qspi_probe(struct platform_devic
|
||||
goto qspi_probe_err;
|
||||
}
|
||||
|
||||
+ res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "bspi");
|
||||
+ if (res) {
|
||||
+ qspi->base[BSPI] = devm_ioremap_resource(dev, res);
|
||||
+ if (IS_ERR(qspi->base[BSPI])) {
|
||||
+ ret = PTR_ERR(qspi->base[BSPI]);
|
||||
+ goto qspi_probe_err;
|
||||
+ }
|
||||
+ qspi->bspi_mode = true;
|
||||
+ } else {
|
||||
+ qspi->bspi_mode = false;
|
||||
+ }
|
||||
+
|
||||
+ dev_info(dev, "using %smspi mode\n", qspi->bspi_mode ? "bspi-" : "");
|
||||
+
|
||||
res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "cs_reg");
|
||||
if (res) {
|
||||
qspi->base[CHIP_SELECT] = devm_ioremap_resource(dev, res);
|
||||
@@ -635,9 +1226,15 @@ int bcm_qspi_probe(struct platform_devic
|
||||
|
||||
bcm_qspi_hw_init(qspi);
|
||||
init_completion(&qspi->mspi_done);
|
||||
+ init_completion(&qspi->bspi_done);
|
||||
qspi->curr_cs = -1;
|
||||
|
||||
platform_set_drvdata(pdev, qspi);
|
||||
+
|
||||
+ qspi->xfer_mode.width = -1;
|
||||
+ qspi->xfer_mode.addrlen = -1;
|
||||
+ qspi->xfer_mode.hp = -1;
|
||||
+
|
||||
ret = devm_spi_register_master(&pdev->dev, master);
|
||||
if (ret < 0) {
|
||||
dev_err(dev, "can't register master\n");
|
||||
--- a/drivers/spi/spi-bcm-qspi.h
|
||||
+++ b/drivers/spi/spi-bcm-qspi.h
|
||||
@@ -20,6 +20,26 @@
|
||||
#include <linux/types.h>
|
||||
#include <linux/io.h>
|
||||
|
||||
+/* BSPI interrupt masks */
|
||||
+#define INTR_BSPI_LR_OVERREAD_MASK BIT(4)
|
||||
+#define INTR_BSPI_LR_SESSION_DONE_MASK BIT(3)
|
||||
+#define INTR_BSPI_LR_IMPATIENT_MASK BIT(2)
|
||||
+#define INTR_BSPI_LR_SESSION_ABORTED_MASK BIT(1)
|
||||
+#define INTR_BSPI_LR_FULLNESS_REACHED_MASK BIT(0)
|
||||
+
|
||||
+#define BSPI_LR_INTERRUPTS_DATA \
|
||||
+ (INTR_BSPI_LR_SESSION_DONE_MASK | \
|
||||
+ INTR_BSPI_LR_FULLNESS_REACHED_MASK)
|
||||
+
|
||||
+#define BSPI_LR_INTERRUPTS_ERROR \
|
||||
+ (INTR_BSPI_LR_OVERREAD_MASK | \
|
||||
+ INTR_BSPI_LR_IMPATIENT_MASK | \
|
||||
+ INTR_BSPI_LR_SESSION_ABORTED_MASK)
|
||||
+
|
||||
+#define BSPI_LR_INTERRUPTS_ALL \
|
||||
+ (BSPI_LR_INTERRUPTS_ERROR | \
|
||||
+ BSPI_LR_INTERRUPTS_DATA)
|
||||
+
|
||||
/* MSPI Interrupt masks */
|
||||
#define INTR_MSPI_HALTED_MASK BIT(6)
|
||||
#define INTR_MSPI_DONE_MASK BIT(5)
|
|
@ -1,27 +0,0 @@
|
|||
From c0a75d072a501effd66d3392ada8d3f4283b87ef Mon Sep 17 00:00:00 2001
|
||||
From: Arnd Bergmann <arnd@arndb.de>
|
||||
Date: Thu, 15 Sep 2016 17:40:15 +0200
|
||||
Subject: [PATCH] spi: bcm-qspi: don't include linux/mtd/cfi.h
|
||||
|
||||
The header isn't actually needed here, but including it leads
|
||||
to a build warning when CONFIG_MTD is disabled:
|
||||
|
||||
include/linux/mtd/cfi.h:76:2: #warning No CONFIG_MTD_CFI_Ix selected. No NOR chip support can work. [-Werror=cpp]
|
||||
|
||||
Fixes: fa236a7ef240 (spi: bcm-qspi: Add Broadcom MSPI driver)
|
||||
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
|
||||
Signed-off-by: Mark Brown <broonie@kernel.org>
|
||||
---
|
||||
drivers/spi/spi-bcm-qspi.c | 1 -
|
||||
1 file changed, 1 deletion(-)
|
||||
|
||||
--- a/drivers/spi/spi-bcm-qspi.c
|
||||
+++ b/drivers/spi/spi-bcm-qspi.c
|
||||
@@ -25,7 +25,6 @@
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
-#include <linux/mtd/cfi.h>
|
||||
#include <linux/mtd/spi-nor.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_irq.h>
|
|
@ -1,63 +0,0 @@
|
|||
From a0319f8b12c0fb9800da61f4cba9bd6fd80e37a4 Mon Sep 17 00:00:00 2001
|
||||
From: Arnd Bergmann <arnd@arndb.de>
|
||||
Date: Thu, 15 Sep 2016 17:46:53 +0200
|
||||
Subject: [PATCH] spi: bcm-qspi: fix suspend/resume #ifdef
|
||||
|
||||
The two power management functions are define inside of an #ifdef
|
||||
but referenced unconditionally, which is obviously broken when
|
||||
CONFIG_PM_SLEEP is not set:
|
||||
|
||||
drivers/spi/spi-bcm-qspi.c:1300:13: error: 'bcm_qspi_suspend' undeclared here (not in a function)
|
||||
drivers/spi/spi-bcm-qspi.c:1301:13: error: 'bcm_qspi_resume' undeclared here (not in a function)
|
||||
|
||||
This replaces the #ifdef with a __maybe_unused annotation that lets
|
||||
the compiler figure out whether to drop the functions itself,
|
||||
and uses SIMPLE_DEV_PM_OPS() to refer to the functions.
|
||||
|
||||
This will also fill the freeze/thaw/poweroff/restore callback
|
||||
pointers in addition to suspend/resume, but as far as I can tell,
|
||||
this is what we want.
|
||||
|
||||
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
|
||||
Fixes: fa236a7ef240 ("spi: bcm-qspi: Add Broadcom MSPI driver")
|
||||
Signed-off-by: Mark Brown <broonie@kernel.org>
|
||||
---
|
||||
drivers/spi/spi-bcm-qspi.c | 12 ++++--------
|
||||
1 file changed, 4 insertions(+), 8 deletions(-)
|
||||
|
||||
--- a/drivers/spi/spi-bcm-qspi.c
|
||||
+++ b/drivers/spi/spi-bcm-qspi.c
|
||||
@@ -1268,8 +1268,7 @@ int bcm_qspi_remove(struct platform_devi
|
||||
/* function to be called by SoC specific platform driver remove() */
|
||||
EXPORT_SYMBOL_GPL(bcm_qspi_remove);
|
||||
|
||||
-#ifdef CONFIG_PM_SLEEP
|
||||
-static int bcm_qspi_suspend(struct device *dev)
|
||||
+static int __maybe_unused bcm_qspi_suspend(struct device *dev)
|
||||
{
|
||||
struct bcm_qspi *qspi = dev_get_drvdata(dev);
|
||||
|
||||
@@ -1280,7 +1279,7 @@ static int bcm_qspi_suspend(struct devic
|
||||
return 0;
|
||||
};
|
||||
|
||||
-static int bcm_qspi_resume(struct device *dev)
|
||||
+static int __maybe_unused bcm_qspi_resume(struct device *dev)
|
||||
{
|
||||
struct bcm_qspi *qspi = dev_get_drvdata(dev);
|
||||
int ret = 0;
|
||||
@@ -1293,12 +1292,9 @@ static int bcm_qspi_resume(struct device
|
||||
|
||||
return ret;
|
||||
}
|
||||
-#endif /* CONFIG_PM_SLEEP */
|
||||
|
||||
-const struct dev_pm_ops bcm_qspi_pm_ops = {
|
||||
- .suspend = bcm_qspi_suspend,
|
||||
- .resume = bcm_qspi_resume,
|
||||
-};
|
||||
+SIMPLE_DEV_PM_OPS(bcm_qspi_pm_ops, bcm_qspi_suspend, bcm_qspi_resume);
|
||||
+
|
||||
/* pm_ops to be called by SoC specific platform driver */
|
||||
EXPORT_SYMBOL_GPL(bcm_qspi_pm_ops);
|
||||
|
|
@ -1,29 +0,0 @@
|
|||
From 3bf3eb2b95aaf18eff3080444b24673cda8ff9a2 Mon Sep 17 00:00:00 2001
|
||||
From: Wei Yongjun <weiyongjun1@huawei.com>
|
||||
Date: Fri, 16 Sep 2016 13:45:17 +0000
|
||||
Subject: [PATCH] spi: bcm-qspi: Fix return value check in bcm_qspi_probe()
|
||||
|
||||
In case of error, the function kcalloc() returns NULL pointer
|
||||
not ERR_PTR(). The IS_ERR() test in the return value check
|
||||
should be replaced with NULL test.
|
||||
|
||||
Fixes: fa236a7ef240 ("spi: bcm-qspi: Add Broadcom MSPI driver")
|
||||
Signed-off-by: Wei Yongjun <weiyongjun1@huawei.com>
|
||||
Signed-off-by: Mark Brown <broonie@kernel.org>
|
||||
---
|
||||
drivers/spi/spi-bcm-qspi.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/spi/spi-bcm-qspi.c
|
||||
+++ b/drivers/spi/spi-bcm-qspi.c
|
||||
@@ -1174,8 +1174,8 @@ int bcm_qspi_probe(struct platform_devic
|
||||
|
||||
qspi->dev_ids = kcalloc(num_irqs, sizeof(struct bcm_qspi_dev_id),
|
||||
GFP_KERNEL);
|
||||
- if (IS_ERR(qspi->dev_ids)) {
|
||||
- ret = PTR_ERR(qspi->dev_ids);
|
||||
+ if (!qspi->dev_ids) {
|
||||
+ ret = -ENOMEM;
|
||||
goto qspi_probe_err;
|
||||
}
|
||||
|
|
@ -1,32 +0,0 @@
|
|||
From 71b8f350a4f03730f3024bfa7dc2414904a21bcb Mon Sep 17 00:00:00 2001
|
||||
From: Wei Yongjun <weiyongjun1@huawei.com>
|
||||
Date: Fri, 16 Sep 2016 14:00:19 +0000
|
||||
Subject: [PATCH] spi: bcm-qspi: Fix error return code in bcm_qspi_probe()
|
||||
|
||||
Fix to return a negative error code from the error handling
|
||||
case instead of 0, as done elsewhere in this function.
|
||||
|
||||
Fixes: fa236a7ef240 ("spi: bcm-qspi: Add Broadcom MSPI driver")
|
||||
Signed-off-by: Wei Yongjun <weiyongjun1@huawei.com>
|
||||
Signed-off-by: Mark Brown <broonie@kernel.org>
|
||||
---
|
||||
drivers/spi/spi-bcm-qspi.c | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
--- a/drivers/spi/spi-bcm-qspi.c
|
||||
+++ b/drivers/spi/spi-bcm-qspi.c
|
||||
@@ -1205,12 +1205,14 @@ int bcm_qspi_probe(struct platform_devic
|
||||
|
||||
if (!num_ints) {
|
||||
dev_err(&pdev->dev, "no IRQs registered, cannot init driver\n");
|
||||
+ ret = -EINVAL;
|
||||
goto qspi_probe_err;
|
||||
}
|
||||
|
||||
qspi->clk = devm_clk_get(&pdev->dev, NULL);
|
||||
if (IS_ERR(qspi->clk)) {
|
||||
dev_warn(dev, "unable to get clock\n");
|
||||
+ ret = PTR_ERR(qspi->clk);
|
||||
goto qspi_probe_err;
|
||||
}
|
||||
|
|
@ -1,452 +0,0 @@
|
|||
From cc20a38612dbc87dc7396affc9758e3bfbe92340 Mon Sep 17 00:00:00 2001
|
||||
From: Kamal Dasu <kdasu.kdev@gmail.com>
|
||||
Date: Wed, 24 Aug 2016 18:04:29 -0400
|
||||
Subject: [PATCH] spi: iproc-qspi: Add Broadcom iProc SoCs support
|
||||
|
||||
This spi driver uses the common spi-bcm-qspi driver and implements iProc
|
||||
SoCs specific interrupt controller. The common driver now calls the SoC
|
||||
handlers when present. Adding support for both muxed l1 and unmuxed interrupt
|
||||
sources.
|
||||
|
||||
Signed-off-by: Kamal Dasu <kdasu.kdev@gmail.com>
|
||||
Signed-off-by: Yendapally Reddy Dhananjaya Reddy <yendapally.reddy@broadcom.com>
|
||||
Signed-off-by: Mark Brown <broonie@kernel.org>
|
||||
---
|
||||
drivers/spi/Makefile | 2 +-
|
||||
drivers/spi/spi-bcm-qspi.c | 97 ++++++++++++++++++++++++-
|
||||
drivers/spi/spi-bcm-qspi.h | 34 ++++++++-
|
||||
drivers/spi/spi-iproc-qspi.c | 163 +++++++++++++++++++++++++++++++++++++++++++
|
||||
4 files changed, 291 insertions(+), 5 deletions(-)
|
||||
create mode 100644 drivers/spi/spi-iproc-qspi.c
|
||||
|
||||
--- a/drivers/spi/Makefile
|
||||
+++ b/drivers/spi/Makefile
|
||||
@@ -19,7 +19,7 @@ obj-$(CONFIG_SPI_BCM2835AUX) += spi-bcm
|
||||
obj-$(CONFIG_SPI_BCM53XX) += spi-bcm53xx.o
|
||||
obj-$(CONFIG_SPI_BCM63XX) += spi-bcm63xx.o
|
||||
obj-$(CONFIG_SPI_BCM63XX_HSSPI) += spi-bcm63xx-hsspi.o
|
||||
-obj-$(CONFIG_SPI_BCM_QSPI) += spi-brcmstb-qspi.o spi-bcm-qspi.o
|
||||
+obj-$(CONFIG_SPI_BCM_QSPI) += spi-iproc-qspi.o spi-brcmstb-qspi.o spi-bcm-qspi.o
|
||||
obj-$(CONFIG_SPI_BFIN5XX) += spi-bfin5xx.o
|
||||
obj-$(CONFIG_SPI_ADI_V3) += spi-adi-v3.o
|
||||
obj-$(CONFIG_SPI_BFIN_SPORT) += spi-bfin-sport.o
|
||||
--- a/drivers/spi/spi-bcm-qspi.c
|
||||
+++ b/drivers/spi/spi-bcm-qspi.c
|
||||
@@ -175,9 +175,15 @@ enum base_type {
|
||||
BASEMAX,
|
||||
};
|
||||
|
||||
+enum irq_source {
|
||||
+ SINGLE_L2,
|
||||
+ MUXED_L1,
|
||||
+};
|
||||
+
|
||||
struct bcm_qspi_irq {
|
||||
const char *irq_name;
|
||||
const irq_handler_t irq_handler;
|
||||
+ int irq_source;
|
||||
u32 mask;
|
||||
};
|
||||
|
||||
@@ -198,6 +204,10 @@ struct bcm_qspi {
|
||||
u32 base_clk;
|
||||
u32 max_speed_hz;
|
||||
void __iomem *base[BASEMAX];
|
||||
+
|
||||
+ /* Some SoCs provide custom interrupt status register(s) */
|
||||
+ struct bcm_qspi_soc_intc *soc_intc;
|
||||
+
|
||||
struct bcm_qspi_parms last_parms;
|
||||
struct qspi_trans trans_pos;
|
||||
int curr_cs;
|
||||
@@ -806,6 +816,7 @@ static int bcm_qspi_bspi_flash_read(stru
|
||||
u32 addr = 0, len, len_words;
|
||||
int ret = 0;
|
||||
unsigned long timeo = msecs_to_jiffies(100);
|
||||
+ struct bcm_qspi_soc_intc *soc_intc = qspi->soc_intc;
|
||||
|
||||
if (bcm_qspi_bspi_ver_three(qspi))
|
||||
if (msg->addr_width == BSPI_ADDRLEN_4BYTES)
|
||||
@@ -850,6 +861,15 @@ static int bcm_qspi_bspi_flash_read(stru
|
||||
bcm_qspi_write(qspi, BSPI, BSPI_RAF_NUM_WORDS, len_words);
|
||||
bcm_qspi_write(qspi, BSPI, BSPI_RAF_WATERMARK, 0);
|
||||
|
||||
+ if (qspi->soc_intc) {
|
||||
+ /*
|
||||
+ * clear soc MSPI and BSPI interrupts and enable
|
||||
+ * BSPI interrupts.
|
||||
+ */
|
||||
+ soc_intc->bcm_qspi_int_ack(soc_intc, MSPI_BSPI_DONE);
|
||||
+ soc_intc->bcm_qspi_int_set(soc_intc, BSPI_DONE, true);
|
||||
+ }
|
||||
+
|
||||
/* Must flush previous writes before starting BSPI operation */
|
||||
mb();
|
||||
|
||||
@@ -952,9 +972,12 @@ static irqreturn_t bcm_qspi_mspi_l2_isr(
|
||||
u32 status = bcm_qspi_read(qspi, MSPI, MSPI_MSPI_STATUS);
|
||||
|
||||
if (status & MSPI_MSPI_STATUS_SPIF) {
|
||||
+ struct bcm_qspi_soc_intc *soc_intc = qspi->soc_intc;
|
||||
/* clear interrupt */
|
||||
status &= ~MSPI_MSPI_STATUS_SPIF;
|
||||
bcm_qspi_write(qspi, MSPI, MSPI_MSPI_STATUS, status);
|
||||
+ if (qspi->soc_intc)
|
||||
+ soc_intc->bcm_qspi_int_ack(soc_intc, MSPI_DONE);
|
||||
complete(&qspi->mspi_done);
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
@@ -966,20 +989,33 @@ static irqreturn_t bcm_qspi_bspi_lr_l2_i
|
||||
{
|
||||
struct bcm_qspi_dev_id *qspi_dev_id = dev_id;
|
||||
struct bcm_qspi *qspi = qspi_dev_id->dev;
|
||||
- u32 status;
|
||||
+ struct bcm_qspi_soc_intc *soc_intc = qspi->soc_intc;
|
||||
+ u32 status = qspi_dev_id->irqp->mask;
|
||||
|
||||
if (qspi->bspi_enabled && qspi->bspi_rf_msg) {
|
||||
bcm_qspi_bspi_lr_data_read(qspi);
|
||||
if (qspi->bspi_rf_msg_len == 0) {
|
||||
qspi->bspi_rf_msg = NULL;
|
||||
+ if (qspi->soc_intc) {
|
||||
+ /* disable soc BSPI interrupt */
|
||||
+ soc_intc->bcm_qspi_int_set(soc_intc, BSPI_DONE,
|
||||
+ false);
|
||||
+ /* indicate done */
|
||||
+ status = INTR_BSPI_LR_SESSION_DONE_MASK;
|
||||
+ }
|
||||
+
|
||||
if (qspi->bspi_rf_msg_status)
|
||||
bcm_qspi_bspi_lr_clear(qspi);
|
||||
else
|
||||
bcm_qspi_bspi_flush_prefetch_buffers(qspi);
|
||||
}
|
||||
+
|
||||
+ if (qspi->soc_intc)
|
||||
+ /* clear soc BSPI interrupt */
|
||||
+ soc_intc->bcm_qspi_int_ack(soc_intc, BSPI_DONE);
|
||||
}
|
||||
|
||||
- status = (qspi_dev_id->irqp->mask & INTR_BSPI_LR_SESSION_DONE_MASK);
|
||||
+ status &= INTR_BSPI_LR_SESSION_DONE_MASK;
|
||||
if (qspi->bspi_enabled && status && qspi->bspi_rf_msg_len == 0)
|
||||
complete(&qspi->bspi_done);
|
||||
|
||||
@@ -990,13 +1026,39 @@ static irqreturn_t bcm_qspi_bspi_lr_err_
|
||||
{
|
||||
struct bcm_qspi_dev_id *qspi_dev_id = dev_id;
|
||||
struct bcm_qspi *qspi = qspi_dev_id->dev;
|
||||
+ struct bcm_qspi_soc_intc *soc_intc = qspi->soc_intc;
|
||||
|
||||
dev_err(&qspi->pdev->dev, "BSPI INT error\n");
|
||||
qspi->bspi_rf_msg_status = -EIO;
|
||||
+ if (qspi->soc_intc)
|
||||
+ /* clear soc interrupt */
|
||||
+ soc_intc->bcm_qspi_int_ack(soc_intc, BSPI_ERR);
|
||||
+
|
||||
complete(&qspi->bspi_done);
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
+static irqreturn_t bcm_qspi_l1_isr(int irq, void *dev_id)
|
||||
+{
|
||||
+ struct bcm_qspi_dev_id *qspi_dev_id = dev_id;
|
||||
+ struct bcm_qspi *qspi = qspi_dev_id->dev;
|
||||
+ struct bcm_qspi_soc_intc *soc_intc = qspi->soc_intc;
|
||||
+ irqreturn_t ret = IRQ_NONE;
|
||||
+
|
||||
+ if (soc_intc) {
|
||||
+ u32 status = soc_intc->bcm_qspi_get_int_status(soc_intc);
|
||||
+
|
||||
+ if (status & MSPI_DONE)
|
||||
+ ret = bcm_qspi_mspi_l2_isr(irq, dev_id);
|
||||
+ else if (status & BSPI_DONE)
|
||||
+ ret = bcm_qspi_bspi_lr_l2_isr(irq, dev_id);
|
||||
+ else if (status & BSPI_ERR)
|
||||
+ ret = bcm_qspi_bspi_lr_err_l2_isr(irq, dev_id);
|
||||
+ }
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
static const struct bcm_qspi_irq qspi_irq_tab[] = {
|
||||
{
|
||||
.irq_name = "spi_lr_fullness_reached",
|
||||
@@ -1036,6 +1098,13 @@ static const struct bcm_qspi_irq qspi_ir
|
||||
.irq_handler = bcm_qspi_mspi_l2_isr,
|
||||
.mask = INTR_MSPI_HALTED_MASK,
|
||||
},
|
||||
+ {
|
||||
+ /* single muxed L1 interrupt source */
|
||||
+ .irq_name = "spi_l1_intr",
|
||||
+ .irq_handler = bcm_qspi_l1_isr,
|
||||
+ .irq_source = MUXED_L1,
|
||||
+ .mask = QSPI_INTERRUPTS_ALL,
|
||||
+ },
|
||||
};
|
||||
|
||||
static void bcm_qspi_bspi_init(struct bcm_qspi *qspi)
|
||||
@@ -1182,7 +1251,13 @@ int bcm_qspi_probe(struct platform_devic
|
||||
for (val = 0; val < num_irqs; val++) {
|
||||
irq = -1;
|
||||
name = qspi_irq_tab[val].irq_name;
|
||||
- irq = platform_get_irq_byname(pdev, name);
|
||||
+ if (qspi_irq_tab[val].irq_source == SINGLE_L2) {
|
||||
+ /* get the l2 interrupts */
|
||||
+ irq = platform_get_irq_byname(pdev, name);
|
||||
+ } else if (!num_ints && soc_intc) {
|
||||
+ /* all mspi, bspi intrs muxed to one L1 intr */
|
||||
+ irq = platform_get_irq(pdev, 0);
|
||||
+ }
|
||||
|
||||
if (irq >= 0) {
|
||||
ret = devm_request_irq(&pdev->dev, irq,
|
||||
@@ -1209,6 +1284,17 @@ int bcm_qspi_probe(struct platform_devic
|
||||
goto qspi_probe_err;
|
||||
}
|
||||
|
||||
+ /*
|
||||
+ * Some SoCs integrate spi controller (e.g., its interrupt bits)
|
||||
+ * in specific ways
|
||||
+ */
|
||||
+ if (soc_intc) {
|
||||
+ qspi->soc_intc = soc_intc;
|
||||
+ soc_intc->bcm_qspi_int_set(soc_intc, MSPI_DONE, true);
|
||||
+ } else {
|
||||
+ qspi->soc_intc = NULL;
|
||||
+ }
|
||||
+
|
||||
qspi->clk = devm_clk_get(&pdev->dev, NULL);
|
||||
if (IS_ERR(qspi->clk)) {
|
||||
dev_warn(dev, "unable to get clock\n");
|
||||
@@ -1288,6 +1374,11 @@ static int __maybe_unused bcm_qspi_resum
|
||||
|
||||
bcm_qspi_hw_init(qspi);
|
||||
bcm_qspi_chip_select(qspi, qspi->curr_cs);
|
||||
+ if (qspi->soc_intc)
|
||||
+ /* enable MSPI interrupt */
|
||||
+ qspi->soc_intc->bcm_qspi_int_set(qspi->soc_intc, MSPI_DONE,
|
||||
+ true);
|
||||
+
|
||||
ret = clk_enable(qspi->clk);
|
||||
if (!ret)
|
||||
spi_master_resume(qspi->master);
|
||||
--- a/drivers/spi/spi-bcm-qspi.h
|
||||
+++ b/drivers/spi/spi-bcm-qspi.h
|
||||
@@ -48,10 +48,26 @@
|
||||
(INTR_MSPI_DONE_MASK | \
|
||||
INTR_MSPI_HALTED_MASK)
|
||||
|
||||
+#define QSPI_INTERRUPTS_ALL \
|
||||
+ (MSPI_INTERRUPTS_ALL | \
|
||||
+ BSPI_LR_INTERRUPTS_ALL)
|
||||
+
|
||||
struct platform_device;
|
||||
struct dev_pm_ops;
|
||||
|
||||
-struct bcm_qspi_soc_intc;
|
||||
+enum {
|
||||
+ MSPI_DONE = 0x1,
|
||||
+ BSPI_DONE = 0x2,
|
||||
+ BSPI_ERR = 0x4,
|
||||
+ MSPI_BSPI_DONE = 0x7
|
||||
+};
|
||||
+
|
||||
+struct bcm_qspi_soc_intc {
|
||||
+ void (*bcm_qspi_int_ack)(struct bcm_qspi_soc_intc *soc_intc, int type);
|
||||
+ void (*bcm_qspi_int_set)(struct bcm_qspi_soc_intc *soc_intc, int type,
|
||||
+ bool en);
|
||||
+ u32 (*bcm_qspi_get_int_status)(struct bcm_qspi_soc_intc *soc_intc);
|
||||
+};
|
||||
|
||||
/* Read controller register*/
|
||||
static inline u32 bcm_qspi_readl(bool be, void __iomem *addr)
|
||||
@@ -72,6 +88,22 @@ static inline void bcm_qspi_writel(bool
|
||||
writel_relaxed(data, addr);
|
||||
}
|
||||
|
||||
+static inline u32 get_qspi_mask(int type)
|
||||
+{
|
||||
+ switch (type) {
|
||||
+ case MSPI_DONE:
|
||||
+ return INTR_MSPI_DONE_MASK;
|
||||
+ case BSPI_DONE:
|
||||
+ return BSPI_LR_INTERRUPTS_ALL;
|
||||
+ case MSPI_BSPI_DONE:
|
||||
+ return QSPI_INTERRUPTS_ALL;
|
||||
+ case BSPI_ERR:
|
||||
+ return BSPI_LR_INTERRUPTS_ERROR;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
/* The common driver functions to be called by the SoC platform driver */
|
||||
int bcm_qspi_probe(struct platform_device *pdev,
|
||||
struct bcm_qspi_soc_intc *soc_intc);
|
||||
--- /dev/null
|
||||
+++ b/drivers/spi/spi-iproc-qspi.c
|
||||
@@ -0,0 +1,163 @@
|
||||
+/*
|
||||
+ * Copyright 2016 Broadcom Limited
|
||||
+ *
|
||||
+ * This program is free software; you can redistribute it and/or modify
|
||||
+ * it under the terms of the GNU General Public License version 2 as
|
||||
+ * published by the Free Software Foundation.
|
||||
+ *
|
||||
+ * This program is distributed in the hope that it will be useful,
|
||||
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
+ * GNU General Public License for more details.
|
||||
+ */
|
||||
+
|
||||
+#include <linux/device.h>
|
||||
+#include <linux/io.h>
|
||||
+#include <linux/ioport.h>
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/of.h>
|
||||
+#include <linux/of_address.h>
|
||||
+#include <linux/platform_device.h>
|
||||
+#include <linux/slab.h>
|
||||
+
|
||||
+#include "spi-bcm-qspi.h"
|
||||
+
|
||||
+#define INTR_BASE_BIT_SHIFT 0x02
|
||||
+#define INTR_COUNT 0x07
|
||||
+
|
||||
+struct bcm_iproc_intc {
|
||||
+ struct bcm_qspi_soc_intc soc_intc;
|
||||
+ struct platform_device *pdev;
|
||||
+ void __iomem *int_reg;
|
||||
+ void __iomem *int_status_reg;
|
||||
+ spinlock_t soclock;
|
||||
+ bool big_endian;
|
||||
+};
|
||||
+
|
||||
+static u32 bcm_iproc_qspi_get_l2_int_status(struct bcm_qspi_soc_intc *soc_intc)
|
||||
+{
|
||||
+ struct bcm_iproc_intc *priv =
|
||||
+ container_of(soc_intc, struct bcm_iproc_intc, soc_intc);
|
||||
+ void __iomem *mmio = priv->int_status_reg;
|
||||
+ int i;
|
||||
+ u32 val = 0, sts = 0;
|
||||
+
|
||||
+ for (i = 0; i < INTR_COUNT; i++) {
|
||||
+ if (bcm_qspi_readl(priv->big_endian, mmio + (i * 4)))
|
||||
+ val |= 1UL << i;
|
||||
+ }
|
||||
+
|
||||
+ if (val & INTR_MSPI_DONE_MASK)
|
||||
+ sts |= MSPI_DONE;
|
||||
+
|
||||
+ if (val & BSPI_LR_INTERRUPTS_ALL)
|
||||
+ sts |= BSPI_DONE;
|
||||
+
|
||||
+ if (val & BSPI_LR_INTERRUPTS_ERROR)
|
||||
+ sts |= BSPI_ERR;
|
||||
+
|
||||
+ return sts;
|
||||
+}
|
||||
+
|
||||
+static void bcm_iproc_qspi_int_ack(struct bcm_qspi_soc_intc *soc_intc, int type)
|
||||
+{
|
||||
+ struct bcm_iproc_intc *priv =
|
||||
+ container_of(soc_intc, struct bcm_iproc_intc, soc_intc);
|
||||
+ void __iomem *mmio = priv->int_status_reg;
|
||||
+ u32 mask = get_qspi_mask(type);
|
||||
+ int i;
|
||||
+
|
||||
+ for (i = 0; i < INTR_COUNT; i++) {
|
||||
+ if (mask & (1UL << i))
|
||||
+ bcm_qspi_writel(priv->big_endian, 1, mmio + (i * 4));
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static void bcm_iproc_qspi_int_set(struct bcm_qspi_soc_intc *soc_intc, int type,
|
||||
+ bool en)
|
||||
+{
|
||||
+ struct bcm_iproc_intc *priv =
|
||||
+ container_of(soc_intc, struct bcm_iproc_intc, soc_intc);
|
||||
+ void __iomem *mmio = priv->int_reg;
|
||||
+ u32 mask = get_qspi_mask(type);
|
||||
+ u32 val;
|
||||
+ unsigned long flags;
|
||||
+
|
||||
+ spin_lock_irqsave(&priv->soclock, flags);
|
||||
+
|
||||
+ val = bcm_qspi_readl(priv->big_endian, mmio);
|
||||
+
|
||||
+ if (en)
|
||||
+ val = val | (mask << INTR_BASE_BIT_SHIFT);
|
||||
+ else
|
||||
+ val = val & ~(mask << INTR_BASE_BIT_SHIFT);
|
||||
+
|
||||
+ bcm_qspi_writel(priv->big_endian, val, mmio);
|
||||
+
|
||||
+ spin_unlock_irqrestore(&priv->soclock, flags);
|
||||
+}
|
||||
+
|
||||
+static int bcm_iproc_probe(struct platform_device *pdev)
|
||||
+{
|
||||
+ struct device *dev = &pdev->dev;
|
||||
+ struct bcm_iproc_intc *priv;
|
||||
+ struct bcm_qspi_soc_intc *soc_intc;
|
||||
+ struct resource *res;
|
||||
+
|
||||
+ priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
|
||||
+ if (!priv)
|
||||
+ return -ENOMEM;
|
||||
+ soc_intc = &priv->soc_intc;
|
||||
+ priv->pdev = pdev;
|
||||
+
|
||||
+ spin_lock_init(&priv->soclock);
|
||||
+
|
||||
+ res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "intr_regs");
|
||||
+ priv->int_reg = devm_ioremap_resource(dev, res);
|
||||
+ if (IS_ERR(priv->int_reg))
|
||||
+ return PTR_ERR(priv->int_reg);
|
||||
+
|
||||
+ res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
|
||||
+ "intr_status_reg");
|
||||
+ priv->int_status_reg = devm_ioremap_resource(dev, res);
|
||||
+ if (IS_ERR(priv->int_status_reg))
|
||||
+ return PTR_ERR(priv->int_status_reg);
|
||||
+
|
||||
+ priv->big_endian = of_device_is_big_endian(dev->of_node);
|
||||
+
|
||||
+ bcm_iproc_qspi_int_ack(soc_intc, MSPI_BSPI_DONE);
|
||||
+ bcm_iproc_qspi_int_set(soc_intc, MSPI_BSPI_DONE, false);
|
||||
+
|
||||
+ soc_intc->bcm_qspi_int_ack = bcm_iproc_qspi_int_ack;
|
||||
+ soc_intc->bcm_qspi_int_set = bcm_iproc_qspi_int_set;
|
||||
+ soc_intc->bcm_qspi_get_int_status = bcm_iproc_qspi_get_l2_int_status;
|
||||
+
|
||||
+ return bcm_qspi_probe(pdev, soc_intc);
|
||||
+}
|
||||
+
|
||||
+static int bcm_iproc_remove(struct platform_device *pdev)
|
||||
+{
|
||||
+ return bcm_qspi_remove(pdev);
|
||||
+}
|
||||
+
|
||||
+static const struct of_device_id bcm_iproc_of_match[] = {
|
||||
+ { .compatible = "brcm,spi-nsp-qspi" },
|
||||
+ { .compatible = "brcm,spi-ns2-qspi" },
|
||||
+ {},
|
||||
+};
|
||||
+MODULE_DEVICE_TABLE(of, bcm_iproc_of_match);
|
||||
+
|
||||
+static struct platform_driver bcm_iproc_driver = {
|
||||
+ .probe = bcm_iproc_probe,
|
||||
+ .remove = bcm_iproc_remove,
|
||||
+ .driver = {
|
||||
+ .name = "bcm_iproc",
|
||||
+ .pm = &bcm_qspi_pm_ops,
|
||||
+ .of_match_table = bcm_iproc_of_match,
|
||||
+ }
|
||||
+};
|
||||
+module_platform_driver(bcm_iproc_driver);
|
||||
+
|
||||
+MODULE_LICENSE("GPL v2");
|
||||
+MODULE_AUTHOR("Kamal Dasu");
|
||||
+MODULE_DESCRIPTION("SPI flash driver for Broadcom iProc SoCs");
|
|
@ -1,52 +0,0 @@
|
|||
From 78d759daceaf0a7058f37c4142bdca9948b6d987 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Thu, 29 Dec 2016 17:27:55 +0100
|
||||
Subject: [PATCH] spi: bcm53xx: set of_node to let DT specify device(s)
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Setting of_node of master's dev seems to be a common way of letting it
|
||||
work nicely with DT. This allows specifying device there instead of
|
||||
hardcoding one in the driver code.
|
||||
|
||||
This was successfully tested with commit 1b47b98acce2 ("ARM: BCM5301X:
|
||||
Add DT entry for SPI controller and NOR flash")
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Signed-off-by: Mark Brown <broonie@kernel.org>
|
||||
---
|
||||
drivers/spi/spi-bcm53xx.c | 8 +-------
|
||||
1 file changed, 1 insertion(+), 7 deletions(-)
|
||||
|
||||
--- a/drivers/spi/spi-bcm53xx.c
|
||||
+++ b/drivers/spi/spi-bcm53xx.c
|
||||
@@ -275,10 +275,6 @@ static int bcm53xxspi_flash_read(struct
|
||||
* BCMA
|
||||
**************************************************/
|
||||
|
||||
-static struct spi_board_info bcm53xx_info = {
|
||||
- .modalias = "bcm53xxspiflash",
|
||||
-};
|
||||
-
|
||||
static const struct bcma_device_id bcm53xxspi_bcma_tbl[] = {
|
||||
BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_NS_QSPI, BCMA_ANY_REV, BCMA_ANY_CLASS),
|
||||
{},
|
||||
@@ -311,6 +307,7 @@ static int bcm53xxspi_bcma_probe(struct
|
||||
b53spi->bspi = true;
|
||||
bcm53xxspi_disable_bspi(b53spi);
|
||||
|
||||
+ master->dev.of_node = dev->of_node;
|
||||
master->transfer_one = bcm53xxspi_transfer_one;
|
||||
if (b53spi->mmio_base)
|
||||
master->spi_flash_read = bcm53xxspi_flash_read;
|
||||
@@ -324,9 +321,6 @@ static int bcm53xxspi_bcma_probe(struct
|
||||
return err;
|
||||
}
|
||||
|
||||
- /* Broadcom SoCs (at least with the CC rev 42) use SPI for flash only */
|
||||
- spi_new_device(master, &bcm53xx_info);
|
||||
-
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -1,50 +0,0 @@
|
|||
From e360e72e715f228e426edf0fc99ffa34027ab0ad Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Thu, 29 Dec 2016 20:13:13 +0100
|
||||
Subject: [PATCH] spi: bcm53xx: (re)license code to the GPL v2
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
My intention was to release this code under GPL v2 license. For some
|
||||
reason my initial commit 0fc6a323e191 ("spi: bcm53xx: driver for SPI
|
||||
controller on Broadcom bcma SoC") totally missed licensing info.
|
||||
MODULE_LICENSE was later added by Axel specifying "GNU Public License
|
||||
v2 or later".
|
||||
|
||||
This patch clarifies situation by adding a proper header (with Copyright
|
||||
line) and adjusting MODULE_LICENSE. It should be acked by every driver
|
||||
contributor.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Acked-by: Nicholas Mc Guire <hofrat@osadl.org>
|
||||
Reviewed-by: Jingoo Han <jingoohan1@gmail.com>
|
||||
Acked-by: Jingoo Han <jingoohan1@gmail.com>
|
||||
Acked-by: Joe Perches <joe@perches.com>
|
||||
Acked-by: Axel Lin <axel.lin@ingics.com>
|
||||
Acked-by: Vaishali Thakkar <vaishali.thakkar@oracle.com>
|
||||
Signed-off-by: Mark Brown <broonie@kernel.org>
|
||||
---
|
||||
drivers/spi/spi-bcm53xx.c | 10 +++++++++-
|
||||
1 file changed, 9 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/spi/spi-bcm53xx.c
|
||||
+++ b/drivers/spi/spi-bcm53xx.c
|
||||
@@ -1,3 +1,11 @@
|
||||
+/*
|
||||
+ * Copyright (C) 2014-2016 Rafał Miłecki <rafal@milecki.pl>
|
||||
+ *
|
||||
+ * This program is free software; you can redistribute it and/or modify
|
||||
+ * it under the terms of the GNU General Public License version 2 as
|
||||
+ * published by the Free Software Foundation.
|
||||
+ */
|
||||
+
|
||||
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||
|
||||
#include <linux/kernel.h>
|
||||
@@ -355,4 +363,4 @@ module_exit(bcm53xxspi_module_exit);
|
||||
|
||||
MODULE_DESCRIPTION("Broadcom BCM53xx SPI Controller driver");
|
||||
MODULE_AUTHOR("Rafał Miłecki <zajec5@gmail.com>");
|
||||
-MODULE_LICENSE("GPL");
|
||||
+MODULE_LICENSE("GPL v2");
|
|
@ -1,107 +0,0 @@
|
|||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Fri, 29 Dec 2017 14:44:09 +0100
|
||||
Subject: [PATCH] spi: bcm53xx: simplify reading SPI data
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
This commit makes transfer function use spi_transfer_is_last to
|
||||
determine if currently processed transfer is the last one. Thanks to
|
||||
that we finally set hardware registers properly and it makes controller
|
||||
behave the way it's expected to.
|
||||
|
||||
This allows simplifying read function which can now simply start reading
|
||||
from the slot 0 instead of the last saved offset. It has been
|
||||
successfully tested using spi_write_then_read.
|
||||
|
||||
Moreover this change fixes handling messages with two writing transfers.
|
||||
It's important for SPI flash devices as their drivers commonly use one
|
||||
transfer for a command and another one for data.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
---
|
||||
drivers/spi/spi-bcm53xx.c | 26 ++++++++++----------------
|
||||
1 file changed, 10 insertions(+), 16 deletions(-)
|
||||
|
||||
--- a/drivers/spi/spi-bcm53xx.c
|
||||
+++ b/drivers/spi/spi-bcm53xx.c
|
||||
@@ -27,8 +27,6 @@ struct bcm53xxspi {
|
||||
struct bcma_device *core;
|
||||
struct spi_master *master;
|
||||
void __iomem *mmio_base;
|
||||
-
|
||||
- size_t read_offset;
|
||||
bool bspi; /* Boot SPI mode with memory mapping */
|
||||
};
|
||||
|
||||
@@ -172,8 +170,6 @@ static void bcm53xxspi_buf_write(struct
|
||||
|
||||
if (!cont)
|
||||
bcm53xxspi_write(b53spi, B53SPI_MSPI_WRITE_LOCK, 0);
|
||||
-
|
||||
- b53spi->read_offset = len;
|
||||
}
|
||||
|
||||
static void bcm53xxspi_buf_read(struct bcm53xxspi *b53spi, u8 *r_buf,
|
||||
@@ -182,10 +178,10 @@ static void bcm53xxspi_buf_read(struct b
|
||||
u32 tmp;
|
||||
int i;
|
||||
|
||||
- for (i = 0; i < b53spi->read_offset + len; i++) {
|
||||
+ for (i = 0; i < len; i++) {
|
||||
tmp = B53SPI_CDRAM_CONT | B53SPI_CDRAM_PCS_DISABLE_ALL |
|
||||
B53SPI_CDRAM_PCS_DSCK;
|
||||
- if (!cont && i == b53spi->read_offset + len - 1)
|
||||
+ if (!cont && i == len - 1)
|
||||
tmp &= ~B53SPI_CDRAM_CONT;
|
||||
tmp &= ~0x1;
|
||||
/* Command Register File */
|
||||
@@ -194,8 +190,7 @@ static void bcm53xxspi_buf_read(struct b
|
||||
|
||||
/* Set queue pointers */
|
||||
bcm53xxspi_write(b53spi, B53SPI_MSPI_NEWQP, 0);
|
||||
- bcm53xxspi_write(b53spi, B53SPI_MSPI_ENDQP,
|
||||
- b53spi->read_offset + len - 1);
|
||||
+ bcm53xxspi_write(b53spi, B53SPI_MSPI_ENDQP, len - 1);
|
||||
|
||||
if (cont)
|
||||
bcm53xxspi_write(b53spi, B53SPI_MSPI_WRITE_LOCK, 1);
|
||||
@@ -214,13 +209,11 @@ static void bcm53xxspi_buf_read(struct b
|
||||
bcm53xxspi_write(b53spi, B53SPI_MSPI_WRITE_LOCK, 0);
|
||||
|
||||
for (i = 0; i < len; ++i) {
|
||||
- int offset = b53spi->read_offset + i;
|
||||
+ u16 reg = B53SPI_MSPI_RXRAM + 4 * (1 + i * 2);
|
||||
|
||||
/* Data stored in the transmit register file LSB */
|
||||
- r_buf[i] = (u8)bcm53xxspi_read(b53spi, B53SPI_MSPI_RXRAM + 4 * (1 + offset * 2));
|
||||
+ r_buf[i] = (u8)bcm53xxspi_read(b53spi, reg);
|
||||
}
|
||||
-
|
||||
- b53spi->read_offset = 0;
|
||||
}
|
||||
|
||||
static int bcm53xxspi_transfer_one(struct spi_master *master,
|
||||
@@ -238,7 +231,8 @@ static int bcm53xxspi_transfer_one(struc
|
||||
left = t->len;
|
||||
while (left) {
|
||||
size_t to_write = min_t(size_t, 16, left);
|
||||
- bool cont = left - to_write > 0;
|
||||
+ bool cont = !spi_transfer_is_last(master, t) ||
|
||||
+ left - to_write > 0;
|
||||
|
||||
bcm53xxspi_buf_write(b53spi, buf, to_write, cont);
|
||||
left -= to_write;
|
||||
@@ -250,9 +244,9 @@ static int bcm53xxspi_transfer_one(struc
|
||||
buf = (u8 *)t->rx_buf;
|
||||
left = t->len;
|
||||
while (left) {
|
||||
- size_t to_read = min_t(size_t, 16 - b53spi->read_offset,
|
||||
- left);
|
||||
- bool cont = left - to_read > 0;
|
||||
+ size_t to_read = min_t(size_t, 16, left);
|
||||
+ bool cont = !spi_transfer_is_last(master, t) ||
|
||||
+ left - to_read > 0;
|
||||
|
||||
bcm53xxspi_buf_read(b53spi, buf, to_read, cont);
|
||||
left -= to_read;
|
|
@ -1,42 +0,0 @@
|
|||
From c1b98e41b356a1807d7083d958790da2027c0d9d Mon Sep 17 00:00:00 2001
|
||||
From: Arnd Bergmann <arnd@arndb.de>
|
||||
Date: Tue, 24 Nov 2015 15:28:48 -0600
|
||||
Subject: [PATCH] PCI: iproc: Hide CONFIG_PCIE_IPROC
|
||||
|
||||
PCIE_IPROC_BCMA does not require CONFIG_OF in Kconfig, but
|
||||
CONFIG_PCIE_IPROC does, so we can get a warning when building for an ARM
|
||||
platform without DT support:
|
||||
|
||||
warning: (PCIE_IPROC_PLATFORM && PCIE_IPROC_BCMA) selects PCIE_IPROC which has unmet direct dependencies (PCI && OF && (ARM || ARM64))
|
||||
|
||||
It turns out that CONFIG_PCIE_IPROC never needs to be enabled by a user
|
||||
anyway, we can simply rely on it being selected implictly through either
|
||||
PCIE_IPROC_PLATFORM or PCIE_IPROC_BCMA.
|
||||
|
||||
Fixes: 4785ffbdc9b5 ("PCI: iproc: Add BCMA PCIe driver")
|
||||
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
|
||||
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
|
||||
Acked-by: Hauke Mehrtens <hauke@hauke-m.de>
|
||||
---
|
||||
drivers/pci/host/Kconfig | 8 +++-----
|
||||
1 file changed, 3 insertions(+), 5 deletions(-)
|
||||
|
||||
--- a/drivers/pci/host/Kconfig
|
||||
+++ b/drivers/pci/host/Kconfig
|
||||
@@ -119,13 +119,11 @@ config PCI_VERSATILE
|
||||
depends on ARCH_VERSATILE
|
||||
|
||||
config PCIE_IPROC
|
||||
- tristate "Broadcom iProc PCIe controller"
|
||||
- depends on OF && (ARM || ARM64)
|
||||
- default n
|
||||
+ tristate
|
||||
help
|
||||
This enables the iProc PCIe core controller support for Broadcom's
|
||||
- iProc family of SoCs. An appropriate bus interface driver also needs
|
||||
- to be enabled
|
||||
+ iProc family of SoCs. An appropriate bus interface driver needs
|
||||
+ to be enabled to select this.
|
||||
|
||||
config PCIE_IPROC_PLATFORM
|
||||
tristate "Broadcom iProc PCIe platform bus driver"
|
|
@ -1,27 +0,0 @@
|
|||
From 57303e92f48a0e307fd86977ec9be5aa6a7ea681 Mon Sep 17 00:00:00 2001
|
||||
From: "Dmitry V. Krivenok" <krivenok.dmitry@gmail.com>
|
||||
Date: Mon, 30 Nov 2015 23:45:49 +0300
|
||||
Subject: [PATCH] PCI: iproc: Do not use 0x in front of %pap
|
||||
|
||||
The "%pap" format adds a "0x" prefix, so using "0x%pap" results in output
|
||||
of "0x0x...". Drop the "0x" prefix in the format string.
|
||||
|
||||
[bhelgaas: changelog]
|
||||
Signed-off-by: Dmitry V. Krivenok <krivenok.dmitry@gmail.com>
|
||||
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
|
||||
Acked-by: Ray Jui <rjui@broadcom.com>
|
||||
---
|
||||
drivers/pci/host/pcie-iproc.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/pci/host/pcie-iproc.c
|
||||
+++ b/drivers/pci/host/pcie-iproc.c
|
||||
@@ -245,7 +245,7 @@ static int iproc_pcie_setup_ob(struct ip
|
||||
|
||||
if (size > max_size) {
|
||||
dev_err(pcie->dev,
|
||||
- "res size 0x%pap exceeds max supported size 0x%llx\n",
|
||||
+ "res size %pap exceeds max supported size 0x%llx\n",
|
||||
&size, max_size);
|
||||
return -EINVAL;
|
||||
}
|
|
@ -1,30 +0,0 @@
|
|||
From e8b8318de645c04f8600cb5af6f6773a1878ee9d Mon Sep 17 00:00:00 2001
|
||||
From: Ray Jui <rjui@broadcom.com>
|
||||
Date: Fri, 4 Dec 2015 09:34:58 -0800
|
||||
Subject: [PATCH 1/5] PCI: iproc: Update iProc PCIe device tree binding
|
||||
|
||||
Add a new compatible string "brcm,iproc-pcie-paxc", for PAXC-based iProc
|
||||
PCIe root complex. A PAXC-based PCIe root complex is connected to emulated
|
||||
endpoint devices internal to the ASIC.
|
||||
|
||||
Signed-off-by: Ray Jui <rjui@broadcom.com>
|
||||
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
|
||||
Reviewed-by: Scott Branden <sbranden@broadcom.com>
|
||||
---
|
||||
Documentation/devicetree/bindings/pci/brcm,iproc-pcie.txt | 5 ++++-
|
||||
1 file changed, 4 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/Documentation/devicetree/bindings/pci/brcm,iproc-pcie.txt
|
||||
+++ b/Documentation/devicetree/bindings/pci/brcm,iproc-pcie.txt
|
||||
@@ -1,7 +1,10 @@
|
||||
* Broadcom iProc PCIe controller with the platform bus interface
|
||||
|
||||
Required properties:
|
||||
-- compatible: Must be "brcm,iproc-pcie"
|
||||
+- compatible: Must be "brcm,iproc-pcie" for PAXB, or "brcm,iproc-pcie-paxc"
|
||||
+ for PAXC. PAXB-based root complex is used for external endpoint devices.
|
||||
+ PAXC-based root complex is connected to emulated endpoint devices
|
||||
+ internal to the ASIC
|
||||
- reg: base address and length of the PCIe controller I/O register space
|
||||
- #interrupt-cells: set to <1>
|
||||
- interrupt-map-mask and interrupt-map, standard PCI properties to define the
|
|
@ -1,429 +0,0 @@
|
|||
From 943ebae781f519ecfecbfa1b997f15f59116e41d Mon Sep 17 00:00:00 2001
|
||||
From: Ray Jui <rjui@broadcom.com>
|
||||
Date: Fri, 4 Dec 2015 09:34:59 -0800
|
||||
Subject: [PATCH 2/5] PCI: iproc: Add PAXC interface support
|
||||
|
||||
Traditionally, all iProc PCIe root complexes use PAXB-based wrapper, with
|
||||
an integrated on-chip Serdes to support external endpoint devices. On
|
||||
newer iProc platforms, a PAXC-based wrapper is introduced, for connection
|
||||
with internally emulated PCIe endpoint devices in the ASIC.
|
||||
|
||||
Add support for PAXC-based iProc PCIe root complex in the iProc PCIe core
|
||||
driver. This change factors out common logic between PAXB and PAXC, and
|
||||
uses tables to store register offsets that are different between PAXB and
|
||||
PAXC. This allows the driver to be scaled to support subsequent PAXC
|
||||
revisions in the future.
|
||||
|
||||
Signed-off-by: Ray Jui <rjui@broadcom.com>
|
||||
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
|
||||
Reviewed-by: Scott Branden <sbranden@broadcom.com>
|
||||
---
|
||||
drivers/pci/host/pcie-iproc-platform.c | 24 +++-
|
||||
drivers/pci/host/pcie-iproc.c | 202 +++++++++++++++++++++++++++------
|
||||
drivers/pci/host/pcie-iproc.h | 19 ++++
|
||||
3 files changed, 205 insertions(+), 40 deletions(-)
|
||||
|
||||
--- a/drivers/pci/host/pcie-iproc-platform.c
|
||||
+++ b/drivers/pci/host/pcie-iproc-platform.c
|
||||
@@ -26,8 +26,21 @@
|
||||
|
||||
#include "pcie-iproc.h"
|
||||
|
||||
+static const struct of_device_id iproc_pcie_of_match_table[] = {
|
||||
+ {
|
||||
+ .compatible = "brcm,iproc-pcie",
|
||||
+ .data = (int *)IPROC_PCIE_PAXB,
|
||||
+ }, {
|
||||
+ .compatible = "brcm,iproc-pcie-paxc",
|
||||
+ .data = (int *)IPROC_PCIE_PAXC,
|
||||
+ },
|
||||
+ { /* sentinel */ }
|
||||
+};
|
||||
+MODULE_DEVICE_TABLE(of, iproc_pcie_of_match_table);
|
||||
+
|
||||
static int iproc_pcie_pltfm_probe(struct platform_device *pdev)
|
||||
{
|
||||
+ const struct of_device_id *of_id;
|
||||
struct iproc_pcie *pcie;
|
||||
struct device_node *np = pdev->dev.of_node;
|
||||
struct resource reg;
|
||||
@@ -35,11 +48,16 @@ static int iproc_pcie_pltfm_probe(struct
|
||||
LIST_HEAD(res);
|
||||
int ret;
|
||||
|
||||
+ of_id = of_match_device(iproc_pcie_of_match_table, &pdev->dev);
|
||||
+ if (!of_id)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
pcie = devm_kzalloc(&pdev->dev, sizeof(struct iproc_pcie), GFP_KERNEL);
|
||||
if (!pcie)
|
||||
return -ENOMEM;
|
||||
|
||||
pcie->dev = &pdev->dev;
|
||||
+ pcie->type = (enum iproc_pcie_type)of_id->data;
|
||||
platform_set_drvdata(pdev, pcie);
|
||||
|
||||
ret = of_address_to_resource(np, 0, ®);
|
||||
@@ -114,12 +132,6 @@ static int iproc_pcie_pltfm_remove(struc
|
||||
return iproc_pcie_remove(pcie);
|
||||
}
|
||||
|
||||
-static const struct of_device_id iproc_pcie_of_match_table[] = {
|
||||
- { .compatible = "brcm,iproc-pcie", },
|
||||
- { /* sentinel */ }
|
||||
-};
|
||||
-MODULE_DEVICE_TABLE(of, iproc_pcie_of_match_table);
|
||||
-
|
||||
static struct platform_driver iproc_pcie_pltfm_driver = {
|
||||
.driver = {
|
||||
.name = "iproc-pcie",
|
||||
--- a/drivers/pci/host/pcie-iproc.c
|
||||
+++ b/drivers/pci/host/pcie-iproc.c
|
||||
@@ -30,20 +30,16 @@
|
||||
|
||||
#include "pcie-iproc.h"
|
||||
|
||||
-#define CLK_CONTROL_OFFSET 0x000
|
||||
#define EP_PERST_SOURCE_SELECT_SHIFT 2
|
||||
#define EP_PERST_SOURCE_SELECT BIT(EP_PERST_SOURCE_SELECT_SHIFT)
|
||||
#define EP_MODE_SURVIVE_PERST_SHIFT 1
|
||||
#define EP_MODE_SURVIVE_PERST BIT(EP_MODE_SURVIVE_PERST_SHIFT)
|
||||
#define RC_PCIE_RST_OUTPUT_SHIFT 0
|
||||
#define RC_PCIE_RST_OUTPUT BIT(RC_PCIE_RST_OUTPUT_SHIFT)
|
||||
+#define PAXC_RESET_MASK 0x7f
|
||||
|
||||
-#define CFG_IND_ADDR_OFFSET 0x120
|
||||
#define CFG_IND_ADDR_MASK 0x00001ffc
|
||||
|
||||
-#define CFG_IND_DATA_OFFSET 0x124
|
||||
-
|
||||
-#define CFG_ADDR_OFFSET 0x1f8
|
||||
#define CFG_ADDR_BUS_NUM_SHIFT 20
|
||||
#define CFG_ADDR_BUS_NUM_MASK 0x0ff00000
|
||||
#define CFG_ADDR_DEV_NUM_SHIFT 15
|
||||
@@ -55,12 +51,8 @@
|
||||
#define CFG_ADDR_CFG_TYPE_SHIFT 0
|
||||
#define CFG_ADDR_CFG_TYPE_MASK 0x00000003
|
||||
|
||||
-#define CFG_DATA_OFFSET 0x1fc
|
||||
-
|
||||
-#define SYS_RC_INTX_EN 0x330
|
||||
#define SYS_RC_INTX_MASK 0xf
|
||||
|
||||
-#define PCIE_LINK_STATUS_OFFSET 0xf0c
|
||||
#define PCIE_PHYLINKUP_SHIFT 3
|
||||
#define PCIE_PHYLINKUP BIT(PCIE_PHYLINKUP_SHIFT)
|
||||
#define PCIE_DL_ACTIVE_SHIFT 2
|
||||
@@ -71,12 +63,54 @@
|
||||
#define OARR_SIZE_CFG_SHIFT 1
|
||||
#define OARR_SIZE_CFG BIT(OARR_SIZE_CFG_SHIFT)
|
||||
|
||||
-#define OARR_LO(window) (0xd20 + (window) * 8)
|
||||
-#define OARR_HI(window) (0xd24 + (window) * 8)
|
||||
-#define OMAP_LO(window) (0xd40 + (window) * 8)
|
||||
-#define OMAP_HI(window) (0xd44 + (window) * 8)
|
||||
-
|
||||
#define MAX_NUM_OB_WINDOWS 2
|
||||
+#define MAX_NUM_PAXC_PF 4
|
||||
+
|
||||
+#define IPROC_PCIE_REG_INVALID 0xffff
|
||||
+
|
||||
+enum iproc_pcie_reg {
|
||||
+ IPROC_PCIE_CLK_CTRL = 0,
|
||||
+ IPROC_PCIE_CFG_IND_ADDR,
|
||||
+ IPROC_PCIE_CFG_IND_DATA,
|
||||
+ IPROC_PCIE_CFG_ADDR,
|
||||
+ IPROC_PCIE_CFG_DATA,
|
||||
+ IPROC_PCIE_INTX_EN,
|
||||
+ IPROC_PCIE_OARR_LO,
|
||||
+ IPROC_PCIE_OARR_HI,
|
||||
+ IPROC_PCIE_OMAP_LO,
|
||||
+ IPROC_PCIE_OMAP_HI,
|
||||
+ IPROC_PCIE_LINK_STATUS,
|
||||
+};
|
||||
+
|
||||
+/* iProc PCIe PAXB registers */
|
||||
+static const u16 iproc_pcie_reg_paxb[] = {
|
||||
+ [IPROC_PCIE_CLK_CTRL] = 0x000,
|
||||
+ [IPROC_PCIE_CFG_IND_ADDR] = 0x120,
|
||||
+ [IPROC_PCIE_CFG_IND_DATA] = 0x124,
|
||||
+ [IPROC_PCIE_CFG_ADDR] = 0x1f8,
|
||||
+ [IPROC_PCIE_CFG_DATA] = 0x1fc,
|
||||
+ [IPROC_PCIE_INTX_EN] = 0x330,
|
||||
+ [IPROC_PCIE_OARR_LO] = 0xd20,
|
||||
+ [IPROC_PCIE_OARR_HI] = 0xd24,
|
||||
+ [IPROC_PCIE_OMAP_LO] = 0xd40,
|
||||
+ [IPROC_PCIE_OMAP_HI] = 0xd44,
|
||||
+ [IPROC_PCIE_LINK_STATUS] = 0xf0c,
|
||||
+};
|
||||
+
|
||||
+/* iProc PCIe PAXC v1 registers */
|
||||
+static const u16 iproc_pcie_reg_paxc[] = {
|
||||
+ [IPROC_PCIE_CLK_CTRL] = 0x000,
|
||||
+ [IPROC_PCIE_CFG_IND_ADDR] = 0x1f0,
|
||||
+ [IPROC_PCIE_CFG_IND_DATA] = 0x1f4,
|
||||
+ [IPROC_PCIE_CFG_ADDR] = 0x1f8,
|
||||
+ [IPROC_PCIE_CFG_DATA] = 0x1fc,
|
||||
+ [IPROC_PCIE_INTX_EN] = IPROC_PCIE_REG_INVALID,
|
||||
+ [IPROC_PCIE_OARR_LO] = IPROC_PCIE_REG_INVALID,
|
||||
+ [IPROC_PCIE_OARR_HI] = IPROC_PCIE_REG_INVALID,
|
||||
+ [IPROC_PCIE_OMAP_LO] = IPROC_PCIE_REG_INVALID,
|
||||
+ [IPROC_PCIE_OMAP_HI] = IPROC_PCIE_REG_INVALID,
|
||||
+ [IPROC_PCIE_LINK_STATUS] = IPROC_PCIE_REG_INVALID,
|
||||
+};
|
||||
|
||||
static inline struct iproc_pcie *iproc_data(struct pci_bus *bus)
|
||||
{
|
||||
@@ -91,6 +125,65 @@ static inline struct iproc_pcie *iproc_d
|
||||
return pcie;
|
||||
}
|
||||
|
||||
+static inline bool iproc_pcie_reg_is_invalid(u16 reg_offset)
|
||||
+{
|
||||
+ return !!(reg_offset == IPROC_PCIE_REG_INVALID);
|
||||
+}
|
||||
+
|
||||
+static inline u16 iproc_pcie_reg_offset(struct iproc_pcie *pcie,
|
||||
+ enum iproc_pcie_reg reg)
|
||||
+{
|
||||
+ return pcie->reg_offsets[reg];
|
||||
+}
|
||||
+
|
||||
+static inline u32 iproc_pcie_read_reg(struct iproc_pcie *pcie,
|
||||
+ enum iproc_pcie_reg reg)
|
||||
+{
|
||||
+ u16 offset = iproc_pcie_reg_offset(pcie, reg);
|
||||
+
|
||||
+ if (iproc_pcie_reg_is_invalid(offset))
|
||||
+ return 0;
|
||||
+
|
||||
+ return readl(pcie->base + offset);
|
||||
+}
|
||||
+
|
||||
+static inline void iproc_pcie_write_reg(struct iproc_pcie *pcie,
|
||||
+ enum iproc_pcie_reg reg, u32 val)
|
||||
+{
|
||||
+ u16 offset = iproc_pcie_reg_offset(pcie, reg);
|
||||
+
|
||||
+ if (iproc_pcie_reg_is_invalid(offset))
|
||||
+ return;
|
||||
+
|
||||
+ writel(val, pcie->base + offset);
|
||||
+}
|
||||
+
|
||||
+static inline void iproc_pcie_ob_write(struct iproc_pcie *pcie,
|
||||
+ enum iproc_pcie_reg reg,
|
||||
+ unsigned window, u32 val)
|
||||
+{
|
||||
+ u16 offset = iproc_pcie_reg_offset(pcie, reg);
|
||||
+
|
||||
+ if (iproc_pcie_reg_is_invalid(offset))
|
||||
+ return;
|
||||
+
|
||||
+ writel(val, pcie->base + offset + (window * 8));
|
||||
+}
|
||||
+
|
||||
+static inline bool iproc_pcie_device_is_valid(struct iproc_pcie *pcie,
|
||||
+ unsigned int slot,
|
||||
+ unsigned int fn)
|
||||
+{
|
||||
+ if (slot > 0)
|
||||
+ return false;
|
||||
+
|
||||
+ /* PAXC can only support limited number of functions */
|
||||
+ if (pcie->type == IPROC_PCIE_PAXC && fn >= MAX_NUM_PAXC_PF)
|
||||
+ return false;
|
||||
+
|
||||
+ return true;
|
||||
+}
|
||||
+
|
||||
/**
|
||||
* Note access to the configuration registers are protected at the higher layer
|
||||
* by 'pci_lock' in drivers/pci/access.c
|
||||
@@ -104,28 +197,34 @@ static void __iomem *iproc_pcie_map_cfg_
|
||||
unsigned fn = PCI_FUNC(devfn);
|
||||
unsigned busno = bus->number;
|
||||
u32 val;
|
||||
+ u16 offset;
|
||||
+
|
||||
+ if (!iproc_pcie_device_is_valid(pcie, slot, fn))
|
||||
+ return NULL;
|
||||
|
||||
/* root complex access */
|
||||
if (busno == 0) {
|
||||
- if (slot >= 1)
|
||||
+ iproc_pcie_write_reg(pcie, IPROC_PCIE_CFG_IND_ADDR,
|
||||
+ where & CFG_IND_ADDR_MASK);
|
||||
+ offset = iproc_pcie_reg_offset(pcie, IPROC_PCIE_CFG_IND_DATA);
|
||||
+ if (iproc_pcie_reg_is_invalid(offset))
|
||||
return NULL;
|
||||
- writel(where & CFG_IND_ADDR_MASK,
|
||||
- pcie->base + CFG_IND_ADDR_OFFSET);
|
||||
- return (pcie->base + CFG_IND_DATA_OFFSET);
|
||||
+ else
|
||||
+ return (pcie->base + offset);
|
||||
}
|
||||
|
||||
- if (fn > 1)
|
||||
- return NULL;
|
||||
-
|
||||
/* EP device access */
|
||||
val = (busno << CFG_ADDR_BUS_NUM_SHIFT) |
|
||||
(slot << CFG_ADDR_DEV_NUM_SHIFT) |
|
||||
(fn << CFG_ADDR_FUNC_NUM_SHIFT) |
|
||||
(where & CFG_ADDR_REG_NUM_MASK) |
|
||||
(1 & CFG_ADDR_CFG_TYPE_MASK);
|
||||
- writel(val, pcie->base + CFG_ADDR_OFFSET);
|
||||
-
|
||||
- return (pcie->base + CFG_DATA_OFFSET);
|
||||
+ iproc_pcie_write_reg(pcie, IPROC_PCIE_CFG_ADDR, val);
|
||||
+ offset = iproc_pcie_reg_offset(pcie, IPROC_PCIE_CFG_DATA);
|
||||
+ if (iproc_pcie_reg_is_invalid(offset))
|
||||
+ return NULL;
|
||||
+ else
|
||||
+ return (pcie->base + offset);
|
||||
}
|
||||
|
||||
static struct pci_ops iproc_pcie_ops = {
|
||||
@@ -138,18 +237,29 @@ static void iproc_pcie_reset(struct ipro
|
||||
{
|
||||
u32 val;
|
||||
|
||||
+ if (pcie->type == IPROC_PCIE_PAXC) {
|
||||
+ val = iproc_pcie_read_reg(pcie, IPROC_PCIE_CLK_CTRL);
|
||||
+ val &= ~PAXC_RESET_MASK;
|
||||
+ iproc_pcie_write_reg(pcie, IPROC_PCIE_CLK_CTRL, val);
|
||||
+ udelay(100);
|
||||
+ val |= PAXC_RESET_MASK;
|
||||
+ iproc_pcie_write_reg(pcie, IPROC_PCIE_CLK_CTRL, val);
|
||||
+ udelay(100);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
/*
|
||||
* Select perst_b signal as reset source. Put the device into reset,
|
||||
* and then bring it out of reset
|
||||
*/
|
||||
- val = readl(pcie->base + CLK_CONTROL_OFFSET);
|
||||
+ val = iproc_pcie_read_reg(pcie, IPROC_PCIE_CLK_CTRL);
|
||||
val &= ~EP_PERST_SOURCE_SELECT & ~EP_MODE_SURVIVE_PERST &
|
||||
~RC_PCIE_RST_OUTPUT;
|
||||
- writel(val, pcie->base + CLK_CONTROL_OFFSET);
|
||||
+ iproc_pcie_write_reg(pcie, IPROC_PCIE_CLK_CTRL, val);
|
||||
udelay(250);
|
||||
|
||||
val |= RC_PCIE_RST_OUTPUT;
|
||||
- writel(val, pcie->base + CLK_CONTROL_OFFSET);
|
||||
+ iproc_pcie_write_reg(pcie, IPROC_PCIE_CLK_CTRL, val);
|
||||
msleep(100);
|
||||
}
|
||||
|
||||
@@ -160,7 +270,14 @@ static int iproc_pcie_check_link(struct
|
||||
u16 pos, link_status;
|
||||
bool link_is_active = false;
|
||||
|
||||
- val = readl(pcie->base + PCIE_LINK_STATUS_OFFSET);
|
||||
+ /*
|
||||
+ * PAXC connects to emulated endpoint devices directly and does not
|
||||
+ * have a Serdes. Therefore skip the link detection logic here.
|
||||
+ */
|
||||
+ if (pcie->type == IPROC_PCIE_PAXC)
|
||||
+ return 0;
|
||||
+
|
||||
+ val = iproc_pcie_read_reg(pcie, IPROC_PCIE_LINK_STATUS);
|
||||
if (!(val & PCIE_PHYLINKUP) || !(val & PCIE_DL_ACTIVE)) {
|
||||
dev_err(pcie->dev, "PHY or data link is INACTIVE!\n");
|
||||
return -ENODEV;
|
||||
@@ -221,7 +338,7 @@ static int iproc_pcie_check_link(struct
|
||||
|
||||
static void iproc_pcie_enable(struct iproc_pcie *pcie)
|
||||
{
|
||||
- writel(SYS_RC_INTX_MASK, pcie->base + SYS_RC_INTX_EN);
|
||||
+ iproc_pcie_write_reg(pcie, IPROC_PCIE_INTX_EN, SYS_RC_INTX_MASK);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -272,11 +389,15 @@ static int iproc_pcie_setup_ob(struct ip
|
||||
axi_addr -= ob->axi_offset;
|
||||
|
||||
for (i = 0; i < MAX_NUM_OB_WINDOWS; i++) {
|
||||
- writel(lower_32_bits(axi_addr) | OARR_VALID |
|
||||
- (ob->set_oarr_size ? 1 : 0), pcie->base + OARR_LO(i));
|
||||
- writel(upper_32_bits(axi_addr), pcie->base + OARR_HI(i));
|
||||
- writel(lower_32_bits(pci_addr), pcie->base + OMAP_LO(i));
|
||||
- writel(upper_32_bits(pci_addr), pcie->base + OMAP_HI(i));
|
||||
+ iproc_pcie_ob_write(pcie, IPROC_PCIE_OARR_LO, i,
|
||||
+ lower_32_bits(axi_addr) | OARR_VALID |
|
||||
+ (ob->set_oarr_size ? 1 : 0));
|
||||
+ iproc_pcie_ob_write(pcie, IPROC_PCIE_OARR_HI, i,
|
||||
+ upper_32_bits(axi_addr));
|
||||
+ iproc_pcie_ob_write(pcie, IPROC_PCIE_OMAP_LO, i,
|
||||
+ lower_32_bits(pci_addr));
|
||||
+ iproc_pcie_ob_write(pcie, IPROC_PCIE_OMAP_HI, i,
|
||||
+ upper_32_bits(pci_addr));
|
||||
|
||||
size -= ob->window_size;
|
||||
if (size == 0)
|
||||
@@ -340,6 +461,19 @@ int iproc_pcie_setup(struct iproc_pcie *
|
||||
goto err_exit_phy;
|
||||
}
|
||||
|
||||
+ switch (pcie->type) {
|
||||
+ case IPROC_PCIE_PAXB:
|
||||
+ pcie->reg_offsets = iproc_pcie_reg_paxb;
|
||||
+ break;
|
||||
+ case IPROC_PCIE_PAXC:
|
||||
+ pcie->reg_offsets = iproc_pcie_reg_paxc;
|
||||
+ break;
|
||||
+ default:
|
||||
+ dev_err(pcie->dev, "incompatible iProc PCIe interface\n");
|
||||
+ ret = -EINVAL;
|
||||
+ goto err_power_off_phy;
|
||||
+ }
|
||||
+
|
||||
iproc_pcie_reset(pcie);
|
||||
|
||||
if (pcie->need_ob_cfg) {
|
||||
--- a/drivers/pci/host/pcie-iproc.h
|
||||
+++ b/drivers/pci/host/pcie-iproc.h
|
||||
@@ -15,6 +15,20 @@
|
||||
#define _PCIE_IPROC_H
|
||||
|
||||
/**
|
||||
+ * iProc PCIe interface type
|
||||
+ *
|
||||
+ * PAXB is the wrapper used in root complex that can be connected to an
|
||||
+ * external endpoint device.
|
||||
+ *
|
||||
+ * PAXC is the wrapper used in root complex dedicated for internal emulated
|
||||
+ * endpoint devices.
|
||||
+ */
|
||||
+enum iproc_pcie_type {
|
||||
+ IPROC_PCIE_PAXB = 0,
|
||||
+ IPROC_PCIE_PAXC,
|
||||
+};
|
||||
+
|
||||
+/**
|
||||
* iProc PCIe outbound mapping
|
||||
* @set_oarr_size: indicates the OARR size bit needs to be set
|
||||
* @axi_offset: offset from the AXI address to the internal address used by
|
||||
@@ -29,7 +43,10 @@ struct iproc_pcie_ob {
|
||||
|
||||
/**
|
||||
* iProc PCIe device
|
||||
+ *
|
||||
* @dev: pointer to device data structure
|
||||
+ * @type: iProc PCIe interface type
|
||||
+ * @reg_offsets: register offsets
|
||||
* @base: PCIe host controller I/O register base
|
||||
* @sysdata: Per PCI controller data (ARM-specific)
|
||||
* @root_bus: pointer to root bus
|
||||
@@ -41,6 +58,8 @@ struct iproc_pcie_ob {
|
||||
*/
|
||||
struct iproc_pcie {
|
||||
struct device *dev;
|
||||
+ enum iproc_pcie_type type;
|
||||
+ const u16 *reg_offsets;
|
||||
void __iomem *base;
|
||||
#ifdef CONFIG_ARM
|
||||
struct pci_sys_data sysdata;
|
|
@ -1,68 +0,0 @@
|
|||
From c7bd48195377435ecaf38869b936be8e7abe3489 Mon Sep 17 00:00:00 2001
|
||||
From: Ray Jui <rjui@broadcom.com>
|
||||
Date: Fri, 4 Dec 2015 09:35:00 -0800
|
||||
Subject: [PATCH 3/5] PCI: iproc: Add iProc PCIe MSI device tree binding
|
||||
|
||||
Update the iProc PCIe device tree bindings with added binding information
|
||||
for MSI.
|
||||
|
||||
Signed-off-by: Ray Jui <rjui@broadcom.com>
|
||||
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
|
||||
Reviewed-by: Anup Patel <anup.patel@broadcom.com>
|
||||
Reviewed-by: Vikram Prakash <vikramp@broadcom.com>
|
||||
Reviewed-by: Scott Branden <sbranden@broadcom.com>
|
||||
---
|
||||
.../devicetree/bindings/pci/brcm,iproc-pcie.txt | 35 ++++++++++++++++++++++
|
||||
1 file changed, 35 insertions(+)
|
||||
|
||||
--- a/Documentation/devicetree/bindings/pci/brcm,iproc-pcie.txt
|
||||
+++ b/Documentation/devicetree/bindings/pci/brcm,iproc-pcie.txt
|
||||
@@ -35,6 +35,28 @@ Optional:
|
||||
- brcm,pcie-ob-oarr-size: Some iProc SoCs need the OARR size bit to be set to
|
||||
increase the outbound window size
|
||||
|
||||
+MSI support (optional):
|
||||
+
|
||||
+For older platforms without MSI integrated in the GIC, iProc PCIe core provides
|
||||
+an event queue based MSI support. The iProc MSI uses host memories to store
|
||||
+MSI posted writes in the event queues
|
||||
+
|
||||
+- msi-parent: Link to the device node of the MSI controller. On newer iProc
|
||||
+platforms, the MSI controller may be gicv2m or gicv3-its. On older iProc
|
||||
+platforms without MSI support in its interrupt controller, one may use the
|
||||
+event queue based MSI support integrated within the iProc PCIe core.
|
||||
+
|
||||
+When the iProc event queue based MSI is used, one needs to define the
|
||||
+following properties in the MSI device node:
|
||||
+- compatible: Must be "brcm,iproc-msi"
|
||||
+- msi-controller: claims itself as an MSI controller
|
||||
+- interrupt-parent: Link to its parent interrupt device
|
||||
+- interrupts: List of interrupt IDs from its parent interrupt device
|
||||
+
|
||||
+Optional properties:
|
||||
+- brcm,pcie-msi-inten: Needs to be present for some older iProc platforms that
|
||||
+require the interrupt enable registers to be set explicitly to enable MSI
|
||||
+
|
||||
Example:
|
||||
pcie0: pcie@18012000 {
|
||||
compatible = "brcm,iproc-pcie";
|
||||
@@ -61,6 +83,19 @@ Example:
|
||||
brcm,pcie-ob-oarr-size;
|
||||
brcm,pcie-ob-axi-offset = <0x00000000>;
|
||||
brcm,pcie-ob-window-size = <256>;
|
||||
+
|
||||
+ msi-parent = <&msi0>;
|
||||
+
|
||||
+ /* iProc event queue based MSI */
|
||||
+ msi0: msi@18012000 {
|
||||
+ compatible = "brcm,iproc-msi";
|
||||
+ msi-controller;
|
||||
+ interrupt-parent = <&gic>;
|
||||
+ interrupts = <GIC_SPI 96 IRQ_TYPE_NONE>,
|
||||
+ <GIC_SPI 97 IRQ_TYPE_NONE>,
|
||||
+ <GIC_SPI 98 IRQ_TYPE_NONE>,
|
||||
+ <GIC_SPI 99 IRQ_TYPE_NONE>,
|
||||
+ };
|
||||
};
|
||||
|
||||
pcie1: pcie@18013000 {
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue