diff options
author | Alexey Starikovskiy <astarikovskiy@suse.de> | 2007-12-08 13:02:40 +0300 |
---|---|---|
committer | Len Brown <len.brown@intel.com> | 2007-12-14 15:14:06 -0500 |
commit | c2d00f2d1bf8dd721f5557b0df23729addc1898d (patch) | |
tree | 6a89affd983c980589bc75409db16d7bfd114069 /drivers/acpi/sbshc.c | |
parent | 09f1fb41ad45bc18abe07c62f7b56560571584d1 (diff) | |
download | linux-c2d00f2d1bf8dd721f5557b0df23729addc1898d.tar.bz2 |
ACPI: SBS: Ignore alarms coming from unknown devices
http://bugzilla.kernel.org/show_bug.cgi?id=9362
Signed-off-by: Alexey Starikovskiy <astarikovskiy@suse.de>
Signed-off-by: Len Brown <len.brown@intel.com>
Diffstat (limited to 'drivers/acpi/sbshc.c')
-rw-r--r-- | drivers/acpi/sbshc.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/drivers/acpi/sbshc.c b/drivers/acpi/sbshc.c index 12a1532513e3..fd40b6a1d639 100644 --- a/drivers/acpi/sbshc.c +++ b/drivers/acpi/sbshc.c @@ -202,10 +202,9 @@ int acpi_smbus_unregister_callback(struct acpi_smb_hc *hc) EXPORT_SYMBOL_GPL(acpi_smbus_unregister_callback); -static void acpi_smbus_callback(void *context) +static inline void acpi_smbus_callback(void *context) { struct acpi_smb_hc *hc = context; - if (hc->callback) hc->callback(hc->context); } @@ -214,6 +213,7 @@ static int smbus_alarm(void *context) { struct acpi_smb_hc *hc = context; union acpi_smb_status status; + u8 address; if (smb_hc_read(hc, ACPI_SMB_STATUS, &status.raw)) return 0; /* Check if it is only a completion notify */ @@ -222,10 +222,18 @@ static int smbus_alarm(void *context) if (!status.fields.alarm) return 0; mutex_lock(&hc->lock); + smb_hc_read(hc, ACPI_SMB_ALARM_ADDRESS, &address); status.fields.alarm = 0; smb_hc_write(hc, ACPI_SMB_STATUS, status.raw); - if (hc->callback) - acpi_os_execute(OSL_GPE_HANDLER, acpi_smbus_callback, hc); + /* We are only interested in events coming from known devices */ + switch (address >> 1) { + case ACPI_SBS_CHARGER: + case ACPI_SBS_MANAGER: + case ACPI_SBS_BATTERY: + acpi_os_execute(OSL_GPE_HANDLER, + acpi_smbus_callback, hc); + default:; + } mutex_unlock(&hc->lock); return 0; } |