fdt_edit/node/
interrupt_controller.rs1use core::ops::Deref;
2
3use alloc::vec::Vec;
4
5use crate::node::gerneric::NodeRefGen;
6
7#[derive(Clone)]
9pub struct NodeRefInterruptController<'a> {
10 pub node: NodeRefGen<'a>,
11}
12
13impl<'a> NodeRefInterruptController<'a> {
14 pub fn try_from(node: NodeRefGen<'a>) -> Result<Self, NodeRefGen<'a>> {
15 if !is_interrupt_controller_node(&node) {
16 return Err(node);
17 }
18 Ok(Self { node })
19 }
20
21 pub fn interrupt_cells(&self) -> Option<u32> {
25 self.find_property("#interrupt-cells")
26 .and_then(|prop| prop.get_u32())
27 }
28
29 pub fn interrupt_address_cells(&self) -> Option<u32> {
31 self.find_property("#address-cells")
32 .and_then(|prop| prop.get_u32())
33 }
34
35 pub fn is_interrupt_controller(&self) -> bool {
37 self.find_property("interrupt-controller").is_some()
39 }
40
41 pub fn compatibles(&self) -> Vec<&str> {
43 self.node.compatibles().collect()
44 }
45}
46
47impl<'a> Deref for NodeRefInterruptController<'a> {
48 type Target = NodeRefGen<'a>;
49
50 fn deref(&self) -> &Self::Target {
51 &self.node
52 }
53}
54
55fn is_interrupt_controller_node(node: &NodeRefGen) -> bool {
57 if node.name().starts_with("interrupt-controller") {
59 return true;
60 }
61
62 node.find_property("interrupt-controller").is_some()
64}