xref: /rk3399_rockchip-uboot/arch/arm/include/asm/arch-rockchip/clock.h (revision 4ca69a299c2baaad99342f1223c0bad9ff33b582)
126ad30e9SSimon Glass /*
226ad30e9SSimon Glass  * (C) Copyright 2015 Google, Inc
326ad30e9SSimon Glass  *
426ad30e9SSimon Glass  * SPDX-License-Identifier:	GPL-2.0
526ad30e9SSimon Glass  */
626ad30e9SSimon Glass 
726ad30e9SSimon Glass #ifndef _ASM_ARCH_CLOCK_H
826ad30e9SSimon Glass #define _ASM_ARCH_CLOCK_H
926ad30e9SSimon Glass 
1026ad30e9SSimon Glass /* define pll mode */
1126ad30e9SSimon Glass #define RKCLK_PLL_MODE_SLOW		0
1226ad30e9SSimon Glass #define RKCLK_PLL_MODE_NORMAL		1
132f0a72b1SElaine Zhang #define RKCLK_PLL_MODE_DEEP		2
1426ad30e9SSimon Glass 
15c6f7c1a3SJoseph Chen /*
16c6f7c1a3SJoseph Chen  * PLL flags
17c6f7c1a3SJoseph Chen  */
18c6f7c1a3SJoseph Chen #define ROCKCHIP_PLL_SYNC_RATE		BIT(0)
19c6f7c1a3SJoseph Chen /* normal mode only. now only for pll_rk3036, pll_rk3328 type */
20c6f7c1a3SJoseph Chen #define ROCKCHIP_PLL_FIXED_MODE		BIT(1)
21c6f7c1a3SJoseph Chen 
2226ad30e9SSimon Glass enum {
2326ad30e9SSimon Glass 	ROCKCHIP_SYSCON_NOC,
2426ad30e9SSimon Glass 	ROCKCHIP_SYSCON_GRF,
2526ad30e9SSimon Glass 	ROCKCHIP_SYSCON_SGRF,
2626ad30e9SSimon Glass 	ROCKCHIP_SYSCON_PMU,
27c55e30ebSKever Yang 	ROCKCHIP_SYSCON_PMUGRF,
282adb9812SKever Yang 	ROCKCHIP_SYSCON_PMUSGRF,
292adb9812SKever Yang 	ROCKCHIP_SYSCON_CIC,
30168eef7aSKever Yang 	ROCKCHIP_SYSCON_MSCH,
31be82169bSWu Liang feng 	ROCKCHIP_SYSCON_USBGRF,
32e1cfe1c9SJoseph Chen 	ROCKCHIP_SYSCON_PCIE30_PHY_GRF,
33e1cfe1c9SJoseph Chen 	ROCKCHIP_SYSCON_PHP_GRF,
34e1cfe1c9SJoseph Chen 	ROCKCHIP_SYSCON_PIPE_PHY0_GRF,
35e1cfe1c9SJoseph Chen 	ROCKCHIP_SYSCON_PIPE_PHY1_GRF,
36e1cfe1c9SJoseph Chen 	ROCKCHIP_SYSCON_PIPE_PHY2_GRF,
3786b248b4SDamon Ding 	ROCKCHIP_SYSCON_VOP_GRF,
3886b248b4SDamon Ding 	ROCKCHIP_SYSCON_VO_GRF,
3956f7d184SJoseph Chen 	ROCKCHIP_SYSCON_IOC,
40*4ca69a29SDavid Wu 	ROCKCHIP_SYSCON_SDGMAC_GRF,
4126ad30e9SSimon Glass };
4226ad30e9SSimon Glass 
4326ad30e9SSimon Glass /* Standard Rockchip clock numbers */
4426ad30e9SSimon Glass enum rk_clk_id {
4526ad30e9SSimon Glass 	CLK_OSC,
4626ad30e9SSimon Glass 	CLK_ARM,
4726ad30e9SSimon Glass 	CLK_DDR,
4826ad30e9SSimon Glass 	CLK_CODEC,
4926ad30e9SSimon Glass 	CLK_GENERAL,
5026ad30e9SSimon Glass 	CLK_NEW,
5126ad30e9SSimon Glass 
5226ad30e9SSimon Glass 	CLK_COUNT,
5326ad30e9SSimon Glass };
5426ad30e9SSimon Glass 
552f0a72b1SElaine Zhang #define PLL(_type, _id, _con, _mode, _mshift,			\
562f0a72b1SElaine Zhang 		 _lshift, _pflags, _rtable)			\
572f0a72b1SElaine Zhang 	{							\
582f0a72b1SElaine Zhang 		.id		= _id,				\
592f0a72b1SElaine Zhang 		.type		= _type,			\
602f0a72b1SElaine Zhang 		.con_offset	= _con,				\
612f0a72b1SElaine Zhang 		.mode_offset	= _mode,			\
622f0a72b1SElaine Zhang 		.mode_shift	= _mshift,			\
632f0a72b1SElaine Zhang 		.lock_shift	= _lshift,			\
642f0a72b1SElaine Zhang 		.pll_flags	= _pflags,			\
652f0a72b1SElaine Zhang 		.rate_table	= _rtable,			\
662f0a72b1SElaine Zhang 	}
672f0a72b1SElaine Zhang 
682f0a72b1SElaine Zhang #define RK3036_PLL_RATE(_rate, _refdiv, _fbdiv, _postdiv1,	\
692f0a72b1SElaine Zhang 			_postdiv2, _dsmpd, _frac)		\
702f0a72b1SElaine Zhang {								\
712f0a72b1SElaine Zhang 	.rate	= _rate##U,					\
722f0a72b1SElaine Zhang 	.fbdiv = _fbdiv,					\
732f0a72b1SElaine Zhang 	.postdiv1 = _postdiv1,					\
742f0a72b1SElaine Zhang 	.refdiv = _refdiv,					\
752f0a72b1SElaine Zhang 	.postdiv2 = _postdiv2,					\
762f0a72b1SElaine Zhang 	.dsmpd = _dsmpd,					\
772f0a72b1SElaine Zhang 	.frac = _frac,						\
782f0a72b1SElaine Zhang }
792f0a72b1SElaine Zhang 
80a962a5fdSElaine Zhang #define RK3588_PLL_RATE(_rate, _p, _m, _s, _k)			\
81a962a5fdSElaine Zhang {								\
82a962a5fdSElaine Zhang 	.rate	= _rate##U,					\
83a962a5fdSElaine Zhang 	.p = _p,						\
84a962a5fdSElaine Zhang 	.m = _m,						\
85a962a5fdSElaine Zhang 	.s = _s,						\
86a962a5fdSElaine Zhang 	.k = _k,						\
87a962a5fdSElaine Zhang }
88a962a5fdSElaine Zhang 
892f0a72b1SElaine Zhang struct rockchip_pll_rate_table {
902f0a72b1SElaine Zhang 	unsigned long rate;
912f0a72b1SElaine Zhang 	unsigned int nr;
922f0a72b1SElaine Zhang 	unsigned int nf;
932f0a72b1SElaine Zhang 	unsigned int no;
942f0a72b1SElaine Zhang 	unsigned int nb;
952f0a72b1SElaine Zhang 	/* for RK3036/RK3399 */
962f0a72b1SElaine Zhang 	unsigned int fbdiv;
972f0a72b1SElaine Zhang 	unsigned int postdiv1;
982f0a72b1SElaine Zhang 	unsigned int refdiv;
992f0a72b1SElaine Zhang 	unsigned int postdiv2;
1002f0a72b1SElaine Zhang 	unsigned int dsmpd;
1012f0a72b1SElaine Zhang 	unsigned int frac;
102a962a5fdSElaine Zhang 	/* for RK3588 */
103a962a5fdSElaine Zhang 	unsigned int m;
104a962a5fdSElaine Zhang 	unsigned int p;
105a962a5fdSElaine Zhang 	unsigned int s;
106a962a5fdSElaine Zhang 	unsigned int k;
1072f0a72b1SElaine Zhang };
1082f0a72b1SElaine Zhang 
1092f0a72b1SElaine Zhang enum rockchip_pll_type {
1102f0a72b1SElaine Zhang 	pll_rk3036,
1112f0a72b1SElaine Zhang 	pll_rk3066,
1122f0a72b1SElaine Zhang 	pll_rk3328,
1132f0a72b1SElaine Zhang 	pll_rk3366,
1142f0a72b1SElaine Zhang 	pll_rk3399,
115a962a5fdSElaine Zhang 	pll_rk3588,
1162f0a72b1SElaine Zhang };
1172f0a72b1SElaine Zhang 
1182f0a72b1SElaine Zhang struct rockchip_pll_clock {
1192f0a72b1SElaine Zhang 	unsigned int			id;
1202f0a72b1SElaine Zhang 	unsigned int			con_offset;
1212f0a72b1SElaine Zhang 	unsigned int			mode_offset;
1222f0a72b1SElaine Zhang 	unsigned int			mode_shift;
1232f0a72b1SElaine Zhang 	unsigned int			lock_shift;
1242f0a72b1SElaine Zhang 	enum rockchip_pll_type		type;
1252f0a72b1SElaine Zhang 	unsigned int			pll_flags;
1262f0a72b1SElaine Zhang 	struct rockchip_pll_rate_table *rate_table;
1272f0a72b1SElaine Zhang 	unsigned int			mode_mask;
1282f0a72b1SElaine Zhang };
1292f0a72b1SElaine Zhang 
1302f0a72b1SElaine Zhang struct rockchip_cpu_rate_table {
1312f0a72b1SElaine Zhang 	unsigned long rate;
1322f0a72b1SElaine Zhang 	unsigned int aclk_div;
1332f0a72b1SElaine Zhang 	unsigned int pclk_div;
1342f0a72b1SElaine Zhang };
1352f0a72b1SElaine Zhang 
1367d793375SElaine Zhang #ifdef CONFIG_ROCKCHIP_IMAGE_TINY
rockchip_pll_get_rate(struct rockchip_pll_clock * pll,void __iomem * base,ulong pll_id)1377d793375SElaine Zhang static inline ulong rockchip_pll_get_rate(struct rockchip_pll_clock *pll,
1387d793375SElaine Zhang 					  void __iomem *base,
1397d793375SElaine Zhang 					  ulong pll_id)
1407d793375SElaine Zhang {
1417d793375SElaine Zhang 	return 0;
1427d793375SElaine Zhang }
1437d793375SElaine Zhang 
rockchip_pll_set_rate(struct rockchip_pll_clock * pll,void __iomem * base,ulong pll_id,ulong drate)1447d793375SElaine Zhang static inline int rockchip_pll_set_rate(struct rockchip_pll_clock *pll,
1457d793375SElaine Zhang 					void __iomem *base, ulong pll_id,
1467d793375SElaine Zhang 					ulong drate)
1477d793375SElaine Zhang {
1487d793375SElaine Zhang 	return 0;
1497d793375SElaine Zhang }
1507d793375SElaine Zhang 
1517d793375SElaine Zhang static inline const struct rockchip_cpu_rate_table *
rockchip_get_cpu_settings(struct rockchip_cpu_rate_table * cpu_table,ulong rate)1527d793375SElaine Zhang rockchip_get_cpu_settings(struct rockchip_cpu_rate_table *cpu_table,
1537d793375SElaine Zhang 			  ulong rate)
1547d793375SElaine Zhang {
1557d793375SElaine Zhang 	return NULL;
1567d793375SElaine Zhang }
1577d793375SElaine Zhang #else
1582f0a72b1SElaine Zhang int rockchip_pll_set_rate(struct rockchip_pll_clock *pll,
1592f0a72b1SElaine Zhang 			  void __iomem *base, ulong clk_id,
1602f0a72b1SElaine Zhang 			  ulong drate);
1612f0a72b1SElaine Zhang ulong rockchip_pll_get_rate(struct rockchip_pll_clock *pll,
1622f0a72b1SElaine Zhang 			    void __iomem *base, ulong clk_id);
1632f0a72b1SElaine Zhang const struct rockchip_cpu_rate_table *
1642f0a72b1SElaine Zhang rockchip_get_cpu_settings(struct rockchip_cpu_rate_table *cpu_table,
1652f0a72b1SElaine Zhang 			  ulong rate);
1667d793375SElaine Zhang #endif
1672f0a72b1SElaine Zhang 
rk_pll_id(enum rk_clk_id clk_id)16826ad30e9SSimon Glass static inline int rk_pll_id(enum rk_clk_id clk_id)
16926ad30e9SSimon Glass {
17026ad30e9SSimon Glass 	return clk_id - 1;
17126ad30e9SSimon Glass }
17226ad30e9SSimon Glass 
173116397d6SKever Yang struct sysreset_reg {
174116397d6SKever Yang 	unsigned int glb_srst_fst_value;
175116397d6SKever Yang 	unsigned int glb_srst_snd_value;
176116397d6SKever Yang };
177116397d6SKever Yang 
1783d555d75SElaine Zhang struct softreset_reg {
1793d555d75SElaine Zhang 	void __iomem *base;
1803d555d75SElaine Zhang 	unsigned int sf_reset_offset;
1813d555d75SElaine Zhang 	unsigned int sf_reset_num;
1823d555d75SElaine Zhang };
1833d555d75SElaine Zhang 
18426ad30e9SSimon Glass /**
1851b2fd5bfSSimon Glass  * clk_get_divisor() - Calculate the required clock divisior
1861b2fd5bfSSimon Glass  *
1871b2fd5bfSSimon Glass  * Given an input rate and a required output_rate, calculate the Rockchip
1881b2fd5bfSSimon Glass  * divisor needed to achieve this.
1891b2fd5bfSSimon Glass  *
1901b2fd5bfSSimon Glass  * @input_rate:		Input clock rate in Hz
1911b2fd5bfSSimon Glass  * @output_rate:	Output clock rate in Hz
1921b2fd5bfSSimon Glass  * @return divisor register value to use
1931b2fd5bfSSimon Glass  */
clk_get_divisor(ulong input_rate,uint output_rate)1941b2fd5bfSSimon Glass static inline u32 clk_get_divisor(ulong input_rate, uint output_rate)
1951b2fd5bfSSimon Glass {
1961b2fd5bfSSimon Glass 	uint clk_div;
1971b2fd5bfSSimon Glass 
1981b2fd5bfSSimon Glass 	clk_div = input_rate / output_rate;
1991b2fd5bfSSimon Glass 	clk_div = (clk_div + 1) & 0xfffe;
2001b2fd5bfSSimon Glass 
2011b2fd5bfSSimon Glass 	return clk_div;
2021b2fd5bfSSimon Glass }
2031b2fd5bfSSimon Glass 
2041b2fd5bfSSimon Glass /**
20526ad30e9SSimon Glass  * rockchip_get_cru() - get a pointer to the clock/reset unit registers
20626ad30e9SSimon Glass  *
20726ad30e9SSimon Glass  * @return pointer to registers, or -ve error on error
20826ad30e9SSimon Glass  */
20926ad30e9SSimon Glass void *rockchip_get_cru(void);
21026ad30e9SSimon Glass 
2115ae2fd97SKever Yang /**
2125ae2fd97SKever Yang  * rockchip_get_pmucru() - get a pointer to the clock/reset unit registers
2135ae2fd97SKever Yang  *
2145ae2fd97SKever Yang  * @return pointer to registers, or -ve error on error
2155ae2fd97SKever Yang  */
2165ae2fd97SKever Yang void *rockchip_get_pmucru(void);
2175ae2fd97SKever Yang 
218dae594f2SSimon Glass struct rk3288_cru;
219dae594f2SSimon Glass struct rk3288_grf;
220dae594f2SSimon Glass 
221b339b5dbSHeiko Stübner void rk3288_clk_configure_cpu(struct rk3288_cru *cru, struct rk3288_grf *grf);
222dae594f2SSimon Glass 
223a617c5d3SSimon Glass int rockchip_get_clk(struct udevice **devp);
224a617c5d3SSimon Glass 
22560410d28SElaine Zhang int rockchip_get_scmi_clk(struct udevice **devp);
22660410d28SElaine Zhang 
22726ad30e9SSimon Glass #endif
228