From patchwork Sat Oct 22 12:20:56 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fabio Estevam X-Patchwork-Id: 9390689 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 4EAFB608A7 for ; Sat, 22 Oct 2016 12:23:44 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 3FE3728FD1 for ; Sat, 22 Oct 2016 12:23:44 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 3460928FD3; Sat, 22 Oct 2016 12:23:44 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-4.1 required=2.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, FREEMAIL_FROM, RCVD_IN_DNSWL_MED, T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) (using TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id D5D7128FFF for ; Sat, 22 Oct 2016 12:23:43 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.85_2 #1 (Red Hat Linux)) id 1bxvJc-00082M-5r; Sat, 22 Oct 2016 12:22:20 +0000 Received: from mail-qk0-x244.google.com ([2607:f8b0:400d:c09::244]) by bombadil.infradead.org with esmtps (Exim 4.85_2 #1 (Red Hat Linux)) id 1bxvJJ-0007ns-8h for linux-arm-kernel@lists.infradead.org; Sat, 22 Oct 2016 12:22:01 +0000 Received: by mail-qk0-x244.google.com with SMTP id n189so9256338qke.1 for ; Sat, 22 Oct 2016 05:21:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=vnw0plaT+WT9TQ5jdFOdcYJD5j0f9SAcwISO9RZLrfM=; b=SfaUBWK7hiWnOHx28EPwNaaxavw0zAuOxfEc3Rl+pAvyWmQlUTsU6UD9jo6fUnxf8F uMsmuYbvGoDxr4EoR+kwV0Pe5dMBDwoInIHNqryboIUCIkMZ3UfrE0rmBwIvzQLo3CHV bcoYpXxPqnwNiw/DDqYb2hav6SdvF5G7bvyntBhkbnHEqeRFmIynqoVg+TP40NmTW2om a5rI3fSf5KnIcZynzM3cTQ2ZSAnXUEXeXTQe1Pxu9prGvWe0tD3Vhuumt86tJeDC1/p0 4xpeo52BlPCfjd0YXb1/AaEXi8YC7wpEhNGStPne2TTHfUQBKhB7Pec1pl1OIhL4MwKJ HrmA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=vnw0plaT+WT9TQ5jdFOdcYJD5j0f9SAcwISO9RZLrfM=; b=VGCdwr1RtrepDuxoFAqXkopzaUZK2y/3MO8ZX1zRFUYyiThm/jS5m21rlBjrzwKCj6 iNCQsocujsToBgtxWBa7sszKt5ZQvt3vhgPkifHo7KE/6ldxPXY143NasT7E3ucPvBGH v7B6mefOERSbT2CTR+amwf8SkKsbVHQwqgl98+gEcyb+VJzHCOpzOOvVkYJtuupFlVNh dmZNqZakb7qMt3FC9dwOQDbWIvvCoyAxdwPIZdZxBhOrkwg/zPruHA9WRnVpdfKyKdH6 ysUhQgAx2H9WhC4X4oCDo4P5qhRDhp9fcBilRUPJBljyRsNET3mVN8FHfBCinYOuZp0B zIkA== X-Gm-Message-State: ABUngvcoTlITDI2kPGmi5zBrT9WuPr8BRmS4Eu57G8pW25QOU2B7P1VvgRtK88pLjoah4Q== X-Received: by 10.55.82.11 with SMTP id g11mr7065640qkb.76.1477138899802; Sat, 22 Oct 2016 05:21:39 -0700 (PDT) Received: from localhost.localdomain ([187.180.185.182]) by smtp.gmail.com with ESMTPSA id w29sm3737151qtc.27.2016.10.22.05.21.37 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Sat, 22 Oct 2016 05:21:39 -0700 (PDT) From: Fabio Estevam To: shawnguo@kernel.org Subject: [PATCH v3 2/2] ARM: imx: gpc: Fix the imx_gpc_genpd_init() error path Date: Sat, 22 Oct 2016 10:20:56 -0200 Message-Id: <1477138856-31696-2-git-send-email-festevam@gmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1477138856-31696-1-git-send-email-festevam@gmail.com> References: <1477138856-31696-1-git-send-email-festevam@gmail.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20161022_052201_412092_311281DC X-CRM114-Status: GOOD ( 18.69 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: linux-arm-kernel@lists.infradead.org, Fabio Estevam , linux@armlinux.org.uk, kernel@pengutronix.de MIME-Version: 1.0 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Virus-Scanned: ClamAV using ClamSMTP From: Fabio Estevam If of_genpd_add_provider_onecell() fails the following kernel crash is observed on a kernel built with multi_v7_defconfig: [ 1.739301] [00000040] *pgd=00000000 [ 1.739310] Internal error: Oops: 5 [#1] SMP ARM [ 1.739319] Modules linked in: [ 1.739328] CPU: 1 PID: 95 Comm: kworker/1:4 Not tainted 4.8.0-11897-g6b5e09a #1 [ 1.739331] Hardware name: Freescale i.MX6 Quad/DualLite (Device Tree) [ 1.739352] Workqueue: pm genpd_power_off_work_fn [ 1.739356] task: ee63d400 task.stack: ee70a000 [ 1.739365] PC is at mutex_lock+0xc/0x4c [ 1.739374] LR is at regulator_disable+0x2c/0x60 [ 1.739379] pc : [] lr : [] psr: 60000013 [ 1.739379] sp : ee70beb0 ip : 10624dd3 fp : ee6e6280 [ 1.739382] r10: eefb0900 r9 : 00000000 r8 : c1309918 [ 1.739385] r7 : 00000000 r6 : 00000040 r5 : 00000000 r4 : 00000040 [ 1.739390] r3 : 0000004c r2 : 7fffd540 r1 : 000001e4 r0 : 00000040 Instead of returning of_genpd_add_provider_onecell() directly, we should check its return value and in the case of error we should unwind the previously taken actions, which in these case are: - Call imx6q_pm_pu_power_off() - Set imx6q_pu_domain.reg back to NULL Setting imx6q_pu_domain.reg to NULL in the error case is important as it will prevent further operations in the pu_reg regulator. This kernel crash is not observed with imx_v6_v7_defconfig because it selects GPU and VPU drivers, which are consumers of the GPC block and thus change the refcount of the pu_reg regulator. Signed-off-by: Fabio Estevam --- Changes since v2: - Newly introduced arch/arm/mach-imx/gpc.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/arch/arm/mach-imx/gpc.c b/arch/arm/mach-imx/gpc.c index d0463e9..b54db47 100644 --- a/arch/arm/mach-imx/gpc.c +++ b/arch/arm/mach-imx/gpc.c @@ -408,7 +408,7 @@ static struct genpd_onecell_data imx_gpc_onecell_data = { static int imx_gpc_genpd_init(struct device *dev, struct regulator *pu_reg) { struct clk *clk; - int i; + int i, ret; imx6q_pu_domain.reg = pu_reg; @@ -432,12 +432,20 @@ static int imx_gpc_genpd_init(struct device *dev, struct regulator *pu_reg) for (i = 0; i < ARRAY_SIZE(imx_gpc_domains); i++) pm_genpd_init(imx_gpc_domains[i], NULL, false); - return of_genpd_add_provider_onecell(dev->of_node, + + ret = of_genpd_add_provider_onecell(dev->of_node, &imx_gpc_onecell_data); + if (ret) + goto power_off; + + return 0; +power_off: + imx6q_pm_pu_power_off(&imx6q_pu_domain.base); clk_err: while (i--) clk_put(imx6q_pu_domain.clk[i]); + imx6q_pu_domain.reg = NULL; return -EINVAL; }