@@ -27,14 +27,15 @@ static DFS_MUTEX: CriticalSectionSpinLockMutex<Locks> = CriticalSectionSpinLockM
27
27
28
28
/// DFS structure
29
29
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 ] ,
31
32
nr_callbacks : CriticalSectionSpinLockMutex < usize > ,
32
33
}
33
34
34
35
impl DFS {
35
36
pub ( crate ) fn new ( ) -> Self {
36
37
DFS {
37
- callbacks : [ & || { } ; MAX_CALLBACKS ] ,
38
+ callbacks : [ & |_ , _ , _ , _ , _ , _ | { } ; MAX_CALLBACKS ] ,
38
39
39
40
nr_callbacks : CriticalSectionSpinLockMutex :: new ( 0 ) ,
40
41
}
@@ -105,13 +106,35 @@ impl<'a> Drop for LockPllD2 {
105
106
106
107
impl < ' a > super :: ClockControl {
107
108
/// 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
+
109
125
// copy the callbacks to prevent needing to have interrupts disabled the entire time
110
126
// as callback cannot be deleted this is ok.
111
127
let ( nr, callbacks) = ( & self . dfs . nr_callbacks ) . lock ( |nr| ( * nr, self . dfs . callbacks ) ) ;
112
128
113
129
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
+ ) ;
115
138
}
116
139
}
117
140
@@ -122,8 +145,20 @@ impl<'a> super::ClockControl {
122
145
123
146
if data. cpu == 1 {
124
147
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
+
125
152
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
+ ) ;
127
162
}
128
163
}
129
164
} ) ;
@@ -136,12 +171,24 @@ impl<'a> super::ClockControl {
136
171
data. cpu -= 1 ;
137
172
138
173
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
+
139
178
if data. apb == 0 {
140
179
self . set_cpu_frequency_default ( data. pll_d2 > 0 ) . unwrap ( ) ;
141
180
} else {
142
181
self . set_cpu_frequency_apb_locked ( data. pll_d2 > 0 ) . unwrap ( ) ;
143
182
}
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
+ ) ;
145
192
}
146
193
} ) ;
147
194
}
@@ -153,8 +200,20 @@ impl<'a> super::ClockControl {
153
200
154
201
if data. apb == 1 {
155
202
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
+
156
207
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
+ ) ;
158
217
}
159
218
}
160
219
} ) ;
@@ -167,12 +226,24 @@ impl<'a> super::ClockControl {
167
226
data. apb -= 1 ;
168
227
169
228
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
+
170
233
if data. cpu == 0 {
171
234
self . set_cpu_frequency_default ( data. pll_d2 > 0 ) . unwrap ( ) ;
172
235
} else {
173
236
self . set_cpu_frequency_locked ( data. pll_d2 > 0 ) . unwrap ( ) ;
174
237
}
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
+ ) ;
176
247
}
177
248
} ) ;
178
249
}
@@ -202,8 +273,20 @@ impl<'a> super::ClockControl {
202
273
( & DFS_MUTEX ) . lock ( |data| {
203
274
data. pll_d2 += 1 ;
204
275
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
+
205
280
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
+ ) ;
207
290
}
208
291
} ) ;
209
292
@@ -216,8 +299,20 @@ impl<'a> super::ClockControl {
216
299
data. pll_d2 -= 1 ;
217
300
218
301
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
+
219
306
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
+ ) ;
221
316
}
222
317
} ) ;
223
318
}
@@ -230,7 +325,7 @@ impl<'a> super::ClockControl {
230
325
/// TODO: at the moment only static lifetime callbacks are allowed
231
326
pub ( crate ) fn add_callback < F > ( & mut self , f : & ' static F ) -> Result < ( ) , Error >
232
327
where
233
- F : Fn ( ) ,
328
+ F : Fn ( super :: CPUSource , Hertz , Hertz , super :: CPUSource , Hertz , Hertz ) ,
234
329
{
235
330
// need to disable interrupts, because otherwise deadlock can arise
236
331
// when interrupt is called after mutex is obtained and interrupt
0 commit comments