2006-04-02 17:46:30 +01:00
/*
2006-10-03 23:01:26 +02:00
* linux / arch / arm / mach - omap2 / board - apollon . c
2006-04-02 17:46:30 +01:00
*
* Copyright ( C ) 2005 , 2006 Samsung Electronics
* Author : Kyungmin Park < kyungmin . park @ samsung . com >
*
* Modified from mach - omap / omap2 / board - h4 . c
*
* Code for apollon OMAP2 board . Should work on many OMAP2 systems where
* the bootloader passes the board - specific data to the kernel .
* Do not put any board specific code to this file ; create a new machine
* type if you need custom low - level initializations .
*
* 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/kernel.h>
# include <linux/init.h>
# include <linux/platform_device.h>
# include <linux/mtd/mtd.h>
# include <linux/mtd/partitions.h>
# include <linux/mtd/onenand.h>
# include <linux/delay.h>
2006-12-06 17:13:53 -08:00
# include <linux/leds.h>
2008-03-18 10:04:51 +02:00
# include <linux/err.h>
# include <linux/clk.h>
2009-12-11 16:16:33 -08:00
# include <linux/smc91x.h>
2011-05-31 20:55:44 +08:00
# include <linux/gpio.h>
2006-04-02 17:46:30 +01:00
2008-08-05 16:14:15 +01:00
# include <mach/hardware.h>
2006-04-02 17:46:30 +01:00
# include <asm/mach-types.h>
# include <asm/mach/arch.h>
# include <asm/mach/flash.h>
2009-10-20 09:40:47 -07:00
# include <plat/led.h>
# include <plat/usb.h>
# include <plat/board.h>
2011-11-10 22:45:17 +01:00
# include "common.h"
2009-10-20 09:40:47 -07:00
# include <plat/gpmc.h>
2006-04-02 17:46:30 +01:00
2011-05-09 10:13:20 +03:00
# include <video/omapdss.h>
# include <video/omap-panel-generic-dpi.h>
2010-07-05 16:31:37 +03:00
# include "mux.h"
2010-10-08 11:40:20 -06:00
# include "control.h"
2010-07-05 16:31:37 +03:00
2006-04-02 17:46:30 +01:00
/* LED & Switch macros */
# define LED0_GPIO13 13
# define LED1_GPIO14 14
# define LED2_GPIO15 15
# define SW_ENTER_GPIO16 16
# define SW_UP_GPIO17 17
# define SW_DOWN_GPIO58 58
2006-12-06 17:13:53 -08:00
# define APOLLON_FLASH_CS 0
# define APOLLON_ETH_CS 1
2009-03-23 18:07:35 -07:00
# define APOLLON_ETHR_GPIO_IRQ 74
2006-12-06 17:13:53 -08:00
2006-04-02 17:46:30 +01:00
static struct mtd_partition apollon_partitions [ ] = {
{
. name = " X-Loader + U-Boot " ,
. offset = 0 ,
. size = SZ_128K ,
. mask_flags = MTD_WRITEABLE ,
} ,
{
. name = " params " ,
. offset = MTDPART_OFS_APPEND ,
. size = SZ_128K ,
} ,
{
. name = " kernel " ,
. offset = MTDPART_OFS_APPEND ,
. size = SZ_2M ,
} ,
{
. name = " rootfs " ,
. offset = MTDPART_OFS_APPEND ,
. size = SZ_16M ,
} ,
{
. name = " filesystem00 " ,
. offset = MTDPART_OFS_APPEND ,
. size = SZ_32M ,
} ,
{
. name = " filesystem01 " ,
. offset = MTDPART_OFS_APPEND ,
. size = MTDPART_SIZ_FULL ,
} ,
} ;
2009-09-18 12:51:44 -07:00
static struct onenand_platform_data apollon_flash_data = {
2006-04-02 17:46:30 +01:00
. parts = apollon_partitions ,
. nr_parts = ARRAY_SIZE ( apollon_partitions ) ,
} ;
2006-12-06 17:13:53 -08:00
static struct resource apollon_flash_resource [ ] = {
[ 0 ] = {
. flags = IORESOURCE_MEM ,
} ,
2006-04-02 17:46:30 +01:00
} ;
static struct platform_device apollon_onenand_device = {
2009-09-18 12:51:44 -07:00
. name = " onenand-flash " ,
2006-04-02 17:46:30 +01:00
. id = - 1 ,
. dev = {
. platform_data = & apollon_flash_data ,
} ,
2006-12-06 17:13:53 -08:00
. num_resources = ARRAY_SIZE ( apollon_flash_resource ) ,
. resource = apollon_flash_resource ,
2006-04-02 17:46:30 +01:00
} ;
2006-12-06 17:13:53 -08:00
static void __init apollon_flash_init ( void )
{
unsigned long base ;
if ( gpmc_cs_request ( APOLLON_FLASH_CS , SZ_128K , & base ) < 0 ) {
printk ( KERN_ERR " Cannot request OneNAND GPMC CS \n " ) ;
return ;
}
apollon_flash_resource [ 0 ] . start = base ;
apollon_flash_resource [ 0 ] . end = base + SZ_128K - 1 ;
}
2009-12-11 16:16:33 -08:00
static struct smc91x_platdata appolon_smc91x_info = {
. flags = SMC91X_USE_16BIT | SMC91X_NOWAIT ,
. leda = RPC_LED_100_10 ,
. ledb = RPC_LED_TX_RX ,
} ;
2006-04-02 17:46:30 +01:00
static struct resource apollon_smc91x_resources [ ] = {
[ 0 ] = {
. flags = IORESOURCE_MEM ,
} ,
[ 1 ] = {
2008-01-14 22:30:10 +00:00
. flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE ,
2006-04-02 17:46:30 +01:00
} ,
} ;
static struct platform_device apollon_smc91x_device = {
. name = " smc91x " ,
. id = - 1 ,
2009-12-11 16:16:33 -08:00
. dev = {
. platform_data = & appolon_smc91x_info ,
} ,
2006-04-02 17:46:30 +01:00
. num_resources = ARRAY_SIZE ( apollon_smc91x_resources ) ,
. resource = apollon_smc91x_resources ,
} ;
2006-12-06 17:13:53 -08:00
static struct omap_led_config apollon_led_config [ ] = {
{
. cdev = {
. name = " apollon:led0 " ,
} ,
. gpio = LED0_GPIO13 ,
} ,
{
. cdev = {
. name = " apollon:led1 " ,
} ,
. gpio = LED1_GPIO14 ,
} ,
{
. cdev = {
. name = " apollon:led2 " ,
} ,
. gpio = LED2_GPIO15 ,
} ,
} ;
static struct omap_led_platform_data apollon_led_data = {
. nr_leds = ARRAY_SIZE ( apollon_led_config ) ,
. leds = apollon_led_config ,
} ;
static struct platform_device apollon_led_device = {
. name = " omap-led " ,
. id = - 1 ,
. dev = {
. platform_data = & apollon_led_data ,
} ,
} ;
2006-04-02 17:46:30 +01:00
static struct platform_device * apollon_devices [ ] __initdata = {
& apollon_onenand_device ,
& apollon_smc91x_device ,
2006-12-06 17:13:53 -08:00
& apollon_led_device ,
2006-04-02 17:46:30 +01:00
} ;
static inline void __init apollon_init_smc91x ( void )
{
2006-12-06 17:13:53 -08:00
unsigned long base ;
2008-03-18 10:04:51 +02:00
unsigned int rate ;
struct clk * gpmc_fck ;
int eth_cs ;
2011-05-03 18:22:09 +03:00
int err ;
2008-03-18 10:04:51 +02:00
gpmc_fck = clk_get ( NULL , " gpmc_fck " ) ; /* Always on ENABLE_ON_INIT */
if ( IS_ERR ( gpmc_fck ) ) {
WARN_ON ( 1 ) ;
return ;
}
clk_enable ( gpmc_fck ) ;
rate = clk_get_rate ( gpmc_fck ) ;
eth_cs = APOLLON_ETH_CS ;
2006-04-02 17:46:30 +01:00
/* Make sure CS1 timings are correct */
2008-03-18 10:04:51 +02:00
gpmc_cs_write_reg ( eth_cs , GPMC_CS_CONFIG1 , 0x00011200 ) ;
if ( rate > = 160000000 ) {
gpmc_cs_write_reg ( eth_cs , GPMC_CS_CONFIG2 , 0x001f1f01 ) ;
gpmc_cs_write_reg ( eth_cs , GPMC_CS_CONFIG3 , 0x00080803 ) ;
gpmc_cs_write_reg ( eth_cs , GPMC_CS_CONFIG4 , 0x1c0b1c0a ) ;
gpmc_cs_write_reg ( eth_cs , GPMC_CS_CONFIG5 , 0x041f1F1F ) ;
gpmc_cs_write_reg ( eth_cs , GPMC_CS_CONFIG6 , 0x000004C4 ) ;
} else if ( rate > = 130000000 ) {
gpmc_cs_write_reg ( eth_cs , GPMC_CS_CONFIG2 , 0x001f1f00 ) ;
gpmc_cs_write_reg ( eth_cs , GPMC_CS_CONFIG3 , 0x00080802 ) ;
gpmc_cs_write_reg ( eth_cs , GPMC_CS_CONFIG4 , 0x1C091C09 ) ;
gpmc_cs_write_reg ( eth_cs , GPMC_CS_CONFIG5 , 0x041f1F1F ) ;
gpmc_cs_write_reg ( eth_cs , GPMC_CS_CONFIG6 , 0x000004C4 ) ;
} else { /* rate = 100000000 */
gpmc_cs_write_reg ( eth_cs , GPMC_CS_CONFIG2 , 0x001f1f00 ) ;
gpmc_cs_write_reg ( eth_cs , GPMC_CS_CONFIG3 , 0x00080802 ) ;
gpmc_cs_write_reg ( eth_cs , GPMC_CS_CONFIG4 , 0x1C091C09 ) ;
gpmc_cs_write_reg ( eth_cs , GPMC_CS_CONFIG5 , 0x031A1F1F ) ;
gpmc_cs_write_reg ( eth_cs , GPMC_CS_CONFIG6 , 0x000003C2 ) ;
}
2006-12-06 17:13:53 -08:00
if ( gpmc_cs_request ( APOLLON_ETH_CS , SZ_16M , & base ) < 0 ) {
printk ( KERN_ERR " Failed to request GPMC CS for smc91x \n " ) ;
2008-03-18 10:04:51 +02:00
goto out ;
2006-12-06 17:13:53 -08:00
}
apollon_smc91x_resources [ 0 ] . start = base + 0x300 ;
apollon_smc91x_resources [ 0 ] . end = base + 0x30f ;
2006-04-02 17:46:30 +01:00
udelay ( 100 ) ;
2011-05-03 18:22:09 +03:00
omap_mux_init_gpio ( APOLLON_ETHR_GPIO_IRQ , 0 ) ;
err = gpio_request_one ( APOLLON_ETHR_GPIO_IRQ , GPIOF_IN , " SMC91x irq " ) ;
if ( err ) {
2006-04-02 17:46:30 +01:00
printk ( KERN_ERR " Failed to request GPIO%d for smc91x IRQ \n " ,
APOLLON_ETHR_GPIO_IRQ ) ;
2006-12-06 17:13:53 -08:00
gpmc_cs_free ( APOLLON_ETH_CS ) ;
2006-04-02 17:46:30 +01:00
}
2008-03-18 10:04:51 +02:00
out :
clk_disable ( gpmc_fck ) ;
clk_put ( gpmc_fck ) ;
2006-04-02 17:46:30 +01:00
}
2006-12-06 17:13:53 -08:00
static struct omap_usb_config apollon_usb_config __initdata = {
. register_dev = 1 ,
. hmc_mode = 0x14 , /* 0:dev 1:host1 2:disable */
. pins [ 0 ] = 6 ,
} ;
2011-05-09 10:13:20 +03:00
static struct panel_generic_dpi_data apollon_panel_data = {
. name = " apollon " ,
2006-04-02 17:46:30 +01:00
} ;
2011-05-09 10:13:20 +03:00
static struct omap_dss_device apollon_lcd_device = {
. name = " lcd " ,
. driver_name = " generic_dpi_panel " ,
. type = OMAP_DISPLAY_TYPE_DPI ,
. phy . dpi . data_lines = 18 ,
. data = & apollon_panel_data ,
} ;
static struct omap_dss_device * apollon_dss_devices [ ] = {
& apollon_lcd_device ,
2006-04-02 17:46:30 +01:00
} ;
2011-05-09 10:13:20 +03:00
static struct omap_dss_board_info apollon_dss_data = {
. num_devices = ARRAY_SIZE ( apollon_dss_devices ) ,
. devices = apollon_dss_devices ,
. default_device = & apollon_lcd_device ,
2006-04-02 17:46:30 +01:00
} ;
2011-05-03 18:22:09 +03:00
static struct gpio apollon_gpio_leds [ ] __initdata = {
{ LED0_GPIO13 , GPIOF_OUT_INIT_LOW , " LED0 " } , /* LED0 - AA10 */
{ LED1_GPIO14 , GPIOF_OUT_INIT_LOW , " LED1 " } , /* LED1 - AA6 */
{ LED2_GPIO15 , GPIOF_OUT_INIT_LOW , " LED2 " } , /* LED2 - AA4 */
} ;
2006-04-02 17:46:30 +01:00
static void __init apollon_led_init ( void )
{
2010-07-05 16:31:40 +03:00
omap_mux_init_signal ( " vlynq_clk.gpio_13 " , 0 ) ;
omap_mux_init_signal ( " vlynq_rx1.gpio_14 " , 0 ) ;
omap_mux_init_signal ( " vlynq_rx0.gpio_15 " , 0 ) ;
2011-05-03 18:22:09 +03:00
gpio_request_array ( apollon_gpio_leds , ARRAY_SIZE ( apollon_gpio_leds ) ) ;
2006-04-02 17:46:30 +01:00
}
2006-12-06 17:13:53 -08:00
static void __init apollon_usb_init ( void )
{
/* USB device */
/* DEVICE_SUSPEND */
2010-07-05 16:31:40 +03:00
omap_mux_init_signal ( " mcbsp2_clkx.gpio_12 " , 0 ) ;
2011-05-03 18:22:09 +03:00
gpio_request_one ( 12 , GPIOF_OUT_INIT_LOW , " USB suspend " ) ;
2010-07-05 16:31:29 +03:00
omap2_usbfs_init ( & apollon_usb_config ) ;
2006-12-06 17:13:53 -08:00
}
2010-07-05 16:31:37 +03:00
# ifdef CONFIG_OMAP_MUX
static struct omap_board_mux board_mux [ ] __initdata = {
{ . reg_offset = OMAP_MUX_TERMINATOR } ,
} ;
# endif
2006-04-02 17:46:30 +01:00
static void __init omap_apollon_init ( void )
{
2008-03-18 10:04:51 +02:00
u32 v ;
2010-07-05 16:31:37 +03:00
omap2420_mux_init ( board_mux , OMAP_PACKAGE_ZAC ) ;
2010-12-07 16:26:55 -08:00
apollon_init_smc91x ( ) ;
2006-04-02 17:46:30 +01:00
apollon_led_init ( ) ;
2006-12-06 17:13:53 -08:00
apollon_flash_init ( ) ;
apollon_usb_init ( ) ;
2006-04-02 17:46:30 +01:00
/* REVISIT: where's the correct place */
2010-07-05 16:31:40 +03:00
omap_mux_init_signal ( " sys_nirq " , OMAP_PULL_ENA | OMAP_PULL_UP ) ;
2006-04-02 17:46:30 +01:00
2010-07-05 16:31:39 +03:00
/* LCD PWR_EN */
omap_mux_init_signal ( " mcbsp2_dr.gpio_11 " , OMAP_PULL_ENA | OMAP_PULL_UP ) ;
2006-09-25 12:41:25 +03:00
/* Use Interal loop-back in MMC/SDIO Module Input Clock selection */
2008-03-18 10:04:51 +02:00
v = omap_ctrl_readl ( OMAP2_CONTROL_DEVCONF0 ) ;
v | = ( 1 < < 24 ) ;
omap_ctrl_writel ( v , OMAP2_CONTROL_DEVCONF0 ) ;
2006-09-25 12:41:25 +03:00
2006-04-02 17:46:30 +01:00
/*
* Make sure the serial ports are muxed on at this point .
* You have to mux them off in device drivers later on
* if not needed .
*/
2012-03-29 08:41:01 -07:00
apollon_smc91x_resources [ 1 ] . start = gpio_to_irq ( APOLLON_ETHR_GPIO_IRQ ) ;
apollon_smc91x_resources [ 1 ] . end = gpio_to_irq ( APOLLON_ETHR_GPIO_IRQ ) ;
2006-04-02 17:46:30 +01:00
platform_add_devices ( apollon_devices , ARRAY_SIZE ( apollon_devices ) ) ;
omap_serial_init ( ) ;
2011-08-22 23:57:23 -07:00
omap_sdrc_init ( NULL , NULL ) ;
2011-05-09 10:13:20 +03:00
omap_display_init ( & apollon_dss_data ) ;
2006-04-02 17:46:30 +01:00
}
MACHINE_START ( OMAP_APOLLON , " OMAP24xx Apollon " )
/* Maintainer: Kyungmin Park <kyungmin.park@samsung.com> */
2011-07-05 22:38:15 -04:00
. atag_offset = 0x100 ,
2010-05-23 10:18:16 +01:00
. reserve = omap_reserve ,
2011-09-26 14:52:55 -07:00
. map_io = omap242x_map_io ,
2011-08-22 23:57:24 -07:00
. init_early = omap2420_init_early ,
2011-05-17 03:51:26 -07:00
. init_irq = omap2_init_irq ,
2011-09-06 10:23:45 +01:00
. handle_irq = omap2_intc_handle_irq ,
2006-04-02 17:46:30 +01:00
. init_machine = omap_apollon_init ,
2012-04-26 16:06:50 +08:00
. init_late = omap2420_init_late ,
2011-03-29 15:54:48 -07:00
. timer = & omap2_timer ,
2011-11-05 17:06:28 +00:00
. restart = omap_prcm_restart ,
2006-04-02 17:46:30 +01:00
MACHINE_END