From 1234701636ab3dca340a336aa9ddfadd64914e58 Mon Sep 17 00:00:00 2001 From: popcornmix 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