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