mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-23 07:22:33 +00:00
85b156c113
Backport AXP15060, AXP313a and AXP192 support. The AXP15060 PMIC is used for starfive boards, and the AXP313a PMIC is used for sunxi boards. Remove conflicting patches from starfive target. Signed-off-by: Chukun Pan <amadeus@jmu.edu.cn>
83 lines
2.5 KiB
Diff
83 lines
2.5 KiB
Diff
From 1b1305e95e85624f538ec56db9acf88e2d3d7397 Mon Sep 17 00:00:00 2001
|
|
From: Samuel Holland <samuel@sholland.org>
|
|
Date: Wed, 28 Dec 2022 10:27:52 -0600
|
|
Subject: [PATCH] mfd: axp20x: Switch to the sys-off handler API
|
|
|
|
This removes a layer of indirection through pm_power_off() and allows
|
|
the PMIC handler to be used as a fallback when firmware power off fails.
|
|
This happens on boards like the Clockwork DevTerm R-01 where OpenSBI
|
|
does not know how to use the PMIC to power off the board.
|
|
|
|
Move the check for AXP288 to avoid registering a dummy handler.
|
|
|
|
Signed-off-by: Samuel Holland <samuel@sholland.org>
|
|
[Lee: Removed superfluous new line]
|
|
Signed-off-by: Lee Jones <lee@kernel.org>
|
|
Link: https://lore.kernel.org/r/20221228162752.14204-1-samuel@sholland.org
|
|
---
|
|
drivers/mfd/axp20x.c | 27 +++++++++++----------------
|
|
1 file changed, 11 insertions(+), 16 deletions(-)
|
|
|
|
--- a/drivers/mfd/axp20x.c
|
|
+++ b/drivers/mfd/axp20x.c
|
|
@@ -23,7 +23,7 @@
|
|
#include <linux/mfd/core.h>
|
|
#include <linux/module.h>
|
|
#include <linux/of_device.h>
|
|
-#include <linux/pm_runtime.h>
|
|
+#include <linux/reboot.h>
|
|
#include <linux/regmap.h>
|
|
#include <linux/regulator/consumer.h>
|
|
|
|
@@ -832,17 +832,16 @@ static const struct mfd_cell axp813_cell
|
|
},
|
|
};
|
|
|
|
-static struct axp20x_dev *axp20x_pm_power_off;
|
|
-static void axp20x_power_off(void)
|
|
+static int axp20x_power_off(struct sys_off_data *data)
|
|
{
|
|
- if (axp20x_pm_power_off->variant == AXP288_ID)
|
|
- return;
|
|
+ struct axp20x_dev *axp20x = data->cb_data;
|
|
|
|
- regmap_write(axp20x_pm_power_off->regmap, AXP20X_OFF_CTRL,
|
|
- AXP20X_OFF);
|
|
+ regmap_write(axp20x->regmap, AXP20X_OFF_CTRL, AXP20X_OFF);
|
|
|
|
/* Give capacitors etc. time to drain to avoid kernel panic msg. */
|
|
mdelay(500);
|
|
+
|
|
+ return NOTIFY_DONE;
|
|
}
|
|
|
|
int axp20x_match_device(struct axp20x_dev *axp20x)
|
|
@@ -1009,10 +1008,11 @@ int axp20x_device_probe(struct axp20x_de
|
|
return ret;
|
|
}
|
|
|
|
- if (!pm_power_off) {
|
|
- axp20x_pm_power_off = axp20x;
|
|
- pm_power_off = axp20x_power_off;
|
|
- }
|
|
+ if (axp20x->variant != AXP288_ID)
|
|
+ devm_register_sys_off_handler(axp20x->dev,
|
|
+ SYS_OFF_MODE_POWER_OFF,
|
|
+ SYS_OFF_PRIO_DEFAULT,
|
|
+ axp20x_power_off, axp20x);
|
|
|
|
dev_info(axp20x->dev, "AXP20X driver loaded\n");
|
|
|
|
@@ -1022,11 +1022,6 @@ EXPORT_SYMBOL(axp20x_device_probe);
|
|
|
|
void axp20x_device_remove(struct axp20x_dev *axp20x)
|
|
{
|
|
- if (axp20x == axp20x_pm_power_off) {
|
|
- axp20x_pm_power_off = NULL;
|
|
- pm_power_off = NULL;
|
|
- }
|
|
-
|
|
mfd_remove_devices(axp20x->dev);
|
|
regmap_del_irq_chip(axp20x->irq, axp20x->regmap_irqc);
|
|
}
|