1*4882a593Smuzhiyun/* 2*4882a593Smuzhiyun * Low-level board setup code for TI DaVinci SoC based boards. 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * Copyright (C) 2007 Sergey Kubushyn <ksi@koi8.net> 5*4882a593Smuzhiyun * 6*4882a593Smuzhiyun * Partially based on TI sources, original copyrights follow: 7*4882a593Smuzhiyun */ 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun/* 10*4882a593Smuzhiyun * Board specific setup info 11*4882a593Smuzhiyun * 12*4882a593Smuzhiyun * (C) Copyright 2003 13*4882a593Smuzhiyun * Texas Instruments, <www.ti.com> 14*4882a593Smuzhiyun * Kshitij Gupta <Kshitij@ti.com> 15*4882a593Smuzhiyun * 16*4882a593Smuzhiyun * Modified for OMAP 1610 H2 board by Nishant Kamat, Jan 2004 17*4882a593Smuzhiyun * 18*4882a593Smuzhiyun * Modified for OMAP 5912 OSK board by Rishi Bhattacharya, Apr 2004 19*4882a593Smuzhiyun * 20*4882a593Smuzhiyun * Modified for DV-EVM board by Rishi Bhattacharya, Apr 2005 21*4882a593Smuzhiyun * 22*4882a593Smuzhiyun * Modified for DV-EVM board by Swaminathan S, Nov 2005 23*4882a593Smuzhiyun * 24*4882a593Smuzhiyun * SPDX-License-Identifier: GPL-2.0+ 25*4882a593Smuzhiyun */ 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun#include <config.h> 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun#define MDSTAT_STATE 0x3f 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun.globl lowlevel_init 32*4882a593Smuzhiyunlowlevel_init: 33*4882a593Smuzhiyun#ifdef CONFIG_SOC_DM644X 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun /*-------------------------------------------------------* 36*4882a593Smuzhiyun * Mask all IRQs by setting all bits in the EINT default * 37*4882a593Smuzhiyun *-------------------------------------------------------*/ 38*4882a593Smuzhiyun mov r1, $0 39*4882a593Smuzhiyun ldr r0, =EINT_ENABLE0 40*4882a593Smuzhiyun str r1, [r0] 41*4882a593Smuzhiyun ldr r0, =EINT_ENABLE1 42*4882a593Smuzhiyun str r1, [r0] 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun /*------------------------------------------------------* 45*4882a593Smuzhiyun * Put the GEM in reset * 46*4882a593Smuzhiyun *------------------------------------------------------*/ 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun /* Put the GEM in reset */ 49*4882a593Smuzhiyun ldr r8, PSC_GEM_FLAG_CLEAR 50*4882a593Smuzhiyun ldr r6, MDCTL_GEM 51*4882a593Smuzhiyun ldr r7, [r6] 52*4882a593Smuzhiyun and r7, r7, r8 53*4882a593Smuzhiyun str r7, [r6] 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun /* Enable the Power Domain Transition Command */ 56*4882a593Smuzhiyun ldr r6, PTCMD 57*4882a593Smuzhiyun ldr r7, [r6] 58*4882a593Smuzhiyun orr r7, r7, $0x02 59*4882a593Smuzhiyun str r7, [r6] 60*4882a593Smuzhiyun 61*4882a593Smuzhiyun /* Check for Transition Complete(PTSTAT) */ 62*4882a593SmuzhiyuncheckStatClkStopGem: 63*4882a593Smuzhiyun ldr r6, PTSTAT 64*4882a593Smuzhiyun ldr r7, [r6] 65*4882a593Smuzhiyun ands r7, r7, $0x02 66*4882a593Smuzhiyun bne checkStatClkStopGem 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun /* Check for GEM Reset Completion */ 69*4882a593SmuzhiyuncheckGemStatClkStop: 70*4882a593Smuzhiyun ldr r6, MDSTAT_GEM 71*4882a593Smuzhiyun ldr r7, [r6] 72*4882a593Smuzhiyun ands r7, r7, $0x100 73*4882a593Smuzhiyun bne checkGemStatClkStop 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun /* Do this for enabling a WDT initiated reset this is a workaround 76*4882a593Smuzhiyun for a chip bug. Not required under normal situations */ 77*4882a593Smuzhiyun ldr r6, P1394 78*4882a593Smuzhiyun mov r10, $0 79*4882a593Smuzhiyun str r10, [r6] 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun /*------------------------------------------------------* 82*4882a593Smuzhiyun * Enable L1 & L2 Memories in Fast mode * 83*4882a593Smuzhiyun *------------------------------------------------------*/ 84*4882a593Smuzhiyun ldr r6, DFT_ENABLE 85*4882a593Smuzhiyun mov r10, $0x01 86*4882a593Smuzhiyun str r10, [r6] 87*4882a593Smuzhiyun 88*4882a593Smuzhiyun ldr r6, MMARG_BRF0 89*4882a593Smuzhiyun ldr r10, MMARG_BRF0_VAL 90*4882a593Smuzhiyun str r10, [r6] 91*4882a593Smuzhiyun 92*4882a593Smuzhiyun ldr r6, DFT_ENABLE 93*4882a593Smuzhiyun mov r10, $0 94*4882a593Smuzhiyun str r10, [r6] 95*4882a593Smuzhiyun 96*4882a593Smuzhiyun /*------------------------------------------------------* 97*4882a593Smuzhiyun * DDR2 PLL Initialization * 98*4882a593Smuzhiyun *------------------------------------------------------*/ 99*4882a593Smuzhiyun 100*4882a593Smuzhiyun /* Select the Clock Mode Depending on the Value written in the Boot Table by the run script */ 101*4882a593Smuzhiyun mov r10, $0 102*4882a593Smuzhiyun ldr r6, PLL2_CTL 103*4882a593Smuzhiyun ldr r7, PLL_CLKSRC_MASK 104*4882a593Smuzhiyun ldr r8, [r6] 105*4882a593Smuzhiyun and r8, r8, r7 106*4882a593Smuzhiyun mov r9, r10, lsl $8 107*4882a593Smuzhiyun orr r8, r8, r9 108*4882a593Smuzhiyun str r8, [r6] 109*4882a593Smuzhiyun 110*4882a593Smuzhiyun /* Select the PLLEN source */ 111*4882a593Smuzhiyun ldr r7, PLL_ENSRC_MASK 112*4882a593Smuzhiyun and r8, r8, r7 113*4882a593Smuzhiyun str r8, [r6] 114*4882a593Smuzhiyun 115*4882a593Smuzhiyun /* Bypass the PLL */ 116*4882a593Smuzhiyun ldr r7, PLL_BYPASS_MASK 117*4882a593Smuzhiyun and r8, r8, r7 118*4882a593Smuzhiyun str r8, [r6] 119*4882a593Smuzhiyun 120*4882a593Smuzhiyun /* Wait for few cycles to allow PLLEN Mux switch properly to bypass Clock */ 121*4882a593Smuzhiyun mov r10, $0x20 122*4882a593SmuzhiyunWaitPPL2Loop: 123*4882a593Smuzhiyun subs r10, r10, $1 124*4882a593Smuzhiyun bne WaitPPL2Loop 125*4882a593Smuzhiyun 126*4882a593Smuzhiyun /* Reset the PLL */ 127*4882a593Smuzhiyun ldr r7, PLL_RESET_MASK 128*4882a593Smuzhiyun and r8, r8, r7 129*4882a593Smuzhiyun str r8, [r6] 130*4882a593Smuzhiyun 131*4882a593Smuzhiyun /* Power up the PLL */ 132*4882a593Smuzhiyun ldr r7, PLL_PWRUP_MASK 133*4882a593Smuzhiyun and r8, r8, r7 134*4882a593Smuzhiyun str r8, [r6] 135*4882a593Smuzhiyun 136*4882a593Smuzhiyun /* Enable the PLL from Disable Mode */ 137*4882a593Smuzhiyun ldr r7, PLL_DISABLE_ENABLE_MASK 138*4882a593Smuzhiyun and r8, r8, r7 139*4882a593Smuzhiyun str r8, [r6] 140*4882a593Smuzhiyun 141*4882a593Smuzhiyun /* Program the PLL Multiplier */ 142*4882a593Smuzhiyun ldr r6, PLL2_PLLM 143*4882a593Smuzhiyun mov r2, $0x17 /* 162 MHz */ 144*4882a593Smuzhiyun str r2, [r6] 145*4882a593Smuzhiyun 146*4882a593Smuzhiyun /* Program the PLL2 Divisor Value */ 147*4882a593Smuzhiyun ldr r6, PLL2_DIV2 148*4882a593Smuzhiyun mov r3, $0x01 149*4882a593Smuzhiyun str r3, [r6] 150*4882a593Smuzhiyun 151*4882a593Smuzhiyun /* Program the PLL2 Divisor Value */ 152*4882a593Smuzhiyun ldr r6, PLL2_DIV1 153*4882a593Smuzhiyun mov r4, $0x0b /* 54 MHz */ 154*4882a593Smuzhiyun str r4, [r6] 155*4882a593Smuzhiyun 156*4882a593Smuzhiyun /* PLL2 DIV2 MMR */ 157*4882a593Smuzhiyun ldr r8, PLL2_DIV_MASK 158*4882a593Smuzhiyun ldr r6, PLL2_DIV2 159*4882a593Smuzhiyun ldr r9, [r6] 160*4882a593Smuzhiyun and r8, r8, r9 161*4882a593Smuzhiyun mov r9, $0x01 162*4882a593Smuzhiyun mov r9, r9, lsl $15 163*4882a593Smuzhiyun orr r8, r8, r9 164*4882a593Smuzhiyun str r8, [r6] 165*4882a593Smuzhiyun 166*4882a593Smuzhiyun /* Program the GOSET bit to take new divider values */ 167*4882a593Smuzhiyun ldr r6, PLL2_PLLCMD 168*4882a593Smuzhiyun ldr r7, [r6] 169*4882a593Smuzhiyun orr r7, r7, $0x01 170*4882a593Smuzhiyun str r7, [r6] 171*4882a593Smuzhiyun 172*4882a593Smuzhiyun /* Wait for Done */ 173*4882a593Smuzhiyun ldr r6, PLL2_PLLSTAT 174*4882a593SmuzhiyundoneLoop_0: 175*4882a593Smuzhiyun ldr r7, [r6] 176*4882a593Smuzhiyun ands r7, r7, $0x01 177*4882a593Smuzhiyun bne doneLoop_0 178*4882a593Smuzhiyun 179*4882a593Smuzhiyun /* PLL2 DIV1 MMR */ 180*4882a593Smuzhiyun ldr r8, PLL2_DIV_MASK 181*4882a593Smuzhiyun ldr r6, PLL2_DIV1 182*4882a593Smuzhiyun ldr r9, [r6] 183*4882a593Smuzhiyun and r8, r8, r9 184*4882a593Smuzhiyun mov r9, $0x01 185*4882a593Smuzhiyun mov r9, r9, lsl $15 186*4882a593Smuzhiyun orr r8, r8, r9 187*4882a593Smuzhiyun str r8, [r6] 188*4882a593Smuzhiyun 189*4882a593Smuzhiyun /* Program the GOSET bit to take new divider values */ 190*4882a593Smuzhiyun ldr r6, PLL2_PLLCMD 191*4882a593Smuzhiyun ldr r7, [r6] 192*4882a593Smuzhiyun orr r7, r7, $0x01 193*4882a593Smuzhiyun str r7, [r6] 194*4882a593Smuzhiyun 195*4882a593Smuzhiyun /* Wait for Done */ 196*4882a593Smuzhiyun ldr r6, PLL2_PLLSTAT 197*4882a593SmuzhiyundoneLoop: 198*4882a593Smuzhiyun ldr r7, [r6] 199*4882a593Smuzhiyun ands r7, r7, $0x01 200*4882a593Smuzhiyun bne doneLoop 201*4882a593Smuzhiyun 202*4882a593Smuzhiyun /* Wait for PLL to Reset Properly */ 203*4882a593Smuzhiyun mov r10, $0x218 204*4882a593SmuzhiyunResetPPL2Loop: 205*4882a593Smuzhiyun subs r10, r10, $1 206*4882a593Smuzhiyun bne ResetPPL2Loop 207*4882a593Smuzhiyun 208*4882a593Smuzhiyun /* Bring PLL out of Reset */ 209*4882a593Smuzhiyun ldr r6, PLL2_CTL 210*4882a593Smuzhiyun ldr r8, [r6] 211*4882a593Smuzhiyun orr r8, r8, $0x08 212*4882a593Smuzhiyun str r8, [r6] 213*4882a593Smuzhiyun 214*4882a593Smuzhiyun /* Wait for PLL to Lock */ 215*4882a593Smuzhiyun ldr r10, PLL_LOCK_COUNT 216*4882a593SmuzhiyunPLL2Lock: 217*4882a593Smuzhiyun subs r10, r10, $1 218*4882a593Smuzhiyun bne PLL2Lock 219*4882a593Smuzhiyun 220*4882a593Smuzhiyun /* Enable the PLL */ 221*4882a593Smuzhiyun ldr r6, PLL2_CTL 222*4882a593Smuzhiyun ldr r8, [r6] 223*4882a593Smuzhiyun orr r8, r8, $0x01 224*4882a593Smuzhiyun str r8, [r6] 225*4882a593Smuzhiyun 226*4882a593Smuzhiyun /*------------------------------------------------------* 227*4882a593Smuzhiyun * Issue Soft Reset to DDR Module * 228*4882a593Smuzhiyun *------------------------------------------------------*/ 229*4882a593Smuzhiyun 230*4882a593Smuzhiyun /* Shut down the DDR2 LPSC Module */ 231*4882a593Smuzhiyun ldr r8, PSC_FLAG_CLEAR 232*4882a593Smuzhiyun ldr r6, MDCTL_DDR2 233*4882a593Smuzhiyun ldr r7, [r6] 234*4882a593Smuzhiyun and r7, r7, r8 235*4882a593Smuzhiyun orr r7, r7, $0x03 236*4882a593Smuzhiyun str r7, [r6] 237*4882a593Smuzhiyun 238*4882a593Smuzhiyun /* Enable the Power Domain Transition Command */ 239*4882a593Smuzhiyun ldr r6, PTCMD 240*4882a593Smuzhiyun ldr r7, [r6] 241*4882a593Smuzhiyun orr r7, r7, $0x01 242*4882a593Smuzhiyun str r7, [r6] 243*4882a593Smuzhiyun 244*4882a593Smuzhiyun /* Check for Transition Complete(PTSTAT) */ 245*4882a593SmuzhiyuncheckStatClkStop: 246*4882a593Smuzhiyun ldr r6, PTSTAT 247*4882a593Smuzhiyun ldr r7, [r6] 248*4882a593Smuzhiyun ands r7, r7, $0x01 249*4882a593Smuzhiyun bne checkStatClkStop 250*4882a593Smuzhiyun 251*4882a593Smuzhiyun /* Check for DDR2 Controller Enable Completion */ 252*4882a593SmuzhiyuncheckDDRStatClkStop: 253*4882a593Smuzhiyun ldr r6, MDSTAT_DDR2 254*4882a593Smuzhiyun ldr r7, [r6] 255*4882a593Smuzhiyun and r7, r7, $MDSTAT_STATE 256*4882a593Smuzhiyun cmp r7, $0x03 257*4882a593Smuzhiyun bne checkDDRStatClkStop 258*4882a593Smuzhiyun 259*4882a593Smuzhiyun /*------------------------------------------------------* 260*4882a593Smuzhiyun * Program DDR2 MMRs for 162MHz Setting * 261*4882a593Smuzhiyun *------------------------------------------------------*/ 262*4882a593Smuzhiyun 263*4882a593Smuzhiyun /* Program PHY Control Register */ 264*4882a593Smuzhiyun ldr r6, DDRCTL 265*4882a593Smuzhiyun ldr r7, DDRCTL_VAL 266*4882a593Smuzhiyun str r7, [r6] 267*4882a593Smuzhiyun 268*4882a593Smuzhiyun /* Program SDRAM Bank Config Register */ 269*4882a593Smuzhiyun ldr r6, SDCFG 270*4882a593Smuzhiyun ldr r7, SDCFG_VAL 271*4882a593Smuzhiyun str r7, [r6] 272*4882a593Smuzhiyun 273*4882a593Smuzhiyun /* Program SDRAM TIM-0 Config Register */ 274*4882a593Smuzhiyun ldr r6, SDTIM0 275*4882a593Smuzhiyun ldr r7, SDTIM0_VAL_162MHz 276*4882a593Smuzhiyun str r7, [r6] 277*4882a593Smuzhiyun 278*4882a593Smuzhiyun /* Program SDRAM TIM-1 Config Register */ 279*4882a593Smuzhiyun ldr r6, SDTIM1 280*4882a593Smuzhiyun ldr r7, SDTIM1_VAL_162MHz 281*4882a593Smuzhiyun str r7, [r6] 282*4882a593Smuzhiyun 283*4882a593Smuzhiyun /* Program the SDRAM Bank Config Control Register */ 284*4882a593Smuzhiyun ldr r10, MASK_VAL 285*4882a593Smuzhiyun ldr r8, SDCFG 286*4882a593Smuzhiyun ldr r9, SDCFG_VAL 287*4882a593Smuzhiyun and r9, r9, r10 288*4882a593Smuzhiyun str r9, [r8] 289*4882a593Smuzhiyun 290*4882a593Smuzhiyun /* Program SDRAM SDREF Config Register */ 291*4882a593Smuzhiyun ldr r6, SDREF 292*4882a593Smuzhiyun ldr r7, SDREF_VAL 293*4882a593Smuzhiyun str r7, [r6] 294*4882a593Smuzhiyun 295*4882a593Smuzhiyun /*------------------------------------------------------* 296*4882a593Smuzhiyun * Issue Soft Reset to DDR Module * 297*4882a593Smuzhiyun *------------------------------------------------------*/ 298*4882a593Smuzhiyun 299*4882a593Smuzhiyun /* Issue a Dummy DDR2 read/write */ 300*4882a593Smuzhiyun ldr r8, DDR2_START_ADDR 301*4882a593Smuzhiyun ldr r7, DUMMY_VAL 302*4882a593Smuzhiyun str r7, [r8] 303*4882a593Smuzhiyun ldr r7, [r8] 304*4882a593Smuzhiyun 305*4882a593Smuzhiyun /* Shut down the DDR2 LPSC Module */ 306*4882a593Smuzhiyun ldr r8, PSC_FLAG_CLEAR 307*4882a593Smuzhiyun ldr r6, MDCTL_DDR2 308*4882a593Smuzhiyun ldr r7, [r6] 309*4882a593Smuzhiyun and r7, r7, r8 310*4882a593Smuzhiyun orr r7, r7, $0x01 311*4882a593Smuzhiyun str r7, [r6] 312*4882a593Smuzhiyun 313*4882a593Smuzhiyun /* Enable the Power Domain Transition Command */ 314*4882a593Smuzhiyun ldr r6, PTCMD 315*4882a593Smuzhiyun ldr r7, [r6] 316*4882a593Smuzhiyun orr r7, r7, $0x01 317*4882a593Smuzhiyun str r7, [r6] 318*4882a593Smuzhiyun 319*4882a593Smuzhiyun /* Check for Transition Complete(PTSTAT) */ 320*4882a593SmuzhiyuncheckStatClkStop2: 321*4882a593Smuzhiyun ldr r6, PTSTAT 322*4882a593Smuzhiyun ldr r7, [r6] 323*4882a593Smuzhiyun ands r7, r7, $0x01 324*4882a593Smuzhiyun bne checkStatClkStop2 325*4882a593Smuzhiyun 326*4882a593Smuzhiyun /* Check for DDR2 Controller Enable Completion */ 327*4882a593SmuzhiyuncheckDDRStatClkStop2: 328*4882a593Smuzhiyun ldr r6, MDSTAT_DDR2 329*4882a593Smuzhiyun ldr r7, [r6] 330*4882a593Smuzhiyun and r7, r7, $MDSTAT_STATE 331*4882a593Smuzhiyun cmp r7, $0x01 332*4882a593Smuzhiyun bne checkDDRStatClkStop2 333*4882a593Smuzhiyun 334*4882a593Smuzhiyun /*------------------------------------------------------* 335*4882a593Smuzhiyun * Turn DDR2 Controller Clocks On * 336*4882a593Smuzhiyun *------------------------------------------------------*/ 337*4882a593Smuzhiyun 338*4882a593Smuzhiyun /* Enable the DDR2 LPSC Module */ 339*4882a593Smuzhiyun ldr r6, MDCTL_DDR2 340*4882a593Smuzhiyun ldr r7, [r6] 341*4882a593Smuzhiyun orr r7, r7, $0x03 342*4882a593Smuzhiyun str r7, [r6] 343*4882a593Smuzhiyun 344*4882a593Smuzhiyun /* Enable the Power Domain Transition Command */ 345*4882a593Smuzhiyun ldr r6, PTCMD 346*4882a593Smuzhiyun ldr r7, [r6] 347*4882a593Smuzhiyun orr r7, r7, $0x01 348*4882a593Smuzhiyun str r7, [r6] 349*4882a593Smuzhiyun 350*4882a593Smuzhiyun /* Check for Transition Complete(PTSTAT) */ 351*4882a593SmuzhiyuncheckStatClkEn2: 352*4882a593Smuzhiyun ldr r6, PTSTAT 353*4882a593Smuzhiyun ldr r7, [r6] 354*4882a593Smuzhiyun ands r7, r7, $0x01 355*4882a593Smuzhiyun bne checkStatClkEn2 356*4882a593Smuzhiyun 357*4882a593Smuzhiyun /* Check for DDR2 Controller Enable Completion */ 358*4882a593SmuzhiyuncheckDDRStatClkEn2: 359*4882a593Smuzhiyun ldr r6, MDSTAT_DDR2 360*4882a593Smuzhiyun ldr r7, [r6] 361*4882a593Smuzhiyun and r7, r7, $MDSTAT_STATE 362*4882a593Smuzhiyun cmp r7, $0x03 363*4882a593Smuzhiyun bne checkDDRStatClkEn2 364*4882a593Smuzhiyun 365*4882a593Smuzhiyun /* DDR Writes and Reads */ 366*4882a593Smuzhiyun ldr r6, CFGTEST 367*4882a593Smuzhiyun mov r3, $0x01 368*4882a593Smuzhiyun str r3, [r6] 369*4882a593Smuzhiyun 370*4882a593Smuzhiyun /*------------------------------------------------------* 371*4882a593Smuzhiyun * System PLL Initialization * 372*4882a593Smuzhiyun *------------------------------------------------------*/ 373*4882a593Smuzhiyun 374*4882a593Smuzhiyun /* Select the Clock Mode Depending on the Value written in the Boot Table by the run script */ 375*4882a593Smuzhiyun mov r2, $0 376*4882a593Smuzhiyun ldr r6, PLL1_CTL 377*4882a593Smuzhiyun ldr r7, PLL_CLKSRC_MASK 378*4882a593Smuzhiyun ldr r8, [r6] 379*4882a593Smuzhiyun and r8, r8, r7 380*4882a593Smuzhiyun mov r9, r2, lsl $8 381*4882a593Smuzhiyun orr r8, r8, r9 382*4882a593Smuzhiyun str r8, [r6] 383*4882a593Smuzhiyun 384*4882a593Smuzhiyun /* Select the PLLEN source */ 385*4882a593Smuzhiyun ldr r7, PLL_ENSRC_MASK 386*4882a593Smuzhiyun and r8, r8, r7 387*4882a593Smuzhiyun str r8, [r6] 388*4882a593Smuzhiyun 389*4882a593Smuzhiyun /* Bypass the PLL */ 390*4882a593Smuzhiyun ldr r7, PLL_BYPASS_MASK 391*4882a593Smuzhiyun and r8, r8, r7 392*4882a593Smuzhiyun str r8, [r6] 393*4882a593Smuzhiyun 394*4882a593Smuzhiyun /* Wait for few cycles to allow PLLEN Mux switch properly to bypass Clock */ 395*4882a593Smuzhiyun mov r10, $0x20 396*4882a593Smuzhiyun 397*4882a593SmuzhiyunWaitLoop: 398*4882a593Smuzhiyun subs r10, r10, $1 399*4882a593Smuzhiyun bne WaitLoop 400*4882a593Smuzhiyun 401*4882a593Smuzhiyun /* Reset the PLL */ 402*4882a593Smuzhiyun ldr r7, PLL_RESET_MASK 403*4882a593Smuzhiyun and r8, r8, r7 404*4882a593Smuzhiyun str r8, [r6] 405*4882a593Smuzhiyun 406*4882a593Smuzhiyun /* Disable the PLL */ 407*4882a593Smuzhiyun orr r8, r8, $0x10 408*4882a593Smuzhiyun str r8, [r6] 409*4882a593Smuzhiyun 410*4882a593Smuzhiyun /* Power up the PLL */ 411*4882a593Smuzhiyun ldr r7, PLL_PWRUP_MASK 412*4882a593Smuzhiyun and r8, r8, r7 413*4882a593Smuzhiyun str r8, [r6] 414*4882a593Smuzhiyun 415*4882a593Smuzhiyun /* Enable the PLL from Disable Mode */ 416*4882a593Smuzhiyun ldr r7, PLL_DISABLE_ENABLE_MASK 417*4882a593Smuzhiyun and r8, r8, r7 418*4882a593Smuzhiyun str r8, [r6] 419*4882a593Smuzhiyun 420*4882a593Smuzhiyun /* Program the PLL Multiplier */ 421*4882a593Smuzhiyun ldr r6, PLL1_PLLM 422*4882a593Smuzhiyun mov r3, $0x15 /* For 594MHz */ 423*4882a593Smuzhiyun str r3, [r6] 424*4882a593Smuzhiyun 425*4882a593Smuzhiyun /* Wait for PLL to Reset Properly */ 426*4882a593Smuzhiyun mov r10, $0xff 427*4882a593Smuzhiyun 428*4882a593SmuzhiyunResetLoop: 429*4882a593Smuzhiyun subs r10, r10, $1 430*4882a593Smuzhiyun bne ResetLoop 431*4882a593Smuzhiyun 432*4882a593Smuzhiyun /* Bring PLL out of Reset */ 433*4882a593Smuzhiyun ldr r6, PLL1_CTL 434*4882a593Smuzhiyun orr r8, r8, $0x08 435*4882a593Smuzhiyun str r8, [r6] 436*4882a593Smuzhiyun 437*4882a593Smuzhiyun /* Wait for PLL to Lock */ 438*4882a593Smuzhiyun ldr r10, PLL_LOCK_COUNT 439*4882a593Smuzhiyun 440*4882a593SmuzhiyunPLL1Lock: 441*4882a593Smuzhiyun subs r10, r10, $1 442*4882a593Smuzhiyun bne PLL1Lock 443*4882a593Smuzhiyun 444*4882a593Smuzhiyun /* Enable the PLL */ 445*4882a593Smuzhiyun orr r8, r8, $0x01 446*4882a593Smuzhiyun str r8, [r6] 447*4882a593Smuzhiyun 448*4882a593Smuzhiyun nop 449*4882a593Smuzhiyun nop 450*4882a593Smuzhiyun nop 451*4882a593Smuzhiyun nop 452*4882a593Smuzhiyun 453*4882a593Smuzhiyun /*------------------------------------------------------* 454*4882a593Smuzhiyun * AEMIF configuration for NOR Flash (double check) * 455*4882a593Smuzhiyun *------------------------------------------------------*/ 456*4882a593Smuzhiyun ldr r0, _PINMUX0 457*4882a593Smuzhiyun ldr r1, _DEV_SETTING 458*4882a593Smuzhiyun str r1, [r0] 459*4882a593Smuzhiyun 460*4882a593Smuzhiyun ldr r0, WAITCFG 461*4882a593Smuzhiyun ldr r1, WAITCFG_VAL 462*4882a593Smuzhiyun ldr r2, [r0] 463*4882a593Smuzhiyun orr r2, r2, r1 464*4882a593Smuzhiyun str r2, [r0] 465*4882a593Smuzhiyun 466*4882a593Smuzhiyun ldr r0, ACFG3 467*4882a593Smuzhiyun ldr r1, ACFG3_VAL 468*4882a593Smuzhiyun ldr r2, [r0] 469*4882a593Smuzhiyun and r1, r2, r1 470*4882a593Smuzhiyun str r1, [r0] 471*4882a593Smuzhiyun 472*4882a593Smuzhiyun ldr r0, ACFG4 473*4882a593Smuzhiyun ldr r1, ACFG4_VAL 474*4882a593Smuzhiyun ldr r2, [r0] 475*4882a593Smuzhiyun and r1, r2, r1 476*4882a593Smuzhiyun str r1, [r0] 477*4882a593Smuzhiyun 478*4882a593Smuzhiyun ldr r0, ACFG5 479*4882a593Smuzhiyun ldr r1, ACFG5_VAL 480*4882a593Smuzhiyun ldr r2, [r0] 481*4882a593Smuzhiyun and r1, r2, r1 482*4882a593Smuzhiyun str r1, [r0] 483*4882a593Smuzhiyun 484*4882a593Smuzhiyun /*--------------------------------------* 485*4882a593Smuzhiyun * VTP manual Calibration * 486*4882a593Smuzhiyun *--------------------------------------*/ 487*4882a593Smuzhiyun ldr r0, VTPIOCR 488*4882a593Smuzhiyun ldr r1, VTP_MMR0 489*4882a593Smuzhiyun str r1, [r0] 490*4882a593Smuzhiyun 491*4882a593Smuzhiyun ldr r0, VTPIOCR 492*4882a593Smuzhiyun ldr r1, VTP_MMR1 493*4882a593Smuzhiyun str r1, [r0] 494*4882a593Smuzhiyun 495*4882a593Smuzhiyun /* Wait for 33 VTP CLK cycles. VRP operates at 27 MHz */ 496*4882a593Smuzhiyun ldr r10, VTP_LOCK_COUNT 497*4882a593SmuzhiyunVTPLock: 498*4882a593Smuzhiyun subs r10, r10, $1 499*4882a593Smuzhiyun bne VTPLock 500*4882a593Smuzhiyun 501*4882a593Smuzhiyun ldr r6, DFT_ENABLE 502*4882a593Smuzhiyun mov r10, $0x01 503*4882a593Smuzhiyun str r10, [r6] 504*4882a593Smuzhiyun 505*4882a593Smuzhiyun ldr r6, DDRVTPR 506*4882a593Smuzhiyun ldr r7, [r6] 507*4882a593Smuzhiyun mov r8, r7, LSL #32-10 508*4882a593Smuzhiyun mov r8, r8, LSR #32-10 /* grab low 10 bits */ 509*4882a593Smuzhiyun ldr r7, VTP_RECAL 510*4882a593Smuzhiyun orr r8, r7, r8 511*4882a593Smuzhiyun ldr r7, VTP_EN 512*4882a593Smuzhiyun orr r8, r7, r8 513*4882a593Smuzhiyun str r8, [r0] 514*4882a593Smuzhiyun 515*4882a593Smuzhiyun 516*4882a593Smuzhiyun /* Wait for 33 VTP CLK cycles. VRP operates at 27 MHz */ 517*4882a593Smuzhiyun ldr r10, VTP_LOCK_COUNT 518*4882a593SmuzhiyunVTP1Lock: 519*4882a593Smuzhiyun subs r10, r10, $1 520*4882a593Smuzhiyun bne VTP1Lock 521*4882a593Smuzhiyun 522*4882a593Smuzhiyun ldr r1, [r0] 523*4882a593Smuzhiyun ldr r2, VTP_MASK 524*4882a593Smuzhiyun and r2, r1, r2 525*4882a593Smuzhiyun str r2, [r0] 526*4882a593Smuzhiyun 527*4882a593Smuzhiyun ldr r6, DFT_ENABLE 528*4882a593Smuzhiyun mov r10, $0 529*4882a593Smuzhiyun str r10, [r6] 530*4882a593Smuzhiyun 531*4882a593Smuzhiyun /* 532*4882a593Smuzhiyun * Call board-specific lowlevel init. 533*4882a593Smuzhiyun * That MUST be present and THAT returns 534*4882a593Smuzhiyun * back to arch calling code with "mov pc, lr." 535*4882a593Smuzhiyun */ 536*4882a593Smuzhiyun b dv_board_init 537*4882a593Smuzhiyun 538*4882a593Smuzhiyun.ltorg 539*4882a593Smuzhiyun 540*4882a593Smuzhiyun_PINMUX0: 541*4882a593Smuzhiyun .word 0x01c40000 /* Device Configuration Registers */ 542*4882a593Smuzhiyun_PINMUX1: 543*4882a593Smuzhiyun .word 0x01c40004 /* Device Configuration Registers */ 544*4882a593Smuzhiyun 545*4882a593Smuzhiyun_DEV_SETTING: 546*4882a593Smuzhiyun .word 0x00000c1f 547*4882a593Smuzhiyun 548*4882a593SmuzhiyunWAITCFG: 549*4882a593Smuzhiyun .word 0x01e00004 550*4882a593SmuzhiyunWAITCFG_VAL: 551*4882a593Smuzhiyun .word 0 552*4882a593SmuzhiyunACFG3: 553*4882a593Smuzhiyun .word 0x01e00014 554*4882a593SmuzhiyunACFG3_VAL: 555*4882a593Smuzhiyun .word 0x3ffffffd 556*4882a593SmuzhiyunACFG4: 557*4882a593Smuzhiyun .word 0x01e00018 558*4882a593SmuzhiyunACFG4_VAL: 559*4882a593Smuzhiyun .word 0x3ffffffd 560*4882a593SmuzhiyunACFG5: 561*4882a593Smuzhiyun .word 0x01e0001c 562*4882a593SmuzhiyunACFG5_VAL: 563*4882a593Smuzhiyun .word 0x3ffffffd 564*4882a593Smuzhiyun 565*4882a593SmuzhiyunMDCTL_DDR2: 566*4882a593Smuzhiyun .word 0x01c41a34 567*4882a593SmuzhiyunMDSTAT_DDR2: 568*4882a593Smuzhiyun .word 0x01c41834 569*4882a593Smuzhiyun 570*4882a593SmuzhiyunPTCMD: 571*4882a593Smuzhiyun .word 0x01c41120 572*4882a593SmuzhiyunPTSTAT: 573*4882a593Smuzhiyun .word 0x01c41128 574*4882a593Smuzhiyun 575*4882a593SmuzhiyunEINT_ENABLE0: 576*4882a593Smuzhiyun .word 0x01c48018 577*4882a593SmuzhiyunEINT_ENABLE1: 578*4882a593Smuzhiyun .word 0x01c4801c 579*4882a593Smuzhiyun 580*4882a593SmuzhiyunPSC_FLAG_CLEAR: 581*4882a593Smuzhiyun .word 0xffffffe0 582*4882a593SmuzhiyunPSC_GEM_FLAG_CLEAR: 583*4882a593Smuzhiyun .word 0xfffffeff 584*4882a593Smuzhiyun 585*4882a593Smuzhiyun/* DDR2 MMR & CONFIGURATION VALUES, 162 MHZ clock */ 586*4882a593SmuzhiyunDDRCTL: 587*4882a593Smuzhiyun .word 0x200000e4 588*4882a593SmuzhiyunDDRCTL_VAL: 589*4882a593Smuzhiyun .word 0x50006405 590*4882a593SmuzhiyunSDREF: 591*4882a593Smuzhiyun .word 0x2000000c 592*4882a593SmuzhiyunSDREF_VAL: 593*4882a593Smuzhiyun .word 0x000005c3 594*4882a593SmuzhiyunSDCFG: 595*4882a593Smuzhiyun .word 0x20000008 596*4882a593SmuzhiyunSDCFG_VAL: 597*4882a593Smuzhiyun#ifdef DDR_4BANKS 598*4882a593Smuzhiyun .word 0x00178622 599*4882a593Smuzhiyun#elif defined DDR_8BANKS 600*4882a593Smuzhiyun .word 0x00178632 601*4882a593Smuzhiyun#else 602*4882a593Smuzhiyun#error "Unknown DDR configuration!!!" 603*4882a593Smuzhiyun#endif 604*4882a593SmuzhiyunSDTIM0: 605*4882a593Smuzhiyun .word 0x20000010 606*4882a593SmuzhiyunSDTIM0_VAL_162MHz: 607*4882a593Smuzhiyun .word 0x28923211 608*4882a593SmuzhiyunSDTIM1: 609*4882a593Smuzhiyun .word 0x20000014 610*4882a593SmuzhiyunSDTIM1_VAL_162MHz: 611*4882a593Smuzhiyun .word 0x0016c722 612*4882a593SmuzhiyunVTPIOCR: 613*4882a593Smuzhiyun .word 0x200000f0 /* VTP IO Control register */ 614*4882a593SmuzhiyunDDRVTPR: 615*4882a593Smuzhiyun .word 0x01c42030 /* DDR VPTR MMR */ 616*4882a593SmuzhiyunVTP_MMR0: 617*4882a593Smuzhiyun .word 0x201f 618*4882a593SmuzhiyunVTP_MMR1: 619*4882a593Smuzhiyun .word 0xa01f 620*4882a593SmuzhiyunDFT_ENABLE: 621*4882a593Smuzhiyun .word 0x01c4004c 622*4882a593SmuzhiyunVTP_LOCK_COUNT: 623*4882a593Smuzhiyun .word 0x5b0 624*4882a593SmuzhiyunVTP_MASK: 625*4882a593Smuzhiyun .word 0xffffdfff 626*4882a593SmuzhiyunVTP_RECAL: 627*4882a593Smuzhiyun .word 0x08000 628*4882a593SmuzhiyunVTP_EN: 629*4882a593Smuzhiyun .word 0x02000 630*4882a593SmuzhiyunCFGTEST: 631*4882a593Smuzhiyun .word 0x80010000 632*4882a593SmuzhiyunMASK_VAL: 633*4882a593Smuzhiyun .word 0x00000fff 634*4882a593Smuzhiyun 635*4882a593Smuzhiyun/* GEM Power Up & LPSC Control Register */ 636*4882a593SmuzhiyunMDCTL_GEM: 637*4882a593Smuzhiyun .word 0x01c41a9c 638*4882a593SmuzhiyunMDSTAT_GEM: 639*4882a593Smuzhiyun .word 0x01c4189c 640*4882a593Smuzhiyun 641*4882a593Smuzhiyun/* For WDT reset chip bug */ 642*4882a593SmuzhiyunP1394: 643*4882a593Smuzhiyun .word 0x01c41a20 644*4882a593Smuzhiyun 645*4882a593SmuzhiyunPLL_CLKSRC_MASK: 646*4882a593Smuzhiyun .word 0xfffffeff /* Mask the Clock Mode bit */ 647*4882a593SmuzhiyunPLL_ENSRC_MASK: 648*4882a593Smuzhiyun .word 0xffffffdf /* Select the PLLEN source */ 649*4882a593SmuzhiyunPLL_BYPASS_MASK: 650*4882a593Smuzhiyun .word 0xfffffffe /* Put the PLL in BYPASS */ 651*4882a593SmuzhiyunPLL_RESET_MASK: 652*4882a593Smuzhiyun .word 0xfffffff7 /* Put the PLL in Reset Mode */ 653*4882a593SmuzhiyunPLL_PWRUP_MASK: 654*4882a593Smuzhiyun .word 0xfffffffd /* PLL Power up Mask Bit */ 655*4882a593SmuzhiyunPLL_DISABLE_ENABLE_MASK: 656*4882a593Smuzhiyun .word 0xffffffef /* Enable the PLL from Disable */ 657*4882a593SmuzhiyunPLL_LOCK_COUNT: 658*4882a593Smuzhiyun .word 0x2000 659*4882a593Smuzhiyun 660*4882a593Smuzhiyun/* PLL1-SYSTEM PLL MMRs */ 661*4882a593SmuzhiyunPLL1_CTL: 662*4882a593Smuzhiyun .word 0x01c40900 663*4882a593SmuzhiyunPLL1_PLLM: 664*4882a593Smuzhiyun .word 0x01c40910 665*4882a593Smuzhiyun 666*4882a593Smuzhiyun/* PLL2-SYSTEM PLL MMRs */ 667*4882a593SmuzhiyunPLL2_CTL: 668*4882a593Smuzhiyun .word 0x01c40d00 669*4882a593SmuzhiyunPLL2_PLLM: 670*4882a593Smuzhiyun .word 0x01c40d10 671*4882a593SmuzhiyunPLL2_DIV1: 672*4882a593Smuzhiyun .word 0x01c40d18 673*4882a593SmuzhiyunPLL2_DIV2: 674*4882a593Smuzhiyun .word 0x01c40d1c 675*4882a593SmuzhiyunPLL2_PLLCMD: 676*4882a593Smuzhiyun .word 0x01c40d38 677*4882a593SmuzhiyunPLL2_PLLSTAT: 678*4882a593Smuzhiyun .word 0x01c40d3c 679*4882a593SmuzhiyunPLL2_DIV_MASK: 680*4882a593Smuzhiyun .word 0xffff7fff 681*4882a593Smuzhiyun 682*4882a593SmuzhiyunMMARG_BRF0: 683*4882a593Smuzhiyun .word 0x01c42010 /* BRF margin mode 0 (R/W)*/ 684*4882a593SmuzhiyunMMARG_BRF0_VAL: 685*4882a593Smuzhiyun .word 0x00444400 686*4882a593Smuzhiyun 687*4882a593SmuzhiyunDDR2_START_ADDR: 688*4882a593Smuzhiyun .word 0x80000000 689*4882a593SmuzhiyunDUMMY_VAL: 690*4882a593Smuzhiyun .word 0xa55aa55a 691*4882a593Smuzhiyun#else /* CONFIG_SOC_DM644X */ 692*4882a593Smuzhiyun mov pc, lr 693*4882a593Smuzhiyun#endif 694