GP10B's power is managed by generic PM domains, so it does not require a
VDD regulator. Add this option into the chip function structure.

Signed-off-by: Alexandre Courbot <[email protected]>
---
 drm/nouveau/include/nvkm/core/tegra.h  |  4 ++++
 drm/nouveau/nouveau_platform.c         |  2 ++
 drm/nouveau/nvkm/engine/device/tegra.c | 31 ++++++++++++++++++++++---------
 3 files changed, 28 insertions(+), 9 deletions(-)

diff --git a/drm/nouveau/include/nvkm/core/tegra.h 
b/drm/nouveau/include/nvkm/core/tegra.h
index e5c9b6268dcc..7c7d91cad09a 100644
--- a/drm/nouveau/include/nvkm/core/tegra.h
+++ b/drm/nouveau/include/nvkm/core/tegra.h
@@ -42,6 +42,10 @@ struct nvkm_device_tegra_func {
         * Whether the chip requires a reference clock
         */
        bool require_ref_clk;
+       /*
+        * Whether the chip requires the VDD regulator
+        */
+       bool require_vdd;
 };
 
 int nvkm_device_tegra_new(const struct nvkm_device_tegra_func *,
diff --git a/drm/nouveau/nouveau_platform.c b/drm/nouveau/nouveau_platform.c
index 4c4cc2260257..49d9ba0e3c51 100644
--- a/drm/nouveau/nouveau_platform.c
+++ b/drm/nouveau/nouveau_platform.c
@@ -53,10 +53,12 @@ static int nouveau_platform_remove(struct platform_device 
*pdev)
 #if IS_ENABLED(CONFIG_OF)
 static const struct nvkm_device_tegra_func gk20a_platform_data = {
        .iommu_bit = 34,
+       .require_vdd = true,
 };
 
 static const struct nvkm_device_tegra_func gm20b_platform_data = {
        .iommu_bit = 34,
+       .require_vdd = true,
        .require_ref_clk = true,
 };
 
diff --git a/drm/nouveau/nvkm/engine/device/tegra.c 
b/drm/nouveau/nvkm/engine/device/tegra.c
index f2bc0b7d9b93..6474bd2a6d07 100644
--- a/drm/nouveau/nvkm/engine/device/tegra.c
+++ b/drm/nouveau/nvkm/engine/device/tegra.c
@@ -28,9 +28,11 @@ nvkm_device_tegra_power_up(struct nvkm_device_tegra *tdev)
 {
        int ret;
 
-       ret = regulator_enable(tdev->vdd);
-       if (ret)
-               goto err_power;
+       if (tdev->vdd) {
+               ret = regulator_enable(tdev->vdd);
+               if (ret)
+                       goto err_power;
+       }
 
        ret = clk_prepare_enable(tdev->clk);
        if (ret)
@@ -67,7 +69,8 @@ err_clk_pwr:
 err_clk_ref:
        clk_disable_unprepare(tdev->clk);
 err_clk:
-       regulator_disable(tdev->vdd);
+       if (tdev->vdd)
+               regulator_disable(tdev->vdd);
 err_power:
        return ret;
 }
@@ -75,6 +78,8 @@ err_power:
 static int
 nvkm_device_tegra_power_down(struct nvkm_device_tegra *tdev)
 {
+       int ret;
+
        reset_control_assert(tdev->rst);
        udelay(10);
 
@@ -84,7 +89,13 @@ nvkm_device_tegra_power_down(struct nvkm_device_tegra *tdev)
        clk_disable_unprepare(tdev->clk);
        udelay(10);
 
-       return regulator_disable(tdev->vdd);
+       if (tdev->vdd) {
+               ret = regulator_disable(tdev->vdd);
+               if (ret)
+                       return ret;
+       }
+
+       return 0;
 }
 
 static void
@@ -264,10 +275,12 @@ nvkm_device_tegra_new(const struct nvkm_device_tegra_func 
*func,
        tdev->func = func;
        tdev->pdev = pdev;
 
-       tdev->vdd = devm_regulator_get(&pdev->dev, "vdd");
-       if (IS_ERR(tdev->vdd)) {
-               ret = PTR_ERR(tdev->vdd);
-               goto free;
+       if (func->require_vdd) {
+               tdev->vdd = devm_regulator_get(&pdev->dev, "vdd");
+               if (IS_ERR(tdev->vdd)) {
+                       ret = PTR_ERR(tdev->vdd);
+                       goto free;
+               }
        }
 
        tdev->rst = devm_reset_control_get(&pdev->dev, "gpu");
-- 
2.12.0

_______________________________________________
Nouveau mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/nouveau

Reply via email to