xref: /rk3399_rockchip-uboot/arch/arm/mach-uniphier/clk/pll-pro4.c (revision 0c9e85f67cd86d2d7a3424ea3ebff0e6db7a3915)
16a3e4274SMasahiro Yamada /*
26a3e4274SMasahiro Yamada  * Copyright (C) 2013-2014 Panasonic Corporation
36a3e4274SMasahiro Yamada  * Copyright (C) 2015-2016 Socionext Inc.
46a3e4274SMasahiro Yamada  *
56a3e4274SMasahiro Yamada  * SPDX-License-Identifier:	GPL-2.0+
66a3e4274SMasahiro Yamada  */
76a3e4274SMasahiro Yamada 
8*d9a70368SMasahiro Yamada #include <linux/delay.h>
96a3e4274SMasahiro Yamada #include <linux/io.h>
106a3e4274SMasahiro Yamada 
116a3e4274SMasahiro Yamada #include "../init.h"
126a3e4274SMasahiro Yamada #include "../sc-regs.h"
136a3e4274SMasahiro Yamada #include "../sg-regs.h"
146a3e4274SMasahiro Yamada #include "pll.h"
156a3e4274SMasahiro Yamada 
vpll_init(void)166a3e4274SMasahiro Yamada static void vpll_init(void)
176a3e4274SMasahiro Yamada {
186a3e4274SMasahiro Yamada 	u32 tmp, clk_mode_axosel;
196a3e4274SMasahiro Yamada 
206a3e4274SMasahiro Yamada 	/* Set VPLL27A &  VPLL27B */
216a3e4274SMasahiro Yamada 	tmp = readl(SG_PINMON0);
226a3e4274SMasahiro Yamada 	clk_mode_axosel = tmp & SG_PINMON0_CLK_MODE_AXOSEL_MASK;
236a3e4274SMasahiro Yamada 
246a3e4274SMasahiro Yamada 	/* 25MHz or 6.25MHz is default for Pro4R, no need to set VPLLA/B */
256a3e4274SMasahiro Yamada 	if (clk_mode_axosel == SG_PINMON0_CLK_MODE_AXOSEL_25000KHZ ||
266a3e4274SMasahiro Yamada 	    clk_mode_axosel == SG_PINMON0_CLK_MODE_AXOSEL_6250KHZ)
276a3e4274SMasahiro Yamada 		return;
286a3e4274SMasahiro Yamada 
296a3e4274SMasahiro Yamada 	/* Disable write protect of VPLL27ACTRL[2-7]*, VPLL27BCTRL[2-8] */
306a3e4274SMasahiro Yamada 	tmp = readl(SC_VPLL27ACTRL);
316a3e4274SMasahiro Yamada 	tmp |= 0x00000001;
326a3e4274SMasahiro Yamada 	writel(tmp, SC_VPLL27ACTRL);
336a3e4274SMasahiro Yamada 	tmp = readl(SC_VPLL27BCTRL);
346a3e4274SMasahiro Yamada 	tmp |= 0x00000001;
356a3e4274SMasahiro Yamada 	writel(tmp, SC_VPLL27BCTRL);
366a3e4274SMasahiro Yamada 
376a3e4274SMasahiro Yamada 	/* Unset VPLA_K_LD and VPLB_K_LD bit */
386a3e4274SMasahiro Yamada 	tmp = readl(SC_VPLL27ACTRL3);
396a3e4274SMasahiro Yamada 	tmp &= ~0x10000000;
406a3e4274SMasahiro Yamada 	writel(tmp, SC_VPLL27ACTRL3);
416a3e4274SMasahiro Yamada 	tmp = readl(SC_VPLL27BCTRL3);
426a3e4274SMasahiro Yamada 	tmp &= ~0x10000000;
436a3e4274SMasahiro Yamada 	writel(tmp, SC_VPLL27BCTRL3);
446a3e4274SMasahiro Yamada 
456a3e4274SMasahiro Yamada 	/* Set VPLA_M and VPLB_M to 0x20 */
466a3e4274SMasahiro Yamada 	tmp = readl(SC_VPLL27ACTRL2);
476a3e4274SMasahiro Yamada 	tmp &= ~0x0000007f;
486a3e4274SMasahiro Yamada 	tmp |= 0x00000020;
496a3e4274SMasahiro Yamada 	writel(tmp, SC_VPLL27ACTRL2);
506a3e4274SMasahiro Yamada 	tmp = readl(SC_VPLL27BCTRL2);
516a3e4274SMasahiro Yamada 	tmp &= ~0x0000007f;
526a3e4274SMasahiro Yamada 	tmp |= 0x00000020;
536a3e4274SMasahiro Yamada 	writel(tmp, SC_VPLL27BCTRL2);
546a3e4274SMasahiro Yamada 
556a3e4274SMasahiro Yamada 	if (clk_mode_axosel == SG_PINMON0_CLK_MODE_AXOSEL_25000KHZ ||
566a3e4274SMasahiro Yamada 	    clk_mode_axosel == SG_PINMON0_CLK_MODE_AXOSEL_6250KHZ) {
576a3e4274SMasahiro Yamada 		/* Set VPLA_K and VPLB_K for AXO: 25MHz */
586a3e4274SMasahiro Yamada 		tmp = readl(SC_VPLL27ACTRL3);
596a3e4274SMasahiro Yamada 		tmp &= ~0x000fffff;
606a3e4274SMasahiro Yamada 		tmp |= 0x00066666;
616a3e4274SMasahiro Yamada 		writel(tmp, SC_VPLL27ACTRL3);
626a3e4274SMasahiro Yamada 		tmp = readl(SC_VPLL27BCTRL3);
636a3e4274SMasahiro Yamada 		tmp &= ~0x000fffff;
646a3e4274SMasahiro Yamada 		tmp |= 0x00066666;
656a3e4274SMasahiro Yamada 		writel(tmp, SC_VPLL27BCTRL3);
666a3e4274SMasahiro Yamada 	} else {
676a3e4274SMasahiro Yamada 		/* Set VPLA_K and VPLB_K for AXO: 24.576 MHz */
686a3e4274SMasahiro Yamada 		tmp = readl(SC_VPLL27ACTRL3);
696a3e4274SMasahiro Yamada 		tmp &= ~0x000fffff;
706a3e4274SMasahiro Yamada 		tmp |= 0x000f5800;
716a3e4274SMasahiro Yamada 		writel(tmp, SC_VPLL27ACTRL3);
726a3e4274SMasahiro Yamada 		tmp = readl(SC_VPLL27BCTRL3);
736a3e4274SMasahiro Yamada 		tmp &= ~0x000fffff;
746a3e4274SMasahiro Yamada 		tmp |= 0x000f5800;
756a3e4274SMasahiro Yamada 		writel(tmp, SC_VPLL27BCTRL3);
766a3e4274SMasahiro Yamada 	}
776a3e4274SMasahiro Yamada 
786a3e4274SMasahiro Yamada 	/* wait 1 usec */
796a3e4274SMasahiro Yamada 	udelay(1);
806a3e4274SMasahiro Yamada 
816a3e4274SMasahiro Yamada 	/* Set VPLA_K_LD and VPLB_K_LD to load K parameters */
826a3e4274SMasahiro Yamada 	tmp = readl(SC_VPLL27ACTRL3);
836a3e4274SMasahiro Yamada 	tmp |= 0x10000000;
846a3e4274SMasahiro Yamada 	writel(tmp, SC_VPLL27ACTRL3);
856a3e4274SMasahiro Yamada 	tmp = readl(SC_VPLL27BCTRL3);
866a3e4274SMasahiro Yamada 	tmp |= 0x10000000;
876a3e4274SMasahiro Yamada 	writel(tmp, SC_VPLL27BCTRL3);
886a3e4274SMasahiro Yamada 
896a3e4274SMasahiro Yamada 	/* Unset VPLA_SNRST and VPLB_SNRST bit */
906a3e4274SMasahiro Yamada 	tmp = readl(SC_VPLL27ACTRL2);
916a3e4274SMasahiro Yamada 	tmp |= 0x10000000;
926a3e4274SMasahiro Yamada 	writel(tmp, SC_VPLL27ACTRL2);
936a3e4274SMasahiro Yamada 	tmp = readl(SC_VPLL27BCTRL2);
946a3e4274SMasahiro Yamada 	tmp |= 0x10000000;
956a3e4274SMasahiro Yamada 	writel(tmp, SC_VPLL27BCTRL2);
966a3e4274SMasahiro Yamada 
976a3e4274SMasahiro Yamada 	/* Enable write protect of VPLL27ACTRL[2-7]*, VPLL27BCTRL[2-8] */
986a3e4274SMasahiro Yamada 	tmp = readl(SC_VPLL27ACTRL);
996a3e4274SMasahiro Yamada 	tmp &= ~0x00000001;
1006a3e4274SMasahiro Yamada 	writel(tmp, SC_VPLL27ACTRL);
1016a3e4274SMasahiro Yamada 	tmp = readl(SC_VPLL27BCTRL);
1026a3e4274SMasahiro Yamada 	tmp &= ~0x00000001;
1036a3e4274SMasahiro Yamada 	writel(tmp, SC_VPLL27BCTRL);
1046a3e4274SMasahiro Yamada }
1056a3e4274SMasahiro Yamada 
uniphier_pro4_pll_init(void)1066a3e4274SMasahiro Yamada void uniphier_pro4_pll_init(void)
1076a3e4274SMasahiro Yamada {
1086a3e4274SMasahiro Yamada 	vpll_init();
1096a3e4274SMasahiro Yamada 	uniphier_ld4_dpll_ssc_en();
1106a3e4274SMasahiro Yamada }
111