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>
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>
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>
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-02-03 13:02:48 +01:00
# include <plat/i2c.h>
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-05-10 10:14:06 +02:00
# include <mach/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"
2012-04-20 11:32:59 +02:00
# include "board-mop500-msp.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 " ,
. default_trigger = " none " ,
. 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 ,
} ,
} ;
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 } ,
} ;
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 ,
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 = {
2012-05-19 17:21:37 +02:00
. name = " ab8500-core " ,
2010-09-06 22:15:08 +01:00
. id = 0 ,
. dev = {
. platform_data = & ab8500_platdata ,
} ,
. num_resources = 1 ,
. resource = ab8500_resources ,
} ;
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
} ;
2011-05-13 12:31:13 +02:00
# define U8500_I2C_CONTROLLER(id, _slsu, _tft, _rft, clk, t_out, _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 , \
2011-05-13 12:31:13 +02:00
/* Slave response timeout(ms) */ \
. timeout = t_out , \
2010-02-03 13:02:48 +01:00
. sm = _sm , \
}
/*
* The board uses 4 i2c controllers , initialize all of
* them with slave data setup time of 250 ns ,
2011-05-13 12:31:13 +02:00
* Tx & Rx FIFO threshold values as 8 and standard
2010-02-03 13:02:48 +01:00
* mode of operation
*/
2011-05-13 12:31:13 +02:00
U8500_I2C_CONTROLLER ( 0 , 0xe , 1 , 8 , 100000 , 200 , I2C_FREQ_MODE_FAST ) ;
U8500_I2C_CONTROLLER ( 1 , 0xe , 1 , 8 , 100000 , 200 , I2C_FREQ_MODE_FAST ) ;
U8500_I2C_CONTROLLER ( 2 , 0xe , 1 , 8 , 100000 , 200 , I2C_FREQ_MODE_FAST ) ;
U8500_I2C_CONTROLLER ( 3 , 0xe , 1 , 8 , 100000 , 200 , I2C_FREQ_MODE_FAST ) ;
2010-02-03 13:02:48 +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-02-06 11:22:21 -08:00
db8500_add_i2c0 ( parent , & u8500_i2c0_data ) ;
db8500_add_i2c1 ( parent , & u8500_i2c1_data ) ;
db8500_add_i2c2 ( parent , & u8500_i2c2_data ) ;
db8500_add_i2c3 ( parent , & u8500_i2c3_data ) ;
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 ,
2011-06-20 15:55:46 +02:00
& ab8500_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
2011-06-13 10:11:44 +02:00
# define PRCC_K_SOFTRST_SET 0x18
# define PRCC_K_SOFTRST_CLEAR 0x1C
static void ux500_uart0_reset ( void )
{
void __iomem * prcc_rst_set , * prcc_rst_clr ;
prcc_rst_set = ( void __iomem * ) IO_ADDRESS ( U8500_CLKRST1_BASE +
PRCC_K_SOFTRST_SET ) ;
prcc_rst_clr = ( void __iomem * ) IO_ADDRESS ( U8500_CLKRST1_BASE +
PRCC_K_SOFTRST_CLEAR ) ;
/* Activate soft reset PRCC_K_SOFTRST_CLEAR */
writel ( ( readl ( prcc_rst_clr ) | 0x1 ) , prcc_rst_clr ) ;
udelay ( 1 ) ;
/* Release soft reset PRCC_K_SOFTRST_SET */
writel ( ( readl ( prcc_rst_set ) | 0x1 ) , prcc_rst_set ) ;
udelay ( 1 ) ;
}
2012-05-07 01:33:24 +02:00
/* This needs to be referenced by callbacks */
struct pinctrl * u0_p ;
struct pinctrl_state * u0_def ;
struct pinctrl_state * u0_sleep ;
2011-06-13 10:11:44 +02:00
static void ux500_uart0_init ( void )
{
int ret ;
2012-05-07 01:33:24 +02:00
if ( IS_ERR ( u0_p ) | | IS_ERR ( u0_def ) )
return ;
ret = pinctrl_select_state ( u0_p , u0_def ) ;
if ( ret )
pr_err ( " could not set UART0 defstate \n " ) ;
2011-06-13 10:11:44 +02:00
}
static void ux500_uart0_exit ( void )
{
int ret ;
2012-05-07 01:33:24 +02:00
if ( IS_ERR ( u0_p ) | | IS_ERR ( u0_sleep ) )
return ;
ret = pinctrl_select_state ( u0_p , u0_sleep ) ;
if ( ret )
pr_err ( " could not set UART0 idlestate \n " ) ;
2011-06-13 10:11:44 +02:00
}
2010-10-14 13:57:59 +02:00
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
2011-06-13 10:11:44 +02:00
. init = ux500_uart0_init ,
. exit = ux500_uart0_exit ,
. reset = ux500_uart0_reset ,
2010-10-14 13:57:59 +02:00
} ;
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-07 01:33:24 +02:00
struct amba_device * uart0_device ;
uart0_device = db8500_add_uart0 ( parent , & uart0_plat ) ;
if ( uart0_device ) {
u0_p = pinctrl_get ( & uart0_device - > dev ) ;
if ( IS_ERR ( u0_p ) )
dev_err ( & uart0_device - > dev ,
" could not get UART0 pinctrl \n " ) ;
else {
u0_def = pinctrl_lookup_state ( u0_p ,
PINCTRL_STATE_DEFAULT ) ;
if ( IS_ERR ( u0_def ) ) {
dev_err ( & uart0_device - > dev ,
" could not get UART0 defstate \n " ) ;
}
u0_sleep = pinctrl_lookup_state ( u0_p ,
PINCTRL_STATE_SLEEP ) ;
if ( IS_ERR ( u0_sleep ) )
dev_err ( & uart0_device - > dev ,
" could not get UART0 idlestate \n " ) ;
}
}
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 ,
& ab8500_device ,
} ;
2012-05-30 09:55:38 +08:00
static struct platform_device * snowball_of_platform_devs [ ] __initdata = {
& snowball_led_dev ,
& snowball_key_dev ,
& ab8500_device ,
} ;
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-02-06 11:22:21 -08:00
parent = u8500_init_devices ( ) ;
2011-08-26 16:54:07 +01:00
2012-03-15 16:46:17 +00:00
/* FIXME: parent of ab8500 should be prcmu */
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-04-20 11:32:59 +02:00
mop500_msp_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 ( ) ;
}
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-02-06 11:22:21 -08:00
parent = u8500_init_devices ( ) ;
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-04-20 11:32:59 +02:00
mop500_msp_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-02-06 11:22:21 -08:00
parent = u8500_init_devices ( ) ;
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-04-20 11:32:59 +02:00
mop500_msp_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 ( ) ;
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 ,
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-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-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-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-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-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-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 ;
for ( i = 0 ; i < ARRAY_SIZE ( snowball_platform_devs ) ; i + + )
snowball_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-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-03-02 22:25:02 +00:00
} else if ( of_machine_is_compatible ( " calaosystems,snowball-a9500 " ) ) {
2012-05-30 09:55:38 +08:00
/*
* Devices to be DT : ed :
* snowball_led_dev = todo
* snowball_key_dev = todo
2012-05-29 10:28:34 +08:00
* snowball_sbnet_dev = done
2012-05-30 09:55:38 +08:00
* ab8500_device = todo
*/
platform_add_devices ( snowball_of_platform_devs ,
ARRAY_SIZE ( snowball_of_platform_devs ) ) ;
2012-03-02 22:25:02 +00:00
snowball_sdi_init ( parent ) ;
} 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 ) ) ;
hrefv60_sdi_init ( parent ) ;
2012-04-19 21:36:40 +01:00
i2c0_devs = ARRAY_SIZE ( mop500_i2c0_devices ) ;
i2c0_devs - = NUM_PRE_V60_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-03-02 22:25:02 +00:00
}
mop500_i2c_init ( parent ) ;
/* 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) " )
. 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