Example #1
0
/* Initialize protocol */
static int ath_open(struct hci_uart *hu)
{
	struct ath_struct *ath;

	BT_DBG("hu %p, bsi %p", hu, bsi);

	if (!bsi)
		return -EIO;

	ath = kzalloc(sizeof(*ath), GFP_ATOMIC);
	if (!ath)
		return -ENOMEM;

	skb_queue_head_init(&ath->txq);

	hu->priv = ath;
	ath->hu = hu;

	if (ath_bluesleep_gpio_config(ath, 1) < 0) {
		BT_ERR("HCIATH3K GPIO Config failed");
		hu->priv = NULL;
		kfree(ath);
		return -EIO;
	}

	ath->cur_sleep = enableuartsleep;
	if (ath->cur_sleep == 1) {
		set_bit(BT_SLEEPENABLE, &flags);
		modify_timer_task();
	}
	INIT_WORK(&ath->ctxtsw, ath_hci_uart_work);
	INIT_WORK(&ath->ws_sleep, wakeup_host_work);
	return 0;
}
static int ath_lpm_stop(void)
{
    BT_DBG("Stop LPM mode");
    cancel_work_sync(&ws_sleep);

    if (bsi) {
        bsi->uport = NULL;
        ath_bluesleep_gpio_config(0);
    }

    return 0;
}
/* Initialize protocol */
static int ath_open(struct hci_uart *hu)
{
    struct ath_struct *ath;
    struct uart_state *state;

    BT_DBG("hu %p, bsi %p", hu, bsi);

    if (!bsi) {
        BT_ERR("HCIATH3K bluesleep info does not exist");
        return -EIO;
    }

    ath = kzalloc(sizeof(*ath), GFP_ATOMIC);
    if (!ath) {
        BT_ERR("HCIATH3K Memory not enough to init driver");
        return -ENOMEM;
    }

    skb_queue_head_init(&ath->txq);

    hu->priv = ath;
    ath->hu = hu;
    state = hu->tty->driver_data;

    if (!state) {
        BT_ERR("HCIATH3K tty driver data does not exist");
        return -ENXIO;
    }
    bsi->uport = state->uart_port;

    if (ath_bluesleep_gpio_config(1) < 0) {
        BT_ERR("HCIATH3K GPIO Config failed");
        hu->priv = NULL;
        kfree(ath);
        return -EIO;
    }

    ath->cur_sleep = enableuartsleep;
    if (ath->cur_sleep == 1) {
        set_bit(BT_SLEEPENABLE, &flags);
        modify_timer_task();
    }
    INIT_WORK(&ath->ctxtsw, ath_hci_uart_work);
    INIT_WORK(&ws_sleep, wakeup_host_work);
    return 0;
}
/* Close protocol */
static int ath_close(struct hci_uart *hu)
{
	struct ath_struct *ath = hu->priv;

	BT_DBG("hu %p", hu);

	skb_queue_purge(&ath->txq);

	cancel_work_sync(&ath->ctxtsw);

	hu->priv = NULL;
	kfree(ath);

	if (bsi)
		ath_bluesleep_gpio_config(0);

	return 0;
}
static int ath_lpm_start(void)
{
    BT_DBG("Start LPM mode");

    if (!bsi) {
        BT_ERR("HCIATH3K bluesleep info does not exist");
        return -EIO;
    }

    bsi->uport = msm_hs_get_uart_port(0);
    if (!bsi->uport) {
        BT_ERR("UART Port is not available");
        return -ENODEV;
    }

    INIT_WORK(&ws_sleep, wakeup_host_work);

    if (ath_bluesleep_gpio_config(1) < 0) {
        BT_ERR("HCIATH3K GPIO Config failed");
        return -EIO;
    }

    return 0;
}