blob: cada80ca6d6419f5e0b811e1a42ad5f5076204b8 [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"
Sujeev Dias6bc9fa32015-08-03 23:13:44 -070058#include "include/panel_byd_1200p_video.h"
Ray Zhang4bbc7b02015-12-04 16:07:20 +080059#include "include/panel_r69006_1080p_cmd.h"
60#include "include/panel_r69006_1080p_video.h"
61#include "include/panel_hx8394f_720p_video.h"
Padmanabhan Komanduru9d49f892015-04-10 12:58:46 -070062
63/*---------------------------------------------------------------------------*/
64/* static panel selection variable */
65/*---------------------------------------------------------------------------*/
66enum {
67 TRULY_1080P_VIDEO_PANEL,
Jayant Shekhar9ea8dcd2015-04-20 15:18:37 +053068 TRULY_1080P_CMD_PANEL,
feifanz174c82c2015-04-15 18:57:07 +080069 OTM1906C_1080P_CMD_PANEL,
Vishnuvardhan Prodduturi16eb20f2015-06-05 18:03:54 +053070 SHARP_1080P_CMD_PANEL,
Padmanabhan Komanduru49a86cf2015-06-08 18:24:30 +053071 NT35597_WQXGA_DUALDSI_VIDEO_PANEL,
Vishnuvardhan Prodduturic1a46c52015-06-29 16:35:23 +053072 NT35597_WQXGA_DUALDSI_CMD_PANEL,
Ray Zhangf95f5b92015-06-25 15:34:29 +080073 HX8399A_1080P_VIDEO_PANEL,
Sandeep Pandaed082922015-08-03 12:18:25 +053074 NT35597_WQXGA_DSC_VIDEO_PANEL,
75 NT35597_WQXGA_DSC_CMD_PANEL,
Padmanabhan Komanduru4927c2c2015-08-21 14:55:16 +053076 HX8394D_720P_VIDEO_PANEL,
Sujeev Dias6bc9fa32015-08-03 23:13:44 -070077 BYD_1200P_VIDEO_PANEL,
Ray Zhang4bbc7b02015-12-04 16:07:20 +080078 R69006_1080P_CMD_PANEL,
79 R69006_1080P_VIDEO_PANEL,
80 HX8394F_720P_VIDEO_PANEL,
Padmanabhan Komanduru9d49f892015-04-10 12:58:46 -070081 UNKNOWN_PANEL
82};
83
84uint32_t panel_regulator_settings[] = {
85 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
86};
87
88/*
89 * The list of panels that are supported on this target.
90 * Any panel in this list can be selected using fastboot oem command.
91 */
92static struct panel_list supp_panels[] = {
93 {"truly_1080p_video", TRULY_1080P_VIDEO_PANEL},
Jayant Shekhar9ea8dcd2015-04-20 15:18:37 +053094 {"truly_1080p_cmd", TRULY_1080P_CMD_PANEL},
Vishnuvardhan Prodduturi16eb20f2015-06-05 18:03:54 +053095 {"sharp_1080p_cmd", SHARP_1080P_CMD_PANEL},
Padmanabhan Komanduru49a86cf2015-06-08 18:24:30 +053096 {"nt35597_wqxga_dualdsi_video", NT35597_WQXGA_DUALDSI_VIDEO_PANEL},
Vishnuvardhan Prodduturic1a46c52015-06-29 16:35:23 +053097 {"nt35597_wqxga_dualdsi_cmd", NT35597_WQXGA_DUALDSI_CMD_PANEL},
Ray Zhangf95f5b92015-06-25 15:34:29 +080098 {"otm1906c_1080p_cmd", OTM1906C_1080P_CMD_PANEL},
99 {"hx8399a_1080p_video", HX8399A_1080P_VIDEO_PANEL},
Sandeep Pandaed082922015-08-03 12:18:25 +0530100 {"nt35597_wqxga_dsc_video", NT35597_WQXGA_DSC_VIDEO_PANEL},
101 {"nt35597_wqxga_dsc_cmd", NT35597_WQXGA_DSC_CMD_PANEL},
Padmanabhan Komanduru4927c2c2015-08-21 14:55:16 +0530102 {"hx8394d_720p_video", HX8394D_720P_VIDEO_PANEL},
Sujeev Dias6bc9fa32015-08-03 23:13:44 -0700103 {"byd_1200p_video", BYD_1200P_VIDEO_PANEL},
Ray Zhang4bbc7b02015-12-04 16:07:20 +0800104 {"r69006_1080p_cmd",R69006_1080P_CMD_PANEL},
105 {"r69006_1080p_video",R69006_1080P_VIDEO_PANEL},
106 {"hx8394f_720p_video", HX8394F_720P_VIDEO_PANEL}
Padmanabhan Komanduru9d49f892015-04-10 12:58:46 -0700107};
108
109static uint32_t panel_id;
110
Sandeep Panda75fddaa2015-07-06 11:38:25 +0530111#define TRULY_1080P_PANEL_ON_DELAY 40
Sandeep Pandac797d542015-06-12 14:37:55 +0530112
Padmanabhan Komanduru9d49f892015-04-10 12:58:46 -0700113int oem_panel_rotation()
114{
115 return NO_ERROR;
116}
117
118int oem_panel_on()
119{
120 /*
121 *OEM can keep their panel specific on instructions in this
122 *function
feifanz525046b2015-06-01 20:31:06 +0800123 */
124 if (panel_id == OTM1906C_1080P_CMD_PANEL) {
125 /* needs extra delay to avoid unexpected artifacts */
126 mdelay(OTM1906C_1080P_CMD_PANEL_ON_DELAY);
Sandeep Panda75fddaa2015-07-06 11:38:25 +0530127 } else if (panel_id == TRULY_1080P_CMD_PANEL ||
128 panel_id == TRULY_1080P_VIDEO_PANEL) {
129 mdelay(TRULY_1080P_PANEL_ON_DELAY);
Ray Zhang6ec437c2015-12-04 16:08:08 +0800130 }else if (panel_id == R69006_1080P_CMD_PANEL) {
131 mdelay(R69006_1080P_CMD_PANEL_ON_DELAY);
feifanz525046b2015-06-01 20:31:06 +0800132 }
Sandeep Pandac797d542015-06-12 14:37:55 +0530133
Padmanabhan Komanduru9d49f892015-04-10 12:58:46 -0700134 return NO_ERROR;
135}
136
137int oem_panel_off()
138{
139 /* OEM can keep their panel specific off instructions
140 * in this function
141 */
142 return NO_ERROR;
143}
144
145static int init_panel_data(struct panel_struct *panelstruct,
146 struct msm_panel_info *pinfo,
147 struct mdss_dsi_phy_ctrl *phy_db)
148{
149 int pan_type = PANEL_TYPE_DSI;
Ujwal Patel41a665a2015-07-17 13:51:30 -0700150 struct oem_panel_data *oem_data = mdss_dsi_get_oem_data_ptr();
Padmanabhan Komanduru9d49f892015-04-10 12:58:46 -0700151
152 switch (panel_id) {
153 case TRULY_1080P_VIDEO_PANEL:
154 panelstruct->paneldata = &truly_1080p_video_panel_data;
155 panelstruct->paneldata->panel_with_enable_gpio = 1;
156 panelstruct->panelres = &truly_1080p_video_panel_res;
157 panelstruct->color = &truly_1080p_video_color;
158 panelstruct->videopanel = &truly_1080p_video_video_panel;
159 panelstruct->commandpanel = &truly_1080p_video_command_panel;
160 panelstruct->state = &truly_1080p_video_state;
161 panelstruct->laneconfig = &truly_1080p_video_lane_config;
162 panelstruct->paneltiminginfo
163 = &truly_1080p_video_timing_info;
164 panelstruct->panelresetseq
165 = &truly_1080p_video_panel_reset_seq;
166 panelstruct->backlightinfo = &truly_1080p_video_backlight;
167 pinfo->mipi.panel_on_cmds
168 = truly_1080p_video_on_command;
169 pinfo->mipi.num_of_panel_on_cmds
170 = TRULY_1080P_VIDEO_ON_COMMAND;
171 pinfo->mipi.panel_off_cmds
172 = truly_1080p_video_off_command;
173 pinfo->mipi.num_of_panel_off_cmds
174 = TRULY_1080P_VIDEO_OFF_COMMAND;
175 memcpy(phy_db->timing,
176 truly_1080p_video_timings, TIMING_SIZE);
177 pinfo->mipi.signature = TRULY_1080P_VIDEO_SIGNATURE;
178 break;
Jayant Shekhar9ea8dcd2015-04-20 15:18:37 +0530179 case TRULY_1080P_CMD_PANEL:
180 panelstruct->paneldata = &truly_1080p_cmd_panel_data;
181 panelstruct->paneldata->panel_with_enable_gpio = 1;
182 panelstruct->panelres = &truly_1080p_cmd_panel_res;
183 panelstruct->color = &truly_1080p_cmd_color;
184 panelstruct->videopanel = &truly_1080p_cmd_video_panel;
185 panelstruct->commandpanel = &truly_1080p_cmd_command_panel;
186 panelstruct->state = &truly_1080p_cmd_state;
187 panelstruct->laneconfig = &truly_1080p_cmd_lane_config;
188 panelstruct->paneltiminginfo
189 = &truly_1080p_cmd_timing_info;
190 panelstruct->panelresetseq
191 = &truly_1080p_cmd_panel_reset_seq;
192 panelstruct->backlightinfo = &truly_1080p_cmd_backlight;
193 pinfo->mipi.panel_on_cmds
194 = truly_1080p_cmd_on_command;
195 pinfo->mipi.num_of_panel_on_cmds
196 = TRULY_1080P_CMD_ON_COMMAND;
197 pinfo->mipi.panel_off_cmds
198 = truly_1080p_cmd_off_command;
199 pinfo->mipi.num_of_panel_off_cmds
200 = TRULY_1080P_CMD_OFF_COMMAND;
201 memcpy(phy_db->timing,
202 truly_1080p_cmd_timings, TIMING_SIZE);
203 pinfo->mipi.signature = TRULY_1080P_CMD_SIGNATURE;
204 break;
feifanz174c82c2015-04-15 18:57:07 +0800205 case OTM1906C_1080P_CMD_PANEL:
206 panelstruct->paneldata = &otm1906c_1080p_cmd_panel_data;
207 panelstruct->paneldata->panel_with_enable_gpio = 1;
208 panelstruct->panelres = &otm1906c_1080p_cmd_panel_res;
209 panelstruct->color = &otm1906c_1080p_cmd_color;
210 panelstruct->videopanel = &otm1906c_1080p_cmd_video_panel;
211 panelstruct->commandpanel = &otm1906c_1080p_cmd_command_panel;
212 panelstruct->state = &otm1906c_1080p_cmd_state;
213 panelstruct->laneconfig = &otm1906c_1080p_cmd_lane_config;
214 panelstruct->paneltiminginfo
215 = &otm1906c_1080p_cmd_timing_info;
216 panelstruct->panelresetseq
217 = &otm1906c_1080p_cmd_panel_reset_seq;
218 panelstruct->backlightinfo = &otm1906c_1080p_cmd_backlight;
219 pinfo->mipi.panel_on_cmds
220 = otm1906c_1080p_cmd_on_command;
221 pinfo->mipi.num_of_panel_on_cmds
222 = OTM1906C_1080P_CMD_ON_COMMAND;
223 pinfo->mipi.panel_off_cmds
224 = otm1906c_1080p_cmd_off_command;
225 pinfo->mipi.num_of_panel_off_cmds
226 = OTM1906C_1080P_CMD_OFF_COMMAND;
227 memcpy(phy_db->timing,
228 otm1906c_1080p_cmd_timings, TIMING_SIZE);
229 pinfo->mipi.signature = OTM1906C_1080P_CMD_SIGNATURE;
230 break;
Ray Zhangf95f5b92015-06-25 15:34:29 +0800231 case HX8399A_1080P_VIDEO_PANEL:
232 panelstruct->paneldata = &hx8399a_1080p_video_panel_data;
233 panelstruct->panelres = &hx8399a_1080p_video_panel_res;
234 panelstruct->color = &hx8399a_1080p_video_color;
235 panelstruct->videopanel = &hx8399a_1080p_video_video_panel;
236 panelstruct->commandpanel = &hx8399a_1080p_video_command_panel;
237 panelstruct->state = &hx8399a_1080p_video_state;
238 panelstruct->laneconfig = &hx8399a_1080p_video_lane_config;
239 panelstruct->paneltiminginfo
240 = &hx8399a_1080p_video_timing_info;
241 panelstruct->panelresetseq
242 = &hx8399a_1080p_video_reset_seq;
243 panelstruct->backlightinfo = &hx8399a_1080p_video_backlight;
244 pinfo->mipi.panel_on_cmds
245 = hx8399a_1080p_video_on_command;
246 pinfo->mipi.num_of_panel_on_cmds
247 = HX8399A_1080P_VIDEO_ON_COMMAND;
248 pinfo->mipi.panel_off_cmds
249 = hx8399a_1080p_video_off_command;
250 pinfo->mipi.num_of_panel_off_cmds
251 = HX8399A_1080P_VIDEO_OFF_COMMAND;
252 memcpy(phy_db->timing,
253 hx8399a_1080p_video_timings, TIMING_SIZE);
254 pinfo->mipi.signature = HX8399A_1080P_VIDEO_SIGNATURE;
255 break;
Vishnuvardhan Prodduturi16eb20f2015-06-05 18:03:54 +0530256 case SHARP_1080P_CMD_PANEL:
257 panelstruct->paneldata = &sharp_1080p_cmd_panel_data;
258 panelstruct->panelres = &sharp_1080p_cmd_panel_res;
259 panelstruct->paneldata->panel_with_enable_gpio = 1;
260 panelstruct->color = &sharp_1080p_cmd_color;
261 panelstruct->videopanel = &sharp_1080p_cmd_video_panel;
262 panelstruct->commandpanel = &sharp_1080p_cmd_command_panel;
263 panelstruct->state = &sharp_1080p_cmd_state;
264 panelstruct->laneconfig = &sharp_1080p_cmd_lane_config;
265 panelstruct->paneltiminginfo
266 = &sharp_1080p_cmd_timing_info;
267 panelstruct->panelresetseq
268 = &sharp_1080p_cmd_panel_reset_seq;
269 panelstruct->backlightinfo = &sharp_1080p_cmd_backlight;
270 pinfo->mipi.panel_on_cmds
271 = sharp_1080p_cmd_on_command;
272 pinfo->mipi.num_of_panel_on_cmds
273 = SHARP_1080P_CMD_ON_COMMAND;
274 pinfo->mipi.panel_off_cmds
275 = sharp_1080p_cmd_off_command;
276 pinfo->mipi.num_of_panel_off_cmds
277 = SHARP_1080P_CMD_OFF_COMMAND;
278 memcpy(phy_db->timing,
279 sharp_1080p_cmd_timings, TIMING_SIZE);
280 break;
Padmanabhan Komanduru49a86cf2015-06-08 18:24:30 +0530281 case NT35597_WQXGA_DUALDSI_VIDEO_PANEL:
282 panelstruct->paneldata = &nt35597_wqxga_dualdsi_video_panel_data;
283 panelstruct->paneldata->panel_operating_mode = DST_SPLIT_FLAG |
284 SPLIT_DISPLAY_FLAG | DUAL_DSI_FLAG;
285 panelstruct->paneldata->panel_with_enable_gpio = 0;
286
287 panelstruct->panelres = &nt35597_wqxga_dualdsi_video_panel_res;
288 panelstruct->color = &nt35597_wqxga_dualdsi_video_color;
289 panelstruct->videopanel = &nt35597_wqxga_dualdsi_video_video_panel;
290 panelstruct->commandpanel = &nt35597_wqxga_dualdsi_video_command_panel;
291 panelstruct->state = &nt35597_wqxga_dualdsi_video_state;
292 panelstruct->laneconfig = &nt35597_wqxga_dualdsi_video_lane_config;
293 panelstruct->paneltiminginfo
294 = &nt35597_wqxga_dualdsi_video_timing_info;
295 panelstruct->panelresetseq
296 = &nt35597_wqxga_dualdsi_video_reset_seq;
297 panelstruct->backlightinfo = &nt35597_wqxga_dualdsi_video_backlight;
298 pinfo->labibb = &nt35597_wqxga_dualdsi_video_labibb;
299
300 pinfo->mipi.panel_on_cmds
301 = nt35597_wqxga_dualdsi_video_on_command;
302 pinfo->mipi.num_of_panel_on_cmds
303 = NT35597_WQXGA_DUALDSI_VIDEO_ON_COMMAND;
304 pinfo->mipi.panel_off_cmds
305 = nt35597_wqxga_dualdsi_video_off_command;
306 pinfo->mipi.num_of_panel_off_cmds
307 = NT35597_WQXGA_DUALDSI_VIDEO_OFF_COMMAND;
308 memcpy(phy_db->timing, nt35597_wqxga_dualdsi_video_timings,
309 TIMING_SIZE);
310 pinfo->mipi.tx_eot_append = true;
311 break;
Vishnuvardhan Prodduturic1a46c52015-06-29 16:35:23 +0530312 case NT35597_WQXGA_DUALDSI_CMD_PANEL:
313 panelstruct->paneldata = &nt35597_wqxga_dualdsi_cmd_panel_data;
314 panelstruct->paneldata->panel_operating_mode = DST_SPLIT_FLAG |
315 SPLIT_DISPLAY_FLAG | DUAL_DSI_FLAG;
316 panelstruct->paneldata->panel_with_enable_gpio = 0;
317
318 panelstruct->panelres = &nt35597_wqxga_dualdsi_cmd_panel_res;
319 panelstruct->color = &nt35597_wqxga_dualdsi_cmd_color;
320 panelstruct->videopanel = &nt35597_wqxga_dualdsi_cmd_video_panel;
321 panelstruct->commandpanel = &nt35597_wqxga_dualdsi_cmd_command_panel;
322 panelstruct->state = &nt35597_wqxga_dualdsi_cmd_state;
323 panelstruct->laneconfig = &nt35597_wqxga_dualdsi_cmd_lane_config;
324 panelstruct->paneltiminginfo
325 = &nt35597_wqxga_dualdsi_cmd_timing_info;
Padmanabhan Komanduru58fc57e2015-07-07 21:36:14 +0530326 /* Clkout timings are different for this panel on 8956 */
327 panelstruct->paneltiminginfo->tclk_post = 0x2b;
328 panelstruct->paneltiminginfo->tclk_pre = 0x28;
Vishnuvardhan Prodduturic1a46c52015-06-29 16:35:23 +0530329 panelstruct->panelresetseq
330 = &nt35597_wqxga_dualdsi_cmd_reset_seq;
331 panelstruct->backlightinfo = &nt35597_wqxga_dualdsi_cmd_backlight;
332
333 pinfo->labibb = &nt35597_wqxga_dualdsi_cmd_labibb;
334
335 pinfo->mipi.panel_on_cmds
336 = nt35597_wqxga_dualdsi_cmd_on_command;
337 pinfo->mipi.num_of_panel_on_cmds
338 = NT35597_WQXGA_DUALDSI_CMD_ON_COMMAND;
339 pinfo->mipi.panel_off_cmds
340 = nt35597_wqxga_dualdsi_cmd_off_command;
341 pinfo->mipi.num_of_panel_off_cmds
342 = NT35597_WQXGA_DUALDSI_CMD_OFF_COMMAND;
343 memcpy(phy_db->timing, nt35597_wqxga_dualdsi_cmd_timings,
344 TIMING_SIZE);
345 pinfo->mipi.tx_eot_append = true;
346 break;
Sandeep Pandaed082922015-08-03 12:18:25 +0530347 case NT35597_WQXGA_DSC_VIDEO_PANEL:
348 panelstruct->paneldata = &nt35597_wqxga_dsc_video_panel_data;
349 panelstruct->paneldata->panel_with_enable_gpio = 0;
350 panelstruct->paneldata->panel_operating_mode = USE_DSI1_PLL_FLAG;
351 panelstruct->panelres = &nt35597_wqxga_dsc_video_panel_res;
352 panelstruct->color = &nt35597_wqxga_dsc_video_color;
353 panelstruct->videopanel = &nt35597_wqxga_dsc_video_video_panel;
354 panelstruct->commandpanel = &nt35597_wqxga_dsc_video_command_panel;
355 panelstruct->state = &nt35597_wqxga_dsc_video_state;
356 panelstruct->laneconfig = &nt35597_wqxga_dsc_video_lane_config;
357 panelstruct->paneltiminginfo
358 = &nt35597_wqxga_dsc_video_timing_info;
359 panelstruct->panelresetseq
360 = &nt35597_wqxga_dsc_video_reset_seq;
361 panelstruct->backlightinfo = &nt35597_wqxga_dsc_video_backlight;
362 pinfo->labibb = &nt35597_wqxga_dsc_video_labibb;
363
364 pinfo->mipi.panel_on_cmds
365 = nt35597_wqxga_dsc_video_on_command;
366 pinfo->mipi.num_of_panel_on_cmds
367 = NT35597_WQXGA_DSC_VIDEO_ON_COMMAND;
368 pinfo->mipi.panel_off_cmds
369 = nt35597_wqxga_dsc_video_off_command;
370 pinfo->mipi.num_of_panel_off_cmds
371 = NT35597_WQXGA_DSC_VIDEO_OFF_COMMAND;
372 memcpy(phy_db->timing, nt35597_wqxga_dsc_video_timings,
373 TIMING_SIZE);
374 /* Clkout timings are different for this panel on 8956 */
375 panelstruct->paneltiminginfo->tclk_post = 0x04;
376 panelstruct->paneltiminginfo->tclk_pre = 0x20;
377 pinfo->mipi.tx_eot_append = true;
Ujwal Patel41a665a2015-07-17 13:51:30 -0700378
379 panelstruct->paneldata->panel_operating_mode &= ~DUAL_PIPE_FLAG;
380 panelstruct->config = &nt35597_wqxga_dsc_video_config0;
381 if (oem_data) {
382 switch (oem_data->cfg_num[0]) {
383 case -1: /* default */
384 case 0:
385 panelstruct->config =
386 &nt35597_wqxga_dsc_video_config0;
387 break;
388 default:
389 dprintf(CRITICAL, "topology config%d not supported. fallback to default config0\n",
390 oem_data->cfg_num[0]);
391 panelstruct->config = &nt35597_wqxga_dsc_video_config0;
392 }
393 }
394 pinfo->lm_split[0] = panelstruct->config->lm_split[0];
395 pinfo->lm_split[1] = panelstruct->config->lm_split[1];
396 pinfo->num_dsc_enc = panelstruct->config->num_dsc_enc;
Sandeep Pandaed082922015-08-03 12:18:25 +0530397 pinfo->compression_mode = COMPRESSION_DSC;
Ujwal Patel41a665a2015-07-17 13:51:30 -0700398
Sandeep Pandaed082922015-08-03 12:18:25 +0530399 pinfo->dsc.parameter_calc = mdss_dsc_parameters_calc;
400 pinfo->dsc.dsc2buf = mdss_dsc_to_buf;
401 pinfo->dsc.dsi_dsc_config = mdss_dsc_dsi_config;
402 pinfo->dsc.mdp_dsc_config = mdss_dsc_mdp_config;
403 break;
404 case NT35597_WQXGA_DSC_CMD_PANEL:
405 panelstruct->paneldata = &nt35597_wqxga_dsc_cmd_panel_data;
406 panelstruct->paneldata->panel_with_enable_gpio = 0;
407 panelstruct->paneldata->panel_operating_mode = USE_DSI1_PLL_FLAG;
408 panelstruct->panelres = &nt35597_wqxga_dsc_cmd_panel_res;
409 panelstruct->color = &nt35597_wqxga_dsc_cmd_color;
410 panelstruct->videopanel = &nt35597_wqxga_dsc_cmd_video_panel;
411 panelstruct->commandpanel = &nt35597_wqxga_dsc_cmd_command_panel;
412 panelstruct->state = &nt35597_wqxga_dsc_cmd_state;
413 panelstruct->laneconfig = &nt35597_wqxga_dsc_cmd_lane_config;
414 panelstruct->paneltiminginfo
415 = &nt35597_wqxga_dsc_cmd_timing_info;
416 panelstruct->panelresetseq
417 = &nt35597_wqxga_dsc_cmd_reset_seq;
418 panelstruct->backlightinfo = &nt35597_wqxga_dsc_cmd_backlight;
419 pinfo->labibb = &nt35597_wqxga_dsc_cmd_labibb;
420
421 pinfo->mipi.panel_on_cmds
422 = nt35597_wqxga_dsc_cmd_on_command;
423 pinfo->mipi.num_of_panel_on_cmds
424 = NT35597_WQXGA_DSC_CMD_ON_COMMAND;
425 pinfo->mipi.panel_off_cmds
426 = nt35597_wqxga_dsc_cmd_off_command;
427 pinfo->mipi.num_of_panel_off_cmds
428 = NT35597_WQXGA_DSC_CMD_OFF_COMMAND;
429 memcpy(phy_db->timing, nt35597_wqxga_dsc_cmd_timings,
430 TIMING_SIZE);
431 /* Clkout timings are different for this panel on 8956 */
432 panelstruct->paneltiminginfo->tclk_post = 0x04;
433 panelstruct->paneltiminginfo->tclk_pre = 0x20;
434 pinfo->mipi.tx_eot_append = true;
Ujwal Patel41a665a2015-07-17 13:51:30 -0700435
436 panelstruct->paneldata->panel_operating_mode &= ~DUAL_PIPE_FLAG;
437 panelstruct->config = &nt35597_wqxga_dsc_cmd_config0;
438 if (oem_data) {
439 switch (oem_data->cfg_num[0]) {
440 case -1: /* default */
441 case 0:
442 panelstruct->config =
443 &nt35597_wqxga_dsc_cmd_config0;
444 break;
445 default:
446 dprintf(CRITICAL, "topology config%d not supported. fallback to default config0\n",
447 oem_data->cfg_num[0]);
448 panelstruct->config = &nt35597_wqxga_dsc_cmd_config0;
449 }
450 }
451 pinfo->lm_split[0] = panelstruct->config->lm_split[0];
452 pinfo->lm_split[1] = panelstruct->config->lm_split[1];
453 pinfo->num_dsc_enc = panelstruct->config->num_dsc_enc;
Sandeep Pandaed082922015-08-03 12:18:25 +0530454 pinfo->compression_mode = COMPRESSION_DSC;
Ujwal Patel41a665a2015-07-17 13:51:30 -0700455
Sandeep Pandaed082922015-08-03 12:18:25 +0530456 pinfo->dsc.parameter_calc = mdss_dsc_parameters_calc;
457 pinfo->dsc.dsc2buf = mdss_dsc_to_buf;
458 pinfo->dsc.dsi_dsc_config = mdss_dsc_dsi_config;
459 pinfo->dsc.mdp_dsc_config = mdss_dsc_mdp_config;
460 break;
Padmanabhan Komanduru4927c2c2015-08-21 14:55:16 +0530461 case HX8394D_720P_VIDEO_PANEL:
462 panelstruct->paneldata = &hx8394d_720p_video_panel_data;
463 panelstruct->panelres = &hx8394d_720p_video_panel_res;
464 panelstruct->color = &hx8394d_720p_video_color;
465 panelstruct->videopanel = &hx8394d_720p_video_video_panel;
466 panelstruct->commandpanel = &hx8394d_720p_video_command_panel;
467 panelstruct->state = &hx8394d_720p_video_state;
468 panelstruct->laneconfig = &hx8394d_720p_video_lane_config;
469 panelstruct->paneltiminginfo
470 = &hx8394d_720p_video_timing_info;
471 panelstruct->panelresetseq
472 = &hx8394d_720p_video_panel_reset_seq;
473 panelstruct->backlightinfo = &hx8394d_720p_video_backlight;
474 pinfo->mipi.panel_on_cmds
475 = hx8394d_720p_video_on_command;
476 pinfo->mipi.num_of_panel_on_cmds
477 = HX8394D_720P_VIDEO_ON_COMMAND;
478 pinfo->mipi.panel_off_cmds
479 = hx8394d_720p_video_off_command;
480 pinfo->mipi.num_of_panel_off_cmds
481 = HX8394D_720P_VIDEO_OFF_COMMAND;
482 memcpy(phy_db->timing,
483 hx8394d_720p_video_timings, TIMING_SIZE);
484 pinfo->mipi.signature = HX8394D_720P_VIDEO_SIGNATURE;
485 break;
Ray Zhang4bbc7b02015-12-04 16:07:20 +0800486 case R69006_1080P_CMD_PANEL:
487 panelstruct->paneldata = &r69006_1080p_cmd_panel_data;
488 panelstruct->panelres = &r69006_1080p_cmd_panel_res;
489 panelstruct->color = &r69006_1080p_cmd_color;
490 panelstruct->videopanel = &r69006_1080p_cmd_video_panel;
491 panelstruct->commandpanel = &r69006_1080p_cmd_command_panel;
492 panelstruct->state = &r69006_1080p_cmd_state;
493 panelstruct->laneconfig = &r69006_1080p_cmd_lane_config;
494 panelstruct->paneltiminginfo
495 = &r69006_1080p_cmd_timing_info;
496 panelstruct->panelresetseq
497 = &r69006_1080p_cmd_reset_seq;
498 panelstruct->backlightinfo = &r69006_1080p_cmd_backlight;
Ray Zhange9e3b692015-12-18 18:03:30 +0800499 pinfo->labibb = &r69006_1080p_cmd_labibb;
Ray Zhang4bbc7b02015-12-04 16:07:20 +0800500 pinfo->mipi.panel_on_cmds
501 = r69006_1080p_cmd_on_command;
502 pinfo->mipi.num_of_panel_on_cmds
503 = R69006_1080P_CMD_ON_COMMAND;
504 pinfo->mipi.panel_off_cmds
505 = r69006_1080p_cmd_off_command;
506 pinfo->mipi.num_of_panel_off_cmds
507 = R69006_1080P_CMD_OFF_COMMAND;
508 memcpy(phy_db->timing,
509 r69006_1080p_cmd_timings, TIMING_SIZE);
510 pinfo->mipi.signature = R69006_1080P_CMD_SIGNATURE;
511 break;
512 case R69006_1080P_VIDEO_PANEL:
513 panelstruct->paneldata = &r69006_1080p_video_panel_data;
514 panelstruct->panelres = &r69006_1080p_video_panel_res;
515 panelstruct->color = &r69006_1080p_video_color;
516 panelstruct->videopanel = &r69006_1080p_video_video_panel;
517 panelstruct->commandpanel = &r69006_1080p_video_command_panel;
518 panelstruct->state = &r69006_1080p_video_state;
519 panelstruct->laneconfig = &r69006_1080p_video_lane_config;
520 panelstruct->paneltiminginfo
521 = &r69006_1080p_video_timing_info;
522 panelstruct->panelresetseq
523 = &r69006_1080p_video_reset_seq;
524 panelstruct->backlightinfo = &r69006_1080p_video_backlight;
Ray Zhange9e3b692015-12-18 18:03:30 +0800525 pinfo->labibb = &r69006_1080p_video_labibb;
Ray Zhang4bbc7b02015-12-04 16:07:20 +0800526 pinfo->mipi.panel_on_cmds
527 = r69006_1080p_video_on_command;
528 pinfo->mipi.num_of_panel_on_cmds
529 = R69006_1080P_VIDEO_ON_COMMAND;
530 pinfo->mipi.panel_off_cmds
531 = r69006_1080p_video_off_command;
532 pinfo->mipi.num_of_panel_off_cmds
533 = R69006_1080P_VIDEO_OFF_COMMAND;
534 memcpy(phy_db->timing,
535 r69006_1080p_video_timings, TIMING_SIZE);
536 pinfo->mipi.signature = R69006_1080P_VIDEO_SIGNATURE;
537 break;
538 case HX8394F_720P_VIDEO_PANEL:
539 panelstruct->paneldata = &hx8394f_720p_video_panel_data;
540 panelstruct->panelres = &hx8394f_720p_video_panel_res;
541 panelstruct->color = &hx8394f_720p_video_color;
542 panelstruct->videopanel = &hx8394f_720p_video_video_panel;
543 panelstruct->commandpanel = &hx8394f_720p_video_command_panel;
544 panelstruct->state = &hx8394f_720p_video_state;
545 panelstruct->laneconfig = &hx8394f_720p_video_lane_config;
546 panelstruct->paneltiminginfo
547 = &hx8394f_720p_video_timing_info;
548 panelstruct->panelresetseq
549 = &hx8394f_720p_video_reset_seq;
550 panelstruct->backlightinfo = &hx8394f_720p_video_backlight;
551 pinfo->mipi.panel_on_cmds
552 = hx8394f_720p_video_on_command;
553 pinfo->mipi.num_of_panel_on_cmds
554 = HX8394F_720P_VIDEO_ON_COMMAND;
555 pinfo->mipi.panel_off_cmds
556 = hx8394f_720p_video_off_command;
557 pinfo->mipi.num_of_panel_off_cmds
558 = HX8394F_720P_VIDEO_OFF_COMMAND;
559 memcpy(phy_db->timing,
560 hx8394f_720p_video_timings, TIMING_SIZE);
561 pinfo->mipi.signature = HX8394F_720P_VIDEO_SIGNATURE;
562 break;
Sujeev Dias6bc9fa32015-08-03 23:13:44 -0700563 case BYD_1200P_VIDEO_PANEL:
564 panelstruct->paneldata = &byd_1200p_video_panel_data;
565 panelstruct->paneldata->panel_with_enable_gpio = 1;
566 panelstruct->panelres = &byd_1200p_video_panel_res;
567 panelstruct->color = &byd_1200p_video_color;
568 panelstruct->videopanel = &byd_1200p_video_video_panel;
569 panelstruct->commandpanel = &byd_1200p_video_command_panel;
570 panelstruct->state = &byd_1200p_video_state;
571 panelstruct->laneconfig = &byd_1200p_video_lane_config;
572 panelstruct->paneltiminginfo
573 = &byd_1200p_video_timing_info;
574 panelstruct->panelresetseq
575 = &byd_1200p_video_panel_reset_seq;
576 panelstruct->backlightinfo = &byd_1200p_video_backlight;
577 pinfo->mipi.panel_on_cmds
578 = byd_1200p_video_on_command;
579 pinfo->mipi.num_of_panel_on_cmds
580 = BYD_1200P_VIDEO_ON_COMMAND;
581 pinfo->mipi.panel_off_cmds
582 = byd_1200p_video_off_command;
583 pinfo->mipi.num_of_panel_off_cmds
584 = BYD_1200P_VIDEO_OFF_COMMAND;
585 memcpy(phy_db->timing,
586 byd_1200p_video_timings, TIMING_SIZE);
587 pinfo->mipi.signature = BYD_1200P_VIDEO_SIGNATURE;
588 phy_db->regulator_mode = DSI_PHY_REGULATOR_LDO_MODE;
589 break;
Padmanabhan Komanduru9d49f892015-04-10 12:58:46 -0700590 case UNKNOWN_PANEL:
591 default:
592 memset(panelstruct, 0, sizeof(struct panel_struct));
593 memset(pinfo->mipi.panel_on_cmds, 0,
594 sizeof(struct mipi_dsi_cmd));
595 pinfo->mipi.num_of_panel_on_cmds = 0;
596 memset(pinfo->mipi.panel_off_cmds, 0,
597 sizeof(struct mipi_dsi_cmd));
598 pinfo->mipi.num_of_panel_off_cmds = 0;
599 memset(phy_db->timing, 0, TIMING_SIZE);
600 pan_type = PANEL_TYPE_UNKNOWN;
601 break;
602 }
Ujwal Patel41a665a2015-07-17 13:51:30 -0700603
604 dprintf(SPEW, "lm_split[0]=%d lm_split[1]=%d mode=0x%x\n",
605 pinfo->lm_split[0], pinfo->lm_split[1],
606 panelstruct->paneldata->panel_operating_mode);
607
Padmanabhan Komanduru9d49f892015-04-10 12:58:46 -0700608 return pan_type;
609}
610
Ray Zhangf95f5b92015-06-25 15:34:29 +0800611#define DISPLAY_MAX_PANEL_DETECTION 2
612static uint32_t auto_pan_loop = 0;
613
614uint32_t oem_panel_max_auto_detect_panels()
615{
616 return target_panel_auto_detect_enabled() ?
617 DISPLAY_MAX_PANEL_DETECTION : 0;
618}
619
Padmanabhan Komanduru9d49f892015-04-10 12:58:46 -0700620int oem_panel_select(const char *panel_name, struct panel_struct *panelstruct,
621 struct msm_panel_info *pinfo,
622 struct mdss_dsi_phy_ctrl *phy_db)
623{
624 uint32_t hw_id = board_hardware_id();
Sujeev Dias6bc9fa32015-08-03 23:13:44 -0700625 uint32_t hw_subtype = board_hardware_subtype();
Padmanabhan Komanduru9d49f892015-04-10 12:58:46 -0700626 int32_t panel_override_id;
feifanz028544e2015-07-28 20:58:57 +0800627 uint32_t target_id, plat_hw_ver_major;
Padmanabhan Komanduru9d49f892015-04-10 12:58:46 -0700628
629 if (panel_name) {
630 panel_override_id = panel_name_to_id(supp_panels,
631 ARRAY_SIZE(supp_panels), panel_name);
632
633 if (panel_override_id < 0) {
634 dprintf(CRITICAL, "Not able to search the panel:%s\n",
Padmanabhan Komandurubccbcdc2015-06-30 16:19:24 +0530635 panel_name);
Padmanabhan Komanduru9d49f892015-04-10 12:58:46 -0700636 } else if (panel_override_id < UNKNOWN_PANEL) {
637 /* panel override using fastboot oem command */
638 panel_id = panel_override_id;
639
640 dprintf(INFO, "OEM panel override:%s\n",
Padmanabhan Komandurubccbcdc2015-06-30 16:19:24 +0530641 panel_name);
Padmanabhan Komanduru9d49f892015-04-10 12:58:46 -0700642 goto panel_init;
643 }
644 }
645
646 switch (hw_id) {
647 case HW_PLATFORM_MTP:
Padmanabhan Komanduru49a86cf2015-06-08 18:24:30 +0530648 if (platform_is_msm8956())
649 panel_id = NT35597_WQXGA_DUALDSI_VIDEO_PANEL;
650 else
651 panel_id = TRULY_1080P_VIDEO_PANEL;
Padmanabhan Komanduru9d49f892015-04-10 12:58:46 -0700652 break;
653 case HW_PLATFORM_SURF:
Vishnuvardhan Prodduturie116c002015-07-14 17:14:25 +0530654 case HW_PLATFORM_RCM:
Padmanabhan Komanduru49a86cf2015-06-08 18:24:30 +0530655 if (platform_is_msm8956())
656 panel_id = NT35597_WQXGA_DUALDSI_VIDEO_PANEL;
657 else
658 panel_id = TRULY_1080P_VIDEO_PANEL;
Padmanabhan Komanduru9d49f892015-04-10 12:58:46 -0700659 break;
feifanz174c82c2015-04-15 18:57:07 +0800660 case HW_PLATFORM_QRD:
Sujeev Dias6bc9fa32015-08-03 23:13:44 -0700661 if (hw_subtype == HW_PLATFORM_SUBTYPE_POLARIS) {
662 panel_id = BYD_1200P_VIDEO_PANEL;
663 break;
664 }
665
feifanz028544e2015-07-28 20:58:57 +0800666 target_id = board_target_id();
667 plat_hw_ver_major = ((target_id >> 16) & 0xFF);
668
669 /*
670 * 8952 SKUM DVT2 - HX8399A 1080p video panel
671 * 8952 SKUM EVT1/EVT2 - OTM1906C 1080p cmd panel
672 */
673 if (plat_hw_ver_major >= 4)
674 panel_id = HX8399A_1080P_VIDEO_PANEL;
675 else
676 panel_id = OTM1906C_1080P_CMD_PANEL;
Ray Zhangf95f5b92015-06-25 15:34:29 +0800677
Ray Zhang4bbc7b02015-12-04 16:07:20 +0800678 /* QRD 8937 SKU1 uses R69006, and SKU2 uses HX8399A */
679 if (platform_is_msm8937()){
680 if (plat_hw_ver_major > 16)
681 panel_id = HX8394F_720P_VIDEO_PANEL;
682 else
683 panel_id = R69006_1080P_CMD_PANEL;
684 }
685
686 /* QRD EVT1 uses OTM1906C, and EVT2 uses HX8394F */
Ray Zhangf95f5b92015-06-25 15:34:29 +0800687 if (platform_is_msm8956()) {
688 switch (auto_pan_loop) {
689 case 0:
690 panel_id = HX8399A_1080P_VIDEO_PANEL;
691 break;
692 case 1:
693 panel_id = OTM1906C_1080P_CMD_PANEL;
694 break;
695 default:
696 panel_id = UNKNOWN_PANEL;
697 dprintf(CRITICAL, "Unknown panel\n");
698 return PANEL_TYPE_UNKNOWN;
699 }
700 auto_pan_loop++;
701 }
702
feifanz174c82c2015-04-15 18:57:07 +0800703 break;
Padmanabhan Komanduru9d49f892015-04-10 12:58:46 -0700704 default:
705 dprintf(CRITICAL, "Display not enabled for %d HW type\n",
706 hw_id);
707 return PANEL_TYPE_UNKNOWN;
708 }
709
710panel_init:
711 /*
712 * Update all data structures after 'panel_init' label. Only panel
713 * selection is supposed to happen before that.
714 */
Padmanabhan Komanduru0e19a362015-06-08 13:29:32 +0530715 if (platform_is_msm8956())
716 memcpy(panel_regulator_settings,
717 dcdc_regulator_settings_hpm, REGULATOR_SIZE);
718 else
719 memcpy(panel_regulator_settings,
720 dcdc_regulator_settings_lpm, REGULATOR_SIZE);
Padmanabhan Komanduru9d49f892015-04-10 12:58:46 -0700721 pinfo->pipe_type = MDSS_MDP_PIPE_TYPE_RGB;
722 return init_panel_data(panelstruct, pinfo, phy_db);
723}