summaryrefslogtreecommitdiff
path: root/arch/arm/mach-stmp3xxx/emi.S
blob: c134c3dfa15918ef512c59540e6b9cb1cb3b7571 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
/*
 * Freescale STMP378X low level RAM frequency manipulation
 *
 * Author: Vitaly Wool <vital@embeddedalley.com>
 *
 * Copyright 2008 Freescale Semiconductor, Inc. All Rights Reserved.
 * Copyright 2008 Embedded Alley Solutions, Inc All Rights Reserved.
 */

/*
 * The code contained herein is licensed under the GNU General Public
 * License. You may obtain a copy of the GNU General Public License
 * Version 2 or later at the following locations:
 *
 * http://www.opensource.org/licenses/gpl-license.html
 * http://www.gnu.org/copyleft/gpl.html
 */
#include <linux/linkage.h>
#include <asm/assembler.h>
#include <mach/hardware.h>
#include <asm/system.h>
#include <asm/pgtable-hwdef.h>
#include <mach/regs-power.h>
#include <mach/regs-clkctrl.h>
#include "clock.h"

.global cpu_arm926_switch_mm

.align 8
ENTRY(stmp3xxx_ram_freq_scale)
	stmfd	sp!, {r1 - r9, lr}

	ldr	r5, [r0, #SCALING_DATA_NEW_FREQ_OFFSET]
	ldr	r6, [r0, #SCALING_DATA_CUR_FREQ_OFFSET]
	ldr	r7, [r0, #SCALING_DATA_EMI_DIV_OFFSET]
	ldr	r8, [r0, #SCALING_DATA_FRAC_DIV_OFFSET]

	adr	r9, __stmp_temp_stack

	@ clean cache
	ldr	r1, __stmp_flush_cache_addr
	mov	lr, pc
	mov	pc, r1

	@ put DRAM into self refresh
	ldr	r0, __stmp_dram_ctl00
	ldr	r1, [r0, #0x20]
	orr	r1, r1, #(1 << 8)
	str	r1, [r0, #0x20]
	@ wait for it to actually happen
	ldr	r0, __stmp_dram_emi00
1:	ldr	r1, [r0, #0x10]
	tst	r1, #(1 << 1)
	beq	1b
	nop

	@ prepare for change
	cmp	r5, #24
	bgt	2f
	bl	stmp3xxx_ram_24M_set_timings
	b	100f
2:	cmp	r5, #48
	bgt	3f
	bl	stmp3xxx_ram_48M_set_timings
	b	100f
3:	cmp	r5, #60
	bgt	4f
	bl	stmp3xxx_ram_60M_set_timings
	b	100f
4:	cmp	r5, #80
	bgt	5f
	bl	stmp3xxx_ram_80M_set_timings
	b	100f
5:	cmp	r5, #96
	bgt	6f
	bl	stmp3xxx_ram_96M_set_timings
	b	100f
6:	cmp	r5, #120
	bgt	7f
	bl	stmp3xxx_ram_120M_set_timings
	b	100f
7:	cmp     r5, #133
	bgt	8f
	bl	stmp3xxx_ram_133M_set_timings
	b	100f
8:	bl	stmp3xxx_ram_150M_set_timings

100:
	@ RAM to clk from xtal
	mov	r0, #(HW_CLKCTRL_CLKSEQ_ADDR & 0x000000FF)
	orr	r0, r0, #(HW_CLKCTRL_CLKSEQ_ADDR & 0x0000FF00)
	orr	r0, r0, #(HW_CLKCTRL_CLKSEQ_ADDR & 0x00FF0000)
	orr	r0, r0, #(HW_CLKCTRL_CLKSEQ_ADDR & 0xFF000000)
	mov	r1, #(1<<6)
	str	r1, [r0, #4]
	mov	r0, #(HW_CLKCTRL_EMI_ADDR & 0x000000FF)
	orr	r0, r0, #(HW_CLKCTRL_EMI_ADDR & 0x0000FF00)
	orr	r0, r0, #(HW_CLKCTRL_EMI_ADDR & 0x00FF0000)
	orr	r0, r0, #(HW_CLKCTRL_EMI_ADDR & 0xFF000000)
101:	ldr     r1, [r0]
	tst     r1, #BM_CLKCTRL_EMI_BUSY_REF_XTAL
	bne     101b

	bl	__stmp_emi_set_values

	@ EMI back to PLL
	mov	r0, #(HW_CLKCTRL_CLKSEQ_ADDR & 0x000000FF)
	orr	r0, r0, #(HW_CLKCTRL_CLKSEQ_ADDR & 0x0000FF00)
	orr	r0, r0, #(HW_CLKCTRL_CLKSEQ_ADDR & 0x00FF0000)
	orr	r0, r0, #(HW_CLKCTRL_CLKSEQ_ADDR & 0xFF000000)
	mov	r1, #(1<<6)
	str	r1, [r0, #8]

	mov	r0, #(HW_CLKCTRL_EMI_ADDR & 0x000000FF)
	orr	r0, r0, #(HW_CLKCTRL_EMI_ADDR & 0x0000FF00)
	orr	r0, r0, #(HW_CLKCTRL_EMI_ADDR & 0x00FF0000)
	orr	r0, r0, #(HW_CLKCTRL_EMI_ADDR & 0xFF000000)
1:	ldr	r1, [r0]
	tst	r1, #BM_CLKCTRL_EMI_BUSY_REF_EMI
	bne	1b
	bic	r1, #BM_CLKCTRL_EMI_DCC_RESYNC_ENABLE
	str	r1, [r0]

	@ restore normal DRAM mode
	ldr	r0, __stmp_dram_ctl00
	ldr	r1, [r0, #0x20]
	bic	r1, r1, #(1 << 8)
	str	r1, [r0, #0x20]
	@ wait for it to actually happen
	ldr	r0, __stmp_dram_emi00
102:	ldr	r1, [r0, #0x10]
	tst	r1, #(1 << 1)
	bne	102b

	@ restore regs and return
	ldmfd   sp!, {r1 - r9, lr}
	mov	pc, lr

	.space	0x100
__stmp_temp_stack:
	.word	0

#include "emi.inc"

__stmp_flush_cache_addr:
	.word	arm926_flush_kern_cache_all

ENTRY(stmp3xxx_ram_funcs_sz)
	.word	. - stmp3xxx_ram_freq_scale