1 /*******************************************************************************
2 * @file  rsi_ipmu.h
3  *******************************************************************************
4  * # License
5  * <b>Copyright 2024 Silicon Laboratories Inc. www.silabs.com</b>
6  *******************************************************************************
7  *
8  * SPDX-License-Identifier: Zlib
9  *
10  * The licensor of this software is Silicon Laboratories Inc.
11  *
12  * This software is provided 'as-is', without any express or implied
13  * warranty. In no event will the authors be held liable for any damages
14  * arising from the use of this software.
15  *
16  * Permission is granted to anyone to use this software for any purpose,
17  * including commercial applications, and to alter it and redistribute it
18  * freely, subject to the following restrictions:
19  *
20  * 1. The origin of this software must not be misrepresented; you must not
21  *    claim that you wrote the original software. If you use this software
22  *    in a product, an acknowledgment in the product documentation would be
23  *    appreciated but is not required.
24  * 2. Altered source versions must be plainly marked as such, and must not be
25  *    misrepresented as being the original software.
26  * 3. This notice may not be removed or altered from any source distribution.
27  *
28  ******************************************************************************/
29 
30 /**
31  * Includes
32  */
33 #ifndef __RSI_IPMU_H__
34 #define __RSI_IPMU_H__
35 
36 #ifdef __cplusplus
37 extern "C" {
38 #endif
39 
40 #define AT_EFUSE_DATA_1P19
41 #include "rsi_ccp_common.h"
42 #include "rsi_error.h"
43 
44 /******************************************************
45    * *                      Macros
46    * ******************************************************/
47 #define RET_LDO_VOL_DECREASE     1
48 #define RET_LDO_TRIM_VALUE_CHECK 2
49 
50 #define REG_GSPI_BASE           0x24050000
51 #define NPSS_BASE_ADDR          0x24048000
52 #define NPSS_NWP_BASE_ADDR      0x41300000
53 #define MCURET_BOOTSTATUS       (volatile uint32_t *)(NPSS_BASE_ADDR + 0x604)
54 #define MCU_BBFF_STORAGE1_ADDR  (volatile uint32_t *)(NPSS_NWP_BASE_ADDR + 0x580)
55 #define TA_MANF_DATA_BASE_ADDR  0x04000000
56 #define MCU_MANF_DATA_BASE_ADDR 0x08000000
57 #define TA_FLASH                1
58 
59 /*IPMU power gates */
60 #define CMP_NPSS_PG_ENB                  BIT(16) /*Power gate enable for BOD CORE*/
61 #define ULP_ANG_CLKS_PG_ENB              BIT(15) /*Power gate enable for CLKS CORE*/
62 #define ULP_ANG_PWRSUPPLY_PG_ENB         BIT(14) /*Power gate enable for BG SPI*/
63 #define WURX_PG_ENB                      BIT(13) /*Power gate enable for WURX*/
64 #define WURX_CORR_PG_ENB                 BIT(12) /*Power gate enable for WURX CORRELATION BLOCK*/
65 #define AUXADC_PG_ENB                    BIT(11) /*Power gate enable for AUXADC*/
66 #define AUXADC_BYPASS_ISO_GEN            BIT(10) /*power gate bypass for AUXADC*/
67 #define AUXADC_ISOLATION_ENABLE          BIT(9)  /*power gate isolation for AUXADC*/
68 #define AUXDAC_PG_ENB                    BIT(8)  /*Power gate enable for AUXDAC*/
69 #define AUXDAC_BYPASS_ISO_GEN            BIT(7)  /*power gate bypass for AUXDAC*/
70 #define AUXDAC_ISOLATION_ENABLE          BIT(6)  /*power gate isolation for AUXDAC*/
71 #define AUX_SUPPLY_ISOLATION_ENABLE      BIT(5)  /*Given to analog peripherals indicating the supply state*/
72 #define PMU_ANA_BYPASS_PWRGATE_EN_N      BIT(4)  /*To ON or OFF analog blocks in PMU when pwr manager is bypassed*/
73 #define PMU_SPI_BYPASS_ISO_GEN           BIT(3)  /*Bypass power manager for PMU_SPI*/
74 #define PMU_SPI_ISOLATION_ENABLE         BIT(2)  /*Bypass isoaltion enable signal for PMU_SPI isoaltion cells*/
75 #define PMU_BUCK_BYPASS_ISO_GEN          BIT(1)  /*Bypass power  manager for PMU BUCK*/
76 #define PMU_BUCK_BYPASS_ISOLATION_ENABLE BIT(0)  /*Bypass isoaltion enable signal for PMU_BUCK isoaltion cells*/
77 
78 /*IPMU configuration defines*/
79 #define LATCH_TOP_SPI        BIT(4)
80 #define LATCH_TRANSPARENT_HF BIT(3)
81 #define LATCH_TRANSPARENT_LF BIT(2)
82 
83 /*BG_SCDC_PROG_REG_1 defines*/
84 #define REF_SEL_LP_DCDC 0xFFFFFC7F
85 
86 /*Registers */
87 #define BG_SCDC_PROG_REG_1 0x127
88 #define SELECT_BG_CLK      0x144
89 #define BG_SCDC_PROG_REG_2 0x128
90 //#define WURX_CORR_CALIB_REG  0x088
91 #define POWERGATE_REG_WRITE 0x142
92 //#define ULPCLKS_REFCLK_REG   0x106
93 //#define WURX_CORR_CALIB_REG  0x088
94 
95 #define GSPI_CTRL_REG1 *(volatile uint32_t *)(REG_GSPI_BASE + 0x02)
96 #define SPI_ACTIVE     BIT(8)
97 
98 #define POSITION_BITS_MASK 0x1F
99 #define LSB_POSITION       22
100 #define MSB_POSITION       27
101 #define MAX_BIT_LEN        22
102 
103 #define ULPCLKS_32KRC_CLK_REG_ADDR 0x103
104 
105 #define ENABLE_CALIB_DOMAIN          0x005200
106 #define SELECT_RO_CALIB              0x002310
107 #define TRIM_VALUE_BITS              0x0003f800
108 #define MASK_TRIM_VALUE_WRITE_BITS   0x1FC000
109 #define ULPCLKS_TRIM_SEL_REG_DEFAULT 0x005a14
110 
111 #define MAX_RESP_BUF_FOR_IAP 3
112 
113 #define BASE_OFFSET_BB_RF_IN_FLASH 424
114 
115 #define PMU_SPI_BASE_ADDR 0x24050000
116 
117 //! PMU
118 #define PMU_SPI_DIRECT_ACCESS(_x) *(volatile uint32_t *)(PMU_SPI_BASE_ADDR + 0x8000 + ((_x) << 2))
119 //! IPMU
120 #define PMU_DIRECT_ACCESS(_x) *(volatile uint32_t *)(PMU_SPI_BASE_ADDR + 0xA000 + ((_x) << 2))
121 #define PMU_SPI               1
122 
123 #define RC_CLK_MODE 1
124 
125 #define XTAL_SEL 1
126 
127 #define TS_SLOPE_SET_OFFSET         0x04
128 #define PMU_1P3_CTRL_REG_OFFSET     0x1D0
129 #define PMU_PFM_REG_OFFSET          0x1D1
130 #define PMU_ADC_REG_OFFSET          0x1D2
131 #define PMU_PID_REG1_OFFSET         0x1D3
132 #define PMU_PTAT_REG_OFFSET         0x1D5
133 #define PMU_LDO_REG_OFFSET          0x1D6
134 #define PMU_PWRTRAIN_REG_OFFSET     0x1D8
135 #define PMU_TESTMUX_REG1_OFFSET     0x1D9
136 #define PMU_TEST_MODES_OFFSET       0x1DA
137 #define SPARE_REG_1_OFFSET          0x1DC
138 #define SPARE_REG_2_OFFSET          0x1DD
139 #define BYPASS_CURR_CTRL_REG_OFFSET 0x1DE
140 #define SPARE_REG_3_OFFSET          0x1DF
141 
142 #ifdef CHIP_9118
143 //FLASH OFFSET
144 #define __CALIB_DATA_OFFSET_          1024
145 #define IPMU_VALUES_OFFSET            (__CALIB_DATA_OFFSET_ + 168)
146 #define DUAL_FLASH_IPMU_VALUES_OFFSET MCU_MANF_DATA_BASE_ADDR
147 #endif
148 
149 #if defined(SLI_SI917) || defined(SLI_SI915)
150 #if (((defined SLI_SI917 || defined SLI_SI915) && (defined SLI_SI917B0 || defined SLI_SI915)) \
151      || (defined CHIP_917_6x6 && (defined SLI_SI917B0 || defined SLI_SI915)))
152 #ifdef SLI_SI91X_MCU_4MB_LITE_IMAGE
153 #define PACKAGE_TYPE_VALUES_OFFSET_COMMON_FLASH 0x8160292
154 #define SILICON_REV_VALUES_OFFSET_COMMON_FLASH  0x8160293
155 #define COMMON_FLASH_IPMU_VALUES_OFFSET         0x8160258
156 #else
157 #define PACKAGE_TYPE_VALUES_OFFSET_COMMON_FLASH 0x81F0292
158 #define SILICON_REV_VALUES_OFFSET_COMMON_FLASH  0x81F0293
159 #define COMMON_FLASH_IPMU_VALUES_OFFSET         0x81F0258
160 #endif
161 #define PACKAGE_TYPE_VALUES_OFFSET_DUAL_FLASH 0x800059B
162 #define SILICON_REV_VALUES_OFFSET_DUAL_FLASH  0x800059C
163 #define DUAL_FLASH_IPMU_VALUES_OFFSET         0x8000561
164 #endif
165 #if ((defined SLI_SI917) && (!(defined SLI_SI917B0)))
166 #define PACKAGE_TYPE_VALUES_OFFSET_COMMON_FLASH 0x82001DE
167 #define SILICON_REV_VALUES_OFFSET_COMMON_FLASH  0x82001DF
168 #define COMMON_FLASH_IPMU_VALUES_OFFSET         0x82001A4
169 #define COMMON_FLASH_IPMU_VALUES                ((efuse_ipmu_t *)(COMMON_FLASH_IPMU_VALUES_OFFSET))
170 
171 #define PACKAGE_TYPE_VALUES_OFFSET_DUAL_FLASH 0x80004E0
172 #define SILICON_REV_VALUES_OFFSET_DUAL_FLASH  0x80004E1
173 #define DUAL_FLASH_IPMU_VALUES_OFFSET         0x80004A6
174 #define DUAL_FLASH_IPMU_VALUES                ((efuse_ipmu_t *)(DUAL_FLASH_IPMU_VALUES_OFFSET))
175 #endif
176 #define IPMU_VALUES_OFFSET 0
177 #endif
178 #define HP_LDO_MODE 1
179 #define SCDC_MODE   0
180 #ifdef ENABLE_1P8V
181 #define IPMU_MODE_VALUE HP_LDO_MODE
182 #else
183 #define IPMU_MODE_VALUE SCDC_MODE
184 #endif
185 
186 #ifdef SLI_SI91X_MCU_COMMON_FLASH_MODE
187 #define MANF_DATA_BASE_ADDR COMMON_FLASH_IPMU_VALUES_OFFSET
188 #else
189 #define MANF_DATA_BASE_ADDR DUAL_FLASH_IPMU_VALUES_OFFSET
190 #endif
191 
192 /* After changes */
193 #define MAGIC_WORD 0x5a
194 
195 #define NWP_AHB_ADDR               0x41300000
196 #define ULP_TASS_MISC_CONFIG_REG   0x24041400
197 #define AUX_BASE_ADDR              0x24043800
198 #define TEMP_SENSOR_BASE_ADDRESS   0x24048500
199 #define TS_NOMINAL_SETTINGS_OFFSET 0x08
200 #define DIRECT                     2
201 
202 #define MASK_BITS(A, B)                 (((1U << A) - 1) << B)
203 #define ULP_SPI                         0
204 #define ULPCLKS_DOUBLER_XTAL_REG_OFFSET 0x101
205 #define ULPCLKS_32KRO_CLK_REG_OFFSET    0x102
206 #define ULPCLKS_32KRC_CLK_REG_OFFSET    0x103
207 #define ULPCLKS_MRC_CLK_REG_OFFSET      0x104
208 #define ULPCLKS_HF_RO_CLK_REG_OFFSET    0x105
209 #define ULPCLKS_REFCLK_REG_ADDR         0x106
210 #define ULPCLKS_TRIM_SEL_REG_ADDR       0x107
211 #define ULPCLKS_CALIB_REG_ADDR          0x10A
212 #define ULPCLKS_CALIB_REF_REG           0x10B
213 #define ULPCLKS_CALIB_DONE_REG_ADDR     0x10C
214 #define ULPCLKS_32KXTAL_CLK_REG_OFFSET  0x10E
215 #define BG_SCDC_PROG_REG_1_OFFSET       0x127
216 #define iPMU_SPARE_REG1_OFFSET          0x140
217 #if defined(SLI_SI917) || defined(SLI_SI915)
218 #define BG_SCDC_PROG_REG_3_ADDR 0x12B
219 #endif
220 
221 #define HF_RC_CLK_MODE               1
222 #define MCU_PWR_CTRL_BASE_ADDR       0x24048400
223 #define MCU_PMU_LDO_CTRL_CLEAR_REG_1 *(volatile uint32 *)(MCU_PWR_CTRL_BASE_ADDR + 0x6C)
224 #define TEMP_SENSOR_BASE_ADDRESS     0x24048500
225 #define MCU_FSM_BASE_ADDRESS         0x24048100
226 
227 //! ULP SPI (0x2405A000)
228 #define ULPCLKS_ADAPTIVE_REG_OFFSET         0x100
229 #define ULPCLKS_DOUBLER_XTAL_REG_OFFSET     0x101
230 #define ULPCLKS_32KRO_CLK_REG_OFFSET        0x102
231 #define ULPCLKS_32KRC_CLK_REG_OFFSET        0x103
232 #define ULPCLKS_MRC_CLK_REG_OFFSET          0x104
233 #define ULPCLKS_HF_RO_CLK_REG_OFFSET        0x105
234 #define ULPCLKS_REF_CLK_REG_OFFSET          0x106
235 #define ULPCLKS_TRIM_SEL_REG_OFFSET         0x107
236 #define ULPCLKS_32KXTAL_CLK_REG_OFFSET      0x10E
237 #define BG_SLEEP_TIMER_REG_OFFSET           0x125
238 #define SCDC_CTRL_REG_0_OFFSET              0x126
239 #define BG_SCDC_PROG_REG_1_OFFSET           0x127
240 #define BG_SCDC_PROG_REG_2_OFFSET           0x128
241 #define BG_LDO_REG_OFFSET                   0x129
242 #define BG_SCDC_READ_BACK_OFFSET            0x12A
243 #define BG_BLACKOUT_REG_OFFSET              0x12B
244 #define iPMU_SPARE_REG1_OFFSET              0x140
245 #define iPMU_SPARE_REG2_OFFSET              0x141
246 #define POWERGATE_REG_WRITE_OFFSET          0x142
247 #define SELECT_BG_CLK_OFFSET                0x144
248 #define BOD_TEST_PG_VBATT_STATUS_REG_OFFSET 0x1E3
249 #define POWERGATE_REG_READ_OFFSET           0x342
250 
251 //! PMU SPI (0x24058000)
252 #define PMU_1P3_CTRL_REG_OFFSET                 0x1D0
253 #define PMU_PFM_REG_OFFSET                      0x1D1
254 #define PMU_ADC_REG_OFFSET                      0x1D2
255 #define PMU_PID_REG1_OFFSET                     0x1D3
256 #define PMU_PTAT_REG_OFFSET                     0x1D5
257 #define PMU_LDO_REG_OFFSET                      0x1D6
258 #define PMU_PWRTRAIN_REG_OFFSET                 0x1D8
259 #define PMU_TESTMUX_REG1_OFFSET                 0x1D9
260 #define PMU_TEST_MODES_OFFSET                   0x1DA
261 #define SPARE_REG_1_OFFSET                      0x1DC
262 #define SPARE_REG_2_OFFSET                      0x1DD
263 #define BYPASS_CURR_CTRL_REG_OFFSET             0x1DE
264 #define SPARE_REG_3_OFFSET                      0x1DF
265 #define PMU_FREQ_MODE_REG                       0x1CE
266 #define LOW_FREQ_PWM                            BIT(2)
267 #define MCU_FSM_CLK_ENS_AND_FIRST_BOOTUP_OFFSET 0x20
268 #define MCU_FSM_PMU_STATUS_REG_OFFSET           0x40
269 
270 //! NWP_PMU_CTRLS  defines
271 #define scdcdc_lp_mode_en BIT(0)
272 #define bgpmu_sleep_en    BIT(1)
273 #define standby_dc1p3     BIT(19)
274 
275 #define MCU_AON_BASE_ADDR    0x24048000
276 #define MCU_FSM_PMU_CTRL     *(volatile uint32 *)(MCU_AON_BASE_ADDR + 0x140)
277 #define MCUAON_GEN_CTRLS_REG *(volatile uint32 *)(MCU_AON_BASE_ADDR + 0x14)
278 #define MCUAON_SHELF_MODE    *(volatile uint32 *)(MCU_AON_BASE_ADDR + 0x10)
279 
280 //! MCUAON_GEN_CTRLS register defines
281 #define NPSS_SUPPLY_0P9_BIT BIT(17)
282 #define ENABLE_PDO_BIT      BIT(16)
283 
284 #define NWP_AHB_ADDR             0x41300000
285 #define ULP_DIRECT_ACCESS(_x)    *(uint32 *)(NWP_AHB_ADDR + (_x))
286 #define NWPAON_POR_CTRL_BITS_REG 0x3C
287 #define NWP_FSM_FIRST_BOOTUP     0x0120
288 
289 //! NWP_FSM_FIRST_BOOTUP  defines
290 #define nwp_ulp_32khz_xtal_clk_en     BIT(18)
291 #define nwp_ulp_mhz_rc_clk_en         BIT(19)
292 #define nwp_ulp_20mhz_ring_osc_clk_en BIT(20)
293 #define nwp_ulp_doubler_clk_en        BIT(21)
294 
295 #define TASS_PWR_CTRL_BASE_ADDR 0x41300400
296 #define TASS_FSM_CTRL_BYPASS    *(volatile uint32 *)(TASS_PWR_CTRL_BASE_ADDR + 0x1C)
297 //! TASS_FSM_CTRL_BYPASS defines
298 #define ta_xtal_en_40MHz_bypass_cntrl     BIT(0)
299 #define ta_xtal_en_40MHz_bypass           BIT(1)
300 #define ta_pmu_shut_down_bypass_cntrl     BIT(2)
301 #define ta_pmu_shut_down_bypass           BIT(3)
302 #define ta_buck_boost_enable_bypass_cntrl BIT(4)
303 #define ta_buck_boost_enable_bypass       BIT(5)
304 
305 //! ULPCLKS_ADAPTIVE_REG defines
306 #define adapt_powergate_en BIT(3)
307 
308 //! ULPCLKS_DOUBLER_XTAL_REG defines
309 #define doubler_en BIT(21)
310 
311 //! ULPCLKS_32MRC_CLK_REG defines
312 #define rc_mhz_en BIT(21)
313 
314 //! ULPCLKS_HF_RO_CLK_REG defines
315 #define ro_hf_en BIT(21)
316 
317 //! ULPCLKS_TRIM_SEL_REG defines
318 #define calib_powergate_en BIT(9)
319 
320 //! ULPCLKS_32KXTAL_CLK_REG defines
321 #define xtal_32khz_en BIT(21)
322 
323 #define pass_clk_40m_buffer_enable BIT(15)
324 
325 //! iPMU_SPARE_REG2 defines
326 #define wurx_lvl_shift_en BIT(20)
327 #define wurx_pg_en_1      BIT(21)
328 
329 //! POWERGATE_REG_WRITE defines
330 #define auxdac_pg_enb            BIT(8)
331 #define auxadc_pg_enb            BIT(11)
332 #define wurx_corr_pg_enb         BIT(12)
333 #define wurx_pg_enb              BIT(13)
334 #define ulp_ang_pwrsupply_pg_enb BIT(14)
335 #define ulp_ang_clks_pg_enb      BIT(15)
336 #define cmp_npss_pg_enb          BIT(16)
337 
338 #define IPMU_HIGH_POWER_MODE 0
339 #define IPMU_LOW_POWER_MODE  1
340 
341 //! SELECT_BG_CLK defines
342 #define latch_transparent_lf BIT(2)
343 #define latch_transparent_hf BIT(3)
344 #define latch_top_spi        BIT(4)
345 
346 //! PMU_PFM_REG defines
347 #define ext_pfm_en1p3 BIT(17)
348 
349 //! PMU_PTAT_REG defines
350 #define test_pfm_mode1p3 BIT(4)
351 
352 //! PMU_LDO_REG defines
353 #define LDOSOC_DEFAULT_MODE_EN BIT(5)
354 
355 //! PMU_PWRTRAIN_REG defines
356 #define BYPASS_LDORF_CTRL BIT(2)
357 
358 //! BOD_TEST_PG_VBATT_STATUS_REG defines
359 #define bod_pwrgate_en_n_ulp_button_calib BIT(15)
360 
361 //! MCU_FSM_CLK_ENS_AND_FIRST_BOOTUP defines
362 #define mcu_ulp_32khz_xtal_clk_en     BIT(18)
363 #define mcu_ulp_mhz_rc_clk_en         BIT(19)
364 #define mcu_ulp_20mhz_ring_osc_clk_en BIT(20)
365 #define mcu_ulp_doubler_clk_en        BIT(21)
366 
367 //! NWPAON_POR_CTRL_BITS defines
368 #define poc_cntrl_reg_0 BIT(0)
369 
370 #define MCU_FSM_DIRECT_ACCESS(_x) *(volatile uint32 *)(MCU_FSM_BASE_ADDRESS + (_x))
371 
372 #define TEMP_SENSOR_BJT *(volatile uint32 *)(0x240439E0)
373 #define temp_sens_en    BIT(0)
374 
375 #define TS_SLOPE_SET_OFFSET        0x04
376 #define TS_NOMINAL_SETTINGS_OFFSET 0x08
377 
378 //! BG_SCDC_PROG_REG_2 defines
379 #define scdcdc_sel    BIT(21)
380 #define testmode_0_en BIT(20)
381 
382 //! SCDC_CTRL_REG_0 defines
383 #define ext_cap_en BIT(21)
384 
385 //! PMU_LDO_REG defines
386 #define LDORF_DEFAULT_MODE_EN BIT(11)
387 
388 #define LS_SHIFT      22
389 #define MS_SHIFT      27
390 #define IPMU_DATAMASK 0x3fffff
391 
392 #define mcu_dcdc_lvl    BIT(18)
393 #define mcu_soc_ldo_lvl BIT(17)
394 
395 /*32khz rc clock define  */
396 #define RC_TRIM_VALUE_LF                0x7F0
397 #define RO_TRIM_VALUE_LF                0x1F0
398 #define MASK32KRO_TRIM_VALUE_WRITE_BITS 0x1F0000
399 #define MASK32KRC_TRIM_VALUE_WRITE_BITS 0x1FC000
400 #define TRIM_MSB_MHZ                    20
401 #define TRIM_LSB_MHZ                    14
402 #define PARTICULAR_FREQ_MIN             10
403 #define PARTICULAR_FREQ_MAX             100
404 #define MIN_DIFF_FREQ                   3
405 
406 /* 64khz rc clock define */
407 #define ENABLE_32KHZ_CLOCK_TRIM      0x40F03000
408 #define NPSS_REF_CLOCK_40MSOC        0x41A48000
409 #define NUMBER_HIGH_FRQ_CLOCK        0x42C4E390
410 #define LOW_FREQ_CLOCK_CAL           0x42B24210
411 #define ORIGINAL_REF_VALUE_AFTER_CAL 0x42C9C590
412 
413 /******************************************************
414    * *                    Structures
415    * ******************************************************/
416 
417 //! This structure contains format for retention_boot_status_word_0
418 typedef struct retention_boot_status_word_s {
419 #define SDIO_USB_WITH_TA         3
420 #define SDIO_WITH_TA_USB_WITH_M4 2
421 #define SDIO_WITH_M4_USB_WITH_TA 1
422 #define SDIO_USB_WITH_M4         0
423   unsigned int m4_present : 1;
424   unsigned int m4_flash_present : 1;
425   unsigned int m4_flash_pinset : 4;
426   unsigned int m4_flash_address_width_valid : 1;
427   unsigned int m4_flash_address_width : 2;
428   unsigned int select_host_inf_with_m4_valid : 1;
429   unsigned int select_host_inf_with_m4 : 2;
430   unsigned int m4_secure_boot_enable : 1;
431   unsigned int m4_encrypt_firmware : 1;
432   unsigned int host_if_with_ta : 1;
433   unsigned int mcu_wdt_hw_timer : 1;
434 #ifdef CHIP_9118
435 #define NONE_MODE        0
436 #define NLINK            1
437 #define WISECONNECT      2
438 #define WCPLUS           3
439 #define MCU              4
440 #define WISEMCU          5
441 #define ACCELARATOR      6
442 #define WC_SIMULATANEOUS 7
443 #endif
444 #if defined(SLI_SI917) || defined(SLI_SI915)
445 //! Product modes
446 #define WISEMCU     0
447 #define WCPLUS      3
448 #define ACCELARATOR 4
449 #define WISECONNECT 6
450 #define NLINK       7
451 #define MCU         0xF // not supported
452 #endif
453   unsigned int product_mode : 4;
454   unsigned int m4_flash_type : 4;
455   unsigned int m4_dual_flash : 1;
456   unsigned int m4_csum : 1;
457   unsigned int wise_aoc_mode : 1;
458   unsigned int wise_aoc_from_m4_rom : 1;
459   unsigned int m4_image_format : 1;
460   unsigned int clean_ulp_wakeup : 1;
461 #define M4_IMAGE_VALID_IND BIT(30)
462   unsigned int m4_image_valid : 1;
463   unsigned int reserved : 1; /* one bit is reserved for hardware */
464 } retention_boot_status_word_t;
465 
466 /* This structure contains format for efuse_dword0 */
467 typedef struct npss_boot_status_word_0_s {
468   //! Data from EFUSE
469   unsigned int usb_fsel_valid : 1;
470   unsigned int mems_ref_clk_as_usb_phy_clk : 1;
471   unsigned int modem_pll_as_usb_phy_clk : 1;
472   unsigned int usb_phy_clk_fsel_external : 1;
473   unsigned int usb_fsel : 3;
474   unsigned int bypass_usb_detection : 1;
475   //! Data derived by bootloder
476   unsigned int host_sel_valid : 1;
477   unsigned int host_sel : 3;
478   unsigned int ta_flash_present : 1;
479   unsigned int ta_flash_pinset : 4;
480   unsigned int ta_flash_address_width_valid : 1;
481   unsigned int ta_flash_address_width : 2;
482   unsigned int ta_flash_type : 4;
483   unsigned int fips_enable : 1;
484   unsigned int usb_fclk_div_factor : 2;
485 #define BBFF_DATA_VALID BIT(27)
486   unsigned int bbff_data_valid : 1;
487   //! Bits configured by FW
488 #define NWP_SOFT_RESET BIT(28)
489   unsigned int soft_reset : 1;
490 #define FACTORY_RESET BIT(29)
491   unsigned int factory_reset : 1;
492 #define TAMPER_RECOVERY BIT(30)
493   unsigned int tamper_recovery : 1;
494   unsigned int reserved : 1;
495 } npss_boot_status_word0_t;
496 
497 #ifdef CHIP_9118
498 typedef struct efuse_ipmu_s {
499   unsigned int trim_0p5na1 : 1;
500   unsigned int trim_0p5na2 : 1;
501   unsigned int bg_r_vdd_ulp : 4;
502   unsigned int bg_r_ptat_vdd_ulp : 3;
503   unsigned int resbank_trim : 2;
504   unsigned int trim_sel : 7;
505   unsigned int del_2x_sel : 6;
506   unsigned int freq_trim : 5;
507   unsigned int coarse_trim_16k : 2;
508   unsigned int fine_trim_16k : 7;
509   unsigned int coarse_trim_64k : 2;
510   unsigned int fine_trim_64k : 7;
511   unsigned int coarse_trim_32k : 2;
512   unsigned int fine_trim_32k : 7;
513   unsigned int xtal1_trim_32k : 4;
514   unsigned int xtal2_trim_32k : 4;
515   unsigned int trim_ring_osc : 7;
516   unsigned int vbatt_status_1 : 6;
517   unsigned int str_temp_slope : 10;
518   unsigned int f2_nominal : 10;
519   unsigned int str_nominal_temp : 7;
520   unsigned int str_bjt_temp_sense_off : 16;
521   unsigned int str_bjt_temp_sense_slope : 16;
522 #ifndef AT_EFUSE_DATA_1P19
523   unsigned int reserved1 : 20;
524 #endif
525 
526 #ifdef AT_EFUSE_DATA_1P19
527   unsigned int trim_sel_20Mhz : 7; // Trim value for 20mzh rc
528   unsigned int ro_32khz_00_trim : 5;
529   unsigned int scdc_dcdc_trim : 3;
530   unsigned int scdc_hpldo_trim : 3;
531   unsigned int reserved1 : 2;
532 #endif
533   unsigned int ldo_ctrl : 4;
534 #ifndef AT_EFUSE_DATA_1P19
535   unsigned int reserved2 : 16;
536 #endif
537 #ifdef AT_EFUSE_DATA_1P19
538   unsigned int vbg_tsbjt_efuse : 12;
539   unsigned int retn_ldo_lptrim : 3;
540   unsigned int reserved2 : 1;
541 #endif
542   unsigned int auxadc_offset_diff : 12;
543   unsigned int auxadc_invgain_diff : 16;
544   unsigned int auxadc_offset_single : 12;
545   unsigned int auxadc_invgain_single : 16;
546   unsigned int set_vref1p3 : 4;
547 
548 #ifndef AT_EFUSE_DATA_1P19
549   unsigned int set_vref_isense1p3 : 2;
550   unsigned int set_vref_adc : 2;
551   unsigned int vtrim_ldosoc : 2;
552 #endif
553 
554 #ifdef AT_EFUSE_DATA_1P19
555   unsigned int reserved13 : 6;
556 #endif
557 
558   unsigned int trim_r1_resistorladder : 4;
559 #ifndef AT_EFUSE_DATA_1P19
560   unsigned int enable_undershoot_reduction : 1;
561   unsigned int select_vref_comp : 2;
562 #endif
563 
564 #ifdef AT_EFUSE_DATA_1P19
565   unsigned int retn_ldo_hptrim : 3;
566 #endif
567 
568 #ifndef AT_EFUSE_DATA_1P19
569   unsigned int pwr_gd_threshold_sel : 1;
570   unsigned int sel_overshoot_control : 1;
571   unsigned int ptat_load_ctrl : 3;
572   unsigned int ctrl_soc : 4;
573   unsigned int pt_gate_ctrl : 3;
574   unsigned int default_mode_ctrl : 1;
575   unsigned int ptat_load_enable : 1;
576   unsigned int ldosoc_outputpulldown_sel : 1;
577   unsigned int ldosoc_outputpulldown : 1;
578 #endif
579 
580 #ifdef AT_EFUSE_DATA_1P19
581   unsigned int reserved12 : 16;
582 #endif
583 
584   unsigned int scale_soc_ldo_vref : 1;
585 
586 #ifndef AT_EFUSE_DATA_1P19
587   unsigned int ctrl_rf : 4;
588   unsigned int default_mode : 1;
589   unsigned int test_ldopulldown_sel : 1;
590   unsigned int test_ldopulldown : 1;
591   unsigned int drive_n : 2;
592   unsigned int drive_p : 2;
593   unsigned int deadtime_ctrl_n2p : 4;
594   unsigned int deadtime_ctrl_p2n : 4;
595   unsigned int revi_offset_prog : 3;
596   unsigned int tran_lo_ctr : 2;
597   unsigned int tran_hi_ctr : 2;
598   unsigned int tran_und_shoot_ctr : 3;
599 #endif
600 
601 #ifdef AT_EFUSE_DATA_1P19
602   unsigned int reserved11 : 7;
603   unsigned int reserved10 : 12;
604   unsigned int reserved9 : 10;
605 #endif
606 
607   unsigned int dpwm_freq_trim : 4;
608 
609 #ifndef AT_EFUSE_DATA_1P19
610   unsigned int pfmro_freq_trim : 3;
611   unsigned int test_revi_delay : 1;
612   unsigned int sel_sleep_nmos_ctrl : 1;
613   unsigned int p_1p3 : 13;
614   unsigned int i_steady_state1p3 : 13;
615   unsigned int d_1p3 : 15;
616   unsigned int i_soft_start1p3 : 13;
617   unsigned int dither_en1p3 : 1;
618   unsigned int auto_mode_tran_disable : 1;
619 #endif
620 
621 #ifdef AT_EFUSE_DATA_1P19
622   unsigned int reserved73 : 1;
623   unsigned int reserved74 : 13;
624   unsigned int reserved75 : 13;
625   unsigned int reserved76 : 15;
626   unsigned int reserved77 : 13;
627   unsigned int reserved78 : 1;
628   unsigned int reserved79 : 1;
629 #endif
630 
631   unsigned int pfm_pon_time_sel : 4;
632 
633 #ifndef AT_EFUSE_DATA_1P19
634   unsigned int pfm_non_time_sel : 3;
635   unsigned int pwm_cont_prog : 3;
636   unsigned int pfm_clk_up_del_sel : 3;
637   unsigned int pwm_to_pfm_pulse_count_prog : 2;
638   unsigned int pfm_to_pwm_pulse_count_prog : 2;
639   unsigned int pfm_to_pwm_cur_prog : 3;
640   unsigned int pwm_to_pfm_cur_prog : 3;
641   unsigned int max_duty_cycle_threshold : 3;
642   unsigned int min_duty_cycle_threshold : 3;
643   unsigned int bypass_pfm_to_pwm_counter_1 : 1;
644   unsigned int no_of_pfm_clk : 4;
645   unsigned int adc_op_thresh_sel : 2;
646 #endif
647 
648 #ifdef AT_EFUSE_DATA_1P19
649   unsigned int reserved6;
650   unsigned int reserved31 : 3;
651   unsigned int reserved32 : 3;
652   unsigned int reserved33 : 3;
653   unsigned int reserved34 : 2;
654   unsigned int reserved35 : 2;
655   unsigned int reserved36 : 3;
656   unsigned int reserved37 : 3;
657   unsigned int reserved38 : 3;
658   unsigned int reserved39 : 3;
659   unsigned int reserved40 : 1;
660   unsigned int reserved41 : 4;
661   unsigned int reserved42 : 2;
662 #endif
663   unsigned int reserved3 : 4;
664   unsigned int reserved4[2];
665   uint16_t reserved5;
666 
667 } __attribute__((__packed__)) efuse_ipmu_t;
668 #endif
669 
670 #if defined(SLI_SI917) || defined(SLI_SI915)
671 typedef struct efuse_ipmu_s {
672   unsigned int trim_0p5na1 : 1;
673   unsigned int bg_r_vdd_ulp : 5;
674   unsigned int bg_r_ptat_vdd_ulp : 3;
675   unsigned int reserved20 : 2; //Removed in RS9117
676   unsigned int trim_sel : 7;
677   unsigned int del_2x_sel : 6;
678   unsigned int freq_trim : 5;
679   unsigned int coarse_trim_16k : 2;
680   unsigned int fine_trim_16k : 7;
681   unsigned int coarse_trim_64k : 2;
682   unsigned int fine_trim_64k : 7;
683   unsigned int coarse_trim_32k : 2;
684   unsigned int fine_trim_32k : 7;
685   unsigned int xtal1_trim_32k : 4;
686   unsigned int xtal2_trim_32k : 4;
687   unsigned int trim_ring_osc : 7;
688   unsigned int vbatt_status_1 : 6;
689   unsigned int str_temp_slope : 10;
690   unsigned int f2_nominal : 10;
691   unsigned int str_nominal_temp : 7;
692   unsigned int str_bjt_temp_sense_off : 16;
693   unsigned int str_bjt_temp_sense_slope : 16;
694   unsigned int trim_sel_20Mhz : 7; // Trim value for 20mzh rc
695   unsigned int ro_32khz_00_trim : 5;
696   unsigned int scdc_dcdc_trim : 3;
697   unsigned int scdc_hpldo_trim : 3;
698   unsigned int reserved1 : 2;
699   unsigned int ldo_ctrl : 4;
700   unsigned int vbg_tsbjt_efuse : 12;
701   unsigned int retn_ldo_lptrim : 3;
702   unsigned int reserved2 : 1;
703   unsigned int auxadc_offset_diff : 12;
704   unsigned int auxadc_invgain_diff : 16;
705   unsigned int auxadc_offset_single : 12;
706   unsigned int auxadc_invgain_single : 16;
707   unsigned int set_vref1p3 : 4;
708   unsigned int reserved13 : 6;
709   unsigned int trim_r1_resistorladder : 4;
710   unsigned int retn_ldo_hptrim : 3;
711   unsigned int reserved12 : 16;
712   unsigned int scale_soc_ldo_vref : 1;
713   unsigned int reserved11 : 7;
714   unsigned int reserved10 : 12;
715   unsigned int reserved9 : 10;
716   unsigned int dpwm_freq_trim : 4;
717   unsigned int reserved73 : 32; // 73 and 74 togther as 50
718   unsigned int reserved74 : 18; //
719   unsigned int scdc_clk_freq : 5;
720   unsigned int reserved7 : 6;
721   unsigned int buck_ind_efuse : 4;
722   unsigned int reserved31 : 32; // 31,32 and 33 togther as 80
723   unsigned int reserved32 : 32;
724   unsigned int reserved33 : 16;
725 } __attribute__((__packed__)) efuse_ipmu_t;
726 #endif
727 
728 /* Clock trim APL structure */
729 typedef enum INPUT_CLOCK {
730   ulp_ref_clk           = 0,
731   ulp_20mhz_ringosc_clk = 2,
732   sleep_clk             = 8,
733   soc_pll_clk           = 6
734 
735 } INPUT_CLOCK_T;
736 
737 typedef enum SLEEP_CLOCK { khz_rc_clk = 0x0, khz_xtal_clk = 0x1, khz_ro_clk = 0x3, none = 0x233 } SLEEP_CLOCK_T;
738 
739 /******************************************************
740    * *                 Global Variables
741    * ******************************************************/
742 
743 /******************************************************
744    * *               Function Declarations
745    * ******************************************************/
746 /**
747    * \ingroup   RSI_SPECIFIC_DRIVERS
748    * \defgroup  RSI_IPMU_DRIVERS RSI:RS1xxxx IPMU
749    *  @{
750    *
751    */
752 rsi_error_t RSI_IPMU_Xtal2bias_Efuse(void);
753 rsi_error_t RSI_IPMU_Xtal1bias_Efuse(void);
754 uint32_t RSI_IPMU_Delvbe_Tsbjt_Efuse(void);
755 rsi_error_t RSI_IPMU_Dpwmfreq_TrimEfuse(void);
756 rsi_error_t RSI_IPMU_Ldosoc_TrimEfuse(void);
757 rsi_error_t RSI_IPMU_Buck_TrimEfuse(void);
758 rsi_error_t RSI_IPMU_POCbias_Efuse(void);
759 rsi_error_t RSI_IPMU_Blackout_TrimEfuse(void);
760 rsi_error_t RSI_IPMU_Bg_TrimEfuse(void);
761 uint32_t RSI_IPMU_Auxadcgain_SeEfuse(void);
762 uint32_t RSI_IPMU_Auxadcoff_SeEfuse(void);
763 uint32_t RSI_IPMU_Auxadcoff_DiffEfuse(void);
764 uint32_t RSI_IPMU_Auxadcgain_DiffEfuse(void);
765 uint32_t RSI_IPMU_Vbg_Tsbjt_Efuse(void);
766 uint32_t RSI_IPMU_RO_TsEfuse(void);
767 rsi_error_t RSI_IPMU_Vbattstatus_TrimEfuse(void);
768 rsi_error_t RSI_IPMU_RC32khz_TrimEfuse(void);
769 rsi_error_t RSI_IPMU_RC64khz_TrimEfuse(void);
770 rsi_error_t RSI_IPMU_RC16khz_TrimEfuse(void);
771 rsi_error_t RSI_IPMU_RO32khz_TrimEfuse(void);
772 rsi_error_t RSI_IPMU_M20roOsc_TrimEfuse(void);
773 rsi_error_t RSI_IPMU_DBLR32M_TrimEfuse(void);
774 rsi_error_t RSI_IPMU_M20rcOsc_TrimEfuse(void);
775 rsi_error_t RSI_IPMU_PMUCommonConfig(void);
776 rsi_error_t RSI_IPMU_M32rc_OscTrimEfuse(void);
777 void RSI_IPMU_PowerGateSet(uint32_t mask_vlaue);
778 void RSI_IPMU_PowerGateClr(uint32_t mask_vlaue);
779 rsi_error_t RSI_IPMU_CommonConfig(void);
780 void RSI_IPMU_ClockMuxSel(uint8_t bg_pmu_clk);
781 uint32_t RSI_IPMU_32MHzClkClib(void);
782 rsi_error_t RSI_IPMU_ProgramConfigData(const uint32_t *config);
783 void RSI_IPMU_InitCalibData(void);
784 void RSI_IPMU_UpdateIpmuCalibData_efuse(const efuse_ipmu_t *ipmu_calib_data);
785 uint32_t RSI_APB_ProgramConfigData(const uint32_t *config);
786 uint32_t RSI_IPMU_RO_TsConfig(void);
787 void RSI_Configure_DCDC_LowerVoltage(void);
788 void RSI_IPMU_32KHzRCClkClib(void);
789 void RSI_IPMU_32KHzROClkClib(void);
790 rsi_error_t RSI_IPMU_PocbiasCurrent11(void);
791 rsi_error_t RSI_IPMU_RO32khzTrim00Efuse(void);
792 rsi_error_t RSI_IPMU_RetnHP_Volttrim_Efuse(void);
793 rsi_error_t RSI_IPMU_PocbiasCurrent(void);
794 void RSI_IPMU_RetnLdoHpmode(void);
795 void RSI_IPMU_RetnLdoLpmode(void);
796 void RSI_IPMU_Retn_Voltage_Reduction(void);
797 void RSI_IPMU_Retn_Voltage_To_Default(void);
798 void RSI_IPMU_Set_Higher_Pwm_Ro_Frequency_Mode_to_PMU(void);
799 rsi_error_t RSI_IPMU_RetnLdo0p75(void);
800 rsi_error_t RSI_IPMU_RetnLdoVoltsel(void);
801 void RSI_IPMU_64KHZ_RCClktrim(void);
802 void RSI_IPMU_20M_ROClktrim(uint8_t clkfreq);
803 uint32_t RSI_Clks_Calibration(INPUT_CLOCK_T inputclk, SLEEP_CLOCK_T sleep_clk_type);
804 uint32_t RSI_Clks_Trim32MHzRC(uint32_t freq);
805 void RSI_IPMU_SCDC_Enable(void);
806 void RSI_IPMU_HP_LDO_Enable(void);
807 void RSI_Ipmu_Init(void);
808 void RSI_Configure_Ipmu_Mode(void);
809 void ipmu_init(void);
810 void configure_ipmu_mode(uint32_t mode);
811 uint32_t init_ipmu_calib_data(uint32_t m4_present);
812 void update_ipmu_data(uint32_t reg_addr, uint32_t reg_type, uint32_t data, uint32_t mask);
813 void update_efuse_system_configs(int data, uint32_t config_ptr[]);
814 rsi_error_t RSI_IPMU_BOD_ClksCommonconfig1(void);
815 rsi_error_t RSI_IPMU_BOD_ClksCommonconfig2(void);
816 rsi_error_t RSI_IPMU_Hpldo_volt_trim_efuse(void);
817 rsi_error_t RSI_IPMU_Scdc_volt_trim_efuse(void);
818 void RSI_IPMU_Reconfig_to_SCDCDC(void);
819 rsi_error_t RSI_IPMU_Lp_scdc_extcapmode(void);
820 rsi_error_t RSI_IPMU_BOD_Cmphyst(void);
821 /**
822    * @} end of RSI_IPMU_DRIVERS
823    */
824 /* @} end of RSI_IPMU_DRIVERS  */
825 
826 #ifdef __cplusplus
827 }
828 #endif
829 #endif // RSI_IPMU_H
830