aboutsummaryrefslogtreecommitdiff
path: root/drivers/pmu-11xx/src/lib.rs
blob: 2adec1f22d9b51cdc9f40987a9c2a98f7c90e60d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
#![no_std]

pub type Instance = ral_registers::Instance<RegisterBlock>;

#[repr(C)]
#[allow(non_snake_case)]
pub struct RegisterBlock {
    reserved_0: [u8; 1280],
    pub PMU_LDO_PLL: u32,
    reserved_1: [u8; 76],
    pub PMU_BIAS_CTRL: u32,
    reserved_2: [u8; 12],
    pub PMU_BIAS_CTRL2: u32,
    reserved_3: [u8; 12],
    pub PMU_REF_CTRL: u32,
    reserved_4: [u8; 12],
    pub PMU_POWER_DETECT_CTRL: u32,
    reserved_5: [u8; 124],
    pub LDO_PLL_ENABLE_SP: u32,
    reserved_6: [u8; 12],
    pub LDO_LPSR_ANA_ENABLE_SP: u32,
    reserved_7: [u8; 12],
    pub LDO_LPSR_ANA_LP_MODE_SP: u32,
    reserved_8: [u8; 12],
    pub LDO_LPSR_ANA_TRACKING_EN_SP: u32,
    reserved_9: [u8; 12],
    pub LDO_LPSR_ANA_BYPASS_EN_SP: u32,
    reserved_10: [u8; 12],
    pub LDO_LPSR_ANA_STBY_EN_SP: u32,
    reserved_11: [u8; 12],
    pub LDO_LPSR_DIG_ENABLE_SP: u32,
    reserved_12: [u8; 12],
    pub LDO_LPSR_DIG_TRG_SP0: u32,
    reserved_13: [u8; 12],
    pub LDO_LPSR_DIG_TRG_SP1: u32,
    reserved_14: [u8; 12],
    pub LDO_LPSR_DIG_TRG_SP2: u32,
    reserved_15: [u8; 12],
    pub LDO_LPSR_DIG_TRG_SP3: u32,
    reserved_16: [u8; 12],
    pub LDO_LPSR_DIG_LP_MODE_SP: u32,
    reserved_17: [u8; 12],
    pub LDO_LPSR_DIG_TRACKING_EN_SP: u32,
    reserved_18: [u8; 12],
    pub LDO_LPSR_DIG_BYPASS_EN_SP: u32,
    reserved_19: [u8; 12],
    pub LDO_LPSR_DIG_STBY_EN_SP: u32,
    reserved_20: [u8; 12],
    pub BANDGAP_ENABLE_SP: u32,
    reserved_21: [u8; 28],
    pub RBB_SOC_ENABLE_SP: u32,
    reserved_22: [u8; 12],
    pub RBB_LPSR_ENABLE_SP: u32,
    reserved_23: [u8; 12],
    pub BANDGAP_STBY_EN_SP: u32,
    reserved_24: [u8; 12],
    pub PLL_LDO_STBY_EN_SP: u32,
    reserved_25: [u8; 28],
    pub RBB_SOC_STBY_EN_SP: u32,
    reserved_26: [u8; 12],
    pub RBB_LPSR_STBY_EN_SP: u32,
    reserved_27: [u8; 28],
    pub RBB_LPSR_CONFIGURE: u32,
    reserved_28: [u8; 12],
    pub RBB_SOC_CONFIGURE: u32,
    reserved_29: [u8; 12],
    pub REFTOP_OTP_TRIM_VALUE: u32,
    reserved_30: [u8; 28],
    pub LPSR_1P8_LDO_OTP_TRIM_VALUE: u32,
}

ral_registers::register! {
    #[doc = "PMU_LDO_PLL_REGISTER"]
    pub PMU_LDO_PLL<u32> RW [
        #[doc = "LDO_PLL_ENABLE"]
        LDO_PLL_ENABLE start(0) width(1) RW {}
        #[doc = "LDO_PLL_CONTROL_MODE"]
        LDO_PLL_CONTROL_MODE start(1) width(1) RW {
            #[doc = "SW Control"]
            SOFTWARE = 0,
            #[doc = "HW Control"]
            HARDWARE = 0x1,
        }
        #[doc = "ldo_pll_ai_toggle"]
        LDO_PLL_AI_TOGGLE start(16) width(1) RW {}
        #[doc = "ldo_pll_busy"]
        LDO_PLL_AI_BUSY start(30) width(1) RO {}
    ]
}

ral_registers::register! {
    #[doc = "LDO_PLL_ENABLE_SP_REGISTER"]
    pub LDO_PLL_ENABLE_SP<u32> RW []
}

ral_registers::register! {
    #[doc = "PMU_REF_CTRL_REGISTER"]
    pub PMU_REF_CTRL<u32> RW [
        #[doc = "ref_ai_toggle"]
        REF_AI_TOGGLE start(0) width(1) RW {}
        #[doc = "ref_ai_busy"]
        REF_AI_BUSY start(1) width(1) RO {}
        #[doc = "REF_ENABLE"]
        REF_ENABLE start(2) width(1) RW {}
        #[doc = "REF_CONTROL_MODE"]
        REF_CONTROL_MODE start(3) width(1) RW {
            #[doc = "SW Control"]
            SOFTWRE = 0,
            #[doc = "HW Control"]
            HARDWARE = 0x1,
        }
        #[doc = "en_pll_vol_ref_buffer"]
        EN_PLL_VOL_REF_BUFFER start(4) width(1) RW {}
    ]
}

/// Specify which setpoints enable the PHY LDO.
///
/// A high bit in `setpoints` signals "enable."
pub fn set_phy_ldo_setpoints(pmu: Instance, setpoints: u16) {
    // Logic is inverted in hardware.
    let setpoints: u16 = !setpoints;
    ral_registers::write_reg!(self, pmu, LDO_PLL_ENABLE_SP, setpoints as u32);
}

/// Manage the PHY LDO with setpoints.
pub fn enable_phy_ldo_setpoints(pmu: Instance) {
    ral_registers::modify_reg!(self, pmu, PMU_LDO_PLL, LDO_PLL_CONTROL_MODE: HARDWARE);
}

/// Manage the PLL reference with setpoints.
pub fn enable_pll_reference_setpoints(pmu: Instance) {
    ral_registers::modify_reg!(self, pmu, PMU_REF_CTRL, REF_CONTROL_MODE: HARDWARE);
}

/// Enable or disable the PLL bandgap reference voltage.
pub fn enable_pll_reference_voltage(pmu: Instance, enable: bool) {
    ral_registers::modify_reg!(self, pmu, PMU_REF_CTRL, EN_PLL_VOL_REF_BUFFER: enable as u32);
}