diff options
-rw-r--r-- | drivers/gpu/drm/tegra/sor.c | 57 |
1 files changed, 35 insertions, 22 deletions
diff --git a/drivers/gpu/drm/tegra/sor.c b/drivers/gpu/drm/tegra/sor.c index b652201eadad..cb7e06062174 100644 --- a/drivers/gpu/drm/tegra/sor.c +++ b/drivers/gpu/drm/tegra/sor.c | |||
@@ -2350,10 +2350,13 @@ static int tegra_sor_init(struct host1x_client *client) | |||
2350 | * XXX: Remove this reset once proper hand-over from firmware to | 2350 | * XXX: Remove this reset once proper hand-over from firmware to |
2351 | * kernel is possible. | 2351 | * kernel is possible. |
2352 | */ | 2352 | */ |
2353 | err = reset_control_assert(sor->rst); | 2353 | if (sor->rst) { |
2354 | if (err < 0) { | 2354 | err = reset_control_assert(sor->rst); |
2355 | dev_err(sor->dev, "failed to assert SOR reset: %d\n", err); | 2355 | if (err < 0) { |
2356 | return err; | 2356 | dev_err(sor->dev, "failed to assert SOR reset: %d\n", |
2357 | err); | ||
2358 | return err; | ||
2359 | } | ||
2357 | } | 2360 | } |
2358 | 2361 | ||
2359 | err = clk_prepare_enable(sor->clk); | 2362 | err = clk_prepare_enable(sor->clk); |
@@ -2364,10 +2367,13 @@ static int tegra_sor_init(struct host1x_client *client) | |||
2364 | 2367 | ||
2365 | usleep_range(1000, 3000); | 2368 | usleep_range(1000, 3000); |
2366 | 2369 | ||
2367 | err = reset_control_deassert(sor->rst); | 2370 | if (sor->rst) { |
2368 | if (err < 0) { | 2371 | err = reset_control_deassert(sor->rst); |
2369 | dev_err(sor->dev, "failed to deassert SOR reset: %d\n", err); | 2372 | if (err < 0) { |
2370 | return err; | 2373 | dev_err(sor->dev, "failed to deassert SOR reset: %d\n", |
2374 | err); | ||
2375 | return err; | ||
2376 | } | ||
2371 | } | 2377 | } |
2372 | 2378 | ||
2373 | err = clk_prepare_enable(sor->clk_safe); | 2379 | err = clk_prepare_enable(sor->clk_safe); |
@@ -2601,11 +2607,14 @@ static int tegra_sor_probe(struct platform_device *pdev) | |||
2601 | goto remove; | 2607 | goto remove; |
2602 | } | 2608 | } |
2603 | 2609 | ||
2604 | sor->rst = devm_reset_control_get(&pdev->dev, "sor"); | 2610 | if (!pdev->dev.pm_domain) { |
2605 | if (IS_ERR(sor->rst)) { | 2611 | sor->rst = devm_reset_control_get(&pdev->dev, "sor"); |
2606 | err = PTR_ERR(sor->rst); | 2612 | if (IS_ERR(sor->rst)) { |
2607 | dev_err(&pdev->dev, "failed to get reset control: %d\n", err); | 2613 | err = PTR_ERR(sor->rst); |
2608 | goto remove; | 2614 | dev_err(&pdev->dev, "failed to get reset control: %d\n", |
2615 | err); | ||
2616 | goto remove; | ||
2617 | } | ||
2609 | } | 2618 | } |
2610 | 2619 | ||
2611 | sor->clk = devm_clk_get(&pdev->dev, NULL); | 2620 | sor->clk = devm_clk_get(&pdev->dev, NULL); |
@@ -2711,10 +2720,12 @@ static int tegra_sor_suspend(struct device *dev) | |||
2711 | struct tegra_sor *sor = dev_get_drvdata(dev); | 2720 | struct tegra_sor *sor = dev_get_drvdata(dev); |
2712 | int err; | 2721 | int err; |
2713 | 2722 | ||
2714 | err = reset_control_assert(sor->rst); | 2723 | if (sor->rst) { |
2715 | if (err < 0) { | 2724 | err = reset_control_assert(sor->rst); |
2716 | dev_err(dev, "failed to assert reset: %d\n", err); | 2725 | if (err < 0) { |
2717 | return err; | 2726 | dev_err(dev, "failed to assert reset: %d\n", err); |
2727 | return err; | ||
2728 | } | ||
2718 | } | 2729 | } |
2719 | 2730 | ||
2720 | usleep_range(1000, 2000); | 2731 | usleep_range(1000, 2000); |
@@ -2737,11 +2748,13 @@ static int tegra_sor_resume(struct device *dev) | |||
2737 | 2748 | ||
2738 | usleep_range(1000, 2000); | 2749 | usleep_range(1000, 2000); |
2739 | 2750 | ||
2740 | err = reset_control_deassert(sor->rst); | 2751 | if (sor->rst) { |
2741 | if (err < 0) { | 2752 | err = reset_control_deassert(sor->rst); |
2742 | dev_err(dev, "failed to deassert reset: %d\n", err); | 2753 | if (err < 0) { |
2743 | clk_disable_unprepare(sor->clk); | 2754 | dev_err(dev, "failed to deassert reset: %d\n", err); |
2744 | return err; | 2755 | clk_disable_unprepare(sor->clk); |
2756 | return err; | ||
2757 | } | ||
2745 | } | 2758 | } |
2746 | 2759 | ||
2747 | return 0; | 2760 | return 0; |