blob: b1eac2c688e94c14fa31659598c463800cb5abc2 [file] [log] [blame]
Lei Chen84755442017-11-28 18:28:15 +08001/* Copyright (c) 2016,2018, The Linux Foundation. All rights reserved.
Padmanabhan Komanduru0104a892016-01-22 16:58:10 +05302 *
3 * Redistribution and use in source and binary forms, with or without
4 * modification, are permitted provided that the following conditions are
5 * 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
9 * copyright notice, this list of conditions and the following
10 * disclaimer in the documentation and/or other materials provided
11 * with the 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 "AS IS" AND ANY EXPRESS OR IMPLIED
17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
20 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
23 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
25 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
26 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 *
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>
36#include <qtimer.h>
37#include <mipi_dsi.h>
38#include <mdp5.h>
39#include <target/display.h>
40
41#include "gcdb_display.h"
42#include "include/panel.h"
43#include "panel_display.h"
44
45/*---------------------------------------------------------------------------*/
46/* GCDB Panel Database */
47/*---------------------------------------------------------------------------*/
48#include "include/panel_truly_1080p_video.h"
49#include "include/panel_truly_1080p_cmd.h"
Mao Flynn5ecc8c92016-01-29 14:06:10 +080050#include "include/panel_r69006_1080p_video.h"
51#include "include/panel_r69006_1080p_cmd.h"
Padmanabhan Komanduru52567fb2016-02-03 16:03:13 +053052#include "include/panel_truly_wuxga_video.h"
Lei Chen84755442017-11-28 18:28:15 +080053#include "include/panel_hx8399c_fhd_pluse_video.h"
Ravikanth Tuniki1af05fd2018-06-29 18:07:59 +053054#include "include/panel_hx8399c_hd_plus_video.h"
Padmanabhan Komanduru0104a892016-01-22 16:58:10 +053055
56/*---------------------------------------------------------------------------*/
57/* static panel selection variable */
58/*---------------------------------------------------------------------------*/
59enum {
60 TRULY_1080P_VIDEO_PANEL,
61 TRULY_1080P_CMD_PANEL,
Mao Flynn5ecc8c92016-01-29 14:06:10 +080062 R69006_1080P_VIDEO_PANEL,
63 R69006_1080P_CMD_PANEL,
Padmanabhan Komanduru52567fb2016-02-03 16:03:13 +053064 TRULY_WUXGA_VIDEO_PANEL,
Lei Chen84755442017-11-28 18:28:15 +080065 HX8399C_FHD_PLUSE_VIDEO_PANEL,
Ravikanth Tuniki1af05fd2018-06-29 18:07:59 +053066 HX8399C_HD_PLUS_VIDEO_PANEL,
Padmanabhan Komanduru0104a892016-01-22 16:58:10 +053067 UNKNOWN_PANEL
68};
69
70/*
71 * The list of panels that are supported on this target.
72 * Any panel in this list can be selected using fastboot oem command.
73 */
74static struct panel_list supp_panels[] = {
75 {"truly_1080p_video", TRULY_1080P_VIDEO_PANEL},
76 {"truly_1080p_cmd", TRULY_1080P_CMD_PANEL},
Mao Flynn5ecc8c92016-01-29 14:06:10 +080077 {"r69006_1080p_video", R69006_1080P_VIDEO_PANEL},
78 {"r69006_1080p_cmd", R69006_1080P_CMD_PANEL},
Padmanabhan Komanduru52567fb2016-02-03 16:03:13 +053079 {"truly_wuxga_video", TRULY_WUXGA_VIDEO_PANEL},
Lei Chen84755442017-11-28 18:28:15 +080080 {"hx8399c_fhd_pluse_video", HX8399C_FHD_PLUSE_VIDEO_PANEL},
Ravikanth Tuniki1af05fd2018-06-29 18:07:59 +053081 {"hx8399c_hd_plus_video", HX8399C_HD_PLUS_VIDEO_PANEL},
Padmanabhan Komanduru0104a892016-01-22 16:58:10 +053082};
83
84static uint32_t panel_id;
85
86int oem_panel_rotation()
87{
88 return NO_ERROR;
89}
90
91#define TRULY_1080P_PANEL_ON_DELAY 40
92int oem_panel_on()
93{
94 if (panel_id == TRULY_1080P_CMD_PANEL ||
95 panel_id == TRULY_1080P_VIDEO_PANEL)
96 mdelay(TRULY_1080P_PANEL_ON_DELAY);
Mao Flynn5ecc8c92016-01-29 14:06:10 +080097 else if (panel_id == R69006_1080P_CMD_PANEL) {
98 mdelay(R69006_1080P_CMD_PANEL_ON_DELAY);
99 }
Padmanabhan Komanduru0104a892016-01-22 16:58:10 +0530100
101 return NO_ERROR;
102}
103
104int oem_panel_off()
105{
106 /* OEM can keep their panel specific off instructions
107 * in this function
108 */
109 return NO_ERROR;
110}
111
112static int init_panel_data(struct panel_struct *panelstruct,
113 struct msm_panel_info *pinfo,
114 struct mdss_dsi_phy_ctrl *phy_db)
115{
116 int pan_type = PANEL_TYPE_DSI;
117
118 switch (panel_id) {
119 case TRULY_1080P_VIDEO_PANEL:
120 panelstruct->paneldata = &truly_1080p_video_panel_data;
Padmanabhan Komanduruc2a81e92016-02-03 16:00:42 +0530121 panelstruct->paneldata->panel_with_enable_gpio = 0;
Padmanabhan Komanduru0104a892016-01-22 16:58:10 +0530122 panelstruct->panelres = &truly_1080p_video_panel_res;
123 panelstruct->color = &truly_1080p_video_color;
124 panelstruct->videopanel = &truly_1080p_video_video_panel;
125 panelstruct->commandpanel = &truly_1080p_video_command_panel;
126 panelstruct->state = &truly_1080p_video_state;
127 panelstruct->laneconfig = &truly_1080p_video_lane_config;
128 panelstruct->paneltiminginfo
129 = &truly_1080p_video_timing_info;
130 panelstruct->panelresetseq
131 = &truly_1080p_video_panel_reset_seq;
132 panelstruct->backlightinfo = &truly_1080p_video_backlight;
133 pinfo->mipi.panel_on_cmds
134 = truly_1080p_video_on_command;
135 pinfo->mipi.num_of_panel_on_cmds
136 = TRULY_1080P_VIDEO_ON_COMMAND;
137 pinfo->mipi.panel_off_cmds
138 = truly_1080p_video_off_command;
139 pinfo->mipi.num_of_panel_off_cmds
140 = TRULY_1080P_VIDEO_OFF_COMMAND;
141 memcpy(phy_db->timing,
142 truly_1080p_14nm_video_timings,
143 MAX_TIMING_CONFIG * sizeof(uint32_t));
Padmanabhan Komanduru6f0b6322016-01-22 16:37:53 +0530144 pinfo->dfps.panel_dfps = truly_1080p_video_dfps;
Padmanabhan Komanduru0104a892016-01-22 16:58:10 +0530145 pinfo->mipi.signature = TRULY_1080P_VIDEO_SIGNATURE;
146 break;
147 case TRULY_1080P_CMD_PANEL:
148 panelstruct->paneldata = &truly_1080p_cmd_panel_data;
Padmanabhan Komanduruc2a81e92016-02-03 16:00:42 +0530149 panelstruct->paneldata->panel_with_enable_gpio = 0;
Padmanabhan Komanduru0104a892016-01-22 16:58:10 +0530150 panelstruct->panelres = &truly_1080p_cmd_panel_res;
151 panelstruct->color = &truly_1080p_cmd_color;
152 panelstruct->videopanel = &truly_1080p_cmd_video_panel;
153 panelstruct->commandpanel = &truly_1080p_cmd_command_panel;
154 panelstruct->state = &truly_1080p_cmd_state;
155 panelstruct->laneconfig = &truly_1080p_cmd_lane_config;
156 panelstruct->paneltiminginfo
157 = &truly_1080p_cmd_timing_info;
158 panelstruct->panelresetseq
159 = &truly_1080p_cmd_panel_reset_seq;
160 panelstruct->backlightinfo = &truly_1080p_cmd_backlight;
161 pinfo->mipi.panel_on_cmds
162 = truly_1080p_cmd_on_command;
163 pinfo->mipi.num_of_panel_on_cmds
164 = TRULY_1080P_CMD_ON_COMMAND;
165 pinfo->mipi.panel_off_cmds
166 = truly_1080p_cmd_off_command;
167 pinfo->mipi.num_of_panel_off_cmds
168 = TRULY_1080P_CMD_OFF_COMMAND;
169 memcpy(phy_db->timing,
170 truly_1080p_14nm_cmd_timings,
171 MAX_TIMING_CONFIG * sizeof(uint32_t));
172 pinfo->mipi.signature = TRULY_1080P_CMD_SIGNATURE;
173 break;
Mao Flynn5ecc8c92016-01-29 14:06:10 +0800174 case R69006_1080P_VIDEO_PANEL:
175 panelstruct->paneldata = &r69006_1080p_video_panel_data;
176 panelstruct->panelres = &r69006_1080p_video_panel_res;
177 panelstruct->color = &r69006_1080p_video_color;
178 panelstruct->videopanel = &r69006_1080p_video_video_panel;
179 panelstruct->commandpanel = &r69006_1080p_video_command_panel;
180 panelstruct->state = &r69006_1080p_video_state;
181 panelstruct->laneconfig = &r69006_1080p_video_lane_config;
182 panelstruct->paneltiminginfo
183 = &r69006_1080p_video_timing_info;
184 panelstruct->panelresetseq
185 = &r69006_1080p_video_reset_seq;
186 panelstruct->backlightinfo = &r69006_1080p_video_backlight;
187 pinfo->labibb = &r69006_1080p_video_labibb;
188 pinfo->mipi.panel_on_cmds
189 = r69006_1080p_video_on_command;
190 pinfo->mipi.num_of_panel_on_cmds
191 = R69006_1080P_VIDEO_ON_COMMAND;
192 pinfo->mipi.panel_off_cmds
193 = r69006_1080p_video_off_command;
194 pinfo->mipi.num_of_panel_off_cmds
195 = R69006_1080P_VIDEO_OFF_COMMAND;
196 memcpy(phy_db->timing,
197 r69006_1080p_14nm_video_timings,
198 MAX_TIMING_CONFIG * sizeof(uint32_t));
199 pinfo->mipi.signature = R69006_1080P_VIDEO_SIGNATURE;
200 break;
201 case R69006_1080P_CMD_PANEL:
202 panelstruct->paneldata = &r69006_1080p_cmd_panel_data;
203 panelstruct->panelres = &r69006_1080p_cmd_panel_res;
204 panelstruct->color = &r69006_1080p_cmd_color;
205 panelstruct->videopanel = &r69006_1080p_cmd_video_panel;
206 panelstruct->commandpanel = &r69006_1080p_cmd_command_panel;
207 panelstruct->state = &r69006_1080p_cmd_state;
208 panelstruct->laneconfig = &r69006_1080p_cmd_lane_config;
209 panelstruct->paneltiminginfo
210 = &r69006_1080p_cmd_timing_info;
211 panelstruct->panelresetseq
212 = &r69006_1080p_cmd_reset_seq;
213 panelstruct->backlightinfo = &r69006_1080p_cmd_backlight;
214 pinfo->labibb = &r69006_1080p_cmd_labibb;
215 pinfo->mipi.panel_on_cmds
216 = r69006_1080p_cmd_on_command;
217 pinfo->mipi.num_of_panel_on_cmds
218 = R69006_1080P_CMD_ON_COMMAND;
219 pinfo->mipi.panel_off_cmds
220 = r69006_1080p_cmd_off_command;
221 pinfo->mipi.num_of_panel_off_cmds
222 = R69006_1080P_CMD_OFF_COMMAND;
223 memcpy(phy_db->timing,
224 r69006_1080p_14nm_cmd_timings,
225 MAX_TIMING_CONFIG * sizeof(uint32_t));
226 pinfo->mipi.signature = R69006_1080P_CMD_SIGNATURE;
227 pinfo->mipi.tx_eot_append = true;
228 pinfo->mipi.rx_eot_ignore = true;
229 break;
Padmanabhan Komanduru52567fb2016-02-03 16:03:13 +0530230 case TRULY_WUXGA_VIDEO_PANEL:
231 panelstruct->paneldata = &truly_wuxga_video_panel_data;
232 panelstruct->paneldata->panel_with_enable_gpio = 1;
233 panelstruct->panelres = &truly_wuxga_video_panel_res;
234 panelstruct->color = &truly_wuxga_video_color;
235 panelstruct->videopanel = &truly_wuxga_video_video_panel;
236 panelstruct->commandpanel = &truly_wuxga_video_command_panel;
237 panelstruct->state = &truly_wuxga_video_state;
238 panelstruct->laneconfig = &truly_wuxga_video_lane_config;
239 panelstruct->paneltiminginfo
240 = &truly_wuxga_video_timing_info;
241 panelstruct->panelresetseq
242 = &truly_wuxga_video_panel_reset_seq;
243 panelstruct->backlightinfo = &truly_wuxga_video_backlight;
244 pinfo->mipi.panel_on_cmds
245 = truly_wuxga_video_on_command;
246 pinfo->mipi.num_of_panel_on_cmds
247 = TRULY_WUXGA_VIDEO_ON_COMMAND;
248 pinfo->mipi.panel_off_cmds
249 = truly_wuxga_video_off_command;
250 pinfo->mipi.num_of_panel_off_cmds
251 = TRULY_WUXGA_VIDEO_OFF_COMMAND;
252 memcpy(phy_db->timing,
253 truly_wuxga_14nm_video_timings, MAX_TIMING_CONFIG * sizeof(uint32_t));
Vishnuvardhan Prodduturi154d9452016-02-22 16:13:49 +0530254 pinfo->dfps.panel_dfps = truly_wuxga_video_dfps;
Padmanabhan Komanduru52567fb2016-02-03 16:03:13 +0530255 pinfo->mipi.signature = TRULY_WUXGA_VIDEO_SIGNATURE;
256 break;
Lei Chen84755442017-11-28 18:28:15 +0800257 case HX8399C_FHD_PLUSE_VIDEO_PANEL:
258 panelstruct->paneldata = &hx8399c_fhd_pluse_video_panel_data;
259 panelstruct->panelres = &hx8399c_fhd_pluse_video_panel_res;
260 panelstruct->color = &hx8399c_fhd_pluse_video_color;
261 panelstruct->videopanel =
262 &hx8399c_fhd_pluse_video_video_panel;
263 panelstruct->commandpanel =
264 &hx8399c_fhd_pluse_video_command_panel;
265 panelstruct->state = &hx8399c_fhd_pluse_video_state;
266 panelstruct->laneconfig =
267 &hx8399c_fhd_pluse_video_lane_config;
268 panelstruct->paneltiminginfo
269 = &hx8399c_fhd_pluse_video_timing_info;
270 panelstruct->panelresetseq
271 = &hx8399c_fhd_pluse_video_panel_reset_seq;
272 panelstruct->backlightinfo = &hx8399c_fhd_pluse_video_backlight;
273 pinfo->labibb = &hx8399c_fhd_pluse_video_labibb;
274 pinfo->mipi.panel_on_cmds
275 = hx8399c_fhd_pluse_video_on_command;
276 pinfo->mipi.num_of_panel_on_cmds
277 = HX8399C_FHD_PLUSE_VIDEO_ON_COMMAND;
278 pinfo->mipi.panel_off_cmds
279 = hx8399c_fhd_pluse_video_off_command;
280 pinfo->mipi.num_of_panel_off_cmds
281 = HX8399C_FHD_PLUSE_VIDEO_OFF_COMMAND;
282 memcpy(phy_db->timing,
283 hx8399c_fhd_pluse_14nm_video_timings, MAX_TIMING_CONFIG * sizeof(uint32_t));
284 pinfo->mipi.signature = HX8399C_FHD_PLUSE_VIDEO_SIGNATURE;
285 break;
Ravikanth Tuniki1af05fd2018-06-29 18:07:59 +0530286 case HX8399C_HD_PLUS_VIDEO_PANEL:
287 panelstruct->paneldata = &hx8399c_hd_plus_video_panel_data;
288 panelstruct->panelres = &hx8399c_hd_plus_video_panel_res;
289 panelstruct->color = &hx8399c_hd_plus_video_color;
290 panelstruct->videopanel =
291 &hx8399c_hd_plus_video_video_panel;
292 panelstruct->commandpanel =
293 &hx8399c_hd_plus_video_command_panel;
294 panelstruct->state = &hx8399c_hd_plus_video_state;
295 panelstruct->laneconfig =
296 &hx8399c_hd_plus_video_lane_config;
297 panelstruct->paneltiminginfo
298 = &hx8399c_hd_plus_video_timing_info;
299 panelstruct->panelresetseq
300 = &hx8399c_hd_plus_video_panel_reset_seq;
301 panelstruct->backlightinfo = &hx8399c_hd_plus_video_backlight;
302 pinfo->labibb = &hx8399c_hd_plus_video_labibb;
303 pinfo->mipi.panel_on_cmds
304 = hx8399c_hd_plus_video_on_command;
305 pinfo->mipi.num_of_panel_on_cmds
306 = HX8399C_HD_PLUS_VIDEO_ON_COMMAND;
307 pinfo->mipi.panel_off_cmds
308 = hx8399c_hd_plus_video_off_command;
309 pinfo->mipi.num_of_panel_off_cmds
310 = HX8399C_HD_PLUS_VIDEO_OFF_COMMAND;
311 memcpy(phy_db->timing,
312 hx8399c_hd_plus_14nm_video_timings, MAX_TIMING_CONFIG * sizeof(uint32_t));
313 pinfo->mipi.signature = HX8399C_HD_PLUS_VIDEO_SIGNATURE;
314 break;
Padmanabhan Komanduru0104a892016-01-22 16:58:10 +0530315 case UNKNOWN_PANEL:
316 default:
317 memset(panelstruct, 0, sizeof(struct panel_struct));
318 memset(pinfo->mipi.panel_on_cmds, 0,
319 sizeof(struct mipi_dsi_cmd));
320 pinfo->mipi.num_of_panel_on_cmds = 0;
321 memset(pinfo->mipi.panel_off_cmds, 0,
322 sizeof(struct mipi_dsi_cmd));
323 pinfo->mipi.num_of_panel_off_cmds = 0;
324 memset(phy_db->timing, 0, TIMING_SIZE);
325 pan_type = PANEL_TYPE_UNKNOWN;
326 break;
327 }
328 return pan_type;
329}
330
331#define DISPLAY_MAX_PANEL_DETECTION 2
332
333uint32_t oem_panel_max_auto_detect_panels()
334{
335 return target_panel_auto_detect_enabled() ?
336 DISPLAY_MAX_PANEL_DETECTION : 0;
337}
338
339int oem_panel_select(const char *panel_name, struct panel_struct *panelstruct,
340 struct msm_panel_info *pinfo,
341 struct mdss_dsi_phy_ctrl *phy_db)
342{
343 uint32_t hw_id = board_hardware_id();
Lei Chen84755442017-11-28 18:28:15 +0800344 uint32_t platform_subtype = board_hardware_subtype();
Padmanabhan Komanduru0104a892016-01-22 16:58:10 +0530345 int32_t panel_override_id;
346 phy_db->pll_type = DSI_PLL_TYPE_THULIUM;
347
348 if (panel_name) {
349 panel_override_id = panel_name_to_id(supp_panels,
350 ARRAY_SIZE(supp_panels), panel_name);
351
352 if (panel_override_id < 0) {
353 dprintf(CRITICAL, "Not able to search the panel:%s\n",
354 panel_name + strspn(panel_name, " "));
355 } else if (panel_override_id < UNKNOWN_PANEL) {
356 /* panel override using fastboot oem command */
357 panel_id = panel_override_id;
358
359 dprintf(INFO, "OEM panel override:%s\n",
360 panel_name + strspn(panel_name, " "));
361 goto panel_init;
362 }
363 }
364
365 switch (hw_id) {
366 case HW_PLATFORM_MTP:
Lei Chen84755442017-11-28 18:28:15 +0800367 panel_id = TRULY_1080P_VIDEO_PANEL;
368 if (platform_subtype == 0x03)
369 panel_id = HX8399C_FHD_PLUSE_VIDEO_PANEL;
370 break;
Padmanabhan Komanduru0104a892016-01-22 16:58:10 +0530371 case HW_PLATFORM_SURF:
372 case HW_PLATFORM_RCM:
373 panel_id = TRULY_1080P_VIDEO_PANEL;
Lei Chen84755442017-11-28 18:28:15 +0800374 if (platform_subtype == 0x02)
375 panel_id = HX8399C_FHD_PLUSE_VIDEO_PANEL;
Padmanabhan Komanduru0104a892016-01-22 16:58:10 +0530376 break;
Mao Flynn5ecc8c92016-01-29 14:06:10 +0800377 case HW_PLATFORM_QRD:
378 panel_id = R69006_1080P_CMD_PANEL;
Lei Chen5a2543d2018-04-12 13:44:51 +0800379 if (platform_subtype == 0x01 || platform_subtype == 0x03)
Lei Chen84755442017-11-28 18:28:15 +0800380 panel_id = HX8399C_FHD_PLUSE_VIDEO_PANEL;
Mao Flynn5ecc8c92016-01-29 14:06:10 +0800381 break;
Padmanabhan Komanduru0104a892016-01-22 16:58:10 +0530382 default:
383 dprintf(CRITICAL, "Display not enabled for %d HW type\n",
384 hw_id);
385 return PANEL_TYPE_UNKNOWN;
386 }
387
388panel_init:
389 /*
390 * Update all data structures after 'panel_init' label. Only panel
391 * selection is supposed to happen before that.
392 */
393 pinfo->pipe_type = MDSS_MDP_PIPE_TYPE_RGB;
394 return init_panel_data(panelstruct, pinfo, phy_db);
395}