summaryrefslogtreecommitdiffstats
path: root/recipes/linux/linux-openmoko-2.6.34/0020-GTA02-bt-remember-state-of-bluetooth-in-variable.patch
blob: b8cb2fa276bdf36179cc6fad26b6851ced99ea9e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
From 67a15139d71019e8f2ad8a566f72f28cf52f7a1f Mon Sep 17 00:00:00 2001
From: Radek Polak <psonek2@seznam.cz>
Date: Tue, 21 Sep 2010 20:03:14 +0200
Subject: [PATCH 20/20] GTA02 bt - remember state of bluetooth in variable

Reading bt status before suspend for some reason does not work. It
always resumes with bluetooth turned off.

This patch remembers if bluetooth is switched on/off in variable
and after resume bluetooth ends up in the same state as was before
suspend.
---
 arch/arm/mach-s3c2440/gta02-pm-bt.c |   18 +++++++++++-------
 1 files changed, 11 insertions(+), 7 deletions(-)

diff --git a/arch/arm/mach-s3c2440/gta02-pm-bt.c b/arch/arm/mach-s3c2440/gta02-pm-bt.c
index 5cf35d8..1101411 100644
--- a/arch/arm/mach-s3c2440/gta02-pm-bt.c
+++ b/arch/arm/mach-s3c2440/gta02-pm-bt.c
@@ -56,7 +56,8 @@ static ssize_t bt_read(struct device *dev, struct device_attribute *attr,
 	}
 }
 
-static void __gta02_pm_bt_toggle_radio(struct device *dev, unsigned int on)
+static void __gta02_pm_bt_toggle_radio(struct device *dev, unsigned int on,
+									   bool remember_state)
 {
 	struct gta02_pm_bt_data *bt_data = dev_get_drvdata(dev);
 
@@ -75,6 +76,9 @@ static void __gta02_pm_bt_toggle_radio(struct device *dev, unsigned int on)
 	}
 
 	s3c2410_gpio_setpin(GTA02_GPIO_BT_EN, on);
+
+	if (remember_state)
+		bt_data->pre_resume_state = on;
 }
 
 
@@ -82,7 +86,7 @@ static int bt_rfkill_set_block(void *data, bool blocked)
 {
 	struct device *dev = data;
 
-	__gta02_pm_bt_toggle_radio(dev, !blocked);
+	__gta02_pm_bt_toggle_radio(dev, !blocked, true);
 
 	return 0;
 }
@@ -101,7 +105,7 @@ static ssize_t bt_write(struct device *dev, struct device_attribute *attr,
 	if (!strcmp(attr->attr.name, "power_on")) {
 		rfkill_set_sw_state(bt_data->rfkill, on ? 1 : 0);
 
-		__gta02_pm_bt_toggle_radio(dev, on);
+		__gta02_pm_bt_toggle_radio(dev, on, true);
 	} else if (!strcmp(attr->attr.name, "reset")) {
 		/* reset is low-active, so we need to invert */
 		s3c2410_gpio_setpin(GTA02_GPIO_BT_EN, on ? 0 : 1);
@@ -116,12 +120,12 @@ static DEVICE_ATTR(reset, 0644, bt_read, bt_write);
 #ifdef CONFIG_PM
 static int gta02_bt_suspend(struct platform_device *pdev, pm_message_t state)
 {
-	struct gta02_pm_bt_data *bt_data = dev_get_drvdata(&pdev->dev);
+/*	struct gta02_pm_bt_data *bt_data = dev_get_drvdata(&pdev->dev); */
 
 	dev_dbg(&pdev->dev, DRVMSG ": suspending\n");
 
-	bt_data->pre_resume_state = s3c2410_gpio_getpin(GTA02_GPIO_BT_EN);
-	__gta02_pm_bt_toggle_radio(&pdev->dev, 0);
+	/* bt_data->pre_resume_state = s3c2410_gpio_getpin(GTA02_GPIO_BT_EN); */
+	__gta02_pm_bt_toggle_radio(&pdev->dev, 0, false);
 
 	return 0;
 }
@@ -131,7 +135,7 @@ static int gta02_bt_resume(struct platform_device *pdev)
 	struct gta02_pm_bt_data *bt_data = dev_get_drvdata(&pdev->dev);
 	dev_dbg(&pdev->dev, DRVMSG ": resuming\n");
 
-	__gta02_pm_bt_toggle_radio(&pdev->dev, bt_data->pre_resume_state);
+	__gta02_pm_bt_toggle_radio(&pdev->dev, bt_data->pre_resume_state, false);
 	return 0;
 }
 #else
-- 
1.7.3