2008-07-05 10:02:52 +02:00
/*
* Copyright ( C ) 2008 Sascha Hauer , Pengutronix
*
* 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 ; either version 2 of the License , or
* ( at your option ) any later version .
*
* 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 . , 59 Temple Place , Suite 330 , Boston , MA 02111 - 1307 USA
*/
# include <linux/types.h>
# include <linux/init.h>
# include <linux/platform_device.h>
# include <linux/mtd/physmap.h>
2008-11-23 17:32:49 +01:00
# include <linux/mtd/plat-ram.h>
2008-07-05 10:02:52 +02:00
# include <linux/memory.h>
2008-11-11 15:12:00 +01:00
# include <linux/gpio.h>
2009-01-20 13:22:29 +00:00
# include <linux/smsc911x.h>
2008-11-11 15:12:00 +01:00
# include <linux/interrupt.h>
2009-01-28 17:10:32 +01:00
# include <linux/i2c.h>
# include <linux/i2c/at24.h>
2008-07-05 10:02:52 +02:00
2008-08-05 16:14:15 +01:00
# include <mach/hardware.h>
2008-07-05 10:02:52 +02:00
# include <asm/mach-types.h>
# include <asm/mach/arch.h>
# include <asm/mach/time.h>
# include <asm/mach/map.h>
2008-08-05 16:14:15 +01:00
# include <mach/common.h>
# include <mach/imx-uart.h>
# include <mach/iomux-mx3.h>
# include <mach/board-pcm037.h>
2008-11-23 17:34:04 +01:00
# include <mach/mxc_nand.h>
2008-11-11 15:03:28 +01:00
# include <mach/mmc.h>
2009-01-28 17:10:32 +01:00
# ifdef CONFIG_I2C_IMX
# include <mach/i2c.h>
# endif
2008-07-05 10:02:52 +02:00
2008-09-09 10:19:41 +02:00
# include "devices.h"
2008-07-05 10:02:52 +02:00
static struct physmap_flash_data pcm037_flash_data = {
. width = 2 ,
} ;
static struct resource pcm037_flash_resource = {
. start = 0xa0000000 ,
. end = 0xa1ffffff ,
. flags = IORESOURCE_MEM ,
} ;
static struct platform_device pcm037_flash = {
. name = " physmap-flash " ,
. id = 0 ,
. dev = {
. platform_data = & pcm037_flash_data ,
} ,
. resource = & pcm037_flash_resource ,
. num_resources = 1 ,
} ;
static struct imxuart_platform_data uart_pdata = {
2008-09-02 10:19:29 +02:00
. flags = IMXUART_HAVE_RTSCTS ,
2008-07-05 10:02:52 +02:00
} ;
2009-01-20 13:22:29 +00:00
static struct resource smsc911x_resources [ ] = {
2008-11-11 15:12:00 +01:00
[ 0 ] = {
. start = CS1_BASE_ADDR + 0x300 ,
. end = CS1_BASE_ADDR + 0x300 + SZ_64K - 1 ,
. flags = IORESOURCE_MEM ,
} ,
[ 1 ] = {
. start = IOMUX_TO_IRQ ( MX31_PIN_GPIO3_1 ) ,
. end = IOMUX_TO_IRQ ( MX31_PIN_GPIO3_1 ) ,
2009-01-20 13:22:29 +00:00
. flags = IORESOURCE_IRQ | IORESOURCE_IRQ_LOWLEVEL ,
2008-11-11 15:12:00 +01:00
} ,
} ;
2009-01-20 13:22:29 +00:00
static struct smsc911x_platform_config smsc911x_info = {
. flags = SMSC911X_USE_32BIT | SMSC911X_FORCE_INTERNAL_PHY |
SMSC911X_SAVE_MAC_ADDRESS ,
. irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_LOW ,
. irq_type = SMSC911X_IRQ_TYPE_OPEN_DRAIN ,
. phy_interface = PHY_INTERFACE_MODE_MII ,
2008-11-11 15:12:00 +01:00
} ;
static struct platform_device pcm037_eth = {
2009-01-20 13:22:29 +00:00
. name = " smsc911x " ,
2008-11-11 15:12:00 +01:00
. id = - 1 ,
2009-01-20 13:22:29 +00:00
. num_resources = ARRAY_SIZE ( smsc911x_resources ) ,
. resource = smsc911x_resources ,
2008-11-11 15:12:00 +01:00
. dev = {
2009-01-20 13:22:29 +00:00
. platform_data = & smsc911x_info ,
2008-11-11 15:12:00 +01:00
} ,
} ;
2008-11-23 17:32:49 +01:00
static struct platdata_mtd_ram pcm038_sram_data = {
. bankwidth = 2 ,
} ;
static struct resource pcm038_sram_resource = {
. start = CS4_BASE_ADDR ,
. end = CS4_BASE_ADDR + 512 * 1024 - 1 ,
. flags = IORESOURCE_MEM ,
} ;
static struct platform_device pcm037_sram_device = {
. name = " mtd-ram " ,
. id = 0 ,
. dev = {
. platform_data = & pcm038_sram_data ,
} ,
. num_resources = 1 ,
. resource = & pcm038_sram_resource ,
} ;
2008-11-23 17:34:04 +01:00
static struct mxc_nand_platform_data pcm037_nand_board_info = {
. width = 1 ,
. hw_ecc = 1 ,
} ;
2009-01-28 17:10:32 +01:00
# ifdef CONFIG_I2C_IMX
static int i2c_1_pins [ ] = {
MX31_PIN_CSPI2_MOSI__SCL ,
MX31_PIN_CSPI2_MISO__SDA ,
} ;
static int pcm037_i2c_1_init ( struct device * dev )
{
return mxc_iomux_setup_multiple_pins ( i2c_1_pins , ARRAY_SIZE ( i2c_1_pins ) ,
" i2c-1 " ) ;
}
static void pcm037_i2c_1_exit ( struct device * dev )
{
mxc_iomux_release_multiple_pins ( i2c_1_pins , ARRAY_SIZE ( i2c_1_pins ) ) ;
}
static struct imxi2c_platform_data pcm037_i2c_1_data = {
. bitrate = 100000 ,
. init = pcm037_i2c_1_init ,
. exit = pcm037_i2c_1_exit ,
} ;
static struct at24_platform_data board_eeprom = {
. byte_len = 4096 ,
. page_size = 32 ,
. flags = AT24_FLAG_ADDR16 ,
} ;
static struct i2c_board_info pcm037_i2c_devices [ ] = {
{
I2C_BOARD_INFO ( " at24 " , 0x52 ) , /* E0=0, E1=1, E2=0 */
. platform_data = & board_eeprom ,
} , {
I2C_BOARD_INFO ( " rtc-pcf8563 " , 0x51 ) ,
. type = " pcf8563 " ,
}
} ;
# endif
2008-11-11 15:03:28 +01:00
static int sdhc1_pins [ ] = {
MX31_PIN_SD1_DATA3__SD1_DATA3 ,
MX31_PIN_SD1_DATA2__SD1_DATA2 ,
MX31_PIN_SD1_DATA1__SD1_DATA1 ,
MX31_PIN_SD1_DATA0__SD1_DATA0 ,
MX31_PIN_SD1_CLK__SD1_CLK ,
MX31_PIN_SD1_CMD__SD1_CMD ,
} ;
static int pcm970_sdhc1_init ( struct device * dev , irq_handler_t h , void * data )
{
return mxc_iomux_setup_multiple_pins ( sdhc1_pins , ARRAY_SIZE ( sdhc1_pins ) ,
" sdhc-1 " ) ;
}
static void pcm970_sdhc1_exit ( struct device * dev , void * data )
{
mxc_iomux_release_multiple_pins ( sdhc1_pins , ARRAY_SIZE ( sdhc1_pins ) ) ;
}
/* No card and rw detection at the moment */
static struct imxmmc_platform_data sdhc_pdata = {
. init = pcm970_sdhc1_init ,
. exit = pcm970_sdhc1_exit ,
} ;
2008-07-05 10:02:52 +02:00
static struct platform_device * devices [ ] __initdata = {
& pcm037_flash ,
2008-11-11 15:12:00 +01:00
& pcm037_eth ,
2008-11-23 17:32:49 +01:00
& pcm037_sram_device ,
2008-07-05 10:02:52 +02:00
} ;
2009-01-28 15:13:54 +01:00
static int uart0_pins [ ] = {
MX31_PIN_CTS1__CTS1 ,
MX31_PIN_RTS1__RTS1 ,
MX31_PIN_TXD1__TXD1 ,
MX31_PIN_RXD1__RXD1
} ;
static int uart2_pins [ ] = {
MX31_PIN_CSPI3_MOSI__RXD3 ,
MX31_PIN_CSPI3_MISO__TXD3
} ;
2008-07-05 10:02:52 +02:00
/*
* Board specific initialization .
*/
static void __init mxc_board_init ( void )
{
platform_add_devices ( devices , ARRAY_SIZE ( devices ) ) ;
2009-01-28 15:13:54 +01:00
mxc_iomux_setup_multiple_pins ( uart0_pins , ARRAY_SIZE ( uart0_pins ) , " uart-0 " ) ;
2008-09-09 10:19:41 +02:00
mxc_register_device ( & mxc_uart_device0 , & uart_pdata ) ;
2008-07-05 10:02:52 +02:00
2009-01-28 15:13:54 +01:00
mxc_iomux_setup_multiple_pins ( uart2_pins , ARRAY_SIZE ( uart2_pins ) , " uart-2 " ) ;
2008-09-09 10:19:41 +02:00
mxc_register_device ( & mxc_uart_device2 , & uart_pdata ) ;
2008-12-01 14:15:40 -08:00
2009-01-28 15:13:54 +01:00
mxc_iomux_setup_pin ( MX31_PIN_BATT_LINE__OWIRE , " batt-0wire " ) ;
2008-12-01 14:15:40 -08:00
mxc_register_device ( & mxc_w1_master_device , NULL ) ;
2008-11-11 15:12:00 +01:00
2009-04-04 13:40:39 +02:00
/* LAN9217 IRQ pin */
2009-01-28 15:13:54 +01:00
if ( ! mxc_iomux_setup_pin ( IOMUX_MODE ( MX31_PIN_GPIO3_1 , IOMUX_CONFIG_GPIO ) ,
" pcm037-eth " ) )
2009-04-04 13:40:39 +02:00
gpio_direction_input ( IOMUX_TO_GPIO ( MX31_PIN_GPIO3_1 ) ) ;
2008-11-23 17:34:04 +01:00
2009-01-28 17:10:32 +01:00
# ifdef CONFIG_I2C_IMX
i2c_register_board_info ( 1 , pcm037_i2c_devices ,
ARRAY_SIZE ( pcm037_i2c_devices ) ) ;
mxc_register_device ( & mxc_i2c_device1 , & pcm037_i2c_1_data ) ;
# endif
2008-11-23 17:34:04 +01:00
mxc_register_device ( & mxc_nand_device , & pcm037_nand_board_info ) ;
2008-11-11 15:03:28 +01:00
mxc_register_device ( & mxcsdhc_device0 , & sdhc_pdata ) ;
2008-07-05 10:02:52 +02:00
}
static void __init pcm037_timer_init ( void )
{
2009-02-16 14:36:49 +01:00
mx31_clocks_init ( 26000000 ) ;
2008-07-05 10:02:52 +02:00
}
struct sys_timer pcm037_timer = {
. init = pcm037_timer_init ,
} ;
MACHINE_START ( PCM037 , " Phytec Phycore pcm037 " )
/* Maintainer: Pengutronix */
. phys_io = AIPS1_BASE_ADDR ,
. io_pg_offst = ( ( AIPS1_BASE_ADDR_VIRT ) > > 18 ) & 0xfffc ,
. boot_params = PHYS_OFFSET + 0x100 ,
2009-02-06 18:15:06 +01:00
. map_io = mxc_map_io ,
2008-07-05 10:02:52 +02:00
. init_irq = mxc_init_irq ,
. init_machine = mxc_board_init ,
. timer = & pcm037_timer ,
MACHINE_END