hdmi.c 71 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158
  1. #include "drv_hdmi_internal.h"
  2. #include "drv_types.h"
  3. #include "hdmi.h"
  4. #include "hdmi_hw.h"
  5. #include "hdmi_hdcp.h"
  6. #include "hdmi_notice.h"
  7. #include "hdmi_audio.h"
  8. #include "hdmi_video.h"
  9. #include "hdmi_mapping.h"
  10. #include "hdmi_hpd.h"
  11. #include "hdmi_processing.h"
  12. #include "hdmi_switch.h"
  13. #include "hdmi_time.h"
  14. #include "hdmi_dbg.h"
  15. #include "hdmi_cfg.h"
  16. #include "cec.h"
  17. #include "gpioi2c.h"
  18. #include "sysreg.h"
  19. #ifdef CONFIG_HDMI_SUPPORT_MHL
  20. #include "cbus_drv.h"
  21. #include "cbus_app.h"
  22. #include "mhl_application.h"
  23. static BOOL MHL_CBUS_Init=FALSE;
  24. #endif
  25. #include "drv_kmf_interface.h"
  26. #ifdef CONFIG_SUPPORT_MONITOR
  27. static UINT32 HDMI_POWER_OFF_STATUS=HDMI_POWER_OFF_OPTION_MAX;
  28. #endif
  29. BOOL MHL_CABLE_IN=FALSE;
  30. BOOL MHL_CTS=FALSE;
  31. BOOL SWITCH_FIX_EQ = FALSE;
  32. BOOL OpenScreen_Flag=FALSE;
  33. UINT8 IN_Range_Eq_Loop_Cnt = 0;
  34. #if (defined CONFIG_HDMI_HPD_BEHAVIOR_435654) || (defined CONFIG_SUPPORT_MONITOR)
  35. BOOL HDMI_ENTER_SOURCE_TOGGLE_HPD=FALSE;
  36. #endif
  37. static BOOL HDMI_Init=FALSE;
  38. static struct work_struct wq_chlock;
  39. #ifdef CONFIG_HDMI_HW_PATCH_FOR_HDCP_COLOR_SNOW
  40. static struct work_struct wq_ToggleHPD;
  41. #endif
  42. #ifdef USE_HW_ADAPTIVE_EQ
  43. //static struct delayed_work wq_Enable_DCK;
  44. #endif
  45. #define writel(data, address) (*(volatile unsigned long*)(address) = data)
  46. #define writeb(data, address) (*(volatile unsigned char*)(address) = data)
  47. #define readl(address) (*(volatile unsigned long*)(address))
  48. #define readb(address) (*(volatile unsigned char*)(address))
  49. #define HDMI_EN_OFK
  50. enum _OFK_STATE {
  51. OFK_STATE_INIT = 0,
  52. OFK_STATE_ADD_COEF,
  53. OFK_STATE_CHECK_SAMPLE_HIGH_CNT_OUT,
  54. OFK_STATE_SUB_COEF,
  55. OFK_STATE_CHECK_SAMPLE_LOW_CNT_OUT,
  56. OFK_STATE_FINISH,
  57. OFK_STATE_MAX
  58. };
  59. typedef enum _OFK_STATE OFK_STATE_T;
  60. OFK_STATE_T fskState;
  61. OFK_STATE_T nextOfkState;
  62. unsigned long v[4]={0};
  63. unsigned long OFK_SET_CH(unsigned long val);
  64. unsigned long OFK_SET_COEF(unsigned long val);
  65. unsigned char* OFK_PRINT_STATE(unsigned char val)
  66. {
  67. if(val == OFK_STATE_INIT) { return ("OFK_STATE_INIT");}
  68. if(val == OFK_STATE_ADD_COEF) { return ("OFK_STATE_ADD_COEF");}
  69. if(val == OFK_STATE_CHECK_SAMPLE_HIGH_CNT_OUT) { return ("OFK_STATE_CHECK_SAMPLE_HIGH_CNT_OUT");}
  70. if(val == OFK_STATE_SUB_COEF) { return ("OFK_STATE_SUB_COEF");}
  71. if(val == OFK_STATE_CHECK_SAMPLE_LOW_CNT_OUT) { return ("OFK_STATE_CHECK_SAMPLE_LOW_CNT_OUT");}
  72. if(val == OFK_STATE_FINISH) { return ("OFK_STATE_FINISH");}
  73. if(val == OFK_STATE_MAX) { return ("OFK_STATE_MAX");}
  74. return "unknow";
  75. }
  76. unsigned long OFK_INIT(unsigned long index)
  77. {
  78. //select port and set coef
  79. v[0]=0;
  80. v[1]=0;
  81. v[2]=0;
  82. v[3]=0;
  83. //HDMI_RegisterWrite(HDMIRX_OFK_EN, 0);
  84. HDMI_RegisterWrite(HDMIRX_ofk_r_start, 0);
  85. HDMI_RegisterWrite(HDMIRX_ofk_in_sel, index);
  86. //OFK_SET_CH(index);
  87. OFK_SET_COEF(0);
  88. return 0;
  89. }
  90. unsigned long OFK_DETECT_START(unsigned long x)
  91. {
  92. HDMI_RegisterWrite(HDMIRX_ofk_r_start, 0);
  93. HDMI_RegisterWrite(HDMIRX_ofk_r_start, 1);
  94. HDMI_DelayUs(1);
  95. return 0;
  96. }
  97. unsigned long OFK_GET_SAMPLE_HIGH_CNT_OUT(void)
  98. {
  99. unsigned long val=0;
  100. OFK_DETECT_START(0);
  101. val=HDMI_RegisterRead(HDMIRX_ofk_sample_high_cnt);
  102. hdmidbg("h cnt = 0x%02lx\n", val);
  103. return val;
  104. }
  105. unsigned long OFK_GET_SAMPLE_LOW_CNT_OUT(void)
  106. {
  107. unsigned long val=0;
  108. OFK_DETECT_START(0);
  109. val=HDMI_RegisterRead(HDMIRX_ofk_sample_low_cnt);
  110. hdmidbg("l cnt = 0x%02lx\n", val);
  111. return val;
  112. }
  113. unsigned long OFK_GET_COEF(void)
  114. {
  115. unsigned long val=0;
  116. unsigned long index = HDMI_RegisterRead(HDMIRX_ofk_in_sel);
  117. if(index == 0){ val=(HDMI_RegisterRead(HDMIRX_OFK_coef_D0_b4_b2)*4)+(HDMI_RegisterRead(HDMIRX_OFK_coef_D0_b1_b0)); }
  118. if(index == 1){ val=(HDMI_RegisterRead(HDMIRX_OFK_coef_D1_b4_b2)*4)+(HDMI_RegisterRead(HDMIRX_OFK_coef_D1_b1_b0)); }
  119. if(index == 2){ val=(HDMI_RegisterRead(HDMIRX_OFK_coef_D2_b4_b2)*4)+(HDMI_RegisterRead(HDMIRX_OFK_coef_D2_b1_b0)); }
  120. //hdmidbg("get D%ld = 0x%lx\n", index, val);
  121. return val;
  122. }
  123. unsigned long OFK_SET_COEF(unsigned long val)
  124. {
  125. unsigned long index = HDMI_RegisterRead(HDMIRX_ofk_in_sel);
  126. if(index == 0){ HDMI_RegisterWrite(HDMIRX_OFK_coef_D0_b4_b2, val/4);(HDMI_RegisterWrite(HDMIRX_OFK_coef_D0_b1_b0, val&0x3));}
  127. if(index == 1){ HDMI_RegisterWrite(HDMIRX_OFK_coef_D1_b4_b2, val/4);(HDMI_RegisterWrite(HDMIRX_OFK_coef_D1_b1_b0, val&0x3));}
  128. if(index == 2){ HDMI_RegisterWrite(HDMIRX_OFK_coef_D2_b4_b2, val/4);(HDMI_RegisterWrite(HDMIRX_OFK_coef_D2_b1_b0, val&0x3));}
  129. hdmidbg("set D%ld = 0x%02lx\n", index, val);
  130. return 0;
  131. }
  132. unsigned long OFK_ADD_COEF(void)
  133. {
  134. unsigned long val=OFK_GET_COEF();
  135. //unsigned long index=HDMI_RegisterRead(HDMIRX_ofk_in_sel);
  136. OFK_SET_COEF(val+1);
  137. //hdmidbg("set D%ld = 0x%lx\n", index, val+1);
  138. return 0;
  139. }
  140. unsigned long OFK_SUB_COEF(void)
  141. {
  142. unsigned long val=OFK_GET_COEF();
  143. //unsigned long index=HDMI_RegisterRead(HDMIRX_ofk_in_sel);
  144. OFK_SET_COEF(val-1);
  145. //hdmidbg("set D%ld = 0x%lx\n", index, val);
  146. return 0;
  147. }
  148. unsigned char OFK_RUN_FSM(unsigned long index)
  149. {
  150. unsigned int i=4;
  151. //HDMI_RegisterWrite(HDMIRX_OFK_EN, 1);
  152. fskState = OFK_STATE_INIT;
  153. do{
  154. switch ( fskState ) {
  155. case OFK_STATE_INIT:
  156. {
  157. if(OFK_GET_SAMPLE_HIGH_CNT_OUT() > 0x32)
  158. {
  159. nextOfkState = OFK_STATE_FINISH;
  160. }
  161. else
  162. {
  163. nextOfkState = OFK_STATE_ADD_COEF;
  164. }
  165. break;
  166. }
  167. case OFK_STATE_ADD_COEF:
  168. {
  169. OFK_ADD_COEF();
  170. if(OFK_GET_COEF() < 0x1f)
  171. {
  172. nextOfkState = OFK_STATE_CHECK_SAMPLE_HIGH_CNT_OUT;
  173. }
  174. else if(OFK_GET_COEF() == 0x1f)
  175. {
  176. nextOfkState = OFK_STATE_FINISH;
  177. }
  178. break;
  179. }
  180. case OFK_STATE_CHECK_SAMPLE_HIGH_CNT_OUT:
  181. {
  182. if(OFK_GET_SAMPLE_HIGH_CNT_OUT() > 0x32)
  183. {
  184. //add i value check?
  185. i=i-1;
  186. v[i]=OFK_GET_COEF();
  187. nextOfkState = OFK_STATE_SUB_COEF;
  188. }
  189. else
  190. {
  191. nextOfkState = OFK_STATE_ADD_COEF;
  192. }
  193. break;
  194. }
  195. case OFK_STATE_SUB_COEF:
  196. {
  197. OFK_SUB_COEF();
  198. if(OFK_GET_COEF() > 0)
  199. {
  200. nextOfkState = OFK_STATE_CHECK_SAMPLE_LOW_CNT_OUT;
  201. }
  202. else if(OFK_GET_COEF() == 0)
  203. {
  204. nextOfkState = OFK_STATE_FINISH;
  205. }
  206. break;
  207. }
  208. case OFK_STATE_CHECK_SAMPLE_LOW_CNT_OUT:
  209. {
  210. HDMI_DelayUs(1);
  211. if(OFK_GET_SAMPLE_LOW_CNT_OUT() > 0x32)
  212. {
  213. //add i value check?
  214. i=i-1;
  215. v[i]=OFK_GET_COEF();
  216. if(i==0)
  217. {
  218. OFK_SET_COEF((v[0]+v[1]+v[2]+v[3])/4);
  219. nextOfkState = OFK_STATE_FINISH;
  220. }
  221. else if(i>0)
  222. {
  223. nextOfkState = OFK_STATE_ADD_COEF;
  224. }
  225. }
  226. else
  227. {
  228. nextOfkState = OFK_STATE_SUB_COEF;
  229. }
  230. break;
  231. }
  232. case OFK_STATE_MAX:
  233. {
  234. break;
  235. }
  236. default:
  237. break;
  238. }
  239. if(fskState != nextOfkState)
  240. {
  241. hdmidbg("st = %x -> %x, (%s)\n", fskState, nextOfkState, OFK_PRINT_STATE(nextOfkState));
  242. }
  243. fskState = nextOfkState;
  244. }while(fskState != OFK_STATE_FINISH);
  245. //HDMI_RegisterWrite(HDMIRX_OFK_EN, 0);
  246. if(i==0)
  247. {
  248. hdmidbg("v[] =[0x0%lx, 0x0%lx, 0x0%lx, 0x0%lx]\n", v[3], v[2], v[1], v[0]);
  249. }
  250. return 0;
  251. }
  252. void HDMI_Toggle_HPD(void)
  253. {
  254. printk("HDMI_Toggle_HPD\n");
  255. /* All hpd goes low */
  256. /* Disable hdmi hw and all interrupts */
  257. HDMI_RegisterWrite(HDMIRX_PDACJ_CK, 0); //stop phy clock
  258. HDMI_RegisterWrite(HDMIRX_R_DDC5V_reset, 1);
  259. HDMI_RegisterWrite(HDMIRX_R_rst_n, 0); /* Disable hdmi logic */
  260. HDMI_Interrupt_Disable(INTR_ALL); /* Disable all interrupts */
  261. HDMI_RegisterWrite(HDMIRX_R_INTR_Status, INTR_ALL); /* Clear all interrupts if any */
  262. #ifdef HDMI_DDC5V_WORKAROUND
  263. if(CEC_Get_SW5V(hdmi_get_cur_port()) == DRV_5V_LEVEL_HIGH) //do not change HPD status after cable out
  264. #endif
  265. hdmi_apply_hpd((1 << hdmi_get_cur_port()), DRV_HPD_LEVEL_LOW);
  266. /* Wait 100ms for hot plug pulse width */
  267. HDMI_DelayMs(100);
  268. /* Enable related interrupts */
  269. //HDMI_Interrupt_Enable(INTR_HDCP_Key_Request | INTR_AVI_infoframe | INTR_Inactive_to_Active | INTR_phy_IN_RANGE | INTR_phy_PLLLOCK);
  270. HDMI_Interrupt_Enable(INTR_HDCP_Key_Request | INTR_AVI_infoframe | INTR_SPD_infoframe | INTR_Inactive_to_Active | INTR_phy_IN_RANGE | INTR_PLLLOCK | INTR_Clear_AV_Mute);
  271. //HDMI_RegisterWrite(HDMIRX_R_INTR_en, INTR_GamutBoundaryData); //enable INTR_GamutBoundaryData
  272. //HDMI_RegisterWrite(HDMIRX_R_INTR_en, INTR_VSI_packets); //enable INTR_VSI_packets
  273. /* Clear interrupts of audio sample commings */
  274. HDMI_RegisterWrite(HDMIRX_AS_exist, 1); // Write 1 Clear
  275. HDMI_RegisterWrite(HDMIRX_HBRAS_exist, 1); // Write 1 Clear
  276. /* Enable hdmi logic, power on */
  277. HDMI_RegisterWrite(HDMIRX_R_rst_n, 1); /* Enable hdmi logic */
  278. HDMI_RegisterWrite(HDMIRX_R_DDC5V_reset, 0);
  279. HDMI_RegisterWrite(HDMIRX_PDACJ_CK, 1); //start phy clock for In_Range interrupt
  280. /* Set software hdcp handshake */
  281. HDMI_RegisterWrite(HDMIRX_R_CLK_DIV, 0x4); /* Enable hdcp */
  282. HDMI_RegisterWrite(HDMIRX_R_HDCP_CTL, 0x9f04);
  283. HDMI_RegisterWrite(HDMIRX_R_HDCP_CTL, 0x9f0c);
  284. HDMI_RegisterWrite(HDMIRX_R_HDCP_CTL, 0x9f84); //Disable Hdcp_en
  285. /* Apply HPD according to DDC status */
  286. #ifdef HDMI_DDC5V_WORKAROUND
  287. 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
  288. #endif
  289. hdmi_apply_hpd((1 << hdmi_get_cur_port()), DRV_HPD_LEVEL_HIGH);
  290. hdmi_flag_set(WAIT_HDCP);
  291. }
  292. //static struct work_struct wq_Enable_InRange;
  293. static struct delayed_work wq_Enable_InRange;
  294. void HDMI_Enable_InRange(void)
  295. {
  296. printk("HDMI_Enable_InRange\n");
  297. HDMI_Interrupt_Enable(INTR_phy_IN_RANGE);
  298. HDMI_RegisterWrite(HDMIRX_CTL_R_DETECT_START, 1);
  299. }
  300. #ifdef USE_HW_ADAPTIVE_EQ
  301. void HDMI_Enable_DCK(void)
  302. {
  303. hdmidbg("HDMI_Enable_DCK\n");
  304. sysset_hdmi_tmdsclk(false);
  305. HDMI_RegisterWrite(HDMIRX_RST_1XCLK, 1);
  306. }
  307. #endif
  308. void DRV_HDMI_SW_HDCP_RSTN(void)
  309. {
  310. hdmidbg("DRV_HDMI_SW_HDCP_RSTN\n");
  311. HDMI_RegisterWrite(HDMIRX_R_sw_hdcp_rstn, 0);
  312. HDMI_RegisterWrite(HDMIRX_R_sw_hdcp_rstn, 1);
  313. }
  314. void hdmi_dbg_Handler(INT8 *buf, size_t size);
  315. /* Defined in hdmi_hdcp.c */
  316. UINT32 hdmi_get_hdcp_data(INT32 offset);
  317. static BOOL Active_Flag=FALSE;
  318. static UINT8 AVI_ISR_CNT=0;
  319. static UINT8 Active_to_Inactive_ISR_CNT=0;
  320. #ifdef CONFIG_SUPPORT_DOLBY_AUDIO
  321. static BOOL ATMOS_MODE=FALSE;
  322. static BOOL CurATMOS_MODE=FALSE;
  323. static BOOL EDID_SUPPORT_DD_PLUS=TRUE;
  324. #endif
  325. static irqreturn_t hdmi_isr(INT32 irq, void* dev_id, struct pt_regs *regs)
  326. {
  327. UINT32 dIntrStatus;
  328. #ifdef USE_HW_ADAPTIVE_EQ
  329. UINT32 bPhyOvspIntrStatus,i;
  330. UINT8 Pre_Eq_Val_Cnt,Cur_Eq_Val_Cnt,Cur_Ref_Clk,Eq_Val_Cnt_0,Eq_Val_No_Change_Cnt;
  331. #endif
  332. static UINT8 bResetInRangeIntrCnt = 0;
  333. static UINT32 dLastHDMI_GetSysTime = 0;
  334. UINT32 dCurHDMI_GetSysTime = 0;
  335. dIntrStatus = HDMI_RegisterRead(HDMIRX_R_INTR_Status);
  336. #ifdef USE_HW_ADAPTIVE_EQ
  337. bPhyOvspIntrStatus = (*((u32 *)0xbe0e0c40) &INTR_Phy_Ovsp_int) ;
  338. #endif
  339. if(dIntrStatus & INTR_HDCP_Key_Request)
  340. {
  341. UINT32 start_count = read_c0_count();
  342. UINT32 diff_count = 0;
  343. UINT32 wait_count = __TIMER_FREQ / 10;
  344. hdmidbg("ISR:HDCP_Key_Request\n");
  345. do
  346. {
  347. INT32 keyoffset = HDMI_RegisterRead(HDMIRX_mmio_raddr);
  348. HDMI_RegisterWrite(HDMIRX_R_INTR_Status, INTR_HDCP_Key_Request); //clear
  349. HDMI_RegisterWrite(HDMIRX_mmio_rdata, hdmi_get_hdcp_data(keyoffset));
  350. if(0 == HDMI_RegisterRead(HDMIRX_PHYPLLLOCK))
  351. hdmi_flag_set(HAS_HDCP_REQUEST_EARLY_THEN_PLL_LOCK);
  352. else
  353. hdmi_flag_clear(HAS_HDCP_REQUEST_EARLY_THEN_PLL_LOCK);
  354. if (keyoffset == 0x01)
  355. {
  356. hdmidbg("HDCP KSV\n");
  357. break;
  358. }
  359. else if (keyoffset == 0x47)
  360. {
  361. hdmi_flag_set(HAS_HDCP);
  362. hdmidbg("HDCP KEY\n");
  363. hdmi_flag_clear(WAIT_HDCP);
  364. break;
  365. }
  366. dIntrStatus = HDMI_RegisterRead(HDMIRX_R_INTR_Status);
  367. while ((!(dIntrStatus & INTR_HDCP_Key_Request)) && (diff_count < wait_count))
  368. {
  369. diff_count = read_c0_count();
  370. diff_count -= start_count;
  371. dIntrStatus = HDMI_RegisterRead(HDMIRX_R_INTR_Status);
  372. }
  373. }
  374. while (diff_count < wait_count);
  375. return IRQ_HANDLED;
  376. }
  377. dIntrStatus = HDMI_RegisterRead(HDMIRX_R_INTR_Status);
  378. if(dIntrStatus & INTR_AV_Mute)
  379. {
  380. hdmidbg("ISR:INTR_AV_Mute!!\n");
  381. if(TRUE == OpenScreen_Flag)
  382. {
  383. //VIP_MuteScreen_ISR();
  384. VIP_MuteScreenDirectly();
  385. }
  386. HDMI_RegisterWrite(HDMIRX_R_INTR_Status, INTR_AV_Mute); //clear
  387. HDMI_Interrupt_Disable(INTR_AV_Mute);
  388. HDMI_Interrupt_Enable(INTR_Clear_AV_Mute);
  389. }
  390. else if(dIntrStatus & INTR_Clear_AV_Mute)
  391. {
  392. hdmidbg("ISR:INTR_Clear_AV_Mute!!\n");
  393. if(TRUE == OpenScreen_Flag)
  394. {
  395. VIP_UnmuteScreen();
  396. }
  397. HDMI_RegisterWrite(HDMIRX_R_INTR_Status, INTR_Clear_AV_Mute); //clear
  398. HDMI_Interrupt_Disable(INTR_Clear_AV_Mute);
  399. HDMI_Interrupt_Enable(INTR_AV_Mute);
  400. }
  401. else if(dIntrStatus & INTR_Buffer_Change_Pulse)
  402. {
  403. //hdmidbg("ISR:Buffer_Change_Pulse\n");
  404. if (hdmi_flag_check(HAS_ACTIVE_DATA))
  405. {
  406. HDMI_Audio_BufferUpdated();
  407. }
  408. else
  409. {
  410. HDMI_RegisterWrite(HDMIRX_R_INTR_Status, INTR_Buffer_Change_Pulse); //clear
  411. }
  412. }
  413. else if (dIntrStatus & INTR_Channel_Status_Lock_Pulse)
  414. {
  415. hdmidbg("ISR:Channel_Status_Lock_Pulse\n");
  416. HDMI_RegisterWrite(HDMIRX_R_INTR_Status, INTR_Channel_Status_Lock_Pulse); //clear
  417. /* The ACP Interrupt is enabled after channel lock interrupt is serviced. */
  418. HDMI_Interrupt_Enable(INTR_ACP_packets);
  419. /* Only handle channel lock interrupts when video is avaliable */
  420. if (hdmi_flag_check(HAS_ACTIVE_DATA))
  421. {
  422. // schedule_work(&wq_chlock);
  423. // printk("Channel lock isr\n");
  424. HDMI_Audio_ChannelLocked();
  425. }
  426. else
  427. {
  428. hdmidbg("Channel lock isr is disabled\n");
  429. HDMI_RegisterWrite(HDMIRX_R_dma_w_enable, 0);
  430. HDMI_Interrupt_Disable(INTR_Buffer_Change_Pulse | INTR_Channel_Status_Lock_Pulse);
  431. HDMI_RegisterWrite(HDMIRX_R_audio_enable, 0);
  432. }
  433. }
  434. else if (dIntrStatus & INTR_audio_sample_coming)
  435. {
  436. hdmidbg("ISR:audio_sample_coming\n");
  437. HDMI_Interrupt_Disable(INTR_audio_sample_coming);
  438. HDMI_RegisterWrite(HDMIRX_R_INTR_Status, INTR_audio_sample_coming); //clear
  439. HDMI_Interrupt_Enable(INTR_HBR_audio_sample_coming);
  440. HDMI_RegisterWrite(HDMIRX_AS_exist, 1); //Write 1 Clear
  441. HDMI_RegisterWrite(HDMIRX_HBRAS_exist, 1); //Write 1 Clear
  442. /* Restart hdmi audio to receive high bitrate audio samples */
  443. DRV_HDMI_AudioRestart();
  444. }
  445. else if (dIntrStatus & INTR_HBR_audio_sample_coming)
  446. {
  447. hdmidbg("ISR:HBR_audio_sample_coming\n");
  448. HDMI_Interrupt_Disable(INTR_HBR_audio_sample_coming);
  449. HDMI_RegisterWrite(HDMIRX_R_INTR_Status, INTR_HBR_audio_sample_coming); //clear
  450. HDMI_Interrupt_Enable(INTR_audio_sample_coming);
  451. HDMI_RegisterWrite(HDMIRX_AS_exist, 1); //Write 1 Clear
  452. HDMI_RegisterWrite(HDMIRX_HBRAS_exist, 1); //Write 1 Clear
  453. /* Restart hdmi audio to receive normal bitrate audio samples */
  454. DRV_HDMI_AudioRestart();
  455. }
  456. else if (dIntrStatus & INTR_ACP_packets)
  457. {
  458. hdmidbg("ISR:ACP_packets\n");
  459. /* The ACP Interrupt is enabled after channel lock interrupt is serviced. */
  460. /* Clear the interrupt */
  461. HDMI_RegisterWrite(HDMIRX_R_INTR_Status, INTR_ACP_packets); //clear
  462. /* Service once and disable the interrupt */
  463. HDMI_Interrupt_Disable(INTR_ACP_packets);
  464. /* Notice flow control that the input audio type */
  465. //HDMI_NoticeAudioACP(HDMI_RegisterWrite(HDMIRX_R_ACP_Type);
  466. }
  467. else if (dIntrStatus & INTR_AVI_infoframe)
  468. {
  469. /* Related info will be used in active interrupt handler */
  470. hdmidbg("ISR:AVI_infoframe\n");
  471. HDMI_RegisterWrite(HDMIRX_R_INTR_Status, INTR_AVI_infoframe); //clear
  472. if(hdmi_flag_check(HAS_ACTIVE_DATA))
  473. {
  474. avi_change_schedule();
  475. }
  476. hdmi_flag_set(HAS_AVIINFO_PKT);
  477. if( Active_Flag ==FALSE)
  478. {
  479. if(AVI_ISR_CNT<3)
  480. {
  481. AVI_ISR_CNT++;
  482. }
  483. else
  484. {
  485. printk("Repeat ISR:AVI_infoframe\n");
  486. HDMI_Reset_HDMI_PLL();
  487. HDMI_RegisterWrite(HDMIRX_R_DDC5V_reset, 1);
  488. HDMI_RegisterWrite(HDMIRX_R_rst_n, 0);
  489. HDMI_DelayMs(2);
  490. HDMI_RegisterWrite(HDMIRX_R_rst_n, 1);
  491. HDMI_RegisterWrite(HDMIRX_R_DDC5V_reset, 0);
  492. AVI_ISR_CNT = 0;
  493. }
  494. }
  495. }
  496. else if (dIntrStatus & INTR_Inactive_to_Active)
  497. {
  498. HDMI_RegisterWrite(HDMIRX_R_force_blk_screen, 1);
  499. #ifdef CONFIG_HDMI_SUPPORT_MHL
  500. if((MHL_CABLE_IN == TRUE)&&( DrvHDMIPortSelectBitsGet()==CONFIG_HDMI_MHL_PORT))
  501. {
  502. printk("ISR:Inactive_to_Active\n");
  503. }
  504. else
  505. #endif
  506. {
  507. #ifdef USE_HW_ADAPTIVE_EQ
  508. printk("ISR:Inactive_to_Active EQ:0x%x\n",HDMI_RegisterRead(HDMIRX_1050_DW_1050));
  509. #else
  510. printk("ISR:Inactive_to_Active\n");
  511. #endif
  512. }
  513. //hdmidbg("rd_cnt = %d\n", sysget_DDC_rd_block_cnt(hdmi_get_cur_port()));
  514. HDMI_RegisterWrite(HDMIRX_R_GBD_exist, 1); // reset, pass xvYCC to VIP
  515. HDMI_RegisterWrite(HDMIRX_R_INTR_Status, INTR_Inactive_to_Active); //clear
  516. HDMI_Interrupt_Disable(INTR_Inactive_to_Active);
  517. if( Active_Flag ==FALSE)
  518. {
  519. HDMI_RegisterWrite(HDMIRX_R_VIDEO_MUTE, 1);
  520. /* Notice audio driver that no video present */
  521. HDMI_NoticeAudioMode(NO_HDMI_AUDIO);
  522. /* Remove no signal timer */
  523. hdmi_signal_check_stop();
  524. /* Schedule active timer */
  525. active_timer_remove(); // reset active run to zero
  526. signal_monitor_timer_remove();
  527. active_timer_schedule(0); // start active run for stable signal
  528. HDMI_Interrupt_Enable(INTR_Active_to_Inactive);
  529. Active_Flag=TRUE;
  530. AVI_ISR_CNT = 0;
  531. IN_Range_Eq_Loop_Cnt = 0;
  532. }
  533. else
  534. {
  535. printk("Repeat ISR:Inactive_to_Active\n");
  536. }
  537. #ifdef CONFIG_HDMI_SUPPORT_MHL
  538. if((MHL_CABLE_IN == TRUE)&&( DrvHDMIPortSelectBitsGet()==CONFIG_HDMI_MHL_PORT))
  539. sysset_Set_CD_SENSE_VALUE(CD_SENSE_CFG_INTERNAL_HIGH);
  540. #endif
  541. HDMI_NoticeHandler(HDMINOTICE_SPD_INFOFRAME_UPDATE, "hdmi_isr");
  542. }
  543. else if (dIntrStatus & INTR_Active_to_Inactive)
  544. {
  545. VIP_MuteScreenDirectly();
  546. #ifdef CONFIG_HDMI_SUPPORT_MHL
  547. sysset_Set_CD_SENSE_VALUE(CD_SENSE_CFG_EXTERNAL);
  548. if((MHL_CABLE_IN == TRUE)&&( DrvHDMIPortSelectBitsGet()==CONFIG_HDMI_MHL_PORT))
  549. HDMI_MHL_RxSense_Term_Debug(FALSE); //auto HDMI or MHL mode for MHL CTS 4.3.23.2
  550. else
  551. HDMI_MHL_RxSense_Term_Debug(TRUE); //force HDMI mode for debug(not MHL mode)
  552. #endif
  553. SWITCH_FIX_EQ = FALSE;
  554. //HDMI_RegisterWrite(HDMIRX_R_VIDEO_MUTE, 1);
  555. HDMI_DelayMs(1);
  556. HDMI_NoticeHandler(HDMINOTICE_INACTIVE, "hdmi_isr"); //mute video for port C hpd always high issue
  557. printk("ISR:Active_to_Inactive\n");
  558. HDMI_RegisterWrite(HDMIRX_R_sw_hdcp_rstn, 0);
  559. HDMI_RegisterWrite(HDMIRX_R_sw_hdcp_rstn, 1);
  560. HDMI_RegisterWrite(HDMIRX_R_HDCP_CTL, ((HDMI_RegisterRead(HDMIRX_R_HDCP_CTL)) & 0xfffe));
  561. HDMI_RegisterWrite(HDMIRX_icrst_n, 1);
  562. HDMI_RegisterWrite(HDMIRX_external_gated_TMDSCLK, 0);
  563. HDMI_RegisterWrite(HDMIRX_CTL_R_MORECTRLI_15_0_, 0x00A8);
  564. HDMI_RegisterWrite(HDMIRX_PHY_DIV_RESETJ, 0);
  565. HDMI_RegisterWrite(HDMIRX_R_rst_n, 1);
  566. HDMI_RegisterWrite(HDMIRX_R_DDC5V_reset, 0);
  567. HDMI_RegisterWrite(HDMIRX_LDO_PWD,0x0);//
  568. HDMI_RegisterWrite(HDMIRX_LDO_PWDE,0x0);
  569. HDMI_RegisterWrite(HDMIRX_PHY_DIV_RESETJ, 0);
  570. HDMI_RegisterWrite(HDMIRX_PLL_RSTN, 0);
  571. HDMI_RegisterWrite(HDMIRX_PLL_RESETJ, 0);
  572. //HDMI_RegisterWrite(CTRLI_47_32__DW_0284,0x0003);//Base on old address setting from 531
  573. HDMI_RegisterWrite(HDMIRX_PLL_EN_FDIV, 0x0);
  574. HDMI_RegisterWrite(HDMIRX_PLL_GB_5_4, 0x0);
  575. HDMI_RegisterWrite(HDMIRX_PLL_GB_3_0_, 0x0);
  576. HDMI_RegisterWrite(HDMIRX_PLL_ICTRL_3_0_, 0x0);
  577. HDMI_RegisterWrite(HDMIRX_PLL_PWDN_DEMOD, 0);
  578. HDMI_RegisterWrite(HDMIRX_PLL_RSTN, 0x0);
  579. HDMI_RegisterWrite(HDMIRX_LDO_PWDE, 0x0);
  580. HDMI_RegisterWrite(HDMIRX_LDO_PWD, 0x0);
  581. HDMI_RegisterWrite(HDMIRX_PDACJ_CK, 0);//For CTS Nosiglal issue
  582. HDMI_DelayMs(2);
  583. HDMI_RegisterWrite(HDMIRX_PDACJ_CK, 1);
  584. Active_Flag = OpenScreen_Flag = FALSE;
  585. IN_Range_Eq_Loop_Cnt = 0;
  586. HDMI_Interrupt_Disable(INTR_Active_to_Inactive);
  587. HDMI_RegisterWrite(HDMIRX_R_INTR_Status, INTR_Active_to_Inactive); //clear
  588. HDMI_Interrupt_Enable(INTR_Inactive_to_Active);
  589. //HDMI_RegisterWrite(HDMIRX_R_BYTE_ALIGN_CNT2, 0);
  590. HDMI_RegisterWrite(HDMIRX_R_GBD_exist, 1); // reset, pass xvYCC to VIP
  591. #ifdef CONFIG_HDMI_HW_PATCH_FOR_HDCP_COLOR_SNOW
  592. if ((hdmi_flag_check(HAS_HDCP) == true) && (hdmi_flag_check(HAS_ACTIVE_DATA) == true))
  593. {
  594. printk("[H] HDCP SNOW PATCH\n");
  595. /* Disable hdmi hw and all interrupts */
  596. HDMI_RegisterWrite(HDMIRX_R_DDC5V_reset, 1);
  597. HDMI_RegisterWrite(HDMIRX_R_rst_n, 0); /* Disable hdmi logic */
  598. HDMI_Interrupt_Disable(INTR_ALL); /* Disable all interrupts */
  599. //HDMI_Interrupt_Enable(INTR_phy_IN_RANGE | INTR_phy_PLLLOCK); //These two interrupt shall not be disabled at 531
  600. HDMI_Interrupt_Enable(INTR_phy_IN_RANGE | INTR_PLLLOCK); //These two interrupt shall not be disabled at 531
  601. HDMI_RegisterWrite(HDMIRX_R_INTR_Status, INTR_ALL); /* Clear all interrupts if any */
  602. schedule_work(&wq_ToggleHPD);
  603. }
  604. hdmi_flag_clear(HAS_ACTIVE_DATA);
  605. #endif
  606. // Clear Soft Mute interrupt
  607. HDMI_RegisterWrite(HDMIRX_Soft_Clear_Mute, 1);
  608. HDMI_RegisterWrite(HDMIRX_Soft_Clear_Mute, 0);
  609. /* Clear all video related flags */
  610. hdmi_flag_reset();
  611. /* Notice audio driver that no video present */
  612. HDMI_NoticeAudioMode(NO_HDMI_AUDIO);
  613. /* Remove active timer if scheduled */
  614. active_timer_remove(); // reset active run to zero
  615. signal_monitor_timer_remove();
  616. /* Check signal status */
  617. hdmi_signal_check_start();
  618. HDMI_RegisterWrite(HDMIRX_R_DDC5V_reset, 1);
  619. HDMI_RegisterWrite(HDMIRX_R_rst_n, 0);
  620. HDMI_DelayMs(2);
  621. HDMI_RegisterWrite(HDMIRX_R_rst_n, 1);
  622. HDMI_RegisterWrite(HDMIRX_R_DDC5V_reset, 0);
  623. HDMI_DelayMs(2);
  624. HDMI_RegisterWrite(HDMIRX_RTT_CMCTL_0_reg_ctl, 0x0);
  625. HDMI_RegisterWrite(HDMIRX_RTT_CMCTL_1_reg_ctl, 0x0);
  626. HDMI_RegisterWrite(HDMIRX_RTT_CMCTL_2_reg_ctl, 0x0);
  627. HDMI_RegisterWrite(HDMIRX_RTT_CMCTL_3_reg_ctl, 0x0);
  628. if(Active_to_Inactive_ISR_CNT<5)
  629. {
  630. Active_to_Inactive_ISR_CNT++;
  631. }
  632. else
  633. {
  634. //Reset PLL
  635. printk("ISR:Reset PLL\n");
  636. HDMI_Reset_HDMI_PLL();
  637. HDMI_RegisterWrite(HDMIRX_R_DDC5V_reset, 1);
  638. HDMI_RegisterWrite(HDMIRX_R_rst_n, 0);
  639. HDMI_DelayMs(2);
  640. HDMI_RegisterWrite(HDMIRX_R_rst_n, 1);
  641. HDMI_RegisterWrite(HDMIRX_R_DDC5V_reset, 0);
  642. printk("Repeat ISR:Active_to_Inactive\n");
  643. Active_to_Inactive_ISR_CNT = 0;
  644. }
  645. HDMI_Interrupt_Disable(INTR_audio_sample_coming | INTR_HBR_audio_sample_coming);
  646. HDMI_NoticeHandler(HDMINOTICE_SPD_INFOFRAME_UPDATE, "hdmi_isr");
  647. HDMI_TurnOff_SW_5V_schedule_cancel(hdmi_get_cur_port());
  648. #ifdef CONFIG_HDMI_DELAY_START_5V_DETECTION
  649. #ifdef CONFIG_HDMI_GPIO_DETECT
  650. if(
  651. #ifdef CONFIG_HDMI_GPIO_DETECT_PORT_A
  652. (hdmi_get_cur_port() != HDMI_PORT_A) &&
  653. #endif
  654. #ifdef CONFIG_HDMI_GPIO_DETECT_PORT_B
  655. (hdmi_get_cur_port() != HDMI_PORT_B) &&
  656. #endif
  657. #ifdef CONFIG_HDMI_GPIO_DETECT_PORT_C
  658. (hdmi_get_cur_port() != HDMI_PORT_C) &&
  659. #endif
  660. (TRUE))
  661. #endif
  662. {
  663. sysset_HDMI_SW5V(hdmi_get_cur_port(), TRUE);
  664. if(hdmi_get_cur_port() == HDMI_PORT_A) sysset_DDC_PortA_Det5V_En(false);
  665. if(hdmi_get_cur_port() == HDMI_PORT_B) sysset_DDC_PortB_Det5V_En(false);
  666. if(hdmi_get_cur_port() == HDMI_PORT_C) sysset_DDC_PortC_Det5V_En(false);
  667. }
  668. #else
  669. #ifdef CONFIG_HDMI_SUPPORT_MHL
  670. if(!((MHL_CABLE_IN == TRUE)&&( DrvHDMIPortSelectBitsGet() == CONFIG_HDMI_MHL_PORT)))
  671. #endif
  672. {
  673. #ifdef CONFIG_HDMI_GPIO_DETECT
  674. if(
  675. #ifdef CONFIG_HDMI_GPIO_DETECT_PORT_A
  676. (hdmi_get_cur_port() != HDMI_PORT_A) &&
  677. #endif
  678. #ifdef CONFIG_HDMI_GPIO_DETECT_PORT_B
  679. (hdmi_get_cur_port() != HDMI_PORT_B) &&
  680. #endif
  681. #ifdef CONFIG_HDMI_GPIO_DETECT_PORT_C
  682. (hdmi_get_cur_port() != HDMI_PORT_C) &&
  683. #endif
  684. (TRUE))
  685. #endif
  686. {
  687. sysset_HDMI_SW5V(hdmi_get_cur_port(), FALSE);
  688. }
  689. }
  690. #endif
  691. }
  692. else if (dIntrStatus & INTR_phy_IN_RANGE)
  693. {
  694. UINT32 ref_freq_cnt = 0;
  695. if(TRUE == Active_Flag)
  696. {
  697. Active_Flag = FALSE;
  698. HDMI_Interrupt_Disable(INTR_Active_to_Inactive);
  699. HDMI_Interrupt_Enable(INTR_Inactive_to_Active);
  700. }
  701. #ifndef HDMI_USE_EXT_DIVSEL
  702. HDMI_RegisterWrite(HDMIRX_CTL_R_DETECT_START, 0); //Avoid ref cnt unstable to make div_sel doesn't update
  703. HDMI_DelayMs(1);
  704. HDMI_RegisterWrite(HDMIRX_CTL_R_DETECT_START, 1);
  705. #endif
  706. #ifdef CONFIG_HDMI_SUPPORT_MHL
  707. if((MHL_CABLE_IN == TRUE)&&( DrvHDMIPortSelectBitsGet() == CONFIG_HDMI_MHL_PORT))
  708. {
  709. if(CONFIG_HDMI_MHL_PORT==0)
  710. {
  711. HDMI_RegisterWrite(HDMIRX_P_2_0__CMCTL, 1);
  712. }
  713. else if(CONFIG_HDMI_MHL_PORT==1)
  714. {
  715. HDMI_RegisterWrite(HDMIRX_P_2_0__CMCTL, 2);
  716. }
  717. #ifdef USE_HW_ADAPTIVE_EQ
  718. //sysset_hdmi_tmdsclk(false);
  719. HDMI_RegisterWrite(HDMIRX_icrst_n, 1);
  720. HDMI_RegisterWrite(HDMIRX_prstn, 1);
  721. HDMI_RegisterWrite(HDMIRX_RST_1XCLK, 1);
  722. HDMI_RegisterWrite(HDMIRX_EQ_VAL_FIX, 1);
  723. writel((readl(0xbe0e0c44)&(~INTR_Phy_Ovsp_int)), 0xbe0e0c44);
  724. #endif
  725. }
  726. else
  727. {
  728. //sysset_hdmi_tmdsclk(true);
  729. HDMI_RegisterWrite(HDMIRX_P_2_0__CMCTL, 0);
  730. #ifdef USE_HW_ADAPTIVE_EQ
  731. HDMI_RegisterWrite(HDMIRX_icrst_n, 0);
  732. HDMI_RegisterWrite(HDMIRX_prstn, 0);
  733. HDMI_RegisterWrite(HDMIRX_RST_1XCLK, 1);
  734. HDMI_RegisterWrite(HDMIRX_EQ_VAL_FIX, 0);
  735. HDMI_RegisterWrite(HDMIRX_PHY_DIV_RESETJ, 0);
  736. writel((readl(0xbe0e0c44)|INTR_Phy_Ovsp_int), 0xbe0e0c44);
  737. #endif
  738. }
  739. #endif
  740. HDMI_RegisterWrite(HDMIRX_PLL_PWDN_DEMOD, 0x0);
  741. HDMI_RegisterWrite(HDMIRX_PLL_RSTN, 0);
  742. // HDMI_RegisterWrite(HDMIRX_CTL_R_MORECTRLI_15_0_, 0x00A8);
  743. HDMI_RegisterWrite(HDMIRX_R_SP5_PLL_CTP_PWDJ, 0x0);
  744. HDMI_RegisterWrite(HDMIRX_LDO_PWD,0x0);
  745. HDMI_RegisterWrite(HDMIRX_LDO_PWDE,0x0);
  746. HDMI_RegisterWrite(HDMIRX_PLL_RESETJ, 0);
  747. // HDMI_RegisterWrite(HDMIRX_R_sw_hdcp_rstn, 0);
  748. HDMI_DelayMs(1);
  749. HDMI_RegisterWrite(HDMIRX_RTT_CMCTL_0_reg_ctl, 0x0);
  750. HDMI_RegisterWrite(HDMIRX_RTT_CMCTL_1_reg_ctl, 0x0);
  751. HDMI_RegisterWrite(HDMIRX_RTT_CMCTL_2_reg_ctl, 0x0);
  752. HDMI_RegisterWrite(HDMIRX_RTT_CMCTL_3_reg_ctl, 0x1);
  753. /* Prevent In_Range continually happens cause system hang, and set a timeout for reset bResetInRangeIntrCnt */
  754. dCurHDMI_GetSysTime = HDMI_GetSysTime();
  755. if((dCurHDMI_GetSysTime - dLastHDMI_GetSysTime) > 2000)
  756. {
  757. dLastHDMI_GetSysTime = dCurHDMI_GetSysTime;
  758. bResetInRangeIntrCnt = 0;
  759. }
  760. bResetInRangeIntrCnt++;
  761. ref_freq_cnt= HDMI_RegisterRead(HDMIRX_ref_freq_cnt);
  762. printk("ISR:IN_RANGE %d\n", bResetInRangeIntrCnt);
  763. printk("HDMIRX_ref_freq_cnt: %d\n", HDMI_RegisterRead(HDMIRX_ref_freq_cnt));
  764. //hdmidbg("rd_cnt = %d\n", sysget_DDC_rd_block_cnt(hdmi_get_cur_port()));
  765. if(((HDMI_RESET_IN_RANGE_INTR_TH/2) <= bResetInRangeIntrCnt) && (bResetInRangeIntrCnt < ((HDMI_RESET_IN_RANGE_INTR_TH*3)/4)))
  766. {
  767. if(0 == HDMI_RegisterRead(HDMIRX_ref_freq_cnt))
  768. {
  769. HDMI_Interrupt_Disable(INTR_phy_IN_RANGE);
  770. HDMI_RegisterWrite(HDMIRX_R_INTR_Status, INTR_phy_IN_RANGE); //clear
  771. HDMI_RegisterWrite(HDMIRX_CTL_R_DETECT_START, 0);
  772. //active_timer_remove(); // reset active run to zero
  773. //signal_monitor_timer_remove();
  774. schedule_delayed_work(&wq_Enable_InRange,(50*HZ)/1000);
  775. return IRQ_HANDLED;
  776. }
  777. else
  778. HDMI_DelayMs(50);
  779. }
  780. else if((((HDMI_RESET_IN_RANGE_INTR_TH*3)/4) <= bResetInRangeIntrCnt) && (bResetInRangeIntrCnt < (HDMI_RESET_IN_RANGE_INTR_TH)))
  781. {
  782. if(0 == HDMI_RegisterRead(HDMIRX_ref_freq_cnt))
  783. {
  784. HDMI_Interrupt_Disable(INTR_phy_IN_RANGE);
  785. HDMI_RegisterWrite(HDMIRX_R_INTR_Status, INTR_phy_IN_RANGE); //clear
  786. HDMI_RegisterWrite(HDMIRX_CTL_R_DETECT_START, 0);
  787. //active_timer_remove(); // reset active run to zero
  788. //signal_monitor_timer_remove();
  789. schedule_delayed_work(&wq_Enable_InRange,(100*HZ)/1000);
  790. return IRQ_HANDLED;
  791. }
  792. else
  793. HDMI_DelayMs(100);
  794. }
  795. else if(HDMI_RESET_IN_RANGE_INTR_TH <= bResetInRangeIntrCnt)
  796. {
  797. if(0 == HDMI_RegisterRead(HDMIRX_ref_freq_cnt))
  798. {
  799. HDMI_Interrupt_Disable(INTR_phy_IN_RANGE);
  800. HDMI_RegisterWrite(HDMIRX_R_INTR_Status, INTR_phy_IN_RANGE); //clear
  801. HDMI_RegisterWrite(HDMIRX_CTL_R_DETECT_START, 0);
  802. schedule_delayed_work(&wq_Enable_InRange,(100*HZ)/1000);
  803. return IRQ_HANDLED;
  804. }
  805. }
  806. if(0 == HDMI_RegisterRead(HDMIRX_ref_freq_cnt) || (ref_freq_cnt != HDMI_RegisterRead(HDMIRX_ref_freq_cnt)))
  807. {
  808. HDMI_Interrupt_Disable(INTR_phy_IN_RANGE);
  809. HDMI_RegisterWrite(HDMIRX_R_INTR_Status, INTR_phy_IN_RANGE); //clear
  810. //if(bResetInRangeIntrCnt >= HDMI_RESET_IN_RANGE_INTR_TH)
  811. //{
  812. HDMI_RegisterWrite(HDMIRX_CTL_R_DETECT_START, 0);
  813. schedule_delayed_work(&wq_Enable_InRange,(0*HZ)/1000);
  814. //}
  815. return IRQ_HANDLED;
  816. }
  817. IN_Range_Eq_Loop_Cnt = 0;
  818. /* Remove active timer if scheduled */
  819. active_timer_remove(); // reset active run to zero
  820. signal_monitor_timer_remove();
  821. #ifdef HDMI_HPD_USE_1K_OHM
  822. if( DrvHDMIPortSelectBitsGet()==0x0)
  823. {
  824. #ifdef CONFIG_HDMI_PORT_A_HAVE_EXT_1K
  825. #else
  826. sysset_HDMI_HPD_1K_OnOff(HDMI_PORT_A, FALSE);
  827. #endif
  828. }
  829. else if( DrvHDMIPortSelectBitsGet()==0x1)
  830. {
  831. #ifdef CONFIG_HDMI_PORT_B_HAVE_EXT_1K
  832. #else
  833. sysset_HDMI_HPD_1K_OnOff(HDMI_PORT_B, FALSE);
  834. #endif
  835. }
  836. else if( DrvHDMIPortSelectBitsGet()==0x2)
  837. {
  838. #ifdef CONFIG_HDMI_PORT_C_HAVE_EXT_1K
  839. #else
  840. sysset_HDMI_HPD_1K_OnOff(HDMI_PORT_C, FALSE);
  841. #endif
  842. }
  843. #endif
  844. #ifdef CONFIG_HDMI_SUPPORT_MHL
  845. if((MHL_CABLE_IN == TRUE)&&( DrvHDMIPortSelectBitsGet() == CONFIG_HDMI_MHL_PORT))
  846. {
  847. printk("MHL Mode\n");
  848. //HDMI_RegisterWrite(HDMIRX_R_RTT_INI_5_0_, 0x35);
  849. HDMI_RegisterWrite(HDMIRX_R_RTT_INI_5_0_, 0x29);
  850. HDMI_RegisterWrite(HDMIRX_lowlmt, 0x0);
  851. HDMI_RegisterWrite(HDMIRX_taps_0, 0x0);
  852. HDMI_RegisterWrite(HDMIRX_CTL_R_MORECTRLI_15_0_, 0x0030);
  853. HDMI_RegisterWrite(HDMIRX_R_DDC5V_reset, 1);
  854. HDMI_RegisterWrite(HDMIRX_R_rst_n, 0);
  855. //HDMI_RegisterWrite(HDMIRX_icrst_n, 0);
  856. HDMI_RegisterWrite(HDMIRX_R_INTR_Status, INTR_phy_IN_RANGE); //clear
  857. //HDMI_DelayMs(10);
  858. HDMI_RegisterWrite(HDMIRX_PLL_ICTRL_3_0_, 0x5);
  859. HDMI_RegisterWrite(HDMIRX_PLL_GB_5_4, 0x2);
  860. HDMI_RegisterWrite(HDMIRX_PLL_GB_3_0_, 0x9);
  861. #ifdef CONFIG_HDMI_MHL_PORT
  862. if(CONFIG_HDMI_MHL_PORT==0)
  863. {
  864. HDMI_RegisterWrite(HDMIRX_HDMIP0_Rx_Sense_external, 1);
  865. HDMI_RegisterWrite(HDMIRX_HDMIP0_Rx_Sense_mux, 1);
  866. }
  867. else if(CONFIG_HDMI_MHL_PORT==1)
  868. {
  869. HDMI_RegisterWrite(HDMIRX_HDMIP1_Rx_Sense_external, 1);
  870. HDMI_RegisterWrite(HDMIRX_HDMIP1_Rx_Sense_mux, 1);
  871. }
  872. #endif
  873. HDMI_DelayMs(1);
  874. ////////////////// Set Pll Mode ///////////////////
  875. HDMI_MHL_SetPLL_ByFreq();
  876. ////////////////////////////////////////////////////
  877. HDMI_DelayMs(1);
  878. ////////////////// PLL DIV reset ///////////////////
  879. HDMI_RegisterWrite(HDMIRX_PLL_RESETJ, 1);
  880. ////////////////////////////////////////////////////
  881. HDMI_DelayMs(1);
  882. ////////////////// PFD reset ///////////////////
  883. HDMI_RegisterWrite(HDMIRX_PLL_RSTN, 1);
  884. HDMI_RegisterWrite(HDMIRX_PLL_PWDN_DEMOD, 0x1);
  885. ////////////////////////////////////////////////////
  886. HDMI_DelayMs(1);
  887. ////////////////// CTP Pwd ///////////////////
  888. HDMI_RegisterWrite(HDMIRX_R_SP5_PLL_CTP_PWDJ, 0x1);
  889. ////////////////////////////////////////////////////
  890. HDMI_DelayMs(1);
  891. ////////////////// LDO Pwd ///////////////////
  892. HDMI_RegisterWrite(HDMIRX_LDO_PWD,0x1);
  893. HDMI_RegisterWrite(HDMIRX_LDO_PWDE,0x1);
  894. ////////////////////////////////////////////////////
  895. HDMI_DelayMs(1);
  896. ////////////////// VCO Pwd ///////////////////
  897. HDMI_RegisterWrite(HDMIRX_CTL_R_MORECTRLI_15_0_, ((HDMI_RegisterRead(HDMIRX_CTL_R_MORECTRLI_15_0_)) | 0x0008));
  898. ////////////////////////////////////////////////////
  899. }
  900. else
  901. {
  902. printk("HDMI Mode\n");
  903. HDMI_RegisterWrite(HDMIRX_R_RTT_INI_5_0_, 0x29);
  904. HDMI_RegisterWrite(HDMIRX_lowlmt, 0x0);
  905. HDMI_RegisterWrite(HDMIRX_taps_0, 0x0);
  906. HDMI_RegisterWrite(HDMIRX_CTL_R_RSTJ, 0);
  907. HDMI_RegisterWrite(HDMIRX_R_DDC5V_reset, 1);
  908. HDMI_RegisterWrite(HDMIRX_R_rst_n, 0);
  909. HDMI_RegisterWrite(HDMIRX_icrst_n, 0);
  910. HDMI_RegisterWrite(HDMIRX_R_INTR_Status, INTR_phy_IN_RANGE); //clear
  911. HDMI_RegisterWrite(HDMIRX_PLL_ICTRL_3_0_, 0x5);
  912. HDMI_RegisterWrite(HDMIRX_PLL_GB_5_4, 0x2);
  913. HDMI_RegisterWrite(HDMIRX_PLL_GB_3_0_, 0x9);
  914. HDMI_DelayMs(1);
  915. ////////////////// Set Pll Mode ///////////////////
  916. HDMI_SetPLL_ByFreq();
  917. ////////////////////////////////////////////////////
  918. HDMI_DelayMs(1);
  919. ////////////////// PLL DIV reset ///////////////////
  920. HDMI_RegisterWrite(HDMIRX_PLL_RESETJ, 1);
  921. ////////////////////////////////////////////////////
  922. HDMI_DelayMs(1);
  923. ////////////////// PFD reset ///////////////////
  924. HDMI_RegisterWrite(HDMIRX_PLL_RSTN, 1);
  925. HDMI_RegisterWrite(HDMIRX_PLL_PWDN_DEMOD, 0x1);
  926. ////////////////////////////////////////////////////
  927. HDMI_DelayMs(1);
  928. ////////////////// CTP Pwd ///////////////////
  929. HDMI_RegisterWrite(HDMIRX_R_SP5_PLL_CTP_PWDJ, 0x1);
  930. ////////////////////////////////////////////////////
  931. HDMI_DelayMs(1);
  932. ////////////////// LDO Pwd ///////////////////
  933. HDMI_RegisterWrite(HDMIRX_LDO_PWD,0x1);
  934. HDMI_RegisterWrite(HDMIRX_LDO_PWDE,0x1);
  935. ////////////////////////////////////////////////////
  936. HDMI_DelayMs(1);
  937. ////////////////// VCO Pwd ///////////////////
  938. HDMI_RegisterWrite(HDMIRX_CTL_R_RSTJ, 1);
  939. ////////////////////////////////////////////////////
  940. }
  941. #else
  942. HDMI_RegisterWrite(HDMIRX_CTL_R_RSTJ, 0);
  943. HDMI_RegisterWrite(HDMIRX_R_DDC5V_reset, 1);
  944. HDMI_RegisterWrite(HDMIRX_R_rst_n, 0);
  945. HDMI_RegisterWrite(HDMIRX_icrst_n, 0);
  946. HDMI_RegisterWrite(HDMIRX_R_INTR_Status, INTR_phy_IN_RANGE); //clear
  947. HDMI_RegisterWrite(HDMIRX_PLL_ICTRL_3_0_, 0x5);
  948. HDMI_RegisterWrite(HDMIRX_PLL_GB_5_4, 0x2);
  949. HDMI_RegisterWrite(HDMIRX_PLL_GB_3_0_, 0x9);
  950. HDMI_DelayMs(1);
  951. ////////////////// Set Pll Mode ///////////////////
  952. HDMI_SetPLL_ByFreq();
  953. ////////////////////////////////////////////////////
  954. HDMI_DelayMs(1);
  955. ////////////////// PLL DIV reset ///////////////////
  956. HDMI_RegisterWrite(HDMIRX_PLL_RESETJ, 1);
  957. ////////////////////////////////////////////////////
  958. HDMI_DelayMs(1);
  959. ////////////////// PFD reset ///////////////////
  960. HDMI_RegisterWrite(HDMIRX_PLL_RSTN, 1);
  961. HDMI_RegisterWrite(HDMIRX_PLL_PWDN_DEMOD, 0x1);
  962. ////////////////////////////////////////////////////
  963. HDMI_DelayMs(1);
  964. ////////////////// CTP Pwd ///////////////////
  965. HDMI_RegisterWrite(HDMIRX_R_SP5_PLL_CTP_PWDJ, 0x1);
  966. ////////////////////////////////////////////////////
  967. HDMI_DelayMs(1);
  968. ////////////////// LDO Pwd ///////////////////
  969. HDMI_RegisterWrite(HDMIRX_LDO_PWD,0x1);
  970. HDMI_RegisterWrite(HDMIRX_LDO_PWDE,0x1);
  971. ////////////////////////////////////////////////////
  972. HDMI_DelayMs(1);
  973. ////////////////// VCO Pwd ///////////////////
  974. HDMI_RegisterWrite(HDMIRX_CTL_R_RSTJ, 1);
  975. ////////////////////////////////////////////////////
  976. #endif
  977. if(HDMI_RegisterRead(HDMIRX_ref_freq_cnt)<=5)
  978. {
  979. HDMI_RegisterWrite(HDMIRX_icrst_n, 1);
  980. HDMI_RegisterWrite(HDMIRX_external_gated_TMDSCLK, 1);
  981. HDMI_RegisterWrite(HDMIRX_CTL_R_MORECTRLI_15_0_, 0x40e8);
  982. HDMI_RegisterWrite(HDMIRX_PHY_DIV_RESETJ, 1);
  983. HDMI_RegisterWrite(HDMIRX_R_rst_n, 1);
  984. HDMI_RegisterWrite(HDMIRX_R_DDC5V_reset, 0);
  985. HDMI_RegisterWrite(HDMIRX_RST_1XCLK, 1);
  986. }
  987. //if(bResetInRangeIntrCnt >= HDMI_RESET_IN_RANGE_INTR_TH)
  988. // schedule_delayed_work(&wq_Enable_InRange,0);
  989. }
  990. else if (dIntrStatus & INTR_PLLLOCK)
  991. {
  992. printk("ISR:PLLLOCK\n");
  993. hdmi_signal_check_stop();
  994. //hdmidbg("rd_cnt = %d\n", sysget_DDC_rd_block_cnt(hdmi_get_cur_port()));
  995. HDMI_RegisterWrite(HDMIRX_R_INTR_Status, INTR_PLLLOCK); //clear
  996. //Bryan@20131217 add toggle HDMIRX_PHY_DIV_RESETJ to fix sometime no signal issue
  997. HDMI_RegisterWrite(HDMIRX_PHY_DIV_RESETJ, 0);
  998. HDMI_RegisterWrite(HDMIRX_HDMIRX_CDRRSTJ_CTL, 0);
  999. HDMI_RegisterWrite(HDMIRX_icrst_n, 0);
  1000. HDMI_DelayMs(10);
  1001. /* Power On PHY */
  1002. HDMI_RegisterWrite(HDMIRX_PHY_DIV_RESETJ, 1);
  1003. HDMI_DelayMs(1);
  1004. HDMI_RegisterWrite(HDMIRX_HDMIRX_CDRRSTJ_CTL, 1);
  1005. HDMI_DelayUs(1);
  1006. HDMI_RegisterWrite(HDMIRX_icrst_n, 1);
  1007. #ifdef USE_HW_ADAPTIVE_EQ
  1008. #ifdef CONFIG_HDMI_SUPPORT_MHL
  1009. if((MHL_CABLE_IN != TRUE)||( DrvHDMIPortSelectBitsGet() != CONFIG_HDMI_MHL_PORT))
  1010. #endif
  1011. {
  1012. HDMI_DelayUs(1);
  1013. HDMI_RegisterWrite(HDMIRX_prstn, 1);
  1014. //HDMI_DelayMs(300);
  1015. //HDMI_RegisterWrite(HDMIRX_RST_1XCLK, 1);
  1016. // schedule_delayed_work(&wq_Enable_DCK, (300*HZ)/1000); //HZ = 1000; 1 jiffies = 1ms
  1017. HDMI_RegisterWrite(HDMIRX_REG_RDOUT_SEL4, 0);
  1018. HDMI_RegisterWrite(HDMIRX_REG_RDOUT_SEL5, 0);
  1019. HDMI_RegisterWrite(HDMIRX_reg_rdout_sel_3_0_, 0x0);
  1020. Pre_Eq_Val_Cnt = Cur_Eq_Val_Cnt = Eq_Val_Cnt_0 = Eq_Val_No_Change_Cnt =0;
  1021. if(IN_Range_Eq_Loop_Cnt < 3)
  1022. {
  1023. for(i=0;i<=5000;i++)
  1024. {
  1025. Cur_Eq_Val_Cnt = (HDMI_RegisterRead(HDMIRX_REG_HDMIP1_FREQ_CNT_OUT_12_8_) & 0xf);
  1026. Cur_Ref_Clk = HDMI_RegisterRead(HDMIRX_ref_freq_cnt);
  1027. hdmidbg(KERN_EMERG"Cur_Eq_Val_Cnt = %d!!\n",Cur_Eq_Val_Cnt);
  1028. if(0x9 == Cur_Eq_Val_Cnt)
  1029. {
  1030. //HDMI_DelayMs(100);
  1031. //HDMI_RegisterWrite(HDMIRX_R_CLK_DIV, 0x4);
  1032. break;
  1033. }
  1034. else if(Cur_Eq_Val_Cnt < Pre_Eq_Val_Cnt)
  1035. {
  1036. printk(KERN_EMERG"Cur_Eq_Val_Cnt small than Pre_Eq_Val_Cnt so break!!\n");
  1037. break;
  1038. }
  1039. else if(0 == Cur_Ref_Clk)
  1040. {
  1041. HDMI_DelayMs(50);
  1042. printk(KERN_EMERG"Cur_Ref_Clk = 0 so break!!\n");
  1043. break;
  1044. }
  1045. /*
  1046. else if(Cur_Eq_Val_Cnt == Pre_Eq_Val_Cnt)
  1047. {
  1048. Eq_Val_No_Change_Cnt++;
  1049. if(Eq_Val_No_Change_Cnt >= 3)
  1050. {
  1051. printk(KERN_EMERG"Cur_Eq_Val_Cnt equal than Pre_Eq_Val_Cnt three times so break!!\n");
  1052. IN_Range_Eq_Loop_Cnt ++;
  1053. break;
  1054. }
  1055. }
  1056. else if(0 == Cur_Eq_Val_Cnt)
  1057. {
  1058. Eq_Val_Cnt_0 ++;
  1059. if(Eq_Val_Cnt_0 >= 3)
  1060. {
  1061. printk(KERN_EMERG"Cur_Eq_Val_Cnt keep zero, break!!\n");
  1062. IN_Range_Eq_Loop_Cnt ++;
  1063. break;
  1064. }
  1065. }
  1066. */
  1067. else
  1068. {
  1069. Pre_Eq_Val_Cnt = Cur_Eq_Val_Cnt;
  1070. }
  1071. HDMI_DelayUs(200);
  1072. }
  1073. }
  1074. else
  1075. {
  1076. printk(KERN_EMERG"IN_Range_Eq_Loop_Cnt > 3, so skip adaptive eq flow!!\n");
  1077. }
  1078. }
  1079. #endif
  1080. //HDMI_DelayMs(10);
  1081. //HDMI_RegisterWrite(HDMIRX_bp_fix, 1);
  1082. HDMI_DelayMs(1);
  1083. // HDMI_RegisterWrite(HDMIRX_R_sw_hdcp_rstn, 1);
  1084. HDMI_RegisterWrite(HDMIRX_R_rst_n, 1);
  1085. HDMI_RegisterWrite(HDMIRX_R_DDC5V_reset, 0);
  1086. HDMI_DelayMs(1);
  1087. HDMI_RegisterWrite(HDMIRX_R_HDCP_CTL, ((HDMI_RegisterRead(HDMIRX_R_HDCP_CTL)) | 0x0001));
  1088. hdmi_signal_lock_check_start();
  1089. Active_to_Inactive_ISR_CNT = 0;
  1090. //bBP_LOCK = TRUE;
  1091. bResetInRangeIntrCnt = 0;
  1092. }
  1093. else if (dIntrStatus & INTR_SPD_infoframe)
  1094. {
  1095. printk("ISR:INTR_SPD_infoframe\n");
  1096. HDMI_RegisterWrite(HDMIRX_R_INTR_Status, INTR_SPD_infoframe); //clear
  1097. HDMI_NoticeHandler(HDMINOTICE_SPD_INFOFRAME_UPDATE, "hdmi_isr");
  1098. }
  1099. #ifdef USE_HW_ADAPTIVE_EQ
  1100. #ifdef CONFIG_HDMI_SUPPORT_MHL
  1101. if((MHL_CABLE_IN != TRUE)||( DrvHDMIPortSelectBitsGet() != CONFIG_HDMI_MHL_PORT))
  1102. #endif
  1103. {
  1104. if(bPhyOvspIntrStatus & INTR_Phy_Ovsp_int)
  1105. {
  1106. printk("INTR_Phy_Ovsp_int EQ:0x%x\n",HDMI_RegisterRead(HDMIRX_1050_DW_1050));
  1107. (*((u32 *)0xbe0e0c40) )= (*((u32 *)0xbe0e0c40) )|INTR_Phy_Ovsp_int;//write 1 to Clear
  1108. HDMI_DelayUs(1);
  1109. //HDMI_RegisterWrite(HDMIRX_RST_1XCLK, 1);
  1110. }
  1111. }
  1112. #endif
  1113. return IRQ_HANDLED;
  1114. }
  1115. static void hdmi_dispatch(struct pt_regs *regs)
  1116. {
  1117. do_IRQ(IRQ_HDMI);
  1118. }
  1119. static struct irqaction hdmi_irqaction =
  1120. {
  1121. .handler = (void *)&hdmi_isr,
  1122. .flags = 0,
  1123. .name = "hdmi",
  1124. };
  1125. #ifdef CONFIG_DEBUG_DRV_HDMI_WRITE_EN
  1126. INT32 hdmi_write(struct file *file, const INT8 __user * buf, size_t size, loff_t * ppos)
  1127. {
  1128. size_t in_sz = 0x100;
  1129. INT8 inbuf[0x100];
  1130. in_sz = (size < in_sz) ? size :in_sz;
  1131. memset(inbuf, 0, sizeof(inbuf));
  1132. if (copy_from_user(inbuf, buf, in_sz) == 0)
  1133. {
  1134. hdmi_dbg_Handler(inbuf, in_sz);
  1135. }
  1136. return size;
  1137. }
  1138. #endif
  1139. static struct file_operations hdmi_fops =
  1140. {
  1141. #ifdef CONFIG_DEBUG_DRV_HDMI_WRITE_EN
  1142. .write = hdmi_write,
  1143. #endif
  1144. .owner = THIS_MODULE,
  1145. };
  1146. void DRV_HDMI_Disable(void)
  1147. {
  1148. hdmidbg("%s\n", __FUNCTION__);
  1149. if(HDMI_Init==TRUE)
  1150. {
  1151. #ifdef CONFIG_HDMI_SUPPORT_MHL
  1152. if((MHL_CABLE_IN == TRUE)&&( DrvHDMIPortSelectBitsGet() == CONFIG_HDMI_MHL_PORT))
  1153. {
  1154. }
  1155. else
  1156. #endif
  1157. {
  1158. #ifdef CONFIG_HDMI_HPD_BEHAVIOR_435654
  1159. #ifndef CONFIG_SUPPORT_CEC_TV
  1160. hdmi_apply_hpd(
  1161. #if ((CONFIG_HDMI_PORT_MAP & 0x00f) != 0)
  1162. DRV_HDMI_PORT_A |
  1163. #endif
  1164. #if ((CONFIG_HDMI_PORT_MAP & 0x0f0) != 0)
  1165. DRV_HDMI_PORT_B |
  1166. #endif
  1167. #if ((CONFIG_HDMI_PORT_MAP & 0xf00) != 0)
  1168. DRV_HDMI_PORT_C |
  1169. #endif
  1170. 0 , DRV_HPD_LEVEL_LOW);
  1171. #else
  1172. {
  1173. #if 0
  1174. BootRomShareData_t BootRomShareData;
  1175. UINT8 CECOn;
  1176. sfs_fread(SPI_KMFSHARE_FLASHID, &BootRomShareData, sizeof(BootRomShareData_t), 0);
  1177. CECOn = BootRomShareData.CECControlOnoff;
  1178. hdmidbg("%s CECOn = %d \n", __FUNCTION__,CECOn);
  1179. if (CECOn == FALSE)
  1180. {
  1181. hdmi_apply_hpd(DRV_HDMI_PORT_ALL , DRV_HPD_LEVEL_LOW);
  1182. }
  1183. #endif
  1184. }
  1185. #endif
  1186. #endif
  1187. }
  1188. }
  1189. /* Indicate flow control that no video is present now */
  1190. if(HDMI_Init==TRUE)
  1191. HDMI_NoticeAudioMode(NO_HDMI_AUDIO);
  1192. HDMI_Interrupt_Disable(INTR_ALL); /* Disable all interrupts */
  1193. HDMI_RegisterWrite(HDMIRX_R_INTR_Status, INTR_ALL); /* Clear all interrupts if any */
  1194. /* Remove timers */
  1195. active_timer_remove();
  1196. signal_monitor_timer_remove();
  1197. hdmi_signal_check_stop();
  1198. /* Clear all video related flags */
  1199. hdmi_flag_reset();
  1200. /* Disable hdmi logic, power off */
  1201. HDMI_RegisterWrite(HDMIRX_R_VIDEO_MUTE, 0); /* Mute Video */
  1202. HDMI_RegisterWrite(HDMIRX_R_DDC5V_reset, 1);
  1203. HDMI_RegisterWrite(HDMIRX_R_rst_n, 0); /* Disable hdmi logic */
  1204. /* Indicate hpd handler we leave hdmi source */
  1205. hdmi_hpd_handler(HDMI_SRC_NULL);
  1206. /*Set Termination Off for power saving*/
  1207. // Must set_termination before turn off bandgap power
  1208. #if 0
  1209. #ifdef CONFIG_HDMI_MHL_PORT
  1210. if(CONFIG_HDMI_MHL_PORT==0)
  1211. {
  1212. if(MHL_CABLE_IN == FALSE)//For XIAOMI charging function can not set termination off.
  1213. {
  1214. hdmi_set_termination(DRV_HDMI_PORT_A, DRV_HPD_LEVEL_LOW);
  1215. }
  1216. hdmi_set_termination(DRV_HDMI_PORT_B, DRV_HPD_LEVEL_LOW);
  1217. hdmi_set_termination(DRV_HDMI_PORT_C, DRV_HPD_LEVEL_LOW);
  1218. }
  1219. else if(CONFIG_HDMI_MHL_PORT==1)
  1220. {
  1221. if(MHL_CABLE_IN == FALSE)
  1222. {
  1223. hdmi_set_termination(DRV_HDMI_PORT_B, DRV_HPD_LEVEL_LOW);
  1224. }
  1225. hdmi_set_termination(DRV_HDMI_PORT_A, DRV_HPD_LEVEL_LOW);
  1226. hdmi_set_termination(DRV_HDMI_PORT_C, DRV_HPD_LEVEL_LOW);
  1227. }
  1228. #endif
  1229. #else
  1230. //hdmi_set_termination(DRV_HDMI_PORT_A, DRV_HPD_LEVEL_LOW);
  1231. //hdmi_set_termination(DRV_HDMI_PORT_B, DRV_HPD_LEVEL_LOW);
  1232. //hdmi_set_termination(DRV_HDMI_PORT_C, DRV_HPD_LEVEL_LOW);
  1233. #endif
  1234. /* Disable HDMI PHY */
  1235. HDMI_PHY_Enable(FALSE);
  1236. /* Disable hdmi switch if any */
  1237. hdmi_switch_disable();
  1238. #ifdef CONFIG_HDMI_SUPPORT_MHL
  1239. /* Pause MHL CBUS Work */
  1240. //MHL_CBUS_Work_Enable(FALSE);
  1241. HDMI_RegisterWrite(HDMIRX_R_hdmi_port_sel, 3);//Set HDMIRX_R_hdmi_port_sel to null port
  1242. if((MHL_CABLE_IN == TRUE)&&( DrvHDMIPortSelectBitsGet()==CONFIG_HDMI_MHL_PORT))
  1243. sysset_Set_CD_SENSE_VALUE(CD_SENSE_CFG_EXTERNAL);
  1244. #endif
  1245. DRV_ADC_YppShareBandGap_Power(FALSE);
  1246. }
  1247. INT32 DRV_HDMI_Enable(INT32 src)
  1248. {
  1249. HDMI_PORT_T port = hdmi_hw_port(src);
  1250. #ifdef CONFIG_HDMI_SUPPORT_MHL
  1251. UINT8 cableAttachState=0;
  1252. #endif
  1253. hdmidbg("%s src:%d port:%d\n", __FUNCTION__, src, port);
  1254. if (port == HDMI_PORT_NULL)
  1255. {
  1256. hdmidbg("%s Incorrect hdmi port\n", __FUNCTION__);
  1257. return 1;
  1258. }
  1259. //After plug in S+8203r HDMI Tester Source,Box IBT 1073 NG
  1260. HDMI_RegisterWrite(HDMIRX_R_sw_hdcp_rstn, 0);
  1261. HDMI_RegisterWrite(HDMIRX_R_sw_hdcp_rstn, 1);
  1262. /* Indicate hpd handler that we select hdmi source */
  1263. if(HDMI_Init==TRUE)
  1264. hdmi_hpd_handler(src);
  1265. #ifdef CONFIG_SUPPORT_CEC_TV
  1266. /*Set Toggle HPD*/
  1267. if(HDMI_Init==TRUE)
  1268. {
  1269. if(CEC_BootUpByOneTouchPlay())
  1270. {
  1271. hdmidbg("ignore set hpd when power on by one touch play\n");
  1272. }
  1273. #ifdef CONFIG_HDMI_SUPPORT_MHL
  1274. if((MHL_CABLE_IN == TRUE)&&( DrvHDMIPortSelectBitsGet() == CONFIG_HDMI_MHL_PORT))
  1275. {
  1276. hdmidbg("ignore set hpd when power on mhl port and cable inserted\n");
  1277. }
  1278. #endif
  1279. else if(hdmi_get_hpd_at_cur_src())
  1280. {
  1281. sysset_HDMI_SW5V(hdmi_get_cur_port(), TRUE);
  1282. #ifdef CONFIG_SUPPORT_DOLBY_AUDIO
  1283. if (CurATMOS_MODE !=ATMOS_MODE)
  1284. {
  1285. hdmi_apply_hpd(
  1286. #if ((CONFIG_HDMI_PORT_MAP & 0x00f) != 0)
  1287. DRV_HDMI_PORT_A |
  1288. #endif
  1289. #if ((CONFIG_HDMI_PORT_MAP & 0x0f0) != 0)
  1290. DRV_HDMI_PORT_B |
  1291. #endif
  1292. #if ((CONFIG_HDMI_PORT_MAP & 0xf00) != 0)
  1293. DRV_HDMI_PORT_C |
  1294. #endif
  1295. 0 , DRV_HPD_LEVEL_LOW);
  1296. HDMI_Change_EDID_DD_Plus_Data(ATMOS_MODE);
  1297. HDMI_DelayMs(HDMI_HPD_L2H_DELAY);
  1298. hdmi_apply_hpd_by5V(
  1299. #if ((CONFIG_HDMI_PORT_MAP & 0x00f) != 0)
  1300. DRV_HDMI_PORT_A |
  1301. #endif
  1302. #if ((CONFIG_HDMI_PORT_MAP & 0x0f0) != 0)
  1303. DRV_HDMI_PORT_B |
  1304. #endif
  1305. #if ((CONFIG_HDMI_PORT_MAP & 0xf00) != 0)
  1306. DRV_HDMI_PORT_C |
  1307. #endif
  1308. 0);
  1309. }
  1310. else
  1311. #endif
  1312. #ifdef CONFIG_HDMI_HPD_BEHAVIOR_435654
  1313. if (HDMI_ENTER_SOURCE_TOGGLE_HPD == TRUE)
  1314. #endif
  1315. {
  1316. hdmi_apply_hpd_Toggle((1 << hdmi_get_cur_port()), DRV_HPD_LEVEL_LOW,TRUE);
  1317. HDMI_DelayMs(HDMI_HPD_L2H_DELAY);
  1318. hdmi_apply_hpd_Toggle((1 << hdmi_get_cur_port()), DRV_HPD_LEVEL_LOW,FALSE);
  1319. hdmi_apply_hpd_by5V((1 << hdmi_get_cur_port()));
  1320. }
  1321. #ifdef CONFIG_HDMI_HPD_BEHAVIOR_435654
  1322. HDMI_ENTER_SOURCE_TOGGLE_HPD = TRUE;
  1323. #endif
  1324. }
  1325. }
  1326. #else
  1327. #ifdef CONFIG_CHANGE_HOT_PLUG_ACTION
  1328. if(HDMI_Init==TRUE)
  1329. {
  1330. #ifdef CONFIG_SUPPORT_MONITOR
  1331. if (HDMI_ENTER_SOURCE_TOGGLE_HPD == TRUE && (HDMI_POWER_OFF_STATUS != HDMI_POWER_OFF_REASON_NOSIGNAL))
  1332. #endif
  1333. {
  1334. hdmi_apply_hpd_Toggle((1 << hdmi_get_cur_port()), DRV_HPD_LEVEL_LOW,TRUE);
  1335. HDMI_DelayMs(HDMI_HPD_L2H_DELAY);
  1336. hdmi_apply_hpd_Toggle((1 << hdmi_get_cur_port()), DRV_HPD_LEVEL_LOW,FALSE);
  1337. hdmi_apply_hpd_by5V((1 << hdmi_get_cur_port()));
  1338. }
  1339. #ifdef CONFIG_SUPPORT_MONITOR
  1340. HDMI_ENTER_SOURCE_TOGGLE_HPD = TRUE;
  1341. HDMI_POWER_OFF_STATUS = HDMI_POWER_OFF_OPTION_MAX;
  1342. #endif
  1343. hdmi_hpd_update();
  1344. }
  1345. #endif
  1346. #endif
  1347. #ifdef CONFIG_ENTER_PORT_HPD_HIGH
  1348. if(HDMI_Init==TRUE)
  1349. {
  1350. if(hdmi_get_hpd_at_cur_src()==FALSE)
  1351. {
  1352. hdmi_apply_hpd((1 << hdmi_get_cur_port()), DRV_HPD_LEVEL_HIGH);
  1353. }
  1354. }
  1355. #endif
  1356. /* Disable hdmi hw and all interrupts */
  1357. HDMI_RegisterWrite(HDMIRX_R_DDC5V_reset, 1);
  1358. HDMI_RegisterWrite(HDMIRX_R_rst_n, 0); /* Disable hdmi logic */
  1359. HDMI_Interrupt_Disable(INTR_ALL); /* Disable all interrupts */
  1360. HDMI_RegisterWrite(HDMIRX_R_INTR_Status, INTR_ALL); /* Clear all interrupts if any */
  1361. /* Clear all video related flags */
  1362. hdmi_flag_reset();
  1363. Active_Flag=FALSE;
  1364. AVI_ISR_CNT = OpenScreen_Flag = 0;
  1365. /* Disable HDMI PHY */
  1366. HDMI_PHY_Enable(FALSE);
  1367. HDMI_DelayMs(10);
  1368. /* Enable HDMI PHY */
  1369. HDMI_PHY_Enable(TRUE);
  1370. #ifdef HDMI_HPD_EXT_1K_TO_SOURCE_5V
  1371. if(HDMI_Init==TRUE)
  1372. {
  1373. if(0||
  1374. #ifdef CONFIG_HDMI_PORT_A_HAVE_EXT_1K
  1375. #else
  1376. (port == HDMI_PORT_A)||
  1377. #endif
  1378. #ifdef CONFIG_HDMI_PORT_B_HAVE_EXT_1K
  1379. #else
  1380. (port == HDMI_PORT_B)||
  1381. #endif
  1382. #ifdef CONFIG_HDMI_PORT_C_HAVE_EXT_1K
  1383. #else
  1384. (port == HDMI_PORT_C)||
  1385. #endif
  1386. 0)
  1387. {
  1388. #ifdef HDMI_HPD_USE_1K_OHM
  1389. if(MHL_CABLE_IN == FALSE)
  1390. {
  1391. sysset_HDMI_HPD_1K_OnOff(port, TRUE);
  1392. }
  1393. #else
  1394. sysset_HDMI_HPD_1K_OnOff(port, FALSE);
  1395. #endif
  1396. }
  1397. }
  1398. #else
  1399. #ifdef HDMI_HPD_USE_1K_OHM
  1400. if(MHL_CABLE_IN == FALSE)
  1401. {
  1402. sysset_HDMI_HPD_1K_OnOff(port, TRUE);
  1403. }
  1404. #else
  1405. sysset_HDMI_HPD_1K_OnOff(port, FALSE);
  1406. #endif
  1407. #endif
  1408. #ifdef CONFIG_HDMI_SUPPORT_MHL
  1409. #ifdef CONFIG_HDMI_MHL_PORT
  1410. if( DrvHDMIPortSelectBitsGet()==CONFIG_HDMI_MHL_PORT)
  1411. {
  1412. if(CONFIG_HDMI_MHL_PORT==0)
  1413. {
  1414. if(MHL_CABLE_IN == TRUE)//For HTC Butterfly S need toggle HDMI termination.
  1415. {
  1416. hdmi_set_termination(DRV_HDMI_PORT_A, DRV_HPD_LEVEL_LOW);
  1417. HDMI_DelayMs(150);
  1418. }
  1419. }
  1420. else if(CONFIG_HDMI_MHL_PORT==1)
  1421. {
  1422. if(MHL_CABLE_IN == TRUE)
  1423. {
  1424. hdmi_set_termination(DRV_HDMI_PORT_B, DRV_HPD_LEVEL_LOW);
  1425. HDMI_DelayMs(150);
  1426. }
  1427. }
  1428. }
  1429. #endif
  1430. #endif
  1431. /*Set Termination On*/
  1432. //#ifdef CONFIG_HDMI_ALL_PORT_TERMINATION_ON
  1433. #if 1
  1434. hdmi_set_termination(DRV_HDMI_PORT_A, DRV_HPD_LEVEL_HIGH);
  1435. hdmi_set_termination(DRV_HDMI_PORT_B, DRV_HPD_LEVEL_HIGH);
  1436. hdmi_set_termination(DRV_HDMI_PORT_C, DRV_HPD_LEVEL_HIGH);
  1437. #else
  1438. hdmi_set_termination((1 << hdmi_get_cur_port()), DRV_HPD_LEVEL_HIGH);
  1439. #endif
  1440. /* Set hdmi hw for each port */
  1441. switch (port)
  1442. {
  1443. case HDMI_PORT_A:
  1444. //hdmi_set_termination(DRV_HDMI_PORT_A, DRV_HPD_LEVEL_HIGH);
  1445. HDMI_RegisterWrite(HDMIRX_R_HDMI_LinkS, 0);
  1446. HDMI_RegisterWrite(HDMIRX_R_hdmi_port_sel, 0);
  1447. //HDMI_RegisterWrite(HDMIRX_R_mhl_port_sel, 0);//Support MHL in Port:A
  1448. HDMI_RegisterWrite(HDMIRX_PORT_EN_P2_0,0x1);
  1449. //sysset_cbus_port_sel(HDMI_PORT_A);
  1450. //HDMI_RegisterWrite(HDMIRX_VBG_VREF_SEL_3_0_,1);
  1451. break;
  1452. case HDMI_PORT_B:
  1453. //hdmi_set_termination(DRV_HDMI_PORT_B, DRV_HPD_LEVEL_HIGH);
  1454. HDMI_RegisterWrite(HDMIRX_R_HDMI_LinkS, 1);
  1455. HDMI_RegisterWrite(HDMIRX_R_hdmi_port_sel, 1);
  1456. HDMI_RegisterWrite(HDMIRX_PORT_EN_P2_0,0x2);
  1457. break;
  1458. case HDMI_PORT_C:
  1459. //hdmi_set_termination(DRV_HDMI_PORT_C, DRV_HPD_LEVEL_HIGH);
  1460. HDMI_RegisterWrite(HDMIRX_R_HDMI_LinkS, 2);
  1461. HDMI_RegisterWrite(HDMIRX_R_hdmi_port_sel, 2);
  1462. HDMI_RegisterWrite(HDMIRX_PORT_EN_P2_0,0x4);
  1463. break;
  1464. default:
  1465. break;
  1466. }
  1467. #ifdef CONFIG_HDMI_SUPPORT_MHL
  1468. #ifdef CONFIG_HDMI_MHL_PORT
  1469. if( DrvHDMIPortSelectBitsGet()==CONFIG_HDMI_MHL_PORT)
  1470. {
  1471. #if 0
  1472. //reset cbus
  1473. HDMI_RegisterWrite(HDMIRX_CBUS_cfg_cbus_reset, 1);
  1474. HDMI_RegisterWrite(HDMIRX_CBUS_r_reset_reg, 1);
  1475. HDMI_RegisterWrite(HDMIRX_CBUS_cfg_debounce_reset, 1);
  1476. HDMI_RegisterWrite(HDMIRX_CBUS_cfg_buf_reset, 1);
  1477. //HDMI_DelayMs(100);
  1478. HDMI_RegisterWrite(HDMIRX_CBUS_cfg_cbus_reset, 0);
  1479. HDMI_RegisterWrite(HDMIRX_CBUS_r_reset_reg, 0);
  1480. HDMI_RegisterWrite(HDMIRX_CBUS_cfg_debounce_reset, 0);
  1481. HDMI_RegisterWrite(HDMIRX_CBUS_cfg_buf_reset, 0);
  1482. #endif
  1483. if(MHL_CABLE_IN == TRUE)
  1484. {
  1485. HDMI_RegisterWrite(HDMIRX_R_BYTE_ALIGN_CNT2, 0xF);//For MIK-706
  1486. }
  1487. }
  1488. #endif
  1489. #endif
  1490. HDMI_RegisterWrite(HDMIRX_R_PHY_SEL, 0);
  1491. /* Enable related interrupts */
  1492. //HDMI_Interrupt_Enable(INTR_HDCP_Key_Request | INTR_AVI_infoframe | INTR_Inactive_to_Active | INTR_phy_IN_RANGE | INTR_phy_PLLLOCK);
  1493. if(HDMI_Init==TRUE)
  1494. {
  1495. HDMI_Interrupt_Enable(INTR_HDCP_Key_Request | INTR_AVI_infoframe | INTR_SPD_infoframe | INTR_Inactive_to_Active | INTR_phy_IN_RANGE | INTR_PLLLOCK | INTR_Clear_AV_Mute);
  1496. }
  1497. HDMI_Interrupt_Disable(INTR_audio_sample_coming | INTR_HBR_audio_sample_coming);
  1498. HDMI_RegisterWrite(HDMIRX_R_GBD_update_once, 1);
  1499. #ifdef USE_HW_ADAPTIVE_EQ
  1500. //0xbe0e0c47[0]Phy_Ovsp_int Enable 1: Enable
  1501. *((u32 *)0xbe0e0c44) = (*((u32 *)0xbe0e0c44) |INTR_Phy_Ovsp_int) ;//write 1 to Enable
  1502. #endif
  1503. /* Clear interrupts of audio sample commings */
  1504. HDMI_RegisterWrite(HDMIRX_AS_exist, 1); // Write 1 Clear
  1505. HDMI_RegisterWrite(HDMIRX_HBRAS_exist, 1); // Write 1 Clear
  1506. /* Enable hdmi logic, power on */
  1507. HDMI_RegisterWrite(HDMIRX_R_rst_n, 1); /* Enable hdmi logic */
  1508. HDMI_RegisterWrite(HDMIRX_R_DDC5V_reset, 0);
  1509. HDMI_RegisterWrite(HDMIRX_R_sw_hdcp_rst_en, 1); /* set hdcp reset independent from HDMIRX_R_rst_n , do not reset by hdmi resst */
  1510. /* Set software hdcp handshake */
  1511. HDMI_RegisterWrite(HDMIRX_R_CLK_DIV, 0x4); /* Enable hdcp */
  1512. HDMI_RegisterWrite(HDMIRX_R_HDCP_CTL, 0x9f04);
  1513. HDMI_RegisterWrite(HDMIRX_R_HDCP_CTL, 0x9f0c);
  1514. HDMI_RegisterWrite(HDMIRX_R_HDCP_CTL, 0x9f85);
  1515. /* Check signal status */
  1516. //HDMI_RegisterWrite(HDMIRX_R_BYTE_ALIGN_CNT2, 0);
  1517. if(HDMI_Init==TRUE)
  1518. hdmi_signal_check_start();
  1519. /* Select hdmi switch port if any */
  1520. hdmi_switch_enable(hdmi_sw_port(src));
  1521. *((u8 *)0xbe000214) = (*((u8 *)0xbe000214) &0x0F) | 0x80 ;
  1522. /* Initial MHL CBUS Work */
  1523. #ifdef CONFIG_HDMI_SUPPORT_MHL
  1524. if(CONFIG_HDMI_MHL_PORT==0)
  1525. {
  1526. HDMI_RegisterWrite(HDMIRX_R_mhl_port_sel, 0);//Support MHL in Port:A
  1527. sysset_cbus_port_sel(HDMI_PORT_A);
  1528. }
  1529. else if(CONFIG_HDMI_MHL_PORT==1)
  1530. {
  1531. HDMI_RegisterWrite(HDMIRX_R_mhl_port_sel, 1);//Support MHL in Port:B
  1532. sysset_cbus_port_sel(HDMI_PORT_B);
  1533. }
  1534. 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
  1535. {
  1536. HDMI_RegisterWrite(HDMIRX_R_mhl_port_sel, 3);//Let A and B keep in HDMI Mode
  1537. }
  1538. if(MHL_CBUS_Init==FALSE)
  1539. {
  1540. MHL_CBUS_Initial();
  1541. MHL_CBUS_Init=TRUE;
  1542. }
  1543. if( DrvHDMIPortSelectBitsGet()==CONFIG_HDMI_MHL_PORT)
  1544. {
  1545. CbusDrvConnectedGet(&cableAttachState);
  1546. }
  1547. if(cableAttachState)
  1548. {
  1549. UINT8 Connected;
  1550. UINT8 tryCnt=0;
  1551. do{
  1552. CbusDrvConnectedGet(&Connected);
  1553. HDMI_DelayMs(100);
  1554. }while(tryCnt<3 && Connected == FALSE);
  1555. //if(CbusMidGetDevCapReadyBit()==FALSE)
  1556. if(Connected == FALSE)
  1557. {
  1558. /* Start MHL CBUS Work */
  1559. if(TRUE == HDMI_Init)
  1560. {
  1561. MHL_CBUS_Work_Enable(TRUE);
  1562. }
  1563. }
  1564. else
  1565. {
  1566. if((HDMI_RegisterRead(HDMIRX_cbus_mode_pathen_muted)&0x3) ==0x2)
  1567. {//CLK_MODE=10 =>PP Mode
  1568. hdmidbg("MHL PP Mode\n");
  1569. HDMI_RegisterWrite(HDMIRX_TMDSCLK_PP_SEL, 1);
  1570. //*((u8 *)0xbe0e001c) = 0xff;
  1571. HDMI_RegisterWrite(HDMIRX_HDMIP0_Mode_Sel_external, 1);
  1572. HDMI_RegisterWrite(HDMIRX_HDMIP0_Mode_Sel_mux, 1);
  1573. HDMI_RegisterWrite(HDMIRX_HDMIP0_MHL_Mode_Sel_external, 1);
  1574. HDMI_RegisterWrite(HDMIRX_HDMIP0_MHL_Mode_Sel_mux, 1);
  1575. HDMI_RegisterWrite(HDMIRX_HDMIP0_Mode_Sel_PLL_external, 1);
  1576. HDMI_RegisterWrite(HDMIRX_HDMIP0_Mode_Sel_PLL_mux, 1);
  1577. HDMI_RegisterWrite(HDMIRX_HDMIP0_MHL_Mode_PLL_Sel_external, 1);
  1578. HDMI_RegisterWrite(HDMIRX_HDMIP0_MHL_Mode_Sel_PLL_mux, 1);
  1579. }
  1580. else
  1581. {//CLK_MODE=11 =>24 Bit Mode
  1582. hdmidbg("MHL 24 Bit Mode\n");
  1583. HDMI_RegisterWrite(HDMIRX_TMDSCLK_PP_SEL, 0);
  1584. //*((u8 *)0xbe0e001c) = 0xbb;
  1585. HDMI_RegisterWrite(HDMIRX_HDMIP0_Mode_Sel_external, 1);
  1586. HDMI_RegisterWrite(HDMIRX_HDMIP0_Mode_Sel_mux, 1);
  1587. HDMI_RegisterWrite(HDMIRX_HDMIP0_MHL_Mode_Sel_external, 0);
  1588. HDMI_RegisterWrite(HDMIRX_HDMIP0_MHL_Mode_Sel_mux, 1);
  1589. HDMI_RegisterWrite(HDMIRX_HDMIP0_Mode_Sel_PLL_external, 1);
  1590. HDMI_RegisterWrite(HDMIRX_HDMIP0_Mode_Sel_PLL_mux, 1);
  1591. HDMI_RegisterWrite(HDMIRX_HDMIP0_MHL_Mode_PLL_Sel_external, 0);
  1592. HDMI_RegisterWrite(HDMIRX_HDMIP0_MHL_Mode_Sel_PLL_mux, 1);
  1593. }
  1594. }
  1595. }
  1596. #endif
  1597. return 0;
  1598. }
  1599. #ifdef CONFIG_SUPPORT_DOLBY_AUDIO
  1600. void HDMI_Set_EDID_ATMOS_Mode(BOOL eATMOS)
  1601. {
  1602. hdmidbg("%s\n", __FUNCTION__);
  1603. hdmidbg("ATMOS_Mode %d\n",eATMOS);
  1604. ATMOS_MODE=eATMOS;
  1605. if (CurATMOS_MODE !=ATMOS_MODE)
  1606. {
  1607. //if(EDID_SUPPORT_DD_PLUS==TRUE)
  1608. {
  1609. HDMI_Change_EDID_DD_Plus_Data(ATMOS_MODE);
  1610. }
  1611. }
  1612. }
  1613. void HDMI_Change_EDID_DD_Plus_Data(BOOL Atmos_Mode)
  1614. {
  1615. u32 edid_data_addr,edid_data_size,i;
  1616. UINT32 *data_ptr1;
  1617. UINT8 *data_ptr = NULL;
  1618. UINT8 bEdidWriteBack=0;
  1619. if(Atmos_Mode !=CurATMOS_MODE)
  1620. {
  1621. edid_data_addr = lookup_flashtable_addr("EDID");
  1622. edid_data_size = lookup_flashtable_size("EDID");
  1623. data_ptr = kmalloc(edid_data_size, GFP_KERNEL);
  1624. //memcpy(data_ptr, edid_data_addr|0xb0000000, edid_data_size);
  1625. memcpy( (void *)data_ptr, (void* )(edid_data_addr|0xb0000000), edid_data_size);
  1626. //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]);
  1627. if(Atmos_Mode==TRUE)
  1628. {
  1629. UINT8 bDataBlkType1 = (data_ptr[128+4]&0xe0)>>5;
  1630. UINT8 bLength1 = data_ptr[128+4]&0x1f;
  1631. UINT8 bDataBlkType2 = (data_ptr[128+4+bLength1+1]&0xe0)>>5;
  1632. UINT8 bLength2 = data_ptr[128+4+bLength1+1]&0x1f;
  1633. UINT8 bShortAudDataCount = 0, bShortAudDataShift = 0, bDD_Plus_Byte3_Index = 0;
  1634. if(bDataBlkType1==1)
  1635. {
  1636. bShortAudDataCount =bLength1/3 ;
  1637. for (i = 0; i < bShortAudDataCount; i++)
  1638. {
  1639. bShortAudDataShift = i*3;
  1640. if (( ((data_ptr[128+4+1+bShortAudDataShift])&0x78)>>3) ==10) //DD_Plus
  1641. {
  1642. bDD_Plus_Byte3_Index=(128+4+bShortAudDataShift+3);
  1643. break;
  1644. }
  1645. }
  1646. }
  1647. else if (bDataBlkType2==1)
  1648. {
  1649. bShortAudDataCount =bLength2/3 ;
  1650. for (i = 0; i < bShortAudDataCount; i++)
  1651. {
  1652. bShortAudDataShift = i*3;
  1653. if (( ((data_ptr[128+4+bLength1+1+bShortAudDataShift+1])&0x78)>>3) ==10) //DD_Plus
  1654. {
  1655. bDD_Plus_Byte3_Index=(128+4+bLength1+1+bShortAudDataShift+3);
  1656. break;
  1657. }
  1658. }
  1659. }
  1660. if (bDD_Plus_Byte3_Index !=0)
  1661. {
  1662. hdmidbg("bDD_Plus_Byte3 is %x \n", data_ptr[bDD_Plus_Byte3_Index]);
  1663. EDID_SUPPORT_DD_PLUS=TRUE;
  1664. bEdidWriteBack = TRUE;
  1665. if((data_ptr[bDD_Plus_Byte3_Index]&0x01)==0)
  1666. {
  1667. data_ptr[bDD_Plus_Byte3_Index]+=1;//EDIDA Set ATMOS Mode
  1668. data_ptr[255]-=1;//Update Check Sum Data
  1669. }
  1670. if((data_ptr[bDD_Plus_Byte3_Index+256]&0x01)==0)
  1671. {
  1672. data_ptr[bDD_Plus_Byte3_Index+256]+=1;//EDIDB Set ATMOS Mode
  1673. data_ptr[255+256]-=1;//Update Check Sum Data
  1674. }
  1675. if((data_ptr[bDD_Plus_Byte3_Index+256+256+128]&0x01)==0)
  1676. {
  1677. data_ptr[bDD_Plus_Byte3_Index+256+256+128]+=1;//EDIDC Set ATMOS Mode
  1678. data_ptr[255+256+128+256]-=1;//Update Check Sum Data
  1679. }
  1680. }
  1681. else
  1682. {
  1683. EDID_SUPPORT_DD_PLUS=FALSE;
  1684. bEdidWriteBack = FALSE;
  1685. hdmidbg("Don't find DD+ Audio Format Code in Short Audio Descriptor!!!\n");
  1686. }
  1687. }
  1688. else
  1689. {
  1690. hdmidbg("edid write back !!!\n");
  1691. bEdidWriteBack = TRUE;
  1692. }
  1693. }
  1694. if(bEdidWriteBack == TRUE)
  1695. {
  1696. hdmi_apply_hpd(
  1697. #if ((CONFIG_HDMI_PORT_MAP & 0x00f) != 0)
  1698. DRV_HDMI_PORT_A |
  1699. #endif
  1700. #if ((CONFIG_HDMI_PORT_MAP & 0x0f0) != 0)
  1701. DRV_HDMI_PORT_B |
  1702. #endif
  1703. #if ((CONFIG_HDMI_PORT_MAP & 0xf00) != 0)
  1704. DRV_HDMI_PORT_C |
  1705. #endif
  1706. 0 , DRV_HPD_LEVEL_LOW);
  1707. data_ptr1 = (UINT32 *) data_ptr;
  1708. //Update SRAM EDID
  1709. /* Write HDMI A & B EDID 512 (0x280) byte */
  1710. for (i = 0; i < 0x80; i++) {
  1711. writel(0x100+i,0xbe060034);
  1712. writel(data_ptr1[i], 0xbe060038);
  1713. writeb(0x1, 0xbe06002c);
  1714. }
  1715. data_ptr1 +=0xA0;
  1716. /* Write HDMI C EDIDF 256 (0x100) byte */
  1717. for (i = 0; i < 0x40; i++) {
  1718. writel(0x100+i,0xbe060134);
  1719. writel(data_ptr1[i], 0xbe060138);
  1720. writeb(0x1, 0xbe06012c);
  1721. }
  1722. /* Enable EDID after initial done */
  1723. writel( 0x000603a1,0xbe060024); //HDMI A
  1724. writel( 0x000603a1,0xbe060030); //HDMI B
  1725. writel( 0x000603a1,0xbe060124); //HDMI C
  1726. HDMI_DelayMs(HDMI_HPD_L2H_DELAY);
  1727. hdmi_apply_hpd_by5V(
  1728. #if ((CONFIG_HDMI_PORT_MAP & 0x00f) != 0)
  1729. DRV_HDMI_PORT_A |
  1730. #endif
  1731. #if ((CONFIG_HDMI_PORT_MAP & 0x0f0) != 0)
  1732. DRV_HDMI_PORT_B |
  1733. #endif
  1734. #if ((CONFIG_HDMI_PORT_MAP & 0xf00) != 0)
  1735. DRV_HDMI_PORT_C |
  1736. #endif
  1737. 0);
  1738. }
  1739. if(Atmos_Mode !=CurATMOS_MODE)
  1740. {
  1741. CurATMOS_MODE = Atmos_Mode;
  1742. if(data_ptr != NULL)
  1743. kfree(data_ptr);
  1744. }
  1745. }
  1746. #endif
  1747. static struct cdev hdmirx_cdev;
  1748. static INT32 hdmirx_devno;
  1749. INT32 DRV_HDMI_Init(void)
  1750. {
  1751. hdmidbg("%s\n", __FUNCTION__);
  1752. hdmidbg("*** HDMI Mapping Information ***\n");
  1753. hdmidbg("\tProject:HDMISwitchMap 0x%02x HDMIPortMap 0x%08x\n", CONFIG_HDMI_SWITCH, CONFIG_HDMI_PORT_MAP);
  1754. /* Disable Global HDMI Rst */
  1755. sysset_hdmi_rst(false);
  1756. /* Decrypt hdcp key */
  1757. DRV_HDMI_UpdateHDCPKey((UINT8*)SPI_HDCPKEY_FLASHADDR);
  1758. /* Init each blocks */
  1759. hdmi_mapping_init(); /* hdmi source and hw port mapping */
  1760. hdmi_hpd_init(); /* hot plug detect and related patch */
  1761. hdmi_processing_init(); /* signal processing block */
  1762. /* Init working queues */
  1763. INIT_WORK(&wq_chlock, (work_func_t) HDMI_Audio_ChannelLocked);
  1764. #ifdef CONFIG_HDMI_HW_PATCH_FOR_HDCP_COLOR_SNOW
  1765. INIT_WORK(&wq_ToggleHPD, (work_func_t) HDMI_Toggle_HPD);
  1766. #endif
  1767. INIT_DELAYED_WORK(&wq_Enable_InRange, (work_func_t) HDMI_Enable_InRange);
  1768. #ifdef USE_HW_ADAPTIVE_EQ
  1769. // INIT_DELAYED_WORK(&wq_Enable_DCK, (work_func_t) HDMI_Enable_DCK);
  1770. #endif
  1771. /* Register interrupts handler */
  1772. set_vi_handler(IRQ_HDMI, (vi_handler_t) hdmi_dispatch);
  1773. setup_irq(IRQ_HDMI, &hdmi_irqaction);
  1774. /* Driver device node */
  1775. hdmirx_devno = MKDEV(HDMI_DEV_MAJOR, 0);
  1776. if (register_chrdev_region(hdmirx_devno, 0, HDMIRXDRV_DEVNAME))
  1777. {
  1778. return -EIO;
  1779. }
  1780. cdev_init(&hdmirx_cdev, &hdmi_fops);
  1781. hdmirx_cdev.owner = THIS_MODULE;
  1782. hdmirx_cdev.ops = &hdmi_fops;
  1783. if (cdev_add(&hdmirx_cdev, hdmirx_devno, 1))
  1784. {
  1785. return -EIO;
  1786. }
  1787. /* Set up related global system registers */
  1788. sysset_hdmi_stcInitValue(0x0); /* Initialize STC value */
  1789. sysset_hdmi_stcclk(); /* Enable HDMI STC clock */
  1790. sysset_hdmi_tmdsclk(true); /* Disable HDMI PD */
  1791. sysset_HDMI_HPD_1K_Init();
  1792. sysset_HDMI_EN_AVI_V3(true);
  1793. HDMI_RegisterWrite(HDMIRX_R_ref_length, 0x180);
  1794. HDMI_RegisterWrite(HDMIRX_R_DDC5V_reset, 0);
  1795. HDMI_RegisterWrite(HDMIRX_R_inactive_level, 0x19);
  1796. HDMI_RegisterWrite(HDMIRX_R_half_quarter_HT, 0);
  1797. HDMI_RegisterWrite(HDMIRX_R_phy_freq_det, 0x0);
  1798. HDMI_RegisterWrite(HDMIRX_R_inter_alignment_once, 0x0);
  1799. HDMI_RegisterWrite(HDMIRX_R_stable_time, 0x120000);//Can not set too long for MHL Samsung Note3
  1800. HDMI_RegisterWrite(HDMIRX_R_Clear_mute_timer, 1); // CLEAR_MUTE_TIMER;
  1801. HDMI_RegisterWrite(HDMIRX_R_clear_ACP_timer, 0xff); // CLEAR_ACP_TIMER;
  1802. HDMI_RegisterWrite(HDMIRX_R_system_clk_cnt, 0xff);
  1803. HDMI_RegisterWrite(HDMIRX_Soft_Clear_Mute, 0);
  1804. HDMI_RegisterWrite(HDMIRX_R_subpacket_identical_en, 1);
  1805. HDMI_RegisterWrite(HDMIRX_R_subpacket_identical_en2, 1);
  1806. HDMI_RegisterWrite(HDMIRX_R_REALIGN_EN, 3);
  1807. HDMI_RegisterWrite(HDMIRX_R_frame_cnt30, 1);
  1808. //HDMI_RegisterWrite(HDMIRX_R_AUTO_CSC, 0); //not available in 531
  1809. HDMI_RegisterWrite(HDMIRX_R_FIELD_POL, 0);
  1810. //HDMI_RegisterWrite(HDMIRX_R_out_sel, 1); //not available in 531
  1811. HDMI_RegisterWrite(HDMIRX_R_PR_EN, 1);
  1812. HDMI_RegisterWrite(HDMIRX_R_InterCA_TH, 0x2);
  1813. HDMI_RegisterWrite(HDMIRX_R_ALIGN_CNT, 0x4);
  1814. //HDMI_RegisterWrite(HDMIRX_R_ALIGN_CNT, 0xF);
  1815. HDMI_RegisterWrite(HDMIRX_R_freq_stable_th, 0x06);
  1816. HDMI_RegisterWrite(HDMIRX_R_freq_unstable_th, 0x06);
  1817. HDMI_RegisterWrite(HDMIRX_R_freq_stable_th, 0x08);
  1818. HDMI_RegisterWrite(HDMIRX_R_auto_phypd, 0); // Don't automatically disable phy when hdmi logic is disabled
  1819. HDMI_RegisterWrite(HDMIRX_R_REALIGN_TIMER1, 0x1e); // retry condition without symbol lock.
  1820. HDMI_RegisterWrite(HDMIRX_R_REALIGN_TIMER2, 0x06); // inactive condition with symbol lock.
  1821. HDMI_RegisterWrite(HDMIRX_R_HDMI_level, 0x14);
  1822. HDMI_RegisterWrite(HDMIRX_EQ_VAL_FIX, 0x1);
  1823. HDMI_RegisterWrite(CTRLI_631_600__DW_0430,0x24721024);
  1824. HDMI_RegisterWrite(CTRLI_663_632__DW_0434,0x10247210);
  1825. HDMI_RegisterWrite(CTRLI_695_664__DW_0438,0x00000072);
  1826. #ifdef USE_HW_ADAPTIVE_EQ
  1827. HDMI_Adaptive_EQ_Init();
  1828. #endif
  1829. /* [0] ht, [1] vt, [2] disp, [3] de, [4] interlace */
  1830. HDMI_RegisterWrite(HDMIRX_R_LEVEL, 8);
  1831. /* Settings for pixel color conversion */
  1832. HDMI_RegisterWrite(HDMIRX_R_DnSAMPLING_EN, 0);
  1833. /* Black screen color setting */
  1834. HDMI_RegisterWrite(HDMIRX_R_AVMUTE_blk_screen, 1);
  1835. HDMI_RegisterWrite(HDMIRX_R_auto_blk_msb, 1);
  1836. HDMI_RegisterWrite(HDMIRX_R_rst_n, 0); /* Disable hdmi logic */
  1837. //HDMI_RegisterWrite(HDMIRX_R_BYTE_ALIGN_CNT2, 4);
  1838. //HDMI_RegisterWrite(HDMIRX_R_BYTE_ALIGN_CNT2, 8);
  1839. HDMI_RegisterWrite(HDMIRX_R_BYTE_ALIGN_CNT2, 0xF);//For Silicon Image MHL Starter KIT-9244
  1840. //HDMI_RegisterWrite(HDMIRX_r_disable_unlock_mhl, 1);
  1841. HDMI_RegisterWrite(HDMIRX_R_BYTE_ALIGN_CNT1, 4);
  1842. HDMI_RegisterWrite(HDMIRX_R_strict_symlock_a, 1);
  1843. HDMI_RegisterWrite(HDMIRX_R_pre_align_chk_a, 1);
  1844. ////
  1845. HDMI_RegisterWrite(HDMIRX_PHY_DIV_RESETJ, 0);
  1846. HDMI_RegisterWrite(HDMIRX_HDMIRX_CDRRSTJ_CTL, 0);
  1847. HDMI_RegisterWrite(HDMIRX_icrst_n, 0);
  1848. ////
  1849. //*((u8 *)0xbe000214) = (*((u8 *)0xbe000214) &0x0F) | 0x80 ;
  1850. sysset_HDMI_Downscale(1);
  1851. /* Init external hdmi switch */
  1852. hdmi_switch_init();
  1853. #ifdef HDMI_EN_OFK
  1854. DRV_HDMI_Power(1);
  1855. HDMI_PHY_Enable(TRUE);
  1856. HDMI_RegisterWrite(HDMIRX_OFK_EN, 0);
  1857. OFK_INIT(0);
  1858. HDMI_RegisterWrite(HDMIRX_OFK_EN, 1);
  1859. OFK_RUN_FSM(0);
  1860. HDMI_RegisterWrite(HDMIRX_OFK_EN, 0);
  1861. OFK_INIT(1);
  1862. HDMI_RegisterWrite(HDMIRX_OFK_EN, 1);
  1863. OFK_RUN_FSM(1);
  1864. HDMI_RegisterWrite(HDMIRX_OFK_EN, 0);
  1865. OFK_INIT(2);
  1866. HDMI_RegisterWrite(HDMIRX_OFK_EN, 1);
  1867. OFK_RUN_FSM(2);
  1868. HDMI_RegisterWrite(HDMIRX_OFK_EN, 0);
  1869. HDMI_PHY_Enable(FALSE);
  1870. #else
  1871. ///////////////////// OFK Calibration default setting = 0x10 /////////////////////
  1872. HDMI_RegisterWrite(HDMIRX_OFK_coef_D0_b1_b0, (0x10 & 0x3));
  1873. HDMI_RegisterWrite(HDMIRX_OFK_coef_D0_b4_b2, (0x10 >> 2));
  1874. HDMI_RegisterWrite(HDMIRX_OFK_coef_D1_b1_b0, (0x10 & 0x3));
  1875. HDMI_RegisterWrite(HDMIRX_OFK_coef_D1_b4_b2, (0x10 >> 2));
  1876. HDMI_RegisterWrite(HDMIRX_OFK_coef_D2_b1_b0, (0x10 & 0x3));
  1877. HDMI_RegisterWrite(HDMIRX_OFK_coef_D2_b4_b2, (0x10 >> 2));
  1878. //////////////////////////////////////////////////////////////////////////////////
  1879. #endif
  1880. #ifndef INIT_BY_KMF
  1881. DRV_HDMI_Power(1);
  1882. DRV_HDMI_Enable(0);
  1883. #else
  1884. DRV_HDMI_Power(0);
  1885. #endif
  1886. DRV_CEC_Init();
  1887. #ifdef CONFIG_HDMI_SUPPORT_MHL
  1888. #ifdef CONFIG_HDMI_MHL_PORT
  1889. if(CONFIG_HDMI_MHL_PORT==0)
  1890. {
  1891. HDMI_RegisterWrite(HDMIRX_R_mhl_port_sel, 0);//Support MHL in Port:A
  1892. sysset_cbus_port_sel(HDMI_PORT_A);
  1893. DRV_HDMI_Enable(0);
  1894. }
  1895. else if(CONFIG_HDMI_MHL_PORT==1)
  1896. {
  1897. HDMI_RegisterWrite(HDMIRX_R_mhl_port_sel, 1);//Support MHL in Port:B
  1898. sysset_cbus_port_sel(HDMI_PORT_B);
  1899. DRV_HDMI_Enable(1);
  1900. }
  1901. 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
  1902. {
  1903. HDMI_RegisterWrite(HDMIRX_R_mhl_port_sel, 3);//Let A and B keep in HDMI Mode
  1904. }
  1905. #endif
  1906. if(MHL_CBUS_Init==FALSE)
  1907. {
  1908. MHL_CBUS_Initial();
  1909. MHL_CBUS_Init=TRUE;
  1910. }
  1911. DRV_HDMI_Disable();
  1912. ///* Start MHL CBUS Work */
  1913. //MHL_CBUS_Work_Enable(TRUE);
  1914. #else
  1915. sysset_VbusEnable(0);
  1916. sysset_Set_CD_SENSE_VALUE(CD_SENSE_CFG_INTERNAL_LOW);
  1917. #endif
  1918. #ifdef CONFIG_HDMI_HPD_BEHAVIOR_435654
  1919. #ifdef CONFIG_SUPPORT_CEC_TV
  1920. {
  1921. BootRomShareData_t BootRomShareData;
  1922. UINT8 CECOn;
  1923. UINT8 CecTvAutoPwrOn;
  1924. sfs_fread(SPI_KMFSHARE_FLASHID, &BootRomShareData, sizeof(BootRomShareData_t), 0);
  1925. CECOn = BootRomShareData.CECControlOnoff;
  1926. CecTvAutoPwrOn = BootRomShareData.CecTvAutoPwrOn;
  1927. hdmidbg("%s CECOn = %d \n", __FUNCTION__,CECOn);
  1928. hdmidbg("%s CecTvAutoPwrOn = %d \n", __FUNCTION__,CecTvAutoPwrOn);
  1929. if (CECOn == TRUE)
  1930. {
  1931. if(CecTvAutoPwrOn == 0x63)
  1932. HDMI_ENTER_SOURCE_TOGGLE_HPD=TRUE;
  1933. }
  1934. }
  1935. #else
  1936. #endif
  1937. #endif
  1938. HDMI_Init=TRUE;
  1939. return 0;
  1940. }
  1941. void DRV_HDMI_Exit(void)
  1942. {
  1943. hdmidbg("%s\n", __FUNCTION__);
  1944. /* Disable hdmi */
  1945. DRV_HDMI_Disable();
  1946. /* Exit cec driver */
  1947. DRV_CEC_Exit();
  1948. /* Remove device node */
  1949. cdev_del(&hdmirx_cdev);
  1950. unregister_chrdev_region(hdmirx_devno, 0);
  1951. return;
  1952. }
  1953. UINT32 hdmi_clk_flag=0;
  1954. void DRV_HDMI_Power(BOOL bPwr)
  1955. {
  1956. hdmidbg("%s(%s)\n", __FUNCTION__, bPwr ? "on" :"off");
  1957. if (bPwr)
  1958. {
  1959. /* Enable HDMI Clock PD */
  1960. sysset_hdmi_tmdsclk(false);
  1961. if ( hdmi_clk_flag == 0 ) {
  1962. drv_gated_clk_ctrl(GATED_F24MCLK_HDMI, GATED_PASS_CLK);
  1963. drv_gated_clk_ctrl(GATED_MCLK_HDMI, GATED_PASS_CLK);
  1964. hdmi_clk_flag = 1;
  1965. }
  1966. }
  1967. else
  1968. {
  1969. /* Disable hdmi */
  1970. DRV_HDMI_Disable();
  1971. /* Disable HDMI Clock PD */
  1972. sysset_hdmi_tmdsclk(true);
  1973. #ifndef CONFIG_HDMI_SUPPORT_MHL //do not turn off HDMI power for MHL application
  1974. if ( hdmi_clk_flag == 1 ) {
  1975. drv_gated_clk_ctrl(GATED_F24MCLK_HDMI, GATED_STOP_CLK);
  1976. drv_gated_clk_ctrl(GATED_MCLK_HDMI, GATED_STOP_CLK);
  1977. hdmi_clk_flag = 0;
  1978. }
  1979. #endif
  1980. }
  1981. /* Power up/down hdmi switch */
  1982. hdmi_switch_power(bPwr);
  1983. }
  1984. void DRV_HDMI_IR_PowerOff(UINT32 power_down_option)
  1985. {
  1986. #ifdef CONFIG_SUPPORT_MONITOR
  1987. if(power_down_option == HDMI_POWER_OFF_REASON_NOSIGNAL)
  1988. {
  1989. hdmidbg("ignore hpd operation");
  1990. HDMI_POWER_OFF_STATUS = HDMI_POWER_OFF_REASON_NOSIGNAL;
  1991. }
  1992. else
  1993. {
  1994. hdmidbg("set hpd low");
  1995. hdmi_apply_hpd(DRV_HDMI_PORT_ALL , DRV_HPD_LEVEL_LOW);
  1996. }
  1997. #endif
  1998. #ifdef CONFIG_HDMI_SUPPORT_MHL
  1999. sysset_Cbus_Z_CBUS_SINK_DISCOVER(Z_CBUS_SINK_DISCOVER_CFG_OFF);
  2000. #endif
  2001. /* Disable hdmi */
  2002. DRV_HDMI_Disable();
  2003. HDMI_Set_PLL_Mode(HDMI_PLL_MODE_OFF);
  2004. /* Disable HDMI Clock PD */
  2005. sysset_hdmi_tmdsclk(true);
  2006. #ifndef CONFIG_HDMI_SUPPORT_MHL
  2007. drv_gated_clk_ctrl(GATED_F24MCLK_HDMI, GATED_STOP_CLK);
  2008. drv_gated_clk_ctrl(GATED_MCLK_HDMI, GATED_STOP_CLK);
  2009. #endif
  2010. sysset_Set_CD_SENSE_VALUE(CD_SENSE_CFG_INTERNAL_LOW);
  2011. /* Power up/down hdmi switch */
  2012. hdmi_switch_power(FALSE);
  2013. }
  2014. #ifndef INIT_BY_KMF
  2015. module_init(DRV_HDMI_Init);
  2016. module_exit(DRV_HDMI_Exit);
  2017. #endif
  2018. MODULE_LICENSE("Dual BSD/GPL");