ACPI: SBS: Ignore alarms coming from unknown devices
authorAlexey Starikovskiy <astarikovskiy@suse.de>
Sat, 8 Dec 2007 10:02:40 +0000 (13:02 +0300)
committerLen Brown <len.brown@intel.com>
Fri, 14 Dec 2007 20:14:06 +0000 (15:14 -0500)
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>
drivers/acpi/sbs.c
drivers/acpi/sbshc.c
drivers/acpi/sbshc.h

index 6045cdbe176beafe7f250c65a0bf93b3fa428da7..813ef328f743201a6597fc712cc7133937fe14d5 100644 (file)
 #define ACPI_BATTERY_DIR_NAME          "BAT%i"
 #define ACPI_AC_DIR_NAME               "AC0"
 
-enum acpi_sbs_device_addr {
-       ACPI_SBS_CHARGER = 0x9,
-       ACPI_SBS_MANAGER = 0xa,
-       ACPI_SBS_BATTERY = 0xb,
-};
-
 #define ACPI_SBS_NOTIFY_STATUS         0x80
 #define ACPI_SBS_NOTIFY_INFO           0x81
 
index 12a1532513e3ce5fabf3607f5012748c08b3601f..fd40b6a1d639693a9160080b736c4c8d86cb909e 100644 (file)
@@ -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;
 }
index 3bda3491a97bcdd9a1e42848822d6e86e59b0e7d..a57b0762dd7f4651e9adcc3a99b5e5d38dc5f71e 100644 (file)
@@ -16,6 +16,12 @@ enum acpi_smb_protocol {
 
 static const u8 SMBUS_PEC = 0x80;
 
+enum acpi_sbs_device_addr {
+       ACPI_SBS_CHARGER = 0x9,
+       ACPI_SBS_MANAGER = 0xa,
+       ACPI_SBS_BATTERY = 0xb,
+};
+
 typedef void (*smbus_alarm_callback)(void *context);
 
 extern int acpi_smbus_read(struct acpi_smb_hc *hc, u8 protocol, u8 address,