mirror of
				git://git.openwrt.org/openwrt/openwrt.git
				synced 2025-11-04 06:54:27 -05:00 
			
		
		
		
	- two upstreamed patches removed - compile tested all targets using 4.1 - run tested ar71xx Signed-off-by: Roman Yeryomin <roman@advem.lv> Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de> SVN-Revision: 47694
		
			
				
	
	
		
			86 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			86 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
From 5b622cb2d6ff44b1fb0750beee61f93f2c00548a Mon Sep 17 00:00:00 2001
 | 
						|
From: Sascha Hauer <s.hauer@pengutronix.de>
 | 
						|
Date: Wed, 13 May 2015 10:52:36 +0200
 | 
						|
Subject: [PATCH 17/76] thermal: Allow sensor ops to fail with -ENOSYS
 | 
						|
 | 
						|
The thermal core uses the existence of the .get_temp, .get_trend and
 | 
						|
.set_emul_temp to detect whether this operation exists and should be
 | 
						|
used or whether it should be emulated in software. This makes problems
 | 
						|
for of-thermal which has to modify the struct thermal_zone_device_ops
 | 
						|
during runtime whenever a sensor is registered or unregistered.
 | 
						|
 | 
						|
Let the core test for -ENOSYS from these callbacks and treat it like
 | 
						|
if the callbacks were not present.
 | 
						|
 | 
						|
This allows of-thermal to always set the sensor related callbacks and
 | 
						|
to make struct thermal_zone_device_ops const again.
 | 
						|
 | 
						|
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
 | 
						|
---
 | 
						|
 drivers/thermal/thermal_core.c |   24 +++++++++++++++++-------
 | 
						|
 1 file changed, 17 insertions(+), 7 deletions(-)
 | 
						|
 | 
						|
--- a/drivers/thermal/thermal_core.c
 | 
						|
+++ b/drivers/thermal/thermal_core.c
 | 
						|
@@ -413,13 +413,16 @@ static void handle_thermal_trip(struct t
 | 
						|
  */
 | 
						|
 int thermal_zone_get_temp(struct thermal_zone_device *tz, int *temp)
 | 
						|
 {
 | 
						|
-	int ret = -EINVAL;
 | 
						|
+	int ret;
 | 
						|
 	int count;
 | 
						|
 	int crit_temp = INT_MAX;
 | 
						|
 	enum thermal_trip_type type;
 | 
						|
 
 | 
						|
-	if (!tz || IS_ERR(tz) || !tz->ops->get_temp)
 | 
						|
-		goto exit;
 | 
						|
+	if (!tz || IS_ERR(tz))
 | 
						|
+		return -EINVAL;
 | 
						|
+
 | 
						|
+	if (!tz->ops->get_temp)
 | 
						|
+		return -ENOSYS;
 | 
						|
 
 | 
						|
 	mutex_lock(&tz->lock);
 | 
						|
 
 | 
						|
@@ -445,7 +448,7 @@ int thermal_zone_get_temp(struct thermal
 | 
						|
 	}
 | 
						|
  
 | 
						|
 	mutex_unlock(&tz->lock);
 | 
						|
-exit:
 | 
						|
+
 | 
						|
 	return ret;
 | 
						|
 }
 | 
						|
 EXPORT_SYMBOL_GPL(thermal_zone_get_temp);
 | 
						|
@@ -454,10 +457,11 @@ void thermal_zone_device_update(struct t
 | 
						|
 {
 | 
						|
 	int temp, ret, count;
 | 
						|
 
 | 
						|
-	if (!tz->ops->get_temp)
 | 
						|
+	ret = thermal_zone_get_temp(tz, &temp);
 | 
						|
+
 | 
						|
+	if (ret == -ENOSYS)
 | 
						|
 		return;
 | 
						|
 
 | 
						|
-	ret = thermal_zone_get_temp(tz, &temp);
 | 
						|
 	if (ret) {
 | 
						|
 		if (ret != -EAGAIN)
 | 
						|
 			dev_warn(&tz->device,
 | 
						|
@@ -783,10 +787,16 @@ emul_temp_store(struct device *dev, stru
 | 
						|
 	if (kstrtoul(buf, 10, &temperature))
 | 
						|
 		return -EINVAL;
 | 
						|
 
 | 
						|
-	if (!tz->ops->set_emul_temp) {
 | 
						|
+	if (tz->ops->set_emul_temp)
 | 
						|
+		ret = tz->ops->set_emul_temp(tz, temperature);
 | 
						|
+	else
 | 
						|
+		ret = -ENOSYS;
 | 
						|
+
 | 
						|
+	if (ret == -ENOSYS) {
 | 
						|
 		mutex_lock(&tz->lock);
 | 
						|
 		tz->emul_temperature = temperature;
 | 
						|
 		mutex_unlock(&tz->lock);
 | 
						|
+		ret = 0;
 | 
						|
 	} else {
 | 
						|
 		ret = tz->ops->set_emul_temp(tz, temperature);
 | 
						|
 	}
 |