From patchwork Wed Feb 24 17:34:43 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Thierry Reding X-Patchwork-Id: 587554 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 9B380140C66 for ; Thu, 25 Feb 2016 04:34:48 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b=q4RtIwe0; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757870AbcBXRer (ORCPT ); Wed, 24 Feb 2016 12:34:47 -0500 Received: from mail-wm0-f44.google.com ([74.125.82.44]:36639 "EHLO mail-wm0-f44.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755831AbcBXReq (ORCPT ); Wed, 24 Feb 2016 12:34:46 -0500 Received: by mail-wm0-f44.google.com with SMTP id g62so283183204wme.1 for ; Wed, 24 Feb 2016 09:34:46 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id; bh=ZN9jeBWNunm2neMZtg/PkFjIEDk+ejTMwVq1O5ZQQeY=; b=q4RtIwe0s7UPf3n0X3dxUGubH763LSRiSaMUer0nMKT+LkQODTxg6l8S4swNHYAw7u 4RWYNMO6abSDB+GMQWoK86RkM5zm3fkfQJeAuGk+gEI9gtI8kYnAoghjzv37yaa6G6EI vaFG1nCemEyLGbD8hzpPgx82J2LkkZMd0PPYpBOrkt6wuIK5dy0x2u1AsIAsBKskdS7z 7O8B62yOzzFM3EIuWGNJVsZsxFuG/y6lYfu98Vne0t7OEfdz0KD7hTpkB7OS1qhlaanc LHDbtTB6FsozFBXHW0Q0yFvyaYyD8gdawssLkbuZTLViKpGeJP+TWrUFBIcVhAdM7b0a vG+g== 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; bh=ZN9jeBWNunm2neMZtg/PkFjIEDk+ejTMwVq1O5ZQQeY=; b=kkisktwakmLzuGO8lPwKAM6/hIUxcJMtl99KTVr3dRWWh9HB15gqXCIls7KxjQ2qRj QONFKx+atH072zMJi02qIS+oHaNdX8mjIJBqwl7RHNxnXknKsnARQgLAruJfr0G0ToHB s34ma3zCsU8jxT2elWuFPBcLK0waRAG4TiW2NWkXgutiNMU18WDZ4QADfRC3v6+BS8g5 UzofNNxL+91E5wYSSgkIWJ7nTF+i/RY5vjtzXuyWa/Tl8zmfLQcU7uy+LwY6k7GLeyLJ rB6yR0wkDkQMPTRssuyf5W+MXTHP3t61jBtt4KgxoJgbeJRKCfvUYe0TkIvAXL2pQ90G NDLg== X-Gm-Message-State: AG10YOSgPxm/xMB3hrKb4FUWEtkDhLnzHrhBrsuOgivj1PHG0v1eEEJ1oC4xm1drbd0b+Q== X-Received: by 10.28.57.131 with SMTP id g125mr23926216wma.17.1456335285236; Wed, 24 Feb 2016 09:34:45 -0800 (PST) Received: from localhost (port-23121.pppoe.wtnet.de. [46.59.152.2]) by smtp.gmail.com with ESMTPSA id za6sm4013701wjc.18.2016.02.24.09.34.43 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 24 Feb 2016 09:34:43 -0800 (PST) From: Thierry Reding To: Ben Skeggs Cc: Alexandre Courbot , Nicolas Chauvet , dri-devel@lists.freedesktop.org, linux-tegra@vger.kernel.org Subject: [PATCH] drm/nouveau: platform: Fix deferred probe Date: Wed, 24 Feb 2016 18:34:43 +0100 Message-Id: <1456335283-22097-1-git-send-email-thierry.reding@gmail.com> X-Mailer: git-send-email 2.7.1 Sender: linux-tegra-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-tegra@vger.kernel.org From: Thierry Reding The error cleanup paths aren't quite correct and will crash upon deferred probe. Cc: stable@vger.kernel.org # v4.3+ Signed-off-by: Thierry Reding Reviewed-by: Ben Skeggs Reviewed-by: Alexandre Courbot --- drivers/gpu/drm/nouveau/nouveau_platform.c | 2 +- drivers/gpu/drm/nouveau/nvkm/engine/device/tegra.c | 40 ++++++++++++++++------ 2 files changed, 30 insertions(+), 12 deletions(-) diff --git a/drivers/gpu/drm/nouveau/nouveau_platform.c b/drivers/gpu/drm/nouveau/nouveau_platform.c index 8a70cec59bcd..2dfe58af12e4 100644 --- a/drivers/gpu/drm/nouveau/nouveau_platform.c +++ b/drivers/gpu/drm/nouveau/nouveau_platform.c @@ -24,7 +24,7 @@ static int nouveau_platform_probe(struct platform_device *pdev) { const struct nvkm_device_tegra_func *func; - struct nvkm_device *device; + struct nvkm_device *device = NULL; struct drm_device *drm; int ret; diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/device/tegra.c b/drivers/gpu/drm/nouveau/nvkm/engine/device/tegra.c index 7f8a42721eb2..e7e581d6a8ff 100644 --- a/drivers/gpu/drm/nouveau/nvkm/engine/device/tegra.c +++ b/drivers/gpu/drm/nouveau/nvkm/engine/device/tegra.c @@ -252,32 +252,40 @@ nvkm_device_tegra_new(const struct nvkm_device_tegra_func *func, if (!(tdev = kzalloc(sizeof(*tdev), GFP_KERNEL))) return -ENOMEM; - *pdevice = &tdev->device; + tdev->func = func; tdev->pdev = pdev; tdev->irq = -1; tdev->vdd = devm_regulator_get(&pdev->dev, "vdd"); - if (IS_ERR(tdev->vdd)) - return PTR_ERR(tdev->vdd); + if (IS_ERR(tdev->vdd)) { + ret = PTR_ERR(tdev->vdd); + goto free; + } tdev->rst = devm_reset_control_get(&pdev->dev, "gpu"); - if (IS_ERR(tdev->rst)) - return PTR_ERR(tdev->rst); + if (IS_ERR(tdev->rst)) { + ret = PTR_ERR(tdev->rst); + goto free; + } tdev->clk = devm_clk_get(&pdev->dev, "gpu"); - if (IS_ERR(tdev->clk)) - return PTR_ERR(tdev->clk); + if (IS_ERR(tdev->clk)) { + ret = PTR_ERR(tdev->clk); + goto free; + } tdev->clk_pwr = devm_clk_get(&pdev->dev, "pwr"); - if (IS_ERR(tdev->clk_pwr)) - return PTR_ERR(tdev->clk_pwr); + if (IS_ERR(tdev->clk_pwr)) { + ret = PTR_ERR(tdev->clk_pwr); + goto free; + } nvkm_device_tegra_probe_iommu(tdev); ret = nvkm_device_tegra_power_up(tdev); if (ret) - return ret; + goto remove; tdev->gpu_speedo = tegra_sku_info.gpu_speedo_value; ret = nvkm_device_ctor(&nvkm_device_tegra_func, NULL, &pdev->dev, @@ -285,9 +293,19 @@ nvkm_device_tegra_new(const struct nvkm_device_tegra_func *func, cfg, dbg, detect, mmio, subdev_mask, &tdev->device); if (ret) - return ret; + goto powerdown; + + *pdevice = &tdev->device; return 0; + +powerdown: + nvkm_device_tegra_power_down(tdev); +remove: + nvkm_device_tegra_remove_iommu(tdev); +free: + kfree(tdev); + return ret; } #else int