2010-12-17 15:13:47 -08:00
/*
2012-03-05 11:08:37 -08:00
* Board support file for Nokia RM - 680 / 696.
2010-12-17 15:13:47 -08:00
*
* Copyright ( C ) 2010 Nokia
*
* 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/io.h>
# include <linux/i2c.h>
# include <linux/gpio.h>
# include <linux/init.h>
# include <linux/i2c/twl.h>
# include <linux/platform_device.h>
# include <linux/regulator/fixed.h>
# include <linux/regulator/machine.h>
# include <linux/regulator/consumer.h>
# include <asm/mach/arch.h>
# include <asm/mach-types.h>
# include <plat/i2c.h>
# include <plat/mmc.h>
# include <plat/usb.h>
# include <plat/gpmc.h>
2011-11-10 22:45:17 +01:00
# include "common.h"
2010-12-17 15:13:47 -08:00
# include <plat/onenand.h>
2012-08-27 17:43:01 -07:00
# include <plat/serial.h>
2010-12-17 15:13:47 -08:00
# include "mux.h"
# include "hsmmc.h"
# include "sdram-nokia.h"
2011-04-25 01:09:06 +03:00
# include "common-board-devices.h"
2010-12-17 15:13:47 -08:00
static struct regulator_consumer_supply rm680_vemmc_consumers [ ] = {
2011-02-28 20:48:05 +05:30
REGULATOR_SUPPLY ( " vmmc " , " omap_hsmmc.1 " ) ,
2010-12-17 15:13:47 -08:00
} ;
/* Fixed regulator for internal eMMC */
static struct regulator_init_data rm680_vemmc = {
. constraints = {
. name = " rm680_vemmc " ,
. valid_modes_mask = REGULATOR_MODE_NORMAL
| REGULATOR_MODE_STANDBY ,
. valid_ops_mask = REGULATOR_CHANGE_STATUS
| REGULATOR_CHANGE_MODE ,
} ,
. num_consumer_supplies = ARRAY_SIZE ( rm680_vemmc_consumers ) ,
. consumer_supplies = rm680_vemmc_consumers ,
} ;
static struct fixed_voltage_config rm680_vemmc_config = {
. supply_name = " VEMMC " ,
. microvolts = 2900000 ,
. gpio = 157 ,
. startup_delay = 150 ,
. enable_high = 1 ,
. init_data = & rm680_vemmc ,
} ;
static struct platform_device rm680_vemmc_device = {
. name = " reg-fixed-voltage " ,
. dev = {
. platform_data = & rm680_vemmc_config ,
} ,
} ;
static struct platform_device * rm680_peripherals_devices [ ] __initdata = {
& rm680_vemmc_device ,
} ;
/* TWL */
static struct twl4030_gpio_platform_data rm680_gpio_data = {
. pullups = BIT ( 0 ) ,
. pulldowns = BIT ( 1 ) | BIT ( 2 ) | BIT ( 8 ) | BIT ( 15 ) ,
} ;
static struct twl4030_platform_data rm680_twl_data = {
. gpio = & rm680_gpio_data ,
/* add rest of the children here */
} ;
static void __init rm680_i2c_init ( void )
{
2011-06-07 10:28:54 +03:00
omap3_pmic_get_config ( & rm680_twl_data , TWL_COMMON_PDATA_USB , 0 ) ;
2012-08-27 17:43:01 -07:00
omap_pmic_init ( 1 , 2900 , " twl5031 " , 7 + OMAP_INTC_START , & rm680_twl_data ) ;
2010-12-17 15:13:47 -08:00
omap_register_i2c_bus ( 2 , 400 , NULL , 0 ) ;
omap_register_i2c_bus ( 3 , 400 , NULL , 0 ) ;
}
# if defined(CONFIG_MTD_ONENAND_OMAP2) || \
defined ( CONFIG_MTD_ONENAND_OMAP2_MODULE )
static struct omap_onenand_platform_data board_onenand_data [ ] = {
{
. gpio_irq = 65 ,
. flags = ONENAND_SYNC_READWRITE ,
}
} ;
# endif
/* eMMC */
static struct omap2_hsmmc_info mmc [ ] __initdata = {
{
. name = " internal " ,
. mmc = 2 ,
. caps = MMC_CAP_4_BIT_DATA | MMC_CAP_MMC_HIGHSPEED ,
. gpio_cd = - EINVAL ,
. gpio_wp = - EINVAL ,
} ,
{ /* Terminator */ }
} ;
static void __init rm680_peripherals_init ( void )
{
platform_add_devices ( rm680_peripherals_devices ,
ARRAY_SIZE ( rm680_peripherals_devices ) ) ;
rm680_i2c_init ( ) ;
gpmc_onenand_init ( board_onenand_data ) ;
2012-02-20 09:43:29 -08:00
omap_hsmmc_init ( mmc ) ;
2010-12-17 15:13:47 -08:00
}
# ifdef CONFIG_OMAP_MUX
static struct omap_board_mux board_mux [ ] __initdata = {
{ . reg_offset = OMAP_MUX_TERMINATOR } ,
} ;
# endif
static void __init rm680_init ( void )
{
2011-08-22 23:57:23 -07:00
struct omap_sdrc_params * sdrc_params ;
2010-12-17 15:13:47 -08:00
omap3_mux_init ( board_mux , OMAP_PACKAGE_CBB ) ;
omap_serial_init ( ) ;
2011-08-22 23:57:23 -07:00
sdrc_params = nokia_get_sdram_timings ( ) ;
omap_sdrc_init ( sdrc_params , sdrc_params ) ;
2011-04-27 11:56:12 +03:00
usb_musb_init ( NULL ) ;
2010-12-17 15:13:47 -08:00
rm680_peripherals_init ( ) ;
}
MACHINE_START ( NOKIA_RM680 , " Nokia RM-680 board " )
2011-07-05 22:38:15 -04:00
. atag_offset = 0x100 ,
2010-12-17 15:13:47 -08:00
. reserve = omap_reserve ,
2011-09-26 14:52:55 -07:00
. map_io = omap3_map_io ,
2011-08-22 23:57:24 -07:00
. init_early = omap3630_init_early ,
2011-05-17 03:51:26 -07:00
. init_irq = omap3_init_irq ,
2011-09-06 10:23:45 +01:00
. handle_irq = omap3_intc_handle_irq ,
2010-12-17 15:13:47 -08:00
. init_machine = rm680_init ,
2012-04-26 16:06:50 +08:00
. init_late = omap3630_init_late ,
2011-03-29 15:54:48 -07:00
. timer = & omap3_timer ,
2011-11-05 17:06:28 +00:00
. restart = omap_prcm_restart ,
2010-12-17 15:13:47 -08:00
MACHINE_END
2012-03-05 11:08:37 -08:00
MACHINE_START ( NOKIA_RM696 , " Nokia RM-696 board " )
. atag_offset = 0x100 ,
. reserve = omap_reserve ,
. map_io = omap3_map_io ,
. init_early = omap3630_init_early ,
. init_irq = omap3_init_irq ,
. handle_irq = omap3_intc_handle_irq ,
. init_machine = rm680_init ,
2012-04-26 16:06:50 +08:00
. init_late = omap3630_init_late ,
2012-03-05 11:08:37 -08:00
. timer = & omap3_timer ,
. restart = omap_prcm_restart ,
MACHINE_END