drm/tegra: dsi - Add enable guard
authorThierry Reding <treding@nvidia.com>
Fri, 14 Mar 2014 13:15:10 +0000 (14:15 +0100)
committerThierry Reding <treding@nvidia.com>
Thu, 5 Jun 2014 21:09:30 +0000 (23:09 +0200)
To prevent the enable or disable operations to potentially be run
multiple times, add guards to return early when the output is already
in the targetted state.

Signed-off-by: Thierry Reding <treding@nvidia.com>
drivers/gpu/drm/tegra/dsi.c

index 5f0d7802dc52f5a84237da59fa75345839ef4e59..4c35d9b0c9c8a1ae3d246e45b34fd58c91c625d1 100644 (file)
@@ -53,6 +53,7 @@ struct tegra_dsi {
        struct mipi_dsi_host host;
 
        struct regulator *vdd;
+       bool enabled;
 };
 
 static inline struct tegra_dsi *
@@ -436,6 +437,9 @@ static int tegra_output_dsi_enable(struct tegra_output *output)
        const u32 *pkt_seq;
        int err;
 
+       if (dsi->enabled)
+               return 0;
+
        if (dsi->flags & MIPI_DSI_MODE_VIDEO_SYNC_PULSE) {
                DRM_DEBUG_KMS("Non-burst video mode with sync pulses\n");
                pkt_seq = pkt_seq_video_non_burst_sync_pulses;
@@ -530,6 +534,8 @@ static int tegra_output_dsi_enable(struct tegra_output *output)
        value |= DSI_POWER_CONTROL_ENABLE;
        tegra_dsi_writel(dsi, value, DSI_POWER_CONTROL);
 
+       dsi->enabled = true;
+
        return 0;
 }
 
@@ -539,6 +545,9 @@ static int tegra_output_dsi_disable(struct tegra_output *output)
        struct tegra_dsi *dsi = to_dsi(output);
        unsigned long value;
 
+       if (!dsi->enabled)
+               return 0;
+
        /* disable DSI controller */
        value = tegra_dsi_readl(dsi, DSI_POWER_CONTROL);
        value &= DSI_POWER_CONTROL_ENABLE;
@@ -568,6 +577,8 @@ static int tegra_output_dsi_disable(struct tegra_output *output)
 
        clk_disable(dsi->clk);
 
+       dsi->enabled = false;
+
        return 0;
 }