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;
}
Esempio n. 2
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;
}