Leia a seção 2 aqui: Especificando informações de interrupção para dispositivos ...
2) Interrupt controller nodes
A device is marked as an interrupt controller with the "interrupt-controller" property. This is a empty, boolean property. An additional "#interrupt-cells" property defines the number of cells needed to specify a single interrupt.
It is the responsibility of the interrupt controller's binding to define the length and format of the interrupt specifier. The following two variants are commonly used:
a) one cell
The #interrupt-cells property is set to 1 and the single cell defines the index of the interrupt within the controller.
Example:
vic: intc@10140000 { compatible = "arm,versatile-vic"; interrupt-controller; #interrupt-cells = <1>; reg = <0x10140000 0x1000>; }; sic: intc@10003000 { compatible = "arm,versatile-sic"; interrupt-controller; #interrupt-cells = <1>; reg = <0x10003000 0x1000>; interrupt-parent = <&vic>; interrupts = <31>; /* Cascaded to vic */ };
b) two cells
The #interrupt-cells property is set to 2 and the first cell defines the index of the interrupt within the controller, while the second cell is used to specify any of the following flags:
bits[3:0] trigger type and level flags
1 = low-to-high edge triggered
2 = high-to-low edge triggered
4 = active high level-sensitive
8 = active low level-sensitiveExemplo:
i2c@7000c000 { gpioext: gpio-adnp@41 { compatible = "ad,gpio-adnp"; reg = <0x41>; interrupt-parent = <&gpio>; interrupts = <160 1>; gpio-controller; #gpio-cells = <1>; interrupt-controller; #interrupt-cells = <2>; nr-gpios = <64>; }; sx8634@2b { compatible = "smtc,sx8634"; reg = <0x2b>; interrupt-parent = <&gpioext>; interrupts = <3 0x8>; #address-cells = <1>; #size-cells = <0>; threshold = <0x40>; sensitivity = <7>; }; };
Portanto, para a variante de duas células, o primeiro número é um índice e o segundo é uma máscara de bits que define o tipo da entrada de interrupção.
Esta parte da árvore de dispositivos é manipulada pelo código em drivers/of/irq.c
(por exemplo, of_irq_parse_one()
).
As duas linhas a que você se refere no exemplo citado declaram o dispositivo ( gpio-exp@21
) como um controlador de interrupção e qualquer outro dispositivo que queira usá-lo deve fornecer duas células por interrupção.
Logo acima dessas linhas há um exemplo de um dispositivo especificando uma interrupção em outro controlador de interrupção (não este, mas o dispositivo com alias gpio
), através das duas propriedades interrupt-parent
e interrupts
(ou você poderia use o novo interrupts-extended
, que permite diferentes controladores de interrupção para cada interrupção, especificando o pai como a primeira célula da propriedade).