exynos_dp_lowlevel.c 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257
  1. /*
  2. * Copyright (C) 2012 Samsung Electronics
  3. *
  4. * Author: Donghwa Lee <dh09.lee@samsung.com>
  5. *
  6. * SPDX-License-Identifier: GPL-2.0+
  7. */
  8. #include <config.h>
  9. #include <common.h>
  10. #include <linux/err.h>
  11. #include <asm/arch/cpu.h>
  12. #include <asm/arch/dp_info.h>
  13. #include <asm/arch/dp.h>
  14. #include <fdtdec.h>
  15. #include <libfdt.h>
  16. /* Declare global data pointer */
  17. DECLARE_GLOBAL_DATA_PTR;
  18. struct exynos_dp *dp_regs;
  19. void exynos_dp_set_base_addr(void)
  20. {
  21. #ifdef CONFIG_OF_CONTROL
  22. unsigned int node = fdtdec_next_compatible(gd->fdt_blob,
  23. 0, COMPAT_SAMSUNG_EXYNOS5_DP);
  24. if (node <= 0)
  25. debug("exynos_dp: Can't get device node for dp\n");
  26. dp_regs = (struct exynos_dp *)fdtdec_get_addr(gd->fdt_blob,
  27. node, "reg");
  28. if (dp_regs == NULL)
  29. debug("Can't get the DP base address\n");
  30. #else
  31. dp_regs = (struct exynos_dp *)samsung_get_base_dp();
  32. #endif
  33. }
  34. static void exynos_dp_enable_video_input(unsigned int enable)
  35. {
  36. unsigned int reg;
  37. reg = readl(&dp_regs->video_ctl1);
  38. reg &= ~VIDEO_EN_MASK;
  39. /* enable video input*/
  40. if (enable)
  41. reg |= VIDEO_EN_MASK;
  42. writel(reg, &dp_regs->video_ctl1);
  43. return;
  44. }
  45. void exynos_dp_enable_video_bist(unsigned int enable)
  46. {
  47. /*enable video bist*/
  48. unsigned int reg;
  49. reg = readl(&dp_regs->video_ctl4);
  50. reg &= ~VIDEO_BIST_MASK;
  51. /*enable video bist*/
  52. if (enable)
  53. reg |= VIDEO_BIST_MASK;
  54. writel(reg, &dp_regs->video_ctl4);
  55. return;
  56. }
  57. void exynos_dp_enable_video_mute(unsigned int enable)
  58. {
  59. unsigned int reg;
  60. reg = readl(&dp_regs->video_ctl1);
  61. reg &= ~(VIDEO_MUTE_MASK);
  62. if (enable)
  63. reg |= VIDEO_MUTE_MASK;
  64. writel(reg, &dp_regs->video_ctl1);
  65. return;
  66. }
  67. static void exynos_dp_init_analog_param(void)
  68. {
  69. unsigned int reg;
  70. /*
  71. * Set termination
  72. * Normal bandgap, Normal swing, Tx terminal registor 61 ohm
  73. * 24M Phy clock, TX digital logic power is 100:1.0625V
  74. */
  75. reg = SEL_BG_NEW_BANDGAP | TX_TERMINAL_CTRL_61_OHM |
  76. SWING_A_30PER_G_NORMAL;
  77. writel(reg, &dp_regs->analog_ctl1);
  78. reg = SEL_24M | TX_DVDD_BIT_1_0625V;
  79. writel(reg, &dp_regs->analog_ctl2);
  80. /*
  81. * Set power source for internal clk driver to 1.0625v.
  82. * Select current reference of TX driver current to 00:Ipp/2+Ic/2.
  83. * Set VCO range of PLL +- 0uA
  84. */
  85. reg = DRIVE_DVDD_BIT_1_0625V | SEL_CURRENT_DEFAULT | VCO_BIT_000_MICRO;
  86. writel(reg, &dp_regs->analog_ctl3);
  87. /*
  88. * Set AUX TX terminal resistor to 102 ohm
  89. * Set AUX channel amplitude control
  90. */
  91. reg = PD_RING_OSC | AUX_TERMINAL_CTRL_52_OHM | TX_CUR1_2X | TX_CUR_4_MA;
  92. writel(reg, &dp_regs->pll_filter_ctl1);
  93. /*
  94. * PLL loop filter bandwidth
  95. * For 2.7Gbps: 175KHz, For 1.62Gbps: 234KHz
  96. * PLL digital power select: 1.2500V
  97. */
  98. reg = CH3_AMP_0_MV | CH2_AMP_0_MV | CH1_AMP_0_MV | CH0_AMP_0_MV;
  99. writel(reg, &dp_regs->amp_tuning_ctl);
  100. /*
  101. * PLL loop filter bandwidth
  102. * For 2.7Gbps: 175KHz, For 1.62Gbps: 234KHz
  103. * PLL digital power select: 1.1250V
  104. */
  105. reg = DP_PLL_LOOP_BIT_DEFAULT | DP_PLL_REF_BIT_1_1250V;
  106. writel(reg, &dp_regs->pll_ctl);
  107. }
  108. static void exynos_dp_init_interrupt(void)
  109. {
  110. /* Set interrupt registers to initial states */
  111. /*
  112. * Disable interrupt
  113. * INT pin assertion polarity. It must be configured
  114. * correctly according to ICU setting.
  115. * 1 = assert high, 0 = assert low
  116. */
  117. writel(INT_POL, &dp_regs->int_ctl);
  118. /* Clear pending regisers */
  119. writel(0xff, &dp_regs->common_int_sta1);
  120. writel(0xff, &dp_regs->common_int_sta2);
  121. writel(0xff, &dp_regs->common_int_sta3);
  122. writel(0xff, &dp_regs->common_int_sta4);
  123. writel(0xff, &dp_regs->int_sta);
  124. /* 0:mask,1: unmask */
  125. writel(0x00, &dp_regs->int_sta_mask1);
  126. writel(0x00, &dp_regs->int_sta_mask2);
  127. writel(0x00, &dp_regs->int_sta_mask3);
  128. writel(0x00, &dp_regs->int_sta_mask4);
  129. writel(0x00, &dp_regs->int_sta_mask);
  130. }
  131. void exynos_dp_reset(void)
  132. {
  133. unsigned int reg_func_1;
  134. /*dp tx sw reset*/
  135. writel(RESET_DP_TX, &dp_regs->tx_sw_reset);
  136. exynos_dp_enable_video_input(DP_DISABLE);
  137. exynos_dp_enable_video_bist(DP_DISABLE);
  138. exynos_dp_enable_video_mute(DP_DISABLE);
  139. /* software reset */
  140. reg_func_1 = MASTER_VID_FUNC_EN_N | SLAVE_VID_FUNC_EN_N |
  141. AUD_FIFO_FUNC_EN_N | AUD_FUNC_EN_N |
  142. HDCP_FUNC_EN_N | SW_FUNC_EN_N;
  143. writel(reg_func_1, &dp_regs->func_en1);
  144. writel(reg_func_1, &dp_regs->func_en2);
  145. mdelay(1);
  146. exynos_dp_init_analog_param();
  147. exynos_dp_init_interrupt();
  148. return;
  149. }
  150. void exynos_dp_enable_sw_func(unsigned int enable)
  151. {
  152. unsigned int reg;
  153. reg = readl(&dp_regs->func_en1);
  154. reg &= ~(SW_FUNC_EN_N);
  155. if (!enable)
  156. reg |= SW_FUNC_EN_N;
  157. writel(reg, &dp_regs->func_en1);
  158. return;
  159. }
  160. unsigned int exynos_dp_set_analog_power_down(unsigned int block, u32 enable)
  161. {
  162. unsigned int reg;
  163. reg = readl(&dp_regs->phy_pd);
  164. switch (block) {
  165. case AUX_BLOCK:
  166. reg &= ~(AUX_PD);
  167. if (enable)
  168. reg |= AUX_PD;
  169. break;
  170. case CH0_BLOCK:
  171. reg &= ~(CH0_PD);
  172. if (enable)
  173. reg |= CH0_PD;
  174. break;
  175. case CH1_BLOCK:
  176. reg &= ~(CH1_PD);
  177. if (enable)
  178. reg |= CH1_PD;
  179. break;
  180. case CH2_BLOCK:
  181. reg &= ~(CH2_PD);
  182. if (enable)
  183. reg |= CH2_PD;
  184. break;
  185. case CH3_BLOCK:
  186. reg &= ~(CH3_PD);
  187. if (enable)
  188. reg |= CH3_PD;
  189. break;
  190. case ANALOG_TOTAL:
  191. reg &= ~PHY_PD;
  192. if (enable)
  193. reg |= PHY_PD;
  194. break;
  195. case POWER_ALL:
  196. reg &= ~(PHY_PD | AUX_PD | CH0_PD | CH1_PD | CH2_PD |
  197. CH3_PD);
  198. if (enable)
  199. reg |= (PHY_PD | AUX_PD | CH0_PD | CH1_PD |
  200. CH2_PD | CH3_PD);
  201. break;
  202. default:
  203. printf("DP undefined block number : %d\n", block);
  204. return -1;
  205. }
  206. writel(reg, &dp_regs->phy_pd);
  207. return 0;
  208. }
  209. unsigned int exynos_dp_get_pll_lock_status(void)
  210. {
  211. unsigned int reg;
  212. reg = readl(&dp_regs->debug_ctl);
  213. if (reg & PLL_LOCK)
  214. return PLL_LOCKED;
  215. else
  216. return PLL_UNLOCKED;
  217. }
  218. static void exynos_dp_set_pll_power(unsigned int enable)
  219. {
  220. unsigned int reg;
  221. reg = readl(&dp_regs->pll_ctl);
  222. reg &= ~(DP_PLL_PD);
  223. if (!enable)
  224. reg |= DP_PLL_PD;
  225. writel(reg, &dp_regs->pll_ctl);
  226. }
  227. int exynos_dp_init_analog_func(void)
  228. {
  229. int ret = EXYNOS_DP_SUCCESS;
  230. unsigned int retry_cnt = 10;
  231. unsigned int reg;
  232. /*Power On All Analog block */
  233. exynos_dp_set_analog_power_down(POWER_ALL, DP_DISABLE);
  234. reg = PLL_LOCK_CHG;
  235. writel(reg, &dp_regs->common_int_sta1);
  236. reg = readl(&dp_regs->debug_ctl);
  237. reg &= ~(F_PLL_LOCK | PLL_LOCK_CTRL);
  238. writel(reg, &dp_regs->debug_ctl);
  239. /*Assert DP PLL Reset*/
  240. reg = readl(&dp_regs->pll_ctl);
  241. reg |= DP_PLL_RESET;
  242. writel(reg, &dp_regs->pll_ctl);
  243. mdelay(1);
  244. /*Deassert DP PLL Reset*/
  245. reg = readl(&dp_regs->pll_ctl);
  246. reg &= ~(DP_PLL_RESET);
  247. writel(reg, &dp_regs->pll_ctl);
  248. exynos_dp_set_pll_power(DP_ENABLE);
  249. while (exynos_dp_get_pll_lock_status() == PLL_UNLOCKED) {
  250. mdelay(1);
  251. retry_cnt--;
  252. if (retry_cnt == 0) {
  253. printf("DP dp's pll lock failed : retry : %d\n",
  254. retry_cnt);
  255. return -EINVAL;
  256. }
  257. }
  258. debug("dp's pll lock success(%d)\n", retry_cnt);
  259. /* Enable Serdes FIFO function and Link symbol clock domain module */
  260. reg = readl(&dp_regs->func_en2);
  261. reg &= ~(SERDES_FIFO_FUNC_EN_N | LS_CLK_DOMAIN_FUNC_EN_N
  262. | AUX_FUNC_EN_N);
  263. writel(reg, &dp_regs->func_en2);
  264. return ret;
  265. }
  266. void exynos_dp_init_hpd(void)
  267. {
  268. unsigned int reg;
  269. /* Clear interrupts releated to Hot Plug Dectect */
  270. reg = HOTPLUG_CHG | HPD_LOST | PLUG;
  271. writel(reg, &dp_regs->common_int_sta4);
  272. reg = INT_HPD;
  273. writel(reg, &dp_regs->int_sta);
  274. reg = readl(&dp_regs->sys_ctl3);
  275. reg &= ~(F_HPD | HPD_CTRL);
  276. writel(reg, &dp_regs->sys_ctl3);
  277. return;
  278. }
  279. static inline void exynos_dp_reset_aux(void)
  280. {
  281. unsigned int reg;
  282. /* Disable AUX channel module */
  283. reg = readl(&dp_regs->func_en2);
  284. reg |= AUX_FUNC_EN_N;
  285. writel(reg, &dp_regs->func_en2);
  286. return;
  287. }
  288. void exynos_dp_init_aux(void)
  289. {
  290. unsigned int reg;
  291. /* Clear inerrupts related to AUX channel */
  292. reg = RPLY_RECEIV | AUX_ERR;
  293. writel(reg, &dp_regs->int_sta);
  294. exynos_dp_reset_aux();
  295. /* Disable AUX transaction H/W retry */
  296. reg = AUX_BIT_PERIOD_EXPECTED_DELAY(3) | AUX_HW_RETRY_COUNT_SEL(3)|
  297. AUX_HW_RETRY_INTERVAL_600_MICROSECONDS;
  298. writel(reg, &dp_regs->aux_hw_retry_ctl);
  299. /* Receive AUX Channel DEFER commands equal to DEFFER_COUNT*64 */
  300. reg = DEFER_CTRL_EN | DEFER_COUNT(1);
  301. writel(reg, &dp_regs->aux_ch_defer_ctl);
  302. /* Enable AUX channel module */
  303. reg = readl(&dp_regs->func_en2);
  304. reg &= ~AUX_FUNC_EN_N;
  305. writel(reg, &dp_regs->func_en2);
  306. return;
  307. }
  308. void exynos_dp_config_interrupt(void)
  309. {
  310. unsigned int reg;
  311. /* 0: mask, 1: unmask */
  312. reg = COMMON_INT_MASK_1;
  313. writel(reg, &dp_regs->common_int_mask1);
  314. reg = COMMON_INT_MASK_2;
  315. writel(reg, &dp_regs->common_int_mask2);
  316. reg = COMMON_INT_MASK_3;
  317. writel(reg, &dp_regs->common_int_mask3);
  318. reg = COMMON_INT_MASK_4;
  319. writel(reg, &dp_regs->common_int_mask4);
  320. reg = INT_STA_MASK;
  321. writel(reg, &dp_regs->int_sta_mask);
  322. return;
  323. }
  324. unsigned int exynos_dp_get_plug_in_status(void)
  325. {
  326. unsigned int reg;
  327. reg = readl(&dp_regs->sys_ctl3);
  328. if (reg & HPD_STATUS)
  329. return 0;
  330. return -1;
  331. }
  332. unsigned int exynos_dp_detect_hpd(void)
  333. {
  334. int timeout_loop = DP_TIMEOUT_LOOP_COUNT;
  335. mdelay(2);
  336. while (exynos_dp_get_plug_in_status() != 0) {
  337. if (timeout_loop == 0)
  338. return -EINVAL;
  339. mdelay(10);
  340. timeout_loop--;
  341. }
  342. return EXYNOS_DP_SUCCESS;
  343. }
  344. unsigned int exynos_dp_start_aux_transaction(void)
  345. {
  346. unsigned int reg;
  347. unsigned int ret = 0;
  348. unsigned int retry_cnt;
  349. /* Enable AUX CH operation */
  350. reg = readl(&dp_regs->aux_ch_ctl2);
  351. reg |= AUX_EN;
  352. writel(reg, &dp_regs->aux_ch_ctl2);
  353. retry_cnt = 10;
  354. while (retry_cnt) {
  355. reg = readl(&dp_regs->int_sta);
  356. if (!(reg & RPLY_RECEIV)) {
  357. if (retry_cnt == 0) {
  358. printf("DP Reply Timeout!!\n");
  359. ret = -EAGAIN;
  360. return ret;
  361. }
  362. mdelay(1);
  363. retry_cnt--;
  364. } else
  365. break;
  366. }
  367. /* Clear interrupt source for AUX CH command reply */
  368. writel(reg, &dp_regs->int_sta);
  369. /* Clear interrupt source for AUX CH access error */
  370. reg = readl(&dp_regs->int_sta);
  371. if (reg & AUX_ERR) {
  372. printf("DP Aux Access Error\n");
  373. writel(AUX_ERR, &dp_regs->int_sta);
  374. ret = -EAGAIN;
  375. return ret;
  376. }
  377. /* Check AUX CH error access status */
  378. reg = readl(&dp_regs->aux_ch_sta);
  379. if ((reg & AUX_STATUS_MASK) != 0) {
  380. debug("DP AUX CH error happens: %x\n", reg & AUX_STATUS_MASK);
  381. ret = -EAGAIN;
  382. return ret;
  383. }
  384. return EXYNOS_DP_SUCCESS;
  385. }
  386. unsigned int exynos_dp_write_byte_to_dpcd(unsigned int reg_addr,
  387. unsigned char data)
  388. {
  389. unsigned int reg, ret;
  390. /* Clear AUX CH data buffer */
  391. reg = BUF_CLR;
  392. writel(reg, &dp_regs->buffer_data_ctl);
  393. /* Select DPCD device address */
  394. reg = AUX_ADDR_7_0(reg_addr);
  395. writel(reg, &dp_regs->aux_addr_7_0);
  396. reg = AUX_ADDR_15_8(reg_addr);
  397. writel(reg, &dp_regs->aux_addr_15_8);
  398. reg = AUX_ADDR_19_16(reg_addr);
  399. writel(reg, &dp_regs->aux_addr_19_16);
  400. /* Write data buffer */
  401. reg = (unsigned int)data;
  402. writel(reg, &dp_regs->buf_data0);
  403. /*
  404. * Set DisplayPort transaction and write 1 byte
  405. * If bit 3 is 1, DisplayPort transaction.
  406. * If Bit 3 is 0, I2C transaction.
  407. */
  408. reg = AUX_TX_COMM_DP_TRANSACTION | AUX_TX_COMM_WRITE;
  409. writel(reg, &dp_regs->aux_ch_ctl1);
  410. /* Start AUX transaction */
  411. ret = exynos_dp_start_aux_transaction();
  412. if (ret != EXYNOS_DP_SUCCESS) {
  413. printf("DP Aux transaction failed\n");
  414. return ret;
  415. }
  416. return ret;
  417. }
  418. unsigned int exynos_dp_read_byte_from_dpcd(unsigned int reg_addr,
  419. unsigned char *data)
  420. {
  421. unsigned int reg;
  422. int retval;
  423. /* Clear AUX CH data buffer */
  424. reg = BUF_CLR;
  425. writel(reg, &dp_regs->buffer_data_ctl);
  426. /* Select DPCD device address */
  427. reg = AUX_ADDR_7_0(reg_addr);
  428. writel(reg, &dp_regs->aux_addr_7_0);
  429. reg = AUX_ADDR_15_8(reg_addr);
  430. writel(reg, &dp_regs->aux_addr_15_8);
  431. reg = AUX_ADDR_19_16(reg_addr);
  432. writel(reg, &dp_regs->aux_addr_19_16);
  433. /*
  434. * Set DisplayPort transaction and read 1 byte
  435. * If bit 3 is 1, DisplayPort transaction.
  436. * If Bit 3 is 0, I2C transaction.
  437. */
  438. reg = AUX_TX_COMM_DP_TRANSACTION | AUX_TX_COMM_READ;
  439. writel(reg, &dp_regs->aux_ch_ctl1);
  440. /* Start AUX transaction */
  441. retval = exynos_dp_start_aux_transaction();
  442. if (!retval)
  443. debug("DP Aux Transaction fail!\n");
  444. /* Read data buffer */
  445. reg = readl(&dp_regs->buf_data0);
  446. *data = (unsigned char)(reg & 0xff);
  447. return retval;
  448. }
  449. unsigned int exynos_dp_write_bytes_to_dpcd(unsigned int reg_addr,
  450. unsigned int count,
  451. unsigned char data[])
  452. {
  453. unsigned int reg;
  454. unsigned int start_offset;
  455. unsigned int cur_data_count;
  456. unsigned int cur_data_idx;
  457. unsigned int retry_cnt;
  458. unsigned int ret = 0;
  459. /* Clear AUX CH data buffer */
  460. reg = BUF_CLR;
  461. writel(reg, &dp_regs->buffer_data_ctl);
  462. start_offset = 0;
  463. while (start_offset < count) {
  464. /* Buffer size of AUX CH is 16 * 4bytes */
  465. if ((count - start_offset) > 16)
  466. cur_data_count = 16;
  467. else
  468. cur_data_count = count - start_offset;
  469. retry_cnt = 5;
  470. while (retry_cnt) {
  471. /* Select DPCD device address */
  472. reg = AUX_ADDR_7_0(reg_addr + start_offset);
  473. writel(reg, &dp_regs->aux_addr_7_0);
  474. reg = AUX_ADDR_15_8(reg_addr + start_offset);
  475. writel(reg, &dp_regs->aux_addr_15_8);
  476. reg = AUX_ADDR_19_16(reg_addr + start_offset);
  477. writel(reg, &dp_regs->aux_addr_19_16);
  478. for (cur_data_idx = 0; cur_data_idx < cur_data_count;
  479. cur_data_idx++) {
  480. reg = data[start_offset + cur_data_idx];
  481. writel(reg, (unsigned int)&dp_regs->buf_data0 +
  482. (4 * cur_data_idx));
  483. }
  484. /*
  485. * Set DisplayPort transaction and write
  486. * If bit 3 is 1, DisplayPort transaction.
  487. * If Bit 3 is 0, I2C transaction.
  488. */
  489. reg = AUX_LENGTH(cur_data_count) |
  490. AUX_TX_COMM_DP_TRANSACTION | AUX_TX_COMM_WRITE;
  491. writel(reg, &dp_regs->aux_ch_ctl1);
  492. /* Start AUX transaction */
  493. ret = exynos_dp_start_aux_transaction();
  494. if (ret != EXYNOS_DP_SUCCESS) {
  495. if (retry_cnt == 0) {
  496. printf("DP Aux Transaction failed\n");
  497. return ret;
  498. }
  499. retry_cnt--;
  500. } else
  501. break;
  502. }
  503. start_offset += cur_data_count;
  504. }
  505. return ret;
  506. }
  507. unsigned int exynos_dp_read_bytes_from_dpcd(unsigned int reg_addr,
  508. unsigned int count,
  509. unsigned char data[])
  510. {
  511. unsigned int reg;
  512. unsigned int start_offset;
  513. unsigned int cur_data_count;
  514. unsigned int cur_data_idx;
  515. unsigned int retry_cnt;
  516. unsigned int ret = 0;
  517. /* Clear AUX CH data buffer */
  518. reg = BUF_CLR;
  519. writel(reg, &dp_regs->buffer_data_ctl);
  520. start_offset = 0;
  521. while (start_offset < count) {
  522. /* Buffer size of AUX CH is 16 * 4bytes */
  523. if ((count - start_offset) > 16)
  524. cur_data_count = 16;
  525. else
  526. cur_data_count = count - start_offset;
  527. retry_cnt = 5;
  528. while (retry_cnt) {
  529. /* Select DPCD device address */
  530. reg = AUX_ADDR_7_0(reg_addr + start_offset);
  531. writel(reg, &dp_regs->aux_addr_7_0);
  532. reg = AUX_ADDR_15_8(reg_addr + start_offset);
  533. writel(reg, &dp_regs->aux_addr_15_8);
  534. reg = AUX_ADDR_19_16(reg_addr + start_offset);
  535. writel(reg, &dp_regs->aux_addr_19_16);
  536. /*
  537. * Set DisplayPort transaction and read
  538. * If bit 3 is 1, DisplayPort transaction.
  539. * If Bit 3 is 0, I2C transaction.
  540. */
  541. reg = AUX_LENGTH(cur_data_count) |
  542. AUX_TX_COMM_DP_TRANSACTION | AUX_TX_COMM_READ;
  543. writel(reg, &dp_regs->aux_ch_ctl1);
  544. /* Start AUX transaction */
  545. ret = exynos_dp_start_aux_transaction();
  546. if (ret != EXYNOS_DP_SUCCESS) {
  547. if (retry_cnt == 0) {
  548. printf("DP Aux Transaction failed\n");
  549. return ret;
  550. }
  551. retry_cnt--;
  552. } else
  553. break;
  554. }
  555. for (cur_data_idx = 0; cur_data_idx < cur_data_count;
  556. cur_data_idx++) {
  557. reg = readl((unsigned int)&dp_regs->buf_data0 +
  558. 4 * cur_data_idx);
  559. data[start_offset + cur_data_idx] = (unsigned char)reg;
  560. }
  561. start_offset += cur_data_count;
  562. }
  563. return ret;
  564. }
  565. int exynos_dp_select_i2c_device(unsigned int device_addr,
  566. unsigned int reg_addr)
  567. {
  568. unsigned int reg;
  569. int retval;
  570. /* Set EDID device address */
  571. reg = device_addr;
  572. writel(reg, &dp_regs->aux_addr_7_0);
  573. writel(0x0, &dp_regs->aux_addr_15_8);
  574. writel(0x0, &dp_regs->aux_addr_19_16);
  575. /* Set offset from base address of EDID device */
  576. writel(reg_addr, &dp_regs->buf_data0);
  577. /*
  578. * Set I2C transaction and write address
  579. * If bit 3 is 1, DisplayPort transaction.
  580. * If Bit 3 is 0, I2C transaction.
  581. */
  582. reg = AUX_TX_COMM_I2C_TRANSACTION | AUX_TX_COMM_MOT |
  583. AUX_TX_COMM_WRITE;
  584. writel(reg, &dp_regs->aux_ch_ctl1);
  585. /* Start AUX transaction */
  586. retval = exynos_dp_start_aux_transaction();
  587. if (retval != 0)
  588. printf("%s: DP Aux Transaction fail!\n", __func__);
  589. return retval;
  590. }
  591. int exynos_dp_read_byte_from_i2c(unsigned int device_addr,
  592. unsigned int reg_addr,
  593. unsigned int *data)
  594. {
  595. unsigned int reg;
  596. int i;
  597. int retval;
  598. for (i = 0; i < 10; i++) {
  599. /* Clear AUX CH data buffer */
  600. reg = BUF_CLR;
  601. writel(reg, &dp_regs->buffer_data_ctl);
  602. /* Select EDID device */
  603. retval = exynos_dp_select_i2c_device(device_addr, reg_addr);
  604. if (retval != 0) {
  605. printf("DP Select EDID device fail. retry !\n");
  606. continue;
  607. }
  608. /*
  609. * Set I2C transaction and read data
  610. * If bit 3 is 1, DisplayPort transaction.
  611. * If Bit 3 is 0, I2C transaction.
  612. */
  613. reg = AUX_TX_COMM_I2C_TRANSACTION |
  614. AUX_TX_COMM_READ;
  615. writel(reg, &dp_regs->aux_ch_ctl1);
  616. /* Start AUX transaction */
  617. retval = exynos_dp_start_aux_transaction();
  618. if (retval != EXYNOS_DP_SUCCESS)
  619. printf("%s: DP Aux Transaction fail!\n", __func__);
  620. }
  621. /* Read data */
  622. if (retval == 0)
  623. *data = readl(&dp_regs->buf_data0);
  624. return retval;
  625. }
  626. int exynos_dp_read_bytes_from_i2c(unsigned int device_addr,
  627. unsigned int reg_addr, unsigned int count, unsigned char edid[])
  628. {
  629. unsigned int reg;
  630. unsigned int i, j;
  631. unsigned int cur_data_idx;
  632. unsigned int defer = 0;
  633. int retval = 0;
  634. for (i = 0; i < count; i += 16) { /* use 16 burst */
  635. for (j = 0; j < 100; j++) {
  636. /* Clear AUX CH data buffer */
  637. reg = BUF_CLR;
  638. writel(reg, &dp_regs->buffer_data_ctl);
  639. /* Set normal AUX CH command */
  640. reg = readl(&dp_regs->aux_ch_ctl2);
  641. reg &= ~ADDR_ONLY;
  642. writel(reg, &dp_regs->aux_ch_ctl2);
  643. /*
  644. * If Rx sends defer, Tx sends only reads
  645. * request without sending addres
  646. */
  647. if (!defer)
  648. retval =
  649. exynos_dp_select_i2c_device(device_addr,
  650. reg_addr + i);
  651. else
  652. defer = 0;
  653. if (retval == EXYNOS_DP_SUCCESS) {
  654. /*
  655. * Set I2C transaction and write data
  656. * If bit 3 is 1, DisplayPort transaction.
  657. * If Bit 3 is 0, I2C transaction.
  658. */
  659. reg = AUX_LENGTH(16) |
  660. AUX_TX_COMM_I2C_TRANSACTION |
  661. AUX_TX_COMM_READ;
  662. writel(reg, &dp_regs->aux_ch_ctl1);
  663. /* Start AUX transaction */
  664. retval = exynos_dp_start_aux_transaction();
  665. if (retval == 0)
  666. break;
  667. else
  668. printf("DP Aux Transaction fail!\n");
  669. }
  670. /* Check if Rx sends defer */
  671. reg = readl(&dp_regs->aux_rx_comm);
  672. if (reg == AUX_RX_COMM_AUX_DEFER ||
  673. reg == AUX_RX_COMM_I2C_DEFER) {
  674. printf("DP Defer: %d\n\n", reg);
  675. defer = 1;
  676. }
  677. }
  678. for (cur_data_idx = 0; cur_data_idx < 16; cur_data_idx++) {
  679. reg = readl((unsigned int)&dp_regs->buf_data0
  680. + 4 * cur_data_idx);
  681. edid[i + cur_data_idx] = (unsigned char)reg;
  682. }
  683. }
  684. return retval;
  685. }
  686. void exynos_dp_reset_macro(void)
  687. {
  688. unsigned int reg;
  689. reg = readl(&dp_regs->phy_test);
  690. reg |= MACRO_RST;
  691. writel(reg, &dp_regs->phy_test);
  692. /* 10 us is the minimum Macro reset time. */
  693. mdelay(1);
  694. reg &= ~MACRO_RST;
  695. writel(reg, &dp_regs->phy_test);
  696. }
  697. void exynos_dp_set_link_bandwidth(unsigned char bwtype)
  698. {
  699. unsigned int reg;
  700. reg = (unsigned int)bwtype;
  701. /* Set bandwidth to 2.7G or 1.62G */
  702. if ((bwtype == DP_LANE_BW_1_62) || (bwtype == DP_LANE_BW_2_70))
  703. writel(reg, &dp_regs->link_bw_set);
  704. }
  705. unsigned char exynos_dp_get_link_bandwidth(void)
  706. {
  707. unsigned char ret;
  708. unsigned int reg;
  709. reg = readl(&dp_regs->link_bw_set);
  710. ret = (unsigned char)reg;
  711. return ret;
  712. }
  713. void exynos_dp_set_lane_count(unsigned char count)
  714. {
  715. unsigned int reg;
  716. reg = (unsigned int)count;
  717. if ((count == DP_LANE_CNT_1) || (count == DP_LANE_CNT_2) ||
  718. (count == DP_LANE_CNT_4))
  719. writel(reg, &dp_regs->lane_count_set);
  720. }
  721. unsigned int exynos_dp_get_lane_count(void)
  722. {
  723. unsigned int reg;
  724. reg = readl(&dp_regs->lane_count_set);
  725. return reg;
  726. }
  727. unsigned char exynos_dp_get_lanex_pre_emphasis(unsigned char lanecnt)
  728. {
  729. unsigned int reg_list[DP_LANE_CNT_4] = {
  730. (unsigned int)&dp_regs->ln0_link_training_ctl,
  731. (unsigned int)&dp_regs->ln1_link_training_ctl,
  732. (unsigned int)&dp_regs->ln2_link_training_ctl,
  733. (unsigned int)&dp_regs->ln3_link_training_ctl,
  734. };
  735. return readl(reg_list[lanecnt]);
  736. }
  737. void exynos_dp_set_lanex_pre_emphasis(unsigned char request_val,
  738. unsigned char lanecnt)
  739. {
  740. unsigned int reg_list[DP_LANE_CNT_4] = {
  741. (unsigned int)&dp_regs->ln0_link_training_ctl,
  742. (unsigned int)&dp_regs->ln1_link_training_ctl,
  743. (unsigned int)&dp_regs->ln2_link_training_ctl,
  744. (unsigned int)&dp_regs->ln3_link_training_ctl,
  745. };
  746. writel(request_val, reg_list[lanecnt]);
  747. }
  748. void exynos_dp_set_lane_pre_emphasis(unsigned int level, unsigned char lanecnt)
  749. {
  750. unsigned char i;
  751. unsigned int reg;
  752. unsigned int reg_list[DP_LANE_CNT_4] = {
  753. (unsigned int)&dp_regs->ln0_link_training_ctl,
  754. (unsigned int)&dp_regs->ln1_link_training_ctl,
  755. (unsigned int)&dp_regs->ln2_link_training_ctl,
  756. (unsigned int)&dp_regs->ln3_link_training_ctl,
  757. };
  758. unsigned int reg_shift[DP_LANE_CNT_4] = {
  759. PRE_EMPHASIS_SET_0_SHIFT,
  760. PRE_EMPHASIS_SET_1_SHIFT,
  761. PRE_EMPHASIS_SET_2_SHIFT,
  762. PRE_EMPHASIS_SET_3_SHIFT
  763. };
  764. for (i = 0; i < lanecnt; i++) {
  765. reg = level << reg_shift[i];
  766. writel(reg, reg_list[i]);
  767. }
  768. }
  769. void exynos_dp_set_training_pattern(unsigned int pattern)
  770. {
  771. unsigned int reg = 0;
  772. switch (pattern) {
  773. case PRBS7:
  774. reg = SCRAMBLING_ENABLE | LINK_QUAL_PATTERN_SET_PRBS7;
  775. break;
  776. case D10_2:
  777. reg = SCRAMBLING_ENABLE | LINK_QUAL_PATTERN_SET_D10_2;
  778. break;
  779. case TRAINING_PTN1:
  780. reg = SCRAMBLING_DISABLE | SW_TRAINING_PATTERN_SET_PTN1;
  781. break;
  782. case TRAINING_PTN2:
  783. reg = SCRAMBLING_DISABLE | SW_TRAINING_PATTERN_SET_PTN2;
  784. break;
  785. case DP_NONE:
  786. reg = SCRAMBLING_ENABLE | LINK_QUAL_PATTERN_SET_DISABLE |
  787. SW_TRAINING_PATTERN_SET_NORMAL;
  788. break;
  789. default:
  790. break;
  791. }
  792. writel(reg, &dp_regs->training_ptn_set);
  793. }
  794. void exynos_dp_enable_enhanced_mode(unsigned char enable)
  795. {
  796. unsigned int reg;
  797. reg = readl(&dp_regs->sys_ctl4);
  798. reg &= ~ENHANCED;
  799. if (enable)
  800. reg |= ENHANCED;
  801. writel(reg, &dp_regs->sys_ctl4);
  802. }
  803. void exynos_dp_enable_scrambling(unsigned int enable)
  804. {
  805. unsigned int reg;
  806. reg = readl(&dp_regs->training_ptn_set);
  807. reg &= ~(SCRAMBLING_DISABLE);
  808. if (!enable)
  809. reg |= SCRAMBLING_DISABLE;
  810. writel(reg, &dp_regs->training_ptn_set);
  811. }
  812. int exynos_dp_init_video(void)
  813. {
  814. unsigned int reg;
  815. /* Clear VID_CLK_CHG[1] and VID_FORMAT_CHG[3] and VSYNC_DET[7] */
  816. reg = VSYNC_DET | VID_FORMAT_CHG | VID_CLK_CHG;
  817. writel(reg, &dp_regs->common_int_sta1);
  818. /* I_STRM__CLK detect : DE_CTL : Auto detect */
  819. reg &= ~DET_CTRL;
  820. writel(reg, &dp_regs->sys_ctl1);
  821. return 0;
  822. }
  823. void exynos_dp_config_video_slave_mode(struct edp_video_info *video_info)
  824. {
  825. unsigned int reg;
  826. /* Video Slave mode setting */
  827. reg = readl(&dp_regs->func_en1);
  828. reg &= ~(MASTER_VID_FUNC_EN_N|SLAVE_VID_FUNC_EN_N);
  829. reg |= MASTER_VID_FUNC_EN_N;
  830. writel(reg, &dp_regs->func_en1);
  831. /* Configure Interlaced for slave mode video */
  832. reg = readl(&dp_regs->video_ctl10);
  833. reg &= ~INTERACE_SCAN_CFG;
  834. reg |= (video_info->interlaced << INTERACE_SCAN_CFG_SHIFT);
  835. writel(reg, &dp_regs->video_ctl10);
  836. /* Configure V sync polarity for slave mode video */
  837. reg = readl(&dp_regs->video_ctl10);
  838. reg &= ~VSYNC_POLARITY_CFG;
  839. reg |= (video_info->v_sync_polarity << V_S_POLARITY_CFG_SHIFT);
  840. writel(reg, &dp_regs->video_ctl10);
  841. /* Configure H sync polarity for slave mode video */
  842. reg = readl(&dp_regs->video_ctl10);
  843. reg &= ~HSYNC_POLARITY_CFG;
  844. reg |= (video_info->h_sync_polarity << H_S_POLARITY_CFG_SHIFT);
  845. writel(reg, &dp_regs->video_ctl10);
  846. /*Set video mode to slave mode */
  847. reg = AUDIO_MODE_SPDIF_MODE | VIDEO_MODE_SLAVE_MODE;
  848. writel(reg, &dp_regs->soc_general_ctl);
  849. }
  850. void exynos_dp_set_video_color_format(struct edp_video_info *video_info)
  851. {
  852. unsigned int reg;
  853. /* Configure the input color depth, color space, dynamic range */
  854. reg = (video_info->dynamic_range << IN_D_RANGE_SHIFT) |
  855. (video_info->color_depth << IN_BPC_SHIFT) |
  856. (video_info->color_space << IN_COLOR_F_SHIFT);
  857. writel(reg, &dp_regs->video_ctl2);
  858. /* Set Input Color YCbCr Coefficients to ITU601 or ITU709 */
  859. reg = readl(&dp_regs->video_ctl3);
  860. reg &= ~IN_YC_COEFFI_MASK;
  861. if (video_info->ycbcr_coeff)
  862. reg |= IN_YC_COEFFI_ITU709;
  863. else
  864. reg |= IN_YC_COEFFI_ITU601;
  865. writel(reg, &dp_regs->video_ctl3);
  866. }
  867. int exynos_dp_config_video_bist(struct edp_device_info *edp_info)
  868. {
  869. unsigned int reg;
  870. unsigned int bist_type = 0;
  871. struct edp_video_info video_info = edp_info->video_info;
  872. /* For master mode, you don't need to set the video format */
  873. if (video_info.master_mode == 0) {
  874. writel(TOTAL_LINE_CFG_L(edp_info->disp_info.v_total),
  875. &dp_regs->total_ln_cfg_l);
  876. writel(TOTAL_LINE_CFG_H(edp_info->disp_info.v_total),
  877. &dp_regs->total_ln_cfg_h);
  878. writel(ACTIVE_LINE_CFG_L(edp_info->disp_info.v_res),
  879. &dp_regs->active_ln_cfg_l);
  880. writel(ACTIVE_LINE_CFG_H(edp_info->disp_info.v_res),
  881. &dp_regs->active_ln_cfg_h);
  882. writel(edp_info->disp_info.v_sync_width,
  883. &dp_regs->vsw_cfg);
  884. writel(edp_info->disp_info.v_back_porch,
  885. &dp_regs->vbp_cfg);
  886. writel(edp_info->disp_info.v_front_porch,
  887. &dp_regs->vfp_cfg);
  888. writel(TOTAL_PIXEL_CFG_L(edp_info->disp_info.h_total),
  889. &dp_regs->total_pix_cfg_l);
  890. writel(TOTAL_PIXEL_CFG_H(edp_info->disp_info.h_total),
  891. &dp_regs->total_pix_cfg_h);
  892. writel(ACTIVE_PIXEL_CFG_L(edp_info->disp_info.h_res),
  893. &dp_regs->active_pix_cfg_l);
  894. writel(ACTIVE_PIXEL_CFG_H(edp_info->disp_info.h_res),
  895. &dp_regs->active_pix_cfg_h);
  896. writel(H_F_PORCH_CFG_L(edp_info->disp_info.h_front_porch),
  897. &dp_regs->hfp_cfg_l);
  898. writel(H_F_PORCH_CFG_H(edp_info->disp_info.h_front_porch),
  899. &dp_regs->hfp_cfg_h);
  900. writel(H_SYNC_PORCH_CFG_L(edp_info->disp_info.h_sync_width),
  901. &dp_regs->hsw_cfg_l);
  902. writel(H_SYNC_PORCH_CFG_H(edp_info->disp_info.h_sync_width),
  903. &dp_regs->hsw_cfg_h);
  904. writel(H_B_PORCH_CFG_L(edp_info->disp_info.h_back_porch),
  905. &dp_regs->hbp_cfg_l);
  906. writel(H_B_PORCH_CFG_H(edp_info->disp_info.h_back_porch),
  907. &dp_regs->hbp_cfg_h);
  908. /*
  909. * Set SLAVE_I_SCAN_CFG[2], VSYNC_P_CFG[1],
  910. * HSYNC_P_CFG[0] properly
  911. */
  912. reg = (video_info.interlaced << INTERACE_SCAN_CFG_SHIFT |
  913. video_info.v_sync_polarity << V_S_POLARITY_CFG_SHIFT |
  914. video_info.h_sync_polarity << H_S_POLARITY_CFG_SHIFT);
  915. writel(reg, &dp_regs->video_ctl10);
  916. }
  917. /* BIST color bar width set--set to each bar is 32 pixel width */
  918. switch (video_info.bist_pattern) {
  919. case COLORBAR_32:
  920. bist_type = BIST_WIDTH_BAR_32_PIXEL |
  921. BIST_TYPE_COLOR_BAR;
  922. break;
  923. case COLORBAR_64:
  924. bist_type = BIST_WIDTH_BAR_64_PIXEL |
  925. BIST_TYPE_COLOR_BAR;
  926. break;
  927. case WHITE_GRAY_BALCKBAR_32:
  928. bist_type = BIST_WIDTH_BAR_32_PIXEL |
  929. BIST_TYPE_WHITE_GRAY_BLACK_BAR;
  930. break;
  931. case WHITE_GRAY_BALCKBAR_64:
  932. bist_type = BIST_WIDTH_BAR_64_PIXEL |
  933. BIST_TYPE_WHITE_GRAY_BLACK_BAR;
  934. break;
  935. case MOBILE_WHITEBAR_32:
  936. bist_type = BIST_WIDTH_BAR_32_PIXEL |
  937. BIST_TYPE_MOBILE_WHITE_BAR;
  938. break;
  939. case MOBILE_WHITEBAR_64:
  940. bist_type = BIST_WIDTH_BAR_64_PIXEL |
  941. BIST_TYPE_MOBILE_WHITE_BAR;
  942. break;
  943. default:
  944. return -1;
  945. }
  946. reg = bist_type;
  947. writel(reg, &dp_regs->video_ctl4);
  948. return 0;
  949. }
  950. unsigned int exynos_dp_is_slave_video_stream_clock_on(void)
  951. {
  952. unsigned int reg;
  953. /* Update Video stream clk detect status */
  954. reg = readl(&dp_regs->sys_ctl1);
  955. writel(reg, &dp_regs->sys_ctl1);
  956. reg = readl(&dp_regs->sys_ctl1);
  957. if (!(reg & DET_STA)) {
  958. debug("DP Input stream clock not detected.\n");
  959. return -EIO;
  960. }
  961. return EXYNOS_DP_SUCCESS;
  962. }
  963. void exynos_dp_set_video_cr_mn(unsigned int type, unsigned int m_value,
  964. unsigned int n_value)
  965. {
  966. unsigned int reg;
  967. if (type == REGISTER_M) {
  968. reg = readl(&dp_regs->sys_ctl4);
  969. reg |= FIX_M_VID;
  970. writel(reg, &dp_regs->sys_ctl4);
  971. reg = M_VID0_CFG(m_value);
  972. writel(reg, &dp_regs->m_vid0);
  973. reg = M_VID1_CFG(m_value);
  974. writel(reg, &dp_regs->m_vid1);
  975. reg = M_VID2_CFG(m_value);
  976. writel(reg, &dp_regs->m_vid2);
  977. reg = N_VID0_CFG(n_value);
  978. writel(reg, &dp_regs->n_vid0);
  979. reg = N_VID1_CFG(n_value);
  980. writel(reg, &dp_regs->n_vid1);
  981. reg = N_VID2_CFG(n_value);
  982. writel(reg, &dp_regs->n_vid2);
  983. } else {
  984. reg = readl(&dp_regs->sys_ctl4);
  985. reg &= ~FIX_M_VID;
  986. writel(reg, &dp_regs->sys_ctl4);
  987. }
  988. }
  989. void exynos_dp_set_video_timing_mode(unsigned int type)
  990. {
  991. unsigned int reg;
  992. reg = readl(&dp_regs->video_ctl10);
  993. reg &= ~FORMAT_SEL;
  994. if (type != VIDEO_TIMING_FROM_CAPTURE)
  995. reg |= FORMAT_SEL;
  996. writel(reg, &dp_regs->video_ctl10);
  997. }
  998. void exynos_dp_enable_video_master(unsigned int enable)
  999. {
  1000. unsigned int reg;
  1001. reg = readl(&dp_regs->soc_general_ctl);
  1002. if (enable) {
  1003. reg &= ~VIDEO_MODE_MASK;
  1004. reg |= VIDEO_MASTER_MODE_EN | VIDEO_MODE_MASTER_MODE;
  1005. } else {
  1006. reg &= ~VIDEO_MODE_MASK;
  1007. reg |= VIDEO_MODE_SLAVE_MODE;
  1008. }
  1009. writel(reg, &dp_regs->soc_general_ctl);
  1010. }
  1011. void exynos_dp_start_video(void)
  1012. {
  1013. unsigned int reg;
  1014. /* Enable Video input and disable Mute */
  1015. reg = readl(&dp_regs->video_ctl1);
  1016. reg |= VIDEO_EN;
  1017. writel(reg, &dp_regs->video_ctl1);
  1018. }
  1019. unsigned int exynos_dp_is_video_stream_on(void)
  1020. {
  1021. unsigned int reg;
  1022. /* Update STRM_VALID */
  1023. reg = readl(&dp_regs->sys_ctl3);
  1024. writel(reg, &dp_regs->sys_ctl3);
  1025. reg = readl(&dp_regs->sys_ctl3);
  1026. if (!(reg & STRM_VALID))
  1027. return -EIO;
  1028. return EXYNOS_DP_SUCCESS;
  1029. }