diff --git a/lpc/reform2_lpc.c b/lpc/reform2_lpc.c
index 61b5fcb7c1f9b129f1c5555e1d3c44a9f1347e09..afc5ea57cad80aa2d36411fe7741118340790b88 100644
--- a/lpc/reform2_lpc.c
+++ b/lpc/reform2_lpc.c
@@ -8,6 +8,7 @@
 
 static int lpcProbe(struct spi_device *spi);
 static void lpcRemove(struct spi_device *spi);
+static void lpcPowerOff(void);
 static ssize_t showStatus(struct device *dev, struct device_attribute *attr, char *buf);
 static ssize_t showCells(struct device *dev, struct device_attribute *attr, char *buf);
 static ssize_t showFirmware(struct device *dev, struct device_attribute *attr, char *buf);
@@ -58,6 +59,8 @@ static struct power_supply_desc bat_desc = {
 
 static struct power_supply_config psy_cfg = {};
 
+static struct device *poweroff_device;
+
 static int lpcProbe(struct spi_device *spi)
 {
     struct lpc_driver_data *data;
@@ -121,6 +124,10 @@ static int lpcProbe(struct spi_device *spi)
         return PTR_ERR(data->bat);
     }
 
+    // this overwrites something else that has already claimed pm_power_off on reform2 but it'll do for now
+    poweroff_device = &spi->dev;
+    pm_power_off = lpcPowerOff;
+
     return ret;
 }
 
@@ -137,6 +144,11 @@ static void lpcRemove(struct spi_device *spi)
 
     power_supply_unregister(data->bat);
 
+    if (pm_power_off == &lpcPowerOff)
+    {
+        pm_power_off = NULL;
+    }
+
     kfree(data);
 }
 
@@ -289,6 +301,14 @@ static ssize_t lpcCommand(struct device *dev, char command, uint8_t arg1, uint8_
     return ret;
 }
 
+static void lpcPowerOff(void)
+{
+    int ret = 0;
+    uint8_t buffer[8];
+
+    ret = lpcCommand(poweroff_device, 'p', 1, buffer);
+}
+
 static int getBatProperty(struct power_supply *psy,
                     enum power_supply_property psp,
                     union power_supply_propval *val)