Merge branch 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux
Pull ACPI & Thermal updates from Len Brown: "The generic Linux thermal layer is gaining some new capabilities (generic cooling via cpufreq) and some new customers (ARM). Also, an ACPI EC bug fix plus a regression fix." * 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux: (30 commits) tools/power/acpi/acpidump: remove duplicated include from acpidump.c ACPI idle, CPU hotplug: Fix NULL pointer dereference during hotplug cpuidle / ACPI: fix potential NULL pointer dereference ACPI: EC: Add a quirk for CLEVO M720T/M730T laptop ACPI: EC: Make the GPE storm threshold a module parameter thermal: Exynos: Fix NULL pointer dereference in exynos_unregister_thermal() Thermal: Fix bug on cpu_cooling, cooling device's id conflict problem. thermal: exynos: Use devm_* functions ARM: exynos: add thermal sensor driver platform data support thermal: exynos: register the tmu sensor with the kernel thermal layer thermal: exynos5: add exynos5250 thermal sensor driver support hwmon: exynos4: move thermal sensor driver to driver/thermal directory thermal: add generic cpufreq cooling implementation Fix a build error. thermal: Fix potential NULL pointer accesses thermal: add Renesas R-Car thermal sensor support thermal: fix potential out-of-bounds memory access Thermal: Introduce locking for cdev.thermal_instances list. Thermal: Unify the code for both active and passive cooling Thermal: Introduce simple arbitrator for setting device cooling state ...
This commit is contained in:
58
include/linux/cpu_cooling.h
Normal file
58
include/linux/cpu_cooling.h
Normal file
@@ -0,0 +1,58 @@
|
||||
/*
|
||||
* linux/include/linux/cpu_cooling.h
|
||||
*
|
||||
* Copyright (C) 2012 Samsung Electronics Co., Ltd(http://www.samsung.com)
|
||||
* Copyright (C) 2012 Amit Daniel <amit.kachhap@linaro.org>
|
||||
*
|
||||
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; version 2 of the License.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
||||
*
|
||||
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
*/
|
||||
|
||||
#ifndef __CPU_COOLING_H__
|
||||
#define __CPU_COOLING_H__
|
||||
|
||||
#include <linux/thermal.h>
|
||||
|
||||
#define CPUFREQ_COOLING_START 0
|
||||
#define CPUFREQ_COOLING_STOP 1
|
||||
|
||||
#ifdef CONFIG_CPU_THERMAL
|
||||
/**
|
||||
* cpufreq_cooling_register - function to create cpufreq cooling device.
|
||||
* @clip_cpus: cpumask of cpus where the frequency constraints will happen
|
||||
*/
|
||||
struct thermal_cooling_device *cpufreq_cooling_register(
|
||||
struct cpumask *clip_cpus);
|
||||
|
||||
/**
|
||||
* cpufreq_cooling_unregister - function to remove cpufreq cooling device.
|
||||
* @cdev: thermal cooling device pointer.
|
||||
*/
|
||||
void cpufreq_cooling_unregister(struct thermal_cooling_device *cdev);
|
||||
#else /* !CONFIG_CPU_THERMAL */
|
||||
static inline struct thermal_cooling_device *cpufreq_cooling_register(
|
||||
struct cpumask *clip_cpus)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
static inline void cpufreq_cooling_unregister(
|
||||
struct thermal_cooling_device *cdev)
|
||||
{
|
||||
return;
|
||||
}
|
||||
#endif /* CONFIG_CPU_THERMAL */
|
||||
|
||||
#endif /* __CPU_COOLING_H__ */
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* exynos4_tmu.h - Samsung EXYNOS4 TMU (Thermal Management Unit)
|
||||
* exynos_thermal.h - Samsung EXYNOS TMU (Thermal Management Unit)
|
||||
*
|
||||
* Copyright (C) 2011 Samsung Electronics
|
||||
* Donggeun Kim <dg77.kim@samsung.com>
|
||||
@@ -19,8 +19,9 @@
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#ifndef _LINUX_EXYNOS4_TMU_H
|
||||
#define _LINUX_EXYNOS4_TMU_H
|
||||
#ifndef _LINUX_EXYNOS_THERMAL_H
|
||||
#define _LINUX_EXYNOS_THERMAL_H
|
||||
#include <linux/cpu_cooling.h>
|
||||
|
||||
enum calibration_type {
|
||||
TYPE_ONE_POINT_TRIMMING,
|
||||
@@ -28,8 +29,28 @@ enum calibration_type {
|
||||
TYPE_NONE,
|
||||
};
|
||||
|
||||
enum soc_type {
|
||||
SOC_ARCH_EXYNOS4210 = 1,
|
||||
SOC_ARCH_EXYNOS,
|
||||
};
|
||||
/**
|
||||
* struct exynos4_tmu_platform_data
|
||||
* struct freq_clip_table
|
||||
* @freq_clip_max: maximum frequency allowed for this cooling state.
|
||||
* @temp_level: Temperature level at which the temperature clipping will
|
||||
* happen.
|
||||
* @mask_val: cpumask of the allowed cpu's where the clipping will take place.
|
||||
*
|
||||
* This structure is required to be filled and passed to the
|
||||
* cpufreq_cooling_unregister function.
|
||||
*/
|
||||
struct freq_clip_table {
|
||||
unsigned int freq_clip_max;
|
||||
unsigned int temp_level;
|
||||
const struct cpumask *mask_val;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct exynos_tmu_platform_data
|
||||
* @threshold: basic temperature for generating interrupt
|
||||
* 25 <= threshold <= 125 [unit: degree Celsius]
|
||||
* @trigger_levels: array for each interrupt levels
|
||||
@@ -63,11 +84,18 @@ enum calibration_type {
|
||||
* @reference_voltage: reference voltage of amplifier
|
||||
* in the positive-TC generator block
|
||||
* 0 <= reference_voltage <= 31
|
||||
* @noise_cancel_mode: noise cancellation mode
|
||||
* 000, 100, 101, 110 and 111 can be different modes
|
||||
* @type: determines the type of SOC
|
||||
* @efuse_value: platform defined fuse value
|
||||
* @cal_type: calibration type for temperature
|
||||
* @freq_clip_table: Table representing frequency reduction percentage.
|
||||
* @freq_tab_count: Count of the above table as frequency reduction may
|
||||
* applicable to only some of the trigger levels.
|
||||
*
|
||||
* This structure is required for configuration of exynos4_tmu driver.
|
||||
* This structure is required for configuration of exynos_tmu driver.
|
||||
*/
|
||||
struct exynos4_tmu_platform_data {
|
||||
struct exynos_tmu_platform_data {
|
||||
u8 threshold;
|
||||
u8 trigger_levels[4];
|
||||
bool trigger_level0_en;
|
||||
@@ -77,7 +105,12 @@ struct exynos4_tmu_platform_data {
|
||||
|
||||
u8 gain;
|
||||
u8 reference_voltage;
|
||||
u8 noise_cancel_mode;
|
||||
u32 efuse_value;
|
||||
|
||||
enum calibration_type cal_type;
|
||||
enum soc_type type;
|
||||
struct freq_clip_table freq_tab[4];
|
||||
unsigned int freq_tab_count;
|
||||
};
|
||||
#endif /* _LINUX_EXYNOS4_TMU_H */
|
||||
#endif /* _LINUX_EXYNOS_THERMAL_H */
|
@@ -44,6 +44,12 @@ enum thermal_trip_type {
|
||||
THERMAL_TRIP_CRITICAL,
|
||||
};
|
||||
|
||||
enum thermal_trend {
|
||||
THERMAL_TREND_STABLE, /* temperature is stable */
|
||||
THERMAL_TREND_RAISING, /* temperature is raising */
|
||||
THERMAL_TREND_DROPPING, /* temperature is dropping */
|
||||
};
|
||||
|
||||
struct thermal_zone_device_ops {
|
||||
int (*bind) (struct thermal_zone_device *,
|
||||
struct thermal_cooling_device *);
|
||||
@@ -65,6 +71,8 @@ struct thermal_zone_device_ops {
|
||||
int (*set_trip_hyst) (struct thermal_zone_device *, int,
|
||||
unsigned long);
|
||||
int (*get_crit_temp) (struct thermal_zone_device *, unsigned long *);
|
||||
int (*get_trend) (struct thermal_zone_device *, int,
|
||||
enum thermal_trend *);
|
||||
int (*notify) (struct thermal_zone_device *, int,
|
||||
enum thermal_trip_type);
|
||||
};
|
||||
@@ -75,6 +83,8 @@ struct thermal_cooling_device_ops {
|
||||
int (*set_cur_state) (struct thermal_cooling_device *, unsigned long);
|
||||
};
|
||||
|
||||
#define THERMAL_NO_LIMIT -1UL /* no upper/lower limit requirement */
|
||||
|
||||
#define THERMAL_TRIPS_NONE -1
|
||||
#define THERMAL_MAX_TRIPS 12
|
||||
#define THERMAL_NAME_LENGTH 20
|
||||
@@ -84,6 +94,9 @@ struct thermal_cooling_device {
|
||||
struct device device;
|
||||
void *devdata;
|
||||
const struct thermal_cooling_device_ops *ops;
|
||||
bool updated; /* true if the cooling device does not need update */
|
||||
struct mutex lock; /* protect thermal_instances list */
|
||||
struct list_head thermal_instances;
|
||||
struct list_head node;
|
||||
};
|
||||
|
||||
@@ -105,17 +118,16 @@ struct thermal_zone_device {
|
||||
struct thermal_attr *trip_hyst_attrs;
|
||||
void *devdata;
|
||||
int trips;
|
||||
int tc1;
|
||||
int tc2;
|
||||
int passive_delay;
|
||||
int polling_delay;
|
||||
int temperature;
|
||||
int last_temperature;
|
||||
bool passive;
|
||||
int passive;
|
||||
unsigned int forced_passive;
|
||||
const struct thermal_zone_device_ops *ops;
|
||||
struct list_head cooling_devices;
|
||||
struct list_head thermal_instances;
|
||||
struct idr idr;
|
||||
struct mutex lock; /* protect cooling devices list */
|
||||
struct mutex lock; /* protect thermal_instances list */
|
||||
struct list_head node;
|
||||
struct delayed_work poll_queue;
|
||||
};
|
||||
@@ -152,12 +164,12 @@ enum {
|
||||
#define THERMAL_GENL_CMD_MAX (__THERMAL_GENL_CMD_MAX - 1)
|
||||
|
||||
struct thermal_zone_device *thermal_zone_device_register(const char *, int, int,
|
||||
void *, const struct thermal_zone_device_ops *, int tc1,
|
||||
int tc2, int passive_freq, int polling_freq);
|
||||
void *, const struct thermal_zone_device_ops *, int, int);
|
||||
void thermal_zone_device_unregister(struct thermal_zone_device *);
|
||||
|
||||
int thermal_zone_bind_cooling_device(struct thermal_zone_device *, int,
|
||||
struct thermal_cooling_device *);
|
||||
struct thermal_cooling_device *,
|
||||
unsigned long, unsigned long);
|
||||
int thermal_zone_unbind_cooling_device(struct thermal_zone_device *, int,
|
||||
struct thermal_cooling_device *);
|
||||
void thermal_zone_device_update(struct thermal_zone_device *);
|
||||
|
Reference in New Issue
Block a user