Patch "drm/nouveau: platform: Fix deferred probe" has been added to the 4.4-stable tree
Subsystems (5)
This is a note to let you know that I've just added the patch titled
drm/nouveau: platform: Fix deferred probe
to the 4.4-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
drm-nouveau-platform-fix-deferred-probe.patch
and it can be found in the queue-4.4 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
870571a5698b2e9d0f4d2e5c6245967b582aab45Mon Sep 17 00:00:00 2001
From: Thierry Reding <[email protected]>
Date: Wed, 24 Feb 2016 18:34:43 +0100
Subject: drm/nouveau: platform: Fix deferred probe
From: Thierry Reding <[email protected]>
commit 870571a5698b2e9d0f4d2e5c6245967b582aab45 upstream.
The error cleanup paths aren't quite correct and will crash upon deferred probe.
--- 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(-)
drivers/gpu/drm/nouveau/nouveau_platform.c +1 -1
@@ -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;
drivers/gpu/drm/nouveau/nvkm/engine/device/tegra.c +29 -11
@@ -252,32 +252,40 @@ nvkm_device_tegra_new(const struct nvkm_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_ 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
Patches currently in stable-queue which might be from [email protected] are
queue-4.4/drm-nouveau-platform-fix-deferred-probe.patch