1*83d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+
26a3e4274SMasahiro Yamada /*
36a3e4274SMasahiro Yamada  * Copyright (C) 2013-2014 Panasonic Corporation
46a3e4274SMasahiro Yamada  * Copyright (C) 2015-2016 Socionext Inc.
56a3e4274SMasahiro Yamada  */
66a3e4274SMasahiro Yamada 
7d9a70368SMasahiro Yamada #include <linux/delay.h>
86a3e4274SMasahiro Yamada #include <linux/io.h>
96a3e4274SMasahiro Yamada 
106a3e4274SMasahiro Yamada #include "../init.h"
116a3e4274SMasahiro Yamada #include "../sc-regs.h"
126a3e4274SMasahiro Yamada #include "../sg-regs.h"
136a3e4274SMasahiro Yamada #include "pll.h"
146a3e4274SMasahiro Yamada 
upll_init(void)156a3e4274SMasahiro Yamada static void upll_init(void)
166a3e4274SMasahiro Yamada {
176a3e4274SMasahiro Yamada 	u32 tmp, clk_mode_upll, clk_mode_axosel;
186a3e4274SMasahiro Yamada 
196a3e4274SMasahiro Yamada 	tmp = readl(SG_PINMON0);
206a3e4274SMasahiro Yamada 	clk_mode_upll   = tmp & SG_PINMON0_CLK_MODE_UPLLSRC_MASK;
216a3e4274SMasahiro Yamada 	clk_mode_axosel = tmp & SG_PINMON0_CLK_MODE_AXOSEL_MASK;
226a3e4274SMasahiro Yamada 
236a3e4274SMasahiro Yamada 	/* set 0 to SNRT(UPLLCTRL.bit28) and K_LD(UPLLCTRL.bit[27]) */
246a3e4274SMasahiro Yamada 	tmp = readl(SC_UPLLCTRL);
256a3e4274SMasahiro Yamada 	tmp &= ~0x18000000;
266a3e4274SMasahiro Yamada 	writel(tmp, SC_UPLLCTRL);
276a3e4274SMasahiro Yamada 
286a3e4274SMasahiro Yamada 	if (clk_mode_upll == SG_PINMON0_CLK_MODE_UPLLSRC_DEFAULT) {
296a3e4274SMasahiro Yamada 		if (clk_mode_axosel == SG_PINMON0_CLK_MODE_AXOSEL_25000KHZ_U ||
306a3e4274SMasahiro Yamada 		    clk_mode_axosel == SG_PINMON0_CLK_MODE_AXOSEL_25000KHZ_A) {
316a3e4274SMasahiro Yamada 			/* AXO: 25MHz */
326a3e4274SMasahiro Yamada 			tmp &= ~0x07ffffff;
336a3e4274SMasahiro Yamada 			tmp |= 0x0228f5c0;
346a3e4274SMasahiro Yamada 		} else {
356a3e4274SMasahiro Yamada 			/* AXO: default 24.576MHz */
366a3e4274SMasahiro Yamada 			tmp &= ~0x07ffffff;
376a3e4274SMasahiro Yamada 			tmp |= 0x02328000;
386a3e4274SMasahiro Yamada 		}
396a3e4274SMasahiro Yamada 	}
406a3e4274SMasahiro Yamada 
416a3e4274SMasahiro Yamada 	writel(tmp, SC_UPLLCTRL);
426a3e4274SMasahiro Yamada 
436a3e4274SMasahiro Yamada 	/* set 1 to K_LD(UPLLCTRL.bit[27]) */
446a3e4274SMasahiro Yamada 	tmp |= 0x08000000;
456a3e4274SMasahiro Yamada 	writel(tmp, SC_UPLLCTRL);
466a3e4274SMasahiro Yamada 
476a3e4274SMasahiro Yamada 	/* wait 10 usec */
486a3e4274SMasahiro Yamada 	udelay(10);
496a3e4274SMasahiro Yamada 
506a3e4274SMasahiro Yamada 	/* set 1 to SNRT(UPLLCTRL.bit[28]) */
516a3e4274SMasahiro Yamada 	tmp |= 0x10000000;
526a3e4274SMasahiro Yamada 	writel(tmp, SC_UPLLCTRL);
536a3e4274SMasahiro Yamada }
546a3e4274SMasahiro Yamada 
vpll_init(void)556a3e4274SMasahiro Yamada static void vpll_init(void)
566a3e4274SMasahiro Yamada {
576a3e4274SMasahiro Yamada 	u32 tmp, clk_mode_axosel;
586a3e4274SMasahiro Yamada 
596a3e4274SMasahiro Yamada 	tmp = readl(SG_PINMON0);
606a3e4274SMasahiro Yamada 	clk_mode_axosel = tmp & SG_PINMON0_CLK_MODE_AXOSEL_MASK;
616a3e4274SMasahiro Yamada 
626a3e4274SMasahiro Yamada 	/* set 1 to VPLA27WP and VPLA27WP */
636a3e4274SMasahiro Yamada 	tmp = readl(SC_VPLL27ACTRL);
646a3e4274SMasahiro Yamada 	tmp |= 0x00000001;
656a3e4274SMasahiro Yamada 	writel(tmp, SC_VPLL27ACTRL);
666a3e4274SMasahiro Yamada 	tmp = readl(SC_VPLL27BCTRL);
676a3e4274SMasahiro Yamada 	tmp |= 0x00000001;
686a3e4274SMasahiro Yamada 	writel(tmp, SC_VPLL27BCTRL);
696a3e4274SMasahiro Yamada 
706a3e4274SMasahiro Yamada 	/* Set 0 to VPLA_K_LD and VPLB_K_LD */
716a3e4274SMasahiro Yamada 	tmp = readl(SC_VPLL27ACTRL3);
726a3e4274SMasahiro Yamada 	tmp &= ~0x10000000;
736a3e4274SMasahiro Yamada 	writel(tmp, SC_VPLL27ACTRL3);
746a3e4274SMasahiro Yamada 	tmp = readl(SC_VPLL27BCTRL3);
756a3e4274SMasahiro Yamada 	tmp &= ~0x10000000;
766a3e4274SMasahiro Yamada 	writel(tmp, SC_VPLL27BCTRL3);
776a3e4274SMasahiro Yamada 
786a3e4274SMasahiro Yamada 	/* Set 0 to VPLA_SNRST and VPLB_SNRST */
796a3e4274SMasahiro Yamada 	tmp = readl(SC_VPLL27ACTRL2);
806a3e4274SMasahiro Yamada 	tmp &= ~0x10000000;
816a3e4274SMasahiro Yamada 	writel(tmp, SC_VPLL27ACTRL2);
826a3e4274SMasahiro Yamada 	tmp = readl(SC_VPLL27BCTRL2);
836a3e4274SMasahiro Yamada 	tmp &= ~0x10000000;
846a3e4274SMasahiro Yamada 	writel(tmp, SC_VPLL27BCTRL2);
856a3e4274SMasahiro Yamada 
866a3e4274SMasahiro Yamada 	/* Set 0x20 to VPLA_SNRST and VPLB_SNRST */
876a3e4274SMasahiro Yamada 	tmp = readl(SC_VPLL27ACTRL2);
886a3e4274SMasahiro Yamada 	tmp &= ~0x0000007f;
896a3e4274SMasahiro Yamada 	tmp |= 0x00000020;
906a3e4274SMasahiro Yamada 	writel(tmp, SC_VPLL27ACTRL2);
916a3e4274SMasahiro Yamada 	tmp = readl(SC_VPLL27BCTRL2);
926a3e4274SMasahiro Yamada 	tmp &= ~0x0000007f;
936a3e4274SMasahiro Yamada 	tmp |= 0x00000020;
946a3e4274SMasahiro Yamada 	writel(tmp, SC_VPLL27BCTRL2);
956a3e4274SMasahiro Yamada 
966a3e4274SMasahiro Yamada 	if (clk_mode_axosel == SG_PINMON0_CLK_MODE_AXOSEL_25000KHZ_U ||
976a3e4274SMasahiro Yamada 	    clk_mode_axosel == SG_PINMON0_CLK_MODE_AXOSEL_25000KHZ_A) {
986a3e4274SMasahiro Yamada 		/* AXO: 25MHz */
996a3e4274SMasahiro Yamada 		tmp = readl(SC_VPLL27ACTRL3);
1006a3e4274SMasahiro Yamada 		tmp &= ~0x000fffff;
1016a3e4274SMasahiro Yamada 		tmp |= 0x00066664;
1026a3e4274SMasahiro Yamada 		writel(tmp, SC_VPLL27ACTRL3);
1036a3e4274SMasahiro Yamada 		tmp = readl(SC_VPLL27BCTRL3);
1046a3e4274SMasahiro Yamada 		tmp &= ~0x000fffff;
1056a3e4274SMasahiro Yamada 		tmp |= 0x00066664;
1066a3e4274SMasahiro Yamada 		writel(tmp, SC_VPLL27BCTRL3);
1076a3e4274SMasahiro Yamada 	} else {
1086a3e4274SMasahiro Yamada 		/* AXO: default 24.576MHz */
1096a3e4274SMasahiro Yamada 		tmp = readl(SC_VPLL27ACTRL3);
1106a3e4274SMasahiro Yamada 		tmp &= ~0x000fffff;
1116a3e4274SMasahiro Yamada 		tmp |= 0x000f5800;
1126a3e4274SMasahiro Yamada 		writel(tmp, SC_VPLL27ACTRL3);
1136a3e4274SMasahiro Yamada 		tmp = readl(SC_VPLL27BCTRL3);
1146a3e4274SMasahiro Yamada 		tmp &= ~0x000fffff;
1156a3e4274SMasahiro Yamada 		tmp |= 0x000f5800;
1166a3e4274SMasahiro Yamada 		writel(tmp, SC_VPLL27BCTRL3);
1176a3e4274SMasahiro Yamada 	}
1186a3e4274SMasahiro Yamada 
1196a3e4274SMasahiro Yamada 	/* Set 1 to VPLA_K_LD and VPLB_K_LD */
1206a3e4274SMasahiro Yamada 	tmp = readl(SC_VPLL27ACTRL3);
1216a3e4274SMasahiro Yamada 	tmp |= 0x10000000;
1226a3e4274SMasahiro Yamada 	writel(tmp, SC_VPLL27ACTRL3);
1236a3e4274SMasahiro Yamada 	tmp = readl(SC_VPLL27BCTRL3);
1246a3e4274SMasahiro Yamada 	tmp |= 0x10000000;
1256a3e4274SMasahiro Yamada 	writel(tmp, SC_VPLL27BCTRL3);
1266a3e4274SMasahiro Yamada 
1276a3e4274SMasahiro Yamada 	/* wait 10 usec */
1286a3e4274SMasahiro Yamada 	udelay(10);
1296a3e4274SMasahiro Yamada 
1306a3e4274SMasahiro Yamada 	/* Set 0 to VPLA_SNRST and VPLB_SNRST */
1316a3e4274SMasahiro Yamada 	tmp = readl(SC_VPLL27ACTRL2);
1326a3e4274SMasahiro Yamada 	tmp |= 0x10000000;
1336a3e4274SMasahiro Yamada 	writel(tmp, SC_VPLL27ACTRL2);
1346a3e4274SMasahiro Yamada 	tmp = readl(SC_VPLL27BCTRL2);
1356a3e4274SMasahiro Yamada 	tmp |= 0x10000000;
1366a3e4274SMasahiro Yamada 	writel(tmp, SC_VPLL27BCTRL2);
1376a3e4274SMasahiro Yamada 
1386a3e4274SMasahiro Yamada 	/* set 0 to VPLA27WP and VPLA27WP */
1396a3e4274SMasahiro Yamada 	tmp = readl(SC_VPLL27ACTRL);
1406a3e4274SMasahiro Yamada 	tmp &= ~0x00000001;
1416a3e4274SMasahiro Yamada 	writel(tmp, SC_VPLL27ACTRL);
1426a3e4274SMasahiro Yamada 	tmp = readl(SC_VPLL27BCTRL);
1436a3e4274SMasahiro Yamada 	tmp |= ~0x00000001;
1446a3e4274SMasahiro Yamada 	writel(tmp, SC_VPLL27BCTRL);
1456a3e4274SMasahiro Yamada }
1466a3e4274SMasahiro Yamada 
uniphier_ld4_pll_init(void)1476a3e4274SMasahiro Yamada void uniphier_ld4_pll_init(void)
1486a3e4274SMasahiro Yamada {
1496a3e4274SMasahiro Yamada 	upll_init();
1506a3e4274SMasahiro Yamada 	vpll_init();
1516a3e4274SMasahiro Yamada 	uniphier_ld4_dpll_ssc_en();
1526a3e4274SMasahiro Yamada }
153