1 // SPDX-License-Identifier: GPL-2.0+
3 * (C) Copyright 2011-2013
4 * Texas Instruments, <www.ti.com>
9 #include <linux/errno.h>
10 #include <power/pmic.h>
11 #include <power/tps65218.h>
13 #if !CONFIG_IS_ENABLED(DM_I2C)
14 int tps65218_reg_read(uchar dest_reg, uchar *dest_val)
19 ret = i2c_read(TPS65218_CHIP_PM, dest_reg, 1, &read_val, 1);
29 * tps65218_reg_write() - Generic function that can write a TPS65218 PMIC
30 * register or bit field regardless of protection
33 * @prot_level: Register password protection. Use
34 * TPS65218_PROT_LEVEL_NONE,
35 * TPS65218_PROT_LEVEL_1 or TPS65218_PROT_LEVEL_2
36 * @dest_reg: Register address to write.
37 * @dest_val: Value to write.
38 * @mask: Bit mask (8 bits) to be applied. Function will only
39 * change bits that are set in the bit mask.
41 * @return: 0 for success, not 0 on failure, as per the i2c API
43 int tps65218_reg_write(uchar prot_level, uchar dest_reg, uchar dest_val,
51 * If we are affecting only a bit field, read dest_reg and apply the
54 if (mask != TPS65218_MASK_ALL_BITS) {
55 ret = i2c_read(TPS65218_CHIP_PM, dest_reg, 1, &read_val, 1);
59 read_val |= (dest_val & mask);
64 xor_reg = dest_reg ^ TPS65218_PASSWORD_UNLOCK;
65 ret = i2c_write(TPS65218_CHIP_PM, TPS65218_PASSWORD, 1,
71 ret = i2c_write(TPS65218_CHIP_PM, dest_reg, 1, &dest_val, 1);
75 if (prot_level == TPS65218_PROT_LEVEL_2) {
76 ret = i2c_write(TPS65218_CHIP_PM, TPS65218_PASSWORD, 1,
81 ret = i2c_write(TPS65218_CHIP_PM, dest_reg, 1, &dest_val, 1);
89 struct udevice *tps65218_dev __section(".data") = NULL;
91 int tps65218_reg_read(uchar dest_reg, uchar *dest_val)
99 ret = dm_i2c_read(tps65218_dev, dest_reg, &read_val, 1);
103 *dest_val = read_val;
108 int tps65218_reg_write(uchar prot_level, uchar dest_reg, uchar dest_val,
119 * If we are affecting only a bit field, read dest_reg and apply the
122 if (mask != TPS65218_MASK_ALL_BITS) {
123 ret = dm_i2c_read(tps65218_dev, dest_reg, &read_val, 1);
128 read_val |= (dest_val & mask);
132 if (prot_level > 0) {
133 xor_reg = dest_reg ^ TPS65218_PASSWORD_UNLOCK;
134 ret = dm_i2c_write(tps65218_dev, TPS65218_PASSWORD, &xor_reg,
140 ret = dm_i2c_write(tps65218_dev, dest_reg, &dest_val, 1);
144 if (prot_level == TPS65218_PROT_LEVEL_2) {
145 ret = dm_i2c_write(tps65218_dev, TPS65218_PASSWORD, &xor_reg,
150 ret = dm_i2c_write(tps65218_dev, dest_reg, &dest_val, 1);
160 * tps65218_voltage_update() - Function to change a voltage level, as this
161 * is a multi-step process.
162 * @dc_cntrl_reg: DC voltage control register to change.
163 * @volt_sel: New value for the voltage register
164 * @return: 0 for success, not 0 on failure.
166 int tps65218_voltage_update(uchar dc_cntrl_reg, uchar volt_sel)
168 if ((dc_cntrl_reg != TPS65218_DCDC1) &&
169 (dc_cntrl_reg != TPS65218_DCDC2) &&
170 (dc_cntrl_reg != TPS65218_DCDC3))
173 /* set voltage level */
174 if (tps65218_reg_write(TPS65218_PROT_LEVEL_2, dc_cntrl_reg, volt_sel,
175 TPS65218_DCDC_VSEL_MASK))
178 /* set GO bit to initiate voltage transition */
179 if (tps65218_reg_write(TPS65218_PROT_LEVEL_2, TPS65218_SLEW,
180 TPS65218_DCDC_GO, TPS65218_DCDC_GO))
187 * tps65218_toggle_fseal() - Perform the sequence that toggles the FSEAL bit.
189 * @return: 0 on success, -EBADE if the sequence was broken
191 int tps65218_toggle_fseal(void)
193 if (tps65218_reg_write(TPS65218_PROT_LEVEL_NONE, TPS65218_PASSWORD,
194 0xb1, TPS65218_MASK_ALL_BITS))
197 if (tps65218_reg_write(TPS65218_PROT_LEVEL_NONE, TPS65218_PASSWORD,
198 0xfe, TPS65218_MASK_ALL_BITS))
201 if (tps65218_reg_write(TPS65218_PROT_LEVEL_NONE, TPS65218_PASSWORD,
202 0xa3, TPS65218_MASK_ALL_BITS))
209 * tps65218_lock_fseal() - Perform the sequence that locks the FSEAL bit to 1.
211 * The FSEAL bit prevents the PMIC from turning off DCDC5 and DCDC6. It can be
212 * toggled at most 3 times: 0->1, 1->0, and finally 0->1. After the third switch
213 * its value is locked and can only be reset by powering off the PMIC entirely.
215 * @return: 0 on success, -EBADE if the sequence was broken
217 int tps65218_lock_fseal(void)
221 for (i = 0; i < 3; i++)
222 if (tps65218_toggle_fseal())
228 #if !CONFIG_IS_ENABLED(DM_I2C)
229 int power_tps65218_init(unsigned char bus)
231 static const char name[] = "TPS65218_PMIC";
232 struct pmic *p = pmic_alloc();
235 printf("%s: POWER allocation error!\n", __func__);
240 p->interface = PMIC_I2C;
241 p->number_of_regs = TPS65218_PMIC_NUM_OF_REGS;
242 p->hw.i2c.addr = TPS65218_CHIP_PM;
243 p->hw.i2c.tx_num = 1;
249 int power_tps65218_init(unsigned char bus)
251 struct udevice *dev = NULL;
254 rc = i2c_get_chip_for_busnum(bus, TPS65218_CHIP_PM, 1, &dev);