2 #define ENABLE_DSI_INTERRUPT 0
4 #include <asm/arch/disp_drv_platform.h>
7 #define ENABLE_DSI_INTERRUPT 1
9 #include <linux/delay.h>
10 #include <disp_drv_log.h>
11 #include <linux/time.h>
12 #include <linux/string.h>
13 #include <linux/mutex.h>
14 #include "disp_drv_platform.h"
21 #include "mach/mt_spm_idle.h"
24 extern unsigned int EnableVSyncLog
;
26 #if ENABLE_DSI_INTERRUPT
27 #include <linux/sched.h>
28 #include <linux/interrupt.h>
29 #include <linux/wait.h>
30 #include <mach/irqs.h>
32 #include "fbconfig_kdebug.h"
33 static wait_queue_head_t _dsi_wait_queue
;
34 static wait_queue_head_t _dsi_dcs_read_wait_queue
;
35 static wait_queue_head_t _dsi_wait_bta_te
;
36 static wait_queue_head_t _dsi_wait_ext_te
;
37 /* [PLATFORM]-Mod-BEGIN by TCTSZ.yaohui.zeng, 2015/04/15,MTK patch,fix FB suspend/resume DSI issue*/
38 wait_queue_head_t _dsi_wait_vm_done_queue
;
39 /* [PLATFORM]-Mod-END by TCTSZ.yaohui.zeng, 2015/04/15*/
42 //static unsigned int _dsi_reg_update_wq_flag = 0;
43 static DECLARE_WAIT_QUEUE_HEAD(_dsi_reg_update_wq
);
47 //#define ENABLE_DSI_ERROR_REPORT
50 #define PLL_BASE (0xF0060000)
51 #define DSI_PHY_BASE (0xF0060B00)
52 #define DSI_BASE (0xF0140000)
56 #include <mach/sync_write.h>
59 #define OUTREG32(x, y) mt65xx_reg_sync_writel(y, x)
63 #define OUTREGBIT(TYPE,REG,bit,value) \
65 TYPE r = *((TYPE*)&INREG32(®)); \
67 OUTREG32(®, AS_UINT32(&r)); \
71 static PDSI_REGS
const DSI_REG
= (PDSI_REGS
)(DSI_BASE
);
72 static PDSI_VM_CMDQ_REGS
const DSI_VM_CMD_REG
= (PDSI_VM_CMDQ_REGS
)(DSI_BASE
+ 0x134);
73 static PDSI_PHY_REGS
const DSI_PHY_REG
= (PDSI_PHY_REGS
)(MIPI_CONFIG_BASE
);
74 static PDSI_CMDQ_REGS
const DSI_CMDQ_REG
= (PDSI_CMDQ_REGS
)(DSI_BASE
+0x180);
75 //static PLCD_REGS const LCD_REG = (PLCD_REGS)(LCD_BASE);
79 extern LCM_DRIVER
*lcm_drv
;
80 static bool dsi_log_on
= false;
81 static bool glitch_log_on
= false;
82 static bool force_transfer
= false;
83 extern BOOL is_early_suspended
;
88 unsigned int cmdq_size
;
89 DSI_CMDQ_REGS cmdqBackup
;
90 unsigned int bit_time_ns
;
91 unsigned int vfp_period_us
;
92 unsigned int vsa_vs_period_us
;
93 unsigned int vsa_hs_period_us
;
94 unsigned int vsa_ve_period_us
;
95 unsigned int vbp_period_us
;
96 void (*pIntCallback
)(DISP_INTERRUPT_EVENTS
);
99 static bool s_isDsiPowerOn
= FALSE
;
100 static DSI_CONTEXT _dsiContext
;
101 extern LCM_PARAMS
*lcm_params
;
104 #define PLL_TABLE_NUM (26)
105 int LCM_DSI_6582_PLL_CLOCK_List
[PLL_TABLE_NUM
+1]={0,1000,1040,1250,1300,1500,1560,1750,1820,2000,2080,2250,
106 2340,2500,2600,2750,2860,3000,3120,3250,3500,3750,4000,4250,4500,4750,5000};
108 DSI_PLL_CONFIG pll_config
[PLL_TABLE_NUM
+1] =
110 {2,0,0x3D89D89D,1,0x1B1,0x745,0x745},
111 {2,0,0x40000000,1,0x1B1,0x790,0x790},
112 {1,0,0x26762762,1,0x1B1,0x48B,0x48B},
113 {1,0,0x28000000,1,0x1B1,0x4BA,0x4BA},
114 {1,0,0x2E276276,1,0x1B1,0x574,0x574},
115 {1,0,0x30000000,1,0x1B1,0x5AC,0x5AC},
116 {1,0,0x35D89D89,1,0x1B1,0x65D,0x65D},
117 {1,0,0x38000000,1,0x1B1,0x69E,0x69E},
118 {1,0,0x3D89D89D,1,0x1B1,0x745,0x745},
119 {1,0,0x40000000,1,0x1B1,0x790,0x790},
120 {1,0,0x453B13B1,1,0x1B1,0x82E,0x82E},
121 {1,0,0x48000000,1,0x1B1,0x882,0x882},
122 {0,0,0x26762762,1,0x1B1,0x48B,0x48B},
123 {0,0,0x28000000,1,0x1B1,0x4BA,0x4BA},
124 {0,0,0x2A4EC4EC,1,0x1B1,0x500,0x500},
125 {0,0,0x2C000000,1,0x1B1,0x533,0x533},
126 {0,0,0x2E276276,1,0x1B1,0x574,0x574},
127 {0,0,0x30000000,1,0x1B1,0x5AC,0x5AC},
128 {0,0,0x32000000,1,0x1B1,0x5E8,0x5E8},
129 {0,0,0x35D89D89,1,0x1B1,0x65D,0x65D},
130 {0,0,0x39B13B13,1,0x1B1,0x6D1,0x6D1},
131 {0,0,0x3D89D89D,1,0x1B1,0x745,0x745},
132 {0,0,0x41627627,1,0x1B1,0x7BA,0x7BA},
133 {0,0,0x453B13B1,1,0x1B1,0x82E,0x82E},
134 {0,0,0x4913B13B,1,0x1B1,0x8A2,0x8A2},
135 {0,0,0x4CEC4EC4,1,0x1B1,0x917,0x917},
140 #ifndef MT65XX_NEW_DISP
141 static bool dsi_esd_recovery
= false;
142 static bool dsi_int_te_enabled
= false;
143 static unsigned int dsi_int_te_period
= 1;
144 static unsigned int dsi_dpi_isr_count
= 0;
146 //static unsigned int dsi_noncont_clk_period = 1;
147 static bool dsi_noncont_clk_enabled
= true;
148 static bool dsi_glitch_enable
= false;
149 unsigned long g_handle_esd_flag
;
151 static volatile bool lcdStartTransfer
= false;
152 static volatile bool isTeSetting
= false;
153 static volatile bool dsiTeEnable
= false;
154 static volatile bool dsiTeExtEnable
= false;
159 static long int get_current_time_us(void)
161 return 0; ///TODO: fix me
164 static long int get_current_time_us(void)
168 return (t
.tv_sec
& 0xFFF) * 1000000 + t
.tv_usec
;
172 unsigned int custom_pll_clock_remap(int input_mipi_clock
)
175 unsigned int ret
= 0;
176 int mipi_clock
=10*input_mipi_clock
;
177 printk("DSI: custom_pll_clock_remap,mipi clock should be %d!!!\n", mipi_clock
);
179 if(mipi_clock
== 0)return 0;
181 if((mipi_clock
>0)&&(mipi_clock
<LCM_DSI_6582_PLL_CLOCK_List
[1]))
182 // lcm_params->dsi.PLL_CLOCK=1;
185 if(mipi_clock
>LCM_DSI_6582_PLL_CLOCK_List
[PLL_TABLE_NUM
])
186 // lcm_params->dsi.PLL_CLOCK=50;
187 return PLL_TABLE_NUM
;
189 for(i
=1;i
<PLL_TABLE_NUM
+1;i
++)
191 ASSERT(LCM_DSI_6582_PLL_CLOCK_List
[i
] < LCM_DSI_6582_PLL_CLOCK_List
[i
+1]);
192 if((mipi_clock
>=LCM_DSI_6582_PLL_CLOCK_List
[i
])&&(mipi_clock
<=LCM_DSI_6582_PLL_CLOCK_List
[i
+1]))
194 if((mipi_clock
-LCM_DSI_6582_PLL_CLOCK_List
[i
])<=(LCM_DSI_6582_PLL_CLOCK_List
[i
+1]-mipi_clock
))
196 // lcm_params->dsi.PLL_CLOCK=i+1;
202 // lcm_params->dsi.PLL_CLOCK=i+2;
208 printk("custom_pll_clock_remap,remap clock is %d!!!\n", ret
);
212 static void lcm_mdelay(UINT32 ms
)
216 void DSI_Enable_Log(bool enable
)
221 unsigned int try_times
= 30;
223 static wait_queue_head_t _vsync_wait_queue
;
224 static bool dsi_vsync
= false;
225 static bool wait_dsi_vsync
= false;
226 static struct hrtimer hrtimer_vsync
;
227 #define VSYNC_US_TO_NS(x) (x * 1000)
228 static unsigned int vsync_timer
= 0;
229 static bool wait_vm_done_irq
= false;
230 #if ENABLE_DSI_INTERRUPT
231 static irqreturn_t
_DSI_InterruptHandler(int irq
, void *dev_id
)
233 DSI_INT_STATUS_REG status
= DSI_REG
->DSI_INTSTA
;
234 #ifdef ENABLE_DSI_ERROR_REPORT
235 static unsigned int prev_error
= 0;
238 MMProfileLogEx(MTKFB_MMP_Events
.DSIIRQ
, MMProfileFlagPulse
, *(unsigned int*)&status
, lcdStartTransfer
);
240 printk("DSI IRQ, value = 0x%x!!\n", INREG32(0xF400C00C));
244 ///write clear RD_RDY interrupt
246 /// write clear RD_RDY interrupt must be before DSI_RACK
247 /// because CMD_DONE will raise after DSI_RACK,
248 /// so write clear RD_RDY after that will clear CMD_DONE too
249 #ifdef ENABLE_DSI_ERROR_REPORT
251 unsigned int read_data
[4];
252 OUTREG32(&read_data
[0], AS_UINT32(&DSI_REG
->DSI_RX_DATA0
));
253 OUTREG32(&read_data
[1], AS_UINT32(&DSI_REG
->DSI_RX_DATA1
));
254 OUTREG32(&read_data
[2], AS_UINT32(&DSI_REG
->DSI_RX_DATA2
));
255 OUTREG32(&read_data
[3], AS_UINT32(&DSI_REG
->DSI_TRIG_STA
));
258 if ((read_data
[0] & 0x3) == 0x02)
260 if (read_data
[0] & (~prev_error
))
261 printk("[DSI] Detect DSI error. prev:0x%08X new:0x%08X\n", prev_error
, read_data
[0]);
263 else if ((read_data
[1] & 0x3) == 0x02)
265 if (read_data
[1] & (~prev_error
))
266 printk("[DSI] Detect DSI error. prev:0x%08X new:0x%08X\n", prev_error
, read_data
[1]);
269 MMProfileLogEx(MTKFB_MMP_Events
.DSIRead
, MMProfileFlagStart
, read_data
[0], read_data
[1]);
270 MMProfileLogEx(MTKFB_MMP_Events
.DSIRead
, MMProfileFlagEnd
, read_data
[2], read_data
[3]);
276 //DSI_REG->DSI_RACK.DSI_RACK = 1;
277 OUTREGBIT(DSI_RACK_REG
,DSI_REG
->DSI_RACK
,DSI_RACK
,1);
278 } while(DSI_REG
->DSI_INTSTA
.BUSY
);
280 MASKREG32(&DSI_REG
->DSI_INTSTA
, 0x1, 0x0);
281 wake_up_interruptible(&_dsi_dcs_read_wait_queue
);
282 if(_dsiContext
.pIntCallback
)
283 _dsiContext
.pIntCallback(DISP_DSI_READ_RDY_INT
);
288 if (lcdStartTransfer
)
290 // The last screen update has finished.
291 if(_dsiContext
.pIntCallback
)
292 _dsiContext
.pIntCallback(DISP_DSI_CMD_DONE_INT
);
293 #ifdef SPM_SODI_ENABLED
297 if(dsi_glitch_enable
){
302 // clear flag & wait for next trigger
303 lcdStartTransfer
= false;
305 //DSI_REG->DSI_INTSTA.CMD_DONE = 0;
306 OUTREGBIT(DSI_INT_STATUS_REG
,DSI_REG
->DSI_INTSTA
,CMD_DONE
,0);
308 wake_up_interruptible(&_dsi_wait_queue
);
309 //if(_dsiContext.pIntCallback)
310 // _dsiContext.pIntCallback(DISP_DSI_CMD_DONE_INT);
311 //MASKREG32(&DSI_REG->DSI_INTSTA, 0x2, 0x0);
318 // Write clear RD_RDY
319 //DSI_REG->DSI_INTSTA.TE_RDY = 0;
320 OUTREGBIT(DSI_INT_STATUS_REG
,DSI_REG
->DSI_INTSTA
,TE_RDY
,0);
322 // Set DSI_RACK to let DSI idle
323 //DSI_REG->DSI_RACK.DSI_RACK = 1;
324 OUTREGBIT(DSI_RACK_REG
,DSI_REG
->DSI_RACK
,DSI_RACK
,1);
326 wake_up_interruptible(&_dsi_wait_bta_te
);
330 if(wait_dsi_vsync
)//judge if wait vsync
333 printk("[DSI] VSync2\n");
334 if(-1 != hrtimer_try_to_cancel(&hrtimer_vsync
))
337 //hrtimer_try_to_cancel(&hrtimer_vsync);
339 printk("[DSI] VSync3\n");
340 wake_up_interruptible(&_vsync_wait_queue
);
342 //printk("TE signal, and wake up\n");
350 // Write clear RD_RDY
351 OUTREGBIT(DSI_INT_STATUS_REG
,DSI_REG
->DSI_INTSTA
,EXT_TE
,0);
353 wake_up_interruptible(&_dsi_wait_ext_te
);
356 if(wait_dsi_vsync
)//judge if wait vsync
359 printk("[DSI] VSync2\n");
361 if(-1 != hrtimer_try_to_cancel(&hrtimer_vsync
))
364 //hrtimer_try_to_cancel(&hrtimer_vsync);
366 printk("[DSI] VSync3\n");
368 wake_up_interruptible(&_vsync_wait_queue
);
370 //printk("TE signal, and wake up\n");
378 // DBG_OnTeDelayDone();
379 OUTREGBIT(DSI_INT_STATUS_REG
,DSI_REG
->DSI_INTSTA
,VM_DONE
,0);
380 if(_dsiContext
.pIntCallback
)
381 _dsiContext
.pIntCallback(DISP_DSI_VMDONE_INT
);
383 printk("DSI VM done IRQ!!\n");
384 // Write clear VM_Done
385 //DSI_REG->DSI_INTSTA.VM_DONE= 0;
386 wake_up_interruptible(&_dsi_wait_vm_done_queue
);
387 if(dsi_glitch_enable
){
388 MMProfileLogEx(MTKFB_MMP_Events
.Debug
, MMProfileFlagPulse
, 1, 22);
389 if(!is_early_suspended
&& !wait_vm_done_irq
){
390 if(1 == DSI_Detect_CLK_Glitch()){
391 printk("VM Done detect glitch fail!!,%d\n",__LINE__
);
404 void DSI_GetVsyncCnt(void)
407 enum hrtimer_restart
dsi_te_hrtimer_func(struct hrtimer
*timer
)
411 printk("[DSI] VSync0\n");
417 printk("[DSI] VSync1\n");
418 wake_up_interruptible(&_vsync_wait_queue
);
420 // ret = hrtimer_forward_now(timer, ktime_set(0, VSYNC_US_TO_NS(vsync_timer)));
421 // printk("hrtimer callback\n");
422 return HRTIMER_NORESTART
;
427 //static unsigned int vsync_wait_time = 0;
428 void DSI_WaitTE(void)
431 wait_dsi_vsync
= true;
433 hrtimer_start(&hrtimer_vsync
, ktime_set(0, VSYNC_US_TO_NS(vsync_timer
)), HRTIMER_MODE_REL
);
435 printk("[DSI] +VSync\n");
436 wait_event_interruptible(_vsync_wait_queue
, dsi_vsync
);
438 printk("[DSI] -VSync\n");
440 wait_dsi_vsync
= false;
443 void DSI_InitVSYNC(unsigned int vsync_interval
)
447 vsync_timer
= vsync_interval
;
448 ktime
= ktime_set(0, VSYNC_US_TO_NS(vsync_timer
));
449 hrtimer_init(&hrtimer_vsync
, CLOCK_MONOTONIC
, HRTIMER_MODE_REL
);
450 hrtimer_vsync
.function
= dsi_te_hrtimer_func
;
451 // hrtimer_start(&hrtimer_vsync, ktime, HRTIMER_MODE_REL);
455 /* [PLATFORM]-Mod-BEGIN by TCTSZ.yaohui.zeng, 2015/04/15,MTK patch,fix FB suspend/resume DSI issue*/
456 BOOL
_IsEngineBusy(void)
458 DSI_INT_STATUS_REG status
;
460 status
= DSI_REG
->DSI_INTSTA
;
466 /* [PLATFORM]-Mod-END by TCTSZ.yaohui.zeng, 2015/04/15*/
469 static void _WaitForEngineNotBusy(void)
472 #if ENABLE_DSI_INTERRUPT
475 static const long WAIT_TIMEOUT
= 2 * HZ
; // 2 sec
478 if (DSI_REG
->DSI_MODE_CTRL
.MODE
)
483 #if ENABLE_DSI_INTERRUPT
484 time
= get_current_time_us();
488 // perform busy waiting if in interrupt context
489 while(_IsEngineBusy()) {
493 DISP_LOG_PRINT(ANDROID_LOG_ERROR
, "DSI", " Wait for DSI engine not busy timeout!!!(Wait %d us)\n", get_current_time_us() - time
);
503 while (DSI_REG
->DSI_INTSTA
.BUSY
|| DSI_REG
->DSI_INTSTA
.CMD_DONE
)
505 long ret
= wait_event_interruptible_timeout(_dsi_wait_queue
,
506 !_IsEngineBusy() && !(DSI_REG
->DSI_INTSTA
.CMD_DONE
),
509 DISP_LOG_PRINT(ANDROID_LOG_WARN
, "DSI", " Wait for DSI engine not busy timeout!!!\n");
512 //dsiTeEnable = false;
518 while(_IsEngineBusy()) {
520 /*printk("xuecheng, dsi wait\n");*/
522 DISP_LOG_PRINT(ANDROID_LOG_ERROR
, "DSI", " Wait for DSI engine not busy timeout!!!\n");
526 dsiTeExtEnable
= false;
530 OUTREG32(&DSI_REG
->DSI_INTSTA
, 0x0);
533 void hdmi_dsi_waitnotbusy(void)
535 _WaitForEngineNotBusy();
540 DSI_STATUS
DSI_BackupRegisters(void)
542 DSI_REGS
*regs
= &(_dsiContext
.regBackup
);
544 //memcpy((void*)&(_dsiContext.regBackup), (void*)DSI_BASE, sizeof(DSI_REGS));
546 OUTREG32(®s
->DSI_INTEN
, AS_UINT32(&DSI_REG
->DSI_INTEN
));
547 OUTREG32(®s
->DSI_MODE_CTRL
, AS_UINT32(&DSI_REG
->DSI_MODE_CTRL
));
548 OUTREG32(®s
->DSI_TXRX_CTRL
, AS_UINT32(&DSI_REG
->DSI_TXRX_CTRL
));
549 OUTREG32(®s
->DSI_PSCTRL
, AS_UINT32(&DSI_REG
->DSI_PSCTRL
));
551 OUTREG32(®s
->DSI_VSA_NL
, AS_UINT32(&DSI_REG
->DSI_VSA_NL
));
552 OUTREG32(®s
->DSI_VBP_NL
, AS_UINT32(&DSI_REG
->DSI_VBP_NL
));
553 OUTREG32(®s
->DSI_VFP_NL
, AS_UINT32(&DSI_REG
->DSI_VFP_NL
));
554 OUTREG32(®s
->DSI_VACT_NL
, AS_UINT32(&DSI_REG
->DSI_VACT_NL
));
556 OUTREG32(®s
->DSI_HSA_WC
, AS_UINT32(&DSI_REG
->DSI_HSA_WC
));
557 OUTREG32(®s
->DSI_HBP_WC
, AS_UINT32(&DSI_REG
->DSI_HBP_WC
));
558 OUTREG32(®s
->DSI_HFP_WC
, AS_UINT32(&DSI_REG
->DSI_HFP_WC
));
559 OUTREG32(®s
->DSI_BLLP_WC
, AS_UINT32(&DSI_REG
->DSI_BLLP_WC
));
561 OUTREG32(®s
->DSI_HSTX_CKL_WC
, AS_UINT32(&DSI_REG
->DSI_HSTX_CKL_WC
));
562 OUTREG32(®s
->DSI_MEM_CONTI
, AS_UINT32(&DSI_REG
->DSI_MEM_CONTI
));
564 OUTREG32(®s
->DSI_PHY_TIMECON0
, AS_UINT32(&DSI_REG
->DSI_PHY_TIMECON0
));
565 OUTREG32(®s
->DSI_PHY_TIMECON1
, AS_UINT32(&DSI_REG
->DSI_PHY_TIMECON1
));
566 OUTREG32(®s
->DSI_PHY_TIMECON2
, AS_UINT32(&DSI_REG
->DSI_PHY_TIMECON2
));
567 OUTREG32(®s
->DSI_PHY_TIMECON3
, AS_UINT32(&DSI_REG
->DSI_PHY_TIMECON3
));
568 OUTREG32(®s
->DSI_VM_CMD_CON
, AS_UINT32(&DSI_REG
->DSI_VM_CMD_CON
));
569 return DSI_STATUS_OK
;
573 DSI_STATUS
DSI_RestoreRegisters(void)
575 DSI_REGS
*regs
= &(_dsiContext
.regBackup
);
577 OUTREG32(&DSI_REG
->DSI_INTEN
, AS_UINT32(®s
->DSI_INTEN
));
578 OUTREG32(&DSI_REG
->DSI_MODE_CTRL
, AS_UINT32(®s
->DSI_MODE_CTRL
));
579 OUTREG32(&DSI_REG
->DSI_TXRX_CTRL
, AS_UINT32(®s
->DSI_TXRX_CTRL
));
580 OUTREG32(&DSI_REG
->DSI_PSCTRL
, AS_UINT32(®s
->DSI_PSCTRL
));
582 OUTREG32(&DSI_REG
->DSI_VSA_NL
, AS_UINT32(®s
->DSI_VSA_NL
));
583 OUTREG32(&DSI_REG
->DSI_VBP_NL
, AS_UINT32(®s
->DSI_VBP_NL
));
584 OUTREG32(&DSI_REG
->DSI_VFP_NL
, AS_UINT32(®s
->DSI_VFP_NL
));
585 OUTREG32(&DSI_REG
->DSI_VACT_NL
, AS_UINT32(®s
->DSI_VACT_NL
));
587 OUTREG32(&DSI_REG
->DSI_HSA_WC
, AS_UINT32(®s
->DSI_HSA_WC
));
588 OUTREG32(&DSI_REG
->DSI_HBP_WC
, AS_UINT32(®s
->DSI_HBP_WC
));
589 OUTREG32(&DSI_REG
->DSI_HFP_WC
, AS_UINT32(®s
->DSI_HFP_WC
));
590 OUTREG32(&DSI_REG
->DSI_BLLP_WC
, AS_UINT32(®s
->DSI_BLLP_WC
));
592 OUTREG32(&DSI_REG
->DSI_HSTX_CKL_WC
, AS_UINT32(®s
->DSI_HSTX_CKL_WC
));
593 OUTREG32(&DSI_REG
->DSI_MEM_CONTI
, AS_UINT32(®s
->DSI_MEM_CONTI
));
595 OUTREG32(&DSI_REG
->DSI_PHY_TIMECON0
, AS_UINT32(®s
->DSI_PHY_TIMECON0
));
596 OUTREG32(&DSI_REG
->DSI_PHY_TIMECON1
, AS_UINT32(®s
->DSI_PHY_TIMECON1
));
597 OUTREG32(&DSI_REG
->DSI_PHY_TIMECON2
, AS_UINT32(®s
->DSI_PHY_TIMECON2
));
598 OUTREG32(&DSI_REG
->DSI_PHY_TIMECON3
, AS_UINT32(®s
->DSI_PHY_TIMECON3
));
599 OUTREG32(&DSI_REG
->DSI_VM_CMD_CON
, AS_UINT32(®s
->DSI_VM_CMD_CON
));
600 return DSI_STATUS_OK
;
603 static void _ResetBackupedDSIRegisterValues(void)
605 DSI_REGS
*regs
= &_dsiContext
.regBackup
;
606 memset((void*)regs
, 0, sizeof(DSI_REGS
));
610 static void DSI_BackUpCmdQ(void)
613 DSI_CMDQ_REGS
*regs
= &(_dsiContext
.cmdqBackup
);
615 _dsiContext
.cmdq_size
= AS_UINT32(&DSI_REG
->DSI_CMDQ_SIZE
);
617 for (i
=0; i
<_dsiContext
.cmdq_size
; i
++)
618 OUTREG32(®s
->data
[i
], AS_UINT32(&DSI_CMDQ_REG
->data
[i
]));
622 static void DSI_RestoreCmdQ(void)
625 DSI_CMDQ_REGS
*regs
= &(_dsiContext
.cmdqBackup
);
627 OUTREG32(&DSI_REG
->DSI_CMDQ_SIZE
, AS_UINT32(&_dsiContext
.cmdq_size
));
629 for (i
=0; i
<_dsiContext
.cmdq_size
; i
++)
630 OUTREG32(&DSI_CMDQ_REG
->data
[i
], AS_UINT32(®s
->data
[i
]));
633 static void _DSI_RDMA0_IRQ_Handler(unsigned int param
);
634 spinlock_t dsi_glitch_detect_lock
;
635 static DSI_STATUS
DSI_TE_Setting(void)
637 //return DSI_STATUS_OK;
640 return DSI_STATUS_OK
;
643 if(lcm_params
->dsi
.mode
== CMD_MODE
&& lcm_params
->dsi
.lcm_ext_te_enable
== TRUE
)
647 dsiTeExtEnable
= true;
653 dsiTeExtEnable
= false;
658 return DSI_STATUS_OK
;
661 DSI_STATUS
DSI_Init(BOOL isDsiPoweredOn
)
663 DSI_STATUS ret
= DSI_STATUS_OK
;
665 memset(&_dsiContext
, 0, sizeof(_dsiContext
));
666 OUTREG32(DISPSYS_BASE
+ 0x4C, 0x0);
667 if (isDsiPoweredOn
) {
668 DSI_BackupRegisters();
670 _ResetBackupedDSIRegisterValues();
675 OUTREG32(&DSI_REG
->DSI_MEM_CONTI
, DSI_WMEM_CONTI
);
677 ASSERT(ret
== DSI_STATUS_OK
);
679 #if ENABLE_DSI_INTERRUPT
680 init_waitqueue_head(&_dsi_wait_queue
);
681 init_waitqueue_head(&_dsi_dcs_read_wait_queue
);
682 init_waitqueue_head(&_dsi_wait_bta_te
);
683 init_waitqueue_head(&_dsi_wait_ext_te
);
684 init_waitqueue_head(&_dsi_wait_vm_done_queue
);
685 if (request_irq(MT6582_DISP_DSI_IRQ_ID
,
686 _DSI_InterruptHandler
, IRQF_TRIGGER_LOW
, MTKFB_DRIVER
, NULL
) < 0)
688 DISP_LOG_PRINT(ANDROID_LOG_ERROR
, "DSI", "fail to request DSI irq\n");
689 return DSI_STATUS_ERROR
;
691 //mt65xx_irq_unmask(MT6577_DSI_IRQ_ID);
692 //DSI_REG->DSI_INTEN.CMD_DONE=1;
693 //DSI_REG->DSI_INTEN.RD_RDY=1;
694 //DSI_REG->DSI_INTEN.TE_RDY = 1;
695 OUTREGBIT(DSI_INT_ENABLE_REG
,DSI_REG
->DSI_INTEN
,CMD_DONE
,1);
696 OUTREGBIT(DSI_INT_ENABLE_REG
,DSI_REG
->DSI_INTEN
,RD_RDY
,1);
697 OUTREGBIT(DSI_INT_ENABLE_REG
,DSI_REG
->DSI_INTEN
,TE_RDY
,1);
698 OUTREGBIT(DSI_INT_ENABLE_REG
,DSI_REG
->DSI_INTEN
,EXT_TE
,1);
700 init_waitqueue_head(&_vsync_wait_queue
);
701 //DSI_REG->DSI_INTEN.VM_DONE = 1;
702 OUTREGBIT(DSI_INT_ENABLE_REG
,DSI_REG
->DSI_INTEN
,VM_DONE
,1);
703 init_waitqueue_head(&_vsync_wait_queue
);
707 if (lcm_params
->dsi
.mode
== (LCM_DSI_MODE_CON
)DSI_CMD_MODE
)
708 disp_register_irq(DISP_MODULE_RDMA0
, _DSI_RDMA0_IRQ_Handler
);
709 spin_lock_init(&dsi_glitch_detect_lock
);
710 return DSI_STATUS_OK
;
714 DSI_STATUS
DSI_Deinit(void)
716 DSI_STATUS ret
= DSI_PowerOff();
718 ASSERT(ret
== DSI_STATUS_OK
);
720 return DSI_STATUS_OK
;
724 DSI_STATUS
DSI_PowerOn(void)
728 MASKREG32(0x14000110, 0x3, 0x0);
729 printf("[DISP] - uboot - DSI_PowerOn. 0x%8x,0x%8x,0x%8x\n", INREG32(0x14000110), INREG32(0x14000114), INREG32(0x14000118));
731 DSI_RestoreRegisters();
732 //DSI_WaitForEngineNotBusy();
733 s_isDsiPowerOn
= TRUE
;
736 return DSI_STATUS_OK
;
740 DSI_STATUS
DSI_PowerOff(void)
745 //DSI_WaitForEngineNotBusy();
746 DSI_BackupRegisters();
748 OUTREG32(&DSI_REG
->DSI_INTSTA
, 0);
749 MASKREG32(0x14000110, 0x3, 0x3);
750 printf("[DISP] - uboot - DSI_PowerOff. 0x%8x,0x%8x,0x%8x\n", INREG32(0x14000110), INREG32(0x14000114), INREG32(0x14000118));
752 s_isDsiPowerOn
= FALSE
;
755 return DSI_STATUS_OK
;
759 DSI_STATUS
DSI_PowerOn(void)
765 ret
+= enable_clock(MT_CG_DISP1_DSI_ENGINE
, "DSI");
766 ret
+= enable_clock(MT_CG_DISP1_DSI_DIGITAL
, "DSI");
767 ret
+= enable_clock(MT_CG_DISP0_DISP_UFOE
, "UFOE");
770 DISP_LOG_PRINT(ANDROID_LOG_WARN
, "DSI", "DSI power manager API return FALSE\n");
773 s_isDsiPowerOn
= TRUE
;
776 // DISP_LOG_PRINT(ANDROID_LOG_INFO, "DSI", "%s, line:%d\n", __func__, __LINE__);
777 return DSI_STATUS_OK
;
781 DSI_STATUS
DSI_PowerOff(void)
788 ret
+= disable_clock(MT_CG_DISP1_DSI_ENGINE
, "DSI");
789 ret
+= disable_clock(MT_CG_DISP1_DSI_DIGITAL
, "DSI");
790 ret
+= disable_clock(MT_CG_DISP0_DISP_UFOE
, "UFOE");
794 DISP_LOG_PRINT(ANDROID_LOG_WARN
, "DSI", "DSI power manager API return FALSE\n");
797 s_isDsiPowerOn
= FALSE
;
801 return DSI_STATUS_OK
;
805 DSI_STATUS
DSI_WaitForNotBusy(void)
807 _WaitForEngineNotBusy();
809 return DSI_STATUS_OK
;
813 static void DSI_WaitBtaTE(void)
816 #if ENABLE_DSI_INTERRUPT
818 static const long WAIT_TIMEOUT
= 2 * HZ
; // 2 sec
820 long int dsi_current_time
;
823 if(DSI_REG
->DSI_MODE_CTRL
.MODE
!= CMD_MODE
)
826 _WaitForEngineNotBusy();
829 // backup command queue setting.
832 t0
.CONFG
= 0x20; ///TE
837 OUTREG32(&DSI_CMDQ_REG
->data
[0], AS_UINT32(&t0
));
838 OUTREG32(&DSI_REG
->DSI_CMDQ_SIZE
, 1);
840 //DSI_REG->DSI_START.DSI_START=0;
841 //DSI_REG->DSI_START.DSI_START=1;
842 OUTREGBIT(DSI_START_REG
,DSI_REG
->DSI_START
,DSI_START
,0);
843 OUTREGBIT(DSI_START_REG
,DSI_REG
->DSI_START
,DSI_START
,1);
845 // wait BTA TE command complete.
846 _WaitForEngineNotBusy();
848 // restore command queue setting.
851 #if ENABLE_DSI_INTERRUPT
853 ret
= wait_event_interruptible_timeout(_dsi_wait_bta_te
,
858 DISP_LOG_PRINT(ANDROID_LOG_WARN
, "DSI", "Wait for _dsi_wait_bta_te(DSI_INTSTA.TE_RDY) ready timeout!!!\n");
860 // Set DSI_RACK to let DSI idle
861 //DSI_REG->DSI_RACK.DSI_RACK = 1;
862 OUTREGBIT(DSI_RACK_REG
,DSI_REG
->DSI_RACK
,DSI_RACK
,1);
865 ///do necessary reset here
867 dsiTeEnable
= false;//disable TE
871 // After setting DSI_RACK, it needs to wait for CMD_DONE interrupt.
872 _WaitForEngineNotBusy();
876 dsi_current_time
= get_current_time_us();
878 while(DSI_REG
->DSI_INTSTA
.TE_RDY
== 0) // polling TE_RDY
880 if(get_current_time_us() - dsi_current_time
> 100*1000)
882 DISP_LOG_PRINT(ANDROID_LOG_WARN
, "DSI", "Wait for TE_RDY timeout!!!\n");
884 // Set DSI_RACK to let DSI idle
885 //DSI_REG->DSI_RACK.DSI_RACK = 1;
886 OUTREGBIT(DSI_RACK_REG
,DSI_REG
->DSI_RACK
,DSI_RACK
,1);
890 //do necessary reset here
892 dsiTeEnable
= false;//disable TE
897 // Write clear RD_RDY
898 //DSI_REG->DSI_INTSTA.TE_RDY = 0;
899 OUTREGBIT(DSI_INT_STATUS_REG
,DSI_REG
->DSI_INTSTA
,TE_RDY
,0);
901 // Set DSI_RACK to let DSI idle
902 //DSI_REG->DSI_RACK.DSI_RACK = 1;
903 OUTREGBIT(DSI_RACK_REG
,DSI_REG
->DSI_RACK
,DSI_RACK
,1);
908 dsi_current_time
= get_current_time_us();
910 while(DSI_REG
->DSI_INTSTA
.CMD_DONE
== 0) // polling CMD_DONE
912 if(get_current_time_us() - dsi_current_time
> 100*1000)
914 DISP_LOG_PRINT(ANDROID_LOG_WARN
, "DSI", "Wait for CMD_DONE timeout!!!\n");
916 // Set DSI_RACK to let DSI idle
917 //DSI_REG->DSI_RACK.DSI_RACK = 1;
918 OUTREGBIT(DSI_RACK_REG
,DSI_REG
->DSI_RACK
,DSI_RACK
,1);
922 ///do necessary reset here
924 dsiTeEnable
= false;//disable TE
929 // Write clear CMD_DONE
930 //DSI_REG->DSI_INTSTA.CMD_DONE = 0;
931 OUTREGBIT(DSI_INT_STATUS_REG
,DSI_REG
->DSI_INTSTA
,CMD_DONE
,0);
937 static void DSI_WaitExternalTE(void)
939 #if ENABLE_DSI_INTERRUPT
941 static const long WAIT_TIMEOUT
= 2 * HZ
; // 2 sec
943 long int dsi_current_time
;
947 if(DSI_REG
->DSI_MODE_CTRL
.MODE
!= CMD_MODE
)
951 OUTREGBIT(DSI_TXRX_CTRL_REG
,DSI_REG
->DSI_TXRX_CTRL
,EXT_TE_EN
,1);
952 OUTREGBIT(DSI_TXRX_CTRL_REG
,DSI_REG
->DSI_TXRX_CTRL
,EXT_TE_EDGE
,0);
954 #if ENABLE_DSI_INTERRUPT
955 ret
= wait_event_interruptible_timeout(_dsi_wait_ext_te
,
960 DISP_LOG_PRINT(ANDROID_LOG_WARN
, "DSI", "Wait for _dsi_wait_ext_te(DSI_INTSTA.EXT_TE) ready timeout!!!\n");
962 OUTREGBIT(DSI_TXRX_CTRL_REG
,DSI_REG
->DSI_TXRX_CTRL
,EXT_TE_EN
,0);
964 ///do necessary reset here
966 dsiTeExtEnable
= false;//disable TE
972 dsi_current_time
= get_current_time_us();
974 while(DSI_REG
->DSI_INTSTA
.EXT_TE
== 0) // polling EXT_TE
976 if(get_current_time_us() - dsi_current_time
> 100*1000)
978 DISP_LOG_PRINT(ANDROID_LOG_WARN
, "DSI", "Wait for EXT_TE timeout!!!\n");
982 //do necessary reset here
984 dsiTeExtEnable
= false;//disable TE
990 // Write clear EXT_TE
991 OUTREGBIT(DSI_INT_STATUS_REG
,DSI_REG
->DSI_INTSTA
,EXT_TE
,0);
1003 DSI_STATUS
DSI_EnableClk(void)
1005 //_WaitForEngineNotBusy();
1007 //DSI_REG->DSI_START.DSI_START=0;
1008 OUTREGBIT(DSI_COM_CTRL_REG
,DSI_REG
->DSI_COM_CTRL
,DSI_EN
,1);
1010 return DSI_STATUS_OK
;
1012 DSI_STATUS
DSI_Start(void)
1014 OUTREGBIT(DSI_START_REG
,DSI_REG
->DSI_START
,DSI_START
,0);
1015 OUTREGBIT(DSI_START_REG
,DSI_REG
->DSI_START
,DSI_START
,1);
1016 return DSI_STATUS_OK
;
1018 DSI_STATUS
DSI_EnableVM_CMD(void)
1020 OUTREGBIT(DSI_START_REG
,DSI_REG
->DSI_START
,VM_CMD_START
,0);
1021 OUTREGBIT(DSI_START_REG
,DSI_REG
->DSI_START
,VM_CMD_START
,1);
1022 return DSI_STATUS_OK
;
1024 DSI_STATUS
DSI_StartTransfer(bool isMutexLocked
)
1026 // needStartDSI = 1: For command mode or the first time of video mode.
1027 // After the first time of video mode. Configuration is applied in ConfigurationUpdateTask.
1028 extern struct mutex OverlaySettingMutex
;
1029 #ifdef SPM_SODI_ENABLED
1030 if(DSI_REG
->DSI_MODE_CTRL
.MODE
== CMD_MODE
)
1035 if (!isMutexLocked
) {
1036 disp_path_get_mutex();
1037 mutex_lock(&OverlaySettingMutex
);
1040 // Insert log for trigger point.
1047 DSI_WaitExternalTE();
1050 if(dsi_glitch_enable
){
1051 spin_lock_irq(&dsi_glitch_detect_lock
);
1052 if(1 == DSI_Detect_CLK_Glitch()){
1053 if(!force_transfer
){
1054 spin_unlock_irq(&dsi_glitch_detect_lock
);
1055 if (!isMutexLocked
) {
1056 mutex_unlock(&OverlaySettingMutex
);
1057 disp_path_release_mutex();
1059 if(_dsiContext
.pIntCallback
)
1060 _dsiContext
.pIntCallback(DISP_DSI_CMD_DONE_INT
);
1061 return DSI_STATUS_OK
;
1064 spin_unlock_irq(&dsi_glitch_detect_lock
);
1066 _WaitForEngineNotBusy();
1067 lcdStartTransfer
= true;
1068 // To trigger frame update.
1071 if (!isMutexLocked
) {
1072 mutex_unlock(&OverlaySettingMutex
);
1073 disp_path_release_mutex();
1075 return DSI_STATUS_OK
;
1078 unsigned int glitch_detect_fail_cnt
= 0;
1080 static unsigned int DSI_Detect_CLK_Glitch_Default(void)
1084 int read_timeout_cnt
=10000;
1085 int read_timeout_ret
= 0;
1086 unsigned long long start_time
,end_time
;
1087 DSI_RX_DATA_REG read_data0
;
1088 DSI_RX_DATA_REG read_data1
;
1090 if(glitch_detect_fail_cnt
>2){
1094 while(DSI_REG
->DSI_INTSTA
.BUSY
);
1095 OUTREG32(&DSI_REG
->DSI_INTSTA
, 0x0);
1098 DSI_SetMode(CMD_MODE
);
1099 OUTREGBIT(DSI_INT_ENABLE_REG
,DSI_REG
->DSI_INTEN
,RD_RDY
,0);
1100 OUTREGBIT(DSI_INT_ENABLE_REG
,DSI_REG
->DSI_INTEN
,CMD_DONE
,0);
1102 OUTREG32(&DSI_CMDQ_REG
->data
[0], 0x00340500);//turn off TE
1103 OUTREG32(&DSI_REG
->DSI_CMDQ_SIZE
, 1);
1105 OUTREGBIT(DSI_START_REG
,DSI_REG
->DSI_START
,DSI_START
,0);
1106 OUTREGBIT(DSI_START_REG
,DSI_REG
->DSI_START
,DSI_START
,1);
1107 while(DSI_REG
->DSI_INTSTA
.CMD_DONE
== 0);
1108 OUTREGBIT(DSI_INT_STATUS_REG
,DSI_REG
->DSI_INTSTA
,CMD_DONE
,0);
1110 MMProfileLogEx(MTKFB_MMP_Events
.Debug
, MMProfileFlagPulse
, 0, 0);
1112 OUTREG32(&DSI_CMDQ_REG
->data
[0], 0x00ff1500);
1113 OUTREG32(&DSI_REG
->DSI_CMDQ_SIZE
, 1);
1115 OUTREGBIT(DSI_START_REG
,DSI_REG
->DSI_START
,DSI_START
,0);
1116 OUTREGBIT(DSI_START_REG
,DSI_REG
->DSI_START
,DSI_START
,1);
1117 while(DSI_REG
->DSI_INTSTA
.CMD_DONE
== 0);
1118 OUTREGBIT(DSI_INT_STATUS_REG
,DSI_REG
->DSI_INTSTA
,CMD_DONE
,0);
1120 for(i
=0;i
<try_times
;i
++)
1124 MMProfileLogEx(MTKFB_MMP_Events
.Debug
, MMProfileFlagPulse
, 0, 9);
1125 while((INREG32(&DSI_REG
->DSI_STATE_DBG0
)&0x1) == 0); // polling bit0
1127 OUTREGBIT(DSI_COM_CTRL_REG
,DSI_REG
->DSI_COM_CTRL
,DSI_RESET
,0);
1128 OUTREGBIT(DSI_COM_CTRL_REG
,DSI_REG
->DSI_COM_CTRL
,DSI_RESET
,1);//reset
1129 OUTREGBIT(DSI_COM_CTRL_REG
,DSI_REG
->DSI_COM_CTRL
,DSI_RESET
,0);
1131 MMProfileLogEx(MTKFB_MMP_Events
.Debug
, MMProfileFlagPulse
, 0, 10);
1134 MASKREG32(MIPI_CONFIG_BASE
+ 0x04, 0x20, 0x0);
1137 MMProfileLogEx(MTKFB_MMP_Events
.Debug
, MMProfileFlagPulse
, 0, 1);
1138 while((INREG32(&DSI_REG
->DSI_STATE_DBG0
)&0x40000) == 0); // polling bit18 start
1139 MMProfileLogEx(MTKFB_MMP_Events
.Debug
, MMProfileFlagPulse
, 0, 2);
1142 MASKREG32(MIPI_CONFIG_BASE
+ 0x04, 0x20, 0x20);
1144 // OUTREG32(&DSI_CMDQ_REG->data[0], 0x00290508);
1145 OUTREG32(&DSI_CMDQ_REG
->data
[0], 0x00351508);
1146 OUTREG32(&DSI_REG
->DSI_CMDQ_SIZE
, 1);
1148 OUTREGBIT(DSI_START_REG
,DSI_REG
->DSI_START
,DSI_START
,0);
1149 OUTREGBIT(DSI_START_REG
,DSI_REG
->DSI_START
,DSI_START
,1);
1150 read_timeout_cnt
=1000000;
1151 MMProfileLogEx(MTKFB_MMP_Events
.Debug
, MMProfileFlagPulse
, 0, 3);
1152 start_time
= sched_clock();
1153 while(DSI_REG
->DSI_INTSTA
.BUSY
) {
1154 end_time
= sched_clock();
1155 if(((unsigned int)sched_clock() - (unsigned int)start_time
) > 50000){
1156 DISP_LOG_PRINT(ANDROID_LOG_ERROR
, "DSI", " Wait for DSI engine not busy timeout!!!:%d\n",__LINE__
);
1161 OUTREG32(&DSI_REG
->DSI_INTSTA
, 0x0);
1162 // spin_unlock_irq(&dsi_glitch_detect_lock);
1163 MMProfileLogEx(MTKFB_MMP_Events
.Debug
, MMProfileFlagPulse
, 0, 4);
1170 OUTREG32(&DSI_CMDQ_REG
->data
[0], AS_UINT32(&t0
));
1171 OUTREG32(&DSI_REG
->DSI_CMDQ_SIZE
, 1);
1173 OUTREGBIT(DSI_START_REG
,DSI_REG
->DSI_START
,DSI_START
,0);
1174 OUTREGBIT(DSI_START_REG
,DSI_REG
->DSI_START
,DSI_START
,1);
1178 read_timeout_cnt
=1000;
1179 MMProfileLogEx(MTKFB_MMP_Events
.Debug
, MMProfileFlagPulse
, 0, 5);
1180 start_time
= sched_clock();
1181 while(DSI_REG
->DSI_INTSTA
.RD_RDY
== 0) ///read clear
1183 end_time
= sched_clock();
1184 if(((unsigned int)sched_clock() - (unsigned int)start_time
) > 50000)
1187 printk("Test log 4:Polling DSI read ready timeout,%d us\n", (unsigned int)sched_clock() - (unsigned int)start_time
);
1189 MMProfileLogEx(MTKFB_MMP_Events
.Debug
, MMProfileFlagPulse
, 0, 13);
1191 OUTREGBIT(DSI_RACK_REG
,DSI_REG
->DSI_RACK
,DSI_RACK
,1);
1194 read_timeout_ret
= 1;
1198 if(1 == read_timeout_ret
){
1199 read_timeout_ret
= 0;
1203 MMProfileLogEx(MTKFB_MMP_Events
.Debug
, MMProfileFlagPulse
, 0, 6);
1204 OUTREGBIT(DSI_RACK_REG
,DSI_REG
->DSI_RACK
,DSI_RACK
,1);
1205 OUTREGBIT(DSI_INT_STATUS_REG
,DSI_REG
->DSI_INTSTA
,RD_RDY
,0);
1207 if(((DSI_REG
->DSI_TRIG_STA
.TRIG2
) )==1)
1215 OUTREG32(&read_data0
, AS_UINT32(&DSI_REG
->DSI_RX_DATA0
));
1216 OUTREG32(&read_data1
, AS_UINT32(&DSI_REG
->DSI_RX_DATA1
));
1219 printk("read_data0, %x,%x,%x,%x\n", read_data0
.byte0
, read_data0
.byte1
, read_data0
.byte2
, read_data0
.byte3
);
1220 printk("read_data1, %x,%x,%x,%x\n", read_data1
.byte0
, read_data1
.byte1
, read_data1
.byte2
, read_data1
.byte3
);
1222 if(((read_data0
.byte1
&0x7) != 0)||((read_data0
.byte2
&0x3)!=0)) //bit 0-3 bit 8-9
1229 break;// jump out the for loop ,go to refresh
1236 printk("detect times:%d\n",i
);
1239 MMProfileLogEx(MTKFB_MMP_Events
.Debug
, MMProfileFlagPulse
, 0, 7);
1241 switch(lcm_params
->dsi
.LANE_NUM
)
1244 OUTREG32(MIPI_CONFIG_BASE
+ 0x84, 0x3CF3C7B1);
1246 case LCM_THREE_LANE
:
1247 OUTREG32(MIPI_CONFIG_BASE
+ 0x84, 0x00F3C7B1);
1250 OUTREG32(MIPI_CONFIG_BASE
+ 0x84, 0x0003C7B1);
1253 OUTREG32(MIPI_CONFIG_BASE
+ 0x88, 0x0);
1254 OUTREG32(MIPI_CONFIG_BASE
+ 0x80, 0x1);
1256 DSI_REG
->DSI_COM_CTRL
.DSI_RESET
= 0;
1257 DSI_REG
->DSI_COM_CTRL
.DSI_RESET
= 1;
1258 DSI_REG
->DSI_COM_CTRL
.DSI_RESET
= 0;
1262 while((INREG32(&DSI_REG
->DSI_STATE_DBG0
)&0x40000) == 0); // polling bit18
1264 OUTREG32(MIPI_CONFIG_BASE
+ 0x80, 0x0);
1266 start_time
= sched_clock();
1267 while(DSI_REG
->DSI_INTSTA
.BUSY
) {
1268 end_time
= sched_clock();
1269 if(((unsigned int)sched_clock() - (unsigned int)start_time
) > 50000)
1275 OUTREG32(&DSI_REG
->DSI_INTSTA
, 0x0);
1277 OUTREGBIT(DSI_INT_ENABLE_REG
,DSI_REG
->DSI_INTEN
,RD_RDY
,1);
1278 OUTREGBIT(DSI_INT_ENABLE_REG
,DSI_REG
->DSI_INTEN
,CMD_DONE
,1);
1280 DSI_SetMode(lcm_params
->dsi
.mode
);
1281 MMProfileLogEx(MTKFB_MMP_Events
.Debug
, MMProfileFlagPulse
, 0, 8);
1283 // if(glitch_log_on)
1285 glitch_detect_fail_cnt
++;
1289 glitch_detect_fail_cnt
= 0;
1293 static unsigned int DSI_Detect_CLK_Glitch_Parallel(void)
1297 int read_timeout_cnt
=10000;
1298 int read_timeout_ret
= 0;
1300 unsigned long long start_time
,end_time
;
1301 DSI_RX_DATA_REG read_data0
;
1302 DSI_RX_DATA_REG read_data1
;
1304 if(glitch_detect_fail_cnt
>2){
1308 while(DSI_REG
->DSI_INTSTA
.BUSY
);
1309 OUTREG32(&DSI_REG
->DSI_INTSTA
, 0x0);
1312 DSI_SetMode(CMD_MODE
);
1313 OUTREGBIT(DSI_INT_ENABLE_REG
,DSI_REG
->DSI_INTEN
,RD_RDY
,0);
1314 OUTREGBIT(DSI_INT_ENABLE_REG
,DSI_REG
->DSI_INTEN
,CMD_DONE
,0);
1315 MMProfileLogEx(MTKFB_MMP_Events
.Debug
, MMProfileFlagPulse
, 0, 0);
1316 for(i
=0;i
<try_times
*4;i
++)
1318 if(read_IC_ID
== 0) // slave
1323 MMProfileLogEx(MTKFB_MMP_Events
.Debug
, MMProfileFlagPulse
, 0, 9);
1324 while((INREG32(&DSI_REG
->DSI_STATE_DBG0
)&0x1) == 0); // polling bit0
1326 OUTREGBIT(DSI_COM_CTRL_REG
,DSI_REG
->DSI_COM_CTRL
,DSI_RESET
,0);
1327 OUTREGBIT(DSI_COM_CTRL_REG
,DSI_REG
->DSI_COM_CTRL
,DSI_RESET
,1);//reset
1328 OUTREGBIT(DSI_COM_CTRL_REG
,DSI_REG
->DSI_COM_CTRL
,DSI_RESET
,0);
1330 MMProfileLogEx(MTKFB_MMP_Events
.Debug
, MMProfileFlagPulse
, 0, 10);
1333 MASKREG32(MIPI_CONFIG_BASE
+ 0x04, 0x20, 0x0);
1337 MMProfileLogEx(MTKFB_MMP_Events
.Debug
, MMProfileFlagPulse
, 0, 1);
1338 while((INREG32(&DSI_REG
->DSI_STATE_DBG0
)&0x40000) == 0); // polling bit18 start
1339 MMProfileLogEx(MTKFB_MMP_Events
.Debug
, MMProfileFlagPulse
, 0, 2);
1342 MASKREG32(MIPI_CONFIG_BASE
+ 0x04, 0x20, 0x20);
1344 // OUTREG32(&DSI_CMDQ_REG->data[0], 0x00290508);
1349 OUTREG32(&DSI_CMDQ_REG
->data
[0], 0xAA801508);
1350 OUTREG32(&DSI_REG
->DSI_CMDQ_SIZE
, 1);
1352 OUTREGBIT(DSI_START_REG
,DSI_REG
->DSI_START
,DSI_START
,0);
1353 OUTREGBIT(DSI_START_REG
,DSI_REG
->DSI_START
,DSI_START
,1);
1355 read_timeout_cnt
=1000000;
1356 MMProfileLogEx(MTKFB_MMP_Events
.Debug
, MMProfileFlagPulse
, 0, 3);
1357 start_time
= sched_clock();
1358 while(DSI_REG
->DSI_INTSTA
.BUSY
) {
1359 end_time
= sched_clock();
1360 if(((unsigned int)sched_clock() - (unsigned int)start_time
) > 50000){
1361 DISP_LOG_PRINT(ANDROID_LOG_ERROR
, "DSI", " Wait for DSI engine not busy timeout!!!:%d\n",__LINE__
);
1366 OUTREG32(&DSI_REG
->DSI_INTSTA
, 0x0);
1367 // spin_unlock_irq(&dsi_glitch_detect_lock);
1368 MMProfileLogEx(MTKFB_MMP_Events
.Debug
, MMProfileFlagPulse
, 0, 4);
1372 if(read_IC_ID
== 0) // slave
1374 //OUTREG32(&DSI_CMDQ_REG->data[0], 0x00023902);
1375 //OUTREG32(&DSI_CMDQ_REG->data[1], 0x000010B5);
1376 OUTREG32(&DSI_CMDQ_REG
->data
[0], 0x10B51500);
1378 else // read_IC_ID == 1, master
1380 //OUTREG32(&DSI_CMDQ_REG->data[0], 0x00023902);
1381 //OUTREG32(&DSI_CMDQ_REG->data[1], 0x000090B5);
1382 OUTREG32(&DSI_CMDQ_REG
->data
[0], 0x90B51500);
1385 OUTREG32(&DSI_REG
->DSI_CMDQ_SIZE
, 1);
1386 OUTREGBIT(DSI_START_REG
,DSI_REG
->DSI_START
,DSI_START
,0);
1387 OUTREGBIT(DSI_START_REG
,DSI_REG
->DSI_START
,DSI_START
,1);
1388 while(DSI_REG
->DSI_INTSTA
.CMD_DONE
== 0);
1389 OUTREGBIT(DSI_INT_STATUS_REG
,DSI_REG
->DSI_INTSTA
,CMD_DONE
,0);
1396 OUTREG32(&DSI_CMDQ_REG
->data
[0], AS_UINT32(&t0
));
1397 OUTREG32(&DSI_REG
->DSI_CMDQ_SIZE
, 1);
1399 OUTREGBIT(DSI_START_REG
,DSI_REG
->DSI_START
,DSI_START
,0);
1400 OUTREGBIT(DSI_START_REG
,DSI_REG
->DSI_START
,DSI_START
,1);
1403 read_timeout_cnt
=1000;
1404 MMProfileLogEx(MTKFB_MMP_Events
.Debug
, MMProfileFlagPulse
, 0, 5);
1405 start_time
= sched_clock();
1406 while(DSI_REG
->DSI_INTSTA
.RD_RDY
== 0) ///read clear
1408 end_time
= sched_clock();
1409 if(((unsigned int)sched_clock() - (unsigned int)start_time
) > 50000)
1412 printk("Test log 4:Polling DSI read ready timeout,%d us\n", (unsigned int)sched_clock() - (unsigned int)start_time
);
1414 MMProfileLogEx(MTKFB_MMP_Events
.Debug
, MMProfileFlagPulse
, 0, 13);
1416 OUTREGBIT(DSI_RACK_REG
,DSI_REG
->DSI_RACK
,DSI_RACK
,1);
1419 read_timeout_ret
= 1;
1423 if(1 == read_timeout_ret
){
1424 read_timeout_ret
= 0;
1425 printk("iii detect timeout ID:%d\n",read_IC_ID
);
1429 MMProfileLogEx(MTKFB_MMP_Events
.Debug
, MMProfileFlagPulse
, 0, 6);
1430 OUTREGBIT(DSI_RACK_REG
,DSI_REG
->DSI_RACK
,DSI_RACK
,1);
1431 OUTREGBIT(DSI_INT_STATUS_REG
,DSI_REG
->DSI_INTSTA
,RD_RDY
,0);
1433 if(((DSI_REG
->DSI_TRIG_STA
.TRIG2
) )==1)
1445 OUTREG32(&read_data0
, AS_UINT32(&DSI_REG
->DSI_RX_DATA0
));
1446 OUTREG32(&read_data1
, AS_UINT32(&DSI_REG
->DSI_RX_DATA1
));
1449 printk("read_data0, %x,%x,%x,%x\n", read_data0
.byte0
, read_data0
.byte1
, read_data0
.byte2
, read_data0
.byte3
);
1450 printk("read_data1, %x,%x,%x,%x\n", read_data1
.byte0
, read_data1
.byte1
, read_data1
.byte2
, read_data1
.byte3
);
1452 if(((read_data0
.byte1
&0x4) != 0)||((read_data0
.byte2
&0x3)!=0)) //bit 3 bit 8-9
1454 printk("111 ID:%d ECC err read_data0, %x,%x,%x,%x\n", read_IC_ID
, read_data0
.byte0
, read_data0
.byte1
, read_data0
.byte2
, read_data0
.byte3
);
1457 if(((read_data0
.byte1
&0x7) != 0)||((read_data0
.byte2
&0x3)!=0)) //bit 0-3 bit 8-9
1459 printk("read_data0, %x,%x,%x,%x\n", read_data0
.byte0
, read_data0
.byte1
, read_data0
.byte2
, read_data0
.byte3
);
1460 printk("iii detect error ID:%d\n",read_IC_ID
);
1471 break;// jump out the for loop ,go to refresh
1478 printk("detect times:%d\n",i
);
1481 MMProfileLogEx(MTKFB_MMP_Events
.Debug
, MMProfileFlagPulse
, 0, 7);
1483 switch(lcm_params
->dsi
.LANE_NUM
)
1486 OUTREG32(MIPI_CONFIG_BASE
+ 0x84, 0x3CF3C7B1);
1488 case LCM_THREE_LANE
:
1489 OUTREG32(MIPI_CONFIG_BASE
+ 0x84, 0x00F3C7B1);
1492 OUTREG32(MIPI_CONFIG_BASE
+ 0x84, 0x0003C7B1);
1495 OUTREG32(MIPI_CONFIG_BASE
+ 0x88, 0x0);
1496 OUTREG32(MIPI_CONFIG_BASE
+ 0x80, 0x1);
1498 DSI_REG
->DSI_COM_CTRL
.DSI_RESET
= 0;
1499 DSI_REG
->DSI_COM_CTRL
.DSI_RESET
= 1;
1500 DSI_REG
->DSI_COM_CTRL
.DSI_RESET
= 0;
1504 while((INREG32(&DSI_REG
->DSI_STATE_DBG0
)&0x40000) == 0); // polling bit18
1506 OUTREG32(MIPI_CONFIG_BASE
+ 0x80, 0x0);
1508 start_time
= sched_clock();
1509 while(DSI_REG
->DSI_INTSTA
.BUSY
) {
1510 end_time
= sched_clock();
1511 if(((unsigned int)sched_clock() - (unsigned int)start_time
) > 50000)
1517 OUTREG32(&DSI_REG
->DSI_INTSTA
, 0x0);
1519 OUTREGBIT(DSI_INT_ENABLE_REG
,DSI_REG
->DSI_INTEN
,RD_RDY
,1);
1520 OUTREGBIT(DSI_INT_ENABLE_REG
,DSI_REG
->DSI_INTEN
,CMD_DONE
,1);
1522 DSI_SetMode(lcm_params
->dsi
.mode
);
1523 MMProfileLogEx(MTKFB_MMP_Events
.Debug
, MMProfileFlagPulse
, 0, 8);
1525 // if(glitch_log_on)
1526 if(i
== try_times
*4){
1527 glitch_detect_fail_cnt
++;
1531 glitch_detect_fail_cnt
= 0;
1535 unsigned int DSI_Detect_CLK_Glitch(void)
1537 if (lcm_params
->dsi
.compatibility_for_nvk
== 1)
1539 return DSI_Detect_CLK_Glitch_Default();
1541 else if (lcm_params
->dsi
.compatibility_for_nvk
== 2)
1543 return DSI_Detect_CLK_Glitch_Parallel();
1547 return DSI_Detect_CLK_Glitch_Default();
1552 DSI_STATUS
DSI_Config_VDO_FRM_Mode(void)
1555 force_transfer
= true;
1556 OUTREGBIT(DSI_MODE_CTRL_REG
,DSI_REG
->DSI_MODE_CTRL
,FRM_MODE
,1);
1557 return DSI_STATUS_OK
;
1560 DSI_STATUS
DSI_DisableClk(void)
1562 //DSI_REG->DSI_START.DSI_START=0;
1563 OUTREGBIT(DSI_COM_CTRL_REG
,DSI_REG
->DSI_COM_CTRL
,DSI_EN
,0);
1565 return DSI_STATUS_OK
;
1569 DSI_STATUS
DSI_Reset(void)
1571 //DSI_REG->DSI_COM_CTRL.DSI_RESET = 1;
1572 OUTREGBIT(DSI_COM_CTRL_REG
,DSI_REG
->DSI_COM_CTRL
,DSI_RESET
,1);
1574 //DSI_REG->DSI_COM_CTRL.DSI_RESET = 0;
1575 OUTREGBIT(DSI_COM_CTRL_REG
,DSI_REG
->DSI_COM_CTRL
,DSI_RESET
,0);
1578 return DSI_STATUS_OK
;
1581 DSI_STATUS
DSI_LP_Reset(void)
1584 _WaitForEngineNotBusy();
1585 OUTREGBIT(DSI_COM_CTRL_REG
,DSI_REG
->DSI_COM_CTRL
,DSI_RESET
,1);
1586 OUTREGBIT(DSI_COM_CTRL_REG
,DSI_REG
->DSI_COM_CTRL
,DSI_RESET
,0);
1588 return DSI_STATUS_OK
;
1591 DSI_STATUS
DSI_SetMode(unsigned int mode
)
1594 //DSI_REG->DSI_MODE_CTRL.MODE = mode;
1595 OUTREGBIT(DSI_MODE_CTRL_REG
,DSI_REG
->DSI_MODE_CTRL
,MODE
,mode
);
1596 return DSI_STATUS_OK
;
1599 static void _DSI_RDMA0_IRQ_Handler(unsigned int param
)
1601 if(_dsiContext
.pIntCallback
)
1605 MMProfileLogEx(MTKFB_MMP_Events
.ScreenUpdate
, MMProfileFlagEnd
, param
, 0);
1606 _dsiContext
.pIntCallback(DISP_DSI_SCREEN_UPDATE_END_INT
);
1610 MMProfileLogEx(MTKFB_MMP_Events
.ScreenUpdate
, MMProfileFlagEnd
, param
, 0);
1614 MMProfileLogEx(MTKFB_MMP_Events
.ScreenUpdate
, MMProfileFlagStart
, param
, 0);
1615 _dsiContext
.pIntCallback(DISP_DSI_SCREEN_UPDATE_START_INT
);
1619 _dsiContext
.pIntCallback(DISP_DSI_TARGET_LINE_INT
);
1620 _dsiContext
.pIntCallback(DISP_DSI_VSYNC_INT
);
1625 static void _DSI_MUTEX_IRQ_Handler(unsigned int param
)
1627 if(_dsiContext
.pIntCallback
)
1629 #ifndef MTK_OVERLAY_ENGINE_SUPPORT
1633 _dsiContext
.pIntCallback(DISP_DSI_REG_UPDATE_INT
);
1638 DSI_STATUS
DSI_SleepOut(void)
1640 OUTREGBIT(DSI_MODE_CTRL_REG
,DSI_REG
->DSI_MODE_CTRL
,SLEEP_MODE
,1);
1641 OUTREGBIT(DSI_PHY_TIMCON4_REG
,DSI_REG
->DSI_PHY_TIMECON4
,ULPS_WAKEUP
,0x22E09); // cycle to 1ms for 520MHz
1643 return DSI_STATUS_OK
;
1647 DSI_STATUS
DSI_Wakeup(void)
1649 OUTREGBIT(DSI_START_REG
,DSI_REG
->DSI_START
,SLEEPOUT_START
,0);
1650 OUTREGBIT(DSI_START_REG
,DSI_REG
->DSI_START
,SLEEPOUT_START
,1);
1653 OUTREGBIT(DSI_START_REG
,DSI_REG
->DSI_START
,SLEEPOUT_START
,0);
1654 OUTREGBIT(DSI_MODE_CTRL_REG
,DSI_REG
->DSI_MODE_CTRL
,SLEEP_MODE
,0);
1656 return DSI_STATUS_OK
;
1659 DSI_STATUS
DSI_EnableInterrupt(DISP_INTERRUPT_EVENTS eventID
)
1661 #if ENABLE_DSI_INTERRUPT
1664 case DISP_DSI_READ_RDY_INT
:
1665 //DSI_REG->DSI_INTEN.RD_RDY = 1;
1666 OUTREGBIT(DSI_INT_ENABLE_REG
,DSI_REG
->DSI_INTEN
,RD_RDY
,1);
1668 case DISP_DSI_CMD_DONE_INT
:
1669 //DSI_REG->DSI_INTEN.CMD_DONE = 1;
1670 OUTREGBIT(DSI_INT_ENABLE_REG
,DSI_REG
->DSI_INTEN
,CMD_DONE
,1);
1672 case DISP_DSI_VMDONE_INT
:
1673 OUTREGBIT(DSI_INT_ENABLE_REG
,DSI_REG
->DSI_INTEN
,VM_DONE
,1);
1675 case DISP_DSI_VSYNC_INT
:
1676 disp_register_irq(DISP_MODULE_RDMA0
, _DSI_RDMA0_IRQ_Handler
);
1678 case DISP_DSI_TARGET_LINE_INT
:
1679 disp_register_irq(DISP_MODULE_RDMA0
, _DSI_RDMA0_IRQ_Handler
);
1681 case DISP_DSI_SCREEN_UPDATE_START_INT
:
1682 disp_register_irq(DISP_MODULE_RDMA0
, _DSI_RDMA0_IRQ_Handler
);
1684 case DISP_DSI_SCREEN_UPDATE_END_INT
:
1685 disp_register_irq(DISP_MODULE_RDMA0
, _DSI_RDMA0_IRQ_Handler
);
1687 case DISP_DSI_REG_UPDATE_INT
:
1688 //wake_up_interruptible(&_dsi_reg_update_wq);
1689 disp_register_irq(DISP_MODULE_MUTEX
, _DSI_MUTEX_IRQ_Handler
);
1692 return DSI_STATUS_ERROR
;
1695 return DSI_STATUS_OK
;
1697 ///TODO: warning log here
1698 return DSI_STATUS_OK
;
1703 DSI_STATUS
DSI_SetInterruptCallback(void (*pCB
)(DISP_INTERRUPT_EVENTS
))
1705 _dsiContext
.pIntCallback
= pCB
;
1707 return DSI_STATUS_OK
;
1710 DSI_STATUS
DSI_handle_TE(void)
1713 unsigned int data_array
;
1715 //data_array=0x00351504;
1716 //DSI_set_cmdq(&data_array, 1, 1);
1722 //OUTREG32(&DSI_REG->DSI_RACK, data_array);
1726 DISP_LOG_PRINT(ANDROID_LOG_INFO
, "DSI", "[DISP] DSI_handle_TE TE + BTA !! \n");
1727 OUTREG32(&DSI_CMDQ_REG
->data
, data_array
);
1729 //DSI_CMDQ_REG->data.byte0=0x24;
1730 //DSI_CMDQ_REG->data.byte1=0;
1731 //DSI_CMDQ_REG->data.byte2=0;
1732 //DSI_CMDQ_REG->data.byte3=0;
1734 //DSI_REG->DSI_CMDQ_SIZE.CMDQ_SIZE=1;
1735 OUTREGBIT(DSI_CMDQ_CTRL_REG
,DSI_REG
->DSI_CMDQ_SIZE
,CMDQ_SIZE
,1);
1737 //DSI_REG->DSI_START.DSI_START=0;
1738 //DSI_REG->DSI_START.DSI_START=1;
1739 OUTREGBIT(DSI_START_REG
,DSI_REG
->DSI_START
,DSI_START
,0);
1740 OUTREGBIT(DSI_START_REG
,DSI_REG
->DSI_START
,DSI_START
,1);
1743 // wait TE Trigger status
1748 data_array
=INREG32(&DSI_REG
->DSI_INTSTA
);
1749 DISP_LOG_PRINT(ANDROID_LOG_INFO
, "DSI", "[DISP] DSI INT state : %x !! \n", data_array
);
1751 data_array
=INREG32(&DSI_REG
->DSI_TRIG_STA
);
1752 DISP_LOG_PRINT(ANDROID_LOG_INFO
, "DSI", "[DISP] DSI TRIG TE status check : %x !! \n", data_array
);
1753 // } while(!(data_array&0x4));
1756 DISP_LOG_PRINT(ANDROID_LOG_INFO
, "DSI", "[DISP] DSI Set RACT !! \n");
1758 OUTREG32(&DSI_REG
->DSI_RACK
, data_array
);
1760 return DSI_STATUS_OK
;
1768 void DSI_PHY_clk_setting(LCM_PARAMS
*lcm_params
)
1770 unsigned int data_Rate
= lcm_params
->dsi
.PLL_CLOCK
*2;
1771 unsigned int txdiv
,pcw
;
1772 // unsigned int fmod = 30;//Fmod = 30KHz by default
1773 unsigned int delta1
= 5;//Delta1 is SSC range, default is 0%~-5%
1774 unsigned int pdelta1
;
1776 OUTREGBIT(MIPITX_DSI_TOP_CON_REG
,DSI_PHY_REG
->MIPITX_DSI_TOP_CON
,RG_DSI_LNT_IMP_CAL_CODE
,8);
1777 OUTREGBIT(MIPITX_DSI_TOP_CON_REG
,DSI_PHY_REG
->MIPITX_DSI_TOP_CON
,RG_DSI_LNT_HS_BIAS_EN
,1);
1779 OUTREGBIT(MIPITX_DSI_BG_CON_REG
,DSI_PHY_REG
->MIPITX_DSI_BG_CON
,RG_DSI_V032_SEL
,4);
1780 OUTREGBIT(MIPITX_DSI_BG_CON_REG
,DSI_PHY_REG
->MIPITX_DSI_BG_CON
,RG_DSI_V04_SEL
,4);
1781 OUTREGBIT(MIPITX_DSI_BG_CON_REG
,DSI_PHY_REG
->MIPITX_DSI_BG_CON
,RG_DSI_V072_SEL
,4);
1782 OUTREGBIT(MIPITX_DSI_BG_CON_REG
,DSI_PHY_REG
->MIPITX_DSI_BG_CON
,RG_DSI_V10_SEL
,4);
1783 OUTREGBIT(MIPITX_DSI_BG_CON_REG
,DSI_PHY_REG
->MIPITX_DSI_BG_CON
,RG_DSI_V12_SEL
,4);
1784 OUTREGBIT(MIPITX_DSI_BG_CON_REG
,DSI_PHY_REG
->MIPITX_DSI_BG_CON
,RG_DSI_BG_CKEN
,1);
1785 OUTREGBIT(MIPITX_DSI_BG_CON_REG
,DSI_PHY_REG
->MIPITX_DSI_BG_CON
,RG_DSI_BG_CORE_EN
,1);
1788 OUTREGBIT(MIPITX_DSI0_CON_REG
,DSI_PHY_REG
->MIPITX_DSI0_CON
,RG_DSI0_CKG_LDOOUT_EN
,1);
1789 OUTREGBIT(MIPITX_DSI0_CON_REG
,DSI_PHY_REG
->MIPITX_DSI0_CON
,RG_DSI0_LDOCORE_EN
,1);
1791 OUTREGBIT(MIPITX_DSI_PLL_PWR_REG
,DSI_PHY_REG
->MIPITX_DSI_PLL_PWR
,DA_DSI0_MPPLL_SDM_PWR_ON
,1);
1792 OUTREGBIT(MIPITX_DSI_PLL_PWR_REG
,DSI_PHY_REG
->MIPITX_DSI_PLL_PWR
,DA_DSI0_MPPLL_SDM_ISO_EN
,1);
1795 OUTREGBIT(MIPITX_DSI_PLL_PWR_REG
,DSI_PHY_REG
->MIPITX_DSI_PLL_PWR
,DA_DSI0_MPPLL_SDM_ISO_EN
,0);
1797 OUTREGBIT(MIPITX_DSI_PLL_CON0_REG
,DSI_PHY_REG
->MIPITX_DSI_PLL_CON0
,RG_DSI0_MPPLL_PREDIV
,0);
1798 OUTREGBIT(MIPITX_DSI_PLL_CON0_REG
,DSI_PHY_REG
->MIPITX_DSI_PLL_CON0
,RG_DSI0_MPPLL_POSDIV
,0);
1800 if(0!=data_Rate
){//if lcm_params->dsi.PLL_CLOCK=0, use other method
1801 if(data_Rate
> 1250){
1802 printk("[dsi_drv.c error]Data Rate exceed limitation\n");
1805 else if(data_Rate
>= 500)
1807 else if(data_Rate
>= 250)
1809 else if(data_Rate
>= 125)
1811 else if(data_Rate
> 62)
1813 else if(data_Rate
>= 50)
1816 printk("[dsi_drv.c Error]: dataRate is too low,%d!!!\n", __LINE__
);
1823 OUTREGBIT(MIPITX_DSI_PLL_CON0_REG
,DSI_PHY_REG
->MIPITX_DSI_PLL_CON0
,RG_DSI0_MPPLL_TXDIV0
,0);
1824 OUTREGBIT(MIPITX_DSI_PLL_CON0_REG
,DSI_PHY_REG
->MIPITX_DSI_PLL_CON0
,RG_DSI0_MPPLL_TXDIV1
,0);
1827 OUTREGBIT(MIPITX_DSI_PLL_CON0_REG
,DSI_PHY_REG
->MIPITX_DSI_PLL_CON0
,RG_DSI0_MPPLL_TXDIV0
,1);
1828 OUTREGBIT(MIPITX_DSI_PLL_CON0_REG
,DSI_PHY_REG
->MIPITX_DSI_PLL_CON0
,RG_DSI0_MPPLL_TXDIV1
,0);
1831 OUTREGBIT(MIPITX_DSI_PLL_CON0_REG
,DSI_PHY_REG
->MIPITX_DSI_PLL_CON0
,RG_DSI0_MPPLL_TXDIV0
,2);
1832 OUTREGBIT(MIPITX_DSI_PLL_CON0_REG
,DSI_PHY_REG
->MIPITX_DSI_PLL_CON0
,RG_DSI0_MPPLL_TXDIV1
,0);
1835 OUTREGBIT(MIPITX_DSI_PLL_CON0_REG
,DSI_PHY_REG
->MIPITX_DSI_PLL_CON0
,RG_DSI0_MPPLL_TXDIV0
,2);
1836 OUTREGBIT(MIPITX_DSI_PLL_CON0_REG
,DSI_PHY_REG
->MIPITX_DSI_PLL_CON0
,RG_DSI0_MPPLL_TXDIV1
,1);
1839 OUTREGBIT(MIPITX_DSI_PLL_CON0_REG
,DSI_PHY_REG
->MIPITX_DSI_PLL_CON0
,RG_DSI0_MPPLL_TXDIV0
,2);
1840 OUTREGBIT(MIPITX_DSI_PLL_CON0_REG
,DSI_PHY_REG
->MIPITX_DSI_PLL_CON0
,RG_DSI0_MPPLL_TXDIV1
,2);
1848 PCW bit 24~30 = floor(pcw)
1849 PCW bit 16~23 = (pcw - floor(pcw))*256
1850 PCW bit 8~15 = (pcw*256 - floor(pcw)*256)*256
1851 PCW bit 8~15 = (pcw*256*256 - floor(pcw)*256*256)*256
1853 // pcw = data_Rate*4*txdiv/(26*2);//Post DIV =4, so need data_Rate*4
1854 pcw
= data_Rate
*txdiv
/13;
1856 OUTREGBIT(MIPITX_DSI_PLL_CON2_REG
,DSI_PHY_REG
->MIPITX_DSI_PLL_CON2
,RG_DSI0_MPPLL_SDM_PCW_H
,(pcw
& 0x7F));
1857 OUTREGBIT(MIPITX_DSI_PLL_CON2_REG
,DSI_PHY_REG
->MIPITX_DSI_PLL_CON2
,RG_DSI0_MPPLL_SDM_PCW_16_23
,((256*(data_Rate
*txdiv
%13)/13) & 0xFF));
1858 OUTREGBIT(MIPITX_DSI_PLL_CON2_REG
,DSI_PHY_REG
->MIPITX_DSI_PLL_CON2
,RG_DSI0_MPPLL_SDM_PCW_8_15
,((256*(256*(data_Rate
*txdiv
%13)%13)/13) & 0xFF));
1859 OUTREGBIT(MIPITX_DSI_PLL_CON2_REG
,DSI_PHY_REG
->MIPITX_DSI_PLL_CON2
,RG_DSI0_MPPLL_SDM_PCW_0_7
,((256*(256*(256*(data_Rate
*txdiv
%13)%13)%13)/13) & 0xFF));
1862 // pmod = ROUND(1000*26MHz/fmod/2);fmod default is 30Khz, and this value not be changed
1864 if(1 != lcm_params
->dsi
.ssc_disable
){
1865 OUTREGBIT(MIPITX_DSI_PLL_CON1_REG
,DSI_PHY_REG
->MIPITX_DSI_PLL_CON1
,RG_DSI0_MPPLL_SDM_SSC_PH_INIT
,1);
1866 OUTREGBIT(MIPITX_DSI_PLL_CON1_REG
,DSI_PHY_REG
->MIPITX_DSI_PLL_CON1
,RG_DSI0_MPPLL_SDM_SSC_PRD
,0x1B1);//PRD=ROUND(pmod) = 433;
1867 if(0 != lcm_params
->dsi
.ssc_range
){
1868 delta1
= lcm_params
->dsi
.ssc_range
;
1871 pdelta1
= (delta1
*data_Rate
*txdiv
*262144+281664)/563329;
1872 OUTREGBIT(MIPITX_DSI_PLL_CON3_REG
,DSI_PHY_REG
->MIPITX_DSI_PLL_CON3
,RG_DSI0_MPPLL_SDM_SSC_DELTA
,pdelta1
);
1873 OUTREGBIT(MIPITX_DSI_PLL_CON3_REG
,DSI_PHY_REG
->MIPITX_DSI_PLL_CON3
,RG_DSI0_MPPLL_SDM_SSC_DELTA1
,pdelta1
);
1874 //OUTREGBIT(MIPITX_DSI_PLL_CON1_REG,DSI_PHY_REG->MIPITX_DSI_PLL_CON1,RG_DSI0_MPPLL_SDM_FRA_EN,1);
1875 printk("[dsi_drv.c] PLL config:data_rate=%d,txdiv=%d,pcw=%d,delta1=%d,pdelta1=0x%x\n",
1876 data_Rate
,txdiv
,INREG32(&DSI_PHY_REG
->MIPITX_DSI_PLL_CON2
),delta1
,pdelta1
);
1880 OUTREGBIT(MIPITX_DSI_PLL_CON0_REG
,DSI_PHY_REG
->MIPITX_DSI_PLL_CON0
,RG_DSI0_MPPLL_TXDIV0
,lcm_params
->dsi
.pll_div1
);
1881 OUTREGBIT(MIPITX_DSI_PLL_CON0_REG
,DSI_PHY_REG
->MIPITX_DSI_PLL_CON0
,RG_DSI0_MPPLL_TXDIV1
,lcm_params
->dsi
.pll_div2
);
1883 OUTREGBIT(MIPITX_DSI_PLL_CON2_REG
,DSI_PHY_REG
->MIPITX_DSI_PLL_CON2
,RG_DSI0_MPPLL_SDM_PCW_H
,((lcm_params
->dsi
.fbk_div
)<< 2));
1884 OUTREGBIT(MIPITX_DSI_PLL_CON2_REG
,DSI_PHY_REG
->MIPITX_DSI_PLL_CON2
,RG_DSI0_MPPLL_SDM_PCW_16_23
,0);
1885 OUTREGBIT(MIPITX_DSI_PLL_CON2_REG
,DSI_PHY_REG
->MIPITX_DSI_PLL_CON2
,RG_DSI0_MPPLL_SDM_PCW_8_15
,0);
1886 OUTREGBIT(MIPITX_DSI_PLL_CON2_REG
,DSI_PHY_REG
->MIPITX_DSI_PLL_CON2
,RG_DSI0_MPPLL_SDM_PCW_0_7
,0);
1888 //OUTREGBIT(MIPITX_DSI_PLL_CON1_REG,DSI_PHY_REG->MIPITX_DSI_PLL_CON1,RG_DSI0_MPPLL_SDM_FRA_EN,0);
1890 OUTREGBIT(MIPITX_DSI_PLL_CON1_REG
,DSI_PHY_REG
->MIPITX_DSI_PLL_CON1
,RG_DSI0_MPPLL_SDM_FRA_EN
,1);
1892 OUTREGBIT(MIPITX_DSI0_CLOCK_LANE_REG
,DSI_PHY_REG
->MIPITX_DSI0_CLOCK_LANE
,RG_DSI0_LNTC_RT_CODE
,0x8);
1893 OUTREGBIT(MIPITX_DSI0_CLOCK_LANE_REG
,DSI_PHY_REG
->MIPITX_DSI0_CLOCK_LANE
,RG_DSI0_LNTC_PHI_SEL
,0x1);
1894 OUTREGBIT(MIPITX_DSI0_CLOCK_LANE_REG
,DSI_PHY_REG
->MIPITX_DSI0_CLOCK_LANE
,RG_DSI0_LNTC_LDOOUT_EN
,1);
1895 if(lcm_params
->dsi
.LANE_NUM
> 0)
1897 OUTREGBIT(MIPITX_DSI0_DATA_LANE0_REG
,DSI_PHY_REG
->MIPITX_DSI0_DATA_LANE0
,RG_DSI0_LNT0_RT_CODE
,0x8);
1898 OUTREGBIT(MIPITX_DSI0_DATA_LANE0_REG
,DSI_PHY_REG
->MIPITX_DSI0_DATA_LANE0
,RG_DSI0_LNT0_LDOOUT_EN
,1);
1901 if(lcm_params
->dsi
.LANE_NUM
> 1)
1903 OUTREGBIT(MIPITX_DSI0_DATA_LANE1_REG
,DSI_PHY_REG
->MIPITX_DSI0_DATA_LANE1
,RG_DSI0_LNT1_RT_CODE
,0x8);
1904 OUTREGBIT(MIPITX_DSI0_DATA_LANE1_REG
,DSI_PHY_REG
->MIPITX_DSI0_DATA_LANE1
,RG_DSI0_LNT1_LDOOUT_EN
,1);
1907 if(lcm_params
->dsi
.LANE_NUM
> 2)
1909 OUTREGBIT(MIPITX_DSI0_DATA_LANE2_REG
,DSI_PHY_REG
->MIPITX_DSI0_DATA_LANE2
,RG_DSI0_LNT2_RT_CODE
,0x8);
1910 OUTREGBIT(MIPITX_DSI0_DATA_LANE2_REG
,DSI_PHY_REG
->MIPITX_DSI0_DATA_LANE2
,RG_DSI0_LNT2_LDOOUT_EN
,1);
1913 if(lcm_params
->dsi
.LANE_NUM
> 3)
1915 OUTREGBIT(MIPITX_DSI0_DATA_LANE3_REG
,DSI_PHY_REG
->MIPITX_DSI0_DATA_LANE3
,RG_DSI0_LNT3_RT_CODE
,0x8);
1916 OUTREGBIT(MIPITX_DSI0_DATA_LANE3_REG
,DSI_PHY_REG
->MIPITX_DSI0_DATA_LANE3
,RG_DSI0_LNT3_LDOOUT_EN
,1);
1919 OUTREGBIT(MIPITX_DSI_PLL_CON0_REG
,DSI_PHY_REG
->MIPITX_DSI_PLL_CON0
,RG_DSI0_MPPLL_PLL_EN
,1);
1921 if((0 != data_Rate
) && (1 != lcm_params
->dsi
.ssc_disable
))
1922 OUTREGBIT(MIPITX_DSI_PLL_CON1_REG
,DSI_PHY_REG
->MIPITX_DSI_PLL_CON1
,RG_DSI0_MPPLL_SDM_SSC_EN
,1);
1924 OUTREGBIT(MIPITX_DSI_PLL_CON1_REG
,DSI_PHY_REG
->MIPITX_DSI_PLL_CON1
,RG_DSI0_MPPLL_SDM_SSC_EN
,0);
1926 // default POSDIV by 4
1927 OUTREGBIT(MIPITX_DSI_PLL_TOP_REG
,DSI_PHY_REG
->MIPITX_DSI_PLL_TOP
,RG_MPPLL_PRESERVE_L
,3);
1928 OUTREGBIT(MIPITX_DSI_TOP_CON_REG
,DSI_PHY_REG
->MIPITX_DSI_TOP_CON
,RG_DSI_PAD_TIE_LOW_EN
, 0);
1932 void DSI_PHY_clk_switch(bool on
)
1934 if(on
){//workaround: do nothing
1935 DSI_PHY_clk_setting(lcm_params
);
1940 OUTREGBIT(MIPITX_DSI_SW_CTRL_CON0_REG
,DSI_PHY_REG
->MIPITX_DSI_SW_CTRL_CON0
,SW_LNTC_LPTX_PRE_OE
,1);
1941 OUTREGBIT(MIPITX_DSI_SW_CTRL_CON0_REG
,DSI_PHY_REG
->MIPITX_DSI_SW_CTRL_CON0
,SW_LNTC_LPTX_OE
,1);
1942 OUTREGBIT(MIPITX_DSI_SW_CTRL_CON0_REG
,DSI_PHY_REG
->MIPITX_DSI_SW_CTRL_CON0
,SW_LNT0_LPTX_PRE_OE
,1);
1943 OUTREGBIT(MIPITX_DSI_SW_CTRL_CON0_REG
,DSI_PHY_REG
->MIPITX_DSI_SW_CTRL_CON0
,SW_LNT0_LPTX_OE
,1);
1944 OUTREGBIT(MIPITX_DSI_SW_CTRL_CON0_REG
,DSI_PHY_REG
->MIPITX_DSI_SW_CTRL_CON0
,SW_LNT1_LPTX_PRE_OE
,1);
1945 OUTREGBIT(MIPITX_DSI_SW_CTRL_CON0_REG
,DSI_PHY_REG
->MIPITX_DSI_SW_CTRL_CON0
,SW_LNT1_LPTX_OE
,1);
1946 OUTREGBIT(MIPITX_DSI_SW_CTRL_CON0_REG
,DSI_PHY_REG
->MIPITX_DSI_SW_CTRL_CON0
,SW_LNT2_LPTX_PRE_OE
,1);
1947 OUTREGBIT(MIPITX_DSI_SW_CTRL_CON0_REG
,DSI_PHY_REG
->MIPITX_DSI_SW_CTRL_CON0
,SW_LNT2_LPTX_OE
,1);
1948 OUTREGBIT(MIPITX_DSI_SW_CTRL_CON0_REG
,DSI_PHY_REG
->MIPITX_DSI_SW_CTRL_CON0
,SW_LNT3_LPTX_PRE_OE
,1);
1949 OUTREGBIT(MIPITX_DSI_SW_CTRL_CON0_REG
,DSI_PHY_REG
->MIPITX_DSI_SW_CTRL_CON0
,SW_LNT3_LPTX_OE
,1);
1951 // switch to mipi tx sw mode
1952 OUTREGBIT(MIPITX_DSI_SW_CTRL_REG
,DSI_PHY_REG
->MIPITX_DSI_SW_CTRL
,SW_CTRL_EN
,1);
1954 // disable mipi clock
1955 OUTREGBIT(MIPITX_DSI_PLL_CON0_REG
,DSI_PHY_REG
->MIPITX_DSI_PLL_CON0
,RG_DSI0_MPPLL_PLL_EN
,0);
1957 OUTREGBIT(MIPITX_DSI_PLL_TOP_REG
, DSI_PHY_REG
->MIPITX_DSI_PLL_TOP
, RG_MPPLL_PRESERVE_L
, 0);
1959 OUTREGBIT(MIPITX_DSI_TOP_CON_REG
,DSI_PHY_REG
->MIPITX_DSI_TOP_CON
,RG_DSI_PAD_TIE_LOW_EN
, 1);
1960 OUTREGBIT(MIPITX_DSI0_CLOCK_LANE_REG
,DSI_PHY_REG
->MIPITX_DSI0_CLOCK_LANE
,RG_DSI0_LNTC_LDOOUT_EN
,0);
1961 OUTREGBIT(MIPITX_DSI0_DATA_LANE0_REG
,DSI_PHY_REG
->MIPITX_DSI0_DATA_LANE0
,RG_DSI0_LNT0_LDOOUT_EN
,0);
1962 OUTREGBIT(MIPITX_DSI0_DATA_LANE1_REG
,DSI_PHY_REG
->MIPITX_DSI0_DATA_LANE1
,RG_DSI0_LNT1_LDOOUT_EN
,0);
1963 OUTREGBIT(MIPITX_DSI0_DATA_LANE2_REG
,DSI_PHY_REG
->MIPITX_DSI0_DATA_LANE2
,RG_DSI0_LNT2_LDOOUT_EN
,0);
1964 OUTREGBIT(MIPITX_DSI0_DATA_LANE3_REG
,DSI_PHY_REG
->MIPITX_DSI0_DATA_LANE3
,RG_DSI0_LNT3_LDOOUT_EN
,0);
1967 OUTREGBIT(MIPITX_DSI_PLL_PWR_REG
, DSI_PHY_REG
->MIPITX_DSI_PLL_PWR
, DA_DSI0_MPPLL_SDM_ISO_EN
, 1);
1968 OUTREGBIT(MIPITX_DSI_PLL_PWR_REG
, DSI_PHY_REG
->MIPITX_DSI_PLL_PWR
, DA_DSI0_MPPLL_SDM_PWR_ON
, 0);
1969 OUTREGBIT(MIPITX_DSI_TOP_CON_REG
,DSI_PHY_REG
->MIPITX_DSI_TOP_CON
,RG_DSI_LNT_HS_BIAS_EN
, 0);
1971 OUTREGBIT(MIPITX_DSI0_CON_REG
,DSI_PHY_REG
->MIPITX_DSI0_CON
,RG_DSI0_CKG_LDOOUT_EN
,0);
1972 OUTREGBIT(MIPITX_DSI0_CON_REG
,DSI_PHY_REG
->MIPITX_DSI0_CON
,RG_DSI0_LDOCORE_EN
,0);
1974 OUTREGBIT(MIPITX_DSI_BG_CON_REG
,DSI_PHY_REG
->MIPITX_DSI_BG_CON
,RG_DSI_BG_CKEN
,0);
1975 OUTREGBIT(MIPITX_DSI_BG_CON_REG
,DSI_PHY_REG
->MIPITX_DSI_BG_CON
,RG_DSI_BG_CORE_EN
,0);
1977 OUTREGBIT(MIPITX_DSI_PLL_CON0_REG
,DSI_PHY_REG
->MIPITX_DSI_PLL_CON0
, RG_DSI0_MPPLL_PREDIV
,0);
1978 OUTREGBIT(MIPITX_DSI_PLL_CON0_REG
,DSI_PHY_REG
->MIPITX_DSI_PLL_CON0
, RG_DSI0_MPPLL_TXDIV0
,0);
1979 OUTREGBIT(MIPITX_DSI_PLL_CON0_REG
,DSI_PHY_REG
->MIPITX_DSI_PLL_CON0
, RG_DSI0_MPPLL_TXDIV1
,0);
1980 OUTREGBIT(MIPITX_DSI_PLL_CON0_REG
,DSI_PHY_REG
->MIPITX_DSI_PLL_CON0
, RG_DSI0_MPPLL_POSDIV
,0);
1983 OUTREG32(&DSI_PHY_REG
->MIPITX_DSI_PLL_CON1
, 0x00000000);
1984 OUTREG32(&DSI_PHY_REG
->MIPITX_DSI_PLL_CON2
, 0x50000000);
1986 OUTREGBIT(MIPITX_DSI_SW_CTRL_REG
,DSI_PHY_REG
->MIPITX_DSI_SW_CTRL
,SW_CTRL_EN
,0);
1991 void DSI_Set_VM_CMD(LCM_PARAMS
*lcm_params
)
1993 OUTREGBIT(DSI_VM_CMD_CON_REG
,DSI_REG
->DSI_VM_CMD_CON
,TS_VFP_EN
,1);
1994 OUTREGBIT(DSI_VM_CMD_CON_REG
,DSI_REG
->DSI_VM_CMD_CON
,VM_CMD_EN
,1);
1998 void DSI_PHY_TIMCONFIG(LCM_PARAMS
*lcm_params
)
2000 DSI_PHY_TIMCON0_REG timcon0
;
2001 DSI_PHY_TIMCON1_REG timcon1
;
2002 DSI_PHY_TIMCON2_REG timcon2
;
2003 DSI_PHY_TIMCON3_REG timcon3
;
2004 unsigned int div1
= 0;
2005 unsigned int div2
= 0;
2006 unsigned int pre_div
= 0;
2007 unsigned int post_div
= 0;
2008 unsigned int fbk_sel
= 0;
2009 unsigned int fbk_div
= 0;
2010 unsigned int lane_no
= lcm_params
->dsi
.LANE_NUM
;
2012 // unsigned int div2_real;
2013 unsigned int cycle_time
;
2015 unsigned int hs_trail_m
, hs_trail_n
;
2017 if(0 != lcm_params
->dsi
.PLL_CLOCK
){
2018 ui
= 1000/(lcm_params
->dsi
.PLL_CLOCK
*2)+0x01;
2019 cycle_time
=8000/(lcm_params
->dsi
.PLL_CLOCK
*2)+0x01;
2020 DISP_LOG_PRINT(ANDROID_LOG_INFO
, "DSI", "[DISP] - kernel - DSI_PHY_TIMCONFIG, Cycle Time = %d(ns), Unit Interval = %d(ns). , lane# = %d \n", cycle_time
, ui
, lane_no
);
2023 div1
= lcm_params
->dsi
.pll_div1
;
2024 div2
= lcm_params
->dsi
.pll_div2
;
2025 fbk_div
= lcm_params
->dsi
.fbk_div
;
2042 printk("div1 should be less than 4!!\n");
2060 printk("div2 should be less than 4!!\n");
2081 printk("pre_div should be less than 4!!\n");
2102 printk("post_div should be less than 4!!\n");
2123 printk("fbk_sel should be less than 4!!\n");
2127 cycle_time
=(1000*4*div2
*div1
)/(fbk_div
*26)+0x01;
2129 ui
=(1000*div2
*div1
)/(fbk_div
*26*0x2)+0x01;
2130 DISP_LOG_PRINT(ANDROID_LOG_INFO
, "DSI", "[DISP] - kernel - DSI_PHY_TIMCONFIG, Cycle Time = %d(ns), Unit Interval = %d(ns). div1 = %d, div2 = %d, fbk_div = %d, lane# = %d \n", cycle_time
, ui
, div1
, div2
, fbk_div
, lane_no
);
2133 // div2_real=div2 ? div2*0x02 : 0x1;
2134 //cycle_time = (1000 * div2 * div1 * pre_div * post_div)/ (fbk_sel * (fbk_div+0x01) * 26) + 1;
2135 //ui = (1000 * div2 * div1 * pre_div * post_div)/ (fbk_sel * (fbk_div+0x01) * 26 * 2) + 1;
2136 #define NS_TO_CYCLE(n, c) ((n) / (c))
2139 hs_trail_n
= (lcm_params
->dsi
.HS_TRAIL
== 0) ? NS_TO_CYCLE(((hs_trail_m
* 0x4) + 0x60), cycle_time
) : lcm_params
->dsi
.HS_TRAIL
;
2140 // +3 is recommended from designer becauase of HW latency
2141 timcon0
.HS_TRAIL
= ((hs_trail_m
> hs_trail_n
) ? hs_trail_m
: hs_trail_n
) + 0x0a;
2143 timcon0
.HS_PRPR
= (lcm_params
->dsi
.HS_PRPR
== 0) ? NS_TO_CYCLE((0x40 + 0x5 * ui
), cycle_time
) : lcm_params
->dsi
.HS_PRPR
;
2144 // HS_PRPR can't be 1.
2145 if (timcon0
.HS_PRPR
== 0)
2146 timcon0
.HS_PRPR
= 1;
2148 timcon0
.HS_ZERO
= (lcm_params
->dsi
.HS_ZERO
== 0) ? NS_TO_CYCLE((0xC8 + 0x0a * ui
), cycle_time
) : lcm_params
->dsi
.HS_ZERO
;
2149 if (timcon0
.HS_ZERO
> timcon0
.HS_PRPR
)
2150 timcon0
.HS_ZERO
-= timcon0
.HS_PRPR
;
2152 timcon0
.LPX
= (lcm_params
->dsi
.LPX
== 0) ? NS_TO_CYCLE(0x50, cycle_time
) : lcm_params
->dsi
.LPX
;
2153 if(timcon0
.LPX
== 0)
2156 // timcon1.TA_SACK = (lcm_params->dsi.TA_SACK == 0) ? 1 : lcm_params->dsi.TA_SACK;
2157 timcon1
.TA_GET
= (lcm_params
->dsi
.TA_GET
== 0) ? (0x5 * timcon0
.LPX
) : lcm_params
->dsi
.TA_GET
;
2158 timcon1
.TA_SURE
= (lcm_params
->dsi
.TA_SURE
== 0) ? (0x3 * timcon0
.LPX
/ 0x2) : lcm_params
->dsi
.TA_SURE
;
2159 timcon1
.TA_GO
= (lcm_params
->dsi
.TA_GO
== 0) ? (0x4 * timcon0
.LPX
) : lcm_params
->dsi
.TA_GO
;
2160 // --------------------------------------------------------------
2161 // NT35510 need fine tune timing
2162 // Data_hs_exit = 60 ns + 128UI
2163 // Clk_post = 60 ns + 128 UI.
2164 // --------------------------------------------------------------
2165 timcon1
.DA_HS_EXIT
= (lcm_params
->dsi
.DA_HS_EXIT
== 0) ? NS_TO_CYCLE((0x3c + 0x80 * ui
), cycle_time
) : lcm_params
->dsi
.DA_HS_EXIT
;
2167 timcon2
.CLK_TRAIL
= ((lcm_params
->dsi
.CLK_TRAIL
== 0) ? NS_TO_CYCLE(0x64, cycle_time
) : lcm_params
->dsi
.CLK_TRAIL
) + 0x0a;
2168 // CLK_TRAIL can't be 1.
2169 if (timcon2
.CLK_TRAIL
< 2)
2170 timcon2
.CLK_TRAIL
= 2;
2172 // timcon2.LPX_WAIT = (lcm_params->dsi.LPX_WAIT == 0) ? 1 : lcm_params->dsi.LPX_WAIT;
2173 timcon2
.CONT_DET
= lcm_params
->dsi
.CONT_DET
;
2174 timcon2
.CLK_ZERO
= (lcm_params
->dsi
.CLK_ZERO
== 0) ? NS_TO_CYCLE(0x190, cycle_time
) : lcm_params
->dsi
.CLK_ZERO
;
2176 timcon3
.CLK_HS_PRPR
= (lcm_params
->dsi
.CLK_HS_PRPR
== 0) ? NS_TO_CYCLE(0x40, cycle_time
) : lcm_params
->dsi
.CLK_HS_PRPR
;
2177 if(timcon3
.CLK_HS_PRPR
== 0)
2178 timcon3
.CLK_HS_PRPR
= 1;
2179 timcon3
.CLK_HS_EXIT
= (lcm_params
->dsi
.CLK_HS_EXIT
== 0) ? (2 * timcon0
.LPX
) : lcm_params
->dsi
.CLK_HS_EXIT
;
2180 timcon3
.CLK_HS_POST
= (lcm_params
->dsi
.CLK_HS_POST
== 0) ? NS_TO_CYCLE((0x3c + 0x80 * ui
), cycle_time
) : lcm_params
->dsi
.CLK_HS_POST
;
2182 DISP_LOG_PRINT(ANDROID_LOG_INFO
, "DSI", "[DISP] - kernel - DSI_PHY_TIMCONFIG, HS_TRAIL = %d, HS_ZERO = %d, HS_PRPR = %d, LPX = %d, TA_GET = %d, TA_SURE = %d, TA_GO = %d, CLK_TRAIL = %d, CLK_ZERO = %d, CLK_HS_PRPR = %d \n", \
2183 timcon0
.HS_TRAIL
, timcon0
.HS_ZERO
, timcon0
.HS_PRPR
, timcon0
.LPX
, timcon1
.TA_GET
, timcon1
.TA_SURE
, timcon1
.TA_GO
, timcon2
.CLK_TRAIL
, timcon2
.CLK_ZERO
, timcon3
.CLK_HS_PRPR
);
2185 OUTREGBIT(DSI_PHY_TIMCON0_REG
,DSI_REG
->DSI_PHY_TIMECON0
,LPX
,timcon0
.LPX
);
2186 OUTREGBIT(DSI_PHY_TIMCON0_REG
,DSI_REG
->DSI_PHY_TIMECON0
,HS_PRPR
,timcon0
.HS_PRPR
);
2187 OUTREGBIT(DSI_PHY_TIMCON0_REG
,DSI_REG
->DSI_PHY_TIMECON0
,HS_ZERO
,timcon0
.HS_ZERO
);
2188 OUTREGBIT(DSI_PHY_TIMCON0_REG
,DSI_REG
->DSI_PHY_TIMECON0
,HS_TRAIL
,timcon0
.HS_TRAIL
);
2190 OUTREGBIT(DSI_PHY_TIMCON1_REG
,DSI_REG
->DSI_PHY_TIMECON1
,TA_GO
,timcon1
.TA_GO
);
2191 OUTREGBIT(DSI_PHY_TIMCON1_REG
,DSI_REG
->DSI_PHY_TIMECON1
,TA_SURE
,timcon1
.TA_SURE
);
2192 OUTREGBIT(DSI_PHY_TIMCON1_REG
,DSI_REG
->DSI_PHY_TIMECON1
,TA_GET
,timcon1
.TA_GET
);
2193 OUTREGBIT(DSI_PHY_TIMCON1_REG
,DSI_REG
->DSI_PHY_TIMECON1
,DA_HS_EXIT
,timcon1
.DA_HS_EXIT
);
2195 OUTREGBIT(DSI_PHY_TIMCON2_REG
,DSI_REG
->DSI_PHY_TIMECON2
,CONT_DET
,timcon2
.CONT_DET
);
2196 OUTREGBIT(DSI_PHY_TIMCON2_REG
,DSI_REG
->DSI_PHY_TIMECON2
,CLK_ZERO
,timcon2
.CLK_ZERO
);
2197 OUTREGBIT(DSI_PHY_TIMCON2_REG
,DSI_REG
->DSI_PHY_TIMECON2
,CLK_TRAIL
,timcon2
.CLK_TRAIL
);
2199 OUTREGBIT(DSI_PHY_TIMCON3_REG
,DSI_REG
->DSI_PHY_TIMECON3
,CLK_HS_PRPR
,timcon3
.CLK_HS_PRPR
);
2200 OUTREGBIT(DSI_PHY_TIMCON3_REG
,DSI_REG
->DSI_PHY_TIMECON3
,CLK_HS_POST
,timcon3
.CLK_HS_POST
);
2201 OUTREGBIT(DSI_PHY_TIMCON3_REG
,DSI_REG
->DSI_PHY_TIMECON3
,CLK_HS_EXIT
,timcon3
.CLK_HS_EXIT
);
2202 printk("%s, 0x%08x,0x%08x,0x%08x,0x%08x\n", __func__
, INREG32(DSI_BASE
+0x110),INREG32(DSI_BASE
+0x114),INREG32(DSI_BASE
+0x118),INREG32(DSI_BASE
+0x11c));
2207 void DSI_clk_ULP_mode(bool enter
)
2210 OUTREGBIT(DSI_PHY_LCCON_REG
, DSI_REG
->DSI_PHY_LCCON
, LC_HS_TX_EN
, 0);
2213 OUTREGBIT(DSI_PHY_LCCON_REG
, DSI_REG
->DSI_PHY_LCCON
, LC_ULPM_EN
, 1);
2217 OUTREGBIT(DSI_PHY_LCCON_REG
, DSI_REG
->DSI_PHY_LCCON
, LC_ULPM_EN
, 0);
2220 OUTREGBIT(DSI_PHY_LCCON_REG
, DSI_REG
->DSI_PHY_LCCON
, LC_WAKEUP_EN
, 1);
2223 OUTREGBIT(DSI_PHY_LCCON_REG
, DSI_REG
->DSI_PHY_LCCON
, LC_WAKEUP_EN
, 0);
2229 void DSI_clk_HS_mode(bool enter
)
2231 DSI_PHY_LCCON_REG tmp_reg1
= DSI_REG
->DSI_PHY_LCCON
;
2234 if(enter
&& !DSI_clk_HS_state()) {
2235 tmp_reg1
.LC_HS_TX_EN
=1;
2236 OUTREG32(&DSI_REG
->DSI_PHY_LCCON
, AS_UINT32(&tmp_reg1
));
2238 else if (!enter
&& DSI_clk_HS_state()) {
2239 tmp_reg1
.LC_HS_TX_EN
=0;
2240 OUTREG32(&DSI_REG
->DSI_PHY_LCCON
, AS_UINT32(&tmp_reg1
));
2246 void DSI_Continuous_HS(void)
2248 DSI_TXRX_CTRL_REG tmp_reg
= DSI_REG
->DSI_TXRX_CTRL
;
2250 tmp_reg
.HSTX_CKLP_EN
= 0;
2251 OUTREG32(&DSI_REG
->DSI_TXRX_CTRL
, AS_UINT32(&tmp_reg
));
2255 bool DSI_clk_HS_state(void)
2257 return DSI_REG
->DSI_PHY_LCCON
.LC_HS_TX_EN
? TRUE
: FALSE
;
2261 void DSI_lane0_ULP_mode(bool enter
)
2263 DSI_PHY_LD0CON_REG tmp_reg1
;
2265 tmp_reg1
=DSI_REG
->DSI_PHY_LD0CON
;
2269 tmp_reg1
.L0_HS_TX_EN
=0;
2270 OUTREG32(&DSI_REG
->DSI_PHY_LD0CON
, AS_UINT32(&tmp_reg1
));
2272 tmp_reg1
.L0_ULPM_EN
=1;
2273 OUTREG32(&DSI_REG
->DSI_PHY_LD0CON
, AS_UINT32(&tmp_reg1
));
2278 tmp_reg1
.L0_ULPM_EN
=0;
2279 OUTREG32(&DSI_REG
->DSI_PHY_LD0CON
, AS_UINT32(&tmp_reg1
));
2281 tmp_reg1
.L0_WAKEUP_EN
=1;
2282 OUTREG32(&DSI_REG
->DSI_PHY_LD0CON
, AS_UINT32(&tmp_reg1
));
2284 tmp_reg1
.L0_WAKEUP_EN
=0;
2285 OUTREG32(&DSI_REG
->DSI_PHY_LD0CON
, AS_UINT32(&tmp_reg1
));
2290 // called by DPI ISR
2291 void DSI_handle_esd_recovery(void)
2296 // called by "esd_recovery_kthread"
2297 bool DSI_esd_check(void)
2299 #ifndef MT65XX_NEW_DISP
2300 bool result
= false;
2302 if(dsi_esd_recovery
)
2307 dsi_esd_recovery
= false;
2309 DSI_MODE_CTRL_REG mode_ctl
, mode_ctl_backup
;
2310 bool result
= false;
2311 #if ENABLE_DSI_INTERRUPT //wait video mode done
2312 static const long WAIT_TIMEOUT
= HZ
/2; // 2 sec//modified to 500ms
2316 OUTREG32(&mode_ctl_backup
, AS_UINT32(&DSI_REG
->DSI_MODE_CTRL
));
2317 OUTREG32(&mode_ctl
, AS_UINT32(&DSI_REG
->DSI_MODE_CTRL
));
2320 OUTREG32(&DSI_REG
->DSI_MODE_CTRL
, AS_UINT32(&mode_ctl
));
2321 #if ENABLE_DSI_INTERRUPT //wait video mode done
2323 wait_vm_done_irq
= true;
2324 ret
= wait_event_interruptible_timeout(_dsi_wait_vm_done_queue
,
2328 xlog_printk(ANDROID_LOG_WARN
, "DSI", " Wait for DSI engine read ready timeout!!!\n");
2330 DSI_DumpRegisters();
2331 ///do necessary reset here
2333 wait_vm_done_irq
= false;
2338 unsigned int read_timeout_ms
= 100;
2339 #ifdef DDI_DRV_DEBUG_LOG_ENABLE
2340 DISP_LOG_PRINT(ANDROID_LOG_INFO
, "DSI", " Start polling VM done ready!!!\n");
2342 while(DSI_REG
->DSI_INTSTA
.VM_DONE
== 0) //clear
2348 if(read_timeout_ms
== 0)
2350 DISP_LOG_PRINT(ANDROID_LOG_INFO
, "DSI", " Polling DSI VM done timeout!!!\n");
2351 DSI_DumpRegisters();
2357 //DSI_REG->DSI_INTSTA.VM_DONE = 0;
2358 OUTREGBIT(DSI_INT_STATUS_REG
,DSI_REG
->DSI_INTSTA
,VM_DONE
,0);
2359 #ifdef DDI_DRV_DEBUG_LOG_ENABLE
2360 DISP_LOG_PRINT(ANDROID_LOG_INFO
, "DSI", " End polling DSI VM done ready!!!\n");
2363 //read DriverIC and check ESD
2364 result
= lcm_drv
->esd_check();
2365 //restore video mode
2367 OUTREG32(&DSI_REG
->DSI_MODE_CTRL
, AS_UINT32(&mode_ctl_backup
));
2369 wait_vm_done_irq
= false;
2374 void DSI_set_int_TE(bool enable
, unsigned int period
)
2376 #ifndef MT65XX_NEW_DISP
2377 dsi_int_te_enabled
= enable
;
2380 dsi_int_te_period
= period
;
2381 dsi_dpi_isr_count
= 0;
2386 // called by DPI ISR.
2387 bool DSI_handle_int_TE(void)
2389 #ifndef CONFIG_ARCH_MT8127
2390 #ifndef MT65XX_NEW_DISP
2392 long int dsi_current_time
;
2394 if (!DSI_REG
->DSI_MODE_CTRL
.MODE
)
2397 dsi_current_time
= get_current_time_us();
2399 if(DSI_REG
->DSI_STATE_DBG3
.TCON_STATE
== DSI_VDO_VFP_STATE
)
2401 udelay(_dsiContext
.vfp_period_us
/ 2);
2403 if ((DSI_REG
->DSI_STATE_DBG3
.TCON_STATE
== DSI_VDO_VFP_STATE
) && DSI_REG
->DSI_STATE_DBG0
.CTL_STATE_0
== 0x1)
2405 // Can't do int. TE check while INUSE FB number is not 0 because later disable/enable DPI will set INUSE FB to number 0.
2406 if(DPI_REG
->STATUS
.FB_INUSE
!= 0)
2411 //DSI_REG->DSI_COM_CTRL.DSI_RESET = 1;
2412 OUTREGBIT(DSI_COM_CTRL_REG
,DSI_REG
->DSI_COM_CTRL
,DSI_RESET
,1);
2414 DSI_SetMode(CMD_MODE
);
2415 //DSI_REG->DSI_COM_CTRL.DSI_RESET = 0;
2416 OUTREGBIT(DSI_COM_CTRL_REG
,DSI_REG
->DSI_COM_CTRL
,DSI_RESET
,0);
2419 t0
.CONFG
= 0x20; ///TE
2424 OUTREG32(&DSI_CMDQ_REG
->data
[0], AS_UINT32(&t0
));
2425 OUTREG32(&DSI_REG
->DSI_CMDQ_SIZE
, 1);
2427 // Enable RD_RDY INT for polling it's status later
2428 //DSI_REG->DSI_INTEN.RD_RDY = 1;
2429 OUTREGBIT(DSI_INT_ENABLE_REG
,DSI_REG
->DSI_INTEN
,RD_RDY
,1);
2433 while(DSI_REG
->DSI_INTSTA
.RD_RDY
== 0) // polling RD_RDY
2435 if(get_current_time_us() - dsi_current_time
> _dsiContext
.vfp_period_us
)
2437 xlog_printk(ANDROID_LOG_WARN
, "DSI", " Wait for internal TE time-out for %d (us)!!!\n", _dsiContext
.vfp_period_us
);
2439 ///do necessary reset here
2440 //DSI_REG->DSI_RACK.DSI_RACK = 1;
2441 OUTREGBIT(DSI_RACK_REG
,DSI_REG
->DSI_RACK
,DSI_RACK
,1);
2448 // Write clear RD_RDY
2449 //DSI_REG->DSI_INTSTA.RD_RDY = 1;
2450 //DSI_REG->DSI_RACK.DSI_RACK = 1;
2451 OUTREGBIT(DSI_INT_STATUS_REG
,DSI_REG
->DSI_INTSTA
,RD_RDY
,1);
2452 OUTREGBIT(DSI_RACK_REG
,DSI_REG
->DSI_RACK
,DSI_RACK
,1);
2453 // Write clear CMD_DONE
2454 //DSI_REG->DSI_INTSTA.CMD_DONE = 1;
2455 OUTREGBIT(DSI_INT_STATUS_REG
,DSI_REG
->DSI_INTSTA
,CMD_DONE
,1);
2457 // Restart video mode. (with VSA ahead)
2458 DSI_SetMode(SYNC_PULSE_VDO_MODE
);
2472 void DSI_set_noncont_clk(bool enable
, unsigned int period
)
2474 dsi_noncont_clk_enabled
= enable
;
2475 // dsi_noncont_clk_period = period;
2478 void DSI_Detect_glitch_enable(bool enable
)
2480 dsi_glitch_enable
= enable
;
2482 // called by DPI ISR.
2483 void DSI_handle_noncont_clk(void)
2485 #ifndef CONFIG_ARCH_MT8127
2486 #ifndef MT65XX_NEW_DISP
2488 long int dsi_current_time
;
2490 if (!DSI_REG
->DSI_MODE_CTRL
.MODE
)
2493 state
= DSI_REG
->DSI_STATE_DBG3
.TCON_STATE
;
2495 dsi_current_time
= get_current_time_us();
2499 case DSI_VDO_VSA_VS_STATE
:
2500 while(DSI_REG
->DSI_STATE_DBG3
.TCON_STATE
!= DSI_VDO_VSA_HS_STATE
)
2502 if(get_current_time_us() - dsi_current_time
> _dsiContext
.vsa_vs_period_us
)
2504 xlog_printk(ANDROID_LOG_WARN
, "DSI", " Wait for %x state timeout %d (us)!!!\n", DSI_VDO_VSA_HS_STATE
, _dsiContext
.vsa_vs_period_us
);
2510 case DSI_VDO_VSA_HS_STATE
:
2511 while(DSI_REG
->DSI_STATE_DBG3
.TCON_STATE
!= DSI_VDO_VSA_VE_STATE
)
2513 if(get_current_time_us() - dsi_current_time
> _dsiContext
.vsa_hs_period_us
)
2515 xlog_printk(ANDROID_LOG_WARN
, "DSI", " Wait for %x state timeout %d (us)!!!\n", DSI_VDO_VSA_VE_STATE
, _dsiContext
.vsa_hs_period_us
);
2521 case DSI_VDO_VSA_VE_STATE
:
2522 while(DSI_REG
->DSI_STATE_DBG3
.TCON_STATE
!= DSI_VDO_VBP_STATE
)
2524 if(get_current_time_us() - dsi_current_time
> _dsiContext
.vsa_ve_period_us
)
2526 xlog_printk(ANDROID_LOG_WARN
, "DSI", " Wait for %x state timeout %d (us)!!!\n", DSI_VDO_VBP_STATE
, _dsiContext
.vsa_ve_period_us
);
2532 case DSI_VDO_VBP_STATE
:
2533 xlog_printk(ANDROID_LOG_WARN
, "DSI", "Can't do clock switch in DSI_VDO_VBP_STATE !!!\n");
2536 case DSI_VDO_VACT_STATE
:
2537 while(DSI_REG
->DSI_STATE_DBG3
.TCON_STATE
!= DSI_VDO_VFP_STATE
)
2539 if(get_current_time_us() - dsi_current_time
> _dsiContext
.vfp_period_us
)
2541 xlog_printk(ANDROID_LOG_WARN
, "DSI", " Wait for %x state timeout %d (us)!!!\n", DSI_VDO_VFP_STATE
, _dsiContext
.vfp_period_us
);
2547 case DSI_VDO_VFP_STATE
:
2548 while(DSI_REG
->DSI_STATE_DBG3
.TCON_STATE
!= DSI_VDO_VSA_VS_STATE
)
2550 if(get_current_time_us() - dsi_current_time
> _dsiContext
.vfp_period_us
)
2552 xlog_printk(ANDROID_LOG_WARN
, "DSI", " Wait for %x state timeout %d (us)!!!\n", DSI_VDO_VSA_VS_STATE
, _dsiContext
.vfp_period_us
);
2559 xlog_printk(ANDROID_LOG_ERROR
, "DSI", "invalid state = %x \n", state
);
2563 // Clock switch HS->LP->HS
2571 #ifdef ENABLE_DSI_ERROR_REPORT
2572 static unsigned int _dsi_cmd_queue
[32];
2574 void DSI_set_cmdq_V2(unsigned cmd
, unsigned char count
, unsigned char *para_list
, unsigned char force_update
)
2577 UINT32 goto_addr
, mask_para
, set_para
;
2578 //UINT32 fbPhysAddr, fbVirAddr;
2581 if (0 != DSI_REG
->DSI_MODE_CTRL
.MODE
){//not in cmd mode
2582 DSI_VM_CMD_CON_REG vm_cmdq
;
2583 OUTREG32(&vm_cmdq
, AS_UINT32(&DSI_REG
->DSI_VM_CMD_CON
));
2584 printk("set cmdq in VDO mode in set_cmdq_V2\n");
2589 vm_cmdq
.LONG_PKT
= 1;
2590 vm_cmdq
.CM_DATA_ID
= DSI_DCS_LONG_PACKET_ID
;
2591 vm_cmdq
.CM_DATA_0
= count
+1;
2592 OUTREG32(&DSI_REG
->DSI_VM_CMD_CON
, AS_UINT32(&vm_cmdq
));
2594 goto_addr
= (UINT32
)(&DSI_VM_CMD_REG
->data
[0].byte0
);
2595 mask_para
= (0xFF<<((goto_addr
&0x3)*8));
2596 set_para
= (cmd
<<((goto_addr
&0x3)*8));
2597 MASKREG32(goto_addr
&(~0x3), mask_para
, set_para
);
2599 for(i
=0; i
<count
; i
++)
2601 goto_addr
= (UINT32
)(&DSI_VM_CMD_REG
->data
[0].byte1
) + i
;
2602 mask_para
= (0xFF<<((goto_addr
&0x3)*8));
2603 set_para
= (para_list
[i
]<<((goto_addr
&0x3)*8));
2604 MASKREG32(goto_addr
&(~0x3), mask_para
, set_para
);
2609 vm_cmdq
.LONG_PKT
= 0;
2610 vm_cmdq
.CM_DATA_0
= cmd
;
2613 vm_cmdq
.CM_DATA_ID
= DSI_DCS_SHORT_PACKET_ID_1
;
2614 vm_cmdq
.CM_DATA_1
= para_list
[0];
2618 vm_cmdq
.CM_DATA_ID
= DSI_DCS_SHORT_PACKET_ID_0
;
2619 vm_cmdq
.CM_DATA_1
= 0;
2621 OUTREG32(&DSI_REG
->DSI_VM_CMD_CON
, AS_UINT32(&vm_cmdq
));
2627 vm_cmdq
.LONG_PKT
= 1;
2628 vm_cmdq
.CM_DATA_ID
= DSI_GERNERIC_LONG_PACKET_ID
;
2629 vm_cmdq
.CM_DATA_0
= count
+1;
2630 OUTREG32(&DSI_REG
->DSI_VM_CMD_CON
, AS_UINT32(&vm_cmdq
));
2632 goto_addr
= (UINT32
)(&DSI_VM_CMD_REG
->data
[0].byte0
);
2633 mask_para
= (0xFF<<((goto_addr
&0x3)*8));
2634 set_para
= (cmd
<<((goto_addr
&0x3)*8));
2635 MASKREG32(goto_addr
&(~0x3), mask_para
, set_para
);
2637 for(i
=0; i
<count
; i
++)
2639 goto_addr
= (UINT32
)(&DSI_VM_CMD_REG
->data
[0].byte1
) + i
;
2640 mask_para
= (0xFF<<((goto_addr
&0x3)*8));
2641 set_para
= (para_list
[i
]<<((goto_addr
&0x3)*8));
2642 MASKREG32(goto_addr
&(~0x3), mask_para
, set_para
);
2647 vm_cmdq
.LONG_PKT
= 0;
2648 vm_cmdq
.CM_DATA_0
= cmd
;
2651 vm_cmdq
.CM_DATA_ID
= DSI_GERNERIC_SHORT_PACKET_ID_2
;
2652 vm_cmdq
.CM_DATA_1
= para_list
[0];
2656 vm_cmdq
.CM_DATA_ID
= DSI_GERNERIC_SHORT_PACKET_ID_1
;
2657 vm_cmdq
.CM_DATA_1
= 0;
2659 OUTREG32(&DSI_REG
->DSI_VM_CMD_CON
, AS_UINT32(&vm_cmdq
));
2664 MMProfileLogEx(MTKFB_MMP_Events
.DSICmd
, MMProfileFlagStart
, *(unsigned int*)(&DSI_VM_CMD_REG
->data
[0]), *(unsigned int*)(&DSI_VM_CMD_REG
->data
[1]));
2667 //must wait VM CMD done?
2668 MMProfileLogEx(MTKFB_MMP_Events
.DSICmd
, MMProfileFlagEnd
, *(unsigned int*)(&DSI_VM_CMD_REG
->data
[2]), *(unsigned int*)(&DSI_VM_CMD_REG
->data
[3]));
2672 #ifdef ENABLE_DSI_ERROR_REPORT
2673 if ((para_list
[0] & 1))
2675 memset(_dsi_cmd_queue
, 0, sizeof(_dsi_cmd_queue
));
2676 memcpy(_dsi_cmd_queue
, para_list
, count
);
2677 _dsi_cmd_queue
[(count
+3)/4*4] = 0x4;
2678 count
= (count
+3)/4*4 + 4;
2679 para_list
= (unsigned char*) _dsi_cmd_queue
;
2686 _WaitForEngineNotBusy();
2692 t2
.Data_ID
= DSI_DCS_LONG_PACKET_ID
;
2695 OUTREG32(&DSI_CMDQ_REG
->data
[0], AS_UINT32(&t2
));
2697 goto_addr
= (UINT32
)(&DSI_CMDQ_REG
->data
[1].byte0
);
2698 mask_para
= (0xFF<<((goto_addr
&0x3)*8));
2699 set_para
= (cmd
<<((goto_addr
&0x3)*8));
2700 MASKREG32(goto_addr
&(~0x3), mask_para
, set_para
);
2702 for(i
=0; i
<count
; i
++)
2704 goto_addr
= (UINT32
)(&DSI_CMDQ_REG
->data
[1].byte1
) + i
;
2705 mask_para
= (0xFF<<((goto_addr
&0x3)*8));
2706 set_para
= (para_list
[i
]<<((goto_addr
&0x3)*8));
2707 MASKREG32(goto_addr
&(~0x3), mask_para
, set_para
);
2710 OUTREG32(&DSI_REG
->DSI_CMDQ_SIZE
, 2+(count
)/4);
2718 t0
.Data_ID
= DSI_DCS_SHORT_PACKET_ID_1
;
2719 t0
.Data1
= para_list
[0];
2723 t0
.Data_ID
= DSI_DCS_SHORT_PACKET_ID_0
;
2726 OUTREG32(&DSI_CMDQ_REG
->data
[0], AS_UINT32(&t0
));
2727 OUTREG32(&DSI_REG
->DSI_CMDQ_SIZE
, 1);
2735 t2
.Data_ID
= DSI_GERNERIC_LONG_PACKET_ID
;
2738 OUTREG32(&DSI_CMDQ_REG
->data
[0], AS_UINT32(&t2
));
2740 goto_addr
= (UINT32
)(&DSI_CMDQ_REG
->data
[1].byte0
);
2741 mask_para
= (0xFF<<((goto_addr
&0x3)*8));
2742 set_para
= (cmd
<<((goto_addr
&0x3)*8));
2743 MASKREG32(goto_addr
&(~0x3), mask_para
, set_para
);
2745 for(i
=0; i
<count
; i
++)
2747 goto_addr
= (UINT32
)(&DSI_CMDQ_REG
->data
[1].byte1
) + i
;
2748 mask_para
= (0xFF<<((goto_addr
&0x3)*8));
2749 set_para
= (para_list
[i
]<<((goto_addr
&0x3)*8));
2750 MASKREG32(goto_addr
&(~0x3), mask_para
, set_para
);
2753 OUTREG32(&DSI_REG
->DSI_CMDQ_SIZE
, 2+(count
)/4);
2762 t0
.Data_ID
= DSI_GERNERIC_SHORT_PACKET_ID_2
;
2763 t0
.Data1
= para_list
[0];
2767 t0
.Data_ID
= DSI_GERNERIC_SHORT_PACKET_ID_1
;
2770 OUTREG32(&DSI_CMDQ_REG
->data
[0], AS_UINT32(&t0
));
2771 OUTREG32(&DSI_REG
->DSI_CMDQ_SIZE
, 1);
2775 // for (i = 0; i < AS_UINT32(&DSI_REG->DSI_CMDQ_SIZE); i++)
2776 // DISP_LOG_PRINT(ANDROID_LOG_INFO, "DSI", "DSI_set_cmdq_V2. DSI_CMDQ+%04x : 0x%08x\n", i*4, INREG32(DSI_BASE + 0x180 + i*4));
2780 MMProfileLogEx(MTKFB_MMP_Events
.DSICmd
, MMProfileFlagStart
, *(unsigned int*)(&DSI_CMDQ_REG
->data
[0]), *(unsigned int*)(&DSI_CMDQ_REG
->data
[1]));
2782 for(i
=0; i
<10; i
++) ;
2783 _WaitForEngineNotBusy();
2784 MMProfileLogEx(MTKFB_MMP_Events
.DSICmd
, MMProfileFlagEnd
, *(unsigned int*)(&DSI_CMDQ_REG
->data
[2]), *(unsigned int*)(&DSI_CMDQ_REG
->data
[3]));
2790 void DSI_set_cmdq_V3(LCM_setting_table_V3
*para_tbl
, unsigned int size
, unsigned char force_update
)
2793 UINT32 goto_addr
, mask_para
, set_para
;
2794 //UINT32 fbPhysAddr, fbVirAddr;
2801 unsigned char data_id
, cmd
, count
;
2802 unsigned char *para_list
;
2805 data_id
= para_tbl
[index
].id
;
2806 cmd
= para_tbl
[index
].cmd
;
2807 count
= para_tbl
[index
].count
;
2808 para_list
= para_tbl
[index
].para_list
;
2810 if (data_id
== REGFLAG_ESCAPE_ID
&& cmd
== REGFLAG_DELAY_MS_V3
)
2813 DISP_LOG_PRINT(ANDROID_LOG_INFO
, "DSI", "DSI_set_cmdq_V3[%d]. Delay %d (ms) \n", index
, count
);
2818 if (0 != DSI_REG
->DSI_MODE_CTRL
.MODE
){//not in cmd mode
2819 DSI_VM_CMD_CON_REG vm_cmdq
;
2820 OUTREG32(&vm_cmdq
, AS_UINT32(&DSI_REG
->DSI_VM_CMD_CON
));
2821 printk("set cmdq in VDO mode\n");
2824 vm_cmdq
.LONG_PKT
= 1;
2825 vm_cmdq
.CM_DATA_ID
= data_id
;
2826 vm_cmdq
.CM_DATA_0
= count
+1;
2827 OUTREG32(&DSI_REG
->DSI_VM_CMD_CON
, AS_UINT32(&vm_cmdq
));
2829 goto_addr
= (UINT32
)(&DSI_VM_CMD_REG
->data
[0].byte0
);
2830 mask_para
= (0xFF<<((goto_addr
&0x3)*8));
2831 set_para
= (cmd
<<((goto_addr
&0x3)*8));
2832 MASKREG32(goto_addr
&(~0x3), mask_para
, set_para
);
2834 for(i
=0; i
<count
; i
++)
2836 goto_addr
= (UINT32
)(&DSI_VM_CMD_REG
->data
[0].byte1
) + i
;
2837 mask_para
= (0xFF<<((goto_addr
&0x3)*8));
2838 set_para
= (para_list
[i
]<<((goto_addr
&0x3)*8));
2839 MASKREG32(goto_addr
&(~0x3), mask_para
, set_para
);
2844 vm_cmdq
.LONG_PKT
= 0;
2845 vm_cmdq
.CM_DATA_0
= cmd
;
2848 vm_cmdq
.CM_DATA_ID
= data_id
;
2849 vm_cmdq
.CM_DATA_1
= para_list
[0];
2853 vm_cmdq
.CM_DATA_ID
= data_id
;
2854 vm_cmdq
.CM_DATA_1
= 0;
2856 OUTREG32(&DSI_REG
->DSI_VM_CMD_CON
, AS_UINT32(&vm_cmdq
));
2860 MMProfileLogEx(MTKFB_MMP_Events
.DSICmd
, MMProfileFlagStart
, *(unsigned int*)(&DSI_VM_CMD_REG
->data
[0]), *(unsigned int*)(&DSI_VM_CMD_REG
->data
[1]));
2863 //must wait VM CMD done?
2864 MMProfileLogEx(MTKFB_MMP_Events
.DSICmd
, MMProfileFlagEnd
, *(unsigned int*)(&DSI_VM_CMD_REG
->data
[2]), *(unsigned int*)(&DSI_VM_CMD_REG
->data
[3]));
2868 _WaitForEngineNotBusy();
2870 //for(i = 0; i < sizeof(DSI_CMDQ_REG->data0) / sizeof(DSI_CMDQ); i++)
2871 // OUTREG32(&DSI_CMDQ_REG->data0[i], 0);
2872 //memset(&DSI_CMDQ_REG->data[0], 0, sizeof(DSI_CMDQ_REG->data[0]));
2873 OUTREG32(&DSI_CMDQ_REG
->data
[0], 0);
2878 t2
.Data_ID
= data_id
;
2881 OUTREG32(&DSI_CMDQ_REG
->data
[0].byte0
, AS_UINT32(&t2
));
2883 goto_addr
= (UINT32
)(&DSI_CMDQ_REG
->data
[1].byte0
);
2884 mask_para
= (0xFF<<((goto_addr
&0x3)*8));
2885 set_para
= (cmd
<<((goto_addr
&0x3)*8));
2886 MASKREG32(goto_addr
&(~0x3), mask_para
, set_para
);
2888 for(i
=0; i
<count
; i
++)
2890 goto_addr
= (UINT32
)(&DSI_CMDQ_REG
->data
[1].byte1
) + i
;
2891 mask_para
= (0xFF<<((goto_addr
&0x3)*8));
2892 set_para
= (para_list
[i
]<<((goto_addr
&0x3)*8));
2893 MASKREG32(goto_addr
&(~0x3), mask_para
, set_para
);
2896 OUTREG32(&DSI_REG
->DSI_CMDQ_SIZE
, 2+(count
)/4);
2904 t0
.Data_ID
= data_id
;
2905 t0
.Data1
= para_list
[0];
2909 t0
.Data_ID
= data_id
;
2912 OUTREG32(&DSI_CMDQ_REG
->data
[0], AS_UINT32(&t0
));
2913 OUTREG32(&DSI_REG
->DSI_CMDQ_SIZE
, 1);
2916 for (i
= 0; i
< AS_UINT32(&DSI_REG
->DSI_CMDQ_SIZE
); i
++)
2917 DISP_LOG_PRINT(ANDROID_LOG_INFO
, "DSI", "DSI_set_cmdq_V3[%d]. DSI_CMDQ+%04x : 0x%08x\n", index
, i
*4, INREG32(DSI_BASE
+ 0x180 + i
*4));
2921 MMProfileLog(MTKFB_MMP_Events
.DSICmd
, MMProfileFlagStart
);
2923 for(i
=0; i
<10; i
++) ;
2924 _WaitForEngineNotBusy();
2925 MMProfileLog(MTKFB_MMP_Events
.DSICmd
, MMProfileFlagEnd
);
2929 } while (++index
< size
);
2933 void DSI_set_cmdq(unsigned int *pdata
, unsigned int queue_size
, unsigned char force_update
)
2937 // _WaitForEngineNotBusy();
2939 if (0 != DSI_REG
->DSI_MODE_CTRL
.MODE
){//not in cmd mode
2940 DSI_VM_CMD_CON_REG vm_cmdq
;
2941 OUTREG32(&vm_cmdq
, AS_UINT32(&DSI_REG
->DSI_VM_CMD_CON
));
2942 printk("set cmdq in VDO mode\n");
2943 if(queue_size
> 1){//long packet
2945 vm_cmdq
.LONG_PKT
= 1;
2946 vm_cmdq
.CM_DATA_ID
= ((pdata
[0] >> 8) & 0xFF);
2947 vm_cmdq
.CM_DATA_0
= ((pdata
[0] >> 16) & 0xFF);
2948 vm_cmdq
.CM_DATA_1
= 0;
2949 OUTREG32(&DSI_REG
->DSI_VM_CMD_CON
, AS_UINT32(&vm_cmdq
));
2950 for(i
=0;i
<queue_size
-1;i
++)
2951 OUTREG32(&DSI_VM_CMD_REG
->data
[i
], AS_UINT32((pdata
+i
+1)));
2954 vm_cmdq
.LONG_PKT
= 0;
2955 vm_cmdq
.CM_DATA_ID
= ((pdata
[0] >> 8) & 0xFF);
2956 vm_cmdq
.CM_DATA_0
= ((pdata
[0] >> 16) & 0xFF);
2957 vm_cmdq
.CM_DATA_1
= ((pdata
[0] >> 24) & 0xFF);
2958 OUTREG32(&DSI_REG
->DSI_VM_CMD_CON
, AS_UINT32(&vm_cmdq
));
2962 MMProfileLogEx(MTKFB_MMP_Events
.DSICmd
, MMProfileFlagStart
, *(unsigned int*)(&DSI_VM_CMD_REG
->data
[0]), *(unsigned int*)(&DSI_VM_CMD_REG
->data
[1]));
2965 //must wait VM CMD done?
2966 MMProfileLogEx(MTKFB_MMP_Events
.DSICmd
, MMProfileFlagEnd
, *(unsigned int*)(&DSI_VM_CMD_REG
->data
[2]), *(unsigned int*)(&DSI_VM_CMD_REG
->data
[3]));
2970 ASSERT(queue_size
<=32);
2971 _WaitForEngineNotBusy();
2972 #ifdef ENABLE_DSI_ERROR_REPORT
2975 memcpy(_dsi_cmd_queue
, pdata
, queue_size
*4);
2976 _dsi_cmd_queue
[queue_size
++] = 0x4;
2977 pdata
= (unsigned int*) _dsi_cmd_queue
;
2985 for(i
=0; i
<queue_size
; i
++)
2986 OUTREG32(&DSI_CMDQ_REG
->data
[i
], AS_UINT32((pdata
+i
)));
2988 OUTREG32(&DSI_REG
->DSI_CMDQ_SIZE
, queue_size
);
2990 // for (i = 0; i < queue_size; i++)
2991 // printk("[DISP] - kernel - DSI_set_cmdq. DSI_CMDQ+%04x : 0x%08x\n", i*4, INREG32(DSI_BASE + 0x180 + i*4));
2995 MMProfileLogEx(MTKFB_MMP_Events
.DSICmd
, MMProfileFlagStart
, *(unsigned int*)(&DSI_CMDQ_REG
->data
[0]), *(unsigned int*)(&DSI_CMDQ_REG
->data
[1]));
2997 for(i
=0; i
<10; i
++) ;
2998 _WaitForEngineNotBusy();
2999 MMProfileLogEx(MTKFB_MMP_Events
.DSICmd
, MMProfileFlagEnd
, *(unsigned int*)(&DSI_CMDQ_REG
->data
[2]), *(unsigned int*)(&DSI_CMDQ_REG
->data
[3]));
3005 DSI_STATUS
DSI_Write_T0_INS(DSI_T0_INS
*t0
)
3007 OUTREG32(&DSI_CMDQ_REG
->data
[0], AS_UINT32(t0
));
3009 OUTREG32(&DSI_REG
->DSI_CMDQ_SIZE
, 1);
3010 OUTREG32(&DSI_REG
->DSI_START
, 0);
3011 OUTREG32(&DSI_REG
->DSI_START
, 1);
3013 return DSI_STATUS_OK
;
3017 DSI_STATUS
DSI_Write_T1_INS(DSI_T1_INS
*t1
)
3019 OUTREG32(&DSI_CMDQ_REG
->data
[0], AS_UINT32(t1
));
3021 OUTREG32(&DSI_REG
->DSI_CMDQ_SIZE
, 1);
3022 OUTREG32(&DSI_REG
->DSI_START
, 0);
3023 OUTREG32(&DSI_REG
->DSI_START
, 1);
3025 return DSI_STATUS_OK
;
3029 DSI_STATUS
DSI_Write_T2_INS(DSI_T2_INS
*t2
)
3033 OUTREG32(&DSI_CMDQ_REG
->data
[0], AS_UINT32(t2
));
3035 for(i
=0;i
<((t2
->WC16
-1)>>2)+1;i
++)
3036 OUTREG32(&DSI_CMDQ_REG
->data
[1+i
], AS_UINT32((t2
->pdata
+i
)));
3038 OUTREG32(&DSI_REG
->DSI_CMDQ_SIZE
, (((t2
->WC16
-1)>>2)+2));
3039 OUTREG32(&DSI_REG
->DSI_START
, 0);
3040 OUTREG32(&DSI_REG
->DSI_START
, 1);
3042 return DSI_STATUS_OK
;
3046 DSI_STATUS
DSI_Write_T3_INS(DSI_T3_INS
*t3
)
3048 OUTREG32(&DSI_CMDQ_REG
->data
[0], AS_UINT32(t3
));
3050 OUTREG32(&DSI_REG
->DSI_CMDQ_SIZE
, 1);
3051 OUTREG32(&DSI_REG
->DSI_START
, 0);
3052 OUTREG32(&DSI_REG
->DSI_START
, 1);
3054 return DSI_STATUS_OK
;
3057 DSI_STATUS
DSI_TXRX_Control(bool cksm_en
,
3059 unsigned char lane_num
,
3060 unsigned char vc_num
,
3061 bool null_packet_en
,
3062 bool err_correction_en
,
3065 unsigned int max_return_size
)
3067 DSI_TXRX_CTRL_REG tmp_reg
;
3068 tmp_reg
=DSI_REG
->DSI_TXRX_CTRL
;
3070 ///TODO: parameter checking
3071 // tmp_reg.CKSM_EN=cksm_en;
3072 // tmp_reg.ECC_EN=ecc_en;
3075 case LCM_ONE_LANE
:tmp_reg
.LANE_NUM
= 1;break;
3076 case LCM_TWO_LANE
:tmp_reg
.LANE_NUM
= 3;break;
3077 case LCM_THREE_LANE
:tmp_reg
.LANE_NUM
= 0x7;break;
3078 case LCM_FOUR_LANE
:tmp_reg
.LANE_NUM
= 0xF;break;
3080 tmp_reg
.VC_NUM
=vc_num
;
3081 // tmp_reg.CORR_EN = err_correction_en;
3082 tmp_reg
.DIS_EOT
= dis_eotp_en
;
3083 tmp_reg
.NULL_EN
= null_packet_en
;
3084 tmp_reg
.MAX_RTN_SIZE
= max_return_size
;
3085 tmp_reg
.HSTX_CKLP_EN
= hstx_cklp_en
;
3086 OUTREG32(&DSI_REG
->DSI_TXRX_CTRL
, AS_UINT32(&tmp_reg
));
3088 return DSI_STATUS_OK
;
3092 DSI_STATUS
DSI_PS_Control(unsigned int ps_type
, unsigned int vact_line
, unsigned int ps_wc
)
3094 DSI_PSCTRL_REG tmp_reg
;
3095 UINT32 tmp_hstx_cklp_wc
;
3096 tmp_reg
=DSI_REG
->DSI_PSCTRL
;
3098 ///TODO: parameter checking
3099 ASSERT(ps_type
<= PACKED_PS_18BIT_RGB666
);
3100 if(ps_type
>LOOSELY_PS_18BIT_RGB666
)
3101 tmp_reg
.DSI_PS_SEL
=(5 - ps_type
);
3103 tmp_reg
.DSI_PS_SEL
=ps_type
;
3104 tmp_reg
.DSI_PS_WC
=ps_wc
;
3105 tmp_hstx_cklp_wc
= ps_wc
;
3107 OUTREG32(&DSI_REG
->DSI_VACT_NL
, AS_UINT32(&vact_line
));
3108 OUTREG32(&DSI_REG
->DSI_PSCTRL
, AS_UINT32(&tmp_reg
));
3109 OUTREG32(&DSI_REG
->DSI_HSTX_CKL_WC
, tmp_hstx_cklp_wc
);
3110 return DSI_STATUS_OK
;
3114 #define ALIGN_TO(x, n) \
3115 (((x) + ((n) - 1)) & ~((n) - 1))
3116 //unsigned int dsi_cycle_time;
3118 void DSI_Config_VDO_Timing(LCM_PARAMS
*lcm_params
)
3120 unsigned int line_byte
;
3121 unsigned int horizontal_sync_active_byte
= 0;
3122 unsigned int horizontal_backporch_byte
;
3123 unsigned int horizontal_frontporch_byte
;
3124 unsigned int horizontal_bllp_byte
;
3125 unsigned int dsiTmpBufBpp
;
3127 #define LINE_PERIOD_US (8 * line_byte * _dsiContext.bit_time_ns / 1000)
3129 if(lcm_params
->dsi
.data_format
.format
== LCM_DSI_FORMAT_RGB565
)
3134 OUTREG32(&DSI_REG
->DSI_VSA_NL
, lcm_params
->dsi
.vertical_sync_active
);
3135 OUTREG32(&DSI_REG
->DSI_VBP_NL
, lcm_params
->dsi
.vertical_backporch
);
3136 OUTREG32(&DSI_REG
->DSI_VFP_NL
, lcm_params
->dsi
.vertical_frontporch
);
3137 OUTREG32(&DSI_REG
->DSI_VACT_NL
, lcm_params
->dsi
.vertical_active_line
);
3139 line_byte
= (lcm_params
->dsi
.horizontal_sync_active \
3140 + lcm_params
->dsi
.horizontal_backporch \
3141 + lcm_params
->dsi
.horizontal_frontporch \
3142 + lcm_params
->dsi
.horizontal_active_pixel
) * dsiTmpBufBpp
;
3144 if (lcm_params
->dsi
.mode
== SYNC_EVENT_VDO_MODE
|| lcm_params
->dsi
.mode
== BURST_VDO_MODE
){
3145 ASSERT((lcm_params
->dsi
.horizontal_backporch
+ lcm_params
->dsi
.horizontal_sync_active
) * dsiTmpBufBpp
> 9);
3146 horizontal_backporch_byte
= ((lcm_params
->dsi
.horizontal_backporch
+ lcm_params
->dsi
.horizontal_sync_active
)* dsiTmpBufBpp
- 10);
3149 ASSERT(lcm_params
->dsi
.horizontal_sync_active
* dsiTmpBufBpp
> 9);
3150 horizontal_sync_active_byte
= (lcm_params
->dsi
.horizontal_sync_active
* dsiTmpBufBpp
- 10);
3152 ASSERT(lcm_params
->dsi
.horizontal_backporch
* dsiTmpBufBpp
> 9);
3153 horizontal_backporch_byte
= (lcm_params
->dsi
.horizontal_backporch
* dsiTmpBufBpp
- 10);
3156 ASSERT(lcm_params
->dsi
.horizontal_frontporch
* dsiTmpBufBpp
> 11);
3157 horizontal_frontporch_byte
= (lcm_params
->dsi
.horizontal_frontporch
* dsiTmpBufBpp
- 12);
3158 horizontal_bllp_byte
= (lcm_params
->dsi
.horizontal_bllp
* dsiTmpBufBpp
);
3159 // ASSERT(lcm_params->dsi.horizontal_frontporch * dsiTmpBufBpp > ((300/dsi_cycle_time) * lcm_params->dsi.LANE_NUM));
3160 // horizontal_frontporch_byte -= ((300/dsi_cycle_time) * lcm_params->dsi.LANE_NUM);
3162 OUTREG32(&DSI_REG
->DSI_HSA_WC
, ALIGN_TO((horizontal_sync_active_byte
), 4));
3163 OUTREG32(&DSI_REG
->DSI_HBP_WC
, ALIGN_TO((horizontal_backporch_byte
), 4));
3164 OUTREG32(&DSI_REG
->DSI_HFP_WC
, ALIGN_TO((horizontal_frontporch_byte
), 4));
3165 OUTREG32(&DSI_REG
->DSI_BLLP_WC
, ALIGN_TO((horizontal_bllp_byte
), 4));
3167 _dsiContext
.vfp_period_us
= LINE_PERIOD_US
* lcm_params
->dsi
.vertical_frontporch
/ 1000;
3168 _dsiContext
.vsa_vs_period_us
= LINE_PERIOD_US
* 1 / 1000;
3169 _dsiContext
.vsa_hs_period_us
= LINE_PERIOD_US
* (lcm_params
->dsi
.vertical_sync_active
- 2) / 1000;
3170 _dsiContext
.vsa_ve_period_us
= LINE_PERIOD_US
* 1 / 1000;
3171 _dsiContext
.vbp_period_us
= LINE_PERIOD_US
* lcm_params
->dsi
.vertical_backporch
/ 1000;
3173 DISP_LOG_PRINT(ANDROID_LOG_INFO
, "DSI", "[DISP] kernel - video timing, mode = %d \n", lcm_params
->dsi
.mode
);
3174 DISP_LOG_PRINT(ANDROID_LOG_INFO
, "DSI", "[DISP] kernel - VSA : %d %d(us)\n", DSI_REG
->DSI_VSA_NL
, (_dsiContext
.vsa_vs_period_us
+_dsiContext
.vsa_hs_period_us
+_dsiContext
.vsa_ve_period_us
));
3175 DISP_LOG_PRINT(ANDROID_LOG_INFO
, "DSI", "[DISP] kernel - VBP : %d %d(us)\n", DSI_REG
->DSI_VBP_NL
, _dsiContext
.vbp_period_us
);
3176 DISP_LOG_PRINT(ANDROID_LOG_INFO
, "DSI", "[DISP] kernel - VFP : %d %d(us)\n", DSI_REG
->DSI_VFP_NL
, _dsiContext
.vfp_period_us
);
3177 DISP_LOG_PRINT(ANDROID_LOG_INFO
, "DSI", "[DISP] kernel - VACT: %d \n", DSI_REG
->DSI_VACT_NL
);
3180 void DSI_write_lcm_cmd(unsigned int cmd
)
3183 DSI_CMDQ_CONFG CONFG_tmp
;
3185 CONFG_tmp
.type
=SHORT_PACKET_RW
;
3186 CONFG_tmp
.BTA
=DISABLE_BTA
;
3187 CONFG_tmp
.HS
=LOW_POWER
;
3188 CONFG_tmp
.CL
=CL_8BITS
;
3189 CONFG_tmp
.TE
=DISABLE_TE
;
3190 CONFG_tmp
.RPT
=DISABLE_RPT
;
3192 t0_tmp
.CONFG
= *((unsigned char *)(&CONFG_tmp
));
3193 t0_tmp
.Data_ID
= (cmd
&0xFF);
3197 DSI_Write_T0_INS(&t0_tmp
);
3201 void DSI_write_lcm_regs(unsigned int addr
, unsigned int *para
, unsigned int nums
)
3203 DSI_T2_INS
*t2_tmp
=0;
3204 DSI_CMDQ_CONFG CONFG_tmp
;
3206 CONFG_tmp
.type
=LONG_PACKET_W
;
3207 CONFG_tmp
.BTA
=DISABLE_BTA
;
3208 CONFG_tmp
.HS
=LOW_POWER
;
3209 CONFG_tmp
.CL
=CL_8BITS
;
3210 CONFG_tmp
.TE
=DISABLE_TE
;
3211 CONFG_tmp
.RPT
=DISABLE_RPT
;
3213 t2_tmp
->CONFG
= *((unsigned char *)(&CONFG_tmp
));
3214 t2_tmp
->Data_ID
= (addr
&0xFF);
3215 t2_tmp
->WC16
= nums
;
3216 t2_tmp
->pdata
= para
;
3218 DSI_Write_T2_INS(t2_tmp
);
3222 UINT32
DSI_dcs_read_lcm_reg(UINT8 cmd
)
3224 //UINT32 max_try_count = 5;
3225 UINT32 recv_data
= 0;
3226 //UINT32 recv_data_cnt;
3227 //unsigned int read_timeout_ms;
3228 //unsigned char packet_type;
3231 #if ENABLE_DSI_INTERRUPT
3232 static const long WAIT_TIMEOUT
= 2 * HZ
; // 2 sec
3236 if (DSI_REG
->DSI_MODE_CTRL
.MODE
)
3241 if(max_try_count
== 0)
3247 read_timeout_ms
= 20;
3249 _WaitForEngineNotBusy();
3251 t0
.CONFG
= 0x04; ///BTA
3253 t0
.Data_ID
= DSI_DCS_READ_PACKET_ID
;
3256 OUTREG32(&DSI_CMDQ_REG
->data
[0], AS_UINT32(&t0
));
3257 OUTREG32(&DSI_REG
->DSI_CMDQ_SIZE
, 1);
3260 DSI_REG
->DSI_RACK
.DSI_RACK
= 1;
3261 DSI_REG
->DSI_INTSTA
.RD_RDY
= 1;
3262 DSI_REG
->DSI_INTSTA
.CMD_DONE
= 1;
3263 DSI_REG
->DSI_INTEN
.RD_RDY
= 1;
3264 DSI_REG
->DSI_INTEN
.CMD_DONE
= 1;
3266 OUTREG32(&DSI_REG
->DSI_START
, 0);
3267 OUTREG32(&DSI_REG
->DSI_START
, 1);
3269 /// the following code is to
3270 /// 1: wait read ready
3271 /// 2: ack read ready
3272 /// 3: wait for CMDQ_DONE
3274 #if ENABLE_DSI_INTERRUPT
3275 ret
= wait_event_interruptible_timeout(_dsi_dcs_read_wait_queue
,
3279 DISP_LOG_PRINT(ANDROID_LOG_WARN
, "DSI", " Wait for DSI engine read ready timeout!!!\n");
3281 DSI_DumpRegisters();
3283 ///do necessary reset here
3284 DSI_REG
->DSI_RACK
.DSI_RACK
= 1;
3290 #ifdef DSI_DRV_DEBUG_LOG_ENABLE
3291 DISP_LOG_PRINT(ANDROID_LOG_INFO
, "DSI", " Start polling DSI read ready!!!\n");
3293 while(DSI_REG
->DSI_INTSTA
.RD_RDY
== 0) ///read clear
3299 if(read_timeout_ms
== 0)
3301 DISP_LOG_PRINT(ANDROID_LOG_INFO
, "DSI", " Polling DSI read ready timeout!!!\n");
3302 DSI_DumpRegisters();
3304 ///do necessary reset here
3305 DSI_REG
->DSI_RACK
.DSI_RACK
= 1;
3310 #ifdef DSI_DRV_DEBUG_LOG_ENABLE
3311 DISP_LOG_PRINT(ANDROID_LOG_INFO
, "DSI", " End polling DSI read ready!!!\n");
3314 DSI_REG
->DSI_RACK
.DSI_RACK
= 1;
3316 while(DSI_REG
->DSI_STA
.BUF_UNDERRUN
|| DSI_REG
->DSI_STA
.ESC_ENTRY_ERR
|| DSI_REG
->DSI_STA
.LPDT_SYNC_ERR
|| DSI_REG
->DSI_STA
.CTRL_ERR
|| DSI_REG
->DSI_STA
.CONTENT_ERR
)
3318 ///DSI READ ACK HW bug workaround
3319 #ifdef DSI_DRV_DEBUG_LOG_ENABLE
3320 DISP_LOG_PRINT(ANDROID_LOG_INFO
, "DSI", "DSI is busy: 0x%x !!!\n", DSI_REG
->DSI_STA
.BUSY
);
3322 DSI_REG
->DSI_RACK
.DSI_RACK
= 1;
3326 ///clear interrupt status
3327 DSI_REG
->DSI_INTSTA
.RD_RDY
= 1;
3329 OUTREG32(&DSI_REG
->DSI_START
, 0);
3333 DSI_REG
->DSI_INTEN
.RD_RDY
= 0;
3335 #ifdef DSI_DRV_DEBUG_LOG_ENABLE
3336 DISP_LOG_PRINT(ANDROID_LOG_INFO
, "DSI", " DSI_RX_STA : 0x%x \n", DSI_REG
->DSI_RX_STA
);
3337 DISP_LOG_PRINT(ANDROID_LOG_INFO
, "DSI", " DSI_CMDQ_SIZE : 0x%x \n", DSI_REG
->DSI_CMDQ_SIZE
.CMDQ_SIZE
);
3338 DISP_LOG_PRINT(ANDROID_LOG_INFO
, "DSI", " DSI_CMDQ_DATA0 : 0x%x \n", DSI_CMDQ_REG
->data
[0].byte0
);
3339 DISP_LOG_PRINT(ANDROID_LOG_INFO
, "DSI", " DSI_CMDQ_DATA1 : 0x%x \n", DSI_CMDQ_REG
->data
[0].byte1
);
3340 DISP_LOG_PRINT(ANDROID_LOG_INFO
, "DSI", " DSI_CMDQ_DATA2 : 0x%x \n", DSI_CMDQ_REG
->data
[0].byte2
);
3341 DISP_LOG_PRINT(ANDROID_LOG_INFO
, "DSI", " DSI_CMDQ_DATA3 : 0x%x \n", DSI_CMDQ_REG
->data
[0].byte3
);
3342 DISP_LOG_PRINT(ANDROID_LOG_INFO
, "DSI", " DSI_RX_DATA.BYTE0 : 0x%x \n", DSI_REG
->DSI_RX_DATA
.BYTE0
);
3343 DISP_LOG_PRINT(ANDROID_LOG_INFO
, "DSI", " DSI_RX_DATA.BYTE1 : 0x%x \n", DSI_REG
->DSI_RX_DATA
.BYTE1
);
3344 DISP_LOG_PRINT(ANDROID_LOG_INFO
, "DSI", " DSI_RX_DATA.BYTE2 : 0x%x \n", DSI_REG
->DSI_RX_DATA
.BYTE2
);
3345 DISP_LOG_PRINT(ANDROID_LOG_INFO
, "DSI", " DSI_RX_DATA.BYTE3 : 0x%x \n", DSI_REG
->DSI_RX_DATA
.BYTE3
);
3346 DISP_LOG_PRINT(ANDROID_LOG_INFO
, "DSI", " DSI_RX_DATA.BYTE4 : 0x%x \n", DSI_REG
->DSI_RX_DATA
.BYTE4
);
3347 DISP_LOG_PRINT(ANDROID_LOG_INFO
, "DSI", " DSI_RX_DATA.BYTE5 : 0x%x \n", DSI_REG
->DSI_RX_DATA
.BYTE5
);
3348 DISP_LOG_PRINT(ANDROID_LOG_INFO
, "DSI", " DSI_RX_DATA.BYTE6 : 0x%x \n", DSI_REG
->DSI_RX_DATA
.BYTE6
);
3349 DISP_LOG_PRINT(ANDROID_LOG_INFO
, "DSI", " DSI_RX_DATA.BYTE7 : 0x%x \n", DSI_REG
->DSI_RX_DATA
.BYTE7
);
3351 packet_type
= DSI_REG
->DSI_RX_DATA
.BYTE0
;
3353 #ifdef DSI_DRV_DEBUG_LOG_ENABLE
3354 DISP_LOG_PRINT(ANDROID_LOG_INFO
, "DSI", " DSI read packet_type is 0x%x \n",packet_type
);
3356 if(DSI_REG
->DSI_RX_STA
.LONG
== 1)
3358 recv_data_cnt
= DSI_REG
->DSI_RX_DATA
.BYTE1
+ DSI_REG
->DSI_RX_DATA
.BYTE2
* 16;
3359 if(recv_data_cnt
> 4)
3361 #ifdef DSI_DRV_DEBUG_LOG_ENABLE
3362 DISP_LOG_PRINT(ANDROID_LOG_WARN
, "DSI", " DSI read long packet data exceeds 4 bytes \n");
3366 memcpy((void*)&recv_data
, (void*)&DSI_REG
->DSI_RX_DATA
.BYTE4
, recv_data_cnt
);
3370 memcpy((void*)&recv_data
, (void*)&DSI_REG
->DSI_RX_DATA
.BYTE1
, 2);
3373 #ifdef DSI_DRV_DEBUG_LOG_ENABLE
3374 DISP_LOG_PRINT(ANDROID_LOG_INFO
, "DSI", " DSI read 0x%x data is 0x%x \n",cmd
, recv_data
);
3376 }while(packet_type
!= 0x1C && packet_type
!= 0x21 && packet_type
!= 0x22);
3377 /// here: we may receive a ACK packet which packet type is 0x02 (incdicates some error happened)
3378 /// therefore we try re-read again until no ACK packet
3379 /// But: if it is a good way to keep re-trying ???
3384 /// return value: the data length we got
3385 UINT32
DSI_dcs_read_lcm_reg_v2(UINT8 cmd
, UINT8
*buffer
, UINT8 buffer_size
)
3387 UINT32 max_try_count
= 5;
3388 UINT32 recv_data_cnt
;
3389 unsigned int read_timeout_ms
;
3390 unsigned char packet_type
;
3391 DSI_RX_DATA_REG read_data0
;
3392 DSI_RX_DATA_REG read_data1
;
3393 DSI_RX_DATA_REG read_data2
;
3394 DSI_RX_DATA_REG read_data3
;
3398 #if ENABLE_DSI_INTERRUPT
3399 static const long WAIT_TIMEOUT
= HZ
/2; // 2 sec//Yifan Modified for ESD Check with out LCM
3402 if (DSI_REG
->DSI_MODE_CTRL
.MODE
)
3405 if (buffer
== NULL
|| buffer_size
== 0)
3410 if(max_try_count
== 0)
3414 read_timeout_ms
= 20;
3416 _WaitForEngineNotBusy();
3418 t0
.CONFG
= 0x04; ///BTA
3420 if (buffer_size
< 0x3)
3421 t0
.Data_ID
= DSI_DCS_READ_PACKET_ID
;
3423 t0
.Data_ID
= DSI_GERNERIC_READ_LONG_PACKET_ID
;
3426 OUTREG32(&DSI_CMDQ_REG
->data
[0], AS_UINT32(&t0
));
3427 OUTREG32(&DSI_REG
->DSI_CMDQ_SIZE
, 1);
3430 //DSI_REG->DSI_RACK.DSI_RACK = 1;
3431 //DSI_REG->DSI_INTSTA.RD_RDY = 1;
3432 //DSI_REG->DSI_INTSTA.CMD_DONE = 1;
3433 //DSI_REG->DSI_INTEN.RD_RDY = 1;
3434 //DSI_REG->DSI_INTEN.CMD_DONE= 1;
3435 OUTREGBIT(DSI_RACK_REG
,DSI_REG
->DSI_RACK
,DSI_RACK
,1);
3436 OUTREGBIT(DSI_INT_STATUS_REG
,DSI_REG
->DSI_INTSTA
,RD_RDY
,1);
3437 OUTREGBIT(DSI_INT_STATUS_REG
,DSI_REG
->DSI_INTSTA
,CMD_DONE
,1);
3438 OUTREGBIT(DSI_INT_ENABLE_REG
,DSI_REG
->DSI_INTEN
,RD_RDY
,1);
3439 OUTREGBIT(DSI_INT_ENABLE_REG
,DSI_REG
->DSI_INTEN
,CMD_DONE
,1);
3443 OUTREG32(&DSI_REG
->DSI_START
, 0);
3444 OUTREG32(&DSI_REG
->DSI_START
, 1);
3446 /// the following code is to
3447 /// 1: wait read ready
3448 /// 2: ack read ready
3449 /// 3: wait for CMDQ_DONE
3451 #if ENABLE_DSI_INTERRUPT
3452 ret
= wait_event_interruptible_timeout(_dsi_dcs_read_wait_queue
,
3456 xlog_printk(ANDROID_LOG_WARN
, "DSI", " Wait for DSI engine read ready timeout!!!\n");
3458 DSI_DumpRegisters();
3460 ///do necessary reset here
3461 //DSI_REG->DSI_RACK.DSI_RACK = 1;
3462 OUTREGBIT(DSI_RACK_REG
,DSI_REG
->DSI_RACK
,DSI_RACK
,1);
3468 #ifdef DDI_DRV_DEBUG_LOG_ENABLE
3470 DISP_LOG_PRINT(ANDROID_LOG_INFO
, "DSI", " Start polling DSI read ready!!!\n");
3472 while(DSI_REG
->DSI_INTSTA
.RD_RDY
== 0) ///read clear
3478 if(read_timeout_ms
== 0)
3480 DISP_LOG_PRINT(ANDROID_LOG_INFO
, "DSI", " Polling DSI read ready timeout!!!\n");
3481 DSI_DumpRegisters();
3483 ///do necessary reset here
3484 //DSI_REG->DSI_RACK.DSI_RACK = 1;
3485 OUTREGBIT(DSI_RACK_REG
,DSI_REG
->DSI_RACK
,DSI_RACK
,1);
3490 #ifdef DDI_DRV_DEBUG_LOG_ENABLE
3492 DISP_LOG_PRINT(ANDROID_LOG_INFO
, "DSI", " End polling DSI read ready!!!\n");
3495 //DSI_REG->DSI_RACK.DSI_RACK = 1;
3496 OUTREGBIT(DSI_RACK_REG
,DSI_REG
->DSI_RACK
,DSI_RACK
,1);
3498 ///clear interrupt status
3499 //DSI_REG->DSI_INTSTA.RD_RDY = 1;
3500 OUTREGBIT(DSI_INT_STATUS_REG
,DSI_REG
->DSI_INTSTA
,RD_RDY
,1);
3502 OUTREG32(&DSI_REG
->DSI_START
, 0);
3506 //DSI_REG->DSI_INTEN.RD_RDY = 0;
3507 OUTREGBIT(DSI_INT_ENABLE_REG
,DSI_REG
->DSI_INTEN
,RD_RDY
,1);
3509 OUTREG32(&read_data0
, AS_UINT32(&DSI_REG
->DSI_RX_DATA0
));
3510 OUTREG32(&read_data1
, AS_UINT32(&DSI_REG
->DSI_RX_DATA1
));
3511 OUTREG32(&read_data2
, AS_UINT32(&DSI_REG
->DSI_RX_DATA2
));
3512 OUTREG32(&read_data3
, AS_UINT32(&DSI_REG
->DSI_RX_DATA3
));
3513 #ifdef DDI_DRV_DEBUG_LOG_ENABLE
3517 // DISP_LOG_PRINT(ANDROID_LOG_INFO, "DSI", " DSI_RX_STA : 0x%x \n", DSI_REG->DSI_RX_STA);
3518 DISP_LOG_PRINT(ANDROID_LOG_INFO
, "DSI", " DSI_CMDQ_SIZE : 0x%x \n", DSI_REG
->DSI_CMDQ_SIZE
.CMDQ_SIZE
);
3519 DISP_LOG_PRINT(ANDROID_LOG_INFO
, "DSI", " DSI_CMDQ_DATA0 : 0x%x \n", DSI_CMDQ_REG
->data
[0].byte0
);
3520 DISP_LOG_PRINT(ANDROID_LOG_INFO
, "DSI", " DSI_CMDQ_DATA1 : 0x%x \n", DSI_CMDQ_REG
->data
[0].byte1
);
3521 DISP_LOG_PRINT(ANDROID_LOG_INFO
, "DSI", " DSI_CMDQ_DATA2 : 0x%x \n", DSI_CMDQ_REG
->data
[0].byte2
);
3522 DISP_LOG_PRINT(ANDROID_LOG_INFO
, "DSI", " DSI_CMDQ_DATA3 : 0x%x \n", DSI_CMDQ_REG
->data
[0].byte3
);
3524 DISP_LOG_PRINT(ANDROID_LOG_INFO
, "DSI", " DSI_RX_DATA0 : 0x%x \n", DSI_REG
->DSI_RX_DATA0
);
3525 DISP_LOG_PRINT(ANDROID_LOG_INFO
, "DSI", " DSI_RX_DATA1 : 0x%x \n", DSI_REG
->DSI_RX_DATA1
);
3526 DISP_LOG_PRINT(ANDROID_LOG_INFO
, "DSI", " DSI_RX_DATA2 : 0x%x \n", DSI_REG
->DSI_RX_DATA2
);
3527 DISP_LOG_PRINT(ANDROID_LOG_INFO
, "DSI", " DSI_RX_DATA3 : 0x%x \n", DSI_REG
->DSI_RX_DATA3
);
3529 printk("read_data0, %x,%x,%x,%x\n", read_data0
.byte0
, read_data0
.byte1
, read_data0
.byte2
, read_data0
.byte3
);
3530 printk("read_data1, %x,%x,%x,%x\n", read_data1
.byte0
, read_data1
.byte1
, read_data1
.byte2
, read_data1
.byte3
);
3531 printk("read_data2, %x,%x,%x,%x\n", read_data2
.byte0
, read_data2
.byte1
, read_data2
.byte2
, read_data2
.byte3
);
3532 printk("read_data3, %x,%x,%x,%x\n", read_data3
.byte0
, read_data3
.byte1
, read_data3
.byte2
, read_data3
.byte3
);
3538 packet_type
= read_data0
.byte0
;
3540 #ifdef DDI_DRV_DEBUG_LOG_ENABLE
3542 DISP_LOG_PRINT(ANDROID_LOG_INFO
, "DSI", " DSI read packet_type is 0x%x \n",packet_type
);
3547 if(packet_type
== 0x1A || packet_type
== 0x1C)
3549 recv_data_cnt
= read_data0
.byte1
+ read_data0
.byte2
* 16;
3550 if(recv_data_cnt
> 10)
3552 #ifdef DDI_DRV_DEBUG_LOG_ENABLE
3554 DISP_LOG_PRINT(ANDROID_LOG_WARN
, "DSI", " DSI read long packet data exceeds 4 bytes \n");
3559 if(recv_data_cnt
> buffer_size
)
3561 #ifdef DDI_DRV_DEBUG_LOG_ENABLE
3563 DISP_LOG_PRINT(ANDROID_LOG_WARN
, "DSI", " DSI read long packet data exceeds buffer size: %d\n", buffer_size
);
3565 recv_data_cnt
= buffer_size
;
3567 #ifdef DDI_DRV_DEBUG_LOG_ENABLE
3569 DISP_LOG_PRINT(ANDROID_LOG_WARN
, "DSI", " DSI read long packet size: %d\n", recv_data_cnt
);
3571 memcpy((void*)buffer
, (void*)&read_data1
, recv_data_cnt
);
3575 if(recv_data_cnt
> buffer_size
)
3577 #ifdef DDI_DRV_DEBUG_LOG_ENABLE
3579 DISP_LOG_PRINT(ANDROID_LOG_WARN
, "DSI", " DSI read short packet data exceeds buffer size: %d\n", buffer_size
);
3581 recv_data_cnt
= buffer_size
;
3583 memcpy((void*)buffer
,(void*)&read_data0
.byte1
, 2);
3586 }while(packet_type
!= 0x1C && packet_type
!= 0x21 && packet_type
!= 0x22 && packet_type
!= 0x1A);
3587 /// here: we may receive a ACK packet which packet type is 0x02 (incdicates some error happened)
3588 /// therefore we try re-read again until no ACK packet
3589 /// But: if it is a good way to keep re-trying ???
3591 return recv_data_cnt
;
3594 UINT32
DSI_read_lcm_reg()
3600 DSI_STATUS
DSI_write_lcm_fb(unsigned int addr
, bool long_length
)
3603 DSI_CMDQ_CONFG CONFG_tmp
;
3605 CONFG_tmp
.type
=FB_WRITE
;
3606 CONFG_tmp
.BTA
=DISABLE_BTA
;
3607 CONFG_tmp
.HS
=HIGH_SPEED
;
3610 CONFG_tmp
.CL
=CL_16BITS
;
3612 CONFG_tmp
.CL
=CL_8BITS
;
3614 CONFG_tmp
.TE
=DISABLE_TE
;
3615 CONFG_tmp
.RPT
=DISABLE_RPT
;
3618 t1_tmp
.CONFG
= *((unsigned char *)(&CONFG_tmp
));
3619 t1_tmp
.Data_ID
= 0x39;
3620 t1_tmp
.mem_start0
= (addr
&0xFF);
3623 t1_tmp
.mem_start1
= ((addr
>>8)&0xFF);
3625 return DSI_Write_T1_INS(&t1_tmp
);
3631 DSI_STATUS
DSI_read_lcm_fb(unsigned char *buffer
)
3633 //unsigned int array[2];
3635 _WaitForEngineNotBusy();
3637 array
[0] = 0x000A3700;// read size
3638 DSI_set_cmdq(array
, 1, 1);
3640 DSI_dcs_read_lcm_reg_v2(0x2E,buffer
,10);
3641 DSI_dcs_read_lcm_reg_v2(0x2E,buffer
+10,10);
3642 DSI_dcs_read_lcm_reg_v2(0x2E,buffer
+10*2,10);
3643 DSI_dcs_read_lcm_reg_v2(0x2E,buffer
+10*3,10);
3644 DSI_dcs_read_lcm_reg_v2(0x2E,buffer
+10*4,10);
3645 DSI_dcs_read_lcm_reg_v2(0x2E,buffer
+10*5,10);
3647 // if read_fb not impl, should return info
3648 if(lcm_drv
->read_fb
)
3649 lcm_drv
->read_fb(buffer
);
3651 return DSI_STATUS_OK
;
3654 unsigned int DSI_Check_LCM(UINT32 color
)
3656 unsigned int ret
= 1;
3657 unsigned char buffer
[60];
3659 OUTREG32(&DSI_REG
->DSI_MEM_CONTI
, DSI_RMEM_CONTI
);
3660 DSI_read_lcm_fb(buffer
);
3662 printk("%d\n",buffer
[i
]);
3663 OUTREG32(&DSI_REG
->DSI_MEM_CONTI
, DSI_WMEM_CONTI
);
3666 printk("read pixel = 0x%x,",(buffer
[i
]<<16)|(buffer
[i
+1]<<8)|(buffer
[i
+2]));
3667 if(((buffer
[i
]<<16)|(buffer
[i
+1]<<8)|(buffer
[i
+2])) != (color
&0xFFFFFF)){
3675 unsigned int DSI_BLS_Query(void)
3677 printk("BLS: 0x%x\n", INREG32(0xF400A000));
3678 return (0x1 == (INREG32(0xF400A000)&0x1));//if 1, BLS enable
3681 void DSI_BLS_Enable(bool enable
)
3684 OUTREG32(0xF400A0B0, 0x3);
3685 OUTREG32(0xF400A000, 0x00010001);
3686 OUTREG32(0xF400A0B0, 0x0);
3689 OUTREG32(0xF400A0B0, 0x3);
3690 OUTREG32(0xF400A000, 0x00010000);
3691 OUTREG32(0xF400A0B0, 0x0);
3695 DSI_STATUS
DSI_enable_MIPI_txio(bool en
)
3700 *(volatile unsigned int *) (INFRACFG_BASE
+0x890) |= 0x00000100; // enable MIPI TX IO
3704 *(volatile unsigned int *) (INFRACFG_BASE
+0x890) &= ~0x00000100; // disable MIPI TX IO
3707 return DSI_STATUS_OK
;
3711 bool Need_Wait_ULPS(void)
3713 #ifndef MT65XX_NEW_DISP
3714 if(((INREG32(DSI_BASE
+ 0x14C)>> 24) & 0xFF) != 0x04) {
3716 #ifdef DDI_DRV_DEBUG_LOG_ENABLE
3717 DISP_LOG_PRINT(ANDROID_LOG_INFO
, "DSI", "[%s]:true \n", __func__
);
3723 #ifdef DDI_DRV_DEBUG_LOG_ENABLE
3724 DISP_LOG_PRINT(ANDROID_LOG_INFO
, "DSI", "[%s]:false \n", __func__
);
3735 DSI_STATUS
Wait_ULPS_Mode(void)
3737 #ifndef MT65XX_NEW_DISP
3738 DSI_PHY_LCCON_REG lccon_reg
=DSI_REG
->DSI_PHY_LCCON
;
3739 DSI_PHY_LD0CON_REG ld0con
=DSI_REG
->DSI_PHY_LD0CON
;
3741 lccon_reg
.LC_ULPM_EN
=1;
3742 ld0con
.L0_ULPM_EN
=1;
3743 OUTREG32(&DSI_REG
->DSI_PHY_LCCON
, AS_UINT32(&lccon_reg
));
3744 OUTREG32(&DSI_REG
->DSI_PHY_LD0CON
, AS_UINT32(&ld0con
));
3746 #ifdef DDI_DRV_DEBUG_LOG_ENABLE
3747 DISP_LOG_PRINT(ANDROID_LOG_INFO
, "DSI", "[%s]:enter \n", __func__
);
3750 while(((INREG32(DSI_BASE
+ 0x14C)>> 24) & 0xFF) != 0x04)
3753 #ifdef DDI_DRV_DEBUG_LOG_ENABLE
3754 DISP_LOG_PRINT(ANDROID_LOG_INFO
, "DSI", "DSI+%04x : 0x%08x \n", DSI_BASE
, INREG32(DSI_BASE
+ 0x14C));
3758 #ifdef DDI_DRV_DEBUG_LOG_ENABLE
3759 DISP_LOG_PRINT(ANDROID_LOG_INFO
, "DSI", "[%s]:exit \n", __func__
);
3762 return DSI_STATUS_OK
;
3767 DSI_STATUS
Wait_WakeUp(void)
3769 #ifndef MT65XX_NEW_DISP
3770 DSI_PHY_LCCON_REG lccon_reg
=DSI_REG
->DSI_PHY_LCCON
;
3771 DSI_PHY_LD0CON_REG ld0con
=DSI_REG
->DSI_PHY_LD0CON
;
3773 #ifdef DDI_DRV_DEBUG_LOG_ENABLE
3774 DISP_LOG_PRINT(ANDROID_LOG_INFO
, "DSI", "[%s]:enter \n", __func__
);
3777 lccon_reg
.LC_ULPM_EN
=0;
3778 ld0con
.L0_ULPM_EN
=0;
3779 OUTREG32(&DSI_REG
->DSI_PHY_LCCON
, AS_UINT32(&lccon_reg
));
3780 OUTREG32(&DSI_REG
->DSI_PHY_LD0CON
, AS_UINT32(&ld0con
));
3782 lcm_mdelay(1);//Wait 1ms for LCM Spec
3784 lccon_reg
.LC_WAKEUP_EN
=1;
3785 ld0con
.L0_WAKEUP_EN
=1;
3786 OUTREG32(&DSI_REG
->DSI_PHY_LCCON
, AS_UINT32(&lccon_reg
));
3787 OUTREG32(&DSI_REG
->DSI_PHY_LD0CON
, AS_UINT32(&ld0con
));
3789 while(((INREG32(DSI_BASE
+ 0x148)>> 8) & 0xFF) != 0x01)
3792 #ifdef DDI_DRV_DEBUG_LOG_ENABLE
3793 DISP_LOG_PRINT(ANDROID_LOG_INFO
, "DSI", "[soso]DSI+%04x : 0x%08x \n", DSI_BASE
, INREG32(DSI_BASE
+ 0x148));
3797 #ifdef DDI_DRV_DEBUG_LOG_ENABLE
3798 DISP_LOG_PRINT(ANDROID_LOG_INFO
, "DSI", "[%s]:exit \n", __func__
);
3801 lccon_reg
.LC_WAKEUP_EN
=0;
3802 ld0con
.L0_WAKEUP_EN
=0;
3803 OUTREG32(&DSI_REG
->DSI_PHY_LCCON
, AS_UINT32(&lccon_reg
));
3804 OUTREG32(&DSI_REG
->DSI_PHY_LD0CON
, AS_UINT32(&ld0con
));
3806 return DSI_STATUS_OK
;
3810 // -------------------- Retrieve Information --------------------
3812 DSI_STATUS
DSI_DumpRegisters(void)
3816 description of dsi status
3817 Bit Value Description
3818 [0] 0x0001 Idle (wait for command)
3819 [1] 0x0002 Reading command queue for header
3820 [2] 0x0004 Sending type-0 command
3821 [3] 0x0008 Waiting frame data from RDMA for type-1 command
3822 [4] 0x0010 Sending type-1 command
3823 [5] 0x0020 Sending type-2 command
3824 [6] 0x0040 Reading command queue for data
3825 [7] 0x0080 Sending type-3 command
3826 [8] 0x0100 Sending BTA
3827 [9] 0x0200 Waiting RX-read data
3828 [10] 0x0400 Waiting SW RACK for RX-read data
3829 [11] 0x0800 Waiting TE
3831 [13] 0x2000 Waiting external TE
3832 [14] 0x4000 Waiting SW RACK for TE
3835 static const char* DSI_DBG_STATUS_DESCRIPTION
[] =
3838 "Idle (wait for command)",
3839 "Reading command queue for header",
3840 "Sending type-0 command",
3841 "Waiting frame data from RDMA for type-1 command",
3842 "Sending type-1 command",
3843 "Sending type-2 command",
3844 "Reading command queue for data",
3845 "Sending type-3 command",
3847 "Waiting RX-read data ",
3848 "Waiting SW RACK for RX-read data",
3851 "Waiting external TE",
3852 "Waiting SW RACK for TE",
3854 unsigned int DSI_DBG6_Status
= (INREG32(DSI_BASE
+0x160))&0xffff;
3855 //unsigned int DSI_DBG6_Status_bak = DSI_DBG6_Status;
3857 while(DSI_DBG6_Status
){DSI_DBG6_Status
>>=1; count
++;}
3858 //while((1<<count) != DSI_DBG6_Status) count++;
3860 DISP_LOG_PRINT(ANDROID_LOG_INFO
, "DSI", "---------- Start dump DSI registers ----------\n");
3861 DISP_LOG_PRINT(ANDROID_LOG_INFO
, "DSI", "DSI_STATE_DBG6=0x%08x, count=%d, means: [%s]\n", DSI_DBG6_Status
, count
, DSI_DBG_STATUS_DESCRIPTION
[count
]);
3863 DISP_LOG_PRINT(ANDROID_LOG_INFO
, "DSI", "---------- Start dump DSI registers ----------\n");
3865 for (i
= 0; i
< sizeof(DSI_REGS
); i
+= 16)
3867 DISP_LOG_PRINT(ANDROID_LOG_INFO
, "DSI", "DSI+%04x : 0x%08x 0x%08x 0x%08x 0x%08x\n", i
, INREG32(DSI_BASE
+ i
), INREG32(DSI_BASE
+ i
+ 0x4), INREG32(DSI_BASE
+ i
+ 0x8), INREG32(DSI_BASE
+ i
+ 0xc));
3870 for (i
= 0; i
< sizeof(DSI_CMDQ_REGS
); i
+= 16)
3872 DISP_LOG_PRINT(ANDROID_LOG_INFO
, "DSI", "DSI_CMD+%04x : 0x%08x 0x%08x 0x%08x 0x%08x\n", i
, INREG32((DSI_BASE
+0x180+i
)), INREG32((DSI_BASE
+0x180+i
+0x4)), INREG32((DSI_BASE
+0x180+i
+0x8)), INREG32((DSI_BASE
+0x180+i
+0xc)));
3875 for (i
= 0; i
< sizeof(DSI_PHY_REGS
); i
+= 16)
3877 DISP_LOG_PRINT(ANDROID_LOG_INFO
, "DSI", "DSI_PHY+%04x : 0x%08x 0x%08x 0x%08x 0x%08x\n", i
, INREG32((MIPI_CONFIG_BASE
+i
)), INREG32((MIPI_CONFIG_BASE
+i
+0x4)), INREG32((MIPI_CONFIG_BASE
+i
+0x8)), INREG32((MIPI_CONFIG_BASE
+i
+0xc)));
3880 return DSI_STATUS_OK
;
3884 static LCM_PARAMS lcm_params_for_clk_setting
;
3887 DSI_STATUS
DSI_FMDesense_Query(void)
3889 return DSI_STATUS_OK
;
3892 DSI_STATUS
DSI_FM_Desense(unsigned long freq
)
3895 DSI_Change_CLK(freq
);
3896 return DSI_STATUS_OK
;
3899 DSI_STATUS
DSI_Reset_CLK(void)
3901 extern LCM_PARAMS
*lcm_params
;
3903 _WaitForEngineNotBusy();
3904 DSI_PHY_clk_setting(lcm_params
);
3905 DSI_PHY_TIMCONFIG(lcm_params
);
3906 return DSI_STATUS_OK
;
3909 DSI_STATUS
DSI_Get_Default_CLK(unsigned int *clk
)
3911 extern LCM_PARAMS
*lcm_params
;
3912 unsigned int div2_real
= lcm_params
->dsi
.pll_div2
? lcm_params
->dsi
.pll_div2
: 0x1;
3914 *clk
= 13 * (lcm_params
->dsi
.pll_div1
+ 1) / div2_real
;
3915 return DSI_STATUS_OK
;
3918 DSI_STATUS
DSI_Get_Current_CLK(unsigned int *clk
)
3921 if(mipitx_con1
.RG_PLL_DIV2
== 0)
3922 *clk
= 26 * (mipitx_con1
.RG_PLL_DIV1
+ 1);
3924 *clk
= 13 * (mipitx_con1
.RG_PLL_DIV1
+ 1) / mipitx_con1
.RG_PLL_DIV2
;
3926 return DSI_STATUS_OK
;
3929 DSI_STATUS
DSI_Change_CLK(unsigned int clk
)
3931 extern LCM_PARAMS
*lcm_params
;
3934 return DSI_STATUS_ERROR
;
3935 memcpy((void *)&lcm_params_for_clk_setting
, (void *)lcm_params
, sizeof(LCM_PARAMS
));
3937 for(lcm_params_for_clk_setting
.dsi
.pll_div2
= 15; lcm_params_for_clk_setting
.dsi
.pll_div2
> 0; lcm_params_for_clk_setting
.dsi
.pll_div2
--)
3939 for(lcm_params_for_clk_setting
.dsi
.pll_div1
= 0; lcm_params_for_clk_setting
.dsi
.pll_div1
< 39; lcm_params_for_clk_setting
.dsi
.pll_div1
++)
3941 if((13 * (lcm_params_for_clk_setting
.dsi
.pll_div1
+ 1) / lcm_params_for_clk_setting
.dsi
.pll_div2
) >= clk
)
3946 if(lcm_params_for_clk_setting
.dsi
.pll_div2
== 0)
3948 for(lcm_params_for_clk_setting
.dsi
.pll_div1
= 0; lcm_params_for_clk_setting
.dsi
.pll_div1
< 39; lcm_params_for_clk_setting
.dsi
.pll_div1
++)
3950 if((26 * (lcm_params_for_clk_setting
.dsi
.pll_div1
+ 1)) >= clk
)
3956 _WaitForEngineNotBusy();
3957 DSI_PHY_clk_setting(&lcm_params_for_clk_setting
);
3958 DSI_PHY_TIMCONFIG(&lcm_params_for_clk_setting
);
3959 return DSI_STATUS_OK
;
3961 /*fbconfig ulitity to set dsi clock ;
3962 ioctl : MIPI_SET_CLK
3964 DSI_STATUS
fbconfig_DSI_set_CLK(unsigned int clk
)
3966 extern LCM_PARAMS
*lcm_params
;
3967 LCM_PARAMS fb_lcm_params
;
3968 printk("sxk==>fbconfig_DSI_set_CLK:%d\n",clk
);
3971 return DSI_STATUS_ERROR
;
3972 memcpy((void *)&fb_lcm_params
, (void *)lcm_params
, sizeof(LCM_PARAMS
));
3973 fb_lcm_params
.dsi
.PLL_CLOCK
= clk
;
3974 printk("sxk==>fbconfig_DSI_set_CLK:will wait!!\n");
3976 _WaitForEngineNotBusy();//cmd mode
3977 printk("sxk==>will fbconfig_DSI_set_CLK:%d\n",clk
);
3979 DSI_PHY_clk_setting(&fb_lcm_params
);
3980 //DSI_PHY_TIMCONFIG(&lcm_params_for_clk_setting);
3981 DSI_DumpRegisters();
3982 return DSI_STATUS_OK
;
3985 void fbconfig_DSI_set_lane_num(unsigned int lane_num
)
3987 DSI_TXRX_CTRL_REG tmp_reg
;
3988 tmp_reg
=DSI_REG
->DSI_TXRX_CTRL
;
3991 case LCM_ONE_LANE
:tmp_reg
.LANE_NUM
= 1;break;
3992 case LCM_TWO_LANE
:tmp_reg
.LANE_NUM
= 3;break;
3993 case LCM_THREE_LANE
:tmp_reg
.LANE_NUM
= 0x7;break;
3994 case LCM_FOUR_LANE
:tmp_reg
.LANE_NUM
= 0xF;break;
3996 OUTREG32(&DSI_REG
->DSI_TXRX_CTRL
, AS_UINT32(&tmp_reg
));
3997 //DSI Clock setting for accroding lane num ;
4000 DSI_PHY_REG
->MIPITX_DSI0_DATA_LANE0
.RG_DSI0_LNT0_RT_CODE
= 0x8;
4001 DSI_PHY_REG
->MIPITX_DSI0_DATA_LANE0
.RG_DSI0_LNT0_LDOOUT_EN
= 1;
4006 DSI_PHY_REG
->MIPITX_DSI0_DATA_LANE1
.RG_DSI0_LNT1_RT_CODE
= 0x8;
4007 DSI_PHY_REG
->MIPITX_DSI0_DATA_LANE1
.RG_DSI0_LNT1_LDOOUT_EN
= 1;
4012 DSI_PHY_REG
->MIPITX_DSI0_DATA_LANE2
.RG_DSI0_LNT2_RT_CODE
= 0x8;
4013 DSI_PHY_REG
->MIPITX_DSI0_DATA_LANE2
.RG_DSI0_LNT2_LDOOUT_EN
= 1;
4018 DSI_PHY_REG
->MIPITX_DSI0_DATA_LANE3
.RG_DSI0_LNT3_RT_CODE
= 0x8;
4019 DSI_PHY_REG
->MIPITX_DSI0_DATA_LANE3
.RG_DSI0_LNT3_LDOOUT_EN
= 1;
4023 //"TIMCON0_REG:" "HS_PRPR" "HS_ZERO" "HS_TRAIL\n"
4024 // "TIMCON1_REG:" "TA_GO" "TA_SURE" "TA_GET" "DA_HS_EXIT\n"
4025 // "TIMCON2_REG:" "CLK_ZERO" "CLK_TRAIL" "CONT_DET\n"
4026 // "TIMCON3_REG:" "CLK_HS_PRPR" "CLK_HS_POST" "CLK_HS_EXIT\n"
4028 void fbconfig_DSI_set_timing(MIPI_TIMING timing
)
4033 OUTREGBIT(DSI_PHY_TIMCON0_REG
,DSI_REG
->DSI_PHY_TIMECON0
,HS_PRPR
,timing
.value
);
4036 OUTREGBIT(DSI_PHY_TIMCON0_REG
,DSI_REG
->DSI_PHY_TIMECON0
,HS_ZERO
,timing
.value
);
4039 OUTREGBIT(DSI_PHY_TIMCON0_REG
,DSI_REG
->DSI_PHY_TIMECON0
,HS_TRAIL
,timing
.value
);
4042 OUTREGBIT(DSI_PHY_TIMCON1_REG
,DSI_REG
->DSI_PHY_TIMECON1
,TA_GO
,timing
.value
);
4045 OUTREGBIT(DSI_PHY_TIMCON1_REG
,DSI_REG
->DSI_PHY_TIMECON1
,TA_SURE
,timing
.value
);
4048 OUTREGBIT(DSI_PHY_TIMCON1_REG
,DSI_REG
->DSI_PHY_TIMECON1
,TA_GET
,timing
.value
);
4051 OUTREGBIT(DSI_PHY_TIMCON1_REG
,DSI_REG
->DSI_PHY_TIMECON1
,DA_HS_EXIT
,timing
.value
);
4054 OUTREGBIT(DSI_PHY_TIMCON2_REG
,DSI_REG
->DSI_PHY_TIMECON2
,CONT_DET
,timing
.value
);
4057 OUTREGBIT(DSI_PHY_TIMCON2_REG
,DSI_REG
->DSI_PHY_TIMECON2
,CLK_ZERO
,timing
.value
);
4060 OUTREGBIT(DSI_PHY_TIMCON2_REG
,DSI_REG
->DSI_PHY_TIMECON2
,CLK_TRAIL
,timing
.value
);
4063 OUTREGBIT(DSI_PHY_TIMCON3_REG
,DSI_REG
->DSI_PHY_TIMECON3
,CLK_HS_PRPR
,timing
.value
);
4066 OUTREGBIT(DSI_PHY_TIMCON3_REG
,DSI_REG
->DSI_PHY_TIMECON3
,CLK_HS_POST
,timing
.value
);
4069 OUTREGBIT(DSI_PHY_TIMCON3_REG
,DSI_REG
->DSI_PHY_TIMECON3
,CLK_HS_EXIT
,timing
.value
);
4072 OUTREG32(&DSI_REG
->DSI_HSA_WC
, ALIGN_TO((timing
.value
), 4));
4075 OUTREG32(&DSI_REG
->DSI_HFP_WC
, ALIGN_TO((timing
.value
), 4));
4078 OUTREG32(&DSI_REG
->DSI_HBP_WC
, ALIGN_TO((timing
.value
), 4));
4081 OUTREG32(&DSI_REG
->DSI_VACT_NL
,timing
.value
);
4084 OUTREG32(&DSI_REG
->DSI_VFP_NL
, timing
.value
);
4087 OUTREG32(&DSI_REG
->DSI_VBP_NL
, timing
.value
);
4090 printk("fbconfig dsi set timing :no such type!!\n");
4092 DSI_DumpRegisters();
4096 DSI_STATUS
DSI_Capture_Framebuffer(unsigned int pvbuf
, unsigned int bpp
, bool cmd_mode
)
4099 unsigned int ret
= 0;
4100 M4U_PORT_STRUCT portStruct
;
4102 struct disp_path_config_mem_out_struct mem_out
= {0};
4103 printk("enter DSI_Capture_FB!\n");
4106 mem_out
.outFormat
= eARGB8888
;
4108 mem_out
.outFormat
= eRGB565
;
4110 mem_out
.outFormat
= eRGB888
;
4112 printk("DSI_Capture_FB, fb color format not support\n");
4114 printk("before alloc MVA: va = 0x%x, size = %d\n", pvbuf
, lcm_params
->height
*lcm_params
->width
*bpp
/8);
4115 ret
= m4u_alloc_mva(DISP_WDMA
,
4117 lcm_params
->height
*lcm_params
->width
*bpp
/8,
4123 printk("m4u_alloc_mva() fail! \n");
4124 return DSI_STATUS_OK
;
4126 printk("addr=0x%x, format=%d \n", mva
, (mem_out
.outFormat
));
4128 m4u_dma_cache_maint(DISP_WDMA
,
4129 (const void *)pvbuf
,
4130 lcm_params
->height
*lcm_params
->width
*bpp
/8,
4133 portStruct
.ePortID
= DISP_WDMA
; //hardware port ID, defined in M4U_PORT_ID_ENUM
4134 portStruct
.Virtuality
= 1;
4135 portStruct
.Security
= 0;
4136 portStruct
.domain
= 0; //domain : 0 1 2 3
4137 portStruct
.Distance
= 1;
4138 portStruct
.Direction
= 0;
4139 m4u_config_port(&portStruct
);
4142 mem_out
.dstAddr
= mva
;
4143 mem_out
.srcROI
.x
= 0;
4144 mem_out
.srcROI
.y
= 0;
4145 mem_out
.srcROI
.height
= lcm_params
->height
;
4146 mem_out
.srcROI
.width
= lcm_params
->width
;
4148 _WaitForEngineNotBusy();
4149 disp_path_get_mutex();
4150 disp_path_config_mem_out(&mem_out
);
4151 printk("Wait DSI idle \n");
4156 disp_path_release_mutex();
4158 _WaitForEngineNotBusy();
4160 disp_path_get_mutex();
4162 disp_path_config_mem_out(&mem_out
);
4167 disp_path_release_mutex();
4169 portStruct
.ePortID
= DISP_WDMA
; //hardware port ID, defined in M4U_PORT_ID_ENUM
4170 portStruct
.Virtuality
= 1;
4171 portStruct
.Security
= 0;
4172 portStruct
.domain
= 0; //domain : 0 1 2 3
4173 portStruct
.Distance
= 1;
4174 portStruct
.Direction
= 0;
4175 m4u_config_port(&portStruct
);
4177 m4u_dealloc_mva(DISP_WDMA
,
4179 lcm_params
->height
*lcm_params
->width
*bpp
/8,
4182 return DSI_STATUS_OK
;
4186 DSI_STATUS
DSI_TE_Enable(BOOL enable
)
4188 printk("sxk==>set TE Enable %d \n",enable
);
4189 dsiTeEnable
= enable
;
4191 return DSI_STATUS_OK
;
4193 DSI_STATUS
DSI_TE_EXT_Enable(BOOL enable
)
4196 dsiTeExtEnable
= enable
;
4198 if(dsiTeExtEnable
== false)
4200 OUTREGBIT(DSI_TXRX_CTRL_REG
,DSI_REG
->DSI_TXRX_CTRL
,EXT_TE_EN
,0);
4204 return DSI_STATUS_OK
;
4207 BOOL
DSI_Get_EXT_TE(void)
4209 return dsiTeExtEnable
;
4212 BOOL
DSI_Get_BTA_TE(void)
4217 DSI_STATUS
DSI_Wait_VDO_Idle(void)
4219 static const long WAIT_TIMEOUT
= 2 * HZ
; // 2 sec
4223 ret
= wait_event_interruptible_timeout(_dsi_wait_vm_done_queue
,
4228 xlog_printk(ANDROID_LOG_WARN
, "DSI", " Wait for DSI engine read ready timeout!!!\n");
4230 DSI_DumpRegisters();
4231 ///do necessary reset here
4234 DSI_SetMode(lcm_params
->dsi
.mode
);
4236 return DSI_STATUS_OK
;
4239 DSI_MODE_CTRL_REG fb_config_mode_ctl
, fb_config_mode_ctl_backup
;
4241 void fbconfig_set_cmd_mode(void)
4244 static const long FB_WAIT_TIMEOUT
= 2 * HZ
; // 2 sec
4247 OUTREG32(&fb_config_mode_ctl_backup
, AS_UINT32(&DSI_REG
->DSI_MODE_CTRL
));
4248 OUTREG32(&fb_config_mode_ctl
, AS_UINT32(&DSI_REG
->DSI_MODE_CTRL
));
4250 fb_config_mode_ctl
.MODE
= 0;
4251 OUTREG32(&DSI_REG
->DSI_MODE_CTRL
, AS_UINT32(&fb_config_mode_ctl
));
4254 wait_vm_done_irq
= true;
4255 ret
= wait_event_interruptible_timeout(_dsi_wait_vm_done_queue
,
4259 xlog_printk(ANDROID_LOG_WARN
, "DSI", " Wait for DSI engine read ready timeout!!!\n");
4261 DSI_DumpRegisters();
4262 ///do necessary reset here
4264 wait_vm_done_irq
= false;
4268 void fbconfig_set_vdo_mode(void)
4270 OUTREG32(&DSI_REG
->DSI_MODE_CTRL
, AS_UINT32(&fb_config_mode_ctl_backup
));
4273 void fbconfig_DSI_Continuous_HS(int enable
)
4275 DSI_TXRX_CTRL_REG tmp_reg
= DSI_REG
->DSI_TXRX_CTRL
;
4277 tmp_reg
.HSTX_CKLP_EN
= enable
;
4278 OUTREG32(&DSI_REG
->DSI_TXRX_CTRL
, AS_UINT32(&tmp_reg
));