I have successfully used the pm_power_off
function pointer to make my custom Linux board call its power management chip over i2c (to turn the power off).
You should use poweroff
command or halt -p
. As per man 8 halt, halt
command (with no arguments) doesn't guarantee to power off your machine. Reasons are described here:
halt
was used before ACPI (which today will turn off the power for you)*. It would halt the system and then print a message to the effect of "it's ok to power off now". Back then there were physical on/off switches, rather than the combo ACPI controlled power button of modern computers.*These days
halt
is smart enough to automatically call poweroff if ACPI is enabled. In fact, they are functionally equivalent now.
As you can see from halt
tool source code, it issues reboot() system call with cmd = RB_POWER_OFF = LINUX_REBOOT_CMD_POWER_OFF
.
In kernel, that system call is implemented here, and on cmd = LINUX_REBOOT_CMD_POWER_OFF
, it calls:
-> kernel_power_off()
-> machine_power_off()
-> pm_power_off()