Дерево устройств Linux, узел с несколькими родителями прерываний

StackOverflow https://stackoverflow.com//questions/25056717

Вопрос

Я работаю с деревом устройств ядра Linux, и на первый взгляд кажется, что для узлов с несколькими родителями прерываний отсутствует функциональность.У меня есть драйвер, который управляет пользовательской встроенной платой ARM, он принимает прерывания GPIO и pin от нескольких родителей прерываний GPIO и управляет встроенной батареей, IRQ низкого напряжения, irq reset_pending и т.д.

Я нашел один источник, где кто-то, похоже, взломал дополнительную функциональность, чтобы справиться с этим, но это не является официальным и включает в себя изменение исходных файлов прерывания, которые мне не нужны.Модификация добавила поддержку термина под названием "расширенные прерывания", подобного этому.Здесь родительский элемент прерывания указан в кортежах.

    #interrupt-cells = <2>;
    interrupts-extended = <&gpio3 21 1>, <&gpio7 13 2>; /* voltage/reset irq */

Я не нашел никаких средств или примеров того, как использовать свойство interrupt-map для достижения простого сопоставления прерываний gpio, поэтому я в растерянности.

Если бы я использовал только один родительский элемент прерывания GPIO, правильный способ сделать это был бы следующим.

interrupt-parent = <&gpio1>;
interrupts = <9 2>, <8,1>;

но это позволяет только объявлять один родительское прерывание с несколькими прерываниями, указанными в разделе "прерывания", и все они должны принадлежать указанному родительскому устройству.Я использую 2 родителя прерываний, gpio7 и gpio3.

Каков правильный способ реализации нескольких прерываний с разными родителями прерываний в одном узле устройства в дереве устройств?

Это было полезно?

Решение

Я не знаю, работает ли это для родителей прерываний gpio, но для других типов контроллеров прерываний вы используете свойство 'interrupt-map' и указываете список прерываний, используя phandles, для каждого из отдельных контроллеров.Вот пример, который я видел, где драйверу требовалось 3 прерывания, 2 от контроллера 'intc' и 1 от контроллера 'spmi':

interrupts = <0 1 2>;
interrupt-map = <0 &intc 0 134 0
                 1 &intc 0 140 0
                 2 &spmi 0 0x9 0 0>;
interrupt-names = "core_irq", "async_irq", "pmic_id_irq";
interrupt-map-mask = <0 0 0 0>;

В этом примере узел intc имел значение #interrupt-cells равное <3> и узел spmi имел значение #interrupt-cells равное 4 (это означает, что многие аргументы необходимо было использовать с их соответствующими фэндлами).

Поле "Имена прерываний" является необязательным, но позволяет запрашивать irq по имени, а не по номеру в коде (т.е. использовать platform_get_irq_byname() вместо platform_get_irq())

Честно говоря, я немного не уверен, для чего используется interrupt-map-mask.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top