Merge branch 'viafb-next' of git://github.com/schandinat/linux-2.6
[pandora-kernel.git] / arch / arm / mach-omap2 / omap_hwmod_3xxx_data.c
index 25226bf..b98e2df 100644 (file)
 #include <plat/l4_3xxx.h>
 #include <plat/i2c.h>
 #include <plat/gpio.h>
-#include <plat/smartreflex.h>
+#include <plat/mmc.h>
 #include <plat/mcbsp.h>
 #include <plat/mcspi.h>
+#include <plat/dmtimer.h>
 
 #include "omap_hwmod_common_data.h"
 
@@ -69,6 +70,9 @@ static struct omap_hwmod omap34xx_mcspi1;
 static struct omap_hwmod omap34xx_mcspi2;
 static struct omap_hwmod omap34xx_mcspi3;
 static struct omap_hwmod omap34xx_mcspi4;
+static struct omap_hwmod omap3xxx_mmc1_hwmod;
+static struct omap_hwmod omap3xxx_mmc2_hwmod;
+static struct omap_hwmod omap3xxx_mmc3_hwmod;
 static struct omap_hwmod am35xx_usbhsotg_hwmod;
 
 static struct omap_hwmod omap3xxx_dma_system_hwmod;
@@ -95,10 +99,26 @@ static struct omap_hwmod_ocp_if omap3xxx_l3_main__l4_per = {
        .user   = OCP_USER_MPU | OCP_USER_SDMA,
 };
 
+/* L3 taret configuration and error log registers */
+static struct omap_hwmod_irq_info omap3xxx_l3_main_irqs[] = {
+       { .irq = INT_34XX_L3_DBG_IRQ },
+       { .irq = INT_34XX_L3_APP_IRQ },
+};
+
+static struct omap_hwmod_addr_space omap3xxx_l3_main_addrs[] = {
+       {
+               .pa_start       = 0x68000000,
+               .pa_end         = 0x6800ffff,
+               .flags          = ADDR_TYPE_RT,
+       },
+};
+
 /* MPU -> L3 interface */
 static struct omap_hwmod_ocp_if omap3xxx_mpu__l3_main = {
-       .master = &omap3xxx_mpu_hwmod,
-       .slave  = &omap3xxx_l3_main_hwmod,
+       .master   = &omap3xxx_mpu_hwmod,
+       .slave    = &omap3xxx_l3_main_hwmod,
+       .addr     = omap3xxx_l3_main_addrs,
+       .addr_cnt = ARRAY_SIZE(omap3xxx_l3_main_addrs),
        .user   = OCP_USER_MPU,
 };
 
