xref: /utopia/UTPA2-700.0.x/modules/xc/hal/M7821/pnl/halPNL.c (revision 53ee8cc121a030b8d368113ac3e966b4705770ef)
1 //<MStar Software>
2 //******************************************************************************
3 // MStar Software
4 // Copyright (c) 2010 - 2012 MStar Semiconductor, Inc. All rights reserved.
5 // All software, firmware and related documentation herein ("MStar Software") are
6 // intellectual property of MStar Semiconductor, Inc. ("MStar") and protected by
7 // law, including, but not limited to, copyright law and international treaties.
8 // Any use, modification, reproduction, retransmission, or republication of all
9 // or part of MStar Software is expressly prohibited, unless prior written
10 // permission has been granted by MStar.
11 //
12 // By accessing, browsing and/or using MStar Software, you acknowledge that you
13 // have read, understood, and agree, to be bound by below terms ("Terms") and to
14 // comply with all applicable laws and regulations:
15 //
16 // 1. MStar shall retain any and all right, ownership and interest to MStar
17 //    Software and any modification/derivatives thereof.
18 //    No right, ownership, or interest to MStar Software and any
19 //    modification/derivatives thereof is transferred to you under Terms.
20 //
21 // 2. You understand that MStar Software might include, incorporate or be
22 //    supplied together with third party`s software and the use of MStar
23 //    Software may require additional licenses from third parties.
24 //    Therefore, you hereby agree it is your sole responsibility to separately
25 //    obtain any and all third party right and license necessary for your use of
26 //    such third party`s software.
27 //
28 // 3. MStar Software and any modification/derivatives thereof shall be deemed as
29 //    MStar`s confidential information and you agree to keep MStar`s
30 //    confidential information in strictest confidence and not disclose to any
31 //    third party.
32 //
33 // 4. MStar Software is provided on an "AS IS" basis without warranties of any
34 //    kind. Any warranties are hereby expressly disclaimed by MStar, including
35 //    without limitation, any warranties of merchantability, non-infringement of
36 //    intellectual property rights, fitness for a particular purpose, error free
37 //    and in conformity with any international standard.  You agree to waive any
38 //    claim against MStar for any loss, damage, cost or expense that you may
39 //    incur related to your use of MStar Software.
40 //    In no event shall MStar be liable for any direct, indirect, incidental or
41 //    consequential damages, including without limitation, lost of profit or
42 //    revenues, lost or damage of data, and unauthorized system use.
43 //    You agree that this Section 4 shall still apply without being affected
44 //    even if MStar Software has been modified by MStar in accordance with your
45 //    request or instruction for your use, except otherwise agreed by both
46 //    parties in writing.
47 //
48 // 5. If requested, MStar may from time to time provide technical supports or
49 //    services in relation with MStar Software to you for your use of
50 //    MStar Software in conjunction with your or your customer`s product
51 //    ("Services").
52 //    You understand and agree that, except otherwise agreed by both parties in
53 //    writing, Services are provided on an "AS IS" basis and the warranty
54 //    disclaimer set forth in Section 4 above shall apply.
55 //
56 // 6. Nothing contained herein shall be construed as by implication, estoppels
57 //    or otherwise:
58 //    (a) conferring any license or right to use MStar name, trademark, service
59 //        mark, symbol or any other identification;
60 //    (b) obligating MStar or any of its affiliates to furnish any person,
61 //        including without limitation, you and your customers, any assistance
62 //        of any kind whatsoever, or any information; or
63 //    (c) conferring any license or right under any intellectual property right.
64 //
65 // 7. These terms shall be governed by and construed in accordance with the laws
66 //    of Taiwan, R.O.C., excluding its conflict of law rules.
67 //    Any and all dispute arising out hereof or related hereto shall be finally
68 //    settled by arbitration referred to the Chinese Arbitration Association,
69 //    Taipei in accordance with the ROC Arbitration Law and the Arbitration
70 //    Rules of the Association by three (3) arbitrators appointed in accordance
71 //    with the said Rules.
72 //    The place of arbitration shall be in Taipei, Taiwan and the language shall
73 //    be English.
74 //    The arbitration award shall be final and binding to both parties.
75 //
76 //******************************************************************************
77 //<MStar Software>
78 #ifndef _HAL_PNL_C_
79 #define _HAL_PNL_C_
80 
81 //-------------------------------------------------------------------------------------------------
82 //  Include Files
83 //-------------------------------------------------------------------------------------------------
84 
85 #include "MsCommon.h"
86 #include "MsTypes.h"
87 #include "utopia.h"
88 #include "utopia_dapi.h"
89 #include "apiPNL.h"
90 #include "apiPNL_v2.h"
91 #include "drvPNL.h"
92 #include "halPNL.h"
93 #include "PNL_private.h"
94 #include "pnl_hwreg_utility2.h"
95 #include "Maserati_pnl_lpll_tbl.h"
96 #include "Maserati_pnl_lpll_ext_tbl.h"
97 
98 #ifdef MSOS_TYPE_LINUX_KERNEL
99 #include <linux/string.h>
100 #include <linux/delay.h>
101 #include <asm/div64.h>
102 #else
103 #include "string.h"
104 #define do_div(x,y) ((x)/=(y))
105 #endif
106 
107 //-------------------------------------------------------------------------------------------------
108 //  Driver Compiler Options
109 //-------------------------------------------------------------------------------------------------
110 
111 //-------------------------------------------------------------------------------------------------
112 //  Local Defines
113 //-------------------------------------------------------------------------------------------------
114 
115 #define UNUSED(x)       (x=x)
116 #if 1
117 #define HAL_PNL_DBG(_dbgSwitch_, _fmt, _args...)      { if((_dbgSwitch_ & _u16PnlDbgSwitch) != 0) printf("PNL:"_fmt, ##_args); }
118 #define HAL_MOD_CAL_DBG(x)    //x
119 #else
120 #define HAL_PNL_DBG(_dbgSwitch_, _fmt, _args...)      { }
121 #endif
122 
123 #define DAC_LPLL_ICTRL     0x0002
124 #define LVDS_LPLL_ICTRL    0x0001
125 
126 //Get MOD calibration time
127 #define MOD_CAL_TIMER   FALSE
128 
129 //if mboot read eFuse and fill the register, then add this define to mark utopia efuse code flow
130 #define MOD_EFUSE_IN_MBOOT
131 
132 //for LVDS HW Calibration ICON limitation
133 #define MOD_LVDS_ICON_HIGH_LIMIT 0x2E
134 #define MOD_LVDS_ICON_LOW_LIMIT  0x06
135 #define MOD_LVDS_ICON_DEFAULT    0x19
136 
137 //for LVDS HW Calibration timeout (i.e. retry times after hw calibration failed)
138 #define MOD_LVDS_HW_CALI_TIME_OUT  0
139 //-------------------------------------------------------------------------------------------------
140 //  Local Structurs
141 //-------------------------------------------------------------------------------------------------
142 #define CLK_GEN0_REG_VIDEO_NUM    4
143 #define CLK_GEN0_REG_OSD_NUM      3
144 #define CLK_GEN2_REG_VIDEO_NUM    2
145 #define CLK_GEN2_REG_OSD_NUM      1
146 
147 typedef enum
148 {
149     E_PNL_SUPPORTED_CLK_TTL,                          // 0
150     E_PNL_SUPPORTED_CLK_LVDS_1CH,                     // 1
151     E_PNL_SUPPORTED_CLK_LVDS_2CH,                     // 2
152     E_PNL_SUPPORTED_CLK_HS_LVDS_1CH,                  // 3
153     E_PNL_SUPPORTED_CLK_HS_LVDS_2CH,                  // 4
154     E_PNL_SUPPORTED_CLK_VBY1_1CH_10BIT,               // 5
155     E_PNL_SUPPORTED_CLK_VBY1_1CH_8BIT,                // 6
156     E_PNL_SUPPORTED_CLK_VBY1_2CH_10BIT,               // 7
157     E_PNL_SUPPORTED_CLK_VBY1_2CH_8BIT,                // 8
158     E_PNL_SUPPORTED_CLK_VBY1_4CH_10BIT,               // 9
159     E_PNL_SUPPORTED_CLK_VBY1_4CH_8BIT,                // 10
160     E_PNL_SUPPORTED_CLK_VBY1_8CH_10BIT,               // 11
161     E_PNL_SUPPORTED_CLK_VBY1_8CH_8BIT,                // 12
162     E_PNL_SUPPORTED_CLK_VBY1_16CH_10BIT,              // 13
163     E_PNL_SUPPORTED_CLK_VBY1_16CH_8BIT,               // 14
164     E_PNL_SUPPORTED_CLK_EPI_24_10BIT_12PAIR_X_1,      // 15
165     E_PNL_SUPPORTED_CLK_EPI_28_8BIT_12PAIR_X_1,       // 16
166     E_PNL_SUPPORTED_CLK_CMPI_27_8BIT_12PAIR_X_1,      // 17
167     E_PNL_SUPPORTED_CLK_CMPI_24_10BIT_12PAIR_X_1,     // 18
168     E_PNL_SUPPORTED_CLK_USIT_8BIT_12PAIR_X_1,         // 19
169     E_PNL_SUPPORTED_CLK_USIT_10BIT_12PAIR_X_1,        // 20
170     E_PNL_SUPPORTED_ISP_9_8BIT_12PAIR_X_1,            // 21
171     E_PNL_SUPPORTED_ISP_9_8BIT_6PAIR_X_1,             // 22
172     E_PNL_SUPPORTED_CLK_VBY1_8V4O_10BIT,              // 23
173     E_PNL_SUPPORTED_CLK_VBY1_8V4O_8BIT,               // 24
174     E_PNL_SUPPORTED_CLK_VBY1_4V4O_10BIT,              // 25
175     E_PNL_SUPPORTED_CLK_VBY1_4V4O_8BIT,               // 26
176     E_PNL_SUPPORTED_CLK_VBY1_4V2O_10BIT,              // 27
177     E_PNL_SUPPORTED_CLK_VBY1_4V2O_8BIT,               // 28
178     E_PNL_SUPPORTED_CLK_MAX,                          // 29
179 } E_PNL_SUPPORTED_CLK_TYPE;
180 
181 TBLStruct CLKGEN2SettingTBL_Video[E_PNL_SUPPORTED_CLK_MAX][CLK_GEN2_REG_VIDEO_NUM]=
182 {
183     { //E_PNL_SUPPORTED_CLK_TTL    NO.0
184       //Address,Value,Mask
185         {0x44,0x0014,0x001F},//clk_odclk
186         {0x09,0x0001,0x000F},//clk_vby1
187     },
188 
189     { //E_PNL_SUPPORTED_CLK_LVDS_1CH    NO.1
190       //Address,Value,Mask
191         {0x44,0x0014,0x001F},//clk_odclk
192         {0x09,0x0001,0x000F},//clk_vby1
193     },
194 
195     { //E_PNL_SUPPORTED_CLK_LVDS_2CH    NO.2
196       //Address,Value,Mask
197         {0x44,0x0004,0x001F},//clk_odclk
198         {0x09,0x0001,0x000F},//clk_vby1
199     },
200 
201     { //E_PNL_SUPPORTED_CLK_HS_LVDS_1CH    NO.3
202       //Address,Value,Mask
203         {0x44,0x0014,0x001F},//clk_odclk
204         {0x09,0x0001,0x000F},//clk_vby1
205     },
206 
207     { //E_PNL_SUPPORTED_CLK_HS_LVDS_2CH    NO.4
208       //Address,Value,Mask
209         {0x44,0x0004,0x001F},//clk_odclk
210         {0x09,0x0001,0x000F},//clk_vby1
211     },
212 
213     { //E_PNL_SUPPORTED_CLK_VBY1_1CH_10BIT    NO.5
214       //Address,Value,Mask
215         {0x44,0x0014,0x001F},//clk_odclk
216         {0x09,0x0000,0x000F},//clk_vby1
217     },
218 
219     { //E_PNL_SUPPORTED_CLK_VBY1_1CH_8BIT    NO.6
220       //Address,Value,Mask
221         {0x44,0x0014,0x001F},//clk_odclk
222         {0x09,0x0000,0x000F},//clk_vby1
223     },
224 
225     { //E_PNL_SUPPORTED_CLK_VBY1_2CH_10BIT    NO.7
226       //Address,Value,Mask
227         {0x44,0x0004,0x001F},//clk_odclk
228         {0x09,0x0000,0x000F},//clk_vby1
229     },
230 
231     { //E_PNL_SUPPORTED_CLK_VBY1_2CH_8BIT    NO.8
232       //Address,Value,Mask
233         {0x44,0x0004,0x001F},//clk_odclk
234         {0x09,0x0000,0x000F},//clk_vby1
235     },
236 
237     { //E_PNL_SUPPORTED_CLK_VBY1_4CH_10BIT    NO.9
238       //Address,Value,Mask
239         {0x44,0x0004,0x001F},//clk_odclk
240         {0x09,0x0000,0x000F},//clk_vby1
241     },
242 
243     { //E_PNL_SUPPORTED_CLK_VBY1_4CH_8BIT    NO.10
244       //Address,Value,Mask
245         {0x44,0x0004,0x001F},//clk_odclk
246         {0x09,0x0000,0x000F},//clk_vby1
247     },
248 
249     { //E_PNL_SUPPORTED_CLK_VBY1_8CH_10BIT    NO.11
250       //Address,Value,Mask
251         {0x44,0x0004,0x001F},//clk_odclk
252         {0x09,0x0000,0x000F},//clk_vby1
253     },
254 
255     { //E_PNL_SUPPORTED_CLK_VBY1_8CH_8BIT    NO.12
256       //Address,Value,Mask
257         {0x44,0x0004,0x001F},//clk_odclk
258         {0x09,0x0000,0x000F},//clk_vby1
259     },
260 
261     { //E_PNL_SUPPORTED_CLK_VBY1_16CH_10BIT    NO.13
262       //Address,Value,Mask
263         {0x44,0x000C,0x001F},//clk_odclk
264         {0x09,0x0000,0x000F},//clk_vby1
265     },
266 
267     { //E_PNL_SUPPORTED_CLK_VBY1_16CH_8BIT    NO.14
268       //Address,Value,Mask
269         {0x44,0x000C,0x001F},//clk_odclk
270         {0x09,0x0000,0x000F},//clk_vby1
271     },
272 
273     { //E_PNL_SUPPORTED_CLK_EPI_24_10BIT_12PAIR_X_1    NO.15
274       //Address,Value,Mask
275         {0x44,0x0004,0x001F},//clk_odclk
276         {0x09,0x0001,0x000F},//clk_vby1
277     },
278 
279     { //E_PNL_SUPPORTED_CLK_EPI_28_8BIT_12PAIR_X_1    NO.16
280       //Address,Value,Mask
281         {0x44,0x0004,0x001F},//clk_odclk
282         {0x09,0x0001,0x000F},//clk_vby1
283     },
284 
285     { //E_PNL_SUPPORTED_CLK_CMPI_27_8BIT_12PAIR_X_1    NO.17
286       //Address,Value,Mask
287         {0x44,0x0004,0x001F},//clk_odclk
288         {0x09,0x0001,0x000F},//clk_vby1
289     },
290 
291     { //E_PNL_SUPPORTED_CLK_CMPI_24_10BIT_12PAIR_X_1    NO.18
292       //Address,Value,Mask
293         {0x44,0x0004,0x001F},//clk_odclk
294         {0x09,0x0001,0x000F},//clk_vby1
295     },
296 
297     { //E_PNL_SUPPORTED_CLK_USIT_8BIT_12PAIR_X_1    NO.19
298       //Address,Value,Mask
299         {0x44,0x0004,0x001F},//clk_odclk
300         {0x09,0x0001,0x000F},//clk_vby1
301     },
302 
303     { //E_PNL_SUPPORTED_CLK_USIT_10BIT_12PAIR_X_1    NO.20
304       //Address,Value,Mask
305         {0x44,0x0004,0x001F},//clk_odclk
306         {0x09,0x0001,0x000F},//clk_vby1
307     },
308 
309     { //E_PNL_SUPPORTED_ISP_9_8BIT_12PAIR_X_1    NO.21
310       //Address,Value,Mask
311         {0x44,0x0004,0x001F},//clk_odclk
312         {0x09,0x0001,0x000F},//clk_vby1
313     },
314 
315     { //E_PNL_SUPPORTED_ISP_9_8BIT_6PAIR_X_1    NO.22
316       //Address,Value,Mask
317         {0x44,0x0004,0x001F},//clk_odclk
318         {0x09,0x0001,0x000F},//clk_vby1
319     },
320 
321     { //E_PNL_SUPPORTED_CLK_VBY1_8V4O_10BIT    NO.23
322       //Address,Value,Mask
323         {0x44,0x0004,0x001F},//clk_odclk
324         {0x09,0x0000,0x000F},//clk_vby1
325     },
326 
327     { //E_PNL_SUPPORTED_CLK_VBY1_8V4O_8BIT    NO.24
328       //Address,Value,Mask
329         {0x44,0x0004,0x001F},//clk_odclk
330         {0x09,0x0000,0x000F},//clk_vby1
331     },
332 
333     { //E_PNL_SUPPORTED_CLK_VBY1_4V4O_10BIT    NO.25
334       //Address,Value,Mask
335         {0x44,0x0004,0x001F},//clk_odclk
336         {0x09,0x0000,0x000F},//clk_vby1
337     },
338 
339     { //E_PNL_SUPPORTED_CLK_VBY1_4V4O_8BIT    NO.26
340       //Address,Value,Mask
341         {0x44,0x0004,0x001F},//clk_odclk
342         {0x09,0x0000,0x000F},//clk_vby1
343     },
344 
345     { //E_PNL_SUPPORTED_CLK_VBY1_4V2O_10BIT    NO.27
346       //Address,Value,Mask
347         {0x44,0x0004,0x001F},//clk_odclk
348         {0x09,0x0000,0x000F},//clk_vby1
349     },
350 
351     { //E_PNL_SUPPORTED_CLK_VBY1_4V2O_8BIT    NO.28
352       //Address,Value,Mask
353         {0x44,0x0004,0x001F},//clk_odclk
354         {0x09,0x0000,0x000F},//clk_vby1
355     },
356 };
357 
358 TBLStruct CLKGEN2SettingTBL_OSD[E_PNL_SUPPORTED_CLK_MAX][CLK_GEN2_REG_OSD_NUM]=
359 {
360     { //E_PNL_SUPPORTED_CLK_TTL    NO.0
361       //Address,Value,Mask
362         {0x09,0x0100,0x3F00},//clk_vby1_osd (wclk)
363     },
364 
365     { //E_PNL_SUPPORTED_CLK_LVDS_1CH    NO.1
366       //Address,Value,Mask
367         {0x09,0x0100,0x3F00},//clk_vby1_osd (wclk)
368     },
369 
370     { //E_PNL_SUPPORTED_CLK_LVDS_2CH    NO.2
371       //Address,Value,Mask
372         {0x09,0x0000,0x3F00},//clk_vby1_osd (wclk)
373     },
374 
375     { //E_PNL_SUPPORTED_CLK_HS_LVDS_1CH    NO.3
376       //Address,Value,Mask
377         {0x09,0x0100,0x3F00},//clk_vby1_osd (wclk)
378     },
379 
380     { //E_PNL_SUPPORTED_CLK_HS_LVDS_2CH    NO.4
381       //Address,Value,Mask
382         {0x09,0x0000,0x3F00},//clk_vby1_osd (wclk)
383     },
384 
385     { //E_PNL_SUPPORTED_CLK_VBY1_1CH_10BIT    NO.5
386       //Address,Value,Mask
387         {0x09,0x0000,0x3F00},//clk_vby1_osd (wclk)
388     },
389 
390     { //E_PNL_SUPPORTED_CLK_VBY1_1CH_8BIT    NO.6
391       //Address,Value,Mask
392         {0x09,0x0000,0x3F00},//clk_vby1_osd (wclk)
393     },
394 
395     { //E_PNL_SUPPORTED_CLK_VBY1_2CH_10BIT    NO.7
396       //Address,Value,Mask
397         {0x09,0x0000,0x3F00},//clk_vby1_osd (wclk)
398     },
399 
400     { //E_PNL_SUPPORTED_CLK_VBY1_2CH_8BIT    NO.8
401       //Address,Value,Mask
402         {0x09,0x0000,0x3F00},//clk_vby1_osd (wclk)
403     },
404 
405     { //E_PNL_SUPPORTED_CLK_VBY1_4CH_10BIT    NO.9
406       //Address,Value,Mask
407         {0x09,0x0800,0x3F00},//clk_vby1_osd (wclk)
408     },
409 
410     { //E_PNL_SUPPORTED_CLK_VBY1_4CH_8BIT    NO.10
411       //Address,Value,Mask
412         {0x09,0x0800,0x3F00},//clk_vby1_osd (wclk)
413     },
414 
415     { //E_PNL_SUPPORTED_CLK_VBY1_8CH_10BIT    NO.11
416       //Address,Value,Mask
417         {0x09,0x0800,0x3F00},//clk_vby1_osd (wclk)
418     },
419 
420     { //E_PNL_SUPPORTED_CLK_VBY1_8CH_8BIT    NO.12
421       //Address,Value,Mask
422         {0x09,0x0800,0x3F00},//clk_vby1_osd (wclk)
423     },
424 
425     { //E_PNL_SUPPORTED_CLK_VBY1_16CH_10BIT    NO.13
426       //Address,Value,Mask
427         {0x09,0x0800,0x3F00},//clk_vby1_osd (wclk)
428     },
429 
430     { //E_PNL_SUPPORTED_CLK_VBY1_16CH_8BIT    NO.14
431       //Address,Value,Mask
432         {0x09,0x0800,0x3F00},//clk_vby1_osd (wclk)
433     },
434 
435     { //E_PNL_SUPPORTED_CLK_EPI_24_10BIT_12PAIR_X_1    NO.15
436       //Address,Value,Mask
437         {0x09,0x0000,0x3F00},//clk_vby1_osd (wclk)
438     },
439 
440     { //E_PNL_SUPPORTED_CLK_EPI_28_8BIT_12PAIR_X_1    NO.16
441       //Address,Value,Mask
442         {0x09,0x0000,0x3F00},//clk_vby1_osd (wclk)
443     },
444 
445     { //E_PNL_SUPPORTED_CLK_CMPI_27_8BIT_12PAIR_X_1    NO.17
446       //Address,Value,Mask
447         {0x09,0x0000,0x3F00},//clk_vby1_osd (wclk)
448     },
449 
450     { //E_PNL_SUPPORTED_CLK_CMPI_24_10BIT_12PAIR_X_1    NO.18
451       //Address,Value,Mask
452         {0x09,0x0000,0x3F00},//clk_vby1_osd (wclk)
453     },
454 
455     { //E_PNL_SUPPORTED_CLK_USIT_8BIT_12PAIR_X_1    NO.19
456       //Address,Value,Mask
457         {0x09,0x0800,0x3F00},//clk_vby1_osd (wclk)
458     },
459 
460     { //E_PNL_SUPPORTED_CLK_USIT_10BIT_12PAIR_X_1    NO.20
461       //Address,Value,Mask
462         {0x09,0x0800,0x3F00},//clk_vby1_osd (wclk)
463     },
464 
465     { //E_PNL_SUPPORTED_ISP_9_8BIT_12PAIR_X_1    NO.21
466       //Address,Value,Mask
467         {0x09,0x0800,0x3F00},//clk_vby1_osd (wclk)
468     },
469 
470     { //E_PNL_SUPPORTED_ISP_9_8BIT_6PAIR_X_1    NO.22
471       //Address,Value,Mask
472         {0x09,0x0800,0x3F00},//clk_vby1_osd (wclk)
473     },
474 
475     { //E_PNL_SUPPORTED_CLK_VBY1_8V4O_10BIT    NO.23
476       //Address,Value,Mask
477         {0x09,0x1800,0x3F00},//clk_vby1_osd (wclk)
478     },
479 
480     { //E_PNL_SUPPORTED_CLK_VBY1_8V4O_8BIT    NO.24
481       //Address,Value,Mask
482         {0x09,0x1800,0x3F00},//clk_vby1_osd (wclk)
483     },
484 
485     { //E_PNL_SUPPORTED_CLK_VBY1_4V4O_10BIT    NO.25
486       //Address,Value,Mask
487         {0x09,0x1800,0x3F00},//clk_vby1_osd (wclk)
488     },
489 
490     { //E_PNL_SUPPORTED_CLK_VBY1_4V4O_8BIT    NO.26
491       //Address,Value,Mask
492         {0x09,0x1800,0x3F00},//clk_vby1_osd (wclk)
493     },
494 
495     { //E_PNL_SUPPORTED_CLK_VBY1_4V2O_10BIT    NO.27
496       //Address,Value,Mask
497         {0x09,0x1800,0x3F00},//clk_vby1_osd (wclk)
498     },
499 
500     { //E_PNL_SUPPORTED_CLK_VBY1_4V2O_8BIT    NO.28
501       //Address,Value,Mask
502         {0x09,0x1800,0x3F00},//clk_vby1_osd (wclk)
503     },
504 };
505 
506 TBLStruct CLKGEN0SettingTBL_Video[E_PNL_SUPPORTED_CLK_MAX][CLK_GEN0_REG_VIDEO_NUM]=
507 {
508     { //E_PNL_SUPPORTED_CLK_TTL    NO.0
509       //Address,Value,Mask
510         {0x5A,0x0000,0x0F00},//Vmode
511         {0x53,0x0C00,0x3F00},//clk_odclk_mft
512         {0x57,0x0000,0x000F},//wclk
513         {0x58,0x0000,0x000F},//rclk
514     },
515 
516     { //E_PNL_SUPPORTED_CLK_LVDS_1CH    NO.1
517       //Address,Value,Mask
518         {0x5A,0x0000,0x0F00},//Vmode
519         {0x53,0x0C00,0x3F00},//clk_odclk_mft
520         {0x57,0x0000,0x000F},//wclk
521         {0x58,0x0000,0x000F},//rclk
522     },
523 
524     { //E_PNL_SUPPORTED_CLK_LVDS_2CH    NO.2
525       //Address,Value,Mask
526         {0x5A,0x0000,0x0F00},//Vmode
527         {0x53,0x0C00,0x3F00},//clk_odclk_mft
528         {0x57,0x0000,0x000F},//wclk
529         {0x58,0x0000,0x000F},//rclk
530     },
531 
532     { //E_PNL_SUPPORTED_CLK_HS_LVDS_1CH    NO.3
533       //Address,Value,Mask
534         {0x5A,0x0000,0x0F00},//Vmode
535         {0x53,0x0C00,0x3F00},//clk_odclk_mft
536         {0x57,0x0000,0x000F},//wclk
537         {0x58,0x0000,0x000F},//rclk
538     },
539 
540     { //E_PNL_SUPPORTED_CLK_HS_LVDS_2CH    NO.4
541       //Address,Value,Mask
542         {0x5A,0x0000,0x0F00},//Vmode
543         {0x53,0x0C00,0x3F00},//clk_odclk_mft
544         {0x57,0x0000,0x000F},//wclk
545         {0x58,0x0000,0x000F},//rclk
546     },
547 
548     { //E_PNL_SUPPORTED_CLK_VBY1_1CH_10BIT    NO.5
549       //Address,Value,Mask
550         {0x5A,0x0A00,0x0F00},//Vmode
551         {0x53,0x0C00,0x3F00},//clk_odclk_mft
552         {0x57,0x000C,0x000F},//wclk
553         {0x58,0x0000,0x000F},//rclk
554     },
555 
556     { //E_PNL_SUPPORTED_CLK_VBY1_1CH_8BIT    NO.6
557       //Address,Value,Mask
558         {0x5A,0x0000,0x0F00},//Vmode
559         {0x53,0x0C00,0x3F00},//clk_odclk_mft
560         {0x57,0x000C,0x000F},//wclk
561         {0x58,0x0000,0x000F},//rclk
562     },
563 
564     { //E_PNL_SUPPORTED_CLK_VBY1_2CH_10BIT    NO.7
565       //Address,Value,Mask
566         {0x5A,0x0A00,0x0F00},//Vmode
567         {0x53,0x0C00,0x3F00},//clk_odclk_mft
568         {0x57,0x000C,0x000F},//wclk
569         {0x58,0x0000,0x000F},//rclk
570     },
571 
572     { //E_PNL_SUPPORTED_CLK_VBY1_2CH_8BIT    NO.8
573       //Address,Value,Mask
574         {0x5A,0x0000,0x0F00},//Vmode
575         {0x53,0x0C00,0x3F00},//clk_odclk_mft
576         {0x57,0x000C,0x000F},//wclk
577         {0x58,0x0000,0x000F},//rclk
578     },
579 
580     { //E_PNL_SUPPORTED_CLK_VBY1_4CH_10BIT    NO.9
581       //Address,Value,Mask
582         {0x5A,0x0900,0x0F00},//Vmode
583         {0x53,0x0400,0x3F00},//clk_odclk_mft
584         {0x57,0x000C,0x000F},//wclk
585         {0x58,0x0000,0x000F},//rclk
586     },
587 
588     { //E_PNL_SUPPORTED_CLK_VBY1_4CH_8BIT    NO.10
589       //Address,Value,Mask
590         {0x5A,0x0000,0x0F00},//Vmode
591         {0x53,0x0400,0x3F00},//clk_odclk_mft
592         {0x57,0x000C,0x000F},//wclk
593         {0x58,0x0000,0x000F},//rclk
594     },
595 
596     { //E_PNL_SUPPORTED_CLK_VBY1_8CH_10BIT    NO.11
597       //Address,Value,Mask
598         {0x5A,0x0800,0x0F00},//Vmode
599         {0x53,0x0400,0x3F00},//clk_odclk_mft
600         {0x57,0x000C,0x000F},//wclk
601         {0x58,0x0000,0x000F},//rclk
602     },
603 
604     { //E_PNL_SUPPORTED_CLK_VBY1_8CH_8BIT    NO.12
605       //Address,Value,Mask
606         {0x5A,0x0000,0x0F00},//Vmode
607         {0x53,0x0400,0x3F00},//clk_odclk_mft
608         {0x57,0x000C,0x000F},//wclk
609         {0x58,0x0000,0x000F},//rclk
610     },
611 
612     { //E_PNL_SUPPORTED_CLK_VBY1_16CH_10BIT    NO.13
613       //Address,Value,Mask
614         {0x5A,0x0800,0x0F00},//Vmode
615         {0x53,0x0C00,0x3F00},//clk_odclk_mft
616         {0x57,0x000C,0x000F},//wclk
617         {0x58,0x0000,0x000F},//rclk
618     },
619 
620     { //E_PNL_SUPPORTED_CLK_VBY1_16CH_8BIT    NO.14
621       //Address,Value,Mask
622         {0x5A,0x0000,0x0F00},//Vmode
623         {0x53,0x0C00,0x3F00},//clk_odclk_mft
624         {0x57,0x000C,0x000F},//wclk
625         {0x58,0x0000,0x000F},//rclk
626     },
627 
628     { //E_PNL_SUPPORTED_CLK_EPI_24_10BIT_12PAIR_X_1    NO.15
629       //Address,Value,Mask
630         {0x5A,0x0000,0x0F00},//Vmode
631         {0x53,0x0C00,0x3F00},//clk_odclk_mft
632         {0x57,0x0000,0x000F},//wclk
633         {0x58,0x0000,0x000F},//rclk
634     },
635 
636     { //E_PNL_SUPPORTED_CLK_EPI_28_8BIT_12PAIR_X_1    NO.16
637       //Address,Value,Mask
638         {0x5A,0x0000,0x0F00},//Vmode
639         {0x53,0x0C00,0x3F00},//clk_odclk_mft
640         {0x57,0x0000,0x000F},//wclk
641         {0x58,0x0000,0x000F},//rclk
642     },
643 
644     { //E_PNL_SUPPORTED_CLK_CMPI_27_8BIT_12PAIR_X_1    NO.17
645       //Address,Value,Mask
646         {0x5A,0x0000,0x0F00},//Vmode
647         {0x53,0x0C00,0x3F00},//clk_odclk_mft
648         {0x57,0x0000,0x000F},//wclk
649         {0x58,0x0000,0x000F},//rclk
650     },
651 
652     { //E_PNL_SUPPORTED_CLK_CMPI_24_10BIT_12PAIR_X_1    NO.18
653       //Address,Value,Mask
654         {0x5A,0x0000,0x0F00},//Vmode
655         {0x53,0x0C00,0x3F00},//clk_odclk_mft
656         {0x57,0x0000,0x000F},//wclk
657         {0x58,0x0000,0x000F},//rclk
658     },
659 
660     { //E_PNL_SUPPORTED_CLK_USIT_8BIT_12PAIR_X_1    NO.19
661       //Address,Value,Mask
662         {0x5A,0x0000,0x0F00},//Vmode
663         {0x53,0x0C00,0x3F00},//clk_odclk_mft
664         {0x57,0x000C,0x000F},//wclk
665         {0x58,0x0000,0x000F},//rclk
666     },
667 
668     { //E_PNL_SUPPORTED_CLK_USIT_10BIT_12PAIR_X_1    NO.20
669       //Address,Value,Mask
670         {0x5A,0x0000,0x0F00},//Vmode
671         {0x53,0x0C00,0x3F00},//clk_odclk_mft
672         {0x57,0x000C,0x000F},//wclk
673         {0x58,0x0000,0x000F},//rclk
674     },
675 
676     { //E_PNL_SUPPORTED_ISP_9_8BIT_12PAIR_X_1    NO.21
677       //Address,Value,Mask
678         {0x5A,0x0000,0x0F00},//Vmode
679         {0x53,0x0C00,0x3F00},//clk_odclk_mft
680         {0x57,0x000C,0x000F},//wclk
681         {0x58,0x0000,0x000F},//rclk
682     },
683 
684     { //E_PNL_SUPPORTED_ISP_9_8BIT_6PAIR_X_1    NO.22
685       //Address,Value,Mask
686         {0x5A,0x0000,0x0F00},//Vmode
687         {0x53,0x0C00,0x3F00},//clk_odclk_mft
688         {0x57,0x000C,0x000F},//wclk
689         {0x58,0x0000,0x000F},//rclk
690     },
691 
692     { //E_PNL_SUPPORTED_CLK_VBY1_8V4O_10BIT    NO.23
693       //Address,Value,Mask
694         {0x5A,0x0800,0x0F00},//Vmode
695         {0x53,0x0400,0x3F00},//clk_odclk_mft
696         {0x57,0x000C,0x000F},//wclk
697         {0x58,0x0000,0x000F},//rclk
698     },
699 
700     { //E_PNL_SUPPORTED_CLK_VBY1_8V4O_8BIT    NO.24
701       //Address,Value,Mask
702         {0x5A,0x0000,0x0F00},//Vmode
703         {0x53,0x0400,0x3F00},//clk_odclk_mft
704         {0x57,0x000C,0x000F},//wclk
705         {0x58,0x0000,0x000F},//rclk
706     },
707 
708     { //E_PNL_SUPPORTED_CLK_VBY1_4V4O_10BIT    NO.25
709       //Address,Value,Mask
710         {0x5A,0x0900,0x0F00},//Vmode
711         {0x53,0x0400,0x3F00},//clk_odclk_mft
712         {0x57,0x000C,0x000F},//wclk
713         {0x58,0x0000,0x000F},//rclk
714     },
715 
716     { //E_PNL_SUPPORTED_CLK_VBY1_4V4O_8BIT    NO.26
717       //Address,Value,Mask
718         {0x5A,0x0000,0x0F00},//Vmode
719         {0x53,0x0400,0x3F00},//clk_odclk_mft
720         {0x57,0x000C,0x000F},//wclk
721         {0x58,0x0000,0x000F},//rclk
722     },
723 
724     { //E_PNL_SUPPORTED_CLK_VBY1_4V2O_10BIT    NO.27
725       //Address,Value,Mask
726         {0x5A,0x0900,0x0F00},//Vmode
727         {0x53,0x0400,0x3F00},//clk_odclk_mft
728         {0x57,0x000C,0x000F},//wclk
729         {0x58,0x0000,0x000F},//rclk
730     },
731 
732     { //E_PNL_SUPPORTED_CLK_VBY1_4V2O_8BIT    NO.28
733       //Address,Value,Mask
734         {0x5A,0x0000,0x0F00},//Vmode
735         {0x53,0x0400,0x3F00},//clk_odclk_mft
736         {0x57,0x000C,0x000F},//wclk
737         {0x58,0x0000,0x000F},//rclk
738     },
739 };
740 
741 TBLStruct CLKGEN0SettingTBL_OSD[E_PNL_SUPPORTED_CLK_MAX][CLK_GEN0_REG_OSD_NUM]=
742 {
743     { //E_PNL_SUPPORTED_CLK_TTL    NO.0
744       //Address,Value,Mask
745         {0x5A,0x0000,0xF000},//Omode
746         {0x63,0x0001,0x003F},//clk_osd2mod
747         {0x63,0x0100,0x0F00},//osd_rclk
748     },
749 
750     { //E_PNL_SUPPORTED_CLK_LVDS_1CH    NO.1
751       //Address,Value,Mask
752         {0x5A,0x0000,0xF000},//Omode
753         {0x63,0x0000,0x003F},//clk_osd2mod//{0x63,0x0001,0x003F},//clk_osd2mod
754         {0x63,0x0000,0x0F00},//osd_rclk//{0x63,0x0100,0x0F00},//osd_rclk
755     },
756 
757     { //E_PNL_SUPPORTED_CLK_LVDS_2CH    NO.2
758       //Address,Value,Mask
759         {0x5A,0x0000,0xF000},//Omode
760         {0x63,0x0000,0x003F},//clk_osd2mod
761         {0x63,0x0000,0x0F00},//osd_rclk
762     },
763 
764     { //E_PNL_SUPPORTED_CLK_HS_LVDS_1CH    NO.3
765       //Address,Value,Mask
766         {0x5A,0x0000,0xF000},//Omode
767         {0x63,0x0001,0x003F},//clk_osd2mod
768         {0x63,0x0100,0x0F00},//osd_rclk
769     },
770 
771     { //E_PNL_SUPPORTED_CLK_HS_LVDS_2CH    NO.4
772       //Address,Value,Mask
773         {0x5A,0x0000,0xF000},//Omode
774         {0x63,0x0000,0x003F},//clk_osd2mod
775         {0x63,0x0000,0x0F00},//osd_rclk
776     },
777 
778     { //E_PNL_SUPPORTED_CLK_VBY1_2CH_10BIT    NO.5
779       //Address,Value,Mask
780         {0x5A,0x0000,0xF000},//Omode
781         {0x63,0x0001,0x003F},//clk_osd2mod
782         {0x63,0x0000,0x0F00},//osd_rclk
783     },
784 
785     { //E_PNL_SUPPORTED_CLK_VBY1_2CH_8BIT    NO.6
786       //Address,Value,Mask
787         {0x5A,0x0000,0xF000},//Omode
788         {0x63,0x0001,0x003F},//clk_osd2mod
789         {0x63,0x0000,0x0F00},//osd_rclk
790     },
791 
792 
793     { //E_PNL_SUPPORTED_CLK_VBY1_2CH_10BIT    NO.7
794       //Address,Value,Mask
795         {0x5A,0x0000,0xF000},//Omode
796         {0x63,0x0001,0x003F},//clk_osd2mod
797         {0x63,0x0000,0x0F00},//osd_rclk
798     },
799 
800     { //E_PNL_SUPPORTED_CLK_VBY1_2CH_8BIT    NO.8
801       //Address,Value,Mask
802         {0x5A,0x0000,0xF000},//Omode
803         {0x63,0x0001,0x003F},//clk_osd2mod
804         {0x63,0x0000,0x0F00},//osd_rclk
805     },
806 
807     { //E_PNL_SUPPORTED_CLK_VBY1_4CH_10BIT    NO.9
808       //Address,Value,Mask
809         {0x5A,0x0000,0xF000},//Omode
810         {0x63,0x0001,0x003F},//clk_osd2mod
811         {0x63,0x0000,0x0F00},//osd_rclk
812     },
813 
814     { //E_PNL_SUPPORTED_CLK_VBY1_4CH_8BIT    NO.10
815       //Address,Value,Mask
816         {0x5A,0x0000,0xF000},//Omode
817         {0x63,0x0001,0x003F},//clk_osd2mod
818         {0x63,0x0000,0x0F00},//osd_rclk
819     },
820 
821     { //E_PNL_SUPPORTED_CLK_VBY1_8CH_10BIT    NO.11
822       //Address,Value,Mask
823         {0x5A,0x0000,0xF000},//Omode
824         {0x63,0x0001,0x003F},//clk_osd2mod
825         {0x63,0x0000,0x0F00},//osd_rclk
826     },
827 
828     { //E_PNL_SUPPORTED_CLK_VBY1_8CH_8BIT    NO.12
829       //Address,Value,Mask
830         {0x5A,0x0000,0xF000},//Omode
831         {0x63,0x0001,0x003F},//clk_osd2mod
832         {0x63,0x0000,0x0F00},//osd_rclk
833     },
834 
835     { //E_PNL_SUPPORTED_CLK_VBY1_16CH_10BIT    NO.13
836       //Address,Value,Mask
837         {0x5A,0x0000,0xF000},//Omode
838         {0x63,0x0001,0x003F},//clk_osd2mod
839         {0x63,0x0000,0x0F00},//osd_rclk
840     },
841 
842     { //E_PNL_SUPPORTED_CLK_VBY1_16CH_8BIT    NO.14
843       //Address,Value,Mask
844 
845         {0x5A,0x0000,0xF000},//Omode
846         {0x63,0x0001,0x003F},//clk_osd2mod
847         {0x63,0x0000,0x0F00},//osd_rclk
848     },
849 
850     { //E_PNL_SUPPORTED_CLK_EPI_24_10BIT_12PAIR_X_1    NO.15
851       //Address,Value,Mask
852         {0x5A,0x0000,0xF000},//Omode
853         {0x63,0x0001,0x003F},//clk_osd2mod
854         {0x63,0x0000,0x0F00},//osd_rclk
855     },
856 
857     { //E_PNL_SUPPORTED_CLK_EPI_28_8BIT_12PAIR_X_1    NO.16
858       //Address,Value,Mask
859         {0x5A,0x0000,0xF000},//Omode
860         {0x63,0x0001,0x003F},//clk_osd2mod
861         {0x63,0x0000,0x0F00},//osd_rclk
862     },
863 
864     { //E_PNL_SUPPORTED_CLK_CMPI_27_8BIT_12PAIR_X_1    NO.17
865       //Address,Value,Mask
866         {0x5A,0x0000,0xF000},//Omode
867         {0x63,0x0001,0x003F},//clk_osd2mod
868         {0x63,0x0000,0x0F00},//osd_rclk
869     },
870 
871     { //E_PNL_SUPPORTED_CLK_CMPI_24_10BIT_12PAIR_X_1    NO.18
872       //Address,Value,Mask
873         {0x5A,0x0000,0xF000},//Omode
874         {0x63,0x0001,0x003F},//clk_osd2mod
875         {0x63,0x0000,0x0F00},//osd_rclk
876     },
877 
878     { //E_PNL_SUPPORTED_CLK_USIT_8BIT_12PAIR_X_1    NO.19
879       //Address,Value,Mask
880         {0x5A,0x0000,0xF000},//Omode
881         {0x63,0x0001,0x003F},//clk_osd2mod
882         {0x63,0x0000,0x0F00},//osd_rclk
883     },
884 
885     { //E_PNL_SUPPORTED_CLK_USIT_10BIT_12PAIR_X_1    NO.20
886       //Address,Value,Mask
887         {0x5A,0x0000,0xF000},//Omode
888         {0x63,0x0001,0x003F},//clk_osd2mod
889         {0x63,0x0000,0x0F00},//osd_rclk
890     },
891 
892     { //E_PNL_SUPPORTED_ISP_9_8BIT_12PAIR_X_1    NO.21
893       //Address,Value,Mask
894         {0x5A,0x0000,0xF000},//Omode
895         {0x63,0x0001,0x003F},//clk_osd2mod
896         {0x63,0x0000,0x0F00},//osd_rclk
897     },
898 
899     { //E_PNL_SUPPORTED_ISP_9_8BIT_6PAIR_X_1    NO.22
900       //Address,Value,Mask
901         {0x5A,0x0000,0xF000},//Omode
902         {0x63,0x0001,0x003F},//clk_osd2mod
903         {0x63,0x0000,0x0F00},//osd_rclk
904     },
905 
906     { //E_PNL_SUPPORTED_CLK_VBY1_8V4O_10BIT    NO.23
907       //Address,Value,Mask
908         {0x5A,0x8000,0xF000},//Omode
909         {0x63,0x0010,0x003F},//clk_osd2mod
910         {0x63,0x0400,0x0F00},//osd_rclk
911     },
912 
913     { //E_PNL_SUPPORTED_CLK_VBY1_8V4O_8BIT    NO.24
914       //Address,Value,Mask
915         {0x5A,0x0000,0xF000},//Omode
916         {0x63,0x0010,0x003F},//clk_osd2mod
917         {0x63,0x0400,0x0F00},//osd_rclk
918     },
919 
920     { //E_PNL_SUPPORTED_CLK_VBY1_4V4O_10BIT    NO.25
921       //Address,Value,Mask
922         {0x5A,0x8000,0xF000},//Omode
923         {0x63,0x0010,0x003F},//clk_osd2mod
924         {0x63,0x0400,0x0F00},//osd_rclk
925     },
926 
927     { //E_PNL_SUPPORTED_CLK_VBY1_4V4O_8BIT    NO.26
928       //Address,Value,Mask
929         {0x5A,0x0000,0xF000},//Omode
930         {0x63,0x0010,0x003F},//clk_osd2mod
931         {0x63,0x0400,0x0F00},//osd_rclk
932     },
933 
934     { //E_PNL_SUPPORTED_CLK_VBY1_4V2O_10BIT    NO.27
935       //Address,Value,Mask
936         {0x5A,0x9000,0xF000},//Omode
937         {0x63,0x0010,0x003F},//clk_osd2mod
938         {0x63,0x0400,0x0F00},//osd_rclk
939     },
940 
941     { //E_PNL_SUPPORTED_CLK_VBY1_4V2O_8BIT    NO.28
942       //Address,Value,Mask
943         {0x5A,0x0000,0xF000},//Omode
944         {0x63,0x0010,0x003F},//clk_osd2mod
945         {0x63,0x0400,0x0F00},//osd_rclk
946     },
947 };
948 //-------------------------------------------------------------------------------------------------
949 //  Global Variables
950 //-------------------------------------------------------------------------------------------------
951 #define LANE_NUM_EACH_PINMAPPING_GROUP1 4
952 #define LANE_NUM_EACH_PINMAPPING_GROUP2 4
953 #define LANE_NUM_EACH_PINMAPPING_GROUP3 4
954 #define LANE_NUM_EACH_PINMAPPING_GROUP4 4
955 
956 #define PINMAPPING_EXP 16
957 
958 #define PINMAPPING_MAX_LANE (0xF)
959 //-------------------------------------------------------------------------------------------------
960 //  Local Variables
961 //-------------------------------------------------------------------------------------------------
962 MS_U8 LANE_AND_CLK_TBL[VBY1_CLK_TBL_ROW][3]=
963 { //lane(from)  lane(to) bit(mask)
964  { 0, 3, 0x01, },
965  { 4, 7, 0x02, },
966  { 8, 11,0x04, },
967  { 12,15,0x08, }
968 };
969 
970 extern MS_BOOL MDrv_XC_IsSupportPipPatchUsingSc1MainAsSc0Sub(void);
971 //-------------------------------------------------------------------------------------------------
972 //  Debug Functions
973 //-------------------------------------------------------------------------------------------------
974 
975 //-------------------------------------------------------------------------------------------------
976 //  Local Functions
977 //-------------------------------------------------------------------------------------------------
978 static MS_BOOL _Hal_MOD_External_eFuse(void);
979 static void _Hal_MOD_VB1_CH_SWICH(PNL_TYPE eLPLL_Type_Ext);
980 static MS_U16 _Hal_MOD_Refine_ICON(MS_U16 u16ICON);
981 static E_PNL_SUPPORTED_CLK_TYPE _MHal_Transfer_PanelType_To_CLKType(PNL_TYPE eLPLL_Type, PNL_MODE eLPLL_Mode);
982 static E_PNL_SUPPORTED_CLK_TYPE _MHal_Transfer_PanelType_To_CLKType_OSD(PNL_TYPE eLPLL_OSD_Type,PNL_TYPE eLPLL_Video_Type,PNL_MODE eLPLL_Mode);
983 static void _MHal_PNL_DumpVideoClkTable(MS_U8 u8CLKTblIndex);
984 static void _MHal_PNL_DumpOSDClkTable(MS_U8 u8CLKTblIndex);
985 static void _MHal_PNL_Init_MFT(void *pInstance, PNL_InitData *pstPanelInitData);
986 
987 static void _MHal_PNL_Auto_Set_Config(void *pInstance,
988                                       MS_U16 u16OutputOrder0_3,
989                                       MS_U16 u16OutputOrder4_7,
990                                       MS_U16 u16OutputOrder8_11,
991                                       MS_U16 u16OutputOrder12_15);
992 
993 static void _MHal_PNL_Set_Clk(void *pInstance,
994                               MS_U8 u8LaneNum,
995                               MS_U16 u16OutputOrder0_3,
996                               MS_U16 u16OutputOrder4_7,
997                               MS_U16 u16OutputOrder8_11,
998                               MS_U16 u16OutputOrder12_15);
999 
1000 static MS_U8 _MHal_PNL_Get_LaneNum(void *pInstance);
1001 //-------------------------------------------------------------------------------------------------
1002 //  Global Function
1003 //-------------------------------------------------------------------------------------------------
1004 /**
1005 *   @brief: Power On MOD. but not mutex protected
1006 *
1007 */
1008 #define OUTPUT_CHANNEL_HALF_L 0x0055
1009 #define OUTPUT_CHANNEL_HALF_H 0x5500
1010 
MHal_MOD_PowerOn(void * pInstance,MS_BOOL bEn,MS_U8 u8LPLL_Type,MS_U8 DualModeType,MS_U16 u16OutputCFG0_7,MS_U16 u16OutputCFG8_15,MS_U16 u16OutputCFG16_21)1011 MS_U8 MHal_MOD_PowerOn(void *pInstance, MS_BOOL bEn, MS_U8 u8LPLL_Type,MS_U8 DualModeType, MS_U16 u16OutputCFG0_7, MS_U16 u16OutputCFG8_15, MS_U16 u16OutputCFG16_21)
1012 {
1013     PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
1014     PNL_RESOURCE_PRIVATE* pPNLResourcePrivate = NULL;
1015     UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
1016     UtopiaResourceGetPrivate(g_pPNLResource[PNL_GET_INTERNAL_POOL_ID(pPNLInstancePrivate->u32DeviceID)],(void**)(&pPNLResourcePrivate));
1017 
1018     MS_U16 u16ChannelClk_En = 0;
1019 
1020     if( bEn )
1021     {
1022         MOD_A_W2BYTEMSK(REG_MOD_A_BK00_10_L, 0x00, BIT(4)); //reg_ck1x_4dig_phsel_path2
1023 
1024         //analog MOD power down. 1: power down, 0: power up
1025         // For Mod2 no output signel
1026         ///////////////////////////////////////////////////
1027 
1028         //2. Power on MOD (current and regulator)
1029         MOD_A_W2BYTEMSK(REG_MOD_A_BK00_01_L, BIT(1) , BIT(1)); //reg_gcr_en_reg: enable clk tree pwr
1030         MOD_A_W2BYTEMSK(REG_MOD_A_BK00_01_L, 0x00 , BIT(0)); //reg_pd_ib_mod: power down mod atop
1031 
1032         //enable ib, enable ck
1033         // [0]:ch0_3 [1]:ch4_7 [2]:ch8_11 [3]:ch12_15
1034         if(u16OutputCFG0_7  & OUTPUT_CHANNEL_HALF_L)
1035             u16ChannelClk_En |= BIT(0);
1036         if(u16OutputCFG0_7  & OUTPUT_CHANNEL_HALF_H)
1037             u16ChannelClk_En |= BIT(1);
1038         if(u16OutputCFG8_15 & OUTPUT_CHANNEL_HALF_L)
1039             u16ChannelClk_En |= BIT(2);
1040         if(u16OutputCFG8_15 & OUTPUT_CHANNEL_HALF_H)
1041             u16ChannelClk_En |= BIT(3);
1042 
1043         MOD_A_W2BYTEMSK(REG_MOD_A_BK00_00_L, u16ChannelClk_En, 0x001F);
1044 
1045         // clock gen of dot-mini
1046         if(u8LPLL_Type == E_PNL_TYPE_MINILVDS)
1047         {
1048             MOD_A_W2BYTEMSK(REG_MOD_A_BK00_76_L, 0x0400, 0x0FFF);
1049             MOD_A_W2BYTEMSK(REG_MOD_A_BK00_6F_L, 0x0444, 0x0FFF);
1050         }
1051         else if( (u8LPLL_Type == E_PNL_LPLL_VBY1_10BIT_16LANE)||
1052                  (u8LPLL_Type == E_PNL_LPLL_VBY1_8BIT_16LANE))
1053         {
1054             MOD_A_W2BYTEMSK(REG_MOD_A_BK00_76_L, 0x0000, 0x0FFF);
1055             MOD_A_W2BYTEMSK(REG_MOD_A_BK00_6F_L, 0x0000, 0x0FFF);
1056         }
1057         else if(u8LPLL_Type == E_PNL_LPLL_VBY1_10BIT_8LANE)
1058         {
1059             MOD_A_W2BYTEMSK(REG_MOD_A_BK00_76_L, 0x0000, 0x0FFF);
1060             MOD_A_W2BYTEMSK(REG_MOD_A_BK00_6F_L, 0x0000, 0x0FFF);
1061         }
1062         else if((u8LPLL_Type == E_PNL_LPLL_VBY1_10BIT_4LANE)||
1063                 (u8LPLL_Type == E_PNL_LPLL_VBY1_10BIT_2LANE)||
1064                 (u8LPLL_Type == E_PNL_LPLL_VBY1_8BIT_4LANE) ||
1065                 (u8LPLL_Type == E_PNL_LPLL_VBY1_8BIT_2LANE))
1066 
1067         {
1068             MOD_A_W2BYTEMSK(REG_MOD_A_BK00_76_L, 0x0000, 0x0FFF);
1069             MOD_A_W2BYTEMSK(REG_MOD_A_BK00_6F_L, 0x0000, 0x0FFF);
1070         }
1071         //// for osd dedicated output port, 1 port for video and 1 port for osd
1072         else if((u8LPLL_Type == E_PNL_TYPE_HS_LVDS)&&
1073                 (pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Mode == E_PNL_MODE_SINGLE))
1074         {
1075             MOD_A_W2BYTEMSK(REG_MOD_A_BK00_76_L, 0x0044, 0x0FFF);
1076             MOD_A_W2BYTEMSK(REG_MOD_A_BK00_6F_L, 0x0400, 0x0FFF);
1077         }
1078         else
1079         {
1080             MOD_A_W2BYTEMSK(REG_MOD_A_BK00_76_L, 0x0000, 0x0FFF);
1081             MOD_A_W2BYTEMSK(REG_MOD_A_BK00_6F_L, 0x0000, 0x0FFF);
1082         }
1083 
1084         // 3. 4. 5.
1085         MHal_Output_LVDS_Pair_Setting(pInstance, DualModeType, u16OutputCFG0_7, u16OutputCFG8_15, u16OutputCFG16_21);
1086     }
1087     else
1088     {
1089         MOD_A_W2BYTEMSK(REG_MOD_A_BK00_10_L, BIT(4), BIT(4));// reg_ck1x_4dig_phsel_path2: test phase
1090         if(u8LPLL_Type !=E_PNL_TYPE_MINILVDS)
1091         {
1092             MOD_A_W2BYTEMSK(REG_MOD_A_BK00_01_L, BIT(0), BIT(0)); //analog MOD power down. 1: power down, 0: power up
1093             MOD_A_W2BYTEMSK(REG_MOD_A_BK00_01_L, 0x00, BIT(1));   //reg_gcr_en_reg: enable clk tree pwr
1094         }
1095 
1096         MOD_A_W2BYTEMSK(REG_MOD_A_BK00_00_L, 0x0000, 0x001F);                           //enable ib, enable ck
1097 
1098         // clock gen of dot-mini
1099         MOD_A_W2BYTEMSK(REG_MOD_A_BK00_76_L, 0x0100, 0x0FFF);
1100         MOD_A_W2BYTEMSK(REG_MOD_A_BK00_6F_L, 0x0111, 0x0FFF);
1101 
1102         if(  IsVBY1(u8LPLL_Type) )
1103         {
1104             MOD_A_W2BYTEMSK(REG_MOD_A_BK00_01_L, 0x2000,0x2000);
1105             MsOS_DelayTask(1);
1106             MOD_A_W2BYTE(REG_MOD_A_BK00_18_L, 0x0000);
1107             MOD_A_W2BYTE(REG_MOD_A_BK00_19_L, 0x0000);
1108             MOD_A_W2BYTEMSK(REG_MOD_A_BK00_01_L, 0x0000,0x2000);
1109         }
1110     }
1111     return 1;
1112 }
1113 
1114 /**
1115 *   @brief: Setup the PVDD power 1:2.5V, 0:3.3V
1116 *
1117 */
MHal_MOD_PVDD_Power_Setting(void * pInstance,MS_BOOL bIs2p5)1118 void MHal_MOD_PVDD_Power_Setting(void *pInstance, MS_BOOL bIs2p5)
1119 {
1120     //MOD_A_W2BYTEMSK(REG_MOD_A_BK00_39_L, ((bIs2p5)? BIT(6):0), BIT(6));    //MOD PVDD=1: 0.9
1121 }
1122 
MHal_PNL_TCON_Init(void * pInstance)1123 void MHal_PNL_TCON_Init(void *pInstance)
1124 {
1125 
1126 }
1127 
MHal_Shift_LVDS_Pair(void * pInstance,MS_U8 Type)1128 void MHal_Shift_LVDS_Pair(void *pInstance, MS_U8 Type)
1129 {
1130     UNUSED(Type);
1131 }
1132 
MHal_Output_LVDS_Pair_Setting(void * pInstance,MS_U8 Type,MS_U16 u16OutputCFG0_7,MS_U16 u16OutputCFG8_15,MS_U16 u16OutputCFG16_21)1133 void MHal_Output_LVDS_Pair_Setting(void *pInstance, MS_U8 Type, MS_U16 u16OutputCFG0_7, MS_U16 u16OutputCFG8_15, MS_U16 u16OutputCFG16_21)
1134 {
1135 
1136     if(Type == LVDS_DUAL_OUTPUT_SPECIAL )
1137     {
1138         MOD_A_W2BYTE(REG_MOD_A_BK00_18_L, 0x0555);
1139         MOD_A_W2BYTE(REG_MOD_A_BK00_19_L, 0x1554);
1140     }
1141     else if(Type == LVDS_SINGLE_OUTPUT_A)
1142     {
1143         MOD_A_W2BYTEMSK(REG_MOD_A_BK00_18_L, 0x5550, 0xFFF0);
1144         MOD_A_W2BYTE(REG_MOD_A_BK00_19_L, 0x0555);
1145     }
1146     else if( Type == LVDS_SINGLE_OUTPUT_B)
1147     {
1148         MOD_A_W2BYTEMSK(REG_MOD_A_BK00_18_L, 0x5550, 0xFFF0);
1149         MOD_A_W2BYTE(REG_MOD_A_BK00_19_L, 0x0555);
1150     }
1151     else if( Type == LVDS_OUTPUT_User)
1152     {
1153         MOD_A_W2BYTE(REG_MOD_A_BK00_18_L, u16OutputCFG0_7);
1154         MOD_A_W2BYTE(REG_MOD_A_BK00_19_L, u16OutputCFG8_15);
1155     }
1156     else
1157     {
1158         MOD_A_W2BYTEMSK(REG_MOD_A_BK00_18_L, 0x5550, 0xFFF0);
1159         MOD_A_W2BYTE(REG_MOD_A_BK00_19_L, 0x0555);
1160     }
1161 
1162     MsOS_DelayTask(2);
1163 
1164 }
1165 
MHal_Output_Channel_Order(void * pInstance,MS_U8 Type,MS_U16 u16OutputOrder0_3,MS_U16 u16OutputOrder4_7,MS_U16 u16OutputOrder8_11,MS_U16 u16OutputOrder12_13)1166 void MHal_Output_Channel_Order(void *pInstance,
1167                                MS_U8 Type,
1168                                MS_U16 u16OutputOrder0_3,
1169                                MS_U16 u16OutputOrder4_7,
1170                                MS_U16 u16OutputOrder8_11,
1171                                MS_U16 u16OutputOrder12_13)
1172 {
1173     PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
1174     PNL_RESOURCE_PRIVATE* pPNLResourcePrivate = NULL;
1175     UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
1176     UtopiaResourceGetPrivate(g_pPNLResource[PNL_GET_INTERNAL_POOL_ID(pPNLInstancePrivate->u32DeviceID)],(void**)(&pPNLResourcePrivate));
1177 
1178     if(Type == APIPNL_OUTPUT_CHANNEL_ORDER_USER )
1179     {
1180         MOD_W2BYTE(REG_MOD_BK00_55_L, u16OutputOrder0_3);
1181         MOD_W2BYTE(REG_MOD_BK00_56_L, u16OutputOrder4_7);
1182         MOD_W2BYTE(REG_MOD_BK00_57_L, u16OutputOrder8_11);
1183         MOD_W2BYTE(REG_MOD_BK00_58_L, u16OutputOrder12_13);
1184     }
1185     else
1186     {
1187         if(   (pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type_Ext == E_PNL_LPLL_VBY1_10BIT_8LANE)
1188             ||(pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type_Ext == E_PNL_LPLL_VBY1_8BIT_8LANE))
1189         {
1190             if(pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16MOD_CTRLA & BIT(1)) // 2 Divisoin
1191             {//APN 8V setting
1192                 MOD_W2BYTE(REG_MOD_BK00_55_L, 0x3210);
1193                 MOD_W2BYTE(REG_MOD_BK00_56_L, 0xBA98);
1194                 MOD_W2BYTE(REG_MOD_BK00_57_L, 0xFFFF);
1195                 MOD_W2BYTE(REG_MOD_BK00_58_L, 0xFFFF);
1196             }
1197             else
1198             {//APN 8V setting
1199                 MOD_W2BYTE(REG_MOD_BK00_55_L, 0x9810);
1200                 MOD_W2BYTE(REG_MOD_BK00_56_L, 0xBA32);
1201                 MOD_W2BYTE(REG_MOD_BK00_57_L, 0xFFFF);
1202                 MOD_W2BYTE(REG_MOD_BK00_58_L, 0xFFFF);
1203             }
1204         }
1205         else if(pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type == E_PNL_TYPE_LVDS)
1206         {//LVDS
1207             if(pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Mode==E_PNL_MODE_SINGLE)
1208             {
1209                 MOD_W2BYTE(REG_MOD_BK00_55_L, 0x76FF);
1210                 MOD_W2BYTE(REG_MOD_BK00_56_L, 0xBA98);
1211                 MOD_W2BYTE(REG_MOD_BK00_57_L, 0x3210);
1212                 MOD_W2BYTE(REG_MOD_BK00_58_L, 0xFF54);
1213             }
1214             else
1215             {
1216                 MOD_W2BYTE(REG_MOD_BK00_55_L, 0x10FF);
1217                 MOD_W2BYTE(REG_MOD_BK00_56_L, 0x5432);
1218                 MOD_W2BYTE(REG_MOD_BK00_57_L, 0x9876);
1219                 MOD_W2BYTE(REG_MOD_BK00_58_L, 0xFFBA);
1220             }
1221         }
1222         else if( (pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type_Ext == E_PNL_LPLL_VBY1_10BIT_16LANE)
1223                ||(pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type_Ext == E_PNL_LPLL_VBY1_8BIT_16LANE))
1224         {
1225             if(pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16MOD_CTRLA & BIT(1))
1226             { // 4 Divisoin
1227                 MOD_W2BYTE(REG_MOD_BK00_55_L, 0x6420);
1228                 MOD_W2BYTE(REG_MOD_BK00_56_L, 0x7531);
1229                 MOD_W2BYTE(REG_MOD_BK00_57_L, 0xECA8);
1230                 MOD_W2BYTE(REG_MOD_BK00_58_L, 0xFDB9);
1231             }
1232             else
1233             { // 2 division
1234                 MOD_W2BYTE(REG_MOD_BK00_55_L, 0x3210);
1235                 MOD_W2BYTE(REG_MOD_BK00_56_L, 0x7654);
1236                 MOD_W2BYTE(REG_MOD_BK00_57_L, 0xBA98);
1237                 MOD_W2BYTE(REG_MOD_BK00_58_L, 0xFEDC);
1238             }
1239         }
1240         else if( (pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type_Ext == E_PNL_LPLL_VBY1_10BIT_4LANE)
1241                ||(pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type_Ext == E_PNL_LPLL_VBY1_8BIT_4LANE))
1242         {// APN just video setting
1243             MOD_W2BYTE(REG_MOD_BK00_55_L, 0x9810);
1244             MOD_W2BYTE(REG_MOD_BK00_56_L, 0xFFFF);
1245             MOD_W2BYTE(REG_MOD_BK00_57_L, 0xFFFF);
1246             MOD_W2BYTE(REG_MOD_BK00_58_L, 0xFFFF);
1247         }
1248         else if( (pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type_Ext == E_PNL_LPLL_VBY1_10BIT_2LANE)
1249                ||(pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type_Ext == E_PNL_LPLL_VBY1_8BIT_2LANE))
1250         {//APN just video setting
1251             MOD_W2BYTE(REG_MOD_BK00_55_L, 0xFF10);
1252             MOD_W2BYTE(REG_MOD_BK00_56_L, 0xFFFF);
1253             MOD_W2BYTE(REG_MOD_BK00_57_L, 0xFFFF);
1254             MOD_W2BYTE(REG_MOD_BK00_58_L, 0xFFFF);
1255         }
1256         else if((pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type_Ext == E_PNL_LPLL_VBY1_10BIT_1LANE)
1257                ||(pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type_Ext == E_PNL_LPLL_VBY1_8BIT_1LANE))
1258         {
1259             MOD_W2BYTE(REG_MOD_BK00_55_L, 0xFFF0);
1260             MOD_W2BYTE(REG_MOD_BK00_56_L, 0xFFF0);
1261             MOD_W2BYTE(REG_MOD_BK00_57_L, 0xFFFF);
1262             MOD_W2BYTE(REG_MOD_BK00_58_L, 0xFFFF);
1263         }
1264         else
1265         {
1266             MOD_W2BYTE(REG_MOD_BK00_55_L, 0x76DC);
1267             MOD_W2BYTE(REG_MOD_BK00_56_L, 0xBA98);
1268             MOD_W2BYTE(REG_MOD_BK00_57_L, 0x3210);
1269             MOD_W2BYTE(REG_MOD_BK00_58_L, 0x0054);
1270         }
1271     }
1272 
1273 }
1274 
MHal_PQ_Clock_Gen_For_Gamma(void * pInstance)1275 void MHal_PQ_Clock_Gen_For_Gamma(void *pInstance)
1276 {
1277     W2BYTEMSK(REG_CLKGEN0_52_L, 0x00, 0x07);
1278 }
1279 
MHal_VOP_SetGammaMappingMode(void * pInstance,MS_U8 u8Mapping)1280 void MHal_VOP_SetGammaMappingMode(void *pInstance, MS_U8 u8Mapping)
1281 {
1282     PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
1283     UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
1284 
1285     if(u8Mapping & GAMMA_MAPPING)
1286     {
1287         SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK10_74_L, (u8Mapping & GAMMA_10BIT_MAPPING)? BIT(15):0, BIT(15));
1288     }
1289     else
1290     {
1291         PNL_ASSERT(0, "Invalid eSupportGammaMapMode [%d] Passed to [%s], please make sure the u8Mapping[%d] is valid\n.",
1292                        u8Mapping, __FUNCTION__, u8Mapping);
1293     }
1294 }
1295 
Hal_VOP_Is_GammaMappingMode_enable(void * pInstance)1296 MS_BOOL Hal_VOP_Is_GammaMappingMode_enable(void *pInstance)
1297 {
1298     // Only support 1024 entry
1299     return TRUE;
1300 }
1301 
1302 // After A5, 8 bit mode only support burst write!!!
Hal_VOP_Is_GammaSupportSignalWrite(void * pInstance,DRVPNL_GAMMA_MAPPEING_MODE u8Mapping)1303 MS_BOOL Hal_VOP_Is_GammaSupportSignalWrite(void *pInstance, DRVPNL_GAMMA_MAPPEING_MODE u8Mapping)
1304 {
1305     if( u8Mapping == E_DRVPNL_GAMMA_10BIT_MAPPING )
1306         return TRUE;
1307     else
1308         return FALSE;
1309 }
1310 
1311 
1312 /////////////////////////////////////////////////////////////////////////////
1313 // Gamma format (12 bit LUT)
1314 //      0, 1, 2, 3, ..., NumOfLevel, totally N Sets of tNormalGammaR/G/B[],
1315 //      1 set uses 2 bytes of memory.
1316 //
1317 // [T2 and before ] N = 256
1318 // [T3]             N = 256 or 1024
1319 // ______________________________________________________________________________
1320 //  Byte | 0         1           2               n-1        n
1321 //    [G1|G0]       [G0]       [G1] . ...... .  [Gmax]    [Gmax]
1322 //    3:0  3:0      11:4       11:4              3:0       11:4
1323 //
1324 #ifdef MONACO_SC2
Hal_PNL_Set12BitGammaPerChannel_SC2(void * pInstance,MS_U8 u8Channel,MS_U8 * u8Tab,DRVPNL_GAMMA_MAPPEING_MODE GammaMapMode)1325 void Hal_PNL_Set12BitGammaPerChannel_SC2(void *pInstance, MS_U8 u8Channel, MS_U8 * u8Tab, DRVPNL_GAMMA_MAPPEING_MODE GammaMapMode )
1326 {
1327     MS_U16 u16Addr             = 0;
1328     MS_U16 u16CodeTableIndex  = u16Addr/2*3;
1329     MS_U16 u16GammaValue      = 0;
1330     MS_U16 u16MaxGammaValue   = 0;
1331     MS_U16 u16NumOfLevel = GammaMapMode == E_DRVPNL_GAMMA_8BIT_MAPPING ? 256 : 1024;
1332     MS_BOOL bUsingBurstWrite = !Hal_VOP_Is_GammaSupportSignalWrite(pInstance,GammaMapMode);
1333     PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
1334     UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
1335 
1336     // Go to burst write if not support
1337     if ( bUsingBurstWrite )
1338     {
1339         // 1.   initial burst write address, LUT_ADDR[7:0]
1340         SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID,REG_SC_BK10_6C_L, 0x00 , 0x3FF);
1341 
1342         // 2.   select burst write channel, REG_LUT_BW_CH_SEL[1:0]
1343         switch(u8Channel)
1344         {
1345             case 0:  // Red
1346                 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID,REG_SC_BK10_6D_L, 0x00 , BIT(3) | BIT(2) );
1347                 break;
1348 
1349             case 1:  // Green
1350                 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID,REG_SC_BK10_6D_L, BIT(2) , BIT(3) | BIT(2) );
1351                 break;
1352 
1353             case 2:  // Blue
1354                 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID,REG_SC_BK10_6D_L, BIT(3) , BIT(3) | BIT(2) );
1355                 break;
1356         }
1357 
1358         // 3.   enable burst write mode, REG_LUT_BW_MAIN_EN
1359         SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID,REG_SC_BK10_6D_L, BIT(0) , BIT(0)); // Burst write enable
1360 
1361     }
1362 
1363     //printf("\33[0;31m Gamma Mapping mode %d \n \33[m",GammaMapMode );
1364     // write gamma table per one channel
1365     for(; u16Addr < u16NumOfLevel; u16CodeTableIndex += 3)
1366     {
1367         // gamma x
1368         u16GammaValue = u8Tab[u16CodeTableIndex] & 0x0F;
1369         u16GammaValue |= u8Tab[u16CodeTableIndex+1] << 4;
1370 
1371         PNL_DBG(PNL_DBGLEVEL_GAMMA,"Gamma x: SrcGTbl[%d] = 0x%x, [%d] = 0x%x, Gamma = 0x%x, GammaLvl=%d\n",
1372                                     u16CodeTableIndex, u8Tab[u16CodeTableIndex], u16CodeTableIndex+1, u8Tab[u16CodeTableIndex+1], u16GammaValue, u16NumOfLevel);
1373 
1374         if(u16MaxGammaValue < u16GammaValue)
1375         {
1376             u16MaxGammaValue = u16GammaValue;
1377         }
1378 
1379         // write gamma value
1380         hal_PNL_WriteGamma12Bit(pInstance,u8Channel,bUsingBurstWrite, u16Addr, u16GammaValue);
1381         u16Addr++;
1382 
1383         // gamma x+1
1384         u16GammaValue = (u8Tab[u16CodeTableIndex] & 0xF0) >> 4;
1385         u16GammaValue |= u8Tab[u16CodeTableIndex+2] << 4;
1386 
1387         PNL_DBG(PNL_DBGLEVEL_GAMMA, "Gamma x+1: SrcGTbl[%d] = 0x%x, [%d] = 0x%x, Gamma = 0x%x\n", u16CodeTableIndex, u8Tab[u16CodeTableIndex], u16CodeTableIndex+2, u8Tab[u16CodeTableIndex+2], u16GammaValue);
1388 
1389         if(u16MaxGammaValue < u16GammaValue)
1390             {
1391             u16MaxGammaValue = u16GammaValue;
1392             }
1393 
1394         // write gamma value
1395         hal_PNL_WriteGamma12Bit(pInstance,u8Channel,bUsingBurstWrite, u16Addr, u16GammaValue);
1396         u16Addr++;
1397     }
1398 
1399     if ( bUsingBurstWrite )
1400     {
1401         // 5.   after finish burst write data of one channel, disable burst write mode
1402         SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID,REG_SC_BK10_6D_L, 0x00 , BIT(0));
1403     }
1404 
1405     hal_PNL_SetMaxGammaValue(pInstance,u8Channel, u16MaxGammaValue);
1406 }
1407 #endif
1408 
1409 #ifdef USE_PANEL_GAMMA
_hal_PNL_WriteGamma12Bit_PanelGamma(void * pInstance,MS_U8 u8Channel,MS_BOOL bBurstWrite,MS_U16 u16Addr,MS_U16 u16GammaValue)1410 static void _hal_PNL_WriteGamma12Bit_PanelGamma(void *pInstance, MS_U8 u8Channel, MS_BOOL bBurstWrite, MS_U16 u16Addr, MS_U16 u16GammaValue)
1411 {
1412     PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
1413     UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
1414 
1415     MS_U16 u16Delay = 0xFFFF;
1416 
1417     PNL_DBG(PNL_DBGLEVEL_GAMMA, "Write [ch %d][addr 0x%x]: 0x%x \n", u8Channel, u16Addr, u16GammaValue);
1418 
1419     if (!bBurstWrite )
1420     {
1421         while (SC_R2BYTEMSK(pPNLInstancePrivate->u32DeviceID,REG_SC_BK24_1C_L, 0x0C) && (--u16Delay));          // Check whether the Write chanel is ready
1422         PNL_ASSERT(u16Delay > 0, "%s\n", "WriteGamma timeout");
1423 
1424         SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK24_1B_L, u16Addr, 0xFF);                          // set address port
1425         SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, (REG_SC_BK24_1D_L + u8Channel *2), u16GammaValue, 0xFFF);      // Set channel data
1426 
1427         // kick off write
1428         switch(u8Channel)
1429         {
1430             case 0:  // Red
1431                 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID,REG_SC_BK24_1C_L, 0x00 , BIT(3) | BIT(2) );
1432                 break;
1433 
1434             case 1:  // Green
1435                 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID,REG_SC_BK24_1C_L, BIT(2) , BIT(3) | BIT(2) );
1436                 break;
1437 
1438             case 2:  // Blue
1439                 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID,REG_SC_BK24_1C_L, BIT(3) , BIT(3) | BIT(2) );
1440                 break;
1441 
1442         }
1443 
1444         while (SC_R2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK24_1C_L, 0x0C) && (--u16Delay));          // Check whether the Write chanel is ready
1445     }
1446     else
1447     {
1448 
1449         SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID,REG_SC_BK24_1D_L, u16GammaValue, 0xFFF);
1450         SC_W2BYTE(pPNLInstancePrivate->u32DeviceID, REG_SC_BK00_7F_L, 0x00); // make little time delay
1451     }
1452 
1453 
1454     PNL_ASSERT(u16Delay > 0, "%s\n", "WriteGamma timeout");
1455 }
1456 
_hal_PNL_SetMaxGammaValue_PanelGamma(void * pInstance,MS_U8 u8Channel,MS_U16 u16MaxGammaValue)1457 static void _hal_PNL_SetMaxGammaValue_PanelGamma(void *pInstance, MS_U8 u8Channel, MS_U16 u16MaxGammaValue)
1458 {
1459     PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
1460     UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
1461 
1462     PNL_DBG(PNL_DBGLEVEL_GAMMA, "Max gamma of SC%tu %d is 0x%x\n", (ptrdiff_t)pPNLInstancePrivate->u32DeviceID, u8Channel, u16MaxGammaValue);
1463         switch(u8Channel)
1464         {
1465             case 0:  // max. Red
1466                 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK24_2C_L , u16MaxGammaValue, 0xFFF);           // max. base 0
1467                 break;
1468 
1469             case 1:  // max. Green
1470                 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK24_2E_L , u16MaxGammaValue, 0xFFF);           // max. base 1
1471                 break;
1472 
1473             case 2:  //max.  Blue
1474                 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK24_30_L , u16MaxGammaValue, 0xFFF);           // max. base 1
1475                 break;
1476            }
1477 }
1478 
_Hal_PNL_Set12BitGammaPerChannel_PanelGamma(void * pInstance,MS_U8 u8Channel,MS_U8 * u8Tab,DRVPNL_GAMMA_MAPPEING_MODE GammaMapMode)1479 static void _Hal_PNL_Set12BitGammaPerChannel_PanelGamma(void *pInstance, MS_U8 u8Channel, MS_U8 * u8Tab, DRVPNL_GAMMA_MAPPEING_MODE GammaMapMode )
1480 {
1481     MS_U16 u16Addr             = 0;
1482     MS_U16 u16CodeTableIndex  = u16Addr/2*3;
1483     MS_U16 u16GammaValue      = 0;
1484     MS_U16 u16MaxGammaValue   = 0;
1485     MS_U16 u16NumOfLevel = GammaMapMode == E_DRVPNL_GAMMA_8BIT_MAPPING ? 256 : 1024;
1486     MS_BOOL bUsingBurstWrite = !Hal_VOP_Is_GammaSupportSignalWrite(pInstance,GammaMapMode);
1487     PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
1488     UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
1489 
1490     // Go to burst write if not support
1491     if ( bUsingBurstWrite )
1492     {
1493         // 1.   initial burst write address, LUT_ADDR[7:0]
1494         SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID,REG_SC_BK24_1B_L, 0x00 , 0xFF);
1495 
1496         // 2.   select burst write channel, REG_LUT_BW_CH_SEL[1:0]
1497         switch(u8Channel)
1498         {
1499             case 0:  // Red
1500                 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID,REG_SC_BK24_1C_L, 0x00 , BIT(3) | BIT(2) );
1501                 break;
1502 
1503             case 1:  // Green
1504                 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID,REG_SC_BK24_1C_L, BIT(2) , BIT(3) | BIT(2) );
1505                 break;
1506 
1507             case 2:  // Blue
1508                 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID,REG_SC_BK24_1C_L, BIT(3) , BIT(3) | BIT(2) );
1509                 break;
1510         }
1511 
1512         // 3.   enable burst write mode, REG_LUT_BW_MAIN_EN
1513         SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID,REG_SC_BK24_1C_L, BIT(0) , BIT(0)); // Burst write enable
1514 
1515     }
1516 
1517     //printf("\33[0;31m Gamma Mapping mode %d \n \33[m",GammaMapMode );
1518     // write gamma table per one channel
1519     for(; u16Addr < u16NumOfLevel; u16CodeTableIndex += 3)
1520     {
1521         // gamma x
1522         u16GammaValue = u8Tab[u16CodeTableIndex] & 0x0F;
1523         u16GammaValue |= u8Tab[u16CodeTableIndex+1] << 4;
1524 
1525         PNL_DBG(PNL_DBGLEVEL_GAMMA,"Gamma x: SrcGTbl[%d] = 0x%x, [%d] = 0x%x, Gamma = 0x%x, GammaLvl=%d\n",
1526                                     u16CodeTableIndex, u8Tab[u16CodeTableIndex], u16CodeTableIndex+1, u8Tab[u16CodeTableIndex+1], u16GammaValue, u16NumOfLevel);
1527 
1528         if(u16MaxGammaValue < u16GammaValue)
1529         {
1530             u16MaxGammaValue = u16GammaValue;
1531         }
1532 
1533         // write gamma value
1534         _hal_PNL_WriteGamma12Bit_PanelGamma(pInstance,u8Channel,bUsingBurstWrite, u16Addr, u16GammaValue);
1535         u16Addr++;
1536 
1537         // gamma x+1
1538         u16GammaValue = (u8Tab[u16CodeTableIndex] & 0xF0) >> 4;
1539         u16GammaValue |= u8Tab[u16CodeTableIndex+2] << 4;
1540 
1541         PNL_DBG(PNL_DBGLEVEL_GAMMA, "Gamma x+1: SrcGTbl[%d] = 0x%x, [%d] = 0x%x, Gamma = 0x%x\n", u16CodeTableIndex, u8Tab[u16CodeTableIndex], u16CodeTableIndex+2, u8Tab[u16CodeTableIndex+2], u16GammaValue);
1542 
1543         if(u16MaxGammaValue < u16GammaValue)
1544             {
1545             u16MaxGammaValue = u16GammaValue;
1546             }
1547 
1548         // write gamma value
1549         _hal_PNL_WriteGamma12Bit_PanelGamma(pInstance,u8Channel,bUsingBurstWrite, u16Addr, u16GammaValue);
1550         u16Addr++;
1551     }
1552 
1553     if ( bUsingBurstWrite )
1554     {
1555         // 5.   after finish burst write data of one channel, disable burst write mode
1556         SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID,REG_SC_BK24_1C_L, 0x00 , BIT(0));
1557     }
1558     _hal_PNL_SetMaxGammaValue_PanelGamma(pInstance,u8Channel, u16MaxGammaValue);
1559 }
1560 
1561 #endif
1562 
_hal_PNL_WriteGamma12Bit(void * pInstance,MS_U8 u8Channel,MS_BOOL bBurstWrite,MS_U16 u16Addr,MS_U16 u16GammaValue)1563 static void _hal_PNL_WriteGamma12Bit(void *pInstance, MS_U8 u8Channel, MS_BOOL bBurstWrite, MS_U16 u16Addr, MS_U16 u16GammaValue)
1564 {
1565     PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
1566     UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
1567 
1568     MS_U16 u16Delay = 0xFFFF;
1569 
1570     PNL_DBG(PNL_DBGLEVEL_GAMMA, "Write [ch %d][addr 0x%x]: 0x%x \n", u8Channel, u16Addr, u16GammaValue);
1571 
1572     if (!bBurstWrite )
1573     {
1574         while (SC_R2BYTEMSK(pPNLInstancePrivate->u32DeviceID,REG_SC_BK10_6D_L, 0xE0) && (--u16Delay));          // Check whether the Write chanel is ready
1575         PNL_ASSERT(u16Delay > 0, "%s\n", "WriteGamma timeout");
1576 
1577         SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK10_6C_L, u16Addr, 0x3FF);                          // set address port
1578         SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, (REG_SC_BK10_6E_L + u8Channel *2), u16GammaValue, 0xFFF);      // Set channel data
1579 
1580         // kick off write
1581         switch(u8Channel)
1582         {
1583             case 0:  // Red
1584                 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK10_6D_L, BIT(5), BIT(5));
1585                 break;
1586 
1587             case 1:  // Green
1588                 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK10_6D_L, BIT(6), BIT(6));
1589                 break;
1590 
1591             case 2:  // Blue
1592                 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK10_6D_L, BIT(7), BIT(7));
1593                 break;
1594         }
1595 
1596         while (SC_R2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK10_6D_L, 0xE0) && (--u16Delay));          // Check whether the Write chanel is ready
1597     }
1598     else
1599     {
1600 
1601         SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID,REG_SC_BK10_72_L, u16GammaValue, 0xFFF);
1602         SC_W2BYTE(pPNLInstancePrivate->u32DeviceID, REG_SC_BK00_7F_L, 0x00); // make little time delay
1603     }
1604 
1605 
1606     PNL_ASSERT(u16Delay > 0, "%s\n", "WriteGamma timeout");
1607 }
1608 
1609 
_hal_PNL_SetMaxGammaValue(void * pInstance,MS_U8 u8Channel,MS_U16 u16MaxGammaValue)1610 static void _hal_PNL_SetMaxGammaValue(void *pInstance, MS_U8 u8Channel, MS_U16 u16MaxGammaValue)
1611 {
1612     PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
1613     UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
1614 
1615     PNL_DBG(PNL_DBGLEVEL_GAMMA, "Max gamma of SC%tu %d is 0x%x\n", (ptrdiff_t)pPNLInstancePrivate->u32DeviceID, u8Channel, u16MaxGammaValue);
1616 #ifdef MONACO_SC2
1617     if(pPNLInstancePrivate->u32DeviceID == 0)
1618     {
1619 #endif
1620         switch(u8Channel)
1621         {
1622             case 0:  // max. Red
1623                 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK10_7D_L , u16MaxGammaValue, 0xFFF);           // max. base 0
1624                 break;
1625 
1626             case 1:  // max. Green
1627                 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK10_7E_L , u16MaxGammaValue, 0xFFF);           // max. base 1
1628                 break;
1629 
1630             case 2:  //max.  Blue
1631                 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK10_7F_L , u16MaxGammaValue, 0xFFF);           // max. base 1
1632                 break;
1633            }
1634 #ifdef MONACO_SC2
1635     }else    //Nike
1636     {
1637     switch(u8Channel)
1638     {
1639         case 0:  // max. Red
1640                 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID,REG_SC_BK10_7A_L , u16MaxGammaValue, 0xFFF);           // max. base 0
1641                 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID,REG_SC_BK10_7B_L , u16MaxGammaValue, 0xFFF);           // max. base 1
1642             break;
1643 
1644         case 1:  // max. Green
1645                 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID,REG_SC_BK10_7C_L , u16MaxGammaValue, 0xFFF);           // max. base 0
1646                 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID,REG_SC_BK10_7D_L , u16MaxGammaValue, 0xFFF);           // max. base 1
1647             break;
1648 
1649         case 2:  //max.  Blue
1650                 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID,REG_SC_BK10_7E_L , u16MaxGammaValue, 0xFFF);           // max. base 0
1651                 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID,REG_SC_BK10_7F_L , u16MaxGammaValue, 0xFFF);           // max. base 1
1652             break;
1653      }
1654 
1655     }
1656 #endif
1657 }
1658 
1659 /////////////////////////////////////////////////////////////////////////////
1660 // Gamma format (12 bit LUT)
1661 //      0, 1, 2, 3, ..., NumOfLevel, totally N Sets of tNormalGammaR/G/B[],
1662 //      1 set uses 2 bytes of memory.
1663 //
1664 // [T2 and before ] N = 256
1665 // [T3]             N = 256 or 1024
1666 // ______________________________________________________________________________
1667 //  Byte | 0         1           2               n-1        n
1668 //    [G1|G0]       [G0]       [G1] . ...... .  [Gmax]    [Gmax]
1669 //    3:0  3:0      11:4       11:4              3:0       11:4
1670 //
_Hal_PNL_Set12BitGammaPerChannel(void * pInstance,MS_U8 u8Channel,MS_U8 * u8Tab,DRVPNL_GAMMA_MAPPEING_MODE GammaMapMode)1671 static void _Hal_PNL_Set12BitGammaPerChannel(void *pInstance, MS_U8 u8Channel, MS_U8 * u8Tab, DRVPNL_GAMMA_MAPPEING_MODE GammaMapMode)
1672 {
1673     PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
1674     UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
1675 
1676     MS_U16 u16Addr            = 0;
1677     MS_U16 u16CodeTableIndex  = u16Addr/2*3;
1678     MS_U16 u16GammaValue      = 0;
1679     MS_U16 u16MaxGammaValue   = 0;
1680     MS_U16 u16NumOfLevel = GammaMapMode == E_DRVPNL_GAMMA_8BIT_MAPPING ? 256 : 1024;
1681     MS_BOOL bUsingBurstWrite = !Hal_VOP_Is_GammaSupportSignalWrite(pInstance,GammaMapMode);
1682 
1683     // Go to burst write if not support
1684     if ( bUsingBurstWrite )
1685     {
1686         // 1.   initial burst write address, LUT_ADDR[7:0]
1687         SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID,REG_SC_BK10_71_L, 0x00 , 0x3FF);
1688 
1689         // 2.   select burst write channel, REG_LUT_BW_CH_SEL[1:0]
1690         switch(u8Channel)
1691         {
1692             case 0:  // Red
1693                 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID,REG_SC_BK10_70_L, 0x00 , BIT(6) | BIT(5) );
1694                 break;
1695 
1696             case 1:  // Green
1697                 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID,REG_SC_BK10_70_L, BIT(5) , BIT(6) | BIT(5) );
1698                 break;
1699 
1700             case 2:  // Blue
1701                 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID,REG_SC_BK10_70_L, BIT(6) , BIT(6) | BIT(5) );
1702                 break;
1703         }
1704 
1705         // 3.   enable burst write mode, REG_LUT_BW_MAIN_EN
1706         SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID,REG_SC_BK10_70_L, BIT(7) , BIT(7)); // Burst write enable
1707 
1708     }
1709 
1710     //printf("\33[0;31m Gamma Mapping mode %d \n \33[m",GammaMapMode );
1711     // write gamma table per one channel
1712     for(; u16Addr < u16NumOfLevel; u16CodeTableIndex += 3)
1713     {
1714         // gamma x
1715         u16GammaValue = u8Tab[u16CodeTableIndex] & 0x0F;
1716         u16GammaValue |= u8Tab[u16CodeTableIndex+1] << 4;
1717 
1718         PNL_DBG(PNL_DBGLEVEL_GAMMA,"Gamma x: SrcGTbl[%d] = 0x%x, [%d] = 0x%x, Gamma = 0x%x, GammaLvl=%d\n",
1719                                     u16CodeTableIndex, u8Tab[u16CodeTableIndex], u16CodeTableIndex+1, u8Tab[u16CodeTableIndex+1], u16GammaValue, u16NumOfLevel);
1720 
1721         if(u16MaxGammaValue < u16GammaValue)
1722         {
1723             u16MaxGammaValue = u16GammaValue;
1724         }
1725 
1726         // write gamma value
1727         _hal_PNL_WriteGamma12Bit(pInstance,u8Channel,bUsingBurstWrite, u16Addr, u16GammaValue);
1728         u16Addr++;
1729 
1730         // gamma x+1
1731         u16GammaValue = (u8Tab[u16CodeTableIndex] & 0xF0) >> 4;
1732         u16GammaValue |= u8Tab[u16CodeTableIndex+2] << 4;
1733 
1734         PNL_DBG(PNL_DBGLEVEL_GAMMA, "Gamma x+1: SrcGTbl[%d] = 0x%x, [%d] = 0x%x, Gamma = 0x%x\n", u16CodeTableIndex, u8Tab[u16CodeTableIndex], u16CodeTableIndex+2, u8Tab[u16CodeTableIndex+2], u16GammaValue);
1735 
1736         if(u16MaxGammaValue < u16GammaValue)
1737         {
1738             u16MaxGammaValue = u16GammaValue;
1739         }
1740 
1741         // write gamma value
1742         _hal_PNL_WriteGamma12Bit(pInstance,u8Channel,bUsingBurstWrite, u16Addr, u16GammaValue);
1743         u16Addr++;
1744     }
1745 
1746     if ( bUsingBurstWrite )
1747     {
1748         // 5.   after finish burst write data of one channel, disable burst write mode
1749         SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID,REG_SC_BK10_70_L, 0x00 , BIT(7));
1750     }
1751 
1752     _hal_PNL_SetMaxGammaValue(pInstance,u8Channel, u16MaxGammaValue);
1753 }
1754 
hal_PNL_WriteGamma12Bit(void * pInstance,MS_U8 u8Channel,MS_BOOL bBurstWrite,MS_U16 u16Addr,MS_U16 u16GammaValue)1755 void hal_PNL_WriteGamma12Bit(void *pInstance, MS_U8 u8Channel, MS_BOOL bBurstWrite, MS_U16 u16Addr, MS_U16 u16GammaValue)
1756 {
1757     #ifdef USE_PANEL_GAMMA
1758         _hal_PNL_WriteGamma12Bit_PanelGamma(pInstance, u8Channel, bBurstWrite, u16Addr, u16GammaValue);
1759     #endif
1760     _hal_PNL_WriteGamma12Bit(pInstance, u8Channel, bBurstWrite, u16Addr, u16GammaValue);
1761 
1762 }
1763 
hal_PNL_SetMaxGammaValue(void * pInstance,MS_U8 u8Channel,MS_U16 u16MaxGammaValue)1764 void hal_PNL_SetMaxGammaValue(void *pInstance, MS_U8 u8Channel, MS_U16 u16MaxGammaValue)
1765 {
1766     #ifdef USE_PANEL_GAMMA
1767         _hal_PNL_SetMaxGammaValue_PanelGamma(pInstance, u8Channel, u16MaxGammaValue);
1768     #endif
1769     _hal_PNL_SetMaxGammaValue(pInstance, u8Channel, u16MaxGammaValue);
1770 }
1771 
Hal_PNL_Set12BitGammaPerChannel(void * pInstance,MS_U8 u8Channel,MS_U8 * u8Tab,DRVPNL_GAMMA_MAPPEING_MODE GammaMapMode)1772 void Hal_PNL_Set12BitGammaPerChannel(void *pInstance, MS_U8 u8Channel, MS_U8 * u8Tab, DRVPNL_GAMMA_MAPPEING_MODE GammaMapMode)
1773 {
1774     #ifdef USE_PANEL_GAMMA
1775         _Hal_PNL_Set12BitGammaPerChannel_PanelGamma(pInstance, u8Channel, u8Tab, GammaMapMode);
1776     #endif
1777     _Hal_PNL_Set12BitGammaPerChannel(pInstance, u8Channel, u8Tab, GammaMapMode);
1778 }
1779 
1780 // src : 1 (scaler lpll)
1781 // src : 0 (frc lpll)
MHal_PNL_FRC_lpll_src_sel(void * pInstance,MS_U8 u8src)1782 MS_U8 MHal_PNL_FRC_lpll_src_sel(void *pInstance, MS_U8 u8src)
1783 {
1784     if (u8src > 1)
1785     {
1786         return FALSE;
1787     }
1788     else
1789     {
1790 //Not support two LPLL (frc lpll) for Manhattan
1791 #if 0
1792         W2BYTEMSK(L_BK_LPLL(0x00), 0x00, 0x0F);
1793         W2BYTEMSK(L_BK_LPLL(0x7F), u8src?BIT(8):0, BIT(8));
1794 
1795         if(u8src==0)
1796         {
1797             W2BYTEMSK(L_BK_LPLL(0x00), 0x01, 0x0F);
1798             W2BYTEMSK(L_BK_LPLL(0x7F), BIT(8), BIT(8));
1799             W2BYTEMSK(L_BK_LPLL(0x00), 0x00, 0x0F); // restore to sub bnak 0
1800         }
1801 #endif
1802         return TRUE;
1803     }
1804 
1805 }
1806 
_MHal_PNL_GetSupportedLPLLIndex(void * pInstance,PNL_TYPE eLPLL_Type,PNL_MODE eLPLL_Mode,MS_U64 ldHz,PNL_LPLL_TYPE_SEL lpll_type_sel)1807 static MS_U8 _MHal_PNL_GetSupportedLPLLIndex(void *pInstance,
1808                                                                  PNL_TYPE eLPLL_Type,
1809                                                                  PNL_MODE eLPLL_Mode,
1810                                                                  MS_U64 ldHz, PNL_LPLL_TYPE_SEL lpll_type_sel)
1811 {
1812     MS_U8 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_MAX;
1813 #if defined (__aarch64__)
1814     PNL_DBG(PNL_DBGLEVEL_INIT, "[%s][%d]eLPLL_Type=%u, eLPLL_Mode=%u, ldHz=%lu, lpll_type_sel=%u\n", __FUNCTION__, __LINE__, eLPLL_Type, eLPLL_Mode, ldHz, lpll_type_sel);
1815 #else
1816     PNL_DBG(PNL_DBGLEVEL_INIT, "[%s][%d]eLPLL_Type=%u, eLPLL_Mode=%u, ldHz=%llu, lpll_type_sel=%u\n", __FUNCTION__, __LINE__, eLPLL_Type, eLPLL_Mode, ldHz, lpll_type_sel);
1817 #endif
1818 
1819     /// Mini LVDS, EPI34/28, LVDS_1CH, Vx1_1P are 1P structure
1820     if(!((eLPLL_Type == E_PNL_TYPE_TTL)||
1821         ((eLPLL_Type == E_PNL_TYPE_LVDS)&&(eLPLL_Mode==E_PNL_MODE_SINGLE))||
1822         ((eLPLL_Type == E_PNL_TYPE_HS_LVDS)&&(eLPLL_Mode==E_PNL_MODE_SINGLE))||
1823         (eLPLL_Type == E_PNL_LPLL_VBY1_10BIT_1LANE)||(eLPLL_Type == E_PNL_LPLL_VBY1_8BIT_1LANE)||
1824         ((eLPLL_Type >= E_PNL_LPLL_MINILVDS_2CH_3P_8BIT)&&(eLPLL_Type <= E_PNL_LPLL_MINILVDS_1CH_6P_6BIT))||
1825         ((eLPLL_Type >= E_PNL_LPLL_EPI34_2P)&&(eLPLL_Type <= E_PNL_LPLL_EPI28_4P))))
1826     {
1827         ldHz/=2;
1828     }
1829 
1830     switch(lpll_type_sel)
1831     {
1832         default:
1833         case E_PNL_LPLL_VIDEO:
1834         {
1835             switch (eLPLL_Type)
1836             {
1837                 case E_PNL_TYPE_TTL:
1838                     if (ldHz < 250000000UL)
1839                     {
1840                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_TTL_25to25MHz;
1841                     }
1842                     else if ((ldHz >= 250000000UL) && (ldHz < 500000000UL))
1843                     {
1844                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_TTL_25to50MHz;
1845                     }
1846                     else if((ldHz >= 500000000UL) && (ldHz < 1000000000UL))
1847                     {
1848                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_TTL_50to100MHz;
1849                     }
1850                     else
1851                     {
1852                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_TTL_100to150MHz;
1853                     }
1854                 break;
1855 
1856                 case E_PNL_TYPE_LVDS:
1857                     switch (eLPLL_Mode)
1858                     {
1859                         case E_PNL_MODE_SINGLE:
1860                             if (ldHz < 500000000UL)
1861                             {
1862                                 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_LVDS_1CH_50to50MHz;
1863                             }
1864                             else
1865                             {
1866                                 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_LVDS_1CH_50to80MHz;
1867                             }
1868                         break;
1869 
1870                         default:
1871                         case E_PNL_MODE_DUAL:
1872                             if (ldHz < 250000000UL)
1873                             {
1874                                 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_LVDS_2CH_25to25MHz;
1875                             }
1876                             else if ((ldHz >= 250000000UL) && (ldHz < 500000000UL))
1877                             {
1878                                 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_LVDS_2CH_25to50MHz;
1879                             }
1880                             else
1881                             {
1882                                 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_LVDS_2CH_50to80MHz;
1883                             }
1884                         break;
1885                     }
1886                 break;
1887 
1888                 case E_PNL_TYPE_HS_LVDS:
1889 
1890                     switch (eLPLL_Mode)
1891                     {
1892                         case E_PNL_MODE_SINGLE:
1893                             if(ldHz < 500000000UL)
1894                             {
1895                                 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_HS_LVDS_1CH_50to50MHz;
1896                             }
1897                             else if((ldHz >= 500000000UL) && (ldHz < 1000000000UL))
1898                             {
1899                                 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_HS_LVDS_1CH_50to100MHz;
1900                             }
1901                             else
1902                             {
1903                                 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_HS_LVDS_1CH_100to150MHz;
1904                             }
1905                         break;
1906 
1907                         default:
1908                         case E_PNL_MODE_DUAL:
1909                             if(ldHz < 250000000UL)
1910                             {
1911                                 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_HS_LVDS_2CH_25to25MHz;
1912                             }
1913                             else if((ldHz >= 250000000UL) && (ldHz < 500000000UL))
1914                             {
1915                                 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_HS_LVDS_2CH_25to50MHz;
1916                             }
1917                             else if((ldHz >= 500000000UL) && (ldHz < 1000000000UL))
1918                             {
1919                                 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_HS_LVDS_2CH_50to100MHz;
1920                             }
1921                             else
1922                             {
1923                                 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_HS_LVDS_2CH_100to150MHz;
1924                             }
1925                         break;
1926                     }
1927                 break;
1928 ///Not Support
1929 #if 0
1930                 case E_PNL_LPLL_MINILVDS_1CH_3P_8BIT:
1931                     u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_MINILVDS_1CH_3PAIR_8BIT_50to80MHz;
1932                 break;
1933 
1934                 case E_PNL_LPLL_MINILVDS_2CH_3P_8BIT:
1935                     if((ldHz >= 500000000) && (ldHz < 1000000000))
1936                     {
1937                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_MINILVDS_2CH_3PAIR_8BIT_50to100MHz;
1938                     }
1939                     else
1940                     {
1941                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_MINILVDS_2CH_3PAIR_8BIT_100to150MHz;
1942                     }
1943                 break;
1944 
1945                 case E_PNL_LPLL_MINILVDS_2CH_6P_8BIT:
1946                     if((ldHz >= 500000000) && (ldHz < 1000000000))
1947                     {
1948                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_MINILVDS_2CH_6PAIR_8BIT_50to100MHz;
1949                     }
1950                     else
1951                     {
1952                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_MINILVDS_2CH_6PAIR_8BIT_100to150MHz;
1953                     }
1954                 break;
1955 
1956                 case E_PNL_LPLL_MINILVDS_1CH_3P_6BIT:
1957                     if((ldHz >= 500000000) && (ldHz < 666700000))
1958                     {
1959                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_MINILVDS_1CH_3PAIR_6BIT_50to66_67MHz;
1960                     }
1961                     else
1962                     {
1963                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_MINILVDS_1CH_3PAIR_6BIT_66_67to80MHz;
1964                     }
1965                 break;
1966 
1967                 case E_PNL_LPLL_MINILVDS_2CH_3P_6BIT:
1968                     if ((ldHz <= 500000000) && (ldHz < 666700000))
1969                     {
1970                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_MINILVDS_2CH_3PAIR_6BIT_50to66_67MHz;
1971                     }
1972                     else if((ldHz >= 666700000) && (ldHz < 1333300000))
1973                     {
1974                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_MINILVDS_2CH_3PAIR_6BIT_66_67to133_33MHz;
1975                     }
1976                     else
1977                     {
1978                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_MINILVDS_2CH_3PAIR_6BIT_133_33to150MHz;
1979                     }
1980                 break;
1981 
1982                 case E_PNL_LPLL_MINILVDS_2CH_6P_6BIT:
1983                     if ((ldHz <= 500000000) && (ldHz < 670000000))
1984                     {
1985                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_MINILVDS_2CH_6PAIR_6BIT_50to67MHz;
1986                     }
1987                     else if((ldHz >= 670000000) && (ldHz < 1330000000))
1988                     {
1989                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_MINILVDS_2CH_6PAIR_6BIT_67to133MHz;
1990                     }
1991                     else
1992                     {
1993                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_MINILVDS_2CH_6PAIR_6BIT_133to150MHz;
1994                     }
1995                 break;
1996 
1997                 case E_PNL_LPLL_EPI34_4P:
1998                     u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_EPI34_10BIT_4PAIR_95to150MHz;
1999                 break;
2000 
2001                 case E_PNL_LPLL_EPI34_6P:
2002                     u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_EPI34_10BIT_6PAIR_80to150MHz;
2003                 break;
2004 
2005                 case E_PNL_LPLL_EPI34_8P:
2006                     if((ldHz >= 800000000) && (ldHz < 940000000))
2007                     {
2008                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_EPI34_10BIT_8PAIR_80to94MHz;
2009                     }
2010                     else if((ldHz >= 940000000) && (ldHz < 1880000000))
2011                     {
2012                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_EPI34_10BIT_8PAIR_94to188MHz;
2013                     }
2014                     else
2015                     {
2016                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_EPI34_10BIT_8PAIR_188to300MHz;
2017                     }
2018                 break;
2019 
2020                 case E_PNL_LPLL_EPI28_4P:
2021                     if((ldHz >= 800000000) && (ldHz < 1140000000))
2022                     {
2023                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_EPI28_8BIT_4PAIR_80to114MHz;
2024                     }
2025                     else
2026                     {
2027                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_EPI28_8BIT_4PAIR_114to150MHz;
2028                     }
2029                 break;
2030 #endif
2031 
2032                 case E_PNL_LPLL_EPI28_6P:
2033                     if(ldHz < 1500000000UL)
2034                     {
2035                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_EPI_28_6P_150to150MHz;
2036                     }
2037                     else if((ldHz >= 1500000000UL) && (ldHz < 1800000000UL))
2038                     {
2039                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_EPI_28_6P_150to180MHz;
2040                     }
2041                     else
2042                     {
2043                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_EPI_28_6P_180to330MHz;
2044                     }
2045                 break;
2046 
2047                 case E_PNL_LPLL_EPI28_8P:
2048                     if(ldHz < 1500000000UL)
2049                     {
2050                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_EPI_28_8P_150to150MHz;
2051                     }
2052                     else if((ldHz >= 1500000000UL) && (ldHz < 2400000000UL))
2053                     {
2054                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_EPI_28_8P_150to240MHz;
2055                     }
2056                     else
2057                     {
2058                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_EPI_28_8P_240to330MHz;
2059                     }
2060                 break;
2061                 case E_PNL_LPLL_EPI24_12P:
2062                     if(ldHz < 1500000000UL)
2063                     {
2064                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_EPI_24_12P_150to150MHz;
2065                     }
2066                     else
2067                     {
2068                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_EPI_24_12P_150to330MHz;
2069                     }
2070                 break;
2071                 case E_PNL_LPLL_EPI28_12P:
2072                     if(ldHz < 1500000000UL)
2073                     {
2074                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_EPI_28_12P_150to150MHz;
2075                     }
2076                     else
2077                     {
2078                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_EPI_28_12P_150to330MHz;
2079                     }
2080                 break;
2081 /*
2082                 case E_PNL_LPLL_EPI34_12P:
2083                 case E_PNL_LPLL_EPI24_12P:
2084                 break;
2085 */
2086 
2087                 case E_PNL_LPLL_VBY1_10BIT_8LANE:
2088                     if(ldHz < 1500000000UL)
2089                     {
2090                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_VBY1_10BIT_8LANE_150to150MHz;
2091                     }
2092                     else
2093                     {
2094                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_VBY1_10BIT_8LANE_150to300MHz;
2095                     }
2096                     printf("@@11=%u\n",u8SupportedLPLLIndex);
2097                 break;
2098 
2099                 case E_PNL_LPLL_VBY1_10BIT_4LANE:
2100                     if(ldHz < 750000000UL)
2101                     {
2102                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_VBY1_10BIT_4LANE_75to75MHz;
2103                     }
2104                     else
2105                     {
2106                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_VBY1_10BIT_4LANE_75to150MHz;
2107                     }
2108                 break;
2109 
2110                 case E_PNL_LPLL_VBY1_10BIT_2LANE:
2111                     if(ldHz < 375000000UL)
2112                     {
2113                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_VBY1_10BIT_2LANE_37_5to37_5MHz;
2114                     }
2115                     else
2116                     {
2117                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_VBY1_10BIT_2LANE_37_5to75MHz;
2118                     }
2119                 break;
2120 
2121                 case E_PNL_LPLL_VBY1_10BIT_1LANE:
2122                     if(ldHz < 400000000UL)
2123                     {
2124                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_VBY1_10BIT_1LANE_40to40MHz;
2125                     }
2126                     else
2127                     {
2128                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_VBY1_10BIT_1LANE_40to80MHz;
2129                     }
2130                 break;
2131 
2132                 case E_PNL_LPLL_VBY1_8BIT_8LANE:
2133                     if(ldHz < 1500000000UL)
2134                     {
2135                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_VBY1_8BIT_8LANE_150to150MHz;
2136                     }
2137                     else if((ldHz >= 1500000000UL) && (ldHz < 2200000000UL))
2138                     {
2139                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_VBY1_8BIT_8LANE_150to200MHz;
2140                     }
2141                     else
2142                     {
2143                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_VBY1_8BIT_8LANE_200to300MHz;
2144                     }
2145                 break;
2146 
2147                 case E_PNL_LPLL_VBY1_8BIT_4LANE:
2148                     if(ldHz < 750000000UL)
2149                     {
2150                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_VBY1_8BIT_4LANE_75to75MHz;
2151                     }
2152                     else if((ldHz >= 750000000UL) && (ldHz < 1000000000UL))
2153                     {
2154                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_VBY1_8BIT_4LANE_75to100MHz;
2155                     }
2156                     else
2157                     {
2158                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_VBY1_8BIT_4LANE_100to150MHz;
2159                     }
2160                 break;
2161 
2162                 case E_PNL_LPLL_VBY1_8BIT_2LANE:
2163                     if(ldHz < 375000000UL)
2164                     {
2165                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_VBY1_8BIT_2LANE_37_5to37_5MHz;
2166                     }
2167                     else if((ldHz >= 375000000UL) && (ldHz < 500000000UL))
2168                     {
2169                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_VBY1_8BIT_2LANE_37_5to50MHz;
2170                     }
2171                     else
2172                     {
2173                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_VBY1_8BIT_2LANE_50to75MHz;
2174                     }
2175                 break;
2176 
2177                 case E_PNL_LPLL_VBY1_8BIT_1LANE:
2178                     if(ldHz < 400000000UL)
2179                     {
2180                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_VBY1_8BIT_1LANE_40to40MHz;
2181                     }
2182                     else if((ldHz >= 400000000UL) && (ldHz < 500000000UL))
2183                     {
2184                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_VBY1_8BIT_1LANE_40to50MHz;
2185                     }
2186                     else
2187                     {
2188                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_VBY1_8BIT_1LANE_50to80MHz;
2189                     }
2190                 break;
2191 
2192                 case E_PNL_LPLL_VBY1_10BIT_16LANE:
2193                     if(ldHz < 2000000000UL)
2194                     {
2195                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_VBY1_10BIT_16LANE_200to200MHz;
2196                     }
2197                     else
2198                     {
2199                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_VBY1_10BIT_16LANE_200to300MHz;
2200                     }
2201                 break;
2202                 case E_PNL_LPLL_VBY1_8BIT_16LANE:
2203                     if(ldHz < 2000000000UL)
2204                     {
2205                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_VBY1_8BIT_16LANE_200to200MHz;
2206                     }
2207                     else
2208                     {
2209                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_VBY1_8BIT_16LANE_200to300MHz;
2210                     }
2211                 break;
2212                 case E_PNL_LPLL_USI_T_8BIT_12P:
2213                     if(ldHz < 1500000000UL)
2214                     {
2215                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_USI_T_8BIT_12PAIR_150to150MHz;
2216                     }
2217                     else
2218                     {
2219                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_USI_T_8BIT_12PAIR_150to330MHz;
2220                     }
2221                 break;
2222                 case E_PNL_LPLL_USI_T_10BIT_12P:
2223                     if(ldHz < 1500000000UL)
2224                     {
2225                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_USI_T_10BIT_12PAIR_150to150MHz;
2226                     }
2227                     else
2228                     {
2229                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_USI_T_10BIT_12PAIR_150to330MHz;
2230                     }
2231                 break;
2232                 case E_PNL_LPLL_ISP_8BIT_12P:
2233                     if(ldHz < 1500000000UL)
2234                     {
2235                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_ISP_8BIT_12PAIR_150to150MHz;
2236                     }
2237                     else
2238                     {
2239                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_ISP_8BIT_12PAIR_150to330MHz;
2240                     }
2241                 break;
2242                 case E_PNL_LPLL_ISP_8BIT_6P_D:
2243                     if(ldHz < 1500000000UL)
2244                     {
2245                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_ISP_8BIT_6PAIR_DUAL_150to150MHz;
2246                     }
2247                     else
2248                     {
2249                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_ISP_8BIT_6PAIR_DUAL_150to330MHz;
2250                     }
2251                 break;
2252                 default:
2253                     u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_MAX;
2254                 break;
2255             }
2256         }
2257         break;
2258         case E_PNL_LPLL_OSD:
2259         {
2260             switch (eLPLL_Type)
2261             {
2262                 case E_PNL_TYPE_HS_LVDS:
2263                 {
2264                     if(ldHz < 250000000UL)
2265                     {
2266                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_EXT_HS_LVDS_1CH_25to25MHz;
2267                     }
2268                     else if((ldHz >= 250000000UL) && (ldHz < 500000000UL))
2269                     {
2270                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_EXT_HS_LVDS_1CH_25to50MHz;
2271                     }
2272                     else if((ldHz >= 500000000UL) && (ldHz < 1000000000UL))
2273                     {
2274                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_EXT_HS_LVDS_1CH_50to100MHz;
2275                     }
2276                     else
2277                     {
2278                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_EXT_HS_LVDS_1CH_100to150MHz;
2279                     }
2280                 }
2281                 break;
2282 
2283                 case E_PNL_LPLL_VBY1_10BIT_4LANE:
2284                     if(ldHz < 1500000000UL)
2285                     {
2286                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_EXT_VBY1_10BIT_4LANE_150to150MHz;
2287                     }
2288                     else
2289                     {
2290                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_EXT_VBY1_10BIT_4LANE_150to340MHz;
2291                     }
2292                 break;
2293 
2294                 case E_PNL_LPLL_VBY1_10BIT_2LANE:
2295                     if(ldHz < 750000000UL)
2296                     {
2297                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_EXT_VBY1_10BIT_2LANE_75to75MHz;
2298                     }
2299                     else
2300                     {
2301                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_EXT_VBY1_10BIT_2LANE_75to150MHz;
2302                     }
2303                 break;
2304 
2305                 case E_PNL_LPLL_VBY1_10BIT_1LANE:
2306                     if(ldHz < 375000000UL)
2307                     {
2308                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_EXT_VBY1_10BIT_1LANE_37_5to37_5MHz;
2309                     }
2310                     else
2311                     {
2312                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_EXT_VBY1_10BIT_1LANE_37_5to75MHz;
2313                     }
2314                 break;
2315 
2316                 case E_PNL_LPLL_VBY1_8BIT_4LANE:
2317                     if(ldHz < 1500000000UL)
2318                     {
2319                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_EXT_VBY1_8BIT_4LANE_150to150MHz;
2320                     }
2321                     else if((ldHz >= 1500000000UL) && (ldHz < 2200000000UL))
2322                     {
2323                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_EXT_VBY1_8BIT_4LANE_150to200MHz;
2324                     }
2325                     else
2326                     {
2327                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_EXT_VBY1_8BIT_4LANE_200to340MHz;
2328                     }
2329                 break;
2330 
2331                 case E_PNL_LPLL_VBY1_8BIT_2LANE:
2332                     if(ldHz < 750000000UL)
2333                     {
2334                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_EXT_VBY1_8BIT_2LANE_75to75MHz;
2335                     }
2336                     else if((ldHz >= 750000000UL) && (ldHz < 1000000000UL))
2337                     {
2338                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_EXT_VBY1_8BIT_2LANE_75to100MHz;
2339                     }
2340                     else
2341                     {
2342                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_EXT_VBY1_8BIT_2LANE_100to150MHz;
2343                     }
2344                 break;
2345 
2346                 case E_PNL_LPLL_VBY1_8BIT_1LANE:
2347                     if(ldHz < 375000000UL)
2348                     {
2349                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_EXT_VBY1_8BIT_1LANE_37_5to37_5MHz;
2350                     }
2351                     else if((ldHz >= 380000000UL) && (ldHz < 500000000UL))
2352                     {
2353                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_EXT_VBY1_8BIT_1LANE_37_5to50MHz;
2354                     }
2355                     else
2356                     {
2357                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_EXT_VBY1_8BIT_1LANE_50to75MHz;
2358                     }
2359                 break;
2360 
2361                 default:
2362                     u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_EXT_MAX;
2363                 break;
2364             }
2365         }
2366         break;
2367     }
2368     return u8SupportedLPLLIndex;
2369 }
2370 
_MHal_PNL_DumpLPLLTable(void * pInstance,MS_U8 LPLLTblIndex,PNL_LPLL_TYPE_SEL lpll_type_sel)2371 static void _MHal_PNL_DumpLPLLTable(void *pInstance, MS_U8 LPLLTblIndex, PNL_LPLL_TYPE_SEL lpll_type_sel)
2372 {
2373     if(lpll_type_sel == E_PNL_LPLL_VIDEO)
2374     {
2375         if (LPLLTblIndex == E_PNL_SUPPORTED_LPLL_MAX)
2376         {
2377             printf("[%s,%5d] Unspported LPLL Type, skip LPLL setting\n",__FUNCTION__,__LINE__);
2378             return;
2379         }
2380 
2381         int indexCounter = 0;
2382 
2383         for(indexCounter = 0 ; indexCounter<LPLL_REG_NUM; indexCounter++)
2384         {
2385             if (LPLLSettingTBL[LPLLTblIndex][indexCounter].address == 0xFF) //delay in micro second
2386             {
2387                 MsOS_DelayTaskUs(LPLLSettingTBL[LPLLTblIndex][indexCounter].value);
2388                 continue; // step forward to next register setting.
2389             }
2390 
2391             W2BYTEMSK(L_BK_LPLL(LPLLSettingTBL[LPLLTblIndex][indexCounter].address),
2392                       LPLLSettingTBL[LPLLTblIndex][indexCounter].value,
2393                       LPLLSettingTBL[LPLLTblIndex][indexCounter].mask);
2394         }
2395         PNL_DBG(PNL_DBGLEVEL_INIT, "[%s][%d]LPLLTblIndex=%u\n", __FUNCTION__, __LINE__, LPLLTblIndex);
2396     }
2397     else
2398     {
2399         if (LPLLTblIndex == E_PNL_SUPPORTED_LPLL_EXT_MAX)
2400         {
2401             printf("[%s,%5d] Unspported LPLL Type, skip LPLL setting\n",__FUNCTION__,__LINE__);
2402             return;
2403         }
2404 
2405         int indexCounter = 0;
2406 
2407         for(indexCounter = 0 ; indexCounter<LPLL_EXT_REG_NUM; indexCounter++)
2408         {
2409             if (LPLLSettingTBL_Ext[LPLLTblIndex][indexCounter].address == 0xFF) //delay in micro second
2410             {
2411                 MsOS_DelayTaskUs(LPLLSettingTBL_Ext[LPLLTblIndex][indexCounter].value);
2412                 continue; // step forward to next register setting.
2413             }
2414 
2415             W2BYTEMSK(L_BK_LPLL(LPLLSettingTBL_Ext[LPLLTblIndex][indexCounter].address),
2416                       LPLLSettingTBL_Ext[LPLLTblIndex][indexCounter].value,
2417                       LPLLSettingTBL_Ext[LPLLTblIndex][indexCounter].mask);
2418         }
2419         PNL_DBG(PNL_DBGLEVEL_INIT, "[%s][%d]LPLLTblIndex=%u\n", __FUNCTION__, __LINE__, LPLLTblIndex);
2420     }
2421 }
2422 
MHal_PNL_Init_LPLL(void * pInstance,PNL_TYPE eLPLL_Type,PNL_MODE eLPLL_Mode,MS_U64 ldHz)2423 void MHal_PNL_Init_LPLL(void *pInstance, PNL_TYPE eLPLL_Type,PNL_MODE eLPLL_Mode,MS_U64 ldHz)
2424 {
2425     PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
2426     PNL_RESOURCE_PRIVATE* pPNLResourcePrivate = NULL;
2427     UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
2428     UtopiaResourceGetPrivate(g_pPNLResource[PNL_GET_INTERNAL_POOL_ID(pPNLInstancePrivate->u32DeviceID)],(void**)(&pPNLResourcePrivate));
2429     E_PNL_SUPPORTED_LPLL_TYPE u8SupportedLPLLLIndex = E_PNL_SUPPORTED_LPLL_MAX;
2430     PNL_DBG(PNL_DBGLEVEL_INIT, "[%s][%d]\n", __FUNCTION__, __LINE__);
2431 
2432     u8SupportedLPLLLIndex = _MHal_PNL_GetSupportedLPLLIndex(pInstance, eLPLL_Type,eLPLL_Mode,ldHz, E_PNL_LPLL_VIDEO);
2433 
2434     if (u8SupportedLPLLLIndex == E_PNL_SUPPORTED_LPLL_MAX)
2435     {
2436         printf("Not Supported LPLL Type, skip LPLL Init\n");
2437         return;
2438     }
2439 
2440     _MHal_PNL_DumpLPLLTable(pInstance, u8SupportedLPLLLIndex, E_PNL_LPLL_VIDEO);
2441 
2442     //for Maserati sync too fat, so frame lock fail
2443     W2BYTEMSK(L_BK_LPLL(0x3C),0x0000 ,BIT(12));
2444 
2445     MHal_MOD_PVDD_Power_Setting(pInstance, pPNLResourcePrivate->sthalPNL._bPVDD_2V5); // Einstein is always use 3.3V PVDD Power.
2446 }
2447 
MHal_PNL_Get_Loop_DIV(void * pInstance,MS_U8 u8LPLL_Mode,MS_U8 eLPLL_Type,MS_U64 ldHz)2448 MS_U8 MHal_PNL_Get_Loop_DIV(void *pInstance, MS_U8 u8LPLL_Mode, MS_U8 eLPLL_Type, MS_U64 ldHz)
2449 {
2450     MS_U16 u16loop_div = 0;
2451     E_PNL_SUPPORTED_LPLL_TYPE u8SupportedLPLLLIndex = E_PNL_SUPPORTED_LPLL_MAX;
2452 #if defined (__aarch64__)
2453     PNL_DBG(PNL_DBGLEVEL_INIT, "[%s][%d]E_PNL_LPLL_VIDEO : eLPLL_Type=%u, u8LPLL_Mode=%u, ldHz=%lu\n", __FUNCTION__, __LINE__, eLPLL_Type, u8LPLL_Mode, ldHz);
2454 #else
2455     PNL_DBG(PNL_DBGLEVEL_INIT, "[%s][%d]E_PNL_LPLL_VIDEO : eLPLL_Type=%u, u8LPLL_Mode=%u, ldHz=%llu\n", __FUNCTION__, __LINE__, eLPLL_Type, u8LPLL_Mode, ldHz);
2456 #endif
2457     u8SupportedLPLLLIndex = _MHal_PNL_GetSupportedLPLLIndex(pInstance, eLPLL_Type,u8LPLL_Mode,ldHz,E_PNL_LPLL_VIDEO);
2458 
2459     if (u8SupportedLPLLLIndex == E_PNL_SUPPORTED_LPLL_MAX)
2460     {
2461         printf("[%s,%5d] Error LPLL type\n",__FUNCTION__,__LINE__);
2462         u16loop_div = 0 ;
2463     }
2464     else
2465     {
2466         u16loop_div = u16LoopDiv[u8SupportedLPLLLIndex];
2467     }
2468     PNL_DBG(PNL_DBGLEVEL_INIT, "E_PNL_LPLL_VIDEO : u16loop_div=%u\n", u16loop_div);
2469 
2470     u16loop_div *= 2;
2471     return u16loop_div;
2472 }
2473 
MHal_PNL_Get_LPLL_LoopGain(void * pInstance,MS_U8 eLPLL_Mode,MS_U8 eLPLL_Type,MS_U64 ldHz)2474 MS_U16 MHal_PNL_Get_LPLL_LoopGain(void *pInstance, MS_U8 eLPLL_Mode, MS_U8 eLPLL_Type, MS_U64 ldHz)
2475 {
2476     MS_U16 u16loop_gain = 0;
2477     E_PNL_SUPPORTED_LPLL_TYPE u8SupportedLPLLLIndex = E_PNL_SUPPORTED_LPLL_MAX;
2478 #if defined (__aarch64__)
2479     PNL_DBG(PNL_DBGLEVEL_INIT, "[%s][%d]E_PNL_LPLL_VIDEO : eLPLL_Type=%u, eLPLL_Mode=%u, ldHz=%lu\n", __FUNCTION__, __LINE__, eLPLL_Type, eLPLL_Mode, ldHz);
2480 #else
2481     PNL_DBG(PNL_DBGLEVEL_INIT, "[%s][%d]E_PNL_LPLL_VIDEO : eLPLL_Type=%u, eLPLL_Mode=%u, ldHz=%llu\n", __FUNCTION__, __LINE__, eLPLL_Type, eLPLL_Mode, ldHz);
2482 #endif
2483     u8SupportedLPLLLIndex = _MHal_PNL_GetSupportedLPLLIndex(pInstance, eLPLL_Type,eLPLL_Mode,ldHz,E_PNL_LPLL_VIDEO);
2484 
2485     if (u8SupportedLPLLLIndex == E_PNL_SUPPORTED_LPLL_MAX)
2486     {
2487         printf("[%s,%5d] Error LPLL type\n",__FUNCTION__,__LINE__);
2488         u16loop_gain = 0 ;
2489     }
2490     else
2491     {
2492         u16loop_gain = u16LoopGain[u8SupportedLPLLLIndex];
2493     }
2494     PNL_DBG(PNL_DBGLEVEL_INIT, "E_PNL_LPLL_VIDEO : u16loop_gain=%u\n", u16loop_gain);
2495     return u16loop_gain;
2496 }
2497 
2498 #define SKIP_TIMING_CHANGE_CAP  TRUE
Hal_PNL_SkipTimingChange_GetCaps(void * pInstance)2499 MS_BOOL Hal_PNL_SkipTimingChange_GetCaps(void *pInstance)
2500 {
2501     #if (SKIP_TIMING_CHANGE_CAP)
2502         return TRUE;
2503     #else
2504         return FALSE;
2505     #endif
2506 }
2507 
MHal_PNL_PreSetModeOn(void * pInstance,MS_BOOL bSetMode)2508 void MHal_PNL_PreSetModeOn(void *pInstance, MS_BOOL bSetMode)
2509 {
2510     if (bSetMode == TRUE)
2511     {
2512         MOD_A_W2BYTEMSK(REG_MOD_A_BK00_77_L, 0, BIT(15)); //software reset, 0:reset
2513     }
2514     else
2515     {
2516         MOD_A_W2BYTEMSK(REG_MOD_A_BK00_77_L, BIT(15), BIT(15));
2517     }
2518 }
2519 
MHal_PNL_HWLVDSReservedtoLRFlag(void * pInstance,PNL_DrvHW_LVDSResInfo lvdsresinfo)2520 void MHal_PNL_HWLVDSReservedtoLRFlag(void *pInstance, PNL_DrvHW_LVDSResInfo lvdsresinfo)
2521 {
2522     PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
2523     PNL_RESOURCE_PRIVATE* pPNLResourcePrivate = NULL;
2524     UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
2525     UtopiaResourceGetPrivate(g_pPNLResource[PNL_GET_INTERNAL_POOL_ID(pPNLInstancePrivate->u32DeviceID)],(void**)(&pPNLResourcePrivate));
2526 
2527     if (lvdsresinfo.bEnable)
2528     {
2529         if (lvdsresinfo.u16channel & BIT(0))  // Channel A
2530         {
2531             if (lvdsresinfo.u32pair & BIT(3))  // pair 3
2532             {
2533                 MOD_W2BYTEMSK(REG_MOD_BK00_04_L, BIT(15), BIT(15));
2534             }
2535             if (lvdsresinfo.u32pair & BIT(4))  // pair 4
2536             {
2537                 MOD_W2BYTEMSK(REG_MOD_BK00_04_L, BIT(14), BIT(14));
2538             }
2539         }
2540         if (lvdsresinfo.u16channel & BIT(1))  // Channel B
2541         {
2542             if (lvdsresinfo.u32pair & BIT(3))  // pair 3
2543             {
2544                 MOD_W2BYTEMSK(REG_MOD_BK00_04_L, BIT(13), BIT(13));
2545             }
2546             if (lvdsresinfo.u32pair & BIT(4))  // pair 4
2547             {
2548                 MOD_W2BYTEMSK(REG_MOD_BK00_04_L, BIT(12), BIT(12));
2549             }
2550         }
2551 
2552         if(  IsVBY1(pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type) )
2553         {
2554             MOD_W2BYTEMSK(REG_MOD_BK00_54_L, BIT(10), BIT(10)); //reg_sel_ext_bit: sel extend bit, 0: osd_de 1: three_d_flag
2555         }
2556     }
2557     else
2558     {
2559         MOD_W2BYTEMSK(REG_MOD_BK00_04_L, 0x0000, (BIT(15) | BIT(14) | BIT(13) | BIT(12)));
2560 
2561         if(  IsVBY1(pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type) )
2562         {
2563             MOD_W2BYTEMSK(REG_MOD_BK00_54_L, 0x00, BIT(10)); //reg_sel_ext_bit: sel extend bit, 0: osd_de 1: three_d_flag
2564         }
2565     }
2566 }
2567 
2568 ////////////////////////////////////////////////////////////////////////
2569 // Turn OD function
2570 ////////////////////////////////////////////////////////////////////////
MHal_PNL_OverDriver_Init(void * pInstance,MS_PHY u32OD_MSB_Addr,MS_PHY u32OD_MSB_limit,MS_PHY u32OD_LSB_Addr,MS_PHY u32OD_LSB_limit,MS_U8 u8MIUSel)2571 void MHal_PNL_OverDriver_Init(void *pInstance, MS_PHY u32OD_MSB_Addr, MS_PHY u32OD_MSB_limit, MS_PHY u32OD_LSB_Addr, MS_PHY u32OD_LSB_limit, MS_U8 u8MIUSel)
2572 {
2573     PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
2574     UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
2575     SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID,REG_SC_BK16_61_L,u8MIUSel<<8,BIT(8)|BIT(9)); // OD MIU select
2576 
2577     SC_W2BYTE(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_15_L, (MS_U16)(u32OD_MSB_Addr & 0xFFFF)); // OD MSB request base address
2578     SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_16_L, (MS_U16)((u32OD_MSB_Addr >> 16) & 0x00FF), 0x00FF); // OD MSB request base address
2579     SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_60_L, (MS_U16)((u32OD_MSB_Addr >> 24) & 0x0003), 0x0003); // OD MSB request base address
2580     SC_W2BYTE(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_17_L, (MS_U16)(u32OD_MSB_limit & 0xFFFF)); // OD MSB request address limit
2581     SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_18_L, (MS_U16)((u32OD_MSB_limit >> 16) & 0x00FF), 0x00FF); // OD MSB request address limit
2582     SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_60_L, (MS_U16)((u32OD_MSB_limit >> 24) & 0x0003)<<2, 0x000C); // OD MSB request address limit
2583     SC_W2BYTE(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_39_L, (MS_U16)(u32OD_LSB_limit & 0xFFFF)); // OD frame buffer write address limit
2584     SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_3A_L, (MS_U16)((u32OD_LSB_limit >> 16) & 0x00FF), 0x00FF); // OD frame buffer write address limit
2585     SC_W2BYTE(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_3B_L, (MS_U16)(u32OD_LSB_limit & 0xFFFF)); // OD frame buffer read address limit
2586     SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_3C_L, (MS_U16)((u32OD_LSB_limit >> 16) & 0x00FF), 0x00FF); // OD frame buffer read address limit
2587     SC_W2BYTE(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_4F_L, (MS_U16)(u32OD_LSB_Addr & 0xFFFF)); // OD LSB request base address
2588     SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_50_L, (MS_U16)((u32OD_LSB_Addr >> 16) & 0x00FF), 0x00FF); // OD LSB request base address
2589     SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_50_L, (MS_U16)((u32OD_LSB_limit & 0x00FF) << 8), 0xFF00); // OD LSB request limit address
2590     SC_W2BYTE(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_51_L, (MS_U16)((u32OD_LSB_limit >> 8) & 0xFFFF)); // OD LSB request limit address
2591 
2592     SC_W2BYTE(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_1A_L, 0x4020); // OD request rFIFO limit threshold, priority threshold
2593     SC_W2BYTE(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_1C_L, 0x4020); // OD request wFIFO limit threshold, priority threshold
2594     SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_3A_L, 0x00, BIT(14)); // OD strength gradually bypass
2595     SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_3A_L, 0x2F00, 0x3F00);    // OD strength gradually slop
2596     SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_12_L, 0x0C, 0xFF);    // OD active threshold
2597 
2598 }
2599 
MHal_PNL_OverDriver_Enable(void * pInstance,MS_BOOL bEnable)2600 void MHal_PNL_OverDriver_Enable(void *pInstance, MS_BOOL bEnable)
2601 {
2602     PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
2603     UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
2604 
2605     // When OD enable, disable OD/RGBW SRAM PowerDown.
2606 #ifdef CONFIG_MSTAR_SRAMPD
2607     if(pPNLInstancePrivate->u32DeviceID == 0)
2608     {
2609         if(bEnable)
2610         {
2611             SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK3F_10_L, 0, BIT(0));   //OD SRAM PD Enable  : SC_SPD_BK3F_10[0]
2612             SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK3F_50_L, BIT(8), BIT(8));        //OD Clock gate : ~SC_SPD_BK3F_50[8]
2613             SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_6F_L, 0, BIT(15)); //OD Bypass Enable :SC_OD_BK16_6F[15]
2614             SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK3F_10_L, 0, BIT(1));   // RGBW SRAM PD Enable : SC_SPD_BK3F_10[1]
2615             SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK3F_50_L, BIT(9), BIT(9));        // RGBW Clock Gate : ~SC_SPD_BK3F_50[9]
2616             SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_6F_L, 0, BIT(12)); // RGBW bypass enable :SC_OD_BK16_6F[12]
2617             SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_6F_L, BIT(13), BIT(13));       // RGBW bypass enable : ~SC_OD_BK16_6F[13]
2618 
2619             SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK3F_17_L, 0, BIT(0));   //M+ SRAM PD Enable  : SC_SPD_BK3F_17[0]
2620             SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK3F_50_L, BIT(10), BIT(10));        //M+ Clock gate : ~SC_SPD_BK3F_50[10]
2621             //SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_6F_L,0 , BIT(12)); // M+ bypass enable :SC_OD_BK16_6F[12]
2622             //SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_6F_L, 0, BIT(13));       // M+ bypass enable : ~SC_OD_BK16_6F[13]
2623 
2624             SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK3F_0B_L, 0, BIT(4));   //Demura SRAM PD Enable  : SC_SPD_BK3F_0B[4]
2625             SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK77_26_L, 0, BIT(14));   //Demura Clock Gate  : SC_BK77_26[14]
2626             W2BYTEMSK(REG_RVD_45_L, 0, BIT(0));                                              //Demura Clock gate : BK100A_CLKGEN2_45[0]
2627             SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK77_26_L, 0, BIT(15));   //Demura Clock Gate  : SC_BK77_26[15]
2628             SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK3F_0B_L, 0, BIT(5));   //DGA_GAMMA SRAM PD Enable  : SC_SPD_BK3F_0B[5]
2629         }
2630         else
2631         {
2632             SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK3F_10_L, BIT(0), BIT(0));   //OD SRAM PD Enable  : SC_SPD_BK3F_10[0]
2633             SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK3F_50_L, 0, BIT(8));        //OD Clock gate : ~SC_SPD_BK3F_50[8]
2634             SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_6F_L, BIT(15), BIT(15)); //OD Bypass Enable :SC_OD_BK16_6F[15]
2635             SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK3F_10_L, BIT(1), BIT(1));   // RGBW SRAM PD Enable : SC_SPD_BK3F_10[1]
2636             SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK3F_50_L, 0, BIT(9));        // RGBW Clock Gate : ~SC_SPD_BK3F_50[9]
2637             SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_6F_L, BIT(12), BIT(12)); // RGBW bypass enable :SC_OD_BK16_6F[12]
2638             SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_6F_L, 0, BIT(13));       // RGBW bypass enable : ~SC_OD_BK16_6F[13]
2639 
2640             SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK3F_17_L, BIT(0), BIT(0));   //M+ SRAM PD Enable  : SC_SPD_BK3F_17[0]
2641             SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK3F_50_L, 0, BIT(10));        //M+ Clock gate : ~SC_SPD_BK3F_50[10]
2642             //SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_6F_L,0 , BIT(12)); // M+ bypass enable :SC_OD_BK16_6F[12]
2643             //SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_6F_L, 0, BIT(13));       // M+ bypass enable : ~SC_OD_BK16_6F[13]
2644 
2645             SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK3F_0B_L, BIT(4), BIT(4));   //Demura SRAM PD Enable  : SC_SPD_BK3F_0B[4]
2646             SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK77_26_L, BIT(14), BIT(14));   //Demura Clock Gate  : SC_BK77_26[14]
2647             W2BYTEMSK(REG_RVD_45_L, BIT(0), BIT(0));                                              //Demura Clock gate : BK100A_CLKGEN2_45[0]
2648             SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK77_26_L, BIT(15), BIT(15));   //Demura Clock Gate  : SC_BK77_26[15]
2649             SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK3F_0B_L, BIT(5), BIT(5));   //DGA_GAMMA SRAM PD Enable  : SC_SPD_BK3F_0B[5]
2650         }
2651     }
2652 #endif
2653 
2654     // OD mode
2655     // OD used user weight to output blending directly
2656     // OD Enable
2657     if (bEnable)
2658     {
2659         SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_10_L, 0x2D, 0x2F);
2660     }
2661     else
2662     {
2663         SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_10_L, 0x2C, 0x2F);
2664     }
2665 }
2666 
MHal_PNL_OverDriver_TBL(void * pInstance,MS_U8 u8ODTbl[1056])2667 void MHal_PNL_OverDriver_TBL(void *pInstance, MS_U8 u8ODTbl[1056])
2668 {
2669     PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
2670     UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
2671 
2672     MS_U16 i;
2673     MS_U8 u8target;
2674     MS_BOOL bEnable;
2675 
2676     bEnable = SC_R2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_10_L, BIT(0));
2677     SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_10_L, 0x00, BIT(0)); // OD enable
2678     SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_01_L, 0x0E, 0x0E); // OD table SRAM enable, RGB channel
2679 
2680     u8target= u8ODTbl[9];
2681     for (i=0; i<272; i++)
2682     {
2683         SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_03_L, (i == 9)?u8target:(u8target ^ u8ODTbl[i]), 0x00FF);
2684         SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_02_L, (i|0x8000), 0x81FF);
2685         while(SC_R2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_02_L, BIT(15)));
2686     }
2687 
2688     u8target= u8ODTbl[(272+19)];
2689     for (i=0; i<272; i++)
2690     {
2691         SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_06_L, (i == 19)?u8target:(u8target ^ u8ODTbl[(272+i)]), 0x00FF);
2692         SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_05_L, (i|0x8000), 0x81FF);
2693         while(SC_R2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_05_L, BIT(15)));
2694     }
2695 
2696     u8target= u8ODTbl[(272*2+29)];
2697     for (i=0; i<256; i++)
2698     {
2699         SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_09_L, (i == 29)?u8target:(u8target ^ u8ODTbl[(272*2+i)]), 0x00FF);
2700         SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_08_L, (i|0x8000), 0x81FF);
2701         while(SC_R2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_08_L, BIT(15)));
2702     }
2703 
2704     u8target= u8ODTbl[(272*2+256+39)];
2705     for (i=0; i<256; i++)
2706     {
2707         SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_0C_L, (i == 39)?u8target:(u8target ^ u8ODTbl[(272*2+256+i)]), 0x00FF);
2708         SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_0B_L, (i|0x8000), 0x81FF);
2709         while(SC_R2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_0D_L, BIT(15)));
2710     }
2711 
2712     SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_01_L, 0x00, 0x0E); // OD table SRAM enable, RGB channel
2713     SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_10_L, bEnable, BIT(0)); // OD enable
2714 }
2715 
_MHal_PNL_MOD_Swing_Refactor_AfterCAL(void * pInstance,MS_U16 u16Swing_Level)2716 MS_U16 _MHal_PNL_MOD_Swing_Refactor_AfterCAL(void *pInstance, MS_U16 u16Swing_Level)
2717 {
2718     MS_U8 u8ibcal = 0x00;
2719     MS_U16 u16AfterCal_value = 0;
2720     MS_U16 u16Cus_value = 0;
2721 
2722     PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
2723     PNL_RESOURCE_PRIVATE* pPNLResourcePrivate = NULL;
2724     UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
2725     UtopiaResourceGetPrivate(g_pPNLResource[PNL_GET_INTERNAL_POOL_ID(pPNLInstancePrivate->u32DeviceID)],(void**)(&pPNLResourcePrivate));
2726     // =========
2727     // GCR_CAL_LEVEL[1:0] : REG_MOD_A_BK00_70_L =>
2728     // 2'b00 250mV ' GCR_ICON_CHx[5:0]=2'h15 (decimal 21)
2729     // 2'b01 350mV ' GCR_ICON_CHx[5:0]=2'h1F (decimal 31)
2730     // 2'b10 300mV ' GCR_ICON_CHx[5:0]=2'h1A (decimal 26)
2731     // 2'b11 200mV ' GCR_ICON_CHx[5:0]=2'h10 (decimal 16)
2732     // =========
2733     switch(pPNLResourcePrivate->sthalPNL._u8MOD_CALI_TARGET)
2734     {
2735         default:
2736         case 0:
2737             u8ibcal = 0x15;
2738         break;
2739         case 1:
2740             u8ibcal = 0x1F;
2741         break;
2742         case 2:
2743             u8ibcal = 0x1A;
2744         break;
2745         case 3:
2746             u8ibcal = 0x10;
2747         break;
2748     }
2749     u16Cus_value = (u16Swing_Level) * (pPNLResourcePrivate->sthalPNL._u8MOD_CALI_VALUE + 4)/(u8ibcal + 4);
2750     u16AfterCal_value = (u16Cus_value-40)/10+2;
2751 
2752     HAL_MOD_CAL_DBG(printf("\r\n--Swing value after refactor = %d\n", u16AfterCal_value));
2753 
2754     return u16AfterCal_value;
2755 }
2756 
MHal_PNL_MODSwingRegToRealLevelValue(void * pInstance,MS_U16 u16SwingRegValue)2757 MS_U16 MHal_PNL_MODSwingRegToRealLevelValue(void *pInstance, MS_U16 u16SwingRegValue)
2758 {
2759     MS_U8 u8ibcal = 0x00;
2760     MS_U16 u16SwingRealLevelValue = 0;
2761     MS_U16 u16CusValue = 0;
2762     PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
2763     PNL_RESOURCE_PRIVATE* pPNLResourcePrivate = NULL;
2764     UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
2765     UtopiaResourceGetPrivate(g_pPNLResource[PNL_GET_INTERNAL_POOL_ID(pPNLInstancePrivate->u32DeviceID)],(void**)(&pPNLResourcePrivate));
2766     // =========
2767     // GCR_CAL_LEVEL[1:0] : REG_MOD_A_BK00_70_L =>
2768     // 2'b00 250mV ' GCR_ICON_CHx[5:0]=2'h15 (decimal 21)
2769     // 2'b01 350mV ' GCR_ICON_CHx[5:0]=2'h1F (decimal 31)
2770     // 2'b10 300mV ' GCR_ICON_CHx[5:0]=2'h1A (decimal 26)
2771     // 2'b11 200mV ' GCR_ICON_CHx[5:0]=2'h10 (decimal 16)
2772     // =========
2773     switch(pPNLResourcePrivate->sthalPNL._u8MOD_CALI_TARGET)
2774     {
2775         default:
2776         case 0:
2777             u8ibcal = 0x15;
2778         break;
2779         case 1:
2780             u8ibcal = 0x1F;
2781         break;
2782         case 2:
2783             u8ibcal = 0x1A;
2784         break;
2785         case 3:
2786             u8ibcal = 0x10;
2787         break;
2788     }
2789 
2790     u16CusValue =  ((u16SwingRegValue-2)*10)+40;
2791     u16SwingRealLevelValue=(u16CusValue*(u8ibcal + 4))/(pPNLResourcePrivate->sthalPNL._u8MOD_CALI_VALUE + 4);
2792 
2793     HAL_MOD_CAL_DBG(printf("\r\n--Swing Real Level Value = %d\n", u16SwingRealLevelValue));
2794 
2795     return u16SwingRealLevelValue;
2796 }
2797 
MHal_PNL_MOD_Control_Out_Swing(void * pInstance,MS_U16 u16Swing_Level)2798 MS_BOOL MHal_PNL_MOD_Control_Out_Swing(void *pInstance, MS_U16 u16Swing_Level)
2799 {
2800     MS_BOOL bStatus = FALSE;
2801 
2802     MS_U16 u16ValidSwing = 0;
2803     PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
2804     PNL_RESOURCE_PRIVATE* pPNLResourcePrivate = NULL;
2805     UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
2806     UtopiaResourceGetPrivate(g_pPNLResource[PNL_GET_INTERNAL_POOL_ID(pPNLInstancePrivate->u32DeviceID)],(void**)(&pPNLResourcePrivate));
2807 
2808     if((pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type == E_PNL_TYPE_LVDS)||
2809       (pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type == E_PNL_TYPE_HS_LVDS))
2810     {
2811         if(u16Swing_Level>600)
2812             u16Swing_Level=600;
2813         if(u16Swing_Level<40)
2814             u16Swing_Level=40;
2815 
2816         u16ValidSwing = _MHal_PNL_MOD_Swing_Refactor_AfterCAL(pInstance, u16Swing_Level);
2817     }
2818     else
2819     {
2820         u16ValidSwing = u16Swing_Level;
2821     }
2822 
2823     // Disable HW calibration keep mode first, to make SW icon value can write into register.
2824     MOD_A_W2BYTEMSK(REG_MOD_A_BK00_7A_L, 0, BIT(15));
2825 
2826     u16ValidSwing &=0x0F;
2827     // LVDS fill ICON
2828     // ch0+ch1+ch2+ch3
2829     MOD_A_W2BYTE(REG_MOD_A_BK00_50_L, (u16ValidSwing << 12 | u16ValidSwing << 8 | u16ValidSwing << 4 | u16ValidSwing));
2830     // ch4+ch5+ch6+ch7
2831     MOD_A_W2BYTE(REG_MOD_A_BK00_51_L, (u16ValidSwing << 12 | u16ValidSwing << 8 | u16ValidSwing << 4 | u16ValidSwing));
2832     // ch8+ch9+ch10+ch11
2833     MOD_A_W2BYTE(REG_MOD_A_BK00_52_L, (u16ValidSwing << 12 | u16ValidSwing << 8 | u16ValidSwing << 4 | u16ValidSwing));
2834     // ch12+ch13+ch14+ch15
2835     MOD_A_W2BYTE(REG_MOD_A_BK00_53_L, (u16ValidSwing << 12 | u16ValidSwing << 8 | u16ValidSwing << 4 | u16ValidSwing));
2836 
2837     bStatus = TRUE;
2838 
2839     return bStatus;
2840 }
2841 
2842 ////////////////////////////////////////////////////////////////////////
2843 // Turn Pre-Emphasis Current function
2844 ////////////////////////////////////////////////////////////////////////
MHal_PNL_MOD_Control_Out_PE_Current(void * pInstance,MS_U16 u16Current_Level)2845 MS_BOOL MHal_PNL_MOD_Control_Out_PE_Current (void *pInstance, MS_U16 u16Current_Level)
2846 {
2847     MS_BOOL bStatus = FALSE;
2848     MS_U16 u16ValidCurrent = u16Current_Level & 0x0F;
2849 
2850     MOD_A_W2BYTE(REG_MOD_A_BK00_22_L,
2851         ( (u16ValidCurrent  ) |(u16ValidCurrent << 4 )|(u16ValidCurrent << 8 )
2852         |(u16ValidCurrent << 12 )));
2853 
2854     MOD_A_W2BYTE(REG_MOD_A_BK00_23_L,
2855         ( (u16ValidCurrent  ) |(u16ValidCurrent << 4 )|(u16ValidCurrent << 8 )
2856         |(u16ValidCurrent << 12 )));
2857 
2858     MOD_A_W2BYTE(REG_MOD_A_BK00_24_L,
2859         ( (u16ValidCurrent  ) |(u16ValidCurrent << 4 )|(u16ValidCurrent << 8 )
2860         |(u16ValidCurrent << 12 )));
2861 
2862     MOD_A_W2BYTE(REG_MOD_A_BK00_25_L,
2863         ( (u16ValidCurrent  ) |(u16ValidCurrent << 4 )|(u16ValidCurrent << 8 )
2864         |(u16ValidCurrent << 12 )));
2865 
2866     bStatus = TRUE;
2867 
2868     return bStatus;
2869 }
2870 
MHal_PNL_MOD_PECurrent_Setting(void * pInstance,MS_U16 u16Current_Level,MS_U16 u16Channel_Select)2871 void MHal_PNL_MOD_PECurrent_Setting(void *pInstance, MS_U16 u16Current_Level, MS_U16 u16Channel_Select)
2872 {
2873     MS_U16 u16ValidCurrent = u16Current_Level & 0x0F;
2874     MS_U16 u16Ch00_03_mask,u16Ch04_07_mask,u16Ch08_11_mask,u16Ch12_15_mask  = 0;
2875 
2876     u16Ch00_03_mask = (((u16Channel_Select & BIT(0))? 0x000F:0x00)|((u16Channel_Select & BIT(1))? 0x00F0:0x00)
2877                      |((u16Channel_Select & BIT(2))? 0x0F00:0x00)|((u16Channel_Select & BIT(3))? 0xF000:0x00));
2878     u16Ch04_07_mask = (((u16Channel_Select & BIT(4))? 0x000F:0x00)|((u16Channel_Select & BIT(5))? 0x00F0:0x00)
2879                      |((u16Channel_Select & BIT(6))? 0x0F00:0x00)|((u16Channel_Select & BIT(7))? 0xF000:0x00));
2880     u16Ch08_11_mask = (((u16Channel_Select & BIT(8))? 0x000F:0x00)|((u16Channel_Select & BIT(9))? 0x00F0:0x00)
2881                      |((u16Channel_Select & BIT(10))? 0x0F00:0x00)|((u16Channel_Select & BIT(11))? 0xF000:0x00));
2882     u16Ch12_15_mask = (((u16Channel_Select & BIT(12))? 0x000F:0x00)|((u16Channel_Select & BIT(13))? 0x00F0:0x00)
2883                      |((u16Channel_Select & BIT(14))? 0x0F00:0x00)|((u16Channel_Select & BIT(15))? 0xF000:0x00));
2884 
2885     if(u16Ch00_03_mask)
2886     {
2887         MOD_A_W2BYTEMSK(REG_MOD_A_BK00_22_L,
2888             ((u16ValidCurrent)|(u16ValidCurrent << 4)|(u16ValidCurrent << 8)|(u16ValidCurrent << 12 )), u16Ch00_03_mask);
2889     }
2890     else
2891     {
2892         MOD_A_W2BYTE(REG_MOD_A_BK00_22_L,0x00);
2893     }
2894 
2895     if(u16Ch04_07_mask)
2896     {
2897         MOD_A_W2BYTEMSK(REG_MOD_A_BK00_23_L,
2898             ((u16ValidCurrent)|(u16ValidCurrent << 4)|(u16ValidCurrent << 8)|(u16ValidCurrent << 12 )), u16Ch04_07_mask);
2899     }
2900     else
2901     {
2902         MOD_A_W2BYTE(REG_MOD_A_BK00_23_L,0x00);
2903     }
2904 
2905     if(u16Ch08_11_mask)
2906     {
2907         MOD_A_W2BYTEMSK(REG_MOD_A_BK00_24_L,
2908             ((u16ValidCurrent)|(u16ValidCurrent << 4)|(u16ValidCurrent << 8)|(u16ValidCurrent << 12 )), u16Ch08_11_mask);
2909     }
2910     else
2911     {
2912         MOD_A_W2BYTE(REG_MOD_A_BK00_24_L,0x00);
2913     }
2914 
2915     if(u16Ch12_15_mask)
2916     {
2917         MOD_A_W2BYTEMSK(REG_MOD_A_BK00_25_L,
2918             ((u16ValidCurrent)|(u16ValidCurrent << 4)|(u16ValidCurrent << 8)|(u16ValidCurrent << 12 )), u16Ch12_15_mask);
2919     }
2920     else
2921     {
2922         MOD_A_W2BYTE(REG_MOD_A_BK00_25_L,0x00);
2923     }
2924 }
2925 
2926 ////////////////////////////////////////////////////////////////////////
2927 // 1.Turn TTL low-power mode function
2928 // 2.Turn internal termination function
2929 // 3.Turn DRIVER BIAS OP function
2930 ////////////////////////////////////////////////////////////////////////
MHal_PNL_MOD_Control_Out_TTL_Resistor_OP(void * pInstance,MS_BOOL bEnble)2931 MS_BOOL MHal_PNL_MOD_Control_Out_TTL_Resistor_OP (void *pInstance, MS_BOOL bEnble)
2932 {
2933     MS_BOOL bStatus = FALSE;
2934     if(bEnble)
2935     {
2936         MOD_A_W2BYTEMSK(REG_MOD_A_BK00_0A_L, 0xFFFF, 0xFFFF); //Enable TTL low-power mode
2937 
2938         MOD_A_W2BYTEMSK(REG_MOD_A_BK00_06_L, 0xFFFF, 0xFFFF); //GCR_EN_RINT (internal termination open)
2939 
2940         //MOD_W2BYTEMSK(REG_MOD_BK00_76_L, 0x003F, 0x003F);// can not find in Manhattan register table
2941 
2942         MOD_A_W2BYTEMSK(REG_MOD_A_BK00_08_L, 0xFFFF, 0xFFFF); //Disable DRIVER BIAS OP
2943         MOD_W2BYTEMSK(REG_MOD_BK00_5E_L, 0x003F, 0x003F);
2944     }
2945     else
2946     {
2947         MOD_A_W2BYTEMSK(REG_MOD_A_BK00_34_L, 0x0000, 0xFFFF); //Disable TTL low-power mode
2948 //        MOD_A_W2BYTEMSK(REG_MOD_A_BK00_39_L, 0x0000, 0x001E);
2949 
2950         MOD_A_W2BYTEMSK(REG_MOD_A_BK00_06_L, 0x0000, 0xFFFF); //GCR_EN_RINT (internal termination close)
2951         MOD_W2BYTEMSK(REG_MOD_BK00_76_L, 0x0000, 0x003F);
2952 
2953         MOD_A_W2BYTEMSK(REG_MOD_A_BK00_08_L, 0x0000, 0xFFFF); //Enable DRIVER BIAS OP
2954         MOD_W2BYTEMSK(REG_MOD_BK00_5E_L, 0x0000, 0x003F);
2955     }
2956 
2957     bStatus = TRUE;
2958     return bStatus;
2959 }
2960 
MHal_PNL_PreInit(void * pInstance,PNL_OUTPUT_MODE eParam)2961 void MHal_PNL_PreInit(void *pInstance, PNL_OUTPUT_MODE eParam)
2962 {
2963     PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
2964     PNL_RESOURCE_PRIVATE* pPNLResourcePrivate = NULL;
2965     UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
2966     UtopiaResourceGetPrivate(g_pPNLResource[PNL_GET_INTERNAL_POOL_ID(pPNLInstancePrivate->u32DeviceID)],(void**)(&pPNLResourcePrivate));
2967     pPNLResourcePrivate->sthalPNL._eDrvPnlInitOptions = eParam;
2968 }
2969 
MHal_PNL_Get_Output_MODE(void * pInstance)2970 PNL_OUTPUT_MODE MHal_PNL_Get_Output_MODE(void *pInstance)
2971 {
2972     PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
2973     PNL_RESOURCE_PRIVATE* pPNLResourcePrivate = NULL;
2974     UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
2975     UtopiaResourceGetPrivate(g_pPNLResource[PNL_GET_INTERNAL_POOL_ID(pPNLInstancePrivate->u32DeviceID)],(void**)(&pPNLResourcePrivate));
2976     PNL_OUTPUT_MODE eParam = pPNLResourcePrivate->sthalPNL._eDrvPnlInitOptions;
2977 
2978     return eParam;
2979 }
2980 
msReadEfuse(void * pInstance,MS_U8 u8Bank,MS_U32 u32Mask)2981 MS_U32 msReadEfuse(void *pInstance, MS_U8 u8Bank, MS_U32 u32Mask)
2982 {
2983     MS_U32 u32Result = 0;
2984     MS_U8 u8Count = 0;
2985 
2986     W2BYTEMSK(0x2050, u8Bank<<2, BMASK(8:2));  /// reg28[8:2]Addr 6~0
2987     W2BYTEMSK(0x2050, BIT(13), BIT(13));       /// Reg28[13] Margin Read
2988     while(R2BYTEMSK(0x2050, BIT(13)) == BIT(13))
2989     {
2990         MsOS_DelayTask(1);
2991         u8Count ++;
2992 
2993         if (u8Count >10)
2994             break;
2995     }
2996 
2997     u32Result = (R4BYTE(0x2058)& u32Mask);    /// reg2C,2D read value
2998     printf("[%s][%d]u32Result=%tx, after mask u32Result=%tx\n", __FUNCTION__, __LINE__,(ptrdiff_t) R4BYTE(0x2058), (ptrdiff_t)u32Result);
2999     return u32Result;
3000 
3001 }
3002 
msSetVBY1RconValue(void * pInstance)3003 void msSetVBY1RconValue(void *pInstance)
3004 {
3005     MS_U16 u16DefaultICON_Max = 40, u16DefaultICON_Min = 7;
3006     MS_U16 u16DefaultICON = 18;
3007     MS_U32 u32Mask = 0x3F;
3008     MS_BOOL bEfuseMode = FALSE;
3009     MS_U16 u16SwingOffset = 0;  // by HW RD request
3010     MS_U16 u16temp = 0;
3011 
3012     if(!(_Hal_MOD_External_eFuse()))
3013     {
3014         if (msReadEfuse(pInstance, 0x4E, BIT(6)) == BIT(6))
3015             bEfuseMode = TRUE;
3016 
3017 
3018         // Disable HW calibration keep mode first, to make SW icon value can write into register.
3019         MOD_A_W2BYTEMSK(REG_MOD_A_BK00_7A_L, 0, BIT(15));
3020 
3021         if (bEfuseMode)
3022         {
3023             if(((MS_U16)msReadEfuse(pInstance, 0x4E, u32Mask) + u16SwingOffset) > u16DefaultICON_Max)
3024                 u16temp = u16DefaultICON;
3025             else if(((MS_U16)msReadEfuse(pInstance, 0x4E, u32Mask) + u16SwingOffset) < u16DefaultICON_Min)
3026                 u16temp = u16DefaultICON;
3027             else
3028                 u16temp = (MS_U16)msReadEfuse(pInstance, 0x4E, u32Mask) + u16SwingOffset;
3029         }
3030         else
3031         {
3032             u16temp = u16DefaultICON;
3033         }
3034 
3035         //ch0~ch13 rcon setting
3036         u16temp &= (u16temp&(MS_U16)u32Mask);
3037         printf("[%s][%d]u16temp= %x\n", __FUNCTION__, __LINE__, u16temp);
3038 
3039         MOD_A_W2BYTE(REG_MOD_A_BK00_40_L, (u16temp<<8|u16temp));
3040         MOD_A_W2BYTE(REG_MOD_A_BK00_41_L, (u16temp<<8|u16temp));
3041         MOD_A_W2BYTE(REG_MOD_A_BK00_42_L, (u16temp<<8|u16temp));
3042         MOD_A_W2BYTE(REG_MOD_A_BK00_43_L, (u16temp<<8|u16temp));
3043         MOD_A_W2BYTE(REG_MOD_A_BK00_44_L, (u16temp<<8|u16temp));
3044         MOD_A_W2BYTE(REG_MOD_A_BK00_45_L, (u16temp<<8|u16temp));
3045         MOD_A_W2BYTE(REG_MOD_A_BK00_46_L, (u16temp<<8|u16temp));
3046         MOD_A_W2BYTE(REG_MOD_A_BK00_47_L, (u16temp<<8|u16temp));
3047     }
3048 }
3049 
MHal_PNL_SetOutputType(void * pInstance,PNL_OUTPUT_MODE eOutputMode,PNL_TYPE eLPLL_Type)3050 void MHal_PNL_SetOutputType(void *pInstance, PNL_OUTPUT_MODE eOutputMode, PNL_TYPE eLPLL_Type)
3051 {
3052     MS_U16 u16ValidSwing2 = 0;
3053     PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
3054     PNL_RESOURCE_PRIVATE* pPNLResourcePrivate = NULL;
3055     UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
3056     UtopiaResourceGetPrivate(g_pPNLResource[PNL_GET_INTERNAL_POOL_ID(pPNLInstancePrivate->u32DeviceID)],(void**)(&pPNLResourcePrivate));
3057     if( eLPLL_Type == E_PNL_TYPE_TTL)
3058     {
3059         // select pair output to be TTL
3060         MOD_A_W2BYTEMSK(REG_MOD_A_BK00_01_L, 0x2000,0x2000);
3061         MsOS_DelayTask(1);
3062         MOD_A_W2BYTE(REG_MOD_A_BK00_18_L, 0x0000);
3063         MOD_A_W2BYTE(REG_MOD_A_BK00_19_L, 0x0000);
3064         MOD_A_W2BYTEMSK(REG_MOD_A_BK00_01_L, 0x0000,0x2000);
3065 
3066         // other TTL setting
3067         MOD_A_W2BYTEMSK(REG_MOD_A_BK00_6B_L, 0x0000,0x0FF0);
3068         MOD_A_W2BYTEMSK(REG_MOD_A_BK00_74_L, 0x0000,0xFF00);
3069 
3070 
3071         MOD_A_W2BYTE(REG_MOD_A_BK00_66_L, 0x0000);
3072         MOD_A_W2BYTE(REG_MOD_A_BK00_67_L, 0x0000);
3073         //MOD_W2BYTEMSK(REG_MOD_BK00_5D_L, 0x0000, 0xE000);//just debug status in Manhattan
3074 
3075         MOD_A_W2BYTEMSK(REG_MOD_A_BK00_74_L, (BIT(3)|BIT(2)), (BIT(3)|BIT(2)));       // TTL skew: G
3076         MOD_A_W2BYTEMSK(REG_MOD_A_BK00_74_L, (BIT(5)|BIT(4)), (BIT(5)|BIT(4)));       // TTL skew: B
3077 
3078     }
3079     else if(( eLPLL_Type == E_PNL_LPLL_VBY1_10BIT_16LANE)||
3080             ( eLPLL_Type == E_PNL_LPLL_VBY1_10BIT_8LANE)||
3081             ( eLPLL_Type == E_PNL_LPLL_VBY1_10BIT_4LANE)||
3082             ( eLPLL_Type == E_PNL_LPLL_VBY1_10BIT_2LANE)||
3083             ( eLPLL_Type == E_PNL_LPLL_VBY1_10BIT_1LANE))
3084     {
3085         // rcon
3086         if(pPNLResourcePrivate->stdrvPNL._stPnlInitData.u32PNL_MISC & (MS_U32)E_APIPNL_MISC_SKIP_ICONVALUE)
3087         {
3088             HAL_MOD_CAL_DBG(printf("User define Swing Value=%u\n", __FUNCTION__, __LINE__, pPNLResourcePrivate->sthalPNL._u16PnlDefault_SwingLevel));
3089             MHal_PNL_MOD_Control_Out_Swing(pInstance, pPNLResourcePrivate->sthalPNL._u16PnlDefault_SwingLevel);
3090         }
3091         else
3092         {
3093             HAL_MOD_CAL_DBG(printf("Use RconValue\n", __FUNCTION__, __LINE__));
3094             msSetVBY1RconValue(pInstance);
3095         }
3096 
3097         //reg_gcr_en_rint_ch: enable double termination function
3098         MOD_A_W2BYTE(REG_MOD_A_BK00_06_L, 0x0000);
3099 
3100         MOD_A_W2BYTEMSK(REG_MOD_A_BK00_6B_L, 0x03F0,0x0FF0);
3101         MOD_A_W2BYTEMSK(REG_MOD_A_BK00_74_L, 0x0000,0xFF00);
3102 
3103         // manhattan: reg_1ms_cnt/when 12MHz xtal clock, count 12000 times is 1ms
3104         // maserati : reg_mod_dummy2
3105         MOD_A_W2BYTE(REG_MOD_A_BK00_7F_L, 0xFFFF);
3106 
3107         // mod_a_77[1]: reg_vby1_ctrl_mode, select Hdtpn/Lockn is from Atop or PAD 1: from atop 0: from PAD
3108         //MOD_A_W2BYTEMSK(REG_MOD_A_BK00_01_L, 0x0000,BIT(1));  // there is no data when soc change mod output timing, so mark this setting
3109 
3110         MOD_W2BYTE(REG_MOD_BK00_61_L, 0x8F3F); //[15]all dk scr[13:8]aln_de_cnt [7:0] aln_pix_cnt
3111 
3112         MOD_A_W2BYTE(REG_MOD_A_BK00_66_L, 0xFFFF);
3113         MOD_A_W2BYTE(REG_MOD_A_BK00_67_L, 0xFFFF);
3114         MOD_A_W2BYTE(REG_MOD_A_BK00_68_L, 0xFFFF);
3115         MOD_A_W2BYTE(REG_MOD_A_BK00_69_L, 0xFFFF);
3116 
3117         // reg 60/61:reg_gpo_oez, Disable TTL output
3118         MOD_A_W2BYTE(REG_MOD_A_BK00_60_L, 0xFFFF);
3119         MOD_A_W2BYTE(REG_MOD_A_BK00_61_L, 0xFFFF);
3120 
3121         // reg 62/63:reg_gpo_datain, general purpose output data
3122         MOD_A_W2BYTE(REG_MOD_A_BK00_62_L, 0xFFFF);
3123         MOD_A_W2BYTE(REG_MOD_A_BK00_63_L, 0xFFFF);
3124 
3125         switch(eOutputMode)
3126         {
3127             case E_PNL_OUTPUT_NO_OUTPUT:
3128                 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_01_L, 0x2000,0x2000);
3129                 MsOS_DelayTask(1);
3130                 MOD_A_W2BYTE(REG_MOD_A_BK00_18_L, 0x0000);
3131                 MOD_A_W2BYTE(REG_MOD_A_BK00_19_L, 0x0000);
3132                 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_01_L, 0x0000,0x2000);
3133                 if(1)//( eLPLL_Type == E_PNL_LPLL_VBY1_10BIT_4LANE)
3134                 {
3135                     //-------------------------------------
3136                     //## icon (Swing)
3137                     MOD_A_W2BYTE(REG_MOD_A_BK00_30_L, 0x0000);
3138                     MOD_A_W2BYTE(REG_MOD_A_BK00_31_L, 0x0000);
3139 
3140                     //-------------------------------------
3141                     //vby1
3142                     MOD_W2BYTE(REG_MOD_BK00_61_L, 0x8f3f); //[15]all dk scr[13:8]aln_de_cnt [7:0] aln_pix_cnt
3143                 }
3144                 else if( eLPLL_Type == E_PNL_LPLL_VBY1_10BIT_2LANE)
3145                 {
3146                     //-------------------------------------
3147                     //## icon (Swing)
3148                     MOD_A_W2BYTE(REG_MOD_A_BK00_30_L, 0x0000);
3149                     MOD_A_W2BYTE(REG_MOD_A_BK00_31_L, 0x0000);
3150 
3151                     //vby1
3152                     MOD_W2BYTE(REG_MOD_BK00_61_L, 0x8f3f);
3153                 }
3154                 break;
3155 
3156             case E_PNL_OUTPUT_CLK_ONLY:
3157             case E_PNL_OUTPUT_DATA_ONLY:
3158             case E_PNL_OUTPUT_CLK_DATA:
3159             default:
3160                 if(eLPLL_Type == E_PNL_LPLL_VBY1_10BIT_16LANE)
3161                 {
3162                     if( APIPNL_OUTPUT_CHANNEL_ORDER_USER == pPNLResourcePrivate->stdrvPNL._stPnlInitData.u8OutputOrderType )
3163                     {
3164                         _MHal_PNL_Auto_Set_Config(pInstance,
3165                                                   pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder0_3,
3166                                                   pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder4_7,
3167                                                   pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder8_11,
3168                                                   pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder12_13);
3169 
3170                         _MHal_PNL_Set_Clk(pInstance,
3171                                                   pPNLResourcePrivate->stdrvPNL._stPnlInitData.u8OutputOrderType,
3172                                                   pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder0_3,
3173                                                   pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder4_7,
3174                                                   pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder8_11,
3175                                                   pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder12_13);
3176                     }
3177                     else
3178                     {
3179                         MOD_A_W2BYTE(REG_MOD_A_BK00_18_L, 0x5555); //[15:0]reg_output_conf[15:0]
3180                         MOD_A_W2BYTE(REG_MOD_A_BK00_19_L, 0x5555); //[15:0]reg_output_conf[15:0]
3181                     }
3182                 }
3183                 else if(eLPLL_Type == E_PNL_LPLL_VBY1_10BIT_8LANE)
3184                 {
3185                     //MOD_A_W2BYTE(REG_MOD_A_BK00_3A_L, 0xC100);
3186                     if( APIPNL_OUTPUT_CHANNEL_ORDER_USER == pPNLResourcePrivate->stdrvPNL._stPnlInitData.u8OutputOrderType )
3187                     {
3188                         _MHal_PNL_Auto_Set_Config(pInstance,
3189                                                   pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder0_3,
3190                                                   pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder4_7,
3191                                                   pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder8_11,
3192                                                   pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder12_13);
3193 
3194                         _MHal_PNL_Set_Clk(pInstance,
3195                                                   pPNLResourcePrivate->stdrvPNL._stPnlInitData.u8OutputOrderType,
3196                                                   pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder0_3,
3197                                                   pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder4_7,
3198                                                   pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder8_11,
3199                                                   pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder12_13);
3200                     }
3201                     else
3202                     {
3203                         MOD_A_W2BYTE(REG_MOD_A_BK00_18_L, 0x5555); //[15:0]reg_output_conf[15:0]
3204                         MOD_A_W2BYTE(REG_MOD_A_BK00_19_L, 0x0000); //[15:0]reg_output_conf[15:0]
3205                     }
3206                 }
3207                 else if( eLPLL_Type == E_PNL_LPLL_VBY1_10BIT_4LANE)
3208                 {
3209                     //ori Manhattan: MOD_W2BYTE(REG_MOD_BK00_4A_L, 0x0002);
3210                     MOD_W2BYTEMSK(REG_MOD_BK00_52_L, 0x0000, 0xC000); //[15]:reg_abswitch_l [14]:reg_abswitch_r
3211                     MOD_W2BYTEMSK(REG_MOD_BK00_05_L, 0x0000, BIT(1));
3212 
3213                     MOD_A_W2BYTE(REG_MOD_A_BK00_32_L, 0x7f7f);
3214                     MOD_A_W2BYTE(REG_MOD_A_BK00_33_L, 0x7f7f);
3215 
3216                     if( APIPNL_OUTPUT_CHANNEL_ORDER_USER == pPNLResourcePrivate->stdrvPNL._stPnlInitData.u8OutputOrderType )
3217                     {
3218                         _MHal_PNL_Auto_Set_Config(pInstance,
3219                                                   pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder0_3,
3220                                                   pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder4_7,
3221                                                   pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder8_11,
3222                                                   pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder12_13);
3223 
3224                         _MHal_PNL_Set_Clk(pInstance,
3225                                                   pPNLResourcePrivate->stdrvPNL._stPnlInitData.u8OutputOrderType,
3226                                                   pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder0_3,
3227                                                   pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder4_7,
3228                                                   pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder8_11,
3229                                                   pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder12_13);
3230                     }
3231                     else
3232                     {
3233                         MOD_A_W2BYTE(REG_MOD_A_BK00_18_L, 0x0055); //[15:0]reg_output_conf[15:0]
3234                         MOD_A_W2BYTE(REG_MOD_A_BK00_19_L, 0x0000); //[15:0]reg_output_conf[15:0]
3235                     }
3236                 }
3237                 else if( eLPLL_Type == E_PNL_LPLL_VBY1_10BIT_2LANE )
3238                 {
3239                     //ori Manhattan: MOD_W2BYTE(REG_MOD_BK00_4A_L, 0x0000);
3240                     MOD_W2BYTEMSK(REG_MOD_BK00_52_L, 0x0000, 0xC000); //[15]:reg_abswitch_l [14]:reg_abswitch_r
3241                     MOD_W2BYTEMSK(REG_MOD_BK00_05_L, 0x0000, BIT(1));
3242 
3243                     MOD_A_W2BYTE(REG_MOD_A_BK00_32_L, 0x7f7f);
3244                     MOD_A_W2BYTE(REG_MOD_A_BK00_33_L, 0x0000);
3245 
3246                     if( APIPNL_OUTPUT_CHANNEL_ORDER_USER == pPNLResourcePrivate->stdrvPNL._stPnlInitData.u8OutputOrderType )
3247                     {
3248                         _MHal_PNL_Auto_Set_Config(pInstance,
3249                                                   pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder0_3,
3250                                                   pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder4_7,
3251                                                   pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder8_11,
3252                                                   pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder12_13);
3253 
3254                         _MHal_PNL_Set_Clk(pInstance,
3255                                                   pPNLResourcePrivate->stdrvPNL._stPnlInitData.u8OutputOrderType,
3256                                                   pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder0_3,
3257                                                   pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder4_7,
3258                                                   pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder8_11,
3259                                                   pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder12_13);
3260                     }
3261                     else
3262                     {
3263                         MOD_A_W2BYTE(REG_MOD_A_BK00_18_L, 0x0005);
3264                         MOD_A_W2BYTE(REG_MOD_A_BK00_19_L, 0x0000); //[15:0]reg_output_conf[15:0]
3265                     }
3266                 }
3267                 else if( eLPLL_Type == E_PNL_LPLL_VBY1_10BIT_1LANE ) //Maserati Raptor output 576p/480p case
3268                 {
3269                     //ori Manhattan: MOD_W2BYTE(REG_MOD_BK00_4A_L, 0x0000);
3270                     MOD_W2BYTEMSK(REG_MOD_BK00_52_L, 0x0000, 0xC000); //[15]:reg_abswitch_l [14]:reg_abswitch_r
3271                     MOD_W2BYTEMSK(REG_MOD_BK00_05_L, 0x0000, BIT(1));
3272 
3273                     MOD_A_W2BYTE(REG_MOD_A_BK00_32_L, 0x7f7f);
3274                     MOD_A_W2BYTE(REG_MOD_A_BK00_33_L, 0x0000);
3275 
3276                     if( APIPNL_OUTPUT_CHANNEL_ORDER_USER == pPNLResourcePrivate->stdrvPNL._stPnlInitData.u8OutputOrderType )
3277                     {
3278                         _MHal_PNL_Auto_Set_Config(pInstance,
3279                                                   pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder0_3,
3280                                                   pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder4_7,
3281                                                   pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder8_11,
3282                                                   pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder12_13);
3283 
3284                         _MHal_PNL_Set_Clk(pInstance,
3285                                                   pPNLResourcePrivate->stdrvPNL._stPnlInitData.u8OutputOrderType,
3286                                                   pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder0_3,
3287                                                   pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder4_7,
3288                                                   pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder8_11,
3289                                                   pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder12_13);
3290                     }
3291                     else
3292                     {
3293                         MOD_A_W2BYTE(REG_MOD_A_BK00_18_L, 0x0101);
3294                         MOD_A_W2BYTE(REG_MOD_A_BK00_19_L, 0x0000); //[15:0]reg_output_conf[15:0]
3295                     }
3296                 }
3297                 break;
3298         }
3299     }
3300     //// for osd dedicated output port, 1 port for video and 1 port for osd
3301     else if((eLPLL_Type == E_PNL_TYPE_HS_LVDS)&&
3302             (pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Mode == E_PNL_MODE_SINGLE))
3303     {
3304         MOD_A_W2BYTEMSK(REG_MOD_A_BK00_00_L, 0x001F , 0x001F); // enable clk_dot_mini_pre_osd & clk_dot_mini_osd
3305         MOD_A_W2BYTEMSK(REG_MOD_A_BK00_10_L, BIT(13),BIT(13));
3306 
3307         // enable osd lvds path
3308         MOD_W2BYTEMSK(REG_MOD_BK00_54_L, 0x0000, BIT(14) );
3309         MOD_W2BYTEMSK(REG_MOD_BK00_2E_L, BIT(10), BIT(10) );
3310         MOD_W2BYTEMSK(REG_MOD_BK00_05_L, 0x0000, BIT(12) );
3311         MOD_W2BYTEMSK(REG_MOD_BK00_00_L, 0x0000, BIT(0) );
3312         MOD_W2BYTEMSK(REG_MOD_BK00_51_L, 0x0000, (BIT(2)|BIT(3)|BIT(4)) );
3313 
3314         MOD_A_W2BYTEMSK(REG_MOD_A_BK00_77_L, BIT(0), BIT(0)); //[15]sw_rst
3315         MOD_A_W2BYTEMSK(REG_MOD_A_BK00_10_L, 0x0C00 , 0x1F00); // enable clk_dot_mini_pre_osd & clk_dot_mini_osd
3316     }
3317     else
3318     {
3319         switch(eOutputMode)
3320         {
3321             case E_PNL_OUTPUT_NO_OUTPUT:
3322                 // if MOD_45[5:0] = 0x3F && XC_MOD_EXT_DATA_EN_L = 0x0,
3323                 // then if XC_MOD_OUTPUT_CONF_L = 0x0 ---> output TTL as tri-state
3324                 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_01_L, 0x2000,0x2000);
3325                 MsOS_DelayTask(1);
3326                 MOD_A_W2BYTE(REG_MOD_A_BK00_18_L, 0x0000);
3327                 MOD_A_W2BYTE(REG_MOD_A_BK00_19_L, 0x0000);
3328                 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_01_L, 0x0000,0x2000);
3329 
3330                 //----------------------------------
3331                 // Purpose: Set the output to be the GPO, and let it's level to Low
3332                 // 1. External Enable, Pair 0~5
3333                 // 2. GPIO Enable, pair 0~5
3334                 // 3. GPIO Output data : All low, pair 0~5
3335                 // 4. GPIO OEZ: output piar 0~5
3336                 //----------------------------------
3337 
3338                 //1.External Enable, Pair 0~5
3339                 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_66_L, 0x0FFF, 0x0FFF);
3340                 //2.GPIO Enable, pair 0~5
3341                 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_68_L, 0x0FFF, 0x0FFF);
3342                 //3.GPIO Output data : All low, pair 0~5
3343                 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_62_L, 0x0000, 0x0FFF);
3344                 //4.GPIO OEZ: output piar 0~5
3345                 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_60_L, 0x0000, 0x0FFF);
3346 
3347                 //1.External Enable, Pair 6~15
3348                 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_66_L, 0xF000, 0xF000);
3349                 MOD_A_W2BYTE(REG_MOD_A_BK00_67_L, 0xFFFF);
3350                 //2.GPIO Enable, pair 6~15
3351                 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_68_L, 0xF000, 0xF000);
3352                 MOD_A_W2BYTE(REG_MOD_A_BK00_69_L, 0xFFFF);
3353                 //3.GPIO Output data : All low, pair 6~15
3354                 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_62_L, 0x0000, 0xF000);
3355                 MOD_A_W2BYTE(REG_MOD_A_BK00_63_L, 0x0000);
3356                 //4.GPIO OEZ: output piar 6~15
3357                 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_60_L, 0x0000, 0xF000);
3358                 MOD_A_W2BYTE(REG_MOD_A_BK00_61_L, 0x0000);
3359 
3360                 //1234.External Enable, Pair 16~17
3361                 //MOD_W2BYTE(REG_MOD_BK00_7E_L, 0xFF00);//remove in Manhattan
3362 
3363                 //1.External Enable, Pair 18~20, 2.GPIO Enable, pair 18~20
3364                 MOD_W2BYTEMSK(REG_MOD_BK00_5C_L, 0x3F00, 0x3F00);
3365                 MOD_W2BYTEMSK(REG_MOD_BK00_64_L, 0x003F, 0x003F);
3366                 //3.GPIO Output data : All low, pair 18~20
3367                 MOD_W2BYTEMSK(REG_MOD_BK00_5E_L, 0x0000, 0x3F00);
3368                 //4.GPIO OEZ: output piar 18~20
3369                 //MOD_W2BYTEMSK(REG_MOD_BK00_7F_L, 0x0000, 0xFC00); //remove in Manhattan
3370                 break;
3371 
3372             case E_PNL_OUTPUT_CLK_ONLY:
3373                 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_18_L, 0, 0xF000);
3374                 MOD_A_W2BYTE(REG_MOD_A_BK00_19_L, 0x4004);
3375                 break;
3376 
3377             case E_PNL_OUTPUT_DATA_ONLY:
3378             case E_PNL_OUTPUT_CLK_DATA:
3379             default:
3380 
3381                 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_68_L, 0x0000, 0xF000);
3382                 MOD_A_W2BYTE(REG_MOD_A_BK00_69_L, 0x0000);
3383                 //1. set GCR_PVDD_2P5=1¡¦b1;           MOD PVDD power:    1: 2.5V
3384                 //MOD_A_W2BYTEMSK(REG_MOD_A_BK00_39_L, 0, BIT(6));
3385                 //2. set PD_IB_MOD=1¡¦b0;
3386                 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_01_L, 0x00, BIT(0));
3387                 //  save ch6 init value
3388                 u16ValidSwing2 = (MOD_A_R2BYTEMSK(REG_MOD_A_BK00_33_L, 0x3F00)>>8);
3389                 //3. set Desired Pairs: GCR_ICON[5:0]=6h3f (current all open);
3390                 MHal_PNL_MOD_Control_Out_Swing(pInstance, MHal_PNL_MODSwingRegToRealLevelValue(pInstance, 0x3F));
3391                 //4. set Desired Pairs: GCR_PE_ADJ[2:0]=3h7 (pre-emphasis current all open )
3392                 MHal_PNL_MOD_Control_Out_PE_Current (pInstance, 0x07);
3393                 //5. Enable low-power modeinternal termination Open, Enable OP
3394                 MHal_PNL_MOD_Control_Out_TTL_Resistor_OP (pInstance, 1);
3395 
3396                 MsOS_DelayTask(1);
3397 
3398                 //6. Enable low-power modeinternal termination Open, Enable OP
3399                 MHal_Output_LVDS_Pair_Setting(pInstance,
3400                                               pPNLResourcePrivate->sthalPNL._u8MOD_LVDS_Pair_Type,
3401                                               pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputCFG0_7,
3402                                               pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputCFG8_15,
3403                                               pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputCFG16_21);
3404                 MHal_Shift_LVDS_Pair(pInstance, pPNLResourcePrivate->sthalPNL._u8MOD_LVDS_Pair_Shift);
3405 
3406                 //7. set Desired Pairs: GCR_PE_ADJ[2:0]=3¡¦h0 (pre-emphasis current all Close)
3407                 MHal_PNL_MOD_Control_Out_PE_Current (pInstance, 0x00);
3408                 //8. set Desired Pairs: GCR_ICON[5:0]    (current all init);
3409                 MHal_PNL_MOD_Control_Out_Swing(pInstance, MHal_PNL_MODSwingRegToRealLevelValue(pInstance, u16ValidSwing2));
3410                 //9. Disable low-power modeinternal termination Close, Disable OP
3411                 MHal_PNL_MOD_Control_Out_TTL_Resistor_OP (pInstance, 0);
3412 
3413                 // other TTL setting
3414                 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_6B_L, 0x03F0,0x0FF0);// LVDS output enable, [5:4] Output enable: PANEL_LVDS/ PANEL_miniLVDS/ PANEL_RSDS
3415                 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_74_L, 0x0000,0xFF00);
3416 
3417                 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_66_L, 0x0000, 0xF000);
3418                 MOD_A_W2BYTE(REG_MOD_A_BK00_67_L, 0x0000);
3419 
3420                 //MOD_W2BYTEMSK(REG_MOD_BK00_7E_L, 0x0000, 0x000F); //remove in Manhattan
3421 
3422                 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_74_L, 0x0000, (BIT(3)|BIT(2)));       // TTL skew: G
3423                 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_74_L, 0x0000, (BIT(5)|BIT(4)));       // TTL skew: B
3424 
3425                 break;
3426         }
3427     }
3428 
3429 //    MHal_PNL_Bringup(pInstance);
3430 }
3431 
Mhal_PNL_Flock_LPLLSet(void * pInstance,MS_U64 ldHz)3432 void Mhal_PNL_Flock_LPLLSet(void *pInstance, MS_U64 ldHz)
3433 {
3434     UNUSED(ldHz);
3435 }
3436 
MHal_PNL_MISC_Control(void * pInstance,MS_U32 u32PNL_MISC)3437 void MHal_PNL_MISC_Control(void *pInstance, MS_U32 u32PNL_MISC)
3438 {
3439     UNUSED(u32PNL_MISC);
3440 }
3441 
MHal_PNL_Init_XC_Clk(void * pInstance,PNL_InitData * pstPanelInitData)3442 void MHal_PNL_Init_XC_Clk(void *pInstance, PNL_InitData *pstPanelInitData)
3443 {
3444     PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
3445     PNL_RESOURCE_PRIVATE* pPNLResourcePrivate = NULL;
3446     UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
3447     UtopiaResourceGetPrivate(g_pPNLResource[PNL_GET_INTERNAL_POOL_ID(pPNLInstancePrivate->u32DeviceID)],(void**)(&pPNLResourcePrivate));
3448 
3449     PNL_DBG(PNL_DBGLEVEL_INIT, "[%s][%d]\n", __FUNCTION__, __LINE__);
3450 
3451     //load clk table: CLKGEN0SettingTBL / CLKGEN2SettingTBL
3452     E_PNL_SUPPORTED_CLK_TYPE eCLKType= _MHal_Transfer_PanelType_To_CLKType(pstPanelInitData->eLPLL_Type, pstPanelInitData->eLPLL_Mode);
3453     _MHal_PNL_DumpVideoClkTable(eCLKType);
3454 
3455     if((pPNLResourcePrivate->stapiPNL._bSkipTimingChange == FALSE))
3456     {
3457         //load clk table: CLKGEN0SettingTBL / CLKGEN2SettingTBL
3458         E_PNL_SUPPORTED_CLK_TYPE eCLKType= _MHal_Transfer_PanelType_To_CLKType_OSD(0, pstPanelInitData->eLPLL_Type, pstPanelInitData->eLPLL_Mode);
3459         _MHal_PNL_DumpOSDClkTable(eCLKType);
3460     }
3461 
3462 
3463     //set XC CLK
3464     if( ( E_PNL_LPLL_VBY1_10BIT_16LANE == pstPanelInitData->eLPLL_Type)||
3465         ( E_PNL_LPLL_VBY1_8BIT_16LANE == pstPanelInitData->eLPLL_Type ) )
3466     {
3467         //16 lane
3468         // CLK GEN0
3469         W2BYTEMSK(L_CLKGEN0(0x53), DISABLE, CKG_ODCLK_GATED);                          // [0] disable clock
3470         W2BYTEMSK(L_CLKGEN0(0x53), DISABLE, CKG_ODCLK_INVERT);                         // [1] invert clock
3471         W2BYTEMSK(L_CLKGEN0(0x53), CKG_ODCLK_SEL_LPLL, CKG_ODCLK_SEL_SOURCE);          // [2] select source tobe LPLL clock,
3472                                                                                        // 0:synthetic clock out, 1:LPLL clock out
3473         W2BYTEMSK(L_CLKGEN0(0x53), CKG_ODCLK_XTAL, CKG_ODCLK_MASK);                    // [4..3] LPLL clock div
3474 
3475         // CLK GEN2
3476         // CLK_ODCLK_2P clock setting
3477         // [0]:disable clock [1]:invert clock
3478         // [2]: select clock source, 0:synthetic clock out, 1:LPLL clock out
3479         // [3]: select clock source, 0:LPLL output clock, 1:LPLL output clk divN
3480         W2BYTEMSK(REG_RVD_43_L, 0x0C00, 0x1F00);
3481         W2BYTEMSK(REG_RVD_46_L, 0x0000, 0x1F1F);  //odclk_freq div n/m, [4:0]reg_ckg_odclk_div_nm_m, [12:8]reg_ckg_odclk_div_nm_n,
3482         //set LPLL mux
3483 
3484         W2BYTEMSK(L_CLKGEN0(0x7E), 0x0030, 0x00F0);           //LPLL_ODCLK setting  reg_ckg_odclk = reg_clkgen0_reserved0[7:2]
3485                                                               //[0] : diable clock
3486                                                               //[1] : invert clock
3487                                                               //[4:2] : xx0 : floclk_odclk_synth_out
3488                                                               // 011 / 111: LPLL output clock
3489         if (MDrv_XC_IsSupportPipPatchUsingSc1MainAsSc0Sub())
3490         {
3491             W2BYTEMSK(REG_RVD_63_L, 0x04, 0x0C);//sub oclck flow main odclk
3492         }
3493     }
3494     else if( ( E_PNL_LPLL_VBY1_10BIT_8LANE == pstPanelInitData->eLPLL_Type)||
3495              ( E_PNL_LPLL_VBY1_8BIT_8LANE == pstPanelInitData->eLPLL_Type ) )
3496     {
3497         // 8 lane
3498         // CLK GEN0
3499         W2BYTEMSK(L_CLKGEN0(0x53), DISABLE, CKG_ODCLK_GATED);                          // [0] disable clock
3500         W2BYTEMSK(L_CLKGEN0(0x53), DISABLE, CKG_ODCLK_INVERT);                         // [1] invert clock
3501         W2BYTEMSK(L_CLKGEN0(0x53), CKG_ODCLK_SEL_LPLL, CKG_ODCLK_SEL_SOURCE);          // [2] select source tobe LPLL clock,
3502                                                                                        // 0:synthetic clock out, 1:LPLL clock out
3503         W2BYTEMSK(L_CLKGEN0(0x53), CKG_ODCLK_XTAL, CKG_ODCLK_MASK);               // [4..3] LPLL clock div
3504 
3505         // CLK GEN2
3506         // CLK_ODCLK_2P clock setting
3507         // [0]:disable clock [1]:invert clock
3508         // [2]: select clock source, 0:synthetic clock out, 1:LPLL clock out
3509         // [3]: select clock source, 0:LPLL output clock, 1:LPLL output clk divN
3510         W2BYTEMSK(REG_RVD_43_L, 0x0400, 0x1F00);
3511         W2BYTEMSK(REG_RVD_46_L, 0x0000, 0x1F1F);  //odclk_freq div n/m, [4:0]reg_ckg_odclk_div_nm_m, [12:8]reg_ckg_odclk_div_nm_n,
3512 
3513         //set LPLL mux
3514 
3515         W2BYTEMSK(L_CLKGEN0(0x7E), 0x0010, 0x00F0);           //LPLL_ODCLK setting  reg_ckg_odclk = reg_clkgen0_reserved0[7:2]
3516                                                               //[0] : diable clock
3517                                                               //[1] : invert clock
3518                                                               //[4:2] : xx0 : floclk_odclk_synth_out
3519                                                               //001 : LPLL output clock div2
3520         if (MDrv_XC_IsSupportPipPatchUsingSc1MainAsSc0Sub())
3521         {
3522             W2BYTEMSK(REG_RVD_63_L, 0x0C, 0x0C);//sub oclck flow main odclk
3523         }
3524 
3525     }
3526     else
3527     {
3528         // 4 lane or LVDS
3529         // CLK GEN0
3530         W2BYTEMSK(L_CLKGEN0(0x53), DISABLE, CKG_ODCLK_GATED);                          // [0] disable clock
3531         W2BYTEMSK(L_CLKGEN0(0x53), DISABLE, CKG_ODCLK_INVERT);                         // [1] invert clock
3532         W2BYTEMSK(L_CLKGEN0(0x53), CKG_ODCLK_SEL_LPLL, CKG_ODCLK_SEL_SOURCE);          // [2] select source tobe LPLL clock,
3533                                                                                        // 0:synthetic clock out, 1:LPLL clock out
3534         W2BYTEMSK(L_CLKGEN0(0x53), CKG_ODCLK_XTAL, CKG_ODCLK_MASK);               // [4..3] LPLL clock div
3535 
3536         // CLK GEN2
3537         // CLK_ODCLK_2P clock setting
3538         // [0]:disable clock [1]:invert clock
3539         // [2]: select clock source, 0:synthetic clock out, 1:LPLL clock out
3540         // [3]: select clock source, 0:LPLL output clock, 1:LPLL output clk divN
3541         if( ( E_PNL_TYPE_TTL == pstPanelInitData->eLPLL_Type)||
3542             ((E_PNL_TYPE_LVDS == pstPanelInitData->eLPLL_Type)&&(E_PNL_MODE_SINGLE==pstPanelInitData->eLPLL_Mode))||
3543             ((E_PNL_TYPE_HS_LVDS == pstPanelInitData->eLPLL_Type)&&(E_PNL_MODE_SINGLE==pstPanelInitData->eLPLL_Mode)) ||
3544             ((E_PNL_LPLL_VBY1_8BIT_1LANE == pstPanelInitData->eLPLL_Type) || (E_PNL_LPLL_VBY1_10BIT_1LANE == pstPanelInitData->eLPLL_Type)))
3545         {
3546             W2BYTEMSK(REG_RVD_43_L, 0x0C00, 0x1F00);  //[12:8]reg_ckg_odclk_2p, [11]Select clock source, 1: LPLL output clock divN  (control by reg_ckg_odclk_div_nm)
3547                                                       //[4:0]reg_ckg_clk_misc,
3548             W2BYTEMSK(REG_RVD_46_L, 0x0201, 0x1F1F);  //odclk_freq div n/m, [4:0]reg_ckg_odclk_div_nm_m, [12:8]reg_ckg_odclk_div_nm_n,
3549 
3550             if (MDrv_XC_IsSupportPipPatchUsingSc1MainAsSc0Sub())
3551             {
3552                 W2BYTEMSK(REG_RVD_63_L, 0x04, 0x0C); //sub oclck flow main odclk
3553             }
3554         }
3555         else
3556         {
3557             W2BYTEMSK(REG_RVD_43_L, 0x0400, 0x1F00);
3558 
3559             W2BYTEMSK(REG_RVD_46_L, 0x0000, 0x1F1F);  //odclk_freq div n/m, [4:0]reg_ckg_odclk_div_nm_m, [12:8]reg_ckg_odclk_div_nm_n,
3560 
3561             if (MDrv_XC_IsSupportPipPatchUsingSc1MainAsSc0Sub())
3562             {
3563                 W2BYTEMSK(REG_RVD_63_L, 0x0C, 0x0C); //sub oclck flow main odclk
3564             }
3565         }
3566 
3567         //set LPLL mux
3568         if( ( (E_PNL_TYPE_LVDS == pstPanelInitData->eLPLL_Type)&&(E_PNL_MODE_DUAL==pstPanelInitData->eLPLL_Mode))||
3569              ( (E_PNL_TYPE_HS_LVDS == pstPanelInitData->eLPLL_Type)&&(E_PNL_MODE_DUAL==pstPanelInitData->eLPLL_Mode))||
3570              ( E_PNL_LPLL_VBY1_10BIT_2LANE == pstPanelInitData->eLPLL_Type)||
3571              ( E_PNL_LPLL_VBY1_8BIT_2LANE == pstPanelInitData->eLPLL_Type)||
3572              ( E_PNL_LPLL_VBY1_10BIT_4LANE == pstPanelInitData->eLPLL_Type)||
3573              ( E_PNL_LPLL_VBY1_8BIT_4LANE == pstPanelInitData->eLPLL_Type)||
3574              ( E_PNL_LPLL_EPI24_12P == pstPanelInitData->eLPLL_Type)||
3575              ( E_PNL_LPLL_EPI28_12P == pstPanelInitData->eLPLL_Type)||
3576              ( E_PNL_LPLL_USI_T_8BIT_12P == pstPanelInitData->eLPLL_Type)||
3577              ( E_PNL_LPLL_USI_T_10BIT_12P == pstPanelInitData->eLPLL_Type)||
3578              ( E_PNL_LPLL_ISP_8BIT_12P == pstPanelInitData->eLPLL_Type)||
3579              ( (E_PNL_LPLL_ISP_8BIT_6P_D == pstPanelInitData->eLPLL_Type)&&(E_PNL_MODE_DUAL==pstPanelInitData->eLPLL_Mode)))
3580         {
3581              W2BYTEMSK(L_CLKGEN0(0x7E), 0x0010, 0x00F0);      //LPLL_ODCLK setting  reg_ckg_odclk = reg_clkgen0_reserved0[7:2]
3582                                                               //[0] : diable clock
3583                                                               //[1] : invert clock
3584                                                               //[4:2] : xx0 : floclk_odclk_synth_out
3585                                                               //001 : LPLL output clock div2
3586         }
3587         else if( ( E_PNL_TYPE_TTL == pstPanelInitData->eLPLL_Type)||
3588              ((E_PNL_TYPE_LVDS == pstPanelInitData->eLPLL_Type)&&(E_PNL_MODE_SINGLE==pstPanelInitData->eLPLL_Mode))||
3589              ((E_PNL_TYPE_HS_LVDS == pstPanelInitData->eLPLL_Type)&&(E_PNL_MODE_SINGLE==pstPanelInitData->eLPLL_Mode)))
3590         {
3591              W2BYTEMSK(L_CLKGEN0(0x7E), 0x0050, 0x00F0);      //LPLL_ODCLK setting  reg_ckg_odclk = reg_clkgen0_reserved0[7:2]
3592                                                               //[0] : diable clock
3593                                                               //[1] : invert clock
3594                                                               //[4:2] : xx0 : floclk_odclk_synth_out
3595                                                               // 101 : LPLL output clock div4
3596         }
3597 
3598     }
3599 
3600     if(  IsVBY1(pstPanelInitData->eLPLL_Type_Ext) )
3601     {
3602         // [0]reg_vx1gpi_mode, refer to tmux table : pad_list:  reg_vx1gpi_mode
3603         W2BYTEMSK(REG_CHIP_25_L, 0x0001, 0x0001);
3604     }
3605 
3606     if(  IsVBY1(pstPanelInitData->eLPLL_Type_Ext) )
3607     {
3608         W2BYTEMSK(L_BK_TCON(0x00), 0x0000, 0xFFFF);
3609         W2BYTEMSK(L_BK_TCON(0x69), 0x0400, 0x0400);
3610     }
3611 
3612     // reg_ckg_odclk_2p invert
3613     // SW patch for Maserati only
3614     // For sub video flicker issue, need to invert clk by default
3615     W2BYTEMSK(REG_RVD_43_L, 0x0200, 0x0200); //FIXME:patch for PIP
3616 
3617 #if 0
3618     // setup output dot clock
3619 
3620     W2BYTEMSK(L_CLKGEN0(0x53), CKG_ODCLK_CLK_LPLL, CKG_ODCLK_MASK);      // select source tobe LPLL clock
3621     W2BYTEMSK(L_CLKGEN0(0x53), DISABLE, CKG_ODCLK_INVERT);               // clock not invert
3622     W2BYTEMSK(L_CLKGEN0(0x53), DISABLE, CKG_ODCLK_GATED);                // enable clock
3623     W2BYTEMSK(L_CLKGEN0(0x53), 0xC0, 0xF0);      //  reg_ckg_odclk_mft
3624 
3625     W2BYTE(L_CLKGEN0(0x58),0x0000); //[3:0]ckg_tx_mod
3626     W2BYTE(L_CLKGEN1(0x31), 0x0000); //[11:8]ckg_odclk_frc
3627 
3628 
3629 
3630     if(  IsVBY1(pstPanelInitData->eLPLL_Type) )
3631     {
3632 
3633         W2BYTE(REG_CLKGEN0_57_L,0x0008); //[3:0]ckg_fifo
3634         W2BYTE(L_CLKGEN0(0x63), 0x0410);   //[11:8]ckg_tx_mod_osd[4:0]osd2mod
3635         W2BYTE(REG_RVD_09_L, 0x1800); //[12:8]ckg_vby1_fifo_osd [3:0]clk_vby1_fifo
3636         W2BYTEMSK(L_CLKGEN0(0x55), 0x00, 0xF00); //[11:8] reg_ckg_osdc
3637     }
3638     else
3639     {
3640 
3641         W2BYTE(REG_CLKGEN0_57_L,0x0000); //[3:0]ckg_fifo
3642         if((pstPanelInitData->eLPLL_Type == E_PNL_TYPE_HS_LVDS)&&(pstPanelInitData->eLPLL_Mode == E_PNL_MODE_SINGLE))
3643         {
3644             W2BYTE(L_CLKGEN0(0x63), 0x0410);   //[11:8]ckg_tx_mod_osd[4:0]osd2mod
3645             W2BYTE(REG_RVD_09_L, 0x1000); //[12:8]ckg_vby1_fifo_osd [3:0]clk_vby1_fifo+
3646         }
3647         else
3648         {
3649             W2BYTE(L_CLKGEN0(0x63),0x0000); //[11:8]ckg_tx_mod [3:0]ckg_osd2mod
3650             W2BYTE(REG_RVD_09_L, 0x0000); //[12:8]ckg_vby1_fifo_osd [3:0]clk_vby1_fifo
3651         }
3652     }
3653 #endif
3654 }
3655 
MHal_PNL_Init_MOD(void * pInstance,PNL_InitData * pstPanelInitData)3656 void MHal_PNL_Init_MOD(void *pInstance, PNL_InitData *pstPanelInitData)
3657 {
3658     PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
3659     PNL_RESOURCE_PRIVATE* pPNLResourcePrivate = NULL;
3660     UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
3661     UtopiaResourceGetPrivate(g_pPNLResource[PNL_GET_INTERNAL_POOL_ID(pPNLInstancePrivate->u32DeviceID)],(void**)(&pPNLResourcePrivate));
3662 
3663     PNL_DBG(PNL_DBGLEVEL_INIT, "[%s][%d]\n", __FUNCTION__, __LINE__);
3664 
3665     //------------------------------------------------------------------------
3666 
3667     PNL_DBG(PNL_DBGLEVEL_INIT, "u16MOD_CTRL0 = %x\n", pstPanelInitData->u16MOD_CTRL0);
3668     PNL_DBG(PNL_DBGLEVEL_INIT, "u16MOD_CTRL9 = %x\n", pstPanelInitData->u16MOD_CTRL9);
3669     PNL_DBG(PNL_DBGLEVEL_INIT, "u16MOD_CTRLA = %x\n", pstPanelInitData->u16MOD_CTRLA);
3670     PNL_DBG(PNL_DBGLEVEL_INIT, "u8MOD_CTRLB  = %x\n", pstPanelInitData->u8MOD_CTRLB);
3671 
3672     //-------------------------------------------------------------------------
3673     // Set MOD registers
3674     //-------------------------------------------------------------------------
3675 
3676     //reg_rsclk_testmd
3677     MOD_W2BYTEMSK(REG_MOD_BK00_05_L, ( pstPanelInitData->u16MOD_CTRL0 & (BIT(1)) )<<14, (BIT(15)) );
3678     //reg_lvds_ti:LVDS JEIDA/VESA mode select;l         0: JEIDAl         1: VESA
3679     MOD_W2BYTEMSK(REG_MOD_BK00_05_L, ( pstPanelInitData->u16MOD_CTRL0 & (BIT(2)) )<<12, (BIT(14)) );
3680     //reg_pdp_10bit:pdp_10bit
3681     MOD_W2BYTEMSK(REG_MOD_BK00_05_L, ( pstPanelInitData->u16MOD_CTRL0 & (BIT(3)) )<<10, (BIT(13)) );
3682     //reg_lvds_plasma:
3683     MOD_W2BYTEMSK(REG_MOD_BK00_05_L, ( pstPanelInitData->u16MOD_CTRL0 & (BIT(4)) )<<8 , (BIT(12)) );
3684     //reg_ch_polarity:polarity swap
3685     MOD_W2BYTEMSK(REG_MOD_BK00_05_L, ( pstPanelInitData->u16MOD_CTRL0 & (BIT(5)) )<<6 , (BIT(11)) );
3686     //reg_osd_on_de_a: PDP osd de on DE channel A
3687     MOD_W2BYTEMSK(REG_MOD_BK00_51_L, ( pstPanelInitData->u16MOD_CTRL0 & (BIT(7)) )>>5, (BIT(2)) ); //reg_rsclk_testmd
3688 
3689     //    GPIO is controlled in drvPadConf.c
3690     //    MDrv_Write2Byte(L_BK_MOD(0x46), 0x0000);    //EXT GPO disable
3691     //    MDrv_Write2Byte(L_BK_MOD(0x47), 0x0000);    //EXT GPO disable
3692 
3693     //new setting from Masrati scripts
3694     MOD_W2BYTEMSK(REG_MOD_BK00_3C_L, 0x0000, 0xFFFF);
3695 
3696     //MFT setting
3697     _MHal_PNL_Init_MFT(pInstance,pstPanelInitData);
3698 
3699     if(  IsVBY1(pstPanelInitData->eLPLL_Type_Ext) )
3700     {
3701         //new setting from Masrati scripts
3702         //reg_data_format: data format of digital serializer
3703         //0: LVDS 2: mini-LVDS 3: EPI-8bit 4: EPI-10bit(case2) 5: Vby1 7: EPI-10bit(case1) 8: CMPI-10bit 9: CMPI-8bit 10: USI-T 11: ISP
3704         MOD_W2BYTEMSK(REG_MOD_BK00_30_L, 0x5000, 0xF000);
3705 
3706         //new setting from Masrati scripts
3707         //switch channel, i.e 16 lane / 8 lane / 4 lane
3708         _Hal_MOD_VB1_CH_SWICH(pstPanelInitData->eLPLL_Type_Ext);
3709 
3710         //new setting from Masrati scripts
3711         // arrange MFT 4p output order
3712         if( (pstPanelInitData->eLPLL_Type_Ext == E_PNL_LPLL_VBY1_10BIT_1LANE)||(pstPanelInitData->eLPLL_Type_Ext == E_PNL_LPLL_VBY1_8BIT_1LANE) )
3713         {
3714             MOD_W2BYTEMSK(REG_MOD_BK00_0F_L, 0xF800, 0xFF00 ); //reg_rsclk_testmd
3715         }
3716         else
3717         {
3718             MOD_W2BYTEMSK(REG_MOD_BK00_0F_L, 0xD800, 0xFF00 ); //reg_rsclk_testmd
3719         }
3720 
3721         // sc4 62 [15]reg_vby1_proc_st: vby1 packer  process start
3722         // sc4 62 [13..12]reg_vby1_byte_mode: vby1 packer byte mode;l 0x : 5 bytel  10: 4 bytel  11: 3 byte
3723         MOD_W2BYTEMSK(REG_MOD_BK00_62_L, ( BIT(15)|BIT(13) ), 0xFFFF);
3724 
3725         // sc4 62 [5..4]reg_vby1_pair_mirror: mirror vby1 pairs
3726         MOD_W2BYTEMSK(REG_MOD_BK00_62_L, (pstPanelInitData->u16MOD_CTRL9 & (BIT(12)|BIT(11)))>>7, BIT(5)|BIT(4));
3727 
3728         // sc4 62 [14]reg_vby1_8ch: vby1 8ch mode
3729         if( (pstPanelInitData->eLPLL_Type_Ext == E_PNL_LPLL_VBY1_10BIT_16LANE)||(pstPanelInitData->eLPLL_Type_Ext == E_PNL_LPLL_VBY1_8BIT_16LANE) )
3730         {
3731             MOD_W2BYTEMSK(REG_MOD_BK00_62_L, BIT(14), BIT(14));
3732         }
3733         else
3734         {
3735             MOD_W2BYTEMSK(REG_MOD_BK00_62_L, 0x0000, BIT(14));
3736         }
3737 
3738         // sc4 00[9]: reg_quadmode, LVDS dual channel;  0: dual channel  1: quad channel
3739         if( (pstPanelInitData->eLPLL_Type_Ext == E_PNL_LPLL_VBY1_10BIT_16LANE)||(pstPanelInitData->eLPLL_Type_Ext == E_PNL_LPLL_VBY1_8BIT_16LANE)||
3740             (pstPanelInitData->eLPLL_Type_Ext == E_PNL_LPLL_VBY1_10BIT_8LANE)||(pstPanelInitData->eLPLL_Type_Ext == E_PNL_LPLL_VBY1_8BIT_8LANE))
3741         {
3742             MOD_W2BYTEMSK(REG_MOD_BK00_00_L, BIT(9), BIT(9));
3743             MOD_W2BYTEMSK(REG_MOD_BK00_00_L, BIT(0), BIT(0));
3744         }
3745         else
3746         {
3747             MOD_W2BYTEMSK(REG_MOD_BK00_00_L, 0x0000, BIT(9));
3748             MOD_W2BYTEMSK(REG_MOD_BK00_00_L, BIT(0), BIT(0));
3749         }
3750 
3751 
3752         if(pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16MOD_CTRLA & BIT(1))  // use Dual port to decide the Vx1 1 or 2 devision config
3753         {
3754             printf("\n[%s][%d]Vx1 2 division\n", __FUNCTION__, __LINE__);
3755             if(pstPanelInitData->eLPLL_Type_Ext == E_PNL_LPLL_VBY1_10BIT_8LANE)
3756             {
3757 
3758                 //Manhattan: MOD_W2BYTEMSK(REG_MOD_BK00_21_L, 0x1002, 0xFFFF); //[11:0]reg_dly_value
3759                 //Maserati : do not to set reg_dly_value
3760                 // mark for Maserati subbank
3761                 //MOD_W2BYTEMSK(REG_MOD_BK00_7F_L, BIT(0), (BIT(1)|BIT(0))); // reg.7f[1:0]=reg_vfde_dly_mux
3762 
3763                 //Manhattan: MOD_W2BYTEMSK(REG_MOD_BK00_7F_L, 0x0002, 0xFFFF); //[2:0]reg_sram_usage
3764                 //Maserati : MFT have sram, so we do not set any setting.
3765 
3766                 MOD_W2BYTEMSK(REG_MOD_BK00_54_L, 0x0000, BIT(12)); //[12]reg_vbi_en:vbi information on lvds enable
3767                 MOD_W2BYTEMSK(REG_MOD_BK00_54_L, BIT(13), BIT(13)); //[13]reg_vfde_mask:mask vfde AND de
3768             }
3769         }
3770         else
3771         {
3772             printf("\n[%s][%d]Vx1 1 division\n", __FUNCTION__, __LINE__);
3773 
3774             MOD_W2BYTEMSK(REG_MOD_BK00_54_L, 0x0000, BIT(12)); //[12]reg_vbi_en:vbi information on lvds enable
3775             MOD_W2BYTEMSK(REG_MOD_BK00_54_L, 0x0000, BIT(13)); //[13]reg_vfde_mask:mask vfde AND de
3776 
3777         }
3778 
3779         if((pstPanelInitData->eLPLL_Type_Ext == E_PNL_LPLL_VBY1_10BIT_16LANE)||(pstPanelInitData->eLPLL_Type_Ext == E_PNL_LPLL_VBY1_8BIT_16LANE))
3780         {
3781             MOD_W2BYTEMSK(REG_MOD_BK00_62_L, BIT(14), BIT(14)); // [14] enable 8ch vx1 mode
3782         }
3783         else if((pstPanelInitData->eLPLL_Type_Ext == E_PNL_LPLL_VBY1_10BIT_8LANE)||(pstPanelInitData->eLPLL_Type_Ext == E_PNL_LPLL_VBY1_8BIT_8LANE))
3784         {
3785             MOD_W2BYTEMSK(REG_MOD_BK00_62_L, 0x0000, BIT(14)); // [14] enable 8ch vx1 mode
3786 
3787             if(pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16MOD_CTRLA & BIT(1))
3788             {
3789                 // 2 Divisoin
3790 
3791                 //be deleted in Maserati
3792                 //MOD_W2BYTEMSK(REG_MOD_BK00_63_L, BIT(11), BIT(11)); // [11:10]reg_vby1_pair_mirror2
3793             }
3794             else
3795             {
3796                 // 1 Division
3797 
3798                 //be deleted in Maserati
3799                 //MOD_W2BYTEMSK(REG_MOD_BK00_63_L, 0x00, BIT(11)); // [11:10]reg_vby1_pair_mirror2
3800             }
3801         }
3802         else //if   ///E_PNL_LPLL_VBY1_10BIT_4LANE, E_PNL_LPLL_VBY1_10BIT_2LANE
3803         {
3804             MOD_W2BYTEMSK(REG_MOD_BK00_62_L, 0x00, BIT(14)); // [14] enable 8ch vx1 mode
3805         }
3806 
3807         MHal_Output_Channel_Order(pInstance,
3808                                   pPNLResourcePrivate->stdrvPNL._stPnlInitData.u8OutputOrderType,
3809                                   pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder0_3,
3810                                   pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder4_7,
3811                                   pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder8_11,
3812                                   pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder12_13);
3813 
3814         ////per RD's suggestion ---Start
3815         MOD_A_W2BYTEMSK(REG_MOD_A_BK00_04_L, 0xFFFF, 0xFFFF);   //reg_gcr_pe_en_ch: Differential output pre-emphasis enable
3816         MOD_A_W2BYTEMSK(REG_MOD_A_BK00_06_L, 0x0000, 0xFFFF);   //reg_gcr_en_rint_ch: enable double termination function
3817         MOD_A_W2BYTEMSK(REG_MOD_A_BK00_08_L, 0xFFFF, 0xFFFF);   //vby1 channel enable: vby1 channel enable
3818 
3819         /// reg_gcr_pe_adj ch0~ch13: Differential output data/clock pre-emphasis level adjust of channel X
3820         MOD_A_W2BYTE(REG_MOD_A_BK00_22_L,0x2222);
3821         MOD_A_W2BYTE(REG_MOD_A_BK00_23_L,0x2222);
3822         MOD_A_W2BYTE(REG_MOD_A_BK00_24_L,0x2222);
3823         MOD_A_W2BYTE(REG_MOD_A_BK00_25_L,0x2222);
3824 
3825         // [15] reg_vby1_hw_lock : set Vby1 lock sequence by HW mode
3826         // [13] reg_vby1_ext_fsm_en : config each vby1 set use same FSM state (split video/osd path)
3827         // [12] reg_vby1_proc_auto_fix : vby1 hw auto gen proc_st trig
3828         // [10] reg_vby1_ext_ptr_en : configure each vby1 fifo used same read/write pointer
3829         MOD_W2BYTEMSK(REG_MOD_BK00_63_L, (BIT(15)|BIT(13)|BIT(12)|BIT(10)), 0xFF00);
3830 
3831         //disparity setting: for 8bits/10bits encode hw error
3832         MOD_W2BYTEMSK(REG_MOD_BK00_3A_L, BIT(7), BIT(7));
3833 
3834         //The threshold value be set too strict ( ori: MOD_77/79 =0x0 )
3835         //And this reg should be set before enable serializer function
3836         //[15]reg_sw_rptr_fix_en: pointer fix by sw mode enable
3837         //[14:12]reg_sw_wptr_check: sw mode to decision write point check point
3838         //[10:8]reg_sw_rptr_fix_ini: sw mode to decision read point initial value
3839         //[6:4]reg_sw_rptr_fix_hi_th: sw mode to decision read pointer hi boundary
3840         //[2:0]reg_sw_rptr_fix_lo_th: sw mode to decision read pointer low boundary
3841         MOD_W2BYTEMSK(REG_MOD_BK00_79_L,0x8142,0xFFFF);
3842         MOD_W2BYTEMSK(REG_MOD_BK00_77_L,0x8142,0xFFFF);
3843 
3844         //[13]reg_seri_auto_fix_osd : enable osd serializer auto fix read/write point mis-balance
3845         //[14]reg_seri_osd_mod:for OSD, switch chanel 8~13 as OSD path
3846         //[15]reg_dbg_status_switch:switch debug information(reg_dbg_status_sel/reg_dbg_status) between Video/OSD path     0: Video       1: OSD
3847         MOD_W2BYTEMSK(REG_MOD_BK00_76_L, (BIT(14)|BIT(13)) , (BIT(15)|BIT(14)|BIT(13)) );
3848 
3849         //[0]reg_seri_enable:enable serializer function
3850         //[1]reg_seri_auto_fix:enable serializer auto fix read/write point mis-balance
3851         //[2]reg_fix_cnt_clr
3852         //[3]reg_dbg_status_sel:select debug status, read status from reg_dbg_status[15:0] 0: auto fix cnt         1: point diff value
3853         //[15..8]reg_tester_pix_ext: test pixel extension for 16bit serializer
3854         MOD_W2BYTEMSK(REG_MOD_BK00_78_L, 0x0003 , 0xFF0F);
3855     }
3856     else
3857     {
3858         if(pstPanelInitData->eLPLL_Type == E_PNL_TYPE_LVDS)
3859         {
3860             //new setting from Masrati scripts
3861             //reg_data_format: data format of digital serializer
3862             //0: LVDS 2: mini-LVDS 3: EPI-8bit 4: EPI-10bit(case2) 5: Vby1 7: EPI-10bit(case1) 8: CMPI-10bit 9: CMPI-8bit 10: USI-T 11: ISP
3863             MOD_W2BYTEMSK(REG_MOD_BK00_30_L, 0x0000, 0xF000);
3864 
3865             //new setting from Masrati scripts
3866             // arrange MFT 4p output order (LVDS)
3867             if(pstPanelInitData->eLPLL_Mode == E_PNL_MODE_SINGLE)
3868             {
3869                 MOD_W2BYTEMSK(REG_MOD_BK00_0F_L, 0xE400, 0xFF00 ); //reg_rsclk_testmd
3870             }
3871             else
3872             {
3873                 MOD_W2BYTEMSK(REG_MOD_BK00_0F_L, 0xF800, 0xFF00 ); //reg_rsclk_testmd
3874             }
3875 
3876             MOD_A_W2BYTEMSK(REG_MOD_A_BK00_08_L, 0x0000, 0xFFFF);   //vby1 channel enable: vby1 channel enable
3877 
3878             // sc4 00[9]: reg_quadmode, LVDS dual channel;  0: dual channel  1: quad channel
3879             MOD_W2BYTEMSK(REG_MOD_BK00_00_L, 0x0000, BIT(9));
3880             MOD_W2BYTEMSK(REG_MOD_BK00_00_L, BIT(0), BIT(0));
3881         }
3882 
3883         // [7,6] : output formate selction 10: 8bit, 01: 6bit :other 10bit, bit shift
3884         MOD_W2BYTEMSK(REG_MOD_BK00_00_L, (pstPanelInitData->u16MOD_CTRL9 & (BIT(7)|BIT(6)))<<8 , (BIT(15)|BIT(14)));
3885         MOD_W2BYTEMSK(REG_MOD_BK00_00_L, (pstPanelInitData->u16MOD_CTRL9 & BIT(8) )<<5 , BIT(13));
3886         MOD_W2BYTEMSK(REG_MOD_BK00_00_L, (pstPanelInitData->u16MOD_CTRL9 & BIT(9) )<<3 , BIT(12));
3887 
3888         MHal_Output_Channel_Order(pInstance,
3889                                   pPNLResourcePrivate->stdrvPNL._stPnlInitData.u8OutputOrderType,
3890                                   pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder0_3,
3891                                   pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder4_7,
3892                                   pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder8_11,
3893                                   pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder12_13);
3894     }
3895 
3896     // Manhattan ori :MOD_W2BYTE(REG_MOD_BK00_4A_L, pstPanelInitData->u16MOD_CTRLA);
3897     //MOD_W2BYTEMSK(REG_MOD_BK00_52_L, (pstPanelInitData->u16MOD_CTRLA & BIT(0))<<14, BIT(14)); //[15]:reg_abswitch_l [14]:reg_abswitch_r
3898     //MOD_W2BYTEMSK(REG_MOD_BK00_52_L, (pstPanelInitData->u16MOD_CTRLA & BIT(0))<<15, BIT(15)); //[15]:reg_abswitch_l [14]:reg_abswitch_r
3899     MOD_W2BYTEMSK(REG_MOD_BK00_05_L, (pstPanelInitData->u16MOD_CTRLA & BIT(4))>>3 , BIT(1));// PANEL_INV_DCLK
3900     MOD_W2BYTEMSK(REG_MOD_BK00_00_L, (pstPanelInitData->u16MOD_CTRLA & BIT(12))>>7, BIT(5));// PANEL_INV_HSYNC
3901     MOD_W2BYTEMSK(REG_MOD_BK00_00_L, (pstPanelInitData->u16MOD_CTRLA & BIT(3))<<3, BIT(6)); // PANEL_INV_VSYNC
3902     MOD_W2BYTEMSK(REG_MOD_BK00_00_L, (pstPanelInitData->u16MOD_CTRLA & BIT(2))<<5, BIT(7)); // PANEL_INV_DE
3903 
3904     MOD_W2BYTEMSK(REG_MOD_BK00_05_L, (pstPanelInitData->u8MOD_CTRLB & (BIT(0)|BIT(1)))<<2, (BIT(2)|BIT(3))); //for LVDS: [1:0]ti_bitmode / 10:8bit  11:6bit  0x:10bit
3905     MOD_W2BYTEMSK(REG_MOD_BK00_05_L, BIT(13), BIT(13)); // for LVDS: reg_pdp_10bit
3906 
3907     //dual port lvds _start_//
3908     // output configure for 26 pair output 00: TTL, 01: LVDS/RSDS/mini-LVDS data differential pair, 10: mini-LVDS clock output, 11: RSDS clock output
3909     _MHal_PNL_Set_Clk(pInstance,
3910                       pPNLResourcePrivate->stdrvPNL._stPnlInitData.u8OutputOrderType,
3911                       pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder0_3,
3912                       pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder4_7,
3913                       pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder8_11,
3914                       pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder12_13);
3915     //dual port lvds _end_//
3916 
3917     //MOD_A_W2BYTEMSK(REG_MOD_A_BK00_3A_L, (_u8PnlDiffSwingLevel << 1), 0xFE);       //differential output swing level
3918     MOD_A_W2BYTEMSK(REG_MOD_A_BK00_10_L, 0x0000 , 0x1F00);       //bank selection for skew clock
3919 
3920     //if(!MHal_PNL_MOD_Control_Out_Swing(_u8PnlDiffSwingLevel))
3921     //    printf(">>Swing Level setting error!!\n");
3922 
3923     //mark in Maserati
3924     //if(pstPanelInitData->eLPLL_Type != E_PNL_TYPE_MINILVDS)
3925     //{
3926     //    MOD_W2BYTEMSK(REG_MOD_A_BK00_78_L, 0x7, 0x07);
3927     //}
3928 
3929     //// Patch for Vx1 and it should be control by panel ini
3930     if(  IsVBY1(pstPanelInitData->eLPLL_Type_Ext) )
3931     {
3932         MOD_A_W2BYTEMSK(REG_MOD_A_BK00_02_L, 0xFFFF, 0xFFFF);
3933     }
3934     else
3935     {
3936         MOD_A_W2BYTE(REG_MOD_A_BK00_02_L, pstPanelInitData->u16LVDSTxSwapValue);
3937     }
3938 
3939 #ifdef CONFIG_MSTAR_SRAMPD
3940     // At initial step, if non TCON panel, enable OD/RGBW/M+/Demura/DGA_Gamma SRAM PD
3941     if((pstPanelInitData->eLPLL_Type_Ext != E_PNL_LPLL_EPI34_8P)&&
3942        (pstPanelInitData->eLPLL_Type_Ext != E_PNL_LPLL_EPI28_8P)&&
3943        (pstPanelInitData->eLPLL_Type_Ext != E_PNL_LPLL_EPI34_6P)&&
3944        (pstPanelInitData->eLPLL_Type_Ext != E_PNL_LPLL_EPI28_6P)&&
3945        (pstPanelInitData->eLPLL_Type_Ext != E_PNL_LPLL_EPI34_2P)&&
3946        (pstPanelInitData->eLPLL_Type_Ext != E_PNL_LPLL_EPI34_4P)&&
3947        (pstPanelInitData->eLPLL_Type_Ext != E_PNL_LPLL_EPI28_2P)&&
3948        (pstPanelInitData->eLPLL_Type_Ext != E_PNL_LPLL_EPI28_4P)&&
3949        (pstPanelInitData->eLPLL_Type_Ext != E_PNL_LPLL_EPI28_12P))
3950     {
3951         if(pPNLInstancePrivate->u32DeviceID == 0)
3952         {
3953             SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK3F_10_L, BIT(0), BIT(0));   //OD SRAM PD Enable  : SC_SPD_BK3F_10[0]
3954             SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK3F_50_L, 0, BIT(8));        //OD Clock gate : ~SC_SPD_BK3F_50[8]
3955             SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_6F_L, BIT(15), BIT(15)); //OD Bypass Enable :SC_OD_BK16_6F[15]
3956 
3957             SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK3F_10_L, BIT(1), BIT(1));   // RGBW SRAM PD Enable : SC_SPD_BK3F_10[1]
3958             SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK3F_50_L, 0, BIT(9));        // RGBW Clock Gate : ~SC_SPD_BK3F_50[9]
3959             SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_6F_L, BIT(12), BIT(12)); // RGBW bypass enable :SC_OD_BK16_6F[12]
3960             SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_6F_L, 0, BIT(13));       // RGBW bypass enable : ~SC_OD_BK16_6F[13]
3961 
3962             SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK3F_17_L, BIT(0), BIT(0));   //M+ SRAM PD Enable  : SC_SPD_BK3F_17[0]
3963             SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK3F_50_L, 0, BIT(10));        //M+ Clock gate : ~SC_SPD_BK3F_50[10]
3964             //SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_6F_L,0 , BIT(12)); // M+ bypass enable :SC_OD_BK16_6F[12]
3965             //SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_6F_L, 0, BIT(13));       // M+ bypass enable : ~SC_OD_BK16_6F[13]
3966 
3967             SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK3F_0B_L, BIT(4), BIT(4));   //Demura SRAM PD Enable  : SC_SPD_BK3F_0B[4]
3968             SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK77_26_L, BIT(14), BIT(14));   //Demura Clock Gate  : SC_BK77_26[14]
3969             W2BYTEMSK(REG_RVD_45_L, BIT(0), BIT(0));                                              //Demura Clock gate : BK100A_CLKGEN2_45[0]
3970             SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK77_26_L, BIT(15), BIT(15));   //Demura Clock Gate  : SC_BK77_26[15]
3971 
3972             SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK3F_0B_L, BIT(5), BIT(5));   //DGA_GAMMA SRAM PD Enable  : SC_SPD_BK3F_0B[5]
3973         }
3974     }
3975 
3976     // At initial step, SRAM PD for LD
3977     // To avoid mantis 1082875: boot logo flash issue, remove  SRAM PD for LD from XC_init to PNL_init
3978     // only used it in mboot, to avoid panel auto detect if panel type changed.
3979 #if defined (MSOS_TYPE_NOS)
3980     if(pPNLInstancePrivate->u32DeviceID == 0)
3981     {
3982         SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID,REG_SC_BKC9_65_L, (BIT(0)), 0x0001);
3983         SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID,REG_SC_BKCE_01_L, (0x0000), 0x1000);
3984         SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID,REG_SC_BKCE_37_L, (BIT(15)), 0x8000);
3985         //non-FO setting
3986         SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID,REG_SC_BK3F_12_L, (BIT(0)| BIT(1)), 0x0003);
3987         SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID,REG_SC_BK3F_50_L, (0x0000), 0x3800);
3988         SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID,REG_SC_BK2E_37_L, (BIT(15)), 0x8000);
3989     }
3990 #endif
3991 #endif
3992 
3993     // TODO: move from MDrv_Scaler_Init(), need to double check!
3994     //MOD_W2BYTEMSK(REG_MOD_BK00_53_L, BIT(0), BIT(0)); //can not find this register in Manhattan register table
3995 
3996 
3997     //--------------------------------------------------------------
3998     //Depend On Bitmode to set Dither
3999     //--------------------------------------------------------------
4000 
4001 
4002     // always enable noise dither and disable TAILCUT
4003     SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK24_3F_L, ((pstPanelInitData->u8PanelNoiseDith ? XC_PAFRC_DITH_NOISEDITH_EN : (1 - XC_PAFRC_DITH_NOISEDITH_EN)) <<3) , BIT(3));
4004     SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK24_3F_L, XC_PAFRC_DITH_TAILCUT_DISABLE, BIT(4));
4005 
4006     switch(pstPanelInitData->u8MOD_CTRLB & 0x03)//[1:0]ti_bitmode b'10:8bit  11:6bit  0x:10bit
4007     {
4008         case HAL_TI_6BIT_MODE:
4009             SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK24_3F_L, BIT(0), BIT(0));
4010             SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK24_3F_L, BIT(2), BIT(2));
4011             break;
4012 
4013         case HAL_TI_8BIT_MODE:
4014             SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK24_3F_L, BIT(0), BIT(0));
4015             SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK24_3F_L, 0x00, BIT(2));
4016             break;
4017 
4018         case HAL_TI_10BIT_MODE:
4019         default:
4020             SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK24_3F_L, 0x00, BIT(0));
4021             SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK24_3F_L, 0x00, BIT(2));
4022             break;
4023     }
4024 
4025 
4026     //-----depend on bitmode to set Dither------------------------------
4027     MHal_PNL_SetOutputType(pInstance, pPNLResourcePrivate->sthalPNL._eDrvPnlInitOptions, pstPanelInitData->eLPLL_Type);     // TTL to Ursa
4028     //MHal_PNL_Bringup(pInstance);
4029 
4030     MHal_PNL_MISC_Control(pInstance, pstPanelInitData->u32PNL_MISC);
4031 
4032     PNL_DBG(PNL_DBGLEVEL_INIT, "OutputType  = %x, eLPLL_Type = %x\n", pPNLResourcePrivate->sthalPNL._eDrvPnlInitOptions, pstPanelInitData->eLPLL_Type);
4033     PNL_DBG(PNL_DBGLEVEL_INIT, "u32PNL_MISC  = %tx\n", (ptrdiff_t)pstPanelInitData->u32PNL_MISC);
4034 
4035 }
4036 
MHal_PNL_DumpMODReg(void * pInstance,MS_U32 u32Addr,MS_U16 u16Value,MS_BOOL bHiByte,MS_U16 u16Mask)4037 void MHal_PNL_DumpMODReg(void *pInstance, MS_U32 u32Addr, MS_U16 u16Value, MS_BOOL bHiByte, MS_U16 u16Mask)
4038 {
4039     if (bHiByte)
4040     {
4041         MOD_W2BYTEMSK(u32Addr, (u16Value << 8), (u16Mask << 8));
4042     }
4043     else
4044     {
4045         MOD_W2BYTEMSK(u32Addr, u16Value, u16Mask);
4046     }
4047 }
4048 
MHal_MOD_Calibration_Init(void * pInstance,PNL_ModCali_InitData * pstModCaliInitData)4049 void MHal_MOD_Calibration_Init(void *pInstance, PNL_ModCali_InitData *pstModCaliInitData)
4050 {
4051     PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
4052     PNL_RESOURCE_PRIVATE* pPNLResourcePrivate = NULL;
4053     UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
4054     UtopiaResourceGetPrivate(g_pPNLResource[PNL_GET_INTERNAL_POOL_ID(pPNLInstancePrivate->u32DeviceID)],(void**)(&pPNLResourcePrivate));
4055     // Setup the default swing level
4056     pPNLResourcePrivate->sthalPNL._u16PnlDefault_SwingLevel = pstModCaliInitData->u16ExpectSwingLevel;   //mv
4057 #if 0
4058     // Pair setting
4059     // =========
4060     // Select calibration source pair, 00: ch2, 01: ch6, 10:ch8, 11:ch12
4061     //MOD_7D_L[3:2]
4062     // =========
4063     //in msModCurrentCalibration, it will transfer to the real data
4064 
4065     switch(pstModCaliInitData->u8ModCaliPairSel)
4066     {
4067         default:
4068         case 0:
4069         //ch 2
4070             pPNLResourcePrivate->sthalPNL._u8MOD_CALI_PAIR_SEL = 0x00; // ch2
4071         break;
4072         case 1:
4073         //ch 6
4074             pPNLResourcePrivate->sthalPNL._u8MOD_CALI_PAIR_SEL = 0x01; // ch6, calibration initialized value
4075         break;
4076         case 2:
4077         //ch 8
4078             pPNLResourcePrivate->sthalPNL._u8MOD_CALI_PAIR_SEL = 0x02;
4079         break;
4080         case 3:
4081         //ch 12
4082             pPNLResourcePrivate->sthalPNL._u8MOD_CALI_PAIR_SEL = 0x03;
4083         break;
4084     }
4085 #endif
4086     // Target setting
4087     // =========
4088     // GCR_CAL_LEVEL[1:0] : REG_MOD_A_BK00_70_L =>
4089     // =========
4090     //in msModCurrentCalibration, it will transfer to the real data
4091     switch(pstModCaliInitData->u8ModCaliTarget)
4092     {
4093         default:
4094         case 0:
4095             pPNLResourcePrivate->sthalPNL._u8MOD_CALI_TARGET = 0;
4096         break;
4097         case 1:
4098             pPNLResourcePrivate->sthalPNL._u8MOD_CALI_TARGET = 1;
4099         break;
4100         case 2:
4101             pPNLResourcePrivate->sthalPNL._u8MOD_CALI_TARGET = 2;
4102         break;
4103         case 3:
4104             pPNLResourcePrivate->sthalPNL._u8MOD_CALI_TARGET = 3;
4105         break;
4106     }
4107     // Offset setting, for fine tune
4108     //_usMOD_CALI_OFFSET = pstModCaliInitData->s8ModCaliOffset;
4109     // _u8MOD_CALI_VALUE is a real value; the _u8MOD_CALI_VALUE is an idea value
4110     // Target value should be the same with _u8MOD_CALI_VALUE to be a default value
4111     pPNLResourcePrivate->sthalPNL._u8MOD_CALI_VALUE= pstModCaliInitData->u8ModCaliTarget;
4112     // PVDD setting
4113     pPNLResourcePrivate->sthalPNL._bPVDD_2V5 = pstModCaliInitData->bPVDD_2V5;
4114 
4115     PNL_DBG(PNL_DBGLEVEL_INIT, "[%s][%d]\n", __FUNCTION__, __LINE__);
4116     PNL_DBG(PNL_DBGLEVEL_INIT, "u16ExpectSwingLevel = %u\n", pstModCaliInitData->u16ExpectSwingLevel);
4117     PNL_DBG(PNL_DBGLEVEL_INIT, "u8ModCaliTarget     = %x\n", pstModCaliInitData->u8ModCaliTarget);
4118     PNL_DBG(PNL_DBGLEVEL_INIT, "_u8MOD_CALI_TARGET  = %x\n", pPNLResourcePrivate->sthalPNL._u8MOD_CALI_TARGET);
4119     PNL_DBG(PNL_DBGLEVEL_INIT, "_u8MOD_CALI_VALUE   = %x\n", pPNLResourcePrivate->sthalPNL._u8MOD_CALI_VALUE);
4120     PNL_DBG(PNL_DBGLEVEL_INIT, "bPVDD_2V5           = %x\n", pstModCaliInitData->bPVDD_2V5);
4121 
4122 }
4123 
MHal_BD_LVDS_Output_Type(void * pInstance,MS_U16 Type)4124 void MHal_BD_LVDS_Output_Type(void *pInstance, MS_U16 Type)
4125 {
4126     PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
4127     PNL_RESOURCE_PRIVATE* pPNLResourcePrivate = NULL;
4128     UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
4129     UtopiaResourceGetPrivate(g_pPNLResource[PNL_GET_INTERNAL_POOL_ID(pPNLInstancePrivate->u32DeviceID)],(void**)(&pPNLResourcePrivate));
4130     if(Type == LVDS_DUAL_OUTPUT_SPECIAL )
4131     {
4132         pPNLResourcePrivate->sthalPNL._u8MOD_LVDS_Pair_Shift = LVDS_DUAL_OUTPUT_SPECIAL;
4133         pPNLResourcePrivate->sthalPNL._u8MOD_LVDS_Pair_Type = 1;
4134     }
4135     else
4136     {
4137         pPNLResourcePrivate->sthalPNL._u8MOD_LVDS_Pair_Type  = Type;
4138     }
4139     PNL_DBG(PNL_DBGLEVEL_INIT, "[%s][%d]\n", __FUNCTION__, __LINE__);
4140     PNL_DBG(PNL_DBGLEVEL_INIT, "_u8MOD_LVDS_Pair_Type = %u\n", pPNLResourcePrivate->sthalPNL._u8MOD_LVDS_Pair_Type);
4141 
4142 }
4143 
msModCalDDAOUT(void)4144 MS_BOOL msModCalDDAOUT(void)
4145 {
4146    // W2BYTEMSK(BK_MOD(0x7D), ENABLE, 8:8);
4147    // MsOS_DelayTask(10);  //10ms
4148     return (MS_BOOL)((MOD_R2BYTEMSK(REG_MOD_A_BK00_78_L, BIT(14))) >> 14);
4149 }
4150 
msModCurrentCalibration(void * pInstance)4151 MS_U8 msModCurrentCalibration(void *pInstance)
4152 {
4153 #if MOD_CAL_TIMER
4154         MS_U32 delay_start_time;
4155         delay_start_time=MsOS_GetSystemTime();
4156 #endif
4157 
4158 #if (!ENABLE_Auto_ModCurrentCalibration)
4159         return 0x60;
4160 #else
4161     MS_U8 u8cur_ibcal=0;
4162     MS_U16 u16reg_32da = 0, u16reg_32dc = 0;
4163     PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
4164     PNL_RESOURCE_PRIVATE* pPNLResourcePrivate = NULL;
4165     UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
4166     UtopiaResourceGetPrivate(g_pPNLResource[PNL_GET_INTERNAL_POOL_ID(pPNLInstancePrivate->u32DeviceID)],(void**)(&pPNLResourcePrivate));
4167     u16reg_32da = MOD_A_R2BYTE(REG_MOD_A_BK00_18_L);
4168     u16reg_32dc = MOD_A_R2BYTE(REG_MOD_A_BK00_19_L);
4169 
4170     PNL_DBG(PNL_DBGLEVEL_CALIBRATION, "[%s][%d]\n", __FUNCTION__, __LINE__);
4171 
4172     // (1) Set keep mode to auto write calibration result into register.
4173     MOD_A_W2BYTEMSK(REG_MOD_A_BK00_7A_L, BIT(15), BIT(15));
4174 
4175     // (2) Set calibration step waiting time
4176     MOD_A_W2BYTE(REG_MOD_A_BK00_7F_L, 0x0009); // (about 5us)
4177     //MOD_A_W2BYTEMSK(REG_MOD_A_BK00_7E_L, 0x0009, 0x00FF); //remove in Manhattan
4178 
4179     // (3) Set calibration toggle time
4180     MOD_A_W2BYTEMSK(REG_MOD_A_BK00_7A_L, 0x0500, 0x0F00);
4181 
4182     // (4) Select calibration level (LVDS is 250mV)
4183     MOD_A_W2BYTEMSK(REG_MOD_A_BK00_78_L, pPNLResourcePrivate->sthalPNL._u8MOD_CALI_TARGET, BIT(2)|BIT(1)|BIT(0));    // Select calibration target voltage, 00: 250mV, 01:350mV, 10: 300mV, 11: 200mV
4184 
4185     // (5) Store output configuration value and Enable each pair test mode
4186     MOD_A_W2BYTE(REG_MOD_A_BK00_18_L, 0xFFFF);
4187     MOD_A_W2BYTE(REG_MOD_A_BK00_19_L, 0xFFFF);
4188 
4189     // (6) Enable Calibration mode
4190     MOD_A_W2BYTEMSK(REG_MOD_A_BK00_78_L, BIT(15), BIT(15));         // Enable calibration function
4191 
4192     MS_U8 u8CheckTimes = 0;
4193     while(1)
4194     {
4195         // (7) Enable Hardware calibration
4196         MOD_A_W2BYTEMSK(REG_MOD_A_BK00_79_L, BIT(15), BIT(15));
4197 
4198         // (8) Wait 3ms
4199         MsOS_DelayTask(3);
4200 
4201         // mark this step in Maserati
4202         // (9) Disable Hardware calibration
4203         //MOD_A_W2BYTEMSK(REG_MOD_A_BK00_79_L, 0x0000, BIT(15));
4204 
4205         // (9) Check Finish and Fail flag bit
4206         if (MOD_A_R2BYTEMSK(REG_MOD_A_BK00_79_L, 0x6000) == 0x4000)
4207         {
4208             //printf("\033[0;31m [%s][%d] cal ok, break  \033[0m\n", __FUNCTION__, __LINE__);
4209             // (10)success, refine icon value
4210             MS_U16 u16ICONtempCH0_1 = 0;
4211             MS_U16 u16ICONtempCH2_3 = 0;
4212             MS_U16 u16ICONtempCH4_5 = 0;
4213             MS_U16 u16ICONtempCH6_7 = 0;
4214             MS_U16 u16ICONtempCH8_9 = 0;
4215             MS_U16 u16ICONtempCH10_11 = 0;
4216             MS_U16 u16ICONtempCH12_13 = 0;
4217             MS_U16 u16ICONtempCH14_15 = 0;
4218 
4219             u16ICONtempCH0_1   = _Hal_MOD_Refine_ICON( MOD_A_R2BYTEMSK(REG_MOD_A_BK00_30_L, 0xFFFF) );
4220             u16ICONtempCH2_3   = _Hal_MOD_Refine_ICON( MOD_A_R2BYTEMSK(REG_MOD_A_BK00_31_L, 0xFFFF) );
4221             u16ICONtempCH4_5   = _Hal_MOD_Refine_ICON( MOD_A_R2BYTEMSK(REG_MOD_A_BK00_32_L, 0xFFFF) );
4222             u16ICONtempCH6_7   = _Hal_MOD_Refine_ICON( MOD_A_R2BYTEMSK(REG_MOD_A_BK00_33_L, 0xFFFF) );
4223             u16ICONtempCH8_9   = _Hal_MOD_Refine_ICON( MOD_A_R2BYTEMSK(REG_MOD_A_BK00_34_L, 0xFFFF) );
4224             u16ICONtempCH10_11 = _Hal_MOD_Refine_ICON( MOD_A_R2BYTEMSK(REG_MOD_A_BK00_35_L, 0xFFFF) );
4225             u16ICONtempCH12_13 = _Hal_MOD_Refine_ICON( MOD_A_R2BYTEMSK(REG_MOD_A_BK00_36_L, 0xFFFF) );
4226             u16ICONtempCH14_15 = _Hal_MOD_Refine_ICON( MOD_A_R2BYTEMSK(REG_MOD_A_BK00_37_L, 0xFFFF) );
4227 
4228             //close reg_keep_cal_value
4229             MOD_A_W2BYTEMSK(REG_MOD_A_BK00_7A_L, 0x0000, BIT(15));
4230 
4231             MOD_A_W2BYTEMSK(REG_MOD_A_BK00_30_L, u16ICONtempCH0_1, 0xFFFF);
4232             MOD_A_W2BYTEMSK(REG_MOD_A_BK00_31_L, u16ICONtempCH2_3, 0xFFFF);
4233             MOD_A_W2BYTEMSK(REG_MOD_A_BK00_32_L, u16ICONtempCH4_5, 0xFFFF);
4234             MOD_A_W2BYTEMSK(REG_MOD_A_BK00_33_L, u16ICONtempCH6_7, 0xFFFF);
4235             MOD_A_W2BYTEMSK(REG_MOD_A_BK00_34_L, u16ICONtempCH8_9, 0xFFFF);
4236             MOD_A_W2BYTEMSK(REG_MOD_A_BK00_35_L, u16ICONtempCH10_11, 0xFFFF);
4237             MOD_A_W2BYTEMSK(REG_MOD_A_BK00_36_L, u16ICONtempCH12_13, 0xFFFF);
4238             MOD_A_W2BYTEMSK(REG_MOD_A_BK00_37_L, u16ICONtempCH14_15, 0xFFFF);
4239 
4240             break;
4241         }
4242         else
4243         {
4244             u8CheckTimes ++;
4245             //printf("\033[0;31m [%s][%d] cal ng, u8CheckTimes: %d  \033[0m\n", __FUNCTION__, __LINE__, u8CheckTimes);
4246         }
4247 
4248         if (u8CheckTimes > MOD_LVDS_HW_CALI_TIME_OUT)
4249         {
4250             // (11)fail , set to default value
4251             MOD_A_W2BYTEMSK(REG_MOD_A_BK00_7A_L, 0x00, BIT(15));
4252 
4253             MS_U16 u16ICONtempDefault = ( (MOD_LVDS_ICON_DEFAULT<<8) | (MOD_LVDS_ICON_DEFAULT) );
4254             MOD_A_W2BYTEMSK(REG_MOD_A_BK00_30_L, u16ICONtempDefault, 0xFFFF);
4255             MOD_A_W2BYTEMSK(REG_MOD_A_BK00_31_L, u16ICONtempDefault, 0xFFFF);
4256             MOD_A_W2BYTEMSK(REG_MOD_A_BK00_32_L, u16ICONtempDefault, 0xFFFF);
4257             MOD_A_W2BYTEMSK(REG_MOD_A_BK00_33_L, u16ICONtempDefault, 0xFFFF);
4258             MOD_A_W2BYTEMSK(REG_MOD_A_BK00_34_L, u16ICONtempDefault, 0xFFFF);
4259             MOD_A_W2BYTEMSK(REG_MOD_A_BK00_35_L, u16ICONtempDefault, 0xFFFF);
4260             MOD_A_W2BYTEMSK(REG_MOD_A_BK00_36_L, u16ICONtempDefault, 0xFFFF);
4261             MOD_A_W2BYTEMSK(REG_MOD_A_BK00_37_L, u16ICONtempDefault, 0xFFFF);
4262             //printf("\033[0;31m [%s][%d] If 3 times all fail, set all pair to nominal value by disable keep mode  \033[0m\n", __FUNCTION__, __LINE__);
4263             break;
4264         }
4265     }
4266 
4267     if (u8CheckTimes <= MOD_LVDS_HW_CALI_TIME_OUT)
4268     {
4269          PNL_DBG(PNL_DBGLEVEL_CALIBRATION, "\r\n----- Calibration ok \n");
4270     }
4271     else
4272     {
4273         PNL_DBG(PNL_DBGLEVEL_CALIBRATION, "\r\n----- Calibration fail: 0x%x \n", MOD_R2BYTEMSK(REG_MOD_BK00_3D_L, 0x6000));
4274     }
4275 
4276     // Wait 2ms to make sure HW auto write calibration result into register
4277     MsOS_DelayTask(2);
4278 
4279     // (12) Restore each pair output configuration
4280     MOD_A_W2BYTE(REG_MOD_A_BK00_18_L, u16reg_32da);
4281     MOD_A_W2BYTE(REG_MOD_A_BK00_19_L, u16reg_32dc);
4282 
4283     // (13) Disable calibration mode
4284     MOD_W2BYTEMSK(REG_MOD_A_BK00_78_L, 0x00, BIT(15));         // Disable calibration function
4285 
4286     // With HW calibration mode, HW would cal for each channel, and each channel would get different value
4287     // Return channel 2 vaule
4288     u8cur_ibcal = MOD_A_R2BYTEMSK(REG_MOD_A_BK00_31_L, 0x00FF); // return ch2 calibration result
4289 
4290 #if MOD_CAL_TIMER
4291     PNL_DBG(PNL_DBGLEVEL_CALIBRATION, "[%s] takes %ld ms\n", __FUNCTION__, (MsOS_GetSystemTime()-delay_start_time));
4292 #endif
4293     PNL_DBG(PNL_DBGLEVEL_CALIBRATION, "\r\n Calibration result= %x\n", u8cur_ibcal);
4294 
4295     return (u8cur_ibcal&0xFF);
4296 #endif
4297 }
4298 
MHal_PNL_MOD_Calibration(void * pInstance)4299 PNL_Result MHal_PNL_MOD_Calibration(void *pInstance)
4300 {
4301     MS_U8 u8Cab;
4302     MS_U8 u8BackUSBPwrStatus;
4303     PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
4304     PNL_RESOURCE_PRIVATE* pPNLResourcePrivate = NULL;
4305     UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
4306     UtopiaResourceGetPrivate(g_pPNLResource[PNL_GET_INTERNAL_POOL_ID(pPNLInstancePrivate->u32DeviceID)],(void**)(&pPNLResourcePrivate));
4307 
4308     u8BackUSBPwrStatus = R2BYTEMSK(L_BK_UTMI1(0x04), BIT(7));
4309 
4310     W2BYTEMSK(L_BK_UTMI1(0x04), 0x00, BIT(7));
4311 
4312     u8Cab = msModCurrentCalibration(pInstance);
4313 
4314     W2BYTEMSK(L_BK_UTMI1(0x04), u8BackUSBPwrStatus, BIT(7));
4315 
4316     if(pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type !=E_PNL_TYPE_MINILVDS)
4317         MOD_W2BYTEMSK(REG_MOD_A_BK00_78_L, u8Cab, 0x07);
4318 
4319     return E_PNL_OK;
4320 
4321 }
4322 
MHal_PNL_PowerDownLPLL(void * pInstance,MS_BOOL bEnable)4323 static void MHal_PNL_PowerDownLPLL(void *pInstance, MS_BOOL bEnable)
4324 {
4325     if(bEnable)
4326     {
4327         W2BYTEMSK(L_BK_LPLL(0x03), BIT(5), BIT(5));
4328     }
4329     else
4330     {
4331         W2BYTEMSK(L_BK_LPLL(0x03), FALSE, BIT(5));
4332     }
4333 }
4334 
MHal_PNL_En(void * pInstance,MS_BOOL bPanelOn,MS_BOOL bCalEn)4335 PNL_Result MHal_PNL_En(void *pInstance, MS_BOOL bPanelOn, MS_BOOL bCalEn)
4336 {
4337     MS_U8 u8Cab;
4338     MS_U8 u8BackUSBPwrStatus;
4339     PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
4340     PNL_RESOURCE_PRIVATE* pPNLResourcePrivate = NULL;
4341     UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
4342     UtopiaResourceGetPrivate(g_pPNLResource[PNL_GET_INTERNAL_POOL_ID(pPNLInstancePrivate->u32DeviceID)],(void**)(&pPNLResourcePrivate));
4343 
4344     PNL_DBG(PNL_DBGLEVEL_PANEL_EN, "[%s][%d]\n", __FUNCTION__, __LINE__);
4345 
4346     PNL_DBG(PNL_DBGLEVEL_PANEL_EN, "u32PNL_MISC = %tx\n", (ptrdiff_t)pPNLResourcePrivate->stdrvPNL._stPnlInitData.u32PNL_MISC);
4347     PNL_DBG(PNL_DBGLEVEL_PANEL_EN, "bPanelOn = %x\n", bPanelOn);
4348     PNL_DBG(PNL_DBGLEVEL_PANEL_EN, "eLPLL_Type            = %x\n", pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type);
4349     PNL_DBG(PNL_DBGLEVEL_PANEL_EN, "_u8MOD_LVDS_Pair_Type = %x\n", pPNLResourcePrivate->sthalPNL._u8MOD_LVDS_Pair_Type);
4350     PNL_DBG(PNL_DBGLEVEL_PANEL_EN, "u16OutputCFG0_7       = %x\n", pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputCFG0_7);
4351     PNL_DBG(PNL_DBGLEVEL_PANEL_EN, "u16OutputCFG8_15      = %x\n", pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputCFG8_15);
4352     PNL_DBG(PNL_DBGLEVEL_PANEL_EN, "u16OutputCFG16_21     = %x\n", pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputCFG16_21);
4353 
4354     MS_U16 u16PortA = MOD_A_R2BYTE(REG_MOD_A_BK00_18_L);
4355     MS_U16 u16PortB = MOD_A_R2BYTE(REG_MOD_A_BK00_19_L);
4356 
4357     if((u16PortA!=0)||(u16PortB!=0))
4358     {
4359         MHal_BD_LVDS_Output_Type(pInstance, LVDS_OUTPUT_User);
4360     }
4361 
4362     if(u16PortA!=0)
4363         pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputCFG0_7   = MOD_A_R2BYTE(REG_MOD_A_BK00_18_L);
4364     if(u16PortB!=0)
4365         pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputCFG8_15  = MOD_A_R2BYTE(REG_MOD_A_BK00_19_L);
4366 
4367     PNL_DBG(PNL_DBGLEVEL_PANEL_EN, "==========================\n\n");
4368     PNL_DBG(PNL_DBGLEVEL_PANEL_EN, "u16OutputCFG0_7       = %x\n", pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputCFG0_7);
4369     PNL_DBG(PNL_DBGLEVEL_PANEL_EN, "u16OutputCFG8_15      = %x\n", pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputCFG8_15);
4370     PNL_DBG(PNL_DBGLEVEL_PANEL_EN, "u16OutputCFG16_21     = %x\n", pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputCFG16_21);
4371 
4372 
4373     if(bPanelOn)
4374     {
4375         // The order is PanelVCC -> delay pnlGetOnTiming1() -> VOP -> MOD
4376         // VOP
4377         SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK10_46_L, 0x4000, HBMASK);
4378 
4379         // For Napoli compatible
4380         // need to wait 1ms to wait LDO stable before MOD power on
4381         MsOS_DelayTask(1);
4382 
4383         // turn on LPLL
4384         MHal_PNL_PowerDownLPLL(pInstance, FALSE);
4385 
4386         // mod power on
4387         MHal_MOD_PowerOn(pInstance
4388                         , ENABLE
4389                         , pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type
4390                         , pPNLResourcePrivate->sthalPNL._u8MOD_LVDS_Pair_Type
4391                         , pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputCFG0_7
4392                         , pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputCFG8_15
4393                         , pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputCFG16_21);
4394 
4395         if(bCalEn)
4396         {
4397 
4398             u8BackUSBPwrStatus = R2BYTEMSK(L_BK_UTMI1(0x04), BIT(7));
4399 
4400             W2BYTEMSK(L_BK_UTMI1(0x04), 0x00, BIT(7));
4401 
4402             u8Cab = msModCurrentCalibration(pInstance);
4403 
4404             W2BYTEMSK(L_BK_UTMI1(0x04), u8BackUSBPwrStatus, BIT(7));
4405 
4406         }
4407         else
4408         {
4409             if( ( IsVBY1(pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type) ) &&
4410                 ((pPNLResourcePrivate->stdrvPNL._stPnlInitData.u32PNL_MISC & (MS_U32)E_APIPNL_MISC_SKIP_ICONVALUE) == FALSE))
4411             {
4412                 HAL_MOD_CAL_DBG(printf("Use RCON value \n", __FUNCTION__, __LINE__));
4413                 msSetVBY1RconValue(pInstance);
4414             }
4415             else
4416             {
4417                 HAL_MOD_CAL_DBG(printf("User define Swing Value=%u\n", __FUNCTION__, __LINE__, pPNLResourcePrivate->sthalPNL._u16PnlDefault_SwingLevel));
4418 
4419                 if(!MHal_PNL_MOD_Control_Out_Swing(pInstance, pPNLResourcePrivate->sthalPNL._u16PnlDefault_SwingLevel))
4420                     printf(">>Swing Level setting error!!\n");
4421             }
4422         }
4423 
4424         if(pPNLResourcePrivate->stdrvPNL._stPnlInitData.bVideo_HW_Training_En)
4425             MHal_PNL_VBY1_Hardware_TrainingMode_En(pInstance, TRUE, ENABLE);
4426     }
4427     else
4428     {
4429         // The order is LPLL -> MOD -> VOP -> delay for MOD power off -> turn off VCC
4430 
4431         // LPLL
4432         // MHal_PNL_PowerDownLPLL(TRUE); //Remove to keep op vsync if panel off
4433 
4434         MHal_MOD_PowerOn(pInstance
4435                         , DISABLE
4436                         , pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type
4437                         , pPNLResourcePrivate->sthalPNL._u8MOD_LVDS_Pair_Type
4438                         , pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputCFG0_7
4439                         , pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputCFG8_15
4440                         , pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputCFG16_21);
4441         // VOP
4442         if(pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type == E_PNL_TYPE_LVDS ||
4443             pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type == E_PNL_TYPE_DAC_I ||
4444             pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type == E_PNL_TYPE_DAC_P)//(bIsLVDS)
4445             SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK10_46_L, 0xFF, LBMASK);
4446         else
4447             SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK10_46_L, 0x00, 0xFF);
4448     }
4449 
4450     return E_PNL_OK;
4451 }
4452 
MHal_PNL_SetOutputPattern(void * pInstance,MS_BOOL bEnable,MS_U16 u16Red,MS_U16 u16Green,MS_U16 u16Blue)4453 void MHal_PNL_SetOutputPattern(void *pInstance, MS_BOOL bEnable, MS_U16 u16Red , MS_U16 u16Green, MS_U16 u16Blue)
4454 {
4455     if (bEnable)
4456     {
4457         MOD_W2BYTEMSK(REG_MOD_BK00_69_L, u16Red , 0x03FF);
4458         MOD_W2BYTEMSK(REG_MOD_BK00_6A_L, u16Green , 0x03FF);
4459         MOD_W2BYTEMSK(REG_MOD_BK00_6B_L, u16Blue , 0x03FF);
4460         MsOS_DelayTask(10);
4461         MOD_W2BYTEMSK(REG_MOD_BK00_68_L, BIT(12) , BIT(12));
4462     }
4463     else
4464     {
4465         MOD_W2BYTEMSK(REG_MOD_BK00_68_L, DISABLE , BIT(12));
4466     }
4467 
4468 }
4469 
MHal_PNL_Switch_LPLL_SubBank(void * pInstance,MS_U16 u16Bank)4470 void MHal_PNL_Switch_LPLL_SubBank(void *pInstance, MS_U16 u16Bank)
4471 {
4472     UNUSED(u16Bank);
4473 }
4474 
MHal_PNL_Switch_TCON_SubBank(void * pInstance,MS_U16 u16Bank)4475 void MHal_PNL_Switch_TCON_SubBank(void *pInstance, MS_U16 u16Bank)
4476 {
4477     W2BYTEMSK(L_BK_TCON(0x00), u16Bank&0xff, 0xFF);
4478 }
4479 
MHal_PNL_Read_TCON_SubBank(void * pInstance)4480 MS_U16 MHal_PNL_Read_TCON_SubBank(void *pInstance)
4481 {
4482     return (MS_U16)R2BYTEMSK(L_BK_TCON(0x00),0xFF);
4483 }
4484 
MHal_PNL_Is_VBY1_Locked(void * pInstance)4485 MS_BOOL MHal_PNL_Is_VBY1_Locked(void *pInstance)
4486 {
4487     if (MOD_A_R2BYTEMSK(REG_MOD_A_BK00_47_L, 0x0300) == 0x00)
4488     {
4489         return TRUE;
4490     }
4491     else
4492     {
4493         return FALSE;
4494     }
4495 }
4496 
MHal_PNL_Is_VBY1_LockN_Locked(void * pInstance)4497 MS_BOOL MHal_PNL_Is_VBY1_LockN_Locked(void *pInstance)
4498 {
4499     if (MOD_A_R2BYTEMSK(REG_MOD_A_BK00_47_L, 0x0100) == 0x00)
4500     {
4501         return TRUE;
4502     }
4503     else
4504     {
4505         return FALSE;
4506     }
4507 }
4508 
MHal_PNL_VBY1_Handshake(void * pInstance)4509 MS_BOOL MHal_PNL_VBY1_Handshake(void *pInstance)
4510 {
4511     MS_BOOL bIsLock = FALSE;
4512 
4513     if (MHal_PNL_Is_VBY1_Locked(pInstance) == FALSE)
4514     {
4515         MS_U16 u16CheckTimes = 0;
4516         //MS_U16 u16DeboundTimes = 0;
4517 
4518         // need to toggle vby1 packer  process start first
4519         MOD_W2BYTEMSK(REG_MOD_BK00_62_L, 0x00, BIT(11));
4520         MOD_W2BYTEMSK(REG_MOD_BK00_62_L, BIT(11), BIT(11));
4521 
4522         MOD_W2BYTE(REG_MOD_BK00_60_L, 0x0F56); // set reg. initial value
4523         MOD_W2BYTEMSK(REG_MOD_BK00_60_L, 0xD6, 0x00FF); // after power on go to stand-by
4524         MOD_W2BYTEMSK(REG_MOD_BK00_60_L, 0x96, 0x00FF); // connection is established, go to Acquisition
4525         MOD_W2BYTEMSK(REG_MOD_BK00_60_L, 0xB6, 0x00FF); // when internal clock is stable, got to CDR training
4526         MOD_W2BYTEMSK(REG_MOD_BK00_60_L, 0xBE, 0x00FF); // enable encoder for DC blance
4527 
4528         while(u16CheckTimes < 10)
4529         {
4530 #if 0
4531             u16DeboundTimes = 2;
4532             while ((!MHal_PNL_Is_VBY1_LockN_Locked()) && (u16DeboundTimes --))
4533             {
4534                 MsOS_DelayTask(1); // can't remove
4535             }
4536 #endif
4537             if(MHal_PNL_Is_VBY1_LockN_Locked(pInstance))
4538             {
4539                 //-------------------------------------------------------------------
4540                 // step1. Toggle clock when training
4541                 MOD_W2BYTE(REG_MOD_BK00_60_L, 0x0FAE);
4542                 //--------------------------------------------------------------------
4543                 bIsLock = TRUE;
4544                 // pass 2 times debound to make sure VBY1 is locked
4545                 break;
4546             }
4547 
4548             u16CheckTimes++;
4549             MsOS_DelayTaskUs(40);
4550         }
4551 
4552         if(bIsLock)
4553             {
4554             // step3. Disable HW check when lock done, Enable when loss lock
4555             //MOD_W2BYTEMSK(REG_MOD_BK00_33_L, 0x00, BIT15);
4556 
4557             /// Add the delay to increase time to send
4558             //MDrv_TIMER_Delayms(10);
4559         }
4560     }
4561     else
4562     {
4563         if(MOD_R2BYTEMSK(REG_MOD_BK00_60_L, 0x0FFF) != 0x0FAE)
4564         {
4565             MOD_W2BYTE(REG_MOD_BK00_60_L, 0x0FAE);
4566         }
4567         bIsLock = TRUE;
4568             }
4569 
4570     return bIsLock;
4571 }
4572 
MHal_PNL_Is_VBY1_OC_Locked(void * pInstance)4573 MS_BOOL MHal_PNL_Is_VBY1_OC_Locked(void *pInstance)
4574 {
4575     if (MOD_A_R2BYTEMSK(REG_MOD_A_BK00_47_L, 0x0C00) == 0x00)  // MOD_BK00_56_L[11:10]        for OSD
4576             {
4577         return TRUE;
4578     }
4579     else
4580     {
4581         return FALSE;
4582             }
4583 }
4584 
MHal_PNL_Is_VBY1_OC_LockN_Locked(void * pInstance)4585 MS_BOOL MHal_PNL_Is_VBY1_OC_LockN_Locked(void *pInstance)
4586 {
4587     if (MOD_A_R2BYTEMSK(REG_MOD_A_BK00_47_L, 0x0400) == 0x00)  // MOD_BK00_56_L[11:10]        for OSD
4588             {
4589         return TRUE;
4590     }
4591     else
4592     {
4593         return FALSE;
4594             }
4595 }
4596 
MHal_PNL_VBY1_OC_Handshake(void * pInstance)4597 MS_BOOL MHal_PNL_VBY1_OC_Handshake(void *pInstance)
4598 {
4599     MS_BOOL bIsLock = FALSE;
4600 
4601     if (MHal_PNL_Is_VBY1_OC_Locked(pInstance) == FALSE)
4602     {
4603         MS_U16 u16CheckTimes = 0;
4604 //        MS_U16 u16DeboundTimes = 0;
4605 
4606         // need to toggle vby1 packer  process start first
4607         MOD_W2BYTEMSK(REG_MOD_BK00_66_L, 0x00, BIT(11));
4608         MOD_W2BYTEMSK(REG_MOD_BK00_66_L, BIT(11), BIT(11));
4609 
4610 
4611         MOD_W2BYTE(REG_MOD_BK00_64_L, 0x0F56); // set reg. initial value
4612         MOD_W2BYTEMSK(REG_MOD_BK00_64_L, 0xD6, 0x00FF); // after power on go to stand-by
4613         MOD_W2BYTEMSK(REG_MOD_BK00_64_L, 0x96, 0x00FF); // connection is established, go to Acquisition
4614         MOD_W2BYTEMSK(REG_MOD_BK00_64_L, 0xB6, 0x00FF); // when internal clock is stable, got to CDR training
4615         MOD_W2BYTEMSK(REG_MOD_BK00_64_L, 0xBE, 0x00FF); // enable encoder for DC blance
4616 
4617         while(u16CheckTimes < 10)
4618         {
4619         #if 0
4620             u16DeboundTimes = 2;
4621             while ((!MHal_PNL_Is_VBY1_OC_LockN_Locked()) && (u16DeboundTimes --))
4622             {
4623             MsOS_DelayTask(1);
4624             }
4625         #endif
4626             if(MHal_PNL_Is_VBY1_OC_LockN_Locked(pInstance))
4627             {
4628                 //-------------------------------------------------------------------
4629                 // step1. Toggle clock when training
4630 
4631                 MOD_W2BYTE(REG_MOD_BK00_64_L, 0x0FAE);
4632                 bIsLock = TRUE;
4633                 // pass 2 times debound to make sure VBY1 is locked
4634                 break;
4635             }
4636 
4637             u16CheckTimes++;
4638             MsOS_DelayTaskUs(40);
4639         }
4640 
4641         if(bIsLock)
4642         {
4643             // step3. Disable HW check when lock done, Enable when loss lock
4644 //            MOD_W2BYTEMSK(REG_MOD_BK00_33_L, 0x00, BIT15);
4645         }
4646     }
4647     else
4648     {
4649         if(MOD_R2BYTEMSK(REG_MOD_BK00_64_L, 0x0FFF) != 0x0FAE)
4650         {
4651             MOD_W2BYTE(REG_MOD_BK00_64_L, 0x0FAE);
4652         }
4653         bIsLock = TRUE;
4654     }
4655 
4656     return bIsLock;
4657 }
4658 
MHal_PNL_IsYUVOutput(void * pInstance)4659 MS_BOOL MHal_PNL_IsYUVOutput(void *pInstance)
4660 {
4661    return FALSE;
4662 }
4663 
MHal_PNL_SetOutputInterlaceTiming(void * pInstance,MS_BOOL bEnable)4664 MS_BOOL MHal_PNL_SetOutputInterlaceTiming(void *pInstance, MS_BOOL bEnable)
4665 {
4666     PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
4667     UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
4668 
4669     if (bEnable == TRUE)
4670     {
4671         //interlace output vtotal modify
4672         SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK10_21_L, BIT(9), BIT(9));
4673 
4674         // two different interlace information through channel A reserved bit
4675         MOD_W2BYTEMSK(REG_MOD_BK00_05_L, BIT(12), BIT(12));
4676         MOD_W2BYTEMSK(REG_MOD_BK00_51_L, BIT(2), BIT(2));
4677         // two different interlace information through channel B reserved bit
4678         MOD_W2BYTEMSK(REG_MOD_BK00_51_L, BIT(3), BIT(3));
4679     }
4680     else
4681     {
4682         SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK10_21_L  , 0, BIT(9));
4683         // two different interlace information through channel A reserved bit
4684         MOD_W2BYTEMSK(REG_MOD_BK00_05_L, 0x0000, BIT(12));
4685         MOD_W2BYTEMSK(REG_MOD_BK00_51_L, 0x0000, BIT(2));
4686         // two different interlace information through channel B reserved bit
4687         MOD_W2BYTEMSK(REG_MOD_BK00_51_L, 0x0000, BIT(3));
4688     }
4689 
4690     return TRUE;
4691 }
4692 
MHal_PNL_GetOutputInterlaceTiming(void * pInstance)4693 MS_BOOL MHal_PNL_GetOutputInterlaceTiming(void *pInstance)
4694 {
4695     PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
4696     UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
4697 
4698     MS_BOOL bIsInterlaceOutput = FALSE;
4699     //interlace output vtotal modify
4700     if (SC_R2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK10_21_L, BIT(9)) == BIT(9))
4701     {
4702         if (   (MOD_R2BYTEMSK(REG_MOD_BK00_05_L, BIT(12)) == (BIT(12)))
4703             || (MOD_R2BYTEMSK(REG_MOD_BK00_51_L, (BIT(2) | BIT(3))) == (BIT(2)|BIT(3))))
4704         {
4705             bIsInterlaceOutput = TRUE;
4706         }
4707     }
4708     else
4709     {
4710         bIsInterlaceOutput = FALSE;
4711     }
4712     return bIsInterlaceOutput;
4713 }
4714 
4715 ////Ext LPLL setting
_MHal_PNL_Init_ExtLPLL(void * pInstance,PNL_TYPE eLPLL_Type,PNL_MODE eLPLL_Mode,MS_U64 ldHz)4716 static void _MHal_PNL_Init_ExtLPLL(void *pInstance, PNL_TYPE eLPLL_Type,PNL_MODE eLPLL_Mode,MS_U64 ldHz)
4717 {
4718     E_PNL_SUPPORTED_LPLL_EXT_TYPE u8SupportedLPLLLIndex = E_PNL_SUPPORTED_LPLL_EXT_MAX;
4719 
4720     u8SupportedLPLLLIndex = _MHal_PNL_GetSupportedLPLLIndex(pInstance, eLPLL_Type,eLPLL_Mode,ldHz, E_PNL_LPLL_OSD);
4721 
4722     if (u8SupportedLPLLLIndex == E_PNL_SUPPORTED_LPLL_EXT_MAX)
4723     {
4724         printf("Not Supported LPLL Type, skip LPLL Init\n");
4725         return;
4726     }
4727 
4728     _MHal_PNL_DumpLPLLTable(pInstance, u8SupportedLPLLLIndex, E_PNL_LPLL_OSD);
4729 }
4730 
_MHal_PNL_Get_ExtLPLL_LoopDIV(void * pInstance,MS_U8 u8LPLL_Mode,MS_U8 eLPLL_Type,MS_U64 ldHz)4731 static MS_U8 _MHal_PNL_Get_ExtLPLL_LoopDIV(void *pInstance, MS_U8 u8LPLL_Mode, MS_U8 eLPLL_Type, MS_U64 ldHz)
4732 {
4733     MS_U16 u16loop_div = 0;
4734     E_PNL_SUPPORTED_LPLL_EXT_TYPE u8SupportedLPLLLIndex = E_PNL_SUPPORTED_LPLL_EXT_MAX;
4735     u8SupportedLPLLLIndex = _MHal_PNL_GetSupportedLPLLIndex(pInstance, eLPLL_Type,u8LPLL_Mode,ldHz,E_PNL_LPLL_OSD);
4736 
4737     if (u8SupportedLPLLLIndex == E_PNL_SUPPORTED_LPLL_EXT_MAX)
4738     {
4739         u16loop_div = 0 ;
4740     }
4741     else
4742     {
4743         u16loop_div = u16EXT_LoopDiv[u8SupportedLPLLLIndex];
4744     }
4745 
4746     u16loop_div *= 2;
4747     return u16loop_div;
4748 }
4749 
_MHal_PNL_Get_ExtLPLL_LoopGain(void * pInstance,MS_U8 eLPLL_Mode,MS_U8 eLPLL_Type,MS_U64 ldHz)4750 static MS_U8 _MHal_PNL_Get_ExtLPLL_LoopGain(void *pInstance, MS_U8 eLPLL_Mode, MS_U8 eLPLL_Type, MS_U64 ldHz)
4751 {
4752     MS_U16 u16loop_gain = 0;
4753     E_PNL_SUPPORTED_LPLL_EXT_TYPE u8SupportedLPLLLIndex = E_PNL_SUPPORTED_LPLL_EXT_MAX;
4754     u8SupportedLPLLLIndex = _MHal_PNL_GetSupportedLPLLIndex(pInstance, eLPLL_Type,eLPLL_Mode,ldHz,E_PNL_LPLL_OSD);
4755 
4756     if (u8SupportedLPLLLIndex == E_PNL_SUPPORTED_LPLL_EXT_MAX)
4757     {
4758         u16loop_gain = 0 ;
4759     }
4760     else
4761     {
4762         u16loop_gain = u16EXT_LoopGain[u8SupportedLPLLLIndex];
4763     }
4764     return u16loop_gain;
4765 }
4766 
4767 
4768 // Output Dclk
MHal_PNL_CalExtLPLLSETbyDClk(void * pInstance,MS_U8 u8LPLL_Mode,MS_U8 u8LPLL_Type,MS_U64 ldHz)4769 void MHal_PNL_CalExtLPLLSETbyDClk(void *pInstance, MS_U8 u8LPLL_Mode, MS_U8 u8LPLL_Type, MS_U64 ldHz)
4770 {
4771 
4772     MS_U64 u64LdPllSet = 0;
4773     MS_U64 u64DclkFactor = 0;
4774     MS_U32 u32Div = 0;
4775     // loop div and loop gain use default parameters to avoid dclk floating out of range and getting wrong value
4776     MS_U32 u32Factor = 10;
4777 
4778     _MHal_PNL_Init_ExtLPLL(pInstance, u8LPLL_Type, u8LPLL_Mode, ldHz);
4779 
4780     //the first " *2 " is from  the dual mode
4781     u32Div=(MS_U32)(_MHal_PNL_Get_ExtLPLL_LoopDIV(pInstance, u8LPLL_Mode, u8LPLL_Type, ldHz));
4782     u64DclkFactor=((MS_U64)LVDS_MPLL_CLOCK_MHZ * (MS_U64)524288 * (MS_U64)_MHal_PNL_Get_ExtLPLL_LoopGain(pInstance, u8LPLL_Mode, u8LPLL_Type, ldHz));
4783     u64LdPllSet = (u64DclkFactor * 1000000 * u32Factor *2) + ((ldHz * u32Div) >> 1);
4784     do_div(u64LdPllSet, ldHz);
4785     do_div(u64LdPllSet, u32Div);
4786 
4787     W4BYTE(L_BK_LPLL(0x48), (MS_U32)u64LdPllSet);
4788     //printf("MHal_PNL_CalExtLPLLSETbyDClk u32KHz = %u, u32LpllSet = %x\n", ldHz, (MS_U32)u64LdPllSet);
4789 
4790 }
4791 
MHal_PNL_SetOSDCOutputType(void * pInstance,PNL_TYPE eLPLL_Type,E_PNL_OSDC_OUTPUT_FORMAT eOC_OutputFormat)4792 void MHal_PNL_SetOSDCOutputType(void *pInstance, PNL_TYPE eLPLL_Type, E_PNL_OSDC_OUTPUT_FORMAT eOC_OutputFormat)
4793 {
4794     PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
4795     PNL_RESOURCE_PRIVATE* pPNLResourcePrivate = NULL;
4796     UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
4797     UtopiaResourceGetPrivate(g_pPNLResource[PNL_GET_INTERNAL_POOL_ID(pPNLInstancePrivate->u32DeviceID)],(void**)(&pPNLResourcePrivate));
4798 
4799     PNL_TYPE eVideo_LPLL_Type = pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type;
4800 
4801     //load clk table: CLKGEN0SettingTBL / CLKGEN2SettingTBL
4802     // in Maserati : the OSD path just in VBY1
4803     if(( E_PNL_LPLL_VBY1_10BIT_4LANE == eLPLL_Type ) ||
4804        ( E_PNL_LPLL_VBY1_8BIT_4LANE  == eLPLL_Type ) ||
4805        ( E_PNL_LPLL_VBY1_10BIT_2LANE == eLPLL_Type ) ||
4806        ( E_PNL_LPLL_VBY1_8BIT_2LANE  == eLPLL_Type ))
4807     {
4808         E_PNL_SUPPORTED_CLK_TYPE eCLKType= _MHal_Transfer_PanelType_To_CLKType_OSD(eLPLL_Type, 0, 0);
4809         _MHal_PNL_DumpOSDClkTable(eCLKType);
4810     }
4811 
4812     // VBy1 co-registers
4813     if(  IsVBY1(eLPLL_Type) )
4814     {
4815         MOD_W2BYTEMSK(REG_MOD_BK00_2E_L, BIT(10), BIT(10)); //[10]enable osd lvds path
4816         MOD_W2BYTEMSK(REG_MOD_BK00_00_L, BIT(0), BIT(0)); //sw reset
4817         MOD_W2BYTEMSK(REG_MOD_BK00_54_L, 0x0000, BIT(14));
4818         MOD_W2BYTEMSK(REG_MOD_BK00_51_L, 0x0000, (BIT(2)|BIT(3)|BIT(4)) );
4819 
4820         MOD_A_W2BYTEMSK(REG_MOD_A_BK00_77_L, BIT(0), BIT(0)); //[0]sw_rst
4821 
4822         // swith osd lpllset source
4823         // 0: osd with video lpllset
4824         // 1: osd with osd lpllset
4825         MOD_A_W2BYTEMSK(REG_MOD_A_BK00_10_L, BIT(10), BIT(10));
4826 
4827         // DIG clk en(OSD)
4828         // reg.6F [3:0]: reg_ckg_mod_sr_rclk_osd
4829         // reg.6F [7:4]: reg_ckg_mod_sr_rclk_pre_osd
4830         // reg.6F [11:8]: reg_ckg_mod_sr_rclk_final_osd
4831         MOD_A_W2BYTEMSK(REG_MOD_A_BK00_6F_L, 0x0444, 0x0FFF);
4832 
4833         //-------------------------------------
4834         //## pe
4835 //        MOD_A_W2BYTE(REG_MOD_A_BK00_30_L, 0x3fff);
4836 //        MOD_W2BYTE(REG_MOD_BK00_23_L, 0x7000);
4837 //        MOD_W2BYTE(REG_MOD_BK00_24_L, 0x7fff);
4838 //        MOD_W2BYTE(REG_MOD_BK00_25_L, 0x003f);
4839 
4840         MOD_W2BYTE(REG_MOD_BK00_5A_L, 0x8f3f); //[15]all dk scr[13:8]aln_de_cnt [7:0] aln_pix_cnt
4841 
4842         // maserati only
4843         // HW force setting free swap in OSD
4844         // in case of 8v4o: 0 1 2 3 8 9 A B ( video ) OSD0 OSD1 OSD2 OSD3 (OSD)
4845         // in case of 4v2o: 0 1 x x 8 9 x x ( video ) OSD0 OSD1 x    x    (OSD)
4846         // so 4v2o: need to add free swap setting ( 0x5410 0xffff ) to put video lane together
4847         // 4v2o: 0 1 8 9 x x x x ( video ) OSD0 OSD1 x    x    (OSD)
4848         MOD_W2BYTEMSK(REG_MOD_BK00_7C_L, BIT(0), BIT(0));
4849 
4850     }
4851 
4852     if( eLPLL_Type == E_PNL_LPLL_VBY1_10BIT_4LANE)
4853     {
4854         MOD_A_W2BYTEMSK(REG_MOD_A_BK00_10_L, BIT(13),BIT(13));
4855 
4856         MOD_A_W2BYTE(REG_MOD_A_BK00_19_L, 0x0055); //[7:0]reg_output_conf[27:16]
4857 
4858         MOD_W2BYTEMSK(REG_MOD_BK00_2E_L, 0x0000, BIT(10)); //[10]enable osd lvds path
4859         MOD_W2BYTEMSK(REG_MOD_BK00_00_L, BIT(0), BIT(0)); //sw reset
4860         MOD_W2BYTEMSK(REG_MOD_BK00_54_L, 0x0000, BIT(14));
4861         MOD_W2BYTEMSK(REG_MOD_BK00_51_L, 0x0000, (BIT(2)|BIT(3)|BIT(4)) );
4862 
4863         MOD_A_W2BYTEMSK(REG_MOD_A_BK00_10_L, BIT(13),BIT(13));
4864 
4865         //MOD_W2BYTE(REG_MOD_BK00_71_L, 0xffff);  //can not find in Manhattan register table
4866 
4867         //[13]reg_seri_auto_fix_osd : enable osd serializer auto fix read/write point mis-balance
4868         //[14]reg_seri_osd_mod:for OSD, switch chanel 8~13 as OSD path
4869         //[15]reg_dbg_status_switch:switch debug information(reg_dbg_status_sel/reg_dbg_status) between Video/OSD path     0: Video       1: OSD
4870         MOD_W2BYTEMSK(REG_MOD_BK00_76_L, (BIT(14)|BIT(13)) , (BIT(15)|BIT(14)|BIT(13)) );
4871 
4872         //[0]reg_seri_enable:enable serializer function
4873         //[1]reg_seri_auto_fix:enable serializer auto fix read/write point mis-balance
4874         //[2]reg_fix_cnt_clr
4875         //[3]reg_dbg_status_sel:select debug status, read status from reg_dbg_status[15:0] 0: auto fix cnt         1: point diff value
4876         //[15..8]reg_tester_pix_ext: test pixel extension for 16bit serializer
4877         MOD_W2BYTEMSK(REG_MOD_BK00_78_L, 0x0003 , 0xFF0F);
4878 
4879         MOD_W2BYTE(REG_MOD_BK00_5A_L, 0x8f3f);
4880         //-------------------------------------
4881         //## icon (Swing)
4882         MOD_A_W2BYTE(REG_MOD_A_BK00_34_L, 0x7f7f);
4883         MOD_A_W2BYTE(REG_MOD_A_BK00_35_L, 0x7f7f);
4884         MOD_A_W2BYTE(REG_MOD_A_BK00_36_L, 0x0000);
4885 
4886         // vby1 osd 4 lane
4887         //[15]proc_st[13:12]byte_mode 4 byte mode[6]2ch_vby1_osd[9]swap
4888         MOD_W2BYTEMSK(REG_MOD_BK00_5B_L, 0xa260 , 0xFFE0);
4889     }
4890     else if( eLPLL_Type == E_PNL_LPLL_VBY1_10BIT_2LANE)
4891     {
4892         MOD_A_W2BYTEMSK(REG_MOD_A_BK00_10_L, BIT(13),BIT(13));
4893         MOD_A_W2BYTE(REG_MOD_A_BK00_19_L, 0x0005);
4894 
4895         //-------------------------------------
4896         //## icon (Swing)
4897         MOD_A_W2BYTE(REG_MOD_A_BK00_34_L, 0x7f7f);
4898         MOD_A_W2BYTE(REG_MOD_A_BK00_35_L, 0x0000);
4899         MOD_A_W2BYTE(REG_MOD_A_BK00_36_L, 0x0000);
4900 
4901         //vby1 osd 2 lane
4902         //[15]proc_st[13:12]byte_mode 4 byte mode[6]2ch_vby1_osd[9]swap
4903         MOD_W2BYTEMSK(REG_MOD_BK00_5B_L, 0xa240 , 0xFFE0);
4904     }
4905 
4906     // Control VBY1 output format and bit orders
4907     switch(eOC_OutputFormat)
4908     {
4909         case E_PNL_OSDC_OUTPUT_FORMAT_VBY1_ARGB1:
4910             MOD_W2BYTEMSK(REG_MOD_BK00_64_L, 0x0000, BIT(10));
4911             break;
4912 
4913         case E_PNL_OSDC_OUTPUT_FORMAT_VBY1_ARGB2:
4914             MOD_W2BYTEMSK(REG_MOD_BK00_64_L, BIT(10), BIT(10));
4915             break;
4916 
4917         default:
4918             printf("OSDC output format uses default value\n");
4919             MOD_W2BYTEMSK(REG_MOD_BK00_64_L, 0x0000, BIT(10));
4920             break;
4921     }
4922 
4923     //maserati : force set VBY1 OSD default free swap
4924     if( (IsVBY1(eLPLL_Type)) && ( APIPNL_OUTPUT_CHANNEL_ORDER_DEFAULT == pPNLResourcePrivate->stdrvPNL._stPnlInitData.u8OutputOrderType ) )
4925     {
4926         if(( E_PNL_LPLL_VBY1_10BIT_8LANE == eVideo_LPLL_Type ) || ( E_PNL_LPLL_VBY1_8BIT_8LANE == eVideo_LPLL_Type ))
4927         {
4928             if(( E_PNL_LPLL_VBY1_10BIT_4LANE == eLPLL_Type ) || ( E_PNL_LPLL_VBY1_8BIT_4LANE  == eLPLL_Type ))
4929             {
4930                 // 8v4o
4931                 MHal_Output_Channel_Order(pInstance,APIPNL_OUTPUT_CHANNEL_ORDER_USER,0x5410,0x7632,0xBA98,0xFFFF);
4932                 _MHal_PNL_Set_Clk(pInstance,APIPNL_OUTPUT_CHANNEL_ORDER_USER,0x5410,0x7632,0xBA98,0xFFFF);
4933             }
4934             else if(( E_PNL_LPLL_VBY1_10BIT_2LANE == eLPLL_Type ) || ( E_PNL_LPLL_VBY1_8BIT_2LANE  == eLPLL_Type ))
4935             {
4936                 // 8v2o
4937                 MHal_Output_Channel_Order(pInstance,APIPNL_OUTPUT_CHANNEL_ORDER_USER,0x5410,0x7632,0xFF98,0xFFFF);
4938                 _MHal_PNL_Set_Clk(pInstance,APIPNL_OUTPUT_CHANNEL_ORDER_USER,0x5410,0x7632,0xFF98,0xFFFF);
4939             }
4940         }
4941         else if(( E_PNL_LPLL_VBY1_10BIT_4LANE == eVideo_LPLL_Type ) || ( E_PNL_LPLL_VBY1_8BIT_4LANE == eVideo_LPLL_Type ))
4942         {
4943             if(( E_PNL_LPLL_VBY1_10BIT_4LANE == eLPLL_Type ) || ( E_PNL_LPLL_VBY1_8BIT_4LANE  == eLPLL_Type ))
4944             {
4945                 // 4v4o
4946                 MHal_Output_Channel_Order(pInstance,APIPNL_OUTPUT_CHANNEL_ORDER_USER,0x5410,0xFFFF,0xBA98,0xFFFF);
4947                 _MHal_PNL_Set_Clk(pInstance,APIPNL_OUTPUT_CHANNEL_ORDER_USER,0x5410,0xFFFF,0xBA98,0xFFFF);
4948             }
4949             else if(( E_PNL_LPLL_VBY1_10BIT_2LANE == eLPLL_Type ) || ( E_PNL_LPLL_VBY1_8BIT_2LANE  == eLPLL_Type ))
4950             {
4951                 // 4v2o
4952                 MHal_Output_Channel_Order(pInstance,APIPNL_OUTPUT_CHANNEL_ORDER_USER,0x5410,0xFFFF,0xFF98,0xFFFF);
4953                 _MHal_PNL_Set_Clk(pInstance,APIPNL_OUTPUT_CHANNEL_ORDER_USER,0x5410,0xFFFF,0xFF98,0xFFFF);
4954             }
4955         }
4956         else if(( E_PNL_LPLL_VBY1_10BIT_2LANE == eLPLL_Type ) || ( E_PNL_LPLL_VBY1_8BIT_2LANE  == eLPLL_Type ))
4957         {
4958             if(( E_PNL_LPLL_VBY1_10BIT_4LANE == eLPLL_Type ) || ( E_PNL_LPLL_VBY1_8BIT_4LANE  == eLPLL_Type ))
4959             {
4960                 // 2v4o
4961                 MHal_Output_Channel_Order(pInstance,APIPNL_OUTPUT_CHANNEL_ORDER_USER,0xFF10,0xFFFF,0xBA98,0xFFFF);
4962                 _MHal_PNL_Set_Clk(pInstance,APIPNL_OUTPUT_CHANNEL_ORDER_USER,0xFF10,0xFFFF,0xBA98,0xFFFF);
4963             }
4964             else if(( E_PNL_LPLL_VBY1_10BIT_2LANE == eLPLL_Type ) || ( E_PNL_LPLL_VBY1_8BIT_2LANE  == eLPLL_Type ))
4965             {
4966                 // 2v2o
4967                 MHal_Output_Channel_Order(pInstance,APIPNL_OUTPUT_CHANNEL_ORDER_USER,0xFF10,0xFFFF,0xFF98,0xFFFF);
4968                 _MHal_PNL_Set_Clk(pInstance,APIPNL_OUTPUT_CHANNEL_ORDER_USER,0xFF10,0xFFFF,0xFF98,0xFFFF);
4969             }
4970         }
4971         else
4972         {
4973             // error
4974             MHal_Output_Channel_Order(pInstance,APIPNL_OUTPUT_CHANNEL_ORDER_USER,0xFFFF,0xFFFF,0xFFFF,0xFFFF);
4975             _MHal_PNL_Set_Clk(pInstance,APIPNL_OUTPUT_CHANNEL_ORDER_USER,0xFFFF,0xFFFF,0xFFFF,0xFFFF);
4976         }
4977     }
4978 }
4979 
MHal_PNL_SetOSDSSC(void * pInstance,MS_U16 u16Fmodulation,MS_U16 u16Rdeviation,MS_BOOL bEnable)4980 MS_BOOL MHal_PNL_SetOSDSSC(void *pInstance, MS_U16 u16Fmodulation, MS_U16 u16Rdeviation, MS_BOOL bEnable)
4981 {
4982     MS_U16 u16Span;
4983     MS_U16 u16Step;
4984     MS_U32 u32PLL_SET;/// = MDrv_Read3Byte(L_BK_LPLL(0x0F));
4985 
4986     MHal_PNL_Switch_LPLL_SubBank(pInstance, 0x00);
4987     u32PLL_SET = R4BYTE(L_BK_LPLL(0x48));
4988     // Set SPAN
4989     if(u16Fmodulation < 200 || u16Fmodulation > 400)
4990         u16Fmodulation = 300;
4991     u16Span =( ( (((MS_U32)LVDS_MPLL_CLOCK_MHZ*LVDS_SPAN_FACTOR ) / (u16Fmodulation) ) * 10000) / ((MS_U32)u32PLL_SET) ) ;
4992 
4993     // Set STEP
4994     if(u16Rdeviation > 300)
4995         u16Rdeviation = 300;
4996     u16Step = ((MS_U32)u32PLL_SET*u16Rdeviation) / ((MS_U32)u16Span*10000);
4997 
4998     W2BYTE(L_BK_LPLL(0x4E), u16Step & 0x0FFF);// LPLL_STEP
4999     W2BYTE(L_BK_LPLL(0x4F), u16Span & 0x3FFF);// LPLL_SPAN
5000     W2BYTEMSK((L_BK_LPLL(0x4E)), (bEnable << 15), BIT(15)); // Enable ssc
5001 
5002 
5003     return TRUE;
5004 }
5005 
MHal_PNL_SetOSDSSC_En(void * pInstance,MS_BOOL bEnable)5006 void MHal_PNL_SetOSDSSC_En(void *pInstance, MS_BOOL bEnable)
5007 {
5008     //printf("bEnable = %d\n", bEnable);
5009     MHal_PNL_Switch_LPLL_SubBank(pInstance, 0x00);
5010     W2BYTEMSK((L_BK_LPLL(0x4E)), (bEnable << 15), BIT(15)); // Enable ssc
5011 }
5012 
MHal_PNL_Set_T3D_Setting(void * pInstance)5013 void MHal_PNL_Set_T3D_Setting(void *pInstance)
5014 {
5015     PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
5016     PNL_RESOURCE_PRIVATE* pPNLResourcePrivate = NULL;
5017     UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
5018     UtopiaResourceGetPrivate(g_pPNLResource[PNL_GET_INTERNAL_POOL_ID(pPNLInstancePrivate->u32DeviceID)],(void**)(&pPNLResourcePrivate));
5019 
5020     SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK63_55_L, pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16Width, 0x1FFF);//pixel width
5021     SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK63_66_L, pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16Height, 0x1FFF);//reg_col_height
5022     SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK63_51_L, pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16Width, 0x1FFF);//reg_ln_width
5023     SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK63_52_L, pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16Height, 0x1FFF);//reg_col_height
5024     SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK62_61_L, pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16Width, 0x3FFF);//reg_ln_width
5025     SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK62_62_L, pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16Height, 0x1FFF);//reg_col_height
5026 
5027     //per designer, should always enable t3d, since it will affect osd/video's pipeline
5028     SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK63_61_L, BIT(0), BIT(0));//Enable Depth Render, for osd pipe line adjustment
5029     SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK62_08_L, BIT(4), BIT(4));//mtv bypass mode
5030     SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK63_57_L,(BIT(0)|BIT(1)),(BIT(0)|BIT(1)));//T3D fix subde enable, fix for T3D/PIP conflict issue (bit 0)     Bug Fix miu eco (bit 1)
5031 
5032     SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK62_63_L, 0x00, BIT(0)); // default disable T3D SRAM
5033 }
5034 
MHal_PNL_Set_Device_Bank_Offset(void * pInstance)5035 void MHal_PNL_Set_Device_Bank_Offset(void *pInstance)
5036 {
5037     UNUSED(pInstance);
5038     memset(u32PNL_XCDeviceBankOffset, 0, sizeof(MS_U32)*E_PNL_DEVICE_ID_NUM);
5039     u32PNL_XCDeviceBankOffset[E_PNL_DEVICE_ID_0] = E_HALPNL_DEVICE0_XC_BANK_OFFSET; // Set SC0 reg bank offset
5040     u32PNL_XCDeviceBankOffset[E_PNL_DEVICE_ID_1] = E_HALPNL_DEVICE1_XC_BANK_OFFSET; // Set SC2 reg bank offset
5041 }
5042 
MHal_PNL_Init(void * pInstance)5043 void MHal_PNL_Init(void *pInstance)
5044 {
5045     // Do nothing
5046     //UNUSED(pInstance);
5047     PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
5048     UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
5049 
5050     // STGEN reset
5051     SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK68_50_L, BIT(3), BIT(3));
5052 }
5053 
MHal_PNL_Bringup(void * pInstance)5054 void MHal_PNL_Bringup(void *pInstance)
5055 {
5056     PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
5057     PNL_RESOURCE_PRIVATE* pPNLResourcePrivate = NULL;
5058     UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
5059     UtopiaResourceGetPrivate(g_pPNLResource[PNL_GET_INTERNAL_POOL_ID(pPNLInstancePrivate->u32DeviceID)],(void**)(&pPNLResourcePrivate));
5060 
5061     ///patch for bring up
5062     if(pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type == E_PNL_TYPE_LVDS)
5063     {
5064     }
5065     else if(pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type == E_PNL_LPLL_VBY1_10BIT_8LANE)
5066     {
5067     }
5068 
5069 }
5070 
MHal_PNL_GetPanelVStart(void)5071 MS_U16 MHal_PNL_GetPanelVStart(void)
5072 {
5073     return 8;
5074 }
5075 
MHal_PNL_Check_VBY1_Handshake_Status(void * pInstance)5076 MS_BOOL MHal_PNL_Check_VBY1_Handshake_Status(void *pInstance)
5077 {
5078     if(MOD_R2BYTEMSK(REG_MOD_BK00_60_L, 0x0FFF) != 0xFAE)
5079     {
5080         //printf("VBY1 handshake return because the reg value is 0x%u, not 0xFAE.\n", MOD_R2BYTEMSK(REG_MOD_BK00_60_L, 0x0FFF));
5081         return FALSE;
5082     }
5083     else
5084     {
5085         //printf("VBY handshake check success.\n");
5086         return TRUE;
5087     }
5088 }
5089 
MHal_PNL_ChannelFIFOPointerADjust(void * pInstance)5090 void MHal_PNL_ChannelFIFOPointerADjust(void *pInstance)
5091 {
5092 //do not support in Maserati
5093 }
5094 
MHal_PNL_VBY1_Hardware_TrainingMode_En(void * pInstance,MS_BOOL bIsVideoMode,MS_BOOL bEnable)5095 void MHal_PNL_VBY1_Hardware_TrainingMode_En(void *pInstance, MS_BOOL bIsVideoMode ,MS_BOOL bEnable)
5096 {
5097     if(bIsVideoMode)
5098     {
5099         if(bEnable)
5100         {
5101             MOD_W2BYTE(REG_MOD_BK00_60_L, 0x0AAE);
5102         }
5103         else
5104         {
5105             MOD_W2BYTE(REG_MOD_BK00_60_L, 0x0AA6);
5106         }
5107     }
5108     else
5109     {
5110         if(bEnable)
5111         {
5112             MOD_W2BYTE(REG_MOD_BK00_59_L, 0x0AAE);
5113         }
5114         else
5115         {
5116             MOD_W2BYTE(REG_MOD_BK00_59_L, 0x0AA6);
5117         }
5118     }
5119 }
5120 
MHal_PNL_VBY1_IsSupport_Hardware_TrainingMode(void * pInstance)5121 MS_BOOL MHal_PNL_VBY1_IsSupport_Hardware_TrainingMode(void *pInstance)
5122 {
5123     #ifdef SUPPORT_VBY1_HWTRAINING_MODE
5124         return TRUE;
5125     #else
5126         return FALSE;
5127     #endif
5128 }
5129 
MHal_PNL_TCON_Patch(void)5130 void MHal_PNL_TCON_Patch(void)
5131 {
5132     // MOD sw reset
5133     MOD_W2BYTEMSK(REG_MOD_BK00_00_L, 0x0000, BIT(0)); //sw reset
5134     MOD_W2BYTEMSK(REG_MOD_BK00_2E_L, 0x0000, BIT(10)); //[10]enable osd lvds path
5135     MOD_W2BYTEMSK(REG_MOD_BK00_54_L, 0x0000, BIT(14));
5136     MOD_W2BYTEMSK(REG_MOD_BK00_51_L, 0x0000, (BIT(2)|BIT(3)|BIT(4)) );
5137 
5138     MOD_W2BYTEMSK(REG_MOD_BK00_00_L, BIT(0), BIT(0)); //sw reset
5139 
5140 
5141     // Setting TCON signal through MOD PAD
5142     MOD_A_W2BYTE(REG_MOD_A_BK00_6A_L,0x1818);
5143     MOD_A_W2BYTE(REG_MOD_A_BK00_6A_L,0x9818);
5144     MOD_A_W2BYTE(REG_MOD_A_BK00_6A_L,0x0000);
5145     MOD_A_W2BYTE(REG_MOD_A_BK00_6A_L,0x1928);
5146     MOD_A_W2BYTE(REG_MOD_A_BK00_6A_L,0x9928);
5147     MOD_A_W2BYTE(REG_MOD_A_BK00_6A_L,0x0000);
5148     MOD_A_W2BYTE(REG_MOD_A_BK00_6A_L,0x1a38);
5149     MOD_A_W2BYTE(REG_MOD_A_BK00_6A_L,0x9a38);
5150     MOD_A_W2BYTE(REG_MOD_A_BK00_6A_L,0x0000);
5151     MOD_A_W2BYTE(REG_MOD_A_BK00_6A_L,0x1b78);
5152     MOD_A_W2BYTE(REG_MOD_A_BK00_6A_L,0x9b78);
5153     MOD_A_W2BYTE(REG_MOD_A_BK00_6A_L,0x0000);
5154 }
5155 
_Hal_MOD_External_eFuse(void)5156 static MS_BOOL _Hal_MOD_External_eFuse(void)
5157 {
5158 #ifdef MOD_EFUSE_IN_MBOOT
5159     return TRUE;
5160 #else
5161     return FALSE;
5162 #endif
5163 }
5164 
_Hal_MOD_VB1_CH_SWICH(PNL_TYPE eLPLL_Type_Ext)5165 static void _Hal_MOD_VB1_CH_SWICH(PNL_TYPE eLPLL_Type_Ext)
5166 {
5167     //SC4 7C[11]:reg_vby1_4ch / enable 4ch vx1mode
5168     //SC4 7C[12]:reg_vby1_16v4o / vby1 16 vedio 4 osd mode
5169     //SC4 7C[13]:reg_vby1_8v4o_mode / vby1 8 vedio 4 osd mode
5170     //SC4 7C[14]:reg_vby1_8ch / enable 8ch vx1mode
5171     //SC4 7C[15]:reg_vby1_16ch / enable 16ch vx1mode
5172     if( (eLPLL_Type_Ext == E_PNL_LPLL_VBY1_10BIT_4LANE) || (eLPLL_Type_Ext == E_PNL_LPLL_VBY1_8BIT_4LANE) )
5173     {// 4 lane
5174         MOD_W2BYTEMSK(REG_MOD_BK00_7C_L, BIT(11), 0xF800);
5175     }
5176     else if( (eLPLL_Type_Ext == E_PNL_LPLL_VBY1_10BIT_8LANE) || (eLPLL_Type_Ext == E_PNL_LPLL_VBY1_8BIT_8LANE) )
5177     {// 8 lane
5178         MOD_W2BYTEMSK(REG_MOD_BK00_7C_L, BIT(14), 0xF800);
5179     }
5180     else if( (eLPLL_Type_Ext == E_PNL_LPLL_VBY1_10BIT_16LANE) || (eLPLL_Type_Ext == E_PNL_LPLL_VBY1_8BIT_16LANE) )
5181     {// 16 lane
5182         MOD_W2BYTEMSK(REG_MOD_BK00_7C_L, BIT(15), 0xF800);
5183     }
5184     else
5185     {// 2 lane
5186         MOD_W2BYTEMSK(REG_MOD_BK00_7C_L, 0x0000, 0xF800);
5187     }
5188 }
5189 
_Hal_MOD_Refine_ICON(MS_U16 u16ICON)5190 static MS_U16 _Hal_MOD_Refine_ICON(MS_U16 u16ICON)
5191 {
5192     MS_U16 u16ICON_L = (u16ICON & 0x00FF);
5193     MS_U16 u16ICON_H = ((u16ICON & 0xFF00)>>8);
5194     MS_U16 u16Result = 0;
5195     if( (u16ICON_L > MOD_LVDS_ICON_HIGH_LIMIT) || (u16ICON_L < MOD_LVDS_ICON_LOW_LIMIT) )
5196     {
5197         u16Result = MOD_LVDS_ICON_DEFAULT;
5198     }
5199     else
5200     {
5201         u16Result = u16ICON_L;
5202     }
5203 
5204     if( (u16ICON_H > MOD_LVDS_ICON_HIGH_LIMIT) || (u16ICON_H < MOD_LVDS_ICON_LOW_LIMIT) )
5205     {
5206         u16Result |= (MOD_LVDS_ICON_DEFAULT<<8);
5207     }
5208     else
5209     {
5210         u16Result |= (u16ICON_H<<8);
5211     }
5212     return u16Result;
5213 }
5214 
_MHal_PNL_DumpVideoClkTable(MS_U8 u8CLKTblIndex)5215 static void _MHal_PNL_DumpVideoClkTable(MS_U8 u8CLKTblIndex)
5216 {
5217     // step1. load CLK GEN0 table
5218     if (u8CLKTblIndex == E_PNL_SUPPORTED_CLK_MAX)
5219     {
5220         printf("[%s,%5d] Unspported LPLL Type, skip LPLL setting\n",__FUNCTION__,__LINE__);
5221         return;
5222     }
5223 
5224     int indexCounter = 0;
5225 
5226     for(indexCounter = 0 ; indexCounter<CLK_GEN0_REG_VIDEO_NUM; indexCounter++)
5227     {
5228         if (CLKGEN0SettingTBL_Video[u8CLKTblIndex][indexCounter].address == 0xFF) //delay in micro second
5229         {
5230             MsOS_DelayTaskUs(CLKGEN0SettingTBL_Video[u8CLKTblIndex][indexCounter].value);
5231             continue; // step forward to next register setting.
5232         }
5233 
5234         W2BYTEMSK(L_CLKGEN0(CLKGEN0SettingTBL_Video[u8CLKTblIndex][indexCounter].address),
5235                   CLKGEN0SettingTBL_Video[u8CLKTblIndex][indexCounter].value,
5236                   CLKGEN0SettingTBL_Video[u8CLKTblIndex][indexCounter].mask);
5237     }
5238     PNL_DBG(PNL_DBGLEVEL_INIT, "[%s][%d]LPLLTblIndex=%u\n", __FUNCTION__, __LINE__, u8CLKTblIndex);
5239 
5240     // step2. load CLK GEN2 table
5241     if (u8CLKTblIndex == E_PNL_SUPPORTED_CLK_MAX)
5242     {
5243         printf("[%s,%5d] Unspported LPLL Type, skip LPLL setting\n",__FUNCTION__,__LINE__);
5244         return;
5245     }
5246 
5247     for(indexCounter = 0 ; indexCounter<CLK_GEN2_REG_VIDEO_NUM; indexCounter++)
5248     {
5249         if (CLKGEN2SettingTBL_Video[u8CLKTblIndex][indexCounter].address == 0xFF) //delay in micro second
5250         {
5251             MsOS_DelayTaskUs(CLKGEN2SettingTBL_Video[u8CLKTblIndex][indexCounter].value);
5252             continue; // step forward to next register setting.
5253         }
5254 
5255         W2BYTEMSK(L_CLKGEN2(CLKGEN2SettingTBL_Video[u8CLKTblIndex][indexCounter].address),
5256                   CLKGEN2SettingTBL_Video[u8CLKTblIndex][indexCounter].value,
5257                   CLKGEN2SettingTBL_Video[u8CLKTblIndex][indexCounter].mask);
5258     }
5259     PNL_DBG(PNL_DBGLEVEL_INIT, "[%s][%d]LPLLTblIndex=%u\n", __FUNCTION__, __LINE__, u8CLKTblIndex);
5260 }
5261 
_MHal_PNL_DumpOSDClkTable(MS_U8 u8CLKTblIndex)5262 static void _MHal_PNL_DumpOSDClkTable(MS_U8 u8CLKTblIndex)
5263 {
5264     // step1. load CLK GEN0 table
5265     if (u8CLKTblIndex == E_PNL_SUPPORTED_CLK_MAX)
5266     {
5267         printf("[%s,%5d] Unspported LPLL Type, skip LPLL setting\n",__FUNCTION__,__LINE__);
5268         return;
5269     }
5270 
5271     int indexCounter = 0;
5272 
5273     for(indexCounter = 0 ; indexCounter<CLK_GEN0_REG_OSD_NUM; indexCounter++)
5274     {
5275         if (CLKGEN0SettingTBL_OSD[u8CLKTblIndex][indexCounter].address == 0xFF) //delay in micro second
5276         {
5277             MsOS_DelayTaskUs(CLKGEN0SettingTBL_OSD[u8CLKTblIndex][indexCounter].value);
5278             continue; // step forward to next register setting.
5279         }
5280 
5281         W2BYTEMSK(L_CLKGEN0(CLKGEN0SettingTBL_OSD[u8CLKTblIndex][indexCounter].address),
5282                   CLKGEN0SettingTBL_OSD[u8CLKTblIndex][indexCounter].value,
5283                   CLKGEN0SettingTBL_OSD[u8CLKTblIndex][indexCounter].mask);
5284     }
5285     PNL_DBG(PNL_DBGLEVEL_INIT, "[%s][%d]LPLLTblIndex=%u\n", __FUNCTION__, __LINE__, u8CLKTblIndex);
5286 
5287     // step2. load CLK GEN2 table
5288     if (u8CLKTblIndex == E_PNL_SUPPORTED_CLK_MAX)
5289     {
5290         printf("[%s,%5d] Unspported LPLL Type, skip LPLL setting\n",__FUNCTION__,__LINE__);
5291         return;
5292     }
5293 
5294     for(indexCounter = 0 ; indexCounter<CLK_GEN2_REG_OSD_NUM; indexCounter++)
5295     {
5296         if (CLKGEN2SettingTBL_OSD[u8CLKTblIndex][indexCounter].address == 0xFF) //delay in micro second
5297         {
5298             MsOS_DelayTaskUs(CLKGEN2SettingTBL_OSD[u8CLKTblIndex][indexCounter].value);
5299             continue; // step forward to next register setting.
5300         }
5301 
5302         W2BYTEMSK(L_CLKGEN2(CLKGEN2SettingTBL_OSD[u8CLKTblIndex][indexCounter].address),
5303                   CLKGEN2SettingTBL_OSD[u8CLKTblIndex][indexCounter].value,
5304                   CLKGEN2SettingTBL_OSD[u8CLKTblIndex][indexCounter].mask);
5305     }
5306     PNL_DBG(PNL_DBGLEVEL_INIT, "[%s][%d]LPLLTblIndex=%u\n", __FUNCTION__, __LINE__, u8CLKTblIndex);
5307 }
5308 
_MHal_Transfer_PanelType_To_CLKType(PNL_TYPE eLPLL_Type,PNL_MODE eLPLL_Mode)5309 static E_PNL_SUPPORTED_CLK_TYPE _MHal_Transfer_PanelType_To_CLKType(PNL_TYPE eLPLL_Type, PNL_MODE eLPLL_Mode)
5310 {
5311     E_PNL_SUPPORTED_CLK_TYPE eCLKTypeResult = E_PNL_SUPPORTED_CLK_TTL;
5312 
5313     switch(eLPLL_Type)
5314     {
5315         case E_PNL_TYPE_TTL:
5316             eCLKTypeResult = E_PNL_SUPPORTED_CLK_TTL;
5317         break;
5318 
5319         case E_PNL_TYPE_LVDS:
5320             if(eLPLL_Mode == E_PNL_MODE_SINGLE)
5321                 eCLKTypeResult = E_PNL_SUPPORTED_CLK_LVDS_1CH;
5322             else
5323                 eCLKTypeResult = E_PNL_SUPPORTED_CLK_LVDS_2CH;
5324         break;
5325 
5326         case E_PNL_TYPE_HS_LVDS:
5327             if(eLPLL_Mode == E_PNL_MODE_SINGLE)
5328                 eCLKTypeResult = E_PNL_SUPPORTED_CLK_HS_LVDS_1CH;
5329             else
5330                 eCLKTypeResult = E_PNL_SUPPORTED_CLK_HS_LVDS_2CH;
5331         break;
5332 
5333         case E_PNL_LPLL_VBY1_10BIT_16LANE:
5334             eCLKTypeResult = E_PNL_SUPPORTED_CLK_VBY1_16CH_10BIT;
5335         break;
5336 
5337         case E_PNL_LPLL_VBY1_8BIT_16LANE:
5338             eCLKTypeResult = E_PNL_SUPPORTED_CLK_VBY1_16CH_8BIT;
5339         break;
5340 
5341         case E_PNL_LPLL_VBY1_10BIT_8LANE:
5342             eCLKTypeResult = E_PNL_SUPPORTED_CLK_VBY1_8CH_10BIT;
5343         break;
5344 
5345         case E_PNL_LPLL_VBY1_8BIT_8LANE:
5346             eCLKTypeResult = E_PNL_SUPPORTED_CLK_VBY1_8CH_8BIT;
5347         break;
5348 
5349         case E_PNL_LPLL_VBY1_10BIT_4LANE:
5350             eCLKTypeResult = E_PNL_SUPPORTED_CLK_VBY1_4CH_10BIT;
5351         break;
5352 
5353         case E_PNL_LPLL_VBY1_8BIT_4LANE:
5354             eCLKTypeResult = E_PNL_SUPPORTED_CLK_VBY1_4CH_8BIT;
5355         break;
5356 
5357         case E_PNL_LPLL_VBY1_10BIT_2LANE:
5358             eCLKTypeResult = E_PNL_SUPPORTED_CLK_VBY1_2CH_10BIT;
5359         break;
5360 
5361         case E_PNL_LPLL_VBY1_8BIT_2LANE:
5362             eCLKTypeResult = E_PNL_SUPPORTED_CLK_VBY1_2CH_8BIT;
5363         break;
5364 
5365         case E_PNL_LPLL_VBY1_10BIT_1LANE:
5366             eCLKTypeResult = E_PNL_SUPPORTED_CLK_VBY1_1CH_10BIT;
5367         break;
5368 
5369         case E_PNL_LPLL_VBY1_8BIT_1LANE:
5370             eCLKTypeResult = E_PNL_SUPPORTED_CLK_VBY1_1CH_8BIT;
5371         break;
5372 
5373         default:
5374             eCLKTypeResult = E_PNL_SUPPORTED_CLK_TTL;
5375         break;
5376     }
5377     return eCLKTypeResult;
5378 }
5379 
_MHal_Transfer_PanelType_To_CLKType_OSD(PNL_TYPE eLPLL_OSD_Type,PNL_TYPE eLPLL_Video_Type,PNL_MODE eLPLL_Mode)5380 static E_PNL_SUPPORTED_CLK_TYPE _MHal_Transfer_PanelType_To_CLKType_OSD(PNL_TYPE eLPLL_OSD_Type,PNL_TYPE eLPLL_Video_Type,PNL_MODE eLPLL_Mode)
5381 {
5382     E_PNL_SUPPORTED_CLK_TYPE eCLKTypeResult = E_PNL_SUPPORTED_CLK_VBY1_8V4O_10BIT;
5383 
5384     switch(eLPLL_OSD_Type)
5385     {
5386         case E_PNL_LPLL_VBY1_10BIT_4LANE:
5387             eCLKTypeResult = E_PNL_SUPPORTED_CLK_VBY1_8V4O_10BIT;
5388         break;
5389 
5390         case E_PNL_LPLL_VBY1_8BIT_4LANE:
5391             eCLKTypeResult = E_PNL_SUPPORTED_CLK_VBY1_8V4O_8BIT;
5392         break;
5393 
5394         case E_PNL_LPLL_VBY1_10BIT_2LANE:
5395             eCLKTypeResult = E_PNL_SUPPORTED_CLK_VBY1_4V2O_10BIT;
5396         break;
5397 
5398         case E_PNL_LPLL_VBY1_8BIT_2LANE:
5399             eCLKTypeResult = E_PNL_SUPPORTED_CLK_VBY1_4V2O_8BIT;
5400         break;
5401 
5402         default:
5403             eCLKTypeResult = _MHal_Transfer_PanelType_To_CLKType(eLPLL_Video_Type, eLPLL_Mode);
5404         break;
5405     }
5406     return eCLKTypeResult;
5407 }
5408 
5409 #define HALFLINE_PIXEL_ALIGN 16
5410 
_MHal_PNL_Init_MFT(void * pInstance,PNL_InitData * pstPanelInitData)5411 static void _MHal_PNL_Init_MFT(void *pInstance, PNL_InitData *pstPanelInitData)
5412 {
5413     PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
5414     PNL_RESOURCE_PRIVATE* pPNLResourcePrivate = NULL;
5415     UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
5416     UtopiaResourceGetPrivate(g_pPNLResource[PNL_GET_INTERNAL_POOL_ID(pPNLInstancePrivate->u32DeviceID)],(void**)(&pPNLResourcePrivate));
5417 
5418     MS_BOOL bMFTenable = TRUE;
5419     MS_U16 u16halfline_pixel = 0;   //Half line pixel number of active
5420 
5421     if( (pstPanelInitData->eLPLL_Type_Ext == E_PNL_LPLL_VBY1_10BIT_16LANE) || (pstPanelInitData->eLPLL_Type_Ext == E_PNL_LPLL_VBY1_8BIT_16LANE) )
5422     {
5423         if(pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16MOD_CTRLA & BIT(1))
5424         {
5425             // vby1 16 lane 4 division, open
5426             bMFTenable = TRUE;
5427         }
5428         else
5429         {
5430             // vby1 16 lane 2 division, close
5431             bMFTenable = FALSE;
5432         }
5433     }
5434     else if( (IsVBY1(pstPanelInitData->eLPLL_Type_Ext)) &&
5435              (pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16MOD_CTRLA & BIT(1)) )
5436     {
5437         // vby1 1 lane / 2 lane / 4 lane / 8 lane 2 Divisoin, close
5438         bMFTenable = FALSE;
5439     }
5440     else
5441     {
5442         // case1. single LVDS : 4P->1P, so open
5443         // case2. vby1 1/4/8 division: format be changed, so need to open MFT
5444         // case3. dual LVDS / TCON : 4P->1P, so open
5445         bMFTenable = TRUE;
5446     }
5447 
5448     if(bMFTenable)
5449     {
5450         // MFT setting
5451         // MFT reg00[11:0] reg_halfline: Half line pixel number of active(from 0)
5452         // 1/2/4 division: hde/4 - 1
5453         // 8 division: hde/8 -1
5454 
5455         ///Maserati is 4P mode and the half line pixel align is 16
5456         if(pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16Width % HALFLINE_PIXEL_ALIGN)
5457         {
5458             u16halfline_pixel = ((pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16Width + (HALFLINE_PIXEL_ALIGN-1))/HALFLINE_PIXEL_ALIGN * HALFLINE_PIXEL_ALIGN)/4 -1;
5459         }
5460         else
5461             u16halfline_pixel = pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16Width/4 -1;
5462 
5463         if( (pstPanelInitData->eLPLL_Type_Ext == E_PNL_LPLL_VBY1_10BIT_16LANE)||
5464             (pstPanelInitData->eLPLL_Type_Ext == E_PNL_LPLL_VBY1_8BIT_16LANE )||
5465             (pstPanelInitData->eLPLL_Type_Ext == E_PNL_LPLL_VBY1_10BIT_8LANE)||
5466             (pstPanelInitData->eLPLL_Type_Ext == E_PNL_LPLL_VBY1_8BIT_8LANE )||
5467             (pstPanelInitData->eLPLL_Type_Ext == E_PNL_LPLL_VBY1_10BIT_4LANE)||
5468             (pstPanelInitData->eLPLL_Type_Ext == E_PNL_LPLL_VBY1_8BIT_4LANE ))
5469         {// 4k2k
5470             W2BYTEMSK(REG_MFT_00_L, u16halfline_pixel, 0x0FFF);   // half_line = hde/4-1 = 3840 / 4 - 1 = 959
5471         }
5472         else
5473         {// fullHD
5474             W2BYTEMSK(REG_MFT_00_L, u16halfline_pixel, 0x0FFF);   // half_line = hde/16-1 = 1920 / 16 - 1 = 479
5475         }
5476 
5477         // MFT reg01[4] reg_1ch_lvds: 1ch lvds mux
5478         if( ((pstPanelInitData->eLPLL_Type == E_PNL_TYPE_LVDS)&&(pstPanelInitData->eLPLL_Mode==E_PNL_MODE_SINGLE)) ||
5479             (pstPanelInitData->eLPLL_Type == E_PNL_TYPE_TTL) ||
5480             (pstPanelInitData->eLPLL_Type_Ext == E_PNL_LPLL_VBY1_10BIT_1LANE) ||
5481             (pstPanelInitData->eLPLL_Type_Ext == E_PNL_LPLL_VBY1_8BIT_1LANE))
5482         {
5483             // single LVDS / TTL / vby1 1lane is one ch, so open
5484             W2BYTEMSK(REG_MFT_01_L, BIT(4), BIT(4));
5485         }
5486         else
5487         {
5488             W2BYTEMSK(REG_MFT_01_L, 0x0000, BIT(4));
5489         }
5490 
5491         // MFT reg01[3..0] reg_dout_sel: Data output select
5492         if( (pstPanelInitData->eLPLL_Type_Ext == E_PNL_LPLL_VBY1_10BIT_16LANE)||
5493             (pstPanelInitData->eLPLL_Type_Ext == E_PNL_LPLL_VBY1_8BIT_16LANE )||
5494             (pstPanelInitData->eLPLL_Type_Ext == E_PNL_LPLL_VBY1_10BIT_8LANE)||
5495             (pstPanelInitData->eLPLL_Type_Ext == E_PNL_LPLL_VBY1_8BIT_8LANE )||
5496             (pstPanelInitData->eLPLL_Type_Ext == E_PNL_LPLL_VBY1_10BIT_4LANE)||
5497             (pstPanelInitData->eLPLL_Type_Ext == E_PNL_LPLL_VBY1_8BIT_4LANE ) )
5498         {
5499             // 4p -> 4p, so close
5500             W2BYTEMSK(REG_MFT_01_L, 0x0000, BIT(0));
5501         }
5502         else
5503         {
5504             //case1. 4p->2p, so open
5505             //case2. 4p->1p, so open
5506             W2BYTEMSK(REG_MFT_01_L, BIT(0), BIT(0));
5507         }
5508 
5509         // MFT reg03[15..14] reg_mode: mode of pixel sequence, 0:LR2OE, 1:LR2LRGB, 2:OE2LR
5510         // if 4 division, then MFT reg03[15:14]=2'b10, other default=2'b00
5511 
5512         // MFT reg03[11] reg_2ch_lvds: 2ch lvds mux
5513         if( (pstPanelInitData->eLPLL_Type_Ext == E_PNL_LPLL_VBY1_10BIT_16LANE)||
5514             (pstPanelInitData->eLPLL_Type_Ext == E_PNL_LPLL_VBY1_8BIT_16LANE )||
5515             (pstPanelInitData->eLPLL_Type_Ext == E_PNL_LPLL_VBY1_10BIT_8LANE)||
5516             (pstPanelInitData->eLPLL_Type_Ext == E_PNL_LPLL_VBY1_8BIT_8LANE )||
5517             (pstPanelInitData->eLPLL_Type_Ext == E_PNL_LPLL_VBY1_10BIT_4LANE)||
5518             (pstPanelInitData->eLPLL_Type_Ext == E_PNL_LPLL_VBY1_8BIT_4LANE ) )
5519         {
5520             // 4p -> 4p, so close
5521             W2BYTEMSK(REG_MFT_03_L, 0x0000, BIT(11));
5522         }
5523         else
5524         {
5525             //case1. 4p->2p, so open
5526             //case2. 4p->1p, so open
5527             if( ((pstPanelInitData->eLPLL_Type == E_PNL_TYPE_LVDS)&&(pstPanelInitData->eLPLL_Mode==E_PNL_MODE_SINGLE)) ||
5528                 (pstPanelInitData->eLPLL_Type == E_PNL_TYPE_TTL) ||
5529                 (pstPanelInitData->eLPLL_Type_Ext == E_PNL_LPLL_VBY1_10BIT_1LANE) ||
5530                 (pstPanelInitData->eLPLL_Type_Ext == E_PNL_LPLL_VBY1_8BIT_1LANE) )
5531             {
5532                 // single LVDS / TTL / vby1 1lane is one ch, so close
5533                 W2BYTEMSK(REG_MFT_03_L, 0x00, BIT(11));
5534             }
5535             else
5536             {
5537                 W2BYTEMSK(REG_MFT_03_L, BIT(11), BIT(11));
5538             }
5539         }
5540 
5541         if( (pstPanelInitData->eLPLL_Type_Ext == E_PNL_LPLL_VBY1_10BIT_16LANE) || (pstPanelInitData->eLPLL_Type_Ext == E_PNL_LPLL_VBY1_8BIT_16LANE) )
5542         {
5543             // 1 / 2 / 8 division
5544             if(pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16MOD_CTRLA & BIT(1))
5545             {
5546                 // vby1 16 lane 4 division
5547                 W2BYTEMSK(REG_MFT_03_L, BIT(15), (BIT(15) | BIT(14)));
5548             }
5549         }
5550     }
5551 
5552 
5553     // rule: for TCON, if MFT 03[10]=1 , then we have to set MFT 02[11:0]
5554     // BUT script:MFT reg02[11..0] reg_vst_dly: control delay value
5555     if(pstPanelInitData->eLPLL_Type == E_PNL_TYPE_LVDS)
5556     {
5557         W2BYTEMSK(REG_MFT_02_L, 0x000F, 0x0FFF);
5558     }
5559 
5560     // MFT reg01[15] reg_mft_lb_en: Enable mft for format translate
5561     if(bMFTenable)
5562     {
5563         W2BYTEMSK(REG_MFT_01_L, BIT(15), BIT(15));
5564     }
5565     else
5566     {
5567         W2BYTEMSK(REG_MFT_01_L, 0x0000, BIT(15));
5568     }
5569 
5570 }
5571 
_MHal_PNL_Get_LaneNum(void * pInstance)5572 static MS_U8 _MHal_PNL_Get_LaneNum(void *pInstance)
5573 {
5574     PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
5575     PNL_RESOURCE_PRIVATE* pPNLResourcePrivate = NULL;
5576     UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
5577     UtopiaResourceGetPrivate(g_pPNLResource[PNL_GET_INTERNAL_POOL_ID(pPNLInstancePrivate->u32DeviceID)],(void**)(&pPNLResourcePrivate));
5578 
5579     MS_U8 u8LaneNum = 0;
5580     //check lane num
5581     if((pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type_Ext == E_PNL_LPLL_VBY1_10BIT_16LANE)
5582      ||(pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type_Ext == E_PNL_LPLL_VBY1_8BIT_16LANE))
5583     {
5584         u8LaneNum = 16;
5585     }
5586     else if((pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type_Ext == E_PNL_LPLL_VBY1_10BIT_8LANE)
5587      ||(pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type_Ext == E_PNL_LPLL_VBY1_8BIT_8LANE))
5588     {
5589         u8LaneNum = 8;
5590     }
5591     else if((pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type_Ext == E_PNL_LPLL_VBY1_10BIT_4LANE)
5592           ||(pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type_Ext == E_PNL_LPLL_VBY1_8BIT_4LANE))
5593     {
5594         u8LaneNum = 4;
5595     }
5596     else if((pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type_Ext == E_PNL_LPLL_VBY1_10BIT_2LANE)
5597           ||(pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type_Ext == E_PNL_LPLL_VBY1_8BIT_2LANE))
5598     {
5599         u8LaneNum = 2;
5600     }
5601     else if((pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type_Ext == E_PNL_LPLL_VBY1_10BIT_1LANE)
5602           ||(pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type_Ext == E_PNL_LPLL_VBY1_8BIT_1LANE))
5603     {
5604         u8LaneNum = 1;
5605     }
5606     else
5607     {
5608         u8LaneNum = 0;
5609     }
5610     return u8LaneNum;
5611 }
5612 
5613 
_MHal_PNL_Auto_Set_Config(void * pInstance,MS_U16 u16OutputOrder0_3,MS_U16 u16OutputOrder4_7,MS_U16 u16OutputOrder8_11,MS_U16 u16OutputOrder12_15)5614 static void _MHal_PNL_Auto_Set_Config(void *pInstance,
5615                                       MS_U16 u16OutputOrder0_3,
5616                                       MS_U16 u16OutputOrder4_7,
5617                                       MS_U16 u16OutputOrder8_11,
5618                                       MS_U16 u16OutputOrder12_15)
5619 {
5620     //attention : This function just support vby1 now.
5621     PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
5622     PNL_RESOURCE_PRIVATE* pPNLResourcePrivate = NULL;
5623     UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
5624     UtopiaResourceGetPrivate(g_pPNLResource[PNL_GET_INTERNAL_POOL_ID(pPNLInstancePrivate->u32DeviceID)],(void**)(&pPNLResourcePrivate));
5625 
5626 
5627     MS_U8   u8OutputConfigCount = 0;
5628     MS_U16  u16Config =0;
5629     MS_U8   u8Count = 0;
5630     MS_U8   u8LaneNum = 0;
5631     MS_BOOL bSkip = TRUE;
5632     MS_U16   u16LaneLimit = 0;
5633 
5634     //check lane num
5635     u8LaneNum = _MHal_PNL_Get_LaneNum(pInstance);
5636     if(u8LaneNum!=0)
5637     {
5638         bSkip = FALSE;
5639     }
5640     else
5641     {
5642         bSkip = TRUE;
5643 
5644         //use default config
5645         MHal_Output_LVDS_Pair_Setting(pInstance,
5646                                       pPNLResourcePrivate->sthalPNL._u8MOD_LVDS_Pair_Type,
5647                                       pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputCFG0_7,
5648                                       pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputCFG8_15,
5649                                       pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputCFG16_21);
5650     }
5651 
5652     //set Lane Limit in 16 lane case
5653     if((pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type_Ext == E_PNL_LPLL_VBY1_10BIT_16LANE)
5654      ||(pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type_Ext == E_PNL_LPLL_VBY1_8BIT_16LANE))
5655     {
5656         // 16 lane
5657         u16LaneLimit = PINMAPPING_MAX_LANE + 1;
5658     }
5659     else
5660     {
5661         // 1 / 2 / 4 / 8 lane
5662         u16LaneLimit = PINMAPPING_MAX_LANE;
5663 
5664     }
5665 
5666     if(!bSkip)
5667     {
5668         //set output config
5669         u16Config = 0;
5670         u8OutputConfigCount = 0;
5671         for( u8Count = 0 ; u8Count < LANE_NUM_EACH_PINMAPPING_GROUP1 ; u8Count++ )
5672         {
5673             if( ( u16OutputOrder0_3 % PINMAPPING_EXP ) < u16LaneLimit)
5674             {
5675                 u16Config += CONFIG_FOR_VBY1_DATA<<u8OutputConfigCount;
5676             }
5677             u16OutputOrder0_3 = u16OutputOrder0_3 / PINMAPPING_EXP;
5678             u8OutputConfigCount += CONFIG_FOR_VBY1_DATA_BIT_NUM;
5679         }
5680         for( u8Count = 0 ; u8Count < LANE_NUM_EACH_PINMAPPING_GROUP2 ; u8Count++ )
5681         {
5682             if( (u16OutputOrder4_7 % PINMAPPING_EXP ) < u16LaneLimit)
5683             {
5684                 u16Config += CONFIG_FOR_VBY1_DATA<<u8OutputConfigCount;
5685             }
5686             u16OutputOrder4_7 = u16OutputOrder4_7 / PINMAPPING_EXP;
5687             u8OutputConfigCount += CONFIG_FOR_VBY1_DATA_BIT_NUM;
5688         }
5689         MOD_A_W2BYTE(REG_MOD_A_BK00_18_L, u16Config);
5690 
5691         u16Config =0;
5692         u8OutputConfigCount = 0;
5693         for( u8Count = 0 ; u8Count < LANE_NUM_EACH_PINMAPPING_GROUP3 ; u8Count++ )
5694         {
5695             if( (u16OutputOrder8_11 % PINMAPPING_EXP ) < u16LaneLimit)
5696             {
5697                 u16Config += CONFIG_FOR_VBY1_DATA<<u8OutputConfigCount;
5698             }
5699             u16OutputOrder8_11 = u16OutputOrder8_11 / PINMAPPING_EXP;
5700             u8OutputConfigCount += CONFIG_FOR_VBY1_DATA_BIT_NUM;
5701         }
5702         for( u8Count = 0 ; u8Count < LANE_NUM_EACH_PINMAPPING_GROUP4 ; u8Count++ )
5703         {
5704             if( (u16OutputOrder12_15 % PINMAPPING_EXP ) < u16LaneLimit)
5705             {
5706                 u16Config += CONFIG_FOR_VBY1_DATA<<u8OutputConfigCount;
5707             }
5708             u16OutputOrder12_15 = u16OutputOrder12_15 / PINMAPPING_EXP;
5709             u8OutputConfigCount += CONFIG_FOR_VBY1_DATA_BIT_NUM;
5710         }
5711         MOD_A_W2BYTE(REG_MOD_A_BK00_19_L, u16Config);
5712     }
5713 }
5714 
_MHal_PNL_Set_Clk(void * pInstance,MS_U8 Type,MS_U16 u16OutputOrder0_3,MS_U16 u16OutputOrder4_7,MS_U16 u16OutputOrder8_11,MS_U16 u16OutputOrder12_15)5715 static void _MHal_PNL_Set_Clk(void *pInstance,
5716                               MS_U8 Type,
5717                               MS_U16 u16OutputOrder0_3,
5718                               MS_U16 u16OutputOrder4_7,
5719                               MS_U16 u16OutputOrder8_11,
5720                               MS_U16 u16OutputOrder12_15)
5721 {
5722     PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
5723     PNL_RESOURCE_PRIVATE* pPNLResourcePrivate = NULL;
5724     UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
5725     UtopiaResourceGetPrivate(g_pPNLResource[PNL_GET_INTERNAL_POOL_ID(pPNLInstancePrivate->u32DeviceID)],(void**)(&pPNLResourcePrivate));
5726 
5727     if(Type == APIPNL_OUTPUT_CHANNEL_ORDER_USER )
5728     {
5729         MS_U8 u8Clk = 0;
5730         MS_U8   u8LaneNum = 0;
5731         MS_BOOL bSkip = TRUE;
5732         MS_U8   u8Count = 0;
5733         MS_U8   u8Count1 = 0;
5734         MS_U8   u8StartLane = 0;
5735         MS_U16   u16LaneLimit = 0;
5736 
5737         //check lane num
5738         u8LaneNum = _MHal_PNL_Get_LaneNum(pInstance);
5739         if(u8LaneNum!=0)
5740         {
5741             bSkip = FALSE;
5742         }
5743         else
5744         {
5745             MOD_A_W2BYTEMSK(REG_MOD_A_BK00_00_L, 0x1F, 0x1F); //open all clk
5746             bSkip = TRUE;
5747         }
5748 
5749         //set Lane Limit in 16 lane case
5750         if((pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type_Ext == E_PNL_LPLL_VBY1_10BIT_16LANE)
5751          ||(pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type_Ext == E_PNL_LPLL_VBY1_8BIT_16LANE))
5752         {
5753             // 16 lane
5754             u16LaneLimit = PINMAPPING_MAX_LANE + 1;
5755         }
5756         else
5757         {
5758             // 1 / 2 / 4 / 8 lane
5759             u16LaneLimit = PINMAPPING_MAX_LANE;
5760         }
5761 
5762         //count clk
5763         if(!bSkip)
5764         {
5765             u8Clk = 0;
5766             u8StartLane = 0;
5767             for( u8Count = u8StartLane ; u8Count < (u8StartLane+LANE_NUM_EACH_PINMAPPING_GROUP1) ; u8Count++ )
5768             {//lane 0 - lane 3
5769                 if( ( u16OutputOrder0_3 % PINMAPPING_EXP ) < u16LaneLimit)
5770                 {
5771                     u8Count1 = 0;
5772                     do
5773                     {
5774                         if(u8Count>=LANE_AND_CLK_TBL[u8Count1][0] && u8Count<=LANE_AND_CLK_TBL[u8Count1][1])
5775                         {
5776                             u8Clk |= LANE_AND_CLK_TBL[u8Count1][2];
5777                             break;
5778                         }
5779                         u8Count1 ++;
5780                     }
5781                     while(u8Count1<VBY1_CLK_TBL_ROW);
5782                 }
5783                 u16OutputOrder0_3 /= PINMAPPING_EXP;
5784             }
5785 
5786             u8StartLane = 4;
5787             for( u8Count = u8StartLane ; u8Count < (u8StartLane+LANE_NUM_EACH_PINMAPPING_GROUP2) ; u8Count++ )
5788             {//lane 4 - lane 7
5789                 if( ( u16OutputOrder4_7 % PINMAPPING_EXP ) < u16LaneLimit)
5790                 {
5791                     u8Count1 = 0;
5792                     do
5793                     {
5794                         if(u8Count>=LANE_AND_CLK_TBL[u8Count1][0] && u8Count<=LANE_AND_CLK_TBL[u8Count1][1])
5795                         {
5796                             u8Clk |= LANE_AND_CLK_TBL[u8Count1][2];
5797                             break;
5798                         }
5799                         u8Count1 ++;
5800                     }
5801                     while(u8Count1<VBY1_CLK_TBL_ROW);
5802                 }
5803                 u16OutputOrder4_7 /= PINMAPPING_EXP;
5804             }
5805 
5806             u8StartLane = 8;
5807             for( u8Count = u8StartLane ; u8Count < (u8StartLane+LANE_NUM_EACH_PINMAPPING_GROUP3) ; u8Count++ )
5808             {//lane 8 - lane 11
5809                 if( ( u16OutputOrder8_11 % PINMAPPING_EXP ) < u16LaneLimit)
5810                 {
5811                     u8Count1 = 0;
5812                     do
5813                     {
5814                         if(u8Count>=LANE_AND_CLK_TBL[u8Count1][0] && u8Count<=LANE_AND_CLK_TBL[u8Count1][1])
5815                         {
5816                             u8Clk |= LANE_AND_CLK_TBL[u8Count1][2];
5817                             break;
5818                         }
5819                         u8Count1 ++;
5820                     }
5821                     while(u8Count1<VBY1_CLK_TBL_ROW);
5822                 }
5823                 u16OutputOrder8_11 /= PINMAPPING_EXP;
5824 
5825             }
5826 
5827             u8StartLane = 12;
5828             for( u8Count = u8StartLane ; u8Count < (u8StartLane+LANE_NUM_EACH_PINMAPPING_GROUP4) ; u8Count++ )
5829             {//lane 12 - lane 15
5830                 if( ( u16OutputOrder12_15 % PINMAPPING_EXP ) < u16LaneLimit)
5831                 {
5832                     u8Count1 = 0;
5833                     do
5834                     {
5835                         if(u8Count>=LANE_AND_CLK_TBL[u8Count1][0] && u8Count<=LANE_AND_CLK_TBL[u8Count1][1])
5836                         {
5837                             u8Clk |= LANE_AND_CLK_TBL[u8Count1][2];
5838                             break;
5839                         }
5840                         u8Count1 ++;
5841                     }
5842                     while(u8Count1<VBY1_CLK_TBL_ROW);
5843                 }
5844                 u16OutputOrder12_15 /= PINMAPPING_EXP;
5845             }
5846 
5847             MOD_A_W2BYTEMSK(REG_MOD_A_BK00_00_L, u8Clk, 0x1F);
5848         }
5849     }
5850     else
5851     {
5852         if( (pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type_Ext == E_PNL_LPLL_VBY1_10BIT_16LANE)
5853           ||(pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type_Ext == E_PNL_LPLL_VBY1_8BIT_16LANE))
5854         {
5855             MOD_A_W2BYTEMSK(REG_MOD_A_BK00_00_L, 0x000F, 0x001F);
5856         }
5857         else if(   (pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type_Ext == E_PNL_LPLL_VBY1_10BIT_8LANE)
5858                  ||(pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type_Ext == E_PNL_LPLL_VBY1_8BIT_8LANE))
5859         {
5860             if(pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16MOD_CTRLA & BIT(1))
5861             {
5862                 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_00_L, 0x0003, 0x001F);
5863             }
5864             else
5865             {
5866                 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_00_L, 0x0003, 0x001F);
5867             }
5868         }
5869         else if(   (pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type_Ext == E_PNL_LPLL_VBY1_10BIT_4LANE)
5870                  ||(pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type_Ext == E_PNL_LPLL_VBY1_8BIT_4LANE))
5871         {
5872             MOD_A_W2BYTEMSK(REG_MOD_A_BK00_00_L, 0x0001, 0x001F);
5873         }
5874         else if(   (pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type_Ext == E_PNL_LPLL_VBY1_10BIT_2LANE)
5875                  ||(pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type_Ext == E_PNL_LPLL_VBY1_8BIT_2LANE))
5876         {
5877             MOD_A_W2BYTEMSK(REG_MOD_A_BK00_00_L, 0x0001, 0x001F);
5878         }
5879         else if(pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type == E_PNL_TYPE_LVDS)
5880         {//LVDS
5881             MOD_A_W2BYTEMSK(REG_MOD_A_BK00_00_L, 0x001F, 0x001F);
5882         }
5883         else
5884         {
5885             MOD_A_W2BYTEMSK(REG_MOD_A_BK00_00_L, 0x001F, 0x001F);
5886         }
5887     }
5888 }
5889 #if defined(PATCH_HW_VTT_LIMITATION)
5890 //There is the hareware bug on Maserati U1 Chip REG_SC_BK10_0D.
5891 //That is replaced by REG_SC_BK68 byMHal_PNL_SetVopVtt function.
MHal_PNL_SetVopVttByBK68(MS_U32 u32DeviceID,MS_U16 u16Vtt)5892 void MHal_PNL_SetVopVttByBK68(MS_U32 u32DeviceID, MS_U16 u16Vtt)
5893 {
5894     MS_U16 u16temp;
5895 
5896     u16temp  = SC_R2BYTE(u32DeviceID, REG_SC_BK68_31_L);
5897     SC_W2BYTEMSK(u32DeviceID, REG_SC_BK68_31_L, (u16temp & ~BIT(0) & ~BIT(8)) | BIT(1), 0xFFFF);
5898     SC_W2BYTEMSK(u32DeviceID, REG_SC_BK68_32_L, 0xff01 , 0xFFFF);
5899     SC_W2BYTEMSK(u32DeviceID, REG_SC_BK68_38_L, 10, 0xFFFF);
5900     SC_W2BYTEMSK(u32DeviceID, REG_SC_BK68_36_L, u16Vtt , 0xFFFF);
5901     SC_W2BYTEMSK(u32DeviceID, REG_SC_BK68_37_L, u16Vtt , 0xFFFF);
5902     SC_W2BYTEMSK(u32DeviceID, REG_SC_BK0F_55_L, 0x10 , 0xFFFF);
5903     u16temp  = SC_R2BYTE(u32DeviceID, REG_SC_BK68_31_L);
5904     SC_W2BYTEMSK(u32DeviceID, REG_SC_BK68_31_L, (u16temp & ~BIT(8))|BIT(0) | BIT(1) , 0xFFFF);
5905 }
5906 #endif
5907 
5908 #endif
5909 
5910 
5911