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; }
int bcm_wlan_power_on(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 on:%d\n", flag); wifi_le_restore_io(); bcm_power_on(); msleep(200); switch(flag) { case RESET: #ifdef WL_REG_EN gpio_direction_output(wl_reg_on, 1); msleep(200); #endif jzmmc_clk_ctrl(1, 1); #ifdef WL_RST_EN gpio_direction_output(reset, 0); msleep(200); gpio_direction_output(reset, 1); msleep(200); #endif break; case NORMAL: msleep(200); #ifdef WL_REG_EN gpio_direction_output(wl_reg_on,1); msleep(200); #endif #ifdef WL_RST_EN gpio_direction_output(reset, 0); msleep(200); gpio_direction_output(reset, 1); msleep(200); #endif jzmmc_manual_detect(1, 1); break; } // wake_lock(wifi_wake_lock); return 0; }