static int rtl8723au_gpio_ctrl(char* name, int level) { static int usbc_enable = 0; if (strcmp(name, "rtl8723au_wl") == 0) { if ((level && !rtl8723au_bt_power) || (!level && !rtl8723au_bt_power)) { rtl8723au_msg("rtl8723au is powered %s by wifi\n", level ? "up" : "down"); goto power_change; } else { if (level) { rtl8723au_msg("rtl8723au is already on by bt\n"); } else { rtl8723au_msg("rtl8723au should stay on because of bt\n"); } goto state_change; } } if (strcmp(name, "rtl8723au_bt") == 0) { if ((level && !rtl8723au_wifi_power && !rtl8723au_bt_power) || (!level && !rtl8723au_wifi_power)) { rtl8723au_msg("rtl8723au is powered %s by bt\n", level ? "up" : "down"); goto power_change; } else { if (level) { rtl8723au_msg("rtl8723au is already on by wifi\n"); } else { rtl8723au_msg("rtl8723au should stay on because of wifi\n"); } goto state_change; } } return 0; power_change: if (level) { rtl8723au_module_power(level); if (!usbc_enable) { msleep(10); sw_usb_enable_hcd(usbc_id); usbc_enable = 1; } } else { if (usbc_enable && !rtl8723au_bt_power) { sw_usb_disable_hcd(usbc_id); msleep(1); usbc_enable = 0; } rtl8723au_module_power(level); } state_change: if (strcmp(name, "rtl8723au_wl")==0) rtl8723au_wifi_power = level; if (strcmp(name, "rtl8723au_bt")==0) rtl8723au_bt_power = level; rtl8723au_msg("rtl8723au power state change: wifi %d, bt %d !!\n", rtl8723au_wifi_power, rtl8723au_bt_power); return 0; }
/* Init driver module */ INT __init rtusb_init(void) { int ret = 0; printk("rtusb init %s --->\n", RTMP_DRV_NAME); ret = script_parser_fetch("usb_wifi_para", "usb_wifi_usbc_num", (int *)&usb_wifi_host, 64); if(ret != 0){ printk("ERR: script_parser_fetch usb_wifi_usbc_num failed\n"); ret = -ENOMEM; return ret; } printk("sw_usb_enable_hcd: usbc_num = %d\n", usb_wifi_host); sw_usb_enable_hcd(usb_wifi_host); #ifdef RESOURCE_BOOT_ALLOC { int status; status = rtusb_resource_init(rtusb_tx_buf_len, rtusb_rx_buf_len, rtusb_tx_buf_cnt, rtusb_rx_buf_cnt); if (status) { printk("resource allocate failed, don't register driver!\n"); return -1; } } #endif /* RESOURCE_BOOT_ALLOC */ return usb_register(&rtusb_driver); }
int platform_wifi_power_on(void) { int ret = 0; #if defined(CONFIG_PLATFORM_ARM_SUN6I) || defined(CONFIG_PLATFORM_ARM_SUN7I) { script_item_value_type_e type; type = script_get_item("wifi_para", "wifi_usbc_id", &item); if(SCIRPT_ITEM_VALUE_TYPE_INT != type){ printk("ERR: script_get_item wifi_usbc_id failed\n"); ret = -ENOMEM; goto exit; } printk("sw_usb_enable_hcd: usbc_num = %d\n", item.val); wifi_pm_power(1); mdelay(10); #if !(defined(CONFIG_RTL8723A)) && !(defined(CONFIG_RTL8723B)) sw_usb_enable_hcd(item.val); #endif } #endif //defined(CONFIG_PLATFORM_ARM_SUN6I) || defined(CONFIG_PLATFORM_ARM_SUN7I) #if defined(CONFIG_PLATFORM_ARM_SUNxI) { script_item_value_type_e type; type = script_get_item("wifi_para", "wifi_usbc_id", &item); if(SCIRPT_ITEM_VALUE_TYPE_INT != type){ printk("ERR: script_get_item wifi_usbc_id failed\n"); ret = -ENOMEM; goto exit; } printk("sunxi_usb_enable_hcd: usbc_num = %d\n", item.val); wifi_pm_power(1); mdelay(10); #if !(defined(CONFIG_RTL8723A)) && !(defined(CONFIG_RTL8723B)) sunxi_usb_enable_hcd(item.val); #endif } #endif //CONFIG_PLATFORM_ARM_SUNxI exit: return ret; }