mirror of
https://github.com/torvalds/linux.git
synced 2026-11-06 21:58:01 +01:00
mfd: rk8xx: Register poweroff handler in atomic phase
This fixes a regression from v6.1 to v6.6 where Google Veyron devices (rk3288) would not power off after being shut down. Prior to commit4fec8a5a85("mfd: rk808: Convert to device managed resources"), pm_power_off was called by legacy_pm_power_off() which itself was registered using SYS_OFF_MODE_POWER_OFF. But in that commit the registration of rk808_power_off() moved to SYS_OFF_MODE_POWER_OFF_PREPARE. At the very least, the code should be consistent between SYS_OFF_MODE_POWER_OFF and SYS_OFF_MODE_RESTART; both should be *_PREPARE or both not. It appears interrupt delivery is already shut down (but not disabled) when SYS_OFF_MODE_POWER_OFF_PREPARE is triggered, so regmap_update_bits() in rk808_power_off() does not complete successfully. Registering rk808_power_off() as SYS_OFF_MODE_POWER_OFF runs with interrupts disabled which causes polling I/O to be used instead, and the device to power down. Fixes:4fec8a5a85("mfd: rk808: Convert to device managed resources") Signed-off-by: Eric Anderson <ejona86@gmail.com> Assisted-by: Gemini:gemini-3.5-flash Link: https://patch.msgid.link/20260908-veyron-shutdown-v1-1-066ecb80f5f2@gmail.com Signed-off-by: Lee Jones <lee@kernel.org>
This commit is contained in:
parent
9b34455435
commit
128115b520
|
|
@ -875,7 +875,7 @@ int rk8xx_probe(struct device *dev, int variant, unsigned int irq, struct regmap
|
|||
if (device_property_read_bool(dev, "system-power-controller") ||
|
||||
device_property_read_bool(dev, "rockchip,system-power-controller")) {
|
||||
ret = devm_register_sys_off_handler(dev,
|
||||
SYS_OFF_MODE_POWER_OFF_PREPARE, SYS_OFF_PRIO_HIGH,
|
||||
SYS_OFF_MODE_POWER_OFF, SYS_OFF_PRIO_HIGH,
|
||||
&rk808_power_off, rk808);
|
||||
if (ret)
|
||||
return dev_err_probe(dev, ret,
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user