blob: 3bf56218fbb1b667083b5b988680556afb9c239e [file] [log] [blame]
Huaibin Yang88540b32014-11-07 13:59:54 -08001/* Copyright (c) 2012-2015, The Linux Foundation. All rights reserved.
Shashank Mittal4bfb2e32012-04-16 10:56:27 -07002 *
3 * Redistribution and use in source and binary forms, with or without
4 * modification, are permitted provided that the following conditions are
5 * met:
6 * * Redistributions of source code must retain the above copyright
7 * notice, this list of conditions and the following disclaimer.
8 * * Redistributions in binary form must reproduce the above
9 * copyright notice, this list of conditions and the following
10 * disclaimer in the documentation and/or other materials provided
11 * with the distribution.
Siddhartha Agrawal7e2e2152013-01-23 17:06:58 -080012 * * Neither the name of The Linux Foundation nor the names of its
Shashank Mittal4bfb2e32012-04-16 10:56:27 -070013 * contributors may be used to endorse or promote products derived
14 * from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
20 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
23 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
25 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
26 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29#include <debug.h>
30#include <err.h>
31#include <msm_panel.h>
32#include <mdp4.h>
33#include <mipi_dsi.h>
Amol Jadi5f0fab02013-03-18 14:50:52 -070034#include <boot_stats.h>
Veera Sundaram Sankarandb0b2bf2014-12-16 18:09:27 -080035#include <platform.h>
36#include <malloc.h>
Sridhar Parasuramc9abcdd2014-12-29 13:43:28 -080037#include <qpic.h>
38#include <target.h>
Veera Sundaram Sankarandb0b2bf2014-12-16 18:09:27 -080039#ifdef DISPLAY_TYPE_MDSS
40#include <target/display.h>
41#endif
Shashank Mittal4bfb2e32012-04-16 10:56:27 -070042
43static struct msm_fb_panel_data *panel;
44
45extern int lvds_on(struct msm_fb_panel_data *pdata);
46
47static int msm_fb_alloc(struct fbcon_config *fb)
48{
49 if (fb == NULL)
50 return ERROR;
51
52 if (fb->base == NULL)
53 fb->base = memalign(4096, fb->width
54 * fb->height
55 * (fb->bpp / 8));
56
57 if (fb->base == NULL)
58 return ERROR;
59
60 return NO_ERROR;
61}
62
63int msm_display_config()
64{
65 int ret = NO_ERROR;
Sridhar Parasuramc9abcdd2014-12-29 13:43:28 -080066#ifdef DISPLAY_TYPE_MDSS
Terence Hampsonf49ff4e2013-06-18 15:11:31 -040067 int mdp_rev;
Sridhar Parasuramc9abcdd2014-12-29 13:43:28 -080068#endif
Shashank Mittal4bfb2e32012-04-16 10:56:27 -070069 struct msm_panel_info *pinfo;
70
71 if (!panel)
72 return ERR_INVALID_ARGS;
73
74 pinfo = &(panel->panel_info);
75
76 /* Set MDP revision */
77 mdp_set_revision(panel->mdp_rev);
78
79 switch (pinfo->type) {
Zohaib Alamb7b677f2014-10-24 15:54:42 -040080#ifdef DISPLAY_TYPE_MDSS
Shashank Mittal4bfb2e32012-04-16 10:56:27 -070081 case LVDS_PANEL:
82 dprintf(INFO, "Config LVDS_PANEL.\n");
83 ret = mdp_lcdc_config(pinfo, &(panel->fb));
84 if (ret)
85 goto msm_display_config_out;
86 break;
87 case MIPI_VIDEO_PANEL:
88 dprintf(INFO, "Config MIPI_VIDEO_PANEL.\n");
Siddhartha Agrawal7e2e2152013-01-23 17:06:58 -080089
Terence Hampsonf49ff4e2013-06-18 15:11:31 -040090 mdp_rev = mdp_get_revision();
Shivaraj Shettyf9e10c42014-09-17 04:21:15 +053091 if (mdp_rev == MDP_REV_50 || mdp_rev == MDP_REV_304 ||
92 mdp_rev == MDP_REV_305)
Siddhartha Agrawal7e2e2152013-01-23 17:06:58 -080093 ret = mdss_dsi_config(panel);
94 else
95 ret = mipi_config(panel);
96
Shashank Mittal4bfb2e32012-04-16 10:56:27 -070097 if (ret)
98 goto msm_display_config_out;
Amir Samuelov2d4ba162012-07-22 11:53:14 +030099
100 if (pinfo->early_config)
101 ret = pinfo->early_config((void *)pinfo);
102
Shashank Mittal4bfb2e32012-04-16 10:56:27 -0700103 ret = mdp_dsi_video_config(pinfo, &(panel->fb));
104 if (ret)
105 goto msm_display_config_out;
106 break;
Channagoud Kadabi10189fd2012-05-25 13:33:39 +0530107 case MIPI_CMD_PANEL:
108 dprintf(INFO, "Config MIPI_CMD_PANEL.\n");
Xiaoming Zhou8d534dd2013-07-29 15:49:19 -0400109 mdp_rev = mdp_get_revision();
Shivaraj Shettyf9e10c42014-09-17 04:21:15 +0530110 if (mdp_rev == MDP_REV_50 || mdp_rev == MDP_REV_304 ||
111 mdp_rev == MDP_REV_305)
Siddhartha Agrawale900fdf2013-04-21 16:18:17 -0700112 ret = mdss_dsi_config(panel);
113 else
114 ret = mipi_config(panel);
Channagoud Kadabi10189fd2012-05-25 13:33:39 +0530115 if (ret)
116 goto msm_display_config_out;
Siddhartha Agrawale900fdf2013-04-21 16:18:17 -0700117
Channagoud Kadabi10189fd2012-05-25 13:33:39 +0530118 ret = mdp_dsi_cmd_config(pinfo, &(panel->fb));
119 if (ret)
120 goto msm_display_config_out;
121 break;
Channagoud Kadabi43000a62012-06-28 18:23:24 +0530122 case LCDC_PANEL:
123 dprintf(INFO, "Config LCDC PANEL.\n");
124 ret = mdp_lcdc_config(pinfo, &(panel->fb));
125 if (ret)
126 goto msm_display_config_out;
127 break;
Ajay Singh Parmar7c1cd522013-02-13 20:33:49 +0530128 case HDMI_PANEL:
129 dprintf(INFO, "Config HDMI PANEL.\n");
Ajay Singh Parmar243d82b2014-07-23 23:01:44 -0700130 ret = mdss_hdmi_config(pinfo, &(panel->fb));
Ajay Singh Parmar7c1cd522013-02-13 20:33:49 +0530131 if (ret)
132 goto msm_display_config_out;
133 break;
Asaf Pensob262f852013-05-19 18:32:38 +0300134 case EDP_PANEL:
135 dprintf(INFO, "Config EDP PANEL.\n");
136 ret = mdp_edp_config(pinfo, &(panel->fb));
137 if (ret)
138 goto msm_display_config_out;
139 break;
Zohaib Alamb7b677f2014-10-24 15:54:42 -0400140#endif
141#ifdef DISPLAY_TYPE_QPIC
142 case QPIC_PANEL:
143 dprintf(INFO, "Config QPIC_PANEL.\n");
Sridhar Parasuramc9abcdd2014-12-29 13:43:28 -0800144 qpic_init(pinfo, (int) panel->fb.base);
Zohaib Alamb7b677f2014-10-24 15:54:42 -0400145 break;
146#endif
Shashank Mittal4bfb2e32012-04-16 10:56:27 -0700147 default:
148 return ERR_INVALID_ARGS;
149 };
150
151 if (pinfo->config)
152 ret = pinfo->config((void *)pinfo);
153
Sridhar Parasuramc9abcdd2014-12-29 13:43:28 -0800154#ifdef DISPLAY_TYPE_MDSS
Shashank Mittal4bfb2e32012-04-16 10:56:27 -0700155msm_display_config_out:
Sridhar Parasuramc9abcdd2014-12-29 13:43:28 -0800156#endif
Shashank Mittal4bfb2e32012-04-16 10:56:27 -0700157 return ret;
158}
159
160int msm_display_on()
161{
162 int ret = NO_ERROR;
Sridhar Parasuramc9abcdd2014-12-29 13:43:28 -0800163#ifdef DISPLAY_TYPE_MDSS
Xiaoming Zhou8d534dd2013-07-29 15:49:19 -0400164 int mdp_rev;
Sridhar Parasuramc9abcdd2014-12-29 13:43:28 -0800165#endif
Shashank Mittal4bfb2e32012-04-16 10:56:27 -0700166 struct msm_panel_info *pinfo;
167
168 if (!panel)
169 return ERR_INVALID_ARGS;
170
Amol Jadi5f0fab02013-03-18 14:50:52 -0700171 bs_set_timestamp(BS_SPLASH_SCREEN_DISPLAY);
172
Shashank Mittal4bfb2e32012-04-16 10:56:27 -0700173 pinfo = &(panel->panel_info);
174
Dhaval Patelaa081d32013-10-25 13:47:46 -0700175 if (pinfo->pre_on) {
176 ret = pinfo->pre_on();
177 if (ret)
178 goto msm_display_on_out;
179 }
180
Shashank Mittal4bfb2e32012-04-16 10:56:27 -0700181 switch (pinfo->type) {
Zohaib Alamb7b677f2014-10-24 15:54:42 -0400182#ifdef DISPLAY_TYPE_MDSS
Shashank Mittal4bfb2e32012-04-16 10:56:27 -0700183 case LVDS_PANEL:
184 dprintf(INFO, "Turn on LVDS PANEL.\n");
185 ret = mdp_lcdc_on(panel);
186 if (ret)
187 goto msm_display_on_out;
188 ret = lvds_on(panel);
189 if (ret)
190 goto msm_display_on_out;
191 break;
192 case MIPI_VIDEO_PANEL:
193 dprintf(INFO, "Turn on MIPI_VIDEO_PANEL.\n");
Jayant Shekhar32397f92014-03-27 13:30:41 +0530194 ret = mdp_dsi_video_on(pinfo);
Shashank Mittal4bfb2e32012-04-16 10:56:27 -0700195 if (ret)
196 goto msm_display_on_out;
Siddhartha Agrawal007ea9e2014-10-14 15:02:48 -0700197
198 ret = mdss_dsi_post_on(panel);
199 if (ret)
200 goto msm_display_on_out;
201
Aravind Venkateswaranfec354c2014-12-04 18:10:14 -0800202 ret = mipi_dsi_on(pinfo);
Shashank Mittal4bfb2e32012-04-16 10:56:27 -0700203 if (ret)
204 goto msm_display_on_out;
205 break;
Channagoud Kadabi10189fd2012-05-25 13:33:39 +0530206 case MIPI_CMD_PANEL:
207 dprintf(INFO, "Turn on MIPI_CMD_PANEL.\n");
Jayant Shekhar32397f92014-03-27 13:30:41 +0530208 ret = mdp_dma_on(pinfo);
Channagoud Kadabi10189fd2012-05-25 13:33:39 +0530209 if (ret)
210 goto msm_display_on_out;
Xiaoming Zhou8d534dd2013-07-29 15:49:19 -0400211 mdp_rev = mdp_get_revision();
Shivaraj Shettyf9e10c42014-09-17 04:21:15 +0530212 if (mdp_rev != MDP_REV_50 && mdp_rev != MDP_REV_304 &&
213 mdp_rev != MDP_REV_305) {
Siddhartha Agrawale900fdf2013-04-21 16:18:17 -0700214 ret = mipi_cmd_trigger();
215 if (ret)
216 goto msm_display_on_out;
217 }
Siddhartha Agrawal007ea9e2014-10-14 15:02:48 -0700218
219 ret = mdss_dsi_post_on(panel);
220 if (ret)
221 goto msm_display_on_out;
222
Channagoud Kadabi10189fd2012-05-25 13:33:39 +0530223 break;
Channagoud Kadabi43000a62012-06-28 18:23:24 +0530224 case LCDC_PANEL:
225 dprintf(INFO, "Turn on LCDC PANEL.\n");
226 ret = mdp_lcdc_on(panel);
227 if (ret)
228 goto msm_display_on_out;
229 break;
Ajay Singh Parmar7c1cd522013-02-13 20:33:49 +0530230 case HDMI_PANEL:
231 dprintf(INFO, "Turn on HDMI PANEL.\n");
Ajay Singh Parmar243d82b2014-07-23 23:01:44 -0700232 ret = mdss_hdmi_init();
Ajay Singh Parmar7c1cd522013-02-13 20:33:49 +0530233 if (ret)
234 goto msm_display_on_out;
235
Veera Sundaram Sankarandb0b2bf2014-12-16 18:09:27 -0800236 ret = mdss_hdmi_on(pinfo);
Ajay Singh Parmar7c1cd522013-02-13 20:33:49 +0530237 if (ret)
238 goto msm_display_on_out;
239 break;
Asaf Pensob262f852013-05-19 18:32:38 +0300240 case EDP_PANEL:
241 dprintf(INFO, "Turn on EDP PANEL.\n");
Jayant Shekhar32397f92014-03-27 13:30:41 +0530242 ret = mdp_edp_on(pinfo);
Asaf Pensob262f852013-05-19 18:32:38 +0300243 if (ret)
244 goto msm_display_on_out;
245 break;
Zohaib Alamb7b677f2014-10-24 15:54:42 -0400246#endif
247#ifdef DISPLAY_TYPE_QPIC
248 case QPIC_PANEL:
249 dprintf(INFO, "Turn on QPIC_PANEL.\n");
250 ret = qpic_on();
251 if (ret) {
252 dprintf(CRITICAL, "QPIC panel on failed\n");
253 goto msm_display_on_out;
254 }
255 qpic_update();
256 break;
257#endif
Shashank Mittal4bfb2e32012-04-16 10:56:27 -0700258 default:
259 return ERR_INVALID_ARGS;
260 };
261
262 if (pinfo->on)
263 ret = pinfo->on();
264
265msm_display_on_out:
266 return ret;
267}
268
269int msm_display_init(struct msm_fb_panel_data *pdata)
270{
271 int ret = NO_ERROR;
272
273 panel = pdata;
274 if (!panel) {
275 ret = ERR_INVALID_ARGS;
276 goto msm_display_init_out;
277 }
278
Chandan Uddaraju932723b2013-02-21 18:36:20 -0800279 /* Turn on panel */
280 if (pdata->power_func)
Kuogee Hsieh93bcff62014-08-22 14:02:08 -0700281 ret = pdata->power_func(1, &(panel->panel_info));
Shashank Mittal4bfb2e32012-04-16 10:56:27 -0700282
283 if (ret)
284 goto msm_display_init_out;
285
Huaibin Yang88540b32014-11-07 13:59:54 -0800286 if (pdata->dfps_func)
287 ret = pdata->dfps_func(&(panel->panel_info));
288
Chandan Uddaraju932723b2013-02-21 18:36:20 -0800289 /* Enable clock */
290 if (pdata->clk_func)
Veera Sundaram Sankarandb0b2bf2014-12-16 18:09:27 -0800291 ret = pdata->clk_func(1, &(panel->panel_info));
Shashank Mittal4bfb2e32012-04-16 10:56:27 -0700292
Casey Piper6c2f1132015-03-24 11:37:19 -0700293 if (ret)
294 goto msm_display_init_out;
295
296 /* Read specifications from panel if available.
297 * If further clocks should be enabled, they can be enabled
298 * using pll_clk_func
299 */
300 if (pdata->update_panel_info)
301 ret = pdata->update_panel_info();
302
303 if (ret)
304 goto msm_display_init_out;
305
306 /* Enabled for auto PLL calculation or to enable
307 * additional clocks
308 */
Arpita Banerjee2522bc62013-05-24 16:03:53 -0700309 if (pdata->pll_clk_func)
310 ret = pdata->pll_clk_func(1, &(panel->panel_info));
311
Shashank Mittal4bfb2e32012-04-16 10:56:27 -0700312 if (ret)
313 goto msm_display_init_out;
314
Kuogee Hsiehad69c3c2013-08-01 14:34:29 -0700315 /* pinfo prepare */
316 if (pdata->panel_info.prepare) {
317 /* this is for edp which pinfo derived from edid */
318 ret = pdata->panel_info.prepare();
319 panel->fb.width = panel->panel_info.xres;
320 panel->fb.height = panel->panel_info.yres;
321 panel->fb.stride = panel->panel_info.xres;
322 panel->fb.bpp = panel->panel_info.bpp;
323 }
324
325 if (ret)
326 goto msm_display_init_out;
327
Shashank Mittal4bfb2e32012-04-16 10:56:27 -0700328 ret = msm_fb_alloc(&(panel->fb));
329 if (ret)
330 goto msm_display_init_out;
331
332 fbcon_setup(&(panel->fb));
Channagoud Kadabi10189fd2012-05-25 13:33:39 +0530333 display_image_on_screen();
Vineet Bajajc2272462015-05-07 17:35:03 +0530334
335 if (panel->dsi2HDMI_config)
336 ret = panel->dsi2HDMI_config(&(panel->panel_info));
337 if (ret)
338 goto msm_display_init_out;
339
Shashank Mittal4bfb2e32012-04-16 10:56:27 -0700340 ret = msm_display_config();
341 if (ret)
342 goto msm_display_init_out;
343
344 ret = msm_display_on();
345 if (ret)
346 goto msm_display_init_out;
347
Jayant Shekhar680f04f2013-11-20 14:56:30 +0530348 if (pdata->post_power_func)
349 ret = pdata->post_power_func(1);
350 if (ret)
351 goto msm_display_init_out;
352
Casey Pipera78c3262013-09-11 16:21:05 -0700353 /* Turn on backlight */
354 if (pdata->bl_func)
355 ret = pdata->bl_func(1);
356
357 if (ret)
358 goto msm_display_init_out;
359
Shashank Mittal4bfb2e32012-04-16 10:56:27 -0700360msm_display_init_out:
361 return ret;
362}
363
364int msm_display_off()
365{
366 int ret = NO_ERROR;
367 struct msm_panel_info *pinfo;
368
369 if (!panel)
370 return ERR_INVALID_ARGS;
371
372 pinfo = &(panel->panel_info);
373
Dhaval Patelaa081d32013-10-25 13:47:46 -0700374 if (pinfo->pre_off) {
375 ret = pinfo->pre_off();
376 if (ret)
377 goto msm_display_off_out;
378 }
379
Shashank Mittal4bfb2e32012-04-16 10:56:27 -0700380 switch (pinfo->type) {
Zohaib Alamb7b677f2014-10-24 15:54:42 -0400381#ifdef DISPLAY_TYPE_MDSS
Shashank Mittal4bfb2e32012-04-16 10:56:27 -0700382 case LVDS_PANEL:
383 dprintf(INFO, "Turn off LVDS PANEL.\n");
384 mdp_lcdc_off();
385 break;
386 case MIPI_VIDEO_PANEL:
387 dprintf(INFO, "Turn off MIPI_VIDEO_PANEL.\n");
Aravind Venkateswaranfec354c2014-12-04 18:10:14 -0800388 ret = mdp_dsi_video_off(pinfo);
Shashank Mittal4bfb2e32012-04-16 10:56:27 -0700389 if (ret)
390 goto msm_display_off_out;
Siddhartha Agrawal24d81b52013-07-01 11:13:32 -0700391 ret = mipi_dsi_off(pinfo);
Shashank Mittal4bfb2e32012-04-16 10:56:27 -0700392 if (ret)
393 goto msm_display_off_out;
394 break;
Channagoud Kadabi10189fd2012-05-25 13:33:39 +0530395 case MIPI_CMD_PANEL:
396 dprintf(INFO, "Turn off MIPI_CMD_PANEL.\n");
397 ret = mdp_dsi_cmd_off();
398 if (ret)
399 goto msm_display_off_out;
Siddhartha Agrawal24d81b52013-07-01 11:13:32 -0700400 ret = mipi_dsi_off(pinfo);
Channagoud Kadabi10189fd2012-05-25 13:33:39 +0530401 if (ret)
402 goto msm_display_off_out;
403 break;
Channagoud Kadabi43000a62012-06-28 18:23:24 +0530404 case LCDC_PANEL:
405 dprintf(INFO, "Turn off LCDC PANEL.\n");
406 mdp_lcdc_off();
407 break;
Asaf Pensob262f852013-05-19 18:32:38 +0300408 case EDP_PANEL:
409 dprintf(INFO, "Turn off EDP PANEL.\n");
410 ret = mdp_edp_off();
411 if (ret)
412 goto msm_display_off_out;
413 break;
Zohaib Alamb7b677f2014-10-24 15:54:42 -0400414#endif
415#ifdef DISPLAY_TYPE_QPIC
416 case QPIC_PANEL:
417 dprintf(INFO, "Turn off QPIC_PANEL.\n");
418 qpic_off();
419 break;
420#endif
Shashank Mittal4bfb2e32012-04-16 10:56:27 -0700421 default:
422 return ERR_INVALID_ARGS;
423 };
424
Siddhartha Agrawal03f6d212013-02-19 13:50:52 -0800425 if (target_cont_splash_screen()) {
426 dprintf(INFO, "Continuous splash enabled, keeping panel alive.\n");
427 return NO_ERROR;
428 }
429
Jayant Shekhar680f04f2013-11-20 14:56:30 +0530430 if (panel->post_power_func)
431 ret = panel->post_power_func(0);
432 if (ret)
433 goto msm_display_off_out;
434
Casey Pipera78c3262013-09-11 16:21:05 -0700435 /* Turn off backlight */
436 if (panel->bl_func)
437 ret = panel->bl_func(0);
438
Shashank Mittal4bfb2e32012-04-16 10:56:27 -0700439 if (pinfo->off)
440 ret = pinfo->off();
441
442 /* Disable clock */
443 if (panel->clk_func)
Veera Sundaram Sankarandb0b2bf2014-12-16 18:09:27 -0800444 ret = panel->clk_func(0, pinfo);
Shashank Mittal4bfb2e32012-04-16 10:56:27 -0700445
Arpita Banerjee2522bc62013-05-24 16:03:53 -0700446 /* Only for AUTO PLL calculation */
447 if (panel->pll_clk_func)
448 ret = panel->pll_clk_func(0, pinfo);
449
Shashank Mittal4bfb2e32012-04-16 10:56:27 -0700450 if (ret)
451 goto msm_display_off_out;
452
453 /* Disable panel */
454 if (panel->power_func)
Kuogee Hsieh93bcff62014-08-22 14:02:08 -0700455 ret = panel->power_func(0, pinfo);
Shashank Mittal4bfb2e32012-04-16 10:56:27 -0700456
457msm_display_off_out:
458 return ret;
459}