|
@@ -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");
|