blob: 780ecfcc36e03fd343ed91efda05b140502224dc [file] [log] [blame]
Wenjun Zhange9647e22018-02-01 03:42:29 -05001/* Copyright (c) 2012-2016, 2018 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;
Wenjun Zhange9647e22018-02-01 03:42:29 -0500128 case SPI_PANEL:
129 dprintf(INFO, "Config SPI PANEL.\n");
130 ret = mdss_spi_init();
131 if (ret)
132 goto msm_display_config_out;
133 ret = mdss_spi_panel_init(pinfo);
134 if (ret)
135 goto msm_display_config_out;
136 break;
Ajay Singh Parmar7c1cd522013-02-13 20:33:49 +0530137 case HDMI_PANEL:
138 dprintf(INFO, "Config HDMI PANEL.\n");
Ajay Singh Parmar243d82b2014-07-23 23:01:44 -0700139 ret = mdss_hdmi_config(pinfo, &(panel->fb));
Ajay Singh Parmar7c1cd522013-02-13 20:33:49 +0530140 if (ret)
141 goto msm_display_config_out;
142 break;
Asaf Pensob262f852013-05-19 18:32:38 +0300143 case EDP_PANEL:
144 dprintf(INFO, "Config EDP PANEL.\n");
145 ret = mdp_edp_config(pinfo, &(panel->fb));
146 if (ret)
147 goto msm_display_config_out;
148 break;
Zohaib Alamb7b677f2014-10-24 15:54:42 -0400149#endif
150#ifdef DISPLAY_TYPE_QPIC
151 case QPIC_PANEL:
152 dprintf(INFO, "Config QPIC_PANEL.\n");
Sridhar Parasuramc9abcdd2014-12-29 13:43:28 -0800153 qpic_init(pinfo, (int) panel->fb.base);
Zohaib Alamb7b677f2014-10-24 15:54:42 -0400154 break;
155#endif
Shashank Mittal4bfb2e32012-04-16 10:56:27 -0700156 default:
157 return ERR_INVALID_ARGS;
158 };
159
160 if (pinfo->config)
161 ret = pinfo->config((void *)pinfo);
162
Sridhar Parasuramc9abcdd2014-12-29 13:43:28 -0800163#ifdef DISPLAY_TYPE_MDSS
Shashank Mittal4bfb2e32012-04-16 10:56:27 -0700164msm_display_config_out:
Sridhar Parasuramc9abcdd2014-12-29 13:43:28 -0800165#endif
Shashank Mittal4bfb2e32012-04-16 10:56:27 -0700166 return ret;
167}
168
169int msm_display_on()
170{
171 int ret = NO_ERROR;
Sridhar Parasuramc9abcdd2014-12-29 13:43:28 -0800172#ifdef DISPLAY_TYPE_MDSS
Xiaoming Zhou8d534dd2013-07-29 15:49:19 -0400173 int mdp_rev;
Sridhar Parasuramc9abcdd2014-12-29 13:43:28 -0800174#endif
Shashank Mittal4bfb2e32012-04-16 10:56:27 -0700175 struct msm_panel_info *pinfo;
176
177 if (!panel)
178 return ERR_INVALID_ARGS;
179
Amol Jadi5f0fab02013-03-18 14:50:52 -0700180 bs_set_timestamp(BS_SPLASH_SCREEN_DISPLAY);
181
Shashank Mittal4bfb2e32012-04-16 10:56:27 -0700182 pinfo = &(panel->panel_info);
183
Dhaval Patelaa081d32013-10-25 13:47:46 -0700184 if (pinfo->pre_on) {
185 ret = pinfo->pre_on();
186 if (ret)
187 goto msm_display_on_out;
188 }
189
Shashank Mittal4bfb2e32012-04-16 10:56:27 -0700190 switch (pinfo->type) {
Zohaib Alamb7b677f2014-10-24 15:54:42 -0400191#ifdef DISPLAY_TYPE_MDSS
Shashank Mittal4bfb2e32012-04-16 10:56:27 -0700192 case LVDS_PANEL:
193 dprintf(INFO, "Turn on LVDS PANEL.\n");
194 ret = mdp_lcdc_on(panel);
195 if (ret)
196 goto msm_display_on_out;
197 ret = lvds_on(panel);
198 if (ret)
199 goto msm_display_on_out;
200 break;
201 case MIPI_VIDEO_PANEL:
202 dprintf(INFO, "Turn on MIPI_VIDEO_PANEL.\n");
Jayant Shekhar32397f92014-03-27 13:30:41 +0530203 ret = mdp_dsi_video_on(pinfo);
Shashank Mittal4bfb2e32012-04-16 10:56:27 -0700204 if (ret)
205 goto msm_display_on_out;
Siddhartha Agrawal007ea9e2014-10-14 15:02:48 -0700206
207 ret = mdss_dsi_post_on(panel);
208 if (ret)
209 goto msm_display_on_out;
210
Aravind Venkateswaranfec354c2014-12-04 18:10:14 -0800211 ret = mipi_dsi_on(pinfo);
Shashank Mittal4bfb2e32012-04-16 10:56:27 -0700212 if (ret)
213 goto msm_display_on_out;
214 break;
Channagoud Kadabi10189fd2012-05-25 13:33:39 +0530215 case MIPI_CMD_PANEL:
216 dprintf(INFO, "Turn on MIPI_CMD_PANEL.\n");
Jayant Shekhar32397f92014-03-27 13:30:41 +0530217 ret = mdp_dma_on(pinfo);
Channagoud Kadabi10189fd2012-05-25 13:33:39 +0530218 if (ret)
219 goto msm_display_on_out;
Xiaoming Zhou8d534dd2013-07-29 15:49:19 -0400220 mdp_rev = mdp_get_revision();
Shivaraj Shettyf9e10c42014-09-17 04:21:15 +0530221 if (mdp_rev != MDP_REV_50 && mdp_rev != MDP_REV_304 &&
222 mdp_rev != MDP_REV_305) {
Siddhartha Agrawale900fdf2013-04-21 16:18:17 -0700223 ret = mipi_cmd_trigger();
224 if (ret)
225 goto msm_display_on_out;
226 }
Siddhartha Agrawal007ea9e2014-10-14 15:02:48 -0700227
228 ret = mdss_dsi_post_on(panel);
229 if (ret)
230 goto msm_display_on_out;
231
Channagoud Kadabi10189fd2012-05-25 13:33:39 +0530232 break;
Channagoud Kadabi43000a62012-06-28 18:23:24 +0530233 case LCDC_PANEL:
234 dprintf(INFO, "Turn on LCDC PANEL.\n");
235 ret = mdp_lcdc_on(panel);
236 if (ret)
237 goto msm_display_on_out;
238 break;
Ajay Singh Parmar7c1cd522013-02-13 20:33:49 +0530239 case HDMI_PANEL:
240 dprintf(INFO, "Turn on HDMI PANEL.\n");
Ajay Singh Parmar243d82b2014-07-23 23:01:44 -0700241 ret = mdss_hdmi_init();
Ajay Singh Parmar7c1cd522013-02-13 20:33:49 +0530242 if (ret)
243 goto msm_display_on_out;
244
Veera Sundaram Sankarandb0b2bf2014-12-16 18:09:27 -0800245 ret = mdss_hdmi_on(pinfo);
Ajay Singh Parmar7c1cd522013-02-13 20:33:49 +0530246 if (ret)
247 goto msm_display_on_out;
248 break;
Asaf Pensob262f852013-05-19 18:32:38 +0300249 case EDP_PANEL:
250 dprintf(INFO, "Turn on EDP PANEL.\n");
Jayant Shekhar32397f92014-03-27 13:30:41 +0530251 ret = mdp_edp_on(pinfo);
Asaf Pensob262f852013-05-19 18:32:38 +0300252 if (ret)
253 goto msm_display_on_out;
254 break;
Wenjun Zhange9647e22018-02-01 03:42:29 -0500255 case SPI_PANEL:
256 dprintf(INFO, "Turn on SPI_PANEL.\n");
257 ret = mdss_spi_on(pinfo, &(panel->fb));
258 if (ret)
259 goto msm_display_on_out;
Wenjun Zhang150a0cd2018-03-07 01:48:21 -0500260 ret = mdss_spi_cmd_post_on(pinfo);
261 if (ret)
262 goto msm_display_on_out;
Wenjun Zhange9647e22018-02-01 03:42:29 -0500263 break;
Zohaib Alamb7b677f2014-10-24 15:54:42 -0400264#endif
265#ifdef DISPLAY_TYPE_QPIC
266 case QPIC_PANEL:
267 dprintf(INFO, "Turn on QPIC_PANEL.\n");
268 ret = qpic_on();
269 if (ret) {
270 dprintf(CRITICAL, "QPIC panel on failed\n");
271 goto msm_display_on_out;
272 }
273 qpic_update();
274 break;
275#endif
Shashank Mittal4bfb2e32012-04-16 10:56:27 -0700276 default:
277 return ERR_INVALID_ARGS;
278 };
279
280 if (pinfo->on)
281 ret = pinfo->on();
282
283msm_display_on_out:
284 return ret;
285}
286
287int msm_display_init(struct msm_fb_panel_data *pdata)
288{
289 int ret = NO_ERROR;
290
291 panel = pdata;
292 if (!panel) {
293 ret = ERR_INVALID_ARGS;
294 goto msm_display_init_out;
295 }
296
Chandan Uddaraju932723b2013-02-21 18:36:20 -0800297 /* Turn on panel */
298 if (pdata->power_func)
Kuogee Hsieh93bcff62014-08-22 14:02:08 -0700299 ret = pdata->power_func(1, &(panel->panel_info));
Shashank Mittal4bfb2e32012-04-16 10:56:27 -0700300
301 if (ret)
302 goto msm_display_init_out;
303
Huaibin Yang88540b32014-11-07 13:59:54 -0800304 if (pdata->dfps_func)
305 ret = pdata->dfps_func(&(panel->panel_info));
306
Chandan Uddaraju932723b2013-02-21 18:36:20 -0800307 /* Enable clock */
308 if (pdata->clk_func)
Veera Sundaram Sankarandb0b2bf2014-12-16 18:09:27 -0800309 ret = pdata->clk_func(1, &(panel->panel_info));
Shashank Mittal4bfb2e32012-04-16 10:56:27 -0700310
Casey Piper6c2f1132015-03-24 11:37:19 -0700311 if (ret)
312 goto msm_display_init_out;
313
314 /* Read specifications from panel if available.
315 * If further clocks should be enabled, they can be enabled
316 * using pll_clk_func
317 */
318 if (pdata->update_panel_info)
319 ret = pdata->update_panel_info();
320
321 if (ret)
322 goto msm_display_init_out;
323
324 /* Enabled for auto PLL calculation or to enable
325 * additional clocks
326 */
Arpita Banerjee2522bc62013-05-24 16:03:53 -0700327 if (pdata->pll_clk_func)
328 ret = pdata->pll_clk_func(1, &(panel->panel_info));
329
Shashank Mittal4bfb2e32012-04-16 10:56:27 -0700330 if (ret)
331 goto msm_display_init_out;
332
Kuogee Hsiehad69c3c2013-08-01 14:34:29 -0700333 /* pinfo prepare */
334 if (pdata->panel_info.prepare) {
335 /* this is for edp which pinfo derived from edid */
336 ret = pdata->panel_info.prepare();
337 panel->fb.width = panel->panel_info.xres;
338 panel->fb.height = panel->panel_info.yres;
339 panel->fb.stride = panel->panel_info.xres;
340 panel->fb.bpp = panel->panel_info.bpp;
341 }
342
343 if (ret)
344 goto msm_display_init_out;
345
Shashank Mittal4bfb2e32012-04-16 10:56:27 -0700346 ret = msm_fb_alloc(&(panel->fb));
347 if (ret)
348 goto msm_display_init_out;
349
350 fbcon_setup(&(panel->fb));
Channagoud Kadabi10189fd2012-05-25 13:33:39 +0530351 display_image_on_screen();
Vineet Bajajc2272462015-05-07 17:35:03 +0530352
Siddharth Zaveriacaacc32015-12-12 15:10:33 -0500353 if ((panel->dsi2HDMI_config) && (panel->panel_info.has_bridge_chip))
Vineet Bajajc2272462015-05-07 17:35:03 +0530354 ret = panel->dsi2HDMI_config(&(panel->panel_info));
355 if (ret)
356 goto msm_display_init_out;
357
Shashank Mittal4bfb2e32012-04-16 10:56:27 -0700358 ret = msm_display_config();
359 if (ret)
360 goto msm_display_init_out;
361
362 ret = msm_display_on();
363 if (ret)
364 goto msm_display_init_out;
365
Jayant Shekhar680f04f2013-11-20 14:56:30 +0530366 if (pdata->post_power_func)
367 ret = pdata->post_power_func(1);
368 if (ret)
369 goto msm_display_init_out;
370
Casey Pipera78c3262013-09-11 16:21:05 -0700371 /* Turn on backlight */
372 if (pdata->bl_func)
373 ret = pdata->bl_func(1);
374
375 if (ret)
376 goto msm_display_init_out;
377
Shashank Mittal4bfb2e32012-04-16 10:56:27 -0700378msm_display_init_out:
379 return ret;
380}
381
382int msm_display_off()
383{
384 int ret = NO_ERROR;
385 struct msm_panel_info *pinfo;
386
387 if (!panel)
388 return ERR_INVALID_ARGS;
389
390 pinfo = &(panel->panel_info);
391
Dhaval Patelaa081d32013-10-25 13:47:46 -0700392 if (pinfo->pre_off) {
393 ret = pinfo->pre_off();
394 if (ret)
395 goto msm_display_off_out;
396 }
397
Shashank Mittal4bfb2e32012-04-16 10:56:27 -0700398 switch (pinfo->type) {
Zohaib Alamb7b677f2014-10-24 15:54:42 -0400399#ifdef DISPLAY_TYPE_MDSS
Shashank Mittal4bfb2e32012-04-16 10:56:27 -0700400 case LVDS_PANEL:
401 dprintf(INFO, "Turn off LVDS PANEL.\n");
402 mdp_lcdc_off();
403 break;
404 case MIPI_VIDEO_PANEL:
405 dprintf(INFO, "Turn off MIPI_VIDEO_PANEL.\n");
Aravind Venkateswaranfec354c2014-12-04 18:10:14 -0800406 ret = mdp_dsi_video_off(pinfo);
Shashank Mittal4bfb2e32012-04-16 10:56:27 -0700407 if (ret)
408 goto msm_display_off_out;
Siddhartha Agrawal24d81b52013-07-01 11:13:32 -0700409 ret = mipi_dsi_off(pinfo);
Shashank Mittal4bfb2e32012-04-16 10:56:27 -0700410 if (ret)
411 goto msm_display_off_out;
412 break;
Channagoud Kadabi10189fd2012-05-25 13:33:39 +0530413 case MIPI_CMD_PANEL:
414 dprintf(INFO, "Turn off MIPI_CMD_PANEL.\n");
415 ret = mdp_dsi_cmd_off();
416 if (ret)
417 goto msm_display_off_out;
Siddhartha Agrawal24d81b52013-07-01 11:13:32 -0700418 ret = mipi_dsi_off(pinfo);
Channagoud Kadabi10189fd2012-05-25 13:33:39 +0530419 if (ret)
420 goto msm_display_off_out;
421 break;
Channagoud Kadabi43000a62012-06-28 18:23:24 +0530422 case LCDC_PANEL:
423 dprintf(INFO, "Turn off LCDC PANEL.\n");
424 mdp_lcdc_off();
425 break;
Asaf Pensob262f852013-05-19 18:32:38 +0300426 case EDP_PANEL:
427 dprintf(INFO, "Turn off EDP PANEL.\n");
428 ret = mdp_edp_off();
429 if (ret)
430 goto msm_display_off_out;
431 break;
Tatenda Chipeperekwad3f2cae2015-12-15 11:52:48 -0800432 case HDMI_PANEL:
433 dprintf(INFO, "Turn off HDMI PANEL.\n");
434 ret = mdss_hdmi_off(pinfo);
435 break;
436
Zohaib Alamb7b677f2014-10-24 15:54:42 -0400437#endif
438#ifdef DISPLAY_TYPE_QPIC
439 case QPIC_PANEL:
440 dprintf(INFO, "Turn off QPIC_PANEL.\n");
441 qpic_off();
442 break;
443#endif
Shashank Mittal4bfb2e32012-04-16 10:56:27 -0700444 default:
445 return ERR_INVALID_ARGS;
446 };
447
Siddhartha Agrawal03f6d212013-02-19 13:50:52 -0800448 if (target_cont_splash_screen()) {
449 dprintf(INFO, "Continuous splash enabled, keeping panel alive.\n");
450 return NO_ERROR;
451 }
452
Jayant Shekhar680f04f2013-11-20 14:56:30 +0530453 if (panel->post_power_func)
454 ret = panel->post_power_func(0);
455 if (ret)
456 goto msm_display_off_out;
457
Casey Pipera78c3262013-09-11 16:21:05 -0700458 /* Turn off backlight */
459 if (panel->bl_func)
460 ret = panel->bl_func(0);
461
Shashank Mittal4bfb2e32012-04-16 10:56:27 -0700462 if (pinfo->off)
463 ret = pinfo->off();
464
465 /* Disable clock */
466 if (panel->clk_func)
Veera Sundaram Sankarandb0b2bf2014-12-16 18:09:27 -0800467 ret = panel->clk_func(0, pinfo);
Shashank Mittal4bfb2e32012-04-16 10:56:27 -0700468
Arpita Banerjee2522bc62013-05-24 16:03:53 -0700469 /* Only for AUTO PLL calculation */
470 if (panel->pll_clk_func)
471 ret = panel->pll_clk_func(0, pinfo);
472
Shashank Mittal4bfb2e32012-04-16 10:56:27 -0700473 if (ret)
474 goto msm_display_off_out;
475
476 /* Disable panel */
477 if (panel->power_func)
Kuogee Hsieh93bcff62014-08-22 14:02:08 -0700478 ret = panel->power_func(0, pinfo);
Shashank Mittal4bfb2e32012-04-16 10:56:27 -0700479
480msm_display_off_out:
481 return ret;
482}