@ -25,6 +25,7 @@
# include <netdev.h>
# include <asm/arch/mx31.h>
# include <asm/arch/mx31-regs.h>
# include <nand.h>
# include "qong_fpga.h"
DECLARE_GLOBAL_DATA_PTR ;
@ -38,6 +39,15 @@ int dram_init (void)
return 0 ;
}
static void qong_fpga_reset ( void )
{
mx31_gpio_set ( QONG_FPGA_RST_PIN , 0 ) ;
udelay ( 30 ) ;
mx31_gpio_set ( QONG_FPGA_RST_PIN , 1 ) ;
udelay ( 300 ) ;
}
int board_init ( void )
{
/* Chip selects */
@ -101,6 +111,15 @@ int board_init (void)
mx31_gpio_mux ( IOMUX_MODE ( 0x91 , MUX_CTL_OUT_FUNC | MUX_CTL_IN_GPIO ) ) ;
mx31_gpio_mux ( IOMUX_MODE ( 0x92 , MUX_CTL_GPIO ) ) ;
mx31_gpio_mux ( IOMUX_MODE ( 0x93 , MUX_CTL_GPIO ) ) ;
/* FPGA reset Pin */
/* rstn = 0 */
mx31_gpio_set ( QONG_FPGA_RST_PIN , 0 ) ;
mx31_gpio_direction ( QONG_FPGA_RST_PIN , MX31_GPIO_DIRECTION_OUT ) ;
/* set interrupt pin as input */
mx31_gpio_direction ( QONG_FPGA_IRQ_PIN , MX31_GPIO_DIRECTION_IN ) ;
# endif
/* setup pins for UART1 */
@ -127,32 +146,11 @@ int misc_init_r (void)
# ifdef CONFIG_QONG_FPGA
u32 tmp ;
/* FPGA reset */
/* rstn = 0 */
tmp = __REG ( GPIO2_BASE + GPIO_DR ) ;
tmp & = ( ~ ( 1 < < QONG_FPGA_RST_PIN ) ) ;
__REG ( GPIO2_BASE + GPIO_DR ) = tmp ;
/* set the GPIO as output */
tmp = __REG ( GPIO2_BASE + GPIO_GDIR ) ;
tmp | = ( 1 < < QONG_FPGA_RST_PIN ) ;
__REG ( GPIO2_BASE + GPIO_GDIR ) = tmp ;
/* wait */
udelay ( 30 ) ;
/* rstn = 1 */
tmp = __REG ( GPIO2_BASE + GPIO_DR ) ;
tmp | = ( 1 < < QONG_FPGA_RST_PIN ) ;
__REG ( GPIO2_BASE + GPIO_DR ) = tmp ;
/* set interrupt pin as input */
__REG ( GPIO2_BASE + GPIO_GDIR ) = tmp | ( 1 < < QONG_FPGA_IRQ_PIN ) ;
/* wait while the FPGA starts */
udelay ( 300 ) ;
tmp = * ( volatile u32 * ) QONG_FPGA_CTRL_VERSION ;
printf ( " FPGA: " ) ;
printf ( " version register = %u.%u.%u \n " ,
( tmp & 0xF000 ) > > 12 , ( tmp & 0x0F00 ) > > 8 , tmp & 0x00FF ) ;
# endif
return 0 ;
}
@ -164,3 +162,56 @@ int board_eth_init(bd_t *bis)
return 0 ;
# endif
}
# if defined(CONFIG_QONG_FPGA) && defined(CONFIG_NAND_PLAT)
static void board_nand_setup ( void )
{
/* CS3: NAND 8-bit */
__REG ( CSCR_U ( 3 ) ) = 0x00004f00 ;
__REG ( CSCR_L ( 3 ) ) = 0x20013b31 ;
__REG ( CSCR_A ( 3 ) ) = 0x00020800 ;
__REG ( IOMUXC_GPR ) | = 1 < < 13 ;
mx31_gpio_mux ( IOMUX_MODE ( MUX_CTL_NFC_WP , MUX_CTL_IN_GPIO ) ) ;
mx31_gpio_mux ( IOMUX_MODE ( MUX_CTL_NFC_CE , MUX_CTL_IN_GPIO ) ) ;
mx31_gpio_mux ( IOMUX_MODE ( MUX_CTL_NFC_RB , MUX_CTL_IN_GPIO ) ) ;
/* Make sure to reset the fpga else you cannot access NAND */
qong_fpga_reset ( ) ;
/* Enable NAND flash */
mx31_gpio_set ( 15 , 1 ) ;
mx31_gpio_set ( 14 , 1 ) ;
mx31_gpio_direction ( 15 , MX31_GPIO_DIRECTION_OUT ) ;
mx31_gpio_direction ( 16 , MX31_GPIO_DIRECTION_IN ) ;
mx31_gpio_direction ( 14 , MX31_GPIO_DIRECTION_IN ) ;
mx31_gpio_set ( 15 , 0 ) ;
}
int qong_nand_rdy ( void * chip )
{
udelay ( 1 ) ;
return mx31_gpio_get ( 16 ) ;
}
void qong_nand_select_chip ( struct mtd_info * mtd , int chip )
{
if ( chip > = 0 )
mx31_gpio_set ( 15 , 0 ) ;
else
mx31_gpio_set ( 15 , 1 ) ;
}
void qong_nand_plat_init ( void * chip )
{
struct nand_chip * nand = ( struct nand_chip * ) chip ;
nand - > chip_delay = 20 ;
nand - > select_chip = qong_nand_select_chip ;
nand - > options & = ~ NAND_BUSWIDTH_16 ;
board_nand_setup ( ) ;
}
# endif