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 pub select: usize,
53}