ARM: bcm2835: add interrupt controller driver
The BCM2835 contains a custom interrupt controller, which supports 72
interrupt sources using a 2-level register scheme. The interrupt
controller, or the HW block containing it, is referred to occasionally
as "armctrl" in the SoC documentation, hence the symbol naming in the
code.
This patch was extracted from git://github.com/lp0/linux.git branch
rpi-split as of 2012/09/08, and modified as follows:
* s/bcm2708/bcm2835/.
* Modified device tree vendor prefix.
* Moved implementation to drivers/irchip/.
* Added devicetree documentation, and hence removed list of IRQs from
bcm2835.dtsi.
* Changed shift in MAKE_HWIRQ() and HWIRQ_BANK() from 8 to 5 to reduce
the size of the hwirq space, and pass the total size of the hwirq space
to irq_domain_add_linear(), rather than just the number of valid hwirqs;
the two are different due to the hwirq space being sparse.
* Added the interrupt controller DT node to the top-level of the DT,
rather than nesting it inside a /axi node. Hence, changed the reg value
since /axi had a ranges property. This seems simpler to me, but I'm not
sure if everyone will like this change or not.
* Don't set struct irq_domain_ops.map = irq_domain_simple_map, hence
removing the need to patch include/linux/irqdomain.h or
kernel/irq/irqdomain.c.
* Simplified armctrl_of_init() using of_iomap().
* Removed unused IS_VALID_BANK()/IS_VALID_IRQ() macros.
* Renamed armctrl_handle_irq() to prevent possible symbol clashes.
* Made armctrl_of_init() static.
* Removed comment "Each bank is registered as a separate interrupt
controller" since this is no longer true.
* Removed FSF address from license header.
* Added my name to copyright header.
Signed-off-by: Chris Boot <bootc@bootc.net>
Signed-off-by: Simon Arlott <simon@fire.lp0.eu>
Signed-off-by: Dom Cobley <popcornmix@gmail.com>
Signed-off-by: Dom Cobley <dc4@broadcom.com>
Signed-off-by: Stephen Warren <swarren@wwwdotorg.org>
Acked-by: Arnd Bergmann <arnd@arndb.de>
2012-09-13 09:57:26 +08:00
|
|
|
BCM2835 Top-Level ("ARMCTRL") Interrupt Controller
|
|
|
|
|
|
|
|
The BCM2835 contains a custom top-level interrupt controller, which supports
|
|
|
|
72 interrupt sources using a 2-level register scheme. The interrupt
|
|
|
|
controller, or the HW block containing it, is referred to occasionally
|
|
|
|
as "armctrl" in the SoC documentation, hence naming of this binding.
|
|
|
|
|
2015-08-07 07:00:31 +08:00
|
|
|
The BCM2836 contains the same interrupt controller with the same
|
|
|
|
interrupts, but the per-CPU interrupt controller is the root, and an
|
|
|
|
interrupt there indicates that the ARMCTRL has an interrupt to handle.
|
|
|
|
|
ARM: bcm2835: add interrupt controller driver
The BCM2835 contains a custom interrupt controller, which supports 72
interrupt sources using a 2-level register scheme. The interrupt
controller, or the HW block containing it, is referred to occasionally
as "armctrl" in the SoC documentation, hence the symbol naming in the
code.
This patch was extracted from git://github.com/lp0/linux.git branch
rpi-split as of 2012/09/08, and modified as follows:
* s/bcm2708/bcm2835/.
* Modified device tree vendor prefix.
* Moved implementation to drivers/irchip/.
* Added devicetree documentation, and hence removed list of IRQs from
bcm2835.dtsi.
* Changed shift in MAKE_HWIRQ() and HWIRQ_BANK() from 8 to 5 to reduce
the size of the hwirq space, and pass the total size of the hwirq space
to irq_domain_add_linear(), rather than just the number of valid hwirqs;
the two are different due to the hwirq space being sparse.
* Added the interrupt controller DT node to the top-level of the DT,
rather than nesting it inside a /axi node. Hence, changed the reg value
since /axi had a ranges property. This seems simpler to me, but I'm not
sure if everyone will like this change or not.
* Don't set struct irq_domain_ops.map = irq_domain_simple_map, hence
removing the need to patch include/linux/irqdomain.h or
kernel/irq/irqdomain.c.
* Simplified armctrl_of_init() using of_iomap().
* Removed unused IS_VALID_BANK()/IS_VALID_IRQ() macros.
* Renamed armctrl_handle_irq() to prevent possible symbol clashes.
* Made armctrl_of_init() static.
* Removed comment "Each bank is registered as a separate interrupt
controller" since this is no longer true.
* Removed FSF address from license header.
* Added my name to copyright header.
Signed-off-by: Chris Boot <bootc@bootc.net>
Signed-off-by: Simon Arlott <simon@fire.lp0.eu>
Signed-off-by: Dom Cobley <popcornmix@gmail.com>
Signed-off-by: Dom Cobley <dc4@broadcom.com>
Signed-off-by: Stephen Warren <swarren@wwwdotorg.org>
Acked-by: Arnd Bergmann <arnd@arndb.de>
2012-09-13 09:57:26 +08:00
|
|
|
Required properties:
|
|
|
|
|
2015-08-07 07:00:31 +08:00
|
|
|
- compatible : should be "brcm,bcm2835-armctrl-ic" or
|
|
|
|
"brcm,bcm2836-armctrl-ic"
|
ARM: bcm2835: add interrupt controller driver
The BCM2835 contains a custom interrupt controller, which supports 72
interrupt sources using a 2-level register scheme. The interrupt
controller, or the HW block containing it, is referred to occasionally
as "armctrl" in the SoC documentation, hence the symbol naming in the
code.
This patch was extracted from git://github.com/lp0/linux.git branch
rpi-split as of 2012/09/08, and modified as follows:
* s/bcm2708/bcm2835/.
* Modified device tree vendor prefix.
* Moved implementation to drivers/irchip/.
* Added devicetree documentation, and hence removed list of IRQs from
bcm2835.dtsi.
* Changed shift in MAKE_HWIRQ() and HWIRQ_BANK() from 8 to 5 to reduce
the size of the hwirq space, and pass the total size of the hwirq space
to irq_domain_add_linear(), rather than just the number of valid hwirqs;
the two are different due to the hwirq space being sparse.
* Added the interrupt controller DT node to the top-level of the DT,
rather than nesting it inside a /axi node. Hence, changed the reg value
since /axi had a ranges property. This seems simpler to me, but I'm not
sure if everyone will like this change or not.
* Don't set struct irq_domain_ops.map = irq_domain_simple_map, hence
removing the need to patch include/linux/irqdomain.h or
kernel/irq/irqdomain.c.
* Simplified armctrl_of_init() using of_iomap().
* Removed unused IS_VALID_BANK()/IS_VALID_IRQ() macros.
* Renamed armctrl_handle_irq() to prevent possible symbol clashes.
* Made armctrl_of_init() static.
* Removed comment "Each bank is registered as a separate interrupt
controller" since this is no longer true.
* Removed FSF address from license header.
* Added my name to copyright header.
Signed-off-by: Chris Boot <bootc@bootc.net>
Signed-off-by: Simon Arlott <simon@fire.lp0.eu>
Signed-off-by: Dom Cobley <popcornmix@gmail.com>
Signed-off-by: Dom Cobley <dc4@broadcom.com>
Signed-off-by: Stephen Warren <swarren@wwwdotorg.org>
Acked-by: Arnd Bergmann <arnd@arndb.de>
2012-09-13 09:57:26 +08:00
|
|
|
- reg : Specifies base physical address 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. The value shall be 2.
|
|
|
|
|
|
|
|
The 1st cell is the interrupt bank; 0 for interrupts in the "IRQ basic
|
|
|
|
pending" register, or 1/2 respectively for interrupts in the "IRQ pending
|
|
|
|
1/2" register.
|
|
|
|
|
|
|
|
The 2nd cell contains the interrupt number within the bank. Valid values
|
|
|
|
are 0..7 for bank 0, and 0..31 for bank 1.
|
|
|
|
|
2015-08-07 07:00:31 +08:00
|
|
|
Additional required properties for brcm,bcm2836-armctrl-ic:
|
|
|
|
- interrupts : Specifies the interrupt on the parent for this interrupt
|
|
|
|
controller to handle.
|
|
|
|
|
ARM: bcm2835: add interrupt controller driver
The BCM2835 contains a custom interrupt controller, which supports 72
interrupt sources using a 2-level register scheme. The interrupt
controller, or the HW block containing it, is referred to occasionally
as "armctrl" in the SoC documentation, hence the symbol naming in the
code.
This patch was extracted from git://github.com/lp0/linux.git branch
rpi-split as of 2012/09/08, and modified as follows:
* s/bcm2708/bcm2835/.
* Modified device tree vendor prefix.
* Moved implementation to drivers/irchip/.
* Added devicetree documentation, and hence removed list of IRQs from
bcm2835.dtsi.
* Changed shift in MAKE_HWIRQ() and HWIRQ_BANK() from 8 to 5 to reduce
the size of the hwirq space, and pass the total size of the hwirq space
to irq_domain_add_linear(), rather than just the number of valid hwirqs;
the two are different due to the hwirq space being sparse.
* Added the interrupt controller DT node to the top-level of the DT,
rather than nesting it inside a /axi node. Hence, changed the reg value
since /axi had a ranges property. This seems simpler to me, but I'm not
sure if everyone will like this change or not.
* Don't set struct irq_domain_ops.map = irq_domain_simple_map, hence
removing the need to patch include/linux/irqdomain.h or
kernel/irq/irqdomain.c.
* Simplified armctrl_of_init() using of_iomap().
* Removed unused IS_VALID_BANK()/IS_VALID_IRQ() macros.
* Renamed armctrl_handle_irq() to prevent possible symbol clashes.
* Made armctrl_of_init() static.
* Removed comment "Each bank is registered as a separate interrupt
controller" since this is no longer true.
* Removed FSF address from license header.
* Added my name to copyright header.
Signed-off-by: Chris Boot <bootc@bootc.net>
Signed-off-by: Simon Arlott <simon@fire.lp0.eu>
Signed-off-by: Dom Cobley <popcornmix@gmail.com>
Signed-off-by: Dom Cobley <dc4@broadcom.com>
Signed-off-by: Stephen Warren <swarren@wwwdotorg.org>
Acked-by: Arnd Bergmann <arnd@arndb.de>
2012-09-13 09:57:26 +08:00
|
|
|
The interrupt sources are as follows:
|
|
|
|
|
|
|
|
Bank 0:
|
|
|
|
0: ARM_TIMER
|
|
|
|
1: ARM_MAILBOX
|
|
|
|
2: ARM_DOORBELL_0
|
|
|
|
3: ARM_DOORBELL_1
|
|
|
|
4: VPU0_HALTED
|
|
|
|
5: VPU1_HALTED
|
|
|
|
6: ILLEGAL_TYPE0
|
|
|
|
7: ILLEGAL_TYPE1
|
|
|
|
|
|
|
|
Bank 1:
|
|
|
|
0: TIMER0
|
|
|
|
1: TIMER1
|
|
|
|
2: TIMER2
|
|
|
|
3: TIMER3
|
|
|
|
4: CODEC0
|
|
|
|
5: CODEC1
|
|
|
|
6: CODEC2
|
|
|
|
7: VC_JPEG
|
|
|
|
8: ISP
|
|
|
|
9: VC_USB
|
|
|
|
10: VC_3D
|
|
|
|
11: TRANSPOSER
|
|
|
|
12: MULTICORESYNC0
|
|
|
|
13: MULTICORESYNC1
|
|
|
|
14: MULTICORESYNC2
|
|
|
|
15: MULTICORESYNC3
|
|
|
|
16: DMA0
|
|
|
|
17: DMA1
|
|
|
|
18: VC_DMA2
|
|
|
|
19: VC_DMA3
|
|
|
|
20: DMA4
|
|
|
|
21: DMA5
|
|
|
|
22: DMA6
|
|
|
|
23: DMA7
|
|
|
|
24: DMA8
|
|
|
|
25: DMA9
|
|
|
|
26: DMA10
|
2016-03-06 02:02:49 +08:00
|
|
|
27: DMA11-14 - shared interrupt for DMA 11 to 14
|
|
|
|
28: DMAALL - triggers on all dma interrupts (including chanel 15)
|
ARM: bcm2835: add interrupt controller driver
The BCM2835 contains a custom interrupt controller, which supports 72
interrupt sources using a 2-level register scheme. The interrupt
controller, or the HW block containing it, is referred to occasionally
as "armctrl" in the SoC documentation, hence the symbol naming in the
code.
This patch was extracted from git://github.com/lp0/linux.git branch
rpi-split as of 2012/09/08, and modified as follows:
* s/bcm2708/bcm2835/.
* Modified device tree vendor prefix.
* Moved implementation to drivers/irchip/.
* Added devicetree documentation, and hence removed list of IRQs from
bcm2835.dtsi.
* Changed shift in MAKE_HWIRQ() and HWIRQ_BANK() from 8 to 5 to reduce
the size of the hwirq space, and pass the total size of the hwirq space
to irq_domain_add_linear(), rather than just the number of valid hwirqs;
the two are different due to the hwirq space being sparse.
* Added the interrupt controller DT node to the top-level of the DT,
rather than nesting it inside a /axi node. Hence, changed the reg value
since /axi had a ranges property. This seems simpler to me, but I'm not
sure if everyone will like this change or not.
* Don't set struct irq_domain_ops.map = irq_domain_simple_map, hence
removing the need to patch include/linux/irqdomain.h or
kernel/irq/irqdomain.c.
* Simplified armctrl_of_init() using of_iomap().
* Removed unused IS_VALID_BANK()/IS_VALID_IRQ() macros.
* Renamed armctrl_handle_irq() to prevent possible symbol clashes.
* Made armctrl_of_init() static.
* Removed comment "Each bank is registered as a separate interrupt
controller" since this is no longer true.
* Removed FSF address from license header.
* Added my name to copyright header.
Signed-off-by: Chris Boot <bootc@bootc.net>
Signed-off-by: Simon Arlott <simon@fire.lp0.eu>
Signed-off-by: Dom Cobley <popcornmix@gmail.com>
Signed-off-by: Dom Cobley <dc4@broadcom.com>
Signed-off-by: Stephen Warren <swarren@wwwdotorg.org>
Acked-by: Arnd Bergmann <arnd@arndb.de>
2012-09-13 09:57:26 +08:00
|
|
|
29: AUX
|
|
|
|
30: ARM
|
|
|
|
31: VPUDMA
|
|
|
|
|
|
|
|
Bank 2:
|
|
|
|
0: HOSTPORT
|
|
|
|
1: VIDEOSCALER
|
|
|
|
2: CCP2TX
|
|
|
|
3: SDC
|
|
|
|
4: DSI0
|
|
|
|
5: AVE
|
|
|
|
6: CAM0
|
|
|
|
7: CAM1
|
|
|
|
8: HDMI0
|
|
|
|
9: HDMI1
|
|
|
|
10: PIXELVALVE1
|
|
|
|
11: I2CSPISLV
|
|
|
|
12: DSI1
|
|
|
|
13: PWA0
|
|
|
|
14: PWA1
|
|
|
|
15: CPR
|
|
|
|
16: SMI
|
|
|
|
17: GPIO0
|
|
|
|
18: GPIO1
|
|
|
|
19: GPIO2
|
|
|
|
20: GPIO3
|
|
|
|
21: VC_I2C
|
|
|
|
22: VC_SPI
|
|
|
|
23: VC_I2SPCM
|
|
|
|
24: VC_SDIO
|
|
|
|
25: VC_UART
|
|
|
|
26: SLIMBUS
|
|
|
|
27: VEC
|
|
|
|
28: CPG
|
|
|
|
29: RNG
|
|
|
|
30: VC_ARASANSDIO
|
|
|
|
31: AVSPMON
|
|
|
|
|
|
|
|
Example:
|
|
|
|
|
2015-08-07 07:00:31 +08:00
|
|
|
/* BCM2835, first level */
|
ARM: bcm2835: add interrupt controller driver
The BCM2835 contains a custom interrupt controller, which supports 72
interrupt sources using a 2-level register scheme. The interrupt
controller, or the HW block containing it, is referred to occasionally
as "armctrl" in the SoC documentation, hence the symbol naming in the
code.
This patch was extracted from git://github.com/lp0/linux.git branch
rpi-split as of 2012/09/08, and modified as follows:
* s/bcm2708/bcm2835/.
* Modified device tree vendor prefix.
* Moved implementation to drivers/irchip/.
* Added devicetree documentation, and hence removed list of IRQs from
bcm2835.dtsi.
* Changed shift in MAKE_HWIRQ() and HWIRQ_BANK() from 8 to 5 to reduce
the size of the hwirq space, and pass the total size of the hwirq space
to irq_domain_add_linear(), rather than just the number of valid hwirqs;
the two are different due to the hwirq space being sparse.
* Added the interrupt controller DT node to the top-level of the DT,
rather than nesting it inside a /axi node. Hence, changed the reg value
since /axi had a ranges property. This seems simpler to me, but I'm not
sure if everyone will like this change or not.
* Don't set struct irq_domain_ops.map = irq_domain_simple_map, hence
removing the need to patch include/linux/irqdomain.h or
kernel/irq/irqdomain.c.
* Simplified armctrl_of_init() using of_iomap().
* Removed unused IS_VALID_BANK()/IS_VALID_IRQ() macros.
* Renamed armctrl_handle_irq() to prevent possible symbol clashes.
* Made armctrl_of_init() static.
* Removed comment "Each bank is registered as a separate interrupt
controller" since this is no longer true.
* Removed FSF address from license header.
* Added my name to copyright header.
Signed-off-by: Chris Boot <bootc@bootc.net>
Signed-off-by: Simon Arlott <simon@fire.lp0.eu>
Signed-off-by: Dom Cobley <popcornmix@gmail.com>
Signed-off-by: Dom Cobley <dc4@broadcom.com>
Signed-off-by: Stephen Warren <swarren@wwwdotorg.org>
Acked-by: Arnd Bergmann <arnd@arndb.de>
2012-09-13 09:57:26 +08:00
|
|
|
intc: interrupt-controller {
|
|
|
|
compatible = "brcm,bcm2835-armctrl-ic";
|
|
|
|
reg = <0x7e00b200 0x200>;
|
|
|
|
interrupt-controller;
|
|
|
|
#interrupt-cells = <2>;
|
|
|
|
};
|
2015-08-07 07:00:31 +08:00
|
|
|
|
|
|
|
/* BCM2836, second level */
|
|
|
|
intc: interrupt-controller {
|
|
|
|
compatible = "brcm,bcm2836-armctrl-ic";
|
|
|
|
reg = <0x7e00b200 0x200>;
|
|
|
|
interrupt-controller;
|
|
|
|
#interrupt-cells = <2>;
|
|
|
|
|
|
|
|
interrupt-parent = <&local_intc>;
|
|
|
|
interrupts = <8>;
|
|
|
|
};
|