blob: 18733a02e9cfb908b3987e1d8b3269e11907d713 [file] [log] [blame]
Shivaraj Shetty25b0aa02013-10-30 20:55:49 +05301/* Copyright (c) 2013-2014, The Linux Foundation. All rights reserved.
Dhaval Patel8ae0bbd2013-08-15 15:45:01 -07002 *
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 <err.h>
32#include <smem.h>
33#include <msm_panel.h>
34#include <board.h>
35#include <mipi_dsi.h>
36
37#include "include/panel.h"
38#include "panel_display.h"
39
40/*---------------------------------------------------------------------------*/
41/* GCDB Panel Database */
42/*---------------------------------------------------------------------------*/
43#include "include/panel_truly_wvga_cmd.h"
44#include "include/panel_truly_wvga_video.h"
shuoybca66752013-09-03 18:17:21 +080045#include "include/panel_hx8379a_wvga_video.h"
shuoyec420a72013-10-22 09:38:06 +080046#include "include/panel_hx8389b_qhd_video.h"
shuoybca66752013-09-03 18:17:21 +080047#include "include/panel_otm8018b_fwvga_video.h"
48#include "include/panel_nt35590_720p_video.h"
Dhaval Patel8ae0bbd2013-08-15 15:45:01 -070049
Shivaraj Shetty25b0aa02013-10-30 20:55:49 +053050/* Number of dectectable panels */
51#define DISPLAY_MAX_PANEL_DETECTION 2
52
Dhaval Patel8ae0bbd2013-08-15 15:45:01 -070053/*---------------------------------------------------------------------------*/
54/* static panel selection variable */
55/*---------------------------------------------------------------------------*/
56enum {
57TRULY_WVGA_CMD_PANEL,
58TRULY_WVGA_VIDEO_PANEL,
shuoybca66752013-09-03 18:17:21 +080059HX8379A_WVGA_VIDEO_PANEL,
shuoybca66752013-09-03 18:17:21 +080060NT35590_720P_VIDEO_PANEL,
shuoyec420a72013-10-22 09:38:06 +080061HX8389B_QHD_VIDEO_PANEL,
Shivaraj Shetty25b0aa02013-10-30 20:55:49 +053062OTM8018B_FWVGA_VIDEO_PANEL,
63UNKNOWN_PANEL
shuoyec420a72013-10-22 09:38:06 +080064};
65
66enum {
67QRD_DEF,
68QRD_SKUAA,
69QRD_SKUAB = 3,
Dhaval Patel8ae0bbd2013-08-15 15:45:01 -070070};
71
72static uint32_t panel_id;
73
74int oem_panel_rotation()
75{
76 /* OEM can keep there panel spefic on instructions in this
77 function */
78 return NO_ERROR;
79}
80
81
82int oem_panel_on()
83{
84 /* OEM can keep there panel spefic on instructions in this
85 function */
86 return NO_ERROR;
87}
88
89int oem_panel_off()
90{
91 /* OEM can keep there panel spefic off instructions in this
92 function */
93 return NO_ERROR;
94}
95
Kuogee Hsieh80b8a6c2014-06-09 17:25:38 -070096static int init_panel_data(struct panel_struct *panelstruct,
Dhaval Patel8ae0bbd2013-08-15 15:45:01 -070097 struct msm_panel_info *pinfo,
98 struct mdss_dsi_phy_ctrl *phy_db)
99{
Kuogee Hsieh80b8a6c2014-06-09 17:25:38 -0700100 int pan_type = PANEL_TYPE_DSI;
101
Dhaval Patel8ae0bbd2013-08-15 15:45:01 -0700102 switch (panel_id) {
103 case TRULY_WVGA_CMD_PANEL:
104 panelstruct->paneldata = &truly_wvga_cmd_panel_data;
105 panelstruct->panelres = &truly_wvga_cmd_panel_res;
106 panelstruct->color = &truly_wvga_cmd_color;
107 panelstruct->videopanel = &truly_wvga_cmd_video_panel;
108 panelstruct->commandpanel = &truly_wvga_cmd_command_panel;
109 panelstruct->state = &truly_wvga_cmd_state;
110 panelstruct->laneconfig = &truly_wvga_cmd_lane_config;
111 panelstruct->paneltiminginfo
112 = &truly_wvga_cmd_timing_info;
shuoybca66752013-09-03 18:17:21 +0800113 panelstruct->panelresetseq
114 = &truly_wvga_cmd_reset_seq;
Dhaval Patel8ae0bbd2013-08-15 15:45:01 -0700115 panelstruct->backlightinfo = &truly_wvga_cmd_backlight;
Padmanabhan Komandurub3d31842014-11-04 15:47:53 +0530116 pinfo->mipi.panel_on_cmds
Dhaval Patel8ae0bbd2013-08-15 15:45:01 -0700117 = truly_wvga_cmd_on_command;
Padmanabhan Komandurub3d31842014-11-04 15:47:53 +0530118 pinfo->mipi.num_of_panel_on_cmds
Dhaval Patel8ae0bbd2013-08-15 15:45:01 -0700119 = TRULY_WVGA_CMD_ON_COMMAND;
Padmanabhan Komandurub3d31842014-11-04 15:47:53 +0530120 pinfo->mipi.panel_off_cmds
121 = truly_wvga_cmd_off_command;
122 pinfo->mipi.num_of_panel_off_cmds
123 = TRULY_WVGA_CMD_OFF_COMMAND;
Dhaval Patel8ae0bbd2013-08-15 15:45:01 -0700124 memcpy(phy_db->timing,
125 truly_wvga_cmd_timings, TIMING_SIZE);
126 break;
127 case TRULY_WVGA_VIDEO_PANEL:
128 panelstruct->paneldata = &truly_wvga_video_panel_data;
129 panelstruct->panelres = &truly_wvga_video_panel_res;
130 panelstruct->color = &truly_wvga_video_color;
131 panelstruct->videopanel = &truly_wvga_video_video_panel;
132 panelstruct->commandpanel = &truly_wvga_video_command_panel;
133 panelstruct->state = &truly_wvga_video_state;
134 panelstruct->laneconfig = &truly_wvga_video_lane_config;
135 panelstruct->paneltiminginfo
136 = &truly_wvga_video_timing_info;
shuoybca66752013-09-03 18:17:21 +0800137 panelstruct->panelresetseq
138 = &truly_wvga_video_reset_seq;
Dhaval Patel8ae0bbd2013-08-15 15:45:01 -0700139 panelstruct->backlightinfo = &truly_wvga_video_backlight;
Padmanabhan Komandurub3d31842014-11-04 15:47:53 +0530140 pinfo->mipi.panel_on_cmds
Dhaval Patel8ae0bbd2013-08-15 15:45:01 -0700141 = truly_wvga_video_on_command;
Padmanabhan Komandurub3d31842014-11-04 15:47:53 +0530142 pinfo->mipi.num_of_panel_on_cmds
Dhaval Patel8ae0bbd2013-08-15 15:45:01 -0700143 = TRULY_WVGA_VIDEO_ON_COMMAND;
Padmanabhan Komandurub3d31842014-11-04 15:47:53 +0530144 pinfo->mipi.panel_off_cmds
145 = truly_wvga_video_off_command;
146 pinfo->mipi.num_of_panel_off_cmds
147 = TRULY_WVGA_VIDEO_OFF_COMMAND;
Dhaval Patel8ae0bbd2013-08-15 15:45:01 -0700148 memcpy(phy_db->timing,
149 truly_wvga_video_timings, TIMING_SIZE);
150 break;
shuoybca66752013-09-03 18:17:21 +0800151 case HX8379A_WVGA_VIDEO_PANEL:
152 panelstruct->paneldata = &hx8379a_wvga_video_panel_data;
153 panelstruct->panelres = &hx8379a_wvga_video_panel_res;
154 panelstruct->color = &hx8379a_wvga_video_color;
155 panelstruct->videopanel = &hx8379a_wvga_video_video_panel;
156 panelstruct->commandpanel = &hx8379a_wvga_video_command_panel;
157 panelstruct->state = &hx8379a_wvga_video_state;
158 panelstruct->laneconfig = &hx8379a_wvga_video_lane_config;
159 panelstruct->paneltiminginfo
160 = &hx8379a_wvga_video_timing_info;
161 panelstruct->panelresetseq
162 = &hx8379a_wvga_video_reset_seq;
163 panelstruct->backlightinfo = &hx8379a_wvga_video_backlight;
Padmanabhan Komandurub3d31842014-11-04 15:47:53 +0530164 pinfo->mipi.panel_on_cmds
shuoybca66752013-09-03 18:17:21 +0800165 = hx8379a_wvga_video_on_command;
Padmanabhan Komandurub3d31842014-11-04 15:47:53 +0530166 pinfo->mipi.num_of_panel_on_cmds
shuoybca66752013-09-03 18:17:21 +0800167 = HX8379A_WVGA_VIDEO_ON_COMMAND;
Padmanabhan Komandurub3d31842014-11-04 15:47:53 +0530168 pinfo->mipi.panel_off_cmds
169 = hx8379a_wvga_video_off_command;
170 pinfo->mipi.num_of_panel_off_cmds
171 = HX8379A_WVGA_VIDEO_OFF_COMMAND;
shuoybca66752013-09-03 18:17:21 +0800172 memcpy(phy_db->timing,
173 hx8379a_wvga_video_timings, TIMING_SIZE);
174 break;
175 case OTM8018B_FWVGA_VIDEO_PANEL:
176 panelstruct->paneldata = &otm8018b_fwvga_video_panel_data;
177 panelstruct->panelres = &otm8018b_fwvga_video_panel_res;
178 panelstruct->color = &otm8018b_fwvga_video_color;
179 panelstruct->videopanel = &otm8018b_fwvga_video_video_panel;
180 panelstruct->commandpanel = &otm8018b_fwvga_video_command_panel;
181 panelstruct->state = &otm8018b_fwvga_video_state;
182 panelstruct->laneconfig = &otm8018b_fwvga_video_lane_config;
183 panelstruct->paneltiminginfo
184 = &otm8018b_fwvga_video_timing_info;
185 panelstruct->panelresetseq
186 = &otm8018b_fwvga_video_reset_seq;
187 panelstruct->backlightinfo = &otm8018b_fwvga_video_backlight;
Padmanabhan Komandurub3d31842014-11-04 15:47:53 +0530188 pinfo->mipi.panel_on_cmds
shuoybca66752013-09-03 18:17:21 +0800189 = otm8018b_fwvga_video_on_command;
Padmanabhan Komandurub3d31842014-11-04 15:47:53 +0530190 pinfo->mipi.num_of_panel_on_cmds
shuoybca66752013-09-03 18:17:21 +0800191 = OTM8018B_FWVGA_VIDEO_ON_COMMAND;
Padmanabhan Komandurub3d31842014-11-04 15:47:53 +0530192 pinfo->mipi.panel_off_cmds
193 = otm8018b_fwvga_video_off_command;
194 pinfo->mipi.num_of_panel_off_cmds
195 = OTM8018B_FWVGA_VIDEO_OFF_COMMAND;
shuoybca66752013-09-03 18:17:21 +0800196 memcpy(phy_db->timing,
197 otm8018b_fwvga_video_timings, TIMING_SIZE);
198 break;
199 case NT35590_720P_VIDEO_PANEL:
200 panelstruct->paneldata = &nt35590_720p_video_panel_data;
201 panelstruct->panelres = &nt35590_720p_video_panel_res;
202 panelstruct->color = &nt35590_720p_video_color;
203 panelstruct->videopanel = &nt35590_720p_video_video_panel;
204 panelstruct->commandpanel = &nt35590_720p_video_command_panel;
205 panelstruct->state = &nt35590_720p_video_state;
206 panelstruct->laneconfig = &nt35590_720p_video_lane_config;
207 panelstruct->paneltiminginfo
208 = &nt35590_720p_video_timing_info;
209 panelstruct->panelresetseq
210 = &nt35590_720p_video_panel_reset_seq;
211 panelstruct->backlightinfo = &nt35590_720p_video_backlight;
Padmanabhan Komandurub3d31842014-11-04 15:47:53 +0530212 pinfo->mipi.panel_on_cmds
shuoybca66752013-09-03 18:17:21 +0800213 = nt35590_720p_video_on_command;
Padmanabhan Komandurub3d31842014-11-04 15:47:53 +0530214 pinfo->mipi.num_of_panel_on_cmds
shuoybca66752013-09-03 18:17:21 +0800215 = NT35590_720P_VIDEO_ON_COMMAND;
Padmanabhan Komandurub3d31842014-11-04 15:47:53 +0530216 pinfo->mipi.panel_off_cmds
217 = nt35590_720p_video_off_command;
218 pinfo->mipi.num_of_panel_off_cmds
219 = NT35590_720P_VIDEO_OFF_COMMAND;
shuoybca66752013-09-03 18:17:21 +0800220 memcpy(phy_db->timing,
221 nt35590_720p_video_timings, TIMING_SIZE);
222 break;
shuoyec420a72013-10-22 09:38:06 +0800223 case HX8389B_QHD_VIDEO_PANEL:
224 panelstruct->paneldata = &hx8389b_qhd_video_panel_data;
225 panelstruct->panelres = &hx8389b_qhd_video_panel_res;
226 panelstruct->color = &hx8389b_qhd_video_color;
227 panelstruct->videopanel = &hx8389b_qhd_video_video_panel;
228 panelstruct->commandpanel = &hx8389b_qhd_video_command_panel;
229 panelstruct->state = &hx8389b_qhd_video_state;
230 panelstruct->laneconfig = &hx8389b_qhd_video_lane_config;
231 panelstruct->paneltiminginfo
232 = &hx8389b_qhd_video_timing_info;
233 panelstruct->panelresetseq
234 = &hx8389b_qhd_video_reset_seq;
235 panelstruct->backlightinfo = &hx8389b_qhd_video_backlight;
Padmanabhan Komandurub3d31842014-11-04 15:47:53 +0530236 pinfo->mipi.panel_on_cmds
shuoyec420a72013-10-22 09:38:06 +0800237 = hx8389b_qhd_video_on_command;
Padmanabhan Komandurub3d31842014-11-04 15:47:53 +0530238 pinfo->mipi.num_of_panel_on_cmds
shuoyec420a72013-10-22 09:38:06 +0800239 = HX8389B_QHD_VIDEO_ON_COMMAND;
Padmanabhan Komandurub3d31842014-11-04 15:47:53 +0530240 pinfo->mipi.panel_off_cmds
241 = hx8389b_qhd_video_off_command;
242 pinfo->mipi.num_of_panel_off_cmds
243 = HX8389B_QHD_VIDEO_OFF_COMMAND;
shuoyec420a72013-10-22 09:38:06 +0800244 memcpy(phy_db->timing,
245 hx8389b_qhd_video_timings, TIMING_SIZE);
246 break;
Shivaraj Shetty25b0aa02013-10-30 20:55:49 +0530247 case UNKNOWN_PANEL:
248 memset(panelstruct, 0, sizeof(struct panel_struct));
Padmanabhan Komandurub3d31842014-11-04 15:47:53 +0530249 memset(pinfo->mipi.panel_on_cmds, 0,
250 sizeof(struct mipi_dsi_cmd));
251 pinfo->mipi.num_of_panel_on_cmds = 0;
252 memset(pinfo->mipi.panel_off_cmds, 0,
253 sizeof(struct mipi_dsi_cmd));
254 pinfo->mipi.num_of_panel_off_cmds = 0;
Shivaraj Shetty25b0aa02013-10-30 20:55:49 +0530255 memset(phy_db->timing, 0, TIMING_SIZE);
256 pinfo->mipi.signature = 0;
257 dprintf(CRITICAL, "Unknown Panel");
Kuogee Hsieh80b8a6c2014-06-09 17:25:38 -0700258 return PANEL_TYPE_UNKNOWN;
Dhaval Patel8ae0bbd2013-08-15 15:45:01 -0700259 default:
260 dprintf(CRITICAL, "Panel ID not detected %d\n", panel_id);
Kuogee Hsieh80b8a6c2014-06-09 17:25:38 -0700261 return PANEL_TYPE_UNKNOWN;
Dhaval Patel8ae0bbd2013-08-15 15:45:01 -0700262 }
Kuogee Hsieh80b8a6c2014-06-09 17:25:38 -0700263 return pan_type;
Dhaval Patel8ae0bbd2013-08-15 15:45:01 -0700264}
265
Shivaraj Shetty25b0aa02013-10-30 20:55:49 +0530266uint32_t oem_panel_max_auto_detect_panels()
267{
268 return target_panel_auto_detect_enabled() ?
269 DISPLAY_MAX_PANEL_DETECTION : 0;
270}
271
Kuogee Hsieh80b8a6c2014-06-09 17:25:38 -0700272int oem_panel_select(const char *panel_name, struct panel_struct *panelstruct,
Dhaval Patel8ae0bbd2013-08-15 15:45:01 -0700273 struct msm_panel_info *pinfo,
274 struct mdss_dsi_phy_ctrl *phy_db)
275{
276 uint32_t hw_id = board_hardware_id();
shuoybca66752013-09-03 18:17:21 +0800277 uint32_t platform_subtype = board_hardware_subtype();
shuoyec420a72013-10-22 09:38:06 +0800278 uint32_t target_id = board_target_id();
279
280 target_id = (target_id >> 16) & 0xFF;
Dhaval Patel8ae0bbd2013-08-15 15:45:01 -0700281
282 switch (hw_id) {
283 case HW_PLATFORM_QRD:
shuoyec420a72013-10-22 09:38:06 +0800284 switch (platform_subtype) {
285 case QRD_DEF:
286 case QRD_SKUAA:
287 panel_id = HX8379A_WVGA_VIDEO_PANEL;
288 break;
289 case QRD_SKUAB:
290 if (target_id == 0x1) // 1st HW version
291 panel_id = OTM8018B_FWVGA_VIDEO_PANEL;
292 else if (target_id == 0x2) //2nd HW version
293 panel_id = HX8389B_QHD_VIDEO_PANEL;
294 else
295 dprintf(CRITICAL, "SKUAB Display not enabled for %d type\n",
296 target_id);
297 break;
298 default:
299 dprintf(CRITICAL, "QRD Display not enabled for %d type\n",
300 platform_subtype);
Kuogee Hsieh80b8a6c2014-06-09 17:25:38 -0700301 return PANEL_TYPE_UNKNOWN;
shuoyec420a72013-10-22 09:38:06 +0800302 }
shuoybca66752013-09-03 18:17:21 +0800303 break;
Dhaval Patel8ae0bbd2013-08-15 15:45:01 -0700304 case HW_PLATFORM_MTP:
shuoybca66752013-09-03 18:17:21 +0800305 if (0 == platform_subtype)
306 panel_id = TRULY_WVGA_VIDEO_PANEL;
307 else
308 panel_id = NT35590_720P_VIDEO_PANEL;
309 break;
310
Dhaval Patel8ae0bbd2013-08-15 15:45:01 -0700311 case HW_PLATFORM_SURF:
312 panel_id = TRULY_WVGA_VIDEO_PANEL;
313 break;
314 default:
315 dprintf(CRITICAL, "Display not enabled for %d HW type\n", hw_id);
Kuogee Hsieh80b8a6c2014-06-09 17:25:38 -0700316 return PANEL_TYPE_UNKNOWN;
Dhaval Patel8ae0bbd2013-08-15 15:45:01 -0700317 }
318
319 return init_panel_data(panelstruct, pinfo, phy_db);
320}