hdmi.c 46 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456
  1. #include "drv_types.h"
  2. #include "hdmi.h"
  3. #include "hdmi_hw.h"
  4. #include "hdmi_hdcp.h"
  5. #include "hdmi_notice.h"
  6. #include "hdmi_audio.h"
  7. #include "hdmi_video.h"
  8. #include "hdmi_mapping.h"
  9. #include "hdmi_hpd.h"
  10. #include "hdmi_processing.h"
  11. #include "hdmi_switch.h"
  12. #include "hdmi_time.h"
  13. #include "hdmi_dbg.h"
  14. #include "hdmi_cfg.h"
  15. #include "cec.h"
  16. #include "gpioi2c.h"
  17. #include "sysreg.h"
  18. #ifdef CONFIG_HDMI_SUPPORT_MHL
  19. #include "cbus_drv.h"
  20. #include "cbus_app.h"
  21. #include "mhl_application.h"
  22. static BOOL MHL_CBUS_Init=FALSE;
  23. #endif
  24. BOOL MHL_CABLE_IN=FALSE;
  25. BOOL MHL_CTS=FALSE;
  26. static BOOL HDMI_Init=FALSE;
  27. static struct work_struct wq_chlock;
  28. #ifdef CONFIG_HDMI_HW_PATCH_FOR_HDCP_COLOR_SNOW
  29. static struct work_struct wq_ToggleHPD;
  30. #endif
  31. #ifdef USE_HW_ADAPTIVE_EQ
  32. static struct delayed_work wq_Enable_DCK;
  33. #endif
  34. #define writel(data, address) (*(volatile unsigned long*)(address) = data)
  35. #define writeb(data, address) (*(volatile unsigned char*)(address) = data)
  36. #define readl(address) (*(volatile unsigned long*)(address))
  37. #define readb(address) (*(volatile unsigned char*)(address))
  38. void HDMI_Toggle_HPD(void)
  39. {
  40. printk("HDMI_Toggle_HPD\n");
  41. /* All hpd goes low */
  42. /* Disable hdmi hw and all interrupts */
  43. HDMI_RegisterWrite(HDMIRX_PDACJ_CK, 0); //stop phy clock
  44. HDMI_RegisterWrite(HDMIRX_R_DDC5V_reset, 1);
  45. HDMI_RegisterWrite(HDMIRX_R_rst_n, 0); /* Disable hdmi logic */
  46. HDMI_Interrupt_Disable(INTR_ALL); /* Disable all interrupts */
  47. HDMI_RegisterWrite(HDMIRX_R_INTR_Status, INTR_ALL); /* Clear all interrupts if any */
  48. #ifdef HDMI_DDC5V_WORKAROUND
  49. if(CEC_Get_SW5V(hdmi_get_cur_port()) == DRV_5V_LEVEL_HIGH) //do not change HPD status after cable out
  50. #endif
  51. hdmi_apply_hpd((1 << hdmi_get_cur_port()), DRV_HPD_LEVEL_LOW);
  52. /* Wait 100ms for hot plug pulse width */
  53. HDMI_DelayMs(100);
  54. /* Enable related interrupts */
  55. //HDMI_Interrupt_Enable(INTR_HDCP_Key_Request | INTR_AVI_infoframe | INTR_Inactive_to_Active | INTR_phy_IN_RANGE | INTR_phy_PLLLOCK);
  56. HDMI_Interrupt_Enable(INTR_HDCP_Key_Request | INTR_AVI_infoframe | INTR_SPD_infoframe | INTR_Inactive_to_Active | INTR_phy_IN_RANGE | INTR_PLLLOCK);
  57. //HDMI_RegisterWrite(HDMIRX_R_INTR_en, INTR_GamutBoundaryData); //enable INTR_GamutBoundaryData
  58. //HDMI_RegisterWrite(HDMIRX_R_INTR_en, INTR_VSI_packets); //enable INTR_VSI_packets
  59. /* Clear interrupts of audio sample commings */
  60. HDMI_RegisterWrite(HDMIRX_AS_exist, 1); // Write 1 Clear
  61. HDMI_RegisterWrite(HDMIRX_HBRAS_exist, 1); // Write 1 Clear
  62. /* Enable hdmi logic, power on */
  63. HDMI_RegisterWrite(HDMIRX_R_rst_n, 1); /* Enable hdmi logic */
  64. HDMI_RegisterWrite(HDMIRX_R_DDC5V_reset, 0);
  65. HDMI_RegisterWrite(HDMIRX_PDACJ_CK, 1); //start phy clock for In_Range interrupt
  66. /* Set software hdcp handshake */
  67. HDMI_RegisterWrite(HDMIRX_R_CLK_DIV, 0x4); /* Enable hdcp */
  68. HDMI_RegisterWrite(HDMIRX_R_HDCP_CTL, 0x9f04);
  69. HDMI_RegisterWrite(HDMIRX_R_HDCP_CTL, 0x9f0c);
  70. HDMI_RegisterWrite(HDMIRX_R_HDCP_CTL, 0x9f85);
  71. /* Apply HPD according to DDC status */
  72. #ifdef HDMI_DDC5V_WORKAROUND
  73. if(CEC_Get_SW5V(hdmi_get_cur_port()) == DRV_5V_LEVEL_HIGH) //do not change HPD status after cable out, or the HPD will be high
  74. #endif
  75. hdmi_apply_hpd((1 << hdmi_get_cur_port()), DRV_HPD_LEVEL_HIGH);
  76. hdmi_flag_set(WAIT_HDCP);
  77. }
  78. static struct work_struct wq_Enable_InRange;
  79. void HDMI_Enable_InRange(void)
  80. {
  81. printk("HDMI_Enable_InRange\n");
  82. HDMI_Interrupt_Enable(INTR_phy_IN_RANGE);
  83. }
  84. #ifdef USE_HW_ADAPTIVE_EQ
  85. void HDMI_Enable_DCK(void)
  86. {
  87. hdmidbg("HDMI_Enable_DCK\n");
  88. HDMI_RegisterWrite(HDMIRX_RST_1XCLK, 1);
  89. }
  90. #endif
  91. void DRV_HDMI_SW_HDCP_RSTN(void)
  92. {
  93. hdmidbg("DRV_HDMI_SW_HDCP_RSTN\n");
  94. HDMI_RegisterWrite(HDMIRX_R_sw_hdcp_rstn, 0);
  95. HDMI_RegisterWrite(HDMIRX_R_sw_hdcp_rstn, 1);
  96. }
  97. void hdmi_dbg_Handler(INT8 *buf, size_t size);
  98. /* Defined in hdmi_hdcp.c */
  99. UINT32 hdmi_get_hdcp_data(INT32 offset);
  100. static BOOL Active_Flag=FALSE;
  101. static UINT8 AVI_ISR_CNT=0;
  102. static UINT8 Active_to_Inactive_ISR_CNT=0;
  103. #ifdef CONFIG_SUPPORT_DOLBY_AUDIO
  104. static BOOL ATMOS_MODE=FALSE;
  105. static BOOL CurATMOS_MODE=FALSE;
  106. static BOOL EDID_SUPPORT_DD_PLUS=TRUE;
  107. #endif
  108. static irqreturn_t hdmi_isr(INT32 irq, void* dev_id, struct pt_regs *regs)
  109. {
  110. UINT32 dIntrStatus;
  111. #ifdef USE_HW_ADAPTIVE_EQ
  112. UINT32 bPhyOvspIntrStatus;
  113. #endif
  114. static UINT8 bResetInRangeIntrCnt = 0;
  115. static UINT32 dLastHDMI_GetSysTime = 0;
  116. UINT32 dCurHDMI_GetSysTime = 0;
  117. dIntrStatus = HDMI_RegisterRead(HDMIRX_R_INTR_Status);
  118. #ifdef USE_HW_ADAPTIVE_EQ
  119. bPhyOvspIntrStatus = (*((u32 *)0xbe0e0c40) &INTR_Phy_Ovsp_int) ;
  120. #endif
  121. if(dIntrStatus & INTR_HDCP_Key_Request)
  122. {
  123. UINT32 start_count = read_c0_count();
  124. UINT32 diff_count = 0;
  125. UINT32 wait_count = __TIMER_FREQ / 10;
  126. hdmidbg("ISR:HDCP_Key_Request\n");
  127. do
  128. {
  129. INT32 keyoffset = HDMI_RegisterRead(HDMIRX_mmio_raddr);
  130. HDMI_RegisterWrite(HDMIRX_R_INTR_Status, INTR_HDCP_Key_Request); //clear
  131. HDMI_RegisterWrite(HDMIRX_mmio_rdata, hdmi_get_hdcp_data(keyoffset));
  132. if (keyoffset == 0x01)
  133. {
  134. hdmidbg("HDCP KSV\n");
  135. break;
  136. }
  137. else if (keyoffset == 0x47)
  138. {
  139. hdmi_flag_set(HAS_HDCP);
  140. hdmidbg("HDCP KEY\n");
  141. hdmi_flag_clear(WAIT_HDCP);
  142. break;
  143. }
  144. dIntrStatus = HDMI_RegisterRead(HDMIRX_R_INTR_Status);
  145. while ((!(dIntrStatus & INTR_HDCP_Key_Request)) && (diff_count < wait_count))
  146. {
  147. diff_count = read_c0_count();
  148. diff_count -= start_count;
  149. dIntrStatus = HDMI_RegisterRead(HDMIRX_R_INTR_Status);
  150. }
  151. }
  152. while (diff_count < wait_count);
  153. return IRQ_HANDLED;
  154. }
  155. dIntrStatus = HDMI_RegisterRead(HDMIRX_R_INTR_Status);
  156. if(dIntrStatus & INTR_Buffer_Change_Pulse)
  157. {
  158. //hdmidbg("ISR:Buffer_Change_Pulse\n");
  159. if (hdmi_flag_check(HAS_ACTIVE_DATA))
  160. {
  161. HDMI_Audio_BufferUpdated();
  162. }
  163. else
  164. {
  165. HDMI_RegisterWrite(HDMIRX_R_INTR_Status, INTR_Buffer_Change_Pulse); //clear
  166. }
  167. }
  168. else if (dIntrStatus & INTR_Channel_Status_Lock_Pulse)
  169. {
  170. hdmidbg("ISR:Channel_Status_Lock_Pulse\n");
  171. HDMI_RegisterWrite(HDMIRX_R_INTR_Status, INTR_Channel_Status_Lock_Pulse); //clear
  172. /* The ACP Interrupt is enabled after channel lock interrupt is serviced. */
  173. HDMI_Interrupt_Enable(INTR_ACP_packets);
  174. /* Only handle channel lock interrupts when video is avaliable */
  175. if (hdmi_flag_check(HAS_ACTIVE_DATA))
  176. {
  177. // schedule_work(&wq_chlock);
  178. // printk("Channel lock isr\n");
  179. HDMI_Audio_ChannelLocked();
  180. }
  181. else
  182. {
  183. hdmidbg("Channel lock isr is disabled\n");
  184. HDMI_RegisterWrite(HDMIRX_R_dma_w_enable, 0);
  185. HDMI_Interrupt_Disable(INTR_Buffer_Change_Pulse | INTR_Channel_Status_Lock_Pulse);
  186. HDMI_RegisterWrite(HDMIRX_R_audio_enable, 0);
  187. }
  188. }
  189. else if (dIntrStatus & INTR_audio_sample_coming)
  190. {
  191. hdmidbg("ISR:audio_sample_coming\n");
  192. HDMI_Interrupt_Disable(INTR_audio_sample_coming);
  193. HDMI_RegisterWrite(HDMIRX_R_INTR_Status, INTR_audio_sample_coming); //clear
  194. HDMI_Interrupt_Enable(INTR_HBR_audio_sample_coming);
  195. HDMI_RegisterWrite(HDMIRX_AS_exist, 1); //Write 1 Clear
  196. HDMI_RegisterWrite(HDMIRX_HBRAS_exist, 1); //Write 1 Clear
  197. /* Restart hdmi audio to receive high bitrate audio samples */
  198. DRV_HDMI_AudioRestart();
  199. }
  200. else if (dIntrStatus & INTR_HBR_audio_sample_coming)
  201. {
  202. hdmidbg("ISR:HBR_audio_sample_coming\n");
  203. HDMI_Interrupt_Disable(INTR_HBR_audio_sample_coming);
  204. HDMI_RegisterWrite(HDMIRX_R_INTR_Status, INTR_HBR_audio_sample_coming); //clear
  205. HDMI_Interrupt_Enable(INTR_audio_sample_coming);
  206. HDMI_RegisterWrite(HDMIRX_AS_exist, 1); //Write 1 Clear
  207. HDMI_RegisterWrite(HDMIRX_HBRAS_exist, 1); //Write 1 Clear
  208. /* Restart hdmi audio to receive normal bitrate audio samples */
  209. DRV_HDMI_AudioRestart();
  210. }
  211. else if (dIntrStatus & INTR_ACP_packets)
  212. {
  213. hdmidbg("ISR:ACP_packets\n");
  214. /* The ACP Interrupt is enabled after channel lock interrupt is serviced. */
  215. /* Clear the interrupt */
  216. HDMI_RegisterWrite(HDMIRX_R_INTR_Status, INTR_ACP_packets); //clear
  217. /* Service once and disable the interrupt */
  218. HDMI_Interrupt_Disable(INTR_ACP_packets);
  219. /* Notice flow control that the input audio type */
  220. //HDMI_NoticeAudioACP(HDMI_RegisterWrite(HDMIRX_R_ACP_Type);
  221. }
  222. else if (dIntrStatus & INTR_AVI_infoframe)
  223. {
  224. /* Related info will be used in active interrupt handler */
  225. hdmidbg("ISR:AVI_infoframe\n");
  226. HDMI_RegisterWrite(HDMIRX_R_INTR_Status, INTR_AVI_infoframe); //clear
  227. if(hdmi_flag_check(HAS_ACTIVE_DATA))
  228. {
  229. avi_change_schedule();
  230. }
  231. hdmi_flag_set(HAS_AVIINFO_PKT);
  232. if( Active_Flag ==FALSE)
  233. {
  234. if(AVI_ISR_CNT<3)
  235. {
  236. AVI_ISR_CNT++;
  237. }
  238. else
  239. {
  240. printk("Repeat ISR:AVI_infoframe\n");
  241. HDMI_Reset_HDMI_PLL();
  242. HDMI_RegisterWrite(HDMIRX_R_DDC5V_reset, 1);
  243. HDMI_RegisterWrite(HDMIRX_R_rst_n, 0);
  244. HDMI_DelayMs(2);
  245. HDMI_RegisterWrite(HDMIRX_R_rst_n, 1);
  246. HDMI_RegisterWrite(HDMIRX_R_DDC5V_reset, 0);
  247. AVI_ISR_CNT = 0;
  248. }
  249. }
  250. }
  251. else if (dIntrStatus & INTR_Inactive_to_Active)
  252. {
  253. #ifdef CONFIG_HDMI_SUPPORT_MHL
  254. if((MHL_CABLE_IN == TRUE)&&( DrvHDMIPortSelectBitsGet()==CONFIG_HDMI_MHL_PORT))
  255. {
  256. printk("ISR:Inactive_to_Active\n");
  257. }
  258. else
  259. #endif
  260. {
  261. #ifdef USE_HW_ADAPTIVE_EQ
  262. printk("ISR:Inactive_to_Active EQ:0x%x\n",HDMI_RegisterRead(HDMIRX_1050_DW_1050));
  263. #else
  264. printk("ISR:Inactive_to_Active\n");
  265. #endif
  266. }
  267. HDMI_RegisterWrite(HDMIRX_R_GBD_exist, 1); // reset, pass xvYCC to VIP
  268. HDMI_RegisterWrite(HDMIRX_R_INTR_Status, INTR_Inactive_to_Active); //clear
  269. HDMI_Interrupt_Disable(INTR_Inactive_to_Active);
  270. if( Active_Flag ==FALSE)
  271. {
  272. HDMI_RegisterWrite(HDMIRX_R_VIDEO_MUTE, 1);
  273. /* Notice audio driver that no video present */
  274. HDMI_NoticeAudioMode(NO_HDMI_AUDIO);
  275. /* Remove no signal timer */
  276. hdmi_signal_check_stop();
  277. /* Schedule active timer */
  278. active_timer_remove(); // reset active run to zero
  279. signal_monitor_timer_remove();
  280. active_timer_schedule(0); // start active run for stable signal
  281. HDMI_Interrupt_Enable(INTR_Active_to_Inactive);
  282. Active_Flag=TRUE;
  283. AVI_ISR_CNT = 0;
  284. }
  285. else
  286. {
  287. printk("Repeat ISR:Inactive_to_Active\n");
  288. }
  289. }
  290. else if (dIntrStatus & INTR_Active_to_Inactive)
  291. {
  292. #ifdef CONFIG_HDMI_SUPPORT_MHL
  293. if((MHL_CABLE_IN == TRUE)&&( DrvHDMIPortSelectBitsGet()==CONFIG_HDMI_MHL_PORT))
  294. HDMI_MHL_RxSense_Term_Debug(FALSE); //auto HDMI or MHL mode for MHL CTS 4.3.23.2
  295. else
  296. HDMI_MHL_RxSense_Term_Debug(TRUE); //force HDMI mode for debug(not MHL mode)
  297. #endif
  298. HDMI_RegisterWrite(HDMIRX_R_VIDEO_MUTE, 1);
  299. HDMI_DelayMs(1);
  300. HDMI_NoticeHandler(HDMINOTICE_INACTIVE, "hdmi_isr"); //mute video for port C hpd always high issue
  301. printk("ISR:Active_to_Inactive\n");
  302. HDMI_RegisterWrite(HDMIRX_R_sw_hdcp_rstn, 0);
  303. HDMI_RegisterWrite(HDMIRX_R_sw_hdcp_rstn, 1);
  304. HDMI_RegisterWrite(HDMIRX_icrst_n, 1);
  305. HDMI_RegisterWrite(HDMIRX_external_gated_TMDSCLK, 0);
  306. HDMI_RegisterWrite(HDMIRX_CTL_R_MORECTRLI_15_0_, 0x0020);
  307. HDMI_RegisterWrite(HDMIRX_PHY_DIV_RESETJ, 0);
  308. HDMI_RegisterWrite(HDMIRX_R_rst_n, 1);
  309. HDMI_RegisterWrite(HDMIRX_R_DDC5V_reset, 0);
  310. HDMI_RegisterWrite(HDMIRX_LDO_PWD,0x0);//
  311. HDMI_RegisterWrite(HDMIRX_LDO_PWDE,0x0);
  312. HDMI_RegisterWrite(HDMIRX_PHY_DIV_RESETJ, 0);
  313. HDMI_RegisterWrite(HDMIRX_PLL_RSTN, 0);
  314. HDMI_RegisterWrite(HDMIRX_PLL_RESETJ, 0);
  315. //HDMI_RegisterWrite(CTRLI_47_32__DW_0284,0x0003);//Base on old address setting from 531
  316. HDMI_RegisterWrite(HDMIRX_PLL_EN_FDIV, 0x0);
  317. HDMI_RegisterWrite(HDMIRX_PLL_GB_5, 0x1);//For 533 PFD_PWDJ
  318. HDMI_RegisterWrite(HDMIRX_PLL_GB_4_0_, 0x0);
  319. HDMI_RegisterWrite(HDMIRX_PLL_ICTRL_3_0_, 0x0);
  320. HDMI_RegisterWrite(HDMIRX_PLL_RSTN, 0x0);
  321. HDMI_RegisterWrite(HDMIRX_PLL_PWDN_DEMOD, 0x0);
  322. HDMI_RegisterWrite(HDMIRX_LDO_PWDE, 0x0);
  323. HDMI_RegisterWrite(HDMIRX_LDO_PWD, 0x0);
  324. HDMI_RegisterWrite(HDMIRX_PDACJ_CK, 0);//For CTS Nosiglal issue
  325. HDMI_DelayMs(2);
  326. HDMI_RegisterWrite(HDMIRX_PDACJ_CK, 1);
  327. Active_Flag=FALSE;
  328. HDMI_Interrupt_Disable(INTR_Active_to_Inactive);
  329. HDMI_RegisterWrite(HDMIRX_R_INTR_Status, INTR_Active_to_Inactive); //clear
  330. HDMI_Interrupt_Enable(INTR_Inactive_to_Active);
  331. //HDMI_RegisterWrite(HDMIRX_R_BYTE_ALIGN_CNT2, 0);
  332. HDMI_RegisterWrite(HDMIRX_R_GBD_exist, 1); // reset, pass xvYCC to VIP
  333. #ifdef CONFIG_HDMI_HW_PATCH_FOR_HDCP_COLOR_SNOW
  334. if ((hdmi_flag_check(HAS_HDCP) == true) && (hdmi_flag_check(HAS_ACTIVE_DATA) == true))
  335. {
  336. printk("[H] HDCP SNOW PATCH\n");
  337. /* Disable hdmi hw and all interrupts */
  338. HDMI_RegisterWrite(HDMIRX_R_DDC5V_reset, 1);
  339. HDMI_RegisterWrite(HDMIRX_R_rst_n, 0); /* Disable hdmi logic */
  340. HDMI_Interrupt_Disable(INTR_ALL); /* Disable all interrupts */
  341. //HDMI_Interrupt_Enable(INTR_phy_IN_RANGE | INTR_phy_PLLLOCK); //These two interrupt shall not be disabled at 531
  342. HDMI_Interrupt_Enable(INTR_phy_IN_RANGE | INTR_PLLLOCK); //These two interrupt shall not be disabled at 531
  343. HDMI_RegisterWrite(HDMIRX_R_INTR_Status, INTR_ALL); /* Clear all interrupts if any */
  344. schedule_work(&wq_ToggleHPD);
  345. }
  346. hdmi_flag_clear(HAS_ACTIVE_DATA);
  347. #endif
  348. // Clear Soft Mute interrupt
  349. HDMI_RegisterWrite(HDMIRX_Soft_Clear_Mute, 1);
  350. HDMI_RegisterWrite(HDMIRX_Soft_Clear_Mute, 0);
  351. /* Clear all video related flags */
  352. hdmi_flag_reset();
  353. /* Notice audio driver that no video present */
  354. HDMI_NoticeAudioMode(NO_HDMI_AUDIO);
  355. /* Remove active timer if scheduled */
  356. active_timer_remove(); // reset active run to zero
  357. signal_monitor_timer_remove();
  358. /* Check signal status */
  359. hdmi_signal_check_start();
  360. HDMI_RegisterWrite(HDMIRX_R_DDC5V_reset, 1);
  361. HDMI_RegisterWrite(HDMIRX_R_rst_n, 0);
  362. HDMI_DelayMs(2);
  363. HDMI_RegisterWrite(HDMIRX_R_rst_n, 1);
  364. HDMI_RegisterWrite(HDMIRX_R_DDC5V_reset, 0);
  365. HDMI_DelayMs(2);
  366. HDMI_RegisterWrite(HDMIRX_RTT_CMCTL_0_reg_ctl, 0x0);
  367. HDMI_RegisterWrite(HDMIRX_RTT_CMCTL_1_reg_ctl, 0x0);
  368. HDMI_RegisterWrite(HDMIRX_RTT_CMCTL_2_reg_ctl, 0x0);
  369. HDMI_RegisterWrite(HDMIRX_RTT_CMCTL_3_reg_ctl, 0x0);
  370. if(Active_to_Inactive_ISR_CNT<5)
  371. {
  372. Active_to_Inactive_ISR_CNT++;
  373. }
  374. else
  375. {
  376. //Reset PLL
  377. printk("ISR:Reset PLL\n");
  378. HDMI_Reset_HDMI_PLL();
  379. HDMI_RegisterWrite(HDMIRX_R_DDC5V_reset, 1);
  380. HDMI_RegisterWrite(HDMIRX_R_rst_n, 0);
  381. HDMI_DelayMs(2);
  382. HDMI_RegisterWrite(HDMIRX_R_rst_n, 1);
  383. HDMI_RegisterWrite(HDMIRX_R_DDC5V_reset, 0);
  384. printk("Repeat ISR:Active_to_Inactive\n");
  385. Active_to_Inactive_ISR_CNT = 0;
  386. }
  387. HDMI_Interrupt_Disable(INTR_audio_sample_coming | INTR_HBR_audio_sample_coming);
  388. HDMI_NoticeHandler(HDMINOTICE_SPD_INFOFRAME_UPDATE, "hdmi_isr");
  389. }
  390. else if (dIntrStatus & INTR_phy_IN_RANGE)
  391. {
  392. if(TRUE == Active_Flag)
  393. {
  394. Active_Flag = FALSE;
  395. HDMI_Interrupt_Disable(INTR_Active_to_Inactive);
  396. HDMI_Interrupt_Enable(INTR_Inactive_to_Active);
  397. }
  398. #ifdef USE_HW_ADAPTIVE_EQ
  399. #ifdef CONFIG_HDMI_SUPPORT_MHL
  400. if((MHL_CABLE_IN == TRUE)&&( DrvHDMIPortSelectBitsGet() == CONFIG_HDMI_MHL_PORT))
  401. {
  402. HDMI_RegisterWrite(HDMIRX_icrst_n, 1);
  403. HDMI_RegisterWrite(HDMIRX_prstn, 1);
  404. HDMI_RegisterWrite(HDMIRX_RST_1XCLK, 1);
  405. HDMI_RegisterWrite(HDMIRX_EQ_VAL_FIX, 1);
  406. writel((readl(0xbe0e0c44)&(~INTR_Phy_Ovsp_int)), 0xbe0e0c44);
  407. }
  408. else
  409. #endif
  410. {
  411. HDMI_RegisterWrite(HDMIRX_icrst_n, 0);
  412. HDMI_RegisterWrite(HDMIRX_prstn, 0);
  413. //HDMI_RegisterWrite(HDMIRX_RST_1XCLK, 0);
  414. HDMI_RegisterWrite(HDMIRX_EQ_VAL_FIX, 0);
  415. HDMI_RegisterWrite(HDMIRX_PHY_DIV_RESETJ, 0);
  416. writel((readl(0xbe0e0c44)|INTR_Phy_Ovsp_int), 0xbe0e0c44);
  417. }
  418. #endif
  419. HDMI_RegisterWrite(HDMIRX_PLL_RSTN, 0);
  420. HDMI_RegisterWrite(HDMIRX_CTL_R_MORECTRLI_15_0_, 0x0020);
  421. HDMI_RegisterWrite(HDMIRX_R_SP5_PLL_CTP_PWDJ, 0x0);
  422. HDMI_RegisterWrite(HDMIRX_LDO_PWD,0x0);
  423. HDMI_RegisterWrite(HDMIRX_LDO_PWDE,0x0);
  424. HDMI_RegisterWrite(HDMIRX_PLL_RESETJ, 0);
  425. HDMI_DelayUs(10);
  426. HDMI_RegisterWrite(HDMIRX_RTT_CMCTL_0_reg_ctl, 0x0);
  427. HDMI_RegisterWrite(HDMIRX_RTT_CMCTL_1_reg_ctl, 0x0);
  428. HDMI_RegisterWrite(HDMIRX_RTT_CMCTL_2_reg_ctl, 0x0);
  429. HDMI_RegisterWrite(HDMIRX_RTT_CMCTL_3_reg_ctl, 0x1);
  430. /* Prevent In_Range continually happens cause system hang, and set a timeout for reset bResetInRangeIntrCnt */
  431. dCurHDMI_GetSysTime = HDMI_GetSysTime();
  432. if((dCurHDMI_GetSysTime - dLastHDMI_GetSysTime) > 2000)
  433. {
  434. dLastHDMI_GetSysTime = dCurHDMI_GetSysTime;
  435. bResetInRangeIntrCnt = 0;
  436. }
  437. bResetInRangeIntrCnt++;
  438. if(bResetInRangeIntrCnt >= HDMI_RESET_IN_RANGE_INTR_TH)
  439. {
  440. HDMI_Interrupt_Disable(INTR_phy_IN_RANGE);
  441. }
  442. printk("ISR:IN_RANGE %d\n", bResetInRangeIntrCnt);
  443. /* Remove active timer if scheduled */
  444. active_timer_remove(); // reset active run to zero
  445. signal_monitor_timer_remove();
  446. #ifdef HDMI_HPD_USE_1K_OHM
  447. if( DrvHDMIPortSelectBitsGet()==0x0)
  448. {
  449. sysset_HDMI_HPD_1K_OnOff(HDMI_PORT_A, FALSE);
  450. }
  451. else if( DrvHDMIPortSelectBitsGet()==0x1)
  452. {
  453. sysset_HDMI_HPD_1K_OnOff(HDMI_PORT_B, FALSE);
  454. }
  455. else if( DrvHDMIPortSelectBitsGet()==0x2)
  456. {
  457. sysset_HDMI_HPD_1K_OnOff(HDMI_PORT_C, FALSE);
  458. }
  459. #endif
  460. #ifdef CONFIG_HDMI_SUPPORT_MHL
  461. if((MHL_CABLE_IN == TRUE)&&( DrvHDMIPortSelectBitsGet() == CONFIG_HDMI_MHL_PORT))
  462. {
  463. printk("MHL Mode\n");
  464. //HDMI_RegisterWrite(CTRLI_47_32__DW_0284, 0x9068);//Base on old address setting from 531
  465. //HDMI_RegisterWrite(HDMIRX_R_RTT_INI_5_0_, 0x35);
  466. HDMI_RegisterWrite(HDMIRX_R_RTT_INI_5_0_, 0x2f);
  467. HDMI_RegisterWrite(HDMIRX_lowlmt, 0x0);
  468. HDMI_RegisterWrite(HDMIRX_taps_0, 0x0);
  469. HDMI_RegisterWrite(HDMIRX_CTL_R_MORECTRLI_15_0_, 0x0020);
  470. HDMI_RegisterWrite(HDMIRX_R_DDC5V_reset, 1);
  471. HDMI_RegisterWrite(HDMIRX_R_rst_n, 0);
  472. //HDMI_RegisterWrite(HDMIRX_icrst_n, 0);
  473. HDMI_RegisterWrite(HDMIRX_R_INTR_Status, INTR_phy_IN_RANGE); //clear
  474. HDMI_DelayMs(10);
  475. HDMI_RegisterWrite(HDMIRX_PLL_ICTRL_3_0_, 0x1);
  476. HDMI_RegisterWrite(HDMIRX_PLL_GB_5, 1);//For 533 PFD_PWDJ
  477. HDMI_RegisterWrite(HDMIRX_PLL_GB_4_0_, 0xf);// 3
  478. HDMI_DelayUs(10);
  479. HDMI_RegisterWrite(HDMIRX_PLL_RSTN, 1);
  480. HDMI_RegisterWrite(HDMIRX_CTL_R_MORECTRLI_15_0_, 0x0028);
  481. HDMI_DelayUs(1);
  482. HDMI_RegisterWrite(HDMIRX_R_SP5_PLL_CTP_PWDJ, 0x1);
  483. HDMI_RegisterWrite(HDMIRX_LDO_PWD,0x1);
  484. HDMI_RegisterWrite(HDMIRX_LDO_PWDE,0x1);
  485. HDMI_DelayUs(8);
  486. HDMI_RegisterWrite(HDMIRX_CTL_R_MORECTRLI_15_0_, 0x0020);
  487. HDMI_DelayUs(1);
  488. HDMI_RegisterWrite(HDMIRX_CTL_R_MORECTRLI_15_0_, 0x0028);
  489. HDMI_DelayUs(1);
  490. HDMI_RegisterWrite(HDMIRX_PLL_RESETJ, 1);
  491. HDMI_DelayUs(1);
  492. HDMI_MHL_SetPLL_ByFreq();
  493. //HDMI_DelayMs(2);
  494. //HDMI_RegisterWrite(HDMIRX_CTL_R_MORECTRLI_15_0_, 0x0028);
  495. #ifdef CONFIG_HDMI_MHL_PORT
  496. if(CONFIG_HDMI_MHL_PORT==0)
  497. {
  498. HDMI_RegisterWrite(HDMIRX_HDMIP0_Rx_Sense_external, 1);
  499. HDMI_RegisterWrite(HDMIRX_HDMIP0_Rx_Sense_mux, 1);
  500. }
  501. else if(CONFIG_HDMI_MHL_PORT==1)
  502. {
  503. HDMI_RegisterWrite(HDMIRX_HDMIP1_Rx_Sense_external, 1);
  504. HDMI_RegisterWrite(HDMIRX_HDMIP1_Rx_Sense_mux, 1);
  505. }
  506. #endif
  507. HDMI_DelayMs(1);
  508. HDMI_RegisterWrite(HDMIRX_LDO_PWD,0x1);
  509. HDMI_RegisterWrite(HDMIRX_LDO_PWDE,0x1);
  510. HDMI_DelayMs(1);
  511. HDMI_RegisterWrite(HDMIRX_PLL_RESETJ, 1);
  512. HDMI_DelayMs(1);
  513. HDMI_RegisterWrite(HDMIRX_PLL_RSTN, 1);
  514. }
  515. else
  516. {
  517. printk("HDMI Mode\n");
  518. HDMI_RegisterWrite(HDMIRX_R_RTT_INI_5_0_, 0x2d);
  519. HDMI_RegisterWrite(HDMIRX_lowlmt, 0x0);
  520. HDMI_RegisterWrite(HDMIRX_taps_0, 0x0);
  521. HDMI_RegisterWrite(HDMIRX_CTL_R_MORECTRLI_15_0_, 0x0020);
  522. HDMI_RegisterWrite(HDMIRX_R_DDC5V_reset, 1);
  523. HDMI_RegisterWrite(HDMIRX_R_rst_n, 0);
  524. HDMI_RegisterWrite(HDMIRX_icrst_n, 0);
  525. HDMI_RegisterWrite(HDMIRX_R_INTR_Status, INTR_phy_IN_RANGE); //clear
  526. HDMI_DelayMs(50);
  527. #if 0
  528. HDMI_RegisterWrite(CTRLI_631_600__DW_0430,0x77722077);
  529. HDMI_RegisterWrite(CTRLI_663_632__DW_0434,0x20777220);
  530. HDMI_RegisterWrite(CTRLI_695_664__DW_0438,0x00000072);
  531. #endif
  532. HDMI_RegisterWrite(HDMIRX_PLL_ICTRL_3_0_, 0x1);
  533. HDMI_RegisterWrite(HDMIRX_PLL_GB_5, 1);//For 533 PFD_PWDJ
  534. HDMI_RegisterWrite(HDMIRX_PLL_GB_4_0_, 0xf);// 3
  535. HDMI_DelayUs(10);
  536. HDMI_RegisterWrite(HDMIRX_PLL_RSTN, 1);
  537. HDMI_RegisterWrite(HDMIRX_CTL_R_MORECTRLI_15_0_, 0x0028);
  538. HDMI_DelayUs(1);
  539. HDMI_RegisterWrite(HDMIRX_R_SP5_PLL_CTP_PWDJ, 0x1);
  540. HDMI_RegisterWrite(HDMIRX_LDO_PWD,0x1);
  541. HDMI_RegisterWrite(HDMIRX_LDO_PWDE,0x1);
  542. HDMI_DelayUs(8);
  543. HDMI_RegisterWrite(HDMIRX_CTL_R_MORECTRLI_15_0_, 0x0020);
  544. HDMI_DelayUs(1);
  545. HDMI_RegisterWrite(HDMIRX_CTL_R_MORECTRLI_15_0_, 0x0028);
  546. HDMI_DelayUs(1);
  547. HDMI_RegisterWrite(HDMIRX_PLL_RESETJ, 1);
  548. HDMI_DelayUs(1);
  549. HDMI_SetPLL_ByFreq();
  550. }
  551. #else
  552. HDMI_RegisterWrite(HDMIRX_CTL_R_MORECTRLI_15_0_, 0x0020);
  553. HDMI_RegisterWrite(HDMIRX_R_DDC5V_reset, 1);
  554. HDMI_RegisterWrite(HDMIRX_R_rst_n, 0);
  555. HDMI_RegisterWrite(HDMIRX_icrst_n, 0);
  556. HDMI_RegisterWrite(HDMIRX_R_INTR_Status, INTR_phy_IN_RANGE); //clear
  557. HDMI_DelayMs(50);
  558. HDMI_RegisterWrite(HDMIRX_PLL_ICTRL_3_0_, 0x1);
  559. HDMI_RegisterWrite(HDMIRX_PLL_GB_5, 1);//For 533A2 PFD_PWDJ
  560. HDMI_RegisterWrite(HDMIRX_PLL_GB_4_0_, 0xf);// 3
  561. HDMI_DelayUs(10);
  562. HDMI_RegisterWrite(HDMIRX_PLL_RSTN, 1);
  563. HDMI_RegisterWrite(HDMIRX_CTL_R_MORECTRLI_15_0_, 0x0028);
  564. HDMI_DelayUs(1);
  565. HDMI_RegisterWrite(HDMIRX_R_SP5_PLL_CTP_PWDJ, 0x1);
  566. HDMI_RegisterWrite(HDMIRX_LDO_PWD,0x1);
  567. HDMI_RegisterWrite(HDMIRX_LDO_PWDE,0x1);
  568. HDMI_DelayUs(8);
  569. HDMI_RegisterWrite(HDMIRX_CTL_R_MORECTRLI_15_0_, 0x0020);
  570. HDMI_DelayUs(1);
  571. HDMI_RegisterWrite(HDMIRX_CTL_R_MORECTRLI_15_0_, 0x0028);
  572. HDMI_DelayUs(1);
  573. HDMI_RegisterWrite(HDMIRX_PLL_RESETJ, 1);
  574. HDMI_DelayUs(1);
  575. HDMI_SetPLL_ByFreq();
  576. #endif
  577. if(HDMI_RegisterRead(HDMIRX_ref_freq_cnt)<=5)
  578. {
  579. HDMI_RegisterWrite(HDMIRX_icrst_n, 1);
  580. HDMI_RegisterWrite(HDMIRX_external_gated_TMDSCLK, 1);
  581. HDMI_RegisterWrite(HDMIRX_CTL_R_MORECTRLI_15_0_, 0x40e8);
  582. HDMI_RegisterWrite(HDMIRX_PHY_DIV_RESETJ, 1);
  583. HDMI_RegisterWrite(HDMIRX_R_rst_n, 1);
  584. HDMI_RegisterWrite(HDMIRX_R_DDC5V_reset, 0);
  585. HDMI_RegisterWrite(HDMIRX_RST_1XCLK, 1);
  586. }
  587. if(bResetInRangeIntrCnt >= HDMI_RESET_IN_RANGE_INTR_TH)
  588. schedule_work(&wq_Enable_InRange);
  589. }
  590. else if (dIntrStatus & INTR_PLLLOCK)
  591. {
  592. printk("ISR:PLLLOCK\n");
  593. HDMI_RegisterWrite(HDMIRX_R_INTR_Status, INTR_PLLLOCK); //clear
  594. //Bryan@20131217 add toggle HDMIRX_PHY_DIV_RESETJ to fix sometime no signal issue
  595. HDMI_RegisterWrite(HDMIRX_PHY_DIV_RESETJ, 0);
  596. HDMI_RegisterWrite(HDMIRX_HDMIRX_CDRRSTJ_CTL, 0);
  597. HDMI_RegisterWrite(HDMIRX_icrst_n, 0);
  598. HDMI_DelayMs(10);
  599. /* Power On PHY */
  600. HDMI_RegisterWrite(HDMIRX_PHY_DIV_RESETJ, 1);
  601. //HDMI_DelayMs(10);
  602. HDMI_RegisterWrite(HDMIRX_HDMIRX_CDRRSTJ_CTL, 1);
  603. HDMI_RegisterWrite(HDMIRX_icrst_n, 1);
  604. #ifdef USE_HW_ADAPTIVE_EQ
  605. #ifdef CONFIG_HDMI_SUPPORT_MHL
  606. if((MHL_CABLE_IN != TRUE)||( DrvHDMIPortSelectBitsGet() != CONFIG_HDMI_MHL_PORT))
  607. #endif
  608. {
  609. HDMI_DelayUs(1);
  610. HDMI_RegisterWrite(HDMIRX_prstn, 1);
  611. //HDMI_DelayMs(300);
  612. //HDMI_RegisterWrite(HDMIRX_RST_1XCLK, 1);
  613. schedule_delayed_work(&wq_Enable_DCK, (300*HZ)/1000); //HZ = 1000; 1 jiffies = 1ms
  614. }
  615. #endif
  616. //HDMI_DelayMs(10);
  617. //HDMI_RegisterWrite(HDMIRX_bp_fix, 1);
  618. HDMI_DelayMs(2);
  619. HDMI_RegisterWrite(HDMIRX_R_rst_n, 1);
  620. HDMI_RegisterWrite(HDMIRX_R_DDC5V_reset, 0);
  621. hdmi_signal_check_stop();
  622. hdmi_signal_lock_check_start();
  623. Active_to_Inactive_ISR_CNT = 0;
  624. //bBP_LOCK = TRUE;
  625. bResetInRangeIntrCnt = 0;
  626. }
  627. else if (dIntrStatus & INTR_SPD_infoframe)
  628. {
  629. printk("ISR:INTR_SPD_infoframe\n");
  630. HDMI_RegisterWrite(HDMIRX_R_INTR_Status, INTR_SPD_infoframe); //clear
  631. HDMI_NoticeHandler(HDMINOTICE_SPD_INFOFRAME_UPDATE, "hdmi_isr");
  632. }
  633. #ifdef USE_HW_ADAPTIVE_EQ
  634. #ifdef CONFIG_HDMI_SUPPORT_MHL
  635. if((MHL_CABLE_IN != TRUE)||( DrvHDMIPortSelectBitsGet() != CONFIG_HDMI_MHL_PORT))
  636. #endif
  637. {
  638. if(bPhyOvspIntrStatus & INTR_Phy_Ovsp_int)
  639. {
  640. printk("INTR_Phy_Ovsp_int EQ:0x%x\n",HDMI_RegisterRead(HDMIRX_1050_DW_1050));
  641. (*((u32 *)0xbe0e0c40) )= (*((u32 *)0xbe0e0c40) )|INTR_Phy_Ovsp_int;//write 1 to Clear
  642. HDMI_DelayUs(1);
  643. HDMI_RegisterWrite(HDMIRX_RST_1XCLK, 1);
  644. }
  645. }
  646. #endif
  647. return IRQ_HANDLED;
  648. }
  649. static void hdmi_dispatch(struct pt_regs *regs)
  650. {
  651. do_IRQ(IRQ_HDMI);
  652. }
  653. static struct irqaction hdmi_irqaction =
  654. {
  655. .handler = (void *)&hdmi_isr,
  656. .flags = 0,
  657. .name = "hdmi",
  658. };
  659. #ifdef CONFIG_DEBUG_DRV_HDMI_WRITE_EN
  660. INT32 hdmi_write(struct file *file, const INT8 __user * buf, size_t size, loff_t * ppos)
  661. {
  662. size_t in_sz = 0x100;
  663. INT8 inbuf[0x100];
  664. in_sz = (size < in_sz) ? size :in_sz;
  665. memset(inbuf, 0, sizeof(inbuf));
  666. if (copy_from_user(inbuf, buf, in_sz) == 0)
  667. {
  668. hdmi_dbg_Handler(inbuf, in_sz);
  669. }
  670. return size;
  671. }
  672. #endif
  673. static struct file_operations hdmi_fops =
  674. {
  675. #ifdef CONFIG_DEBUG_DRV_HDMI_WRITE_EN
  676. .write = hdmi_write,
  677. #endif
  678. .owner = THIS_MODULE,
  679. };
  680. void DRV_HDMI_Disable(void)
  681. {
  682. hdmidbg("%s\n", __FUNCTION__);
  683. #ifdef CONFIG_CHANGE_HOT_PLUG_ACTION
  684. #ifndef CONFIG_SUPPORT_CEC_TV
  685. hdmi_apply_hpd(DRV_HDMI_PORT_ALL , DRV_HPD_LEVEL_LOW);
  686. #endif
  687. #endif
  688. /* Indicate flow control that no video is present now */
  689. HDMI_NoticeAudioMode(NO_HDMI_AUDIO);
  690. HDMI_Interrupt_Disable(INTR_ALL); /* Disable all interrupts */
  691. HDMI_RegisterWrite(HDMIRX_R_INTR_Status, INTR_ALL); /* Clear all interrupts if any */
  692. /* Remove timers */
  693. active_timer_remove();
  694. signal_monitor_timer_remove();
  695. hdmi_signal_check_stop();
  696. /* Clear all video related flags */
  697. hdmi_flag_reset();
  698. /* Disable hdmi logic, power off */
  699. HDMI_RegisterWrite(HDMIRX_R_VIDEO_MUTE, 0); /* Mute Video */
  700. HDMI_RegisterWrite(HDMIRX_R_DDC5V_reset, 1);
  701. HDMI_RegisterWrite(HDMIRX_R_rst_n, 0); /* Disable hdmi logic */
  702. /* Indicate hpd handler we leave hdmi source */
  703. hdmi_hpd_handler(HDMI_SRC_NULL);
  704. /*Set Termination Off for power saving*/
  705. // Must set_termination before turn off bandgap power
  706. #ifdef CONFIG_HDMI_SUPPORT_MHL
  707. #ifdef CONFIG_HDMI_MHL_PORT
  708. if(CONFIG_HDMI_MHL_PORT==0)
  709. {
  710. if(MHL_CABLE_IN == FALSE)//For XIAOMI charging function can not set termination off.
  711. {
  712. hdmi_set_termination(DRV_HDMI_PORT_A, DRV_HPD_LEVEL_LOW);
  713. }
  714. hdmi_set_termination(DRV_HDMI_PORT_B, DRV_HPD_LEVEL_LOW);
  715. hdmi_set_termination(DRV_HDMI_PORT_C, DRV_HPD_LEVEL_LOW);
  716. }
  717. else if(CONFIG_HDMI_MHL_PORT==1)
  718. {
  719. if(MHL_CABLE_IN == FALSE)
  720. {
  721. hdmi_set_termination(DRV_HDMI_PORT_B, DRV_HPD_LEVEL_LOW);
  722. }
  723. hdmi_set_termination(DRV_HDMI_PORT_A, DRV_HPD_LEVEL_LOW);
  724. hdmi_set_termination(DRV_HDMI_PORT_C, DRV_HPD_LEVEL_LOW);
  725. }
  726. #endif
  727. #else
  728. hdmi_set_termination(DRV_HDMI_PORT_A, DRV_HPD_LEVEL_LOW);
  729. hdmi_set_termination(DRV_HDMI_PORT_B, DRV_HPD_LEVEL_LOW);
  730. hdmi_set_termination(DRV_HDMI_PORT_C, DRV_HPD_LEVEL_LOW);
  731. #endif
  732. /* Disable HDMI PHY */
  733. HDMI_PHY_Enable(FALSE);
  734. /* Disable hdmi switch if any */
  735. hdmi_switch_disable();
  736. #ifdef CONFIG_HDMI_SUPPORT_MHL
  737. /* Pause MHL CBUS Work */
  738. //MHL_CBUS_Work_Enable(FALSE);
  739. HDMI_RegisterWrite(HDMIRX_R_hdmi_port_sel, 3);//Set HDMIRX_R_hdmi_port_sel to null port
  740. #endif
  741. }
  742. INT32 DRV_HDMI_Enable(INT32 src)
  743. {
  744. HDMI_PORT_T port = hdmi_hw_port(src);
  745. hdmidbg("%s src:%d port:%d\n", __FUNCTION__, src, port);
  746. if (port == HDMI_PORT_NULL)
  747. {
  748. hdmidbg("%s Incorrect hdmi port\n", __FUNCTION__);
  749. return 1;
  750. }
  751. //After plug in S+8203r HDMI Tester Source,Box IBT 1073 NG
  752. HDMI_RegisterWrite(HDMIRX_R_sw_hdcp_rstn, 0);
  753. HDMI_RegisterWrite(HDMIRX_R_sw_hdcp_rstn, 1);
  754. /* Indicate hpd handler that we select hdmi source */
  755. if(HDMI_Init==TRUE)
  756. hdmi_hpd_handler(src);
  757. #ifdef CONFIG_SUPPORT_CEC_TV
  758. /*Set Toggle HPD*/
  759. if(HDMI_Init==TRUE)
  760. {
  761. if(hdmi_get_hpd_at_cur_src())
  762. {
  763. #ifdef CONFIG_SUPPORT_DOLBY_AUDIO
  764. if (CurATMOS_MODE !=ATMOS_MODE)
  765. {
  766. hdmi_apply_hpd(DRV_HDMI_PORT_ALL , DRV_HPD_LEVEL_LOW);
  767. HDMI_Change_EDID_DD_Plus_Data(ATMOS_MODE);
  768. HDMI_DelayMs(HDMI_HPD_L2H_DELAY);
  769. hdmi_apply_hpd_by5V(DRV_HDMI_PORT_ALL);
  770. }
  771. else
  772. #endif
  773. {
  774. hdmi_apply_hpd_Toggle((1 << hdmi_get_cur_port()), DRV_HPD_LEVEL_LOW,TRUE);
  775. HDMI_DelayMs(HDMI_HPD_L2H_DELAY);
  776. hdmi_apply_hpd_Toggle((1 << hdmi_get_cur_port()), DRV_HPD_LEVEL_HIGH,FALSE);
  777. }
  778. }
  779. }
  780. #else
  781. #ifdef CONFIG_CHANGE_HOT_PLUG_ACTION
  782. if(HDMI_Init==TRUE)
  783. {
  784. hdmi_apply_hpd_by5V((1 << hdmi_get_cur_port()));
  785. hdmi_hpd_update();
  786. }
  787. #endif
  788. #endif
  789. #ifdef CONFIG_ENTER_PORT_HPD_HIGH
  790. if(HDMI_Init==TRUE)
  791. {
  792. if(hdmi_get_hpd_at_cur_src()==FALSE)
  793. {
  794. hdmi_apply_hpd((1 << hdmi_get_cur_port()), DRV_HPD_LEVEL_HIGH);
  795. }
  796. }
  797. #endif
  798. /* Disable hdmi hw and all interrupts */
  799. HDMI_RegisterWrite(HDMIRX_R_DDC5V_reset, 1);
  800. HDMI_RegisterWrite(HDMIRX_R_rst_n, 0); /* Disable hdmi logic */
  801. HDMI_Interrupt_Disable(INTR_ALL); /* Disable all interrupts */
  802. HDMI_RegisterWrite(HDMIRX_R_INTR_Status, INTR_ALL); /* Clear all interrupts if any */
  803. /* Clear all video related flags */
  804. hdmi_flag_reset();
  805. Active_Flag=FALSE;
  806. AVI_ISR_CNT = 0;
  807. /* Disable HDMI PHY */
  808. HDMI_PHY_Enable(FALSE);
  809. HDMI_DelayMs(10);
  810. /* Enable HDMI PHY */
  811. HDMI_PHY_Enable(TRUE);
  812. #ifdef HDMI_HPD_USE_1K_OHM
  813. if(MHL_CABLE_IN == FALSE)
  814. {
  815. sysset_HDMI_HPD_1K_OnOff(port, TRUE);
  816. }
  817. #else
  818. sysset_HDMI_HPD_1K_OnOff(port, FALSE);
  819. #endif
  820. #ifdef CONFIG_HDMI_SUPPORT_MHL
  821. #ifdef CONFIG_HDMI_MHL_PORT
  822. if( DrvHDMIPortSelectBitsGet()==CONFIG_HDMI_MHL_PORT)
  823. {
  824. if(CONFIG_HDMI_MHL_PORT==0)
  825. {
  826. if(MHL_CABLE_IN == TRUE)//For HTC Butterfly S need toggle HDMI termination.
  827. {
  828. hdmi_set_termination(DRV_HDMI_PORT_A, DRV_HPD_LEVEL_LOW);
  829. HDMI_DelayMs(150);
  830. }
  831. }
  832. else if(CONFIG_HDMI_MHL_PORT==1)
  833. {
  834. if(MHL_CABLE_IN == TRUE)
  835. {
  836. hdmi_set_termination(DRV_HDMI_PORT_B, DRV_HPD_LEVEL_LOW);
  837. HDMI_DelayMs(150);
  838. }
  839. }
  840. }
  841. #endif
  842. #endif
  843. /*Set Termination On*/
  844. #ifdef CONFIG_HDMI_ALL_PORT_TERMINATION_ON
  845. hdmi_set_termination(DRV_HDMI_PORT_A, DRV_HPD_LEVEL_HIGH);
  846. hdmi_set_termination(DRV_HDMI_PORT_B, DRV_HPD_LEVEL_HIGH);
  847. hdmi_set_termination(DRV_HDMI_PORT_C, DRV_HPD_LEVEL_HIGH);
  848. #else
  849. hdmi_set_termination((1 << hdmi_get_cur_port()), DRV_HPD_LEVEL_HIGH);
  850. #endif
  851. /* Set hdmi hw for each port */
  852. switch (port)
  853. {
  854. case HDMI_PORT_A:
  855. //hdmi_set_termination(DRV_HDMI_PORT_A, DRV_HPD_LEVEL_HIGH);
  856. HDMI_RegisterWrite(HDMIRX_R_HDMI_LinkS, 0);
  857. HDMI_RegisterWrite(HDMIRX_R_hdmi_port_sel, 0);
  858. //HDMI_RegisterWrite(HDMIRX_R_mhl_port_sel, 0);//Support MHL in Port:A
  859. HDMI_RegisterWrite(HDMIRX_PORT_EN_P2_0,0x1);
  860. //sysset_cbus_port_sel(HDMI_PORT_A);
  861. //HDMI_RegisterWrite(HDMIRX_VBG_VREF_SEL_3_0_,1);
  862. break;
  863. case HDMI_PORT_B:
  864. //hdmi_set_termination(DRV_HDMI_PORT_B, DRV_HPD_LEVEL_HIGH);
  865. HDMI_RegisterWrite(HDMIRX_R_HDMI_LinkS, 1);
  866. HDMI_RegisterWrite(HDMIRX_R_hdmi_port_sel, 1);
  867. HDMI_RegisterWrite(HDMIRX_PORT_EN_P2_0,0x2);
  868. break;
  869. case HDMI_PORT_C:
  870. //hdmi_set_termination(DRV_HDMI_PORT_C, DRV_HPD_LEVEL_HIGH);
  871. HDMI_RegisterWrite(HDMIRX_R_HDMI_LinkS, 2);
  872. HDMI_RegisterWrite(HDMIRX_R_hdmi_port_sel, 2);
  873. HDMI_RegisterWrite(HDMIRX_PORT_EN_P2_0,0x4);
  874. break;
  875. default:
  876. break;
  877. }
  878. #ifdef CONFIG_HDMI_SUPPORT_MHL
  879. #ifdef CONFIG_HDMI_MHL_PORT
  880. if( DrvHDMIPortSelectBitsGet()==CONFIG_HDMI_MHL_PORT)
  881. {
  882. #if 0
  883. //reset cbus
  884. HDMI_RegisterWrite(HDMIRX_CBUS_cfg_cbus_reset, 1);
  885. HDMI_RegisterWrite(HDMIRX_CBUS_r_reset_reg, 1);
  886. HDMI_RegisterWrite(HDMIRX_CBUS_cfg_debounce_reset, 1);
  887. HDMI_RegisterWrite(HDMIRX_CBUS_cfg_buf_reset, 1);
  888. //HDMI_DelayMs(100);
  889. HDMI_RegisterWrite(HDMIRX_CBUS_cfg_cbus_reset, 0);
  890. HDMI_RegisterWrite(HDMIRX_CBUS_r_reset_reg, 0);
  891. HDMI_RegisterWrite(HDMIRX_CBUS_cfg_debounce_reset, 0);
  892. HDMI_RegisterWrite(HDMIRX_CBUS_cfg_buf_reset, 0);
  893. #endif
  894. if(MHL_CABLE_IN == TRUE)
  895. {
  896. HDMI_RegisterWrite(HDMIRX_R_BYTE_ALIGN_CNT2, 0xF);//For MIK-706
  897. }
  898. }
  899. #endif
  900. #endif
  901. HDMI_RegisterWrite(HDMIRX_R_PHY_SEL, 0);
  902. /* Enable related interrupts */
  903. //HDMI_Interrupt_Enable(INTR_HDCP_Key_Request | INTR_AVI_infoframe | INTR_Inactive_to_Active | INTR_phy_IN_RANGE | INTR_phy_PLLLOCK);
  904. HDMI_Interrupt_Enable(INTR_HDCP_Key_Request | INTR_AVI_infoframe | INTR_SPD_infoframe | INTR_Inactive_to_Active | INTR_phy_IN_RANGE | INTR_PLLLOCK);
  905. HDMI_Interrupt_Disable(INTR_audio_sample_coming | INTR_HBR_audio_sample_coming);
  906. HDMI_RegisterWrite(HDMIRX_R_GBD_update_once, 1);
  907. #ifdef USE_HW_ADAPTIVE_EQ
  908. //0xbe0e0c46[7]Phy_Ovsp_int Enable 1: Enable
  909. *((u32 *)0xbe0e0c44) = (*((u32 *)0xbe0e0c44) |INTR_Phy_Ovsp_int) ;//write 1 to Enable
  910. #endif
  911. /* Clear interrupts of audio sample commings */
  912. HDMI_RegisterWrite(HDMIRX_AS_exist, 1); // Write 1 Clear
  913. HDMI_RegisterWrite(HDMIRX_HBRAS_exist, 1); // Write 1 Clear
  914. /* Enable hdmi logic, power on */
  915. HDMI_RegisterWrite(HDMIRX_R_rst_n, 1); /* Enable hdmi logic */
  916. HDMI_RegisterWrite(HDMIRX_R_DDC5V_reset, 0);
  917. HDMI_RegisterWrite(HDMIRX_R_sw_hdcp_rst_en, 1); /* set hdcp reset independent from HDMIRX_R_rst_n , do not reset by hdmi resst */
  918. /* Set software hdcp handshake */
  919. HDMI_RegisterWrite(HDMIRX_R_CLK_DIV, 0x4); /* Enable hdcp */
  920. HDMI_RegisterWrite(HDMIRX_R_HDCP_CTL, 0x9f04);
  921. HDMI_RegisterWrite(HDMIRX_R_HDCP_CTL, 0x9f0c);
  922. HDMI_RegisterWrite(HDMIRX_R_HDCP_CTL, 0x9f85);
  923. /* Check signal status */
  924. //HDMI_RegisterWrite(HDMIRX_R_BYTE_ALIGN_CNT2, 0);
  925. hdmi_signal_check_start();
  926. /* Select hdmi switch port if any */
  927. hdmi_switch_enable(hdmi_sw_port(src));
  928. *((u8 *)0xbe000214) = (*((u8 *)0xbe000214) &0x0F) | 0x80 ;
  929. /* Initial MHL CBUS Work */
  930. #ifdef CONFIG_HDMI_SUPPORT_MHL
  931. if(CONFIG_HDMI_MHL_PORT==0)
  932. {
  933. HDMI_RegisterWrite(HDMIRX_R_mhl_port_sel, 0);//Support MHL in Port:A
  934. sysset_cbus_port_sel(HDMI_PORT_A);
  935. }
  936. else if(CONFIG_HDMI_MHL_PORT==1)
  937. {
  938. HDMI_RegisterWrite(HDMIRX_R_mhl_port_sel, 1);//Support MHL in Port:B
  939. sysset_cbus_port_sel(HDMI_PORT_B);
  940. }
  941. else //Error Case: Not config MHL in correct port(0 or 1) , Set to 3(Null port) and let A and B keep in HDMI Mode
  942. {
  943. HDMI_RegisterWrite(HDMIRX_R_mhl_port_sel, 3);//Let A and B keep in HDMI Mode
  944. }
  945. if(MHL_CBUS_Init==FALSE)
  946. {
  947. MHL_CBUS_Initial();
  948. MHL_CBUS_Init=TRUE;
  949. }
  950. if( DrvHDMIPortSelectBitsGet()==CONFIG_HDMI_MHL_PORT)
  951. {
  952. if(CbusMidGetDevCapReadyBit()==FALSE)
  953. {
  954. /* Start MHL CBUS Work */
  955. if(TRUE == HDMI_Init)
  956. {
  957. MHL_CBUS_Work_Enable(TRUE);
  958. }
  959. }
  960. else
  961. {
  962. if((HDMI_RegisterRead(HDMIRX_cbus_mode_pathen_muted)&0x3) ==0x2)
  963. {//CLK_MODE=10 =>PP Mode
  964. hdmidbg("MHL PP Mode\n");
  965. HDMI_RegisterWrite(HDMIRX_TMDSCLK_PP_SEL, 1);
  966. //*((u8 *)0xbe0e001c) = 0xff;
  967. HDMI_RegisterWrite(HDMIRX_HDMIP0_Mode_Sel_external, 1);
  968. HDMI_RegisterWrite(HDMIRX_HDMIP0_Mode_Sel_mux, 1);
  969. HDMI_RegisterWrite(HDMIRX_HDMIP0_MHL_Mode_Sel_external, 1);
  970. HDMI_RegisterWrite(HDMIRX_HDMIP0_MHL_Mode_Sel_mux, 1);
  971. HDMI_RegisterWrite(HDMIRX_HDMIP0_Mode_Sel_PLL_external, 1);
  972. HDMI_RegisterWrite(HDMIRX_HDMIP0_Mode_Sel_PLL_mux, 1);
  973. HDMI_RegisterWrite(HDMIRX_HDMIP0_MHL_Mode_PLL_Sel_external, 1);
  974. HDMI_RegisterWrite(HDMIRX_HDMIP0_MHL_Mode_Sel_PLL_mux, 1);
  975. }
  976. else
  977. {//CLK_MODE=11 =>24 Bit Mode
  978. hdmidbg("MHL 24 Bit Mode\n");
  979. HDMI_RegisterWrite(HDMIRX_TMDSCLK_PP_SEL, 0);
  980. //*((u8 *)0xbe0e001c) = 0xbb;
  981. HDMI_RegisterWrite(HDMIRX_HDMIP0_Mode_Sel_external, 1);
  982. HDMI_RegisterWrite(HDMIRX_HDMIP0_Mode_Sel_mux, 1);
  983. HDMI_RegisterWrite(HDMIRX_HDMIP0_MHL_Mode_Sel_external, 0);
  984. HDMI_RegisterWrite(HDMIRX_HDMIP0_MHL_Mode_Sel_mux, 1);
  985. HDMI_RegisterWrite(HDMIRX_HDMIP0_Mode_Sel_PLL_external, 1);
  986. HDMI_RegisterWrite(HDMIRX_HDMIP0_Mode_Sel_PLL_mux, 1);
  987. HDMI_RegisterWrite(HDMIRX_HDMIP0_MHL_Mode_PLL_Sel_external, 0);
  988. HDMI_RegisterWrite(HDMIRX_HDMIP0_MHL_Mode_Sel_PLL_mux, 1);
  989. }
  990. }
  991. }
  992. #endif
  993. return 0;
  994. }
  995. #ifdef CONFIG_SUPPORT_DOLBY_AUDIO
  996. void HDMI_Set_EDID_ATMOS_Mode(BOOL eATMOS)
  997. {
  998. hdmidbg("%s\n", __FUNCTION__);
  999. hdmidbg("ATMOS_Mode %d\n",eATMOS);
  1000. ATMOS_MODE=eATMOS;
  1001. if (CurATMOS_MODE !=ATMOS_MODE)
  1002. {
  1003. //if(EDID_SUPPORT_DD_PLUS==TRUE)
  1004. {
  1005. HDMI_Change_EDID_DD_Plus_Data(ATMOS_MODE);
  1006. }
  1007. }
  1008. }
  1009. void HDMI_Change_EDID_DD_Plus_Data(BOOL Atmos_Mode)
  1010. {
  1011. u32 edid_data_addr,edid_data_size,i;
  1012. UINT32 *data_ptr1;
  1013. UINT8 *data_ptr = NULL;
  1014. UINT8 bEdidWriteBack=0;
  1015. if(Atmos_Mode !=CurATMOS_MODE)
  1016. {
  1017. edid_data_addr = lookup_flashtable_addr("EDID");
  1018. edid_data_size = lookup_flashtable_size("EDID");
  1019. data_ptr = kmalloc(edid_data_size, GFP_KERNEL);
  1020. //memcpy(data_ptr, edid_data_addr|0xb0000000, edid_data_size);
  1021. memcpy( (void *)data_ptr, (void* )(edid_data_addr|0xb0000000), edid_data_size);
  1022. //hdmidbg("data_ptr[0] : %x data_ptr[1] : %x data_ptr[2] : %x data_ptr[3] : %x data_ptr[4] : %x \n", data_ptr[128+0], data_ptr[128+1], data_ptr[128+2], data_ptr[128+3], data_ptr[128+4]);
  1023. if(Atmos_Mode==TRUE)
  1024. {
  1025. UINT8 bDataBlkType1 = (data_ptr[128+4]&0xe0)>>5;
  1026. UINT8 bLength1 = data_ptr[128+4]&0x1f;
  1027. UINT8 bDataBlkType2 = (data_ptr[128+4+bLength1+1]&0xe0)>>5;
  1028. UINT8 bLength2 = data_ptr[128+4+bLength1+1]&0x1f;
  1029. UINT8 bShortAudDataCount = 0, bShortAudDataShift = 0, bDD_Plus_Byte3_Index = 0;
  1030. if(bDataBlkType1==1)
  1031. {
  1032. bShortAudDataCount =bLength1/3 ;
  1033. for (i = 0; i < bShortAudDataCount; i++)
  1034. {
  1035. bShortAudDataShift = i*3;
  1036. if (( ((data_ptr[128+4+1+bShortAudDataShift])&0x78)>>3) ==10) //DD_Plus
  1037. {
  1038. bDD_Plus_Byte3_Index=(128+4+bShortAudDataShift+3);
  1039. break;
  1040. }
  1041. }
  1042. }
  1043. else if (bDataBlkType2==1)
  1044. {
  1045. bShortAudDataCount =bLength2/3 ;
  1046. for (i = 0; i < bShortAudDataCount; i++)
  1047. {
  1048. bShortAudDataShift = i*3;
  1049. if (( ((data_ptr[128+4+bLength1+1+bShortAudDataShift+1])&0x78)>>3) ==10) //DD_Plus
  1050. {
  1051. bDD_Plus_Byte3_Index=(128+4+bLength1+1+bShortAudDataShift+3);
  1052. break;
  1053. }
  1054. }
  1055. }
  1056. if (bDD_Plus_Byte3_Index !=0)
  1057. {
  1058. hdmidbg("bDD_Plus_Byte3 is %x \n", data_ptr[bDD_Plus_Byte3_Index]);
  1059. EDID_SUPPORT_DD_PLUS=TRUE;
  1060. bEdidWriteBack = TRUE;
  1061. if((data_ptr[bDD_Plus_Byte3_Index]&0x01)==0)
  1062. {
  1063. data_ptr[bDD_Plus_Byte3_Index]+=1;//EDIDA Set ATMOS Mode
  1064. data_ptr[255]-=1;//Update Check Sum Data
  1065. }
  1066. if((data_ptr[bDD_Plus_Byte3_Index+256]&0x01)==0)
  1067. {
  1068. data_ptr[bDD_Plus_Byte3_Index+256]+=1;//EDIDB Set ATMOS Mode
  1069. data_ptr[255+256]-=1;//Update Check Sum Data
  1070. }
  1071. if((data_ptr[bDD_Plus_Byte3_Index+256+256+128]&0x01)==0)
  1072. {
  1073. data_ptr[bDD_Plus_Byte3_Index+256+256+128]+=1;//EDIDC Set ATMOS Mode
  1074. data_ptr[255+256+128+256]-=1;//Update Check Sum Data
  1075. }
  1076. }
  1077. else
  1078. {
  1079. EDID_SUPPORT_DD_PLUS=FALSE;
  1080. bEdidWriteBack = FALSE;
  1081. hdmidbg("Don't find DD+ Audio Format Code in Short Audio Descriptor!!!\n");
  1082. }
  1083. }
  1084. else
  1085. {
  1086. hdmidbg("edid write back !!!\n");
  1087. bEdidWriteBack = TRUE;
  1088. }
  1089. }
  1090. if(bEdidWriteBack == TRUE)
  1091. {
  1092. hdmi_apply_hpd(DRV_HDMI_PORT_ALL , DRV_HPD_LEVEL_LOW);
  1093. data_ptr1 = (UINT32 *) data_ptr;
  1094. //Update SRAM EDID
  1095. /* Write HDMI A & B EDID 512 (0x280) byte */
  1096. for (i = 0; i < 0x80; i++) {
  1097. writel(0x100+i,0xbe060034);
  1098. writel(data_ptr1[i], 0xbe060038);
  1099. writeb(0x1, 0xbe06002c);
  1100. }
  1101. data_ptr1 +=0xA0;
  1102. /* Write HDMI C EDIDF 256 (0x100) byte */
  1103. for (i = 0; i < 0x40; i++) {
  1104. writel(0x100+i,0xbe060134);
  1105. writel(data_ptr1[i], 0xbe060138);
  1106. writeb(0x1, 0xbe06012c);
  1107. }
  1108. /* Enable EDID after initial done */
  1109. writel( 0x000603a1,0xbe060024); //HDMI A
  1110. writel( 0x000603a1,0xbe060030); //HDMI B
  1111. writel( 0x000603a1,0xbe060124); //HDMI C
  1112. HDMI_DelayMs(HDMI_HPD_L2H_DELAY);
  1113. hdmi_apply_hpd_by5V(DRV_HDMI_PORT_ALL);
  1114. }
  1115. if(Atmos_Mode !=CurATMOS_MODE)
  1116. {
  1117. CurATMOS_MODE = Atmos_Mode;
  1118. if(data_ptr != NULL)
  1119. kfree(data_ptr);
  1120. }
  1121. }
  1122. #endif
  1123. static struct cdev hdmirx_cdev;
  1124. static INT32 hdmirx_devno;
  1125. INT32 DRV_HDMI_Init(void)
  1126. {
  1127. hdmidbg("%s\n", __FUNCTION__);
  1128. hdmidbg("*** HDMI Mapping Information ***\n");
  1129. hdmidbg("\tProject:HDMISwitchMap 0x%02x HDMIPortMap 0x%08x\n", CONFIG_HDMI_SWITCH, CONFIG_HDMI_PORT_MAP);
  1130. /* Decrypt hdcp key */
  1131. DRV_HDMI_UpdateHDCPKey((UINT8*)SPI_HDCPKEY_FLASHADDR);
  1132. /* Init each blocks */
  1133. hdmi_mapping_init(); /* hdmi source and hw port mapping */
  1134. hdmi_hpd_init(); /* hot plug detect and related patch */
  1135. hdmi_processing_init(); /* signal processing block */
  1136. /* Init working queues */
  1137. INIT_WORK(&wq_chlock, (work_func_t) HDMI_Audio_ChannelLocked);
  1138. #ifdef CONFIG_HDMI_HW_PATCH_FOR_HDCP_COLOR_SNOW
  1139. INIT_WORK(&wq_ToggleHPD, (work_func_t) HDMI_Toggle_HPD);
  1140. #endif
  1141. INIT_WORK(&wq_Enable_InRange, (work_func_t) HDMI_Enable_InRange);
  1142. #ifdef USE_HW_ADAPTIVE_EQ
  1143. INIT_DELAYED_WORK(&wq_Enable_DCK, (work_func_t) HDMI_Enable_DCK);
  1144. #endif
  1145. /* Register interrupts handler */
  1146. set_vi_handler(IRQ_HDMI, (vi_handler_t) hdmi_dispatch);
  1147. setup_irq(IRQ_HDMI, &hdmi_irqaction);
  1148. /* Driver device node */
  1149. hdmirx_devno = MKDEV(HDMI_DEV_MAJOR, 0);
  1150. if (register_chrdev_region(hdmirx_devno, 0, HDMIRXDRV_DEVNAME))
  1151. {
  1152. return -EIO;
  1153. }
  1154. cdev_init(&hdmirx_cdev, &hdmi_fops);
  1155. hdmirx_cdev.owner = THIS_MODULE;
  1156. hdmirx_cdev.ops = &hdmi_fops;
  1157. if (cdev_add(&hdmirx_cdev, hdmirx_devno, 1))
  1158. {
  1159. return -EIO;
  1160. }
  1161. /* Set up related global system registers */
  1162. sysset_hdmi_stcInitValue(0x0); /* Initialize STC value */
  1163. sysset_hdmi_stcclk(); /* Enable HDMI STC clock */
  1164. sysset_hdmi_tmdsclk(true); /* Disable HDMI PD */
  1165. sysset_HDMI_HPD_1K_Init();
  1166. sysset_HDMI_EN_AVI_V3(true);
  1167. HDMI_RegisterWrite(HDMIRX_R_ref_length, 0x180);
  1168. HDMI_RegisterWrite(HDMIRX_R_DDC5V_reset, 0);
  1169. HDMI_RegisterWrite(HDMIRX_R_inactive_level, 0x19);
  1170. HDMI_RegisterWrite(HDMIRX_R_half_quarter_HT, 0);
  1171. HDMI_RegisterWrite(HDMIRX_R_phy_freq_det, 0x0);
  1172. HDMI_RegisterWrite(HDMIRX_R_inter_alignment_once, 0x0);
  1173. HDMI_RegisterWrite(HDMIRX_R_stable_time, 0x120000);//Can not set too long for MHL Samsung Note3
  1174. HDMI_RegisterWrite(HDMIRX_R_Clear_mute_timer, 1); // CLEAR_MUTE_TIMER;
  1175. HDMI_RegisterWrite(HDMIRX_R_clear_ACP_timer, 0xff); // CLEAR_ACP_TIMER;
  1176. HDMI_RegisterWrite(HDMIRX_R_system_clk_cnt, 0xff);
  1177. HDMI_RegisterWrite(HDMIRX_Soft_Clear_Mute, 0);
  1178. HDMI_RegisterWrite(HDMIRX_R_subpacket_identical_en, 1);
  1179. HDMI_RegisterWrite(HDMIRX_R_subpacket_identical_en2, 1);
  1180. HDMI_RegisterWrite(HDMIRX_R_REALIGN_EN, 3);
  1181. HDMI_RegisterWrite(HDMIRX_R_frame_cnt30, 1);
  1182. //HDMI_RegisterWrite(HDMIRX_R_AUTO_CSC, 0); //not available in 531
  1183. HDMI_RegisterWrite(HDMIRX_R_FIELD_POL, 0);
  1184. //HDMI_RegisterWrite(HDMIRX_R_out_sel, 1); //not available in 531
  1185. HDMI_RegisterWrite(HDMIRX_R_PR_EN, 1);
  1186. HDMI_RegisterWrite(HDMIRX_R_InterCA_TH, 0x2);
  1187. HDMI_RegisterWrite(HDMIRX_R_ALIGN_CNT, 0x4);
  1188. //HDMI_RegisterWrite(HDMIRX_R_ALIGN_CNT, 0xF);
  1189. HDMI_RegisterWrite(HDMIRX_R_freq_stable_th, 0x06);
  1190. HDMI_RegisterWrite(HDMIRX_R_freq_unstable_th, 0x06);
  1191. HDMI_RegisterWrite(HDMIRX_R_freq_stable_th, 0x08);
  1192. HDMI_RegisterWrite(HDMIRX_R_auto_phypd, 0); // Don't automatically disable phy when hdmi logic is disabled
  1193. HDMI_RegisterWrite(HDMIRX_R_REALIGN_TIMER1, 0x1e); // retry condition without symbol lock.
  1194. HDMI_RegisterWrite(HDMIRX_R_REALIGN_TIMER2, 0x06); // inactive condition with symbol lock.
  1195. HDMI_RegisterWrite(HDMIRX_R_HDMI_level, 0x14);
  1196. HDMI_RegisterWrite(HDMIRX_EQ_VAL_FIX, 0x1);
  1197. HDMI_RegisterWrite(CTRLI_631_600__DW_0430,0x77722077);
  1198. HDMI_RegisterWrite(CTRLI_663_632__DW_0434,0x20777220);
  1199. HDMI_RegisterWrite(CTRLI_695_664__DW_0438,0x00000072);
  1200. #ifdef USE_HW_ADAPTIVE_EQ
  1201. HDMI_Adaptive_EQ_Init();
  1202. #endif
  1203. /* [0] ht, [1] vt, [2] disp, [3] de, [4] interlace */
  1204. HDMI_RegisterWrite(HDMIRX_R_LEVEL, 8);
  1205. /* Settings for pixel color conversion */
  1206. HDMI_RegisterWrite(HDMIRX_R_DnSAMPLING_EN, 0);
  1207. /* Black screen color setting */
  1208. HDMI_RegisterWrite(HDMIRX_R_AVMUTE_blk_screen, 1);
  1209. HDMI_RegisterWrite(HDMIRX_R_auto_blk_msb, 1);
  1210. HDMI_RegisterWrite(HDMIRX_R_rst_n, 0); /* Disable hdmi logic */
  1211. //HDMI_RegisterWrite(HDMIRX_R_BYTE_ALIGN_CNT2, 4);
  1212. //HDMI_RegisterWrite(HDMIRX_R_BYTE_ALIGN_CNT2, 8);
  1213. HDMI_RegisterWrite(HDMIRX_R_BYTE_ALIGN_CNT2, 0xF);//For Silicon Image MHL Starter KIT-9244
  1214. //HDMI_RegisterWrite(HDMIRX_r_disable_unlock_mhl, 1);
  1215. HDMI_RegisterWrite(HDMIRX_R_BYTE_ALIGN_CNT1, 4);
  1216. HDMI_RegisterWrite(HDMIRX_R_strict_symlock_a, 1);
  1217. HDMI_RegisterWrite(HDMIRX_R_pre_align_chk_a, 1);
  1218. ////
  1219. HDMI_RegisterWrite(HDMIRX_PHY_DIV_RESETJ, 0);
  1220. HDMI_RegisterWrite(HDMIRX_HDMIRX_CDRRSTJ_CTL, 0);
  1221. HDMI_RegisterWrite(HDMIRX_icrst_n, 0);
  1222. ////
  1223. //*((u8 *)0xbe000214) = (*((u8 *)0xbe000214) &0x0F) | 0x80 ;
  1224. sysset_HDMI_Downscale(1);
  1225. /* Init external hdmi switch */
  1226. hdmi_switch_init();
  1227. #ifndef INIT_BY_KMF
  1228. DRV_HDMI_Power(1);
  1229. DRV_HDMI_Enable(0);
  1230. #else
  1231. DRV_HDMI_Power(0);
  1232. #endif
  1233. DRV_CEC_Init();
  1234. #ifdef CONFIG_HDMI_SUPPORT_MHL
  1235. #ifdef CONFIG_HDMI_MHL_PORT
  1236. if(CONFIG_HDMI_MHL_PORT==0)
  1237. {
  1238. HDMI_RegisterWrite(HDMIRX_R_mhl_port_sel, 0);//Support MHL in Port:A
  1239. sysset_cbus_port_sel(HDMI_PORT_A);
  1240. DRV_HDMI_Enable(0);
  1241. }
  1242. else if(CONFIG_HDMI_MHL_PORT==1)
  1243. {
  1244. HDMI_RegisterWrite(HDMIRX_R_mhl_port_sel, 1);//Support MHL in Port:B
  1245. sysset_cbus_port_sel(HDMI_PORT_B);
  1246. DRV_HDMI_Enable(1);
  1247. }
  1248. else //Error Case: Not config MHL in correct port(0 or 1) , Set to 3(Null port) and let A and B keep in HDMI Mode
  1249. {
  1250. HDMI_RegisterWrite(HDMIRX_R_mhl_port_sel, 3);//Let A and B keep in HDMI Mode
  1251. }
  1252. #endif
  1253. if(MHL_CBUS_Init==FALSE)
  1254. {
  1255. MHL_CBUS_Initial();
  1256. MHL_CBUS_Init=TRUE;
  1257. }
  1258. /* Start MHL CBUS Work */
  1259. MHL_CBUS_Work_Enable(TRUE);
  1260. DRV_HDMI_Disable();
  1261. #else
  1262. sysset_VbusEnable(0);
  1263. #endif
  1264. HDMI_Init=TRUE;
  1265. return 0;
  1266. }
  1267. void DRV_HDMI_Exit(void)
  1268. {
  1269. hdmidbg("%s\n", __FUNCTION__);
  1270. /* Disable hdmi */
  1271. DRV_HDMI_Disable();
  1272. /* Exit cec driver */
  1273. DRV_CEC_Exit();
  1274. /* Remove device node */
  1275. cdev_del(&hdmirx_cdev);
  1276. unregister_chrdev_region(hdmirx_devno, 0);
  1277. return;
  1278. }
  1279. UINT32 hdmi_clk_flag=0;
  1280. void DRV_HDMI_Power(BOOL bPwr)
  1281. {
  1282. hdmidbg("%s(%s)\n", __FUNCTION__, bPwr ? "on" :"off");
  1283. if (bPwr)
  1284. {
  1285. /* Enable HDMI Clock PD */
  1286. sysset_hdmi_tmdsclk(false);
  1287. if ( hdmi_clk_flag == 0 ) {
  1288. drv_gated_clk_ctrl(GATED_F24MCLK_HDMI, GATED_PASS_CLK);
  1289. drv_gated_clk_ctrl(GATED_MCLK_HDMI, GATED_PASS_CLK);
  1290. hdmi_clk_flag = 1;
  1291. }
  1292. }
  1293. else
  1294. {
  1295. /* Disable hdmi */
  1296. DRV_HDMI_Disable();
  1297. /* Disable HDMI Clock PD */
  1298. sysset_hdmi_tmdsclk(true);
  1299. #ifndef CONFIG_HDMI_SUPPORT_MHL //do not turn off HDMI power for MHL application
  1300. if ( hdmi_clk_flag == 1 ) {
  1301. drv_gated_clk_ctrl(GATED_F24MCLK_HDMI, GATED_STOP_CLK);
  1302. drv_gated_clk_ctrl(GATED_MCLK_HDMI, GATED_STOP_CLK);
  1303. hdmi_clk_flag = 0;
  1304. }
  1305. #endif
  1306. }
  1307. /* Power up/down hdmi switch */
  1308. hdmi_switch_power(bPwr);
  1309. }
  1310. void DRV_HDMI_IR_PowerOff(void)
  1311. {
  1312. /* Disable hdmi */
  1313. DRV_HDMI_Disable();
  1314. HDMI_Set_PLL_Mode(HDMI_PLL_MODE_OFF);
  1315. /* Disable HDMI Clock PD */
  1316. sysset_hdmi_tmdsclk(true);
  1317. #ifndef CONFIG_HDMI_SUPPORT_MHL
  1318. drv_gated_clk_ctrl(GATED_F24MCLK_HDMI, GATED_STOP_CLK);
  1319. drv_gated_clk_ctrl(GATED_MCLK_HDMI, GATED_STOP_CLK);
  1320. #endif
  1321. /* Power up/down hdmi switch */
  1322. hdmi_switch_power(FALSE);
  1323. }
  1324. #ifndef INIT_BY_KMF
  1325. module_init(DRV_HDMI_Init);
  1326. module_exit(DRV_HDMI_Exit);
  1327. #endif
  1328. MODULE_LICENSE("Dual BSD/GPL");