static int __init rtw_drv_entry(void) { int ret = 0; /*depends on sunxi power control */ #if defined CONFIG_MMC_SUNXI_POWER_CONTROL unsigned int mod_sel = mmc_pm_get_mod_type(); if(mod_sel == SUNXI_SDIO_WIFI_NUM_RTL8723AS) { rtl8723as_sdio_powerup(); sunximmc_rescan_card(SDIOID, 1); printk("[rtl8723as] %s: power up, rescan card.\n", __FUNCTION__); } else { ret = -1; printk("[rtl8723as] %s: mod_sel = %d is incorrect.\n", __FUNCTION__, mod_sel); } #endif if(ret != 0) goto exit; rtw_suspend_lock_init(); // DBG_871X(KERN_INFO "+%s", __func__); RT_TRACE(_module_hci_intfs_c_, _drv_notice_, ("+rtw_drv_entry\n")); DBG_871X(KERN_NOTICE DRV_NAME " driver version " DRIVERVERSION "\n"); ret = sdio_register_driver(&drvpriv.r871xs_drv); exit: // DBG_871X(KERN_INFO "-%s: ret=%d", __func__, ret); RT_TRACE(_module_hci_intfs_c_, _drv_notice_, ("-rtw_drv_entry: ret=%d\n", ret)); return ret; }
static int rfkill_set_power(void *data, bool blocked) { unsigned int mod_sel = mmc_pm_get_mod_type(); RF_MSG("rfkill set power %d\n", blocked); #ifdef AW_SUPPORT_1IN1_BT rfkill_bt_set_power(blocked); #endif spin_lock(&bt_power_lock); switch (mod_sel) { case 2: /* usi bm01a */ if (!blocked) { mmc_pm_gpio_ctrl("usi_bm01a_bt_regon", 1); mmc_pm_gpio_ctrl("usi_bm01a_bt_rst", 1); } else { mmc_pm_gpio_ctrl("usi_bm01a_bt_regon", 0); mmc_pm_gpio_ctrl("usi_bm01a_bt_rst", 0); } break; case 5: /* swb b23 */ if (!blocked) { mmc_pm_gpio_ctrl("swbb23_bt_shdn", 1); } else { mmc_pm_gpio_ctrl("swbb23_bt_shdn", 0); } break; case 6: /* huawei mw269x */ if (!blocked) { mmc_pm_gpio_ctrl("hw_mw269x_bt_wake", 1); mmc_pm_gpio_ctrl("hw_mw269x_bt_enb", 1); } else { mmc_pm_gpio_ctrl("hw_mw269x_bt_enb", 0); mmc_pm_gpio_ctrl("hw_mw269x_bt_wake", 0); } break; case 8: /* bcm40183 */ if (!blocked) { mmc_pm_gpio_ctrl("bcm40183_bt_regon", 1); mmc_pm_gpio_ctrl("bcm40183_bt_rst", 1); } else { mmc_pm_gpio_ctrl("bcm40183_bt_regon", 0); mmc_pm_gpio_ctrl("bcm40183_bt_rst", 0); } break; case 9: /* realtek rtl8723as */ if (!blocked) { mmc_pm_gpio_ctrl("rtk_rtl8723as_bt_dis", 1); } else { mmc_pm_gpio_ctrl("rtk_rtl8723as_bt_dis", 0); } break; default: RF_MSG("no bt module matched !!\n"); } spin_unlock(&bt_power_lock); msleep(100); return 0; }
/* * Return: * 0: power on successfully * others: power on failed */ int platform_wifi_power_on(void) { int ret = 0; #ifdef CONFIG_MMC_SUNXI_POWER_CONTROL unsigned int mod_sel = mmc_pm_get_mod_type(); #endif // CONFIG_MMC_SUNXI_POWER_CONTROL #ifdef CONFIG_MMC_SUNXI_POWER_CONTROL ret = -1; printk("[rtl8189es] %s: mod_sel = %d is incorrect.\n", __FUNCTION__, mod_sel); #endif // CONFIG_MMC_SUNXI_POWER_CONTROL return ret; }
static int __init rtw_drv_entry(void) { int ret = 0; /*depends on sunxi power control */ #if defined CONFIG_MMC_SUNXI_POWER_CONTROL unsigned int mod_sel = mmc_pm_get_mod_type(); if(mod_sel == SUNXI_SDIO_WIFI_NUM_RTL8189ES) { rtl8189es_sdio_powerup(); sunximmc_rescan_card(SDIOID, 1); printk("[rtl8189es] %s: power up, rescan card.\n", __FUNCTION__); } else { ret = -1; printk("[rtl8189es] %s: mod_sel = %d is incorrect.\n", __FUNCTION__, mod_sel); } #endif if(ret != 0) goto exit; // DBG_871X(KERN_INFO "+%s", __func__); RT_TRACE(_module_hci_intfs_c_, _drv_notice_, ("+rtw_drv_entry\n")); DBG_871X(KERN_NOTICE DRV_NAME " driver version " DRIVERVERSION "\n"); rtw_suspend_lock_init(); #if defined(CONFIG_CONCURRENT_MODE) || defined(CONFIG_DUALMAC_CONCURRENT) //init global variable _rtw_mutex_init(&drvpriv.h2c_fwcmd_mutex); _rtw_mutex_init(&drvpriv.setch_mutex); _rtw_mutex_init(&drvpriv.setbw_mutex); _rtw_mutex_init(&drvpriv.hw_init_mutex); #endif drvpriv.drv_registered = _TRUE; ret = sdio_register_driver(&drvpriv.r871xs_drv); exit: // DBG_871X(KERN_INFO "-%s: ret=%d", __func__, ret); RT_TRACE(_module_hci_intfs_c_, _drv_notice_, ("-rtw_drv_entry: ret=%d\n", ret)); return ret; }
static int rfkill_set_power(void *data, bool blocked) { unsigned int mod_sel = mmc_pm_get_mod_type(); RF_MSG("rfkill set power %d\n", blocked); spin_lock(&bt_power_lock); switch (mod_sel) { case 2: /* usi bm01a */ if (!blocked) { mmc_pm_gpio_ctrl("usi_bm01a_bt_regon", 1); mmc_pm_gpio_ctrl("usi_bm01a_bt_rst", 1); } else { mmc_pm_gpio_ctrl("usi_bm01a_bt_regon", 0); mmc_pm_gpio_ctrl("usi_bm01a_bt_rst", 0); } break; case 5: /* swb b23 */ if (!blocked) { mmc_pm_gpio_ctrl("swbb23_bt_shdn", 1); } else { mmc_pm_gpio_ctrl("swbb23_bt_shdn", 0); } break; case 6: /* huawei mw269x */ if (!blocked) { mmc_pm_gpio_ctrl("hw_mw269x_bt_wake", 1); mmc_pm_gpio_ctrl("hw_mw269x_bt_enb", 1); } else { mmc_pm_gpio_ctrl("hw_mw269x_bt_enb", 0); mmc_pm_gpio_ctrl("hw_mw269x_bt_wake", 0); } break; default: RF_MSG("no bt module matched !!\n"); } spin_unlock(&bt_power_lock); msleep(100); return 0; }
/* * Return: * 0: power on successfully * others: power on failed */ int platform_wifi_power_on(void) { int ret = 0; #ifdef CONFIG_MMC_SUNXI_POWER_CONTROL unsigned int mod_sel = mmc_pm_get_mod_type(); #endif // CONFIG_MMC_SUNXI_POWER_CONTROL #ifdef CONFIG_MMC_SUNXI_POWER_CONTROL if (mod_sel == SUNXI_SDIO_WIFI_NUM_RTL8189ES) { rtl8189es_sdio_powerup(); sunximmc_rescan_card(SDIOID, 1); printk("[rtl8189es] %s: power up, rescan card.\n", __FUNCTION__); } else { ret = -1; printk("[rtl8189es] %s: mod_sel = %d is incorrect.\n", __FUNCTION__, mod_sel); } #endif // CONFIG_MMC_SUNXI_POWER_CONTROL return ret; }
static int rtw_sdio_resume(struct device *dev) { struct sdio_func *func =dev_to_sdio_func(dev); struct dvobj_priv *psdpriv = sdio_get_drvdata(func); _adapter *padapter = psdpriv->padapter; struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; int ret = 0; /*depends on sunxi power control */ #if defined CONFIG_MMC_SUNXI_POWER_CONTROL unsigned int mod_sel = mmc_pm_get_mod_type(); if(mod_sel == SUNXI_SDIO_WIFI_NUM_RTL8723AS) { // rtl8723as_sdio_powerup(); // sunximmc_rescan_card(SDIOID, 1); printk("[rtl8723as] %s: resume start.\n", __FUNCTION__); } else { printk("[rtl8723as] %s: mod_sel = %d is incorrect./n", __FUNCTION__, mod_sel); } #endif if(pwrpriv->bInternalAutoSuspend ){ ret = rtw_resume_process(padapter); } else { #ifdef CONFIG_RESUME_IN_WORKQUEUE rtw_resume_in_workqueue(pwrpriv); #elif defined(CONFIG_HAS_EARLYSUSPEND) || defined(CONFIG_ANDROID_POWER) if(rtw_is_earlysuspend_registered(pwrpriv)) { //jeff: bypass resume here, do in late_resume pwrpriv->do_late_resume = _TRUE; } else { ret = rtw_resume_process(padapter); } #else // Normal resume process ret = rtw_resume_process(padapter); #endif //CONFIG_RESUME_IN_WORKQUEUE } return ret; }
/* Customer function to control hw specific wlan gpios */ void dhd_customer_gpio_wlan_ctrl(int onoff) { #if defined CONFIG_MMC_SUNXI_POWER_CONTROL unsigned int mod_sel = mmc_pm_get_mod_type(); if (mod_sel != 6) { printk("Config Error: not for huawei mw269x sdio wifi module\n"); } #endif switch (onoff) { case WLAN_RESET_OFF: WL_TRACE(("%s: call customer specific GPIO to insert WLAN RESET\n", __FUNCTION__)); #if defined CONFIG_MMC_SUNXI_POWER_CONTROL mmc_pm_gpio_ctrl("hw_mw269x_wl_enb", 0); #endif #ifdef CUSTOMER_HW bcm_wlan_power_off(2); #endif /* CUSTOMER_HW */ #ifdef CUSTOMER_HW2 wifi_set_power(0, 0); #endif WL_ERROR(("=========== WLAN placed in RESET ========\n")); break; case WLAN_RESET_ON: WL_TRACE(("%s: callc customer specific GPIO to remove WLAN RESET\n", __FUNCTION__)); #if defined CONFIG_MMC_SUNXI_POWER_CONTROL mmc_pm_gpio_ctrl("hw_mw269x_wl_enb", 1); #endif #ifdef CUSTOMER_HW bcm_wlan_power_on(2); #endif /* CUSTOMER_HW */ #ifdef CUSTOMER_HW2 wifi_set_power(1, 0); #endif WL_ERROR(("=========== WLAN going back to live ========\n")); OSL_DELAY(10000); break; case WLAN_POWER_OFF: WL_TRACE(("%s: call customer specific GPIO to turn off WL_REG_ON\n", __FUNCTION__)); #if defined CONFIG_MMC_SUNXI_POWER_CONTROL mmc_pm_gpio_ctrl("hw_mw269x_wl_enb", 0); sunximmc_rescan_card(SDIOID, 0); #endif #ifdef CUSTOMER_HW bcm_wlan_power_off(1); #endif /* CUSTOMER_HW */ break; case WLAN_POWER_ON: WL_TRACE(("%s: call customer specific GPIO to turn on WL_REG_ON\n", __FUNCTION__)); #if defined CONFIG_MMC_SUNXI_POWER_CONTROL mmc_pm_gpio_ctrl("hw_mw269x_wl_enb", 1); #endif #ifdef CUSTOMER_HW bcm_wlan_power_on(1); #endif /* CUSTOMER_HW */ /* Lets customer power to get stable */ OSL_DELAY(200); #if defined CONFIG_MMC_SUNXI_POWER_CONTROL sunximmc_rescan_card(SDIOID, 1); #endif /* CUSTOMER_HW */ break; } }
/* Customer function to control hw specific wlan gpios */ void dhd_customer_gpio_wlan_ctrl(int onoff) { #if defined CUSTOMER_ALLWINNER && defined CONFIG_SW_MMC_POWER_CONTROL unsigned int mod_sel = mmc_pm_get_mod_type(); #endif switch (onoff) { case WLAN_RESET_OFF: WL_TRACE(("%s: call customer specific GPIO to insert WLAN RESET\n", __FUNCTION__)); /* winner's power control */ #if defined CUSTOMER_ALLWINNER && defined CONFIG_SW_MMC_POWER_CONTROL switch (mod_sel) { case 2: /* usi bm01a */ mmc_pm_gpio_ctrl("usi_bm01a_wl_rst", 0); mmc_pm_gpio_ctrl("usi_bm01a_wl_regon", 0); break; case 5: /* swb b23 */ mmc_pm_gpio_ctrl("swbb23_wl_shdn", 0); break; default: printk("[bcm4329]: no wifi module matched !!\n"); } #endif #ifdef CUSTOMER_HW bcm_wlan_power_off(2); #endif /* CUSTOMER_HW */ #ifdef CUSTOMER_HW2 wifi_set_power(0, 0); #endif WL_ERROR(("=========== WLAN placed in RESET ========\n")); break; case WLAN_RESET_ON: WL_TRACE(("%s: callc customer specific GPIO to remove WLAN RESET\n", __FUNCTION__)); /* winner's power control */ #if defined CUSTOMER_ALLWINNER && defined CONFIG_SW_MMC_POWER_CONTROL switch (mod_sel) { case 2: /* usi bm01a */ mmc_pm_gpio_ctrl("usi_bm01a_wl_regon", 1); mmc_pm_gpio_ctrl("usi_bm01a_wl_rst", 1); break; case 5: /* swb b23 */ mmc_pm_gpio_ctrl("swbb23_wl_shdn", 1); break; default: printk("[bcm4329]: no wifi module matched !!\n"); } #endif #ifdef CUSTOMER_HW bcm_wlan_power_on(2); #endif /* CUSTOMER_HW */ #ifdef CUSTOMER_HW2 wifi_set_power(1, 0); #endif WL_ERROR(("=========== WLAN going back to live ========\n")); OSL_DELAY(10000); break; case WLAN_POWER_OFF: WL_TRACE(("%s: call customer specific GPIO to turn off WL_REG_ON\n", __FUNCTION__)); /* winner's power control */ #if defined CUSTOMER_ALLWINNER && defined CONFIG_SW_MMC_POWER_CONTROL switch (mod_sel) { case 2: /* usi bm01a */ mmc_pm_gpio_ctrl("usi_bm01a_wl_rst", 0); mmc_pm_gpio_ctrl("usi_bm01a_wl_regon", 0); break; case 5: /* swb b23 */ mmc_pm_gpio_ctrl("swbb23_wl_shdn", 0); break; default: printk("[bcm4329]: no wifi module matched !!\n"); } sw_mmc_rescan_card(3, 0); #endif #ifdef CUSTOMER_HW bcm_wlan_power_off(1); #endif /* CUSTOMER_HW */ break; case WLAN_POWER_ON: WL_TRACE(("%s: call customer specific GPIO to turn on WL_REG_ON\n", __FUNCTION__)); /* winner's power control */ #if defined CUSTOMER_ALLWINNER && defined CONFIG_SW_MMC_POWER_CONTROL switch (mod_sel) { case 2: /* usi bm01a */ mmc_pm_gpio_ctrl("usi_bm01a_wl_regon", 1); mmc_pm_gpio_ctrl("usi_bm01a_wl_rst", 1); break; case 5: /* swb b23 */ mmc_pm_gpio_ctrl("swbb23_wl_shdn", 1); break; default: printk("[bcm4329]: no wifi module matched !!\n"); } #endif #ifdef CUSTOMER_HW bcm_wlan_power_on(1); #endif /* CUSTOMER_HW */ /* Lets customer power to get stable */ OSL_DELAY(200); #if defined CUSTOMER_ALLWINNER && defined CONFIG_SW_MMC_POWER_CONTROL sw_mmc_rescan_card(3, 1); #endif break; } }