1use crate::iomuxc::{DriveStrength, MuxMode, OpenDrainEn, PullKeepEn, PullUpDown, Sion, Speed};
6use kernel::utilities::registers::interfaces::{ReadWriteable, Readable};
7use kernel::utilities::registers::{register_bitfields, ReadWrite};
8use kernel::utilities::StaticRef;
9
10#[repr(C)]
12struct IomuxcSnvsRegisters {
13 sw_mux_ctl_pad_wakeup: ReadWrite<u32, SW_MUX_CTL_PAD_WAKEUP::Register>,
14 sw_mux_ctl_pad_pmic_on_req: ReadWrite<u32, SW_MUX_CTL_PAD_PMIC_ON_REQ::Register>,
15 sw_mux_ctl_pad_pmic_stby_req: ReadWrite<u32, SW_MUX_CTL_PAD_PMIC_STBY_REQ::Register>,
16 sw_pad_ctl_pad_test_mode: ReadWrite<u32, SW_PAD_CTL_PAD_TEST_MODE::Register>,
17 sw_pad_ctl_pad_por_b: ReadWrite<u32, SW_PAD_CTL_PAD_POR_B::Register>,
18 sw_pad_ctl_pad_onoff: ReadWrite<u32, SW_PAD_CTL_PAD_ONOFF::Register>,
19 sw_pad_ctl_pad_wakeup: ReadWrite<u32, SW_PAD_CTL_PAD_WAKEUP::Register>,
20 sw_pad_ctl_pad_pmic_on_req: ReadWrite<u32, SW_PAD_CTL_PAD_PMIC_ON_REQ::Register>,
21 sw_pad_ctl_pad_pmic_stby_req: ReadWrite<u32, SW_PAD_CTL_PAD_PMIC_STBY_REQ::Register>,
22}
23
24register_bitfields![u32,
25 SW_MUX_CTL_PAD_WAKEUP [
26 SION OFFSET(4) NUMBITS(1) [],
28 MUX_MODE OFFSET(0) NUMBITS(3) []
30 ],
31
32 SW_MUX_CTL_PAD_PMIC_ON_REQ [
33 SION OFFSET(4) NUMBITS(1) [],
35 MUX_MODE OFFSET(0) NUMBITS(3) []
37 ],
38
39 SW_MUX_CTL_PAD_PMIC_STBY_REQ [
40 SION OFFSET(4) NUMBITS(1) [],
42 MUX_MODE OFFSET(0) NUMBITS(3) []
44 ],
45
46 SW_PAD_CTL_PAD_TEST_MODE [
47 HYS OFFSET(16) NUMBITS(1) [],
49 PUS OFFSET(14) NUMBITS(2) [],
51 PUE OFFSET(13) NUMBITS(1) [],
53 PKE OFFSET(12) NUMBITS(1) [],
55 ODE OFFSET(11) NUMBITS(1) [],
57 SPEED OFFSET(6) NUMBITS(2) [],
59 DSE OFFSET(3) NUMBITS(3) [],
61 SRE OFFSET(0) NUMBITS(1) []
63 ],
64
65 SW_PAD_CTL_PAD_POR_B [
66 HYS OFFSET(16) NUMBITS(1) [],
68 PUS OFFSET(14) NUMBITS(2) [],
70 PUE OFFSET(13) NUMBITS(1) [],
72 PKE OFFSET(12) NUMBITS(1) [],
74 ODE OFFSET(11) NUMBITS(1) [],
76 SPEED OFFSET(6) NUMBITS(2) [],
78 DSE OFFSET(3) NUMBITS(3) [],
80 SRE OFFSET(0) NUMBITS(1) []
82 ],
83
84 SW_PAD_CTL_PAD_ONOFF [
85 HYS OFFSET(16) NUMBITS(1) [],
87 PUS OFFSET(14) NUMBITS(2) [],
89 PUE OFFSET(13) NUMBITS(1) [],
91 PKE OFFSET(12) NUMBITS(1) [],
93 ODE OFFSET(11) NUMBITS(1) [],
95 SPEED OFFSET(6) NUMBITS(2) [],
97 DSE OFFSET(3) NUMBITS(3) [],
99 SRE OFFSET(0) NUMBITS(1) []
101 ],
102
103 SW_PAD_CTL_PAD_WAKEUP [
104 HYS OFFSET(16) NUMBITS(1) [],
106 PUS OFFSET(14) NUMBITS(2) [],
108 PUE OFFSET(13) NUMBITS(1) [],
110 PKE OFFSET(12) NUMBITS(1) [],
112 ODE OFFSET(11) NUMBITS(1) [],
114 SPEED OFFSET(6) NUMBITS(2) [],
116 DSE OFFSET(3) NUMBITS(3) [],
118 SRE OFFSET(0) NUMBITS(1) []
120 ],
121
122 SW_PAD_CTL_PAD_PMIC_ON_REQ [
123 HYS OFFSET(16) NUMBITS(1) [],
125 PUS OFFSET(14) NUMBITS(2) [],
127 PUE OFFSET(13) NUMBITS(1) [],
129 PKE OFFSET(12) NUMBITS(1) [],
131 ODE OFFSET(11) NUMBITS(1) [],
133 SPEED OFFSET(6) NUMBITS(2) [],
135 DSE OFFSET(3) NUMBITS(3) [],
137 SRE OFFSET(0) NUMBITS(1) []
139 ],
140
141 SW_PAD_CTL_PAD_PMIC_STBY_REQ [
142 HYS OFFSET(16) NUMBITS(1) [],
144 PUS OFFSET(14) NUMBITS(2) [],
146 PUE OFFSET(13) NUMBITS(1) [],
148 PKE OFFSET(12) NUMBITS(1) [],
150 ODE OFFSET(11) NUMBITS(1) [],
152 SPEED OFFSET(6) NUMBITS(2) [],
154 DSE OFFSET(3) NUMBITS(3) [],
156 SRE OFFSET(0) NUMBITS(1) []
158 ]
159
160];
161
162const IOMUXC_SNVS_BASE: StaticRef<IomuxcSnvsRegisters> =
163 unsafe { StaticRef::new(0x400A8000 as *const IomuxcSnvsRegisters) };
164
165pub struct IomuxcSnvs {
166 registers: StaticRef<IomuxcSnvsRegisters>,
167}
168
169impl IomuxcSnvs {
170 pub const fn new() -> IomuxcSnvs {
171 IomuxcSnvs {
172 registers: IOMUXC_SNVS_BASE,
173 }
174 }
175
176 pub fn is_enabled_sw_mux_ctl_pad_gpio_mode(&self, pin: usize) -> bool {
177 match pin {
178 0 => self
179 .registers
180 .sw_mux_ctl_pad_wakeup
181 .is_set(SW_MUX_CTL_PAD_WAKEUP::MUX_MODE),
182 1 => self
183 .registers
184 .sw_mux_ctl_pad_pmic_on_req
185 .is_set(SW_MUX_CTL_PAD_PMIC_ON_REQ::MUX_MODE),
186 2 => self
187 .registers
188 .sw_mux_ctl_pad_pmic_stby_req
189 .is_set(SW_MUX_CTL_PAD_PMIC_STBY_REQ::MUX_MODE),
190 _ => false,
191 }
192 }
193
194 pub fn enable_sw_mux_ctl_pad_gpio(&self, mode: MuxMode, sion: Sion, pin: usize) {
195 match pin {
196 0 => {
197 self.registers.sw_mux_ctl_pad_wakeup.modify(
198 SW_MUX_CTL_PAD_WAKEUP::MUX_MODE.val(mode as u32)
199 + SW_MUX_CTL_PAD_WAKEUP::SION.val(sion as u32),
200 );
201 }
202 1 => {
203 self.registers.sw_mux_ctl_pad_pmic_on_req.modify(
204 SW_MUX_CTL_PAD_PMIC_ON_REQ::MUX_MODE.val(mode as u32)
205 + SW_MUX_CTL_PAD_PMIC_ON_REQ::SION.val(sion as u32),
206 );
207 }
208 2 => {
209 self.registers.sw_mux_ctl_pad_pmic_stby_req.modify(
210 SW_MUX_CTL_PAD_PMIC_STBY_REQ::MUX_MODE.val(mode as u32)
211 + SW_MUX_CTL_PAD_PMIC_STBY_REQ::SION.val(sion as u32),
212 );
213 }
214 _ => {}
215 }
216 }
217
218 pub fn disable_sw_mux_ctl_pad_gpio(&self, pin: usize) {
219 match pin {
220 0 => {
221 self.registers.sw_mux_ctl_pad_wakeup.modify(
222 SW_MUX_CTL_PAD_WAKEUP::MUX_MODE::CLEAR + SW_MUX_CTL_PAD_WAKEUP::SION::CLEAR,
223 );
224 }
225 1 => {
226 self.registers.sw_mux_ctl_pad_pmic_on_req.modify(
227 SW_MUX_CTL_PAD_PMIC_ON_REQ::MUX_MODE::CLEAR
228 + SW_MUX_CTL_PAD_PMIC_ON_REQ::SION::CLEAR,
229 );
230 }
231 2 => {
232 self.registers.sw_mux_ctl_pad_pmic_stby_req.modify(
233 SW_MUX_CTL_PAD_PMIC_STBY_REQ::MUX_MODE::CLEAR
234 + SW_MUX_CTL_PAD_PMIC_STBY_REQ::SION::CLEAR,
235 );
236 }
237 _ => {}
238 }
239 }
240
241 pub fn configure_sw_pad_ctl_pad_gpio(
242 &self,
243 pin: usize,
244 pus: PullUpDown,
245 pke: PullKeepEn,
246 ode: OpenDrainEn,
247 speed: Speed,
248 dse: DriveStrength,
249 ) {
250 match pin {
251 0 => {
252 self.registers.sw_pad_ctl_pad_wakeup.modify(
253 SW_PAD_CTL_PAD_WAKEUP::PUS.val(pus as u32)
254 + SW_PAD_CTL_PAD_WAKEUP::PKE.val(pke as u32)
255 + SW_PAD_CTL_PAD_WAKEUP::ODE.val(ode as u32)
256 + SW_PAD_CTL_PAD_WAKEUP::SPEED.val(speed as u32)
257 + SW_PAD_CTL_PAD_WAKEUP::DSE.val(dse as u32),
258 );
259 }
260 1 => {
261 self.registers.sw_pad_ctl_pad_pmic_on_req.modify(
262 SW_PAD_CTL_PAD_PMIC_ON_REQ::PUS.val(pus as u32)
263 + SW_PAD_CTL_PAD_PMIC_ON_REQ::PKE.val(pke as u32)
264 + SW_PAD_CTL_PAD_PMIC_ON_REQ::ODE.val(ode as u32)
265 + SW_PAD_CTL_PAD_PMIC_ON_REQ::SPEED.val(speed as u32)
266 + SW_PAD_CTL_PAD_PMIC_ON_REQ::DSE.val(dse as u32),
267 );
268 }
269 2 => {
270 self.registers.sw_pad_ctl_pad_pmic_stby_req.modify(
271 SW_PAD_CTL_PAD_PMIC_STBY_REQ::PUS.val(pus as u32)
272 + SW_PAD_CTL_PAD_PMIC_STBY_REQ::PKE.val(pke as u32)
273 + SW_PAD_CTL_PAD_PMIC_STBY_REQ::ODE.val(ode as u32)
274 + SW_PAD_CTL_PAD_PMIC_STBY_REQ::SPEED.val(speed as u32)
275 + SW_PAD_CTL_PAD_PMIC_STBY_REQ::DSE.val(dse as u32),
276 );
277 }
278 _ => {}
279 }
280 }
281}