mirror of
https://github.com/armbian/build.git
synced 2025-09-19 20:51:12 +02:00
* merge patches from rockchip and rk322x families for current and edge kernels * adjust patches for tinkerboard to remove some cruft and overclocking * rework kernel configs * fix rk322x dmc to avoid lockup on rk3288 * migrate rockchip-6.6 into patch series, rename all patches with more understandable names * add gen-series.sh script in tools directory (it is a naive tool to create patch series when you don't want to rebase everything)
75 lines
2.1 KiB
Diff
75 lines
2.1 KiB
Diff
Patches act8846 regulator providing the proper reset handle and exploit
|
|
the SIPC bit in GLB_POWER_OFF register. Mainly used to reset some rockchip
|
|
boards.
|
|
|
|
Origin: <https://patchwork.kernel.org/patch/6409521/>
|
|
|
|
diff --git a/drivers/regulator/act8865-regulator.c b/drivers/regulator/act8865-regulator.c
|
|
index 2ff73d7..836d10b 100644
|
|
--- a/drivers/regulator/act8865-regulator.c
|
|
+++ b/drivers/regulator/act8865-regulator.c
|
|
@@ -27,6 +27,7 @@
|
|
#include <linux/regulator/of_regulator.h>
|
|
#include <linux/regmap.h>
|
|
#include <dt-bindings/regulator/active-semi,8865-regulator.h>
|
|
+#include <linux/reboot.h>
|
|
|
|
/*
|
|
* ACT8600 Global Register Map.
|
|
@@ -133,6 +134,8 @@
|
|
#define ACT8865_VOLTAGE_NUM 64
|
|
#define ACT8600_SUDCDC_VOLTAGE_NUM 255
|
|
|
|
+#define ACT8846_SIPC_MASK 0x01
|
|
+
|
|
struct act8865 {
|
|
struct regmap *regmap;
|
|
int off_reg;
|
|
@@ -402,6 +405,22 @@ static void act8865_power_off(void)
|
|
while (1);
|
|
}
|
|
|
|
+static int act8846_power_cycle(struct notifier_block *this,
|
|
+ unsigned long code, void *unused)
|
|
+{
|
|
+ struct act8865 *act8846;
|
|
+
|
|
+ act8846 = i2c_get_clientdata(act8865_i2c_client);
|
|
+ regmap_write(act8846->regmap, ACT8846_GLB_OFF_CTRL, ACT8846_SIPC_MASK);
|
|
+
|
|
+ return NOTIFY_DONE;
|
|
+}
|
|
+
|
|
+static struct notifier_block act8846_restart_handler = {
|
|
+ .notifier_call = act8846_power_cycle,
|
|
+ .priority = 129,
|
|
+};
|
|
+
|
|
static int act8865_pmic_probe(struct i2c_client *client,
|
|
const struct i2c_device_id *i2c_id)
|
|
{
|
|
@@ -484,6 +503,8 @@ static int act8865_pmic_probe(struct i2c_client *client,
|
|
}
|
|
|
|
if (of_device_is_system_power_controller(dev->of_node)) {
|
|
+ int ret;
|
|
+
|
|
if (!pm_power_off && (off_reg > 0)) {
|
|
act8865_i2c_client = client;
|
|
act8865->off_reg = off_reg;
|
|
@@ -492,6 +513,14 @@ static int act8865_pmic_probe(struct i2c_client *client,
|
|
} else {
|
|
dev_err(dev, "Failed to set poweroff capability, already defined\n");
|
|
}
|
|
+
|
|
+ if (type == ACT8846) {
|
|
+ act8865_i2c_client = client;
|
|
+ ret = register_restart_handler(&act8846_restart_handler);
|
|
+ if (ret)
|
|
+ pr_err("%s: cannot register restart handler, %d\n",
|
|
+ __func__, ret);
|
|
+ }
|
|
}
|
|
|
|
/* Finally register devices */
|