blob: 9a4658e4a1c210fa9f4ce82f4ddf1e737448c3ed [file] [log] [blame]
Padmanabhan Komanduru0104a892016-01-22 16:58:10 +05301/* Copyright (c) 2016, 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 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"
Mao Flynn5ecc8c92016-01-29 14:06:10 +080053
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,
Padmanabhan Komanduru0104a892016-01-22 16:58:10 +053064 UNKNOWN_PANEL
65};
66
67/*
68 * The list of panels that are supported on this target.
69 * Any panel in this list can be selected using fastboot oem command.
70 */
71static struct panel_list supp_panels[] = {
72 {"truly_1080p_video", TRULY_1080P_VIDEO_PANEL},
73 {"truly_1080p_cmd", TRULY_1080P_CMD_PANEL},
Mao Flynn5ecc8c92016-01-29 14:06:10 +080074 {"r69006_1080p_video", R69006_1080P_VIDEO_PANEL},
75 {"r69006_1080p_cmd", R69006_1080P_CMD_PANEL},
Padmanabhan Komanduru52567fb2016-02-03 16:03:13 +053076 {"truly_wuxga_video", TRULY_WUXGA_VIDEO_PANEL},
Padmanabhan Komanduru0104a892016-01-22 16:58:10 +053077};
78
79static uint32_t panel_id;
80
81int oem_panel_rotation()
82{
83 return NO_ERROR;
84}
85
86#define TRULY_1080P_PANEL_ON_DELAY 40
87int oem_panel_on()
88{
89 if (panel_id == TRULY_1080P_CMD_PANEL ||
90 panel_id == TRULY_1080P_VIDEO_PANEL)
91 mdelay(TRULY_1080P_PANEL_ON_DELAY);
Mao Flynn5ecc8c92016-01-29 14:06:10 +080092 else if (panel_id == R69006_1080P_CMD_PANEL) {
93 mdelay(R69006_1080P_CMD_PANEL_ON_DELAY);
94 }
Padmanabhan Komanduru0104a892016-01-22 16:58:10 +053095
96 return NO_ERROR;
97}
98
99int oem_panel_off()
100{
101 /* OEM can keep their panel specific off instructions
102 * in this function
103 */
104 return NO_ERROR;
105}
106
107static int init_panel_data(struct panel_struct *panelstruct,
108 struct msm_panel_info *pinfo,
109 struct mdss_dsi_phy_ctrl *phy_db)
110{
111 int pan_type = PANEL_TYPE_DSI;
112
113 switch (panel_id) {
114 case TRULY_1080P_VIDEO_PANEL:
115 panelstruct->paneldata = &truly_1080p_video_panel_data;
Padmanabhan Komanduruc2a81e92016-02-03 16:00:42 +0530116 panelstruct->paneldata->panel_with_enable_gpio = 0;
Padmanabhan Komanduru0104a892016-01-22 16:58:10 +0530117 panelstruct->panelres = &truly_1080p_video_panel_res;
118 panelstruct->color = &truly_1080p_video_color;
119 panelstruct->videopanel = &truly_1080p_video_video_panel;
120 panelstruct->commandpanel = &truly_1080p_video_command_panel;
121 panelstruct->state = &truly_1080p_video_state;
122 panelstruct->laneconfig = &truly_1080p_video_lane_config;
123 panelstruct->paneltiminginfo
124 = &truly_1080p_video_timing_info;
125 panelstruct->panelresetseq
126 = &truly_1080p_video_panel_reset_seq;
127 panelstruct->backlightinfo = &truly_1080p_video_backlight;
128 pinfo->mipi.panel_on_cmds
129 = truly_1080p_video_on_command;
130 pinfo->mipi.num_of_panel_on_cmds
131 = TRULY_1080P_VIDEO_ON_COMMAND;
132 pinfo->mipi.panel_off_cmds
133 = truly_1080p_video_off_command;
134 pinfo->mipi.num_of_panel_off_cmds
135 = TRULY_1080P_VIDEO_OFF_COMMAND;
136 memcpy(phy_db->timing,
137 truly_1080p_14nm_video_timings,
138 MAX_TIMING_CONFIG * sizeof(uint32_t));
Padmanabhan Komanduru6f0b6322016-01-22 16:37:53 +0530139 pinfo->dfps.panel_dfps = truly_1080p_video_dfps;
Padmanabhan Komanduru0104a892016-01-22 16:58:10 +0530140 pinfo->mipi.signature = TRULY_1080P_VIDEO_SIGNATURE;
141 break;
142 case TRULY_1080P_CMD_PANEL:
143 panelstruct->paneldata = &truly_1080p_cmd_panel_data;
Padmanabhan Komanduruc2a81e92016-02-03 16:00:42 +0530144 panelstruct->paneldata->panel_with_enable_gpio = 0;
Padmanabhan Komanduru0104a892016-01-22 16:58:10 +0530145 panelstruct->panelres = &truly_1080p_cmd_panel_res;
146 panelstruct->color = &truly_1080p_cmd_color;
147 panelstruct->videopanel = &truly_1080p_cmd_video_panel;
148 panelstruct->commandpanel = &truly_1080p_cmd_command_panel;
149 panelstruct->state = &truly_1080p_cmd_state;
150 panelstruct->laneconfig = &truly_1080p_cmd_lane_config;
151 panelstruct->paneltiminginfo
152 = &truly_1080p_cmd_timing_info;
153 panelstruct->panelresetseq
154 = &truly_1080p_cmd_panel_reset_seq;
155 panelstruct->backlightinfo = &truly_1080p_cmd_backlight;
156 pinfo->mipi.panel_on_cmds
157 = truly_1080p_cmd_on_command;
158 pinfo->mipi.num_of_panel_on_cmds
159 = TRULY_1080P_CMD_ON_COMMAND;
160 pinfo->mipi.panel_off_cmds
161 = truly_1080p_cmd_off_command;
162 pinfo->mipi.num_of_panel_off_cmds
163 = TRULY_1080P_CMD_OFF_COMMAND;
164 memcpy(phy_db->timing,
165 truly_1080p_14nm_cmd_timings,
166 MAX_TIMING_CONFIG * sizeof(uint32_t));
167 pinfo->mipi.signature = TRULY_1080P_CMD_SIGNATURE;
168 break;
Mao Flynn5ecc8c92016-01-29 14:06:10 +0800169 case R69006_1080P_VIDEO_PANEL:
170 panelstruct->paneldata = &r69006_1080p_video_panel_data;
171 panelstruct->panelres = &r69006_1080p_video_panel_res;
172 panelstruct->color = &r69006_1080p_video_color;
173 panelstruct->videopanel = &r69006_1080p_video_video_panel;
174 panelstruct->commandpanel = &r69006_1080p_video_command_panel;
175 panelstruct->state = &r69006_1080p_video_state;
176 panelstruct->laneconfig = &r69006_1080p_video_lane_config;
177 panelstruct->paneltiminginfo
178 = &r69006_1080p_video_timing_info;
179 panelstruct->panelresetseq
180 = &r69006_1080p_video_reset_seq;
181 panelstruct->backlightinfo = &r69006_1080p_video_backlight;
182 pinfo->labibb = &r69006_1080p_video_labibb;
183 pinfo->mipi.panel_on_cmds
184 = r69006_1080p_video_on_command;
185 pinfo->mipi.num_of_panel_on_cmds
186 = R69006_1080P_VIDEO_ON_COMMAND;
187 pinfo->mipi.panel_off_cmds
188 = r69006_1080p_video_off_command;
189 pinfo->mipi.num_of_panel_off_cmds
190 = R69006_1080P_VIDEO_OFF_COMMAND;
191 memcpy(phy_db->timing,
192 r69006_1080p_14nm_video_timings,
193 MAX_TIMING_CONFIG * sizeof(uint32_t));
194 pinfo->mipi.signature = R69006_1080P_VIDEO_SIGNATURE;
195 break;
196 case R69006_1080P_CMD_PANEL:
197 panelstruct->paneldata = &r69006_1080p_cmd_panel_data;
198 panelstruct->panelres = &r69006_1080p_cmd_panel_res;
199 panelstruct->color = &r69006_1080p_cmd_color;
200 panelstruct->videopanel = &r69006_1080p_cmd_video_panel;
201 panelstruct->commandpanel = &r69006_1080p_cmd_command_panel;
202 panelstruct->state = &r69006_1080p_cmd_state;
203 panelstruct->laneconfig = &r69006_1080p_cmd_lane_config;
204 panelstruct->paneltiminginfo
205 = &r69006_1080p_cmd_timing_info;
206 panelstruct->panelresetseq
207 = &r69006_1080p_cmd_reset_seq;
208 panelstruct->backlightinfo = &r69006_1080p_cmd_backlight;
209 pinfo->labibb = &r69006_1080p_cmd_labibb;
210 pinfo->mipi.panel_on_cmds
211 = r69006_1080p_cmd_on_command;
212 pinfo->mipi.num_of_panel_on_cmds
213 = R69006_1080P_CMD_ON_COMMAND;
214 pinfo->mipi.panel_off_cmds
215 = r69006_1080p_cmd_off_command;
216 pinfo->mipi.num_of_panel_off_cmds
217 = R69006_1080P_CMD_OFF_COMMAND;
218 memcpy(phy_db->timing,
219 r69006_1080p_14nm_cmd_timings,
220 MAX_TIMING_CONFIG * sizeof(uint32_t));
221 pinfo->mipi.signature = R69006_1080P_CMD_SIGNATURE;
222 pinfo->mipi.tx_eot_append = true;
223 pinfo->mipi.rx_eot_ignore = true;
224 break;
Padmanabhan Komanduru52567fb2016-02-03 16:03:13 +0530225 case TRULY_WUXGA_VIDEO_PANEL:
226 panelstruct->paneldata = &truly_wuxga_video_panel_data;
227 panelstruct->paneldata->panel_with_enable_gpio = 1;
228 panelstruct->panelres = &truly_wuxga_video_panel_res;
229 panelstruct->color = &truly_wuxga_video_color;
230 panelstruct->videopanel = &truly_wuxga_video_video_panel;
231 panelstruct->commandpanel = &truly_wuxga_video_command_panel;
232 panelstruct->state = &truly_wuxga_video_state;
233 panelstruct->laneconfig = &truly_wuxga_video_lane_config;
234 panelstruct->paneltiminginfo
235 = &truly_wuxga_video_timing_info;
236 panelstruct->panelresetseq
237 = &truly_wuxga_video_panel_reset_seq;
238 panelstruct->backlightinfo = &truly_wuxga_video_backlight;
239 pinfo->mipi.panel_on_cmds
240 = truly_wuxga_video_on_command;
241 pinfo->mipi.num_of_panel_on_cmds
242 = TRULY_WUXGA_VIDEO_ON_COMMAND;
243 pinfo->mipi.panel_off_cmds
244 = truly_wuxga_video_off_command;
245 pinfo->mipi.num_of_panel_off_cmds
246 = TRULY_WUXGA_VIDEO_OFF_COMMAND;
247 memcpy(phy_db->timing,
248 truly_wuxga_14nm_video_timings, MAX_TIMING_CONFIG * sizeof(uint32_t));
Vishnuvardhan Prodduturi154d9452016-02-22 16:13:49 +0530249 pinfo->dfps.panel_dfps = truly_wuxga_video_dfps;
Padmanabhan Komanduru52567fb2016-02-03 16:03:13 +0530250 pinfo->mipi.signature = TRULY_WUXGA_VIDEO_SIGNATURE;
251 break;
Padmanabhan Komanduru0104a892016-01-22 16:58:10 +0530252 case UNKNOWN_PANEL:
253 default:
254 memset(panelstruct, 0, sizeof(struct panel_struct));
255 memset(pinfo->mipi.panel_on_cmds, 0,
256 sizeof(struct mipi_dsi_cmd));
257 pinfo->mipi.num_of_panel_on_cmds = 0;
258 memset(pinfo->mipi.panel_off_cmds, 0,
259 sizeof(struct mipi_dsi_cmd));
260 pinfo->mipi.num_of_panel_off_cmds = 0;
261 memset(phy_db->timing, 0, TIMING_SIZE);
262 pan_type = PANEL_TYPE_UNKNOWN;
263 break;
264 }
265 return pan_type;
266}
267
268#define DISPLAY_MAX_PANEL_DETECTION 2
269
270uint32_t oem_panel_max_auto_detect_panels()
271{
272 return target_panel_auto_detect_enabled() ?
273 DISPLAY_MAX_PANEL_DETECTION : 0;
274}
275
276int oem_panel_select(const char *panel_name, struct panel_struct *panelstruct,
277 struct msm_panel_info *pinfo,
278 struct mdss_dsi_phy_ctrl *phy_db)
279{
280 uint32_t hw_id = board_hardware_id();
281 int32_t panel_override_id;
282 phy_db->pll_type = DSI_PLL_TYPE_THULIUM;
283
284 if (panel_name) {
285 panel_override_id = panel_name_to_id(supp_panels,
286 ARRAY_SIZE(supp_panels), panel_name);
287
288 if (panel_override_id < 0) {
289 dprintf(CRITICAL, "Not able to search the panel:%s\n",
290 panel_name + strspn(panel_name, " "));
291 } else if (panel_override_id < UNKNOWN_PANEL) {
292 /* panel override using fastboot oem command */
293 panel_id = panel_override_id;
294
295 dprintf(INFO, "OEM panel override:%s\n",
296 panel_name + strspn(panel_name, " "));
297 goto panel_init;
298 }
299 }
300
301 switch (hw_id) {
302 case HW_PLATFORM_MTP:
303 case HW_PLATFORM_SURF:
304 case HW_PLATFORM_RCM:
305 panel_id = TRULY_1080P_VIDEO_PANEL;
306 break;
Mao Flynn5ecc8c92016-01-29 14:06:10 +0800307 case HW_PLATFORM_QRD:
308 panel_id = R69006_1080P_CMD_PANEL;
309 break;
Padmanabhan Komanduru0104a892016-01-22 16:58:10 +0530310 default:
311 dprintf(CRITICAL, "Display not enabled for %d HW type\n",
312 hw_id);
313 return PANEL_TYPE_UNKNOWN;
314 }
315
316panel_init:
317 /*
318 * Update all data structures after 'panel_init' label. Only panel
319 * selection is supposed to happen before that.
320 */
321 pinfo->pipe_type = MDSS_MDP_PIPE_TYPE_RGB;
322 return init_panel_data(panelstruct, pinfo, phy_db);
323}