static int bcm4329_rfkill_suspend(struct platform_device *pdev, pm_message_t state) { #ifdef CONFIG_BT_AUTOSLEEP bcm4325_sleep(1); #endif return 0; }
static int bcm4329_rfkill_suspend(struct platform_device *pdev, pm_message_t state) { DBG("%s\n",__FUNCTION__); cancel_delayed_work(&wakeup_work); #ifdef CONFIG_BT_AUTOSLEEP bcm4325_sleep(1); #endif DBG("Disable UART_RTS\n"); //To prevent uart to receive bt data when suspended IOMUX_UART_RTS_GPIO(); gpio_request(UART_RTS, "uart_rts"); gpio_set_value(UART_RTS, GPIO_HIGH); // enable bt wakeup host DBG("Request irq for bt wakeup host\n"); if (0 == request_irq(BT_IRQ_WAKE_UP_HOST, bcm4329_wake_host_irq, IRQF_TRIGGER_FALLING, "bt_wake", NULL)) enable_irq_wake(BT_IRQ_WAKE_UP_HOST); else LOG("Failed to request BT_WAKE_UP_HOST irq\n"); #ifdef CONFIG_RFKILL_RESET extern void rfkill_set_block(struct rfkill *rfkill, bool blocked); rfkill_set_block(gBtCtrl.bt_rfk, true); #endif return 0; }
static inline int h4_check_data_len(struct h4_struct *h4, int len) { register int room = skb_tailroom(h4->rx_skb); BT_DBG("len %d room %d", len, room); if (!len) { hci_recv_frame(h4->rx_skb); } else if (len > room) { BT_ERR("Data length is too large"); kfree_skb(h4->rx_skb); } else { h4->rx_state = H4_W4_DATA; h4->rx_count = len; return len; } #ifdef CONFIG_BT_HCIBCM4325 bcm4325_sleep(1); #endif h4->rx_state = H4_W4_PACKET_TYPE; h4->rx_skb = NULL; h4->rx_count = 0; return 0; }
int hci_uart_tx_wakeup(struct hci_uart *hu) { struct tty_struct *tty = hu->tty; struct hci_dev *hdev = hu->hdev; struct sk_buff *skb; if (test_and_set_bit(HCI_UART_SENDING, &hu->tx_state)) { set_bit(HCI_UART_TX_WAKEUP, &hu->tx_state); return 0; } BT_DBG(""); restart: clear_bit(HCI_UART_TX_WAKEUP, &hu->tx_state); /*added by Barry,for broadcom 4325*/ #ifdef CONFIG_BT_HCIBCM4325 bcm4325_sleep(0); #endif while ((skb = hci_uart_dequeue(hu))) { int len; set_bit(TTY_DO_WRITE_WAKEUP, &tty->flags); len = tty->ops->write(tty, skb->data, skb->len); hdev->stat.byte_tx += len; skb_pull(skb, len); if (skb->len) { hu->tx_skb = skb; break; } hci_uart_tx_complete(hu, bt_cb(skb)->pkt_type); kfree_skb(skb); } if (test_bit(HCI_UART_TX_WAKEUP, &hu->tx_state)) goto restart; clear_bit(HCI_UART_SENDING, &hu->tx_state); return 0; }
static int bcm4329_set_block(void *data, bool blocked) { DBG("set blocked :%d\n", blocked); IOMUX_BT_GPIO_POWER(); IOMUX_BT_GPIO_RESET(); if (false == blocked) { gpio_set_value(BT_GPIO_POWER, GPIO_HIGH); /* bt power on */ mdelay(20); gpio_set_value(BT_GPIO_RESET, GPIO_LOW); mdelay(20); gpio_set_value(BT_GPIO_RESET, GPIO_HIGH); /* bt reset deactive*/ mdelay(20); bcm4325_sleep(0); // ensure bt is wakeup pr_info("bt turn on power\n"); } else { #if WIFI_BT_POWER_TOGGLE if (!rk29sdk_wifi_power_state) { #endif gpio_set_value(BT_GPIO_POWER, GPIO_LOW); /* bt power off */ mdelay(20); pr_info("bt shut off power\n"); #if WIFI_BT_POWER_TOGGLE }else { pr_info("bt shouldn't shut off power, wifi is using it!\n"); } #endif gpio_set_value(BT_GPIO_RESET, GPIO_LOW); /* bt reset active*/ mdelay(20); } #if WIFI_BT_POWER_TOGGLE rk29sdk_bt_power_state = !blocked; #endif return 0; }
static int bcm4329_rfkill_suspend(struct platform_device *pdev, pm_message_t state) { DBG("%s\n",__FUNCTION__); #ifdef CONFIG_BT_AUTOSLEEP bcm4325_sleep(1); #endif DBG("Disable UART_RTS\n"); //To prevent uart to receive bt data when suspended IOMUX_UART_RTS_GPIO(); gpio_request(UART_RTS, "uart_rts"); gpio_set_value(UART_RTS, GPIO_HIGH); #ifdef CONFIG_RFKILL_RESET extern void rfkill_set_block(struct rfkill *rfkill, bool blocked); rfkill_set_block(gBtCtrl.bt_rfk, true); #endif return 0; }