diff mbox series

parisc: lasi: Register LASI power-off feature as sys_off_handler

Message ID 20230812203759.395651-1-deller@gmx.de (mailing list archive)
State Accepted, archived
Headers show
Series parisc: lasi: Register LASI power-off feature as sys_off_handler | expand

Commit Message

Helge Deller Aug. 12, 2023, 8:37 p.m. UTC
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 |  6 ------
 drivers/parisc/lasi.c        | 29 ++++++++++++-----------------
 2 files changed, 12 insertions(+), 23 deletions(-)

--
2.41.0
diff mbox series

Patch

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..8a2339ad457a 100644
--- a/drivers/parisc/lasi.c
+++ b/drivers/parisc/lasi.c
@@ -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,11 @@  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;
 }