newton:add IRDA driver
[firefly-linux-kernel-4.4.55.git] / drivers / net / irda / bu92725guw.c
1 /***************************************************************************\r
2  *\r
3  * File:          bu92725guw.c\r
4  *\r
5  * Description:   functions of operating with bu92725guw board.\r
6  *\r
7  * Created:       2007/9\r
8  *\r
9  * Rev 1.1\r
10  *\r
11  *\r
12  * Confidential ROHM CO.,LTD.\r
13  *\r
14  ****************************************************************************/\r
15 \r
16 #include <linux/module.h>\r
17 #include <linux/delay.h>\r
18 #include <linux/errno.h>\r
19 #include <linux/platform_device.h>\r
20 #include <linux/fs.h>\r
21 #include <linux/kernel.h>\r
22 #include <linux/slab.h>\r
23 #include <linux/mm.h>\r
24 #include <linux/ioport.h>\r
25 #include <linux/init.h>\r
26 #include <linux/sched.h>\r
27 #include <linux/pci.h>\r
28 #include <linux/random.h>\r
29 #include <linux/version.h>\r
30 #include <linux/mutex.h>\r
31 #include <linux/videodev2.h>\r
32 #include <linux/dma-mapping.h>\r
33 #include <linux/interrupt.h>\r
34 #include <linux/kthread.h>\r
35 #include <linux/highmem.h>\r
36 #include <linux/freezer.h>\r
37 \r
38 #include "rk29_ir.h"\r
39 \r
40 #if 0\r
41 #define RK29IR_DBG(x...) printk(x)\r
42 #else\r
43 #define RK29IR_DBG(x...)\r
44 #endif\r
45 \r
46 \r
47  /*---------------------------------------------------------------------------\r
48                                 Data\r
49 ----------------------------------------------------------------------------*/\r
50 /* record current setting\r
51 */\r
52 static u32 curTrans_mode;  /* SIR, MIR, FIR */\r
53 static u32 curTrans_speed; /* 2.4kbps, 9.6kbps,..., 4Mbps */\r
54 static u32 curTrans_way;   /* idle, send, receive, auto-multi-receive, multi-receive, multi-send */\r
55 static u16 curFIT;         /* FIT2,1,0 in PWR/FIT register */\r
56 \r
57 /*---------------------------------------------------------------------------\r
58                                 Function Proto\r
59 ----------------------------------------------------------------------------*/\r
60 static void internal_set(u8 modeChg);\r
61 \r
62 /*---------------------------------------------------------------------------\r
63                                 global Function Implement\r
64 ----------------------------------------------------------------------------*/\r
65 /*\r
66  * Synopsis:  board initialize\r
67  *\r
68  * Paras:     none\r
69  *\r
70  * Return:    none\r
71  */\r
72 void irda_hw_init(struct rk29_irda *si)\r
73 {\r
74     //smc0_init(&si->irda_base_addr);\r
75 \r
76     //printk("%s [%d]\n",__FUNCTION__,__LINE__);\r
77 }\r
78 void irda_hw_deinit(struct rk29_irda *si)\r
79 {\r
80    // smc0_init(&si->irda_base_addr);\r
81 }\r
82 \r
83 int irda_hw_startup(struct rk29_irda *si)\r
84 {\r
85     volatile u16 val;\r
86     int i=0;\r
87         RK29IR_DBG("line %d: enter %s\n", __LINE__, __FUNCTION__);\r
88 \r
89     //IER (disable all)\r
90         BU92725GUW_WRITE_REG(REG_IER_ADDR, 0x0000);\r
91 \r
92 //MCR (use IrDA Controller func, 9.6kbps, SIR)\r
93         BU92725GUW_WRITE_REG(REG_MCR_ADDR, REG_MCR_9600 | REG_MCR_SIR);\r
94 \r
95 //PWR/FIT (default)\r
96         BU92725GUW_WRITE_REG(REG_PWR_FIT_ADDR, REG_PWR_FIT_MPW_3 | REG_PWR_FIT_FPW_2 | REG_PWR_FIT_FIT_0);\r
97 \r
98 //TRCR (idle, clr fifo, IrDA power on, mode select enable)\r
99         BU92725GUW_WRITE_REG(REG_TRCR_ADDR, REG_TRCR_FCLR | REG_TRCR_MS_EN);\r
100         val = BU92725GUW_READ_REG(REG_TRCR_ADDR);\r
101         while (val & REG_TRCR_MS_EN) {\r
102                 val = BU92725GUW_READ_REG(REG_TRCR_ADDR);\r
103         }\r
104 \r
105 //FTLV\r
106         BU92725GUW_WRITE_REG(REG_FTLV_ADDR, 0x0000);\r
107 \r
108 //    for(i=0; i<REG_WREC_ADDR;i=(i+2))//%REG_WREC_ADDR) //\r
109 //        printk("reg %d = 0x%x\n",i,BU92725GUW_READ_REG(i));\r
110 \r
111         curTrans_mode = BU92725GUW_SIR;\r
112         curTrans_speed = 9600;\r
113         curTrans_way = BU92725GUW_IDLE;\r
114         curFIT = REG_PWR_FIT_FIT_0;\r
115     return 0;\r
116 }\r
117 \r
118 int irda_hw_shutdown(struct rk29_irda *si)\r
119 {\r
120         RK29IR_DBG("line %d: enter %s\n", __LINE__, __FUNCTION__);\r
121 \r
122     //IER (diable all)\r
123         BU92725GUW_WRITE_REG(REG_IER_ADDR, 0x0000);\r
124 \r
125 //MCR (use IrDA Controller func, 9.6kbps, SIR)\r
126         BU92725GUW_WRITE_REG(REG_MCR_ADDR, REG_MCR_9600 | REG_MCR_SIR);\r
127 \r
128 //PWR/FIT (default)\r
129         BU92725GUW_WRITE_REG(REG_PWR_FIT_ADDR, REG_PWR_FIT_MPW_3 | REG_PWR_FIT_FPW_2 | REG_PWR_FIT_FIT_0);\r
130 \r
131 //TRCR (idle, clr fifo, IrDA power down)\r
132         BU92725GUW_WRITE_REG(REG_TRCR_ADDR, REG_TRCR_FCLR | REG_TRCR_IRPD);\r
133 \r
134 //FTLV\r
135         BU92725GUW_WRITE_REG(REG_FTLV_ADDR, 0x0000);\r
136 \r
137         curTrans_mode = BU92725GUW_SIR;\r
138         curTrans_speed = 9600;\r
139         curTrans_way = BU92725GUW_IDLE;\r
140         curFIT = REG_PWR_FIT_FIT_0;\r
141 \r
142     return 0;\r
143 }\r
144 \r
145 /*\r
146  * Synopsis:  set data transfer speed\r
147  *\r
148  * Paras:     speed - speed value will be set; value is from enum eTrans_Speed\r
149  *\r
150  * Return:    none\r
151  */\r
152 int irda_hw_set_speed(u32 speed)\r
153 {\r
154         u32 mode;\r
155         u8 modeChg = 0;\r
156 \r
157         /* do nothing if speed is same as current */\r
158         RK29IR_DBG("line %d: enter %s, speed=%d\n", __LINE__, __FUNCTION__, speed);\r
159 \r
160         if (speed == curTrans_speed)\r
161                 return 0;\r
162 \r
163         /* mode */\r
164         switch (speed) {\r
165         case 2400:\r
166         case 9600:\r
167         case 19200:\r
168         case 38400:\r
169         case 57600:\r
170         case 115200:\r
171                 mode = BU92725GUW_SIR;\r
172                 break;\r
173         case 576000:\r
174         case 1152000:\r
175                 mode = BU92725GUW_MIR;\r
176                 break;\r
177         case 4000000:\r
178                 mode = BU92725GUW_FIR;\r
179                 break;\r
180         default:\r
181                 return -1; //invalid\r
182         }\r
183 \r
184         /* speed */\r
185         curTrans_speed = speed;\r
186 \r
187         /* change trans way if needed */\r
188         switch (curTrans_way) {\r
189         case BU92725GUW_IDLE:\r
190                 break;\r
191         case BU92725GUW_REV:\r
192                 if (mode != BU92725GUW_SIR)\r
193                         curTrans_way = BU92725GUW_AUTO_MULTI_REV;\r
194                         //curTrans_way = BU92725GUW_MULTI_REV;\r
195                 break;\r
196         case BU92725GUW_SEND:\r
197                 if (mode != BU92725GUW_SIR)\r
198                         curTrans_way = BU92725GUW_MULTI_SEND;\r
199                 break;\r
200         case BU92725GUW_AUTO_MULTI_REV:\r
201                 if (mode == BU92725GUW_SIR)\r
202                         curTrans_way = BU92725GUW_REV;\r
203                 break;\r
204         case BU92725GUW_MULTI_REV: //not used now\r
205                 if (mode == BU92725GUW_SIR)\r
206                         curTrans_way = BU92725GUW_REV;\r
207                 break;\r
208         case BU92725GUW_MULTI_SEND:\r
209                 if (mode == BU92725GUW_SIR)\r
210                         curTrans_way = BU92725GUW_SEND;\r
211                 break;\r
212         }\r
213 \r
214         if (mode != curTrans_mode) {\r
215                 if ((mode == BU92725GUW_FIR) || (curTrans_mode == BU92725GUW_FIR))\r
216                         modeChg = 1; /* need set TRCR5:MS_EN */\r
217         }\r
218 \r
219         curTrans_mode = mode;\r
220 \r
221         /* set bu92725guw registers */\r
222         //internal_set(modeChg);\r
223         internal_set(1);\r
224 \r
225     return 0;\r
226 }\r
227 \r
228 int irda_hw_tx_enable_irq(enum eTrans_Mode mode)\r
229 {\r
230 \r
231         RK29IR_DBG("line %d: enter %s\n", __LINE__, __FUNCTION__);\r
232         /* hardware-specific code\r
233         */\r
234         if (mode == BU92725GUW_SIR)\r
235                 BU92725GUW_set_trans_way(BU92725GUW_SEND);\r
236         else\r
237                 BU92725GUW_set_trans_way(BU92725GUW_MULTI_SEND);\r
238 \r
239         //BU92725GUW_clr_fifo();\r
240 \r
241     return 0;\r
242 }\r
243 \r
244 int irda_hw_tx_enable(int len)\r
245 {\r
246         RK29IR_DBG("line %d: enter %s\n", __LINE__, __FUNCTION__);\r
247     BU92725GUW_WRITE_REG(REG_FTLV_ADDR, len);\r
248     BU92725GUW_WRITE_REG(REG_TRCR_ADDR, REG_TRCR_TX_EN);\r
249     return 0;\r
250 }\r
251 \r
252 int irda_hw_get_irqsrc(void)\r
253 {\r
254         RK29IR_DBG("line %d: enter %s\n", __LINE__, __FUNCTION__);\r
255     return BU92725GUW_READ_REG(REG_EIR_ADDR);\r
256 }\r
257 \r
258 int irda_hw_get_data16(char* data8)\r
259 {\r
260     u16 data16 = 0;\r
261     int len = 0;\r
262 \r
263         RK29IR_DBG("line %d: enter %s\n", __LINE__, __FUNCTION__);\r
264 \r
265     len = BU92725GUW_READ_REG(REG_FLV_ADDR);\r
266     if(len > 0)\r
267     {\r
268         /* read data from RXD */\r
269         data16 = BU92725GUW_READ_REG(REG_RXD_ADDR);\r
270         data8[0]        = (u8)data16;\r
271         data8[1]        = (u8)(data16 >> 8);\r
272         return 2;\r
273     }   else    {\r
274         return 0;\r
275     }\r
276 }\r
277 \r
278 void irda_hw_set_moderx(void)\r
279 {\r
280    // frData.ucFlags &= ~(FRMF_TX_ACTIVE);\r
281    // frData.ucFlags |= FRMF_RX_ACTIVE;\r
282 \r
283     int i=0;\r
284     /* hardware-specific code\r
285         */\r
286         RK29IR_DBG("line %d: enter %s\n", __LINE__, __FUNCTION__);\r
287         \r
288         //BU92725GUW_clr_fifo();\r
289 \r
290         if (curTrans_mode == BU92725GUW_SIR)\r
291                 BU92725GUW_set_trans_way(BU92725GUW_REV);\r
292         else\r
293                 BU92725GUW_set_trans_way(BU92725GUW_AUTO_MULTI_REV);\r
294                 //BU92725GUW_set_trans_way(BU92725GUW_MULTI_REV);\r
295 }\r
296 \r
297 int irda_hw_get_mode(void)\r
298 {\r
299         return curTrans_way;\r
300                 \r
301     u16 val = 0;\r
302     val = BU92725GUW_READ_REG(REG_TRCR_ADDR);\r
303         RK29IR_DBG("line %d: enter %s, REG_TRCR_ADDR = 0x%x\n", __LINE__, __FUNCTION__, val);\r
304 \r
305     return (val& (REG_TRCR_TX_EN | REG_TRCR_RX_EN));\r
306 }\r
307 \r
308 /*\r
309  * Synopsis:  set data transfer way\r
310  *\r
311  * Paras:     way - transfer way will be set; value is from enum eThrans_Way\r
312  *\r
313  * Return:    none\r
314  */\r
315 void BU92725GUW_set_trans_way(u32 way)\r
316 {\r
317         RK29IR_DBG("line %d: enter %s\n", __LINE__, __FUNCTION__);\r
318         if (way == curTrans_way)\r
319                 return;\r
320 \r
321         curTrans_way = way;\r
322 \r
323         /* set bu92725guw registers */\r
324         internal_set(1);\r
325 }\r
326 \r
327 /*\r
328  * Synopsis:  clear fifo\r
329  *\r
330  * Paras:     none\r
331  *\r
332  * Return:    none\r
333  */\r
334 void BU92725GUW_clr_fifo(void)\r
335 {\r
336         volatile u16 val;\r
337 \r
338         RK29IR_DBG("line %d: enter %s\n", __LINE__, __FUNCTION__);\r
339         /* set TRCR4:FCLR */\r
340         val = BU92725GUW_READ_REG(REG_TRCR_ADDR);\r
341         val &= 0xff8f;\r
342         val |= REG_TRCR_FCLR;\r
343         BU92725GUW_WRITE_REG(REG_TRCR_ADDR, val);\r
344 \r
345         /* wait op complete */\r
346         val = BU92725GUW_READ_REG(REG_TRCR_ADDR);\r
347         while (val & REG_TRCR_FCLR)\r
348                 val = BU92725GUW_READ_REG(REG_TRCR_ADDR);\r
349 }\r
350 \r
351 /*\r
352  * Synopsis:  read frame data from fifo\r
353  *\r
354  * Paras:     buf - point to buffer for storing frame data\r
355  *\r
356  * Return:    number of data got from fifo (in byte)\r
357  */\r
358 u16 BU92725GUW_get_data(u8 *buf)\r
359 {\r
360         volatile u16 data;\r
361         u16 len, count, i;\r
362 \r
363         RK29IR_DBG("line %d: enter %s\n", __LINE__, __FUNCTION__);\r
364 \r
365         /* get data count from FLV or FLVII */\r
366         if (curTrans_way == BU92725GUW_REV)\r
367                 len = BU92725GUW_READ_REG(REG_FLV_ADDR);\r
368         else\r
369                 len = BU92725GUW_READ_REG(REG_FLVII_ADDR);\r
370 \r
371         count = (len % 2)? (len / 2 + 1) : (len / 2);\r
372 \r
373         /* read data from RXD */\r
374         for (i=0; i<count; i++) {\r
375                 data = BU92725GUW_READ_REG(REG_RXD_ADDR);\r
376                 buf[i * 2]              = (u8)data;\r
377                 buf[i * 2 + 1]  = (u8)(data >> 8);\r
378         }\r
379 \r
380          /* restart receive mode under SIR */\r
381         if (curTrans_way == BU92725GUW_REV) {\r
382                 BU92725GUW_WRITE_REG(REG_TRCR_ADDR, 0x0000);\r
383                 BU92725GUW_WRITE_REG(REG_TRCR_ADDR, REG_TRCR_RX_EN);\r
384         }\r
385 \r
386         return len;\r
387 }\r
388 \r
389 /*\r
390  * Synopsis:  write data from buffer1 and buffer2 into fifo\r
391  *\r
392  * Paras:     buf1 - point to buffer 1\r
393  *            len1 - length of data to write into fifo from buffer 1\r
394  *            buf2 - point to buffer 2\r
395  *            len2 - length of data to write into fifo from buffer 2\r
396  *\r
397  * Return:    none\r
398  */\r
399  void BU92725GUW_send_data(u8 *buf1, u16 len1, u8 *buf2, u16 len2)\r
400 {/* buf2,len2 will be used by framer under MIR/FIR mode */\r
401         u16 data, len, pos;\r
402         u8  *ptr;\r
403 \r
404         len = len1 + len2;\r
405         pos = 0;\r
406         ptr = (u8 *)(&data);\r
407 \r
408         RK29IR_DBG("line %d: enter %s\n", __LINE__, __FUNCTION__);\r
409 \r
410         if (len == 0)\r
411                 return;\r
412         \r
413         /* set FTLV */\r
414         BU92725GUW_WRITE_REG(REG_FTLV_ADDR, len);\r
415 \r
416         /* set TRCR:TX_EN under normal send mode */\r
417         if (curTrans_way == BU92725GUW_SEND)  {//SIR\r
418                 BU92725GUW_WRITE_REG(REG_TRCR_ADDR, REG_TRCR_TX_EN);\r
419         }\r
420 \r
421 \r
422         /* set TXD */\r
423         while (pos < len) {\r
424 \r
425                 *ptr++ = (pos < len1)? buf1[pos] : buf2[pos-len1];\r
426 \r
427                 pos++;\r
428 \r
429                 if (pos < len) {\r
430                         *ptr-- = (pos < len1)? buf1[pos] : buf2[pos-len1];\r
431                 } else\r
432                         *ptr-- = 0x00;\r
433 \r
434                 pos++;\r
435 \r
436                 BU92725GUW_WRITE_REG(REG_TXD_ADDR, data);\r
437         }\r
438 }\r
439 \r
440 /*\r
441  * Synopsis:  set frame sending interval under multi-window send mode\r
442  *\r
443  * Paras:     us - interval time value to set\r
444  *\r
445  * Return:    none\r
446  */\r
447 void BU92725GUW_set_frame_interval(u32 us)\r
448 {\r
449         volatile u16 val;\r
450 \r
451         RK29IR_DBG("line %d: enter %s\n", __LINE__, __FUNCTION__);\r
452         /* set PWR/FIT */\r
453 \r
454         val = BU92725GUW_READ_REG(REG_PWR_FIT_ADDR);\r
455         //val &= 0xf8ff;\r
456         val &= 0xf0ff;\r
457         \r
458         if (us <= 100)\r
459                 val |= REG_PWR_FIT_FIT_0;\r
460         else if (us <= 200)\r
461                 val |= REG_PWR_FIT_FIT_1;\r
462         else if (us <= 300)\r
463                 val |= REG_PWR_FIT_FIT_2;\r
464         else if (us <= 400)\r
465                 val |= REG_PWR_FIT_FIT_3;\r
466         else if (us <= 500)\r
467                 val |= REG_PWR_FIT_FIT_4;\r
468         else if (us <= 600)\r
469                 val |= REG_PWR_FIT_FIT_5;\r
470         else if (us <= 800)\r
471                 val |= REG_PWR_FIT_FIT_6;\r
472         else if (us <= 1000)\r
473                 val |= REG_PWR_FIT_FIT_7;\r
474         else if (us <= 1200)\r
475                 val |= REG_PWR_FIT_FIT_8;\r
476         else if (us <= 1400)\r
477                 val |= REG_PWR_FIT_FIT_9;\r
478         else if (us <= 1600)\r
479                 val |= REG_PWR_FIT_FIT_A;\r
480         else if (us <= 1800)\r
481                 val |= REG_PWR_FIT_FIT_B;\r
482         else if (us <= 2000)\r
483                 val |= REG_PWR_FIT_FIT_C;\r
484         else if (us <= 2200)\r
485                 val |= REG_PWR_FIT_FIT_D;\r
486         else if (us <= 2400)\r
487                 val |= REG_PWR_FIT_FIT_E;\r
488         else\r
489                 val |= REG_PWR_FIT_FIT_F;\r
490 \r
491         BU92725GUW_WRITE_REG(REG_PWR_FIT_ADDR, val);\r
492 \r
493         //curFIT = val & 0x0700;\r
494         curFIT = val & 0x0F00;\r
495 }\r
496 \r
497 /*\r
498  * Synopsis:  return current transfer mode (SIR/MIR/FIR)\r
499  *\r
500  * Paras:     none\r
501  *\r
502  * Return:    current transfer mode\r
503  */\r
504 u32 BU92725GUW_get_trans_mode(void)\r
505 {\r
506         RK29IR_DBG("line %d: enter %s\n", __LINE__, __FUNCTION__);\r
507         return curTrans_mode;\r
508 }\r
509 \r
510 /*\r
511  * Synopsis:  add a IrDA pulse following frame\r
512  *\r
513  * Paras:     none\r
514  *\r
515  * Return:    none\r
516  */\r
517 void BU92725GUW_add_pulse(void)\r
518 {\r
519         RK29IR_DBG("line %d: enter %s\n", __LINE__, __FUNCTION__);\r
520         /* valid only under M/FIR send mode */\r
521         if (curTrans_way != BU92725GUW_MULTI_SEND)\r
522                 return;\r
523 \r
524         /* set TRCR3:IR_PLS */\r
525         BU92725GUW_WRITE_REG(REG_TRCR_ADDR, REG_TRCR_IR_PLS | REG_TRCR_TX_CON);\r
526 }\r
527 \r
528 /*\r
529  * Synopsis:  soft reset bu92725guw board; will be called after some error happened\r
530  *\r
531  * Paras:     none\r
532  *\r
533  * Return:    none\r
534  */\r
535 void BU92725GUW_reset(void)\r
536 {\r
537         RK29IR_DBG("line %d: enter %s\n", __LINE__, __FUNCTION__);\r
538         /* set bu925725guw registers */\r
539         internal_set(1);\r
540 }\r
541 \r
542 /*---------------------------------------------------------------------------\r
543                                 local Function Implement\r
544 ----------------------------------------------------------------------------*/\r
545 /*\r
546  * Synopsis:  set bu92725guw internal registers\r
547  *\r
548  * Paras:     modeChg - need set TRCR5:MS_EN or not\r
549  *\r
550  * Return:    none\r
551  */\r
552 static void internal_set(u8 modeChg)\r
553 {\r
554         volatile u16 val;\r
555 \r
556         RK29IR_DBG("line %d: enter %s\n", __LINE__, __FUNCTION__);\r
557         /* disable INT */\r
558         BU92725GUW_WRITE_REG(REG_IER_ADDR, 0x0000);\r
559         val = BU92725GUW_READ_REG(REG_EIR_ADDR);\r
560 \r
561         /* MCR */\r
562         val = 0;\r
563         switch (curTrans_mode) {\r
564         case BU92725GUW_SIR: //00\r
565                 val |= REG_MCR_SIR;\r
566                 break;\r
567         case BU92725GUW_MIR: //01\r
568                 val |= REG_MCR_MIR;\r
569                 break;\r
570         case BU92725GUW_FIR: //10\r
571                 val |= REG_MCR_FIR;\r
572                 break;\r
573         }\r
574         switch (curTrans_speed) {\r
575         case 2400: //000\r
576                 val |= REG_MCR_2400;\r
577                 break;\r
578         case 9600: //010\r
579                 val |= REG_MCR_9600;\r
580                 break;\r
581         case 19200: //011\r
582                 val |= REG_MCR_19200;\r
583                 break;\r
584         case 38400: //100\r
585                 val |= REG_MCR_38400;\r
586                 break;\r
587         case 57600: //101\r
588                 val |= REG_MCR_57600;\r
589                 break;\r
590         case 115200: //110\r
591                 val |= REG_MCR_115200;\r
592                 break;\r
593         case 576000: //001\r
594                 val |= REG_MCR_576K;\r
595                 break;\r
596         case 1152000: //010\r
597                 val |= REG_MCR_1152K;\r
598                 break;\r
599         case 4000000: //010\r
600                 val |= REG_MCR_4M;\r
601                 break;\r
602         }\r
603         BU92725GUW_WRITE_REG(REG_MCR_ADDR, val);\r
604         RK29IR_DBG("REG_MCR_ADDR: 0x%x\n", val);\r
605 \r
606         /* PWR / FIT */\r
607         switch (curTrans_mode) {\r
608         case BU92725GUW_SIR:\r
609                 val = 0x0000;\r
610                 break;\r
611         case BU92725GUW_MIR:\r
612                 val = REG_PWR_FIT_MPW_3 | curFIT;\r
613                 break;\r
614         case BU92725GUW_FIR:\r
615                 val = REG_PWR_FIT_FPW_2 | curFIT;\r
616                 break;\r
617         }\r
618         BU92725GUW_WRITE_REG(REG_PWR_FIT_ADDR, val);\r
619         RK29IR_DBG("REG_PWR_FIT_ADDR: 0x%x\n", val);\r
620 \r
621         /* TRCR:MS_EN */\r
622         if (modeChg) {\r
623                 BU92725GUW_WRITE_REG(REG_TRCR_ADDR, REG_TRCR_MS_EN);\r
624                 val = BU92725GUW_READ_REG(REG_TRCR_ADDR);\r
625                 while (val & REG_TRCR_MS_EN) {\r
626                         val = BU92725GUW_READ_REG(REG_TRCR_ADDR);\r
627                 }\r
628         }\r
629 \r
630         /* TRCR */\r
631         switch (curTrans_way) {\r
632         case BU92725GUW_IDLE:\r
633                 val = 0x0000;\r
634                 break;\r
635         case BU92725GUW_REV:\r
636                 val = REG_TRCR_RX_EN;\r
637                 break;\r
638         case BU92725GUW_SEND:\r
639                 val = 0x0000;\r
640                 break;\r
641         case BU92725GUW_AUTO_MULTI_REV:\r
642                 val = REG_TRCR_RX_EN | REG_TRCR_AUTO_FLV_CP;\r
643                 break;\r
644         case BU92725GUW_MULTI_REV: //not used\r
645                 val = REG_TRCR_RX_EN | REG_TRCR_RX_CON;\r
646                 break;\r
647         case BU92725GUW_MULTI_SEND:\r
648                 val = REG_TRCR_TX_CON;\r
649                 break;\r
650         }\r
651         BU92725GUW_WRITE_REG(REG_TRCR_ADDR, val);\r
652         RK29IR_DBG("REG_TRCR_ADDR: 0x%x\n", val);\r
653 \r
654         /* IER */\r
655         switch (curTrans_way) {\r
656         case BU92725GUW_IDLE:\r
657                 val = 0x0000;\r
658                 break;\r
659 \r
660         case BU92725GUW_REV: /* SIR use */\r
661                 val = REG_INT_EOFRX | REG_INT_TO | REG_INT_OE | REG_INT_FE; //IER1, 2, 5, 7\r
662                 break;\r
663 \r
664         case BU92725GUW_SEND: /* SIR use */\r
665                 val = REG_INT_TXE; //IER3\r
666                 break;\r
667 \r
668         case BU92725GUW_MULTI_REV: /* not used */\r
669                 val = REG_INT_STFRX | REG_INT_TO | REG_INT_CRC | REG_INT_OE | REG_INT_EOF | REG_INT_AC | REG_INT_DECE | \r
670                           REG_INT_RDOE | REG_INT_DEX | REG_INT_RDUE; //IER1,2, 4, 5, 6, 7, 8, 9, 10\r
671                 break;\r
672 \r
673         case BU92725GUW_AUTO_MULTI_REV: /* M/FIR use */\r
674                 val = REG_INT_TO | REG_INT_CRC | REG_INT_OE | REG_INT_EOF | REG_INT_AC | REG_INT_DECE | \r
675                           REG_INT_RDOE | REG_INT_DEX | REG_INT_RDE; //IER2, 4, 5, 6, 7, 8, 9, 12\r
676                 break;\r
677 \r
678         case BU92725GUW_MULTI_SEND: /* M/FIR use */\r
679                 val = REG_INT_TO | REG_INT_TXE | REG_INT_WRE; //IER2, 3, 11\r
680                 break;\r
681         }\r
682         BU92725GUW_WRITE_REG(REG_IER_ADDR, val);\r
683         RK29IR_DBG("REG_IER_ADDR: 0x%x\n", val);\r
684 }\r
685 \r
686 \r
687 \r