[PATCH v3 4/7] power: pmic: add the base TPS80031 PMIC support

Simon Glass sjg at chromium.org
Mon Jul 24 04:28:19 CEST 2023


Hi Svyatoslav,

On Sun, 23 Jul 2023 at 06:28, Svyatoslav Ryhel <clamor95 at gmail.com> wrote:
>
> Add support to bind the regulators/child nodes with the pmic.
> Also adds the pmic i2c based read/write functions to access pmic
> registers.
>
> Signed-off-by: Svyatoslav Ryhel <clamor95 at gmail.com>
> ---
>  doc/device-tree-bindings/pmic/tps80031.txt | 76 ++++++++++++++++++++
>  drivers/power/pmic/Kconfig                 |  6 ++
>  drivers/power/pmic/Makefile                |  1 +
>  drivers/power/pmic/tps80031.c              | 82 ++++++++++++++++++++++
>  include/power/tps80031.h                   | 42 +++++++++++
>  5 files changed, 207 insertions(+)
>  create mode 100644 doc/device-tree-bindings/pmic/tps80031.txt
>  create mode 100644 drivers/power/pmic/tps80031.c
>  create mode 100644 include/power/tps80031.h
>

Reviewed-by: Simon Glass <sjg at chromium.org>

> diff --git a/doc/device-tree-bindings/pmic/tps80031.txt b/doc/device-tree-bindings/pmic/tps80031.txt
> new file mode 100644
> index 0000000000..577e6de1c1
> --- /dev/null
> +++ b/doc/device-tree-bindings/pmic/tps80031.txt
> @@ -0,0 +1,76 @@
> +Texas Instruments, TPS80031/TPS80032 PMIC
> +
> +This device uses two drivers:
> +- drivers/power/pmic/tps80031.c (for parent device)
> +- drivers/power/regulator/tps80031_regulator.c (for child regulators)
> +
> +This chapter describes the binding info for the PMIC driver and regulators.
> +
> +Required properties for PMIC:
> +- compatible: "ti,tps80031" or "ti,tps80032"
> +- reg: 0x48
> +
> +With those two properties, the pmic device can be used for read/write only.
> +To bind each regulator, the optional regulators subnode should exists.
> +
> +Optional subnode:
> +- name: regulators (subnode list of each device's regulator)
> +
> +Regulators subnode contains set on supported regulators.
> +
> +Required properties:
> +- regulator-name: used for regulator uclass platform data '.name',
> +
> +List of supported regulator nodes names for tps80031/tps80032:
> +- smps1, smps2, smps3, smps4, smps5
> +- ldo1, ldo2, ldo3, ldo4, ldo5, ldo6, ldo7, ldoln, ldousb
> +
> +SMPS5 in Linux 3.1.10 is referred as vio, but datasheet clearly names it SMPS5.
> +
> +Optional:
> +- regulator-min-microvolt: minimum allowed Voltage to set
> +- regulator-max-microvolt: minimum allowed Voltage to set
> +- regulator-always-on: regulator should be never disabled
> +- regulator-boot-on: regulator should be enabled by the bootloader
> +
> +Example:
> +
> +tps80032 at 48 {
> +       compatible = "ti,tps80032";
> +       reg = <0x48>;
> +
> +       regulators {
> +               smps1 {
> +                       regulator-name = "vdd_cpu";
> +                       regulator-min-microvolt = <800000>;
> +                       regulator-max-microvolt = <1250000>;
> +                       regulator-always-on;
> +                       regulator-boot-on;
> +               };
> +
> +               ...
> +
> +               smps5 {
> +                       regulator-name = "vdd_1v8_gen";
> +                       regulator-min-microvolt = <1800000>;
> +                       regulator-max-microvolt = <1800000>;
> +                       regulator-always-on;
> +                       regulator-boot-on;
> +               };
> +
> +               ldo1 {
> +                       regulator-name = "avdd_dsi_csi";
> +                       regulator-min-microvolt = <1200000>;
> +                       regulator-max-microvolt = <1200000>;
> +                       regulator-boot-on;
> +               };
> +
> +               ...
> +
> +               ldousb {
> +                       regulator-name = "avdd_usb";
> +                       regulator-min-microvolt = <3300000>;
> +                       regulator-max-microvolt = <3300000>;
> +               };
> +       };
> +};
> diff --git a/drivers/power/pmic/Kconfig b/drivers/power/pmic/Kconfig
> index abea0fe4ed..d25fe1ce0d 100644
> --- a/drivers/power/pmic/Kconfig
> +++ b/drivers/power/pmic/Kconfig
> @@ -347,6 +347,12 @@ config DM_PMIC_TPS65910
>         DC-DC converter, 8 LDOs and a RTC. This driver binds the SMPS and LDO
>         pmic children.
>
> +config DM_PMIC_TPS80031
> +       bool "Enable driver for Texas Instruments TPS80031/TPS80032 PMIC"
> +       ---help---
> +       The TPS80031/TPS80032 are PMIC's containing several LDOs, SMPS.
> +       This driver binds the pmic children.

SMPs ? What is that? Perhaps add a little more detail?

> +
>  config PMIC_STPMIC1
>         bool "Enable support for STMicroelectronics STPMIC1 PMIC"
>         depends on DM_I2C
> diff --git a/drivers/power/pmic/Makefile b/drivers/power/pmic/Makefile
> index 414a9d8225..55ee614364 100644
> --- a/drivers/power/pmic/Makefile
> +++ b/drivers/power/pmic/Makefile
> @@ -27,6 +27,7 @@ obj-$(CONFIG_$(SPL_)PMIC_RN5T567) += rn5t567.o
>  obj-$(CONFIG_PMIC_TPS65090) += tps65090.o
>  obj-$(CONFIG_PMIC_S5M8767) += s5m8767.o
>  obj-$(CONFIG_DM_PMIC_TPS65910) += pmic_tps65910_dm.o
> +obj-$(CONFIG_$(SPL_)DM_PMIC_TPS80031) += tps80031.o
>  obj-$(CONFIG_$(SPL_)PMIC_PALMAS) += palmas.o
>  obj-$(CONFIG_$(SPL_)PMIC_LP873X) += lp873x.o
>  obj-$(CONFIG_$(SPL_)PMIC_LP87565) += lp87565.o
> diff --git a/drivers/power/pmic/tps80031.c b/drivers/power/pmic/tps80031.c
> new file mode 100644
> index 0000000000..24c8a2c613
> --- /dev/null
> +++ b/drivers/power/pmic/tps80031.c
> @@ -0,0 +1,82 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +/*
> + *  Copyright(C) 2023 Svyatoslav Ryhel <clamor95 at gmail.com>
> + */
> +
> +#include <common.h>
> +#include <fdtdec.h>
> +#include <errno.h>
> +#include <dm.h>
> +#include <i2c.h>
> +#include <log.h>
> +#include <power/pmic.h>
> +#include <power/regulator.h>
> +#include <power/tps80031.h>
> +#include <dm/device.h>

That should be included by dm.h

> +
> +static const struct pmic_child_info pmic_children_info[] = {
> +       { .prefix = "ldo", .driver = TPS80031_LDO_DRIVER },
> +       { .prefix = "smps", .driver = TPS80031_SMPS_DRIVER },
> +       { },
> +};
> +
> +static int tps80031_write(struct udevice *dev, uint reg, const uint8_t *buff,

u8

> +                         int len)
> +{
> +       if (dm_i2c_write(dev, reg, buff, len)) {
> +               log_err("write error to device: %p register: %#x!\n", dev, reg);
> +               return -EIO;
> +       }
> +
> +       return 0;
> +}
> +
> +static int tps80031_read(struct udevice *dev, uint reg, uint8_t *buff, int len)
> +{
> +       if (dm_i2c_read(dev, reg, buff, len)) {
> +               log_err("read error from device: %p register: %#x!\n", dev, reg);
> +               return -EIO;
> +       }
> +
> +       return 0;
> +}
> +
> +static int tps80031_bind(struct udevice *dev)
> +{
> +       ofnode regulators_node;
> +       int children;
> +
> +       regulators_node = dev_read_subnode(dev, "regulators");
> +       if (!ofnode_valid(regulators_node)) {
> +               log_err("%s regulators subnode not found!\n", dev->name);
> +               return -ENXIO;
> +       }
> +
> +       debug("%s: '%s' - found regulators subnode\n", __func__, dev->name);
> +
> +       children = pmic_bind_children(dev, regulators_node, pmic_children_info);
> +       if (!children)
> +               log_err("%s - no child found\n", dev->name);
> +
> +       /* Always return success for this device */
> +       return 0;
> +}
> +
> +static struct dm_pmic_ops tps80031_ops = {
> +       .read = tps80031_read,
> +       .write = tps80031_write,
> +};
> +
> +static const struct udevice_id tps80031_ids[] = {
> +       { .compatible = "ti,tps80031" },
> +       { .compatible = "ti,tps80032" },
> +       { }
> +};
> +
> +U_BOOT_DRIVER(pmic_tps80031) = {
> +       .name = "tps80031_pmic",
> +       .id = UCLASS_PMIC,
> +       .of_match = tps80031_ids,
> +       .bind = tps80031_bind,
> +       .ops = &tps80031_ops,
> +};
> diff --git a/include/power/tps80031.h b/include/power/tps80031.h
> new file mode 100644
> index 0000000000..f514db910b
> --- /dev/null
> +++ b/include/power/tps80031.h
> @@ -0,0 +1,42 @@
> +/* SPDX-License-Identifier: GPL-2.0+ */
> +/*
> + *  Copyright(C) 2023 Svyatoslav Ryhel <clamor95 at gmail.com>
> + */
> +
> +#ifndef _TPS80031_H_
> +#define _TPS80031_H_
> +
> +#define TPS80031_LDO_NUM               9
> +#define TPS80031_SMPS_NUM              5
> +
> +/* Drivers name */
> +#define TPS80031_LDO_DRIVER            "tps80031_ldo"
> +#define TPS80031_SMPS_DRIVER           "tps80031_smps"
> +
> +#define        TPS80031_SMPS_OFFSET            0xE0
> +#define        TPS80031_OFFSET_FLAG            BIT(3)
> +
> +#define        TPS80031_REGULATOR_STATUS_MASK  0x3
> +#define        TPS80031_REGULATOR_MODE_ON      0x1
> +
> +#define TPS80031_SMPS_VOLT_MASK                0x3F
> +#define TPS80031_SMPS_VOLT_MAX_HEX     0x39
> +#define TPS80031_SMPS_VOLT_MAX         1400000
> +#define TPS80031_SMPS_VOLT_BASE                600000
> +#define TPS80031_SMPS_VOLT_BASE_OFFSET 700000
> +
> +#define TPS80031_LDO_VOLT_MASK         0x3F
> +#define TPS80031_LDO_VOLT_MAX_HEX      0x18
> +#define TPS80031_LDO_VOLT_MIN_HEX      0x01
> +#define TPS80031_LDO_VOLT_MAX          3360000
> +#define TPS80031_LDO_VOLT_MIN          1018000
> +#define TPS80031_LDO_VOLT_BASE         916000

Similar point about the TPS80031_ prefix

> +
> +/* register groups */
> +enum {
> +       CTRL,
> +       VOLT,
> +       OFFSET,
> +};
> +
> +#endif /* _TPS80031_H_ */
> --
> 2.39.2
>

Regards,
Simon


More information about the U-Boot mailing list