Skip to content

Commit e633f33

Browse files
qzedsre
authored andcommitted
power: supply: surface_battery: Fix battery event handling
The battery subsystem of the Surface Aggregator Module EC requires us to register the battery notifier with instance ID 0. However, battery events are actually sent with the instance ID corresponding to the device, which is nonzero. Thus, the strict-matching approach doesn't work here and will discard events that the driver is expected to handle. To fix this we have to fall back on notifier matching by target-category only and have to manually check the instance ID in the notifier callback. Fixes: 167f77f ("power: supply: Add battery driver for Surface Aggregator Module") Signed-off-by: Maximilian Luz <[email protected]> Signed-off-by: Sebastian Reichel <[email protected]>
1 parent 6efb943 commit e633f33

File tree

1 file changed

+12
-2
lines changed

1 file changed

+12
-2
lines changed

drivers/power/supply/surface_battery.c

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -345,6 +345,16 @@ static u32 spwr_notify_bat(struct ssam_event_notifier *nf, const struct ssam_eve
345345
struct spwr_battery_device *bat = container_of(nf, struct spwr_battery_device, notif);
346346
int status;
347347

348+
/*
349+
* We cannot use strict matching when registering the notifier as the
350+
* EC expects us to register it against instance ID 0. Strict matching
351+
* would thus drop events, as those may have non-zero instance IDs in
352+
* this subsystem. So we need to check the instance ID of the event
353+
* here manually.
354+
*/
355+
if (event->instance_id != bat->sdev->uid.instance)
356+
return 0;
357+
348358
dev_dbg(&bat->sdev->dev, "power event (cid = %#04x, iid = %#04x, tid = %#04x)\n",
349359
event->command_id, event->instance_id, event->target_id);
350360

@@ -720,8 +730,8 @@ static void spwr_battery_init(struct spwr_battery_device *bat, struct ssam_devic
720730
bat->notif.base.fn = spwr_notify_bat;
721731
bat->notif.event.reg = registry;
722732
bat->notif.event.id.target_category = sdev->uid.category;
723-
bat->notif.event.id.instance = 0;
724-
bat->notif.event.mask = SSAM_EVENT_MASK_STRICT;
733+
bat->notif.event.id.instance = 0; /* need to register with instance 0 */
734+
bat->notif.event.mask = SSAM_EVENT_MASK_TARGET;
725735
bat->notif.event.flags = SSAM_EVENT_SEQUENCED;
726736

727737
bat->psy_desc.name = bat->name;

0 commit comments

Comments
 (0)