[PATCH] Explicitly disable BT radio using rfkill interface on suspend

From: Mario Limonciello
Date: Mon May 18 2009 - 16:12:46 EST


Dell BT devices need to be removed from the bus and reinserted
so that userspace udev rules can transition the devices into the
proper mode after S3 or S4.

---
drivers/platform/x86/dell-laptop.c | 19 +++++++++++++++++++
1 files changed, 19 insertions(+), 0 deletions(-)


Attaching patch so Exchange doesn't mangle it.
--
Mario Limonciello
*Dell | Linux Engineering*
mario_limonciello@xxxxxxxx
From ab8b8ad20dede82f9d13293e94e76b4dd360fcf4 Mon Sep 17 00:00:00 2001
From: Mario Limonciello <Mario_Limonciello@xxxxxxxx>
Date: Mon, 18 May 2009 21:07:59 +0100
Subject: [PATCH] Explicitly disable BT radio using rfkill interface on suspend.
Dell BT devices need to be removed from the bus and reinserted
so that userspace udev rules can transition the devices into the
proper mode after S3 or S4.

---
drivers/platform/x86/dell-laptop.c | 19 +++++++++++++++++++
1 files changed, 19 insertions(+), 0 deletions(-)

diff --git a/drivers/platform/x86/dell-laptop.c b/drivers/platform/x86/dell-laptop.c
index af9f430..90a3d7c 100644
--- a/drivers/platform/x86/dell-laptop.c
+++ b/drivers/platform/x86/dell-laptop.c
@@ -186,6 +186,24 @@ static int dell_rfkill_set(int radio, enum rfkill_state state)
return 0;
}

+static int dell_rfkill_suspend(struct device *dev, pm_message_t state)
+{
+ struct rfkill *rfkill = to_rfkill(dev);
+
+ /* store state for the resume handler */
+ rfkill->state_for_resume = rfkill->state;
+
+ /* kill radio explicitly if it's on. it needs proper
+ * reinitialization post suspend */
+ rfkill->toggle_radio(NULL,RFKILL_STATE_SOFT_BLOCKED);
+
+ /* mark class device as suspended */
+ if (dev->power.power_state.event != state.event)
+ dev->power.power_state = state;
+
+ return 0;
+}
+
static int dell_wifi_set(void *data, enum rfkill_state state)
{
return dell_rfkill_set(1, state);
@@ -266,6 +284,7 @@ static int dell_setup_rfkill(void)
bluetooth_rfkill->name = "dell-bluetooth";
bluetooth_rfkill->toggle_radio = dell_bluetooth_set;
bluetooth_rfkill->get_state = dell_bluetooth_get;
+ bluetooth_rfkill->dev.class->suspend = dell_rfkill_suspend;
ret = rfkill_register(bluetooth_rfkill);
if (ret)
goto err_bluetooth;
--
1.5.4.3

Attachment: signature.asc
Description: OpenPGP digital signature