1 /* ----------------------------------------------------------------------- *
\r
3 This file created by albert RDA Inc
\r
6 #include <linux/module.h>
\r
7 #include <linux/init.h>
\r
8 #include <linux/slab.h>
\r
9 #include <linux/i2c.h>
\r
10 #include <linux/string.h>
\r
11 #include <linux/rtc.h> /* get the user-level API */
\r
12 #include <linux/bcd.h>
\r
13 #include <linux/list.h>
\r
14 #include <linux/delay.h>
\r
17 #include <linux/nfs_fs.h>
\r
18 #include <linux/nfs_fs_sb.h>
\r
19 #include <linux/nfs_mount.h>
\r
20 #include <linux/fs.h>
\r
21 #include <linux/file.h>
\r
22 #include <linux/tty.h>
\r
23 #include <linux/syscalls.h>
\r
24 #include <asm/termbits.h>
\r
25 #include <linux/serial.h>
\r
28 #include <mach/mt6575_gpio.h>
\r
29 #include <mach/mtk_rtc.h>
\r
30 #include <linux/wakelock.h>
\r
32 #define RDA5890_USE_CRYSTAL //if use share crystal should close this
\r
33 #define RDA5990_USE_DCDC
\r
35 #define u32 unsigned int
\r
36 #define u8 unsigned char
\r
37 #define u16 unsigned short
\r
39 extern int rda_gpio_i2c_read_1_addr_2_data(uint8_t chipAddr, uint8_t regAddr, uint16_t *buffer);
\r
40 extern int rda_gpio_i2c_write_1_addr_2_data(uint8_t chipAddr, uint8_t regAddr, uint16_t data);
\r
41 extern int rda_gpio_i2c_read_4_addr_4_data(uint8_t chipAddr, uint32_t regAddr, uint32_t *buffer);
\r
42 extern int rda_gpio_i2c_write_4_addr_4_data(uint8_t chipAddr, uint32_t regAddr, uint32_t data);
\r
45 //#define RDA_I2C_CHANNEL (0)
\r
46 #define RDA_WIFI_CORE_ADDR (0x13)
\r
47 #define RDA_WIFI_RF_ADDR (0x14) //correct add is 0x14
\r
48 #define RDA_BT_CORE_ADDR (0x15)
\r
49 #define RDA_BT_RF_ADDR (0x16)
\r
51 static struct mutex i2c_rw_lock;
\r
52 static unsigned short wlan_version = 0;
\r
53 static struct wake_lock rda_5990_wake_lock;
\r
54 static struct delayed_work rda_5990_sleep_worker;
\r
56 static u8 isBigEnded = 0;
\r
58 static u8 wifi_in_test_mode = 0;
\r
60 const u32 wifi_core_init_data[][2] =
\r
65 u16 wifi_off_data[][2] =
\r
67 { 0x3F, 0x0001 }, //page up
\r
68 { 0x31, 0x0B40 }, //power off wifi
\r
69 { 0x3F, 0x0000 }, //page down
\r
72 u16 wifi_en_data[][2] =
\r
74 //item:VerD_wf_on_2012_02_08
\r
76 #ifdef RDA5990_USE_DCDC /*houzhen update Mar 15 2012 */
\r
77 {0x23, 0x8FA1},//20111001 higher AVDD voltage to improve EVM to 0x8f21 download current -1db 0x8fA1>>0x8bA1
\r
81 {0x31, 0x0B40 }, //power off wifi
\r
82 // {0x22, 0xD3C7},//for ver.c 20111109, txswitch
\r
83 {0x24, 0x80C8},//freq_osc_in[1:0]00 0x80C8 >> 0x80CB
\r
84 {0x27, 0x4925},//for ver.c20111109, txswitch
\r
85 // {0x28, 0x80A1}, //BT_enable
\r
86 {0x31, 0x8140},//enable wifi
\r
87 {0x32, 0x0113},//set_ rdenout_ldooff_wf=0; rden4in_ldoon_wf=1
\r
88 // {0x39, 0x0004}, //uart switch to wf
\r
89 {0x3F, 0x0000}, //page down
\r
93 u16 wifi_dc_cal_data[][2]=
\r
98 //{wait 200ms; } here
\r
101 u16 wifi_dig_reset_data[][2]=
\r
110 u16 wifi_rf_init_data_verE[][2] =
\r
113 //{;;set_rf_swi},ch
\r
118 {0x0A, 0x002C},//aain_0
\r
123 {0x10, 0x0f78},//20110824
\r
125 {0x13, 0x0652},//adc_tuning_bit[011]
\r
133 {0x1D, 0xFF00},//for ver.D20120119for temperature 70 degree
\r
134 //{0x1F, 0x01F8},//for ver.E should not set
\r
135 //{0x1F, 0x0300},//for ver.E should not set
\r
137 {0x21, 0x0ACF},//for ver.c20111109,dr dac reset,dr txflt reset
\r
141 {0x26, 0x004F},//004F >> 005f premote pa
\r
142 {0x27, 0x171D},///mdll*7
\r
143 {0x28, 0x031D},///mdll*7
\r
144 {0x2A, 0x2860},//et0x2849-8.5p :yd 0x2861-7pf C1,C2=6.8p
\r
145 {0x2B, 0x0800},//bbpll,or ver.c20111116
\r
147 {0x33, 0x1D02},//liuyanan
\r
149 {0x36, 0x02f4}, //00F8;//gain_7
\r
150 {0x37, 0x01f4}, //0074;//aain_6
\r
151 {0x38, 0x21d4}, //0014;//gain_5
\r
152 {0x39, 0x25d4}, //0414;//aain_4
\r
153 {0x3A, 0x2584}, //1804;//gain_3
\r
154 {0x3B, 0x2dc4}, //1C04;//aain_2
\r
155 {0x3C, 0x2d04}, //1C02;//gain_1
\r
156 {0x3D, 0x2c02}, //3C01;//gain_0
\r
157 {0x33, 0x1502},//liuyanan
\r
158 //{;;SET_channe},_to_11
\r
159 {0x1B, 0x0001},//set_channel
\r
167 u16 wifi_rf_init_data[][2] =
\r
170 //{;;set_rf_swi},ch
\r
175 {0x0A, 0x002C},//aain_0
\r
180 {0x10, 0x0f78},//20110824
\r
182 {0x13, 0x0652},//adc_tuning_bit[011]
\r
190 {0x1D, 0xFF00},//for ver.D20120119for temperature 70 degree
\r
191 //{0x1F, 0x01F8},//for ver.c20111109
\r
192 {0x1F, 0x0300},//for burst tx 不锁
\r
194 {0x21, 0x0ACF},//for ver.c20111109,dr dac reset,dr txflt reset
\r
198 {0x26, 0x004F},//004F >> 005f premote pa
\r
199 {0x27, 0x171D},///mdll*7
\r
200 {0x28, 0x031D},///mdll*7
\r
201 {0x2A, 0x2860},//et0x2849-8.5p :yd 0x2861-7pf C1,C2=6.8p
\r
202 {0x2B, 0x0800},//bbpll,or ver.c20111116
\r
204 {0x33, 0x1D02},//liuyanan
\r
206 {0x36, 0x02f4}, //00F8;//gain_7
\r
207 {0x37, 0x01f4}, //0074;//aain_6
\r
208 {0x38, 0x21d4}, //0014;//gain_5
\r
209 {0x39, 0x25d4}, //0414;//aain_4
\r
210 {0x3A, 0x2584}, //1804;//gain_3
\r
211 {0x3B, 0x2dc4}, //1C04;//aain_2
\r
212 {0x3C, 0x2d04}, //1C02;//gain_1
\r
213 {0x3D, 0x2c02}, //3C01;//gain_0
\r
214 {0x33, 0x1502},//liuyanan
\r
215 //{;;SET_channe},_to_11
\r
216 {0x1B, 0x0001},//set_channel
\r
224 u16 wifi_uart_debug_data[][2] =
\r
227 {0x28,0x80A1}, //BT_enable
\r
228 {0x39,0x0004}, //uart switch to wf
\r
232 u16 wifi_tm_en_data[][2] =
\r
235 #ifdef RDA5990_USE_DCDC /*houzhen update Mar 15 2012 */
\r
236 {0x23, 0x8FA1},//20111001 higher AVDD voltage to improve EVM to 0x8f21 download current -1db 0x8fA1>>0x8bA1
\r
240 {0x22,0xD3C7},//for ver.c 20111109, tx
\r
241 {0x24, 0x80C8},//freq_osc_in[1:0]00 0x80C8 >> 0x80CB
\r
242 {0x27,0x4925},//for ver.c20111109, txs
\r
243 {0x28,0x80A1}, //BT_enable
\r
246 {0x32,0x0113},//set_ rdenout_ldooff_wf
\r
247 {0x39,0x0004},//uart switch to wf
\r
251 u16 wifi_tm_rf_init_data[][2] =
\r
259 {0x0A,0x002C},//aain_0
\r
261 {0x0E,0x2300},//2012_02_20
\r
264 {0x10,0x0f78},//20110824
\r
266 {0x13,0x0652},//adc_tuning_bit[011]
\r
272 {0x19,0x3C01},//sdm_vbit[3:0]=1111
\r
274 {0x1D,0xCE00},//for ver.D20120119for temperature 70 degree
\r
275 {0x1F,0x0300},//div2_band_48g_dr=1;div2_band_48g_reg[8:0]1000000000
\r
277 {0x21,0x0ACF},//for ver.c20111109,dr dac reset,dr txflt reset
\r
282 {0x27,0x171D},///mdll*7
\r
283 {0x28,0x031D},///mdll*7
\r
285 {0x2B,0x0800},//bbpll,or ver.c20111116
\r
287 {0x33,0x1D02},//liuyanan
\r
289 {0x36,0x02f4}, //00F8;//gain_7
\r
290 {0x37,0x01f4}, //0074;//aain_6
\r
291 {0x38,0x21d4}, //0014;//gain_5
\r
292 {0x39,0x25d4}, //0414;//aain_4
\r
293 {0x3A,0x2584}, //1804;//gain_3
\r
294 {0x3B,0x2dc4}, //1C04;//aain_2
\r
295 {0x3C,0x2d04}, //1C02;//gain_1
\r
296 {0x3D,0x2c02}, //3C01;//gain_0
\r
301 {0x33,0x1502},//liuyanan
\r
302 //SET_channel_to_11
\r
303 {0x1B,0x0001},//set_channel
\r
307 /*houzhen update Mar 15 2012
\r
308 should be called when power up/down bt
\r
310 static int rda5990_wf_setup_A2_power(int enable)
\r
314 printk("***rda5990_wf_setup_A2_power start! \n");
\r
315 ret = rda_gpio_i2c_write_1_addr_2_data(RDA_WIFI_RF_ADDR, 0x3f, 0x0001);
\r
321 ret = rda_gpio_i2c_read_1_addr_2_data(RDA_WIFI_RF_ADDR, 0x22, &temp_data);
\r
324 printk("***0xA2 readback value:0x%X \n", temp_data);
\r
326 temp_data |=0x0200; /*en reg4_pa bit*/
\r
327 #ifdef RDA5890_USE_CRYSTAL
\r
328 temp_data &= ~(1 << 14); //disable xen_out
\r
330 ret = rda_gpio_i2c_write_1_addr_2_data(RDA_WIFI_RF_ADDR, 0x22, temp_data);
\r
333 //read wlan version
\r
334 ret = rda_gpio_i2c_read_1_addr_2_data(RDA_WIFI_RF_ADDR, 0x21, &temp_data);
\r
338 wlan_version = temp_data;
\r
342 ret = rda_gpio_i2c_read_1_addr_2_data(RDA_WIFI_RF_ADDR, 0x28, &temp_data);
\r
345 if(temp_data&0x8000) // bt is on
\r
351 ret = rda_gpio_i2c_read_1_addr_2_data(RDA_WIFI_RF_ADDR, 0x22, &temp_data);
\r
356 ret = rda_gpio_i2c_write_1_addr_2_data(RDA_WIFI_RF_ADDR, 0x22, temp_data);
\r
362 printk("rda5990_wf_setup_A2_power, version:%d", wlan_version);
\r
365 ret = rda_gpio_i2c_write_1_addr_2_data(RDA_WIFI_RF_ADDR, 0x3f, 0x0000);
\r
368 printk("***rda5990_wf_setup_A2_power succeed! \n");
\r
372 printk("***rda5990_wf_setup_A2_power failed! \n");
\r
377 int rda_wifi_rf_init(void)
\r
379 unsigned int count = 0;
\r
381 mutex_lock(&i2c_rw_lock);
\r
382 if( (wlan_version&0x1f) == 7)
\r
384 for(count = 0; count < sizeof(wifi_rf_init_data)/sizeof(wifi_rf_init_data[0]); count ++)
\r
386 ret = rda_gpio_i2c_write_1_addr_2_data(RDA_WIFI_RF_ADDR, wifi_rf_init_data[count][0], wifi_rf_init_data[count][1]);
\r
391 else if((wlan_version&0x1f) == 4 || (wlan_version&0x1f)==5)
\r
393 for(count = 0; count < sizeof(wifi_rf_init_data_verE)/sizeof(wifi_rf_init_data_verE[0]); count ++)
\r
395 ret = rda_gpio_i2c_write_1_addr_2_data(RDA_WIFI_RF_ADDR, wifi_rf_init_data_verE[count][0], wifi_rf_init_data_verE[count][1]);
\r
402 printk("unknown version of this 5990 chip\n");
\r
405 mutex_unlock(&i2c_rw_lock);
\r
406 printk(KERN_INFO "***rda_wifi_rf_init_succceed \n");
\r
407 msleep(5); //5ms delay
\r
410 mutex_unlock(&i2c_rw_lock);
\r
411 printk(KERN_INFO "***rda_wifi_rf_init failed! \n");
\r
415 int rda_wifi_dc_cal(void)
\r
417 unsigned int count = 0;
\r
420 mutex_lock(&i2c_rw_lock);
\r
421 for(count = 0; count < sizeof(wifi_dc_cal_data)/sizeof(wifi_dc_cal_data[0]); count ++)
\r
423 ret = rda_gpio_i2c_write_1_addr_2_data(RDA_WIFI_RF_ADDR, wifi_dc_cal_data[count][0], wifi_dc_cal_data[count][1]);
\r
428 mutex_unlock(&i2c_rw_lock);
\r
429 printk(KERN_INFO "***rda_wifi_rf_dc_calsuccceed \n");
\r
430 msleep(50); //50ms delay
\r
434 mutex_unlock(&i2c_rw_lock);
\r
435 printk(KERN_INFO "***rda_wifi_rf_dc_calf_failed! \n");
\r
439 int rda_wifi_en(void)
\r
441 unsigned int count = 0;
\r
444 mutex_lock(&i2c_rw_lock);
\r
445 for(count = 0; count < sizeof(wifi_en_data)/sizeof(wifi_en_data[0]); count ++)
\r
447 ret = rda_gpio_i2c_write_1_addr_2_data(RDA_WIFI_RF_ADDR, wifi_en_data[count][0], wifi_en_data[count][1]);
\r
451 if(wifi_en_data[count][0] == 0x31)
\r
455 ret=rda5990_wf_setup_A2_power(1); //en pa_reg for wf
\r
459 mutex_unlock(&i2c_rw_lock);
\r
460 msleep(8); //8ms delay
\r
462 printk(KERN_INFO "***rda_wifi_en_succceed \n");
\r
465 mutex_unlock(&i2c_rw_lock);
\r
466 printk(KERN_INFO "***rda_wifi_power_on failed! \n");
\r
470 int rda_wifi_debug_en(void)
\r
472 unsigned int count = 0;
\r
475 mutex_lock(&i2c_rw_lock);
\r
476 for(count = 0; count < sizeof(wifi_uart_debug_data)/sizeof(wifi_uart_debug_data[0]); count ++)
\r
478 ret = rda_gpio_i2c_write_1_addr_2_data(RDA_WIFI_RF_ADDR, wifi_uart_debug_data[count][0], wifi_uart_debug_data[count][1]);
\r
484 mutex_unlock(&i2c_rw_lock);
\r
488 int rda_tm_wifi_en(void)
\r
490 unsigned int count = 0;
\r
492 unsigned short temp_data;
\r
494 for(count = 0; count < sizeof(wifi_tm_en_data)/sizeof(wifi_tm_en_data[0]); count ++)
\r
496 ret = rda_gpio_i2c_write_1_addr_2_data(RDA_WIFI_RF_ADDR, wifi_tm_en_data[count][0], wifi_tm_en_data[count][1]);
\r
501 msleep(8); //8ms delay
\r
503 ret = rda_gpio_i2c_write_1_addr_2_data(RDA_WIFI_RF_ADDR, 0x3f, 0x0001); //PAGE UP
\r
507 ret = rda_gpio_i2c_read_1_addr_2_data(RDA_WIFI_RF_ADDR,0x21,&temp_data);
\r
511 wlan_version = temp_data;
\r
513 ret = rda_gpio_i2c_write_1_addr_2_data(RDA_WIFI_RF_ADDR, 0x3f, 0x0000); //PAGE DOWN
\r
517 printk(KERN_INFO "***rda_wifi_en_succceed \n");
\r
520 printk(KERN_INFO "***rda_wifi_power_on failed! \n");
\r
524 int rda_tm_wifi_rf_init(void)
\r
526 unsigned int count = 0;
\r
529 for(count = 0; count < sizeof(wifi_tm_rf_init_data)/sizeof(wifi_tm_rf_init_data[0]); count ++)
\r
531 ret = rda_gpio_i2c_write_1_addr_2_data(RDA_WIFI_RF_ADDR, wifi_tm_rf_init_data[count][0], wifi_tm_rf_init_data[count][1]);
\r
536 printk(KERN_INFO "***rda_wifi_rf_init_succceed \n");
\r
537 msleep(5); //5ms delay
\r
541 printk(KERN_INFO "***rda_wifi_rf_init failed! \n");
\r
544 /*houzhen add 2012 04 09
\r
545 add to ensure wf dig powerup
\r
548 int rda_wifi_dig_reset(void)
\r
550 unsigned int count = 0;
\r
552 msleep(8); //8ms delay
\r
553 mutex_lock(&i2c_rw_lock);
\r
555 for(count = 0; count < sizeof(wifi_dig_reset_data)/sizeof(wifi_dig_reset_data[0]); count ++)
\r
557 ret = rda_gpio_i2c_write_1_addr_2_data(RDA_WIFI_RF_ADDR, wifi_dig_reset_data[count][0], wifi_dig_reset_data[count][1]);
\r
562 mutex_unlock(&i2c_rw_lock);
\r
563 msleep(8); //8ms delay
\r
564 printk(KERN_INFO "***rda_wifi_dig_reset \n");
\r
567 mutex_unlock(&i2c_rw_lock);
\r
568 printk(KERN_INFO "***rda_wifi_dig_reset failed! \n");
\r
572 int rda_wlan_version(void)
\r
574 printk("******version %x \n", wlan_version);
\r
575 return wlan_version;
\r
578 int rda_wifi_power_off(void)
\r
580 unsigned int count = 0;
\r
583 printk(KERN_INFO "rda_wifi_power_off \n");
\r
586 mutex_lock(&i2c_rw_lock);
\r
587 ret=rda5990_wf_setup_A2_power(0); //disable pa_reg for wf
\r
591 ret = rda_gpio_i2c_write_1_addr_2_data(RDA_WIFI_RF_ADDR, 0x3f, 0x0001); //page up
\r
595 ret = rda_gpio_i2c_read_1_addr_2_data(RDA_WIFI_RF_ADDR, 0x28, &temp); //poll bt status
\r
601 ret = rda_gpio_i2c_write_1_addr_2_data(RDA_WIFI_RF_ADDR, 0x3f, 0x0000); //page down
\r
605 ret = rda_gpio_i2c_write_1_addr_2_data(RDA_WIFI_RF_ADDR, 0x0f, 0x2223); // set antenna for bt
\r
612 for(count = 0; count < sizeof(wifi_off_data)/sizeof(wifi_off_data[0]); count ++)
\r
614 ret = rda_gpio_i2c_write_1_addr_2_data(RDA_WIFI_RF_ADDR, wifi_off_data[count][0], wifi_off_data[count][1]);
\r
618 printk(KERN_INFO "***rda_wifi_power_off success!!! \n");
\r
622 mutex_unlock(&i2c_rw_lock);
\r
626 mutex_unlock(&i2c_rw_lock);
\r
627 printk(KERN_INFO "***rda_wifi_power_off failed! \n");
\r
632 int rda_wifi_power_on(void)
\r
640 if(!wifi_in_test_mode)
\r
642 ret = rda_wifi_en();
\r
646 ret = rda_wifi_rf_init();
\r
650 ret = rda_wifi_dc_cal();
\r
654 msleep(20); //20ms delay
\r
655 ret=rda_wifi_dig_reset(); //houzhen add to ensure wf power up safely
\r
659 msleep(20); //20ms delay
\r
663 ret = rda_tm_wifi_en();
\r
667 ret = rda_tm_wifi_rf_init();
\r
671 printk(KERN_INFO "rda_wifi_power_on_succeed!! \n");
\r
676 printk(KERN_INFO "rda_wifi_power_on_failed retry:%d \n", retry);
\r
679 rda_wifi_power_off();
\r
686 int rda_fm_power_on(void)
\r
692 ret = rda_gpio_i2c_write_1_addr_2_data(RDA_WIFI_RF_ADDR, 0x3f, 0x0001); // page down
\r
694 printk(KERN_INFO "%s() write address(0x%02x) with value(0x%04x) failed! \n", __func__, 0x3f, 0x0001);
\r
697 ret = rda_gpio_i2c_read_1_addr_2_data(RDA_WIFI_RF_ADDR, 0x22, &temp); //read 0xA2
\r
699 printk(KERN_INFO "%s() read from address(0x%02x) failed! \n", __func__, 0x22);
\r
702 temp = temp & (~(1 << 15)); //clear bit[15]
\r
703 ret = rda_gpio_i2c_write_1_addr_2_data(RDA_WIFI_RF_ADDR, 0x22, temp); //write back
\r
705 printk(KERN_INFO "%s() write address(0x%02x) with value(0x%04x) failed! \n", __func__, 0x3f, 0x0001);
\r
708 ret = rda_gpio_i2c_write_1_addr_2_data(RDA_WIFI_RF_ADDR, 0x3f, 0x0000); // page up
\r
710 printk(KERN_INFO "%s() write address(0x%02x) with value(0x%04x) failed! \n", __func__, 0x3f, 0x0001);
\r
717 int rda_fm_power_off(void)
\r
723 ret = rda_gpio_i2c_write_1_addr_2_data(RDA_WIFI_RF_ADDR, 0x3f, 0x0001); // page down
\r
725 printk(KERN_INFO "%s() write address(0x%02x) with value(0x%04x) failed! \n", __func__, 0x3f, 0x0001);
\r
728 ret = rda_gpio_i2c_read_1_addr_2_data(RDA_WIFI_RF_ADDR, 0x22, &temp); //read 0xA2
\r
730 printk(KERN_INFO "%s() read from address(0x%02x) failed! \n", __func__, 0x22);
\r
733 temp = temp | (1 << 15); //set bit[15]
\r
734 ret = rda_gpio_i2c_write_1_addr_2_data(RDA_WIFI_RF_ADDR, 0x22, temp); //write back
\r
736 printk(KERN_INFO "%s() write address(0x%02x) with value(0x%04x) failed! \n", __func__, 0x3f, 0x0001);
\r
739 ret = rda_gpio_i2c_write_1_addr_2_data(RDA_WIFI_RF_ADDR, 0x3f, 0x0000); // page up
\r
741 printk(KERN_INFO "%s() write address(0x%02x) with value(0x%04x) failed! \n", __func__, 0x3f, 0x0001);
\r
749 u16 rda_5990_bt_off_data[][2] =
\r
751 {0x3f, 0x0001 }, //pageup
\r
752 {0x28, 0x00A1 }, //power off bt
\r
753 {0x3f, 0x0000 }, //pagedown
\r
756 /*houzhen update 2012 03 06*/
\r
757 u16 rda_5990_bt_en_data[][2] =
\r
759 {0x3f, 0x0001 }, //pageup
\r
760 #ifdef RDA5990_USE_DCDC
\r
761 {0x23, 0x8FA1}, // //20111001 higher AVDD voltage to improve EVM
\r
765 {0x24, 0x80C8}, // ;//freq_osc_in[1:0]00
\r
766 {0x26, 0x47A5}, // reg_vbit_normal_bt[2:0] =111
\r
767 {0x27, 0x4925}, // //for ver.c20111109, txswitch
\r
768 {0x29, 0x111F}, // // rden4in_ldoon_bt=1
\r
769 {0x32, 0x0111}, // set_ rdenout_ldooff_wf=0;
\r
770 {0x39, 0x0000}, // //uart switch to bt
\r
772 {0x28, 0x80A1}, // bt en
\r
773 {0x3f, 0x0000}, //pagedown
\r
777 u16 rda_5990_bt_dc_cal[][2] =
\r
786 u16 rda_5990_bt_set_rf_switch_data[][2] =
\r
794 u16 RDA5990_bt_enable_clk_data[][2] =
\r
802 u16 RDA5990_bt_dig_reset_data[][2] =
\r
804 {0x3f, 0x0001 }, //pageup
\r
808 {0x3f, 0x0000 }, //pagedown
\r
811 /*houzhen update 2012 03 06*/
\r
812 u16 rda_5990_bt_rf_data[][2] =
\r
814 {0x3f, 0x0000}, //pagedown
\r
839 {0x3f, 0x0001}, //page 1
\r
856 // {0x22, 0xD3C7},
\r
865 {0x3f, 0x0000}, //pagedown
\r
868 /*houzhen update Mar 15 2012
\r
869 should be called when power up/down bt
\r
871 static int rda5990_bt_setup_A2_power(int enable)
\r
876 ret = rda_gpio_i2c_write_1_addr_2_data(RDA_BT_RF_ADDR, 0x3f, 0x0001);
\r
882 ret = rda_gpio_i2c_read_1_addr_2_data(RDA_BT_RF_ADDR, 0x22, &temp_data);
\r
885 printk(KERN_INFO "***0xA2 readback value:0x%X \n", temp_data);
\r
887 temp_data |=0x0200; /*en reg4_pa bit*/
\r
889 ret = rda_gpio_i2c_write_1_addr_2_data(RDA_BT_RF_ADDR, 0x22, temp_data);
\r
895 ret = rda_gpio_i2c_read_1_addr_2_data(RDA_BT_RF_ADDR, 0x31, &temp_data);
\r
898 if(temp_data&0x8000) // wf is on
\r
904 ret = rda_gpio_i2c_read_1_addr_2_data(RDA_BT_RF_ADDR, 0x22, &temp_data);
\r
909 ret = rda_gpio_i2c_write_1_addr_2_data(RDA_BT_RF_ADDR, 0x22, temp_data);
\r
918 ret = rda_gpio_i2c_write_1_addr_2_data(RDA_BT_RF_ADDR, 0x3f, 0x0000);
\r
924 printk(KERN_INFO "***rda5990_bt_setup_A2_power failed! \n");
\r
928 int rda_bt_power_off(void);
\r
930 int rda_bt_power_on(void)
\r
932 unsigned int count = 0;
\r
935 printk(KERN_INFO "rda_bt_power_on \n");
\r
938 mutex_lock(&i2c_rw_lock);
\r
940 for(count = 0; count < sizeof(rda_5990_bt_en_data)/sizeof(rda_5990_bt_en_data[0]); count ++)
\r
942 ret = rda_gpio_i2c_write_1_addr_2_data(RDA_BT_RF_ADDR, rda_5990_bt_en_data[count][0], rda_5990_bt_en_data[count][1]);
\r
948 ret=rda5990_bt_setup_A2_power(1);
\r
951 printk(KERN_INFO "***rda5990_bt_setup_A2_power fail!!! \n");
\r
955 printk(KERN_INFO "***rda_bt_power_on success!!! \n");
\r
957 mutex_unlock(&i2c_rw_lock);
\r
958 /*houzhen update 2012 03 06*/
\r
959 msleep(10); //delay 10 ms after power on
\r
964 mutex_unlock(&i2c_rw_lock);
\r
965 printk(KERN_INFO "***rda_bt_power_on failed! \n");
\r
970 int rda_bt_power_off(void)
\r
972 unsigned int count = 0;
\r
974 printk(KERN_INFO "rda_bt_power_off \n");
\r
977 mutex_lock(&i2c_rw_lock);
\r
978 for(count = 0; count < sizeof(rda_5990_bt_off_data)/sizeof(rda_5990_bt_off_data[0]); count ++)
\r
980 ret = rda_gpio_i2c_write_1_addr_2_data(RDA_BT_RF_ADDR, rda_5990_bt_off_data[count][0], rda_5990_bt_off_data[count][1]);
\r
985 printk(KERN_INFO "***rda_bt_power_off success!!! \n");
\r
987 ret=rda5990_bt_setup_A2_power(0);//disable ldo_pa reg
\r
993 mutex_unlock(&i2c_rw_lock);
\r
997 mutex_unlock(&i2c_rw_lock);
\r
998 printk(KERN_INFO "***rda_bt_power_off failed! \n");
\r
1004 int RDA5990_bt_rf_init(void)
\r
1006 unsigned int count = 0;
\r
1008 printk(KERN_INFO "RDA5990_bt_rf_init \n");
\r
1011 mutex_lock(&i2c_rw_lock);
\r
1012 for(count = 0; count < sizeof(rda_5990_bt_rf_data)/sizeof(rda_5990_bt_rf_data[0]); count ++)
\r
1014 ret = rda_gpio_i2c_write_1_addr_2_data(RDA_BT_RF_ADDR, rda_5990_bt_rf_data[count][0], rda_5990_bt_rf_data[count][1]);
\r
1019 mutex_unlock(&i2c_rw_lock);
\r
1020 printk(KERN_INFO "***RDA5990_bt_rf_init success!!! \n");
\r
1025 mutex_unlock(&i2c_rw_lock);
\r
1026 printk(KERN_INFO "***RDA5990_bt_rf_init failed! \n");
\r
1033 /*houzhen add 2012 04 09
\r
1034 add to ensure bt dig powerup
\r
1037 int RDA5990_bt_dig_reset(void)
\r
1039 unsigned int count = 0;
\r
1042 printk(KERN_INFO "RDA5990_bt_dig_reset \n");
\r
1044 mutex_lock(&i2c_rw_lock);
\r
1045 for(count = 0; count < sizeof(RDA5990_bt_dig_reset_data)/sizeof(RDA5990_bt_dig_reset_data[0]); count ++)
\r
1047 ret = rda_gpio_i2c_write_1_addr_2_data(RDA_BT_RF_ADDR, RDA5990_bt_dig_reset_data[count][0], RDA5990_bt_dig_reset_data[count][1]);
\r
1052 mutex_unlock(&i2c_rw_lock);
\r
1053 printk(KERN_INFO "***RDA5990_bt_dig_reset success!!! \n");
\r
1058 mutex_unlock(&i2c_rw_lock);
\r
1059 printk(KERN_INFO "***RDA5990_bt_dig_reset failed! \n");
\r
1065 int RDA5990_bt_dc_cal(void)
\r
1067 unsigned int count = 0;
\r
1069 printk(KERN_INFO "rda_bt_dc_cal \n");
\r
1071 mutex_lock(&i2c_rw_lock);
\r
1073 for(count = 0; count < sizeof(rda_5990_bt_dc_cal)/sizeof(rda_5990_bt_dc_cal[0]); count ++)
\r
1075 ret = rda_gpio_i2c_write_1_addr_2_data(RDA_BT_RF_ADDR, rda_5990_bt_dc_cal[count][0], rda_5990_bt_dc_cal[count][1]);
\r
1080 mutex_unlock(&i2c_rw_lock);
\r
1081 printk(KERN_INFO "***rda_bt_dc_cal success!!! \n");
\r
1082 msleep(200); //200ms
\r
1087 mutex_unlock(&i2c_rw_lock);
\r
1088 printk(KERN_INFO "***rda_bt_dc_cal failed! \n");
\r
1095 /*houzhen update Mar 15 2012
\r
1096 bypass RDA5990_bt_set_rf_switch when wf is already on
\r
1099 int RDA5990_bt_set_rf_switch(void)
\r
1101 unsigned int count = 0;
\r
1104 printk(KERN_INFO "RDA5990_bt_set_rf_switch \n");
\r
1107 mutex_lock(&i2c_rw_lock);
\r
1109 ret = rda_gpio_i2c_write_1_addr_2_data(RDA_BT_RF_ADDR, 0x3f, 0x0001);
\r
1113 ret = rda_gpio_i2c_read_1_addr_2_data(RDA_BT_RF_ADDR, 0x31, &temp_data);
\r
1118 if(temp_data&0x8000) // if wf is already on
\r
1121 printk(KERN_INFO "wf already en, bypass RDA5990_bt_set_rf_switch function \n");
\r
1122 ret = rda_gpio_i2c_write_1_addr_2_data(RDA_BT_RF_ADDR, 0x3f, 0x0000);
\r
1125 mutex_unlock(&i2c_rw_lock);
\r
1129 for(count = 0; count < sizeof(rda_5990_bt_set_rf_switch_data)/sizeof(rda_5990_bt_set_rf_switch_data[0]); count ++)
\r
1131 ret = rda_gpio_i2c_write_1_addr_2_data(RDA_WIFI_RF_ADDR, rda_5990_bt_set_rf_switch_data[count][0], rda_5990_bt_set_rf_switch_data[count][1]);
\r
1136 mutex_unlock(&i2c_rw_lock);
\r
1137 printk(KERN_INFO "***RDA5990_bt_set_rf_switch success!!! \n");
\r
1138 msleep(50); //50ms
\r
1142 mutex_unlock(&i2c_rw_lock);
\r
1143 printk(KERN_INFO "***RDA5990_bt_set_rf_switch failed! \n");
\r
1149 /*houzhen update Mar 15 2012
\r
1150 bypass RDA5990_bt_enable_clk when wf is already on
\r
1153 int RDA5990_bt_enable_clk(void)
\r
1155 unsigned int count = 0;
\r
1158 printk(KERN_INFO "RDA5990_bt_enable_clk \n");
\r
1160 mutex_lock(&i2c_rw_lock);
\r
1161 ret = rda_gpio_i2c_write_1_addr_2_data(RDA_BT_RF_ADDR, 0x3f, 0x0001);
\r
1165 ret = rda_gpio_i2c_read_1_addr_2_data(RDA_BT_RF_ADDR, 0x31, &temp_data);
\r
1170 if(temp_data&0x8000) // if wf is already on
\r
1173 printk(KERN_INFO "wf already en, bypass RDA5990_bt_enable_clk function \n");
\r
1174 ret = rda_gpio_i2c_write_1_addr_2_data(RDA_BT_RF_ADDR, 0x3f, 0x0000);
\r
1177 mutex_unlock(&i2c_rw_lock);
\r
1182 for(count = 0; count < sizeof(RDA5990_bt_enable_clk_data)/sizeof(RDA5990_bt_enable_clk_data[0]); count ++)
\r
1184 ret = rda_gpio_i2c_write_1_addr_2_data(RDA_WIFI_RF_ADDR, RDA5990_bt_enable_clk_data[count][0], RDA5990_bt_enable_clk_data[count][1]);
\r
1189 mutex_unlock(&i2c_rw_lock);
\r
1190 printk(KERN_INFO "***RDA5990_bt_enable_clk success!!! \n");
\r
1191 msleep(50); //50ms
\r
1195 mutex_unlock(&i2c_rw_lock);
\r
1196 printk(KERN_INFO "***RDA5990_bt_enable_clk failed! \n");
\r
1201 extern void mt_combo_bgf_enable_irq(void);
\r
1202 extern void mt_combo_bgf_disable_irq(void);
\r
1205 #define RDA_BT_IOCTL_MAGIC 'u'
\r
1206 #define RDA_BT_POWER_ON_IOCTL _IO(RDA_BT_IOCTL_MAGIC ,0x01)
\r
1207 #define RD_BT_RF_INIT_IOCTL _IO(RDA_BT_IOCTL_MAGIC ,0x02)
\r
1208 #define RD_BT_DC_CAL_IOCTL _IO(RDA_BT_IOCTL_MAGIC ,0x03)
\r
1209 #define RD_BT_SET_RF_SWITCH_IOCTL _IO(RDA_BT_IOCTL_MAGIC ,0x04)
\r
1210 #define RDA_BT_POWER_OFF_IOCTL _IO(RDA_BT_IOCTL_MAGIC ,0x05)
\r
1211 #define RDA_BT_EN_CLK _IO(RDA_BT_IOCTL_MAGIC ,0x06)
\r
1212 #define RD_BT_DC_DIG_RESET_IOCTL _IO(RDA_BT_IOCTL_MAGIC ,0x07)
\r
1214 #define RDA_WIFI_POWER_ON_IOCTL _IO(RDA_BT_IOCTL_MAGIC ,0x10)
\r
1215 #define RDA_WIFI_POWER_OFF_IOCTL _IO(RDA_BT_IOCTL_MAGIC ,0x11)
\r
1216 #define RDA_WIFI_POWER_SET_TEST_MODE_IOCTL _IO(RDA_BT_IOCTL_MAGIC ,0x12)
\r
1217 #define RDA_WIFI_POWER_CANCEL_TEST_MODE_IOCTL _IO(RDA_BT_IOCTL_MAGIC ,0x13)
\r
1218 #define RDA_WIFI_DEBUG_MODE_IOCTL _IO(RDA_BT_IOCTL_MAGIC ,0x14)
\r
1220 static int rda_5990_pw_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
\r
1226 case RDA_WIFI_POWER_ON_IOCTL:
\r
1227 ret = rda_wifi_power_on();
\r
1230 case RDA_WIFI_POWER_OFF_IOCTL:
\r
1231 ret = rda_wifi_power_off();
\r
1234 case RDA_WIFI_POWER_SET_TEST_MODE_IOCTL:
\r
1235 wifi_in_test_mode = 1;
\r
1236 printk("****set rda wifi in test mode");
\r
1239 case RDA_WIFI_POWER_CANCEL_TEST_MODE_IOCTL:
\r
1240 wifi_in_test_mode = 0;
\r
1241 printk("****set rda wifi in normal mode");
\r
1244 case RDA_WIFI_DEBUG_MODE_IOCTL:
\r
1245 ret = rda_wifi_debug_en();
\r
1247 case RDA_BT_POWER_ON_IOCTL:
\r
1249 ret = rda_bt_power_on();
\r
1250 mt_combo_bgf_enable_irq();
\r
1254 /* should call thif function after bt_power_on*/
\r
1255 case RDA_BT_EN_CLK:
\r
1256 ret = RDA5990_bt_enable_clk();
\r
1259 case RD_BT_RF_INIT_IOCTL:
\r
1260 ret = RDA5990_bt_rf_init();
\r
1263 case RD_BT_DC_CAL_IOCTL:
\r
1264 ret = RDA5990_bt_dc_cal();
\r
1267 case RD_BT_DC_DIG_RESET_IOCTL:
\r
1268 ret = RDA5990_bt_dig_reset();
\r
1271 case RD_BT_SET_RF_SWITCH_IOCTL:
\r
1272 ret = RDA5990_bt_set_rf_switch();
\r
1275 case RDA_BT_POWER_OFF_IOCTL:
\r
1277 mt_combo_bgf_disable_irq();
\r
1278 ret = rda_bt_power_off();
\r
1286 printk(KERN_INFO "rda_bt_pw_ioctl cmd=0x%02x \n", cmd);
\r
1291 static int rda_5990_major;
\r
1292 static struct class *rda_5990_class = NULL;
\r
1293 static const struct file_operations rda_5990_operations = {
\r
1294 .owner = THIS_MODULE,
\r
1295 .unlocked_ioctl = rda_5990_pw_ioctl,
\r
1299 void rda_5990_sleep_worker_task(struct work_struct *work)
\r
1301 printk("---rda_5990_sleep_worker_task end");
\r
1302 wake_unlock(&rda_5990_wake_lock);
\r
1305 void rda_5990_set_wake_lock(void)
\r
1307 wake_lock(&rda_5990_wake_lock);
\r
1308 cancel_delayed_work(&rda_5990_sleep_worker);
\r
1309 schedule_delayed_work(&rda_5990_sleep_worker, 6*HZ);
\r
1312 int rda_5990_power_ctrl_init(void)
\r
1316 printk("rda_5990_power_ctrl_init begin\n");
\r
1318 rda_5990_major = register_chrdev(0, "rda5990_power_ctrl", &rda_5990_operations);
\r
1319 if(rda_5990_major < 0)
\r
1321 printk(KERN_INFO "register rdabt_power_ctrl failed!!! \n");
\r
1322 return rda_5990_major;
\r
1325 rda_5990_class = class_create(THIS_MODULE, "rda_combo");
\r
1326 if(IS_ERR(rda_5990_class))
\r
1328 unregister_chrdev(rda_5990_major, "rdabt_power_ctrl");
\r
1329 return PTR_ERR(rda_5990_class);
\r
1332 device_create(rda_5990_class, NULL, MKDEV(rda_5990_major, 0), NULL, "rdacombo");
\r
1335 INIT_DELAYED_WORK(&rda_5990_sleep_worker, rda_5990_sleep_worker_task);
\r
1336 wake_lock_init(&rda_5990_wake_lock, WAKE_LOCK_SUSPEND, "RDA_sleep_worker_wake_lock");
\r
1338 mutex_init(&i2c_rw_lock);
\r
1339 printk("rda_5990_power_ctrl_init end\n");
\r
1343 void rda_5990_power_ctrl_exit(void)
\r
1346 unregister_chrdev(rda_5990_major, "rdabt_power_ctrl");
\r
1347 if(rda_5990_class)
\r
1348 class_destroy(rda_5990_class);
\r
1350 cancel_delayed_work_sync(&rda_5990_sleep_worker);
\r
1351 wake_lock_destroy(&rda_5990_wake_lock);
\r
1354 unsigned char rda_5990_wifi_in_test_mode(void)
\r
1356 return wifi_in_test_mode;
\r
1360 static __inline__ void cfmakeraw(struct termios *s)
\r
1362 s->c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL|IXON);
\r
1363 s->c_oflag &= ~OPOST;
\r
1364 s->c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN);
\r
1365 s->c_cflag &= ~(CSIZE|PARENB);
\r
1366 s->c_cflag |= CS8;
\r
1369 static __inline__ int cfsetospeed(struct termios *s, speed_t speed)
\r
1371 s->c_cflag = (s->c_cflag & ~CBAUD) | (speed & CBAUD);
\r
1375 static __inline__ int cfsetispeed(struct termios *s, speed_t speed)
\r
1377 s->c_cflag = (s->c_cflag & ~CBAUD) | (speed & CBAUD);
\r
1381 static int rda_wifi_init_uart(char *dev)
\r
1384 struct termios ti;
\r
1385 struct serial_struct ss;
\r
1388 fd = sys_open(dev, O_RDWR | O_NOCTTY, 0);
\r
1390 printk("Can't open serial port");
\r
1394 sys_ioctl(fd, TCFLSH, TCIOFLUSH);
\r
1396 /* Clear the cust flag */
\r
1397 if((errno = sys_ioctl(fd, TIOCGSERIAL, &ss))<0){
\r
1398 printk("BAUD: error to get the serial_struct info:%s\n", errno);
\r
1402 if (ss.flags & ASYNC_SPD_CUST) {
\r
1403 printk("clear ASYNC_SPD_CUST\r\n");
\r
1404 ss.flags &= ~ASYNC_SPD_CUST;
\r
1406 if((errno = sys_ioctl(fd, TIOCSSERIAL, &ss))<0){
\r
1407 printk("BAUD: error to set serial_struct:%s\n", errno);
\r
1411 if ((errno = sys_ioctl(fd, TCGETS, (long)&ti)) < 0) {
\r
1412 printk("unable to get UART port setting");
\r
1413 printk("Can't get port settings");
\r
1419 ti.c_cflag |= CLOCAL;
\r
1420 ti.c_cflag &= ~CRTSCTS;
\r
1422 ti.c_cc[VTIME] = 5; /* 0.5 sec */
\r
1423 ti.c_cc[VMIN] = 0;
\r
1425 /* Set initial baudrate */
\r
1426 cfsetospeed(&ti, B115200);
\r
1427 cfsetispeed(&ti, B115200);
\r
1429 if ((errno = sys_ioctl(fd, TCSETS, (long)&ti)) < 0) {
\r
1430 printk("unable to set UART port setting");
\r
1431 printk("Can't set port settings");
\r
1435 errno = sys_ioctl(fd, TCFLSH, TCIOFLUSH);
\r
1448 EXPORT_SYMBOL(rda_wlan_version);
\r
1449 EXPORT_SYMBOL(rda_wifi_init_uart);
\r
1450 EXPORT_SYMBOL(rda_5990_wifi_in_test_mode);
\r
1452 EXPORT_SYMBOL(rda_5990_set_wake_lock);
\r
1453 EXPORT_SYMBOL(rda_wifi_power_off);
\r
1454 EXPORT_SYMBOL(rda_wifi_power_on);
\r
1455 EXPORT_SYMBOL(rda_fm_power_on);
\r
1456 EXPORT_SYMBOL(rda_fm_power_off);
\r
1458 module_init(rda_5990_power_ctrl_init);
\r
1459 module_exit(rda_5990_power_ctrl_exit);
\r
1461 MODULE_LICENSE("GPL");
\r