2 * SoC-specific lowlevel code for DA850
5 * Heiko Schocher, DENX Software Engineering, hs@denx.de.
7 * See file CREDITS for list of people who contributed to this
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
28 #include <asm/arch/da850_lowlevel.h>
29 #include <asm/arch/hardware.h>
30 #include <asm/arch/davinci_misc.h>
31 #include <asm/arch/ddr2_defs.h>
32 #include <asm/arch/emif_defs.h>
33 #include <asm/arch/pll_defs.h>
35 void davinci_enable_uart0(void)
37 lpsc_on(DAVINCI_LPSC_UART0
);
39 /* Bringup UART0 out of reset */
40 REG(UART0_PWREMU_MGMT
) = 0x00006001;
43 #if defined(CONFIG_SYS_DA850_PLL_INIT)
44 void da850_waitloop(unsigned long loopcnt
)
48 for (i
= 0; i
< loopcnt
; i
++)
52 int da850_pll_init(struct davinci_pllc_regs
*reg
, unsigned long pllmult
)
54 if (reg
== davinci_pllc0_regs
)
55 /* Unlock PLL registers. */
56 clrbits_le32(&davinci_syscfg_regs
->cfgchip0
, PLL_MASTER_LOCK
);
59 * Set PLLENSRC '0',bit 5, PLL Enable(PLLEN) selection is controlled
62 clrbits_le32(®
->pllctl
, PLLCTL_PLLENSRC
);
63 /* PLLCTL.EXTCLKSRC bit 9 should be left at 0 for Freon */
64 clrbits_le32(®
->pllctl
, PLLCTL_EXTCLKSRC
);
66 /* Set PLLEN=0 => PLL BYPASS MODE */
67 clrbits_le32(®
->pllctl
, PLLCTL_PLLEN
);
71 if (reg
== davinci_pllc0_regs
) {
73 * Select the Clock Mode bit 8 as External Clock or On Chip
76 dv_maskbits(®
->pllctl
, ~PLLCTL_RES_9
);
77 setbits_le32(®
->pllctl
,
78 (CONFIG_SYS_DV_CLKMODE
<< PLLCTL_CLOCK_MODE_SHIFT
));
81 /* Clear PLLRST bit to reset the PLL */
82 clrbits_le32(®
->pllctl
, PLLCTL_PLLRST
);
84 /* Disable the PLL output */
85 setbits_le32(®
->pllctl
, PLLCTL_PLLDIS
);
87 /* PLL initialization sequence */
89 * Power up the PLL- PWRDN bit set to 0 to bring the PLL out of
92 clrbits_le32(®
->pllctl
, PLLCTL_PLLPWRDN
);
94 /* Enable the PLL from Disable Mode PLLDIS bit to 0 */
95 clrbits_le32(®
->pllctl
, PLLCTL_PLLDIS
);
97 #if defined(CONFIG_SYS_DA850_PLL0_PREDIV)
98 /* program the prediv */
99 if (reg
== davinci_pllc0_regs
&& CONFIG_SYS_DA850_PLL0_PREDIV
)
100 writel((PLL_DIVEN
| CONFIG_SYS_DA850_PLL0_PREDIV
),
104 /* Program the required multiplier value in PLLM */
105 writel(pllmult
, ®
->pllm
);
107 /* program the postdiv */
108 if (reg
== davinci_pllc0_regs
)
109 writel((PLL_POSTDEN
| CONFIG_SYS_DA850_PLL0_POSTDIV
),
112 writel((PLL_POSTDEN
| CONFIG_SYS_DA850_PLL1_POSTDIV
),
116 * Check for the GOSTAT bit in PLLSTAT to clear to 0 to indicate that
117 * no GO operation is currently in progress
119 while ((readl(®
->pllstat
) & PLLCMD_GOSTAT
) == PLLCMD_GOSTAT
)
122 if (reg
== davinci_pllc0_regs
) {
123 writel(CONFIG_SYS_DA850_PLL0_PLLDIV1
, ®
->plldiv1
);
124 writel(CONFIG_SYS_DA850_PLL0_PLLDIV2
, ®
->plldiv2
);
125 writel(CONFIG_SYS_DA850_PLL0_PLLDIV3
, ®
->plldiv3
);
126 writel(CONFIG_SYS_DA850_PLL0_PLLDIV4
, ®
->plldiv4
);
127 writel(CONFIG_SYS_DA850_PLL0_PLLDIV5
, ®
->plldiv5
);
128 writel(CONFIG_SYS_DA850_PLL0_PLLDIV6
, ®
->plldiv6
);
129 writel(CONFIG_SYS_DA850_PLL0_PLLDIV7
, ®
->plldiv7
);
131 writel(CONFIG_SYS_DA850_PLL1_PLLDIV1
, ®
->plldiv1
);
132 writel(CONFIG_SYS_DA850_PLL1_PLLDIV2
, ®
->plldiv2
);
133 writel(CONFIG_SYS_DA850_PLL1_PLLDIV3
, ®
->plldiv3
);
137 * Set the GOSET bit in PLLCMD to 1 to initiate a new divider
140 setbits_le32(®
->pllcmd
, PLLCMD_GOSTAT
);
143 * Wait for the GOSTAT bit in PLLSTAT to clear to 0
144 * (completion of phase alignment).
146 while ((readl(®
->pllstat
) & PLLCMD_GOSTAT
) == PLLCMD_GOSTAT
)
149 /* Wait for PLL to reset properly. See PLL spec for PLL reset time */
152 /* Set the PLLRST bit in PLLCTL to 1 to bring the PLL out of reset */
153 setbits_le32(®
->pllctl
, PLLCTL_PLLRST
);
155 /* Wait for PLL to lock. See PLL spec for PLL lock time */
156 da850_waitloop(2400);
159 * Set the PLLEN bit in PLLCTL to 1 to remove the PLL from bypass
162 setbits_le32(®
->pllctl
, PLLCTL_PLLEN
);
166 * clear EMIFA and EMIFB clock source settings, let them
169 if (reg
== davinci_pllc0_regs
)
170 dv_maskbits(&davinci_syscfg_regs
->cfgchip3
,
171 ~(PLL_SCSCFG3_DIV45PENA
| PLL_SCSCFG3_EMA_CLKSRC
));
175 #endif /* CONFIG_SYS_DA850_PLL_INIT */
177 #if defined(CONFIG_SYS_DA850_DDR_INIT)
178 int da850_ddr_setup(void)
182 /* Enable the Clock to DDR2/mDDR */
183 lpsc_on(DAVINCI_LPSC_DDR_EMIF
);
185 tmp
= readl(&davinci_syscfg1_regs
->vtpio_ctl
);
186 if ((tmp
& VTP_POWERDWN
) == VTP_POWERDWN
) {
187 /* Begin VTP Calibration */
188 clrbits_le32(&davinci_syscfg1_regs
->vtpio_ctl
, VTP_POWERDWN
);
189 clrbits_le32(&davinci_syscfg1_regs
->vtpio_ctl
, VTP_LOCK
);
190 setbits_le32(&davinci_syscfg1_regs
->vtpio_ctl
, VTP_CLKRZ
);
191 clrbits_le32(&davinci_syscfg1_regs
->vtpio_ctl
, VTP_CLKRZ
);
192 setbits_le32(&davinci_syscfg1_regs
->vtpio_ctl
, VTP_CLKRZ
);
194 /* Polling READY bit to see when VTP calibration is done */
195 tmp
= readl(&davinci_syscfg1_regs
->vtpio_ctl
);
196 while ((tmp
& VTP_READY
) != VTP_READY
)
197 tmp
= readl(&davinci_syscfg1_regs
->vtpio_ctl
);
199 setbits_le32(&davinci_syscfg1_regs
->vtpio_ctl
, VTP_LOCK
);
200 setbits_le32(&davinci_syscfg1_regs
->vtpio_ctl
, VTP_POWERDWN
);
202 setbits_le32(&davinci_syscfg1_regs
->vtpio_ctl
, VTP_IOPWRDWN
);
203 writel(CONFIG_SYS_DA850_DDR2_DDRPHYCR
, &dv_ddr2_regs_ctrl
->ddrphycr
);
205 if (CONFIG_SYS_DA850_DDR2_SDBCR
& (1 << DV_DDR_SDCR_DDR2EN_SHIFT
)) {
207 clrbits_le32(&davinci_syscfg1_regs
->ddr_slew
,
208 (1 << DDR_SLEW_DDR_PDENA_BIT
) |
209 (1 << DDR_SLEW_CMOSEN_BIT
));
212 setbits_le32(&davinci_syscfg1_regs
->ddr_slew
,
213 (1 << DDR_SLEW_DDR_PDENA_BIT
) |
214 (1 << DDR_SLEW_CMOSEN_BIT
));
218 * SDRAM Configuration Register (SDCR):
219 * First set the BOOTUNLOCK bit to make configuration bits
222 setbits_le32(&dv_ddr2_regs_ctrl
->sdbcr
, DV_DDR_BOOTUNLOCK
);
225 * Write the new value of these bits and clear BOOTUNLOCK.
226 * At the same time, set the TIMUNLOCK bit to allow changing
227 * the timing registers
229 tmp
= CONFIG_SYS_DA850_DDR2_SDBCR
;
230 tmp
&= ~DV_DDR_BOOTUNLOCK
;
231 tmp
|= DV_DDR_TIMUNLOCK
;
232 writel(tmp
, &dv_ddr2_regs_ctrl
->sdbcr
);
234 /* write memory configuration and timing */
235 if (!(CONFIG_SYS_DA850_DDR2_SDBCR
& (1 << DV_DDR_SDCR_DDR2EN_SHIFT
))) {
237 writel(CONFIG_SYS_DA850_DDR2_SDBCR2
,
238 &dv_ddr2_regs_ctrl
->sdbcr2
);
240 writel(CONFIG_SYS_DA850_DDR2_SDTIMR
, &dv_ddr2_regs_ctrl
->sdtimr
);
241 writel(CONFIG_SYS_DA850_DDR2_SDTIMR2
, &dv_ddr2_regs_ctrl
->sdtimr2
);
243 /* clear the TIMUNLOCK bit and write the value of the CL field */
244 tmp
&= ~DV_DDR_TIMUNLOCK
;
245 writel(tmp
, &dv_ddr2_regs_ctrl
->sdbcr
);
248 * LPMODEN and MCLKSTOPEN must be set!
249 * Without this bits set, PSC don;t switch states !!
251 writel(CONFIG_SYS_DA850_DDR2_SDRCR
|
252 (1 << DV_DDR_SRCR_LPMODEN_SHIFT
) |
253 (1 << DV_DDR_SRCR_MCLKSTOPEN_SHIFT
),
254 &dv_ddr2_regs_ctrl
->sdrcr
);
256 /* SyncReset the Clock to EMIF3A SDRAM */
257 lpsc_syncreset(DAVINCI_LPSC_DDR_EMIF
);
258 /* Enable the Clock to EMIF3A SDRAM */
259 lpsc_on(DAVINCI_LPSC_DDR_EMIF
);
261 /* disable self refresh */
262 clrbits_le32(&dv_ddr2_regs_ctrl
->sdrcr
,
263 DV_DDR_SDRCR_LPMODEN
| DV_DDR_SDRCR_MCLKSTOPEN
);
264 writel(CONFIG_SYS_DA850_DDR2_PBBPR
, &dv_ddr2_regs_ctrl
->pbbpr
);
268 #endif /* CONFIG_SYS_DA850_DDR_INIT */
270 __attribute__((weak
))
271 void board_gpio_init(void)
276 int arch_cpu_init(void)
278 /* Unlock kick registers */
279 writel(DV_SYSCFG_KICK0_UNLOCK
, &davinci_syscfg_regs
->kick0
);
280 writel(DV_SYSCFG_KICK1_UNLOCK
, &davinci_syscfg_regs
->kick1
);
282 dv_maskbits(&davinci_syscfg_regs
->suspsrc
,
283 CONFIG_SYS_DA850_SYSCFG_SUSPSRC
);
285 /* configure pinmux settings */
286 if (davinci_configure_pin_mux_items(pinmuxes
, pinmuxes_size
))
289 #if defined(CONFIG_SYS_DA850_PLL_INIT)
291 da850_pll_init(davinci_pllc0_regs
, CONFIG_SYS_DA850_PLL0_PLLM
);
292 da850_pll_init(davinci_pllc1_regs
, CONFIG_SYS_DA850_PLL1_PLLM
);
294 /* setup CSn config */
295 #if defined(CONFIG_SYS_DA850_CS2CFG)
296 writel(CONFIG_SYS_DA850_CS2CFG
, &davinci_emif_regs
->ab1cr
);
298 #if defined(CONFIG_SYS_DA850_CS3CFG)
299 writel(CONFIG_SYS_DA850_CS3CFG
, &davinci_emif_regs
->ab2cr
);
302 da8xx_configure_lpsc_items(lpsc
, lpsc_size
);
308 NS16550_init((NS16550_t
)(CONFIG_SYS_NS16550_COM1
),
309 CONFIG_SYS_NS16550_CLK
/ 16 / CONFIG_BAUDRATE
);
312 * Fix Power and Emulation Management Register
313 * see sprufw3a.pdf page 37 Table 24
315 writel((DAVINCI_UART_PWREMU_MGMT_FREE
| DAVINCI_UART_PWREMU_MGMT_URRST
|
316 DAVINCI_UART_PWREMU_MGMT_UTRST
),
317 &davinci_uart2_ctrl_regs
->pwremu_mgmt
);
319 #if defined(CONFIG_SYS_DA850_DDR_INIT)