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