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

drm/tegra: dsi: Reset across ->exit()/->init()

This allows a DRM driver unload/reload cycle to completely reset the DSI
controller and may help in situations where it's broken.

Signed-off-by: Thierry Reding <treding@nvidia.com>

+14 -13
+14 -13
drivers/gpu/drm/tegra/dsi.c
··· 948 948 struct tegra_dsi *dsi = host1x_client_to_dsi(client); 949 949 int err; 950 950 951 + reset_control_deassert(dsi->rst); 952 + 953 + err = tegra_dsi_pad_calibrate(dsi); 954 + if (err < 0) { 955 + dev_err(dsi->dev, "MIPI calibration failed: %d\n", err); 956 + goto reset; 957 + } 958 + 951 959 /* Gangsters must not register their own outputs. */ 952 960 if (!dsi->master) { 953 961 dsi->output.type = TEGRA_OUTPUT_DSI; ··· 976 968 } 977 969 978 970 return 0; 971 + 972 + reset: 973 + reset_control_assert(dsi->rst); 974 + return err; 979 975 } 980 976 981 977 static int tegra_dsi_exit(struct host1x_client *client) ··· 1008 996 return err; 1009 997 } 1010 998 } 999 + 1000 + reset_control_assert(dsi->rst); 1011 1001 1012 1002 return 0; 1013 1003 } ··· 1437 1423 if (IS_ERR(dsi->rst)) 1438 1424 return PTR_ERR(dsi->rst); 1439 1425 1440 - err = reset_control_deassert(dsi->rst); 1441 - if (err < 0) { 1442 - dev_err(&pdev->dev, "failed to bring DSI out of reset: %d\n", 1443 - err); 1444 - return err; 1445 - } 1446 - 1447 1426 dsi->clk = devm_clk_get(&pdev->dev, NULL); 1448 1427 if (IS_ERR(dsi->clk)) { 1449 1428 dev_err(&pdev->dev, "cannot get DSI clock\n"); ··· 1500 1493 if (IS_ERR(dsi->mipi)) { 1501 1494 err = PTR_ERR(dsi->mipi); 1502 1495 goto disable_vdd; 1503 - } 1504 - 1505 - err = tegra_dsi_pad_calibrate(dsi); 1506 - if (err < 0) { 1507 - dev_err(dsi->dev, "MIPI calibration failed: %d\n", err); 1508 - goto mipi_free; 1509 1496 } 1510 1497 1511 1498 dsi->host.ops = &tegra_dsi_host_ops;