示例#1
0
/**
 * @brief@  main sleep work handling function which update the flags
 * and activate and deactivate UART ,check FIFO.
 */
static void bluesleep_sleep_work(struct work_struct *work)
{
	if (bluesleep_can_sleep()) {
		/* already asleep, this is an error case */
		if (test_bit(BT_ASLEEP, &flags)) {
			BT_INFO("already asleep");
			return;
		}

		if (msm_hs_tx_empty(bsi->uport)) {
			BT_INFO("going to sleep...");
			set_bit(BT_ASLEEP, &flags);
			/*Deactivating UART */
			hsuart_power(0);
			/* UART clk is not turned off immediately. Release
			 * wakelock after 500 ms.
			 */
#ifdef USE_WAKELOCK
			wake_lock_timeout(&bsi->wake_lock, HZ / 2);
#endif
		} else {
			mod_timer(&tx_timer, jiffies + (TX_TIMER_INTERVAL * HZ));
			return;
		}
	} else {
		bluesleep_sleep_wakeup();
	}
}
示例#2
0
/**
 * Handles proper timer action when outgoing data is delivered to the
 * HCI line discipline. Sets BT_TXDATA.
 */
static void bluesleep_outgoing_data(void)
{
	unsigned long irq_flags;

	spin_lock_irqsave(&rw_lock, irq_flags);

	/* log data passing by */
	set_bit(BT_TXDATA, &flags);
#if 0
	/* if the tx side is sleeping... */
	if (gpio_get_value(bsi->ext_wake)) {
		BT_DBG("tx was sleeping");
		bluesleep_sleep_wakeup();
	}
#else
	bluesleep_sleep_wakeup();
#endif
	spin_unlock_irqrestore(&rw_lock, irq_flags);
}
示例#3
0
/**
 * @brief@  main sleep work handling function which update the flags
 * and activate and deactivate UART ,check FIFO.
 */
static void bluesleep_sleep_work(struct work_struct *work)
{
	if (mutex_is_locked(&bluesleep_mutex))
		BT_DBG("Wait for mutex unlock in bluesleep_sleep_work");

	mutex_lock(&bluesleep_mutex);

	if (bluesleep_can_sleep()) {
		/* already asleep, this is an error case */
		if (test_bit(BT_ASLEEP, &flags)) {
			BT_DBG("already asleep");
			mutex_unlock(&bluesleep_mutex);
			return;
		}

		if (msm_hs_tx_empty(bsi->uport)) {
			if (test_bit(BT_TXDATA, &flags)) {
				BT_DBG("TXDATA remained. Wait until timer expires.");

				mod_timer(&tx_timer, jiffies + TX_TIMER_INTERVAL * HZ);
				mutex_unlock(&bluesleep_mutex);
				return;
			}

			BT_DBG("going to sleep...");

			set_bit(BT_ASLEEP, &flags);
			/*Deactivating UART */
			hsuart_power(0);

			/*Deactivating UART */
			/* UART clk is not turned off immediately. Release
			* wakelock after 500 ms.
			*/
			wake_lock_timeout(&bsi->wake_lock, HZ / 2);
			} else {
			BT_DBG("host can enter sleep but some tx remained.");

			mod_timer(&tx_timer, jiffies + TX_TIMER_INTERVAL * HZ);
			mutex_unlock(&bluesleep_mutex);
			return;
		}
	} else if (!test_bit(BT_EXT_WAKE, &flags)
			&& !test_bit(BT_ASLEEP, &flags)) {
		BT_DBG("host_wake high and BT_EXT_WAKE & BT_ASLEEP is freed.");
		mod_timer(&tx_timer, jiffies + (TX_TIMER_INTERVAL * HZ));
		if (bsi->has_ext_wake == 1) {
			gpio_set_value(bsi->ext_wake, 1);
		}
		set_bit(BT_EXT_WAKE, &flags);
	} else {
		bluesleep_sleep_wakeup();
	}
	mutex_unlock(&bluesleep_mutex);
}
/**
 * @brief@	main sleep work	handling function which	update the flags
 * and activate	and	deactivate UART	,check FIFO.
 */
static void	bluesleep_sleep_work(struct	work_struct	*work)
{
	if (bluesleep_can_sleep()) {
	    pr_info("bluesleep_can_sleep\n");
		if (test_bit(BT_ASLEEP,	&g_bs_data->flags)) {
			pr_info("already asleep");
			return;
		}
		pr_info("bt going to sleep...\n");
		set_bit(BT_ASLEEP, &g_bs_data->flags);
		wake_lock_timeout(&g_bs_data->wake_lock, HZ/2);
	} else {
	    pr_info("bluesleep_sleep_wakeup\n");
		bluesleep_sleep_wakeup();
	}
}
/**
 * Handles proper timer action when outgoing data is delivered to the
 * HCI line discipline. Sets BT_TXDATA.
 */
static void bluesleep_outgoing_data(void)
{
	unsigned long irq_flags;

	spin_lock_irqsave(&rw_lock, irq_flags);

	/* log data passing by */
	set_bit(BT_TXDATA, &flags);

	spin_unlock_irqrestore(&rw_lock, irq_flags);

	/* if the tx side is sleeping... */
	if (test_bit(BT_EXT_WAKE, &flags)) {
		if (debug_mask & DEBUG_SUSPEND)
			pr_info("tx was sleeping\n");
		bluesleep_sleep_wakeup();
	}
}
/**
 * Handles proper timer	action when	outgoing data is delivered to the
 * HCI line	discipline.	Sets BT_TXDATA.
 */
