1 // SPDX-License-Identifier: GPL-2.0+ 2 /* 3 * Copyright (C) 2013-2014 Panasonic Corporation 4 * Copyright (C) 2015-2016 Socionext Inc. 5 */ 6 7 #include <linux/delay.h> 8 #include <linux/io.h> 9 10 #include "../init.h" 11 #include "../sc-regs.h" 12 #include "../sg-regs.h" 13 #include "pll.h" 14 15 static void upll_init(void) 16 { 17 u32 tmp, clk_mode_upll, clk_mode_axosel; 18 19 tmp = readl(SG_PINMON0); 20 clk_mode_upll = tmp & SG_PINMON0_CLK_MODE_UPLLSRC_MASK; 21 clk_mode_axosel = tmp & SG_PINMON0_CLK_MODE_AXOSEL_MASK; 22 23 /* set 0 to SNRT(UPLLCTRL.bit28) and K_LD(UPLLCTRL.bit[27]) */ 24 tmp = readl(SC_UPLLCTRL); 25 tmp &= ~0x18000000; 26 writel(tmp, SC_UPLLCTRL); 27 28 if (clk_mode_upll == SG_PINMON0_CLK_MODE_UPLLSRC_DEFAULT) { 29 if (clk_mode_axosel == SG_PINMON0_CLK_MODE_AXOSEL_25000KHZ_U || 30 clk_mode_axosel == SG_PINMON0_CLK_MODE_AXOSEL_25000KHZ_A) { 31 /* AXO: 25MHz */ 32 tmp &= ~0x07ffffff; 33 tmp |= 0x0228f5c0; 34 } else { 35 /* AXO: default 24.576MHz */ 36 tmp &= ~0x07ffffff; 37 tmp |= 0x02328000; 38 } 39 } 40 41 writel(tmp, SC_UPLLCTRL); 42 43 /* set 1 to K_LD(UPLLCTRL.bit[27]) */ 44 tmp |= 0x08000000; 45 writel(tmp, SC_UPLLCTRL); 46 47 /* wait 10 usec */ 48 udelay(10); 49 50 /* set 1 to SNRT(UPLLCTRL.bit[28]) */ 51 tmp |= 0x10000000; 52 writel(tmp, SC_UPLLCTRL); 53 } 54 55 static void vpll_init(void) 56 { 57 u32 tmp, clk_mode_axosel; 58 59 tmp = readl(SG_PINMON0); 60 clk_mode_axosel = tmp & SG_PINMON0_CLK_MODE_AXOSEL_MASK; 61 62 /* set 1 to VPLA27WP and VPLA27WP */ 63 tmp = readl(SC_VPLL27ACTRL); 64 tmp |= 0x00000001; 65 writel(tmp, SC_VPLL27ACTRL); 66 tmp = readl(SC_VPLL27BCTRL); 67 tmp |= 0x00000001; 68 writel(tmp, SC_VPLL27BCTRL); 69 70 /* Set 0 to VPLA_K_LD and VPLB_K_LD */ 71 tmp = readl(SC_VPLL27ACTRL3); 72 tmp &= ~0x10000000; 73 writel(tmp, SC_VPLL27ACTRL3); 74 tmp = readl(SC_VPLL27BCTRL3); 75 tmp &= ~0x10000000; 76 writel(tmp, SC_VPLL27BCTRL3); 77 78 /* Set 0 to VPLA_SNRST and VPLB_SNRST */ 79 tmp = readl(SC_VPLL27ACTRL2); 80 tmp &= ~0x10000000; 81 writel(tmp, SC_VPLL27ACTRL2); 82 tmp = readl(SC_VPLL27BCTRL2); 83 tmp &= ~0x10000000; 84 writel(tmp, SC_VPLL27BCTRL2); 85 86 /* Set 0x20 to VPLA_SNRST and VPLB_SNRST */ 87 tmp = readl(SC_VPLL27ACTRL2); 88 tmp &= ~0x0000007f; 89 tmp |= 0x00000020; 90 writel(tmp, SC_VPLL27ACTRL2); 91 tmp = readl(SC_VPLL27BCTRL2); 92 tmp &= ~0x0000007f; 93 tmp |= 0x00000020; 94 writel(tmp, SC_VPLL27BCTRL2); 95 96 if (clk_mode_axosel == SG_PINMON0_CLK_MODE_AXOSEL_25000KHZ_U || 97 clk_mode_axosel == SG_PINMON0_CLK_MODE_AXOSEL_25000KHZ_A) { 98 /* AXO: 25MHz */ 99 tmp = readl(SC_VPLL27ACTRL3); 100 tmp &= ~0x000fffff; 101 tmp |= 0x00066664; 102 writel(tmp, SC_VPLL27ACTRL3); 103 tmp = readl(SC_VPLL27BCTRL3); 104 tmp &= ~0x000fffff; 105 tmp |= 0x00066664; 106 writel(tmp, SC_VPLL27BCTRL3); 107 } else { 108 /* AXO: default 24.576MHz */ 109 tmp = readl(SC_VPLL27ACTRL3); 110 tmp &= ~0x000fffff; 111 tmp |= 0x000f5800; 112 writel(tmp, SC_VPLL27ACTRL3); 113 tmp = readl(SC_VPLL27BCTRL3); 114 tmp &= ~0x000fffff; 115 tmp |= 0x000f5800; 116 writel(tmp, SC_VPLL27BCTRL3); 117 } 118 119 /* Set 1 to VPLA_K_LD and VPLB_K_LD */ 120 tmp = readl(SC_VPLL27ACTRL3); 121 tmp |= 0x10000000; 122 writel(tmp, SC_VPLL27ACTRL3); 123 tmp = readl(SC_VPLL27BCTRL3); 124 tmp |= 0x10000000; 125 writel(tmp, SC_VPLL27BCTRL3); 126 127 /* wait 10 usec */ 128 udelay(10); 129 130 /* Set 0 to VPLA_SNRST and VPLB_SNRST */ 131 tmp = readl(SC_VPLL27ACTRL2); 132 tmp |= 0x10000000; 133 writel(tmp, SC_VPLL27ACTRL2); 134 tmp = readl(SC_VPLL27BCTRL2); 135 tmp |= 0x10000000; 136 writel(tmp, SC_VPLL27BCTRL2); 137 138 /* set 0 to VPLA27WP and VPLA27WP */ 139 tmp = readl(SC_VPLL27ACTRL); 140 tmp &= ~0x00000001; 141 writel(tmp, SC_VPLL27ACTRL); 142 tmp = readl(SC_VPLL27BCTRL); 143 tmp |= ~0x00000001; 144 writel(tmp, SC_VPLL27BCTRL); 145 } 146 147 void uniphier_ld4_pll_init(void) 148 { 149 upll_init(); 150 vpll_init(); 151 uniphier_ld4_dpll_ssc_en(); 152 } 153