|
@@ -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;
|
|
|
}
|