Re: [U-Boot] [PATCH v3 2/2] regulator: bd718x7: support ROHM BD71837 and BD71847 PMICs

2019-05-14 Thread Simon Glass
Hi Matti,

> On Mon, 2019-05-06 at 21:51 -0600, Simon Glass wrote:
> > Hi Matti,
> >
> > On Thu, 25 Apr 2019 at 03:51, Matti Vaittinen
> >  wrote:
> > >
> > > BD71837 and BD71847 is PMIC intended for powering single-core,
> > > dual-core, and quad-core SoC’s such as NXP-i.MX 8M. BD71847
> > > is used for example on NXP imx8mm EVK.
> > >
> > > Add regulator driver for ROHM BD71837 and BD71847 PMICs.
> > > BD71837 contains 8 bucks and 7 LDOS. BD71847 is reduced
> > > version containing 6 bucks and 6 LDOs. Voltages for DVS
> > > bucks (1-4 on BD71837, 1 and 2 on BD71847) can be adjusted
> > > when regulators are enabled. For other bucks and LDOs we may
> > > have over- or undershooting if voltage is adjusted when
> > > regulator is enabled. Thus this is prevented by default.
> > >
> > > BD718x7 has a quirk which may leave power output disabled
> > > after reset if enable/disable state was controlled by SW.
> > > Thus the SW control is only allowed for BD71837  bucks
> > > 3 and 4 by default. The impact of this limitation must be
> > > evaluated board-by board and restrictions may need to be
> > > modified. (Linux driver get's these limitations from DT and we
> > > may want to implement same on u-Boot driver).
> > >
> > > Signed-off-by: Matti Vaittinen 
> > > ---
> > >
> > > Changelog v2 => v3:
> > > - remove unnecessary include
> > > - use uint8_t instead of u8
> >
> > Sorry I did not reply in time. I meant that you should use uint
> > instead of u8. There is no need for the arg to be 8 bits and it may
> > make the machine code larger. So try to use native times for function
> > args (int, uint).
>
> Right. I'll craft a v4 then. What comes to 8bit types, which one is
> preferred - u8 or uint8_t?

u8 these days.

patman should warn you about it.

Regards,
SImon
___
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot


Re: [U-Boot] [PATCH v3 2/2] regulator: bd718x7: support ROHM BD71837 and BD71847 PMICs

2019-05-06 Thread Vaittinen, Matti
On Mon, 2019-05-06 at 21:51 -0600, Simon Glass wrote:
> Hi Matti,
> 
> On Thu, 25 Apr 2019 at 03:51, Matti Vaittinen
>  wrote:
> > 
> > BD71837 and BD71847 is PMIC intended for powering single-core,
> > dual-core, and quad-core SoC’s such as NXP-i.MX 8M. BD71847
> > is used for example on NXP imx8mm EVK.
> > 
> > Add regulator driver for ROHM BD71837 and BD71847 PMICs.
> > BD71837 contains 8 bucks and 7 LDOS. BD71847 is reduced
> > version containing 6 bucks and 6 LDOs. Voltages for DVS
> > bucks (1-4 on BD71837, 1 and 2 on BD71847) can be adjusted
> > when regulators are enabled. For other bucks and LDOs we may
> > have over- or undershooting if voltage is adjusted when
> > regulator is enabled. Thus this is prevented by default.
> > 
> > BD718x7 has a quirk which may leave power output disabled
> > after reset if enable/disable state was controlled by SW.
> > Thus the SW control is only allowed for BD71837  bucks
> > 3 and 4 by default. The impact of this limitation must be
> > evaluated board-by board and restrictions may need to be
> > modified. (Linux driver get's these limitations from DT and we
> > may want to implement same on u-Boot driver).
> > 
> > Signed-off-by: Matti Vaittinen 
> > ---
> > 
> > Changelog v2 => v3:
> > - remove unnecessary include
> > - use uint8_t instead of u8
> 
> Sorry I did not reply in time. I meant that you should use uint
> instead of u8. There is no need for the arg to be 8 bits and it may
> make the machine code larger. So try to use native times for function
> args (int, uint).

Right. I'll craft a v4 then. What comes to 8bit types, which one is
preferred - u8 or uint8_t?

Br,
Matti Vaittinen

> 
> Regards,
> Simon
___
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot


Re: [U-Boot] [PATCH v3 2/2] regulator: bd718x7: support ROHM BD71837 and BD71847 PMICs

2019-05-06 Thread Simon Glass
Hi Matti,

On Thu, 25 Apr 2019 at 03:51, Matti Vaittinen
 wrote:
>
> BD71837 and BD71847 is PMIC intended for powering single-core,
> dual-core, and quad-core SoC’s such as NXP-i.MX 8M. BD71847
> is used for example on NXP imx8mm EVK.
>
> Add regulator driver for ROHM BD71837 and BD71847 PMICs.
> BD71837 contains 8 bucks and 7 LDOS. BD71847 is reduced
> version containing 6 bucks and 6 LDOs. Voltages for DVS
> bucks (1-4 on BD71837, 1 and 2 on BD71847) can be adjusted
> when regulators are enabled. For other bucks and LDOs we may
> have over- or undershooting if voltage is adjusted when
> regulator is enabled. Thus this is prevented by default.
>
> BD718x7 has a quirk which may leave power output disabled
> after reset if enable/disable state was controlled by SW.
> Thus the SW control is only allowed for BD71837  bucks
> 3 and 4 by default. The impact of this limitation must be
> evaluated board-by board and restrictions may need to be
> modified. (Linux driver get's these limitations from DT and we
> may want to implement same on u-Boot driver).
>
> Signed-off-by: Matti Vaittinen 
> ---
>
> Changelog v2 => v3:
> - remove unnecessary include
> - use uint8_t instead of u8

Sorry I did not reply in time. I meant that you should use uint
instead of u8. There is no need for the arg to be 8 bits and it may
make the machine code larger. So try to use native times for function
args (int, uint).

Regards,
Simon
___
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot


[U-Boot] [PATCH v3 2/2] regulator: bd718x7: support ROHM BD71837 and BD71847 PMICs

2019-04-25 Thread Matti Vaittinen
BD71837 and BD71847 is PMIC intended for powering single-core,
dual-core, and quad-core SoC’s such as NXP-i.MX 8M. BD71847
is used for example on NXP imx8mm EVK.

Add regulator driver for ROHM BD71837 and BD71847 PMICs.
BD71837 contains 8 bucks and 7 LDOS. BD71847 is reduced
version containing 6 bucks and 6 LDOs. Voltages for DVS
bucks (1-4 on BD71837, 1 and 2 on BD71847) can be adjusted
when regulators are enabled. For other bucks and LDOs we may
have over- or undershooting if voltage is adjusted when
regulator is enabled. Thus this is prevented by default.

BD718x7 has a quirk which may leave power output disabled
after reset if enable/disable state was controlled by SW.
Thus the SW control is only allowed for BD71837  bucks
3 and 4 by default. The impact of this limitation must be
evaluated board-by board and restrictions may need to be
modified. (Linux driver get's these limitations from DT and we
may want to implement same on u-Boot driver).

Signed-off-by: Matti Vaittinen 
---

Changelog v2 => v3:
- remove unnecessary include
- use uint8_t instead of u8
- improve Kconfig documentation
- improve readability by inverting handling of 'not_found' variable
  to 'found'

 drivers/power/pmic/bd71837.c  |  32 +-
 drivers/power/regulator/Kconfig   |  17 ++
 drivers/power/regulator/Makefile  |   1 +
 drivers/power/regulator/bd71837.c | 468 ++
 include/power/bd71837.h   | 147 ++
 5 files changed, 607 insertions(+), 58 deletions(-)
 create mode 100644 drivers/power/regulator/bd71837.c

diff --git a/drivers/power/pmic/bd71837.c b/drivers/power/pmic/bd71837.c
index 24d9f7fab7..e292d42a8c 100644
--- a/drivers/power/pmic/bd71837.c
+++ b/drivers/power/pmic/bd71837.c
@@ -3,6 +3,8 @@
  * Copyright 2018 NXP
  */
 
+#define DEBUG
+
 #include 
 #include 
 #include 
@@ -15,15 +17,15 @@ DECLARE_GLOBAL_DATA_PTR;
 
 static const struct pmic_child_info pmic_children_info[] = {
/* buck */
-   { .prefix = "b", .driver = BD71837_REGULATOR_DRIVER},
+   { .prefix = "b", .driver = BD718XX_REGULATOR_DRIVER},
/* ldo */
-   { .prefix = "l", .driver = BD71837_REGULATOR_DRIVER},
+   { .prefix = "l", .driver = BD718XX_REGULATOR_DRIVER},
{ },
 };
 
 static int bd71837_reg_count(struct udevice *dev)
 {
-   return BD71837_REG_NUM;
+   return BD718XX_MAX_REGISTER - 1;
 }
 
 static int bd71837_write(struct udevice *dev, uint reg, const uint8_t *buff,
@@ -54,7 +56,7 @@ static int bd71837_bind(struct udevice *dev)
 
regulators_node = dev_read_subnode(dev, "regulators");
if (!ofnode_valid(regulators_node)) {
-   debug("%s: %s regulators subnode not found!", __func__,
+   debug("%s: %s regulators subnode not found!\n", __func__,
  dev->name);
return -ENXIO;
}
@@ -69,6 +71,24 @@ static int bd71837_bind(struct udevice *dev)
return 0;
 }
 
+static int bd718x7_probe(struct udevice *dev)
+{
+   int ret;
+   uint8_t mask = BD718XX_REGLOCK_PWRSEQ | BD718XX_REGLOCK_VREG;
+
+   /* Unlock the PMIC regulator control before probing the children */
+   ret = pmic_clrsetbits(dev, BD718XX_REGLOCK, mask, 0);
+   if (ret) {
+   debug("%s: %s Failed to unlock regulator control\n", __func__,
+ dev->name);
+   return ret;
+   }
+   debug("%s: '%s' - BD718x7 PMIC registers unlocked\n", __func__,
+ dev->name);
+
+   return 0;
+}
+
 static struct dm_pmic_ops bd71837_ops = {
.reg_count = bd71837_reg_count,
.read = bd71837_read,
@@ -76,7 +96,8 @@ static struct dm_pmic_ops bd71837_ops = {
 };
 
 static const struct udevice_id bd71837_ids[] = {
-   { .compatible = "rohm,bd71837", .data = 0x4b, },
+   { .compatible = "rohm,bd71837", .data = ROHM_CHIP_TYPE_BD71837, },
+   { .compatible = "rohm,bd71847", .data = ROHM_CHIP_TYPE_BD71847, },
{ }
 };
 
@@ -85,5 +106,6 @@ U_BOOT_DRIVER(pmic_bd71837) = {
.id = UCLASS_PMIC,
.of_match = bd71837_ids,
.bind = bd71837_bind,
+   .probe = bd718x7_probe,
.ops = _ops,
 };
diff --git a/drivers/power/regulator/Kconfig b/drivers/power/regulator/Kconfig
index 3ed0dd2264..4687bee09c 100644
--- a/drivers/power/regulator/Kconfig
+++ b/drivers/power/regulator/Kconfig
@@ -43,6 +43,23 @@ config REGULATOR_AS3722
  but does not yet support change voltages. Currently this must be
  done using direct register writes to the PMIC.
 
+config DM_REGULATOR_BD71837
+   bool "Enable Driver Model for ROHM BD71837/BD71847 regulators"
+   depends on DM_REGULATOR && DM_PMIC_BD71837
+   help
+   This config enables implementation of driver-model regulator uclass
+   features for regulators on ROHM BD71837 and BD71847 PMICs.
+   BD71837 contains 8 bucks and 7 LDOS. BD71847 is reduced version
+   containing 6 bucks and 6 LDOs. The driver implements get/set api for
+   value and