Commit 92f0e073 authored by Thierry Reding's avatar Thierry Reding

drm/tegra: dsi: Soft-reset controller on ->disable

This reset is necessary to properly clean up the internal state of the
controller.
Signed-off-by: default avatarThierry Reding <treding@nvidia.com>
parent 9c0b4ca1
...@@ -724,6 +724,30 @@ static void tegra_dsi_disable(struct tegra_dsi *dsi) ...@@ -724,6 +724,30 @@ static void tegra_dsi_disable(struct tegra_dsi *dsi)
usleep_range(5000, 10000); usleep_range(5000, 10000);
} }
static void tegra_dsi_soft_reset(struct tegra_dsi *dsi)
{
u32 value;
value = tegra_dsi_readl(dsi, DSI_POWER_CONTROL);
value &= ~DSI_POWER_CONTROL_ENABLE;
tegra_dsi_writel(dsi, value, DSI_POWER_CONTROL);
usleep_range(300, 1000);
value = tegra_dsi_readl(dsi, DSI_POWER_CONTROL);
value |= DSI_POWER_CONTROL_ENABLE;
tegra_dsi_writel(dsi, value, DSI_POWER_CONTROL);
usleep_range(300, 1000);
value = tegra_dsi_readl(dsi, DSI_TRIGGER);
if (value)
tegra_dsi_writel(dsi, 0, DSI_TRIGGER);
if (dsi->slave)
tegra_dsi_soft_reset(dsi->slave);
}
static int tegra_output_dsi_disable(struct tegra_output *output) static int tegra_output_dsi_disable(struct tegra_output *output)
{ {
struct tegra_dc *dc = to_tegra_dc(output->encoder.crtc); struct tegra_dc *dc = to_tegra_dc(output->encoder.crtc);
...@@ -762,6 +786,7 @@ static int tegra_output_dsi_disable(struct tegra_output *output) ...@@ -762,6 +786,7 @@ static int tegra_output_dsi_disable(struct tegra_output *output)
if (err < 0) if (err < 0)
dev_dbg(dsi->dev, "failed to idle DSI: %d\n", err); dev_dbg(dsi->dev, "failed to idle DSI: %d\n", err);
tegra_dsi_soft_reset(dsi);
tegra_dsi_disable(dsi); tegra_dsi_disable(dsi);
dsi->enabled = false; dsi->enabled = false;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment