Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1413905 > unrolled thread
| Started by | Stefan Agner <stefan@agner.ch> |
|---|---|
| First post | 2016-06-05 02:20 +0200 |
| Last post | 2016-06-06 19:30 +0200 |
| Articles | 9 — 3 participants |
Back to article view | Back to linux.kernel
[PATCH 0/5] regulator: add Ricoh RN5T567 PMIC support Stefan Agner <stefan@agner.ch> - 2016-06-05 02:20 +0200
[PATCH 3/5] regulator: rn5t618: add RN5T567 PMIC support Stefan Agner <stefan@agner.ch> - 2016-06-05 02:20 +0200
Re: [PATCH 3/5] regulator: rn5t618: add RN5T567 PMIC support Mark Brown <broonie@kernel.org> - 2016-06-06 19:40 +0200
Re: [PATCH 3/5] regulator: rn5t618: add RN5T567 PMIC support Stefan Agner <stefan@agner.ch> - 2016-06-06 20:00 +0200
Re: [PATCH 3/5] regulator: rn5t618: add RN5T567 PMIC support Mark Brown <broonie@kernel.org> - 2016-06-06 20:10 +0200
[PATCH 2/5] mfd: add Ricoh RN5T567 PMIC support Stefan Agner <stefan@agner.ch> - 2016-06-05 02:20 +0200
[PATCH 5/5] mfd: rn5t618: register restart handler Stefan Agner <stefan@agner.ch> - 2016-06-05 02:20 +0200
Re: [PATCH 5/5] mfd: rn5t618: register restart handler Marcel Ziswiler <marcel@ziswiler.com> - 2016-06-06 15:30 +0200
Re: [PATCH 5/5] mfd: rn5t618: register restart handler Stefan Agner <stefan@agner.ch> - 2016-06-06 19:30 +0200
| From | Stefan Agner <stefan@agner.ch> |
|---|---|
| Date | 2016-06-05 02:20 +0200 |
| Subject | [PATCH 0/5] regulator: add Ricoh RN5T567 PMIC support |
| Message-ID | <rGtXk-7Xg-3@gated-at.bofh.it> |
This patchset adds RN5T567 PMIC support which is used on the Toradex Colibri iMX7S/iMX7D modules. The existing RN5T618 is from the same family, hence this patchset uses the same driver and adds variant support. The Colibris currently do not use the PMIC's power off capabilities, hence this patchset also makes the use of system-power-controller property mandatory if the power off capabilties are required. Stefan Agner (5): ARM: dts: meson: minix-neo-x8: define PMIC as power controller mfd: add Ricoh RN5T567 PMIC support regulator: rn5t618: add RN5T567 PMIC support mfd: rn5t618: register power off callback optionally mfd: rn5t618: register restart handler Documentation/devicetree/bindings/mfd/rn5t618.txt | 19 +++--- arch/arm/boot/dts/meson8-minix-neo-x8.dts | 1 + drivers/mfd/Kconfig | 7 ++- drivers/mfd/rn5t618.c | 70 +++++++++++++++++++---- drivers/regulator/Kconfig | 5 +- drivers/regulator/rn5t618-regulator.c | 40 +++++++++++-- include/linux/mfd/rn5t618.h | 13 +++++ 7 files changed, 126 insertions(+), 29 deletions(-) -- 2.8.3
[toc] | [next] | [standalone]
| From | Stefan Agner <stefan@agner.ch> |
|---|---|
| Date | 2016-06-05 02:20 +0200 |
| Subject | [PATCH 3/5] regulator: rn5t618: add RN5T567 PMIC support |
| Message-ID | <rGtXk-7Xg-15@gated-at.bofh.it> |
| In reply to | #1413905 |
Extend the driver to support Ricoh RN5T567. Support the additional
DCDC and slightly different voltage range of LDORTC1.
Signed-off-by: Stefan Agner <stefan@agner.ch>
---
drivers/regulator/Kconfig | 5 +++--
drivers/regulator/rn5t618-regulator.c | 40 +++++++++++++++++++++++++++++++----
include/linux/mfd/rn5t618.h | 1 +
3 files changed, 40 insertions(+), 6 deletions(-)
diff --git a/drivers/regulator/Kconfig b/drivers/regulator/Kconfig
index 144cbf5..5472694 100644
--- a/drivers/regulator/Kconfig
+++ b/drivers/regulator/Kconfig
@@ -636,10 +636,11 @@ config REGULATOR_RK808
outputs which can be controlled by i2c communication.
config REGULATOR_RN5T618
- tristate "Ricoh RN5T618 voltage regulators"
+ tristate "Ricoh RN5T567/618 voltage regulators"
depends on MFD_RN5T618
help
- Say y here to support the regulators found on Ricoh RN5T618 PMIC.
+ Say y here to support the regulators found on Ricoh RN5T567 or
+ RN5T618 PMIC.
config REGULATOR_RT5033
tristate "Richtek RT5033 Regulators"
diff --git a/drivers/regulator/rn5t618-regulator.c b/drivers/regulator/rn5t618-regulator.c
index b85ceb8..9c930eb 100644
--- a/drivers/regulator/rn5t618-regulator.c
+++ b/drivers/regulator/rn5t618-regulator.c
@@ -46,6 +46,23 @@ static struct regulator_ops rn5t618_reg_ops = {
.vsel_mask = (vmask), \
}
+static struct regulator_desc rn5t567_regulators[] = {
+ /* DCDC */
+ REG(DCDC1, DC1CTL, BIT(0), DC1DAC, 0xff, 600000, 3500000, 12500),
+ REG(DCDC2, DC2CTL, BIT(0), DC2DAC, 0xff, 600000, 3500000, 12500),
+ REG(DCDC3, DC3CTL, BIT(0), DC3DAC, 0xff, 600000, 3500000, 12500),
+ REG(DCDC4, DC4CTL, BIT(0), DC4DAC, 0xff, 600000, 3500000, 12500),
+ /* LDO */
+ REG(LDO1, LDOEN1, BIT(0), LDO1DAC, 0x7f, 900000, 3500000, 25000),
+ REG(LDO2, LDOEN1, BIT(1), LDO2DAC, 0x7f, 900000, 3500000, 25000),
+ REG(LDO3, LDOEN1, BIT(2), LDO3DAC, 0x7f, 600000, 3500000, 25000),
+ REG(LDO4, LDOEN1, BIT(3), LDO4DAC, 0x7f, 900000, 3500000, 25000),
+ REG(LDO5, LDOEN1, BIT(4), LDO5DAC, 0x7f, 900000, 3500000, 25000),
+ /* LDO RTC */
+ REG(LDORTC1, LDOEN2, BIT(4), LDORTCDAC, 0x7f, 1200000, 3500000, 25000),
+ REG(LDORTC2, LDOEN2, BIT(5), LDORTC2DAC, 0x7f, 900000, 3500000, 25000),
+};
+
static struct regulator_desc rn5t618_regulators[] = {
/* DCDC */
REG(DCDC1, DC1CTL, BIT(0), DC1DAC, 0xff, 600000, 3500000, 12500),
@@ -67,18 +84,33 @@ static int rn5t618_regulator_probe(struct platform_device *pdev)
struct rn5t618 *rn5t618 = dev_get_drvdata(pdev->dev.parent);
struct regulator_config config = { };
struct regulator_dev *rdev;
+ struct regulator_desc *regulators;
int i;
+ switch (rn5t618->variant) {
+ case RN5T567:
+ regulators = rn5t567_regulators;
+ break;
+ case RN5T618:
+ regulators = rn5t618_regulators;
+ break;
+ default:
+ return -EINVAL;
+ }
+
+ config.dev = pdev->dev.parent;
+ config.regmap = rn5t618->regmap;
+
for (i = 0; i < RN5T618_REG_NUM; i++) {
- config.dev = pdev->dev.parent;
- config.regmap = rn5t618->regmap;
+ if (!regulators[i].name)
+ continue;
rdev = devm_regulator_register(&pdev->dev,
- &rn5t618_regulators[i],
+ ®ulators[i],
&config);
if (IS_ERR(rdev)) {
dev_err(&pdev->dev, "failed to register %s regulator\n",
- rn5t618_regulators[i].name);
+ regulators[i].name);
return PTR_ERR(rdev);
}
}
diff --git a/include/linux/mfd/rn5t618.h b/include/linux/mfd/rn5t618.h
index 54179c2..cadc654 100644
--- a/include/linux/mfd/rn5t618.h
+++ b/include/linux/mfd/rn5t618.h
@@ -217,6 +217,7 @@ enum {
RN5T618_DCDC1,
RN5T618_DCDC2,
RN5T618_DCDC3,
+ RN5T618_DCDC4,
RN5T618_LDO1,
RN5T618_LDO2,
RN5T618_LDO3,
--
2.8.3
[toc] | [prev] | [next] | [standalone]
| From | Mark Brown <broonie@kernel.org> |
|---|---|
| Date | 2016-06-06 19:40 +0200 |
| Subject | Re: [PATCH 3/5] regulator: rn5t618: add RN5T567 PMIC support |
| Message-ID | <rH6Fj-7Xq-15@gated-at.bofh.it> |
| In reply to | #1413906 |
[Multipart message — attachments visible in raw view] — view raw
On Sat, Jun 04, 2016 at 05:17:47PM -0700, Stefan Agner wrote: > Extend the driver to support Ricoh RN5T567. Support the additional > DCDC and slightly different voltage range of LDORTC1. Acked-by: Mark Brown <broonie@kernel.org>
[toc] | [prev] | [next] | [standalone]
| From | Stefan Agner <stefan@agner.ch> |
|---|---|
| Date | 2016-06-06 20:00 +0200 |
| Subject | Re: [PATCH 3/5] regulator: rn5t618: add RN5T567 PMIC support |
| Message-ID | <rH6YF-84b-23@gated-at.bofh.it> |
| In reply to | #1415318 |
On 2016-06-06 10:35, Mark Brown wrote: > On Sat, Jun 04, 2016 at 05:17:47PM -0700, Stefan Agner wrote: >> Extend the driver to support Ricoh RN5T567. Support the additional >> DCDC and slightly different voltage range of LDORTC1. > > Acked-by: Mark Brown <broonie@kernel.org> Thanks Mark. Do you have an idea how the patchset should be handled with the dependent dt change in patch 1? -- Stefan
[toc] | [prev] | [next] | [standalone]
| From | Mark Brown <broonie@kernel.org> |
|---|---|
| Date | 2016-06-06 20:10 +0200 |
| Subject | Re: [PATCH 3/5] regulator: rn5t618: add RN5T567 PMIC support |
| Message-ID | <rH78l-8nr-13@gated-at.bofh.it> |
| In reply to | #1415345 |
[Multipart message — attachments visible in raw view] — view raw
On Mon, Jun 06, 2016 at 10:47:40AM -0700, Stefan Agner wrote: > On 2016-06-06 10:35, Mark Brown wrote: > > Acked-by: Mark Brown <broonie@kernel.org> > Thanks Mark. > Do you have an idea how the patchset should be handled with the > dependent dt change in patch 1? Lee will need to apply at least the first patch, I'd expect he'll also apply this and send me a pull request (or perhaps just send me a pull request for the MFD change).
[toc] | [prev] | [next] | [standalone]
| From | Stefan Agner <stefan@agner.ch> |
|---|---|
| Date | 2016-06-05 02:20 +0200 |
| Subject | [PATCH 2/5] mfd: add Ricoh RN5T567 PMIC support |
| Message-ID | <rGtXk-7Xg-17@gated-at.bofh.it> |
| In reply to | #1413905 |
The Ricoh RN5T567 is from the same family as the Ricoh RN5T618 is,
the differences are:
+ DCDC4
+ Slightly different output voltage/currents
+ 32kHz Output
- ADC/Charger capabilities
Signed-off-by: Stefan Agner <stefan@agner.ch>
---
Documentation/devicetree/bindings/mfd/rn5t618.txt | 19 ++++++++++-------
drivers/mfd/Kconfig | 7 +++---
drivers/mfd/rn5t618.c | 26 +++++++++++++++++------
include/linux/mfd/rn5t618.h | 12 +++++++++++
4 files changed, 46 insertions(+), 18 deletions(-)
diff --git a/Documentation/devicetree/bindings/mfd/rn5t618.txt b/Documentation/devicetree/bindings/mfd/rn5t618.txt
index 937785a..5b493ed 100644
--- a/Documentation/devicetree/bindings/mfd/rn5t618.txt
+++ b/Documentation/devicetree/bindings/mfd/rn5t618.txt
@@ -1,18 +1,21 @@
-* Ricoh RN5T618 PMIC
+* Ricoh RN5T567/RN5T618 PMIC
-Ricoh RN5T618 is a power management IC which integrates 3 step-down
-DCDC converters, 7 low-dropout regulators, a Li-ion battery charger,
-fuel gauge, ADC, GPIOs and a watchdog timer. It can be controlled
-through a I2C interface.
+Ricoh RN5T567/RN5T618 is a power management IC family which integrates
+3 to 5 step-down DCDC converters, 7 low-dropout regulators, GPIOs and
+a watchdog timer. The RN5T618 provides additionally a Li-ion battery
+charger, fuel gauge and an ADC. It can be controlled through a I2C
+interface.
Required properties:
- - compatible: should be "ricoh,rn5t618"
+ - compatible: must be one of
+ "ricoh,rn5t567"
+ "ricoh,rn5t618"
- reg: the I2C slave address of the device
Sub-nodes:
- regulators: the node is required if the regulator functionality is
- needed. The valid regulator names are: DCDC1, DCDC2, DCDC3, LDO1,
- LDO2, LDO3, LDO4, LDO5, LDORTC1 and LDORTC2.
+ needed. The valid regulator names are: DCDC1, DCDC2, DCDC3, DCDC4
+ (RN5T567), LDO1, LDO2, LDO3, LDO4, LDO5, LDORTC1 and LDORTC2.
The common bindings for each individual regulator can be found in:
Documentation/devicetree/bindings/regulator/regulator.txt
diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
index 1bcf601..ff031a7 100644
--- a/drivers/mfd/Kconfig
+++ b/drivers/mfd/Kconfig
@@ -852,13 +852,14 @@ config MFD_RK808
including interrupts, RTC, LDO & DCDC regulators, and onkey.
config MFD_RN5T618
- tristate "Ricoh RN5T5618 PMIC"
+ tristate "Ricoh RN5T567/618 PMIC"
depends on I2C
+ depends on OF
select MFD_CORE
select REGMAP_I2C
help
- Say yes here to add support for the Ricoh RN5T618 PMIC. This
- driver provides common support for accessing the device,
+ Say yes here to add support for the Ricoh RN5T567 or R5T618 PMIC.
+ This driver provides common support for accessing the device,
additional drivers must be enabled in order to use the
functionality of the device.
diff --git a/drivers/mfd/rn5t618.c b/drivers/mfd/rn5t618.c
index 0ad51d7..7607ced 100644
--- a/drivers/mfd/rn5t618.c
+++ b/drivers/mfd/rn5t618.c
@@ -2,6 +2,7 @@
* MFD core driver for Ricoh RN5T618 PMIC
*
* Copyright (C) 2014 Beniamino Galvani <b.galvani@gmail.com>
+ * Copyright (C) 2016 Toradex AG
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@@ -15,6 +16,7 @@
#include <linux/mfd/core.h>
#include <linux/mfd/rn5t618.h>
#include <linux/module.h>
+#include <linux/of_device.h>
#include <linux/regmap.h>
static const struct mfd_cell rn5t618_cells[] = {
@@ -59,12 +61,26 @@ static void rn5t618_power_off(void)
RN5T618_SLPCNT_SWPWROFF, RN5T618_SLPCNT_SWPWROFF);
}
+static const struct of_device_id rn5t618_of_match[] = {
+ { .compatible = "ricoh,rn5t567", .data = (void *)RN5T567 },
+ { .compatible = "ricoh,rn5t618", .data = (void *)RN5T618 },
+ { }
+};
+MODULE_DEVICE_TABLE(of, rn5t618_of_match);
+
static int rn5t618_i2c_probe(struct i2c_client *i2c,
const struct i2c_device_id *id)
{
+ const struct of_device_id *of_id =
+ of_match_device(rn5t618_of_match, &i2c->dev);
struct rn5t618 *priv;
int ret;
+ if (!of_id) {
+ dev_err(&i2c->dev, "Failed to find matching dt id\n");
+ return -EINVAL;
+ }
+
priv = devm_kzalloc(&i2c->dev, sizeof(*priv), GFP_KERNEL);
if (!priv)
return -ENOMEM;
@@ -78,6 +94,8 @@ static int rn5t618_i2c_probe(struct i2c_client *i2c,
return ret;
}
+ priv->variant = (long)of_id->data;
+
ret = devm_mfd_add_devices(&i2c->dev, -1, rn5t618_cells,
ARRAY_SIZE(rn5t618_cells), NULL, 0, NULL);
if (ret) {
@@ -105,12 +123,6 @@ static int rn5t618_i2c_remove(struct i2c_client *i2c)
return 0;
}
-static const struct of_device_id rn5t618_of_match[] = {
- { .compatible = "ricoh,rn5t618" },
- { }
-};
-MODULE_DEVICE_TABLE(of, rn5t618_of_match);
-
static const struct i2c_device_id rn5t618_i2c_id[] = {
{ }
};
@@ -129,5 +141,5 @@ static struct i2c_driver rn5t618_i2c_driver = {
module_i2c_driver(rn5t618_i2c_driver);
MODULE_AUTHOR("Beniamino Galvani <b.galvani@gmail.com>");
-MODULE_DESCRIPTION("Ricoh RN5T618 MFD driver");
+MODULE_DESCRIPTION("Ricoh RN5T567/618 MFD driver");
MODULE_LICENSE("GPL v2");
diff --git a/include/linux/mfd/rn5t618.h b/include/linux/mfd/rn5t618.h
index c72d534..54179c2 100644
--- a/include/linux/mfd/rn5t618.h
+++ b/include/linux/mfd/rn5t618.h
@@ -20,6 +20,7 @@
#define RN5T618_OTPVER 0x01
#define RN5T618_IODAC 0x02
#define RN5T618_VINDAC 0x03
+#define RN5T618_OUT32KEN 0x05
#define RN5T618_CPUCNT 0x06
#define RN5T618_PSWR 0x07
#define RN5T618_PONHIS 0x09
@@ -38,6 +39,7 @@
#define RN5T618_DC1_SLOT 0x16
#define RN5T618_DC2_SLOT 0x17
#define RN5T618_DC3_SLOT 0x18
+#define RN5T618_DC4_SLOT 0x19
#define RN5T618_LDO1_SLOT 0x1b
#define RN5T618_LDO2_SLOT 0x1c
#define RN5T618_LDO3_SLOT 0x1d
@@ -54,12 +56,16 @@
#define RN5T618_DC2CTL2 0x2f
#define RN5T618_DC3CTL 0x30
#define RN5T618_DC3CTL2 0x31
+#define RN5T618_DC4CTL 0x32
+#define RN5T618_DC4CTL2 0x33
#define RN5T618_DC1DAC 0x36
#define RN5T618_DC2DAC 0x37
#define RN5T618_DC3DAC 0x38
+#define RN5T618_DC4DAC 0x39
#define RN5T618_DC1DAC_SLP 0x3b
#define RN5T618_DC2DAC_SLP 0x3c
#define RN5T618_DC3DAC_SLP 0x3d
+#define RN5T618_DC4DAC_SLP 0x3e
#define RN5T618_DCIREN 0x40
#define RN5T618_DCIRQ 0x41
#define RN5T618_DCIRMON 0x42
@@ -221,8 +227,14 @@ enum {
RN5T618_REG_NUM,
};
+enum {
+ RN5T567 = 0,
+ RN5T618,
+};
+
struct rn5t618 {
struct regmap *regmap;
+ long variant;
};
#endif /* __LINUX_MFD_RN5T618_H */
--
2.8.3
[toc] | [prev] | [next] | [standalone]
| From | Stefan Agner <stefan@agner.ch> |
|---|---|
| Date | 2016-06-05 02:20 +0200 |
| Subject | [PATCH 5/5] mfd: rn5t618: register restart handler |
| Message-ID | <rGtXk-7Xg-21@gated-at.bofh.it> |
| In reply to | #1413905 |
Use the PMIC's repower capability for reboots. Register a restart
handler with use a default priority of 128.
Signed-off-by: Stefan Agner <stefan@agner.ch>
---
drivers/mfd/rn5t618.c | 42 ++++++++++++++++++++++++++++++++++++------
1 file changed, 36 insertions(+), 6 deletions(-)
diff --git a/drivers/mfd/rn5t618.c b/drivers/mfd/rn5t618.c
index d9b4d40..d9bd61c 100644
--- a/drivers/mfd/rn5t618.c
+++ b/drivers/mfd/rn5t618.c
@@ -12,13 +12,17 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+#include <linux/delay.h>
#include <linux/i2c.h>
#include <linux/mfd/core.h>
#include <linux/mfd/rn5t618.h>
#include <linux/module.h>
#include <linux/of_device.h>
+#include <linux/reboot.h>
#include <linux/regmap.h>
+#include <asm/system_misc.h>
+
static const struct mfd_cell rn5t618_cells[] = {
{ .name = "rn5t618-regulator" },
{ .name = "rn5t618-wdt" },
@@ -50,17 +54,34 @@ static const struct regmap_config rn5t618_regmap_config = {
};
static struct rn5t618 *rn5t618_pm_power_off;
+static struct notifier_block rn5t618_restart_handler;
-static void rn5t618_power_off(void)
+static void rn5t618_trigger_poweroff_sequence(bool repower)
{
/* disable automatic repower-on */
regmap_update_bits(rn5t618_pm_power_off->regmap, RN5T618_REPCNT,
- RN5T618_REPCNT_REPWRON, 0);
+ RN5T618_REPCNT_REPWRON, repower);
/* start power-off sequence */
regmap_update_bits(rn5t618_pm_power_off->regmap, RN5T618_SLPCNT,
RN5T618_SLPCNT_SWPWROFF, RN5T618_SLPCNT_SWPWROFF);
}
+static void rn5t618_power_off(void)
+{
+ rn5t618_trigger_poweroff_sequence(false);
+}
+
+static int rn5t618_restart(struct notifier_block *this,
+ unsigned long mode, void *cmd)
+{
+ rn5t618_trigger_poweroff_sequence(true);
+
+ mdelay(10);
+
+ return NOTIFY_DONE;
+}
+
+
static const struct of_device_id rn5t618_of_match[] = {
{ .compatible = "ricoh,rn5t567", .data = (void *)RN5T567 },
{ .compatible = "ricoh,rn5t618", .data = (void *)RN5T618 },
@@ -103,13 +124,22 @@ static int rn5t618_i2c_probe(struct i2c_client *i2c,
return ret;
}
+ rn5t618_pm_power_off = priv;
if (of_device_is_system_power_controller(i2c->dev.of_node)) {
- if (!pm_power_off) {
- rn5t618_pm_power_off = priv;
+ if (!pm_power_off)
pm_power_off = rn5t618_power_off;
- } else {
+ else
dev_err(&i2c->dev, "Failed to set poweroff capability, already defined\n");
- }
+ }
+
+ rn5t618_restart_handler.notifier_call = rn5t618_restart;
+ rn5t618_restart_handler.priority = 128;
+
+ ret = register_restart_handler(&rn5t618_restart_handler);
+ if (ret) {
+ dev_err(&i2c->dev, "%s: cannot register restart handler, %d\n",
+ __func__, ret);
+ return ret;
}
return 0;
--
2.8.3
[toc] | [prev] | [next] | [standalone]
| From | Marcel Ziswiler <marcel@ziswiler.com> |
|---|---|
| Date | 2016-06-06 15:30 +0200 |
| Subject | Re: [PATCH 5/5] mfd: rn5t618: register restart handler |
| Message-ID | <rH2Ln-5ut-3@gated-at.bofh.it> |
| In reply to | #1413908 |
On June 5, 2016 2:17:49 AM GMT+02:00, Stefan Agner <stefan@agner.ch> wrote:
>Use the PMIC's repower capability for reboots. Register a restart
>handler with use a default priority of 128.
Apart from that last sentence above which is not clear to me the whole series looks fine to me.
Reviewed-by: Marcel Ziswiler <marcel.ziswiler@toradex.com>
>Signed-off-by: Stefan Agner <stefan@agner.ch>
>---
> drivers/mfd/rn5t618.c | 42 ++++++++++++++++++++++++++++++++++++------
> 1 file changed, 36 insertions(+), 6 deletions(-)
>
>diff --git a/drivers/mfd/rn5t618.c b/drivers/mfd/rn5t618.c
>index d9b4d40..d9bd61c 100644
>--- a/drivers/mfd/rn5t618.c
>+++ b/drivers/mfd/rn5t618.c
>@@ -12,13 +12,17 @@
> * along with this program. If not, see <http://www.gnu.org/licenses/>.
> */
>
>+#include <linux/delay.h>
> #include <linux/i2c.h>
> #include <linux/mfd/core.h>
> #include <linux/mfd/rn5t618.h>
> #include <linux/module.h>
> #include <linux/of_device.h>
>+#include <linux/reboot.h>
> #include <linux/regmap.h>
>
>+#include <asm/system_misc.h>
>+
> static const struct mfd_cell rn5t618_cells[] = {
> { .name = "rn5t618-regulator" },
> { .name = "rn5t618-wdt" },
>@@ -50,17 +54,34 @@ static const struct regmap_config
>rn5t618_regmap_config = {
> };
>
> static struct rn5t618 *rn5t618_pm_power_off;
>+static struct notifier_block rn5t618_restart_handler;
>
>-static void rn5t618_power_off(void)
>+static void rn5t618_trigger_poweroff_sequence(bool repower)
> {
> /* disable automatic repower-on */
> regmap_update_bits(rn5t618_pm_power_off->regmap, RN5T618_REPCNT,
>- RN5T618_REPCNT_REPWRON, 0);
>+ RN5T618_REPCNT_REPWRON, repower);
> /* start power-off sequence */
> regmap_update_bits(rn5t618_pm_power_off->regmap, RN5T618_SLPCNT,
> RN5T618_SLPCNT_SWPWROFF, RN5T618_SLPCNT_SWPWROFF);
> }
>
>+static void rn5t618_power_off(void)
>+{
>+ rn5t618_trigger_poweroff_sequence(false);
>+}
>+
>+static int rn5t618_restart(struct notifier_block *this,
>+ unsigned long mode, void *cmd)
>+{
>+ rn5t618_trigger_poweroff_sequence(true);
>+
>+ mdelay(10);
>+
>+ return NOTIFY_DONE;
>+}
>+
>+
> static const struct of_device_id rn5t618_of_match[] = {
> { .compatible = "ricoh,rn5t567", .data = (void *)RN5T567 },
> { .compatible = "ricoh,rn5t618", .data = (void *)RN5T618 },
>@@ -103,13 +124,22 @@ static int rn5t618_i2c_probe(struct i2c_client
>*i2c,
> return ret;
> }
>
>+ rn5t618_pm_power_off = priv;
> if (of_device_is_system_power_controller(i2c->dev.of_node)) {
>- if (!pm_power_off) {
>- rn5t618_pm_power_off = priv;
>+ if (!pm_power_off)
> pm_power_off = rn5t618_power_off;
>- } else {
>+ else
> dev_err(&i2c->dev, "Failed to set poweroff capability, already
>defined\n");
>- }
>+ }
>+
>+ rn5t618_restart_handler.notifier_call = rn5t618_restart;
>+ rn5t618_restart_handler.priority = 128;
>+
>+ ret = register_restart_handler(&rn5t618_restart_handler);
>+ if (ret) {
>+ dev_err(&i2c->dev, "%s: cannot register restart handler, %d\n",
>+ __func__, ret);
>+ return ret;
> }
>
> return 0;
[toc] | [prev] | [next] | [standalone]
| From | Stefan Agner <stefan@agner.ch> |
|---|---|
| Date | 2016-06-06 19:30 +0200 |
| Subject | Re: [PATCH 5/5] mfd: rn5t618: register restart handler |
| Message-ID | <rH6vD-7U4-5@gated-at.bofh.it> |
| In reply to | #1415028 |
On 2016-06-06 06:25, Marcel Ziswiler wrote:
> On June 5, 2016 2:17:49 AM GMT+02:00, Stefan Agner <stefan@agner.ch> wrote:
>>Use the PMIC's repower capability for reboots. Register a restart
>>handler with use a default priority of 128.
>
> Apart from that last sentence above which is not clear to me the whole
> series looks fine to me.
Check the kernel docs of the register_restart_handler:
http://lxr.free-electrons.com/source/kernel/reboot.c#L113
I am actually not sure anymore whether 128 is really a good choice. With
that, in the Colibri case, the restart handler would have the same
priority as the i.MX watchdog has (imx2_wdt.c), but the PMIC's restart
capabilities are clearly superior (as it resets all peripherals on the
module). In fact, using the watchdog to restart the system seems to hang
for some reason...
Maybe 192?
--
Stefan
>
> Reviewed-by: Marcel Ziswiler <marcel.ziswiler@toradex.com>
>
>>Signed-off-by: Stefan Agner <stefan@agner.ch>
>>---
>> drivers/mfd/rn5t618.c | 42 ++++++++++++++++++++++++++++++++++++------
>> 1 file changed, 36 insertions(+), 6 deletions(-)
>>
>>diff --git a/drivers/mfd/rn5t618.c b/drivers/mfd/rn5t618.c
>>index d9b4d40..d9bd61c 100644
>>--- a/drivers/mfd/rn5t618.c
>>+++ b/drivers/mfd/rn5t618.c
>>@@ -12,13 +12,17 @@
>> * along with this program. If not, see <http://www.gnu.org/licenses/>.
>> */
>>
>>+#include <linux/delay.h>
>> #include <linux/i2c.h>
>> #include <linux/mfd/core.h>
>> #include <linux/mfd/rn5t618.h>
>> #include <linux/module.h>
>> #include <linux/of_device.h>
>>+#include <linux/reboot.h>
>> #include <linux/regmap.h>
>>
>>+#include <asm/system_misc.h>
>>+
>> static const struct mfd_cell rn5t618_cells[] = {
>> { .name = "rn5t618-regulator" },
>> { .name = "rn5t618-wdt" },
>>@@ -50,17 +54,34 @@ static const struct regmap_config
>>rn5t618_regmap_config = {
>> };
>>
>> static struct rn5t618 *rn5t618_pm_power_off;
>>+static struct notifier_block rn5t618_restart_handler;
>>
>>-static void rn5t618_power_off(void)
>>+static void rn5t618_trigger_poweroff_sequence(bool repower)
>> {
>> /* disable automatic repower-on */
>> regmap_update_bits(rn5t618_pm_power_off->regmap, RN5T618_REPCNT,
>>- RN5T618_REPCNT_REPWRON, 0);
>>+ RN5T618_REPCNT_REPWRON, repower);
>> /* start power-off sequence */
>> regmap_update_bits(rn5t618_pm_power_off->regmap, RN5T618_SLPCNT,
>> RN5T618_SLPCNT_SWPWROFF, RN5T618_SLPCNT_SWPWROFF);
>> }
>>
>>+static void rn5t618_power_off(void)
>>+{
>>+ rn5t618_trigger_poweroff_sequence(false);
>>+}
>>+
>>+static int rn5t618_restart(struct notifier_block *this,
>>+ unsigned long mode, void *cmd)
>>+{
>>+ rn5t618_trigger_poweroff_sequence(true);
>>+
>>+ mdelay(10);
>>+
>>+ return NOTIFY_DONE;
>>+}
>>+
>>+
>> static const struct of_device_id rn5t618_of_match[] = {
>> { .compatible = "ricoh,rn5t567", .data = (void *)RN5T567 },
>> { .compatible = "ricoh,rn5t618", .data = (void *)RN5T618 },
>>@@ -103,13 +124,22 @@ static int rn5t618_i2c_probe(struct i2c_client
>>*i2c,
>> return ret;
>> }
>>
>>+ rn5t618_pm_power_off = priv;
>> if (of_device_is_system_power_controller(i2c->dev.of_node)) {
>>- if (!pm_power_off) {
>>- rn5t618_pm_power_off = priv;
>>+ if (!pm_power_off)
>> pm_power_off = rn5t618_power_off;
>>- } else {
>>+ else
>> dev_err(&i2c->dev, "Failed to set poweroff capability, already
>>defined\n");
>>- }
>>+ }
>>+
>>+ rn5t618_restart_handler.notifier_call = rn5t618_restart;
>>+ rn5t618_restart_handler.priority = 128;
>>+
>>+ ret = register_restart_handler(&rn5t618_restart_handler);
>>+ if (ret) {
>>+ dev_err(&i2c->dev, "%s: cannot register restart handler, %d\n",
>>+ __func__, ret);
>>+ return ret;
>> }
>>
>> return 0;
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web