12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- From 5b622cb2d6ff44b1fb0750beee61f93f2c00548a Mon Sep 17 00:00:00 2001
- From: Sascha Hauer <[email protected]>
- 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 <[email protected]>
- ---
- 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
- @@ -416,13 +416,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);
-
- @@ -448,7 +451,7 @@ int thermal_zone_get_temp(struct thermal
- }
-
- mutex_unlock(&tz->lock);
- -exit:
- +
- return ret;
- }
- EXPORT_SYMBOL_GPL(thermal_zone_get_temp);
- @@ -460,10 +463,11 @@ void thermal_zone_device_update(struct t
- if (atomic_read(&in_suspend))
- return;
-
- - 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,
- @@ -803,10 +807,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);
- }
|