blob: fe6f979947c66395a6baf769eaef90b80428db39 [file] [log] [blame]
Bryan Wu1394f032007-05-06 14:50:22 -07001/*
2 * File: arch/blackfin/mach-bf561/head.S
3 * Based on: arch/blackfin/mach-bf533/head.S
4 * Author:
5 *
6 * Created:
7 * Description: BF561 startup file
8 *
9 * Modified:
10 * Copyright 2004-2006 Analog Devices Inc.
11 *
12 * Bugs: Enter bugs at http://blackfin.uclinux.org/
13 *
14 * This program is free software; you can redistribute it and/or modify
15 * it under the terms of the GNU General Public License as published by
16 * the Free Software Foundation; either version 2 of the License, or
17 * (at your option) any later version.
18 *
19 * This program is distributed in the hope that it will be useful,
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 * GNU General Public License for more details.
23 *
24 * You should have received a copy of the GNU General Public License
25 * along with this program; if not, see the file COPYING, or write
26 * to the Free Software Foundation, Inc.,
27 * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
28 */
29
30#include <linux/linkage.h>
Mike Frysinger52a07812007-06-11 15:31:30 +080031#include <linux/init.h>
Bryan Wu1394f032007-05-06 14:50:22 -070032#include <asm/blackfin.h>
Mike Frysinger17e89bc2008-08-06 17:23:50 +080033#ifdef CONFIG_BFIN_KERNEL_CLOCK
Robin Getzf16295e2007-08-03 18:07:17 +080034#include <asm/mach-common/clocks.h>
Bryan Wu1394f032007-05-06 14:50:22 -070035#include <asm/mach/mem_init.h>
36#endif
37
Bryan Wu1394f032007-05-06 14:50:22 -070038.extern _bf53x_relocate_l1_mem
39
Mike Frysinger52a07812007-06-11 15:31:30 +080040__INIT
Bryan Wu1394f032007-05-06 14:50:22 -070041
Mike Frysinger17e89bc2008-08-06 17:23:50 +080042ENTRY(_mach_early_start)
Mike Frysinger5079df92007-05-21 18:09:27 +080043 /* Initialise UART - when booting from u-boot, the UART is not disabled
44 * so if we dont initalize here, our serial console gets hosed */
Graf Yang6ed83942008-04-24 04:43:14 +080045 p0.h = hi(BFIN_UART_LCR);
46 p0.l = lo(BFIN_UART_LCR);
Bryan Wu1394f032007-05-06 14:50:22 -070047 r0 = 0x0(Z);
48 w[p0] = r0.L; /* To enable DLL writes */
49 ssync;
50
Graf Yang6ed83942008-04-24 04:43:14 +080051 p0.h = hi(BFIN_UART_DLL);
52 p0.l = lo(BFIN_UART_DLL);
Bryan Wu1394f032007-05-06 14:50:22 -070053 r0 = 0x0(Z);
54 w[p0] = r0.L;
55 ssync;
56
Graf Yang6ed83942008-04-24 04:43:14 +080057 p0.h = hi(BFIN_UART_DLH);
58 p0.l = lo(BFIN_UART_DLH);
Bryan Wu1394f032007-05-06 14:50:22 -070059 r0 = 0x00(Z);
60 w[p0] = r0.L;
61 ssync;
62
Graf Yang6ed83942008-04-24 04:43:14 +080063 p0.h = hi(BFIN_UART_GCTL);
64 p0.l = lo(BFIN_UART_GCTL);
Bryan Wu1394f032007-05-06 14:50:22 -070065 r0 = 0x0(Z);
66 w[p0] = r0.L; /* To enable UART clock */
67 ssync;
68
Mike Frysinger17e89bc2008-08-06 17:23:50 +080069 rts;
70ENDPROC(_mach_early_start)
Bryan Wu1394f032007-05-06 14:50:22 -070071
Mike Frysinger52a07812007-06-11 15:31:30 +080072__FINIT
Bryan Wu1394f032007-05-06 14:50:22 -070073
74.section .l1.text
Mike Frysinger17e89bc2008-08-06 17:23:50 +080075#ifdef CONFIG_BFIN_KERNEL_CLOCK
Bryan Wu1394f032007-05-06 14:50:22 -070076ENTRY(_start_dma_code)
77 p0.h = hi(SICA_IWR0);
78 p0.l = lo(SICA_IWR0);
79 r0.l = 0x1;
80 [p0] = r0;
81 SSYNC;
82
83 /*
84 * Set PLL_CTL
85 * - [14:09] = MSEL[5:0] : CLKIN / VCO multiplication factors
86 * - [8] = BYPASS : BYPASS the PLL, run CLKIN into CCLK/SCLK
87 * - [7] = output delay (add 200ps of delay to mem signals)
88 * - [6] = input delay (add 200ps of input delay to mem signals)
89 * - [5] = PDWN : 1=All Clocks off
90 * - [3] = STOPCK : 1=Core Clock off
91 * - [1] = PLL_OFF : 1=Disable Power to PLL
92 * - [0] = DF : 1=Pass CLKIN/2 to PLL / 0=Pass CLKIN to PLL
93 * all other bits set to zero
94 */
95
96 p0.h = hi(PLL_LOCKCNT);
97 p0.l = lo(PLL_LOCKCNT);
98 r0 = 0x300(Z);
99 w[p0] = r0.l;
100 ssync;
101
102 P2.H = hi(EBIU_SDGCTL);
103 P2.L = lo(EBIU_SDGCTL);
104 R0 = [P2];
105 BITSET (R0, 24);
106 [P2] = R0;
107 SSYNC;
108
109 r0 = CONFIG_VCO_MULT & 63; /* Load the VCO multiplier */
110 r0 = r0 << 9; /* Shift it over, */
111 r1 = CLKIN_HALF; /* Do we need to divide CLKIN by 2?*/
112 r0 = r1 | r0;
113 r1 = PLL_BYPASS; /* Bypass the PLL? */
114 r1 = r1 << 8; /* Shift it over */
115 r0 = r1 | r0; /* add them all together */
116
117 p0.h = hi(PLL_CTL);
118 p0.l = lo(PLL_CTL); /* Load the address */
119 cli r2; /* Disable interrupts */
120 ssync;
121 w[p0] = r0.l; /* Set the value */
122 idle; /* Wait for the PLL to stablize */
123 sti r2; /* Enable interrupts */
124
125.Lcheck_again:
126 p0.h = hi(PLL_STAT);
127 p0.l = lo(PLL_STAT);
128 R0 = W[P0](Z);
129 CC = BITTST(R0,5);
130 if ! CC jump .Lcheck_again;
131
132 /* Configure SCLK & CCLK Dividers */
Mike Frysinger83a5c3e2007-06-11 15:31:30 +0800133 r0 = (CONFIG_CCLK_ACT_DIV | CONFIG_SCLK_DIV);
Bryan Wu1394f032007-05-06 14:50:22 -0700134 p0.h = hi(PLL_DIV);
135 p0.l = lo(PLL_DIV);
136 w[p0] = r0.l;
137 ssync;
138
139 p0.l = lo(EBIU_SDRRC);
140 p0.h = hi(EBIU_SDRRC);
141 r0 = mem_SDRRC;
142 w[p0] = r0.l;
143 ssync;
144
Bryan Wu1394f032007-05-06 14:50:22 -0700145 P2.H = hi(EBIU_SDGCTL);
146 P2.L = lo(EBIU_SDGCTL);
147 R0 = [P2];
148 BITCLR (R0, 24);
149 p0.h = hi(EBIU_SDSTAT);
150 p0.l = lo(EBIU_SDSTAT);
151 r2.l = w[p0];
152 cc = bittst(r2,3);
153 if !cc jump .Lskip;
154 NOP;
155 BITSET (R0, 23);
156.Lskip:
157 [P2] = R0;
158 SSYNC;
159
160 R0.L = lo(mem_SDGCTL);
161 R0.H = hi(mem_SDGCTL);
162 R1 = [p2];
163 R1 = R1 | R0;
164 [P2] = R1;
165 SSYNC;
166
167 RTS;
Mike Frysinger52a07812007-06-11 15:31:30 +0800168ENDPROC(_start_dma_code)
Bryan Wu1394f032007-05-06 14:50:22 -0700169#endif /* CONFIG_BFIN_KERNEL_CLOCK */