mediatek: add support for the new MT7623 Arm SoC
[openwrt/svn-archive/archive.git] / target / linux / mediatek / patches / 0017-thermal-Allow-sensor-ops-to-fail-with-ENOSYS.patch
diff --git a/target/linux/mediatek/patches/0017-thermal-Allow-sensor-ops-to-fail-with-ENOSYS.patch b/target/linux/mediatek/patches/0017-thermal-Allow-sensor-ops-to-fail-with-ENOSYS.patch
new file mode 100644 (file)
index 0000000..f533a88
--- /dev/null
@@ -0,0 +1,90 @@
+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(-)
+
+diff --git a/drivers/thermal/thermal_core.c b/drivers/thermal/thermal_core.c
+index 19da022..3d8f9f9 100644
+--- a/drivers/thermal/thermal_core.c
++++ b/drivers/thermal/thermal_core.c
+@@ -413,13 +413,16 @@ static void handle_thermal_trip(struct thermal_zone_device *tz, int trip)
+  */
+ 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_zone_device *tz, int *temp)
+       }
+  
+       mutex_unlock(&tz->lock);
+-exit:
++
+       return ret;
+ }
+ EXPORT_SYMBOL_GPL(thermal_zone_get_temp);
+@@ -454,10 +457,11 @@ void thermal_zone_device_update(struct thermal_zone_device *tz)
+ {
+       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, struct device_attribute *attr,
+       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);
+       }
+-- 
+1.7.10.4
+