1499c2713SBiju Das /* 2499c2713SBiju Das * Copyright (c) 2015-2020, Renesas Electronics Corporation. All rights reserved. 3499c2713SBiju Das * 4499c2713SBiju Das * SPDX-License-Identifier: BSD-3-Clause 5499c2713SBiju Das */ 6499c2713SBiju Das 7499c2713SBiju Das #include <common/debug.h> 8499c2713SBiju Das #include <lib/mmio.h> 9499c2713SBiju Das 10499c2713SBiju Das #include "cpg_registers.h" 11499c2713SBiju Das #include "rcar_def.h" 12499c2713SBiju Das #include "rcar_private.h" 13499c2713SBiju Das 14499c2713SBiju Das static void bl2_secure_cpg_init(void); 15499c2713SBiju Das 16499c2713SBiju Das #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RCAR_H3) || (RCAR_LSI == RCAR_H3N) 17499c2713SBiju Das static void bl2_realtime_cpg_init_h3(void); 18499c2713SBiju Das static void bl2_system_cpg_init_h3(void); 19499c2713SBiju Das #endif 20499c2713SBiju Das 21*db10bad9SBiju Das #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RCAR_M3) || (RCAR_LSI == RZ_G2M) 22499c2713SBiju Das static void bl2_realtime_cpg_init_m3(void); 23499c2713SBiju Das static void bl2_system_cpg_init_m3(void); 24499c2713SBiju Das #endif 25499c2713SBiju Das 26499c2713SBiju Das #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RCAR_M3N) 27499c2713SBiju Das static void bl2_realtime_cpg_init_m3n(void); 28499c2713SBiju Das static void bl2_system_cpg_init_m3n(void); 29499c2713SBiju Das #endif 30499c2713SBiju Das 31499c2713SBiju Das #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RCAR_V3M) 32499c2713SBiju Das static void bl2_realtime_cpg_init_v3m(void); 33499c2713SBiju Das static void bl2_system_cpg_init_v3m(void); 34499c2713SBiju Das #endif 35499c2713SBiju Das 36499c2713SBiju Das #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RCAR_E3) 37499c2713SBiju Das static void bl2_realtime_cpg_init_e3(void); 38499c2713SBiju Das static void bl2_system_cpg_init_e3(void); 39499c2713SBiju Das #endif 40499c2713SBiju Das 41499c2713SBiju Das #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RCAR_D3) 42499c2713SBiju Das static void bl2_realtime_cpg_init_d3(void); 43499c2713SBiju Das static void bl2_system_cpg_init_d3(void); 44499c2713SBiju Das #endif 45499c2713SBiju Das 46499c2713SBiju Das typedef struct { 47499c2713SBiju Das uintptr_t adr; 48499c2713SBiju Das uint32_t val; 49499c2713SBiju Das } reg_setting_t; 50499c2713SBiju Das 51499c2713SBiju Das static void bl2_secure_cpg_init(void) 52499c2713SBiju Das { 53499c2713SBiju Das uint32_t stop_cr2, reset_cr2; 54499c2713SBiju Das uint32_t stop_cr4, reset_cr4; 55499c2713SBiju Das uint32_t stop_cr5, reset_cr5; 56499c2713SBiju Das 57499c2713SBiju Das #if (RCAR_LSI == RCAR_D3) 58499c2713SBiju Das reset_cr2 = 0x00000000U; 59499c2713SBiju Das stop_cr2 = 0xFFFFFFFFU; 60499c2713SBiju Das #elif (RCAR_LSI == RCAR_E3) 61499c2713SBiju Das reset_cr2 = 0x10000000U; 62499c2713SBiju Das stop_cr2 = 0xEFFFFFFFU; 63499c2713SBiju Das #else 64499c2713SBiju Das reset_cr2 = 0x14000000U; 65499c2713SBiju Das stop_cr2 = 0xEBFFFFFFU; 66499c2713SBiju Das #endif 67499c2713SBiju Das 68499c2713SBiju Das #if (RCAR_LSI == RCAR_D3) 69499c2713SBiju Das reset_cr4 = 0x00000000U; 70499c2713SBiju Das stop_cr4 = 0xFFFFFFFFU; 71499c2713SBiju Das reset_cr5 = 0x00000000U; 72499c2713SBiju Das stop_cr5 = 0xFFFFFFFFU; 73499c2713SBiju Das #else 74499c2713SBiju Das reset_cr4 = 0x80000003U; 75499c2713SBiju Das stop_cr4 = 0x7FFFFFFFU; 76499c2713SBiju Das reset_cr5 = 0x40000000U; 77499c2713SBiju Das stop_cr5 = 0xBFFFFFFFU; 78499c2713SBiju Das #endif 79499c2713SBiju Das 80499c2713SBiju Das /* Secure Module Stop Control Registers */ 81499c2713SBiju Das cpg_write(SCMSTPCR0, 0xFFFFFFFFU); 82499c2713SBiju Das cpg_write(SCMSTPCR1, 0xFFFFFFFFU); 83499c2713SBiju Das cpg_write(SCMSTPCR2, stop_cr2); 84499c2713SBiju Das cpg_write(SCMSTPCR3, 0xFFFFFFFFU); 85499c2713SBiju Das cpg_write(SCMSTPCR4, stop_cr4); 86499c2713SBiju Das cpg_write(SCMSTPCR5, stop_cr5); 87499c2713SBiju Das cpg_write(SCMSTPCR6, 0xFFFFFFFFU); 88499c2713SBiju Das cpg_write(SCMSTPCR7, 0xFFFFFFFFU); 89499c2713SBiju Das cpg_write(SCMSTPCR8, 0xFFFFFFFFU); 90499c2713SBiju Das cpg_write(SCMSTPCR9, 0xFFFDFFFFU); 91499c2713SBiju Das cpg_write(SCMSTPCR10, 0xFFFFFFFFU); 92499c2713SBiju Das cpg_write(SCMSTPCR11, 0xFFFFFFFFU); 93499c2713SBiju Das 94499c2713SBiju Das /* Secure Software Reset Access Enable Control Registers */ 95499c2713SBiju Das cpg_write(SCSRSTECR0, 0x00000000U); 96499c2713SBiju Das cpg_write(SCSRSTECR1, 0x00000000U); 97499c2713SBiju Das cpg_write(SCSRSTECR2, reset_cr2); 98499c2713SBiju Das cpg_write(SCSRSTECR3, 0x00000000U); 99499c2713SBiju Das cpg_write(SCSRSTECR4, reset_cr4); 100499c2713SBiju Das cpg_write(SCSRSTECR5, reset_cr5); 101499c2713SBiju Das cpg_write(SCSRSTECR6, 0x00000000U); 102499c2713SBiju Das cpg_write(SCSRSTECR7, 0x00000000U); 103499c2713SBiju Das cpg_write(SCSRSTECR8, 0x00000000U); 104499c2713SBiju Das cpg_write(SCSRSTECR9, 0x00020000U); 105499c2713SBiju Das cpg_write(SCSRSTECR10, 0x00000000U); 106499c2713SBiju Das cpg_write(SCSRSTECR11, 0x00000000U); 107499c2713SBiju Das } 108499c2713SBiju Das 109499c2713SBiju Das #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RCAR_H3) || (RCAR_LSI == RCAR_H3N) 110499c2713SBiju Das static void bl2_realtime_cpg_init_h3(void) 111499c2713SBiju Das { 112499c2713SBiju Das uint32_t cut = mmio_read_32(RCAR_PRR) & PRR_CUT_MASK; 113499c2713SBiju Das uint32_t cr0, cr8; 114499c2713SBiju Das 115499c2713SBiju Das cr0 = (cut == PRR_PRODUCT_10 || cut == PRR_PRODUCT_11) ? 116499c2713SBiju Das 0x00200000U : 0x00210000U; 117499c2713SBiju Das cr8 = (cut == PRR_PRODUCT_10 || cut == PRR_PRODUCT_11) ? 118499c2713SBiju Das 0x01F1FFF4U : 0x01F1FFF7U; 119499c2713SBiju Das 120499c2713SBiju Das cpg_write(RMSTPCR0, cr0); 121499c2713SBiju Das cpg_write(RMSTPCR1, 0xFFFFFFFFU); 122499c2713SBiju Das cpg_write(RMSTPCR2, 0x040E0FDCU); 123499c2713SBiju Das cpg_write(RMSTPCR3, 0xFFFFFFDFU); 124499c2713SBiju Das cpg_write(RMSTPCR4, 0x80000004U); 125499c2713SBiju Das cpg_write(RMSTPCR5, 0xC3FFFFFFU); 126499c2713SBiju Das cpg_write(RMSTPCR6, 0xFFFFFFFFU); 127499c2713SBiju Das cpg_write(RMSTPCR7, 0xFFFFFFFFU); 128499c2713SBiju Das cpg_write(RMSTPCR8, cr8); 129499c2713SBiju Das cpg_write(RMSTPCR9, 0xFFFFFFFEU); 130499c2713SBiju Das cpg_write(RMSTPCR10, 0xFFFEFFE0U); 131499c2713SBiju Das cpg_write(RMSTPCR11, 0x000000B7U); 132499c2713SBiju Das } 133499c2713SBiju Das 134499c2713SBiju Das static void bl2_system_cpg_init_h3(void) 135499c2713SBiju Das { 136499c2713SBiju Das /** System Module Stop Control Registers */ 137499c2713SBiju Das cpg_write(SMSTPCR0, 0x00210000U); 138499c2713SBiju Das cpg_write(SMSTPCR1, 0xFFFFFFFFU); 139499c2713SBiju Das cpg_write(SMSTPCR2, 0x040E2FDCU); 140499c2713SBiju Das cpg_write(SMSTPCR3, 0xFFFFFBDFU); 141499c2713SBiju Das cpg_write(SMSTPCR4, 0x80000004U); 142499c2713SBiju Das cpg_write(SMSTPCR5, 0xC3FFFFFFU); 143499c2713SBiju Das cpg_write(SMSTPCR6, 0xFFFFFFFFU); 144499c2713SBiju Das cpg_write(SMSTPCR7, 0xFFFFFFFFU); 145499c2713SBiju Das cpg_write(SMSTPCR8, 0x01F1FFF5U); 146499c2713SBiju Das cpg_write(SMSTPCR9, 0xFFFFFFFFU); 147499c2713SBiju Das cpg_write(SMSTPCR10, 0xFFFEFFE0U); 148499c2713SBiju Das cpg_write(SMSTPCR11, 0x000000B7U); 149499c2713SBiju Das } 150499c2713SBiju Das #endif 151499c2713SBiju Das 152*db10bad9SBiju Das #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RCAR_M3) || (RCAR_LSI == RZ_G2M) 153499c2713SBiju Das static void bl2_realtime_cpg_init_m3(void) 154499c2713SBiju Das { 155499c2713SBiju Das /* Realtime Module Stop Control Registers */ 156499c2713SBiju Das cpg_write(RMSTPCR0, 0x00200000U); 157499c2713SBiju Das cpg_write(RMSTPCR1, 0xFFFFFFFFU); 158499c2713SBiju Das cpg_write(RMSTPCR2, 0x040E0FDCU); 159499c2713SBiju Das cpg_write(RMSTPCR3, 0xFFFFFFDFU); 160499c2713SBiju Das cpg_write(RMSTPCR4, 0x80000004U); 161499c2713SBiju Das cpg_write(RMSTPCR5, 0xC3FFFFFFU); 162499c2713SBiju Das cpg_write(RMSTPCR6, 0xFFFFFFFFU); 163499c2713SBiju Das cpg_write(RMSTPCR7, 0xFFFFFFFFU); 164499c2713SBiju Das cpg_write(RMSTPCR8, 0x01F1FFF7U); 165499c2713SBiju Das cpg_write(RMSTPCR9, 0xFFFFFFFEU); 166499c2713SBiju Das cpg_write(RMSTPCR10, 0xFFFEFFE0U); 167499c2713SBiju Das cpg_write(RMSTPCR11, 0x000000B7U); 168499c2713SBiju Das } 169499c2713SBiju Das 170499c2713SBiju Das static void bl2_system_cpg_init_m3(void) 171499c2713SBiju Das { 172499c2713SBiju Das /* System Module Stop Control Registers */ 173499c2713SBiju Das cpg_write(SMSTPCR0, 0x00200000U); 174499c2713SBiju Das cpg_write(SMSTPCR1, 0xFFFFFFFFU); 175499c2713SBiju Das cpg_write(SMSTPCR2, 0x040E2FDCU); 176499c2713SBiju Das cpg_write(SMSTPCR3, 0xFFFFFBDFU); 177499c2713SBiju Das cpg_write(SMSTPCR4, 0x80000004U); 178499c2713SBiju Das cpg_write(SMSTPCR5, 0xC3FFFFFFU); 179499c2713SBiju Das cpg_write(SMSTPCR6, 0xFFFFFFFFU); 180499c2713SBiju Das cpg_write(SMSTPCR7, 0xFFFFFFFFU); 181499c2713SBiju Das cpg_write(SMSTPCR8, 0x01F1FFF7U); 182499c2713SBiju Das cpg_write(SMSTPCR9, 0xFFFFFFFFU); 183499c2713SBiju Das cpg_write(SMSTPCR10, 0xFFFEFFE0U); 184499c2713SBiju Das cpg_write(SMSTPCR11, 0x000000B7U); 185499c2713SBiju Das } 186499c2713SBiju Das #endif 187499c2713SBiju Das 188499c2713SBiju Das #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RCAR_M3N) 189499c2713SBiju Das static void bl2_realtime_cpg_init_m3n(void) 190499c2713SBiju Das { 191499c2713SBiju Das /* Realtime Module Stop Control Registers */ 192499c2713SBiju Das cpg_write(RMSTPCR0, 0x00210000U); 193499c2713SBiju Das cpg_write(RMSTPCR1, 0xFFFFFFFFU); 194499c2713SBiju Das cpg_write(RMSTPCR2, 0x040E0FDCU); 195499c2713SBiju Das cpg_write(RMSTPCR3, 0xFFFFFFDFU); 196499c2713SBiju Das cpg_write(RMSTPCR4, 0x80000004U); 197499c2713SBiju Das cpg_write(RMSTPCR5, 0xC3FFFFFFU); 198499c2713SBiju Das cpg_write(RMSTPCR6, 0xFFFFFFFFU); 199499c2713SBiju Das cpg_write(RMSTPCR7, 0xFFFFFFFFU); 200499c2713SBiju Das cpg_write(RMSTPCR8, 0x00F1FFF7U); 201499c2713SBiju Das cpg_write(RMSTPCR9, 0xFFFFFFFFU); 202499c2713SBiju Das cpg_write(RMSTPCR10, 0xFFFFFFE0U); 203499c2713SBiju Das cpg_write(RMSTPCR11, 0x000000B7U); 204499c2713SBiju Das } 205499c2713SBiju Das 206499c2713SBiju Das static void bl2_system_cpg_init_m3n(void) 207499c2713SBiju Das { 208499c2713SBiju Das /* System Module Stop Control Registers */ 209499c2713SBiju Das cpg_write(SMSTPCR0, 0x00210000U); 210499c2713SBiju Das cpg_write(SMSTPCR1, 0xFFFFFFFFU); 211499c2713SBiju Das cpg_write(SMSTPCR2, 0x040E2FDCU); 212499c2713SBiju Das cpg_write(SMSTPCR3, 0xFFFFFBDFU); 213499c2713SBiju Das cpg_write(SMSTPCR4, 0x80000004U); 214499c2713SBiju Das cpg_write(SMSTPCR5, 0xC3FFFFFFU); 215499c2713SBiju Das cpg_write(SMSTPCR6, 0xFFFFFFFFU); 216499c2713SBiju Das cpg_write(SMSTPCR7, 0xFFFFFFFFU); 217499c2713SBiju Das cpg_write(SMSTPCR8, 0x00F1FFF7U); 218499c2713SBiju Das cpg_write(SMSTPCR9, 0xFFFFFFFFU); 219499c2713SBiju Das cpg_write(SMSTPCR10, 0xFFFFFFE0U); 220499c2713SBiju Das cpg_write(SMSTPCR11, 0x000000B7U); 221499c2713SBiju Das } 222499c2713SBiju Das #endif 223499c2713SBiju Das 224499c2713SBiju Das #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RCAR_V3M) 225499c2713SBiju Das static void bl2_realtime_cpg_init_v3m(void) 226499c2713SBiju Das { 227499c2713SBiju Das /* Realtime Module Stop Control Registers */ 228499c2713SBiju Das cpg_write(RMSTPCR0, 0x00230000U); 229499c2713SBiju Das cpg_write(RMSTPCR1, 0xFFFFFFFFU); 230499c2713SBiju Das cpg_write(RMSTPCR2, 0x14062FD8U); 231499c2713SBiju Das cpg_write(RMSTPCR3, 0xFFFFFFDFU); 232499c2713SBiju Das cpg_write(RMSTPCR4, 0x80000184U); 233499c2713SBiju Das cpg_write(RMSTPCR5, 0x83FFFFFFU); 234499c2713SBiju Das cpg_write(RMSTPCR6, 0xFFFFFFFFU); 235499c2713SBiju Das cpg_write(RMSTPCR7, 0xFFFFFFFFU); 236499c2713SBiju Das cpg_write(RMSTPCR8, 0x7FF3FFF4U); 237499c2713SBiju Das cpg_write(RMSTPCR9, 0xFFFFFFFEU); 238499c2713SBiju Das } 239499c2713SBiju Das 240499c2713SBiju Das static void bl2_system_cpg_init_v3m(void) 241499c2713SBiju Das { 242499c2713SBiju Das /* System Module Stop Control Registers */ 243499c2713SBiju Das cpg_write(SMSTPCR0, 0x00210000U); 244499c2713SBiju Das cpg_write(SMSTPCR1, 0xFFFFFFFFU); 245499c2713SBiju Das cpg_write(SMSTPCR2, 0x340E2FDCU); 246499c2713SBiju Das cpg_write(SMSTPCR3, 0xFFFFFBDFU); 247499c2713SBiju Das cpg_write(SMSTPCR4, 0x80000004U); 248499c2713SBiju Das cpg_write(SMSTPCR5, 0xC3FFFFFFU); 249499c2713SBiju Das cpg_write(SMSTPCR6, 0xFFFFFFFFU); 250499c2713SBiju Das cpg_write(SMSTPCR7, 0xFFFFFFFFU); 251499c2713SBiju Das cpg_write(SMSTPCR8, 0x01F1FFF5U); 252499c2713SBiju Das cpg_write(SMSTPCR9, 0xFFFFFFFEU); 253499c2713SBiju Das } 254499c2713SBiju Das #endif 255499c2713SBiju Das 256499c2713SBiju Das #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RCAR_E3) 257499c2713SBiju Das static void bl2_realtime_cpg_init_e3(void) 258499c2713SBiju Das { 259499c2713SBiju Das /* Realtime Module Stop Control Registers */ 260499c2713SBiju Das cpg_write(RMSTPCR0, 0x00210000U); 261499c2713SBiju Das cpg_write(RMSTPCR1, 0xFFFFFFFFU); 262499c2713SBiju Das cpg_write(RMSTPCR2, 0x000E0FDCU); 263499c2713SBiju Das cpg_write(RMSTPCR3, 0xFFFFFFDFU); 264499c2713SBiju Das cpg_write(RMSTPCR4, 0x80000004U); 265499c2713SBiju Das cpg_write(RMSTPCR5, 0xC3FFFFFFU); 266499c2713SBiju Das cpg_write(RMSTPCR6, 0xFFFFFFFFU); 267499c2713SBiju Das cpg_write(RMSTPCR7, 0xFFFFFFFFU); 268499c2713SBiju Das cpg_write(RMSTPCR8, 0x00F1FFF7U); 269499c2713SBiju Das cpg_write(RMSTPCR9, 0xFFFFFFDFU); 270499c2713SBiju Das cpg_write(RMSTPCR10, 0xFFFFFFE8U); 271499c2713SBiju Das cpg_write(RMSTPCR11, 0x000000B7U); 272499c2713SBiju Das } 273499c2713SBiju Das 274499c2713SBiju Das static void bl2_system_cpg_init_e3(void) 275499c2713SBiju Das { 276499c2713SBiju Das /* System Module Stop Control Registers */ 277499c2713SBiju Das cpg_write(SMSTPCR0, 0x00210000U); 278499c2713SBiju Das cpg_write(SMSTPCR1, 0xFFFFFFFFU); 279499c2713SBiju Das cpg_write(SMSTPCR2, 0x000E2FDCU); 280499c2713SBiju Das cpg_write(SMSTPCR3, 0xFFFFFBDFU); 281499c2713SBiju Das cpg_write(SMSTPCR4, 0x80000004U); 282499c2713SBiju Das cpg_write(SMSTPCR5, 0xC3FFFFFFU); 283499c2713SBiju Das cpg_write(SMSTPCR6, 0xFFFFFFFFU); 284499c2713SBiju Das cpg_write(SMSTPCR7, 0xFFFFFFFFU); 285499c2713SBiju Das cpg_write(SMSTPCR8, 0x00F1FFF7U); 286499c2713SBiju Das cpg_write(SMSTPCR9, 0xFFFFFFDFU); 287499c2713SBiju Das cpg_write(SMSTPCR10, 0xFFFFFFE8U); 288499c2713SBiju Das cpg_write(SMSTPCR11, 0x000000B7U); 289499c2713SBiju Das } 290499c2713SBiju Das #endif 291499c2713SBiju Das 292499c2713SBiju Das #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RCAR_D3) 293499c2713SBiju Das static void bl2_realtime_cpg_init_d3(void) 294499c2713SBiju Das { 295499c2713SBiju Das /* Realtime Module Stop Control Registers */ 296499c2713SBiju Das cpg_write(RMSTPCR0, 0x00010000U); 297499c2713SBiju Das cpg_write(RMSTPCR1, 0xFFFFFFFFU); 298499c2713SBiju Das cpg_write(RMSTPCR2, 0x00060FDCU); 299499c2713SBiju Das cpg_write(RMSTPCR3, 0xFFFFFFDFU); 300499c2713SBiju Das cpg_write(RMSTPCR4, 0x80000184U); 301499c2713SBiju Das cpg_write(RMSTPCR5, 0x83FFFFFFU); 302499c2713SBiju Das cpg_write(RMSTPCR6, 0xFFFFFFFFU); 303499c2713SBiju Das cpg_write(RMSTPCR7, 0xFFFFFFFFU); 304499c2713SBiju Das cpg_write(RMSTPCR8, 0x00F1FFF7U); 305499c2713SBiju Das cpg_write(RMSTPCR9, 0xF3F5E016U); 306499c2713SBiju Das cpg_write(RMSTPCR10, 0xFFFEFFE0U); 307499c2713SBiju Das cpg_write(RMSTPCR11, 0x000000B7U); 308499c2713SBiju Das } 309499c2713SBiju Das 310499c2713SBiju Das static void bl2_system_cpg_init_d3(void) 311499c2713SBiju Das { 312499c2713SBiju Das /* System Module Stop Control Registers */ 313499c2713SBiju Das cpg_write(SMSTPCR0, 0x00010000U); 314499c2713SBiju Das cpg_write(SMSTPCR1, 0xFFFFFFFFU); 315499c2713SBiju Das cpg_write(SMSTPCR2, 0x00060FDCU); 316499c2713SBiju Das cpg_write(SMSTPCR3, 0xFFFFFBDFU); 317499c2713SBiju Das cpg_write(SMSTPCR4, 0x00000084U); 318499c2713SBiju Das cpg_write(SMSTPCR5, 0x83FFFFFFU); 319499c2713SBiju Das cpg_write(SMSTPCR6, 0xFFFFFFFFU); 320499c2713SBiju Das cpg_write(SMSTPCR7, 0xFFFFFFFFU); 321499c2713SBiju Das cpg_write(SMSTPCR8, 0x00F1FFF7U); 322499c2713SBiju Das cpg_write(SMSTPCR9, 0xF3F5E016U); 323499c2713SBiju Das cpg_write(SMSTPCR10, 0xFFFEFFE0U); 324499c2713SBiju Das cpg_write(SMSTPCR11, 0x000000B7U); 325499c2713SBiju Das } 326499c2713SBiju Das #endif 327499c2713SBiju Das 328499c2713SBiju Das void bl2_cpg_init(void) 329499c2713SBiju Das { 330499c2713SBiju Das uint32_t boot_cpu = mmio_read_32(RCAR_MODEMR) & MODEMR_BOOT_CPU_MASK; 331499c2713SBiju Das #if RCAR_LSI == RCAR_AUTO 332499c2713SBiju Das uint32_t product = mmio_read_32(RCAR_PRR) & PRR_PRODUCT_MASK; 333499c2713SBiju Das #endif 334499c2713SBiju Das bl2_secure_cpg_init(); 335499c2713SBiju Das 336499c2713SBiju Das if (boot_cpu == MODEMR_BOOT_CPU_CA57 || 337499c2713SBiju Das boot_cpu == MODEMR_BOOT_CPU_CA53) { 338499c2713SBiju Das #if RCAR_LSI == RCAR_AUTO 339499c2713SBiju Das 340499c2713SBiju Das switch (product) { 341499c2713SBiju Das case PRR_PRODUCT_H3: 342499c2713SBiju Das bl2_realtime_cpg_init_h3(); 343499c2713SBiju Das break; 344499c2713SBiju Das case PRR_PRODUCT_M3: 345499c2713SBiju Das bl2_realtime_cpg_init_m3(); 346499c2713SBiju Das break; 347499c2713SBiju Das case PRR_PRODUCT_M3N: 348499c2713SBiju Das bl2_realtime_cpg_init_m3n(); 349499c2713SBiju Das break; 350499c2713SBiju Das case PRR_PRODUCT_V3M: 351499c2713SBiju Das bl2_realtime_cpg_init_v3m(); 352499c2713SBiju Das break; 353499c2713SBiju Das case PRR_PRODUCT_E3: 354499c2713SBiju Das bl2_realtime_cpg_init_e3(); 355499c2713SBiju Das break; 356499c2713SBiju Das case PRR_PRODUCT_D3: 357499c2713SBiju Das bl2_realtime_cpg_init_d3(); 358499c2713SBiju Das break; 359499c2713SBiju Das default: 360499c2713SBiju Das panic(); 361499c2713SBiju Das break; 362499c2713SBiju Das } 363499c2713SBiju Das #elif (RCAR_LSI == RCAR_H3) || (RCAR_LSI == RCAR_H3N) 364499c2713SBiju Das bl2_realtime_cpg_init_h3(); 365*db10bad9SBiju Das #elif (RCAR_LSI == RCAR_M3) || (RCAR_LSI == RZ_G2M) 366499c2713SBiju Das bl2_realtime_cpg_init_m3(); 367499c2713SBiju Das #elif RCAR_LSI == RCAR_M3N 368499c2713SBiju Das bl2_realtime_cpg_init_m3n(); 369499c2713SBiju Das #elif RCAR_LSI == RCAR_V3M 370499c2713SBiju Das bl2_realtime_cpg_init_v3m(); 371499c2713SBiju Das #elif RCAR_LSI == RCAR_E3 372499c2713SBiju Das bl2_realtime_cpg_init_e3(); 373499c2713SBiju Das #elif RCAR_LSI == RCAR_D3 374499c2713SBiju Das bl2_realtime_cpg_init_d3(); 375499c2713SBiju Das #else 376499c2713SBiju Das #error "Don't have CPG initialize routine(unknown)." 377499c2713SBiju Das #endif 378499c2713SBiju Das } 379499c2713SBiju Das } 380499c2713SBiju Das 381499c2713SBiju Das void bl2_system_cpg_init(void) 382499c2713SBiju Das { 383499c2713SBiju Das #if RCAR_LSI == RCAR_AUTO 384499c2713SBiju Das uint32_t product = mmio_read_32(RCAR_PRR) & PRR_PRODUCT_MASK; 385499c2713SBiju Das 386499c2713SBiju Das switch (product) { 387499c2713SBiju Das case PRR_PRODUCT_H3: 388499c2713SBiju Das bl2_system_cpg_init_h3(); 389499c2713SBiju Das break; 390499c2713SBiju Das case PRR_PRODUCT_M3: 391499c2713SBiju Das bl2_system_cpg_init_m3(); 392499c2713SBiju Das break; 393499c2713SBiju Das case PRR_PRODUCT_M3N: 394499c2713SBiju Das bl2_system_cpg_init_m3n(); 395499c2713SBiju Das break; 396499c2713SBiju Das case PRR_PRODUCT_V3M: 397499c2713SBiju Das bl2_system_cpg_init_v3m(); 398499c2713SBiju Das break; 399499c2713SBiju Das case PRR_PRODUCT_E3: 400499c2713SBiju Das bl2_system_cpg_init_e3(); 401499c2713SBiju Das break; 402499c2713SBiju Das case PRR_PRODUCT_D3: 403499c2713SBiju Das bl2_system_cpg_init_d3(); 404499c2713SBiju Das break; 405499c2713SBiju Das default: 406499c2713SBiju Das panic(); 407499c2713SBiju Das break; 408499c2713SBiju Das } 409499c2713SBiju Das #elif (RCAR_LSI == RCAR_H3) || (RCAR_LSI == RCAR_H3N) 410499c2713SBiju Das bl2_system_cpg_init_h3(); 411*db10bad9SBiju Das #elif (RCAR_LSI == RCAR_M3) || (RCAR_LSI == RZ_G2M) 412499c2713SBiju Das bl2_system_cpg_init_m3(); 413499c2713SBiju Das #elif RCAR_LSI == RCAR_M3N 414499c2713SBiju Das bl2_system_cpg_init_m3n(); 415499c2713SBiju Das #elif RCAR_LSI == RCAR_V3M 416499c2713SBiju Das bl2_system_cpg_init_v3m(); 417499c2713SBiju Das #elif RCAR_LSI == RCAR_E3 418499c2713SBiju Das bl2_system_cpg_init_e3(); 419499c2713SBiju Das #elif RCAR_LSI == RCAR_D3 420499c2713SBiju Das bl2_system_cpg_init_d3(); 421499c2713SBiju Das #else 422499c2713SBiju Das #error "Don't have CPG initialize routine(unknown)." 423499c2713SBiju Das #endif 424499c2713SBiju Das } 425