mt65xx_lcm_list.c 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  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_nt35521s_dsi_vdo_hd_boe_50_xld;
  54. extern LCM_DRIVER hct_hx8394d_dsi_vdo_hd_cmi;
  55. LCM_DRIVER *lcm_driver_list[] = {
  56. #if defined(HCT_OTM1285A_DSI_VDO_HD_BOE)
  57. &hct_otm1285a_dsi_vdo_hd_boe,
  58. #endif
  59. #if defined(HCT_ILI9881_DSI_VDO_HD_CPT)
  60. &hct_ili9881_dsi_vdo_hd_cpt,
  61. #endif
  62. #if defined(HCT_HX8394F_DSI_VDO_HD_CMI)
  63. &hct_hx8394f_dsi_vdo_hd_cmi,
  64. #endif
  65. #if defined(HCT_OTM1282_DSI_VDO_HD_AUO)
  66. &hct_otm1282_dsi_vdo_hd_auo,
  67. #endif
  68. #if defined(HCT_RM68200_DSI_VDO_HD_CPT)
  69. &hct_rm68200_dsi_vdo_hd_cpt,
  70. #endif
  71. #if defined(HCT_NT35521S_DSI_VDO_HD_BOE_50_XLD)
  72. &hct_nt35521s_dsi_vdo_hd_boe_50_xld,
  73. #endif
  74. #if defined(HCT_HX8394D_DSI_VDO_HD_CMI)
  75. &hct_hx8394d_dsi_vdo_hd_cmi,
  76. #endif
  77. };
  78. #define LCM_COMPILE_ASSERT(condition) LCM_COMPILE_ASSERT_X(condition, __LINE__)
  79. #define LCM_COMPILE_ASSERT_X(condition, line) LCM_COMPILE_ASSERT_XX(condition, line)
  80. #define LCM_COMPILE_ASSERT_XX(condition, line) char assertion_failed_at_line_##line[(condition)?1 : -1]
  81. unsigned int lcm_count = sizeof(lcm_driver_list) / sizeof(LCM_DRIVER *);
  82. LCM_COMPILE_ASSERT(0 != sizeof(lcm_driver_list) / sizeof(LCM_DRIVER *));
  83. #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)
  84. #ifdef BUILD_LK
  85. extern void mdelay(unsigned long msec);
  86. #endif
  87. static unsigned char lcd_id_pins_value = 0xFF;
  88. /******************************************************************************
  89. Function: which_lcd_module_triple
  90. Description: read LCD ID PIN status,could identify three status:highlowfloat
  91. Input: none
  92. Output: none
  93. Return: LCD ID1|ID0 value
  94. Others:
  95. ******************************************************************************/
  96. unsigned char which_lcd_module_triple(void)
  97. {
  98. unsigned char high_read0 = 0;
  99. unsigned char low_read0 = 0;
  100. unsigned char high_read1 = 0;
  101. unsigned char low_read1 = 0;
  102. unsigned char lcd_id0 = 0;
  103. unsigned char lcd_id1 = 0;
  104. unsigned char lcd_id = 0;
  105. /* Solve Coverity scan warning : check return value */
  106. unsigned int ret = 0;
  107. /* only recognise once */
  108. if (0xFF != lcd_id_pins_value) {
  109. return lcd_id_pins_value;
  110. }
  111. /* Solve Coverity scan warning : check return value */
  112. ret = mt_set_gpio_mode(GPIO_DISP_ID0_PIN, GPIO_MODE_00);
  113. if (0 != ret) {
  114. LCD_DEBUG("ID0 mt_set_gpio_mode fail\n");
  115. }
  116. ret = mt_set_gpio_dir(GPIO_DISP_ID0_PIN, GPIO_DIR_IN);
  117. if (0 != ret) {
  118. LCD_DEBUG("ID0 mt_set_gpio_dir fail\n");
  119. }
  120. ret = mt_set_gpio_pull_enable(GPIO_DISP_ID0_PIN, GPIO_PULL_ENABLE);
  121. if (0 != ret) {
  122. LCD_DEBUG("ID0 mt_set_gpio_pull_enable fail\n");
  123. }
  124. ret = mt_set_gpio_mode(GPIO_DISP_ID1_PIN, GPIO_MODE_00);
  125. if (0 != ret) {
  126. LCD_DEBUG("ID1 mt_set_gpio_mode fail\n");
  127. }
  128. ret = mt_set_gpio_dir(GPIO_DISP_ID1_PIN, GPIO_DIR_IN);
  129. if (0 != ret) {
  130. LCD_DEBUG("ID1 mt_set_gpio_dir fail\n");
  131. }
  132. ret = mt_set_gpio_pull_enable(GPIO_DISP_ID1_PIN, GPIO_PULL_ENABLE);
  133. if (0 != ret) {
  134. LCD_DEBUG("ID1 mt_set_gpio_pull_enable fail\n");
  135. }
  136. /* pull down ID0 ID1 PIN */
  137. ret = mt_set_gpio_pull_select(GPIO_DISP_ID0_PIN, GPIO_PULL_DOWN);
  138. if (0 != ret) {
  139. LCD_DEBUG("ID0 mt_set_gpio_pull_select->Down fail\n");
  140. }
  141. ret = mt_set_gpio_pull_select(GPIO_DISP_ID1_PIN, GPIO_PULL_DOWN);
  142. if (0 != ret) {
  143. LCD_DEBUG("ID1 mt_set_gpio_pull_select->Down fail\n");
  144. }
  145. /* delay 100ms , for discharging capacitance */
  146. mdelay(100);
  147. /* get ID0 ID1 status */
  148. low_read0 = mt_get_gpio_in(GPIO_DISP_ID0_PIN);
  149. low_read1 = mt_get_gpio_in(GPIO_DISP_ID1_PIN);
  150. /* pull up ID0 ID1 PIN */
  151. ret = mt_set_gpio_pull_select(GPIO_DISP_ID0_PIN, GPIO_PULL_UP);
  152. if (0 != ret) {
  153. LCD_DEBUG("ID0 mt_set_gpio_pull_select->UP fail\n");
  154. }
  155. ret = mt_set_gpio_pull_select(GPIO_DISP_ID1_PIN, GPIO_PULL_UP);
  156. if (0 != ret) {
  157. LCD_DEBUG("ID1 mt_set_gpio_pull_select->UP fail\n");
  158. }
  159. /* delay 100ms , for charging capacitance */
  160. mdelay(100);
  161. /* get ID0 ID1 status */
  162. high_read0 = mt_get_gpio_in(GPIO_DISP_ID0_PIN);
  163. high_read1 = mt_get_gpio_in(GPIO_DISP_ID1_PIN);
  164. if (low_read0 != high_read0) {
  165. /*float status , pull down ID0 ,to prevent electric leakage */
  166. ret = mt_set_gpio_pull_select(GPIO_DISP_ID0_PIN, GPIO_PULL_DOWN);
  167. if (0 != ret) {
  168. LCD_DEBUG("ID0 mt_set_gpio_pull_select->Down fail\n");
  169. }
  170. lcd_id0 = LCD_HW_ID_STATUS_FLOAT;
  171. } else if ((LCD_HW_ID_STATUS_LOW == low_read0) && (LCD_HW_ID_STATUS_LOW == high_read0)) {
  172. /*low status , pull down ID0 ,to prevent electric leakage */
  173. ret = mt_set_gpio_pull_select(GPIO_DISP_ID0_PIN, GPIO_PULL_DOWN);
  174. if (0 != ret) {
  175. LCD_DEBUG("ID0 mt_set_gpio_pull_select->Down fail\n");
  176. }
  177. lcd_id0 = LCD_HW_ID_STATUS_LOW;
  178. } else if ((LCD_HW_ID_STATUS_HIGH == low_read0) && (LCD_HW_ID_STATUS_HIGH == high_read0)) {
  179. /*high status , pull up ID0 ,to prevent electric leakage */
  180. ret = mt_set_gpio_pull_select(GPIO_DISP_ID0_PIN, GPIO_PULL_UP);
  181. if (0 != ret) {
  182. LCD_DEBUG("ID0 mt_set_gpio_pull_select->UP fail\n");
  183. }
  184. lcd_id0 = LCD_HW_ID_STATUS_HIGH;
  185. } else {
  186. LCD_DEBUG(" Read LCD_id0 error\n");
  187. ret = mt_set_gpio_pull_select(GPIO_DISP_ID0_PIN, GPIO_PULL_DISABLE);
  188. if (0 != ret) {
  189. LCD_DEBUG("ID0 mt_set_gpio_pull_select->Disbale fail\n");
  190. }
  191. lcd_id0 = LCD_HW_ID_STATUS_ERROR;
  192. }
  193. if (low_read1 != high_read1) {
  194. /*float status , pull down ID1 ,to prevent electric leakage */
  195. ret = mt_set_gpio_pull_select(GPIO_DISP_ID1_PIN, GPIO_PULL_DOWN);
  196. if (0 != ret) {
  197. LCD_DEBUG("ID1 mt_set_gpio_pull_select->Down fail\n");
  198. }
  199. lcd_id1 = LCD_HW_ID_STATUS_FLOAT;
  200. } else if ((LCD_HW_ID_STATUS_LOW == low_read1) && (LCD_HW_ID_STATUS_LOW == high_read1)) {
  201. /*low status , pull down ID1 ,to prevent electric leakage */
  202. ret = mt_set_gpio_pull_select(GPIO_DISP_ID1_PIN, GPIO_PULL_DOWN);
  203. if (0 != ret) {
  204. LCD_DEBUG("ID1 mt_set_gpio_pull_select->Down fail\n");
  205. }
  206. lcd_id1 = LCD_HW_ID_STATUS_LOW;
  207. } else if ((LCD_HW_ID_STATUS_HIGH == low_read1) && (LCD_HW_ID_STATUS_HIGH == high_read1)) {
  208. /*high status , pull up ID1 ,to prevent electric leakage */
  209. ret = mt_set_gpio_pull_select(GPIO_DISP_ID1_PIN, GPIO_PULL_UP);
  210. if (0 != ret) {
  211. LCD_DEBUG("ID1 mt_set_gpio_pull_select->UP fail\n");
  212. }
  213. lcd_id1 = LCD_HW_ID_STATUS_HIGH;
  214. } else {
  215. LCD_DEBUG(" Read LCD_id1 error\n");
  216. ret = mt_set_gpio_pull_select(GPIO_DISP_ID1_PIN, GPIO_PULL_DISABLE);
  217. if (0 != ret) {
  218. LCD_DEBUG("ID1 mt_set_gpio_pull_select->Disable fail\n");
  219. }
  220. lcd_id1 = LCD_HW_ID_STATUS_ERROR;
  221. }
  222. #ifdef BUILD_LK
  223. dprintf(CRITICAL, "which_lcd_module_triple,lcd_id0:%d\n", lcd_id0);
  224. dprintf(CRITICAL, "which_lcd_module_triple,lcd_id1:%d\n", lcd_id1);
  225. #else
  226. printk("which_lcd_module_triple,lcd_id0:%d\n", lcd_id0);
  227. printk("which_lcd_module_triple,lcd_id1:%d\n", lcd_id1);
  228. #endif
  229. lcd_id = lcd_id0 | (lcd_id1 << 2);
  230. #ifdef BUILD_LK
  231. dprintf(CRITICAL, "which_lcd_module_triple,lcd_id:%d\n", lcd_id);
  232. #else
  233. printk("which_lcd_module_triple,lcd_id:%d\n", lcd_id);
  234. #endif
  235. lcd_id_pins_value = lcd_id;
  236. return lcd_id;
  237. }
  238. #endif