Commit 84b00f0e authored by Jon Hunter's avatar Jon Hunter

ARM: OMAP2+: Allow GPMC probe to complete even if CS mapping fails

When the GPMC driver is probed, we call gpmc_mem_init() to see which
chip-selects have already been configured and enabled by the boot-loader
and allocate space for them. If we fail to allocate space for one
chip-select, then we return failure from the probe and the GPMC driver
will not be available.

Rather than render the GPMC useless for all GPMC devices, if we fail to
allocate space for one chip-select print a warning and disable the
chip-select. This way other GPMC clients can still be used.

There is no downside to this approach, because all GPMC clients need to
request a chip-select before they can use the GPMC and on requesting a
chip-select, if memory has not already been reserved for the chip-select
then it will be.
Signed-off-by: default avatarJon Hunter <jon-hunter@ti.com>
Tested-by: default avatarEzequiel Garcia <ezequiel.garcia@free-electrons.com>
parent bf234397
...@@ -785,9 +785,9 @@ static void gpmc_mem_exit(void) ...@@ -785,9 +785,9 @@ static void gpmc_mem_exit(void)
} }
static int gpmc_mem_init(void) static void gpmc_mem_init(void)
{ {
int cs, rc; int cs;
/* /*
* The first 1MB of GPMC address space is typically mapped to * The first 1MB of GPMC address space is typically mapped to
...@@ -804,16 +804,12 @@ static int gpmc_mem_init(void) ...@@ -804,16 +804,12 @@ static int 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);
rc = gpmc_cs_insert_mem(cs, base, size); if (gpmc_cs_insert_mem(cs, base, size)) {
if (rc < 0) { pr_warn("%s: disabling cs %d mapped at 0x%x-0x%x\n",
while (--cs >= 0) __func__, cs, base, base + size);
if (gpmc_cs_mem_enabled(cs)) gpmc_cs_disable_mem(cs);
gpmc_cs_delete_mem(cs);
return rc;
} }
} }
return 0;
} }
static u32 gpmc_round_ps_to_sync_clk(u32 time_ps, u32 sync_clk) static u32 gpmc_round_ps_to_sync_clk(u32 time_ps, u32 sync_clk)
...@@ -1611,13 +1607,7 @@ static int gpmc_probe(struct platform_device *pdev) ...@@ -1611,13 +1607,7 @@ static 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));
rc = gpmc_mem_init(); gpmc_mem_init();
if (rc < 0) {
clk_disable_unprepare(gpmc_l3_clk);
clk_put(gpmc_l3_clk);
dev_err(gpmc_dev, "failed to reserve memory\n");
return rc;
}
if (gpmc_setup_irq() < 0) if (gpmc_setup_irq() < 0)
dev_warn(gpmc_dev, "gpmc_setup_irq failed\n"); dev_warn(gpmc_dev, "gpmc_setup_irq failed\n");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment