diff mbox

[20/31] thermal: core: introduce thermal_helpers.c

Message ID 1462341765-13268-21-git-send-email-edubezval@gmail.com (mailing list archive)
State Changes Requested
Delegated to: Zhang Rui
Headers show

Commit Message

Eduardo Valentin May 4, 2016, 6:02 a.m. UTC
Here we have a simple code organization. This patch moves
functions that do not need to handle thermal core internal
data structure to thermal_helpers.c file.

Cc: Zhang Rui <rui.zhang@intel.com>
Cc: linux-pm@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
Signed-off-by: Eduardo Valentin <edubezval@gmail.com>
---
 drivers/thermal/Makefile          |   3 +-
 drivers/thermal/thermal_core.c    | 117 -------------------------------
 drivers/thermal/thermal_helpers.c | 143 ++++++++++++++++++++++++++++++++++++++
 3 files changed, 145 insertions(+), 118 deletions(-)
 create mode 100644 drivers/thermal/thermal_helpers.c

Comments

Zhang Rui May 17, 2016, 1:20 p.m. UTC | #1
$checkpatch.pl 20-31-thermal-core-introduce-thermal_helpers.c.patch 

WARNING: added, moved or deleted file(s), does MAINTAINERS need
updating?
#187: 
new file mode 100644

ERROR: trailing whitespace
#302: FILE: drivers/thermal/thermal_helpers.c:111:
+ $

WARNING: please, no spaces at the start of a line
#302: FILE: drivers/thermal/thermal_helpers.c:111:
+ $

total: 1 errors, 2 warnings, 287 lines checked

NOTE: Whitespace errors detected.
      You may wish to use scripts/cleanpatch or scripts/cleanfile

20-31-thermal-core-introduce-thermal_helpers.c.patch has style problems,
please review.

NOTE: If any of the errors are false positives, please report
      them to the maintainer, see CHECKPATCH in MAINTAINERS.

Please remove these spaces.
BTW, there are also some warnings in the other patches, please fix the
checkpatch warnings/errors.

thanks,
rui
On Tue, 2016-05-03 at 23:02 -0700, Eduardo Valentin wrote:
> Here we have a simple code organization. This patch moves

> functions that do not need to handle thermal core internal

> data structure to thermal_helpers.c file.

> 

> Cc: Zhang Rui <rui.zhang@intel.com>

> Cc: linux-pm@vger.kernel.org

> Cc: linux-kernel@vger.kernel.org

> Signed-off-by: Eduardo Valentin <edubezval@gmail.com>

> ---

>  drivers/thermal/Makefile          |   3 +-

>  drivers/thermal/thermal_core.c    | 117 -------------------------------

>  drivers/thermal/thermal_helpers.c | 143 ++++++++++++++++++++++++++++++++++++++

>  3 files changed, 145 insertions(+), 118 deletions(-)

>  create mode 100644 drivers/thermal/thermal_helpers.c

> 

> diff --git a/drivers/thermal/Makefile b/drivers/thermal/Makefile

> index 95ccb75..cded802 100644

> --- a/drivers/thermal/Makefile

> +++ b/drivers/thermal/Makefile

> @@ -3,7 +3,8 @@

>  #

>  

>  obj-$(CONFIG_THERMAL)		+= thermal_sys.o

> -thermal_sys-y			+= thermal_core.o thermal_sysfs.o

> +thermal_sys-y			+= thermal_core.o thermal_sysfs.o \

> +					thermal_helpers.o

>  

>  # interface to/from other layers providing sensors

>  thermal_sys-$(CONFIG_THERMAL_HWMON)		+= thermal_hwmon.o

> diff --git a/drivers/thermal/thermal_core.c b/drivers/thermal/thermal_core.c

> index 846449c..aa2edec 100644

> --- a/drivers/thermal/thermal_core.c

> +++ b/drivers/thermal/thermal_core.c

> @@ -230,47 +230,6 @@ static void release_idr(struct idr *idr, struct mutex *lock, int id)

>  		mutex_unlock(lock);

>  }

>  

> -int get_tz_trend(struct thermal_zone_device *tz, int trip)

> -{

> -	enum thermal_trend trend;

> -

> -	if (tz->emul_temperature || !tz->ops->get_trend ||

> -	    tz->ops->get_trend(tz, trip, &trend)) {

> -		if (tz->temperature > tz->last_temperature)

> -			trend = THERMAL_TREND_RAISING;

> -		else if (tz->temperature < tz->last_temperature)

> -			trend = THERMAL_TREND_DROPPING;

> -		else

> -			trend = THERMAL_TREND_STABLE;

> -	}

> -

> -	return trend;

> -}

> -EXPORT_SYMBOL(get_tz_trend);

> -

> -struct thermal_instance *get_thermal_instance(struct thermal_zone_device *tz,

> -			struct thermal_cooling_device *cdev, int trip)

> -{

> -	struct thermal_instance *pos = NULL;

> -	struct thermal_instance *target_instance = NULL;

> -

> -	mutex_lock(&tz->lock);

> -	mutex_lock(&cdev->lock);

> -

> -	list_for_each_entry(pos, &tz->thermal_instances, tz_node) {

> -		if (pos->tz == tz && pos->trip == trip && pos->cdev == cdev) {

> -			target_instance = pos;

> -			break;

> -		}

> -	}

> -

> -	mutex_unlock(&cdev->lock);

> -	mutex_unlock(&tz->lock);

> -

> -	return target_instance;

> -}

> -EXPORT_SYMBOL(get_thermal_instance);

> -

>  static void print_bind_err_msg(struct thermal_zone_device *tz,

>  			struct thermal_cooling_device *cdev, int ret)

>  {

> @@ -471,55 +430,6 @@ static void handle_thermal_trip(struct thermal_zone_device *tz, int trip)

>  	monitor_thermal_zone(tz);

>  }

>  

> -/**

> - * thermal_zone_get_temp() - returns the temperature of a thermal zone

> - * @tz: a valid pointer to a struct thermal_zone_device

> - * @temp: a valid pointer to where to store the resulting temperature.

> - *

> - * When a valid thermal zone reference is passed, it will fetch its

> - * temperature and fill @temp.

> - *

> - * Return: On success returns 0, an error code otherwise

> - */

> -int thermal_zone_get_temp(struct thermal_zone_device *tz, int *temp)

> -{

> -	int ret = -EINVAL;

> -	int count;

> -	int crit_temp = INT_MAX;

> -	enum thermal_trip_type type;

> -

> -	if (!tz || IS_ERR(tz) || !tz->ops->get_temp)

> -		goto exit;

> -

> -	mutex_lock(&tz->lock);

> -

> -	ret = tz->ops->get_temp(tz, temp);

> -

> -	if (IS_ENABLED(CONFIG_THERMAL_EMULATION) && tz->emul_temperature) {

> -		for (count = 0; count < tz->trips; count++) {

> -			ret = tz->ops->get_trip_type(tz, count, &type);

> -			if (!ret && type == THERMAL_TRIP_CRITICAL) {

> -				ret = tz->ops->get_trip_temp(tz, count,

> -						&crit_temp);

> -				break;

> -			}

> -		}

> -

> -		/*

> -		 * Only allow emulating a temperature when the real temperature

> -		 * is below the critical temperature so that the emulation code

> -		 * cannot hide critical conditions.

> -		 */

> -		if (!ret && *temp < crit_temp)

> -			*temp = tz->emul_temperature;

> -	}

> - 

> -	mutex_unlock(&tz->lock);

> -exit:

> -	return ret;

> -}

> -EXPORT_SYMBOL_GPL(thermal_zone_get_temp);

> -

>  static void update_temperature(struct thermal_zone_device *tz)

>  {

>  	int temp, ret;

> @@ -1118,33 +1028,6 @@ void thermal_cooling_device_unregister(struct thermal_cooling_device *cdev)

>  }

>  EXPORT_SYMBOL_GPL(thermal_cooling_device_unregister);

>  

> -void thermal_cdev_update(struct thermal_cooling_device *cdev)

> -{

> -	struct thermal_instance *instance;

> -	unsigned long target = 0;

> -

> -	/* cooling device is updated*/

> -	if (cdev->updated)

> -		return;

> -

> -	mutex_lock(&cdev->lock);

> -	/* Make sure cdev enters the deepest cooling state */

> -	list_for_each_entry(instance, &cdev->thermal_instances, cdev_node) {

> -		dev_dbg(&cdev->device, "zone%d->target=%lu\n",

> -				instance->tz->id, instance->target);

> -		if (instance->target == THERMAL_NO_TARGET)

> -			continue;

> -		if (instance->target > target)

> -			target = instance->target;

> -	}

> -	mutex_unlock(&cdev->lock);

> -	cdev->ops->set_cur_state(cdev, target);

> -	cdev->updated = true;

> -	trace_cdev_update(cdev, target);

> -	dev_dbg(&cdev->device, "set to state %lu\n", target);

> -}

> -EXPORT_SYMBOL(thermal_cdev_update);

> -

>  /**

>   * thermal_notify_framework - Sensor drivers use this API to notify framework

>   * @tz:		thermal zone device

> diff --git a/drivers/thermal/thermal_helpers.c b/drivers/thermal/thermal_helpers.c

> new file mode 100644

> index 0000000..32f38e9

> --- /dev/null

> +++ b/drivers/thermal/thermal_helpers.c

> @@ -0,0 +1,143 @@

> +/*

> + *  thermal_helpers.c - helper functions to handle thermal devices

> + *

> + *  Copyright (C) 2016 Eduardo Valentin <edubezval@gmail.com>

> + *

> + *  Highly based on original thermal_core.c

> + *  Copyright (C) 2008 Intel Corp

> + *  Copyright (C) 2008 Zhang Rui <rui.zhang@intel.com>

> + *  Copyright (C) 2008 Sujith Thomas <sujith.thomas@intel.com>

> + *

> + *  This program is free software; you can redistribute it and/or modify

> + *  it under the terms of the GNU General Public License as published by

> + *  the Free Software Foundation; version 2 of the License.

> + */

> +

> +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt

> +

> +#include <linux/sysfs.h>

> +#include <linux/device.h>

> +#include <linux/err.h>

> +#include <linux/slab.h>

> +#include <linux/string.h>

> +

> +#include <trace/events/thermal.h>

> +

> +#include "thermal_core.h"

> +

> +int get_tz_trend(struct thermal_zone_device *tz, int trip)

> +{

> +	enum thermal_trend trend;

> +

> +	if (tz->emul_temperature || !tz->ops->get_trend ||

> +	    tz->ops->get_trend(tz, trip, &trend)) {

> +		if (tz->temperature > tz->last_temperature)

> +			trend = THERMAL_TREND_RAISING;

> +		else if (tz->temperature < tz->last_temperature)

> +			trend = THERMAL_TREND_DROPPING;

> +		else

> +			trend = THERMAL_TREND_STABLE;

> +	}

> +

> +	return trend;

> +}

> +EXPORT_SYMBOL(get_tz_trend);

> +

> +struct thermal_instance *get_thermal_instance(struct thermal_zone_device *tz,

> +			struct thermal_cooling_device *cdev, int trip)

> +{

> +	struct thermal_instance *pos = NULL;

> +	struct thermal_instance *target_instance = NULL;

> +

> +	mutex_lock(&tz->lock);

> +	mutex_lock(&cdev->lock);

> +

> +	list_for_each_entry(pos, &tz->thermal_instances, tz_node) {

> +		if (pos->tz == tz && pos->trip == trip && pos->cdev == cdev) {

> +			target_instance = pos;

> +			break;

> +		}

> +	}

> +

> +	mutex_unlock(&cdev->lock);

> +	mutex_unlock(&tz->lock);

> +

> +	return target_instance;

> +}

> +EXPORT_SYMBOL(get_thermal_instance);

> +

> +/**

> + * thermal_zone_get_temp() - returns the temperature of a thermal zone

> + * @tz: a valid pointer to a struct thermal_zone_device

> + * @temp: a valid pointer to where to store the resulting temperature.

> + *

> + * When a valid thermal zone reference is passed, it will fetch its

> + * temperature and fill @temp.

> + *

> + * Return: On success returns 0, an error code otherwise

> + */

> +int thermal_zone_get_temp(struct thermal_zone_device *tz, int *temp)

> +{

> +	int ret = -EINVAL;

> +	int count;

> +	int crit_temp = INT_MAX;

> +	enum thermal_trip_type type;

> +

> +	if (!tz || IS_ERR(tz) || !tz->ops->get_temp)

> +		goto exit;

> +

> +	mutex_lock(&tz->lock);

> +

> +	ret = tz->ops->get_temp(tz, temp);

> +

> +	if (IS_ENABLED(CONFIG_THERMAL_EMULATION) && tz->emul_temperature) {

> +		for (count = 0; count < tz->trips; count++) {

> +			ret = tz->ops->get_trip_type(tz, count, &type);

> +			if (!ret && type == THERMAL_TRIP_CRITICAL) {

> +				ret = tz->ops->get_trip_temp(tz, count,

> +						&crit_temp);

> +				break;

> +			}

> +		}

> +

> +		/*

> +		 * Only allow emulating a temperature when the real temperature

> +		 * is below the critical temperature so that the emulation code

> +		 * cannot hide critical conditions.

> +		 */

> +		if (!ret && *temp < crit_temp)

> +			*temp = tz->emul_temperature;

> +	}

> + 

> +	mutex_unlock(&tz->lock);

> +exit:

> +	return ret;

> +}

> +EXPORT_SYMBOL_GPL(thermal_zone_get_temp);

> +

> +void thermal_cdev_update(struct thermal_cooling_device *cdev)

> +{

> +	struct thermal_instance *instance;

> +	unsigned long target = 0;

> +

> +	/* cooling device is updated*/

> +	if (cdev->updated)

> +		return;

> +

> +	mutex_lock(&cdev->lock);

> +	/* Make sure cdev enters the deepest cooling state */

> +	list_for_each_entry(instance, &cdev->thermal_instances, cdev_node) {

> +		dev_dbg(&cdev->device, "zone%d->target=%lu\n",

> +				instance->tz->id, instance->target);

> +		if (instance->target == THERMAL_NO_TARGET)

> +			continue;

> +		if (instance->target > target)

> +			target = instance->target;

> +	}

> +	mutex_unlock(&cdev->lock);

> +	cdev->ops->set_cur_state(cdev, target);

> +	cdev->updated = true;

> +	trace_cdev_update(cdev, target);

> +	dev_dbg(&cdev->device, "set to state %lu\n", target);

> +}

> +EXPORT_SYMBOL(thermal_cdev_update);
Eduardo Valentin May 17, 2016, 2:40 p.m. UTC | #2
On Tue, May 17, 2016 at 01:20:17PM +0000, Zhang, Rui wrote:
> $checkpatch.pl 20-31-thermal-core-introduce-thermal_helpers.c.patch 
> 
> WARNING: added, moved or deleted file(s), does MAINTAINERS need
> updating?
> #187: 
> new file mode 100644
> 
> ERROR: trailing whitespace
> #302: FILE: drivers/thermal/thermal_helpers.c:111:
> + $
> 
> WARNING: please, no spaces at the start of a line
> #302: FILE: drivers/thermal/thermal_helpers.c:111:
> + $
> 
> total: 1 errors, 2 warnings, 287 lines checked
> 
> NOTE: Whitespace errors detected.
>       You may wish to use scripts/cleanpatch or scripts/cleanfile
> 
> 20-31-thermal-core-introduce-thermal_helpers.c.patch has style problems,
> please review.
> 
> NOTE: If any of the errors are false positives, please report
>       them to the maintainer, see CHECKPATCH in MAINTAINERS.
> 
> Please remove these spaces.
> BTW, there are also some warnings in the other patches, please fix the
> checkpatch warnings/errors.

Yeah, I will fix those.

These patches were supposed to be reviewed/merged before the merge
window though. I am going to wait until the merge window is closed to
send them again.


BR,

Eduardo Valentin
--
To unsubscribe from this list: send the line "unsubscribe linux-pm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Eduardo Valentin May 30, 2016, 4:05 p.m. UTC | #3
On Tue, May 17, 2016 at 07:40:45AM -0700, Eduardo Valentin wrote:
> > 
> > Please remove these spaces.
> > BTW, there are also some warnings in the other patches, please fix the
> > checkpatch warnings/errors.

All the checkpatch complaints in this series are due to existing
problems. As you can see, these are present on patches that are moving
code (as most of this series are). But I can of course fix the errors
before moving the code. Will include the fixes in the next version.

--
To unsubscribe from this list: send the line "unsubscribe linux-pm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/drivers/thermal/Makefile b/drivers/thermal/Makefile
index 95ccb75..cded802 100644
--- a/drivers/thermal/Makefile
+++ b/drivers/thermal/Makefile
@@ -3,7 +3,8 @@ 
 #
 
 obj-$(CONFIG_THERMAL)		+= thermal_sys.o
-thermal_sys-y			+= thermal_core.o thermal_sysfs.o
+thermal_sys-y			+= thermal_core.o thermal_sysfs.o \
+					thermal_helpers.o
 
 # interface to/from other layers providing sensors
 thermal_sys-$(CONFIG_THERMAL_HWMON)		+= thermal_hwmon.o
diff --git a/drivers/thermal/thermal_core.c b/drivers/thermal/thermal_core.c
index 846449c..aa2edec 100644
--- a/drivers/thermal/thermal_core.c
+++ b/drivers/thermal/thermal_core.c
@@ -230,47 +230,6 @@  static void release_idr(struct idr *idr, struct mutex *lock, int id)
 		mutex_unlock(lock);
 }
 
-int get_tz_trend(struct thermal_zone_device *tz, int trip)
-{
-	enum thermal_trend trend;
-
-	if (tz->emul_temperature || !tz->ops->get_trend ||
-	    tz->ops->get_trend(tz, trip, &trend)) {
-		if (tz->temperature > tz->last_temperature)
-			trend = THERMAL_TREND_RAISING;
-		else if (tz->temperature < tz->last_temperature)
-			trend = THERMAL_TREND_DROPPING;
-		else
-			trend = THERMAL_TREND_STABLE;
-	}
-
-	return trend;
-}
-EXPORT_SYMBOL(get_tz_trend);
-
-struct thermal_instance *get_thermal_instance(struct thermal_zone_device *tz,
-			struct thermal_cooling_device *cdev, int trip)
-{
-	struct thermal_instance *pos = NULL;
-	struct thermal_instance *target_instance = NULL;
-
-	mutex_lock(&tz->lock);
-	mutex_lock(&cdev->lock);
-
-	list_for_each_entry(pos, &tz->thermal_instances, tz_node) {
-		if (pos->tz == tz && pos->trip == trip && pos->cdev == cdev) {
-			target_instance = pos;
-			break;
-		}
-	}
-
-	mutex_unlock(&cdev->lock);
-	mutex_unlock(&tz->lock);
-
-	return target_instance;
-}
-EXPORT_SYMBOL(get_thermal_instance);
-
 static void print_bind_err_msg(struct thermal_zone_device *tz,
 			struct thermal_cooling_device *cdev, int ret)
 {
@@ -471,55 +430,6 @@  static void handle_thermal_trip(struct thermal_zone_device *tz, int trip)
 	monitor_thermal_zone(tz);
 }
 
-/**
- * thermal_zone_get_temp() - returns the temperature of a thermal zone
- * @tz: a valid pointer to a struct thermal_zone_device
- * @temp: a valid pointer to where to store the resulting temperature.
- *
- * When a valid thermal zone reference is passed, it will fetch its
- * temperature and fill @temp.
- *
- * Return: On success returns 0, an error code otherwise
- */
-int thermal_zone_get_temp(struct thermal_zone_device *tz, int *temp)
-{
-	int ret = -EINVAL;
-	int count;
-	int crit_temp = INT_MAX;
-	enum thermal_trip_type type;
-
-	if (!tz || IS_ERR(tz) || !tz->ops->get_temp)
-		goto exit;
-
-	mutex_lock(&tz->lock);
-
-	ret = tz->ops->get_temp(tz, temp);
-
-	if (IS_ENABLED(CONFIG_THERMAL_EMULATION) && tz->emul_temperature) {
-		for (count = 0; count < tz->trips; count++) {
-			ret = tz->ops->get_trip_type(tz, count, &type);
-			if (!ret && type == THERMAL_TRIP_CRITICAL) {
-				ret = tz->ops->get_trip_temp(tz, count,
-						&crit_temp);
-				break;
-			}
-		}
-
-		/*
-		 * Only allow emulating a temperature when the real temperature
-		 * is below the critical temperature so that the emulation code
-		 * cannot hide critical conditions.
-		 */
-		if (!ret && *temp < crit_temp)
-			*temp = tz->emul_temperature;
-	}
- 
-	mutex_unlock(&tz->lock);
-exit:
-	return ret;
-}
-EXPORT_SYMBOL_GPL(thermal_zone_get_temp);
-
 static void update_temperature(struct thermal_zone_device *tz)
 {
 	int temp, ret;
@@ -1118,33 +1028,6 @@  void thermal_cooling_device_unregister(struct thermal_cooling_device *cdev)
 }
 EXPORT_SYMBOL_GPL(thermal_cooling_device_unregister);
 
-void thermal_cdev_update(struct thermal_cooling_device *cdev)
-{
-	struct thermal_instance *instance;
-	unsigned long target = 0;
-
-	/* cooling device is updated*/
-	if (cdev->updated)
-		return;
-
-	mutex_lock(&cdev->lock);
-	/* Make sure cdev enters the deepest cooling state */
-	list_for_each_entry(instance, &cdev->thermal_instances, cdev_node) {
-		dev_dbg(&cdev->device, "zone%d->target=%lu\n",
-				instance->tz->id, instance->target);
-		if (instance->target == THERMAL_NO_TARGET)
-			continue;
-		if (instance->target > target)
-			target = instance->target;
-	}
-	mutex_unlock(&cdev->lock);
-	cdev->ops->set_cur_state(cdev, target);
-	cdev->updated = true;
-	trace_cdev_update(cdev, target);
-	dev_dbg(&cdev->device, "set to state %lu\n", target);
-}
-EXPORT_SYMBOL(thermal_cdev_update);
-
 /**
  * thermal_notify_framework - Sensor drivers use this API to notify framework
  * @tz:		thermal zone device
diff --git a/drivers/thermal/thermal_helpers.c b/drivers/thermal/thermal_helpers.c
new file mode 100644
index 0000000..32f38e9
--- /dev/null
+++ b/drivers/thermal/thermal_helpers.c
@@ -0,0 +1,143 @@ 
+/*
+ *  thermal_helpers.c - helper functions to handle thermal devices
+ *
+ *  Copyright (C) 2016 Eduardo Valentin <edubezval@gmail.com>
+ *
+ *  Highly based on original thermal_core.c
+ *  Copyright (C) 2008 Intel Corp
+ *  Copyright (C) 2008 Zhang Rui <rui.zhang@intel.com>
+ *  Copyright (C) 2008 Sujith Thomas <sujith.thomas@intel.com>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; version 2 of the License.
+ */
+
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
+
+#include <linux/sysfs.h>
+#include <linux/device.h>
+#include <linux/err.h>
+#include <linux/slab.h>
+#include <linux/string.h>
+
+#include <trace/events/thermal.h>
+
+#include "thermal_core.h"
+
+int get_tz_trend(struct thermal_zone_device *tz, int trip)
+{
+	enum thermal_trend trend;
+
+	if (tz->emul_temperature || !tz->ops->get_trend ||
+	    tz->ops->get_trend(tz, trip, &trend)) {
+		if (tz->temperature > tz->last_temperature)
+			trend = THERMAL_TREND_RAISING;
+		else if (tz->temperature < tz->last_temperature)
+			trend = THERMAL_TREND_DROPPING;
+		else
+			trend = THERMAL_TREND_STABLE;
+	}
+
+	return trend;
+}
+EXPORT_SYMBOL(get_tz_trend);
+
+struct thermal_instance *get_thermal_instance(struct thermal_zone_device *tz,
+			struct thermal_cooling_device *cdev, int trip)
+{
+	struct thermal_instance *pos = NULL;
+	struct thermal_instance *target_instance = NULL;
+
+	mutex_lock(&tz->lock);
+	mutex_lock(&cdev->lock);
+
+	list_for_each_entry(pos, &tz->thermal_instances, tz_node) {
+		if (pos->tz == tz && pos->trip == trip && pos->cdev == cdev) {
+			target_instance = pos;
+			break;
+		}
+	}
+
+	mutex_unlock(&cdev->lock);
+	mutex_unlock(&tz->lock);
+
+	return target_instance;
+}
+EXPORT_SYMBOL(get_thermal_instance);
+
+/**
+ * thermal_zone_get_temp() - returns the temperature of a thermal zone
+ * @tz: a valid pointer to a struct thermal_zone_device
+ * @temp: a valid pointer to where to store the resulting temperature.
+ *
+ * When a valid thermal zone reference is passed, it will fetch its
+ * temperature and fill @temp.
+ *
+ * Return: On success returns 0, an error code otherwise
+ */
+int thermal_zone_get_temp(struct thermal_zone_device *tz, int *temp)
+{
+	int ret = -EINVAL;
+	int count;
+	int crit_temp = INT_MAX;
+	enum thermal_trip_type type;
+
+	if (!tz || IS_ERR(tz) || !tz->ops->get_temp)
+		goto exit;
+
+	mutex_lock(&tz->lock);
+
+	ret = tz->ops->get_temp(tz, temp);
+
+	if (IS_ENABLED(CONFIG_THERMAL_EMULATION) && tz->emul_temperature) {
+		for (count = 0; count < tz->trips; count++) {
+			ret = tz->ops->get_trip_type(tz, count, &type);
+			if (!ret && type == THERMAL_TRIP_CRITICAL) {
+				ret = tz->ops->get_trip_temp(tz, count,
+						&crit_temp);
+				break;
+			}
+		}
+
+		/*
+		 * Only allow emulating a temperature when the real temperature
+		 * is below the critical temperature so that the emulation code
+		 * cannot hide critical conditions.
+		 */
+		if (!ret && *temp < crit_temp)
+			*temp = tz->emul_temperature;
+	}
+ 
+	mutex_unlock(&tz->lock);
+exit:
+	return ret;
+}
+EXPORT_SYMBOL_GPL(thermal_zone_get_temp);
+
+void thermal_cdev_update(struct thermal_cooling_device *cdev)
+{
+	struct thermal_instance *instance;
+	unsigned long target = 0;
+
+	/* cooling device is updated*/
+	if (cdev->updated)
+		return;
+
+	mutex_lock(&cdev->lock);
+	/* Make sure cdev enters the deepest cooling state */
+	list_for_each_entry(instance, &cdev->thermal_instances, cdev_node) {
+		dev_dbg(&cdev->device, "zone%d->target=%lu\n",
+				instance->tz->id, instance->target);
+		if (instance->target == THERMAL_NO_TARGET)
+			continue;
+		if (instance->target > target)
+			target = instance->target;
+	}
+	mutex_unlock(&cdev->lock);
+	cdev->ops->set_cur_state(cdev, target);
+	cdev->updated = true;
+	trace_cdev_update(cdev, target);
+	dev_dbg(&cdev->device, "set to state %lu\n", target);
+}
+EXPORT_SYMBOL(thermal_cdev_update);