1*0612538eSJari Sihvola /* SPDX-License-Identifier: MIT */ 2*0612538eSJari Sihvola /* 3*0612538eSJari Sihvola * StarFive JH7110 PLL Clock Generator Driver 4*0612538eSJari Sihvola * 5*0612538eSJari Sihvola * Copyright (C) 2022 Xingyu Wu <xingyu.wu@starfivetech.com> 6*0612538eSJari Sihvola */ 7*0612538eSJari Sihvola 8*0612538eSJari Sihvola #define PLL0_DACPD_SHIFT 24 9*0612538eSJari Sihvola #define PLL0_DACPD_MASK 0x1000000 10*0612538eSJari Sihvola #define PLL_0_DACPD_SHIFT 24 11*0612538eSJari Sihvola #define PLL_0_DACPD_MASK 0x1000000 12*0612538eSJari Sihvola 13*0612538eSJari Sihvola #define PLL0_DSMPD_SHIFT 25 14*0612538eSJari Sihvola #define PLL0_DSMPD_MASK 0x2000000 15*0612538eSJari Sihvola #define PLL0_FBDIV_SHIFT 0 16*0612538eSJari Sihvola #define PLL0_FBDIV_MASK 0xFFF 17*0612538eSJari Sihvola #define PLL0_FRAC_SHIFT 0 18*0612538eSJari Sihvola #define PLL0_FRAC_MASK 0xFFFFFF 19*0612538eSJari Sihvola #define PLL0_POSTDIV1_SHIFT 28 20*0612538eSJari Sihvola #define PLL0_POSTDIV1_MASK 0x30000000 21*0612538eSJari Sihvola #define PLL0_PREDIV_SHIFT 0 22*0612538eSJari Sihvola #define PLL0_PREDIV_MASK 0x3F 23*0612538eSJari Sihvola 24*0612538eSJari Sihvola #define PLL1_DACPD_SHIFT 15 25*0612538eSJari Sihvola #define PLL1_DACPD_MASK 0x8000 26*0612538eSJari Sihvola #define PLL1_DSMPD_SHIFT 16 27*0612538eSJari Sihvola #define PLL1_DSMPD_MASK 0x10000 28*0612538eSJari Sihvola #define PLL1_FBDIV_SHIFT 17 29*0612538eSJari Sihvola #define PLL1_FBDIV_MASK 0x1FFE0000 30*0612538eSJari Sihvola #define PLL1_FRAC_SHIFT 0 31*0612538eSJari Sihvola #define PLL1_FRAC_MASK 0xFFFFFF 32*0612538eSJari Sihvola #define PLL1_POSTDIV1_SHIFT 28 33*0612538eSJari Sihvola #define PLL1_POSTDIV1_MASK 0x30000000 34*0612538eSJari Sihvola #define PLL1_PREDIV_SHIFT 0 35*0612538eSJari Sihvola #define PLL1_PREDIV_MASK 0x3F 36*0612538eSJari Sihvola 37*0612538eSJari Sihvola #define PLL2_DACPD_SHIFT 15 38*0612538eSJari Sihvola #define PLL2_DACPD_MASK 0x8000 39*0612538eSJari Sihvola #define PLL2_DSMPD_SHIFT 16 40*0612538eSJari Sihvola #define PLL2_DSMPD_MASK 0x10000 41*0612538eSJari Sihvola #define PLL2_FBDIV_SHIFT 17 42*0612538eSJari Sihvola #define PLL2_FBDIV_MASK 0x1FFE0000 43*0612538eSJari Sihvola #define PLL2_FRAC_SHIFT 0 44*0612538eSJari Sihvola #define PLL2_FRAC_MASK 0xFFFFFF 45*0612538eSJari Sihvola #define PLL2_POSTDIV1_SHIFT 28 46*0612538eSJari Sihvola #define PLL2_POSTDIV1_MASK 0x30000000 47*0612538eSJari Sihvola #define PLL2_PREDIV_SHIFT 0 48*0612538eSJari Sihvola #define PLL2_PREDIV_MASK 0x3F 49*0612538eSJari Sihvola 50*0612538eSJari Sihvola #define FRAC_PATR_SIZE 1000 51*0612538eSJari Sihvola 52*0612538eSJari Sihvola struct jh7110_pll_syscon_value { 53*0612538eSJari Sihvola uint64_t freq; 54*0612538eSJari Sihvola uint32_t prediv; 55*0612538eSJari Sihvola uint32_t fbdiv; 56*0612538eSJari Sihvola uint32_t postdiv1; 57*0612538eSJari Sihvola uint32_t dacpd; 58*0612538eSJari Sihvola uint32_t dsmpd; 59*0612538eSJari Sihvola uint32_t frac; 60*0612538eSJari Sihvola }; 61*0612538eSJari Sihvola 62*0612538eSJari Sihvola enum starfive_pll0_freq_value { 63*0612538eSJari Sihvola PLL0_FREQ_375_VALUE = 375000000, 64*0612538eSJari Sihvola PLL0_FREQ_500_VALUE = 500000000, 65*0612538eSJari Sihvola PLL0_FREQ_625_VALUE = 625000000, 66*0612538eSJari Sihvola PLL0_FREQ_750_VALUE = 750000000, 67*0612538eSJari Sihvola PLL0_FREQ_875_VALUE = 875000000, 68*0612538eSJari Sihvola PLL0_FREQ_1000_VALUE = 1000000000, 69*0612538eSJari Sihvola PLL0_FREQ_1250_VALUE = 1250000000, 70*0612538eSJari Sihvola PLL0_FREQ_1375_VALUE = 1375000000, 71*0612538eSJari Sihvola PLL0_FREQ_1500_VALUE = 1500000000 72*0612538eSJari Sihvola }; 73*0612538eSJari Sihvola 74*0612538eSJari Sihvola enum starfive_pll0_freq { 75*0612538eSJari Sihvola PLL0_FREQ_375 = 0, 76*0612538eSJari Sihvola PLL0_FREQ_500, 77*0612538eSJari Sihvola PLL0_FREQ_625, 78*0612538eSJari Sihvola PLL0_FREQ_750, 79*0612538eSJari Sihvola PLL0_FREQ_875, 80*0612538eSJari Sihvola PLL0_FREQ_1000, 81*0612538eSJari Sihvola PLL0_FREQ_1250, 82*0612538eSJari Sihvola PLL0_FREQ_1375, 83*0612538eSJari Sihvola PLL0_FREQ_1500, 84*0612538eSJari Sihvola PLL0_FREQ_MAX = PLL0_FREQ_1500 85*0612538eSJari Sihvola }; 86*0612538eSJari Sihvola 87*0612538eSJari Sihvola enum starfive_pll1_freq_value { 88*0612538eSJari Sihvola PLL1_FREQ_1066_VALUE = 1066000000, 89*0612538eSJari Sihvola }; 90*0612538eSJari Sihvola 91*0612538eSJari Sihvola enum starfive_pll1_freq { 92*0612538eSJari Sihvola PLL1_FREQ_1066 = 0, 93*0612538eSJari Sihvola }; 94*0612538eSJari Sihvola 95*0612538eSJari Sihvola enum starfive_pll2_freq_value { 96*0612538eSJari Sihvola PLL2_FREQ_1188_VALUE = 1188000000, 97*0612538eSJari Sihvola PLL2_FREQ_12288_VALUE = 1228800000, 98*0612538eSJari Sihvola }; 99*0612538eSJari Sihvola 100*0612538eSJari Sihvola enum starfive_pll2_freq { 101*0612538eSJari Sihvola PLL2_FREQ_1188 = 0, 102*0612538eSJari Sihvola PLL2_FREQ_12288, 103*0612538eSJari Sihvola }; 104*0612538eSJari Sihvola 105*0612538eSJari Sihvola static const struct jh7110_pll_syscon_value 106*0612538eSJari Sihvola jh7110_pll0_syscon_freq[] = { 107*0612538eSJari Sihvola [PLL0_FREQ_375] = { 108*0612538eSJari Sihvola .freq = PLL0_FREQ_375_VALUE, 109*0612538eSJari Sihvola .prediv = 8, 110*0612538eSJari Sihvola .fbdiv = 125, 111*0612538eSJari Sihvola .postdiv1 = 1, 112*0612538eSJari Sihvola .dacpd = 1, 113*0612538eSJari Sihvola .dsmpd = 1, 114*0612538eSJari Sihvola }, 115*0612538eSJari Sihvola [PLL0_FREQ_500] = { 116*0612538eSJari Sihvola .freq = PLL0_FREQ_500_VALUE, 117*0612538eSJari Sihvola .prediv = 6, 118*0612538eSJari Sihvola .fbdiv = 125, 119*0612538eSJari Sihvola .postdiv1 = 1, 120*0612538eSJari Sihvola .dacpd = 1, 121*0612538eSJari Sihvola .dsmpd = 1, 122*0612538eSJari Sihvola }, 123*0612538eSJari Sihvola [PLL0_FREQ_625] = { 124*0612538eSJari Sihvola .freq = PLL0_FREQ_625_VALUE, 125*0612538eSJari Sihvola .prediv = 24, 126*0612538eSJari Sihvola .fbdiv = 625, 127*0612538eSJari Sihvola .postdiv1 = 1, 128*0612538eSJari Sihvola .dacpd = 1, 129*0612538eSJari Sihvola .dsmpd = 1, 130*0612538eSJari Sihvola }, 131*0612538eSJari Sihvola [PLL0_FREQ_750] = { 132*0612538eSJari Sihvola .freq = PLL0_FREQ_750_VALUE, 133*0612538eSJari Sihvola .prediv = 4, 134*0612538eSJari Sihvola .fbdiv = 125, 135*0612538eSJari Sihvola .postdiv1 = 1, 136*0612538eSJari Sihvola .dacpd = 1, 137*0612538eSJari Sihvola .dsmpd = 1, 138*0612538eSJari Sihvola }, 139*0612538eSJari Sihvola [PLL0_FREQ_875] = { 140*0612538eSJari Sihvola .freq = PLL0_FREQ_875_VALUE, 141*0612538eSJari Sihvola .prediv = 24, 142*0612538eSJari Sihvola .fbdiv = 875, 143*0612538eSJari Sihvola .postdiv1 = 1, 144*0612538eSJari Sihvola .dacpd = 1, 145*0612538eSJari Sihvola .dsmpd = 1, 146*0612538eSJari Sihvola }, 147*0612538eSJari Sihvola [PLL0_FREQ_1000] = { 148*0612538eSJari Sihvola .freq = PLL0_FREQ_1000_VALUE, 149*0612538eSJari Sihvola .prediv = 3, 150*0612538eSJari Sihvola .fbdiv = 125, 151*0612538eSJari Sihvola .postdiv1 = 1, 152*0612538eSJari Sihvola .dacpd = 1, 153*0612538eSJari Sihvola .dsmpd = 1, 154*0612538eSJari Sihvola }, 155*0612538eSJari Sihvola [PLL0_FREQ_1250] = { 156*0612538eSJari Sihvola .freq = PLL0_FREQ_1250_VALUE, 157*0612538eSJari Sihvola .prediv = 12, 158*0612538eSJari Sihvola .fbdiv = 625, 159*0612538eSJari Sihvola .postdiv1 = 1, 160*0612538eSJari Sihvola .dacpd = 1, 161*0612538eSJari Sihvola .dsmpd = 1, 162*0612538eSJari Sihvola }, 163*0612538eSJari Sihvola [PLL0_FREQ_1375] = { 164*0612538eSJari Sihvola .freq = PLL0_FREQ_1375_VALUE, 165*0612538eSJari Sihvola .prediv = 24, 166*0612538eSJari Sihvola .fbdiv = 1375, 167*0612538eSJari Sihvola .postdiv1 = 1, 168*0612538eSJari Sihvola .dacpd = 1, 169*0612538eSJari Sihvola .dsmpd = 1, 170*0612538eSJari Sihvola }, 171*0612538eSJari Sihvola [PLL0_FREQ_1500] = { 172*0612538eSJari Sihvola .freq = PLL0_FREQ_1500_VALUE, 173*0612538eSJari Sihvola .prediv = 2, 174*0612538eSJari Sihvola .fbdiv = 125, 175*0612538eSJari Sihvola .postdiv1 = 1, 176*0612538eSJari Sihvola .dacpd = 1, 177*0612538eSJari Sihvola .dsmpd = 1, 178*0612538eSJari Sihvola }, 179*0612538eSJari Sihvola }; 180*0612538eSJari Sihvola 181*0612538eSJari Sihvola static const struct jh7110_pll_syscon_value 182*0612538eSJari Sihvola jh7110_pll1_syscon_freq[] = { 183*0612538eSJari Sihvola [PLL1_FREQ_1066] = { 184*0612538eSJari Sihvola .freq = PLL1_FREQ_1066_VALUE, 185*0612538eSJari Sihvola .prediv = 12, 186*0612538eSJari Sihvola .fbdiv = 533, 187*0612538eSJari Sihvola .postdiv1 = 1, 188*0612538eSJari Sihvola .dacpd = 1, 189*0612538eSJari Sihvola .dsmpd = 1, 190*0612538eSJari Sihvola }, 191*0612538eSJari Sihvola }; 192*0612538eSJari Sihvola 193*0612538eSJari Sihvola static const struct jh7110_pll_syscon_value 194*0612538eSJari Sihvola jh7110_pll2_syscon_freq[] = { 195*0612538eSJari Sihvola [PLL2_FREQ_1188] = { 196*0612538eSJari Sihvola .freq = PLL2_FREQ_1188_VALUE, 197*0612538eSJari Sihvola .prediv = 2, 198*0612538eSJari Sihvola .fbdiv = 99, 199*0612538eSJari Sihvola .postdiv1 = 1, 200*0612538eSJari Sihvola .dacpd = 1, 201*0612538eSJari Sihvola .dsmpd = 1, 202*0612538eSJari Sihvola }, 203*0612538eSJari Sihvola [PLL2_FREQ_12288] = { 204*0612538eSJari Sihvola .freq = PLL2_FREQ_12288_VALUE, 205*0612538eSJari Sihvola .prediv = 5, 206*0612538eSJari Sihvola .fbdiv = 256, 207*0612538eSJari Sihvola .postdiv1 = 1, 208*0612538eSJari Sihvola .dacpd = 1, 209*0612538eSJari Sihvola .dsmpd = 1, 210*0612538eSJari Sihvola }, 211*0612538eSJari Sihvola }; 212