arm: tegra: Add panel reset support
Animesh Kishore [Fri, 31 Aug 2012 13:38:31 +0000 (18:38 +0530)]
Most dsi panels need to be reseted
before init.

Bug 1034528
Bug 1028791
Bug 1028790
Bug 1028789
Bug 1012298

Signed-off-by: Animesh Kishore <ankishore@nvidia.com>
Change-Id: I30d681cd9784c9d05a2b49652507b44bd8ccfa97
Reviewed-on: http://git-master/r/129826
Reviewed-by: Automatic_Commit_Validation_User
Reviewed-by: Lokesh Pathak <lpathak@nvidia.com>
Tested-by: Thomas Cherry <tcherry@nvidia.com>
GVS: Gerrit_Virtual_Submit

arch/arm/mach-tegra/board-dalmore-panel.c
arch/arm/mach-tegra/board-pluto-panel.c

index 112159d..fde0de5 100644 (file)
@@ -22,6 +22,8 @@
 #include <linux/nvmap.h>
 #include <linux/nvhost.h>
 #include <linux/init.h>
+#include <linux/delay.h>
+#include <linux/gpio.h>
 #include <linux/tegra_pwm_bl.h>
 #include <linux/regulator/consumer.h>
 
 #include "board.h"
 #include "devices.h"
 #include "gpio-names.h"
+#ifdef CONFIG_ARCH_TEGRA_3x_SOC
+#include "tegra3_host1x_devices.h"
+#else
 #include "tegra11_host1x_devices.h"
+#endif
 
-#define TEGRA_PANEL_ENABLE 0
+#define TEGRA_PANEL_ENABLE     0
 
 #if TEGRA_PANEL_ENABLE
 
-#define TEGRA_DSI_GANGED_MODE 0
-#define IS_EXTERNAL_PWM        0
+#define TEGRA_DSI_GANGED_MODE  0
+#define IS_EXTERNAL_PWM                0
 
 /* PANEL_<diagonal length in inches>_<vendor name>_<resolution> */
-#define PANEL_10_1_PANASONIC_1920_1200 1
-#define PANEL_11_6_AUO_1920_1080 0
-#define PANEL_10_1_SHARP_2560_1600 0
+#define PANEL_10_1_PANASONIC_1920_1200 1
+#define PANEL_11_6_AUO_1920_1080       0
+#define PANEL_10_1_SHARP_2560_1600     0
+
+#define DSI_PANEL_RESET                1
+#define DSI_PANEL_RST_GPIO     TEGRA_GPIO_PH3
 
-#define DSI_PANEL_RESET        1
 #define DC_CTRL_MODE   TEGRA_DC_OUT_CONTINUOUS_MODE
 
 static atomic_t sd_brightness = ATOMIC_INIT(255);
@@ -160,6 +168,15 @@ static int dalmore_dsi_panel_enable(void)
 {
        int err = 0;
 
+#if DSI_PANEL_RESET
+       gpio_direction_output(DSI_PANEL_RST_GPIO, 1);
+       usleep_range(1000, 5000);
+       gpio_set_value(DSI_PANEL_RST_GPIO, 0);
+       usleep_range(1000, 5000);
+       gpio_set_value(DSI_PANEL_RST_GPIO, 1);
+       msleep(20);
+#endif
+
 #if PANEL_10_1_PANASONIC_1920_1200 || \
        PANEL_11_6_AUO_1920_1080 || \
        PANEL_10_1_SHARP_2560_1600
@@ -469,6 +486,19 @@ static int dalmore_dsi_regulator_get(void)
        return err;
 }
 
