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 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 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 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