diu_ch7301.c 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Copyright 2014 Freescale Semiconductor, Inc.
  4. * Authors: Priyanka Jain <Priyanka.Jain@freescale.com>
  5. * Wang Dongsheng <dongsheng.wang@freescale.com>
  6. *
  7. * This file is copied and modified from the original t1040qds/diu.c.
  8. * Encoder can be used in T104x and LSx Platform.
  9. */
  10. #include <common.h>
  11. #include <stdio_dev.h>
  12. #include <i2c.h>
  13. #define I2C_DVI_INPUT_DATA_FORMAT_REG 0x1F
  14. #define I2C_DVI_PLL_CHARGE_CNTL_REG 0x33
  15. #define I2C_DVI_PLL_DIVIDER_REG 0x34
  16. #define I2C_DVI_PLL_SUPPLY_CNTL_REG 0x35
  17. #define I2C_DVI_PLL_FILTER_REG 0x36
  18. #define I2C_DVI_TEST_PATTERN_REG 0x48
  19. #define I2C_DVI_POWER_MGMT_REG 0x49
  20. #define I2C_DVI_LOCK_STATE_REG 0x4D
  21. #define I2C_DVI_SYNC_POLARITY_REG 0x56
  22. /*
  23. * Set VSYNC/HSYNC to active high. This is polarity of sync signals
  24. * from DIU->DVI. The DIU default is active igh, so DVI is set to
  25. * active high.
  26. */
  27. #define I2C_DVI_INPUT_DATA_FORMAT_VAL 0x98
  28. #define I2C_DVI_PLL_CHARGE_CNTL_HIGH_SPEED_VAL 0x06
  29. #define I2C_DVI_PLL_DIVIDER_HIGH_SPEED_VAL 0x26
  30. #define I2C_DVI_PLL_FILTER_HIGH_SPEED_VAL 0xA0
  31. #define I2C_DVI_PLL_CHARGE_CNTL_LOW_SPEED_VAL 0x08
  32. #define I2C_DVI_PLL_DIVIDER_LOW_SPEED_VAL 0x16
  33. #define I2C_DVI_PLL_FILTER_LOW_SPEED_VAL 0x60
  34. /* Clear test pattern */
  35. #define I2C_DVI_TEST_PATTERN_VAL 0x18
  36. /* Exit Power-down mode */
  37. #define I2C_DVI_POWER_MGMT_VAL 0xC0
  38. /* Monitor polarity is handled via DVI Sync Polarity Register */
  39. #define I2C_DVI_SYNC_POLARITY_VAL 0x00
  40. /* Programming of HDMI Chrontel CH7301 connector */
  41. int diu_set_dvi_encoder(unsigned int pixclock)
  42. {
  43. int ret;
  44. u8 temp;
  45. temp = I2C_DVI_TEST_PATTERN_VAL;
  46. ret = i2c_write(CONFIG_SYS_I2C_DVI_ADDR, I2C_DVI_TEST_PATTERN_REG, 1,
  47. &temp, 1);
  48. if (ret) {
  49. puts("I2C: failed to select proper dvi test pattern\n");
  50. return ret;
  51. }
  52. temp = I2C_DVI_INPUT_DATA_FORMAT_VAL;
  53. ret = i2c_write(CONFIG_SYS_I2C_DVI_ADDR, I2C_DVI_INPUT_DATA_FORMAT_REG,
  54. 1, &temp, 1);
  55. if (ret) {
  56. puts("I2C: failed to select dvi input data format\n");
  57. return ret;
  58. }
  59. /* Set Sync polarity register */
  60. temp = I2C_DVI_SYNC_POLARITY_VAL;
  61. ret = i2c_write(CONFIG_SYS_I2C_DVI_ADDR, I2C_DVI_SYNC_POLARITY_REG, 1,
  62. &temp, 1);
  63. if (ret) {
  64. puts("I2C: failed to select dvi syc polarity\n");
  65. return ret;
  66. }
  67. /* Set PLL registers based on pixel clock rate*/
  68. if (pixclock > 65000000) {
  69. temp = I2C_DVI_PLL_CHARGE_CNTL_HIGH_SPEED_VAL;
  70. ret = i2c_write(CONFIG_SYS_I2C_DVI_ADDR,
  71. I2C_DVI_PLL_CHARGE_CNTL_REG, 1, &temp, 1);
  72. if (ret) {
  73. puts("I2C: failed to select dvi pll charge_cntl\n");
  74. return ret;
  75. }
  76. temp = I2C_DVI_PLL_DIVIDER_HIGH_SPEED_VAL;
  77. ret = i2c_write(CONFIG_SYS_I2C_DVI_ADDR,
  78. I2C_DVI_PLL_DIVIDER_REG, 1, &temp, 1);
  79. if (ret) {
  80. puts("I2C: failed to select dvi pll divider\n");
  81. return ret;
  82. }
  83. temp = I2C_DVI_PLL_FILTER_HIGH_SPEED_VAL;
  84. ret = i2c_write(CONFIG_SYS_I2C_DVI_ADDR,
  85. I2C_DVI_PLL_FILTER_REG, 1, &temp, 1);
  86. if (ret) {
  87. puts("I2C: failed to select dvi pll filter\n");
  88. return ret;
  89. }
  90. } else {
  91. temp = I2C_DVI_PLL_CHARGE_CNTL_LOW_SPEED_VAL;
  92. ret = i2c_write(CONFIG_SYS_I2C_DVI_ADDR,
  93. I2C_DVI_PLL_CHARGE_CNTL_REG, 1, &temp, 1);
  94. if (ret) {
  95. puts("I2C: failed to select dvi pll charge_cntl\n");
  96. return ret;
  97. }
  98. temp = I2C_DVI_PLL_DIVIDER_LOW_SPEED_VAL;
  99. ret = i2c_write(CONFIG_SYS_I2C_DVI_ADDR,
  100. I2C_DVI_PLL_DIVIDER_REG, 1, &temp, 1);
  101. if (ret) {
  102. puts("I2C: failed to select dvi pll divider\n");
  103. return ret;
  104. }
  105. temp = I2C_DVI_PLL_FILTER_LOW_SPEED_VAL;
  106. ret = i2c_write(CONFIG_SYS_I2C_DVI_ADDR,
  107. I2C_DVI_PLL_FILTER_REG, 1, &temp, 1);
  108. if (ret) {
  109. puts("I2C: failed to select dvi pll filter\n");
  110. return ret;
  111. }
  112. }
  113. temp = I2C_DVI_POWER_MGMT_VAL;
  114. ret = i2c_write(CONFIG_SYS_I2C_DVI_ADDR, I2C_DVI_POWER_MGMT_REG, 1,
  115. &temp, 1);
  116. if (ret) {
  117. puts("I2C: failed to select dvi power mgmt\n");
  118. return ret;
  119. }
  120. udelay(500);
  121. return 0;
  122. }