aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/brcm2708/patches-3.10/0052-Add-retry-on-error-and-tidy-of-temperature-driver.patch
blob: 18d61012f7c9e56990ec46d29fd9059f463194f6 (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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
From 1234701636ab3dca340a336aa9ddfadd64914e58 Mon Sep 17 00:00:00 2001
From: popcornmix <popcornmix@gmail.com>
Date: Sun, 24 Feb 2013 16:30:57 +0000
Subject: [PATCH 052/196] Add retry on error and tidy of temperature driver

---
 drivers/thermal/bcm2835-thermal.c | 78 ++++++++++++++-------------------------
 1 file changed, 27 insertions(+), 51 deletions(-)

diff --git a/drivers/thermal/bcm2835-thermal.c b/drivers/thermal/bcm2835-thermal.c
index 3f9a733..85fceb5 100644
--- a/drivers/thermal/bcm2835-thermal.c
+++ b/drivers/thermal/bcm2835-thermal.c
@@ -33,7 +33,6 @@
 #define print_debug(fmt,...)
 #endif
 #define print_err(fmt,...) printk(KERN_ERR "%s:%s:%d: "fmt"\n", MODULE_NAME, __func__,__LINE__, ##__VA_ARGS__)
-#define print_info(fmt,...) printk(KERN_INFO "%s: "fmt"\n", MODULE_NAME, ##__VA_ARGS__)
 
 #define VC_TAG_GET_TEMP 0x00030006
 #define VC_TAG_GET_MAX_TEMP 0x0003000A
@@ -66,12 +65,6 @@ struct bcm2835_thermal_data {
 	struct vc_msg msg;
 };
 
-/* --- PROTOTYPES --- */
-static int bcm2835_get_temp(struct thermal_zone_device *thermal_dev, unsigned long *);
-static int bcm2835_get_max_temp(struct thermal_zone_device *thermal_dev, int, unsigned long *);
-static int bcm2835_get_trip_type(struct thermal_zone_device *thermal_dev, int trip_num, enum thermal_trip_type *trip_type);
-static int bcm2835_get_mode(struct thermal_zone_device *thermal_dev, enum thermal_device_mode *dev_mode);
-
 /* --- GLOBALS --- */
 static struct bcm2835_thermal_data bcm2835_data;
 
@@ -79,64 +72,47 @@ static struct bcm2835_thermal_data bcm2835_data;
 static struct thermal_zone_device_ops ops;
 
 /* --- FUNCTIONS --- */
-static int bcm2835_get_max_temp(struct thermal_zone_device *thermal_dev, int trip_num, unsigned long *temp)
-{
-	int result;
 
+static int bcm2835_get_temp_or_max(struct thermal_zone_device *thermal_dev, unsigned long *temp, unsigned tag_id)
+{
+	int result = -1, retry = 3;
 	print_debug("IN");
 
-	/* wipe all previous message data */
-	memset(&bcm2835_data.msg, 0, sizeof bcm2835_data.msg);
-
-	/* prepare message */
-	bcm2835_data.msg.msg_size = sizeof bcm2835_data.msg;
-	bcm2835_data.msg.tag.buffer_size = 8;
-	bcm2835_data.msg.tag.tag_id = VC_TAG_GET_MAX_TEMP;
-
-	/* send the message */
-	result = bcm_mailbox_property(&bcm2835_data.msg, sizeof bcm2835_data.msg);
+	*temp = 0;
+	while (result != 0 && retry-- > 0) {
+		/* wipe all previous message data */
+		memset(&bcm2835_data.msg, 0, sizeof bcm2835_data.msg);
+
+		/* prepare message */
+		bcm2835_data.msg.msg_size = sizeof bcm2835_data.msg;
+		bcm2835_data.msg.tag.buffer_size = 8;
+		bcm2835_data.msg.tag.tag_id = tag_id;
+
+		/* send the message */
+		result = bcm_mailbox_property(&bcm2835_data.msg, sizeof bcm2835_data.msg);
+		print_debug("Got %stemperature as %u (%d,%x)\n", tag_id==VC_TAG_GET_MAX_TEMP ? "max ":"", (uint)bcm2835_data.msg.tag.val, result, bcm2835_data.msg.request_code);
+		if (!(bcm2835_data.msg.request_code & 0x80000000))
+			result = -1;
+	}
 
 	/* check if it was all ok and return the rate in milli degrees C */
-	if (result == 0 && (bcm2835_data.msg.request_code & 0x80000000))
+	if (result == 0)
 		*temp = (uint)bcm2835_data.msg.tag.val;
-	#ifdef THERMAL_DEBUG_ENABLE
 	else
-		print_debug("Failed to get temperature!");
-	#endif
-	print_debug("Got temperature as %u",(uint)*temp);
+		print_err("Failed to get temperature! (%x:%d)\n", tag_id, result);
 	print_debug("OUT");
-	return 0;
+	return result;
 }
 
 static int bcm2835_get_temp(struct thermal_zone_device *thermal_dev, unsigned long *temp)
 {
-	int result;
-
-	print_debug("IN");
-
-	/* wipe all previous message data */
-	memset(&bcm2835_data.msg, 0, sizeof bcm2835_data.msg);
-
-	/* prepare message */
-	bcm2835_data.msg.msg_size = sizeof bcm2835_data.msg;
-	bcm2835_data.msg.tag.buffer_size = 8;
-	bcm2835_data.msg.tag.tag_id = VC_TAG_GET_TEMP;
-
-	/* send the message */
-	result = bcm_mailbox_property(&bcm2835_data.msg, sizeof bcm2835_data.msg);
-
-	/* check if it was all ok and return the rate in milli degrees C */
-	if (result == 0 && (bcm2835_data.msg.request_code & 0x80000000))
-		*temp = (uint)bcm2835_data.msg.tag.val;
-	#ifdef THERMAL_DEBUG_ENABLE
-	else
-		print_debug("Failed to get temperature!");
-	#endif
-	print_debug("Got temperature as %u",(uint)*temp);
-	print_debug("OUT");
-	return 0;
+	return bcm2835_get_temp_or_max(thermal_dev, temp, VC_TAG_GET_TEMP);
 }
 
+static int bcm2835_get_max_temp(struct thermal_zone_device *thermal_dev, int trip_num, unsigned long *temp)
+{
+	return bcm2835_get_temp_or_max(thermal_dev, temp, VC_TAG_GET_MAX_TEMP);
+}
 
 static int bcm2835_get_trip_type(struct thermal_zone_device * thermal_dev, int trip_num, enum thermal_trip_type *trip_type)
 {
-- 
1.9.1