@@ -130,6 +150,8 @@ static struct omap_hwmod_ocp_if *omap3xxx_l3_main_masters[] = {
 static struct omap_hwmod omap3xxx_l3_main_hwmod = {
        .name           = "l3_main",
        .class          = &l3_hwmod_class,
+       .mpu_irqs       = omap3xxx_l3_main_irqs,
+       .mpu_irqs_cnt   = ARRAY_SIZE(omap3xxx_l3_main_irqs),
        .masters        = omap3xxx_l3_main_masters,
        .masters_cnt    = ARRAY_SIZE(omap3xxx_l3_main_masters),
        .slaves         = omap3xxx_l3_main_slaves,
@@ -167,6 +189,63 @@ static struct omap_hwmod_ocp_if omap3xxx_l4_core__l4_wkup = {
        .user   = OCP_USER_MPU | OCP_USER_SDMA,
 };
 
+/* L4 CORE -> MMC1 interface */
+static struct omap_hwmod_addr_space omap3xxx_mmc1_addr_space[] = {
+       {
+               .pa_start       = 0x4809c000,
+               .pa_end         = 0x4809c1ff,
+               .flags          = ADDR_TYPE_RT,
+       },
+};
+
+static struct omap_hwmod_ocp_if omap3xxx_l4_core__mmc1 = {
+       .master         = &omap3xxx_l4_core_hwmod,
+       .slave          = &omap3xxx_mmc1_hwmod,
+       .clk            = "mmchs1_ick",
+       .addr           = omap3xxx_mmc1_addr_space,
+       .addr_cnt       = ARRAY_SIZE(omap3xxx_mmc1_addr_space),
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+       .flags          = OMAP_FIREWALL_L4
+};
+
+/* L4 CORE -> MMC2 interface */
+static struct omap_hwmod_addr_space omap3xxx_mmc2_addr_space[] = {
+       {
+               .pa_start       = 0x480b4000,
+               .pa_end         = 0x480b41ff,
+               .flags          = ADDR_TYPE_RT,
+       },
+};
+
+static struct omap_hwmod_ocp_if omap3xxx_l4_core__mmc2 = {
+       .master         = &omap3xxx_l4_core_hwmod,
+       .slave          = &omap3xxx_mmc2_hwmod,
+       .clk            = "mmchs2_ick",
+       .addr           = omap3xxx_mmc2_addr_space,
+       .addr_cnt       = ARRAY_SIZE(omap3xxx_mmc2_addr_space),
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+       .flags          = OMAP_FIREWALL_L4
+};
+
+/* L4 CORE -> MMC3 interface */
+static struct omap_hwmod_addr_space omap3xxx_mmc3_addr_space[] = {
+       {
+               .pa_start       = 0x480ad000,
+               .pa_end         = 0x480ad1ff,
+               .flags          = ADDR_TYPE_RT,
+       },
+};
+
+static struct omap_hwmod_ocp_if omap3xxx_l4_core__mmc3 = {
+       .master         = &omap3xxx_l4_core_hwmod,
+       .slave          = &omap3xxx_mmc3_hwmod,
+       .clk            = "mmchs3_ick",
+       .addr           = omap3xxx_mmc3_addr_space,
+       .addr_cnt       = ARRAY_SIZE(omap3xxx_mmc3_addr_space),
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+       .flags          = OMAP_FIREWALL_L4
+};
+
 /* L4 CORE -> UART1 interface */
 static struct omap_hwmod_addr_space omap3xxx_uart1_addr_space[] = {
        {
@@ -411,26 +490,12 @@ static struct omap_hwmod_ocp_if *am35xx_usbhsotg_slaves[] = {
 /* Slave interfaces on the L4_CORE interconnect */
 static struct omap_hwmod_ocp_if *omap3xxx_l4_core_slaves[] = {
        &omap3xxx_l3_main__l4_core,
-       &omap3_l4_core__sr1,
-       &omap3_l4_core__sr2,
-};
-
-/* Master interfaces on the L4_CORE interconnect */
-static struct omap_hwmod_ocp_if *omap3xxx_l4_core_masters[] = {
-       &omap3xxx_l4_core__l4_wkup,
-       &omap3_l4_core__uart1,
-       &omap3_l4_core__uart2,
-       &omap3_l4_core__i2c1,
-       &omap3_l4_core__i2c2,
-       &omap3_l4_core__i2c3,
 };
 
 /* L4 CORE */
 static struct omap_hwmod omap3xxx_l4_core_hwmod = {
        .name           = "l4_core",
        .class          = &l4_hwmod_class,
-       .masters        = omap3xxx_l4_core_masters,
-       .masters_cnt    = ARRAY_SIZE(omap3xxx_l4_core_masters),
        .slaves         = omap3xxx_l4_core_slaves,
        .slaves_cnt     = ARRAY_SIZE(omap3xxx_l4_core_slaves),
        .omap_chip      = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
@@ -442,18 +507,10 @@ static struct omap_hwmod_ocp_if *omap3xxx_l4_per_slaves[] = {
        &omap3xxx_l3_main__l4_per,
 };
 
-/* Master interfaces on the L4_PER interconnect */
-static struct omap_hwmod_ocp_if *omap3xxx_l4_per_masters[] = {
-       &omap3_l4_per__uart3,
-       &omap3_l4_per__uart4,
-};
-
 /* L4 PER */
 static struct omap_hwmod omap3xxx_l4_per_hwmod = {
        .name           = "l4_per",
        .class          = &l4_hwmod_class,
-       .masters        = omap3xxx_l4_per_masters,
-       .masters_cnt    = ARRAY_SIZE(omap3xxx_l4_per_masters),
        .slaves         = omap3xxx_l4_per_slaves,
        .slaves_cnt     = ARRAY_SIZE(omap3xxx_l4_per_slaves),
        .omap_chip      = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
@@ -465,16 +522,10 @@ static struct omap_hwmod_ocp_if *omap3xxx_l4_wkup_slaves[] = {
        &omap3xxx_l4_core__l4_wkup,
 };
 
-/* Master interfaces on the L4_WKUP interconnect */
-static struct omap_hwmod_ocp_if *omap3xxx_l4_wkup_masters[] = {
-};
-
 /* L4 WKUP */
 static struct omap_hwmod omap3xxx_l4_wkup_hwmod = {
        .name           = "l4_wkup",
        .class          = &l4_hwmod_class,
-       .masters        = omap3xxx_l4_wkup_masters,
-       .masters_cnt    = ARRAY_SIZE(omap3xxx_l4_wkup_masters),
        .slaves         = omap3xxx_l4_wkup_slaves,
        .slaves_cnt     = ARRAY_SIZE(omap3xxx_l4_wkup_slaves),
        .omap_chip      = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
@@ -524,6 +575,640 @@ static struct omap_hwmod omap3xxx_iva_hwmod = {
        .omap_chip      = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
 };
 
+/* timer class */
+static struct omap_hwmod_class_sysconfig omap3xxx_timer_1ms_sysc = {
+       .rev_offs       = 0x0000,
+       .sysc_offs      = 0x0010,
+       .syss_offs      = 0x0014,
+       .sysc_flags     = (SYSC_HAS_SIDLEMODE | SYSC_HAS_CLOCKACTIVITY |
+                               SYSC_HAS_ENAWAKEUP | SYSC_HAS_SOFTRESET |
+                               SYSC_HAS_EMUFREE | SYSC_HAS_AUTOIDLE),
+       .idlemodes      = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
+       .sysc_fields    = &omap_hwmod_sysc_type1,
+};
+
+static struct omap_hwmod_class omap3xxx_timer_1ms_hwmod_class = {
+       .name = "timer",
+       .sysc = &omap3xxx_timer_1ms_sysc,
+       .rev = OMAP_TIMER_IP_VERSION_1,
+};
+
+static struct omap_hwmod_class_sysconfig omap3xxx_timer_sysc = {
+       .rev_offs       = 0x0000,
+       .sysc_offs      = 0x0010,
+       .syss_offs      = 0x0014,
+       .sysc_flags     = (SYSC_HAS_SIDLEMODE | SYSC_HAS_ENAWAKEUP |
+                          SYSC_HAS_SOFTRESET | SYSC_HAS_AUTOIDLE),
+       .idlemodes      = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
+       .sysc_fields    = &omap_hwmod_sysc_type1,
+};
+
+static struct omap_hwmod_class omap3xxx_timer_hwmod_class = {
+       .name = "timer",
+       .sysc = &omap3xxx_timer_sysc,
+       .rev =  OMAP_TIMER_IP_VERSION_1,
+};
+
+/* timer1 */
+static struct omap_hwmod omap3xxx_timer1_hwmod;
+static struct omap_hwmod_irq_info omap3xxx_timer1_mpu_irqs[] = {
+       { .irq = 37, },
+};
+
+static struct omap_hwmod_addr_space omap3xxx_timer1_addrs[] = {
+       {
+               .pa_start       = 0x48318000,
+               .pa_end         = 0x48318000 + SZ_1K - 1,
+               .flags          = ADDR_TYPE_RT
+       },
+};
+
+/* l4_wkup -> timer1 */
+static struct omap_hwmod_ocp_if omap3xxx_l4_wkup__timer1 = {
+       .master         = &omap3xxx_l4_wkup_hwmod,
+       .slave          = &omap3xxx_timer1_hwmod,
+       .clk            = "gpt1_ick",
+       .addr           = omap3xxx_timer1_addrs,
+       .addr_cnt       = ARRAY_SIZE(omap3xxx_timer1_addrs),
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* timer1 slave port */
+static struct omap_hwmod_ocp_if *omap3xxx_timer1_slaves[] = {
+       &omap3xxx_l4_wkup__timer1,
+};
+
+/* timer1 hwmod */
+static struct omap_hwmod omap3xxx_timer1_hwmod = {
+       .name           = "timer1",
+       .mpu_irqs       = omap3xxx_timer1_mpu_irqs,
+       .mpu_irqs_cnt   = ARRAY_SIZE(omap3xxx_timer1_mpu_irqs),
+       .main_clk       = "gpt1_fck",
+       .prcm           = {
+               .omap2 = {
+                       .prcm_reg_id = 1,
+                       .module_bit = OMAP3430_EN_GPT1_SHIFT,
+                       .module_offs = WKUP_MOD,
+                       .idlest_reg_id = 1,
+                       .idlest_idle_bit = OMAP3430_ST_GPT1_SHIFT,
+               },
+       },
+       .slaves         = omap3xxx_timer1_slaves,
+       .slaves_cnt     = ARRAY_SIZE(omap3xxx_timer1_slaves),
+       .class          = &omap3xxx_timer_1ms_hwmod_class,
+       .omap_chip      = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
+};
+
+/* timer2 */
+static struct omap_hwmod omap3xxx_timer2_hwmod;
+static struct omap_hwmod_irq_info omap3xxx_timer2_mpu_irqs[] = {
+       { .irq = 38, },
+};
+
+static struct omap_hwmod_addr_space omap3xxx_timer2_addrs[] = {
+       {
+               .pa_start       = 0x49032000,
+               .pa_end         = 0x49032000 + SZ_1K - 1,
+               .flags          = ADDR_TYPE_RT
+       },
+};
+
+/* l4_per -> timer2 */
+static struct omap_hwmod_ocp_if omap3xxx_l4_per__timer2 = {
+       .master         = &omap3xxx_l4_per_hwmod,
+       .slave          = &omap3xxx_timer2_hwmod,
+       .clk            = "gpt2_ick",
+       .addr           = omap3xxx_timer2_addrs,
+       .addr_cnt       = ARRAY_SIZE(omap3xxx_timer2_addrs),
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* timer2 slave port */
+static struct omap_hwmod_ocp_if *omap3xxx_timer2_slaves[] = {
+       &omap3xxx_l4_per__timer2,
+};
+
+/* timer2 hwmod */
+static struct omap_hwmod omap3xxx_timer2_hwmod = {
+       .name           = "timer2",
+       .mpu_irqs       = omap3xxx_timer2_mpu_irqs,
+       .mpu_irqs_cnt   = ARRAY_SIZE(omap3xxx_timer2_mpu_irqs),
+       .main_clk       = "gpt2_fck",
+       .prcm           = {
+               .omap2 = {
+                       .prcm_reg_id = 1,
+                       .module_bit = OMAP3430_EN_GPT2_SHIFT,
+                       .module_offs = OMAP3430_PER_MOD,
+                       .idlest_reg_id = 1,
+                       .idlest_idle_bit = OMAP3430_ST_GPT2_SHIFT,
+               },
+       },
+       .slaves         = omap3xxx_timer2_slaves,
+       .slaves_cnt     = ARRAY_SIZE(omap3xxx_timer2_slaves),
+       .class          = &omap3xxx_timer_1ms_hwmod_class,
+       .omap_chip      = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
+};
+
+/* timer3 */
+static struct omap_hwmod omap3xxx_timer3_hwmod;
+static struct omap_hwmod_irq_info omap3xxx_timer3_mpu_irqs[] = {
+       { .irq = 39, },
+};
+
+static struct omap_hwmod_addr_space omap3xxx_timer3_addrs[] = {
+       {
+               .pa_start       = 0x49034000,
+               .pa_end         = 0x49034000 + SZ_1K - 1,
+               .flags          = ADDR_TYPE_RT
+       },
+};
+
+/* l4_per -> timer3 */
+static struct omap_hwmod_ocp_if omap3xxx_l4_per__timer3 = {
+       .master         = &omap3xxx_l4_per_hwmod,
+       .slave          = &omap3xxx_timer3_hwmod,
+       .clk            = "gpt3_ick",
+       .addr           = omap3xxx_timer3_addrs,
+       .addr_cnt       = ARRAY_SIZE(omap3xxx_timer3_addrs),
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* timer3 slave port */
+static struct omap_hwmod_ocp_if *omap3xxx_timer3_slaves[] = {
+       &omap3xxx_l4_per__timer3,
+};
+
+/* timer3 hwmod */
+static struct omap_hwmod omap3xxx_timer3_hwmod = {
+       .name           = "timer3",
+       .mpu_irqs       = omap3xxx_timer3_mpu_irqs,
+       .mpu_irqs_cnt   = ARRAY_SIZE(omap3xxx_timer3_mpu_irqs),
+       .main_clk       = "gpt3_fck",
+       .prcm           = {
+               .omap2 = {
+                       .prcm_reg_id = 1,
+                       .module_bit = OMAP3430_EN_GPT3_SHIFT,
+                       .module_offs = OMAP3430_PER_MOD,
+                       .idlest_reg_id = 1,
+                       .idlest_idle_bit = OMAP3430_ST_GPT3_SHIFT,
+               },
+       },
+       .slaves         = omap3xxx_timer3_slaves,
+       .slaves_cnt     = ARRAY_SIZE(omap3xxx_timer3_slaves),
+       .class          = &omap3xxx_timer_hwmod_class,
+       .omap_chip      = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
+};
+
+/* timer4 */
+static struct omap_hwmod omap3xxx_timer4_hwmod;
+static struct omap_hwmod_irq_info omap3xxx_timer4_mpu_irqs[] = {
+       { .irq = 40, },
+};
+
+static struct omap_hwmod_addr_space omap3xxx_timer4_addrs[] = {
+       {
+               .pa_start       = 0x49036000,
+               .pa_end         = 0x49036000 + SZ_1K - 1,
+               .flags          = ADDR_TYPE_RT
+       },
+};
+
+/* l4_per -> timer4 */
+static struct omap_hwmod_ocp_if omap3xxx_l4_per__timer4 = {
+       .master         = &omap3xxx_l4_per_hwmod,
+       .slave          = &omap3xxx_timer4_hwmod,
+       .clk            = "gpt4_ick",
+       .addr           = omap3xxx_timer4_addrs,
+       .addr_cnt       = ARRAY_SIZE(omap3xxx_timer4_addrs),
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* timer4 slave port */
+static struct omap_hwmod_ocp_if *omap3xxx_timer4_slaves[] = {
+       &omap3xxx_l4_per__timer4,
+};
+
+/* timer4 hwmod */
+static struct omap_hwmod omap3xxx_timer4_hwmod = {
+       .name           = "timer4",
+       .mpu_irqs       = omap3xxx_timer4_mpu_irqs,
+       .mpu_irqs_cnt   = ARRAY_SIZE(omap3xxx_timer4_mpu_irqs),
+       .main_clk       = "gpt4_fck",
+       .prcm           = {
+               .omap2 = {
+                       .prcm_reg_id = 1,
+                       .module_bit = OMAP3430_EN_GPT4_SHIFT,
+                       .module_offs = OMAP3430_PER_MOD,
+                       .idlest_reg_id = 1,
+                       .idlest_idle_bit = OMAP3430_ST_GPT4_SHIFT,
+               },
+       },
+       .slaves         = omap3xxx_timer4_slaves,
+       .slaves_cnt     = ARRAY_SIZE(omap3xxx_timer4_slaves),
+       .class          = &omap3xxx_timer_hwmod_class,
+       .omap_chip      = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
+};
+
+/* timer5 */
+static struct omap_hwmod omap3xxx_timer5_hwmod;
+static struct omap_hwmod_irq_info omap3xxx_timer5_mpu_irqs[] = {
+       { .irq = 41, },
+};
+
+static struct omap_hwmod_addr_space omap3xxx_timer5_addrs[] = {
+       {
+               .pa_start       = 0x49038000,
+               .pa_end         = 0x49038000 + SZ_1K - 1,
+               .flags          = ADDR_TYPE_RT
+       },
+};
+
+/* l4_per -> timer5 */
+static struct omap_hwmod_ocp_if omap3xxx_l4_per__timer5 = {
+       .master         = &omap3xxx_l4_per_hwmod,
+       .slave          = &omap3xxx_timer5_hwmod,
+       .clk            = "gpt5_ick",
+       .addr           = omap3xxx_timer5_addrs,
+       .addr_cnt       = ARRAY_SIZE(omap3xxx_timer5_addrs),
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* timer5 slave port */
+static struct omap_hwmod_ocp_if *omap3xxx_timer5_slaves[] = {
+       &omap3xxx_l4_per__timer5,
+};
+
+/* timer5 hwmod */
+static struct omap_hwmod omap3xxx_timer5_hwmod = {
+       .name           = "timer5",
+       .mpu_irqs       = omap3xxx_timer5_mpu_irqs,
+       .mpu_irqs_cnt   = ARRAY_SIZE(omap3xxx_timer5_mpu_irqs),
+       .main_clk       = "gpt5_fck",
+       .prcm           = {
+               .omap2 = {
+                       .prcm_reg_id = 1,
+                       .module_bit = OMAP3430_EN_GPT5_SHIFT,
+                       .module_offs = OMAP3430_PER_MOD,
+                       .idlest_reg_id = 1,
+                       .idlest_idle_bit = OMAP3430_ST_GPT5_SHIFT,
+               },
+       },
+       .slaves         = omap3xxx_timer5_slaves,
+       .slaves_cnt     = ARRAY_SIZE(omap3xxx_timer5_slaves),
+       .class          = &omap3xxx_timer_hwmod_class,
+       .omap_chip      = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
+};
+
+/* timer6 */
+static struct omap_hwmod omap3xxx_timer6_hwmod;
+static struct omap_hwmod_irq_info omap3xxx_timer6_mpu_irqs[] = {
+       { .irq = 42, },
+};
+
+static struct omap_hwmod_addr_space omap3xxx_timer6_addrs[] = {
+       {
+               .pa_start       = 0x4903A000,
+               .pa_end         = 0x4903A000 + SZ_1K - 1,
+               .flags          = ADDR_TYPE_RT
+       },
+};
+
+/* l4_per -> timer6 */
+static struct omap_hwmod_ocp_if omap3xxx_l4_per__timer6 = {
+       .master         = &omap3xxx_l4_per_hwmod,
+       .slave          = &omap3xxx_timer6_hwmod,
+       .clk            = "gpt6_ick",
+       .addr           = omap3xxx_timer6_addrs,
+       .addr_cnt       = ARRAY_SIZE(omap3xxx_timer6_addrs),
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* timer6 slave port */
+static struct omap_hwmod_ocp_if *omap3xxx_timer6_slaves[] = {
+       &omap3xxx_l4_per__timer6,
+};
+
+/* timer6 hwmod */
+static struct omap_hwmod omap3xxx_timer6_hwmod = {
+       .name           = "timer6",
+       .mpu_irqs       = omap3xxx_timer6_mpu_irqs,
+       .mpu_irqs_cnt   = ARRAY_SIZE(omap3xxx_timer6_mpu_irqs),
+       .main_clk       = "gpt6_fck",
+       .prcm           = {
+               .omap2 = {
+                       .prcm_reg_id = 1,
+                       .module_bit = OMAP3430_EN_GPT6_SHIFT,
+                       .module_offs = OMAP3430_PER_MOD,
+                       .idlest_reg_id = 1,
+                       .idlest_idle_bit = OMAP3430_ST_GPT6_SHIFT,
+               },
+       },
+       .slaves         = omap3xxx_timer6_slaves,
+       .slaves_cnt     = ARRAY_SIZE(omap3xxx_timer6_slaves),
+       .class          = &omap3xxx_timer_hwmod_class,
+       .omap_chip      = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
+};
+
+/* timer7 */
+static struct omap_hwmod omap3xxx_timer7_hwmod;
+static struct omap_hwmod_irq_info omap3xxx_timer7_mpu_irqs[] = {
+       { .irq = 43, },
+};
+
+static struct omap_hwmod_addr_space omap3xxx_timer7_addrs[] = {
+       {
+               .pa_start       = 0x4903C000,
+               .pa_end         = 0x4903C000 + SZ_1K - 1,
+               .flags          = ADDR_TYPE_RT
+       },
+};
+
+/* l4_per -> timer7 */
+static struct omap_hwmod_ocp_if omap3xxx_l4_per__timer7 = {
+       .master         = &omap3xxx_l4_per_hwmod,
+       .slave          = &omap3xxx_timer7_hwmod,
+       .clk            = "gpt7_ick",
+       .addr           = omap3xxx_timer7_addrs,
+       .addr_cnt       = ARRAY_SIZE(omap3xxx_timer7_addrs),
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* timer7 slave port */
+static struct omap_hwmod_ocp_if *omap3xxx_timer7_slaves[] = {
+       &omap3xxx_l4_per__timer7,
+};
+
+/* timer7 hwmod */
+static struct omap_hwmod omap3xxx_timer7_hwmod = {
+       .name           = "timer7",
+       .mpu_irqs       = omap3xxx_timer7_mpu_irqs,
+       .mpu_irqs_cnt   = ARRAY_SIZE(omap3xxx_timer7_mpu_irqs),
+       .main_clk       = "gpt7_fck",
+       .prcm           = {
+               .omap2 = {
+                       .prcm_reg_id = 1,
+                       .module_bit = OMAP3430_EN_GPT7_SHIFT,
+                       .module_offs = OMAP3430_PER_MOD,
+                       .idlest_reg_id = 1,
+                       .idlest_idle_bit = OMAP3430_ST_GPT7_SHIFT,
+               },
+       },
+       .slaves         = omap3xxx_timer7_slaves,
+       .slaves_cnt     = ARRAY_SIZE(omap3xxx_timer7_slaves),
+       .class          = &omap3xxx_timer_hwmod_class,
+       .omap_chip      = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
+};
+
+/* timer8 */
+static struct omap_hwmod omap3xxx_timer8_hwmod;
+static struct omap_hwmod_irq_info omap3xxx_timer8_mpu_irqs[] = {
+       { .irq = 44, },
+};
+
+static struct omap_hwmod_addr_space omap3xxx_timer8_addrs[] = {
+       {
+               .pa_start       = 0x4903E000,
+               .pa_end         = 0x4903E000 + SZ_1K - 1,
+               .flags          = ADDR_TYPE_RT
+       },
+};
+
+/* l4_per -> timer8 */
+static struct omap_hwmod_ocp_if omap3xxx_l4_per__timer8 = {
+       .master         = &omap3xxx_l4_per_hwmod,
+       .slave          = &omap3xxx_timer8_hwmod,
+       .clk            = "gpt8_ick",
+       .addr           = omap3xxx_timer8_addrs,
+       .addr_cnt       = ARRAY_SIZE(omap3xxx_timer8_addrs),
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* timer8 slave port */
+static struct omap_hwmod_ocp_if *omap3xxx_timer8_slaves[] = {
+       &omap3xxx_l4_per__timer8,
+};
+
+/* timer8 hwmod */
+static struct omap_hwmod omap3xxx_timer8_hwmod = {
+       .name           = "timer8",
+       .mpu_irqs       = omap3xxx_timer8_mpu_irqs,
+       .mpu_irqs_cnt   = ARRAY_SIZE(omap3xxx_timer8_mpu_irqs),
+       .main_clk       = "gpt8_fck",
+       .prcm           = {
+               .omap2 = {
+                       .prcm_reg_id = 1,
+                       .module_bit = OMAP3430_EN_GPT8_SHIFT,
+                       .module_offs = OMAP3430_PER_MOD,
+                       .idlest_reg_id = 1,
+                       .idlest_idle_bit = OMAP3430_ST_GPT8_SHIFT,
+               },
+       },
+       .slaves         = omap3xxx_timer8_slaves,
+       .slaves_cnt     = ARRAY_SIZE(omap3xxx_timer8_slaves),
+       .class          = &omap3xxx_timer_hwmod_class,
+       .omap_chip      = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
+};
+
+/* timer9 */
+static struct omap_hwmod omap3xxx_timer9_hwmod;
+static struct omap_hwmod_irq_info omap3xxx_timer9_mpu_irqs[] = {
+       { .irq = 45, },
+};
+
+static struct omap_hwmod_addr_space omap3xxx_timer9_addrs[] = {
+       {
+               .pa_start       = 0x49040000,
+               .pa_end         = 0x49040000 + SZ_1K - 1,
+               .flags          = ADDR_TYPE_RT
+       },
+};
+
+/* l4_per -> timer9 */
+static struct omap_hwmod_ocp_if omap3xxx_l4_per__timer9 = {
+       .master         = &omap3xxx_l4_per_hwmod,
+       .slave          = &omap3xxx_timer9_hwmod,
+       .clk            = "gpt9_ick",
+       .addr           = omap3xxx_timer9_addrs,
+       .addr_cnt       = ARRAY_SIZE(omap3xxx_timer9_addrs),
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* timer9 slave port */
+static struct omap_hwmod_ocp_if *omap3xxx_timer9_slaves[] = {
+       &omap3xxx_l4_per__timer9,
+};
+
+/* timer9 hwmod */
+static struct omap_hwmod omap3xxx_timer9_hwmod = {
+       .name           = "timer9",
+       .mpu_irqs       = omap3xxx_timer9_mpu_irqs,
+       .mpu_irqs_cnt   = ARRAY_SIZE(omap3xxx_timer9_mpu_irqs),
+       .main_clk       = "gpt9_fck",
+       .prcm           = {
+               .omap2 = {
+                       .prcm_reg_id = 1,
+                       .module_bit = OMAP3430_EN_GPT9_SHIFT,
+                       .module_offs = OMAP3430_PER_MOD,
+                       .idlest_reg_id = 1,
+                       .idlest_idle_bit = OMAP3430_ST_GPT9_SHIFT,
+               },
+       },
+       .slaves         = omap3xxx_timer9_slaves,
+       .slaves_cnt     = ARRAY_SIZE(omap3xxx_timer9_slaves),
+       .class          = &omap3xxx_timer_hwmod_class,
+       .omap_chip      = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
+};
+
+/* timer10 */
+static struct omap_hwmod omap3xxx_timer10_hwmod;
+static struct omap_hwmod_irq_info omap3xxx_timer10_mpu_irqs[] = {
+       { .irq = 46, },
+};
+
+static struct omap_hwmod_addr_space omap3xxx_timer10_addrs[] = {
+       {
+               .pa_start       = 0x48086000,
+               .pa_end         = 0x48086000 + SZ_1K - 1,
+               .flags          = ADDR_TYPE_RT
+       },
+};
+
+/* l4_core -> timer10 */
+static struct omap_hwmod_ocp_if omap3xxx_l4_core__timer10 = {
+       .master         = &omap3xxx_l4_core_hwmod,
+       .slave          = &omap3xxx_timer10_hwmod,
+       .clk            = "gpt10_ick",
+       .addr           = omap3xxx_timer10_addrs,
+       .addr_cnt       = ARRAY_SIZE(omap3xxx_timer10_addrs),
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* timer10 slave port */
+static struct omap_hwmod_ocp_if *omap3xxx_timer10_slaves[] = {
+       &omap3xxx_l4_core__timer10,
+};
+
+/* timer10 hwmod */
+static struct omap_hwmod omap3xxx_timer10_hwmod = {
+       .name           = "timer10",
+       .mpu_irqs       = omap3xxx_timer10_mpu_irqs,
+       .mpu_irqs_cnt   = ARRAY_SIZE(omap3xxx_timer10_mpu_irqs),
+       .main_clk       = "gpt10_fck",
+       .prcm           = {
+               .omap2 = {
+                       .prcm_reg_id = 1,
+                       .module_bit = OMAP3430_EN_GPT10_SHIFT,
+                       .module_offs = CORE_MOD,
+                       .idlest_reg_id = 1,
+                       .idlest_idle_bit = OMAP3430_ST_GPT10_SHIFT,
+               },
+       },
+       .slaves         = omap3xxx_timer10_slaves,
+       .slaves_cnt     = ARRAY_SIZE(omap3xxx_timer10_slaves),
+       .class          = &omap3xxx_timer_1ms_hwmod_class,
+       .omap_chip      = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
+};
+
+/* timer11 */
+static struct omap_hwmod omap3xxx_timer11_hwmod;
+static struct omap_hwmod_irq_info omap3xxx_timer11_mpu_irqs[] = {
+       { .irq = 47, },
+};
+
+static struct omap_hwmod_addr_space omap3xxx_timer11_addrs[] = {
+       {
+               .pa_start       = 0x48088000,
+               .pa_end         = 0x48088000 + SZ_1K - 1,
+               .flags          = ADDR_TYPE_RT
+       },
+};
+
+/* l4_core -> timer11 */
+static struct omap_hwmod_ocp_if omap3xxx_l4_core__timer11 = {
+       .master         = &omap3xxx_l4_core_hwmod,
+       .slave          = &omap3xxx_timer11_hwmod,
+       .clk            = "gpt11_ick",
+       .addr           = omap3xxx_timer11_addrs,
+       .addr_cnt       = ARRAY_SIZE(omap3xxx_timer11_addrs),
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* timer11 slave port */
+static struct omap_hwmod_ocp_if *omap3xxx_timer11_slaves[] = {
+       &omap3xxx_l4_core__timer11,
+};
+
+/* timer11 hwmod */
+static struct omap_hwmod omap3xxx_timer11_hwmod = {
+       .name           = "timer11",
+       .mpu_irqs       = omap3xxx_timer11_mpu_irqs,
+       .mpu_irqs_cnt   = ARRAY_SIZE(omap3xxx_timer11_mpu_irqs),
+       .main_clk       = "gpt11_fck",
+       .prcm           = {
+               .omap2 = {
+                       .prcm_reg_id = 1,
+                       .module_bit = OMAP3430_EN_GPT11_SHIFT,
+                       .module_offs = CORE_MOD,
+                       .idlest_reg_id = 1,
+                       .idlest_idle_bit = OMAP3430_ST_GPT11_SHIFT,
+               },
+       },
+       .slaves         = omap3xxx_timer11_slaves,
+       .slaves_cnt     = ARRAY_SIZE(omap3xxx_timer11_slaves),
+       .class          = &omap3xxx_timer_hwmod_class,
+       .omap_chip      = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
+};
+
+/* timer12*/
+static struct omap_hwmod omap3xxx_timer12_hwmod;
+static struct omap_hwmod_irq_info omap3xxx_timer12_mpu_irqs[] = {
+       { .irq = 95, },
+};
+
+static struct omap_hwmod_addr_space omap3xxx_timer12_addrs[] = {
+       {
+               .pa_start       = 0x48304000,
+               .pa_end         = 0x48304000 + SZ_1K - 1,
+               .flags          = ADDR_TYPE_RT
+       },
+};
+
+/* l4_core -> timer12 */
+static struct omap_hwmod_ocp_if omap3xxx_l4_core__timer12 = {
+       .master         = &omap3xxx_l4_core_hwmod,
+       .slave          = &omap3xxx_timer12_hwmod,
+       .clk            = "gpt12_ick",
+       .addr           = omap3xxx_timer12_addrs,
+       .addr_cnt       = ARRAY_SIZE(omap3xxx_timer12_addrs),
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* timer12 slave port */
+static struct omap_hwmod_ocp_if *omap3xxx_timer12_slaves[] = {
+       &omap3xxx_l4_core__timer12,
+};
+
+/* timer12 hwmod */
+static struct omap_hwmod omap3xxx_timer12_hwmod = {
+       .name           = "timer12",
+       .mpu_irqs       = omap3xxx_timer12_mpu_irqs,
+       .mpu_irqs_cnt   = ARRAY_SIZE(omap3xxx_timer12_mpu_irqs),
+       .main_clk       = "gpt12_fck",
+       .prcm           = {
+               .omap2 = {
+                       .prcm_reg_id = 1,
+                       .module_bit = OMAP3430_EN_GPT12_SHIFT,
+                       .module_offs = WKUP_MOD,
+                       .idlest_reg_id = 1,
+                       .idlest_idle_bit = OMAP3430_ST_GPT12_SHIFT,
+               },
+       },
+       .slaves         = omap3xxx_timer12_slaves,
+       .slaves_cnt     = ARRAY_SIZE(omap3xxx_timer12_slaves),
+       .class          = &omap3xxx_timer_hwmod_class,
+       .omap_chip      = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
+};
+
 /* l4_wkup -> wd_timer2 */
 static struct omap_hwmod_addr_space omap3xxx_wd_timer2_addrs[] = {
        {
@@ -554,7 +1239,8 @@ static struct omap_hwmod_class_sysconfig omap3xxx_wd_timer_sysc = {
        .syss_offs      = 0x0014,
        .sysc_flags     = (SYSC_HAS_SIDLEMODE | SYSC_HAS_EMUFREE |
                           SYSC_HAS_ENAWAKEUP | SYSC_HAS_SOFTRESET |
-                          SYSC_HAS_AUTOIDLE | SYSC_HAS_CLOCKACTIVITY),
+                          SYSC_HAS_AUTOIDLE | SYSC_HAS_CLOCKACTIVITY |
+                          SYSS_HAS_RESET_STATUS),
        .idlemodes      = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
        .sysc_fields    = &omap_hwmod_sysc_type1,
 };
@@ -566,7 +1252,7 @@ static struct omap_hwmod_class_sysconfig i2c_sysc = {
        .syss_offs      = 0x10,
        .sysc_flags     = (SYSC_HAS_CLOCKACTIVITY | SYSC_HAS_SIDLEMODE |
                           SYSC_HAS_ENAWAKEUP | SYSC_HAS_SOFTRESET |
-                          SYSC_HAS_AUTOIDLE),
+                          SYSC_HAS_AUTOIDLE | SYSS_HAS_RESET_STATUS),
        .idlemodes      = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
        .sysc_fields    = &omap_hwmod_sysc_type1,
 };
@@ -598,6 +1284,11 @@ static struct omap_hwmod omap3xxx_wd_timer2_hwmod = {
        .slaves         = omap3xxx_wd_timer2_slaves,
        .slaves_cnt     = ARRAY_SIZE(omap3xxx_wd_timer2_slaves),
        .omap_chip      = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
+       /*
+        * XXX: Use software supervised mode, HW supervised smartidle seems to
+        * block CORE power domain idle transitions. Maybe a HW bug in wdt2?
+        */
+       .flags          = HWMOD_SWSUP_SIDLE,
 };
 
 /* UART common */
@@ -608,7 +1299,7 @@ static struct omap_hwmod_class_sysconfig uart_sysc = {
        .syss_offs      = 0x58,
        .sysc_flags     = (SYSC_HAS_SIDLEMODE |
                           SYSC_HAS_ENAWAKEUP | SYSC_HAS_SOFTRESET |
-                          SYSC_HAS_AUTOIDLE),
+                          SYSC_HAS_AUTOIDLE | SYSS_HAS_RESET_STATUS),
        .idlemodes      = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
        .sysc_fields    = &omap_hwmod_sysc_type1,
 };
@@ -789,11 +1480,6 @@ static struct omap_hwmod_class omap3xxx_dss_hwmod_class = {
        .sysc = &omap3xxx_dss_sysc,
 };
 
-/* dss */
-static struct omap_hwmod_irq_info omap3xxx_dss_irqs[] = {
-       { .irq = 25 },
-};
-
 static struct omap_hwmod_dma_info omap3xxx_dss_sdma_chs[] = {
        { .name = "dispc", .dma_req = 5 },
        { .name = "dsi1", .dma_req = 74 },
@@ -857,7 +1543,7 @@ static struct omap_hwmod_ocp_if *omap3xxx_dss_slaves[] = {
 
 static struct omap_hwmod_opt_clk dss_opt_clks[] = {
        { .role = "tv_clk", .clk = "dss_tv_fck" },
-       { .role = "dssclk", .clk = "dss_96m_fck" },
+       { .role = "video_clk", .clk = "dss_96m_fck" },
        { .role = "sys_clk", .clk = "dss2_alwon_fck" },
 };
 
@@ -865,8 +1551,6 @@ static struct omap_hwmod omap3430es1_dss_core_hwmod = {
        .name           = "dss_core",
        .class          = &omap3xxx_dss_hwmod_class,
        .main_clk       = "dss1_alwon_fck", /* instead of dss_fck */
-       .mpu_irqs       = omap3xxx_dss_irqs,
-       .mpu_irqs_cnt   = ARRAY_SIZE(omap3xxx_dss_irqs),
        .sdma_reqs      = omap3xxx_dss_sdma_chs,
        .sdma_reqs_cnt  = ARRAY_SIZE(omap3xxx_dss_sdma_chs),
 
@@ -893,8 +1577,6 @@ static struct omap_hwmod omap3xxx_dss_core_hwmod = {
        .name           = "dss_core",
        .class          = &omap3xxx_dss_hwmod_class,
        .main_clk       = "dss1_alwon_fck", /* instead of dss_fck */
-       .mpu_irqs       = omap3xxx_dss_irqs,
-       .mpu_irqs_cnt   = ARRAY_SIZE(omap3xxx_dss_irqs),
        .sdma_reqs      = omap3xxx_dss_sdma_chs,
        .sdma_reqs_cnt  = ARRAY_SIZE(omap3xxx_dss_sdma_chs),
 
@@ -940,6 +1622,10 @@ static struct omap_hwmod_class omap3xxx_dispc_hwmod_class = {
        .sysc = &omap3xxx_dispc_sysc,
 };
 
+static struct omap_hwmod_irq_info omap3xxx_dispc_irqs[] = {
+       { .irq = 25 },
+};
+
 static struct omap_hwmod_addr_space omap3xxx_dss_dispc_addrs[] = {
        {
                .pa_start       = 0x48050400,
@@ -973,6 +1659,8 @@ static struct omap_hwmod_ocp_if *omap3xxx_dss_dispc_slaves[] = {
 static struct omap_hwmod omap3xxx_dss_dispc_hwmod = {
        .name           = "dss_dispc",
        .class          = &omap3xxx_dispc_hwmod_class,
+       .mpu_irqs       = omap3xxx_dispc_irqs,
+       .mpu_irqs_cnt   = ARRAY_SIZE(omap3xxx_dispc_irqs),
        .main_clk       = "dss1_alwon_fck",
        .prcm           = {
                .omap2 = {
@@ -998,6 +1686,10 @@ static struct omap_hwmod_class omap3xxx_dsi_hwmod_class = {
        .name = "dsi",
 };
 
+static struct omap_hwmod_irq_info omap3xxx_dsi1_irqs[] = {
+       { .irq = 25 },
+};
+
 /* dss_dsi1 */
 static struct omap_hwmod_addr_space omap3xxx_dss_dsi1_addrs[] = {
        {
@@ -1031,6 +1723,8 @@ static struct omap_hwmod_ocp_if *omap3xxx_dss_dsi1_slaves[] = {
 static struct omap_hwmod omap3xxx_dss_dsi1_hwmod = {
        .name           = "dss_dsi1",
        .class          = &omap3xxx_dsi_hwmod_class,
+       .mpu_irqs       = omap3xxx_dsi1_irqs,
+       .mpu_irqs_cnt   = ARRAY_SIZE(omap3xxx_dsi1_irqs),
        .main_clk       = "dss1_alwon_fck",
        .prcm           = {
                .omap2 = {
@@ -1148,6 +1842,7 @@ static struct omap_hwmod_ocp_if omap3xxx_l4_core__dss_venc = {
                        .flags  = OMAP_FIREWALL_L4,
                }
        },
+       .flags          = OCPIF_SWSUP_IDLE,
        .user           = OCP_USER_MPU | OCP_USER_SDMA,
 };
 
@@ -1413,7 +2108,8 @@ static struct omap_hwmod_class_sysconfig omap3xxx_gpio_sysc = {
        .sysc_offs      = 0x0010,
        .syss_offs      = 0x0014,
        .sysc_flags     = (SYSC_HAS_ENAWAKEUP | SYSC_HAS_SIDLEMODE |
-                          SYSC_HAS_SOFTRESET | SYSC_HAS_AUTOIDLE),
+                          SYSC_HAS_SOFTRESET | SYSC_HAS_AUTOIDLE |
+                          SYSS_HAS_RESET_STATUS),
        .idlemodes      = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
        .sysc_fields    = &omap_hwmod_sysc_type1,
 };
@@ -1667,7 +2363,8 @@ static struct omap_hwmod_class_sysconfig omap3xxx_dma_sysc = {
        .syss_offs      = 0x0028,
        .sysc_flags     = (SYSC_HAS_SIDLEMODE | SYSC_HAS_SOFTRESET |
                           SYSC_HAS_MIDLEMODE | SYSC_HAS_CLOCKACTIVITY |
-                          SYSC_HAS_EMUFREE | SYSC_HAS_AUTOIDLE),
+                          SYSC_HAS_EMUFREE | SYSC_HAS_AUTOIDLE |
+                          SYSS_HAS_RESET_STATUS),
        .idlemodes      = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
                           MSTANDBY_FORCE | MSTANDBY_NO | MSTANDBY_SMART),
        .sysc_fields    = &omap_hwmod_sysc_type1,
@@ -2720,13 +3417,181 @@ static struct omap_hwmod am35xx_usbhsotg_hwmod = {
        .omap_chip      = OMAP_CHIP_INIT(CHIP_IS_OMAP3430ES3_1)
 };
 
+/* MMC/SD/SDIO common */
+
+static struct omap_hwmod_class_sysconfig omap34xx_mmc_sysc = {
+       .rev_offs       = 0x1fc,
+       .sysc_offs      = 0x10,
+       .syss_offs      = 0x14,
+       .sysc_flags     = (SYSC_HAS_CLOCKACTIVITY | SYSC_HAS_SIDLEMODE |
+                          SYSC_HAS_ENAWAKEUP | SYSC_HAS_SOFTRESET |
+                          SYSC_HAS_AUTOIDLE | SYSS_HAS_RESET_STATUS),
+       .idlemodes      = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
+       .sysc_fields    = &omap_hwmod_sysc_type1,
+};
+
+static struct omap_hwmod_class omap34xx_mmc_class = {
+       .name = "mmc",
+       .sysc = &omap34xx_mmc_sysc,
+};
+
+/* MMC/SD/SDIO1 */
+
+static struct omap_hwmod_irq_info omap34xx_mmc1_mpu_irqs[] = {
+       { .irq = 83, },
+};
+
+static struct omap_hwmod_dma_info omap34xx_mmc1_sdma_reqs[] = {
+       { .name = "tx", .dma_req = 61, },
+       { .name = "rx", .dma_req = 62, },
+};
+
+static struct omap_hwmod_opt_clk omap34xx_mmc1_opt_clks[] = {
+       { .role = "dbck", .clk = "omap_32k_fck", },
+};
+
+static struct omap_hwmod_ocp_if *omap3xxx_mmc1_slaves[] = {
+       &omap3xxx_l4_core__mmc1,
+};
+
+static struct omap_mmc_dev_attr mmc1_dev_attr = {
+       .flags = OMAP_HSMMC_SUPPORTS_DUAL_VOLT,
+};
+
+static struct omap_hwmod omap3xxx_mmc1_hwmod = {
+       .name           = "mmc1",
+       .mpu_irqs       = omap34xx_mmc1_mpu_irqs,
+       .mpu_irqs_cnt   = ARRAY_SIZE(omap34xx_mmc1_mpu_irqs),
+       .sdma_reqs      = omap34xx_mmc1_sdma_reqs,
+       .sdma_reqs_cnt  = ARRAY_SIZE(omap34xx_mmc1_sdma_reqs),
+       .opt_clks       = omap34xx_mmc1_opt_clks,
+       .opt_clks_cnt   = ARRAY_SIZE(omap34xx_mmc1_opt_clks),
+       .main_clk       = "mmchs1_fck",
+       .prcm           = {
+               .omap2 = {
+                       .module_offs = CORE_MOD,
+                       .prcm_reg_id = 1,
+                       .module_bit = OMAP3430_EN_MMC1_SHIFT,
+                       .idlest_reg_id = 1,
+                       .idlest_idle_bit = OMAP3430_ST_MMC1_SHIFT,
+               },
+       },
+       .dev_attr       = &mmc1_dev_attr,
+       .slaves         = omap3xxx_mmc1_slaves,
+       .slaves_cnt     = ARRAY_SIZE(omap3xxx_mmc1_slaves),
+       .class          = &omap34xx_mmc_class,
+       .omap_chip      = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
+};
+
+/* MMC/SD/SDIO2 */
+
+static struct omap_hwmod_irq_info omap34xx_mmc2_mpu_irqs[] = {
+       { .irq = INT_24XX_MMC2_IRQ, },
+};
+
+static struct omap_hwmod_dma_info omap34xx_mmc2_sdma_reqs[] = {
+       { .name = "tx", .dma_req = 47, },
+       { .name = "rx", .dma_req = 48, },
+};
+
+static struct omap_hwmod_opt_clk omap34xx_mmc2_opt_clks[] = {
+       { .role = "dbck", .clk = "omap_32k_fck", },
+};
+
+static struct omap_hwmod_ocp_if *omap3xxx_mmc2_slaves[] = {
+       &omap3xxx_l4_core__mmc2,
+};
+
+static struct omap_hwmod omap3xxx_mmc2_hwmod = {
+       .name           = "mmc2",
+       .mpu_irqs       = omap34xx_mmc2_mpu_irqs,
+       .mpu_irqs_cnt   = ARRAY_SIZE(omap34xx_mmc2_mpu_irqs),
+       .sdma_reqs      = omap34xx_mmc2_sdma_reqs,
+       .sdma_reqs_cnt  = ARRAY_SIZE(omap34xx_mmc2_sdma_reqs),
+       .opt_clks       = omap34xx_mmc2_opt_clks,
+       .opt_clks_cnt   = ARRAY_SIZE(omap34xx_mmc2_opt_clks),
+       .main_clk       = "mmchs2_fck",
+       .prcm           = {
+               .omap2 = {
+                       .module_offs = CORE_MOD,
+                       .prcm_reg_id = 1,
+                       .module_bit = OMAP3430_EN_MMC2_SHIFT,
+                       .idlest_reg_id = 1,
+                       .idlest_idle_bit = OMAP3430_ST_MMC2_SHIFT,
+               },
+       },
+       .slaves         = omap3xxx_mmc2_slaves,
+       .slaves_cnt     = ARRAY_SIZE(omap3xxx_mmc2_slaves),
+       .class          = &omap34xx_mmc_class,
+       .omap_chip      = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
+};
+
+/* MMC/SD/SDIO3 */
+
+static struct omap_hwmod_irq_info omap34xx_mmc3_mpu_irqs[] = {
+       { .irq = 94, },
+};
+
+static struct omap_hwmod_dma_info omap34xx_mmc3_sdma_reqs[] = {
+       { .name = "tx", .dma_req = 77, },
+       { .name = "rx", .dma_req = 78, },
+};
+
+static struct omap_hwmod_opt_clk omap34xx_mmc3_opt_clks[] = {
+       { .role = "dbck", .clk = "omap_32k_fck", },
+};
+
+static struct omap_hwmod_ocp_if *omap3xxx_mmc3_slaves[] = {
+       &omap3xxx_l4_core__mmc3,
+};
+
+static struct omap_hwmod omap3xxx_mmc3_hwmod = {
+       .name           = "mmc3",
+       .mpu_irqs       = omap34xx_mmc3_mpu_irqs,
+       .mpu_irqs_cnt   = ARRAY_SIZE(omap34xx_mmc3_mpu_irqs),
+       .sdma_reqs      = omap34xx_mmc3_sdma_reqs,
+       .sdma_reqs_cnt  = ARRAY_SIZE(omap34xx_mmc3_sdma_reqs),
+       .opt_clks       = omap34xx_mmc3_opt_clks,
+       .opt_clks_cnt   = ARRAY_SIZE(omap34xx_mmc3_opt_clks),
+       .main_clk       = "mmchs3_fck",
+       .prcm           = {
+               .omap2 = {
+                       .prcm_reg_id = 1,
+                       .module_bit = OMAP3430_EN_MMC3_SHIFT,
+                       .idlest_reg_id = 1,
+                       .idlest_idle_bit = OMAP3430_ST_MMC3_SHIFT,
+               },
+       },
+       .slaves         = omap3xxx_mmc3_slaves,
+       .slaves_cnt     = ARRAY_SIZE(omap3xxx_mmc3_slaves),
+       .class          = &omap34xx_mmc_class,
+       .omap_chip      = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
+};
+
 static __initdata struct omap_hwmod *omap3xxx_hwmods[] = {
        &omap3xxx_l3_main_hwmod,
        &omap3xxx_l4_core_hwmod,
        &omap3xxx_l4_per_hwmod,
        &omap3xxx_l4_wkup_hwmod,
+       &omap3xxx_mmc1_hwmod,
+       &omap3xxx_mmc2_hwmod,
+       &omap3xxx_mmc3_hwmod,
        &omap3xxx_mpu_hwmod,
        &omap3xxx_iva_hwmod,
+
+       &omap3xxx_timer1_hwmod,
+       &omap3xxx_timer2_hwmod,
+       &omap3xxx_timer3_hwmod,
+       &omap3xxx_timer4_hwmod,
+       &omap3xxx_timer5_hwmod,
+       &omap3xxx_timer6_hwmod,
+       &omap3xxx_timer7_hwmod,
+       &omap3xxx_timer8_hwmod,
+       &omap3xxx_timer9_hwmod,
+       &omap3xxx_timer10_hwmod,
+       &omap3xxx_timer11_hwmod,
+       &omap3xxx_timer12_hwmod,
+
        &omap3xxx_wd_timer2_hwmod,
        &omap3xxx_uart1_hwmod,
        &omap3xxx_uart2_hwmod,
@@ -2790,5 +3655,5 @@ static __initdata struct omap_hwmod *omap3xxx_hwmods[] = {
 
 int __init omap3xxx_hwmod_init(void)
 {
-       return omap_hwmod_init(omap3xxx_hwmods);
+       return omap_hwmod_register(omap3xxx_hwmods);
 }