mt8193_ckgen_vfy.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488
  1. #if defined(CONFIG_MTK_MULTIBRIDGE_SUPPORT)
  2. #define MT8193_CKGEN_VFY 1
  3. #if MT8193_CKGEN_VFY
  4. #include <linux/slab.h>
  5. #include <linux/init.h>
  6. #include <linux/module.h>
  7. #include <linux/delay.h>
  8. #include <linux/errno.h>
  9. #include <linux/sched.h>
  10. #include <linux/types.h>
  11. #include <linux/wait.h>
  12. #include <linux/spinlock.h>
  13. #include <linux/interrupt.h>
  14. #include <linux/platform_device.h>
  15. #include <linux/cdev.h>
  16. #include "mt8193.h"
  17. #include "mt8193_ckgen.h"
  18. int mt8193_ckgen_config_pad_level_shift(int i4GroupNum, int i4TurnLow)
  19. {
  20. u32 u4Tmp;
  21. pr_debug("[CKGEN] mt8193_ckgen_config_pad_level_shift() %d, %d\n", i4GroupNum, i4TurnLow);
  22. if (i4TurnLow == 0) {
  23. /* 3.3V->1.8V */
  24. u4Tmp = CKGEN_READ32(REG_RW_LS_CTRL);
  25. u4Tmp |= LS_CTRL_SHIFT_LOW_EN;
  26. CKGEN_WRITE32(REG_RW_LS_CTRL, u4Tmp);
  27. u4Tmp &= (~(1U<<i4GroupNum));
  28. CKGEN_WRITE32(REG_RW_LS_CTRL, u4Tmp);
  29. } else {
  30. /* 1.8V -> 3.3V */
  31. u4Tmp = CKGEN_READ32(REG_RW_LS_CTRL);
  32. u4Tmp |= LS_CTRL_SHIFT_HIGH_EN;
  33. CKGEN_WRITE32(REG_RW_LS_CTRL, u4Tmp);
  34. u4Tmp |= (1U<<i4GroupNum);
  35. CKGEN_WRITE32(REG_RW_LS_CTRL, u4Tmp);
  36. }
  37. pr_debug("[CKGEN] LS_CTRL: 0x%x\n", u4Tmp);
  38. return 0;
  39. }
  40. u32 mt8193_ckgen_reg_rw_test(u16 addr)
  41. {
  42. u32 u4Loop = 0;
  43. pr_debug("[CKGEN] mt8193_ckgen_reg_rw_test() 0x%x\n", addr);
  44. for (; u4Loop < 0xFFFF; u4Loop += 0x10) {
  45. CKGEN_WRITE32(addr, u4Loop);
  46. if (CKGEN_READ32(addr) != u4Loop) {
  47. pr_err("[CKGEN] reg rw test fail at loop 0x%x\n", u4Loop);
  48. return -1;
  49. }
  50. }
  51. pr_debug("[CKGEN] mt8193_ckgen_reg_rw_test() success at 0x%x\n", addr);
  52. return 0;
  53. }
  54. u32 mt8193_ckgen_bus_clk_switch_xtal_test(u16 addr)
  55. {
  56. /* switch bus clock to 32k. pdwn dcxo. rw register */
  57. u32 u4Tmp = 0;
  58. /* swicth bus clock to 32k */
  59. u4Tmp = CKGEN_READ32(REG_RW_BUS_CKCFG);
  60. CKGEN_WRITE32(REG_RW_BUS_CKCFG, (u4Tmp & (~(0xF))) | CLK_BUS_SEL_32K);
  61. return 0;
  62. }
  63. u32 mt8193_io_agent_test(void)
  64. {
  65. u32 u4Tmp = 0;
  66. pr_debug("[CKGEN] IO AGENT TEST ------------------------------------------\n");
  67. IO_WRITE32(0x1000, 0x500, 0x55555555);
  68. u4Tmp = IO_READ32(0x1000, 0x500);
  69. if (u4Tmp == 0x55555555)
  70. pr_debug("[CKGEN] TEST PASS at 0x1500\n");
  71. else
  72. pr_err("[CKGEN] TEST FAIL at 0x1500. [0x%x] !!!!!!!!!!\n", u4Tmp);
  73. IO_WRITE32(0x0, 0x18, 0x55555555);
  74. u4Tmp = IO_READ32(0x0, 0x18);
  75. if (u4Tmp == 0x55555555)
  76. pr_debug("[CKGEN] TEST PASS at 0x18\n");
  77. else
  78. pr_err("[CKGEN] TEST FAIL at 0x18. [0x%x] !!!!!!!!!!\n", u4Tmp);
  79. IO_WRITE32(0x0, 0x0408, 0x55555555);
  80. u4Tmp = IO_READ32(0x0, 0x408);
  81. if (u4Tmp == 0x55555555)
  82. pr_debug("[CKGEN] TEST PASS at 0x408\n");
  83. else
  84. pr_err("[CKGEN] TEST FAIL at 0x408. [0x%x] !!!!!!!!!!\n", u4Tmp);
  85. IO_WRITE32(0x0, 0x0608, 0x55555555);
  86. u4Tmp = IO_READ32(0x0, 0x608);
  87. if (u4Tmp == 0x55555555)
  88. pr_debug("[CKGEN] TEST PASS at 0x608\n");
  89. else
  90. pr_err("[CKGEN] TEST FAIL at 0x608. [0x%x] !!!!!!!!!!\n", u4Tmp);
  91. IO_WRITE32(0x0, 0x0a10, 0x55555555);
  92. u4Tmp = IO_READ32(0x0, 0xa10);
  93. if (u4Tmp == 0x00055555)
  94. pr_debug("[CKGEN] TEST PASS at 0xa10\n");
  95. else
  96. pr_err("[CKGEN] TEST FAIL at 0xa10. [0x%x] !!!!!!!!!!\n", u4Tmp);
  97. IO_WRITE32(0x1000, 0x200, 0xaaaaffff);
  98. u4Tmp = IO_READ32(0x1000, 0x200);
  99. if (u4Tmp == 0xaaaaffff)
  100. pr_debug("[CKGEN] TEST PASS at 0x1200\n");
  101. else
  102. pr_err("[CKGEN] TEST FAIL at 0x1200. [0x%x] !!!!!!!!!!\n", u4Tmp);
  103. IO_WRITE32(0x1000, 0x608, 0x05550555);
  104. u4Tmp = IO_READ32(0x1000, 0x608);
  105. if (u4Tmp == 0x05550555)
  106. pr_debug("[CKGEN] TEST PASS at 0x1608\n");
  107. else
  108. pr_err("[CKGEN] TEST FAIL at 0x1608. [0x%x] !!!!!!!!!!\n", u4Tmp);
  109. IO_WRITE32(0x1000, 0x708, 0x55555555);
  110. u4Tmp = IO_READ32(0x1000, 0x708);
  111. if (u4Tmp == 0x55555555)
  112. pr_debug("[CKGEN] TEST PASS at 0x1708\n");
  113. else
  114. pr_err("[CKGEN] TEST FAIL at 0x1708. [0x%x] !!!!!!!!!!\n", u4Tmp);
  115. IO_WRITE32(0x1000, 0xd00, 0x55555555);
  116. u4Tmp = IO_READ32(0x1000, 0xd00);
  117. if (u4Tmp == 0x55555555)
  118. pr_debug("[CKGEN] TEST PASS at 0x1d00\n");
  119. else
  120. pr_err("[CKGEN] TEST FAIL at 0x1d00. [0x%x] !!!!!!!!!!\n", u4Tmp);
  121. IO_WRITE32(0x1000, 0xd00, 0xaaaaaaaa);
  122. u4Tmp = IO_READ32(0x1000, 0xd00);
  123. if (u4Tmp == 0xaaaaaaaa)
  124. pr_debug("[CKGEN] TEST PASS at 0x1d00\n");
  125. else
  126. pr_err("[CKGEN] TEST FAIL at 0x1d00. [0x%x] !!!!!!!!!!\n", u4Tmp);
  127. pr_debug("[CKGEN] IO AGENT TEST FINISH ------------------------------------------\n");
  128. return 0;
  129. }
  130. void mt8193_hdmi_on_test(void)
  131. {
  132. int i = 0;
  133. u32 u4Crc = 0;
  134. mt8193_i2c_write(0x1254, 0x00000323);
  135. msleep(100);
  136. mt8193_i2c_write(0x101c, 0x00000004);
  137. msleep(100);
  138. mt8193_i2c_write(0x1328, 0x00009999);
  139. msleep(100);
  140. mt8193_i2c_write(0x1334, 0x0020008f);
  141. msleep(100);
  142. mt8193_i2c_write(0x1338, 0xd4a88f00);
  143. msleep(100);
  144. mt8193_i2c_write(0x1344, 0x00008012);
  145. msleep(100);
  146. mt8193_i2c_write(0x1348, 0x11ff0000);
  147. msleep(100);
  148. mt8193_i2c_write(0x1334, 0x0030008f);
  149. msleep(100);
  150. mt8193_i2c_write(0x02d4, 0x02);
  151. msleep(100);
  152. mt8193_i2c_write(0x02d8, 0x80);
  153. msleep(100);
  154. mt8193_i2c_write(0x0448, 0x00000);
  155. msleep(100);
  156. mt8193_i2c_write(0x0450, 0x2);
  157. msleep(100);
  158. mt8193_i2c_write(0x0608, 0x80000005);
  159. msleep(100);
  160. mt8193_i2c_write(0x065c, 0x0000000f);
  161. msleep(100);
  162. mt8193_i2c_write(0x0604, 0x00000040);
  163. msleep(100);
  164. mt8193_i2c_write(0x061c, 0x00104000);
  165. msleep(100);
  166. mt8193_i2c_write(0x0624, 0x02ee07bc);
  167. msleep(100);
  168. mt8193_i2c_write(0x0628, 0x00030005);
  169. msleep(100);
  170. mt8193_i2c_write(0x0630, 0x0080057f);
  171. msleep(100);
  172. mt8193_i2c_write(0x0634, 0x001002df);
  173. msleep(100);
  174. mt8193_i2c_write(0x0638, 0x001002df);
  175. msleep(100);
  176. mt8193_i2c_write(0x0620, 0x000207ba);
  177. msleep(100);
  178. mt8193_i2c_write(0x0600, 0x00000001);
  179. msleep(100);
  180. mt8193_i2c_write(0x060c, 0x00000002);
  181. msleep(100);
  182. mt8193_i2c_write(0x0700, 0x02ee07bc);
  183. msleep(100);
  184. mt8193_i2c_write(0x0704, 0x00030005);
  185. msleep(100);
  186. mt8193_i2c_write(0x0708, 0x01000080);
  187. msleep(100);
  188. mt8193_i2c_write(0x070c, 0x02d00500);
  189. msleep(100);
  190. mt8193_i2c_write(0x0710, 0x00000203);
  191. msleep(100);
  192. mt8193_i2c_write(0x0714, 0x00ff8844);
  193. msleep(100);
  194. mt8193_i2c_write(0x0718, 0x000000ff);
  195. msleep(100);
  196. for (; i < 100; i++) {
  197. u32 u4Crc_2 = 0;
  198. mt8193_i2c_write(0x071c, 2);
  199. msleep(50);
  200. mt8193_i2c_write(0x071c, 1);
  201. msleep(50);
  202. mt8193_i2c_read(0x0720, &u4Crc_2);
  203. msleep(50);
  204. if (i > 1 && u4Crc_2 != u4Crc) {
  205. pr_err("[HDMI] CHECK CRC ERROR! 0x%x, 0x%x, %d\n", u4Crc, u4Crc_2, i);
  206. break;
  207. } else {
  208. pr_debug("[HDMI] CHECK CRC OK %d\n", i);
  209. }
  210. u4Crc = u4Crc_2;
  211. }
  212. }
  213. void mt8193_spm_control_test(int u4Func)
  214. {
  215. pr_debug("[CKGEN] mt8193_spm_control_test()enters. %d\n", u4Func);
  216. /* mt8193_io_agent_test(); */
  217. if (u4Func == 0) {
  218. /* loop 1 */
  219. mt8193_lvds_sys_spm_control(false);
  220. msleep(1000);
  221. mt8193_hdmi_sys_spm_control(false);
  222. msleep(1000);
  223. mt8193_nfi_sys_spm_control(false);
  224. msleep(1000);
  225. mt8193_lvds_sys_spm_control(true);
  226. msleep(1000);
  227. mt8193_hdmi_sys_spm_control(true);
  228. msleep(1000);
  229. mt8193_nfi_sys_spm_control(true);
  230. msleep(1000);
  231. mt8193_io_agent_test();
  232. /* loop 2 */
  233. mt8193_hdmi_sys_spm_control(false);
  234. msleep(1000);
  235. mt8193_lvds_sys_spm_control(false);
  236. msleep(1000);
  237. mt8193_nfi_sys_spm_control(false);
  238. msleep(1000);
  239. mt8193_lvds_sys_spm_control(true);
  240. msleep(1000);
  241. mt8193_hdmi_sys_spm_control(true);
  242. msleep(1000);
  243. mt8193_nfi_sys_spm_control(true);
  244. msleep(1000);
  245. mt8193_io_agent_test();
  246. /* loop 3 */
  247. mt8193_nfi_sys_spm_control(false);
  248. msleep(1000);
  249. mt8193_lvds_sys_spm_control(false);
  250. msleep(1000);
  251. mt8193_hdmi_sys_spm_control(false);
  252. msleep(1000);
  253. mt8193_lvds_sys_spm_control(true);
  254. msleep(1000);
  255. mt8193_hdmi_sys_spm_control(true);
  256. msleep(1000);
  257. mt8193_nfi_sys_spm_control(true);
  258. msleep(1000);
  259. mt8193_io_agent_test();
  260. /* loop 4 */
  261. mt8193_lvds_sys_spm_control(false);
  262. msleep(1000);
  263. mt8193_nfi_sys_spm_control(false);
  264. msleep(1000);
  265. mt8193_hdmi_sys_spm_control(false);
  266. msleep(1000);
  267. mt8193_lvds_sys_spm_control(true);
  268. msleep(1000);
  269. mt8193_hdmi_sys_spm_control(true);
  270. msleep(1000);
  271. mt8193_nfi_sys_spm_control(true);
  272. msleep(1000);
  273. mt8193_io_agent_test();
  274. /* loop 5 */
  275. mt8193_hdmi_sys_spm_control(false);
  276. msleep(1000);
  277. mt8193_lvds_sys_spm_control(false);
  278. msleep(1000);
  279. mt8193_nfi_sys_spm_control(false);
  280. msleep(1000);
  281. mt8193_lvds_sys_spm_control(true);
  282. msleep(1000);
  283. mt8193_hdmi_sys_spm_control(true);
  284. msleep(1000);
  285. mt8193_nfi_sys_spm_control(true);
  286. msleep(1000);
  287. mt8193_io_agent_test();
  288. } else if (u4Func == 1) {
  289. /*
  290. step 1: turn off digital
  291. step 2: turn off analog
  292. step3: BUS CLK SWITCH TO 32K
  293. step4: PULL LOW EN_BB & CK_SEL
  294. Step5: PULL UP EN_BB & CK_SEL
  295. step6: BUS CLK SWITCH to 26M
  296. step7: turn on analog
  297. step8: turn on digital
  298. step9: test function
  299. */
  300. /* lvds spm ctrl test */
  301. mt8193_lvds_sys_spm_control(false);
  302. msleep(100);
  303. /*mt8193_hdmi_sys_spm_control(false);*/
  304. msleep(100);
  305. /*mt8193_nfi_sys_spm_control(false);*/
  306. msleep(100);
  307. mt8193_lvds_ana_pwr_control(false);
  308. msleep(100);
  309. /*mt8193_hdmi_ana_pwr_control(false);*/
  310. msleep(100);
  311. mt8193_pllgp_ana_pwr_control(false);
  312. msleep(100);
  313. /*mt8193_nfi_ana_pwr_control(false);*/
  314. msleep(1000);
  315. /* bus clk switch to 32K*/
  316. mt8193_bus_clk_switch(true);
  317. msleep(20);
  318. /* pull low en_bb */
  319. /* mt8193_en_bb_ctrl(true); */
  320. msleep(100);
  321. /* pull up en_bb */
  322. /* mt8193_en_bb_ctrl(false); */
  323. /* msleep(20); */
  324. /* bus clk switch to 26M */
  325. mt8193_bus_clk_switch(false);
  326. /*mt8193_nfi_ana_pwr_control(true);*/
  327. msleep(100);
  328. mt8193_pllgp_ana_pwr_control(true);
  329. msleep(100);
  330. /*mt8193_hdmi_ana_pwr_control(true);*/
  331. msleep(100);
  332. mt8193_lvds_ana_pwr_control(true);
  333. msleep(100);
  334. mt8193_lvds_sys_spm_control(true);
  335. msleep(100);
  336. /*mt8193_hdmi_sys_spm_control(true);*/
  337. msleep(100);
  338. /*mt8193_nfi_sys_spm_control(true);*/
  339. msleep(100);
  340. /* lcm_mt8193_lvds_on_test();*/
  341. } else if (u4Func == 2) {
  342. /*int i = 0;*/
  343. /*for (; i<=1000; i++) { */
  344. /*pr_debug("[CKGEN] LOOP %d START-------------------------------------\n", i);*/
  345. /* hdmi spm ctrl test */
  346. msleep(1000);
  347. mt8193_lvds_ana_pwr_control(false);
  348. msleep(20);
  349. mt8193_hdmi_ana_pwr_control(false);
  350. msleep(20);
  351. mt8193_pllgp_ana_pwr_control(false);
  352. msleep(20);
  353. mt8193_nfi_ana_pwr_control(false);
  354. msleep(20);
  355. mt8193_lvds_sys_spm_control(false);
  356. msleep(20);
  357. mt8193_hdmi_sys_spm_control(false);
  358. msleep(20);
  359. mt8193_nfi_sys_spm_control(false);
  360. msleep(20);
  361. /* bus clk switch to 32K */
  362. mt8193_bus_clk_switch(true);
  363. msleep(1000);
  364. /* pull low en_bb */
  365. /*mt8193_en_bb_ctrl(true);*/
  366. /*msleep(100);*/
  367. /* pull up en_bb*/
  368. /*mt8193_en_bb_ctrl(false);*/
  369. /*msleep(1);*/
  370. /* bus clk switch to 26M */
  371. mt8193_bus_clk_switch(false);
  372. msleep(20);
  373. mt8193_lvds_sys_spm_control(true);
  374. msleep(20);
  375. mt8193_hdmi_sys_spm_control(true);
  376. msleep(20);
  377. mt8193_nfi_sys_spm_control(true);
  378. msleep(20);
  379. mt8193_nfi_ana_pwr_control(true);
  380. msleep(20);
  381. mt8193_pllgp_ana_pwr_control(true);
  382. msleep(20);
  383. mt8193_hdmi_ana_pwr_control(true);
  384. msleep(20);
  385. mt8193_lvds_ana_pwr_control(true);
  386. msleep(1000);
  387. /*pr_debug("[CKGEN] LOOP %d END-------------------------------------\n", i); */
  388. /*}*/
  389. /*mt8193_hdmi_on_test();*/
  390. } else if (u4Func == 3) {
  391. /* nfi spm ctrl test */
  392. mt8193_nfi_sys_spm_control(false);
  393. msleep(1000);
  394. mt8193_nfi_sys_spm_control(true);
  395. msleep(1000);
  396. mt8193_io_agent_test();
  397. } else if (u4Func == 4) {
  398. /* bus clk switch to 32K */
  399. mt8193_bus_clk_switch(true);
  400. msleep(20);
  401. /* pull low en_bb */
  402. /* mt8193_en_bb_ctrl(true); */
  403. } else if (u4Func == 5) {
  404. /* pull up en_bb */
  405. /* mt8193_en_bb_ctrl(false); */
  406. /* bus clk switch to 32K */
  407. mt8193_bus_clk_switch(false);
  408. }
  409. pr_debug("[CKGEN] mt8193_spm_control() exit\n");
  410. }
  411. #endif
  412. #endif