blob: a847aaa5029c789f5b0ee083f6d26acf19405996 [file] [log] [blame]
Huaibin Yangcbec39b2014-11-07 13:54:38 -08001/* Copyright (c) 2013-2015, The Linux Foundation. All rights reserved.
Arpita Banerjee841fa062013-05-24 14:59:51 -07002 *
3 * Redistribution and use in source and binary forms, with or without
4 * modification, are permitted provided that the following conditions
5 * are 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 copyright
9 * notice, this list of conditions and the following disclaimer in
10 * the documentation and/or other materials provided with the
11 * distribution.
12 * * Neither the name of The Linux Foundation nor the names of its
13 * 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 BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
19 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
20 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
22 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
23 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
25 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
26 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * SUCH DAMAGE.
28 */
29
30#include <debug.h>
31#include <err.h>
32#include <smem.h>
Veera Sundaram Sankaran824e6fa2014-12-09 11:32:58 -080033#include <clock.h>
Arpita Banerjee841fa062013-05-24 14:59:51 -070034#include <msm_panel.h>
Dhaval Patel9f61f132013-07-18 14:45:11 -070035#include <string.h>
36#include <stdlib.h>
Arpita Banerjee841fa062013-05-24 14:59:51 -070037#include <board.h>
38#include <mdp5.h>
Veera Sundaram Sankaran824e6fa2014-12-09 11:32:58 -080039#include <qtimer.h>
Arpita Banerjee841fa062013-05-24 14:59:51 -070040#include <platform/gpio.h>
41#include <mipi_dsi.h>
Huaibin Yangb6fa92b2015-01-28 16:21:37 -080042#include <partition_parser.h>
Arpita Banerjee841fa062013-05-24 14:59:51 -070043
44#include "include/display_resource.h"
45#include "include/panel.h"
46#include "panel_display.h"
47#include "gcdb_display.h"
48#include "target/display.h"
Arpita Banerjeeda0c39a2013-05-24 16:12:45 -070049#include "gcdb_autopll.h"
Arpita Banerjee841fa062013-05-24 14:59:51 -070050
51/*---------------------------------------------------------------------------*/
52/* static */
53/*---------------------------------------------------------------------------*/
54static struct msm_fb_panel_data panel;
55struct panel_struct panelstruct;
56static uint8_t display_enable;
57static struct mdss_dsi_phy_ctrl dsi_video_mode_phy_db;
58
Arpita Banerjee841fa062013-05-24 14:59:51 -070059/*---------------------------------------------------------------------------*/
60/* Extern */
61/*---------------------------------------------------------------------------*/
62extern int msm_display_init(struct msm_fb_panel_data *pdata);
63extern int msm_display_off();
64
65static uint32_t panel_backlight_ctrl(uint8_t enable)
66{
Vineet Bajaj22442342015-04-29 16:55:18 +053067 uint32_t ret = NO_ERROR;
68 if (panelstruct.backlightinfo)
69 ret = target_backlight_ctrl(panelstruct.backlightinfo, enable);
70 return ret;
Arpita Banerjee841fa062013-05-24 14:59:51 -070071}
72
73static uint32_t mdss_dsi_panel_reset(uint8_t enable)
74{
75 uint32_t ret = NO_ERROR;
Vineet Bajaj22442342015-04-29 16:55:18 +053076 if (panelstruct.panelresetseq)
77 ret = target_panel_reset(enable, panelstruct.panelresetseq,
78 &panel.panel_info);
Arpita Banerjee841fa062013-05-24 14:59:51 -070079 return ret;
80}
81
Arpita Banerjeeda0c39a2013-05-24 16:12:45 -070082static uint32_t mdss_dsi_panel_clock(uint8_t enable,
83 struct msm_panel_info *pinfo)
Arpita Banerjee841fa062013-05-24 14:59:51 -070084{
85 uint32_t ret = NO_ERROR;
86
Arpita Banerjeeda0c39a2013-05-24 16:12:45 -070087 ret = calculate_clock_config(pinfo);
Huaibin Yangcbec39b2014-11-07 13:54:38 -080088 if (ret)
89 dprintf(CRITICAL, "Clock calculation failed\n");
90 else
91 ret = target_panel_clock(enable, pinfo);
Arpita Banerjee841fa062013-05-24 14:59:51 -070092
93 return ret;
94}
95
Kuogee Hsieh93bcff62014-08-22 14:02:08 -070096static int mdss_dsi_panel_power(uint8_t enable,
97 struct msm_panel_info *pinfo)
Arpita Banerjee841fa062013-05-24 14:59:51 -070098{
99 int ret = NO_ERROR;
100
101 if (enable) {
Kuogee Hsieh93bcff62014-08-22 14:02:08 -0700102 ret = target_ldo_ctrl(enable, pinfo);
Arpita Banerjee841fa062013-05-24 14:59:51 -0700103 if (ret) {
Jayant Shekharc9611a92013-11-20 16:59:27 +0530104 dprintf(CRITICAL, "LDO control enable failed\n");
Arpita Banerjee841fa062013-05-24 14:59:51 -0700105 return ret;
106 }
107
108 /* Panel Reset */
Jayant Shekharc9611a92013-11-20 16:59:27 +0530109 if (!panelstruct.paneldata->panel_lp11_init) {
110 ret = mdss_dsi_panel_reset(enable);
111 if (ret) {
112 dprintf(CRITICAL, "panel reset failed\n");
113 return ret;
114 }
Arpita Banerjee841fa062013-05-24 14:59:51 -0700115 }
116 dprintf(SPEW, "Panel power on done\n");
117 } else {
Casey Piper1bbd1572013-09-11 16:23:18 -0700118 /* Disable panel and ldo */
Arpita Banerjee841fa062013-05-24 14:59:51 -0700119 ret = mdss_dsi_panel_reset(enable);
120 if (ret) {
Jayant Shekharc9611a92013-11-20 16:59:27 +0530121 dprintf(CRITICAL, "panel reset disable failed\n");
Arpita Banerjee841fa062013-05-24 14:59:51 -0700122 return ret;
123 }
124
Kuogee Hsieh93bcff62014-08-22 14:02:08 -0700125 ret = target_ldo_ctrl(enable, pinfo);
Arpita Banerjee841fa062013-05-24 14:59:51 -0700126 if (ret) {
Jayant Shekharc9611a92013-11-20 16:59:27 +0530127 dprintf(CRITICAL, "ldo control disable failed\n");
Arpita Banerjee841fa062013-05-24 14:59:51 -0700128 return ret;
129 }
130 dprintf(SPEW, "Panel power off done\n");
131 }
132
133 return ret;
134}
135
Ray Zhangeb462f62013-12-03 17:16:08 +0800136static int mdss_dsi_panel_pre_init(void)
Jayant Shekharc9611a92013-11-20 16:59:27 +0530137{
138 int ret = NO_ERROR;
139
Ray Zhangeb462f62013-12-03 17:16:08 +0800140 if (panelstruct.paneldata->panel_lp11_init) {
141 ret = mdss_dsi_panel_reset(1);
142 if (ret) {
143 dprintf(CRITICAL, "panel reset failed\n");
144 return ret;
Jayant Shekharc9611a92013-11-20 16:59:27 +0530145 }
Jayant Shekharc9611a92013-11-20 16:59:27 +0530146 }
147
Ray Zhangeb462f62013-12-03 17:16:08 +0800148 if(panelstruct.paneldata->panel_init_delay)
149 udelay(panelstruct.paneldata->panel_init_delay);
150
151 dprintf(SPEW, "Panel pre init done\n");
Jayant Shekharc9611a92013-11-20 16:59:27 +0530152 return ret;
153}
154
Huaibin Yangb6fa92b2015-01-28 16:21:37 -0800155static int mdss_dsi_dfps_get_pll_codes_cal(struct msm_panel_info *pinfo)
Huaibin Yangcbec39b2014-11-07 13:54:38 -0800156{
157 int ret = NO_ERROR;
158 uint32_t fps_bak;
159 uint32_t i;
160
161 fps_bak = pinfo->mipi.frame_rate;
162
163 for (i = 0; i < pinfo->dfps.panel_dfps.frame_rate_cnt; i++) {
164 int err;
165 pinfo->mipi.frame_rate = pinfo->dfps.panel_dfps.frame_rate[i];
166
167 err = mdss_dsi_panel_clock(1, pinfo);
168 if (!err) {
Jeevan Shrirame2014662015-08-03 15:11:27 -0700169 dprintf(SPEW, "frame_rate=%d, vcorate=%d success!\n",
170 pinfo->mipi.frame_rate,
171 pinfo->mipi.dsi_pll_config->vco_clock);
Huaibin Yangcbec39b2014-11-07 13:54:38 -0800172 pinfo->dfps.codes_dfps[i].is_valid = 1;
173 pinfo->dfps.codes_dfps[i].frame_rate =
174 pinfo->mipi.frame_rate;
Huaibin Yangcbec39b2014-11-07 13:54:38 -0800175 pinfo->dfps.codes_dfps[i].clk_rate =
176 pinfo->mipi.dsi_pll_config->vco_clock;
177 pinfo->dfps.codes_dfps[i].pll_codes =
178 pinfo->mipi.pll_codes;
179
180 mdss_dsi_panel_clock(0, pinfo);
181 } else {
182 ret = err;
183 pinfo->dfps.codes_dfps[i].is_valid = 0;
184 dprintf(CRITICAL, "frame_rate=%d failed!\n",
185 pinfo->mipi.frame_rate);
186 }
187 }
188
189 pinfo->mipi.frame_rate = fps_bak;
190
191 return ret;
192}
193
Huaibin Yangb6fa92b2015-01-28 16:21:37 -0800194static int mdss_dsi_dfps_get_stored_pll_codes(struct msm_panel_info *pinfo)
195{
196 int ret = NO_ERROR;
197 int index;
198 unsigned long long ptn;
199 uint32_t blocksize;
200 struct dfps_info *dfps;
201
202 index = partition_get_index("splash");
Casey Piper69f95682015-03-30 16:19:45 -0700203 if (index == INVALID_PTN) {
204 dprintf(INFO, "%s: splash partition table not found\n", __func__);
Jeevan Shrirame2014662015-08-03 15:11:27 -0700205 ret = ERROR;
Huaibin Yangb6fa92b2015-01-28 16:21:37 -0800206 goto splash_err;
207 }
208
209 ptn = partition_get_offset(index);
210 if (ptn == 0) {
211 dprintf(CRITICAL, "ERROR: splash Partition invalid offset\n");
212 ret = ERROR;
213 goto splash_err;
214 }
215
Channagoud Kadabi7f666372015-02-24 14:37:32 -0800216 mmc_set_lun(partition_get_lun(index));
217
Huaibin Yangb6fa92b2015-01-28 16:21:37 -0800218 blocksize = mmc_get_device_blocksize();
219 if (blocksize == 0) {
220 dprintf(CRITICAL, "ERROR:splash Partition invalid blocksize\n");
221 ret = ERROR;
222 goto splash_err;
223 }
224
225 dfps = (struct dfps_info *)memalign(CACHE_LINE, ROUNDUP(PAGE_SIZE,
226 CACHE_LINE));
227 if (!dfps) {
228 dprintf(CRITICAL, "ERROR:splash Partition invalid memory\n");
229 ret = ERROR;
230 goto splash_err;
231 }
232
233 if (mmc_read(ptn, (uint32_t *) dfps, blocksize)) {
234 dprintf(CRITICAL, "mmc read splash failure%d\n", PAGE_SIZE);
235 ret = ERROR;
236 free(dfps);
237 goto splash_err;
238 }
239
240 dprintf(SPEW, "enable=%d cnt=%d\n", dfps->panel_dfps.enabled,
241 dfps->panel_dfps.frame_rate_cnt);
242
243 if (!dfps->panel_dfps.enabled || dfps->panel_dfps.frame_rate_cnt >
244 DFPS_MAX_FRAME_RATE) {
245 ret = ERROR;
246 free(dfps);
247 goto splash_err;
248 }
249
250 pinfo->dfps = *dfps;
251 free(dfps);
252
253splash_err:
254 return ret;
255}
256
257static int mdss_dsi_dfps_store_pll_codes(struct msm_panel_info *pinfo)
258{
259 int ret = NO_ERROR;
260 int index;
261 unsigned long long ptn;
262
263 index = partition_get_index("splash");
Casey Piper69f95682015-03-30 16:19:45 -0700264 if (index == INVALID_PTN) {
265 dprintf(INFO, "%s: splash partition table not found\n", __func__);
Jeevan Shrirame2014662015-08-03 15:11:27 -0700266 ret = ERROR;
Huaibin Yangb6fa92b2015-01-28 16:21:37 -0800267 goto store_err;
268 }
269
270 ptn = partition_get_offset(index);
271 if (ptn == 0) {
272 dprintf(CRITICAL, "ERROR: splash Partition invalid offset\n");
273 ret = ERROR;
274 goto store_err;
275 }
276
Channagoud Kadabi7f666372015-02-24 14:37:32 -0800277 mmc_set_lun(partition_get_lun(index));
278
Huaibin Yangb6fa92b2015-01-28 16:21:37 -0800279 ret = mmc_write(ptn, sizeof(uint32_t), &pinfo->dfps);
280 if (ret)
281 dprintf(CRITICAL, "mmc write failed!\n");
282
283store_err:
284 return ret;
285}
286
Huaibin Yangcbec39b2014-11-07 13:54:38 -0800287static int mdss_dsi_mipi_dfps_config(struct msm_panel_info *pinfo)
288{
289 int ret = NO_ERROR;
290
291 if (!pinfo)
292 return ERROR;
293
294 if (!pinfo->dfps.panel_dfps.enabled)
295 goto dfps_done;
296
Huaibin Yangb6fa92b2015-01-28 16:21:37 -0800297 if (!mdss_dsi_dfps_get_stored_pll_codes(pinfo)) {
298 dprintf(SPEW, "Found stored PLL codes!\n");
299 goto dfps_cal_done;
300 }
Huaibin Yangcbec39b2014-11-07 13:54:38 -0800301
Huaibin Yangb6fa92b2015-01-28 16:21:37 -0800302 ret = mdss_dsi_dfps_get_pll_codes_cal(pinfo);
303 if (ret) {
304 dprintf(CRITICAL, "Cannot cal pll codes!\n");
305 goto dfps_done;
306 } else {
307 dprintf(SPEW, "Calibrate all pll codes!\n");
308 }
309
310 ret = mdss_dsi_dfps_store_pll_codes(pinfo);
311 if (ret)
312 dprintf(CRITICAL, "Cannot store pll codes!\n");
313
314dfps_cal_done:
Huaibin Yangb9f15e52015-01-22 10:34:47 -0800315 if (pinfo->dfps.dfps_fb_base)
316 memcpy(pinfo->dfps.dfps_fb_base, &pinfo->dfps,
317 sizeof(struct dfps_info));
Huaibin Yangcbec39b2014-11-07 13:54:38 -0800318dfps_done:
319 return ret;
320}
321
Casey Piper1bbd1572013-09-11 16:23:18 -0700322static int mdss_dsi_bl_enable(uint8_t enable)
323{
324 int ret = NO_ERROR;
325
326 ret = panel_backlight_ctrl(enable);
327 if (ret)
328 dprintf(CRITICAL, "Backlight %s failed\n", enable ? "enable" :
329 "disable");
330 return ret;
331}
332
Kuogee Hsieh80b8a6c2014-06-09 17:25:38 -0700333static void mdss_edp_panel_init(struct msm_panel_info *pinfo)
334{
335 return target_edp_panel_init(pinfo);
336}
337
338static uint32_t mdss_edp_panel_clock(uint8_t enable,
339 struct msm_panel_info *pinfo)
340{
341 return target_edp_panel_clock(enable, pinfo);
342}
343
344static uint32_t mdss_edp_panel_enable(void)
345{
346 return target_edp_panel_enable();
347}
348
349static uint32_t mdss_edp_panel_disable(void)
350{
351 return target_edp_panel_disable();
352}
353
Kuogee Hsieh93bcff62014-08-22 14:02:08 -0700354static int mdss_edp_panel_power(uint8_t enable,
355 struct msm_panel_info *pinfo)
Arpita Banerjee841fa062013-05-24 14:59:51 -0700356{
Casey Piperc574e082013-09-05 14:54:42 -0700357 int ret = NO_ERROR;
Arpita Banerjee841fa062013-05-24 14:59:51 -0700358
Kuogee Hsieh80b8a6c2014-06-09 17:25:38 -0700359 if (enable) {
Kuogee Hsieh93bcff62014-08-22 14:02:08 -0700360 ret = target_ldo_ctrl(enable, pinfo);
Kuogee Hsieh80b8a6c2014-06-09 17:25:38 -0700361 if (ret) {
362 dprintf(CRITICAL, "LDO control enable failed\n");
363 return ret;
364 }
365
366 ret = mdss_edp_panel_enable();
367 if (ret) {
368 dprintf(CRITICAL, "%s: panel enable failed\n", __func__);
369 return ret;
370 }
371 dprintf(SPEW, "EDP Panel power on done\n");
372 } else {
373 /* Disable panel and ldo */
374 ret = mdss_edp_panel_disable();
375 if (ret) {
376 dprintf(CRITICAL, "%s: panel disable failed\n", __func__);
377 return ret;
378 }
379
Kuogee Hsieh93bcff62014-08-22 14:02:08 -0700380 ret = target_ldo_ctrl(enable, pinfo);
Kuogee Hsieh80b8a6c2014-06-09 17:25:38 -0700381 if (ret) {
382 dprintf(CRITICAL, "%s: ldo control disable failed\n", __func__);
383 return ret;
384 }
385 dprintf(SPEW, "EDP Panel power off done\n");
386 }
387
388 return ret;
389}
390
391static int mdss_edp_bl_enable(uint8_t enable)
392{
393 int ret = NO_ERROR;
394
395 ret = target_edp_bl_ctrl(enable);
396 if (ret)
397 dprintf(CRITICAL, "Backlight %s failed\n", enable ? "enable" :
398 "disable");
399 return ret;
400}
401
Vineet Bajajc2272462015-05-07 17:35:03 +0530402static int mdss_dsi2HDMI_config (struct msm_panel_info *pinfo)
403{
404 return target_display_dsi2hdmi_config(pinfo);
405}
406
Padmanabhan Komandurubccbcdc2015-06-30 16:19:24 +0530407struct panel_struct mdss_dsi_get_panel_data(void)
408{
409 return panelstruct;
410}
411
Padmanabhan Komandurudc0eaca2015-08-28 16:29:59 +0530412static void mdss_dsi_check_swap_status(void)
413{
414 char *panel_dest, *dsi_controller;
415 struct oem_panel_data *oem_data = mdss_dsi_get_oem_data_ptr();
416
417 if (!oem_data->swap_dsi_ctrl)
418 return;
419
420 if (panelstruct.paneldata->panel_operating_mode &
421 (SPLIT_DISPLAY_FLAG | DUAL_DSI_FLAG)) {
422 dprintf(CRITICAL, "DSI swap invalid for split DSI panel!\n");
423 return;
424 }
425
426 /* Swap the panel destination and use appropriate PLL */
427 if (!strcmp(panelstruct.paneldata->panel_destination, "DISPLAY_1")) {
428 panel_dest = "DISPLAY_2";
429 dsi_controller = "dsi:1:";
430 panelstruct.paneldata->panel_operating_mode |= USE_DSI1_PLL_FLAG;
431 } else {
432 panel_dest = "DISPLAY_1";
433 dsi_controller = "dsi:0:";
434 panelstruct.paneldata->panel_operating_mode &= ~USE_DSI1_PLL_FLAG;
435 }
436 panelstruct.paneldata->panel_destination = panel_dest;
437 panelstruct.paneldata->panel_controller = dsi_controller;
438}
439
Padmanabhan Komanduru75f5b3b2015-07-06 18:28:51 +0530440static void mdss_dsi_set_pll_src(void)
441{
442 struct oem_panel_data *oem_data = mdss_dsi_get_oem_data_ptr();
443
Padmanabhan Komanduruaa1e6832015-08-28 14:55:24 +0530444 /* Set PLL_SRC to PLL1 for non dual-DSI cases only */
445 if (!is_dsi_config_dual() &&
446 (panelstruct.paneldata->panel_operating_mode &
447 USE_DSI1_PLL_FLAG))
Padmanabhan Komanduru75f5b3b2015-07-06 18:28:51 +0530448 oem_data->dsi_pll_src = DSI_PLL1;
449
Padmanabhan Komanduruaa1e6832015-08-28 14:55:24 +0530450 if (is_dsi_config_dual()) {
Padmanabhan Komanduru75f5b3b2015-07-06 18:28:51 +0530451 if (oem_data->dsi_pll_src != DSI_PLL_DEFAULT) {
452 dprintf(CRITICAL, "Dual DSI config detected!"
453 "Use default PLL\n");
454 oem_data->dsi_pll_src = DSI_PLL_DEFAULT;
455 }
Padmanabhan Komanduruaa1e6832015-08-28 14:55:24 +0530456 } else if (is_dsi_config_split()) {
Padmanabhan Komanduru75f5b3b2015-07-06 18:28:51 +0530457 if((dsi_video_mode_phy_db.pll_type != DSI_PLL_TYPE_THULIUM)
458 && (oem_data->dsi_pll_src == DSI_PLL1)) {
459 dprintf(CRITICAL, "Split DSI on 28nm/20nm!"
460 "Use DSI PLL0\n");
461 oem_data->dsi_pll_src = DSI_PLL0;
462 }
463 } else {
464 if ((dsi_video_mode_phy_db.pll_type != DSI_PLL_TYPE_THULIUM)
465 && !strcmp(panelstruct.paneldata->panel_destination,
466 "DISPLAY_1") && (oem_data->dsi_pll_src == DSI_PLL1)) {
467 dprintf(CRITICAL, "Single DSI with DSI-0 on 28nm/20nm!"
468 "Use DSI PLL0\n");
469 oem_data->dsi_pll_src = DSI_PLL0;
470 }
471 }
472
473 if (oem_data->dsi_pll_src == DSI_PLL1)
474 panelstruct.paneldata->panel_operating_mode |=
475 USE_DSI1_PLL_FLAG;
Padmanabhan Komanduruaa1e6832015-08-28 14:55:24 +0530476 else if (oem_data->dsi_pll_src == DSI_PLL0)
Padmanabhan Komanduru75f5b3b2015-07-06 18:28:51 +0530477 panelstruct.paneldata->panel_operating_mode &=
478 ~USE_DSI1_PLL_FLAG;
Padmanabhan Komanduru75f5b3b2015-07-06 18:28:51 +0530479}
480
Kuogee Hsieh80b8a6c2014-06-09 17:25:38 -0700481int gcdb_display_init(const char *panel_name, uint32_t rev, void *base)
482{
483 int ret = NO_ERROR;
484 int pan_type;
485
Dhaval Patel8b9a5822015-03-16 13:01:26 -0700486 dsi_video_mode_phy_db.pll_type = DSI_PLL_TYPE_28NM;
Kuogee Hsieh80b8a6c2014-06-09 17:25:38 -0700487 pan_type = oem_panel_select(panel_name, &panelstruct, &(panel.panel_info),
488 &dsi_video_mode_phy_db);
489
490 if (pan_type == PANEL_TYPE_DSI) {
Dhaval Patel7709c412015-05-12 10:09:41 -0700491 target_dsi_phy_config(&dsi_video_mode_phy_db);
Padmanabhan Komandurudc0eaca2015-08-28 16:29:59 +0530492 mdss_dsi_check_swap_status();
Padmanabhan Komanduru75f5b3b2015-07-06 18:28:51 +0530493 mdss_dsi_set_pll_src();
Kuogee Hsieh80b8a6c2014-06-09 17:25:38 -0700494 if (dsi_panel_init(&(panel.panel_info), &panelstruct)) {
495 dprintf(CRITICAL, "DSI panel init failed!\n");
496 ret = ERROR;
497 goto error_gcdb_display_init;
498 }
499
500 panel.panel_info.mipi.mdss_dsi_phy_db = &dsi_video_mode_phy_db;
501 panel.pll_clk_func = mdss_dsi_panel_clock;
Huaibin Yangcbec39b2014-11-07 13:54:38 -0800502 panel.dfps_func = mdss_dsi_mipi_dfps_config;
Kuogee Hsieh80b8a6c2014-06-09 17:25:38 -0700503 panel.power_func = mdss_dsi_panel_power;
504 panel.pre_init_func = mdss_dsi_panel_pre_init;
505 panel.bl_func = mdss_dsi_bl_enable;
Vineet Bajajc2272462015-05-07 17:35:03 +0530506 panel.dsi2HDMI_config = mdss_dsi2HDMI_config;
Huaibin Yangb9f15e52015-01-22 10:34:47 -0800507 /*
508 * If dfps enabled, reserve fb memory to store pll
509 * codes and pass pll codes values to kernel.
510 */
511 if (panel.panel_info.dfps.panel_dfps.enabled) {
512 panel.panel_info.dfps.dfps_fb_base = base;
513 base += DFPS_PLL_CODES_SIZE;
Jeevan Shrirame2014662015-08-03 15:11:27 -0700514 dprintf(SPEW, "dfps base=0x%p,d, fb_base=0x%p!\n",
515 panel.panel_info.dfps.dfps_fb_base, base);
Huaibin Yangb9f15e52015-01-22 10:34:47 -0800516 }
517
Kuogee Hsieh80b8a6c2014-06-09 17:25:38 -0700518 panel.fb.base = base;
519 panel.fb.width = panel.panel_info.xres;
520 panel.fb.height = panel.panel_info.yres;
521 panel.fb.stride = panel.panel_info.xres;
522 panel.fb.bpp = panel.panel_info.bpp;
523 panel.fb.format = panel.panel_info.mipi.dst_format;
524 } else if (pan_type == PANEL_TYPE_EDP) {
525 mdss_edp_panel_init(&(panel.panel_info));
526 /* prepare func is set up at edp_panel_init */
527 panel.clk_func = mdss_edp_panel_clock;
528 panel.power_func = mdss_edp_panel_power;
529 panel.bl_func = mdss_edp_bl_enable;
530 panel.fb.format = FB_FORMAT_RGB888;
531 } else {
Arpita Banerjee841fa062013-05-24 14:59:51 -0700532 dprintf(CRITICAL, "Target panel init not found!\n");
Casey Piperc574e082013-09-05 14:54:42 -0700533 ret = ERR_NOT_SUPPORTED;
534 goto error_gcdb_display_init;
Arpita Banerjee841fa062013-05-24 14:59:51 -0700535
Arpita Banerjee841fa062013-05-24 14:59:51 -0700536 }
537
Arpita Banerjee841fa062013-05-24 14:59:51 -0700538 panel.fb.base = base;
Arpita Banerjee841fa062013-05-24 14:59:51 -0700539 panel.mdp_rev = rev;
540
Casey Piperc574e082013-09-05 14:54:42 -0700541 ret = msm_display_init(&panel);
Arpita Banerjee841fa062013-05-24 14:59:51 -0700542
Casey Piperc574e082013-09-05 14:54:42 -0700543error_gcdb_display_init:
544 display_enable = ret ? 0 : 1;
545 return ret;
Arpita Banerjee841fa062013-05-24 14:59:51 -0700546}
547
548void gcdb_display_shutdown(void)
549{
550 if (display_enable)
551 msm_display_off();
552}