l5f31188.c 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. /*
  2. * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
  3. * Hyungwon Hwang <human.hwang@samsung.com>
  4. *
  5. * SPDX-License-Identifier: GPL-2.0+
  6. */
  7. #include <common.h>
  8. #include <asm/arch/mipi_dsim.h>
  9. #define SCAN_FROM_LEFT_TO_RIGHT 0
  10. #define SCAN_FROM_RIGHT_TO_LEFT 1
  11. #define SCAN_FROM_TOP_TO_BOTTOM 0
  12. #define SCAN_FROM_BOTTOM_TO_TOP 1
  13. static void l5f31188_sleep_in(struct mipi_dsim_device *dev,
  14. struct mipi_dsim_master_ops *ops)
  15. {
  16. ops->cmd_write(dev, MIPI_DSI_DCS_SHORT_WRITE, 0x10, 0x00);
  17. }
  18. static void l5f31188_sleep_out(struct mipi_dsim_device *dev,
  19. struct mipi_dsim_master_ops *ops)
  20. {
  21. ops->cmd_write(dev, MIPI_DSI_DCS_SHORT_WRITE, 0x11, 0x00);
  22. }
  23. static void l5f31188_set_gamma(struct mipi_dsim_device *dev,
  24. struct mipi_dsim_master_ops *ops)
  25. {
  26. ops->cmd_write(dev, MIPI_DSI_DCS_SHORT_WRITE, 0x26, 0x00);
  27. }
  28. static void l5f31188_display_off(struct mipi_dsim_device *dev,
  29. struct mipi_dsim_master_ops *ops)
  30. {
  31. ops->cmd_write(dev, MIPI_DSI_DCS_SHORT_WRITE, 0x28, 0x00);
  32. }
  33. static void l5f31188_display_on(struct mipi_dsim_device *dev,
  34. struct mipi_dsim_master_ops *ops)
  35. {
  36. ops->cmd_write(dev, MIPI_DSI_DCS_SHORT_WRITE, 0x29, 0x00);
  37. }
  38. static void l5f31188_ctl_memory_access(struct mipi_dsim_device *dev,
  39. struct mipi_dsim_master_ops *ops,
  40. int h_direction, int v_direction)
  41. {
  42. ops->cmd_write(dev, MIPI_DSI_DCS_SHORT_WRITE_PARAM, 0x36,
  43. (((h_direction & 0x1) << 1) | (v_direction & 0x1)));
  44. }
  45. static void l5f31188_set_pixel_format(struct mipi_dsim_device *dev,
  46. struct mipi_dsim_master_ops *ops)
  47. {
  48. ops->cmd_write(dev, MIPI_DSI_DCS_SHORT_WRITE_PARAM, 0x3A, 0x70);
  49. }
  50. static void l5f31188_write_disbv(struct mipi_dsim_device *dev,
  51. struct mipi_dsim_master_ops *ops, unsigned int brightness)
  52. {
  53. ops->cmd_write(dev, MIPI_DSI_DCS_SHORT_WRITE_PARAM, 0x51, brightness);
  54. }
  55. static void l5f31188_write_ctrld(struct mipi_dsim_device *dev,
  56. struct mipi_dsim_master_ops *ops)
  57. {
  58. ops->cmd_write(dev, MIPI_DSI_DCS_SHORT_WRITE_PARAM, 0x53, 0x2C);
  59. }
  60. static void l5f31188_write_cabc(struct mipi_dsim_device *dev,
  61. struct mipi_dsim_master_ops *ops,
  62. unsigned int wm_mode)
  63. {
  64. ops->cmd_write(dev, MIPI_DSI_DCS_SHORT_WRITE_PARAM, 0x55, wm_mode);
  65. }
  66. static void l5f31188_write_cabcmb(struct mipi_dsim_device *dev,
  67. struct mipi_dsim_master_ops *ops, unsigned int min_brightness)
  68. {
  69. ops->cmd_write(dev, MIPI_DSI_DCS_SHORT_WRITE_PARAM, 0x5E,
  70. min_brightness);
  71. }
  72. static void l5f31188_set_extension(struct mipi_dsim_device *dev,
  73. struct mipi_dsim_master_ops *ops)
  74. {
  75. const unsigned char data_to_send[] = {
  76. 0xB9, 0xFF, 0x83, 0x94
  77. };
  78. ops->cmd_write(dev, MIPI_DSI_DCS_LONG_WRITE,
  79. (unsigned int)data_to_send, ARRAY_SIZE(data_to_send));
  80. }
  81. static void l5f31188_set_dgc_lut(struct mipi_dsim_device *dev,
  82. struct mipi_dsim_master_ops *ops)
  83. {
  84. const unsigned char data_to_send[] = {
  85. 0xC1, 0x01, 0x00, 0x04, 0x0E, 0x18, 0x1E, 0x26,
  86. 0x2F, 0x36, 0x3E, 0x47, 0x4E, 0x56, 0x5D, 0x65,
  87. 0x6D, 0x75, 0x7D, 0x84, 0x8C, 0x94, 0x9C, 0xA4,
  88. 0xAD, 0xB5, 0xBD, 0xC5, 0xCC, 0xD4, 0xDE, 0xE5,
  89. 0xEE, 0xF7, 0xFF, 0x3F, 0x9A, 0xCE, 0xD4, 0x21,
  90. 0xA1, 0x26, 0x54, 0x00, 0x00, 0x04, 0x0E, 0x19,
  91. 0x1F, 0x27, 0x30, 0x37, 0x40, 0x48, 0x50, 0x58,
  92. 0x60, 0x67, 0x6F, 0x77, 0x7F, 0x87, 0x8F, 0x97,
  93. 0x9F, 0xA7, 0xB0, 0xB8, 0xC0, 0xC8, 0xCE, 0xD8,
  94. 0xE0, 0xE7, 0xF0, 0xF7, 0xFF, 0x3C, 0xEB, 0xFD,
  95. 0x2F, 0x66, 0xA8, 0x2C, 0x46, 0x00, 0x00, 0x04,
  96. 0x0E, 0x18, 0x1E, 0x26, 0x30, 0x38, 0x41, 0x4A,
  97. 0x52, 0x5A, 0x62, 0x6B, 0x73, 0x7B, 0x83, 0x8C,
  98. 0x94, 0x9C, 0xA5, 0xAD, 0xB6, 0xBD, 0xC5, 0xCC,
  99. 0xD4, 0xDD, 0xE3, 0xEB, 0xF2, 0xF9, 0xFF, 0x3F,
  100. 0xA4, 0x8A, 0x8F, 0xC7, 0x33, 0xF5, 0xE9, 0x00
  101. };
  102. ops->cmd_write(dev, MIPI_DSI_DCS_LONG_WRITE,
  103. (unsigned int)data_to_send, ARRAY_SIZE(data_to_send));
  104. }
  105. static void l5f31188_set_tcon(struct mipi_dsim_device *dev,
  106. struct mipi_dsim_master_ops *ops)
  107. {
  108. const unsigned char data_to_send[] = {
  109. 0xC7, 0x00, 0x20
  110. };
  111. ops->cmd_write(dev, MIPI_DSI_DCS_LONG_WRITE,
  112. (unsigned int)data_to_send, ARRAY_SIZE(data_to_send));
  113. }
  114. static void l5f31188_set_ptba(struct mipi_dsim_device *dev,
  115. struct mipi_dsim_master_ops *ops)
  116. {
  117. const unsigned char data_to_send[] = {
  118. 0xBF, 0x06, 0x10
  119. };
  120. ops->cmd_write(dev, MIPI_DSI_DCS_LONG_WRITE,
  121. (unsigned int)data_to_send, ARRAY_SIZE(data_to_send));
  122. }
  123. static void l5f31188_set_eco(struct mipi_dsim_device *dev,
  124. struct mipi_dsim_master_ops *ops)
  125. {
  126. ops->cmd_write(dev, MIPI_DSI_DCS_SHORT_WRITE_PARAM, 0xC6, 0x0C);
  127. }
  128. static int l5f31188_panel_init(struct mipi_dsim_device *dev)
  129. {
  130. struct mipi_dsim_master_ops *ops = dev->master_ops;
  131. l5f31188_set_extension(dev, ops);
  132. l5f31188_set_dgc_lut(dev, ops);
  133. l5f31188_set_eco(dev, ops);
  134. l5f31188_set_tcon(dev, ops);
  135. l5f31188_set_ptba(dev, ops);
  136. l5f31188_set_gamma(dev, ops);
  137. l5f31188_ctl_memory_access(dev, ops,
  138. SCAN_FROM_LEFT_TO_RIGHT, SCAN_FROM_TOP_TO_BOTTOM);
  139. l5f31188_set_pixel_format(dev, ops);
  140. l5f31188_write_disbv(dev, ops, 0xFF);
  141. l5f31188_write_ctrld(dev, ops);
  142. l5f31188_write_cabc(dev, ops, 0x0);
  143. l5f31188_write_cabcmb(dev, ops, 0x0);
  144. l5f31188_sleep_out(dev, ops);
  145. /* 120 msec */
  146. udelay(120 * 1000);
  147. return 0;
  148. }
  149. static void l5f31188_display_enable(struct mipi_dsim_device *dev)
  150. {
  151. struct mipi_dsim_master_ops *ops = dev->master_ops;
  152. l5f31188_display_on(dev, ops);
  153. }
  154. static struct mipi_dsim_lcd_driver l5f31188_dsim_ddi_driver = {
  155. .name = "l5f31188",
  156. .id = -1,
  157. .mipi_panel_init = l5f31188_panel_init,
  158. .mipi_display_on = l5f31188_display_enable,
  159. };
  160. void l5f31188_init(void)
  161. {
  162. exynos_mipi_dsi_register_lcd_driver(&l5f31188_dsim_ddi_driver);
  163. }