[PATCH v3 2/7] power: pmic: add the base MAX77663 PMIC support
Simon Glass
sjg at chromium.org
Mon Jul 24 04:28:16 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/max77663.txt | 84 ++++++++++++++++++++++
> drivers/power/pmic/Kconfig | 6 ++
> drivers/power/pmic/Makefile | 1 +
> drivers/power/pmic/max77663.c | 81 +++++++++++++++++++++
> include/power/max77663.h | 40 +++++++++++
> 5 files changed, 212 insertions(+)
> create mode 100644 doc/device-tree-bindings/pmic/max77663.txt
> create mode 100644 drivers/power/pmic/max77663.c
> create mode 100644 include/power/max77663.h
Reviewed-by: Simon Glass <sjg at chromium.org>
but see below
>
> diff --git a/doc/device-tree-bindings/pmic/max77663.txt b/doc/device-tree-bindings/pmic/max77663.txt
> new file mode 100644
> index 0000000000..ddb7d3eb14
> --- /dev/null
> +++ b/doc/device-tree-bindings/pmic/max77663.txt
> @@ -0,0 +1,84 @@
> +MAXIM, MAX77663 PMIC
> +
> +This device uses two drivers:
> +- drivers/power/pmic/max77663.c (for parent device)
> +- drivers/power/regulator/max77663_regulator.c (for child regulators)
> +
> +This chapter describes the binding info for the PMIC driver and regulators.
> +
> +Required properties for PMIC:
> +- compatible: "maxim,max77663"
> +- reg: usually 0x1c or 0x3c
> +
> +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 max77663:
> +- sd0, sd1, sd2, sd3, ldo0, ldo1, ldo2, ldo3, ldo4, ldo5, ldo6, ldo7, ldo8
> +
> +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
> +
> +Linux driver binding for this driver is compatible.
> +
> +Example:
> +
> +max77663 at 1c {
> + compatible = "maxim,max77663";
> + reg = <0x1c>;
> +
> + regulators {
> + sd0 {
> + regulator-name = "vdd_cpu";
> + regulator-min-microvolt = <800000>;
> + regulator-max-microvolt = <1250000>;
> + regulator-always-on;
> + regulator-boot-on;
> + };
> +
> + ...
> +
> + ldo0 {
> + regulator-name = "avdd_pll";
> + regulator-min-microvolt = <1200000>;
> + regulator-max-microvolt = <1200000>;
> + };
> +
> + ...
> +
> + ldo2 {
> + regulator-name = "avdd_usb";
> + regulator-min-microvolt = <3300000>;
> + regulator-max-microvolt = <3300000>;
> + regulator-always-on;
> + regulator-boot-on;
> + };
> +
> + ldo3 {
> + regulator-name = "vdd_sdmmc3";
> + regulator-min-microvolt = <3000000>;
> + regulator-max-microvolt = <3000000>;
> + regulator-always-on;
> + regulator-boot-on;
> + };
> +
> + ...
> +
> + ldo8 {
> + regulator-name = "avdd_dsi_csi";
> + regulator-min-microvolt = <1200000>;
> + regulator-max-microvolt = <1200000>;
> + };
> + };
> +};
> diff --git a/drivers/power/pmic/Kconfig b/drivers/power/pmic/Kconfig
> index 176fb07c65..abea0fe4ed 100644
> --- a/drivers/power/pmic/Kconfig
> +++ b/drivers/power/pmic/Kconfig
> @@ -184,6 +184,12 @@ config SPL_DM_PMIC_PFUZE100
> This config enables implementation of driver-model pmic uclass features
> for PMIC PFUZE100 in SPL. The driver implements read/write operations.
>
> +config DM_PMIC_MAX77663
> + bool "Enable Driver Model for PMIC MAX77663"
> + ---help---
> + This config enables implementation of driver-model pmic uclass features
> + for PMIC MAX77663. The driver implements read/write operations.
You could mention a few features such as number of LDO, etc.
> +
> config DM_PMIC_MAX77686
> bool "Enable Driver Model for PMIC MAX77686"
> ---help---
> diff --git a/drivers/power/pmic/Makefile b/drivers/power/pmic/Makefile
> index 0b3b3d62d0..414a9d8225 100644
> --- a/drivers/power/pmic/Makefile
> +++ b/drivers/power/pmic/Makefile
> @@ -6,6 +6,7 @@
> obj-$(CONFIG_$(SPL_TPL_)DM_PMIC) += pmic-uclass.o
> obj-$(CONFIG_$(SPL_)DM_PMIC_FAN53555) += fan53555.o
> obj-$(CONFIG_$(SPL_)DM_PMIC_DA9063) += da9063.o
> +obj-$(CONFIG_$(SPL_)DM_PMIC_MAX77663) += max77663.o
> obj-$(CONFIG_DM_PMIC_MAX77686) += max77686.o
> obj-$(CONFIG_DM_PMIC_MAX8998) += max8998.o
> obj-$(CONFIG_DM_PMIC_MC34708) += mc34708.o
> diff --git a/drivers/power/pmic/max77663.c b/drivers/power/pmic/max77663.c
> new file mode 100644
> index 0000000000..482b646901
> --- /dev/null
> +++ b/drivers/power/pmic/max77663.c
> @@ -0,0 +1,81 @@
> +// 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/max77663.h>
> +#include <dm/device.h>
That should go after log.h
> +
> +static const struct pmic_child_info pmic_children_info[] = {
> + { .prefix = "ldo", .driver = MAX77663_LDO_DRIVER },
> + { .prefix = "sd", .driver = MAX77663_SD_DRIVER },
> + { },
> +};
> +
> +static int max77663_write(struct udevice *dev, uint reg, const uint8_t *buff,
> + int len)
> +{
> + if (dm_i2c_write(dev, reg, buff, len)) {
> + log_err("write error to device: %p register: %#x!\n", dev, reg);
> + return -EIO;
Please return the error provided by dm_i2c_write()
> + }
> +
> + return 0;
> +}
> +
> +static int max77663_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;
ditto
Also you might consider log_debug() here since log_err does add to
code size, and this problem is unlikely.
> + }
> +
> + return 0;
> +}
> +
> +static int max77663_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 max77663_ops = {
> + .read = max77663_read,
> + .write = max77663_write,
> +};
> +
> +static const struct udevice_id max77663_ids[] = {
> + { .compatible = "maxim,max77663" },
> + { }
> +};
> +
> +U_BOOT_DRIVER(pmic_max77663) = {
> + .name = "max77663_pmic",
> + .id = UCLASS_PMIC,
> + .of_match = max77663_ids,
> + .bind = max77663_bind,
> + .ops = &max77663_ops,
> +};
> diff --git a/include/power/max77663.h b/include/power/max77663.h
> new file mode 100644
> index 0000000000..53a0976346
> --- /dev/null
> +++ b/include/power/max77663.h
> @@ -0,0 +1,40 @@
> +/* SPDX-License-Identifier: GPL-2.0+ */
> +/*
> + * Copyright(C) 2023 Svyatoslav Ryhel <clamor95 at gmail.com>
> + */
> +
> +#ifndef _MAX77663_H_
> +#define _MAX77663_H_
> +
> +#define MAX77663_LDO_NUM 9
> +#define MAX77663_SD_NUM 5
> +
> +/* Drivers name */
> +#define MAX77663_LDO_DRIVER "max77663_ldo"
> +#define MAX77663_SD_DRIVER "max77663_sd"
> +
> +#define MAX77663_SD_STATUS_MASK 0x30
> +
> +#define MAX77663_SD0_VOLT_MAX_HEX 0x40
> +#define MAX77663_SD1_VOLT_MAX_HEX 0X4C
> +#define MAX77663_SD_VOLT_MAX_HEX 0XFF
> +#define MAX77663_SD_VOLT_MIN_HEX 0x02
> +
> +#define MAX77663_SD0_VOLT_MAX 1400000
> +#define MAX77663_SD1_VOLT_MAX 1550000
> +#define MAX77663_SD_VOLT_MAX 3787500
> +#define MAX77663_SD_VOLT_MIN 625000
> +
> +#define MAX77663_SD_VOLT_BASE 600000
> +
> +#define MAX77663_LDO_STATUS_MASK 0xC0
> +#define MAX77663_LDO_VOLT_MASK 0x3F
> +#define MAX77663_LDO_VOLT_MAX_HEX 0x3F
lower-case hex
> +
> +#define MAX77663_LDO01_VOLT_MAX 2375000
> +#define MAX77663_LDO4_VOLT_MAX 1587500
> +#define MAX77663_LDO_VOLT_MAX 3950000
> +
> +#define MAX77663_LDO_VOLT_BASE 800000
> +
> +#endif /* _MAX77663_H_ */
> --
> 2.39.2
>
Regads,
Simon
More information about the U-Boot
mailing list