aboutsummaryrefslogblamecommitdiffstats
path: root/arch/arm/mach-omap2/sram34xx.S
blob: 9a454151c4228b4d86464889ebb9b2a90ba9de1c (plain) (tree)












































                                                                         
                                                                               














                                                                       
                                                                            





                                                                 
                                                                 




                                        
                                                                 

                     

                                                                         
                                                                        
                                                                         
                                                      
                                                                           
                                                                       

                                                                              
                                                                   














                                                                 
                                                                     




























                                                                         
                       
                                    
                                                                               





















                                          
                                                                       
























                                                        
/*
 * linux/arch/arm/mach-omap3/sram.S
 *
 * Omap3 specific functions that need to be run in internal SRAM
 *
 * (C) Copyright 2007
 * Texas Instruments Inc.
 * Rajendra Nayak <rnayak@ti.com>
 *
 * (C) Copyright 2004
 * Texas Instruments, <www.ti.com>
 * Richard Woodruff <r-woodruff2@ti.com>
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation; either version 2 of
 * the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR /PURPOSE. See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 * MA 02111-1307 USA
 */
#include <linux/linkage.h>
#include <asm/assembler.h>
#include <mach/hardware.h>

#include <mach/io.h>

#include "sdrc.h"
#include "cm.h"

	.text

/*
 * Change frequency of core dpll
 * r0 = sdrc_rfr_ctrl r1 = sdrc_actim_ctrla r2 = sdrc_actim_ctrlb r3 = M2
 */
ENTRY(omap3_sram_configure_core_dpll)
	stmfd	sp!, {r1-r12, lr}	@ store regs to stack
	dsb				@ flush buffered writes to interconnect
	cmp	r3, #0x2
	blne	configure_sdrc
	cmp	r3, #0x2
	blne	lock_dll
	cmp	r3, #0x1
	blne	unlock_dll
	bl	sdram_in_selfrefresh	@ put the SDRAM in self refresh
	bl 	configure_core_dpll
	bl	enable_sdrc
	cmp	r3, #0x1
	blne	wait_dll_unlock
	cmp	r3, #0x2
	blne	wait_dll_lock
	cmp	r3, #0x1
	blne	configure_sdrc
	isb				@ prevent speculative exec past here
	mov 	r0, #0 			@ return value
	ldmfd	sp!, {r1-r12, pc}	@ restore regs and return
unlock_dll:
	ldr	r4, omap3_sdrc_dlla_ctrl
	ldr	r5, [r4]
	orr	r5, r5, #0x4
	str	r5, [r4]		@ (no OCP barrier needed)
	bx	lr
lock_dll:
	ldr	r4, omap3_sdrc_dlla_ctrl
	ldr	r5, [r4]
	bic	r5, r5, #0x4
	str	r5, [r4]		@ (no OCP barrier needed)
	bx	lr
sdram_in_selfrefresh:
	ldr	r4, omap3_sdrc_power	@ read the SDRC_POWER register
	ldr	r5, [r4]		@ read the contents of SDRC_POWER
	mov	r9, r5			@ keep a copy of SDRC_POWER bits
	orr 	r5, r5, #0x40		@ enable self refresh on idle req
	bic 	r5, r5, #0x4		@ clear PWDENA
	str 	r5, [r4]		@ write back to SDRC_POWER register
	ldr	r5, [r4]		@ posted-write barrier for SDRC
	ldr	r4, omap3_cm_iclken1_core	@ read the CM_ICLKEN1_CORE reg
	ldr	r5, [r4]
	bic	r5, r5, #0x2		@ disable iclk bit for SDRC
	str 	r5, [r4]
wait_sdrc_idle:
	ldr 	r4, omap3_cm_idlest1_core
	ldr 	r5, [r4]
	and 	r5, r5, #0x2		@ check for SDRC idle
	cmp 	r5, #2
	bne 	wait_sdrc_idle
	bx 	lr
configure_core_dpll:
	ldr 	r4, omap3_cm_clksel1_pll
	ldr	r5, [r4]
	ldr	r6, core_m2_mask_val	@ modify m2 for core dpll
	and	r5, r5, r6
	orr	r5, r5, r3, lsl #0x1B	@ r3 contains the M2 val
	str	r5, [r4]
	ldr	r5, [r4]		@ posted-write barrier for CM
	mov 	r5, #0x800		@ wait for the clock to stabilise
	cmp	r3, #2
	bne	wait_clk_stable
	bx	lr
wait_clk_stable:
	subs 	r5, r5, #1
	bne	wait_clk_stable
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	bx	lr
enable_sdrc:
	ldr 	r4, omap3_cm_iclken1_core
	ldr	r5, [r4]
	orr 	r5, r5, #0x2		@ enable iclk bit for SDRC
	str 	r5, [r4]
wait_sdrc_idle1:
	ldr 	r4, omap3_cm_idlest1_core
	ldr	r5, [r4]
	and 	r5, r5, #0x2
	cmp	r5, #0
	bne	wait_sdrc_idle1
restore_sdrc_power_val:
	ldr	r4, omap3_sdrc_power
	str	r9, [r4]		@ restore SDRC_POWER, no barrier needed
	bx	lr
wait_dll_lock:
	ldr	r4, omap3_sdrc_dlla_status
	ldr	r5, [r4]
	and 	r5, r5, #0x4
	cmp	r5, #0x4
	bne	wait_dll_lock
	bx	lr
wait_dll_unlock:
	ldr	r4, omap3_sdrc_dlla_status
	ldr	r5, [r4]
	and	r5, r5, #0x4
	cmp	r5, #0x0
	bne	wait_dll_unlock
	bx	lr
configure_sdrc:
	ldr	r4, omap3_sdrc_rfr_ctrl
	str	r0, [r4]
	ldr	r4, omap3_sdrc_actim_ctrla
	str	r1, [r4]
	ldr	r4, omap3_sdrc_actim_ctrlb
	str	r2, [r4]
	ldr	r2, [r4]		@ posted-write barrier for SDRC
	bx	lr

omap3_sdrc_power:
	.word OMAP34XX_SDRC_REGADDR(SDRC_POWER)
omap3_cm_clksel1_pll:
	.word OMAP34XX_CM_REGADDR(PLL_MOD, CM_CLKSEL1)
omap3_cm_idlest1_core:
	.word OMAP34XX_CM_REGADDR(CORE_MOD, CM_IDLEST)
omap3_cm_iclken1_core:
	.word OMAP34XX_CM_REGADDR(CORE_MOD, CM_ICLKEN1)
omap3_sdrc_rfr_ctrl:
	.word OMAP34XX_SDRC_REGADDR(SDRC_RFR_CTRL_0)
omap3_sdrc_actim_ctrla:
	.word OMAP34XX_SDRC_REGADDR(SDRC_ACTIM_CTRL_A_0)
omap3_sdrc_actim_ctrlb:
	.word OMAP34XX_SDRC_REGADDR(SDRC_ACTIM_CTRL_B_0)
omap3_sdrc_dlla_status:
	.word OMAP34XX_SDRC_REGADDR(SDRC_DLLA_STATUS)
omap3_sdrc_dlla_ctrl:
	.word OMAP34XX_SDRC_REGADDR(SDRC_DLLA_CTRL)
core_m2_mask_val:
	.word 0x07FFFFFF

ENTRY(omap3_sram_configure_core_dpll_sz)
	.word	. - omap3_sram_configure_core_dpll