diff mbox

[PATCHv3,11/17] dmtimer: early boot infrastructure

Message ID 1285059286-26566-1-git-send-email-tarun.kanti@ti.com (mailing list archive)
State Superseded
Delegated to: Kevin Hilman
Headers show

Commit Message

Tarun Kanti DebBarma Sept. 21, 2010, 8:54 a.m. UTC
None
diff mbox

Patch

diff --git a/arch/arm/mach-omap2/omap_hwmod_2420_data.c b/arch/arm/mach-omap2/omap_hwmod_2420_data.c
index b3dd8ac..fc761a5 100644
--- a/arch/arm/mach-omap2/omap_hwmod_2420_data.c
+++ b/arch/arm/mach-omap2/omap_hwmod_2420_data.c
@@ -177,6 +177,85 @@  static struct omap_hwmod_class omap2420_timer_hwmod_class = {
 	.rev = OMAP_TIMER_IP_VERSION_1,
 };
 
+/*
+ * during dmtimer early init, when device model is not up yet and dmtimer
+ * devices are not yet registered, the initialization routine is unable
+ * to read clock sources supported by the dmtimers using clk_get() because
+ * it searches the list using device names. this problem is overcome by
+ * assigning timer device names to the .init_name field.
+ */
+static struct omap_device timer1_init_name = {
+	.pdev = {
+		.dev = { .init_name = "dmtimer.0" },
+	},
+};
+
+static struct omap_device timer2_init_name = {
+	.pdev = {
+		.dev = { .init_name = "dmtimer.1" },
+	},
+};
+
+static struct omap_device timer3_init_name = {
+	.pdev = {
+		.dev = { .init_name = "dmtimer.2" },
+	},
+};
+
+static struct omap_device timer4_init_name = {
+	.pdev = {
+		.dev = { .init_name = "dmtimer.3" },
+	},
+};
+
+static struct omap_device timer5_init_name = {
+	.pdev = {
+		.dev = { .init_name = "dmtimer.4" },
+	},
+};
+
+static struct omap_device timer6_init_name = {
+	.pdev = {
+		.dev = { .init_name = "dmtimer.5" },
+	},
+};
+
+static struct omap_device timer7_init_name = {
+	.pdev = {
+		.dev = { .init_name = "dmtimer.6" },
+	},
+};
+
+static struct omap_device timer8_init_name = {
+	.pdev = {
+		.dev = { .init_name = "dmtimer.7" },
+	},
+};
+
+static struct omap_device timer9_init_name = {
+	.pdev = {
+		.dev = { .init_name = "dmtimer.8" },
+	},
+};
+
+static struct omap_device timer10_init_name = {
+	.pdev = {
+		.dev = { .init_name = "dmtimer.9" },
+	},
+};
+
+static struct omap_device timer11_init_name = {
+	.pdev = {
+		.dev = { .init_name = "dmtimer.10" },
+	},
+};
+
+static struct omap_device timer12_init_name = {
+	.pdev = {
+		.dev = { .init_name = "dmtimer.11" },
+	},
+};
+
 /* timer1 */
 static struct omap_hwmod omap2420_timer1_hwmod;
 static struct omap_hwmod_irq_info omap2420_timer1_mpu_irqs[] = {
@@ -223,6 +302,7 @@  static struct omap_hwmod omap2420_timer1_hwmod = {
 	.slaves		= omap2420_timer1_slaves,
 	.slaves_cnt	= ARRAY_SIZE(omap2420_timer1_slaves),
 	.class		= &omap2420_timer_hwmod_class,
+	.od		= &timer1_init_name,
 	.omap_chip	= OMAP_CHIP_INIT(CHIP_IS_OMAP2420)
 };
 
@@ -272,6 +352,7 @@  static struct omap_hwmod omap2420_timer2_hwmod = {
 	.slaves		= omap2420_timer2_slaves,
 	.slaves_cnt	= ARRAY_SIZE(omap2420_timer2_slaves),
 	.class		= &omap2420_timer_hwmod_class,
+	.od		= &timer2_init_name,
 	.omap_chip	= OMAP_CHIP_INIT(CHIP_IS_OMAP2420)
 };
 
@@ -321,6 +402,7 @@  static struct omap_hwmod omap2420_timer3_hwmod = {
 	.slaves		= omap2420_timer3_slaves,
 	.slaves_cnt	= ARRAY_SIZE(omap2420_timer3_slaves),
 	.class		= &omap2420_timer_hwmod_class,
+	.od		= &timer3_init_name,
 	.omap_chip	= OMAP_CHIP_INIT(CHIP_IS_OMAP2420)
 };
 
@@ -368,6 +450,7 @@  static struct omap_hwmod omap2420_timer4_hwmod = {
 	.slaves		= omap2420_timer4_slaves,
 	.slaves_cnt	= ARRAY_SIZE(omap2420_timer4_slaves),
 	.class		= &omap2420_timer_hwmod_class,
+	.od		= &timer4_init_name,
 	.omap_chip	= OMAP_CHIP_INIT(CHIP_IS_OMAP2420)
 };
 
@@ -417,6 +500,7 @@  static struct omap_hwmod omap2420_timer5_hwmod = {
 	.slaves		= omap2420_timer5_slaves,
 	.slaves_cnt	= ARRAY_SIZE(omap2420_timer5_slaves),
 	.class		= &omap2420_timer_hwmod_class,
+	.od		= &timer5_init_name,
 	.omap_chip	= OMAP_CHIP_INIT(CHIP_IS_OMAP2420)
 };
 
@@ -466,6 +550,7 @@  static struct omap_hwmod omap2420_timer6_hwmod = {
 	.slaves		= omap2420_timer6_slaves,
 	.slaves_cnt	= ARRAY_SIZE(omap2420_timer6_slaves),
 	.class		= &omap2420_timer_hwmod_class,
+	.od		= &timer6_init_name,
 	.omap_chip	= OMAP_CHIP_INIT(CHIP_IS_OMAP2420)
 };
 
@@ -514,6 +599,7 @@  static struct omap_hwmod omap2420_timer7_hwmod = {
 	.slaves		= omap2420_timer7_slaves,
 	.slaves_cnt	= ARRAY_SIZE(omap2420_timer7_slaves),
 	.class		= &omap2420_timer_hwmod_class,
+	.od		= &timer7_init_name,
 	.omap_chip	= OMAP_CHIP_INIT(CHIP_IS_OMAP2420)
 };
 
@@ -562,6 +648,7 @@  static struct omap_hwmod omap2420_timer8_hwmod = {
 	.slaves		= omap2420_timer8_slaves,
 	.slaves_cnt	= ARRAY_SIZE(omap2420_timer8_slaves),
 	.class		= &omap2420_timer_hwmod_class,
+	.od		= &timer8_init_name,
 	.omap_chip	= OMAP_CHIP_INIT(CHIP_IS_OMAP2420)
 };
 
@@ -610,6 +697,7 @@  static struct omap_hwmod omap2420_timer9_hwmod = {
 	.slaves		= omap2420_timer9_slaves,
 	.slaves_cnt	= ARRAY_SIZE(omap2420_timer9_slaves),
 	.class		= &omap2420_timer_hwmod_class,
+	.od		= &timer9_init_name,
 	.omap_chip	= OMAP_CHIP_INIT(CHIP_IS_OMAP2420)
 };
 
@@ -658,6 +746,7 @@  static struct omap_hwmod omap2420_timer10_hwmod = {
 	.slaves		= omap2420_timer10_slaves,
 	.slaves_cnt	= ARRAY_SIZE(omap2420_timer10_slaves),
 	.class		= &omap2420_timer_hwmod_class,
+	.od		= &timer10_init_name,
 	.omap_chip	= OMAP_CHIP_INIT(CHIP_IS_OMAP2420)
 };
 
@@ -706,6 +795,7 @@  static struct omap_hwmod omap2420_timer11_hwmod = {
 	.slaves		= omap2420_timer11_slaves,
 	.slaves_cnt	= ARRAY_SIZE(omap2420_timer11_slaves),
 	.class		= &omap2420_timer_hwmod_class,
+	.od		= &timer11_init_name,
 	.omap_chip	= OMAP_CHIP_INIT(CHIP_IS_OMAP2420)
 };
 
@@ -754,6 +844,7 @@  static struct omap_hwmod omap2420_timer12_hwmod = {
 	.slaves		= omap2420_timer12_slaves,
 	.slaves_cnt	= ARRAY_SIZE(omap2420_timer12_slaves),
 	.class		= &omap2420_timer_hwmod_class,
+	.od		= &timer12_init_name,
 	.omap_chip	= OMAP_CHIP_INIT(CHIP_IS_OMAP2420)
 };
 
diff --git a/arch/arm/mach-omap2/omap_hwmod_2430_data.c b/arch/arm/mach-omap2/omap_hwmod_2430_data.c
index 787d3ce..2ac463f 100644
--- a/arch/arm/mach-omap2/omap_hwmod_2430_data.c
+++ b/arch/arm/mach-omap2/omap_hwmod_2430_data.c
@@ -183,6 +183,85 @@  static struct omap_hwmod_class omap2430_timer_hwmod_class = {
 	.rev = OMAP_TIMER_IP_VERSION_1,
 };
 
+/*
+ * during dmtimer early init, when device model is not up yet and dmtimer
+ * devices are not yet registered, the initialization routine is unable
+ * to read clock sources supported by the dmtimers using clk_get() because
+ * it searches the list using device names. this problem is overcome by
+ * assigning timer device names to the .init_name field.
+ */
+static struct omap_device timer1_init_name = {
+	.pdev = {
+		.dev = { .init_name = "dmtimer.0" },
+	},
+};
+
+static struct omap_device timer2_init_name = {
+	.pdev = {
+		.dev = { .init_name = "dmtimer.1" },
+	},
+};
+
+static struct omap_device timer3_init_name = {
+	.pdev = {
+		.dev = { .init_name = "dmtimer.2" },
+	},
+};
+
+static struct omap_device timer4_init_name = {
+	.pdev = {
+		.dev = { .init_name = "dmtimer.3" },
+	},
+};
+
+static struct omap_device timer5_init_name = {
+	.pdev = {
+		.dev = { .init_name = "dmtimer.4" },
+	},
+};
+
+
+static struct omap_device timer6_init_name = {
+	.pdev = {
+		.dev = { .init_name = "dmtimer.5" },
+	},
+};
+
+static struct omap_device timer7_init_name = {
+	.pdev = {
+		.dev = { .init_name = "dmtimer.6" },
+	},
+};
+
+static struct omap_device timer8_init_name = {
+	.pdev = {
+		.dev = { .init_name = "dmtimer.7" },
+	},
+};
+
+static struct omap_device timer9_init_name = {
+	.pdev = {
+		.dev = { .init_name = "dmtimer.8" },
+	},
+};
+
+static struct omap_device timer10_init_name = {
+	.pdev = {
+		.dev = { .init_name = "dmtimer.9" },
+	},
+};
+
+static struct omap_device timer11_init_name = {
+	.pdev = {
+		.dev = { .init_name = "dmtimer.10" },
+	},
+};
+
+static struct omap_device timer12_init_name = {
+	.pdev = {
+		.dev = { .init_name = "dmtimer.11" },
+	},
+};
 
 /* timer1 */
 static struct omap_hwmod omap2430_timer1_hwmod;
@@ -232,6 +311,7 @@  static struct omap_hwmod omap2430_timer1_hwmod = {
 	.slaves		= omap2430_timer1_slaves,
 	.slaves_cnt	= ARRAY_SIZE(omap2430_timer1_slaves),
 	.class		= &omap2430_timer_hwmod_class,
+	.od		= &timer1_init_name,
 	.omap_chip	= OMAP_CHIP_INIT(CHIP_IS_OMAP2430)
 };
 
@@ -281,6 +361,7 @@  static struct omap_hwmod omap2430_timer2_hwmod = {
 	.slaves		= omap2430_timer2_slaves,
 	.slaves_cnt	= ARRAY_SIZE(omap2430_timer2_slaves),
 	.class		= &omap2430_timer_hwmod_class,
+	.od		= &timer2_init_name,
 	.omap_chip	= OMAP_CHIP_INIT(CHIP_IS_OMAP2430)
 };
 
@@ -328,6 +409,7 @@  static struct omap_hwmod omap2430_timer3_hwmod = {
 	.slaves		= omap2430_timer3_slaves,
 	.slaves_cnt	= ARRAY_SIZE(omap2430_timer3_slaves),
 	.class		= &omap2430_timer_hwmod_class,
+	.od		= &timer3_init_name,
 	.omap_chip	= OMAP_CHIP_INIT(CHIP_IS_OMAP2430)
 };
 
@@ -377,6 +459,7 @@  static struct omap_hwmod omap2430_timer4_hwmod = {
 	.slaves		= omap2430_timer4_slaves,
 	.slaves_cnt	= ARRAY_SIZE(omap2430_timer4_slaves),
 	.class		= &omap2430_timer_hwmod_class,
+	.od		= &timer4_init_name,
 	.omap_chip	= OMAP_CHIP_INIT(CHIP_IS_OMAP2430)
 };
 
@@ -424,6 +507,7 @@  static struct omap_hwmod omap2430_timer5_hwmod = {
 	.slaves		= omap2430_timer5_slaves,
 	.slaves_cnt	= ARRAY_SIZE(omap2430_timer5_slaves),
 	.class		= &omap2430_timer_hwmod_class,
+	.od		= &timer5_init_name,
 	.omap_chip	= OMAP_CHIP_INIT(CHIP_IS_OMAP2430)
 };
 
@@ -472,6 +556,7 @@  static struct omap_hwmod omap2430_timer6_hwmod = {
 	.slaves		= omap2430_timer6_slaves,
 	.slaves_cnt	= ARRAY_SIZE(omap2430_timer6_slaves),
 	.class		= &omap2430_timer_hwmod_class,
+	.od		= &timer6_init_name,
 	.omap_chip	= OMAP_CHIP_INIT(CHIP_IS_OMAP2430)
 };
 
@@ -520,6 +605,7 @@  static struct omap_hwmod omap2430_timer7_hwmod = {
 	.slaves		= omap2430_timer7_slaves,
 	.slaves_cnt	= ARRAY_SIZE(omap2430_timer7_slaves),
 	.class		= &omap2430_timer_hwmod_class,
+	.od		= &timer7_init_name,
 	.omap_chip	= OMAP_CHIP_INIT(CHIP_IS_OMAP2430)
 };
 
@@ -567,6 +653,7 @@  static struct omap_hwmod omap2430_timer8_hwmod = {
 	.slaves		= omap2430_timer8_slaves,
 	.slaves_cnt	= ARRAY_SIZE(omap2430_timer8_slaves),
 	.class		= &omap2430_timer_hwmod_class,
+	.od		= &timer8_init_name,
 	.omap_chip	= OMAP_CHIP_INIT(CHIP_IS_OMAP2430)
 };
 
@@ -615,6 +702,7 @@  static struct omap_hwmod omap2430_timer9_hwmod = {
 	.slaves		= omap2430_timer9_slaves,
 	.slaves_cnt	= ARRAY_SIZE(omap2430_timer9_slaves),
 	.class		= &omap2430_timer_hwmod_class,
+	.od		= &timer9_init_name,
 	.omap_chip	= OMAP_CHIP_INIT(CHIP_IS_OMAP2430)
 };
 
@@ -662,6 +750,7 @@  static struct omap_hwmod omap2430_timer10_hwmod = {
 	.slaves		= omap2430_timer10_slaves,
 	.slaves_cnt	= ARRAY_SIZE(omap2430_timer10_slaves),
 	.class		= &omap2430_timer_hwmod_class,
+	.od		= &timer10_init_name,
 	.omap_chip	= OMAP_CHIP_INIT(CHIP_IS_OMAP2430)
 };
 
@@ -709,6 +798,7 @@  static struct omap_hwmod omap2430_timer11_hwmod = {
 	.slaves		= omap2430_timer11_slaves,
 	.slaves_cnt	= ARRAY_SIZE(omap2430_timer11_slaves),
 	.class		= &omap2430_timer_hwmod_class,
+	.od		= &timer11_init_name,
 	.omap_chip	= OMAP_CHIP_INIT(CHIP_IS_OMAP2430)
 };
 
@@ -757,6 +847,7 @@  static struct omap_hwmod omap2430_timer12_hwmod = {
 	.slaves		= omap2430_timer12_slaves,
 	.slaves_cnt	= ARRAY_SIZE(omap2430_timer12_slaves),
 	.class		= &omap2430_timer_hwmod_class,
+	.od		= &timer12_init_name,
 	.omap_chip	= OMAP_CHIP_INIT(CHIP_IS_OMAP2430)
 };
 
diff --git a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c
index 4765cda..1ce40e0 100644
--- a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c
+++ b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c
@@ -151,7 +151,7 @@  static struct omap_hwmod_class_sysconfig omap3xxx_timer_1ms_sysc = {
 };
 
 static struct omap_hwmod_class omap3xxx_timer_1ms_hwmod_class = {
-	.name = "timer_1ms",
+	.name = "timer",
 	.sysc = &omap3xxx_timer_1ms_sysc,
 	.rev = OMAP_TIMER_IP_VERSION_1,
 };
@@ -180,6 +180,79 @@  static struct omap_hwmod_class omap3xxx_timer_hwmod_class = {
 	.rev =  OMAP_TIMER_IP_VERSION_1,
 };
 
+/*
+ * during dmtimer early init, when device model is not up yet and dmtimer
+ * devices are not yet registered, the initialization routine is unable
+ * to read clock sources supported by the dmtimers using clk_get() because
+ * it searches the list using device names. this problem is overcome by
+ * assigning timer device names to the .init_name field.
+ */
+static struct omap_device timer1_init_name = {
+	.pdev = {
+		.dev = { .init_name = "dmtimer.0" },
+	},
+};
+
+static struct omap_device timer2_init_name = {
+	.pdev = {
+		.dev = { .init_name = "dmtimer.1" },
+	},
+};
+
+static struct omap_device timer3_init_name = {
+	.pdev = {
+		.dev = { .init_name = "dmtimer.2" },
+	},
+};
+
+static struct omap_device timer4_init_name = {
+	.pdev = {
+		.dev = { .init_name = "dmtimer.3" },
+	},
+};
+
+static struct omap_device timer5_init_name = {
+	.pdev = {
+		.dev = { .init_name = "dmtimer.4" },
+	},
+};
+
+
+static struct omap_device timer6_init_name = {
+	.pdev = {
+		.dev = { .init_name = "dmtimer.5" },
+	},
+};
+
+static struct omap_device timer7_init_name = {
+	.pdev = {
+		.dev = { .init_name = "dmtimer.6" },
+	},
+};
+
+static struct omap_device timer8_init_name = {
+	.pdev = {
+		.dev = { .init_name = "dmtimer.7" },
+	},
+};
+
+static struct omap_device timer9_init_name = {
+	.pdev = {
+		.dev = { .init_name = "dmtimer.8" },
+	},
+};
+
+static struct omap_device timer10_init_name = {
+	.pdev = {
+		.dev = { .init_name = "dmtimer.9" },
+	},
+};
+
+static struct omap_device timer11_init_name = {
+	.pdev = {
+		.dev = { .init_name = "dmtimer.10" },
+	},
+};
 
 /* timer10 */
 static struct omap_hwmod omap3xxx_timer10_hwmod;
@@ -236,6 +309,7 @@  static struct omap_hwmod omap3xxx_timer10_hwmod = {
 	.slaves		= omap3xxx_timer10_slaves,
 	.slaves_cnt	= ARRAY_SIZE(omap3xxx_timer10_slaves),
 	.class		= &omap3xxx_timer_1ms_hwmod_class,
+	.od		= &timer10_init_name,
 	.omap_chip	= OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
 };
 
@@ -294,6 +368,7 @@  static struct omap_hwmod omap3xxx_timer11_hwmod = {
 	.slaves		= omap3xxx_timer11_slaves,
 	.slaves_cnt	= ARRAY_SIZE(omap3xxx_timer11_slaves),
 	.class		= &omap3xxx_timer_hwmod_class,
+	.od		= &timer11_init_name,
 	.omap_chip	= OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
 };
 
@@ -364,6 +439,7 @@  static struct omap_hwmod omap3xxx_timer2_hwmod = {
 	.slaves		= omap3xxx_timer2_slaves,
 	.slaves_cnt	= ARRAY_SIZE(omap3xxx_timer2_slaves),
 	.class		= &omap3xxx_timer_1ms_hwmod_class,
+	.od		= &timer2_init_name,
 	.omap_chip	= OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
 };
 
@@ -422,6 +498,7 @@  static struct omap_hwmod omap3xxx_timer3_hwmod = {
 	.slaves		= omap3xxx_timer3_slaves,
 	.slaves_cnt	= ARRAY_SIZE(omap3xxx_timer3_slaves),
 	.class		= &omap3xxx_timer_hwmod_class,
+	.od		= &timer3_init_name,
 	.omap_chip	= OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
 };
 
@@ -480,6 +557,7 @@  static struct omap_hwmod omap3xxx_timer4_hwmod = {
 	.slaves		= omap3xxx_timer4_slaves,
 	.slaves_cnt	= ARRAY_SIZE(omap3xxx_timer4_slaves),
 	.class		= &omap3xxx_timer_hwmod_class,
+	.od		= &timer4_init_name,
 	.omap_chip	= OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
 };
 
@@ -538,6 +616,7 @@  static struct omap_hwmod omap3xxx_timer5_hwmod = {
 	.slaves		= omap3xxx_timer5_slaves,
 	.slaves_cnt	= ARRAY_SIZE(omap3xxx_timer5_slaves),
 	.class		= &omap3xxx_timer_hwmod_class,
+	.od		= &timer5_init_name,
 	.omap_chip	= OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
 };
 
@@ -595,6 +674,7 @@  static struct omap_hwmod omap3xxx_timer6_hwmod = {
 	.slaves		= omap3xxx_timer6_slaves,
 	.slaves_cnt	= ARRAY_SIZE(omap3xxx_timer6_slaves),
 	.class		= &omap3xxx_timer_hwmod_class,
+	.od		= &timer6_init_name,
 	.omap_chip	= OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
 };
 
@@ -653,6 +733,7 @@  static struct omap_hwmod omap3xxx_timer7_hwmod = {
 	.slaves		= omap3xxx_timer7_slaves,
 	.slaves_cnt	= ARRAY_SIZE(omap3xxx_timer7_slaves),
 	.class		= &omap3xxx_timer_hwmod_class,
+	.od		= &timer7_init_name,
 	.omap_chip	= OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
 };
 
@@ -711,6 +792,7 @@  static struct omap_hwmod omap3xxx_timer8_hwmod = {
 	.slaves		= omap3xxx_timer8_slaves,
 	.slaves_cnt	= ARRAY_SIZE(omap3xxx_timer8_slaves),
 	.class		= &omap3xxx_timer_hwmod_class,
+	.od		= &timer8_init_name,
 	.omap_chip	= OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
 };
 
@@ -770,6 +852,7 @@  static struct omap_hwmod omap3xxx_timer9_hwmod = {
 	.slaves		= omap3xxx_timer9_slaves,
 	.slaves_cnt	= ARRAY_SIZE(omap3xxx_timer9_slaves),
 	.class		= &omap3xxx_timer_hwmod_class,
+	.od		= &timer9_init_name,
 	.omap_chip	= OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
 };
 
@@ -849,6 +932,7 @@  static struct omap_hwmod omap3xxx_timer1_hwmod = {
 	.slaves		= omap3xxx_timer1_slaves,
 	.slaves_cnt	= ARRAY_SIZE(omap3xxx_timer1_slaves),
 	.class		= &omap3xxx_timer_1ms_hwmod_class,
+	.od		= &timer1_init_name,
 	.omap_chip	= OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
 };
 
diff --git a/arch/arm/mach-omap2/omap_hwmod_44xx_data.c b/arch/arm/mach-omap2/omap_hwmod_44xx_data.c
index 0390270..9edc518 100644
--- a/arch/arm/mach-omap2/omap_hwmod_44xx_data.c
+++ b/arch/arm/mach-omap2/omap_hwmod_44xx_data.c
@@ -549,7 +549,7 @@  static struct omap_hwmod_class_sysconfig omap44xx_timer_1ms_sysc = {
  * belongs the .name field is assigned a uniform name 'timer'.
  */
 static struct omap_hwmod_class omap44xx_timer_1ms_hwmod_class = {
-	.name = "timer_1ms",
+	.name = "timer",
 	.sysc = &omap44xx_timer_1ms_sysc,
 	.rev = OMAP_TIMER_IP_VERSION_1,
 };
@@ -569,6 +569,79 @@  static struct omap_hwmod_class omap44xx_timer_hwmod_class = {
 	.rev = OMAP_TIMER_IP_VERSION_2,
 };
 
+/*
+ * during dmtimer early init, when device model is not up yet and dmtimer
+ * devices are not yet registered, the initialization routine is unable
+ * to read clock sources supported by the dmtimers using clk_get() because
+ * it searches the list using device names. this problem is overcome by
+ * assigning timer device names to the .init_name field.
+ */
+static struct omap_device timer1_init_name = {
+	.pdev = {
+		.dev = { .init_name = "dmtimer.0" },
+	},
+};
+
+static struct omap_device timer2_init_name = {
+	.pdev = {
+		.dev = { .init_name = "dmtimer.1" },
+	},
+};
+
+static struct omap_device timer3_init_name = {
+	.pdev = {
+		.dev = { .init_name = "dmtimer.2" },
+	},
+};
+
+static struct omap_device timer4_init_name = {
+	.pdev = {
+		.dev = { .init_name = "dmtimer.3" },
+	},
+};
+
+static struct omap_device timer5_init_name = {
+	.pdev = {
+		.dev = { .init_name = "dmtimer.4" },
+	},
+};
+
+static struct omap_device timer6_init_name = {
+	.pdev = {
+		.dev = { .init_name = "dmtimer.5" },
+	},
+};
+
+static struct omap_device timer7_init_name = {
+	.pdev = {
+		.dev = { .init_name = "dmtimer.6" },
+	},
+};
+
+static struct omap_device timer8_init_name = {
+	.pdev = {
+		.dev = { .init_name = "dmtimer.7" },
+	},
+};
+
+static struct omap_device timer9_init_name = {
+	.pdev = {
+		.dev = { .init_name = "dmtimer.8" },
+	},
+};
+
+static struct omap_device timer10_init_name = {
+	.pdev = {
+		.dev = { .init_name = "dmtimer.9" },
+	},
+};
+
+static struct omap_device timer11_init_name = {
+	.pdev = {
+		.dev = { .init_name = "dmtimer.10" },
+	},
+};
+
 /* timer1 */
 static struct omap_hwmod omap44xx_timer1_hwmod;
 static struct omap_hwmod_irq_info omap44xx_timer1_irqs[] = {
@@ -601,6 +674,7 @@  static struct omap_hwmod_ocp_if *omap44xx_timer1_slaves[] = {
 static struct omap_hwmod omap44xx_timer1_hwmod = {
 	.name		= "timer1",
 	.class		= &omap44xx_timer_1ms_hwmod_class,
+	.od		= &timer1_init_name,
 	.mpu_irqs	= omap44xx_timer1_irqs,
 	.mpu_irqs_cnt	= ARRAY_SIZE(omap44xx_timer1_irqs),
 	.main_clk	= "timer1_fck",
@@ -647,6 +721,7 @@  static struct omap_hwmod_ocp_if *omap44xx_timer2_slaves[] = {
 static struct omap_hwmod omap44xx_timer2_hwmod = {
 	.name		= "timer2",
 	.class		= &omap44xx_timer_1ms_hwmod_class,
+	.od		= &timer2_init_name,
 	.mpu_irqs	= omap44xx_timer2_irqs,
 	.mpu_irqs_cnt	= ARRAY_SIZE(omap44xx_timer2_irqs),
 	.main_clk	= "timer2_fck",
@@ -693,6 +768,7 @@  static struct omap_hwmod_ocp_if *omap44xx_timer3_slaves[] = {
 static struct omap_hwmod omap44xx_timer3_hwmod = {
 	.name		= "timer3",
 	.class		= &omap44xx_timer_hwmod_class,
+	.od		= &timer3_init_name,
 	.mpu_irqs	= omap44xx_timer3_irqs,
 	.mpu_irqs_cnt	= ARRAY_SIZE(omap44xx_timer3_irqs),
 	.main_clk	= "timer3_fck",
@@ -739,6 +815,7 @@  static struct omap_hwmod_ocp_if *omap44xx_timer4_slaves[] = {
 static struct omap_hwmod omap44xx_timer4_hwmod = {
 	.name		= "timer4",
 	.class		= &omap44xx_timer_hwmod_class,
+	.od		= &timer4_init_name,
 	.mpu_irqs	= omap44xx_timer4_irqs,
 	.mpu_irqs_cnt	= ARRAY_SIZE(omap44xx_timer4_irqs),
 	.main_clk	= "timer4_fck",
@@ -804,6 +881,7 @@  static struct omap_hwmod_ocp_if *omap44xx_timer5_slaves[] = {
 static struct omap_hwmod omap44xx_timer5_hwmod = {
 	.name		= "timer5",
 	.class		= &omap44xx_timer_hwmod_class,
+	.od		= &timer5_init_name,
 	.mpu_irqs	= omap44xx_timer5_irqs,
 	.mpu_irqs_cnt	= ARRAY_SIZE(omap44xx_timer5_irqs),
 	.main_clk	= "timer5_fck",
@@ -869,6 +947,7 @@  static struct omap_hwmod_ocp_if *omap44xx_timer6_slaves[] = {
 static struct omap_hwmod omap44xx_timer6_hwmod = {
 	.name		= "timer6",
 	.class		= &omap44xx_timer_hwmod_class,
+	.od		= &timer6_init_name,
 	.mpu_irqs	= omap44xx_timer6_irqs,
 	.mpu_irqs_cnt	= ARRAY_SIZE(omap44xx_timer6_irqs),
 	.main_clk	= "timer6_fck",
@@ -934,6 +1013,7 @@  static struct omap_hwmod_ocp_if *omap44xx_timer7_slaves[] = {
 static struct omap_hwmod omap44xx_timer7_hwmod = {
 	.name		= "timer7",
 	.class		= &omap44xx_timer_hwmod_class,
+	.od		= &timer7_init_name,
 	.mpu_irqs	= omap44xx_timer7_irqs,
 	.mpu_irqs_cnt	= ARRAY_SIZE(omap44xx_timer7_irqs),
 	.main_clk	= "timer7_fck",
@@ -999,6 +1079,7 @@  static struct omap_hwmod_ocp_if *omap44xx_timer8_slaves[] = {
 static struct omap_hwmod omap44xx_timer8_hwmod = {
 	.name		= "timer8",
 	.class		= &omap44xx_timer_hwmod_class,
+	.od		= &timer8_init_name,
 	.mpu_irqs	= omap44xx_timer8_irqs,
 	.mpu_irqs_cnt	= ARRAY_SIZE(omap44xx_timer8_irqs),
 	.main_clk	= "timer8_fck",
@@ -1045,6 +1126,7 @@  static struct omap_hwmod_ocp_if *omap44xx_timer9_slaves[] = {
 static struct omap_hwmod omap44xx_timer9_hwmod = {
 	.name		= "timer9",
 	.class		= &omap44xx_timer_hwmod_class,
+	.od		= &timer9_init_name,
 	.mpu_irqs	= omap44xx_timer9_irqs,
 	.mpu_irqs_cnt	= ARRAY_SIZE(omap44xx_timer9_irqs),
 	.main_clk	= "timer9_fck",
@@ -1091,6 +1173,7 @@  static struct omap_hwmod_ocp_if *omap44xx_timer10_slaves[] = {
 static struct omap_hwmod omap44xx_timer10_hwmod = {
 	.name		= "timer10",
 	.class		= &omap44xx_timer_1ms_hwmod_class,
+	.od		= &timer10_init_name,
 	.mpu_irqs	= omap44xx_timer10_irqs,
 	.mpu_irqs_cnt	= ARRAY_SIZE(omap44xx_timer10_irqs),
 	.main_clk	= "timer10_fck",
@@ -1137,6 +1220,7 @@  static struct omap_hwmod_ocp_if *omap44xx_timer11_slaves[] = {
 static struct omap_hwmod omap44xx_timer11_hwmod = {
 	.name		= "timer11",
 	.class		= &omap44xx_timer_hwmod_class,
+	.od		= &timer11_init_name,
 	.mpu_irqs	= omap44xx_timer11_irqs,
 	.mpu_irqs_cnt	= ARRAY_SIZE(omap44xx_timer11_irqs),
 	.main_clk	= "timer11_fck",