19d79e575SWolfgang Wegner /*
29d79e575SWolfgang Wegner * (C) Copyright 2000-2003
39d79e575SWolfgang Wegner * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
49d79e575SWolfgang Wegner * modified by Wolfgang Wegner <w.wegner@astro-kom.de> for ASTRO 5373l
59d79e575SWolfgang Wegner *
61a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+
79d79e575SWolfgang Wegner */
89d79e575SWolfgang Wegner
99d79e575SWolfgang Wegner #include <common.h>
109d79e575SWolfgang Wegner #include <watchdog.h>
119d79e575SWolfgang Wegner #include <command.h>
129d79e575SWolfgang Wegner #include <asm/m5329.h>
139d79e575SWolfgang Wegner #include <asm/immap_5329.h>
149d79e575SWolfgang Wegner #include <asm/io.h>
159d79e575SWolfgang Wegner
169d79e575SWolfgang Wegner /* needed for astro bus: */
179d79e575SWolfgang Wegner #include <asm/uart.h>
189d79e575SWolfgang Wegner #include "astro.h"
199d79e575SWolfgang Wegner
209d79e575SWolfgang Wegner DECLARE_GLOBAL_DATA_PTR;
219d79e575SWolfgang Wegner extern void uart_port_conf(void);
229d79e575SWolfgang Wegner
checkboard(void)239d79e575SWolfgang Wegner int checkboard(void)
249d79e575SWolfgang Wegner {
259d79e575SWolfgang Wegner puts("Board: ");
269d79e575SWolfgang Wegner puts("ASTRO MCF5373L (Urmel) Board\n");
279d79e575SWolfgang Wegner return 0;
289d79e575SWolfgang Wegner }
299d79e575SWolfgang Wegner
dram_init(void)30*f1683aa7SSimon Glass int dram_init(void)
319d79e575SWolfgang Wegner {
329d79e575SWolfgang Wegner #if !defined(CONFIG_MONITOR_IS_IN_RAM)
339d79e575SWolfgang Wegner sdram_t *sdp = (sdram_t *)(MMAP_SDRAM);
349d79e575SWolfgang Wegner
359d79e575SWolfgang Wegner /*
369d79e575SWolfgang Wegner * GPIO configuration for bus should be set correctly from reset,
379d79e575SWolfgang Wegner * so we do not care! First, set up address space: at this point,
389d79e575SWolfgang Wegner * we should be running from internal SRAM;
399d79e575SWolfgang Wegner * so use CONFIG_SYS_SDRAM_BASE as the base address for SDRAM,
409d79e575SWolfgang Wegner * and do not care where it is
419d79e575SWolfgang Wegner */
429d79e575SWolfgang Wegner __raw_writel((CONFIG_SYS_SDRAM_BASE & 0xFFF00000) | 0x00000018,
439d79e575SWolfgang Wegner &sdp->cs0);
449d79e575SWolfgang Wegner __raw_writel((CONFIG_SYS_SDRAM_BASE & 0xFFF00000) | 0x00000000,
459d79e575SWolfgang Wegner &sdp->cs1);
469d79e575SWolfgang Wegner /*
479d79e575SWolfgang Wegner * I am not sure from the data sheet, but it seems burst length
489d79e575SWolfgang Wegner * has to be 8 for the 16 bit data bus we use;
499d79e575SWolfgang Wegner * so these values are for BL = 8
509d79e575SWolfgang Wegner */
519d79e575SWolfgang Wegner __raw_writel(0x33211530, &sdp->cfg1);
529d79e575SWolfgang Wegner __raw_writel(0x56570000, &sdp->cfg2);
539d79e575SWolfgang Wegner /* send PrechargeALL, REF and IREF remain cleared! */
549d79e575SWolfgang Wegner __raw_writel(0xE1462C02, &sdp->ctrl);
559d79e575SWolfgang Wegner udelay(1);
569d79e575SWolfgang Wegner /* refresh SDRAM twice */
579d79e575SWolfgang Wegner __raw_writel(0xE1462C04, &sdp->ctrl);
589d79e575SWolfgang Wegner udelay(1);
599d79e575SWolfgang Wegner __raw_writel(0xE1462C04, &sdp->ctrl);
609d79e575SWolfgang Wegner /* init MR */
619d79e575SWolfgang Wegner __raw_writel(0x008D0000, &sdp->mode);
629d79e575SWolfgang Wegner /* initialize EMR */
639d79e575SWolfgang Wegner __raw_writel(0x80010000, &sdp->mode);
649d79e575SWolfgang Wegner /* wait until DLL is locked */
659d79e575SWolfgang Wegner udelay(1);
669d79e575SWolfgang Wegner /*
679d79e575SWolfgang Wegner * enable automatic refresh, lock mode register,
689d79e575SWolfgang Wegner * clear iref and ipall
699d79e575SWolfgang Wegner */
709d79e575SWolfgang Wegner __raw_writel(0x71462C00, &sdp->ctrl);
719d79e575SWolfgang Wegner /* Dummy write to start SDRAM */
729d79e575SWolfgang Wegner writel(0, CONFIG_SYS_SDRAM_BASE);
739d79e575SWolfgang Wegner #endif
749d79e575SWolfgang Wegner
759d79e575SWolfgang Wegner /*
769d79e575SWolfgang Wegner * for get_ram_size() to work, both CS areas have to be
779d79e575SWolfgang Wegner * configured, i.e. CS1 has to be explicitely disabled, else
789d79e575SWolfgang Wegner * probing for memory will cause the SDRAM bus to hang!
799d79e575SWolfgang Wegner * (Do not rely on the SDCS register(s) being set to 0x00000000
809d79e575SWolfgang Wegner * during reset as stated in the data sheet.)
819d79e575SWolfgang Wegner */
82088454cdSSimon Glass gd->ram_size = get_ram_size((long *)CONFIG_SYS_SDRAM_BASE,
839d79e575SWolfgang Wegner 0x80000000 - CONFIG_SYS_SDRAM_BASE);
84088454cdSSimon Glass
85088454cdSSimon Glass return 0;
869d79e575SWolfgang Wegner }
879d79e575SWolfgang Wegner
889d79e575SWolfgang Wegner #define UART_BASE MMAP_UART0
rs_serial_init(int port,int baud)899d79e575SWolfgang Wegner int rs_serial_init(int port, int baud)
909d79e575SWolfgang Wegner {
919d79e575SWolfgang Wegner uart_t *uart;
929d79e575SWolfgang Wegner u32 counter;
939d79e575SWolfgang Wegner
949d79e575SWolfgang Wegner switch (port) {
959d79e575SWolfgang Wegner case 0:
969d79e575SWolfgang Wegner uart = (uart_t *)(MMAP_UART0);
979d79e575SWolfgang Wegner break;
989d79e575SWolfgang Wegner case 1:
999d79e575SWolfgang Wegner uart = (uart_t *)(MMAP_UART1);
1009d79e575SWolfgang Wegner break;
1019d79e575SWolfgang Wegner case 2:
1029d79e575SWolfgang Wegner uart = (uart_t *)(MMAP_UART2);
1039d79e575SWolfgang Wegner break;
1049d79e575SWolfgang Wegner default:
1059d79e575SWolfgang Wegner uart = (uart_t *)(MMAP_UART0);
1069d79e575SWolfgang Wegner }
1079d79e575SWolfgang Wegner
1089d79e575SWolfgang Wegner uart_port_conf();
1099d79e575SWolfgang Wegner
1109d79e575SWolfgang Wegner /* write to SICR: SIM2 = uart mode,dcd does not affect rx */
1119d79e575SWolfgang Wegner writeb(UART_UCR_RESET_RX, &uart->ucr);
1129d79e575SWolfgang Wegner writeb(UART_UCR_RESET_TX, &uart->ucr);
1139d79e575SWolfgang Wegner writeb(UART_UCR_RESET_ERROR, &uart->ucr);
1149d79e575SWolfgang Wegner writeb(UART_UCR_RESET_MR, &uart->ucr);
1159d79e575SWolfgang Wegner __asm__ ("nop");
1169d79e575SWolfgang Wegner
1179d79e575SWolfgang Wegner writeb(0, &uart->uimr);
1189d79e575SWolfgang Wegner
1199d79e575SWolfgang Wegner /* write to CSR: RX/TX baud rate from timers */
1209d79e575SWolfgang Wegner writeb(UART_UCSR_RCS_SYS_CLK | UART_UCSR_TCS_SYS_CLK, &uart->ucsr);
1219d79e575SWolfgang Wegner
1229d79e575SWolfgang Wegner writeb(UART_UMR_BC_8 | UART_UMR_PM_NONE, &uart->umr);
1239d79e575SWolfgang Wegner writeb(UART_UMR_SB_STOP_BITS_1, &uart->umr);
1249d79e575SWolfgang Wegner
1259d79e575SWolfgang Wegner /* Setting up BaudRate */
1269d79e575SWolfgang Wegner counter = (u32) (gd->bus_clk / (baud));
1279d79e575SWolfgang Wegner counter >>= 5;
1289d79e575SWolfgang Wegner
1299d79e575SWolfgang Wegner /* write to CTUR: divide counter upper byte */
1309d79e575SWolfgang Wegner writeb((u8) ((counter & 0xff00) >> 8), &uart->ubg1);
1319d79e575SWolfgang Wegner /* write to CTLR: divide counter lower byte */
1329d79e575SWolfgang Wegner writeb((u8) (counter & 0x00ff), &uart->ubg2);
1339d79e575SWolfgang Wegner
1349d79e575SWolfgang Wegner writeb(UART_UCR_RX_ENABLED | UART_UCR_TX_ENABLED, &uart->ucr);
1359d79e575SWolfgang Wegner
1369d79e575SWolfgang Wegner return 0;
1379d79e575SWolfgang Wegner }
1389d79e575SWolfgang Wegner
astro_put_char(char ch)1399d79e575SWolfgang Wegner void astro_put_char(char ch)
1409d79e575SWolfgang Wegner {
1419d79e575SWolfgang Wegner uart_t *uart;
1429d79e575SWolfgang Wegner unsigned long timer;
1439d79e575SWolfgang Wegner
1449d79e575SWolfgang Wegner uart = (uart_t *)(MMAP_UART0);
1459d79e575SWolfgang Wegner /*
1469d79e575SWolfgang Wegner * Wait for last character to go. Timeout of 6ms should
1479d79e575SWolfgang Wegner * be enough for our lowest baud rate of 2400.
1489d79e575SWolfgang Wegner */
1499d79e575SWolfgang Wegner timer = get_timer(0);
1509d79e575SWolfgang Wegner while (get_timer(timer) < 6) {
1519d79e575SWolfgang Wegner if (readb(&uart->usr) & UART_USR_TXRDY)
1529d79e575SWolfgang Wegner break;
1539d79e575SWolfgang Wegner }
1549d79e575SWolfgang Wegner writeb(ch, &uart->utb);
1559d79e575SWolfgang Wegner
1569d79e575SWolfgang Wegner return;
1579d79e575SWolfgang Wegner }
1589d79e575SWolfgang Wegner
astro_is_char(void)1599d79e575SWolfgang Wegner int astro_is_char(void)
1609d79e575SWolfgang Wegner {
1619d79e575SWolfgang Wegner uart_t *uart;
1629d79e575SWolfgang Wegner
1639d79e575SWolfgang Wegner uart = (uart_t *)(MMAP_UART0);
1649d79e575SWolfgang Wegner return readb(&uart->usr) & UART_USR_RXRDY;
1659d79e575SWolfgang Wegner }
1669d79e575SWolfgang Wegner
astro_get_char(void)1679d79e575SWolfgang Wegner int astro_get_char(void)
1689d79e575SWolfgang Wegner {
1699d79e575SWolfgang Wegner uart_t *uart;
1709d79e575SWolfgang Wegner
1719d79e575SWolfgang Wegner uart = (uart_t *)(MMAP_UART0);
1729d79e575SWolfgang Wegner while (!(readb(&uart->usr) & UART_USR_RXRDY)) ;
1739d79e575SWolfgang Wegner return readb(&uart->urb);
1749d79e575SWolfgang Wegner }
1759d79e575SWolfgang Wegner
misc_init_r(void)1769d79e575SWolfgang Wegner int misc_init_r(void)
1779d79e575SWolfgang Wegner {
1789d79e575SWolfgang Wegner int retval = 0;
1799d79e575SWolfgang Wegner
1809d79e575SWolfgang Wegner puts("Configure Xilinx FPGA...");
1819d79e575SWolfgang Wegner retval = astro5373l_xilinx_load();
1829d79e575SWolfgang Wegner if (!retval) {
1839d79e575SWolfgang Wegner puts("failed!\n");
1849d79e575SWolfgang Wegner return retval;
1859d79e575SWolfgang Wegner }
1869d79e575SWolfgang Wegner puts("done\n");
1879d79e575SWolfgang Wegner
1889d79e575SWolfgang Wegner puts("Configure Altera FPGA...");
1899d79e575SWolfgang Wegner retval = astro5373l_altera_load();
1909d79e575SWolfgang Wegner if (!retval) {
1919d79e575SWolfgang Wegner puts("failed!\n");
1929d79e575SWolfgang Wegner return retval;
1939d79e575SWolfgang Wegner }
1949d79e575SWolfgang Wegner puts("done\n");
1959d79e575SWolfgang Wegner
1969d79e575SWolfgang Wegner return retval;
1979d79e575SWolfgang Wegner }
198