blob: 37c6db6152530d8f689ff58131df44e458378201 [file] [log] [blame]
Jayant Shekhar9c0533e2016-01-28 11:17:18 +05301/* Copyright (c) 2015-2016, The Linux Foundation. All rights reserved.
Padmanabhan Komanduru9d49f892015-04-10 12:58:46 -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 <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 Komandurue108ed02015-12-21 12:43:07 +053062#include "include/panel_truly_720p_video.h"
Padmanabhan Komanduru9d49f892015-04-10 12:58:46 -070063
64/*---------------------------------------------------------------------------*/
65/* static panel selection variable */
66/*---------------------------------------------------------------------------*/
67enum {
68 TRULY_1080P_VIDEO_PANEL,
Jayant Shekhar9ea8dcd2015-04-20 15:18:37 +053069 TRULY_1080P_CMD_PANEL,
feifanz174c82c2015-04-15 18:57:07 +080070 OTM1906C_1080P_CMD_PANEL,
Vishnuvardhan Prodduturi16eb20f2015-06-05 18:03:54 +053071 SHARP_1080P_CMD_PANEL,
Padmanabhan Komanduru49a86cf2015-06-08 18:24:30 +053072 NT35597_WQXGA_DUALDSI_VIDEO_PANEL,
Vishnuvardhan Prodduturic1a46c52015-06-29 16:35:23 +053073 NT35597_WQXGA_DUALDSI_CMD_PANEL,
Ray Zhangf95f5b92015-06-25 15:34:29 +080074 HX8399A_1080P_VIDEO_PANEL,
Sandeep Pandaed082922015-08-03 12:18:25 +053075 NT35597_WQXGA_DSC_VIDEO_PANEL,
76 NT35597_WQXGA_DSC_CMD_PANEL,
Padmanabhan Komanduru4927c2c2015-08-21 14:55:16 +053077 HX8394D_720P_VIDEO_PANEL,
Sujeev Dias6bc9fa32015-08-03 23:13:44 -070078 BYD_1200P_VIDEO_PANEL,
Ray Zhang4bbc7b02015-12-04 16:07:20 +080079 R69006_1080P_CMD_PANEL,
80 R69006_1080P_VIDEO_PANEL,
81 HX8394F_720P_VIDEO_PANEL,
Padmanabhan Komandurue108ed02015-12-21 12:43:07 +053082 TRULY_720P_VIDEO_PANEL,
Padmanabhan Komanduru9d49f892015-04-10 12:58:46 -070083 UNKNOWN_PANEL
84};
85
86uint32_t panel_regulator_settings[] = {
87 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
88};
89
90/*
91 * The list of panels that are supported on this target.
92 * Any panel in this list can be selected using fastboot oem command.
93 */
94static struct panel_list supp_panels[] = {
95 {"truly_1080p_video", TRULY_1080P_VIDEO_PANEL},
Jayant Shekhar9ea8dcd2015-04-20 15:18:37 +053096 {"truly_1080p_cmd", TRULY_1080P_CMD_PANEL},
Vishnuvardhan Prodduturi16eb20f2015-06-05 18:03:54 +053097 {"sharp_1080p_cmd", SHARP_1080P_CMD_PANEL},
Padmanabhan Komanduru49a86cf2015-06-08 18:24:30 +053098 {"nt35597_wqxga_dualdsi_video", NT35597_WQXGA_DUALDSI_VIDEO_PANEL},
Vishnuvardhan Prodduturic1a46c52015-06-29 16:35:23 +053099 {"nt35597_wqxga_dualdsi_cmd", NT35597_WQXGA_DUALDSI_CMD_PANEL},
Ray Zhangf95f5b92015-06-25 15:34:29 +0800100 {"otm1906c_1080p_cmd", OTM1906C_1080P_CMD_PANEL},
101 {"hx8399a_1080p_video", HX8399A_1080P_VIDEO_PANEL},
Sandeep Pandaed082922015-08-03 12:18:25 +0530102 {"nt35597_wqxga_dsc_video", NT35597_WQXGA_DSC_VIDEO_PANEL},
103 {"nt35597_wqxga_dsc_cmd", NT35597_WQXGA_DSC_CMD_PANEL},
Padmanabhan Komanduru4927c2c2015-08-21 14:55:16 +0530104 {"hx8394d_720p_video", HX8394D_720P_VIDEO_PANEL},
Sujeev Dias6bc9fa32015-08-03 23:13:44 -0700105 {"byd_1200p_video", BYD_1200P_VIDEO_PANEL},
Ray Zhang4bbc7b02015-12-04 16:07:20 +0800106 {"r69006_1080p_cmd",R69006_1080P_CMD_PANEL},
107 {"r69006_1080p_video",R69006_1080P_VIDEO_PANEL},
Padmanabhan Komandurue108ed02015-12-21 12:43:07 +0530108 {"hx8394f_720p_video", HX8394F_720P_VIDEO_PANEL},
109 {"truly_720p_video", TRULY_720P_VIDEO_PANEL}
Padmanabhan Komanduru9d49f892015-04-10 12:58:46 -0700110};
111
112static uint32_t panel_id;
113
Sandeep Panda75fddaa2015-07-06 11:38:25 +0530114#define TRULY_1080P_PANEL_ON_DELAY 40
Sandeep Pandac797d542015-06-12 14:37:55 +0530115
Padmanabhan Komanduru9d49f892015-04-10 12:58:46 -0700116int oem_panel_rotation()
117{
118 return NO_ERROR;
119}
120
121int oem_panel_on()
122{
123 /*
124 *OEM can keep their panel specific on instructions in this
125 *function
feifanz525046b2015-06-01 20:31:06 +0800126 */
127 if (panel_id == OTM1906C_1080P_CMD_PANEL) {
128 /* needs extra delay to avoid unexpected artifacts */
129 mdelay(OTM1906C_1080P_CMD_PANEL_ON_DELAY);
Sandeep Panda75fddaa2015-07-06 11:38:25 +0530130 } else if (panel_id == TRULY_1080P_CMD_PANEL ||
131 panel_id == TRULY_1080P_VIDEO_PANEL) {
132 mdelay(TRULY_1080P_PANEL_ON_DELAY);
Ray Zhang6ec437c2015-12-04 16:08:08 +0800133 }else if (panel_id == R69006_1080P_CMD_PANEL) {
134 mdelay(R69006_1080P_CMD_PANEL_ON_DELAY);
feifanz525046b2015-06-01 20:31:06 +0800135 }
Sandeep Pandac797d542015-06-12 14:37:55 +0530136
Padmanabhan Komanduru9d49f892015-04-10 12:58:46 -0700137 return NO_ERROR;
138}
139
140int oem_panel_off()
141{
142 /* OEM can keep their panel specific off instructions
143 * in this function
144 */
145 return NO_ERROR;
146}
147
148static int init_panel_data(struct panel_struct *panelstruct,
149 struct msm_panel_info *pinfo,
150 struct mdss_dsi_phy_ctrl *phy_db)
151{
152 int pan_type = PANEL_TYPE_DSI;
Ujwal Patel41a665a2015-07-17 13:51:30 -0700153 struct oem_panel_data *oem_data = mdss_dsi_get_oem_data_ptr();
Padmanabhan Komanduru9d49f892015-04-10 12:58:46 -0700154
155 switch (panel_id) {
156 case TRULY_1080P_VIDEO_PANEL:
157 panelstruct->paneldata = &truly_1080p_video_panel_data;
158 panelstruct->paneldata->panel_with_enable_gpio = 1;
159 panelstruct->panelres = &truly_1080p_video_panel_res;
160 panelstruct->color = &truly_1080p_video_color;
161 panelstruct->videopanel = &truly_1080p_video_video_panel;
162 panelstruct->commandpanel = &truly_1080p_video_command_panel;
163 panelstruct->state = &truly_1080p_video_state;
164 panelstruct->laneconfig = &truly_1080p_video_lane_config;
165 panelstruct->paneltiminginfo
166 = &truly_1080p_video_timing_info;
167 panelstruct->panelresetseq
168 = &truly_1080p_video_panel_reset_seq;
169 panelstruct->backlightinfo = &truly_1080p_video_backlight;
170 pinfo->mipi.panel_on_cmds
171 = truly_1080p_video_on_command;
172 pinfo->mipi.num_of_panel_on_cmds
173 = TRULY_1080P_VIDEO_ON_COMMAND;
174 pinfo->mipi.panel_off_cmds
175 = truly_1080p_video_off_command;
176 pinfo->mipi.num_of_panel_off_cmds
177 = TRULY_1080P_VIDEO_OFF_COMMAND;
178 memcpy(phy_db->timing,
179 truly_1080p_video_timings, TIMING_SIZE);
180 pinfo->mipi.signature = TRULY_1080P_VIDEO_SIGNATURE;
181 break;
Jayant Shekhar9ea8dcd2015-04-20 15:18:37 +0530182 case TRULY_1080P_CMD_PANEL:
183 panelstruct->paneldata = &truly_1080p_cmd_panel_data;
184 panelstruct->paneldata->panel_with_enable_gpio = 1;
185 panelstruct->panelres = &truly_1080p_cmd_panel_res;
186 panelstruct->color = &truly_1080p_cmd_color;
187 panelstruct->videopanel = &truly_1080p_cmd_video_panel;
188 panelstruct->commandpanel = &truly_1080p_cmd_command_panel;
189 panelstruct->state = &truly_1080p_cmd_state;
190 panelstruct->laneconfig = &truly_1080p_cmd_lane_config;
191 panelstruct->paneltiminginfo
192 = &truly_1080p_cmd_timing_info;
193 panelstruct->panelresetseq
194 = &truly_1080p_cmd_panel_reset_seq;
195 panelstruct->backlightinfo = &truly_1080p_cmd_backlight;
196 pinfo->mipi.panel_on_cmds
197 = truly_1080p_cmd_on_command;
198 pinfo->mipi.num_of_panel_on_cmds
199 = TRULY_1080P_CMD_ON_COMMAND;
200 pinfo->mipi.panel_off_cmds
201 = truly_1080p_cmd_off_command;
202 pinfo->mipi.num_of_panel_off_cmds
203 = TRULY_1080P_CMD_OFF_COMMAND;
204 memcpy(phy_db->timing,
205 truly_1080p_cmd_timings, TIMING_SIZE);
206 pinfo->mipi.signature = TRULY_1080P_CMD_SIGNATURE;
207 break;
feifanz174c82c2015-04-15 18:57:07 +0800208 case OTM1906C_1080P_CMD_PANEL:
209 panelstruct->paneldata = &otm1906c_1080p_cmd_panel_data;
210 panelstruct->paneldata->panel_with_enable_gpio = 1;
211 panelstruct->panelres = &otm1906c_1080p_cmd_panel_res;
212 panelstruct->color = &otm1906c_1080p_cmd_color;
213 panelstruct->videopanel = &otm1906c_1080p_cmd_video_panel;
214 panelstruct->commandpanel = &otm1906c_1080p_cmd_command_panel;
215 panelstruct->state = &otm1906c_1080p_cmd_state;
216 panelstruct->laneconfig = &otm1906c_1080p_cmd_lane_config;
217 panelstruct->paneltiminginfo
218 = &otm1906c_1080p_cmd_timing_info;
219 panelstruct->panelresetseq
220 = &otm1906c_1080p_cmd_panel_reset_seq;
221 panelstruct->backlightinfo = &otm1906c_1080p_cmd_backlight;
222 pinfo->mipi.panel_on_cmds
223 = otm1906c_1080p_cmd_on_command;
224 pinfo->mipi.num_of_panel_on_cmds
225 = OTM1906C_1080P_CMD_ON_COMMAND;
226 pinfo->mipi.panel_off_cmds
227 = otm1906c_1080p_cmd_off_command;
228 pinfo->mipi.num_of_panel_off_cmds
229 = OTM1906C_1080P_CMD_OFF_COMMAND;
230 memcpy(phy_db->timing,
231 otm1906c_1080p_cmd_timings, TIMING_SIZE);
232 pinfo->mipi.signature = OTM1906C_1080P_CMD_SIGNATURE;
233 break;
Ray Zhangf95f5b92015-06-25 15:34:29 +0800234 case HX8399A_1080P_VIDEO_PANEL:
235 panelstruct->paneldata = &hx8399a_1080p_video_panel_data;
236 panelstruct->panelres = &hx8399a_1080p_video_panel_res;
237 panelstruct->color = &hx8399a_1080p_video_color;
238 panelstruct->videopanel = &hx8399a_1080p_video_video_panel;
239 panelstruct->commandpanel = &hx8399a_1080p_video_command_panel;
240 panelstruct->state = &hx8399a_1080p_video_state;
241 panelstruct->laneconfig = &hx8399a_1080p_video_lane_config;
242 panelstruct->paneltiminginfo
243 = &hx8399a_1080p_video_timing_info;
244 panelstruct->panelresetseq
245 = &hx8399a_1080p_video_reset_seq;
246 panelstruct->backlightinfo = &hx8399a_1080p_video_backlight;
247 pinfo->mipi.panel_on_cmds
248 = hx8399a_1080p_video_on_command;
249 pinfo->mipi.num_of_panel_on_cmds
250 = HX8399A_1080P_VIDEO_ON_COMMAND;
251 pinfo->mipi.panel_off_cmds
252 = hx8399a_1080p_video_off_command;
253 pinfo->mipi.num_of_panel_off_cmds
254 = HX8399A_1080P_VIDEO_OFF_COMMAND;
255 memcpy(phy_db->timing,
256 hx8399a_1080p_video_timings, TIMING_SIZE);
257 pinfo->mipi.signature = HX8399A_1080P_VIDEO_SIGNATURE;
258 break;
Vishnuvardhan Prodduturi16eb20f2015-06-05 18:03:54 +0530259 case SHARP_1080P_CMD_PANEL:
260 panelstruct->paneldata = &sharp_1080p_cmd_panel_data;
261 panelstruct->panelres = &sharp_1080p_cmd_panel_res;
262 panelstruct->paneldata->panel_with_enable_gpio = 1;
263 panelstruct->color = &sharp_1080p_cmd_color;
264 panelstruct->videopanel = &sharp_1080p_cmd_video_panel;
265 panelstruct->commandpanel = &sharp_1080p_cmd_command_panel;
266 panelstruct->state = &sharp_1080p_cmd_state;
267 panelstruct->laneconfig = &sharp_1080p_cmd_lane_config;
268 panelstruct->paneltiminginfo
269 = &sharp_1080p_cmd_timing_info;
270 panelstruct->panelresetseq
271 = &sharp_1080p_cmd_panel_reset_seq;
272 panelstruct->backlightinfo = &sharp_1080p_cmd_backlight;
273 pinfo->mipi.panel_on_cmds
274 = sharp_1080p_cmd_on_command;
275 pinfo->mipi.num_of_panel_on_cmds
276 = SHARP_1080P_CMD_ON_COMMAND;
277 pinfo->mipi.panel_off_cmds
278 = sharp_1080p_cmd_off_command;
279 pinfo->mipi.num_of_panel_off_cmds
280 = SHARP_1080P_CMD_OFF_COMMAND;
281 memcpy(phy_db->timing,
282 sharp_1080p_cmd_timings, TIMING_SIZE);
283 break;
Padmanabhan Komanduru49a86cf2015-06-08 18:24:30 +0530284 case NT35597_WQXGA_DUALDSI_VIDEO_PANEL:
285 panelstruct->paneldata = &nt35597_wqxga_dualdsi_video_panel_data;
286 panelstruct->paneldata->panel_operating_mode = DST_SPLIT_FLAG |
287 SPLIT_DISPLAY_FLAG | DUAL_DSI_FLAG;
288 panelstruct->paneldata->panel_with_enable_gpio = 0;
289
290 panelstruct->panelres = &nt35597_wqxga_dualdsi_video_panel_res;
291 panelstruct->color = &nt35597_wqxga_dualdsi_video_color;
292 panelstruct->videopanel = &nt35597_wqxga_dualdsi_video_video_panel;
293 panelstruct->commandpanel = &nt35597_wqxga_dualdsi_video_command_panel;
294 panelstruct->state = &nt35597_wqxga_dualdsi_video_state;
295 panelstruct->laneconfig = &nt35597_wqxga_dualdsi_video_lane_config;
296 panelstruct->paneltiminginfo
297 = &nt35597_wqxga_dualdsi_video_timing_info;
298 panelstruct->panelresetseq
299 = &nt35597_wqxga_dualdsi_video_reset_seq;
300 panelstruct->backlightinfo = &nt35597_wqxga_dualdsi_video_backlight;
301 pinfo->labibb = &nt35597_wqxga_dualdsi_video_labibb;
302
303 pinfo->mipi.panel_on_cmds
304 = nt35597_wqxga_dualdsi_video_on_command;
305 pinfo->mipi.num_of_panel_on_cmds
306 = NT35597_WQXGA_DUALDSI_VIDEO_ON_COMMAND;
307 pinfo->mipi.panel_off_cmds
308 = nt35597_wqxga_dualdsi_video_off_command;
309 pinfo->mipi.num_of_panel_off_cmds
310 = NT35597_WQXGA_DUALDSI_VIDEO_OFF_COMMAND;
311 memcpy(phy_db->timing, nt35597_wqxga_dualdsi_video_timings,
312 TIMING_SIZE);
313 pinfo->mipi.tx_eot_append = true;
314 break;
Vishnuvardhan Prodduturic1a46c52015-06-29 16:35:23 +0530315 case NT35597_WQXGA_DUALDSI_CMD_PANEL:
316 panelstruct->paneldata = &nt35597_wqxga_dualdsi_cmd_panel_data;
317 panelstruct->paneldata->panel_operating_mode = DST_SPLIT_FLAG |
318 SPLIT_DISPLAY_FLAG | DUAL_DSI_FLAG;
319 panelstruct->paneldata->panel_with_enable_gpio = 0;
320
321 panelstruct->panelres = &nt35597_wqxga_dualdsi_cmd_panel_res;
322 panelstruct->color = &nt35597_wqxga_dualdsi_cmd_color;
323 panelstruct->videopanel = &nt35597_wqxga_dualdsi_cmd_video_panel;
324 panelstruct->commandpanel = &nt35597_wqxga_dualdsi_cmd_command_panel;
325 panelstruct->state = &nt35597_wqxga_dualdsi_cmd_state;
326 panelstruct->laneconfig = &nt35597_wqxga_dualdsi_cmd_lane_config;
327 panelstruct->paneltiminginfo
328 = &nt35597_wqxga_dualdsi_cmd_timing_info;
Padmanabhan Komanduru58fc57e2015-07-07 21:36:14 +0530329 /* Clkout timings are different for this panel on 8956 */
330 panelstruct->paneltiminginfo->tclk_post = 0x2b;
331 panelstruct->paneltiminginfo->tclk_pre = 0x28;
Vishnuvardhan Prodduturic1a46c52015-06-29 16:35:23 +0530332 panelstruct->panelresetseq
333 = &nt35597_wqxga_dualdsi_cmd_reset_seq;
334 panelstruct->backlightinfo = &nt35597_wqxga_dualdsi_cmd_backlight;
335
336 pinfo->labibb = &nt35597_wqxga_dualdsi_cmd_labibb;
337
338 pinfo->mipi.panel_on_cmds
339 = nt35597_wqxga_dualdsi_cmd_on_command;
340 pinfo->mipi.num_of_panel_on_cmds
341 = NT35597_WQXGA_DUALDSI_CMD_ON_COMMAND;
342 pinfo->mipi.panel_off_cmds
343 = nt35597_wqxga_dualdsi_cmd_off_command;
344 pinfo->mipi.num_of_panel_off_cmds
345 = NT35597_WQXGA_DUALDSI_CMD_OFF_COMMAND;
346 memcpy(phy_db->timing, nt35597_wqxga_dualdsi_cmd_timings,
347 TIMING_SIZE);
348 pinfo->mipi.tx_eot_append = true;
349 break;
Sandeep Pandaed082922015-08-03 12:18:25 +0530350 case NT35597_WQXGA_DSC_VIDEO_PANEL:
351 panelstruct->paneldata = &nt35597_wqxga_dsc_video_panel_data;
352 panelstruct->paneldata->panel_with_enable_gpio = 0;
353 panelstruct->paneldata->panel_operating_mode = USE_DSI1_PLL_FLAG;
354 panelstruct->panelres = &nt35597_wqxga_dsc_video_panel_res;
355 panelstruct->color = &nt35597_wqxga_dsc_video_color;
356 panelstruct->videopanel = &nt35597_wqxga_dsc_video_video_panel;
357 panelstruct->commandpanel = &nt35597_wqxga_dsc_video_command_panel;
358 panelstruct->state = &nt35597_wqxga_dsc_video_state;
359 panelstruct->laneconfig = &nt35597_wqxga_dsc_video_lane_config;
360 panelstruct->paneltiminginfo
361 = &nt35597_wqxga_dsc_video_timing_info;
362 panelstruct->panelresetseq
363 = &nt35597_wqxga_dsc_video_reset_seq;
364 panelstruct->backlightinfo = &nt35597_wqxga_dsc_video_backlight;
365 pinfo->labibb = &nt35597_wqxga_dsc_video_labibb;
366
367 pinfo->mipi.panel_on_cmds
368 = nt35597_wqxga_dsc_video_on_command;
369 pinfo->mipi.num_of_panel_on_cmds
370 = NT35597_WQXGA_DSC_VIDEO_ON_COMMAND;
371 pinfo->mipi.panel_off_cmds
372 = nt35597_wqxga_dsc_video_off_command;
373 pinfo->mipi.num_of_panel_off_cmds
374 = NT35597_WQXGA_DSC_VIDEO_OFF_COMMAND;
375 memcpy(phy_db->timing, nt35597_wqxga_dsc_video_timings,
376 TIMING_SIZE);
377 /* Clkout timings are different for this panel on 8956 */
378 panelstruct->paneltiminginfo->tclk_post = 0x04;
379 panelstruct->paneltiminginfo->tclk_pre = 0x20;
380 pinfo->mipi.tx_eot_append = true;
Ujwal Patel41a665a2015-07-17 13:51:30 -0700381
382 panelstruct->paneldata->panel_operating_mode &= ~DUAL_PIPE_FLAG;
383 panelstruct->config = &nt35597_wqxga_dsc_video_config0;
384 if (oem_data) {
385 switch (oem_data->cfg_num[0]) {
386 case -1: /* default */
387 case 0:
388 panelstruct->config =
389 &nt35597_wqxga_dsc_video_config0;
390 break;
391 default:
392 dprintf(CRITICAL, "topology config%d not supported. fallback to default config0\n",
393 oem_data->cfg_num[0]);
394 panelstruct->config = &nt35597_wqxga_dsc_video_config0;
395 }
396 }
397 pinfo->lm_split[0] = panelstruct->config->lm_split[0];
398 pinfo->lm_split[1] = panelstruct->config->lm_split[1];
399 pinfo->num_dsc_enc = panelstruct->config->num_dsc_enc;
Sandeep Pandaed082922015-08-03 12:18:25 +0530400 pinfo->compression_mode = COMPRESSION_DSC;
Ujwal Patel41a665a2015-07-17 13:51:30 -0700401
Sandeep Pandaed082922015-08-03 12:18:25 +0530402 pinfo->dsc.parameter_calc = mdss_dsc_parameters_calc;
403 pinfo->dsc.dsc2buf = mdss_dsc_to_buf;
404 pinfo->dsc.dsi_dsc_config = mdss_dsc_dsi_config;
405 pinfo->dsc.mdp_dsc_config = mdss_dsc_mdp_config;
406 break;
407 case NT35597_WQXGA_DSC_CMD_PANEL:
408 panelstruct->paneldata = &nt35597_wqxga_dsc_cmd_panel_data;
409 panelstruct->paneldata->panel_with_enable_gpio = 0;
410 panelstruct->paneldata->panel_operating_mode = USE_DSI1_PLL_FLAG;
411 panelstruct->panelres = &nt35597_wqxga_dsc_cmd_panel_res;
412 panelstruct->color = &nt35597_wqxga_dsc_cmd_color;
413 panelstruct->videopanel = &nt35597_wqxga_dsc_cmd_video_panel;
414 panelstruct->commandpanel = &nt35597_wqxga_dsc_cmd_command_panel;
415 panelstruct->state = &nt35597_wqxga_dsc_cmd_state;
416 panelstruct->laneconfig = &nt35597_wqxga_dsc_cmd_lane_config;
417 panelstruct->paneltiminginfo
418 = &nt35597_wqxga_dsc_cmd_timing_info;
419 panelstruct->panelresetseq
420 = &nt35597_wqxga_dsc_cmd_reset_seq;
421 panelstruct->backlightinfo = &nt35597_wqxga_dsc_cmd_backlight;
422 pinfo->labibb = &nt35597_wqxga_dsc_cmd_labibb;
423
424 pinfo->mipi.panel_on_cmds
425 = nt35597_wqxga_dsc_cmd_on_command;
426 pinfo->mipi.num_of_panel_on_cmds
427 = NT35597_WQXGA_DSC_CMD_ON_COMMAND;
428 pinfo->mipi.panel_off_cmds
429 = nt35597_wqxga_dsc_cmd_off_command;
430 pinfo->mipi.num_of_panel_off_cmds
431 = NT35597_WQXGA_DSC_CMD_OFF_COMMAND;
432 memcpy(phy_db->timing, nt35597_wqxga_dsc_cmd_timings,
433 TIMING_SIZE);
434 /* Clkout timings are different for this panel on 8956 */
435 panelstruct->paneltiminginfo->tclk_post = 0x04;
436 panelstruct->paneltiminginfo->tclk_pre = 0x20;
437 pinfo->mipi.tx_eot_append = true;
Ujwal Patel41a665a2015-07-17 13:51:30 -0700438
439 panelstruct->paneldata->panel_operating_mode &= ~DUAL_PIPE_FLAG;
440 panelstruct->config = &nt35597_wqxga_dsc_cmd_config0;
441 if (oem_data) {
442 switch (oem_data->cfg_num[0]) {
443 case -1: /* default */
444 case 0:
445 panelstruct->config =
446 &nt35597_wqxga_dsc_cmd_config0;
447 break;
448 default:
449 dprintf(CRITICAL, "topology config%d not supported. fallback to default config0\n",
450 oem_data->cfg_num[0]);
451 panelstruct->config = &nt35597_wqxga_dsc_cmd_config0;
452 }
453 }
454 pinfo->lm_split[0] = panelstruct->config->lm_split[0];
455 pinfo->lm_split[1] = panelstruct->config->lm_split[1];
456 pinfo->num_dsc_enc = panelstruct->config->num_dsc_enc;
Sandeep Pandaed082922015-08-03 12:18:25 +0530457 pinfo->compression_mode = COMPRESSION_DSC;
Ujwal Patel41a665a2015-07-17 13:51:30 -0700458
Sandeep Pandaed082922015-08-03 12:18:25 +0530459 pinfo->dsc.parameter_calc = mdss_dsc_parameters_calc;
460 pinfo->dsc.dsc2buf = mdss_dsc_to_buf;
461 pinfo->dsc.dsi_dsc_config = mdss_dsc_dsi_config;
462 pinfo->dsc.mdp_dsc_config = mdss_dsc_mdp_config;
463 break;
Padmanabhan Komanduru4927c2c2015-08-21 14:55:16 +0530464 case HX8394D_720P_VIDEO_PANEL:
465 panelstruct->paneldata = &hx8394d_720p_video_panel_data;
466 panelstruct->panelres = &hx8394d_720p_video_panel_res;
467 panelstruct->color = &hx8394d_720p_video_color;
468 panelstruct->videopanel = &hx8394d_720p_video_video_panel;
469 panelstruct->commandpanel = &hx8394d_720p_video_command_panel;
470 panelstruct->state = &hx8394d_720p_video_state;
471 panelstruct->laneconfig = &hx8394d_720p_video_lane_config;
472 panelstruct->paneltiminginfo
473 = &hx8394d_720p_video_timing_info;
474 panelstruct->panelresetseq
475 = &hx8394d_720p_video_panel_reset_seq;
476 panelstruct->backlightinfo = &hx8394d_720p_video_backlight;
477 pinfo->mipi.panel_on_cmds
478 = hx8394d_720p_video_on_command;
479 pinfo->mipi.num_of_panel_on_cmds
480 = HX8394D_720P_VIDEO_ON_COMMAND;
481 pinfo->mipi.panel_off_cmds
482 = hx8394d_720p_video_off_command;
483 pinfo->mipi.num_of_panel_off_cmds
484 = HX8394D_720P_VIDEO_OFF_COMMAND;
485 memcpy(phy_db->timing,
486 hx8394d_720p_video_timings, TIMING_SIZE);
487 pinfo->mipi.signature = HX8394D_720P_VIDEO_SIGNATURE;
488 break;
Ray Zhang4bbc7b02015-12-04 16:07:20 +0800489 case R69006_1080P_CMD_PANEL:
490 panelstruct->paneldata = &r69006_1080p_cmd_panel_data;
491 panelstruct->panelres = &r69006_1080p_cmd_panel_res;
492 panelstruct->color = &r69006_1080p_cmd_color;
493 panelstruct->videopanel = &r69006_1080p_cmd_video_panel;
494 panelstruct->commandpanel = &r69006_1080p_cmd_command_panel;
495 panelstruct->state = &r69006_1080p_cmd_state;
496 panelstruct->laneconfig = &r69006_1080p_cmd_lane_config;
497 panelstruct->paneltiminginfo
498 = &r69006_1080p_cmd_timing_info;
499 panelstruct->panelresetseq
500 = &r69006_1080p_cmd_reset_seq;
501 panelstruct->backlightinfo = &r69006_1080p_cmd_backlight;
Ray Zhange9e3b692015-12-18 18:03:30 +0800502 pinfo->labibb = &r69006_1080p_cmd_labibb;
Ray Zhang4bbc7b02015-12-04 16:07:20 +0800503 pinfo->mipi.panel_on_cmds
504 = r69006_1080p_cmd_on_command;
505 pinfo->mipi.num_of_panel_on_cmds
506 = R69006_1080P_CMD_ON_COMMAND;
507 pinfo->mipi.panel_off_cmds
508 = r69006_1080p_cmd_off_command;
509 pinfo->mipi.num_of_panel_off_cmds
510 = R69006_1080P_CMD_OFF_COMMAND;
511 memcpy(phy_db->timing,
512 r69006_1080p_cmd_timings, TIMING_SIZE);
513 pinfo->mipi.signature = R69006_1080P_CMD_SIGNATURE;
Ray Zhangc8fd3632015-12-23 14:01:13 +0800514 pinfo->mipi.tx_eot_append = true;
515 pinfo->mipi.rx_eot_ignore = true;
Ray Zhang4bbc7b02015-12-04 16:07:20 +0800516 break;
517 case R69006_1080P_VIDEO_PANEL:
518 panelstruct->paneldata = &r69006_1080p_video_panel_data;
519 panelstruct->panelres = &r69006_1080p_video_panel_res;
520 panelstruct->color = &r69006_1080p_video_color;
521 panelstruct->videopanel = &r69006_1080p_video_video_panel;
522 panelstruct->commandpanel = &r69006_1080p_video_command_panel;
523 panelstruct->state = &r69006_1080p_video_state;
524 panelstruct->laneconfig = &r69006_1080p_video_lane_config;
525 panelstruct->paneltiminginfo
526 = &r69006_1080p_video_timing_info;
527 panelstruct->panelresetseq
528 = &r69006_1080p_video_reset_seq;
529 panelstruct->backlightinfo = &r69006_1080p_video_backlight;
Ray Zhange9e3b692015-12-18 18:03:30 +0800530 pinfo->labibb = &r69006_1080p_video_labibb;
Ray Zhang4bbc7b02015-12-04 16:07:20 +0800531 pinfo->mipi.panel_on_cmds
532 = r69006_1080p_video_on_command;
533 pinfo->mipi.num_of_panel_on_cmds
534 = R69006_1080P_VIDEO_ON_COMMAND;
535 pinfo->mipi.panel_off_cmds
536 = r69006_1080p_video_off_command;
537 pinfo->mipi.num_of_panel_off_cmds
538 = R69006_1080P_VIDEO_OFF_COMMAND;
539 memcpy(phy_db->timing,
540 r69006_1080p_video_timings, TIMING_SIZE);
541 pinfo->mipi.signature = R69006_1080P_VIDEO_SIGNATURE;
542 break;
543 case HX8394F_720P_VIDEO_PANEL:
544 panelstruct->paneldata = &hx8394f_720p_video_panel_data;
545 panelstruct->panelres = &hx8394f_720p_video_panel_res;
546 panelstruct->color = &hx8394f_720p_video_color;
547 panelstruct->videopanel = &hx8394f_720p_video_video_panel;
548 panelstruct->commandpanel = &hx8394f_720p_video_command_panel;
549 panelstruct->state = &hx8394f_720p_video_state;
550 panelstruct->laneconfig = &hx8394f_720p_video_lane_config;
551 panelstruct->paneltiminginfo
552 = &hx8394f_720p_video_timing_info;
553 panelstruct->panelresetseq
554 = &hx8394f_720p_video_reset_seq;
555 panelstruct->backlightinfo = &hx8394f_720p_video_backlight;
556 pinfo->mipi.panel_on_cmds
557 = hx8394f_720p_video_on_command;
558 pinfo->mipi.num_of_panel_on_cmds
559 = HX8394F_720P_VIDEO_ON_COMMAND;
560 pinfo->mipi.panel_off_cmds
561 = hx8394f_720p_video_off_command;
562 pinfo->mipi.num_of_panel_off_cmds
563 = HX8394F_720P_VIDEO_OFF_COMMAND;
564 memcpy(phy_db->timing,
565 hx8394f_720p_video_timings, TIMING_SIZE);
566 pinfo->mipi.signature = HX8394F_720P_VIDEO_SIGNATURE;
567 break;
Sujeev Dias6bc9fa32015-08-03 23:13:44 -0700568 case BYD_1200P_VIDEO_PANEL:
569 panelstruct->paneldata = &byd_1200p_video_panel_data;
570 panelstruct->paneldata->panel_with_enable_gpio = 1;
571 panelstruct->panelres = &byd_1200p_video_panel_res;
572 panelstruct->color = &byd_1200p_video_color;
573 panelstruct->videopanel = &byd_1200p_video_video_panel;
574 panelstruct->commandpanel = &byd_1200p_video_command_panel;
575 panelstruct->state = &byd_1200p_video_state;
576 panelstruct->laneconfig = &byd_1200p_video_lane_config;
577 panelstruct->paneltiminginfo
578 = &byd_1200p_video_timing_info;
579 panelstruct->panelresetseq
580 = &byd_1200p_video_panel_reset_seq;
581 panelstruct->backlightinfo = &byd_1200p_video_backlight;
582 pinfo->mipi.panel_on_cmds
583 = byd_1200p_video_on_command;
584 pinfo->mipi.num_of_panel_on_cmds
585 = BYD_1200P_VIDEO_ON_COMMAND;
586 pinfo->mipi.panel_off_cmds
587 = byd_1200p_video_off_command;
588 pinfo->mipi.num_of_panel_off_cmds
589 = BYD_1200P_VIDEO_OFF_COMMAND;
590 memcpy(phy_db->timing,
591 byd_1200p_video_timings, TIMING_SIZE);
592 pinfo->mipi.signature = BYD_1200P_VIDEO_SIGNATURE;
593 phy_db->regulator_mode = DSI_PHY_REGULATOR_LDO_MODE;
594 break;
Padmanabhan Komandurue108ed02015-12-21 12:43:07 +0530595 case TRULY_720P_VIDEO_PANEL:
596 panelstruct->paneldata = &truly_720p_video_panel_data;
597 panelstruct->paneldata->panel_with_enable_gpio = 1;
598 panelstruct->panelres = &truly_720p_video_panel_res;
599 panelstruct->color = &truly_720p_video_color;
600 panelstruct->videopanel = &truly_720p_video_video_panel;
601 panelstruct->commandpanel = &truly_720p_video_command_panel;
602 panelstruct->state = &truly_720p_video_state;
603 panelstruct->laneconfig = &truly_720p_video_lane_config;
604 panelstruct->paneltiminginfo
605 = &truly_720p_video_timing_info;
606 panelstruct->panelresetseq
607 = &truly_720p_video_panel_reset_seq;
608 panelstruct->backlightinfo = &truly_720p_video_backlight;
609 pinfo->mipi.panel_on_cmds
610 = truly_720p_video_on_command;
611 pinfo->mipi.num_of_panel_on_cmds
612 = TRULY_720P_VIDEO_ON_COMMAND;
613 pinfo->mipi.panel_off_cmds
614 = truly_720p_video_off_command;
615 pinfo->mipi.num_of_panel_off_cmds
616 = TRULY_720P_VIDEO_OFF_COMMAND;
617 memcpy(phy_db->timing,
618 truly_720p_video_timings, TIMING_SIZE);
619 pinfo->mipi.signature = TRULY_720P_VIDEO_SIGNATURE;
620 pinfo->mipi.tx_eot_append = true;
621 break;
Padmanabhan Komanduru9d49f892015-04-10 12:58:46 -0700622 case UNKNOWN_PANEL:
623 default:
624 memset(panelstruct, 0, sizeof(struct panel_struct));
625 memset(pinfo->mipi.panel_on_cmds, 0,
626 sizeof(struct mipi_dsi_cmd));
627 pinfo->mipi.num_of_panel_on_cmds = 0;
628 memset(pinfo->mipi.panel_off_cmds, 0,
629 sizeof(struct mipi_dsi_cmd));
630 pinfo->mipi.num_of_panel_off_cmds = 0;
631 memset(phy_db->timing, 0, TIMING_SIZE);
632 pan_type = PANEL_TYPE_UNKNOWN;
633 break;
634 }
Ujwal Patel41a665a2015-07-17 13:51:30 -0700635
636 dprintf(SPEW, "lm_split[0]=%d lm_split[1]=%d mode=0x%x\n",
637 pinfo->lm_split[0], pinfo->lm_split[1],
638 panelstruct->paneldata->panel_operating_mode);
639
Padmanabhan Komanduru9d49f892015-04-10 12:58:46 -0700640 return pan_type;
641}
642
Ray Zhangf95f5b92015-06-25 15:34:29 +0800643#define DISPLAY_MAX_PANEL_DETECTION 2
644static uint32_t auto_pan_loop = 0;
645
646uint32_t oem_panel_max_auto_detect_panels()
647{
648 return target_panel_auto_detect_enabled() ?
649 DISPLAY_MAX_PANEL_DETECTION : 0;
650}
651
Padmanabhan Komanduru9d49f892015-04-10 12:58:46 -0700652int oem_panel_select(const char *panel_name, struct panel_struct *panelstruct,
653 struct msm_panel_info *pinfo,
654 struct mdss_dsi_phy_ctrl *phy_db)
655{
656 uint32_t hw_id = board_hardware_id();
Sujeev Dias6bc9fa32015-08-03 23:13:44 -0700657 uint32_t hw_subtype = board_hardware_subtype();
Padmanabhan Komanduru9d49f892015-04-10 12:58:46 -0700658 int32_t panel_override_id;
feifanz028544e2015-07-28 20:58:57 +0800659 uint32_t target_id, plat_hw_ver_major;
Padmanabhan Komanduru9d49f892015-04-10 12:58:46 -0700660
661 if (panel_name) {
662 panel_override_id = panel_name_to_id(supp_panels,
663 ARRAY_SIZE(supp_panels), panel_name);
664
665 if (panel_override_id < 0) {
666 dprintf(CRITICAL, "Not able to search the panel:%s\n",
Padmanabhan Komandurubccbcdc2015-06-30 16:19:24 +0530667 panel_name);
Padmanabhan Komanduru9d49f892015-04-10 12:58:46 -0700668 } else if (panel_override_id < UNKNOWN_PANEL) {
669 /* panel override using fastboot oem command */
670 panel_id = panel_override_id;
671
672 dprintf(INFO, "OEM panel override:%s\n",
Padmanabhan Komandurubccbcdc2015-06-30 16:19:24 +0530673 panel_name);
Padmanabhan Komanduru9d49f892015-04-10 12:58:46 -0700674 goto panel_init;
675 }
676 }
677
678 switch (hw_id) {
679 case HW_PLATFORM_MTP:
Padmanabhan Komanduru49a86cf2015-06-08 18:24:30 +0530680 if (platform_is_msm8956())
681 panel_id = NT35597_WQXGA_DUALDSI_VIDEO_PANEL;
Jayant Shekhar9c0533e2016-01-28 11:17:18 +0530682 else if (platform_is_msmgold())
683 panel_id = TRULY_720P_VIDEO_PANEL;
Padmanabhan Komanduru49a86cf2015-06-08 18:24:30 +0530684 else
685 panel_id = TRULY_1080P_VIDEO_PANEL;
Padmanabhan Komanduru9d49f892015-04-10 12:58:46 -0700686 break;
687 case HW_PLATFORM_SURF:
Vishnuvardhan Prodduturie116c002015-07-14 17:14:25 +0530688 case HW_PLATFORM_RCM:
Padmanabhan Komanduru49a86cf2015-06-08 18:24:30 +0530689 if (platform_is_msm8956())
690 panel_id = NT35597_WQXGA_DUALDSI_VIDEO_PANEL;
Jayant Shekhar9c0533e2016-01-28 11:17:18 +0530691 else if (platform_is_msmgold())
692 panel_id = TRULY_720P_VIDEO_PANEL;
Padmanabhan Komanduru49a86cf2015-06-08 18:24:30 +0530693 else
694 panel_id = TRULY_1080P_VIDEO_PANEL;
Padmanabhan Komanduru9d49f892015-04-10 12:58:46 -0700695 break;
feifanz174c82c2015-04-15 18:57:07 +0800696 case HW_PLATFORM_QRD:
Sujeev Dias6bc9fa32015-08-03 23:13:44 -0700697 if (hw_subtype == HW_PLATFORM_SUBTYPE_POLARIS) {
698 panel_id = BYD_1200P_VIDEO_PANEL;
699 break;
700 }
701
feifanz028544e2015-07-28 20:58:57 +0800702 target_id = board_target_id();
703 plat_hw_ver_major = ((target_id >> 16) & 0xFF);
704
705 /*
706 * 8952 SKUM DVT2 - HX8399A 1080p video panel
707 * 8952 SKUM EVT1/EVT2 - OTM1906C 1080p cmd panel
708 */
709 if (plat_hw_ver_major >= 4)
710 panel_id = HX8399A_1080P_VIDEO_PANEL;
711 else
712 panel_id = OTM1906C_1080P_CMD_PANEL;
Ray Zhangf95f5b92015-06-25 15:34:29 +0800713
Ray Zhang4bbc7b02015-12-04 16:07:20 +0800714 /* QRD 8937 SKU1 uses R69006, and SKU2 uses HX8399A */
715 if (platform_is_msm8937()){
716 if (plat_hw_ver_major > 16)
717 panel_id = HX8394F_720P_VIDEO_PANEL;
718 else
719 panel_id = R69006_1080P_CMD_PANEL;
720 }
721
722 /* QRD EVT1 uses OTM1906C, and EVT2 uses HX8394F */
Ray Zhangf95f5b92015-06-25 15:34:29 +0800723 if (platform_is_msm8956()) {
724 switch (auto_pan_loop) {
725 case 0:
726 panel_id = HX8399A_1080P_VIDEO_PANEL;
727 break;
728 case 1:
729 panel_id = OTM1906C_1080P_CMD_PANEL;
730 break;
731 default:
732 panel_id = UNKNOWN_PANEL;
733 dprintf(CRITICAL, "Unknown panel\n");
734 return PANEL_TYPE_UNKNOWN;
735 }
736 auto_pan_loop++;
737 }
738
feifanz174c82c2015-04-15 18:57:07 +0800739 break;
Padmanabhan Komanduru9d49f892015-04-10 12:58:46 -0700740 default:
741 dprintf(CRITICAL, "Display not enabled for %d HW type\n",
742 hw_id);
743 return PANEL_TYPE_UNKNOWN;
744 }
745
746panel_init:
747 /*
748 * Update all data structures after 'panel_init' label. Only panel
749 * selection is supposed to happen before that.
750 */
Padmanabhan Komanduru0e19a362015-06-08 13:29:32 +0530751 if (platform_is_msm8956())
752 memcpy(panel_regulator_settings,
753 dcdc_regulator_settings_hpm, REGULATOR_SIZE);
754 else
755 memcpy(panel_regulator_settings,
756 dcdc_regulator_settings_lpm, REGULATOR_SIZE);
Padmanabhan Komanduru9d49f892015-04-10 12:58:46 -0700757 pinfo->pipe_type = MDSS_MDP_PIPE_TYPE_RGB;
758 return init_panel_data(panelstruct, pinfo, phy_db);
759}