1*499c2713SBiju Das /* 2*499c2713SBiju Das * Copyright (c) 2015-2020, Renesas Electronics Corporation. All rights reserved. 3*499c2713SBiju Das * 4*499c2713SBiju Das * SPDX-License-Identifier: BSD-3-Clause 5*499c2713SBiju Das */ 6*499c2713SBiju Das 7*499c2713SBiju Das #include <common/debug.h> 8*499c2713SBiju Das #include <lib/mmio.h> 9*499c2713SBiju Das 10*499c2713SBiju Das #include "cpg_registers.h" 11*499c2713SBiju Das #include "rcar_def.h" 12*499c2713SBiju Das #include "rcar_private.h" 13*499c2713SBiju Das 14*499c2713SBiju Das static void bl2_secure_cpg_init(void); 15*499c2713SBiju Das 16*499c2713SBiju Das #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RCAR_H3) || (RCAR_LSI == RCAR_H3N) 17*499c2713SBiju Das static void bl2_realtime_cpg_init_h3(void); 18*499c2713SBiju Das static void bl2_system_cpg_init_h3(void); 19*499c2713SBiju Das #endif 20*499c2713SBiju Das 21*499c2713SBiju Das #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RCAR_M3) 22*499c2713SBiju Das static void bl2_realtime_cpg_init_m3(void); 23*499c2713SBiju Das static void bl2_system_cpg_init_m3(void); 24*499c2713SBiju Das #endif 25*499c2713SBiju Das 26*499c2713SBiju Das #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RCAR_M3N) 27*499c2713SBiju Das static void bl2_realtime_cpg_init_m3n(void); 28*499c2713SBiju Das static void bl2_system_cpg_init_m3n(void); 29*499c2713SBiju Das #endif 30*499c2713SBiju Das 31*499c2713SBiju Das #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RCAR_V3M) 32*499c2713SBiju Das static void bl2_realtime_cpg_init_v3m(void); 33*499c2713SBiju Das static void bl2_system_cpg_init_v3m(void); 34*499c2713SBiju Das #endif 35*499c2713SBiju Das 36*499c2713SBiju Das #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RCAR_E3) 37*499c2713SBiju Das static void bl2_realtime_cpg_init_e3(void); 38*499c2713SBiju Das static void bl2_system_cpg_init_e3(void); 39*499c2713SBiju Das #endif 40*499c2713SBiju Das 41*499c2713SBiju Das #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RCAR_D3) 42*499c2713SBiju Das static void bl2_realtime_cpg_init_d3(void); 43*499c2713SBiju Das static void bl2_system_cpg_init_d3(void); 44*499c2713SBiju Das #endif 45*499c2713SBiju Das 46*499c2713SBiju Das typedef struct { 47*499c2713SBiju Das uintptr_t adr; 48*499c2713SBiju Das uint32_t val; 49*499c2713SBiju Das } reg_setting_t; 50*499c2713SBiju Das 51*499c2713SBiju Das static void bl2_secure_cpg_init(void) 52*499c2713SBiju Das { 53*499c2713SBiju Das uint32_t stop_cr2, reset_cr2; 54*499c2713SBiju Das uint32_t stop_cr4, reset_cr4; 55*499c2713SBiju Das uint32_t stop_cr5, reset_cr5; 56*499c2713SBiju Das 57*499c2713SBiju Das #if (RCAR_LSI == RCAR_D3) 58*499c2713SBiju Das reset_cr2 = 0x00000000U; 59*499c2713SBiju Das stop_cr2 = 0xFFFFFFFFU; 60*499c2713SBiju Das #elif (RCAR_LSI == RCAR_E3) 61*499c2713SBiju Das reset_cr2 = 0x10000000U; 62*499c2713SBiju Das stop_cr2 = 0xEFFFFFFFU; 63*499c2713SBiju Das #else 64*499c2713SBiju Das reset_cr2 = 0x14000000U; 65*499c2713SBiju Das stop_cr2 = 0xEBFFFFFFU; 66*499c2713SBiju Das #endif 67*499c2713SBiju Das 68*499c2713SBiju Das #if (RCAR_LSI == RCAR_D3) 69*499c2713SBiju Das reset_cr4 = 0x00000000U; 70*499c2713SBiju Das stop_cr4 = 0xFFFFFFFFU; 71*499c2713SBiju Das reset_cr5 = 0x00000000U; 72*499c2713SBiju Das stop_cr5 = 0xFFFFFFFFU; 73*499c2713SBiju Das #else 74*499c2713SBiju Das reset_cr4 = 0x80000003U; 75*499c2713SBiju Das stop_cr4 = 0x7FFFFFFFU; 76*499c2713SBiju Das reset_cr5 = 0x40000000U; 77*499c2713SBiju Das stop_cr5 = 0xBFFFFFFFU; 78*499c2713SBiju Das #endif 79*499c2713SBiju Das 80*499c2713SBiju Das /* Secure Module Stop Control Registers */ 81*499c2713SBiju Das cpg_write(SCMSTPCR0, 0xFFFFFFFFU); 82*499c2713SBiju Das cpg_write(SCMSTPCR1, 0xFFFFFFFFU); 83*499c2713SBiju Das cpg_write(SCMSTPCR2, stop_cr2); 84*499c2713SBiju Das cpg_write(SCMSTPCR3, 0xFFFFFFFFU); 85*499c2713SBiju Das cpg_write(SCMSTPCR4, stop_cr4); 86*499c2713SBiju Das cpg_write(SCMSTPCR5, stop_cr5); 87*499c2713SBiju Das cpg_write(SCMSTPCR6, 0xFFFFFFFFU); 88*499c2713SBiju Das cpg_write(SCMSTPCR7, 0xFFFFFFFFU); 89*499c2713SBiju Das cpg_write(SCMSTPCR8, 0xFFFFFFFFU); 90*499c2713SBiju Das cpg_write(SCMSTPCR9, 0xFFFDFFFFU); 91*499c2713SBiju Das cpg_write(SCMSTPCR10, 0xFFFFFFFFU); 92*499c2713SBiju Das cpg_write(SCMSTPCR11, 0xFFFFFFFFU); 93*499c2713SBiju Das 94*499c2713SBiju Das /* Secure Software Reset Access Enable Control Registers */ 95*499c2713SBiju Das cpg_write(SCSRSTECR0, 0x00000000U); 96*499c2713SBiju Das cpg_write(SCSRSTECR1, 0x00000000U); 97*499c2713SBiju Das cpg_write(SCSRSTECR2, reset_cr2); 98*499c2713SBiju Das cpg_write(SCSRSTECR3, 0x00000000U); 99*499c2713SBiju Das cpg_write(SCSRSTECR4, reset_cr4); 100*499c2713SBiju Das cpg_write(SCSRSTECR5, reset_cr5); 101*499c2713SBiju Das cpg_write(SCSRSTECR6, 0x00000000U); 102*499c2713SBiju Das cpg_write(SCSRSTECR7, 0x00000000U); 103*499c2713SBiju Das cpg_write(SCSRSTECR8, 0x00000000U); 104*499c2713SBiju Das cpg_write(SCSRSTECR9, 0x00020000U); 105*499c2713SBiju Das cpg_write(SCSRSTECR10, 0x00000000U); 106*499c2713SBiju Das cpg_write(SCSRSTECR11, 0x00000000U); 107*499c2713SBiju Das } 108*499c2713SBiju Das 109*499c2713SBiju Das #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RCAR_H3) || (RCAR_LSI == RCAR_H3N) 110*499c2713SBiju Das static void bl2_realtime_cpg_init_h3(void) 111*499c2713SBiju Das { 112*499c2713SBiju Das uint32_t cut = mmio_read_32(RCAR_PRR) & PRR_CUT_MASK; 113*499c2713SBiju Das uint32_t cr0, cr8; 114*499c2713SBiju Das 115*499c2713SBiju Das cr0 = (cut == PRR_PRODUCT_10 || cut == PRR_PRODUCT_11) ? 116*499c2713SBiju Das 0x00200000U : 0x00210000U; 117*499c2713SBiju Das cr8 = (cut == PRR_PRODUCT_10 || cut == PRR_PRODUCT_11) ? 118*499c2713SBiju Das 0x01F1FFF4U : 0x01F1FFF7U; 119*499c2713SBiju Das 120*499c2713SBiju Das cpg_write(RMSTPCR0, cr0); 121*499c2713SBiju Das cpg_write(RMSTPCR1, 0xFFFFFFFFU); 122*499c2713SBiju Das cpg_write(RMSTPCR2, 0x040E0FDCU); 123*499c2713SBiju Das cpg_write(RMSTPCR3, 0xFFFFFFDFU); 124*499c2713SBiju Das cpg_write(RMSTPCR4, 0x80000004U); 125*499c2713SBiju Das cpg_write(RMSTPCR5, 0xC3FFFFFFU); 126*499c2713SBiju Das cpg_write(RMSTPCR6, 0xFFFFFFFFU); 127*499c2713SBiju Das cpg_write(RMSTPCR7, 0xFFFFFFFFU); 128*499c2713SBiju Das cpg_write(RMSTPCR8, cr8); 129*499c2713SBiju Das cpg_write(RMSTPCR9, 0xFFFFFFFEU); 130*499c2713SBiju Das cpg_write(RMSTPCR10, 0xFFFEFFE0U); 131*499c2713SBiju Das cpg_write(RMSTPCR11, 0x000000B7U); 132*499c2713SBiju Das } 133*499c2713SBiju Das 134*499c2713SBiju Das static void bl2_system_cpg_init_h3(void) 135*499c2713SBiju Das { 136*499c2713SBiju Das /** System Module Stop Control Registers */ 137*499c2713SBiju Das cpg_write(SMSTPCR0, 0x00210000U); 138*499c2713SBiju Das cpg_write(SMSTPCR1, 0xFFFFFFFFU); 139*499c2713SBiju Das cpg_write(SMSTPCR2, 0x040E2FDCU); 140*499c2713SBiju Das cpg_write(SMSTPCR3, 0xFFFFFBDFU); 141*499c2713SBiju Das cpg_write(SMSTPCR4, 0x80000004U); 142*499c2713SBiju Das cpg_write(SMSTPCR5, 0xC3FFFFFFU); 143*499c2713SBiju Das cpg_write(SMSTPCR6, 0xFFFFFFFFU); 144*499c2713SBiju Das cpg_write(SMSTPCR7, 0xFFFFFFFFU); 145*499c2713SBiju Das cpg_write(SMSTPCR8, 0x01F1FFF5U); 146*499c2713SBiju Das cpg_write(SMSTPCR9, 0xFFFFFFFFU); 147*499c2713SBiju Das cpg_write(SMSTPCR10, 0xFFFEFFE0U); 148*499c2713SBiju Das cpg_write(SMSTPCR11, 0x000000B7U); 149*499c2713SBiju Das } 150*499c2713SBiju Das #endif 151*499c2713SBiju Das 152*499c2713SBiju Das #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RCAR_M3) 153*499c2713SBiju Das static void bl2_realtime_cpg_init_m3(void) 154*499c2713SBiju Das { 155*499c2713SBiju Das /* Realtime Module Stop Control Registers */ 156*499c2713SBiju Das cpg_write(RMSTPCR0, 0x00200000U); 157*499c2713SBiju Das cpg_write(RMSTPCR1, 0xFFFFFFFFU); 158*499c2713SBiju Das cpg_write(RMSTPCR2, 0x040E0FDCU); 159*499c2713SBiju Das cpg_write(RMSTPCR3, 0xFFFFFFDFU); 160*499c2713SBiju Das cpg_write(RMSTPCR4, 0x80000004U); 161*499c2713SBiju Das cpg_write(RMSTPCR5, 0xC3FFFFFFU); 162*499c2713SBiju Das cpg_write(RMSTPCR6, 0xFFFFFFFFU); 163*499c2713SBiju Das cpg_write(RMSTPCR7, 0xFFFFFFFFU); 164*499c2713SBiju Das cpg_write(RMSTPCR8, 0x01F1FFF7U); 165*499c2713SBiju Das cpg_write(RMSTPCR9, 0xFFFFFFFEU); 166*499c2713SBiju Das cpg_write(RMSTPCR10, 0xFFFEFFE0U); 167*499c2713SBiju Das cpg_write(RMSTPCR11, 0x000000B7U); 168*499c2713SBiju Das } 169*499c2713SBiju Das 170*499c2713SBiju Das static void bl2_system_cpg_init_m3(void) 171*499c2713SBiju Das { 172*499c2713SBiju Das /* System Module Stop Control Registers */ 173*499c2713SBiju Das cpg_write(SMSTPCR0, 0x00200000U); 174*499c2713SBiju Das cpg_write(SMSTPCR1, 0xFFFFFFFFU); 175*499c2713SBiju Das cpg_write(SMSTPCR2, 0x040E2FDCU); 176*499c2713SBiju Das cpg_write(SMSTPCR3, 0xFFFFFBDFU); 177*499c2713SBiju Das cpg_write(SMSTPCR4, 0x80000004U); 178*499c2713SBiju Das cpg_write(SMSTPCR5, 0xC3FFFFFFU); 179*499c2713SBiju Das cpg_write(SMSTPCR6, 0xFFFFFFFFU); 180*499c2713SBiju Das cpg_write(SMSTPCR7, 0xFFFFFFFFU); 181*499c2713SBiju Das cpg_write(SMSTPCR8, 0x01F1FFF7U); 182*499c2713SBiju Das cpg_write(SMSTPCR9, 0xFFFFFFFFU); 183*499c2713SBiju Das cpg_write(SMSTPCR10, 0xFFFEFFE0U); 184*499c2713SBiju Das cpg_write(SMSTPCR11, 0x000000B7U); 185*499c2713SBiju Das } 186*499c2713SBiju Das #endif 187*499c2713SBiju Das 188*499c2713SBiju Das #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RCAR_M3N) 189*499c2713SBiju Das static void bl2_realtime_cpg_init_m3n(void) 190*499c2713SBiju Das { 191*499c2713SBiju Das /* Realtime Module Stop Control Registers */ 192*499c2713SBiju Das cpg_write(RMSTPCR0, 0x00210000U); 193*499c2713SBiju Das cpg_write(RMSTPCR1, 0xFFFFFFFFU); 194*499c2713SBiju Das cpg_write(RMSTPCR2, 0x040E0FDCU); 195*499c2713SBiju Das cpg_write(RMSTPCR3, 0xFFFFFFDFU); 196*499c2713SBiju Das cpg_write(RMSTPCR4, 0x80000004U); 197*499c2713SBiju Das cpg_write(RMSTPCR5, 0xC3FFFFFFU); 198*499c2713SBiju Das cpg_write(RMSTPCR6, 0xFFFFFFFFU); 199*499c2713SBiju Das cpg_write(RMSTPCR7, 0xFFFFFFFFU); 200*499c2713SBiju Das cpg_write(RMSTPCR8, 0x00F1FFF7U); 201*499c2713SBiju Das cpg_write(RMSTPCR9, 0xFFFFFFFFU); 202*499c2713SBiju Das cpg_write(RMSTPCR10, 0xFFFFFFE0U); 203*499c2713SBiju Das cpg_write(RMSTPCR11, 0x000000B7U); 204*499c2713SBiju Das } 205*499c2713SBiju Das 206*499c2713SBiju Das static void bl2_system_cpg_init_m3n(void) 207*499c2713SBiju Das { 208*499c2713SBiju Das /* System Module Stop Control Registers */ 209*499c2713SBiju Das cpg_write(SMSTPCR0, 0x00210000U); 210*499c2713SBiju Das cpg_write(SMSTPCR1, 0xFFFFFFFFU); 211*499c2713SBiju Das cpg_write(SMSTPCR2, 0x040E2FDCU); 212*499c2713SBiju Das cpg_write(SMSTPCR3, 0xFFFFFBDFU); 213*499c2713SBiju Das cpg_write(SMSTPCR4, 0x80000004U); 214*499c2713SBiju Das cpg_write(SMSTPCR5, 0xC3FFFFFFU); 215*499c2713SBiju Das cpg_write(SMSTPCR6, 0xFFFFFFFFU); 216*499c2713SBiju Das cpg_write(SMSTPCR7, 0xFFFFFFFFU); 217*499c2713SBiju Das cpg_write(SMSTPCR8, 0x00F1FFF7U); 218*499c2713SBiju Das cpg_write(SMSTPCR9, 0xFFFFFFFFU); 219*499c2713SBiju Das cpg_write(SMSTPCR10, 0xFFFFFFE0U); 220*499c2713SBiju Das cpg_write(SMSTPCR11, 0x000000B7U); 221*499c2713SBiju Das } 222*499c2713SBiju Das #endif 223*499c2713SBiju Das 224*499c2713SBiju Das #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RCAR_V3M) 225*499c2713SBiju Das static void bl2_realtime_cpg_init_v3m(void) 226*499c2713SBiju Das { 227*499c2713SBiju Das /* Realtime Module Stop Control Registers */ 228*499c2713SBiju Das cpg_write(RMSTPCR0, 0x00230000U); 229*499c2713SBiju Das cpg_write(RMSTPCR1, 0xFFFFFFFFU); 230*499c2713SBiju Das cpg_write(RMSTPCR2, 0x14062FD8U); 231*499c2713SBiju Das cpg_write(RMSTPCR3, 0xFFFFFFDFU); 232*499c2713SBiju Das cpg_write(RMSTPCR4, 0x80000184U); 233*499c2713SBiju Das cpg_write(RMSTPCR5, 0x83FFFFFFU); 234*499c2713SBiju Das cpg_write(RMSTPCR6, 0xFFFFFFFFU); 235*499c2713SBiju Das cpg_write(RMSTPCR7, 0xFFFFFFFFU); 236*499c2713SBiju Das cpg_write(RMSTPCR8, 0x7FF3FFF4U); 237*499c2713SBiju Das cpg_write(RMSTPCR9, 0xFFFFFFFEU); 238*499c2713SBiju Das } 239*499c2713SBiju Das 240*499c2713SBiju Das static void bl2_system_cpg_init_v3m(void) 241*499c2713SBiju Das { 242*499c2713SBiju Das /* System Module Stop Control Registers */ 243*499c2713SBiju Das cpg_write(SMSTPCR0, 0x00210000U); 244*499c2713SBiju Das cpg_write(SMSTPCR1, 0xFFFFFFFFU); 245*499c2713SBiju Das cpg_write(SMSTPCR2, 0x340E2FDCU); 246*499c2713SBiju Das cpg_write(SMSTPCR3, 0xFFFFFBDFU); 247*499c2713SBiju Das cpg_write(SMSTPCR4, 0x80000004U); 248*499c2713SBiju Das cpg_write(SMSTPCR5, 0xC3FFFFFFU); 249*499c2713SBiju Das cpg_write(SMSTPCR6, 0xFFFFFFFFU); 250*499c2713SBiju Das cpg_write(SMSTPCR7, 0xFFFFFFFFU); 251*499c2713SBiju Das cpg_write(SMSTPCR8, 0x01F1FFF5U); 252*499c2713SBiju Das cpg_write(SMSTPCR9, 0xFFFFFFFEU); 253*499c2713SBiju Das } 254*499c2713SBiju Das #endif 255*499c2713SBiju Das 256*499c2713SBiju Das #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RCAR_E3) 257*499c2713SBiju Das static void bl2_realtime_cpg_init_e3(void) 258*499c2713SBiju Das { 259*499c2713SBiju Das /* Realtime Module Stop Control Registers */ 260*499c2713SBiju Das cpg_write(RMSTPCR0, 0x00210000U); 261*499c2713SBiju Das cpg_write(RMSTPCR1, 0xFFFFFFFFU); 262*499c2713SBiju Das cpg_write(RMSTPCR2, 0x000E0FDCU); 263*499c2713SBiju Das cpg_write(RMSTPCR3, 0xFFFFFFDFU); 264*499c2713SBiju Das cpg_write(RMSTPCR4, 0x80000004U); 265*499c2713SBiju Das cpg_write(RMSTPCR5, 0xC3FFFFFFU); 266*499c2713SBiju Das cpg_write(RMSTPCR6, 0xFFFFFFFFU); 267*499c2713SBiju Das cpg_write(RMSTPCR7, 0xFFFFFFFFU); 268*499c2713SBiju Das cpg_write(RMSTPCR8, 0x00F1FFF7U); 269*499c2713SBiju Das cpg_write(RMSTPCR9, 0xFFFFFFDFU); 270*499c2713SBiju Das cpg_write(RMSTPCR10, 0xFFFFFFE8U); 271*499c2713SBiju Das cpg_write(RMSTPCR11, 0x000000B7U); 272*499c2713SBiju Das } 273*499c2713SBiju Das 274*499c2713SBiju Das static void bl2_system_cpg_init_e3(void) 275*499c2713SBiju Das { 276*499c2713SBiju Das /* System Module Stop Control Registers */ 277*499c2713SBiju Das cpg_write(SMSTPCR0, 0x00210000U); 278*499c2713SBiju Das cpg_write(SMSTPCR1, 0xFFFFFFFFU); 279*499c2713SBiju Das cpg_write(SMSTPCR2, 0x000E2FDCU); 280*499c2713SBiju Das cpg_write(SMSTPCR3, 0xFFFFFBDFU); 281*499c2713SBiju Das cpg_write(SMSTPCR4, 0x80000004U); 282*499c2713SBiju Das cpg_write(SMSTPCR5, 0xC3FFFFFFU); 283*499c2713SBiju Das cpg_write(SMSTPCR6, 0xFFFFFFFFU); 284*499c2713SBiju Das cpg_write(SMSTPCR7, 0xFFFFFFFFU); 285*499c2713SBiju Das cpg_write(SMSTPCR8, 0x00F1FFF7U); 286*499c2713SBiju Das cpg_write(SMSTPCR9, 0xFFFFFFDFU); 287*499c2713SBiju Das cpg_write(SMSTPCR10, 0xFFFFFFE8U); 288*499c2713SBiju Das cpg_write(SMSTPCR11, 0x000000B7U); 289*499c2713SBiju Das } 290*499c2713SBiju Das #endif 291*499c2713SBiju Das 292*499c2713SBiju Das #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RCAR_D3) 293*499c2713SBiju Das static void bl2_realtime_cpg_init_d3(void) 294*499c2713SBiju Das { 295*499c2713SBiju Das /* Realtime Module Stop Control Registers */ 296*499c2713SBiju Das cpg_write(RMSTPCR0, 0x00010000U); 297*499c2713SBiju Das cpg_write(RMSTPCR1, 0xFFFFFFFFU); 298*499c2713SBiju Das cpg_write(RMSTPCR2, 0x00060FDCU); 299*499c2713SBiju Das cpg_write(RMSTPCR3, 0xFFFFFFDFU); 300*499c2713SBiju Das cpg_write(RMSTPCR4, 0x80000184U); 301*499c2713SBiju Das cpg_write(RMSTPCR5, 0x83FFFFFFU); 302*499c2713SBiju Das cpg_write(RMSTPCR6, 0xFFFFFFFFU); 303*499c2713SBiju Das cpg_write(RMSTPCR7, 0xFFFFFFFFU); 304*499c2713SBiju Das cpg_write(RMSTPCR8, 0x00F1FFF7U); 305*499c2713SBiju Das cpg_write(RMSTPCR9, 0xF3F5E016U); 306*499c2713SBiju Das cpg_write(RMSTPCR10, 0xFFFEFFE0U); 307*499c2713SBiju Das cpg_write(RMSTPCR11, 0x000000B7U); 308*499c2713SBiju Das } 309*499c2713SBiju Das 310*499c2713SBiju Das static void bl2_system_cpg_init_d3(void) 311*499c2713SBiju Das { 312*499c2713SBiju Das /* System Module Stop Control Registers */ 313*499c2713SBiju Das cpg_write(SMSTPCR0, 0x00010000U); 314*499c2713SBiju Das cpg_write(SMSTPCR1, 0xFFFFFFFFU); 315*499c2713SBiju Das cpg_write(SMSTPCR2, 0x00060FDCU); 316*499c2713SBiju Das cpg_write(SMSTPCR3, 0xFFFFFBDFU); 317*499c2713SBiju Das cpg_write(SMSTPCR4, 0x00000084U); 318*499c2713SBiju Das cpg_write(SMSTPCR5, 0x83FFFFFFU); 319*499c2713SBiju Das cpg_write(SMSTPCR6, 0xFFFFFFFFU); 320*499c2713SBiju Das cpg_write(SMSTPCR7, 0xFFFFFFFFU); 321*499c2713SBiju Das cpg_write(SMSTPCR8, 0x00F1FFF7U); 322*499c2713SBiju Das cpg_write(SMSTPCR9, 0xF3F5E016U); 323*499c2713SBiju Das cpg_write(SMSTPCR10, 0xFFFEFFE0U); 324*499c2713SBiju Das cpg_write(SMSTPCR11, 0x000000B7U); 325*499c2713SBiju Das } 326*499c2713SBiju Das #endif 327*499c2713SBiju Das 328*499c2713SBiju Das void bl2_cpg_init(void) 329*499c2713SBiju Das { 330*499c2713SBiju Das uint32_t boot_cpu = mmio_read_32(RCAR_MODEMR) & MODEMR_BOOT_CPU_MASK; 331*499c2713SBiju Das #if RCAR_LSI == RCAR_AUTO 332*499c2713SBiju Das uint32_t product = mmio_read_32(RCAR_PRR) & PRR_PRODUCT_MASK; 333*499c2713SBiju Das #endif 334*499c2713SBiju Das bl2_secure_cpg_init(); 335*499c2713SBiju Das 336*499c2713SBiju Das if (boot_cpu == MODEMR_BOOT_CPU_CA57 || 337*499c2713SBiju Das boot_cpu == MODEMR_BOOT_CPU_CA53) { 338*499c2713SBiju Das #if RCAR_LSI == RCAR_AUTO 339*499c2713SBiju Das 340*499c2713SBiju Das switch (product) { 341*499c2713SBiju Das case PRR_PRODUCT_H3: 342*499c2713SBiju Das bl2_realtime_cpg_init_h3(); 343*499c2713SBiju Das break; 344*499c2713SBiju Das case PRR_PRODUCT_M3: 345*499c2713SBiju Das bl2_realtime_cpg_init_m3(); 346*499c2713SBiju Das break; 347*499c2713SBiju Das case PRR_PRODUCT_M3N: 348*499c2713SBiju Das bl2_realtime_cpg_init_m3n(); 349*499c2713SBiju Das break; 350*499c2713SBiju Das case PRR_PRODUCT_V3M: 351*499c2713SBiju Das bl2_realtime_cpg_init_v3m(); 352*499c2713SBiju Das break; 353*499c2713SBiju Das case PRR_PRODUCT_E3: 354*499c2713SBiju Das bl2_realtime_cpg_init_e3(); 355*499c2713SBiju Das break; 356*499c2713SBiju Das case PRR_PRODUCT_D3: 357*499c2713SBiju Das bl2_realtime_cpg_init_d3(); 358*499c2713SBiju Das break; 359*499c2713SBiju Das default: 360*499c2713SBiju Das panic(); 361*499c2713SBiju Das break; 362*499c2713SBiju Das } 363*499c2713SBiju Das #elif (RCAR_LSI == RCAR_H3) || (RCAR_LSI == RCAR_H3N) 364*499c2713SBiju Das bl2_realtime_cpg_init_h3(); 365*499c2713SBiju Das #elif RCAR_LSI == RCAR_M3 366*499c2713SBiju Das bl2_realtime_cpg_init_m3(); 367*499c2713SBiju Das #elif RCAR_LSI == RCAR_M3N 368*499c2713SBiju Das bl2_realtime_cpg_init_m3n(); 369*499c2713SBiju Das #elif RCAR_LSI == RCAR_V3M 370*499c2713SBiju Das bl2_realtime_cpg_init_v3m(); 371*499c2713SBiju Das #elif RCAR_LSI == RCAR_E3 372*499c2713SBiju Das bl2_realtime_cpg_init_e3(); 373*499c2713SBiju Das #elif RCAR_LSI == RCAR_D3 374*499c2713SBiju Das bl2_realtime_cpg_init_d3(); 375*499c2713SBiju Das #else 376*499c2713SBiju Das #error "Don't have CPG initialize routine(unknown)." 377*499c2713SBiju Das #endif 378*499c2713SBiju Das } 379*499c2713SBiju Das } 380*499c2713SBiju Das 381*499c2713SBiju Das void bl2_system_cpg_init(void) 382*499c2713SBiju Das { 383*499c2713SBiju Das #if RCAR_LSI == RCAR_AUTO 384*499c2713SBiju Das uint32_t product = mmio_read_32(RCAR_PRR) & PRR_PRODUCT_MASK; 385*499c2713SBiju Das 386*499c2713SBiju Das switch (product) { 387*499c2713SBiju Das case PRR_PRODUCT_H3: 388*499c2713SBiju Das bl2_system_cpg_init_h3(); 389*499c2713SBiju Das break; 390*499c2713SBiju Das case PRR_PRODUCT_M3: 391*499c2713SBiju Das bl2_system_cpg_init_m3(); 392*499c2713SBiju Das break; 393*499c2713SBiju Das case PRR_PRODUCT_M3N: 394*499c2713SBiju Das bl2_system_cpg_init_m3n(); 395*499c2713SBiju Das break; 396*499c2713SBiju Das case PRR_PRODUCT_V3M: 397*499c2713SBiju Das bl2_system_cpg_init_v3m(); 398*499c2713SBiju Das break; 399*499c2713SBiju Das case PRR_PRODUCT_E3: 400*499c2713SBiju Das bl2_system_cpg_init_e3(); 401*499c2713SBiju Das break; 402*499c2713SBiju Das case PRR_PRODUCT_D3: 403*499c2713SBiju Das bl2_system_cpg_init_d3(); 404*499c2713SBiju Das break; 405*499c2713SBiju Das default: 406*499c2713SBiju Das panic(); 407*499c2713SBiju Das break; 408*499c2713SBiju Das } 409*499c2713SBiju Das #elif (RCAR_LSI == RCAR_H3) || (RCAR_LSI == RCAR_H3N) 410*499c2713SBiju Das bl2_system_cpg_init_h3(); 411*499c2713SBiju Das #elif RCAR_LSI == RCAR_M3 412*499c2713SBiju Das bl2_system_cpg_init_m3(); 413*499c2713SBiju Das #elif RCAR_LSI == RCAR_M3N 414*499c2713SBiju Das bl2_system_cpg_init_m3n(); 415*499c2713SBiju Das #elif RCAR_LSI == RCAR_V3M 416*499c2713SBiju Das bl2_system_cpg_init_v3m(); 417*499c2713SBiju Das #elif RCAR_LSI == RCAR_E3 418*499c2713SBiju Das bl2_system_cpg_init_e3(); 419*499c2713SBiju Das #elif RCAR_LSI == RCAR_D3 420*499c2713SBiju Das bl2_system_cpg_init_d3(); 421*499c2713SBiju Das #else 422*499c2713SBiju Das #error "Don't have CPG initialize routine(unknown)." 423*499c2713SBiju Das #endif 424*499c2713SBiju Das } 425