Skip to content
This repository was archived by the owner on Aug 9, 2022. It is now read-only.

Commit 5f35bbd

Browse files
committed
Callbacks pass info of frequency before and after change
1 parent b1a2ea1 commit 5f35bbd

File tree

2 files changed

+107
-12
lines changed

2 files changed

+107
-12
lines changed

src/clock_control/config.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ impl<'a> super::ClockControlConfig {
146146
// TODO: at the moment only static lifetime callbacks are allow
147147
pub fn add_callback<F>(&self, f: &'static F) -> Result<(), Error>
148148
where
149-
F: Fn(),
149+
F: Fn(super::CPUSource, Hertz, Hertz, super::CPUSource, Hertz, Hertz),
150150
{
151151
unsafe { CLOCK_CONTROL.as_mut().unwrap().add_callback(f) }
152152
}

src/clock_control/dfs.rs

Lines changed: 106 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,15 @@ static DFS_MUTEX: CriticalSectionSpinLockMutex<Locks> = CriticalSectionSpinLockM
2727

2828
/// DFS structure
2929
pub(super) struct DFS {
30-
callbacks: [&'static dyn Fn(); MAX_CALLBACKS],
30+
callbacks: [&'static dyn Fn(super::CPUSource, Hertz, Hertz, super::CPUSource, Hertz, Hertz);
31+
MAX_CALLBACKS],
3132
nr_callbacks: CriticalSectionSpinLockMutex<usize>,
3233
}
3334

3435
impl DFS {
3536
pub(crate) fn new() -> Self {
3637
DFS {
37-
callbacks: [&|| {}; MAX_CALLBACKS],
38+
callbacks: [&|_, _, _, _, _, _| {}; MAX_CALLBACKS],
3839

3940
nr_callbacks: CriticalSectionSpinLockMutex::new(0),
4041
}
@@ -105,13 +106,35 @@ impl<'a> Drop for LockPllD2 {
105106

106107
impl<'a> super::ClockControl {
107108
/// call all the callbacks
108-
fn do_callbacks(&self) {
109+
fn do_callbacks(
110+
&self,
111+
cpu_source_before: super::CPUSource,
112+
cpu_frequency_before: Hertz,
113+
apb_frequency_before: Hertz,
114+
cpu_source_after: super::CPUSource,
115+
cpu_frequency_after: Hertz,
116+
apb_frequency_after: Hertz,
117+
) {
118+
if cpu_source_after == cpu_source_before
119+
&& cpu_frequency_after == cpu_frequency_before
120+
&& apb_frequency_after == apb_frequency_before
121+
{
122+
return;
123+
}
124+
109125
// copy the callbacks to prevent needing to have interrupts disabled the entire time
110126
// as callback cannot be deleted this is ok.
111127
let (nr, callbacks) = (&self.dfs.nr_callbacks).lock(|nr| (*nr, self.dfs.callbacks));
112128

113129
for i in 0..nr {
114-
callbacks[i]();
130+
callbacks[i](
131+
cpu_source_before,
132+
cpu_frequency_before,
133+
apb_frequency_before,
134+
cpu_source_after,
135+
cpu_frequency_after,
136+
apb_frequency_after,
137+
);
115138
}
116139
}
117140

@@ -122,8 +145,20 @@ impl<'a> super::ClockControl {
122145

123146
if data.cpu == 1 {
124147
if data.apb == 0 || self.cpu_frequency_locked > self.cpu_frequency_apb_locked {
148+
let cpu_source_before = self.cpu_source;
149+
let cpu_frequency_before = self.cpu_frequency;
150+
let apb_frequency_before = self.apb_frequency;
151+
125152
self.set_cpu_frequency_locked(data.pll_d2 > 0).unwrap();
126-
self.do_callbacks()
153+
154+
self.do_callbacks(
155+
cpu_source_before,
156+
cpu_frequency_before,
157+
apb_frequency_before,
158+
self.cpu_source,
159+
self.cpu_frequency,
160+
self.apb_frequency,
161+
);
127162
}
128163
}
129164
});
@@ -136,12 +171,24 @@ impl<'a> super::ClockControl {
136171
data.cpu -= 1;
137172

138173
if data.cpu == 0 {
174+
let cpu_source_before = self.cpu_source;
175+
let cpu_frequency_before = self.cpu_frequency;
176+
let apb_frequency_before = self.apb_frequency;
177+
139178
if data.apb == 0 {
140179
self.set_cpu_frequency_default(data.pll_d2 > 0).unwrap();
141180
} else {
142181
self.set_cpu_frequency_apb_locked(data.pll_d2 > 0).unwrap();
143182
}
144-
self.do_callbacks()
183+
184+
self.do_callbacks(
185+
cpu_source_before,
186+
cpu_frequency_before,
187+
apb_frequency_before,
188+
self.cpu_source,
189+
self.cpu_frequency,
190+
self.apb_frequency,
191+
);
145192
}
146193
});
147194
}
@@ -153,8 +200,20 @@ impl<'a> super::ClockControl {
153200

