Message ID | 507DCA8D.7060309@ti.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
* Jon Hunter <jon-hunter@ti.com> [121016 14:00]: > Hi Tony, > > On 10/16/2012 12:48 PM, Tony Lindgren wrote: > > * Richard Cochran <richardcochran@gmail.com> [121015 12:18]: > >> From: hvaibhav@ti.com <hvaibhav@ti.com> > >> > >> With recent changes in omap gpmc driver code, in case of DT > >> boot mode, where bootloader does not configure gpmc cs space > >> will result into kernel BUG() inside gpmc_mem_init() function, > >> as gpmc cs0 gpmc_config7[0].csvalid bit is set to '1' and > >> gpmc_config7[0].baseaddress is set to '0' on reset. > >> > >> This use-case is applicable for any board/EVM which doesn't have > >> any peripheral connected to gpmc cs0, for example BeagleXM and > >> BeagleBone, so DT boot mode fails. > >> > >> This patch adds of_have_populated_dt() check before creating > >> device, so that for DT boot mode, gpmc probe will not be called > >> which is expected behavior, as gpmc is not supported yet from DT. > > > > I'm applying this one into omap-for-v3.7-rc1/fixes-part2. > > > > Next time, please also cc linux-omap@vger.kernel.org for series > > like this. I'm sure the people reading the omap list are interested > > in these. > > This patch appears to be masking an underlying issue. How about > something like the following ... OK that looks good to me. I'll drop the earlier fix and use yours instead. Regards, Tony
diff --git a/arch/arm/mach-omap2/gpmc.c b/arch/arm/mach-omap2/gpmc.c index 5ac5cf3..8f0d3c8 100644 --- a/arch/arm/mach-omap2/gpmc.c +++ b/arch/arm/mach-omap2/gpmc.c @@ -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,17 @@ 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)) + return rc; } + + return 0; } static __devinit int gpmc_probe(struct platform_device *pdev) { + int rc; u32 l; struct resource *res; @@ -936,7 +940,11 @@ 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)) { + 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");