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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 9/21/2010 10:54 AM, DebBarma, Tarun Kanti wrote:
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. The advantage is
that there is one common set of routines for clock access routines for
early init and normal access.

This patch also modifies the name of millisecond timers (1,2,10) on
OMAP3 and OMAP4 from"timer_1ms" to "timer". This means all timers

typo

So here is the change that is mentioned already in the code 6 patches before... You don't have to split that in 2 patches. You can introduce the new name in the first hwmod data patch since that will not impact your code. Moreover that will avoid discrepancies between the comments in the code and the code.

now have common name. This is to allow any one of the available timers
as an early timer instead of restricting it just to millisecond timers.
The hwmod routine which searches by class name can now search and find
all timers for initialization and bind to device model during early init.

Signed-off-by: Tarun Kanti DebBarma<tarun.kanti@xxxxxx>
Cc: Cousson, Benoit<b-cousson@xxxxxx>
Cc: Paul Walmsley<paul@xxxxxxxxx>
Cc: Kevin Hilman<khilman@xxxxxxxxxxxxxxxxxxx>
Cc: Tony Lindgren<tony@xxxxxxxxxxx>
---
  arch/arm/mach-omap2/omap_hwmod_2420_data.c |   91 ++++++++++++++++++++++++++++
  arch/arm/mach-omap2/omap_hwmod_2430_data.c |   91 ++++++++++++++++++++++++++++
  arch/arm/mach-omap2/omap_hwmod_3xxx_data.c |   86 ++++++++++++++++++++++++++-
  arch/arm/mach-omap2/omap_hwmod_44xx_data.c |   86 ++++++++++++++++++++++++++-
  4 files changed, 352 insertions(+), 2 deletions(-)

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" },

And here is the reason why you added an include to omap_device.h 8 patches ago.

You should not do that, at all. hwmod is about SOC HW information only. It will be use by omap_device, but it does not have to know anything about the layer above it. Moreover, in that case, you can easily extract the device name using the hwmod name, so you can build these devices dynamically and only if needed at init time.

+       },
+};
+
+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,

And don't do that either... this is internal pointer populated during omap_device_build.
This is not HW related information at all.

That's enough for today, I'll try to finalize the review tomorrow.

Benoit

         .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",
--
1.6.0.4


--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Arm (vger)]     [ARM Kernel]     [ARM MSM]     [Linux Tegra]     [Linux WPAN Networking]     [Linux Wireless Networking]     [Maemo Users]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Trails]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux