mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-23 23:42:43 +00:00
7d7aa2fd92
This change makes the names of Broadcom targets consistent by using the common notation based on SoC/CPU ID (which is used internally anyway), bcmXXXX instead of brcmXXXX. This is even used for target TITLE in make menuconfig already, only the short target name used brcm so far. Despite, since subtargets range from bcm2708 to bcm2711, it seems appropriate to use bcm27xx instead of bcm2708 (again, as already done for BOARDNAME). This also renames the packages brcm2708-userland and brcm2708-gpu-fw. Signed-off-by: Adrian Schmutzler <freifunk@adrianschmutzler.de> Acked-by: Álvaro Fernández Rojas <noltari@gmail.com>
113 lines
3.6 KiB
Diff
113 lines
3.6 KiB
Diff
From f1905bc5137db49ef155f835d52d68cb86c4c9a9 Mon Sep 17 00:00:00 2001
|
|
From: Phil Elwell <phil@raspberrypi.org>
|
|
Date: Tue, 23 Jan 2018 16:52:45 +0000
|
|
Subject: [PATCH] irqchip: irq-bcm2836: Remove regmap and syscon use
|
|
|
|
The syscon node defines a register range that duplicates that used by
|
|
the local_intc node on bcm2836/7. Since irq-bcm2835 and irq-bcm2836 are
|
|
built in and always present together (both drivers are enabled by
|
|
CONFIG_ARCH_BCM2835), it is possible to replace the syscon usage with a
|
|
global variable that simplifies the code. Doing so does lose the
|
|
locking provided by regmap, but as only one side is using the regmap
|
|
interface (irq-bcm2835 uses readl and write) there is no loss of
|
|
atomicity.
|
|
|
|
See: https://github.com/raspberrypi/firmware/issues/926
|
|
|
|
Signed-off-by: Phil Elwell <phil@raspberrypi.org>
|
|
---
|
|
drivers/irqchip/irq-bcm2835.c | 32 ++++++++++++--------------------
|
|
drivers/irqchip/irq-bcm2836.c | 5 +++++
|
|
2 files changed, 17 insertions(+), 20 deletions(-)
|
|
|
|
--- a/drivers/irqchip/irq-bcm2835.c
|
|
+++ b/drivers/irqchip/irq-bcm2835.c
|
|
@@ -50,8 +50,6 @@
|
|
#include <linux/of_irq.h>
|
|
#include <linux/irqchip.h>
|
|
#include <linux/irqdomain.h>
|
|
-#include <linux/mfd/syscon.h>
|
|
-#include <linux/regmap.h>
|
|
|
|
#include <asm/exception.h>
|
|
#include <asm/mach/irq.h>
|
|
@@ -100,7 +98,7 @@ struct armctrl_ic {
|
|
void __iomem *enable[NR_BANKS];
|
|
void __iomem *disable[NR_BANKS];
|
|
struct irq_domain *domain;
|
|
- struct regmap *local_regmap;
|
|
+ void __iomem *local_base;
|
|
};
|
|
|
|
static struct armctrl_ic intc __read_mostly;
|
|
@@ -137,24 +135,20 @@ static void armctrl_unmask_irq(struct ir
|
|
if (d->hwirq >= NUMBER_IRQS) {
|
|
if (num_online_cpus() > 1) {
|
|
unsigned int data;
|
|
- int ret;
|
|
|
|
- if (!intc.local_regmap) {
|
|
- pr_err("FIQ is disabled due to missing regmap\n");
|
|
+ if (!intc.local_base) {
|
|
+ pr_err("FIQ is disabled due to missing arm_local_intc\n");
|
|
return;
|
|
}
|
|
|
|
- ret = regmap_read(intc.local_regmap,
|
|
- ARM_LOCAL_GPU_INT_ROUTING, &data);
|
|
- if (ret) {
|
|
- pr_err("Failed to read int routing %d\n", ret);
|
|
- return;
|
|
- }
|
|
+ data = readl_relaxed(intc.local_base +
|
|
+ ARM_LOCAL_GPU_INT_ROUTING);
|
|
|
|
data &= ~0xc;
|
|
data |= (1 << 2);
|
|
- regmap_write(intc.local_regmap,
|
|
- ARM_LOCAL_GPU_INT_ROUTING, data);
|
|
+ writel_relaxed(data,
|
|
+ intc.local_base +
|
|
+ ARM_LOCAL_GPU_INT_ROUTING);
|
|
}
|
|
|
|
writel_relaxed(REG_FIQ_ENABLE | hwirq_to_fiq(d->hwirq),
|
|
@@ -240,12 +234,10 @@ static int __init armctrl_of_init(struct
|
|
}
|
|
|
|
if (is_2836) {
|
|
- intc.local_regmap =
|
|
- syscon_regmap_lookup_by_compatible("brcm,bcm2836-arm-local");
|
|
- if (IS_ERR(intc.local_regmap)) {
|
|
- pr_err("Failed to get local register map. FIQ is disabled for cpus > 1\n");
|
|
- intc.local_regmap = NULL;
|
|
- }
|
|
+ extern void __iomem * __attribute__((weak)) arm_local_intc;
|
|
+ intc.local_base = arm_local_intc;
|
|
+ if (!intc.local_base)
|
|
+ pr_err("Failed to get local intc base. FIQ is disabled for cpus > 1\n");
|
|
}
|
|
|
|
/* Make a duplicate irq range which is used to enable FIQ */
|
|
--- a/drivers/irqchip/irq-bcm2836.c
|
|
+++ b/drivers/irqchip/irq-bcm2836.c
|
|
@@ -30,6 +30,9 @@ struct bcm2836_arm_irqchip_intc {
|
|
|
|
static struct bcm2836_arm_irqchip_intc intc __read_mostly;
|
|
|
|
+void __iomem *arm_local_intc;
|
|
+EXPORT_SYMBOL_GPL(arm_local_intc);
|
|
+
|
|
static void bcm2836_arm_irqchip_mask_per_cpu_irq(unsigned int reg_offset,
|
|
unsigned int bit,
|
|
int cpu)
|
|
@@ -234,6 +237,8 @@ static int __init bcm2836_arm_irqchip_l1
|
|
panic("%pOF: unable to map local interrupt registers\n", node);
|
|
}
|
|
|
|
+ arm_local_intc = intc.base;
|
|
+
|
|
bcm2835_init_local_timer_frequency();
|
|
|
|
intc.domain = irq_domain_add_linear(node, LAST_IRQ + 1,
|