From patchwork Tue Sep 21 08:54:46 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tarun Kanti DebBarma X-Patchwork-Id: 195862 X-Patchwork-Delegate: khilman@deeprootsystems.com Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter1.kernel.org (8.14.4/8.14.3) with ESMTP id o8KLsGl6010459 for ; Mon, 20 Sep 2010 21:54:16 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757887Ab0ITVxy (ORCPT ); Mon, 20 Sep 2010 17:53:54 -0400 Received: from bear.ext.ti.com ([192.94.94.41]:48435 "EHLO bear.ext.ti.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754842Ab0ITVxy (ORCPT ); Mon, 20 Sep 2010 17:53:54 -0400 Received: from dbdp31.itg.ti.com ([172.24.170.98]) by bear.ext.ti.com (8.13.7/8.13.7) with ESMTP id o8KLrm3l000659 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Mon, 20 Sep 2010 16:53:50 -0500 Received: from localhost.localdomain (localhost [127.0.0.1]) by dbdp31.itg.ti.com (8.13.8/8.13.8) with ESMTP id o8KLrkTL017930; Tue, 21 Sep 2010 03:23:46 +0530 (IST) From: Tarun Kanti DebBarma To: linux-omap@vger.kernel.org Cc: Tarun Kanti DebBarma , "Cousson, Benoit" , Paul Walmsley , Kevin Hilman , Tony Lindgren Subject: [PATCHv3 11/17] dmtimer: early boot infrastructure Date: Tue, 21 Sep 2010 14:24:46 +0530 Message-Id: <1285059286-26566-1-git-send-email-tarun.kanti@ti.com> X-Mailer: git-send-email 1.6.0.4 Sender: linux-omap-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-omap@vger.kernel.org X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.3 (demeter1.kernel.org [140.211.167.41]); Mon, 20 Sep 2010 21:54:16 +0000 (UTC) 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",