Message ID | 507EC395.7060409@ti.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
* Jon Hunter <jon-hunter@ti.com> [121017 07:43]: > > On 10/16/2012 04:26 PM, Tony Lindgren wrote: > > * 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. > > Hi Tony, sorry but I realised now that in my patch that I need to > take care of releasing and memory and clocks that were acquired > during the probe. Here is a V2. If you prefer I can create a delta > patch also with the previous. OK thanks I'll update it. Regards, Tony
diff --git a/arch/arm/mach-omap2/gpmc.c b/arch/arm/mach-omap2/gpmc.c index 5ac5cf3..92b5718 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,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");