Back to home page

OSCL-LXR

 
 

    


0001 Marvell ICU Interrupt Controller
0002 --------------------------------
0003 
0004 The Marvell ICU (Interrupt Consolidation Unit) controller is
0005 responsible for collecting all wired-interrupt sources in the CP and
0006 communicating them to the GIC in the AP, the unit translates interrupt
0007 requests on input wires to MSG memory mapped transactions to the GIC.
0008 These messages will access a different GIC memory area depending on
0009 their type (NSR, SR, SEI, REI, etc).
0010 
0011 Required properties:
0012 
0013 - compatible: Should be "marvell,cp110-icu"
0014 
0015 - reg: Should contain ICU registers location and length.
0016 
0017 Subnodes: Each group of interrupt is declared as a subnode of the ICU,
0018 with their own compatible.
0019 
0020 Required properties for the icu_nsr/icu_sei subnodes:
0021 
0022 - compatible: Should be one of:
0023               * "marvell,cp110-icu-nsr"
0024               * "marvell,cp110-icu-sr"
0025               * "marvell,cp110-icu-sei"
0026               * "marvell,cp110-icu-rei"
0027 
0028 - #interrupt-cells: Specifies the number of cells needed to encode an
0029   interrupt source. The value shall be 2.
0030 
0031   The 1st cell is the index of the interrupt in the ICU unit.
0032 
0033   The 2nd cell is the type of the interrupt. See arm,gic.txt for
0034   details.
0035 
0036 - interrupt-controller: Identifies the node as an interrupt
0037   controller.
0038 
0039 - msi-parent: Should point to the GICP controller, the GIC extension
0040   that allows to trigger interrupts using MSG memory mapped
0041   transactions.
0042 
0043 Note: each 'interrupts' property referring to any 'icu_xxx' node shall
0044       have a different number within [0:206].
0045 
0046 Example:
0047 
0048 icu: interrupt-controller@1e0000 {
0049         compatible = "marvell,cp110-icu";
0050         reg = <0x1e0000 0x440>;
0051 
0052         CP110_LABEL(icu_nsr): interrupt-controller@10 {
0053                 compatible = "marvell,cp110-icu-nsr";
0054                 reg = <0x10 0x20>;
0055                 #interrupt-cells = <2>;
0056                 interrupt-controller;
0057                 msi-parent = <&gicp>;
0058         };
0059 
0060         CP110_LABEL(icu_sei): interrupt-controller@50 {
0061                 compatible = "marvell,cp110-icu-sei";
0062                 reg = <0x50 0x10>;
0063                 #interrupt-cells = <2>;
0064                 interrupt-controller;
0065                 msi-parent = <&sei>;
0066         };
0067 };
0068 
0069 node1 {
0070         interrupt-parent = <&icu_nsr>;
0071         interrupts = <106 IRQ_TYPE_LEVEL_HIGH>;
0072 };
0073 
0074 node2 {
0075         interrupt-parent = <&icu_sei>;
0076         interrupts = <107 IRQ_TYPE_LEVEL_HIGH>;
0077 };
0078 
0079 /* Would not work with the above nodes */
0080 node3 {
0081         interrupt-parent = <&icu_nsr>;
0082         interrupts = <107 IRQ_TYPE_LEVEL_HIGH>;
0083 };
0084 
0085 The legacy bindings were different in this way:
0086 
0087 - #interrupt-cells: The value was 3.
0088         The 1st cell was the group type of the ICU interrupt. Possible
0089         group types were:
0090         ICU_GRP_NSR (0x0) : Shared peripheral interrupt, non-secure
0091         ICU_GRP_SR  (0x1) : Shared peripheral interrupt, secure
0092         ICU_GRP_SEI (0x4) : System error interrupt
0093         ICU_GRP_REI (0x5) : RAM error interrupt
0094         The 2nd cell was the index of the interrupt in the ICU unit.
0095         The 3rd cell was the type of the interrupt. See arm,gic.txt for
0096         details.
0097 
0098 Example:
0099 
0100 icu: interrupt-controller@1e0000 {
0101         compatible = "marvell,cp110-icu";
0102         reg = <0x1e0000 0x440>;
0103 
0104         #interrupt-cells = <3>;
0105         interrupt-controller;
0106         msi-parent = <&gicp>;
0107 };
0108 
0109 node1 {
0110         interrupt-parent = <&icu>;
0111         interrupts = <ICU_GRP_NSR 106 IRQ_TYPE_LEVEL_HIGH>;
0112 };