blob: fa268b1a59108efd87ca3937d28396d1c0fdfc14 [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>
42
43#include "include/display_resource.h"
44#include "include/panel.h"
45#include "panel_display.h"
46#include "gcdb_display.h"
47#include "target/display.h"
Arpita Banerjeeda0c39a2013-05-24 16:12:45 -070048#include "gcdb_autopll.h"
Arpita Banerjee841fa062013-05-24 14:59:51 -070049
50/*---------------------------------------------------------------------------*/
51/* static */
52/*---------------------------------------------------------------------------*/
53static struct msm_fb_panel_data panel;
54struct panel_struct panelstruct;
55static uint8_t display_enable;
56static struct mdss_dsi_phy_ctrl dsi_video_mode_phy_db;
57
Arpita Banerjee841fa062013-05-24 14:59:51 -070058/*---------------------------------------------------------------------------*/
59/* Extern */
60/*---------------------------------------------------------------------------*/
61extern int msm_display_init(struct msm_fb_panel_data *pdata);
62extern int msm_display_off();
63
64static uint32_t panel_backlight_ctrl(uint8_t enable)
65{
Kuogee Hsieh5accef12013-12-18 14:12:09 -080066 return target_backlight_ctrl(panelstruct.backlightinfo, enable);
Arpita Banerjee841fa062013-05-24 14:59:51 -070067}
68
69static uint32_t mdss_dsi_panel_reset(uint8_t enable)
70{
71 uint32_t ret = NO_ERROR;
72
Dhaval Patel29f24492013-08-08 20:45:42 -070073 ret = target_panel_reset(enable, panelstruct.panelresetseq,
74 &panel.panel_info);
Arpita Banerjee841fa062013-05-24 14:59:51 -070075
76 return ret;
77}
78
Arpita Banerjeeda0c39a2013-05-24 16:12:45 -070079static uint32_t mdss_dsi_panel_clock(uint8_t enable,
80 struct msm_panel_info *pinfo)
Arpita Banerjee841fa062013-05-24 14:59:51 -070081{
82 uint32_t ret = NO_ERROR;
83
Arpita Banerjeeda0c39a2013-05-24 16:12:45 -070084 ret = calculate_clock_config(pinfo);
Huaibin Yangcbec39b2014-11-07 13:54:38 -080085 if (ret)
86 dprintf(CRITICAL, "Clock calculation failed\n");
87 else
88 ret = target_panel_clock(enable, pinfo);
Arpita Banerjee841fa062013-05-24 14:59:51 -070089
90 return ret;
91}
92
Kuogee Hsieh93bcff62014-08-22 14:02:08 -070093static int mdss_dsi_panel_power(uint8_t enable,
94 struct msm_panel_info *pinfo)
Arpita Banerjee841fa062013-05-24 14:59:51 -070095{
96 int ret = NO_ERROR;
97
98 if (enable) {
Kuogee Hsieh93bcff62014-08-22 14:02:08 -070099 ret = target_ldo_ctrl(enable, pinfo);
Arpita Banerjee841fa062013-05-24 14:59:51 -0700100 if (ret) {
Jayant Shekharc9611a92013-11-20 16:59:27 +0530101 dprintf(CRITICAL, "LDO control enable failed\n");
Arpita Banerjee841fa062013-05-24 14:59:51 -0700102 return ret;
103 }
104
105 /* Panel Reset */
Jayant Shekharc9611a92013-11-20 16:59:27 +0530106 if (!panelstruct.paneldata->panel_lp11_init) {
107 ret = mdss_dsi_panel_reset(enable);
108 if (ret) {
109 dprintf(CRITICAL, "panel reset failed\n");
110 return ret;
111 }
Arpita Banerjee841fa062013-05-24 14:59:51 -0700112 }
113 dprintf(SPEW, "Panel power on done\n");
114 } else {
Casey Piper1bbd1572013-09-11 16:23:18 -0700115 /* Disable panel and ldo */
Arpita Banerjee841fa062013-05-24 14:59:51 -0700116 ret = mdss_dsi_panel_reset(enable);
117 if (ret) {
Jayant Shekharc9611a92013-11-20 16:59:27 +0530118 dprintf(CRITICAL, "panel reset disable failed\n");
Arpita Banerjee841fa062013-05-24 14:59:51 -0700119 return ret;
120 }
121
Kuogee Hsieh93bcff62014-08-22 14:02:08 -0700122 ret = target_ldo_ctrl(enable, pinfo);
Arpita Banerjee841fa062013-05-24 14:59:51 -0700123 if (ret) {
Jayant Shekharc9611a92013-11-20 16:59:27 +0530124 dprintf(CRITICAL, "ldo control disable failed\n");
Arpita Banerjee841fa062013-05-24 14:59:51 -0700125 return ret;
126 }
127 dprintf(SPEW, "Panel power off done\n");
128 }
129
130 return ret;
131}
132
Ray Zhangeb462f62013-12-03 17:16:08 +0800133static int mdss_dsi_panel_pre_init(void)
Jayant Shekharc9611a92013-11-20 16:59:27 +0530134{
135 int ret = NO_ERROR;
136
Ray Zhangeb462f62013-12-03 17:16:08 +0800137 if (panelstruct.paneldata->panel_lp11_init) {
138 ret = mdss_dsi_panel_reset(1);
139 if (ret) {
140 dprintf(CRITICAL, "panel reset failed\n");
141 return ret;
Jayant Shekharc9611a92013-11-20 16:59:27 +0530142 }
Jayant Shekharc9611a92013-11-20 16:59:27 +0530143 }
144
Ray Zhangeb462f62013-12-03 17:16:08 +0800145 if(panelstruct.paneldata->panel_init_delay)
146 udelay(panelstruct.paneldata->panel_init_delay);
147
148 dprintf(SPEW, "Panel pre init done\n");
Jayant Shekharc9611a92013-11-20 16:59:27 +0530149 return ret;
150}
151
Huaibin Yangcbec39b2014-11-07 13:54:38 -0800152static int mdss_dsi_dfps_get_pll_codes(struct msm_panel_info *pinfo)
153{
154 int ret = NO_ERROR;
155 uint32_t fps_bak;
156 uint32_t i;
157
158 fps_bak = pinfo->mipi.frame_rate;
159
160 for (i = 0; i < pinfo->dfps.panel_dfps.frame_rate_cnt; i++) {
161 int err;
162 pinfo->mipi.frame_rate = pinfo->dfps.panel_dfps.frame_rate[i];
163
164 err = mdss_dsi_panel_clock(1, pinfo);
165 if (!err) {
166 pinfo->dfps.codes_dfps[i].is_valid = 1;
167 pinfo->dfps.codes_dfps[i].frame_rate =
168 pinfo->mipi.frame_rate;
169 pinfo->dfps.codes_dfps[i].frame_rate =
170 pinfo->mipi.frame_rate;
171 pinfo->dfps.codes_dfps[i].clk_rate =
172 pinfo->mipi.dsi_pll_config->vco_clock;
173 pinfo->dfps.codes_dfps[i].pll_codes =
174 pinfo->mipi.pll_codes;
175
176 mdss_dsi_panel_clock(0, pinfo);
177 } else {
178 ret = err;
179 pinfo->dfps.codes_dfps[i].is_valid = 0;
180 dprintf(CRITICAL, "frame_rate=%d failed!\n",
181 pinfo->mipi.frame_rate);
182 }
183 }
184
185 pinfo->mipi.frame_rate = fps_bak;
186
187 return ret;
188}
189
190static int mdss_dsi_mipi_dfps_config(struct msm_panel_info *pinfo)
191{
192 int ret = NO_ERROR;
193
194 if (!pinfo)
195 return ERROR;
196
197 if (!pinfo->dfps.panel_dfps.enabled)
198 goto dfps_done;
199
200 ret = mdss_dsi_dfps_get_pll_codes(pinfo);
201
Huaibin Yangb9f15e52015-01-22 10:34:47 -0800202 if (pinfo->dfps.dfps_fb_base)
203 memcpy(pinfo->dfps.dfps_fb_base, &pinfo->dfps,
204 sizeof(struct dfps_info));
Huaibin Yangcbec39b2014-11-07 13:54:38 -0800205dfps_done:
206 return ret;
207}
208
Casey Piper1bbd1572013-09-11 16:23:18 -0700209static int mdss_dsi_bl_enable(uint8_t enable)
210{
211 int ret = NO_ERROR;
212
213 ret = panel_backlight_ctrl(enable);
214 if (ret)
215 dprintf(CRITICAL, "Backlight %s failed\n", enable ? "enable" :
216 "disable");
217 return ret;
218}
219
Veera Sundaram Sankarand9a868a2014-10-17 12:11:01 -0700220static bool mdss_dsi_set_panel_node(char *panel_name, char **dsi_id,
221 char **panel_node, char **slave_panel_node, int *panel_mode)
222{
223 if (!strcmp(panel_name, SIM_VIDEO_PANEL)) {
224 *dsi_id = SIM_DSI_ID;
225 *panel_node = SIM_VIDEO_PANEL_NODE;
226 *panel_mode = 0;
227 } else if (!strcmp(panel_name, SIM_DUALDSI_VIDEO_PANEL)) {
228 *dsi_id = SIM_DSI_ID;
229 *panel_node = SIM_DUALDSI_VIDEO_PANEL_NODE;
230 *slave_panel_node = SIM_DUALDSI_VIDEO_SLAVE_PANEL_NODE;
231 *panel_mode = 1;
232 } else if (!strcmp(panel_name, SIM_CMD_PANEL)) {
233 *dsi_id = SIM_DSI_ID;
234 *panel_node = SIM_CMD_PANEL_NODE;
235 *panel_mode = 0;
236 } else if (!strcmp(panel_name, SIM_DUALDSI_CMD_PANEL)) {
237 *dsi_id = SIM_DSI_ID;
238 *panel_node = SIM_DUALDSI_CMD_PANEL_NODE;
239 *slave_panel_node = SIM_DUALDSI_CMD_SLAVE_PANEL_NODE;
240 *panel_mode = 1;
241 } else {
242 return false;
243 }
244 return true;
245}
246
Veera Sundaram Sankaranc95d6752014-07-31 11:49:52 -0700247bool gcdb_display_cmdline_arg(char *panel_name, char *pbuf, uint16_t buf_size)
Dhaval Patel9f61f132013-07-18 14:45:11 -0700248{
Channagoud Kadabi4767b472013-09-26 20:45:34 -0700249 char *dsi_id = NULL;
250 char *panel_node = NULL;
Dhaval Patel7b9d6782014-01-03 13:31:09 -0800251 char *slave_panel_node = NULL;
252 uint16_t dsi_id_len = 0, panel_node_len = 0, slave_panel_node_len = 0;
253 uint32_t arg_size = 0;
Dhaval Patel9f61f132013-07-18 14:45:11 -0700254 bool ret = true;
Veera Sundaram Sankarand9a868a2014-10-17 12:11:01 -0700255 bool rc;
Casey Pipera078d492013-11-15 12:26:17 -0800256 char *default_str;
Vineet Bajaj4effb132014-07-24 16:55:41 +0530257 int panel_mode = SPLIT_DISPLAY_FLAG | DUAL_PIPE_FLAG | DST_SPLIT_FLAG;
Dhaval Patel31feb292013-10-10 19:30:04 -0700258 int prefix_string_len = strlen(DISPLAY_CMDLINE_PREFIX);
Aravind Venkateswaranf21253e2014-12-08 17:15:57 -0800259 char *sctl_string;
Dhaval Patel9f61f132013-07-18 14:45:11 -0700260
Veera Sundaram Sankarand9a868a2014-10-17 12:11:01 -0700261 panel_name += strspn(panel_name, " ");
Dhaval Patel31feb292013-10-10 19:30:04 -0700262
Veera Sundaram Sankarand9a868a2014-10-17 12:11:01 -0700263 rc = mdss_dsi_set_panel_node(panel_name, &dsi_id, &panel_node,
264 &slave_panel_node, &panel_mode);
265 if (!rc) {
266 if (panelstruct.paneldata && target_cont_splash_screen()) {
267 dsi_id = panelstruct.paneldata->panel_controller;
268 panel_node = panelstruct.paneldata->panel_node_id;
269 panel_mode =
270 panelstruct.paneldata->panel_operating_mode &
271 panel_mode;
272 slave_panel_node =
273 panelstruct.paneldata->slave_panel_node_id;
274 } else {
275 if (target_is_edp())
276 default_str = "0:edp:";
277 else
278 default_str = "0:dsi:0:";
279
280 arg_size = prefix_string_len + strlen(default_str);
281 if (buf_size < arg_size) {
282 dprintf(CRITICAL, "display command line buffer is small\n");
283 return false;
284 }
285
286 strlcpy(pbuf, DISPLAY_CMDLINE_PREFIX, buf_size);
287 pbuf += prefix_string_len;
288 buf_size -= prefix_string_len;
289
290 strlcpy(pbuf, default_str, buf_size);
291 return true;
Dhaval Patel31feb292013-10-10 19:30:04 -0700292 }
Casey Pipera078d492013-11-15 12:26:17 -0800293 }
Channagoud Kadabi4767b472013-09-26 20:45:34 -0700294
Dhaval Patel7b9d6782014-01-03 13:31:09 -0800295 if (dsi_id == NULL || panel_node == NULL) {
296 dprintf(CRITICAL, "panel node or dsi ctrl not present\n");
Dhaval Patelbc7fa212013-08-28 10:46:42 -0700297 return false;
Dhaval Patel7b9d6782014-01-03 13:31:09 -0800298 }
299
Ujwal Patel36fab7d2014-11-06 14:11:26 -0800300 if (((panel_mode & SPLIT_DISPLAY_FLAG) ||
301 (panel_mode & DST_SPLIT_FLAG)) && slave_panel_node == NULL) {
Dhaval Patel7b9d6782014-01-03 13:31:09 -0800302 dprintf(CRITICAL, "slave node not present in dual dsi case\n");
303 return false;
304 }
Dhaval Patelbc7fa212013-08-28 10:46:42 -0700305
306 dsi_id_len = strlen(dsi_id);
Dhaval Patel7b9d6782014-01-03 13:31:09 -0800307 panel_node_len = strlen(panel_node);
Veera Sundaram Sankaran58da7cf2014-10-03 18:05:24 -0700308 if (!slave_panel_node)
309 slave_panel_node = NO_PANEL_CONFIG;
310 slave_panel_node_len = strlen(slave_panel_node);
Dhaval Patelbc7fa212013-08-28 10:46:42 -0700311
Dhaval Patel31feb292013-10-10 19:30:04 -0700312 arg_size = prefix_string_len + dsi_id_len + panel_node_len +
313 LK_OVERRIDE_PANEL_LEN + 1;
Dhaval Patel7b9d6782014-01-03 13:31:09 -0800314
Aravind Venkateswaranf21253e2014-12-08 17:15:57 -0800315 if (!strcmp(panelstruct.paneldata->panel_destination, "DISPLAY_2"))
316 sctl_string = DSI_0_STRING;
317 else
318 sctl_string = DSI_1_STRING;
319
320 arg_size += strlen(sctl_string) + slave_panel_node_len;
Dhaval Patel7b9d6782014-01-03 13:31:09 -0800321
Veera Sundaram Sankaranc95d6752014-07-31 11:49:52 -0700322 if (buf_size < arg_size) {
Dhaval Patel7b9d6782014-01-03 13:31:09 -0800323 dprintf(CRITICAL, "display command line buffer is small\n");
Dhaval Patel9f61f132013-07-18 14:45:11 -0700324 ret = false;
Veera Sundaram Sankaranc95d6752014-07-31 11:49:52 -0700325 } else {
Dhaval Patel31feb292013-10-10 19:30:04 -0700326 strlcpy(pbuf, DISPLAY_CMDLINE_PREFIX, buf_size);
327 pbuf += prefix_string_len;
328 buf_size -= prefix_string_len;
329
Dhaval Patel7b9d6782014-01-03 13:31:09 -0800330 strlcpy(pbuf, LK_OVERRIDE_PANEL, buf_size);
331 pbuf += LK_OVERRIDE_PANEL_LEN;
332 buf_size -= LK_OVERRIDE_PANEL_LEN;
Dhaval Patel9f61f132013-07-18 14:45:11 -0700333
334 strlcpy(pbuf, dsi_id, buf_size);
Dhaval Patelbc7fa212013-08-28 10:46:42 -0700335 pbuf += dsi_id_len;
336 buf_size -= dsi_id_len;
Dhaval Patel9f61f132013-07-18 14:45:11 -0700337
338 strlcpy(pbuf, panel_node, buf_size);
Dhaval Patel7b9d6782014-01-03 13:31:09 -0800339
Dhaval Patel7b9d6782014-01-03 13:31:09 -0800340 pbuf += panel_node_len;
341 buf_size -= panel_node_len;
342
Aravind Venkateswaranf21253e2014-12-08 17:15:57 -0800343 strlcpy(pbuf, sctl_string, buf_size);
344 pbuf += strlen(sctl_string);
345 buf_size -= strlen(sctl_string);
Veera Sundaram Sankaran58da7cf2014-10-03 18:05:24 -0700346 strlcpy(pbuf, slave_panel_node, buf_size);
Dhaval Patel9f61f132013-07-18 14:45:11 -0700347 }
348 return ret;
349}
350
351
Arpita Banerjee841fa062013-05-24 14:59:51 -0700352static void init_platform_data()
353{
354 memcpy(dsi_video_mode_phy_db.regulator, panel_regulator_settings,
355 REGULATOR_SIZE);
356 memcpy(dsi_video_mode_phy_db.ctrl, panel_physical_ctrl,
357 PHYSICAL_SIZE);
358 memcpy(dsi_video_mode_phy_db.strength, panel_strength_ctrl,
359 STRENGTH_SIZE);
360 memcpy(dsi_video_mode_phy_db.bistCtrl, panel_bist_ctrl, BIST_SIZE);
361 memcpy(dsi_video_mode_phy_db.laneCfg, panel_lane_config, LANE_SIZE);
362}
363
Kuogee Hsieh80b8a6c2014-06-09 17:25:38 -0700364static void mdss_edp_panel_init(struct msm_panel_info *pinfo)
365{
366 return target_edp_panel_init(pinfo);
367}
368
369static uint32_t mdss_edp_panel_clock(uint8_t enable,
370 struct msm_panel_info *pinfo)
371{
372 return target_edp_panel_clock(enable, pinfo);
373}
374
375static uint32_t mdss_edp_panel_enable(void)
376{
377 return target_edp_panel_enable();
378}
379
380static uint32_t mdss_edp_panel_disable(void)
381{
382 return target_edp_panel_disable();
383}
384
Kuogee Hsieh93bcff62014-08-22 14:02:08 -0700385static int mdss_edp_panel_power(uint8_t enable,
386 struct msm_panel_info *pinfo)
Arpita Banerjee841fa062013-05-24 14:59:51 -0700387{
Casey Piperc574e082013-09-05 14:54:42 -0700388 int ret = NO_ERROR;
Arpita Banerjee841fa062013-05-24 14:59:51 -0700389
Kuogee Hsieh80b8a6c2014-06-09 17:25:38 -0700390 if (enable) {
Kuogee Hsieh93bcff62014-08-22 14:02:08 -0700391 ret = target_ldo_ctrl(enable, pinfo);
Kuogee Hsieh80b8a6c2014-06-09 17:25:38 -0700392 if (ret) {
393 dprintf(CRITICAL, "LDO control enable failed\n");
394 return ret;
395 }
396
397 ret = mdss_edp_panel_enable();
398 if (ret) {
399 dprintf(CRITICAL, "%s: panel enable failed\n", __func__);
400 return ret;
401 }
402 dprintf(SPEW, "EDP Panel power on done\n");
403 } else {
404 /* Disable panel and ldo */
405 ret = mdss_edp_panel_disable();
406 if (ret) {
407 dprintf(CRITICAL, "%s: panel disable failed\n", __func__);
408 return ret;
409 }
410
Kuogee Hsieh93bcff62014-08-22 14:02:08 -0700411 ret = target_ldo_ctrl(enable, pinfo);
Kuogee Hsieh80b8a6c2014-06-09 17:25:38 -0700412 if (ret) {
413 dprintf(CRITICAL, "%s: ldo control disable failed\n", __func__);
414 return ret;
415 }
416 dprintf(SPEW, "EDP Panel power off done\n");
417 }
418
419 return ret;
420}
421
422static int mdss_edp_bl_enable(uint8_t enable)
423{
424 int ret = NO_ERROR;
425
426 ret = target_edp_bl_ctrl(enable);
427 if (ret)
428 dprintf(CRITICAL, "Backlight %s failed\n", enable ? "enable" :
429 "disable");
430 return ret;
431}
432
433int gcdb_display_init(const char *panel_name, uint32_t rev, void *base)
434{
435 int ret = NO_ERROR;
436 int pan_type;
437
438 pan_type = oem_panel_select(panel_name, &panelstruct, &(panel.panel_info),
439 &dsi_video_mode_phy_db);
440
441 if (pan_type == PANEL_TYPE_DSI) {
442 init_platform_data();
443 if (dsi_panel_init(&(panel.panel_info), &panelstruct)) {
444 dprintf(CRITICAL, "DSI panel init failed!\n");
445 ret = ERROR;
446 goto error_gcdb_display_init;
447 }
448
449 panel.panel_info.mipi.mdss_dsi_phy_db = &dsi_video_mode_phy_db;
450 panel.pll_clk_func = mdss_dsi_panel_clock;
Huaibin Yangcbec39b2014-11-07 13:54:38 -0800451 panel.dfps_func = mdss_dsi_mipi_dfps_config;
Kuogee Hsieh80b8a6c2014-06-09 17:25:38 -0700452 panel.power_func = mdss_dsi_panel_power;
453 panel.pre_init_func = mdss_dsi_panel_pre_init;
454 panel.bl_func = mdss_dsi_bl_enable;
Huaibin Yangb9f15e52015-01-22 10:34:47 -0800455 /*
456 * If dfps enabled, reserve fb memory to store pll
457 * codes and pass pll codes values to kernel.
458 */
459 if (panel.panel_info.dfps.panel_dfps.enabled) {
460 panel.panel_info.dfps.dfps_fb_base = base;
461 base += DFPS_PLL_CODES_SIZE;
462 dprintf(SPEW, "fb_base=0x%p!\n", base);
463 }
464
Kuogee Hsieh80b8a6c2014-06-09 17:25:38 -0700465 panel.fb.base = base;
466 panel.fb.width = panel.panel_info.xres;
467 panel.fb.height = panel.panel_info.yres;
468 panel.fb.stride = panel.panel_info.xres;
469 panel.fb.bpp = panel.panel_info.bpp;
470 panel.fb.format = panel.panel_info.mipi.dst_format;
471 } else if (pan_type == PANEL_TYPE_EDP) {
472 mdss_edp_panel_init(&(panel.panel_info));
473 /* prepare func is set up at edp_panel_init */
474 panel.clk_func = mdss_edp_panel_clock;
475 panel.power_func = mdss_edp_panel_power;
476 panel.bl_func = mdss_edp_bl_enable;
477 panel.fb.format = FB_FORMAT_RGB888;
478 } else {
Arpita Banerjee841fa062013-05-24 14:59:51 -0700479 dprintf(CRITICAL, "Target panel init not found!\n");
Casey Piperc574e082013-09-05 14:54:42 -0700480 ret = ERR_NOT_SUPPORTED;
481 goto error_gcdb_display_init;
Arpita Banerjee841fa062013-05-24 14:59:51 -0700482
Arpita Banerjee841fa062013-05-24 14:59:51 -0700483 }
484
Arpita Banerjee841fa062013-05-24 14:59:51 -0700485 panel.fb.base = base;
Arpita Banerjee841fa062013-05-24 14:59:51 -0700486 panel.mdp_rev = rev;
487
Casey Piperc574e082013-09-05 14:54:42 -0700488 ret = msm_display_init(&panel);
Arpita Banerjee841fa062013-05-24 14:59:51 -0700489
Casey Piperc574e082013-09-05 14:54:42 -0700490error_gcdb_display_init:
491 display_enable = ret ? 0 : 1;
492 return ret;
Arpita Banerjee841fa062013-05-24 14:59:51 -0700493}
494
495void gcdb_display_shutdown(void)
496{
497 if (display_enable)
498 msm_display_off();
499}