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)