1717 * under the License.
1818 */
1919
20+ #include <zephyr/arch/common/sys_io.h>
2021#include <assert.h>
2122#include <stdlib.h>
2223#include <stdint.h>
2526#include <da1469x_pd.h>
2627#include <da1469x_trimv.h>
2728
28- /* This shall be defined for each MCU separately */
29- extern void da1469x_pd_apply_preferred (uint8_t pd );
29+ #define PD_COUNT (sizeof(g_da1469x_pd_desc) / sizeof(g_da1469x_pd_desc[0]))
3030
31- #define PD_COUNT (sizeof(g_da1469x_pd_desc) / sizeof(g_da1469x_pd_desc[0] ))
31+ #define REG_TO_PTR ( _reg ) ((uintptr_t)&(_reg ))
3232
3333struct da1469x_pd_desc {
3434 uint8_t pmu_sleep_bit ;
@@ -41,6 +41,14 @@ struct da1469x_pd_data {
4141 uint32_t * trimv_words ;
4242};
4343
44+ enum chip_variant {
45+ CHIP_VARIANT_TSMC ,
46+ CHIP_VARIANT_GF ,
47+ CHIP_VARIANT_UNKNOWN
48+ };
49+
50+ static int g_device_id = CHIP_VARIANT_UNKNOWN ;
51+
4452/* Only include controllable power domains here */
4553static const struct da1469x_pd_desc g_da1469x_pd_desc [] = {
4654 [MCU_PD_DOMAIN_SYS ] = { CRG_TOP_PMU_CTRL_REG_SYS_SLEEP_Pos ,
@@ -55,6 +63,14 @@ static const struct da1469x_pd_desc g_da1469x_pd_desc[] = {
5563
5664static struct da1469x_pd_data g_da1469x_pd_data [PD_COUNT ];
5765
66+ static inline void
67+ write32_mask (uint32_t mask , uint32_t data , mem_addr_t addr )
68+ {
69+ uint32_t val = sys_read32 (addr );
70+
71+ sys_write32 ((val & (~mask )) | (data & mask ), addr );
72+ }
73+
5874static void
5975da1469x_pd_load_trimv (uint8_t pd , uint8_t group )
6076{
@@ -102,9 +118,104 @@ da1469x_pd_apply_trimv(uint8_t pd)
102118 }
103119}
104120
121+ static int
122+ read_device_id (void )
123+ {
124+ union {
125+ uint8_t array [4 ];
126+ uint32_t value ;
127+ } chip_id ;
128+
129+ chip_id .array [3 ] = CHIP_VERSION -> CHIP_ID1_REG & CHIP_VERSION_CHIP_ID1_REG_CHIP_ID1_Msk ;
130+ chip_id .array [2 ] = CHIP_VERSION -> CHIP_ID2_REG & CHIP_VERSION_CHIP_ID2_REG_CHIP_ID2_Msk ;
131+ chip_id .array [1 ] = CHIP_VERSION -> CHIP_ID3_REG & CHIP_VERSION_CHIP_ID3_REG_CHIP_ID3_Msk ;
132+ chip_id .array [0 ] = CHIP_VERSION -> CHIP_ID4_REG & CHIP_VERSION_CHIP_ID4_REG_CHIP_ID4_Msk ;
133+
134+ if (chip_id .value == 0x32353232 ) {
135+ return CHIP_VARIANT_TSMC ;
136+ } else if (chip_id .value == 0x33303830 ) {
137+ return CHIP_VARIANT_GF ;
138+ } else {
139+ return CHIP_VARIANT_UNKNOWN ;
140+ }
141+ }
142+
143+ static void
144+ da1469x_TSMC_pd_apply_preferred (uint8_t pd )
145+ {
146+ switch (pd ) {
147+ case MCU_PD_DOMAIN_AON :
148+ /* Apply if no user-defined value has been applied */
149+ if (sys_read32 (REG_TO_PTR (CRG_TOP -> PMU_TRIM_REG )) == 0x00008800 ) {
150+ sys_write32 (0x00007700 , REG_TO_PTR (CRG_TOP -> PMU_TRIM_REG ));
151+ }
152+ write32_mask (0x00001000 , 0x00001020 , REG_TO_PTR (CRG_TOP -> BANDGAP_REG ));
153+ sys_write32 (0x000000ca , REG_TO_PTR (CRG_TOP -> BIAS_VREF_SEL_REG ));
154+ write32_mask (0x0003ffff , 0x041e6ef4 , REG_TO_PTR (CRG_TOP -> BOD_LVL_CTRL0_REG ));
155+ break ;
156+ case MCU_PD_DOMAIN_SYS :
157+ write32_mask (0x00000c00 , 0x003f6a78 , REG_TO_PTR (CHARGER -> CHARGER_CTRL_REG ));
158+ write32_mask (0x000003ff , 0x00000002 , REG_TO_PTR (CHARGER -> CHARGER_PWR_UP_TIMER_REG ));
159+ break ;
160+ case MCU_PD_DOMAIN_TIM :
161+ write32_mask (0x3ff00000 , 0x000afd70 , REG_TO_PTR (CRG_XTAL -> CLK_FREQ_TRIM_REG ));
162+ write32_mask (0x000000c0 , 0x00000562 , REG_TO_PTR (CRG_XTAL -> TRIM_CTRL_REG ));
163+ write32_mask (0x03c38002 , 0x0801e6b6 , REG_TO_PTR (CRG_XTAL -> XTAL32M_CTRL0_REG ));
164+ write32_mask (0x007fff00 , 0x7500a1a4 , REG_TO_PTR (CRG_XTAL -> XTAL32M_CTRL1_REG ));
165+ write32_mask (0x00000fff , 0x001e45c4 , REG_TO_PTR (CRG_XTAL -> XTAL32M_CTRL2_REG ));
166+ write32_mask (0x40000000 , 0x40096255 , REG_TO_PTR (CRG_XTAL -> XTAL32M_CTRL3_REG ));
167+ write32_mask (0x00c00000 , 0x00c00000 , 0x50010040 );
168+ write32_mask (0x000000ff , 0x00000180 , REG_TO_PTR (CRG_XTAL -> XTALRDY_CTRL_REG ));
169+ break ;
170+ }
171+ }
172+
173+ static void
174+ da1469x_GF_pd_apply_preferred (uint8_t pd )
175+ {
176+ switch (pd ) {
177+ case MCU_PD_DOMAIN_AON :
178+ write32_mask (0x00001000 , 0x00001020 , REG_TO_PTR (CRG_TOP -> BANDGAP_REG ));
179+ sys_write32 (0x000000ca , REG_TO_PTR (CRG_TOP -> BIAS_VREF_SEL_REG ));
180+ write32_mask (0x0003ffff , 0x041e6ef4 , REG_TO_PTR (CRG_TOP -> BOD_LVL_CTRL0_REG ));
181+ write32_mask (0x00000f00 , 0x00000dfc , REG_TO_PTR (CRG_TOP -> CLK_RCX_REG ));
182+ write32_mask (0x0000007e , 0x00000024 , REG_TO_PTR (CRG_TOP -> CLK_XTAL32K_REG ));
183+ break ;
184+ case MCU_PD_DOMAIN_SYS :
185+ write32_mask (0x00000c00 , 0x003f6a78 , REG_TO_PTR (CHARGER -> CHARGER_CTRL_REG ));
186+ write32_mask (0x000003ff , 0x00000002 , REG_TO_PTR (CHARGER -> CHARGER_PWR_UP_TIMER_REG ));
187+ break ;
188+ case MCU_PD_DOMAIN_TIM :
189+ write32_mask (0x3ff00000 , 0x000afd70 , REG_TO_PTR (CRG_XTAL -> CLK_FREQ_TRIM_REG ));
190+ write32_mask (0x000000c0 , 0x00000562 , REG_TO_PTR (CRG_XTAL -> TRIM_CTRL_REG ));
191+ write32_mask (0x1fc38002 , 0x0c01e6b6 , REG_TO_PTR (CRG_XTAL -> XTAL32M_CTRL0_REG ));
192+ write32_mask (0x707fff00 , 0x0500a1a4 , REG_TO_PTR (CRG_XTAL -> XTAL32M_CTRL1_REG ));
193+ write32_mask (0x00000fff , 0x001e45c4 , REG_TO_PTR (CRG_XTAL -> XTAL32M_CTRL2_REG ));
194+ write32_mask (0x40000000 , 0x40096255 , REG_TO_PTR (CRG_XTAL -> XTAL32M_CTRL3_REG ));
195+ write32_mask (0x00c00000 , 0x00c00000 , 0x50010040 );
196+ write32_mask (0x000000ff , 0x00000180 , REG_TO_PTR (CRG_XTAL -> XTALRDY_CTRL_REG ));
197+ break ;
198+ }
199+ }
200+
201+ __weak void
202+ da1469x_pd_apply_preferred (uint8_t pd )
203+ {
204+ if (g_device_id == CHIP_VARIANT_TSMC ) {
205+ da1469x_TSMC_pd_apply_preferred (pd );
206+ } else {
207+ da1469x_GF_pd_apply_preferred (pd );
208+ }
209+ }
210+
211+
105212int
106213da1469x_pd_init (void )
107214{
215+ /* Get the chip ID before initilizating any PD */
216+ g_device_id = read_device_id ();
217+ assert (g_device_id != CHIP_VARIANT_UNKNOWN );
218+
108219 /*
109220 * Apply now for always-on domain which, as name suggests, is always on so
110221 * need to do this only once.
0 commit comments