mirror of
https://github.com/openwrt/openwrt.git
synced 2025-04-14 06:27:03 +00:00
bmips: add linux v5.15 support
Build system: x86_64 Build-tested: generic, nand Run-tested: generic/AR-5387un, nand/VR-3032u Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
This commit is contained in:
parent
810eac8c7f
commit
6a1e7c767f
@ -10,6 +10,7 @@ SUBTARGETS:=generic nand
|
||||
FEATURES:=gpio source-only squashfs usb
|
||||
|
||||
KERNEL_PATCHVER:=5.10
|
||||
KERNEL_TESTING_PATCHVER:=5.15
|
||||
|
||||
define Target/Description
|
||||
Build firmware images for BCM33xx cable modem chips,
|
||||
|
301
target/linux/bmips/config-5.15
Normal file
301
target/linux/bmips/config-5.15
Normal file
@ -0,0 +1,301 @@
|
||||
CONFIG_ARCH_32BIT_OFF_T=y
|
||||
CONFIG_ARCH_HIBERNATION_POSSIBLE=y
|
||||
CONFIG_ARCH_KEEP_MEMBLOCK=y
|
||||
CONFIG_ARCH_MMAP_RND_BITS_MAX=15
|
||||
CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MAX=15
|
||||
CONFIG_ARCH_SUSPEND_POSSIBLE=y
|
||||
CONFIG_B53=y
|
||||
CONFIG_B53_MDIO_DRIVER=y
|
||||
CONFIG_B53_MMAP_DRIVER=y
|
||||
CONFIG_B53_SPI_DRIVER=y
|
||||
CONFIG_BCM6345_EXT_IRQ=y
|
||||
CONFIG_BCM6345_L1_IRQ=y
|
||||
CONFIG_BCM6368_ENETSW=y
|
||||
CONFIG_BCM63XX_POWER=y
|
||||
CONFIG_BCM7038_L1_IRQ=y
|
||||
CONFIG_BCM7038_WDT=y
|
||||
CONFIG_BCM7120_L2_IRQ=y
|
||||
CONFIG_BCMA=y
|
||||
CONFIG_BCMA_BLOCKIO=y
|
||||
# CONFIG_BCMA_DEBUG is not set
|
||||
# CONFIG_BCMA_DRIVER_GMAC_CMN is not set
|
||||
# CONFIG_BCMA_DRIVER_MIPS is not set
|
||||
CONFIG_BCMA_DRIVER_PCI=y
|
||||
# CONFIG_BCMA_DRIVER_PCI_HOSTMODE is not set
|
||||
CONFIG_BCMA_HOST_PCI=y
|
||||
CONFIG_BCMA_HOST_PCI_POSSIBLE=y
|
||||
# CONFIG_BCMA_HOST_SOC is not set
|
||||
CONFIG_BLK_MQ_PCI=y
|
||||
CONFIG_BLK_PM=y
|
||||
CONFIG_BMIPS_GENERIC=y
|
||||
CONFIG_BOARD_SCACHE=y
|
||||
CONFIG_BRCMSTB_L2_IRQ=y
|
||||
CONFIG_CEVT_R4K=y
|
||||
CONFIG_CLK_BCM63268_TIMER=y
|
||||
CONFIG_CLK_BCM_63XX_GATE=y
|
||||
CONFIG_CLONE_BACKWARDS=y
|
||||
CONFIG_COMMON_CLK=y
|
||||
CONFIG_COMPAT_32BIT_TIME=y
|
||||
CONFIG_CPU_BIG_ENDIAN=y
|
||||
CONFIG_CPU_BMIPS=y
|
||||
CONFIG_CPU_BMIPS32_3300=y
|
||||
CONFIG_CPU_BMIPS4350=y
|
||||
CONFIG_CPU_BMIPS4380=y
|
||||
CONFIG_CPU_BMIPS5000=y
|
||||
CONFIG_CPU_GENERIC_DUMP_TLB=y
|
||||
CONFIG_CPU_HAS_PREFETCH=y
|
||||
CONFIG_CPU_HAS_RIXI=y
|
||||
CONFIG_CPU_HAS_SYNC=y
|
||||
# CONFIG_CPU_LITTLE_ENDIAN is not set
|
||||
CONFIG_CPU_MIPS32=y
|
||||
CONFIG_CPU_NEEDS_NO_SMARTMIPS_OR_MICROMIPS=y
|
||||
CONFIG_CPU_NO_EFFICIENT_FFS=y
|
||||
CONFIG_CPU_R4K_CACHE_TLB=y
|
||||
CONFIG_CPU_RMAP=y
|
||||
CONFIG_CPU_SUPPORTS_32BIT_KERNEL=y
|
||||
CONFIG_CPU_SUPPORTS_CPUFREQ=y
|
||||
CONFIG_CPU_SUPPORTS_HIGHMEM=y
|
||||
CONFIG_CRASH_DUMP=y
|
||||
CONFIG_CRC16=y
|
||||
CONFIG_CRYPTO_DEFLATE=y
|
||||
CONFIG_CRYPTO_LIB_POLY1305_RSIZE=2
|
||||
CONFIG_CRYPTO_LZO=y
|
||||
CONFIG_CRYPTO_RNG2=y
|
||||
CONFIG_CRYPTO_ZSTD=y
|
||||
CONFIG_CSRC_R4K=y
|
||||
CONFIG_DEBUG_INFO=y
|
||||
CONFIG_DMA_NONCOHERENT=y
|
||||
CONFIG_DTC=y
|
||||
# CONFIG_DT_BCM93384WVG is not set
|
||||
# CONFIG_DT_BCM93384WVG_VIPER is not set
|
||||
# CONFIG_DT_BCM96368MVWG is not set
|
||||
# CONFIG_DT_BCM97125CBMB is not set
|
||||
# CONFIG_DT_BCM97346DBSMB is not set
|
||||
# CONFIG_DT_BCM97358SVMB is not set
|
||||
# CONFIG_DT_BCM97360SVMB is not set
|
||||
# CONFIG_DT_BCM97362SVMB is not set
|
||||
# CONFIG_DT_BCM97420C is not set
|
||||
# CONFIG_DT_BCM97425SVMB is not set
|
||||
# CONFIG_DT_BCM97435SVMB is not set
|
||||
# CONFIG_DT_BCM9EJTAGPRB is not set
|
||||
# CONFIG_DT_COMTREND_VR3032U is not set
|
||||
# CONFIG_DT_NETGEAR_CVG834G is not set
|
||||
CONFIG_DT_NONE=y
|
||||
# CONFIG_DT_SFR_NEUFBOX4_SERCOMM is not set
|
||||
# CONFIG_DT_SFR_NEUFBOX6_SERCOMM is not set
|
||||
CONFIG_FIXED_PHY=y
|
||||
CONFIG_FWNODE_MDIO=y
|
||||
CONFIG_FW_LOADER_PAGED_BUF=y
|
||||
CONFIG_GENERIC_ATOMIC64=y
|
||||
CONFIG_GENERIC_CLOCKEVENTS=y
|
||||
CONFIG_GENERIC_CMOS_UPDATE=y
|
||||
CONFIG_GENERIC_CPU_AUTOPROBE=y
|
||||
CONFIG_GENERIC_FIND_FIRST_BIT=y
|
||||
CONFIG_GENERIC_GETTIMEOFDAY=y
|
||||
CONFIG_GENERIC_IOMAP=y
|
||||
CONFIG_GENERIC_IRQ_CHIP=y
|
||||
CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y
|
||||
CONFIG_GENERIC_IRQ_SHOW=y
|
||||
CONFIG_GENERIC_LIB_ASHLDI3=y
|
||||
CONFIG_GENERIC_LIB_ASHRDI3=y
|
||||
CONFIG_GENERIC_LIB_CMPDI2=y
|
||||
CONFIG_GENERIC_LIB_LSHRDI3=y
|
||||
CONFIG_GENERIC_LIB_UCMPDI2=y
|
||||
CONFIG_GENERIC_PCI_IOMAP=y
|
||||
CONFIG_GENERIC_PHY=y
|
||||
CONFIG_GENERIC_PINCONF=y
|
||||
CONFIG_GENERIC_PINCTRL_GROUPS=y
|
||||
CONFIG_GENERIC_PINMUX_FUNCTIONS=y
|
||||
CONFIG_GENERIC_SCHED_CLOCK=y
|
||||
CONFIG_GENERIC_SMP_IDLE_THREAD=y
|
||||
CONFIG_GENERIC_TIME_VSYSCALL=y
|
||||
CONFIG_GPIOLIB=y
|
||||
# CONFIG_GPIO_BRCMSTB is not set
|
||||
CONFIG_GPIO_CDEV=y
|
||||
CONFIG_GPIO_GENERIC=y
|
||||
CONFIG_GPIO_GENERIC_PLATFORM=y
|
||||
CONFIG_GPIO_REGMAP=y
|
||||
CONFIG_GRO_CELLS=y
|
||||
CONFIG_HANDLE_DOMAIN_IRQ=y
|
||||
CONFIG_HARDIRQS_SW_RESEND=y
|
||||
CONFIG_HAS_DMA=y
|
||||
CONFIG_HAS_IOMEM=y
|
||||
CONFIG_HAS_IOPORT_MAP=y
|
||||
CONFIG_HW_RANDOM=y
|
||||
CONFIG_HW_RANDOM_BCM2835=y
|
||||
CONFIG_HZ_PERIODIC=y
|
||||
CONFIG_INITRAMFS_SOURCE=""
|
||||
CONFIG_IRQCHIP=y
|
||||
CONFIG_IRQ_DOMAIN=y
|
||||
CONFIG_IRQ_FORCED_THREADING=y
|
||||
CONFIG_IRQ_MIPS_CPU=y
|
||||
CONFIG_IRQ_WORK=y
|
||||
CONFIG_LEDS_BCM6328=y
|
||||
CONFIG_LEDS_BCM6358=y
|
||||
CONFIG_LEDS_GPIO=y
|
||||
CONFIG_LIBFDT=y
|
||||
CONFIG_LOCK_DEBUGGING_SUPPORT=y
|
||||
CONFIG_LZO_COMPRESS=y
|
||||
CONFIG_LZO_DECOMPRESS=y
|
||||
CONFIG_MDIO_BUS=y
|
||||
CONFIG_MDIO_BUS_MUX=y
|
||||
CONFIG_MDIO_BUS_MUX_BCM6368=y
|
||||
CONFIG_MDIO_DEVICE=y
|
||||
CONFIG_MDIO_DEVRES=y
|
||||
CONFIG_MEMFD_CREATE=y
|
||||
CONFIG_MFD_SYSCON=y
|
||||
CONFIG_MIGRATION=y
|
||||
CONFIG_MIPS=y
|
||||
CONFIG_MIPS_ASID_BITS=8
|
||||
CONFIG_MIPS_ASID_SHIFT=0
|
||||
CONFIG_MIPS_CLOCK_VSYSCALL=y
|
||||
# CONFIG_MIPS_CMDLINE_FROM_BOOTLOADER is not set
|
||||
CONFIG_MIPS_CMDLINE_FROM_DTB=y
|
||||
CONFIG_MIPS_CPU_SCACHE=y
|
||||
CONFIG_MIPS_EBPF_JIT=y
|
||||
CONFIG_MIPS_EXTERNAL_TIMER=y
|
||||
CONFIG_MIPS_L1_CACHE_SHIFT=7
|
||||
CONFIG_MIPS_L1_CACHE_SHIFT_6=y
|
||||
CONFIG_MIPS_L1_CACHE_SHIFT_7=y
|
||||
CONFIG_MIPS_LD_CAN_LINK_VDSO=y
|
||||
# CONFIG_MIPS_NO_APPENDED_DTB is not set
|
||||
CONFIG_MIPS_NR_CPU_NR_MAP=2
|
||||
CONFIG_MIPS_O32_FP64_SUPPORT=y
|
||||
CONFIG_MIPS_RAW_APPENDED_DTB=y
|
||||
CONFIG_MODULES_USE_ELF_REL=y
|
||||
CONFIG_MODULE_FORCE_LOAD=y
|
||||
CONFIG_MODULE_FORCE_UNLOAD=y
|
||||
# CONFIG_MTD_BCM63XX_PARTS is not set
|
||||
CONFIG_MTD_CFI_ADV_OPTIONS=y
|
||||
CONFIG_MTD_CFI_BE_BYTE_SWAP=y
|
||||
# CONFIG_MTD_CFI_GEOMETRY is not set
|
||||
# CONFIG_MTD_CFI_NOSWAP is not set
|
||||
CONFIG_MTD_CFI_STAA=y
|
||||
CONFIG_MTD_JEDECPROBE=y
|
||||
# CONFIG_MTD_PARSER_IMAGETAG is not set
|
||||
CONFIG_NEED_DMA_MAP_STATE=y
|
||||
CONFIG_NET_DEVLINK=y
|
||||
CONFIG_NET_DSA=y
|
||||
CONFIG_NET_DSA_TAG_BRCM=y
|
||||
CONFIG_NET_DSA_TAG_BRCM_COMMON=y
|
||||
CONFIG_NET_DSA_TAG_BRCM_LEGACY=y
|
||||
CONFIG_NET_DSA_TAG_BRCM_PREPEND=y
|
||||
CONFIG_NET_FLOW_LIMIT=y
|
||||
CONFIG_NET_SELFTESTS=y
|
||||
CONFIG_NET_SWITCHDEV=y
|
||||
CONFIG_NO_EXCEPT_FILL=y
|
||||
CONFIG_NO_GENERIC_PCI_IOPORT_MAP=y
|
||||
CONFIG_NR_CPUS=2
|
||||
CONFIG_NVMEM=y
|
||||
CONFIG_OF=y
|
||||
CONFIG_OF_ADDRESS=y
|
||||
CONFIG_OF_EARLY_FLATTREE=y
|
||||
CONFIG_OF_FLATTREE=y
|
||||
CONFIG_OF_GPIO=y
|
||||
CONFIG_OF_IRQ=y
|
||||
CONFIG_OF_KOBJ=y
|
||||
CONFIG_OF_MDIO=y
|
||||
CONFIG_PADATA=y
|
||||
CONFIG_PCI=y
|
||||
CONFIG_PCIEPORTBUS=y
|
||||
CONFIG_PCIE_BCM6318=y
|
||||
CONFIG_PCIE_BCM6328=y
|
||||
CONFIG_PCIE_PME=y
|
||||
CONFIG_PCI_BCM6348=y
|
||||
CONFIG_PCI_DOMAINS=y
|
||||
CONFIG_PCI_DRIVERS_LEGACY=y
|
||||
CONFIG_PERF_USE_VMALLOC=y
|
||||
CONFIG_PGTABLE_LEVELS=2
|
||||
CONFIG_PHYLIB=y
|
||||
CONFIG_PHYLINK=y
|
||||
CONFIG_PHYSICAL_START=0x80010000
|
||||
CONFIG_PHY_BCM63XX_USBH=y
|
||||
# CONFIG_PHY_BRCM_SATA is not set
|
||||
CONFIG_PINCTRL=y
|
||||
CONFIG_PINCTRL_BCM6318=y
|
||||
CONFIG_PINCTRL_BCM63268=y
|
||||
CONFIG_PINCTRL_BCM6328=y
|
||||
CONFIG_PINCTRL_BCM6358=y
|
||||
CONFIG_PINCTRL_BCM6362=y
|
||||
CONFIG_PINCTRL_BCM6368=y
|
||||
CONFIG_PINCTRL_BCM63XX=y
|
||||
CONFIG_PM=y
|
||||
CONFIG_PM_CLK=y
|
||||
CONFIG_PM_GENERIC_DOMAINS=y
|
||||
CONFIG_PM_GENERIC_DOMAINS_OF=y
|
||||
CONFIG_POSIX_MQUEUE=y
|
||||
CONFIG_POSIX_MQUEUE_SYSCTL=y
|
||||
CONFIG_POWER_RESET=y
|
||||
CONFIG_POWER_RESET_SYSCON=y
|
||||
CONFIG_POWER_SUPPLY=y
|
||||
CONFIG_PROC_VMCORE=y
|
||||
CONFIG_PTP_1588_CLOCK_OPTIONAL=y
|
||||
CONFIG_QUEUED_RWLOCKS=y
|
||||
CONFIG_QUEUED_SPINLOCKS=y
|
||||
CONFIG_RATIONAL=y
|
||||
CONFIG_REGMAP=y
|
||||
CONFIG_REGMAP_MMIO=y
|
||||
CONFIG_RELAY=y
|
||||
CONFIG_RESET_BCM6345=y
|
||||
CONFIG_RESET_CONTROLLER=y
|
||||
CONFIG_RFS_ACCEL=y
|
||||
CONFIG_RPS=y
|
||||
# CONFIG_SERIAL_8250 is not set
|
||||
CONFIG_SERIAL_BCM63XX=y
|
||||
CONFIG_SERIAL_BCM63XX_CONSOLE=y
|
||||
CONFIG_SGL_ALLOC=y
|
||||
CONFIG_SMP=y
|
||||
CONFIG_SMP_UP=y
|
||||
CONFIG_SOCK_RX_QUEUE_MAPPING=y
|
||||
CONFIG_SOC_BCM63XX=y
|
||||
CONFIG_SPI=y
|
||||
CONFIG_SPI_BCM63XX=y
|
||||
CONFIG_SPI_BCM63XX_HSSPI=y
|
||||
CONFIG_SPI_MASTER=y
|
||||
CONFIG_SPI_MEM=y
|
||||
CONFIG_SRCU=y
|
||||
CONFIG_SSB=y
|
||||
CONFIG_SSB_B43_PCI_BRIDGE=y
|
||||
CONFIG_SSB_BLOCKIO=y
|
||||
# CONFIG_SSB_DRIVER_MIPS is not set
|
||||
CONFIG_SSB_DRIVER_PCICORE=y
|
||||
CONFIG_SSB_DRIVER_PCICORE_POSSIBLE=y
|
||||
CONFIG_SSB_PCIHOST=y
|
||||
CONFIG_SSB_PCIHOST_POSSIBLE=y
|
||||
CONFIG_SSB_SPROM=y
|
||||
CONFIG_SWAP_IO_SPACE=y
|
||||
CONFIG_SWPHY=y
|
||||
CONFIG_SYNC_R4K=y
|
||||
CONFIG_SYSCTL_EXCEPTION_TRACE=y
|
||||
CONFIG_SYS_HAS_CPU_BMIPS=y
|
||||
CONFIG_SYS_HAS_CPU_BMIPS32_3300=y
|
||||
CONFIG_SYS_HAS_CPU_BMIPS4350=y
|
||||
CONFIG_SYS_HAS_CPU_BMIPS4380=y
|
||||
CONFIG_SYS_HAS_CPU_BMIPS5000=y
|
||||
CONFIG_SYS_SUPPORTS_32BIT_KERNEL=y
|
||||
CONFIG_SYS_SUPPORTS_ARBIT_HZ=y
|
||||
CONFIG_SYS_SUPPORTS_BIG_ENDIAN=y
|
||||
CONFIG_SYS_SUPPORTS_HIGHMEM=y
|
||||
CONFIG_SYS_SUPPORTS_HOTPLUG_CPU=y
|
||||
CONFIG_SYS_SUPPORTS_LITTLE_ENDIAN=y
|
||||
CONFIG_SYS_SUPPORTS_SMP=y
|
||||
CONFIG_TARGET_ISA_REV=0
|
||||
CONFIG_TICK_CPU_ACCOUNTING=y
|
||||
CONFIG_TREE_RCU=y
|
||||
CONFIG_TREE_SRCU=y
|
||||
CONFIG_USB_EHCI_BIG_ENDIAN_DESC=y
|
||||
CONFIG_USB_EHCI_BIG_ENDIAN_MMIO=y
|
||||
CONFIG_USB_OHCI_BIG_ENDIAN_DESC=y
|
||||
CONFIG_USB_OHCI_BIG_ENDIAN_MMIO=y
|
||||
CONFIG_USB_SUPPORT=y
|
||||
CONFIG_USE_OF=y
|
||||
CONFIG_VM_EVENT_COUNTERS=y
|
||||
CONFIG_WATCHDOG_CORE=y
|
||||
CONFIG_WATCHDOG_NOWAYOUT=y
|
||||
CONFIG_WEAK_ORDERING=y
|
||||
CONFIG_XPS=y
|
||||
CONFIG_XXHASH=y
|
||||
CONFIG_ZLIB_DEFLATE=y
|
||||
CONFIG_ZLIB_INFLATE=y
|
||||
CONFIG_ZSTD_COMPRESS=y
|
||||
CONFIG_ZSTD_DECOMPRESS=y
|
@ -46,6 +46,7 @@ static void ath9k_pci_fixup(struct pci_dev *dev)
|
||||
u32 bar0;
|
||||
u32 val;
|
||||
unsigned i;
|
||||
int rc;
|
||||
|
||||
for (i = 0; i < ath9k_num_fixups; i++) {
|
||||
if (ath9k_fixups[i]->pci_dev != PCI_SLOT(dev->devfn))
|
||||
@ -74,8 +75,11 @@ static void ath9k_pci_fixup(struct pci_dev *dev)
|
||||
return;
|
||||
}
|
||||
|
||||
if (bridge)
|
||||
pci_enable_device(bridge);
|
||||
if (bridge) {
|
||||
rc = pci_enable_device(bridge);
|
||||
if (rc < 0)
|
||||
pr_err("pci %s: bridge enable error\n", pci_name(dev));
|
||||
}
|
||||
|
||||
pci_read_config_dword(dev, PCI_BASE_ADDRESS_0, &bar0);
|
||||
pci_read_config_dword(dev, PCI_BASE_ADDRESS_0, &bar0);
|
||||
|
@ -21,6 +21,7 @@
|
||||
#include <linux/pci.h>
|
||||
#include <linux/reset.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/version.h>
|
||||
#include <linux/vmalloc.h>
|
||||
|
||||
#include "../pci.h"
|
||||
@ -346,7 +347,9 @@ static struct pci_controller bcm6348_pci_controller = {
|
||||
.pci_ops = &bcm6348_pci_ops,
|
||||
.io_resource = &bcm6348_pci_io_resource,
|
||||
.mem_resource = &bcm6348_pci_mem_resource,
|
||||
#if LINUX_VERSION_CODE < KERNEL_VERSION(5,13,0)
|
||||
.busn_resource = &bcm6348_pci_busn_resource,
|
||||
#endif
|
||||
};
|
||||
|
||||
#ifdef CONFIG_CARDBUS
|
||||
@ -729,6 +732,9 @@ static int bcm6348_pci_probe(struct platform_device *pdev)
|
||||
struct device_node *np = dev->of_node;
|
||||
struct bcm6348_pci *priv = &bcm6348_pci;
|
||||
struct resource *res;
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,13,0)
|
||||
LIST_HEAD(resources);
|
||||
#endif
|
||||
|
||||
of_pci_check_probe_only();
|
||||
|
||||
@ -771,6 +777,9 @@ static int bcm6348_pci_probe(struct platform_device *pdev)
|
||||
return -EINVAL;
|
||||
|
||||
of_pci_parse_bus_range(np, &bcm6348_pci_busn_resource);
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,13,0)
|
||||
pci_add_resource(&resources, &bcm6348_pci_busn_resource);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Configuration accesses are done through IO space, remap 4
|
||||
|
@ -19,6 +19,7 @@
|
||||
#include <linux/pci.h>
|
||||
#include <linux/reset.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/version.h>
|
||||
#include <linux/vmalloc.h>
|
||||
|
||||
#include "../pci.h"
|
||||
@ -168,7 +169,7 @@ static int bcm6318_pcie_can_access(struct pci_bus *bus, int devfn)
|
||||
if (PCI_SLOT(devfn) == 0)
|
||||
return __raw_readl(priv->base + PCIE_DLSTATUS_REG)
|
||||
& DLSTATUS_PHYLINKUP;
|
||||
/* else, fall through */
|
||||
fallthrough;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
@ -226,7 +227,9 @@ static struct pci_controller bcm6318_pcie_controller = {
|
||||
.pci_ops = &bcm6318_pcie_ops,
|
||||
.io_resource = &bcm6318_pcie_io_resource,
|
||||
.mem_resource = &bcm6318_pcie_mem_resource,
|
||||
#if LINUX_VERSION_CODE < KERNEL_VERSION(5,13,0)
|
||||
.busn_resource = &bcm6318_pcie_busn_resource,
|
||||
#endif
|
||||
};
|
||||
|
||||
static void bcm6318_pcie_reset(struct bcm6318_pcie *priv)
|
||||
@ -305,6 +308,9 @@ static int bcm6318_pcie_probe(struct platform_device *pdev)
|
||||
struct bcm6318_pcie *priv = &bcm6318_pcie;
|
||||
struct resource *res;
|
||||
int ret;
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,13,0)
|
||||
LIST_HEAD(resources);
|
||||
#endif
|
||||
|
||||
of_pci_check_probe_only();
|
||||
|
||||
@ -370,6 +376,9 @@ static int bcm6318_pcie_probe(struct platform_device *pdev)
|
||||
return -EINVAL;
|
||||
|
||||
of_pci_parse_bus_range(np, &bcm6318_pcie_busn_resource);
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,13,0)
|
||||
pci_add_resource(&resources, &bcm6318_pcie_busn_resource);
|
||||
#endif
|
||||
|
||||
bcm6318_pcie_reset(priv);
|
||||
bcm6318_pcie_setup(priv);
|
||||
|
@ -23,6 +23,7 @@
|
||||
#include <linux/reset.h>
|
||||
#include <linux/regmap.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/version.h>
|
||||
#include <linux/vmalloc.h>
|
||||
|
||||
#include "../pci.h"
|
||||
@ -151,7 +152,7 @@ static int bcm6328_pcie_can_access(struct pci_bus *bus, int devfn)
|
||||
if (PCI_SLOT(devfn) == 0)
|
||||
return __raw_readl(priv->base + PCIE_DLSTATUS_REG)
|
||||
& DLSTATUS_PHYLINKUP;
|
||||
/* else, fall through */
|
||||
fallthrough;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
@ -209,7 +210,9 @@ static struct pci_controller bcm6328_pcie_controller = {
|
||||
.pci_ops = &bcm6328_pcie_ops,
|
||||
.io_resource = &bcm6328_pcie_io_resource,
|
||||
.mem_resource = &bcm6328_pcie_mem_resource,
|
||||
#if LINUX_VERSION_CODE < KERNEL_VERSION(5,13,0)
|
||||
.busn_resource = &bcm6328_pcie_busn_resource,
|
||||
#endif
|
||||
};
|
||||
|
||||
static void bcm6328_pcie_reset(struct bcm6328_pcie *priv)
|
||||
@ -294,6 +297,9 @@ static int bcm6328_pcie_probe(struct platform_device *pdev)
|
||||
struct resource *res;
|
||||
unsigned int i;
|
||||
int ret;
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,13,0)
|
||||
LIST_HEAD(resources);
|
||||
#endif
|
||||
|
||||
pm_runtime_enable(dev);
|
||||
pm_runtime_no_callbacks(dev);
|
||||
@ -380,6 +386,9 @@ static int bcm6328_pcie_probe(struct platform_device *pdev)
|
||||
return -EINVAL;
|
||||
|
||||
of_pci_parse_bus_range(np, &bcm6328_pcie_busn_resource);
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,13,0)
|
||||
pci_add_resource(&resources, &bcm6328_pcie_busn_resource);
|
||||
#endif
|
||||
|
||||
bcm6328_pcie_reset(priv);
|
||||
bcm6328_pcie_setup(priv);
|
||||
|
@ -8,6 +8,7 @@ case "$(board_name)" in
|
||||
comtrend,ar-5315u |\
|
||||
comtrend,ar-5387un |\
|
||||
comtrend,vr-3025u)
|
||||
ucidef_set_bridge_device switch
|
||||
ucidef_set_interface_lan "lan1 lan2 lan3 lan4"
|
||||
;;
|
||||
esac
|
||||
|
@ -6,6 +6,7 @@ board_config_update
|
||||
|
||||
case "$(board_name)" in
|
||||
comtrend,vr-3032u)
|
||||
ucidef_set_bridge_device switch
|
||||
ucidef_set_interface_lan "lan1 lan2 lan3 lan4"
|
||||
;;
|
||||
netgear,dgnd3700-v2)
|
||||
|
@ -0,0 +1,392 @@
|
||||
From cf908990d4a8ccdb73ee4484aa8cadad379ca314 Mon Sep 17 00:00:00 2001
|
||||
From: Jonas Gorski <jogo@openwrt.org>
|
||||
Date: Sun, 30 Nov 2014 14:54:27 +0100
|
||||
Subject: [PATCH 2/5] irqchip: add support for bcm6345-style external
|
||||
interrupt controller
|
||||
|
||||
Signed-off-by: Jonas Gorski <jogo@openwrt.org>
|
||||
---
|
||||
.../interrupt-controller/brcm,bcm6345-ext-intc.txt | 29 ++
|
||||
drivers/irqchip/Kconfig | 4 +
|
||||
drivers/irqchip/Makefile | 1 +
|
||||
drivers/irqchip/irq-bcm6345-ext.c | 287 ++++++++++++++++++++
|
||||
include/linux/irqchip/irq-bcm6345-ext.h | 14 +
|
||||
5 files changed, 335 insertions(+)
|
||||
create mode 100644 Documentation/devicetree/bindings/interrupt-controller/brcm,bcm6345-ext-intc.txt
|
||||
create mode 100644 drivers/irqchip/irq-bcm6345-ext.c
|
||||
create mode 100644 include/linux/irqchip/irq-bcm6345-ext.h
|
||||
|
||||
--- /dev/null
|
||||
+++ b/Documentation/devicetree/bindings/interrupt-controller/brcm,bcm6345-ext-intc.txt
|
||||
@@ -0,0 +1,29 @@
|
||||
+Broadcom BCM6345-style external interrupt controller
|
||||
+
|
||||
+Required properties:
|
||||
+
|
||||
+- compatible: Should be "brcm,bcm6345-ext-intc" or "brcm,bcm6318-ext-intc".
|
||||
+- reg: Specifies the base physical addresses and size of the registers.
|
||||
+- interrupt-controller: identifies the node as an interrupt controller.
|
||||
+- #interrupt-cells: Specifies the number of cells needed to encode an interrupt
|
||||
+ source, Should be 2.
|
||||
+- interrupt-parent: Specifies the phandle to the parent interrupt controller
|
||||
+ this one is cascaded from.
|
||||
+- interrupts: Specifies the interrupt line(s) in the interrupt-parent controller
|
||||
+ node, valid values depend on the type of parent interrupt controller.
|
||||
+
|
||||
+Optional properties:
|
||||
+
|
||||
+- brcm,field-width: Size of each field (mask, clear, sense, ...) in bits in the
|
||||
+ register. Defaults to 4.
|
||||
+
|
||||
+Example:
|
||||
+
|
||||
+ext_intc: interrupt-controller@10000018 {
|
||||
+ compatible = "brcm,bcm6345-ext-intc";
|
||||
+ interrupt-parent = <&periph_intc>;
|
||||
+ #interrupt-cells = <2>;
|
||||
+ reg = <0x10000018 0x4>;
|
||||
+ interrupt-controller;
|
||||
+ interrupts = <24>, <25>, <26>, <27>;
|
||||
+};
|
||||
--- a/drivers/irqchip/Kconfig
|
||||
+++ b/drivers/irqchip/Kconfig
|
||||
@@ -108,6 +108,10 @@ config I8259
|
||||
bool
|
||||
select IRQ_DOMAIN
|
||||
|
||||
+config BCM6345_EXT_IRQ
|
||||
+ bool "BCM6345 External IRQ Controller"
|
||||
+ select IRQ_DOMAIN
|
||||
+
|
||||
config BCM6345_L1_IRQ
|
||||
bool
|
||||
select GENERIC_IRQ_CHIP
|
||||
--- a/drivers/irqchip/Makefile
|
||||
+++ b/drivers/irqchip/Makefile
|
||||
@@ -62,6 +62,7 @@ obj-$(CONFIG_XTENSA_MX) += irq-xtensa-
|
||||
obj-$(CONFIG_XILINX_INTC) += irq-xilinx-intc.o
|
||||
obj-$(CONFIG_IRQ_CROSSBAR) += irq-crossbar.o
|
||||
obj-$(CONFIG_SOC_VF610) += irq-vf610-mscm-ir.o
|
||||
+obj-$(CONFIG_BCM6345_EXT_IRQ) += irq-bcm6345-ext.o
|
||||
obj-$(CONFIG_BCM6345_L1_IRQ) += irq-bcm6345-l1.o
|
||||
obj-$(CONFIG_BCM7038_L1_IRQ) += irq-bcm7038-l1.o
|
||||
obj-$(CONFIG_BCM7120_L2_IRQ) += irq-bcm7120-l2.o
|
||||
--- /dev/null
|
||||
+++ b/drivers/irqchip/irq-bcm6345-ext.c
|
||||
@@ -0,0 +1,299 @@
|
||||
+/*
|
||||
+ * This file is subject to the terms and conditions of the GNU General Public
|
||||
+ * License. See the file "COPYING" in the main directory of this archive
|
||||
+ * for more details.
|
||||
+ *
|
||||
+ * Copyright (C) 2014 Jonas Gorski <jogo@openwrt.org>
|
||||
+ */
|
||||
+
|
||||
+#include <linux/ioport.h>
|
||||
+#include <linux/irq.h>
|
||||
+#include <linux/irqchip.h>
|
||||
+#include <linux/irqchip/chained_irq.h>
|
||||
+#include <linux/irqchip/irq-bcm6345-ext.h>
|
||||
+#include <linux/kernel.h>
|
||||
+#include <linux/of.h>
|
||||
+#include <linux/of_irq.h>
|
||||
+#include <linux/of_address.h>
|
||||
+#include <linux/slab.h>
|
||||
+#include <linux/spinlock.h>
|
||||
+
|
||||
+#ifdef CONFIG_BCM63XX
|
||||
+#include <asm/mach-bcm63xx/bcm63xx_irq.h>
|
||||
+
|
||||
+#define VIRQ_BASE IRQ_EXTERNAL_BASE
|
||||
+#else
|
||||
+#define VIRQ_BASE 0
|
||||
+#endif
|
||||
+
|
||||
+#define MAX_IRQS 4
|
||||
+
|
||||
+#define EXTIRQ_CFG_SENSE 0
|
||||
+#define EXTIRQ_CFG_STAT 1
|
||||
+#define EXTIRQ_CFG_CLEAR 2
|
||||
+#define EXTIRQ_CFG_MASK 3
|
||||
+#define EXTIRQ_CFG_BOTHEDGE 4
|
||||
+#define EXTIRQ_CFG_LEVELSENSE 5
|
||||
+
|
||||
+struct intc_data {
|
||||
+ struct irq_chip chip;
|
||||
+ struct irq_domain *domain;
|
||||
+ raw_spinlock_t lock;
|
||||
+
|
||||
+ int parent_irq[MAX_IRQS];
|
||||
+ void __iomem *reg;
|
||||
+ int shift;
|
||||
+ unsigned int toggle_clear_on_ack:1;
|
||||
+};
|
||||
+
|
||||
+static void bcm6345_ext_intc_irq_handle(struct irq_desc *desc)
|
||||
+{
|
||||
+ struct intc_data *data = irq_desc_get_handler_data(desc);
|
||||
+ struct irq_chip *chip = irq_desc_get_chip(desc);
|
||||
+ unsigned int irq = irq_desc_get_irq(desc);
|
||||
+ unsigned int idx;
|
||||
+
|
||||
+ chained_irq_enter(chip, desc);
|
||||
+
|
||||
+ for (idx = 0; idx < MAX_IRQS; idx++) {
|
||||
+ if (data->parent_irq[idx] != irq)
|
||||
+ continue;
|
||||
+
|
||||
+ generic_handle_irq(irq_find_mapping(data->domain, idx));
|
||||
+ }
|
||||
+
|
||||
+ chained_irq_exit(chip, desc);
|
||||
+}
|
||||
+
|
||||
+static void bcm6345_ext_intc_irq_ack(struct irq_data *data)
|
||||
+{
|
||||
+ struct intc_data *priv = data->domain->host_data;
|
||||
+ irq_hw_number_t hwirq = irqd_to_hwirq(data);
|
||||
+ u32 reg;
|
||||
+
|
||||
+ raw_spin_lock(&priv->lock);
|
||||
+ reg = __raw_readl(priv->reg);
|
||||
+ __raw_writel(reg | (1 << (hwirq + EXTIRQ_CFG_CLEAR * priv->shift)),
|
||||
+ priv->reg);
|
||||
+ if (priv->toggle_clear_on_ack)
|
||||
+ __raw_writel(reg, priv->reg);
|
||||
+ raw_spin_unlock(&priv->lock);
|
||||
+}
|
||||
+
|
||||
+static void bcm6345_ext_intc_irq_mask(struct irq_data *data)
|
||||
+{
|
||||
+ struct intc_data *priv = data->domain->host_data;
|
||||
+ irq_hw_number_t hwirq = irqd_to_hwirq(data);
|
||||
+ u32 reg;
|
||||
+
|
||||
+ raw_spin_lock(&priv->lock);
|
||||
+ reg = __raw_readl(priv->reg);
|
||||
+ reg &= ~(1 << (hwirq + EXTIRQ_CFG_MASK * priv->shift));
|
||||
+ __raw_writel(reg, priv->reg);
|
||||
+ raw_spin_unlock(&priv->lock);
|
||||
+}
|
||||
+
|
||||
+static void bcm6345_ext_intc_irq_unmask(struct irq_data *data)
|
||||
+{
|
||||
+ struct intc_data *priv = data->domain->host_data;
|
||||
+ irq_hw_number_t hwirq = irqd_to_hwirq(data);
|
||||
+ u32 reg;
|
||||
+
|
||||
+ raw_spin_lock(&priv->lock);
|
||||
+ reg = __raw_readl(priv->reg);
|
||||
+ reg |= 1 << (hwirq + EXTIRQ_CFG_MASK * priv->shift);
|
||||
+ __raw_writel(reg, priv->reg);
|
||||
+ raw_spin_unlock(&priv->lock);
|
||||
+}
|
||||
+
|
||||
+static int bcm6345_ext_intc_set_type(struct irq_data *data,
|
||||
+ unsigned int flow_type)
|
||||
+{
|
||||
+ struct intc_data *priv = data->domain->host_data;
|
||||
+ irq_hw_number_t hwirq = irqd_to_hwirq(data);
|
||||
+ bool levelsense = 0, sense = 0, bothedge = 0;
|
||||
+ u32 reg;
|
||||
+
|
||||
+ flow_type &= IRQ_TYPE_SENSE_MASK;
|
||||
+
|
||||
+ if (flow_type == IRQ_TYPE_NONE)
|
||||
+ flow_type = IRQ_TYPE_LEVEL_LOW;
|
||||
+
|
||||
+ switch (flow_type) {
|
||||
+ case IRQ_TYPE_EDGE_BOTH:
|
||||
+ bothedge = 1;
|
||||
+ break;
|
||||
+
|
||||
+ case IRQ_TYPE_EDGE_RISING:
|
||||
+ sense = 1;
|
||||
+ break;
|
||||
+
|
||||
+ case IRQ_TYPE_EDGE_FALLING:
|
||||
+ break;
|
||||
+
|
||||
+ case IRQ_TYPE_LEVEL_HIGH:
|
||||
+ levelsense = 1;
|
||||
+ sense = 1;
|
||||
+ break;
|
||||
+
|
||||
+ case IRQ_TYPE_LEVEL_LOW:
|
||||
+ levelsense = 1;
|
||||
+ break;
|
||||
+
|
||||
+ default:
|
||||
+ pr_err("bogus flow type combination given!\n");
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+ raw_spin_lock(&priv->lock);
|
||||
+ reg = __raw_readl(priv->reg);
|
||||
+
|
||||
+ if (levelsense)
|
||||
+ reg |= 1 << (hwirq + EXTIRQ_CFG_LEVELSENSE * priv->shift);
|
||||
+ else
|
||||
+ reg &= ~(1 << (hwirq + EXTIRQ_CFG_LEVELSENSE * priv->shift));
|
||||
+ if (sense)
|
||||
+ reg |= 1 << (hwirq + EXTIRQ_CFG_SENSE * priv->shift);
|
||||
+ else
|
||||
+ reg &= ~(1 << (hwirq + EXTIRQ_CFG_SENSE * priv->shift));
|
||||
+ if (bothedge)
|
||||
+ reg |= 1 << (hwirq + EXTIRQ_CFG_BOTHEDGE * priv->shift);
|
||||
+ else
|
||||
+ reg &= ~(1 << (hwirq + EXTIRQ_CFG_BOTHEDGE * priv->shift));
|
||||
+
|
||||
+ __raw_writel(reg, priv->reg);
|
||||
+ raw_spin_unlock(&priv->lock);
|
||||
+
|
||||
+ irqd_set_trigger_type(data, flow_type);
|
||||
+ if (flow_type & (IRQ_TYPE_LEVEL_LOW | IRQ_TYPE_LEVEL_HIGH))
|
||||
+ irq_set_handler_locked(data, handle_level_irq);
|
||||
+ else
|
||||
+ irq_set_handler_locked(data, handle_edge_irq);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int bcm6345_ext_intc_map(struct irq_domain *d, unsigned int irq,
|
||||
+ irq_hw_number_t hw)
|
||||
+{
|
||||
+ struct intc_data *priv = d->host_data;
|
||||
+
|
||||
+ irq_set_chip_and_handler(irq, &priv->chip, handle_level_irq);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static const struct irq_domain_ops bcm6345_ext_domain_ops = {
|
||||
+ .xlate = irq_domain_xlate_twocell,
|
||||
+ .map = bcm6345_ext_intc_map,
|
||||
+};
|
||||
+
|
||||
+static int __init __bcm6345_ext_intc_init(struct device_node *node,
|
||||
+ int num_irqs, int *irqs,
|
||||
+ void __iomem *reg, int shift,
|
||||
+ bool toggle_clear_on_ack)
|
||||
+{
|
||||
+ struct intc_data *data;
|
||||
+ unsigned int i;
|
||||
+ int start = VIRQ_BASE;
|
||||
+
|
||||
+ data = kzalloc(sizeof(*data), GFP_KERNEL);
|
||||
+ if (!data)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ raw_spin_lock_init(&data->lock);
|
||||
+
|
||||
+ for (i = 0; i < num_irqs; i++) {
|
||||
+ data->parent_irq[i] = irqs[i];
|
||||
+
|
||||
+ irq_set_handler_data(irqs[i], data);
|
||||
+ irq_set_chained_handler(irqs[i], bcm6345_ext_intc_irq_handle);
|
||||
+ }
|
||||
+
|
||||
+ data->reg = reg;
|
||||
+ data->shift = shift;
|
||||
+ data->toggle_clear_on_ack = toggle_clear_on_ack;
|
||||
+
|
||||
+ data->chip.name = "bcm6345-ext-intc";
|
||||
+ data->chip.irq_ack = bcm6345_ext_intc_irq_ack;
|
||||
+ data->chip.irq_mask = bcm6345_ext_intc_irq_mask;
|
||||
+ data->chip.irq_unmask = bcm6345_ext_intc_irq_unmask;
|
||||
+ data->chip.irq_set_type = bcm6345_ext_intc_set_type;
|
||||
+
|
||||
+ /*
|
||||
+ * If we have less than 4 irqs, this is the second controller on
|
||||
+ * bcm63xx. So increase the VIRQ start to not overlap with the first
|
||||
+ * one, but only do so if we actually use a non-zero start.
|
||||
+ *
|
||||
+ * This can be removed when bcm63xx has no legacy users anymore.
|
||||
+ */
|
||||
+ if (start && num_irqs < 4)
|
||||
+ start += 4;
|
||||
+
|
||||
+ data->domain = irq_domain_add_simple(node, num_irqs, start,
|
||||
+ &bcm6345_ext_domain_ops, data);
|
||||
+ if (!data->domain) {
|
||||
+ kfree(data);
|
||||
+ return -ENOMEM;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+void __init bcm6345_ext_intc_init(int num_irqs, int *irqs, void __iomem *reg,
|
||||
+ int shift)
|
||||
+{
|
||||
+ __bcm6345_ext_intc_init(NULL, num_irqs, irqs, reg, shift, false);
|
||||
+}
|
||||
+
|
||||
+#ifdef CONFIG_OF
|
||||
+static int __init bcm6345_ext_intc_of_init(struct device_node *node,
|
||||
+ struct device_node *parent)
|
||||
+{
|
||||
+ int num_irqs, ret = -EINVAL;
|
||||
+ unsigned i;
|
||||
+ void __iomem *base;
|
||||
+ int irqs[MAX_IRQS] = { 0 };
|
||||
+ u32 shift;
|
||||
+ bool toggle_clear_on_ack = false;
|
||||
+
|
||||
+ num_irqs = of_irq_count(node);
|
||||
+
|
||||
+ if (!num_irqs || num_irqs > MAX_IRQS)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ if (of_property_read_u32(node, "brcm,field-width", &shift))
|
||||
+ shift = 4;
|
||||
+
|
||||
+ /* on BCM6318 setting CLEAR seems to continuously mask interrupts */
|
||||
+ if (of_device_is_compatible(node, "brcm,bcm6318-ext-intc"))
|
||||
+ toggle_clear_on_ack = true;
|
||||
+
|
||||
+ for (i = 0; i < num_irqs; i++) {
|
||||
+ irqs[i] = irq_of_parse_and_map(node, i);
|
||||
+ if (!irqs[i])
|
||||
+ return -ENOMEM;
|
||||
+ }
|
||||
+
|
||||
+ base = of_iomap(node, 0);
|
||||
+ if (!base)
|
||||
+ return -ENXIO;
|
||||
+
|
||||
+ ret = __bcm6345_ext_intc_init(node, num_irqs, irqs, base, shift,
|
||||
+ toggle_clear_on_ack);
|
||||
+ if (!ret)
|
||||
+ return 0;
|
||||
+
|
||||
+ iounmap(base);
|
||||
+
|
||||
+ for (i = 0; i < num_irqs; i++)
|
||||
+ irq_dispose_mapping(irqs[i]);
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+IRQCHIP_DECLARE(bcm6318_ext_intc, "brcm,bcm6318-ext-intc",
|
||||
+ bcm6345_ext_intc_of_init);
|
||||
+IRQCHIP_DECLARE(bcm6345_ext_intc, "brcm,bcm6345-ext-intc",
|
||||
+ bcm6345_ext_intc_of_init);
|
||||
+#endif
|
||||
--- /dev/null
|
||||
+++ b/include/linux/irqchip/irq-bcm6345-ext.h
|
||||
@@ -0,0 +1,14 @@
|
||||
+/*
|
||||
+ * This file is subject to the terms and conditions of the GNU General Public
|
||||
+ * License. See the file "COPYING" in the main directory of this archive
|
||||
+ * for more details.
|
||||
+ *
|
||||
+ * Copyright (C) 2014 Jonas Gorski <jogo@openwrt.org>
|
||||
+ */
|
||||
+
|
||||
+#ifndef __INCLUDE_LINUX_IRQCHIP_IRQ_BCM6345_EXT_H
|
||||
+#define __INCLUDE_LINUX_IRQCHIP_IRQ_BCM6345_EXT_H
|
||||
+
|
||||
+void bcm6345_ext_intc_init(int n_irqs, int *irqs, void __iomem *reg, int shift);
|
||||
+
|
||||
+#endif /* __INCLUDE_LINUX_IRQCHIP_IRQ_BCM6345_EXT_H */
|
@ -0,0 +1,35 @@
|
||||
From 5a079515cb3066aeb658634301a98871b47c2af4 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Rojas?= <noltari@gmail.com>
|
||||
Date: Thu, 25 Feb 2021 19:44:22 +0100
|
||||
Subject: [PATCH 1/4] mips: bmips: add BCM63268 timer clock definitions
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Add missing timer clock definitions for BCM63268.
|
||||
|
||||
Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
|
||||
---
|
||||
include/dt-bindings/clock/bcm63268-clock.h | 13 +++++++++++++
|
||||
1 file changed, 13 insertions(+)
|
||||
|
||||
--- a/include/dt-bindings/clock/bcm63268-clock.h
|
||||
+++ b/include/dt-bindings/clock/bcm63268-clock.h
|
||||
@@ -27,4 +27,17 @@
|
||||
#define BCM63268_CLK_TBUS 27
|
||||
#define BCM63268_CLK_ROBOSW250 31
|
||||
|
||||
+#define BCM63268_TCLK_EPHY1 0
|
||||
+#define BCM63268_TCLK_EPHY2 1
|
||||
+#define BCM63268_TCLK_EPHY3 2
|
||||
+#define BCM63268_TCLK_GPHY1 3
|
||||
+#define BCM63268_TCLK_DSL 4
|
||||
+#define BCM63268_TCLK_WAKEON_EPHY 6
|
||||
+#define BCM63268_TCLK_WAKEON_DSL 7
|
||||
+#define BCM63268_TCLK_FAP1 11
|
||||
+#define BCM63268_TCLK_FAP2 15
|
||||
+#define BCM63268_TCLK_UTO_50 16
|
||||
+#define BCM63268_TCLK_UTO_EXTIN 17
|
||||
+#define BCM63268_TCLK_USB_REF 18
|
||||
+
|
||||
#endif /* __DT_BINDINGS_CLOCK_BCM63268_H */
|
@ -0,0 +1,26 @@
|
||||
From 3327df17635dd9d24a855ac6b7247fac381514cf Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Rojas?= <noltari@gmail.com>
|
||||
Date: Thu, 25 Feb 2021 19:45:04 +0100
|
||||
Subject: [PATCH 2/4] mips: bmips: add BCM63268 timer reset definitions
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Add missing timer reset definitions for BCM63268.
|
||||
|
||||
Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
|
||||
---
|
||||
include/dt-bindings/reset/bcm63268-reset.h | 4 ++++
|
||||
1 file changed, 4 insertions(+)
|
||||
|
||||
--- a/include/dt-bindings/reset/bcm63268-reset.h
|
||||
+++ b/include/dt-bindings/reset/bcm63268-reset.h
|
||||
@@ -23,4 +23,8 @@
|
||||
#define BCM63268_RST_PCIE_HARD 17
|
||||
#define BCM63268_RST_GPHY 18
|
||||
|
||||
+#define BCM63268_TRST_SW 29
|
||||
+#define BCM63268_TRST_HW 30
|
||||
+#define BCM63268_TRST_POR 31
|
||||
+
|
||||
#endif /* __DT_BINDINGS_RESET_BCM63268_H */
|
@ -0,0 +1,59 @@
|
||||
From c17702bad18a085ae913752b45bcc20c2cea879e Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Rojas?= <noltari@gmail.com>
|
||||
Date: Thu, 25 Feb 2021 19:53:08 +0100
|
||||
Subject: [PATCH 3/4] dt-bindings: clock: Add BCM63268 timer binding
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Document the Broadcom BCM63268 Clock and Reset controller.
|
||||
|
||||
Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
|
||||
---
|
||||
.../clock/brcm,bcm63268-timer-clocks.yaml | 40 +++++++++++++++++++
|
||||
1 file changed, 40 insertions(+)
|
||||
create mode 100644 Documentation/devicetree/bindings/clock/brcm,bcm63268-timer-clocks.yaml
|
||||
|
||||
--- /dev/null
|
||||
+++ b/Documentation/devicetree/bindings/clock/brcm,bcm63268-timer-clocks.yaml
|
||||
@@ -0,0 +1,40 @@
|
||||
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
+%YAML 1.2
|
||||
+---
|
||||
+$id: http://devicetree.org/schemas/clock/brcm,bcm63268-timer-clocks.yaml#
|
||||
+$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
+
|
||||
+title: Broadcom BCM63268 Timer Clock and Reset Device Tree Bindings
|
||||
+
|
||||
+maintainers:
|
||||
+ - Álvaro Fernández Rojas <noltari@gmail.com>
|
||||
+
|
||||
+properties:
|
||||
+ compatible:
|
||||
+ const: brcm,bcm63268-timer-clocks
|
||||
+
|
||||
+ reg:
|
||||
+ maxItems: 1
|
||||
+
|
||||
+ "#clock-cells":
|
||||
+ const: 1
|
||||
+
|
||||
+ "#reset-cells":
|
||||
+ const: 1
|
||||
+
|
||||
+required:
|
||||
+ - compatible
|
||||
+ - reg
|
||||
+ - "#clock-cells"
|
||||
+ - "#reset-cells"
|
||||
+
|
||||
+additionalProperties: false
|
||||
+
|
||||
+examples:
|
||||
+ - |
|
||||
+ timer_clk: clock-controller@100000ac {
|
||||
+ compatible = "brcm,bcm63268-timer-clocks";
|
||||
+ reg = <0x100000ac 0x4>;
|
||||
+ #clock-cells = <1>;
|
||||
+ #reset-cells = <1>;
|
||||
+ };
|
@ -0,0 +1,281 @@
|
||||
From 3c8dd9d0937a19f3f20f28ba0b0b64f448d50dd4 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Rojas?= <noltari@gmail.com>
|
||||
Date: Thu, 25 Feb 2021 19:54:04 +0100
|
||||
Subject: [PATCH 4/4] clk: bcm: Add BCM63268 timer clock and reset driver
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Add driver for BCM63268 timer clock and reset controller.
|
||||
|
||||
Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
|
||||
---
|
||||
drivers/clk/bcm/Kconfig | 9 ++
|
||||
drivers/clk/bcm/Makefile | 1 +
|
||||
drivers/clk/bcm/clk-bcm63268-timer.c | 232 +++++++++++++++++++++++++++
|
||||
3 files changed, 242 insertions(+)
|
||||
create mode 100644 drivers/clk/bcm/clk-bcm63268-timer.c
|
||||
|
||||
--- a/drivers/clk/bcm/Kconfig
|
||||
+++ b/drivers/clk/bcm/Kconfig
|
||||
@@ -37,6 +37,15 @@ config CLK_BCM_63XX_GATE
|
||||
Enable common clock framework support for Broadcom BCM63xx DSL SoCs
|
||||
based on the MIPS architecture
|
||||
|
||||
+config CLK_BCM63268_TIMER
|
||||
+ bool "Broadcom BCM63268 timer clock and reset support"
|
||||
+ depends on BMIPS_GENERIC || COMPILE_TEST
|
||||
+ default BMIPS_GENERIC
|
||||
+ select RESET_CONTROLLER
|
||||
+ help
|
||||
+ Enable timer clock and reset support for Broadcom BCM63268 DSL SoCs
|
||||
+ based on the MIPS architecture.
|
||||
+
|
||||
config CLK_BCM_KONA
|
||||
bool "Broadcom Kona CCU clock support"
|
||||
depends on ARCH_BCM_MOBILE || COMPILE_TEST
|
||||
--- a/drivers/clk/bcm/Makefile
|
||||
+++ b/drivers/clk/bcm/Makefile
|
||||
@@ -1,6 +1,7 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
obj-$(CONFIG_CLK_BCM_63XX) += clk-bcm63xx.o
|
||||
obj-$(CONFIG_CLK_BCM_63XX_GATE) += clk-bcm63xx-gate.o
|
||||
+obj-$(CONFIG_CLK_BCM63268_TIMER) += clk-bcm63268-timer.o
|
||||
obj-$(CONFIG_CLK_BCM_KONA) += clk-kona.o
|
||||
obj-$(CONFIG_CLK_BCM_KONA) += clk-kona-setup.o
|
||||
obj-$(CONFIG_CLK_BCM_KONA) += clk-bcm281xx.o
|
||||
--- /dev/null
|
||||
+++ b/drivers/clk/bcm/clk-bcm63268-timer.c
|
||||
@@ -0,0 +1,232 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0
|
||||
+/*
|
||||
+ * BCM63268 Timer Clock and Reset Controller Driver
|
||||
+ *
|
||||
+ * Copyright (C) 2021 Álvaro Fernández Rojas <noltari@gmail.com>
|
||||
+ */
|
||||
+
|
||||
+#include <linux/clk-provider.h>
|
||||
+#include <linux/delay.h>
|
||||
+#include <linux/init.h>
|
||||
+#include <linux/of.h>
|
||||
+#include <linux/of_device.h>
|
||||
+#include <linux/platform_device.h>
|
||||
+#include <linux/reset-controller.h>
|
||||
+
|
||||
+#include <dt-bindings/clock/bcm63268-clock.h>
|
||||
+
|
||||
+#define BCM63268_TIMER_RESET_SLEEP_MIN_US 10000
|
||||
+#define BCM63268_TIMER_RESET_SLEEP_MAX_US 20000
|
||||
+
|
||||
+struct bcm63268_tclkrst_hw {
|
||||
+ void __iomem *regs;
|
||||
+ spinlock_t lock;
|
||||
+
|
||||
+ struct reset_controller_dev rcdev;
|
||||
+ struct clk_hw_onecell_data data;
|
||||
+};
|
||||
+
|
||||
+struct bcm63268_tclk_table_entry {
|
||||
+ const char * const name;
|
||||
+ u8 bit;
|
||||
+ unsigned long flags;
|
||||
+};
|
||||
+
|
||||
+static const struct bcm63268_tclk_table_entry bcm63268_timer_clocks[] = {
|
||||
+ {
|
||||
+ .name = "ephy1",
|
||||
+ .bit = BCM63268_TCLK_EPHY1,
|
||||
+ }, {
|
||||
+ .name = "ephy2",
|
||||
+ .bit = BCM63268_TCLK_EPHY2,
|
||||
+ }, {
|
||||
+ .name = "ephy3",
|
||||
+ .bit = BCM63268_TCLK_EPHY3,
|
||||
+ }, {
|
||||
+ .name = "gphy1",
|
||||
+ .bit = BCM63268_TCLK_GPHY1,
|
||||
+ }, {
|
||||
+ .name = "dsl",
|
||||
+ .bit = BCM63268_TCLK_DSL,
|
||||
+ }, {
|
||||
+ .name = "wakeon_ephy",
|
||||
+ .bit = BCM63268_TCLK_WAKEON_EPHY,
|
||||
+ }, {
|
||||
+ .name = "wakeon_dsl",
|
||||
+ .bit = BCM63268_TCLK_WAKEON_DSL,
|
||||
+ }, {
|
||||
+ .name = "fap1_pll",
|
||||
+ .bit = BCM63268_TCLK_FAP1,
|
||||
+ }, {
|
||||
+ .name = "fap2_pll",
|
||||
+ .bit = BCM63268_TCLK_FAP2,
|
||||
+ }, {
|
||||
+ .name = "uto_50",
|
||||
+ .bit = BCM63268_TCLK_UTO_50,
|
||||
+ }, {
|
||||
+ .name = "uto_extin",
|
||||
+ .bit = BCM63268_TCLK_UTO_EXTIN,
|
||||
+ }, {
|
||||
+ .name = "usb_ref",
|
||||
+ .bit = BCM63268_TCLK_USB_REF,
|
||||
+ }, {
|
||||
+ /* sentinel */
|
||||
+ }
|
||||
+};
|
||||
+
|
||||
+static inline struct bcm63268_tclkrst_hw *
|
||||
+to_bcm63268_timer_reset(struct reset_controller_dev *rcdev)
|
||||
+{
|
||||
+ return container_of(rcdev, struct bcm63268_tclkrst_hw, rcdev);
|
||||
+}
|
||||
+
|
||||
+static int bcm63268_timer_reset_update(struct reset_controller_dev *rcdev,
|
||||
+ unsigned long id, bool assert)
|
||||
+{
|
||||
+ struct bcm63268_tclkrst_hw *reset = to_bcm63268_timer_reset(rcdev);
|
||||
+ unsigned long flags;
|
||||
+ uint32_t val;
|
||||
+
|
||||
+ spin_lock_irqsave(&reset->lock, flags);
|
||||
+ val = __raw_readl(reset->regs);
|
||||
+ if (assert)
|
||||
+ val &= ~BIT(id);
|
||||
+ else
|
||||
+ val |= BIT(id);
|
||||
+ __raw_writel(val, reset->regs);
|
||||
+ spin_unlock_irqrestore(&reset->lock, flags);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int bcm63268_timer_reset_assert(struct reset_controller_dev *rcdev,
|
||||
+ unsigned long id)
|
||||
+{
|
||||
+ return bcm63268_timer_reset_update(rcdev, id, true);
|
||||
+}
|
||||
+
|
||||
+static int bcm63268_timer_reset_deassert(struct reset_controller_dev *rcdev,
|
||||
+ unsigned long id)
|
||||
+{
|
||||
+ return bcm63268_timer_reset_update(rcdev, id, false);
|
||||
+}
|
||||
+
|
||||
+static int bcm63268_timer_reset_reset(struct reset_controller_dev *rcdev,
|
||||
+ unsigned long id)
|
||||
+{
|
||||
+ bcm63268_timer_reset_update(rcdev, id, true);
|
||||
+ usleep_range(BCM63268_TIMER_RESET_SLEEP_MIN_US,
|
||||
+ BCM63268_TIMER_RESET_SLEEP_MAX_US);
|
||||
+
|
||||
+ bcm63268_timer_reset_update(rcdev, id, false);
|
||||
+ /*
|
||||
+ * Ensure component is taken out reset state by sleeping also after
|
||||
+ * deasserting the reset. Otherwise, the component may not be ready
|
||||
+ * for operation.
|
||||
+ */
|
||||
+ usleep_range(BCM63268_TIMER_RESET_SLEEP_MIN_US,
|
||||
+ BCM63268_TIMER_RESET_SLEEP_MAX_US);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int bcm63268_timer_reset_status(struct reset_controller_dev *rcdev,
|
||||
+ unsigned long id)
|
||||
+{
|
||||
+ struct bcm63268_tclkrst_hw *reset = to_bcm63268_timer_reset(rcdev);
|
||||
+
|
||||
+ return !(__raw_readl(reset->regs) & BIT(id));
|
||||
+}
|
||||
+
|
||||
+static struct reset_control_ops bcm63268_timer_reset_ops = {
|
||||
+ .assert = bcm63268_timer_reset_assert,
|
||||
+ .deassert = bcm63268_timer_reset_deassert,
|
||||
+ .reset = bcm63268_timer_reset_reset,
|
||||
+ .status = bcm63268_timer_reset_status,
|
||||
+};
|
||||
+
|
||||
+static int bcm63268_tclk_probe(struct platform_device *pdev)
|
||||
+{
|
||||
+ struct device *dev = &pdev->dev;
|
||||
+ const struct bcm63268_tclk_table_entry *entry, *table;
|
||||
+ struct bcm63268_tclkrst_hw *hw;
|
||||
+ u8 maxbit = 0;
|
||||
+ int i, ret;
|
||||
+
|
||||
+ table = of_device_get_match_data(dev);
|
||||
+ if (!table)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ for (entry = table; entry->name; entry++)
|
||||
+ maxbit = max_t(u8, maxbit, entry->bit);
|
||||
+ maxbit++;
|
||||
+
|
||||
+ hw = devm_kzalloc(&pdev->dev, struct_size(hw, data.hws, maxbit),
|
||||
+ GFP_KERNEL);
|
||||
+ if (!hw)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ platform_set_drvdata(pdev, hw);
|
||||
+
|
||||
+ spin_lock_init(&hw->lock);
|
||||
+
|
||||
+ hw->data.num = maxbit;
|
||||
+ for (i = 0; i < maxbit; i++)
|
||||
+ hw->data.hws[i] = ERR_PTR(-ENODEV);
|
||||
+
|
||||
+ hw->regs = devm_platform_ioremap_resource(pdev, 0);
|
||||
+ if (IS_ERR(hw->regs))
|
||||
+ return PTR_ERR(hw->regs);
|
||||
+
|
||||
+ for (entry = table; entry->name; entry++) {
|
||||
+ struct clk_hw *clk;
|
||||
+
|
||||
+ clk = clk_hw_register_gate(dev, entry->name, NULL,
|
||||
+ entry->flags, hw->regs, entry->bit,
|
||||
+ CLK_GATE_BIG_ENDIAN, &hw->lock);
|
||||
+ if (IS_ERR(clk)) {
|
||||
+ ret = PTR_ERR(clk);
|
||||
+ goto out_err;
|
||||
+ }
|
||||
+
|
||||
+ hw->data.hws[entry->bit] = clk;
|
||||
+ }
|
||||
+
|
||||
+ ret = of_clk_add_hw_provider(dev->of_node, of_clk_hw_onecell_get,
|
||||
+ &hw->data);
|
||||
+ if (!ret)
|
||||
+ return 0;
|
||||
+
|
||||
+ hw->rcdev.of_node = dev->of_node;
|
||||
+ hw->rcdev.ops = &bcm63268_timer_reset_ops;
|
||||
+
|
||||
+ ret = devm_reset_controller_register(dev, &hw->rcdev);
|
||||
+ if (ret)
|
||||
+ dev_err(dev, "Failed to register reset controller\n");
|
||||
+
|
||||
+out_err:
|
||||
+ for (i = 0; i < hw->data.num; i++) {
|
||||
+ if (!IS_ERR(hw->data.hws[i]))
|
||||
+ clk_hw_unregister_gate(hw->data.hws[i]);
|
||||
+ }
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+static const struct of_device_id bcm63268_tclk_dt_ids[] = {
|
||||
+ {
|
||||
+ .compatible = "brcm,bcm63268-timer-clocks",
|
||||
+ .data = &bcm63268_timer_clocks,
|
||||
+ }, {
|
||||
+ /* sentinel */
|
||||
+ }
|
||||
+};
|
||||
+
|
||||
+static struct platform_driver bcm63268_tclk = {
|
||||
+ .probe = bcm63268_tclk_probe,
|
||||
+ .driver = {
|
||||
+ .name = "bcm63268-timer-clock",
|
||||
+ .of_match_table = bcm63268_tclk_dt_ids,
|
||||
+ },
|
||||
+};
|
||||
+builtin_platform_driver(bcm63268_tclk);
|
@ -0,0 +1,238 @@
|
||||
From 0377ad93031d3e51c2afe44231241185f684b6af Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Rojas?= <noltari@gmail.com>
|
||||
Date: Fri, 5 Mar 2021 15:14:32 +0100
|
||||
Subject: [PATCH 1/2] mips: bmips: automatically detect CPU frequency
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Some BCM63xx SoCs support multiple CPU frequencies depending on HW config.
|
||||
|
||||
Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
|
||||
---
|
||||
arch/mips/bmips/setup.c | 198 ++++++++++++++++++++++++++++++++++++++--
|
||||
1 file changed, 191 insertions(+), 7 deletions(-)
|
||||
|
||||
--- a/arch/mips/bmips/setup.c
|
||||
+++ b/arch/mips/bmips/setup.c
|
||||
@@ -31,11 +31,51 @@
|
||||
|
||||
#define RELO_NORMAL_VEC BIT(18)
|
||||
|
||||
+#define REG_BCM6318_SOB ((void __iomem *)CKSEG1ADDR(0x10000900))
|
||||
+#define BCM6318_FREQ_SHIFT 23
|
||||
+#define BCM6318_FREQ_MASK (0x3 << BCM6318_FREQ_SHIFT)
|
||||
+
|
||||
#define REG_BCM6328_OTP ((void __iomem *)CKSEG1ADDR(0x1000062c))
|
||||
#define BCM6328_TP1_DISABLED BIT(9)
|
||||
+#define REG_BCM6328_MISC_SB ((void __iomem *)CKSEG1ADDR(0x10001a40))
|
||||
+#define BCM6328_FCVO_SHIFT 7
|
||||
+#define BCM6328_FCVO_MASK (0x1f << BCM6328_FCVO_SHIFT)
|
||||
+
|
||||
+#define REG_BCM6358_DDR_PLLC ((void __iomem *)0xfffe12b8)
|
||||
+#define BCM6358_PLLC_M1_SHIFT 0
|
||||
+#define BCM6358_PLLC_M1_MASK (0xff << BCM6358_PLLC_M1_SHIFT)
|
||||
+#define BCM6358_PLLC_N1_SHIFT 23
|
||||
+#define BCM6358_PLLC_N1_MASK (0x3f << BCM6358_PLLC_N1_SHIFT)
|
||||
+#define BCM6358_PLLC_N2_SHIFT 29
|
||||
+#define BCM6358_PLLC_N2_MASK (0x7 << BCM6358_PLLC_N2_SHIFT)
|
||||
+
|
||||
+#define REG_BCM6362_MISC_SB ((void __iomem *)CKSEG1ADDR(0x10001814))
|
||||
+#define BCM6362_FCVO_SHIFT 1
|
||||
+#define BCM6362_FCVO_MASK (0x1f << BCM6362_FCVO_SHIFT)
|
||||
+
|
||||
+#define REG_BCM6368_DDR_PLLC ((void __iomem *)CKSEG1ADDR(0x100012a0))
|
||||
+#define BCM6368_PLLC_P1_SHIFT 0
|
||||
+#define BCM6368_PLLC_P1_MASK (0xf << BCM6368_PLLC_P1_SHIFT)
|
||||
+#define BCM6368_PLLC_P2_SHIFT 4
|
||||
+#define BCM6368_PLLC_P2_MASK (0xf << BCM6368_PLLC_P2_SHIFT)
|
||||
+#define BCM6368_PLLC_NDIV_SHIFT 16
|
||||
+#define BCM6368_PLLC_NDIV_MASK (0x1ff << BCM6368_PLLC_NDIV_SHIFT)
|
||||
+#define REG_BCM6368_DDR_PLLD ((void __iomem *)CKSEG1ADDR(0x100012a4))
|
||||
+#define BCM6368_PLLD_MDIV_SHIFT 0
|
||||
+#define BCM6368_PLLD_MDIV_MASK (0xff << BCM6368_PLLD_MDIV_SHIFT)
|
||||
+
|
||||
+#define REG_BCM63268_MISC_SB ((void __iomem *)CKSEG1ADDR(0x10001814))
|
||||
+#define BCM63268_FCVO_SHIFT 21
|
||||
+#define BCM63268_FCVO_MASK (0xf << BCM63268_FCVO_SHIFT)
|
||||
+
|
||||
|
||||
static const unsigned long kbase = VMLINUX_LOAD_ADDRESS & 0xfff00000;
|
||||
|
||||
+struct bmips_cpufreq {
|
||||
+ const char *compatible;
|
||||
+ u32 (*cpu_freq)(void);
|
||||
+};
|
||||
+
|
||||
struct bmips_quirk {
|
||||
const char *compatible;
|
||||
void (*quirk_fn)(void);
|
||||
@@ -134,17 +174,161 @@ const char *get_system_type(void)
|
||||
return "Generic BMIPS kernel";
|
||||
}
|
||||
|
||||
+static u32 bcm6318_cpufreq(void)
|
||||
+{
|
||||
+ u32 val = __raw_readl(REG_BCM6318_SOB);
|
||||
+
|
||||
+ switch ((val & BCM6318_FREQ_MASK) >> BCM6318_FREQ_SHIFT) {
|
||||
+ case 0:
|
||||
+ return 166000000;
|
||||
+ case 2:
|
||||
+ return 250000000;
|
||||
+ case 3:
|
||||
+ return 333000000;
|
||||
+ case 1:
|
||||
+ return 400000000;
|
||||
+ default:
|
||||
+ return 0;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static u32 bcm6328_cpufreq(void)
|
||||
+{
|
||||
+ u32 val = __raw_readl(REG_BCM6328_MISC_SB);
|
||||
+
|
||||
+ switch ((val & BCM6328_FCVO_MASK) >> BCM6328_FCVO_SHIFT) {
|
||||
+ case 0x12:
|
||||
+ case 0x14:
|
||||
+ case 0x19:
|
||||
+ return 160000000;
|
||||
+ case 0x1c:
|
||||
+ return 192000000;
|
||||
+ case 0x13:
|
||||
+ case 0x15:
|
||||
+ return 200000000;
|
||||
+ case 0x1a:
|
||||
+ return 384000000;
|
||||
+ case 0x16:
|
||||
+ return 400000000;
|
||||
+ default:
|
||||
+ return 320000000;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static u32 bcm6358_cpufreq(void)
|
||||
+{
|
||||
+ u32 val, n1, n2, m1;
|
||||
+
|
||||
+ val = __raw_readl(REG_BCM6358_DDR_PLLC);
|
||||
+ n1 = (val & BCM6358_PLLC_N1_MASK) >> BCM6358_PLLC_N1_SHIFT;
|
||||
+ n2 = (val & BCM6358_PLLC_N2_MASK) >> BCM6358_PLLC_N2_SHIFT;
|
||||
+ m1 = (val & BCM6358_PLLC_M1_MASK) >> BCM6358_PLLC_M1_SHIFT;
|
||||
+
|
||||
+ return (16 * 1000000 * n1 * n2) / m1;
|
||||
+}
|
||||
+
|
||||
+static u32 bcm6362_cpufreq(void)
|
||||
+{
|
||||
+ u32 val = __raw_readl(REG_BCM6362_MISC_SB);
|
||||
+
|
||||
+ switch ((val & BCM6362_FCVO_MASK) >> BCM6362_FCVO_SHIFT) {
|
||||
+ case 0x04:
|
||||
+ case 0x0c:
|
||||
+ case 0x14:
|
||||
+ case 0x1c:
|
||||
+ return 160000000;
|
||||
+ case 0x15:
|
||||
+ case 0x1d:
|
||||
+ return 200000000;
|
||||
+ case 0x03:
|
||||
+ case 0x0b:
|
||||
+ case 0x13:
|
||||
+ case 0x1b:
|
||||
+ return 240000000;
|
||||
+ case 0x07:
|
||||
+ case 0x17:
|
||||
+ return 384000000;
|
||||
+ case 0x05:
|
||||
+ case 0x0e:
|
||||
+ case 0x16:
|
||||
+ case 0x1e:
|
||||
+ case 0x1f:
|
||||
+ return 400000000;
|
||||
+ case 0x06:
|
||||
+ return 440000000;
|
||||
+ default:
|
||||
+ return 320000000;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static u32 bcm6368_cpufreq(void)
|
||||
+{
|
||||
+ u32 val, p1, p2, ndiv, m1;
|
||||
+
|
||||
+ val = __raw_readl(REG_BCM6368_DDR_PLLC);
|
||||
+ p1 = (val & BCM6368_PLLC_P1_MASK) >> BCM6368_PLLC_P1_SHIFT;
|
||||
+ p2 = (val & BCM6368_PLLC_P2_MASK) >> BCM6368_PLLC_P2_SHIFT;
|
||||
+ ndiv = (val & BCM6368_PLLC_NDIV_MASK) >>
|
||||
+ BCM6368_PLLC_NDIV_SHIFT;
|
||||
+
|
||||
+ val = __raw_readl(REG_BCM6368_DDR_PLLD);
|
||||
+ m1 = (val & BCM6368_PLLD_MDIV_MASK) >> BCM6368_PLLD_MDIV_SHIFT;
|
||||
+
|
||||
+ return (((64 * 1000000) / p1) * p2 * ndiv) / m1;
|
||||
+}
|
||||
+
|
||||
+static u32 bcm63268_cpufreq(void)
|
||||
+{
|
||||
+ u32 val = __raw_readl(REG_BCM63268_MISC_SB);
|
||||
+
|
||||
+ switch ((val & BCM63268_FCVO_MASK) >> BCM63268_FCVO_SHIFT) {
|
||||
+ case 0x3:
|
||||
+ case 0xe:
|
||||
+ return 320000000;
|
||||
+ case 0xa:
|
||||
+ return 333000000;
|
||||
+ case 0x2:
|
||||
+ case 0xb:
|
||||
+ case 0xf:
|
||||
+ return 400000000;
|
||||
+ default:
|
||||
+ return 0;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static const struct bmips_cpufreq bmips_cpufreq_list[] = {
|
||||
+ { "brcm,bcm6318", &bcm6318_cpufreq },
|
||||
+ { "brcm,bcm6328", &bcm6328_cpufreq },
|
||||
+ { "brcm,bcm6358", &bcm6358_cpufreq },
|
||||
+ { "brcm,bcm6362", &bcm6362_cpufreq },
|
||||
+ { "brcm,bcm6368", &bcm6368_cpufreq },
|
||||
+ { "brcm,bcm63268", &bcm63268_cpufreq },
|
||||
+ { /* sentinel */ }
|
||||
+};
|
||||
+
|
||||
void __init plat_time_init(void)
|
||||
{
|
||||
+ const struct bmips_cpufreq *cf;
|
||||
struct device_node *np;
|
||||
- u32 freq;
|
||||
+ u32 freq = 0;
|
||||
|
||||
- np = of_find_node_by_name(NULL, "cpus");
|
||||
- if (!np)
|
||||
- panic("missing 'cpus' DT node");
|
||||
- if (of_property_read_u32(np, "mips-hpt-frequency", &freq) < 0)
|
||||
- panic("missing 'mips-hpt-frequency' property");
|
||||
- of_node_put(np);
|
||||
+ for (cf = bmips_cpufreq_list; cf->cpu_freq; cf++) {
|
||||
+ if (of_flat_dt_is_compatible(of_get_flat_dt_root(),
|
||||
+ cf->compatible)) {
|
||||
+ freq = cf->cpu_freq() / 2;
|
||||
+ printk("%s detected @ %u MHz\n", cf->compatible, freq / 500000);
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ if (!freq) {
|
||||
+ np = of_find_node_by_name(NULL, "cpus");
|
||||
+ if (!np)
|
||||
+ panic("missing 'cpus' DT node");
|
||||
+ if (of_property_read_u32(np, "mips-hpt-frequency", &freq) < 0)
|
||||
+ panic("missing 'mips-hpt-frequency' property");
|
||||
+ of_node_put(np);
|
||||
+ }
|
||||
|
||||
mips_hpt_frequency = freq;
|
||||
}
|
@ -0,0 +1,196 @@
|
||||
From f9ee3f28ecb979c77423be965ef9dd313bdb9e9b Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Rojas?= <noltari@gmail.com>
|
||||
Date: Mon, 8 Mar 2021 16:58:34 +0100
|
||||
Subject: [PATCH 2/2] mips: bmips: automatically detect RAM size
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Some devices have different amounts of RAM installed depending on HW revision.
|
||||
|
||||
Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
|
||||
---
|
||||
arch/mips/bmips/setup.c | 118 ++++++++++++++++++++++++++++++++++++++++
|
||||
1 file changed, 118 insertions(+)
|
||||
|
||||
--- a/arch/mips/bmips/setup.c
|
||||
+++ b/arch/mips/bmips/setup.c
|
||||
@@ -19,6 +19,7 @@
|
||||
#include <linux/of_platform.h>
|
||||
#include <linux/libfdt.h>
|
||||
#include <linux/smp.h>
|
||||
+#include <linux/types.h>
|
||||
#include <asm/addrspace.h>
|
||||
#include <asm/bmips.h>
|
||||
#include <asm/bootinfo.h>
|
||||
@@ -34,13 +35,16 @@
|
||||
#define REG_BCM6318_SOB ((void __iomem *)CKSEG1ADDR(0x10000900))
|
||||
#define BCM6318_FREQ_SHIFT 23
|
||||
#define BCM6318_FREQ_MASK (0x3 << BCM6318_FREQ_SHIFT)
|
||||
+#define BCM6318_SDRAM_ADDR ((void __iomem *)CKSEG1ADDR(0x10004000))
|
||||
|
||||
#define REG_BCM6328_OTP ((void __iomem *)CKSEG1ADDR(0x1000062c))
|
||||
#define BCM6328_TP1_DISABLED BIT(9)
|
||||
#define REG_BCM6328_MISC_SB ((void __iomem *)CKSEG1ADDR(0x10001a40))
|
||||
#define BCM6328_FCVO_SHIFT 7
|
||||
#define BCM6328_FCVO_MASK (0x1f << BCM6328_FCVO_SHIFT)
|
||||
+#define BCM6328_MEMC_ADDR ((void __iomem *)CKSEG1ADDR(0x10003000))
|
||||
|
||||
+#define BCM6358_MEMC_ADDR ((void __iomem *)0xfffe1200)
|
||||
#define REG_BCM6358_DDR_PLLC ((void __iomem *)0xfffe12b8)
|
||||
#define BCM6358_PLLC_M1_SHIFT 0
|
||||
#define BCM6358_PLLC_M1_MASK (0xff << BCM6358_PLLC_M1_SHIFT)
|
||||
@@ -52,7 +56,9 @@
|
||||
#define REG_BCM6362_MISC_SB ((void __iomem *)CKSEG1ADDR(0x10001814))
|
||||
#define BCM6362_FCVO_SHIFT 1
|
||||
#define BCM6362_FCVO_MASK (0x1f << BCM6362_FCVO_SHIFT)
|
||||
+#define BCM6362_MEMC_ADDR ((void __iomem *)CKSEG1ADDR(0x10003000))
|
||||
|
||||
+#define BCM6368_MEMC_ADDR ((void __iomem *)CKSEG1ADDR(0x10001200))
|
||||
#define REG_BCM6368_DDR_PLLC ((void __iomem *)CKSEG1ADDR(0x100012a0))
|
||||
#define BCM6368_PLLC_P1_SHIFT 0
|
||||
#define BCM6368_PLLC_P1_MASK (0xf << BCM6368_PLLC_P1_SHIFT)
|
||||
@@ -67,7 +73,21 @@
|
||||
#define REG_BCM63268_MISC_SB ((void __iomem *)CKSEG1ADDR(0x10001814))
|
||||
#define BCM63268_FCVO_SHIFT 21
|
||||
#define BCM63268_FCVO_MASK (0xf << BCM63268_FCVO_SHIFT)
|
||||
+#define BCM63268_MEMC_ADDR ((void __iomem *)CKSEG1ADDR(0x10003000))
|
||||
|
||||
+#define SDRAM_CFG_REG 0x0
|
||||
+#define SDRAM_SPACE_SHIFT 4
|
||||
+#define SDRAM_SPACE_MASK (0xf << SDRAM_SPACE_SHIFT)
|
||||
+
|
||||
+#define MEMC_CFG_REG 0x4
|
||||
+#define MEMC_CFG_32B_SHIFT 1
|
||||
+#define MEMC_CFG_32B_MASK (1 << MEMC_CFG_32B_SHIFT)
|
||||
+#define MEMC_CFG_COL_SHIFT 3
|
||||
+#define MEMC_CFG_COL_MASK (0x3 << MEMC_CFG_COL_SHIFT)
|
||||
+#define MEMC_CFG_ROW_SHIFT 6
|
||||
+#define MEMC_CFG_ROW_MASK (0x3 << MEMC_CFG_ROW_SHIFT)
|
||||
+
|
||||
+#define DDR_CSEND_REG 0x8
|
||||
|
||||
static const unsigned long kbase = VMLINUX_LOAD_ADDRESS & 0xfff00000;
|
||||
|
||||
@@ -76,6 +96,11 @@ struct bmips_cpufreq {
|
||||
u32 (*cpu_freq)(void);
|
||||
};
|
||||
|
||||
+struct bmips_memsize {
|
||||
+ const char *compatible;
|
||||
+ phys_addr_t (*mem_size)(void);
|
||||
+};
|
||||
+
|
||||
struct bmips_quirk {
|
||||
const char *compatible;
|
||||
void (*quirk_fn)(void);
|
||||
@@ -333,9 +358,90 @@ void __init plat_time_init(void)
|
||||
mips_hpt_frequency = freq;
|
||||
}
|
||||
|
||||
+static inline phys_addr_t bmips_dram_size(unsigned int cols,
|
||||
+ unsigned int rows,
|
||||
+ unsigned int is_32b,
|
||||
+ unsigned int banks)
|
||||
+{
|
||||
+ rows += 11; /* 0 => 11 address bits ... 2 => 13 address bits */
|
||||
+ cols += 8; /* 0 => 8 address bits ... 2 => 10 address bits */
|
||||
+ is_32b += 1;
|
||||
+
|
||||
+ return 1 << (cols + rows + is_32b + banks);
|
||||
+}
|
||||
+
|
||||
+static phys_addr_t _bcm6318_memsize(void __iomem *addr)
|
||||
+{
|
||||
+ u32 val;
|
||||
+
|
||||
+ val = __raw_readl(addr + SDRAM_CFG_REG);
|
||||
+ val = (val & SDRAM_SPACE_MASK) >> SDRAM_SPACE_SHIFT;
|
||||
+
|
||||
+ return (1 << (val + 20));
|
||||
+}
|
||||
+
|
||||
+static phys_addr_t _bcm6328_memsize(void __iomem *addr)
|
||||
+{
|
||||
+ return __raw_readl(addr + DDR_CSEND_REG) << 24;
|
||||
+}
|
||||
+
|
||||
+static phys_addr_t _bcm6358_memsize(void __iomem *addr)
|
||||
+{
|
||||
+ unsigned int cols, rows, is_32b;
|
||||
+ u32 val;
|
||||
+
|
||||
+ val = __raw_readl(addr + MEMC_CFG_REG);
|
||||
+ rows = (val & MEMC_CFG_ROW_MASK) >> MEMC_CFG_ROW_SHIFT;
|
||||
+ cols = (val & MEMC_CFG_COL_MASK) >> MEMC_CFG_COL_SHIFT;
|
||||
+ is_32b = (val & MEMC_CFG_32B_MASK) ? 0 : 1;
|
||||
+
|
||||
+ return bmips_dram_size(cols, rows, is_32b, 2);
|
||||
+}
|
||||
+
|
||||
+static phys_addr_t bcm6318_memsize(void)
|
||||
+{
|
||||
+ return _bcm6318_memsize(BCM6318_SDRAM_ADDR);
|
||||
+}
|
||||
+
|
||||
+static phys_addr_t bcm6328_memsize(void)
|
||||
+{
|
||||
+ return _bcm6328_memsize(BCM6328_MEMC_ADDR);
|
||||
+}
|
||||
+
|
||||
+static phys_addr_t bcm6358_memsize(void)
|
||||
+{
|
||||
+ return _bcm6358_memsize(BCM6358_MEMC_ADDR);
|
||||
+}
|
||||
+
|
||||
+static phys_addr_t bcm6362_memsize(void)
|
||||
+{
|
||||
+ return _bcm6328_memsize(BCM6362_MEMC_ADDR);
|
||||
+}
|
||||
+
|
||||
+static phys_addr_t bcm6368_memsize(void)
|
||||
+{
|
||||
+ return _bcm6358_memsize(BCM6368_MEMC_ADDR);
|
||||
+}
|
||||
+
|
||||
+static phys_addr_t bcm63268_memsize(void)
|
||||
+{
|
||||
+ return _bcm6328_memsize(BCM63268_MEMC_ADDR);
|
||||
+}
|
||||
+
|
||||
+static const struct bmips_memsize bmips_memsize_list[] = {
|
||||
+ { "brcm,bcm6318", &bcm6318_memsize },
|
||||
+ { "brcm,bcm6328", &bcm6328_memsize },
|
||||
+ { "brcm,bcm6358", &bcm6358_memsize },
|
||||
+ { "brcm,bcm6362", &bcm6362_memsize },
|
||||
+ { "brcm,bcm6368", &bcm6368_memsize },
|
||||
+ { "brcm,bcm63268", &bcm63268_memsize },
|
||||
+ { /* sentinel */ }
|
||||
+};
|
||||
+
|
||||
void __init plat_mem_setup(void)
|
||||
{
|
||||
void *dtb;
|
||||
+ const struct bmips_memsize *ms;
|
||||
const struct bmips_quirk *q;
|
||||
|
||||
set_io_port_base(0);
|
||||
@@ -353,6 +459,18 @@ void __init plat_mem_setup(void)
|
||||
|
||||
__dt_setup_arch(dtb);
|
||||
|
||||
+ for (ms = bmips_memsize_list; ms->mem_size; ms++) {
|
||||
+ if (of_flat_dt_is_compatible(of_get_flat_dt_root(),
|
||||
+ ms->compatible)) {
|
||||
+ phys_addr_t mem = ms->mem_size();
|
||||
+ if (mem) {
|
||||
+ memblock_add(0, mem);
|
||||
+ printk("%uMB of RAM installed\n", mem >> 20);
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
for (q = bmips_quirk_list; q->quirk_fn; q++) {
|
||||
if (of_flat_dt_is_compatible(of_get_flat_dt_root(),
|
||||
q->compatible)) {
|
@ -0,0 +1,80 @@
|
||||
From 84c06b4a1dfa3e021fdbcafaff8cebfdec462402 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Rojas?= <noltari@gmail.com>
|
||||
Date: Tue, 23 Feb 2021 10:39:48 +0100
|
||||
Subject: [PATCH] mips: bmips: disable ARCH_HAS_SYNC_DMA_FOR_CPU_ALL
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Enabling this option causes kernel panics on BCM6358 with EHCI/OHCI:
|
||||
[ 3.881739] usb 1-1: new high-speed USB device number 2 using ehci-platform
|
||||
[ 3.895011] Reserved instruction in kernel code[#1]:
|
||||
[ 3.900113] CPU: 0 PID: 1 Comm: init Not tainted 5.10.16 #0
|
||||
[ 3.905829] $ 0 : 00000000 10008700 00000000 77d94060
|
||||
[ 3.911238] $ 4 : 7fd1f088 00000000 81431cac 81431ca0
|
||||
[ 3.916641] $ 8 : 00000000 ffffefff 8075cd34 00000000
|
||||
[ 3.922043] $12 : 806f8d40 f3e812b7 00000000 000d9aaa
|
||||
[ 3.927446] $16 : 7fd1f068 7fd1f080 7ff559b8 81428470
|
||||
[ 3.932848] $20 : 00000000 00000000 55590000 77d70000
|
||||
[ 3.938251] $24 : 00000018 00000010
|
||||
[ 3.943655] $28 : 81430000 81431e60 81431f28 800157fc
|
||||
[ 3.949058] Hi : 00000000
|
||||
[ 3.952013] Lo : 00000000
|
||||
[ 3.955019] epc : 80015808 setup_sigcontext+0x54/0x24c
|
||||
[ 3.960464] ra : 800157fc setup_sigcontext+0x48/0x24c
|
||||
[ 3.965913] Status: 10008703 KERNEL EXL IE
|
||||
[ 3.970216] Cause : 00800028 (ExcCode 0a)
|
||||
[ 3.974340] PrId : 0002a010 (Broadcom BMIPS4350)
|
||||
[ 3.979170] Modules linked in: ohci_platform ohci_hcd fsl_mph_dr_of ehci_platform ehci_fsl ehci_hcd gpio_button_hotplug usbcore nls_base usb_common
|
||||
[ 3.992907] Process init (pid: 1, threadinfo=(ptrval), task=(ptrval), tls=77e22ec8)
|
||||
[ 4.000776] Stack : 81431ef4 7fd1f080 81431f28 81428470 7fd1f068 81431edc 7ff559b8 81428470
|
||||
[ 4.009467] 81431f28 7fd1f080 55590000 77d70000 77d5498c 80015c70 806f0000 8063ae74
|
||||
[ 4.018149] 08100002 81431f28 0000000a 08100002 81431f28 0000000a 77d6b418 00000003
|
||||
[ 4.026831] ffffffff 80016414 80080734 81431ecc 81431ecc 00000001 00000000 04000000
|
||||
[ 4.035512] 77d54874 00000000 00000000 00000000 00000000 00000012 00000002 00000000
|
||||
[ 4.044196] ...
|
||||
[ 4.046706] Call Trace:
|
||||
[ 4.049238] [<80015808>] setup_sigcontext+0x54/0x24c
|
||||
[ 4.054356] [<80015c70>] setup_frame+0xdc/0x124
|
||||
[ 4.059015] [<80016414>] do_notify_resume+0x1dc/0x288
|
||||
[ 4.064207] [<80011b50>] work_notifysig+0x10/0x18
|
||||
[ 4.069036]
|
||||
[ 4.070538] Code: 8fc300b4 00001025 26240008 <ac820000> ac830004 3c048063 0c0228aa 24846a00 26240010
|
||||
[ 4.080686]
|
||||
[ 4.082517] ---[ end trace 22a8edb41f5f983b ]---
|
||||
[ 4.087374] Kernel panic - not syncing: Fatal exception
|
||||
[ 4.092753] Rebooting in 1 seconds..
|
||||
|
||||
Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
|
||||
---
|
||||
arch/mips/Kconfig | 1 -
|
||||
1 file changed, 1 deletion(-)
|
||||
|
||||
--- a/arch/mips/Kconfig
|
||||
+++ b/arch/mips/Kconfig
|
||||
@@ -264,7 +264,6 @@ config ATH79
|
||||
config BMIPS_GENERIC
|
||||
bool "Broadcom Generic BMIPS kernel"
|
||||
select ARCH_HAS_RESET_CONTROLLER
|
||||
- select ARCH_HAS_SYNC_DMA_FOR_CPU_ALL
|
||||
select ARCH_HAS_PHYS_TO_DMA
|
||||
select BOOT_RAW
|
||||
select NO_EXCEPT_FILL
|
||||
--- a/arch/mips/bmips/dma.c
|
||||
+++ b/arch/mips/bmips/dma.c
|
||||
@@ -64,6 +64,7 @@ phys_addr_t dma_to_phys(struct device *d
|
||||
return dma_addr;
|
||||
}
|
||||
|
||||
+#ifdef CONFIG_ARCH_HAS_SYNC_DMA_FOR_CPU_ALL
|
||||
void arch_sync_dma_for_cpu_all(void)
|
||||
{
|
||||
void __iomem *cbr = BMIPS_GET_CBR();
|
||||
@@ -79,6 +80,7 @@ void arch_sync_dma_for_cpu_all(void)
|
||||
__raw_writel(cfg | 0x100, cbr + BMIPS_RAC_CONFIG);
|
||||
__raw_readl(cbr + BMIPS_RAC_CONFIG);
|
||||
}
|
||||
+#endif /* CONFIG_ARCH_HAS_SYNC_DMA_FOR_CPU_ALL */
|
||||
|
||||
static int __init bmips_init_dma_ranges(void)
|
||||
{
|
@ -0,0 +1,46 @@
|
||||
From 590b60fb08cb1e70fe02d3f407c6b3dbe9ad06ff Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Rojas?= <noltari@gmail.com>
|
||||
Date: Mon, 1 Mar 2021 07:34:39 +0100
|
||||
Subject: [PATCH 3/4] net: broadcom: add BCM6368 enetsw controller driver
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
This controller is present on BCM6318, BCM6328, BCM6362, BCM6368 and BCM63268
|
||||
SoCs.
|
||||
|
||||
Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
|
||||
---
|
||||
drivers/net/ethernet/broadcom/Kconfig | 8 +
|
||||
drivers/net/ethernet/broadcom/Makefile | 1 +
|
||||
.../net/ethernet/broadcom/bcm6368-enetsw.c | 1111 +++++++++++++++++
|
||||
3 files changed, 1120 insertions(+)
|
||||
create mode 100644 drivers/net/ethernet/broadcom/bcm6368-enetsw.c
|
||||
|
||||
--- a/drivers/net/ethernet/broadcom/Kconfig
|
||||
+++ b/drivers/net/ethernet/broadcom/Kconfig
|
||||
@@ -68,6 +68,14 @@ config BCM63XX_ENET
|
||||
This driver supports the ethernet MACs in the Broadcom 63xx
|
||||
MIPS chipset family (BCM63XX).
|
||||
|
||||
+config BCM6368_ENETSW
|
||||
+ tristate "Broadcom BCM6368 internal mac support"
|
||||
+ depends on BMIPS_GENERIC || COMPILE_TEST
|
||||
+ default y
|
||||
+ help
|
||||
+ This driver supports Ethernet controller integrated into Broadcom
|
||||
+ BCM6368 family SoCs.
|
||||
+
|
||||
config BCMGENET
|
||||
tristate "Broadcom GENET internal MAC support"
|
||||
depends on HAS_IOMEM
|
||||
--- a/drivers/net/ethernet/broadcom/Makefile
|
||||
+++ b/drivers/net/ethernet/broadcom/Makefile
|
||||
@@ -6,6 +6,7 @@
|
||||
obj-$(CONFIG_B44) += b44.o
|
||||
obj-$(CONFIG_BCM4908_ENET) += bcm4908_enet.o
|
||||
obj-$(CONFIG_BCM63XX_ENET) += bcm63xx_enet.o
|
||||
+obj-$(CONFIG_BCM6368_ENETSW) += bcm6368-enetsw.o
|
||||
obj-$(CONFIG_BCMGENET) += genet/
|
||||
obj-$(CONFIG_BNX2) += bnx2.o
|
||||
obj-$(CONFIG_CNIC) += cnic.o
|
@ -0,0 +1,11 @@
|
||||
--- a/drivers/net/dsa/b53/b53_mmap.c
|
||||
+++ b/drivers/net/dsa/b53/b53_mmap.c
|
||||
@@ -263,7 +263,7 @@ static int b53_mmap_probe_of(struct plat
|
||||
if (of_property_read_u32(of_port, "reg", ®))
|
||||
continue;
|
||||
|
||||
- if (reg < B53_CPU_PORT)
|
||||
+ if (reg <= B53_CPU_PORT)
|
||||
pdata->enabled_ports |= BIT(reg);
|
||||
}
|
||||
|
@ -0,0 +1,72 @@
|
||||
From 32cf73d8c6485b7b97aca7e377a68436d09b7022 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Rojas?= <noltari@gmail.com>
|
||||
Date: Sun, 14 Mar 2021 20:03:44 +0100
|
||||
Subject: [PATCH] net: dsa: b53: add support for BCM63xx RGMIIs
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
|
||||
---
|
||||
drivers/net/dsa/b53/b53_common.c | 37 ++++++++++++++++++++++++++++++++
|
||||
1 file changed, 37 insertions(+)
|
||||
|
||||
--- a/drivers/net/dsa/b53/b53_common.c
|
||||
+++ b/drivers/net/dsa/b53/b53_common.c
|
||||
@@ -1209,6 +1209,36 @@ static void b53_force_port_config(struct
|
||||
b53_write8(dev, B53_CTRL_PAGE, off, reg);
|
||||
}
|
||||
|
||||
+static void b53_adjust_63xx_rgmii(struct dsa_switch *ds, int port,
|
||||
+ phy_interface_t interface)
|
||||
+{
|
||||
+ struct b53_device *dev = ds->priv;
|
||||
+ u8 rgmii_ctrl = 0, off;
|
||||
+
|
||||
+ if (port == 8)
|
||||
+ off = B53_RGMII_CTRL_IMP;
|
||||
+ else
|
||||
+ off = B53_RGMII_CTRL_P(port);
|
||||
+
|
||||
+ b53_read8(dev, B53_CTRL_PAGE, off, &rgmii_ctrl);
|
||||
+
|
||||
+ rgmii_ctrl &= ~(RGMII_CTRL_DLL_RXC | RGMII_CTRL_DLL_TXC);
|
||||
+ if (interface == PHY_INTERFACE_MODE_RGMII_ID)
|
||||
+ rgmii_ctrl |= (RGMII_CTRL_DLL_RXC | RGMII_CTRL_DLL_TXC);
|
||||
+ else if (interface == PHY_INTERFACE_MODE_RGMII_RXID)
|
||||
+ rgmii_ctrl |= RGMII_CTRL_DLL_RXC;
|
||||
+ else if (interface == PHY_INTERFACE_MODE_RGMII_TXID)
|
||||
+ rgmii_ctrl |= RGMII_CTRL_DLL_TXC;
|
||||
+
|
||||
+ if (port != B53_CPU_PORT)
|
||||
+ rgmii_ctrl |= RGMII_CTRL_ENABLE_GMII;
|
||||
+
|
||||
+ b53_write8(dev, B53_CTRL_PAGE, off, rgmii_ctrl);
|
||||
+
|
||||
+ dev_info(ds->dev, "Configured port %d for %s\n", port,
|
||||
+ phy_modes(interface));
|
||||
+}
|
||||
+
|
||||
static void b53_adjust_link(struct dsa_switch *ds, int port,
|
||||
struct phy_device *phydev)
|
||||
{
|
||||
@@ -1235,6 +1265,9 @@ static void b53_adjust_link(struct dsa_s
|
||||
tx_pause, rx_pause);
|
||||
b53_force_link(dev, port, phydev->link);
|
||||
|
||||
+ if (is63xx(dev))
|
||||
+ b53_adjust_63xx_rgmii(ds, port, phydev->interface);
|
||||
+
|
||||
if (is531x5(dev) && phy_interface_is_rgmii(phydev)) {
|
||||
if (port == dev->imp_port)
|
||||
off = B53_RGMII_CTRL_IMP;
|
||||
@@ -1421,6 +1454,9 @@ void b53_phylink_mac_link_up(struct dsa_
|
||||
{
|
||||
struct b53_device *dev = ds->priv;
|
||||
|
||||
+ if (is63xx(dev) && port >= 4)
|
||||
+ b53_adjust_63xx_rgmii(ds, port, interface);
|
||||
+
|
||||
if (mode == MLO_AN_PHY)
|
||||
return;
|
||||
|
@ -0,0 +1,20 @@
|
||||
--- a/arch/mips/Kconfig
|
||||
+++ b/arch/mips/Kconfig
|
||||
@@ -276,6 +276,7 @@ config BMIPS_GENERIC
|
||||
select BCM7038_L1_IRQ
|
||||
select BCM7120_L2_IRQ
|
||||
select BRCMSTB_L2_IRQ
|
||||
+ select HAVE_PCI
|
||||
select IRQ_MIPS_CPU
|
||||
select DMA_NONCOHERENT
|
||||
select SYS_SUPPORTS_32BIT_KERNEL
|
||||
--- a/arch/mips/pci/Makefile
|
||||
+++ b/arch/mips/pci/Makefile
|
||||
@@ -28,6 +28,7 @@ obj-$(CONFIG_PCI_XTALK_BRIDGE) += pci-xt
|
||||
# These are still pretty much in the old state, watch, go blind.
|
||||
#
|
||||
obj-$(CONFIG_ATH79) += fixup-ath79.o
|
||||
+obj-$(CONFIG_BMIPS_GENERIC) += fixup-bmips.o
|
||||
obj-$(CONFIG_MIPS_COBALT) += fixup-cobalt.o
|
||||
obj-$(CONFIG_LEMOTE_FULOONG2E) += fixup-fuloong2e.o ops-loongson2.o
|
||||
obj-$(CONFIG_LEMOTE_MACH2F) += fixup-lemote2f.o ops-loongson2.o
|
@ -0,0 +1,22 @@
|
||||
--- a/drivers/pci/controller/Kconfig
|
||||
+++ b/drivers/pci/controller/Kconfig
|
||||
@@ -3,6 +3,11 @@
|
||||
menu "PCI controller drivers"
|
||||
depends on PCI
|
||||
|
||||
+config PCIE_BCM6328
|
||||
+ bool "BCM6328 PCIe controller"
|
||||
+ depends on BMIPS_GENERIC || COMPILE_TEST
|
||||
+ depends on OF
|
||||
+
|
||||
config PCI_MVEBU
|
||||
bool "Marvell EBU PCIe controller"
|
||||
depends on ARCH_MVEBU || ARCH_DOVE || COMPILE_TEST
|
||||
--- a/drivers/pci/controller/Makefile
|
||||
+++ b/drivers/pci/controller/Makefile
|
||||
@@ -1,4 +1,5 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
+obj-$(CONFIG_PCIE_BCM6328) += pcie-bcm6328.o
|
||||
obj-$(CONFIG_PCIE_CADENCE) += cadence/
|
||||
obj-$(CONFIG_PCI_FTPCI100) += pci-ftpci100.o
|
||||
obj-$(CONFIG_PCI_IXP4XX) += pci-ixp4xx.o
|
@ -0,0 +1,22 @@
|
||||
--- a/drivers/pci/controller/Kconfig
|
||||
+++ b/drivers/pci/controller/Kconfig
|
||||
@@ -3,6 +3,11 @@
|
||||
menu "PCI controller drivers"
|
||||
depends on PCI
|
||||
|
||||
+config PCIE_BCM6318
|
||||
+ bool "BCM6318 PCIe controller"
|
||||
+ depends on BMIPS_GENERIC || COMPILE_TEST
|
||||
+ depends on OF
|
||||
+
|
||||
config PCIE_BCM6328
|
||||
bool "BCM6328 PCIe controller"
|
||||
depends on BMIPS_GENERIC || COMPILE_TEST
|
||||
--- a/drivers/pci/controller/Makefile
|
||||
+++ b/drivers/pci/controller/Makefile
|
||||
@@ -1,4 +1,5 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
+obj-$(CONFIG_PCIE_BCM6318) += pcie-bcm6318.o
|
||||
obj-$(CONFIG_PCIE_BCM6328) += pcie-bcm6328.o
|
||||
obj-$(CONFIG_PCIE_CADENCE) += cadence/
|
||||
obj-$(CONFIG_PCI_FTPCI100) += pci-ftpci100.o
|
@ -0,0 +1,22 @@
|
||||
--- a/drivers/pci/controller/Kconfig
|
||||
+++ b/drivers/pci/controller/Kconfig
|
||||
@@ -3,6 +3,11 @@
|
||||
menu "PCI controller drivers"
|
||||
depends on PCI
|
||||
|
||||
+config PCI_BCM6348
|
||||
+ bool "BCM6348 PCI controller"
|
||||
+ depends on BMIPS_GENERIC || COMPILE_TEST
|
||||
+ depends on OF
|
||||
+
|
||||
config PCIE_BCM6318
|
||||
bool "BCM6318 PCIe controller"
|
||||
depends on BMIPS_GENERIC || COMPILE_TEST
|
||||
--- a/drivers/pci/controller/Makefile
|
||||
+++ b/drivers/pci/controller/Makefile
|
||||
@@ -1,4 +1,5 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
+obj-$(CONFIG_PCI_BCM6348) += pci-bcm6348.o
|
||||
obj-$(CONFIG_PCIE_BCM6318) += pcie-bcm6318.o
|
||||
obj-$(CONFIG_PCIE_BCM6328) += pcie-bcm6328.o
|
||||
obj-$(CONFIG_PCIE_CADENCE) += cadence/
|
@ -0,0 +1,6 @@
|
||||
--- a/arch/mips/bmips/Makefile
|
||||
+++ b/arch/mips/bmips/Makefile
|
||||
@@ -1,2 +1,3 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
obj-y += setup.o irq.o dma.o
|
||||
+obj-y += ath9k-fixup.o b43-sprom.o
|
@ -0,0 +1,26 @@
|
||||
From ff3409ab17d56450943364ba49a16960e3cdda9b Mon Sep 17 00:00:00 2001
|
||||
From: Jonas Gorski <jogo@openwrt.org>
|
||||
Date: Sun, 6 Apr 2014 22:33:16 +0200
|
||||
Subject: [RFC] jffs2: work around unaligned accesses failing on bcm63xx/smp
|
||||
|
||||
Unligned memcpy_fromio randomly fails with an unaligned dst. Work around
|
||||
it by ensuring we are always doing aligned copies.
|
||||
|
||||
Should fix filename corruption in jffs2 with SMP.
|
||||
|
||||
Signed-off-by: Jonas Gorski <jogo@openwrt.org>
|
||||
---
|
||||
fs/jffs2/nodelist.h | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/fs/jffs2/nodelist.h
|
||||
+++ b/fs/jffs2/nodelist.h
|
||||
@@ -259,7 +259,7 @@ struct jffs2_full_dirent
|
||||
uint32_t ino; /* == zero for unlink */
|
||||
unsigned int nhash;
|
||||
unsigned char type;
|
||||
- unsigned char name[];
|
||||
+ unsigned char name[] __attribute__((aligned((sizeof(long)))));
|
||||
};
|
||||
|
||||
/*
|
@ -4675,6 +4675,7 @@ CONFIG_PINCONF=y
|
||||
# CONFIG_PINCTRL_MT8365 is not set
|
||||
# CONFIG_PINCTRL_MTK_V2 is not set
|
||||
# CONFIG_PINCTRL_OCELOT is not set
|
||||
# CONFIG_PINCTRL_PISTACHIO is not set
|
||||
# CONFIG_PINCTRL_SC7280 is not set
|
||||
# CONFIG_PINCTRL_SC8180X is not set
|
||||
# CONFIG_PINCTRL_SDX55 is not set
|
||||
|
Loading…
x
Reference in New Issue
Block a user