Received: by 2002:a25:8b91:0:0:0:0:0 with SMTP id j17csp597967ybl; Fri, 24 Jan 2020 06:12:06 -0800 (PST) X-Google-Smtp-Source: APXvYqw9wGRuhNjbgDO83P5CET0gVtjqvI68nSDijq0goUfG7Nc+a2ionBmvEOcN+AdQj89FLhAX X-Received: by 2002:a9d:7593:: with SMTP id s19mr2647618otk.219.1579875125891; Fri, 24 Jan 2020 06:12:05 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1579875125; cv=none; d=google.com; s=arc-20160816; b=e26S3qX32IopVL8IbebBt+0k5QjOY6Ol8bwyutoQn4NJEA+1XF4nPswBowAZKRSpbl YruWvJPxE/DB8oi6/DkUS3zh89zkbDQsIaAyH5qxX6KmBzj8GneJGiFRKef0CMGYKZb4 uvXbaNBR1dxpqm0hAMlWGbCdK9WpVK/yIuQ6gpRLgZr/Ef+Xw9svz31Ivd/mNkv+dv4r ZhvSqJItNWWJabZmPdZdhULi2qMgeLadwXMkLAhWaxUNyjUzlfe02xSpiOvf/tvHEl8g aTY6iSTn45/7JFqivHG9PmffIgE64tARYOUqI/ggL3WlctQCqsmmtThdZsQ9vgyfjBxr 2uXw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=GEXFmD6sMREBUI+GldJBlxyfSFINzA0trx30XV0UegQ=; b=y1FVk9Y7dCiUlBT6htGLw6Sa4RUwma/MBSxun9+BV8J/x4K14eG8kS4SwAnygLB51X 27S4t8hxbp+rjoryhVH/vrUq4jLUE82kDjdM4K0QFVHmbO6yzAtj6MBc3iWM0KocX5hJ J/V4NEQK7QlhJxCypgqW138kNCP6BOILWk+Bm/mikWhLyyQYLIgsB25PnTdS4dzaWwxl 2S3PnLp/saMm6DbwHAtk4NiAHQHBL6mP0+be2ZjTTMI1I5ng4Lo2biHsPM6PYKCSmXVm itTvZWKPQGvT/EtqZr2vifXkZ2noutQkUtIAd/UURcFX4XHLcDmClOA1IjHlgr0s7Lhb thzg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=vo7vKxIA; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id m90si2806925otc.259.2020.01.24.06.11.49; Fri, 24 Jan 2020 06:12:05 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=vo7vKxIA; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2387508AbgAXJ6e (ORCPT + 99 others); Fri, 24 Jan 2020 04:58:34 -0500 Received: from mail.kernel.org ([198.145.29.99]:34032 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725821AbgAXJ6d (ORCPT ); Fri, 24 Jan 2020 04:58:33 -0500 Received: from localhost (unknown [145.15.244.15]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 257B620709; Fri, 24 Jan 2020 09:58:31 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1579859912; bh=YZQj15HykUfkx12S9MAongzeegBHADwge2FK/tjmt2k=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=vo7vKxIAygQ1hHeYfwZGeNE3zMzeP/qZP96oVRzfPDLJ7bkQralL6wZng99HkU/ws uzBt67TecdevcQEwUmW7T2LyrRhrKQeVM/Sc4u1FduNHPTNU1Tj6yevHC/dthAC4yS yCpGDNDllqhoLDfuwjnzZ/kD+DOggfQA9qzv/iCU= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Jon Hunter , Vinod Koul , Sasha Levin Subject: [PATCH 4.14 212/343] dmaengine: tegra210-adma: Fix crash during probe Date: Fri, 24 Jan 2020 10:30:30 +0100 Message-Id: <20200124092947.960310264@linuxfoundation.org> X-Mailer: git-send-email 2.25.0 In-Reply-To: <20200124092919.490687572@linuxfoundation.org> References: <20200124092919.490687572@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Jon Hunter [ Upstream commit b53611fb1ce9b1786bd18205473e0c1d6bfa8934 ] Commit f33e7bb3eb92 ("dmaengine: tegra210-adma: restore channel status") added support to save and restore the DMA channel registers when runtime suspending the ADMA. This change is causing the kernel to crash when probing the ADMA, if the device is probed deferred when looking up the channel interrupts. The crash occurs because not all of the channel base addresses have been setup at this point and in the clean-up path of the probe, pm_runtime_suspend() is called invoking its callback which expects all the channel base addresses to be initialised. Although this could be fixed by simply checking for a NULL address, on further review of the driver it seems more appropriate that we only call pm_runtime_get_sync() after all the channel interrupts and base addresses have been configured. Therefore, fix this crash by moving the calls to pm_runtime_enable(), pm_runtime_get_sync() and tegra_adma_init() after the DMA channels have been initialised. Fixes: f33e7bb3eb92 ("dmaengine: tegra210-adma: restore channel status") Signed-off-by: Jon Hunter Signed-off-by: Vinod Koul Signed-off-by: Sasha Levin --- drivers/dma/tegra210-adma.c | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/drivers/dma/tegra210-adma.c b/drivers/dma/tegra210-adma.c index ac2a6b800db3e..4f4733d831a1a 100644 --- a/drivers/dma/tegra210-adma.c +++ b/drivers/dma/tegra210-adma.c @@ -744,16 +744,6 @@ static int tegra_adma_probe(struct platform_device *pdev) return PTR_ERR(tdma->ahub_clk); } - pm_runtime_enable(&pdev->dev); - - ret = pm_runtime_get_sync(&pdev->dev); - if (ret < 0) - goto rpm_disable; - - ret = tegra_adma_init(tdma); - if (ret) - goto rpm_put; - INIT_LIST_HEAD(&tdma->dma_dev.channels); for (i = 0; i < tdma->nr_channels; i++) { struct tegra_adma_chan *tdc = &tdma->channels[i]; @@ -771,6 +761,16 @@ static int tegra_adma_probe(struct platform_device *pdev) tdc->tdma = tdma; } + pm_runtime_enable(&pdev->dev); + + ret = pm_runtime_get_sync(&pdev->dev); + if (ret < 0) + goto rpm_disable; + + ret = tegra_adma_init(tdma); + if (ret) + goto rpm_put; + dma_cap_set(DMA_SLAVE, tdma->dma_dev.cap_mask); dma_cap_set(DMA_PRIVATE, tdma->dma_dev.cap_mask); dma_cap_set(DMA_CYCLIC, tdma->dma_dev.cap_mask); @@ -812,13 +812,13 @@ static int tegra_adma_probe(struct platform_device *pdev) dma_remove: dma_async_device_unregister(&tdma->dma_dev); -irq_dispose: - while (--i >= 0) - irq_dispose_mapping(tdma->channels[i].irq); rpm_put: pm_runtime_put_sync(&pdev->dev); rpm_disable: pm_runtime_disable(&pdev->dev); +irq_dispose: + while (--i >= 0) + irq_dispose_mapping(tdma->channels[i].irq); return ret; } -- 2.20.1