mt65xx_lcm_list.c 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  1. /* Copyright Statement:
  2. *
  3. * This software/firmware and related documentation ("MediaTek Software") are
  4. * protected under relevant copyright laws. The information contained herein
  5. * is confidential and proprietary to MediaTek Inc. and/or its licensors.
  6. * Without the prior written permission of MediaTek inc. and/or its licensors,
  7. * any reproduction, modification, use or disclosure of MediaTek Software,
  8. * and information contained herein, in whole or in part, shall be strictly prohibited.
  9. */
  10. /* MediaTek Inc. (C) 2015. All rights reserved.
  11. *
  12. * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
  13. * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
  14. * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON
  15. * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
  16. * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
  17. * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
  18. * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
  19. * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
  20. * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH
  21. * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES
  22. * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES
  23. * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK
  24. * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
  25. * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND
  26. * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
  27. * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
  28. * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO
  29. * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
  30. */
  31. #include <lcm_drv.h>
  32. #ifdef BUILD_LK
  33. #include <platform/disp_drv_platform.h>
  34. #else
  35. #include <linux/delay.h>
  36. #include <mach/mt_gpio.h>
  37. #endif
  38. /* used to identify float ID PIN status */
  39. #define LCD_HW_ID_STATUS_LOW 0
  40. #define LCD_HW_ID_STATUS_HIGH 1
  41. #define LCD_HW_ID_STATUS_FLOAT 0x02
  42. #define LCD_HW_ID_STATUS_ERROR 0x03
  43. #ifdef BUILD_LK
  44. #define LCD_DEBUG(fmt) dprintf(CRITICAL, fmt)
  45. #else
  46. #define LCD_DEBUG(fmt) printk(fmt)
  47. #endif
  48. extern LCM_DRIVER hct_otm1285a_dsi_vdo_hd_boe;
  49. extern LCM_DRIVER hct_ili9881_dsi_vdo_hd_cpt;
  50. extern LCM_DRIVER hct_hx8394f_dsi_vdo_hd_cmi;
  51. extern LCM_DRIVER hct_otm1282_dsi_vdo_hd_auo;
  52. extern LCM_DRIVER hct_rm68200_dsi_vdo_hd_cpt;
  53. extern LCM_DRIVER hct_rm68200_dsi_vdo_hd_tm_50_xld;
  54. extern LCM_DRIVER hct_nt35521s_dsi_vdo_hd_boe_50_xld;
  55. extern LCM_DRIVER hct_hx8394d_dsi_vdo_hd_cmi;
  56. LCM_DRIVER *lcm_driver_list[] = {
  57. #if defined(HCT_OTM1285A_DSI_VDO_HD_BOE)
  58. &hct_otm1285a_dsi_vdo_hd_boe,
  59. #endif
  60. #if defined(HCT_ILI9881_DSI_VDO_HD_CPT)
  61. &hct_ili9881_dsi_vdo_hd_cpt,
  62. #endif
  63. #if defined(HCT_HX8394F_DSI_VDO_HD_CMI)
  64. &hct_hx8394f_dsi_vdo_hd_cmi,
  65. #endif
  66. #if defined(HCT_OTM1282_DSI_VDO_HD_AUO)
  67. &hct_otm1282_dsi_vdo_hd_auo,
  68. #endif
  69. #if defined(HCT_RM68200_DSI_VDO_HD_CPT)
  70. &hct_rm68200_dsi_vdo_hd_cpt,
  71. #endif
  72. #if defined(HCT_RM68200_DSI_VDO_HD_TM_50_XLD)
  73. &hct_rm68200_dsi_vdo_hd_tm_50_xld,
  74. #endif
  75. #if defined(HCT_NT35521S_DSI_VDO_HD_BOE_50_XLD)
  76. &hct_nt35521s_dsi_vdo_hd_boe_50_xld,
  77. #endif
  78. #if defined(HCT_HX8394D_DSI_VDO_HD_CMI)
  79. &hct_hx8394d_dsi_vdo_hd_cmi,
  80. #endif
  81. };
  82. #define LCM_COMPILE_ASSERT(condition) LCM_COMPILE_ASSERT_X(condition, __LINE__)
  83. #define LCM_COMPILE_ASSERT_X(condition, line) LCM_COMPILE_ASSERT_XX(condition, line)
  84. #define LCM_COMPILE_ASSERT_XX(condition, line) char assertion_failed_at_line_##line[(condition)?1 : -1]
  85. unsigned int lcm_count = sizeof(lcm_driver_list) / sizeof(LCM_DRIVER *);
  86. LCM_COMPILE_ASSERT(0 != sizeof(lcm_driver_list) / sizeof(LCM_DRIVER *));
  87. #if defined(NT35520_HD720_DSI_CMD_TM) | defined(NT35520_HD720_DSI_CMD_BOE) | defined(NT35521_HD720_DSI_VDO_BOE) | defined(NT35521_HD720_DSI_VIDEO_TM)
  88. #ifdef BUILD_LK
  89. extern void mdelay(unsigned long msec);
  90. #endif
  91. static unsigned char lcd_id_pins_value = 0xFF;
  92. /******************************************************************************
  93. Function: which_lcd_module_triple
  94. Description: read LCD ID PIN status,could identify three status:highlowfloat
  95. Input: none
  96. Output: none
  97. Return: LCD ID1|ID0 value
  98. Others:
  99. ******************************************************************************/
  100. unsigned char which_lcd_module_triple(void)
  101. {
  102. unsigned char high_read0 = 0;
  103. unsigned char low_read0 = 0;
  104. unsigned char high_read1 = 0;
  105. unsigned char low_read1 = 0;
  106. unsigned char lcd_id0 = 0;
  107. unsigned char lcd_id1 = 0;
  108. unsigned char lcd_id = 0;
  109. /* Solve Coverity scan warning : check return value */
  110. unsigned int ret = 0;
  111. /* only recognise once */
  112. if (0xFF != lcd_id_pins_value) {
  113. return lcd_id_pins_value;
  114. }
  115. /* Solve Coverity scan warning : check return value */
  116. ret = mt_set_gpio_mode(GPIO_DISP_ID0_PIN, GPIO_MODE_00);
  117. if (0 != ret) {
  118. LCD_DEBUG("ID0 mt_set_gpio_mode fail\n");
  119. }
  120. ret = mt_set_gpio_dir(GPIO_DISP_ID0_PIN, GPIO_DIR_IN);
  121. if (0 != ret) {
  122. LCD_DEBUG("ID0 mt_set_gpio_dir fail\n");
  123. }
  124. ret = mt_set_gpio_pull_enable(GPIO_DISP_ID0_PIN, GPIO_PULL_ENABLE);
  125. if (0 != ret) {
  126. LCD_DEBUG("ID0 mt_set_gpio_pull_enable fail\n");
  127. }
  128. ret = mt_set_gpio_mode(GPIO_DISP_ID1_PIN, GPIO_MODE_00);
  129. if (0 != ret) {
  130. LCD_DEBUG("ID1 mt_set_gpio_mode fail\n");
  131. }
  132. ret = mt_set_gpio_dir(GPIO_DISP_ID1_PIN, GPIO_DIR_IN);
  133. if (0 != ret) {
  134. LCD_DEBUG("ID1 mt_set_gpio_dir fail\n");
  135. }
  136. ret = mt_set_gpio_pull_enable(GPIO_DISP_ID1_PIN, GPIO_PULL_ENABLE);
  137. if (0 != ret) {
  138. LCD_DEBUG("ID1 mt_set_gpio_pull_enable fail\n");
  139. }
  140. /* pull down ID0 ID1 PIN */
  141. ret = mt_set_gpio_pull_select(GPIO_DISP_ID0_PIN, GPIO_PULL_DOWN);
  142. if (0 != ret) {
  143. LCD_DEBUG("ID0 mt_set_gpio_pull_select->Down fail\n");
  144. }
  145. ret = mt_set_gpio_pull_select(GPIO_DISP_ID1_PIN, GPIO_PULL_DOWN);
  146. if (0 != ret) {
  147. LCD_DEBUG("ID1 mt_set_gpio_pull_select->Down fail\n");
  148. }
  149. /* delay 100ms , for discharging capacitance */
  150. mdelay(100);
  151. /* get ID0 ID1 status */
  152. low_read0 = mt_get_gpio_in(GPIO_DISP_ID0_PIN);
  153. low_read1 = mt_get_gpio_in(GPIO_DISP_ID1_PIN);
  154. /* pull up ID0 ID1 PIN */
  155. ret = mt_set_gpio_pull_select(GPIO_DISP_ID0_PIN, GPIO_PULL_UP);
  156. if (0 != ret) {
  157. LCD_DEBUG("ID0 mt_set_gpio_pull_select->UP fail\n");
  158. }
  159. ret = mt_set_gpio_pull_select(GPIO_DISP_ID1_PIN, GPIO_PULL_UP);
  160. if (0 != ret) {
  161. LCD_DEBUG("ID1 mt_set_gpio_pull_select->UP fail\n");
  162. }
  163. /* delay 100ms , for charging capacitance */
  164. mdelay(100);
  165. /* get ID0 ID1 status */
  166. high_read0 = mt_get_gpio_in(GPIO_DISP_ID0_PIN);
  167. high_read1 = mt_get_gpio_in(GPIO_DISP_ID1_PIN);
  168. if (low_read0 != high_read0) {
  169. /*float status , pull down ID0 ,to prevent electric leakage */
  170. ret = mt_set_gpio_pull_select(GPIO_DISP_ID0_PIN, GPIO_PULL_DOWN);
  171. if (0 != ret) {
  172. LCD_DEBUG("ID0 mt_set_gpio_pull_select->Down fail\n");
  173. }
  174. lcd_id0 = LCD_HW_ID_STATUS_FLOAT;
  175. } else if ((LCD_HW_ID_STATUS_LOW == low_read0) && (LCD_HW_ID_STATUS_LOW == high_read0)) {
  176. /*low status , pull down ID0 ,to prevent electric leakage */
  177. ret = mt_set_gpio_pull_select(GPIO_DISP_ID0_PIN, GPIO_PULL_DOWN);
  178. if (0 != ret) {
  179. LCD_DEBUG("ID0 mt_set_gpio_pull_select->Down fail\n");
  180. }
  181. lcd_id0 = LCD_HW_ID_STATUS_LOW;
  182. } else if ((LCD_HW_ID_STATUS_HIGH == low_read0) && (LCD_HW_ID_STATUS_HIGH == high_read0)) {
  183. /*high status , pull up ID0 ,to prevent electric leakage */
  184. ret = mt_set_gpio_pull_select(GPIO_DISP_ID0_PIN, GPIO_PULL_UP);
  185. if (0 != ret) {
  186. LCD_DEBUG("ID0 mt_set_gpio_pull_select->UP fail\n");
  187. }
  188. lcd_id0 = LCD_HW_ID_STATUS_HIGH;
  189. } else {
  190. LCD_DEBUG(" Read LCD_id0 error\n");
  191. ret = mt_set_gpio_pull_select(GPIO_DISP_ID0_PIN, GPIO_PULL_DISABLE);
  192. if (0 != ret) {
  193. LCD_DEBUG("ID0 mt_set_gpio_pull_select->Disbale fail\n");
  194. }
  195. lcd_id0 = LCD_HW_ID_STATUS_ERROR;
  196. }
  197. if (low_read1 != high_read1) {
  198. /*float status , pull down ID1 ,to prevent electric leakage */
  199. ret = mt_set_gpio_pull_select(GPIO_DISP_ID1_PIN, GPIO_PULL_DOWN);
  200. if (0 != ret) {
  201. LCD_DEBUG("ID1 mt_set_gpio_pull_select->Down fail\n");
  202. }
  203. lcd_id1 = LCD_HW_ID_STATUS_FLOAT;
  204. } else if ((LCD_HW_ID_STATUS_LOW == low_read1) && (LCD_HW_ID_STATUS_LOW == high_read1)) {
  205. /*low status , pull down ID1 ,to prevent electric leakage */
  206. ret = mt_set_gpio_pull_select(GPIO_DISP_ID1_PIN, GPIO_PULL_DOWN);
  207. if (0 != ret) {
  208. LCD_DEBUG("ID1 mt_set_gpio_pull_select->Down fail\n");
  209. }
  210. lcd_id1 = LCD_HW_ID_STATUS_LOW;
  211. } else if ((LCD_HW_ID_STATUS_HIGH == low_read1) && (LCD_HW_ID_STATUS_HIGH == high_read1)) {
  212. /*high status , pull up ID1 ,to prevent electric leakage */
  213. ret = mt_set_gpio_pull_select(GPIO_DISP_ID1_PIN, GPIO_PULL_UP);
  214. if (0 != ret) {
  215. LCD_DEBUG("ID1 mt_set_gpio_pull_select->UP fail\n");
  216. }
  217. lcd_id1 = LCD_HW_ID_STATUS_HIGH;
  218. } else {
  219. LCD_DEBUG(" Read LCD_id1 error\n");
  220. ret = mt_set_gpio_pull_select(GPIO_DISP_ID1_PIN, GPIO_PULL_DISABLE);
  221. if (0 != ret) {
  222. LCD_DEBUG("ID1 mt_set_gpio_pull_select->Disable fail\n");
  223. }
  224. lcd_id1 = LCD_HW_ID_STATUS_ERROR;
  225. }
  226. #ifdef BUILD_LK
  227. dprintf(CRITICAL, "which_lcd_module_triple,lcd_id0:%d\n", lcd_id0);
  228. dprintf(CRITICAL, "which_lcd_module_triple,lcd_id1:%d\n", lcd_id1);
  229. #else
  230. printk("which_lcd_module_triple,lcd_id0:%d\n", lcd_id0);
  231. printk("which_lcd_module_triple,lcd_id1:%d\n", lcd_id1);
  232. #endif
  233. lcd_id = lcd_id0 | (lcd_id1 << 2);
  234. #ifdef BUILD_LK
  235. dprintf(CRITICAL, "which_lcd_module_triple,lcd_id:%d\n", lcd_id);
  236. #else
  237. printk("which_lcd_module_triple,lcd_id:%d\n", lcd_id);
  238. #endif
  239. lcd_id_pins_value = lcd_id;
  240. return lcd_id;
  241. }
  242. #endif