2009-11-28 08:17:18 +01:00
/*
* Copyright ( C ) 2008 - 2009 ST - Ericsson
*
* Author : Srinidhi KASAGAR < srinidhi . kasagar @ stericsson . com >
*
* 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/interrupt.h>
# include <linux/platform_device.h>
# include <linux/io.h>
2010-08-09 19:18:17 +05:30
# include <linux/i2c.h>
2010-06-03 07:58:42 +01:00
# include <linux/gpio.h>
2009-11-28 08:17:18 +01:00
# include <linux/amba/bus.h>
# include <linux/amba/pl022.h>
2010-10-14 13:57:59 +02:00
# include <linux/amba/serial.h>
2009-11-28 08:17:18 +01:00
# include <linux/spi/spi.h>
2010-07-26 11:12:15 +01:00
# include <linux/mfd/ab8500.h>
2010-12-13 09:33:14 +05:30
# include <linux/mfd/tc3589x.h>
2011-01-12 11:26:20 +01:00
# include <linux/leds-lp5521.h>
2011-01-14 10:53:59 +01:00
# include <linux/input.h>
# include <linux/gpio_keys.h>
2009-11-28 08:17:18 +01:00
# include <asm/mach-types.h>
# include <asm/mach/arch.h>
2010-02-03 13:02:48 +01:00
# include <plat/i2c.h>
2010-10-14 13:57:59 +02:00
# include <plat/ste_dma40.h>
2009-11-28 08:17:18 +01:00
# include <mach/hardware.h>
# include <mach/setup.h>
2010-05-03 08:03:52 +01:00
# include <mach/devices.h>
2010-09-06 22:15:08 +01:00
# include <mach/irqs.h>
2009-11-28 08:17:18 +01:00
2010-10-14 13:57:59 +02:00
# include "ste-dma40-db8500.h"
2010-09-29 19:46:32 +05:30
# include "devices-db8500.h"
2010-08-19 12:06:32 +01:00
# include "board-mop500.h"
2010-12-10 11:08:48 +01:00
# include "board-mop500-regulators.h"
2010-06-03 07:58:42 +01:00
2010-07-26 11:12:15 +01:00
static struct ab8500_platform_data ab8500_platdata = {
. irq_base = MOP500_AB8500_IRQ_BASE ,
2010-12-10 11:08:48 +01:00
. regulator = ab8500_regulators ,
. num_regulator = ARRAY_SIZE ( ab8500_regulators ) ,
2010-07-26 11:12:15 +01:00
} ;
2010-09-06 22:15:08 +01:00
static struct resource ab8500_resources [ ] = {
[ 0 ] = {
2010-12-08 11:07:56 +05:30
. start = IRQ_DB8500_AB8500 ,
. end = IRQ_DB8500_AB8500 ,
. flags = IORESOURCE_IRQ
2010-09-06 22:15:08 +01:00
}
} ;
struct platform_device ab8500_device = {
. name = " ab8500-i2c " ,
. id = 0 ,
. dev = {
. platform_data = & ab8500_platdata ,
} ,
. num_resources = 1 ,
. resource = ab8500_resources ,
} ;
2010-08-09 19:18:17 +05:30
/*
* TC35892
*/
2010-12-13 09:33:14 +05:30
static void mop500_tc35892_init ( struct tc3589x * tc3589x , unsigned int base )
2010-08-09 19:18:17 +05:30
{
mop500_sdi_tc35892_init ( ) ;
}
2010-12-13 09:33:14 +05:30
static struct tc3589x_gpio_platform_data mop500_tc35892_gpio_data = {
2010-08-09 19:18:17 +05:30
. gpio_base = MOP500_EGPIO ( 0 ) ,
. setup = mop500_tc35892_init ,
} ;
2010-12-13 09:33:14 +05:30
static struct tc3589x_platform_data mop500_tc35892_data = {
2010-12-13 09:33:15 +05:30
. block = TC3589x_BLOCK_GPIO ,
2010-08-09 19:18:17 +05:30
. gpio = & mop500_tc35892_gpio_data ,
. irq_base = MOP500_EGPIO_IRQ_BASE ,
} ;
2011-01-12 11:26:20 +01:00
static struct lp5521_led_config lp5521_pri_led [ ] = {
[ 0 ] = {
. chan_nr = 0 ,
. led_current = 0x2f ,
. max_current = 0x5f ,
} ,
[ 1 ] = {
. chan_nr = 1 ,
. led_current = 0x2f ,
. max_current = 0x5f ,
} ,
[ 2 ] = {
. chan_nr = 2 ,
. led_current = 0x2f ,
. max_current = 0x5f ,
} ,
} ;
static struct lp5521_platform_data __initdata lp5521_pri_data = {
. label = " lp5521_pri " ,
. led_config = & lp5521_pri_led [ 0 ] ,
. num_channels = 3 ,
. clock_mode = LP5521_CLOCK_EXT ,
} ;
static struct lp5521_led_config lp5521_sec_led [ ] = {
[ 0 ] = {
. chan_nr = 0 ,
. led_current = 0x2f ,
. max_current = 0x5f ,
} ,
[ 1 ] = {
. chan_nr = 1 ,
. led_current = 0x2f ,
. max_current = 0x5f ,
} ,
[ 2 ] = {
. chan_nr = 2 ,
. led_current = 0x2f ,
. max_current = 0x5f ,
} ,
} ;
static struct lp5521_platform_data __initdata lp5521_sec_data = {
. label = " lp5521_sec " ,
. led_config = & lp5521_sec_led [ 0 ] ,
. num_channels = 3 ,
. clock_mode = LP5521_CLOCK_EXT ,
} ;
2010-08-09 19:18:17 +05:30
static struct i2c_board_info mop500_i2c0_devices [ ] = {
{
2010-12-13 09:33:14 +05:30
I2C_BOARD_INFO ( " tc3589x " , 0x42 ) ,
2011-01-12 11:26:20 +01:00
. irq = NOMADIK_GPIO_TO_IRQ ( 217 ) ,
2010-08-09 19:18:17 +05:30
. platform_data = & mop500_tc35892_data ,
} ,
} ;
2011-01-12 11:26:20 +01:00
static struct i2c_board_info __initdata mop500_i2c2_devices [ ] = {
{
/* lp5521 LED driver, 1st device */
I2C_BOARD_INFO ( " lp5521 " , 0x33 ) ,
. platform_data = & lp5521_pri_data ,
} ,
{
/* lp5521 LED driver, 2st device */
I2C_BOARD_INFO ( " lp5521 " , 0x34 ) ,
. platform_data = & lp5521_sec_data ,
} ,
2011-01-13 14:41:22 +00:00
{
/* Light sensor Rohm BH1780GLI */
I2C_BOARD_INFO ( " bh1780 " , 0x29 ) ,
} ,
2011-01-12 11:26:20 +01:00
} ;
2010-02-03 13:02:48 +01:00
# define U8500_I2C_CONTROLLER(id, _slsu, _tft, _rft, clk, _sm) \
2010-05-03 08:24:37 +01:00
static struct nmk_i2c_controller u8500_i2c # # id # # _data = { \
2010-02-03 13:02:48 +01:00
/* \
* slave data setup time , which is \
* 250 ns , 100 ns , 10 ns which is 14 , 6 , 2 \
* respectively for a 48 Mhz \
* i2c clock \
*/ \
. slsu = _slsu , \
/* Tx FIFO threshold */ \
. tft = _tft , \
/* Rx FIFO threshold */ \
. rft = _rft , \
/* std. mode operation */ \
. clk_freq = clk , \
. sm = _sm , \
}
/*
* The board uses 4 i2c controllers , initialize all of
* them with slave data setup time of 250 ns ,
* Tx & Rx FIFO threshold values as 1 and standard
* mode of operation
*/
U8500_I2C_CONTROLLER ( 0 , 0xe , 1 , 1 , 100000 , I2C_FREQ_MODE_STANDARD ) ;
U8500_I2C_CONTROLLER ( 1 , 0xe , 1 , 1 , 100000 , I2C_FREQ_MODE_STANDARD ) ;
U8500_I2C_CONTROLLER ( 2 , 0xe , 1 , 1 , 100000 , I2C_FREQ_MODE_STANDARD ) ;
U8500_I2C_CONTROLLER ( 3 , 0xe , 1 , 1 , 100000 , I2C_FREQ_MODE_STANDARD ) ;
2010-09-29 19:46:32 +05:30
static void __init mop500_i2c_init ( void )
{
db8500_add_i2c0 ( & u8500_i2c0_data ) ;
db8500_add_i2c1 ( & u8500_i2c1_data ) ;
db8500_add_i2c2 ( & u8500_i2c2_data ) ;
db8500_add_i2c3 ( & u8500_i2c3_data ) ;
}
2009-11-28 08:17:18 +01:00
2011-01-14 10:53:59 +01:00
static struct gpio_keys_button mop500_gpio_keys [ ] = {
{
. desc = " SFH7741 Proximity Sensor " ,
. type = EV_SW ,
. code = SW_FRONT_PROXIMITY ,
. gpio = GPIO_PROX_SENSOR ,
. active_low = 0 ,
. can_disable = 1 ,
}
} ;
static struct regulator * prox_regulator ;
static int mop500_prox_activate ( struct device * dev ) ;
static void mop500_prox_deactivate ( struct device * dev ) ;
static struct gpio_keys_platform_data mop500_gpio_keys_data = {
. buttons = mop500_gpio_keys ,
. nbuttons = ARRAY_SIZE ( mop500_gpio_keys ) ,
. enable = mop500_prox_activate ,
. disable = mop500_prox_deactivate ,
} ;
static struct platform_device mop500_gpio_keys_device = {
. name = " gpio-keys " ,
. id = 0 ,
. dev = {
. platform_data = & mop500_gpio_keys_data ,
} ,
} ;
static int mop500_prox_activate ( struct device * dev )
{
prox_regulator = regulator_get ( & mop500_gpio_keys_device . dev ,
" vcc " ) ;
if ( IS_ERR ( prox_regulator ) ) {
dev_err ( & mop500_gpio_keys_device . dev ,
" no regulator \n " ) ;
return PTR_ERR ( prox_regulator ) ;
}
regulator_enable ( prox_regulator ) ;
return 0 ;
}
static void mop500_prox_deactivate ( struct device * dev )
{
regulator_disable ( prox_regulator ) ;
regulator_put ( prox_regulator ) ;
}
2010-02-03 13:02:48 +01:00
/* add any platform devices here - TODO */
static struct platform_device * platform_devs [ ] __initdata = {
2011-01-14 10:53:59 +01:00
& mop500_gpio_keys_device ,
2010-02-03 13:02:48 +01:00
} ;
2010-10-14 13:57:59 +02:00
# ifdef CONFIG_STE_DMA40
static struct stedma40_chan_cfg ssp0_dma_cfg_rx = {
. mode = STEDMA40_MODE_LOGICAL ,
. dir = STEDMA40_PERIPH_TO_MEM ,
. src_dev_type = DB8500_DMA_DEV8_SSP0_RX ,
. dst_dev_type = STEDMA40_DEV_DST_MEMORY ,
. src_info . data_width = STEDMA40_BYTE_WIDTH ,
. dst_info . data_width = STEDMA40_BYTE_WIDTH ,
} ;
static struct stedma40_chan_cfg ssp0_dma_cfg_tx = {
. mode = STEDMA40_MODE_LOGICAL ,
. dir = STEDMA40_MEM_TO_PERIPH ,
. src_dev_type = STEDMA40_DEV_SRC_MEMORY ,
. dst_dev_type = DB8500_DMA_DEV8_SSP0_TX ,
. src_info . data_width = STEDMA40_BYTE_WIDTH ,
. dst_info . data_width = STEDMA40_BYTE_WIDTH ,
} ;
# endif
static struct pl022_ssp_controller ssp0_platform_data = {
. bus_id = 0 ,
# ifdef CONFIG_STE_DMA40
. enable_dma = 1 ,
. dma_filter = stedma40_filter ,
. dma_rx_param = & ssp0_dma_cfg_rx ,
. dma_tx_param = & ssp0_dma_cfg_tx ,
# else
. enable_dma = 0 ,
# endif
/* on this platform, gpio 31,142,144,214 &
* 224 are connected as chip selects
*/
. num_chipselect = 5 ,
} ;
2010-09-29 19:46:32 +05:30
static void __init mop500_spi_init ( void )
2009-11-28 08:17:18 +01:00
{
2010-09-29 19:46:32 +05:30
db8500_add_ssp0 ( & ssp0_platform_data ) ;
}
2009-11-28 08:17:18 +01:00
2010-10-14 13:57:59 +02:00
# ifdef CONFIG_STE_DMA40
static struct stedma40_chan_cfg uart0_dma_cfg_rx = {
. mode = STEDMA40_MODE_LOGICAL ,
. dir = STEDMA40_PERIPH_TO_MEM ,
. src_dev_type = DB8500_DMA_DEV13_UART0_RX ,
. dst_dev_type = STEDMA40_DEV_DST_MEMORY ,
. src_info . data_width = STEDMA40_BYTE_WIDTH ,
. dst_info . data_width = STEDMA40_BYTE_WIDTH ,
} ;
static struct stedma40_chan_cfg uart0_dma_cfg_tx = {
. mode = STEDMA40_MODE_LOGICAL ,
. dir = STEDMA40_MEM_TO_PERIPH ,
. src_dev_type = STEDMA40_DEV_SRC_MEMORY ,
. dst_dev_type = DB8500_DMA_DEV13_UART0_TX ,
. src_info . data_width = STEDMA40_BYTE_WIDTH ,
. dst_info . data_width = STEDMA40_BYTE_WIDTH ,
} ;
static struct stedma40_chan_cfg uart1_dma_cfg_rx = {
. mode = STEDMA40_MODE_LOGICAL ,
. dir = STEDMA40_PERIPH_TO_MEM ,
. src_dev_type = DB8500_DMA_DEV12_UART1_RX ,
. dst_dev_type = STEDMA40_DEV_DST_MEMORY ,
. src_info . data_width = STEDMA40_BYTE_WIDTH ,
. dst_info . data_width = STEDMA40_BYTE_WIDTH ,
} ;
static struct stedma40_chan_cfg uart1_dma_cfg_tx = {
. mode = STEDMA40_MODE_LOGICAL ,
. dir = STEDMA40_MEM_TO_PERIPH ,
. src_dev_type = STEDMA40_DEV_SRC_MEMORY ,
. dst_dev_type = DB8500_DMA_DEV12_UART1_TX ,
. src_info . data_width = STEDMA40_BYTE_WIDTH ,
. dst_info . data_width = STEDMA40_BYTE_WIDTH ,
} ;
static struct stedma40_chan_cfg uart2_dma_cfg_rx = {
. mode = STEDMA40_MODE_LOGICAL ,
. dir = STEDMA40_PERIPH_TO_MEM ,
. src_dev_type = DB8500_DMA_DEV11_UART2_RX ,
. dst_dev_type = STEDMA40_DEV_DST_MEMORY ,
. src_info . data_width = STEDMA40_BYTE_WIDTH ,
. dst_info . data_width = STEDMA40_BYTE_WIDTH ,
} ;
static struct stedma40_chan_cfg uart2_dma_cfg_tx = {
. mode = STEDMA40_MODE_LOGICAL ,
. dir = STEDMA40_MEM_TO_PERIPH ,
. src_dev_type = STEDMA40_DEV_SRC_MEMORY ,
. dst_dev_type = DB8500_DMA_DEV11_UART2_TX ,
. src_info . data_width = STEDMA40_BYTE_WIDTH ,
. dst_info . data_width = STEDMA40_BYTE_WIDTH ,
} ;
# endif
static struct amba_pl011_data uart0_plat = {
# ifdef CONFIG_STE_DMA40
. dma_filter = stedma40_filter ,
. dma_rx_param = & uart0_dma_cfg_rx ,
. dma_tx_param = & uart0_dma_cfg_tx ,
# endif
} ;
static struct amba_pl011_data uart1_plat = {
# ifdef CONFIG_STE_DMA40
. dma_filter = stedma40_filter ,
. dma_rx_param = & uart1_dma_cfg_rx ,
. dma_tx_param = & uart1_dma_cfg_tx ,
# endif
} ;
static struct amba_pl011_data uart2_plat = {
# ifdef CONFIG_STE_DMA40
. dma_filter = stedma40_filter ,
. dma_rx_param = & uart2_dma_cfg_rx ,
. dma_tx_param = & uart2_dma_cfg_tx ,
# endif
} ;
2010-09-29 19:46:32 +05:30
static void __init mop500_uart_init ( void )
{
2010-10-14 13:57:59 +02:00
db8500_add_uart0 ( & uart0_plat ) ;
db8500_add_uart1 ( & uart1_plat ) ;
db8500_add_uart2 ( & uart2_plat ) ;
2010-09-29 19:46:32 +05:30
}
static void __init u8500_init_machine ( void )
{
2010-06-03 07:58:42 +01:00
u8500_init_devices ( ) ;
2011-02-11 17:07:21 -07:00
mop500_pins_init ( ) ;
2010-06-03 07:58:42 +01:00
2010-02-03 13:02:48 +01:00
platform_add_devices ( platform_devs , ARRAY_SIZE ( platform_devs ) ) ;
2010-09-29 19:46:32 +05:30
mop500_i2c_init ( ) ;
2010-08-19 12:06:32 +01:00
mop500_sdi_init ( ) ;
2010-09-29 19:46:32 +05:30
mop500_spi_init ( ) ;
mop500_uart_init ( ) ;
2010-08-19 12:06:32 +01:00
2010-12-13 09:33:11 +05:30
platform_device_register ( & ab8500_device ) ;
2010-08-09 19:18:17 +05:30
i2c_register_board_info ( 0 , mop500_i2c0_devices ,
ARRAY_SIZE ( mop500_i2c0_devices ) ) ;
2011-01-12 11:26:20 +01:00
i2c_register_board_info ( 2 , mop500_i2c2_devices ,
ARRAY_SIZE ( mop500_i2c2_devices ) ) ;
2009-11-28 08:17:18 +01:00
}
MACHINE_START ( U8500 , " ST-Ericsson MOP500 platform " )
/* Maintainer: Srinidhi Kasagar <srinidhi.kasagar@stericsson.com> */
. boot_params = 0x100 ,
. map_io = u8500_map_io ,
2010-05-03 07:39:02 +01:00
. init_irq = ux500_init_irq ,
2009-11-28 08:17:18 +01:00
/* we re-use nomadik timer here */
2010-05-03 08:28:05 +01:00
. timer = & ux500_timer ,
2009-11-28 08:17:18 +01:00
. init_machine = u8500_init_machine ,
MACHINE_END