Hi Alexandre, On 9/21/21 12:48 AM, Alexandre Ghiti wrote: > This pmic device is present on the SiFive Unmatched board and this > new driver adds the possibility to reset it.
Is there any patch before applying this? I cant' apply this from patchwork for checking. If i missed something, let me know, plz. Best Regards, Jaehoon Chung > > Signed-off-by: Alexandre Ghiti <alexandre.gh...@canonical.com> > --- > configs/sifive_unmatched_defconfig | 2 ++ > drivers/power/pmic/da9063.c | 49 ++++++++++++++++++++++++++++++ > 2 files changed, 51 insertions(+) > > diff --git a/configs/sifive_unmatched_defconfig > b/configs/sifive_unmatched_defconfig > index 978818b688..9ab058be39 100644 > --- a/configs/sifive_unmatched_defconfig > +++ b/configs/sifive_unmatched_defconfig > @@ -43,3 +43,5 @@ CONFIG_DM_USB=y > CONFIG_USB_XHCI_HCD=y > CONFIG_USB_XHCI_PCI=y > CONFIG_BOARD_EARLY_INIT_F=y > +CONFIG_DM_PMIC=y > +CONFIG_DM_PMIC_DA9063=y > diff --git a/drivers/power/pmic/da9063.c b/drivers/power/pmic/da9063.c > index 25101d18f7..b04879d9c5 100644 > --- a/drivers/power/pmic/da9063.c > +++ b/drivers/power/pmic/da9063.c > @@ -10,6 +10,7 @@ > #include <dm.h> > #include <i2c.h> > #include <log.h> > +#include <dm/lists.h> > #include <power/pmic.h> > #include <power/regulator.h> > #include <power/da9063_pmic.h> > @@ -87,6 +88,7 @@ static int da9063_bind(struct udevice *dev) > { > ofnode regulators_node; > int children; > + int ret; > > regulators_node = dev_read_subnode(dev, "regulators"); > if (!ofnode_valid(regulators_node)) { > @@ -101,6 +103,14 @@ static int da9063_bind(struct udevice *dev) > if (!children) > debug("%s: %s - no child found\n", __func__, dev->name); > > + if (CONFIG_IS_ENABLED(SYSRESET)) { > + ret = device_bind_driver(dev, "da9063-sysreset", > + "da9063-sysreset", NULL); > + if (ret) > + debug("%s: %s - failed to bind sysreset driver\n", > + __func__, dev->name); > + } > + > /* Always return success for this device */ > return 0; > } > @@ -129,3 +139,42 @@ U_BOOT_DRIVER(pmic_da9063) = { > .probe = da9063_probe, > .ops = &da9063_ops, > }; > + > +#ifdef CONFIG_SYSRESET > +#include <sysreset.h> > + > +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", > + .id = UCLASS_SYSRESET, > + .ops = &da9063_sysreset_ops, > +}; > +#endif >