blob: 6de804723d909598946b5a418f9fc4976a18051f [file] [log] [blame]
Ashish Garg1533aa32016-11-01 14:23:05 +05301/* Copyright (c) 2013-2016, The Linux Foundation. All rights reserved.
Dhaval Patelb95039c2015-03-16 11:14:06 -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 <string.h>
32#include <err.h>
33#include <smem.h>
34#include <msm_panel.h>
35#include <board.h>
36#include <mipi_dsi.h>
37#include <qtimer.h>
38#include <platform.h>
39
Ujwal Patel41a665a2015-07-17 13:51:30 -070040#include "gcdb_display.h"
Dhaval Patelb95039c2015-03-16 11:14:06 -070041#include "include/panel.h"
42#include "target/display.h"
43#include "panel_display.h"
Kuogee Hsieh0b492c92015-07-08 13:02:36 -070044#include <mdp5.h>
Siddharth Zaveriacaacc32015-12-12 15:10:33 -050045#include <mipi_dsi_i2c.h>
46#include <blsp_qup.h>
Dhaval Patelb95039c2015-03-16 11:14:06 -070047
48/*---------------------------------------------------------------------------*/
49/* GCDB Panel Database */
50/*---------------------------------------------------------------------------*/
Dhaval Patel989d4fc2015-04-01 19:04:46 -070051#include "include/panel_nt35597_wqxga_dualdsi_video.h"
Kuogee Hsieh9d7e7142015-06-16 10:36:19 -070052#include "include/panel_nt35597_wqxga_dualdsi_cmd.h"
Kuogee Hsieh0b492c92015-07-08 13:02:36 -070053#include "include/panel_nt35597_wqxga_dsc_video.h"
54#include "include/panel_nt35597_wqxga_dsc_cmd.h"
Dhaval Patelb95039c2015-03-16 11:14:06 -070055#include "include/panel_sharp_wqxga_dualdsi_video.h"
56#include "include/panel_jdi_qhd_dualdsi_video.h"
57#include "include/panel_jdi_qhd_dualdsi_cmd.h"
feifanz76fe6482015-09-02 15:25:16 +080058#include "include/panel_r69007_wqxga_cmd.h"
Kuogee Hsiehb976dfc2015-08-28 13:21:30 -070059#include "include/panel_jdi_4k_dualdsi_video_nofbc.h"
Siddharth Zaveriacaacc32015-12-12 15:10:33 -050060#include "include/panel_adv7533_1080p60.h"
61#include "include/panel_adv7533_720p60.h"
62#include "include/panel_hx8379a_truly_fwvga_video.h"
Ashish Garg1533aa32016-11-01 14:23:05 +053063#include "include/panel_truly_1080p_video.h"
64#include "include/panel_truly_1080p_cmd.h"
Dhaval Patelb95039c2015-03-16 11:14:06 -070065
66/*---------------------------------------------------------------------------*/
67/* static panel selection variable */
68/*---------------------------------------------------------------------------*/
69enum {
Kuogee Hsieh0b492c92015-07-08 13:02:36 -070070 SHARP_WQXGA_DUALDSI_VIDEO_PANEL,
Dhaval Patel989d4fc2015-04-01 19:04:46 -070071 NT35597_WQXGA_DUALDSI_VIDEO_PANEL,
Kuogee Hsieh9d7e7142015-06-16 10:36:19 -070072 NT35597_WQXGA_DUALDSI_CMD_PANEL,
Kuogee Hsieh0b492c92015-07-08 13:02:36 -070073 NT35597_WQXGA_DSC_VIDEO_PANEL,
74 NT35597_WQXGA_DSC_CMD_PANEL,
Dhaval Patelb95039c2015-03-16 11:14:06 -070075 JDI_QHD_DUALDSI_VIDEO_PANEL,
76 JDI_QHD_DUALDSI_CMD_PANEL,
feifanz76fe6482015-09-02 15:25:16 +080077 R69007_WQXGA_CMD_PANEL,
Kuogee Hsiehb976dfc2015-08-28 13:21:30 -070078 JDI_4K_DUALDSI_VIDEO_NOFBC_PANEL,
Siddharth Zaveriacaacc32015-12-12 15:10:33 -050079 ADV7533_1080P_VIDEO_PANEL,
80 ADV7533_720P_VIDEO_PANEL,
81 TRULY_FWVGA_VIDEO_PANEL,
Ashish Garg1533aa32016-11-01 14:23:05 +053082 TRULY_1080P_VIDEO_PANEL,
83 TRULY_1080P_CMD_PANEL,
Dhaval Patelb95039c2015-03-16 11:14:06 -070084 UNKNOWN_PANEL
85};
86
87/*
88 * The list of panels that are supported on this target.
89 * Any panel in this list can be selected using fastboot oem command.
90 */
91static struct panel_list supp_panels[] = {
Kuogee Hsieh0b492c92015-07-08 13:02:36 -070092 {"sharp_wqxga_dualdsi_video", SHARP_WQXGA_DUALDSI_VIDEO_PANEL},
Dhaval Patel989d4fc2015-04-01 19:04:46 -070093 {"nt35597_wqxga_dualdsi_video", NT35597_WQXGA_DUALDSI_VIDEO_PANEL},
Kuogee Hsieh9d7e7142015-06-16 10:36:19 -070094 {"nt35597_wqxga_dualdsi_cmd", NT35597_WQXGA_DUALDSI_CMD_PANEL},
Kuogee Hsieh0b492c92015-07-08 13:02:36 -070095 {"nt35597_wqxga_dsc_video", NT35597_WQXGA_DSC_VIDEO_PANEL},
96 {"nt35597_wqxga_dsc_cmd", NT35597_WQXGA_DSC_CMD_PANEL},
Dhaval Patelb95039c2015-03-16 11:14:06 -070097 {"jdi_qhd_dualdsi_video", JDI_QHD_DUALDSI_VIDEO_PANEL},
98 {"jdi_qhd_dualdsi_cmd", JDI_QHD_DUALDSI_CMD_PANEL},
feifanz76fe6482015-09-02 15:25:16 +080099 {"r69007_wqxga_cmd", R69007_WQXGA_CMD_PANEL},
Kuogee Hsiehb976dfc2015-08-28 13:21:30 -0700100 {"jdi_4k_dualdsi_video_nofbc", JDI_4K_DUALDSI_VIDEO_NOFBC_PANEL},
Siddharth Zaveriacaacc32015-12-12 15:10:33 -0500101 {"adv7533_1080p_video", ADV7533_1080P_VIDEO_PANEL},
102 {"adv7533_720p_video", ADV7533_720P_VIDEO_PANEL},
103 {"truly_fwvga_video", TRULY_FWVGA_VIDEO_PANEL},
Ashish Garg1533aa32016-11-01 14:23:05 +0530104 {"truly_1080p_video", TRULY_1080P_VIDEO_PANEL},
105 {"truly_1080p_cmd", TRULY_1080P_CMD_PANEL},
Dhaval Patelb95039c2015-03-16 11:14:06 -0700106};
107
Siddharth Zaveriacaacc32015-12-12 15:10:33 -0500108#define TARGET_ADV7533_MAIN_INST_0 (0x3D)
109#define TARGET_ADV7533_CEC_DSI_INST_0 (0x3E)
110
Dhaval Patelb95039c2015-03-16 11:14:06 -0700111static uint32_t panel_id;
Ashish Garg1533aa32016-11-01 14:23:05 +0530112#define TRULY_1080P_PANEL_ON_DELAY 40
Dhaval Patelb95039c2015-03-16 11:14:06 -0700113
114int oem_panel_rotation()
115{
116 return NO_ERROR;
117}
118
119int oem_panel_on()
120{
121 if (panel_id == JDI_QHD_DUALDSI_CMD_PANEL) {
122 /* needs extra delay to avoid unexpected artifacts */
123 mdelay(JDI_QHD_DUALDSI_CMD_PANEL_ON_DELAY);
feifanz5494bdb2015-10-21 15:45:03 +0800124 } else if (panel_id == R69007_WQXGA_CMD_PANEL) {
125 /* needs extra delay to avoid unexpected artifacts */
126 mdelay(R69007_WQXGA_CMD_PANEL_ON_DELAY);
Ashish Garg1533aa32016-11-01 14:23:05 +0530127 } else if (panel_id == TRULY_1080P_CMD_PANEL ||
128 panel_id == TRULY_1080P_VIDEO_PANEL) {
129 mdelay(TRULY_1080P_PANEL_ON_DELAY);
Dhaval Patelb95039c2015-03-16 11:14:06 -0700130 }
feifanz5494bdb2015-10-21 15:45:03 +0800131
Dhaval Patelb95039c2015-03-16 11:14:06 -0700132 return NO_ERROR;
133}
134
135int oem_panel_off()
136{
137 return NO_ERROR;
138}
139
140static bool init_panel_data(struct panel_struct *panelstruct,
141 struct msm_panel_info *pinfo,
142 struct mdss_dsi_phy_ctrl *phy_db)
143{
144 int pan_type;
Ujwal Patel41a665a2015-07-17 13:51:30 -0700145 struct oem_panel_data *oem_data = mdss_dsi_get_oem_data_ptr();
Dhaval Patelb95039c2015-03-16 11:14:06 -0700146
147 switch (panel_id) {
Ashish Garg1533aa32016-11-01 14:23:05 +0530148 case TRULY_1080P_VIDEO_PANEL:
149 pan_type = PANEL_TYPE_DSI;
150 panelstruct->paneldata = &truly_1080p_video_panel_data;
151 panelstruct->paneldata->panel_with_enable_gpio = 0;
152 panelstruct->panelres = &truly_1080p_video_panel_res;
153 panelstruct->color = &truly_1080p_video_color;
154 panelstruct->videopanel = &truly_1080p_video_video_panel;
155 panelstruct->commandpanel = &truly_1080p_video_command_panel;
156 panelstruct->state = &truly_1080p_video_state;
157 panelstruct->laneconfig = &truly_1080p_video_lane_config;
158 panelstruct->paneltiminginfo
159 = &truly_1080p_video_timing_info;
160 panelstruct->panelresetseq
161 = &truly_1080p_video_panel_reset_seq;
162 panelstruct->backlightinfo = &truly_1080p_video_backlight;
163 pinfo->mipi.panel_on_cmds
164 = truly_1080p_video_on_command;
165 pinfo->mipi.num_of_panel_on_cmds
166 = TRULY_1080P_VIDEO_ON_COMMAND;
167 pinfo->mipi.panel_off_cmds
168 = truly_1080p_video_off_command;
169 pinfo->mipi.num_of_panel_off_cmds
170 = TRULY_1080P_VIDEO_OFF_COMMAND;
171 memcpy(phy_db->timing,
172 truly_1080p_14nm_video_timings,
173 MAX_TIMING_CONFIG * sizeof(uint32_t));
174 pinfo->dfps.panel_dfps = truly_1080p_video_dfps;
175 pinfo->mipi.signature = TRULY_1080P_VIDEO_SIGNATURE;
176 break;
177 case TRULY_1080P_CMD_PANEL:
178 pan_type = PANEL_TYPE_DSI;
179 panelstruct->paneldata = &truly_1080p_cmd_panel_data;
180 panelstruct->paneldata->panel_with_enable_gpio = 0;
181 panelstruct->panelres = &truly_1080p_cmd_panel_res;
182 panelstruct->color = &truly_1080p_cmd_color;
183 panelstruct->videopanel = &truly_1080p_cmd_video_panel;
184 panelstruct->commandpanel = &truly_1080p_cmd_command_panel;
185 panelstruct->state = &truly_1080p_cmd_state;
186 panelstruct->laneconfig = &truly_1080p_cmd_lane_config;
187 panelstruct->paneltiminginfo
188 = &truly_1080p_cmd_timing_info;
189 panelstruct->panelresetseq
190 = &truly_1080p_cmd_panel_reset_seq;
191 panelstruct->backlightinfo = &truly_1080p_cmd_backlight;
192 pinfo->mipi.panel_on_cmds
193 = truly_1080p_cmd_on_command;
194 pinfo->mipi.num_of_panel_on_cmds
195 = TRULY_1080P_CMD_ON_COMMAND;
196 pinfo->mipi.panel_off_cmds
197 = truly_1080p_cmd_off_command;
198 pinfo->mipi.num_of_panel_off_cmds
199 = TRULY_1080P_CMD_OFF_COMMAND;
200 memcpy(phy_db->timing,
201 truly_1080p_14nm_cmd_timings,
202 MAX_TIMING_CONFIG * sizeof(uint32_t));
203 pinfo->mipi.signature = TRULY_1080P_CMD_SIGNATURE;
204 break;
Dhaval Patelb95039c2015-03-16 11:14:06 -0700205 case SHARP_WQXGA_DUALDSI_VIDEO_PANEL:
206 pan_type = PANEL_TYPE_DSI;
207 pinfo->lcd_reg_en = 0;
208 panelstruct->paneldata = &sharp_wqxga_dualdsi_video_panel_data;
Dhaval Patelb95039c2015-03-16 11:14:06 -0700209 panelstruct->paneldata->panel_operating_mode = 11;
210 panelstruct->paneldata->panel_with_enable_gpio = 0;
211
212 panelstruct->panelres = &sharp_wqxga_dualdsi_video_panel_res;
213 panelstruct->color = &sharp_wqxga_dualdsi_video_color;
214 panelstruct->videopanel = &sharp_wqxga_dualdsi_video_video_panel;
215 panelstruct->commandpanel = &sharp_wqxga_dualdsi_video_command_panel;
216 panelstruct->state = &sharp_wqxga_dualdsi_video_state;
217 panelstruct->laneconfig = &sharp_wqxga_dualdsi_video_lane_config;
218 panelstruct->paneltiminginfo
219 = &sharp_wqxga_dualdsi_video_timing_info;
220 panelstruct->panelresetseq
221 = &sharp_wqxga_dualdsi_video_reset_seq;
222 panelstruct->backlightinfo = &sharp_wqxga_dualdsi_video_backlight;
223
224 pinfo->labibb = &sharp_wqxga_dualdsi_video_labibb;
225
226 pinfo->mipi.panel_on_cmds
227 = sharp_wqxga_dualdsi_video_on_command;
228 pinfo->mipi.num_of_panel_on_cmds
229 = SHARP_WQXGA_DUALDSI_VIDEO_ON_COMMAND;
230 pinfo->mipi.panel_off_cmds
231 = sharp_wqxga_dualdsi_video_off_command;
232 pinfo->mipi.num_of_panel_off_cmds
233 = SHARP_WQXGA_DUALDSI_VIDEO_OFF_COMMAND;
234 memcpy(phy_db->timing,
235 sharp_wqxga_dualdsi_thulium_video_timings,
236 MAX_TIMING_CONFIG * sizeof(uint32_t));
Jeevan Shrirama3860092015-08-03 15:16:57 -0700237 pinfo->dfps.panel_dfps = sharp_wqxga_dualdsi_video_dfps;
Dhaval Patelb95039c2015-03-16 11:14:06 -0700238 pinfo->mipi.tx_eot_append = true;
Ujwal Patelf4c6d2d2015-08-12 14:48:02 -0700239
240 /*
241 * remove DUAL_PIPE_FLAG because on this target for this panel,
242 * it will be added based on one of the selected configurations.
243 */
244 panelstruct->paneldata->panel_operating_mode &= ~DUAL_PIPE_FLAG;
245 panelstruct->config = &sharp_wqxga_dualdsi_video_config0;
246 if (oem_data) {
247 switch (oem_data->cfg_num[0]) {
248 case -1: /* default */
249 case 0:
250 panelstruct->config =
251 &sharp_wqxga_dualdsi_video_config0;
252 break;
253 case 1:
254 panelstruct->config =
255 &sharp_wqxga_dualdsi_video_config1;
256 break;
257 default:
258 dprintf(CRITICAL, "topology config%d not supported. fallback to default config0\n",
259 oem_data->cfg_num[0]);
260 panelstruct->config = &sharp_wqxga_dualdsi_video_config0;
261 }
262 }
263 pinfo->lm_split[0] = panelstruct->config->lm_split[0];
264 pinfo->lm_split[1] = panelstruct->config->lm_split[1];
Dhaval Patelb95039c2015-03-16 11:14:06 -0700265 break;
Dhaval Patel989d4fc2015-04-01 19:04:46 -0700266 case NT35597_WQXGA_DUALDSI_VIDEO_PANEL:
267 pan_type = PANEL_TYPE_DSI;
268 pinfo->lcd_reg_en = 0;
269 panelstruct->paneldata = &nt35597_wqxga_dualdsi_video_panel_data;
Dhaval Patel989d4fc2015-04-01 19:04:46 -0700270 panelstruct->panelres = &nt35597_wqxga_dualdsi_video_panel_res;
271 panelstruct->color = &nt35597_wqxga_dualdsi_video_color;
272 panelstruct->videopanel = &nt35597_wqxga_dualdsi_video_video_panel;
273 panelstruct->commandpanel = &nt35597_wqxga_dualdsi_video_command_panel;
274 panelstruct->state = &nt35597_wqxga_dualdsi_video_state;
275 panelstruct->laneconfig = &nt35597_wqxga_dualdsi_video_lane_config;
276 panelstruct->paneltiminginfo
277 = &nt35597_wqxga_dualdsi_video_timing_info;
278 panelstruct->panelresetseq
279 = &nt35597_wqxga_dualdsi_video_reset_seq;
280 panelstruct->backlightinfo = &nt35597_wqxga_dualdsi_video_backlight;
281
282 pinfo->labibb = &nt35597_wqxga_dualdsi_video_labibb;
283
284 pinfo->mipi.panel_on_cmds
285 = nt35597_wqxga_dualdsi_video_on_command;
286 pinfo->mipi.num_of_panel_on_cmds
287 = NT35597_WQXGA_DUALDSI_VIDEO_ON_COMMAND;
288 pinfo->mipi.panel_off_cmds
289 = nt35597_wqxga_dualdsi_video_off_command;
290 pinfo->mipi.num_of_panel_off_cmds
291 = NT35597_WQXGA_DUALDSI_VIDEO_OFF_COMMAND;
292 memcpy(phy_db->timing,
293 nt35597_wqxga_dualdsi_thulium_video_timings,
294 MAX_TIMING_CONFIG * sizeof(uint32_t));
295 pinfo->mipi.tx_eot_append = true;
Ujwal Patelf4c6d2d2015-08-12 14:48:02 -0700296
297 /*
298 * remove DUAL_PIPE_FLAG because on this target for this panel,
299 * it will be added based on one of the selected configurations.
300 */
301 panelstruct->paneldata->panel_operating_mode &= ~DUAL_PIPE_FLAG;
302 panelstruct->config = &nt35597_wqxga_dualdsi_video_config0;
303 if (oem_data) {
304 switch (oem_data->cfg_num[0]) {
305 case -1: /* default */
306 case 0:
307 panelstruct->config =
308 &nt35597_wqxga_dualdsi_video_config0;
309 break;
310 case 1:
311 panelstruct->config =
312 &nt35597_wqxga_dualdsi_video_config1;
313 break;
314 default:
315 dprintf(CRITICAL, "topology config%d not supported. fallback to default config0\n",
316 oem_data->cfg_num[0]);
317 panelstruct->config = &nt35597_wqxga_dualdsi_video_config0;
318 }
319 }
320 pinfo->lm_split[0] = panelstruct->config->lm_split[0];
321 pinfo->lm_split[1] = panelstruct->config->lm_split[1];
Dhaval Patel989d4fc2015-04-01 19:04:46 -0700322 break;
Kuogee Hsieh9d7e7142015-06-16 10:36:19 -0700323 case NT35597_WQXGA_DUALDSI_CMD_PANEL:
324 pan_type = PANEL_TYPE_DSI;
325 pinfo->lcd_reg_en = 0;
326 panelstruct->paneldata = &nt35597_wqxga_dualdsi_cmd_panel_data;
327 panelstruct->panelres = &nt35597_wqxga_dualdsi_cmd_panel_res;
328 panelstruct->color = &nt35597_wqxga_dualdsi_cmd_color;
329 panelstruct->videopanel = &nt35597_wqxga_dualdsi_cmd_video_panel;
330 panelstruct->commandpanel = &nt35597_wqxga_dualdsi_cmd_command_panel;
331 panelstruct->state = &nt35597_wqxga_dualdsi_cmd_state;
332 panelstruct->laneconfig = &nt35597_wqxga_dualdsi_cmd_lane_config;
333 panelstruct->paneltiminginfo
334 = &nt35597_wqxga_dualdsi_cmd_timing_info;
335 panelstruct->panelresetseq
336 = &nt35597_wqxga_dualdsi_cmd_reset_seq;
337 panelstruct->backlightinfo = &nt35597_wqxga_dualdsi_cmd_backlight;
338
339 pinfo->labibb = &nt35597_wqxga_dualdsi_cmd_labibb;
340
341 pinfo->mipi.panel_on_cmds
342 = nt35597_wqxga_dualdsi_cmd_on_command;
343 pinfo->mipi.num_of_panel_on_cmds
344 = NT35597_WQXGA_DUALDSI_CMD_ON_COMMAND;
345 pinfo->mipi.panel_off_cmds
346 = nt35597_wqxga_dualdsi_cmd_off_command;
347 pinfo->mipi.num_of_panel_off_cmds
348 = NT35597_WQXGA_DUALDSI_CMD_OFF_COMMAND;
349 memcpy(phy_db->timing,
350 nt35597_wqxga_dualdsi_thulium_cmd_timings,
351 MAX_TIMING_CONFIG * sizeof(uint32_t));
352 pinfo->mipi.tx_eot_append = true;
Ujwal Patelf4c6d2d2015-08-12 14:48:02 -0700353
354 /*
355 * remove DUAL_PIPE_FLAG because on this target for this panel,
356 * it will be added based on one of the selected configurations.
357 */
358 panelstruct->paneldata->panel_operating_mode &= ~DUAL_PIPE_FLAG;
359 panelstruct->config = &nt35597_wqxga_dualdsi_cmd_config0;
360 if (oem_data) {
361 switch (oem_data->cfg_num[0]) {
362 case -1: /* default */
363 case 0:
364 panelstruct->config =
365 &nt35597_wqxga_dualdsi_cmd_config0;
366 break;
367 case 1:
368 panelstruct->config =
369 &nt35597_wqxga_dualdsi_cmd_config1;
370 break;
371 default:
372 dprintf(CRITICAL, "topology config%d not supported. fallback to default config0\n",
373 oem_data->cfg_num[0]);
374 panelstruct->config = &nt35597_wqxga_dualdsi_cmd_config0;
375 }
376 }
377 pinfo->lm_split[0] = panelstruct->config->lm_split[0];
378 pinfo->lm_split[1] = panelstruct->config->lm_split[1];
Kuogee Hsieh9d7e7142015-06-16 10:36:19 -0700379 break;
Kuogee Hsieh0b492c92015-07-08 13:02:36 -0700380 case NT35597_WQXGA_DSC_VIDEO_PANEL:
381 pan_type = PANEL_TYPE_DSI;
382 pinfo->lcd_reg_en = 0;
383 panelstruct->paneldata = &nt35597_wqxga_dsc_video_panel_data;
384 panelstruct->panelres = &nt35597_wqxga_dsc_video_panel_res;
385 panelstruct->color = &nt35597_wqxga_dsc_video_color;
386 panelstruct->videopanel = &nt35597_wqxga_dsc_video_video_panel;
387 panelstruct->commandpanel = &nt35597_wqxga_dsc_video_command_panel;
388 panelstruct->state = &nt35597_wqxga_dsc_video_state;
389 panelstruct->laneconfig = &nt35597_wqxga_dsc_video_lane_config;
390 panelstruct->paneltiminginfo
391 = &nt35597_wqxga_dsc_video_timing_info;
392 panelstruct->panelresetseq
393 = &nt35597_wqxga_dsc_video_reset_seq;
394 panelstruct->backlightinfo = &nt35597_wqxga_dsc_video_backlight;
395
396 pinfo->labibb = &nt35597_wqxga_dsc_video_labibb;
397
398 pinfo->mipi.panel_on_cmds
399 = nt35597_wqxga_dsc_video_on_command;
400 pinfo->mipi.num_of_panel_on_cmds
401 = NT35597_WQXGA_DSC_VIDEO_ON_COMMAND;
402 pinfo->mipi.panel_off_cmds
403 = nt35597_wqxga_dsc_video_off_command;
404 pinfo->mipi.num_of_panel_off_cmds
405 = NT35597_WQXGA_DSC_VIDEO_OFF_COMMAND;
406 memcpy(phy_db->timing,
407 nt35597_wqxga_dsc_thulium_video_timings,
408 MAX_TIMING_CONFIG * sizeof(uint32_t));
409 pinfo->mipi.tx_eot_append = true;
410
Ujwal Patel41a665a2015-07-17 13:51:30 -0700411 /*
412 * remove DUAL_PIPE_FLAG because on this target for this panel,
413 * it will be added based on one of the selected configurations.
414 */
415 panelstruct->paneldata->panel_operating_mode &= ~DUAL_PIPE_FLAG;
416 panelstruct->config = &nt35597_wqxga_dsc_video_config2;
417 if (oem_data) {
418 switch (oem_data->cfg_num[0]) {
419 case -1: /* default */
420 case 0:
421 panelstruct->config =
422 &nt35597_wqxga_dsc_video_config0;
423 break;
424 case 1:
425 panelstruct->config =
426 &nt35597_wqxga_dsc_video_config1;
427 break;
428 case 2:
429 panelstruct->config =
430 &nt35597_wqxga_dsc_video_config2;
431 break;
432 default:
433 dprintf(CRITICAL, "topology config%d not supported. fallback to default config2\n",
434 oem_data->cfg_num[0]);
435 panelstruct->config = &nt35597_wqxga_dsc_video_config2;
436 }
437 }
438 pinfo->lm_split[0] = panelstruct->config->lm_split[0];
439 pinfo->lm_split[1] = panelstruct->config->lm_split[1];
440 pinfo->num_dsc_enc = panelstruct->config->num_dsc_enc;
441
Kuogee Hsieh0b492c92015-07-08 13:02:36 -0700442 pinfo->compression_mode = COMPRESSION_DSC;
Kuogee Hsieh0b492c92015-07-08 13:02:36 -0700443 pinfo->dsc.parameter_calc = mdss_dsc_parameters_calc;
444 pinfo->dsc.dsc2buf = mdss_dsc_to_buf;
445 pinfo->dsc.dsi_dsc_config = mdss_dsc_dsi_config;
446 pinfo->dsc.mdp_dsc_config = mdss_dsc_mdp_config;
447 break;
448 case NT35597_WQXGA_DSC_CMD_PANEL:
449 pan_type = PANEL_TYPE_DSI;
450 pinfo->lcd_reg_en = 0;
451 panelstruct->paneldata = &nt35597_wqxga_dsc_cmd_panel_data;
452 panelstruct->panelres = &nt35597_wqxga_dsc_cmd_panel_res;
453 panelstruct->color = &nt35597_wqxga_dsc_cmd_color;
454 panelstruct->videopanel = &nt35597_wqxga_dsc_cmd_video_panel;
455 panelstruct->commandpanel = &nt35597_wqxga_dsc_cmd_command_panel;
456 panelstruct->state = &nt35597_wqxga_dsc_cmd_state;
457 panelstruct->laneconfig = &nt35597_wqxga_dsc_cmd_lane_config;
458 panelstruct->paneltiminginfo
459 = &nt35597_wqxga_dsc_cmd_timing_info;
460 panelstruct->panelresetseq
461 = &nt35597_wqxga_dsc_cmd_reset_seq;
462 panelstruct->backlightinfo = &nt35597_wqxga_dsc_cmd_backlight;
463
464 pinfo->labibb = &nt35597_wqxga_dsc_cmd_labibb;
465
466 pinfo->mipi.panel_on_cmds
467 = nt35597_wqxga_dsc_cmd_on_command;
468 pinfo->mipi.num_of_panel_on_cmds
469 = NT35597_WQXGA_DSC_CMD_ON_COMMAND;
470 pinfo->mipi.panel_off_cmds
471 = nt35597_wqxga_dsc_cmd_off_command;
472 pinfo->mipi.num_of_panel_off_cmds
473 = NT35597_WQXGA_DSC_CMD_OFF_COMMAND;
474 memcpy(phy_db->timing,
475 nt35597_wqxga_dsc_thulium_cmd_timings,
476 MAX_TIMING_CONFIG * sizeof(uint32_t));
477 pinfo->mipi.tx_eot_append = true;
478
Ujwal Patel41a665a2015-07-17 13:51:30 -0700479 /*
480 * remove DUAL_PIPE_FLAG because on this target for this panel,
481 * it will be added based on one of the selected configurations.
482 */
483 panelstruct->paneldata->panel_operating_mode &= ~DUAL_PIPE_FLAG;
484 panelstruct->config = &nt35597_wqxga_dsc_cmd_config2;
485 if (oem_data) {
486 switch (oem_data->cfg_num[0]) {
487 case 0:
488 panelstruct->config =
489 &nt35597_wqxga_dsc_cmd_config0;
490 break;
491 case 1:
492 panelstruct->config =
493 &nt35597_wqxga_dsc_cmd_config1;
494 break;
495 case -1: /* default */
496 case 2:
497 panelstruct->config =
498 &nt35597_wqxga_dsc_cmd_config2;
499 break;
500 default:
501 dprintf(CRITICAL, "topology config%d not supported. fallback to default config2\n",
502 oem_data->cfg_num[0]);
503 panelstruct->config = &nt35597_wqxga_dsc_cmd_config2;
504 }
505 }
506
507 pinfo->lm_split[0] = panelstruct->config->lm_split[0];
508 pinfo->lm_split[1] = panelstruct->config->lm_split[1];
509 pinfo->num_dsc_enc = panelstruct->config->num_dsc_enc;
510
Kuogee Hsieh0b492c92015-07-08 13:02:36 -0700511 pinfo->compression_mode = COMPRESSION_DSC;
Kuogee Hsieh0b492c92015-07-08 13:02:36 -0700512 pinfo->dsc.parameter_calc = mdss_dsc_parameters_calc;
513 pinfo->dsc.dsc2buf = mdss_dsc_to_buf;
514 pinfo->dsc.dsi_dsc_config = mdss_dsc_dsi_config;
515 pinfo->dsc.mdp_dsc_config = mdss_dsc_mdp_config;
516 break;
Dhaval Patelb95039c2015-03-16 11:14:06 -0700517 case JDI_QHD_DUALDSI_VIDEO_PANEL:
518 pan_type = PANEL_TYPE_DSI;
519 pinfo->lcd_reg_en = 1;
Dhaval Patelb95039c2015-03-16 11:14:06 -0700520 panelstruct->paneldata = &jdi_qhd_dualdsi_video_panel_data;
521
522 panelstruct->panelres = &jdi_qhd_dualdsi_video_panel_res;
523 panelstruct->color = &jdi_qhd_dualdsi_video_color;
524 panelstruct->videopanel = &jdi_qhd_dualdsi_video_video_panel;
525 panelstruct->commandpanel = &jdi_qhd_dualdsi_video_command_panel;
526 panelstruct->state = &jdi_qhd_dualdsi_video_state;
527 panelstruct->laneconfig = &jdi_qhd_dualdsi_video_lane_config;
528 panelstruct->paneltiminginfo
529 = &jdi_qhd_dualdsi_video_timing_info;
530 panelstruct->panelresetseq
531 = &jdi_qhd_dualdsi_video_reset_seq;
532 panelstruct->backlightinfo = &jdi_qhd_dualdsi_video_backlight;
533 pinfo->mipi.panel_on_cmds
534 = jdi_qhd_dualdsi_video_on_command;
535 pinfo->mipi.num_of_panel_on_cmds
536 = JDI_QHD_DUALDSI_VIDEO_ON_COMMAND;
537 pinfo->mipi.panel_off_cmds
538 = jdi_qhd_dualdsi_video_off_command;
539 pinfo->mipi.num_of_panel_off_cmds
540 = JDI_QHD_DUALDSI_VIDEO_OFF_COMMAND;
541 memcpy(phy_db->timing,
542 jdi_qhd_dualdsi_thulium_cmd_timings,
543 MAX_TIMING_CONFIG * sizeof(uint32_t));
544 break;
545 case JDI_QHD_DUALDSI_CMD_PANEL:
546 pan_type = PANEL_TYPE_DSI;
547 pinfo->lcd_reg_en = 1;
548 panelstruct->paneldata = &jdi_qhd_dualdsi_cmd_panel_data;
Dhaval Patelb95039c2015-03-16 11:14:06 -0700549
550 panelstruct->panelres = &jdi_qhd_dualdsi_cmd_panel_res;
551 panelstruct->color = &jdi_qhd_dualdsi_cmd_color;
552 panelstruct->videopanel = &jdi_qhd_dualdsi_cmd_video_panel;
553 panelstruct->commandpanel = &jdi_qhd_dualdsi_cmd_command_panel;
554 panelstruct->state = &jdi_qhd_dualdsi_cmd_state;
555 panelstruct->laneconfig = &jdi_qhd_dualdsi_cmd_lane_config;
556 panelstruct->paneltiminginfo
557 = &jdi_qhd_dualdsi_cmd_timing_info;
558 panelstruct->panelresetseq
559 = &jdi_qhd_dualdsi_cmd_reset_seq;
560 panelstruct->backlightinfo = &jdi_qhd_dualdsi_cmd_backlight;
561 pinfo->mipi.panel_on_cmds
562 = jdi_qhd_dualdsi_cmd_on_command;
563 pinfo->mipi.num_of_panel_on_cmds
564 = JDI_QHD_DUALDSI_CMD_ON_COMMAND;
565 pinfo->mipi.panel_off_cmds
566 = jdi_qhd_dualdsi_cmd_off_command;
567 pinfo->mipi.num_of_panel_off_cmds
568 = JDI_QHD_DUALDSI_CMD_OFF_COMMAND;
569 memcpy(phy_db->timing,
570 jdi_qhd_dualdsi_thulium_video_timings,
571 MAX_TIMING_CONFIG * sizeof(uint32_t));
572 break;
feifanz76fe6482015-09-02 15:25:16 +0800573 case R69007_WQXGA_CMD_PANEL:
574 pan_type = PANEL_TYPE_DSI;
575 pinfo->lcd_reg_en = 0;
576 panelstruct->paneldata = &r69007_wqxga_cmd_panel_data;
577 panelstruct->panelres = &r69007_wqxga_cmd_panel_res;
578 panelstruct->color = &r69007_wqxga_cmd_color;
579 panelstruct->videopanel = &r69007_wqxga_cmd_video_panel;
580 panelstruct->commandpanel = &r69007_wqxga_cmd_command_panel;
581 panelstruct->state = &r69007_wqxga_cmd_state;
582 panelstruct->laneconfig = &r69007_wqxga_cmd_lane_config;
583 panelstruct->paneltiminginfo
584 = &r69007_wqxga_cmd_timing_info;
585 panelstruct->panelresetseq
586 = &r69007_wqxga_cmd_reset_seq;
587 panelstruct->backlightinfo = &r69007_wqxga_cmd_backlight;
588
589 pinfo->labibb = &r69007_wqxga_cmd_labibb;
590
591 pinfo->mipi.panel_on_cmds
592 = r69007_wqxga_cmd_on_command;
593 pinfo->mipi.num_of_panel_on_cmds
594 = R69007_WQXGA_CMD_ON_COMMAND;
595 pinfo->mipi.panel_off_cmds
596 = r69007_wqxga_cmd_off_command;
597 pinfo->mipi.num_of_panel_off_cmds
598 = R69007_WQXGA_CMD_OFF_COMMAND;
599 memcpy(phy_db->timing,
600 r69007_wqxga_thulium_cmd_timings,
601 MAX_TIMING_CONFIG * sizeof(uint32_t));
602 break;
Kuogee Hsiehb976dfc2015-08-28 13:21:30 -0700603 case JDI_4K_DUALDSI_VIDEO_NOFBC_PANEL:
604 pan_type = PANEL_TYPE_DSI;
605 /*
606 * send on_cmds at HS mode by setting cmds_post_tg so that
607 * on_cmds are sent after timing generator on
608 */
609 pinfo->mipi.cmds_post_tg = 1;
610 panelstruct->paneldata = &jdi_4k_dualdsi_video_nofbc_panel_data;
611
612 panelstruct->panelres = &jdi_4k_dualdsi_video_nofbc_panel_res;
613 panelstruct->color = &jdi_4k_dualdsi_video_nofbc_color;
614 panelstruct->videopanel = &jdi_4k_dualdsi_video_nofbc_video_panel;
615 panelstruct->commandpanel = &jdi_4k_dualdsi_video_nofbc_command_panel;
616 panelstruct->state = &jdi_4k_dualdsi_video_nofbc_state;
617 panelstruct->laneconfig = &jdi_4k_dualdsi_video_nofbc_lane_config;
618 panelstruct->paneltiminginfo
619 = &jdi_4k_dualdsi_video_nofbc_timing_info;
620 panelstruct->panelresetseq
621 = &jdi_4k_dualdsi_video_nofbc_reset_seq;
622 panelstruct->backlightinfo = &jdi_4k_dualdsi_video_nofbc_backlight;
623 pinfo->labibb = &jdi_4k_dualdsi_video_nofbc_labibb;
624
625 pinfo->mipi.panel_on_cmds
626 = jdi_4k_dualdsi_video_nofbc_on_command;
627 pinfo->mipi.num_of_panel_on_cmds
628 = JDI_4K_DUALDSI_VIDEO_NOFBC_ON_COMMAND;
629 pinfo->mipi.panel_off_cmds
630 = jdi_4k_dualdsi_video_nofbc_off_command;
631 pinfo->mipi.num_of_panel_off_cmds
632 = JDI_4K_DUALDSI_VIDEO_NOFBC_OFF_COMMAND;
633 memcpy(phy_db->timing,
634 jdi_4k_dualdsi_thulium_video_nofbc_timings,
635 MAX_TIMING_CONFIG * sizeof(uint32_t));
636 break;
Siddharth Zaveriacaacc32015-12-12 15:10:33 -0500637 case ADV7533_1080P_VIDEO_PANEL:
638 pan_type = PANEL_TYPE_DSI;
639 panelstruct->paneldata = &adv7533_1080p_video_panel_data;
640 panelstruct->panelres = &adv7533_1080p_video_panel_res;
641 panelstruct->color = &adv7533_1080p_video_color;
642 panelstruct->videopanel = &adv7533_1080p_video_video_panel;
643 panelstruct->commandpanel = &adv7533_1080p_video_command_panel;
644 panelstruct->state = &adv7533_1080p_video_state;
645 panelstruct->laneconfig = &adv7533_1080p_video_lane_config;
646 panelstruct->paneltiminginfo
647 = &adv7533_1080p_video_timing_info;
648 pinfo->adv7533.dsi_tg_i2c_cmd = adv7533_1080p_tg_i2c_command;
649 pinfo->adv7533.num_of_tg_i2c_cmds = ADV7533_1080P_TG_COMMANDS;
650 pinfo->adv7533.dsi_setup_cfg_i2c_cmd = adv7533_1080p_common_cfg;
651 pinfo->adv7533.num_of_cfg_i2c_cmds = ADV7533_1080P_CONFIG_COMMANDS;
652 memcpy(phy_db->timing,
653 adv7533_1080p_thulium_video_timings,
654 MAX_TIMING_CONFIG * sizeof(uint32_t));
655 break;
656 case ADV7533_720P_VIDEO_PANEL:
657 pan_type = PANEL_TYPE_DSI;
658 panelstruct->paneldata = &adv7533_720p_video_panel_data;
659 panelstruct->panelres = &adv7533_720p_video_panel_res;
660 panelstruct->color = &adv7533_720p_video_color;
661 panelstruct->videopanel = &adv7533_720p_video_video_panel;
662 panelstruct->commandpanel = &adv7533_720p_video_command_panel;
663 panelstruct->state = &adv7533_720p_video_state;
664 panelstruct->laneconfig = &adv7533_720p_video_lane_config;
665 panelstruct->paneltiminginfo
666 = &adv7533_720p_video_timing_info;
667 pinfo->adv7533.dsi_tg_i2c_cmd = adv7533_720p_tg_i2c_command;
668 pinfo->adv7533.num_of_tg_i2c_cmds = ADV7533_720P_TG_COMMANDS;
669 pinfo->adv7533.dsi_setup_cfg_i2c_cmd = adv7533_720p_common_cfg;
670 pinfo->adv7533.num_of_cfg_i2c_cmds = ADV7533_720P_CONFIG_COMMANDS;
671 memcpy(phy_db->timing,
672 adv7533_720p_thulium_video_timings,
673 MAX_TIMING_CONFIG * sizeof(uint32_t));
674 break;
675 case TRULY_FWVGA_VIDEO_PANEL:
676 pan_type = PANEL_TYPE_DSI;
677 pinfo->lcd_reg_en = 1;
678 panelstruct->paneldata = &hx8379a_truly_fwvga_video_panel_data;
679 panelstruct->panelres = &hx8379a_truly_fwvga_video_panel_res;
680 panelstruct->color = &hx8379a_truly_fwvga_video_color;
681 panelstruct->videopanel = &hx8379a_truly_fwvga_video_video_panel;
682 panelstruct->commandpanel = &hx8379a_truly_fwvga_video_command_panel;
683 panelstruct->state = &hx8379a_truly_fwvga_video_state;
684 panelstruct->laneconfig = &hx8379a_truly_fwvga_video_lane_config;
685 panelstruct->paneltiminginfo
686 = &hx8379a_truly_fwvga_video_timing_info;
687 panelstruct->panelresetseq
688 = &hx8379a_truly_fwvga_video_reset_seq;
689 panelstruct->backlightinfo = &hx8379a_truly_fwvga_video_backlight;
690 pinfo->mipi.panel_on_cmds
691 = hx8379a_truly_fwvga_video_on_command;
692 pinfo->mipi.num_of_panel_on_cmds
693 = HX8379A_TRULY_FWVGA_VIDEO_ON_COMMAND;
694 pinfo->mipi.panel_off_cmds
695 = hx8379a_truly_fwvga_video_off_command;
696 pinfo->mipi.num_of_panel_off_cmds
697 = HX8379A_TRULY_FWVGA_VIDEO_OFF_COMMAND;
698 pinfo->mipi.broadcast = 0;
699 memcpy(phy_db->timing,
700 hx8379a_truly_fwvga_thulium_video_timings,
701 MAX_TIMING_CONFIG * sizeof(uint32_t));
702 break;
Dhaval Patelb95039c2015-03-16 11:14:06 -0700703 default:
704 case UNKNOWN_PANEL:
705 pan_type = PANEL_TYPE_UNKNOWN;
706 break;
707 }
Ujwal Patel41a665a2015-07-17 13:51:30 -0700708
709 dprintf(SPEW, "lm_split[0]=%d lm_split[1]=%d mode=0x%x\n",
710 pinfo->lm_split[0], pinfo->lm_split[1],
711 panelstruct->paneldata->panel_operating_mode);
712
Dhaval Patelb95039c2015-03-16 11:14:06 -0700713 return pan_type;
714}
715
Siddharth Zaveriacaacc32015-12-12 15:10:33 -0500716int oem_panel_bridge_chip_init(struct msm_panel_info *pinfo) {
717 uint8_t rev = 0;
718
719 pinfo->adv7533.i2c_main_addr = TARGET_ADV7533_MAIN_INST_0;
720 pinfo->adv7533.i2c_cec_addr = TARGET_ADV7533_CEC_DSI_INST_0;
721 pinfo->adv7533.program_i2c_addr = false;
722 /* Set Switch GPIO to DSI2HDMI mode */
723 target_set_switch_gpio(1);
724 /* ADV7533 DSI to HDMI Bridge Chip Connected */
725 mipi_dsi_i2c_device_init(BLSP_ID_2, QUP_ID_1);
726 /* Read ADV Chip ID */
727 if (!mipi_dsi_i2c_read_byte(ADV7533_MAIN, 0x00, &rev)) {
728 dprintf(INFO, "ADV7533 Rev ID: 0x%x\n",rev);
729 } else {
730 dprintf(CRITICAL, "error reading Rev ID from bridge chip\n");
731 return PANEL_TYPE_UNKNOWN;
732 }
733
734 return NO_ERROR;
735}
736
Dhaval Patelb95039c2015-03-16 11:14:06 -0700737int oem_panel_select(const char *panel_name, struct panel_struct *panelstruct,
738 struct msm_panel_info *pinfo,
739 struct mdss_dsi_phy_ctrl *phy_db)
740{
741 uint32_t hw_id = board_hardware_id();
742 int32_t panel_override_id;
Siddharth Zaveriacaacc32015-12-12 15:10:33 -0500743 uint32_t ret = 0;
Dhaval Patelb95039c2015-03-16 11:14:06 -0700744
745 phy_db->pll_type = DSI_PLL_TYPE_THULIUM;
Siddharth Zaveriacaacc32015-12-12 15:10:33 -0500746 pinfo->has_bridge_chip = false;
Dhaval Patelb95039c2015-03-16 11:14:06 -0700747
748 if (panel_name) {
749 panel_override_id = panel_name_to_id(supp_panels,
750 ARRAY_SIZE(supp_panels), panel_name);
751
752 if (panel_override_id < 0) {
753 dprintf(CRITICAL, "Not able to search the panel:%s\n",
Padmanabhan Komandurubccbcdc2015-06-30 16:19:24 +0530754 panel_name);
Dhaval Patelb95039c2015-03-16 11:14:06 -0700755 } else if (panel_override_id < UNKNOWN_PANEL) {
756 /* panel override using fastboot oem command */
757 panel_id = panel_override_id;
758
759 dprintf(INFO, "OEM panel override:%s\n",
Padmanabhan Komandurubccbcdc2015-06-30 16:19:24 +0530760 panel_name);
Dhaval Patelb95039c2015-03-16 11:14:06 -0700761 goto panel_init;
762 }
763 }
764
765 switch (hw_id) {
766 case HW_PLATFORM_MTP:
767 case HW_PLATFORM_FLUID:
768 case HW_PLATFORM_SURF:
769 panel_id = SHARP_WQXGA_DUALDSI_VIDEO_PANEL;
770 break;
feifanz76fe6482015-09-02 15:25:16 +0800771 case HW_PLATFORM_QRD:
772 panel_id = R69007_WQXGA_CMD_PANEL;
773 break;
Kuogee Hsiehb976dfc2015-08-28 13:21:30 -0700774 case HW_PLATFORM_LIQUID:
775 panel_id = JDI_4K_DUALDSI_VIDEO_NOFBC_PANEL;
776 break;
Siddharth Zaveriacaacc32015-12-12 15:10:33 -0500777 case HW_PLATFORM_DRAGON:
778 panel_id = TRULY_FWVGA_VIDEO_PANEL;
779 break;
780 case HW_PLATFORM_ADP:
781 panel_id = ADV7533_720P_VIDEO_PANEL;
782 pinfo->has_bridge_chip = true;
783 break;
Dhaval Patelb95039c2015-03-16 11:14:06 -0700784 default:
785 dprintf(CRITICAL, "Display not enabled for %d HW type\n"
786 , hw_id);
787 return PANEL_TYPE_UNKNOWN;
788 }
789
790panel_init:
Siddharth Zaveriacaacc32015-12-12 15:10:33 -0500791 if (pinfo->has_bridge_chip) {
792 ret = oem_panel_bridge_chip_init(pinfo);
793 if (ret) {
794 dprintf(CRITICAL, "Error in initializing bridge chip\n");
795 return ret;
796 }
797 }
Dhaval Patelb95039c2015-03-16 11:14:06 -0700798 return init_panel_data(panelstruct, pinfo, phy_db);
799}