stm32/lp: add refcount
This commit is contained in:
		@@ -356,6 +356,8 @@ fn main() {
 | 
				
			|||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    fn enable() {
 | 
					                    fn enable() {
 | 
				
			||||||
                        critical_section::with(|_| {
 | 
					                        critical_section::with(|_| {
 | 
				
			||||||
 | 
					                            #[cfg(feature = "low-power")]
 | 
				
			||||||
 | 
					                            crate::rcc::clock_refcount_add();
 | 
				
			||||||
                            crate::pac::RCC.#en_reg().modify(|w| w.#set_en_field(true));
 | 
					                            crate::pac::RCC.#en_reg().modify(|w| w.#set_en_field(true));
 | 
				
			||||||
                            #after_enable
 | 
					                            #after_enable
 | 
				
			||||||
                        })
 | 
					                        })
 | 
				
			||||||
@@ -363,6 +365,8 @@ fn main() {
 | 
				
			|||||||
                    fn disable() {
 | 
					                    fn disable() {
 | 
				
			||||||
                        critical_section::with(|_| {
 | 
					                        critical_section::with(|_| {
 | 
				
			||||||
                            crate::pac::RCC.#en_reg().modify(|w| w.#set_en_field(false));
 | 
					                            crate::pac::RCC.#en_reg().modify(|w| w.#set_en_field(false));
 | 
				
			||||||
 | 
					                            #[cfg(feature = "low-power")]
 | 
				
			||||||
 | 
					                            crate::rcc::clock_refcount_sub();
 | 
				
			||||||
                        })
 | 
					                        })
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    fn reset() {
 | 
					                    fn reset() {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -26,6 +26,8 @@ use crate::time::Hertz;
 | 
				
			|||||||
#[cfg_attr(any(rcc_h5, rcc_h50), path = "h5.rs")]
 | 
					#[cfg_attr(any(rcc_h5, rcc_h50), path = "h5.rs")]
 | 
				
			||||||
mod _version;
 | 
					mod _version;
 | 
				
			||||||
pub use _version::*;
 | 
					pub use _version::*;
 | 
				
			||||||
 | 
					#[cfg(feature = "low-power")]
 | 
				
			||||||
 | 
					use atomic_polyfill::{AtomicU32, Ordering};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#[derive(Clone, Copy, Debug)]
 | 
					#[derive(Clone, Copy, Debug)]
 | 
				
			||||||
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
 | 
					#[cfg_attr(feature = "defmt", derive(defmt::Format))]
 | 
				
			||||||
@@ -79,6 +81,25 @@ pub struct Clocks {
 | 
				
			|||||||
    pub rtc: Option<Hertz>,
 | 
					    pub rtc: Option<Hertz>,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#[cfg(feature = "low-power")]
 | 
				
			||||||
 | 
					static CLOCK_REFCOUNT: AtomicU32 = AtomicU32::new(0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#[cfg(feature = "low-power")]
 | 
				
			||||||
 | 
					pub fn low_power_ready() -> bool {
 | 
				
			||||||
 | 
					    CLOCK_REFCOUNT.load(Ordering::SeqCst) == 0
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#[cfg(feature = "low-power")]
 | 
				
			||||||
 | 
					pub(crate) fn clock_refcount_add() {
 | 
				
			||||||
 | 
					    // We don't check for overflow because constructing more than u32 peripherals is unlikely
 | 
				
			||||||
 | 
					    CLOCK_REFCOUNT.fetch_add(1, Ordering::Relaxed);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#[cfg(feature = "low-power")]
 | 
				
			||||||
 | 
					pub(crate) fn clock_refcount_sub() {
 | 
				
			||||||
 | 
					    assert!(CLOCK_REFCOUNT.fetch_sub(1, Ordering::Relaxed) != 0);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/// Frozen clock frequencies
 | 
					/// Frozen clock frequencies
 | 
				
			||||||
///
 | 
					///
 | 
				
			||||||
/// The existence of this value indicates that the clock configuration can no longer be changed
 | 
					/// The existence of this value indicates that the clock configuration can no longer be changed
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user