mt_i2c.c 30 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037
  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. * The following software/firmware and/or related documentation ("MediaTek Software")
  32. * have been modified by MediaTek Inc. All revisions are subject to any receiver\'s
  33. * applicable license agreements with MediaTek Inc.
  34. */
  35. #include <platform/mt_i2c.h>
  36. #include <platform/mt_pmic_wrap_init.h>
  37. #include <platform/mt_gpio.h>
  38. /******************************internal API********************************************************/
  39. #define I2C_PMIC_WR(addr, data) pwrap_write((U32)addr, data)
  40. #define I2C_PMIC_RD(addr) ({ \
  41. U32 ext_data; \
  42. (pwrap_read((U32)addr,&ext_data) != 0)?-1:ext_data;})
  43. static inline void i2c_writel(mt_i2c * i2c, U8 offset, U16 value)
  44. {
  45. //__raw_writew(value, (i2c->base) + (offset));
  46. mt_reg_sync_writel(value, (i2c->base) + (offset));
  47. }
  48. static inline U32 i2c_readl(mt_i2c * i2c, U8 offset)
  49. {
  50. return DRV_Reg32((i2c->base) + (offset));
  51. }
  52. /***********************************declare API**************************/
  53. static void mt_i2c_clock_enable(mt_i2c *i2c);
  54. static void mt_i2c_clock_disable(mt_i2c *i2c);
  55. /***********************************I2C common Param **************************/
  56. volatile U32 I2C_TIMING_REG_BACKUP[8]= {0};
  57. /***********************************i2c debug********************************************************/
  58. #define I2C_DEBUG_FS
  59. #ifdef I2C_DEBUG_FS
  60. #define PORT_COUNT 8
  61. #define MESSAGE_COUNT 16
  62. #define I2C_T_DMA 1
  63. #define I2C_T_TRANSFERFLOW 2
  64. #define I2C_T_SPEED 3
  65. /*7 ports,16 types of message*/
  66. U8 i2c_port[ PORT_COUNT ][ MESSAGE_COUNT ];
  67. #define I2CINFO( type, format, arg...) do { \
  68. if ( type < MESSAGE_COUNT && type >= 0 ) { \
  69. if ( i2c_port[i2c->id][0] != 0 && ( i2c_port[i2c->id][type] != 0 || i2c_port[i2c->id][MESSAGE_COUNT - 1] != 0) ) { \
  70. I2CLOG( format, ## arg); \
  71. } \
  72. } \
  73. } while (0)
  74. #ifdef I2C_DRIVER_IN_KERNEL
  75. static ssize_t show_config(struct device *dev, struct device_attribute *attr, char *buff)
  76. {
  77. S32 i = 0;
  78. S32 j = 0;
  79. char *buf = buff;
  80. for ( i =0; i < PORT_COUNT; i++) {
  81. for ( j=0; j < MESSAGE_COUNT; j++) i2c_port[i][j] += '0';
  82. strncpy(buf, (char *)i2c_port[i], MESSAGE_COUNT);
  83. buf += MESSAGE_COUNT;
  84. *buf = '\n';
  85. buf++;
  86. for ( j=0; j < MESSAGE_COUNT; j++) i2c_port[i][j] -= '0';
  87. }
  88. return (buf - buff);
  89. }
  90. static ssize_t set_config(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
  91. {
  92. S32 port,type,status;
  93. if ( sscanf(buf, "%d %d %d", &port, &type, &status) ) {
  94. if ( port >= PORT_COUNT || port < 0 || type >= MESSAGE_COUNT || type < 0 ) {
  95. /*Invalid param*/
  96. I2CERR("i2c debug system: Parameter overflowed!\n");
  97. } else {
  98. if ( status != 0 )
  99. i2c_port[port][type] = 1;
  100. else
  101. i2c_port[port][type] = 0;
  102. I2CLOG("port:%d type:%d status:%s\ni2c debug system: Parameter accepted!\n", port, type, status?"on":"off");
  103. }
  104. } else {
  105. /*parameter invalid*/
  106. I2CERR("i2c debug system: Parameter invalid!\n");
  107. }
  108. return count;
  109. }
  110. static DEVICE_ATTR(debug, S_IRUGO|S_IWUGO, show_config, set_config);
  111. #endif
  112. #else
  113. #define I2CINFO(type, format, arg...)
  114. #endif
  115. /* calculate i2c port speed */
  116. static int mtk_i2c_calculate_speed(mt_i2c *i2c,
  117. unsigned int clk_src_in_khz,
  118. unsigned int speed_hkz,
  119. unsigned int *timing_step_cnt,
  120. unsigned int *timing_sample_cnt)
  121. {
  122. unsigned int khz;
  123. unsigned int step_cnt;
  124. unsigned int sample_cnt;
  125. unsigned int sclk;
  126. unsigned int hclk;
  127. unsigned int max_step_cnt;
  128. unsigned int sample_div = MAX_SAMPLE_CNT_DIV;
  129. unsigned int step_div;
  130. unsigned int min_div;
  131. unsigned int best_mul;
  132. unsigned int cnt_mul;
  133. if (speed_hkz > MAX_HS_MODE_SPEED) {
  134. return -EINVAL_I2C;
  135. } else if (speed_hkz > MAX_FS_MODE_SPEED) {
  136. max_step_cnt = MAX_HS_STEP_CNT_DIV;
  137. } else {
  138. max_step_cnt = MAX_STEP_CNT_DIV;
  139. }
  140. step_div = max_step_cnt;
  141. /* Find the best combination */
  142. khz = speed_hkz;
  143. hclk = clk_src_in_khz;
  144. min_div = ((hclk >> 1) + khz - 1) / khz;
  145. best_mul = MAX_SAMPLE_CNT_DIV * max_step_cnt;
  146. for (sample_cnt = 1; sample_cnt <= MAX_SAMPLE_CNT_DIV; sample_cnt++) {
  147. step_cnt = (min_div + sample_cnt - 1) / sample_cnt;
  148. cnt_mul = step_cnt * sample_cnt;
  149. if (step_cnt > max_step_cnt)
  150. continue;
  151. if (cnt_mul < best_mul) {
  152. best_mul = cnt_mul;
  153. sample_div = sample_cnt;
  154. step_div = step_cnt;
  155. if (best_mul == min_div)
  156. break;
  157. }
  158. }
  159. sample_cnt = sample_div;
  160. step_cnt = step_div;
  161. sclk = hclk / (2 * sample_cnt * step_cnt);
  162. if (sclk > khz) {
  163. I2CERR("i2c%d %s mode: unsupported speed (%ldkhz)\n",
  164. i2c->id, (speed_hkz > MAX_FS_MODE_SPEED) ? "HS" : "ST/FT", (long int)khz);
  165. return -EINVAL_I2C;;
  166. }
  167. step_cnt--;
  168. sample_cnt--;
  169. *timing_step_cnt = step_cnt;
  170. *timing_sample_cnt = sample_cnt;
  171. return 0;
  172. }
  173. /***********************************common API********************************************************/
  174. /*Set i2c port speed*/
  175. S32 i2c_set_speed(mt_i2c *i2c)
  176. {
  177. int ret = 0;
  178. unsigned int step_cnt = 0;
  179. unsigned int sample_cnt = 0;
  180. unsigned int l_step_cnt = 0;
  181. unsigned int l_sample_cnt = 0;
  182. unsigned int speed_khz;
  183. unsigned int clk_src_in_khz = i2c->clk;
  184. unsigned int duty = 50;
  185. speed_khz = i2c->speed;
  186. if (speed_khz > MAX_FS_MODE_SPEED) {
  187. /* Set the hign speed mode register */
  188. ret = mtk_i2c_calculate_speed(i2c, clk_src_in_khz,
  189. MAX_FS_MODE_SPEED, &l_step_cnt, &l_sample_cnt);
  190. if (ret < 0)
  191. return ret;
  192. ret = mtk_i2c_calculate_speed(i2c, clk_src_in_khz,
  193. speed_khz, &step_cnt, &sample_cnt);
  194. if (ret < 0)
  195. return ret;
  196. i2c->high_speed_reg = 0x3 |
  197. (sample_cnt & 0x7) << 12 |
  198. (step_cnt & 0x7) << 8;
  199. i2c->timing_reg =
  200. (l_sample_cnt & 0x7) << 8 |
  201. (l_step_cnt & 0x3f) << 0;
  202. i2c->ltiming_reg = (l_sample_cnt << 6) | (l_step_cnt << 0) |
  203. (sample_cnt & 0x7) << 12 |
  204. (step_cnt & 0x7) << 9;
  205. } else {
  206. if (speed_khz > MAX_ST_MODE_SPEED && speed_khz <= MAX_FS_MODE_SPEED)
  207. duty = DUTY_CYCLE;
  208. ret = mtk_i2c_calculate_speed(i2c, clk_src_in_khz,
  209. (speed_khz * 50 / duty), &step_cnt, &sample_cnt);
  210. if (ret < 0)
  211. return ret;
  212. ret = mtk_i2c_calculate_speed(i2c, clk_src_in_khz,
  213. (speed_khz * 50 / (100 - duty)), &l_step_cnt, &l_sample_cnt);
  214. if (ret < 0)
  215. return ret;
  216. i2c->timing_reg =
  217. (sample_cnt & 0x7) << 8 |
  218. (step_cnt & 0x3f) << 0;
  219. i2c->ltiming_reg =
  220. (l_sample_cnt & 0x7) << 6 |
  221. (l_step_cnt & 0x3f) << 0;
  222. /* Disable the high speed transaction */
  223. i2c->high_speed_reg = 0x0;
  224. }
  225. return 0;
  226. }
  227. void _i2c_dump_info(mt_i2c *i2c)
  228. {
  229. //I2CFUC();
  230. I2CERR("I2C structure:\n"
  231. I2CTAG"Clk=%d,Id=%d,Mode=%x,St_rs=%x,Dma_en=%x,Op=%x,Poll_en=%x,Irq_stat=%x\n"
  232. I2CTAG"Trans_len=%x,Trans_num=%x,Trans_auxlen=%x,Data_size=%x,speed=%d\n",
  233. //,Trans_stop=%u,Trans_comp=%u,Trans_error=%u\n"
  234. i2c->clk,i2c->id,i2c->mode,i2c->st_rs,i2c->dma_en,i2c->op,i2c->poll_en,i2c->irq_stat,
  235. i2c->trans_data.trans_len,i2c->trans_data.trans_num,i2c->trans_data.trans_auxlen,i2c->trans_data.data_size,i2c->speed);
  236. // atomic_read(&i2c->trans_stop),atomic_read(&i2c->trans_comp),atomic_read(&i2c->trans_err),
  237. I2CERR("base address 0x%x\n",i2c->base);
  238. I2CERR("I2C register:\n"
  239. I2CTAG"SLAVE_ADDR=%x,INTR_MASK=%x,INTR_STAT=%x,CONTROL=%x,TRANSFER_LEN=%x\n"
  240. I2CTAG"TRANSAC_LEN=%x,DELAY_LEN=%x,TIMING=%x,LTIMING=%x,START=%x,FIFO_STAT=%x\n"
  241. I2CTAG"IO_CONFIG=%x,HS=%x,DCM_EN=%x,DEBUGSTAT=%x,EXT_CONF=%x,TRANSFER_LEN_AUX=%x,CLOCK_DIV=%x\n",
  242. (i2c_readl(i2c, OFFSET_SLAVE_ADDR)),
  243. (i2c_readl(i2c, OFFSET_INTR_MASK)),
  244. (i2c_readl(i2c, OFFSET_INTR_STAT)),
  245. (i2c_readl(i2c, OFFSET_CONTROL)),
  246. (i2c_readl(i2c, OFFSET_TRANSFER_LEN)),
  247. (i2c_readl(i2c, OFFSET_TRANSAC_LEN)),
  248. (i2c_readl(i2c, OFFSET_DELAY_LEN)),
  249. (i2c_readl(i2c, OFFSET_TIMING)),
  250. (i2c_readl(i2c, OFFSET_LTIMING)),
  251. (i2c_readl(i2c, OFFSET_START)),
  252. (i2c_readl(i2c, OFFSET_FIFO_STAT)),
  253. (i2c_readl(i2c, OFFSET_IO_CONFIG)),
  254. (i2c_readl(i2c, OFFSET_HS)),
  255. (i2c_readl(i2c, OFFSET_DCM_EN)),
  256. (i2c_readl(i2c, OFFSET_DEBUGSTAT)),
  257. (i2c_readl(i2c, OFFSET_EXT_CONF)),
  258. (i2c_readl(i2c, OFFSET_TRANSFER_LEN_AUX)),
  259. (i2c_readl(i2c, OFFSET_CLOCK_DIV)));
  260. /*
  261. I2CERR("DMA register:\nINT_FLAG %x\nCON %x\nTX_MEM_ADDR %x\nRX_MEM_ADDR %x\nTX_LEN %x\nRX_LEN %x\nINT_EN %x\nEN %x\n",
  262. (__raw_readl(i2c->pdmabase+OFFSET_INT_FLAG)),
  263. (__raw_readl(i2c->pdmabase+OFFSET_CON)),
  264. (__raw_readl(i2c->pdmabase+OFFSET_TX_MEM_ADDR)),
  265. (__raw_readl(i2c->pdmabase+OFFSET_RX_MEM_ADDR)),
  266. (__raw_readl(i2c->pdmabase+OFFSET_TX_LEN)),
  267. (__raw_readl(i2c->pdmabase+OFFSET_RX_LEN)),
  268. (__raw_readl(i2c->pdmabase+OFFSET_S32_EN)),
  269. (__raw_readl(i2c->pdmabase+OFFSET_EN)));
  270. */
  271. /*6589 side and PMIC side clock*/
  272. //I2CERR("Clock %s\n",(((DRV_Reg32(0xF0003018)>>26) | (DRV_Reg32(0xF000301c)&0x1 << 6)) & (1 << i2c->id))?"disable":"enable");
  273. //if(i2c->id >=4)
  274. // I2CERR("Clock PMIC %s\n",((I2C_PMIC_RD(0x011A) & 0x7) & (1 << (i2c->id - 4)))?"disable":"enable");
  275. //1<<(i2c->id-4): 0x011A bit[0~2]:i2c0~2,i2c->id:i2c 4~6
  276. return;
  277. }
  278. static S32 _i2c_deal_result(mt_i2c *i2c)
  279. {
  280. #ifdef I2C_DRIVER_IN_KERNEL
  281. long tmo = i2c->adap.timeout;
  282. #else
  283. long tmo = 1;
  284. #endif
  285. U16 data_size = 0;
  286. U8 *ptr = i2c->msg_buf;
  287. BOOL TRANSFER_ERROR=FALSE;
  288. S32 ret = i2c->msg_len;
  289. long tmo_poll = 0xffff;
  290. //I2CFUC();
  291. //addr_reg = i2c->read_flag ? ((i2c->addr << 1) | 0x1) : ((i2c->addr << 1) & ~0x1);
  292. if (i2c->poll_en) {
  293. /*master read && poll mode*/
  294. for (;;) {
  295. /*check the interrupt status register*/
  296. i2c->irq_stat = i2c_readl(i2c, OFFSET_INTR_STAT);
  297. //I2CLOG("irq_stat = 0x%x\n", i2c->irq_stat);
  298. if (i2c->irq_stat & (I2C_HS_NACKERR | I2C_ACKERR )) {
  299. //transfer error
  300. //atomic_set(&i2c->trans_stop, 1);
  301. //spin_lock(&i2c->lock);
  302. /*Clear interrupt status,write 1 clear*/
  303. //i2c_writel(i2c, OFFSET_INTR_STAT, (I2C_HS_NACKERR | I2C_ACKERR ));
  304. TRANSFER_ERROR=TRUE;
  305. tmo = 1;
  306. //spin_unlock(&i2c->lock);
  307. break;
  308. } else if (i2c->irq_stat & I2C_TRANSAC_COMP) {
  309. //transfer complete
  310. tmo = 1;
  311. break;
  312. }
  313. tmo_poll --;
  314. if (tmo_poll == 0) {
  315. tmo = 0;
  316. break;
  317. }
  318. }
  319. } else { /*Interrupt mode,wait for interrupt wake up*/
  320. //tmo = wait_event_timeout(i2c->wait,atomic_read(&i2c->trans_stop), tmo);
  321. }
  322. /*Save status register status to i2c struct*/
  323. #ifdef I2C_DRIVER_IN_KERNEL
  324. if (i2c->irq_stat & I2C_TRANSAC_COMP) {
  325. atomic_set(&i2c->trans_err, 0);
  326. atomic_set(&i2c->trans_comp, 1);
  327. }
  328. atomic_set(&i2c->trans_err, i2c->irq_stat & (I2C_HS_NACKERR | I2C_ACKERR));
  329. #endif
  330. //I2CLOG("tmo = 0x%x\n", tmo);
  331. /*Check the transfer status*/
  332. if (!(tmo == 0 )&& TRANSFER_ERROR==FALSE ) {
  333. /*Transfer success ,we need to get data from fifo*/
  334. if ((!i2c->dma_en) && (i2c->op == I2C_MASTER_RD || i2c->op == I2C_MASTER_WRRD) ) {
  335. /*only read mode or write_read mode and fifo mode need to get data*/
  336. data_size = (i2c_readl(i2c, OFFSET_FIFO_STAT) >> 4) & 0x000F;
  337. //I2CLOG("data_size=%d\n",data_size);
  338. while (data_size--) {
  339. *ptr = i2c_readl(i2c, OFFSET_DATA_PORT);
  340. #ifdef I2C_EARLY_PORTING
  341. I2CLOG("addr %x read byte = 0x%x\n", i2c->addr, *ptr);
  342. #endif
  343. ptr++;
  344. }
  345. }
  346. } else {
  347. /*Timeout or ACKERR*/
  348. if ( tmo == 0 ) {
  349. I2CERR("id=%d,addr: %x, transfer timeout\n",i2c->id, i2c->addr);
  350. ret = -ETIMEDOUT_I2C;
  351. } else {
  352. I2CERR("id=%d,addr: %x, transfer error\n",i2c->id,i2c->addr);
  353. ret = -EREMOTEIO_I2C;
  354. }
  355. if (i2c->irq_stat & I2C_HS_NACKERR)
  356. I2CERR("I2C_HS_NACKERR\n");
  357. if (i2c->irq_stat & I2C_ACKERR)
  358. I2CERR("I2C_ACKERR\n");
  359. if (i2c->filter_msg==FALSE) { //TEST
  360. _i2c_dump_info(i2c);
  361. }
  362. //spin_lock(&i2c->lock);
  363. /*Reset i2c port*/
  364. i2c_writel(i2c, OFFSET_SOFTRESET, 0x0001);
  365. /*Set slave address*/
  366. i2c_writel( i2c, OFFSET_SLAVE_ADDR, 0x0000 );
  367. /*Clear interrupt status*/
  368. i2c_writel(i2c, OFFSET_INTR_STAT, (I2C_HS_NACKERR|I2C_ACKERR|I2C_TRANSAC_COMP));
  369. /*Clear fifo address*/
  370. i2c_writel(i2c, OFFSET_FIFO_ADDR_CLR, 0x0001);
  371. //spin_unlock(&i2c->lock);
  372. }
  373. return ret;
  374. }
  375. void _i2c_write_reg(mt_i2c *i2c)
  376. {
  377. U8 *ptr = i2c->msg_buf;
  378. U32 data_size=i2c->trans_data.data_size;
  379. U32 addr_reg=0;
  380. //I2CFUC();
  381. i2c_writel(i2c, OFFSET_CONTROL, i2c->control_reg);
  382. /*set start condition */
  383. if (i2c->speed <= 100) {
  384. i2c_writel(i2c,OFFSET_EXT_CONF, 0x8001);
  385. }
  386. //set timing reg
  387. i2c_writel(i2c, OFFSET_TIMING, i2c->timing_reg);
  388. #ifndef NO_I2C_LTIMING
  389. i2c_writel(i2c, OFFSET_LTIMING, i2c->ltiming_reg);
  390. #endif
  391. i2c_writel(i2c, OFFSET_HS, i2c->high_speed_reg);
  392. i2c_writel(i2c, OFFSET_CLOCK_DIV, (I2C_CLK_DIV - 1));
  393. if (0 == i2c->delay_len)
  394. i2c->delay_len = 2;
  395. if (~i2c->control_reg & I2C_CONTROL_RS) { // bit is set to 1, i.e.,use repeated stop
  396. i2c_writel(i2c, OFFSET_DELAY_LEN, i2c->delay_len);
  397. }
  398. /*Set ioconfig*/
  399. if (i2c->pushpull) {
  400. i2c_writel(i2c, OFFSET_IO_CONFIG, 0x0000);
  401. } else {
  402. i2c_writel(i2c, OFFSET_IO_CONFIG, 0x0003);
  403. }
  404. /*Set slave address*/
  405. addr_reg = i2c->read_flag ? ((i2c->addr << 1) | 0x1) : ((i2c->addr << 1) & ~0x1);
  406. i2c_writel(i2c, OFFSET_SLAVE_ADDR, addr_reg);
  407. /*Clear interrupt status*/
  408. i2c_writel(i2c, OFFSET_INTR_STAT, (I2C_HS_NACKERR | I2C_ACKERR | I2C_TRANSAC_COMP));
  409. /*Clear fifo address*/
  410. i2c_writel(i2c, OFFSET_FIFO_ADDR_CLR, 0x0001);
  411. /*Setup the interrupt mask flag*/
  412. if (i2c->poll_en)
  413. i2c_writel(i2c, OFFSET_INTR_MASK, i2c_readl(i2c, OFFSET_INTR_MASK) & ~(I2C_HS_NACKERR | I2C_ACKERR | I2C_TRANSAC_COMP)); /*Disable interrupt*/
  414. else
  415. i2c_writel(i2c, OFFSET_INTR_MASK, i2c_readl(i2c, OFFSET_INTR_MASK) | (I2C_HS_NACKERR | I2C_ACKERR | I2C_TRANSAC_COMP)); /*Enable interrupt*/
  416. /*Set transfer len */
  417. if (i2c->id != 6) {
  418. i2c_writel(i2c, OFFSET_TRANSFER_LEN, i2c->trans_data.trans_len & 0xFFFF);
  419. i2c_writel(i2c, OFFSET_TRANSFER_LEN_AUX, i2c->trans_data.trans_auxlen & 0xFFFF);
  420. } else {
  421. i2c_writel(i2c, OFFSET_TRANSFER_LEN, (i2c->trans_data.trans_len & 0xFF) |
  422. ((i2c->trans_data.trans_auxlen<<8) & 0x1F00));
  423. }
  424. /*Set transaction len*/
  425. i2c_writel(i2c, OFFSET_TRANSAC_LEN, i2c->trans_data.trans_num & 0xFF);
  426. /*Prepare buffer data to start transfer*/
  427. if (i2c->dma_en) {
  428. /* Reset I2C DMA status */
  429. mt_reg_sync_writel(0x0001, i2c->pdmabase + OFFSET_RST);
  430. if (I2C_MASTER_RD == i2c->op) {
  431. mt_reg_sync_writel(0x0000, i2c->pdmabase + OFFSET_INT_FLAG);
  432. mt_reg_sync_writel(0x0001, i2c->pdmabase + OFFSET_CON);
  433. mt_reg_sync_writel((U32)i2c->msg_buf, i2c->pdmabase + OFFSET_RX_MEM_ADDR);
  434. mt_reg_sync_writel(i2c->trans_data.data_size, i2c->pdmabase + OFFSET_RX_LEN);
  435. } else if (I2C_MASTER_WR == i2c->op) {
  436. mt_reg_sync_writel(0x0000, i2c->pdmabase + OFFSET_INT_FLAG);
  437. mt_reg_sync_writel(0x0000, i2c->pdmabase + OFFSET_CON);
  438. mt_reg_sync_writel((U32)i2c->msg_buf, i2c->pdmabase + OFFSET_TX_MEM_ADDR);
  439. mt_reg_sync_writel(i2c->trans_data.data_size, i2c->pdmabase + OFFSET_TX_LEN);
  440. } else {
  441. mt_reg_sync_writel(0x0000, i2c->pdmabase + OFFSET_INT_FLAG);
  442. mt_reg_sync_writel(0x0000, i2c->pdmabase + OFFSET_CON);
  443. mt_reg_sync_writel((U32)i2c->msg_buf, i2c->pdmabase + OFFSET_TX_MEM_ADDR);
  444. mt_reg_sync_writel((U32)i2c->msg_buf, i2c->pdmabase + OFFSET_RX_MEM_ADDR);
  445. mt_reg_sync_writel(i2c->trans_data.trans_len, i2c->pdmabase + OFFSET_TX_LEN);
  446. mt_reg_sync_writel(i2c->trans_data.trans_auxlen, i2c->pdmabase + OFFSET_RX_LEN);
  447. }
  448. I2C_MB();
  449. mt_reg_sync_writel(0x0001, i2c->pdmabase + OFFSET_EN);
  450. I2CINFO( I2C_T_DMA, "addr %.2x dma %.2X byte\n", i2c->addr, i2c->trans_data.data_size);
  451. I2CINFO( I2C_T_DMA, "DMA Register:INT_FLAG:0x%x,CON:0x%x,TX_MEM_ADDR:0x%x, \
  452. RX_MEM_ADDR:0x%x,TX_LEN:0x%x,RX_LEN:0x%x,EN:0x%x\n",\
  453. DRV_Reg32(i2c->pdmabase + OFFSET_INT_FLAG),\
  454. DRV_Reg32(i2c->pdmabase + OFFSET_CON),\
  455. DRV_Reg32(i2c->pdmabase + OFFSET_TX_MEM_ADDR),\
  456. DRV_Reg32(i2c->pdmabase + OFFSET_RX_MEM_ADDR),\
  457. DRV_Reg32(i2c->pdmabase + OFFSET_TX_LEN),\
  458. DRV_Reg32(i2c->pdmabase + OFFSET_RX_LEN),\
  459. DRV_Reg32(i2c->pdmabase + OFFSET_EN));
  460. } else {
  461. /*Set fifo mode data*/
  462. if (I2C_MASTER_RD == i2c->op) {
  463. /*do not need set fifo data*/
  464. } else {
  465. /*both write && write_read mode*/
  466. while (data_size--) {
  467. i2c_writel(i2c, OFFSET_DATA_PORT, *ptr);
  468. //dev_info(i2c->dev, "addr %.2x write byte = 0x%.2X\n", addr, *ptr);
  469. ptr++;
  470. }
  471. }
  472. }
  473. /*Set trans_data*/
  474. i2c->trans_data.data_size = data_size;
  475. }
  476. S32 _i2c_get_transfer_len(mt_i2c *i2c)
  477. {
  478. S32 ret = I2C_OK;
  479. u16 trans_num = 0;
  480. u16 data_size = 0;
  481. u16 trans_len = 0;
  482. u16 trans_auxlen = 0;
  483. //I2CFUC();
  484. /*Get Transfer len and transaux len*/
  485. if (FALSE == i2c->dma_en) {
  486. /*non-DMA mode*/
  487. if (I2C_MASTER_WRRD != i2c->op) {
  488. trans_len = (i2c->msg_len) & 0xFFFF;
  489. trans_num = (i2c->msg_len >> 16) & 0xFF;
  490. if (0 == trans_num)
  491. trans_num = 1;
  492. trans_auxlen = 0;
  493. data_size = trans_len*trans_num;
  494. if (!trans_len || !trans_num || trans_len*trans_num > I2C_FIFO_SIZE) {
  495. I2CERR(" non-WRRD transfer length is not right. trans_len=%x, tans_num=%x, trans_auxlen=%x\n", trans_len, trans_num, trans_auxlen);
  496. I2C_BUG_ON(!trans_len || !trans_num || trans_len*trans_num > I2C_FIFO_SIZE);
  497. ret = -EINVAL_I2C;
  498. }
  499. } else {
  500. trans_len = (i2c->msg_len) & 0xFFFF;
  501. trans_auxlen = (i2c->msg_len >> 16) & 0xFFFF;
  502. trans_num = 2;
  503. data_size = trans_len;
  504. if (!trans_len || !trans_auxlen || trans_len > I2C_FIFO_SIZE || trans_auxlen > I2C_FIFO_SIZE) {
  505. I2CERR(" WRRD transfer length is not right. trans_len=%x, tans_num=%x, trans_auxlen=%x\n", trans_len, trans_num, trans_auxlen);
  506. I2C_BUG_ON(!trans_len || !trans_auxlen || trans_len > I2C_FIFO_SIZE || trans_auxlen > I2C_FIFO_SIZE);
  507. ret = -EINVAL_I2C;
  508. }
  509. }
  510. } else {
  511. /*DMA mode*/
  512. if (I2C_MASTER_WRRD != i2c->op) {
  513. trans_len = (i2c->msg_len) & 0xFFFF;
  514. trans_num = (i2c->msg_len >> 16) & 0xFF;
  515. if (0 == trans_num)
  516. trans_num = 1;
  517. trans_auxlen = 0;
  518. data_size = trans_len*trans_num;
  519. if (!trans_len || !trans_num || trans_len > MAX_DMA_TRANS_SIZE || trans_num > MAX_DMA_TRANS_NUM) {
  520. I2CERR(" DMA non-WRRD transfer length is not right. trans_len=%x, tans_num=%x, trans_auxlen=%x\n", trans_len, trans_num, trans_auxlen);
  521. I2C_BUG_ON(!trans_len || !trans_num || trans_len > MAX_DMA_TRANS_SIZE || trans_num > MAX_DMA_TRANS_NUM);
  522. ret = -EINVAL_I2C;
  523. }
  524. I2CINFO(I2C_T_DMA, "DMA non-WRRD mode!trans_len=%x, tans_num=%x, trans_auxlen=%x\n",trans_len, trans_num, trans_auxlen);
  525. } else {
  526. trans_len = (i2c->msg_len) & 0xFFFF;
  527. trans_auxlen = (i2c->msg_len >> 16) & 0xFFFF;
  528. trans_num = 2;
  529. data_size = trans_len;
  530. if (!trans_len || !trans_auxlen || trans_len > MAX_DMA_TRANS_SIZE || trans_auxlen > MAX_DMA_TRANS_NUM) {
  531. I2CERR(" DMA WRRD transfer length is not right. trans_len=%x, tans_num=%x, trans_auxlen=%x\n", trans_len, trans_num, trans_auxlen);
  532. I2C_BUG_ON(!trans_len || !trans_auxlen || trans_len > MAX_DMA_TRANS_SIZE || trans_auxlen > MAX_DMA_TRANS_NUM);
  533. ret = -EINVAL_I2C;
  534. }
  535. I2CINFO(I2C_T_DMA, "DMA WRRD mode!trans_len=%x, tans_num=%x, trans_auxlen=%x\n",trans_len, trans_num, trans_auxlen);
  536. }
  537. }
  538. i2c->trans_data.trans_num = trans_num;
  539. i2c->trans_data.trans_len = trans_len;
  540. i2c->trans_data.data_size = data_size;
  541. i2c->trans_data.trans_auxlen = trans_auxlen;
  542. return ret;
  543. }
  544. S32 _i2c_transfer_interface(mt_i2c *i2c)
  545. {
  546. S32 return_value=0;
  547. S32 ret=0;
  548. U8 *ptr = i2c->msg_buf;
  549. //I2CFUC();
  550. if (i2c->dma_en) {
  551. I2CINFO( I2C_T_DMA, "DMA Transfer mode!\n");
  552. if (i2c->pdmabase == 0) {
  553. I2CERR(" I2C%d doesnot support DMA mode!\n",i2c->id);
  554. I2C_BUG_ON(i2c->pdmabase == NULL);
  555. ret = -EINVAL_I2C;
  556. goto err;
  557. }
  558. if ((U32)ptr > DMA_ADDRESS_HIGH) {
  559. I2CERR(" DMA mode should use physical buffer address!\n");
  560. I2C_BUG_ON((U32)ptr > DMA_ADDRESS_HIGH);
  561. ret = -EINVAL_I2C;
  562. goto err;
  563. }
  564. }
  565. #ifdef I2C_DRIVER_IN_KERNEL
  566. atomic_set(&i2c->trans_stop, 0);
  567. atomic_set(&i2c->trans_comp, 0);
  568. atomic_set(&i2c->trans_err, 0);
  569. #endif
  570. i2c->irq_stat = 0;
  571. return_value=_i2c_get_transfer_len(i2c);
  572. if ( return_value < 0 ) {
  573. I2CERR("_i2c_get_transfer_len fail,return_value=%d\n",return_value);
  574. ret =-EINVAL_I2C;
  575. goto err;
  576. }
  577. //get clock
  578. i2c->clk = I2C_CLK_RATE;
  579. return_value=i2c_set_speed(i2c);
  580. if ( return_value < 0 ) {
  581. I2CERR("i2c_set_speed fail,return_value=%d\n",return_value);
  582. ret =-EINVAL_I2C;
  583. goto err;
  584. }
  585. /*Set Control Register*/
  586. #ifdef CONFIG_MT_I2C_FPGA_ENABLE
  587. i2c->control_reg = I2C_CONTROL_ACKERR_DET_EN;
  588. #else
  589. i2c->control_reg = I2C_CONTROL_ACKERR_DET_EN | I2C_CONTROL_CLK_EXT_EN;
  590. #endif
  591. if (i2c->dma_en) {
  592. i2c->control_reg |= I2C_CONTROL_DMA_EN;
  593. }
  594. if (I2C_MASTER_WRRD == i2c->op)
  595. i2c->control_reg |= I2C_CONTROL_DIR_CHANGE;
  596. if (HS_MODE == i2c->mode || (i2c->trans_data.trans_num > 1 && I2C_TRANS_REPEATED_START == i2c->st_rs)) {
  597. i2c->control_reg |= I2C_CONTROL_RS;
  598. }
  599. //spin_lock(&i2c->lock);
  600. _i2c_write_reg(i2c);
  601. /*All register must be prepared before setting the start bit [SMP]*/
  602. I2C_MB();
  603. #ifdef I2C_DRIVER_IN_KERNEL
  604. /*This is only for 3D CAMERA*/
  605. if (i2c->i2c_3dcamera_flag) {
  606. //spin_unlock(&i2c->lock);
  607. if (g_i2c[0] == NULL)
  608. g_i2c[0] = i2c;
  609. else
  610. g_i2c[1] = i2c;
  611. goto end;
  612. }
  613. #endif
  614. I2CINFO( I2C_T_TRANSFERFLOW, "Before start .....\n");
  615. /*Start the transfer*/
  616. i2c_writel(i2c, OFFSET_START, 0x0001);
  617. //spin_unlock(&i2c->lock);
  618. ret = _i2c_deal_result(i2c);
  619. I2CINFO(I2C_T_TRANSFERFLOW, "After i2c transfer .....\n");
  620. err:
  621. return ret;
  622. }
  623. S32 _i2c_check_para(mt_i2c *i2c)
  624. {
  625. S32 ret=0;
  626. //I2CFUC();
  627. if (i2c->addr == 0) {
  628. I2CERR(" addr is invalid.\n");
  629. I2C_BUG_ON(i2c->addr == NULL);
  630. ret = -EINVAL_I2C;
  631. goto err;
  632. }
  633. if (i2c->msg_buf == NULL) {
  634. I2CERR(" data buffer is NULL.\n");
  635. I2C_BUG_ON(i2c->msg_buf == NULL);
  636. ret = -EINVAL_I2C;
  637. goto err;
  638. }
  639. err:
  640. return ret;
  641. }
  642. /*
  643. * off-chip <-> on-chip
  644. * i2c0 <-> i2c0
  645. * i2c1 <-> i2c1
  646. * i2c2 <-> i2c2
  647. * i2c-appm <-> i2c3 (APPM)
  648. * i2c3 <-> i2c4 (remap)
  649. * i2c4 <-> i2c5 (remap)
  650. * i2c6 <-> i2c6
  651. */
  652. void _config_mt_i2c(mt_i2c *i2c)
  653. {
  654. //I2CFUC();
  655. switch (i2c->id) {
  656. case I2C0:
  657. i2c->base = I2C0_BASE;
  658. i2c->pdmabase = I2C0_APDMA_BASE;
  659. break;
  660. case I2C1:
  661. i2c->base = I2C1_BASE;
  662. i2c->pdmabase = I2C1_APDMA_BASE;
  663. break;
  664. case I2C2:
  665. i2c->base = I2C2_BASE;
  666. i2c->pdmabase = I2C2_APDMA_BASE;
  667. break;
  668. case I2C5: /*APPM*/
  669. i2c->base = I2C3_BASE;
  670. i2c->pdmabase = I2C3_APDMA_BASE;
  671. break;
  672. case I2C3: /*remap*/
  673. i2c->base = I2C4_BASE;
  674. i2c->pdmabase = I2C4_APDMA_BASE;
  675. break;
  676. case I2C4: /*remap*/
  677. i2c->base = I2C5_BASE;
  678. i2c->pdmabase = I2C5_APDMA_BASE;
  679. break;
  680. case I2C6:
  681. i2c->base = I2C6_BASE;
  682. i2c->pdmabase = I2C6_APDMA_BASE;
  683. break;
  684. case I2C7:
  685. i2c->base = I2C7_BASE;
  686. i2c->pdmabase = I2C7_APDMA_BASE;
  687. break;
  688. case I2C8:
  689. i2c->base = I2C8_BASE;
  690. i2c->pdmabase = I2C8_APDMA_BASE;
  691. break;
  692. case I2C9:
  693. i2c->base = I2C9_BASE;
  694. i2c->pdmabase = I2C9_APDMA_BASE;
  695. break;
  696. default:
  697. I2CERR("invalid para: i2c->id=%d\n",i2c->id);
  698. break;
  699. }
  700. if (i2c->st_rs == I2C_TRANS_REPEATED_START)
  701. i2c->st_rs = I2C_TRANS_REPEATED_START;
  702. else
  703. i2c->st_rs = I2C_TRANS_STOP;
  704. #if 0
  705. if (i2c->dma_en == TRUE)
  706. i2c->dma_en = TRUE;
  707. else
  708. i2c->dma_en = FALSE;
  709. #else
  710. i2c->dma_en = FALSE;
  711. #endif
  712. i2c->poll_en = TRUE;
  713. if (i2c->filter_msg == TRUE)
  714. i2c->filter_msg = TRUE;
  715. else
  716. i2c->filter_msg = FALSE;
  717. ///*Set device speed,set it before set_control register
  718. if (0 == i2c->speed) {
  719. i2c->mode = ST_MODE;
  720. i2c->speed = MAX_ST_MODE_SPEED;
  721. } else {
  722. if (i2c->mode == HS_MODE)
  723. i2c->mode = HS_MODE;
  724. else
  725. i2c->mode = FS_MODE;
  726. }
  727. /*Set ioconfig*/
  728. if (i2c->pushpull==TRUE)
  729. i2c->pushpull=TRUE;
  730. else
  731. i2c->pushpull=FALSE;
  732. }
  733. /*-----------------------------------------------------------------------
  734. * new read interface: Read bytes
  735. * mt_i2c: I2C chip config, see mt_i2c_t.
  736. * buffer: Where to read/write the data.
  737. * len: How many bytes to read/write
  738. * Returns: ERROR_CODE
  739. */
  740. S32 i2c_read(mt_i2c *i2c,U8 *buffer, U32 len)
  741. {
  742. S32 ret = I2C_OK;
  743. #ifdef I2C_EARLY_PORTING
  744. I2CFUC();
  745. #endif
  746. //read
  747. i2c->read_flag|= I2C_M_RD;
  748. i2c->op = I2C_MASTER_RD;
  749. i2c->msg_buf = buffer;
  750. i2c->msg_len = len;
  751. ret=_i2c_check_para(i2c);
  752. if (ret< 0) {
  753. I2CERR(" _i2c_check_para fail\n");
  754. goto err;
  755. }
  756. _config_mt_i2c(i2c);
  757. //get the addr
  758. ret=_i2c_transfer_interface(i2c);
  759. if ((int)i2c->msg_len != ret) {
  760. I2CERR("read %d bytes fails,ret=%d.\n",i2c->msg_len,ret);
  761. ret = -1;
  762. return ret;
  763. } else {
  764. ret = I2C_OK;
  765. //I2CLOG("read %d bytes pass,ret=%d.\n",i2c->msg_len,ret);
  766. }
  767. err:
  768. return ret;
  769. }
  770. /*-----------------------------------------------------------------------
  771. * New write interface: Write bytes
  772. * i2c: I2C chip config, see mt_i2c_t.
  773. * buffer: Where to read/write the data.
  774. * len: How many bytes to read/write
  775. * Returns: ERROR_CODE
  776. */
  777. S32 i2c_write(mt_i2c *i2c,U8 *buffer, U32 len)
  778. {
  779. S32 ret = I2C_OK;
  780. #ifdef I2C_EARLY_PORTING
  781. I2CFUC();
  782. #endif
  783. //write
  784. i2c->read_flag = !I2C_M_RD;
  785. i2c->op = I2C_MASTER_WR;
  786. i2c->msg_buf = buffer;
  787. i2c->msg_len = len;
  788. ret=_i2c_check_para(i2c);
  789. if (ret< 0) {
  790. I2CERR(" _i2c_check_para fail\n");
  791. goto err;
  792. }
  793. _config_mt_i2c(i2c);
  794. //get the addr
  795. ret=_i2c_transfer_interface(i2c);
  796. if ((int)i2c->msg_len != ret) {
  797. I2CERR("Write %d bytes fails,ret=%d.\n",i2c->msg_len,ret);
  798. ret = -1;
  799. return ret;
  800. } else {
  801. ret = I2C_OK;
  802. //I2CLOG("Write %d bytes pass,ret=%d.\n",i2c->msg_len,ret);
  803. }
  804. err:
  805. return ret;
  806. }
  807. /*-----------------------------------------------------------------------
  808. * New write then read back interface: Write bytes then read bytes
  809. * i2c: I2C chip config, see mt_i2c_t.
  810. * buffer: Where to read/write the data.
  811. * write_len: How many bytes to write
  812. * read_len: How many bytes to read
  813. * Returns: ERROR_CODE
  814. */
  815. S32 i2c_write_read(mt_i2c *i2c,U8 *buffer, U32 write_len, U32 read_len)
  816. {
  817. S32 ret = I2C_OK;
  818. //I2CFUC();
  819. //write and read
  820. i2c->op = I2C_MASTER_WRRD;
  821. i2c->read_flag=!I2C_M_RD;
  822. i2c->msg_buf = buffer;
  823. i2c->msg_len = ((read_len & 0xFFFF) << 16) | (write_len & 0xFFFF);
  824. ret=_i2c_check_para(i2c);
  825. if (ret< 0) {
  826. I2CERR(" _i2c_check_para fail\n");
  827. goto err;
  828. }
  829. _config_mt_i2c(i2c);
  830. //get the addr
  831. ret=_i2c_transfer_interface(i2c);
  832. if ((int)i2c->msg_len != ret) {
  833. I2CERR("write_read 0x%x bytes fails,ret=%d.\n",i2c->msg_len,ret);
  834. ret = -1;
  835. return ret;
  836. } else {
  837. ret = I2C_OK;
  838. //I2CLOG("write_read 0x%x bytes pass,ret=%d.\n",i2c->msg_len,ret);
  839. }
  840. err:
  841. return ret;
  842. }
  843. int i2c_hw_init(void)
  844. {
  845. #ifdef I2C_EARLY_PORTING
  846. mt_i2c_test();
  847. #endif
  848. return 0;
  849. }
  850. /* Test I2C */
  851. #ifdef I2C_EARLY_PORTING
  852. U32 mt_i2c_test_device(int id, int addr, int offset, int value)
  853. {
  854. U32 ret = 0;
  855. U32 len = 0;
  856. U8 write_byte[2], read_byte[2];
  857. U32 delay_count = 0xff;
  858. struct mt_i2c_t i2c;
  859. //int i = 0;
  860. I2CLOG("i2c %d test start++++++++++++++++++++\n", id);
  861. i2c.id = id;
  862. i2c.addr = addr;
  863. i2c.mode = FS_MODE;
  864. i2c.speed = 200;
  865. /* i2c.mode = FS_MODE;
  866. i2c.speed = 200;*/
  867. /* ================================================== */
  868. I2CLOG("\ntest i2c write\n\n");
  869. write_byte[0] = offset;
  870. write_byte[1] = value;
  871. len = 2;
  872. ret = i2c_write(&i2c, write_byte, len);
  873. if (I2C_OK != ret) {
  874. I2CERR("Write 2 bytes fails(%lx).\n", ret);
  875. ret = -1;
  876. return ret;
  877. } else {
  878. I2CLOG("Write 2 bytes pass,these bytes are %x, %x.\n", write_byte[0],
  879. write_byte[1]);
  880. }
  881. /* mdelay(1000); */
  882. for (delay_count = 0xff; delay_count > 0; delay_count--) ;
  883. /* ================================================== */
  884. I2CLOG("\ntest i2c read\n\n");
  885. //1st:write addree 00,1byte(0x0A)
  886. //write_byte[0] = 0x0e;
  887. write_byte[0] = offset;
  888. len = 1;
  889. ret = i2c_write(&i2c, write_byte, len);
  890. if (I2C_OK != ret) {
  891. I2CERR("Write 1 bytes fails(%lx).\n", ret);
  892. ret = -1;
  893. return ret;
  894. //continue;
  895. } else {
  896. I2CLOG("Write 1 bytes pass,these bytes are %x.\n", write_byte[0]);
  897. }
  898. /* mdelay(1000); */
  899. for (delay_count = 0xff; delay_count > 0; delay_count--) ;
  900. /* 2rd:read back 1byte(0x0A) */
  901. read_byte[0] = 0x55;
  902. len = 1;
  903. ret = i2c_read(&i2c, read_byte, len);
  904. if ((I2C_OK != ret) || read_byte[0] != value) {
  905. I2CERR("read 1 bytes fails(%lx).\n", ret);
  906. I2CLOG("read 1 bytes ,read_byte=%x\n", read_byte[0]);
  907. ret = -1;
  908. return ret;
  909. //continue;
  910. } else {
  911. I2CLOG("read 1 bytes pass,read_byte=%x\n", read_byte[0]);
  912. }
  913. /* mdelay(1000); */
  914. for (delay_count = 0xff; delay_count > 0; delay_count--) ;
  915. /* ================================================== */
  916. I2CLOG("\ntest i2c write_read\n\n");
  917. read_byte[0] = offset;
  918. /* write_byte[1] = 0x34; */
  919. len = (1 & 0xFF) << 8 | (1 & 0xFF);
  920. ret = i2c_write_read(&i2c, read_byte, 1, 1);
  921. if (I2C_OK != ret || read_byte[0] != value) {
  922. I2CERR("write_read 1 byte fails(ret=%lx).\n", ret);
  923. I2CLOG("write_read 1 byte fails, read_byte=%x\n", read_byte[0]);
  924. ret = -1;
  925. return ret;
  926. } else {
  927. I2CLOG("Write_Read 1 byte pass ,this byte is %x.\n", read_byte[0]);
  928. ret = 0;
  929. }
  930. I2CLOG("i2c %d test done-------------------\n", id);
  931. return ret;
  932. }
  933. int mt_i2c_test(void)
  934. {
  935. int ret;
  936. int i = 0;
  937. for (i = 0; i < 1; i++) {
  938. //ret = mt_i2c_test_eeprom(i);
  939. ret = mt_i2c_test_device(i, 0x0c, 0x31, 0x03);
  940. if (0 == ret) {
  941. I2CLOG("I2C%d,EEPROM test PASS!!\n", i);
  942. } else {
  943. I2CLOG("I2C%d,EEPROM test FAIL!!(%d)\n", i, ret);
  944. }
  945. }
  946. return 0;
  947. }
  948. #endif