Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/tegra: vic: Implement explicit reset support

Tegra supports generic PM domains on 64-bit ARM, and if that is enabled,
the power domain code will make sure that resets are asserted and
deasserted at appropriate points in time.

If generic PM domains are not implemented, such as on 32-bit Tegra, the
resets need to be asserted and deasserted explicitly by the driver.

Reviewed-by: Jon Hunter <jonathanh@nvidia.com>
Signed-off-by: Thierry Reding <treding@nvidia.com>

+34 -1
+34 -1
drivers/gpu/drm/tegra/vic.c
··· 38 38 struct iommu_domain *domain; 39 39 struct device *dev; 40 40 struct clk *clk; 41 + struct reset_control *rst; 41 42 42 43 /* Platform configuration */ 43 44 const struct vic_config *config; ··· 57 56 static int vic_runtime_resume(struct device *dev) 58 57 { 59 58 struct vic *vic = dev_get_drvdata(dev); 59 + int err; 60 60 61 - return clk_prepare_enable(vic->clk); 61 + err = clk_prepare_enable(vic->clk); 62 + if (err < 0) 63 + return err; 64 + 65 + usleep_range(10, 20); 66 + 67 + err = reset_control_deassert(vic->rst); 68 + if (err < 0) 69 + goto disable; 70 + 71 + usleep_range(10, 20); 72 + 73 + return 0; 74 + 75 + disable: 76 + clk_disable_unprepare(vic->clk); 77 + return err; 62 78 } 63 79 64 80 static int vic_runtime_suspend(struct device *dev) 65 81 { 66 82 struct vic *vic = dev_get_drvdata(dev); 83 + int err; 84 + 85 + err = reset_control_assert(vic->rst); 86 + if (err < 0) 87 + return err; 88 + 89 + usleep_range(2000, 4000); 67 90 68 91 clk_disable_unprepare(vic->clk); 69 92 ··· 346 321 if (IS_ERR(vic->clk)) { 347 322 dev_err(&pdev->dev, "failed to get clock\n"); 348 323 return PTR_ERR(vic->clk); 324 + } 325 + 326 + if (!dev->pm_domain) { 327 + vic->rst = devm_reset_control_get(dev, "vic"); 328 + if (IS_ERR(vic->rst)) { 329 + dev_err(&pdev->dev, "failed to get reset\n"); 330 + return PTR_ERR(vic->rst); 331 + } 349 332 } 350 333 351 334 vic->falcon.dev = dev;