2010-04-01 12:30:58 +01:00
/*
* arch / arm / mach - spear3xx / spear320 . c
*
* SPEAr320 machine source file
*
2012-03-23 00:17:43 +05:30
* Copyright ( C ) 2009 - 2012 ST Microelectronics
* Viresh Kumar < viresh . kumar @ st . com >
2010-04-01 12:30:58 +01:00
*
* This file is licensed under the terms of the GNU General Public
* License version 2. This program is licensed " as is " without any
* warranty of any kind , whether express or implied .
*/
2012-03-26 10:39:43 +05:30
# define pr_fmt(fmt) "SPEAr320: " fmt
2012-03-23 00:17:43 +05:30
# include <linux/amba/pl022.h>
# include <linux/amba/pl08x.h>
# include <linux/amba/serial.h>
# include <linux/of_platform.h>
# include <asm/hardware/vic.h>
# include <asm/mach/arch.h>
2011-03-07 05:57:01 +01:00
# include <plat/shirq.h>
2010-04-01 12:30:58 +01:00
# include <mach/generic.h>
2011-03-07 05:57:02 +01:00
# include <mach/hardware.h>
2010-04-01 12:30:58 +01:00
2010-04-01 12:31:29 +01:00
/* pad multiplexing support */
/* muxing registers */
# define PAD_MUX_CONFIG_REG 0x0C
# define MODE_CONFIG_REG 0x10
/* modes */
# define AUTO_NET_SMII_MODE (1 << 0)
# define AUTO_NET_MII_MODE (1 << 1)
# define AUTO_EXP_MODE (1 << 2)
# define SMALL_PRINTERS_MODE (1 << 3)
# define ALL_MODES 0xF
2011-05-20 08:34:22 +01:00
struct pmx_mode spear320_auto_net_smii_mode = {
2010-04-01 12:31:29 +01:00
. id = AUTO_NET_SMII_MODE ,
. name = " Automation Networking SMII Mode " ,
. mask = 0x00 ,
} ;
2011-05-20 08:34:22 +01:00
struct pmx_mode spear320_auto_net_mii_mode = {
2010-04-01 12:31:29 +01:00
. id = AUTO_NET_MII_MODE ,
. name = " Automation Networking MII Mode " ,
. mask = 0x01 ,
} ;
2011-05-20 08:34:22 +01:00
struct pmx_mode spear320_auto_exp_mode = {
2010-04-01 12:31:29 +01:00
. id = AUTO_EXP_MODE ,
. name = " Automation Expanded Mode " ,
. mask = 0x02 ,
} ;
2011-05-20 08:34:22 +01:00
struct pmx_mode spear320_small_printers_mode = {
2010-04-01 12:31:29 +01:00
. id = SMALL_PRINTERS_MODE ,
. name = " Small Printers Mode " ,
. mask = 0x03 ,
} ;
/* devices */
2011-05-20 08:34:22 +01:00
static struct pmx_dev_mode pmx_clcd_modes [ ] = {
2010-04-01 12:31:29 +01:00
{
. ids = AUTO_NET_SMII_MODE ,
. mask = 0x0 ,
} ,
} ;
2011-05-20 08:34:22 +01:00
struct pmx_dev spear320_pmx_clcd = {
2010-04-01 12:31:29 +01:00
. name = " clcd " ,
. modes = pmx_clcd_modes ,
. mode_count = ARRAY_SIZE ( pmx_clcd_modes ) ,
. enb_on_reset = 1 ,
} ;
2011-05-20 08:34:22 +01:00
static struct pmx_dev_mode pmx_emi_modes [ ] = {
2010-04-01 12:31:29 +01:00
{
. ids = AUTO_EXP_MODE ,
. mask = PMX_TIMER_1_2_MASK | PMX_TIMER_3_4_MASK ,
} ,
} ;
2011-05-20 08:34:22 +01:00
struct pmx_dev spear320_pmx_emi = {
2010-04-01 12:31:29 +01:00
. name = " emi " ,
. modes = pmx_emi_modes ,
. mode_count = ARRAY_SIZE ( pmx_emi_modes ) ,
. enb_on_reset = 1 ,
} ;
2011-05-20 08:34:22 +01:00
static struct pmx_dev_mode pmx_fsmc_modes [ ] = {
2010-04-01 12:31:29 +01:00
{
. ids = ALL_MODES ,
. mask = 0x0 ,
} ,
} ;
2011-05-20 08:34:22 +01:00
struct pmx_dev spear320_pmx_fsmc = {
2010-04-01 12:31:29 +01:00
. name = " fsmc " ,
. modes = pmx_fsmc_modes ,
. mode_count = ARRAY_SIZE ( pmx_fsmc_modes ) ,
. enb_on_reset = 1 ,
} ;
2011-05-20 08:34:22 +01:00
static struct pmx_dev_mode pmx_spp_modes [ ] = {
2010-04-01 12:31:29 +01:00
{
. ids = SMALL_PRINTERS_MODE ,
. mask = 0x0 ,
} ,
} ;
2011-05-20 08:34:22 +01:00
struct pmx_dev spear320_pmx_spp = {
2010-04-01 12:31:29 +01:00
. name = " spp " ,
. modes = pmx_spp_modes ,
. mode_count = ARRAY_SIZE ( pmx_spp_modes ) ,
. enb_on_reset = 1 ,
} ;
2011-05-20 08:34:22 +01:00
static struct pmx_dev_mode pmx_sdhci_modes [ ] = {
2010-04-01 12:31:29 +01:00
{
. ids = AUTO_NET_SMII_MODE | AUTO_NET_MII_MODE |
SMALL_PRINTERS_MODE ,
. mask = PMX_TIMER_1_2_MASK | PMX_TIMER_3_4_MASK ,
} ,
} ;
2011-05-20 08:34:22 +01:00
struct pmx_dev spear320_pmx_sdhci = {
2011-03-07 05:57:03 +01:00
. name = " sdhci " ,
. modes = pmx_sdhci_modes ,
. mode_count = ARRAY_SIZE ( pmx_sdhci_modes ) ,
2010-04-01 12:31:29 +01:00
. enb_on_reset = 1 ,
} ;
2011-05-20 08:34:22 +01:00
static struct pmx_dev_mode pmx_i2s_modes [ ] = {
2010-04-01 12:31:29 +01:00
{
. ids = AUTO_NET_SMII_MODE | AUTO_NET_MII_MODE ,
. mask = PMX_UART0_MODEM_MASK ,
} ,
} ;
2011-05-20 08:34:22 +01:00
struct pmx_dev spear320_pmx_i2s = {
2010-04-01 12:31:29 +01:00
. name = " i2s " ,
. modes = pmx_i2s_modes ,
. mode_count = ARRAY_SIZE ( pmx_i2s_modes ) ,
. enb_on_reset = 1 ,
} ;
2011-05-20 08:34:22 +01:00
static struct pmx_dev_mode pmx_uart1_modes [ ] = {
2010-04-01 12:31:29 +01:00
{
. ids = ALL_MODES ,
. mask = PMX_GPIO_PIN0_MASK | PMX_GPIO_PIN1_MASK ,
} ,
} ;
2011-05-20 08:34:22 +01:00
struct pmx_dev spear320_pmx_uart1 = {
2010-04-01 12:31:29 +01:00
. name = " uart1 " ,
. modes = pmx_uart1_modes ,
. mode_count = ARRAY_SIZE ( pmx_uart1_modes ) ,
. enb_on_reset = 1 ,
} ;
2011-05-20 08:34:22 +01:00
static struct pmx_dev_mode pmx_uart1_modem_modes [ ] = {
2010-04-01 12:31:29 +01:00
{
. ids = AUTO_EXP_MODE ,
. mask = PMX_TIMER_1_2_MASK | PMX_TIMER_3_4_MASK |
PMX_SSP_CS_MASK ,
} , {
. ids = SMALL_PRINTERS_MODE ,
. mask = PMX_GPIO_PIN3_MASK | PMX_GPIO_PIN4_MASK |
PMX_GPIO_PIN5_MASK | PMX_SSP_CS_MASK ,
} ,
} ;
2011-05-20 08:34:22 +01:00
struct pmx_dev spear320_pmx_uart1_modem = {
2010-04-01 12:31:29 +01:00
. name = " uart1_modem " ,
. modes = pmx_uart1_modem_modes ,
. mode_count = ARRAY_SIZE ( pmx_uart1_modem_modes ) ,
. enb_on_reset = 1 ,
} ;
2011-05-20 08:34:22 +01:00
static struct pmx_dev_mode pmx_uart2_modes [ ] = {
2010-04-01 12:31:29 +01:00
{
. ids = ALL_MODES ,
. mask = PMX_FIRDA_MASK ,
} ,
} ;
2011-05-20 08:34:22 +01:00
struct pmx_dev spear320_pmx_uart2 = {
2010-04-01 12:31:29 +01:00
. name = " uart2 " ,
. modes = pmx_uart2_modes ,
. mode_count = ARRAY_SIZE ( pmx_uart2_modes ) ,
. enb_on_reset = 1 ,
} ;
2011-05-20 08:34:22 +01:00
static struct pmx_dev_mode pmx_touchscreen_modes [ ] = {
2010-04-01 12:31:29 +01:00
{
. ids = AUTO_NET_SMII_MODE ,
. mask = PMX_SSP_CS_MASK ,
} ,
} ;
2011-05-20 08:34:22 +01:00
struct pmx_dev spear320_pmx_touchscreen = {
2010-04-01 12:31:29 +01:00
. name = " touchscreen " ,
. modes = pmx_touchscreen_modes ,
. mode_count = ARRAY_SIZE ( pmx_touchscreen_modes ) ,
. enb_on_reset = 1 ,
} ;
2011-05-20 08:34:22 +01:00
static struct pmx_dev_mode pmx_can_modes [ ] = {
2010-04-01 12:31:29 +01:00
{
. ids = AUTO_NET_SMII_MODE | AUTO_NET_MII_MODE | AUTO_EXP_MODE ,
. mask = PMX_GPIO_PIN2_MASK | PMX_GPIO_PIN3_MASK |
PMX_GPIO_PIN4_MASK | PMX_GPIO_PIN5_MASK ,
} ,
} ;
2011-05-20 08:34:22 +01:00
struct pmx_dev spear320_pmx_can = {
2010-04-01 12:31:29 +01:00
. name = " can " ,
. modes = pmx_can_modes ,
. mode_count = ARRAY_SIZE ( pmx_can_modes ) ,
. enb_on_reset = 1 ,
} ;
2011-05-20 08:34:22 +01:00
static struct pmx_dev_mode pmx_sdhci_led_modes [ ] = {
2010-04-01 12:31:29 +01:00
{
. ids = AUTO_NET_SMII_MODE | AUTO_NET_MII_MODE ,
. mask = PMX_SSP_CS_MASK ,
} ,
} ;
2011-05-20 08:34:22 +01:00
struct pmx_dev spear320_pmx_sdhci_led = {
2011-03-07 05:57:03 +01:00
. name = " sdhci_led " ,
. modes = pmx_sdhci_led_modes ,
. mode_count = ARRAY_SIZE ( pmx_sdhci_led_modes ) ,
2010-04-01 12:31:29 +01:00
. enb_on_reset = 1 ,
} ;
2011-05-20 08:34:22 +01:00
static struct pmx_dev_mode pmx_pwm0_modes [ ] = {
2010-04-01 12:31:29 +01:00
{
. ids = AUTO_NET_SMII_MODE | AUTO_NET_MII_MODE ,
. mask = PMX_UART0_MODEM_MASK ,
} , {
. ids = AUTO_EXP_MODE | SMALL_PRINTERS_MODE ,
. mask = PMX_MII_MASK ,
} ,
} ;
2011-05-20 08:34:22 +01:00
struct pmx_dev spear320_pmx_pwm0 = {
2010-04-01 12:31:29 +01:00
. name = " pwm0 " ,
. modes = pmx_pwm0_modes ,
. mode_count = ARRAY_SIZE ( pmx_pwm0_modes ) ,
. enb_on_reset = 1 ,
} ;
2011-05-20 08:34:22 +01:00
static struct pmx_dev_mode pmx_pwm1_modes [ ] = {
2010-04-01 12:31:29 +01:00
{
. ids = AUTO_NET_SMII_MODE | AUTO_NET_MII_MODE ,
. mask = PMX_UART0_MODEM_MASK ,
} , {
. ids = AUTO_EXP_MODE | SMALL_PRINTERS_MODE ,
. mask = PMX_MII_MASK ,
} ,
} ;
2011-05-20 08:34:22 +01:00
struct pmx_dev spear320_pmx_pwm1 = {
2010-04-01 12:31:29 +01:00
. name = " pwm1 " ,
. modes = pmx_pwm1_modes ,
. mode_count = ARRAY_SIZE ( pmx_pwm1_modes ) ,
. enb_on_reset = 1 ,
} ;
2011-05-20 08:34:22 +01:00
static struct pmx_dev_mode pmx_pwm2_modes [ ] = {
2010-04-01 12:31:29 +01:00
{
. ids = AUTO_NET_SMII_MODE | AUTO_NET_MII_MODE ,
. mask = PMX_SSP_CS_MASK ,
} , {
. ids = AUTO_EXP_MODE | SMALL_PRINTERS_MODE ,
. mask = PMX_MII_MASK ,
} ,
} ;
2011-05-20 08:34:22 +01:00
struct pmx_dev spear320_pmx_pwm2 = {
2010-04-01 12:31:29 +01:00
. name = " pwm2 " ,
. modes = pmx_pwm2_modes ,
. mode_count = ARRAY_SIZE ( pmx_pwm2_modes ) ,
. enb_on_reset = 1 ,
} ;
2011-05-20 08:34:22 +01:00
static struct pmx_dev_mode pmx_pwm3_modes [ ] = {
2010-04-01 12:31:29 +01:00
{
. ids = AUTO_EXP_MODE | SMALL_PRINTERS_MODE | AUTO_NET_SMII_MODE ,
. mask = PMX_MII_MASK ,
} ,
} ;
2011-05-20 08:34:22 +01:00
struct pmx_dev spear320_pmx_pwm3 = {
2010-04-01 12:31:29 +01:00
. name = " pwm3 " ,
. modes = pmx_pwm3_modes ,
. mode_count = ARRAY_SIZE ( pmx_pwm3_modes ) ,
. enb_on_reset = 1 ,
} ;
2011-05-20 08:34:22 +01:00
static struct pmx_dev_mode pmx_ssp1_modes [ ] = {
2010-04-01 12:31:29 +01:00
{
. ids = SMALL_PRINTERS_MODE | AUTO_NET_SMII_MODE ,
. mask = PMX_MII_MASK ,
} ,
} ;
2011-05-20 08:34:22 +01:00
struct pmx_dev spear320_pmx_ssp1 = {
2010-04-01 12:31:29 +01:00
. name = " ssp1 " ,
. modes = pmx_ssp1_modes ,
. mode_count = ARRAY_SIZE ( pmx_ssp1_modes ) ,
. enb_on_reset = 1 ,
} ;
2011-05-20 08:34:22 +01:00
static struct pmx_dev_mode pmx_ssp2_modes [ ] = {
2010-04-01 12:31:29 +01:00
{
. ids = AUTO_NET_SMII_MODE ,
. mask = PMX_MII_MASK ,
} ,
} ;
2011-05-20 08:34:22 +01:00
struct pmx_dev spear320_pmx_ssp2 = {
2010-04-01 12:31:29 +01:00
. name = " ssp2 " ,
. modes = pmx_ssp2_modes ,
. mode_count = ARRAY_SIZE ( pmx_ssp2_modes ) ,
. enb_on_reset = 1 ,
} ;
2011-05-20 08:34:22 +01:00
static struct pmx_dev_mode pmx_mii1_modes [ ] = {
2010-04-01 12:31:29 +01:00
{
. ids = AUTO_NET_MII_MODE ,
. mask = 0x0 ,
} ,
} ;
2011-05-20 08:34:22 +01:00
struct pmx_dev spear320_pmx_mii1 = {
2010-04-01 12:31:29 +01:00
. name = " mii1 " ,
. modes = pmx_mii1_modes ,
. mode_count = ARRAY_SIZE ( pmx_mii1_modes ) ,
. enb_on_reset = 1 ,
} ;
2011-05-20 08:34:22 +01:00
static struct pmx_dev_mode pmx_smii0_modes [ ] = {
2010-04-01 12:31:29 +01:00
{
. ids = AUTO_NET_SMII_MODE | AUTO_EXP_MODE | SMALL_PRINTERS_MODE ,
. mask = PMX_MII_MASK ,
} ,
} ;
2011-05-20 08:34:22 +01:00
struct pmx_dev spear320_pmx_smii0 = {
2010-04-01 12:31:29 +01:00
. name = " smii0 " ,
. modes = pmx_smii0_modes ,
. mode_count = ARRAY_SIZE ( pmx_smii0_modes ) ,
. enb_on_reset = 1 ,
} ;
2011-05-20 08:34:22 +01:00
static struct pmx_dev_mode pmx_smii1_modes [ ] = {
2010-04-01 12:31:29 +01:00
{
. ids = AUTO_NET_SMII_MODE | SMALL_PRINTERS_MODE ,
. mask = PMX_MII_MASK ,
} ,
} ;
2011-05-20 08:34:22 +01:00
struct pmx_dev spear320_pmx_smii1 = {
2010-04-01 12:31:29 +01:00
. name = " smii1 " ,
. modes = pmx_smii1_modes ,
. mode_count = ARRAY_SIZE ( pmx_smii1_modes ) ,
. enb_on_reset = 1 ,
} ;
2011-05-20 08:34:22 +01:00
static struct pmx_dev_mode pmx_i2c1_modes [ ] = {
2010-04-01 12:31:29 +01:00
{
. ids = AUTO_EXP_MODE ,
. mask = 0x0 ,
} ,
} ;
2011-05-20 08:34:22 +01:00
struct pmx_dev spear320_pmx_i2c1 = {
2010-04-01 12:31:29 +01:00
. name = " i2c1 " ,
. modes = pmx_i2c1_modes ,
. mode_count = ARRAY_SIZE ( pmx_i2c1_modes ) ,
. enb_on_reset = 1 ,
} ;
/* pmx driver structure */
2011-05-20 08:34:22 +01:00
static struct pmx_driver pmx_driver = {
2010-04-01 12:31:29 +01:00
. mode_reg = { . offset = MODE_CONFIG_REG , . mask = 0x00000007 } ,
. mux_reg = { . offset = PAD_MUX_CONFIG_REG , . mask = 0x00007fff } ,
} ;
2010-05-03 09:24:30 +01:00
/* spear3xx shared irq */
2011-05-20 08:34:20 +01:00
static struct shirq_dev_config shirq_ras1_config [ ] = {
2010-05-03 09:24:30 +01:00
{
2011-05-20 08:34:21 +01:00
. virq = SPEAR320_VIRQ_EMI ,
. status_mask = SPEAR320_EMI_IRQ_MASK ,
. clear_mask = SPEAR320_EMI_IRQ_MASK ,
2010-05-03 09:24:30 +01:00
} , {
2011-05-20 08:34:21 +01:00
. virq = SPEAR320_VIRQ_CLCD ,
. status_mask = SPEAR320_CLCD_IRQ_MASK ,
. clear_mask = SPEAR320_CLCD_IRQ_MASK ,
2010-05-03 09:24:30 +01:00
} , {
2011-05-20 08:34:21 +01:00
. virq = SPEAR320_VIRQ_SPP ,
. status_mask = SPEAR320_SPP_IRQ_MASK ,
. clear_mask = SPEAR320_SPP_IRQ_MASK ,
2010-05-03 09:24:30 +01:00
} ,
} ;
2011-05-20 08:34:20 +01:00
static struct spear_shirq shirq_ras1 = {
2011-05-20 08:34:21 +01:00
. irq = SPEAR3XX_IRQ_GEN_RAS_1 ,
2010-05-03 09:24:30 +01:00
. dev_config = shirq_ras1_config ,
. dev_count = ARRAY_SIZE ( shirq_ras1_config ) ,
. regs = {
. enb_reg = - 1 ,
2011-05-20 08:34:21 +01:00
. status_reg = SPEAR320_INT_STS_MASK_REG ,
. status_reg_mask = SPEAR320_SHIRQ_RAS1_MASK ,
. clear_reg = SPEAR320_INT_CLR_MASK_REG ,
2010-05-03 09:24:30 +01:00
. reset_to_clear = 1 ,
} ,
} ;
2011-05-20 08:34:20 +01:00
static struct shirq_dev_config shirq_ras3_config [ ] = {
2010-05-03 09:24:30 +01:00
{
2011-05-20 08:34:21 +01:00
. virq = SPEAR320_VIRQ_PLGPIO ,
. enb_mask = SPEAR320_GPIO_IRQ_MASK ,
. status_mask = SPEAR320_GPIO_IRQ_MASK ,
. clear_mask = SPEAR320_GPIO_IRQ_MASK ,
2010-05-03 09:24:30 +01:00
} , {
2011-05-20 08:34:21 +01:00
. virq = SPEAR320_VIRQ_I2S_PLAY ,
. enb_mask = SPEAR320_I2S_PLAY_IRQ_MASK ,
. status_mask = SPEAR320_I2S_PLAY_IRQ_MASK ,
. clear_mask = SPEAR320_I2S_PLAY_IRQ_MASK ,
2010-05-03 09:24:30 +01:00
} , {
2011-05-20 08:34:21 +01:00
. virq = SPEAR320_VIRQ_I2S_REC ,
. enb_mask = SPEAR320_I2S_REC_IRQ_MASK ,
. status_mask = SPEAR320_I2S_REC_IRQ_MASK ,
. clear_mask = SPEAR320_I2S_REC_IRQ_MASK ,
2010-05-03 09:24:30 +01:00
} ,
} ;
2011-05-20 08:34:20 +01:00
static struct spear_shirq shirq_ras3 = {
2011-05-20 08:34:21 +01:00
. irq = SPEAR3XX_IRQ_GEN_RAS_3 ,
2010-05-03 09:24:30 +01:00
. dev_config = shirq_ras3_config ,
. dev_count = ARRAY_SIZE ( shirq_ras3_config ) ,
. regs = {
2011-05-20 08:34:21 +01:00
. enb_reg = SPEAR320_INT_ENB_MASK_REG ,
2010-05-03 09:24:30 +01:00
. reset_to_enb = 1 ,
2011-05-20 08:34:21 +01:00
. status_reg = SPEAR320_INT_STS_MASK_REG ,
. status_reg_mask = SPEAR320_SHIRQ_RAS3_MASK ,
. clear_reg = SPEAR320_INT_CLR_MASK_REG ,
2010-05-03 09:24:30 +01:00
. reset_to_clear = 1 ,
} ,
} ;
2011-05-20 08:34:20 +01:00
static struct shirq_dev_config shirq_intrcomm_ras_config [ ] = {
2010-05-03 09:24:30 +01:00
{
2011-05-20 08:34:21 +01:00
. virq = SPEAR320_VIRQ_CANU ,
. status_mask = SPEAR320_CAN_U_IRQ_MASK ,
. clear_mask = SPEAR320_CAN_U_IRQ_MASK ,
2010-05-03 09:24:30 +01:00
} , {
2011-05-20 08:34:21 +01:00
. virq = SPEAR320_VIRQ_CANL ,
. status_mask = SPEAR320_CAN_L_IRQ_MASK ,
. clear_mask = SPEAR320_CAN_L_IRQ_MASK ,
2010-05-03 09:24:30 +01:00
} , {
2011-05-20 08:34:21 +01:00
. virq = SPEAR320_VIRQ_UART1 ,
. status_mask = SPEAR320_UART1_IRQ_MASK ,
. clear_mask = SPEAR320_UART1_IRQ_MASK ,
2010-05-03 09:24:30 +01:00
} , {
2011-05-20 08:34:21 +01:00
. virq = SPEAR320_VIRQ_UART2 ,
. status_mask = SPEAR320_UART2_IRQ_MASK ,
. clear_mask = SPEAR320_UART2_IRQ_MASK ,
2010-05-03 09:24:30 +01:00
} , {
2011-05-20 08:34:21 +01:00
. virq = SPEAR320_VIRQ_SSP1 ,
. status_mask = SPEAR320_SSP1_IRQ_MASK ,
. clear_mask = SPEAR320_SSP1_IRQ_MASK ,
2010-05-03 09:24:30 +01:00
} , {
2011-05-20 08:34:21 +01:00
. virq = SPEAR320_VIRQ_SSP2 ,
. status_mask = SPEAR320_SSP2_IRQ_MASK ,
. clear_mask = SPEAR320_SSP2_IRQ_MASK ,
2010-05-03 09:24:30 +01:00
} , {
2011-05-20 08:34:21 +01:00
. virq = SPEAR320_VIRQ_SMII0 ,
. status_mask = SPEAR320_SMII0_IRQ_MASK ,
. clear_mask = SPEAR320_SMII0_IRQ_MASK ,
2010-05-03 09:24:30 +01:00
} , {
2011-05-20 08:34:21 +01:00
. virq = SPEAR320_VIRQ_MII1_SMII1 ,
. status_mask = SPEAR320_MII1_SMII1_IRQ_MASK ,
. clear_mask = SPEAR320_MII1_SMII1_IRQ_MASK ,
2010-05-03 09:24:30 +01:00
} , {
2011-05-20 08:34:21 +01:00
. virq = SPEAR320_VIRQ_WAKEUP_SMII0 ,
. status_mask = SPEAR320_WAKEUP_SMII0_IRQ_MASK ,
. clear_mask = SPEAR320_WAKEUP_SMII0_IRQ_MASK ,
2010-05-03 09:24:30 +01:00
} , {
2011-05-20 08:34:21 +01:00
. virq = SPEAR320_VIRQ_WAKEUP_MII1_SMII1 ,
. status_mask = SPEAR320_WAKEUP_MII1_SMII1_IRQ_MASK ,
. clear_mask = SPEAR320_WAKEUP_MII1_SMII1_IRQ_MASK ,
2010-05-03 09:24:30 +01:00
} , {
2011-05-20 08:34:21 +01:00
. virq = SPEAR320_VIRQ_I2C1 ,
. status_mask = SPEAR320_I2C1_IRQ_MASK ,
. clear_mask = SPEAR320_I2C1_IRQ_MASK ,
2010-05-03 09:24:30 +01:00
} ,
} ;
2011-05-20 08:34:20 +01:00
static struct spear_shirq shirq_intrcomm_ras = {
2011-05-20 08:34:21 +01:00
. irq = SPEAR3XX_IRQ_INTRCOMM_RAS_ARM ,
2010-05-03 09:24:30 +01:00
. dev_config = shirq_intrcomm_ras_config ,
. dev_count = ARRAY_SIZE ( shirq_intrcomm_ras_config ) ,
. regs = {
. enb_reg = - 1 ,
2011-05-20 08:34:21 +01:00
. status_reg = SPEAR320_INT_STS_MASK_REG ,
. status_reg_mask = SPEAR320_SHIRQ_INTRCOMM_RAS_MASK ,
. clear_reg = SPEAR320_INT_CLR_MASK_REG ,
2010-05-03 09:24:30 +01:00
. reset_to_clear = 1 ,
} ,
} ;
2012-03-23 00:17:43 +05:30
/* padmux devices to enable */
static struct pmx_dev * spear320_evb_pmx_devs [ ] = {
/* spear3xx specific devices */
& spear3xx_pmx_i2c ,
& spear3xx_pmx_ssp ,
& spear3xx_pmx_mii ,
& spear3xx_pmx_uart0 ,
/* spear320 specific devices */
& spear320_pmx_fsmc ,
& spear320_pmx_sdhci ,
& spear320_pmx_i2s ,
& spear320_pmx_uart1 ,
& spear320_pmx_uart2 ,
& spear320_pmx_can ,
& spear320_pmx_pwm0 ,
& spear320_pmx_pwm1 ,
& spear320_pmx_pwm2 ,
& spear320_pmx_mii1 ,
} ;
2012-03-26 10:29:23 +05:30
/* DMAC platform data's slave info */
struct pl08x_channel_data spear320_dma_info [ ] = {
{
. bus_id = " uart0_rx " ,
. min_signal = 2 ,
. max_signal = 2 ,
. muxval = 0 ,
. cctl = 0 ,
. periph_buses = PL08X_AHB1 ,
} , {
. bus_id = " uart0_tx " ,
. min_signal = 3 ,
. max_signal = 3 ,
. muxval = 0 ,
. cctl = 0 ,
. periph_buses = PL08X_AHB1 ,
} , {
. bus_id = " ssp0_rx " ,
. min_signal = 8 ,
. max_signal = 8 ,
. muxval = 0 ,
. cctl = 0 ,
. periph_buses = PL08X_AHB1 ,
} , {
. bus_id = " ssp0_tx " ,
. min_signal = 9 ,
. max_signal = 9 ,
. muxval = 0 ,
. cctl = 0 ,
. periph_buses = PL08X_AHB1 ,
} , {
. bus_id = " i2c0_rx " ,
. min_signal = 10 ,
. max_signal = 10 ,
. muxval = 0 ,
. cctl = 0 ,
. periph_buses = PL08X_AHB1 ,
} , {
. bus_id = " i2c0_tx " ,
. min_signal = 11 ,
. max_signal = 11 ,
. muxval = 0 ,
. cctl = 0 ,
. periph_buses = PL08X_AHB1 ,
} , {
. bus_id = " irda " ,
. min_signal = 12 ,
. max_signal = 12 ,
. muxval = 0 ,
. cctl = 0 ,
. periph_buses = PL08X_AHB1 ,
} , {
. bus_id = " adc " ,
. min_signal = 13 ,
. max_signal = 13 ,
. muxval = 0 ,
. cctl = 0 ,
. periph_buses = PL08X_AHB1 ,
} , {
. bus_id = " to_jpeg " ,
. min_signal = 14 ,
. max_signal = 14 ,
. muxval = 0 ,
. cctl = 0 ,
. periph_buses = PL08X_AHB1 ,
} , {
. bus_id = " from_jpeg " ,
. min_signal = 15 ,
. max_signal = 15 ,
. muxval = 0 ,
. cctl = 0 ,
. periph_buses = PL08X_AHB1 ,
} , {
. bus_id = " ssp1_rx " ,
. min_signal = 0 ,
. max_signal = 0 ,
. muxval = 1 ,
. cctl = 0 ,
. periph_buses = PL08X_AHB2 ,
} , {
. bus_id = " ssp1_tx " ,
. min_signal = 1 ,
. max_signal = 1 ,
. muxval = 1 ,
. cctl = 0 ,
. periph_buses = PL08X_AHB2 ,
} , {
. bus_id = " ssp2_rx " ,
. min_signal = 2 ,
. max_signal = 2 ,
. muxval = 1 ,
. cctl = 0 ,
. periph_buses = PL08X_AHB2 ,
} , {
. bus_id = " ssp2_tx " ,
. min_signal = 3 ,
. max_signal = 3 ,
. muxval = 1 ,
. cctl = 0 ,
. periph_buses = PL08X_AHB2 ,
} , {
. bus_id = " uart1_rx " ,
. min_signal = 4 ,
. max_signal = 4 ,
. muxval = 1 ,
. cctl = 0 ,
. periph_buses = PL08X_AHB2 ,
} , {
. bus_id = " uart1_tx " ,
. min_signal = 5 ,
. max_signal = 5 ,
. muxval = 1 ,
. cctl = 0 ,
. periph_buses = PL08X_AHB2 ,
} , {
. bus_id = " uart2_rx " ,
. min_signal = 6 ,
. max_signal = 6 ,
. muxval = 1 ,
. cctl = 0 ,
. periph_buses = PL08X_AHB2 ,
} , {
. bus_id = " uart2_tx " ,
. min_signal = 7 ,
. max_signal = 7 ,
. muxval = 1 ,
. cctl = 0 ,
. periph_buses = PL08X_AHB2 ,
} , {
. bus_id = " i2c1_rx " ,
. min_signal = 8 ,
. max_signal = 8 ,
. muxval = 1 ,
. cctl = 0 ,
. periph_buses = PL08X_AHB2 ,
} , {
. bus_id = " i2c1_tx " ,
. min_signal = 9 ,
. max_signal = 9 ,
. muxval = 1 ,
. cctl = 0 ,
. periph_buses = PL08X_AHB2 ,
} , {
. bus_id = " i2c2_rx " ,
. min_signal = 10 ,
. max_signal = 10 ,
. muxval = 1 ,
. cctl = 0 ,
. periph_buses = PL08X_AHB2 ,
} , {
. bus_id = " i2c2_tx " ,
. min_signal = 11 ,
. max_signal = 11 ,
. muxval = 1 ,
. cctl = 0 ,
. periph_buses = PL08X_AHB2 ,
} , {
. bus_id = " i2s_rx " ,
. min_signal = 12 ,
. max_signal = 12 ,
. muxval = 1 ,
. cctl = 0 ,
. periph_buses = PL08X_AHB2 ,
} , {
. bus_id = " i2s_tx " ,
. min_signal = 13 ,
. max_signal = 13 ,
. muxval = 1 ,
. cctl = 0 ,
. periph_buses = PL08X_AHB2 ,
} , {
. bus_id = " rs485_rx " ,
. min_signal = 14 ,
. max_signal = 14 ,
. muxval = 1 ,
. cctl = 0 ,
. periph_buses = PL08X_AHB2 ,
} , {
. bus_id = " rs485_tx " ,
. min_signal = 15 ,
. max_signal = 15 ,
. muxval = 1 ,
. cctl = 0 ,
. periph_buses = PL08X_AHB2 ,
} ,
} ;
2012-03-23 00:17:43 +05:30
static struct pl022_ssp_controller spear320_ssp_data [ ] = {
{
. bus_id = 1 ,
. enable_dma = 1 ,
. dma_filter = pl08x_filter_id ,
. dma_tx_param = " ssp1_tx " ,
. dma_rx_param = " ssp1_rx " ,
. num_chipselect = 2 ,
} , {
. bus_id = 2 ,
. enable_dma = 1 ,
. dma_filter = pl08x_filter_id ,
. dma_tx_param = " ssp2_tx " ,
. dma_rx_param = " ssp2_rx " ,
. num_chipselect = 2 ,
}
} ;
static struct amba_pl011_data spear320_uart_data [ ] = {
{
. dma_filter = pl08x_filter_id ,
. dma_tx_param = " uart1_tx " ,
. dma_rx_param = " uart1_rx " ,
} , {
. dma_filter = pl08x_filter_id ,
. dma_tx_param = " uart2_tx " ,
. dma_rx_param = " uart2_rx " ,
} ,
} ;
2011-03-07 05:57:05 +01:00
2012-03-23 00:17:43 +05:30
/* Add SPEAr310 auxdata to pass platform data */
static struct of_dev_auxdata spear320_auxdata_lookup [ ] __initdata = {
OF_DEV_AUXDATA ( " arm,pl022 " , SPEAR3XX_ICM1_SSP_BASE , NULL ,
& pl022_plat_data ) ,
2012-03-26 10:29:23 +05:30
OF_DEV_AUXDATA ( " arm,pl080 " , SPEAR3XX_ICM3_DMA_BASE , NULL ,
& pl080_plat_data ) ,
2012-03-23 00:17:43 +05:30
OF_DEV_AUXDATA ( " arm,pl022 " , SPEAR320_SSP0_BASE , NULL ,
& spear320_ssp_data [ 0 ] ) ,
OF_DEV_AUXDATA ( " arm,pl022 " , SPEAR320_SSP1_BASE , NULL ,
& spear320_ssp_data [ 1 ] ) ,
OF_DEV_AUXDATA ( " arm,pl011 " , SPEAR320_UART1_BASE , NULL ,
& spear320_uart_data [ 0 ] ) ,
OF_DEV_AUXDATA ( " arm,pl011 " , SPEAR320_UART2_BASE , NULL ,
& spear320_uart_data [ 1 ] ) ,
{ }
} ;
static void __init spear320_dt_init ( void )
2010-04-01 12:30:58 +01:00
{
2010-05-03 09:24:30 +01:00
void __iomem * base ;
int ret = 0 ;
2012-03-26 10:29:23 +05:30
pl080_plat_data . slave_channels = spear320_dma_info ;
pl080_plat_data . num_slave_channels = ARRAY_SIZE ( spear320_dma_info ) ;
2012-03-23 00:17:43 +05:30
of_platform_populate ( NULL , of_default_bus_match_table ,
spear320_auxdata_lookup , NULL ) ;
2010-05-03 09:24:30 +01:00
tree-wide: fix comment/printk typos
"gadget", "through", "command", "maintain", "maintain", "controller", "address",
"between", "initiali[zs]e", "instead", "function", "select", "already",
"equal", "access", "management", "hierarchy", "registration", "interest",
"relative", "memory", "offset", "already",
Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
2010-11-01 15:38:34 -04:00
/* shared irq registration */
2011-03-07 05:57:06 +01:00
base = ioremap ( SPEAR320_SOC_CONFIG_BASE , SZ_4K ) ;
2010-05-03 09:24:30 +01:00
if ( base ) {
/* shirq 1 */
shirq_ras1 . regs . base = base ;
ret = spear_shirq_register ( & shirq_ras1 ) ;
if ( ret )
2012-03-26 10:39:43 +05:30
pr_err ( " Error registering Shared IRQ 1 \n " ) ;
2010-05-03 09:24:30 +01:00
/* shirq 3 */
shirq_ras3 . regs . base = base ;
ret = spear_shirq_register ( & shirq_ras3 ) ;
if ( ret )
2012-03-26 10:39:43 +05:30
pr_err ( " Error registering Shared IRQ 3 \n " ) ;
2010-05-03 09:24:30 +01:00
/* shirq 4 */
shirq_intrcomm_ras . regs . base = base ;
ret = spear_shirq_register ( & shirq_intrcomm_ras ) ;
if ( ret )
2012-03-26 10:39:43 +05:30
pr_err ( " Error registering Shared IRQ 4 \n " ) ;
2010-05-03 09:24:30 +01:00
}
2010-04-01 12:31:29 +01:00
2012-03-23 00:17:43 +05:30
if ( of_machine_is_compatible ( " st,spear320-evb " ) ) {
/* pmx initialization */
pmx_driver . base = base ;
pmx_driver . mode = & spear320_auto_net_mii_mode ;
pmx_driver . devs = spear320_evb_pmx_devs ;
pmx_driver . devs_count = ARRAY_SIZE ( spear320_evb_pmx_devs ) ;
2011-05-20 08:34:22 +01:00
2012-03-23 00:17:43 +05:30
ret = pmx_register ( & pmx_driver ) ;
if ( ret )
pr_err ( " padmux: registration failed. err no: %d \n " ,
ret ) ;
}
2010-04-01 12:31:29 +01:00
}
2012-03-23 00:17:43 +05:30
static const char * const spear320_dt_board_compat [ ] = {
" st,spear320 " ,
" st,spear320-evb " ,
NULL ,
} ;
static void __init spear320_map_io ( void )
{
spear3xx_map_io ( ) ;
spear320_clk_init ( ) ;
}
DT_MACHINE_START ( SPEAR320_DT , " ST SPEAr320 SoC with Flattened Device Tree " )
. map_io = spear320_map_io ,
. init_irq = spear3xx_dt_init_irq ,
. handle_irq = vic_handle_irq ,
. timer = & spear3xx_timer ,
. init_machine = spear320_dt_init ,
. restart = spear_restart ,
. dt_compat = spear320_dt_board_compat ,
MACHINE_END