From e71d47dc2a6c9a1ec83f015c7c3dd87b635ffcda Mon Sep 17 00:00:00 2001 From: Helge Deller Date: Sat, 12 Aug 2023 23:21:08 +0200 Subject: parisc: lasi: Register LASI power-off feature as sys_off_handler Prefer the Linux kernel sys_off_handler functionality over a home-grown implementation. Signed-off-by: Helge Deller --- arch/parisc/kernel/process.c | 6 ------ drivers/parisc/lasi.c | 28 +++++++++++----------------- 2 files changed, 11 insertions(+), 23 deletions(-) diff --git a/arch/parisc/kernel/process.c b/arch/parisc/kernel/process.c index abdbf038d643..62f9b14c6406 100644 --- a/arch/parisc/kernel/process.c +++ b/arch/parisc/kernel/process.c @@ -97,18 +97,12 @@ void machine_restart(char *cmd) } -void (*chassis_power_off)(void); - /* * This routine is called from sys_reboot to actually turn off the * machine */ void machine_power_off(void) { - /* If there is a registered power off handler, call it. */ - if (chassis_power_off) - chassis_power_off(); - /* Put the soft power button back under hardware control. * If the user had already pressed the power button, the * following call will immediately power off. */ diff --git a/drivers/parisc/lasi.c b/drivers/parisc/lasi.c index 6ef621adb63a..d7331823255f 100644 --- a/drivers/parisc/lasi.c +++ b/drivers/parisc/lasi.c @@ -17,6 +17,7 @@ #include #include #include +#include #include #include @@ -145,23 +146,19 @@ static void __init lasi_led_init(unsigned long lasi_hpa) * 1 to PWR_ON_L in the Power Control Register * */ - -static unsigned long lasi_power_off_hpa __read_mostly; - -static void lasi_power_off(void) +static int lasi_power_off(struct sys_off_data *data) { - unsigned long datareg; + struct gsc_asic *lasi = data->cb_data; - /* calculate addr of the Power Control Register */ - datareg = lasi_power_off_hpa + 0x0000C000; + /* Power down the machine via Power Control Register */ + gsc_writel(0x02, lasi->hpa + 0x0000C000); - /* Power down the machine */ - gsc_writel(0x02, datareg); + /* might not be reached: */ + return NOTIFY_DONE; } static int __init lasi_init_chip(struct parisc_device *dev) { - extern void (*chassis_power_off)(void); struct gsc_asic *lasi; int ret; @@ -212,13 +209,10 @@ static int __init lasi_init_chip(struct parisc_device *dev) gsc_fixup_irqs(dev, lasi, lasi_choose_irq); - /* initialize the power off function */ - /* FIXME: Record the LASI HPA for the power off function. This should - * ensure that only the first LASI (the one controlling the power off) - * should set the HPA here */ - lasi_power_off_hpa = lasi->hpa; - chassis_power_off = lasi_power_off; - + /* register the LASI power off function */ + register_sys_off_handler(SYS_OFF_MODE_POWER_OFF, + SYS_OFF_PRIO_DEFAULT, lasi_power_off, lasi); + return ret; } -- cgit