blob: 09b767bd14d42ab860c0b6b0fc343949138fb051 [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>
38#include <target/display.h>
39
40#include "include/panel.h"
41#include "panel_display.h"
42
43/*---------------------------------------------------------------------------*/
44/* GCDB Panel Database */
45/*---------------------------------------------------------------------------*/
46#include "include/panel_truly_1080p_video.h"
Jayant Shekhar9ea8dcd2015-04-20 15:18:37 +053047#include "include/panel_truly_1080p_cmd.h"
feifanz174c82c2015-04-15 18:57:07 +080048#include "include/panel_otm1906c_1080p_cmd.h"
Vishnuvardhan Prodduturi16eb20f2015-06-05 18:03:54 +053049#include "include/panel_sharp_1080p_cmd.h"
Padmanabhan Komanduru49a86cf2015-06-08 18:24:30 +053050#include "include/panel_nt35597_wqxga_dualdsi_video.h"
Vishnuvardhan Prodduturic1a46c52015-06-29 16:35:23 +053051#include "include/panel_nt35597_wqxga_dualdsi_cmd.h"
Padmanabhan Komanduru9d49f892015-04-10 12:58:46 -070052
53/*---------------------------------------------------------------------------*/
54/* static panel selection variable */
55/*---------------------------------------------------------------------------*/
56enum {
57 TRULY_1080P_VIDEO_PANEL,
Jayant Shekhar9ea8dcd2015-04-20 15:18:37 +053058 TRULY_1080P_CMD_PANEL,
feifanz174c82c2015-04-15 18:57:07 +080059 OTM1906C_1080P_CMD_PANEL,
Vishnuvardhan Prodduturi16eb20f2015-06-05 18:03:54 +053060 SHARP_1080P_CMD_PANEL,
Padmanabhan Komanduru49a86cf2015-06-08 18:24:30 +053061 NT35597_WQXGA_DUALDSI_VIDEO_PANEL,
Vishnuvardhan Prodduturic1a46c52015-06-29 16:35:23 +053062 NT35597_WQXGA_DUALDSI_CMD_PANEL,
Padmanabhan Komanduru9d49f892015-04-10 12:58:46 -070063 UNKNOWN_PANEL
64};
65
66uint32_t panel_regulator_settings[] = {
67 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
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},
Jayant Shekhar9ea8dcd2015-04-20 15:18:37 +053076 {"truly_1080p_cmd", TRULY_1080P_CMD_PANEL},
Vishnuvardhan Prodduturi16eb20f2015-06-05 18:03:54 +053077 {"sharp_1080p_cmd", SHARP_1080P_CMD_PANEL},
Padmanabhan Komanduru49a86cf2015-06-08 18:24:30 +053078 {"nt35597_wqxga_dualdsi_video", NT35597_WQXGA_DUALDSI_VIDEO_PANEL},
Vishnuvardhan Prodduturic1a46c52015-06-29 16:35:23 +053079 {"nt35597_wqxga_dualdsi_cmd", NT35597_WQXGA_DUALDSI_CMD_PANEL},
Padmanabhan Komanduru9d49f892015-04-10 12:58:46 -070080};
81
82static uint32_t panel_id;
83
Sandeep Pandac797d542015-06-12 14:37:55 +053084#define TRULY_1080P_CMD_PANEL_ON_DELAY 40
85
Padmanabhan Komanduru9d49f892015-04-10 12:58:46 -070086int oem_panel_rotation()
87{
88 return NO_ERROR;
89}
90
91int oem_panel_on()
92{
93 /*
94 *OEM can keep their panel specific on instructions in this
95 *function
feifanz525046b2015-06-01 20:31:06 +080096 */
97 if (panel_id == OTM1906C_1080P_CMD_PANEL) {
98 /* needs extra delay to avoid unexpected artifacts */
99 mdelay(OTM1906C_1080P_CMD_PANEL_ON_DELAY);
Sandeep Pandac797d542015-06-12 14:37:55 +0530100 } else if (panel_id == TRULY_1080P_CMD_PANEL) {
101 mdelay(TRULY_1080P_CMD_PANEL_ON_DELAY);
feifanz525046b2015-06-01 20:31:06 +0800102 }
Sandeep Pandac797d542015-06-12 14:37:55 +0530103
Padmanabhan Komanduru9d49f892015-04-10 12:58:46 -0700104 return NO_ERROR;
105}
106
107int oem_panel_off()
108{
109 /* OEM can keep their panel specific off instructions
110 * in this function
111 */
112 return NO_ERROR;
113}
114
115static int init_panel_data(struct panel_struct *panelstruct,
116 struct msm_panel_info *pinfo,
117 struct mdss_dsi_phy_ctrl *phy_db)
118{
119 int pan_type = PANEL_TYPE_DSI;
120
121 switch (panel_id) {
122 case TRULY_1080P_VIDEO_PANEL:
123 panelstruct->paneldata = &truly_1080p_video_panel_data;
124 panelstruct->paneldata->panel_with_enable_gpio = 1;
125 panelstruct->panelres = &truly_1080p_video_panel_res;
126 panelstruct->color = &truly_1080p_video_color;
127 panelstruct->videopanel = &truly_1080p_video_video_panel;
128 panelstruct->commandpanel = &truly_1080p_video_command_panel;
129 panelstruct->state = &truly_1080p_video_state;
130 panelstruct->laneconfig = &truly_1080p_video_lane_config;
131 panelstruct->paneltiminginfo
132 = &truly_1080p_video_timing_info;
133 panelstruct->panelresetseq
134 = &truly_1080p_video_panel_reset_seq;
135 panelstruct->backlightinfo = &truly_1080p_video_backlight;
136 pinfo->mipi.panel_on_cmds
137 = truly_1080p_video_on_command;
138 pinfo->mipi.num_of_panel_on_cmds
139 = TRULY_1080P_VIDEO_ON_COMMAND;
140 pinfo->mipi.panel_off_cmds
141 = truly_1080p_video_off_command;
142 pinfo->mipi.num_of_panel_off_cmds
143 = TRULY_1080P_VIDEO_OFF_COMMAND;
144 memcpy(phy_db->timing,
145 truly_1080p_video_timings, TIMING_SIZE);
146 pinfo->mipi.signature = TRULY_1080P_VIDEO_SIGNATURE;
147 break;
Jayant Shekhar9ea8dcd2015-04-20 15:18:37 +0530148 case TRULY_1080P_CMD_PANEL:
149 panelstruct->paneldata = &truly_1080p_cmd_panel_data;
150 panelstruct->paneldata->panel_with_enable_gpio = 1;
151 panelstruct->panelres = &truly_1080p_cmd_panel_res;
152 panelstruct->color = &truly_1080p_cmd_color;
153 panelstruct->videopanel = &truly_1080p_cmd_video_panel;
154 panelstruct->commandpanel = &truly_1080p_cmd_command_panel;
155 panelstruct->state = &truly_1080p_cmd_state;
156 panelstruct->laneconfig = &truly_1080p_cmd_lane_config;
157 panelstruct->paneltiminginfo
158 = &truly_1080p_cmd_timing_info;
159 panelstruct->panelresetseq
160 = &truly_1080p_cmd_panel_reset_seq;
161 panelstruct->backlightinfo = &truly_1080p_cmd_backlight;
162 pinfo->mipi.panel_on_cmds
163 = truly_1080p_cmd_on_command;
164 pinfo->mipi.num_of_panel_on_cmds
165 = TRULY_1080P_CMD_ON_COMMAND;
166 pinfo->mipi.panel_off_cmds
167 = truly_1080p_cmd_off_command;
168 pinfo->mipi.num_of_panel_off_cmds
169 = TRULY_1080P_CMD_OFF_COMMAND;
170 memcpy(phy_db->timing,
171 truly_1080p_cmd_timings, TIMING_SIZE);
172 pinfo->mipi.signature = TRULY_1080P_CMD_SIGNATURE;
173 break;
feifanz174c82c2015-04-15 18:57:07 +0800174 case OTM1906C_1080P_CMD_PANEL:
175 panelstruct->paneldata = &otm1906c_1080p_cmd_panel_data;
176 panelstruct->paneldata->panel_with_enable_gpio = 1;
177 panelstruct->panelres = &otm1906c_1080p_cmd_panel_res;
178 panelstruct->color = &otm1906c_1080p_cmd_color;
179 panelstruct->videopanel = &otm1906c_1080p_cmd_video_panel;
180 panelstruct->commandpanel = &otm1906c_1080p_cmd_command_panel;
181 panelstruct->state = &otm1906c_1080p_cmd_state;
182 panelstruct->laneconfig = &otm1906c_1080p_cmd_lane_config;
183 panelstruct->paneltiminginfo
184 = &otm1906c_1080p_cmd_timing_info;
185 panelstruct->panelresetseq
186 = &otm1906c_1080p_cmd_panel_reset_seq;
187 panelstruct->backlightinfo = &otm1906c_1080p_cmd_backlight;
188 pinfo->mipi.panel_on_cmds
189 = otm1906c_1080p_cmd_on_command;
190 pinfo->mipi.num_of_panel_on_cmds
191 = OTM1906C_1080P_CMD_ON_COMMAND;
192 pinfo->mipi.panel_off_cmds
193 = otm1906c_1080p_cmd_off_command;
194 pinfo->mipi.num_of_panel_off_cmds
195 = OTM1906C_1080P_CMD_OFF_COMMAND;
196 memcpy(phy_db->timing,
197 otm1906c_1080p_cmd_timings, TIMING_SIZE);
198 pinfo->mipi.signature = OTM1906C_1080P_CMD_SIGNATURE;
199 break;
Vishnuvardhan Prodduturi16eb20f2015-06-05 18:03:54 +0530200 case SHARP_1080P_CMD_PANEL:
201 panelstruct->paneldata = &sharp_1080p_cmd_panel_data;
202 panelstruct->panelres = &sharp_1080p_cmd_panel_res;
203 panelstruct->paneldata->panel_with_enable_gpio = 1;
204 panelstruct->color = &sharp_1080p_cmd_color;
205 panelstruct->videopanel = &sharp_1080p_cmd_video_panel;
206 panelstruct->commandpanel = &sharp_1080p_cmd_command_panel;
207 panelstruct->state = &sharp_1080p_cmd_state;
208 panelstruct->laneconfig = &sharp_1080p_cmd_lane_config;
209 panelstruct->paneltiminginfo
210 = &sharp_1080p_cmd_timing_info;
211 panelstruct->panelresetseq
212 = &sharp_1080p_cmd_panel_reset_seq;
213 panelstruct->backlightinfo = &sharp_1080p_cmd_backlight;
214 pinfo->mipi.panel_on_cmds
215 = sharp_1080p_cmd_on_command;
216 pinfo->mipi.num_of_panel_on_cmds
217 = SHARP_1080P_CMD_ON_COMMAND;
218 pinfo->mipi.panel_off_cmds
219 = sharp_1080p_cmd_off_command;
220 pinfo->mipi.num_of_panel_off_cmds
221 = SHARP_1080P_CMD_OFF_COMMAND;
222 memcpy(phy_db->timing,
223 sharp_1080p_cmd_timings, TIMING_SIZE);
224 break;
Padmanabhan Komanduru49a86cf2015-06-08 18:24:30 +0530225 case NT35597_WQXGA_DUALDSI_VIDEO_PANEL:
226 panelstruct->paneldata = &nt35597_wqxga_dualdsi_video_panel_data;
227 panelstruct->paneldata->panel_operating_mode = DST_SPLIT_FLAG |
228 SPLIT_DISPLAY_FLAG | DUAL_DSI_FLAG;
229 panelstruct->paneldata->panel_with_enable_gpio = 0;
230
231 panelstruct->panelres = &nt35597_wqxga_dualdsi_video_panel_res;
232 panelstruct->color = &nt35597_wqxga_dualdsi_video_color;
233 panelstruct->videopanel = &nt35597_wqxga_dualdsi_video_video_panel;
234 panelstruct->commandpanel = &nt35597_wqxga_dualdsi_video_command_panel;
235 panelstruct->state = &nt35597_wqxga_dualdsi_video_state;
236 panelstruct->laneconfig = &nt35597_wqxga_dualdsi_video_lane_config;
237 panelstruct->paneltiminginfo
238 = &nt35597_wqxga_dualdsi_video_timing_info;
239 panelstruct->panelresetseq
240 = &nt35597_wqxga_dualdsi_video_reset_seq;
241 panelstruct->backlightinfo = &nt35597_wqxga_dualdsi_video_backlight;
242 pinfo->labibb = &nt35597_wqxga_dualdsi_video_labibb;
243
244 pinfo->mipi.panel_on_cmds
245 = nt35597_wqxga_dualdsi_video_on_command;
246 pinfo->mipi.num_of_panel_on_cmds
247 = NT35597_WQXGA_DUALDSI_VIDEO_ON_COMMAND;
248 pinfo->mipi.panel_off_cmds
249 = nt35597_wqxga_dualdsi_video_off_command;
250 pinfo->mipi.num_of_panel_off_cmds
251 = NT35597_WQXGA_DUALDSI_VIDEO_OFF_COMMAND;
252 memcpy(phy_db->timing, nt35597_wqxga_dualdsi_video_timings,
253 TIMING_SIZE);
254 pinfo->mipi.tx_eot_append = true;
255 break;
Vishnuvardhan Prodduturic1a46c52015-06-29 16:35:23 +0530256 case NT35597_WQXGA_DUALDSI_CMD_PANEL:
257 panelstruct->paneldata = &nt35597_wqxga_dualdsi_cmd_panel_data;
258 panelstruct->paneldata->panel_operating_mode = DST_SPLIT_FLAG |
259 SPLIT_DISPLAY_FLAG | DUAL_DSI_FLAG;
260 panelstruct->paneldata->panel_with_enable_gpio = 0;
261
262 panelstruct->panelres = &nt35597_wqxga_dualdsi_cmd_panel_res;
263 panelstruct->color = &nt35597_wqxga_dualdsi_cmd_color;
264 panelstruct->videopanel = &nt35597_wqxga_dualdsi_cmd_video_panel;
265 panelstruct->commandpanel = &nt35597_wqxga_dualdsi_cmd_command_panel;
266 panelstruct->state = &nt35597_wqxga_dualdsi_cmd_state;
267 panelstruct->laneconfig = &nt35597_wqxga_dualdsi_cmd_lane_config;
268 panelstruct->paneltiminginfo
269 = &nt35597_wqxga_dualdsi_cmd_timing_info;
270 panelstruct->panelresetseq
271 = &nt35597_wqxga_dualdsi_cmd_reset_seq;
272 panelstruct->backlightinfo = &nt35597_wqxga_dualdsi_cmd_backlight;
273
274 pinfo->labibb = &nt35597_wqxga_dualdsi_cmd_labibb;
275
276 pinfo->mipi.panel_on_cmds
277 = nt35597_wqxga_dualdsi_cmd_on_command;
278 pinfo->mipi.num_of_panel_on_cmds
279 = NT35597_WQXGA_DUALDSI_CMD_ON_COMMAND;
280 pinfo->mipi.panel_off_cmds
281 = nt35597_wqxga_dualdsi_cmd_off_command;
282 pinfo->mipi.num_of_panel_off_cmds
283 = NT35597_WQXGA_DUALDSI_CMD_OFF_COMMAND;
284 memcpy(phy_db->timing, nt35597_wqxga_dualdsi_cmd_timings,
285 TIMING_SIZE);
286 pinfo->mipi.tx_eot_append = true;
287 break;
Padmanabhan Komanduru9d49f892015-04-10 12:58:46 -0700288 case UNKNOWN_PANEL:
289 default:
290 memset(panelstruct, 0, sizeof(struct panel_struct));
291 memset(pinfo->mipi.panel_on_cmds, 0,
292 sizeof(struct mipi_dsi_cmd));
293 pinfo->mipi.num_of_panel_on_cmds = 0;
294 memset(pinfo->mipi.panel_off_cmds, 0,
295 sizeof(struct mipi_dsi_cmd));
296 pinfo->mipi.num_of_panel_off_cmds = 0;
297 memset(phy_db->timing, 0, TIMING_SIZE);
298 pan_type = PANEL_TYPE_UNKNOWN;
299 break;
300 }
301 return pan_type;
302}
303
304int oem_panel_select(const char *panel_name, struct panel_struct *panelstruct,
305 struct msm_panel_info *pinfo,
306 struct mdss_dsi_phy_ctrl *phy_db)
307{
308 uint32_t hw_id = board_hardware_id();
309 int32_t panel_override_id;
310
311 if (panel_name) {
312 panel_override_id = panel_name_to_id(supp_panels,
313 ARRAY_SIZE(supp_panels), panel_name);
314
315 if (panel_override_id < 0) {
316 dprintf(CRITICAL, "Not able to search the panel:%s\n",
Padmanabhan Komandurubccbcdc2015-06-30 16:19:24 +0530317 panel_name);
Padmanabhan Komanduru9d49f892015-04-10 12:58:46 -0700318 } else if (panel_override_id < UNKNOWN_PANEL) {
319 /* panel override using fastboot oem command */
320 panel_id = panel_override_id;
321
322 dprintf(INFO, "OEM panel override:%s\n",
Padmanabhan Komandurubccbcdc2015-06-30 16:19:24 +0530323 panel_name);
Padmanabhan Komanduru9d49f892015-04-10 12:58:46 -0700324 goto panel_init;
325 }
326 }
327
328 switch (hw_id) {
329 case HW_PLATFORM_MTP:
Padmanabhan Komanduru49a86cf2015-06-08 18:24:30 +0530330 if (platform_is_msm8956())
331 panel_id = NT35597_WQXGA_DUALDSI_VIDEO_PANEL;
332 else
333 panel_id = TRULY_1080P_VIDEO_PANEL;
Padmanabhan Komanduru9d49f892015-04-10 12:58:46 -0700334 break;
335 case HW_PLATFORM_SURF:
Padmanabhan Komanduru49a86cf2015-06-08 18:24:30 +0530336 if (platform_is_msm8956())
337 panel_id = NT35597_WQXGA_DUALDSI_VIDEO_PANEL;
338 else
339 panel_id = TRULY_1080P_VIDEO_PANEL;
Padmanabhan Komanduru9d49f892015-04-10 12:58:46 -0700340 break;
feifanz174c82c2015-04-15 18:57:07 +0800341 case HW_PLATFORM_QRD:
342 panel_id = OTM1906C_1080P_CMD_PANEL;
343 break;
Padmanabhan Komanduru9d49f892015-04-10 12:58:46 -0700344 default:
345 dprintf(CRITICAL, "Display not enabled for %d HW type\n",
346 hw_id);
347 return PANEL_TYPE_UNKNOWN;
348 }
349
350panel_init:
351 /*
352 * Update all data structures after 'panel_init' label. Only panel
353 * selection is supposed to happen before that.
354 */
Padmanabhan Komanduru0e19a362015-06-08 13:29:32 +0530355 if (platform_is_msm8956())
356 memcpy(panel_regulator_settings,
357 dcdc_regulator_settings_hpm, REGULATOR_SIZE);
358 else
359 memcpy(panel_regulator_settings,
360 dcdc_regulator_settings_lpm, REGULATOR_SIZE);
Padmanabhan Komanduru9d49f892015-04-10 12:58:46 -0700361 pinfo->pipe_type = MDSS_MDP_PIPE_TYPE_RGB;
362 return init_panel_data(panelstruct, pinfo, phy_db);
363}