2009-07-02 22:06:47 +04:00
/*
* linux / arch / arm / mach - nomadik / board - 8815 nhk . c
*
* Copyright ( C ) STMicroelectronics
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License version 2 , as
* published by the Free Software Foundation .
*
* NHK15 board specifc driver definition
*/
# include <linux/types.h>
# include <linux/kernel.h>
# include <linux/init.h>
# include <linux/platform_device.h>
# include <linux/amba/bus.h>
2009-07-02 18:29:32 +04:00
# include <linux/interrupt.h>
# include <linux/gpio.h>
2009-07-29 20:51:56 +04:00
# include <linux/mtd/mtd.h>
# include <linux/mtd/nand.h>
2009-09-21 01:28:24 +04:00
# include <linux/mtd/onenand.h>
2009-07-29 20:51:56 +04:00
# include <linux/mtd/partitions.h>
# include <linux/io.h>
# include <asm/sizes.h>
2009-07-02 22:06:47 +04:00
# include <asm/mach-types.h>
# include <asm/mach/arch.h>
# include <asm/mach/irq.h>
2009-07-24 15:30:04 +04:00
# include <asm/mach/flash.h>
2009-11-12 08:20:54 +03:00
# include <plat/mtu.h>
2009-07-02 22:06:47 +04:00
# include <mach/setup.h>
2009-07-29 20:51:56 +04:00
# include <mach/nand.h>
# include <mach/fsmc.h>
2009-07-02 22:06:47 +04:00
2009-11-12 08:20:54 +03:00
/* Initial value for SRC control register: all timers use MXTAL/8 source */
# define SRC_CR_INIT_MASK 0x00007fff
# define SRC_CR_INIT_VAL 0x2aaa8000
tree-wide: Assorted spelling fixes
In particular, several occurances of funny versions of 'success',
'unknown', 'therefore', 'acknowledge', 'argument', 'achieve', 'address',
'beginning', 'desirable', 'separate' and 'necessary' are fixed.
Signed-off-by: Daniel Mack <daniel@caiaq.de>
Cc: Joe Perches <joe@perches.com>
Cc: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
2010-02-03 03:01:28 +03:00
/* These addresses span 16MB, so use three individual pages */
2009-07-29 20:51:56 +04:00
static struct resource nhk8815_nand_resources [ ] = {
{
. name = " nand_addr " ,
. start = NAND_IO_ADDR ,
. end = NAND_IO_ADDR + 0xfff ,
. flags = IORESOURCE_MEM ,
} , {
. name = " nand_cmd " ,
. start = NAND_IO_CMD ,
. end = NAND_IO_CMD + 0xfff ,
. flags = IORESOURCE_MEM ,
} , {
. name = " nand_data " ,
. start = NAND_IO_DATA ,
. end = NAND_IO_DATA + 0xfff ,
. flags = IORESOURCE_MEM ,
}
} ;
static int nhk8815_nand_init ( void )
{
/* FSMC setup for nand chip select (8-bit nand in 8815NHK) */
writel ( 0x0000000E , FSMC_PCR ( 0 ) ) ;
writel ( 0x000D0A00 , FSMC_PMEM ( 0 ) ) ;
writel ( 0x00100A00 , FSMC_PATT ( 0 ) ) ;
/* enable access to the chip select area */
writel ( readl ( FSMC_PCR ( 0 ) ) | 0x04 , FSMC_PCR ( 0 ) ) ;
return 0 ;
}
/*
* These partitions are the same as those used in the 2.6 .20 release
* shipped by the vendor ; the first two partitions are mandated
* by the boot ROM , and the bootloader area is somehow oversized . . .
*/
static struct mtd_partition nhk8815_partitions [ ] = {
{
. name = " X-Loader(NAND) " ,
. offset = 0 ,
. size = SZ_256K ,
} , {
. name = " MemInit(NAND) " ,
. offset = MTDPART_OFS_APPEND ,
. size = SZ_256K ,
} , {
. name = " BootLoader(NAND) " ,
. offset = MTDPART_OFS_APPEND ,
. size = SZ_2M ,
} , {
. name = " Kernel zImage(NAND) " ,
. offset = MTDPART_OFS_APPEND ,
. size = 3 * SZ_1M ,
} , {
. name = " Root Filesystem(NAND) " ,
. offset = MTDPART_OFS_APPEND ,
. size = 22 * SZ_1M ,
} , {
. name = " User Filesystem(NAND) " ,
. offset = MTDPART_OFS_APPEND ,
. size = MTDPART_SIZ_FULL ,
}
} ;
static struct nomadik_nand_platform_data nhk8815_nand_data = {
. parts = nhk8815_partitions ,
. nparts = ARRAY_SIZE ( nhk8815_partitions ) ,
. options = NAND_COPYBACK | NAND_CACHEPRG | NAND_NO_PADDING \
| NAND_NO_READRDY | NAND_NO_AUTOINCR ,
. init = nhk8815_nand_init ,
} ;
static struct platform_device nhk8815_nand_device = {
. name = " nomadik_nand " ,
. dev = {
. platform_data = & nhk8815_nand_data ,
} ,
. resource = nhk8815_nand_resources ,
. num_resources = ARRAY_SIZE ( nhk8815_nand_resources ) ,
} ;
2009-07-24 15:30:04 +04:00
/* These are the partitions for the OneNand device, different from above */
static struct mtd_partition nhk8815_onenand_partitions [ ] = {
{
. name = " X-Loader(OneNAND) " ,
. offset = 0 ,
. size = SZ_256K ,
} , {
. name = " MemInit(OneNAND) " ,
. offset = MTDPART_OFS_APPEND ,
. size = SZ_256K ,
} , {
. name = " BootLoader(OneNAND) " ,
. offset = MTDPART_OFS_APPEND ,
. size = SZ_2M - SZ_256K ,
} , {
. name = " SysImage(OneNAND) " ,
. offset = MTDPART_OFS_APPEND ,
. size = 4 * SZ_1M ,
} , {
. name = " Root Filesystem(OneNAND) " ,
. offset = MTDPART_OFS_APPEND ,
. size = 22 * SZ_1M ,
} , {
. name = " User Filesystem(OneNAND) " ,
. offset = MTDPART_OFS_APPEND ,
. size = MTDPART_SIZ_FULL ,
}
} ;
2009-09-21 01:28:24 +04:00
static struct onenand_platform_data nhk8815_onenand_data = {
2009-07-24 15:30:04 +04:00
. parts = nhk8815_onenand_partitions ,
. nr_parts = ARRAY_SIZE ( nhk8815_onenand_partitions ) ,
} ;
static struct resource nhk8815_onenand_resource [ ] = {
{
. start = 0x30000000 ,
. end = 0x30000000 + SZ_128K - 1 ,
. flags = IORESOURCE_MEM ,
} ,
} ;
static struct platform_device nhk8815_onenand_device = {
2009-09-21 01:28:24 +04:00
. name = " onenand-flash " ,
2009-07-24 15:30:04 +04:00
. id = - 1 ,
. dev = {
. platform_data = & nhk8815_onenand_data ,
} ,
. resource = nhk8815_onenand_resource ,
. num_resources = ARRAY_SIZE ( nhk8815_onenand_resource ) ,
} ;
static void __init nhk8815_onenand_init ( void )
{
2009-09-21 01:28:24 +04:00
# ifdef CONFIG_MTD_ONENAND
2009-07-24 15:30:04 +04:00
/* Set up SMCS0 for OneNand */
2009-09-21 01:28:24 +04:00
writel ( 0x000030db , FSMC_BCR ( 0 ) ) ;
writel ( 0x02100551 , FSMC_BTR ( 0 ) ) ;
2009-07-24 15:30:04 +04:00
# endif
}
2009-07-29 20:51:56 +04:00
2009-07-02 22:06:47 +04:00
# define __MEM_4K_RESOURCE(x) \
. res = { . start = ( x ) , . end = ( x ) + SZ_4K - 1 , . flags = IORESOURCE_MEM }
static struct amba_device uart0_device = {
. dev = { . init_name = " uart0 " } ,
__MEM_4K_RESOURCE ( NOMADIK_UART0_BASE ) ,
. irq = { IRQ_UART0 , NO_IRQ } ,
} ;
static struct amba_device uart1_device = {
. dev = { . init_name = " uart1 " } ,
__MEM_4K_RESOURCE ( NOMADIK_UART1_BASE ) ,
. irq = { IRQ_UART1 , NO_IRQ } ,
} ;
static struct amba_device * amba_devs [ ] __initdata = {
& uart0_device ,
& uart1_device ,
} ;
2009-07-02 18:29:32 +04:00
static struct resource nhk8815_eth_resources [ ] = {
{
. name = " smc91x-regs " ,
. start = 0x34000000 + 0x300 ,
. end = 0x34000000 + SZ_64K - 1 ,
. flags = IORESOURCE_MEM ,
} , {
. start = NOMADIK_GPIO_TO_IRQ ( 115 ) ,
. end = NOMADIK_GPIO_TO_IRQ ( 115 ) ,
. flags = IORESOURCE_IRQ | IRQF_TRIGGER_RISING ,
}
} ;
static struct platform_device nhk8815_eth_device = {
. name = " smc91x " ,
. resource = nhk8815_eth_resources ,
. num_resources = ARRAY_SIZE ( nhk8815_eth_resources ) ,
} ;
static int __init nhk8815_eth_init ( void )
{
int gpio_nr = 115 ; /* hardwired in the board */
int err ;
err = gpio_request ( gpio_nr , " eth_irq " ) ;
if ( ! err ) err = nmk_gpio_set_mode ( gpio_nr , NMK_GPIO_ALT_GPIO ) ;
if ( ! err ) err = gpio_direction_input ( gpio_nr ) ;
if ( err )
pr_err ( " Error %i in %s \n " , err , __func__ ) ;
return err ;
}
device_initcall ( nhk8815_eth_init ) ;
2009-07-02 22:06:47 +04:00
static struct platform_device * nhk8815_platform_devices [ ] __initdata = {
2009-07-29 20:51:56 +04:00
& nhk8815_nand_device ,
2009-07-24 15:30:04 +04:00
& nhk8815_onenand_device ,
2009-07-02 18:29:32 +04:00
& nhk8815_eth_device ,
/* will add more devices */
2009-07-02 22:06:47 +04:00
} ;
2009-11-12 08:20:54 +03:00
static void __init nomadik_timer_init ( void )
{
u32 src_cr ;
/* Configure timer sources in "system reset controller" ctrl reg */
src_cr = readl ( io_p2v ( NOMADIK_SRC_BASE ) ) ;
src_cr & = SRC_CR_INIT_MASK ;
src_cr | = SRC_CR_INIT_VAL ;
writel ( src_cr , io_p2v ( NOMADIK_SRC_BASE ) ) ;
/* Save global pointer to mtu, used by platform timer code */
mtu_base = io_p2v ( NOMADIK_MTU0_BASE ) ;
nmdk_timer_init ( ) ;
}
static struct sys_timer nomadik_timer = {
. init = nomadik_timer_init ,
} ;
2009-07-02 22:06:47 +04:00
static void __init nhk8815_platform_init ( void )
{
int i ;
cpu8815_platform_init ( ) ;
2009-07-24 15:30:04 +04:00
nhk8815_onenand_init ( ) ;
2009-07-02 22:06:47 +04:00
platform_add_devices ( nhk8815_platform_devices ,
ARRAY_SIZE ( nhk8815_platform_devices ) ) ;
2010-05-06 13:47:25 +04:00
for ( i = 0 ; i < ARRAY_SIZE ( amba_devs ) ; i + + )
2009-07-02 22:06:47 +04:00
amba_device_register ( amba_devs [ i ] , & iomem_resource ) ;
}
MACHINE_START ( NOMADIK , " NHK8815 " )
/* Maintainer: ST MicroElectronics */
. phys_io = NOMADIK_UART0_BASE ,
. io_pg_offst = ( IO_ADDRESS ( NOMADIK_UART0_BASE ) > > 18 ) & 0xfffc ,
. boot_params = 0x100 ,
. map_io = cpu8815_map_io ,
. init_irq = cpu8815_init_irq ,
. timer = & nomadik_timer ,
. init_machine = nhk8815_platform_init ,
MACHINE_END