Browse Source

spl: starfive: jh7110: switch pll2 to 1188M

Switch the pll2 clk to 1188M with the comm pll interface on JH7110.

Signed-off-by: Jianlong Huang <jianlong.huang@starfivetech.com>
Jianlong Huang 1 year ago
parent
commit
bdae9f6eae

+ 6 - 0
arch/riscv/include/asm/arch-jh7110/gpio.h

@@ -20,6 +20,7 @@ extern "C" {
 #define GPIO_DOEN_MASK	0x3f
 #define GPIO_DOUT_MASK	0x7f
 #define GPIO_DIN_MASK	0x7f
+#define GPIO_DS_MASK 0x06
 
 #define NR_GPIOS		64
 
@@ -38,6 +39,7 @@ enum gpio_state {
 #define GPIO_DOUT	0x40
 #define GPIO_DIN	0x80
 #define GPIO_EN		0xdc
+#define GPIO_CONFIG 0x120
 #define GPIO_LOW_IE		0x100
 #define GPIO_HIGH_IE	0x104
 
@@ -61,6 +63,10 @@ struct starfive_gpio_platdata {
 		GPIO_DIN_MASK << GPIO_SHIFT(gpi),\
 		((gpio+2) & GPIO_DIN_MASK) << GPIO_SHIFT(gpi))
 
+#define SYS_IOMUX_SET_DS(gpio, ds) \
+	clrsetbits_le32(SYS_IOMUX_BASE + GPIO_CONFIG + gpio * 4, \
+		GPIO_DS_MASK, ds)
+
 #define SYS_IOMUX_COMPLEX(gpio, gpi, gpo, oen) do {\
 		SYS_IOMUX_DOEN(gpio, oen);\
 		SYS_IOMUX_DOUT(gpio, gpo);\

+ 17 - 165
board/starfive/visionfive2/spl.c

@@ -11,138 +11,13 @@
 #include <asm/io.h>
 #include <asm/arch/gpio.h>
 #include <asm/arch/jh7110-regs.h>
+#include <asm/arch/clk.h>
 #include <image.h>
-#include <linux/bitops.h>
 #include <log.h>
-#include <linux/delay.h>
 #include <spl.h>
 
 #define MODE_SELECT_REG		0x1702002c
 
-struct starfive_pll0_freq {
-	u32 freq;
-	u32 prediv;
-	u32 fbdiv;
-	u32 postdiv1;
-	u32 dacpd; /* Both daxpd and dsmpd set 1 while integer multiple mode */
-	u32 dsmpd; /* Both daxpd and dsmpd set 0 while fraction multiple mode */
-};
-
-enum starfive_cpu_freq {
-	CPU_FREQ_375 = 0,
-	CPU_FREQ_500,
-	CPU_FREQ_625,
-	CPU_FREQ_750,
-	CPU_FREQ_875,
-	CPU_FREQ_1000,
-	CPU_FREQ_1250,
-	CPU_FREQ_1375,
-	CPU_FREQ_1500,
-	CPU_FREQ_1625,
-	CPU_FREQ_1750,
-	CPU_FREQ_1800,
-	CPU_FREQ_MAX = CPU_FREQ_1800
-};
-
-struct starfive_pll0_freq jh7110_pll0_freq[] = {
-	{
-		.freq = CPU_FREQ_375,
-		.prediv = 8,
-		.fbdiv = 125,
-		.postdiv1 = 1,
-		.dacpd = 1,
-		.dsmpd = 1
-	},
-	{
-		.freq = CPU_FREQ_500,
-		.prediv = 6,
-		.fbdiv = 125,
-		.postdiv1 = 1,
-		.dacpd = 1,
-		.dsmpd = 1
-	},
-	{
-		.freq = CPU_FREQ_625,
-		.prediv = 24,
-		.fbdiv = 625,
-		.postdiv1 = 1,
-		.dacpd = 1,
-		.dsmpd = 1
-	},
-	{
-		.freq = CPU_FREQ_750,
-		.prediv = 4,
-		.fbdiv = 125,
-		.postdiv1 = 1,
-		.dacpd = 1,
-		.dsmpd = 1
-	},
-	{
-		.freq = CPU_FREQ_875,
-		.prediv = 24,
-		.fbdiv = 875,
-		.postdiv1 = 1,
-		.dacpd = 1,
-		.dsmpd = 1
-	},
-	{
-		.freq = CPU_FREQ_1000,
-		.prediv = 3,
-		.fbdiv = 125,
-		.postdiv1 = 1,
-		.dacpd = 1,
-		.dsmpd = 1
-	},
-	{
-		.freq = CPU_FREQ_1250,
-		.prediv = 12,
-		.fbdiv = 625,
-		.postdiv1 = 1,
-		.dacpd = 1,
-		.dsmpd = 1
-	},
-	{
-		.freq = CPU_FREQ_1375,
-		.prediv = 24,
-		.fbdiv = 1375,
-		.postdiv1 = 1,
-		.dacpd = 1,
-		.dsmpd = 1
-	},
-	{
-		.freq = CPU_FREQ_1500,
-		.prediv = 2,
-		.fbdiv = 125,
-		.postdiv1 = 1,
-		.dacpd = 1,
-		.dsmpd = 1
-	},
-	{
-		.freq = CPU_FREQ_1625,
-		.prediv = 24,
-		.fbdiv = 1625,
-		.postdiv1 = 1,
-		.dacpd = 1,
-		.dsmpd = 1
-	},
-	{
-		.freq = CPU_FREQ_1750,
-		.prediv = 12,
-		.fbdiv = 875,
-		.postdiv1 = 1,
-		.dacpd = 1,
-		.dsmpd = 1
-	},
-	{
-		.freq = CPU_FREQ_1800,
-		.prediv = 3,
-		.fbdiv = 225,
-		.postdiv1 = 1,
-		.dacpd = 1,
-		.dsmpd = 1
-	},
-};
-
 int spl_board_init_f(void)
 {
 	int ret;
@@ -182,42 +57,15 @@ struct image_header *spl_get_load_buffer(ssize_t offset, size_t size)
 	return (struct image_header *)(STARFIVE_SPL_BOOT_LOAD_ADDR);
 }
 
-static int spl_cpu_set_rate(enum starfive_cpu_freq rate)
-{
-	struct starfive_pll0_freq *cpu_freq;
-	int i;
-
-	if (rate < 0 || rate > CPU_FREQ_MAX) {
-		debug("invalid input value=%d\n", rate);
-		return -EINVAL;
-	}
-
-	for (i = 0; i<CPU_FREQ_MAX; i++) {
-		if (jh7110_pll0_freq[i].freq == rate) {
-			cpu_freq = &jh7110_pll0_freq[i];
-			break;
-		}
-	}
-
-	clrsetbits_le32(SYS_SYSCON_BASE + SYS_SYSCON_24, PLL0_DACPD_MASK,
-		(cpu_freq->dacpd << PLL0_DACPD_SHIFT) & PLL0_DACPD_MASK);
-	clrsetbits_le32(SYS_SYSCON_BASE + SYS_SYSCON_24, PLL0_DSMPD_MASK,
-		(cpu_freq->dsmpd << PLL0_DSMPD_SHIFT) & PLL0_DSMPD_MASK);
-	clrsetbits_le32(SYS_SYSCON_BASE + SYS_SYSCON_36, PLL0_PREDIV_MASK,
-		(cpu_freq->prediv << PLL0_PREDIV_SHIFT) & PLL0_PREDIV_MASK);
-	clrsetbits_le32(SYS_SYSCON_BASE + SYS_SYSCON_28, PLL0_FBDIV_MASK,
-		(cpu_freq->fbdiv << PLL0_FBDIV_SHIFT) & PLL0_FBDIV_MASK);
-	clrsetbits_le32(SYS_SYSCON_BASE + SYS_SYSCON_32, PLL0_POSTDIV1_MASK,
-		((cpu_freq->postdiv1 >> 1) << PLL0_POSTDIV1_SHIFT) & PLL0_POSTDIV1_MASK);
-	return 0;
-}
-
 void board_init_f(ulong dummy)
 {
 	int ret;
 
 	/* Adjust cpu frequency, the default is 1.25GHz */
-	spl_cpu_set_rate(CPU_FREQ_1250);
+	starfive_jh7110_pll_set_rate(PLL0, 1250000000);
+
+	/*change pll2 to 1188MHz*/
+	starfive_jh7110_pll_set_rate(PLL2, 1188000000);
 
 	/*DDR control depend clk init*/
 	clrsetbits_le32(SYS_CRG_BASE, CLK_CPU_ROOT_SW_MASK,
@@ -227,6 +75,11 @@ void board_init_f(ulong dummy)
 		CLK_BUS_ROOT_SW_MASK,
 		BIT(CLK_BUS_ROOT_SW_SHIFT) & CLK_BUS_ROOT_SW_MASK);
 
+	/*Set clk_perh_root clk default mux sel to pll2*/
+	clrsetbits_le32(SYS_CRG_BASE + CLK_PERH_ROOT_OFFSET,
+		CLK_PERH_ROOT_MASK,
+		BIT(CLK_PERH_ROOT_SHIFT) & CLK_PERH_ROOT_MASK);
+
 	clrsetbits_le32(SYS_CRG_BASE + CLK_NOC_BUS_STG_AXI_OFFSET,
 		CLK_NOC_BUS_STG_AXI_EN_MASK,
 		BIT(CLK_NOC_BUS_STG_AXI_EN_SHIFT)
@@ -240,6 +93,7 @@ void board_init_f(ulong dummy)
 		CLK_QSPI_REF_SW_MASK,
 		(0 << CLK_QSPI_REF_SW_SHIFT) & CLK_QSPI_REF_SW_MASK);
 
+
 	/*set GPIO to 3.3v*/
 	setbits_le32(SYS_SYSCON_BASE + 0xC, 0x0);
 
@@ -262,25 +116,23 @@ void board_init_f(ulong dummy)
 	SYS_IOMUX_DOEN(44, 8);
 	SYS_IOMUX_DOUT(44, 22);
 
-	/*set sdio0/1 sdcard clk default div to 4*/
-	clrsetbits_le32(SYS_CRG_BASE + CLK_SDIO0_SDCARD_OFFSET,
-		CLK_SDIO0_SDCARD_MASK,
-		(4 << CLK_SDIO0_SDCARD_SHIFT) & CLK_SDIO0_SDCARD_MASK);
-	clrsetbits_le32(SYS_CRG_BASE + CLK_SDIO1_SDCARD_OFFSET,
-		CLK_SDIO1_SDCARD_MASK,
-		(4 << CLK_SDIO1_SDCARD_SHIFT) & CLK_SDIO1_SDCARD_MASK);
-
 	/* reset emmc */
 	SYS_IOMUX_DOEN(62, LOW);
 	SYS_IOMUX_DOUT(62, 19);
 	/* reset sdio */
 	SYS_IOMUX_DOEN(10, LOW);
 	SYS_IOMUX_DOUT(10, 55);
+	SYS_IOMUX_SET_DS(10, 3);
 	SYS_IOMUX_COMPLEX(9, 44, 57, 19);
+	SYS_IOMUX_SET_DS(9, 3);
 	SYS_IOMUX_COMPLEX(11, 45, 58, 20);
+	SYS_IOMUX_SET_DS(11, 3);
 	SYS_IOMUX_COMPLEX(12, 46, 59, 21);
+	SYS_IOMUX_SET_DS(12, 3);
 	SYS_IOMUX_COMPLEX(7, 47, 60, 22);
+	SYS_IOMUX_SET_DS(7, 3);
 	SYS_IOMUX_COMPLEX(8, 48, 61, 23);
+	SYS_IOMUX_SET_DS(8, 3);
 
 	ret = spl_early_init();
 	if (ret)

+ 6 - 0
board/starfive/visionfive2/starfive_visionfive2.c

@@ -219,11 +219,17 @@ static void jh7110_mmc_init(int id)
 	} else {
 		SYS_IOMUX_DOEN(10, LOW);
 		SYS_IOMUX_DOUT(10, 55);
+		SYS_IOMUX_SET_DS(10, 3);
 		SYS_IOMUX_COMPLEX(9, 44, 57, 19);
+		SYS_IOMUX_SET_DS(9, 3);
 		SYS_IOMUX_COMPLEX(11, 45, 58, 20);
+		SYS_IOMUX_SET_DS(11, 3);
 		SYS_IOMUX_COMPLEX(12, 46, 59, 21);
+		SYS_IOMUX_SET_DS(12, 3);
 		SYS_IOMUX_COMPLEX(7, 47, 60, 22);
+		SYS_IOMUX_SET_DS(7, 3);
 		SYS_IOMUX_COMPLEX(8, 48, 61, 23);
+		SYS_IOMUX_SET_DS(8, 3);
 	}
 }