2008-10-05 13:26:55 +04:00
/*
* linux / arch / arm / mach - pxa / cm - x255 . c
*
* Copyright ( C ) 2007 , 2008 CompuLab , Ltd .
* Mike Rapoport < mike @ compulab . co . il >
*
* 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 .
*/
# include <linux/platform_device.h>
# include <linux/irq.h>
2008-10-05 13:29:59 +04:00
# include <linux/mtd/partitions.h>
# include <linux/mtd/physmap.h>
# include <linux/mtd/nand-gpio.h>
2008-10-05 13:26:55 +04:00
# include <linux/spi/spi.h>
2010-11-23 04:12:15 +03:00
# include <linux/spi/pxa2xx_spi.h>
2008-10-05 13:26:55 +04:00
# include <asm/mach/arch.h>
# include <asm/mach-types.h>
# include <asm/mach/map.h>
2009-01-02 18:17:22 +03:00
# include <mach/pxa25x.h>
2008-10-05 13:26:55 +04:00
# include "generic.h"
2008-10-05 13:29:59 +04:00
# define GPIO_NAND_CS (5)
# define GPIO_NAND_ALE (4)
# define GPIO_NAND_CLE (3)
# define GPIO_NAND_RB (10)
2008-10-05 13:26:55 +04:00
static unsigned long cmx255_pin_config [ ] = {
/* AC'97 */
GPIO28_AC97_BITCLK ,
GPIO29_AC97_SDATA_IN_0 ,
GPIO30_AC97_SDATA_OUT ,
GPIO31_AC97_SYNC ,
/* BTUART */
GPIO42_BTUART_RXD ,
GPIO43_BTUART_TXD ,
GPIO44_BTUART_CTS ,
GPIO45_BTUART_RTS ,
/* STUART */
GPIO46_STUART_RXD ,
GPIO47_STUART_TXD ,
/* LCD */
2010-01-04 06:25:10 +03:00
GPIOxx_LCD_TFT_16BPP ,
2008-10-05 13:26:55 +04:00
/* SSP1 */
GPIO23_SSP1_SCLK ,
GPIO24_SSP1_SFRM ,
GPIO25_SSP1_TXD ,
GPIO26_SSP1_RXD ,
/* SSP2 */
GPIO81_SSP2_CLK_OUT ,
GPIO82_SSP2_FRM_OUT ,
GPIO83_SSP2_TXD ,
GPIO84_SSP2_RXD ,
/* PC Card */
GPIO48_nPOE ,
GPIO49_nPWE ,
GPIO50_nPIOR ,
GPIO51_nPIOW ,
GPIO52_nPCE_1 ,
GPIO53_nPCE_2 ,
GPIO54_nPSKTSEL ,
GPIO55_nPREG ,
GPIO56_nPWAIT ,
GPIO57_nIOIS16 ,
/* SDRAM and local bus */
GPIO15_nCS_1 ,
GPIO78_nCS_2 ,
GPIO79_nCS_3 ,
GPIO80_nCS_4 ,
GPIO33_nCS_5 ,
GPIO18_RDY ,
/* GPIO */
GPIO0_GPIO | WAKEUP_ON_EDGE_BOTH ,
GPIO9_GPIO , /* PC card reset */
/* NAND controls */
GPIO5_GPIO | MFP_LPM_DRIVE_HIGH , /* NAND CE# */
GPIO4_GPIO | MFP_LPM_DRIVE_LOW , /* NAND ALE */
GPIO3_GPIO | MFP_LPM_DRIVE_LOW , /* NAND CLE */
GPIO10_GPIO , /* NAND Ready/Busy */
/* interrupts */
GPIO22_GPIO , /* DM9000 interrupt */
} ;
# if defined(CONFIG_SPI_PXA2XX)
static struct pxa2xx_spi_master pxa_ssp_master_info = {
. num_chipselect = 1 ,
} ;
static struct spi_board_info spi_board_info [ ] __initdata = {
[ 0 ] = {
. modalias = " rtc-max6902 " ,
. max_speed_hz = 1000000 ,
. bus_num = 1 ,
. chip_select = 0 ,
} ,
} ;
static void __init cmx255_init_rtc ( void )
{
pxa2xx_set_spi_info ( 1 , & pxa_ssp_master_info ) ;
spi_register_board_info ( ARRAY_AND_SIZE ( spi_board_info ) ) ;
}
# else
static inline void cmx255_init_rtc ( void ) { }
# endif
2008-10-05 13:29:59 +04:00
# if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE)
static struct mtd_partition cmx255_nor_partitions [ ] = {
{
. name = " ARMmon " ,
. size = 0x00030000 ,
. offset = 0 ,
. mask_flags = MTD_WRITEABLE /* force read-only */
} , {
. name = " ARMmon setup block " ,
. size = 0x00010000 ,
. offset = MTDPART_OFS_APPEND ,
. mask_flags = MTD_WRITEABLE /* force read-only */
} , {
. name = " kernel " ,
. size = 0x00160000 ,
. offset = MTDPART_OFS_APPEND ,
} , {
. name = " ramdisk " ,
. size = MTDPART_SIZ_FULL ,
. offset = MTDPART_OFS_APPEND
}
} ;
static struct physmap_flash_data cmx255_nor_flash_data [ ] = {
{
. width = 2 , /* bankwidth in bytes */
. parts = cmx255_nor_partitions ,
. nr_parts = ARRAY_SIZE ( cmx255_nor_partitions )
}
} ;
static struct resource cmx255_nor_resource = {
. start = PXA_CS0_PHYS ,
. end = PXA_CS0_PHYS + SZ_8M - 1 ,
. flags = IORESOURCE_MEM ,
} ;
static struct platform_device cmx255_nor = {
. name = " physmap-flash " ,
. id = - 1 ,
. dev = {
. platform_data = cmx255_nor_flash_data ,
} ,
. resource = & cmx255_nor_resource ,
. num_resources = 1 ,
} ;
static void __init cmx255_init_nor ( void )
{
platform_device_register ( & cmx255_nor ) ;
}
# else
static inline void cmx255_init_nor ( void ) { }
# endif
# if defined(CONFIG_MTD_NAND_GPIO) || defined(CONFIG_MTD_NAND_GPIO_MODULE)
static struct resource cmx255_nand_resource [ ] = {
[ 0 ] = {
. start = PXA_CS1_PHYS ,
. end = PXA_CS1_PHYS + 11 ,
. flags = IORESOURCE_MEM ,
} ,
[ 1 ] = {
. start = PXA_CS5_PHYS ,
. end = PXA_CS5_PHYS + 3 ,
. flags = IORESOURCE_MEM ,
} ,
} ;
static struct mtd_partition cmx255_nand_parts [ ] = {
[ 0 ] = {
. name = " cmx255-nand " ,
. size = MTDPART_SIZ_FULL ,
. offset = 0 ,
} ,
} ;
static struct gpio_nand_platdata cmx255_nand_platdata = {
. gpio_nce = GPIO_NAND_CS ,
. gpio_cle = GPIO_NAND_CLE ,
. gpio_ale = GPIO_NAND_ALE ,
. gpio_rdy = GPIO_NAND_RB ,
. gpio_nwp = - 1 ,
. parts = cmx255_nand_parts ,
. num_parts = ARRAY_SIZE ( cmx255_nand_parts ) ,
. chip_delay = 25 ,
} ;
static struct platform_device cmx255_nand = {
. name = " gpio-nand " ,
. num_resources = ARRAY_SIZE ( cmx255_nand_resource ) ,
. resource = cmx255_nand_resource ,
. id = - 1 ,
. dev = {
. platform_data = & cmx255_nand_platdata ,
}
} ;
static void __init cmx255_init_nand ( void )
{
platform_device_register ( & cmx255_nand ) ;
}
# else
static inline void cmx255_init_nand ( void ) { }
# endif
2008-10-05 13:26:55 +04:00
void __init cmx255_init ( void )
{
pxa2xx_mfp_config ( ARRAY_AND_SIZE ( cmx255_pin_config ) ) ;
cmx255_init_rtc ( ) ;
2008-10-05 13:29:59 +04:00
cmx255_init_nor ( ) ;
cmx255_init_nand ( ) ;
2008-10-05 13:26:55 +04:00
}