diff options
author | Rakesh Goyal <rgoyal@nvidia.com> | 2011-08-23 20:41:34 +0530 |
---|---|---|
committer | Dan Willemsen <dwillemsen@nvidia.com> | 2011-11-30 21:52:23 -0800 |
commit | 62af2e0fb9df56f4d845cf9cb63b6fdc8b27ffe8 (patch) | |
tree | 115477b01b2394556ddc82db4cb5ab0a589350aa /drivers/bluetooth/bluesleep.c | |
parent | a5cbc1e24e2f359667735403f24a218bcf15809b (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.c | 29 |
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, |