summaryrefslogtreecommitdiff
path: root/drivers/bluetooth/bluesleep.c
diff options
context:
space:
mode:
authorRakesh Goyal <rgoyal@nvidia.com>2011-08-23 20:41:34 +0530
committerDan Willemsen <dwillemsen@nvidia.com>2011-11-30 21:52:23 -0800
commit62af2e0fb9df56f4d845cf9cb63b6fdc8b27ffe8 (patch)
tree115477b01b2394556ddc82db4cb5ab0a589350aa /drivers/bluetooth/bluesleep.c
parenta5cbc1e24e2f359667735403f24a218bcf15809b (diff)
bluetooth: bluesleep: add suspend and resume
suspend and resume function() to avoid uart api call when uart driver is not resumed. bug 863564 Original-Change-Id: I036260f244b2067200050fd5252d91ec23518b86 Reviewed-on: http://git-master/r/48716 Reviewed-by: Rakesh Goyal <rgoyal@nvidia.com> Tested-by: Rakesh Goyal <rgoyal@nvidia.com> Reviewed-by: Bharat Nihalani <bnihalani@nvidia.com> Tested-by: Bharat Nihalani <bnihalani@nvidia.com> Rebase-Id: Rbc220cc73cd014ff114be3bda7ce5461a29a31f7
Diffstat (limited to 'drivers/bluetooth/bluesleep.c')
-rw-r--r--drivers/bluetooth/bluesleep.c29
1 files changed, 29 insertions, 0 deletions
diff --git a/drivers/bluetooth/bluesleep.c b/drivers/bluetooth/bluesleep.c
index 027730972732..e14009f26cc6 100644
--- a/drivers/bluetooth/bluesleep.c
+++ b/drivers/bluetooth/bluesleep.c
@@ -97,6 +97,7 @@ DECLARE_DELAYED_WORK(sleep_workqueue, bluesleep_sleep_work);
#define BT_TXDATA 0x02
#define BT_ASLEEP 0x04
#define BT_EXT_WAKE 0x08
+#define BT_SUSPEND 0x10
/* global pointer to a single hci device. */
static struct hci_dev *bluesleep_hdev;
@@ -142,6 +143,8 @@ struct proc_dir_entry *bluetooth_dir, *sleep_dir;
*/
static void hsuart_power(int on)
{
+ if (test_bit(BT_SUSPEND, &flags))
+ return;
if (on) {
tegra_uart_request_clock_on(bsi->uport);
tegra_uart_set_mctrl(bsi->uport, TIOCM_RTS);
@@ -661,6 +664,7 @@ static int bluesleep_probe(struct platform_device *pdev)
bsi->irq_polarity = POLARITY_HIGH;/*anything else*/
wake_lock_init(&bsi->wake_lock, WAKE_LOCK_SUSPEND, "bluesleep");
+ clear_bit(BT_SUSPEND, &flags);
return 0;
@@ -682,9 +686,34 @@ static int bluesleep_remove(struct platform_device *pdev)
return 0;
}
+
+static int bluesleep_resume(struct platform_device *pdev)
+{
+ if (test_bit(BT_SUSPEND, &flags)) {
+ BT_DBG("bluesleep resuming...\n");
+ if ((bsi->uport != NULL) &&
+ (gpio_get_value(bsi->host_wake) == bsi->irq_polarity)) {
+ BT_DBG("bluesleep resume form BT event...\n");
+ tegra_uart_request_clock_on(bsi->uport);
+ tegra_uart_set_mctrl(bsi->uport, TIOCM_RTS);
+ }
+ clear_bit(BT_SUSPEND, &flags);
+ }
+ return 0;
+}
+
+static int bluesleep_suspend(struct platform_device *pdev, pm_message_t state)
+{
+ BT_DBG("bluesleep suspending...\n");
+ set_bit(BT_SUSPEND, &flags);
+ return 0;
+}
+
static struct platform_driver bluesleep_driver = {
.probe = bluesleep_probe,
.remove = bluesleep_remove,
+ .suspend = bluesleep_suspend,
+ .resume = bluesleep_resume,
.driver = {
.name = "bluesleep",
.owner = THIS_MODULE,