1*4882a593Smuzhiyun/* 2*4882a593Smuzhiyun * Copyright (C) 2007, Guennadi Liakhovetski <lg@denx.de> 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * (C) Copyright 2009 Freescale Semiconductor, Inc. 5*4882a593Smuzhiyun * 6*4882a593Smuzhiyun * SPDX-License-Identifier: GPL-2.0+ 7*4882a593Smuzhiyun */ 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun#include <config.h> 10*4882a593Smuzhiyun#include <asm/arch/imx-regs.h> 11*4882a593Smuzhiyun#include <generated/asm-offsets.h> 12*4882a593Smuzhiyun#include <linux/linkage.h> 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun.section ".text.init", "x" 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun.macro init_arm_erratum 17*4882a593Smuzhiyun /* ARM erratum ID #468414 */ 18*4882a593Smuzhiyun mrc 15, 0, r1, c1, c0, 1 19*4882a593Smuzhiyun orr r1, r1, #(1 << 5) /* enable L1NEON bit */ 20*4882a593Smuzhiyun mcr 15, 0, r1, c1, c0, 1 21*4882a593Smuzhiyun.endm 22*4882a593Smuzhiyun 23*4882a593Smuzhiyun/* 24*4882a593Smuzhiyun * L2CC Cache setup/invalidation/disable 25*4882a593Smuzhiyun */ 26*4882a593Smuzhiyun.macro init_l2cc 27*4882a593Smuzhiyun /* explicitly disable L2 cache */ 28*4882a593Smuzhiyun mrc 15, 0, r0, c1, c0, 1 29*4882a593Smuzhiyun bic r0, r0, #0x2 30*4882a593Smuzhiyun mcr 15, 0, r0, c1, c0, 1 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun /* reconfigure L2 cache aux control reg */ 33*4882a593Smuzhiyun ldr r0, =0xC0 | /* tag RAM */ \ 34*4882a593Smuzhiyun 0x4 | /* data RAM */ \ 35*4882a593Smuzhiyun 1 << 24 | /* disable write allocate delay */ \ 36*4882a593Smuzhiyun 1 << 23 | /* disable write allocate combine */ \ 37*4882a593Smuzhiyun 1 << 22 /* disable write allocate */ 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun#if defined(CONFIG_MX51) 40*4882a593Smuzhiyun ldr r3, [r4, #ROM_SI_REV] 41*4882a593Smuzhiyun cmp r3, #0x10 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun /* disable write combine for TO 2 and lower revs */ 44*4882a593Smuzhiyun orrls r0, r0, #1 << 25 45*4882a593Smuzhiyun#endif 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun mcr 15, 1, r0, c9, c0, 2 48*4882a593Smuzhiyun 49*4882a593Smuzhiyun /* enable L2 cache */ 50*4882a593Smuzhiyun mrc 15, 0, r0, c1, c0, 1 51*4882a593Smuzhiyun orr r0, r0, #2 52*4882a593Smuzhiyun mcr 15, 0, r0, c1, c0, 1 53*4882a593Smuzhiyun 54*4882a593Smuzhiyun.endm /* init_l2cc */ 55*4882a593Smuzhiyun 56*4882a593Smuzhiyun/* AIPS setup - Only setup MPROTx registers. 57*4882a593Smuzhiyun * The PACR default values are good.*/ 58*4882a593Smuzhiyun.macro init_aips 59*4882a593Smuzhiyun /* 60*4882a593Smuzhiyun * Set all MPROTx to be non-bufferable, trusted for R/W, 61*4882a593Smuzhiyun * not forced to user-mode. 62*4882a593Smuzhiyun */ 63*4882a593Smuzhiyun ldr r0, =AIPS1_BASE_ADDR 64*4882a593Smuzhiyun ldr r1, =0x77777777 65*4882a593Smuzhiyun str r1, [r0, #0x0] 66*4882a593Smuzhiyun str r1, [r0, #0x4] 67*4882a593Smuzhiyun ldr r0, =AIPS2_BASE_ADDR 68*4882a593Smuzhiyun str r1, [r0, #0x0] 69*4882a593Smuzhiyun str r1, [r0, #0x4] 70*4882a593Smuzhiyun /* 71*4882a593Smuzhiyun * Clear the on and off peripheral modules Supervisor Protect bit 72*4882a593Smuzhiyun * for SDMA to access them. Did not change the AIPS control registers 73*4882a593Smuzhiyun * (offset 0x20) access type 74*4882a593Smuzhiyun */ 75*4882a593Smuzhiyun.endm /* init_aips */ 76*4882a593Smuzhiyun 77*4882a593Smuzhiyun/* M4IF setup */ 78*4882a593Smuzhiyun.macro init_m4if 79*4882a593Smuzhiyun#ifdef CONFIG_MX51 80*4882a593Smuzhiyun /* VPU and IPU given higher priority (0x4) 81*4882a593Smuzhiyun * IPU accesses with ID=0x1 given highest priority (=0xA) 82*4882a593Smuzhiyun */ 83*4882a593Smuzhiyun ldr r0, =M4IF_BASE_ADDR 84*4882a593Smuzhiyun 85*4882a593Smuzhiyun ldr r1, =0x00000203 86*4882a593Smuzhiyun str r1, [r0, #0x40] 87*4882a593Smuzhiyun 88*4882a593Smuzhiyun str r4, [r0, #0x44] 89*4882a593Smuzhiyun 90*4882a593Smuzhiyun ldr r1, =0x00120125 91*4882a593Smuzhiyun str r1, [r0, #0x9C] 92*4882a593Smuzhiyun 93*4882a593Smuzhiyun ldr r1, =0x001901A3 94*4882a593Smuzhiyun str r1, [r0, #0x48] 95*4882a593Smuzhiyun 96*4882a593Smuzhiyun#endif 97*4882a593Smuzhiyun.endm /* init_m4if */ 98*4882a593Smuzhiyun 99*4882a593Smuzhiyun.macro setup_pll pll, freq 100*4882a593Smuzhiyun ldr r0, =\pll 101*4882a593Smuzhiyun adr r2, W_DP_\freq 102*4882a593Smuzhiyun bl setup_pll_func 103*4882a593Smuzhiyun.endm 104*4882a593Smuzhiyun 105*4882a593Smuzhiyun#define W_DP_OP 0 106*4882a593Smuzhiyun#define W_DP_MFD 4 107*4882a593Smuzhiyun#define W_DP_MFN 8 108*4882a593Smuzhiyun 109*4882a593Smuzhiyunsetup_pll_func: 110*4882a593Smuzhiyun ldr r1, =0x00001232 111*4882a593Smuzhiyun str r1, [r0, #PLL_DP_CTL] /* Set DPLL ON (set UPEN bit): BRMO=1 */ 112*4882a593Smuzhiyun mov r1, #0x2 113*4882a593Smuzhiyun str r1, [r0, #PLL_DP_CONFIG] /* Enable auto-restart AREN bit */ 114*4882a593Smuzhiyun 115*4882a593Smuzhiyun ldr r1, [r2, #W_DP_OP] 116*4882a593Smuzhiyun str r1, [r0, #PLL_DP_OP] 117*4882a593Smuzhiyun str r1, [r0, #PLL_DP_HFS_OP] 118*4882a593Smuzhiyun 119*4882a593Smuzhiyun ldr r1, [r2, #W_DP_MFD] 120*4882a593Smuzhiyun str r1, [r0, #PLL_DP_MFD] 121*4882a593Smuzhiyun str r1, [r0, #PLL_DP_HFS_MFD] 122*4882a593Smuzhiyun 123*4882a593Smuzhiyun ldr r1, [r2, #W_DP_MFN] 124*4882a593Smuzhiyun str r1, [r0, #PLL_DP_MFN] 125*4882a593Smuzhiyun str r1, [r0, #PLL_DP_HFS_MFN] 126*4882a593Smuzhiyun 127*4882a593Smuzhiyun ldr r1, =0x00001232 128*4882a593Smuzhiyun str r1, [r0, #PLL_DP_CTL] 129*4882a593Smuzhiyun1: ldr r1, [r0, #PLL_DP_CTL] 130*4882a593Smuzhiyun ands r1, r1, #0x1 131*4882a593Smuzhiyun beq 1b 132*4882a593Smuzhiyun 133*4882a593Smuzhiyun /* r10 saved upper lr */ 134*4882a593Smuzhiyun mov pc, lr 135*4882a593Smuzhiyun 136*4882a593Smuzhiyun.macro setup_pll_errata pll, freq 137*4882a593Smuzhiyun ldr r2, =\pll 138*4882a593Smuzhiyun str r4, [r2, #PLL_DP_CONFIG] /* Disable auto-restart AREN bit */ 139*4882a593Smuzhiyun ldr r1, =0x00001236 140*4882a593Smuzhiyun str r1, [r2, #PLL_DP_CTL] /* Restart PLL with PLM=1 */ 141*4882a593Smuzhiyun1: ldr r1, [r2, #PLL_DP_CTL] /* Wait for lock */ 142*4882a593Smuzhiyun ands r1, r1, #0x1 143*4882a593Smuzhiyun beq 1b 144*4882a593Smuzhiyun 145*4882a593Smuzhiyun ldr r5, \freq 146*4882a593Smuzhiyun str r5, [r2, #PLL_DP_MFN] /* Modify MFN value */ 147*4882a593Smuzhiyun str r5, [r2, #PLL_DP_HFS_MFN] 148*4882a593Smuzhiyun 149*4882a593Smuzhiyun mov r1, #0x1 150*4882a593Smuzhiyun str r1, [r2, #PLL_DP_CONFIG] /* Reload MFN value */ 151*4882a593Smuzhiyun 152*4882a593Smuzhiyun2: ldr r1, [r2, #PLL_DP_CONFIG] 153*4882a593Smuzhiyun tst r1, #1 154*4882a593Smuzhiyun bne 2b 155*4882a593Smuzhiyun 156*4882a593Smuzhiyun ldr r1, =100 /* Wait at least 4 us */ 157*4882a593Smuzhiyun3: subs r1, r1, #1 158*4882a593Smuzhiyun bge 3b 159*4882a593Smuzhiyun 160*4882a593Smuzhiyun mov r1, #0x2 161*4882a593Smuzhiyun str r1, [r2, #PLL_DP_CONFIG] /* Enable auto-restart AREN bit */ 162*4882a593Smuzhiyun.endm 163*4882a593Smuzhiyun 164*4882a593Smuzhiyun.macro init_clock 165*4882a593Smuzhiyun#if defined (CONFIG_MX51) 166*4882a593Smuzhiyun ldr r0, =CCM_BASE_ADDR 167*4882a593Smuzhiyun 168*4882a593Smuzhiyun /* Gate of clocks to the peripherals first */ 169*4882a593Smuzhiyun ldr r1, =0x3FFFFFFF 170*4882a593Smuzhiyun str r1, [r0, #CLKCTL_CCGR0] 171*4882a593Smuzhiyun str r4, [r0, #CLKCTL_CCGR1] 172*4882a593Smuzhiyun str r4, [r0, #CLKCTL_CCGR2] 173*4882a593Smuzhiyun str r4, [r0, #CLKCTL_CCGR3] 174*4882a593Smuzhiyun 175*4882a593Smuzhiyun ldr r1, =0x00030000 176*4882a593Smuzhiyun str r1, [r0, #CLKCTL_CCGR4] 177*4882a593Smuzhiyun ldr r1, =0x00FFF030 178*4882a593Smuzhiyun str r1, [r0, #CLKCTL_CCGR5] 179*4882a593Smuzhiyun ldr r1, =0x00000300 180*4882a593Smuzhiyun str r1, [r0, #CLKCTL_CCGR6] 181*4882a593Smuzhiyun 182*4882a593Smuzhiyun /* Disable IPU and HSC dividers */ 183*4882a593Smuzhiyun mov r1, #0x60000 184*4882a593Smuzhiyun str r1, [r0, #CLKCTL_CCDR] 185*4882a593Smuzhiyun 186*4882a593Smuzhiyun /* Make sure to switch the DDR away from PLL 1 */ 187*4882a593Smuzhiyun ldr r1, =0x19239145 188*4882a593Smuzhiyun str r1, [r0, #CLKCTL_CBCDR] 189*4882a593Smuzhiyun /* make sure divider effective */ 190*4882a593Smuzhiyun1: ldr r1, [r0, #CLKCTL_CDHIPR] 191*4882a593Smuzhiyun cmp r1, #0x0 192*4882a593Smuzhiyun bne 1b 193*4882a593Smuzhiyun 194*4882a593Smuzhiyun /* Switch ARM to step clock */ 195*4882a593Smuzhiyun mov r1, #0x4 196*4882a593Smuzhiyun str r1, [r0, #CLKCTL_CCSR] 197*4882a593Smuzhiyun 198*4882a593Smuzhiyun#if defined(CONFIG_MX51_PLL_ERRATA) 199*4882a593Smuzhiyun setup_pll PLL1_BASE_ADDR, 864 200*4882a593Smuzhiyun setup_pll_errata PLL1_BASE_ADDR, W_DP_MFN_800_DIT 201*4882a593Smuzhiyun#else 202*4882a593Smuzhiyun setup_pll PLL1_BASE_ADDR, 800 203*4882a593Smuzhiyun#endif 204*4882a593Smuzhiyun 205*4882a593Smuzhiyun setup_pll PLL3_BASE_ADDR, 665 206*4882a593Smuzhiyun 207*4882a593Smuzhiyun /* Switch peripheral to PLL 3 */ 208*4882a593Smuzhiyun ldr r0, =CCM_BASE_ADDR 209*4882a593Smuzhiyun ldr r1, =0x000010C0 | CONFIG_SYS_DDR_CLKSEL 210*4882a593Smuzhiyun str r1, [r0, #CLKCTL_CBCMR] 211*4882a593Smuzhiyun ldr r1, =0x13239145 212*4882a593Smuzhiyun str r1, [r0, #CLKCTL_CBCDR] 213*4882a593Smuzhiyun setup_pll PLL2_BASE_ADDR, 665 214*4882a593Smuzhiyun 215*4882a593Smuzhiyun /* Switch peripheral to PLL2 */ 216*4882a593Smuzhiyun ldr r0, =CCM_BASE_ADDR 217*4882a593Smuzhiyun ldr r1, =0x19239145 218*4882a593Smuzhiyun str r1, [r0, #CLKCTL_CBCDR] 219*4882a593Smuzhiyun ldr r1, =0x000020C0 | CONFIG_SYS_DDR_CLKSEL 220*4882a593Smuzhiyun str r1, [r0, #CLKCTL_CBCMR] 221*4882a593Smuzhiyun 222*4882a593Smuzhiyun setup_pll PLL3_BASE_ADDR, 216 223*4882a593Smuzhiyun 224*4882a593Smuzhiyun /* Set the platform clock dividers */ 225*4882a593Smuzhiyun ldr r0, =ARM_BASE_ADDR 226*4882a593Smuzhiyun ldr r1, =0x00000725 227*4882a593Smuzhiyun str r1, [r0, #0x14] 228*4882a593Smuzhiyun 229*4882a593Smuzhiyun ldr r0, =CCM_BASE_ADDR 230*4882a593Smuzhiyun 231*4882a593Smuzhiyun /* Run 3.0 at Full speed, for other TO's wait till we increase VDDGP */ 232*4882a593Smuzhiyun ldr r3, [r4, #ROM_SI_REV] 233*4882a593Smuzhiyun cmp r3, #0x10 234*4882a593Smuzhiyun movls r1, #0x1 235*4882a593Smuzhiyun movhi r1, #0 236*4882a593Smuzhiyun 237*4882a593Smuzhiyun str r1, [r0, #CLKCTL_CACRR] 238*4882a593Smuzhiyun 239*4882a593Smuzhiyun /* Switch ARM back to PLL 1 */ 240*4882a593Smuzhiyun str r4, [r0, #CLKCTL_CCSR] 241*4882a593Smuzhiyun 242*4882a593Smuzhiyun /* setup the rest */ 243*4882a593Smuzhiyun /* Use lp_apm (24MHz) source for perclk */ 244*4882a593Smuzhiyun ldr r1, =0x000020C2 | CONFIG_SYS_DDR_CLKSEL 245*4882a593Smuzhiyun str r1, [r0, #CLKCTL_CBCMR] 246*4882a593Smuzhiyun /* ddr clock from PLL 1, all perclk dividers are 1 since using 24MHz */ 247*4882a593Smuzhiyun ldr r1, =CONFIG_SYS_CLKTL_CBCDR 248*4882a593Smuzhiyun str r1, [r0, #CLKCTL_CBCDR] 249*4882a593Smuzhiyun 250*4882a593Smuzhiyun /* Restore the default values in the Gate registers */ 251*4882a593Smuzhiyun ldr r1, =0xFFFFFFFF 252*4882a593Smuzhiyun str r1, [r0, #CLKCTL_CCGR0] 253*4882a593Smuzhiyun str r1, [r0, #CLKCTL_CCGR1] 254*4882a593Smuzhiyun str r1, [r0, #CLKCTL_CCGR2] 255*4882a593Smuzhiyun str r1, [r0, #CLKCTL_CCGR3] 256*4882a593Smuzhiyun str r1, [r0, #CLKCTL_CCGR4] 257*4882a593Smuzhiyun str r1, [r0, #CLKCTL_CCGR5] 258*4882a593Smuzhiyun str r1, [r0, #CLKCTL_CCGR6] 259*4882a593Smuzhiyun 260*4882a593Smuzhiyun /* Use PLL 2 for UART's, get 66.5MHz from it */ 261*4882a593Smuzhiyun ldr r1, =0xA5A2A020 262*4882a593Smuzhiyun str r1, [r0, #CLKCTL_CSCMR1] 263*4882a593Smuzhiyun ldr r1, =0x00C30321 264*4882a593Smuzhiyun str r1, [r0, #CLKCTL_CSCDR1] 265*4882a593Smuzhiyun /* make sure divider effective */ 266*4882a593Smuzhiyun1: ldr r1, [r0, #CLKCTL_CDHIPR] 267*4882a593Smuzhiyun cmp r1, #0x0 268*4882a593Smuzhiyun bne 1b 269*4882a593Smuzhiyun 270*4882a593Smuzhiyun str r4, [r0, #CLKCTL_CCDR] 271*4882a593Smuzhiyun 272*4882a593Smuzhiyun /* for cko - for ARM div by 8 */ 273*4882a593Smuzhiyun mov r1, #0x000A0000 274*4882a593Smuzhiyun add r1, r1, #0x00000F0 275*4882a593Smuzhiyun str r1, [r0, #CLKCTL_CCOSR] 276*4882a593Smuzhiyun#else /* CONFIG_MX53 */ 277*4882a593Smuzhiyun ldr r0, =CCM_BASE_ADDR 278*4882a593Smuzhiyun 279*4882a593Smuzhiyun /* Gate of clocks to the peripherals first */ 280*4882a593Smuzhiyun ldr r1, =0x3FFFFFFF 281*4882a593Smuzhiyun str r1, [r0, #CLKCTL_CCGR0] 282*4882a593Smuzhiyun str r4, [r0, #CLKCTL_CCGR1] 283*4882a593Smuzhiyun str r4, [r0, #CLKCTL_CCGR2] 284*4882a593Smuzhiyun str r4, [r0, #CLKCTL_CCGR3] 285*4882a593Smuzhiyun str r4, [r0, #CLKCTL_CCGR7] 286*4882a593Smuzhiyun ldr r1, =0x00030000 287*4882a593Smuzhiyun str r1, [r0, #CLKCTL_CCGR4] 288*4882a593Smuzhiyun ldr r1, =0x00FFF030 289*4882a593Smuzhiyun str r1, [r0, #CLKCTL_CCGR5] 290*4882a593Smuzhiyun ldr r1, =0x0F00030F 291*4882a593Smuzhiyun str r1, [r0, #CLKCTL_CCGR6] 292*4882a593Smuzhiyun 293*4882a593Smuzhiyun /* Switch ARM to step clock */ 294*4882a593Smuzhiyun mov r1, #0x4 295*4882a593Smuzhiyun str r1, [r0, #CLKCTL_CCSR] 296*4882a593Smuzhiyun 297*4882a593Smuzhiyun setup_pll PLL1_BASE_ADDR, 800 298*4882a593Smuzhiyun 299*4882a593Smuzhiyun setup_pll PLL3_BASE_ADDR, 400 300*4882a593Smuzhiyun 301*4882a593Smuzhiyun /* Switch peripheral to PLL3 */ 302*4882a593Smuzhiyun ldr r0, =CCM_BASE_ADDR 303*4882a593Smuzhiyun ldr r1, =0x00015154 304*4882a593Smuzhiyun str r1, [r0, #CLKCTL_CBCMR] 305*4882a593Smuzhiyun ldr r1, =0x02898945 306*4882a593Smuzhiyun str r1, [r0, #CLKCTL_CBCDR] 307*4882a593Smuzhiyun /* make sure change is effective */ 308*4882a593Smuzhiyun1: ldr r1, [r0, #CLKCTL_CDHIPR] 309*4882a593Smuzhiyun cmp r1, #0x0 310*4882a593Smuzhiyun bne 1b 311*4882a593Smuzhiyun 312*4882a593Smuzhiyun setup_pll PLL2_BASE_ADDR, 400 313*4882a593Smuzhiyun 314*4882a593Smuzhiyun /* Switch peripheral to PLL2 */ 315*4882a593Smuzhiyun ldr r0, =CCM_BASE_ADDR 316*4882a593Smuzhiyun ldr r1, =0x00888945 317*4882a593Smuzhiyun str r1, [r0, #CLKCTL_CBCDR] 318*4882a593Smuzhiyun 319*4882a593Smuzhiyun ldr r1, =0x00016154 320*4882a593Smuzhiyun str r1, [r0, #CLKCTL_CBCMR] 321*4882a593Smuzhiyun 322*4882a593Smuzhiyun /*change uart clk parent to pll2*/ 323*4882a593Smuzhiyun ldr r1, [r0, #CLKCTL_CSCMR1] 324*4882a593Smuzhiyun and r1, r1, #0xfcffffff 325*4882a593Smuzhiyun orr r1, r1, #0x01000000 326*4882a593Smuzhiyun str r1, [r0, #CLKCTL_CSCMR1] 327*4882a593Smuzhiyun 328*4882a593Smuzhiyun /* make sure change is effective */ 329*4882a593Smuzhiyun1: ldr r1, [r0, #CLKCTL_CDHIPR] 330*4882a593Smuzhiyun cmp r1, #0x0 331*4882a593Smuzhiyun bne 1b 332*4882a593Smuzhiyun 333*4882a593Smuzhiyun setup_pll PLL3_BASE_ADDR, 216 334*4882a593Smuzhiyun 335*4882a593Smuzhiyun setup_pll PLL4_BASE_ADDR, 455 336*4882a593Smuzhiyun 337*4882a593Smuzhiyun /* Set the platform clock dividers */ 338*4882a593Smuzhiyun ldr r0, =ARM_BASE_ADDR 339*4882a593Smuzhiyun ldr r1, =0x00000124 340*4882a593Smuzhiyun str r1, [r0, #0x14] 341*4882a593Smuzhiyun 342*4882a593Smuzhiyun ldr r0, =CCM_BASE_ADDR 343*4882a593Smuzhiyun mov r1, #0 344*4882a593Smuzhiyun str r1, [r0, #CLKCTL_CACRR] 345*4882a593Smuzhiyun 346*4882a593Smuzhiyun /* Switch ARM back to PLL 1. */ 347*4882a593Smuzhiyun mov r1, #0x0 348*4882a593Smuzhiyun str r1, [r0, #CLKCTL_CCSR] 349*4882a593Smuzhiyun 350*4882a593Smuzhiyun /* make uart div=6 */ 351*4882a593Smuzhiyun ldr r1, [r0, #CLKCTL_CSCDR1] 352*4882a593Smuzhiyun and r1, r1, #0xffffffc0 353*4882a593Smuzhiyun orr r1, r1, #0x0a 354*4882a593Smuzhiyun str r1, [r0, #CLKCTL_CSCDR1] 355*4882a593Smuzhiyun 356*4882a593Smuzhiyun /* Restore the default values in the Gate registers */ 357*4882a593Smuzhiyun ldr r1, =0xFFFFFFFF 358*4882a593Smuzhiyun str r1, [r0, #CLKCTL_CCGR0] 359*4882a593Smuzhiyun str r1, [r0, #CLKCTL_CCGR1] 360*4882a593Smuzhiyun str r1, [r0, #CLKCTL_CCGR2] 361*4882a593Smuzhiyun str r1, [r0, #CLKCTL_CCGR3] 362*4882a593Smuzhiyun str r1, [r0, #CLKCTL_CCGR4] 363*4882a593Smuzhiyun str r1, [r0, #CLKCTL_CCGR5] 364*4882a593Smuzhiyun str r1, [r0, #CLKCTL_CCGR6] 365*4882a593Smuzhiyun str r1, [r0, #CLKCTL_CCGR7] 366*4882a593Smuzhiyun 367*4882a593Smuzhiyun mov r1, #0x00000 368*4882a593Smuzhiyun str r1, [r0, #CLKCTL_CCDR] 369*4882a593Smuzhiyun 370*4882a593Smuzhiyun /* for cko - for ARM div by 8 */ 371*4882a593Smuzhiyun mov r1, #0x000A0000 372*4882a593Smuzhiyun add r1, r1, #0x00000F0 373*4882a593Smuzhiyun str r1, [r0, #CLKCTL_CCOSR] 374*4882a593Smuzhiyun 375*4882a593Smuzhiyun#endif /* CONFIG_MX53 */ 376*4882a593Smuzhiyun.endm 377*4882a593Smuzhiyun 378*4882a593SmuzhiyunENTRY(lowlevel_init) 379*4882a593Smuzhiyun mov r10, lr 380*4882a593Smuzhiyun mov r4, #0 /* Fix R4 to 0 */ 381*4882a593Smuzhiyun 382*4882a593Smuzhiyun#if defined(CONFIG_SYS_MAIN_PWR_ON) 383*4882a593Smuzhiyun ldr r0, =GPIO1_BASE_ADDR 384*4882a593Smuzhiyun ldr r1, [r0, #0x0] 385*4882a593Smuzhiyun orr r1, r1, #1 << 23 386*4882a593Smuzhiyun str r1, [r0, #0x0] 387*4882a593Smuzhiyun ldr r1, [r0, #0x4] 388*4882a593Smuzhiyun orr r1, r1, #1 << 23 389*4882a593Smuzhiyun str r1, [r0, #0x4] 390*4882a593Smuzhiyun#endif 391*4882a593Smuzhiyun 392*4882a593Smuzhiyun init_arm_erratum 393*4882a593Smuzhiyun 394*4882a593Smuzhiyun init_l2cc 395*4882a593Smuzhiyun 396*4882a593Smuzhiyun init_aips 397*4882a593Smuzhiyun 398*4882a593Smuzhiyun init_m4if 399*4882a593Smuzhiyun 400*4882a593Smuzhiyun init_clock 401*4882a593Smuzhiyun 402*4882a593Smuzhiyun mov pc, r10 403*4882a593SmuzhiyunENDPROC(lowlevel_init) 404*4882a593Smuzhiyun 405*4882a593Smuzhiyun/* Board level setting value */ 406*4882a593Smuzhiyun#if defined(CONFIG_MX51_PLL_ERRATA) 407*4882a593SmuzhiyunW_DP_864: .word DP_OP_864 408*4882a593Smuzhiyun .word DP_MFD_864 409*4882a593Smuzhiyun .word DP_MFN_864 410*4882a593SmuzhiyunW_DP_MFN_800_DIT: .word DP_MFN_800_DIT 411*4882a593Smuzhiyun#else 412*4882a593SmuzhiyunW_DP_800: .word DP_OP_800 413*4882a593Smuzhiyun .word DP_MFD_800 414*4882a593Smuzhiyun .word DP_MFN_800 415*4882a593Smuzhiyun#endif 416*4882a593Smuzhiyun#if defined(CONFIG_MX51) 417*4882a593SmuzhiyunW_DP_665: .word DP_OP_665 418*4882a593Smuzhiyun .word DP_MFD_665 419*4882a593Smuzhiyun .word DP_MFN_665 420*4882a593Smuzhiyun#endif 421*4882a593SmuzhiyunW_DP_216: .word DP_OP_216 422*4882a593Smuzhiyun .word DP_MFD_216 423*4882a593Smuzhiyun .word DP_MFN_216 424*4882a593SmuzhiyunW_DP_400: .word DP_OP_400 425*4882a593Smuzhiyun .word DP_MFD_400 426*4882a593Smuzhiyun .word DP_MFN_400 427*4882a593SmuzhiyunW_DP_455: .word DP_OP_455 428*4882a593Smuzhiyun .word DP_MFD_455 429*4882a593Smuzhiyun .word DP_MFN_455 430