summaryrefslogtreecommitdiff
path: root/arch/arm/mach-tegra/board-cardhu-panel.c
diff options
context:
space:
mode:
authorHyungwoo Yang <hyungwooy@nvidia.com>2011-10-24 15:06:17 -0700
committerDan Willemsen <dwillemsen@nvidia.com>2011-11-30 21:49:33 -0800
commit187ada86d745a7f4fed96cd6017275dbe9b21fbb (patch)
treeb12a924a37dd17cd0dcb6fd705e3b8f02af1887a /arch/arm/mach-tegra/board-cardhu-panel.c
parentb04d67acb91dc0f388675f85a28bfa955c25d978 (diff)
video: tegra: support display board PM313
This change supports PM313 with 19X12 panel. The change uses PM313 in "Single input to Dual output" mode Bug ID : 822980 Reviewed-on: http://git-master/r/50215 (cherry picked from commit b83e795747fa860b5b7fb66b2067ebe4f15bcfd0) Change-Id: Iabf707ded2976e9877481c215d0b1f1940781f14 Reviewed-on: http://git-master/r/60085 Reviewed-by: Varun Colbert <vcolbert@nvidia.com> Tested-by: Varun Colbert <vcolbert@nvidia.com> Rebase-Id: Re8eadc35c75fa21b0a5f3cb3bee0e8cb77dc3238
Diffstat (limited to 'arch/arm/mach-tegra/board-cardhu-panel.c')
-rw-r--r--arch/arm/mach-tegra/board-cardhu-panel.c152
1 files changed, 124 insertions, 28 deletions
diff --git a/arch/arm/mach-tegra/board-cardhu-panel.c b/arch/arm/mach-tegra/board-cardhu-panel.c
index 1bea26d26411..5702faf6a4ec 100644
--- a/arch/arm/mach-tegra/board-cardhu-panel.c
+++ b/arch/arm/mach-tegra/board-cardhu-panel.c
@@ -38,22 +38,37 @@
#include "devices.h"
#include "gpio-names.h"
-/* Select panel to be used. */
+/* Select DSI panel to be used. */
#define DSI_PANEL_219 0
#define DSI_PANEL_218 1
#define AVDD_LCD PMU_TCA6416_GPIO_PORT17
#define DSI_PANEL_RESET 0
-#define pm269_lvds_shutdown TEGRA_GPIO_PN6
-#define cardhu_lvds_shutdown TEGRA_GPIO_PL2
-#define cardhu_bl_enb TEGRA_GPIO_PH2
-#define cardhu_bl_pwm TEGRA_GPIO_PH0
-#define cardhu_hdmi_hpd TEGRA_GPIO_PN7
+/* Select LVDS panel resolution. 13X7 is default */
+#define PM313_LVDS_PANEL_19X12_18BPP 1
+
+/* PM313 display board specific pins */
+#define pm313_R_FDE TEGRA_GPIO_PW0
+#define pm313_R_FB TEGRA_GPIO_PN4
+#define pm313_MODE0 TEGRA_GPIO_PZ4
+#define pm313_MODE1 TEGRA_GPIO_PW1
+#define pm313_lvds_shutdown TEGRA_GPIO_PH1
+
+/* E1247 reworked for pm269 pins */
+#define e1247_pm269_lvds_shutdown TEGRA_GPIO_PN6
+
+/* E1247 cardhu default display board pins */
+#define cardhu_lvds_shutdown TEGRA_GPIO_PL2
+
+/* common pins( backlight ) for all display boards */
+#define cardhu_bl_enb TEGRA_GPIO_PH2
+#define cardhu_bl_pwm TEGRA_GPIO_PH0
+#define cardhu_hdmi_hpd TEGRA_GPIO_PN7
#if defined(DSI_PANEL_219) || defined(DSI_PANEL_218)
-#define cardhu_dsia_bl_enb TEGRA_GPIO_PW1
-#define cardhu_dsib_bl_enb TEGRA_GPIO_PW0
-#define cardhu_dsi_panel_reset TEGRA_GPIO_PD2
+#define cardhu_dsia_bl_enb TEGRA_GPIO_PW1
+#define cardhu_dsib_bl_enb TEGRA_GPIO_PW0
+#define cardhu_dsi_panel_reset TEGRA_GPIO_PD2
#endif
#ifdef CONFIG_TEGRA_DC
@@ -73,6 +88,7 @@ static struct regulator *cardhu_lvds_vdd_panel = NULL;
#endif
static struct board_info board_info;
+static struct board_info display_board_info;
static tegra_dc_bl_output cardhu_bl_output_measured = {
0, 1, 2, 3, 4, 5, 6, 7,
@@ -210,7 +226,13 @@ static int cardhu_backlight_notify(struct device *unused, int brightness)
if (brightness > 255) {
pr_info("Error: Brightness > 255!\n");
} else {
- brightness = bl_output[brightness];
+ /* This value depends on the panel.
+ Current 19X12 panel with PM313 gets
+ full brightness when the output is 0. */
+ if (display_board_info.board_id == BOARD_DISPLAY_PM313)
+ brightness = 255 - bl_output[brightness];
+ else
+ brightness = bl_output[brightness];
}
return brightness;
@@ -267,11 +289,24 @@ static int cardhu_panel_enable(void)
else
regulator_enable(cardhu_lvds_vdd_panel);
}
- if ((board_info.board_id == BOARD_PM269) ||
- (board_info.board_id == BOARD_E1257) ||
- (board_info.board_id == BOARD_PM305) ||
- (board_info.board_id == BOARD_PM311))
- gpio_set_value(pm269_lvds_shutdown, 1);
+
+ if (display_board_info.board_id == BOARD_DISPLAY_PM313) {
+ /* lvds configuration */
+ gpio_set_value(pm313_R_FDE, 1);
+ gpio_set_value(pm313_R_FB, 1);
+ gpio_set_value(pm313_MODE0, 1);
+ gpio_set_value(pm313_MODE1, 0);
+
+ /* FIXME : it may require more or less delay for latching
+ values correctly before enabling RGB2LVDS */
+ mdelay(100);
+ gpio_set_value(pm313_lvds_shutdown, 1);
+ } else if ((display_board_info.board_id == BOARD_DISPLAY_E1247 &&
+ board_info.board_id == BOARD_PM269) ||
+ (board_info.board_id == BOARD_E1257) ||
+ (board_info.board_id == BOARD_PM305) ||
+ (board_info.board_id == BOARD_PM311))
+ gpio_set_value(e1247_pm269_lvds_shutdown, 1);
else
gpio_set_value(cardhu_lvds_shutdown, 1);
@@ -291,13 +326,18 @@ static int cardhu_panel_disable(void)
regulator_disable(cardhu_lvds_vdd_panel);
regulator_put(cardhu_lvds_vdd_panel);
cardhu_lvds_vdd_panel= NULL;
- if ((board_info.board_id == BOARD_PM269) ||
- (board_info.board_id == BOARD_E1257) ||
- (board_info.board_id == BOARD_PM305) ||
- (board_info.board_id == BOARD_PM311))
- gpio_set_value(pm269_lvds_shutdown, 0);
- else
+
+ if (display_board_info.board_id == BOARD_DISPLAY_PM313) {
+ gpio_set_value(pm313_lvds_shutdown, 0);
+ } else if ((display_board_info.board_id == BOARD_DISPLAY_E1247 &&
+ board_info.board_id == BOARD_PM269) ||
+ (board_info.board_id == BOARD_E1257) ||
+ (board_info.board_id == BOARD_PM305) ||
+ (board_info.board_id == BOARD_PM311)) {
+ gpio_set_value(e1247_pm269_lvds_shutdown, 0);
+ } else {
gpio_set_value(cardhu_lvds_shutdown, 0);
+ }
return 0;
}
#endif
@@ -446,6 +486,22 @@ static struct resource cardhu_disp2_resources[] = {
#endif
#ifndef CONFIG_TEGRA_CARDHU_DSI
+static struct tegra_dc_mode panel_19X12_modes[] = {
+ {
+ .pclk = 154000000,
+ .h_ref_to_sync = 11,
+ .v_ref_to_sync = 1,
+ .h_sync_width = 32,
+ .v_sync_width = 6,
+ .h_back_porch = 80,
+ .v_back_porch = 26,
+ .h_active = 1920,
+ .v_active = 1200,
+ .h_front_porch = 48,
+ .v_front_porch = 3,
+ },
+};
+
static struct tegra_dc_mode cardhu_panel_modes[] = {
{
/* 1366x768@60Hz */
@@ -985,6 +1041,7 @@ int __init cardhu_panel_init(void)
struct resource __maybe_unused *res;
tegra_get_board_info(&board_info);
+ tegra_get_display_board_info(&display_board_info);
cardhu_carveouts[1].base = tegra_carveout_start;
cardhu_carveouts[1].size = tegra_carveout_size;
@@ -997,13 +1054,52 @@ int __init cardhu_panel_init(void)
cardhu_disp1_out.n_modes = ARRAY_SIZE(cardhu_panel_modes_55hz);
}
- if ((board_info.board_id == BOARD_PM269) ||
- (board_info.board_id == BOARD_E1257) ||
- (board_info.board_id == BOARD_PM305) ||
- (board_info.board_id == BOARD_PM311)) {
- gpio_request(pm269_lvds_shutdown, "lvds_shutdown");
- gpio_direction_output(pm269_lvds_shutdown, 1);
- tegra_gpio_enable(pm269_lvds_shutdown);
+ if (display_board_info.board_id == BOARD_DISPLAY_PM313) {
+ /* lvds configuration */
+ err = gpio_request(pm313_R_FDE, "R_FDE");
+ err |= gpio_direction_output(pm313_R_FDE, 1);
+ tegra_gpio_enable(pm313_R_FDE);
+
+ err |= gpio_request(pm313_R_FB, "R_FB");
+ err |= gpio_direction_output(pm313_R_FB, 1);
+ tegra_gpio_enable(pm313_R_FB);
+
+ err |= gpio_request(pm313_MODE0, "MODE0");
+ err |= gpio_direction_output(pm313_MODE0, 1);
+ tegra_gpio_enable(pm313_MODE0);
+
+ err |= gpio_request(pm313_MODE1, "MODE1");
+ err |= gpio_direction_output(pm313_MODE1, 0);
+ tegra_gpio_enable(pm313_MODE1);
+
+ err = gpio_request(pm313_lvds_shutdown, "lvds_shutdown");
+ /* free ride provided by bootloader */
+ err |= gpio_direction_output(pm313_lvds_shutdown, 1);
+ tegra_gpio_enable(pm313_lvds_shutdown);
+
+ if (err)
+ printk(KERN_ERR "ERROR(s) in LVDS configuration\n");
+#if defined(PM313_LVDS_PANEL_19X12_18BPP)
+ cardhu_disp1_out.modes = panel_19X12_modes;
+ cardhu_disp1_out.n_modes = ARRAY_SIZE(panel_19X12_modes);
+ cardhu_disp1_out.parent_clk = "pll_d_out0";
+ cardhu_disp1_out.depth = 18;
+
+ cardhu_fb_data.xres = 1920;
+ cardhu_fb_data.yres = 1200;
+
+ cardhu_disp2_out.parent_clk = "pll_d2_out0";
+ cardhu_hdmi_fb_data.xres = 1920;
+ cardhu_hdmi_fb_data.yres = 1200;
+#endif
+ } else if ((display_board_info.board_id == BOARD_DISPLAY_E1247 &&
+ board_info.board_id == BOARD_PM269) ||
+ (board_info.board_id == BOARD_E1257) ||
+ (board_info.board_id == BOARD_PM305) ||
+ (board_info.board_id == BOARD_PM311)) {
+ gpio_request(e1247_pm269_lvds_shutdown, "lvds_shutdown");
+ gpio_direction_output(e1247_pm269_lvds_shutdown, 1);
+ tegra_gpio_enable(e1247_pm269_lvds_shutdown);
} else {
gpio_request(cardhu_lvds_shutdown, "lvds_shutdown");
gpio_direction_output(cardhu_lvds_shutdown, 1);