10176d43eSStelian Pop /* 20176d43eSStelian Pop * (C) Copyright 2007-2008 3c9e798d3SStelian Pop * Stelian Pop <stelian@popies.net> 40176d43eSStelian Pop * Lead Tech Design <www.leadtechdesign.com> 50176d43eSStelian Pop * 61a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+ 70176d43eSStelian Pop */ 80176d43eSStelian Pop 90176d43eSStelian Pop #include <common.h> 10*2510be1dSWenyou Yang #include <debug_uart.h> 118c6407fcSReinhard Meyer #include <asm/io.h> 120176d43eSStelian Pop #include <asm/arch/at91sam9260_matrix.h> 139606b3c8SStelian Pop #include <asm/arch/at91sam9_smc.h> 141332a2a0SJean-Christophe PLAGNIOL-VILLARD #include <asm/arch/at91_common.h> 1570341e2eSWenyou Yang #include <asm/arch/clk.h> 160176d43eSStelian Pop #include <asm/arch/gpio.h> 170176d43eSStelian Pop 180176d43eSStelian Pop DECLARE_GLOBAL_DATA_PTR; 190176d43eSStelian Pop 200176d43eSStelian Pop /* ------------------------------------------------------------------------- */ 210176d43eSStelian Pop /* 220176d43eSStelian Pop * Miscelaneous platform dependent initialisations 230176d43eSStelian Pop */ 240176d43eSStelian Pop 250176d43eSStelian Pop #ifdef CONFIG_CMD_NAND at91sam9260ek_nand_hw_init(void)260176d43eSStelian Popstatic void at91sam9260ek_nand_hw_init(void) 270176d43eSStelian Pop { 288c6407fcSReinhard Meyer struct at91_smc *smc = (struct at91_smc *)ATMEL_BASE_SMC; 298c6407fcSReinhard Meyer struct at91_matrix *matrix = (struct at91_matrix *)ATMEL_BASE_MATRIX; 300176d43eSStelian Pop unsigned long csa; 310176d43eSStelian Pop 328c6407fcSReinhard Meyer /* Assign CS3 to NAND/SmartMedia Interface */ 338c6407fcSReinhard Meyer csa = readl(&matrix->ebicsa); 348c6407fcSReinhard Meyer csa |= AT91_MATRIX_CS3A_SMC_SMARTMEDIA; 358c6407fcSReinhard Meyer writel(csa, &matrix->ebicsa); 360176d43eSStelian Pop 370176d43eSStelian Pop /* Configure SMC CS3 for NAND/SmartMedia */ 388c6407fcSReinhard Meyer writel(AT91_SMC_SETUP_NWE(1) | AT91_SMC_SETUP_NCS_WR(0) | 398c6407fcSReinhard Meyer AT91_SMC_SETUP_NRD(1) | AT91_SMC_SETUP_NCS_RD(0), 408c6407fcSReinhard Meyer &smc->cs[3].setup); 418c6407fcSReinhard Meyer writel(AT91_SMC_PULSE_NWE(3) | AT91_SMC_PULSE_NCS_WR(3) | 428c6407fcSReinhard Meyer AT91_SMC_PULSE_NRD(3) | AT91_SMC_PULSE_NCS_RD(3), 438c6407fcSReinhard Meyer &smc->cs[3].pulse); 448c6407fcSReinhard Meyer writel(AT91_SMC_CYCLE_NWE(5) | AT91_SMC_CYCLE_NRD(5), 458c6407fcSReinhard Meyer &smc->cs[3].cycle); 468c6407fcSReinhard Meyer writel(AT91_SMC_MODE_RM_NRD | AT91_SMC_MODE_WM_NWE | 478c6407fcSReinhard Meyer AT91_SMC_MODE_EXNW_DISABLE | 486d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_SYS_NAND_DBW_16 498c6407fcSReinhard Meyer AT91_SMC_MODE_DBW_16 | 506d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #else /* CONFIG_SYS_NAND_DBW_8 */ 518c6407fcSReinhard Meyer AT91_SMC_MODE_DBW_8 | 52c1212b2fSStelian Pop #endif 538c6407fcSReinhard Meyer AT91_SMC_MODE_TDF_CYCLE(2), 548c6407fcSReinhard Meyer &smc->cs[3].mode); 550176d43eSStelian Pop 560176d43eSStelian Pop /* Configure RDY/BSY */ 5774c076d6SJean-Christophe PLAGNIOL-VILLARD at91_set_gpio_input(CONFIG_SYS_NAND_READY_PIN, 1); 580176d43eSStelian Pop 590176d43eSStelian Pop /* Enable NandFlash */ 6074c076d6SJean-Christophe PLAGNIOL-VILLARD at91_set_gpio_output(CONFIG_SYS_NAND_ENABLE_PIN, 1); 618c6407fcSReinhard Meyer 620176d43eSStelian Pop } 630176d43eSStelian Pop #endif 640176d43eSStelian Pop 65*2510be1dSWenyou Yang #ifdef CONFIG_DEBUG_UART_BOARD_INIT board_debug_uart_init(void)66*2510be1dSWenyou Yangvoid board_debug_uart_init(void) 67*2510be1dSWenyou Yang { 68*2510be1dSWenyou Yang at91_seriald_hw_init(); 69*2510be1dSWenyou Yang } 70*2510be1dSWenyou Yang #endif 71*2510be1dSWenyou Yang 72*2510be1dSWenyou Yang #ifdef CONFIG_BOARD_EARLY_INIT_F board_early_init_f(void)738c6407fcSReinhard Meyerint board_early_init_f(void) 748c6407fcSReinhard Meyer { 75*2510be1dSWenyou Yang #ifdef CONFIG_DEBUG_UART 76*2510be1dSWenyou Yang debug_uart_init(); 77*2510be1dSWenyou Yang #endif 788c6407fcSReinhard Meyer return 0; 798c6407fcSReinhard Meyer } 80*2510be1dSWenyou Yang #endif 818c6407fcSReinhard Meyer board_init(void)820176d43eSStelian Popint board_init(void) 830176d43eSStelian Pop { 840176d43eSStelian Pop /* adress of boot parameters */ 858c6407fcSReinhard Meyer gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100; 860176d43eSStelian Pop 870176d43eSStelian Pop #ifdef CONFIG_CMD_NAND 880176d43eSStelian Pop at91sam9260ek_nand_hw_init(); 890176d43eSStelian Pop #endif 900176d43eSStelian Pop return 0; 910176d43eSStelian Pop } 920176d43eSStelian Pop dram_init(void)930176d43eSStelian Popint dram_init(void) 940176d43eSStelian Pop { 958c6407fcSReinhard Meyer gd->ram_size = get_ram_size( 968c6407fcSReinhard Meyer (void *)CONFIG_SYS_SDRAM_BASE, 978c6407fcSReinhard Meyer CONFIG_SYS_SDRAM_SIZE); 980176d43eSStelian Pop return 0; 990176d43eSStelian Pop } 1000176d43eSStelian Pop 1010176d43eSStelian Pop #ifdef CONFIG_RESET_PHY_R reset_phy(void)1020176d43eSStelian Popvoid reset_phy(void) 1030176d43eSStelian Pop { 1040176d43eSStelian Pop } 1050176d43eSStelian Pop #endif 106