1*c25c4fd0SThomas Petazzoni/* 2*c25c4fd0SThomas Petazzoni * (C) Copyright 2006 3*c25c4fd0SThomas Petazzoni * Vipin Kumar, ST Micoelectronics, vipin.kumar@st.com. 4*c25c4fd0SThomas Petazzoni * 5*c25c4fd0SThomas Petazzoni * SPDX-License-Identifier: GPL-2.0+ 6*c25c4fd0SThomas Petazzoni */ 7*c25c4fd0SThomas Petazzoni 8*c25c4fd0SThomas Petazzoni#include <config.h> 9*c25c4fd0SThomas Petazzoni 10*c25c4fd0SThomas Petazzoni/* 11*c25c4fd0SThomas Petazzoni * platform specific initializations are already done in Xloader 12*c25c4fd0SThomas Petazzoni * Initializations already done include 13*c25c4fd0SThomas Petazzoni * DDR, PLLs, IP's clock enable and reset release etc 14*c25c4fd0SThomas Petazzoni */ 15*c25c4fd0SThomas Petazzoni.globl lowlevel_init 16*c25c4fd0SThomas Petazzonilowlevel_init: 17*c25c4fd0SThomas Petazzoni mov pc, lr 18*c25c4fd0SThomas Petazzoni 19*c25c4fd0SThomas Petazzoni/* void setfreq(unsigned int device, unsigned int frequency) */ 20*c25c4fd0SThomas Petazzoni.global setfreq 21*c25c4fd0SThomas Petazzonisetfreq: 22*c25c4fd0SThomas Petazzoni stmfd sp!,{r14} 23*c25c4fd0SThomas Petazzoni stmfd sp!,{r0-r12} 24*c25c4fd0SThomas Petazzoni 25*c25c4fd0SThomas Petazzoni mov r8,sp 26*c25c4fd0SThomas Petazzoni ldr sp,SRAM_STACK_V 27*c25c4fd0SThomas Petazzoni 28*c25c4fd0SThomas Petazzoni /* Saving the function arguements for later use */ 29*c25c4fd0SThomas Petazzoni mov r4,r0 30*c25c4fd0SThomas Petazzoni mov r5,r1 31*c25c4fd0SThomas Petazzoni 32*c25c4fd0SThomas Petazzoni /* Putting DDR into self refresh */ 33*c25c4fd0SThomas Petazzoni ldr r0,DDR_07_V 34*c25c4fd0SThomas Petazzoni ldr r1,[r0] 35*c25c4fd0SThomas Petazzoni ldr r2,DDR_ACTIVE_V 36*c25c4fd0SThomas Petazzoni bic r1, r1, r2 37*c25c4fd0SThomas Petazzoni str r1,[r0] 38*c25c4fd0SThomas Petazzoni ldr r0,DDR_57_V 39*c25c4fd0SThomas Petazzoni ldr r1,[r0] 40*c25c4fd0SThomas Petazzoni ldr r2,CYCLES_MASK_V 41*c25c4fd0SThomas Petazzoni bic r1, r1, r2 42*c25c4fd0SThomas Petazzoni ldr r2,REFRESH_CYCLES_V 43*c25c4fd0SThomas Petazzoni orr r1, r1, r2, lsl #16 44*c25c4fd0SThomas Petazzoni str r1,[r0] 45*c25c4fd0SThomas Petazzoni ldr r0,DDR_07_V 46*c25c4fd0SThomas Petazzoni ldr r1,[r0] 47*c25c4fd0SThomas Petazzoni ldr r2,SREFRESH_MASK_V 48*c25c4fd0SThomas Petazzoni orr r1, r1, r2 49*c25c4fd0SThomas Petazzoni str r1,[r0] 50*c25c4fd0SThomas Petazzoni 51*c25c4fd0SThomas Petazzoni /* flush pipeline */ 52*c25c4fd0SThomas Petazzoni b flush 53*c25c4fd0SThomas Petazzoni .align 5 54*c25c4fd0SThomas Petazzoniflush: 55*c25c4fd0SThomas Petazzoni /* Delay to ensure self refresh mode */ 56*c25c4fd0SThomas Petazzoni ldr r0,SREFRESH_DELAY_V 57*c25c4fd0SThomas Petazzonidelay: 58*c25c4fd0SThomas Petazzoni sub r0,r0,#1 59*c25c4fd0SThomas Petazzoni cmp r0,#0 60*c25c4fd0SThomas Petazzoni bne delay 61*c25c4fd0SThomas Petazzoni 62*c25c4fd0SThomas Petazzoni /* Putting system in slow mode */ 63*c25c4fd0SThomas Petazzoni ldr r0,SCCTRL_V 64*c25c4fd0SThomas Petazzoni mov r1,#2 65*c25c4fd0SThomas Petazzoni str r1,[r0] 66*c25c4fd0SThomas Petazzoni 67*c25c4fd0SThomas Petazzoni /* Changing PLL(1/2) frequency */ 68*c25c4fd0SThomas Petazzoni mov r0,r4 69*c25c4fd0SThomas Petazzoni mov r1,r5 70*c25c4fd0SThomas Petazzoni 71*c25c4fd0SThomas Petazzoni cmp r4,#0 72*c25c4fd0SThomas Petazzoni beq pll1_freq 73*c25c4fd0SThomas Petazzoni 74*c25c4fd0SThomas Petazzoni /* Change PLL2 (DDR frequency) */ 75*c25c4fd0SThomas Petazzoni ldr r6,PLL2_FREQ_V 76*c25c4fd0SThomas Petazzoni ldr r7,PLL2_CNTL_V 77*c25c4fd0SThomas Petazzoni b pll2_freq 78*c25c4fd0SThomas Petazzoni 79*c25c4fd0SThomas Petazzonipll1_freq: 80*c25c4fd0SThomas Petazzoni /* Change PLL1 (CPU frequency) */ 81*c25c4fd0SThomas Petazzoni ldr r6,PLL1_FREQ_V 82*c25c4fd0SThomas Petazzoni ldr r7,PLL1_CNTL_V 83*c25c4fd0SThomas Petazzoni 84*c25c4fd0SThomas Petazzonipll2_freq: 85*c25c4fd0SThomas Petazzoni mov r0,r6 86*c25c4fd0SThomas Petazzoni ldr r1,[r0] 87*c25c4fd0SThomas Petazzoni ldr r2,PLLFREQ_MASK_V 88*c25c4fd0SThomas Petazzoni bic r1,r1,r2 89*c25c4fd0SThomas Petazzoni mov r2,r5,lsr#1 90*c25c4fd0SThomas Petazzoni orr r1,r1,r2,lsl#24 91*c25c4fd0SThomas Petazzoni str r1,[r0] 92*c25c4fd0SThomas Petazzoni 93*c25c4fd0SThomas Petazzoni mov r0,r7 94*c25c4fd0SThomas Petazzoni ldr r1,P1C0A_V 95*c25c4fd0SThomas Petazzoni str r1,[r0] 96*c25c4fd0SThomas Petazzoni ldr r1,P1C0E_V 97*c25c4fd0SThomas Petazzoni str r1,[r0] 98*c25c4fd0SThomas Petazzoni ldr r1,P1C06_V 99*c25c4fd0SThomas Petazzoni str r1,[r0] 100*c25c4fd0SThomas Petazzoni ldr r1,P1C0E_V 101*c25c4fd0SThomas Petazzoni str r1,[r0] 102*c25c4fd0SThomas Petazzoni 103*c25c4fd0SThomas Petazzonilock: 104*c25c4fd0SThomas Petazzoni ldr r1,[r0] 105*c25c4fd0SThomas Petazzoni and r1,r1,#1 106*c25c4fd0SThomas Petazzoni cmp r1,#0 107*c25c4fd0SThomas Petazzoni beq lock 108*c25c4fd0SThomas Petazzoni 109*c25c4fd0SThomas Petazzoni /* Putting system back to normal mode */ 110*c25c4fd0SThomas Petazzoni ldr r0,SCCTRL_V 111*c25c4fd0SThomas Petazzoni mov r1,#4 112*c25c4fd0SThomas Petazzoni str r1,[r0] 113*c25c4fd0SThomas Petazzoni 114*c25c4fd0SThomas Petazzoni /* Putting DDR back to normal */ 115*c25c4fd0SThomas Petazzoni ldr r0,DDR_07_V 116*c25c4fd0SThomas Petazzoni ldr r1,[R0] 117*c25c4fd0SThomas Petazzoni ldr r2,SREFRESH_MASK_V 118*c25c4fd0SThomas Petazzoni bic r1, r1, r2 119*c25c4fd0SThomas Petazzoni str r1,[r0] 120*c25c4fd0SThomas Petazzoni ldr r2,DDR_ACTIVE_V 121*c25c4fd0SThomas Petazzoni orr r1, r1, r2 122*c25c4fd0SThomas Petazzoni str r1,[r0] 123*c25c4fd0SThomas Petazzoni 124*c25c4fd0SThomas Petazzoni /* Delay to ensure self refresh mode */ 125*c25c4fd0SThomas Petazzoni ldr r0,SREFRESH_DELAY_V 126*c25c4fd0SThomas Petazzoni1: 127*c25c4fd0SThomas Petazzoni sub r0,r0,#1 128*c25c4fd0SThomas Petazzoni cmp r0,#0 129*c25c4fd0SThomas Petazzoni bne 1b 130*c25c4fd0SThomas Petazzoni 131*c25c4fd0SThomas Petazzoni mov sp,r8 132*c25c4fd0SThomas Petazzoni /* Resuming back to code */ 133*c25c4fd0SThomas Petazzoni ldmia sp!,{r0-r12} 134*c25c4fd0SThomas Petazzoni ldmia sp!,{pc} 135*c25c4fd0SThomas Petazzoni 136*c25c4fd0SThomas PetazzoniSCCTRL_V: 137*c25c4fd0SThomas Petazzoni .word 0xfca00000 138*c25c4fd0SThomas PetazzoniPLL1_FREQ_V: 139*c25c4fd0SThomas Petazzoni .word 0xfca8000C 140*c25c4fd0SThomas PetazzoniPLL1_CNTL_V: 141*c25c4fd0SThomas Petazzoni .word 0xfca80008 142*c25c4fd0SThomas PetazzoniPLL2_FREQ_V: 143*c25c4fd0SThomas Petazzoni .word 0xfca80018 144*c25c4fd0SThomas PetazzoniPLL2_CNTL_V: 145*c25c4fd0SThomas Petazzoni .word 0xfca80014 146*c25c4fd0SThomas PetazzoniPLLFREQ_MASK_V: 147*c25c4fd0SThomas Petazzoni .word 0xff000000 148*c25c4fd0SThomas PetazzoniP1C0A_V: 149*c25c4fd0SThomas Petazzoni .word 0x1C0A 150*c25c4fd0SThomas PetazzoniP1C0E_V: 151*c25c4fd0SThomas Petazzoni .word 0x1C0E 152*c25c4fd0SThomas PetazzoniP1C06_V: 153*c25c4fd0SThomas Petazzoni .word 0x1C06 154*c25c4fd0SThomas Petazzoni 155*c25c4fd0SThomas PetazzoniSREFRESH_DELAY_V: 156*c25c4fd0SThomas Petazzoni .word 0x9999 157*c25c4fd0SThomas PetazzoniSRAM_STACK_V: 158*c25c4fd0SThomas Petazzoni .word 0xD2800600 159*c25c4fd0SThomas PetazzoniDDR_07_V: 160*c25c4fd0SThomas Petazzoni .word 0xfc60001c 161*c25c4fd0SThomas PetazzoniDDR_ACTIVE_V: 162*c25c4fd0SThomas Petazzoni .word 0x01000000 163*c25c4fd0SThomas PetazzoniDDR_57_V: 164*c25c4fd0SThomas Petazzoni .word 0xfc6000e4 165*c25c4fd0SThomas PetazzoniCYCLES_MASK_V: 166*c25c4fd0SThomas Petazzoni .word 0xffff0000 167*c25c4fd0SThomas PetazzoniREFRESH_CYCLES_V: 168*c25c4fd0SThomas Petazzoni .word 0xf0f0 169*c25c4fd0SThomas PetazzoniSREFRESH_MASK_V: 170*c25c4fd0SThomas Petazzoni .word 0x00010000 171*c25c4fd0SThomas Petazzoni 172*c25c4fd0SThomas Petazzoni.global setfreq_sz 173*c25c4fd0SThomas Petazzonisetfreq_sz: 174*c25c4fd0SThomas Petazzoni .word setfreq_sz - setfreq 175