1 // SPDX-License-Identifier: GPL-2.0+
3 * Copyright (C) 2013-2014 Panasonic Corporation
4 * Copyright (C) 2015-2016 Socionext Inc.
7 #include <linux/delay.h>
11 #include "../sc-regs.h"
12 #include "../sg-regs.h"
15 static void vpll_init(void)
17 u32 tmp, clk_mode_axosel;
19 /* Set VPLL27A & VPLL27B */
20 tmp = readl(sg_base + SG_PINMON0);
21 clk_mode_axosel = tmp & SG_PINMON0_CLK_MODE_AXOSEL_MASK;
23 /* 25MHz or 6.25MHz is default for Pro4R, no need to set VPLLA/B */
24 if (clk_mode_axosel == SG_PINMON0_CLK_MODE_AXOSEL_25000KHZ ||
25 clk_mode_axosel == SG_PINMON0_CLK_MODE_AXOSEL_6250KHZ)
28 /* Disable write protect of VPLL27ACTRL[2-7]*, VPLL27BCTRL[2-8] */
29 tmp = readl(SC_VPLL27ACTRL);
31 writel(tmp, SC_VPLL27ACTRL);
32 tmp = readl(SC_VPLL27BCTRL);
34 writel(tmp, SC_VPLL27BCTRL);
36 /* Unset VPLA_K_LD and VPLB_K_LD bit */
37 tmp = readl(SC_VPLL27ACTRL3);
39 writel(tmp, SC_VPLL27ACTRL3);
40 tmp = readl(SC_VPLL27BCTRL3);
42 writel(tmp, SC_VPLL27BCTRL3);
44 /* Set VPLA_M and VPLB_M to 0x20 */
45 tmp = readl(SC_VPLL27ACTRL2);
48 writel(tmp, SC_VPLL27ACTRL2);
49 tmp = readl(SC_VPLL27BCTRL2);
52 writel(tmp, SC_VPLL27BCTRL2);
54 if (clk_mode_axosel == SG_PINMON0_CLK_MODE_AXOSEL_25000KHZ ||
55 clk_mode_axosel == SG_PINMON0_CLK_MODE_AXOSEL_6250KHZ) {
56 /* Set VPLA_K and VPLB_K for AXO: 25MHz */
57 tmp = readl(SC_VPLL27ACTRL3);
60 writel(tmp, SC_VPLL27ACTRL3);
61 tmp = readl(SC_VPLL27BCTRL3);
64 writel(tmp, SC_VPLL27BCTRL3);
66 /* Set VPLA_K and VPLB_K for AXO: 24.576 MHz */
67 tmp = readl(SC_VPLL27ACTRL3);
70 writel(tmp, SC_VPLL27ACTRL3);
71 tmp = readl(SC_VPLL27BCTRL3);
74 writel(tmp, SC_VPLL27BCTRL3);
80 /* Set VPLA_K_LD and VPLB_K_LD to load K parameters */
81 tmp = readl(SC_VPLL27ACTRL3);
83 writel(tmp, SC_VPLL27ACTRL3);
84 tmp = readl(SC_VPLL27BCTRL3);
86 writel(tmp, SC_VPLL27BCTRL3);
88 /* Unset VPLA_SNRST and VPLB_SNRST bit */
89 tmp = readl(SC_VPLL27ACTRL2);
91 writel(tmp, SC_VPLL27ACTRL2);
92 tmp = readl(SC_VPLL27BCTRL2);
94 writel(tmp, SC_VPLL27BCTRL2);
96 /* Enable write protect of VPLL27ACTRL[2-7]*, VPLL27BCTRL[2-8] */
97 tmp = readl(SC_VPLL27ACTRL);
99 writel(tmp, SC_VPLL27ACTRL);
100 tmp = readl(SC_VPLL27BCTRL);
102 writel(tmp, SC_VPLL27BCTRL);
105 void uniphier_pro4_pll_init(void)
108 uniphier_ld4_dpll_ssc_en();