int bcm_wlan_power_off(int flag) { static struct wake_lock *wifi_wake_lock = &bcm_data.wifi_wake_lock; #ifdef WL_REG_EN int wl_reg_on = WL_REG_EN; #endif #ifdef WL_RST_EN int reset = bcm_data.wifi_reset; #endif if (wifi_wake_lock == NULL) pr_warn("%s: invalid wifi_wake_lock\n", __func__); #ifdef WL_RST_EN else if (!gpio_is_valid(reset)) pr_warn("%s: invalid reset\n", __func__); #endif else goto start; return -ENODEV; start: pr_debug("wlan power off:%d\n", flag); switch(flag) { case RESET: #ifdef WL_RST_EN gpio_direction_output(reset, 0); #endif #ifdef WL_REG_EN udelay(65); gpio_direction_output(wl_reg_on,0); #endif jzmmc_clk_ctrl(1, 0); break; case NORMAL: #ifdef WL_RST_EN gpio_direction_output(reset, 0); #endif udelay(65); /* * control wlan reg on pin */ #ifdef WL_REG_EN gpio_direction_output(wl_reg_on,0); #endif msleep(200); jzmmc_manual_detect(1, 0); break; } // wake_unlock(wifi_wake_lock); bcm_power_down(); wifi_le_set_io(); return 0; }
static int bt_power_control(struct bt_power *bt_power, int enable) { if (enable == bt_power_state) return 0; switch (enable) { case RFKILL_STATE_SOFT_BLOCKED: bluesleep_stop(); msleep(15); bcm_power_down(); bt_disable_power(bt_power); if (bt_power->pdata->set_pin_status != NULL){ (*bt_power->pdata->set_pin_status)(enable); } else { pr_warn("%s set_pin_status is not defined\n", __func__); } break; case RFKILL_STATE_UNBLOCKED: if (bt_power->pdata->restore_pin_status != NULL){ (*bt_power->pdata->restore_pin_status)(enable); } else { pr_warn("%s set_pin_status is not defined\n", __func__); } bcm_power_on(); if (bt_power->bt_rst_n != -1) { gpio_direction_output(bt_power->bt_rst_n, 0); } else { pr_warn("%s bt_rst_n can not be defined to -1\n", __func__); } bt_enable_power(bt_power); mdelay(15); if (bt_power->bt_rst_n != -1) { gpio_set_value(bt_power->bt_rst_n, 1); } else { pr_warn("%s bt_rst_n can not be defined to -1\n", __func__); } mdelay(15); bluesleep_start(); break; default: break; } bt_power_state = enable; return 0; }