aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJon Hunter <jon-hunter@ti.com>2013-02-01 11:38:45 -0500
committerTony Lindgren <tony@atomide.com>2013-02-01 17:08:19 -0500
commit6797b4fe0e554ce71f47038fd929c9ca929a9f3c (patch)
tree726460b24c21c127d9155c8f1269833a60ce4811
parenta16723709cff6d69567024c28d32d1344f08cecf (diff)
ARM: OMAP2+: Prevent potential crash if GPMC probe fails
If the GPMC probe fails, devices that use the GPMC (such as ethernet chips, flash memories, etc) can still allocate a GPMC chip-select and register the device. On the OMAP2420 H4 board, this was causing the kernel to crash after the gpmc probe failed and the board attempted to start networking. Prevent this by marking all the chip-selects as reserved by default and only make them available for devices to request if the GPMC probe succeeds. Signed-off-by: Jon Hunter <jon-hunter@ti.com> Signed-off-by: Tony Lindgren <tony@atomide.com>
-rw-r--r--arch/arm/mach-omap2/gpmc.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/arch/arm/mach-omap2/gpmc.c b/arch/arm/mach-omap2/gpmc.c
index c6255f788ab2..0cf239231d36 100644
--- a/arch/arm/mach-omap2/gpmc.c
+++ b/arch/arm/mach-omap2/gpmc.c
@@ -150,7 +150,8 @@ static unsigned gpmc_irq_start;
150static struct resource gpmc_mem_root; 150static struct resource gpmc_mem_root;
151static struct resource gpmc_cs_mem[GPMC_CS_NUM]; 151static struct resource gpmc_cs_mem[GPMC_CS_NUM];
152static DEFINE_SPINLOCK(gpmc_mem_lock); 152static DEFINE_SPINLOCK(gpmc_mem_lock);
153static unsigned int gpmc_cs_map; /* flag for cs which are initialized */ 153/* Define chip-selects as reserved by default until probe completes */
154static unsigned int gpmc_cs_map = ((1 << GPMC_CS_NUM) - 1);
154static struct device *gpmc_dev; 155static struct device *gpmc_dev;
155static int gpmc_irq; 156static int gpmc_irq;
156static resource_size_t phys_base, mem_size; 157static resource_size_t phys_base, mem_size;
@@ -1123,6 +1124,9 @@ int gpmc_calc_timings(struct gpmc_timings *gpmc_t,
1123 /* TODO: remove, see function definition */ 1124 /* TODO: remove, see function definition */
1124 gpmc_convert_ps_to_ns(gpmc_t); 1125 gpmc_convert_ps_to_ns(gpmc_t);
1125 1126
1127 /* Now the GPMC is initialised, unreserve the chip-selects */
1128 gpmc_cs_map = 0;
1129
1126 return 0; 1130 return 0;
1127} 1131}
1128 1132