static void	bluesleep_outgoing_data(struct bluetooth_sleep_data *bs_data)
{
	unsigned long irq_flags;

	spin_lock_irqsave(&bs_data->rw_lock, irq_flags);
	/* log data	passing	by */
	set_bit(BT_TXDATA, &bs_data->flags);

	pr_info("bluesleep_outgoing_data\n");

	/* if the tx side is sleeping... */
	if (LPM_BT_WAKE_DEASSERT == gpio_get_value(bs_data->gpio_host_wake_bt.gpio)) {

		pr_info("tx was sleeping\n");
		bluesleep_sleep_wakeup();
	}

	spin_unlock_irqrestore(&bs_data->rw_lock, irq_flags);
}
/**
 * @brief@  main sleep work handling function which update the flags
 * and activate and deactivate UART ,check FIFO.
 */
static void bluesleep_sleep_work(struct work_struct *work)
{
	if (bluesleep_can_sleep()) {
		/* already asleep, this is an error case */
		if (test_bit(BT_ASLEEP, &flags)) {
			if (debug_mask & DEBUG_SUSPEND)
				pr_info("already asleep\n");
			return;
		}

		if (msm_hs_tx_empty(bsi->uport)) {
			if (debug_mask & DEBUG_SUSPEND)
				pr_info("going to sleep...\n");

			set_bit(BT_ASLEEP, &flags);

			/*Deactivating UART */
			hsuart_power(0);

			/* UART clk is not turned off immediately. Release
			 * wakelock after 125 ms.
			 */
			wake_lock_timeout(&bsi->wake_lock, HZ / 8);
		} else {
			mod_timer(&tx_timer, jiffies + (TX_TIMER_INTERVAL * HZ));
			return;
		}
	} else if (test_bit(BT_EXT_WAKE, &flags)
		   && !test_bit(BT_ASLEEP, &flags)) {
		mod_timer(&tx_timer, jiffies + (TX_TIMER_INTERVAL * HZ));

		if (debug_mask & DEBUG_BTWAKE)
			pr_info("BT WAKE: set to wake\n");

		if (bsi->has_ext_wake == 1)
			gpio_set_value(bsi->ext_wake, 0);

		clear_bit(BT_EXT_WAKE, &flags);
	} else {
		bluesleep_sleep_wakeup();
	}
}
示例#8
0
/**
 * @brief@  main sleep work handling function which update the flags
 * and activate and deactivate UART ,check FIFO.
 */
static void bluesleep_sleep_work(struct work_struct *work)
{
#if 0 //For debug : defined(CONFIG_SEC_MIF_UART_SWITCH)
	int uart_sel = 0;
#endif
	if (mutex_is_locked(&bluesleep_mutex))
		BT_DBG("Wait for mutex unlock in bluesleep_sleep_work");

	if (bsi->uport == NULL) {
		BT_DBG("bluesleep_sleep_work - uport is null");
		return;
	}

	if (bsi->uport->state == NULL) {
		BT_DBG("bluesleep_sleep_work - bsi->uport->state is null");
		return;
	}

	if (bsi->uport->state->port.tty == NULL) {
		BT_DBG("bluesleep_sleep_work - bsi->uport->state->port.tty is null");
		return;
	}

	mutex_lock(&bluesleep_mutex);

	if (bluesleep_can_sleep()) {
		/* already asleep, this is an error case */
		if (test_bit(BT_ASLEEP, &flags)) {
			BT_DBG("already asleep");
			mutex_unlock(&bluesleep_mutex);
			return;
		}

		if (msm_hs_tx_empty(bsi->uport)) {
			if (test_bit(BT_TXDATA, &flags)) {
				BT_DBG("TXDATA remained. Wait until timer expires.");

				mod_timer(&tx_timer, jiffies + TX_TIMER_INTERVAL * HZ);
				mutex_unlock(&bluesleep_mutex);
				return;
			}

#if 0 //For debug : defined(CONFIG_SEC_MIF_UART_SWITCH)
			if(system_rev <= 6 /*board rev 06*/) {
				uart_sel = gpio_get_value(GPIO_UART_SEL);
			}
			else{
				uart_sel = gpio_get_value(GPIO_UART_SEL_REV07);
			}

			if (uart_sel ==1) {
				BT_DBG("bluesleep_sleep_work GPIO_UART_SEL (%d)", uart_sel);
				return;
			}
#endif
			BT_DBG("going to sleep...");

			set_bit(BT_ASLEEP, &flags);
			/*Deactivating UART */
			hsuart_power(0);

			/* Moved from Timer expired */
			if (bsi->has_ext_wake == 1)
				gpio_set_value(bsi->ext_wake, 0);
			clear_bit(BT_EXT_WAKE, &flags);

			/*Deactivating UART */
			/* UART clk is not turned off immediately. Release
			* wakelock after 500 ms.
			*/
			wake_lock_timeout(&bsi->wake_lock, HZ / 2);
			} else {
			BT_DBG("host can enter sleep but some tx remained.");

			mod_timer(&tx_timer, jiffies + TX_TIMER_INTERVAL * HZ);
			mutex_unlock(&bluesleep_mutex);
			return;
		}
	} else if (!test_bit(BT_EXT_WAKE, &flags)
			&& !test_bit(BT_ASLEEP, &flags)) {
		BT_DBG("host_wake high and BT_EXT_WAKE & BT_ASLEEP already freed.");
		mod_timer(&tx_timer, jiffies + (TX_TIMER_INTERVAL * HZ));
		if (bsi->has_ext_wake == 1) {
			gpio_set_value(bsi->ext_wake, 1);
		}
		set_bit(BT_EXT_WAKE, &flags);
	} else {
		bluesleep_sleep_wakeup();
	}
	mutex_unlock(&bluesleep_mutex);
}