From ab6c251717f9a60c664340c45275edfd49cbe7c2 Mon Sep 17 00:00:00 2001
From: Michael Fincham <michael@hotplate.co.nz>
Date: Thu, 7 Sep 2023 09:10:32 +0200
Subject: [PATCH] lpc/reform2_lpc.c: poweroff

---
 lpc/reform2_lpc.c | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)

diff --git a/lpc/reform2_lpc.c b/lpc/reform2_lpc.c
index 61b5fcb..afc5ea5 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)
-- 
GitLab