You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
125 lines
4.5 KiB
125 lines
4.5 KiB
11 years ago
|
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)
|
||
|
{
|