2008-01-23 16:54:50 +03:00
/*
2009-03-13 18:37:08 +03:00
* linux / arch / arm / mach - pxa / colibri - pxa270 . c
2008-01-23 16:54:50 +03:00
*
2009-03-13 18:37:08 +03:00
* Support for Toradex PXA270 based Colibri module
2008-01-23 16:54:50 +03:00
* Daniel Mack < daniel @ caiaq . de >
2010-05-22 02:29:33 +04:00
* Marek Vasut < marek . vasut @ gmail . com >
2008-01-23 16:54:50 +03:00
*
* 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/init.h>
# include <linux/interrupt.h>
2011-09-18 22:50:33 +04:00
# include <linux/moduleparam.h>
2010-05-22 02:29:38 +04:00
# include <linux/kernel.h>
2008-01-23 16:54:50 +03:00
# include <linux/mtd/mtd.h>
# include <linux/mtd/partitions.h>
# include <linux/mtd/physmap.h>
2010-05-22 02:29:38 +04:00
# include <linux/platform_device.h>
2015-07-11 22:33:06 +03:00
# include <linux/regulator/machine.h>
2010-05-22 02:29:37 +04:00
# include <linux/ucb1400.h>
2010-05-22 02:29:38 +04:00
2008-01-23 16:54:50 +03:00
# include <asm/mach/arch.h>
# include <asm/mach/flash.h>
2010-05-22 02:29:38 +04:00
# include <asm/mach-types.h>
# include <asm/sizes.h>
2009-01-02 18:17:22 +03:00
2010-05-22 02:29:37 +04:00
# include <mach/audio.h>
2015-01-30 12:45:33 +03:00
# include "colibri.h"
# include "pxa27x.h"
2008-01-23 16:54:50 +03:00
# include "devices.h"
2010-05-22 02:29:38 +04:00
# include "generic.h"
2008-01-23 16:54:50 +03:00
2010-08-12 03:18:38 +04:00
/******************************************************************************
* Evaluation board MFP
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2010-08-12 03:45:05 +04:00
# ifdef CONFIG_MACH_COLIBRI_EVALBOARD
2010-08-12 03:18:38 +04:00
static mfp_cfg_t colibri_pxa270_evalboard_pin_config [ ] __initdata = {
/* MMC */
GPIO32_MMC_CLK ,
GPIO92_MMC_DAT_0 ,
GPIO109_MMC_DAT_1 ,
GPIO110_MMC_DAT_2 ,
GPIO111_MMC_DAT_3 ,
GPIO112_MMC_CMD ,
GPIO0_GPIO , /* SD detect */
/* FFUART */
GPIO39_FFUART_TXD ,
GPIO34_FFUART_RXD ,
/* UHC */
GPIO88_USBH1_PWR ,
GPIO89_USBH1_PEN ,
GPIO119_USBH2_PWR ,
GPIO120_USBH2_PEN ,
/* PCMCIA */
GPIO85_nPCE_1 ,
GPIO54_nPCE_2 ,
GPIO55_nPREG ,
GPIO50_nPIOR ,
GPIO51_nPIOW ,
GPIO49_nPWE ,
GPIO48_nPOE ,
GPIO57_nIOIS16 ,
GPIO56_nPWAIT ,
GPIO104_PSKTSEL ,
GPIO53_GPIO , /* RESET */
GPIO83_GPIO , /* BVD1 */
GPIO82_GPIO , /* BVD2 */
GPIO1_GPIO , /* READY */
GPIO84_GPIO , /* DETECT */
GPIO107_GPIO , /* PPEN */
2010-08-12 03:30:39 +04:00
/* I2C */
GPIO117_I2C_SCL ,
GPIO118_I2C_SDA ,
2010-08-12 03:18:38 +04:00
} ;
# else
static mfp_cfg_t colibri_pxa270_evalboard_pin_config [ ] __initdata = { } ;
# endif
# ifdef CONFIG_MACH_COLIBRI_PXA270_INCOME
static mfp_cfg_t income_pin_config [ ] __initdata = {
/* MMC */
GPIO32_MMC_CLK ,
GPIO92_MMC_DAT_0 ,
GPIO109_MMC_DAT_1 ,
GPIO110_MMC_DAT_2 ,
GPIO111_MMC_DAT_3 ,
GPIO112_MMC_CMD ,
GPIO0_GPIO , /* SD detect */
GPIO1_GPIO , /* SD read-only */
/* FFUART */
GPIO39_FFUART_TXD ,
GPIO34_FFUART_RXD ,
/* BFUART */
GPIO42_BTUART_RXD ,
GPIO43_BTUART_TXD ,
GPIO45_BTUART_RTS ,
/* STUART */
GPIO46_STUART_RXD ,
GPIO47_STUART_TXD ,
/* UHC */
GPIO88_USBH1_PWR ,
GPIO89_USBH1_PEN ,
/* LCD */
GPIOxx_LCD_TFT_16BPP ,
/* PWM */
GPIO16_PWM0_OUT ,
/* I2C */
GPIO117_I2C_SCL ,
GPIO118_I2C_SDA ,
/* LED */
GPIO54_GPIO , /* LED A */
GPIO55_GPIO , /* LED B */
} ;
# else
static mfp_cfg_t income_pin_config [ ] __initdata = { } ;
# endif
2010-05-22 02:29:33 +04:00
/******************************************************************************
* Pin configuration
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2009-03-13 18:37:08 +03:00
static mfp_cfg_t colibri_pxa270_pin_config [ ] __initdata = {
2010-05-22 02:29:33 +04:00
/* Ethernet */
2008-08-08 10:59:03 +04:00
GPIO78_nCS_2 , /* Ethernet CS */
GPIO114_GPIO , /* Ethernet IRQ */
2010-05-22 02:29:34 +04:00
2010-05-22 02:29:37 +04:00
/* AC97 */
GPIO28_AC97_BITCLK ,
GPIO29_AC97_SDATA_IN_0 ,
GPIO30_AC97_SDATA_OUT ,
GPIO31_AC97_SYNC ,
GPIO95_AC97_nRESET ,
GPIO98_AC97_SYSCLK ,
GPIO113_GPIO , /* Touchscreen IRQ */
2008-08-08 10:59:03 +04:00
} ;
2010-05-22 02:29:33 +04:00
/******************************************************************************
* NOR Flash
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
# if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE)
2008-01-23 16:54:50 +03:00
static struct mtd_partition colibri_partitions [ ] = {
{
. name = " Bootloader " ,
. offset = 0x00000000 ,
. size = 0x00040000 ,
2010-05-22 02:29:33 +04:00
. mask_flags = MTD_WRITEABLE /* force read-only */
2008-01-23 16:54:50 +03:00
} , {
. name = " Kernel " ,
. offset = 0x00040000 ,
. size = 0x00400000 ,
. mask_flags = 0
} , {
. name = " Rootfs " ,
. offset = 0x00440000 ,
. size = MTDPART_SIZ_FULL ,
. mask_flags = 0
}
} ;
static struct physmap_flash_data colibri_flash_data [ ] = {
{
. width = 4 , /* bankwidth in bytes */
. parts = colibri_partitions ,
. nr_parts = ARRAY_SIZE ( colibri_partitions )
}
} ;
2009-03-13 18:37:08 +03:00
static struct resource colibri_pxa270_flash_resource = {
2008-01-23 16:54:50 +03:00
. start = PXA_CS0_PHYS ,
. end = PXA_CS0_PHYS + SZ_32M - 1 ,
. flags = IORESOURCE_MEM ,
} ;
2009-03-13 18:37:08 +03:00
static struct platform_device colibri_pxa270_flash_device = {
2008-01-23 16:54:50 +03:00
. name = " physmap-flash " ,
. id = 0 ,
. dev = {
. platform_data = colibri_flash_data ,
} ,
2009-03-13 18:37:08 +03:00
. resource = & colibri_pxa270_flash_resource ,
2008-01-23 16:54:50 +03:00
. num_resources = 1 ,
} ;
2010-05-22 02:29:33 +04:00
static void __init colibri_pxa270_nor_init ( void )
{
platform_device_register ( & colibri_pxa270_flash_device ) ;
}
# else
static inline void colibri_pxa270_nor_init ( void ) { }
# endif
/******************************************************************************
* Ethernet
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
# if defined(CONFIG_DM9000) || defined(CONFIG_DM9000_MODULE)
static struct resource colibri_pxa270_dm9000_resources [ ] = {
2010-05-22 02:29:39 +04:00
{
2010-05-22 02:29:33 +04:00
. start = PXA_CS2_PHYS ,
. end = PXA_CS2_PHYS + 3 ,
2008-01-23 16:54:50 +03:00
. flags = IORESOURCE_MEM ,
} ,
2010-05-22 02:29:39 +04:00
{
2010-05-22 02:29:33 +04:00
. start = PXA_CS2_PHYS + 4 ,
. end = PXA_CS2_PHYS + 4 + 500 ,
2008-01-23 16:54:50 +03:00
. flags = IORESOURCE_MEM ,
} ,
2010-05-22 02:29:39 +04:00
{
2011-10-10 12:03:51 +04:00
. start = PXA_GPIO_TO_IRQ ( GPIO114_COLIBRI_PXA270_ETH_IRQ ) ,
. end = PXA_GPIO_TO_IRQ ( GPIO114_COLIBRI_PXA270_ETH_IRQ ) ,
2008-05-15 03:29:24 +04:00
. flags = IORESOURCE_IRQ | IRQF_TRIGGER_RISING ,
2008-01-23 16:54:50 +03:00
} ,
} ;
2010-05-22 02:29:33 +04:00
static struct platform_device colibri_pxa270_dm9000_device = {
2008-01-23 16:54:50 +03:00
. name = " dm9000 " ,
. id = - 1 ,
2010-05-22 02:29:33 +04:00
. num_resources = ARRAY_SIZE ( colibri_pxa270_dm9000_resources ) ,
. resource = colibri_pxa270_dm9000_resources ,
2008-01-23 16:54:50 +03:00
} ;
2010-05-22 02:29:33 +04:00
static void __init colibri_pxa270_eth_init ( void )
{
platform_device_register ( & colibri_pxa270_dm9000_device ) ;
}
# else
static inline void colibri_pxa270_eth_init ( void ) { }
2009-03-13 18:37:08 +03:00
# endif
2008-01-23 16:54:50 +03:00
2010-05-22 02:29:37 +04:00
/******************************************************************************
* Audio and Touchscreen
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
# if defined(CONFIG_TOUCHSCREEN_UCB1400) || \
defined ( CONFIG_TOUCHSCREEN_UCB1400_MODULE )
static pxa2xx_audio_ops_t colibri_pxa270_ac97_pdata = {
. reset_gpio = 95 ,
} ;
static struct ucb1400_pdata colibri_pxa270_ucb1400_pdata = {
2011-10-10 12:03:51 +04:00
. irq = PXA_GPIO_TO_IRQ ( GPIO113_COLIBRI_PXA270_TS_IRQ ) ,
2010-05-22 02:29:37 +04:00
} ;
static struct platform_device colibri_pxa270_ucb1400_device = {
. name = " ucb1400_core " ,
. id = - 1 ,
. dev = {
. platform_data = & colibri_pxa270_ucb1400_pdata ,
} ,
} ;
static void __init colibri_pxa270_tsc_init ( void )
{
pxa_set_ac97_info ( & colibri_pxa270_ac97_pdata ) ;
platform_device_register ( & colibri_pxa270_ucb1400_device ) ;
}
# else
static inline void colibri_pxa270_tsc_init ( void ) { }
# endif
2010-05-22 02:29:38 +04:00
static int colibri_pxa270_baseboard ;
core_param ( colibri_pxa270_baseboard , colibri_pxa270_baseboard , int , 0444 ) ;
2009-03-13 18:37:08 +03:00
static void __init colibri_pxa270_init ( void )
2008-01-23 16:54:50 +03:00
{
2009-03-13 18:37:08 +03:00
pxa2xx_mfp_config ( ARRAY_AND_SIZE ( colibri_pxa270_pin_config ) ) ;
2010-05-22 02:29:33 +04:00
colibri_pxa270_nor_init ( ) ;
colibri_pxa270_eth_init ( ) ;
2010-05-22 02:29:37 +04:00
colibri_pxa270_tsc_init ( ) ;
2010-05-22 02:29:38 +04:00
switch ( colibri_pxa270_baseboard ) {
2010-08-12 03:45:05 +04:00
case COLIBRI_EVALBOARD :
2010-08-12 03:18:38 +04:00
pxa2xx_mfp_config ( ARRAY_AND_SIZE (
colibri_pxa270_evalboard_pin_config ) ) ;
2010-08-12 03:45:05 +04:00
colibri_evalboard_init ( ) ;
2010-05-22 02:29:38 +04:00
break ;
2010-05-22 02:29:39 +04:00
case COLIBRI_PXA270_INCOME :
2010-08-12 03:18:38 +04:00
pxa2xx_mfp_config ( ARRAY_AND_SIZE ( income_pin_config ) ) ;
2010-05-22 02:29:39 +04:00
colibri_pxa270_income_boardinit ( ) ;
break ;
2010-05-22 02:29:38 +04:00
default :
printk ( KERN_ERR " Illegal colibri_pxa270_baseboard type %d \n " ,
colibri_pxa270_baseboard ) ;
}
2015-07-11 22:33:06 +03:00
regulator_has_full_constraints ( ) ;
2008-01-23 16:54:50 +03:00
}
2010-05-22 02:29:39 +04:00
/* The "Income s.r.o. SH-Dmaster PXA270 SBC" board can be booted either
* with the INCOME mach type or with COLIBRI and the kernel parameter
* " colibri_pxa270_baseboard=1 "
*/
static void __init colibri_pxa270_income_init ( void )
{
colibri_pxa270_baseboard = COLIBRI_PXA270_INCOME ;
colibri_pxa270_init ( ) ;
}
2009-03-13 18:37:08 +03:00
MACHINE_START ( COLIBRI , " Toradex Colibri PXA270 " )
2011-07-06 06:38:15 +04:00
. atag_offset = 0x100 ,
2009-03-13 18:37:08 +03:00
. init_machine = colibri_pxa270_init ,
2010-10-11 04:20:19 +04:00
. map_io = pxa27x_map_io ,
2012-01-04 02:53:48 +04:00
. nr_irqs = PXA_NR_IRQS ,
2008-01-23 16:54:50 +03:00
. init_irq = pxa27x_init_irq ,
2011-05-18 17:30:04 +04:00
. handle_irq = pxa27x_handle_irq ,
2012-11-08 23:40:59 +04:00
. init_time = pxa_timer_init ,
2011-11-04 18:15:53 +04:00
. restart = pxa_restart ,
2008-01-23 16:54:50 +03:00
MACHINE_END
2009-03-13 18:37:08 +03:00
2010-05-22 02:29:39 +04:00
MACHINE_START ( INCOME , " Income s.r.o. SH-Dmaster PXA270 SBC " )
2011-07-06 06:38:15 +04:00
. atag_offset = 0x100 ,
2010-05-22 02:29:39 +04:00
. init_machine = colibri_pxa270_income_init ,
2010-10-11 04:20:19 +04:00
. map_io = pxa27x_map_io ,
2012-01-04 02:53:48 +04:00
. nr_irqs = PXA_NR_IRQS ,
2010-05-22 02:29:39 +04:00
. init_irq = pxa27x_init_irq ,
2011-05-18 17:30:04 +04:00
. handle_irq = pxa27x_handle_irq ,
2012-11-08 23:40:59 +04:00
. init_time = pxa_timer_init ,
2011-11-04 18:15:53 +04:00
. restart = pxa_restart ,
2010-05-22 02:29:39 +04:00
MACHINE_END