mirror of
https://github.com/torvalds/linux
synced 2024-11-05 18:23:50 +00:00
Merge branch 'acpi-assorted'
* acpi-assorted: ACPI: Add Toshiba NB100 to Vista _OSI blacklist ACPI / osl: remove an unneeded NULL check ACPI / platform: add ACPI ID for a Broadcom GPS chip ACPI: improve acpi_extract_package() utility ACPI / LPSS: fix UART Auto Flow Control ACPI / platform: Add ACPI IDs for Intel SST audio device x86 / ACPI: fix incorrect placement of __initdata tag ACPI / thermal: convert printk(LEVEL...) to pr_<lvl> ACPI / sysfs: make GPE sysfs attributes only accept correct values ACPI / EC: Convert all printk() calls to dynamic debug function ACPI / button: Using input_set_capability() to mark device's event capability ACPI / osl: implement acpi_os_sleep() with msleep()
This commit is contained in:
commit
5171f4fa74
9 changed files with 85 additions and 66 deletions
|
@ -695,7 +695,7 @@ static int __init acpi_parse_sbf(struct acpi_table_header *table)
|
||||||
#ifdef CONFIG_HPET_TIMER
|
#ifdef CONFIG_HPET_TIMER
|
||||||
#include <asm/hpet.h>
|
#include <asm/hpet.h>
|
||||||
|
|
||||||
static struct __initdata resource *hpet_res;
|
static struct resource *hpet_res __initdata;
|
||||||
|
|
||||||
static int __init acpi_parse_hpet(struct acpi_table_header *table)
|
static int __init acpi_parse_hpet(struct acpi_table_header *table)
|
||||||
{
|
{
|
||||||
|
|
|
@ -30,6 +30,7 @@ ACPI_MODULE_NAME("acpi_lpss");
|
||||||
/* Offsets relative to LPSS_PRIVATE_OFFSET */
|
/* Offsets relative to LPSS_PRIVATE_OFFSET */
|
||||||
#define LPSS_GENERAL 0x08
|
#define LPSS_GENERAL 0x08
|
||||||
#define LPSS_GENERAL_LTR_MODE_SW BIT(2)
|
#define LPSS_GENERAL_LTR_MODE_SW BIT(2)
|
||||||
|
#define LPSS_GENERAL_UART_RTS_OVRD BIT(3)
|
||||||
#define LPSS_SW_LTR 0x10
|
#define LPSS_SW_LTR 0x10
|
||||||
#define LPSS_AUTO_LTR 0x14
|
#define LPSS_AUTO_LTR 0x14
|
||||||
#define LPSS_TX_INT 0x20
|
#define LPSS_TX_INT 0x20
|
||||||
|
@ -68,11 +69,16 @@ struct lpss_private_data {
|
||||||
|
|
||||||
static void lpss_uart_setup(struct lpss_private_data *pdata)
|
static void lpss_uart_setup(struct lpss_private_data *pdata)
|
||||||
{
|
{
|
||||||
unsigned int tx_int_offset = pdata->dev_desc->prv_offset + LPSS_TX_INT;
|
unsigned int offset;
|
||||||
u32 reg;
|
u32 reg;
|
||||||
|
|
||||||
reg = readl(pdata->mmio_base + tx_int_offset);
|
offset = pdata->dev_desc->prv_offset + LPSS_TX_INT;
|
||||||
writel(reg | LPSS_TX_INT_MASK, pdata->mmio_base + tx_int_offset);
|
reg = readl(pdata->mmio_base + offset);
|
||||||
|
writel(reg | LPSS_TX_INT_MASK, pdata->mmio_base + offset);
|
||||||
|
|
||||||
|
offset = pdata->dev_desc->prv_offset + LPSS_GENERAL;
|
||||||
|
reg = readl(pdata->mmio_base + offset);
|
||||||
|
writel(reg | LPSS_GENERAL_UART_RTS_OVRD, pdata->mmio_base + offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct lpss_device_desc lpt_dev_desc = {
|
static struct lpss_device_desc lpt_dev_desc = {
|
||||||
|
|
|
@ -31,6 +31,12 @@ static const struct acpi_device_id acpi_platform_device_ids[] = {
|
||||||
{ "PNP0D40" },
|
{ "PNP0D40" },
|
||||||
{ "ACPI0003" },
|
{ "ACPI0003" },
|
||||||
{ "VPC2004" },
|
{ "VPC2004" },
|
||||||
|
{ "BCM4752" },
|
||||||
|
|
||||||
|
/* Intel Smart Sound Technology */
|
||||||
|
{ "INT33C8" },
|
||||||
|
{ "80860F28" },
|
||||||
|
|
||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -383,18 +383,15 @@ static int acpi_button_add(struct acpi_device *device)
|
||||||
|
|
||||||
switch (button->type) {
|
switch (button->type) {
|
||||||
case ACPI_BUTTON_TYPE_POWER:
|
case ACPI_BUTTON_TYPE_POWER:
|
||||||
input->evbit[0] = BIT_MASK(EV_KEY);
|
input_set_capability(input, EV_KEY, KEY_POWER);
|
||||||
set_bit(KEY_POWER, input->keybit);
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ACPI_BUTTON_TYPE_SLEEP:
|
case ACPI_BUTTON_TYPE_SLEEP:
|
||||||
input->evbit[0] = BIT_MASK(EV_KEY);
|
input_set_capability(input, EV_KEY, KEY_SLEEP);
|
||||||
set_bit(KEY_SLEEP, input->keybit);
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ACPI_BUTTON_TYPE_LID:
|
case ACPI_BUTTON_TYPE_LID:
|
||||||
input->evbit[0] = BIT_MASK(EV_SW);
|
input_set_capability(input, EV_SW, SW_LID);
|
||||||
set_bit(SW_LID, input->swbit);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -28,6 +28,7 @@
|
||||||
|
|
||||||
/* Uncomment next line to get verbose printout */
|
/* Uncomment next line to get verbose printout */
|
||||||
/* #define DEBUG */
|
/* #define DEBUG */
|
||||||
|
#define pr_fmt(fmt) "ACPI : EC: " fmt
|
||||||
|
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
|
@ -49,9 +50,6 @@
|
||||||
#define ACPI_EC_DEVICE_NAME "Embedded Controller"
|
#define ACPI_EC_DEVICE_NAME "Embedded Controller"
|
||||||
#define ACPI_EC_FILE_INFO "info"
|
#define ACPI_EC_FILE_INFO "info"
|
||||||
|
|
||||||
#undef PREFIX
|
|
||||||
#define PREFIX "ACPI: EC: "
|
|
||||||
|
|
||||||
/* EC status register */
|
/* EC status register */
|
||||||
#define ACPI_EC_FLAG_OBF 0x01 /* Output buffer full */
|
#define ACPI_EC_FLAG_OBF 0x01 /* Output buffer full */
|
||||||
#define ACPI_EC_FLAG_IBF 0x02 /* Input buffer full */
|
#define ACPI_EC_FLAG_IBF 0x02 /* Input buffer full */
|
||||||
|
@ -131,26 +129,26 @@ static int EC_FLAGS_SKIP_DSDT_SCAN; /* Not all BIOS survive early DSDT scan */
|
||||||
static inline u8 acpi_ec_read_status(struct acpi_ec *ec)
|
static inline u8 acpi_ec_read_status(struct acpi_ec *ec)
|
||||||
{
|
{
|
||||||
u8 x = inb(ec->command_addr);
|
u8 x = inb(ec->command_addr);
|
||||||
pr_debug(PREFIX "---> status = 0x%2.2x\n", x);
|
pr_debug("---> status = 0x%2.2x\n", x);
|
||||||
return x;
|
return x;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline u8 acpi_ec_read_data(struct acpi_ec *ec)
|
static inline u8 acpi_ec_read_data(struct acpi_ec *ec)
|
||||||
{
|
{
|
||||||
u8 x = inb(ec->data_addr);
|
u8 x = inb(ec->data_addr);
|
||||||
pr_debug(PREFIX "---> data = 0x%2.2x\n", x);
|
pr_debug("---> data = 0x%2.2x\n", x);
|
||||||
return x;
|
return x;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void acpi_ec_write_cmd(struct acpi_ec *ec, u8 command)
|
static inline void acpi_ec_write_cmd(struct acpi_ec *ec, u8 command)
|
||||||
{
|
{
|
||||||
pr_debug(PREFIX "<--- command = 0x%2.2x\n", command);
|
pr_debug("<--- command = 0x%2.2x\n", command);
|
||||||
outb(command, ec->command_addr);
|
outb(command, ec->command_addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void acpi_ec_write_data(struct acpi_ec *ec, u8 data)
|
static inline void acpi_ec_write_data(struct acpi_ec *ec, u8 data)
|
||||||
{
|
{
|
||||||
pr_debug(PREFIX "<--- data = 0x%2.2x\n", data);
|
pr_debug("<--- data = 0x%2.2x\n", data);
|
||||||
outb(data, ec->data_addr);
|
outb(data, ec->data_addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -241,7 +239,7 @@ static int ec_poll(struct acpi_ec *ec)
|
||||||
}
|
}
|
||||||
advance_transaction(ec, acpi_ec_read_status(ec));
|
advance_transaction(ec, acpi_ec_read_status(ec));
|
||||||
} while (time_before(jiffies, delay));
|
} while (time_before(jiffies, delay));
|
||||||
pr_debug(PREFIX "controller reset, restart transaction\n");
|
pr_debug("controller reset, restart transaction\n");
|
||||||
spin_lock_irqsave(&ec->lock, flags);
|
spin_lock_irqsave(&ec->lock, flags);
|
||||||
start_transaction(ec);
|
start_transaction(ec);
|
||||||
spin_unlock_irqrestore(&ec->lock, flags);
|
spin_unlock_irqrestore(&ec->lock, flags);
|
||||||
|
@ -309,12 +307,12 @@ static int acpi_ec_transaction(struct acpi_ec *ec, struct transaction *t)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (ec_wait_ibf0(ec)) {
|
if (ec_wait_ibf0(ec)) {
|
||||||
pr_err(PREFIX "input buffer is not empty, "
|
pr_err("input buffer is not empty, "
|
||||||
"aborting transaction\n");
|
"aborting transaction\n");
|
||||||
status = -ETIME;
|
status = -ETIME;
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
pr_debug(PREFIX "transaction start (cmd=0x%02x, addr=0x%02x)\n",
|
pr_debug("transaction start (cmd=0x%02x, addr=0x%02x)\n",
|
||||||
t->command, t->wdata ? t->wdata[0] : 0);
|
t->command, t->wdata ? t->wdata[0] : 0);
|
||||||
/* disable GPE during transaction if storm is detected */
|
/* disable GPE during transaction if storm is detected */
|
||||||
if (test_bit(EC_FLAGS_GPE_STORM, &ec->flags)) {
|
if (test_bit(EC_FLAGS_GPE_STORM, &ec->flags)) {
|
||||||
|
@ -331,12 +329,12 @@ static int acpi_ec_transaction(struct acpi_ec *ec, struct transaction *t)
|
||||||
/* It is safe to enable the GPE outside of the transaction. */
|
/* It is safe to enable the GPE outside of the transaction. */
|
||||||
acpi_enable_gpe(NULL, ec->gpe);
|
acpi_enable_gpe(NULL, ec->gpe);
|
||||||
} else if (t->irq_count > ec_storm_threshold) {
|
} else if (t->irq_count > ec_storm_threshold) {
|
||||||
pr_info(PREFIX "GPE storm detected(%d GPEs), "
|
pr_info("GPE storm detected(%d GPEs), "
|
||||||
"transactions will use polling mode\n",
|
"transactions will use polling mode\n",
|
||||||
t->irq_count);
|
t->irq_count);
|
||||||
set_bit(EC_FLAGS_GPE_STORM, &ec->flags);
|
set_bit(EC_FLAGS_GPE_STORM, &ec->flags);
|
||||||
}
|
}
|
||||||
pr_debug(PREFIX "transaction end\n");
|
pr_debug("transaction end\n");
|
||||||
end:
|
end:
|
||||||
if (ec->global_lock)
|
if (ec->global_lock)
|
||||||
acpi_release_global_lock(glk);
|
acpi_release_global_lock(glk);
|
||||||
|
@ -570,12 +568,12 @@ static void acpi_ec_run(void *cxt)
|
||||||
struct acpi_ec_query_handler *handler = cxt;
|
struct acpi_ec_query_handler *handler = cxt;
|
||||||
if (!handler)
|
if (!handler)
|
||||||
return;
|
return;
|
||||||
pr_debug(PREFIX "start query execution\n");
|
pr_debug("start query execution\n");
|
||||||
if (handler->func)
|
if (handler->func)
|
||||||
handler->func(handler->data);
|
handler->func(handler->data);
|
||||||
else if (handler->handle)
|
else if (handler->handle)
|
||||||
acpi_evaluate_object(handler->handle, NULL, NULL, NULL);
|
acpi_evaluate_object(handler->handle, NULL, NULL, NULL);
|
||||||
pr_debug(PREFIX "stop query execution\n");
|
pr_debug("stop query execution\n");
|
||||||
kfree(handler);
|
kfree(handler);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -593,7 +591,8 @@ static int acpi_ec_sync_query(struct acpi_ec *ec)
|
||||||
if (!copy)
|
if (!copy)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
memcpy(copy, handler, sizeof(*copy));
|
memcpy(copy, handler, sizeof(*copy));
|
||||||
pr_debug(PREFIX "push query execution (0x%2x) on queue\n", value);
|
pr_debug("push query execution (0x%2x) on queue\n",
|
||||||
|
value);
|
||||||
return acpi_os_execute((copy->func) ?
|
return acpi_os_execute((copy->func) ?
|
||||||
OSL_NOTIFY_HANDLER : OSL_GPE_HANDLER,
|
OSL_NOTIFY_HANDLER : OSL_GPE_HANDLER,
|
||||||
acpi_ec_run, copy);
|
acpi_ec_run, copy);
|
||||||
|
@ -616,7 +615,7 @@ static int ec_check_sci(struct acpi_ec *ec, u8 state)
|
||||||
{
|
{
|
||||||
if (state & ACPI_EC_FLAG_SCI) {
|
if (state & ACPI_EC_FLAG_SCI) {
|
||||||
if (!test_and_set_bit(EC_FLAGS_QUERY_PENDING, &ec->flags)) {
|
if (!test_and_set_bit(EC_FLAGS_QUERY_PENDING, &ec->flags)) {
|
||||||
pr_debug(PREFIX "push gpe query to the queue\n");
|
pr_debug("push gpe query to the queue\n");
|
||||||
return acpi_os_execute(OSL_NOTIFY_HANDLER,
|
return acpi_os_execute(OSL_NOTIFY_HANDLER,
|
||||||
acpi_ec_gpe_query, ec);
|
acpi_ec_gpe_query, ec);
|
||||||
}
|
}
|
||||||
|
@ -630,7 +629,7 @@ static u32 acpi_ec_gpe_handler(acpi_handle gpe_device,
|
||||||
struct acpi_ec *ec = data;
|
struct acpi_ec *ec = data;
|
||||||
u8 status = acpi_ec_read_status(ec);
|
u8 status = acpi_ec_read_status(ec);
|
||||||
|
|
||||||
pr_debug(PREFIX "~~~> interrupt, status:0x%02x\n", status);
|
pr_debug("~~~> interrupt, status:0x%02x\n", status);
|
||||||
|
|
||||||
advance_transaction(ec, status);
|
advance_transaction(ec, status);
|
||||||
if (ec_transaction_done(ec) &&
|
if (ec_transaction_done(ec) &&
|
||||||
|
@ -776,7 +775,7 @@ static int ec_install_handlers(struct acpi_ec *ec)
|
||||||
* The AE_NOT_FOUND error will be ignored and OS
|
* The AE_NOT_FOUND error will be ignored and OS
|
||||||
* continue to initialize EC.
|
* continue to initialize EC.
|
||||||
*/
|
*/
|
||||||
printk(KERN_ERR "Fail in evaluating the _REG object"
|
pr_err("Fail in evaluating the _REG object"
|
||||||
" of EC device. Broken bios is suspected.\n");
|
" of EC device. Broken bios is suspected.\n");
|
||||||
} else {
|
} else {
|
||||||
acpi_remove_gpe_handler(NULL, ec->gpe,
|
acpi_remove_gpe_handler(NULL, ec->gpe,
|
||||||
|
@ -795,10 +794,10 @@ static void ec_remove_handlers(struct acpi_ec *ec)
|
||||||
acpi_disable_gpe(NULL, ec->gpe);
|
acpi_disable_gpe(NULL, ec->gpe);
|
||||||
if (ACPI_FAILURE(acpi_remove_address_space_handler(ec->handle,
|
if (ACPI_FAILURE(acpi_remove_address_space_handler(ec->handle,
|
||||||
ACPI_ADR_SPACE_EC, &acpi_ec_space_handler)))
|
ACPI_ADR_SPACE_EC, &acpi_ec_space_handler)))
|
||||||
pr_err(PREFIX "failed to remove space handler\n");
|
pr_err("failed to remove space handler\n");
|
||||||
if (ACPI_FAILURE(acpi_remove_gpe_handler(NULL, ec->gpe,
|
if (ACPI_FAILURE(acpi_remove_gpe_handler(NULL, ec->gpe,
|
||||||
&acpi_ec_gpe_handler)))
|
&acpi_ec_gpe_handler)))
|
||||||
pr_err(PREFIX "failed to remove gpe handler\n");
|
pr_err("failed to remove gpe handler\n");
|
||||||
clear_bit(EC_FLAGS_HANDLERS_INSTALLED, &ec->flags);
|
clear_bit(EC_FLAGS_HANDLERS_INSTALLED, &ec->flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -840,7 +839,7 @@ static int acpi_ec_add(struct acpi_device *device)
|
||||||
ret = !!request_region(ec->command_addr, 1, "EC cmd");
|
ret = !!request_region(ec->command_addr, 1, "EC cmd");
|
||||||
WARN(!ret, "Could not request EC cmd io port 0x%lx", ec->command_addr);
|
WARN(!ret, "Could not request EC cmd io port 0x%lx", ec->command_addr);
|
||||||
|
|
||||||
pr_info(PREFIX "GPE = 0x%lx, I/O: command/status = 0x%lx, data = 0x%lx\n",
|
pr_info("GPE = 0x%lx, I/O: command/status = 0x%lx, data = 0x%lx\n",
|
||||||
ec->gpe, ec->command_addr, ec->data_addr);
|
ec->gpe, ec->command_addr, ec->data_addr);
|
||||||
|
|
||||||
ret = ec_install_handlers(ec);
|
ret = ec_install_handlers(ec);
|
||||||
|
@ -931,7 +930,7 @@ static int ec_validate_ecdt(const struct dmi_system_id *id)
|
||||||
/* MSI EC needs special treatment, enable it */
|
/* MSI EC needs special treatment, enable it */
|
||||||
static int ec_flag_msi(const struct dmi_system_id *id)
|
static int ec_flag_msi(const struct dmi_system_id *id)
|
||||||
{
|
{
|
||||||
printk(KERN_DEBUG PREFIX "Detected MSI hardware, enabling workarounds.\n");
|
pr_debug("Detected MSI hardware, enabling workarounds.\n");
|
||||||
EC_FLAGS_MSI = 1;
|
EC_FLAGS_MSI = 1;
|
||||||
EC_FLAGS_VALIDATE_ECDT = 1;
|
EC_FLAGS_VALIDATE_ECDT = 1;
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1010,7 +1009,7 @@ int __init acpi_ec_ecdt_probe(void)
|
||||||
status = acpi_get_table(ACPI_SIG_ECDT, 1,
|
status = acpi_get_table(ACPI_SIG_ECDT, 1,
|
||||||
(struct acpi_table_header **)&ecdt_ptr);
|
(struct acpi_table_header **)&ecdt_ptr);
|
||||||
if (ACPI_SUCCESS(status)) {
|
if (ACPI_SUCCESS(status)) {
|
||||||
pr_info(PREFIX "EC description table is found, configuring boot EC\n");
|
pr_info("EC description table is found, configuring boot EC\n");
|
||||||
boot_ec->command_addr = ecdt_ptr->control.address;
|
boot_ec->command_addr = ecdt_ptr->control.address;
|
||||||
boot_ec->data_addr = ecdt_ptr->data.address;
|
boot_ec->data_addr = ecdt_ptr->data.address;
|
||||||
boot_ec->gpe = ecdt_ptr->gpe;
|
boot_ec->gpe = ecdt_ptr->gpe;
|
||||||
|
@ -1030,7 +1029,7 @@ int __init acpi_ec_ecdt_probe(void)
|
||||||
|
|
||||||
/* This workaround is needed only on some broken machines,
|
/* This workaround is needed only on some broken machines,
|
||||||
* which require early EC, but fail to provide ECDT */
|
* which require early EC, but fail to provide ECDT */
|
||||||
printk(KERN_DEBUG PREFIX "Look up EC in DSDT\n");
|
pr_debug("Look up EC in DSDT\n");
|
||||||
status = acpi_get_devices(ec_device_ids[0].id, ec_parse_device,
|
status = acpi_get_devices(ec_device_ids[0].id, ec_parse_device,
|
||||||
boot_ec, NULL);
|
boot_ec, NULL);
|
||||||
/* Check that acpi_get_devices actually find something */
|
/* Check that acpi_get_devices actually find something */
|
||||||
|
@ -1042,7 +1041,7 @@ int __init acpi_ec_ecdt_probe(void)
|
||||||
saved_ec->data_addr != boot_ec->data_addr ||
|
saved_ec->data_addr != boot_ec->data_addr ||
|
||||||
saved_ec->gpe != boot_ec->gpe ||
|
saved_ec->gpe != boot_ec->gpe ||
|
||||||
saved_ec->handle != boot_ec->handle)
|
saved_ec->handle != boot_ec->handle)
|
||||||
pr_info(PREFIX "ASUSTek keeps feeding us with broken "
|
pr_info("ASUSTek keeps feeding us with broken "
|
||||||
"ECDT tables, which are very hard to workaround. "
|
"ECDT tables, which are very hard to workaround. "
|
||||||
"Trying to use DSDT EC info instead. Please send "
|
"Trying to use DSDT EC info instead. Please send "
|
||||||
"output of acpidump to linux-acpi@vger.kernel.org\n");
|
"output of acpidump to linux-acpi@vger.kernel.org\n");
|
||||||
|
|
|
@ -840,7 +840,7 @@ acpi_status acpi_os_remove_interrupt_handler(u32 irq, acpi_osd_handler handler)
|
||||||
|
|
||||||
void acpi_os_sleep(u64 ms)
|
void acpi_os_sleep(u64 ms)
|
||||||
{
|
{
|
||||||
schedule_timeout_interruptible(msecs_to_jiffies(ms));
|
msleep(ms);
|
||||||
}
|
}
|
||||||
|
|
||||||
void acpi_os_stall(u32 us)
|
void acpi_os_stall(u32 us)
|
||||||
|
@ -1355,7 +1355,7 @@ static int __init acpi_os_name_setup(char *str)
|
||||||
if (!str || !*str)
|
if (!str || !*str)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
for (; count-- && str && *str; str++) {
|
for (; count-- && *str; str++) {
|
||||||
if (isalnum(*str) || *str == ' ' || *str == ':')
|
if (isalnum(*str) || *str == ' ' || *str == ':')
|
||||||
*p++ = *str;
|
*p++ = *str;
|
||||||
else if (*str == '\'' || *str == '"')
|
else if (*str == '\'' || *str == '"')
|
||||||
|
|
|
@ -564,6 +564,7 @@ static ssize_t counter_set(struct kobject *kobj,
|
||||||
acpi_event_status status;
|
acpi_event_status status;
|
||||||
acpi_handle handle;
|
acpi_handle handle;
|
||||||
int result = 0;
|
int result = 0;
|
||||||
|
unsigned long tmp;
|
||||||
|
|
||||||
if (index == num_gpes + ACPI_NUM_FIXED_EVENTS + COUNT_SCI) {
|
if (index == num_gpes + ACPI_NUM_FIXED_EVENTS + COUNT_SCI) {
|
||||||
int i;
|
int i;
|
||||||
|
@ -596,8 +597,10 @@ static ssize_t counter_set(struct kobject *kobj,
|
||||||
else if (!strcmp(buf, "clear\n") &&
|
else if (!strcmp(buf, "clear\n") &&
|
||||||
(status & ACPI_EVENT_FLAG_SET))
|
(status & ACPI_EVENT_FLAG_SET))
|
||||||
result = acpi_clear_gpe(handle, index);
|
result = acpi_clear_gpe(handle, index);
|
||||||
|
else if (!kstrtoul(buf, 0, &tmp))
|
||||||
|
all_counters[index].count = tmp;
|
||||||
else
|
else
|
||||||
all_counters[index].count = strtoul(buf, NULL, 0);
|
result = -EINVAL;
|
||||||
} else if (index < num_gpes + ACPI_NUM_FIXED_EVENTS) {
|
} else if (index < num_gpes + ACPI_NUM_FIXED_EVENTS) {
|
||||||
int event = index - num_gpes;
|
int event = index - num_gpes;
|
||||||
if (!strcmp(buf, "disable\n") &&
|
if (!strcmp(buf, "disable\n") &&
|
||||||
|
@ -609,8 +612,10 @@ static ssize_t counter_set(struct kobject *kobj,
|
||||||
else if (!strcmp(buf, "clear\n") &&
|
else if (!strcmp(buf, "clear\n") &&
|
||||||
(status & ACPI_EVENT_FLAG_SET))
|
(status & ACPI_EVENT_FLAG_SET))
|
||||||
result = acpi_clear_event(event);
|
result = acpi_clear_event(event);
|
||||||
|
else if (!kstrtoul(buf, 0, &tmp))
|
||||||
|
all_counters[index].count = tmp;
|
||||||
else
|
else
|
||||||
all_counters[index].count = strtoul(buf, NULL, 0);
|
result = -EINVAL;
|
||||||
} else
|
} else
|
||||||
all_counters[index].count = strtoul(buf, NULL, 0);
|
all_counters[index].count = strtoul(buf, NULL, 0);
|
||||||
|
|
||||||
|
|
|
@ -299,8 +299,8 @@ static int acpi_thermal_trips_update(struct acpi_thermal *tz, int flag)
|
||||||
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
|
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
|
||||||
"No critical threshold\n"));
|
"No critical threshold\n"));
|
||||||
} else if (tmp <= 2732) {
|
} else if (tmp <= 2732) {
|
||||||
printk(KERN_WARNING FW_BUG "Invalid critical threshold "
|
pr_warn(FW_BUG "Invalid critical threshold (%llu)\n",
|
||||||
"(%llu)\n", tmp);
|
tmp);
|
||||||
tz->trips.critical.flags.valid = 0;
|
tz->trips.critical.flags.valid = 0;
|
||||||
} else {
|
} else {
|
||||||
tz->trips.critical.flags.valid = 1;
|
tz->trips.critical.flags.valid = 1;
|
||||||
|
@ -317,8 +317,8 @@ static int acpi_thermal_trips_update(struct acpi_thermal *tz, int flag)
|
||||||
* Allow override critical threshold
|
* Allow override critical threshold
|
||||||
*/
|
*/
|
||||||
if (crt_k > tz->trips.critical.temperature)
|
if (crt_k > tz->trips.critical.temperature)
|
||||||
printk(KERN_WARNING PREFIX
|
pr_warn(PREFIX "Critical threshold %d C\n",
|
||||||
"Critical threshold %d C\n", crt);
|
crt);
|
||||||
tz->trips.critical.temperature = crt_k;
|
tz->trips.critical.temperature = crt_k;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -390,8 +390,7 @@ static int acpi_thermal_trips_update(struct acpi_thermal *tz, int flag)
|
||||||
status = acpi_evaluate_reference(tz->device->handle, "_PSL",
|
status = acpi_evaluate_reference(tz->device->handle, "_PSL",
|
||||||
NULL, &devices);
|
NULL, &devices);
|
||||||
if (ACPI_FAILURE(status)) {
|
if (ACPI_FAILURE(status)) {
|
||||||
printk(KERN_WARNING PREFIX
|
pr_warn(PREFIX "Invalid passive threshold\n");
|
||||||
"Invalid passive threshold\n");
|
|
||||||
tz->trips.passive.flags.valid = 0;
|
tz->trips.passive.flags.valid = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -453,8 +452,8 @@ static int acpi_thermal_trips_update(struct acpi_thermal *tz, int flag)
|
||||||
status = acpi_evaluate_reference(tz->device->handle,
|
status = acpi_evaluate_reference(tz->device->handle,
|
||||||
name, NULL, &devices);
|
name, NULL, &devices);
|
||||||
if (ACPI_FAILURE(status)) {
|
if (ACPI_FAILURE(status)) {
|
||||||
printk(KERN_WARNING PREFIX
|
pr_warn(PREFIX "Invalid active%d threshold\n",
|
||||||
"Invalid active%d threshold\n", i);
|
i);
|
||||||
tz->trips.active[i].flags.valid = 0;
|
tz->trips.active[i].flags.valid = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -505,7 +504,7 @@ static int acpi_thermal_get_trip_points(struct acpi_thermal *tz)
|
||||||
valid |= tz->trips.active[i].flags.valid;
|
valid |= tz->trips.active[i].flags.valid;
|
||||||
|
|
||||||
if (!valid) {
|
if (!valid) {
|
||||||
printk(KERN_WARNING FW_BUG "No valid trip found\n");
|
pr_warn(FW_BUG "No valid trip found\n");
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -923,8 +922,7 @@ static int acpi_thermal_register_thermal_zone(struct acpi_thermal *tz)
|
||||||
acpi_bus_private_data_handler,
|
acpi_bus_private_data_handler,
|
||||||
tz->thermal_zone);
|
tz->thermal_zone);
|
||||||
if (ACPI_FAILURE(status)) {
|
if (ACPI_FAILURE(status)) {
|
||||||
printk(KERN_ERR PREFIX
|
pr_err(PREFIX "Error attaching device data\n");
|
||||||
"Error attaching device data\n");
|
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1094,9 +1092,8 @@ static int acpi_thermal_add(struct acpi_device *device)
|
||||||
if (result)
|
if (result)
|
||||||
goto free_memory;
|
goto free_memory;
|
||||||
|
|
||||||
printk(KERN_INFO PREFIX "%s [%s] (%ld C)\n",
|
pr_info(PREFIX "%s [%s] (%ld C)\n", acpi_device_name(device),
|
||||||
acpi_device_name(device), acpi_device_bid(device),
|
acpi_device_bid(device), KELVIN_TO_CELSIUS(tz->temperature));
|
||||||
KELVIN_TO_CELSIUS(tz->temperature));
|
|
||||||
goto end;
|
goto end;
|
||||||
|
|
||||||
free_memory:
|
free_memory:
|
||||||
|
@ -1159,24 +1156,24 @@ static int acpi_thermal_resume(struct device *dev)
|
||||||
static int thermal_act(const struct dmi_system_id *d) {
|
static int thermal_act(const struct dmi_system_id *d) {
|
||||||
|
|
||||||
if (act == 0) {
|
if (act == 0) {
|
||||||
printk(KERN_NOTICE "ACPI: %s detected: "
|
pr_notice(PREFIX "%s detected: "
|
||||||
"disabling all active thermal trip points\n", d->ident);
|
"disabling all active thermal trip points\n", d->ident);
|
||||||
act = -1;
|
act = -1;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int thermal_nocrt(const struct dmi_system_id *d) {
|
static int thermal_nocrt(const struct dmi_system_id *d) {
|
||||||
|
|
||||||
printk(KERN_NOTICE "ACPI: %s detected: "
|
pr_notice(PREFIX "%s detected: "
|
||||||
"disabling all critical thermal trip point actions.\n", d->ident);
|
"disabling all critical thermal trip point actions.\n", d->ident);
|
||||||
nocrt = 1;
|
nocrt = 1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int thermal_tzp(const struct dmi_system_id *d) {
|
static int thermal_tzp(const struct dmi_system_id *d) {
|
||||||
|
|
||||||
if (tzp == 0) {
|
if (tzp == 0) {
|
||||||
printk(KERN_NOTICE "ACPI: %s detected: "
|
pr_notice(PREFIX "%s detected: "
|
||||||
"enabling thermal zone polling\n", d->ident);
|
"enabling thermal zone polling\n", d->ident);
|
||||||
tzp = 300; /* 300 dS = 30 Seconds */
|
tzp = 300; /* 300 dS = 30 Seconds */
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1184,8 +1181,8 @@ static int thermal_tzp(const struct dmi_system_id *d) {
|
||||||
static int thermal_psv(const struct dmi_system_id *d) {
|
static int thermal_psv(const struct dmi_system_id *d) {
|
||||||
|
|
||||||
if (psv == 0) {
|
if (psv == 0) {
|
||||||
printk(KERN_NOTICE "ACPI: %s detected: "
|
pr_notice(PREFIX "%s detected: "
|
||||||
"disabling all passive thermal trip points\n", d->ident);
|
"disabling all passive thermal trip points\n", d->ident);
|
||||||
psv = -1;
|
psv = -1;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1238,7 +1235,7 @@ static int __init acpi_thermal_init(void)
|
||||||
dmi_check_system(thermal_dmi_table);
|
dmi_check_system(thermal_dmi_table);
|
||||||
|
|
||||||
if (off) {
|
if (off) {
|
||||||
printk(KERN_NOTICE "ACPI: thermal control disabled\n");
|
pr_notice(PREFIX "thermal control disabled\n");
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -169,11 +169,20 @@ acpi_extract_package(union acpi_object *package,
|
||||||
/*
|
/*
|
||||||
* Validate output buffer.
|
* Validate output buffer.
|
||||||
*/
|
*/
|
||||||
if (buffer->length < size_required) {
|
if (buffer->length == ACPI_ALLOCATE_BUFFER) {
|
||||||
|
buffer->pointer = ACPI_ALLOCATE(size_required);
|
||||||
|
if (!buffer->pointer)
|
||||||
|
return AE_NO_MEMORY;
|
||||||
buffer->length = size_required;
|
buffer->length = size_required;
|
||||||
return AE_BUFFER_OVERFLOW;
|
memset(buffer->pointer, 0, size_required);
|
||||||
} else if (buffer->length != size_required || !buffer->pointer) {
|
} else {
|
||||||
return AE_BAD_PARAMETER;
|
if (buffer->length < size_required) {
|
||||||
|
buffer->length = size_required;
|
||||||
|
return AE_BUFFER_OVERFLOW;
|
||||||
|
} else if (buffer->length != size_required ||
|
||||||
|
!buffer->pointer) {
|
||||||
|
return AE_BAD_PARAMETER;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
head = buffer->pointer;
|
head = buffer->pointer;
|
||||||
|
|
Loading…
Reference in a new issue