Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Alexey Starikovskiy and committed by
Len Brown
c2d00f2d 09f1fb41

+18 -10
-6
drivers/acpi/sbs.c
··· 54 54 #define ACPI_BATTERY_DIR_NAME "BAT%i" 55 55 #define ACPI_AC_DIR_NAME "AC0" 56 56 57 - enum acpi_sbs_device_addr { 58 - ACPI_SBS_CHARGER = 0x9, 59 - ACPI_SBS_MANAGER = 0xa, 60 - ACPI_SBS_BATTERY = 0xb, 61 - }; 62 - 63 57 #define ACPI_SBS_NOTIFY_STATUS 0x80 64 58 #define ACPI_SBS_NOTIFY_INFO 0x81 65 59
+12 -4
drivers/acpi/sbshc.c
··· 202 202 203 203 EXPORT_SYMBOL_GPL(acpi_smbus_unregister_callback); 204 204 205 - static void acpi_smbus_callback(void *context) 205 + static inline void acpi_smbus_callback(void *context) 206 206 { 207 207 struct acpi_smb_hc *hc = context; 208 - 209 208 if (hc->callback) 210 209 hc->callback(hc->context); 211 210 } ··· 213 214 { 214 215 struct acpi_smb_hc *hc = context; 215 216 union acpi_smb_status status; 217 + u8 address; 216 218 if (smb_hc_read(hc, ACPI_SMB_STATUS, &status.raw)) 217 219 return 0; 218 220 /* Check if it is only a completion notify */ ··· 222 222 if (!status.fields.alarm) 223 223 return 0; 224 224 mutex_lock(&hc->lock); 225 + smb_hc_read(hc, ACPI_SMB_ALARM_ADDRESS, &address); 225 226 status.fields.alarm = 0; 226 227 smb_hc_write(hc, ACPI_SMB_STATUS, status.raw); 227 - if (hc->callback) 228 - acpi_os_execute(OSL_GPE_HANDLER, acpi_smbus_callback, hc); 228 + /* We are only interested in events coming from known devices */ 229 + switch (address >> 1) { 230 + case ACPI_SBS_CHARGER: 231 + case ACPI_SBS_MANAGER: 232 + case ACPI_SBS_BATTERY: 233 + acpi_os_execute(OSL_GPE_HANDLER, 234 + acpi_smbus_callback, hc); 235 + default:; 236 + } 229 237 mutex_unlock(&hc->lock); 230 238 return 0; 231 239 }
+6
drivers/acpi/sbshc.h
··· 16 16 17 17 static const u8 SMBUS_PEC = 0x80; 18 18 19 + enum acpi_sbs_device_addr { 20 + ACPI_SBS_CHARGER = 0x9, 21 + ACPI_SBS_MANAGER = 0xa, 22 + ACPI_SBS_BATTERY = 0xb, 23 + }; 24 + 19 25 typedef void (*smbus_alarm_callback)(void *context); 20 26 21 27 extern int acpi_smbus_read(struct acpi_smb_hc *hc, u8 protocol, u8 address,