fdt_parser/
clocks.rs

1use crate::{node::Node, read::FdtReader, Fdt, Phandle};
2
3pub struct ClocksIter<'a> {
4    pub fdt: &'a Fdt<'a>,
5    pub prop: Option<FdtReader<'a>>,
6}
7
8impl<'a> ClocksIter<'a> {
9    pub fn new(node: &'a Node<'a>) -> Self {
10        let fdt = node.fdt;
11        let prop = node.find_property("clocks");
12
13        Self {
14            fdt,
15            prop: prop.map(|p| p.data),
16        }
17    }
18}
19
20impl<'a> Iterator for ClocksIter<'a> {
21    type Item = ClockRef<'a>;
22
23    fn next(&mut self) -> Option<Self::Item> {
24        let p = self.prop.as_mut()?;
25        let phandle = Phandle::from(p.take_u32()?);
26
27        let node = self.fdt.get_node_by_phandle(phandle)?;
28        let mut select = 0;
29
30        let cell_size = node
31            .find_property("#clock-cells")
32            .expect("#clock-cells not found")
33            .u32();
34
35        if cell_size > 0 {
36            select = p.take_u32().expect("invalid clock cells");
37            for _ in 0..cell_size - 1 {
38                p.take_u32();
39            }
40        }
41
42        Some(ClockRef {
43            node,
44            select: select as _,
45        })
46    }
47}
48
49pub struct ClockRef<'a> {
50    pub node: Node<'a>,
51    /// second cell of one of `clocks`.
52    pub select: usize,
53}