mirror of
				https://xff.cz/git/u-boot/
				synced 2025-10-30 18:05:48 +01:00 
			
		
		
		
	clk: agilex: Additional membus writes for HPS PLL
Add additional membus writes to configure main and peripheral PLL for Agilex's clock manager. Signed-off-by: Chee Hong Ang <chee.hong.ang@intel.com> Reviewed-by: Ley Foon Tan <ley.foon.tan@intel.com>
This commit is contained in:
		
				
					committed by
					
						 Ley Foon Tan
						Ley Foon Tan
					
				
			
			
				
	
			
			
			
						parent
						
							35d847ed90
						
					
				
				
					commit
					d24f2bc148
				
			| @@ -47,8 +47,66 @@ static void clk_write_ctrl(struct socfpga_clk_platdata *plat, u32 val) | ||||
| #define MEMBUS_MAINPLL				0 | ||||
| #define MEMBUS_PERPLL				1 | ||||
| #define MEMBUS_TIMEOUT				1000 | ||||
| #define MEMBUS_ADDR_CLKSLICE			0x27 | ||||
| #define MEMBUS_CLKSLICE_SYNC_MODE_EN		0x80 | ||||
|  | ||||
| #define MEMBUS_CLKSLICE_REG				0x27 | ||||
| #define MEMBUS_SYNTHCALFOSC_INIT_CENTERFREQ_REG		0xb3 | ||||
| #define MEMBUS_SYNTHPPM_WATCHDOGTMR_VF01_REG		0xe6 | ||||
| #define MEMBUS_CALCLKSLICE0_DUTY_LOCOVR_REG		0x03 | ||||
| #define MEMBUS_CALCLKSLICE1_DUTY_LOCOVR_REG		0x07 | ||||
|  | ||||
| static const struct { | ||||
| 	u32 reg; | ||||
| 	u32 val; | ||||
| 	u32 mask; | ||||
| } membus_pll[] = { | ||||
| 	{ | ||||
| 		MEMBUS_CLKSLICE_REG, | ||||
| 		/* | ||||
| 		 * BIT[7:7] | ||||
| 		 * Enable source synchronous mode | ||||
| 		 */ | ||||
| 		BIT(7), | ||||
| 		BIT(7) | ||||
| 	}, | ||||
| 	{ | ||||
| 		MEMBUS_SYNTHCALFOSC_INIT_CENTERFREQ_REG, | ||||
| 		/* | ||||
| 		 * BIT[0:0] | ||||
| 		 * Sets synthcalfosc_init_centerfreq=1 to limit overshoot | ||||
| 		 * frequency during lock | ||||
| 		 */ | ||||
| 		BIT(0), | ||||
| 		BIT(0) | ||||
| 	}, | ||||
| 	{ | ||||
| 		MEMBUS_SYNTHPPM_WATCHDOGTMR_VF01_REG, | ||||
| 		/* | ||||
| 		 * BIT[0:0] | ||||
| 		 * Sets synthppm_watchdogtmr_vf0=1 to give the pll more time | ||||
| 		 * to settle before lock is asserted. | ||||
| 		 */ | ||||
| 		BIT(0), | ||||
| 		BIT(0) | ||||
| 	}, | ||||
| 	{ | ||||
| 		MEMBUS_CALCLKSLICE0_DUTY_LOCOVR_REG, | ||||
| 		/* | ||||
| 		 * BIT[6:0] | ||||
| 		 * Centering duty cycle for clkslice0 output | ||||
| 		 */ | ||||
| 		0x4a, | ||||
| 		GENMASK(6, 0) | ||||
| 	}, | ||||
| 	{ | ||||
| 		MEMBUS_CALCLKSLICE1_DUTY_LOCOVR_REG, | ||||
| 		/* | ||||
| 		 * BIT[6:0] | ||||
| 		 * Centering duty cycle for clkslice1 output | ||||
| 		 */ | ||||
| 		0x4a, | ||||
| 		GENMASK(6, 0) | ||||
| 	}, | ||||
| }; | ||||
|  | ||||
| static int membus_wait_for_req(struct socfpga_clk_platdata *plat, u32 pll, | ||||
| 			       int timeout) | ||||
| @@ -126,6 +184,20 @@ static int membus_read_pll(struct socfpga_clk_platdata *plat, u32 pll, | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| static void membus_pll_configs(struct socfpga_clk_platdata *plat, u32 pll) | ||||
| { | ||||
| 	int i; | ||||
| 	u32 rdata; | ||||
|  | ||||
| 	for (i = 0; i < ARRAY_SIZE(membus_pll); i++) { | ||||
| 		membus_read_pll(plat, pll, membus_pll[i].reg, | ||||
| 				&rdata, MEMBUS_TIMEOUT); | ||||
| 		membus_write_pll(plat, pll, membus_pll[i].reg, | ||||
| 			 ((rdata & ~membus_pll[i].mask) | membus_pll[i].val), | ||||
| 			 MEMBUS_TIMEOUT); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| static u32 calc_vocalib_pll(u32 pllm, u32 pllglob) | ||||
| { | ||||
| 	u32 mdiv, refclkdiv, arefclkdiv, drefclkdiv, mscnt, hscnt, vcocalib; | ||||
| @@ -166,7 +238,6 @@ static void clk_basic_init(struct udevice *dev, | ||||
| { | ||||
| 	struct socfpga_clk_platdata *plat = dev_get_platdata(dev); | ||||
| 	u32 vcocalib; | ||||
| 	u32 rdata; | ||||
|  | ||||
| 	if (!cfg) | ||||
| 		return; | ||||
| @@ -226,19 +297,10 @@ static void clk_basic_init(struct udevice *dev, | ||||
| 	CM_REG_SETBITS(plat, CLKMGR_PERPLL_PLLGLOB, | ||||
| 		       CLKMGR_PLLGLOB_PD_MASK | CLKMGR_PLLGLOB_RST_MASK); | ||||
|  | ||||
| 	/* Membus programming to set mainpll and perripll to | ||||
| 	 * source synchronous mode | ||||
| 	 */ | ||||
| 	membus_read_pll(plat, MEMBUS_MAINPLL, MEMBUS_ADDR_CLKSLICE, &rdata, | ||||
| 			MEMBUS_TIMEOUT); | ||||
| 	membus_write_pll(plat, MEMBUS_MAINPLL, MEMBUS_ADDR_CLKSLICE, | ||||
| 			 (rdata | MEMBUS_CLKSLICE_SYNC_MODE_EN), | ||||
| 			 MEMBUS_TIMEOUT); | ||||
| 	membus_read_pll(plat, MEMBUS_PERPLL, MEMBUS_ADDR_CLKSLICE, &rdata, | ||||
| 			MEMBUS_TIMEOUT); | ||||
| 	membus_write_pll(plat, MEMBUS_PERPLL, MEMBUS_ADDR_CLKSLICE, | ||||
| 			 (rdata | MEMBUS_CLKSLICE_SYNC_MODE_EN), | ||||
| 			 MEMBUS_TIMEOUT); | ||||
| 	/* Membus programming for mainpll */ | ||||
| 	membus_pll_configs(plat, MEMBUS_MAINPLL); | ||||
| 	/* Membus programming for peripll */ | ||||
| 	membus_pll_configs(plat, MEMBUS_PERPLL); | ||||
|  | ||||
| 	cm_wait_for_lock(CLKMGR_STAT_ALLPLL_LOCKED_MASK); | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user