mt6311.c 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305
  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 <platform/mt_i2c.h>
  32. #include <platform/mt_gpio.h>
  33. #include <platform/mt6311.h>
  34. #include <printf.h>
  35. #ifdef MACH_FPGA
  36. #else
  37. #include "cust_i2c.h"
  38. #endif
  39. /**********************************************************
  40. * I2C Slave Setting
  41. *********************************************************/
  42. #define mt6311_SLAVE_ADDR_WRITE 0xD6
  43. #define mt6311_SLAVE_ADDR_Read 0xD7
  44. /**********************************************************
  45. * Global Variable
  46. *********************************************************/
  47. #ifdef I2C_EXT_BUCK_CHANNEL
  48. #define mt6311_I2C_ID I2C_EXT_BUCK_CHANNEL
  49. #else
  50. #define mt6311_I2C_ID I2C2
  51. #endif
  52. static struct mt_i2c_t mt6311_i2c;
  53. int g_mt6311_driver_ready=0;
  54. int g_mt6311_hw_exist=0;
  55. #define mt6311_print(fmt, args...) \
  56. do { \
  57. dprintf(CRITICAL, fmt, ##args); \
  58. } while(0)
  59. kal_uint32 g_mt6311_cid=0;
  60. /**********************************************************
  61. *
  62. * [I2C Function For Read/Write mt6311]
  63. *
  64. *********************************************************/
  65. kal_uint32 mt6311_write_byte(kal_uint8 addr, kal_uint8 value)
  66. {
  67. int ret_code = I2C_OK;
  68. kal_uint8 write_data[2];
  69. kal_uint16 len;
  70. write_data[0]= addr;
  71. write_data[1] = value;
  72. mt6311_i2c.id = mt6311_I2C_ID;
  73. /* Since i2c will left shift 1 bit, we need to set mt6311 I2C address to >>1 */
  74. mt6311_i2c.addr = (mt6311_SLAVE_ADDR_WRITE >> 1);
  75. mt6311_i2c.mode = ST_MODE;
  76. mt6311_i2c.speed = 100;
  77. mt6311_i2c.pushpull = 1;
  78. len = 2;
  79. ret_code = i2c_write(&mt6311_i2c, write_data, len);
  80. //mt6311_print("%s: i2c_write: ret_code: %d\n", __func__, ret_code);
  81. if (ret_code == 0)
  82. return 1; // ok
  83. else
  84. return 0; // fail
  85. }
  86. kal_uint32 mt6311_read_byte (kal_uint8 addr, kal_uint8 *dataBuffer)
  87. {
  88. int ret_code = I2C_OK;
  89. kal_uint16 len;
  90. *dataBuffer = addr;
  91. mt6311_i2c.id = mt6311_I2C_ID;
  92. /* Since i2c will left shift 1 bit, we need to set mt6311 I2C address to >>1 */
  93. mt6311_i2c.addr = (mt6311_SLAVE_ADDR_WRITE >> 1);
  94. mt6311_i2c.mode = ST_MODE;
  95. mt6311_i2c.speed = 100;
  96. mt6311_i2c.pushpull = 1;
  97. len = 1;
  98. ret_code = i2c_write_read(&mt6311_i2c, dataBuffer, len, len);
  99. //mt6311_print("%s: i2c_read: ret_code: %d\n", __func__, ret_code);
  100. if (ret_code == 0)
  101. return 1; // ok
  102. else
  103. return 0; // fail
  104. }
  105. /**********************************************************
  106. *
  107. * [Read / Write Function]
  108. *
  109. *********************************************************/
  110. kal_uint32 mt6311_read_interface (kal_uint8 RegNum, kal_uint8 *val, kal_uint8 MASK, kal_uint8 SHIFT)
  111. {
  112. kal_uint8 mt6311_reg = 0;
  113. kal_uint32 ret = 0;
  114. //mt6311_print("--------------------------------------------------PL\n");
  115. ret = mt6311_read_byte(RegNum, &mt6311_reg);
  116. //mt6311_print("[mt6311_read_interface] Reg[%x]=0x%x\n", RegNum, mt6311_reg);
  117. mt6311_reg &= (MASK << SHIFT);
  118. *val = (mt6311_reg >> SHIFT);
  119. //mt6311_print("[mt6311_read_interface] val=0x%x\n", *val);
  120. return ret;
  121. }
  122. kal_uint32 mt6311_config_interface (kal_uint8 RegNum, kal_uint8 val, kal_uint8 MASK, kal_uint8 SHIFT)
  123. {
  124. kal_uint8 mt6311_reg = 0;
  125. kal_uint32 ret = 0;
  126. //mt6311_print("--------------------------------------------------PL\n");
  127. ret = mt6311_read_byte(RegNum, &mt6311_reg);
  128. //mt6311_print("[mt6311_config_interface] Reg[%x]=0x%x\n", RegNum, mt6311_reg);
  129. mt6311_reg &= ~(MASK << SHIFT);
  130. mt6311_reg |= (val << SHIFT);
  131. ret = mt6311_write_byte(RegNum, mt6311_reg);
  132. //mt6311_print("[mt6311_config_interface] write Reg[%x]=0x%x\n", RegNum, mt6311_reg);
  133. // Check
  134. //mt6311_read_byte(RegNum, &mt6311_reg);
  135. //mt6311_print("[mt6311_config_interface] Check Reg[%x]=0x%x\n", RegNum, mt6311_reg);
  136. return ret;
  137. }
  138. kal_uint32 mt6311_get_reg_value(kal_uint32 reg)
  139. {
  140. kal_uint32 ret=0;
  141. kal_uint8 reg_val=0;
  142. ret=mt6311_read_interface( (kal_uint8) reg, &reg_val, 0xFF, 0x0);
  143. if (ret==0) mt6311_print("%d", ret);
  144. return reg_val;
  145. }
  146. void mt6311_dump_register(void)
  147. {
  148. kal_uint8 i=0x0;
  149. kal_uint8 i_max=0x2;//0xD5
  150. for (i=0x0; i<=i_max; i++) {
  151. mt6311_print("[0x%x]=0x%x ", i, mt6311_get_reg_value(i));
  152. }
  153. }
  154. int get_mt6311_i2c_ch_num(void)
  155. {
  156. return mt6311_I2C_ID;
  157. }
  158. void mt6311_hw_init(void)
  159. {
  160. //in kernel
  161. }
  162. kal_uint8 mt6311_get_cid(void)
  163. {
  164. kal_uint8 ret=0;
  165. kal_uint8 val=0;
  166. ret=mt6311_read_interface( (kal_uint8)(MT6311_CID),
  167. (&val),
  168. (kal_uint8)(MT6311_PMIC_CID_MASK),
  169. (kal_uint8)(MT6311_PMIC_CID_SHIFT)
  170. );
  171. if (ret==0) mt6311_print("%d", ret);
  172. return val;
  173. }
  174. kal_uint8 mt6311_get_swcid(void)
  175. {
  176. kal_uint8 ret=0;
  177. kal_uint8 val=0;
  178. ret=mt6311_read_interface( (kal_uint8)(MT6311_SWCID),
  179. (&val),
  180. (kal_uint8)(MT6311_PMIC_SWCID_MASK),
  181. (kal_uint8)(MT6311_PMIC_SWCID_SHIFT)
  182. );
  183. if (ret==0) mt6311_print("%d", ret);
  184. return val;
  185. }
  186. kal_uint32 update_mt6311_chip_id(void)
  187. {
  188. kal_uint32 id=0;
  189. kal_uint32 id_l=0;
  190. kal_uint32 id_r=0;
  191. id_l=mt6311_get_cid();
  192. id_r=mt6311_get_swcid();
  193. id=((id_l<<8)|(id_r));
  194. g_mt6311_cid=id;
  195. mt6311_print("[update_mt6311_chip_id] id_l=0x%x, id_r=0x%x, id=0x%x\n", id_l, id_r, id);
  196. return id;
  197. }
  198. kal_uint32 mt6311_get_chip_id(void)
  199. {
  200. if (g_mt6311_cid==0)
  201. update_mt6311_chip_id();
  202. mt6311_print("[mt6311_get_chip_id] g_mt6311_cid=0x%x\n", g_mt6311_cid);
  203. return g_mt6311_cid;
  204. }
  205. void mt6311_hw_component_detect(void)
  206. {
  207. update_mt6311_chip_id();
  208. if ( (mt6311_get_chip_id()==PMIC6311_E1_CID_CODE) ||
  209. (mt6311_get_chip_id()==PMIC6311_E2_CID_CODE) ||
  210. (mt6311_get_chip_id()==PMIC6311_E3_CID_CODE)
  211. ) {
  212. g_mt6311_hw_exist=1;
  213. } else {
  214. g_mt6311_hw_exist=0;
  215. }
  216. mt6311_print("[mt6311_hw_component_detect] exist=%d\n", g_mt6311_hw_exist);
  217. }
  218. int is_mt6311_sw_ready(void)
  219. {
  220. mt6311_print("g_mt6311_driver_ready=%d\n", g_mt6311_driver_ready);
  221. return g_mt6311_driver_ready;
  222. }
  223. int is_mt6311_exist(void)
  224. {
  225. mt6311_print("g_mt6311_hw_exist=%d\n", g_mt6311_hw_exist);
  226. return g_mt6311_hw_exist;
  227. }
  228. void mt6311_driver_probe(void)
  229. {
  230. #ifdef I2C_EXT_BUCK_CHANNEL
  231. mt6311_print("[mt6311_driver_probe] LK I2C_EXT_BUCK_CHANNEL=%d.\n", I2C_EXT_BUCK_CHANNEL);
  232. mt6311_hw_component_detect();
  233. if (g_mt6311_hw_exist==1) {
  234. mt6311_hw_init();
  235. mt6311_dump_register();
  236. } else {
  237. mt6311_print("[mt6311_driver_probe] LK mt6311 is not exist\n");
  238. }
  239. g_mt6311_driver_ready=1;
  240. #else
  241. mt6311_print("[mt6311_driver_probe] LK No I2C_EXT_BUCK_CHANNEL (%d)\n", mt6311_I2C_ID);
  242. g_mt6311_hw_exist=0;
  243. g_mt6311_driver_ready=1;
  244. #endif
  245. mt6311_print("[mt6311_driver_probe] LK g_mt6311_hw_exist=%d, g_mt6311_driver_ready=%d!!\n",
  246. g_mt6311_hw_exist, g_mt6311_driver_ready);
  247. }