18e429b3eSStelian Pop /*
28e429b3eSStelian Pop * (C) Copyright 2007-2008
3c9e798d3SStelian Pop * Stelian Pop <stelian@popies.net>
48e429b3eSStelian Pop * Lead Tech Design <www.leadtechdesign.com>
58e429b3eSStelian Pop *
61a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+
78e429b3eSStelian Pop */
88e429b3eSStelian Pop
98e429b3eSStelian Pop #include <common.h>
10eaa59b34SWenyou Yang #include <debug_uart.h>
111ace4022SAlexey Brodkin #include <linux/sizes.h>
128e429b3eSStelian Pop #include <asm/arch/at91sam9263.h>
138e429b3eSStelian Pop #include <asm/arch/at91sam9_smc.h>
141332a2a0SJean-Christophe PLAGNIOL-VILLARD #include <asm/arch/at91_common.h>
151b34f00cSJens Scharsig #include <asm/arch/at91_matrix.h>
161b34f00cSJens Scharsig #include <asm/arch/at91_pio.h>
17dc39ae95SJean-Christophe PLAGNIOL-VILLARD #include <asm/arch/clk.h>
18cd46b0f2SXu, Hong #include <asm/io.h>
19cd46b0f2SXu, Hong #include <asm/arch/gpio.h>
203ae071e4SBen Warren #include <asm/arch/hardware.h>
2156a2479cSStelian Pop #include <lcd.h>
2256a2479cSStelian Pop #include <atmel_lcdc.h>
23c62db35dSSimon Glass #include <asm/mach-types.h>
248e429b3eSStelian Pop
258e429b3eSStelian Pop DECLARE_GLOBAL_DATA_PTR;
268e429b3eSStelian Pop
278e429b3eSStelian Pop /* ------------------------------------------------------------------------- */
288e429b3eSStelian Pop /*
298e429b3eSStelian Pop * Miscelaneous platform dependent initialisations
308e429b3eSStelian Pop */
318e429b3eSStelian Pop
328e429b3eSStelian Pop #ifdef CONFIG_CMD_NAND
at91sam9263ek_nand_hw_init(void)338e429b3eSStelian Pop static void at91sam9263ek_nand_hw_init(void)
348e429b3eSStelian Pop {
358e429b3eSStelian Pop unsigned long csa;
36cd46b0f2SXu, Hong at91_smc_t *smc = (at91_smc_t *) ATMEL_BASE_SMC0;
37cd46b0f2SXu, Hong at91_matrix_t *matrix = (at91_matrix_t *) ATMEL_BASE_MATRIX;
388e429b3eSStelian Pop
398e429b3eSStelian Pop /* Enable CS3 */
401b34f00cSJens Scharsig csa = readl(&matrix->csa[0]) | AT91_MATRIX_CSA_EBI_CS3A;
411b34f00cSJens Scharsig writel(csa, &matrix->csa[0]);
421b34f00cSJens Scharsig
431b34f00cSJens Scharsig /* Enable CS3 */
448e429b3eSStelian Pop
458e429b3eSStelian Pop /* Configure SMC CS3 for NAND/SmartMedia */
461b34f00cSJens Scharsig writel(AT91_SMC_SETUP_NWE(1) | AT91_SMC_SETUP_NCS_WR(0) |
471b34f00cSJens Scharsig AT91_SMC_SETUP_NRD(1) | AT91_SMC_SETUP_NCS_RD(0),
481b34f00cSJens Scharsig &smc->cs[3].setup);
498e429b3eSStelian Pop
501b34f00cSJens Scharsig writel(AT91_SMC_PULSE_NWE(3) | AT91_SMC_PULSE_NCS_WR(3) |
511b34f00cSJens Scharsig AT91_SMC_PULSE_NRD(3) | AT91_SMC_PULSE_NCS_RD(3),
521b34f00cSJens Scharsig &smc->cs[3].pulse);
531b34f00cSJens Scharsig
541b34f00cSJens Scharsig writel(AT91_SMC_CYCLE_NWE(5) | AT91_SMC_CYCLE_NRD(5),
551b34f00cSJens Scharsig &smc->cs[3].cycle);
561b34f00cSJens Scharsig writel(AT91_SMC_MODE_RM_NRD | AT91_SMC_MODE_WM_NWE |
571b34f00cSJens Scharsig AT91_SMC_MODE_EXNW_DISABLE |
581b34f00cSJens Scharsig #ifdef CONFIG_SYS_NAND_DBW_16
591b34f00cSJens Scharsig AT91_SMC_MODE_DBW_16 |
601b34f00cSJens Scharsig #else /* CONFIG_SYS_NAND_DBW_8 */
611b34f00cSJens Scharsig AT91_SMC_MODE_DBW_8 |
621b34f00cSJens Scharsig #endif
631b34f00cSJens Scharsig AT91_SMC_MODE_TDF_CYCLE(2),
641b34f00cSJens Scharsig &smc->cs[3].mode);
651b34f00cSJens Scharsig
6670341e2eSWenyou Yang at91_periph_clk_enable(ATMEL_ID_PIOA);
6770341e2eSWenyou Yang at91_periph_clk_enable(ATMEL_ID_PIOCDE);
688e429b3eSStelian Pop
698e429b3eSStelian Pop /* Configure RDY/BSY */
70cd46b0f2SXu, Hong at91_set_gpio_input(CONFIG_SYS_NAND_READY_PIN, 1);
718e429b3eSStelian Pop
728e429b3eSStelian Pop /* Enable NandFlash */
73cd46b0f2SXu, Hong at91_set_gpio_output(CONFIG_SYS_NAND_ENABLE_PIN, 1);
748e429b3eSStelian Pop }
758e429b3eSStelian Pop #endif
768e429b3eSStelian Pop
7756a2479cSStelian Pop #ifdef CONFIG_LCD
7856a2479cSStelian Pop vidinfo_t panel_info = {
79c346e466SJeroen Hofstee .vl_col = 240,
80c346e466SJeroen Hofstee .vl_row = 320,
81c346e466SJeroen Hofstee .vl_clk = 4965000,
82c346e466SJeroen Hofstee .vl_sync = ATMEL_LCDC_INVLINE_INVERTED |
8356a2479cSStelian Pop ATMEL_LCDC_INVFRAME_INVERTED,
84c346e466SJeroen Hofstee .vl_bpix = 3,
85c346e466SJeroen Hofstee .vl_tft = 1,
86c346e466SJeroen Hofstee .vl_hsync_len = 5,
87c346e466SJeroen Hofstee .vl_left_margin = 1,
88c346e466SJeroen Hofstee .vl_right_margin = 33,
89c346e466SJeroen Hofstee .vl_vsync_len = 1,
90c346e466SJeroen Hofstee .vl_upper_margin = 1,
91c346e466SJeroen Hofstee .vl_lower_margin = 0,
92c346e466SJeroen Hofstee .mmio = ATMEL_BASE_LCDC,
9356a2479cSStelian Pop };
9456a2479cSStelian Pop
lcd_enable(void)9556a2479cSStelian Pop void lcd_enable(void)
9656a2479cSStelian Pop {
971b34f00cSJens Scharsig at91_set_pio_value(AT91_PIO_PORTA, 30, 1); /* power up */
9856a2479cSStelian Pop }
9956a2479cSStelian Pop
lcd_disable(void)10056a2479cSStelian Pop void lcd_disable(void)
10156a2479cSStelian Pop {
1021b34f00cSJens Scharsig at91_set_pio_value(AT91_PIO_PORTA, 30, 0); /* power down */
10356a2479cSStelian Pop }
10456a2479cSStelian Pop
at91sam9263ek_lcd_hw_init(void)10556a2479cSStelian Pop static void at91sam9263ek_lcd_hw_init(void)
10656a2479cSStelian Pop {
1071b34f00cSJens Scharsig at91_set_a_periph(AT91_PIO_PORTC, 1, 0); /* LCDHSYNC */
1081b34f00cSJens Scharsig at91_set_a_periph(AT91_PIO_PORTC, 2, 0); /* LCDDOTCK */
1091b34f00cSJens Scharsig at91_set_a_periph(AT91_PIO_PORTC, 3, 0); /* LCDDEN */
1101b34f00cSJens Scharsig at91_set_b_periph(AT91_PIO_PORTB, 9, 0); /* LCDCC */
1111b34f00cSJens Scharsig at91_set_a_periph(AT91_PIO_PORTC, 6, 0); /* LCDD2 */
1121b34f00cSJens Scharsig at91_set_a_periph(AT91_PIO_PORTC, 7, 0); /* LCDD3 */
1131b34f00cSJens Scharsig at91_set_a_periph(AT91_PIO_PORTC, 8, 0); /* LCDD4 */
1141b34f00cSJens Scharsig at91_set_a_periph(AT91_PIO_PORTC, 9, 0); /* LCDD5 */
1151b34f00cSJens Scharsig at91_set_a_periph(AT91_PIO_PORTC, 10, 0); /* LCDD6 */
1161b34f00cSJens Scharsig at91_set_a_periph(AT91_PIO_PORTC, 11, 0); /* LCDD7 */
1171b34f00cSJens Scharsig at91_set_a_periph(AT91_PIO_PORTC, 14, 0); /* LCDD10 */
1181b34f00cSJens Scharsig at91_set_a_periph(AT91_PIO_PORTC, 15, 0); /* LCDD11 */
1191b34f00cSJens Scharsig at91_set_a_periph(AT91_PIO_PORTC, 16, 0); /* LCDD12 */
1201b34f00cSJens Scharsig at91_set_b_periph(AT91_PIO_PORTC, 12, 0); /* LCDD13 */
1211b34f00cSJens Scharsig at91_set_a_periph(AT91_PIO_PORTC, 18, 0); /* LCDD14 */
1221b34f00cSJens Scharsig at91_set_a_periph(AT91_PIO_PORTC, 19, 0); /* LCDD15 */
1231b34f00cSJens Scharsig at91_set_a_periph(AT91_PIO_PORTC, 22, 0); /* LCDD18 */
1241b34f00cSJens Scharsig at91_set_a_periph(AT91_PIO_PORTC, 23, 0); /* LCDD19 */
1251b34f00cSJens Scharsig at91_set_a_periph(AT91_PIO_PORTC, 24, 0); /* LCDD20 */
1261b34f00cSJens Scharsig at91_set_b_periph(AT91_PIO_PORTC, 17, 0); /* LCDD21 */
1271b34f00cSJens Scharsig at91_set_a_periph(AT91_PIO_PORTC, 26, 0); /* LCDD22 */
1281b34f00cSJens Scharsig at91_set_a_periph(AT91_PIO_PORTC, 27, 0); /* LCDD23 */
12956a2479cSStelian Pop
13070341e2eSWenyou Yang at91_periph_clk_enable(ATMEL_ID_LCDC);
131cd46b0f2SXu, Hong gd->fb_base = ATMEL_BASE_SRAM0;
13256a2479cSStelian Pop }
1336b59e03eSHaavard Skinnemoen
1346b59e03eSHaavard Skinnemoen #ifdef CONFIG_LCD_INFO
1356b59e03eSHaavard Skinnemoen #include <nand.h>
1366b59e03eSHaavard Skinnemoen #include <version.h>
1376b59e03eSHaavard Skinnemoen
138e856bdcfSMasahiro Yamada #ifdef CONFIG_MTD_NOR_FLASH
1391b3b7c64SJean-Christophe PLAGNIOL-VILLARD extern flash_info_t flash_info[];
1401b3b7c64SJean-Christophe PLAGNIOL-VILLARD #endif
1411b3b7c64SJean-Christophe PLAGNIOL-VILLARD
lcd_show_board_info(void)1426b59e03eSHaavard Skinnemoen void lcd_show_board_info(void)
1436b59e03eSHaavard Skinnemoen {
1446b59e03eSHaavard Skinnemoen ulong dram_size, nand_size;
145e856bdcfSMasahiro Yamada #ifdef CONFIG_MTD_NOR_FLASH
1461b3b7c64SJean-Christophe PLAGNIOL-VILLARD ulong flash_size;
1471b3b7c64SJean-Christophe PLAGNIOL-VILLARD #endif
1486b59e03eSHaavard Skinnemoen int i;
1496b59e03eSHaavard Skinnemoen char temp[32];
1506b59e03eSHaavard Skinnemoen
1516b59e03eSHaavard Skinnemoen lcd_printf ("%s\n", U_BOOT_VERSION);
1526b59e03eSHaavard Skinnemoen lcd_printf ("(C) 2008 ATMEL Corp\n");
1536b59e03eSHaavard Skinnemoen lcd_printf ("at91support@atmel.com\n");
1546b59e03eSHaavard Skinnemoen lcd_printf ("%s CPU at %s MHz\n",
155cd46b0f2SXu, Hong ATMEL_CPU_NAME,
156dc39ae95SJean-Christophe PLAGNIOL-VILLARD strmhz(temp, get_cpu_clk_rate()));
1576b59e03eSHaavard Skinnemoen
1586b59e03eSHaavard Skinnemoen dram_size = 0;
1596b59e03eSHaavard Skinnemoen for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++)
1606b59e03eSHaavard Skinnemoen dram_size += gd->bd->bi_dram[i].size;
1616b59e03eSHaavard Skinnemoen nand_size = 0;
1626b59e03eSHaavard Skinnemoen for (i = 0; i < CONFIG_SYS_MAX_NAND_DEVICE; i++)
163*31f8d39eSGrygorii Strashko nand_size += get_nand_dev_by_index(i)->size;
164e856bdcfSMasahiro Yamada #ifdef CONFIG_MTD_NOR_FLASH
1651b3b7c64SJean-Christophe PLAGNIOL-VILLARD flash_size = 0;
1661b3b7c64SJean-Christophe PLAGNIOL-VILLARD for (i = 0; i < CONFIG_SYS_MAX_FLASH_BANKS; i++)
1671b3b7c64SJean-Christophe PLAGNIOL-VILLARD flash_size += flash_info[i].size;
1681b3b7c64SJean-Christophe PLAGNIOL-VILLARD #endif
1691b3b7c64SJean-Christophe PLAGNIOL-VILLARD lcd_printf (" %ld MB SDRAM, %ld MB NAND",
1706b59e03eSHaavard Skinnemoen dram_size >> 20,
1716b59e03eSHaavard Skinnemoen nand_size >> 20 );
172e856bdcfSMasahiro Yamada #ifdef CONFIG_MTD_NOR_FLASH
1731b3b7c64SJean-Christophe PLAGNIOL-VILLARD lcd_printf (",\n %ld MB NOR",
1741b3b7c64SJean-Christophe PLAGNIOL-VILLARD flash_size >> 20);
1751b3b7c64SJean-Christophe PLAGNIOL-VILLARD #endif
1761b3b7c64SJean-Christophe PLAGNIOL-VILLARD lcd_puts ("\n");
1776b59e03eSHaavard Skinnemoen }
1786b59e03eSHaavard Skinnemoen #endif /* CONFIG_LCD_INFO */
17956a2479cSStelian Pop #endif
18056a2479cSStelian Pop
181eaa59b34SWenyou Yang #ifdef CONFIG_DEBUG_UART_BOARD_INIT
board_debug_uart_init(void)182eaa59b34SWenyou Yang void board_debug_uart_init(void)
183eaa59b34SWenyou Yang {
184eaa59b34SWenyou Yang at91_seriald_hw_init();
185eaa59b34SWenyou Yang }
186eaa59b34SWenyou Yang #endif
187eaa59b34SWenyou Yang
188eaa59b34SWenyou Yang #ifdef CONFIG_BOARD_EARLY_INIT_F
board_early_init_f(void)189cd46b0f2SXu, Hong int board_early_init_f(void)
190cd46b0f2SXu, Hong {
191eaa59b34SWenyou Yang #ifdef CONFIG_DEBUG_UART
192eaa59b34SWenyou Yang debug_uart_init();
193eaa59b34SWenyou Yang #endif
194cd46b0f2SXu, Hong return 0;
195cd46b0f2SXu, Hong }
196eaa59b34SWenyou Yang #endif
197cd46b0f2SXu, Hong
board_init(void)1988e429b3eSStelian Pop int board_init(void)
1998e429b3eSStelian Pop {
2008e429b3eSStelian Pop /* arch number of AT91SAM9263EK-Board */
2018e429b3eSStelian Pop gd->bd->bi_arch_number = MACH_TYPE_AT91SAM9263EK;
2028e429b3eSStelian Pop /* adress of boot parameters */
203cd46b0f2SXu, Hong gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100;
2048e429b3eSStelian Pop
2058e429b3eSStelian Pop #ifdef CONFIG_CMD_NAND
2068e429b3eSStelian Pop at91sam9263ek_nand_hw_init();
2078e429b3eSStelian Pop #endif
2088e429b3eSStelian Pop #ifdef CONFIG_USB_OHCI_NEW
209f3f91f88SJean-Christophe PLAGNIOL-VILLARD at91_uhp_hw_init();
2108e429b3eSStelian Pop #endif
21156a2479cSStelian Pop #ifdef CONFIG_LCD
21256a2479cSStelian Pop at91sam9263ek_lcd_hw_init();
21356a2479cSStelian Pop #endif
2148e429b3eSStelian Pop return 0;
2158e429b3eSStelian Pop }
2168e429b3eSStelian Pop
dram_init(void)2178e429b3eSStelian Pop int dram_init(void)
2188e429b3eSStelian Pop {
219cd46b0f2SXu, Hong gd->ram_size = get_ram_size((void *)CONFIG_SYS_SDRAM_BASE,
220cd46b0f2SXu, Hong CONFIG_SYS_SDRAM_SIZE);
221cd46b0f2SXu, Hong
2228e429b3eSStelian Pop return 0;
2238e429b3eSStelian Pop }
2248e429b3eSStelian Pop
2258e429b3eSStelian Pop #ifdef CONFIG_RESET_PHY_R
reset_phy(void)2268e429b3eSStelian Pop void reset_phy(void)
2278e429b3eSStelian Pop {
2288e429b3eSStelian Pop }
2298e429b3eSStelian Pop #endif
230