2 * Copyright (C) 2012 ROCKCHIP, Inc.
4 * This software is licensed under the terms of the GNU General Public
5 * License version 2, as published by the Free Software Foundation, and
6 * may be copied, distributed, and modified under those terms.
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
14 /* Rock-chips rfkill driver for wifi
17 #include <linux/kernel.h>
18 #include <linux/platform_device.h>
19 #include <linux/module.h>
20 #include <linux/rfkill.h>
21 #include <linux/init.h>
22 #include <linux/slab.h>
24 #include <linux/regulator/consumer.h>
25 #include <linux/delay.h>
26 #include <linux/rfkill-wlan.h>
27 #include <linux/rfkill-bt.h>
28 #include <linux/wakelock.h>
29 #include <linux/interrupt.h>
31 #include <linux/suspend.h>
32 #include <linux/proc_fs.h>
33 #include <linux/uaccess.h>
34 #include <linux/gpio.h>
35 #include <linux/rockchip/iomap.h>
36 #include <dt-bindings/gpio/gpio.h>
37 #include <linux/skbuff.h>
38 #include <linux/rockchip/cpu.h>
41 #include <linux/of_device.h>
42 #include <linux/of_gpio.h>
46 #define DBG(x...) printk(KERN_INFO "[WLAN_RFKILL]: "x)
51 #define LOG(x...) printk(KERN_INFO "[WLAN_RFKILL]: "x)
53 struct rfkill_wlan_data {
54 struct rksdmmc_gpio_wifi_moudle *pdata;
55 struct wake_lock wlan_irq_wl;
58 static struct rfkill_wlan_data *g_rfkill = NULL;
60 static const char wlan_name[] =
61 #if defined (CONFIG_BCM4330)
62 #if defined (CONFIG_BT_MODULE_NH660)
67 #elif defined (CONFIG_RK903)
68 #if defined(CONFIG_RKWIFI_26M)
73 #elif defined(CONFIG_BCM4329)
75 #elif defined(CONFIG_MV8787)
77 #elif defined(CONFIG_AP6210)
78 #if defined(CONFIG_RKWIFI_26M)
83 #elif defined(CONFIG_AP6330)
85 #elif defined(CONFIG_AP6476)
87 #elif defined(CONFIG_AP6493)
94 /***********************************************************
96 * Broadcom Wifi Static Memory
98 **********************************************************/
100 #define BCM_STATIC_MEMORY_SUPPORT 1
102 #define BCM_STATIC_MEMORY_SUPPORT 0
104 //===========================
105 #if BCM_STATIC_MEMORY_SUPPORT
106 #define PREALLOC_WLAN_SEC_NUM 4
107 #define PREALLOC_WLAN_BUF_NUM 160
108 #define PREALLOC_WLAN_SECTION_HEADER 0
109 #define WLAN_SKB_BUF_NUM 16
111 #define WLAN_SECTION_SIZE_0 (12 * 1024)
112 #define WLAN_SECTION_SIZE_1 (12 * 1024)
113 #define WLAN_SECTION_SIZE_2 (32 * 1024)
114 #define WLAN_SECTION_SIZE_3 (136* 1024)
115 #define WLAN_SECTION_SIZE_4 (4 * 1024)
116 #define WLAN_SECTION_SIZE_5 (64 * 1024)
117 #define WLAN_SECTION_SIZE_6 (4 * 1024)
118 #define WLAN_SECTION_SIZE_7 (4 * 1024)
120 static struct sk_buff *wlan_static_skb[WLAN_SKB_BUF_NUM+1];
122 struct wifi_mem_prealloc {
127 static struct wifi_mem_prealloc wifi_mem_array[8] = {
128 {NULL, (WLAN_SECTION_SIZE_0)},
129 {NULL, (WLAN_SECTION_SIZE_1)},
130 {NULL, (WLAN_SECTION_SIZE_2)},
131 {NULL, (WLAN_SECTION_SIZE_3)},
132 {NULL, (WLAN_SECTION_SIZE_4)},
133 {NULL, (WLAN_SECTION_SIZE_5)},
134 {NULL, (WLAN_SECTION_SIZE_6)},
135 {NULL, (WLAN_SECTION_SIZE_7)}
138 static int rockchip_init_wifi_mem(void)
143 for (i = 0 ; i < WLAN_SKB_BUF_NUM ; i++) {
144 wlan_static_skb[i] = dev_alloc_skb(
145 ((i < (WLAN_SKB_BUF_NUM / 2)) ? (PAGE_SIZE*1) : (PAGE_SIZE*2)));
147 if (!wlan_static_skb[i])
151 wlan_static_skb[i] = dev_alloc_skb((PAGE_SIZE*4));
152 if (!wlan_static_skb[i])
155 for (i = 0 ; i <= 7; i++) {
156 wifi_mem_array[i].mem_ptr =
157 kmalloc(wifi_mem_array[i].size, GFP_KERNEL);
159 if (!wifi_mem_array[i].mem_ptr)
165 pr_err("Failed to mem_alloc for WLAN\n");
166 for (j = 0 ; j < i ; j++)
167 kfree(wifi_mem_array[j].mem_ptr);
168 i = WLAN_SKB_BUF_NUM;
170 pr_err("Failed to skb_alloc for WLAN\n");
171 for (j = 0 ; j < i ; j++)
172 dev_kfree_skb(wlan_static_skb[j]);
173 dev_kfree_skb(wlan_static_skb[j]);
178 void *rockchip_mem_prealloc(int section, unsigned long size)
180 //printk("rockchip_mem_prealloc: section = %d, size = %d\n", section, size);
181 if (section == PREALLOC_WLAN_SEC_NUM)
182 return wlan_static_skb;
184 if ((section < 0) || (section > 7))
187 if (wifi_mem_array[section].size < size)
190 return wifi_mem_array[section].mem_ptr;
193 void *rockchip_mem_prealloc(int section, unsigned long size) { return NULL;}
195 EXPORT_SYMBOL(rockchip_mem_prealloc);
197 /**************************************************************************
199 * get wifi power state Func
201 *************************************************************************/
202 static int wifi_power_state = 0;
203 int rfkill_get_wifi_power_state(int *power, int *vref_ctrl_enable)
205 struct rfkill_wlan_data *mrfkill = g_rfkill;
207 if (mrfkill == NULL) {
208 LOG("%s: rfkill-wlan driver has not Successful initialized\n", __func__);
212 if (mrfkill->pdata->vref_ctrl_enble)
213 *vref_ctrl_enable = 1;
214 *power = wifi_power_state;
219 /**************************************************************************
221 * wifi reference voltage control Func
223 *************************************************************************/
224 int rockchip_wifi_ref_voltage(int on)
226 struct rfkill_wlan_data *mrfkill = g_rfkill;
227 struct rksdmmc_gpio *vddio;
228 struct regulator *ldo = NULL;
232 LOG("%s: %d\n", __func__, on);
234 if (mrfkill == NULL) {
235 LOG("%s: rfkill-wlan driver has not Successful initialized\n", __func__);
239 if (!mrfkill->pdata->vref_ctrl_enble) {
240 LOG("%s: wifi io reference voltage control is disabled.\n", __func__);
244 if (!rfkill_get_bt_power_state(&power, &toggle)) {
246 LOG("%s: wifi shouldn't control io reference voltage, BT is running!\n", __func__);
251 if (mrfkill->pdata->ioregulator.power_ctrl_by_pmu) {
254 int level = mrfkill->pdata->ioregulator.enable;
255 int voltage = 1000 * mrfkill->pdata->sdio_vol;
257 ldostr = mrfkill->pdata->ioregulator.pmu_regulator;
258 if (ldostr == NULL) {
259 LOG("%s: wifi io reference voltage set to be controled by pmic, but which one?\n", __func__);
262 ldo = regulator_get(NULL, ldostr);
263 if (ldo == NULL || IS_ERR(ldo)) {
264 LOG("\n\n\n%s get ldo error,please mod this\n\n\n", __func__);
270 /*regulator_set_voltage(ldo, voltage, voltage);
271 LOG("%s: %s enabled, level = %d\n", __func__, ldostr, voltage);
272 ret = regulator_enable(ldo);
273 LOG("wifi turn on io reference voltage.\n");*/
275 regulator_set_voltage(ldo, voltage, voltage);
276 LOG("%s: %s enabled, level = %d\n", __func__, ldostr, voltage);
277 ret = regulator_enable(ldo);
278 LOG("wifi turn on io reference voltage.\n");
281 LOG("%s: %s disabled\n", __func__, ldostr);
282 while (regulator_is_enabled(ldo) > 0) {
283 ret = regulator_disable(ldo);
285 LOG("wifi shut off io reference voltage.\n");
291 vddio = &mrfkill->pdata->power_n;
294 if (gpio_is_valid(vddio->io)) {
295 gpio_set_value(vddio->io, vddio->enable);
299 LOG("wifi turn on io reference voltage.\n");
301 if (gpio_is_valid(vddio->io)) {
302 gpio_set_value(vddio->io, !(vddio->enable));
306 LOG("wifi shut off io reference voltage.\n");
313 /**************************************************************************
315 * Wifi Power Control Func
319 *************************************************************************/
320 int rockchip_wifi_power(int on)
322 struct rfkill_wlan_data *mrfkill = g_rfkill;
323 struct rksdmmc_gpio *poweron, *reset;
324 struct regulator *ldo = NULL;
328 LOG("%s: %d\n", __func__, on);
330 if (mrfkill == NULL) {
331 LOG("%s: rfkill-wlan driver has not Successful initialized\n", __func__);
335 if (!rfkill_get_bt_power_state(&power, &toggle)) {
336 if (toggle == true && power == 1) {
337 LOG("%s: wifi shouldn't control the power, it was enabled by BT!\n", __func__);
343 rockchip_wifi_ref_voltage(1);
345 if (mrfkill->pdata->mregulator.power_ctrl_by_pmu) {
348 int level = mrfkill->pdata->mregulator.enable;
350 ldostr = mrfkill->pdata->mregulator.pmu_regulator;
351 if (ldostr == NULL) {
352 LOG("%s: wifi power set to be controled by pmic, but which one?\n", __func__);
355 ldo = regulator_get(NULL, ldostr);
356 if (ldo == NULL || IS_ERR(ldo)) {
357 LOG("\n\n\n%s get ldo error,please mod this\n\n\n", __func__);
361 regulator_set_voltage(ldo, 3000000, 3000000);
362 LOG("%s: %s enabled\n", __func__, ldostr);
363 ret = regulator_enable(ldo);
364 wifi_power_state = 1;
365 LOG("wifi turn on power.\n");
367 LOG("%s: %s disabled\n", __func__, ldostr);
368 while (regulator_is_enabled(ldo) > 0) {
369 ret = regulator_disable(ldo);
371 wifi_power_state = 0;
372 LOG("wifi shut off power.\n");
378 poweron = &mrfkill->pdata->power_n;
379 reset = &mrfkill->pdata->reset_n;
382 if (gpio_is_valid(poweron->io)) {
383 gpio_set_value(poweron->io, poweron->enable);
387 if (gpio_is_valid(reset->io)) {
388 gpio_set_value(reset->io, reset->enable);
392 wifi_power_state = 1;
393 LOG("wifi turn on power. %d\n", poweron->io);
395 if (gpio_is_valid(poweron->io)) {
396 gpio_set_value(poweron->io, !(poweron->enable));
400 if (gpio_is_valid(reset->io)) {
401 gpio_set_value(reset->io, !(reset->enable));
404 wifi_power_state = 0;
405 LOG("wifi shut off power.\n");
410 rockchip_wifi_ref_voltage(0);
414 EXPORT_SYMBOL(rockchip_wifi_power);
416 /**************************************************************************
418 * Wifi Sdio Detect Func
420 *************************************************************************/
421 #include <linux/mmc/host.h>
422 extern int mmc_host_rescan(struct mmc_host *host, int val);
423 int rockchip_wifi_set_carddetect(int val)
425 return mmc_host_rescan(NULL, val);//NULL => SDIO host
427 EXPORT_SYMBOL(rockchip_wifi_set_carddetect);
429 /**************************************************************************
431 * Wifi Get Interrupt irq Func
433 *************************************************************************/
434 int rockchip_wifi_get_oob_irq(void)
436 struct rfkill_wlan_data *mrfkill = g_rfkill;
437 struct rksdmmc_gpio *wifi_int_irq;
439 LOG("%s: Enter\n", __func__);
441 if (mrfkill == NULL) {
442 LOG("%s: rfkill-wlan driver has not Successful initialized\n", __func__);
446 wifi_int_irq = &mrfkill->pdata->wifi_int_b;
447 if (gpio_is_valid(wifi_int_irq->io)) {
448 return gpio_to_irq(wifi_int_irq->io);
449 //return wifi_int_irq->io;
451 LOG("%s: wifi OOB pin isn't defined.\n", __func__);
456 EXPORT_SYMBOL(rockchip_wifi_get_oob_irq);
458 /**************************************************************************
462 *************************************************************************/
463 int rockchip_wifi_reset(int on)
467 EXPORT_SYMBOL(rockchip_wifi_reset);
469 /**************************************************************************
471 * Wifi MAC custom Func
473 *************************************************************************/
474 #include <linux/etherdevice.h>
475 u8 wifi_custom_mac_addr[6] = {0,0,0,0,0,0};
476 extern char GetSNSectorInfo(char * pbuf);
477 int rockchip_wifi_mac_addr(unsigned char *buf)
481 char mac_buf[20] = {0};
482 LOG("%s: enter.\n", __func__);
485 if(is_zero_ether_addr(wifi_custom_mac_addr)) {
487 char *tempBuf = kmalloc(512, GFP_KERNEL);
489 GetSNSectorInfo(tempBuf);
490 for (i = 506; i <= 511; i++)
491 wifi_custom_mac_addr[i-506] = tempBuf[i];
498 sprintf(mac_buf,"%02x:%02x:%02x:%02x:%02x:%02x",wifi_custom_mac_addr[0],wifi_custom_mac_addr[1],
499 wifi_custom_mac_addr[2],wifi_custom_mac_addr[3],wifi_custom_mac_addr[4],wifi_custom_mac_addr[5]);
500 LOG("falsh wifi_custom_mac_addr=[%s]\n", mac_buf);
502 if (is_valid_ether_addr(wifi_custom_mac_addr)) {
503 if (2 == (wifi_custom_mac_addr[0] & 0x0F)) {
504 LOG("This mac address come into conflict with the address of direct, ignored...\n");
508 LOG("This mac address is not valid, ignored...\n");
512 #if defined(CONFIG_RKWIFI)
513 memcpy(buf, wifi_custom_mac_addr, 6);
515 memcpy(buf, mac_buf, strlen(mac_buf));//realtek's wifi use this branch
520 EXPORT_SYMBOL(rockchip_wifi_mac_addr);
522 /**************************************************************************
524 * wifi get country code func
526 *************************************************************************/
527 struct cntry_locales_custom {
528 char iso_abbrev[4]; /* ISO 3166-1 country abbreviation */
529 char custom_locale[4]; /* Custom firmware locale */
530 int custom_locale_rev; /* Custom local revisin default -1 */
533 static struct cntry_locales_custom country_cloc;
535 void *rockchip_wifi_country_code(char *ccode)
537 struct cntry_locales_custom *mcloc;
539 LOG("%s: set country code [%s]\n", __func__, ccode);
540 mcloc = &country_cloc;
541 memcpy(mcloc->custom_locale, ccode, 4);
542 mcloc->custom_locale_rev = 0;
546 EXPORT_SYMBOL(rockchip_wifi_country_code);
547 /**************************************************************************/
549 static int rockchip_wifi_voltage_select(void)
551 struct rfkill_wlan_data *mrfkill = g_rfkill;
554 if (mrfkill == NULL) {
555 LOG("%s: rfkill-wlan driver has not Successful initialized\n", __func__);
558 voltage = mrfkill->pdata->sdio_vol;
559 if (voltage > 2700 && voltage < 3500) {
560 writel_relaxed(0x00100000, RK_GRF_VIRT+0x380); //3.3
561 LOG("%s: wifi & sdio reference voltage: 3.3V\n", __func__);
562 } else if (voltage > 1500 && voltage < 1950) {
563 writel_relaxed(0x00100010, RK_GRF_VIRT+0x380); //1.8
564 LOG("%s: wifi & sdio reference voltage: 1.8V\n", __func__);
566 LOG("%s: unsupport wifi & sdio reference voltage!\n", __func__);
573 static int rfkill_rk_setup_gpio(struct rksdmmc_gpio *gpio, const char* prefix, const char* name)
575 if (gpio_is_valid(gpio->io)) {
577 sprintf(gpio->name, "%s_%s", prefix, name);
578 ret = gpio_request(gpio->io, gpio->name);
580 LOG("Failed to get %s gpio.\n", gpio->name);
589 static int wlan_platdata_parse_dt(struct device *dev,
590 struct rksdmmc_gpio_wifi_moudle *data)
592 struct device_node *node = dev->of_node;
596 enum of_gpio_flags flags;
601 memset(data, 0, sizeof(*data));
604 /* ret = of_property_read_u32(node, "sdio_vref", &value);
606 LOG("%s: Can't get sdio vref.", __func__);
609 data->sdio_vol = value;*/
611 ret = of_property_read_u32(node, "sdio_vref", &value);
613 LOG("%s: Can't get sdio vref.", __func__);
616 data->sdio_vol = value;
619 if (of_find_property(node, "vref_ctrl_enable", NULL)) {
620 LOG("%s: enable wifi io reference voltage control.\n", __func__);
621 data->vref_ctrl_enble = true;
622 if (of_find_property(node, "vref_ctrl_gpio", NULL)) {
623 gpio = of_get_named_gpio_flags(node, "vref_ctrl_gpio", 0, &flags);
624 if (gpio_is_valid(gpio)){
625 data->vddio.io = gpio;
626 data->vddio.enable = (flags == GPIO_ACTIVE_HIGH)? 1:0;
627 data->ioregulator.power_ctrl_by_pmu = false;
628 LOG("%s: get property: vref_ctrl_gpio = %d, flags = %d.\n", __func__, gpio, flags);
631 data->vref_ctrl_enble = false;
632 LOG("%s: vref_ctrl_gpio defined invalid, disable wifi io reference voltage control.\n", __func__);
635 data->ioregulator.power_ctrl_by_pmu = true;
636 ret = of_property_read_string(node, "vref_pmu_regulator", &strings);
638 LOG("%s: Can not read property: vref_pmu_regulator.\n", __func__);
639 data->vref_ctrl_enble = false;
640 data->ioregulator.power_ctrl_by_pmu = false;
642 LOG("%s: wifi io reference voltage controled by pmu(%s).\n", __func__, strings);
643 sprintf(data->ioregulator.pmu_regulator, "%s", strings);
645 ret = of_property_read_u32(node, "vref_pmu_enable_level", &value);
647 LOG("%s: Can not read property: vref_pmu_enable_level.\n", __func__);
648 data->vref_ctrl_enble = false;
649 data->ioregulator.power_ctrl_by_pmu = false;
651 LOG("%s: wifi io reference voltage controled by pmu(level = %s).\n", __func__, (value == 1)?"HIGH":"LOW");
652 data->ioregulator.enable = value;
656 data->vref_ctrl_enble = false;
657 LOG("%s: disable wifi io reference voltage control.\n", __func__);
660 if (of_find_property(node, "power_ctrl_by_pmu", NULL)) {
661 data->mregulator.power_ctrl_by_pmu = true;
662 ret = of_property_read_string(node, "power_pmu_regulator", &strings);
664 LOG("%s: Can not read property: power_pmu_regulator.\n", __func__);
665 data->mregulator.power_ctrl_by_pmu = false;
667 LOG("%s: wifi power controled by pmu(%s).\n", __func__, strings);
668 sprintf(data->mregulator.pmu_regulator, "%s", strings);
670 ret = of_property_read_u32(node, "power_pmu_enable_level", &value);
672 LOG("%s: Can not read property: power_pmu_enable_level.\n", __func__);
673 data->mregulator.power_ctrl_by_pmu = false;
675 LOG("%s: wifi power controled by pmu(level = %s).\n", __func__, (value == 1)?"HIGH":"LOW");
676 data->mregulator.enable = value;
679 data->mregulator.power_ctrl_by_pmu = false;
680 LOG("%s: wifi power controled by gpio.\n", __func__);
681 gpio = of_get_named_gpio_flags(node, "WIFI,poweren_gpio", 0, &flags);
682 if (gpio_is_valid(gpio)){
683 data->power_n.io = gpio;
684 data->power_n.enable = (flags == GPIO_ACTIVE_HIGH)? 1:0;
685 LOG("%s: get property: WIFI,poweren_gpio = %d, flags = %d.\n", __func__, gpio, flags);
686 } else data->power_n.io = -1;
687 gpio = of_get_named_gpio_flags(node, "WIFI,reset_gpio", 0, &flags);
688 if (gpio_is_valid(gpio)){
689 data->reset_n.io = gpio;
690 data->reset_n.enable = (flags == GPIO_ACTIVE_HIGH)? 1:0;
691 LOG("%s: get property: WIFI,reset_gpio = %d, flags = %d.\n", __func__, gpio, flags);
692 } else data->reset_n.io = -1;
693 gpio = of_get_named_gpio_flags(node, "WIFI,host_wake_irq", 0, &flags);
694 if (gpio_is_valid(gpio)){
695 data->wifi_int_b.io = gpio;
696 data->wifi_int_b.enable = flags;
697 LOG("%s: get property: WIFI,host_wake_irq = %d, flags = %d.\n", __func__, gpio, flags);
698 } else data->wifi_int_b.io = -1;
705 #if defined(CONFIG_HAS_EARLYSUSPEND)
706 #include <linux/earlysuspend.h>
708 static void wlan_early_suspend(struct early_suspend *h)
710 LOG("%s :enter\n", __func__);
715 static void wlan_late_resume(struct early_suspend *h)
717 LOG("%s :enter\n", __func__);
722 struct early_suspend wlan_early_suspend {
723 .level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN - 20;
724 .suspend = wlan_early_suspend;
725 .resume = wlan_late_resume;
729 static int rfkill_wlan_probe(struct platform_device *pdev)
731 struct rfkill_wlan_data *rfkill;
732 struct rksdmmc_gpio_wifi_moudle *pdata = pdev->dev.platform_data;
735 LOG("Enter %s\n", __func__);
739 pdata = kzalloc(sizeof(struct rksdmmc_gpio_wifi_moudle), GFP_KERNEL);
743 ret = wlan_platdata_parse_dt(&pdev->dev, pdata);
746 LOG("%s: No platform data specified\n", __func__);
753 rfkill = kzalloc(sizeof(*rfkill), GFP_KERNEL);
755 goto rfkill_alloc_fail;
757 rfkill->pdata = pdata;
760 LOG("%s: init gpio\n", __func__);
762 if (!pdata->mregulator.power_ctrl_by_pmu) {
763 ret = rfkill_rk_setup_gpio(&pdata->power_n, wlan_name, "wlan_poweren");
764 if (ret) goto fail_alloc;
766 ret = rfkill_rk_setup_gpio(&pdata->reset_n, wlan_name, "wlan_reset");
767 if (ret) goto fail_alloc;
770 wake_lock_init(&(rfkill->wlan_irq_wl), WAKE_LOCK_SUSPEND, "rfkill_wlan_wake");
772 // Turn off wifi power as default
773 if (gpio_is_valid(pdata->power_n.io))
775 gpio_direction_output(pdata->power_n.io, !pdata->power_n.enable);
778 rockchip_wifi_voltage_select();
780 #if BCM_STATIC_MEMORY_SUPPORT
781 rockchip_init_wifi_mem();
784 #if defined(CONFIG_HAS_EARLYSUSPEND)
785 register_early_suspend(wlan_early_suspend);
788 LOG("Exit %s\n", __func__);
802 static int rfkill_wlan_remove(struct platform_device *pdev)
804 struct rfkill_wlan_data *rfkill = platform_get_drvdata(pdev);
806 LOG("Enter %s\n", __func__);
808 wake_lock_destroy(&rfkill->wlan_irq_wl);
810 if (gpio_is_valid(rfkill->pdata->power_n.io))
811 gpio_free(rfkill->pdata->power_n.io);
813 if (gpio_is_valid(rfkill->pdata->reset_n.io))
814 gpio_free(rfkill->pdata->reset_n.io);
816 // if (gpio_is_valid(rfkill->pdata->vddio.io))
817 // gpio_free(rfkill->pdata->vddio.io);
819 // if (gpio_is_valid(rfkill->pdata->bgf_int_b.io))
820 // gpio_free(rfkill->pdata->bgf_int_b.io);
822 // if (gpio_is_valid(rfkill->pdata->gps_sync.io))
823 // gpio_free(rfkill->pdata->gps_sync.io);
825 // if (gpio_is_valid(rfkill->pdata->ANTSEL2.io))
826 // gpio_free(rfkill->pdata->ANTSEL2.io);
828 // if (gpio_is_valid(rfkill->pdata->ANTSEL3.io))
829 // gpio_free(rfkill->pdata->ANTSEL3.io);
831 // if (gpio_is_valid(rfkill->pdata->GPS_LAN.io))
832 // gpio_free(rfkill->pdata->GPS_LAN.io);
840 static int rfkill_wlan_suspend(struct platform_device *pdev, pm_message_t state)
842 LOG("Enter %s\n", __func__);
846 static int rfkill_wlan_resume(struct platform_device *pdev)
848 LOG("Enter %s\n", __func__);
853 static struct of_device_id wlan_platdata_of_match[] = {
854 { .compatible = "wlan-platdata" },
857 MODULE_DEVICE_TABLE(of, wlan_platdata_of_match);
860 static struct platform_driver rfkill_wlan_driver = {
861 .probe = rfkill_wlan_probe,
862 .remove = rfkill_wlan_remove,
863 .suspend = rfkill_wlan_suspend,
864 .resume = rfkill_wlan_resume,
866 .name = "wlan-platdata",
867 .owner = THIS_MODULE,
868 .of_match_table = of_match_ptr(wlan_platdata_of_match),
872 static int __init rfkill_wlan_init(void)
874 LOG("Enter %s\n", __func__);
875 return platform_driver_register(&rfkill_wlan_driver);
878 static void __exit rfkill_wlan_exit(void)
880 LOG("Enter %s\n", __func__);
881 platform_driver_unregister(&rfkill_wlan_driver);
884 module_init(rfkill_wlan_init);
885 module_exit(rfkill_wlan_exit);
887 MODULE_DESCRIPTION("rock-chips rfkill for wifi v0.1");
888 MODULE_AUTHOR("gwl@rock-chips.com");
889 MODULE_LICENSE("GPL");