Commit 5c4a6083 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/rzhang/linux

Pull thermal management updates from Zhang Rui:

 - Add locking for cooling device sysfs attribute in case the cooling
   device state is changed by userspace and thermal framework
   simultaneously. (Thara Gopinath)

 - Fix a problem that passive cooling is reset improperly after system
   suspend/resume. (Wei Wang)

 - Cleanup the driver/thermal/ directory by moving intel and qcom
   platform specific drivers to platform specific sub-directories. (Amit
   Kucheria)

 - Some trivial cleanups. (Lukasz Luba, Wolfram Sang)

* 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/rzhang/linux:
  thermal/intel: fixup for Kconfig string parsing tightening up
  drivers: thermal: Move QCOM_SPMI_TEMP_ALARM into the qcom subdir
  drivers: thermal: Move various drivers for intel platforms into a subdir
  thermal: Fix locking in cooling device sysfs update cur_state
  Thermal: do not clear passive state during system sleep
  thermal: zx2967_thermal: simplify getting .driver_data
  thermal: st: st_thermal: simplify getting .driver_data
  thermal: spear_thermal: simplify getting .driver_data
  thermal: rockchip_thermal: simplify getting .driver_data
  thermal: int340x_thermal: int3400_thermal: simplify getting .driver_data
  thermal: remove unused function parameter
parents c2802302 24ef9ec8
...@@ -326,84 +326,6 @@ config DA9062_THERMAL ...@@ -326,84 +326,6 @@ config DA9062_THERMAL
zone. zone.
Compatible with the DA9062 and DA9061 PMICs. Compatible with the DA9062 and DA9061 PMICs.
config INTEL_POWERCLAMP
tristate "Intel PowerClamp idle injection driver"
depends on THERMAL
depends on X86
depends on CPU_SUP_INTEL
help
Enable this to enable Intel PowerClamp idle injection driver. This
enforce idle time which results in more package C-state residency. The
user interface is exposed via generic thermal framework.
config X86_PKG_TEMP_THERMAL
tristate "X86 package temperature thermal driver"
depends on X86_THERMAL_VECTOR
select THERMAL_GOV_USER_SPACE
select THERMAL_WRITABLE_TRIPS
default m
help
Enable this to register CPU digital sensor for package temperature as
thermal zone. Each package will have its own thermal zone. There are
two trip points which can be set by user to get notifications via thermal
notification methods.
config INTEL_SOC_DTS_IOSF_CORE
tristate
depends on X86 && PCI
select IOSF_MBI
help
This is becoming a common feature for Intel SoCs to expose the additional
digital temperature sensors (DTSs) using side band interface (IOSF). This
implements the common set of helper functions to register, get temperature
and get/set thresholds on DTSs.
config INTEL_SOC_DTS_THERMAL
tristate "Intel SoCs DTS thermal driver"
depends on X86 && PCI && ACPI
select INTEL_SOC_DTS_IOSF_CORE
select THERMAL_WRITABLE_TRIPS
help
Enable this to register Intel SoCs (e.g. Bay Trail) platform digital
temperature sensor (DTS). These SoCs have two additional DTSs in
addition to DTSs on CPU cores. Each DTS will be registered as a
thermal zone. There are two trip points. One of the trip point can
be set by user mode programs to get notifications via Linux thermal
notification methods.The other trip is a critical trip point, which
was set by the driver based on the TJ MAX temperature.
config INTEL_QUARK_DTS_THERMAL
tristate "Intel Quark DTS thermal driver"
depends on X86_INTEL_QUARK
help
Enable this to register Intel Quark SoC (e.g. X1000) platform digital
temperature sensor (DTS). For X1000 SoC, it has one on-die DTS.
The DTS will be registered as a thermal zone. There are two trip points:
hot & critical. The critical trip point default value is set by
underlying BIOS/Firmware.
menu "ACPI INT340X thermal drivers"
source "drivers/thermal/int340x_thermal/Kconfig"
endmenu
config INTEL_BXT_PMIC_THERMAL
tristate "Intel Broxton PMIC thermal driver"
depends on X86 && INTEL_SOC_PMIC_BXTWC && REGMAP
help
Select this driver for Intel Broxton PMIC with ADC channels monitoring
system temperature measurements and alerts.
This driver is used for monitoring the ADC channels of PMIC and handles
the alert trip point interrupts and notifies the thermal framework with
the trip point and temperature details of the zone.
config INTEL_PCH_THERMAL
tristate "Intel PCH Thermal Reporting Driver"
depends on X86 && PCI
help
Enable this to support thermal reporting on certain intel PCHs.
Thermal reporting device will provide temperature reading,
programmable trip points and other information.
config MTK_THERMAL config MTK_THERMAL
tristate "Temperature sensor driver for mediatek SoCs" tristate "Temperature sensor driver for mediatek SoCs"
depends on ARCH_MEDIATEK || COMPILE_TEST depends on ARCH_MEDIATEK || COMPILE_TEST
...@@ -415,6 +337,11 @@ config MTK_THERMAL ...@@ -415,6 +337,11 @@ config MTK_THERMAL
Enable this option if you want to have support for thermal management Enable this option if you want to have support for thermal management
controller present in Mediatek SoCs controller present in Mediatek SoCs
menu "Intel thermal drivers"
depends on X86 || X86_INTEL_QUARK || COMPILE_TEST
source "drivers/thermal/intel/Kconfig"
endmenu
menu "Broadcom thermal drivers" menu "Broadcom thermal drivers"
depends on ARCH_BCM || ARCH_BRCMSTB || ARCH_BCM2835 || COMPILE_TEST depends on ARCH_BCM || ARCH_BRCMSTB || ARCH_BCM2835 || COMPILE_TEST
source "drivers/thermal/broadcom/Kconfig" source "drivers/thermal/broadcom/Kconfig"
...@@ -447,17 +374,6 @@ config TANGO_THERMAL ...@@ -447,17 +374,6 @@ config TANGO_THERMAL
source "drivers/thermal/tegra/Kconfig" source "drivers/thermal/tegra/Kconfig"
config QCOM_SPMI_TEMP_ALARM
tristate "Qualcomm SPMI PMIC Temperature Alarm"
depends on OF && SPMI && IIO
select REGMAP_SPMI
help
This enables a thermal sysfs driver for Qualcomm plug-and-play (QPNP)
PMIC devices. It shows up in sysfs as a thermal sensor with multiple
trip points. The temperature reported by the thermal sensor reflects the
real time die temperature if an ADC is present or an estimate of the
temperature based upon the over temperature stage value.
config GENERIC_ADC_THERMAL config GENERIC_ADC_THERMAL
tristate "Generic ADC based thermal sensor" tristate "Generic ADC based thermal sensor"
depends on IIO depends on IIO
......
...@@ -29,7 +29,6 @@ thermal_sys-$(CONFIG_DEVFREQ_THERMAL) += devfreq_cooling.o ...@@ -29,7 +29,6 @@ thermal_sys-$(CONFIG_DEVFREQ_THERMAL) += devfreq_cooling.o
# platform thermal drivers # platform thermal drivers
obj-y += broadcom/ obj-y += broadcom/
obj-$(CONFIG_QCOM_SPMI_TEMP_ALARM) += qcom-spmi-temp-alarm.o
obj-$(CONFIG_SPEAR_THERMAL) += spear_thermal.o obj-$(CONFIG_SPEAR_THERMAL) += spear_thermal.o
obj-$(CONFIG_ROCKCHIP_THERMAL) += rockchip_thermal.o obj-$(CONFIG_ROCKCHIP_THERMAL) += rockchip_thermal.o
obj-$(CONFIG_RCAR_THERMAL) += rcar_thermal.o obj-$(CONFIG_RCAR_THERMAL) += rcar_thermal.o
...@@ -44,15 +43,8 @@ obj-$(CONFIG_IMX_THERMAL) += imx_thermal.o ...@@ -44,15 +43,8 @@ obj-$(CONFIG_IMX_THERMAL) += imx_thermal.o
obj-$(CONFIG_MAX77620_THERMAL) += max77620_thermal.o obj-$(CONFIG_MAX77620_THERMAL) += max77620_thermal.o
obj-$(CONFIG_QORIQ_THERMAL) += qoriq_thermal.o obj-$(CONFIG_QORIQ_THERMAL) += qoriq_thermal.o
obj-$(CONFIG_DA9062_THERMAL) += da9062-thermal.o obj-$(CONFIG_DA9062_THERMAL) += da9062-thermal.o
obj-$(CONFIG_INTEL_POWERCLAMP) += intel_powerclamp.o obj-y += intel/
obj-$(CONFIG_X86_PKG_TEMP_THERMAL) += x86_pkg_temp_thermal.o
obj-$(CONFIG_INTEL_SOC_DTS_IOSF_CORE) += intel_soc_dts_iosf.o
obj-$(CONFIG_INTEL_SOC_DTS_THERMAL) += intel_soc_dts_thermal.o
obj-$(CONFIG_INTEL_QUARK_DTS_THERMAL) += intel_quark_dts_thermal.o
obj-$(CONFIG_TI_SOC_THERMAL) += ti-soc-thermal/ obj-$(CONFIG_TI_SOC_THERMAL) += ti-soc-thermal/
obj-$(CONFIG_INT340X_THERMAL) += int340x_thermal/
obj-$(CONFIG_INTEL_BXT_PMIC_THERMAL) += intel_bxt_pmic_thermal.o
obj-$(CONFIG_INTEL_PCH_THERMAL) += intel_pch_thermal.o
obj-y += st/ obj-y += st/
obj-$(CONFIG_QCOM_TSENS) += qcom/ obj-$(CONFIG_QCOM_TSENS) += qcom/
obj-y += tegra/ obj-y += tegra/
......
config INTEL_POWERCLAMP
tristate "Intel PowerClamp idle injection driver"
depends on THERMAL
depends on X86
depends on CPU_SUP_INTEL
help
Enable this to enable Intel PowerClamp idle injection driver. This
enforce idle time which results in more package C-state residency. The
user interface is exposed via generic thermal framework.
config X86_PKG_TEMP_THERMAL
tristate "X86 package temperature thermal driver"
depends on X86_THERMAL_VECTOR
select THERMAL_GOV_USER_SPACE
select THERMAL_WRITABLE_TRIPS
default m
help
Enable this to register CPU digital sensor for package temperature as
thermal zone. Each package will have its own thermal zone. There are
two trip points which can be set by user to get notifications via thermal
notification methods.
config INTEL_SOC_DTS_IOSF_CORE
tristate
depends on X86 && PCI
select IOSF_MBI
help
This is becoming a common feature for Intel SoCs to expose the additional
digital temperature sensors (DTSs) using side band interface (IOSF). This
implements the common set of helper functions to register, get temperature
and get/set thresholds on DTSs.
config INTEL_SOC_DTS_THERMAL
tristate "Intel SoCs DTS thermal driver"
depends on X86 && PCI && ACPI
select INTEL_SOC_DTS_IOSF_CORE
select THERMAL_WRITABLE_TRIPS
help
Enable this to register Intel SoCs (e.g. Bay Trail) platform digital
temperature sensor (DTS). These SoCs have two additional DTSs in
addition to DTSs on CPU cores. Each DTS will be registered as a
thermal zone. There are two trip points. One of the trip point can
be set by user mode programs to get notifications via Linux thermal
notification methods.The other trip is a critical trip point, which
was set by the driver based on the TJ MAX temperature.
config INTEL_QUARK_DTS_THERMAL
tristate "Intel Quark DTS thermal driver"
depends on X86_INTEL_QUARK
help
Enable this to register Intel Quark SoC (e.g. X1000) platform digital
temperature sensor (DTS). For X1000 SoC, it has one on-die DTS.
The DTS will be registered as a thermal zone. There are two trip points:
hot & critical. The critical trip point default value is set by
underlying BIOS/Firmware.
menu "ACPI INT340X thermal drivers"
source "drivers/thermal/intel/int340x_thermal/Kconfig"
endmenu
config INTEL_BXT_PMIC_THERMAL
tristate "Intel Broxton PMIC thermal driver"
depends on X86 && INTEL_SOC_PMIC_BXTWC && REGMAP
help
Select this driver for Intel Broxton PMIC with ADC channels monitoring
system temperature measurements and alerts.
This driver is used for monitoring the ADC channels of PMIC and handles
the alert trip point interrupts and notifies the thermal framework with
the trip point and temperature details of the zone.
config INTEL_PCH_THERMAL
tristate "Intel PCH Thermal Reporting Driver"
depends on X86 && PCI
help
Enable this to support thermal reporting on certain intel PCHs.
Thermal reporting device will provide temperature reading,
programmable trip points and other information.
# SPDX-License-Identifier: GPL-2.0
#
# Makefile for various Intel thermal drivers.
obj-$(CONFIG_INTEL_POWERCLAMP) += intel_powerclamp.o
obj-$(CONFIG_X86_PKG_TEMP_THERMAL) += x86_pkg_temp_thermal.o
obj-$(CONFIG_INTEL_SOC_DTS_IOSF_CORE) += intel_soc_dts_iosf.o
obj-$(CONFIG_INTEL_SOC_DTS_THERMAL) += intel_soc_dts_thermal.o
obj-$(CONFIG_INTEL_QUARK_DTS_THERMAL) += intel_quark_dts_thermal.o
obj-$(CONFIG_INT340X_THERMAL) += int340x_thermal/
obj-$(CONFIG_INTEL_BXT_PMIC_THERMAL) += intel_bxt_pmic_thermal.o
obj-$(CONFIG_INTEL_PCH_THERMAL) += intel_pch_thermal.o
...@@ -48,8 +48,7 @@ static ssize_t available_uuids_show(struct device *dev, ...@@ -48,8 +48,7 @@ static ssize_t available_uuids_show(struct device *dev,
struct device_attribute *attr, struct device_attribute *attr,
char *buf) char *buf)
{ {
struct platform_device *pdev = to_platform_device(dev); struct int3400_thermal_priv *priv = dev_get_drvdata(dev);
struct int3400_thermal_priv *priv = platform_get_drvdata(pdev);
int i; int i;
int length = 0; int length = 0;
...@@ -68,8 +67,7 @@ static ssize_t available_uuids_show(struct device *dev, ...@@ -68,8 +67,7 @@ static ssize_t available_uuids_show(struct device *dev,
static ssize_t current_uuid_show(struct device *dev, static ssize_t current_uuid_show(struct device *dev,
struct device_attribute *devattr, char *buf) struct device_attribute *devattr, char *buf)
{ {
struct platform_device *pdev = to_platform_device(dev); struct int3400_thermal_priv *priv = dev_get_drvdata(dev);
struct int3400_thermal_priv *priv = platform_get_drvdata(pdev);
if (priv->uuid_bitmap & (1 << priv->current_uuid_index)) if (priv->uuid_bitmap & (1 << priv->current_uuid_index))
return sprintf(buf, "%s\n", return sprintf(buf, "%s\n",
...@@ -82,8 +80,7 @@ static ssize_t current_uuid_store(struct device *dev, ...@@ -82,8 +80,7 @@ static ssize_t current_uuid_store(struct device *dev,
struct device_attribute *attr, struct device_attribute *attr,
const char *buf, size_t count) const char *buf, size_t count)
{ {
struct platform_device *pdev = to_platform_device(dev); struct int3400_thermal_priv *priv = dev_get_drvdata(dev);
struct int3400_thermal_priv *priv = platform_get_drvdata(pdev);
int i; int i;
for (i = 0; i < INT3400_THERMAL_MAXIMUM_UUID; ++i) { for (i = 0; i < INT3400_THERMAL_MAXIMUM_UUID; ++i) {
......
...@@ -9,3 +9,14 @@ config QCOM_TSENS ...@@ -9,3 +9,14 @@ config QCOM_TSENS
thermal zone device via the mode file results in disabling the sensor. thermal zone device via the mode file results in disabling the sensor.
Also able to set threshold temperature for both hot and cold and update Also able to set threshold temperature for both hot and cold and update
when a threshold is reached. when a threshold is reached.
config QCOM_SPMI_TEMP_ALARM
tristate "Qualcomm SPMI PMIC Temperature Alarm"
depends on OF && SPMI && IIO
select REGMAP_SPMI
help
This enables a thermal sysfs driver for Qualcomm plug-and-play (QPNP)
PMIC devices. It shows up in sysfs as a thermal sensor with multiple
trip points. The temperature reported by the thermal sensor reflects the
real time die temperature if an ADC is present or an estimate of the
temperature based upon the over temperature stage value.
obj-$(CONFIG_QCOM_TSENS) += qcom_tsens.o obj-$(CONFIG_QCOM_TSENS) += qcom_tsens.o
qcom_tsens-y += tsens.o tsens-common.o tsens-8916.o tsens-8974.o tsens-8960.o tsens-v2.o qcom_tsens-y += tsens.o tsens-common.o tsens-8916.o tsens-8974.o tsens-8960.o tsens-v2.o
obj-$(CONFIG_QCOM_SPMI_TEMP_ALARM) += qcom-spmi-temp-alarm.o
...@@ -23,7 +23,7 @@ ...@@ -23,7 +23,7 @@
#include <linux/regmap.h> #include <linux/regmap.h>
#include <linux/thermal.h> #include <linux/thermal.h>
#include "thermal_core.h" #include "../thermal_core.h"
#define QPNP_TM_REG_TYPE 0x04 #define QPNP_TM_REG_TYPE 0x04
#define QPNP_TM_REG_SUBTYPE 0x05 #define QPNP_TM_REG_SUBTYPE 0x05
......
...@@ -1327,8 +1327,7 @@ static int rockchip_thermal_remove(struct platform_device *pdev) ...@@ -1327,8 +1327,7 @@ static int rockchip_thermal_remove(struct platform_device *pdev)
static int __maybe_unused rockchip_thermal_suspend(struct device *dev) static int __maybe_unused rockchip_thermal_suspend(struct device *dev)
{ {
struct platform_device *pdev = to_platform_device(dev); struct rockchip_thermal_data *thermal = dev_get_drvdata(dev);
struct rockchip_thermal_data *thermal = platform_get_drvdata(pdev);
int i; int i;
for (i = 0; i < thermal->chip->chn_num; i++) for (i = 0; i < thermal->chip->chn_num; i++)
...@@ -1346,8 +1345,7 @@ static int __maybe_unused rockchip_thermal_suspend(struct device *dev) ...@@ -1346,8 +1345,7 @@ static int __maybe_unused rockchip_thermal_suspend(struct device *dev)
static int __maybe_unused rockchip_thermal_resume(struct device *dev) static int __maybe_unused rockchip_thermal_resume(struct device *dev)
{ {
struct platform_device *pdev = to_platform_device(dev); struct rockchip_thermal_data *thermal = dev_get_drvdata(dev);
struct rockchip_thermal_data *thermal = platform_get_drvdata(pdev);
int i; int i;
int error; int error;
...@@ -1376,7 +1374,7 @@ static int __maybe_unused rockchip_thermal_resume(struct device *dev) ...@@ -1376,7 +1374,7 @@ static int __maybe_unused rockchip_thermal_resume(struct device *dev)
id, thermal->regs, id, thermal->regs,
thermal->tshut_temp); thermal->tshut_temp);
if (error) if (error)
dev_err(&pdev->dev, "%s: invalid tshut=%d, error=%d\n", dev_err(dev, "%s: invalid tshut=%d, error=%d\n",
__func__, thermal->tshut_temp, error); __func__, thermal->tshut_temp, error);
} }
......
...@@ -56,8 +56,7 @@ static struct thermal_zone_device_ops ops = { ...@@ -56,8 +56,7 @@ static struct thermal_zone_device_ops ops = {
static int __maybe_unused spear_thermal_suspend(struct device *dev) static int __maybe_unused spear_thermal_suspend(struct device *dev)
{ {
struct platform_device *pdev = to_platform_device(dev); struct thermal_zone_device *spear_thermal = dev_get_drvdata(dev);
struct thermal_zone_device *spear_thermal = platform_get_drvdata(pdev);
struct spear_thermal_dev *stdev = spear_thermal->devdata; struct spear_thermal_dev *stdev = spear_thermal->devdata;
unsigned int actual_mask = 0; unsigned int actual_mask = 0;
...@@ -73,15 +72,14 @@ static int __maybe_unused spear_thermal_suspend(struct device *dev) ...@@ -73,15 +72,14 @@ static int __maybe_unused spear_thermal_suspend(struct device *dev)
static int __maybe_unused spear_thermal_resume(struct device *dev) static int __maybe_unused spear_thermal_resume(struct device *dev)
{ {
struct platform_device *pdev = to_platform_device(dev); struct thermal_zone_device *spear_thermal = dev_get_drvdata(dev);
struct thermal_zone_device *spear_thermal = platform_get_drvdata(pdev);
struct spear_thermal_dev *stdev = spear_thermal->devdata; struct spear_thermal_dev *stdev = spear_thermal->devdata;
unsigned int actual_mask = 0; unsigned int actual_mask = 0;
int ret = 0; int ret = 0;
ret = clk_enable(stdev->clk); ret = clk_enable(stdev->clk);
if (ret) { if (ret) {
dev_err(&pdev->dev, "Can't enable clock\n"); dev_err(dev, "Can't enable clock\n");
return ret; return ret;
} }
......
...@@ -277,8 +277,7 @@ EXPORT_SYMBOL_GPL(st_thermal_unregister); ...@@ -277,8 +277,7 @@ EXPORT_SYMBOL_GPL(st_thermal_unregister);
#ifdef CONFIG_PM_SLEEP #ifdef CONFIG_PM_SLEEP
static int st_thermal_suspend(struct device *dev) static int st_thermal_suspend(struct device *dev)
{ {
struct platform_device *pdev = to_platform_device(dev); struct st_thermal_sensor *sensor = dev_get_drvdata(dev);
struct st_thermal_sensor *sensor = platform_get_drvdata(pdev);
return st_thermal_sensor_off(sensor); return st_thermal_sensor_off(sensor);
} }
...@@ -286,8 +285,7 @@ static int st_thermal_suspend(struct device *dev) ...@@ -286,8 +285,7 @@ static int st_thermal_suspend(struct device *dev)
static int st_thermal_resume(struct device *dev) static int st_thermal_resume(struct device *dev)
{ {
int ret; int ret;
struct platform_device *pdev = to_platform_device(dev); struct st_thermal_sensor *sensor = dev_get_drvdata(dev);
struct st_thermal_sensor *sensor = platform_get_drvdata(pdev);
ret = st_thermal_sensor_on(sensor); ret = st_thermal_sensor_on(sensor);
if (ret) if (ret)
......
...@@ -315,9 +315,7 @@ static void monitor_thermal_zone(struct thermal_zone_device *tz) ...@@ -315,9 +315,7 @@ static void monitor_thermal_zone(struct thermal_zone_device *tz)
mutex_unlock(&tz->lock); mutex_unlock(&tz->lock);
} }
static void handle_non_critical_trips(struct thermal_zone_device *tz, static void handle_non_critical_trips(struct thermal_zone_device *tz, int trip)
int trip,
enum thermal_trip_type trip_type)
{ {
tz->governor ? tz->governor->throttle(tz, trip) : tz->governor ? tz->governor->throttle(tz, trip) :
def_governor->throttle(tz, trip); def_governor->throttle(tz, trip);
...@@ -418,7 +416,7 @@ static void handle_thermal_trip(struct thermal_zone_device *tz, int trip) ...@@ -418,7 +416,7 @@ static void handle_thermal_trip(struct thermal_zone_device *tz, int trip)
if (type == THERMAL_TRIP_CRITICAL || type == THERMAL_TRIP_HOT) if (type == THERMAL_TRIP_CRITICAL || type == THERMAL_TRIP_HOT)
handle_critical_trips(tz, trip, type); handle_critical_trips(tz, trip, type);
else else
handle_non_critical_trips(tz, trip, type); handle_non_critical_trips(tz, trip);
/* /*
* Alright, we handled this trip successfully. * Alright, we handled this trip successfully.
* So, start monitoring again. * So, start monitoring again.
...@@ -453,16 +451,20 @@ static void update_temperature(struct thermal_zone_device *tz) ...@@ -453,16 +451,20 @@ static void update_temperature(struct thermal_zone_device *tz)
tz->last_temperature, tz->temperature); tz->last_temperature, tz->temperature);
} }
static void thermal_zone_device_reset(struct thermal_zone_device *tz) static void thermal_zone_device_init(struct thermal_zone_device *tz)
{ {
struct thermal_instance *pos; struct thermal_instance *pos;
tz->temperature = THERMAL_TEMP_INVALID; tz->temperature = THERMAL_TEMP_INVALID;
tz->passive = 0;
list_for_each_entry(pos, &tz->thermal_instances, tz_node) list_for_each_entry(pos, &tz->thermal_instances, tz_node)
pos->initialized = false; pos->initialized = false;
} }
static void thermal_zone_device_reset(struct thermal_zone_device *tz)
{
tz->passive = 0;
thermal_zone_device_init(tz);
}
void thermal_zone_device_update(struct thermal_zone_device *tz, void thermal_zone_device_update(struct thermal_zone_device *tz,
enum thermal_notify_event event) enum thermal_notify_event event)
{ {
...@@ -1504,7 +1506,7 @@ static int thermal_pm_notify(struct notifier_block *nb, ...@@ -1504,7 +1506,7 @@ static int thermal_pm_notify(struct notifier_block *nb,
case PM_POST_SUSPEND: case PM_POST_SUSPEND:
atomic_set(&in_suspend, 0); atomic_set(&in_suspend, 0);
list_for_each_entry(tz, &thermal_tz_list, node) { list_for_each_entry(tz, &thermal_tz_list, node) {
thermal_zone_device_reset(tz); thermal_zone_device_init(tz);
thermal_zone_device_update(tz, thermal_zone_device_update(tz,
THERMAL_EVENT_UNSPECIFIED); THERMAL_EVENT_UNSPECIFIED);
} }
......
...@@ -712,11 +712,14 @@ cur_state_store(struct device *dev, struct device_attribute *attr, ...@@ -712,11 +712,14 @@ cur_state_store(struct device *dev, struct device_attribute *attr,
if ((long)state < 0) if ((long)state < 0)
return -EINVAL; return -EINVAL;
mutex_lock(&cdev->lock);
result = cdev->ops->set_cur_state(cdev, state); result = cdev->ops->set_cur_state(cdev, state);
if (result) if (!result)
return result;
thermal_cooling_device_stats_update(cdev, state); thermal_cooling_device_stats_update(cdev, state);
return count;
mutex_unlock(&cdev->lock);
return result ? result : count;
} }
static struct device_attribute static struct device_attribute
......
...@@ -207,8 +207,7 @@ MODULE_DEVICE_TABLE(of, zx2967_thermal_id_table); ...@@ -207,8 +207,7 @@ MODULE_DEVICE_TABLE(of, zx2967_thermal_id_table);
#ifdef CONFIG_PM_SLEEP #ifdef CONFIG_PM_SLEEP
static int zx2967_thermal_suspend(struct device *dev) static int zx2967_thermal_suspend(struct device *dev)
{ {
struct platform_device *pdev = to_platform_device(dev); struct zx2967_thermal_priv *priv = dev_get_drvdata(dev);
struct zx2967_thermal_priv *priv = platform_get_drvdata(pdev);
if (priv && priv->clk_topcrm) if (priv && priv->clk_topcrm)
clk_disable_unprepare(priv->clk_topcrm); clk_disable_unprepare(priv->clk_topcrm);
...@@ -221,8 +220,7 @@ static int zx2967_thermal_suspend(struct device *dev) ...@@ -221,8 +220,7 @@ static int zx2967_thermal_suspend(struct device *dev)
static int zx2967_thermal_resume(struct device *dev) static int zx2967_thermal_resume(struct device *dev)
{ {
struct platform_device *pdev = to_platform_device(dev); struct zx2967_thermal_priv *priv = dev_get_drvdata(dev);
struct zx2967_thermal_priv *priv = platform_get_drvdata(pdev);
int error; int error;
error = clk_prepare_enable(priv->clk_topcrm); error = clk_prepare_enable(priv->clk_topcrm);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment