1*601fbec7SMasahiro Yamada /*
2*601fbec7SMasahiro Yamada * SoC-specific lowlevel code for tms320dm365 and similar chips
3*601fbec7SMasahiro Yamada * Actually used for booting from NAND with nand_spl.
4*601fbec7SMasahiro Yamada *
5*601fbec7SMasahiro Yamada * Copyright (C) 2011
6*601fbec7SMasahiro Yamada * Heiko Schocher, DENX Software Engineering, hs@denx.de.
7*601fbec7SMasahiro Yamada *
8*601fbec7SMasahiro Yamada * SPDX-License-Identifier: GPL-2.0+
9*601fbec7SMasahiro Yamada */
10*601fbec7SMasahiro Yamada #include <common.h>
11*601fbec7SMasahiro Yamada #include <nand.h>
12*601fbec7SMasahiro Yamada #include <ns16550.h>
13*601fbec7SMasahiro Yamada #include <post.h>
14*601fbec7SMasahiro Yamada #include <asm/ti-common/davinci_nand.h>
15*601fbec7SMasahiro Yamada #include <asm/arch/dm365_lowlevel.h>
16*601fbec7SMasahiro Yamada #include <asm/arch/hardware.h>
17*601fbec7SMasahiro Yamada
dm365_waitloop(unsigned long loopcnt)18*601fbec7SMasahiro Yamada void dm365_waitloop(unsigned long loopcnt)
19*601fbec7SMasahiro Yamada {
20*601fbec7SMasahiro Yamada unsigned long i;
21*601fbec7SMasahiro Yamada
22*601fbec7SMasahiro Yamada for (i = 0; i < loopcnt; i++)
23*601fbec7SMasahiro Yamada asm(" NOP");
24*601fbec7SMasahiro Yamada }
25*601fbec7SMasahiro Yamada
dm365_pll1_init(unsigned long pllmult,unsigned long prediv)26*601fbec7SMasahiro Yamada int dm365_pll1_init(unsigned long pllmult, unsigned long prediv)
27*601fbec7SMasahiro Yamada {
28*601fbec7SMasahiro Yamada unsigned int clksrc = 0x0;
29*601fbec7SMasahiro Yamada
30*601fbec7SMasahiro Yamada /* Power up the PLL */
31*601fbec7SMasahiro Yamada clrbits_le32(&dv_pll0_regs->pllctl, PLLCTL_PLLPWRDN);
32*601fbec7SMasahiro Yamada
33*601fbec7SMasahiro Yamada clrbits_le32(&dv_pll0_regs->pllctl, PLLCTL_RES_9);
34*601fbec7SMasahiro Yamada setbits_le32(&dv_pll0_regs->pllctl,
35*601fbec7SMasahiro Yamada clksrc << PLLCTL_CLOCK_MODE_SHIFT);
36*601fbec7SMasahiro Yamada
37*601fbec7SMasahiro Yamada /*
38*601fbec7SMasahiro Yamada * Set PLLENSRC '0', PLL Enable(PLLEN) selection is controlled
39*601fbec7SMasahiro Yamada * through MMR
40*601fbec7SMasahiro Yamada */
41*601fbec7SMasahiro Yamada clrbits_le32(&dv_pll0_regs->pllctl, PLLCTL_PLLENSRC);
42*601fbec7SMasahiro Yamada
43*601fbec7SMasahiro Yamada /* Set PLLEN=0 => PLL BYPASS MODE */
44*601fbec7SMasahiro Yamada clrbits_le32(&dv_pll0_regs->pllctl, PLLCTL_PLLEN);
45*601fbec7SMasahiro Yamada
46*601fbec7SMasahiro Yamada dm365_waitloop(150);
47*601fbec7SMasahiro Yamada
48*601fbec7SMasahiro Yamada /* PLLRST=1(reset assert) */
49*601fbec7SMasahiro Yamada setbits_le32(&dv_pll0_regs->pllctl, PLLCTL_PLLRST);
50*601fbec7SMasahiro Yamada
51*601fbec7SMasahiro Yamada dm365_waitloop(300);
52*601fbec7SMasahiro Yamada
53*601fbec7SMasahiro Yamada /*Bring PLL out of Reset*/
54*601fbec7SMasahiro Yamada clrbits_le32(&dv_pll0_regs->pllctl, PLLCTL_PLLRST);
55*601fbec7SMasahiro Yamada
56*601fbec7SMasahiro Yamada /* Program the Multiper and Pre-Divider for PLL1 */
57*601fbec7SMasahiro Yamada writel(pllmult, &dv_pll0_regs->pllm);
58*601fbec7SMasahiro Yamada writel(prediv, &dv_pll0_regs->prediv);
59*601fbec7SMasahiro Yamada
60*601fbec7SMasahiro Yamada /* Assert TENABLE = 1, TENABLEDIV = 1, TINITZ = 1 */
61*601fbec7SMasahiro Yamada writel(PLLSECCTL_STOPMODE | PLLSECCTL_TENABLEDIV | PLLSECCTL_TENABLE |
62*601fbec7SMasahiro Yamada PLLSECCTL_TINITZ, &dv_pll0_regs->secctl);
63*601fbec7SMasahiro Yamada /* Assert TENABLE = 1, TENABLEDIV = 1, TINITZ = 0 */
64*601fbec7SMasahiro Yamada writel(PLLSECCTL_STOPMODE | PLLSECCTL_TENABLEDIV | PLLSECCTL_TENABLE,
65*601fbec7SMasahiro Yamada &dv_pll0_regs->secctl);
66*601fbec7SMasahiro Yamada /* Assert TENABLE = 0, TENABLEDIV = 0, TINITZ = 0 */
67*601fbec7SMasahiro Yamada writel(PLLSECCTL_STOPMODE, &dv_pll0_regs->secctl);
68*601fbec7SMasahiro Yamada /* Assert TENABLE = 0, TENABLEDIV = 0, TINITZ = 1 */
69*601fbec7SMasahiro Yamada writel(PLLSECCTL_STOPMODE | PLLSECCTL_TINITZ, &dv_pll0_regs->secctl);
70*601fbec7SMasahiro Yamada
71*601fbec7SMasahiro Yamada /* Program the PostDiv for PLL1 */
72*601fbec7SMasahiro Yamada writel(PLL_POSTDEN, &dv_pll0_regs->postdiv);
73*601fbec7SMasahiro Yamada
74*601fbec7SMasahiro Yamada /* Post divider setting for PLL1 */
75*601fbec7SMasahiro Yamada writel(CONFIG_SYS_DM36x_PLL1_PLLDIV1, &dv_pll0_regs->plldiv1);
76*601fbec7SMasahiro Yamada writel(CONFIG_SYS_DM36x_PLL1_PLLDIV2, &dv_pll0_regs->plldiv2);
77*601fbec7SMasahiro Yamada writel(CONFIG_SYS_DM36x_PLL1_PLLDIV3, &dv_pll0_regs->plldiv3);
78*601fbec7SMasahiro Yamada writel(CONFIG_SYS_DM36x_PLL1_PLLDIV4, &dv_pll0_regs->plldiv4);
79*601fbec7SMasahiro Yamada writel(CONFIG_SYS_DM36x_PLL1_PLLDIV5, &dv_pll0_regs->plldiv5);
80*601fbec7SMasahiro Yamada writel(CONFIG_SYS_DM36x_PLL1_PLLDIV6, &dv_pll0_regs->plldiv6);
81*601fbec7SMasahiro Yamada writel(CONFIG_SYS_DM36x_PLL1_PLLDIV7, &dv_pll0_regs->plldiv7);
82*601fbec7SMasahiro Yamada writel(CONFIG_SYS_DM36x_PLL1_PLLDIV8, &dv_pll0_regs->plldiv8);
83*601fbec7SMasahiro Yamada writel(CONFIG_SYS_DM36x_PLL1_PLLDIV9, &dv_pll0_regs->plldiv9);
84*601fbec7SMasahiro Yamada
85*601fbec7SMasahiro Yamada dm365_waitloop(300);
86*601fbec7SMasahiro Yamada
87*601fbec7SMasahiro Yamada /* Set the GOSET bit */
88*601fbec7SMasahiro Yamada writel(PLLCMD_GOSET, &dv_pll0_regs->pllcmd); /* Go */
89*601fbec7SMasahiro Yamada
90*601fbec7SMasahiro Yamada dm365_waitloop(300);
91*601fbec7SMasahiro Yamada
92*601fbec7SMasahiro Yamada /* Wait for PLL to LOCK */
93*601fbec7SMasahiro Yamada while (!((readl(&dv_sys_module_regs->pll0_config) & PLL0_LOCK)
94*601fbec7SMasahiro Yamada == PLL0_LOCK))
95*601fbec7SMasahiro Yamada ;
96*601fbec7SMasahiro Yamada
97*601fbec7SMasahiro Yamada /* Enable the PLL Bit of PLLCTL*/
98*601fbec7SMasahiro Yamada setbits_le32(&dv_pll0_regs->pllctl, PLLCTL_PLLEN);
99*601fbec7SMasahiro Yamada
100*601fbec7SMasahiro Yamada return 0;
101*601fbec7SMasahiro Yamada }
102*601fbec7SMasahiro Yamada
dm365_pll2_init(unsigned long pllm,unsigned long prediv)103*601fbec7SMasahiro Yamada int dm365_pll2_init(unsigned long pllm, unsigned long prediv)
104*601fbec7SMasahiro Yamada {
105*601fbec7SMasahiro Yamada unsigned int clksrc = 0x0;
106*601fbec7SMasahiro Yamada
107*601fbec7SMasahiro Yamada /* Power up the PLL*/
108*601fbec7SMasahiro Yamada clrbits_le32(&dv_pll1_regs->pllctl, PLLCTL_PLLPWRDN);
109*601fbec7SMasahiro Yamada
110*601fbec7SMasahiro Yamada /*
111*601fbec7SMasahiro Yamada * Select the Clock Mode as Onchip Oscilator or External Clock on
112*601fbec7SMasahiro Yamada * MXI pin
113*601fbec7SMasahiro Yamada * VDB has input on MXI pin
114*601fbec7SMasahiro Yamada */
115*601fbec7SMasahiro Yamada clrbits_le32(&dv_pll1_regs->pllctl, PLLCTL_RES_9);
116*601fbec7SMasahiro Yamada setbits_le32(&dv_pll1_regs->pllctl,
117*601fbec7SMasahiro Yamada clksrc << PLLCTL_CLOCK_MODE_SHIFT);
118*601fbec7SMasahiro Yamada
119*601fbec7SMasahiro Yamada /*
120*601fbec7SMasahiro Yamada * Set PLLENSRC '0', PLL Enable(PLLEN) selection is controlled
121*601fbec7SMasahiro Yamada * through MMR
122*601fbec7SMasahiro Yamada */
123*601fbec7SMasahiro Yamada clrbits_le32(&dv_pll1_regs->pllctl, PLLCTL_PLLENSRC);
124*601fbec7SMasahiro Yamada
125*601fbec7SMasahiro Yamada /* Set PLLEN=0 => PLL BYPASS MODE */
126*601fbec7SMasahiro Yamada clrbits_le32(&dv_pll1_regs->pllctl, PLLCTL_PLLEN);
127*601fbec7SMasahiro Yamada
128*601fbec7SMasahiro Yamada dm365_waitloop(50);
129*601fbec7SMasahiro Yamada
130*601fbec7SMasahiro Yamada /* PLLRST=1(reset assert) */
131*601fbec7SMasahiro Yamada setbits_le32(&dv_pll1_regs->pllctl, PLLCTL_PLLRST);
132*601fbec7SMasahiro Yamada
133*601fbec7SMasahiro Yamada dm365_waitloop(300);
134*601fbec7SMasahiro Yamada
135*601fbec7SMasahiro Yamada /* Bring PLL out of Reset */
136*601fbec7SMasahiro Yamada clrbits_le32(&dv_pll1_regs->pllctl, PLLCTL_PLLRST);
137*601fbec7SMasahiro Yamada
138*601fbec7SMasahiro Yamada /* Program the Multiper and Pre-Divider for PLL2 */
139*601fbec7SMasahiro Yamada writel(pllm, &dv_pll1_regs->pllm);
140*601fbec7SMasahiro Yamada writel(prediv, &dv_pll1_regs->prediv);
141*601fbec7SMasahiro Yamada
142*601fbec7SMasahiro Yamada writel(PLL_POSTDEN, &dv_pll1_regs->postdiv);
143*601fbec7SMasahiro Yamada
144*601fbec7SMasahiro Yamada /* Assert TENABLE = 1, TENABLEDIV = 1, TINITZ = 1 */
145*601fbec7SMasahiro Yamada writel(PLLSECCTL_STOPMODE | PLLSECCTL_TENABLEDIV | PLLSECCTL_TENABLE |
146*601fbec7SMasahiro Yamada PLLSECCTL_TINITZ, &dv_pll1_regs->secctl);
147*601fbec7SMasahiro Yamada /* Assert TENABLE = 1, TENABLEDIV = 1, TINITZ = 0 */
148*601fbec7SMasahiro Yamada writel(PLLSECCTL_STOPMODE | PLLSECCTL_TENABLEDIV | PLLSECCTL_TENABLE,
149*601fbec7SMasahiro Yamada &dv_pll1_regs->secctl);
150*601fbec7SMasahiro Yamada /* Assert TENABLE = 0, TENABLEDIV = 0, TINITZ = 0 */
151*601fbec7SMasahiro Yamada writel(PLLSECCTL_STOPMODE, &dv_pll1_regs->secctl);
152*601fbec7SMasahiro Yamada /* Assert TENABLE = 0, TENABLEDIV = 0, TINITZ = 1 */
153*601fbec7SMasahiro Yamada writel(PLLSECCTL_STOPMODE | PLLSECCTL_TINITZ, &dv_pll1_regs->secctl);
154*601fbec7SMasahiro Yamada
155*601fbec7SMasahiro Yamada /* Post divider setting for PLL2 */
156*601fbec7SMasahiro Yamada writel(CONFIG_SYS_DM36x_PLL2_PLLDIV1, &dv_pll1_regs->plldiv1);
157*601fbec7SMasahiro Yamada writel(CONFIG_SYS_DM36x_PLL2_PLLDIV2, &dv_pll1_regs->plldiv2);
158*601fbec7SMasahiro Yamada writel(CONFIG_SYS_DM36x_PLL2_PLLDIV3, &dv_pll1_regs->plldiv3);
159*601fbec7SMasahiro Yamada writel(CONFIG_SYS_DM36x_PLL2_PLLDIV4, &dv_pll1_regs->plldiv4);
160*601fbec7SMasahiro Yamada writel(CONFIG_SYS_DM36x_PLL2_PLLDIV5, &dv_pll1_regs->plldiv5);
161*601fbec7SMasahiro Yamada
162*601fbec7SMasahiro Yamada /* GoCmd for PostDivider to take effect */
163*601fbec7SMasahiro Yamada writel(PLLCMD_GOSET, &dv_pll1_regs->pllcmd);
164*601fbec7SMasahiro Yamada
165*601fbec7SMasahiro Yamada dm365_waitloop(150);
166*601fbec7SMasahiro Yamada
167*601fbec7SMasahiro Yamada /* Wait for PLL to LOCK */
168*601fbec7SMasahiro Yamada while (!((readl(&dv_sys_module_regs->pll1_config) & PLL1_LOCK)
169*601fbec7SMasahiro Yamada == PLL1_LOCK))
170*601fbec7SMasahiro Yamada ;
171*601fbec7SMasahiro Yamada
172*601fbec7SMasahiro Yamada dm365_waitloop(4100);
173*601fbec7SMasahiro Yamada
174*601fbec7SMasahiro Yamada /* Enable the PLL2 */
175*601fbec7SMasahiro Yamada setbits_le32(&dv_pll1_regs->pllctl, PLLCTL_PLLEN);
176*601fbec7SMasahiro Yamada
177*601fbec7SMasahiro Yamada /* do this after PLL's have been set up */
178*601fbec7SMasahiro Yamada writel(CONFIG_SYS_DM36x_PERI_CLK_CTRL,
179*601fbec7SMasahiro Yamada &dv_sys_module_regs->peri_clkctl);
180*601fbec7SMasahiro Yamada
181*601fbec7SMasahiro Yamada return 0;
182*601fbec7SMasahiro Yamada }
183*601fbec7SMasahiro Yamada
dm365_ddr_setup(void)184*601fbec7SMasahiro Yamada int dm365_ddr_setup(void)
185*601fbec7SMasahiro Yamada {
186*601fbec7SMasahiro Yamada lpsc_on(DAVINCI_LPSC_DDR_EMIF);
187*601fbec7SMasahiro Yamada clrbits_le32(&dv_sys_module_regs->vtpiocr,
188*601fbec7SMasahiro Yamada VPTIO_IOPWRDN | VPTIO_CLRZ | VPTIO_LOCK | VPTIO_PWRDN);
189*601fbec7SMasahiro Yamada
190*601fbec7SMasahiro Yamada /* Set bit CLRZ (bit 13) */
191*601fbec7SMasahiro Yamada setbits_le32(&dv_sys_module_regs->vtpiocr, VPTIO_CLRZ);
192*601fbec7SMasahiro Yamada
193*601fbec7SMasahiro Yamada /* Check VTP READY Status */
194*601fbec7SMasahiro Yamada while (!(readl(&dv_sys_module_regs->vtpiocr) & VPTIO_RDY))
195*601fbec7SMasahiro Yamada ;
196*601fbec7SMasahiro Yamada
197*601fbec7SMasahiro Yamada /* Set bit VTP_IOPWRDWN bit 14 for DDR input buffers) */
198*601fbec7SMasahiro Yamada setbits_le32(&dv_sys_module_regs->vtpiocr, VPTIO_IOPWRDN);
199*601fbec7SMasahiro Yamada
200*601fbec7SMasahiro Yamada /* Set bit LOCK(bit7) */
201*601fbec7SMasahiro Yamada setbits_le32(&dv_sys_module_regs->vtpiocr, VPTIO_LOCK);
202*601fbec7SMasahiro Yamada
203*601fbec7SMasahiro Yamada /*
204*601fbec7SMasahiro Yamada * Powerdown VTP as it is locked (bit 6)
205*601fbec7SMasahiro Yamada * Set bit VTP_IOPWRDWN bit 14 for DDR input buffers)
206*601fbec7SMasahiro Yamada */
207*601fbec7SMasahiro Yamada setbits_le32(&dv_sys_module_regs->vtpiocr,
208*601fbec7SMasahiro Yamada VPTIO_IOPWRDN | VPTIO_PWRDN);
209*601fbec7SMasahiro Yamada
210*601fbec7SMasahiro Yamada /* Wait for calibration to complete */
211*601fbec7SMasahiro Yamada dm365_waitloop(150);
212*601fbec7SMasahiro Yamada
213*601fbec7SMasahiro Yamada /* Set the DDR2 to synreset, then enable it again */
214*601fbec7SMasahiro Yamada lpsc_syncreset(DAVINCI_LPSC_DDR_EMIF);
215*601fbec7SMasahiro Yamada lpsc_on(DAVINCI_LPSC_DDR_EMIF);
216*601fbec7SMasahiro Yamada
217*601fbec7SMasahiro Yamada writel(CONFIG_SYS_DM36x_DDR2_DDRPHYCR, &dv_ddr2_regs_ctrl->ddrphycr);
218*601fbec7SMasahiro Yamada
219*601fbec7SMasahiro Yamada /* Program SDRAM Bank Config Register */
220*601fbec7SMasahiro Yamada writel((CONFIG_SYS_DM36x_DDR2_SDBCR | DV_DDR_BOOTUNLOCK),
221*601fbec7SMasahiro Yamada &dv_ddr2_regs_ctrl->sdbcr);
222*601fbec7SMasahiro Yamada writel((CONFIG_SYS_DM36x_DDR2_SDBCR | DV_DDR_TIMUNLOCK),
223*601fbec7SMasahiro Yamada &dv_ddr2_regs_ctrl->sdbcr);
224*601fbec7SMasahiro Yamada
225*601fbec7SMasahiro Yamada /* Program SDRAM Timing Control Register1 */
226*601fbec7SMasahiro Yamada writel(CONFIG_SYS_DM36x_DDR2_SDTIMR, &dv_ddr2_regs_ctrl->sdtimr);
227*601fbec7SMasahiro Yamada /* Program SDRAM Timing Control Register2 */
228*601fbec7SMasahiro Yamada writel(CONFIG_SYS_DM36x_DDR2_SDTIMR2, &dv_ddr2_regs_ctrl->sdtimr2);
229*601fbec7SMasahiro Yamada
230*601fbec7SMasahiro Yamada writel(CONFIG_SYS_DM36x_DDR2_PBBPR, &dv_ddr2_regs_ctrl->pbbpr);
231*601fbec7SMasahiro Yamada
232*601fbec7SMasahiro Yamada writel(CONFIG_SYS_DM36x_DDR2_SDBCR, &dv_ddr2_regs_ctrl->sdbcr);
233*601fbec7SMasahiro Yamada
234*601fbec7SMasahiro Yamada /* Program SDRAM Refresh Control Register */
235*601fbec7SMasahiro Yamada writel(CONFIG_SYS_DM36x_DDR2_SDRCR, &dv_ddr2_regs_ctrl->sdrcr);
236*601fbec7SMasahiro Yamada
237*601fbec7SMasahiro Yamada lpsc_syncreset(DAVINCI_LPSC_DDR_EMIF);
238*601fbec7SMasahiro Yamada lpsc_on(DAVINCI_LPSC_DDR_EMIF);
239*601fbec7SMasahiro Yamada
240*601fbec7SMasahiro Yamada return 0;
241*601fbec7SMasahiro Yamada }
242*601fbec7SMasahiro Yamada
dm365_vpss_sync_reset(void)243*601fbec7SMasahiro Yamada static void dm365_vpss_sync_reset(void)
244*601fbec7SMasahiro Yamada {
245*601fbec7SMasahiro Yamada unsigned int PdNum = 0;
246*601fbec7SMasahiro Yamada
247*601fbec7SMasahiro Yamada /* VPSS_CLKMD 1:1 */
248*601fbec7SMasahiro Yamada setbits_le32(&dv_sys_module_regs->vpss_clkctl,
249*601fbec7SMasahiro Yamada VPSS_CLK_CTL_VPSS_CLKMD);
250*601fbec7SMasahiro Yamada
251*601fbec7SMasahiro Yamada /* LPSC SyncReset DDR Clock Enable */
252*601fbec7SMasahiro Yamada writel(((readl(&dv_psc_regs->mdctl[DAVINCI_LPSC_VPSSMASTER]) &
253*601fbec7SMasahiro Yamada ~PSC_MD_STATE_MSK) | PSC_SYNCRESET),
254*601fbec7SMasahiro Yamada &dv_psc_regs->mdctl[DAVINCI_LPSC_VPSSMASTER]);
255*601fbec7SMasahiro Yamada
256*601fbec7SMasahiro Yamada writel((1 << PdNum), &dv_psc_regs->ptcmd);
257*601fbec7SMasahiro Yamada
258*601fbec7SMasahiro Yamada while (!(((readl(&dv_psc_regs->ptstat) >> PdNum) & PSC_GOSTAT) == 0))
259*601fbec7SMasahiro Yamada ;
260*601fbec7SMasahiro Yamada while (!((readl(&dv_psc_regs->mdstat[DAVINCI_LPSC_VPSSMASTER]) &
261*601fbec7SMasahiro Yamada PSC_MD_STATE_MSK) == PSC_SYNCRESET))
262*601fbec7SMasahiro Yamada ;
263*601fbec7SMasahiro Yamada }
264*601fbec7SMasahiro Yamada
dm365_por_reset(void)265*601fbec7SMasahiro Yamada static void dm365_por_reset(void)
266*601fbec7SMasahiro Yamada {
267*601fbec7SMasahiro Yamada struct davinci_timer *wdog =
268*601fbec7SMasahiro Yamada (struct davinci_timer *)DAVINCI_WDOG_BASE;
269*601fbec7SMasahiro Yamada
270*601fbec7SMasahiro Yamada if (readl(&dv_pll0_regs->rstype) &
271*601fbec7SMasahiro Yamada (PLL_RSTYPE_POR | PLL_RSTYPE_XWRST)) {
272*601fbec7SMasahiro Yamada dm365_vpss_sync_reset();
273*601fbec7SMasahiro Yamada
274*601fbec7SMasahiro Yamada writel(DV_TMPBUF_VAL, TMPBUF);
275*601fbec7SMasahiro Yamada setbits_le32(TMPSTATUS, FLAG_PORRST);
276*601fbec7SMasahiro Yamada writel(DV_WDT_ENABLE_SYS_RESET, &wdog->na1);
277*601fbec7SMasahiro Yamada writel(DV_WDT_TRIGGER_SYS_RESET, &wdog->na2);
278*601fbec7SMasahiro Yamada
279*601fbec7SMasahiro Yamada while (1);
280*601fbec7SMasahiro Yamada }
281*601fbec7SMasahiro Yamada }
282*601fbec7SMasahiro Yamada
dm365_wdt_reset(void)283*601fbec7SMasahiro Yamada static void dm365_wdt_reset(void)
284*601fbec7SMasahiro Yamada {
285*601fbec7SMasahiro Yamada struct davinci_timer *wdog =
286*601fbec7SMasahiro Yamada (struct davinci_timer *)DAVINCI_WDOG_BASE;
287*601fbec7SMasahiro Yamada
288*601fbec7SMasahiro Yamada if (readl(TMPBUF) != DV_TMPBUF_VAL) {
289*601fbec7SMasahiro Yamada writel(DV_TMPBUF_VAL, TMPBUF);
290*601fbec7SMasahiro Yamada setbits_le32(TMPSTATUS, FLAG_PORRST);
291*601fbec7SMasahiro Yamada setbits_le32(TMPSTATUS, FLAG_FLGOFF);
292*601fbec7SMasahiro Yamada
293*601fbec7SMasahiro Yamada dm365_waitloop(100);
294*601fbec7SMasahiro Yamada
295*601fbec7SMasahiro Yamada dm365_vpss_sync_reset();
296*601fbec7SMasahiro Yamada
297*601fbec7SMasahiro Yamada writel(DV_WDT_ENABLE_SYS_RESET, &wdog->na1);
298*601fbec7SMasahiro Yamada writel(DV_WDT_TRIGGER_SYS_RESET, &wdog->na2);
299*601fbec7SMasahiro Yamada
300*601fbec7SMasahiro Yamada while (1);
301*601fbec7SMasahiro Yamada }
302*601fbec7SMasahiro Yamada }
303*601fbec7SMasahiro Yamada
dm365_wdt_flag_on(void)304*601fbec7SMasahiro Yamada static void dm365_wdt_flag_on(void)
305*601fbec7SMasahiro Yamada {
306*601fbec7SMasahiro Yamada /* VPSS_CLKMD 1:2 */
307*601fbec7SMasahiro Yamada clrbits_le32(&dv_sys_module_regs->vpss_clkctl,
308*601fbec7SMasahiro Yamada VPSS_CLK_CTL_VPSS_CLKMD);
309*601fbec7SMasahiro Yamada writel(0, TMPBUF);
310*601fbec7SMasahiro Yamada setbits_le32(TMPSTATUS, FLAG_FLGON);
311*601fbec7SMasahiro Yamada }
312*601fbec7SMasahiro Yamada
dm365_psc_init(void)313*601fbec7SMasahiro Yamada void dm365_psc_init(void)
314*601fbec7SMasahiro Yamada {
315*601fbec7SMasahiro Yamada unsigned char i = 0;
316*601fbec7SMasahiro Yamada unsigned char lpsc_start;
317*601fbec7SMasahiro Yamada unsigned char lpsc_end, lpscgroup, lpscmin, lpscmax;
318*601fbec7SMasahiro Yamada unsigned int PdNum = 0;
319*601fbec7SMasahiro Yamada
320*601fbec7SMasahiro Yamada lpscmin = 0;
321*601fbec7SMasahiro Yamada lpscmax = 2;
322*601fbec7SMasahiro Yamada
323*601fbec7SMasahiro Yamada for (lpscgroup = lpscmin; lpscgroup <= lpscmax; lpscgroup++) {
324*601fbec7SMasahiro Yamada if (lpscgroup == 0) {
325*601fbec7SMasahiro Yamada /* Enabling LPSC 3 to 28 SCR first */
326*601fbec7SMasahiro Yamada lpsc_start = DAVINCI_LPSC_VPSSMSTR;
327*601fbec7SMasahiro Yamada lpsc_end = DAVINCI_LPSC_TIMER1;
328*601fbec7SMasahiro Yamada } else if (lpscgroup == 1) { /* Skip locked LPSCs [29-37] */
329*601fbec7SMasahiro Yamada lpsc_start = DAVINCI_LPSC_CFG5;
330*601fbec7SMasahiro Yamada lpsc_end = DAVINCI_LPSC_VPSSMASTER;
331*601fbec7SMasahiro Yamada } else {
332*601fbec7SMasahiro Yamada lpsc_start = DAVINCI_LPSC_MJCP;
333*601fbec7SMasahiro Yamada lpsc_end = DAVINCI_LPSC_HDVICP;
334*601fbec7SMasahiro Yamada }
335*601fbec7SMasahiro Yamada
336*601fbec7SMasahiro Yamada /* NEXT=0x3, Enable LPSC's */
337*601fbec7SMasahiro Yamada for (i = lpsc_start; i <= lpsc_end; i++)
338*601fbec7SMasahiro Yamada setbits_le32(&dv_psc_regs->mdctl[i], PSC_ENABLE);
339*601fbec7SMasahiro Yamada
340*601fbec7SMasahiro Yamada /*
341*601fbec7SMasahiro Yamada * Program goctl to start transition sequence for LPSCs
342*601fbec7SMasahiro Yamada * CSL_PSC_0_REGS->PTCMD = (1<<PdNum); Kick off Power
343*601fbec7SMasahiro Yamada * Domain 0 Modules
344*601fbec7SMasahiro Yamada */
345*601fbec7SMasahiro Yamada writel((1 << PdNum), &dv_psc_regs->ptcmd);
346*601fbec7SMasahiro Yamada
347*601fbec7SMasahiro Yamada /*
348*601fbec7SMasahiro Yamada * Wait for GOSTAT = NO TRANSITION from PSC for Powerdomain 0
349*601fbec7SMasahiro Yamada */
350*601fbec7SMasahiro Yamada while (!(((readl(&dv_psc_regs->ptstat) >> PdNum) & PSC_GOSTAT)
351*601fbec7SMasahiro Yamada == 0))
352*601fbec7SMasahiro Yamada ;
353*601fbec7SMasahiro Yamada
354*601fbec7SMasahiro Yamada /* Wait for MODSTAT = ENABLE from LPSC's */
355*601fbec7SMasahiro Yamada for (i = lpsc_start; i <= lpsc_end; i++)
356*601fbec7SMasahiro Yamada while (!((readl(&dv_psc_regs->mdstat[i]) &
357*601fbec7SMasahiro Yamada PSC_MD_STATE_MSK) == PSC_ENABLE))
358*601fbec7SMasahiro Yamada ;
359*601fbec7SMasahiro Yamada }
360*601fbec7SMasahiro Yamada }
361*601fbec7SMasahiro Yamada
dm365_emif_init(void)362*601fbec7SMasahiro Yamada static void dm365_emif_init(void)
363*601fbec7SMasahiro Yamada {
364*601fbec7SMasahiro Yamada writel(CONFIG_SYS_DM36x_AWCCR, &davinci_emif_regs->awccr);
365*601fbec7SMasahiro Yamada writel(CONFIG_SYS_DM36x_AB1CR, &davinci_emif_regs->ab1cr);
366*601fbec7SMasahiro Yamada
367*601fbec7SMasahiro Yamada setbits_le32(&davinci_emif_regs->nandfcr, DAVINCI_NANDFCR_CS2NAND);
368*601fbec7SMasahiro Yamada
369*601fbec7SMasahiro Yamada writel(CONFIG_SYS_DM36x_AB2CR, &davinci_emif_regs->ab2cr);
370*601fbec7SMasahiro Yamada
371*601fbec7SMasahiro Yamada return;
372*601fbec7SMasahiro Yamada }
373*601fbec7SMasahiro Yamada
dm365_pinmux_ctl(unsigned long offset,unsigned long mask,unsigned long value)374*601fbec7SMasahiro Yamada void dm365_pinmux_ctl(unsigned long offset, unsigned long mask,
375*601fbec7SMasahiro Yamada unsigned long value)
376*601fbec7SMasahiro Yamada {
377*601fbec7SMasahiro Yamada clrbits_le32(&dv_sys_module_regs->pinmux[offset], mask);
378*601fbec7SMasahiro Yamada setbits_le32(&dv_sys_module_regs->pinmux[offset], (mask & value));
379*601fbec7SMasahiro Yamada }
380*601fbec7SMasahiro Yamada
381*601fbec7SMasahiro Yamada __attribute__((weak))
board_gpio_init(void)382*601fbec7SMasahiro Yamada void board_gpio_init(void)
383*601fbec7SMasahiro Yamada {
384*601fbec7SMasahiro Yamada return;
385*601fbec7SMasahiro Yamada }
386*601fbec7SMasahiro Yamada
387*601fbec7SMasahiro Yamada #if defined(CONFIG_POST)
post_log(char * format,...)388*601fbec7SMasahiro Yamada int post_log(char *format, ...)
389*601fbec7SMasahiro Yamada {
390*601fbec7SMasahiro Yamada return 0;
391*601fbec7SMasahiro Yamada }
392*601fbec7SMasahiro Yamada #endif
393*601fbec7SMasahiro Yamada
dm36x_lowlevel_init(ulong bootflag)394*601fbec7SMasahiro Yamada void dm36x_lowlevel_init(ulong bootflag)
395*601fbec7SMasahiro Yamada {
396*601fbec7SMasahiro Yamada struct davinci_uart_ctrl_regs *davinci_uart_ctrl_regs =
397*601fbec7SMasahiro Yamada (struct davinci_uart_ctrl_regs *)(CONFIG_SYS_NS16550_COM1 +
398*601fbec7SMasahiro Yamada DAVINCI_UART_CTRL_BASE);
399*601fbec7SMasahiro Yamada
400*601fbec7SMasahiro Yamada /* Mask all interrupts */
401*601fbec7SMasahiro Yamada writel(DV_AINTC_INTCTL_IDMODE, &dv_aintc_regs->intctl);
402*601fbec7SMasahiro Yamada writel(0x0, &dv_aintc_regs->eabase);
403*601fbec7SMasahiro Yamada writel(0x0, &dv_aintc_regs->eint0);
404*601fbec7SMasahiro Yamada writel(0x0, &dv_aintc_regs->eint1);
405*601fbec7SMasahiro Yamada
406*601fbec7SMasahiro Yamada /* Clear all interrupts */
407*601fbec7SMasahiro Yamada writel(0xffffffff, &dv_aintc_regs->fiq0);
408*601fbec7SMasahiro Yamada writel(0xffffffff, &dv_aintc_regs->fiq1);
409*601fbec7SMasahiro Yamada writel(0xffffffff, &dv_aintc_regs->irq0);
410*601fbec7SMasahiro Yamada writel(0xffffffff, &dv_aintc_regs->irq1);
411*601fbec7SMasahiro Yamada
412*601fbec7SMasahiro Yamada dm365_por_reset();
413*601fbec7SMasahiro Yamada dm365_wdt_reset();
414*601fbec7SMasahiro Yamada
415*601fbec7SMasahiro Yamada /* System PSC setup - enable all */
416*601fbec7SMasahiro Yamada dm365_psc_init();
417*601fbec7SMasahiro Yamada
418*601fbec7SMasahiro Yamada /* Setup Pinmux */
419*601fbec7SMasahiro Yamada dm365_pinmux_ctl(0, 0xFFFFFFFF, CONFIG_SYS_DM36x_PINMUX0);
420*601fbec7SMasahiro Yamada dm365_pinmux_ctl(1, 0xFFFFFFFF, CONFIG_SYS_DM36x_PINMUX1);
421*601fbec7SMasahiro Yamada dm365_pinmux_ctl(2, 0xFFFFFFFF, CONFIG_SYS_DM36x_PINMUX2);
422*601fbec7SMasahiro Yamada dm365_pinmux_ctl(3, 0xFFFFFFFF, CONFIG_SYS_DM36x_PINMUX3);
423*601fbec7SMasahiro Yamada dm365_pinmux_ctl(4, 0xFFFFFFFF, CONFIG_SYS_DM36x_PINMUX4);
424*601fbec7SMasahiro Yamada
425*601fbec7SMasahiro Yamada /* PLL setup */
426*601fbec7SMasahiro Yamada dm365_pll1_init(CONFIG_SYS_DM36x_PLL1_PLLM,
427*601fbec7SMasahiro Yamada CONFIG_SYS_DM36x_PLL1_PREDIV);
428*601fbec7SMasahiro Yamada dm365_pll2_init(CONFIG_SYS_DM36x_PLL2_PLLM,
429*601fbec7SMasahiro Yamada CONFIG_SYS_DM36x_PLL2_PREDIV);
430*601fbec7SMasahiro Yamada
431*601fbec7SMasahiro Yamada /* GPIO setup */
432*601fbec7SMasahiro Yamada board_gpio_init();
433*601fbec7SMasahiro Yamada
434*601fbec7SMasahiro Yamada NS16550_init((NS16550_t)(CONFIG_SYS_NS16550_COM1),
435*601fbec7SMasahiro Yamada CONFIG_SYS_NS16550_CLK / 16 / CONFIG_BAUDRATE);
436*601fbec7SMasahiro Yamada
437*601fbec7SMasahiro Yamada /*
438*601fbec7SMasahiro Yamada * Fix Power and Emulation Management Register
439*601fbec7SMasahiro Yamada * see sprufh2.pdf page 38 Table 22
440*601fbec7SMasahiro Yamada */
441*601fbec7SMasahiro Yamada writel((DAVINCI_UART_PWREMU_MGMT_FREE | DAVINCI_UART_PWREMU_MGMT_URRST |
442*601fbec7SMasahiro Yamada DAVINCI_UART_PWREMU_MGMT_UTRST),
443*601fbec7SMasahiro Yamada &davinci_uart_ctrl_regs->pwremu_mgmt);
444*601fbec7SMasahiro Yamada
445*601fbec7SMasahiro Yamada puts("ddr init\n");
446*601fbec7SMasahiro Yamada dm365_ddr_setup();
447*601fbec7SMasahiro Yamada
448*601fbec7SMasahiro Yamada puts("emif init\n");
449*601fbec7SMasahiro Yamada dm365_emif_init();
450*601fbec7SMasahiro Yamada
451*601fbec7SMasahiro Yamada dm365_wdt_flag_on();
452*601fbec7SMasahiro Yamada
453*601fbec7SMasahiro Yamada #if defined(CONFIG_POST)
454*601fbec7SMasahiro Yamada /*
455*601fbec7SMasahiro Yamada * Do memory tests, calls arch_memory_failure_handle()
456*601fbec7SMasahiro Yamada * if error detected.
457*601fbec7SMasahiro Yamada */
458*601fbec7SMasahiro Yamada memory_post_test(0);
459*601fbec7SMasahiro Yamada #endif
460*601fbec7SMasahiro Yamada }
461