2010-02-05 11:14:58 +00:00
/*
* AP4EVB board support
*
* Copyright ( C ) 2010 Magnus Damm
* Copyright ( C ) 2008 Yoshihiro Shimoda
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation ; version 2 of the License .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software
* Foundation , Inc . , 51 Franklin St , Fifth Floor , Boston , MA 02110 - 1301 USA
*/
# include <linux/kernel.h>
# include <linux/init.h>
# include <linux/interrupt.h>
# include <linux/irq.h>
# include <linux/platform_device.h>
# include <linux/delay.h>
# include <linux/mtd/mtd.h>
# include <linux/mtd/partitions.h>
# include <linux/mtd/physmap.h>
# include <linux/io.h>
2010-02-17 09:30:14 +00:00
# include <linux/smsc911x.h>
# include <linux/gpio.h>
2010-02-23 07:07:01 +00:00
# include <linux/input.h>
# include <linux/input/sh_keysc.h>
2010-02-05 11:14:58 +00:00
# include <mach/common.h>
2010-02-17 09:30:14 +00:00
# include <mach/sh7372.h>
2010-02-05 11:14:58 +00:00
# include <asm/mach-types.h>
# include <asm/mach/arch.h>
# include <asm/mach/map.h>
2010-02-18 17:58:19 +09:00
/*
* Address Interface BusWidth note
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* 0x0000 _0000 NOR Flash ROM ( MCP ) 16 bit SW7 : bit1 = ON
* 0x0800 _0000 user area -
* 0x1000 _0000 NOR Flash ROM ( MCP ) 16 bit SW7 : bit1 = OFF
* 0x1400 _0000 Ether ( LAN9220 ) 16 bit
* 0x1600 _0000 user area - cannot use with NAND
* 0x1800 _0000 user area -
* 0x1A00 _0000 -
* 0x4000 _0000 LPDDR2 - SDRAM ( POP ) 32 bit
*/
/*
* NOR Flash ROM
*
* SW1 | SW2 | SW7 | NOR Flash ROM
* bit1 | bit1 bit2 | bit1 | Memory allocation
* - - - - - - + - - - - - - - - - - - - + - - - - - - + - - - - - - - - - - - - - - - - - -
* OFF | ON OFF | ON | Area 0
* OFF | ON OFF | OFF | Area 4
*/
/*
* NAND Flash ROM
*
* SW1 | SW2 | SW7 | NAND Flash ROM
* bit1 | bit1 bit2 | bit2 | Memory allocation
* - - - - - - + - - - - - - - - - - - - + - - - - - - + - - - - - - - - - - - - - - - - - -
* OFF | ON OFF | ON | FCE 0
* OFF | ON OFF | OFF | FCE 1
*/
/*
* SMSC 9220
*
* SW1 SMSC 9220
* - - - - - - - - - - - - - - - - - - - - - - -
* ON access disable
* OFF access enable
*/
2010-02-23 07:07:01 +00:00
/*
* KEYSC
*
* SW43 KEYSC
* - - - - - - - - - - - - - - - - - - - - - - - - -
* ON enable
* OFF disable
*/
2010-02-17 09:30:14 +00:00
/* MTD */
2010-02-05 11:14:58 +00:00
static struct mtd_partition nor_flash_partitions [ ] = {
{
. name = " loader " ,
. offset = 0x00000000 ,
. size = 512 * 1024 ,
} ,
{
. name = " bootenv " ,
. offset = MTDPART_OFS_APPEND ,
. size = 512 * 1024 ,
} ,
{
. name = " kernel_ro " ,
. offset = MTDPART_OFS_APPEND ,
. size = 8 * 1024 * 1024 ,
. mask_flags = MTD_WRITEABLE ,
} ,
{
. name = " kernel " ,
. offset = MTDPART_OFS_APPEND ,
. size = 8 * 1024 * 1024 ,
} ,
{
. name = " data " ,
. offset = MTDPART_OFS_APPEND ,
. size = MTDPART_SIZ_FULL ,
} ,
} ;
static struct physmap_flash_data nor_flash_data = {
. width = 2 ,
. parts = nor_flash_partitions ,
. nr_parts = ARRAY_SIZE ( nor_flash_partitions ) ,
} ;
static struct resource nor_flash_resources [ ] = {
[ 0 ] = {
. start = 0x00000000 ,
. end = 0x08000000 - 1 ,
. flags = IORESOURCE_MEM ,
}
} ;
static struct platform_device nor_flash_device = {
. name = " physmap-flash " ,
. dev = {
. platform_data = & nor_flash_data ,
} ,
. num_resources = ARRAY_SIZE ( nor_flash_resources ) ,
. resource = nor_flash_resources ,
} ;
2010-02-17 09:30:14 +00:00
/* SMSC 9220 */
static struct resource smc911x_resources [ ] = {
{
. start = 0x14000000 ,
. end = 0x16000000 - 1 ,
. flags = IORESOURCE_MEM ,
} , {
. start = 6 ,
. flags = IORESOURCE_IRQ | IORESOURCE_IRQ_LOWLEVEL ,
} ,
} ;
static struct smsc911x_platform_config smsc911x_info = {
. flags = SMSC911X_USE_16BIT | SMSC911X_SAVE_MAC_ADDRESS ,
. irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_LOW ,
. irq_type = SMSC911X_IRQ_TYPE_PUSH_PULL ,
} ;
static struct platform_device smc911x_device = {
. name = " smsc911x " ,
. id = - 1 ,
. num_resources = ARRAY_SIZE ( smc911x_resources ) ,
. resource = smc911x_resources ,
. dev = {
. platform_data = & smsc911x_info ,
} ,
} ;
2010-02-05 11:14:58 +00:00
2010-02-23 07:07:01 +00:00
/* KEYSC (Needs SW43 set to ON) */
static struct sh_keysc_info keysc_info = {
. mode = SH_KEYSC_MODE_1 ,
. scan_timing = 3 ,
. delay = 2500 ,
. keycodes = {
KEY_0 , KEY_1 , KEY_2 , KEY_3 , KEY_4 ,
KEY_5 , KEY_6 , KEY_7 , KEY_8 , KEY_9 ,
KEY_A , KEY_B , KEY_C , KEY_D , KEY_E ,
KEY_F , KEY_G , KEY_H , KEY_I , KEY_J ,
KEY_K , KEY_L , KEY_M , KEY_N , KEY_O ,
} ,
} ;
static struct resource keysc_resources [ ] = {
[ 0 ] = {
. name = " KEYSC " ,
. start = 0xe61b0000 ,
. end = 0xe61b0063 ,
. flags = IORESOURCE_MEM ,
} ,
[ 1 ] = {
. start = 79 ,
. flags = IORESOURCE_IRQ ,
} ,
} ;
static struct platform_device keysc_device = {
. name = " sh_keysc " ,
. id = 0 , /* "keysc0" clock */
. num_resources = ARRAY_SIZE ( keysc_resources ) ,
. resource = keysc_resources ,
. dev = {
. platform_data = & keysc_info ,
} ,
} ;
2010-03-10 09:26:44 +00:00
/* SDHI0 */
static struct resource sdhi0_resources [ ] = {
[ 0 ] = {
. name = " SDHI0 " ,
. start = 0xe6850000 ,
. end = 0xe68501ff ,
. flags = IORESOURCE_MEM ,
} ,
[ 1 ] = {
. start = 96 ,
. flags = IORESOURCE_IRQ ,
} ,
} ;
static struct platform_device sdhi0_device = {
. name = " sh_mobile_sdhi " ,
. num_resources = ARRAY_SIZE ( sdhi0_resources ) ,
. resource = sdhi0_resources ,
. id = 0 ,
} ;
2010-02-05 11:14:58 +00:00
static struct platform_device * ap4evb_devices [ ] __initdata = {
& nor_flash_device ,
2010-02-17 09:30:14 +00:00
& smc911x_device ,
2010-02-23 07:07:01 +00:00
& keysc_device ,
2010-03-10 09:26:44 +00:00
& sdhi0_device ,
2010-02-05 11:14:58 +00:00
} ;
static struct map_desc ap4evb_io_desc [ ] __initdata = {
/* create a 1:1 entity map for 0xe6xxxxxx
* used by CPGA , INTC and PFC .
*/
{
. virtual = 0xe6000000 ,
. pfn = __phys_to_pfn ( 0xe6000000 ) ,
. length = 256 < < 20 ,
. type = MT_DEVICE_NONSHARED
} ,
} ;
static void __init ap4evb_map_io ( void )
{
iotable_init ( ap4evb_io_desc , ARRAY_SIZE ( ap4evb_io_desc ) ) ;
2010-02-08 11:02:54 +00:00
/* setup early devices, clocks and console here as well */
2010-02-05 11:14:58 +00:00
sh7372_add_early_devices ( ) ;
sh7367_clock_init ( ) ; /* use g3 clocks for now */
2010-02-08 11:02:54 +00:00
shmobile_setup_console ( ) ;
2010-02-05 11:14:58 +00:00
}
static void __init ap4evb_init ( void )
{
2010-02-17 09:30:14 +00:00
sh7372_pinmux_init ( ) ;
2010-02-18 16:44:41 +09:00
/* enable SCIFA0 */
gpio_request ( GPIO_FN_SCIFA0_TXD , NULL ) ;
gpio_request ( GPIO_FN_SCIFA0_RXD , NULL ) ;
2010-02-17 09:30:14 +00:00
/* enable SMSC911X */
gpio_request ( GPIO_FN_CS5A , NULL ) ;
gpio_request ( GPIO_FN_IRQ6_39 , NULL ) ;
2010-02-22 09:20:39 +00:00
/* enable LED 1 - 4 */
gpio_request ( GPIO_PORT185 , NULL ) ;
gpio_request ( GPIO_PORT186 , NULL ) ;
gpio_request ( GPIO_PORT187 , NULL ) ;
gpio_request ( GPIO_PORT188 , NULL ) ;
gpio_direction_output ( GPIO_PORT185 , 1 ) ;
gpio_direction_output ( GPIO_PORT186 , 1 ) ;
gpio_direction_output ( GPIO_PORT187 , 1 ) ;
gpio_direction_output ( GPIO_PORT188 , 1 ) ;
gpio_export ( GPIO_PORT185 , 0 ) ;
gpio_export ( GPIO_PORT186 , 0 ) ;
gpio_export ( GPIO_PORT187 , 0 ) ;
gpio_export ( GPIO_PORT188 , 0 ) ;
2010-02-22 09:30:12 +00:00
/* enable Debug switch (S6) */
gpio_request ( GPIO_PORT32 , NULL ) ;
gpio_request ( GPIO_PORT33 , NULL ) ;
gpio_request ( GPIO_PORT34 , NULL ) ;
gpio_request ( GPIO_PORT35 , NULL ) ;
gpio_direction_input ( GPIO_PORT32 ) ;
gpio_direction_input ( GPIO_PORT33 ) ;
gpio_direction_input ( GPIO_PORT34 ) ;
gpio_direction_input ( GPIO_PORT35 ) ;
gpio_export ( GPIO_PORT32 , 0 ) ;
gpio_export ( GPIO_PORT33 , 0 ) ;
gpio_export ( GPIO_PORT34 , 0 ) ;
gpio_export ( GPIO_PORT35 , 0 ) ;
2010-02-23 07:07:01 +00:00
/* enable KEYSC */
gpio_request ( GPIO_FN_KEYOUT0 , NULL ) ;
gpio_request ( GPIO_FN_KEYOUT1 , NULL ) ;
gpio_request ( GPIO_FN_KEYOUT2 , NULL ) ;
gpio_request ( GPIO_FN_KEYOUT3 , NULL ) ;
gpio_request ( GPIO_FN_KEYOUT4 , NULL ) ;
gpio_request ( GPIO_FN_KEYIN0_136 , NULL ) ;
gpio_request ( GPIO_FN_KEYIN1_135 , NULL ) ;
gpio_request ( GPIO_FN_KEYIN2_134 , NULL ) ;
gpio_request ( GPIO_FN_KEYIN3_133 , NULL ) ;
gpio_request ( GPIO_FN_KEYIN4 , NULL ) ;
2010-03-10 09:26:44 +00:00
/* SDHI0 */
gpio_request ( GPIO_FN_SDHICD0 , NULL ) ;
gpio_request ( GPIO_FN_SDHIWP0 , NULL ) ;
gpio_request ( GPIO_FN_SDHICMD0 , NULL ) ;
gpio_request ( GPIO_FN_SDHICLK0 , NULL ) ;
gpio_request ( GPIO_FN_SDHID0_3 , NULL ) ;
gpio_request ( GPIO_FN_SDHID0_2 , NULL ) ;
gpio_request ( GPIO_FN_SDHID0_1 , NULL ) ;
gpio_request ( GPIO_FN_SDHID0_0 , NULL ) ;
2010-02-05 11:14:58 +00:00
sh7372_add_standard_devices ( ) ;
platform_add_devices ( ap4evb_devices , ARRAY_SIZE ( ap4evb_devices ) ) ;
}
MACHINE_START ( AP4EVB , " ap4evb " )
. phys_io = 0xe6000000 ,
. io_pg_offst = ( ( 0xe6000000 ) > > 18 ) & 0xfffc ,
. map_io = ap4evb_map_io ,
. init_irq = sh7372_init_irq ,
. init_machine = ap4evb_init ,
. timer = & shmobile_timer ,
MACHINE_END