1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * (C) Copyright 2011-2013
4  * Texas Instruments, <www.ti.com>
5  */
6 
7 #include <common.h>
8 #include <i2c.h>
9 #include <power/tps65910.h>
10 
11 /*
12  * tps65910_set_i2c_control() - Set the TPS65910 to be controlled via the I2C
13  * 				interface.
14  * @return:		       0 on success, not 0 on failure
15  */
16 int tps65910_set_i2c_control(void)
17 {
18 	int ret;
19 	uchar buf;
20 
21 	/* VDD1/2 voltage selection register access by control i/f */
22 	ret = i2c_read(TPS65910_CTRL_I2C_ADDR, TPS65910_DEVCTRL_REG, 1,
23 		       &buf, 1);
24 
25 	if (ret)
26 		return ret;
27 
28 	buf |= TPS65910_DEVCTRL_REG_SR_CTL_I2C_SEL_CTL_I2C;
29 
30 	return i2c_write(TPS65910_CTRL_I2C_ADDR, TPS65910_DEVCTRL_REG, 1,
31 			 &buf, 1);
32 }
33 
34 /*
35  * tps65910_voltage_update() - Voltage switching for MPU frequency switching.
36  * @module:		       mpu - 0, core - 1
37  * @vddx_op_vol_sel:	       vdd voltage to set
38  * @return:		       0 on success, not 0 on failure
39  */
40 int tps65910_voltage_update(unsigned int module, unsigned char vddx_op_vol_sel)
41 {
42 	uchar buf;
43 	unsigned int reg_offset;
44 	int ret;
45 
46 	if (module == MPU)
47 		reg_offset = TPS65910_VDD1_OP_REG;
48 	else
49 		reg_offset = TPS65910_VDD2_OP_REG;
50 
51 	/* Select VDDx OP   */
52 	ret = i2c_read(TPS65910_CTRL_I2C_ADDR, reg_offset, 1, &buf, 1);
53 	if (ret)
54 		return ret;
55 
56 	buf &= ~TPS65910_OP_REG_CMD_MASK;
57 
58 	ret = i2c_write(TPS65910_CTRL_I2C_ADDR, reg_offset, 1, &buf, 1);
59 	if (ret)
60 		return ret;
61 
62 	/* Configure VDDx OP  Voltage */
63 	ret = i2c_read(TPS65910_CTRL_I2C_ADDR, reg_offset, 1, &buf, 1);
64 	if (ret)
65 		return ret;
66 
67 	buf &= ~TPS65910_OP_REG_SEL_MASK;
68 	buf |= vddx_op_vol_sel;
69 
70 	ret = i2c_write(TPS65910_CTRL_I2C_ADDR, reg_offset, 1, &buf, 1);
71 	if (ret)
72 		return ret;
73 
74 	ret = i2c_read(TPS65910_CTRL_I2C_ADDR, reg_offset, 1, &buf, 1);
75 	if (ret)
76 		return ret;
77 
78 	if ((buf & TPS65910_OP_REG_SEL_MASK) != vddx_op_vol_sel)
79 		return 1;
80 
81 	return 0;
82 }
83