#include <linux/amba/bus.h>
  #include <asm/mach/time.h>
  #include <asm/mach/map.h>
- #include <plat/padmux.h>
  
 -/* spear3xx declarations */
 -/*
 - * Each GPT has 2 timer channels
 - * Following GPT channels will be used as clock source and clockevent
 - */
 -#define SPEAR_GPT0_BASE               SPEAR3XX_ML1_TMR_BASE
 -#define SPEAR_GPT0_CHAN0_IRQ  SPEAR3XX_IRQ_CPU_GPT1_1
 -#define SPEAR_GPT0_CHAN1_IRQ  SPEAR3XX_IRQ_CPU_GPT1_2
 -
  /* Add spear3xx family device structure declarations here */
  extern struct sys_timer spear3xx_timer;
  extern struct pl022_ssp_controller pl022_plat_data;
 
  #include <asm/mach/arch.h>
  #include <plat/shirq.h>
  #include <mach/generic.h>
 -#include <mach/hardware.h>
 +#include <mach/spear.h>
 +
 +/* Base address of various IPs */
 +#define SPEAR300_TELECOM_BASE         UL(0x50000000)
 +
 +/* Interrupt registers offsets and masks */
 +#define SPEAR300_INT_ENB_MASK_REG     0x54
 +#define SPEAR300_INT_STS_MASK_REG     0x58
 +#define SPEAR300_IT_PERS_S_IRQ_MASK   (1 << 0)
 +#define SPEAR300_IT_CHANGE_S_IRQ_MASK (1 << 1)
 +#define SPEAR300_I2S_IRQ_MASK         (1 << 2)
 +#define SPEAR300_TDM_IRQ_MASK         (1 << 3)
 +#define SPEAR300_CAMERA_L_IRQ_MASK    (1 << 4)
 +#define SPEAR300_CAMERA_F_IRQ_MASK    (1 << 5)
 +#define SPEAR300_CAMERA_V_IRQ_MASK    (1 << 6)
 +#define SPEAR300_KEYBOARD_IRQ_MASK    (1 << 7)
 +#define SPEAR300_GPIO1_IRQ_MASK               (1 << 8)
 +
 +#define SPEAR300_SHIRQ_RAS1_MASK      0x1FF
 +
 +#define SPEAR300_SOC_CONFIG_BASE      UL(0x99000000)
 +
 +
 +/* SPEAr300 Virtual irq definitions */
 +/* IRQs sharing IRQ_GEN_RAS_1 */
 +#define SPEAR300_VIRQ_IT_PERS_S                       (SPEAR3XX_VIRQ_START + 0)
 +#define SPEAR300_VIRQ_IT_CHANGE_S             (SPEAR3XX_VIRQ_START + 1)
 +#define SPEAR300_VIRQ_I2S                     (SPEAR3XX_VIRQ_START + 2)
 +#define SPEAR300_VIRQ_TDM                     (SPEAR3XX_VIRQ_START + 3)
 +#define SPEAR300_VIRQ_CAMERA_L                        (SPEAR3XX_VIRQ_START + 4)
 +#define SPEAR300_VIRQ_CAMERA_F                        (SPEAR3XX_VIRQ_START + 5)
 +#define SPEAR300_VIRQ_CAMERA_V                        (SPEAR3XX_VIRQ_START + 6)
 +#define SPEAR300_VIRQ_KEYBOARD                        (SPEAR3XX_VIRQ_START + 7)
 +#define SPEAR300_VIRQ_GPIO1                   (SPEAR3XX_VIRQ_START + 8)
 +
 +/* IRQs sharing IRQ_GEN_RAS_3 */
 +#define SPEAR300_IRQ_CLCD                     SPEAR3XX_IRQ_GEN_RAS_3
 +
 +/* IRQs sharing IRQ_INTRCOMM_RAS_ARM */
 +#define SPEAR300_IRQ_SDHCI                    SPEAR3XX_IRQ_INTRCOMM_RAS_ARM
  
- /* pad multiplexing support */
- /* muxing registers */
- #define PAD_MUX_CONFIG_REG    0x00
- #define MODE_CONFIG_REG               0x04
- 
- /* modes */
- #define NAND_MODE                     (1 << 0)
- #define NOR_MODE                      (1 << 1)
- #define PHOTO_FRAME_MODE              (1 << 2)
- #define LEND_IP_PHONE_MODE            (1 << 3)
- #define HEND_IP_PHONE_MODE            (1 << 4)
- #define LEND_WIFI_PHONE_MODE          (1 << 5)
- #define HEND_WIFI_PHONE_MODE          (1 << 6)
- #define ATA_PABX_WI2S_MODE            (1 << 7)
- #define ATA_PABX_I2S_MODE             (1 << 8)
- #define CAML_LCDW_MODE                        (1 << 9)
- #define CAMU_LCD_MODE                 (1 << 10)
- #define CAMU_WLCD_MODE                        (1 << 11)
- #define CAML_LCD_MODE                 (1 << 12)
- #define ALL_MODES                     0x1FFF
- 
- struct pmx_mode spear300_nand_mode = {
-       .id = NAND_MODE,
-       .name = "nand mode",
-       .mask = 0x00,
- };
- 
- struct pmx_mode spear300_nor_mode = {
-       .id = NOR_MODE,
-       .name = "nor mode",
-       .mask = 0x01,
- };
- 
- struct pmx_mode spear300_photo_frame_mode = {
-       .id = PHOTO_FRAME_MODE,
-       .name = "photo frame mode",
-       .mask = 0x02,
- };
- 
- struct pmx_mode spear300_lend_ip_phone_mode = {
-       .id = LEND_IP_PHONE_MODE,
-       .name = "lend ip phone mode",
-       .mask = 0x03,
- };
- 
- struct pmx_mode spear300_hend_ip_phone_mode = {
-       .id = HEND_IP_PHONE_MODE,
-       .name = "hend ip phone mode",
-       .mask = 0x04,
- };
- 
- struct pmx_mode spear300_lend_wifi_phone_mode = {
-       .id = LEND_WIFI_PHONE_MODE,
-       .name = "lend wifi phone mode",
-       .mask = 0x05,
- };
- 
- struct pmx_mode spear300_hend_wifi_phone_mode = {
-       .id = HEND_WIFI_PHONE_MODE,
-       .name = "hend wifi phone mode",
-       .mask = 0x06,
- };
- 
- struct pmx_mode spear300_ata_pabx_wi2s_mode = {
-       .id = ATA_PABX_WI2S_MODE,
-       .name = "ata pabx wi2s mode",
-       .mask = 0x07,
- };
- 
- struct pmx_mode spear300_ata_pabx_i2s_mode = {
-       .id = ATA_PABX_I2S_MODE,
-       .name = "ata pabx i2s mode",
-       .mask = 0x08,
- };
- 
- struct pmx_mode spear300_caml_lcdw_mode = {
-       .id = CAML_LCDW_MODE,
-       .name = "caml lcdw mode",
-       .mask = 0x0C,
- };
- 
- struct pmx_mode spear300_camu_lcd_mode = {
-       .id = CAMU_LCD_MODE,
-       .name = "camu lcd mode",
-       .mask = 0x0D,
- };
- 
- struct pmx_mode spear300_camu_wlcd_mode = {
-       .id = CAMU_WLCD_MODE,
-       .name = "camu wlcd mode",
-       .mask = 0x0E,
- };
- 
- struct pmx_mode spear300_caml_lcd_mode = {
-       .id = CAML_LCD_MODE,
-       .name = "caml lcd mode",
-       .mask = 0x0F,
- };
- 
- /* devices */
- static struct pmx_dev_mode pmx_fsmc_2_chips_modes[] = {
-       {
-               .ids = NAND_MODE | NOR_MODE | PHOTO_FRAME_MODE |
-                       ATA_PABX_WI2S_MODE | ATA_PABX_I2S_MODE,
-               .mask = PMX_FIRDA_MASK,
-       },
- };
- 
- struct pmx_dev spear300_pmx_fsmc_2_chips = {
-       .name = "fsmc_2_chips",
-       .modes = pmx_fsmc_2_chips_modes,
-       .mode_count = ARRAY_SIZE(pmx_fsmc_2_chips_modes),
-       .enb_on_reset = 1,
- };
- 
- static struct pmx_dev_mode pmx_fsmc_4_chips_modes[] = {
-       {
-               .ids = NAND_MODE | NOR_MODE | PHOTO_FRAME_MODE |
-                       ATA_PABX_WI2S_MODE | ATA_PABX_I2S_MODE,
-               .mask = PMX_FIRDA_MASK | PMX_UART0_MASK,
-       },
- };
- 
- struct pmx_dev spear300_pmx_fsmc_4_chips = {
-       .name = "fsmc_4_chips",
-       .modes = pmx_fsmc_4_chips_modes,
-       .mode_count = ARRAY_SIZE(pmx_fsmc_4_chips_modes),
-       .enb_on_reset = 1,
- };
- 
- static struct pmx_dev_mode pmx_keyboard_modes[] = {
-       {
-               .ids = LEND_IP_PHONE_MODE | HEND_IP_PHONE_MODE |
-                       LEND_WIFI_PHONE_MODE | HEND_WIFI_PHONE_MODE |
-                       CAML_LCDW_MODE | CAMU_LCD_MODE | CAMU_WLCD_MODE |
-                       CAML_LCD_MODE,
-               .mask = 0x0,
-       },
- };
- 
- struct pmx_dev spear300_pmx_keyboard = {
-       .name = "keyboard",
-       .modes = pmx_keyboard_modes,
-       .mode_count = ARRAY_SIZE(pmx_keyboard_modes),
-       .enb_on_reset = 1,
- };
- 
- static struct pmx_dev_mode pmx_clcd_modes[] = {
-       {
-               .ids = PHOTO_FRAME_MODE,
-               .mask = PMX_TIMER_1_2_MASK | PMX_TIMER_3_4_MASK ,
-       }, {
-               .ids = HEND_IP_PHONE_MODE | HEND_WIFI_PHONE_MODE |
-                       CAMU_LCD_MODE | CAML_LCD_MODE,
-               .mask = PMX_TIMER_3_4_MASK,
-       },
- };
- 
- struct pmx_dev spear300_pmx_clcd = {
-       .name = "clcd",
-       .modes = pmx_clcd_modes,
-       .mode_count = ARRAY_SIZE(pmx_clcd_modes),
-       .enb_on_reset = 1,
- };
- 
- static struct pmx_dev_mode pmx_telecom_gpio_modes[] = {
-       {
-               .ids = PHOTO_FRAME_MODE | CAMU_LCD_MODE | CAML_LCD_MODE,
-               .mask = PMX_MII_MASK,
-       }, {
-               .ids = LEND_IP_PHONE_MODE | LEND_WIFI_PHONE_MODE,
-               .mask = PMX_MII_MASK | PMX_TIMER_1_2_MASK | PMX_TIMER_3_4_MASK,
-       }, {
-               .ids = ATA_PABX_I2S_MODE | CAML_LCDW_MODE | CAMU_WLCD_MODE,
-               .mask = PMX_MII_MASK | PMX_TIMER_3_4_MASK,
-       }, {
-               .ids = HEND_IP_PHONE_MODE | HEND_WIFI_PHONE_MODE,
-               .mask = PMX_MII_MASK | PMX_TIMER_1_2_MASK,
-       }, {
-               .ids = ATA_PABX_WI2S_MODE,
-               .mask = PMX_MII_MASK | PMX_TIMER_1_2_MASK | PMX_TIMER_3_4_MASK
-                       | PMX_UART0_MODEM_MASK,
-       },
- };
- 
- struct pmx_dev spear300_pmx_telecom_gpio = {
-       .name = "telecom_gpio",
-       .modes = pmx_telecom_gpio_modes,
-       .mode_count = ARRAY_SIZE(pmx_telecom_gpio_modes),
-       .enb_on_reset = 1,
- };
- 
- static struct pmx_dev_mode pmx_telecom_tdm_modes[] = {
-       {
-               .ids = PHOTO_FRAME_MODE | LEND_IP_PHONE_MODE |
-                       HEND_IP_PHONE_MODE | LEND_WIFI_PHONE_MODE
-                       | HEND_WIFI_PHONE_MODE | ATA_PABX_WI2S_MODE
-                       | ATA_PABX_I2S_MODE | CAML_LCDW_MODE | CAMU_LCD_MODE
-                       | CAMU_WLCD_MODE | CAML_LCD_MODE,
-               .mask = PMX_UART0_MODEM_MASK | PMX_SSP_CS_MASK,
-       },
- };
- 
- struct pmx_dev spear300_pmx_telecom_tdm = {
-       .name = "telecom_tdm",
-       .modes = pmx_telecom_tdm_modes,
-       .mode_count = ARRAY_SIZE(pmx_telecom_tdm_modes),
-       .enb_on_reset = 1,
- };
- 
- static struct pmx_dev_mode pmx_telecom_spi_cs_i2c_clk_modes[] = {
-       {
-               .ids = LEND_IP_PHONE_MODE | HEND_IP_PHONE_MODE |
-                       LEND_WIFI_PHONE_MODE | HEND_WIFI_PHONE_MODE
-                       | ATA_PABX_WI2S_MODE | ATA_PABX_I2S_MODE |
-                       CAML_LCDW_MODE | CAML_LCD_MODE,
-               .mask = PMX_TIMER_1_2_MASK | PMX_TIMER_3_4_MASK,
-       },
- };
- 
- struct pmx_dev spear300_pmx_telecom_spi_cs_i2c_clk = {
-       .name = "telecom_spi_cs_i2c_clk",
-       .modes = pmx_telecom_spi_cs_i2c_clk_modes,
-       .mode_count = ARRAY_SIZE(pmx_telecom_spi_cs_i2c_clk_modes),
-       .enb_on_reset = 1,
- };
- 
- static struct pmx_dev_mode pmx_telecom_camera_modes[] = {
-       {
-               .ids = CAML_LCDW_MODE | CAML_LCD_MODE,
-               .mask = PMX_MII_MASK,
-       }, {
-               .ids = CAMU_LCD_MODE | CAMU_WLCD_MODE,
-               .mask = PMX_TIMER_1_2_MASK | PMX_TIMER_3_4_MASK | PMX_MII_MASK,
-       },
- };
- 
- struct pmx_dev spear300_pmx_telecom_camera = {
-       .name = "telecom_camera",
-       .modes = pmx_telecom_camera_modes,
-       .mode_count = ARRAY_SIZE(pmx_telecom_camera_modes),
-       .enb_on_reset = 1,
- };
- 
- static struct pmx_dev_mode pmx_telecom_dac_modes[] = {
-       {
-               .ids = ATA_PABX_I2S_MODE | CAML_LCDW_MODE | CAMU_LCD_MODE
-                       | CAMU_WLCD_MODE | CAML_LCD_MODE,
-               .mask = PMX_TIMER_1_2_MASK,
-       },
- };
- 
- struct pmx_dev spear300_pmx_telecom_dac = {
-       .name = "telecom_dac",
-       .modes = pmx_telecom_dac_modes,
-       .mode_count = ARRAY_SIZE(pmx_telecom_dac_modes),
-       .enb_on_reset = 1,
- };
- 
- static struct pmx_dev_mode pmx_telecom_i2s_modes[] = {
-       {
-               .ids = LEND_IP_PHONE_MODE | HEND_IP_PHONE_MODE
-                       | LEND_WIFI_PHONE_MODE | HEND_WIFI_PHONE_MODE |
-                       ATA_PABX_I2S_MODE | CAML_LCDW_MODE | CAMU_LCD_MODE
-                       | CAMU_WLCD_MODE | CAML_LCD_MODE,
-               .mask = PMX_UART0_MODEM_MASK,
-       },
- };
- 
- struct pmx_dev spear300_pmx_telecom_i2s = {
-       .name = "telecom_i2s",
-       .modes = pmx_telecom_i2s_modes,
-       .mode_count = ARRAY_SIZE(pmx_telecom_i2s_modes),
-       .enb_on_reset = 1,
- };
- 
- static struct pmx_dev_mode pmx_telecom_boot_pins_modes[] = {
-       {
-               .ids = NAND_MODE | NOR_MODE,
-               .mask = PMX_UART0_MODEM_MASK | PMX_TIMER_1_2_MASK |
-                       PMX_TIMER_3_4_MASK,
-       },
- };
- 
- struct pmx_dev spear300_pmx_telecom_boot_pins = {
-       .name = "telecom_boot_pins",
-       .modes = pmx_telecom_boot_pins_modes,
-       .mode_count = ARRAY_SIZE(pmx_telecom_boot_pins_modes),
-       .enb_on_reset = 1,
- };
- 
- static struct pmx_dev_mode pmx_telecom_sdhci_4bit_modes[] = {
-       {
-               .ids = PHOTO_FRAME_MODE | LEND_IP_PHONE_MODE |
-                       HEND_IP_PHONE_MODE | LEND_WIFI_PHONE_MODE |
-                       HEND_WIFI_PHONE_MODE | CAML_LCDW_MODE | CAMU_LCD_MODE |
-                       CAMU_WLCD_MODE | CAML_LCD_MODE | ATA_PABX_WI2S_MODE |
-                       ATA_PABX_I2S_MODE,
-               .mask = PMX_GPIO_PIN0_MASK | PMX_GPIO_PIN1_MASK |
-                       PMX_GPIO_PIN2_MASK | PMX_GPIO_PIN3_MASK |
-                       PMX_GPIO_PIN4_MASK | PMX_GPIO_PIN5_MASK,
-       },
- };
- 
- struct pmx_dev spear300_pmx_telecom_sdhci_4bit = {
-       .name = "telecom_sdhci_4bit",
-       .modes = pmx_telecom_sdhci_4bit_modes,
-       .mode_count = ARRAY_SIZE(pmx_telecom_sdhci_4bit_modes),
-       .enb_on_reset = 1,
- };
- 
- static struct pmx_dev_mode pmx_telecom_sdhci_8bit_modes[] = {
-       {
-               .ids = PHOTO_FRAME_MODE | LEND_IP_PHONE_MODE |
-                       HEND_IP_PHONE_MODE | LEND_WIFI_PHONE_MODE |
-                       HEND_WIFI_PHONE_MODE | CAML_LCDW_MODE | CAMU_LCD_MODE |
-                       CAMU_WLCD_MODE | CAML_LCD_MODE,
-               .mask = PMX_GPIO_PIN0_MASK | PMX_GPIO_PIN1_MASK |
-                       PMX_GPIO_PIN2_MASK | PMX_GPIO_PIN3_MASK |
-                       PMX_GPIO_PIN4_MASK | PMX_GPIO_PIN5_MASK | PMX_MII_MASK,
-       },
- };
- 
- struct pmx_dev spear300_pmx_telecom_sdhci_8bit = {
-       .name = "telecom_sdhci_8bit",
-       .modes = pmx_telecom_sdhci_8bit_modes,
-       .mode_count = ARRAY_SIZE(pmx_telecom_sdhci_8bit_modes),
-       .enb_on_reset = 1,
- };
- 
- static struct pmx_dev_mode pmx_gpio1_modes[] = {
-       {
-               .ids = PHOTO_FRAME_MODE,
-               .mask = PMX_UART0_MODEM_MASK | PMX_TIMER_1_2_MASK |
-                       PMX_TIMER_3_4_MASK,
-       },
- };
- 
- struct pmx_dev spear300_pmx_gpio1 = {
-       .name = "arm gpio1",
-       .modes = pmx_gpio1_modes,
-       .mode_count = ARRAY_SIZE(pmx_gpio1_modes),
-       .enb_on_reset = 1,
- };
- 
- /* pmx driver structure */
- static struct pmx_driver pmx_driver = {
-       .mode_reg = {.offset = MODE_CONFIG_REG, .mask = 0x0000000f},
-       .mux_reg = {.offset = PAD_MUX_CONFIG_REG, .mask = 0x00007fff},
- };
- 
  /* spear3xx shared irq */
  static struct shirq_dev_config shirq_ras1_config[] = {
        {
 
  #include <asm/mach/arch.h>
  #include <plat/shirq.h>
  #include <mach/generic.h>
 -#include <mach/hardware.h>
 +#include <mach/spear.h>
 +
 +#define SPEAR310_UART1_BASE           UL(0xB2000000)
 +#define SPEAR310_UART2_BASE           UL(0xB2080000)
 +#define SPEAR310_UART3_BASE           UL(0xB2100000)
 +#define SPEAR310_UART4_BASE           UL(0xB2180000)
 +#define SPEAR310_UART5_BASE           UL(0xB2200000)
 +#define SPEAR310_SOC_CONFIG_BASE      UL(0xB4000000)
 +
 +/* Interrupt registers offsets and masks */
 +#define SPEAR310_INT_STS_MASK_REG     0x04
 +#define SPEAR310_SMII0_IRQ_MASK               (1 << 0)
 +#define SPEAR310_SMII1_IRQ_MASK               (1 << 1)
 +#define SPEAR310_SMII2_IRQ_MASK               (1 << 2)
 +#define SPEAR310_SMII3_IRQ_MASK               (1 << 3)
 +#define SPEAR310_WAKEUP_SMII0_IRQ_MASK        (1 << 4)
 +#define SPEAR310_WAKEUP_SMII1_IRQ_MASK        (1 << 5)
 +#define SPEAR310_WAKEUP_SMII2_IRQ_MASK        (1 << 6)
 +#define SPEAR310_WAKEUP_SMII3_IRQ_MASK        (1 << 7)
 +#define SPEAR310_UART1_IRQ_MASK               (1 << 8)
 +#define SPEAR310_UART2_IRQ_MASK               (1 << 9)
 +#define SPEAR310_UART3_IRQ_MASK               (1 << 10)
 +#define SPEAR310_UART4_IRQ_MASK               (1 << 11)
 +#define SPEAR310_UART5_IRQ_MASK               (1 << 12)
 +#define SPEAR310_EMI_IRQ_MASK         (1 << 13)
 +#define SPEAR310_TDM_HDLC_IRQ_MASK    (1 << 14)
 +#define SPEAR310_RS485_0_IRQ_MASK     (1 << 15)
 +#define SPEAR310_RS485_1_IRQ_MASK     (1 << 16)
 +
 +#define SPEAR310_SHIRQ_RAS1_MASK      0x000FF
 +#define SPEAR310_SHIRQ_RAS2_MASK      0x01F00
 +#define SPEAR310_SHIRQ_RAS3_MASK      0x02000
 +#define SPEAR310_SHIRQ_INTRCOMM_RAS_MASK      0x1C000
 +
 +/* SPEAr310 Virtual irq definitions */
 +/* IRQs sharing IRQ_GEN_RAS_1 */
 +#define SPEAR310_VIRQ_SMII0                   (SPEAR3XX_VIRQ_START + 0)
 +#define SPEAR310_VIRQ_SMII1                   (SPEAR3XX_VIRQ_START + 1)
 +#define SPEAR310_VIRQ_SMII2                   (SPEAR3XX_VIRQ_START + 2)
 +#define SPEAR310_VIRQ_SMII3                   (SPEAR3XX_VIRQ_START + 3)
 +#define SPEAR310_VIRQ_WAKEUP_SMII0            (SPEAR3XX_VIRQ_START + 4)
 +#define SPEAR310_VIRQ_WAKEUP_SMII1            (SPEAR3XX_VIRQ_START + 5)
 +#define SPEAR310_VIRQ_WAKEUP_SMII2            (SPEAR3XX_VIRQ_START + 6)
 +#define SPEAR310_VIRQ_WAKEUP_SMII3            (SPEAR3XX_VIRQ_START + 7)
 +
 +/* IRQs sharing IRQ_GEN_RAS_2 */
 +#define SPEAR310_VIRQ_UART1                   (SPEAR3XX_VIRQ_START + 8)
 +#define SPEAR310_VIRQ_UART2                   (SPEAR3XX_VIRQ_START + 9)
 +#define SPEAR310_VIRQ_UART3                   (SPEAR3XX_VIRQ_START + 10)
 +#define SPEAR310_VIRQ_UART4                   (SPEAR3XX_VIRQ_START + 11)
 +#define SPEAR310_VIRQ_UART5                   (SPEAR3XX_VIRQ_START + 12)
 +
 +/* IRQs sharing IRQ_GEN_RAS_3 */
 +#define SPEAR310_VIRQ_EMI                     (SPEAR3XX_VIRQ_START + 13)
 +#define SPEAR310_VIRQ_PLGPIO                  (SPEAR3XX_VIRQ_START + 14)
 +
 +/* IRQs sharing IRQ_INTRCOMM_RAS_ARM */
 +#define SPEAR310_VIRQ_TDM_HDLC                        (SPEAR3XX_VIRQ_START + 15)
 +#define SPEAR310_VIRQ_RS485_0                 (SPEAR3XX_VIRQ_START + 16)
 +#define SPEAR310_VIRQ_RS485_1                 (SPEAR3XX_VIRQ_START + 17)
 +
  
- /* pad multiplexing support */
- /* muxing registers */
- #define PAD_MUX_CONFIG_REG    0x08
- 
- /* devices */
- static struct pmx_dev_mode pmx_emi_cs_0_1_4_5_modes[] = {
-       {
-               .ids = 0x00,
-               .mask = PMX_TIMER_3_4_MASK,
-       },
- };
- 
- struct pmx_dev spear310_pmx_emi_cs_0_1_4_5 = {
-       .name = "emi_cs_0_1_4_5",
-       .modes = pmx_emi_cs_0_1_4_5_modes,
-       .mode_count = ARRAY_SIZE(pmx_emi_cs_0_1_4_5_modes),
-       .enb_on_reset = 1,
- };
- 
- static struct pmx_dev_mode pmx_emi_cs_2_3_modes[] = {
-       {
-               .ids = 0x00,
-               .mask = PMX_TIMER_1_2_MASK,
-       },
- };
- 
- struct pmx_dev spear310_pmx_emi_cs_2_3 = {
-       .name = "emi_cs_2_3",
-       .modes = pmx_emi_cs_2_3_modes,
-       .mode_count = ARRAY_SIZE(pmx_emi_cs_2_3_modes),
-       .enb_on_reset = 1,
- };
- 
- static struct pmx_dev_mode pmx_uart1_modes[] = {
-       {
-               .ids = 0x00,
-               .mask = PMX_FIRDA_MASK,
-       },
- };
- 
- struct pmx_dev spear310_pmx_uart1 = {
-       .name = "uart1",
-       .modes = pmx_uart1_modes,
-       .mode_count = ARRAY_SIZE(pmx_uart1_modes),
-       .enb_on_reset = 1,
- };
- 
- static struct pmx_dev_mode pmx_uart2_modes[] = {
-       {
-               .ids = 0x00,
-               .mask = PMX_TIMER_1_2_MASK,
-       },
- };
- 
- struct pmx_dev spear310_pmx_uart2 = {
-       .name = "uart2",
-       .modes = pmx_uart2_modes,
-       .mode_count = ARRAY_SIZE(pmx_uart2_modes),
-       .enb_on_reset = 1,
- };
- 
- static struct pmx_dev_mode pmx_uart3_4_5_modes[] = {
-       {
-               .ids = 0x00,
-               .mask = PMX_UART0_MODEM_MASK,
-       },
- };
- 
- struct pmx_dev spear310_pmx_uart3_4_5 = {
-       .name = "uart3_4_5",
-       .modes = pmx_uart3_4_5_modes,
-       .mode_count = ARRAY_SIZE(pmx_uart3_4_5_modes),
-       .enb_on_reset = 1,
- };
- 
- static struct pmx_dev_mode pmx_fsmc_modes[] = {
-       {
-               .ids = 0x00,
-               .mask = PMX_SSP_CS_MASK,
-       },
- };
- 
- struct pmx_dev spear310_pmx_fsmc = {
-       .name = "fsmc",
-       .modes = pmx_fsmc_modes,
-       .mode_count = ARRAY_SIZE(pmx_fsmc_modes),
-       .enb_on_reset = 1,
- };
- 
- static struct pmx_dev_mode pmx_rs485_0_1_modes[] = {
-       {
-               .ids = 0x00,
-               .mask = PMX_MII_MASK,
-       },
- };
- 
- struct pmx_dev spear310_pmx_rs485_0_1 = {
-       .name = "rs485_0_1",
-       .modes = pmx_rs485_0_1_modes,
-       .mode_count = ARRAY_SIZE(pmx_rs485_0_1_modes),
-       .enb_on_reset = 1,
- };
- 
- static struct pmx_dev_mode pmx_tdm0_modes[] = {
-       {
-               .ids = 0x00,
-               .mask = PMX_MII_MASK,
-       },
- };
- 
- struct pmx_dev spear310_pmx_tdm0 = {
-       .name = "tdm0",
-       .modes = pmx_tdm0_modes,
-       .mode_count = ARRAY_SIZE(pmx_tdm0_modes),
-       .enb_on_reset = 1,
- };
- 
- /* pmx driver structure */
- static struct pmx_driver pmx_driver = {
-       .mux_reg = {.offset = PAD_MUX_CONFIG_REG, .mask = 0x00007fff},
- };
- 
  /* spear3xx shared irq */
  static struct shirq_dev_config shirq_ras1_config[] = {
        {
 
  #include <asm/mach/arch.h>
  #include <plat/shirq.h>
  #include <mach/generic.h>
 -#include <mach/hardware.h>
 +#include <mach/spear.h>
 +
 +#define SPEAR320_UART1_BASE           UL(0xA3000000)
 +#define SPEAR320_UART2_BASE           UL(0xA4000000)
 +#define SPEAR320_SSP0_BASE            UL(0xA5000000)
 +#define SPEAR320_SSP1_BASE            UL(0xA6000000)
 +#define SPEAR320_SOC_CONFIG_BASE      UL(0xB3000000)
 +
 +/* Interrupt registers offsets and masks */
 +#define SPEAR320_INT_STS_MASK_REG             0x04
 +#define SPEAR320_INT_CLR_MASK_REG             0x04
 +#define SPEAR320_INT_ENB_MASK_REG             0x08
 +#define SPEAR320_GPIO_IRQ_MASK                        (1 << 0)
 +#define SPEAR320_I2S_PLAY_IRQ_MASK            (1 << 1)
 +#define SPEAR320_I2S_REC_IRQ_MASK             (1 << 2)
 +#define SPEAR320_EMI_IRQ_MASK                 (1 << 7)
 +#define SPEAR320_CLCD_IRQ_MASK                        (1 << 8)
 +#define SPEAR320_SPP_IRQ_MASK                 (1 << 9)
 +#define SPEAR320_SDHCI_IRQ_MASK                       (1 << 10)
 +#define SPEAR320_CAN_U_IRQ_MASK                       (1 << 11)
 +#define SPEAR320_CAN_L_IRQ_MASK                       (1 << 12)
 +#define SPEAR320_UART1_IRQ_MASK                       (1 << 13)
 +#define SPEAR320_UART2_IRQ_MASK                       (1 << 14)
 +#define SPEAR320_SSP1_IRQ_MASK                        (1 << 15)
 +#define SPEAR320_SSP2_IRQ_MASK                        (1 << 16)
 +#define SPEAR320_SMII0_IRQ_MASK                       (1 << 17)
 +#define SPEAR320_MII1_SMII1_IRQ_MASK          (1 << 18)
 +#define SPEAR320_WAKEUP_SMII0_IRQ_MASK                (1 << 19)
 +#define SPEAR320_WAKEUP_MII1_SMII1_IRQ_MASK   (1 << 20)
 +#define SPEAR320_I2C1_IRQ_MASK                        (1 << 21)
 +
 +#define SPEAR320_SHIRQ_RAS1_MASK              0x000380
 +#define SPEAR320_SHIRQ_RAS3_MASK              0x000007
 +#define SPEAR320_SHIRQ_INTRCOMM_RAS_MASK      0x3FF800
 +
 +/* SPEAr320 Virtual irq definitions */
 +/* IRQs sharing IRQ_GEN_RAS_1 */
 +#define SPEAR320_VIRQ_EMI                     (SPEAR3XX_VIRQ_START + 0)
 +#define SPEAR320_VIRQ_CLCD                    (SPEAR3XX_VIRQ_START + 1)
 +#define SPEAR320_VIRQ_SPP                     (SPEAR3XX_VIRQ_START + 2)
 +
 +/* IRQs sharing IRQ_GEN_RAS_2 */
 +#define SPEAR320_IRQ_SDHCI                    SPEAR3XX_IRQ_GEN_RAS_2
 +
 +/* IRQs sharing IRQ_GEN_RAS_3 */
 +#define SPEAR320_VIRQ_PLGPIO                  (SPEAR3XX_VIRQ_START + 3)
 +#define SPEAR320_VIRQ_I2S_PLAY                        (SPEAR3XX_VIRQ_START + 4)
 +#define SPEAR320_VIRQ_I2S_REC                 (SPEAR3XX_VIRQ_START + 5)
 +
 +/* IRQs sharing IRQ_INTRCOMM_RAS_ARM */
 +#define SPEAR320_VIRQ_CANU                    (SPEAR3XX_VIRQ_START + 6)
 +#define SPEAR320_VIRQ_CANL                    (SPEAR3XX_VIRQ_START + 7)
 +#define SPEAR320_VIRQ_UART1                   (SPEAR3XX_VIRQ_START + 8)
 +#define SPEAR320_VIRQ_UART2                   (SPEAR3XX_VIRQ_START + 9)
 +#define SPEAR320_VIRQ_SSP1                    (SPEAR3XX_VIRQ_START + 10)
 +#define SPEAR320_VIRQ_SSP2                    (SPEAR3XX_VIRQ_START + 11)
 +#define SPEAR320_VIRQ_SMII0                   (SPEAR3XX_VIRQ_START + 12)
 +#define SPEAR320_VIRQ_MII1_SMII1              (SPEAR3XX_VIRQ_START + 13)
 +#define SPEAR320_VIRQ_WAKEUP_SMII0            (SPEAR3XX_VIRQ_START + 14)
 +#define SPEAR320_VIRQ_WAKEUP_MII1_SMII1               (SPEAR3XX_VIRQ_START + 15)
 +#define SPEAR320_VIRQ_I2C1                    (SPEAR3XX_VIRQ_START + 16)
  
- /* 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
- 
- struct pmx_mode spear320_auto_net_smii_mode = {
-       .id = AUTO_NET_SMII_MODE,
-       .name = "Automation Networking SMII Mode",
-       .mask = 0x00,
- };
- 
- struct pmx_mode spear320_auto_net_mii_mode = {
-       .id = AUTO_NET_MII_MODE,
-       .name = "Automation Networking MII Mode",
-       .mask = 0x01,
- };
- 
- struct pmx_mode spear320_auto_exp_mode = {
-       .id = AUTO_EXP_MODE,
-       .name = "Automation Expanded Mode",
-       .mask = 0x02,
- };
- 
- struct pmx_mode spear320_small_printers_mode = {
-       .id = SMALL_PRINTERS_MODE,
-       .name = "Small Printers Mode",
-       .mask = 0x03,
- };
- 
- /* devices */
- static struct pmx_dev_mode pmx_clcd_modes[] = {
-       {
-               .ids = AUTO_NET_SMII_MODE,
-               .mask = 0x0,
-       },
- };
- 
- struct pmx_dev spear320_pmx_clcd = {
-       .name = "clcd",
-       .modes = pmx_clcd_modes,
-       .mode_count = ARRAY_SIZE(pmx_clcd_modes),
-       .enb_on_reset = 1,
- };
- 
- static struct pmx_dev_mode pmx_emi_modes[] = {
-       {
-               .ids = AUTO_EXP_MODE,
-               .mask = PMX_TIMER_1_2_MASK | PMX_TIMER_3_4_MASK,
-       },
- };
- 
- struct pmx_dev spear320_pmx_emi = {
-       .name = "emi",
-       .modes = pmx_emi_modes,
-       .mode_count = ARRAY_SIZE(pmx_emi_modes),
-       .enb_on_reset = 1,
- };
- 
- static struct pmx_dev_mode pmx_fsmc_modes[] = {
-       {
-               .ids = ALL_MODES,
-               .mask = 0x0,
-       },
- };
- 
- struct pmx_dev spear320_pmx_fsmc = {
-       .name = "fsmc",
-       .modes = pmx_fsmc_modes,
-       .mode_count = ARRAY_SIZE(pmx_fsmc_modes),
-       .enb_on_reset = 1,
- };
- 
- static struct pmx_dev_mode pmx_spp_modes[] = {
-       {
-               .ids = SMALL_PRINTERS_MODE,
-               .mask = 0x0,
-       },
- };
- 
- struct pmx_dev spear320_pmx_spp = {
-       .name = "spp",
-       .modes = pmx_spp_modes,
-       .mode_count = ARRAY_SIZE(pmx_spp_modes),
-       .enb_on_reset = 1,
- };
- 
- static struct pmx_dev_mode pmx_sdhci_modes[] = {
-       {
-               .ids = AUTO_NET_SMII_MODE | AUTO_NET_MII_MODE |
-                       SMALL_PRINTERS_MODE,
-               .mask = PMX_TIMER_1_2_MASK | PMX_TIMER_3_4_MASK,
-       },
- };
- 
- struct pmx_dev spear320_pmx_sdhci = {
-       .name = "sdhci",
-       .modes = pmx_sdhci_modes,
-       .mode_count = ARRAY_SIZE(pmx_sdhci_modes),
-       .enb_on_reset = 1,
- };
- 
- static struct pmx_dev_mode pmx_i2s_modes[] = {
-       {
-               .ids = AUTO_NET_SMII_MODE | AUTO_NET_MII_MODE,
-               .mask = PMX_UART0_MODEM_MASK,
-       },
- };
- 
- struct pmx_dev spear320_pmx_i2s = {
-       .name = "i2s",
-       .modes = pmx_i2s_modes,
-       .mode_count = ARRAY_SIZE(pmx_i2s_modes),
-       .enb_on_reset = 1,
- };
- 
- static struct pmx_dev_mode pmx_uart1_modes[] = {
-       {
-               .ids = ALL_MODES,
-               .mask = PMX_GPIO_PIN0_MASK | PMX_GPIO_PIN1_MASK,
-       },
- };
- 
- struct pmx_dev spear320_pmx_uart1 = {
-       .name = "uart1",
-       .modes = pmx_uart1_modes,
-       .mode_count = ARRAY_SIZE(pmx_uart1_modes),
-       .enb_on_reset = 1,
- };
- 
- static struct pmx_dev_mode pmx_uart1_modem_modes[] = {
-       {
-               .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,
-       },
- };
- 
- struct pmx_dev spear320_pmx_uart1_modem = {
-       .name = "uart1_modem",
-       .modes = pmx_uart1_modem_modes,
-       .mode_count = ARRAY_SIZE(pmx_uart1_modem_modes),
-       .enb_on_reset = 1,
- };
- 
- static struct pmx_dev_mode pmx_uart2_modes[] = {
-       {
-               .ids = ALL_MODES,
-               .mask = PMX_FIRDA_MASK,
-       },
- };
- 
- struct pmx_dev spear320_pmx_uart2 = {
-       .name = "uart2",
-       .modes = pmx_uart2_modes,
-       .mode_count = ARRAY_SIZE(pmx_uart2_modes),
-       .enb_on_reset = 1,
- };
- 
- static struct pmx_dev_mode pmx_touchscreen_modes[] = {
-       {
-               .ids = AUTO_NET_SMII_MODE,
-               .mask = PMX_SSP_CS_MASK,
-       },
- };
- 
- struct pmx_dev spear320_pmx_touchscreen = {
-       .name = "touchscreen",
-       .modes = pmx_touchscreen_modes,
-       .mode_count = ARRAY_SIZE(pmx_touchscreen_modes),
-       .enb_on_reset = 1,
- };
- 
- static struct pmx_dev_mode pmx_can_modes[] = {
-       {
-               .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,
-       },
- };
- 
- struct pmx_dev spear320_pmx_can = {
-       .name = "can",
-       .modes = pmx_can_modes,
-       .mode_count = ARRAY_SIZE(pmx_can_modes),
-       .enb_on_reset = 1,
- };
- 
- static struct pmx_dev_mode pmx_sdhci_led_modes[] = {
-       {
-               .ids = AUTO_NET_SMII_MODE | AUTO_NET_MII_MODE,
-               .mask = PMX_SSP_CS_MASK,
-       },
- };
- 
- struct pmx_dev spear320_pmx_sdhci_led = {
-       .name = "sdhci_led",
-       .modes = pmx_sdhci_led_modes,
-       .mode_count = ARRAY_SIZE(pmx_sdhci_led_modes),
-       .enb_on_reset = 1,
- };
- 
- static struct pmx_dev_mode pmx_pwm0_modes[] = {
-       {
-               .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,
-       },
- };
- 
- struct pmx_dev spear320_pmx_pwm0 = {
-       .name = "pwm0",
-       .modes = pmx_pwm0_modes,
-       .mode_count = ARRAY_SIZE(pmx_pwm0_modes),
-       .enb_on_reset = 1,
- };
- 
- static struct pmx_dev_mode pmx_pwm1_modes[] = {
-       {
-               .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,
-       },
- };
- 
- struct pmx_dev spear320_pmx_pwm1 = {
-       .name = "pwm1",
-       .modes = pmx_pwm1_modes,
-       .mode_count = ARRAY_SIZE(pmx_pwm1_modes),
-       .enb_on_reset = 1,
- };
- 
- static struct pmx_dev_mode pmx_pwm2_modes[] = {
-       {
-               .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,
-       },
- };
- 
- struct pmx_dev spear320_pmx_pwm2 = {
-       .name = "pwm2",
-       .modes = pmx_pwm2_modes,
-       .mode_count = ARRAY_SIZE(pmx_pwm2_modes),
-       .enb_on_reset = 1,
- };
- 
- static struct pmx_dev_mode pmx_pwm3_modes[] = {
-       {
-               .ids = AUTO_EXP_MODE | SMALL_PRINTERS_MODE | AUTO_NET_SMII_MODE,
-               .mask = PMX_MII_MASK,
-       },
- };
- 
- struct pmx_dev spear320_pmx_pwm3 = {
-       .name = "pwm3",
-       .modes = pmx_pwm3_modes,
-       .mode_count = ARRAY_SIZE(pmx_pwm3_modes),
-       .enb_on_reset = 1,
- };
- 
- static struct pmx_dev_mode pmx_ssp1_modes[] = {
-       {
-               .ids = SMALL_PRINTERS_MODE | AUTO_NET_SMII_MODE,
-               .mask = PMX_MII_MASK,
-       },
- };
- 
- struct pmx_dev spear320_pmx_ssp1 = {
-       .name = "ssp1",
-       .modes = pmx_ssp1_modes,
-       .mode_count = ARRAY_SIZE(pmx_ssp1_modes),
-       .enb_on_reset = 1,
- };
- 
- static struct pmx_dev_mode pmx_ssp2_modes[] = {
-       {
-               .ids = AUTO_NET_SMII_MODE,
-               .mask = PMX_MII_MASK,
-       },
- };
- 
- struct pmx_dev spear320_pmx_ssp2 = {
-       .name = "ssp2",
-       .modes = pmx_ssp2_modes,
-       .mode_count = ARRAY_SIZE(pmx_ssp2_modes),
-       .enb_on_reset = 1,
- };
- 
- static struct pmx_dev_mode pmx_mii1_modes[] = {
-       {
-               .ids = AUTO_NET_MII_MODE,
-               .mask = 0x0,
-       },
- };
- 
- struct pmx_dev spear320_pmx_mii1 = {
-       .name = "mii1",
-       .modes = pmx_mii1_modes,
-       .mode_count = ARRAY_SIZE(pmx_mii1_modes),
-       .enb_on_reset = 1,
- };
- 
- static struct pmx_dev_mode pmx_smii0_modes[] = {
-       {
-               .ids = AUTO_NET_SMII_MODE | AUTO_EXP_MODE | SMALL_PRINTERS_MODE,
-               .mask = PMX_MII_MASK,
-       },
- };
- 
- struct pmx_dev spear320_pmx_smii0 = {
-       .name = "smii0",
-       .modes = pmx_smii0_modes,
-       .mode_count = ARRAY_SIZE(pmx_smii0_modes),
-       .enb_on_reset = 1,
- };
- 
- static struct pmx_dev_mode pmx_smii1_modes[] = {
-       {
-               .ids = AUTO_NET_SMII_MODE | SMALL_PRINTERS_MODE,
-               .mask = PMX_MII_MASK,
-       },
- };
- 
- struct pmx_dev spear320_pmx_smii1 = {
-       .name = "smii1",
-       .modes = pmx_smii1_modes,
-       .mode_count = ARRAY_SIZE(pmx_smii1_modes),
-       .enb_on_reset = 1,
- };
- 
- static struct pmx_dev_mode pmx_i2c1_modes[] = {
-       {
-               .ids = AUTO_EXP_MODE,
-               .mask = 0x0,
-       },
- };
- 
- struct pmx_dev spear320_pmx_i2c1 = {
-       .name = "i2c1",
-       .modes = pmx_i2c1_modes,
-       .mode_count = ARRAY_SIZE(pmx_i2c1_modes),
-       .enb_on_reset = 1,
- };
- 
- /* pmx driver structure */
- static struct pmx_driver pmx_driver = {
-       .mode_reg = {.offset = MODE_CONFIG_REG, .mask = 0x00000007},
-       .mux_reg = {.offset = PAD_MUX_CONFIG_REG, .mask = 0x00007fff},
- };
- 
  /* spear3xx shared irq */
  static struct shirq_dev_config shirq_ras1_config[] = {
        {
 
  #include <asm/hardware/vic.h>
  #include <plat/pl080.h>
  #include <mach/generic.h>
 -#include <mach/hardware.h>
 +#include <mach/spear.h>
  
- /* pad multiplexing support */
- /* devices */
- static struct pmx_dev_mode pmx_firda_modes[] = {
-       {
-               .ids = 0xffffffff,
-               .mask = PMX_FIRDA_MASK,
-       },
- };
- 
- struct pmx_dev spear3xx_pmx_firda = {
-       .name = "firda",
-       .modes = pmx_firda_modes,
-       .mode_count = ARRAY_SIZE(pmx_firda_modes),
-       .enb_on_reset = 0,
- };
- 
- static struct pmx_dev_mode pmx_i2c_modes[] = {
-       {
-               .ids = 0xffffffff,
-               .mask = PMX_I2C_MASK,
-       },
- };
- 
- struct pmx_dev spear3xx_pmx_i2c = {
-       .name = "i2c",
-       .modes = pmx_i2c_modes,
-       .mode_count = ARRAY_SIZE(pmx_i2c_modes),
-       .enb_on_reset = 0,
- };
- 
- static struct pmx_dev_mode pmx_ssp_cs_modes[] = {
-       {
-               .ids = 0xffffffff,
-               .mask = PMX_SSP_CS_MASK,
-       },
- };
- 
- struct pmx_dev spear3xx_pmx_ssp_cs = {
-       .name = "ssp_chip_selects",
-       .modes = pmx_ssp_cs_modes,
-       .mode_count = ARRAY_SIZE(pmx_ssp_cs_modes),
-       .enb_on_reset = 0,
- };
- 
- static struct pmx_dev_mode pmx_ssp_modes[] = {
-       {
-               .ids = 0xffffffff,
-               .mask = PMX_SSP_MASK,
-       },
- };
- 
- struct pmx_dev spear3xx_pmx_ssp = {
-       .name = "ssp",
-       .modes = pmx_ssp_modes,
-       .mode_count = ARRAY_SIZE(pmx_ssp_modes),
-       .enb_on_reset = 0,
- };
- 
- static struct pmx_dev_mode pmx_mii_modes[] = {
-       {
-               .ids = 0xffffffff,
-               .mask = PMX_MII_MASK,
-       },
- };
- 
- struct pmx_dev spear3xx_pmx_mii = {
-       .name = "mii",
-       .modes = pmx_mii_modes,
-       .mode_count = ARRAY_SIZE(pmx_mii_modes),
-       .enb_on_reset = 0,
- };
- 
- static struct pmx_dev_mode pmx_gpio_pin0_modes[] = {
-       {
-               .ids = 0xffffffff,
-               .mask = PMX_GPIO_PIN0_MASK,
-       },
- };
- 
- struct pmx_dev spear3xx_pmx_gpio_pin0 = {
-       .name = "gpio_pin0",
-       .modes = pmx_gpio_pin0_modes,
-       .mode_count = ARRAY_SIZE(pmx_gpio_pin0_modes),
-       .enb_on_reset = 0,
- };
- 
- static struct pmx_dev_mode pmx_gpio_pin1_modes[] = {
-       {
-               .ids = 0xffffffff,
-               .mask = PMX_GPIO_PIN1_MASK,
-       },
- };
- 
- struct pmx_dev spear3xx_pmx_gpio_pin1 = {
-       .name = "gpio_pin1",
-       .modes = pmx_gpio_pin1_modes,
-       .mode_count = ARRAY_SIZE(pmx_gpio_pin1_modes),
-       .enb_on_reset = 0,
- };
- 
- static struct pmx_dev_mode pmx_gpio_pin2_modes[] = {
-       {
-               .ids = 0xffffffff,
-               .mask = PMX_GPIO_PIN2_MASK,
-       },
- };
- 
- struct pmx_dev spear3xx_pmx_gpio_pin2 = {
-       .name = "gpio_pin2",
-       .modes = pmx_gpio_pin2_modes,
-       .mode_count = ARRAY_SIZE(pmx_gpio_pin2_modes),
-       .enb_on_reset = 0,
- };
- 
- static struct pmx_dev_mode pmx_gpio_pin3_modes[] = {
-       {
-               .ids = 0xffffffff,
-               .mask = PMX_GPIO_PIN3_MASK,
-       },
- };
- 
- struct pmx_dev spear3xx_pmx_gpio_pin3 = {
-       .name = "gpio_pin3",
-       .modes = pmx_gpio_pin3_modes,
-       .mode_count = ARRAY_SIZE(pmx_gpio_pin3_modes),
-       .enb_on_reset = 0,
- };
- 
- static struct pmx_dev_mode pmx_gpio_pin4_modes[] = {
-       {
-               .ids = 0xffffffff,
-               .mask = PMX_GPIO_PIN4_MASK,
-       },
- };
- 
- struct pmx_dev spear3xx_pmx_gpio_pin4 = {
-       .name = "gpio_pin4",
-       .modes = pmx_gpio_pin4_modes,
-       .mode_count = ARRAY_SIZE(pmx_gpio_pin4_modes),
-       .enb_on_reset = 0,
- };
- 
- static struct pmx_dev_mode pmx_gpio_pin5_modes[] = {
-       {
-               .ids = 0xffffffff,
-               .mask = PMX_GPIO_PIN5_MASK,
-       },
- };
- 
- struct pmx_dev spear3xx_pmx_gpio_pin5 = {
-       .name = "gpio_pin5",
-       .modes = pmx_gpio_pin5_modes,
-       .mode_count = ARRAY_SIZE(pmx_gpio_pin5_modes),
-       .enb_on_reset = 0,
- };
- 
- static struct pmx_dev_mode pmx_uart0_modem_modes[] = {
-       {
-               .ids = 0xffffffff,
-               .mask = PMX_UART0_MODEM_MASK,
-       },
- };
- 
- struct pmx_dev spear3xx_pmx_uart0_modem = {
-       .name = "uart0_modem",
-       .modes = pmx_uart0_modem_modes,
-       .mode_count = ARRAY_SIZE(pmx_uart0_modem_modes),
-       .enb_on_reset = 0,
- };
- 
- static struct pmx_dev_mode pmx_uart0_modes[] = {
-       {
-               .ids = 0xffffffff,
-               .mask = PMX_UART0_MASK,
-       },
- };
- 
- struct pmx_dev spear3xx_pmx_uart0 = {
-       .name = "uart0",
-       .modes = pmx_uart0_modes,
-       .mode_count = ARRAY_SIZE(pmx_uart0_modes),
-       .enb_on_reset = 0,
- };
- 
- static struct pmx_dev_mode pmx_timer_3_4_modes[] = {
-       {
-               .ids = 0xffffffff,
-               .mask = PMX_TIMER_3_4_MASK,
-       },
- };
- 
- struct pmx_dev spear3xx_pmx_timer_3_4 = {
-       .name = "timer_3_4",
-       .modes = pmx_timer_3_4_modes,
-       .mode_count = ARRAY_SIZE(pmx_timer_3_4_modes),
-       .enb_on_reset = 0,
- };
- 
- static struct pmx_dev_mode pmx_timer_1_2_modes[] = {
-       {
-               .ids = 0xffffffff,
-               .mask = PMX_TIMER_1_2_MASK,
-       },
- };
- 
- struct pmx_dev spear3xx_pmx_timer_1_2 = {
-       .name = "timer_1_2",
-       .modes = pmx_timer_1_2_modes,
-       .mode_count = ARRAY_SIZE(pmx_timer_1_2_modes),
-       .enb_on_reset = 0,
- };
- 
- #if defined(CONFIG_MACH_SPEAR310) || defined(CONFIG_MACH_SPEAR320)
- /* plgpios devices */
- static struct pmx_dev_mode pmx_plgpio_0_1_modes[] = {
-       {
-               .ids = 0x00,
-               .mask = PMX_FIRDA_MASK,
-       },
- };
- 
- struct pmx_dev spear3xx_pmx_plgpio_0_1 = {
-       .name = "plgpio 0 and 1",
-       .modes = pmx_plgpio_0_1_modes,
-       .mode_count = ARRAY_SIZE(pmx_plgpio_0_1_modes),
-       .enb_on_reset = 1,
- };
- 
- static struct pmx_dev_mode pmx_plgpio_2_3_modes[] = {
-       {
-               .ids = 0x00,
-               .mask = PMX_UART0_MASK,
-       },
- };
- 
- struct pmx_dev spear3xx_pmx_plgpio_2_3 = {
-       .name = "plgpio 2 and 3",
-       .modes = pmx_plgpio_2_3_modes,
-       .mode_count = ARRAY_SIZE(pmx_plgpio_2_3_modes),
-       .enb_on_reset = 1,
- };
- 
- static struct pmx_dev_mode pmx_plgpio_4_5_modes[] = {
-       {
-               .ids = 0x00,
-               .mask = PMX_I2C_MASK,
-       },
- };
- 
- struct pmx_dev spear3xx_pmx_plgpio_4_5 = {
-       .name = "plgpio 4 and 5",
-       .modes = pmx_plgpio_4_5_modes,
-       .mode_count = ARRAY_SIZE(pmx_plgpio_4_5_modes),
-       .enb_on_reset = 1,
- };
- 
- static struct pmx_dev_mode pmx_plgpio_6_9_modes[] = {
-       {
-               .ids = 0x00,
-               .mask = PMX_SSP_MASK,
-       },
- };
- 
- struct pmx_dev spear3xx_pmx_plgpio_6_9 = {
-       .name = "plgpio 6 to 9",
-       .modes = pmx_plgpio_6_9_modes,
-       .mode_count = ARRAY_SIZE(pmx_plgpio_6_9_modes),
-       .enb_on_reset = 1,
- };
- 
- static struct pmx_dev_mode pmx_plgpio_10_27_modes[] = {
-       {
-               .ids = 0x00,
-               .mask = PMX_MII_MASK,
-       },
- };
- 
- struct pmx_dev spear3xx_pmx_plgpio_10_27 = {
-       .name = "plgpio 10 to 27",
-       .modes = pmx_plgpio_10_27_modes,
-       .mode_count = ARRAY_SIZE(pmx_plgpio_10_27_modes),
-       .enb_on_reset = 1,
- };
- 
- static struct pmx_dev_mode pmx_plgpio_28_modes[] = {
-       {
-               .ids = 0x00,
-               .mask = PMX_GPIO_PIN0_MASK,
-       },
- };
- 
- struct pmx_dev spear3xx_pmx_plgpio_28 = {
-       .name = "plgpio 28",
-       .modes = pmx_plgpio_28_modes,
-       .mode_count = ARRAY_SIZE(pmx_plgpio_28_modes),
-       .enb_on_reset = 1,
- };
- 
- static struct pmx_dev_mode pmx_plgpio_29_modes[] = {
-       {
-               .ids = 0x00,
-               .mask = PMX_GPIO_PIN1_MASK,
-       },
- };
- 
- struct pmx_dev spear3xx_pmx_plgpio_29 = {
-       .name = "plgpio 29",
-       .modes = pmx_plgpio_29_modes,
-       .mode_count = ARRAY_SIZE(pmx_plgpio_29_modes),
-       .enb_on_reset = 1,
- };
- 
- static struct pmx_dev_mode pmx_plgpio_30_modes[] = {
-       {
-               .ids = 0x00,
-               .mask = PMX_GPIO_PIN2_MASK,
-       },
- };
- 
- struct pmx_dev spear3xx_pmx_plgpio_30 = {
-       .name = "plgpio 30",
-       .modes = pmx_plgpio_30_modes,
-       .mode_count = ARRAY_SIZE(pmx_plgpio_30_modes),
-       .enb_on_reset = 1,
- };
- 
- static struct pmx_dev_mode pmx_plgpio_31_modes[] = {
-       {
-               .ids = 0x00,
-               .mask = PMX_GPIO_PIN3_MASK,
-       },
- };
- 
- struct pmx_dev spear3xx_pmx_plgpio_31 = {
-       .name = "plgpio 31",
-       .modes = pmx_plgpio_31_modes,
-       .mode_count = ARRAY_SIZE(pmx_plgpio_31_modes),
-       .enb_on_reset = 1,
- };
- 
- static struct pmx_dev_mode pmx_plgpio_32_modes[] = {
-       {
-               .ids = 0x00,
-               .mask = PMX_GPIO_PIN4_MASK,
-       },
- };
- 
- struct pmx_dev spear3xx_pmx_plgpio_32 = {
-       .name = "plgpio 32",
-       .modes = pmx_plgpio_32_modes,
-       .mode_count = ARRAY_SIZE(pmx_plgpio_32_modes),
-       .enb_on_reset = 1,
- };
- 
- static struct pmx_dev_mode pmx_plgpio_33_modes[] = {
-       {
-               .ids = 0x00,
-               .mask = PMX_GPIO_PIN5_MASK,
-       },
- };
- 
- struct pmx_dev spear3xx_pmx_plgpio_33 = {
-       .name = "plgpio 33",
-       .modes = pmx_plgpio_33_modes,
-       .mode_count = ARRAY_SIZE(pmx_plgpio_33_modes),
-       .enb_on_reset = 1,
- };
- 
- static struct pmx_dev_mode pmx_plgpio_34_36_modes[] = {
-       {
-               .ids = 0x00,
-               .mask = PMX_SSP_CS_MASK,
-       },
- };
- 
- struct pmx_dev spear3xx_pmx_plgpio_34_36 = {
-       .name = "plgpio 34 to 36",
-       .modes = pmx_plgpio_34_36_modes,
-       .mode_count = ARRAY_SIZE(pmx_plgpio_34_36_modes),
-       .enb_on_reset = 1,
- };
- 
- static struct pmx_dev_mode pmx_plgpio_37_42_modes[] = {
-       {
-               .ids = 0x00,
-               .mask = PMX_UART0_MODEM_MASK,
-       },
- };
- 
- struct pmx_dev spear3xx_pmx_plgpio_37_42 = {
-       .name = "plgpio 37 to 42",
-       .modes = pmx_plgpio_37_42_modes,
-       .mode_count = ARRAY_SIZE(pmx_plgpio_37_42_modes),
-       .enb_on_reset = 1,
- };
- 
- static struct pmx_dev_mode pmx_plgpio_43_44_47_48_modes[] = {
-       {
-               .ids = 0x00,
-               .mask = PMX_TIMER_1_2_MASK,
-       },
- };
- 
- struct pmx_dev spear3xx_pmx_plgpio_43_44_47_48 = {
-       .name = "plgpio 43, 44, 47 and 48",
-       .modes = pmx_plgpio_43_44_47_48_modes,
-       .mode_count = ARRAY_SIZE(pmx_plgpio_43_44_47_48_modes),
-       .enb_on_reset = 1,
- };
- 
- static struct pmx_dev_mode pmx_plgpio_45_46_49_50_modes[] = {
-       {
-               .ids = 0x00,
-               .mask = PMX_TIMER_3_4_MASK,
-       },
- };
- 
- struct pmx_dev spear3xx_pmx_plgpio_45_46_49_50 = {
-       .name = "plgpio 45, 46, 49 and 50",
-       .modes = pmx_plgpio_45_46_49_50_modes,
-       .mode_count = ARRAY_SIZE(pmx_plgpio_45_46_49_50_modes),
-       .enb_on_reset = 1,
- };
- #endif /* CONFIG_MACH_SPEAR310 || CONFIG_MACH_SPEAR320 */
- 
  /* ssp device registration */
  struct pl022_ssp_controller pl022_plat_data = {
        .bus_id = 0,
 
        select ARM_ERRATA_754322
        select ARM_ERRATA_764369
        select CACHE_L2X0
+       select PINCTRL
+       select PINCTRL_NOMADIK
  
 -config UX500_SOC_DB5500
 -      bool
 -      select MFD_DB5500_PRCMU
 -
  config UX500_SOC_DB8500
        bool
        select MFD_DB8500_PRCMU
 
                                board-mop500-regulators.o \
                                board-mop500-uib.o board-mop500-stuib.o \
                                board-mop500-u8500uib.o \
-                               board-mop500-pins.o
+                               board-mop500-pins.o \
+                               board-mop500-msp.o
 -obj-$(CONFIG_MACH_U5500)      += board-u5500.o board-u5500-sdi.o
  obj-$(CONFIG_SMP)             += platsmp.o headsmp.o
  obj-$(CONFIG_HOTPLUG_CPU)     += hotplug.o
 -obj-$(CONFIG_U5500_MODEM_IRQ) += modem-irq-db5500.o
 -obj-$(CONFIG_U5500_MBOX)      += mbox-db5500.o
 -
 
  static void __init snowball_init_machine(void)
  {
        struct device *parent = NULL;
 -      int i2c0_devs;
        int i;
  
+       snowball_pinmaps_init();
        parent = u8500_init_devices();
  
-       snowball_pins_init();
- 
        for (i = 0; i < ARRAY_SIZE(snowball_platform_devs); i++)
                snowball_platform_devs[i]->dev.parent = parent;
  
        mop500_i2c_init(parent);
        snowball_sdi_init(parent);
        mop500_spi_init(parent);
+       mop500_msp_init(parent);
        mop500_uart_init(parent);
  
 -      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();
  }
        int i2c0_devs;
        int i;
  
+       /* 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();
+ 
        parent = u8500_init_devices();
 -      i2c0_devs = ARRAY_SIZE(mop500_i2c0_devices);
  
        for (i = 0; i < ARRAY_SIZE(mop500_platform_devs); i++)
                mop500_platform_devs[i]->dev.parent = parent;
                                ARRAY_SIZE(mop500_platform_devs));
  
                mop500_sdi_init(parent);
 +
 +              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));
 +
        } else if (of_machine_is_compatible("calaosystems,snowball-a9500")) {
-               snowball_pins_init();
                platform_add_devices(snowball_platform_devs,
                                ARRAY_SIZE(snowball_platform_devs));
  
                 * instead.
                 */
                mop500_gpio_keys[0].gpio = HREFV60_PROX_SENSE_GPIO;
-               hrefv60_pins_init();
 -              i2c0_devs -= NUM_PRE_V60_I2C0_DEVICES;
                platform_add_devices(mop500_platform_devs,
                                ARRAY_SIZE(mop500_platform_devs));
  
 
  db8500_add_ssp(struct device *parent, const char *name, resource_size_t base,
               int irq, struct pl022_ssp_controller *pdata)
  {
 -      return dbx500_add_amba_device(parent, name, base, irq, pdata, 0);
 +      return amba_ahb_device_add(parent, name, base, SZ_4K, irq, 0, pdata, 0);
  }
  
- 
  #define db8500_add_i2c0(parent, pdata) \
        dbx500_add_i2c(parent, 0, U8500_I2C0_BASE, IRQ_DB8500_I2C0, pdata)
  #define db8500_add_i2c1(parent, pdata) \