154201
if data.apb == 1 {
155202
if data.cpu == 0 || self.cpu_frequency_apb_locked > self.cpu_frequency_locked {
203+
let cpu_source_before = self.cpu_source;
204+
let cpu_frequency_before = self.cpu_frequency;
205+
let apb_frequency_before = self.apb_frequency;
206+
156207
self.set_cpu_frequency_apb_locked(data.pll_d2 > 0).unwrap();
157-
self.do_callbacks();
208+
209+
self.do_callbacks(
210+
cpu_source_before,
211+
cpu_frequency_before,
212+
apb_frequency_before,
213+
self.cpu_source,
214+
self.cpu_frequency,
215+
self.apb_frequency,
216+
);
158217
}
159218
}
160219
});
@@ -167,12 +226,24 @@ impl<'a> super::ClockControl {
167226
data.apb -= 1;
168227

169228
if data.apb == 0 {
229+
let cpu_source_before = self.cpu_source;
230+
let cpu_frequency_before = self.cpu_frequency;
231+
let apb_frequency_before = self.apb_frequency;
232+
170233
if data.cpu == 0 {
171234
self.set_cpu_frequency_default(data.pll_d2 > 0).unwrap();
172235
} else {
173236
self.set_cpu_frequency_locked(data.pll_d2 > 0).unwrap();
174237
}
175-
self.do_callbacks()
238+
239+
self.do_callbacks(
240+
cpu_source_before,
241+
cpu_frequency_before,
242+
apb_frequency_before,
243+
self.cpu_source,
244+
self.cpu_frequency,
245+
self.apb_frequency,
246+
);
176247
}
177248
});
178249
}
@@ -202,8 +273,20 @@ impl<'a> super::ClockControl {
202273
(&DFS_MUTEX).lock(|data| {
203274
data.pll_d2 += 1;
204275
if data.pll_d2 == 1 && self.pll_frequency == super::FREQ_OFF {
276+
let cpu_source_before = self.cpu_source;
277+
let cpu_frequency_before = self.cpu_frequency;
278+
let apb_frequency_before = self.apb_frequency;
279+
205280
self.pll_enable(false).unwrap();
206-
self.do_callbacks();
281+
282+
self.do_callbacks(
283+
cpu_source_before,
284+
cpu_frequency_before,
285+
apb_frequency_before,
286+
self.cpu_source,
287+
self.cpu_frequency,
288+
self.apb_frequency,
289+
);
207290
}
208291
});
209292

@@ -216,8 +299,20 @@ impl<'a> super::ClockControl {
216299
data.pll_d2 -= 1;
217300

218301
if data.pll_d2 == 0 && self.cpu_source() != super::CPUSource::PLL {
302+
let cpu_source_before = self.cpu_source;
303+
let cpu_frequency_before = self.cpu_frequency;
304+
let apb_frequency_before = self.apb_frequency;
305+
219306
self.pll_disable();
220-
self.do_callbacks();
307+
308+
self.do_callbacks(
309+
cpu_source_before,
310+
cpu_frequency_before,
311+
apb_frequency_before,
312+
self.cpu_source,
313+
self.cpu_frequency,
314+
self.apb_frequency,
315+
);
221316
}
222317
});
223318
}
@@ -230,7 +325,7 @@ impl<'a> super::ClockControl {
230325
/// TODO: at the moment only static lifetime callbacks are allowed
231326
pub(crate) fn add_callback<F>(&mut self, f: &'static F) -> Result<(), Error>
232327
where
233-
F: Fn(),
328+
F: Fn(super::CPUSource, Hertz, Hertz, super::CPUSource, Hertz, Hertz),
234329
{
235330
// need to disable interrupts, because otherwise deadlock can arise
236331
// when interrupt is called after mutex is obtained and interrupt

0 commit comments

Comments
 (0)