2012-05-03 00:44:52 +02:00
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>
2012-06-11 22:56:26 +02:00
# include <linux/platform_data/i2c-nomadik.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>
2011-12-02 14:16:33 +01:00
# include <linux/mfd/abx500/ab8500.h>
regulator: initialization for ab8500 regulators
The regulators on the AB8500 have a lot of custom
hardware control settings pertaining to 8 external
signals, settings which are board-specific and need
be provided from the platform at startup.
Initialization added for regulators Vana, VextSupply1,
VextSupply2, VextSupply3, Vaux1, Vaux2, Vaux3, VTVout,
Vintcore12, Vaudio, Vdmic, Vamic1, Vamic2, VrefDDR.
Signed-off-by: Bengt Jonsson <bengt.g.jonsson@stericsson.com>
Reviewed-by: Rickard Andersson <rickard.andersson@stericsson.com>
Reviewed-by: Jonas Aberg <jonas.aberg@stericsson.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Acked-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Signed-off-by: Liam Girdwood <lrg@slimlogic.co.uk>
2011-03-11 11:54:46 +01:00
# include <linux/regulator/ab8500.h>
2012-09-03 14:33:39 +01:00
# include <linux/regulator/fixed.h>
2010-12-13 09:33:14 +05:30
# include <linux/mfd/tc3589x.h>
2011-03-07 11:48:15 +01:00
# include <linux/mfd/tps6105x.h>
2011-12-02 14:16:33 +01:00
# include <linux/mfd/abx500/ab8500-gpio.h>
2012-06-07 14:00:46 +02:00
# include <linux/mfd/abx500/ab8500-codec.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>
2011-06-20 15:55:46 +02:00
# include <linux/smsc911x.h>
2011-01-14 10:53:59 +01:00
# include <linux/gpio_keys.h>
2011-06-13 10:11:44 +02:00
# include <linux/delay.h>
2012-03-07 15:04:07 +00:00
# include <linux/of.h>
# include <linux/of_platform.h>
2011-06-20 15:55:46 +02:00
# include <linux/leds.h>
2012-05-07 01:33:24 +02:00
# include <linux/pinctrl/consumer.h>
2009-11-28 08:17:18 +01:00
# include <asm/mach-types.h>
# include <asm/mach/arch.h>
2011-09-06 10:23:45 +01:00
# include <asm/hardware/gic.h>
2009-11-28 08:17:18 +01:00
2010-10-14 13:57:59 +02:00
# include <plat/ste_dma40.h>
2011-08-22 08:33:30 +01:00
# include <plat/gpio-nomadik.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>
2012-08-24 15:19:33 +02:00
# include <linux/platform_data/crypto-ux500.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
2011-06-20 15:55:46 +02:00
static struct gpio_led snowball_led_array [ ] = {
{
. name = " user_led " ,
2012-05-02 09:20:37 +01:00
. default_trigger = " heartbeat " ,
2011-06-20 15:55:46 +02:00
. gpio = 142 ,
} ,
} ;
static struct gpio_led_platform_data snowball_led_data = {
. leds = snowball_led_array ,
. num_leds = ARRAY_SIZE ( snowball_led_array ) ,
} ;
static struct platform_device snowball_led_dev = {
. name = " leds-gpio " ,
. dev = {
. platform_data = & snowball_led_data ,
} ,
} ;
2012-09-03 14:33:39 +01:00
static struct fixed_voltage_config snowball_gpio_en_3v3_data = {
. supply_name = " EN-3V3 " ,
. gpio = SNOWBALL_EN_3V3_ETH_GPIO ,
. microvolts = 3300000 ,
. enable_high = 1 ,
. init_data = & gpio_en_3v3_regulator ,
. startup_delay = 5000 , /* 1200us */
} ;
static struct platform_device snowball_gpio_en_3v3_regulator_dev = {
. name = " reg-fixed-voltage " ,
. id = 1 ,
. dev = {
. platform_data = & snowball_gpio_en_3v3_data ,
} ,
} ;
2011-02-15 12:56:16 +05:30
static struct ab8500_gpio_platform_data ab8500_gpio_pdata = {
2012-02-13 10:52:25 +01:00
. gpio_base = MOP500_AB8500_PIN_GPIO ( 1 ) ,
2011-02-15 12:56:16 +05:30
. irq_base = MOP500_AB8500_VIR_GPIO_IRQ_BASE ,
/* config_reg is the initial configuration of ab8500 pins.
* The pins can be configured as GPIO or alt functions based
* on value present in GpioSel1 to GpioSel6 and AlternatFunction
* register . This is the array of 7 configuration settings .
* One has to compile time decide these settings . Below is the
2011-03-30 22:57:33 -03:00
* explanation of these setting
2011-02-15 12:56:16 +05:30
* GpioSel1 = 0x00 = > Pins GPIO1 to GPIO8 are not used as GPIO
* GpioSel2 = 0x1E = > Pins GPIO10 to GPIO13 are configured as GPIO
* GpioSel3 = 0x80 = > Pin GPIO24 is configured as GPIO
* GpioSel4 = 0x01 = > Pin GPIo25 is configured as GPIO
* GpioSel5 = 0x7A = > Pins GPIO34 , GPIO36 to GPIO39 are conf as GPIO
* GpioSel6 = 0x00 = > Pins GPIO41 & GPIo42 are not configured as GPIO
* AlternaFunction = 0x00 = > If Pins GPIO10 to 13 are not configured
* as GPIO then this register selectes the alternate fucntions
*/
. config_reg = { 0x00 , 0x1E , 0x80 , 0x01 ,
0x7A , 0x00 , 0x00 } ,
} ;
2012-06-07 14:00:46 +02:00
/* ab8500-codec */
static struct ab8500_codec_platform_data ab8500_codec_pdata = {
. amics = {
. mic1_type = AMIC_TYPE_DIFFERENTIAL ,
. mic2_type = AMIC_TYPE_DIFFERENTIAL ,
. mic1a_micbias = AMIC_MICBIAS_VAMIC1 ,
. mic1b_micbias = AMIC_MICBIAS_VAMIC1 ,
. mic2_micbias = AMIC_MICBIAS_VAMIC2
} ,
. ear_cmv = EAR_CMV_0_95V
} ;
2011-06-20 15:55:46 +02:00
static struct gpio_keys_button snowball_key_array [ ] = {
{
. gpio = 32 ,
. type = EV_KEY ,
. code = KEY_1 ,
. desc = " userpb " ,
. active_low = 1 ,
. debounce_interval = 50 ,
. wakeup = 1 ,
} ,
{
. gpio = 151 ,
. type = EV_KEY ,
. code = KEY_2 ,
. desc = " extkb1 " ,
. active_low = 1 ,
. debounce_interval = 50 ,
. wakeup = 1 ,
} ,
{
. gpio = 152 ,
. type = EV_KEY ,
. code = KEY_3 ,
. desc = " extkb2 " ,
. active_low = 1 ,
. debounce_interval = 50 ,
. wakeup = 1 ,
} ,
{
. gpio = 161 ,
. type = EV_KEY ,
. code = KEY_4 ,
. desc = " extkb3 " ,
. active_low = 1 ,
. debounce_interval = 50 ,
. wakeup = 1 ,
} ,
{
. gpio = 162 ,
. type = EV_KEY ,
. code = KEY_5 ,
. desc = " extkb4 " ,
. active_low = 1 ,
. debounce_interval = 50 ,
. wakeup = 1 ,
} ,
} ;
static struct gpio_keys_platform_data snowball_key_data = {
. buttons = snowball_key_array ,
. nbuttons = ARRAY_SIZE ( snowball_key_array ) ,
} ;
static struct platform_device snowball_key_dev = {
. name = " gpio-keys " ,
. id = - 1 ,
. dev = {
. platform_data = & snowball_key_data ,
}
} ;
static struct smsc911x_platform_config snowball_sbnet_cfg = {
. irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_HIGH ,
. irq_type = SMSC911X_IRQ_TYPE_PUSH_PULL ,
. flags = SMSC911X_USE_16BIT | SMSC911X_FORCE_INTERNAL_PHY ,
. shift = 1 ,
} ;
static struct resource sbnet_res [ ] = {
{
. name = " smsc911x-memory " ,
. start = ( 0x5000 < < 16 ) ,
. end = ( 0x5000 < < 16 ) + 0xffff ,
. flags = IORESOURCE_MEM ,
} ,
{
. start = NOMADIK_GPIO_TO_IRQ ( 140 ) ,
. end = NOMADIK_GPIO_TO_IRQ ( 140 ) ,
. flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE ,
} ,
} ;
static struct platform_device snowball_sbnet_dev = {
. name = " smsc911x " ,
. num_resources = ARRAY_SIZE ( sbnet_res ) ,
. resource = sbnet_res ,
. dev = {
. platform_data = & snowball_sbnet_cfg ,
} ,
} ;
2010-07-26 11:12:15 +01:00
static struct ab8500_platform_data ab8500_platdata = {
. irq_base = MOP500_AB8500_IRQ_BASE ,
2011-03-09 13:34:17 +01:00
. regulator_reg_init = ab8500_regulator_reg_init ,
. num_regulator_reg_init = ARRAY_SIZE ( ab8500_regulator_reg_init ) ,
2010-12-10 11:08:48 +01:00
. regulator = ab8500_regulators ,
. num_regulator = ARRAY_SIZE ( ab8500_regulators ) ,
2011-02-15 12:56:16 +05:30
. gpio = & ab8500_gpio_pdata ,
2012-06-07 14:00:46 +02:00
. codec = & ab8500_codec_pdata ,
2010-07-26 11:12:15 +01:00
} ;
2011-03-07 11:48:15 +01:00
/*
* TPS61052
*/
static struct tps6105x_platform_data mop500_tps61052_data = {
. mode = TPS6105X_MODE_VOLTAGE ,
. regulator_data = & tps61052_regulator ,
} ;
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
{
2012-02-06 11:22:21 -08:00
struct device * parent = NULL ;
#if 0
/* FIXME: Is the sdi actually part of tc3589x? */
parent = tc3589x - > dev ;
# endif
mop500_sdi_tc35892_init ( parent ) ;
2010-08-09 19:18:17 +05:30
}
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 ,
} ;
2011-03-07 11:48:15 +01:00
static struct i2c_board_info __initdata mop500_i2c0_devices [ ] = {
2010-08-09 19:18:17 +05:30
{
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-03-30 14:31:42 +02:00
/* I2C0 devices only available prior to HREFv60 */
2011-03-07 11:48:15 +01:00
{
I2C_BOARD_INFO ( " tps61052 " , 0x33 ) ,
. platform_data = & mop500_tps61052_data ,
} ,
} ;
2011-03-30 14:31:42 +02:00
# define NUM_PRE_V60_I2C0_DEVICES 1
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
} ;
2012-02-06 11:22:21 -08:00
static void __init mop500_i2c_init ( struct device * parent )
2010-09-29 19:46:32 +05:30
{
2012-04-17 15:52:26 +01:00
db8500_add_i2c0 ( parent , NULL ) ;
db8500_add_i2c1 ( parent , NULL ) ;
db8500_add_i2c2 ( parent , NULL ) ;
db8500_add_i2c3 ( parent , NULL ) ;
2010-09-29 19:46:32 +05:30
}
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 ,
. 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 ) ;
}
2012-05-10 10:14:06 +02:00
static struct cryp_platform_data u8500_cryp1_platform_data = {
. mem_to_engine = {
. dir = STEDMA40_MEM_TO_PERIPH ,
. src_dev_type = STEDMA40_DEV_SRC_MEMORY ,
. dst_dev_type = DB8500_DMA_DEV48_CAC1_TX ,
. src_info . data_width = STEDMA40_WORD_WIDTH ,
. dst_info . data_width = STEDMA40_WORD_WIDTH ,
. mode = STEDMA40_MODE_LOGICAL ,
. src_info . psize = STEDMA40_PSIZE_LOG_4 ,
. dst_info . psize = STEDMA40_PSIZE_LOG_4 ,
} ,
. engine_to_mem = {
. dir = STEDMA40_PERIPH_TO_MEM ,
. src_dev_type = DB8500_DMA_DEV48_CAC1_RX ,
. dst_dev_type = STEDMA40_DEV_DST_MEMORY ,
. src_info . data_width = STEDMA40_WORD_WIDTH ,
. dst_info . data_width = STEDMA40_WORD_WIDTH ,
. mode = STEDMA40_MODE_LOGICAL ,
. src_info . psize = STEDMA40_PSIZE_LOG_4 ,
. dst_info . psize = STEDMA40_PSIZE_LOG_4 ,
}
} ;
static struct stedma40_chan_cfg u8500_hash_dma_cfg_tx = {
. dir = STEDMA40_MEM_TO_PERIPH ,
. src_dev_type = STEDMA40_DEV_SRC_MEMORY ,
. dst_dev_type = DB8500_DMA_DEV50_HAC1_TX ,
. src_info . data_width = STEDMA40_WORD_WIDTH ,
. dst_info . data_width = STEDMA40_WORD_WIDTH ,
. mode = STEDMA40_MODE_LOGICAL ,
. src_info . psize = STEDMA40_PSIZE_LOG_16 ,
. dst_info . psize = STEDMA40_PSIZE_LOG_16 ,
} ;
static struct hash_platform_data u8500_hash1_platform_data = {
. mem_to_engine = & u8500_hash_dma_cfg_tx ,
. dma_filter = stedma40_filter ,
} ;
2010-02-03 13:02:48 +01:00
/* add any platform devices here - TODO */
2011-06-20 15:55:46 +02:00
static struct platform_device * mop500_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
2012-03-15 16:47:11 +00:00
static struct pl022_ssp_controller ssp0_plat = {
2010-10-14 13:57:59 +02:00
. 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 ,
} ;
2012-02-06 11:22:21 -08:00
static void __init mop500_spi_init ( struct device * parent )
2009-11-28 08:17:18 +01:00
{
2012-03-15 16:47:11 +00:00
db8500_add_ssp0 ( parent , & ssp0_plat ) ;
2010-09-29 19:46:32 +05:30
}
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
} ;
2012-02-06 11:22:21 -08:00
static void __init mop500_uart_init ( struct device * parent )
2010-09-29 19:46:32 +05:30
{
2012-05-23 21:18:46 +02:00
db8500_add_uart0 ( parent , & uart0_plat ) ;
2012-02-06 11:22:21 -08:00
db8500_add_uart1 ( parent , & uart1_plat ) ;
db8500_add_uart2 ( parent , & uart2_plat ) ;
2010-09-29 19:46:32 +05:30
}
2012-05-10 10:14:06 +02:00
static void __init u8500_cryp1_hash1_init ( struct device * parent )
{
db8500_add_cryp1 ( parent , & u8500_cryp1_platform_data ) ;
db8500_add_hash1 ( parent , & u8500_hash1_platform_data ) ;
}
2011-06-20 15:55:46 +02:00
static struct platform_device * snowball_platform_devs [ ] __initdata = {
& snowball_led_dev ,
& snowball_key_dev ,
2012-05-17 13:18:36 +01:00
& snowball_sbnet_dev ,
2012-09-03 14:33:39 +01:00
& snowball_gpio_en_3v3_regulator_dev ,
2011-06-20 15:55:46 +02:00
} ;
2011-02-15 15:01:35 +01:00
static void __init mop500_init_machine ( void )
2010-09-29 19:46:32 +05:30
{
2012-02-06 11:22:21 -08:00
struct device * parent = NULL ;
2011-03-30 14:31:42 +02:00
int i2c0_devs ;
2012-02-06 11:22:25 -08:00
int i ;
2011-03-30 14:31:42 +02:00
2011-08-26 16:54:07 +01:00
mop500_gpio_keys [ 0 ] . gpio = GPIO_PROX_SENSOR ;
2012-05-03 00:44:52 +02:00
mop500_pinmaps_init ( ) ;
2012-07-06 12:46:23 +02:00
parent = u8500_init_devices ( & ab8500_platdata ) ;
2011-08-26 16:54:07 +01:00
2012-02-06 11:22:25 -08:00
for ( i = 0 ; i < ARRAY_SIZE ( mop500_platform_devs ) ; i + + )
mop500_platform_devs [ i ] - > dev . parent = parent ;
2011-08-26 16:54:07 +01:00
platform_add_devices ( mop500_platform_devs ,
ARRAY_SIZE ( mop500_platform_devs ) ) ;
2012-02-06 11:22:21 -08:00
mop500_i2c_init ( parent ) ;
mop500_sdi_init ( parent ) ;
mop500_spi_init ( parent ) ;
2012-09-14 15:46:29 +01:00
mop500_audio_init ( parent ) ;
2012-02-06 11:22:21 -08:00
mop500_uart_init ( parent ) ;
2011-08-26 16:54:07 +01:00
2012-05-10 10:14:06 +02:00
u8500_cryp1_hash1_init ( parent ) ;
2011-08-26 16:54:07 +01:00
i2c0_devs = ARRAY_SIZE ( mop500_i2c0_devices ) ;
i2c_register_board_info ( 0 , mop500_i2c0_devices , i2c0_devs ) ;
i2c_register_board_info ( 2 , mop500_i2c2_devices ,
ARRAY_SIZE ( mop500_i2c2_devices ) ) ;
/* This board has full regulator constraints */
regulator_has_full_constraints ( ) ;
2012-05-02 09:53:48 +01:00
mop500_uib_init ( ) ;
2011-08-26 16:54:07 +01:00
}
static void __init snowball_init_machine ( void )
{
2012-02-06 11:22:21 -08:00
struct device * parent = NULL ;
2012-02-06 11:22:25 -08:00
int i ;
2011-08-26 16:54:07 +01:00
2012-05-03 00:44:52 +02:00
snowball_pinmaps_init ( ) ;
2012-07-06 12:46:23 +02:00
parent = u8500_init_devices ( & ab8500_platdata ) ;
2011-08-26 16:54:07 +01:00
2012-02-06 11:22:25 -08:00
for ( i = 0 ; i < ARRAY_SIZE ( snowball_platform_devs ) ; i + + )
snowball_platform_devs [ i ] - > dev . parent = parent ;
2011-08-26 16:54:07 +01:00
platform_add_devices ( snowball_platform_devs ,
ARRAY_SIZE ( snowball_platform_devs ) ) ;
2012-02-06 11:22:21 -08:00
mop500_i2c_init ( parent ) ;
snowball_sdi_init ( parent ) ;
mop500_spi_init ( parent ) ;
2012-09-14 15:46:29 +01:00
mop500_audio_init ( parent ) ;
2012-02-06 11:22:21 -08:00
mop500_uart_init ( parent ) ;
2011-08-26 16:54:07 +01:00
/* This board has full regulator constraints */
regulator_has_full_constraints ( ) ;
}
static void __init hrefv60_init_machine ( void )
{
2012-02-06 11:22:21 -08:00
struct device * parent = NULL ;
2011-08-26 16:54:07 +01:00
int i2c0_devs ;
2012-02-06 11:22:25 -08:00
int i ;
2011-08-26 16:54:07 +01:00
2011-02-15 15:01:35 +01:00
/*
* The HREFv60 board removed a GPIO expander and routed
* all these GPIO pins to the internal GPIO controller
* instead .
*/
2011-08-26 16:54:07 +01:00
mop500_gpio_keys [ 0 ] . gpio = HREFV60_PROX_SENSE_GPIO ;
2011-02-15 15:01:35 +01:00
2012-05-03 00:44:52 +02:00
hrefv60_pinmaps_init ( ) ;
2012-07-06 12:46:23 +02:00
parent = u8500_init_devices ( & ab8500_platdata ) ;
2010-06-03 07:58:42 +01:00
2012-02-06 11:22:25 -08:00
for ( i = 0 ; i < ARRAY_SIZE ( mop500_platform_devs ) ; i + + )
mop500_platform_devs [ i ] - > dev . parent = parent ;
2011-08-26 16:54:07 +01:00
platform_add_devices ( mop500_platform_devs ,
ARRAY_SIZE ( mop500_platform_devs ) ) ;
2010-02-03 13:02:48 +01:00
2012-02-06 11:22:21 -08:00
mop500_i2c_init ( parent ) ;
hrefv60_sdi_init ( parent ) ;
mop500_spi_init ( parent ) ;
2012-09-14 15:46:29 +01:00
mop500_audio_init ( parent ) ;
2012-02-06 11:22:21 -08:00
mop500_uart_init ( parent ) ;
2010-08-19 12:06:32 +01:00
2011-03-30 14:31:42 +02:00
i2c0_devs = ARRAY_SIZE ( mop500_i2c0_devices ) ;
2011-08-26 16:54:07 +01:00
i2c0_devs - = NUM_PRE_V60_I2C0_DEVICES ;
2011-03-30 14:31:42 +02:00
i2c_register_board_info ( 0 , mop500_i2c0_devices , i2c0_devs ) ;
2011-01-12 11:26:20 +01:00
i2c_register_board_info ( 2 , mop500_i2c2_devices ,
ARRAY_SIZE ( mop500_i2c2_devices ) ) ;
2011-04-04 10:44:51 +02:00
/* This board has full regulator constraints */
regulator_has_full_constraints ( ) ;
2012-05-02 09:53:48 +01:00
mop500_uib_init ( ) ;
2009-11-28 08:17:18 +01:00
}
MACHINE_START ( U8500 , " ST-Ericsson MOP500 platform " )
/* Maintainer: Srinidhi Kasagar <srinidhi.kasagar@stericsson.com> */
2011-07-05 22:38:18 -04:00
. atag_offset = 0x100 ,
2011-09-08 13:15:22 +01:00
. smp = smp_ops ( ux500_smp_ops ) ,
2009-11-28 08:17:18 +01:00
. 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 ,
2011-09-06 10:23:45 +01:00
. handle_irq = gic_handle_irq ,
2011-02-15 15:01:35 +01:00
. init_machine = mop500_init_machine ,
2012-05-02 17:10:07 +08:00
. init_late = ux500_init_late ,
2011-02-15 15:01:35 +01:00
MACHINE_END
MACHINE_START ( HREFV60 , " ST-Ericsson U8500 Platform HREFv60+ " )
2011-07-05 22:38:18 -04:00
. atag_offset = 0x100 ,
2011-09-08 13:15:22 +01:00
. smp = smp_ops ( ux500_smp_ops ) ,
2011-02-15 15:01:35 +01:00
. map_io = u8500_map_io ,
. init_irq = ux500_init_irq ,
. timer = & ux500_timer ,
2011-09-06 10:23:45 +01:00
. handle_irq = gic_handle_irq ,
2011-08-26 16:54:07 +01:00
. init_machine = hrefv60_init_machine ,
2012-05-02 17:10:07 +08:00
. init_late = ux500_init_late ,
2009-11-28 08:17:18 +01:00
MACHINE_END
2011-06-20 15:55:46 +02:00
MACHINE_START ( SNOWBALL , " Calao Systems Snowball platform " )
2011-07-05 22:38:18 -04:00
. atag_offset = 0x100 ,
2011-09-08 13:15:22 +01:00
. smp = smp_ops ( ux500_smp_ops ) ,
2011-06-20 15:55:46 +02:00
. map_io = u8500_map_io ,
. init_irq = ux500_init_irq ,
/* we re-use nomadik timer here */
. timer = & ux500_timer ,
2011-09-06 10:23:45 +01:00
. handle_irq = gic_handle_irq ,
2011-08-26 16:54:07 +01:00
. init_machine = snowball_init_machine ,
2012-05-02 17:10:07 +08:00
. init_late = ux500_init_late ,
2011-06-20 15:55:46 +02:00
MACHINE_END
2012-03-07 15:04:07 +00:00
# ifdef CONFIG_MACH_UX500_DT
2012-03-15 16:46:17 +00:00
struct of_dev_auxdata u8500_auxdata_lookup [ ] __initdata = {
2012-07-06 09:06:20 +01:00
/* Requires call-back bindings. */
OF_DEV_AUXDATA ( " arm,cortex-a9-pmu " , 0 , " arm-pmu " , & db8500_pmu_platdata ) ,
2012-04-13 15:05:05 +01:00
/* Requires DMA and call-back bindings. */
2012-03-07 17:35:04 +00:00
OF_DEV_AUXDATA ( " arm,pl011 " , 0x80120000 , " uart0 " , & uart0_plat ) ,
OF_DEV_AUXDATA ( " arm,pl011 " , 0x80121000 , " uart1 " , & uart1_plat ) ,
OF_DEV_AUXDATA ( " arm,pl011 " , 0x80007000 , " uart2 " , & uart2_plat ) ,
2012-04-13 15:05:05 +01:00
/* Requires DMA bindings. */
2012-03-15 16:47:11 +00:00
OF_DEV_AUXDATA ( " arm,pl022 " , 0x80002000 , " ssp0 " , & ssp0_plat ) ,
2012-05-29 14:40:04 +08:00
OF_DEV_AUXDATA ( " arm,pl18x " , 0x80126000 , " sdi0 " , & mop500_sdi0_data ) ,
2012-08-30 16:11:08 +01:00
OF_DEV_AUXDATA ( " arm,pl18x " , 0x80118000 , " sdi1 " , & mop500_sdi1_data ) ,
OF_DEV_AUXDATA ( " arm,pl18x " , 0x80005000 , " sdi2 " , & mop500_sdi2_data ) ,
2012-05-29 14:40:04 +08:00
OF_DEV_AUXDATA ( " arm,pl18x " , 0x80114000 , " sdi4 " , & mop500_sdi4_data ) ,
2012-04-13 15:05:05 +01:00
/* Requires clock name bindings. */
OF_DEV_AUXDATA ( " st,nomadik-gpio " , 0x8012e000 , " gpio.0 " , NULL ) ,
OF_DEV_AUXDATA ( " st,nomadik-gpio " , 0x8012e080 , " gpio.1 " , NULL ) ,
OF_DEV_AUXDATA ( " st,nomadik-gpio " , 0x8000e000 , " gpio.2 " , NULL ) ,
OF_DEV_AUXDATA ( " st,nomadik-gpio " , 0x8000e080 , " gpio.3 " , NULL ) ,
OF_DEV_AUXDATA ( " st,nomadik-gpio " , 0x8000e100 , " gpio.4 " , NULL ) ,
OF_DEV_AUXDATA ( " st,nomadik-gpio " , 0x8000e180 , " gpio.5 " , NULL ) ,
OF_DEV_AUXDATA ( " st,nomadik-gpio " , 0x8011e000 , " gpio.6 " , NULL ) ,
OF_DEV_AUXDATA ( " st,nomadik-gpio " , 0x8011e080 , " gpio.7 " , NULL ) ,
OF_DEV_AUXDATA ( " st,nomadik-gpio " , 0xa03fe000 , " gpio.8 " , NULL ) ,
2012-04-17 16:11:02 +01:00
OF_DEV_AUXDATA ( " st,nomadik-i2c " , 0x80004000 , " nmk-i2c.0 " , NULL ) ,
OF_DEV_AUXDATA ( " st,nomadik-i2c " , 0x80122000 , " nmk-i2c.1 " , NULL ) ,
OF_DEV_AUXDATA ( " st,nomadik-i2c " , 0x80128000 , " nmk-i2c.2 " , NULL ) ,
OF_DEV_AUXDATA ( " st,nomadik-i2c " , 0x80110000 , " nmk-i2c.3 " , NULL ) ,
OF_DEV_AUXDATA ( " st,nomadik-i2c " , 0x8012a000 , " nmk-i2c.4 " , NULL ) ,
2012-07-06 15:59:01 +01:00
/* Requires device name bindings. */
OF_DEV_AUXDATA ( " stericsson,nmk_pinctrl " , 0 , " pinctrl-db8500 " , NULL ) ,
2012-07-25 13:58:36 +01:00
/* Requires clock name and DMA bindings. */
OF_DEV_AUXDATA ( " stericsson,ux500-msp-i2s " , 0x80123000 ,
" ux500-msp-i2s.0 " , & msp0_platform_data ) ,
OF_DEV_AUXDATA ( " stericsson,ux500-msp-i2s " , 0x80124000 ,
" ux500-msp-i2s.1 " , & msp1_platform_data ) ,
OF_DEV_AUXDATA ( " stericsson,ux500-msp-i2s " , 0x80117000 ,
" ux500-msp-i2s.2 " , & msp2_platform_data ) ,
OF_DEV_AUXDATA ( " stericsson,ux500-msp-i2s " , 0x80125000 ,
" ux500-msp-i2s.3 " , & msp3_platform_data ) ,
2012-03-15 16:46:17 +00:00
{ } ,
} ;
2012-04-19 21:36:30 +01:00
static const struct of_device_id u8500_local_bus_nodes [ ] = {
2012-03-15 16:46:17 +00:00
/* only create devices below soc node */
{ . compatible = " stericsson,db8500 " , } ,
2012-05-29 15:06:55 +08:00
{ . compatible = " stericsson,db8500-prcmu " , } ,
2012-04-19 21:36:30 +01:00
{ . compatible = " simple-bus " } ,
2012-03-15 16:46:17 +00:00
{ } ,
} ;
2012-03-07 15:04:07 +00:00
static void __init u8500_init_machine ( void )
{
2012-03-02 22:25:02 +00:00
struct device * parent = NULL ;
int i2c0_devs ;
int i ;
2012-05-03 00:44:52 +02:00
/* Pinmaps must be in place before devices register */
if ( of_machine_is_compatible ( " st-ericsson,mop500 " ) )
mop500_pinmaps_init ( ) ;
else if ( of_machine_is_compatible ( " calaosystems,snowball-a9500 " ) )
snowball_pinmaps_init ( ) ;
else if ( of_machine_is_compatible ( " st-ericsson,hrefv60+ " ) )
hrefv60_pinmaps_init ( ) ;
2012-05-29 10:03:09 +08:00
parent = u8500_of_init_devices ( ) ;
2012-03-02 22:25:02 +00:00
for ( i = 0 ; i < ARRAY_SIZE ( mop500_platform_devs ) ; i + + )
mop500_platform_devs [ i ] - > dev . parent = parent ;
2012-03-15 16:46:17 +00:00
/* automatically probe child nodes of db8500 device */
2012-04-19 21:36:30 +01:00
of_platform_populate ( NULL , u8500_local_bus_nodes , u8500_auxdata_lookup , parent ) ;
2012-03-02 22:25:02 +00:00
if ( of_machine_is_compatible ( " st-ericsson,mop500 " ) ) {
mop500_gpio_keys [ 0 ] . gpio = GPIO_PROX_SENSOR ;
platform_add_devices ( mop500_platform_devs ,
ARRAY_SIZE ( mop500_platform_devs ) ) ;
mop500_sdi_init ( parent ) ;
2012-09-14 15:46:29 +01:00
mop500_audio_init ( parent ) ;
2012-04-19 21:36:40 +01:00
i2c0_devs = ARRAY_SIZE ( mop500_i2c0_devices ) ;
i2c_register_board_info ( 0 , mop500_i2c0_devices , i2c0_devs ) ;
i2c_register_board_info ( 2 , mop500_i2c2_devices ,
ARRAY_SIZE ( mop500_i2c2_devices ) ) ;
2012-05-02 09:53:48 +01:00
mop500_uib_init ( ) ;
2012-08-09 16:47:28 +01:00
} else if ( of_machine_is_compatible ( " calaosystems,snowball-a9500 " ) ) {
2012-09-14 15:46:29 +01:00
mop500_of_audio_init ( parent ) ;
2012-03-02 22:25:02 +00:00
} else if ( of_machine_is_compatible ( " st-ericsson,hrefv60+ " ) ) {
/*
* The HREFv60 board removed a GPIO expander and routed
* all these GPIO pins to the internal GPIO controller
* instead .
*/
mop500_gpio_keys [ 0 ] . gpio = HREFV60_PROX_SENSE_GPIO ;
platform_add_devices ( mop500_platform_devs ,
ARRAY_SIZE ( mop500_platform_devs ) ) ;
2012-05-02 09:53:48 +01:00
mop500_uib_init ( ) ;
2012-03-02 22:25:02 +00:00
}
/* This board has full regulator constraints */
regulator_has_full_constraints ( ) ;
2012-03-07 15:04:07 +00:00
}
static const char * u8500_dt_board_compat [ ] = {
" calaosystems,snowball-a9500 " ,
" st-ericsson,hrefv60+ " ,
" st-ericsson,u8500 " ,
" st-ericsson,mop500 " ,
NULL ,
} ;
DT_MACHINE_START ( U8500_DT , " ST-Ericsson U8500 platform (Device Tree Support) " )
2011-09-08 13:15:22 +01:00
. smp = smp_ops ( ux500_smp_ops ) ,
2012-03-07 15:04:07 +00:00
. map_io = u8500_map_io ,
. init_irq = ux500_init_irq ,
/* we re-use nomadik timer here */
. timer = & ux500_timer ,
. handle_irq = gic_handle_irq ,
. init_machine = u8500_init_machine ,
2012-05-02 17:10:07 +08:00
. init_late = ux500_init_late ,
2012-03-07 15:04:07 +00:00
. dt_compat = u8500_dt_board_compat ,
MACHINE_END
# endif