diff options
author | Hyungwoo Yang <hyungwooy@nvidia.com> | 2011-10-24 15:06:17 -0700 |
---|---|---|
committer | Dan Willemsen <dwillemsen@nvidia.com> | 2011-11-30 21:49:33 -0800 |
commit | 187ada86d745a7f4fed96cd6017275dbe9b21fbb (patch) | |
tree | b12a924a37dd17cd0dcb6fd705e3b8f02af1887a /arch/arm/mach-tegra/board-cardhu-panel.c | |
parent | b04d67acb91dc0f388675f85a28bfa955c25d978 (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.c | 152 |
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); |