aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/brcm2708/patches-3.10/0052-Add-retry-on-error-and-tidy-of-temperature-driver.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/brcm2708/patches-3.10/0052-Add-retry-on-error-and-tidy-of-temperature-driver.patch')
-rw-r--r--target/linux/brcm2708/patches-3.10/0052-Add-retry-on-error-and-tidy-of-temperature-driver.patch124
1 files changed, 124 insertions, 0 deletions
diff --git a/target/linux/brcm2708/patches-3.10/0052-Add-retry-on-error-and-tidy-of-temperature-driver.patch b/target/linux/brcm2708/patches-3.10/0052-Add-retry-on-error-and-tidy-of-temperature-driver.patch
new file mode 100644
index 0000000000..6789241fe6
--- /dev/null
+++ b/target/linux/brcm2708/patches-3.10/0052-Add-retry-on-error-and-tidy-of-temperature-driver.patch
@@ -0,0 +1,124 @@
+From 2e7a6ee154b800b1e749e99d20a29673eea70aa1 Mon Sep 17 00:00:00 2001
+From: popcornmix <popcornmix@gmail.com>
+Date: Sun, 24 Feb 2013 16:30:57 +0000
+Subject: [PATCH 052/174] Add retry on error and tidy of temperature driver
+
+---
+ drivers/thermal/bcm2835-thermal.c | 78 ++++++++++++++-------------------------
+ 1 file changed, 27 insertions(+), 51 deletions(-)
+
+--- 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 bcm28
+ 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)
+ {