Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
166d017d
Commit
166d017d
authored
Mar 05, 2024
by
Rafael J. Wysocki
Browse files
Options
Browse Files
Download
Plain Diff
Merge thermal core changes for 6.9 to satisfy a dependency.
parents
f1f0c445
32abd250
Changes
28
Hide whitespace changes
Inline
Side-by-side
Showing
28 changed files
with
214 additions
and
330 deletions
+214
-330
arch/arm/configs/imx_v6_v7_defconfig
arch/arm/configs/imx_v6_v7_defconfig
+0
-1
drivers/acpi/thermal.c
drivers/acpi/thermal.c
+22
-39
drivers/net/ethernet/chelsio/cxgb4/cxgb4_thermal.c
drivers/net/ethernet/chelsio/cxgb4/cxgb4_thermal.c
+1
-1
drivers/net/ethernet/mellanox/mlxsw/core_thermal.c
drivers/net/ethernet/mellanox/mlxsw/core_thermal.c
+6
-6
drivers/net/wireless/intel/iwlwifi/mvm/tt.c
drivers/net/wireless/intel/iwlwifi/mvm/tt.c
+1
-4
drivers/platform/x86/acerhdf.c
drivers/platform/x86/acerhdf.c
+1
-1
drivers/thermal/Kconfig
drivers/thermal/Kconfig
+0
-11
drivers/thermal/da9062-thermal.c
drivers/thermal/da9062-thermal.c
+1
-1
drivers/thermal/imx_thermal.c
drivers/thermal/imx_thermal.c
+4
-2
drivers/thermal/intel/Kconfig
drivers/thermal/intel/Kconfig
+0
-2
drivers/thermal/intel/int340x_thermal/int340x_thermal_zone.c
drivers/thermal/intel/int340x_thermal/int340x_thermal_zone.c
+11
-29
drivers/thermal/intel/int340x_thermal/int340x_thermal_zone.h
drivers/thermal/intel/int340x_thermal/int340x_thermal_zone.h
+0
-2
drivers/thermal/intel/int340x_thermal/processor_thermal_device_pci.c
...rmal/intel/int340x_thermal/processor_thermal_device_pci.c
+6
-6
drivers/thermal/intel/intel_pch_thermal.c
drivers/thermal/intel/intel_pch_thermal.c
+15
-13
drivers/thermal/intel/intel_quark_dts_thermal.c
drivers/thermal/intel/intel_quark_dts_thermal.c
+13
-21
drivers/thermal/intel/intel_soc_dts_iosf.c
drivers/thermal/intel/intel_soc_dts_iosf.c
+31
-46
drivers/thermal/intel/intel_soc_dts_iosf.h
drivers/thermal/intel/intel_soc_dts_iosf.h
+0
-2
drivers/thermal/intel/x86_pkg_temp_thermal.c
drivers/thermal/intel/x86_pkg_temp_thermal.c
+14
-25
drivers/thermal/rcar_thermal.c
drivers/thermal/rcar_thermal.c
+1
-1
drivers/thermal/st/st_thermal.c
drivers/thermal/st/st_thermal.c
+1
-1
drivers/thermal/thermal_core.c
drivers/thermal/thermal_core.c
+30
-46
drivers/thermal/thermal_core.h
drivers/thermal/thermal_core.h
+1
-1
drivers/thermal/thermal_helpers.c
drivers/thermal/thermal_helpers.c
+5
-5
drivers/thermal/thermal_hwmon.c
drivers/thermal/thermal_hwmon.c
+2
-2
drivers/thermal/thermal_of.c
drivers/thermal/thermal_of.c
+13
-24
drivers/thermal/thermal_sysfs.c
drivers/thermal/thermal_sysfs.c
+13
-21
drivers/thermal/thermal_trip.c
drivers/thermal/thermal_trip.c
+3
-3
include/linux/thermal.h
include/linux/thermal.h
+19
-14
No files found.
arch/arm/configs/imx_v6_v7_defconfig
View file @
166d017d
...
...
@@ -228,7 +228,6 @@ CONFIG_SENSORS_IIO_HWMON=y
CONFIG_SENSORS_PWM_FAN=y
CONFIG_SENSORS_SY7636A=y
CONFIG_THERMAL_STATISTICS=y
CONFIG_THERMAL_WRITABLE_TRIPS=y
CONFIG_CPU_THERMAL=y
CONFIG_IMX_THERMAL=y
CONFIG_WATCHDOG=y
...
...
drivers/acpi/thermal.c
View file @
166d017d
...
...
@@ -47,6 +47,8 @@
#define ACPI_THERMAL_TRIP_PASSIVE (-1)
#define ACPI_THERMAL_MAX_NR_TRIPS (ACPI_THERMAL_MAX_ACTIVE + 3)
/*
* This exception is thrown out in two cases:
* 1.An invalid trip point becomes invalid or a valid trip point becomes invalid
...
...
@@ -112,7 +114,6 @@ struct acpi_thermal {
unsigned
long
polling_frequency
;
volatile
u8
zombie
;
struct
acpi_thermal_trips
trips
;
struct
thermal_trip
*
trip_table
;
struct
thermal_zone_device
*
thermal_zone
;
int
kelvin_offset
;
/* in millidegrees */
struct
work_struct
thermal_check_work
;
...
...
@@ -451,26 +452,19 @@ static bool acpi_thermal_init_trip(struct acpi_thermal *tz, int index)
return
false
;
}
static
int
acpi_thermal_get_trip_points
(
struct
acpi_thermal
*
tz
)
static
void
acpi_thermal_get_trip_points
(
struct
acpi_thermal
*
tz
)
{
unsigned
int
count
=
0
;
int
i
;
if
(
acpi_thermal_init_trip
(
tz
,
ACPI_THERMAL_TRIP_PASSIVE
))
count
++
;
acpi_thermal_init_trip
(
tz
,
ACPI_THERMAL_TRIP_PASSIVE
);
for
(
i
=
0
;
i
<
ACPI_THERMAL_MAX_ACTIVE
;
i
++
)
{
if
(
acpi_thermal_init_trip
(
tz
,
i
))
count
++
;
else
if
(
!
acpi_thermal_init_trip
(
tz
,
i
))
break
;
}
while
(
++
i
<
ACPI_THERMAL_MAX_ACTIVE
)
tz
->
trips
.
active
[
i
].
trip
.
temp_dk
=
THERMAL_TEMP_INVALID
;
return
count
;
}
/* sys I/F for generic thermal sysfs support */
...
...
@@ -626,7 +620,7 @@ acpi_thermal_unbind_cooling_device(struct thermal_zone_device *thermal,
return
acpi_thermal_bind_unbind_cdev
(
thermal
,
cdev
,
false
);
}
static
struct
thermal_zone_device_ops
acpi_thermal_zone_ops
=
{
static
const
struct
thermal_zone_device_ops
acpi_thermal_zone_ops
=
{
.
bind
=
acpi_thermal_bind_cooling_device
,
.
unbind
=
acpi_thermal_unbind_cooling_device
,
.
get_temp
=
thermal_get_temp
,
...
...
@@ -662,15 +656,16 @@ static void acpi_thermal_zone_sysfs_remove(struct acpi_thermal *tz)
}
static
int
acpi_thermal_register_thermal_zone
(
struct
acpi_thermal
*
tz
,
const
struct
thermal_trip
*
trip_table
,
unsigned
int
trip_count
,
int
passive_delay
)
{
int
result
;
tz
->
thermal_zone
=
thermal_zone_device_register_with_trips
(
"acpitz"
,
t
z
->
t
rip_table
,
trip_table
,
trip_count
,
0
,
tz
,
tz
,
&
acpi_thermal_zone_ops
,
NULL
,
passive_delay
,
...
...
@@ -823,10 +818,10 @@ static void acpi_thermal_free_thermal_zone(struct acpi_thermal *tz)
static
int
acpi_thermal_add
(
struct
acpi_device
*
device
)
{
struct
thermal_trip
trip_table
[
ACPI_THERMAL_MAX_NR_TRIPS
]
=
{
0
};
struct
acpi_thermal_trip
*
acpi_trip
;
struct
thermal_trip
*
trip
;
struct
acpi_thermal
*
tz
;
unsigned
int
trip_count
;
int
crit_temp
,
hot_temp
;
int
passive_delay
=
0
;
int
result
;
...
...
@@ -848,21 +843,10 @@ static int acpi_thermal_add(struct acpi_device *device)
acpi_thermal_aml_dependency_fix
(
tz
);
/* Get trip points [_CRT, _PSV, etc.] (required). */
trip_count
=
acpi_thermal_get_trip_points
(
tz
);
acpi_thermal_get_trip_points
(
tz
);
crit_temp
=
acpi_thermal_get_critical_trip
(
tz
);
if
(
crit_temp
!=
THERMAL_TEMP_INVALID
)
trip_count
++
;
hot_temp
=
acpi_thermal_get_hot_trip
(
tz
);
if
(
hot_temp
!=
THERMAL_TEMP_INVALID
)
trip_count
++
;
if
(
!
trip_count
)
{
pr_warn
(
FW_BUG
"No valid trip points!
\n
"
);
result
=
-
ENODEV
;
goto
free_memory
;
}
/* Get temperature [_TMP] (required). */
result
=
acpi_thermal_get_temperature
(
tz
);
...
...
@@ -881,13 +865,7 @@ static int acpi_thermal_add(struct acpi_device *device)
acpi_thermal_guess_offset
(
tz
,
crit_temp
);
trip
=
kcalloc
(
trip_count
,
sizeof
(
*
trip
),
GFP_KERNEL
);
if
(
!
trip
)
{
result
=
-
ENOMEM
;
goto
free_memory
;
}
tz
->
trip_table
=
trip
;
trip
=
trip_table
;
if
(
crit_temp
!=
THERMAL_TEMP_INVALID
)
{
trip
->
type
=
THERMAL_TRIP_CRITICAL
;
...
...
@@ -923,9 +901,17 @@ static int acpi_thermal_add(struct acpi_device *device)
trip
++
;
}
result
=
acpi_thermal_register_thermal_zone
(
tz
,
trip_count
,
passive_delay
);
if
(
trip
==
trip_table
)
{
pr_warn
(
FW_BUG
"No valid trip points!
\n
"
);
result
=
-
ENODEV
;
goto
free_memory
;
}
result
=
acpi_thermal_register_thermal_zone
(
tz
,
trip_table
,
trip
-
trip_table
,
passive_delay
);
if
(
result
)
goto
free_
trips
;
goto
free_
memory
;
refcount_set
(
&
tz
->
thermal_check_count
,
3
);
mutex_init
(
&
tz
->
thermal_check_lock
);
...
...
@@ -944,8 +930,6 @@ static int acpi_thermal_add(struct acpi_device *device)
flush_wq:
flush_workqueue
(
acpi_thermal_pm_queue
);
acpi_thermal_unregister_thermal_zone
(
tz
);
free_trips:
kfree
(
tz
->
trip_table
);
free_memory:
acpi_thermal_free_thermal_zone
(
tz
);
...
...
@@ -966,7 +950,6 @@ static void acpi_thermal_remove(struct acpi_device *device)
flush_workqueue
(
acpi_thermal_pm_queue
);
acpi_thermal_unregister_thermal_zone
(
tz
);
kfree
(
tz
->
trip_table
);
acpi_thermal_free_thermal_zone
(
tz
);
}
...
...
drivers/net/ethernet/chelsio/cxgb4/cxgb4_thermal.c
View file @
166d017d
...
...
@@ -60,7 +60,7 @@ int cxgb4_thermal_init(struct adapter *adap)
snprintf
(
ch_tz_name
,
sizeof
(
ch_tz_name
),
"cxgb4_%s"
,
adap
->
name
);
ch_thermal
->
tzdev
=
thermal_zone_device_register_with_trips
(
ch_tz_name
,
&
trip
,
num_trip
,
0
,
adap
,
adap
,
&
cxgb4_thermal_ops
,
NULL
,
0
,
0
);
if
(
IS_ERR
(
ch_thermal
->
tzdev
))
{
...
...
drivers/net/ethernet/mellanox/mlxsw/core_thermal.c
View file @
166d017d
...
...
@@ -44,16 +44,19 @@ static const struct thermal_trip default_thermal_trips[] = {
.
type
=
THERMAL_TRIP_ACTIVE
,
.
temperature
=
MLXSW_THERMAL_ASIC_TEMP_NORM
,
.
hysteresis
=
MLXSW_THERMAL_HYSTERESIS_TEMP
,
.
flags
=
THERMAL_TRIP_FLAG_RW_TEMP
,
},
{
/* In range - 40-100% PWM */
.
type
=
THERMAL_TRIP_ACTIVE
,
.
temperature
=
MLXSW_THERMAL_ASIC_TEMP_HIGH
,
.
hysteresis
=
MLXSW_THERMAL_HYSTERESIS_TEMP
,
.
flags
=
THERMAL_TRIP_FLAG_RW_TEMP
,
},
{
/* Warning */
.
type
=
THERMAL_TRIP_HOT
,
.
temperature
=
MLXSW_THERMAL_ASIC_TEMP_HOT
,
.
flags
=
THERMAL_TRIP_FLAG_RW_TEMP
,
},
};
...
...
@@ -62,16 +65,19 @@ static const struct thermal_trip default_thermal_module_trips[] = {
.
type
=
THERMAL_TRIP_ACTIVE
,
.
temperature
=
MLXSW_THERMAL_MODULE_TEMP_NORM
,
.
hysteresis
=
MLXSW_THERMAL_HYSTERESIS_TEMP
,
.
flags
=
THERMAL_TRIP_FLAG_RW_TEMP
,
},
{
/* In range - 40-100% PWM */
.
type
=
THERMAL_TRIP_ACTIVE
,
.
temperature
=
MLXSW_THERMAL_MODULE_TEMP_HIGH
,
.
hysteresis
=
MLXSW_THERMAL_HYSTERESIS_TEMP
,
.
flags
=
THERMAL_TRIP_FLAG_RW_TEMP
,
},
{
/* Warning */
.
type
=
THERMAL_TRIP_HOT
,
.
temperature
=
MLXSW_THERMAL_MODULE_TEMP_HOT
,
.
flags
=
THERMAL_TRIP_FLAG_RW_TEMP
,
},
};
...
...
@@ -92,9 +98,6 @@ static const struct mlxsw_cooling_states default_cooling_states[] = {
#define MLXSW_THERMAL_NUM_TRIPS ARRAY_SIZE(default_thermal_trips)
/* Make sure all trips are writable */
#define MLXSW_THERMAL_TRIP_MASK (BIT(MLXSW_THERMAL_NUM_TRIPS) - 1)
struct
mlxsw_thermal
;
struct
mlxsw_thermal_module
{
...
...
@@ -420,7 +423,6 @@ mlxsw_thermal_module_tz_init(struct mlxsw_thermal_module *module_tz)
module_tz
->
tzdev
=
thermal_zone_device_register_with_trips
(
tz_name
,
module_tz
->
trips
,
MLXSW_THERMAL_NUM_TRIPS
,
MLXSW_THERMAL_TRIP_MASK
,
module_tz
,
&
mlxsw_thermal_module_ops
,
&
mlxsw_thermal_params
,
...
...
@@ -548,7 +550,6 @@ mlxsw_thermal_gearbox_tz_init(struct mlxsw_thermal_module *gearbox_tz)
gearbox_tz
->
tzdev
=
thermal_zone_device_register_with_trips
(
tz_name
,
gearbox_tz
->
trips
,
MLXSW_THERMAL_NUM_TRIPS
,
MLXSW_THERMAL_TRIP_MASK
,
gearbox_tz
,
&
mlxsw_thermal_gearbox_ops
,
&
mlxsw_thermal_params
,
0
,
...
...
@@ -773,7 +774,6 @@ int mlxsw_thermal_init(struct mlxsw_core *core,
thermal
->
tzdev
=
thermal_zone_device_register_with_trips
(
"mlxsw"
,
thermal
->
trips
,
MLXSW_THERMAL_NUM_TRIPS
,
MLXSW_THERMAL_TRIP_MASK
,
thermal
,
&
mlxsw_thermal_ops
,
&
mlxsw_thermal_params
,
0
,
...
...
drivers/net/wireless/intel/iwlwifi/mvm/tt.c
View file @
166d017d
...
...
@@ -667,9 +667,6 @@ static struct thermal_zone_device_ops tzone_ops = {
.
set_trip_temp
=
iwl_mvm_tzone_set_trip_temp
,
};
/* make all trips writable */
#define IWL_WRITABLE_TRIPS_MSK (BIT(IWL_MAX_DTS_TRIPS) - 1)
static
void
iwl_mvm_thermal_zone_register
(
struct
iwl_mvm
*
mvm
)
{
int
i
,
ret
;
...
...
@@ -692,11 +689,11 @@ static void iwl_mvm_thermal_zone_register(struct iwl_mvm *mvm)
for
(
i
=
0
;
i
<
IWL_MAX_DTS_TRIPS
;
i
++
)
{
mvm
->
tz_device
.
trips
[
i
].
temperature
=
THERMAL_TEMP_INVALID
;
mvm
->
tz_device
.
trips
[
i
].
type
=
THERMAL_TRIP_PASSIVE
;
mvm
->
tz_device
.
trips
[
i
].
flags
=
THERMAL_TRIP_FLAG_RW_TEMP
;
}
mvm
->
tz_device
.
tzone
=
thermal_zone_device_register_with_trips
(
name
,
mvm
->
tz_device
.
trips
,
IWL_MAX_DTS_TRIPS
,
IWL_WRITABLE_TRIPS_MSK
,
mvm
,
&
tzone_ops
,
NULL
,
0
,
0
);
if
(
IS_ERR
(
mvm
->
tz_device
.
tzone
))
{
...
...
drivers/platform/x86/acerhdf.c
View file @
166d017d
...
...
@@ -678,7 +678,7 @@ static int __init acerhdf_register_thermal(void)
return
-
EINVAL
;
thz_dev
=
thermal_zone_device_register_with_trips
(
"acerhdf"
,
trips
,
ARRAY_SIZE
(
trips
),
0
,
NULL
,
&
acerhdf_dev_ops
,
NULL
,
&
acerhdf_dev_ops
,
&
acerhdf_zone_params
,
0
,
(
kernelmode
)
?
interval
*
1000
:
0
);
if
(
IS_ERR
(
thz_dev
))
...
...
drivers/thermal/Kconfig
View file @
166d017d
...
...
@@ -83,17 +83,6 @@ config THERMAL_OF
Say 'Y' here if you need to build thermal infrastructure
based on device tree.
config THERMAL_WRITABLE_TRIPS
bool "Enable writable trip points"
help
This option allows the system integrator to choose whether
trip temperatures can be changed from userspace. The
writable trips need to be specified when setting up the
thermal zone but the choice here takes precedence.
Say 'Y' here if you would like to allow userspace tools to
change trip temperatures.
choice
prompt "Default Thermal governor"
default THERMAL_DEFAULT_GOV_STEP_WISE
...
...
drivers/thermal/da9062-thermal.c
View file @
166d017d
...
...
@@ -197,7 +197,7 @@ static int da9062_thermal_probe(struct platform_device *pdev)
mutex_init
(
&
thermal
->
lock
);
thermal
->
zone
=
thermal_zone_device_register_with_trips
(
thermal
->
config
->
name
,
trips
,
ARRAY_SIZE
(
trips
),
0
,
thermal
,
trips
,
ARRAY_SIZE
(
trips
),
thermal
,
&
da9062_thermal_ops
,
NULL
,
pp_tmp
,
0
);
if
(
IS_ERR
(
thermal
->
zone
))
{
...
...
drivers/thermal/imx_thermal.c
View file @
166d017d
...
...
@@ -115,7 +115,8 @@ struct thermal_soc_data {
};
static
struct
thermal_trip
trips
[]
=
{
[
IMX_TRIP_PASSIVE
]
=
{
.
type
=
THERMAL_TRIP_PASSIVE
},
[
IMX_TRIP_PASSIVE
]
=
{
.
type
=
THERMAL_TRIP_PASSIVE
,
.
flags
=
THERMAL_TRIP_FLAG_RW_TEMP
},
[
IMX_TRIP_CRITICAL
]
=
{
.
type
=
THERMAL_TRIP_CRITICAL
},
};
...
...
@@ -354,6 +355,7 @@ static int imx_set_trip_temp(struct thermal_zone_device *tz, int trip_id,
return
-
EINVAL
;
imx_set_alarm_temp
(
data
,
temp
);
trips
[
IMX_TRIP_PASSIVE
].
temperature
=
temp
;
pm_runtime_put
(
data
->
dev
);
...
...
@@ -699,7 +701,7 @@ static int imx_thermal_probe(struct platform_device *pdev)
data
->
tz
=
thermal_zone_device_register_with_trips
(
"imx_thermal_zone"
,
trips
,
ARRAY_SIZE
(
trips
),
BIT
(
IMX_TRIP_PASSIVE
),
data
,
data
,
&
imx_tz_ops
,
NULL
,
IMX_PASSIVE_DELAY
,
IMX_POLLING_DELAY
);
...
...
drivers/thermal/intel/Kconfig
View file @
166d017d
...
...
@@ -23,7 +23,6 @@ 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
select INTEL_TCC
default m
help
...
...
@@ -47,7 +46,6 @@ 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
...
...
drivers/thermal/intel/int340x_thermal/int340x_thermal_zone.c
View file @
166d017d
...
...
@@ -61,12 +61,6 @@ static void int340x_thermal_critical(struct thermal_zone_device *zone)
dev_dbg
(
&
zone
->
device
,
"%s: critical temperature reached
\n
"
,
zone
->
type
);
}
static
struct
thermal_zone_device_ops
int340x_thermal_zone_ops
=
{
.
get_temp
=
int340x_thermal_get_zone_temp
,
.
set_trip_temp
=
int340x_thermal_set_trip_temp
,
.
critical
=
int340x_thermal_critical
,
};
static
inline
void
*
int_to_trip_priv
(
int
i
)
{
return
(
void
*
)(
long
)
i
;
...
...
@@ -126,11 +120,15 @@ static struct thermal_zone_params int340x_thermal_params = {
struct
int34x_thermal_zone
*
int340x_thermal_zone_add
(
struct
acpi_device
*
adev
,
int
(
*
get_temp
)
(
struct
thermal_zone_device
*
,
int
*
))
{
const
struct
thermal_zone_device_ops
zone_ops
=
{
.
set_trip_temp
=
int340x_thermal_set_trip_temp
,
.
critical
=
int340x_thermal_critical
,
.
get_temp
=
get_temp
?
get_temp
:
int340x_thermal_get_zone_temp
,
};
struct
int34x_thermal_zone
*
int34x_zone
;
struct
thermal_trip
*
zone_trips
;
unsigned
long
long
trip_cnt
=
0
;
unsigned
long
long
hyst
;
int
trip_mask
=
0
;
acpi_status
status
;
int
i
,
ret
;
...
...
@@ -140,21 +138,9 @@ struct int34x_thermal_zone *int340x_thermal_zone_add(struct acpi_device *adev,
int34x_zone
->
adev
=
adev
;
int34x_zone
->
ops
=
kmemdup
(
&
int340x_thermal_zone_ops
,
sizeof
(
int340x_thermal_zone_ops
),
GFP_KERNEL
);
if
(
!
int34x_zone
->
ops
)
{
ret
=
-
ENOMEM
;
goto
err_ops_alloc
;
}
if
(
get_temp
)
int34x_zone
->
ops
->
get_temp
=
get_temp
;
status
=
acpi_evaluate_integer
(
adev
->
handle
,
"PATC"
,
NULL
,
&
trip_cnt
);
if
(
ACPI_SUCCESS
(
status
))
{
if
(
ACPI_SUCCESS
(
status
))
int34x_zone
->
aux_trip_nr
=
trip_cnt
;
trip_mask
=
BIT
(
trip_cnt
)
-
1
;
}
zone_trips
=
kzalloc
(
sizeof
(
*
zone_trips
)
*
(
trip_cnt
+
INT340X_THERMAL_MAX_TRIP_COUNT
),
GFP_KERNEL
);
...
...
@@ -166,6 +152,7 @@ struct int34x_thermal_zone *int340x_thermal_zone_add(struct acpi_device *adev,
for
(
i
=
0
;
i
<
trip_cnt
;
i
++
)
{
zone_trips
[
i
].
type
=
THERMAL_TRIP_PASSIVE
;
zone_trips
[
i
].
temperature
=
THERMAL_TEMP_INVALID
;
zone_trips
[
i
].
flags
|=
THERMAL_TRIP_FLAG_RW_TEMP
;
}
trip_cnt
=
int340x_thermal_read_trips
(
adev
,
zone_trips
,
trip_cnt
);
...
...
@@ -179,17 +166,17 @@ struct int34x_thermal_zone *int340x_thermal_zone_add(struct acpi_device *adev,
for
(
i
=
0
;
i
<
trip_cnt
;
++
i
)
zone_trips
[
i
].
hysteresis
=
hyst
;
int34x_zone
->
trips
=
zone_trips
;
int34x_zone
->
lpat_table
=
acpi_lpat_get_conversion_table
(
adev
->
handle
);
int34x_zone
->
zone
=
thermal_zone_device_register_with_trips
(
acpi_device_bid
(
adev
),
zone_trips
,
trip_cnt
,
trip_mask
,
int34x_zone
,
int34x_zone
->
ops
,
int34x_zone
,
&
zone_
ops
,
&
int340x_thermal_params
,
0
,
0
);
kfree
(
zone_trips
);
if
(
IS_ERR
(
int34x_zone
->
zone
))
{
ret
=
PTR_ERR
(
int34x_zone
->
zone
);
goto
err_thermal_zone
;
...
...
@@ -203,11 +190,8 @@ struct int34x_thermal_zone *int340x_thermal_zone_add(struct acpi_device *adev,
err_enable:
thermal_zone_device_unregister
(
int34x_zone
->
zone
);
err_thermal_zone:
kfree
(
int34x_zone
->
trips
);
acpi_lpat_free_conversion_table
(
int34x_zone
->
lpat_table
);
err_trips_alloc:
kfree
(
int34x_zone
->
ops
);
err_ops_alloc:
kfree
(
int34x_zone
);
return
ERR_PTR
(
ret
);
}
...
...
@@ -217,8 +201,6 @@ void int340x_thermal_zone_remove(struct int34x_thermal_zone *int34x_zone)
{
thermal_zone_device_unregister
(
int34x_zone
->
zone
);
acpi_lpat_free_conversion_table
(
int34x_zone
->
lpat_table
);
kfree
(
int34x_zone
->
trips
);
kfree
(
int34x_zone
->
ops
);
kfree
(
int34x_zone
);
}
EXPORT_SYMBOL_GPL
(
int340x_thermal_zone_remove
);
...
...
drivers/thermal/intel/int340x_thermal/int340x_thermal_zone.h
View file @
166d017d
...
...
@@ -20,10 +20,8 @@ struct active_trip {
struct
int34x_thermal_zone
{
struct
acpi_device
*
adev
;
struct
thermal_trip
*
trips
;
int
aux_trip_nr
;
struct
thermal_zone_device
*
zone
;
struct
thermal_zone_device_ops
*
ops
;
void
*
priv_data
;
struct
acpi_lpat_conversion_table
*
lpat_table
;
};
...
...
drivers/thermal/intel/int340x_thermal/processor_thermal_device_pci.c
View file @
166d017d
...
...
@@ -233,11 +233,7 @@ static int get_trip_temp(struct proc_thermal_pci *pci_info)
return
temp
;
}
static
struct
thermal_trip
psv_trip
=
{
.
type
=
THERMAL_TRIP_PASSIVE
,
};
static
struct
thermal_zone_device_ops
tzone_ops
=
{
static
const
struct
thermal_zone_device_ops
tzone_ops
=
{
.
get_temp
=
sys_get_curr_temp
,
.
set_trip_temp
=
sys_set_trip_temp
,
};
...
...
@@ -251,6 +247,10 @@ static int proc_thermal_pci_probe(struct pci_dev *pdev, const struct pci_device_
{
struct
proc_thermal_device
*
proc_priv
;
struct
proc_thermal_pci
*
pci_info
;
struct
thermal_trip
psv_trip
=
{
.
type
=
THERMAL_TRIP_PASSIVE
,
.
flags
=
THERMAL_TRIP_FLAG_RW_TEMP
,
};
int
irq_flag
=
0
,
irq
,
ret
;
bool
msi_irq
=
false
;
...
...
@@ -290,7 +290,7 @@ static int proc_thermal_pci_probe(struct pci_dev *pdev, const struct pci_device_
psv_trip
.
temperature
=
get_trip_temp
(
pci_info
);
pci_info
->
tzone
=
thermal_zone_device_register_with_trips
(
"TCPU_PCI"
,
&
psv_trip
,
1
,
1
,
pci_info
,
1
,
pci_info
,
&
tzone_ops
,
&
tzone_params
,
0
,
0
);
if
(
IS_ERR
(
pci_info
->
tzone
))
{
...
...
drivers/thermal/intel/intel_pch_thermal.c
View file @
166d017d
...
...
@@ -84,7 +84,6 @@ struct pch_thermal_device {
void
__iomem
*
hw_base
;
struct
pci_dev
*
pdev
;
struct
thermal_zone_device
*
tzd
;
struct
thermal_trip
trips
[
PCH_MAX_TRIPS
];
bool
bios_enabled
;
};
...
...
@@ -94,7 +93,8 @@ struct pch_thermal_device {
* passive trip temperature using _PSV method. There is no specific
* passive temperature setting in MMIO interface of this PCI device.
*/
static
int
pch_wpt_add_acpi_psv_trip
(
struct
pch_thermal_device
*
ptd
,
int
trip
)
static
int
pch_wpt_add_acpi_psv_trip
(
struct
pch_thermal_device
*
ptd
,
struct
thermal_trip
*
trip
)
{
struct
acpi_device
*
adev
;
int
temp
;
...
...
@@ -106,12 +106,13 @@ static int pch_wpt_add_acpi_psv_trip(struct pch_thermal_device *ptd, int trip)
if
(
thermal_acpi_passive_trip_temp
(
adev
,
&
temp
)
||
temp
<=
0
)
return
0
;
ptd
->
trips
[
trip
].
type
=
THERMAL_TRIP_PASSIVE
;
ptd
->
trips
[
trip
].
temperature
=
temp
;
trip
->
type
=
THERMAL_TRIP_PASSIVE
;
trip
->
temperature
=
temp
;
return
1
;
}
#else
static
int
pch_wpt_add_acpi_psv_trip
(
struct
pch_thermal_device
*
ptd
,
int
trip
)
static
int
pch_wpt_add_acpi_psv_trip
(
struct
pch_thermal_device
*
ptd
,
struct
thermal_trip
*
trip
)
{
return
0
;
}
...
...
@@ -131,7 +132,7 @@ static void pch_critical(struct thermal_zone_device *tzd)
thermal_zone_device_type
(
tzd
));
}
static
struct
thermal_zone_device_ops
tzd_ops
=
{
static
const
struct
thermal_zone_device_ops
tzd_ops
=
{
.
get_temp
=
pch_thermal_get_temp
,
.
critical
=
pch_critical
,
};
...
...
@@ -159,6 +160,7 @@ static const char *board_names[] = {
static
int
intel_pch_thermal_probe
(
struct
pci_dev
*
pdev
,
const
struct
pci_device_id
*
id
)
{
struct
thermal_trip
ptd_trips
[
PCH_MAX_TRIPS
]
=
{
0
};
enum
pch_board_ids
board_id
=
id
->
driver_data
;
struct
pch_thermal_device
*
ptd
;
int
nr_trips
=
0
;
...
...
@@ -220,22 +222,22 @@ static int intel_pch_thermal_probe(struct pci_dev *pdev,
trip_temp
=
readw
(
ptd
->
hw_base
+
WPT_CTT
);
trip_temp
&=
0x1FF
;
if
(
trip_temp
)
{
ptd
->
trips
[
nr_trips
].
temperature
=
GET_WPT_TEMP
(
trip_temp
);
ptd
->
trips
[
nr_trips
++
].
type
=
THERMAL_TRIP_CRITICAL
;
ptd
_
trips
[
nr_trips
].
temperature
=
GET_WPT_TEMP
(
trip_temp
);
ptd
_
trips
[
nr_trips
++
].
type
=
THERMAL_TRIP_CRITICAL
;
}
trip_temp
=
readw
(
ptd
->
hw_base
+
WPT_PHL
);
trip_temp
&=
0x1FF
;
if
(
trip_temp
)
{
ptd
->
trips
[
nr_trips
].
temperature
=
GET_WPT_TEMP
(
trip_temp
);
ptd
->
trips
[
nr_trips
++
].
type
=
THERMAL_TRIP_HOT
;
ptd
_
trips
[
nr_trips
].
temperature
=
GET_WPT_TEMP
(
trip_temp
);
ptd
_
trips
[
nr_trips
++
].
type
=
THERMAL_TRIP_HOT
;
}
nr_trips
+=
pch_wpt_add_acpi_psv_trip
(
ptd
,
nr_trips
);
nr_trips
+=
pch_wpt_add_acpi_psv_trip
(
ptd
,
&
ptd_trips
[
nr_trips
]
);
ptd
->
tzd
=
thermal_zone_device_register_with_trips
(
board_names
[
board_id
],
ptd
->
trips
,
nr_trips
,
0
,
ptd
,
&
tzd_ops
,
ptd
_
trips
,
nr_trips
,
ptd
,
&
tzd_ops
,
NULL
,
0
,
0
);
if
(
IS_ERR
(
ptd
->
tzd
))
{
dev_err
(
&
pdev
->
dev
,
"Failed to register thermal zone %s
\n
"
,
...
...
drivers/thermal/intel/intel_quark_dts_thermal.c
View file @
166d017d
...
...
@@ -93,10 +93,6 @@
/* Quark DTS has 2 trip points: hot & catastrophic */
#define QRK_MAX_DTS_TRIPS 2
/* If DTS not locked, all trip points are configurable */
#define QRK_DTS_WR_MASK_SET 0x3
/* If DTS locked, all trip points are not configurable */
#define QRK_DTS_WR_MASK_CLR 0
#define DEFAULT_POLL_DELAY 2000
...
...
@@ -105,7 +101,6 @@ struct soc_sensor_entry {
u32
store_ptps
;
u32
store_dts_enable
;
struct
thermal_zone_device
*
tzone
;
struct
thermal_trip
trips
[
QRK_MAX_DTS_TRIPS
];
};
static
struct
soc_sensor_entry
*
soc_dts
;
...
...
@@ -293,7 +288,7 @@ static int sys_change_mode(struct thermal_zone_device *tzd,
return
ret
;
}
static
struct
thermal_zone_device_ops
tzone_ops
=
{
static
const
struct
thermal_zone_device_ops
tzone_ops
=
{
.
get_temp
=
sys_get_curr_temp
,
.
set_trip_temp
=
sys_set_trip_temp
,
.
change_mode
=
sys_change_mode
,
...
...
@@ -320,10 +315,10 @@ static void free_soc_dts(struct soc_sensor_entry *aux_entry)
static
struct
soc_sensor_entry
*
alloc_soc_dts
(
void
)
{
struct
thermal_trip
trips
[
QRK_MAX_DTS_TRIPS
]
=
{
0
};
struct
soc_sensor_entry
*
aux_entry
;
int
err
;
u32
out
;
int
wr_mask
;
aux_entry
=
kzalloc
(
sizeof
(
*
aux_entry
),
GFP_KERNEL
);
if
(
!
aux_entry
)
{
...
...
@@ -337,13 +332,7 @@ static struct soc_sensor_entry *alloc_soc_dts(void)
if
(
err
)
goto
err_ret
;
if
(
out
&
QRK_DTS_LOCK_BIT
)
{
aux_entry
->
locked
=
true
;
wr_mask
=
QRK_DTS_WR_MASK_CLR
;
}
else
{
aux_entry
->
locked
=
false
;
wr_mask
=
QRK_DTS_WR_MASK_SET
;
}
aux_entry
->
locked
=
!!
(
out
&
QRK_DTS_LOCK_BIT
);
/* Store DTS default state if DTS registers are not locked */
if
(
!
aux_entry
->
locked
)
{
...
...
@@ -360,19 +349,22 @@ static struct soc_sensor_entry *alloc_soc_dts(void)
&
aux_entry
->
store_ptps
);
if
(
err
)
goto
err_ret
;
trips
[
QRK_DTS_ID_TP_CRITICAL
].
flags
|=
THERMAL_TRIP_FLAG_RW_TEMP
;
trips
[
QRK_DTS_ID_TP_HOT
].
flags
|=
THERMAL_TRIP_FLAG_RW_TEMP
;
}
aux_entry
->
trips
[
QRK_DTS_ID_TP_CRITICAL
].
temperature
=
get_trip_temp
(
QRK_DTS_ID_TP_CRITICAL
);
aux_entry
->
trips
[
QRK_DTS_ID_TP_CRITICAL
].
type
=
THERMAL_TRIP_CRITICAL
;
trips
[
QRK_DTS_ID_TP_CRITICAL
].
temperature
=
get_trip_temp
(
QRK_DTS_ID_TP_CRITICAL
);
trips
[
QRK_DTS_ID_TP_CRITICAL
].
type
=
THERMAL_TRIP_CRITICAL
;
aux_entry
->
trips
[
QRK_DTS_ID_TP_HOT
].
temperature
=
get_trip_temp
(
QRK_DTS_ID_TP_HOT
);
aux_entry
->
trips
[
QRK_DTS_ID_TP_HOT
].
type
=
THERMAL_TRIP_HOT
;
trips
[
QRK_DTS_ID_TP_HOT
].
temperature
=
get_trip_temp
(
QRK_DTS_ID_TP_HOT
);
trips
[
QRK_DTS_ID_TP_HOT
].
type
=
THERMAL_TRIP_HOT
;
aux_entry
->
tzone
=
thermal_zone_device_register_with_trips
(
"quark_dts"
,
aux_entry
->
trips
,
trips
,
QRK_MAX_DTS_TRIPS
,
wr_mask
,
aux_entry
,
&
tzone_ops
,
aux_entry
,
&
tzone_ops
,
NULL
,
0
,
polling_delay
);
if
(
IS_ERR
(
aux_entry
->
tzone
))
{
err
=
PTR_ERR
(
aux_entry
->
tzone
);
...
...
drivers/thermal/intel/intel_soc_dts_iosf.c
View file @
166d017d
...
...
@@ -129,22 +129,6 @@ static int update_trip_temp(struct intel_soc_dts_sensors *sensors,
return
status
;
}
static
int
configure_trip
(
struct
intel_soc_dts_sensor_entry
*
dts
,
int
thres_index
,
enum
thermal_trip_type
trip_type
,
int
temp
)
{
int
ret
;
ret
=
update_trip_temp
(
dts
->
sensors
,
thres_index
,
temp
);
if
(
ret
)
return
ret
;
dts
->
trips
[
thres_index
].
temperature
=
temp
;
dts
->
trips
[
thres_index
].
type
=
trip_type
;
return
0
;
}
static
int
sys_set_trip_temp
(
struct
thermal_zone_device
*
tzd
,
int
trip
,
int
temp
)
{
...
...
@@ -184,7 +168,7 @@ static int sys_get_curr_temp(struct thermal_zone_device *tzd,
return
0
;
}
static
struct
thermal_zone_device_ops
tzone_ops
=
{
static
const
struct
thermal_zone_device_ops
tzone_ops
=
{
.
get_temp
=
sys_get_curr_temp
,
.
set_trip_temp
=
sys_set_trip_temp
,
};
...
...
@@ -218,15 +202,10 @@ static void remove_dts_thermal_zone(struct intel_soc_dts_sensor_entry *dts)
}
static
int
add_dts_thermal_zone
(
int
id
,
struct
intel_soc_dts_sensor_entry
*
dts
,
bool
critical_trip
)
struct
thermal_trip
*
trips
)
{
int
writable_trip_cnt
=
SOC_MAX_DTS_TRIPS
;
char
name
[
10
];
unsigned
long
trip
;
int
trip_mask
;
unsigned
long
ptps
;
u32
store_ptps
;
unsigned
long
i
;
int
ret
;
/* Store status to restor on exit */
...
...
@@ -237,26 +216,20 @@ static int add_dts_thermal_zone(int id, struct intel_soc_dts_sensor_entry *dts,
dts
->
id
=
id
;
if
(
critical_trip
)
writable_trip_cnt
--
;
trip_mask
=
GENMASK
(
writable_trip_cnt
-
1
,
0
);
/* Check if the writable trip we provide is not used by BIOS */
ret
=
iosf_mbi_read
(
BT_MBI_UNIT_PMC
,
MBI_REG_READ
,
SOC_DTS_OFFSET_PTPS
,
&
store_ptps
);
if
(
ret
)
trip_mask
=
0
;
else
{
ptps
=
store_ptps
;
for_each_set_clump8
(
i
,
trip
,
&
ptps
,
writable_trip_cnt
*
8
)
trip_mask
&=
~
BIT
(
i
/
8
);
if
(
!
ret
)
{
int
i
;
for
(
i
=
0
;
i
<=
1
;
i
++
)
{
if
(
store_ptps
&
(
0xFFU
<<
i
*
8
))
trips
[
i
].
flags
&=
~
THERMAL_TRIP_FLAG_RW_TEMP
;
}
}
dts
->
trip_mask
=
trip_mask
;
snprintf
(
name
,
sizeof
(
name
),
"soc_dts%d"
,
id
);
dts
->
tzone
=
thermal_zone_device_register_with_trips
(
name
,
dts
->
trips
,
dts
->
tzone
=
thermal_zone_device_register_with_trips
(
name
,
trips
,
SOC_MAX_DTS_TRIPS
,
trip_mask
,
dts
,
&
tzone_ops
,
NULL
,
0
,
0
);
if
(
IS_ERR
(
dts
->
tzone
))
{
...
...
@@ -315,14 +288,23 @@ EXPORT_SYMBOL_GPL(intel_soc_dts_iosf_interrupt_handler);
static
void
dts_trips_reset
(
struct
intel_soc_dts_sensors
*
sensors
,
int
dts_index
)
{
configure_trip
(
&
sensors
->
soc_dts
[
dts_index
],
0
,
0
,
0
);
configure_trip
(
&
sensors
->
soc_dts
[
dts_index
],
1
,
0
,
0
);
update_trip_temp
(
sensors
,
0
,
0
);
update_trip_temp
(
sensors
,
1
,
0
);
}
static
void
set_trip
(
struct
thermal_trip
*
trip
,
enum
thermal_trip_type
type
,
u8
flags
,
int
temp
)
{
trip
->
type
=
type
;
trip
->
flags
=
flags
;
trip
->
temperature
=
temp
;
}
struct
intel_soc_dts_sensors
*
intel_soc_dts_iosf_init
(
enum
intel_soc_dts_interrupt_type
intr_type
,
bool
critical_trip
,
int
crit_offset
)
{
struct
thermal_trip
trips
[
SOC_MAX_DTS_SENSORS
][
SOC_MAX_DTS_TRIPS
]
=
{
0
};
struct
intel_soc_dts_sensors
*
sensors
;
int
tj_max
;
int
ret
;
...
...
@@ -345,30 +327,33 @@ intel_soc_dts_iosf_init(enum intel_soc_dts_interrupt_type intr_type,
sensors
->
tj_max
=
tj_max
*
1000
;
for
(
i
=
0
;
i
<
SOC_MAX_DTS_SENSORS
;
++
i
)
{
enum
thermal_trip_type
trip_type
;
int
temp
;
sensors
->
soc_dts
[
i
].
sensors
=
sensors
;
ret
=
configure_trip
(
&
sensors
->
soc_dts
[
i
],
0
,
THERMAL_TRIP_PASSIVE
,
0
);
set_trip
(
&
trips
[
i
][
0
],
THERMAL_TRIP_PASSIVE
,
THERMAL_TRIP_FLAG_RW_TEMP
,
0
);
ret
=
update_trip_temp
(
sensors
,
0
,
0
);
if
(
ret
)
goto
err_reset_trips
;
if
(
critical_trip
)
{
trip_type
=
THERMAL_TRIP_CRITICAL
;
temp
=
sensors
->
tj_max
-
crit_offset
;
set_trip
(
&
trips
[
i
][
1
],
THERMAL_TRIP_CRITICAL
,
0
,
temp
);
}
else
{
trip_type
=
THERMAL_TRIP_PASSIVE
;
set_trip
(
&
trips
[
i
][
1
],
THERMAL_TRIP_PASSIVE
,
THERMAL_TRIP_FLAG_RW_TEMP
,
0
);
temp
=
0
;
}
ret
=
configure_trip
(
&
sensors
->
soc_dts
[
i
],
1
,
trip_type
,
temp
);
ret
=
update_trip_temp
(
sensors
,
1
,
temp
);
if
(
ret
)
goto
err_reset_trips
;
}
for
(
i
=
0
;
i
<
SOC_MAX_DTS_SENSORS
;
++
i
)
{
ret
=
add_dts_thermal_zone
(
i
,
&
sensors
->
soc_dts
[
i
],
critical_trip
);
ret
=
add_dts_thermal_zone
(
i
,
&
sensors
->
soc_dts
[
i
],
trips
[
i
]
);
if
(
ret
)
goto
err_remove_zone
;
}
...
...
drivers/thermal/intel/intel_soc_dts_iosf.h
View file @
166d017d
...
...
@@ -28,8 +28,6 @@ struct intel_soc_dts_sensors;
struct
intel_soc_dts_sensor_entry
{
int
id
;
u32
store_status
;
u32
trip_mask
;
struct
thermal_trip
trips
[
SOC_MAX_DTS_TRIPS
];
struct
thermal_zone_device
*
tzone
;
struct
intel_soc_dts_sensors
*
sensors
;
};
...
...
drivers/thermal/intel/x86_pkg_temp_thermal.c
View file @
166d017d
...
...
@@ -53,7 +53,6 @@ struct zone_device {
u32
msr_pkg_therm_high
;
struct
delayed_work
work
;
struct
thermal_zone_device
*
tzone
;
struct
thermal_trip
*
trips
;
struct
cpumask
cpumask
;
};
...
...
@@ -167,7 +166,7 @@ sys_set_trip_temp(struct thermal_zone_device *tzd, int trip, int temp)
}
/* Thermal zone callback registry */
static
struct
thermal_zone_device_ops
tzone_ops
=
{
static
const
struct
thermal_zone_device_ops
tzone_ops
=
{
.
get_temp
=
sys_get_curr_temp
,
.
set_trip_temp
=
sys_set_trip_temp
,
};
...
...
@@ -268,17 +267,13 @@ static int pkg_thermal_notify(u64 msr_val)
return
0
;
}
static
struct
thermal_trip
*
pkg_temp_thermal_trips_init
(
int
cpu
,
int
tj_max
,
int
num_trips
)
static
int
pkg_temp_thermal_trips_init
(
int
cpu
,
int
tj_max
,
struct
thermal_trip
*
trips
,
int
num_trips
)
{
struct
thermal_trip
*
trips
;
unsigned
long
thres_reg_value
;
u32
mask
,
shift
,
eax
,
edx
;
int
ret
,
i
;
trips
=
kzalloc
(
sizeof
(
*
trips
)
*
num_trips
,
GFP_KERNEL
);
if
(
!
trips
)
return
ERR_PTR
(
-
ENOMEM
);
for
(
i
=
0
;
i
<
num_trips
;
i
++
)
{
if
(
i
)
{
...
...
@@ -291,10 +286,8 @@ static struct thermal_trip *pkg_temp_thermal_trips_init(int cpu, int tj_max, int
ret
=
rdmsr_on_cpu
(
cpu
,
MSR_IA32_PACKAGE_THERM_INTERRUPT
,
&
eax
,
&
edx
);
if
(
ret
<
0
)
{
kfree
(
trips
);
return
ERR_PTR
(
ret
);
}
if
(
ret
<
0
)
return
ret
;
thres_reg_value
=
(
eax
&
mask
)
>>
shift
;
...
...
@@ -302,16 +295,18 @@ static struct thermal_trip *pkg_temp_thermal_trips_init(int cpu, int tj_max, int
tj_max
-
thres_reg_value
*
1000
:
THERMAL_TEMP_INVALID
;
trips
[
i
].
type
=
THERMAL_TRIP_PASSIVE
;
trips
[
i
].
flags
|=
THERMAL_TRIP_FLAG_RW_TEMP
;
pr_debug
(
"%s: cpu=%d, trip=%d, temp=%d
\n
"
,
__func__
,
cpu
,
i
,
trips
[
i
].
temperature
);
}
return
trips
;
return
0
;
}
static
int
pkg_temp_thermal_device_add
(
unsigned
int
cpu
)
{
struct
thermal_trip
trips
[
MAX_NUMBER_OF_TRIPS
]
=
{
0
};
int
id
=
topology_logical_die_id
(
cpu
);
u32
eax
,
ebx
,
ecx
,
edx
;
struct
zone_device
*
zonedev
;
...
...
@@ -336,21 +331,18 @@ static int pkg_temp_thermal_device_add(unsigned int cpu)
if
(
!
zonedev
)
return
-
ENOMEM
;
zonedev
->
trips
=
pkg_temp_thermal_trips_init
(
cpu
,
tj_max
,
thres_count
);
if
(
IS_ERR
(
zonedev
->
trips
))
{
err
=
PTR_ERR
(
zonedev
->
trips
);
err
=
pkg_temp_thermal_trips_init
(
cpu
,
tj_max
,
trips
,
thres_count
);
if
(
err
)
goto
out_kfree_zonedev
;
}
INIT_DELAYED_WORK
(
&
zonedev
->
work
,
pkg_temp_thermal_threshold_work_fn
);
zonedev
->
cpu
=
cpu
;
zonedev
->
tzone
=
thermal_zone_device_register_with_trips
(
"x86_pkg_temp"
,
zonedev
->
trips
,
thres_count
,
(
thres_count
==
MAX_NUMBER_OF_TRIPS
)
?
0x03
:
0x01
,
trips
,
thres_count
,
zonedev
,
&
tzone_ops
,
&
pkg_temp_tz_params
,
0
,
0
);
if
(
IS_ERR
(
zonedev
->
tzone
))
{
err
=
PTR_ERR
(
zonedev
->
tzone
);
goto
out_kfree_
trips
;
goto
out_kfree_
zonedev
;
}
err
=
thermal_zone_device_enable
(
zonedev
->
tzone
);
if
(
err
)
...
...
@@ -369,8 +361,6 @@ static int pkg_temp_thermal_device_add(unsigned int cpu)
out_unregister_tz:
thermal_zone_device_unregister
(
zonedev
->
tzone
);
out_kfree_trips:
kfree
(
zonedev
->
trips
);
out_kfree_zonedev:
kfree
(
zonedev
);
return
err
;
...
...
@@ -457,10 +447,9 @@ static int pkg_thermal_cpu_offline(unsigned int cpu)
raw_spin_unlock_irq
(
&
pkg_temp_lock
);
/* Final cleanup if this is the last cpu */
if
(
lastcpu
)
{
kfree
(
zonedev
->
trips
);
if
(
lastcpu
)
kfree
(
zonedev
);
}
return
0
;
}
...
...
drivers/thermal/rcar_thermal.c
View file @
166d017d
...
...
@@ -489,7 +489,7 @@ static int rcar_thermal_probe(struct platform_device *pdev)
&
rcar_thermal_zone_ops
);
}
else
{
priv
->
zone
=
thermal_zone_device_register_with_trips
(
"rcar_thermal"
,
trips
,
ARRAY_SIZE
(
trips
),
0
,
priv
,
"rcar_thermal"
,
trips
,
ARRAY_SIZE
(
trips
),
priv
,
&
rcar_thermal_zone_ops
,
NULL
,
0
,
idle
);
...
...
drivers/thermal/st/st_thermal.c
View file @
166d017d
...
...
@@ -203,7 +203,7 @@ int st_thermal_register(struct platform_device *pdev,
trip
.
type
=
THERMAL_TRIP_CRITICAL
;
sensor
->
thermal_dev
=
thermal_zone_device_register_with_trips
(
dev_name
(
dev
),
&
trip
,
1
,
0
,
sensor
,
thermal_zone_device_register_with_trips
(
dev_name
(
dev
),
&
trip
,
1
,
sensor
,
&
st_tz_ops
,
NULL
,
0
,
polling_delay
);
if
(
IS_ERR
(
sensor
->
thermal_dev
))
{
dev_err
(
dev
,
"failed to register thermal zone device
\n
"
);
...
...
drivers/thermal/thermal_core.c
View file @
166d017d
...
...
@@ -273,7 +273,6 @@ static int __init thermal_register_governors(void)
/*
* Zone update section: main control loop applied to each zone while monitoring
*
* in polling mode. The monitoring is done using a workqueue.
* Same update may be done on a zone by calling thermal_zone_device_update().
*
...
...
@@ -356,9 +355,9 @@ static void handle_critical_trips(struct thermal_zone_device *tz,
trace_thermal_zone_trip
(
tz
,
thermal_zone_trip_id
(
tz
,
trip
),
trip
->
type
);
if
(
trip
->
type
==
THERMAL_TRIP_CRITICAL
)
tz
->
ops
->
critical
(
tz
);
else
if
(
tz
->
ops
->
hot
)
tz
->
ops
->
hot
(
tz
);
tz
->
ops
.
critical
(
tz
);
else
if
(
tz
->
ops
.
hot
)
tz
->
ops
.
hot
(
tz
);
}
static
void
handle_thermal_trip
(
struct
thermal_zone_device
*
tz
,
...
...
@@ -493,8 +492,8 @@ static int thermal_zone_device_set_mode(struct thermal_zone_device *tz,
return
ret
;
}
if
(
tz
->
ops
->
change_mode
)
ret
=
tz
->
ops
->
change_mode
(
tz
,
mode
);
if
(
tz
->
ops
.
change_mode
)
ret
=
tz
->
ops
.
change_mode
(
tz
,
mode
);
if
(
!
ret
)
tz
->
mode
=
mode
;
...
...
@@ -867,8 +866,8 @@ static void bind_cdev(struct thermal_cooling_device *cdev)
struct
thermal_zone_device
*
pos
=
NULL
;
list_for_each_entry
(
pos
,
&
thermal_tz_list
,
node
)
{
if
(
pos
->
ops
->
bind
)
{
ret
=
pos
->
ops
->
bind
(
pos
,
cdev
);
if
(
pos
->
ops
.
bind
)
{
ret
=
pos
->
ops
.
bind
(
pos
,
cdev
);
if
(
ret
)
print_bind_err_msg
(
pos
,
cdev
,
ret
);
}
...
...
@@ -1184,8 +1183,8 @@ void thermal_cooling_device_unregister(struct thermal_cooling_device *cdev)
/* Unbind all thermal zones associated with 'this' cdev */
list_for_each_entry
(
tz
,
&
thermal_tz_list
,
node
)
{
if
(
tz
->
ops
->
unbind
)
tz
->
ops
->
unbind
(
tz
,
cdev
);
if
(
tz
->
ops
.
unbind
)
tz
->
ops
.
unbind
(
tz
,
cdev
);
}
mutex_unlock
(
&
thermal_list_lock
);
...
...
@@ -1199,13 +1198,13 @@ static void bind_tz(struct thermal_zone_device *tz)
int
ret
;
struct
thermal_cooling_device
*
pos
=
NULL
;
if
(
!
tz
->
ops
->
bind
)
if
(
!
tz
->
ops
.
bind
)
return
;
mutex_lock
(
&
thermal_list_lock
);
list_for_each_entry
(
pos
,
&
thermal_cdev_list
,
node
)
{
ret
=
tz
->
ops
->
bind
(
tz
,
pos
);
ret
=
tz
->
ops
.
bind
(
tz
,
pos
);
if
(
ret
)
print_bind_err_msg
(
tz
,
pos
,
ret
);
}
...
...
@@ -1224,11 +1223,8 @@ int thermal_zone_get_crit_temp(struct thermal_zone_device *tz, int *temp)
{
int
i
,
ret
=
-
EINVAL
;
if
(
tz
->
ops
->
get_crit_temp
)
return
tz
->
ops
->
get_crit_temp
(
tz
,
temp
);
if
(
!
tz
->
trips
)
return
-
EINVAL
;
if
(
tz
->
ops
.
get_crit_temp
)
return
tz
->
ops
.
get_crit_temp
(
tz
,
temp
);
mutex_lock
(
&
tz
->
lock
);
...
...
@@ -1251,7 +1247,6 @@ EXPORT_SYMBOL_GPL(thermal_zone_get_crit_temp);
* @type: the thermal zone device type
* @trips: a pointer to an array of thermal trips
* @num_trips: the number of trip points the thermal zone support
* @mask: a bit string indicating the writeablility of trip points
* @devdata: private device data
* @ops: standard thermal zone device callbacks
* @tzp: thermal zone platform parameters
...
...
@@ -1272,10 +1267,12 @@ EXPORT_SYMBOL_GPL(thermal_zone_get_crit_temp);
* IS_ERR*() helpers.
*/
struct
thermal_zone_device
*
thermal_zone_device_register_with_trips
(
const
char
*
type
,
struct
thermal_trip
*
trips
,
int
num_trips
,
int
mask
,
void
*
devdata
,
struct
thermal_zone_device_ops
*
ops
,
const
struct
thermal_zone_params
*
tzp
,
int
passive_delay
,
int
polling_delay
)
thermal_zone_device_register_with_trips
(
const
char
*
type
,
const
struct
thermal_trip
*
trips
,
int
num_trips
,
void
*
devdata
,
const
struct
thermal_zone_device_ops
*
ops
,
const
struct
thermal_zone_params
*
tzp
,
int
passive_delay
,
int
polling_delay
)
{
struct
thermal_zone_device
*
tz
;
int
id
;
...
...
@@ -1293,20 +1290,7 @@ thermal_zone_device_register_with_trips(const char *type, struct thermal_trip *t
return
ERR_PTR
(
-
EINVAL
);
}
/*
* Max trip count can't exceed 31 as the "mask >> num_trips" condition.
* For example, shifting by 32 will result in compiler warning:
* warning: right shift count >= width of type [-Wshift-count- overflow]
*
* Also "mask >> num_trips" will always be true with 32 bit shift.
* E.g. mask = 0x80000000 for trip id 31 to be RW. Then
* mask >> 32 = 0x80000000
* This will result in failure for the below condition.
*
* Check will be true when the bit 31 of the mask is set.
* 32 bit shift will cause overflow of 4 byte integer.
*/
if
(
num_trips
>
(
BITS_PER_TYPE
(
int
)
-
1
)
||
num_trips
<
0
||
mask
>>
num_trips
)
{
if
(
num_trips
<
0
)
{
pr_err
(
"Incorrect number of thermal trips
\n
"
);
return
ERR_PTR
(
-
EINVAL
);
}
...
...
@@ -1322,7 +1306,7 @@ thermal_zone_device_register_with_trips(const char *type, struct thermal_trip *t
if
(
!
thermal_class
)
return
ERR_PTR
(
-
ENODEV
);
tz
=
kzalloc
(
s
izeof
(
*
tz
),
GFP_KERNEL
);
tz
=
kzalloc
(
s
truct_size
(
tz
,
trips
,
num_trips
),
GFP_KERNEL
);
if
(
!
tz
)
return
ERR_PTR
(
-
ENOMEM
);
...
...
@@ -1348,21 +1332,21 @@ thermal_zone_device_register_with_trips(const char *type, struct thermal_trip *t
tz
->
id
=
id
;
strscpy
(
tz
->
type
,
type
,
sizeof
(
tz
->
type
));
if
(
!
ops
->
critical
)
ops
->
critical
=
thermal_zone_device_critical
;
tz
->
ops
=
*
ops
;
if
(
!
tz
->
ops
.
critical
)
tz
->
ops
.
critical
=
thermal_zone_device_critical
;
tz
->
ops
=
ops
;
tz
->
device
.
class
=
thermal_class
;
tz
->
devdata
=
devdata
;
tz
->
trips
=
trips
;
tz
->
num_trips
=
num_trips
;
memcpy
(
tz
->
trips
,
trips
,
num_trips
*
sizeof
(
*
trips
));
thermal_set_delay_jiffies
(
&
tz
->
passive_delay_jiffies
,
passive_delay
);
thermal_set_delay_jiffies
(
&
tz
->
polling_delay_jiffies
,
polling_delay
);
/* sys I/F */
/* Add nodes that are always present via .groups */
result
=
thermal_zone_create_device_groups
(
tz
,
mask
);
result
=
thermal_zone_create_device_groups
(
tz
);
if
(
result
)
goto
remove_id
;
...
...
@@ -1437,10 +1421,10 @@ EXPORT_SYMBOL_GPL(thermal_zone_device_register_with_trips);
struct
thermal_zone_device
*
thermal_tripless_zone_device_register
(
const
char
*
type
,
void
*
devdata
,
struct
thermal_zone_device_ops
*
ops
,
const
struct
thermal_zone_device_ops
*
ops
,
const
struct
thermal_zone_params
*
tzp
)
{
return
thermal_zone_device_register_with_trips
(
type
,
NULL
,
0
,
0
,
devdata
,
return
thermal_zone_device_register_with_trips
(
type
,
NULL
,
0
,
devdata
,
ops
,
tzp
,
0
,
0
);
}
EXPORT_SYMBOL_GPL
(
thermal_tripless_zone_device_register
);
...
...
@@ -1499,8 +1483,8 @@ void thermal_zone_device_unregister(struct thermal_zone_device *tz)
/* Unbind all cdevs associated with 'this' thermal zone */
list_for_each_entry
(
cdev
,
&
thermal_cdev_list
,
node
)
if
(
tz
->
ops
->
unbind
)
tz
->
ops
->
unbind
(
tz
,
cdev
);
if
(
tz
->
ops
.
unbind
)
tz
->
ops
.
unbind
(
tz
,
cdev
);
mutex_unlock
(
&
thermal_list_lock
);
...
...
drivers/thermal/thermal_core.h
View file @
166d017d
...
...
@@ -131,7 +131,7 @@ void thermal_zone_trip_updated(struct thermal_zone_device *tz,
int
__thermal_zone_get_temp
(
struct
thermal_zone_device
*
tz
,
int
*
temp
);
/* sysfs I/F */
int
thermal_zone_create_device_groups
(
struct
thermal_zone_device
*
,
int
);
int
thermal_zone_create_device_groups
(
struct
thermal_zone_device
*
tz
);
void
thermal_zone_destroy_device_groups
(
struct
thermal_zone_device
*
);
void
thermal_cooling_device_setup_sysfs
(
struct
thermal_cooling_device
*
);
void
thermal_cooling_device_destroy_sysfs
(
struct
thermal_cooling_device
*
cdev
);
...
...
drivers/thermal/thermal_helpers.c
View file @
166d017d
...
...
@@ -26,8 +26,8 @@ int get_tz_trend(struct thermal_zone_device *tz, const struct thermal_trip *trip
{
enum
thermal_trend
trend
;
if
(
tz
->
emul_temperature
||
!
tz
->
ops
->
get_trend
||
tz
->
ops
->
get_trend
(
tz
,
trip
,
&
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
)
...
...
@@ -75,7 +75,7 @@ EXPORT_SYMBOL(get_thermal_instance);
* temperature and fill @temp.
*
* Both tz and tz->ops must be valid pointers when calling this function,
* and the tz->ops
->
get_temp callback must be provided.
* and the tz->ops
.
get_temp callback must be provided.
* The function must be called under tz->lock.
*
* Return: On success returns 0, an error code otherwise
...
...
@@ -88,7 +88,7 @@ int __thermal_zone_get_temp(struct thermal_zone_device *tz, int *temp)
lockdep_assert_held
(
&
tz
->
lock
);
ret
=
tz
->
ops
->
get_temp
(
tz
,
temp
);
ret
=
tz
->
ops
.
get_temp
(
tz
,
temp
);
if
(
IS_ENABLED
(
CONFIG_THERMAL_EMULATION
)
&&
tz
->
emul_temperature
)
{
for_each_trip
(
tz
,
trip
)
{
...
...
@@ -132,7 +132,7 @@ int thermal_zone_get_temp(struct thermal_zone_device *tz, int *temp)
mutex_lock
(
&
tz
->
lock
);
if
(
!
tz
->
ops
->
get_temp
)
{
if
(
!
tz
->
ops
.
get_temp
)
{
ret
=
-
EINVAL
;
goto
unlock
;
}
...
...
drivers/thermal/thermal_hwmon.c
View file @
166d017d
...
...
@@ -80,7 +80,7 @@ temp_crit_show(struct device *dev, struct device_attribute *attr, char *buf)
mutex_lock
(
&
tz
->
lock
);
ret
=
tz
->
ops
->
get_crit_temp
(
tz
,
&
temperature
);
ret
=
tz
->
ops
.
get_crit_temp
(
tz
,
&
temperature
);
mutex_unlock
(
&
tz
->
lock
);
...
...
@@ -132,7 +132,7 @@ thermal_hwmon_lookup_temp(const struct thermal_hwmon_device *hwmon,
static
bool
thermal_zone_crit_temp_valid
(
struct
thermal_zone_device
*
tz
)
{
int
temp
;
return
tz
->
ops
->
get_crit_temp
&&
!
tz
->
ops
->
get_crit_temp
(
tz
,
&
temp
);
return
tz
->
ops
.
get_crit_temp
&&
!
tz
->
ops
.
get_crit_temp
(
tz
,
&
temp
);
}
int
thermal_add_hwmon_sysfs
(
struct
thermal_zone_device
*
tz
)
...
...
drivers/thermal/thermal_of.c
View file @
166d017d
...
...
@@ -117,6 +117,8 @@ static int thermal_of_populate_trip(struct device_node *np,
return
ret
;
}
trip
->
flags
=
THERMAL_TRIP_FLAG_RW_TEMP
;
return
0
;
}
...
...
@@ -438,13 +440,8 @@ static int thermal_of_unbind(struct thermal_zone_device *tz,
*/
static
void
thermal_of_zone_unregister
(
struct
thermal_zone_device
*
tz
)
{
struct
thermal_trip
*
trips
=
tz
->
trips
;
struct
thermal_zone_device_ops
*
ops
=
tz
->
ops
;
thermal_zone_device_disable
(
tz
);
thermal_zone_device_unregister
(
tz
);
kfree
(
trips
);
kfree
(
ops
);
}
/**
...
...
@@ -470,33 +467,27 @@ static void thermal_of_zone_unregister(struct thermal_zone_device *tz)
static
struct
thermal_zone_device
*
thermal_of_zone_register
(
struct
device_node
*
sensor
,
int
id
,
void
*
data
,
const
struct
thermal_zone_device_ops
*
ops
)
{
struct
thermal_zone_device_ops
of_ops
=
*
ops
;
struct
thermal_zone_device
*
tz
;
struct
thermal_trip
*
trips
;
struct
thermal_zone_params
tzp
=
{};
struct
thermal_zone_device_ops
*
of_ops
;
struct
device_node
*
np
;
const
char
*
action
;
int
delay
,
pdelay
;
int
ntrips
,
mask
;
int
ntrips
;
int
ret
;
of_ops
=
kmemdup
(
ops
,
sizeof
(
*
ops
),
GFP_KERNEL
);
if
(
!
of_ops
)
return
ERR_PTR
(
-
ENOMEM
);
np
=
of_thermal_zone_find
(
sensor
,
id
);
if
(
IS_ERR
(
np
))
{
if
(
PTR_ERR
(
np
)
!=
-
ENODEV
)
pr_err
(
"Failed to find thermal zone for %pOFn id=%d
\n
"
,
sensor
,
id
);
ret
=
PTR_ERR
(
np
);
goto
out_kfree_of_ops
;
return
ERR_CAST
(
np
);
}
trips
=
thermal_of_trips_init
(
np
,
&
ntrips
);
if
(
IS_ERR
(
trips
))
{
pr_err
(
"Failed to find trip points for %pOFn id=%d
\n
"
,
sensor
,
id
);
ret
=
PTR_ERR
(
trips
);
goto
out_kfree_of_ops
;
return
ERR_CAST
(
trips
);
}
ret
=
thermal_of_monitor_init
(
np
,
&
delay
,
&
pdelay
);
...
...
@@ -507,18 +498,16 @@ static struct thermal_zone_device *thermal_of_zone_register(struct device_node *
thermal_of_parameters_init
(
np
,
&
tzp
);
of_ops
->
bind
=
thermal_of_bind
;
of_ops
->
unbind
=
thermal_of_unbind
;
mask
=
GENMASK_ULL
((
ntrips
)
-
1
,
0
);
of_ops
.
bind
=
thermal_of_bind
;
of_ops
.
unbind
=
thermal_of_unbind
;
ret
=
of_property_read_string
(
np
,
"critical-action"
,
&
action
);
if
(
!
ret
)
if
(
!
of_ops
->
critical
&&
!
strcasecmp
(
action
,
"reboot"
))
of_ops
->
critical
=
thermal_zone_device_critical_reboot
;
if
(
!
of_ops
.
critical
&&
!
strcasecmp
(
action
,
"reboot"
))
of_ops
.
critical
=
thermal_zone_device_critical_reboot
;
tz
=
thermal_zone_device_register_with_trips
(
np
->
name
,
trips
,
ntrips
,
mask
,
data
,
of_ops
,
&
tzp
,
data
,
&
of_ops
,
&
tzp
,
pdelay
,
delay
);
if
(
IS_ERR
(
tz
))
{
ret
=
PTR_ERR
(
tz
);
...
...
@@ -526,6 +515,8 @@ static struct thermal_zone_device *thermal_of_zone_register(struct device_node *
goto
out_kfree_trips
;
}
kfree
(
trips
);
ret
=
thermal_zone_device_enable
(
tz
);
if
(
ret
)
{
pr_err
(
"Failed to enabled thermal zone '%s', id=%d: %d
\n
"
,
...
...
@@ -538,8 +529,6 @@ static struct thermal_zone_device *thermal_of_zone_register(struct device_node *
out_kfree_trips:
kfree
(
trips
);
out_kfree_of_ops:
kfree
(
of_ops
);
return
ERR_PTR
(
ret
);
}
...
...
drivers/thermal/thermal_sysfs.c
View file @
166d017d
...
...
@@ -123,8 +123,8 @@ trip_point_temp_store(struct device *dev, struct device_attribute *attr,
trip
=
&
tz
->
trips
[
trip_id
];
if
(
temp
!=
trip
->
temperature
)
{
if
(
tz
->
ops
->
set_trip_temp
)
{
ret
=
tz
->
ops
->
set_trip_temp
(
tz
,
trip_id
,
temp
);
if
(
tz
->
ops
.
set_trip_temp
)
{
ret
=
tz
->
ops
.
set_trip_temp
(
tz
,
trip_id
,
temp
);
if
(
ret
)
goto
unlock
;
}
...
...
@@ -174,18 +174,11 @@ trip_point_hyst_store(struct device *dev, struct device_attribute *attr,
trip
=
&
tz
->
trips
[
trip_id
];
if
(
hyst
!=
trip
->
hysteresis
)
{
if
(
tz
->
ops
->
set_trip_hyst
)
{
ret
=
tz
->
ops
->
set_trip_hyst
(
tz
,
trip_id
,
hyst
);
if
(
ret
)
goto
unlock
;
}
trip
->
hysteresis
=
hyst
;
thermal_zone_trip_updated
(
tz
,
trip
);
}
unlock:
mutex_unlock
(
&
tz
->
lock
);
return
ret
?
ret
:
count
;
...
...
@@ -250,10 +243,10 @@ emul_temp_store(struct device *dev, struct device_attribute *attr,
mutex_lock
(
&
tz
->
lock
);
if
(
!
tz
->
ops
->
set_emul_temp
)
if
(
!
tz
->
ops
.
set_emul_temp
)
tz
->
emul_temperature
=
temperature
;
else
ret
=
tz
->
ops
->
set_emul_temp
(
tz
,
temperature
);
ret
=
tz
->
ops
.
set_emul_temp
(
tz
,
temperature
);
if
(
!
ret
)
__thermal_zone_device_update
(
tz
,
THERMAL_EVENT_UNSPECIFIED
);
...
...
@@ -392,17 +385,16 @@ static const struct attribute_group *thermal_zone_attribute_groups[] = {
/**
* create_trip_attrs() - create attributes for trip points
* @tz: the thermal zone device
* @mask: Writeable trip point bitmap.
*
* helper function to instantiate sysfs entries for every trip
* point and its properties of a struct thermal_zone_device.
*
* Return: 0 on success, the proper error value otherwise.
*/
static
int
create_trip_attrs
(
struct
thermal_zone_device
*
tz
,
int
mask
)
static
int
create_trip_attrs
(
struct
thermal_zone_device
*
tz
)
{
const
struct
thermal_trip
*
trip
;
struct
attribute
**
attrs
;
int
indx
;
/* This function works only for zones with at least one trip */
if
(
tz
->
num_trips
<=
0
)
...
...
@@ -437,7 +429,9 @@ static int create_trip_attrs(struct thermal_zone_device *tz, int mask)
return
-
ENOMEM
;
}
for
(
indx
=
0
;
indx
<
tz
->
num_trips
;
indx
++
)
{
for_each_trip
(
tz
,
trip
)
{
int
indx
=
thermal_zone_trip_id
(
tz
,
trip
);
/* create trip type attribute */
snprintf
(
tz
->
trip_type_attrs
[
indx
].
name
,
THERMAL_NAME_LENGTH
,
"trip_point_%d_type"
,
indx
);
...
...
@@ -458,8 +452,7 @@ static int create_trip_attrs(struct thermal_zone_device *tz, int mask)
tz
->
trip_temp_attrs
[
indx
].
name
;
tz
->
trip_temp_attrs
[
indx
].
attr
.
attr
.
mode
=
S_IRUGO
;
tz
->
trip_temp_attrs
[
indx
].
attr
.
show
=
trip_point_temp_show
;
if
(
IS_ENABLED
(
CONFIG_THERMAL_WRITABLE_TRIPS
)
&&
mask
&
(
1
<<
indx
))
{
if
(
trip
->
flags
&
THERMAL_TRIP_FLAG_RW_TEMP
)
{
tz
->
trip_temp_attrs
[
indx
].
attr
.
attr
.
mode
|=
S_IWUSR
;
tz
->
trip_temp_attrs
[
indx
].
attr
.
store
=
trip_point_temp_store
;
...
...
@@ -474,7 +467,7 @@ static int create_trip_attrs(struct thermal_zone_device *tz, int mask)
tz
->
trip_hyst_attrs
[
indx
].
name
;
tz
->
trip_hyst_attrs
[
indx
].
attr
.
attr
.
mode
=
S_IRUGO
;
tz
->
trip_hyst_attrs
[
indx
].
attr
.
show
=
trip_point_hyst_show
;
if
(
t
z
->
ops
->
set_trip_hyst
)
{
if
(
t
rip
->
flags
&
THERMAL_TRIP_FLAG_RW_HYST
)
{
tz
->
trip_hyst_attrs
[
indx
].
attr
.
attr
.
mode
|=
S_IWUSR
;
tz
->
trip_hyst_attrs
[
indx
].
attr
.
store
=
trip_point_hyst_store
;
...
...
@@ -506,8 +499,7 @@ static void destroy_trip_attrs(struct thermal_zone_device *tz)
kfree
(
tz
->
trips_attribute_group
.
attrs
);
}
int
thermal_zone_create_device_groups
(
struct
thermal_zone_device
*
tz
,
int
mask
)
int
thermal_zone_create_device_groups
(
struct
thermal_zone_device
*
tz
)
{
const
struct
attribute_group
**
groups
;
int
i
,
size
,
result
;
...
...
@@ -523,7 +515,7 @@ int thermal_zone_create_device_groups(struct thermal_zone_device *tz,
groups
[
i
]
=
thermal_zone_attribute_groups
[
i
];
if
(
tz
->
num_trips
)
{
result
=
create_trip_attrs
(
tz
,
mask
);
result
=
create_trip_attrs
(
tz
);
if
(
result
)
{
kfree
(
groups
);
...
...
drivers/thermal/thermal_trip.c
View file @
166d017d
...
...
@@ -70,7 +70,7 @@ void __thermal_zone_set_trips(struct thermal_zone_device *tz)
lockdep_assert_held
(
&
tz
->
lock
);
if
(
!
tz
->
ops
->
set_trips
)
if
(
!
tz
->
ops
.
set_trips
)
return
;
for_each_trip
(
tz
,
trip
)
{
...
...
@@ -114,7 +114,7 @@ void __thermal_zone_set_trips(struct thermal_zone_device *tz)
* Set a temperature window. When this window is left the driver
* must inform the thermal core via thermal_zone_device_update.
*/
ret
=
tz
->
ops
->
set_trips
(
tz
,
low
,
high
);
ret
=
tz
->
ops
.
set_trips
(
tz
,
low
,
high
);
if
(
ret
)
dev_err
(
&
tz
->
device
,
"Failed to set trips: %d
\n
"
,
ret
);
}
...
...
@@ -122,7 +122,7 @@ void __thermal_zone_set_trips(struct thermal_zone_device *tz)
int
__thermal_zone_get_trip
(
struct
thermal_zone_device
*
tz
,
int
trip_id
,
struct
thermal_trip
*
trip
)
{
if
(
!
tz
||
!
tz
->
trips
||
trip_id
<
0
||
trip_id
>=
tz
->
num_trips
||
!
trip
)
if
(
!
tz
||
trip_id
<
0
||
trip_id
>=
tz
->
num_trips
||
!
trip
)
return
-
EINVAL
;
*
trip
=
tz
->
trips
[
trip_id
];
...
...
include/linux/thermal.h
View file @
166d017d
...
...
@@ -64,15 +64,23 @@ enum thermal_notify_event {
* @threshold: trip crossing notification threshold miliCelsius
* @type: trip point type
* @priv: pointer to driver data associated with this trip
* @flags: flags representing binary properties of the trip
*/
struct
thermal_trip
{
int
temperature
;
int
hysteresis
;
int
threshold
;
enum
thermal_trip_type
type
;
u8
flags
;
void
*
priv
;
};
#define THERMAL_TRIP_FLAG_RW_TEMP BIT(0)
#define THERMAL_TRIP_FLAG_RW_HYST BIT(1)
#define THERMAL_TRIP_FLAG_RW (THERMAL_TRIP_FLAG_RW_TEMP | \
THERMAL_TRIP_FLAG_RW_HYST)
struct
thermal_zone_device_ops
{
int
(
*
bind
)
(
struct
thermal_zone_device
*
,
struct
thermal_cooling_device
*
);
...
...
@@ -83,7 +91,6 @@ struct thermal_zone_device_ops {
int
(
*
change_mode
)
(
struct
thermal_zone_device
*
,
enum
thermal_device_mode
);
int
(
*
set_trip_temp
)
(
struct
thermal_zone_device
*
,
int
,
int
);
int
(
*
set_trip_hyst
)
(
struct
thermal_zone_device
*
,
int
,
int
);
int
(
*
get_crit_temp
)
(
struct
thermal_zone_device
*
,
int
*
);
int
(
*
set_emul_temp
)
(
struct
thermal_zone_device
*
,
int
);
int
(
*
get_trend
)
(
struct
thermal_zone_device
*
,
...
...
@@ -130,7 +137,6 @@ struct thermal_cooling_device {
* @trip_hyst_attrs: attributes for trip points for sysfs: trip hysteresis
* @mode: current mode of this thermal zone
* @devdata: private pointer for device private data
* @trips: an array of struct thermal_trip
* @num_trips: number of trip points the thermal zone supports
* @passive_delay_jiffies: number of jiffies to wait between polls when
* performing passive cooling.
...
...
@@ -160,6 +166,7 @@ struct thermal_cooling_device {
* @poll_queue: delayed work for polling
* @notify_event: Last notification event
* @suspended: thermal zone suspend indicator
* @trips: array of struct thermal_trip objects
*/
struct
thermal_zone_device
{
int
id
;
...
...
@@ -172,7 +179,6 @@ struct thermal_zone_device {
struct
thermal_attr
*
trip_hyst_attrs
;
enum
thermal_device_mode
mode
;
void
*
devdata
;
struct
thermal_trip
*
trips
;
int
num_trips
;
unsigned
long
passive_delay_jiffies
;
unsigned
long
polling_delay_jiffies
;
...
...
@@ -183,7 +189,7 @@ struct thermal_zone_device {
int
prev_low_trip
;
int
prev_high_trip
;
atomic_t
need_update
;
struct
thermal_zone_device_ops
*
ops
;
struct
thermal_zone_device_ops
ops
;
struct
thermal_zone_params
*
tzp
;
struct
thermal_governor
*
governor
;
void
*
governor_data
;
...
...
@@ -193,10 +199,11 @@ struct thermal_zone_device {
struct
list_head
node
;
struct
delayed_work
poll_queue
;
enum
thermal_notify_event
notify_event
;
bool
suspended
;
#ifdef CONFIG_THERMAL_DEBUGFS
struct
thermal_debugfs
*
debugfs
;
#endif
bool
suspended
;
struct
thermal_trip
trips
[]
__counted_by
(
num_trips
)
;
};
/**
...
...
@@ -315,17 +322,16 @@ int thermal_zone_get_crit_temp(struct thermal_zone_device *tz, int *temp);
#ifdef CONFIG_THERMAL
struct
thermal_zone_device
*
thermal_zone_device_register_with_trips
(
const
char
*
type
,
struct
thermal_trip
*
trips
,
int
num_trips
,
int
mask
,
void
*
devdata
,
struct
thermal_zone_device_ops
*
ops
,
const
struct
thermal_trip
*
trips
,
int
num_trips
,
void
*
devdata
,
const
struct
thermal_zone_device_ops
*
ops
,
const
struct
thermal_zone_params
*
tzp
,
int
passive_delay
,
int
polling_delay
);
struct
thermal_zone_device
*
thermal_tripless_zone_device_register
(
const
char
*
type
,
void
*
devdata
,
struct
thermal_zone_device_ops
*
ops
,
const
struct
thermal_zone_device_ops
*
ops
,
const
struct
thermal_zone_params
*
tzp
);
void
thermal_zone_device_unregister
(
struct
thermal_zone_device
*
tz
);
...
...
@@ -375,10 +381,9 @@ void thermal_zone_device_critical(struct thermal_zone_device *tz);
#else
static
inline
struct
thermal_zone_device
*
thermal_zone_device_register_with_trips
(
const
char
*
type
,
struct
thermal_trip
*
trips
,
int
num_trips
,
int
mask
,
void
*
devdata
,
struct
thermal_zone_device_ops
*
ops
,
const
struct
thermal_trip
*
trips
,
int
num_trips
,
void
*
devdata
,
const
struct
thermal_zone_device_ops
*
ops
,
const
struct
thermal_zone_params
*
tzp
,
int
passive_delay
,
int
polling_delay
)
{
return
ERR_PTR
(
-
ENODEV
);
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment