Merge branch 'imx-features-for-arnd' of git://git.pengutronix.de/git/imx/linux-2...
authorArnd Bergmann <arnd@arndb.de>
Thu, 20 Oct 2011 13:14:25 +0000 (15:14 +0200)
committerArnd Bergmann <arnd@arndb.de>
Thu, 20 Oct 2011 13:14:25 +0000 (15:14 +0200)
Conflicts:
arch/arm/mach-mx5/clock-mx51-mx53.c
arch/arm/mach-mx5/devices-imx53.h

16 files changed:
1  2 
arch/arm/Kconfig
arch/arm/mach-imx/mach-cpuimx27.c
arch/arm/mach-imx/mach-cpuimx35.c
arch/arm/mach-imx/mach-eukrea_cpuimx25.c
arch/arm/mach-mx5/board-mx53_ard.c
arch/arm/mach-mx5/board-mx53_loco.c
arch/arm/mach-mx5/board-mx53_smd.c
arch/arm/mach-mx5/clock-mx51-mx53.c
arch/arm/mach-mx5/devices-imx53.h
arch/arm/mach-mxs/Kconfig
arch/arm/mach-mxs/Makefile
arch/arm/mach-mxs/clock-mx28.c
arch/arm/mach-mxs/include/mach/mxs.h
arch/arm/plat-mxc/devices/Kconfig
arch/arm/plat-mxc/devices/Makefile
arch/arm/plat-mxc/include/mach/devices-common.h

diff --combined arch/arm/Kconfig
@@@ -397,7 -397,6 +397,7 @@@ config ARCH_MX
        select CLKSRC_MMIO
        select GENERIC_IRQ_CHIP
        select HAVE_SCHED_CLOCK
 +      select MULTI_IRQ_HANDLER
        help
          Support for Freescale MXC/iMX-based family of processors
  
@@@ -1272,6 -1271,32 +1272,32 @@@ config ARM_ERRATA_75432
          This workaround defines cpu_relax() as smp_mb(), preventing correctly
          written polling loops from denying visibility of updates to memory.
  
+ config ARM_ERRATA_364296
+       bool "ARM errata: Possible cache data corruption with hit-under-miss enabled"
+       depends on CPU_V6 && !SMP
+       help
+         This options enables the workaround for the 364296 ARM1136
+         r0p2 erratum (possible cache data corruption with
+         hit-under-miss enabled). It sets the undocumented bit 31 in
+         the auxiliary control register and the FI bit in the control
+         register, thus disabling hit-under-miss without putting the
+         processor into full low interrupt latency mode. ARM11MPCore
+         is not affected.
+ config ARM_ERRATA_764369
+       bool "ARM errata: Data cache line maintenance operation by MVA may not succeed"
+       depends on CPU_V7 && SMP
+       help
+         This option enables the workaround for erratum 764369
+         affecting Cortex-A9 MPCore with two or more processors (all
+         current revisions). Under certain timing circumstances, a data
+         cache line maintenance operation by MVA targeting an Inner
+         Shareable memory region may fail to proceed up to either the
+         Point of Coherency or to the Point of Unification of the
+         system. This workaround adds a DSB instruction before the
+         relevant cache maintenance functions and sets a specific bit
+         in the diagnostic control register of the SCU.
  endmenu
  
  source "arch/arm/common/Kconfig"
@@@ -310,12 -310,11 +310,12 @@@ static struct sys_timer eukrea_cpuimx27
        .init = eukrea_cpuimx27_timer_init,
  };
  
- MACHINE_START(CPUIMX27, "EUKREA CPUIMX27")
+ MACHINE_START(EUKREA_CPUIMX27, "EUKREA CPUIMX27")
        .boot_params = MX27_PHYS_OFFSET + 0x100,
        .map_io = mx27_map_io,
        .init_early = imx27_init_early,
        .init_irq = mx27_init_irq,
 +      .handle_irq = imx27_handle_irq,
        .timer = &eukrea_cpuimx27_timer,
        .init_machine = eukrea_cpuimx27_init,
  MACHINE_END
@@@ -66,7 -66,7 +66,7 @@@ static struct i2c_board_info eukrea_cpu
                I2C_BOARD_INFO("tsc2007", 0x48),
                .type           = "tsc2007",
                .platform_data  = &tsc2007_info,
 -              .irq            = gpio_to_irq(TSC2007_IRQGPIO),
 +              .irq            = IMX_GPIO_TO_IRQ(TSC2007_IRQGPIO),
        },
  };
  
@@@ -192,13 -192,12 +192,13 @@@ struct sys_timer eukrea_cpuimx35_timer 
        .init   = eukrea_cpuimx35_timer_init,
  };
  
- MACHINE_START(EUKREA_CPUIMX35, "Eukrea CPUIMX35")
+ MACHINE_START(EUKREA_CPUIMX35SD, "Eukrea CPUIMX35")
        /* Maintainer: Eukrea Electromatique */
        .boot_params = MX3x_PHYS_OFFSET + 0x100,
        .map_io = mx35_map_io,
        .init_early = imx35_init_early,
        .init_irq = mx35_init_irq,
 +      .handle_irq = imx35_handle_irq,
        .timer = &eukrea_cpuimx35_timer,
        .init_machine = eukrea_cpuimx35_init,
  MACHINE_END
@@@ -161,13 -161,12 +161,13 @@@ static struct sys_timer eukrea_cpuimx25
        .init   = eukrea_cpuimx25_timer_init,
  };
  
- MACHINE_START(EUKREA_CPUIMX25, "Eukrea CPUIMX25")
+ MACHINE_START(EUKREA_CPUIMX25SD, "Eukrea CPUIMX25")
        /* Maintainer: Eukrea Electromatique */
        .boot_params = MX25_PHYS_OFFSET + 0x100,
        .map_io = mx25_map_io,
        .init_early = imx25_init_early,
        .init_irq = mx25_init_irq,
 +      .handle_irq = imx25_handle_irq,
        .timer = &eukrea_cpuimx25_timer,
        .init_machine = eukrea_cpuimx25_init,
  MACHINE_END
@@@ -134,8 -134,8 +134,8 @@@ static struct resource ard_smsc911x_res
                .flags = IORESOURCE_MEM,
        },
        {
 -              .start =  gpio_to_irq(ARD_ETHERNET_INT_B),
 -              .end =  gpio_to_irq(ARD_ETHERNET_INT_B),
 +              .start =  IMX_GPIO_TO_IRQ(ARD_ETHERNET_INT_B),
 +              .end =  IMX_GPIO_TO_IRQ(ARD_ETHERNET_INT_B),
                .flags = IORESOURCE_IRQ,
        },
  };
@@@ -234,6 -234,7 +234,7 @@@ static void __init mx53_ard_board_init(
        imx53_add_imx_i2c(1, &mx53_ard_i2c2_data);
        imx53_add_imx_i2c(2, &mx53_ard_i2c3_data);
        imx_add_gpio_keys(&ard_button_data);
+       imx53_add_ahci_imx();
  }
  
  static void __init mx53_ard_timer_init(void)
@@@ -249,7 -250,6 +250,7 @@@ MACHINE_START(MX53_ARD, "Freescale MX5
        .map_io = mx53_map_io,
        .init_early = imx53_init_early,
        .init_irq = mx53_init_irq,
 +      .handle_irq = imx53_handle_irq,
        .timer = &mx53_ard_timer,
        .init_machine = mx53_ard_board_init,
  MACHINE_END
@@@ -22,7 -22,6 +22,7 @@@
  #include <linux/clk.h>
  #include <linux/delay.h>
  #include <linux/gpio.h>
 +#include <linux/i2c.h>
  
  #include <mach/common.h>
  #include <mach/hardware.h>
@@@ -43,7 -42,6 +43,7 @@@
  #define LOCO_SD3_CD                   IMX_GPIO_NR(3, 11)
  #define LOCO_SD3_WP                   IMX_GPIO_NR(3, 12)
  #define LOCO_SD1_CD                   IMX_GPIO_NR(3, 13)
 +#define LOCO_ACCEL_EN                 IMX_GPIO_NR(6, 14)
  
  static iomux_v3_cfg_t mx53_loco_pads[] = {
        /* FEC */
        MX53_PAD_KEY_ROW0__AUDMUX_AUD5_TXD,
        MX53_PAD_KEY_COL1__AUDMUX_AUD5_TXFS,
        MX53_PAD_KEY_ROW1__AUDMUX_AUD5_RXD,
 +      /* I2C1 */
 +      MX53_PAD_CSI0_DAT8__I2C1_SDA,
 +      MX53_PAD_CSI0_DAT9__I2C1_SCL,
 +      MX53_PAD_NANDF_CS1__GPIO6_14,   /* Accelerometer Enable */
        /* I2C2 */
        MX53_PAD_KEY_COL3__I2C2_SCL,
        MX53_PAD_KEY_ROW3__I2C2_SDA,
@@@ -263,15 -257,8 +263,15 @@@ static const struct gpio_led_platform_d
        .num_leds       = ARRAY_SIZE(mx53loco_leds),
  };
  
 +static struct i2c_board_info mx53loco_i2c_devices[] = {
 +      {
 +              I2C_BOARD_INFO("mma8450", 0x1C),
 +      },
 +};
 +
  static void __init mx53_loco_board_init(void)
  {
 +      int ret;
        imx53_soc_init();
  
        mxc_iomux_v3_setup_multiple_pads(mx53_loco_pads,
        mx53_loco_fec_reset();
        imx53_add_fec(&mx53_loco_fec_data);
        imx53_add_imx2_wdt(0, NULL);
 +
 +      ret = gpio_request_one(LOCO_ACCEL_EN, GPIOF_OUT_INIT_HIGH, "accel_en");
 +      if (ret)
 +              pr_err("Cannot request ACCEL_EN pin: %d\n", ret);
 +
 +      i2c_register_board_info(0, mx53loco_i2c_devices,
 +                              ARRAY_SIZE(mx53loco_i2c_devices));
        imx53_add_imx_i2c(0, &mx53_loco_i2c_data);
        imx53_add_imx_i2c(1, &mx53_loco_i2c_data);
        imx53_add_sdhci_esdhc_imx(0, &mx53_loco_sd1_data);
        imx53_add_sdhci_esdhc_imx(2, &mx53_loco_sd3_data);
        imx_add_gpio_keys(&loco_button_data);
        gpio_led_register_device(-1, &mx53loco_leds_data);
+       imx53_add_ahci_imx();
  }
  
  static void __init mx53_loco_timer_init(void)
@@@ -308,7 -289,6 +309,7 @@@ MACHINE_START(MX53_LOCO, "Freescale MX5
        .map_io = mx53_map_io,
        .init_early = imx53_init_early,
        .init_irq = mx53_init_irq,
 +      .handle_irq = imx53_handle_irq,
        .timer = &mx53_loco_timer,
        .init_machine = mx53_loco_board_init,
  MACHINE_END
@@@ -35,6 -35,7 +35,7 @@@
  #include "devices-imx53.h"
  
  #define SMD_FEC_PHY_RST               IMX_GPIO_NR(7, 6)
+ #define MX53_SMD_SATA_PWR_EN    IMX_GPIO_NR(3, 3)
  
  static iomux_v3_cfg_t mx53_smd_pads[] = {
        MX53_PAD_CSI0_DAT10__UART1_TXD_MUX,
@@@ -111,6 -112,19 +112,19 @@@ static const struct imxi2c_platform_dat
        .bitrate = 100000,
  };
  
+ static inline void mx53_smd_ahci_pwr_on(void)
+ {
+       int ret;
+       /* Enable SATA PWR */
+       ret = gpio_request_one(MX53_SMD_SATA_PWR_EN,
+                       GPIOF_DIR_OUT | GPIOF_INIT_HIGH, "ahci-sata-pwr");
+       if (ret) {
+               pr_err("failed to enable SATA_PWR_EN: %d\n", ret);
+               return;
+       }
+ }
  static void __init mx53_smd_board_init(void)
  {
        imx53_soc_init();
        imx53_add_sdhci_esdhc_imx(0, NULL);
        imx53_add_sdhci_esdhc_imx(1, NULL);
        imx53_add_sdhci_esdhc_imx(2, NULL);
+       mx53_smd_ahci_pwr_on();
+       imx53_add_ahci_imx();
  }
  
  static void __init mx53_smd_timer_init(void)
@@@ -140,7 -156,6 +156,7 @@@ MACHINE_START(MX53_SMD, "Freescale MX5
        .map_io = mx53_map_io,
        .init_early = imx53_init_early,
        .init_irq = mx53_init_irq,
 +      .handle_irq = imx53_handle_irq,
        .timer = &mx53_smd_timer,
        .init_machine = mx53_smd_board_init,
  MACHINE_END
@@@ -1401,6 -1401,22 +1401,22 @@@ static struct clk esdhc4_mx53_clk = 
        .secondary = &esdhc4_ipg_clk,
  };
  
+ static struct clk sata_clk = {
+       .parent = &ipg_clk,
+       .enable = _clk_max_enable,
+       .enable_reg = MXC_CCM_CCGR4,
+       .enable_shift = MXC_CCM_CCGRx_CG1_OFFSET,
+       .disable = _clk_max_disable,
+ };
+ static struct clk ahci_phy_clk = {
+       .parent = &usb_phy1_clk,
+ };
+ static struct clk ahci_dma_clk = {
+       .parent = &ahb_clk,
+ };
  DEFINE_CLOCK(mipi_esc_clk, 0, MXC_CCM_CCGR4, MXC_CCM_CCGRx_CG5_OFFSET, NULL, NULL, NULL, &pll2_sw_clk);
  DEFINE_CLOCK(mipi_hsc2_clk, 0, MXC_CCM_CCGR4, MXC_CCM_CCGRx_CG4_OFFSET, NULL, NULL, &mipi_esc_clk, &pll2_sw_clk);
  DEFINE_CLOCK(mipi_hsc1_clk, 0, MXC_CCM_CCGR4, MXC_CCM_CCGRx_CG3_OFFSET, NULL, NULL, &mipi_hsc2_clk, &pll2_sw_clk);
@@@ -1418,10 -1434,6 +1434,10 @@@ DEFINE_CLOCK(ipu_di0_clk, 0, MXC_CCM_CC
  DEFINE_CLOCK(ipu_di1_clk, 0, MXC_CCM_CCGR6, MXC_CCM_CCGRx_CG6_OFFSET,
                NULL, NULL, &pll3_sw_clk, NULL);
  
 +/* PATA */
 +DEFINE_CLOCK(pata_clk, 0, MXC_CCM_CCGR4, MXC_CCM_CCGRx_CG0_OFFSET,
 +              NULL, NULL, &ipg_clk, &spba_clk);
 +
  #define _REGISTER_CLOCK(d, n, c) \
         { \
                .dev_id = d, \
@@@ -1478,7 -1490,6 +1494,7 @@@ static struct clk_lookup mx51_lookups[
        _REGISTER_CLOCK("imx-ipuv3", "di0", ipu_di0_clk)
        _REGISTER_CLOCK("imx-ipuv3", "di1", ipu_di1_clk)
        _REGISTER_CLOCK(NULL, "gpc_dvfs", gpc_dvfs_clk)
 +      _REGISTER_CLOCK("pata_imx", NULL, pata_clk)
  };
  
  static struct clk_lookup mx53_lookups[] = {
        _REGISTER_CLOCK("imx-ssi.1", NULL, ssi2_clk)
        _REGISTER_CLOCK("imx-ssi.2", NULL, ssi3_clk)
        _REGISTER_CLOCK("imx-keypad", NULL, dummy_clk)
 +      _REGISTER_CLOCK("pata_imx", NULL, pata_clk)
+       _REGISTER_CLOCK("imx53-ahci.0", "ahci", sata_clk)
+       _REGISTER_CLOCK("imx53-ahci.0", "ahci_phy", ahci_phy_clk)
+       _REGISTER_CLOCK("imx53-ahci.0", "ahci_dma", ahci_dma_clk)
  };
  
  static void clk_tree_init(void)
@@@ -1554,8 -1567,9 +1573,8 @@@ int __init mx51_clocks_init(unsigned lo
        clk_enable(&main_bus_clk);
  
        clk_enable(&iim_clk);
 -      mx51_revision();
 +      imx_print_silicon_rev("i.MX51", mx51_revision());
        clk_disable(&iim_clk);
 -      mx51_display_revision();
  
        /* move usb_phy_clk to 24MHz */
        clk_set_parent(&usb_phy1_clk, &osc_clk);
  
        /* System timer */
        mxc_timer_init(&gpt_clk, MX51_IO_ADDRESS(MX51_GPT1_BASE_ADDR),
 -              MX51_MXC_INT_GPT);
 +              MX51_INT_GPT);
        return 0;
  }
  
@@@ -1597,8 -1611,9 +1616,8 @@@ int __init mx53_clocks_init(unsigned lo
        clk_enable(&main_bus_clk);
  
        clk_enable(&iim_clk);
 -      mx53_revision();
 +      imx_print_silicon_rev("i.MX53", mx53_revision());
        clk_disable(&iim_clk);
 -      mx53_display_revision();
  
        /* Set SDHC parents to be PLL2 */
        clk_set_parent(&esdhc1_clk, &pll2_sw_clk);
@@@ -41,6 -41,4 +41,8 @@@ extern const struct imx_imx_keypad_dat
  #define imx53_add_imx_keypad(pdata)   \
        imx_add_imx_keypad(&imx53_imx_keypad_data, pdata)
  
 +extern const struct imx_pata_imx_data imx53_pata_imx_data;
 +#define imx53_add_pata_imx() \
 +      imx_add_pata_imx(&imx53_pata_imx_data)
++
+ extern struct platform_device *__init imx53_add_ahci_imx(void);
@@@ -23,7 -23,6 +23,7 @@@ config MACH_STMP378X_DEV
        select MXS_HAVE_AMBA_DUART
        select MXS_HAVE_PLATFORM_AUART
        select MXS_HAVE_PLATFORM_MXS_MMC
 +      select MXS_HAVE_PLATFORM_RTC_STMP3XXX
        help
          Include support for STMP378x-devb platform. This includes specific
          configurations for the board and its peripherals.
@@@ -35,7 -34,6 +35,7 @@@ config MACH_MX23EV
        select MXS_HAVE_PLATFORM_AUART
        select MXS_HAVE_PLATFORM_MXS_MMC
        select MXS_HAVE_PLATFORM_MXSFB
 +      select MXS_HAVE_PLATFORM_RTC_STMP3XXX
        help
          Include support for MX23EVK platform. This includes specific
          configurations for the board and its peripherals.
@@@ -50,9 -48,6 +50,9 @@@ config MACH_MX28EV
        select MXS_HAVE_PLATFORM_FLEXCAN
        select MXS_HAVE_PLATFORM_MXS_MMC
        select MXS_HAVE_PLATFORM_MXSFB
 +      select MXS_HAVE_PLATFORM_MXS_SAIF
 +      select MXS_HAVE_PLATFORM_MXS_I2C
 +      select MXS_HAVE_PLATFORM_RTC_STMP3XXX
        select MXS_OCOTP
        help
          Include support for MX28EVK platform. This includes specific
@@@ -68,10 -63,26 +68,27 @@@ config MODULE_TX2
        select MXS_HAVE_PLATFORM_MXS_I2C
        select MXS_HAVE_PLATFORM_MXS_MMC
        select MXS_HAVE_PLATFORM_MXS_PWM
 +      select MXS_HAVE_PLATFORM_RTC_STMP3XXX
  
+ config MODULE_M28
+       bool
+       select SOC_IMX28
+       select LEDS_GPIO_REGISTER
+       select MXS_HAVE_AMBA_DUART
+       select MXS_HAVE_PLATFORM_AUART
+       select MXS_HAVE_PLATFORM_FEC
+       select MXS_HAVE_PLATFORM_FLEXCAN
+       select MXS_HAVE_PLATFORM_MXS_I2C
+       select MXS_HAVE_PLATFORM_MXS_MMC
+       select MXS_HAVE_PLATFORM_MXSFB
+       select MXS_OCOTP
  config MACH_TX28
        bool "Ka-Ro TX28 module"
        select MODULE_TX28
  
+ config MACH_M28EVK
+       bool "Support DENX M28EVK Platform"
+       select MODULE_M28
  endif
@@@ -1,15 -1,16 +1,16 @@@
  # Common support
 -obj-y := clock.o devices.o icoll.o iomux.o system.o timer.o
 +obj-y := clock.o devices.o icoll.o iomux.o system.o timer.o mm.o
  
  obj-$(CONFIG_MXS_OCOTP) += ocotp.o
  obj-$(CONFIG_PM) += pm.o
  
 -obj-$(CONFIG_SOC_IMX23) += clock-mx23.o mm-mx23.o
 -obj-$(CONFIG_SOC_IMX28) += clock-mx28.o mm-mx28.o
 +obj-$(CONFIG_SOC_IMX23) += clock-mx23.o
 +obj-$(CONFIG_SOC_IMX28) += clock-mx28.o
  
  obj-$(CONFIG_MACH_STMP378X_DEVB) += mach-stmp378x_devb.o
  obj-$(CONFIG_MACH_MX23EVK) += mach-mx23evk.o
  obj-$(CONFIG_MACH_MX28EVK) += mach-mx28evk.o
+ obj-$(CONFIG_MACH_M28EVK)    += mach-m28evk.o
  obj-$(CONFIG_MODULE_TX28) += module-tx28.o
  obj-$(CONFIG_MACH_TX28)    += mach-tx28.o
  
@@@ -640,8 -640,6 +640,8 @@@ static struct clk_lookup lookups[] = 
        _REGISTER_CLOCK(NULL, "lradc", lradc_clk)
        _REGISTER_CLOCK(NULL, "spdif", spdif_clk)
        _REGISTER_CLOCK("imx28-fb", NULL, lcdif_clk)
 +      _REGISTER_CLOCK("mxs-saif.0", NULL, saif0_clk)
 +      _REGISTER_CLOCK("mxs-saif.1", NULL, saif1_clk)
  };
  
  static int clk_misc_init(void)
  
        /* SAIF has to use frac div for functional operation */
        reg = __raw_readl(CLKCTRL_BASE_ADDR + HW_CLKCTRL_SAIF0);
 -      reg &= ~BM_CLKCTRL_SAIF0_DIV_FRAC_EN;
 +      reg |= BM_CLKCTRL_SAIF0_DIV_FRAC_EN;
        __raw_writel(reg, CLKCTRL_BASE_ADDR + HW_CLKCTRL_SAIF0);
  
        reg = __raw_readl(CLKCTRL_BASE_ADDR + HW_CLKCTRL_SAIF1);
 -      reg &= ~BM_CLKCTRL_SAIF1_DIV_FRAC_EN;
 +      reg |= BM_CLKCTRL_SAIF1_DIV_FRAC_EN;
        __raw_writel(reg, CLKCTRL_BASE_ADDR + HW_CLKCTRL_SAIF1);
  
        /*
        __raw_writel(BM_CLKCTRL_CPU_INTERRUPT_WAIT,
                        CLKCTRL_BASE_ADDR + HW_CLKCTRL_CPU_SET);
  
-       /* Extra fec clock setting */
-       reg = __raw_readl(CLKCTRL_BASE_ADDR + HW_CLKCTRL_ENET);
-       reg &= ~BM_CLKCTRL_ENET_SLEEP;
-       reg |= BM_CLKCTRL_ENET_CLK_OUT_EN;
-       __raw_writel(reg, CLKCTRL_BASE_ADDR + HW_CLKCTRL_ENET);
+       /*
+        * Extra fec clock setting
+        * The DENX M28 uses an external clock source
+        * and the clock output must not be enabled
+        */
+       if (!machine_is_m28evk()) {
+               reg = __raw_readl(CLKCTRL_BASE_ADDR + HW_CLKCTRL_ENET);
+               reg &= ~BM_CLKCTRL_ENET_SLEEP;
+               reg |= BM_CLKCTRL_ENET_CLK_OUT_EN;
+               __raw_writel(reg, CLKCTRL_BASE_ADDR + HW_CLKCTRL_ENET);
+       }
  
        /*
         * 480 MHz seems too high to be ssp clock source directly,
@@@ -776,8 -780,6 +782,8 @@@ int __init mx28_clocks_init(void
        clk_enable(&uart_clk);
  
        clk_set_parent(&lcdif_clk, &ref_pix_clk);
 +      clk_set_parent(&saif0_clk, &pll0_clk);
 +      clk_set_parent(&saif1_clk, &pll0_clk);
  
        clkdev_add_table(lookups, ARRAY_SIZE(lookups));
  
@@@ -33,6 -33,7 +33,7 @@@
                0)
  #define cpu_is_mx28()         (                                       \
                machine_is_mx28evk() ||                                 \
+               machine_is_m28evk() ||                                  \
                machine_is_tx28() ||                                    \
                0)
  
@@@ -86,8 -87,6 +87,8 @@@
        .type = _type,                                                  \
  }
  
 +#define MXS_GPIO_NR(bank, nr) ((bank) * 32 + (nr))
 +
  #define MXS_SET_ADDR          0x4
  #define MXS_CLR_ADDR          0x8
  #define MXS_TOG_ADDR          0xc
@@@ -1,6 -1,6 +1,6 @@@
  config IMX_HAVE_PLATFORM_FEC
        bool
 -      default y if ARCH_MX25 || SOC_IMX27 || SOC_IMX35 || SOC_IMX51 || SOC_IMX53
 +      default y if ARCH_MX25 || SOC_IMX27 || SOC_IMX35 || SOC_IMX50 || SOC_IMX51 || SOC_IMX53
  
  config IMX_HAVE_PLATFORM_FLEXCAN
        select HAVE_CAN_FLEXCAN if CAN
@@@ -31,9 -31,6 +31,9 @@@ config IMX_HAVE_PLATFORM_IMX_I2
  config IMX_HAVE_PLATFORM_IMX_KEYPAD
        bool
  
 +config IMX_HAVE_PLATFORM_PATA_IMX
 +      bool
 +
  config IMX_HAVE_PLATFORM_IMX_SSI
        bool
  
@@@ -79,3 -76,7 +79,7 @@@ config IMX_HAVE_PLATFORM_SDHCI_ESDHC_IM
  
  config IMX_HAVE_PLATFORM_SPI_IMX
        bool
+ config IMX_HAVE_PLATFORM_AHCI
+       bool
+       default y if ARCH_MX53
@@@ -10,7 -10,6 +10,7 @@@ obj-y += platform-imx-dma.
  obj-$(CONFIG_IMX_HAVE_PLATFORM_IMX_FB) += platform-imx-fb.o
  obj-$(CONFIG_IMX_HAVE_PLATFORM_IMX_I2C) += platform-imx-i2c.o
  obj-$(CONFIG_IMX_HAVE_PLATFORM_IMX_KEYPAD) += platform-imx-keypad.o
 +obj-$(CONFIG_IMX_HAVE_PLATFORM_PATA_IMX) += platform-pata_imx.o
  obj-$(CONFIG_IMX_HAVE_PLATFORM_IMX_SSI) += platform-imx-ssi.o
  obj-$(CONFIG_IMX_HAVE_PLATFORM_IMX_UART) += platform-imx-uart.o
  obj-$(CONFIG_IMX_HAVE_PLATFORM_IMX_UDC) += platform-imx_udc.o
@@@ -26,3 -25,4 +26,4 @@@ obj-$(CONFIG_IMX_HAVE_PLATFORM_MXC_RTC
  obj-$(CONFIG_IMX_HAVE_PLATFORM_MXC_W1) += platform-mxc_w1.o
  obj-$(CONFIG_IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX) += platform-sdhci-esdhc-imx.o
  obj-$(CONFIG_IMX_HAVE_PLATFORM_SPI_IMX) +=  platform-spi_imx.o
+ obj-$(CONFIG_IMX_HAVE_PLATFORM_AHCI) +=  platform-ahci-imx.o
@@@ -251,14 -251,6 +251,14 @@@ struct platform_device *__init imx_add_
                const struct imx_mxc_nand_data *data,
                const struct mxc_nand_platform_data *pdata);
  
 +struct imx_pata_imx_data {
 +      resource_size_t iobase;
 +      resource_size_t iosize;
 +      resource_size_t irq;
 +};
 +struct platform_device *__init imx_add_pata_imx(
 +              const struct imx_pata_imx_data *data);
 +
  struct imx_mxc_pwm_data {
        int id;
        resource_size_t iobase;
@@@ -309,3 -301,13 +309,13 @@@ struct platform_device *__init imx_add_
  struct platform_device *imx_add_imx_dma(void);
  struct platform_device *imx_add_imx_sdma(char *name,
        resource_size_t iobase, int irq, struct sdma_platform_data *pdata);
+ #include <linux/ahci_platform.h>
+ struct imx_ahci_imx_data {
+       const char *devid;
+       resource_size_t iobase;
+       resource_size_t irq;
+ };
+ struct platform_device *__init imx_add_ahci_imx(
+               const struct imx_ahci_imx_data *data,
+               const struct ahci_platform_data *pdata);