blob: f035b6f716cff665aba76e8f23b0f834d64108b7 [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"
Padmanabhan Komanduru0104a892016-01-22 16:58:10 +053054
55/*---------------------------------------------------------------------------*/
56/* static panel selection variable */
57/*---------------------------------------------------------------------------*/
58enum {
59 TRULY_1080P_VIDEO_PANEL,
60 TRULY_1080P_CMD_PANEL,
Mao Flynn5ecc8c92016-01-29 14:06:10 +080061 R69006_1080P_VIDEO_PANEL,
62 R69006_1080P_CMD_PANEL,
Padmanabhan Komanduru52567fb2016-02-03 16:03:13 +053063 TRULY_WUXGA_VIDEO_PANEL,
Lei Chen84755442017-11-28 18:28:15 +080064 HX8399C_FHD_PLUSE_VIDEO_PANEL,
Padmanabhan Komanduru0104a892016-01-22 16:58:10 +053065 UNKNOWN_PANEL
66};
67
68/*
69 * The list of panels that are supported on this target.
70 * Any panel in this list can be selected using fastboot oem command.
71 */
72static struct panel_list supp_panels[] = {
73 {"truly_1080p_video", TRULY_1080P_VIDEO_PANEL},
74 {"truly_1080p_cmd", TRULY_1080P_CMD_PANEL},
Mao Flynn5ecc8c92016-01-29 14:06:10 +080075 {"r69006_1080p_video", R69006_1080P_VIDEO_PANEL},
76 {"r69006_1080p_cmd", R69006_1080P_CMD_PANEL},
Padmanabhan Komanduru52567fb2016-02-03 16:03:13 +053077 {"truly_wuxga_video", TRULY_WUXGA_VIDEO_PANEL},
Lei Chen84755442017-11-28 18:28:15 +080078 {"hx8399c_fhd_pluse_video", HX8399C_FHD_PLUSE_VIDEO_PANEL},
Padmanabhan Komanduru0104a892016-01-22 16:58:10 +053079};
80
81static uint32_t panel_id;
82
83int oem_panel_rotation()
84{
85 return NO_ERROR;
86}
87
88#define TRULY_1080P_PANEL_ON_DELAY 40
89int oem_panel_on()
90{
91 if (panel_id == TRULY_1080P_CMD_PANEL ||
92 panel_id == TRULY_1080P_VIDEO_PANEL)
93 mdelay(TRULY_1080P_PANEL_ON_DELAY);
Mao Flynn5ecc8c92016-01-29 14:06:10 +080094 else if (panel_id == R69006_1080P_CMD_PANEL) {
95 mdelay(R69006_1080P_CMD_PANEL_ON_DELAY);
96 }
Padmanabhan Komanduru0104a892016-01-22 16:58:10 +053097
98 return NO_ERROR;
99}
100
101int oem_panel_off()
102{
103 /* OEM can keep their panel specific off instructions
104 * in this function
105 */
106 return NO_ERROR;
107}
108
109static int init_panel_data(struct panel_struct *panelstruct,
110 struct msm_panel_info *pinfo,
111 struct mdss_dsi_phy_ctrl *phy_db)
112{
113 int pan_type = PANEL_TYPE_DSI;
114
115 switch (panel_id) {
116 case TRULY_1080P_VIDEO_PANEL:
117 panelstruct->paneldata = &truly_1080p_video_panel_data;
Padmanabhan Komanduruc2a81e92016-02-03 16:00:42 +0530118 panelstruct->paneldata->panel_with_enable_gpio = 0;
Padmanabhan Komanduru0104a892016-01-22 16:58:10 +0530119 panelstruct->panelres = &truly_1080p_video_panel_res;
120 panelstruct->color = &truly_1080p_video_color;
121 panelstruct->videopanel = &truly_1080p_video_video_panel;
122 panelstruct->commandpanel = &truly_1080p_video_command_panel;
123 panelstruct->state = &truly_1080p_video_state;
124 panelstruct->laneconfig = &truly_1080p_video_lane_config;
125 panelstruct->paneltiminginfo
126 = &truly_1080p_video_timing_info;
127 panelstruct->panelresetseq
128 = &truly_1080p_video_panel_reset_seq;
129 panelstruct->backlightinfo = &truly_1080p_video_backlight;
130 pinfo->mipi.panel_on_cmds
131 = truly_1080p_video_on_command;
132 pinfo->mipi.num_of_panel_on_cmds
133 = TRULY_1080P_VIDEO_ON_COMMAND;
134 pinfo->mipi.panel_off_cmds
135 = truly_1080p_video_off_command;
136 pinfo->mipi.num_of_panel_off_cmds
137 = TRULY_1080P_VIDEO_OFF_COMMAND;
138 memcpy(phy_db->timing,
139 truly_1080p_14nm_video_timings,
140 MAX_TIMING_CONFIG * sizeof(uint32_t));
Padmanabhan Komanduru6f0b6322016-01-22 16:37:53 +0530141 pinfo->dfps.panel_dfps = truly_1080p_video_dfps;
Padmanabhan Komanduru0104a892016-01-22 16:58:10 +0530142 pinfo->mipi.signature = TRULY_1080P_VIDEO_SIGNATURE;
143 break;
144 case TRULY_1080P_CMD_PANEL:
145 panelstruct->paneldata = &truly_1080p_cmd_panel_data;
Padmanabhan Komanduruc2a81e92016-02-03 16:00:42 +0530146 panelstruct->paneldata->panel_with_enable_gpio = 0;
Padmanabhan Komanduru0104a892016-01-22 16:58:10 +0530147 panelstruct->panelres = &truly_1080p_cmd_panel_res;
148 panelstruct->color = &truly_1080p_cmd_color;
149 panelstruct->videopanel = &truly_1080p_cmd_video_panel;
150 panelstruct->commandpanel = &truly_1080p_cmd_command_panel;
151 panelstruct->state = &truly_1080p_cmd_state;
152 panelstruct->laneconfig = &truly_1080p_cmd_lane_config;
153 panelstruct->paneltiminginfo
154 = &truly_1080p_cmd_timing_info;
155 panelstruct->panelresetseq
156 = &truly_1080p_cmd_panel_reset_seq;
157 panelstruct->backlightinfo = &truly_1080p_cmd_backlight;
158 pinfo->mipi.panel_on_cmds
159 = truly_1080p_cmd_on_command;
160 pinfo->mipi.num_of_panel_on_cmds
161 = TRULY_1080P_CMD_ON_COMMAND;
162 pinfo->mipi.panel_off_cmds
163 = truly_1080p_cmd_off_command;
164 pinfo->mipi.num_of_panel_off_cmds
165 = TRULY_1080P_CMD_OFF_COMMAND;
166 memcpy(phy_db->timing,
167 truly_1080p_14nm_cmd_timings,
168 MAX_TIMING_CONFIG * sizeof(uint32_t));
169 pinfo->mipi.signature = TRULY_1080P_CMD_SIGNATURE;
170 break;
Mao Flynn5ecc8c92016-01-29 14:06:10 +0800171 case R69006_1080P_VIDEO_PANEL:
172 panelstruct->paneldata = &r69006_1080p_video_panel_data;
173 panelstruct->panelres = &r69006_1080p_video_panel_res;
174 panelstruct->color = &r69006_1080p_video_color;
175 panelstruct->videopanel = &r69006_1080p_video_video_panel;
176 panelstruct->commandpanel = &r69006_1080p_video_command_panel;
177 panelstruct->state = &r69006_1080p_video_state;
178 panelstruct->laneconfig = &r69006_1080p_video_lane_config;
179 panelstruct->paneltiminginfo
180 = &r69006_1080p_video_timing_info;
181 panelstruct->panelresetseq
182 = &r69006_1080p_video_reset_seq;
183 panelstruct->backlightinfo = &r69006_1080p_video_backlight;
184 pinfo->labibb = &r69006_1080p_video_labibb;
185 pinfo->mipi.panel_on_cmds
186 = r69006_1080p_video_on_command;
187 pinfo->mipi.num_of_panel_on_cmds
188 = R69006_1080P_VIDEO_ON_COMMAND;
189 pinfo->mipi.panel_off_cmds
190 = r69006_1080p_video_off_command;
191 pinfo->mipi.num_of_panel_off_cmds
192 = R69006_1080P_VIDEO_OFF_COMMAND;
193 memcpy(phy_db->timing,
194 r69006_1080p_14nm_video_timings,
195 MAX_TIMING_CONFIG * sizeof(uint32_t));
196 pinfo->mipi.signature = R69006_1080P_VIDEO_SIGNATURE;
197 break;
198 case R69006_1080P_CMD_PANEL:
199 panelstruct->paneldata = &r69006_1080p_cmd_panel_data;
200 panelstruct->panelres = &r69006_1080p_cmd_panel_res;
201 panelstruct->color = &r69006_1080p_cmd_color;
202 panelstruct->videopanel = &r69006_1080p_cmd_video_panel;
203 panelstruct->commandpanel = &r69006_1080p_cmd_command_panel;
204 panelstruct->state = &r69006_1080p_cmd_state;
205 panelstruct->laneconfig = &r69006_1080p_cmd_lane_config;
206 panelstruct->paneltiminginfo
207 = &r69006_1080p_cmd_timing_info;
208 panelstruct->panelresetseq
209 = &r69006_1080p_cmd_reset_seq;
210 panelstruct->backlightinfo = &r69006_1080p_cmd_backlight;
211 pinfo->labibb = &r69006_1080p_cmd_labibb;
212 pinfo->mipi.panel_on_cmds
213 = r69006_1080p_cmd_on_command;
214 pinfo->mipi.num_of_panel_on_cmds
215 = R69006_1080P_CMD_ON_COMMAND;
216 pinfo->mipi.panel_off_cmds
217 = r69006_1080p_cmd_off_command;
218 pinfo->mipi.num_of_panel_off_cmds
219 = R69006_1080P_CMD_OFF_COMMAND;
220 memcpy(phy_db->timing,
221 r69006_1080p_14nm_cmd_timings,
222 MAX_TIMING_CONFIG * sizeof(uint32_t));
223 pinfo->mipi.signature = R69006_1080P_CMD_SIGNATURE;
224 pinfo->mipi.tx_eot_append = true;
225 pinfo->mipi.rx_eot_ignore = true;
226 break;
Padmanabhan Komanduru52567fb2016-02-03 16:03:13 +0530227 case TRULY_WUXGA_VIDEO_PANEL:
228 panelstruct->paneldata = &truly_wuxga_video_panel_data;
229 panelstruct->paneldata->panel_with_enable_gpio = 1;
230 panelstruct->panelres = &truly_wuxga_video_panel_res;
231 panelstruct->color = &truly_wuxga_video_color;
232 panelstruct->videopanel = &truly_wuxga_video_video_panel;
233 panelstruct->commandpanel = &truly_wuxga_video_command_panel;
234 panelstruct->state = &truly_wuxga_video_state;
235 panelstruct->laneconfig = &truly_wuxga_video_lane_config;
236 panelstruct->paneltiminginfo
237 = &truly_wuxga_video_timing_info;
238 panelstruct->panelresetseq
239 = &truly_wuxga_video_panel_reset_seq;
240 panelstruct->backlightinfo = &truly_wuxga_video_backlight;
241 pinfo->mipi.panel_on_cmds
242 = truly_wuxga_video_on_command;
243 pinfo->mipi.num_of_panel_on_cmds
244 = TRULY_WUXGA_VIDEO_ON_COMMAND;
245 pinfo->mipi.panel_off_cmds
246 = truly_wuxga_video_off_command;
247 pinfo->mipi.num_of_panel_off_cmds
248 = TRULY_WUXGA_VIDEO_OFF_COMMAND;
249 memcpy(phy_db->timing,
250 truly_wuxga_14nm_video_timings, MAX_TIMING_CONFIG * sizeof(uint32_t));
Vishnuvardhan Prodduturi154d9452016-02-22 16:13:49 +0530251 pinfo->dfps.panel_dfps = truly_wuxga_video_dfps;
Padmanabhan Komanduru52567fb2016-02-03 16:03:13 +0530252 pinfo->mipi.signature = TRULY_WUXGA_VIDEO_SIGNATURE;
253 break;
Lei Chen84755442017-11-28 18:28:15 +0800254 case HX8399C_FHD_PLUSE_VIDEO_PANEL:
255 panelstruct->paneldata = &hx8399c_fhd_pluse_video_panel_data;
256 panelstruct->panelres = &hx8399c_fhd_pluse_video_panel_res;
257 panelstruct->color = &hx8399c_fhd_pluse_video_color;
258 panelstruct->videopanel =
259 &hx8399c_fhd_pluse_video_video_panel;
260 panelstruct->commandpanel =
261 &hx8399c_fhd_pluse_video_command_panel;
262 panelstruct->state = &hx8399c_fhd_pluse_video_state;
263 panelstruct->laneconfig =
264 &hx8399c_fhd_pluse_video_lane_config;
265 panelstruct->paneltiminginfo
266 = &hx8399c_fhd_pluse_video_timing_info;
267 panelstruct->panelresetseq
268 = &hx8399c_fhd_pluse_video_panel_reset_seq;
269 panelstruct->backlightinfo = &hx8399c_fhd_pluse_video_backlight;
270 pinfo->labibb = &hx8399c_fhd_pluse_video_labibb;
271 pinfo->mipi.panel_on_cmds
272 = hx8399c_fhd_pluse_video_on_command;
273 pinfo->mipi.num_of_panel_on_cmds
274 = HX8399C_FHD_PLUSE_VIDEO_ON_COMMAND;
275 pinfo->mipi.panel_off_cmds
276 = hx8399c_fhd_pluse_video_off_command;
277 pinfo->mipi.num_of_panel_off_cmds
278 = HX8399C_FHD_PLUSE_VIDEO_OFF_COMMAND;
279 memcpy(phy_db->timing,
280 hx8399c_fhd_pluse_14nm_video_timings, MAX_TIMING_CONFIG * sizeof(uint32_t));
281 pinfo->mipi.signature = HX8399C_FHD_PLUSE_VIDEO_SIGNATURE;
282 break;
Padmanabhan Komanduru0104a892016-01-22 16:58:10 +0530283 case UNKNOWN_PANEL:
284 default:
285 memset(panelstruct, 0, sizeof(struct panel_struct));
286 memset(pinfo->mipi.panel_on_cmds, 0,
287 sizeof(struct mipi_dsi_cmd));
288 pinfo->mipi.num_of_panel_on_cmds = 0;
289 memset(pinfo->mipi.panel_off_cmds, 0,
290 sizeof(struct mipi_dsi_cmd));
291 pinfo->mipi.num_of_panel_off_cmds = 0;
292 memset(phy_db->timing, 0, TIMING_SIZE);
293 pan_type = PANEL_TYPE_UNKNOWN;
294 break;
295 }
296 return pan_type;
297}
298
299#define DISPLAY_MAX_PANEL_DETECTION 2
300
301uint32_t oem_panel_max_auto_detect_panels()
302{
303 return target_panel_auto_detect_enabled() ?
304 DISPLAY_MAX_PANEL_DETECTION : 0;
305}
306
307int oem_panel_select(const char *panel_name, struct panel_struct *panelstruct,
308 struct msm_panel_info *pinfo,
309 struct mdss_dsi_phy_ctrl *phy_db)
310{
311 uint32_t hw_id = board_hardware_id();
Lei Chen84755442017-11-28 18:28:15 +0800312 uint32_t platform_subtype = board_hardware_subtype();
Padmanabhan Komanduru0104a892016-01-22 16:58:10 +0530313 int32_t panel_override_id;
314 phy_db->pll_type = DSI_PLL_TYPE_THULIUM;
315
316 if (panel_name) {
317 panel_override_id = panel_name_to_id(supp_panels,
318 ARRAY_SIZE(supp_panels), panel_name);
319
320 if (panel_override_id < 0) {
321 dprintf(CRITICAL, "Not able to search the panel:%s\n",
322 panel_name + strspn(panel_name, " "));
323 } else if (panel_override_id < UNKNOWN_PANEL) {
324 /* panel override using fastboot oem command */
325 panel_id = panel_override_id;
326
327 dprintf(INFO, "OEM panel override:%s\n",
328 panel_name + strspn(panel_name, " "));
329 goto panel_init;
330 }
331 }
332
333 switch (hw_id) {
334 case HW_PLATFORM_MTP:
Lei Chen84755442017-11-28 18:28:15 +0800335 panel_id = TRULY_1080P_VIDEO_PANEL;
336 if (platform_subtype == 0x03)
337 panel_id = HX8399C_FHD_PLUSE_VIDEO_PANEL;
338 break;
Padmanabhan Komanduru0104a892016-01-22 16:58:10 +0530339 case HW_PLATFORM_SURF:
340 case HW_PLATFORM_RCM:
341 panel_id = TRULY_1080P_VIDEO_PANEL;
Lei Chen84755442017-11-28 18:28:15 +0800342 if (platform_subtype == 0x02)
343 panel_id = HX8399C_FHD_PLUSE_VIDEO_PANEL;
Padmanabhan Komanduru0104a892016-01-22 16:58:10 +0530344 break;
Mao Flynn5ecc8c92016-01-29 14:06:10 +0800345 case HW_PLATFORM_QRD:
346 panel_id = R69006_1080P_CMD_PANEL;
Lei Chen84755442017-11-28 18:28:15 +0800347 if (platform_subtype == 0x01)
348 panel_id = HX8399C_FHD_PLUSE_VIDEO_PANEL;
Mao Flynn5ecc8c92016-01-29 14:06:10 +0800349 break;
Padmanabhan Komanduru0104a892016-01-22 16:58:10 +0530350 default:
351 dprintf(CRITICAL, "Display not enabled for %d HW type\n",
352 hw_id);
353 return PANEL_TYPE_UNKNOWN;
354 }
355
356panel_init:
357 /*
358 * Update all data structures after 'panel_init' label. Only panel
359 * selection is supposed to happen before that.
360 */
361 pinfo->pipe_type = MDSS_MDP_PIPE_TYPE_RGB;
362 return init_panel_data(panelstruct, pinfo, phy_db);
363}