···202202203203EXPORT_SYMBOL_GPL(acpi_smbus_unregister_callback);204204205205-static void acpi_smbus_callback(void *context)205205+static inline void acpi_smbus_callback(void *context)206206{207207 struct acpi_smb_hc *hc = context;208208-209208 if (hc->callback)210209 hc->callback(hc->context);211210}···213214{214215 struct acpi_smb_hc *hc = context;215216 union acpi_smb_status status;217217+ u8 address;216218 if (smb_hc_read(hc, ACPI_SMB_STATUS, &status.raw))217219 return 0;218220 /* Check if it is only a completion notify */···222222 if (!status.fields.alarm)223223 return 0;224224 mutex_lock(&hc->lock);225225+ smb_hc_read(hc, ACPI_SMB_ALARM_ADDRESS, &address);225226 status.fields.alarm = 0;226227 smb_hc_write(hc, ACPI_SMB_STATUS, status.raw);227227- if (hc->callback)228228- acpi_os_execute(OSL_GPE_HANDLER, acpi_smbus_callback, hc);228228+ /* We are only interested in events coming from known devices */229229+ switch (address >> 1) {230230+ case ACPI_SBS_CHARGER:231231+ case ACPI_SBS_MANAGER:232232+ case ACPI_SBS_BATTERY:233233+ acpi_os_execute(OSL_GPE_HANDLER,234234+ acpi_smbus_callback, hc);235235+ default:;236236+ }229237 mutex_unlock(&hc->lock);230238 return 0;231239}