blob: 1d5ebb15d283ad7865e605f62b5c8ff8de552587 [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"
52
Padmanabhan Komanduru0104a892016-01-22 16:58:10 +053053
54/*---------------------------------------------------------------------------*/
55/* static panel selection variable */
56/*---------------------------------------------------------------------------*/
57enum {
58 TRULY_1080P_VIDEO_PANEL,
59 TRULY_1080P_CMD_PANEL,
Mao Flynn5ecc8c92016-01-29 14:06:10 +080060 R69006_1080P_VIDEO_PANEL,
61 R69006_1080P_CMD_PANEL,
Padmanabhan Komanduru0104a892016-01-22 16:58:10 +053062 UNKNOWN_PANEL
63};
64
65/*
66 * The list of panels that are supported on this target.
67 * Any panel in this list can be selected using fastboot oem command.
68 */
69static struct panel_list supp_panels[] = {
70 {"truly_1080p_video", TRULY_1080P_VIDEO_PANEL},
71 {"truly_1080p_cmd", TRULY_1080P_CMD_PANEL},
Mao Flynn5ecc8c92016-01-29 14:06:10 +080072 {"r69006_1080p_video", R69006_1080P_VIDEO_PANEL},
73 {"r69006_1080p_cmd", R69006_1080P_CMD_PANEL},
Padmanabhan Komanduru0104a892016-01-22 16:58:10 +053074};
75
76static uint32_t panel_id;
77
78int oem_panel_rotation()
79{
80 return NO_ERROR;
81}
82
83#define TRULY_1080P_PANEL_ON_DELAY 40
84int oem_panel_on()
85{
86 if (panel_id == TRULY_1080P_CMD_PANEL ||
87 panel_id == TRULY_1080P_VIDEO_PANEL)
88 mdelay(TRULY_1080P_PANEL_ON_DELAY);
Mao Flynn5ecc8c92016-01-29 14:06:10 +080089 else if (panel_id == R69006_1080P_CMD_PANEL) {
90 mdelay(R69006_1080P_CMD_PANEL_ON_DELAY);
91 }
Padmanabhan Komanduru0104a892016-01-22 16:58:10 +053092
93 return NO_ERROR;
94}
95
96int oem_panel_off()
97{
98 /* OEM can keep their panel specific off instructions
99 * in this function
100 */
101 return NO_ERROR;
102}
103
104static int init_panel_data(struct panel_struct *panelstruct,
105 struct msm_panel_info *pinfo,
106 struct mdss_dsi_phy_ctrl *phy_db)
107{
108 int pan_type = PANEL_TYPE_DSI;
109
110 switch (panel_id) {
111 case TRULY_1080P_VIDEO_PANEL:
112 panelstruct->paneldata = &truly_1080p_video_panel_data;
113 panelstruct->paneldata->panel_with_enable_gpio = 1;
114 panelstruct->panelres = &truly_1080p_video_panel_res;
115 panelstruct->color = &truly_1080p_video_color;
116 panelstruct->videopanel = &truly_1080p_video_video_panel;
117 panelstruct->commandpanel = &truly_1080p_video_command_panel;
118 panelstruct->state = &truly_1080p_video_state;
119 panelstruct->laneconfig = &truly_1080p_video_lane_config;
120 panelstruct->paneltiminginfo
121 = &truly_1080p_video_timing_info;
122 panelstruct->panelresetseq
123 = &truly_1080p_video_panel_reset_seq;
124 panelstruct->backlightinfo = &truly_1080p_video_backlight;
125 pinfo->mipi.panel_on_cmds
126 = truly_1080p_video_on_command;
127 pinfo->mipi.num_of_panel_on_cmds
128 = TRULY_1080P_VIDEO_ON_COMMAND;
129 pinfo->mipi.panel_off_cmds
130 = truly_1080p_video_off_command;
131 pinfo->mipi.num_of_panel_off_cmds
132 = TRULY_1080P_VIDEO_OFF_COMMAND;
133 memcpy(phy_db->timing,
134 truly_1080p_14nm_video_timings,
135 MAX_TIMING_CONFIG * sizeof(uint32_t));
Padmanabhan Komanduru6f0b6322016-01-22 16:37:53 +0530136 pinfo->dfps.panel_dfps = truly_1080p_video_dfps;
Padmanabhan Komanduru0104a892016-01-22 16:58:10 +0530137 pinfo->mipi.signature = TRULY_1080P_VIDEO_SIGNATURE;
138 break;
139 case TRULY_1080P_CMD_PANEL:
140 panelstruct->paneldata = &truly_1080p_cmd_panel_data;
141 panelstruct->paneldata->panel_with_enable_gpio = 1;
142 panelstruct->panelres = &truly_1080p_cmd_panel_res;
143 panelstruct->color = &truly_1080p_cmd_color;
144 panelstruct->videopanel = &truly_1080p_cmd_video_panel;
145 panelstruct->commandpanel = &truly_1080p_cmd_command_panel;
146 panelstruct->state = &truly_1080p_cmd_state;
147 panelstruct->laneconfig = &truly_1080p_cmd_lane_config;
148 panelstruct->paneltiminginfo
149 = &truly_1080p_cmd_timing_info;
150 panelstruct->panelresetseq
151 = &truly_1080p_cmd_panel_reset_seq;
152 panelstruct->backlightinfo = &truly_1080p_cmd_backlight;
153 pinfo->mipi.panel_on_cmds
154 = truly_1080p_cmd_on_command;
155 pinfo->mipi.num_of_panel_on_cmds
156 = TRULY_1080P_CMD_ON_COMMAND;
157 pinfo->mipi.panel_off_cmds
158 = truly_1080p_cmd_off_command;
159 pinfo->mipi.num_of_panel_off_cmds
160 = TRULY_1080P_CMD_OFF_COMMAND;
161 memcpy(phy_db->timing,
162 truly_1080p_14nm_cmd_timings,
163 MAX_TIMING_CONFIG * sizeof(uint32_t));
164 pinfo->mipi.signature = TRULY_1080P_CMD_SIGNATURE;
165 break;
Mao Flynn5ecc8c92016-01-29 14:06:10 +0800166 case R69006_1080P_VIDEO_PANEL:
167 panelstruct->paneldata = &r69006_1080p_video_panel_data;
168 panelstruct->panelres = &r69006_1080p_video_panel_res;
169 panelstruct->color = &r69006_1080p_video_color;
170 panelstruct->videopanel = &r69006_1080p_video_video_panel;
171 panelstruct->commandpanel = &r69006_1080p_video_command_panel;
172 panelstruct->state = &r69006_1080p_video_state;
173 panelstruct->laneconfig = &r69006_1080p_video_lane_config;
174 panelstruct->paneltiminginfo
175 = &r69006_1080p_video_timing_info;
176 panelstruct->panelresetseq
177 = &r69006_1080p_video_reset_seq;
178 panelstruct->backlightinfo = &r69006_1080p_video_backlight;
179 pinfo->labibb = &r69006_1080p_video_labibb;
180 pinfo->mipi.panel_on_cmds
181 = r69006_1080p_video_on_command;
182 pinfo->mipi.num_of_panel_on_cmds
183 = R69006_1080P_VIDEO_ON_COMMAND;
184 pinfo->mipi.panel_off_cmds
185 = r69006_1080p_video_off_command;
186 pinfo->mipi.num_of_panel_off_cmds
187 = R69006_1080P_VIDEO_OFF_COMMAND;
188 memcpy(phy_db->timing,
189 r69006_1080p_14nm_video_timings,
190 MAX_TIMING_CONFIG * sizeof(uint32_t));
191 pinfo->mipi.signature = R69006_1080P_VIDEO_SIGNATURE;
192 break;
193 case R69006_1080P_CMD_PANEL:
194 panelstruct->paneldata = &r69006_1080p_cmd_panel_data;
195 panelstruct->panelres = &r69006_1080p_cmd_panel_res;
196 panelstruct->color = &r69006_1080p_cmd_color;
197 panelstruct->videopanel = &r69006_1080p_cmd_video_panel;
198 panelstruct->commandpanel = &r69006_1080p_cmd_command_panel;
199 panelstruct->state = &r69006_1080p_cmd_state;
200 panelstruct->laneconfig = &r69006_1080p_cmd_lane_config;
201 panelstruct->paneltiminginfo
202 = &r69006_1080p_cmd_timing_info;
203 panelstruct->panelresetseq
204 = &r69006_1080p_cmd_reset_seq;
205 panelstruct->backlightinfo = &r69006_1080p_cmd_backlight;
206 pinfo->labibb = &r69006_1080p_cmd_labibb;
207 pinfo->mipi.panel_on_cmds
208 = r69006_1080p_cmd_on_command;
209 pinfo->mipi.num_of_panel_on_cmds
210 = R69006_1080P_CMD_ON_COMMAND;
211 pinfo->mipi.panel_off_cmds
212 = r69006_1080p_cmd_off_command;
213 pinfo->mipi.num_of_panel_off_cmds
214 = R69006_1080P_CMD_OFF_COMMAND;
215 memcpy(phy_db->timing,
216 r69006_1080p_14nm_cmd_timings,
217 MAX_TIMING_CONFIG * sizeof(uint32_t));
218 pinfo->mipi.signature = R69006_1080P_CMD_SIGNATURE;
219 pinfo->mipi.tx_eot_append = true;
220 pinfo->mipi.rx_eot_ignore = true;
221 break;
Padmanabhan Komanduru0104a892016-01-22 16:58:10 +0530222 case UNKNOWN_PANEL:
223 default:
224 memset(panelstruct, 0, sizeof(struct panel_struct));
225 memset(pinfo->mipi.panel_on_cmds, 0,
226 sizeof(struct mipi_dsi_cmd));
227 pinfo->mipi.num_of_panel_on_cmds = 0;
228 memset(pinfo->mipi.panel_off_cmds, 0,
229 sizeof(struct mipi_dsi_cmd));
230 pinfo->mipi.num_of_panel_off_cmds = 0;
231 memset(phy_db->timing, 0, TIMING_SIZE);
232 pan_type = PANEL_TYPE_UNKNOWN;
233 break;
234 }
235 return pan_type;
236}
237
238#define DISPLAY_MAX_PANEL_DETECTION 2
239
240uint32_t oem_panel_max_auto_detect_panels()
241{
242 return target_panel_auto_detect_enabled() ?
243 DISPLAY_MAX_PANEL_DETECTION : 0;
244}
245
246int oem_panel_select(const char *panel_name, struct panel_struct *panelstruct,
247 struct msm_panel_info *pinfo,
248 struct mdss_dsi_phy_ctrl *phy_db)
249{
250 uint32_t hw_id = board_hardware_id();
251 int32_t panel_override_id;
252 phy_db->pll_type = DSI_PLL_TYPE_THULIUM;
253
254 if (panel_name) {
255 panel_override_id = panel_name_to_id(supp_panels,
256 ARRAY_SIZE(supp_panels), panel_name);
257
258 if (panel_override_id < 0) {
259 dprintf(CRITICAL, "Not able to search the panel:%s\n",
260 panel_name + strspn(panel_name, " "));
261 } else if (panel_override_id < UNKNOWN_PANEL) {
262 /* panel override using fastboot oem command */
263 panel_id = panel_override_id;
264
265 dprintf(INFO, "OEM panel override:%s\n",
266 panel_name + strspn(panel_name, " "));
267 goto panel_init;
268 }
269 }
270
271 switch (hw_id) {
272 case HW_PLATFORM_MTP:
273 case HW_PLATFORM_SURF:
274 case HW_PLATFORM_RCM:
275 panel_id = TRULY_1080P_VIDEO_PANEL;
276 break;
Mao Flynn5ecc8c92016-01-29 14:06:10 +0800277 case HW_PLATFORM_QRD:
278 panel_id = R69006_1080P_CMD_PANEL;
279 break;
Padmanabhan Komanduru0104a892016-01-22 16:58:10 +0530280 default:
281 dprintf(CRITICAL, "Display not enabled for %d HW type\n",
282 hw_id);
283 return PANEL_TYPE_UNKNOWN;
284 }
285
286panel_init:
287 /*
288 * Update all data structures after 'panel_init' label. Only panel
289 * selection is supposed to happen before that.
290 */
291 pinfo->pipe_type = MDSS_MDP_PIPE_TYPE_RGB;
292 return init_panel_data(panelstruct, pinfo, phy_db);
293}