1 /*
2  * SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 // The LL layer for ESP32-H2 MODEM SYSCON register operations
8 
9 #pragma once
10 
11 #include <stdlib.h>
12 #include "soc/soc.h"
13 #include "hal/assert.h"
14 #include "modem/modem_syscon_struct.h"
15 #include "hal/modem_clock_types.h"
16 
17 #ifdef __cplusplus
18 extern "C" {
19 #endif
20 
21 __attribute__((always_inline))
modem_syscon_ll_enable_test_clk(modem_syscon_dev_t * hw,bool en)22 static inline void modem_syscon_ll_enable_test_clk(modem_syscon_dev_t *hw, bool en)
23 {
24     hw->test_conf.clk_en = en;
25 }
26 
27 
28 __attribute__((always_inline))
modem_syscon_ll_enable_data_dump_mux_clock(modem_syscon_dev_t * hw,bool en)29 static inline void modem_syscon_ll_enable_data_dump_mux_clock(modem_syscon_dev_t *hw, bool en)
30 {
31     // ESP32H2 Not Support
32 }
33 
34 __attribute__((always_inline))
modem_syscon_ll_enable_etm_clock(modem_syscon_dev_t * hw,bool en)35 static inline void modem_syscon_ll_enable_etm_clock(modem_syscon_dev_t *hw, bool en)
36 {
37     hw->clk_conf.clk_etm_en = en;
38 }
39 
40 __attribute__((always_inline))
modem_syscon_ll_enable_ieee802154_apb_clock(modem_syscon_dev_t * hw,bool en)41 static inline void modem_syscon_ll_enable_ieee802154_apb_clock(modem_syscon_dev_t *hw, bool en)
42 {
43     hw->clk_conf.clk_zb_apb_en = en;
44 }
45 
46 __attribute__((always_inline))
modem_syscon_ll_enable_ieee802154_mac_clock(modem_syscon_dev_t * hw,bool en)47 static inline void modem_syscon_ll_enable_ieee802154_mac_clock(modem_syscon_dev_t *hw, bool en)
48 {
49     hw->clk_conf.clk_zb_mac_en = en;
50 }
51 
52 __attribute__((always_inline))
modem_syscon_ll_enable_modem_sec_clock(modem_syscon_dev_t * hw,bool en)53 static inline void modem_syscon_ll_enable_modem_sec_clock(modem_syscon_dev_t *hw, bool en)
54 {
55     hw->clk_conf.clk_modem_sec_en = en;
56     hw->clk_conf.clk_modem_sec_ecb_en = en;
57     hw->clk_conf.clk_modem_sec_ccm_en = en;
58     hw->clk_conf.clk_modem_sec_bah_en = en;
59     hw->clk_conf.clk_modem_sec_apb_en = en;
60 }
61 
62 __attribute__((always_inline))
modem_syscon_ll_enable_ble_timer_apb(modem_syscon_dev_t * hw,bool en)63 static inline void modem_syscon_ll_enable_ble_timer_apb(modem_syscon_dev_t *hw, bool en)
64 {
65     hw->clk_conf.clk_ble_timer_apb_en = en;
66 }
67 
68 __attribute__((always_inline))
modem_syscon_ll_enable_ble_timer_clock(modem_syscon_dev_t * hw,bool en)69 static inline void modem_syscon_ll_enable_ble_timer_clock(modem_syscon_dev_t *hw, bool en)
70 {
71     hw->clk_conf.clk_ble_timer_en = en;
72 }
73 
74 __attribute__((always_inline))
modem_syscon_ll_enable_data_dump_clock(modem_syscon_dev_t * hw,bool en)75 static inline void modem_syscon_ll_enable_data_dump_clock(modem_syscon_dev_t *hw, bool en)
76 {
77     hw->clk_conf.clk_data_dump_en = en;
78 }
79 
80 __attribute__((always_inline))
modem_syscon_ll_enable_etm_force_clock(modem_syscon_dev_t * hw)81 static inline void modem_syscon_ll_enable_etm_force_clock(modem_syscon_dev_t *hw)
82 {
83     hw->clk_conf_force_on.clk_etm_fo = 1;
84 }
85 
86 __attribute__((always_inline))
modem_syscon_ll_enable_modem_sec_force_clock(modem_syscon_dev_t * hw)87 static inline void modem_syscon_ll_enable_modem_sec_force_clock(modem_syscon_dev_t *hw)
88 {
89     hw->clk_conf_force_on.clk_modem_sec_fo = 1;
90 }
91 
92 __attribute__((always_inline))
modem_syscon_ll_enable_ble_timer_force_clock(modem_syscon_dev_t * hw)93 static inline void modem_syscon_ll_enable_ble_timer_force_clock(modem_syscon_dev_t *hw)
94 {
95     hw->clk_conf_force_on.clk_ble_timer_fo = 1;
96 }
97 
98 __attribute__((always_inline))
modem_syscon_ll_enable_data_dump_force_clock(modem_syscon_dev_t * hw)99 static inline void modem_syscon_ll_enable_data_dump_force_clock(modem_syscon_dev_t *hw)
100 {
101     hw->clk_conf_force_on.clk_data_dump_fo = 1;
102 }
103 
104 __attribute__((always_inline))
modem_syscon_ll_reset_fe(modem_syscon_dev_t * hw)105 static inline void modem_syscon_ll_reset_fe(modem_syscon_dev_t *hw)
106 {
107     hw->modem_rst_conf.rst_fe = 1;
108     hw->modem_rst_conf.rst_fe = 0;
109 }
110 
111 __attribute__((always_inline))
modem_syscon_ll_reset_btmac_apb(modem_syscon_dev_t * hw)112 static inline void modem_syscon_ll_reset_btmac_apb(modem_syscon_dev_t *hw)
113 {
114     hw->modem_rst_conf.rst_btmac_apb = 1;
115     hw->modem_rst_conf.rst_btmac_apb = 0;
116 }
117 
118 __attribute__((always_inline))
modem_syscon_ll_reset_btmac(modem_syscon_dev_t * hw)119 static inline void modem_syscon_ll_reset_btmac(modem_syscon_dev_t *hw)
120 {
121     hw->modem_rst_conf.rst_btmac = 1;
122     hw->modem_rst_conf.rst_btmac = 0;
123 }
124 
125 __attribute__((always_inline))
modem_syscon_ll_reset_btbb_apb(modem_syscon_dev_t * hw)126 static inline void modem_syscon_ll_reset_btbb_apb(modem_syscon_dev_t *hw)
127 {
128     hw->modem_rst_conf.rst_btbb_apb = 1;
129     hw->modem_rst_conf.rst_btbb_apb = 0;
130 }
131 
132 __attribute__((always_inline))
modem_syscon_ll_reset_btbb(modem_syscon_dev_t * hw)133 static inline void modem_syscon_ll_reset_btbb(modem_syscon_dev_t *hw)
134 {
135     hw->modem_rst_conf.rst_btbb = 1;
136     hw->modem_rst_conf.rst_btbb = 0;
137 }
138 
139 __attribute__((always_inline))
modem_syscon_ll_reset_etm(modem_syscon_dev_t * hw)140 static inline void modem_syscon_ll_reset_etm(modem_syscon_dev_t *hw)
141 {
142     hw->modem_rst_conf.rst_etm = 1;
143     hw->modem_rst_conf.rst_etm = 0;
144 }
145 
146 __attribute__((always_inline))
modem_syscon_ll_reset_zbmac(modem_syscon_dev_t * hw)147 static inline void modem_syscon_ll_reset_zbmac(modem_syscon_dev_t *hw)
148 {
149     hw->modem_rst_conf.rst_zbmac = 1;
150     hw->modem_rst_conf.rst_zbmac = 0;
151 }
152 
153 __attribute__((always_inline))
modem_syscon_ll_reset_modem_sec(modem_syscon_dev_t * hw)154 static inline void modem_syscon_ll_reset_modem_sec(modem_syscon_dev_t *hw)
155 {
156     hw->modem_rst_conf.rst_modem_ecb = 1;
157     hw->modem_rst_conf.rst_modem_ccm = 1;
158     hw->modem_rst_conf.rst_modem_bah = 1;
159     hw->modem_rst_conf.rst_modem_sec = 1;
160     hw->modem_rst_conf.rst_modem_ecb = 0;
161     hw->modem_rst_conf.rst_modem_ccm = 0;
162     hw->modem_rst_conf.rst_modem_bah = 0;
163     hw->modem_rst_conf.rst_modem_sec = 0;
164 }
165 
166 __attribute__((always_inline))
modem_syscon_ll_reset_ble_timer(modem_syscon_dev_t * hw)167 static inline void modem_syscon_ll_reset_ble_timer(modem_syscon_dev_t *hw)
168 {
169     hw->modem_rst_conf.rst_ble_timer = 1;
170     hw->modem_rst_conf.rst_ble_timer = 0;
171 }
172 
173 __attribute__((always_inline))
modem_syscon_ll_reset_data_dump(modem_syscon_dev_t * hw)174 static inline void modem_syscon_ll_reset_data_dump(modem_syscon_dev_t *hw)
175 {
176     hw->modem_rst_conf.rst_data_dump = 1;
177     hw->modem_rst_conf.rst_data_dump = 0;
178 }
179 
180 __attribute__((always_inline))
modem_syscon_ll_reset_all(modem_syscon_dev_t * hw)181 static inline void modem_syscon_ll_reset_all(modem_syscon_dev_t *hw)
182 {
183     hw->modem_rst_conf.val = 0xffffffff;
184     hw->modem_rst_conf.val = 0;
185 }
186 
187 
188 __attribute__((always_inline))
modem_syscon_ll_clk_conf1_configure(modem_syscon_dev_t * hw,bool en,uint32_t mask)189 static inline void modem_syscon_ll_clk_conf1_configure(modem_syscon_dev_t *hw, bool en, uint32_t mask)
190 {
191     if(en){
192         hw->clk_conf1.val = hw->clk_conf1.val | mask;
193     } else {
194         hw->clk_conf1.val = hw->clk_conf1.val & ~mask;
195     }
196 }
197 
198 __attribute__((always_inline))
modem_syscon_ll_enable_fe_16m_clock(modem_syscon_dev_t * hw,bool en)199 static inline void modem_syscon_ll_enable_fe_16m_clock(modem_syscon_dev_t *hw, bool en)
200 {
201     hw->clk_conf1.clk_fe_16m_en = en;
202 }
203 
204 __attribute__((always_inline))
modem_syscon_ll_enable_fe_32m_clock(modem_syscon_dev_t * hw,bool en)205 static inline void modem_syscon_ll_enable_fe_32m_clock(modem_syscon_dev_t *hw, bool en)
206 {
207     hw->clk_conf1.clk_fe_32m_en = en;
208 }
209 
210 
211 __attribute__((always_inline))
modem_syscon_ll_enable_fe_sdm_clock(modem_syscon_dev_t * hw,bool en)212 static inline void modem_syscon_ll_enable_fe_sdm_clock(modem_syscon_dev_t *hw, bool en)
213 {
214     hw->clk_conf1.clk_fe_sdm_en = en;
215 }
216 
217 __attribute__((always_inline))
modem_syscon_ll_enable_fe_adc_clock(modem_syscon_dev_t * hw,bool en)218 static inline void modem_syscon_ll_enable_fe_adc_clock(modem_syscon_dev_t *hw, bool en)
219 {
220     hw->clk_conf1.clk_fe_adc_en = en;
221 }
222 
223 __attribute__((always_inline))
modem_syscon_ll_enable_fe_apb_clock(modem_syscon_dev_t * hw,bool en)224 static inline void modem_syscon_ll_enable_fe_apb_clock(modem_syscon_dev_t *hw, bool en)
225 {
226     hw->clk_conf1.clk_fe_apb_en = en;
227 }
228 
229 __attribute__((always_inline))
modem_syscon_ll_enable_bt_apb_clock(modem_syscon_dev_t * hw,bool en)230 static inline void modem_syscon_ll_enable_bt_apb_clock(modem_syscon_dev_t *hw, bool en)
231 {
232     hw->clk_conf1.clk_bt_apb_en = en;
233 }
234 
235 __attribute__((always_inline))
modem_syscon_ll_enable_bt_clock(modem_syscon_dev_t * hw,bool en)236 static inline void modem_syscon_ll_enable_bt_clock(modem_syscon_dev_t *hw, bool en)
237 {
238     hw->clk_conf1.clk_bt_en = en;
239 }
240 
241 __attribute__((always_inline))
modem_syscon_ll_enable_fe_force_clock(modem_syscon_dev_t * hw,bool en)242 static inline void modem_syscon_ll_enable_fe_force_clock(modem_syscon_dev_t *hw, bool en)
243 {
244     hw->clk_conf1_force_on.clk_fe_fo = en;
245 }
246 
247 __attribute__((always_inline))
modem_syscon_ll_enable_bt_force_clock(modem_syscon_dev_t * hw,bool en)248 static inline void modem_syscon_ll_enable_bt_force_clock(modem_syscon_dev_t *hw, bool en)
249 {
250     hw->clk_conf1_force_on.clk_bt_fo = en;
251 }
252 
253 __attribute__((always_inline))
modem_syscon_ll_get_date(modem_syscon_dev_t * hw)254 static inline uint32_t modem_syscon_ll_get_date(modem_syscon_dev_t *hw)
255 {
256     return hw->date.val;
257 }
258 
259 #ifdef __cplusplus
260 }
261 #endif
262