From: Greg Kroah-Hartman Date: Mon, 25 Nov 2013 21:31:43 +0000 (-0800) Subject: 3.12-stable patches X-Git-Tag: v3.11.10~39 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=49e1980faa2cb9edd9b06c65f891f07e8a724c91;p=thirdparty%2Fkernel%2Fstable-queue.git 3.12-stable patches added patches: arm-omap2-hwmod-check-for-module-address-space-during-init.patch --- diff --git a/queue-3.12/arm-omap2-hwmod-check-for-module-address-space-during-init.patch b/queue-3.12/arm-omap2-hwmod-check-for-module-address-space-during-init.patch new file mode 100644 index 00000000000..7cde79a0350 --- /dev/null +++ b/queue-3.12/arm-omap2-hwmod-check-for-module-address-space-during-init.patch @@ -0,0 +1,123 @@ +From 6423d6df1440a8acfc2f375d7cbc4cd66c2e6910 Mon Sep 17 00:00:00 2001 +From: Suman Anna +Date: Tue, 8 Oct 2013 23:46:49 -0600 +Subject: ARM: OMAP2+: hwmod: check for module address space during init + +From: Suman Anna + +commit 6423d6df1440a8acfc2f375d7cbc4cd66c2e6910 upstream. + +The hwmod init sequence involves initializing and idling all the +hwmods during bootup. If a module class has sysconfig, the init +sequence utilizes the module register base for performing any +sysc configuration. + +The module address space is being removed from hwmod database and +retrieved from the property of the corresponding DT node. +If a hwmod does not have its corresponding DT node defined and the +memory address space is not defined in the corresponding +omap_hwmod_ocp_if, then the module register target address space +would be NULL and any sysc programming would result in a NULL +pointer dereference and a kernel boot hang. + +Handle this scenario by checking for a valid module address space +during the _init of each hwmod, and leaving it in the registered +state if no module register address base is defined in either of +the hwmod data or the DT data. + +Signed-off-by: Suman Anna +Acked-by: Santosh Shilimkar +Tested-by: Nishanth Menon +Acked-by: Tony Lindgren +[paul@pwsan.com: use -ENXIO rather than -ENOMEM to indicate a missing address + space error; fixed checkpatch.pl problem] +Signed-off-by: Paul Walmsley +Signed-off-by: Greg Kroah-Hartman + +--- + arch/arm/mach-omap2/omap_hwmod.c | 29 +++++++++++++++++++---------- + 1 file changed, 19 insertions(+), 10 deletions(-) + +--- a/arch/arm/mach-omap2/omap_hwmod.c ++++ b/arch/arm/mach-omap2/omap_hwmod.c +@@ -2361,21 +2361,23 @@ static struct device_node *of_dev_hwmod_ + * Cache the virtual address used by the MPU to access this IP block's + * registers. This address is needed early so the OCP registers that + * are part of the device's address space can be ioremapped properly. +- * No return value. ++ * ++ * Returns 0 on success, -EINVAL if an invalid hwmod is passed, and ++ * -ENXIO on absent or invalid register target address space. + */ +-static void __init _init_mpu_rt_base(struct omap_hwmod *oh, void *data) ++static int __init _init_mpu_rt_base(struct omap_hwmod *oh, void *data) + { + struct omap_hwmod_addr_space *mem; + void __iomem *va_start = NULL; + struct device_node *np; + + if (!oh) +- return; ++ return -EINVAL; + + _save_mpu_port_index(oh); + + if (oh->_int_flags & _HWMOD_NO_MPU_PORT) +- return; ++ return -ENXIO; + + mem = _find_mpu_rt_addr_space(oh); + if (!mem) { +@@ -2384,7 +2386,7 @@ static void __init _init_mpu_rt_base(str + + /* Extract the IO space from device tree blob */ + if (!of_have_populated_dt()) +- return; ++ return -ENXIO; + + np = of_dev_hwmod_lookup(of_find_node_by_name(NULL, "ocp"), oh); + if (np) +@@ -2395,13 +2397,14 @@ static void __init _init_mpu_rt_base(str + + if (!va_start) { + pr_err("omap_hwmod: %s: Could not ioremap\n", oh->name); +- return; ++ return -ENXIO; + } + + pr_debug("omap_hwmod: %s: MPU register target at va %p\n", + oh->name, va_start); + + oh->_mpu_rt_va = va_start; ++ return 0; + } + + /** +@@ -2414,8 +2417,8 @@ static void __init _init_mpu_rt_base(str + * registered at this point. This is the first of two phases for + * hwmod initialization. Code called here does not touch any hardware + * registers, it simply prepares internal data structures. Returns 0 +- * upon success or if the hwmod isn't registered, or -EINVAL upon +- * failure. ++ * upon success or if the hwmod isn't registered or if the hwmod's ++ * address space is not defined, or -EINVAL upon failure. + */ + static int __init _init(struct omap_hwmod *oh, void *data) + { +@@ -2424,8 +2427,14 @@ static int __init _init(struct omap_hwmo + if (oh->_state != _HWMOD_STATE_REGISTERED) + return 0; + +- if (oh->class->sysc) +- _init_mpu_rt_base(oh, NULL); ++ if (oh->class->sysc) { ++ r = _init_mpu_rt_base(oh, NULL); ++ if (r < 0) { ++ WARN(1, "omap_hwmod: %s: doesn't have mpu register target base\n", ++ oh->name); ++ return 0; ++ } ++ } + + r = _init_clocks(oh, NULL); + if (r < 0) { diff --git a/queue-3.12/series b/queue-3.12/series index c4f87c885bf..e5ac03645d8 100644 --- a/queue-3.12/series +++ b/queue-3.12/series @@ -15,3 +15,4 @@ drm-shmobile-add-dependency-on-backlight_class_device.patch staging-ashmem-fix-ashmem_purge_all_caches-return-value.patch drm-nvc0-gr-fix-a-number-of-missing-explicit-array-terminators.patch thinkpad_acpi-fix-build-error-when-config_snd_max_cards-32.patch +arm-omap2-hwmod-check-for-module-address-space-during-init.patch