From patchwork Wed Oct 17 14:41:25 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Hunter, Jon" X-Patchwork-Id: 1606471 Return-Path: X-Original-To: patchwork-linux-arm@patchwork.kernel.org Delivered-To: patchwork-process-083081@patchwork1.kernel.org Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) by patchwork1.kernel.org (Postfix) with ESMTP id 7D3C33FD4F for ; Wed, 17 Oct 2012 14:43:21 +0000 (UTC) Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.76 #1 (Red Hat Linux)) id 1TOUob-0008C2-3d; Wed, 17 Oct 2012 14:41:45 +0000 Received: from devils.ext.ti.com ([198.47.26.153]) by merlin.infradead.org with esmtps (Exim 4.76 #1 (Red Hat Linux)) id 1TOUoV-0008B4-Vp for linux-arm-kernel@lists.infradead.org; Wed, 17 Oct 2012 14:41:40 +0000 Received: from dlelxv30.itg.ti.com ([172.17.2.17]) by devils.ext.ti.com (8.13.7/8.13.7) with ESMTP id q9HEfQW7020995; Wed, 17 Oct 2012 09:41:26 -0500 Received: from DLEE74.ent.ti.com (dlee74.ent.ti.com [157.170.170.8]) by dlelxv30.itg.ti.com (8.13.8/8.13.8) with ESMTP id q9HEfQat001696; Wed, 17 Oct 2012 09:41:26 -0500 Received: from [172.24.112.54] (172.24.112.54) by DLEE74.ent.ti.com (157.170.170.8) with Microsoft SMTP Server id 14.1.323.3; Wed, 17 Oct 2012 09:41:26 -0500 Message-ID: <507EC395.7060409@ti.com> Date: Wed, 17 Oct 2012 09:41:25 -0500 From: Jon Hunter User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20121011 Thunderbird/16.0.1 MIME-Version: 1.0 To: Tony Lindgren Subject: Re: [PATCH 1/5] ARM: OMAP2+: gpmc: Fix kernel BUG for DT boot mode References: <41d66042625157d089e9c9532030a6831e79c641.1350327324.git.richardcochran@gmail.com> <20121016174835.GV15569@atomide.com> <507DCA8D.7060309@ti.com> <20121016212647.GM15569@atomide.com> In-Reply-To: <20121016212647.GM15569@atomide.com> X-Originating-IP: [172.24.112.54] X-Spam-Note: CRM114 invocation failed X-Spam-Score: -7.3 (-------) X-Spam-Report: SpamAssassin version 3.3.2 on merlin.infradead.org summary: Content analysis details: (-7.3 points) pts rule name description ---- ---------------------- -------------------------------------------------- -5.0 RCVD_IN_DNSWL_HI RBL: Sender listed at http://www.dnswl.org/, high trust [198.47.26.153 listed in list.dnswl.org] -0.0 SPF_PASS SPF: sender matches SPF record -0.4 RP_MATCHES_RCVD Envelope sender domain matches handover relay domain -1.9 BAYES_00 BODY: Bayes spam probability is 0 to 1% [score: 0.0000] Cc: Afzal Mohammed , Russell King , Arnd Bergmann , netdev@vger.kernel.org, Richard Cochran , "hvaibhav@ti.com" , "linux-omap@vger.kernel.org" , David Miller , linux-arm-kernel@lists.infradead.org X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: linux-arm-kernel-bounces@lists.infradead.org Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org On 10/16/2012 04:26 PM, Tony Lindgren wrote: > * Jon Hunter [121016 14:00]: >> Hi Tony, >> >> On 10/16/2012 12:48 PM, Tony Lindgren wrote: >>> * Richard Cochran [121015 12:18]: >>>> From: 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. Cheers Jon From 91f5234d567c07ce1579b50e52de1a1e06ce5c68 Mon Sep 17 00:00:00 2001 From: Jon Hunter Date: Tue, 16 Oct 2012 15:22:58 -0500 Subject: [PATCH V2] 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 --- arch/arm/mach-omap2/gpmc.c | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) 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");