xref: /rk3399_rockchip-uboot/board/atmel/at91sam9rlek/at91sam9rlek.c (revision 56a61e5e27ab5b9c9c9706f2a2b353880dc04f9d)
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