···3838 *3939 */40404141+/* Global 24xx registers in GR_MOD (Same as OCP_MOD for 24xx) */4242+#define OMAP24XX_PRCM_VOLTCTRL_OFFSET 0x00504343+#define OMAP24XX_PRCM_CLKCFG_CTRL_OFFSET 0x00804444+4545+/* 242x GR_MOD registers, use these only for assembly code */4646+#define OMAP242X_PRCM_VOLTCTRL OMAP2420_PRM_REGADDR(OMAP24XX_GR_MOD, \4747+ OMAP24XX_PRCM_VOLTCTRL_OFFSET)4848+#define OMAP242X_PRCM_CLKCFG_CTRL OMAP2420_PRM_REGADDR(OMAP24XX_GR_MOD, \4949+ OMAP24XX_PRCM_CLKCFG_CTRL_OFFSET)5050+5151+/* 243x GR_MOD registers, use these only for assembly code */5252+#define OMAP243X_PRCM_VOLTCTRL OMAP2430_PRM_REGADDR(OMAP24XX_GR_MOD, \5353+ OMAP24XX_PRCM_VOLTCTRL_OFFSET)5454+#define OMAP243X_PRCM_CLKCFG_CTRL OMAP2430_PRM_REGADDR(OMAP24XX_GR_MOD, \5555+ OMAP24XX_PRCM_CLKCFG_CTRL_OFFSET)5656+5757+/* These will disappear */4158#define OMAP24XX_PRCM_REVISION OMAP_PRM_REGADDR(OCP_MOD, 0x0000)4259#define OMAP24XX_PRCM_SYSCONFIG OMAP_PRM_REGADDR(OCP_MOD, 0x0010)43604461#define OMAP24XX_PRCM_IRQSTATUS_MPU OMAP_PRM_REGADDR(OCP_MOD, 0x0018)4562#define OMAP24XX_PRCM_IRQENABLE_MPU OMAP_PRM_REGADDR(OCP_MOD, 0x001c)46634747-#define OMAP24XX_PRCM_VOLTCTRL OMAP_PRM_REGADDR(OCP_MOD, 0x0050)4864#define OMAP24XX_PRCM_VOLTST OMAP_PRM_REGADDR(OCP_MOD, 0x0054)4965#define OMAP24XX_PRCM_CLKSRC_CTRL OMAP_PRM_REGADDR(OCP_MOD, 0x0060)5066#define OMAP24XX_PRCM_CLKOUT_CTRL OMAP_PRM_REGADDR(OCP_MOD, 0x0070)
+51-54
arch/arm/mach-omap2/sram242x.S
···11/*22- * linux/arch/arm/mach-omap2/sram-fn.S22+ * linux/arch/arm/mach-omap2/sram242x.S33 *44 * Omap2 specific functions that need to be run in internal SRAM55 *···2727#include <asm/arch/io.h>2828#include <asm/hardware.h>29293030-#include "sdrc.h"3130#include "prm.h"3231#include "cm.h"3333-3434-#define TIMER_32KSYNCT_CR_V IO_ADDRESS(OMAP2420_32KSYNCT_BASE + 0x010)3232+#include "sdrc.h"35333634 .text37353838-ENTRY(sram_ddr_init)3636+ENTRY(omap242x_sram_ddr_init)3937 stmfd sp!, {r0 - r12, lr} @ save registers on stack40384139 mov r12, r2 @ capture CS1 vs CS04240 mov r8, r3 @ capture force parameter43414442 /* frequency shift down */4545- ldr r2, cm_clksel2_pll @ get address of dpllout reg4343+ ldr r2, omap242x_sdi_cm_clksel2_pll @ get address of dpllout reg4644 mov r3, #0x1 @ value for 1x operation4745 str r3, [r2] @ go to L1-freq operation4846···4951 bl voltage_shift @ go drop voltage50525153 /* dll lock mode */5252- ldr r11, sdrc_dlla_ctrl @ addr of dlla ctrl5454+ ldr r11, omap242x_sdi_sdrc_dlla_ctrl @ addr of dlla ctrl5355 ldr r10, [r11] @ get current val5456 cmp r12, #0x1 @ cs1 base (2422 es2.05/1)5557 addeq r11, r11, #0x8 @ if cs1 base, move to DLLB···100102 * wait for it to finish, use 32k sync counter, 1tick=31uS.101103 */102104voltage_shift:103103- ldr r4, prcm_voltctrl @ get addr of volt ctrl.105105+ ldr r4, omap242x_sdi_prcm_voltctrl @ get addr of volt ctrl.104106 ldr r5, [r4] @ get value.105107 ldr r6, prcm_mask_val @ get value of mask106108 and r5, r5, r6 @ apply mask to clear bits···110112 orr r5, r5, r3 @ build value for force111113 str r5, [r4] @ Force transition to L1112114113113- ldr r3, timer_32ksynct_cr @ get addr of counter115115+ ldr r3, omap242x_sdi_timer_32ksynct_cr @ get addr of counter114116 ldr r5, [r3] @ get value115117 add r5, r5, #0x3 @ give it at most 93uS116118volt_delay:···119121 bhi volt_delay @ not yet->branch120122 mov pc, lr @ back to caller.121123122122-/* relative load constants */123123-cm_clksel2_pll:124124+omap242x_sdi_cm_clksel2_pll:124125 .word OMAP2420_CM_REGADDR(PLL_MOD, CM_CLKSEL2)125125-sdrc_dlla_ctrl:126126+omap242x_sdi_sdrc_dlla_ctrl:126127 .word OMAP242X_SDRC_REGADDR(SDRC_DLLA_CTRL)127127-prcm_voltctrl:128128- .word OMAP2420_PRM_REGADDR(OCP_MOD, 0x50)128128+omap242x_sdi_prcm_voltctrl:129129+ .word OMAP242X_PRCM_VOLTCTRL129130prcm_mask_val:130131 .word 0xFFFF3FFC131131-timer_32ksynct_cr:132132- .word TIMER_32KSYNCT_CR_V133133-ENTRY(sram_ddr_init_sz)134134- .word . - sram_ddr_init132132+omap242x_sdi_timer_32ksynct_cr:133133+ .word IO_ADDRESS(OMAP2_32KSYNCT_BASE + 0x010)134134+ENTRY(omap242x_sram_ddr_init_sz)135135+ .word . - omap242x_sram_ddr_init135136136137/*137138 * Reprograms memory timings.138139 * r0 = [PRCM_FULL | PRCM_HALF] r1 = SDRC_DLLA_CTRL value r2 = [DDR | SDR]139140 * PRCM_FULL = 2, PRCM_HALF = 1, DDR = 1, SDR = 0140141 */141141-ENTRY(sram_reprogram_sdrc)142142+ENTRY(omap242x_sram_reprogram_sdrc)142143 stmfd sp!, {r0 - r10, lr} @ save registers on stack143144 mov r3, #0x0 @ clear for mrc call144145 mcr p15, 0, r3, c7, c10, 4 @ memory barrier, finish ARM SDR/DDR145146 nop146147 nop147147- ldr r6, ddr_sdrc_rfr_ctrl @ get addr of refresh reg148148+ ldr r6, omap242x_srs_sdrc_rfr_ctrl @ get addr of refresh reg148149 ldr r5, [r6] @ get value149150 mov r5, r5, lsr #8 @ isolate rfr field and drop burst150151···157160 movne r5, r5, lsl #1 @ mult by 2 if to full158161 mov r5, r5, lsl #8 @ put rfr field back into place159162 add r5, r5, #0x1 @ turn on burst of 1160160- ldr r4, ddr_cm_clksel2_pll @ get address of out reg163163+ ldr r4, omap242x_srs_cm_clksel2_pll @ get address of out reg161164 ldr r3, [r4] @ get curr value162165 orr r3, r3, #0x3163166 bic r3, r3, #0x3 @ clear lower bits···178181 bne freq_out @ leave if SDR, no DLL function179182180183 /* With DDR, we need to take care of the DLL for the frequency change */181181- ldr r2, ddr_sdrc_dlla_ctrl @ addr of dlla ctrl184184+ ldr r2, omap242x_srs_sdrc_dlla_ctrl @ addr of dlla ctrl182185 str r1, [r2] @ write out new SDRC_DLLA_CTRL183186 add r2, r2, #0x8 @ addr to SDRC_DLLB_CTRL184187 str r1, [r2] @ commit to SDRC_DLLB_CTRL···194197 * wait for it to finish, use 32k sync counter, 1tick=31uS.195198 */196199voltage_shift_c:197197- ldr r10, ddr_prcm_voltctrl @ get addr of volt ctrl200200+ ldr r10, omap242x_srs_prcm_voltctrl @ get addr of volt ctrl198201 ldr r8, [r10] @ get value199202 ldr r7, ddr_prcm_mask_val @ get value of mask200203 and r8, r8, r7 @ apply mask to clear bits···204207 orr r8, r8, r7 @ build value for force205208 str r8, [r10] @ Force transition to L1206209207207- ldr r10, ddr_timer_32ksynct @ get addr of counter210210+ ldr r10, omap242x_srs_timer_32ksynct @ get addr of counter208211 ldr r8, [r10] @ get value209212 add r8, r8, #0x2 @ give it at most 62uS (min 31+)210213volt_delay_c:···213216 bhi volt_delay_c @ not yet->branch214217 mov pc, lr @ back to caller215218216216-ddr_cm_clksel2_pll:219219+omap242x_srs_cm_clksel2_pll:217220 .word OMAP2420_CM_REGADDR(PLL_MOD, CM_CLKSEL2)218218-ddr_sdrc_dlla_ctrl:221221+omap242x_srs_sdrc_dlla_ctrl:219222 .word OMAP242X_SDRC_REGADDR(SDRC_DLLA_CTRL)220220-ddr_sdrc_rfr_ctrl:223223+omap242x_srs_sdrc_rfr_ctrl:221224 .word OMAP242X_SDRC_REGADDR(SDRC_RFR_CTRL_0)222222-ddr_prcm_voltctrl:223223- .word OMAP2420_PRM_REGADDR(OCP_MOD, 0x50)225225+omap242x_srs_prcm_voltctrl:226226+ .word OMAP242X_PRCM_VOLTCTRL224227ddr_prcm_mask_val:225228 .word 0xFFFF3FFC226226-ddr_timer_32ksynct:227227- .word TIMER_32KSYNCT_CR_V229229+omap242x_srs_timer_32ksynct:230230+ .word IO_ADDRESS(OMAP2_32KSYNCT_BASE + 0x010)228231229229-ENTRY(sram_reprogram_sdrc_sz)230230- .word . - sram_reprogram_sdrc232232+ENTRY(omap242x_sram_reprogram_sdrc_sz)233233+ .word . - omap242x_sram_reprogram_sdrc231234232235/*233236 * Set dividers and pll. Also recalculate DLL value for DDR and unlock mode.234237 */235235-ENTRY(sram_set_prcm)238238+ENTRY(omap242x_sram_set_prcm)236239 stmfd sp!, {r0-r12, lr} @ regs to stack237240 adr r4, pbegin @ addr of preload start238241 adr r8, pend @ addr of preload end239242 mcrr p15, 1, r8, r4, c12 @ preload into icache240243pbegin:241244 /* move into fast relock bypass */242242- ldr r8, pll_ctl @ get addr245245+ ldr r8, omap242x_ssp_pll_ctl @ get addr243246 ldr r5, [r8] @ get val244247 mvn r6, #0x3 @ clear mask245248 and r5, r5, r6 @ clear field246249 orr r7, r5, #0x2 @ fast relock val247250 str r7, [r8] @ go to fast relock248248- ldr r4, pll_stat @ addr of stat251251+ ldr r4, omap242x_ssp_pll_stat @ addr of stat249252block:250253 /* wait for bypass */251254 ldr r8, [r4] @ stat value···254257 bne block @ loop if not255258256259 /* set new dpll dividers _after_ in bypass */257257- ldr r4, pll_div @ get addr260260+ ldr r4, omap242x_ssp_pll_div @ get addr258261 str r0, [r4] @ set dpll ctrl val259262260260- ldr r4, set_config @ get addr263263+ ldr r4, omap242x_ssp_set_config @ get addr261264 mov r8, #1 @ valid cfg msk262265 str r8, [r4] @ make dividers take263266···271274 beq pend @ jump over dpll relock272275273276 /* relock DPLL with new vals */274274- ldr r5, pll_stat @ get addr275275- ldr r4, pll_ctl @ get addr277277+ ldr r5, omap242x_ssp_pll_stat @ get addr278278+ ldr r4, omap242x_ssp_pll_ctl @ get addr276279 orr r8, r7, #0x3 @ val for lock dpll277280 str r8, [r4] @ set val278281 mov r0, #1000 @ dead spin a bit···286289 bne wait_lock @ wait if not287290pend:288291 /* update memory timings & briefly lock dll */289289- ldr r4, sdrc_rfr @ get addr292292+ ldr r4, omap242x_ssp_sdrc_rfr @ get addr290293 str r1, [r4] @ update refresh timing291291- ldr r11, dlla_ctrl @ get addr of DLLA ctrl294294+ ldr r11, omap242x_ssp_dlla_ctrl @ get addr of DLLA ctrl292295 ldr r10, [r11] @ get current val293296 mvn r9, #0x4 @ mask to get clear bit2294297 and r10, r10, r9 @ clear bit2 for lock mode···304307 nop305308 ldmfd sp!, {r0-r12, pc} @ restore regs and return306309307307-set_config:308308- .word OMAP2420_PRM_REGADDR(OCP_MOD, 0x80)309309-pll_ctl:310310- .word OMAP2420_CM_REGADDR(PLL_MOD, CM_FCLKEN1)311311-pll_stat:312312- .word OMAP2420_CM_REGADDR(PLL_MOD, CM_IDLEST1)313313-pll_div:314314- .word OMAP2420_CM_REGADDR(PLL_MOD, CM_CLKSEL)315315-sdrc_rfr:310310+omap242x_ssp_set_config:311311+ .word OMAP242X_PRCM_CLKCFG_CTRL312312+omap242x_ssp_pll_ctl:313313+ .word OMAP2420_CM_REGADDR(PLL_MOD, CM_CLKEN)314314+omap242x_ssp_pll_stat:315315+ .word OMAP2420_CM_REGADDR(PLL_MOD, CM_IDLEST)316316+omap242x_ssp_pll_div:317317+ .word OMAP2420_CM_REGADDR(PLL_MOD, CM_CLKSEL1)318318+omap242x_ssp_sdrc_rfr:316319 .word OMAP242X_SDRC_REGADDR(SDRC_RFR_CTRL_0)317317-dlla_ctrl:320320+omap242x_ssp_dlla_ctrl:318321 .word OMAP242X_SDRC_REGADDR(SDRC_DLLA_CTRL)319322320320-ENTRY(sram_set_prcm_sz)321321- .word . - sram_set_prcm323323+ENTRY(omap242x_sram_set_prcm_sz)324324+ .word . - omap242x_sram_set_prcm
+321
arch/arm/mach-omap2/sram243x.S
···11+/*22+ * linux/arch/arm/mach-omap2/sram243x.S33+ *44+ * Omap2 specific functions that need to be run in internal SRAM55+ *66+ * (C) Copyright 200477+ * Texas Instruments, <www.ti.com>88+ * Richard Woodruff <r-woodruff2@ti.com>99+ *1010+ * This program is free software; you can redistribute it and/or1111+ * modify it under the terms of the GNU General Public License as1212+ * published by the Free Software Foundation; either version 2 of1313+ * the License, or (at your option) any later version.1414+ *1515+ * This program is distributed in the hope that it will be useful,1616+ * but WITHOUT ANY WARRANTY; without even the implied warranty of1717+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR /PURPOSE. See the1818+ * GNU General Public License for more details.1919+ *2020+ * You should have received a copy of the GNU General Public License2121+ * along with this program; if not, write to the Free Software2222+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,2323+ * MA 02111-1307 USA2424+ */2525+#include <linux/linkage.h>2626+#include <asm/assembler.h>2727+#include <asm/arch/io.h>2828+#include <asm/hardware.h>2929+3030+#include "prm.h"3131+#include "cm.h"3232+#include "sdrc.h"3333+3434+ .text3535+3636+ENTRY(omap243x_sram_ddr_init)3737+ stmfd sp!, {r0 - r12, lr} @ save registers on stack3838+3939+ mov r12, r2 @ capture CS1 vs CS04040+ mov r8, r3 @ capture force parameter4141+4242+ /* frequency shift down */4343+ ldr r2, omap243x_sdi_cm_clksel2_pll @ get address of dpllout reg4444+ mov r3, #0x1 @ value for 1x operation4545+ str r3, [r2] @ go to L1-freq operation4646+4747+ /* voltage shift down */4848+ mov r9, #0x1 @ set up for L1 voltage call4949+ bl voltage_shift @ go drop voltage5050+5151+ /* dll lock mode */5252+ ldr r11, omap243x_sdi_sdrc_dlla_ctrl @ addr of dlla ctrl5353+ ldr r10, [r11] @ get current val5454+ cmp r12, #0x1 @ cs1 base (2422 es2.05/1)5555+ addeq r11, r11, #0x8 @ if cs1 base, move to DLLB5656+ mvn r9, #0x4 @ mask to get clear bit25757+ and r10, r10, r9 @ clear bit2 for lock mode.5858+ orr r10, r10, #0x8 @ make sure DLL on (es2 bit pos)5959+ orr r10, r10, #0x2 @ 90 degree phase for all below 133Mhz6060+ str r10, [r11] @ commit to DLLA_CTRL6161+ bl i_dll_wait @ wait for dll to lock6262+6363+ /* get dll value */6464+ add r11, r11, #0x4 @ get addr of status reg6565+ ldr r10, [r11] @ get locked value6666+6767+ /* voltage shift up */6868+ mov r9, #0x0 @ shift back to L0-voltage6969+ bl voltage_shift @ go raise voltage7070+7171+ /* frequency shift up */7272+ mov r3, #0x2 @ value for 2x operation7373+ str r3, [r2] @ go to L0-freq operation7474+7575+ /* reset entry mode for dllctrl */7676+ sub r11, r11, #0x4 @ move from status to ctrl7777+ cmp r12, #0x1 @ normalize if cs1 based7878+ subeq r11, r11, #0x8 @ possibly back to DLLA7979+ cmp r8, #0x1 @ if forced unlock exit8080+ orreq r1, r1, #0x4 @ make sure exit with unlocked value8181+ str r1, [r11] @ restore DLLA_CTRL high value8282+ add r11, r11, #0x8 @ move to DLLB_CTRL addr8383+ str r1, [r11] @ set value DLLB_CTRL8484+ bl i_dll_wait @ wait for possible lock8585+8686+ /* set up for return, DDR should be good */8787+ str r10, [r0] @ write dll_status and return counter8888+ ldmfd sp!, {r0 - r12, pc} @ restore regs and return8989+9090+ /* ensure the DLL has relocked */9191+i_dll_wait:9292+ mov r4, #0x800 @ delay DLL relock, min 0x400 L3 clocks9393+i_dll_delay:9494+ subs r4, r4, #0x19595+ bne i_dll_delay9696+ mov pc, lr9797+9898+ /*9999+ * shift up or down voltage, use R9 as input to tell level.100100+ * wait for it to finish, use 32k sync counter, 1tick=31uS.101101+ */102102+voltage_shift:103103+ ldr r4, omap243x_sdi_prcm_voltctrl @ get addr of volt ctrl.104104+ ldr r5, [r4] @ get value.105105+ ldr r6, prcm_mask_val @ get value of mask106106+ and r5, r5, r6 @ apply mask to clear bits107107+ orr r5, r5, r9 @ bulld value for L0/L1-volt operation.108108+ str r5, [r4] @ set up for change.109109+ mov r3, #0x4000 @ get val for force110110+ orr r5, r5, r3 @ build value for force111111+ str r5, [r4] @ Force transition to L1112112+113113+ ldr r3, omap243x_sdi_timer_32ksynct_cr @ get addr of counter114114+ ldr r5, [r3] @ get value115115+ add r5, r5, #0x3 @ give it at most 93uS116116+volt_delay:117117+ ldr r7, [r3] @ get timer value118118+ cmp r5, r7 @ time up?119119+ bhi volt_delay @ not yet->branch120120+ mov pc, lr @ back to caller.121121+122122+omap243x_sdi_cm_clksel2_pll:123123+ .word OMAP2430_CM_REGADDR(PLL_MOD, CM_CLKSEL2)124124+omap243x_sdi_sdrc_dlla_ctrl:125125+ .word OMAP243X_SDRC_REGADDR(SDRC_DLLA_CTRL)126126+omap243x_sdi_prcm_voltctrl:127127+ .word OMAP243X_PRCM_VOLTCTRL128128+prcm_mask_val:129129+ .word 0xFFFF3FFC130130+omap243x_sdi_timer_32ksynct_cr:131131+ .word IO_ADDRESS(OMAP2_32KSYNCT_BASE + 0x010)132132+ENTRY(omap243x_sram_ddr_init_sz)133133+ .word . - omap243x_sram_ddr_init134134+135135+/*136136+ * Reprograms memory timings.137137+ * r0 = [PRCM_FULL | PRCM_HALF] r1 = SDRC_DLLA_CTRL value r2 = [DDR | SDR]138138+ * PRCM_FULL = 2, PRCM_HALF = 1, DDR = 1, SDR = 0139139+ */140140+ENTRY(omap243x_sram_reprogram_sdrc)141141+ stmfd sp!, {r0 - r10, lr} @ save registers on stack142142+ mov r3, #0x0 @ clear for mrc call143143+ mcr p15, 0, r3, c7, c10, 4 @ memory barrier, finish ARM SDR/DDR144144+ nop145145+ nop146146+ ldr r6, omap243x_srs_sdrc_rfr_ctrl @ get addr of refresh reg147147+ ldr r5, [r6] @ get value148148+ mov r5, r5, lsr #8 @ isolate rfr field and drop burst149149+150150+ cmp r0, #0x1 @ going to half speed?151151+ movne r9, #0x0 @ if up set flag up for pre up, hi volt152152+153153+ blne voltage_shift_c @ adjust voltage154154+155155+ cmp r0, #0x1 @ going to half speed (post branch link)156156+ moveq r5, r5, lsr #1 @ divide by 2 if to half157157+ movne r5, r5, lsl #1 @ mult by 2 if to full158158+ mov r5, r5, lsl #8 @ put rfr field back into place159159+ add r5, r5, #0x1 @ turn on burst of 1160160+ ldr r4, omap243x_srs_cm_clksel2_pll @ get address of out reg161161+ ldr r3, [r4] @ get curr value162162+ orr r3, r3, #0x3163163+ bic r3, r3, #0x3 @ clear lower bits164164+ orr r3, r3, r0 @ new state value165165+ str r3, [r4] @ set new state (pll/x, x=1 or 2)166166+ nop167167+ nop168168+169169+ moveq r9, #0x1 @ if speed down, post down, drop volt170170+ bleq voltage_shift_c171171+172172+ mcr p15, 0, r3, c7, c10, 4 @ memory barrier173173+ str r5, [r6] @ set new RFR_1 value174174+ add r6, r6, #0x30 @ get RFR_2 addr175175+ str r5, [r6] @ set RFR_2176176+ nop177177+ cmp r2, #0x1 @ (SDR or DDR) do we need to adjust DLL178178+ bne freq_out @ leave if SDR, no DLL function179179+180180+ /* With DDR, we need to take care of the DLL for the frequency change */181181+ ldr r2, omap243x_srs_sdrc_dlla_ctrl @ addr of dlla ctrl182182+ str r1, [r2] @ write out new SDRC_DLLA_CTRL183183+ add r2, r2, #0x8 @ addr to SDRC_DLLB_CTRL184184+ str r1, [r2] @ commit to SDRC_DLLB_CTRL185185+ mov r1, #0x2000 @ wait DLL relock, min 0x400 L3 clocks186186+dll_wait:187187+ subs r1, r1, #0x1188188+ bne dll_wait189189+freq_out:190190+ ldmfd sp!, {r0 - r10, pc} @ restore regs and return191191+192192+ /*193193+ * shift up or down voltage, use R9 as input to tell level.194194+ * wait for it to finish, use 32k sync counter, 1tick=31uS.195195+ */196196+voltage_shift_c:197197+ ldr r10, omap243x_srs_prcm_voltctrl @ get addr of volt ctrl198198+ ldr r8, [r10] @ get value199199+ ldr r7, ddr_prcm_mask_val @ get value of mask200200+ and r8, r8, r7 @ apply mask to clear bits201201+ orr r8, r8, r9 @ bulld value for L0/L1-volt operation.202202+ str r8, [r10] @ set up for change.203203+ mov r7, #0x4000 @ get val for force204204+ orr r8, r8, r7 @ build value for force205205+ str r8, [r10] @ Force transition to L1206206+207207+ ldr r10, omap243x_srs_timer_32ksynct @ get addr of counter208208+ ldr r8, [r10] @ get value209209+ add r8, r8, #0x2 @ give it at most 62uS (min 31+)210210+volt_delay_c:211211+ ldr r7, [r10] @ get timer value212212+ cmp r8, r7 @ time up?213213+ bhi volt_delay_c @ not yet->branch214214+ mov pc, lr @ back to caller215215+216216+omap243x_srs_cm_clksel2_pll:217217+ .word OMAP2430_CM_REGADDR(PLL_MOD, CM_CLKSEL2)218218+omap243x_srs_sdrc_dlla_ctrl:219219+ .word OMAP243X_SDRC_REGADDR(SDRC_DLLA_CTRL)220220+omap243x_srs_sdrc_rfr_ctrl:221221+ .word OMAP243X_SDRC_REGADDR(SDRC_RFR_CTRL_0)222222+omap243x_srs_prcm_voltctrl:223223+ .word OMAP243X_PRCM_VOLTCTRL224224+ddr_prcm_mask_val:225225+ .word 0xFFFF3FFC226226+omap243x_srs_timer_32ksynct:227227+ .word IO_ADDRESS(OMAP2_32KSYNCT_BASE + 0x010)228228+229229+ENTRY(omap243x_sram_reprogram_sdrc_sz)230230+ .word . - omap243x_sram_reprogram_sdrc231231+232232+/*233233+ * Set dividers and pll. Also recalculate DLL value for DDR and unlock mode.234234+ */235235+ENTRY(omap243x_sram_set_prcm)236236+ stmfd sp!, {r0-r12, lr} @ regs to stack237237+ adr r4, pbegin @ addr of preload start238238+ adr r8, pend @ addr of preload end239239+ mcrr p15, 1, r8, r4, c12 @ preload into icache240240+pbegin:241241+ /* move into fast relock bypass */242242+ ldr r8, omap243x_ssp_pll_ctl @ get addr243243+ ldr r5, [r8] @ get val244244+ mvn r6, #0x3 @ clear mask245245+ and r5, r5, r6 @ clear field246246+ orr r7, r5, #0x2 @ fast relock val247247+ str r7, [r8] @ go to fast relock248248+ ldr r4, omap243x_ssp_pll_stat @ addr of stat249249+block:250250+ /* wait for bypass */251251+ ldr r8, [r4] @ stat value252252+ and r8, r8, #0x3 @ mask for stat253253+ cmp r8, #0x1 @ there yet254254+ bne block @ loop if not255255+256256+ /* set new dpll dividers _after_ in bypass */257257+ ldr r4, omap243x_ssp_pll_div @ get addr258258+ str r0, [r4] @ set dpll ctrl val259259+260260+ ldr r4, omap243x_ssp_set_config @ get addr261261+ mov r8, #1 @ valid cfg msk262262+ str r8, [r4] @ make dividers take263263+264264+ mov r4, #100 @ dead spin a bit265265+wait_a_bit:266266+ subs r4, r4, #1 @ dec loop267267+ bne wait_a_bit @ delay done?268268+269269+ /* check if staying in bypass */270270+ cmp r2, #0x1 @ stay in bypass?271271+ beq pend @ jump over dpll relock272272+273273+ /* relock DPLL with new vals */274274+ ldr r5, omap243x_ssp_pll_stat @ get addr275275+ ldr r4, omap243x_ssp_pll_ctl @ get addr276276+ orr r8, r7, #0x3 @ val for lock dpll277277+ str r8, [r4] @ set val278278+ mov r0, #1000 @ dead spin a bit279279+wait_more:280280+ subs r0, r0, #1 @ dec loop281281+ bne wait_more @ delay done?282282+wait_lock:283283+ ldr r8, [r5] @ get lock val284284+ and r8, r8, #3 @ isolate field285285+ cmp r8, #2 @ locked?286286+ bne wait_lock @ wait if not287287+pend:288288+ /* update memory timings & briefly lock dll */289289+ ldr r4, omap243x_ssp_sdrc_rfr @ get addr290290+ str r1, [r4] @ update refresh timing291291+ ldr r11, omap243x_ssp_dlla_ctrl @ get addr of DLLA ctrl292292+ ldr r10, [r11] @ get current val293293+ mvn r9, #0x4 @ mask to get clear bit2294294+ and r10, r10, r9 @ clear bit2 for lock mode295295+ orr r10, r10, #0x8 @ make sure DLL on (es2 bit pos)296296+ str r10, [r11] @ commit to DLLA_CTRL297297+ add r11, r11, #0x8 @ move to dllb298298+ str r10, [r11] @ hit DLLB also299299+300300+ mov r4, #0x800 @ relock time (min 0x400 L3 clocks)301301+wait_dll_lock:302302+ subs r4, r4, #0x1303303+ bne wait_dll_lock304304+ nop305305+ ldmfd sp!, {r0-r12, pc} @ restore regs and return306306+307307+omap243x_ssp_set_config:308308+ .word OMAP243X_PRCM_CLKCFG_CTRL309309+omap243x_ssp_pll_ctl:310310+ .word OMAP2430_CM_REGADDR(PLL_MOD, CM_CLKEN)311311+omap243x_ssp_pll_stat:312312+ .word OMAP2430_CM_REGADDR(PLL_MOD, CM_IDLEST)313313+omap243x_ssp_pll_div:314314+ .word OMAP2430_CM_REGADDR(PLL_MOD, CM_CLKSEL1)315315+omap243x_ssp_sdrc_rfr:316316+ .word OMAP243X_SDRC_REGADDR(SDRC_RFR_CTRL_0)317317+omap243x_ssp_dlla_ctrl:318318+ .word OMAP243X_SDRC_REGADDR(SDRC_DLLA_CTRL)319319+320320+ENTRY(omap243x_sram_set_prcm_sz)321321+ .word . - omap243x_sram_set_prcm
+175-34
arch/arm/plat-omap/sram.c
···1010 * it under the terms of the GNU General Public License version 2 as1111 * published by the Free Software Foundation.1212 */1313+#undef DEBUG13141415#include <linux/module.h>1516#include <linux/kernel.h>···2524#include <asm/arch/sram.h>2625#include <asm/arch/board.h>27262727+#include <asm/arch/control.h>2828+2929+#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3)3030+# include "../mach-omap2/prm.h"3131+# include "../mach-omap2/cm.h"3232+# include "../mach-omap2/sdrc.h"3333+#endif3434+2835#define OMAP1_SRAM_PA 0x200000002929-#define OMAP1_SRAM_VA 0xd00000003636+#define OMAP1_SRAM_VA VMALLOC_END3037#define OMAP2_SRAM_PA 0x402000003138#define OMAP2_SRAM_PUB_PA 0x4020f8003232-#define OMAP2_SRAM_VA 0xd00000003333-#define OMAP2_SRAM_PUB_VA 0xd00008003939+#define OMAP2_SRAM_VA VMALLOC_END4040+#define OMAP2_SRAM_PUB_VA (VMALLOC_END + 0x800)4141+#define OMAP3_SRAM_PA 0x402000004242+#define OMAP3_SRAM_VA 0xd70000004343+#define OMAP3_SRAM_PUB_PA 0x402080004444+#define OMAP3_SRAM_PUB_VA 0xd700800034453535-#if defined(CONFIG_ARCH_OMAP24XX)4646+#if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX)3647#define SRAM_BOOTLOADER_SZ 0x003748#else3849#define SRAM_BOOTLOADER_SZ 0x803950#endif40514141-#define VA_REQINFOPERM0 IO_ADDRESS(0x68005048)4242-#define VA_READPERM0 IO_ADDRESS(0x68005050)4343-#define VA_WRITEPERM0 IO_ADDRESS(0x68005058)4444-#define VA_CONTROL_STAT IO_ADDRESS(0x480002F8)5252+#define OMAP24XX_VA_REQINFOPERM0 IO_ADDRESS(0x68005048)5353+#define OMAP24XX_VA_READPERM0 IO_ADDRESS(0x68005050)5454+#define OMAP24XX_VA_WRITEPERM0 IO_ADDRESS(0x68005058)5555+5656+#define OMAP34XX_VA_REQINFOPERM0 IO_ADDRESS(0x68012848)5757+#define OMAP34XX_VA_READPERM0 IO_ADDRESS(0x68012850)5858+#define OMAP34XX_VA_WRITEPERM0 IO_ADDRESS(0x68012858)5959+#define OMAP34XX_VA_ADDR_MATCH2 IO_ADDRESS(0x68012880)6060+#define OMAP34XX_VA_SMS_RG_ATT0 IO_ADDRESS(0x6C000048)6161+#define OMAP34XX_VA_CONTROL_STAT IO_ADDRESS(0x480022F0)6262+4563#define GP_DEVICE 0x3004646-#define TYPE_MASK 0x70047644865#define ROUND_DOWN(value,boundary) ((value) & (~((boundary)-1)))4966···8768 int type = 0;88698970 if (cpu_is_omap242x())9090- type = __raw_readl(VA_CONTROL_STAT) & TYPE_MASK;7171+ type = system_rev & OMAP2_DEVICETYPE_MASK;91729273 if (type == GP_DEVICE) {9374 /* RAMFW: R/W access to all initiators for all qualifier sets */9475 if (cpu_is_omap242x()) {9595- __raw_writel(0xFF, VA_REQINFOPERM0); /* all q-vects */9696- __raw_writel(0xCFDE, VA_READPERM0); /* all i-read */9797- __raw_writel(0xCFDE, VA_WRITEPERM0); /* all i-write */7676+ __raw_writel(0xFF, OMAP24XX_VA_REQINFOPERM0); /* all q-vects */7777+ __raw_writel(0xCFDE, OMAP24XX_VA_READPERM0); /* all i-read */7878+ __raw_writel(0xCFDE, OMAP24XX_VA_WRITEPERM0); /* all i-write */7979+ }8080+ if (cpu_is_omap34xx()) {8181+ __raw_writel(0xFFFF, OMAP34XX_VA_REQINFOPERM0); /* all q-vects */8282+ __raw_writel(0xFFFF, OMAP34XX_VA_READPERM0); /* all i-read */8383+ __raw_writel(0xFFFF, OMAP34XX_VA_WRITEPERM0); /* all i-write */8484+ __raw_writel(0x0, OMAP34XX_VA_ADDR_MATCH2);8585+ __raw_writel(0xFFFFFFFF, OMAP34XX_VA_SMS_RG_ATT0);9886 }9987 return 0;10088 } else···11892{11993 unsigned long reserved;12094121121- if (cpu_is_omap24xx()) {9595+ if (cpu_class_is_omap2()) {12296 if (is_sram_locked()) {123123- omap_sram_base = OMAP2_SRAM_PUB_VA;124124- omap_sram_start = OMAP2_SRAM_PUB_PA;125125- omap_sram_size = 0x800; /* 2K */9797+ if (cpu_is_omap34xx()) {9898+ omap_sram_base = OMAP3_SRAM_PUB_VA;9999+ omap_sram_start = OMAP3_SRAM_PUB_PA;100100+ omap_sram_size = 0x8000; /* 32K */101101+ } else {102102+ omap_sram_base = OMAP2_SRAM_PUB_VA;103103+ omap_sram_start = OMAP2_SRAM_PUB_PA;104104+ omap_sram_size = 0x800; /* 2K */105105+ }126106 } else {127127- omap_sram_base = OMAP2_SRAM_VA;128128- omap_sram_start = OMAP2_SRAM_PA;129129- if (cpu_is_omap242x())130130- omap_sram_size = 0xa0000; /* 640K */131131- else if (cpu_is_omap243x())107107+ if (cpu_is_omap34xx()) {108108+ omap_sram_base = OMAP3_SRAM_VA;109109+ omap_sram_start = OMAP3_SRAM_PA;132110 omap_sram_size = 0x10000; /* 64K */111111+ } else {112112+ omap_sram_base = OMAP2_SRAM_VA;113113+ omap_sram_start = OMAP2_SRAM_PA;114114+ if (cpu_is_omap242x())115115+ omap_sram_size = 0xa0000; /* 640K */116116+ else if (cpu_is_omap243x())117117+ omap_sram_size = 0x10000; /* 64K */118118+ }133119 }134120 } else {135121 omap_sram_base = OMAP1_SRAM_VA;···195157 omap_sram_io_desc[0].pfn = __phys_to_pfn(base);196158 }197159160160+ if (cpu_is_omap34xx()) {161161+ omap_sram_io_desc[0].virtual = OMAP3_SRAM_VA;162162+ base = OMAP3_SRAM_PA;163163+ base = ROUND_DOWN(base, PAGE_SIZE);164164+ omap_sram_io_desc[0].pfn = __phys_to_pfn(base);165165+ }166166+198167 omap_sram_io_desc[0].length = 1024 * 1024; /* Use section desc */199168 iotable_init(omap_sram_io_desc, ARRAY_SIZE(omap_sram_io_desc));200169···236191 omap_sram_ceil -= size;237192 omap_sram_ceil = ROUND_DOWN(omap_sram_ceil, sizeof(void *));238193 memcpy((void *)omap_sram_ceil, start, size);194194+ flush_icache_range((unsigned long)start, (unsigned long)(start + size));239195240196 return (void *)omap_sram_ceil;241197}···260214261215int __init omap1_sram_init(void)262216{263263- _omap_sram_reprogram_clock = omap_sram_push(sram_reprogram_clock,264264- sram_reprogram_clock_sz);217217+ _omap_sram_reprogram_clock =218218+ omap_sram_push(omap1_sram_reprogram_clock,219219+ omap1_sram_reprogram_clock_sz);265220266221 return 0;267222}···271224#define omap1_sram_init() do {} while (0)272225#endif273226274274-#ifdef CONFIG_ARCH_OMAP2227227+#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3)275228276229static void (*_omap2_sram_ddr_init)(u32 *slow_dll_ctrl, u32 fast_dll_ctrl,277230 u32 base_cs, u32 force_unlock);···306259307260 return _omap2_set_prcm(dpll_ctrl_val, sdrc_rfr_val, bypass);308261}262262+#endif309263310310-int __init omap2_sram_init(void)264264+#ifdef CONFIG_ARCH_OMAP2420265265+int __init omap242x_sram_init(void)311266{312312- _omap2_sram_ddr_init = omap_sram_push(sram_ddr_init, sram_ddr_init_sz);267267+ _omap2_sram_ddr_init = omap_sram_push(omap242x_sram_ddr_init,268268+ omap242x_sram_ddr_init_sz);313269314314- _omap2_sram_reprogram_sdrc = omap_sram_push(sram_reprogram_sdrc,315315- sram_reprogram_sdrc_sz);316316- _omap2_set_prcm = omap_sram_push(sram_set_prcm, sram_set_prcm_sz);270270+ _omap2_sram_reprogram_sdrc = omap_sram_push(omap242x_sram_reprogram_sdrc,271271+ omap242x_sram_reprogram_sdrc_sz);272272+273273+ _omap2_set_prcm = omap_sram_push(omap242x_sram_set_prcm,274274+ omap242x_sram_set_prcm_sz);317275318276 return 0;319277}320278#else321321-#define omap2_sram_init() do {} while (0)279279+static inline int omap242x_sram_init(void)280280+{281281+ return 0;282282+}283283+#endif284284+285285+#ifdef CONFIG_ARCH_OMAP2430286286+int __init omap243x_sram_init(void)287287+{288288+ _omap2_sram_ddr_init = omap_sram_push(omap243x_sram_ddr_init,289289+ omap243x_sram_ddr_init_sz);290290+291291+ _omap2_sram_reprogram_sdrc = omap_sram_push(omap243x_sram_reprogram_sdrc,292292+ omap243x_sram_reprogram_sdrc_sz);293293+294294+ _omap2_set_prcm = omap_sram_push(omap243x_sram_set_prcm,295295+ omap243x_sram_set_prcm_sz);296296+297297+ return 0;298298+}299299+#else300300+static inline int omap243x_sram_init(void)301301+{302302+ return 0;303303+}304304+#endif305305+306306+#ifdef CONFIG_ARCH_OMAP3307307+308308+static u32 (*_omap2_sram_reprogram_gpmc)(u32 perf_level);309309+u32 omap2_sram_reprogram_gpmc(u32 perf_level)310310+{311311+ if (!_omap2_sram_reprogram_gpmc)312312+ omap_sram_error();313313+314314+ return _omap2_sram_reprogram_gpmc(perf_level);315315+}316316+317317+static u32 (*_omap2_sram_configure_core_dpll)(u32 m, u32 n,318318+ u32 freqsel, u32 m2);319319+u32 omap2_sram_configure_core_dpll(u32 m, u32 n, u32 freqsel, u32 m2)320320+{321321+ if (!_omap2_sram_configure_core_dpll)322322+ omap_sram_error();323323+324324+ return _omap2_sram_configure_core_dpll(m, n, freqsel, m2);325325+}326326+327327+/* REVISIT: Should this be same as omap34xx_sram_init() after off-idle? */328328+void restore_sram_functions(void)329329+{330330+ omap_sram_ceil = omap_sram_base + omap_sram_size;331331+332332+ _omap2_sram_reprogram_gpmc = omap_sram_push(omap34xx_sram_reprogram_gpmc,333333+ omap34xx_sram_reprogram_gpmc_sz);334334+335335+ _omap2_sram_configure_core_dpll =336336+ omap_sram_push(omap34xx_sram_configure_core_dpll,337337+ omap34xx_sram_configure_core_dpll_sz);338338+}339339+340340+int __init omap34xx_sram_init(void)341341+{342342+ _omap2_sram_ddr_init = omap_sram_push(omap34xx_sram_ddr_init,343343+ omap34xx_sram_ddr_init_sz);344344+345345+ _omap2_sram_reprogram_sdrc = omap_sram_push(omap34xx_sram_reprogram_sdrc,346346+ omap34xx_sram_reprogram_sdrc_sz);347347+348348+ _omap2_set_prcm = omap_sram_push(omap34xx_sram_set_prcm,349349+ omap34xx_sram_set_prcm_sz);350350+351351+ _omap2_sram_reprogram_gpmc = omap_sram_push(omap34xx_sram_reprogram_gpmc,352352+ omap34xx_sram_reprogram_gpmc_sz);353353+354354+ _omap2_sram_configure_core_dpll =355355+ omap_sram_push(omap34xx_sram_configure_core_dpll,356356+ omap34xx_sram_configure_core_dpll_sz);357357+358358+ return 0;359359+}360360+#else361361+static inline int omap34xx_sram_init(void)362362+{363363+ return 0;364364+}322365#endif323366324367int __init omap_sram_init(void)···416279 omap_detect_sram();417280 omap_map_sram();418281419419- if (!cpu_is_omap24xx())282282+ if (!(cpu_class_is_omap2()))420283 omap1_sram_init();421421- else422422- omap2_sram_init();284284+ else if (cpu_is_omap242x())285285+ omap242x_sram_init();286286+ else if (cpu_is_omap2430())287287+ omap243x_sram_init();288288+ else if (cpu_is_omap34xx())289289+ omap34xx_sram_init();423290424291 return 0;425292}
+28-9
include/asm-arm/arch-omap/sram.h
···1111#ifndef __ARCH_ARM_OMAP_SRAM_H1212#define __ARCH_ARM_OMAP_SRAM_H13131414+extern int __init omap_sram_init(void);1415extern void * omap_sram_push(void * start, unsigned long size);1516extern void omap_sram_reprogram_clock(u32 dpllctl, u32 ckctl);1617···2221extern u32 omap2_set_prcm(u32 dpll_ctrl_val, u32 sdrc_rfr_val, int bypass);23222423/* Do not use these */2525-extern void sram_reprogram_clock(u32 ckctl, u32 dpllctl);2626-extern unsigned long sram_reprogram_clock_sz;2424+extern void omap1_sram_reprogram_clock(u32 ckctl, u32 dpllctl);2525+extern unsigned long omap1_sram_reprogram_clock_sz;27262828-extern void sram_ddr_init(u32 *slow_dll_ctrl, u32 fast_dll_ctrl,2929- u32 base_cs, u32 force_unlock);3030-extern unsigned long sram_ddr_init_sz;2727+extern void omap24xx_sram_reprogram_clock(u32 ckctl, u32 dpllctl);2828+extern unsigned long omap24xx_sram_reprogram_clock_sz;31293232-extern u32 sram_set_prcm(u32 dpll_ctrl_val, u32 sdrc_rfr_val, int bypass);3333-extern unsigned long sram_set_prcm_sz;3030+extern void omap242x_sram_ddr_init(u32 *slow_dll_ctrl, u32 fast_dll_ctrl,3131+ u32 base_cs, u32 force_unlock);3232+extern unsigned long omap242x_sram_ddr_init_sz;34333535-extern void sram_reprogram_sdrc(u32 perf_level, u32 dll_val, u32 mem_type);3636-extern unsigned long sram_reprogram_sdrc_sz;3434+extern u32 omap242x_sram_set_prcm(u32 dpll_ctrl_val, u32 sdrc_rfr_val,3535+ int bypass);3636+extern unsigned long omap242x_sram_set_prcm_sz;3737+3838+extern void omap242x_sram_reprogram_sdrc(u32 perf_level, u32 dll_val,3939+ u32 mem_type);4040+extern unsigned long omap242x_sram_reprogram_sdrc_sz;4141+4242+4343+extern void omap243x_sram_ddr_init(u32 *slow_dll_ctrl, u32 fast_dll_ctrl,4444+ u32 base_cs, u32 force_unlock);4545+extern unsigned long omap243x_sram_ddr_init_sz;4646+4747+extern u32 omap243x_sram_set_prcm(u32 dpll_ctrl_val, u32 sdrc_rfr_val,4848+ int bypass);4949+extern unsigned long omap243x_sram_set_prcm_sz;5050+5151+extern void omap243x_sram_reprogram_sdrc(u32 perf_level, u32 dll_val,5252+ u32 mem_type);5353+extern unsigned long omap243x_sram_reprogram_sdrc_sz;37543855#endif