示例#1
0
static int bcm4329_rfkill_suspend(struct platform_device *pdev, pm_message_t state)
{
#ifdef CONFIG_BT_AUTOSLEEP
    bcm4325_sleep(1);
#endif
    return 0;
}
示例#2
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;
}
示例#3
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;
}
示例#4
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;
}
示例#5
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;
}