parisc: lasi: Register LASI power-off feature as sys_off_handler
authorHelge Deller <deller@gmx.de>
Sat, 12 Aug 2023 21:21:08 +0000 (23:21 +0200)
committerHelge Deller <deller@gmx.de>
Sun, 20 Aug 2023 18:23:46 +0000 (20:23 +0200)
Prefer the Linux kernel sys_off_handler functionality over a
home-grown implementation.

Signed-off-by: Helge Deller <deller@gmx.de>
arch/parisc/kernel/process.c
drivers/parisc/lasi.c

index abdbf038d6435d48f64e723f6dbcfcc871f0e1ce..62f9b14c64068e60f5e2608844476882455e139d 100644 (file)
@@ -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. */
index 6ef621adb63a850a47a4d37d05461a4ec2330150..d7331823255f7e614c1c7e3b951c4f4e919ef276 100644 (file)
@@ -17,6 +17,7 @@
 #include <linux/module.h>
 #include <linux/pm.h>
 #include <linux/types.h>
+#include <linux/reboot.h>
 
 #include <asm/io.h>
 #include <asm/hardware.h>
@@ -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;
 }