blob: da0fd3140293b5dc78b7aef483c54ae44e39e7f4 [file] [log] [blame]
Huaibin Yang4a084e32011-12-15 15:25:52 -08001/* Copyright (c) 2012, Code Aurora Forum. All rights reserved.
2 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License version 2 and
5 * only version 2 as published by the Free Software Foundation.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 *
12 */
13
14#include <linux/init.h>
15#include <linux/ioport.h>
Steve Mucklef132c6c2012-06-06 18:30:57 -070016#include <linux/gpio.h>
Huaibin Yang4a084e32011-12-15 15:25:52 -080017#include <linux/platform_device.h>
18#include <linux/bootmem.h>
Ravishangar Kalyanam59a67b12012-02-13 14:29:56 -080019#include <linux/ion.h>
Huaibin Yang4a084e32011-12-15 15:25:52 -080020#include <asm/mach-types.h>
21#include <mach/msm_memtypes.h>
22#include <mach/board.h>
Huaibin Yang4a084e32011-12-15 15:25:52 -080023#include <mach/gpiomux.h>
Huaibin Yang4a084e32011-12-15 15:25:52 -080024#include <mach/ion.h>
Ravishangar Kalyanam59a67b12012-02-13 14:29:56 -080025#include <mach/msm_bus_board.h>
Huaibin Yang02f981c2012-02-27 16:58:41 -080026#include <mach/socinfo.h>
Huaibin Yang4a084e32011-12-15 15:25:52 -080027
28#include "devices.h"
29#include "board-8064.h"
30
31#ifdef CONFIG_FB_MSM_TRIPLE_BUFFER
32/* prim = 1366 x 768 x 3(bpp) x 3(pages) */
Huaibin Yangc8946d42012-05-04 17:22:02 -070033#define MSM_FB_PRIM_BUF_SIZE roundup(1920 * 1088 * 4 * 3, 0x10000)
Huaibin Yang4a084e32011-12-15 15:25:52 -080034#else
35/* prim = 1366 x 768 x 3(bpp) x 2(pages) */
Huaibin Yangc8946d42012-05-04 17:22:02 -070036#define MSM_FB_PRIM_BUF_SIZE roundup(1920 * 1088 * 4 * 2, 0x10000)
Huaibin Yang4a084e32011-12-15 15:25:52 -080037#endif
38
Huaibin Yangc8946d42012-05-04 17:22:02 -070039#define MSM_FB_SIZE roundup(MSM_FB_PRIM_BUF_SIZE, 4096)
Huaibin Yang4a084e32011-12-15 15:25:52 -080040
41#ifdef CONFIG_FB_MSM_OVERLAY0_WRITEBACK
42#define MSM_FB_OVERLAY0_WRITEBACK_SIZE roundup((1376 * 768 * 3 * 2), 4096)
43#else
44#define MSM_FB_OVERLAY0_WRITEBACK_SIZE (0)
45#endif /* CONFIG_FB_MSM_OVERLAY0_WRITEBACK */
46
47#ifdef CONFIG_FB_MSM_OVERLAY1_WRITEBACK
48#define MSM_FB_OVERLAY1_WRITEBACK_SIZE roundup((1920 * 1088 * 3 * 2), 4096)
49#else
50#define MSM_FB_OVERLAY1_WRITEBACK_SIZE (0)
51#endif /* CONFIG_FB_MSM_OVERLAY1_WRITEBACK */
52
Ravishangar Kalyanamc2fee312012-02-09 19:11:22 -080053
Huaibin Yang4a084e32011-12-15 15:25:52 -080054static struct resource msm_fb_resources[] = {
55 {
56 .flags = IORESOURCE_DMA,
57 }
58};
59
Huaibin Yang4a084e32011-12-15 15:25:52 -080060#define LVDS_CHIMEI_PANEL_NAME "lvds_chimei_wxga"
Zhang Chang Ken4a07fcb2012-06-03 11:24:51 -040061#define LVDS_FRC_PANEL_NAME "lvds_frc_fhd"
Ravishangar Kalyanamc2fee312012-02-09 19:11:22 -080062#define MIPI_VIDEO_TOSHIBA_WSVGA_PANEL_NAME "mipi_video_toshiba_wsvga"
63#define MIPI_VIDEO_CHIMEI_WXGA_PANEL_NAME "mipi_video_chimei_wxga"
64#define HDMI_PANEL_NAME "hdmi_msm"
65#define TVOUT_PANEL_NAME "tvout_msm"
Huaibin Yang4a084e32011-12-15 15:25:52 -080066
Zhang Chang Ken4a07fcb2012-06-03 11:24:51 -040067#define LVDS_PIXEL_MAP_PATTERN_1 1
68#define LVDS_PIXEL_MAP_PATTERN_2 2
69
Ravishangar Kalyanamfda36c42012-03-26 16:28:19 -070070#ifdef CONFIG_FB_MSM_HDMI_AS_PRIMARY
71static unsigned char hdmi_is_primary = 1;
72#else
73static unsigned char hdmi_is_primary;
74#endif
75
76unsigned char apq8064_hdmi_as_primary_selected(void)
77{
78 return hdmi_is_primary;
79}
80
Aravind Venkateswaran8ac7f412012-03-16 17:57:30 -070081static void set_mdp_clocks_for_wuxga(void);
82
Huaibin Yang4a084e32011-12-15 15:25:52 -080083static int msm_fb_detect_panel(const char *name)
84{
Ravishangar Kalyanamed3593c2012-03-08 10:15:04 -080085 u32 version;
Ravishangar Kalyanamc2fee312012-02-09 19:11:22 -080086 if (machine_is_apq8064_liquid()) {
Ravishangar Kalyanamed3593c2012-03-08 10:15:04 -080087 version = socinfo_get_platform_version();
88 if ((SOCINFO_VERSION_MAJOR(version) == 1) &&
89 (SOCINFO_VERSION_MINOR(version) == 1)) {
90 if (!strncmp(name, MIPI_VIDEO_CHIMEI_WXGA_PANEL_NAME,
91 strnlen(MIPI_VIDEO_CHIMEI_WXGA_PANEL_NAME,
92 PANEL_NAME_MAX_LEN)))
93 return 0;
94 } else {
95 if (!strncmp(name, LVDS_CHIMEI_PANEL_NAME,
96 strnlen(LVDS_CHIMEI_PANEL_NAME,
97 PANEL_NAME_MAX_LEN)))
98 return 0;
99 }
Ravishangar Kalyanamc2fee312012-02-09 19:11:22 -0800100 } else if (machine_is_apq8064_mtp()) {
101 if (!strncmp(name, MIPI_VIDEO_TOSHIBA_WSVGA_PANEL_NAME,
102 strnlen(MIPI_VIDEO_TOSHIBA_WSVGA_PANEL_NAME,
103 PANEL_NAME_MAX_LEN)))
104 return 0;
Zhang Chang Ken4a07fcb2012-06-03 11:24:51 -0400105 } else if (machine_is_apq8064_cdp()) {
Ravishangar Kalyanamc2fee312012-02-09 19:11:22 -0800106 if (!strncmp(name, LVDS_CHIMEI_PANEL_NAME,
107 strnlen(LVDS_CHIMEI_PANEL_NAME,
108 PANEL_NAME_MAX_LEN)))
109 return 0;
Zhang Chang Ken4a07fcb2012-06-03 11:24:51 -0400110 } else if (machine_is_mpq8064_dtv()) {
111 if (!strncmp(name, LVDS_FRC_PANEL_NAME,
112 strnlen(LVDS_FRC_PANEL_NAME,
113 PANEL_NAME_MAX_LEN))) {
114 set_mdp_clocks_for_wuxga();
115 return 0;
116 }
Ravishangar Kalyanamc2fee312012-02-09 19:11:22 -0800117 }
118
119 if (!strncmp(name, HDMI_PANEL_NAME,
Aravind Venkateswaran8ac7f412012-03-16 17:57:30 -0700120 strnlen(HDMI_PANEL_NAME,
121 PANEL_NAME_MAX_LEN))) {
Ravishangar Kalyanamfda36c42012-03-26 16:28:19 -0700122 if (apq8064_hdmi_as_primary_selected())
Aravind Venkateswaran8ac7f412012-03-16 17:57:30 -0700123 set_mdp_clocks_for_wuxga();
Huaibin Yang4a084e32011-12-15 15:25:52 -0800124 return 0;
Aravind Venkateswaran8ac7f412012-03-16 17:57:30 -0700125 }
126
Ravishangar Kalyanamc2fee312012-02-09 19:11:22 -0800127
Huaibin Yang4a084e32011-12-15 15:25:52 -0800128 return -ENODEV;
129}
130
131static struct msm_fb_platform_data msm_fb_pdata = {
132 .detect_client = msm_fb_detect_panel,
133};
134
135static struct platform_device msm_fb_device = {
136 .name = "msm_fb",
137 .id = 0,
138 .num_resources = ARRAY_SIZE(msm_fb_resources),
139 .resource = msm_fb_resources,
140 .dev.platform_data = &msm_fb_pdata,
141};
142
143void __init apq8064_allocate_fb_region(void)
144{
145 void *addr;
146 unsigned long size;
147
148 size = MSM_FB_SIZE;
149 addr = alloc_bootmem_align(size, 0x1000);
150 msm_fb_resources[0].start = __pa(addr);
151 msm_fb_resources[0].end = msm_fb_resources[0].start + size - 1;
152 pr_info("allocating %lu bytes at %p (%lx physical) for fb\n",
153 size, addr, __pa(addr));
154}
155
156#define MDP_VSYNC_GPIO 0
157
Ravishangar Kalyanam59a67b12012-02-13 14:29:56 -0800158static struct msm_bus_vectors mdp_init_vectors[] = {
159 {
160 .src = MSM_BUS_MASTER_MDP_PORT0,
161 .dst = MSM_BUS_SLAVE_EBI_CH0,
162 .ab = 0,
163 .ib = 0,
164 },
165};
166
167static struct msm_bus_vectors mdp_ui_vectors[] = {
168 {
169 .src = MSM_BUS_MASTER_MDP_PORT0,
170 .dst = MSM_BUS_SLAVE_EBI_CH0,
171 .ab = 216000000 * 2,
172 .ib = 270000000 * 2,
173 },
174};
175
176static struct msm_bus_vectors mdp_vga_vectors[] = {
177 /* VGA and less video */
178 {
179 .src = MSM_BUS_MASTER_MDP_PORT0,
180 .dst = MSM_BUS_SLAVE_EBI_CH0,
181 .ab = 216000000 * 2,
182 .ib = 270000000 * 2,
183 },
184};
185
186static struct msm_bus_vectors mdp_720p_vectors[] = {
187 /* 720p and less video */
188 {
189 .src = MSM_BUS_MASTER_MDP_PORT0,
190 .dst = MSM_BUS_SLAVE_EBI_CH0,
191 .ab = 230400000 * 2,
192 .ib = 288000000 * 2,
193 },
194};
195
196static struct msm_bus_vectors mdp_1080p_vectors[] = {
197 /* 1080p and less video */
198 {
199 .src = MSM_BUS_MASTER_MDP_PORT0,
200 .dst = MSM_BUS_SLAVE_EBI_CH0,
201 .ab = 334080000 * 2,
202 .ib = 417600000 * 2,
203 },
204};
205
206static struct msm_bus_paths mdp_bus_scale_usecases[] = {
207 {
208 ARRAY_SIZE(mdp_init_vectors),
209 mdp_init_vectors,
210 },
211 {
212 ARRAY_SIZE(mdp_ui_vectors),
213 mdp_ui_vectors,
214 },
215 {
216 ARRAY_SIZE(mdp_ui_vectors),
217 mdp_ui_vectors,
218 },
219 {
220 ARRAY_SIZE(mdp_vga_vectors),
221 mdp_vga_vectors,
222 },
223 {
224 ARRAY_SIZE(mdp_720p_vectors),
225 mdp_720p_vectors,
226 },
227 {
228 ARRAY_SIZE(mdp_1080p_vectors),
229 mdp_1080p_vectors,
230 },
231};
232
233static struct msm_bus_scale_pdata mdp_bus_scale_pdata = {
234 mdp_bus_scale_usecases,
235 ARRAY_SIZE(mdp_bus_scale_usecases),
236 .name = "mdp",
237};
238
Huaibin Yang4a084e32011-12-15 15:25:52 -0800239static int mdp_core_clk_rate_table[] = {
Nagamalleswararao Ganji90111f22012-06-01 00:51:33 -0700240 59080000,
Huaibin Yang0962b922012-03-27 10:11:48 -0700241 128000000,
242 160000000,
Ravishangar Kalyanamc2fee312012-02-09 19:11:22 -0800243 200000000,
Huaibin Yang4a084e32011-12-15 15:25:52 -0800244};
245
246static struct msm_panel_common_pdata mdp_pdata = {
247 .gpio = MDP_VSYNC_GPIO,
Nagamalleswararao Ganji90111f22012-06-01 00:51:33 -0700248 .mdp_core_clk_rate = 59080000,
Huaibin Yang4a084e32011-12-15 15:25:52 -0800249 .mdp_core_clk_table = mdp_core_clk_rate_table,
250 .num_mdp_clk = ARRAY_SIZE(mdp_core_clk_rate_table),
Ravishangar Kalyanam59a67b12012-02-13 14:29:56 -0800251 .mdp_bus_scale_table = &mdp_bus_scale_pdata,
Huaibin Yang4a084e32011-12-15 15:25:52 -0800252 .mdp_rev = MDP_REV_44,
253#ifdef CONFIG_MSM_MULTIMEDIA_USE_ION
Ravishangar Kalyanama3b168b2012-03-26 11:13:11 -0700254 .mem_hid = BIT(ION_CP_MM_HEAP_ID),
Huaibin Yang4a084e32011-12-15 15:25:52 -0800255#else
256 .mem_hid = MEMTYPE_EBI1,
257#endif
Olav Hauganef95ae32012-05-15 09:50:30 -0700258 .mdp_iommu_split_domain = 1,
Huaibin Yang4a084e32011-12-15 15:25:52 -0800259};
260
261void __init apq8064_mdp_writeback(struct memtype_reserve* reserve_table)
262{
263 mdp_pdata.ov0_wb_size = MSM_FB_OVERLAY0_WRITEBACK_SIZE;
264 mdp_pdata.ov1_wb_size = MSM_FB_OVERLAY1_WRITEBACK_SIZE;
265#if defined(CONFIG_ANDROID_PMEM) && !defined(CONFIG_MSM_MULTIMEDIA_USE_ION)
266 reserve_table[mdp_pdata.mem_hid].size +=
267 mdp_pdata.ov0_wb_size;
268 reserve_table[mdp_pdata.mem_hid].size +=
269 mdp_pdata.ov1_wb_size;
270#endif
271}
272
Aravind Venkateswaran0507c8c2012-02-16 17:16:05 -0800273static struct resource hdmi_msm_resources[] = {
274 {
275 .name = "hdmi_msm_qfprom_addr",
276 .start = 0x00700000,
277 .end = 0x007060FF,
278 .flags = IORESOURCE_MEM,
279 },
280 {
281 .name = "hdmi_msm_hdmi_addr",
282 .start = 0x04A00000,
283 .end = 0x04A00FFF,
284 .flags = IORESOURCE_MEM,
285 },
286 {
287 .name = "hdmi_msm_irq",
288 .start = HDMI_IRQ,
289 .end = HDMI_IRQ,
290 .flags = IORESOURCE_IRQ,
291 },
292};
293
294static int hdmi_enable_5v(int on);
295static int hdmi_core_power(int on, int show);
296static int hdmi_cec_power(int on);
Ajay Singh Parmar7d11c272012-06-07 12:25:31 +0530297static int hdmi_gpio_config(int on);
298static int hdmi_panel_power(int on);
Aravind Venkateswaran0507c8c2012-02-16 17:16:05 -0800299
300static struct msm_hdmi_platform_data hdmi_msm_data = {
301 .irq = HDMI_IRQ,
302 .enable_5v = hdmi_enable_5v,
303 .core_power = hdmi_core_power,
304 .cec_power = hdmi_cec_power,
Ajay Singh Parmar7d11c272012-06-07 12:25:31 +0530305 .panel_power = hdmi_panel_power,
306 .gpio_config = hdmi_gpio_config,
Aravind Venkateswaran0507c8c2012-02-16 17:16:05 -0800307};
308
309static struct platform_device hdmi_msm_device = {
310 .name = "hdmi_msm",
311 .id = 0,
312 .num_resources = ARRAY_SIZE(hdmi_msm_resources),
313 .resource = hdmi_msm_resources,
314 .dev.platform_data = &hdmi_msm_data,
315};
316
Olav Hauganef95ae32012-05-15 09:50:30 -0700317static char wfd_check_mdp_iommu_split_domain(void)
318{
319 return mdp_pdata.mdp_iommu_split_domain;
320}
321
Mohan Kumar Gubbihalli Lachma Naikcb7d4e72012-03-23 18:17:30 -0700322#ifdef CONFIG_FB_MSM_WRITEBACK_MSM_PANEL
Olav Hauganef95ae32012-05-15 09:50:30 -0700323static struct msm_wfd_platform_data wfd_pdata = {
324 .wfd_check_mdp_iommu_split = wfd_check_mdp_iommu_split_domain,
325};
326
Mohan Kumar Gubbihalli Lachma Naikcb7d4e72012-03-23 18:17:30 -0700327static struct platform_device wfd_panel_device = {
328 .name = "wfd_panel",
329 .id = 0,
330 .dev.platform_data = NULL,
331};
332
333static struct platform_device wfd_device = {
334 .name = "msm_wfd",
335 .id = -1,
Olav Hauganef95ae32012-05-15 09:50:30 -0700336 .dev.platform_data = &wfd_pdata,
Mohan Kumar Gubbihalli Lachma Naikcb7d4e72012-03-23 18:17:30 -0700337};
338#endif
339
Aravind Venkateswaran0507c8c2012-02-16 17:16:05 -0800340/* HDMI related GPIOs */
341#define HDMI_CEC_VAR_GPIO 69
342#define HDMI_DDC_CLK_GPIO 70
343#define HDMI_DDC_DATA_GPIO 71
344#define HDMI_HPD_GPIO 72
345
Ravishangar Kalyanamc2fee312012-02-09 19:11:22 -0800346static bool dsi_power_on;
347static int mipi_dsi_panel_power(int on)
348{
349 static struct regulator *reg_lvs7, *reg_l2, *reg_l11, *reg_ext_3p3v;
350 static int gpio36, gpio25, gpio26, mpp3;
351 int rc;
352
353 pr_debug("%s: on=%d\n", __func__, on);
354
355 if (!dsi_power_on) {
356 reg_lvs7 = regulator_get(&msm_mipi_dsi1_device.dev,
357 "dsi1_vddio");
358 if (IS_ERR_OR_NULL(reg_lvs7)) {
359 pr_err("could not get 8921_lvs7, rc = %ld\n",
360 PTR_ERR(reg_lvs7));
361 return -ENODEV;
362 }
363
364 reg_l2 = regulator_get(&msm_mipi_dsi1_device.dev,
365 "dsi1_pll_vdda");
366 if (IS_ERR_OR_NULL(reg_l2)) {
367 pr_err("could not get 8921_l2, rc = %ld\n",
368 PTR_ERR(reg_l2));
369 return -ENODEV;
370 }
371
372 rc = regulator_set_voltage(reg_l2, 1200000, 1200000);
373 if (rc) {
374 pr_err("set_voltage l2 failed, rc=%d\n", rc);
375 return -EINVAL;
376 }
377 reg_l11 = regulator_get(&msm_mipi_dsi1_device.dev,
378 "dsi1_avdd");
379 if (IS_ERR(reg_l11)) {
380 pr_err("could not get 8921_l11, rc = %ld\n",
381 PTR_ERR(reg_l11));
382 return -ENODEV;
383 }
384 rc = regulator_set_voltage(reg_l11, 3000000, 3000000);
385 if (rc) {
386 pr_err("set_voltage l11 failed, rc=%d\n", rc);
387 return -EINVAL;
388 }
389
390 if (machine_is_apq8064_liquid()) {
391 reg_ext_3p3v = regulator_get(&msm_mipi_dsi1_device.dev,
392 "dsi1_vccs_3p3v");
393 if (IS_ERR_OR_NULL(reg_ext_3p3v)) {
394 pr_err("could not get reg_ext_3p3v, rc = %ld\n",
395 PTR_ERR(reg_ext_3p3v));
396 reg_ext_3p3v = NULL;
397 return -ENODEV;
398 }
399 mpp3 = PM8921_MPP_PM_TO_SYS(3);
400 rc = gpio_request(mpp3, "backlight_en");
401 if (rc) {
402 pr_err("request mpp3 failed, rc=%d\n", rc);
403 return -ENODEV;
404 }
405 }
406
407 gpio25 = PM8921_GPIO_PM_TO_SYS(25);
408 rc = gpio_request(gpio25, "disp_rst_n");
409 if (rc) {
410 pr_err("request gpio 25 failed, rc=%d\n", rc);
411 return -ENODEV;
412 }
413
414 gpio26 = PM8921_GPIO_PM_TO_SYS(26);
415 rc = gpio_request(gpio26, "pwm_backlight_ctrl");
416 if (rc) {
417 pr_err("request gpio 26 failed, rc=%d\n", rc);
418 return -ENODEV;
419 }
420
421 gpio36 = PM8921_GPIO_PM_TO_SYS(36); /* lcd1_pwr_en_n */
422 rc = gpio_request(gpio36, "lcd1_pwr_en_n");
423 if (rc) {
424 pr_err("request gpio 36 failed, rc=%d\n", rc);
425 return -ENODEV;
426 }
427
428 dsi_power_on = true;
429 }
430
431 if (on) {
432 rc = regulator_enable(reg_lvs7);
433 if (rc) {
434 pr_err("enable lvs7 failed, rc=%d\n", rc);
435 return -ENODEV;
436 }
437
438 rc = regulator_set_optimum_mode(reg_l11, 110000);
439 if (rc < 0) {
440 pr_err("set_optimum_mode l11 failed, rc=%d\n", rc);
441 return -EINVAL;
442 }
443 rc = regulator_enable(reg_l11);
444 if (rc) {
445 pr_err("enable l11 failed, rc=%d\n", rc);
446 return -ENODEV;
447 }
448
449 rc = regulator_set_optimum_mode(reg_l2, 100000);
450 if (rc < 0) {
451 pr_err("set_optimum_mode l2 failed, rc=%d\n", rc);
452 return -EINVAL;
453 }
454 rc = regulator_enable(reg_l2);
455 if (rc) {
456 pr_err("enable l2 failed, rc=%d\n", rc);
457 return -ENODEV;
458 }
459
460 if (machine_is_apq8064_liquid()) {
461 rc = regulator_enable(reg_ext_3p3v);
462 if (rc) {
463 pr_err("enable reg_ext_3p3v failed, rc=%d\n",
464 rc);
465 return -ENODEV;
466 }
467 gpio_set_value_cansleep(mpp3, 1);
468 }
469
470 gpio_set_value_cansleep(gpio36, 0);
471 gpio_set_value_cansleep(gpio25, 1);
472 } else {
473 gpio_set_value_cansleep(gpio25, 0);
474 gpio_set_value_cansleep(gpio36, 1);
475
476 if (machine_is_apq8064_liquid()) {
477 gpio_set_value_cansleep(mpp3, 0);
478
479 rc = regulator_disable(reg_ext_3p3v);
480 if (rc) {
481 pr_err("disable reg_ext_3p3v failed, rc=%d\n",
482 rc);
483 return -ENODEV;
484 }
485 }
486
Nagamalleswararao Ganji15ad5ac2012-06-20 20:50:01 -0700487 rc = regulator_disable(reg_l11);
488 if (rc) {
489 pr_err("disable reg_l1 failed, rc=%d\n", rc);
490 return -ENODEV;
491 }
492
Ravishangar Kalyanamc2fee312012-02-09 19:11:22 -0800493 rc = regulator_disable(reg_lvs7);
494 if (rc) {
495 pr_err("disable reg_lvs7 failed, rc=%d\n", rc);
496 return -ENODEV;
497 }
Nagamalleswararao Ganji15ad5ac2012-06-20 20:50:01 -0700498
Ravishangar Kalyanamc2fee312012-02-09 19:11:22 -0800499 rc = regulator_disable(reg_l2);
500 if (rc) {
501 pr_err("disable reg_l2 failed, rc=%d\n", rc);
502 return -ENODEV;
503 }
504 }
505
506 return 0;
507}
508
509static struct mipi_dsi_platform_data mipi_dsi_pdata = {
510 .dsi_power_save = mipi_dsi_panel_power,
511};
512
513static bool lvds_power_on;
514static int lvds_panel_power(int on)
515{
516 static struct regulator *reg_lvs7, *reg_l2, *reg_ext_3p3v;
517 static int gpio36, gpio26, mpp3;
518 int rc;
519
520 pr_debug("%s: on=%d\n", __func__, on);
521
522 if (!lvds_power_on) {
523 reg_lvs7 = regulator_get(&msm_lvds_device.dev,
524 "lvds_vdda");
525 if (IS_ERR_OR_NULL(reg_lvs7)) {
526 pr_err("could not get 8921_lvs7, rc = %ld\n",
527 PTR_ERR(reg_lvs7));
528 return -ENODEV;
529 }
530
531 reg_l2 = regulator_get(&msm_lvds_device.dev,
532 "lvds_pll_vdda");
533 if (IS_ERR_OR_NULL(reg_l2)) {
534 pr_err("could not get 8921_l2, rc = %ld\n",
535 PTR_ERR(reg_l2));
536 return -ENODEV;
537 }
538
539 rc = regulator_set_voltage(reg_l2, 1200000, 1200000);
540 if (rc) {
541 pr_err("set_voltage l2 failed, rc=%d\n", rc);
542 return -EINVAL;
543 }
544
545 reg_ext_3p3v = regulator_get(&msm_lvds_device.dev,
546 "lvds_vccs_3p3v");
547 if (IS_ERR_OR_NULL(reg_ext_3p3v)) {
548 pr_err("could not get reg_ext_3p3v, rc = %ld\n",
549 PTR_ERR(reg_ext_3p3v));
550 return -ENODEV;
551 }
552
553 gpio26 = PM8921_GPIO_PM_TO_SYS(26);
554 rc = gpio_request(gpio26, "pwm_backlight_ctrl");
555 if (rc) {
556 pr_err("request gpio 26 failed, rc=%d\n", rc);
557 return -ENODEV;
558 }
559
560 gpio36 = PM8921_GPIO_PM_TO_SYS(36); /* lcd1_pwr_en_n */
561 rc = gpio_request(gpio36, "lcd1_pwr_en_n");
562 if (rc) {
563 pr_err("request gpio 36 failed, rc=%d\n", rc);
564 return -ENODEV;
565 }
566
567 mpp3 = PM8921_MPP_PM_TO_SYS(3);
568 rc = gpio_request(mpp3, "backlight_en");
569 if (rc) {
570 pr_err("request mpp3 failed, rc=%d\n", rc);
571 return -ENODEV;
572 }
573
574 lvds_power_on = true;
575 }
576
577 if (on) {
578 rc = regulator_enable(reg_lvs7);
579 if (rc) {
580 pr_err("enable lvs7 failed, rc=%d\n", rc);
581 return -ENODEV;
582 }
583
584 rc = regulator_set_optimum_mode(reg_l2, 100000);
585 if (rc < 0) {
586 pr_err("set_optimum_mode l2 failed, rc=%d\n", rc);
587 return -EINVAL;
588 }
589 rc = regulator_enable(reg_l2);
590 if (rc) {
591 pr_err("enable l2 failed, rc=%d\n", rc);
592 return -ENODEV;
593 }
594
595 rc = regulator_enable(reg_ext_3p3v);
596 if (rc) {
597 pr_err("enable reg_ext_3p3v failed, rc=%d\n", rc);
598 return -ENODEV;
599 }
600
601 gpio_set_value_cansleep(gpio36, 0);
602 gpio_set_value_cansleep(mpp3, 1);
603 } else {
604 gpio_set_value_cansleep(mpp3, 0);
605 gpio_set_value_cansleep(gpio36, 1);
606
607 rc = regulator_disable(reg_lvs7);
608 if (rc) {
609 pr_err("disable reg_lvs7 failed, rc=%d\n", rc);
610 return -ENODEV;
611 }
612 rc = regulator_disable(reg_l2);
613 if (rc) {
614 pr_err("disable reg_l2 failed, rc=%d\n", rc);
615 return -ENODEV;
616 }
617 rc = regulator_disable(reg_ext_3p3v);
618 if (rc) {
619 pr_err("disable reg_ext_3p3v failed, rc=%d\n", rc);
620 return -ENODEV;
621 }
622 }
623
624 return 0;
625}
626
Huaibin Yang02f981c2012-02-27 16:58:41 -0800627static int lvds_pixel_remap(void)
628{
Lei Zhou34e216d2012-07-25 12:52:13 -0400629 u32 ver = socinfo_get_version();
630
Huaibin Yang02f981c2012-02-27 16:58:41 -0800631 if (machine_is_apq8064_cdp() ||
632 machine_is_apq8064_liquid()) {
Huaibin Yang02f981c2012-02-27 16:58:41 -0800633 if ((SOCINFO_VERSION_MAJOR(ver) == 1) &&
634 (SOCINFO_VERSION_MINOR(ver) == 0))
Zhang Chang Ken4a07fcb2012-06-03 11:24:51 -0400635 return LVDS_PIXEL_MAP_PATTERN_1;
636 } else if (machine_is_mpq8064_dtv()) {
Lei Zhou34e216d2012-07-25 12:52:13 -0400637 if ((SOCINFO_VERSION_MAJOR(ver) == 1) &&
638 (SOCINFO_VERSION_MINOR(ver) == 0))
639 return LVDS_PIXEL_MAP_PATTERN_2;
Huaibin Yang02f981c2012-02-27 16:58:41 -0800640 }
641 return 0;
642}
643
Ravishangar Kalyanamc2fee312012-02-09 19:11:22 -0800644static struct lcdc_platform_data lvds_pdata = {
645 .lcdc_power_save = lvds_panel_power,
Huaibin Yang02f981c2012-02-27 16:58:41 -0800646 .lvds_pixel_remap = lvds_pixel_remap
Ravishangar Kalyanamc2fee312012-02-09 19:11:22 -0800647};
648
649#define LPM_CHANNEL 2
650static int lvds_chimei_gpio[] = {LPM_CHANNEL};
651
652static struct lvds_panel_platform_data lvds_chimei_pdata = {
653 .gpio = lvds_chimei_gpio,
654};
655
656static struct platform_device lvds_chimei_panel_device = {
657 .name = "lvds_chimei_wxga",
658 .id = 0,
659 .dev = {
660 .platform_data = &lvds_chimei_pdata,
661 }
662};
663
Zhang Chang Ken4a07fcb2012-06-03 11:24:51 -0400664#define FRC_GPIO_UPDATE (SX150X_EXP4_GPIO_BASE + 8)
665#define FRC_GPIO_RESET (SX150X_EXP4_GPIO_BASE + 9)
666#define FRC_GPIO_PWR (SX150X_EXP4_GPIO_BASE + 10)
667
668static int lvds_frc_gpio[] = {FRC_GPIO_UPDATE, FRC_GPIO_RESET, FRC_GPIO_PWR};
669static struct lvds_panel_platform_data lvds_frc_pdata = {
670 .gpio = lvds_frc_gpio,
671};
672
673static struct platform_device lvds_frc_panel_device = {
674 .name = "lvds_frc_fhd",
675 .id = 0,
676 .dev = {
677 .platform_data = &lvds_frc_pdata,
678 }
679};
680
Ravishangar Kalyanamc2fee312012-02-09 19:11:22 -0800681static int dsi2lvds_gpio[2] = {
682 LPM_CHANNEL,/* Backlight PWM-ID=0 for PMIC-GPIO#24 */
683 0x1F08 /* DSI2LVDS Bridge GPIO Output, mask=0x1f, out=0x08 */
684};
685static struct msm_panel_common_pdata mipi_dsi2lvds_pdata = {
686 .gpio_num = dsi2lvds_gpio,
687};
688
689static struct platform_device mipi_dsi2lvds_bridge_device = {
690 .name = "mipi_tc358764",
691 .id = 0,
692 .dev.platform_data = &mipi_dsi2lvds_pdata,
693};
694
695static int toshiba_gpio[] = {LPM_CHANNEL};
696static struct mipi_dsi_panel_platform_data toshiba_pdata = {
697 .gpio = toshiba_gpio,
698};
699
700static struct platform_device mipi_dsi_toshiba_panel_device = {
701 .name = "mipi_toshiba",
702 .id = 0,
703 .dev = {
704 .platform_data = &toshiba_pdata,
705 }
706};
707
Aravind Venkateswaran0507c8c2012-02-16 17:16:05 -0800708static struct msm_bus_vectors dtv_bus_init_vectors[] = {
709 {
710 .src = MSM_BUS_MASTER_MDP_PORT0,
711 .dst = MSM_BUS_SLAVE_EBI_CH0,
712 .ab = 0,
713 .ib = 0,
714 },
715};
716
Aravind Venkateswaran0507c8c2012-02-16 17:16:05 -0800717static struct msm_bus_vectors dtv_bus_def_vectors[] = {
718 {
719 .src = MSM_BUS_MASTER_MDP_PORT0,
720 .dst = MSM_BUS_SLAVE_EBI_CH0,
721 .ab = 566092800 * 2,
722 .ib = 707616000 * 2,
723 },
724};
Aravind Venkateswaran0507c8c2012-02-16 17:16:05 -0800725
726static struct msm_bus_paths dtv_bus_scale_usecases[] = {
727 {
728 ARRAY_SIZE(dtv_bus_init_vectors),
729 dtv_bus_init_vectors,
730 },
731 {
732 ARRAY_SIZE(dtv_bus_def_vectors),
733 dtv_bus_def_vectors,
734 },
735};
736static struct msm_bus_scale_pdata dtv_bus_scale_pdata = {
737 dtv_bus_scale_usecases,
738 ARRAY_SIZE(dtv_bus_scale_usecases),
739 .name = "dtv",
740};
741
742static struct lcdc_platform_data dtv_pdata = {
743 .bus_scale_table = &dtv_bus_scale_pdata,
Ajay Singh Parmar7d11c272012-06-07 12:25:31 +0530744 .lcdc_power_save = hdmi_panel_power,
Aravind Venkateswaran0507c8c2012-02-16 17:16:05 -0800745};
746
Ajay Singh Parmar7d11c272012-06-07 12:25:31 +0530747static int hdmi_panel_power(int on)
748{
749 int rc;
750
751 pr_debug("%s: HDMI Core: %s\n", __func__, (on ? "ON" : "OFF"));
752 rc = hdmi_core_power(on, 1);
753 if (rc)
754 rc = hdmi_cec_power(on);
755
756 pr_debug("%s: HDMI Core: %s Success\n", __func__, (on ? "ON" : "OFF"));
757 return rc;
758}
759
Aravind Venkateswaran0507c8c2012-02-16 17:16:05 -0800760static int hdmi_enable_5v(int on)
761{
762 /* TBD: PM8921 regulator instead of 8901 */
763 static struct regulator *reg_8921_hdmi_mvs; /* HDMI_5V */
764 static int prev_on;
765 int rc;
766
767 if (on == prev_on)
768 return 0;
769
770 if (!reg_8921_hdmi_mvs) {
771 reg_8921_hdmi_mvs = regulator_get(&hdmi_msm_device.dev,
772 "hdmi_mvs");
773 if (IS_ERR(reg_8921_hdmi_mvs)) {
774 pr_err("could not get reg_8921_hdmi_mvs, rc = %ld\n",
775 PTR_ERR(reg_8921_hdmi_mvs));
776 reg_8921_hdmi_mvs = NULL;
777 return -ENODEV;
778 }
779 }
780
781 if (on) {
782 rc = regulator_enable(reg_8921_hdmi_mvs);
783 if (rc) {
784 pr_err("'%s' regulator enable failed, rc=%d\n",
785 "8921_hdmi_mvs", rc);
786 return rc;
787 }
788 pr_debug("%s(on): success\n", __func__);
789 } else {
790 rc = regulator_disable(reg_8921_hdmi_mvs);
791 if (rc)
792 pr_warning("'%s' regulator disable failed, rc=%d\n",
793 "8921_hdmi_mvs", rc);
794 pr_debug("%s(off): success\n", __func__);
795 }
796
797 prev_on = on;
798
799 return 0;
800}
801
802static int hdmi_core_power(int on, int show)
803{
804 static struct regulator *reg_8921_lvs7, *reg_8921_s4, *reg_ext_3p3v;
805 static int prev_on;
806 int rc;
Aravind Venkateswaran0507c8c2012-02-16 17:16:05 -0800807
808 if (on == prev_on)
809 return 0;
810
811 /* TBD: PM8921 regulator instead of 8901 */
812 if (!reg_ext_3p3v) {
813 reg_ext_3p3v = regulator_get(&hdmi_msm_device.dev,
814 "hdmi_mux_vdd");
815 if (IS_ERR_OR_NULL(reg_ext_3p3v)) {
816 pr_err("could not get reg_ext_3p3v, rc = %ld\n",
817 PTR_ERR(reg_ext_3p3v));
818 reg_ext_3p3v = NULL;
819 return -ENODEV;
820 }
821 }
822
823 if (!reg_8921_lvs7) {
824 reg_8921_lvs7 = regulator_get(&hdmi_msm_device.dev,
825 "hdmi_vdda");
826 if (IS_ERR(reg_8921_lvs7)) {
827 pr_err("could not get reg_8921_lvs7, rc = %ld\n",
828 PTR_ERR(reg_8921_lvs7));
829 reg_8921_lvs7 = NULL;
830 return -ENODEV;
831 }
832 }
833 if (!reg_8921_s4) {
834 reg_8921_s4 = regulator_get(&hdmi_msm_device.dev,
835 "hdmi_lvl_tsl");
836 if (IS_ERR(reg_8921_s4)) {
837 pr_err("could not get reg_8921_s4, rc = %ld\n",
838 PTR_ERR(reg_8921_s4));
839 reg_8921_s4 = NULL;
840 return -ENODEV;
841 }
842 rc = regulator_set_voltage(reg_8921_s4, 1800000, 1800000);
843 if (rc) {
844 pr_err("set_voltage failed for 8921_s4, rc=%d\n", rc);
845 return -EINVAL;
846 }
847 }
848
849 if (on) {
850 /*
851 * Configure 3P3V_BOOST_EN as GPIO, 8mA drive strength,
852 * pull none, out-high
853 */
854 rc = regulator_set_optimum_mode(reg_ext_3p3v, 290000);
855 if (rc < 0) {
856 pr_err("set_optimum_mode ext_3p3v failed, rc=%d\n", rc);
857 return -EINVAL;
858 }
859
860 rc = regulator_enable(reg_ext_3p3v);
861 if (rc) {
862 pr_err("enable reg_ext_3p3v failed, rc=%d\n", rc);
Ajay Singh Parmar7d11c272012-06-07 12:25:31 +0530863 return rc;
Aravind Venkateswaran0507c8c2012-02-16 17:16:05 -0800864 }
865 rc = regulator_enable(reg_8921_lvs7);
866 if (rc) {
867 pr_err("'%s' regulator enable failed, rc=%d\n",
868 "hdmi_vdda", rc);
Ajay Singh Parmar7d11c272012-06-07 12:25:31 +0530869 goto error1;
Aravind Venkateswaran0507c8c2012-02-16 17:16:05 -0800870 }
871 rc = regulator_enable(reg_8921_s4);
872 if (rc) {
873 pr_err("'%s' regulator enable failed, rc=%d\n",
874 "hdmi_lvl_tsl", rc);
Ajay Singh Parmar7d11c272012-06-07 12:25:31 +0530875 goto error2;
Aravind Venkateswaran0507c8c2012-02-16 17:16:05 -0800876 }
Ajay Singh Parmar7d11c272012-06-07 12:25:31 +0530877 pr_debug("%s(on): success\n", __func__);
878 } else {
879 rc = regulator_disable(reg_ext_3p3v);
880 if (rc) {
881 pr_err("disable reg_ext_3p3v failed, rc=%d\n", rc);
882 return -ENODEV;
883 }
884 rc = regulator_disable(reg_8921_lvs7);
885 if (rc) {
886 pr_err("disable reg_8921_l23 failed, rc=%d\n", rc);
887 return -ENODEV;
888 }
889 rc = regulator_disable(reg_8921_s4);
890 if (rc) {
891 pr_err("disable reg_8921_s4 failed, rc=%d\n", rc);
892 return -ENODEV;
893 }
894 pr_debug("%s(off): success\n", __func__);
895 }
896
897 prev_on = on;
898
899 return 0;
900
901error2:
902 regulator_disable(reg_8921_lvs7);
903error1:
904 regulator_disable(reg_ext_3p3v);
905 return rc;
906}
907
908static int hdmi_gpio_config(int on)
909{
910 int rc = 0;
911 static int prev_on;
912 int pmic_gpio14 = PM8921_GPIO_PM_TO_SYS(14);
913
914 if (on == prev_on)
915 return 0;
916
917 if (on) {
Aravind Venkateswaran0507c8c2012-02-16 17:16:05 -0800918 rc = gpio_request(HDMI_DDC_CLK_GPIO, "HDMI_DDC_CLK");
919 if (rc) {
920 pr_err("'%s'(%d) gpio_request failed, rc=%d\n",
921 "HDMI_DDC_CLK", HDMI_DDC_CLK_GPIO, rc);
922 goto error1;
923 }
924 rc = gpio_request(HDMI_DDC_DATA_GPIO, "HDMI_DDC_DATA");
925 if (rc) {
926 pr_err("'%s'(%d) gpio_request failed, rc=%d\n",
927 "HDMI_DDC_DATA", HDMI_DDC_DATA_GPIO, rc);
928 goto error2;
929 }
930 rc = gpio_request(HDMI_HPD_GPIO, "HDMI_HPD");
931 if (rc) {
932 pr_err("'%s'(%d) gpio_request failed, rc=%d\n",
933 "HDMI_HPD", HDMI_HPD_GPIO, rc);
934 goto error3;
935 }
936 if (machine_is_apq8064_liquid()) {
937 rc = gpio_request(pmic_gpio14, "PMIC_HDMI_MUX_SEL");
938 if (rc) {
939 pr_err("'%s'(%d) gpio_request failed, rc=%d\n",
940 "PMIC_HDMI_MUX_SEL", 14, rc);
941 goto error4;
942 }
943 gpio_set_value_cansleep(pmic_gpio14, 0);
944 }
945 pr_debug("%s(on): success\n", __func__);
946 } else {
947 gpio_free(HDMI_DDC_CLK_GPIO);
948 gpio_free(HDMI_DDC_DATA_GPIO);
949 gpio_free(HDMI_HPD_GPIO);
950
951 if (machine_is_apq8064_liquid()) {
952 gpio_set_value_cansleep(pmic_gpio14, 1);
953 gpio_free(pmic_gpio14);
954 }
Aravind Venkateswaran0507c8c2012-02-16 17:16:05 -0800955 pr_debug("%s(off): success\n", __func__);
956 }
957
958 prev_on = on;
Aravind Venkateswaran0507c8c2012-02-16 17:16:05 -0800959 return 0;
960
961error4:
962 gpio_free(HDMI_HPD_GPIO);
963error3:
964 gpio_free(HDMI_DDC_DATA_GPIO);
965error2:
966 gpio_free(HDMI_DDC_CLK_GPIO);
967error1:
Aravind Venkateswaran0507c8c2012-02-16 17:16:05 -0800968 return rc;
969}
970
971static int hdmi_cec_power(int on)
972{
973 static int prev_on;
974 int rc;
975
976 if (on == prev_on)
977 return 0;
978
979 if (on) {
980 rc = gpio_request(HDMI_CEC_VAR_GPIO, "HDMI_CEC_VAR");
981 if (rc) {
982 pr_err("'%s'(%d) gpio_request failed, rc=%d\n",
983 "HDMI_CEC_VAR", HDMI_CEC_VAR_GPIO, rc);
984 goto error;
985 }
986 pr_debug("%s(on): success\n", __func__);
987 } else {
988 gpio_free(HDMI_CEC_VAR_GPIO);
989 pr_debug("%s(off): success\n", __func__);
990 }
991
992 prev_on = on;
993
994 return 0;
995error:
996 return rc;
997}
998
Huaibin Yang4a084e32011-12-15 15:25:52 -0800999void __init apq8064_init_fb(void)
1000{
1001 platform_device_register(&msm_fb_device);
Ravishangar Kalyanamc2fee312012-02-09 19:11:22 -08001002 platform_device_register(&lvds_chimei_panel_device);
1003
Mohan Kumar Gubbihalli Lachma Naikcb7d4e72012-03-23 18:17:30 -07001004#ifdef CONFIG_FB_MSM_WRITEBACK_MSM_PANEL
1005 platform_device_register(&wfd_panel_device);
1006 platform_device_register(&wfd_device);
1007#endif
1008
Ravishangar Kalyanamc2fee312012-02-09 19:11:22 -08001009 if (machine_is_apq8064_liquid())
1010 platform_device_register(&mipi_dsi2lvds_bridge_device);
1011 if (machine_is_apq8064_mtp())
1012 platform_device_register(&mipi_dsi_toshiba_panel_device);
Zhang Chang Ken4a07fcb2012-06-03 11:24:51 -04001013 if (machine_is_mpq8064_dtv())
1014 platform_device_register(&lvds_frc_panel_device);
Ravishangar Kalyanamc2fee312012-02-09 19:11:22 -08001015
Huaibin Yang4a084e32011-12-15 15:25:52 -08001016 msm_fb_register_device("mdp", &mdp_pdata);
Ravishangar Kalyanamc2fee312012-02-09 19:11:22 -08001017 msm_fb_register_device("lvds", &lvds_pdata);
1018 msm_fb_register_device("mipi_dsi", &mipi_dsi_pdata);
Aravind Venkateswaran0507c8c2012-02-16 17:16:05 -08001019 platform_device_register(&hdmi_msm_device);
1020 msm_fb_register_device("dtv", &dtv_pdata);
Huaibin Yang4a084e32011-12-15 15:25:52 -08001021}
Aravind Venkateswaran8ac7f412012-03-16 17:57:30 -07001022
1023/**
1024 * Set MDP clocks to high frequency to avoid DSI underflow
1025 * when using high resolution 1200x1920 WUXGA panels
1026 */
1027static void set_mdp_clocks_for_wuxga(void)
1028{
1029 int i;
1030
1031 mdp_ui_vectors[0].ab = 2000000000;
1032 mdp_ui_vectors[0].ib = 2000000000;
1033 mdp_vga_vectors[0].ab = 2000000000;
1034 mdp_vga_vectors[0].ib = 2000000000;
1035 mdp_720p_vectors[0].ab = 2000000000;
1036 mdp_720p_vectors[0].ib = 2000000000;
1037 mdp_1080p_vectors[0].ab = 2000000000;
1038 mdp_1080p_vectors[0].ib = 2000000000;
1039
1040 mdp_pdata.mdp_core_clk_rate = 200000000;
1041
1042 for (i = 0; i < ARRAY_SIZE(mdp_core_clk_rate_table); i++)
1043 mdp_core_clk_rate_table[i] = 200000000;
1044
Ravishangar Kalyanamfda36c42012-03-26 16:28:19 -07001045 if (apq8064_hdmi_as_primary_selected()) {
Aravind Venkateswaran8ac7f412012-03-16 17:57:30 -07001046 dtv_bus_def_vectors[0].ab = 2000000000;
1047 dtv_bus_def_vectors[0].ib = 2000000000;
1048 }
1049}
1050
Ajay Singh Parmar6b82d2b2012-07-19 17:23:26 +05301051void __init apq8064_set_display_params(char *prim_panel, char *ext_panel,
1052 unsigned char resolution)
Aravind Venkateswaran8ac7f412012-03-16 17:57:30 -07001053{
Aravind Venkateswarand98bc432012-04-04 16:19:06 -07001054 /*
1055 * For certain MPQ boards, HDMI should be set as primary display
1056 * by default, with the flexibility to specify any other panel
1057 * as a primary panel through boot parameters.
1058 */
1059 if (machine_is_mpq8064_hrd() || machine_is_mpq8064_cdp()) {
1060 pr_debug("HDMI is the primary display by default for MPQ\n");
1061 if (!strnlen(prim_panel, PANEL_NAME_MAX_LEN))
1062 strlcpy(msm_fb_pdata.prim_panel_name, HDMI_PANEL_NAME,
1063 PANEL_NAME_MAX_LEN);
1064 }
1065
Aravind Venkateswaran8ac7f412012-03-16 17:57:30 -07001066 if (strnlen(prim_panel, PANEL_NAME_MAX_LEN)) {
1067 strlcpy(msm_fb_pdata.prim_panel_name, prim_panel,
1068 PANEL_NAME_MAX_LEN);
1069 pr_debug("msm_fb_pdata.prim_panel_name %s\n",
1070 msm_fb_pdata.prim_panel_name);
1071
1072 if (!strncmp((char *)msm_fb_pdata.prim_panel_name,
1073 HDMI_PANEL_NAME, strnlen(HDMI_PANEL_NAME,
1074 PANEL_NAME_MAX_LEN))) {
1075 pr_debug("HDMI is the primary display by"
1076 " boot parameter\n");
1077 hdmi_is_primary = 1;
1078 set_mdp_clocks_for_wuxga();
1079 }
1080 }
1081 if (strnlen(ext_panel, PANEL_NAME_MAX_LEN)) {
1082 strlcpy(msm_fb_pdata.ext_panel_name, ext_panel,
1083 PANEL_NAME_MAX_LEN);
1084 pr_debug("msm_fb_pdata.ext_panel_name %s\n",
1085 msm_fb_pdata.ext_panel_name);
1086 }
Ajay Singh Parmar6b82d2b2012-07-19 17:23:26 +05301087
1088 msm_fb_pdata.ext_resolution = resolution;
Aravind Venkateswaran8ac7f412012-03-16 17:57:30 -07001089}