Merge branch 'for-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/rzhang/linux
Pull thermal fixes from Zhang Rui:
"Specifics:
- Update the help text of INT3403 Thermal driver, which was not
friendly to users. From Zhang Rui.
- The "type" sysfs attribute of x86_pkg_temp_thermal registered
thermal zones includes an instance number, which makes the
thermal-to-hwmon bridge fails to group them all in a single hwmon
device. Fixed by Jean Delvare.
- The hwmon device registered by x86_pkg_temp_thermal driver is
redundant because the temperature value reported by
x86_pkg_temp_thermal is already reported by the coretemp driver.
Fixed by Jean Delvare.
- Fix a problem that the cooling device can not be updated properly
if it is initialized at max cooling state. From Ni Wade.
- Fix a problem that OF registered thermal zones are running without
thermal governors. From Zhang Rui.
- Commit beeb5a1e0e
("thermal: rcar-thermal: Enable driver
compilation with COMPILE_TEST") broke build on archs wihout io
memory. Thus make it depend on HAS_IOMEM to bypass build failures.
Fixed by Richard Weinberger"
* 'for-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/rzhang/linux:
Thermal: thermal zone governor fix
Thermal: Allow first update of cooling device state
thermal,rcar_thermal: Add dependency on HAS_IOMEM
x86_pkg_temp_thermal: Fix the thermal zone type
x86_pkg_temp_thermal: Do not expose as a hwmon device
Thermal: update INT3404 thermal driver help text
This commit is contained in:
@@ -136,6 +136,7 @@ config SPEAR_THERMAL
|
|||||||
config RCAR_THERMAL
|
config RCAR_THERMAL
|
||||||
tristate "Renesas R-Car thermal driver"
|
tristate "Renesas R-Car thermal driver"
|
||||||
depends on ARCH_SHMOBILE || COMPILE_TEST
|
depends on ARCH_SHMOBILE || COMPILE_TEST
|
||||||
|
depends on HAS_IOMEM
|
||||||
help
|
help
|
||||||
Enable this to plug the R-Car thermal sensor driver into the Linux
|
Enable this to plug the R-Car thermal sensor driver into the Linux
|
||||||
thermal framework.
|
thermal framework.
|
||||||
@@ -210,8 +211,16 @@ config ACPI_INT3403_THERMAL
|
|||||||
tristate "ACPI INT3403 thermal driver"
|
tristate "ACPI INT3403 thermal driver"
|
||||||
depends on X86 && ACPI
|
depends on X86 && ACPI
|
||||||
help
|
help
|
||||||
This driver uses ACPI INT3403 device objects. If present, it will
|
Newer laptops and tablets that use ACPI may have thermal sensors
|
||||||
register each INT3403 thermal sensor as a thermal zone.
|
outside the core CPU/SOC for thermal safety reasons. These
|
||||||
|
temperature sensors are also exposed for the OS to use via the so
|
||||||
|
called INT3403 ACPI object. This driver will, on devices that have
|
||||||
|
such sensors, expose the temperature information from these sensors
|
||||||
|
to userspace via the normal thermal framework. This means that a wide
|
||||||
|
range of applications and GUI widgets can show this information to
|
||||||
|
the user or use this information for making decisions. For example,
|
||||||
|
the Intel Thermal Daemon can use this information to allow the user
|
||||||
|
to select his laptop to run without turning on the fans.
|
||||||
|
|
||||||
menu "Texas Instruments thermal drivers"
|
menu "Texas Instruments thermal drivers"
|
||||||
source "drivers/thermal/ti-soc-thermal/Kconfig"
|
source "drivers/thermal/ti-soc-thermal/Kconfig"
|
||||||
|
@@ -56,10 +56,15 @@ static LIST_HEAD(thermal_governor_list);
|
|||||||
static DEFINE_MUTEX(thermal_list_lock);
|
static DEFINE_MUTEX(thermal_list_lock);
|
||||||
static DEFINE_MUTEX(thermal_governor_lock);
|
static DEFINE_MUTEX(thermal_governor_lock);
|
||||||
|
|
||||||
|
static struct thermal_governor *def_governor;
|
||||||
|
|
||||||
static struct thermal_governor *__find_governor(const char *name)
|
static struct thermal_governor *__find_governor(const char *name)
|
||||||
{
|
{
|
||||||
struct thermal_governor *pos;
|
struct thermal_governor *pos;
|
||||||
|
|
||||||
|
if (!name || !name[0])
|
||||||
|
return def_governor;
|
||||||
|
|
||||||
list_for_each_entry(pos, &thermal_governor_list, governor_list)
|
list_for_each_entry(pos, &thermal_governor_list, governor_list)
|
||||||
if (!strnicmp(name, pos->name, THERMAL_NAME_LENGTH))
|
if (!strnicmp(name, pos->name, THERMAL_NAME_LENGTH))
|
||||||
return pos;
|
return pos;
|
||||||
@@ -82,17 +87,23 @@ int thermal_register_governor(struct thermal_governor *governor)
|
|||||||
if (__find_governor(governor->name) == NULL) {
|
if (__find_governor(governor->name) == NULL) {
|
||||||
err = 0;
|
err = 0;
|
||||||
list_add(&governor->governor_list, &thermal_governor_list);
|
list_add(&governor->governor_list, &thermal_governor_list);
|
||||||
|
if (!def_governor && !strncmp(governor->name,
|
||||||
|
DEFAULT_THERMAL_GOVERNOR, THERMAL_NAME_LENGTH))
|
||||||
|
def_governor = governor;
|
||||||
}
|
}
|
||||||
|
|
||||||
mutex_lock(&thermal_list_lock);
|
mutex_lock(&thermal_list_lock);
|
||||||
|
|
||||||
list_for_each_entry(pos, &thermal_tz_list, node) {
|
list_for_each_entry(pos, &thermal_tz_list, node) {
|
||||||
|
/*
|
||||||
|
* only thermal zones with specified tz->tzp->governor_name
|
||||||
|
* may run with tz->govenor unset
|
||||||
|
*/
|
||||||
if (pos->governor)
|
if (pos->governor)
|
||||||
continue;
|
continue;
|
||||||
if (pos->tzp)
|
|
||||||
name = pos->tzp->governor_name;
|
name = pos->tzp->governor_name;
|
||||||
else
|
|
||||||
name = DEFAULT_THERMAL_GOVERNOR;
|
|
||||||
if (!strnicmp(name, governor->name, THERMAL_NAME_LENGTH))
|
if (!strnicmp(name, governor->name, THERMAL_NAME_LENGTH))
|
||||||
pos->governor = governor;
|
pos->governor = governor;
|
||||||
}
|
}
|
||||||
@@ -342,8 +353,8 @@ static void monitor_thermal_zone(struct thermal_zone_device *tz)
|
|||||||
static void handle_non_critical_trips(struct thermal_zone_device *tz,
|
static void handle_non_critical_trips(struct thermal_zone_device *tz,
|
||||||
int trip, enum thermal_trip_type trip_type)
|
int trip, enum thermal_trip_type trip_type)
|
||||||
{
|
{
|
||||||
if (tz->governor)
|
tz->governor ? tz->governor->throttle(tz, trip) :
|
||||||
tz->governor->throttle(tz, trip);
|
def_governor->throttle(tz, trip);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void handle_critical_trips(struct thermal_zone_device *tz,
|
static void handle_critical_trips(struct thermal_zone_device *tz,
|
||||||
@@ -1107,7 +1118,7 @@ __thermal_cooling_device_register(struct device_node *np,
|
|||||||
INIT_LIST_HEAD(&cdev->thermal_instances);
|
INIT_LIST_HEAD(&cdev->thermal_instances);
|
||||||
cdev->np = np;
|
cdev->np = np;
|
||||||
cdev->ops = ops;
|
cdev->ops = ops;
|
||||||
cdev->updated = true;
|
cdev->updated = false;
|
||||||
cdev->device.class = &thermal_class;
|
cdev->device.class = &thermal_class;
|
||||||
cdev->devdata = devdata;
|
cdev->devdata = devdata;
|
||||||
dev_set_name(&cdev->device, "cooling_device%d", cdev->id);
|
dev_set_name(&cdev->device, "cooling_device%d", cdev->id);
|
||||||
@@ -1533,7 +1544,7 @@ struct thermal_zone_device *thermal_zone_device_register(const char *type,
|
|||||||
if (tz->tzp)
|
if (tz->tzp)
|
||||||
tz->governor = __find_governor(tz->tzp->governor_name);
|
tz->governor = __find_governor(tz->tzp->governor_name);
|
||||||
else
|
else
|
||||||
tz->governor = __find_governor(DEFAULT_THERMAL_GOVERNOR);
|
tz->governor = def_governor;
|
||||||
|
|
||||||
mutex_unlock(&thermal_governor_lock);
|
mutex_unlock(&thermal_governor_lock);
|
||||||
|
|
||||||
|
@@ -68,6 +68,10 @@ struct phy_dev_entry {
|
|||||||
struct thermal_zone_device *tzone;
|
struct thermal_zone_device *tzone;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const struct thermal_zone_params pkg_temp_tz_params = {
|
||||||
|
.no_hwmon = true,
|
||||||
|
};
|
||||||
|
|
||||||
/* List maintaining number of package instances */
|
/* List maintaining number of package instances */
|
||||||
static LIST_HEAD(phy_dev_list);
|
static LIST_HEAD(phy_dev_list);
|
||||||
static DEFINE_MUTEX(phy_dev_list_mutex);
|
static DEFINE_MUTEX(phy_dev_list_mutex);
|
||||||
@@ -394,7 +398,6 @@ static int pkg_temp_thermal_device_add(unsigned int cpu)
|
|||||||
int err;
|
int err;
|
||||||
u32 tj_max;
|
u32 tj_max;
|
||||||
struct phy_dev_entry *phy_dev_entry;
|
struct phy_dev_entry *phy_dev_entry;
|
||||||
char buffer[30];
|
|
||||||
int thres_count;
|
int thres_count;
|
||||||
u32 eax, ebx, ecx, edx;
|
u32 eax, ebx, ecx, edx;
|
||||||
u8 *temp;
|
u8 *temp;
|
||||||
@@ -440,13 +443,11 @@ static int pkg_temp_thermal_device_add(unsigned int cpu)
|
|||||||
phy_dev_entry->first_cpu = cpu;
|
phy_dev_entry->first_cpu = cpu;
|
||||||
phy_dev_entry->tj_max = tj_max;
|
phy_dev_entry->tj_max = tj_max;
|
||||||
phy_dev_entry->ref_cnt = 1;
|
phy_dev_entry->ref_cnt = 1;
|
||||||
snprintf(buffer, sizeof(buffer), "pkg-temp-%d\n",
|
phy_dev_entry->tzone = thermal_zone_device_register("x86_pkg_temp",
|
||||||
phy_dev_entry->phys_proc_id);
|
|
||||||
phy_dev_entry->tzone = thermal_zone_device_register(buffer,
|
|
||||||
thres_count,
|
thres_count,
|
||||||
(thres_count == MAX_NUMBER_OF_TRIPS) ?
|
(thres_count == MAX_NUMBER_OF_TRIPS) ?
|
||||||
0x03 : 0x01,
|
0x03 : 0x01,
|
||||||
phy_dev_entry, &tzone_ops, NULL, 0, 0);
|
phy_dev_entry, &tzone_ops, &pkg_temp_tz_params, 0, 0);
|
||||||
if (IS_ERR(phy_dev_entry->tzone)) {
|
if (IS_ERR(phy_dev_entry->tzone)) {
|
||||||
err = PTR_ERR(phy_dev_entry->tzone);
|
err = PTR_ERR(phy_dev_entry->tzone);
|
||||||
goto err_ret_free;
|
goto err_ret_free;
|
||||||
|
Reference in New Issue
Block a user