Merge tag 'arm-soc/for-4.4/soc' of http://github.com/Broadcom/stblinux into next/soc
Merge "Broadcom soc changes for v4.4 (try 2)" from Florian Fainelli: This pull request contains the following Broadcom SoC platform and driver changes: - Brian Norris create a drivers/soc/brcmstb/ stub as a place holder for SoC-specific code which is coming next - Florian Fainelli adds support for configuring the BCM7xxx SoCs Bus Interface Unit with their specific write-pairing setting, which must be saved and restored during system-wide suspend/resume, and consequently updates the brcmstb machine code to initialize the BIU - Jon Mason adds support for the Northstar Plus SoCs by introducing a custom machine descriptor matching their compatible string and setting up the PL310 L2 cache and enabling the relevant ARM errata for their Cortex-A9 * tag 'arm-soc/for-4.4/soc' of http://github.com/Broadcom/stblinux: ARM: brcmstb: Setup BIU control registers during boot soc: brcmstb: Add Bus Interface Unit control setup soc: add stubs for brcmstb SoC's ARM: NSP: Add basic support for Broadcom Northstar Plus SoC
This commit is contained in:
commit
d72b712824
|
@ -35,6 +35,20 @@ config ARCH_BCM_CYGNUS
|
||||||
BCM11300, BCM11320, BCM11350, BCM11360,
|
BCM11300, BCM11320, BCM11350, BCM11360,
|
||||||
BCM58300, BCM58302, BCM58303, BCM58305.
|
BCM58300, BCM58302, BCM58303, BCM58305.
|
||||||
|
|
||||||
|
config ARCH_BCM_NSP
|
||||||
|
bool "Broadcom Northstar Plus SoC Support" if ARCH_MULTI_V7
|
||||||
|
select ARCH_BCM_IPROC
|
||||||
|
select ARM_ERRATA_754322
|
||||||
|
select ARM_ERRATA_775420
|
||||||
|
help
|
||||||
|
Support for Broadcom Northstar Plus SoC.
|
||||||
|
Broadcom Northstar Plus family of SoCs are used for switching control
|
||||||
|
and management applications as well as residential router/gateway
|
||||||
|
applications. The SoC features dual core Cortex A9 ARM CPUs,
|
||||||
|
integrating several peripheral interfaces including multiple Gigabit
|
||||||
|
Ethernet PHYs, DDR3 memory, PCIE Gen-2, USB 2.0 and USB 3.0, serial and
|
||||||
|
NAND flash, SATA and several other IO controllers.
|
||||||
|
|
||||||
config ARCH_BCM_5301X
|
config ARCH_BCM_5301X
|
||||||
bool "Broadcom BCM470X / BCM5301X ARM SoC" if ARCH_MULTI_V7
|
bool "Broadcom BCM470X / BCM5301X ARM SoC" if ARCH_MULTI_V7
|
||||||
select ARCH_BCM_IPROC
|
select ARCH_BCM_IPROC
|
||||||
|
@ -147,6 +161,7 @@ config ARCH_BRCMSTB
|
||||||
select BCM7120_L2_IRQ
|
select BCM7120_L2_IRQ
|
||||||
select ARCH_DMA_ADDR_T_64BIT if ARM_LPAE
|
select ARCH_DMA_ADDR_T_64BIT if ARM_LPAE
|
||||||
select ARCH_WANT_OPTIONAL_GPIOLIB
|
select ARCH_WANT_OPTIONAL_GPIOLIB
|
||||||
|
select SOC_BRCMSTB
|
||||||
help
|
help
|
||||||
Say Y if you intend to run the kernel on a Broadcom ARM-based STB
|
Say Y if you intend to run the kernel on a Broadcom ARM-based STB
|
||||||
chipset.
|
chipset.
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
#
|
#
|
||||||
# Copyright (C) 2012-2014 Broadcom Corporation
|
# Copyright (C) 2012-2015 Broadcom Corporation
|
||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or
|
# This program is free software; you can redistribute it and/or
|
||||||
# modify it under the terms of the GNU General Public License as
|
# modify it under the terms of the GNU General Public License as
|
||||||
|
@ -13,6 +13,9 @@
|
||||||
# Cygnus
|
# Cygnus
|
||||||
obj-$(CONFIG_ARCH_BCM_CYGNUS) += bcm_cygnus.o
|
obj-$(CONFIG_ARCH_BCM_CYGNUS) += bcm_cygnus.o
|
||||||
|
|
||||||
|
# Northstar Plus
|
||||||
|
obj-$(CONFIG_ARCH_BCM_NSP) += bcm_nsp.o
|
||||||
|
|
||||||
# BCM281XX
|
# BCM281XX
|
||||||
obj-$(CONFIG_ARCH_BCM_281XX) += board_bcm281xx.o
|
obj-$(CONFIG_ARCH_BCM_281XX) += board_bcm281xx.o
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,25 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2015 Broadcom Corporation
|
||||||
|
*
|
||||||
|
* 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 <asm/mach/arch.h>
|
||||||
|
|
||||||
|
static const char *const bcm_nsp_dt_compat[] __initconst = {
|
||||||
|
"brcm,nsp",
|
||||||
|
NULL,
|
||||||
|
};
|
||||||
|
|
||||||
|
DT_MACHINE_START(NSP_DT, "Broadcom Northstar Plus SoC")
|
||||||
|
.l2c_aux_val = 0,
|
||||||
|
.l2c_aux_mask = ~0,
|
||||||
|
.dt_compat = bcm_nsp_dt_compat,
|
||||||
|
MACHINE_END
|
|
@ -12,11 +12,19 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
|
#include <linux/irqchip.h>
|
||||||
#include <linux/of_platform.h>
|
#include <linux/of_platform.h>
|
||||||
|
#include <linux/soc/brcmstb/brcmstb.h>
|
||||||
|
|
||||||
#include <asm/mach-types.h>
|
#include <asm/mach-types.h>
|
||||||
#include <asm/mach/arch.h>
|
#include <asm/mach/arch.h>
|
||||||
|
|
||||||
|
static void __init brcmstb_init_irq(void)
|
||||||
|
{
|
||||||
|
irqchip_init();
|
||||||
|
brcmstb_biuctrl_init();
|
||||||
|
}
|
||||||
|
|
||||||
static const char *const brcmstb_match[] __initconst = {
|
static const char *const brcmstb_match[] __initconst = {
|
||||||
"brcm,bcm7445",
|
"brcm,bcm7445",
|
||||||
"brcm,brcmstb",
|
"brcm,brcmstb",
|
||||||
|
@ -25,4 +33,5 @@ static const char *const brcmstb_match[] __initconst = {
|
||||||
|
|
||||||
DT_MACHINE_START(BRCMSTB, "Broadcom STB (Flattened Device Tree)")
|
DT_MACHINE_START(BRCMSTB, "Broadcom STB (Flattened Device Tree)")
|
||||||
.dt_compat = brcmstb_match,
|
.dt_compat = brcmstb_match,
|
||||||
|
.init_irq = brcmstb_init_irq,
|
||||||
MACHINE_END
|
MACHINE_END
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
menu "SOC (System On Chip) specific Drivers"
|
menu "SOC (System On Chip) specific Drivers"
|
||||||
|
|
||||||
|
source "drivers/soc/brcmstb/Kconfig"
|
||||||
source "drivers/soc/mediatek/Kconfig"
|
source "drivers/soc/mediatek/Kconfig"
|
||||||
source "drivers/soc/qcom/Kconfig"
|
source "drivers/soc/qcom/Kconfig"
|
||||||
source "drivers/soc/sunxi/Kconfig"
|
source "drivers/soc/sunxi/Kconfig"
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
# Makefile for the Linux Kernel SOC specific device drivers.
|
# Makefile for the Linux Kernel SOC specific device drivers.
|
||||||
#
|
#
|
||||||
|
|
||||||
|
obj-$(CONFIG_SOC_BRCMSTB) += brcmstb/
|
||||||
obj-$(CONFIG_MACH_DOVE) += dove/
|
obj-$(CONFIG_MACH_DOVE) += dove/
|
||||||
obj-$(CONFIG_ARCH_MEDIATEK) += mediatek/
|
obj-$(CONFIG_ARCH_MEDIATEK) += mediatek/
|
||||||
obj-$(CONFIG_ARCH_QCOM) += qcom/
|
obj-$(CONFIG_ARCH_QCOM) += qcom/
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
menuconfig SOC_BRCMSTB
|
||||||
|
bool "Broadcom STB SoC drivers"
|
||||||
|
depends on ARM
|
||||||
|
help
|
||||||
|
Enables drivers for the Broadcom Set-Top Box (STB) series of chips.
|
||||||
|
This option alone enables only some support code, while the drivers
|
||||||
|
can be enabled individually within this menu.
|
||||||
|
|
||||||
|
If unsure, say N.
|
|
@ -0,0 +1 @@
|
||||||
|
obj-y += common.o biuctrl.o
|
|
@ -0,0 +1,116 @@
|
||||||
|
/*
|
||||||
|
* Broadcom STB SoCs Bus Unit Interface controls
|
||||||
|
*
|
||||||
|
* Copyright (C) 2015, Broadcom Corporation
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define pr_fmt(fmt) "brcmstb: " KBUILD_MODNAME ": " fmt
|
||||||
|
|
||||||
|
#include <linux/kernel.h>
|
||||||
|
#include <linux/io.h>
|
||||||
|
#include <linux/of_address.h>
|
||||||
|
#include <linux/syscore_ops.h>
|
||||||
|
|
||||||
|
#define CPU_CREDIT_REG_OFFSET 0x184
|
||||||
|
#define CPU_CREDIT_REG_MCPx_WR_PAIRING_EN_MASK 0x70000000
|
||||||
|
|
||||||
|
static void __iomem *cpubiuctrl_base;
|
||||||
|
static bool mcp_wr_pairing_en;
|
||||||
|
|
||||||
|
static int __init mcp_write_pairing_set(void)
|
||||||
|
{
|
||||||
|
u32 creds = 0;
|
||||||
|
|
||||||
|
if (!cpubiuctrl_base)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
creds = readl_relaxed(cpubiuctrl_base + CPU_CREDIT_REG_OFFSET);
|
||||||
|
if (mcp_wr_pairing_en) {
|
||||||
|
pr_info("MCP: Enabling write pairing\n");
|
||||||
|
writel_relaxed(creds | CPU_CREDIT_REG_MCPx_WR_PAIRING_EN_MASK,
|
||||||
|
cpubiuctrl_base + CPU_CREDIT_REG_OFFSET);
|
||||||
|
} else if (creds & CPU_CREDIT_REG_MCPx_WR_PAIRING_EN_MASK) {
|
||||||
|
pr_info("MCP: Disabling write pairing\n");
|
||||||
|
writel_relaxed(creds & ~CPU_CREDIT_REG_MCPx_WR_PAIRING_EN_MASK,
|
||||||
|
cpubiuctrl_base + CPU_CREDIT_REG_OFFSET);
|
||||||
|
} else {
|
||||||
|
pr_info("MCP: Write pairing already disabled\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int __init setup_hifcpubiuctrl_regs(void)
|
||||||
|
{
|
||||||
|
struct device_node *np;
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
np = of_find_compatible_node(NULL, NULL, "brcm,brcmstb-cpu-biu-ctrl");
|
||||||
|
if (!np) {
|
||||||
|
pr_err("missing BIU control node\n");
|
||||||
|
return -ENODEV;
|
||||||
|
}
|
||||||
|
|
||||||
|
cpubiuctrl_base = of_iomap(np, 0);
|
||||||
|
if (!cpubiuctrl_base) {
|
||||||
|
pr_err("failed to remap BIU control base\n");
|
||||||
|
ret = -ENOMEM;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
mcp_wr_pairing_en = of_property_read_bool(np, "brcm,write-pairing");
|
||||||
|
out:
|
||||||
|
of_node_put(np);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_PM_SLEEP
|
||||||
|
static u32 cpu_credit_reg_dump; /* for save/restore */
|
||||||
|
|
||||||
|
static int brcmstb_cpu_credit_reg_suspend(void)
|
||||||
|
{
|
||||||
|
if (cpubiuctrl_base)
|
||||||
|
cpu_credit_reg_dump =
|
||||||
|
readl_relaxed(cpubiuctrl_base + CPU_CREDIT_REG_OFFSET);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void brcmstb_cpu_credit_reg_resume(void)
|
||||||
|
{
|
||||||
|
if (cpubiuctrl_base)
|
||||||
|
writel_relaxed(cpu_credit_reg_dump,
|
||||||
|
cpubiuctrl_base + CPU_CREDIT_REG_OFFSET);
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct syscore_ops brcmstb_cpu_credit_syscore_ops = {
|
||||||
|
.suspend = brcmstb_cpu_credit_reg_suspend,
|
||||||
|
.resume = brcmstb_cpu_credit_reg_resume,
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
void __init brcmstb_biuctrl_init(void)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
setup_hifcpubiuctrl_regs();
|
||||||
|
|
||||||
|
ret = mcp_write_pairing_set();
|
||||||
|
if (ret) {
|
||||||
|
pr_err("MCP: Unable to disable write pairing!\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_PM_SLEEP
|
||||||
|
register_syscore_ops(&brcmstb_cpu_credit_syscore_ops);
|
||||||
|
#endif
|
||||||
|
}
|
|
@ -0,0 +1,33 @@
|
||||||
|
/*
|
||||||
|
* Copyright © 2014 NVIDIA Corporation
|
||||||
|
* Copyright © 2015 Broadcom Corporation
|
||||||
|
*
|
||||||
|
* 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/of.h>
|
||||||
|
|
||||||
|
#include <soc/brcmstb/common.h>
|
||||||
|
|
||||||
|
static const struct of_device_id brcmstb_machine_match[] = {
|
||||||
|
{ .compatible = "brcm,brcmstb", },
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
|
bool soc_is_brcmstb(void)
|
||||||
|
{
|
||||||
|
struct device_node *root;
|
||||||
|
|
||||||
|
root = of_find_node_by_path("/");
|
||||||
|
if (!root)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return of_match_node(brcmstb_machine_match, root) != NULL;
|
||||||
|
}
|
|
@ -0,0 +1,10 @@
|
||||||
|
#ifndef __BRCMSTB_SOC_H
|
||||||
|
#define __BRCMSTB_SOC_H
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Bus Interface Unit control register setup, must happen early during boot,
|
||||||
|
* before SMP is brought up, called by machine entry point.
|
||||||
|
*/
|
||||||
|
void brcmstb_biuctrl_init(void);
|
||||||
|
|
||||||
|
#endif /* __BRCMSTB_SOC_H */
|
|
@ -0,0 +1,15 @@
|
||||||
|
/*
|
||||||
|
* Copyright © 2014 NVIDIA Corporation
|
||||||
|
* Copyright © 2015 Broadcom Corporation
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License version 2 as
|
||||||
|
* published by the Free Software Foundation.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __SOC_BRCMSTB_COMMON_H__
|
||||||
|
#define __SOC_BRCMSTB_COMMON_H__
|
||||||
|
|
||||||
|
bool soc_is_brcmstb(void);
|
||||||
|
|
||||||
|
#endif /* __SOC_BRCMSTB_COMMON_H__ */
|
Loading…
Reference in New Issue