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:
Родитель
64e29fd5ed
Коммит
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;
|
||||
|
||||
/* 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))
|
||||
continue;
|
||||
gpmc_cs_get_memconf(cs, &base, &size);
|
||||
if (gpmc_cs_insert_mem(cs, base, size) < 0)
|
||||
BUG();
|
||||
rc = gpmc_cs_insert_mem(cs, base, size);
|
||||
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)
|
||||
{
|
||||
int rc;
|
||||
u32 l;
|
||||
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),
|
||||
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()))
|
||||
dev_warn(gpmc_dev, "gpmc_setup_irq failed\n");
|
||||
|
|
Загрузка…
Ссылка в новой задаче