summaryrefslogtreecommitdiff
path: root/board
diff options
context:
space:
mode:
authoryanhong.wang <yanhong.wang@starfivetech.com>2022-04-26 12:22:34 +0300
committerYanhong Wang <yanhong.wang@linux.starfivetech.com>2022-10-18 11:24:34 +0300
commitf95a5cec9fd49737ce570098be96d0c4d5c40ea8 (patch)
tree43f44d10017278a23e1a16948fc9ca151bea7b91 /board
parent3d8b5aeca1e41c1a5632e242db45a59b9a439a04 (diff)
downloadu-boot-f95a5cec9fd49737ce570098be96d0c4d5c40ea8.tar.xz
board:starfive: add rtc timer init
The rtc timer is used early in kernel, but the clk&reset driver is not ready,so some clk&reset init is placed here. Signed-off-by: yanhong.wang <yanhong.wang@starfivetech.com>
Diffstat (limited to 'board')
-rwxr-xr-x[-rw-r--r--]board/starfive/visionfive/starfive_visionfive.c38
1 files changed, 37 insertions, 1 deletions
diff --git a/board/starfive/visionfive/starfive_visionfive.c b/board/starfive/visionfive/starfive_visionfive.c
index 6a8f8319a0..7f9de3d9de 100644..100755
--- a/board/starfive/visionfive/starfive_visionfive.c
+++ b/board/starfive/visionfive/starfive_visionfive.c
@@ -37,6 +37,39 @@
SYS_IOMUX_DOUT(gpio, gpo);\
SYS_IOMUX_DIN(gpio, gpi); }while(0)
+#define SYS_CLOCK_ENABLE(clk) \
+ setbits_le32(SYS_CRG_BASE + clk, CLK_ENABLE_MASK)
+
+static void sys_reset_clear(ulong assert, ulong status, u32 rst)
+{
+ volatile u32 value;
+
+ clrbits_le32(SYS_CRG_BASE + assert, BIT(rst));
+ do{
+ value = in_le32(SYS_CRG_BASE + status);
+ }while((value & BIT(rst)) != BIT(rst));
+}
+
+static void jh7110_timer_init(void)
+{
+ SYS_CLOCK_ENABLE(TIMER_CLK_APB_SHIFT);
+ SYS_CLOCK_ENABLE(TIMER_CLK_TIMER0_SHIFT);
+ SYS_CLOCK_ENABLE(TIMER_CLK_TIMER1_SHIFT);
+ SYS_CLOCK_ENABLE(TIMER_CLK_TIMER2_SHIFT);
+ SYS_CLOCK_ENABLE(TIMER_CLK_TIMER3_SHIFT);
+
+ sys_reset_clear(SYS_CRG_RESET_ASSERT3_SHIFT,
+ SYS_CRG_RESET_STATUS3_SHIFT, TIMER_RSTN_APB_SHIFT);
+ sys_reset_clear(SYS_CRG_RESET_ASSERT3_SHIFT,
+ SYS_CRG_RESET_STATUS3_SHIFT, TIMER_RSTN_TIMER0_SHIFT);
+ sys_reset_clear(SYS_CRG_RESET_ASSERT3_SHIFT,
+ SYS_CRG_RESET_STATUS3_SHIFT, TIMER_RSTN_TIMER1_SHIFT);
+ sys_reset_clear(SYS_CRG_RESET_ASSERT3_SHIFT,
+ SYS_CRG_RESET_STATUS3_SHIFT, TIMER_RSTN_TIMER2_SHIFT);
+ sys_reset_clear(SYS_CRG_RESET_ASSERT3_SHIFT,
+ SYS_CRG_RESET_STATUS3_SHIFT, TIMER_RSTN_TIMER3_SHIFT);
+}
+
static void jh7110_gmac_init(int id)
{
switch (id) {
@@ -129,6 +162,8 @@ int board_init(void)
jh7110_gmac_init(0);
jh7110_gmac_init(1);
+ jh7110_timer_init();
+
jh7110_usb_init();
jh7110_mmc_init(0);
@@ -160,7 +195,8 @@ int misc_init_r(void)
if (ret)
printf("%s: error reading mac from OTP\n", __func__);
else
- memcpy(mac, buf, 6);
+ if (buf[0] != 0xff)
+ memcpy(mac, buf, 6);
err:
#endif
eth_env_set_enetaddr("ethaddr", mac);