12118ebb4SStelian Pop /*
22118ebb4SStelian Pop * (C) Copyright 2007-2008
3c9e798d3SStelian Pop * Stelian Pop <stelian@popies.net>
42118ebb4SStelian Pop * Lead Tech Design <www.leadtechdesign.com>
52118ebb4SStelian Pop *
61a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+
72118ebb4SStelian Pop */
82118ebb4SStelian Pop
92118ebb4SStelian Pop #include <common.h>
1084a9b80dSWenyou Yang #include <debug_uart.h>
1121d671d0SXu, Hong #include <asm/io.h>
12c62db35dSSimon Glass #include <asm/mach-types.h>
132118ebb4SStelian Pop #include <asm/arch/at91sam9rl.h>
142118ebb4SStelian Pop #include <asm/arch/at91sam9rl_matrix.h>
152118ebb4SStelian Pop #include <asm/arch/at91sam9_smc.h>
161332a2a0SJean-Christophe PLAGNIOL-VILLARD #include <asm/arch/at91_common.h>
172118ebb4SStelian Pop #include <asm/arch/at91_rstc.h>
18dc39ae95SJean-Christophe PLAGNIOL-VILLARD #include <asm/arch/clk.h>
192118ebb4SStelian Pop #include <asm/arch/gpio.h>
2021d671d0SXu, Hong
21761c70b8SStelian Pop #include <lcd.h>
22761c70b8SStelian Pop #include <atmel_lcdc.h>
232118ebb4SStelian Pop
242118ebb4SStelian Pop DECLARE_GLOBAL_DATA_PTR;
252118ebb4SStelian Pop
262118ebb4SStelian Pop /* ------------------------------------------------------------------------- */
272118ebb4SStelian Pop /*
282118ebb4SStelian Pop * Miscelaneous platform dependent initialisations
292118ebb4SStelian Pop */
302118ebb4SStelian Pop
312118ebb4SStelian Pop #ifdef CONFIG_CMD_NAND
at91sam9rlek_nand_hw_init(void)322118ebb4SStelian Pop static void at91sam9rlek_nand_hw_init(void)
332118ebb4SStelian Pop {
3421d671d0SXu, Hong struct at91_smc *smc = (struct at91_smc *)ATMEL_BASE_SMC;
3521d671d0SXu, Hong struct at91_matrix *matrix = (struct at91_matrix *)ATMEL_BASE_MATRIX;
362118ebb4SStelian Pop unsigned long csa;
372118ebb4SStelian Pop
382118ebb4SStelian Pop /* Enable CS3 */
3921d671d0SXu, Hong csa = readl(&matrix->ebicsa);
4021d671d0SXu, Hong csa |= AT91_MATRIX_CS3A_SMC_SMARTMEDIA;
4121d671d0SXu, Hong
4221d671d0SXu, Hong writel(csa, &matrix->ebicsa);
432118ebb4SStelian Pop
442118ebb4SStelian Pop /* Configure SMC CS3 for NAND/SmartMedia */
4521d671d0SXu, Hong writel(AT91_SMC_SETUP_NWE(1) | AT91_SMC_SETUP_NCS_WR(0) |
4621d671d0SXu, Hong AT91_SMC_SETUP_NRD(1) | AT91_SMC_SETUP_NCS_RD(0),
4721d671d0SXu, Hong &smc->cs[3].setup);
4821d671d0SXu, Hong writel(AT91_SMC_PULSE_NWE(3) | AT91_SMC_PULSE_NCS_WR(3) |
4921d671d0SXu, Hong AT91_SMC_PULSE_NRD(3) | AT91_SMC_PULSE_NCS_RD(3),
5021d671d0SXu, Hong &smc->cs[3].pulse);
5121d671d0SXu, Hong writel(AT91_SMC_CYCLE_NWE(5) | AT91_SMC_CYCLE_NRD(5),
5221d671d0SXu, Hong &smc->cs[3].cycle);
5321d671d0SXu, Hong writel(AT91_SMC_MODE_RM_NRD | AT91_SMC_MODE_WM_NWE |
5421d671d0SXu, Hong AT91_SMC_MODE_EXNW_DISABLE |
556d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_SYS_NAND_DBW_16
5621d671d0SXu, Hong AT91_SMC_MODE_DBW_16 |
576d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #else /* CONFIG_SYS_NAND_DBW_8 */
5821d671d0SXu, Hong AT91_SMC_MODE_DBW_8 |
592118ebb4SStelian Pop #endif
6021d671d0SXu, Hong AT91_SMC_MODE_TDF_CYCLE(2),
6121d671d0SXu, Hong &smc->cs[3].mode);
622118ebb4SStelian Pop
6370341e2eSWenyou Yang at91_periph_clk_enable(ATMEL_ID_PIOD);
642118ebb4SStelian Pop
652118ebb4SStelian Pop /* Configure RDY/BSY */
6674c076d6SJean-Christophe PLAGNIOL-VILLARD at91_set_gpio_input(CONFIG_SYS_NAND_READY_PIN, 1);
672118ebb4SStelian Pop
682118ebb4SStelian Pop /* Enable NandFlash */
6974c076d6SJean-Christophe PLAGNIOL-VILLARD at91_set_gpio_output(CONFIG_SYS_NAND_ENABLE_PIN, 1);
702118ebb4SStelian Pop
712118ebb4SStelian Pop at91_set_A_periph(AT91_PIN_PB4, 0); /* NANDOE */
722118ebb4SStelian Pop at91_set_A_periph(AT91_PIN_PB5, 0); /* NANDWE */
732118ebb4SStelian Pop }
742118ebb4SStelian Pop #endif
752118ebb4SStelian Pop
76761c70b8SStelian Pop #ifdef CONFIG_LCD
77761c70b8SStelian Pop vidinfo_t panel_info = {
78c346e466SJeroen Hofstee .vl_col = 240,
79c346e466SJeroen Hofstee .vl_row = 320,
80c346e466SJeroen Hofstee .vl_clk = 4965000,
81c346e466SJeroen Hofstee .vl_sync = ATMEL_LCDC_INVLINE_INVERTED |
82761c70b8SStelian Pop ATMEL_LCDC_INVFRAME_INVERTED,
83c346e466SJeroen Hofstee .vl_bpix = 3,
84c346e466SJeroen Hofstee .vl_tft = 1,
85c346e466SJeroen Hofstee .vl_hsync_len = 5,
86c346e466SJeroen Hofstee .vl_left_margin = 1,
87c346e466SJeroen Hofstee .vl_right_margin = 33,
88c346e466SJeroen Hofstee .vl_vsync_len = 1,
89c346e466SJeroen Hofstee .vl_upper_margin = 1,
90c346e466SJeroen Hofstee .vl_lower_margin = 0,
91c346e466SJeroen Hofstee .mmio = ATMEL_BASE_LCDC,
92761c70b8SStelian Pop };
93761c70b8SStelian Pop
lcd_enable(void)94761c70b8SStelian Pop void lcd_enable(void)
95761c70b8SStelian Pop {
96761c70b8SStelian Pop at91_set_gpio_value(AT91_PIN_PA30, 0); /* power up */
97761c70b8SStelian Pop }
98761c70b8SStelian Pop
lcd_disable(void)99761c70b8SStelian Pop void lcd_disable(void)
100761c70b8SStelian Pop {
101761c70b8SStelian Pop at91_set_gpio_value(AT91_PIN_PA30, 1); /* power down */
102761c70b8SStelian Pop }
at91sam9rlek_lcd_hw_init(void)103761c70b8SStelian Pop static void at91sam9rlek_lcd_hw_init(void)
104761c70b8SStelian Pop {
105761c70b8SStelian Pop at91_set_B_periph(AT91_PIN_PC1, 0); /* LCDPWR */
106761c70b8SStelian Pop at91_set_A_periph(AT91_PIN_PC5, 0); /* LCDHSYNC */
107761c70b8SStelian Pop at91_set_A_periph(AT91_PIN_PC6, 0); /* LCDDOTCK */
108761c70b8SStelian Pop at91_set_A_periph(AT91_PIN_PC7, 0); /* LCDDEN */
109761c70b8SStelian Pop at91_set_A_periph(AT91_PIN_PC3, 0); /* LCDCC */
110761c70b8SStelian Pop at91_set_B_periph(AT91_PIN_PC9, 0); /* LCDD3 */
111761c70b8SStelian Pop at91_set_B_periph(AT91_PIN_PC10, 0); /* LCDD4 */
112761c70b8SStelian Pop at91_set_B_periph(AT91_PIN_PC11, 0); /* LCDD5 */
113761c70b8SStelian Pop at91_set_B_periph(AT91_PIN_PC12, 0); /* LCDD6 */
114761c70b8SStelian Pop at91_set_B_periph(AT91_PIN_PC13, 0); /* LCDD7 */
115761c70b8SStelian Pop at91_set_B_periph(AT91_PIN_PC15, 0); /* LCDD11 */
116761c70b8SStelian Pop at91_set_B_periph(AT91_PIN_PC16, 0); /* LCDD12 */
117761c70b8SStelian Pop at91_set_B_periph(AT91_PIN_PC17, 0); /* LCDD13 */
118761c70b8SStelian Pop at91_set_B_periph(AT91_PIN_PC18, 0); /* LCDD14 */
119761c70b8SStelian Pop at91_set_B_periph(AT91_PIN_PC19, 0); /* LCDD15 */
120761c70b8SStelian Pop at91_set_B_periph(AT91_PIN_PC20, 0); /* LCDD18 */
121761c70b8SStelian Pop at91_set_B_periph(AT91_PIN_PC21, 0); /* LCDD19 */
122761c70b8SStelian Pop at91_set_B_periph(AT91_PIN_PC22, 0); /* LCDD20 */
123761c70b8SStelian Pop at91_set_B_periph(AT91_PIN_PC23, 0); /* LCDD21 */
124761c70b8SStelian Pop at91_set_B_periph(AT91_PIN_PC24, 0); /* LCDD22 */
125761c70b8SStelian Pop at91_set_B_periph(AT91_PIN_PC25, 0); /* LCDD23 */
126761c70b8SStelian Pop
12770341e2eSWenyou Yang at91_periph_clk_enable(ATMEL_ID_LCDC);
128761c70b8SStelian Pop }
1296b59e03eSHaavard Skinnemoen
1306b59e03eSHaavard Skinnemoen #ifdef CONFIG_LCD_INFO
1316b59e03eSHaavard Skinnemoen #include <nand.h>
1326b59e03eSHaavard Skinnemoen #include <version.h>
1336b59e03eSHaavard Skinnemoen
lcd_show_board_info(void)1346b59e03eSHaavard Skinnemoen void lcd_show_board_info(void)
1356b59e03eSHaavard Skinnemoen {
1366b59e03eSHaavard Skinnemoen ulong dram_size, nand_size;
1376b59e03eSHaavard Skinnemoen int i;
1386b59e03eSHaavard Skinnemoen char temp[32];
1396b59e03eSHaavard Skinnemoen
1406b59e03eSHaavard Skinnemoen lcd_printf ("%s\n", U_BOOT_VERSION);
1416b59e03eSHaavard Skinnemoen lcd_printf ("(C) 2008 ATMEL Corp\n");
1426b59e03eSHaavard Skinnemoen lcd_printf ("at91support@atmel.com\n");
1436b59e03eSHaavard Skinnemoen lcd_printf ("%s CPU at %s MHz\n",
14421d671d0SXu, Hong ATMEL_CPU_NAME,
145dc39ae95SJean-Christophe PLAGNIOL-VILLARD strmhz(temp, get_cpu_clk_rate()));
1466b59e03eSHaavard Skinnemoen
1476b59e03eSHaavard Skinnemoen dram_size = 0;
1486b59e03eSHaavard Skinnemoen for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++)
1496b59e03eSHaavard Skinnemoen dram_size += gd->bd->bi_dram[i].size;
1506b59e03eSHaavard Skinnemoen nand_size = 0;
1516b59e03eSHaavard Skinnemoen for (i = 0; i < CONFIG_SYS_MAX_NAND_DEVICE; i++)
152*31f8d39eSGrygorii Strashko nand_size += get_nand_dev_by_index(i)->size;
1536b59e03eSHaavard Skinnemoen lcd_printf (" %ld MB SDRAM, %ld MB NAND\n",
1546b59e03eSHaavard Skinnemoen dram_size >> 20,
1556b59e03eSHaavard Skinnemoen nand_size >> 20 );
1566b59e03eSHaavard Skinnemoen }
1576b59e03eSHaavard Skinnemoen #endif /* CONFIG_LCD_INFO */
158761c70b8SStelian Pop #endif
159761c70b8SStelian Pop
16084a9b80dSWenyou Yang #ifdef CONFIG_DEBUG_UART_BOARD_INIT
board_debug_uart_init(void)16184a9b80dSWenyou Yang void board_debug_uart_init(void)
16284a9b80dSWenyou Yang {
16384a9b80dSWenyou Yang at91_seriald_hw_init();
16484a9b80dSWenyou Yang }
16584a9b80dSWenyou Yang #endif
16684a9b80dSWenyou Yang
16784a9b80dSWenyou Yang #ifdef CONFIG_BOARD_EARLY_INIT_F
board_early_init_f(void)16821d671d0SXu, Hong int board_early_init_f(void)
16921d671d0SXu, Hong {
17084a9b80dSWenyou Yang #ifdef CONFIG_DEBUG_UART
17184a9b80dSWenyou Yang debug_uart_init();
17284a9b80dSWenyou Yang #endif
17321d671d0SXu, Hong return 0;
17421d671d0SXu, Hong }
17584a9b80dSWenyou Yang #endif
176761c70b8SStelian Pop
board_init(void)1772118ebb4SStelian Pop int board_init(void)
1782118ebb4SStelian Pop {
1792118ebb4SStelian Pop /* arch number of AT91SAM9RLEK-Board */
1802118ebb4SStelian Pop gd->bd->bi_arch_number = MACH_TYPE_AT91SAM9RLEK;
1812118ebb4SStelian Pop /* adress of boot parameters */
18221d671d0SXu, Hong gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100;
1832118ebb4SStelian Pop
1842118ebb4SStelian Pop #ifdef CONFIG_CMD_NAND
1852118ebb4SStelian Pop at91sam9rlek_nand_hw_init();
1862118ebb4SStelian Pop #endif
187761c70b8SStelian Pop #ifdef CONFIG_LCD
188761c70b8SStelian Pop at91sam9rlek_lcd_hw_init();
189761c70b8SStelian Pop #endif
1902118ebb4SStelian Pop return 0;
1912118ebb4SStelian Pop }
1922118ebb4SStelian Pop
dram_init(void)1932118ebb4SStelian Pop int dram_init(void)
1942118ebb4SStelian Pop {
19521d671d0SXu, Hong gd->ram_size = get_ram_size(
19621d671d0SXu, Hong (void *)CONFIG_SYS_SDRAM_BASE,
19721d671d0SXu, Hong CONFIG_SYS_SDRAM_SIZE);
1982118ebb4SStelian Pop return 0;
1992118ebb4SStelian Pop }
200