[PATCH v2 0/4] Add reset support to HiFive Unmatched

As there is no GPIO to reset the HiFive Unmatched board, we must directly ask the da9063 PMIC for a reset: this small patchset adds the corresponding sysreset driver and enables it for this board.
As the probing of this new device depends on a device-tree node, this series also adds the device tree bindings documentation for the da9063 device.
Changes in v2: - Add device tree probing as suggested by Heinrich - Rebased onto master
Alexandre Ghiti (4): dt-bindings: power: Add da9063 PMIC device bindings dt-bindings: power: Add new da9063 sysreset subdevice bindings drivers: pmic: Add sysreset driver for da9063 PMIC riscv: Enable da9063 sysreset driver on HiFive Unmatched
arch/riscv/dts/hifive-unmatched-a00.dts | 4 ++ configs/sifive_unmatched_defconfig | 2 + doc/device-tree-bindings/power/da9063.txt | 68 +++++++++++++++++++++++ drivers/power/pmic/da9063.c | 51 ++++++++++++++++- include/power/da9063_pmic.h | 1 + 5 files changed, 125 insertions(+), 1 deletion(-) create mode 100644 doc/device-tree-bindings/power/da9063.txt

This new device tree binding documentation is largely inspired by the Linux Kernel same document, minus the unimplemented devices and properties.
Signed-off-by: Alexandre Ghiti alexandre.ghiti@canonical.com --- doc/device-tree-bindings/power/da9063.txt | 62 +++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 doc/device-tree-bindings/power/da9063.txt
diff --git a/doc/device-tree-bindings/power/da9063.txt b/doc/device-tree-bindings/power/da9063.txt new file mode 100644 index 0000000000..30873ca360 --- /dev/null +++ b/doc/device-tree-bindings/power/da9063.txt @@ -0,0 +1,62 @@ +* Dialog DA9063/DA9063L Power Management Integrated Circuit (PMIC) + +DA9063 consists of the following sub-devices (I2C Only): + +Device Supply Names Description +------ ------------ ----------- +da9063-regulator : : LDOs & BUCKs + +====== + +Required properties: + +- compatible : Should be "dlg,da9063" or "dlg,da9063l" +- reg : Specifies the I2C slave address (this defaults to 0x58 but it can be + modified to match the chip's OTP settings). + +Sub-nodes: + +- regulators : This node defines the settings for the LDOs and BUCKs. + The DA9063(L) regulators are bound using their names listed below: + + bcore1 : BUCK CORE1 + bcore2 : BUCK CORE2 + bpro : BUCK PRO + bmem : BUCK MEM + bio : BUCK IO + bperi : BUCK PERI + ldo1 : LDO_1 (DA9063 only) + ldo2 : LDO_2 (DA9063 only) + ldo3 : LDO_3 + ldo4 : LDO_4 (DA9063 only) + ldo5 : LDO_5 (DA9063 only) + ldo6 : LDO_6 (DA9063 only) + ldo7 : LDO_7 + ldo8 : LDO_8 + ldo9 : LDO_9 + ldo10 : LDO_10 (DA9063 only) + ldo11 : LDO_11 + +Example: + + pmic0: da9063@58 { + compatible = "dlg,da9063" + reg = <0x58>; + + regulators { + DA9063_BCORE1: bcore1 { + regulator-name = "BCORE1"; + regulator-min-microvolt = <300000>; + regulator-max-microvolt = <1570000>; + regulator-min-microamp = <500000>; + regulator-max-microamp = <2000000>; + regulator-boot-on; + }; + DA9063_LDO11: ldo11 { + regulator-name = "LDO_11"; + regulator-min-microvolt = <900000>; + regulator-max-microvolt = <3600000>; + regulator-boot-on; + }; + }; + };

The sysreset driver for the da9063 will need some new bindings: add them now to the device documentation.
Signed-off-by: Alexandre Ghiti alexandre.ghiti@canonical.com --- doc/device-tree-bindings/power/da9063.txt | 6 ++++++ 1 file changed, 6 insertions(+)
diff --git a/doc/device-tree-bindings/power/da9063.txt b/doc/device-tree-bindings/power/da9063.txt index 30873ca360..29e8e44be4 100644 --- a/doc/device-tree-bindings/power/da9063.txt +++ b/doc/device-tree-bindings/power/da9063.txt @@ -5,6 +5,7 @@ DA9063 consists of the following sub-devices (I2C Only): Device Supply Names Description ------ ------------ ----------- da9063-regulator : : LDOs & BUCKs +da9063-reset : : Reset
======
@@ -37,12 +38,17 @@ Sub-nodes: ldo10 : LDO_10 (DA9063 only) ldo11 : LDO_11
+- reset : This node defines the reset settings controlled by the device. + Example:
pmic0: da9063@58 { compatible = "dlg,da9063" reg = <0x58>;
+ reset { + }; + regulators { DA9063_BCORE1: bcore1 { regulator-name = "BCORE1";

Some da9063 chips can't use the watchdog as a restart means since the OTP does not set the AUTOBOOT bit [1]. So we need a new reset driver that implements a small i2c sequence that will allow to reset the boards that have this chip.
[1] https://www.dialog-semiconductor.com/products/pmics?post_id=10052#tab-suppor...
Signed-off-by: Alexandre Ghiti alexandre.ghiti@canonical.com --- drivers/power/pmic/da9063.c | 51 ++++++++++++++++++++++++++++++++++++- include/power/da9063_pmic.h | 1 + 2 files changed, 51 insertions(+), 1 deletion(-)
diff --git a/drivers/power/pmic/da9063.c b/drivers/power/pmic/da9063.c index 25101d18f7..eb470e4255 100644 --- a/drivers/power/pmic/da9063.c +++ b/drivers/power/pmic/da9063.c @@ -10,6 +10,8 @@ #include <dm.h> #include <i2c.h> #include <log.h> +#include <sysreset.h> +#include <dm/lists.h> #include <power/pmic.h> #include <power/regulator.h> #include <power/da9063_pmic.h> @@ -85,8 +87,9 @@ static int da9063_read(struct udevice *dev, uint reg, uint8_t *buff, int len)
static int da9063_bind(struct udevice *dev) { - ofnode regulators_node; + ofnode regulators_node, reset_node; int children; + int ret;
regulators_node = dev_read_subnode(dev, "regulators"); if (!ofnode_valid(regulators_node)) { @@ -101,6 +104,17 @@ static int da9063_bind(struct udevice *dev) if (!children) debug("%s: %s - no child found\n", __func__, dev->name);
+ if (CONFIG_IS_ENABLED(SYSRESET)) { + reset_node = dev_read_subnode(dev, "reset"); + if (ofnode_valid(reset_node)) { + ret = device_bind_driver(dev, DA9063_SYSRESET_DRIVER, + DA9063_SYSRESET_DRIVER, NULL); + if (ret) + pr_err("%s: %s - failed to bind sysreset driver\n", + __func__, dev->name); + } + } + /* Always return success for this device */ return 0; } @@ -129,3 +143,38 @@ U_BOOT_DRIVER(pmic_da9063) = { .probe = da9063_probe, .ops = &da9063_ops, }; + +static int da9063_sysreset_request(struct udevice *dev, enum sysreset_t type) +{ + struct udevice *pmic_dev = dev->parent; + uint ret; + + if (type != SYSRESET_WARM && type != SYSRESET_COLD) + return -EPROTONOSUPPORT; + + ret = pmic_reg_write(pmic_dev, DA9063_REG_PAGE_CON, 0x00); + if (ret < 0) + return ret; + + /* Sets the WAKE_UP bit */ + ret = pmic_reg_write(pmic_dev, DA9063_REG_CONTROL_F, 0x04); + if (ret < 0) + return ret; + + /* Powerdown! */ + ret = pmic_reg_write(pmic_dev, DA9063_REG_CONTROL_A, 0x68); + if (ret < 0) + return ret; + + return -EINPROGRESS; +} + +static struct sysreset_ops da9063_sysreset_ops = { + .request = da9063_sysreset_request, +}; + +U_BOOT_DRIVER(da9063_sysreset) = { + .name = DA9063_SYSRESET_DRIVER, + .id = UCLASS_SYSRESET, + .ops = &da9063_sysreset_ops, +}; diff --git a/include/power/da9063_pmic.h b/include/power/da9063_pmic.h index 273a07ef41..1c676c242a 100644 --- a/include/power/da9063_pmic.h +++ b/include/power/da9063_pmic.h @@ -304,6 +304,7 @@ /* Drivers name */ #define DA9063_LDO_DRIVER "da9063_ldo" #define DA9063_BUCK_DRIVER "da9063_buck" +#define DA9063_SYSRESET_DRIVER "da9063_sysreset"
/* Regulator modes */ enum {

The Unmatched board comes with the da9063 PMIC that is used to reset the board: add this driver in its config and a corresponding entry to its device-tree.
Signed-off-by: Alexandre Ghiti alexandre.ghiti@canonical.com --- arch/riscv/dts/hifive-unmatched-a00.dts | 4 ++++ configs/sifive_unmatched_defconfig | 2 ++ 2 files changed, 6 insertions(+)
diff --git a/arch/riscv/dts/hifive-unmatched-a00.dts b/arch/riscv/dts/hifive-unmatched-a00.dts index b44e8c160d..9c30a5c938 100644 --- a/arch/riscv/dts/hifive-unmatched-a00.dts +++ b/arch/riscv/dts/hifive-unmatched-a00.dts @@ -76,6 +76,10 @@ interrupts = <1 IRQ_TYPE_LEVEL_LOW>; interrupt-controller;
+ reset { + compatible = "dlg,da9063-reset"; + }; + regulators { vdd_bcore1: bcore1 { regulator-min-microvolt = <1050000>; diff --git a/configs/sifive_unmatched_defconfig b/configs/sifive_unmatched_defconfig index 38b7acd536..a4bcf0fae6 100644 --- a/configs/sifive_unmatched_defconfig +++ b/configs/sifive_unmatched_defconfig @@ -37,3 +37,5 @@ CONFIG_DM_RESET=y CONFIG_USB=y CONFIG_USB_XHCI_HCD=y CONFIG_USB_XHCI_PCI=y +CONFIG_DM_PMIC=y +CONFIG_DM_PMIC_DA9063=y

On Fri, Sep 24, 2021 at 10:42 AM Alexandre Ghiti alexandre.ghiti@canonical.com wrote:
As there is no GPIO to reset the HiFive Unmatched board, we must directly ask the da9063 PMIC for a reset: this small patchset adds the corresponding sysreset driver and enables it for this board.
As the probing of this new device depends on a device-tree node, this series also adds the device tree bindings documentation for the da9063 device.
Changes in v2:
- Add device tree probing as suggested by Heinrich
- Rebased onto master
Alexandre Ghiti (4): dt-bindings: power: Add da9063 PMIC device bindings dt-bindings: power: Add new da9063 sysreset subdevice bindings drivers: pmic: Add sysreset driver for da9063 PMIC riscv: Enable da9063 sysreset driver on HiFive Unmatched
arch/riscv/dts/hifive-unmatched-a00.dts | 4 ++ configs/sifive_unmatched_defconfig | 2 + doc/device-tree-bindings/power/da9063.txt | 68 +++++++++++++++++++++++ drivers/power/pmic/da9063.c | 51 ++++++++++++++++- include/power/da9063_pmic.h | 1 + 5 files changed, 125 insertions(+), 1 deletion(-) create mode 100644 doc/device-tree-bindings/power/da9063.txt
-- 2.30.2
The i2c sequence proposed here should not work according to Adam in this thread: https://patchwork.kernel.org/project/linux-riscv/patch/20210921053356.170583.... According to Adam, the sequence he proposed should be SiFive Unmatched board-specific, as this is not something other boards could use.
I'll be back with a v3, you can drop this.
Thanks,
Alex
participants (1)
-
Alexandre Ghiti