]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
3.12-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 25 Nov 2013 21:31:43 +0000 (13:31 -0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 25 Nov 2013 21:31:43 +0000 (13:31 -0800)
added patches:
arm-omap2-hwmod-check-for-module-address-space-during-init.patch

queue-3.12/arm-omap2-hwmod-check-for-module-address-space-during-init.patch [new file with mode: 0644]
queue-3.12/series

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 (file)
index 0000000..7cde79a
--- /dev/null
@@ -0,0 +1,123 @@
+From 6423d6df1440a8acfc2f375d7cbc4cd66c2e6910 Mon Sep 17 00:00:00 2001
+From: Suman Anna <s-anna@ti.com>
+Date: Tue, 8 Oct 2013 23:46:49 -0600
+Subject: ARM: OMAP2+: hwmod: check for module address space during init
+
+From: Suman Anna <s-anna@ti.com>
+
+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 <reg> 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 <s-anna@ti.com>
+Acked-by: Santosh Shilimkar <santosh.shilimkar@ti.com>
+Tested-by: Nishanth Menon <nm@ti.com>
+Acked-by: Tony Lindgren <tony@atomide.com>
+[paul@pwsan.com: use -ENXIO rather than -ENOMEM to indicate a missing address
+ space error; fixed checkpatch.pl problem]
+Signed-off-by: Paul Walmsley <paul@pwsan.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ 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) {
index c4f87c885bfab081384bdc12e0896466fb2dcb40..e5ac03645d825671982c1c90ac3aaa421a0d2e1f 100644 (file)
@@ -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