Skip to content
This repository was archived by the owner on Mar 17, 2025. It is now read-only.

Commit 7e149b6

Browse files
hal: renesas: Silicon detection support
Add support for silicon variant detection and preferred values. Signed-off-by: Ioannis Karachalios <[email protected]>
1 parent 9083690 commit 7e149b6

File tree

1 file changed

+114
-3
lines changed

1 file changed

+114
-3
lines changed

smartbond/da1469x_hal/da1469x_pd.c

Lines changed: 114 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
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>
@@ -25,10 +26,9 @@
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

3333
struct 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 */
4553
static 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

5664
static 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+
5874
static void
5975
da1469x_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+
105212
int
106213
da1469x_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

Comments
 (0)