blob: 30a56e9cd6da49bf9fac2984719b57bbe699eb3a [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
41#include "include/panel.h"
42#include "panel_display.h"
43
44/*---------------------------------------------------------------------------*/
45/* GCDB Panel Database */
46/*---------------------------------------------------------------------------*/
47#include "include/panel_truly_1080p_video.h"
Jayant Shekhar9ea8dcd2015-04-20 15:18:37 +053048#include "include/panel_truly_1080p_cmd.h"
feifanz174c82c2015-04-15 18:57:07 +080049#include "include/panel_otm1906c_1080p_cmd.h"
Vishnuvardhan Prodduturi16eb20f2015-06-05 18:03:54 +053050#include "include/panel_sharp_1080p_cmd.h"
Padmanabhan Komanduru49a86cf2015-06-08 18:24:30 +053051#include "include/panel_nt35597_wqxga_dualdsi_video.h"
Vishnuvardhan Prodduturic1a46c52015-06-29 16:35:23 +053052#include "include/panel_nt35597_wqxga_dualdsi_cmd.h"
Ray Zhangf95f5b92015-06-25 15:34:29 +080053#include "include/panel_hx8399a_1080p_video.h"
Sandeep Pandaed082922015-08-03 12:18:25 +053054#include "include/panel_nt35597_wqxga_dsc_video.h"
55#include "include/panel_nt35597_wqxga_dsc_cmd.h"
Padmanabhan Komanduru4927c2c2015-08-21 14:55:16 +053056#include "include/panel_hx8394d_720p_video.h"
Padmanabhan Komanduru9d49f892015-04-10 12:58:46 -070057
58/*---------------------------------------------------------------------------*/
59/* static panel selection variable */
60/*---------------------------------------------------------------------------*/
61enum {
62 TRULY_1080P_VIDEO_PANEL,
Jayant Shekhar9ea8dcd2015-04-20 15:18:37 +053063 TRULY_1080P_CMD_PANEL,
feifanz174c82c2015-04-15 18:57:07 +080064 OTM1906C_1080P_CMD_PANEL,
Vishnuvardhan Prodduturi16eb20f2015-06-05 18:03:54 +053065 SHARP_1080P_CMD_PANEL,
Padmanabhan Komanduru49a86cf2015-06-08 18:24:30 +053066 NT35597_WQXGA_DUALDSI_VIDEO_PANEL,
Vishnuvardhan Prodduturic1a46c52015-06-29 16:35:23 +053067 NT35597_WQXGA_DUALDSI_CMD_PANEL,
Ray Zhangf95f5b92015-06-25 15:34:29 +080068 HX8399A_1080P_VIDEO_PANEL,
Sandeep Pandaed082922015-08-03 12:18:25 +053069 NT35597_WQXGA_DSC_VIDEO_PANEL,
70 NT35597_WQXGA_DSC_CMD_PANEL,
Padmanabhan Komanduru4927c2c2015-08-21 14:55:16 +053071 HX8394D_720P_VIDEO_PANEL,
Padmanabhan Komanduru9d49f892015-04-10 12:58:46 -070072 UNKNOWN_PANEL
73};
74
75uint32_t panel_regulator_settings[] = {
76 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
77};
78
79/*
80 * The list of panels that are supported on this target.
81 * Any panel in this list can be selected using fastboot oem command.
82 */
83static struct panel_list supp_panels[] = {
84 {"truly_1080p_video", TRULY_1080P_VIDEO_PANEL},
Jayant Shekhar9ea8dcd2015-04-20 15:18:37 +053085 {"truly_1080p_cmd", TRULY_1080P_CMD_PANEL},
Vishnuvardhan Prodduturi16eb20f2015-06-05 18:03:54 +053086 {"sharp_1080p_cmd", SHARP_1080P_CMD_PANEL},
Padmanabhan Komanduru49a86cf2015-06-08 18:24:30 +053087 {"nt35597_wqxga_dualdsi_video", NT35597_WQXGA_DUALDSI_VIDEO_PANEL},
Vishnuvardhan Prodduturic1a46c52015-06-29 16:35:23 +053088 {"nt35597_wqxga_dualdsi_cmd", NT35597_WQXGA_DUALDSI_CMD_PANEL},
Ray Zhangf95f5b92015-06-25 15:34:29 +080089 {"otm1906c_1080p_cmd", OTM1906C_1080P_CMD_PANEL},
90 {"hx8399a_1080p_video", HX8399A_1080P_VIDEO_PANEL},
Sandeep Pandaed082922015-08-03 12:18:25 +053091 {"nt35597_wqxga_dsc_video", NT35597_WQXGA_DSC_VIDEO_PANEL},
92 {"nt35597_wqxga_dsc_cmd", NT35597_WQXGA_DSC_CMD_PANEL},
Padmanabhan Komanduru4927c2c2015-08-21 14:55:16 +053093 {"hx8394d_720p_video", HX8394D_720P_VIDEO_PANEL},
Padmanabhan Komanduru9d49f892015-04-10 12:58:46 -070094};
95
96static uint32_t panel_id;
97
Sandeep Panda75fddaa2015-07-06 11:38:25 +053098#define TRULY_1080P_PANEL_ON_DELAY 40
Sandeep Pandac797d542015-06-12 14:37:55 +053099
Padmanabhan Komanduru9d49f892015-04-10 12:58:46 -0700100int oem_panel_rotation()
101{
102 return NO_ERROR;
103}
104
105int oem_panel_on()
106{
107 /*
108 *OEM can keep their panel specific on instructions in this
109 *function
feifanz525046b2015-06-01 20:31:06 +0800110 */
111 if (panel_id == OTM1906C_1080P_CMD_PANEL) {
112 /* needs extra delay to avoid unexpected artifacts */
113 mdelay(OTM1906C_1080P_CMD_PANEL_ON_DELAY);
Sandeep Panda75fddaa2015-07-06 11:38:25 +0530114 } else if (panel_id == TRULY_1080P_CMD_PANEL ||
115 panel_id == TRULY_1080P_VIDEO_PANEL) {
116 mdelay(TRULY_1080P_PANEL_ON_DELAY);
feifanz525046b2015-06-01 20:31:06 +0800117 }
Sandeep Pandac797d542015-06-12 14:37:55 +0530118
Padmanabhan Komanduru9d49f892015-04-10 12:58:46 -0700119 return NO_ERROR;
120}
121
122int oem_panel_off()
123{
124 /* OEM can keep their panel specific off instructions
125 * in this function
126 */
127 return NO_ERROR;
128}
129
130static int init_panel_data(struct panel_struct *panelstruct,
131 struct msm_panel_info *pinfo,
132 struct mdss_dsi_phy_ctrl *phy_db)
133{
134 int pan_type = PANEL_TYPE_DSI;
135
136 switch (panel_id) {
137 case TRULY_1080P_VIDEO_PANEL:
138 panelstruct->paneldata = &truly_1080p_video_panel_data;
139 panelstruct->paneldata->panel_with_enable_gpio = 1;
140 panelstruct->panelres = &truly_1080p_video_panel_res;
141 panelstruct->color = &truly_1080p_video_color;
142 panelstruct->videopanel = &truly_1080p_video_video_panel;
143 panelstruct->commandpanel = &truly_1080p_video_command_panel;
144 panelstruct->state = &truly_1080p_video_state;
145 panelstruct->laneconfig = &truly_1080p_video_lane_config;
146 panelstruct->paneltiminginfo
147 = &truly_1080p_video_timing_info;
148 panelstruct->panelresetseq
149 = &truly_1080p_video_panel_reset_seq;
150 panelstruct->backlightinfo = &truly_1080p_video_backlight;
151 pinfo->mipi.panel_on_cmds
152 = truly_1080p_video_on_command;
153 pinfo->mipi.num_of_panel_on_cmds
154 = TRULY_1080P_VIDEO_ON_COMMAND;
155 pinfo->mipi.panel_off_cmds
156 = truly_1080p_video_off_command;
157 pinfo->mipi.num_of_panel_off_cmds
158 = TRULY_1080P_VIDEO_OFF_COMMAND;
159 memcpy(phy_db->timing,
160 truly_1080p_video_timings, TIMING_SIZE);
161 pinfo->mipi.signature = TRULY_1080P_VIDEO_SIGNATURE;
162 break;
Jayant Shekhar9ea8dcd2015-04-20 15:18:37 +0530163 case TRULY_1080P_CMD_PANEL:
164 panelstruct->paneldata = &truly_1080p_cmd_panel_data;
165 panelstruct->paneldata->panel_with_enable_gpio = 1;
166 panelstruct->panelres = &truly_1080p_cmd_panel_res;
167 panelstruct->color = &truly_1080p_cmd_color;
168 panelstruct->videopanel = &truly_1080p_cmd_video_panel;
169 panelstruct->commandpanel = &truly_1080p_cmd_command_panel;
170 panelstruct->state = &truly_1080p_cmd_state;
171 panelstruct->laneconfig = &truly_1080p_cmd_lane_config;
172 panelstruct->paneltiminginfo
173 = &truly_1080p_cmd_timing_info;
174 panelstruct->panelresetseq
175 = &truly_1080p_cmd_panel_reset_seq;
176 panelstruct->backlightinfo = &truly_1080p_cmd_backlight;
177 pinfo->mipi.panel_on_cmds
178 = truly_1080p_cmd_on_command;
179 pinfo->mipi.num_of_panel_on_cmds
180 = TRULY_1080P_CMD_ON_COMMAND;
181 pinfo->mipi.panel_off_cmds
182 = truly_1080p_cmd_off_command;
183 pinfo->mipi.num_of_panel_off_cmds
184 = TRULY_1080P_CMD_OFF_COMMAND;
185 memcpy(phy_db->timing,
186 truly_1080p_cmd_timings, TIMING_SIZE);
187 pinfo->mipi.signature = TRULY_1080P_CMD_SIGNATURE;
188 break;
feifanz174c82c2015-04-15 18:57:07 +0800189 case OTM1906C_1080P_CMD_PANEL:
190 panelstruct->paneldata = &otm1906c_1080p_cmd_panel_data;
191 panelstruct->paneldata->panel_with_enable_gpio = 1;
192 panelstruct->panelres = &otm1906c_1080p_cmd_panel_res;
193 panelstruct->color = &otm1906c_1080p_cmd_color;
194 panelstruct->videopanel = &otm1906c_1080p_cmd_video_panel;
195 panelstruct->commandpanel = &otm1906c_1080p_cmd_command_panel;
196 panelstruct->state = &otm1906c_1080p_cmd_state;
197 panelstruct->laneconfig = &otm1906c_1080p_cmd_lane_config;
198 panelstruct->paneltiminginfo
199 = &otm1906c_1080p_cmd_timing_info;
200 panelstruct->panelresetseq
201 = &otm1906c_1080p_cmd_panel_reset_seq;
202 panelstruct->backlightinfo = &otm1906c_1080p_cmd_backlight;
203 pinfo->mipi.panel_on_cmds
204 = otm1906c_1080p_cmd_on_command;
205 pinfo->mipi.num_of_panel_on_cmds
206 = OTM1906C_1080P_CMD_ON_COMMAND;
207 pinfo->mipi.panel_off_cmds
208 = otm1906c_1080p_cmd_off_command;
209 pinfo->mipi.num_of_panel_off_cmds
210 = OTM1906C_1080P_CMD_OFF_COMMAND;
211 memcpy(phy_db->timing,
212 otm1906c_1080p_cmd_timings, TIMING_SIZE);
213 pinfo->mipi.signature = OTM1906C_1080P_CMD_SIGNATURE;
214 break;
Ray Zhangf95f5b92015-06-25 15:34:29 +0800215 case HX8399A_1080P_VIDEO_PANEL:
216 panelstruct->paneldata = &hx8399a_1080p_video_panel_data;
217 panelstruct->panelres = &hx8399a_1080p_video_panel_res;
218 panelstruct->color = &hx8399a_1080p_video_color;
219 panelstruct->videopanel = &hx8399a_1080p_video_video_panel;
220 panelstruct->commandpanel = &hx8399a_1080p_video_command_panel;
221 panelstruct->state = &hx8399a_1080p_video_state;
222 panelstruct->laneconfig = &hx8399a_1080p_video_lane_config;
223 panelstruct->paneltiminginfo
224 = &hx8399a_1080p_video_timing_info;
225 panelstruct->panelresetseq
226 = &hx8399a_1080p_video_reset_seq;
227 panelstruct->backlightinfo = &hx8399a_1080p_video_backlight;
228 pinfo->mipi.panel_on_cmds
229 = hx8399a_1080p_video_on_command;
230 pinfo->mipi.num_of_panel_on_cmds
231 = HX8399A_1080P_VIDEO_ON_COMMAND;
232 pinfo->mipi.panel_off_cmds
233 = hx8399a_1080p_video_off_command;
234 pinfo->mipi.num_of_panel_off_cmds
235 = HX8399A_1080P_VIDEO_OFF_COMMAND;
236 memcpy(phy_db->timing,
237 hx8399a_1080p_video_timings, TIMING_SIZE);
238 pinfo->mipi.signature = HX8399A_1080P_VIDEO_SIGNATURE;
239 break;
Vishnuvardhan Prodduturi16eb20f2015-06-05 18:03:54 +0530240 case SHARP_1080P_CMD_PANEL:
241 panelstruct->paneldata = &sharp_1080p_cmd_panel_data;
242 panelstruct->panelres = &sharp_1080p_cmd_panel_res;
243 panelstruct->paneldata->panel_with_enable_gpio = 1;
244 panelstruct->color = &sharp_1080p_cmd_color;
245 panelstruct->videopanel = &sharp_1080p_cmd_video_panel;
246 panelstruct->commandpanel = &sharp_1080p_cmd_command_panel;
247 panelstruct->state = &sharp_1080p_cmd_state;
248 panelstruct->laneconfig = &sharp_1080p_cmd_lane_config;
249 panelstruct->paneltiminginfo
250 = &sharp_1080p_cmd_timing_info;
251 panelstruct->panelresetseq
252 = &sharp_1080p_cmd_panel_reset_seq;
253 panelstruct->backlightinfo = &sharp_1080p_cmd_backlight;
254 pinfo->mipi.panel_on_cmds
255 = sharp_1080p_cmd_on_command;
256 pinfo->mipi.num_of_panel_on_cmds
257 = SHARP_1080P_CMD_ON_COMMAND;
258 pinfo->mipi.panel_off_cmds
259 = sharp_1080p_cmd_off_command;
260 pinfo->mipi.num_of_panel_off_cmds
261 = SHARP_1080P_CMD_OFF_COMMAND;
262 memcpy(phy_db->timing,
263 sharp_1080p_cmd_timings, TIMING_SIZE);
264 break;
Padmanabhan Komanduru49a86cf2015-06-08 18:24:30 +0530265 case NT35597_WQXGA_DUALDSI_VIDEO_PANEL:
266 panelstruct->paneldata = &nt35597_wqxga_dualdsi_video_panel_data;
267 panelstruct->paneldata->panel_operating_mode = DST_SPLIT_FLAG |
268 SPLIT_DISPLAY_FLAG | DUAL_DSI_FLAG;
269 panelstruct->paneldata->panel_with_enable_gpio = 0;
270
271 panelstruct->panelres = &nt35597_wqxga_dualdsi_video_panel_res;
272 panelstruct->color = &nt35597_wqxga_dualdsi_video_color;
273 panelstruct->videopanel = &nt35597_wqxga_dualdsi_video_video_panel;
274 panelstruct->commandpanel = &nt35597_wqxga_dualdsi_video_command_panel;
275 panelstruct->state = &nt35597_wqxga_dualdsi_video_state;
276 panelstruct->laneconfig = &nt35597_wqxga_dualdsi_video_lane_config;
277 panelstruct->paneltiminginfo
278 = &nt35597_wqxga_dualdsi_video_timing_info;
279 panelstruct->panelresetseq
280 = &nt35597_wqxga_dualdsi_video_reset_seq;
281 panelstruct->backlightinfo = &nt35597_wqxga_dualdsi_video_backlight;
282 pinfo->labibb = &nt35597_wqxga_dualdsi_video_labibb;
283
284 pinfo->mipi.panel_on_cmds
285 = nt35597_wqxga_dualdsi_video_on_command;
286 pinfo->mipi.num_of_panel_on_cmds
287 = NT35597_WQXGA_DUALDSI_VIDEO_ON_COMMAND;
288 pinfo->mipi.panel_off_cmds
289 = nt35597_wqxga_dualdsi_video_off_command;
290 pinfo->mipi.num_of_panel_off_cmds
291 = NT35597_WQXGA_DUALDSI_VIDEO_OFF_COMMAND;
292 memcpy(phy_db->timing, nt35597_wqxga_dualdsi_video_timings,
293 TIMING_SIZE);
294 pinfo->mipi.tx_eot_append = true;
295 break;
Vishnuvardhan Prodduturic1a46c52015-06-29 16:35:23 +0530296 case NT35597_WQXGA_DUALDSI_CMD_PANEL:
297 panelstruct->paneldata = &nt35597_wqxga_dualdsi_cmd_panel_data;
298 panelstruct->paneldata->panel_operating_mode = DST_SPLIT_FLAG |
299 SPLIT_DISPLAY_FLAG | DUAL_DSI_FLAG;
300 panelstruct->paneldata->panel_with_enable_gpio = 0;
301
302 panelstruct->panelres = &nt35597_wqxga_dualdsi_cmd_panel_res;
303 panelstruct->color = &nt35597_wqxga_dualdsi_cmd_color;
304 panelstruct->videopanel = &nt35597_wqxga_dualdsi_cmd_video_panel;
305 panelstruct->commandpanel = &nt35597_wqxga_dualdsi_cmd_command_panel;
306 panelstruct->state = &nt35597_wqxga_dualdsi_cmd_state;
307 panelstruct->laneconfig = &nt35597_wqxga_dualdsi_cmd_lane_config;
308 panelstruct->paneltiminginfo
309 = &nt35597_wqxga_dualdsi_cmd_timing_info;
Padmanabhan Komanduru58fc57e2015-07-07 21:36:14 +0530310 /* Clkout timings are different for this panel on 8956 */
311 panelstruct->paneltiminginfo->tclk_post = 0x2b;
312 panelstruct->paneltiminginfo->tclk_pre = 0x28;
Vishnuvardhan Prodduturic1a46c52015-06-29 16:35:23 +0530313 panelstruct->panelresetseq
314 = &nt35597_wqxga_dualdsi_cmd_reset_seq;
315 panelstruct->backlightinfo = &nt35597_wqxga_dualdsi_cmd_backlight;
316
317 pinfo->labibb = &nt35597_wqxga_dualdsi_cmd_labibb;
318
319 pinfo->mipi.panel_on_cmds
320 = nt35597_wqxga_dualdsi_cmd_on_command;
321 pinfo->mipi.num_of_panel_on_cmds
322 = NT35597_WQXGA_DUALDSI_CMD_ON_COMMAND;
323 pinfo->mipi.panel_off_cmds
324 = nt35597_wqxga_dualdsi_cmd_off_command;
325 pinfo->mipi.num_of_panel_off_cmds
326 = NT35597_WQXGA_DUALDSI_CMD_OFF_COMMAND;
327 memcpy(phy_db->timing, nt35597_wqxga_dualdsi_cmd_timings,
328 TIMING_SIZE);
329 pinfo->mipi.tx_eot_append = true;
330 break;
Sandeep Pandaed082922015-08-03 12:18:25 +0530331 case NT35597_WQXGA_DSC_VIDEO_PANEL:
332 panelstruct->paneldata = &nt35597_wqxga_dsc_video_panel_data;
333 panelstruct->paneldata->panel_with_enable_gpio = 0;
334 panelstruct->paneldata->panel_operating_mode = USE_DSI1_PLL_FLAG;
335 panelstruct->panelres = &nt35597_wqxga_dsc_video_panel_res;
336 panelstruct->color = &nt35597_wqxga_dsc_video_color;
337 panelstruct->videopanel = &nt35597_wqxga_dsc_video_video_panel;
338 panelstruct->commandpanel = &nt35597_wqxga_dsc_video_command_panel;
339 panelstruct->state = &nt35597_wqxga_dsc_video_state;
340 panelstruct->laneconfig = &nt35597_wqxga_dsc_video_lane_config;
341 panelstruct->paneltiminginfo
342 = &nt35597_wqxga_dsc_video_timing_info;
343 panelstruct->panelresetseq
344 = &nt35597_wqxga_dsc_video_reset_seq;
345 panelstruct->backlightinfo = &nt35597_wqxga_dsc_video_backlight;
346 pinfo->labibb = &nt35597_wqxga_dsc_video_labibb;
347
348 pinfo->mipi.panel_on_cmds
349 = nt35597_wqxga_dsc_video_on_command;
350 pinfo->mipi.num_of_panel_on_cmds
351 = NT35597_WQXGA_DSC_VIDEO_ON_COMMAND;
352 pinfo->mipi.panel_off_cmds
353 = nt35597_wqxga_dsc_video_off_command;
354 pinfo->mipi.num_of_panel_off_cmds
355 = NT35597_WQXGA_DSC_VIDEO_OFF_COMMAND;
356 memcpy(phy_db->timing, nt35597_wqxga_dsc_video_timings,
357 TIMING_SIZE);
358 /* Clkout timings are different for this panel on 8956 */
359 panelstruct->paneltiminginfo->tclk_post = 0x04;
360 panelstruct->paneltiminginfo->tclk_pre = 0x20;
361 pinfo->mipi.tx_eot_append = true;
362 pinfo->compression_mode = COMPRESSION_DSC;
363 memcpy(&panelstruct->dsc_paras, &nt35597_wqxga_dsc_video_paras,
364 sizeof(struct dsc_parameters));
365 pinfo->dsc.parameter_calc = mdss_dsc_parameters_calc;
366 pinfo->dsc.dsc2buf = mdss_dsc_to_buf;
367 pinfo->dsc.dsi_dsc_config = mdss_dsc_dsi_config;
368 pinfo->dsc.mdp_dsc_config = mdss_dsc_mdp_config;
369 break;
370 case NT35597_WQXGA_DSC_CMD_PANEL:
371 panelstruct->paneldata = &nt35597_wqxga_dsc_cmd_panel_data;
372 panelstruct->paneldata->panel_with_enable_gpio = 0;
373 panelstruct->paneldata->panel_operating_mode = USE_DSI1_PLL_FLAG;
374 panelstruct->panelres = &nt35597_wqxga_dsc_cmd_panel_res;
375 panelstruct->color = &nt35597_wqxga_dsc_cmd_color;
376 panelstruct->videopanel = &nt35597_wqxga_dsc_cmd_video_panel;
377 panelstruct->commandpanel = &nt35597_wqxga_dsc_cmd_command_panel;
378 panelstruct->state = &nt35597_wqxga_dsc_cmd_state;
379 panelstruct->laneconfig = &nt35597_wqxga_dsc_cmd_lane_config;
380 panelstruct->paneltiminginfo
381 = &nt35597_wqxga_dsc_cmd_timing_info;
382 panelstruct->panelresetseq
383 = &nt35597_wqxga_dsc_cmd_reset_seq;
384 panelstruct->backlightinfo = &nt35597_wqxga_dsc_cmd_backlight;
385 pinfo->labibb = &nt35597_wqxga_dsc_cmd_labibb;
386
387 pinfo->mipi.panel_on_cmds
388 = nt35597_wqxga_dsc_cmd_on_command;
389 pinfo->mipi.num_of_panel_on_cmds
390 = NT35597_WQXGA_DSC_CMD_ON_COMMAND;
391 pinfo->mipi.panel_off_cmds
392 = nt35597_wqxga_dsc_cmd_off_command;
393 pinfo->mipi.num_of_panel_off_cmds
394 = NT35597_WQXGA_DSC_CMD_OFF_COMMAND;
395 memcpy(phy_db->timing, nt35597_wqxga_dsc_cmd_timings,
396 TIMING_SIZE);
397 /* Clkout timings are different for this panel on 8956 */
398 panelstruct->paneltiminginfo->tclk_post = 0x04;
399 panelstruct->paneltiminginfo->tclk_pre = 0x20;
400 pinfo->mipi.tx_eot_append = true;
401 pinfo->compression_mode = COMPRESSION_DSC;
402 memcpy(&panelstruct->dsc_paras, &nt35597_wqxga_dsc_cmd_paras,
403 sizeof(struct dsc_parameters));
404 pinfo->dsc.parameter_calc = mdss_dsc_parameters_calc;
405 pinfo->dsc.dsc2buf = mdss_dsc_to_buf;
406 pinfo->dsc.dsi_dsc_config = mdss_dsc_dsi_config;
407 pinfo->dsc.mdp_dsc_config = mdss_dsc_mdp_config;
408 break;
Padmanabhan Komanduru4927c2c2015-08-21 14:55:16 +0530409 case HX8394D_720P_VIDEO_PANEL:
410 panelstruct->paneldata = &hx8394d_720p_video_panel_data;
411 panelstruct->panelres = &hx8394d_720p_video_panel_res;
412 panelstruct->color = &hx8394d_720p_video_color;
413 panelstruct->videopanel = &hx8394d_720p_video_video_panel;
414 panelstruct->commandpanel = &hx8394d_720p_video_command_panel;
415 panelstruct->state = &hx8394d_720p_video_state;
416 panelstruct->laneconfig = &hx8394d_720p_video_lane_config;
417 panelstruct->paneltiminginfo
418 = &hx8394d_720p_video_timing_info;
419 panelstruct->panelresetseq
420 = &hx8394d_720p_video_panel_reset_seq;
421 panelstruct->backlightinfo = &hx8394d_720p_video_backlight;
422 pinfo->mipi.panel_on_cmds
423 = hx8394d_720p_video_on_command;
424 pinfo->mipi.num_of_panel_on_cmds
425 = HX8394D_720P_VIDEO_ON_COMMAND;
426 pinfo->mipi.panel_off_cmds
427 = hx8394d_720p_video_off_command;
428 pinfo->mipi.num_of_panel_off_cmds
429 = HX8394D_720P_VIDEO_OFF_COMMAND;
430 memcpy(phy_db->timing,
431 hx8394d_720p_video_timings, TIMING_SIZE);
432 pinfo->mipi.signature = HX8394D_720P_VIDEO_SIGNATURE;
433 break;
Padmanabhan Komanduru9d49f892015-04-10 12:58:46 -0700434 case UNKNOWN_PANEL:
435 default:
436 memset(panelstruct, 0, sizeof(struct panel_struct));
437 memset(pinfo->mipi.panel_on_cmds, 0,
438 sizeof(struct mipi_dsi_cmd));
439 pinfo->mipi.num_of_panel_on_cmds = 0;
440 memset(pinfo->mipi.panel_off_cmds, 0,
441 sizeof(struct mipi_dsi_cmd));
442 pinfo->mipi.num_of_panel_off_cmds = 0;
443 memset(phy_db->timing, 0, TIMING_SIZE);
444 pan_type = PANEL_TYPE_UNKNOWN;
445 break;
446 }
447 return pan_type;
448}
449
Ray Zhangf95f5b92015-06-25 15:34:29 +0800450#define DISPLAY_MAX_PANEL_DETECTION 2
451static uint32_t auto_pan_loop = 0;
452
453uint32_t oem_panel_max_auto_detect_panels()
454{
455 return target_panel_auto_detect_enabled() ?
456 DISPLAY_MAX_PANEL_DETECTION : 0;
457}
458
Padmanabhan Komanduru9d49f892015-04-10 12:58:46 -0700459int oem_panel_select(const char *panel_name, struct panel_struct *panelstruct,
460 struct msm_panel_info *pinfo,
461 struct mdss_dsi_phy_ctrl *phy_db)
462{
463 uint32_t hw_id = board_hardware_id();
464 int32_t panel_override_id;
feifanz028544e2015-07-28 20:58:57 +0800465 uint32_t target_id, plat_hw_ver_major;
Padmanabhan Komanduru9d49f892015-04-10 12:58:46 -0700466
467 if (panel_name) {
468 panel_override_id = panel_name_to_id(supp_panels,
469 ARRAY_SIZE(supp_panels), panel_name);
470
471 if (panel_override_id < 0) {
472 dprintf(CRITICAL, "Not able to search the panel:%s\n",
Padmanabhan Komandurubccbcdc2015-06-30 16:19:24 +0530473 panel_name);
Padmanabhan Komanduru9d49f892015-04-10 12:58:46 -0700474 } else if (panel_override_id < UNKNOWN_PANEL) {
475 /* panel override using fastboot oem command */
476 panel_id = panel_override_id;
477
478 dprintf(INFO, "OEM panel override:%s\n",
Padmanabhan Komandurubccbcdc2015-06-30 16:19:24 +0530479 panel_name);
Padmanabhan Komanduru9d49f892015-04-10 12:58:46 -0700480 goto panel_init;
481 }
482 }
483
484 switch (hw_id) {
485 case HW_PLATFORM_MTP:
Padmanabhan Komanduru49a86cf2015-06-08 18:24:30 +0530486 if (platform_is_msm8956())
487 panel_id = NT35597_WQXGA_DUALDSI_VIDEO_PANEL;
488 else
489 panel_id = TRULY_1080P_VIDEO_PANEL;
Padmanabhan Komanduru9d49f892015-04-10 12:58:46 -0700490 break;
491 case HW_PLATFORM_SURF:
Vishnuvardhan Prodduturie116c002015-07-14 17:14:25 +0530492 case HW_PLATFORM_RCM:
Padmanabhan Komanduru49a86cf2015-06-08 18:24:30 +0530493 if (platform_is_msm8956())
494 panel_id = NT35597_WQXGA_DUALDSI_VIDEO_PANEL;
495 else
496 panel_id = TRULY_1080P_VIDEO_PANEL;
Padmanabhan Komanduru9d49f892015-04-10 12:58:46 -0700497 break;
feifanz174c82c2015-04-15 18:57:07 +0800498 case HW_PLATFORM_QRD:
feifanz028544e2015-07-28 20:58:57 +0800499 target_id = board_target_id();
500 plat_hw_ver_major = ((target_id >> 16) & 0xFF);
501
502 /*
503 * 8952 SKUM DVT2 - HX8399A 1080p video panel
504 * 8952 SKUM EVT1/EVT2 - OTM1906C 1080p cmd panel
505 */
506 if (plat_hw_ver_major >= 4)
507 panel_id = HX8399A_1080P_VIDEO_PANEL;
508 else
509 panel_id = OTM1906C_1080P_CMD_PANEL;
Ray Zhangf95f5b92015-06-25 15:34:29 +0800510
511 /* QRD EVT1 uses OTM1906C, and EVT2 uses HX8399A */
512 if (platform_is_msm8956()) {
513 switch (auto_pan_loop) {
514 case 0:
515 panel_id = HX8399A_1080P_VIDEO_PANEL;
516 break;
517 case 1:
518 panel_id = OTM1906C_1080P_CMD_PANEL;
519 break;
520 default:
521 panel_id = UNKNOWN_PANEL;
522 dprintf(CRITICAL, "Unknown panel\n");
523 return PANEL_TYPE_UNKNOWN;
524 }
525 auto_pan_loop++;
526 }
527
feifanz174c82c2015-04-15 18:57:07 +0800528 break;
Padmanabhan Komanduru9d49f892015-04-10 12:58:46 -0700529 default:
530 dprintf(CRITICAL, "Display not enabled for %d HW type\n",
531 hw_id);
532 return PANEL_TYPE_UNKNOWN;
533 }
534
535panel_init:
536 /*
537 * Update all data structures after 'panel_init' label. Only panel
538 * selection is supposed to happen before that.
539 */
Padmanabhan Komanduru0e19a362015-06-08 13:29:32 +0530540 if (platform_is_msm8956())
541 memcpy(panel_regulator_settings,
542 dcdc_regulator_settings_hpm, REGULATOR_SIZE);
543 else
544 memcpy(panel_regulator_settings,
545 dcdc_regulator_settings_lpm, REGULATOR_SIZE);
Padmanabhan Komanduru9d49f892015-04-10 12:58:46 -0700546 pinfo->pipe_type = MDSS_MDP_PIPE_TYPE_RGB;
547 return init_panel_data(panelstruct, pinfo, phy_db);
548}