drm/nouveau/platform: make VDD regulator optional
authorAlexandre Courbot <acourbot@nvidia.com>
Wed, 29 Mar 2017 09:31:21 +0000 (18:31 +0900)
committerBen Skeggs <bskeggs@redhat.com>
Thu, 6 Apr 2017 04:39:04 +0000 (14:39 +1000)
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 <acourbot@nvidia.com>
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/include/nvkm/core/tegra.h
drivers/gpu/drm/nouveau/nouveau_platform.c
drivers/gpu/drm/nouveau/nvkm/engine/device/tegra.c

index e5c9b6268dcca59efdaab12e5922b3a5e0ac2b2b..7c7d91cad09a94299317b2ab922acc9fce2b9222 100644 (file)
@@ -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 *,
index 4c4cc2260257cc1f8fb84f954ab6449d6f11c277..49d9ba0e3c510a0bf2a7dcc6bb1484e101fc8d09 100644 (file)
@@ -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,
 };
 
index f2bc0b7d9b9351bf5b3db61863a688c1d537b95c..6474bd2a6d0704a832438520c6766d3154711e22 100644 (file)
@@ -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");