blob: 114fa41537652ab2b9c3310a7de0b07005169664 [file] [log] [blame]
Padmanabhan Komanduru9d49f892015-04-10 12:58:46 -07001/* Copyright (c) 2015, The Linux Foundation. All rights reserved.
2 *
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 <string.h>
32#include <err.h>
33#include <smem.h>
34#include <msm_panel.h>
35#include <board.h>
feifanz525046b2015-06-01 20:31:06 +080036#include <qtimer.h>
Padmanabhan Komanduru9d49f892015-04-10 12:58:46 -070037#include <mipi_dsi.h>
Sandeep Pandaed082922015-08-03 12:18:25 +053038#include <mdp5.h>
Padmanabhan Komanduru9d49f892015-04-10 12:58:46 -070039#include <target/display.h>
40
Ujwal Patel41a665a2015-07-17 13:51:30 -070041#include "gcdb_display.h"
Padmanabhan Komanduru9d49f892015-04-10 12:58:46 -070042#include "include/panel.h"
43#include "panel_display.h"
44
45/*---------------------------------------------------------------------------*/
46/* GCDB Panel Database */
47/*---------------------------------------------------------------------------*/
48#include "include/panel_truly_1080p_video.h"
Jayant Shekhar9ea8dcd2015-04-20 15:18:37 +053049#include "include/panel_truly_1080p_cmd.h"
feifanz174c82c2015-04-15 18:57:07 +080050#include "include/panel_otm1906c_1080p_cmd.h"
Vishnuvardhan Prodduturi16eb20f2015-06-05 18:03:54 +053051#include "include/panel_sharp_1080p_cmd.h"
Padmanabhan Komanduru49a86cf2015-06-08 18:24:30 +053052#include "include/panel_nt35597_wqxga_dualdsi_video.h"
Vishnuvardhan Prodduturic1a46c52015-06-29 16:35:23 +053053#include "include/panel_nt35597_wqxga_dualdsi_cmd.h"
Ray Zhangf95f5b92015-06-25 15:34:29 +080054#include "include/panel_hx8399a_1080p_video.h"
Sandeep Pandaed082922015-08-03 12:18:25 +053055#include "include/panel_nt35597_wqxga_dsc_video.h"
56#include "include/panel_nt35597_wqxga_dsc_cmd.h"
Padmanabhan Komanduru4927c2c2015-08-21 14:55:16 +053057#include "include/panel_hx8394d_720p_video.h"
Padmanabhan Komanduru9d49f892015-04-10 12:58:46 -070058
59/*---------------------------------------------------------------------------*/
60/* static panel selection variable */
61/*---------------------------------------------------------------------------*/
62enum {
63 TRULY_1080P_VIDEO_PANEL,
Jayant Shekhar9ea8dcd2015-04-20 15:18:37 +053064 TRULY_1080P_CMD_PANEL,
feifanz174c82c2015-04-15 18:57:07 +080065 OTM1906C_1080P_CMD_PANEL,
Vishnuvardhan Prodduturi16eb20f2015-06-05 18:03:54 +053066 SHARP_1080P_CMD_PANEL,
Padmanabhan Komanduru49a86cf2015-06-08 18:24:30 +053067 NT35597_WQXGA_DUALDSI_VIDEO_PANEL,
Vishnuvardhan Prodduturic1a46c52015-06-29 16:35:23 +053068 NT35597_WQXGA_DUALDSI_CMD_PANEL,
Ray Zhangf95f5b92015-06-25 15:34:29 +080069 HX8399A_1080P_VIDEO_PANEL,
Sandeep Pandaed082922015-08-03 12:18:25 +053070 NT35597_WQXGA_DSC_VIDEO_PANEL,
71 NT35597_WQXGA_DSC_CMD_PANEL,
Padmanabhan Komanduru4927c2c2015-08-21 14:55:16 +053072 HX8394D_720P_VIDEO_PANEL,
Padmanabhan Komanduru9d49f892015-04-10 12:58:46 -070073 UNKNOWN_PANEL
74};
75
76uint32_t panel_regulator_settings[] = {
77 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
78};
79
80/*
81 * The list of panels that are supported on this target.
82 * Any panel in this list can be selected using fastboot oem command.
83 */
84static struct panel_list supp_panels[] = {
85 {"truly_1080p_video", TRULY_1080P_VIDEO_PANEL},
Jayant Shekhar9ea8dcd2015-04-20 15:18:37 +053086 {"truly_1080p_cmd", TRULY_1080P_CMD_PANEL},
Vishnuvardhan Prodduturi16eb20f2015-06-05 18:03:54 +053087 {"sharp_1080p_cmd", SHARP_1080P_CMD_PANEL},
Padmanabhan Komanduru49a86cf2015-06-08 18:24:30 +053088 {"nt35597_wqxga_dualdsi_video", NT35597_WQXGA_DUALDSI_VIDEO_PANEL},
Vishnuvardhan Prodduturic1a46c52015-06-29 16:35:23 +053089 {"nt35597_wqxga_dualdsi_cmd", NT35597_WQXGA_DUALDSI_CMD_PANEL},
Ray Zhangf95f5b92015-06-25 15:34:29 +080090 {"otm1906c_1080p_cmd", OTM1906C_1080P_CMD_PANEL},
91 {"hx8399a_1080p_video", HX8399A_1080P_VIDEO_PANEL},
Sandeep Pandaed082922015-08-03 12:18:25 +053092 {"nt35597_wqxga_dsc_video", NT35597_WQXGA_DSC_VIDEO_PANEL},
93 {"nt35597_wqxga_dsc_cmd", NT35597_WQXGA_DSC_CMD_PANEL},
Padmanabhan Komanduru4927c2c2015-08-21 14:55:16 +053094 {"hx8394d_720p_video", HX8394D_720P_VIDEO_PANEL},
Padmanabhan Komanduru9d49f892015-04-10 12:58:46 -070095};
96
97static uint32_t panel_id;
98
Sandeep Panda75fddaa2015-07-06 11:38:25 +053099#define TRULY_1080P_PANEL_ON_DELAY 40
Sandeep Pandac797d542015-06-12 14:37:55 +0530100
Padmanabhan Komanduru9d49f892015-04-10 12:58:46 -0700101int oem_panel_rotation()
102{
103 return NO_ERROR;
104}
105
106int oem_panel_on()
107{
108 /*
109 *OEM can keep their panel specific on instructions in this
110 *function
feifanz525046b2015-06-01 20:31:06 +0800111 */
112 if (panel_id == OTM1906C_1080P_CMD_PANEL) {
113 /* needs extra delay to avoid unexpected artifacts */
114 mdelay(OTM1906C_1080P_CMD_PANEL_ON_DELAY);
Sandeep Panda75fddaa2015-07-06 11:38:25 +0530115 } else if (panel_id == TRULY_1080P_CMD_PANEL ||
116 panel_id == TRULY_1080P_VIDEO_PANEL) {
117 mdelay(TRULY_1080P_PANEL_ON_DELAY);
feifanz525046b2015-06-01 20:31:06 +0800118 }
Sandeep Pandac797d542015-06-12 14:37:55 +0530119
Padmanabhan Komanduru9d49f892015-04-10 12:58:46 -0700120 return NO_ERROR;
121}
122
123int oem_panel_off()
124{
125 /* OEM can keep their panel specific off instructions
126 * in this function
127 */
128 return NO_ERROR;
129}
130
131static int init_panel_data(struct panel_struct *panelstruct,
132 struct msm_panel_info *pinfo,
133 struct mdss_dsi_phy_ctrl *phy_db)
134{
135 int pan_type = PANEL_TYPE_DSI;
Ujwal Patel41a665a2015-07-17 13:51:30 -0700136 struct oem_panel_data *oem_data = mdss_dsi_get_oem_data_ptr();
Padmanabhan Komanduru9d49f892015-04-10 12:58:46 -0700137
138 switch (panel_id) {
139 case TRULY_1080P_VIDEO_PANEL:
140 panelstruct->paneldata = &truly_1080p_video_panel_data;
141 panelstruct->paneldata->panel_with_enable_gpio = 1;
142 panelstruct->panelres = &truly_1080p_video_panel_res;
143 panelstruct->color = &truly_1080p_video_color;
144 panelstruct->videopanel = &truly_1080p_video_video_panel;
145 panelstruct->commandpanel = &truly_1080p_video_command_panel;
146 panelstruct->state = &truly_1080p_video_state;
147 panelstruct->laneconfig = &truly_1080p_video_lane_config;
148 panelstruct->paneltiminginfo
149 = &truly_1080p_video_timing_info;
150 panelstruct->panelresetseq
151 = &truly_1080p_video_panel_reset_seq;
152 panelstruct->backlightinfo = &truly_1080p_video_backlight;
153 pinfo->mipi.panel_on_cmds
154 = truly_1080p_video_on_command;
155 pinfo->mipi.num_of_panel_on_cmds
156 = TRULY_1080P_VIDEO_ON_COMMAND;
157 pinfo->mipi.panel_off_cmds
158 = truly_1080p_video_off_command;
159 pinfo->mipi.num_of_panel_off_cmds
160 = TRULY_1080P_VIDEO_OFF_COMMAND;
161 memcpy(phy_db->timing,
162 truly_1080p_video_timings, TIMING_SIZE);
163 pinfo->mipi.signature = TRULY_1080P_VIDEO_SIGNATURE;
164 break;
Jayant Shekhar9ea8dcd2015-04-20 15:18:37 +0530165 case TRULY_1080P_CMD_PANEL:
166 panelstruct->paneldata = &truly_1080p_cmd_panel_data;
167 panelstruct->paneldata->panel_with_enable_gpio = 1;
168 panelstruct->panelres = &truly_1080p_cmd_panel_res;
169 panelstruct->color = &truly_1080p_cmd_color;
170 panelstruct->videopanel = &truly_1080p_cmd_video_panel;
171 panelstruct->commandpanel = &truly_1080p_cmd_command_panel;
172 panelstruct->state = &truly_1080p_cmd_state;
173 panelstruct->laneconfig = &truly_1080p_cmd_lane_config;
174 panelstruct->paneltiminginfo
175 = &truly_1080p_cmd_timing_info;
176 panelstruct->panelresetseq
177 = &truly_1080p_cmd_panel_reset_seq;
178 panelstruct->backlightinfo = &truly_1080p_cmd_backlight;
179 pinfo->mipi.panel_on_cmds
180 = truly_1080p_cmd_on_command;
181 pinfo->mipi.num_of_panel_on_cmds
182 = TRULY_1080P_CMD_ON_COMMAND;
183 pinfo->mipi.panel_off_cmds
184 = truly_1080p_cmd_off_command;
185 pinfo->mipi.num_of_panel_off_cmds
186 = TRULY_1080P_CMD_OFF_COMMAND;
187 memcpy(phy_db->timing,
188 truly_1080p_cmd_timings, TIMING_SIZE);
189 pinfo->mipi.signature = TRULY_1080P_CMD_SIGNATURE;
190 break;
feifanz174c82c2015-04-15 18:57:07 +0800191 case OTM1906C_1080P_CMD_PANEL:
192 panelstruct->paneldata = &otm1906c_1080p_cmd_panel_data;
193 panelstruct->paneldata->panel_with_enable_gpio = 1;
194 panelstruct->panelres = &otm1906c_1080p_cmd_panel_res;
195 panelstruct->color = &otm1906c_1080p_cmd_color;
196 panelstruct->videopanel = &otm1906c_1080p_cmd_video_panel;
197 panelstruct->commandpanel = &otm1906c_1080p_cmd_command_panel;
198 panelstruct->state = &otm1906c_1080p_cmd_state;
199 panelstruct->laneconfig = &otm1906c_1080p_cmd_lane_config;
200 panelstruct->paneltiminginfo
201 = &otm1906c_1080p_cmd_timing_info;
202 panelstruct->panelresetseq
203 = &otm1906c_1080p_cmd_panel_reset_seq;
204 panelstruct->backlightinfo = &otm1906c_1080p_cmd_backlight;
205 pinfo->mipi.panel_on_cmds
206 = otm1906c_1080p_cmd_on_command;
207 pinfo->mipi.num_of_panel_on_cmds
208 = OTM1906C_1080P_CMD_ON_COMMAND;
209 pinfo->mipi.panel_off_cmds
210 = otm1906c_1080p_cmd_off_command;
211 pinfo->mipi.num_of_panel_off_cmds
212 = OTM1906C_1080P_CMD_OFF_COMMAND;
213 memcpy(phy_db->timing,
214 otm1906c_1080p_cmd_timings, TIMING_SIZE);
215 pinfo->mipi.signature = OTM1906C_1080P_CMD_SIGNATURE;
216 break;
Ray Zhangf95f5b92015-06-25 15:34:29 +0800217 case HX8399A_1080P_VIDEO_PANEL:
218 panelstruct->paneldata = &hx8399a_1080p_video_panel_data;
219 panelstruct->panelres = &hx8399a_1080p_video_panel_res;
220 panelstruct->color = &hx8399a_1080p_video_color;
221 panelstruct->videopanel = &hx8399a_1080p_video_video_panel;
222 panelstruct->commandpanel = &hx8399a_1080p_video_command_panel;
223 panelstruct->state = &hx8399a_1080p_video_state;
224 panelstruct->laneconfig = &hx8399a_1080p_video_lane_config;
225 panelstruct->paneltiminginfo
226 = &hx8399a_1080p_video_timing_info;
227 panelstruct->panelresetseq
228 = &hx8399a_1080p_video_reset_seq;
229 panelstruct->backlightinfo = &hx8399a_1080p_video_backlight;
230 pinfo->mipi.panel_on_cmds
231 = hx8399a_1080p_video_on_command;
232 pinfo->mipi.num_of_panel_on_cmds
233 = HX8399A_1080P_VIDEO_ON_COMMAND;
234 pinfo->mipi.panel_off_cmds
235 = hx8399a_1080p_video_off_command;
236 pinfo->mipi.num_of_panel_off_cmds
237 = HX8399A_1080P_VIDEO_OFF_COMMAND;
238 memcpy(phy_db->timing,
239 hx8399a_1080p_video_timings, TIMING_SIZE);
240 pinfo->mipi.signature = HX8399A_1080P_VIDEO_SIGNATURE;
241 break;
Vishnuvardhan Prodduturi16eb20f2015-06-05 18:03:54 +0530242 case SHARP_1080P_CMD_PANEL:
243 panelstruct->paneldata = &sharp_1080p_cmd_panel_data;
244 panelstruct->panelres = &sharp_1080p_cmd_panel_res;
245 panelstruct->paneldata->panel_with_enable_gpio = 1;
246 panelstruct->color = &sharp_1080p_cmd_color;
247 panelstruct->videopanel = &sharp_1080p_cmd_video_panel;
248 panelstruct->commandpanel = &sharp_1080p_cmd_command_panel;
249 panelstruct->state = &sharp_1080p_cmd_state;
250 panelstruct->laneconfig = &sharp_1080p_cmd_lane_config;
251 panelstruct->paneltiminginfo
252 = &sharp_1080p_cmd_timing_info;
253 panelstruct->panelresetseq
254 = &sharp_1080p_cmd_panel_reset_seq;
255 panelstruct->backlightinfo = &sharp_1080p_cmd_backlight;
256 pinfo->mipi.panel_on_cmds
257 = sharp_1080p_cmd_on_command;
258 pinfo->mipi.num_of_panel_on_cmds
259 = SHARP_1080P_CMD_ON_COMMAND;
260 pinfo->mipi.panel_off_cmds
261 = sharp_1080p_cmd_off_command;
262 pinfo->mipi.num_of_panel_off_cmds
263 = SHARP_1080P_CMD_OFF_COMMAND;
264 memcpy(phy_db->timing,
265 sharp_1080p_cmd_timings, TIMING_SIZE);
266 break;
Padmanabhan Komanduru49a86cf2015-06-08 18:24:30 +0530267 case NT35597_WQXGA_DUALDSI_VIDEO_PANEL:
268 panelstruct->paneldata = &nt35597_wqxga_dualdsi_video_panel_data;
269 panelstruct->paneldata->panel_operating_mode = DST_SPLIT_FLAG |
270 SPLIT_DISPLAY_FLAG | DUAL_DSI_FLAG;
271 panelstruct->paneldata->panel_with_enable_gpio = 0;
272
273 panelstruct->panelres = &nt35597_wqxga_dualdsi_video_panel_res;
274 panelstruct->color = &nt35597_wqxga_dualdsi_video_color;
275 panelstruct->videopanel = &nt35597_wqxga_dualdsi_video_video_panel;
276 panelstruct->commandpanel = &nt35597_wqxga_dualdsi_video_command_panel;
277 panelstruct->state = &nt35597_wqxga_dualdsi_video_state;
278 panelstruct->laneconfig = &nt35597_wqxga_dualdsi_video_lane_config;
279 panelstruct->paneltiminginfo
280 = &nt35597_wqxga_dualdsi_video_timing_info;
281 panelstruct->panelresetseq
282 = &nt35597_wqxga_dualdsi_video_reset_seq;
283 panelstruct->backlightinfo = &nt35597_wqxga_dualdsi_video_backlight;
284 pinfo->labibb = &nt35597_wqxga_dualdsi_video_labibb;
285
286 pinfo->mipi.panel_on_cmds
287 = nt35597_wqxga_dualdsi_video_on_command;
288 pinfo->mipi.num_of_panel_on_cmds
289 = NT35597_WQXGA_DUALDSI_VIDEO_ON_COMMAND;
290 pinfo->mipi.panel_off_cmds
291 = nt35597_wqxga_dualdsi_video_off_command;
292 pinfo->mipi.num_of_panel_off_cmds
293 = NT35597_WQXGA_DUALDSI_VIDEO_OFF_COMMAND;
294 memcpy(phy_db->timing, nt35597_wqxga_dualdsi_video_timings,
295 TIMING_SIZE);
296 pinfo->mipi.tx_eot_append = true;
297 break;
Vishnuvardhan Prodduturic1a46c52015-06-29 16:35:23 +0530298 case NT35597_WQXGA_DUALDSI_CMD_PANEL:
299 panelstruct->paneldata = &nt35597_wqxga_dualdsi_cmd_panel_data;
300 panelstruct->paneldata->panel_operating_mode = DST_SPLIT_FLAG |
301 SPLIT_DISPLAY_FLAG | DUAL_DSI_FLAG;
302 panelstruct->paneldata->panel_with_enable_gpio = 0;
303
304 panelstruct->panelres = &nt35597_wqxga_dualdsi_cmd_panel_res;
305 panelstruct->color = &nt35597_wqxga_dualdsi_cmd_color;
306 panelstruct->videopanel = &nt35597_wqxga_dualdsi_cmd_video_panel;
307 panelstruct->commandpanel = &nt35597_wqxga_dualdsi_cmd_command_panel;
308 panelstruct->state = &nt35597_wqxga_dualdsi_cmd_state;
309 panelstruct->laneconfig = &nt35597_wqxga_dualdsi_cmd_lane_config;
310 panelstruct->paneltiminginfo
311 = &nt35597_wqxga_dualdsi_cmd_timing_info;
Padmanabhan Komanduru58fc57e2015-07-07 21:36:14 +0530312 /* Clkout timings are different for this panel on 8956 */
313 panelstruct->paneltiminginfo->tclk_post = 0x2b;
314 panelstruct->paneltiminginfo->tclk_pre = 0x28;
Vishnuvardhan Prodduturic1a46c52015-06-29 16:35:23 +0530315 panelstruct->panelresetseq
316 = &nt35597_wqxga_dualdsi_cmd_reset_seq;
317 panelstruct->backlightinfo = &nt35597_wqxga_dualdsi_cmd_backlight;
318
319 pinfo->labibb = &nt35597_wqxga_dualdsi_cmd_labibb;
320
321 pinfo->mipi.panel_on_cmds
322 = nt35597_wqxga_dualdsi_cmd_on_command;
323 pinfo->mipi.num_of_panel_on_cmds
324 = NT35597_WQXGA_DUALDSI_CMD_ON_COMMAND;
325 pinfo->mipi.panel_off_cmds
326 = nt35597_wqxga_dualdsi_cmd_off_command;
327 pinfo->mipi.num_of_panel_off_cmds
328 = NT35597_WQXGA_DUALDSI_CMD_OFF_COMMAND;
329 memcpy(phy_db->timing, nt35597_wqxga_dualdsi_cmd_timings,
330 TIMING_SIZE);
331 pinfo->mipi.tx_eot_append = true;
332 break;
Sandeep Pandaed082922015-08-03 12:18:25 +0530333 case NT35597_WQXGA_DSC_VIDEO_PANEL:
334 panelstruct->paneldata = &nt35597_wqxga_dsc_video_panel_data;
335 panelstruct->paneldata->panel_with_enable_gpio = 0;
336 panelstruct->paneldata->panel_operating_mode = USE_DSI1_PLL_FLAG;
337 panelstruct->panelres = &nt35597_wqxga_dsc_video_panel_res;
338 panelstruct->color = &nt35597_wqxga_dsc_video_color;
339 panelstruct->videopanel = &nt35597_wqxga_dsc_video_video_panel;
340 panelstruct->commandpanel = &nt35597_wqxga_dsc_video_command_panel;
341 panelstruct->state = &nt35597_wqxga_dsc_video_state;
342 panelstruct->laneconfig = &nt35597_wqxga_dsc_video_lane_config;
343 panelstruct->paneltiminginfo
344 = &nt35597_wqxga_dsc_video_timing_info;
345 panelstruct->panelresetseq
346 = &nt35597_wqxga_dsc_video_reset_seq;
347 panelstruct->backlightinfo = &nt35597_wqxga_dsc_video_backlight;
348 pinfo->labibb = &nt35597_wqxga_dsc_video_labibb;
349
350 pinfo->mipi.panel_on_cmds
351 = nt35597_wqxga_dsc_video_on_command;
352 pinfo->mipi.num_of_panel_on_cmds
353 = NT35597_WQXGA_DSC_VIDEO_ON_COMMAND;
354 pinfo->mipi.panel_off_cmds
355 = nt35597_wqxga_dsc_video_off_command;
356 pinfo->mipi.num_of_panel_off_cmds
357 = NT35597_WQXGA_DSC_VIDEO_OFF_COMMAND;
358 memcpy(phy_db->timing, nt35597_wqxga_dsc_video_timings,
359 TIMING_SIZE);
360 /* Clkout timings are different for this panel on 8956 */
361 panelstruct->paneltiminginfo->tclk_post = 0x04;
362 panelstruct->paneltiminginfo->tclk_pre = 0x20;
363 pinfo->mipi.tx_eot_append = true;
Ujwal Patel41a665a2015-07-17 13:51:30 -0700364
365 panelstruct->paneldata->panel_operating_mode &= ~DUAL_PIPE_FLAG;
366 panelstruct->config = &nt35597_wqxga_dsc_video_config0;
367 if (oem_data) {
368 switch (oem_data->cfg_num[0]) {
369 case -1: /* default */
370 case 0:
371 panelstruct->config =
372 &nt35597_wqxga_dsc_video_config0;
373 break;
374 default:
375 dprintf(CRITICAL, "topology config%d not supported. fallback to default config0\n",
376 oem_data->cfg_num[0]);
377 panelstruct->config = &nt35597_wqxga_dsc_video_config0;
378 }
379 }
380 pinfo->lm_split[0] = panelstruct->config->lm_split[0];
381 pinfo->lm_split[1] = panelstruct->config->lm_split[1];
382 pinfo->num_dsc_enc = panelstruct->config->num_dsc_enc;
Sandeep Pandaed082922015-08-03 12:18:25 +0530383 pinfo->compression_mode = COMPRESSION_DSC;
Ujwal Patel41a665a2015-07-17 13:51:30 -0700384
Sandeep Pandaed082922015-08-03 12:18:25 +0530385 pinfo->dsc.parameter_calc = mdss_dsc_parameters_calc;
386 pinfo->dsc.dsc2buf = mdss_dsc_to_buf;
387 pinfo->dsc.dsi_dsc_config = mdss_dsc_dsi_config;
388 pinfo->dsc.mdp_dsc_config = mdss_dsc_mdp_config;
389 break;
390 case NT35597_WQXGA_DSC_CMD_PANEL:
391 panelstruct->paneldata = &nt35597_wqxga_dsc_cmd_panel_data;
392 panelstruct->paneldata->panel_with_enable_gpio = 0;
393 panelstruct->paneldata->panel_operating_mode = USE_DSI1_PLL_FLAG;
394 panelstruct->panelres = &nt35597_wqxga_dsc_cmd_panel_res;
395 panelstruct->color = &nt35597_wqxga_dsc_cmd_color;
396 panelstruct->videopanel = &nt35597_wqxga_dsc_cmd_video_panel;
397 panelstruct->commandpanel = &nt35597_wqxga_dsc_cmd_command_panel;
398 panelstruct->state = &nt35597_wqxga_dsc_cmd_state;
399 panelstruct->laneconfig = &nt35597_wqxga_dsc_cmd_lane_config;
400 panelstruct->paneltiminginfo
401 = &nt35597_wqxga_dsc_cmd_timing_info;
402 panelstruct->panelresetseq
403 = &nt35597_wqxga_dsc_cmd_reset_seq;
404 panelstruct->backlightinfo = &nt35597_wqxga_dsc_cmd_backlight;
405 pinfo->labibb = &nt35597_wqxga_dsc_cmd_labibb;
406
407 pinfo->mipi.panel_on_cmds
408 = nt35597_wqxga_dsc_cmd_on_command;
409 pinfo->mipi.num_of_panel_on_cmds
410 = NT35597_WQXGA_DSC_CMD_ON_COMMAND;
411 pinfo->mipi.panel_off_cmds
412 = nt35597_wqxga_dsc_cmd_off_command;
413 pinfo->mipi.num_of_panel_off_cmds
414 = NT35597_WQXGA_DSC_CMD_OFF_COMMAND;
415 memcpy(phy_db->timing, nt35597_wqxga_dsc_cmd_timings,
416 TIMING_SIZE);
417 /* Clkout timings are different for this panel on 8956 */
418 panelstruct->paneltiminginfo->tclk_post = 0x04;
419 panelstruct->paneltiminginfo->tclk_pre = 0x20;
420 pinfo->mipi.tx_eot_append = true;
Ujwal Patel41a665a2015-07-17 13:51:30 -0700421
422 panelstruct->paneldata->panel_operating_mode &= ~DUAL_PIPE_FLAG;
423 panelstruct->config = &nt35597_wqxga_dsc_cmd_config0;
424 if (oem_data) {
425 switch (oem_data->cfg_num[0]) {
426 case -1: /* default */
427 case 0:
428 panelstruct->config =
429 &nt35597_wqxga_dsc_cmd_config0;
430 break;
431 default:
432 dprintf(CRITICAL, "topology config%d not supported. fallback to default config0\n",
433 oem_data->cfg_num[0]);
434 panelstruct->config = &nt35597_wqxga_dsc_cmd_config0;
435 }
436 }
437 pinfo->lm_split[0] = panelstruct->config->lm_split[0];
438 pinfo->lm_split[1] = panelstruct->config->lm_split[1];
439 pinfo->num_dsc_enc = panelstruct->config->num_dsc_enc;
Sandeep Pandaed082922015-08-03 12:18:25 +0530440 pinfo->compression_mode = COMPRESSION_DSC;
Ujwal Patel41a665a2015-07-17 13:51:30 -0700441
Sandeep Pandaed082922015-08-03 12:18:25 +0530442 pinfo->dsc.parameter_calc = mdss_dsc_parameters_calc;
443 pinfo->dsc.dsc2buf = mdss_dsc_to_buf;
444 pinfo->dsc.dsi_dsc_config = mdss_dsc_dsi_config;
445 pinfo->dsc.mdp_dsc_config = mdss_dsc_mdp_config;
446 break;
Padmanabhan Komanduru4927c2c2015-08-21 14:55:16 +0530447 case HX8394D_720P_VIDEO_PANEL:
448 panelstruct->paneldata = &hx8394d_720p_video_panel_data;
449 panelstruct->panelres = &hx8394d_720p_video_panel_res;
450 panelstruct->color = &hx8394d_720p_video_color;
451 panelstruct->videopanel = &hx8394d_720p_video_video_panel;
452 panelstruct->commandpanel = &hx8394d_720p_video_command_panel;
453 panelstruct->state = &hx8394d_720p_video_state;
454 panelstruct->laneconfig = &hx8394d_720p_video_lane_config;
455 panelstruct->paneltiminginfo
456 = &hx8394d_720p_video_timing_info;
457 panelstruct->panelresetseq
458 = &hx8394d_720p_video_panel_reset_seq;
459 panelstruct->backlightinfo = &hx8394d_720p_video_backlight;
460 pinfo->mipi.panel_on_cmds
461 = hx8394d_720p_video_on_command;
462 pinfo->mipi.num_of_panel_on_cmds
463 = HX8394D_720P_VIDEO_ON_COMMAND;
464 pinfo->mipi.panel_off_cmds
465 = hx8394d_720p_video_off_command;
466 pinfo->mipi.num_of_panel_off_cmds
467 = HX8394D_720P_VIDEO_OFF_COMMAND;
468 memcpy(phy_db->timing,
469 hx8394d_720p_video_timings, TIMING_SIZE);
470 pinfo->mipi.signature = HX8394D_720P_VIDEO_SIGNATURE;
471 break;
Padmanabhan Komanduru9d49f892015-04-10 12:58:46 -0700472 case UNKNOWN_PANEL:
473 default:
474 memset(panelstruct, 0, sizeof(struct panel_struct));
475 memset(pinfo->mipi.panel_on_cmds, 0,
476 sizeof(struct mipi_dsi_cmd));
477 pinfo->mipi.num_of_panel_on_cmds = 0;
478 memset(pinfo->mipi.panel_off_cmds, 0,
479 sizeof(struct mipi_dsi_cmd));
480 pinfo->mipi.num_of_panel_off_cmds = 0;
481 memset(phy_db->timing, 0, TIMING_SIZE);
482 pan_type = PANEL_TYPE_UNKNOWN;
483 break;
484 }
Ujwal Patel41a665a2015-07-17 13:51:30 -0700485
486 dprintf(SPEW, "lm_split[0]=%d lm_split[1]=%d mode=0x%x\n",
487 pinfo->lm_split[0], pinfo->lm_split[1],
488 panelstruct->paneldata->panel_operating_mode);
489
Padmanabhan Komanduru9d49f892015-04-10 12:58:46 -0700490 return pan_type;
491}
492
Ray Zhangf95f5b92015-06-25 15:34:29 +0800493#define DISPLAY_MAX_PANEL_DETECTION 2
494static uint32_t auto_pan_loop = 0;
495
496uint32_t oem_panel_max_auto_detect_panels()
497{
498 return target_panel_auto_detect_enabled() ?
499 DISPLAY_MAX_PANEL_DETECTION : 0;
500}
501
Padmanabhan Komanduru9d49f892015-04-10 12:58:46 -0700502int oem_panel_select(const char *panel_name, struct panel_struct *panelstruct,
503 struct msm_panel_info *pinfo,
504 struct mdss_dsi_phy_ctrl *phy_db)
505{
506 uint32_t hw_id = board_hardware_id();
507 int32_t panel_override_id;
feifanz028544e2015-07-28 20:58:57 +0800508 uint32_t target_id, plat_hw_ver_major;
Padmanabhan Komanduru9d49f892015-04-10 12:58:46 -0700509
510 if (panel_name) {
511 panel_override_id = panel_name_to_id(supp_panels,
512 ARRAY_SIZE(supp_panels), panel_name);
513
514 if (panel_override_id < 0) {
515 dprintf(CRITICAL, "Not able to search the panel:%s\n",
Padmanabhan Komandurubccbcdc2015-06-30 16:19:24 +0530516 panel_name);
Padmanabhan Komanduru9d49f892015-04-10 12:58:46 -0700517 } else if (panel_override_id < UNKNOWN_PANEL) {
518 /* panel override using fastboot oem command */
519 panel_id = panel_override_id;
520
521 dprintf(INFO, "OEM panel override:%s\n",
Padmanabhan Komandurubccbcdc2015-06-30 16:19:24 +0530522 panel_name);
Padmanabhan Komanduru9d49f892015-04-10 12:58:46 -0700523 goto panel_init;
524 }
525 }
526
527 switch (hw_id) {
528 case HW_PLATFORM_MTP:
Padmanabhan Komanduru49a86cf2015-06-08 18:24:30 +0530529 if (platform_is_msm8956())
530 panel_id = NT35597_WQXGA_DUALDSI_VIDEO_PANEL;
531 else
532 panel_id = TRULY_1080P_VIDEO_PANEL;
Padmanabhan Komanduru9d49f892015-04-10 12:58:46 -0700533 break;
534 case HW_PLATFORM_SURF:
Vishnuvardhan Prodduturie116c002015-07-14 17:14:25 +0530535 case HW_PLATFORM_RCM:
Padmanabhan Komanduru49a86cf2015-06-08 18:24:30 +0530536 if (platform_is_msm8956())
537 panel_id = NT35597_WQXGA_DUALDSI_VIDEO_PANEL;
538 else
539 panel_id = TRULY_1080P_VIDEO_PANEL;
Padmanabhan Komanduru9d49f892015-04-10 12:58:46 -0700540 break;
feifanz174c82c2015-04-15 18:57:07 +0800541 case HW_PLATFORM_QRD:
feifanz028544e2015-07-28 20:58:57 +0800542 target_id = board_target_id();
543 plat_hw_ver_major = ((target_id >> 16) & 0xFF);
544
545 /*
546 * 8952 SKUM DVT2 - HX8399A 1080p video panel
547 * 8952 SKUM EVT1/EVT2 - OTM1906C 1080p cmd panel
548 */
549 if (plat_hw_ver_major >= 4)
550 panel_id = HX8399A_1080P_VIDEO_PANEL;
551 else
552 panel_id = OTM1906C_1080P_CMD_PANEL;
Ray Zhangf95f5b92015-06-25 15:34:29 +0800553
554 /* QRD EVT1 uses OTM1906C, and EVT2 uses HX8399A */
555 if (platform_is_msm8956()) {
556 switch (auto_pan_loop) {
557 case 0:
558 panel_id = HX8399A_1080P_VIDEO_PANEL;
559 break;
560 case 1:
561 panel_id = OTM1906C_1080P_CMD_PANEL;
562 break;
563 default:
564 panel_id = UNKNOWN_PANEL;
565 dprintf(CRITICAL, "Unknown panel\n");
566 return PANEL_TYPE_UNKNOWN;
567 }
568 auto_pan_loop++;
569 }
570
feifanz174c82c2015-04-15 18:57:07 +0800571 break;
Padmanabhan Komanduru9d49f892015-04-10 12:58:46 -0700572 default:
573 dprintf(CRITICAL, "Display not enabled for %d HW type\n",
574 hw_id);
575 return PANEL_TYPE_UNKNOWN;
576 }
577
578panel_init:
579 /*
580 * Update all data structures after 'panel_init' label. Only panel
581 * selection is supposed to happen before that.
582 */
Padmanabhan Komanduru0e19a362015-06-08 13:29:32 +0530583 if (platform_is_msm8956())
584 memcpy(panel_regulator_settings,
585 dcdc_regulator_settings_hpm, REGULATOR_SIZE);
586 else
587 memcpy(panel_regulator_settings,
588 dcdc_regulator_settings_lpm, REGULATOR_SIZE);
Padmanabhan Komanduru9d49f892015-04-10 12:58:46 -0700589 pinfo->pipe_type = MDSS_MDP_PIPE_TYPE_RGB;
590 return init_panel_data(panelstruct, pinfo, phy_db);
591}