mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-30 19:51:31 -04:00
Merge branches 'fixes-for-37', 'ec' and 'thermal' into release
This commit is contained in:
commit
d1d4a81b84
22 changed files with 2202 additions and 733 deletions
|
|
@ -71,9 +71,6 @@ enum ec_command {
|
|||
#define ACPI_EC_UDELAY_GLK 1000 /* Wait 1ms max. to get global lock */
|
||||
#define ACPI_EC_MSI_UDELAY 550 /* Wait 550us for MSI EC */
|
||||
|
||||
#define ACPI_EC_STORM_THRESHOLD 8 /* number of false interrupts
|
||||
per one transaction */
|
||||
|
||||
enum {
|
||||
EC_FLAGS_QUERY_PENDING, /* Query is pending */
|
||||
EC_FLAGS_GPE_STORM, /* GPE storm detected */
|
||||
|
|
@ -87,6 +84,15 @@ static unsigned int ec_delay __read_mostly = ACPI_EC_DELAY;
|
|||
module_param(ec_delay, uint, 0644);
|
||||
MODULE_PARM_DESC(ec_delay, "Timeout(ms) waited until an EC command completes");
|
||||
|
||||
/*
|
||||
* If the number of false interrupts per one transaction exceeds
|
||||
* this threshold, will think there is a GPE storm happened and
|
||||
* will disable the GPE for normal transaction.
|
||||
*/
|
||||
static unsigned int ec_storm_threshold __read_mostly = 8;
|
||||
module_param(ec_storm_threshold, uint, 0644);
|
||||
MODULE_PARM_DESC(ec_storm_threshold, "Maxim false GPE numbers not considered as GPE storm");
|
||||
|
||||
/* If we find an EC via the ECDT, we need to keep a ptr to its context */
|
||||
/* External interfaces use first EC only, so remember */
|
||||
typedef int (*acpi_ec_query_func) (void *data);
|
||||
|
|
@ -319,7 +325,7 @@ static int acpi_ec_transaction(struct acpi_ec *ec, struct transaction *t)
|
|||
msleep(1);
|
||||
/* It is safe to enable the GPE outside of the transaction. */
|
||||
acpi_enable_gpe(NULL, ec->gpe);
|
||||
} else if (t->irq_count > ACPI_EC_STORM_THRESHOLD) {
|
||||
} else if (t->irq_count > ec_storm_threshold) {
|
||||
pr_info(PREFIX "GPE storm detected, "
|
||||
"transactions will use polling mode\n");
|
||||
set_bit(EC_FLAGS_GPE_STORM, &ec->flags);
|
||||
|
|
@ -924,6 +930,17 @@ static int ec_flag_msi(const struct dmi_system_id *id)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Clevo M720 notebook actually works ok with IRQ mode, if we lifted
|
||||
* the GPE storm threshold back to 20
|
||||
*/
|
||||
static int ec_enlarge_storm_threshold(const struct dmi_system_id *id)
|
||||
{
|
||||
pr_debug("Setting the EC GPE storm threshold to 20\n");
|
||||
ec_storm_threshold = 20;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct dmi_system_id __initdata ec_dmi_table[] = {
|
||||
{
|
||||
ec_skip_dsdt_scan, "Compal JFL92", {
|
||||
|
|
@ -955,10 +972,13 @@ static struct dmi_system_id __initdata ec_dmi_table[] = {
|
|||
{
|
||||
ec_validate_ecdt, "ASUS hardware", {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer Inc.") }, NULL},
|
||||
{
|
||||
ec_enlarge_storm_threshold, "CLEVO hardware", {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "CLEVO Co."),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "M720T/M730T"),}, NULL},
|
||||
{},
|
||||
};
|
||||
|
||||
|
||||
int __init acpi_ec_ecdt_probe(void)
|
||||
{
|
||||
acpi_status status;
|
||||
|
|
|
|||
|
|
@ -708,6 +708,40 @@ static int thermal_get_crit_temp(struct thermal_zone_device *thermal,
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
static int thermal_get_trend(struct thermal_zone_device *thermal,
|
||||
int trip, enum thermal_trend *trend)
|
||||
{
|
||||
struct acpi_thermal *tz = thermal->devdata;
|
||||
enum thermal_trip_type type;
|
||||
int i;
|
||||
|
||||
if (thermal_get_trip_type(thermal, trip, &type))
|
||||
return -EINVAL;
|
||||
|
||||
if (type == THERMAL_TRIP_ACTIVE) {
|
||||
/* aggressive active cooling */
|
||||
*trend = THERMAL_TREND_RAISING;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* tz->temperature has already been updated by generic thermal layer,
|
||||
* before this callback being invoked
|
||||
*/
|
||||
i = (tz->trips.passive.tc1 * (tz->temperature - tz->last_temperature))
|
||||
+ (tz->trips.passive.tc2
|
||||
* (tz->temperature - tz->trips.passive.temperature));
|
||||
|
||||
if (i > 0)
|
||||
*trend = THERMAL_TREND_RAISING;
|
||||
else if (i < 0)
|
||||
*trend = THERMAL_TREND_DROPPING;
|
||||
else
|
||||
*trend = THERMAL_TREND_STABLE;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static int thermal_notify(struct thermal_zone_device *thermal, int trip,
|
||||
enum thermal_trip_type trip_type)
|
||||
{
|
||||
|
|
@ -731,11 +765,9 @@ static int thermal_notify(struct thermal_zone_device *thermal, int trip,
|
|||
return 0;
|
||||
}
|
||||
|
||||
typedef int (*cb)(struct thermal_zone_device *, int,
|
||||
struct thermal_cooling_device *);
|
||||
static int acpi_thermal_cooling_device_cb(struct thermal_zone_device *thermal,
|
||||
struct thermal_cooling_device *cdev,
|
||||
cb action)
|
||||
bool bind)
|
||||
{
|
||||
struct acpi_device *device = cdev->devdata;
|
||||
struct acpi_thermal *tz = thermal->devdata;
|
||||
|
|
@ -759,11 +791,19 @@ static int acpi_thermal_cooling_device_cb(struct thermal_zone_device *thermal,
|
|||
i++) {
|
||||
handle = tz->trips.passive.devices.handles[i];
|
||||
status = acpi_bus_get_device(handle, &dev);
|
||||
if (ACPI_SUCCESS(status) && (dev == device)) {
|
||||
result = action(thermal, trip, cdev);
|
||||
if (result)
|
||||
goto failed;
|
||||
}
|
||||
if (ACPI_FAILURE(status) || dev != device)
|
||||
continue;
|
||||
if (bind)
|
||||
result =
|
||||
thermal_zone_bind_cooling_device
|
||||
(thermal, trip, cdev,
|
||||
THERMAL_NO_LIMIT, THERMAL_NO_LIMIT);
|
||||
else
|
||||
result =
|
||||
thermal_zone_unbind_cooling_device
|
||||
(thermal, trip, cdev);
|
||||
if (result)
|
||||
goto failed;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -776,11 +816,17 @@ static int acpi_thermal_cooling_device_cb(struct thermal_zone_device *thermal,
|
|||
j++) {
|
||||
handle = tz->trips.active[i].devices.handles[j];
|
||||
status = acpi_bus_get_device(handle, &dev);
|
||||
if (ACPI_SUCCESS(status) && (dev == device)) {
|
||||
result = action(thermal, trip, cdev);
|
||||
if (result)
|
||||
goto failed;
|
||||
}
|
||||
if (ACPI_FAILURE(status) || dev != device)
|
||||
continue;
|
||||
if (bind)
|
||||
result = thermal_zone_bind_cooling_device
|
||||
(thermal, trip, cdev,
|
||||
THERMAL_NO_LIMIT, THERMAL_NO_LIMIT);
|
||||
else
|
||||
result = thermal_zone_unbind_cooling_device
|
||||
(thermal, trip, cdev);
|
||||
if (result)
|
||||
goto failed;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -788,7 +834,14 @@ static int acpi_thermal_cooling_device_cb(struct thermal_zone_device *thermal,
|
|||
handle = tz->devices.handles[i];
|
||||
status = acpi_bus_get_device(handle, &dev);
|
||||
if (ACPI_SUCCESS(status) && (dev == device)) {
|
||||
result = action(thermal, -1, cdev);
|
||||
if (bind)
|
||||
result = thermal_zone_bind_cooling_device
|
||||
(thermal, -1, cdev,
|
||||
THERMAL_NO_LIMIT,
|
||||
THERMAL_NO_LIMIT);
|
||||
else
|
||||
result = thermal_zone_unbind_cooling_device
|
||||
(thermal, -1, cdev);
|
||||
if (result)
|
||||
goto failed;
|
||||
}
|
||||
|
|
@ -802,16 +855,14 @@ static int
|
|||
acpi_thermal_bind_cooling_device(struct thermal_zone_device *thermal,
|
||||
struct thermal_cooling_device *cdev)
|
||||
{
|
||||
return acpi_thermal_cooling_device_cb(thermal, cdev,
|
||||
thermal_zone_bind_cooling_device);
|
||||
return acpi_thermal_cooling_device_cb(thermal, cdev, true);
|
||||
}
|
||||
|
||||
static int
|
||||
acpi_thermal_unbind_cooling_device(struct thermal_zone_device *thermal,
|
||||
struct thermal_cooling_device *cdev)
|
||||
{
|
||||
return acpi_thermal_cooling_device_cb(thermal, cdev,
|
||||
thermal_zone_unbind_cooling_device);
|
||||
return acpi_thermal_cooling_device_cb(thermal, cdev, false);
|
||||
}
|
||||
|
||||
static const struct thermal_zone_device_ops acpi_thermal_zone_ops = {
|
||||
|
|
@ -823,6 +874,7 @@ static const struct thermal_zone_device_ops acpi_thermal_zone_ops = {
|
|||
.get_trip_type = thermal_get_trip_type,
|
||||
.get_trip_temp = thermal_get_trip_temp,
|
||||
.get_crit_temp = thermal_get_crit_temp,
|
||||
.get_trend = thermal_get_trend,
|
||||
.notify = thermal_notify,
|
||||
};
|
||||
|
||||
|
|
@ -849,15 +901,12 @@ static int acpi_thermal_register_thermal_zone(struct acpi_thermal *tz)
|
|||
tz->thermal_zone =
|
||||
thermal_zone_device_register("acpitz", trips, 0, tz,
|
||||
&acpi_thermal_zone_ops,
|
||||
tz->trips.passive.tc1,
|
||||
tz->trips.passive.tc2,
|
||||
tz->trips.passive.tsp*100,
|
||||
tz->polling_frequency*100);
|
||||
else
|
||||
tz->thermal_zone =
|
||||
thermal_zone_device_register("acpitz", trips, 0, tz,
|
||||
&acpi_thermal_zone_ops,
|
||||
0, 0, 0,
|
||||
&acpi_thermal_zone_ops, 0,
|
||||
tz->polling_frequency*100);
|
||||
if (IS_ERR(tz->thermal_zone))
|
||||
return -ENODEV;
|
||||
|
|
|
|||
Loading…
Reference in a new issue