mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-14 22:44:27 +08:00
9e8e8912b0
On mmp3, there's an extra set of ICU registers (ICU2) that handle interrupts on the extra cores. When masking off interrupts on MP1, these should be masked as well. We add a new interrupt controller via device tree to identify when we're looking at an mmp3 machine via compatible field of "marvell,mmp3-intc". [lkundrak@v3.sk: Changed "mrvl,mmp3-intc" compatible strings to "marvell,mmp3-intc". Tidied up the subject line a bit.] Signed-off-by: Andres Salomon <dilinger@queued.net> Signed-off-by: Lubomir Rintel <lkundrak@v3.sk> Signed-off-by: Marc Zyngier <maz@kernel.org> Link: https://lore.kernel.org/r/20190822092643.593488-9-lkundrak@v3.sk -- Changes since v1: - Moved mmp3-specific mmp_icu2_base initialization from mmp_init_bases() to mmp3_of_init() so that we don't have to check for marvell,mmp3-intc compatibility twice. - Drop an superfluous call to irq_set_default_host() arch/arm/mach-mmp/regs-icu.h | 3 +++ drivers/irqchip/irq-mmp.c | 48 ++++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+) Signed-off-by: Andres Salomon <dilinger@queued.net> Signed-off-by: Lubomir Rintel <lkundrak@v3.sk> Signed-off-by: Marc Zyngier <maz@kernel.org> Link: https://lore.kernel.org/r/20190822092643.593488-9-lkundrak@v3.sk
70 lines
2.2 KiB
C
70 lines
2.2 KiB
C
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
/*
|
|
* Interrupt Control Unit
|
|
*/
|
|
|
|
#ifndef __ASM_MACH_ICU_H
|
|
#define __ASM_MACH_ICU_H
|
|
|
|
#include "addr-map.h"
|
|
|
|
#define ICU_VIRT_BASE (AXI_VIRT_BASE + 0x82000)
|
|
#define ICU_REG(x) (ICU_VIRT_BASE + (x))
|
|
|
|
#define ICU2_VIRT_BASE (AXI_VIRT_BASE + 0x84000)
|
|
#define ICU2_REG(x) (ICU2_VIRT_BASE + (x))
|
|
|
|
#define ICU_INT_CONF(n) ICU_REG((n) << 2)
|
|
#define ICU_INT_CONF_MASK (0xf)
|
|
|
|
/************ PXA168/PXA910 (MMP) *********************/
|
|
#define ICU_INT_CONF_AP_INT (1 << 6)
|
|
#define ICU_INT_CONF_CP_INT (1 << 5)
|
|
#define ICU_INT_CONF_IRQ (1 << 4)
|
|
|
|
#define ICU_AP_FIQ_SEL_INT_NUM ICU_REG(0x108) /* AP FIQ Selected Interrupt */
|
|
#define ICU_AP_IRQ_SEL_INT_NUM ICU_REG(0x10C) /* AP IRQ Selected Interrupt */
|
|
#define ICU_AP_GBL_IRQ_MSK ICU_REG(0x114) /* AP Global Interrupt Mask */
|
|
#define ICU_INT_STATUS_0 ICU_REG(0x128) /* Interrupt Stuats 0 */
|
|
#define ICU_INT_STATUS_1 ICU_REG(0x12C) /* Interrupt Status 1 */
|
|
|
|
/************************** MMP2 ***********************/
|
|
|
|
/*
|
|
* IRQ0/FIQ0 is routed to SP IRQ/FIQ.
|
|
* IRQ1 is routed to PJ4 IRQ, and IRQ2 is routes to PJ4 FIQ.
|
|
*/
|
|
#define ICU_INT_ROUTE_SP_IRQ (1 << 4)
|
|
#define ICU_INT_ROUTE_PJ4_IRQ (1 << 5)
|
|
#define ICU_INT_ROUTE_PJ4_FIQ (1 << 6)
|
|
|
|
#define MMP2_ICU_PJ4_IRQ_STATUS0 ICU_REG(0x138)
|
|
#define MMP2_ICU_PJ4_IRQ_STATUS1 ICU_REG(0x13c)
|
|
#define MMP2_ICU_PJ4_FIQ_STATUS0 ICU_REG(0x140)
|
|
#define MMP2_ICU_PJ4_FIQ_STATUS1 ICU_REG(0x144)
|
|
|
|
#define MMP2_ICU_INT4_STATUS ICU_REG(0x150)
|
|
#define MMP2_ICU_INT5_STATUS ICU_REG(0x154)
|
|
#define MMP2_ICU_INT17_STATUS ICU_REG(0x158)
|
|
#define MMP2_ICU_INT35_STATUS ICU_REG(0x15c)
|
|
#define MMP2_ICU_INT51_STATUS ICU_REG(0x160)
|
|
|
|
#define MMP2_ICU_INT4_MASK ICU_REG(0x168)
|
|
#define MMP2_ICU_INT5_MASK ICU_REG(0x16C)
|
|
#define MMP2_ICU_INT17_MASK ICU_REG(0x170)
|
|
#define MMP2_ICU_INT35_MASK ICU_REG(0x174)
|
|
#define MMP2_ICU_INT51_MASK ICU_REG(0x178)
|
|
|
|
#define MMP2_ICU_SP_IRQ_SEL ICU_REG(0x100)
|
|
#define MMP2_ICU_PJ4_IRQ_SEL ICU_REG(0x104)
|
|
#define MMP2_ICU_PJ4_FIQ_SEL ICU_REG(0x108)
|
|
|
|
#define MMP2_ICU_INVERT ICU_REG(0x164)
|
|
|
|
#define MMP2_ICU_INV_PMIC (1 << 0)
|
|
#define MMP2_ICU_INV_PERF (1 << 1)
|
|
#define MMP2_ICU_INV_COMMTX (1 << 2)
|
|
#define MMP2_ICU_INV_COMMRX (1 << 3)
|
|
|
|
#endif /* __ASM_MACH_ICU_H */
|