Skip to content

Commit

Permalink
parisc: lasi: Register LASI power-off feature as sys_off_handler
Browse files Browse the repository at this point in the history
Prefer the Linux kernel sys_off_handler functionality over a
home-grown implementation.

Signed-off-by: Helge Deller <deller@gmx.de>
  • Loading branch information
Helge Deller committed Aug 20, 2023
1 parent 706a741 commit e71d47d
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 23 deletions.
6 changes: 0 additions & 6 deletions arch/parisc/kernel/process.c
Original file line number Diff line number Diff line change
Expand Up @@ -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. */
Expand Down
28 changes: 11 additions & 17 deletions drivers/parisc/lasi.c
Original file line number Diff line number Diff line change
Expand Up @@ -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>
Expand Down Expand Up @@ -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;

Expand Down Expand Up @@ -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;
}

Expand Down

0 comments on commit e71d47d

Please sign in to comment.