video: tegra: dsi: Fix dsi suspend sequence
Animesh Kishore [Thu, 1 Aug 2013 12:44:43 +0000 (17:44 +0530)]
- explicitly disable backlight before suspend
- power gate pad after panel power gate

Bug 1341152

Change-Id: If51f3043ca9eca205399421ede7a7cfe79f5517c
Signed-off-by: Animesh Kishore <ankishore@nvidia.com>
Signed-off-by: Vineel Kumar Reddy Kovvuri <vineelkumarr@nvidia.com>
Reviewed-on: http://git-master/r/256835
(cherry picked from commit 24f6923af72928f493c15885374c6e4666a857b8)
Reviewed-on: http://git-master/r/265480
Reviewed-by: Automatic_Commit_Validation_User
Reviewed-by: Bitan Biswas <bbiswas@nvidia.com>
GVS: Gerrit_Virtual_Submit

arch/arm/mach-tegra/include/mach/dc.h
drivers/video/backlight/backlight.c
drivers/video/tegra/dc/dc.c
drivers/video/tegra/dc/dc_priv_defs.h
drivers/video/tegra/dc/dsi.c

index c8400b4..f274d24 100644 (file)
@@ -6,7 +6,7 @@
  * Author:
  *     Erik Gilling <konkers@google.com>
  *
- * Copyright (c) 2011-2013, NVIDIA CORPORATION, All rights reserved.
+ * Copyright (c) 2010-2013, NVIDIA CORPORATION, All rights reserved.
  *
  * This software is licensed under the terms of the GNU General Public
  * License version 2, as published by the Free Software Foundation, and
@@ -285,6 +285,8 @@ struct tegra_dsi_out {
        const u32               *pkt_seq;
 
        struct dsi_phy_timing_ns phy_timing;
+
+       u8              *bl_name;
 };
 
 enum {
index 1eeec8b..7671180 100644 (file)
@@ -3,6 +3,17 @@
  *
  * Copyright (C) 2003,2004 Hewlett-Packard Company
  *
+ * Copyright (c) 2013, NVIDIA CORPORATION, All rights reserved.
+ *
+ * This software is licensed under the terms of the GNU General Public
+ * License version 2, as published by the Free Software Foundation, and
+ * may be copied, distributed, and modified under those terms.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
  */
 
 #include <linux/module.h>
@@ -31,6 +42,10 @@ struct backlight_device *get_backlight_device_by_name(char *name)
 {
        struct list_head *ptr;
        struct backlight_device *entry = NULL;
+
+       if (!name)
+               return NULL;
+
        list_for_each(ptr, &backlight_devices) {
                entry = list_entry(ptr, struct backlight_device, devices_list);
                if (strcmp(dev_name(&entry->dev), name) == 0)
index a336e75..87dfe7d 100644 (file)
@@ -2050,6 +2050,9 @@ static void _tegra_dc_controller_disable(struct tegra_dc *dc)
        }
        trace_display_disable(dc);
 
+       if (dc->out_ops && dc->out_ops->postpoweroff)
+               dc->out_ops->postpoweroff(dc);
+
        tegra_dc_clk_disable(dc);
        tegra_dc_release_dc_out(dc);
 }
index e7864ac..dadadb3 100644 (file)
@@ -5,7 +5,7 @@
  * Copyright (C) 2010 Google, Inc.
  * Author: Erik Gilling <konkers@android.com>
  *
- * Copyright (c) 2010-2012, NVIDIA CORPORATION, All rights reserved.
+ * Copyright (c) 2010-2013, NVIDIA CORPORATION, All rights reserved.
  *
  * This software is licensed under the terms of the GNU General Public
  * License version 2, as published by the Free Software Foundation, and
@@ -71,6 +71,8 @@ struct tegra_dc_out_ops {
        void (*enable)(struct tegra_dc *dc);
        /* disable output.  dc clocks are on at this point */
        void (*disable)(struct tegra_dc *dc);
+       /* dc client is disabled.  dc clocks are on at this point */
+       void (*postpoweroff) (struct tegra_dc *dc);
        /* hold output.  keeps dc clocks on. */
        void (*hold)(struct tegra_dc *dc);
        /* release output.  dc clocks may turn off after this. */
index 89fb392..6930ce8 100644 (file)
@@ -4141,6 +4141,15 @@ static int tegra_dsi_host_suspend(struct tegra_dc *dc)
        return err;
 }
 
+static void tegra_dsi_bl_off(struct backlight_device *bd)
+{
+       if (!bd)
+               return;
+
+       bd->props.brightness = 0;
+       backlight_update_status(bd);
+}
+
 static int tegra_dsi_deep_sleep(struct tegra_dc *dc,
                                struct tegra_dc_dsi_data *dsi)
 {
@@ -4150,6 +4159,8 @@ static int tegra_dsi_deep_sleep(struct tegra_dc *dc,
        if (!dsi->enabled)
                return 0;
 
+       tegra_dsi_bl_off(get_backlight_device_by_name(dsi->info.bl_name));
+
        err = tegra_dsi_set_to_lp_mode(dc, dsi, DSI_LP_OP_WRITE);
        if (err < 0) {
                dev_err(&dc->ndev->dev,
@@ -4196,8 +4207,6 @@ static int tegra_dsi_deep_sleep(struct tegra_dc *dc,
        /* Disable dsi source clock */
        tegra_dsi_clk_disable(dsi);
 
-       regulator_disable(dsi->avdd_dsi_csi);
-
        dsi->enabled = false;
        dsi->host_suspended = true;
        atomic_set(&display_ready, 0);
@@ -4207,6 +4216,14 @@ fail:
        return err;
 }
 
+static void tegra_dc_dsi_postpoweroff(struct tegra_dc *dc)
+{
+       struct tegra_dc_dsi_data *dsi = tegra_dc_get_outdata(dc);
+
+       if (!dsi->enabled)
+               regulator_disable(dsi->avdd_dsi_csi);
+}
+
 static int tegra_dsi_host_resume(struct tegra_dc *dc)
 {
        int err = 0;
@@ -4438,6 +4455,7 @@ struct tegra_dc_out_ops tegra_dc_dsi_ops = {
        .destroy = tegra_dc_dsi_destroy,
        .enable = tegra_dc_dsi_enable,
        .disable = tegra_dc_dsi_disable,
+       .postpoweroff = tegra_dc_dsi_postpoweroff,
        .hold = tegra_dc_dsi_hold_host,
        .release = tegra_dc_dsi_release_host,
 #ifdef CONFIG_PM