ARM: OMAP2+: Allow kernel to boot even if GPMC fails to reserve memory
Currently, if the GPMC driver fails to reserve memory when probed we will call BUG() and the kernel will not boot. Instead of calling BUG(), return an error from probe and allow kernel to boot. Boot tested on AM335x beagle bone board and OMAP4430 Panda board. V2 changes: - Ensure that clock and memory resources are released on error. Signed-off-by: Jon Hunter <jon-hunter@ti.com> Signed-off-by: Tony Lindgren <tony@atomide.com>
This commit is contained in:
parent
64e29fd5ed
commit
8119024ef7
|
@ -868,9 +868,9 @@ static void __devexit gpmc_mem_exit(void)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __devinit gpmc_mem_init(void)
|
static int __devinit gpmc_mem_init(void)
|
||||||
{
|
{
|
||||||
int cs;
|
int cs, rc;
|
||||||
unsigned long boot_rom_space = 0;
|
unsigned long boot_rom_space = 0;
|
||||||
|
|
||||||
/* never allocate the first page, to facilitate bug detection;
|
/* never allocate the first page, to facilitate bug detection;
|
||||||
|
@ -890,13 +890,21 @@ static void __devinit gpmc_mem_init(void)
|
||||||
if (!gpmc_cs_mem_enabled(cs))
|
if (!gpmc_cs_mem_enabled(cs))
|
||||||
continue;
|
continue;
|
||||||
gpmc_cs_get_memconf(cs, &base, &size);
|
gpmc_cs_get_memconf(cs, &base, &size);
|
||||||
if (gpmc_cs_insert_mem(cs, base, size) < 0)
|
rc = gpmc_cs_insert_mem(cs, base, size);
|
||||||
BUG();
|
if (IS_ERR_VALUE(rc)) {
|
||||||
|
while (--cs >= 0)
|
||||||
|
if (gpmc_cs_mem_enabled(cs))
|
||||||
|
gpmc_cs_delete_mem(cs);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static __devinit int gpmc_probe(struct platform_device *pdev)
|
static __devinit int gpmc_probe(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
|
int rc;
|
||||||
u32 l;
|
u32 l;
|
||||||
struct resource *res;
|
struct resource *res;
|
||||||
|
|
||||||
|
@ -936,7 +944,13 @@ static __devinit int gpmc_probe(struct platform_device *pdev)
|
||||||
dev_info(gpmc_dev, "GPMC revision %d.%d\n", GPMC_REVISION_MAJOR(l),
|
dev_info(gpmc_dev, "GPMC revision %d.%d\n", GPMC_REVISION_MAJOR(l),
|
||||||
GPMC_REVISION_MINOR(l));
|
GPMC_REVISION_MINOR(l));
|
||||||
|
|
||||||
gpmc_mem_init();
|
rc = gpmc_mem_init();
|
||||||
|
if (IS_ERR_VALUE(rc)) {
|
||||||
|
clk_disable_unprepare(gpmc_l3_clk);
|
||||||
|
clk_put(gpmc_l3_clk);
|
||||||
|
dev_err(gpmc_dev, "failed to reserve memory\n");
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
if (IS_ERR_VALUE(gpmc_setup_irq()))
|
if (IS_ERR_VALUE(gpmc_setup_irq()))
|
||||||
dev_warn(gpmc_dev, "gpmc_setup_irq failed\n");
|
dev_warn(gpmc_dev, "gpmc_setup_irq failed\n");
|
||||||
|
|
Loading…
Reference in New Issue