+static int dalmore_dsi_gpio_get(void)
+{
+       int err = 0;
+
+       err = gpio_request(DSI_PANEL_RST_GPIO, "panel rst");
+       if (err < 0) {
+               pr_err("panel reset gpio request failed\n");
+               return err;
+       }
+
+       return err;
+}
+
 int __init dalmore_panel_init(void)
 {
        int err = 0;
@@ -488,7 +518,11 @@ int __init dalmore_panel_init(void)
 #endif
 
 #ifdef CONFIG_TEGRA_GRHOST
+#ifdef CONFIG_ARCH_TEGRA_3x_SOC
+       err = tegra3_register_host1x_devices();
+#else
        err = tegra11_register_host1x_devices();
+#endif
        if (err) {
                pr_err("host1x devices registration failed\n");
                return err;
@@ -530,6 +564,12 @@ int __init dalmore_panel_init(void)
                pr_err("regulator get failed\n");
                return err;
        }
+
+       err = dalmore_dsi_gpio_get();
+       if (err < 0) {
+               pr_err("panel gpio get failed\n");
+               return err;
+       }
 #endif
 
 #ifdef CONFIG_TEGRA_NVAVP
index 7073a1f..efdfd28 100644 (file)
@@ -22,6 +22,7 @@
 #include <linux/nvmap.h>
 #include <linux/nvhost.h>
 #include <linux/init.h>
+#include <linux/delay.h>
 #include <linux/gpio.h>
 #include <linux/tegra_pwm_bl.h>
 #include <linux/regulator/consumer.h>
 #include "board.h"
 #include "devices.h"
 #include "gpio-names.h"
+#ifdef CONFIG_ARCH_TEGRA_3x_SOC
+#include "tegra3_host1x_devices.h"
+#else
 #include "tegra11_host1x_devices.h"
+#endif
 
-#define TEGRA_PANEL_ENABLE 0
+#define TEGRA_PANEL_ENABLE     0
 
 #if TEGRA_PANEL_ENABLE
 
-#define IS_EXTERNAL_PWM        0
+#define IS_EXTERNAL_PWM                0
 
 /* PANEL_<diagonal length in inches>_<vendor name>_<resolution> */
-#define PANEL_5_LG_720_1280 1
+#define PANEL_5_LG_720_1280    0
+
+#define DSI_PANEL_RESET                1
+#define DSI_PANEL_RST_GPIO     TEGRA_GPIO_PH5
 
-#define DSI_PANEL_RESET        1
 #define DC_CTRL_MODE   TEGRA_DC_OUT_CONTINUOUS_MODE
 
 static atomic_t sd_brightness = ATOMIC_INIT(255);
@@ -56,7 +63,6 @@ static struct regulator *vdd_lcd_1v8;
 #define EN_VDD_LCD_1V8 PMU_TPS65913_GPIO_PORT04
 #endif
 
-
 static struct resource pluto_disp1_resources[] __initdata = {
        {
                .name   = "irq",
@@ -111,6 +117,7 @@ static struct resource pluto_disp2_resources[] __initdata = {
        },
 };
 
+#if PANEL_5_LG_720_1280
 static u8 panel_dsi_config[] = {0xe0, 0x43, 0x0, 0x80, 0x0, 0x0};
 static u8 panel_disp_ctrl1[] = {0xb5, 0x34, 0x20, 0x40, 0x0, 0x20};
 static u8 panel_disp_ctrl2[] = {0xb6, 0x04, 0x74, 0x0f, 0x16, 0x13};
@@ -143,6 +150,7 @@ static u8 panel_ce10[] =
 static u8 panel_ce11[] = {0x7a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0};
 static u8 panel_ce12[] = {0x7b, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0};
 static u8 panel_ce13[] = {0x7c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0};
+#endif
 
 static struct tegra_dsi_cmd dsi_init_cmd[] = {
 #if PANEL_5_LG_720_1280
@@ -227,6 +235,15 @@ static int pluto_dsi_panel_enable(void)
 {
        int err = 0;
 
+#if DSI_PANEL_RESET
+       gpio_direction_output(DSI_PANEL_RST_GPIO, 1);
+       usleep_range(1000, 5000);
+       gpio_set_value(DSI_PANEL_RST_GPIO, 0);
+       usleep_range(1000, 5000);
+       gpio_set_value(DSI_PANEL_RST_GPIO, 1);
+       msleep(20);
+#endif
+
 #if PANEL_5_LG_720_1280
        if (avdd_lcd_2v8) {
                err = regulator_enable(avdd_lcd_2v8);
@@ -501,6 +518,12 @@ static int pluto_dsi_gpio_get(void)
 {
        int err = 0;
 
+       err = gpio_request(DSI_PANEL_RST_GPIO, "panel rst");
+       if (err < 0) {
+               pr_err("panel reset gpio request failed\n");
+               return err;
+       }
+
 #if PANEL_5_LG_720_1280
        err = gpio_request(EN_VDD_LCD_1V8, "panel regulator enable");
        if (err < 0) {
@@ -530,7 +553,11 @@ int __init pluto_panel_init(void)
 #endif
 
 #ifdef CONFIG_TEGRA_GRHOST
+#ifdef CONFIG_ARCH_TEGRA_3x_SOC
+       err = tegra3_register_host1x_devices();
+#else
        err = tegra11_register_host1x_devices();
+#endif
        if (err) {
                pr_err("host1x devices registration failed\n");
                return err;