>>-----Original Message----- >>From: Kevin Hilman [mailto:khilman@xxxxxxxxxxxxxxxxxxx] >>Sent: Thursday, June 17, 2010 5:47 AM >>To: linux-omap@xxxxxxxxxxxxxxx >>Cc: Menon, Nishanth; Gopinath, Thara; Cousson, Benoit >>Subject: [PATCH 05/12] OMAP: create omap_devices for MPU, DSP, L3 >> >>Create simple omap_devices for the main processors and busses. >> >>This is required to support the forth-coming device-based OPP >>approach, where OPPs are managed and tracked at the omap_device and >>hwmod level. >> >>Because these omap_devices are based on platform_devices, they cannot >>be created until the driver core has been initialized. Therefore, move >>the init of these into a device_initcall(). Also, OMAP PM init cannot >>be done until after this step as it depends on the OPP layer. >> >>Signed-off-by: Kevin Hilman <khilman@xxxxxxxxxxxxxxxxxxx> >>--- >> arch/arm/mach-omap2/devices.c | 2 + >> arch/arm/mach-omap2/io.c | 68 ++++++++++++++++++++++++++++-- >> arch/arm/plat-omap/include/plat/common.h | 4 ++ >> 3 files changed, 70 insertions(+), 4 deletions(-) >> >>diff --git a/arch/arm/mach-omap2/devices.c b/arch/arm/mach-omap2/devices.c >>index 03e6c9e..62920ac 100644 >>--- a/arch/arm/mach-omap2/devices.c >>+++ b/arch/arm/mach-omap2/devices.c >>@@ -15,6 +15,7 @@ >> #include <linux/platform_device.h> >> #include <linux/io.h> >> #include <linux/clk.h> >>+#include <linux/err.h> >> >> #include <mach/hardware.h> >> #include <mach/irqs.h> >>@@ -29,6 +30,7 @@ >> #include <mach/gpio.h> >> #include <plat/mmc.h> >> #include <plat/dma.h> >>+#include <plat/omap_device.h> >> >> #include "mux.h" >> >>diff --git a/arch/arm/mach-omap2/io.c b/arch/arm/mach-omap2/io.c >>index 78d37c0..12a2836 100644 >>--- a/arch/arm/mach-omap2/io.c >>+++ b/arch/arm/mach-omap2/io.c >>@@ -44,7 +44,7 @@ >> >> #include <plat/clockdomain.h> >> #include "clockdomains.h" >>-#include <plat/omap_hwmod.h> >>+#include <plat/omap_device.h> >> >> #include "omap3-opp.h" >> /* >>@@ -311,12 +311,71 @@ static int __init _omap2_init_reprogram_sdrc(void) >> return v; >> } >> >>-void __init omap2_init_common_hw(struct omap_sdrc_params *sdrc_cs0, >>- struct omap_sdrc_params *sdrc_cs1) >>+static struct omap_device_pm_latency *pm_lats; >>+ >>+static struct device *mpu_dev; /* FIXME: needs clean SMP support */ >>+static struct device *dsp_dev; >>+static struct device *l3_dev; >>+ >>+struct device *omap_get_mpu_device(void) >>+{ >>+ WARN_ON_ONCE(!mpu_dev); >>+ return mpu_dev; >>+} >>+ >>+struct device *omap_get_dsp_device(void) >>+{ >>+ WARN_ON_ONCE(!dsp_dev); >>+ return dsp_dev; >>+} >>+ >>+struct device *omap_get_l3_device(void) >> { >>+ WARN_ON_ONCE(!l3_dev); >>+ return l3_dev; >>+} >>+ >>+static int _init_omap_device(struct omap_hwmod *oh, void *user) >>+{ >>+ struct omap_device *od; >>+ const char *name = oh->name; >>+ struct device **new_dev = (struct device **)user; >>+ >>+ od = omap_device_build(name, 0, oh, NULL, 0, pm_lats, 0, false); >>+ if (WARN(IS_ERR(od), "Could not build omap_device for %s\n", name)) >>+ return -ENODEV; >>+ >>+ *new_dev = &od->pdev.dev; >>+ >>+ return 0; >>+} >>+ >>+/* >>+ * Build omap_devices for processors and bus. >>+ */ >>+static void omap_init_processor_devices(void) >>+{ >>+ omap_hwmod_for_each_by_class("mpu", _init_omap_device, &mpu_dev); >>+ omap_hwmod_for_each_by_class("dsp", _init_omap_device, &dsp_dev); >>+ omap_hwmod_for_each_by_class("l3", _init_omap_device, &l3_dev); >>+} >>+ >>+static int __init omap2_late_common_init(void) >>+{ >>+ omap_init_processor_devices(); >>+ >> /* initialize the opp table if board file has not done so */ >> omap3_pm_init_opp_table(); >> >>+ omap_pm_if_init(); >>+ >>+ return 0; >>+} >>+device_initcall(omap2_late_common_init); Hello Kevin, Any particular reason for making this a late init and not keeping this a part of init_common_hw? The reason is the board files also have an option of calling/ overriding omap3_pm_init_opp_table. This happens really early in init_irq. (Refer board_3430sdp.c). So if a board file calls into omap3_pm_init_opp_table, the opp initializations will happen before the omap_device pointers are build for mpu, iva and l3. So the dev pointers stored as part of dev_opp tables will be screwed up. My personal preference would be to call the omap_init_processor_devices just after hwmod_late_init. This will remove any race conditions as above. Regards Thara >>+ >>+void __init omap2_init_common_hw(struct omap_sdrc_params *sdrc_cs0, >>+ struct omap_sdrc_params *sdrc_cs1) >>+{ >> pwrdm_init(powerdomains_omap); >> clkdm_init(clockdomains_omap, clkdm_autodeps); >> if (cpu_is_omap242x()) >>@@ -325,6 +384,7 @@ void __init omap2_init_common_hw(struct omap_sdrc_params *sdrc_cs0, >> omap2430_hwmod_init(); >> else if (cpu_is_omap34xx()) >> omap3xxx_hwmod_init(); >>+ >> omap2_mux_init(); >> omap_pm_if_early_init(); >> >>@@ -342,7 +402,7 @@ void __init omap2_init_common_hw(struct omap_sdrc_params *sdrc_cs0, >> omap_serial_early_init(); >> if (cpu_is_omap24xx() || cpu_is_omap34xx()) /* FIXME: OMAP4 */ >> omap_hwmod_late_init(); >>- omap_pm_if_init(); >>+ >> if (cpu_is_omap24xx() || cpu_is_omap34xx()) { >> omap2_sdrc_init(sdrc_cs0, sdrc_cs1); >> _omap2_init_reprogram_sdrc(); >>diff --git a/arch/arm/plat-omap/include/plat/common.h b/arch/arm/plat-omap/include/plat/common.h >>index 5e4afbe..4ac08ca 100644 >>--- a/arch/arm/plat-omap/include/plat/common.h >>+++ b/arch/arm/plat-omap/include/plat/common.h >>@@ -89,4 +89,8 @@ void omap2_set_globals_uart(struct omap_globals *); >> } \ >> }) >> >>+struct device *omap_get_mpu_device(void); >>+struct device *omap_get_dsp_device(void); >>+struct device *omap_get_l3_device(void); >>+ >> #endif /* __ARCH_ARM_MACH_OMAP_COMMON_H */ >>-- >>1.7.0.2 -- 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