blob: 9b59866525593d86ca5ee43f7d940023d63c2df8 [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>
vijay kumar0411ca82014-08-08 17:14:52 +053032#include <string.h>
Dhaval Patel8ae0bbd2013-08-15 15:45:01 -070033#include <smem.h>
34#include <msm_panel.h>
35#include <board.h>
36#include <mipi_dsi.h>
vijay kumar0411ca82014-08-08 17:14:52 +053037#include <target/display.h>
Dhaval Patel8ae0bbd2013-08-15 15:45:01 -070038
39#include "include/panel.h"
40#include "panel_display.h"
41
42/*---------------------------------------------------------------------------*/
43/* GCDB Panel Database */
44/*---------------------------------------------------------------------------*/
45#include "include/panel_truly_wvga_cmd.h"
46#include "include/panel_truly_wvga_video.h"
shuoybca66752013-09-03 18:17:21 +080047#include "include/panel_hx8379a_wvga_video.h"
shuoyec420a72013-10-22 09:38:06 +080048#include "include/panel_hx8389b_qhd_video.h"
shuoybca66752013-09-03 18:17:21 +080049#include "include/panel_otm8018b_fwvga_video.h"
50#include "include/panel_nt35590_720p_video.h"
Dhaval Patel8ae0bbd2013-08-15 15:45:01 -070051
Shivaraj Shetty25b0aa02013-10-30 20:55:49 +053052/* Number of dectectable panels */
53#define DISPLAY_MAX_PANEL_DETECTION 2
54
Dhaval Patel8ae0bbd2013-08-15 15:45:01 -070055/*---------------------------------------------------------------------------*/
56/* static panel selection variable */
57/*---------------------------------------------------------------------------*/
58enum {
59TRULY_WVGA_CMD_PANEL,
60TRULY_WVGA_VIDEO_PANEL,
shuoybca66752013-09-03 18:17:21 +080061HX8379A_WVGA_VIDEO_PANEL,
shuoybca66752013-09-03 18:17:21 +080062NT35590_720P_VIDEO_PANEL,
shuoyec420a72013-10-22 09:38:06 +080063HX8389B_QHD_VIDEO_PANEL,
Shivaraj Shetty25b0aa02013-10-30 20:55:49 +053064OTM8018B_FWVGA_VIDEO_PANEL,
65UNKNOWN_PANEL
shuoyec420a72013-10-22 09:38:06 +080066};
67
68enum {
69QRD_DEF,
70QRD_SKUAA,
71QRD_SKUAB = 3,
Dhaval Patel8ae0bbd2013-08-15 15:45:01 -070072};
73
74static uint32_t panel_id;
75
76int oem_panel_rotation()
77{
78 /* OEM can keep there panel spefic on instructions in this
79 function */
80 return NO_ERROR;
81}
82
83
84int oem_panel_on()
85{
86 /* OEM can keep there panel spefic on instructions in this
87 function */
88 return NO_ERROR;
89}
90
91int oem_panel_off()
92{
93 /* OEM can keep there panel spefic off instructions in this
94 function */
95 return NO_ERROR;
96}
97
Kuogee Hsieh80b8a6c2014-06-09 17:25:38 -070098static int init_panel_data(struct panel_struct *panelstruct,
Dhaval Patel8ae0bbd2013-08-15 15:45:01 -070099 struct msm_panel_info *pinfo,
100 struct mdss_dsi_phy_ctrl *phy_db)
101{
Kuogee Hsieh80b8a6c2014-06-09 17:25:38 -0700102 int pan_type = PANEL_TYPE_DSI;
103
Dhaval Patel8ae0bbd2013-08-15 15:45:01 -0700104 switch (panel_id) {
105 case TRULY_WVGA_CMD_PANEL:
106 panelstruct->paneldata = &truly_wvga_cmd_panel_data;
107 panelstruct->panelres = &truly_wvga_cmd_panel_res;
108 panelstruct->color = &truly_wvga_cmd_color;
109 panelstruct->videopanel = &truly_wvga_cmd_video_panel;
110 panelstruct->commandpanel = &truly_wvga_cmd_command_panel;
111 panelstruct->state = &truly_wvga_cmd_state;
112 panelstruct->laneconfig = &truly_wvga_cmd_lane_config;
113 panelstruct->paneltiminginfo
114 = &truly_wvga_cmd_timing_info;
shuoybca66752013-09-03 18:17:21 +0800115 panelstruct->panelresetseq
116 = &truly_wvga_cmd_reset_seq;
Dhaval Patel8ae0bbd2013-08-15 15:45:01 -0700117 panelstruct->backlightinfo = &truly_wvga_cmd_backlight;
Padmanabhan Komandurub3d31842014-11-04 15:47:53 +0530118 pinfo->mipi.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.num_of_panel_on_cmds
Dhaval Patel8ae0bbd2013-08-15 15:45:01 -0700121 = TRULY_WVGA_CMD_ON_COMMAND;
Padmanabhan Komandurub3d31842014-11-04 15:47:53 +0530122 pinfo->mipi.panel_off_cmds
123 = truly_wvga_cmd_off_command;
124 pinfo->mipi.num_of_panel_off_cmds
125 = TRULY_WVGA_CMD_OFF_COMMAND;
Dhaval Patel8ae0bbd2013-08-15 15:45:01 -0700126 memcpy(phy_db->timing,
127 truly_wvga_cmd_timings, TIMING_SIZE);
128 break;
129 case TRULY_WVGA_VIDEO_PANEL:
130 panelstruct->paneldata = &truly_wvga_video_panel_data;
131 panelstruct->panelres = &truly_wvga_video_panel_res;
132 panelstruct->color = &truly_wvga_video_color;
133 panelstruct->videopanel = &truly_wvga_video_video_panel;
134 panelstruct->commandpanel = &truly_wvga_video_command_panel;
135 panelstruct->state = &truly_wvga_video_state;
136 panelstruct->laneconfig = &truly_wvga_video_lane_config;
137 panelstruct->paneltiminginfo
138 = &truly_wvga_video_timing_info;
shuoybca66752013-09-03 18:17:21 +0800139 panelstruct->panelresetseq
140 = &truly_wvga_video_reset_seq;
Dhaval Patel8ae0bbd2013-08-15 15:45:01 -0700141 panelstruct->backlightinfo = &truly_wvga_video_backlight;
Padmanabhan Komandurub3d31842014-11-04 15:47:53 +0530142 pinfo->mipi.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.num_of_panel_on_cmds
Dhaval Patel8ae0bbd2013-08-15 15:45:01 -0700145 = TRULY_WVGA_VIDEO_ON_COMMAND;
Padmanabhan Komandurub3d31842014-11-04 15:47:53 +0530146 pinfo->mipi.panel_off_cmds
147 = truly_wvga_video_off_command;
148 pinfo->mipi.num_of_panel_off_cmds
149 = TRULY_WVGA_VIDEO_OFF_COMMAND;
Dhaval Patel8ae0bbd2013-08-15 15:45:01 -0700150 memcpy(phy_db->timing,
151 truly_wvga_video_timings, TIMING_SIZE);
152 break;
shuoybca66752013-09-03 18:17:21 +0800153 case HX8379A_WVGA_VIDEO_PANEL:
154 panelstruct->paneldata = &hx8379a_wvga_video_panel_data;
155 panelstruct->panelres = &hx8379a_wvga_video_panel_res;
156 panelstruct->color = &hx8379a_wvga_video_color;
157 panelstruct->videopanel = &hx8379a_wvga_video_video_panel;
158 panelstruct->commandpanel = &hx8379a_wvga_video_command_panel;
159 panelstruct->state = &hx8379a_wvga_video_state;
160 panelstruct->laneconfig = &hx8379a_wvga_video_lane_config;
161 panelstruct->paneltiminginfo
162 = &hx8379a_wvga_video_timing_info;
163 panelstruct->panelresetseq
164 = &hx8379a_wvga_video_reset_seq;
165 panelstruct->backlightinfo = &hx8379a_wvga_video_backlight;
Padmanabhan Komandurub3d31842014-11-04 15:47:53 +0530166 pinfo->mipi.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.num_of_panel_on_cmds
shuoybca66752013-09-03 18:17:21 +0800169 = HX8379A_WVGA_VIDEO_ON_COMMAND;
Padmanabhan Komandurub3d31842014-11-04 15:47:53 +0530170 pinfo->mipi.panel_off_cmds
171 = hx8379a_wvga_video_off_command;
172 pinfo->mipi.num_of_panel_off_cmds
173 = HX8379A_WVGA_VIDEO_OFF_COMMAND;
shuoybca66752013-09-03 18:17:21 +0800174 memcpy(phy_db->timing,
175 hx8379a_wvga_video_timings, TIMING_SIZE);
176 break;
177 case OTM8018B_FWVGA_VIDEO_PANEL:
178 panelstruct->paneldata = &otm8018b_fwvga_video_panel_data;
179 panelstruct->panelres = &otm8018b_fwvga_video_panel_res;
180 panelstruct->color = &otm8018b_fwvga_video_color;
181 panelstruct->videopanel = &otm8018b_fwvga_video_video_panel;
182 panelstruct->commandpanel = &otm8018b_fwvga_video_command_panel;
183 panelstruct->state = &otm8018b_fwvga_video_state;
184 panelstruct->laneconfig = &otm8018b_fwvga_video_lane_config;
185 panelstruct->paneltiminginfo
186 = &otm8018b_fwvga_video_timing_info;
187 panelstruct->panelresetseq
188 = &otm8018b_fwvga_video_reset_seq;
189 panelstruct->backlightinfo = &otm8018b_fwvga_video_backlight;
Padmanabhan Komandurub3d31842014-11-04 15:47:53 +0530190 pinfo->mipi.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.num_of_panel_on_cmds
shuoybca66752013-09-03 18:17:21 +0800193 = OTM8018B_FWVGA_VIDEO_ON_COMMAND;
Padmanabhan Komandurub3d31842014-11-04 15:47:53 +0530194 pinfo->mipi.panel_off_cmds
195 = otm8018b_fwvga_video_off_command;
196 pinfo->mipi.num_of_panel_off_cmds
197 = OTM8018B_FWVGA_VIDEO_OFF_COMMAND;
shuoybca66752013-09-03 18:17:21 +0800198 memcpy(phy_db->timing,
199 otm8018b_fwvga_video_timings, TIMING_SIZE);
200 break;
201 case NT35590_720P_VIDEO_PANEL:
202 panelstruct->paneldata = &nt35590_720p_video_panel_data;
203 panelstruct->panelres = &nt35590_720p_video_panel_res;
204 panelstruct->color = &nt35590_720p_video_color;
205 panelstruct->videopanel = &nt35590_720p_video_video_panel;
206 panelstruct->commandpanel = &nt35590_720p_video_command_panel;
207 panelstruct->state = &nt35590_720p_video_state;
208 panelstruct->laneconfig = &nt35590_720p_video_lane_config;
209 panelstruct->paneltiminginfo
210 = &nt35590_720p_video_timing_info;
211 panelstruct->panelresetseq
212 = &nt35590_720p_video_panel_reset_seq;
213 panelstruct->backlightinfo = &nt35590_720p_video_backlight;
Padmanabhan Komandurub3d31842014-11-04 15:47:53 +0530214 pinfo->mipi.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.num_of_panel_on_cmds
shuoybca66752013-09-03 18:17:21 +0800217 = NT35590_720P_VIDEO_ON_COMMAND;
Padmanabhan Komandurub3d31842014-11-04 15:47:53 +0530218 pinfo->mipi.panel_off_cmds
219 = nt35590_720p_video_off_command;
220 pinfo->mipi.num_of_panel_off_cmds
221 = NT35590_720P_VIDEO_OFF_COMMAND;
shuoybca66752013-09-03 18:17:21 +0800222 memcpy(phy_db->timing,
223 nt35590_720p_video_timings, TIMING_SIZE);
224 break;
shuoyec420a72013-10-22 09:38:06 +0800225 case HX8389B_QHD_VIDEO_PANEL:
226 panelstruct->paneldata = &hx8389b_qhd_video_panel_data;
227 panelstruct->panelres = &hx8389b_qhd_video_panel_res;
228 panelstruct->color = &hx8389b_qhd_video_color;
229 panelstruct->videopanel = &hx8389b_qhd_video_video_panel;
230 panelstruct->commandpanel = &hx8389b_qhd_video_command_panel;
231 panelstruct->state = &hx8389b_qhd_video_state;
232 panelstruct->laneconfig = &hx8389b_qhd_video_lane_config;
233 panelstruct->paneltiminginfo
234 = &hx8389b_qhd_video_timing_info;
235 panelstruct->panelresetseq
236 = &hx8389b_qhd_video_reset_seq;
237 panelstruct->backlightinfo = &hx8389b_qhd_video_backlight;
Padmanabhan Komandurub3d31842014-11-04 15:47:53 +0530238 pinfo->mipi.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.num_of_panel_on_cmds
shuoyec420a72013-10-22 09:38:06 +0800241 = HX8389B_QHD_VIDEO_ON_COMMAND;
Padmanabhan Komandurub3d31842014-11-04 15:47:53 +0530242 pinfo->mipi.panel_off_cmds
243 = hx8389b_qhd_video_off_command;
244 pinfo->mipi.num_of_panel_off_cmds
245 = HX8389B_QHD_VIDEO_OFF_COMMAND;
shuoyec420a72013-10-22 09:38:06 +0800246 memcpy(phy_db->timing,
247 hx8389b_qhd_video_timings, TIMING_SIZE);
248 break;
Shivaraj Shetty25b0aa02013-10-30 20:55:49 +0530249 case UNKNOWN_PANEL:
250 memset(panelstruct, 0, sizeof(struct panel_struct));
Padmanabhan Komandurub3d31842014-11-04 15:47:53 +0530251 memset(pinfo->mipi.panel_on_cmds, 0,
252 sizeof(struct mipi_dsi_cmd));
253 pinfo->mipi.num_of_panel_on_cmds = 0;
254 memset(pinfo->mipi.panel_off_cmds, 0,
255 sizeof(struct mipi_dsi_cmd));
256 pinfo->mipi.num_of_panel_off_cmds = 0;
Shivaraj Shetty25b0aa02013-10-30 20:55:49 +0530257 memset(phy_db->timing, 0, TIMING_SIZE);
258 pinfo->mipi.signature = 0;
259 dprintf(CRITICAL, "Unknown Panel");
Kuogee Hsieh80b8a6c2014-06-09 17:25:38 -0700260 return PANEL_TYPE_UNKNOWN;
Dhaval Patel8ae0bbd2013-08-15 15:45:01 -0700261 default:
262 dprintf(CRITICAL, "Panel ID not detected %d\n", panel_id);
Kuogee Hsieh80b8a6c2014-06-09 17:25:38 -0700263 return PANEL_TYPE_UNKNOWN;
Dhaval Patel8ae0bbd2013-08-15 15:45:01 -0700264 }
Kuogee Hsieh80b8a6c2014-06-09 17:25:38 -0700265 return pan_type;
Dhaval Patel8ae0bbd2013-08-15 15:45:01 -0700266}
267
Shivaraj Shetty25b0aa02013-10-30 20:55:49 +0530268uint32_t oem_panel_max_auto_detect_panels()
269{
270 return target_panel_auto_detect_enabled() ?
271 DISPLAY_MAX_PANEL_DETECTION : 0;
272}
273
Kuogee Hsieh80b8a6c2014-06-09 17:25:38 -0700274int oem_panel_select(const char *panel_name, struct panel_struct *panelstruct,
Dhaval Patel8ae0bbd2013-08-15 15:45:01 -0700275 struct msm_panel_info *pinfo,
276 struct mdss_dsi_phy_ctrl *phy_db)
277{
278 uint32_t hw_id = board_hardware_id();
shuoybca66752013-09-03 18:17:21 +0800279 uint32_t platform_subtype = board_hardware_subtype();
shuoyec420a72013-10-22 09:38:06 +0800280 uint32_t target_id = board_target_id();
281
282 target_id = (target_id >> 16) & 0xFF;
Dhaval Patel8ae0bbd2013-08-15 15:45:01 -0700283
284 switch (hw_id) {
285 case HW_PLATFORM_QRD:
shuoyec420a72013-10-22 09:38:06 +0800286 switch (platform_subtype) {
287 case QRD_DEF:
288 case QRD_SKUAA:
289 panel_id = HX8379A_WVGA_VIDEO_PANEL;
290 break;
291 case QRD_SKUAB:
292 if (target_id == 0x1) // 1st HW version
293 panel_id = OTM8018B_FWVGA_VIDEO_PANEL;
294 else if (target_id == 0x2) //2nd HW version
295 panel_id = HX8389B_QHD_VIDEO_PANEL;
296 else
297 dprintf(CRITICAL, "SKUAB Display not enabled for %d type\n",
298 target_id);
299 break;
300 default:
301 dprintf(CRITICAL, "QRD Display not enabled for %d type\n",
302 platform_subtype);
Kuogee Hsieh80b8a6c2014-06-09 17:25:38 -0700303 return PANEL_TYPE_UNKNOWN;
shuoyec420a72013-10-22 09:38:06 +0800304 }
shuoybca66752013-09-03 18:17:21 +0800305 break;
Dhaval Patel8ae0bbd2013-08-15 15:45:01 -0700306 case HW_PLATFORM_MTP:
shuoybca66752013-09-03 18:17:21 +0800307 if (0 == platform_subtype)
308 panel_id = TRULY_WVGA_VIDEO_PANEL;
309 else
310 panel_id = NT35590_720P_VIDEO_PANEL;
311 break;
312
Dhaval Patel8ae0bbd2013-08-15 15:45:01 -0700313 case HW_PLATFORM_SURF:
314 panel_id = TRULY_WVGA_VIDEO_PANEL;
315 break;
316 default:
317 dprintf(CRITICAL, "Display not enabled for %d HW type\n", hw_id);
Kuogee Hsieh80b8a6c2014-06-09 17:25:38 -0700318 return PANEL_TYPE_UNKNOWN;
Dhaval Patel8ae0bbd2013-08-15 15:45:01 -0700319 }
320
321 return init_panel_data(panelstruct, pinfo, phy_db);
322}