blob: 8a6c2eb943d501176a51486892e8cfdef75bbb1d [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 struct msm_panel_common_pdata mdp_pdata = {
240 .gpio = MDP_VSYNC_GPIO,
Siddhartha Agrawal496f9282012-08-15 17:41:34 -0700241 .mdp_max_clk = 200000000,
Ravishangar Kalyanam59a67b12012-02-13 14:29:56 -0800242 .mdp_bus_scale_table = &mdp_bus_scale_pdata,
Huaibin Yang4a084e32011-12-15 15:25:52 -0800243 .mdp_rev = MDP_REV_44,
244#ifdef CONFIG_MSM_MULTIMEDIA_USE_ION
Ravishangar Kalyanama3b168b2012-03-26 11:13:11 -0700245 .mem_hid = BIT(ION_CP_MM_HEAP_ID),
Huaibin Yang4a084e32011-12-15 15:25:52 -0800246#else
247 .mem_hid = MEMTYPE_EBI1,
248#endif
Olav Hauganef95ae32012-05-15 09:50:30 -0700249 .mdp_iommu_split_domain = 1,
Huaibin Yang4a084e32011-12-15 15:25:52 -0800250};
251
252void __init apq8064_mdp_writeback(struct memtype_reserve* reserve_table)
253{
254 mdp_pdata.ov0_wb_size = MSM_FB_OVERLAY0_WRITEBACK_SIZE;
255 mdp_pdata.ov1_wb_size = MSM_FB_OVERLAY1_WRITEBACK_SIZE;
256#if defined(CONFIG_ANDROID_PMEM) && !defined(CONFIG_MSM_MULTIMEDIA_USE_ION)
257 reserve_table[mdp_pdata.mem_hid].size +=
258 mdp_pdata.ov0_wb_size;
259 reserve_table[mdp_pdata.mem_hid].size +=
260 mdp_pdata.ov1_wb_size;
261#endif
262}
263
Aravind Venkateswaran0507c8c2012-02-16 17:16:05 -0800264static struct resource hdmi_msm_resources[] = {
265 {
266 .name = "hdmi_msm_qfprom_addr",
267 .start = 0x00700000,
268 .end = 0x007060FF,
269 .flags = IORESOURCE_MEM,
270 },
271 {
272 .name = "hdmi_msm_hdmi_addr",
273 .start = 0x04A00000,
274 .end = 0x04A00FFF,
275 .flags = IORESOURCE_MEM,
276 },
277 {
278 .name = "hdmi_msm_irq",
279 .start = HDMI_IRQ,
280 .end = HDMI_IRQ,
281 .flags = IORESOURCE_IRQ,
282 },
283};
284
285static int hdmi_enable_5v(int on);
286static int hdmi_core_power(int on, int show);
287static int hdmi_cec_power(int on);
Ajay Singh Parmar7d11c272012-06-07 12:25:31 +0530288static int hdmi_gpio_config(int on);
289static int hdmi_panel_power(int on);
Aravind Venkateswaran0507c8c2012-02-16 17:16:05 -0800290
291static struct msm_hdmi_platform_data hdmi_msm_data = {
292 .irq = HDMI_IRQ,
293 .enable_5v = hdmi_enable_5v,
294 .core_power = hdmi_core_power,
295 .cec_power = hdmi_cec_power,
Ajay Singh Parmar7d11c272012-06-07 12:25:31 +0530296 .panel_power = hdmi_panel_power,
297 .gpio_config = hdmi_gpio_config,
Aravind Venkateswaran0507c8c2012-02-16 17:16:05 -0800298};
299
300static struct platform_device hdmi_msm_device = {
301 .name = "hdmi_msm",
302 .id = 0,
303 .num_resources = ARRAY_SIZE(hdmi_msm_resources),
304 .resource = hdmi_msm_resources,
305 .dev.platform_data = &hdmi_msm_data,
306};
307
Olav Hauganef95ae32012-05-15 09:50:30 -0700308static char wfd_check_mdp_iommu_split_domain(void)
309{
310 return mdp_pdata.mdp_iommu_split_domain;
311}
312
Mohan Kumar Gubbihalli Lachma Naikcb7d4e72012-03-23 18:17:30 -0700313#ifdef CONFIG_FB_MSM_WRITEBACK_MSM_PANEL
Olav Hauganef95ae32012-05-15 09:50:30 -0700314static struct msm_wfd_platform_data wfd_pdata = {
315 .wfd_check_mdp_iommu_split = wfd_check_mdp_iommu_split_domain,
316};
317
Mohan Kumar Gubbihalli Lachma Naikcb7d4e72012-03-23 18:17:30 -0700318static struct platform_device wfd_panel_device = {
319 .name = "wfd_panel",
320 .id = 0,
321 .dev.platform_data = NULL,
322};
323
324static struct platform_device wfd_device = {
325 .name = "msm_wfd",
326 .id = -1,
Olav Hauganef95ae32012-05-15 09:50:30 -0700327 .dev.platform_data = &wfd_pdata,
Mohan Kumar Gubbihalli Lachma Naikcb7d4e72012-03-23 18:17:30 -0700328};
329#endif
330
Aravind Venkateswaran0507c8c2012-02-16 17:16:05 -0800331/* HDMI related GPIOs */
332#define HDMI_CEC_VAR_GPIO 69
333#define HDMI_DDC_CLK_GPIO 70
334#define HDMI_DDC_DATA_GPIO 71
335#define HDMI_HPD_GPIO 72
336
Ravishangar Kalyanamc2fee312012-02-09 19:11:22 -0800337static bool dsi_power_on;
338static int mipi_dsi_panel_power(int on)
339{
340 static struct regulator *reg_lvs7, *reg_l2, *reg_l11, *reg_ext_3p3v;
341 static int gpio36, gpio25, gpio26, mpp3;
342 int rc;
343
344 pr_debug("%s: on=%d\n", __func__, on);
345
346 if (!dsi_power_on) {
347 reg_lvs7 = regulator_get(&msm_mipi_dsi1_device.dev,
348 "dsi1_vddio");
349 if (IS_ERR_OR_NULL(reg_lvs7)) {
350 pr_err("could not get 8921_lvs7, rc = %ld\n",
351 PTR_ERR(reg_lvs7));
352 return -ENODEV;
353 }
354
355 reg_l2 = regulator_get(&msm_mipi_dsi1_device.dev,
356 "dsi1_pll_vdda");
357 if (IS_ERR_OR_NULL(reg_l2)) {
358 pr_err("could not get 8921_l2, rc = %ld\n",
359 PTR_ERR(reg_l2));
360 return -ENODEV;
361 }
362
363 rc = regulator_set_voltage(reg_l2, 1200000, 1200000);
364 if (rc) {
365 pr_err("set_voltage l2 failed, rc=%d\n", rc);
366 return -EINVAL;
367 }
368 reg_l11 = regulator_get(&msm_mipi_dsi1_device.dev,
369 "dsi1_avdd");
370 if (IS_ERR(reg_l11)) {
371 pr_err("could not get 8921_l11, rc = %ld\n",
372 PTR_ERR(reg_l11));
373 return -ENODEV;
374 }
375 rc = regulator_set_voltage(reg_l11, 3000000, 3000000);
376 if (rc) {
377 pr_err("set_voltage l11 failed, rc=%d\n", rc);
378 return -EINVAL;
379 }
380
381 if (machine_is_apq8064_liquid()) {
382 reg_ext_3p3v = regulator_get(&msm_mipi_dsi1_device.dev,
383 "dsi1_vccs_3p3v");
384 if (IS_ERR_OR_NULL(reg_ext_3p3v)) {
385 pr_err("could not get reg_ext_3p3v, rc = %ld\n",
386 PTR_ERR(reg_ext_3p3v));
387 reg_ext_3p3v = NULL;
388 return -ENODEV;
389 }
390 mpp3 = PM8921_MPP_PM_TO_SYS(3);
391 rc = gpio_request(mpp3, "backlight_en");
392 if (rc) {
393 pr_err("request mpp3 failed, rc=%d\n", rc);
394 return -ENODEV;
395 }
396 }
397
398 gpio25 = PM8921_GPIO_PM_TO_SYS(25);
399 rc = gpio_request(gpio25, "disp_rst_n");
400 if (rc) {
401 pr_err("request gpio 25 failed, rc=%d\n", rc);
402 return -ENODEV;
403 }
404
405 gpio26 = PM8921_GPIO_PM_TO_SYS(26);
406 rc = gpio_request(gpio26, "pwm_backlight_ctrl");
407 if (rc) {
408 pr_err("request gpio 26 failed, rc=%d\n", rc);
409 return -ENODEV;
410 }
411
412 gpio36 = PM8921_GPIO_PM_TO_SYS(36); /* lcd1_pwr_en_n */
413 rc = gpio_request(gpio36, "lcd1_pwr_en_n");
414 if (rc) {
415 pr_err("request gpio 36 failed, rc=%d\n", rc);
416 return -ENODEV;
417 }
418
419 dsi_power_on = true;
420 }
421
422 if (on) {
423 rc = regulator_enable(reg_lvs7);
424 if (rc) {
425 pr_err("enable lvs7 failed, rc=%d\n", rc);
426 return -ENODEV;
427 }
428
429 rc = regulator_set_optimum_mode(reg_l11, 110000);
430 if (rc < 0) {
431 pr_err("set_optimum_mode l11 failed, rc=%d\n", rc);
432 return -EINVAL;
433 }
434 rc = regulator_enable(reg_l11);
435 if (rc) {
436 pr_err("enable l11 failed, rc=%d\n", rc);
437 return -ENODEV;
438 }
439
440 rc = regulator_set_optimum_mode(reg_l2, 100000);
441 if (rc < 0) {
442 pr_err("set_optimum_mode l2 failed, rc=%d\n", rc);
443 return -EINVAL;
444 }
445 rc = regulator_enable(reg_l2);
446 if (rc) {
447 pr_err("enable l2 failed, rc=%d\n", rc);
448 return -ENODEV;
449 }
450
451 if (machine_is_apq8064_liquid()) {
452 rc = regulator_enable(reg_ext_3p3v);
453 if (rc) {
454 pr_err("enable reg_ext_3p3v failed, rc=%d\n",
455 rc);
456 return -ENODEV;
457 }
458 gpio_set_value_cansleep(mpp3, 1);
459 }
460
461 gpio_set_value_cansleep(gpio36, 0);
462 gpio_set_value_cansleep(gpio25, 1);
David Collins1b859572012-08-22 13:59:23 -0700463 if (socinfo_get_pmic_model() == PMIC_MODEL_PM8917)
464 gpio_set_value_cansleep(gpio26, 1);
Ravishangar Kalyanamc2fee312012-02-09 19:11:22 -0800465 } else {
David Collins1b859572012-08-22 13:59:23 -0700466 if (socinfo_get_pmic_model() == PMIC_MODEL_PM8917)
467 gpio_set_value_cansleep(gpio26, 0);
Ravishangar Kalyanamc2fee312012-02-09 19:11:22 -0800468 gpio_set_value_cansleep(gpio25, 0);
469 gpio_set_value_cansleep(gpio36, 1);
470
471 if (machine_is_apq8064_liquid()) {
472 gpio_set_value_cansleep(mpp3, 0);
473
474 rc = regulator_disable(reg_ext_3p3v);
475 if (rc) {
476 pr_err("disable reg_ext_3p3v failed, rc=%d\n",
477 rc);
478 return -ENODEV;
479 }
480 }
481
Nagamalleswararao Ganji15ad5ac2012-06-20 20:50:01 -0700482 rc = regulator_disable(reg_l11);
483 if (rc) {
484 pr_err("disable reg_l1 failed, rc=%d\n", rc);
485 return -ENODEV;
486 }
487
Ravishangar Kalyanamc2fee312012-02-09 19:11:22 -0800488 rc = regulator_disable(reg_lvs7);
489 if (rc) {
490 pr_err("disable reg_lvs7 failed, rc=%d\n", rc);
491 return -ENODEV;
492 }
Nagamalleswararao Ganji15ad5ac2012-06-20 20:50:01 -0700493
Ravishangar Kalyanamc2fee312012-02-09 19:11:22 -0800494 rc = regulator_disable(reg_l2);
495 if (rc) {
496 pr_err("disable reg_l2 failed, rc=%d\n", rc);
497 return -ENODEV;
498 }
499 }
500
501 return 0;
502}
503
504static struct mipi_dsi_platform_data mipi_dsi_pdata = {
505 .dsi_power_save = mipi_dsi_panel_power,
506};
507
508static bool lvds_power_on;
509static int lvds_panel_power(int on)
510{
511 static struct regulator *reg_lvs7, *reg_l2, *reg_ext_3p3v;
512 static int gpio36, gpio26, mpp3;
513 int rc;
514
515 pr_debug("%s: on=%d\n", __func__, on);
516
517 if (!lvds_power_on) {
518 reg_lvs7 = regulator_get(&msm_lvds_device.dev,
519 "lvds_vdda");
520 if (IS_ERR_OR_NULL(reg_lvs7)) {
521 pr_err("could not get 8921_lvs7, rc = %ld\n",
522 PTR_ERR(reg_lvs7));
523 return -ENODEV;
524 }
525
526 reg_l2 = regulator_get(&msm_lvds_device.dev,
527 "lvds_pll_vdda");
528 if (IS_ERR_OR_NULL(reg_l2)) {
529 pr_err("could not get 8921_l2, rc = %ld\n",
530 PTR_ERR(reg_l2));
531 return -ENODEV;
532 }
533
534 rc = regulator_set_voltage(reg_l2, 1200000, 1200000);
535 if (rc) {
536 pr_err("set_voltage l2 failed, rc=%d\n", rc);
537 return -EINVAL;
538 }
539
540 reg_ext_3p3v = regulator_get(&msm_lvds_device.dev,
541 "lvds_vccs_3p3v");
542 if (IS_ERR_OR_NULL(reg_ext_3p3v)) {
543 pr_err("could not get reg_ext_3p3v, rc = %ld\n",
544 PTR_ERR(reg_ext_3p3v));
545 return -ENODEV;
546 }
547
548 gpio26 = PM8921_GPIO_PM_TO_SYS(26);
549 rc = gpio_request(gpio26, "pwm_backlight_ctrl");
550 if (rc) {
551 pr_err("request gpio 26 failed, rc=%d\n", rc);
552 return -ENODEV;
553 }
554
555 gpio36 = PM8921_GPIO_PM_TO_SYS(36); /* lcd1_pwr_en_n */
556 rc = gpio_request(gpio36, "lcd1_pwr_en_n");
557 if (rc) {
558 pr_err("request gpio 36 failed, rc=%d\n", rc);
559 return -ENODEV;
560 }
561
562 mpp3 = PM8921_MPP_PM_TO_SYS(3);
563 rc = gpio_request(mpp3, "backlight_en");
564 if (rc) {
565 pr_err("request mpp3 failed, rc=%d\n", rc);
566 return -ENODEV;
567 }
568
569 lvds_power_on = true;
570 }
571
572 if (on) {
573 rc = regulator_enable(reg_lvs7);
574 if (rc) {
575 pr_err("enable lvs7 failed, rc=%d\n", rc);
576 return -ENODEV;
577 }
578
579 rc = regulator_set_optimum_mode(reg_l2, 100000);
580 if (rc < 0) {
581 pr_err("set_optimum_mode l2 failed, rc=%d\n", rc);
582 return -EINVAL;
583 }
584 rc = regulator_enable(reg_l2);
585 if (rc) {
586 pr_err("enable l2 failed, rc=%d\n", rc);
587 return -ENODEV;
588 }
589
590 rc = regulator_enable(reg_ext_3p3v);
591 if (rc) {
592 pr_err("enable reg_ext_3p3v failed, rc=%d\n", rc);
593 return -ENODEV;
594 }
595
596 gpio_set_value_cansleep(gpio36, 0);
597 gpio_set_value_cansleep(mpp3, 1);
David Collins1b859572012-08-22 13:59:23 -0700598 if (socinfo_get_pmic_model() == PMIC_MODEL_PM8917)
599 gpio_set_value_cansleep(gpio26, 1);
Ravishangar Kalyanamc2fee312012-02-09 19:11:22 -0800600 } else {
David Collins1b859572012-08-22 13:59:23 -0700601 if (socinfo_get_pmic_model() == PMIC_MODEL_PM8917)
602 gpio_set_value_cansleep(gpio26, 0);
Ravishangar Kalyanamc2fee312012-02-09 19:11:22 -0800603 gpio_set_value_cansleep(mpp3, 0);
604 gpio_set_value_cansleep(gpio36, 1);
605
606 rc = regulator_disable(reg_lvs7);
607 if (rc) {
608 pr_err("disable reg_lvs7 failed, rc=%d\n", rc);
609 return -ENODEV;
610 }
611 rc = regulator_disable(reg_l2);
612 if (rc) {
613 pr_err("disable reg_l2 failed, rc=%d\n", rc);
614 return -ENODEV;
615 }
616 rc = regulator_disable(reg_ext_3p3v);
617 if (rc) {
618 pr_err("disable reg_ext_3p3v failed, rc=%d\n", rc);
619 return -ENODEV;
620 }
621 }
622
623 return 0;
624}
625
Huaibin Yang02f981c2012-02-27 16:58:41 -0800626static int lvds_pixel_remap(void)
627{
Lei Zhou34e216d2012-07-25 12:52:13 -0400628 u32 ver = socinfo_get_version();
629
Huaibin Yang02f981c2012-02-27 16:58:41 -0800630 if (machine_is_apq8064_cdp() ||
631 machine_is_apq8064_liquid()) {
Huaibin Yang02f981c2012-02-27 16:58:41 -0800632 if ((SOCINFO_VERSION_MAJOR(ver) == 1) &&
633 (SOCINFO_VERSION_MINOR(ver) == 0))
Zhang Chang Ken4a07fcb2012-06-03 11:24:51 -0400634 return LVDS_PIXEL_MAP_PATTERN_1;
635 } else if (machine_is_mpq8064_dtv()) {
Lei Zhou34e216d2012-07-25 12:52:13 -0400636 if ((SOCINFO_VERSION_MAJOR(ver) == 1) &&
637 (SOCINFO_VERSION_MINOR(ver) == 0))
638 return LVDS_PIXEL_MAP_PATTERN_2;
Huaibin Yang02f981c2012-02-27 16:58:41 -0800639 }
640 return 0;
641}
642
Ravishangar Kalyanamc2fee312012-02-09 19:11:22 -0800643static struct lcdc_platform_data lvds_pdata = {
644 .lcdc_power_save = lvds_panel_power,
Huaibin Yang02f981c2012-02-27 16:58:41 -0800645 .lvds_pixel_remap = lvds_pixel_remap
Ravishangar Kalyanamc2fee312012-02-09 19:11:22 -0800646};
647
648#define LPM_CHANNEL 2
649static int lvds_chimei_gpio[] = {LPM_CHANNEL};
650
651static struct lvds_panel_platform_data lvds_chimei_pdata = {
652 .gpio = lvds_chimei_gpio,
653};
654
655static struct platform_device lvds_chimei_panel_device = {
656 .name = "lvds_chimei_wxga",
657 .id = 0,
658 .dev = {
659 .platform_data = &lvds_chimei_pdata,
660 }
661};
662
Zhang Chang Ken4a07fcb2012-06-03 11:24:51 -0400663#define FRC_GPIO_UPDATE (SX150X_EXP4_GPIO_BASE + 8)
664#define FRC_GPIO_RESET (SX150X_EXP4_GPIO_BASE + 9)
665#define FRC_GPIO_PWR (SX150X_EXP4_GPIO_BASE + 10)
666
667static int lvds_frc_gpio[] = {FRC_GPIO_UPDATE, FRC_GPIO_RESET, FRC_GPIO_PWR};
668static struct lvds_panel_platform_data lvds_frc_pdata = {
669 .gpio = lvds_frc_gpio,
670};
671
672static struct platform_device lvds_frc_panel_device = {
673 .name = "lvds_frc_fhd",
674 .id = 0,
675 .dev = {
676 .platform_data = &lvds_frc_pdata,
677 }
678};
679
Ravishangar Kalyanamc2fee312012-02-09 19:11:22 -0800680static int dsi2lvds_gpio[2] = {
681 LPM_CHANNEL,/* Backlight PWM-ID=0 for PMIC-GPIO#24 */
682 0x1F08 /* DSI2LVDS Bridge GPIO Output, mask=0x1f, out=0x08 */
683};
684static struct msm_panel_common_pdata mipi_dsi2lvds_pdata = {
685 .gpio_num = dsi2lvds_gpio,
686};
687
688static struct platform_device mipi_dsi2lvds_bridge_device = {
689 .name = "mipi_tc358764",
690 .id = 0,
691 .dev.platform_data = &mipi_dsi2lvds_pdata,
692};
693
694static int toshiba_gpio[] = {LPM_CHANNEL};
695static struct mipi_dsi_panel_platform_data toshiba_pdata = {
696 .gpio = toshiba_gpio,
697};
698
699static struct platform_device mipi_dsi_toshiba_panel_device = {
700 .name = "mipi_toshiba",
701 .id = 0,
702 .dev = {
703 .platform_data = &toshiba_pdata,
704 }
705};
706
Aravind Venkateswaran0507c8c2012-02-16 17:16:05 -0800707static struct msm_bus_vectors dtv_bus_init_vectors[] = {
708 {
709 .src = MSM_BUS_MASTER_MDP_PORT0,
710 .dst = MSM_BUS_SLAVE_EBI_CH0,
711 .ab = 0,
712 .ib = 0,
713 },
714};
715
Aravind Venkateswaran0507c8c2012-02-16 17:16:05 -0800716static struct msm_bus_vectors dtv_bus_def_vectors[] = {
717 {
718 .src = MSM_BUS_MASTER_MDP_PORT0,
719 .dst = MSM_BUS_SLAVE_EBI_CH0,
720 .ab = 566092800 * 2,
721 .ib = 707616000 * 2,
722 },
723};
Aravind Venkateswaran0507c8c2012-02-16 17:16:05 -0800724
725static struct msm_bus_paths dtv_bus_scale_usecases[] = {
726 {
727 ARRAY_SIZE(dtv_bus_init_vectors),
728 dtv_bus_init_vectors,
729 },
730 {
731 ARRAY_SIZE(dtv_bus_def_vectors),
732 dtv_bus_def_vectors,
733 },
734};
735static struct msm_bus_scale_pdata dtv_bus_scale_pdata = {
736 dtv_bus_scale_usecases,
737 ARRAY_SIZE(dtv_bus_scale_usecases),
738 .name = "dtv",
739};
740
741static struct lcdc_platform_data dtv_pdata = {
742 .bus_scale_table = &dtv_bus_scale_pdata,
Ajay Singh Parmar7d11c272012-06-07 12:25:31 +0530743 .lcdc_power_save = hdmi_panel_power,
Aravind Venkateswaran0507c8c2012-02-16 17:16:05 -0800744};
745
Ajay Singh Parmar7d11c272012-06-07 12:25:31 +0530746static int hdmi_panel_power(int on)
747{
748 int rc;
749
750 pr_debug("%s: HDMI Core: %s\n", __func__, (on ? "ON" : "OFF"));
751 rc = hdmi_core_power(on, 1);
752 if (rc)
753 rc = hdmi_cec_power(on);
754
755 pr_debug("%s: HDMI Core: %s Success\n", __func__, (on ? "ON" : "OFF"));
756 return rc;
757}
758
Aravind Venkateswaran0507c8c2012-02-16 17:16:05 -0800759static int hdmi_enable_5v(int on)
760{
761 /* TBD: PM8921 regulator instead of 8901 */
762 static struct regulator *reg_8921_hdmi_mvs; /* HDMI_5V */
763 static int prev_on;
764 int rc;
765
766 if (on == prev_on)
767 return 0;
768
769 if (!reg_8921_hdmi_mvs) {
770 reg_8921_hdmi_mvs = regulator_get(&hdmi_msm_device.dev,
771 "hdmi_mvs");
772 if (IS_ERR(reg_8921_hdmi_mvs)) {
773 pr_err("could not get reg_8921_hdmi_mvs, rc = %ld\n",
774 PTR_ERR(reg_8921_hdmi_mvs));
775 reg_8921_hdmi_mvs = NULL;
776 return -ENODEV;
777 }
778 }
779
780 if (on) {
781 rc = regulator_enable(reg_8921_hdmi_mvs);
782 if (rc) {
783 pr_err("'%s' regulator enable failed, rc=%d\n",
784 "8921_hdmi_mvs", rc);
785 return rc;
786 }
787 pr_debug("%s(on): success\n", __func__);
788 } else {
789 rc = regulator_disable(reg_8921_hdmi_mvs);
790 if (rc)
791 pr_warning("'%s' regulator disable failed, rc=%d\n",
792 "8921_hdmi_mvs", rc);
793 pr_debug("%s(off): success\n", __func__);
794 }
795
796 prev_on = on;
797
798 return 0;
799}
800
801static int hdmi_core_power(int on, int show)
802{
803 static struct regulator *reg_8921_lvs7, *reg_8921_s4, *reg_ext_3p3v;
804 static int prev_on;
805 int rc;
Aravind Venkateswaran0507c8c2012-02-16 17:16:05 -0800806
807 if (on == prev_on)
808 return 0;
809
810 /* TBD: PM8921 regulator instead of 8901 */
811 if (!reg_ext_3p3v) {
812 reg_ext_3p3v = regulator_get(&hdmi_msm_device.dev,
813 "hdmi_mux_vdd");
814 if (IS_ERR_OR_NULL(reg_ext_3p3v)) {
815 pr_err("could not get reg_ext_3p3v, rc = %ld\n",
816 PTR_ERR(reg_ext_3p3v));
817 reg_ext_3p3v = NULL;
818 return -ENODEV;
819 }
820 }
821
822 if (!reg_8921_lvs7) {
823 reg_8921_lvs7 = regulator_get(&hdmi_msm_device.dev,
824 "hdmi_vdda");
825 if (IS_ERR(reg_8921_lvs7)) {
826 pr_err("could not get reg_8921_lvs7, rc = %ld\n",
827 PTR_ERR(reg_8921_lvs7));
828 reg_8921_lvs7 = NULL;
829 return -ENODEV;
830 }
831 }
832 if (!reg_8921_s4) {
833 reg_8921_s4 = regulator_get(&hdmi_msm_device.dev,
834 "hdmi_lvl_tsl");
835 if (IS_ERR(reg_8921_s4)) {
836 pr_err("could not get reg_8921_s4, rc = %ld\n",
837 PTR_ERR(reg_8921_s4));
838 reg_8921_s4 = NULL;
839 return -ENODEV;
840 }
841 rc = regulator_set_voltage(reg_8921_s4, 1800000, 1800000);
842 if (rc) {
843 pr_err("set_voltage failed for 8921_s4, rc=%d\n", rc);
844 return -EINVAL;
845 }
846 }
847
848 if (on) {
849 /*
850 * Configure 3P3V_BOOST_EN as GPIO, 8mA drive strength,
851 * pull none, out-high
852 */
853 rc = regulator_set_optimum_mode(reg_ext_3p3v, 290000);
854 if (rc < 0) {
855 pr_err("set_optimum_mode ext_3p3v failed, rc=%d\n", rc);
856 return -EINVAL;
857 }
858
859 rc = regulator_enable(reg_ext_3p3v);
860 if (rc) {
861 pr_err("enable reg_ext_3p3v failed, rc=%d\n", rc);
Ajay Singh Parmar7d11c272012-06-07 12:25:31 +0530862 return rc;
Aravind Venkateswaran0507c8c2012-02-16 17:16:05 -0800863 }
864 rc = regulator_enable(reg_8921_lvs7);
865 if (rc) {
866 pr_err("'%s' regulator enable failed, rc=%d\n",
867 "hdmi_vdda", rc);
Ajay Singh Parmar7d11c272012-06-07 12:25:31 +0530868 goto error1;
Aravind Venkateswaran0507c8c2012-02-16 17:16:05 -0800869 }
870 rc = regulator_enable(reg_8921_s4);
871 if (rc) {
872 pr_err("'%s' regulator enable failed, rc=%d\n",
873 "hdmi_lvl_tsl", rc);
Ajay Singh Parmar7d11c272012-06-07 12:25:31 +0530874 goto error2;
Aravind Venkateswaran0507c8c2012-02-16 17:16:05 -0800875 }
Ajay Singh Parmar7d11c272012-06-07 12:25:31 +0530876 pr_debug("%s(on): success\n", __func__);
877 } else {
878 rc = regulator_disable(reg_ext_3p3v);
879 if (rc) {
880 pr_err("disable reg_ext_3p3v failed, rc=%d\n", rc);
881 return -ENODEV;
882 }
883 rc = regulator_disable(reg_8921_lvs7);
884 if (rc) {
885 pr_err("disable reg_8921_l23 failed, rc=%d\n", rc);
886 return -ENODEV;
887 }
888 rc = regulator_disable(reg_8921_s4);
889 if (rc) {
890 pr_err("disable reg_8921_s4 failed, rc=%d\n", rc);
891 return -ENODEV;
892 }
893 pr_debug("%s(off): success\n", __func__);
894 }
895
896 prev_on = on;
897
898 return 0;
899
900error2:
901 regulator_disable(reg_8921_lvs7);
902error1:
903 regulator_disable(reg_ext_3p3v);
904 return rc;
905}
906
907static int hdmi_gpio_config(int on)
908{
909 int rc = 0;
910 static int prev_on;
911 int pmic_gpio14 = PM8921_GPIO_PM_TO_SYS(14);
912
913 if (on == prev_on)
914 return 0;
915
916 if (on) {
Aravind Venkateswaran0507c8c2012-02-16 17:16:05 -0800917 rc = gpio_request(HDMI_DDC_CLK_GPIO, "HDMI_DDC_CLK");
918 if (rc) {
919 pr_err("'%s'(%d) gpio_request failed, rc=%d\n",
920 "HDMI_DDC_CLK", HDMI_DDC_CLK_GPIO, rc);
921 goto error1;
922 }
923 rc = gpio_request(HDMI_DDC_DATA_GPIO, "HDMI_DDC_DATA");
924 if (rc) {
925 pr_err("'%s'(%d) gpio_request failed, rc=%d\n",
926 "HDMI_DDC_DATA", HDMI_DDC_DATA_GPIO, rc);
927 goto error2;
928 }
929 rc = gpio_request(HDMI_HPD_GPIO, "HDMI_HPD");
930 if (rc) {
931 pr_err("'%s'(%d) gpio_request failed, rc=%d\n",
932 "HDMI_HPD", HDMI_HPD_GPIO, rc);
933 goto error3;
934 }
935 if (machine_is_apq8064_liquid()) {
936 rc = gpio_request(pmic_gpio14, "PMIC_HDMI_MUX_SEL");
937 if (rc) {
938 pr_err("'%s'(%d) gpio_request failed, rc=%d\n",
939 "PMIC_HDMI_MUX_SEL", 14, rc);
940 goto error4;
941 }
942 gpio_set_value_cansleep(pmic_gpio14, 0);
943 }
944 pr_debug("%s(on): success\n", __func__);
945 } else {
946 gpio_free(HDMI_DDC_CLK_GPIO);
947 gpio_free(HDMI_DDC_DATA_GPIO);
948 gpio_free(HDMI_HPD_GPIO);
949
950 if (machine_is_apq8064_liquid()) {
951 gpio_set_value_cansleep(pmic_gpio14, 1);
952 gpio_free(pmic_gpio14);
953 }
Aravind Venkateswaran0507c8c2012-02-16 17:16:05 -0800954 pr_debug("%s(off): success\n", __func__);
955 }
956
957 prev_on = on;
Aravind Venkateswaran0507c8c2012-02-16 17:16:05 -0800958 return 0;
959
960error4:
961 gpio_free(HDMI_HPD_GPIO);
962error3:
963 gpio_free(HDMI_DDC_DATA_GPIO);
964error2:
965 gpio_free(HDMI_DDC_CLK_GPIO);
966error1:
Aravind Venkateswaran0507c8c2012-02-16 17:16:05 -0800967 return rc;
968}
969
970static int hdmi_cec_power(int on)
971{
972 static int prev_on;
973 int rc;
974
975 if (on == prev_on)
976 return 0;
977
978 if (on) {
979 rc = gpio_request(HDMI_CEC_VAR_GPIO, "HDMI_CEC_VAR");
980 if (rc) {
981 pr_err("'%s'(%d) gpio_request failed, rc=%d\n",
982 "HDMI_CEC_VAR", HDMI_CEC_VAR_GPIO, rc);
983 goto error;
984 }
985 pr_debug("%s(on): success\n", __func__);
986 } else {
987 gpio_free(HDMI_CEC_VAR_GPIO);
988 pr_debug("%s(off): success\n", __func__);
989 }
990
991 prev_on = on;
992
993 return 0;
994error:
995 return rc;
996}
997
Huaibin Yang4a084e32011-12-15 15:25:52 -0800998void __init apq8064_init_fb(void)
999{
1000 platform_device_register(&msm_fb_device);
Ravishangar Kalyanamc2fee312012-02-09 19:11:22 -08001001 platform_device_register(&lvds_chimei_panel_device);
1002
Mohan Kumar Gubbihalli Lachma Naikcb7d4e72012-03-23 18:17:30 -07001003#ifdef CONFIG_FB_MSM_WRITEBACK_MSM_PANEL
1004 platform_device_register(&wfd_panel_device);
1005 platform_device_register(&wfd_device);
1006#endif
1007
Ravishangar Kalyanamc2fee312012-02-09 19:11:22 -08001008 if (machine_is_apq8064_liquid())
1009 platform_device_register(&mipi_dsi2lvds_bridge_device);
1010 if (machine_is_apq8064_mtp())
1011 platform_device_register(&mipi_dsi_toshiba_panel_device);
Zhang Chang Ken4a07fcb2012-06-03 11:24:51 -04001012 if (machine_is_mpq8064_dtv())
1013 platform_device_register(&lvds_frc_panel_device);
Ravishangar Kalyanamc2fee312012-02-09 19:11:22 -08001014
Huaibin Yang4a084e32011-12-15 15:25:52 -08001015 msm_fb_register_device("mdp", &mdp_pdata);
Ravishangar Kalyanamc2fee312012-02-09 19:11:22 -08001016 msm_fb_register_device("lvds", &lvds_pdata);
1017 msm_fb_register_device("mipi_dsi", &mipi_dsi_pdata);
Aravind Venkateswaran0507c8c2012-02-16 17:16:05 -08001018 platform_device_register(&hdmi_msm_device);
1019 msm_fb_register_device("dtv", &dtv_pdata);
Huaibin Yang4a084e32011-12-15 15:25:52 -08001020}
Aravind Venkateswaran8ac7f412012-03-16 17:57:30 -07001021
1022/**
1023 * Set MDP clocks to high frequency to avoid DSI underflow
1024 * when using high resolution 1200x1920 WUXGA panels
1025 */
1026static void set_mdp_clocks_for_wuxga(void)
1027{
Aravind Venkateswaran8ac7f412012-03-16 17:57:30 -07001028 mdp_ui_vectors[0].ab = 2000000000;
1029 mdp_ui_vectors[0].ib = 2000000000;
1030 mdp_vga_vectors[0].ab = 2000000000;
1031 mdp_vga_vectors[0].ib = 2000000000;
1032 mdp_720p_vectors[0].ab = 2000000000;
1033 mdp_720p_vectors[0].ib = 2000000000;
1034 mdp_1080p_vectors[0].ab = 2000000000;
1035 mdp_1080p_vectors[0].ib = 2000000000;
1036
Ravishangar Kalyanamfda36c42012-03-26 16:28:19 -07001037 if (apq8064_hdmi_as_primary_selected()) {
Aravind Venkateswaran8ac7f412012-03-16 17:57:30 -07001038 dtv_bus_def_vectors[0].ab = 2000000000;
1039 dtv_bus_def_vectors[0].ib = 2000000000;
1040 }
1041}
1042
Ajay Singh Parmar6b82d2b2012-07-19 17:23:26 +05301043void __init apq8064_set_display_params(char *prim_panel, char *ext_panel,
1044 unsigned char resolution)
Aravind Venkateswaran8ac7f412012-03-16 17:57:30 -07001045{
Aravind Venkateswarand98bc432012-04-04 16:19:06 -07001046 /*
1047 * For certain MPQ boards, HDMI should be set as primary display
1048 * by default, with the flexibility to specify any other panel
1049 * as a primary panel through boot parameters.
1050 */
1051 if (machine_is_mpq8064_hrd() || machine_is_mpq8064_cdp()) {
1052 pr_debug("HDMI is the primary display by default for MPQ\n");
1053 if (!strnlen(prim_panel, PANEL_NAME_MAX_LEN))
1054 strlcpy(msm_fb_pdata.prim_panel_name, HDMI_PANEL_NAME,
1055 PANEL_NAME_MAX_LEN);
1056 }
1057
Aravind Venkateswaran8ac7f412012-03-16 17:57:30 -07001058 if (strnlen(prim_panel, PANEL_NAME_MAX_LEN)) {
1059 strlcpy(msm_fb_pdata.prim_panel_name, prim_panel,
1060 PANEL_NAME_MAX_LEN);
1061 pr_debug("msm_fb_pdata.prim_panel_name %s\n",
1062 msm_fb_pdata.prim_panel_name);
1063
1064 if (!strncmp((char *)msm_fb_pdata.prim_panel_name,
1065 HDMI_PANEL_NAME, strnlen(HDMI_PANEL_NAME,
1066 PANEL_NAME_MAX_LEN))) {
1067 pr_debug("HDMI is the primary display by"
1068 " boot parameter\n");
1069 hdmi_is_primary = 1;
1070 set_mdp_clocks_for_wuxga();
1071 }
1072 }
1073 if (strnlen(ext_panel, PANEL_NAME_MAX_LEN)) {
1074 strlcpy(msm_fb_pdata.ext_panel_name, ext_panel,
1075 PANEL_NAME_MAX_LEN);
1076 pr_debug("msm_fb_pdata.ext_panel_name %s\n",
1077 msm_fb_pdata.ext_panel_name);
1078 }
Ajay Singh Parmar6b82d2b2012-07-19 17:23:26 +05301079
1080 msm_fb_pdata.ext_resolution = resolution;
Aravind Venkateswaran8ac7f412012-03-16 17:57:30 -07001081}