Hi Tom, Greg > From: Greg Guyotte <gguyo...@ti.com> > > Add a driver for the TPS65217 PMIC that is found in the Beaglebone > family of boards. > > Signed-off-by: Greg Guyotte <gguyo...@ti.com> > [trini: Split and rework Greg's changes into new drivers/power > framework] > Signed-off-by: Tom Rini <tr...@ti.com> > > --- > Changes in v2: > - Address Dan's comments > - Change to SPDX license tag > - Add TRM link in the header > > Signed-off-by: Tom Rini <tr...@ti.com> > --- > drivers/power/pmic/Makefile | 1 + > drivers/power/pmic/pmic_tps65217.c | 109 > ++++++++++++++++++++++++++++++++++++ > include/power/tps65217.h | 79 ++++++++++++++++++++++++++ > 3 files changed, 189 insertions(+) create mode 100644 > drivers/power/pmic/pmic_tps65217.c create mode 100644 > include/power/tps65217.h > > diff --git a/drivers/power/pmic/Makefile b/drivers/power/pmic/Makefile > index f054470..ac2b625 100644 > --- a/drivers/power/pmic/Makefile > +++ b/drivers/power/pmic/Makefile > @@ -13,6 +13,7 @@ COBJS-$(CONFIG_POWER_MAX8998) += pmic_max8998.o > COBJS-$(CONFIG_POWER_MAX8997) += pmic_max8997.o > COBJS-$(CONFIG_POWER_MUIC_MAX8997) += muic_max8997.o > COBJS-$(CONFIG_POWER_MAX77686) += pmic_max77686.o > +COBJS-$(CONFIG_POWER_TPS65217) += pmic_tps65217.o > > COBJS := $(COBJS-y) > SRCS := $(COBJS:.o=.c) > diff --git a/drivers/power/pmic/pmic_tps65217.c > b/drivers/power/pmic/pmic_tps65217.c new file mode 100644 > index 0000000..36e9024 > --- /dev/null > +++ b/drivers/power/pmic/pmic_tps65217.c > @@ -0,0 +1,109 @@ > +/* > + * (C) Copyright 2011-2013 > + * Texas Instruments, <www.ti.com> > + * > + * SPDX-License-Identifier: GPL-2.0+ > + */ > + > +#include <common.h> > +#include <i2c.h> > +#include <power/tps65217.h> > + > +/** > + * tps65217_reg_read() - Generic function that can read a TPS65217 > register > + * @src_reg: Source register address > + * @src_val: Address of destination variable > + * @return: 0 for success, not 0 on failure. > + */ > +int tps65217_reg_read(uchar src_reg, uchar *src_val) > +{ > + return i2c_read(TPS65217_CHIP_PM, src_reg, 1, src_val, 1);
Would it be possible to comply with pmic driver model? It can be found at ./drivers/power/power_core.c Moreover the generic function for reading/writing data to/from pmic is already defined at ./drivers/power/power_{i2c|spi}.c Maybe it would be possible to use/modify the already available code? > +} > + > +/** > + * tps65217_reg_write() - Generic function that can write a > TPS65217 PMIC > + * register or bit field regardless of > protection > + * level. > + * > + * @prot_level: Register password protection. Use > + * TPS65217_PROT_LEVEL_NONE, > + * TPS65217_PROT_LEVEL_1 or > TPS65217_PROT_LEVEL_2 > + * @dest_reg: Register address to write. > + * @dest_val: Value to write. > + * @mask: Bit mask (8 bits) to be applied. > Function will only > + * change bits that are set in the bit > mask. > + * > + * @return: 0 for success, not 0 on failure, as > per the i2c API > + */ > +int tps65217_reg_write(uchar prot_level, uchar dest_reg, uchar > dest_val, The same as above. > + uchar mask) > +{ > + uchar read_val; > + uchar xor_reg; > + int ret; > + > + /* > + * If we are affecting only a bit field, read dest_reg and > apply the > + * mask > + */ > + if (mask != TPS65217_MASK_ALL_BITS) { > + ret = i2c_read(TPS65217_CHIP_PM, dest_reg, 1, > &read_val, 1); > + if (ret) > + return ret; > + read_val &= (~mask); > + read_val |= (dest_val & mask); > + dest_val = read_val; > + } > + > + if (prot_level > 0) { > + xor_reg = dest_reg ^ TPS65217_PASSWORD_UNLOCK; > + ret = i2c_write(TPS65217_CHIP_PM, TPS65217_PASSWORD, > 1, > + &xor_reg, 1); > + if (ret) > + return ret; > + } > + > + ret = i2c_write(TPS65217_CHIP_PM, dest_reg, 1, &dest_val, 1); > + if (ret) > + return ret; > + > + if (prot_level == TPS65217_PROT_LEVEL_2) { > + ret = i2c_write(TPS65217_CHIP_PM, TPS65217_PASSWORD, > 1, > + &xor_reg, 1); > + if (ret) > + return ret; > + > + ret = i2c_write(TPS65217_CHIP_PM, dest_reg, 1, > &dest_val, 1); > + if (ret) > + return ret; > + } > + > + return 0; > +} > + > +/** > + * tps65217_voltage_update() - Function to change a voltage level, > as this > + * is a multi-step process. > + * @dc_cntrl_reg: DC voltage control register to > change. > + * @volt_sel: New value for the voltage > register > + * @return: 0 for success, not 0 on failure. > + */ > +int tps65217_voltage_update(uchar dc_cntrl_reg, uchar volt_sel) Maybe pmic_set_output() method from ./drivers/power/power_core.c can be reused? > +{ > + if ((dc_cntrl_reg != TPS65217_DEFDCDC1) && > + (dc_cntrl_reg != TPS65217_DEFDCDC2) && > + (dc_cntrl_reg != TPS65217_DEFDCDC3)) > + return 1; > + > + /* set voltage level */ > + if (tps65217_reg_write(TPS65217_PROT_LEVEL_2, dc_cntrl_reg, > volt_sel, > + TPS65217_MASK_ALL_BITS)) > + return 1; > + > + /* set GO bit to initiate voltage transition */ > + if (tps65217_reg_write(TPS65217_PROT_LEVEL_2, > TPS65217_DEFSLEW, > + TPS65217_DCDC_GO, TPS65217_DCDC_GO)) > + return 1; > + > + return 0; > +} > diff --git a/include/power/tps65217.h b/include/power/tps65217.h > new file mode 100644 > index 0000000..f4c7a2b > --- /dev/null > +++ b/include/power/tps65217.h > @@ -0,0 +1,79 @@ > +/* > + * (C) Copyright 2011-2013 > + * Texas Instruments, <www.ti.com> > + * > + * SPDX-License-Identifier: GPL-2.0+ > + * > + * For more details, please see the TRM at > http://www.ti.com/product/tps65217a > + */ > + > +#ifndef __POWER_TPS65217_H__ > +#define __POWER_TPS65217_H__ > + > +/* I2C chip address */ > +#define TPS65217_CHIP_PM 0x24 > + > +/* Registers */ > +#define TPS65217_CHIPID 0x00 > +#define TPS65217_POWER_PATH 0x01 > +#define TPS65217_INTERRUPT 0x02 > +#define TPS65217_CHGCONFIG0 0x03 > +#define TPS65217_CHGCONFIG1 0x04 > +#define TPS65217_CHGCONFIG2 0x05 > +#define TPS65217_CHGCONFIG3 0x06 > +#define TPS65217_WLEDCTRL1 0x07 > +#define TPS65217_WLEDCTRL2 0x08 > +#define TPS65217_MUXCTRL 0x09 > +#define TPS65217_STATUS 0x0A > +#define TPS65217_PASSWORD 0x0B > +#define TPS65217_PGOOD 0x0C > +#define TPS65217_DEFPG 0x0D > +#define TPS65217_DEFDCDC1 0x0E > +#define TPS65217_DEFDCDC2 0x0F > +#define TPS65217_DEFDCDC3 0x10 > +#define TPS65217_DEFSLEW 0x11 > +#define TPS65217_DEFLDO1 0x12 > +#define TPS65217_DEFLDO2 0x13 > +#define TPS65217_DEFLS1 0x14 > +#define TPS65217_DEFLS2 0x15 > +#define TPS65217_ENABLE 0x16 > +#define TPS65217_DEFUVLO 0x18 > +#define TPS65217_SEQ1 0x19 > +#define TPS65217_SEQ2 0x1A > +#define TPS65217_SEQ3 0x1B > +#define TPS65217_SEQ4 0x1C > +#define TPS65217_SEQ5 0x1D > +#define TPS65217_SEQ6 0x1E > + Shouldn't the above registers be defined as enum? For example at ./include/power/max8997_pmic.h /* MAX 8997 registers */ enum { MAX8997_REG_PMIC_ID0 = 0x00, MAX8997_REG_PMIC_ID1 = 0x01, MAX8997_REG_INTSRC = 0x02, .... PMIC_NUM_OF_REGS } > +#define TPS65217_PROT_LEVEL_NONE 0x00 > +#define TPS65217_PROT_LEVEL_1 0x01 > +#define TPS65217_PROT_LEVEL_2 0x02 > + > +#define TPS65217_PASSWORD_LOCK_FOR_WRITE 0x00 > +#define TPS65217_PASSWORD_UNLOCK 0x7D > + > +#define TPS65217_DCDC_GO 0x80 > + > +#define TPS65217_MASK_ALL_BITS 0xFF > + > +#define TPS65217_USB_INPUT_CUR_LIMIT_MASK 0x03 > +#define TPS65217_USB_INPUT_CUR_LIMIT_100MA 0x00 > +#define TPS65217_USB_INPUT_CUR_LIMIT_500MA 0x01 > +#define TPS65217_USB_INPUT_CUR_LIMIT_1300MA 0x02 > +#define TPS65217_USB_INPUT_CUR_LIMIT_1800MA 0x03 > + > +#define TPS65217_DCDC_VOLT_SEL_1275MV 0x0F > +#define TPS65217_DCDC_VOLT_SEL_1325MV 0x11 > + > +#define TPS65217_LDO_MASK 0x1F > +#define TPS65217_LDO_VOLTAGE_OUT_1_8 0x06 > +#define TPS65217_LDO_VOLTAGE_OUT_3_3 0x1F > + > +#define TPS65217_PWR_SRC_USB_BITMASK 0x4 > +#define TPS65217_PWR_SRC_AC_BITMASK 0x8 > + > +int tps65217_reg_read(uchar src_reg, uchar *src_val); > +int tps65217_reg_write(uchar prot_level, uchar dest_reg, uchar > dest_val, > + uchar mask); > +int tps65217_voltage_update(uchar dc_cntrl_reg, uchar volt_sel); > +#endif /* __POWER_TPS65217_H__ */ -- Best regards, Lukasz Majewski Samsung R&D Institute Poland (SRPOL) | Linux Platform Group _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot