Commit 1dc3217d authored by Linus Torvalds's avatar Linus Torvalds

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 beeb5a1e ("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
parents 4aa41ba7 f2234bcd
...@@ -136,6 +136,7 @@ config SPEAR_THERMAL ...@@ -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 ...@@ -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); ...@@ -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) ...@@ -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) ...@@ -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, ...@@ -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, ...@@ -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 { ...@@ -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) ...@@ -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) ...@@ -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;
......
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