Skip to content

Commit 50c808d

Browse files
committed
pmgr: Power up parents before children
Signed-off-by: Hector Martin <marcan@marcan.st>
1 parent 59e0032 commit 50c808d

File tree

1 file changed

+16
-9
lines changed

1 file changed

+16
-9
lines changed

src/pmgr.c

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -121,23 +121,30 @@ static int pmgr_set_mode_recursive(u8 die, u16 id, u8 target_mode, bool recurse)
121121
if (pmgr_find_device(id, &device))
122122
return -1;
123123

124-
if (!(device->flags & PMGR_FLAG_VIRTUAL)) {
124+
if (target_mode == 0 && !(device->flags & PMGR_FLAG_VIRTUAL)) {
125125
uintptr_t addr = pmgr_device_get_addr(die, device);
126126
if (!addr)
127127
return -1;
128128
if (pmgr_set_mode(addr, target_mode))
129129
return -1;
130130
}
131-
if (!recurse)
132-
return 0;
133131

134-
for (int i = 0; i < 2; i++) {
135-
if (device->parent[i]) {
136-
u16 parent = FIELD_GET(PMGR_DEVICE_ID, device->parent[i]);
137-
int ret = pmgr_set_mode_recursive(die, parent, target_mode, true);
138-
if (ret < 0)
139-
return ret;
132+
if (recurse)
133+
for (int i = 0; i < 2; i++) {
134+
if (device->parent[i]) {
135+
u16 parent = FIELD_GET(PMGR_DEVICE_ID, device->parent[i]);
136+
int ret = pmgr_set_mode_recursive(die, parent, target_mode, true);
137+
if (ret < 0)
138+
return ret;
139+
}
140140
}
141+
142+
if (target_mode != 0 && !(device->flags & PMGR_FLAG_VIRTUAL)) {
143+
uintptr_t addr = pmgr_device_get_addr(die, device);
144+
if (!addr)
145+
return -1;
146+
if (pmgr_set_mode(addr, target_mode))
147+
return -1;
141148
}
142149

143150
return 0;

0 commit comments

Comments
 (0)