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