video: tegra: dc: Fix display blink during boot
Vineel Kumar Reddy Kovvuri [Mon, 18 Feb 2013 05:35:23 +0000 (10:35 +0530)]
Fix for display flashing multiple times when jumping from bootloader
to kernel during boot

Bug 1229530

Change-Id: I59ffccf5f41b70d377f817c3a8f95ff2159fdcb3
Signed-off-by: Vineel Kumar Reddy Kovvuri <vineelkumarr@nvidia.com>
Reviewed-on: http://git-master/r/201152
Reviewed-by: Automatic_Commit_Validation_User
Reviewed-by: Animesh Kishore <ankishore@nvidia.com>
Reviewed-by: Bitan Biswas <bbiswas@nvidia.com>

drivers/video/backlight/pwm_bl.c
drivers/video/tegra/dc/dsi.c

index 6aca33c..b5ed7e9 100644 (file)
@@ -1,13 +1,21 @@
 /*
  * linux/drivers/video/backlight/pwm_bl.c
  *
+ * Copyright (c) 2011-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.
+ *
  * simple PWM based backlight control, board code has to setup
  * 1) pin configuration so PWM waveforms can output
  * 2) platform_data being correctly configured
  *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
  */
 
 #include <linux/module.h>
@@ -33,6 +41,7 @@ struct pwm_bl_data {
        void                    (*notify_after)(struct device *,
                                        int brightness);
        int                     (*check_fb)(struct device *, struct fb_info *);
+       int (*display_init)(struct device *);
 };
 
 static int pwm_backlight_update_status(struct backlight_device *bl)
@@ -40,6 +49,8 @@ static int pwm_backlight_update_status(struct backlight_device *bl)
        struct pwm_bl_data *pb = dev_get_drvdata(&bl->dev);
        int brightness = bl->props.brightness;
        int max = bl->props.max_brightness;
+       if (pb->display_init && !pb->display_init(pb->dev))
+               brightness = 0;
 
        if (bl->props.power != FB_BLANK_UNBLANK)
                brightness = 0;
@@ -118,6 +129,7 @@ static int pwm_backlight_probe(struct platform_device *pdev)
        pb->lth_brightness = data->lth_brightness *
                (data->pwm_period_ns / data->max_brightness);
        pb->dev = &pdev->dev;
+       pb->display_init = data->init;
        pb->pwm_gpio = data->pwm_gpio;
 
        pb->pwm = pwm_request(data->pwm_id, "backlight");
index e2313cd..d494a63 100644 (file)
@@ -94,6 +94,9 @@ module_param(enable_read_debug, bool, 0644);
 MODULE_PARM_DESC(enable_read_debug,
                "Enable to print read fifo and return packet type");
 
+atomic_t __maybe_unused display_ready = ATOMIC_INIT(0);
+EXPORT_SYMBOL(display_ready);
+
 /* source of video data */
 enum {
        TEGRA_DSI_DRIVEN_BY_DC,
@@ -3374,6 +3377,7 @@ static void _tegra_dc_dsi_enable(struct tegra_dc *dc)
                tegra_dsi_start_dc_stream(dc, dsi);
 
        dsi->host_suspended = false;
+       atomic_set(&display_ready, 1);
 fail:
        tegra_dc_io_end(dc);
        mutex_unlock(&dsi->lock);
@@ -3943,6 +3947,7 @@ static int tegra_dsi_deep_sleep(struct tegra_dc *dc,
 
        dsi->enabled = false;
        dsi->host_suspended = true;
+       atomic_set(&display_ready, 0);
 
        return 0;
 fail: